ZGlmZiAtLWdpdCBhL2ZpbmFsL0NSRURJVFMudHh0IGIvZmluYWwvQ1JFRElUUy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQzMDE4MwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL0NSRURJVFMudHh0CkBAIC0wLDAgKzEsNDkgQEAKK1RoaXMgZmlsZSBpcyBhIHBhcnRpYWwgbGlzdCBvZiBwZW9wbGUgd2hvIGhhdmUgY29udHJpYnV0ZWQgdG8gdGhlIExMVk0vb3Blbm1wCitwcm9qZWN0LiAgSWYgeW91IGhhdmUgY29udHJpYnV0ZWQgYSBwYXRjaCBvciBtYWRlIHNvbWUgb3RoZXIgY29udHJpYnV0aW9uIHRvCitMTFZNL29wZW5tcCwgcGxlYXNlIHN1Ym1pdCBhIHBhdGNoIHRvIHRoaXMgZmlsZSB0byBhZGQgeW91cnNlbGYsIGFuZCBpdCB3aWxsIGJlCitkb25lIQorCitUaGUgbGlzdCBpcyBzb3J0ZWQgYnkgc3VybmFtZSBhbmQgZm9ybWF0dGVkIHRvIGFsbG93IGVhc3kgZ3JlcHBpbmcgYW5kCitiZWF1dGlmaWNhdGlvbiBieSBzY3JpcHRzLiAgVGhlIGZpZWxkcyBhcmU6IG5hbWUgKE4pLCBlbWFpbCAoRSksIHdlYi1hZGRyZXNzCisoVyksIFBHUCBrZXkgSUQgYW5kIGZpbmdlcnByaW50IChQKSwgZGVzY3JpcHRpb24gKEQpLCBhbmQgc25haWwtbWFpbCBhZGRyZXNzCisoUykuCisKK046IENhcmxvIEJlcnRvbGxpCitXOiBodHRwOi8vaWJtLmNvbQorRDogSUJNIGNvbnRyaWJ1dG9yIHRvIFBvd2VyUEMgc3VwcG9ydCBpbiBDTWFrZSBmaWxlcyBhbmQgZWxzZXdoZXJlLgorCitOOiBTdW5pdGEgQ2hhbmRyYXNla2FyYW4KK0Q6IENvbnRyaWJ1dG9yIHRvIHRlc3RzdWl0ZSBmcm9tIE9wZW5VSAorCitOOiBCYXJiYXJhIENoYXBtYW4KK0Q6IENvbnRyaWJ1dG9yIHRvIHRlc3RzdWl0ZSBmcm9tIE9wZW5VSAorCitOOiBVbml2ZXJzaXR5IG9mIEhvdXN0b24gCitXOiBodHRwOi8vd2ViLmNzLnVoLmVkdS9+b3BlbnVoL2Rvd25sb2FkLworRDogT3BlblVIIHRlc3Qgc3VpdGUKKworTjogSW50ZWwgQ29ycG9yYXRpb24gT3Blbk1QIHJ1bnRpbWUgdGVhbQorVzogaHR0cDovL29wZW5tcHJ0bC5vcmcKK0Q6IENyZWF0ZWQgdGhlIHJ1bnRpbWUuCisKK046IE1hdHRoaWFzIE11bGxlcgorRDogQ29udHJpYnV0b3IgdG8gdGVzdHN1aXRlIGZyb20gT3BlblVICisKK046IFRhbCBOZXZvCitFOiB0YWxAc2NhbGVtcC5jb20KK0Q6IFNjYWxlTVAgY29udHJpYnV0b3IgdG8gaW1wcm92ZSBydW50aW1lIHBlcmZvcm1hbmNlIHRoZXJlLgorVzogaHR0cDovL3NjYWxlbXAuY29tCisKK046IFBhdmVsIE5leXRjaGV2CitEOiBDb250cmlidXRvciB0byB0ZXN0c3VpdGUgZnJvbSBPcGVuVUgKKworTjogU3RldmVuIE5vb25hbgorRTogc3RldmVuQHVwbGlua2xhYnMubmV0CitEOiBQYXRjaGVzIGZvciB0aGUgQVJNIGFyY2hpdGVjdHVyZSBhbmQgcmVtb3ZhbCBvZiBzZXZlcmFsIGluY29uc2lzdGVuY2llcy4KKworTjogQWxwIFRva2VyCitFOiBhbHBAbnVhbnRpLmNvbQorRDogTWFraW5nIGJ1aWxkIHdvcmsgZm9yIEZyZWVCU0QuCisKK046IENoZW5nIFdhbmcgCitEOiBDb250cmlidXRvciB0byB0ZXN0c3VpdGUgZnJvbSBPcGVuVUgKZGlmZiAtLWdpdCBhL2ZpbmFsL0xJQ0VOU0UudHh0IGIvZmluYWwvTElDRU5TRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ1ZjM2NQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL0xJQ0VOU0UudHh0CkBAIC0wLDAgKzEsMTI0IEBACis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhlIHNvZnR3YXJlIGNvbnRhaW5lZCBpbiB0aGlzIGRpcmVjdG9yeSB0cmVlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgYm90aCB0aGUKK1VuaXZlcnNpdHkgb2YgSWxsaW5vaXMgIkJTRC1MaWtlIiBsaWNlbnNlIGFuZCB0aGUgTUlUIGxpY2Vuc2UuICBBcyBhIHVzZXIgb2YKK3RoaXMgY29kZSB5b3UgbWF5IGNob29zZSB0byB1c2UgaXQgdW5kZXIgZWl0aGVyIGxpY2Vuc2UuICBBcyBhIGNvbnRyaWJ1dG9yLAoreW91IGFncmVlIHRvIGFsbG93IHlvdXIgY29kZSB0byBiZSB1c2VkIHVuZGVyIGJvdGguICBUaGUgZnVsbCB0ZXh0IG9mIHRoZQorcmVsZXZhbnQgbGljZW5zZXMgaXMgaW5jbHVkZWQgYmVsb3cuCisKK0luIGFkZGl0aW9uLCBhIGxpY2Vuc2UgYWdyZWVtZW50IGZyb20gdGhlIGNvcHlyaWdodC9wYXRlbnQgaG9sZGVycyBvZiB0aGUKK3NvZnR3YXJlIGNvbnRhaW5lZCBpbiB0aGlzIGRpcmVjdG9yeSB0cmVlIGlzIGluY2x1ZGVkIGJlbG93LgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVW5pdmVyc2l0eSBvZiBJbGxpbm9pcy9OQ1NBCitPcGVuIFNvdXJjZSBMaWNlbnNlCisKK0NvcHlyaWdodCAoYykgMTk5Ny0yMDE0IEludGVsIENvcnBvcmF0aW9uCisKK0FsbCByaWdodHMgcmVzZXJ2ZWQuCisKK0RldmVsb3BlZCBieToKKyAgICBPcGVuTVAgUnVudGltZSBUZWFtCisgICAgSW50ZWwgQ29ycG9yYXRpb24KKyAgICBodHRwOi8vd3d3Lm9wZW5tcHJ0bC5vcmcKKworUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgordGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgd2l0aAordGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bwordXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKK29mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbworc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVycy4KKworICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcnMgaW4gdGhlCisgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgKiBOZWl0aGVyIHRoZSBuYW1lcyBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBPcGVuTVAgUnVudGltZSBUZWFtIG5vciB0aGUKKyAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICAgICBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTCitGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorQ09OVFJJQlVUT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCitMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBXSVRIIFRIRQorU09GVFdBUkUuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitDb3B5cmlnaHQgKGMpIDE5OTctMjAxNCBJbnRlbCBDb3Jwb3JhdGlvbgorCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CitvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAoraW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwordG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCitmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKK09VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KK1RIRSBTT0ZUV0FSRS4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0ludGVsIENvcnBvcmF0aW9uCisKK1NvZnR3YXJlIEdyYW50IExpY2Vuc2UgQWdyZWVtZW50ICgiQWdyZWVtZW50IikKKworRXhjZXB0IGZvciB0aGUgbGljZW5zZSBncmFudGVkIGhlcmVpbiB0byB5b3UsIEludGVsIENvcnBvcmF0aW9uICgiSW50ZWwiKSByZXNlcnZlcworYWxsIHJpZ2h0LCB0aXRsZSwgYW5kIGludGVyZXN0IGluIGFuZCB0byB0aGUgU29mdHdhcmUgKGRlZmluZWQgYmVsb3cpLgorCitEZWZpbml0aW9uCisKKyJTb2Z0d2FyZSIgbWVhbnMgdGhlIGNvZGUgYW5kIGRvY3VtZW50YXRpb24gYXMgd2VsbCBhcyBhbnkgb3JpZ2luYWwgd29yayBvZgorYXV0aG9yc2hpcCwgaW5jbHVkaW5nIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucyB0byBhbiBleGlzdGluZyB3b3JrLCB0aGF0CitpcyBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBieSBJbnRlbCB0byBsbHZtLm9yZyAoaHR0cDovL2xsdm0ub3JnKSAoIkxMVk0iKSBmb3IKK2luY2x1c2lvbiBpbiwgb3IgZG9jdW1lbnRhdGlvbiBvZiwgYW55IG9mIHRoZSBwcm9kdWN0cyBvd25lZCBvciBtYW5hZ2VkIGJ5IExMVk0KKyh0aGUgIldvcmsiKS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiIG1lYW5zIGFueSBmb3JtIG9mCitlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50IHRvIExMVk0gb3IgaXRzCityZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljCittYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlCittYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIExMVk0gZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZwordGhlIFdvcmssIGJ1dCBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG90aGVyd2lzZS4KKworMS4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMKKyAgIEFncmVlbWVudCwgSW50ZWwgaGVyZWJ5IGdyYW50cyB0byB5b3UgYW5kIHRvIHJlY2lwaWVudHMgb2YgdGhlIFNvZnR3YXJlCisgICBkaXN0cmlidXRlZCBieSBMTFZNIGEgcGVycGV0dWFsLCB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwKKyAgIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUKKyAgIHdvcmtzIG9mLCBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKKyAgIFNvZnR3YXJlIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MuCisKKzIuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzCisgICBBZ3JlZW1lbnQsIEludGVsIGhlcmVieSBncmFudHMgeW91IGFuZCB0byByZWNpcGllbnRzIG9mIHRoZSBTb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgYnkgTExWTSBhIHBlcnBldHVhbCwgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsCisgICByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UKKyAgIHRvIG1ha2UsIGhhdmUgbWFkZSwgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIKKyAgIHRoZSBXb3JrLCB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQorICAgYnkgSW50ZWwgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IEludGVsJ3MgU29mdHdhcmUgYWxvbmUgb3IgYnkKKyAgIGNvbWJpbmF0aW9uIG9mIHRoZSBTb2Z0d2FyZSB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggU29mdHdhcmUgd2FzCisgICBzdWJtaXR0ZWQuIElmIGFueSBlbnRpdHkgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IEludGVsIG9yIGFueQorICAgb3RoZXIgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZworICAgdGhhdCBJbnRlbCdzIFNvZnR3YXJlLCBvciB0aGUgV29yayB0byB3aGljaCBJbnRlbCBoYXMgY29udHJpYnV0ZWQgY29uc3RpdHV0ZXMKKyAgIGRpcmVjdCBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzIGdyYW50ZWQKKyAgIHRvIHRoYXQgZW50aXR5IHVuZGVyIHRoaXMgQWdyZWVtZW50IGZvciB0aGUgU29mdHdhcmUgb3IgV29yayBzaGFsbCB0ZXJtaW5hdGUKKyAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCB0aGUgc29mdHdhcmUgaXMKK3Byb3ZpZGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELAorZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yCitjb25kaXRpb25zIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKK1BBUlRJQ1VMQVIgUFVSUE9TRS4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL01ha2VmaWxlIGIvZmluYWwvb2ZmbG9hZC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jNzlmMDZkCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9NYWtlZmlsZQpAQCAtMCwwICsxLDIwOCBAQAorIw0KKyMjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisjLy8NCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQ0KKyMvLw0KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuDQorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLg0KKyMvLw0KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKyMNCisNCisjIE1BS0VGSUxFIFBBUkFNRVRFUlMNCisjDQorIyByb290X2RpciAtIHBhdGggdG8gcm9vdCBkaXJlY3Rvcnkgb2YgbGlib2ZmbG9hZA0KKyMgYnVpbGRfZGlyIC0gcGF0aCB0byBidWlsZCBkaXJlY3RvcnkNCisjIG1wc3NfZGlyIC0gcGF0aCB0byByb290IGRpcmVjdG9yeSBvZiBtcHNzDQorIyBsaWJpb21wX2hvc3RfZGlyIC0gcGF0aCB0byBob3N0IGxpYmlvbXAgZGlyZWN0b3J5ICh1bm5lY2Vzc2FyeSBpZiBjb21waWxlcl9ob3N0IGlzIGljYykNCisjIGxpYmlvbXBfdGFyZ2V0X2RpciAtIHBhdGggdG8gdGFyZ2V0IGxpYmlvbXAgZGlyZWN0b3J5ICh1bm5lY2VzYXJyeSBpZiBjb21waWxlcl90YXJnZXQgaXMgaWNjKQ0KKyMgb21wX2hlYWRlcl9kaXIgLSBwYXRoIHRvIG9tcC5oICh1bm5lY2Vzc2FyeSBpZiBjb21waWxlcl9ob3N0IGFuZCBjb21waWxlcl90YXJnZXQgYXJlIGljYykNCisjIG9zX2hvc3QgLSBob3N0IG9wZXJhdGluZyBzeXN0ZW0NCisjIG9zX3RhcmdldCAtIHRhcmdldCBvcGVyYXRpbmcgc3lzdGVtDQorIyBjb21waWxlcl9ob3N0IC0gaG9zdCBjb21waWxlcg0KKyMgY29tcGlsZXJfdGFyZ2V0IC0gdGFyZ2V0IGNvbXBpbGVyDQorIyBvcHRpb25zX2hvc3QgLSBhZGRpdGlvbmFsIG9wdGlvbnMgZm9yIGhvc3QgY29tcGlsZXINCisjIG9wdGlvbnNfdGFyZ2V0IC0gYWRkaXRpb25hbCBvcHRpb25zIGZvciB0YXJnZXQgY29tcGlsZXINCisjDQorDQorIyBEaXJlY3Rvcmllcw0KK3Jvb3RfZGlyPz0uDQorYnVpbGRfZGlyPz0kKHJvb3RfZGlyKS9idWlsZA0KK2J1aWxkX2hvc3RfZGlyPSQoYnVpbGRfZGlyKS9ob3N0DQorYnVpbGRfdGFyZ2V0X2Rpcj0kKGJ1aWxkX2RpcikvdGFyZ2V0DQorb2JqX2hvc3RfZGlyPSQoYnVpbGRfZGlyKS9vYmpfaG9zdA0KK29ial90YXJnZXRfZGlyPSQoYnVpbGRfZGlyKS9vYmpfdGFyZ2V0DQorc291cmNlX2Rpcj0kKHJvb3RfZGlyKS9zcmMNCitpbXBvcnRlZF9kaXI9JChzb3VyY2VfZGlyKS9pbXBvcnRlZA0KKw0KKyMgT1MNCitvc19ob3N0Pz1saW51eA0KK29zX3RhcmdldD89bGludXgNCitpZm5lcSAoJChvc19ob3N0KV8kKG9zX3RhcmdldCksIGxpbnV4X2xpbnV4KQ0KKyAgJChlcnJvciAiT25seSBsaW51eCBpcyBzdXBwb3J0ZWQiKQ0KK2VuZGlmDQorDQorIyBDb21waWxlcnMNCitjb21waWxlcl9ob3N0Pz1nY2MNCitjb21waWxlcl90YXJnZXQ/PWdjYw0KKw0KKyMgTVBTUw0KK21wc3NfZGlyPz0vDQorbXBzc19wcmVzZW50PSQoc2hlbGwgaWYgdGVzdCAtZCAkKG1wc3NfZGlyKTsgdGhlbiBlY2hvIE9LOyBlbHNlIGVjaG8gS087IGZpKQ0KK2lmbmVxICgkKG1wc3NfcHJlc2VudCksIE9LKQ0KKyAgJChlcnJvciAiQ2Fubm90IGZpbmQgTVBTUyBkaXJlY3RvcnkgJChtcHNzX2RpcikiKQ0KK2VuZGlmDQorDQorY29pX2Rpcj0kKG1wc3NfZGlyKS9vcHQvaW50ZWwvbWljL2NvaQ0KK215b19kaXI9JChtcHNzX2Rpcikvb3B0L2ludGVsL21pYy9teW8NCisNCisjIFNvdXJjZXMNCitzcmNfbGlib2ZmbG9hZF9jb21tb249ZHZfdXRpbC5jcHAgbGlib2ZmbG9hZF9lcnJvci5jIGxpYm9mZmxvYWRfbXNnLmMgb2ZmbG9hZF9jb21tb24uY3BwIG9mZmxvYWRfdGFibGUuY3BwIG9mZmxvYWRfdHJhY2UuY3BwIG9mZmxvYWRfdXRpbC5jcHANCisNCitzcmNfbGlib2ZmbG9hZF9ob3N0PSQoc3JjX2xpYm9mZmxvYWRfY29tbW9uKSBjZWFuX3V0aWwuY3BwIGNvaS9jb2lfY2xpZW50LmNwcCBjb21waWxlcl9pZl9ob3N0LmNwcCBvZmZsb2FkX2VuZ2luZS5jcHAgb2ZmbG9hZF9lbnYuY3BwIG9mZmxvYWRfaG9zdC5jcHAgb2ZmbG9hZF9vbXBfaG9zdC5jcHAgb2ZmbG9hZF90aW1lcl9ob3N0LmNwcCBvZmZsb2FkX29yc2wuY3BwIG9yc2wtbGl0ZS9saWIvb3JzbC1saXRlLmMgb2ZmbG9hZF9teW9faG9zdC5jcHANCitzcmNfbGlib2ZmbG9hZF9ob3N0Oj0kKGZvcmVhY2ggZmlsZSwkKHNyY19saWJvZmZsb2FkX2hvc3QpLCQoc291cmNlX2RpcikvJChmaWxlKSkNCisNCitzcmNfbGlib2ZmbG9hZF90YXJnZXQ9JChzcmNfbGlib2ZmbG9hZF9jb21tb24pIGNvaS9jb2lfc2VydmVyLmNwcCBjb21waWxlcl9pZl90YXJnZXQuY3BwIG9mZmxvYWRfb21wX3RhcmdldC5jcHAgb2ZmbG9hZF90YXJnZXQuY3BwIG9mZmxvYWRfdGltZXJfdGFyZ2V0LmNwcCBvZmZsb2FkX215b190YXJnZXQuY3BwDQorc3JjX2xpYm9mZmxvYWRfdGFyZ2V0Oj0kKGZvcmVhY2ggZmlsZSwkKHNyY19saWJvZmZsb2FkX3RhcmdldCksJChzb3VyY2VfZGlyKS8kKGZpbGUpKQ0KKw0KK3NyY19vZmxkPW9mbGRiZWdpbi5jcHAgb2ZsZGVuZC5jcHANCitzcmNfb2ZsZDo9JChmb3JlYWNoIGZpbGUsJChzcmNfb2ZsZCksJChzb3VyY2VfZGlyKS8kKGZpbGUpKQ0KKw0KK2hlYWRlcnM9JCh3aWxkY2FyZCAkKHNvdXJjZV9kaXIpLyouaCkgJCh3aWxkY2FyZCAkKHNvdXJjZV9kaXIpL2NvaS8qLmgpICQod2lsZGNhcmQgJChzb3VyY2VfZGlyKS9vcnNsLWxpdGUvaW5jbHVkZS8qLmgpDQoraWZuZXEgKCQob21wX2hlYWRlcl9kaXIpLCApDQorICBoZWFkZXJzKz0kKGltcG9ydGVkX2Rpcikvb21wLmgNCitlbmRpZg0KKw0KKyMgT2JqZWN0cw0KK29ial9saWJvZmZsb2FkX2hvc3Q9JChub3RkaXIgJChzcmNfbGlib2ZmbG9hZF9ob3N0KSkNCitvYmpfbGlib2ZmbG9hZF9ob3N0Oj0kKG9ial9saWJvZmZsb2FkX2hvc3Q6LmNwcD0ubykNCitvYmpfbGlib2ZmbG9hZF9ob3N0Oj0kKG9ial9saWJvZmZsb2FkX2hvc3Q6LmM9Lm8pDQorb2JqX2xpYm9mZmxvYWRfaG9zdDo9JChmb3JlYWNoIGZpbGUsJChvYmpfbGlib2ZmbG9hZF9ob3N0KSwkKG9ial9ob3N0X2RpcikvJChmaWxlKSkNCisNCitvYmpfbGlib2ZmbG9hZF90YXJnZXQ9JChub3RkaXIgJChzcmNfbGlib2ZmbG9hZF90YXJnZXQpKQ0KK29ial9saWJvZmZsb2FkX3RhcmdldDo9JChvYmpfbGlib2ZmbG9hZF90YXJnZXQ6LmNwcD0ubykNCitvYmpfbGlib2ZmbG9hZF90YXJnZXQ6PSQob2JqX2xpYm9mZmxvYWRfdGFyZ2V0Oi5jPS5vKQ0KK29ial9saWJvZmZsb2FkX3RhcmdldDo9JChmb3JlYWNoIGZpbGUsJChvYmpfbGlib2ZmbG9hZF90YXJnZXQpLCQob2JqX3RhcmdldF9kaXIpLyQoZmlsZSkpDQorDQorb2JqX29mbGQ9JChub3RkaXIgJChzcmNfb2ZsZCkpDQorb2JqX29mbGQ6PSQob2JqX29mbGQ6LmNwcD0ubykNCitvYmpfb2ZsZF9ob3N0PSQoZm9yZWFjaCBmaWxlLCQob2JqX29mbGQpLCQoYnVpbGRfaG9zdF9kaXIpLyQoZmlsZSkpDQorb2JqX29mbGRfdGFyZ2V0PSQoZm9yZWFjaCBmaWxlLCQob2JqX29mbGQpLCQoYnVpbGRfdGFyZ2V0X2RpcikvJChmaWxlKSkNCisNCisjIE9wdGlvbnMNCitvcHRzX2NvbW1vbj0tTzIgLXcgLWZwaWMgLWMgLURDT0lfTElCUkFSWV9WRVJTSU9OPTIgLURNWU9fU1VQUE9SVCAtRE9GRkxPQURfREVCVUc9MSAtRFNFUF9TVVBQT1JUIC1EVElNSU5HX1NVUFBPUlQgLUkkKGNvaV9kaXIpL2luY2x1ZGUgLUkkKG15b19kaXIpL2luY2x1ZGUgLUkkKHNvdXJjZV9kaXIpDQoraWZuZXEgKCQob21wX2hlYWRlcl9kaXIpLCApDQorICBvcHRzX2NvbW1vbis9LUkkKGltcG9ydGVkX2RpcikNCitlbmRpZg0KKw0KK29wdHNfbGlib2ZmbG9hZD0tc2hhcmVkIC1XbCwtc29uYW1lLGxpYm9mZmxvYWQuc28uNSAtbGRsIC1sc3RkYysrIC1saW9tcDUNCisNCitvcHRzX2xpYm9mZmxvYWRfaG9zdD0kKG9wdHNfbGlib2ZmbG9hZCkgLUwkKGNvaV9kaXIpL2hvc3QtbGludXgtcmVsZWFzZS9saWIgLWxjb2lfaG9zdCAtTCQobXlvX2RpcikvbGliIC1sbXlvLWNsaWVudA0KK2lmbmVxICgkKGxpYmlvbXBfaG9zdF9kaXIpLCApDQorICBvcHRzX2xpYm9mZmxvYWRfaG9zdCs9LUwkKGxpYmlvbXBfaG9zdF9kaXIpDQorZW5kaWYNCisNCitvcHRzX2xpYm9mZmxvYWRfdGFyZ2V0PSQob3B0c19saWJvZmZsb2FkKSAtTCQoY29pX2RpcikvZGV2aWNlLWxpbnV4LXJlbGVhc2UvbGliIC1sY29pX2RldmljZSAtTCQobXlvX2RpcikvbGliIC1sbXlvLXNlcnZpY2UNCitpZm5lcSAoJChsaWJpb21wX3RhcmdldF9kaXIpLCApDQorICBvcHRzX2xpYm9mZmxvYWRfdGFyZ2V0Kz0tTCQobGliaW9tcF90YXJnZXRfZGlyKQ0KK2VuZGlmDQorDQorb3B0aW9uc19ob3N0Pz0NCitvcHRzX2hvc3Q9JChvcHRpb25zX2hvc3QpIC1ESE9TVF9MSUJSQVJZPTENCitpZmVxICgkKG9zX2hvc3QpLCBsaW51eCkNCisgIG9wdHNfaG9zdCs9LURMSU5VWA0KK2VuZGlmDQorDQorb3B0aW9uc190YXJnZXQ/PQ0KK29wdHNfdGFyZ2V0PSQob3B0aW9uc190YXJnZXQpIC1ESE9TVF9MSUJSQVJZPTANCitpZmVxICgkKG9zX3RhcmdldCksIGxpbnV4KQ0KKyAgb3B0c190YXJnZXQrPS1ETElOVVgNCitlbmRpZg0KKw0KKyMgTWFrZSB0YXJnZXRzDQorLlBIT05ZOiBhbGwgY2xlYW4gaW5mbw0KKw0KK2FsbDogaW5mbyAkKGJ1aWxkX2hvc3RfZGlyKS9saWJvZmZsb2FkLnNvICQoYnVpbGRfdGFyZ2V0X2RpcikvbGlib2ZmbG9hZC5zbyAkKG9ial9vZmxkX2hvc3QpICQob2JqX29mbGRfdGFyZ2V0KQ0KKw0KKw0KKyQoYnVpbGRfaG9zdF9kaXIpL2xpYm9mZmxvYWQuc286ICQoYnVpbGRfaG9zdF9kaXIpL2xpYm9mZmxvYWQuc28uNSB8ICQoYnVpbGRfaG9zdF9kaXIpDQorCWxuIC1mICQ8ICRADQorDQorJChidWlsZF9ob3N0X2RpcikvbGlib2ZmbG9hZC5zby41OiAkKG9ial9saWJvZmZsb2FkX2hvc3QpIHwgJChidWlsZF9ob3N0X2RpcikNCisJJChjb21waWxlcl9ob3N0KSAkKG9wdHNfbGlib2ZmbG9hZF9ob3N0KSAkKG9wdHNfaG9zdCkgJF4gLW8gJEANCisNCiskKG9ial9ob3N0X2RpcikvJS5vOiAkKHNvdXJjZV9kaXIpLyUuYyAkKGhlYWRlcnMpIHwgJChvYmpfaG9zdF9kaXIpDQorCSQoY29tcGlsZXJfaG9zdCkgJChvcHRzX2NvbW1vbikgJChvcHRzX2hvc3QpICQ8IC1vICRADQorDQorJChvYmpfaG9zdF9kaXIpLyUubzogJChzb3VyY2VfZGlyKS8lLmNwcCAkKGhlYWRlcnMpIHwgJChvYmpfaG9zdF9kaXIpDQorCSQoY29tcGlsZXJfaG9zdCkgJChvcHRzX2NvbW1vbikgJChvcHRzX2hvc3QpICQ8IC1vICRADQorDQorJChvYmpfaG9zdF9kaXIpLyUubzogJChzb3VyY2VfZGlyKS9jb2kvJS5jcHAgJChoZWFkZXJzKSB8ICQob2JqX2hvc3RfZGlyKQ0KKwkkKGNvbXBpbGVyX2hvc3QpICQob3B0c19jb21tb24pICQob3B0c19ob3N0KSAkPCAtbyAkQA0KKw0KKyQob2JqX2hvc3RfZGlyKS8lLm86ICQoc291cmNlX2Rpcikvb3JzbC1saXRlL2xpYi8lLmMgJChoZWFkZXJzKSB8ICQob2JqX2hvc3RfZGlyKQ0KKwkkKGNvbXBpbGVyX2hvc3QpICQob3B0c19jb21tb24pICQob3B0c19ob3N0KSAkPCAtbyAkQA0KKw0KKw0KKyQoYnVpbGRfdGFyZ2V0X2RpcikvbGlib2ZmbG9hZC5zbzogJChidWlsZF90YXJnZXRfZGlyKS9saWJvZmZsb2FkLnNvLjUgfCAkKGJ1aWxkX3RhcmdldF9kaXIpDQorCWxuIC1mICQ8ICRADQorDQorJChidWlsZF90YXJnZXRfZGlyKS9saWJvZmZsb2FkLnNvLjU6ICQob2JqX2xpYm9mZmxvYWRfdGFyZ2V0KSB8ICQoYnVpbGRfdGFyZ2V0X2RpcikNCisJJChjb21waWxlcl90YXJnZXQpICQob3B0c19saWJvZmZsb2FkX3RhcmdldCkgJChvcHRzX3RhcmdldCkgJF4gLW8gJEANCisNCiskKG9ial90YXJnZXRfZGlyKS8lLm86ICQoc291cmNlX2RpcikvJS5jICQoaGVhZGVycykgfCAkKG9ial90YXJnZXRfZGlyKQ0KKwkkKGNvbXBpbGVyX3RhcmdldCkgJChvcHRzX2NvbW1vbikgJChvcHRzX3RhcmdldCkgJDwgLW8gJEANCisNCiskKG9ial90YXJnZXRfZGlyKS8lLm86ICQoc291cmNlX2RpcikvJS5jcHAgJChoZWFkZXJzKSB8ICQob2JqX3RhcmdldF9kaXIpDQorCSQoY29tcGlsZXJfdGFyZ2V0KSAkKG9wdHNfY29tbW9uKSAkKG9wdHNfdGFyZ2V0KSAkPCAtbyAkQA0KKw0KKyQob2JqX3RhcmdldF9kaXIpLyUubzogJChzb3VyY2VfZGlyKS9jb2kvJS5jcHAgJChoZWFkZXJzKSB8ICQob2JqX3RhcmdldF9kaXIpDQorCSQoY29tcGlsZXJfdGFyZ2V0KSAkKG9wdHNfY29tbW9uKSAkKG9wdHNfdGFyZ2V0KSAkPCAtbyAkQA0KKw0KKyQob2JqX3RhcmdldF9kaXIpLyUubzogJChzb3VyY2VfZGlyKS9vcnNsLWxpdGUvbGliLyUuYyAkKGhlYWRlcnMpIHwgJChvYmpfdGFyZ2V0X2RpcikNCisJJChjb21waWxlcl90YXJnZXQpICQob3B0c19jb21tb24pICQob3B0c190YXJnZXQpICQ8IC1vICRADQorDQorDQorJChidWlsZF9ob3N0X2RpcikvJS5vOiAkKHNvdXJjZV9kaXIpLyUuY3BwICQoaGVhZGVycykgfCAkKGJ1aWxkX2hvc3RfZGlyKQ0KKwkkKGNvbXBpbGVyX2hvc3QpICQob3B0c19jb21tb24pICQob3B0c19ob3N0KSAkPCAtbyAkQA0KKw0KKyQoYnVpbGRfdGFyZ2V0X2RpcikvJS5vOiAkKHNvdXJjZV9kaXIpLyUuY3BwICQoaGVhZGVycykgfCAkKGJ1aWxkX3RhcmdldF9kaXIpDQorCSQoY29tcGlsZXJfdGFyZ2V0KSAkKG9wdHNfY29tbW9uKSAkKG9wdHNfdGFyZ2V0KSAkPCAtbyAkQA0KKw0KKw0KKyQoaW1wb3J0ZWRfZGlyKS9vbXAuaDogJChvbXBfaGVhZGVyX2Rpcikvb21wLmggfCAkKGltcG9ydGVkX2RpcikNCisJY3AgJDwgJEANCisNCisNCiskKGJ1aWxkX2hvc3RfZGlyKSAkKGJ1aWxkX3RhcmdldF9kaXIpICQob2JqX2hvc3RfZGlyKSAkKG9ial90YXJnZXRfZGlyKTogfCAkKGJ1aWxkX2RpcikNCisJJChzaGVsbCBta2RpciAtcCAkQCA+L2Rldi9udWxsIDI+L2Rldi9udWxsKQ0KKwlAZWNobyAiQ3JlYXRlZCAkQCBkaXJlY3RvcnkiDQorDQorJChidWlsZF9kaXIpOg0KKwkkKHNoZWxsIG1rZGlyIC1wICRAID4vZGV2L251bGwgMj4vZGV2L251bGwpDQorCUBlY2hvICJDcmVhdGVkICRAIGRpcmVjdG9yeSINCisNCiskKGltcG9ydGVkX2Rpcik6DQorCSQoc2hlbGwgbWtkaXIgLXAgJEAgPi9kZXYvbnVsbCAyPi9kZXYvbnVsbCkNCisJQGVjaG8gIkNyZWF0ZWQgJEAgZGlyZWN0b3J5Ig0KKw0KKw0KK2NsZWFuOg0KKwkkKHNoZWxsIHJtIC1yZiAkKGJ1aWxkX2RpcikpDQorCUBlY2hvICJSZW1vdmUgJChidWlsZF9kaXIpIGRpcmVjdG9yeSINCisNCisNCitpbmZvOg0KKwlAZWNobyAicm9vdF9kaXIgPSAkKHJvb3RfZGlyKSINCisJQGVjaG8gImJ1aWxkX2RpciA9ICQoYnVpbGRfZGlyKSINCisJQGVjaG8gIm1wc3NfZGlyID0gJChtcHNzX2RpcikiDQorCUBlY2hvICJsaWJpb21wX2hvc3RfZGlyID0gJChsaWJpb21wX2hvc3RfZGlyKSINCisJQGVjaG8gImxpYmlvbXBfdGFyZ2V0X2RpciA9ICQobGliaW9tcF90YXJnZXRfZGlyKSINCisJQGVjaG8gIm9tcF9oZWFkZXJfZGlyID0gJChvbXBfaGVhZGVyX2RpcikiDQorCUBlY2hvICJvc19ob3N0ID0gJChvc19ob3N0KSINCisJQGVjaG8gIm9zX3RhcmdldCA9ICQob3NfdGFyZ2V0KSINCisJQGVjaG8gImNvbXBpbGVyX2hvc3QgPSAkKGNvbXBpbGVyX2hvc3QpIg0KKwlAZWNobyAiY29tcGlsZXJfdGFyZ2V0ID0gJChjb21waWxlcl90YXJnZXQpIg0KKwlAZWNobyAib3B0aW9uc19ob3N0ID0gJChvcHRpb25zX2hvc3QpIg0KKwlAZWNobyAib3B0aW9uc190YXJnZXQgPSAkKG9wdGlvbnNfdGFyZ2V0KSINCisNCmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL1JFQURNRS50eHQgYi9maW5hbC9vZmZsb2FkL1JFQURNRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZWI5ZmIxZAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvUkVBRE1FLnR4dApAQCAtMCwwICsxLDEyOSBAQAorDQorCSAgICAgICBSRUFETUUgZm9yIEludGVsKFIpIE9mZmxvYWQgUnVudGltZSBMaWJyYXJ5DQorCSAgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorDQorSG93IHRvIEJ1aWxkIERvY3VtZW50YXRpb24NCis9PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKw0KK1RoZSBtYWluIGRvY3VtZW50YXRpb24gaXMgaW4gRG94eWdlbiogZm9ybWF0LCBhbmQgdGhpcyBkaXN0cmlidXRpb24NCitzaG91bGQgY29tZSB3aXRoIHByZS1idWlsdCBQREYgZG9jdW1lbnRhdGlvbiBpbiBkb2MvUmVmZXJlbmNlLnBkZi4NCitIb3dldmVyLCBhbiBIVE1MIHZlcnNpb24gY2FuIGJlIGJ1aWx0IGJ5IGV4ZWN1dGluZzoNCisNCislIGRveHlnZW4gZG9jL2RveHlnZW4vY29uZmlnDQorDQoraW4gdGhpcyBkaXJlY3RvcnkuDQorDQorVGhhdCB3aWxsIHByb2R1Y2UgSFRNTCBkb2N1bWVudGF0aW9uIGluIHRoZSBkb2MvZG94eWdlbi9nZW5lcmF0ZWQNCitkaXJlY3RvcnksIHdoaWNoIGNhbiBiZSBhY2Nlc3NlZCBieSBwb2ludGluZyBhIHdlYiBicm93c2VyIGF0IHRoZQ0KK2luZGV4Lmh0bWwgZmlsZSB0aGVyZS4NCisNCitJZiB5b3UgZG9uJ3QgaGF2ZSBEb3h5Z2VuIGluc3RhbGxlZCwgeW91IGNhbiBkb3dubG9hZCBpdCBmcm9tDQord3d3LmRveHlnZW4ub3JnLg0KKw0KKw0KK1NvZnR3YXJlIFJlcXVpcmVtZW50cw0KKz09PT09PT09PT09PT09PT09PT09PQ0KKw0KK0ludGVsKFIpIE9mZmxvYWQgUnVudGltZSBMaWJyYXJ5IHJlcXVpcmVzIGFkZGl0aW9uYWwgc29mdHdhcmU6DQorDQorMSkgSW50ZWwoUikgT3Blbk1QKiBSdW50aW1lIExpYnJhcnkuICBZb3UgY2FuIGVpdGhlciBkb3dubG9hZCB0aGUgc291cmNlDQorY29kZSBmb3IgdGhhdCAoZnJvbSBvcGVubXBydGwub3JnIG9yIG9wZW5tcC5sbHZtLm9yZykgb3Igc2ltcGx5IHVzZSB0aGUNCitjb21waWxlZCB2ZXJzaW9uIGRpc3RyaWJ1dGVkIHdpdGggdGhlIEludGVsIGNvbXBpbGVycy4NCisyKSBJbnRlbChSKSBDT0kgUnVudGltZSBMaWJyYXJ5IGFuZCBJbnRlbChSKSBNWU8gUnVudGltZSBMaWJyYXJ5LiAgVGhlc2UNCitsaWJyYXJpZXMgYXJlIHBhcnQgb2YgSW50ZWwoUikgTWFueWNvcmUgUGxhdGZvcm0gU29mdHdhcmUgU3RhY2sgKE1QU1MpLiAgWW91DQorY2FuIGRvd25sb2FkIE1QU1Mgc291cmNlIGNvZGUgb3IgYmluYXJpZXMgZnJvbQ0KK3NvZnR3YXJlLmludGVsLmNvbS9lbi11cy9hcnRpY2xlcy9pbnRlbC1tYW55Y29yZS1wbGF0Zm9ybS1zb2Z0d2FyZS1zdGFjay1tcHNzLg0KK0JpbmFyaWVzIGluY2x1ZGUgaG9zdCBsaWJyYXJpZXMgZm9yIEludGVsKFIpIDY0IEFyY2hpdGVjdHVyZSBhbmQgdGFyZ2V0DQorbGlicmFyaWVzIGZvciBJbnRlbChSKSBNYW55IEludGVncmF0ZWQgQ29yZSBBcmNoaXRlY3R1cmUuDQorDQorQWxzbyB5b3Ugd2lsbCByZXF1aXJlIGFsbCBvZiB0aGUgbGlicmFyaWVzIHRoYXQgZW5hYmxlIHRoZSB0YXJnZXQgY29kZSB0byBydW4NCitvbiBkZXZpY2UuICBJZiB5b3UgdGFyZ2V0IHRoZSBJbnRlbChSKSBYZW9uIFBoaSAoVE0pIGNvcHJvY2Vzc29yLCB0aGVzZQ0KK2xpYnJhcmllcyBjYW4gYmUgdGFrZW4gZnJvbSBNUFNTIHRvby4NCisNCisNCitIb3cgdG8gQnVpbGQgdGhlIEludGVsKFIpIE9mZmxvYWQgUnVudGltZSBMaWJyYXJ5DQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKw0KK1RoZSBNYWtlZmlsZSBhdCB0aGUgdG9wLWxldmVsIHdpbGwgYXR0ZW1wdCB0byBkZXRlY3Qgd2hhdCBpdCBuZWVkcyB0bw0KK2J1aWxkIHRoZSBJbnRlbChSKSBPZmZsb2FkIFJ1bnRpbWUgTGlicmFyeS4gIFRvIHNlZSB0aGUgZGVmYXVsdCBzZXR0aW5ncywNCit0eXBlOg0KKw0KK21ha2UgaW5mbw0KKw0KK1lvdSBjYW4gY2hhbmdlIHRoZSBNYWtlZmlsZSdzIGJlaGF2aW9yIHdpdGggdGhlIGZvbGxvd2luZyBvcHRpb25zOg0KKw0KK3Jvb3RfZGlyOgkgICAgICBUaGUgcGF0aCB0byB0aGUgdG9wLWxldmVsIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZQ0KKwkJICAgICAgdG9wLWxldmVsIE1ha2VmaWxlLiAgQnkgZGVmYXVsdCwgdGhpcyB3aWxsIHRha2Ugb24gdGhlDQorCQkgICAgICB2YWx1ZSBvZiB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4NCisNCitidWlsZF9kaXI6CSAgICAgIFRoZSBwYXRoIHRvIHRoZSBidWlsZCBkaXJlY3RvcnkuICBCeSBkZWZhdWx0LCB0aGlzIHdpbGwNCisJCSAgICAgIHRha2Ugb24gdmFsdWUgW3Jvb3RfZGlyXS9idWlsZC4NCisNCittcHNzX2RpcjoJICAgICAgVGhlIHBhdGggdG8gdGhlIEludGVsKFIpIE1hbnljb3JlIFBsYXRmb3JtIFNvZnR3YXJlDQorCQkgICAgICBTdGFjayBpbnN0YWxsIGRpcmVjdG9yeS4gIEJ5IGRlZmF1bHQsIHRoaXMgd2lsbCB0YWtlIG9uDQorCQkgICAgICB0aGUgdmFsdWUgb2Ygb3BlcmF0aW5nIHN5c3RlbSdzIHJvb3QgZGlyZWN0b3J5Lg0KKw0KK2xpYmlvbXBfaG9zdF9kaXI6ICAgICBUaGUgcGF0aCB0byB0aGUgaG9zdCBJbnRlbChSKSBPcGVuTVAqIFJ1bnRpbWUgTGlicmFyeS4NCisJCSAgICAgIFRoaXMgb3B0aW9uIGlzIHJlcXVpcmVkIHdoZW4gdGhlIGhvc3QgY29tcGlsZXIgaXMgb3RoZXINCisJCSAgICAgIHRoYW4gaWNjLg0KKw0KK2xpYmlvbXBfdGFyZ2V0X2RpcjogICBUaGUgcGF0aCB0byB0aGUgdGFyZ2V0IEludGVsKFIpIE9wZW5NUCogUnVudGltZQ0KKwkJICAgICAgTGlicmFyeS4gIFRoaXMgb3B0aW9uIGlzIHJlcXVpcmVkIHdoZW4gdGhlIHRhcmdldA0KKwkJICAgICAgY29tcGlsZXIgaXMgb3RoZXIgdGhhbiBpY2MuDQorDQorb21wX2hlYWRlcl9kaXI6ICAgICAgIFRoZSBwYXRoIHRvIHRoZSBoZWFkZXIgZmlsZSA8b21wLmg+IG9mIEludGVsKFIpIE9wZW5NUCoNCisJCSAgICAgIFJ1bnRpbWUgTGlicmFyeS4gIFRoaXMgb3B0aW9uIGlzIHJlcXVpcmVkIGlmIGVpdGhlciBob3N0DQorCQkgICAgICBvciB0YXJnZXQgY29tcGlsZXIgaXMgb3RoZXIgdGhhbiBpY2MuDQorDQorb3NfaG9zdDoJICAgICAgT3BlcmF0aW5nIHN5c3RlbSBvbiBob3N0LiAgQ3VycmVudGx5IHN1cHBvcnRzIG9ubHkNCisJCSAgICAgICJsaW51eCIgd2hpY2ggaXMgc2V0IGJ5IGRlZmF1bHQuDQorDQorb3NfdGFyZ2V0OgkgICAgICBPcGVyYXRpbmcgc3lzdGVtIG9uIHRhcmdldCBkZXZpY2UuICBDdXJyZW50bHkgc3VwcG9ydHMNCisJCSAgICAgIG9ubHkgImxpbnV4IiB3aGljaCBpcyBzZXQgYnkgZGVmYXVsdC4NCisNCitjb21waWxlcl9ob3N0OgkgICAgICBXaGljaCBjb21waWxlciB0byB1c2UgZm9yIHRoZSBidWlsZCBvZiB0aGUgaG9zdCBwYXJ0Lg0KKwkJICAgICAgRGVmYXVsdHMgdG8gImdjYyIqLiAgQWxzbyBzdXBwb3J0cyAiaWNjIiBhbmQgImNsYW5nIiouDQorCQkgICAgICBZb3Ugc2hvdWxkIHByb3ZpZGUgdGhlIGZ1bGwgcGF0aCB0byB0aGUgY29tcGlsZXIgb3IgaXQNCisJCSAgICAgIHNob3VsZCBiZSBpbiB0aGUgdXNlcidzIHBhdGguDQorDQorY29tcGlsZXJfaG9zdDoJICAgICAgV2hpY2ggY29tcGlsZXIgdG8gdXNlIGZvciB0aGUgYnVpbGQgb2YgdGhlIHRhcmdldCBwYXJ0Lg0KKwkJICAgICAgRGVmYXVsdHMgdG8gImdjYyIqLiAgQWxzbyBzdXBwb3J0cyAiaWNjIiBhbmQgImNsYW5nIiouDQorCQkgICAgICBZb3Ugc2hvdWxkIHByb3ZpZGUgdGhlIGZ1bGwgcGF0aCB0byB0aGUgY29tcGlsZXIgb3IgaXQNCisJCSAgICAgIHNob3VsZCBiZSBpbiB0aGUgdXNlcidzIHBhdGguDQorDQorb3B0aW9uc19ob3N0OgkgICAgICBBZGRpdGlvbmFsIG9wdGlvbnMgZm9yIHRoZSBob3N0IGNvbXBpbGVyLg0KKw0KK29wdGlvbnNfdGFyZ2V0OiAgICAgICBBZGRpdGlvbmFsIG9wdGlvbnMgZm9yIHRoZSB0YXJnZXQgY29tcGlsZXIuDQorDQorVG8gdXNlIGFueSBvZiB0aGUgb3B0aW9ucyBhYm92ZSwgc2ltcGxlIGFkZCA8b3B0aW9uX25hbWU+PTx2YWx1ZT4uICBGb3INCitleGFtcGxlLCBpZiB5b3Ugd2FudCB0byBidWlsZCB3aXRoIGljYyBpbnN0ZWFkIG9mIGdjYywgdHlwZToNCisNCittYWtlIGNvbXBpbGVyX2hvc3Q9aWNjIGNvbXBpbGVyX3RhcmdldD1pY2MNCisNCisNCitTdXBwb3J0ZWQgUlRMIEJ1aWxkIENvbmZpZ3VyYXRpb25zDQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKw0KK1N1cHBvcnRlZCBBcmNoaXRlY3R1cmVzOiBJbnRlbChSKSA2NCwgYW5kIEludGVsKFIpIE1hbnkgSW50ZWdyYXRlZA0KK0NvcmUgQXJjaGl0ZWN0dXJlDQorDQorCSAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKwkgICAgICB8ICAgaWNjL2ljbCAgICAgfCAgICBnY2MgICAgICB8ICAgIGNsYW5nICAgIHwNCistLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KK3wgTGludXgqIE9TICAgfCAgICAgIFllcyAgICAgIHwgICAgIFllcygxKSAgfCAgICAgWWVzKDEpICB8DQorfCBPUyBYKiAgICAgICB8ICAgICAgIE5vICAgICAgfCAgICAgIE5vICAgICB8ICAgICAgTm8gICAgIHwNCit8IFdpbmRvd3MqIE9TIHwgICAgICAgTm8gICAgICB8ICAgICAgTm8gICAgIHwgICAgICBObyAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorKDEpIExpYm9mZmxvYWQgcmVxdWlyZXMgX3JkdHNjIGludHJpbnNpYywgd2hpY2ggbWF5IGJlIHVuc3VwcG9ydGVkIGJ5IHNvbWUNCisgICAgdmVyc2lvbnMgb2YgY29tcGlsZXIuICBJbiB0aGlzIGNhc2UgeW91IG5lZWQgdG8gaW5jbHVkZSBzcmMvcmR0c2MuaA0KKyAgICBtYW51YWxseSBieSB1c2luZyBNYWtlZmlsZSBvcHRpb25zIG9wdGlvbnNfaG9zdCBhbmQgb3B0aW9uc190YXJnZXQ6DQorDQorICAgIG1ha2Ugb3B0aW9uc19ob3N0PSItaW5jbHVkZSBzcmMvcmR0c2MuaCIgb3B0aW9uc190YXJnZXQ9Ii1pbmNsdWRlIHNyYy9yZHRzYy5oIg0KKw0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorTm90aWNlcw0KKz09PT09PT0NCisNCisqT3RoZXIgbmFtZXMgYW5kIGJyYW5kcyBtYXkgYmUgY2xhaW1lZCBhcyB0aGUgcHJvcGVydHkgb2Ygb3RoZXJzLg0KZGlmZiAtLWdpdCBhL2ZpbmFsL29mZmxvYWQvZG9jL1JlZmVyZW5jZS5wZGYgYi9maW5hbC9vZmZsb2FkL2RvYy9SZWZlcmVuY2UucGRmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5MTc2ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL2RvYy9SZWZlcmVuY2UucGRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZpbmFsL29mZmxvYWQvZG9jL2RveHlnZW4vY29uZmlnIGIvZmluYWwvb2ZmbG9hZC9kb2MvZG94eWdlbi9jb25maWcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDQ1YjY5NgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvZG9jL2RveHlnZW4vY29uZmlnCkBAIC0wLDAgKzEsMjMyOCBAQAorIyBEb3h5ZmlsZSAxLjguNgorCisjIFRoaXMgZmlsZSBkZXNjcmliZXMgdGhlIHNldHRpbmdzIHRvIGJlIHVzZWQgYnkgdGhlIGRvY3VtZW50YXRpb24gc3lzdGVtCisjIGRveHlnZW4gKHd3dy5kb3h5Z2VuLm9yZykgZm9yIGEgcHJvamVjdC4KKyMKKyMgQWxsIHRleHQgYWZ0ZXIgYSBkb3VibGUgaGFzaCAoIyMpIGlzIGNvbnNpZGVyZWQgYSBjb21tZW50IGFuZCBpcyBwbGFjZWQgaW4KKyMgZnJvbnQgb2YgdGhlIFRBRyBpdCBpcyBwcmVjZWRpbmcuCisjCisjIEFsbCB0ZXh0IGFmdGVyIGEgc2luZ2xlIGhhc2ggKCMpIGlzIGNvbnNpZGVyZWQgYSBjb21tZW50IGFuZCB3aWxsIGJlIGlnbm9yZWQuCisjIFRoZSBmb3JtYXQgaXM6CisjIFRBRyA9IHZhbHVlIFt2YWx1ZSwgLi4uXQorIyBGb3IgbGlzdHMsIGl0ZW1zIGNhbiBhbHNvIGJlIGFwcGVuZGVkIHVzaW5nOgorIyBUQUcgKz0gdmFsdWUgW3ZhbHVlLCAuLi5dCisjIFZhbHVlcyB0aGF0IGNvbnRhaW4gc3BhY2VzIHNob3VsZCBiZSBwbGFjZWQgYmV0d2VlbiBxdW90ZXMgKFwiIFwiKS4KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBQcm9qZWN0IHJlbGF0ZWQgY29uZmlndXJhdGlvbiBvcHRpb25zCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgVGhpcyB0YWcgc3BlY2lmaWVzIHRoZSBlbmNvZGluZyB1c2VkIGZvciBhbGwgY2hhcmFjdGVycyBpbiB0aGUgY29uZmlnIGZpbGUKKyMgdGhhdCBmb2xsb3cuIFRoZSBkZWZhdWx0IGlzIFVURi04IHdoaWNoIGlzIGFsc28gdGhlIGVuY29kaW5nIHVzZWQgZm9yIGFsbCB0ZXh0CisjIGJlZm9yZSB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGlzIHRhZy4gRG94eWdlbiB1c2VzIGxpYmljb252IChvciB0aGUgaWNvbnYKKyMgYnVpbHQgaW50byBsaWJjKSBmb3IgdGhlIHRyYW5zY29kaW5nLiBTZWUgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2xpYmljb252CisjIGZvciB0aGUgbGlzdCBvZiBwb3NzaWJsZSBlbmNvZGluZ3MuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBVVEYtOC4KKworRE9YWUZJTEVfRU5DT0RJTkcgICAgICA9IFVURi04CisKKyMgVGhlIFBST0pFQ1RfTkFNRSB0YWcgaXMgYSBzaW5nbGUgd29yZCAob3IgYSBzZXF1ZW5jZSBvZiB3b3JkcyBzdXJyb3VuZGVkIGJ5CisjIGRvdWJsZS1xdW90ZXMsIHVubGVzcyB5b3UgYXJlIHVzaW5nIERveHl3aXphcmQpIHRoYXQgc2hvdWxkIGlkZW50aWZ5IHRoZQorIyBwcm9qZWN0IGZvciB3aGljaCB0aGUgZG9jdW1lbnRhdGlvbiBpcyBnZW5lcmF0ZWQuIFRoaXMgbmFtZSBpcyB1c2VkIGluIHRoZQorIyB0aXRsZSBvZiBtb3N0IGdlbmVyYXRlZCBwYWdlcyBhbmQgaW4gYSBmZXcgb3RoZXIgcGxhY2VzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTXkgUHJvamVjdC4KKworUFJPSkVDVF9OQU1FICAgICAgICAgICA9ICJJbnRlbCZyZWc7Jm5ic3A7T2ZmbG9hZCBSdW50aW1lIExpYnJhcnkiCisKKyMgVGhlIFBST0pFQ1RfTlVNQkVSIHRhZyBjYW4gYmUgdXNlZCB0byBlbnRlciBhIHByb2plY3Qgb3IgcmV2aXNpb24gbnVtYmVyLiBUaGlzCisjIGNvdWxkIGJlIGhhbmR5IGZvciBhcmNoaXZpbmcgdGhlIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uIG9yIGlmIHNvbWUgdmVyc2lvbgorIyBjb250cm9sIHN5c3RlbSBpcyB1c2VkLgorCitQUk9KRUNUX05VTUJFUiAgICAgICAgID0gCisKKyMgVXNpbmcgdGhlIFBST0pFQ1RfQlJJRUYgdGFnIG9uZSBjYW4gcHJvdmlkZSBhbiBvcHRpb25hbCBvbmUgbGluZSBkZXNjcmlwdGlvbgorIyBmb3IgYSBwcm9qZWN0IHRoYXQgYXBwZWFycyBhdCB0aGUgdG9wIG9mIGVhY2ggcGFnZSBhbmQgc2hvdWxkIGdpdmUgdmlld2VyIGEKKyMgcXVpY2sgaWRlYSBhYm91dCB0aGUgcHVycG9zZSBvZiB0aGUgcHJvamVjdC4gS2VlcCB0aGUgZGVzY3JpcHRpb24gc2hvcnQuCisKK1BST0pFQ1RfQlJJRUYgICAgICAgICAgPSAKKworIyBXaXRoIHRoZSBQUk9KRUNUX0xPR08gdGFnIG9uZSBjYW4gc3BlY2lmeSBhbiBsb2dvIG9yIGljb24gdGhhdCBpcyBpbmNsdWRlZCBpbgorIyB0aGUgZG9jdW1lbnRhdGlvbi4gVGhlIG1heGltdW0gaGVpZ2h0IG9mIHRoZSBsb2dvIHNob3VsZCBub3QgZXhjZWVkIDU1IHBpeGVscworIyBhbmQgdGhlIG1heGltdW0gd2lkdGggc2hvdWxkIG5vdCBleGNlZWQgMjAwIHBpeGVscy4gRG94eWdlbiB3aWxsIGNvcHkgdGhlIGxvZ28KKyMgdG8gdGhlIG91dHB1dCBkaXJlY3RvcnkuCisKK1BST0pFQ1RfTE9HTyAgICAgICAgICAgPSAKKworIyBUaGUgT1VUUFVUX0RJUkVDVE9SWSB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSAocmVsYXRpdmUgb3IgYWJzb2x1dGUpIHBhdGgKKyMgaW50byB3aGljaCB0aGUgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24gd2lsbCBiZSB3cml0dGVuLiBJZiBhIHJlbGF0aXZlIHBhdGggaXMKKyMgZW50ZXJlZCwgaXQgd2lsbCBiZSByZWxhdGl2ZSB0byB0aGUgbG9jYXRpb24gd2hlcmUgZG94eWdlbiB3YXMgc3RhcnRlZC4gSWYKKyMgbGVmdCBibGFuayB0aGUgY3VycmVudCBkaXJlY3Rvcnkgd2lsbCBiZSB1c2VkLgorCitPVVRQVVRfRElSRUNUT1JZICAgICAgID0gZG9jL2RveHlnZW4vZ2VuZXJhdGVkCisKKyMgSWYgdGhlIENSRUFURV9TVUJESVJTIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGVuIGRveHlnZW4gd2lsbCBjcmVhdGUgNDA5NiBzdWItCisjIGRpcmVjdG9yaWVzIChpbiAyIGxldmVscykgdW5kZXIgdGhlIG91dHB1dCBkaXJlY3Rvcnkgb2YgZWFjaCBvdXRwdXQgZm9ybWF0IGFuZAorIyB3aWxsIGRpc3RyaWJ1dGUgdGhlIGdlbmVyYXRlZCBmaWxlcyBvdmVyIHRoZXNlIGRpcmVjdG9yaWVzLiBFbmFibGluZyB0aGlzCisjIG9wdGlvbiBjYW4gYmUgdXNlZnVsIHdoZW4gZmVlZGluZyBkb3h5Z2VuIGEgaHVnZSBhbW91bnQgb2Ygc291cmNlIGZpbGVzLCB3aGVyZQorIyBwdXR0aW5nIGFsbCBnZW5lcmF0ZWQgZmlsZXMgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IHdvdWxkIG90aGVyd2lzZSBjYXVzZXMKKyMgcGVyZm9ybWFuY2UgcHJvYmxlbXMgZm9yIHRoZSBmaWxlIHN5c3RlbS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitDUkVBVEVfU1VCRElSUyAgICAgICAgID0gTk8KKworIyBUaGUgT1VUUFVUX0xBTkdVQUdFIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIGxhbmd1YWdlIGluIHdoaWNoIGFsbAorIyBkb2N1bWVudGF0aW9uIGdlbmVyYXRlZCBieSBkb3h5Z2VuIGlzIHdyaXR0ZW4uIERveHlnZW4gd2lsbCB1c2UgdGhpcworIyBpbmZvcm1hdGlvbiB0byBnZW5lcmF0ZSBhbGwgY29uc3RhbnQgb3V0cHV0IGluIHRoZSBwcm9wZXIgbGFuZ3VhZ2UuCisjIFBvc3NpYmxlIHZhbHVlcyBhcmU6IEFmcmlrYWFucywgQXJhYmljLCBBcm1lbmlhbiwgQnJhemlsaWFuLCBDYXRhbGFuLCBDaGluZXNlLAorIyBDaGluZXNlLVRyYWRpdGlvbmFsLCBDcm9hdGlhbiwgQ3plY2gsIERhbmlzaCwgRHV0Y2gsIEVuZ2xpc2ggKFVuaXRlZCBTdGF0ZXMpLAorIyBFc3BlcmFudG8sIEZhcnNpIChQZXJzaWFuKSwgRmlubmlzaCwgRnJlbmNoLCBHZXJtYW4sIEdyZWVrLCBIdW5nYXJpYW4sCisjIEluZG9uZXNpYW4sIEl0YWxpYW4sIEphcGFuZXNlLCBKYXBhbmVzZS1lbiAoSmFwYW5lc2Ugd2l0aCBFbmdsaXNoIG1lc3NhZ2VzKSwKKyMgS29yZWFuLCBLb3JlYW4tZW4gKEtvcmVhbiB3aXRoIEVuZ2xpc2ggbWVzc2FnZXMpLCBMYXR2aWFuLCBMaXRodWFuaWFuLAorIyBNYWNlZG9uaWFuLCBOb3J3ZWdpYW4sIFBlcnNpYW4gKEZhcnNpKSwgUG9saXNoLCBQb3J0dWd1ZXNlLCBSb21hbmlhbiwgUnVzc2lhbiwKKyMgU2VyYmlhbiwgU2VyYmlhbi1DeXJpbGxpYywgU2xvdmFrLCBTbG92ZW5lLCBTcGFuaXNoLCBTd2VkaXNoLCBUdXJraXNoLAorIyBVa3JhaW5pYW4gYW5kIFZpZXRuYW1lc2UuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBFbmdsaXNoLgorCitPVVRQVVRfTEFOR1VBR0UgICAgICAgID0gRW5nbGlzaAorCisjIElmIHRoZSBCUklFRl9NRU1CRVJfREVTQyB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgaW5jbHVkZSBicmllZiBtZW1iZXIKKyMgZGVzY3JpcHRpb25zIGFmdGVyIHRoZSBtZW1iZXJzIHRoYXQgYXJlIGxpc3RlZCBpbiB0aGUgZmlsZSBhbmQgY2xhc3MKKyMgZG9jdW1lbnRhdGlvbiAoc2ltaWxhciB0byBKYXZhZG9jKS4gU2V0IHRvIE5PIHRvIGRpc2FibGUgdGhpcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworQlJJRUZfTUVNQkVSX0RFU0MgICAgICA9IFlFUworCisjIElmIHRoZSBSRVBFQVRfQlJJRUYgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIHByZXBlbmQgdGhlIGJyaWVmCisjIGRlc2NyaXB0aW9uIG9mIGEgbWVtYmVyIG9yIGZ1bmN0aW9uIGJlZm9yZSB0aGUgZGV0YWlsZWQgZGVzY3JpcHRpb24KKyMKKyMgTm90ZTogSWYgYm90aCBISURFX1VORE9DX01FTUJFUlMgYW5kIEJSSUVGX01FTUJFUl9ERVNDIGFyZSBzZXQgdG8gTk8sIHRoZQorIyBicmllZiBkZXNjcmlwdGlvbnMgd2lsbCBiZSBjb21wbGV0ZWx5IHN1cHByZXNzZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK1JFUEVBVF9CUklFRiAgICAgICAgICAgPSBZRVMKKworIyBUaGlzIHRhZyBpbXBsZW1lbnRzIGEgcXVhc2ktaW50ZWxsaWdlbnQgYnJpZWYgZGVzY3JpcHRpb24gYWJicmV2aWF0b3IgdGhhdCBpcworIyB1c2VkIHRvIGZvcm0gdGhlIHRleHQgaW4gdmFyaW91cyBsaXN0aW5ncy4gRWFjaCBzdHJpbmcgaW4gdGhpcyBsaXN0LCBpZiBmb3VuZAorIyBhcyB0aGUgbGVhZGluZyB0ZXh0IG9mIHRoZSBicmllZiBkZXNjcmlwdGlvbiwgd2lsbCBiZSBzdHJpcHBlZCBmcm9tIHRoZSB0ZXh0CisjIGFuZCB0aGUgcmVzdWx0LCBhZnRlciBwcm9jZXNzaW5nIHRoZSB3aG9sZSBsaXN0LCBpcyB1c2VkIGFzIHRoZSBhbm5vdGF0ZWQKKyMgdGV4dC4gT3RoZXJ3aXNlLCB0aGUgYnJpZWYgZGVzY3JpcHRpb24gaXMgdXNlZCBhcy1pcy4gSWYgbGVmdCBibGFuaywgdGhlCisjIGZvbGxvd2luZyB2YWx1ZXMgYXJlIHVzZWQgKCRuYW1lIGlzIGF1dG9tYXRpY2FsbHkgcmVwbGFjZWQgd2l0aCB0aGUgbmFtZSBvZgorIyB0aGUgZW50aXR5KTpUaGUgJG5hbWUgY2xhc3MsIFRoZSAkbmFtZSB3aWRnZXQsIFRoZSAkbmFtZSBmaWxlLCBpcywgcHJvdmlkZXMsCisjIHNwZWNpZmllcywgY29udGFpbnMsIHJlcHJlc2VudHMsIGEsIGFuIGFuZCB0aGUuCisKK0FCQlJFVklBVEVfQlJJRUYgICAgICAgPSAiVGhlICRuYW1lIGNsYXNzIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSAkbmFtZSB3aWRnZXQiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlICRuYW1lIGZpbGUiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpcyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXMgXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbnMgXAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlcHJlc2VudHMgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGEgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGFuIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0aGUKKworIyBJZiB0aGUgQUxXQVlTX0RFVEFJTEVEX1NFQyBhbmQgUkVQRUFUX0JSSUVGIHRhZ3MgYXJlIGJvdGggc2V0IHRvIFlFUyB0aGVuCisjIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGRldGFpbGVkIHNlY3Rpb24gZXZlbiBpZiB0aGVyZSBpcyBvbmx5IGEgYnJpZWYKKyMgZGVzY3JpcHRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworQUxXQVlTX0RFVEFJTEVEX1NFQyAgICA9IE5PCisKKyMgSWYgdGhlIElOTElORV9JTkhFUklURURfTUVNQiB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIHNob3cgYWxsCisjIGluaGVyaXRlZCBtZW1iZXJzIG9mIGEgY2xhc3MgaW4gdGhlIGRvY3VtZW50YXRpb24gb2YgdGhhdCBjbGFzcyBhcyBpZiB0aG9zZQorIyBtZW1iZXJzIHdlcmUgb3JkaW5hcnkgY2xhc3MgbWVtYmVycy4gQ29uc3RydWN0b3JzLCBkZXN0cnVjdG9ycyBhbmQgYXNzaWdubWVudAorIyBvcGVyYXRvcnMgb2YgdGhlIGJhc2UgY2xhc3NlcyB3aWxsIG5vdCBiZSBzaG93bi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitJTkxJTkVfSU5IRVJJVEVEX01FTUIgID0gTk8KKworIyBJZiB0aGUgRlVMTF9QQVRIX05BTUVTIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBwcmVwZW5kIHRoZSBmdWxsIHBhdGgKKyMgYmVmb3JlIGZpbGVzIG5hbWUgaW4gdGhlIGZpbGUgbGlzdCBhbmQgaW4gdGhlIGhlYWRlciBmaWxlcy4gSWYgc2V0IHRvIE5PIHRoZQorIyBzaG9ydGVzdCBwYXRoIHRoYXQgbWFrZXMgdGhlIGZpbGUgbmFtZSB1bmlxdWUgd2lsbCBiZSB1c2VkCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0ZVTExfUEFUSF9OQU1FUyAgICAgICAgPSBZRVMKKworIyBUaGUgU1RSSVBfRlJPTV9QQVRIIHRhZyBjYW4gYmUgdXNlZCB0byBzdHJpcCBhIHVzZXItZGVmaW5lZCBwYXJ0IG9mIHRoZSBwYXRoLgorIyBTdHJpcHBpbmcgaXMgb25seSBkb25lIGlmIG9uZSBvZiB0aGUgc3BlY2lmaWVkIHN0cmluZ3MgbWF0Y2hlcyB0aGUgbGVmdC1oYW5kCisjIHBhcnQgb2YgdGhlIHBhdGguIFRoZSB0YWcgY2FuIGJlIHVzZWQgdG8gc2hvdyByZWxhdGl2ZSBwYXRocyBpbiB0aGUgZmlsZSBsaXN0LgorIyBJZiBsZWZ0IGJsYW5rIHRoZSBkaXJlY3RvcnkgZnJvbSB3aGljaCBkb3h5Z2VuIGlzIHJ1biBpcyB1c2VkIGFzIHRoZSBwYXRoIHRvCisjIHN0cmlwLgorIworIyBOb3RlIHRoYXQgeW91IGNhbiBzcGVjaWZ5IGFic29sdXRlIHBhdGhzIGhlcmUsIGJ1dCBhbHNvIHJlbGF0aXZlIHBhdGhzLCB3aGljaAorIyB3aWxsIGJlIHJlbGF0aXZlIGZyb20gdGhlIGRpcmVjdG9yeSB3aGVyZSBkb3h5Z2VuIGlzIHN0YXJ0ZWQuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBGVUxMX1BBVEhfTkFNRVMgaXMgc2V0IHRvIFlFUy4KKworU1RSSVBfRlJPTV9QQVRIICAgICAgICA9IHNyYy8KKworIyBUaGUgU1RSSVBfRlJPTV9JTkNfUEFUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc3RyaXAgYSB1c2VyLWRlZmluZWQgcGFydCBvZiB0aGUKKyMgcGF0aCBtZW50aW9uZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gb2YgYSBjbGFzcywgd2hpY2ggdGVsbHMgdGhlIHJlYWRlciB3aGljaAorIyBoZWFkZXIgZmlsZSB0byBpbmNsdWRlIGluIG9yZGVyIHRvIHVzZSBhIGNsYXNzLiBJZiBsZWZ0IGJsYW5rIG9ubHkgdGhlIG5hbWUgb2YKKyMgdGhlIGhlYWRlciBmaWxlIGNvbnRhaW5pbmcgdGhlIGNsYXNzIGRlZmluaXRpb24gaXMgdXNlZC4gT3RoZXJ3aXNlIG9uZSBzaG91bGQKKyMgc3BlY2lmeSB0aGUgbGlzdCBvZiBpbmNsdWRlIHBhdGhzIHRoYXQgYXJlIG5vcm1hbGx5IHBhc3NlZCB0byB0aGUgY29tcGlsZXIKKyMgdXNpbmcgdGhlIC1JIGZsYWcuCisKK1NUUklQX0ZST01fSU5DX1BBVEggICAgPSBzcmMvCisKKyMgSWYgdGhlIFNIT1JUX05BTUVTIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgbXVjaCBzaG9ydGVyIChidXQKKyMgbGVzcyByZWFkYWJsZSkgZmlsZSBuYW1lcy4gVGhpcyBjYW4gYmUgdXNlZnVsIGlzIHlvdXIgZmlsZSBzeXN0ZW1zIGRvZXNuJ3QKKyMgc3VwcG9ydCBsb25nIG5hbWVzIGxpa2Ugb24gRE9TLCBNYWMsIG9yIENELVJPTS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitTSE9SVF9OQU1FUyAgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgSkFWQURPQ19BVVRPQlJJRUYgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgaW50ZXJwcmV0IHRoZQorIyBmaXJzdCBsaW5lICh1bnRpbCB0aGUgZmlyc3QgZG90KSBvZiBhIEphdmFkb2Mtc3R5bGUgY29tbWVudCBhcyB0aGUgYnJpZWYKKyMgZGVzY3JpcHRpb24uIElmIHNldCB0byBOTywgdGhlIEphdmFkb2Mtc3R5bGUgd2lsbCBiZWhhdmUganVzdCBsaWtlIHJlZ3VsYXIgUXQtCisjIHN0eWxlIGNvbW1lbnRzICh0aHVzIHJlcXVpcmluZyBhbiBleHBsaWNpdCBAYnJpZWYgY29tbWFuZCBmb3IgYSBicmllZgorIyBkZXNjcmlwdGlvbi4pCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworSkFWQURPQ19BVVRPQlJJRUYgICAgICA9IE5PCisKKyMgSWYgdGhlIFFUX0FVVE9CUklFRiB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBpbnRlcnByZXQgdGhlIGZpcnN0CisjIGxpbmUgKHVudGlsIHRoZSBmaXJzdCBkb3QpIG9mIGEgUXQtc3R5bGUgY29tbWVudCBhcyB0aGUgYnJpZWYgZGVzY3JpcHRpb24uIElmCisjIHNldCB0byBOTywgdGhlIFF0LXN0eWxlIHdpbGwgYmVoYXZlIGp1c3QgbGlrZSByZWd1bGFyIFF0LXN0eWxlIGNvbW1lbnRzICh0aHVzCisjIHJlcXVpcmluZyBhbiBleHBsaWNpdCBcYnJpZWYgY29tbWFuZCBmb3IgYSBicmllZiBkZXNjcmlwdGlvbi4pCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworUVRfQVVUT0JSSUVGICAgICAgICAgICA9IE5PCisKKyMgVGhlIE1VTFRJTElORV9DUFBfSVNfQlJJRUYgdGFnIGNhbiBiZSBzZXQgdG8gWUVTIHRvIG1ha2UgZG94eWdlbiB0cmVhdCBhCisjIG11bHRpLWxpbmUgQysrIHNwZWNpYWwgY29tbWVudCBibG9jayAoaS5lLiBhIGJsb2NrIG9mIC8vISBvciAvLy8gY29tbWVudHMpIGFzCisjIGEgYnJpZWYgZGVzY3JpcHRpb24uIFRoaXMgdXNlZCB0byBiZSB0aGUgZGVmYXVsdCBiZWhhdmlvci4gVGhlIG5ldyBkZWZhdWx0IGlzCisjIHRvIHRyZWF0IGEgbXVsdGktbGluZSBDKysgY29tbWVudCBibG9jayBhcyBhIGRldGFpbGVkIGRlc2NyaXB0aW9uLiBTZXQgdGhpcworIyB0YWcgdG8gWUVTIGlmIHlvdSBwcmVmZXIgdGhlIG9sZCBiZWhhdmlvciBpbnN0ZWFkLgorIworIyBOb3RlIHRoYXQgc2V0dGluZyB0aGlzIHRhZyB0byBZRVMgYWxzbyBtZWFucyB0aGF0IHJhdGlvbmFsIHJvc2UgY29tbWVudHMgYXJlCisjIG5vdCByZWNvZ25pemVkIGFueSBtb3JlLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK01VTFRJTElORV9DUFBfSVNfQlJJRUYgPSBOTworCisjIElmIHRoZSBJTkhFUklUX0RPQ1MgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBhbiB1bmRvY3VtZW50ZWQgbWVtYmVyIGluaGVyaXRzIHRoZQorIyBkb2N1bWVudGF0aW9uIGZyb20gYW55IGRvY3VtZW50ZWQgbWVtYmVyIHRoYXQgaXQgcmUtaW1wbGVtZW50cy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworSU5IRVJJVF9ET0NTICAgICAgICAgICA9IFlFUworCisjIElmIHRoZSBTRVBBUkFURV9NRU1CRVJfUEFHRVMgdGFnIGlzIHNldCB0byBZRVMsIHRoZW4gZG94eWdlbiB3aWxsIHByb2R1Y2UgYQorIyBuZXcgcGFnZSBmb3IgZWFjaCBtZW1iZXIuIElmIHNldCB0byBOTywgdGhlIGRvY3VtZW50YXRpb24gb2YgYSBtZW1iZXIgd2lsbCBiZQorIyBwYXJ0IG9mIHRoZSBmaWxlL2NsYXNzL25hbWVzcGFjZSB0aGF0IGNvbnRhaW5zIGl0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1NFUEFSQVRFX01FTUJFUl9QQUdFUyAgPSBOTworCisjIFRoZSBUQUJfU0laRSB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBudW1iZXIgb2Ygc3BhY2VzIGluIGEgdGFiLiBEb3h5Z2VuCisjIHVzZXMgdGhpcyB2YWx1ZSB0byByZXBsYWNlIHRhYnMgYnkgc3BhY2VzIGluIGNvZGUgZnJhZ21lbnRzLgorIyBNaW5pbXVtIHZhbHVlOiAxLCBtYXhpbXVtIHZhbHVlOiAxNiwgZGVmYXVsdCB2YWx1ZTogNC4KKworVEFCX1NJWkUgICAgICAgICAgICAgICA9IDgKKworIyBUaGlzIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgbnVtYmVyIG9mIGFsaWFzZXMgdGhhdCBhY3QgYXMgY29tbWFuZHMgaW4KKyMgdGhlIGRvY3VtZW50YXRpb24uIEFuIGFsaWFzIGhhcyB0aGUgZm9ybToKKyMgbmFtZT12YWx1ZQorIyBGb3IgZXhhbXBsZSBhZGRpbmcKKyMgInNpZGVlZmZlY3Q9QHBhciBTaWRlIEVmZmVjdHM6XG4iCisjIHdpbGwgYWxsb3cgeW91IHRvIHB1dCB0aGUgY29tbWFuZCBcc2lkZWVmZmVjdCAob3IgQHNpZGVlZmZlY3QpIGluIHRoZQorIyBkb2N1bWVudGF0aW9uLCB3aGljaCB3aWxsIHJlc3VsdCBpbiBhIHVzZXItZGVmaW5lZCBwYXJhZ3JhcGggd2l0aCBoZWFkaW5nCisjICJTaWRlIEVmZmVjdHM6Ii4gWW91IGNhbiBwdXQgXG4ncyBpbiB0aGUgdmFsdWUgcGFydCBvZiBhbiBhbGlhcyB0byBpbnNlcnQKKyMgbmV3bGluZXMuCisKK0FMSUFTRVMgICAgICAgICAgICAgICAgPSAKKworIyBUaGlzIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgbnVtYmVyIG9mIHdvcmQta2V5d29yZCBtYXBwaW5ncyAoVENMIG9ubHkpLgorIyBBIG1hcHBpbmcgaGFzIHRoZSBmb3JtICJuYW1lPXZhbHVlIi4gRm9yIGV4YW1wbGUgYWRkaW5nICJjbGFzcz1pdGNsOjpjbGFzcyIKKyMgd2lsbCBhbGxvdyB5b3UgdG8gdXNlIHRoZSBjb21tYW5kIGNsYXNzIGluIHRoZSBpdGNsOjpjbGFzcyBtZWFuaW5nLgorCitUQ0xfU1VCU1QgICAgICAgICAgICAgID0gCisKKyMgU2V0IHRoZSBPUFRJTUlaRV9PVVRQVVRfRk9SX0MgdGFnIHRvIFlFUyBpZiB5b3VyIHByb2plY3QgY29uc2lzdHMgb2YgQyBzb3VyY2VzCisjIG9ubHkuIERveHlnZW4gd2lsbCB0aGVuIGdlbmVyYXRlIG91dHB1dCB0aGF0IGlzIG1vcmUgdGFpbG9yZWQgZm9yIEMuIEZvcgorIyBpbnN0YW5jZSwgc29tZSBvZiB0aGUgbmFtZXMgdGhhdCBhcmUgdXNlZCB3aWxsIGJlIGRpZmZlcmVudC4gVGhlIGxpc3Qgb2YgYWxsCisjIG1lbWJlcnMgd2lsbCBiZSBvbWl0dGVkLCBldGMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworT1BUSU1JWkVfT1VUUFVUX0ZPUl9DICA9IE5PCisKKyMgU2V0IHRoZSBPUFRJTUlaRV9PVVRQVVRfSkFWQSB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBKYXZhIG9yCisjIFB5dGhvbiBzb3VyY2VzIG9ubHkuIERveHlnZW4gd2lsbCB0aGVuIGdlbmVyYXRlIG91dHB1dCB0aGF0IGlzIG1vcmUgdGFpbG9yZWQKKyMgZm9yIHRoYXQgbGFuZ3VhZ2UuIEZvciBpbnN0YW5jZSwgbmFtZXNwYWNlcyB3aWxsIGJlIHByZXNlbnRlZCBhcyBwYWNrYWdlcywKKyMgcXVhbGlmaWVkIHNjb3BlcyB3aWxsIGxvb2sgZGlmZmVyZW50LCBldGMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworT1BUSU1JWkVfT1VUUFVUX0pBVkEgICA9IE5PCisKKyMgU2V0IHRoZSBPUFRJTUlaRV9GT1JfRk9SVFJBTiB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBGb3J0cmFuCisjIHNvdXJjZXMuIERveHlnZW4gd2lsbCB0aGVuIGdlbmVyYXRlIG91dHB1dCB0aGF0IGlzIHRhaWxvcmVkIGZvciBGb3J0cmFuLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK09QVElNSVpFX0ZPUl9GT1JUUkFOICAgPSBOTworCisjIFNldCB0aGUgT1BUSU1JWkVfT1VUUFVUX1ZIREwgdGFnIHRvIFlFUyBpZiB5b3VyIHByb2plY3QgY29uc2lzdHMgb2YgVkhETAorIyBzb3VyY2VzLiBEb3h5Z2VuIHdpbGwgdGhlbiBnZW5lcmF0ZSBvdXRwdXQgdGhhdCBpcyB0YWlsb3JlZCBmb3IgVkhETC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitPUFRJTUlaRV9PVVRQVVRfVkhETCAgID0gTk8KKworIyBEb3h5Z2VuIHNlbGVjdHMgdGhlIHBhcnNlciB0byB1c2UgZGVwZW5kaW5nIG9uIHRoZSBleHRlbnNpb24gb2YgdGhlIGZpbGVzIGl0CisjIHBhcnNlcy4gV2l0aCB0aGlzIHRhZyB5b3UgY2FuIGFzc2lnbiB3aGljaCBwYXJzZXIgdG8gdXNlIGZvciBhIGdpdmVuCisjIGV4dGVuc2lvbi4gRG94eWdlbiBoYXMgYSBidWlsdC1pbiBtYXBwaW5nLCBidXQgeW91IGNhbiBvdmVycmlkZSBvciBleHRlbmQgaXQKKyMgdXNpbmcgdGhpcyB0YWcuIFRoZSBmb3JtYXQgaXMgZXh0PWxhbmd1YWdlLCB3aGVyZSBleHQgaXMgYSBmaWxlIGV4dGVuc2lvbiwgYW5kCisjIGxhbmd1YWdlIGlzIG9uZSBvZiB0aGUgcGFyc2VycyBzdXBwb3J0ZWQgYnkgZG94eWdlbjogSURMLCBKYXZhLCBKYXZhc2NyaXB0LAorIyBDIywgQywgQysrLCBELCBQSFAsIE9iamVjdGl2ZS1DLCBQeXRob24sIEZvcnRyYW4sIFZIREwuIEZvciBpbnN0YW5jZSB0byBtYWtlCisjIGRveHlnZW4gdHJlYXQgLmluYyBmaWxlcyBhcyBGb3J0cmFuIGZpbGVzIChkZWZhdWx0IGlzIFBIUCksIGFuZCAuZiBmaWxlcyBhcyBDCisjIChkZWZhdWx0IGlzIEZvcnRyYW4pLCB1c2U6IGluYz1Gb3J0cmFuIGY9Qy4KKyMKKyMgTm90ZSBGb3IgZmlsZXMgd2l0aG91dCBleHRlbnNpb24geW91IGNhbiB1c2Ugbm9fZXh0ZW5zaW9uIGFzIGEgcGxhY2Vob2xkZXIuCisjCisjIE5vdGUgdGhhdCBmb3IgY3VzdG9tIGV4dGVuc2lvbnMgeW91IGFsc28gbmVlZCB0byBzZXQgRklMRV9QQVRURVJOUyBvdGhlcndpc2UKKyMgdGhlIGZpbGVzIGFyZSBub3QgcmVhZCBieSBkb3h5Z2VuLgorCitFWFRFTlNJT05fTUFQUElORyAgICAgID0gCisKKyMgSWYgdGhlIE1BUktET1dOX1NVUFBPUlQgdGFnIGlzIGVuYWJsZWQgdGhlbiBkb3h5Z2VuIHByZS1wcm9jZXNzZXMgYWxsIGNvbW1lbnRzCisjIGFjY29yZGluZyB0byB0aGUgTWFya2Rvd24gZm9ybWF0LCB3aGljaCBhbGxvd3MgZm9yIG1vcmUgcmVhZGFibGUKKyMgZG9jdW1lbnRhdGlvbi4gU2VlIGh0dHA6Ly9kYXJpbmdmaXJlYmFsbC5uZXQvcHJvamVjdHMvbWFya2Rvd24vIGZvciBkZXRhaWxzLgorIyBUaGUgb3V0cHV0IG9mIG1hcmtkb3duIHByb2Nlc3NpbmcgaXMgZnVydGhlciBwcm9jZXNzZWQgYnkgZG94eWdlbiwgc28geW91IGNhbgorIyBtaXggZG94eWdlbiwgSFRNTCwgYW5kIFhNTCBjb21tYW5kcyB3aXRoIE1hcmtkb3duIGZvcm1hdHRpbmcuIERpc2FibGUgb25seSBpbgorIyBjYXNlIG9mIGJhY2t3YXJkIGNvbXBhdGliaWxpdGllcyBpc3N1ZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK01BUktET1dOX1NVUFBPUlQgICAgICAgPSBZRVMKKworIyBXaGVuIGVuYWJsZWQgZG94eWdlbiB0cmllcyB0byBsaW5rIHdvcmRzIHRoYXQgY29ycmVzcG9uZCB0byBkb2N1bWVudGVkCisjIGNsYXNzZXMsIG9yIG5hbWVzcGFjZXMgdG8gdGhlaXIgY29ycmVzcG9uZGluZyBkb2N1bWVudGF0aW9uLiBTdWNoIGEgbGluayBjYW4KKyMgYmUgcHJldmVudGVkIGluIGluZGl2aWR1YWwgY2FzZXMgYnkgYnkgcHV0dGluZyBhICUgc2lnbiBpbiBmcm9udCBvZiB0aGUgd29yZAorIyBvciBnbG9iYWxseSBieSBzZXR0aW5nIEFVVE9MSU5LX1NVUFBPUlQgdG8gTk8uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0FVVE9MSU5LX1NVUFBPUlQgICAgICAgPSBZRVMKKworIyBJZiB5b3UgdXNlIFNUTCBjbGFzc2VzIChpLmUuIHN0ZDo6c3RyaW5nLCBzdGQ6OnZlY3RvciwgZXRjLikgYnV0IGRvIG5vdCB3YW50CisjIHRvIGluY2x1ZGUgKGEgdGFnIGZpbGUgZm9yKSB0aGUgU1RMIHNvdXJjZXMgYXMgaW5wdXQsIHRoZW4geW91IHNob3VsZCBzZXQgdGhpcworIyB0YWcgdG8gWUVTIGluIG9yZGVyIHRvIGxldCBkb3h5Z2VuIG1hdGNoIGZ1bmN0aW9ucyBkZWNsYXJhdGlvbnMgYW5kCisjIGRlZmluaXRpb25zIHdob3NlIGFyZ3VtZW50cyBjb250YWluIFNUTCBjbGFzc2VzIChlLmcuIGZ1bmMoc3RkOjpzdHJpbmcpOworIyB2ZXJzdXMgZnVuYyhzdGQ6OnN0cmluZykge30pLiBUaGlzIGFsc28gbWFrZSB0aGUgaW5oZXJpdGFuY2UgYW5kIGNvbGxhYm9yYXRpb24KKyMgZGlhZ3JhbXMgdGhhdCBpbnZvbHZlIFNUTCBjbGFzc2VzIG1vcmUgY29tcGxldGUgYW5kIGFjY3VyYXRlLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0JVSUxUSU5fU1RMX1NVUFBPUlQgICAgPSBOTworCisjIElmIHlvdSB1c2UgTWljcm9zb2Z0J3MgQysrL0NMSSBsYW5ndWFnZSwgeW91IHNob3VsZCBzZXQgdGhpcyBvcHRpb24gdG8gWUVTIHRvCisjIGVuYWJsZSBwYXJzaW5nIHN1cHBvcnQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworQ1BQX0NMSV9TVVBQT1JUICAgICAgICA9IE5PCisKKyMgU2V0IHRoZSBTSVBfU1VQUE9SVCB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBzaXAgKHNlZToKKyMgaHR0cDovL3d3dy5yaXZlcmJhbmtjb21wdXRpbmcuY28udWsvc29mdHdhcmUvc2lwL2ludHJvKSBzb3VyY2VzIG9ubHkuIERveHlnZW4KKyMgd2lsbCBwYXJzZSB0aGVtIGxpa2Ugbm9ybWFsIEMrKyBidXQgd2lsbCBhc3N1bWUgYWxsIGNsYXNzZXMgdXNlIHB1YmxpYyBpbnN0ZWFkCisjIG9mIHByaXZhdGUgaW5oZXJpdGFuY2Ugd2hlbiBubyBleHBsaWNpdCBwcm90ZWN0aW9uIGtleXdvcmQgaXMgcHJlc2VudC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitTSVBfU1VQUE9SVCAgICAgICAgICAgID0gTk8KKworIyBGb3IgTWljcm9zb2Z0J3MgSURMIHRoZXJlIGFyZSBwcm9wZ2V0IGFuZCBwcm9wcHV0IGF0dHJpYnV0ZXMgdG8gaW5kaWNhdGUKKyMgZ2V0dGVyIGFuZCBzZXR0ZXIgbWV0aG9kcyBmb3IgYSBwcm9wZXJ0eS4gU2V0dGluZyB0aGlzIG9wdGlvbiB0byBZRVMgd2lsbCBtYWtlCisjIGRveHlnZW4gdG8gcmVwbGFjZSB0aGUgZ2V0IGFuZCBzZXQgbWV0aG9kcyBieSBhIHByb3BlcnR5IGluIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGlzIHdpbGwgb25seSB3b3JrIGlmIHRoZSBtZXRob2RzIGFyZSBpbmRlZWQgZ2V0dGluZyBvciBzZXR0aW5nIGEgc2ltcGxlCisjIHR5cGUuIElmIHRoaXMgaXMgbm90IHRoZSBjYXNlLCBvciB5b3Ugd2FudCB0byBzaG93IHRoZSBtZXRob2RzIGFueXdheSwgeW91CisjIHNob3VsZCBzZXQgdGhpcyBvcHRpb24gdG8gTk8uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0lETF9QUk9QRVJUWV9TVVBQT1JUICAgPSBZRVMKKworIyBJZiBtZW1iZXIgZ3JvdXBpbmcgaXMgdXNlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQgdGhlIERJU1RSSUJVVEVfR1JPVVBfRE9DCisjIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGVuIGRveHlnZW4gd2lsbCByZXVzZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgZmlyc3QKKyMgbWVtYmVyIGluIHRoZSBncm91cCAoaWYgYW55KSBmb3IgdGhlIG90aGVyIG1lbWJlcnMgb2YgdGhlIGdyb3VwLiBCeSBkZWZhdWx0CisjIGFsbCBtZW1iZXJzIG9mIGEgZ3JvdXAgbXVzdCBiZSBkb2N1bWVudGVkIGV4cGxpY2l0bHkuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworRElTVFJJQlVURV9HUk9VUF9ET0MgICA9IE5PCisKKyMgU2V0IHRoZSBTVUJHUk9VUElORyB0YWcgdG8gWUVTIHRvIGFsbG93IGNsYXNzIG1lbWJlciBncm91cHMgb2YgdGhlIHNhbWUgdHlwZQorIyAoZm9yIGluc3RhbmNlIGEgZ3JvdXAgb2YgcHVibGljIGZ1bmN0aW9ucykgdG8gYmUgcHV0IGFzIGEgc3ViZ3JvdXAgb2YgdGhhdAorIyB0eXBlIChlLmcuIHVuZGVyIHRoZSBQdWJsaWMgRnVuY3Rpb25zIHNlY3Rpb24pLiBTZXQgaXQgdG8gTk8gdG8gcHJldmVudAorIyBzdWJncm91cGluZy4gQWx0ZXJuYXRpdmVseSwgdGhpcyBjYW4gYmUgZG9uZSBwZXIgY2xhc3MgdXNpbmcgdGhlCisjIFxub3N1Ymdyb3VwaW5nIGNvbW1hbmQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK1NVQkdST1VQSU5HICAgICAgICAgICAgPSBZRVMKKworIyBXaGVuIHRoZSBJTkxJTkVfR1JPVVBFRF9DTEFTU0VTIHRhZyBpcyBzZXQgdG8gWUVTLCBjbGFzc2VzLCBzdHJ1Y3RzIGFuZCB1bmlvbnMKKyMgYXJlIHNob3duIGluc2lkZSB0aGUgZ3JvdXAgaW4gd2hpY2ggdGhleSBhcmUgaW5jbHVkZWQgKGUuZy4gdXNpbmcgXGluZ3JvdXApCisjIGluc3RlYWQgb2Ygb24gYSBzZXBhcmF0ZSBwYWdlIChmb3IgSFRNTCBhbmQgTWFuIHBhZ2VzKSBvciBzZWN0aW9uIChmb3IgTGFUZVgKKyMgYW5kIFJURikuCisjCisjIE5vdGUgdGhhdCB0aGlzIGZlYXR1cmUgZG9lcyBub3Qgd29yayBpbiBjb21iaW5hdGlvbiB3aXRoCisjIFNFUEFSQVRFX01FTUJFUl9QQUdFUy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitJTkxJTkVfR1JPVVBFRF9DTEFTU0VTID0gTk8KKworIyBXaGVuIHRoZSBJTkxJTkVfU0lNUExFX1NUUlVDVFMgdGFnIGlzIHNldCB0byBZRVMsIHN0cnVjdHMsIGNsYXNzZXMsIGFuZCB1bmlvbnMKKyMgd2l0aCBvbmx5IHB1YmxpYyBkYXRhIGZpZWxkcyBvciBzaW1wbGUgdHlwZWRlZiBmaWVsZHMgd2lsbCBiZSBzaG93biBpbmxpbmUgaW4KKyMgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIHNjb3BlIGluIHdoaWNoIHRoZXkgYXJlIGRlZmluZWQgKGkuZS4gZmlsZSwKKyMgbmFtZXNwYWNlLCBvciBncm91cCBkb2N1bWVudGF0aW9uKSwgcHJvdmlkZWQgdGhpcyBzY29wZSBpcyBkb2N1bWVudGVkLiBJZiBzZXQKKyMgdG8gTk8sIHN0cnVjdHMsIGNsYXNzZXMsIGFuZCB1bmlvbnMgYXJlIHNob3duIG9uIGEgc2VwYXJhdGUgcGFnZSAoZm9yIEhUTUwgYW5kCisjIE1hbiBwYWdlcykgb3Igc2VjdGlvbiAoZm9yIExhVGVYIGFuZCBSVEYpLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0lOTElORV9TSU1QTEVfU1RSVUNUUyAgPSBOTworCisjIFdoZW4gVFlQRURFRl9ISURFU19TVFJVQ1QgdGFnIGlzIGVuYWJsZWQsIGEgdHlwZWRlZiBvZiBhIHN0cnVjdCwgdW5pb24sIG9yCisjIGVudW0gaXMgZG9jdW1lbnRlZCBhcyBzdHJ1Y3QsIHVuaW9uLCBvciBlbnVtIHdpdGggdGhlIG5hbWUgb2YgdGhlIHR5cGVkZWYuIFNvCisjIHR5cGVkZWYgc3RydWN0IFR5cGVTIHt9IFR5cGVULCB3aWxsIGFwcGVhciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhcyBhIHN0cnVjdAorIyB3aXRoIG5hbWUgVHlwZVQuIFdoZW4gZGlzYWJsZWQgdGhlIHR5cGVkZWYgd2lsbCBhcHBlYXIgYXMgYSBtZW1iZXIgb2YgYSBmaWxlLAorIyBuYW1lc3BhY2UsIG9yIGNsYXNzLiBBbmQgdGhlIHN0cnVjdCB3aWxsIGJlIG5hbWVkIFR5cGVTLiBUaGlzIGNhbiB0eXBpY2FsbHkgYmUKKyMgdXNlZnVsIGZvciBDIGNvZGUgaW4gY2FzZSB0aGUgY29kaW5nIGNvbnZlbnRpb24gZGljdGF0ZXMgdGhhdCBhbGwgY29tcG91bmQKKyMgdHlwZXMgYXJlIHR5cGVkZWYnZWQgYW5kIG9ubHkgdGhlIHR5cGVkZWYgaXMgcmVmZXJlbmNlZCwgbmV2ZXIgdGhlIHRhZyBuYW1lLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1RZUEVERUZfSElERVNfU1RSVUNUICAgPSBOTworCisjIFRoZSBzaXplIG9mIHRoZSBzeW1ib2wgbG9va3VwIGNhY2hlIGNhbiBiZSBzZXQgdXNpbmcgTE9PS1VQX0NBQ0hFX1NJWkUuIFRoaXMKKyMgY2FjaGUgaXMgdXNlZCB0byByZXNvbHZlIHN5bWJvbHMgZ2l2ZW4gdGhlaXIgbmFtZSBhbmQgc2NvcGUuIFNpbmNlIHRoaXMgY2FuIGJlCisjIGFuIGV4cGVuc2l2ZSBwcm9jZXNzIGFuZCBvZnRlbiB0aGUgc2FtZSBzeW1ib2wgYXBwZWFycyBtdWx0aXBsZSB0aW1lcyBpbiB0aGUKKyMgY29kZSwgZG94eWdlbiBrZWVwcyBhIGNhY2hlIG9mIHByZS1yZXNvbHZlZCBzeW1ib2xzLiBJZiB0aGUgY2FjaGUgaXMgdG9vIHNtYWxsCisjIGRveHlnZW4gd2lsbCBiZWNvbWUgc2xvd2VyLiBJZiB0aGUgY2FjaGUgaXMgdG9vIGxhcmdlLCBtZW1vcnkgaXMgd2FzdGVkLiBUaGUKKyMgY2FjaGUgc2l6ZSBpcyBnaXZlbiBieSB0aGlzIGZvcm11bGE6IDJeKDE2K0xPT0tVUF9DQUNIRV9TSVpFKS4gVGhlIHZhbGlkIHJhbmdlCisjIGlzIDAuLjksIHRoZSBkZWZhdWx0IGlzIDAsIGNvcnJlc3BvbmRpbmcgdG8gYSBjYWNoZSBzaXplIG9mIDJeMTY9NjU1MzYKKyMgc3ltYm9scy4gQXQgdGhlIGVuZCBvZiBhIHJ1biBkb3h5Z2VuIHdpbGwgcmVwb3J0IHRoZSBjYWNoZSB1c2FnZSBhbmQgc3VnZ2VzdAorIyB0aGUgb3B0aW1hbCBjYWNoZSBzaXplIGZyb20gYSBzcGVlZCBwb2ludCBvZiB2aWV3LgorIyBNaW5pbXVtIHZhbHVlOiAwLCBtYXhpbXVtIHZhbHVlOiA5LCBkZWZhdWx0IHZhbHVlOiAwLgorCitMT09LVVBfQ0FDSEVfU0laRSAgICAgID0gMAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEJ1aWxkIHJlbGF0ZWQgY29uZmlndXJhdGlvbiBvcHRpb25zCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEVYVFJBQ1RfQUxMIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBhc3N1bWUgYWxsIGVudGl0aWVzIGluCisjIGRvY3VtZW50YXRpb24gYXJlIGRvY3VtZW50ZWQsIGV2ZW4gaWYgbm8gZG9jdW1lbnRhdGlvbiB3YXMgYXZhaWxhYmxlLiBQcml2YXRlCisjIGNsYXNzIG1lbWJlcnMgYW5kIHN0YXRpYyBmaWxlIG1lbWJlcnMgd2lsbCBiZSBoaWRkZW4gdW5sZXNzIHRoZQorIyBFWFRSQUNUX1BSSVZBVEUgcmVzcGVjdGl2ZWx5IEVYVFJBQ1RfU1RBVElDIHRhZ3MgYXJlIHNldCB0byBZRVMuCisjIE5vdGU6IFRoaXMgd2lsbCBhbHNvIGRpc2FibGUgdGhlIHdhcm5pbmdzIGFib3V0IHVuZG9jdW1lbnRlZCBtZW1iZXJzIHRoYXQgYXJlCisjIG5vcm1hbGx5IHByb2R1Y2VkIHdoZW4gV0FSTklOR1MgaXMgc2V0IHRvIFlFUy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitFWFRSQUNUX0FMTCAgICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIEVYVFJBQ1RfUFJJVkFURSB0YWcgaXMgc2V0IHRvIFlFUyBhbGwgcHJpdmF0ZSBtZW1iZXJzIG9mIGEgY2xhc3Mgd2lsbAorIyBiZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitFWFRSQUNUX1BSSVZBVEUgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIEVYVFJBQ1RfUEFDS0FHRSB0YWcgaXMgc2V0IHRvIFlFUyBhbGwgbWVtYmVycyB3aXRoIHBhY2thZ2Ugb3IgaW50ZXJuYWwKKyMgc2NvcGUgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitFWFRSQUNUX1BBQ0tBR0UgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIEVYVFJBQ1RfU1RBVElDIHRhZyBpcyBzZXQgdG8gWUVTIGFsbCBzdGF0aWMgbWVtYmVycyBvZiBhIGZpbGUgd2lsbCBiZQorIyBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitFWFRSQUNUX1NUQVRJQyAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIEVYVFJBQ1RfTE9DQUxfQ0xBU1NFUyB0YWcgaXMgc2V0IHRvIFlFUyBjbGFzc2VzIChhbmQgc3RydWN0cykgZGVmaW5lZAorIyBsb2NhbGx5IGluIHNvdXJjZSBmaWxlcyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLiBJZiBzZXQgdG8gTk8KKyMgb25seSBjbGFzc2VzIGRlZmluZWQgaW4gaGVhZGVyIGZpbGVzIGFyZSBpbmNsdWRlZC4gRG9lcyBub3QgaGF2ZSBhbnkgZWZmZWN0CisjIGZvciBKYXZhIHNvdXJjZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0VYVFJBQ1RfTE9DQUxfQ0xBU1NFUyAgPSBZRVMKKworIyBUaGlzIGZsYWcgaXMgb25seSB1c2VmdWwgZm9yIE9iamVjdGl2ZS1DIGNvZGUuIFdoZW4gc2V0IHRvIFlFUyBsb2NhbCBtZXRob2RzLAorIyB3aGljaCBhcmUgZGVmaW5lZCBpbiB0aGUgaW1wbGVtZW50YXRpb24gc2VjdGlvbiBidXQgbm90IGluIHRoZSBpbnRlcmZhY2UgYXJlCisjIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLiBJZiBzZXQgdG8gTk8gb25seSBtZXRob2RzIGluIHRoZSBpbnRlcmZhY2UgYXJlCisjIGluY2x1ZGVkLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0VYVFJBQ1RfTE9DQUxfTUVUSE9EUyAgPSBOTworCisjIElmIHRoaXMgZmxhZyBpcyBzZXQgdG8gWUVTLCB0aGUgbWVtYmVycyBvZiBhbm9ueW1vdXMgbmFtZXNwYWNlcyB3aWxsIGJlCisjIGV4dHJhY3RlZCBhbmQgYXBwZWFyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFzIGEgbmFtZXNwYWNlIGNhbGxlZAorIyAnYW5vbnltb3VzX25hbWVzcGFjZXtmaWxlfScsIHdoZXJlIGZpbGUgd2lsbCBiZSByZXBsYWNlZCB3aXRoIHRoZSBiYXNlIG5hbWUgb2YKKyMgdGhlIGZpbGUgdGhhdCBjb250YWlucyB0aGUgYW5vbnltb3VzIG5hbWVzcGFjZS4gQnkgZGVmYXVsdCBhbm9ueW1vdXMgbmFtZXNwYWNlCisjIGFyZSBoaWRkZW4uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworRVhUUkFDVF9BTk9OX05TUEFDRVMgICA9IE5PCisKKyMgSWYgdGhlIEhJREVfVU5ET0NfTUVNQkVSUyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGhpZGUgYWxsCisjIHVuZG9jdW1lbnRlZCBtZW1iZXJzIGluc2lkZSBkb2N1bWVudGVkIGNsYXNzZXMgb3IgZmlsZXMuIElmIHNldCB0byBOTyB0aGVzZQorIyBtZW1iZXJzIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIHZhcmlvdXMgb3ZlcnZpZXdzLCBidXQgbm8gZG9jdW1lbnRhdGlvbgorIyBzZWN0aW9uIGlzIGdlbmVyYXRlZC4gVGhpcyBvcHRpb24gaGFzIG5vIGVmZmVjdCBpZiBFWFRSQUNUX0FMTCBpcyBlbmFibGVkLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0hJREVfVU5ET0NfTUVNQkVSUyAgICAgPSBOTworCisjIElmIHRoZSBISURFX1VORE9DX0NMQVNTRVMgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBoaWRlIGFsbAorIyB1bmRvY3VtZW50ZWQgY2xhc3NlcyB0aGF0IGFyZSBub3JtYWxseSB2aXNpYmxlIGluIHRoZSBjbGFzcyBoaWVyYXJjaHkuIElmIHNldAorIyB0byBOTyB0aGVzZSBjbGFzc2VzIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIHZhcmlvdXMgb3ZlcnZpZXdzLiBUaGlzIG9wdGlvbiBoYXMKKyMgbm8gZWZmZWN0IGlmIEVYVFJBQ1RfQUxMIGlzIGVuYWJsZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworSElERV9VTkRPQ19DTEFTU0VTICAgICA9IE5PCisKKyMgSWYgdGhlIEhJREVfRlJJRU5EX0NPTVBPVU5EUyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGhpZGUgYWxsIGZyaWVuZAorIyAoY2xhc3N8c3RydWN0fHVuaW9uKSBkZWNsYXJhdGlvbnMuIElmIHNldCB0byBOTyB0aGVzZSBkZWNsYXJhdGlvbnMgd2lsbCBiZQorIyBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitISURFX0ZSSUVORF9DT01QT1VORFMgID0gTk8KKworIyBJZiB0aGUgSElERV9JTl9CT0RZX0RPQ1MgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBoaWRlIGFueQorIyBkb2N1bWVudGF0aW9uIGJsb2NrcyBmb3VuZCBpbnNpZGUgdGhlIGJvZHkgb2YgYSBmdW5jdGlvbi4gSWYgc2V0IHRvIE5PIHRoZXNlCisjIGJsb2NrcyB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSBmdW5jdGlvbidzIGRldGFpbGVkIGRvY3VtZW50YXRpb24gYmxvY2suCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworSElERV9JTl9CT0RZX0RPQ1MgICAgICA9IE5PCisKKyMgVGhlIElOVEVSTkFMX0RPQ1MgdGFnIGRldGVybWluZXMgaWYgZG9jdW1lbnRhdGlvbiB0aGF0IGlzIHR5cGVkIGFmdGVyIGEKKyMgXGludGVybmFsIGNvbW1hbmQgaXMgaW5jbHVkZWQuIElmIHRoZSB0YWcgaXMgc2V0IHRvIE5PIHRoZW4gdGhlIGRvY3VtZW50YXRpb24KKyMgd2lsbCBiZSBleGNsdWRlZC4gU2V0IGl0IHRvIFlFUyB0byBpbmNsdWRlIHRoZSBpbnRlcm5hbCBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0lOVEVSTkFMX0RPQ1MgICAgICAgICAgPSBOTworCisjIElmIHRoZSBDQVNFX1NFTlNFX05BTUVTIHRhZyBpcyBzZXQgdG8gTk8gdGhlbiBkb3h5Z2VuIHdpbGwgb25seSBnZW5lcmF0ZSBmaWxlCisjIG5hbWVzIGluIGxvd2VyLWNhc2UgbGV0dGVycy4gSWYgc2V0IHRvIFlFUyB1cHBlci1jYXNlIGxldHRlcnMgYXJlIGFsc28KKyMgYWxsb3dlZC4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IGhhdmUgY2xhc3NlcyBvciBmaWxlcyB3aG9zZSBuYW1lcyBvbmx5IGRpZmZlcgorIyBpbiBjYXNlIGFuZCBpZiB5b3VyIGZpbGUgc3lzdGVtIHN1cHBvcnRzIGNhc2Ugc2Vuc2l0aXZlIGZpbGUgbmFtZXMuIFdpbmRvd3MKKyMgYW5kIE1hYyB1c2VycyBhcmUgYWR2aXNlZCB0byBzZXQgdGhpcyBvcHRpb24gdG8gTk8uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBzeXN0ZW0gZGVwZW5kZW50LgorCitDQVNFX1NFTlNFX05BTUVTICAgICAgID0gTk8KKworIyBJZiB0aGUgSElERV9TQ09QRV9OQU1FUyB0YWcgaXMgc2V0IHRvIE5PIHRoZW4gZG94eWdlbiB3aWxsIHNob3cgbWVtYmVycyB3aXRoCisjIHRoZWlyIGZ1bGwgY2xhc3MgYW5kIG5hbWVzcGFjZSBzY29wZXMgaW4gdGhlIGRvY3VtZW50YXRpb24uIElmIHNldCB0byBZRVMgdGhlCisjIHNjb3BlIHdpbGwgYmUgaGlkZGVuLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0hJREVfU0NPUEVfTkFNRVMgICAgICAgPSBOTworCisjIElmIHRoZSBTSE9XX0lOQ0xVREVfRklMRVMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgcHV0IGEgbGlzdCBvZgorIyB0aGUgZmlsZXMgdGhhdCBhcmUgaW5jbHVkZWQgYnkgYSBmaWxlIGluIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoYXQgZmlsZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworU0hPV19JTkNMVURFX0ZJTEVTICAgICA9IFlFUworCisKK1NIT1dfR1JPVVBFRF9NRU1CX0lOQyAgPSBOTworCisjIElmIHRoZSBGT1JDRV9MT0NBTF9JTkNMVURFUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBsaXN0IGluY2x1ZGUKKyMgZmlsZXMgd2l0aCBkb3VibGUgcXVvdGVzIGluIHRoZSBkb2N1bWVudGF0aW9uIHJhdGhlciB0aGFuIHdpdGggc2hhcnAgYnJhY2tldHMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworRk9SQ0VfTE9DQUxfSU5DTFVERVMgICA9IE5PCisKKyMgSWYgdGhlIElOTElORV9JTkZPIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gYSB0YWcgW2lubGluZV0gaXMgaW5zZXJ0ZWQgaW4gdGhlCisjIGRvY3VtZW50YXRpb24gZm9yIGlubGluZSBtZW1iZXJzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitJTkxJTkVfSU5GTyAgICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIFNPUlRfTUVNQkVSX0RPQ1MgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgc29ydCB0aGUKKyMgKGRldGFpbGVkKSBkb2N1bWVudGF0aW9uIG9mIGZpbGUgYW5kIGNsYXNzIG1lbWJlcnMgYWxwaGFiZXRpY2FsbHkgYnkgbWVtYmVyCisjIG5hbWUuIElmIHNldCB0byBOTyB0aGUgbWVtYmVycyB3aWxsIGFwcGVhciBpbiBkZWNsYXJhdGlvbiBvcmRlci4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworU09SVF9NRU1CRVJfRE9DUyAgICAgICA9IFlFUworCisjIElmIHRoZSBTT1JUX0JSSUVGX0RPQ1MgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgc29ydCB0aGUgYnJpZWYKKyMgZGVzY3JpcHRpb25zIG9mIGZpbGUsIG5hbWVzcGFjZSBhbmQgY2xhc3MgbWVtYmVycyBhbHBoYWJldGljYWxseSBieSBtZW1iZXIKKyMgbmFtZS4gSWYgc2V0IHRvIE5PIHRoZSBtZW1iZXJzIHdpbGwgYXBwZWFyIGluIGRlY2xhcmF0aW9uIG9yZGVyLiBOb3RlIHRoYXQKKyMgdGhpcyB3aWxsIGFsc28gaW5mbHVlbmNlIHRoZSBvcmRlciBvZiB0aGUgY2xhc3NlcyBpbiB0aGUgY2xhc3MgbGlzdC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitTT1JUX0JSSUVGX0RPQ1MgICAgICAgID0gTk8KKworIyBJZiB0aGUgU09SVF9NRU1CRVJTX0NUT1JTXzFTVCB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBzb3J0IHRoZQorIyAoYnJpZWYgYW5kIGRldGFpbGVkKSBkb2N1bWVudGF0aW9uIG9mIGNsYXNzIG1lbWJlcnMgc28gdGhhdCBjb25zdHJ1Y3RvcnMgYW5kCisjIGRlc3RydWN0b3JzIGFyZSBsaXN0ZWQgZmlyc3QuIElmIHNldCB0byBOTyB0aGUgY29uc3RydWN0b3JzIHdpbGwgYXBwZWFyIGluIHRoZQorIyByZXNwZWN0aXZlIG9yZGVycyBkZWZpbmVkIGJ5IFNPUlRfQlJJRUZfRE9DUyBhbmQgU09SVF9NRU1CRVJfRE9DUy4KKyMgTm90ZTogSWYgU09SVF9CUklFRl9ET0NTIGlzIHNldCB0byBOTyB0aGlzIG9wdGlvbiBpcyBpZ25vcmVkIGZvciBzb3J0aW5nIGJyaWVmCisjIG1lbWJlciBkb2N1bWVudGF0aW9uLgorIyBOb3RlOiBJZiBTT1JUX01FTUJFUl9ET0NTIGlzIHNldCB0byBOTyB0aGlzIG9wdGlvbiBpcyBpZ25vcmVkIGZvciBzb3J0aW5nCisjIGRldGFpbGVkIG1lbWJlciBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1NPUlRfTUVNQkVSU19DVE9SU18xU1QgPSBOTworCisjIElmIHRoZSBTT1JUX0dST1VQX05BTUVTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIHNvcnQgdGhlIGhpZXJhcmNoeQorIyBvZiBncm91cCBuYW1lcyBpbnRvIGFscGhhYmV0aWNhbCBvcmRlci4gSWYgc2V0IHRvIE5PIHRoZSBncm91cCBuYW1lcyB3aWxsCisjIGFwcGVhciBpbiB0aGVpciBkZWZpbmVkIG9yZGVyLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1NPUlRfR1JPVVBfTkFNRVMgICAgICAgPSBOTworCisjIElmIHRoZSBTT1JUX0JZX1NDT1BFX05BTUUgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBjbGFzcyBsaXN0IHdpbGwgYmUgc29ydGVkIGJ5CisjIGZ1bGx5LXF1YWxpZmllZCBuYW1lcywgaW5jbHVkaW5nIG5hbWVzcGFjZXMuIElmIHNldCB0byBOTywgdGhlIGNsYXNzIGxpc3Qgd2lsbAorIyBiZSBzb3J0ZWQgb25seSBieSBjbGFzcyBuYW1lLCBub3QgaW5jbHVkaW5nIHRoZSBuYW1lc3BhY2UgcGFydC4KKyMgTm90ZTogVGhpcyBvcHRpb24gaXMgbm90IHZlcnkgdXNlZnVsIGlmIEhJREVfU0NPUEVfTkFNRVMgaXMgc2V0IHRvIFlFUy4KKyMgTm90ZTogVGhpcyBvcHRpb24gYXBwbGllcyBvbmx5IHRvIHRoZSBjbGFzcyBsaXN0LCBub3QgdG8gdGhlIGFscGhhYmV0aWNhbAorIyBsaXN0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1NPUlRfQllfU0NPUEVfTkFNRSAgICAgPSBOTworCisjIElmIHRoZSBTVFJJQ1RfUFJPVE9fTUFUQ0hJTkcgb3B0aW9uIGlzIGVuYWJsZWQgYW5kIGRveHlnZW4gZmFpbHMgdG8gZG8gcHJvcGVyCisjIHR5cGUgcmVzb2x1dGlvbiBvZiBhbGwgcGFyYW1ldGVycyBvZiBhIGZ1bmN0aW9uIGl0IHdpbGwgcmVqZWN0IGEgbWF0Y2ggYmV0d2VlbgorIyB0aGUgcHJvdG90eXBlIGFuZCB0aGUgaW1wbGVtZW50YXRpb24gb2YgYSBtZW1iZXIgZnVuY3Rpb24gZXZlbiBpZiB0aGVyZSBpcworIyBvbmx5IG9uZSBjYW5kaWRhdGUgb3IgaXQgaXMgb2J2aW91cyB3aGljaCBjYW5kaWRhdGUgdG8gY2hvb3NlIGJ5IGRvaW5nIGEKKyMgc2ltcGxlIHN0cmluZyBtYXRjaC4gQnkgZGlzYWJsaW5nIFNUUklDVF9QUk9UT19NQVRDSElORyBkb3h5Z2VuIHdpbGwgc3RpbGwKKyMgYWNjZXB0IGEgbWF0Y2ggYmV0d2VlbiBwcm90b3R5cGUgYW5kIGltcGxlbWVudGF0aW9uIGluIHN1Y2ggY2FzZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworU1RSSUNUX1BST1RPX01BVENISU5HICA9IE5PCisKKyMgVGhlIEdFTkVSQVRFX1RPRE9MSVNUIHRhZyBjYW4gYmUgdXNlZCB0byBlbmFibGUgKCBZRVMpIG9yIGRpc2FibGUgKCBOTykgdGhlCisjIHRvZG8gbGlzdC4gVGhpcyBsaXN0IGlzIGNyZWF0ZWQgYnkgcHV0dGluZyBcdG9kbyBjb21tYW5kcyBpbiB0aGUKKyMgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworR0VORVJBVEVfVE9ET0xJU1QgICAgICA9IFlFUworCisjIFRoZSBHRU5FUkFURV9URVNUTElTVCB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlICggWUVTKSBvciBkaXNhYmxlICggTk8pIHRoZQorIyB0ZXN0IGxpc3QuIFRoaXMgbGlzdCBpcyBjcmVhdGVkIGJ5IHB1dHRpbmcgXHRlc3QgY29tbWFuZHMgaW4gdGhlCisjIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0dFTkVSQVRFX1RFU1RMSVNUICAgICAgPSBZRVMKKworIyBUaGUgR0VORVJBVEVfQlVHTElTVCB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlICggWUVTKSBvciBkaXNhYmxlICggTk8pIHRoZSBidWcKKyMgbGlzdC4gVGhpcyBsaXN0IGlzIGNyZWF0ZWQgYnkgcHV0dGluZyBcYnVnIGNvbW1hbmRzIGluIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitHRU5FUkFURV9CVUdMSVNUICAgICAgID0gWUVTCisKKyMgVGhlIEdFTkVSQVRFX0RFUFJFQ0FURURMSVNUIHRhZyBjYW4gYmUgdXNlZCB0byBlbmFibGUgKCBZRVMpIG9yIGRpc2FibGUgKCBOTykKKyMgdGhlIGRlcHJlY2F0ZWQgbGlzdC4gVGhpcyBsaXN0IGlzIGNyZWF0ZWQgYnkgcHV0dGluZyBcZGVwcmVjYXRlZCBjb21tYW5kcyBpbgorIyB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworR0VORVJBVEVfREVQUkVDQVRFRExJU1Q9IFlFUworCisjIFRoZSBFTkFCTEVEX1NFQ1RJT05TIHRhZyBjYW4gYmUgdXNlZCB0byBlbmFibGUgY29uZGl0aW9uYWwgZG9jdW1lbnRhdGlvbgorIyBzZWN0aW9ucywgbWFya2VkIGJ5IFxpZiA8c2VjdGlvbl9sYWJlbD4gLi4uIFxlbmRpZiBhbmQgXGNvbmQgPHNlY3Rpb25fbGFiZWw+CisjIC4uLiBcZW5kY29uZCBibG9ja3MuCisKK0VOQUJMRURfU0VDVElPTlMgICAgICAgPSAKKworIyBUaGUgTUFYX0lOSVRJQUxJWkVSX0xJTkVTIHRhZyBkZXRlcm1pbmVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0aGF0IHRoZQorIyBpbml0aWFsIHZhbHVlIG9mIGEgdmFyaWFibGUgb3IgbWFjcm8gLyBkZWZpbmUgY2FuIGhhdmUgZm9yIGl0IHRvIGFwcGVhciBpbiB0aGUKKyMgZG9jdW1lbnRhdGlvbi4gSWYgdGhlIGluaXRpYWxpemVyIGNvbnNpc3RzIG9mIG1vcmUgbGluZXMgdGhhbiBzcGVjaWZpZWQgaGVyZQorIyBpdCB3aWxsIGJlIGhpZGRlbi4gVXNlIGEgdmFsdWUgb2YgMCB0byBoaWRlIGluaXRpYWxpemVycyBjb21wbGV0ZWx5LiBUaGUKKyMgYXBwZWFyYW5jZSBvZiB0aGUgdmFsdWUgb2YgaW5kaXZpZHVhbCB2YXJpYWJsZXMgYW5kIG1hY3JvcyAvIGRlZmluZXMgY2FuIGJlCisjIGNvbnRyb2xsZWQgdXNpbmcgXHNob3dpbml0aWFsaXplciBvciBcaGlkZWluaXRpYWxpemVyIGNvbW1hbmQgaW4gdGhlCisjIGRvY3VtZW50YXRpb24gcmVnYXJkbGVzcyBvZiB0aGlzIHNldHRpbmcuCisjIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDEwMDAwLCBkZWZhdWx0IHZhbHVlOiAzMC4KKworTUFYX0lOSVRJQUxJWkVSX0xJTkVTICA9IDMwCisKKyMgU2V0IHRoZSBTSE9XX1VTRURfRklMRVMgdGFnIHRvIE5PIHRvIGRpc2FibGUgdGhlIGxpc3Qgb2YgZmlsZXMgZ2VuZXJhdGVkIGF0CisjIHRoZSBib3R0b20gb2YgdGhlIGRvY3VtZW50YXRpb24gb2YgY2xhc3NlcyBhbmQgc3RydWN0cy4gSWYgc2V0IHRvIFlFUyB0aGUgbGlzdAorIyB3aWxsIG1lbnRpb24gdGhlIGZpbGVzIHRoYXQgd2VyZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitTSE9XX1VTRURfRklMRVMgICAgICAgID0gWUVTCisKKyMgU2V0IHRoZSBTSE9XX0ZJTEVTIHRhZyB0byBOTyB0byBkaXNhYmxlIHRoZSBnZW5lcmF0aW9uIG9mIHRoZSBGaWxlcyBwYWdlLiBUaGlzCisjIHdpbGwgcmVtb3ZlIHRoZSBGaWxlcyBlbnRyeSBmcm9tIHRoZSBRdWljayBJbmRleCBhbmQgZnJvbSB0aGUgRm9sZGVyIFRyZWUgVmlldworIyAoaWYgc3BlY2lmaWVkKS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworU0hPV19GSUxFUyAgICAgICAgICAgICA9IFlFUworCisjIFNldCB0aGUgU0hPV19OQU1FU1BBQ0VTIHRhZyB0byBOTyB0byBkaXNhYmxlIHRoZSBnZW5lcmF0aW9uIG9mIHRoZSBOYW1lc3BhY2VzCisjIHBhZ2UuIFRoaXMgd2lsbCByZW1vdmUgdGhlIE5hbWVzcGFjZXMgZW50cnkgZnJvbSB0aGUgUXVpY2sgSW5kZXggYW5kIGZyb20gdGhlCisjIEZvbGRlciBUcmVlIFZpZXcgKGlmIHNwZWNpZmllZCkuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK1NIT1dfTkFNRVNQQUNFUyAgICAgICAgPSBZRVMKKworIyBUaGUgRklMRV9WRVJTSU9OX0ZJTFRFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHByb2dyYW0gb3Igc2NyaXB0IHRoYXQKKyMgZG94eWdlbiBzaG91bGQgaW52b2tlIHRvIGdldCB0aGUgY3VycmVudCB2ZXJzaW9uIGZvciBlYWNoIGZpbGUgKHR5cGljYWxseSBmcm9tCisjIHRoZSB2ZXJzaW9uIGNvbnRyb2wgc3lzdGVtKS4gRG94eWdlbiB3aWxsIGludm9rZSB0aGUgcHJvZ3JhbSBieSBleGVjdXRpbmcgKHZpYQorIyBwb3BlbigpKSB0aGUgY29tbWFuZCBjb21tYW5kIGlucHV0LWZpbGUsIHdoZXJlIGNvbW1hbmQgaXMgdGhlIHZhbHVlIG9mIHRoZQorIyBGSUxFX1ZFUlNJT05fRklMVEVSIHRhZywgYW5kIGlucHV0LWZpbGUgaXMgdGhlIG5hbWUgb2YgYW4gaW5wdXQgZmlsZSBwcm92aWRlZAorIyBieSBkb3h5Z2VuLiBXaGF0ZXZlciB0aGUgcHJvZ3JhbSB3cml0ZXMgdG8gc3RhbmRhcmQgb3V0cHV0IGlzIHVzZWQgYXMgdGhlIGZpbGUKKyMgdmVyc2lvbi4gRm9yIGFuIGV4YW1wbGUgc2VlIHRoZSBkb2N1bWVudGF0aW9uLgorCitGSUxFX1ZFUlNJT05fRklMVEVSICAgID0gCisKKyMgVGhlIExBWU9VVF9GSUxFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgbGF5b3V0IGZpbGUgd2hpY2ggd2lsbCBiZSBwYXJzZWQKKyMgYnkgZG94eWdlbi4gVGhlIGxheW91dCBmaWxlIGNvbnRyb2xzIHRoZSBnbG9iYWwgc3RydWN0dXJlIG9mIHRoZSBnZW5lcmF0ZWQKKyMgb3V0cHV0IGZpbGVzIGluIGFuIG91dHB1dCBmb3JtYXQgaW5kZXBlbmRlbnQgd2F5LiBUbyBjcmVhdGUgdGhlIGxheW91dCBmaWxlCisjIHRoYXQgcmVwcmVzZW50cyBkb3h5Z2VuJ3MgZGVmYXVsdHMsIHJ1biBkb3h5Z2VuIHdpdGggdGhlIC1sIG9wdGlvbi4gWW91IGNhbgorIyBvcHRpb25hbGx5IHNwZWNpZnkgYSBmaWxlIG5hbWUgYWZ0ZXIgdGhlIG9wdGlvbiwgaWYgb21pdHRlZCBEb3h5Z2VuTGF5b3V0LnhtbAorIyB3aWxsIGJlIHVzZWQgYXMgdGhlIG5hbWUgb2YgdGhlIGxheW91dCBmaWxlLgorIworIyBOb3RlIHRoYXQgaWYgeW91IHJ1biBkb3h5Z2VuIGZyb20gYSBkaXJlY3RvcnkgY29udGFpbmluZyBhIGZpbGUgY2FsbGVkCisjIERveHlnZW5MYXlvdXQueG1sLCBkb3h5Z2VuIHdpbGwgcGFyc2UgaXQgYXV0b21hdGljYWxseSBldmVuIGlmIHRoZSBMQVlPVVRfRklMRQorIyB0YWcgaXMgbGVmdCBlbXB0eS4KKworTEFZT1VUX0ZJTEUgICAgICAgICAgICA9IAorCisjIFRoZSBDSVRFX0JJQl9GSUxFUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBiaWIgZmlsZXMgY29udGFpbmluZworIyB0aGUgcmVmZXJlbmNlIGRlZmluaXRpb25zLiBUaGlzIG11c3QgYmUgYSBsaXN0IG9mIC5iaWIgZmlsZXMuIFRoZSAuYmliCisjIGV4dGVuc2lvbiBpcyBhdXRvbWF0aWNhbGx5IGFwcGVuZGVkIGlmIG9taXR0ZWQuIFRoaXMgcmVxdWlyZXMgdGhlIGJpYnRleCB0b29sCisjIHRvIGJlIGluc3RhbGxlZC4gU2VlIGFsc28gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CaWJUZVggZm9yIG1vcmUgaW5mby4KKyMgRm9yIExhVGVYIHRoZSBzdHlsZSBvZiB0aGUgYmlibGlvZ3JhcGh5IGNhbiBiZSBjb250cm9sbGVkIHVzaW5nCisjIExBVEVYX0JJQl9TVFlMRS4gVG8gdXNlIHRoaXMgZmVhdHVyZSB5b3UgbmVlZCBiaWJ0ZXggYW5kIHBlcmwgYXZhaWxhYmxlIGluIHRoZQorIyBzZWFyY2ggcGF0aC4gRG8gbm90IHVzZSBmaWxlIG5hbWVzIHdpdGggc3BhY2VzLCBiaWJ0ZXggY2Fubm90IGhhbmRsZSB0aGVtLiBTZWUKKyMgYWxzbyBcY2l0ZSBmb3IgaW5mbyBob3cgdG8gY3JlYXRlIHJlZmVyZW5jZXMuCisKK0NJVEVfQklCX0ZJTEVTICAgICAgICAgPSAKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB3YXJuaW5nIGFuZCBwcm9ncmVzcyBtZXNzYWdlcworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIFRoZSBRVUlFVCB0YWcgY2FuIGJlIHVzZWQgdG8gdHVybiBvbi9vZmYgdGhlIG1lc3NhZ2VzIHRoYXQgYXJlIGdlbmVyYXRlZCB0bworIyBzdGFuZGFyZCBvdXRwdXQgYnkgZG94eWdlbi4gSWYgUVVJRVQgaXMgc2V0IHRvIFlFUyB0aGlzIGltcGxpZXMgdGhhdCB0aGUKKyMgbWVzc2FnZXMgYXJlIG9mZi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitRVUlFVCAgICAgICAgICAgICAgICAgID0gTk8KKworIyBUaGUgV0FSTklOR1MgdGFnIGNhbiBiZSB1c2VkIHRvIHR1cm4gb24vb2ZmIHRoZSB3YXJuaW5nIG1lc3NhZ2VzIHRoYXQgYXJlCisjIGdlbmVyYXRlZCB0byBzdGFuZGFyZCBlcnJvciAoIHN0ZGVycikgYnkgZG94eWdlbi4gSWYgV0FSTklOR1MgaXMgc2V0IHRvIFlFUworIyB0aGlzIGltcGxpZXMgdGhhdCB0aGUgd2FybmluZ3MgYXJlIG9uLgorIworIyBUaXA6IFR1cm4gd2FybmluZ3Mgb24gd2hpbGUgd3JpdGluZyB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworV0FSTklOR1MgICAgICAgICAgICAgICA9IFlFUworCisjIElmIHRoZSBXQVJOX0lGX1VORE9DVU1FTlRFRCB0YWcgaXMgc2V0IHRvIFlFUywgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUKKyMgd2FybmluZ3MgZm9yIHVuZG9jdW1lbnRlZCBtZW1iZXJzLiBJZiBFWFRSQUNUX0FMTCBpcyBzZXQgdG8gWUVTIHRoZW4gdGhpcyBmbGFnCisjIHdpbGwgYXV0b21hdGljYWxseSBiZSBkaXNhYmxlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworV0FSTl9JRl9VTkRPQ1VNRU5URUQgICA9IFlFUworCisjIElmIHRoZSBXQVJOX0lGX0RPQ19FUlJPUiB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGdlbmVyYXRlIHdhcm5pbmdzIGZvcgorIyBwb3RlbnRpYWwgZXJyb3JzIGluIHRoZSBkb2N1bWVudGF0aW9uLCBzdWNoIGFzIG5vdCBkb2N1bWVudGluZyBzb21lIHBhcmFtZXRlcnMKKyMgaW4gYSBkb2N1bWVudGVkIGZ1bmN0aW9uLCBvciBkb2N1bWVudGluZyBwYXJhbWV0ZXJzIHRoYXQgZG9uJ3QgZXhpc3Qgb3IgdXNpbmcKKyMgbWFya3VwIGNvbW1hbmRzIHdyb25nbHkuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK1dBUk5fSUZfRE9DX0VSUk9SICAgICAgPSBZRVMKKworIyBUaGlzIFdBUk5fTk9fUEFSQU1ET0Mgb3B0aW9uIGNhbiBiZSBlbmFibGVkIHRvIGdldCB3YXJuaW5ncyBmb3IgZnVuY3Rpb25zIHRoYXQKKyMgYXJlIGRvY3VtZW50ZWQsIGJ1dCBoYXZlIG5vIGRvY3VtZW50YXRpb24gZm9yIHRoZWlyIHBhcmFtZXRlcnMgb3IgcmV0dXJuCisjIHZhbHVlLiBJZiBzZXQgdG8gTk8gZG94eWdlbiB3aWxsIG9ubHkgd2FybiBhYm91dCB3cm9uZyBvciBpbmNvbXBsZXRlIHBhcmFtZXRlcgorIyBkb2N1bWVudGF0aW9uLCBidXQgbm90IGFib3V0IHRoZSBhYnNlbmNlIG9mIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworV0FSTl9OT19QQVJBTURPQyAgICAgICA9IE5PCisKKyMgVGhlIFdBUk5fRk9STUFUIHRhZyBkZXRlcm1pbmVzIHRoZSBmb3JtYXQgb2YgdGhlIHdhcm5pbmcgbWVzc2FnZXMgdGhhdCBkb3h5Z2VuCisjIGNhbiBwcm9kdWNlLiBUaGUgc3RyaW5nIHNob3VsZCBjb250YWluIHRoZSAkZmlsZSwgJGxpbmUsIGFuZCAkdGV4dCB0YWdzLCB3aGljaAorIyB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSBmaWxlIGFuZCBsaW5lIG51bWJlciBmcm9tIHdoaWNoIHRoZSB3YXJuaW5nIG9yaWdpbmF0ZWQKKyMgYW5kIHRoZSB3YXJuaW5nIHRleHQuIE9wdGlvbmFsbHkgdGhlIGZvcm1hdCBtYXkgY29udGFpbiAkdmVyc2lvbiwgd2hpY2ggd2lsbAorIyBiZSByZXBsYWNlZCBieSB0aGUgdmVyc2lvbiBvZiB0aGUgZmlsZSAoaWYgaXQgY291bGQgYmUgb2J0YWluZWQgdmlhCisjIEZJTEVfVkVSU0lPTl9GSUxURVIpCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiAkZmlsZTokbGluZTogJHRleHQuCisKK1dBUk5fRk9STUFUICAgICAgICAgICAgPSAiJGZpbGU6JGxpbmU6ICR0ZXh0IgorCisjIFRoZSBXQVJOX0xPR0ZJTEUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBmaWxlIHRvIHdoaWNoIHdhcm5pbmcgYW5kIGVycm9yCisjIG1lc3NhZ2VzIHNob3VsZCBiZSB3cml0dGVuLiBJZiBsZWZ0IGJsYW5rIHRoZSBvdXRwdXQgaXMgd3JpdHRlbiB0byBzdGFuZGFyZAorIyBlcnJvciAoc3RkZXJyKS4KKworV0FSTl9MT0dGSUxFICAgICAgICAgICA9IAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBpbnB1dCBmaWxlcworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIFRoZSBJTlBVVCB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBmaWxlcyBhbmQvb3IgZGlyZWN0b3JpZXMgdGhhdCBjb250YWluCisjIGRvY3VtZW50ZWQgc291cmNlIGZpbGVzLiBZb3UgbWF5IGVudGVyIGZpbGUgbmFtZXMgbGlrZSBteWZpbGUuY3BwIG9yCisjIGRpcmVjdG9yaWVzIGxpa2UgL3Vzci9zcmMvbXlwcm9qZWN0LiBTZXBhcmF0ZSB0aGUgZmlsZXMgb3IgZGlyZWN0b3JpZXMgd2l0aAorIyBzcGFjZXMuCisjIE5vdGU6IElmIHRoaXMgdGFnIGlzIGVtcHR5IHRoZSBjdXJyZW50IGRpcmVjdG9yeSBpcyBzZWFyY2hlZC4KKworSU5QVVQgICAgICAgICAgICAgICAgICA9IHNyYworCisjIFRoaXMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGNoYXJhY3RlciBlbmNvZGluZyBvZiB0aGUgc291cmNlIGZpbGVzCisjIHRoYXQgZG94eWdlbiBwYXJzZXMuIEludGVybmFsbHkgZG94eWdlbiB1c2VzIHRoZSBVVEYtOCBlbmNvZGluZy4gRG94eWdlbiB1c2VzCisjIGxpYmljb252IChvciB0aGUgaWNvbnYgYnVpbHQgaW50byBsaWJjKSBmb3IgdGhlIHRyYW5zY29kaW5nLiBTZWUgdGhlIGxpYmljb252CisjIGRvY3VtZW50YXRpb24gKHNlZTogaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2xpYmljb252KSBmb3IgdGhlIGxpc3Qgb2YKKyMgcG9zc2libGUgZW5jb2RpbmdzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogVVRGLTguCisKK0lOUFVUX0VOQ09ESU5HICAgICAgICAgPSBVVEYtOAorCisjIElmIHRoZSB2YWx1ZSBvZiB0aGUgSU5QVVQgdGFnIGNvbnRhaW5zIGRpcmVjdG9yaWVzLCB5b3UgY2FuIHVzZSB0aGUKKyMgRklMRV9QQVRURVJOUyB0YWcgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSB3aWxkY2FyZCBwYXR0ZXJucyAobGlrZSAqLmNwcCBhbmQKKyMgKi5oKSB0byBmaWx0ZXIgb3V0IHRoZSBzb3VyY2UtZmlsZXMgaW4gdGhlIGRpcmVjdG9yaWVzLiBJZiBsZWZ0IGJsYW5rIHRoZQorIyBmb2xsb3dpbmcgcGF0dGVybnMgYXJlIHRlc3RlZDoqLmMsICouY2MsICouY3h4LCAqLmNwcCwgKi5jKyssICouamF2YSwgKi5paSwKKyMgKi5peHgsICouaXBwLCAqLmkrKywgKi5pbmwsICouaWRsLCAqLmRkbCwgKi5vZGwsICouaCwgKi5oaCwgKi5oeHgsICouaHBwLAorIyAqLmgrKywgKi5jcywgKi5kLCAqLnBocCwgKi5waHA0LCAqLnBocDUsICoucGh0bWwsICouaW5jLCAqLm0sICoubWFya2Rvd24sCisjICoubWQsICoubW0sICouZG94LCAqLnB5LCAqLmY5MCwgKi5mLCAqLmZvciwgKi50Y2wsICoudmhkLCAqLnZoZGwsICoudWNmLAorIyAqLnFzZiwgKi5hcyBhbmQgKi5qcy4KKworRklMRV9QQVRURVJOUyAgICAgICAgICA9ICouYyAqLmggKi5jcHAgKi5mOTAKKworIyBUaGUgUkVDVVJTSVZFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHdoZXRoZXIgb3Igbm90IHN1YmRpcmVjdG9yaWVzIHNob3VsZAorIyBiZSBzZWFyY2hlZCBmb3IgaW5wdXQgZmlsZXMgYXMgd2VsbC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitSRUNVUlNJVkUgICAgICAgICAgICAgID0gWUVTCisKKyMgVGhlIEVYQ0xVREUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgZmlsZXMgYW5kL29yIGRpcmVjdG9yaWVzIHRoYXQgc2hvdWxkIGJlCisjIGV4Y2x1ZGVkIGZyb20gdGhlIElOUFVUIHNvdXJjZSBmaWxlcy4gVGhpcyB3YXkgeW91IGNhbiBlYXNpbHkgZXhjbHVkZSBhCisjIHN1YmRpcmVjdG9yeSBmcm9tIGEgZGlyZWN0b3J5IHRyZWUgd2hvc2Ugcm9vdCBpcyBzcGVjaWZpZWQgd2l0aCB0aGUgSU5QVVQgdGFnLgorIworIyBOb3RlIHRoYXQgcmVsYXRpdmUgcGF0aHMgYXJlIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkgZnJvbSB3aGljaCBkb3h5Z2VuIGlzCisjIHJ1bi4KKworRVhDTFVERSAgICAgICAgICAgICAgICA9IHNyYy9pbXBvcnRlZCBzcmMvcmR0c2MuaAorCisjIFRoZSBFWENMVURFX1NZTUxJTktTIHRhZyBjYW4gYmUgdXNlZCB0byBzZWxlY3Qgd2hldGhlciBvciBub3QgZmlsZXMgb3IKKyMgZGlyZWN0b3JpZXMgdGhhdCBhcmUgc3ltYm9saWMgbGlua3MgKGEgVW5peCBmaWxlIHN5c3RlbSBmZWF0dXJlKSBhcmUgZXhjbHVkZWQKKyMgZnJvbSB0aGUgaW5wdXQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworRVhDTFVERV9TWU1MSU5LUyAgICAgICA9IE5PCisKKyMgSWYgdGhlIHZhbHVlIG9mIHRoZSBJTlBVVCB0YWcgY29udGFpbnMgZGlyZWN0b3JpZXMsIHlvdSBjYW4gdXNlIHRoZQorIyBFWENMVURFX1BBVFRFUk5TIHRhZyB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHdpbGRjYXJkIHBhdHRlcm5zIHRvIGV4Y2x1ZGUKKyMgY2VydGFpbiBmaWxlcyBmcm9tIHRob3NlIGRpcmVjdG9yaWVzLgorIworIyBOb3RlIHRoYXQgdGhlIHdpbGRjYXJkcyBhcmUgbWF0Y2hlZCBhZ2FpbnN0IHRoZSBmaWxlIHdpdGggYWJzb2x1dGUgcGF0aCwgc28gdG8KKyMgZXhjbHVkZSBhbGwgdGVzdCBkaXJlY3RvcmllcyBmb3IgZXhhbXBsZSB1c2UgdGhlIHBhdHRlcm4gKi90ZXN0LyoKKworRVhDTFVERV9QQVRURVJOUyAgICAgICA9IAorCisjIFRoZSBFWENMVURFX1NZTUJPTFMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgc3ltYm9sIG5hbWVzCisjIChuYW1lc3BhY2VzLCBjbGFzc2VzLCBmdW5jdGlvbnMsIGV0Yy4pIHRoYXQgc2hvdWxkIGJlIGV4Y2x1ZGVkIGZyb20gdGhlCisjIG91dHB1dC4gVGhlIHN5bWJvbCBuYW1lIGNhbiBiZSBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lLCBhIHdvcmQsIG9yIGlmIHRoZQorIyB3aWxkY2FyZCAqIGlzIHVzZWQsIGEgc3Vic3RyaW5nLiBFeGFtcGxlczogQU5hbWVzcGFjZSwgQUNsYXNzLAorIyBBQ2xhc3M6OkFOYW1lc3BhY2UsIEFOYW1lc3BhY2U6OipUZXN0CisjCisjIE5vdGUgdGhhdCB0aGUgd2lsZGNhcmRzIGFyZSBtYXRjaGVkIGFnYWluc3QgdGhlIGZpbGUgd2l0aCBhYnNvbHV0ZSBwYXRoLCBzbyB0bworIyBleGNsdWRlIGFsbCB0ZXN0IGRpcmVjdG9yaWVzIHVzZSB0aGUgcGF0dGVybiAqL3Rlc3QvKgorCitFWENMVURFX1NZTUJPTFMgICAgICAgID0gCisKKyMgVGhlIEVYQU1QTEVfUEFUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBmaWxlcyBvciBkaXJlY3RvcmllcworIyB0aGF0IGNvbnRhaW4gZXhhbXBsZSBjb2RlIGZyYWdtZW50cyB0aGF0IGFyZSBpbmNsdWRlZCAoc2VlIHRoZSBcaW5jbHVkZQorIyBjb21tYW5kKS4KKworRVhBTVBMRV9QQVRIICAgICAgICAgICA9IAorCisjIElmIHRoZSB2YWx1ZSBvZiB0aGUgRVhBTVBMRV9QQVRIIHRhZyBjb250YWlucyBkaXJlY3RvcmllcywgeW91IGNhbiB1c2UgdGhlCisjIEVYQU1QTEVfUEFUVEVSTlMgdGFnIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgd2lsZGNhcmQgcGF0dGVybiAobGlrZSAqLmNwcCBhbmQKKyMgKi5oKSB0byBmaWx0ZXIgb3V0IHRoZSBzb3VyY2UtZmlsZXMgaW4gdGhlIGRpcmVjdG9yaWVzLiBJZiBsZWZ0IGJsYW5rIGFsbAorIyBmaWxlcyBhcmUgaW5jbHVkZWQuCisKK0VYQU1QTEVfUEFUVEVSTlMgICAgICAgPSAqCisKKyMgSWYgdGhlIEVYQU1QTEVfUkVDVVJTSVZFIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gc3ViZGlyZWN0b3JpZXMgd2lsbCBiZQorIyBzZWFyY2hlZCBmb3IgaW5wdXQgZmlsZXMgdG8gYmUgdXNlZCB3aXRoIHRoZSBcaW5jbHVkZSBvciBcZG9udGluY2x1ZGUgY29tbWFuZHMKKyMgaXJyZXNwZWN0aXZlIG9mIHRoZSB2YWx1ZSBvZiB0aGUgUkVDVVJTSVZFIHRhZy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitFWEFNUExFX1JFQ1VSU0lWRSAgICAgID0gTk8KKworIyBUaGUgSU1BR0VfUEFUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBmaWxlcyBvciBkaXJlY3RvcmllcworIyB0aGF0IGNvbnRhaW4gaW1hZ2VzIHRoYXQgYXJlIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uIChzZWUgdGhlCisjIFxpbWFnZSBjb21tYW5kKS4KKworSU1BR0VfUEFUSCAgICAgICAgICAgICA9IAorCisjIFRoZSBJTlBVVF9GSUxURVIgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBwcm9ncmFtIHRoYXQgZG94eWdlbiBzaG91bGQKKyMgaW52b2tlIHRvIGZpbHRlciBmb3IgZWFjaCBpbnB1dCBmaWxlLiBEb3h5Z2VuIHdpbGwgaW52b2tlIHRoZSBmaWx0ZXIgcHJvZ3JhbQorIyBieSBleGVjdXRpbmcgKHZpYSBwb3BlbigpKSB0aGUgY29tbWFuZDoKKyMKKyMgPGZpbHRlcj4gPGlucHV0LWZpbGU+CisjCisjIHdoZXJlIDxmaWx0ZXI+IGlzIHRoZSB2YWx1ZSBvZiB0aGUgSU5QVVRfRklMVEVSIHRhZywgYW5kIDxpbnB1dC1maWxlPiBpcyB0aGUKKyMgbmFtZSBvZiBhbiBpbnB1dCBmaWxlLiBEb3h5Z2VuIHdpbGwgdGhlbiB1c2UgdGhlIG91dHB1dCB0aGF0IHRoZSBmaWx0ZXIKKyMgcHJvZ3JhbSB3cml0ZXMgdG8gc3RhbmRhcmQgb3V0cHV0LiBJZiBGSUxURVJfUEFUVEVSTlMgaXMgc3BlY2lmaWVkLCB0aGlzIHRhZworIyB3aWxsIGJlIGlnbm9yZWQuCisjCisjIE5vdGUgdGhhdCB0aGUgZmlsdGVyIG11c3Qgbm90IGFkZCBvciByZW1vdmUgbGluZXM7IGl0IGlzIGFwcGxpZWQgYmVmb3JlIHRoZQorIyBjb2RlIGlzIHNjYW5uZWQsIGJ1dCBub3Qgd2hlbiB0aGUgb3V0cHV0IGNvZGUgaXMgZ2VuZXJhdGVkLiBJZiBsaW5lcyBhcmUgYWRkZWQKKyMgb3IgcmVtb3ZlZCwgdGhlIGFuY2hvcnMgd2lsbCBub3QgYmUgcGxhY2VkIGNvcnJlY3RseS4KKworSU5QVVRfRklMVEVSICAgICAgICAgICA9IAorCisjIFRoZSBGSUxURVJfUEFUVEVSTlMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgZmlsdGVycyBvbiBhIHBlciBmaWxlIHBhdHRlcm4KKyMgYmFzaXMuIERveHlnZW4gd2lsbCBjb21wYXJlIHRoZSBmaWxlIG5hbWUgd2l0aCBlYWNoIHBhdHRlcm4gYW5kIGFwcGx5IHRoZQorIyBmaWx0ZXIgaWYgdGhlcmUgaXMgYSBtYXRjaC4gVGhlIGZpbHRlcnMgYXJlIGEgbGlzdCBvZiB0aGUgZm9ybTogcGF0dGVybj1maWx0ZXIKKyMgKGxpa2UgKi5jcHA9bXlfY3BwX2ZpbHRlcikuIFNlZSBJTlBVVF9GSUxURVIgZm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gb24gaG93CisjIGZpbHRlcnMgYXJlIHVzZWQuIElmIHRoZSBGSUxURVJfUEFUVEVSTlMgdGFnIGlzIGVtcHR5IG9yIGlmIG5vbmUgb2YgdGhlCisjIHBhdHRlcm5zIG1hdGNoIHRoZSBmaWxlIG5hbWUsIElOUFVUX0ZJTFRFUiBpcyBhcHBsaWVkLgorCitGSUxURVJfUEFUVEVSTlMgICAgICAgID0gCisKKyMgSWYgdGhlIEZJTFRFUl9TT1VSQ0VfRklMRVMgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBpbnB1dCBmaWx0ZXIgKGlmIHNldCB1c2luZworIyBJTlBVVF9GSUxURVIgKSB3aWxsIGFsc28gYmUgdXNlZCB0byBmaWx0ZXIgdGhlIGlucHV0IGZpbGVzIHRoYXQgYXJlIHVzZWQgZm9yCisjIHByb2R1Y2luZyB0aGUgc291cmNlIGZpbGVzIHRvIGJyb3dzZSAoaS5lLiB3aGVuIFNPVVJDRV9CUk9XU0VSIGlzIHNldCB0byBZRVMpLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0ZJTFRFUl9TT1VSQ0VfRklMRVMgICAgPSBOTworCisjIFRoZSBGSUxURVJfU09VUkNFX1BBVFRFUk5TIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHNvdXJjZSBmaWx0ZXJzIHBlciBmaWxlCisjIHBhdHRlcm4uIEEgcGF0dGVybiB3aWxsIG92ZXJyaWRlIHRoZSBzZXR0aW5nIGZvciBGSUxURVJfUEFUVEVSTiAoaWYgYW55KSBhbmQKKyMgaXQgaXMgYWxzbyBwb3NzaWJsZSB0byBkaXNhYmxlIHNvdXJjZSBmaWx0ZXJpbmcgZm9yIGEgc3BlY2lmaWMgcGF0dGVybiB1c2luZworIyAqLmV4dD0gKHNvIHdpdGhvdXQgbmFtaW5nIGEgZmlsdGVyKS4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEZJTFRFUl9TT1VSQ0VfRklMRVMgaXMgc2V0IHRvIFlFUy4KKworRklMVEVSX1NPVVJDRV9QQVRURVJOUyA9IAorCisjIElmIHRoZSBVU0VfTURGSUxFX0FTX01BSU5QQUdFIHRhZyByZWZlcnMgdG8gdGhlIG5hbWUgb2YgYSBtYXJrZG93biBmaWxlIHRoYXQKKyMgaXMgcGFydCBvZiB0aGUgaW5wdXQsIGl0cyBjb250ZW50cyB3aWxsIGJlIHBsYWNlZCBvbiB0aGUgbWFpbiBwYWdlCisjIChpbmRleC5odG1sKS4gVGhpcyBjYW4gYmUgdXNlZnVsIGlmIHlvdSBoYXZlIGEgcHJvamVjdCBvbiBmb3IgaW5zdGFuY2UgR2l0SHViCisjIGFuZCB3YW50IHRvIHJldXNlIHRoZSBpbnRyb2R1Y3Rpb24gcGFnZSBhbHNvIGZvciB0aGUgZG94eWdlbiBvdXRwdXQuCisKK1VTRV9NREZJTEVfQVNfTUFJTlBBR0UgPSAKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byBzb3VyY2UgYnJvd3NpbmcKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgU09VUkNFX0JST1dTRVIgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBhIGxpc3Qgb2Ygc291cmNlIGZpbGVzIHdpbGwgYmUKKyMgZ2VuZXJhdGVkLiBEb2N1bWVudGVkIGVudGl0aWVzIHdpbGwgYmUgY3Jvc3MtcmVmZXJlbmNlZCB3aXRoIHRoZXNlIHNvdXJjZXMuCisjCisjIE5vdGU6IFRvIGdldCByaWQgb2YgYWxsIHNvdXJjZSBjb2RlIGluIHRoZSBnZW5lcmF0ZWQgb3V0cHV0LCBtYWtlIHN1cmUgdGhhdAorIyBhbHNvIFZFUkJBVElNX0hFQURFUlMgaXMgc2V0IHRvIE5PLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1NPVVJDRV9CUk9XU0VSICAgICAgICAgPSBZRVMKKworIyBTZXR0aW5nIHRoZSBJTkxJTkVfU09VUkNFUyB0YWcgdG8gWUVTIHdpbGwgaW5jbHVkZSB0aGUgYm9keSBvZiBmdW5jdGlvbnMsCisjIGNsYXNzZXMgYW5kIGVudW1zIGRpcmVjdGx5IGludG8gdGhlIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworSU5MSU5FX1NPVVJDRVMgICAgICAgICA9IE5PCisKKyMgU2V0dGluZyB0aGUgU1RSSVBfQ09ERV9DT01NRU5UUyB0YWcgdG8gWUVTIHdpbGwgaW5zdHJ1Y3QgZG94eWdlbiB0byBoaWRlIGFueQorIyBzcGVjaWFsIGNvbW1lbnQgYmxvY2tzIGZyb20gZ2VuZXJhdGVkIHNvdXJjZSBjb2RlIGZyYWdtZW50cy4gTm9ybWFsIEMsIEMrKyBhbmQKKyMgRm9ydHJhbiBjb21tZW50cyB3aWxsIGFsd2F5cyByZW1haW4gdmlzaWJsZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworU1RSSVBfQ09ERV9DT01NRU5UUyAgICA9IFlFUworCisjIElmIHRoZSBSRUZFUkVOQ0VEX0JZX1JFTEFUSU9OIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZm9yIGVhY2ggZG9jdW1lbnRlZAorIyBmdW5jdGlvbiBhbGwgZG9jdW1lbnRlZCBmdW5jdGlvbnMgcmVmZXJlbmNpbmcgaXQgd2lsbCBiZSBsaXN0ZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworUkVGRVJFTkNFRF9CWV9SRUxBVElPTiA9IFlFUworCisjIElmIHRoZSBSRUZFUkVOQ0VTX1JFTEFUSU9OIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZm9yIGVhY2ggZG9jdW1lbnRlZCBmdW5jdGlvbgorIyBhbGwgZG9jdW1lbnRlZCBlbnRpdGllcyBjYWxsZWQvdXNlZCBieSB0aGF0IGZ1bmN0aW9uIHdpbGwgYmUgbGlzdGVkLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1JFRkVSRU5DRVNfUkVMQVRJT04gICAgPSBOTworCisjIElmIHRoZSBSRUZFUkVOQ0VTX0xJTktfU09VUkNFIHRhZyBpcyBzZXQgdG8gWUVTIGFuZCBTT1VSQ0VfQlJPV1NFUiB0YWcgaXMgc2V0CisjIHRvIFlFUywgdGhlbiB0aGUgaHlwZXJsaW5rcyBmcm9tIGZ1bmN0aW9ucyBpbiBSRUZFUkVOQ0VTX1JFTEFUSU9OIGFuZAorIyBSRUZFUkVOQ0VEX0JZX1JFTEFUSU9OIGxpc3RzIHdpbGwgbGluayB0byB0aGUgc291cmNlIGNvZGUuIE90aGVyd2lzZSB0aGV5IHdpbGwKKyMgbGluayB0byB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworUkVGRVJFTkNFU19MSU5LX1NPVVJDRSA9IFlFUworCisjIElmIFNPVVJDRV9UT09MVElQUyBpcyBlbmFibGVkICh0aGUgZGVmYXVsdCkgdGhlbiBob3ZlcmluZyBhIGh5cGVybGluayBpbiB0aGUKKyMgc291cmNlIGNvZGUgd2lsbCBzaG93IGEgdG9vbHRpcCB3aXRoIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gc3VjaCBhcyBwcm90b3R5cGUsCisjIGJyaWVmIGRlc2NyaXB0aW9uIGFuZCBsaW5rcyB0byB0aGUgZGVmaW5pdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4gU2luY2UgdGhpcworIyB3aWxsIG1ha2UgdGhlIEhUTUwgZmlsZSBsYXJnZXIgYW5kIGxvYWRpbmcgb2YgbGFyZ2UgZmlsZXMgYSBiaXQgc2xvd2VyLCB5b3UKKyMgY2FuIG9wdCB0byBkaXNhYmxlIHRoaXMgZmVhdHVyZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFNPVVJDRV9CUk9XU0VSIGlzIHNldCB0byBZRVMuCisKK1NPVVJDRV9UT09MVElQUyAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgVVNFX0hUQUdTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gdGhlIHJlZmVyZW5jZXMgdG8gc291cmNlIGNvZGUgd2lsbAorIyBwb2ludCB0byB0aGUgSFRNTCBnZW5lcmF0ZWQgYnkgdGhlIGh0YWdzKDEpIHRvb2wgaW5zdGVhZCBvZiBkb3h5Z2VuIGJ1aWx0LWluCisjIHNvdXJjZSBicm93c2VyLiBUaGUgaHRhZ3MgdG9vbCBpcyBwYXJ0IG9mIEdOVSdzIGdsb2JhbCBzb3VyY2UgdGFnZ2luZyBzeXN0ZW0KKyMgKHNlZSBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvZ2xvYmFsL2dsb2JhbC5odG1sKS4gWW91IHdpbGwgbmVlZCB2ZXJzaW9uCisjIDQuOC42IG9yIGhpZ2hlci4KKyMKKyMgVG8gdXNlIGl0IGRvIHRoZSBmb2xsb3dpbmc6CisjIC0gSW5zdGFsbCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgZ2xvYmFsCisjIC0gRW5hYmxlIFNPVVJDRV9CUk9XU0VSIGFuZCBVU0VfSFRBR1MgaW4gdGhlIGNvbmZpZyBmaWxlCisjIC0gTWFrZSBzdXJlIHRoZSBJTlBVVCBwb2ludHMgdG8gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlCisjIC0gUnVuIGRveHlnZW4gYXMgbm9ybWFsCisjCisjIERveHlnZW4gd2lsbCBpbnZva2UgaHRhZ3MgKGFuZCB0aGF0IHdpbGwgaW4gdHVybiBpbnZva2UgZ3RhZ3MpLCBzbyB0aGVzZQorIyB0b29scyBtdXN0IGJlIGF2YWlsYWJsZSBmcm9tIHRoZSBjb21tYW5kIGxpbmUgKGkuZS4gaW4gdGhlIHNlYXJjaCBwYXRoKS4KKyMKKyMgVGhlIHJlc3VsdDogaW5zdGVhZCBvZiB0aGUgc291cmNlIGJyb3dzZXIgZ2VuZXJhdGVkIGJ5IGRveHlnZW4sIHRoZSBsaW5rcyB0bworIyBzb3VyY2UgY29kZSB3aWxsIG5vdyBwb2ludCB0byB0aGUgb3V0cHV0IG9mIGh0YWdzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBTT1VSQ0VfQlJPV1NFUiBpcyBzZXQgdG8gWUVTLgorCitVU0VfSFRBR1MgICAgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgVkVSQkFUSU1fSEVBREVSUyB0YWcgaXMgc2V0IHRoZSBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYQorIyB2ZXJiYXRpbSBjb3B5IG9mIHRoZSBoZWFkZXIgZmlsZSBmb3IgZWFjaCBjbGFzcyBmb3Igd2hpY2ggYW4gaW5jbHVkZSBpcworIyBzcGVjaWZpZWQuIFNldCB0byBOTyB0byBkaXNhYmxlIHRoaXMuCisjIFNlZSBhbHNvOiBTZWN0aW9uIFxjbGFzcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworVkVSQkFUSU1fSEVBREVSUyAgICAgICA9IFlFUworCisjIElmIHRoZSBDTEFOR19BU1NJU1RFRF9QQVJTSU5HIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGVuIGRveHlnZW4gd2lsbCB1c2UgdGhlCisjIGNsYW5nIHBhcnNlciAoc2VlOiBodHRwOi8vY2xhbmcubGx2bS5vcmcvKSBmb3IgbW9yZSBhY3VyYXRlIHBhcnNpbmcgYXQgdGhlCisjIGNvc3Qgb2YgcmVkdWNlZCBwZXJmb3JtYW5jZS4gVGhpcyBjYW4gYmUgcGFydGljdWxhcmx5IGhlbHBmdWwgd2l0aCB0ZW1wbGF0ZQorIyByaWNoIEMrKyBjb2RlIGZvciB3aGljaCBkb3h5Z2VuJ3MgYnVpbHQtaW4gcGFyc2VyIGxhY2tzIHRoZSBuZWNlc3NhcnkgdHlwZQorIyBpbmZvcm1hdGlvbi4KKyMgTm90ZTogVGhlIGF2YWlsYWJpbGl0eSBvZiB0aGlzIG9wdGlvbiBkZXBlbmRzIG9uIHdoZXRoZXIgb3Igbm90IGRveHlnZW4gd2FzCisjIGNvbXBpbGVkIHdpdGggdGhlIC0td2l0aC1saWJjbGFuZyBvcHRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworQ0xBTkdfQVNTSVNURURfUEFSU0lORyA9IE5PCisKKyMgSWYgY2xhbmcgYXNzaXN0ZWQgcGFyc2luZyBpcyBlbmFibGVkIHlvdSBjYW4gcHJvdmlkZSB0aGUgY29tcGlsZXIgd2l0aCBjb21tYW5kCisjIGxpbmUgb3B0aW9ucyB0aGF0IHlvdSB3b3VsZCBub3JtYWxseSB1c2Ugd2hlbiBpbnZva2luZyB0aGUgY29tcGlsZXIuIE5vdGUgdGhhdAorIyB0aGUgaW5jbHVkZSBwYXRocyB3aWxsIGFscmVhZHkgYmUgc2V0IGJ5IGRveHlnZW4gZm9yIHRoZSBmaWxlcyBhbmQgZGlyZWN0b3JpZXMKKyMgc3BlY2lmaWVkIHdpdGggSU5QVVQgYW5kIElOQ0xVREVfUEFUSC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIENMQU5HX0FTU0lTVEVEX1BBUlNJTkcgaXMgc2V0IHRvIFlFUy4KKworQ0xBTkdfT1BUSU9OUyAgICAgICAgICA9IAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBhbHBoYWJldGljYWwgY2xhc3MgaW5kZXgKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgQUxQSEFCRVRJQ0FMX0lOREVYIHRhZyBpcyBzZXQgdG8gWUVTLCBhbiBhbHBoYWJldGljYWwgaW5kZXggb2YgYWxsCisjIGNvbXBvdW5kcyB3aWxsIGJlIGdlbmVyYXRlZC4gRW5hYmxlIHRoaXMgaWYgdGhlIHByb2plY3QgY29udGFpbnMgYSBsb3Qgb2YKKyMgY2xhc3Nlcywgc3RydWN0cywgdW5pb25zIG9yIGludGVyZmFjZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0FMUEhBQkVUSUNBTF9JTkRFWCAgICAgPSBZRVMKKworIyBUaGUgQ09MU19JTl9BTFBIQV9JTkRFWCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgaW4KKyMgd2hpY2ggdGhlIGFscGhhYmV0aWNhbCBpbmRleCBsaXN0IHdpbGwgYmUgc3BsaXQuCisjIE1pbmltdW0gdmFsdWU6IDEsIG1heGltdW0gdmFsdWU6IDIwLCBkZWZhdWx0IHZhbHVlOiA1LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgQUxQSEFCRVRJQ0FMX0lOREVYIGlzIHNldCB0byBZRVMuCisKK0NPTFNfSU5fQUxQSEFfSU5ERVggICAgPSA1CisKKyMgSW4gY2FzZSBhbGwgY2xhc3NlcyBpbiBhIHByb2plY3Qgc3RhcnQgd2l0aCBhIGNvbW1vbiBwcmVmaXgsIGFsbCBjbGFzc2VzIHdpbGwKKyMgYmUgcHV0IHVuZGVyIHRoZSBzYW1lIGhlYWRlciBpbiB0aGUgYWxwaGFiZXRpY2FsIGluZGV4LiBUaGUgSUdOT1JFX1BSRUZJWCB0YWcKKyMgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHByZWZpeCAob3IgYSBsaXN0IG9mIHByZWZpeGVzKSB0aGF0IHNob3VsZCBiZSBpZ25vcmVkCisjIHdoaWxlIGdlbmVyYXRpbmcgdGhlIGluZGV4IGhlYWRlcnMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBBTFBIQUJFVElDQUxfSU5ERVggaXMgc2V0IHRvIFlFUy4KKworSUdOT1JFX1BSRUZJWCAgICAgICAgICA9IAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBIVE1MIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9IVE1MIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBIVE1MIG91dHB1dAorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitHRU5FUkFURV9IVE1MICAgICAgICAgID0gWUVTCisKKyMgVGhlIEhUTUxfT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIEhUTUwgZG9jcyB3aWxsIGJlIHB1dC4gSWYgYQorIyByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZSBwdXQgaW4gZnJvbnQgb2YKKyMgaXQuCisjIFRoZSBkZWZhdWx0IGRpcmVjdG9yeSBpczogaHRtbC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9PVVRQVVQgICAgICAgICAgICA9IGh0bWwKKworIyBUaGUgSFRNTF9GSUxFX0VYVEVOU0lPTiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgZmlsZSBleHRlbnNpb24gZm9yIGVhY2gKKyMgZ2VuZXJhdGVkIEhUTUwgcGFnZSAoZm9yIGV4YW1wbGU6IC5odG0sIC5waHAsIC5hc3ApLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogLmh0bWwuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0hUTUxfRklMRV9FWFRFTlNJT04gICAgPSAuaHRtbAorCisjIFRoZSBIVE1MX0hFQURFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHVzZXItZGVmaW5lZCBIVE1MIGhlYWRlciBmaWxlIGZvcgorIyBlYWNoIGdlbmVyYXRlZCBIVE1MIHBhZ2UuIElmIHRoZSB0YWcgaXMgbGVmdCBibGFuayBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYQorIyBzdGFuZGFyZCBoZWFkZXIuCisjCisjIFRvIGdldCB2YWxpZCBIVE1MIHRoZSBoZWFkZXIgZmlsZSB0aGF0IGluY2x1ZGVzIGFueSBzY3JpcHRzIGFuZCBzdHlsZSBzaGVldHMKKyMgdGhhdCBkb3h5Z2VuIG5lZWRzLCB3aGljaCBpcyBkZXBlbmRlbnQgb24gdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB1c2VkIChlLmcuCisjIHRoZSBzZXR0aW5nIEdFTkVSQVRFX1RSRUVWSUVXKS4gSXQgaXMgaGlnaGx5IHJlY29tbWVuZGVkIHRvIHN0YXJ0IHdpdGggYQorIyBkZWZhdWx0IGhlYWRlciB1c2luZworIyBkb3h5Z2VuIC13IGh0bWwgbmV3X2hlYWRlci5odG1sIG5ld19mb290ZXIuaHRtbCBuZXdfc3R5bGVzaGVldC5jc3MKKyMgWW91ckNvbmZpZ0ZpbGUKKyMgYW5kIHRoZW4gbW9kaWZ5IHRoZSBmaWxlIG5ld19oZWFkZXIuaHRtbC4gU2VlIGFsc28gc2VjdGlvbiAiRG94eWdlbiB1c2FnZSIKKyMgZm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0byBnZW5lcmF0ZSB0aGUgZGVmYXVsdCBoZWFkZXIgdGhhdCBkb3h5Z2VuIG5vcm1hbGx5CisjIHVzZXMuCisjIE5vdGU6IFRoZSBoZWFkZXIgaXMgc3ViamVjdCB0byBjaGFuZ2Ugc28geW91IHR5cGljYWxseSBoYXZlIHRvIHJlZ2VuZXJhdGUgdGhlCisjIGRlZmF1bHQgaGVhZGVyIHdoZW4gdXBncmFkaW5nIHRvIGEgbmV3ZXIgdmVyc2lvbiBvZiBkb3h5Z2VuLiBGb3IgYSBkZXNjcmlwdGlvbgorIyBvZiB0aGUgcG9zc2libGUgbWFya2VycyBhbmQgYmxvY2sgbmFtZXMgc2VlIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitIVE1MX0hFQURFUiAgICAgICAgICAgID0gCisKKyMgVGhlIEhUTUxfRk9PVEVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgdXNlci1kZWZpbmVkIEhUTUwgZm9vdGVyIGZvciBlYWNoCisjIGdlbmVyYXRlZCBIVE1MIHBhZ2UuIElmIHRoZSB0YWcgaXMgbGVmdCBibGFuayBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBzdGFuZGFyZAorIyBmb290ZXIuIFNlZSBIVE1MX0hFQURFUiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBob3cgdG8gZ2VuZXJhdGUgYSBkZWZhdWx0CisjIGZvb3RlciBhbmQgd2hhdCBzcGVjaWFsIGNvbW1hbmRzIGNhbiBiZSB1c2VkIGluc2lkZSB0aGUgZm9vdGVyLiBTZWUgYWxzbworIyBzZWN0aW9uICJEb3h5Z2VuIHVzYWdlIiBmb3IgaW5mb3JtYXRpb24gb24gaG93IHRvIGdlbmVyYXRlIHRoZSBkZWZhdWx0IGZvb3RlcgorIyB0aGF0IGRveHlnZW4gbm9ybWFsbHkgdXNlcy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9GT09URVIgICAgICAgICAgICA9IAorCisjIFRoZSBIVE1MX1NUWUxFU0hFRVQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSB1c2VyLWRlZmluZWQgY2FzY2FkaW5nIHN0eWxlCisjIHNoZWV0IHRoYXQgaXMgdXNlZCBieSBlYWNoIEhUTUwgcGFnZS4gSXQgY2FuIGJlIHVzZWQgdG8gZmluZS10dW5lIHRoZSBsb29rIG9mCisjIHRoZSBIVE1MIG91dHB1dC4gSWYgbGVmdCBibGFuayBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBkZWZhdWx0IHN0eWxlIHNoZWV0LgorIyBTZWUgYWxzbyBzZWN0aW9uICJEb3h5Z2VuIHVzYWdlIiBmb3IgaW5mb3JtYXRpb24gb24gaG93IHRvIGdlbmVyYXRlIHRoZSBzdHlsZQorIyBzaGVldCB0aGF0IGRveHlnZW4gbm9ybWFsbHkgdXNlcy4KKyMgTm90ZTogSXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIEhUTUxfRVhUUkFfU1RZTEVTSEVFVCBpbnN0ZWFkIG9mIHRoaXMgdGFnLCBhcworIyBpdCBpcyBtb3JlIHJvYnVzdCBhbmQgdGhpcyB0YWcgKEhUTUxfU1RZTEVTSEVFVCkgd2lsbCBpbiB0aGUgZnV0dXJlIGJlY29tZQorIyBvYnNvbGV0ZS4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9TVFlMRVNIRUVUICAgICAgICA9IAorCisjIFRoZSBIVE1MX0VYVFJBX1NUWUxFU0hFRVQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYW4gYWRkaXRpb25hbCB1c2VyLQorIyBkZWZpbmVkIGNhc2NhZGluZyBzdHlsZSBzaGVldCB0aGF0IGlzIGluY2x1ZGVkIGFmdGVyIHRoZSBzdGFuZGFyZCBzdHlsZSBzaGVldHMKKyMgY3JlYXRlZCBieSBkb3h5Z2VuLiBVc2luZyB0aGlzIG9wdGlvbiBvbmUgY2FuIG92ZXJydWxlIGNlcnRhaW4gc3R5bGUgYXNwZWN0cy4KKyMgVGhpcyBpcyBwcmVmZXJyZWQgb3ZlciB1c2luZyBIVE1MX1NUWUxFU0hFRVQgc2luY2UgaXQgZG9lcyBub3QgcmVwbGFjZSB0aGUKKyMgc3RhbmRhcmQgc3R5bGUgc2hlZXQgYW5kIGlzIHRoZXJlZm9yIG1vcmUgcm9idXN0IGFnYWluc3QgZnV0dXJlIHVwZGF0ZXMuCisjIERveHlnZW4gd2lsbCBjb3B5IHRoZSBzdHlsZSBzaGVldCBmaWxlIHRvIHRoZSBvdXRwdXQgZGlyZWN0b3J5LiBGb3IgYW4gZXhhbXBsZQorIyBzZWUgdGhlIGRvY3VtZW50YXRpb24uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0hUTUxfRVhUUkFfU1RZTEVTSEVFVCAgPSAKKworIyBUaGUgSFRNTF9FWFRSQV9GSUxFUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBleHRyYSBpbWFnZXMgb3IKKyMgb3RoZXIgc291cmNlIGZpbGVzIHdoaWNoIHNob3VsZCBiZSBjb3BpZWQgdG8gdGhlIEhUTUwgb3V0cHV0IGRpcmVjdG9yeS4gTm90ZQorIyB0aGF0IHRoZXNlIGZpbGVzIHdpbGwgYmUgY29waWVkIHRvIHRoZSBiYXNlIEhUTUwgb3V0cHV0IGRpcmVjdG9yeS4gVXNlIHRoZQorIyAkcmVscGF0aF4gbWFya2VyIGluIHRoZSBIVE1MX0hFQURFUiBhbmQvb3IgSFRNTF9GT09URVIgZmlsZXMgdG8gbG9hZCB0aGVzZQorIyBmaWxlcy4gSW4gdGhlIEhUTUxfU1RZTEVTSEVFVCBmaWxlLCB1c2UgdGhlIGZpbGUgbmFtZSBvbmx5LiBBbHNvIG5vdGUgdGhhdCB0aGUKKyMgZmlsZXMgd2lsbCBiZSBjb3BpZWQgYXMtaXM7IHRoZXJlIGFyZSBubyBjb21tYW5kcyBvciBtYXJrZXJzIGF2YWlsYWJsZS4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9FWFRSQV9GSUxFUyAgICAgICA9IAorCisjIFRoZSBIVE1MX0NPTE9SU1RZTEVfSFVFIHRhZyBjb250cm9scyB0aGUgY29sb3Igb2YgdGhlIEhUTUwgb3V0cHV0LiBEb3h5Z2VuCisjIHdpbGwgYWRqdXN0IHRoZSBjb2xvcnMgaW4gdGhlIHN0eWxlc2hlZXQgYW5kIGJhY2tncm91bmQgaW1hZ2VzIGFjY29yZGluZyB0bworIyB0aGlzIGNvbG9yLiBIdWUgaXMgc3BlY2lmaWVkIGFzIGFuIGFuZ2xlIG9uIGEgY29sb3J3aGVlbCwgc2VlCisjIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSHVlIGZvciBtb3JlIGluZm9ybWF0aW9uLiBGb3IgaW5zdGFuY2UgdGhlIHZhbHVlCisjIDAgcmVwcmVzZW50cyByZWQsIDYwIGlzIHllbGxvdywgMTIwIGlzIGdyZWVuLCAxODAgaXMgY3lhbiwgMjQwIGlzIGJsdWUsIDMwMAorIyBwdXJwbGUsIGFuZCAzNjAgaXMgcmVkIGFnYWluLgorIyBNaW5pbXVtIHZhbHVlOiAwLCBtYXhpbXVtIHZhbHVlOiAzNTksIGRlZmF1bHQgdmFsdWU6IDIyMC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9DT0xPUlNUWUxFX0hVRSAgICA9IDIyMAorCisjIFRoZSBIVE1MX0NPTE9SU1RZTEVfU0FUIHRhZyBjb250cm9scyB0aGUgcHVyaXR5IChvciBzYXR1cmF0aW9uKSBvZiB0aGUgY29sb3JzCisjIGluIHRoZSBIVE1MIG91dHB1dC4gRm9yIGEgdmFsdWUgb2YgMCB0aGUgb3V0cHV0IHdpbGwgdXNlIGdyYXlzY2FsZXMgb25seS4gQQorIyB2YWx1ZSBvZiAyNTUgd2lsbCBwcm9kdWNlIHRoZSBtb3N0IHZpdmlkIGNvbG9ycy4KKyMgTWluaW11bSB2YWx1ZTogMCwgbWF4aW11bSB2YWx1ZTogMjU1LCBkZWZhdWx0IHZhbHVlOiAxMDAuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0hUTUxfQ09MT1JTVFlMRV9TQVQgICAgPSAxMDAKKworIyBUaGUgSFRNTF9DT0xPUlNUWUxFX0dBTU1BIHRhZyBjb250cm9scyB0aGUgZ2FtbWEgY29ycmVjdGlvbiBhcHBsaWVkIHRvIHRoZQorIyBsdW1pbmFuY2UgY29tcG9uZW50IG9mIHRoZSBjb2xvcnMgaW4gdGhlIEhUTUwgb3V0cHV0LiBWYWx1ZXMgYmVsb3cgMTAwCisjIGdyYWR1YWxseSBtYWtlIHRoZSBvdXRwdXQgbGlnaHRlciwgd2hlcmVhcyB2YWx1ZXMgYWJvdmUgMTAwIG1ha2UgdGhlIG91dHB1dAorIyBkYXJrZXIuIFRoZSB2YWx1ZSBkaXZpZGVkIGJ5IDEwMCBpcyB0aGUgYWN0dWFsIGdhbW1hIGFwcGxpZWQsIHNvIDgwIHJlcHJlc2VudHMKKyMgYSBnYW1tYSBvZiAwLjgsIFRoZSB2YWx1ZSAyMjAgcmVwcmVzZW50cyBhIGdhbW1hIG9mIDIuMiwgYW5kIDEwMCBkb2VzIG5vdAorIyBjaGFuZ2UgdGhlIGdhbW1hLgorIyBNaW5pbXVtIHZhbHVlOiA0MCwgbWF4aW11bSB2YWx1ZTogMjQwLCBkZWZhdWx0IHZhbHVlOiA4MC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9DT0xPUlNUWUxFX0dBTU1BICA9IDgwCisKKyMgSWYgdGhlIEhUTUxfVElNRVNUQU1QIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gdGhlIGZvb3RlciBvZiBlYWNoIGdlbmVyYXRlZCBIVE1MCisjIHBhZ2Ugd2lsbCBjb250YWluIHRoZSBkYXRlIGFuZCB0aW1lIHdoZW4gdGhlIHBhZ2Ugd2FzIGdlbmVyYXRlZC4gU2V0dGluZyB0aGlzCisjIHRvIE5PIGNhbiBoZWxwIHdoZW4gY29tcGFyaW5nIHRoZSBvdXRwdXQgb2YgbXVsdGlwbGUgcnVucy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9USU1FU1RBTVAgICAgICAgICA9IFlFUworCisjIElmIHRoZSBIVE1MX0RZTkFNSUNfU0VDVElPTlMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiB0aGUgZ2VuZXJhdGVkIEhUTUwKKyMgZG9jdW1lbnRhdGlvbiB3aWxsIGNvbnRhaW4gc2VjdGlvbnMgdGhhdCBjYW4gYmUgaGlkZGVuIGFuZCBzaG93biBhZnRlciB0aGUKKyMgcGFnZSBoYXMgbG9hZGVkLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0hUTUxfRFlOQU1JQ19TRUNUSU9OUyAgPSBOTworCisjIFdpdGggSFRNTF9JTkRFWF9OVU1fRU5UUklFUyBvbmUgY2FuIGNvbnRyb2wgdGhlIHByZWZlcnJlZCBudW1iZXIgb2YgZW50cmllcworIyBzaG93biBpbiB0aGUgdmFyaW91cyB0cmVlIHN0cnVjdHVyZWQgaW5kaWNlcyBpbml0aWFsbHk7IHRoZSB1c2VyIGNhbiBleHBhbmQKKyMgYW5kIGNvbGxhcHNlIGVudHJpZXMgZHluYW1pY2FsbHkgbGF0ZXIgb24uIERveHlnZW4gd2lsbCBleHBhbmQgdGhlIHRyZWUgdG8KKyMgc3VjaCBhIGxldmVsIHRoYXQgYXQgbW9zdCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBlbnRyaWVzIGFyZSB2aXNpYmxlICh1bmxlc3MKKyMgYSBmdWxseSBjb2xsYXBzZWQgdHJlZSBhbHJlYWR5IGV4Y2VlZHMgdGhpcyBhbW91bnQpLiBTbyBzZXR0aW5nIHRoZSBudW1iZXIgb2YKKyMgZW50cmllcyAxIHdpbGwgcHJvZHVjZSBhIGZ1bGwgY29sbGFwc2VkIHRyZWUgYnkgZGVmYXVsdC4gMCBpcyBhIHNwZWNpYWwgdmFsdWUKKyMgcmVwcmVzZW50aW5nIGFuIGluZmluaXRlIG51bWJlciBvZiBlbnRyaWVzIGFuZCB3aWxsIHJlc3VsdCBpbiBhIGZ1bGwgZXhwYW5kZWQKKyMgdHJlZSBieSBkZWZhdWx0LgorIyBNaW5pbXVtIHZhbHVlOiAwLCBtYXhpbXVtIHZhbHVlOiA5OTk5LCBkZWZhdWx0IHZhbHVlOiAxMDAuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0hUTUxfSU5ERVhfTlVNX0VOVFJJRVMgPSAxMDAKKworIyBJZiB0aGUgR0VORVJBVEVfRE9DU0VUIHRhZyBpcyBzZXQgdG8gWUVTLCBhZGRpdGlvbmFsIGluZGV4IGZpbGVzIHdpbGwgYmUKKyMgZ2VuZXJhdGVkIHRoYXQgY2FuIGJlIHVzZWQgYXMgaW5wdXQgZm9yIEFwcGxlJ3MgWGNvZGUgMyBpbnRlZ3JhdGVkIGRldmVsb3BtZW50CisjIGVudmlyb25tZW50IChzZWU6IGh0dHA6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL3Rvb2xzL3hjb2RlLyksIGludHJvZHVjZWQgd2l0aAorIyBPU1ggMTAuNSAoTGVvcGFyZCkuIFRvIGNyZWF0ZSBhIGRvY3VtZW50YXRpb24gc2V0LCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYQorIyBNYWtlZmlsZSBpbiB0aGUgSFRNTCBvdXRwdXQgZGlyZWN0b3J5LiBSdW5uaW5nIG1ha2Ugd2lsbCBwcm9kdWNlIHRoZSBkb2NzZXQgaW4KKyMgdGhhdCBkaXJlY3RvcnkgYW5kIHJ1bm5pbmcgbWFrZSBpbnN0YWxsIHdpbGwgaW5zdGFsbCB0aGUgZG9jc2V0IGluCisjIH4vTGlicmFyeS9EZXZlbG9wZXIvU2hhcmVkL0RvY3VtZW50YXRpb24vRG9jU2V0cyBzbyB0aGF0IFhjb2RlIHdpbGwgZmluZCBpdCBhdAorIyBzdGFydHVwLiBTZWUgaHR0cDovL2RldmVsb3Blci5hcHBsZS5jb20vdG9vbHMvY3JlYXRpbmdkb2NzZXRzd2l0aGRveHlnZW4uaHRtbAorIyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitHRU5FUkFURV9ET0NTRVQgICAgICAgID0gTk8KKworIyBUaGlzIHRhZyBkZXRlcm1pbmVzIHRoZSBuYW1lIG9mIHRoZSBkb2NzZXQgZmVlZC4gQSBkb2N1bWVudGF0aW9uIGZlZWQgcHJvdmlkZXMKKyMgYW4gdW1icmVsbGEgdW5kZXIgd2hpY2ggbXVsdGlwbGUgZG9jdW1lbnRhdGlvbiBzZXRzIGZyb20gYSBzaW5nbGUgcHJvdmlkZXIKKyMgKHN1Y2ggYXMgYSBjb21wYW55IG9yIHByb2R1Y3Qgc3VpdGUpIGNhbiBiZSBncm91cGVkLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogRG94eWdlbiBnZW5lcmF0ZWQgZG9jcy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0RPQ1NFVCBpcyBzZXQgdG8gWUVTLgorCitET0NTRVRfRkVFRE5BTUUgICAgICAgID0gIkRveHlnZW4gZ2VuZXJhdGVkIGRvY3MiCisKKyMgVGhpcyB0YWcgc3BlY2lmaWVzIGEgc3RyaW5nIHRoYXQgc2hvdWxkIHVuaXF1ZWx5IGlkZW50aWZ5IHRoZSBkb2N1bWVudGF0aW9uCisjIHNldCBidW5kbGUuIFRoaXMgc2hvdWxkIGJlIGEgcmV2ZXJzZSBkb21haW4tbmFtZSBzdHlsZSBzdHJpbmcsIGUuZy4KKyMgY29tLm15Y29tcGFueS5NeURvY1NldC4gRG94eWdlbiB3aWxsIGFwcGVuZCAuZG9jc2V0IHRvIHRoZSBuYW1lLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogb3JnLmRveHlnZW4uUHJvamVjdC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0RPQ1NFVCBpcyBzZXQgdG8gWUVTLgorCitET0NTRVRfQlVORExFX0lEICAgICAgID0gb3JnLmRveHlnZW4uUHJvamVjdAorCisjIFRoZSBET0NTRVRfUFVCTElTSEVSX0lEIHRhZyBzcGVjaWZpZXMgYSBzdHJpbmcgdGhhdCBzaG91bGQgdW5pcXVlbHkgaWRlbnRpZnkKKyMgdGhlIGRvY3VtZW50YXRpb24gcHVibGlzaGVyLiBUaGlzIHNob3VsZCBiZSBhIHJldmVyc2UgZG9tYWluLW5hbWUgc3R5bGUKKyMgc3RyaW5nLCBlLmcuIGNvbS5teWNvbXBhbnkuTXlEb2NTZXQuZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IG9yZy5kb3h5Z2VuLlB1Ymxpc2hlci4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0RPQ1NFVCBpcyBzZXQgdG8gWUVTLgorCitET0NTRVRfUFVCTElTSEVSX0lEICAgID0gb3JnLmRveHlnZW4uUHVibGlzaGVyCisKKyMgVGhlIERPQ1NFVF9QVUJMSVNIRVJfTkFNRSB0YWcgaWRlbnRpZmllcyB0aGUgZG9jdW1lbnRhdGlvbiBwdWJsaXNoZXIuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBQdWJsaXNoZXIuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9ET0NTRVQgaXMgc2V0IHRvIFlFUy4KKworRE9DU0VUX1BVQkxJU0hFUl9OQU1FICA9IFB1Ymxpc2hlcgorCisjIElmIHRoZSBHRU5FUkFURV9IVE1MSEVMUCB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gZ2VuZXJhdGVzIHRocmVlCisjIGFkZGl0aW9uYWwgSFRNTCBpbmRleCBmaWxlczogaW5kZXguaGhwLCBpbmRleC5oaGMsIGFuZCBpbmRleC5oaGsuIFRoZQorIyBpbmRleC5oaHAgaXMgYSBwcm9qZWN0IGZpbGUgdGhhdCBjYW4gYmUgcmVhZCBieSBNaWNyb3NvZnQncyBIVE1MIEhlbHAgV29ya3Nob3AKKyMgKHNlZTogaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL2VuLXVzL2Rvd25sb2FkL2RldGFpbHMuYXNweD9pZD0yMTEzOCkgb24KKyMgV2luZG93cy4KKyMKKyMgVGhlIEhUTUwgSGVscCBXb3Jrc2hvcCBjb250YWlucyBhIGNvbXBpbGVyIHRoYXQgY2FuIGNvbnZlcnQgYWxsIEhUTUwgb3V0cHV0CisjIGdlbmVyYXRlZCBieSBkb3h5Z2VuIGludG8gYSBzaW5nbGUgY29tcGlsZWQgSFRNTCBmaWxlICguY2htKS4gQ29tcGlsZWQgSFRNTAorIyBmaWxlcyBhcmUgbm93IHVzZWQgYXMgdGhlIFdpbmRvd3MgOTggaGVscCBmb3JtYXQsIGFuZCB3aWxsIHJlcGxhY2UgdGhlIG9sZAorIyBXaW5kb3dzIGhlbHAgZm9ybWF0ICguaGxwKSBvbiBhbGwgV2luZG93cyBwbGF0Zm9ybXMgaW4gdGhlIGZ1dHVyZS4gQ29tcHJlc3NlZAorIyBIVE1MIGZpbGVzIGFsc28gY29udGFpbiBhbiBpbmRleCwgYSB0YWJsZSBvZiBjb250ZW50cywgYW5kIHlvdSBjYW4gc2VhcmNoIGZvcgorIyB3b3JkcyBpbiB0aGUgZG9jdW1lbnRhdGlvbi4gVGhlIEhUTUwgd29ya3Nob3AgYWxzbyBjb250YWlucyBhIHZpZXdlciBmb3IKKyMgY29tcHJlc3NlZCBIVE1MIGZpbGVzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0dFTkVSQVRFX0hUTUxIRUxQICAgICAgPSBOTworCisjIFRoZSBDSE1fRklMRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgZmlsZSBuYW1lIG9mIHRoZSByZXN1bHRpbmcgLmNobQorIyBmaWxlLiBZb3UgY2FuIGFkZCBhIHBhdGggaW4gZnJvbnQgb2YgdGhlIGZpbGUgaWYgdGhlIHJlc3VsdCBzaG91bGQgbm90IGJlCisjIHdyaXR0ZW4gdG8gdGhlIGh0bWwgb3V0cHV0IGRpcmVjdG9yeS4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUxIRUxQIGlzIHNldCB0byBZRVMuCisKK0NITV9GSUxFICAgICAgICAgICAgICAgPSAKKworIyBUaGUgSEhDX0xPQ0FUSU9OIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBsb2NhdGlvbiAoYWJzb2x1dGUgcGF0aAorIyBpbmNsdWRpbmcgZmlsZSBuYW1lKSBvZiB0aGUgSFRNTCBoZWxwIGNvbXBpbGVyICggaGhjLmV4ZSkuIElmIG5vbi1lbXB0eQorIyBkb3h5Z2VuIHdpbGwgdHJ5IHRvIHJ1biB0aGUgSFRNTCBoZWxwIGNvbXBpbGVyIG9uIHRoZSBnZW5lcmF0ZWQgaW5kZXguaGhwLgorIyBUaGUgZmlsZSBoYXMgdG8gYmUgc3BlY2lmaWVkIHdpdGggZnVsbCBwYXRoLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTEhFTFAgaXMgc2V0IHRvIFlFUy4KKworSEhDX0xPQ0FUSU9OICAgICAgICAgICA9IAorCisjIFRoZSBHRU5FUkFURV9DSEkgZmxhZyBjb250cm9scyBpZiBhIHNlcGFyYXRlIC5jaGkgaW5kZXggZmlsZSBpcyBnZW5lcmF0ZWQgKAorIyBZRVMpIG9yIHRoYXQgaXQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBtYXN0ZXIgLmNobSBmaWxlICggTk8pLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MSEVMUCBpcyBzZXQgdG8gWUVTLgorCitHRU5FUkFURV9DSEkgICAgICAgICAgID0gTk8KKworIyBUaGUgQ0hNX0lOREVYX0VOQ09ESU5HIGlzIHVzZWQgdG8gZW5jb2RlIEh0bWxIZWxwIGluZGV4ICggaGhrKSwgY29udGVudCAoIGhoYykKKyMgYW5kIHByb2plY3QgZmlsZSBjb250ZW50LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTEhFTFAgaXMgc2V0IHRvIFlFUy4KKworQ0hNX0lOREVYX0VOQ09ESU5HICAgICA9IAorCisjIFRoZSBCSU5BUllfVE9DIGZsYWcgY29udHJvbHMgd2hldGhlciBhIGJpbmFyeSB0YWJsZSBvZiBjb250ZW50cyBpcyBnZW5lcmF0ZWQgKAorIyBZRVMpIG9yIGEgbm9ybWFsIHRhYmxlIG9mIGNvbnRlbnRzICggTk8pIGluIHRoZSAuY2htIGZpbGUuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUxIRUxQIGlzIHNldCB0byBZRVMuCisKK0JJTkFSWV9UT0MgICAgICAgICAgICAgPSBOTworCisjIFRoZSBUT0NfRVhQQU5EIGZsYWcgY2FuIGJlIHNldCB0byBZRVMgdG8gYWRkIGV4dHJhIGl0ZW1zIGZvciBncm91cCBtZW1iZXJzIHRvCisjIHRoZSB0YWJsZSBvZiBjb250ZW50cyBvZiB0aGUgSFRNTCBoZWxwIGRvY3VtZW50YXRpb24gYW5kIHRvIHRoZSB0cmVlIHZpZXcuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUxIRUxQIGlzIHNldCB0byBZRVMuCisKK1RPQ19FWFBBTkQgICAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBHRU5FUkFURV9RSFAgdGFnIGlzIHNldCB0byBZRVMgYW5kIGJvdGggUUhQX05BTUVTUEFDRSBhbmQKKyMgUUhQX1ZJUlRVQUxfRk9MREVSIGFyZSBzZXQsIGFuIGFkZGl0aW9uYWwgaW5kZXggZmlsZSB3aWxsIGJlIGdlbmVyYXRlZCB0aGF0CisjIGNhbiBiZSB1c2VkIGFzIGlucHV0IGZvciBRdCdzIHFoZWxwZ2VuZXJhdG9yIHRvIGdlbmVyYXRlIGEgUXQgQ29tcHJlc3NlZCBIZWxwCisjICgucWNoKSBvZiB0aGUgZ2VuZXJhdGVkIEhUTUwgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitHRU5FUkFURV9RSFAgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgUUhHX0xPQ0FUSU9OIHRhZyBpcyBzcGVjaWZpZWQsIHRoZSBRQ0hfRklMRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeQorIyB0aGUgZmlsZSBuYW1lIG9mIHRoZSByZXN1bHRpbmcgLnFjaCBmaWxlLiBUaGUgcGF0aCBzcGVjaWZpZWQgaXMgcmVsYXRpdmUgdG8KKyMgdGhlIEhUTUwgb3V0cHV0IGZvbGRlci4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1FIUCBpcyBzZXQgdG8gWUVTLgorCitRQ0hfRklMRSAgICAgICAgICAgICAgID0gCisKKyMgVGhlIFFIUF9OQU1FU1BBQ0UgdGFnIHNwZWNpZmllcyB0aGUgbmFtZXNwYWNlIHRvIHVzZSB3aGVuIGdlbmVyYXRpbmcgUXQgSGVscAorIyBQcm9qZWN0IG91dHB1dC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHNlZSBRdCBIZWxwIFByb2plY3QgLyBOYW1lc3BhY2UKKyMgKHNlZTogaHR0cDovL3F0LXByb2plY3Qub3JnL2RvYy9xdC00LjgvcXRoZWxwcHJvamVjdC5odG1sI25hbWVzcGFjZSkuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBvcmcuZG94eWdlbi5Qcm9qZWN0LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUUhQIGlzIHNldCB0byBZRVMuCisKK1FIUF9OQU1FU1BBQ0UgICAgICAgICAgPSBvcmcuZG94eWdlbi5Qcm9qZWN0CisKKyMgVGhlIFFIUF9WSVJUVUFMX0ZPTERFUiB0YWcgc3BlY2lmaWVzIHRoZSBuYW1lc3BhY2UgdG8gdXNlIHdoZW4gZ2VuZXJhdGluZyBRdAorIyBIZWxwIFByb2plY3Qgb3V0cHV0LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2Ugc2VlIFF0IEhlbHAgUHJvamVjdCAvIFZpcnR1YWwKKyMgRm9sZGVycyAoc2VlOiBodHRwOi8vcXQtcHJvamVjdC5vcmcvZG9jL3F0LTQuOC9xdGhlbHBwcm9qZWN0Lmh0bWwjdmlydHVhbC0KKyMgZm9sZGVycykuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBkb2MuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9RSFAgaXMgc2V0IHRvIFlFUy4KKworUUhQX1ZJUlRVQUxfRk9MREVSICAgICA9IGRvYworCisjIElmIHRoZSBRSFBfQ1VTVF9GSUxURVJfTkFNRSB0YWcgaXMgc2V0LCBpdCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYSBjdXN0b20KKyMgZmlsdGVyIHRvIGFkZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHNlZSBRdCBIZWxwIFByb2plY3QgLyBDdXN0b20KKyMgRmlsdGVycyAoc2VlOiBodHRwOi8vcXQtcHJvamVjdC5vcmcvZG9jL3F0LTQuOC9xdGhlbHBwcm9qZWN0Lmh0bWwjY3VzdG9tLQorIyBmaWx0ZXJzKS4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1FIUCBpcyBzZXQgdG8gWUVTLgorCitRSFBfQ1VTVF9GSUxURVJfTkFNRSAgID0gCisKKyMgVGhlIFFIUF9DVVNUX0ZJTFRFUl9BVFRSUyB0YWcgc3BlY2lmaWVzIHRoZSBsaXN0IG9mIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZQorIyBjdXN0b20gZmlsdGVyIHRvIGFkZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHNlZSBRdCBIZWxwIFByb2plY3QgLyBDdXN0b20KKyMgRmlsdGVycyAoc2VlOiBodHRwOi8vcXQtcHJvamVjdC5vcmcvZG9jL3F0LTQuOC9xdGhlbHBwcm9qZWN0Lmh0bWwjY3VzdG9tLQorIyBmaWx0ZXJzKS4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1FIUCBpcyBzZXQgdG8gWUVTLgorCitRSFBfQ1VTVF9GSUxURVJfQVRUUlMgID0gCisKKyMgVGhlIFFIUF9TRUNUX0ZJTFRFUl9BVFRSUyB0YWcgc3BlY2lmaWVzIHRoZSBsaXN0IG9mIHRoZSBhdHRyaWJ1dGVzIHRoaXMKKyMgcHJvamVjdCdzIGZpbHRlciBzZWN0aW9uIG1hdGNoZXMuIFF0IEhlbHAgUHJvamVjdCAvIEZpbHRlciBBdHRyaWJ1dGVzIChzZWU6CisjIGh0dHA6Ly9xdC1wcm9qZWN0Lm9yZy9kb2MvcXQtNC44L3F0aGVscHByb2plY3QuaHRtbCNmaWx0ZXItYXR0cmlidXRlcykuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9RSFAgaXMgc2V0IHRvIFlFUy4KKworUUhQX1NFQ1RfRklMVEVSX0FUVFJTICA9IAorCisjIFRoZSBRSEdfTE9DQVRJT04gdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGxvY2F0aW9uIG9mIFF0J3MKKyMgcWhlbHBnZW5lcmF0b3IuIElmIG5vbi1lbXB0eSBkb3h5Z2VuIHdpbGwgdHJ5IHRvIHJ1biBxaGVscGdlbmVyYXRvciBvbiB0aGUKKyMgZ2VuZXJhdGVkIC5xaHAgZmlsZS4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1FIUCBpcyBzZXQgdG8gWUVTLgorCitRSEdfTE9DQVRJT04gICAgICAgICAgID0gCisKKyMgSWYgdGhlIEdFTkVSQVRFX0VDTElQU0VIRUxQIHRhZyBpcyBzZXQgdG8gWUVTLCBhZGRpdGlvbmFsIGluZGV4IGZpbGVzIHdpbGwgYmUKKyMgZ2VuZXJhdGVkLCB0b2dldGhlciB3aXRoIHRoZSBIVE1MIGZpbGVzLCB0aGV5IGZvcm0gYW4gRWNsaXBzZSBoZWxwIHBsdWdpbi4gVG8KKyMgaW5zdGFsbCB0aGlzIHBsdWdpbiBhbmQgbWFrZSBpdCBhdmFpbGFibGUgdW5kZXIgdGhlIGhlbHAgY29udGVudHMgbWVudSBpbgorIyBFY2xpcHNlLCB0aGUgY29udGVudHMgb2YgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBIVE1MIGFuZCBYTUwgZmlsZXMgbmVlZHMKKyMgdG8gYmUgY29waWVkIGludG8gdGhlIHBsdWdpbnMgZGlyZWN0b3J5IG9mIGVjbGlwc2UuIFRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkKKyMgd2l0aGluIHRoZSBwbHVnaW5zIGRpcmVjdG9yeSBzaG91bGQgYmUgdGhlIHNhbWUgYXMgdGhlIEVDTElQU0VfRE9DX0lEIHZhbHVlLgorIyBBZnRlciBjb3B5aW5nIEVjbGlwc2UgbmVlZHMgdG8gYmUgcmVzdGFydGVkIGJlZm9yZSB0aGUgaGVscCBhcHBlYXJzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0dFTkVSQVRFX0VDTElQU0VIRUxQICAgPSBOTworCisjIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBFY2xpcHNlIGhlbHAgcGx1Z2luLiBXaGVuIGluc3RhbGxpbmcgdGhlIHBsdWdpbgorIyB0aGUgZGlyZWN0b3J5IG5hbWUgY29udGFpbmluZyB0aGUgSFRNTCBhbmQgWE1MIGZpbGVzIHNob3VsZCBhbHNvIGhhdmUgdGhpcworIyBuYW1lLiBFYWNoIGRvY3VtZW50YXRpb24gc2V0IHNob3VsZCBoYXZlIGl0cyBvd24gaWRlbnRpZmllci4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IG9yZy5kb3h5Z2VuLlByb2plY3QuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9FQ0xJUFNFSEVMUCBpcyBzZXQgdG8gWUVTLgorCitFQ0xJUFNFX0RPQ19JRCAgICAgICAgID0gb3JnLmRveHlnZW4uUHJvamVjdAorCisjIElmIHlvdSB3YW50IGZ1bGwgY29udHJvbCBvdmVyIHRoZSBsYXlvdXQgb2YgdGhlIGdlbmVyYXRlZCBIVE1MIHBhZ2VzIGl0IG1pZ2h0CisjIGJlIG5lY2Vzc2FyeSB0byBkaXNhYmxlIHRoZSBpbmRleCBhbmQgcmVwbGFjZSBpdCB3aXRoIHlvdXIgb3duLiBUaGUKKyMgRElTQUJMRV9JTkRFWCB0YWcgY2FuIGJlIHVzZWQgdG8gdHVybiBvbi9vZmYgdGhlIGNvbmRlbnNlZCBpbmRleCAodGFicykgYXQgdG9wCisjIG9mIGVhY2ggSFRNTCBwYWdlLiBBIHZhbHVlIG9mIE5PIGVuYWJsZXMgdGhlIGluZGV4IGFuZCB0aGUgdmFsdWUgWUVTIGRpc2FibGVzCisjIGl0LiBTaW5jZSB0aGUgdGFicyBpbiB0aGUgaW5kZXggY29udGFpbiB0aGUgc2FtZSBpbmZvcm1hdGlvbiBhcyB0aGUgbmF2aWdhdGlvbgorIyB0cmVlLCB5b3UgY2FuIHNldCB0aGlzIG9wdGlvbiB0byBZRVMgaWYgeW91IGFsc28gc2V0IEdFTkVSQVRFX1RSRUVWSUVXIHRvIFlFUy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitESVNBQkxFX0lOREVYICAgICAgICAgID0gTk8KKworIyBUaGUgR0VORVJBVEVfVFJFRVZJRVcgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGV0aGVyIGEgdHJlZS1saWtlIGluZGV4CisjIHN0cnVjdHVyZSBzaG91bGQgYmUgZ2VuZXJhdGVkIHRvIGRpc3BsYXkgaGllcmFyY2hpY2FsIGluZm9ybWF0aW9uLiBJZiB0aGUgdGFnCisjIHZhbHVlIGlzIHNldCB0byBZRVMsIGEgc2lkZSBwYW5lbCB3aWxsIGJlIGdlbmVyYXRlZCBjb250YWluaW5nIGEgdHJlZS1saWtlCisjIGluZGV4IHN0cnVjdHVyZSAoanVzdCBsaWtlIHRoZSBvbmUgdGhhdCBpcyBnZW5lcmF0ZWQgZm9yIEhUTUwgSGVscCkuIEZvciB0aGlzCisjIHRvIHdvcmsgYSBicm93c2VyIHRoYXQgc3VwcG9ydHMgSmF2YVNjcmlwdCwgREhUTUwsIENTUyBhbmQgZnJhbWVzIGlzIHJlcXVpcmVkCisjIChpLmUuIGFueSBtb2Rlcm4gYnJvd3NlcikuIFdpbmRvd3MgdXNlcnMgYXJlIHByb2JhYmx5IGJldHRlciBvZmYgdXNpbmcgdGhlCisjIEhUTUwgaGVscCBmZWF0dXJlLiBWaWEgY3VzdG9tIHN0eWxlc2hlZXRzIChzZWUgSFRNTF9FWFRSQV9TVFlMRVNIRUVUKSBvbmUgY2FuCisjIGZ1cnRoZXIgZmluZS10dW5lIHRoZSBsb29rIG9mIHRoZSBpbmRleC4gQXMgYW4gZXhhbXBsZSwgdGhlIGRlZmF1bHQgc3R5bGUKKyMgc2hlZXQgZ2VuZXJhdGVkIGJ5IGRveHlnZW4gaGFzIGFuIGV4YW1wbGUgdGhhdCBzaG93cyBob3cgdG8gcHV0IGFuIGltYWdlIGF0CisjIHRoZSByb290IG9mIHRoZSB0cmVlIGluc3RlYWQgb2YgdGhlIFBST0pFQ1RfTkFNRS4gU2luY2UgdGhlIHRyZWUgYmFzaWNhbGx5IGhhcworIyB0aGUgc2FtZSBpbmZvcm1hdGlvbiBhcyB0aGUgdGFiIGluZGV4LCB5b3UgY291bGQgY29uc2lkZXIgc2V0dGluZworIyBESVNBQkxFX0lOREVYIHRvIFlFUyB3aGVuIGVuYWJsaW5nIHRoaXMgb3B0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0dFTkVSQVRFX1RSRUVWSUVXICAgICAgPSBOTworCisjIFRoZSBFTlVNX1ZBTFVFU19QRVJfTElORSB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBudW1iZXIgb2YgZW51bSB2YWx1ZXMgdGhhdAorIyBkb3h5Z2VuIHdpbGwgZ3JvdXAgb24gb25lIGxpbmUgaW4gdGhlIGdlbmVyYXRlZCBIVE1MIGRvY3VtZW50YXRpb24uCisjCisjIE5vdGUgdGhhdCBhIHZhbHVlIG9mIDAgd2lsbCBjb21wbGV0ZWx5IHN1cHByZXNzIHRoZSBlbnVtIHZhbHVlcyBmcm9tIGFwcGVhcmluZworIyBpbiB0aGUgb3ZlcnZpZXcgc2VjdGlvbi4KKyMgTWluaW11bSB2YWx1ZTogMCwgbWF4aW11bSB2YWx1ZTogMjAsIGRlZmF1bHQgdmFsdWU6IDQuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0VOVU1fVkFMVUVTX1BFUl9MSU5FICAgPSA0CisKKyMgSWYgdGhlIHRyZWV2aWV3IGlzIGVuYWJsZWQgKHNlZSBHRU5FUkFURV9UUkVFVklFVykgdGhlbiB0aGlzIHRhZyBjYW4gYmUgdXNlZAorIyB0byBzZXQgdGhlIGluaXRpYWwgd2lkdGggKGluIHBpeGVscykgb2YgdGhlIGZyYW1lIGluIHdoaWNoIHRoZSB0cmVlIGlzIHNob3duLgorIyBNaW5pbXVtIHZhbHVlOiAwLCBtYXhpbXVtIHZhbHVlOiAxNTAwLCBkZWZhdWx0IHZhbHVlOiAyNTAuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK1RSRUVWSUVXX1dJRFRIICAgICAgICAgPSAyNTAKKworIyBXaGVuIHRoZSBFWFRfTElOS1NfSU5fV0lORE9XIG9wdGlvbiBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBvcGVuIGxpbmtzIHRvCisjIGV4dGVybmFsIHN5bWJvbHMgaW1wb3J0ZWQgdmlhIHRhZyBmaWxlcyBpbiBhIHNlcGFyYXRlIHdpbmRvdy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitFWFRfTElOS1NfSU5fV0lORE9XICAgID0gTk8KKworIyBVc2UgdGhpcyB0YWcgdG8gY2hhbmdlIHRoZSBmb250IHNpemUgb2YgTGFUZVggZm9ybXVsYXMgaW5jbHVkZWQgYXMgaW1hZ2VzIGluCisjIHRoZSBIVE1MIGRvY3VtZW50YXRpb24uIFdoZW4geW91IGNoYW5nZSB0aGUgZm9udCBzaXplIGFmdGVyIGEgc3VjY2Vzc2Z1bAorIyBkb3h5Z2VuIHJ1biB5b3UgbmVlZCB0byBtYW51YWxseSByZW1vdmUgYW55IGZvcm1fKi5wbmcgaW1hZ2VzIGZyb20gdGhlIEhUTUwKKyMgb3V0cHV0IGRpcmVjdG9yeSB0byBmb3JjZSB0aGVtIHRvIGJlIHJlZ2VuZXJhdGVkLgorIyBNaW5pbXVtIHZhbHVlOiA4LCBtYXhpbXVtIHZhbHVlOiA1MCwgZGVmYXVsdCB2YWx1ZTogMTAuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0ZPUk1VTEFfRk9OVFNJWkUgICAgICAgPSAxMAorCisjIFVzZSB0aGUgRk9STVVMQV9UUkFOUEFSRU5UIHRhZyB0byBkZXRlcm1pbmUgd2hldGhlciBvciBub3QgdGhlIGltYWdlcworIyBnZW5lcmF0ZWQgZm9yIGZvcm11bGFzIGFyZSB0cmFuc3BhcmVudCBQTkdzLiBUcmFuc3BhcmVudCBQTkdzIGFyZSBub3QKKyMgc3VwcG9ydGVkIHByb3Blcmx5IGZvciBJRSA2LjAsIGJ1dCBhcmUgc3VwcG9ydGVkIG9uIGFsbCBtb2Rlcm4gYnJvd3NlcnMuCisjCisjIE5vdGUgdGhhdCB3aGVuIGNoYW5naW5nIHRoaXMgb3B0aW9uIHlvdSBuZWVkIHRvIGRlbGV0ZSBhbnkgZm9ybV8qLnBuZyBmaWxlcyBpbgorIyB0aGUgSFRNTCBvdXRwdXQgZGlyZWN0b3J5IGJlZm9yZSB0aGUgY2hhbmdlcyBoYXZlIGVmZmVjdC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworRk9STVVMQV9UUkFOU1BBUkVOVCAgICA9IFlFUworCisjIEVuYWJsZSB0aGUgVVNFX01BVEhKQVggb3B0aW9uIHRvIHJlbmRlciBMYVRlWCBmb3JtdWxhcyB1c2luZyBNYXRoSmF4IChzZWUKKyMgaHR0cDovL3d3dy5tYXRoamF4Lm9yZykgd2hpY2ggdXNlcyBjbGllbnQgc2lkZSBKYXZhc2NyaXB0IGZvciB0aGUgcmVuZGVyaW5nCisjIGluc3RlYWQgb2YgdXNpbmcgcHJlcmVuZGVyZWQgYml0bWFwcy4gVXNlIHRoaXMgaWYgeW91IGRvIG5vdCBoYXZlIExhVGVYCisjIGluc3RhbGxlZCBvciBpZiB5b3Ugd2FudCB0byBmb3JtdWxhcyBsb29rIHByZXR0aWVyIGluIHRoZSBIVE1MIG91dHB1dC4gV2hlbgorIyBlbmFibGVkIHlvdSBtYXkgYWxzbyBuZWVkIHRvIGluc3RhbGwgTWF0aEpheCBzZXBhcmF0ZWx5IGFuZCBjb25maWd1cmUgdGhlIHBhdGgKKyMgdG8gaXQgdXNpbmcgdGhlIE1BVEhKQVhfUkVMUEFUSCBvcHRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworVVNFX01BVEhKQVggICAgICAgICAgICA9IE5PCisKKyMgV2hlbiBNYXRoSmF4IGlzIGVuYWJsZWQgeW91IGNhbiBzZXQgdGhlIGRlZmF1bHQgb3V0cHV0IGZvcm1hdCB0byBiZSB1c2VkIGZvcgorIyB0aGUgTWF0aEpheCBvdXRwdXQuIFNlZSB0aGUgTWF0aEpheCBzaXRlIChzZWU6CisjIGh0dHA6Ly9kb2NzLm1hdGhqYXgub3JnL2VuL2xhdGVzdC9vdXRwdXQuaHRtbCkgZm9yIG1vcmUgZGV0YWlscy4KKyMgUG9zc2libGUgdmFsdWVzIGFyZTogSFRNTC1DU1MgKHdoaWNoIGlzIHNsb3dlciwgYnV0IGhhcyB0aGUgYmVzdAorIyBjb21wYXRpYmlsaXR5KSwgTmF0aXZlTU1MIChpLmUuIE1hdGhNTCkgYW5kIFNWRy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IEhUTUwtQ1NTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgVVNFX01BVEhKQVggaXMgc2V0IHRvIFlFUy4KKworTUFUSEpBWF9GT1JNQVQgICAgICAgICA9IEhUTUwtQ1NTCisKKyMgV2hlbiBNYXRoSmF4IGlzIGVuYWJsZWQgeW91IG5lZWQgdG8gc3BlY2lmeSB0aGUgbG9jYXRpb24gcmVsYXRpdmUgdG8gdGhlIEhUTUwKKyMgb3V0cHV0IGRpcmVjdG9yeSB1c2luZyB0aGUgTUFUSEpBWF9SRUxQQVRIIG9wdGlvbi4gVGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeQorIyBzaG91bGQgY29udGFpbiB0aGUgTWF0aEpheC5qcyBzY3JpcHQuIEZvciBpbnN0YW5jZSwgaWYgdGhlIG1hdGhqYXggZGlyZWN0b3J5CisjIGlzIGxvY2F0ZWQgYXQgdGhlIHNhbWUgbGV2ZWwgYXMgdGhlIEhUTUwgb3V0cHV0IGRpcmVjdG9yeSwgdGhlbgorIyBNQVRISkFYX1JFTFBBVEggc2hvdWxkIGJlIC4uL21hdGhqYXguIFRoZSBkZWZhdWx0IHZhbHVlIHBvaW50cyB0byB0aGUgTWF0aEpheAorIyBDb250ZW50IERlbGl2ZXJ5IE5ldHdvcmsgc28geW91IGNhbiBxdWlja2x5IHNlZSB0aGUgcmVzdWx0IHdpdGhvdXQgaW5zdGFsbGluZworIyBNYXRoSmF4LiBIb3dldmVyLCBpdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB0byBpbnN0YWxsIGEgbG9jYWwgY29weSBvZgorIyBNYXRoSmF4IGZyb20gaHR0cDovL3d3dy5tYXRoamF4Lm9yZyBiZWZvcmUgZGVwbG95bWVudC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IGh0dHA6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBVU0VfTUFUSEpBWCBpcyBzZXQgdG8gWUVTLgorCitNQVRISkFYX1JFTFBBVEggICAgICAgID0gaHR0cDovL2Nkbi5tYXRoamF4Lm9yZy9tYXRoamF4L2xhdGVzdAorCisjIFRoZSBNQVRISkFYX0VYVEVOU0lPTlMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgTWF0aEpheAorIyBleHRlbnNpb24gbmFtZXMgdGhhdCBzaG91bGQgYmUgZW5hYmxlZCBkdXJpbmcgTWF0aEpheCByZW5kZXJpbmcuIEZvciBleGFtcGxlCisjIE1BVEhKQVhfRVhURU5TSU9OUyA9IFRlWC9BTVNtYXRoIFRlWC9BTVNzeW1ib2xzCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBVU0VfTUFUSEpBWCBpcyBzZXQgdG8gWUVTLgorCitNQVRISkFYX0VYVEVOU0lPTlMgICAgID0gCisKKyMgVGhlIE1BVEhKQVhfQ09ERUZJTEUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBmaWxlIHdpdGggamF2YXNjcmlwdCBwaWVjZXMKKyMgb2YgY29kZSB0aGF0IHdpbGwgYmUgdXNlZCBvbiBzdGFydHVwIG9mIHRoZSBNYXRoSmF4IGNvZGUuIFNlZSB0aGUgTWF0aEpheCBzaXRlCisjIChzZWU6IGh0dHA6Ly9kb2NzLm1hdGhqYXgub3JnL2VuL2xhdGVzdC9vdXRwdXQuaHRtbCkgZm9yIG1vcmUgZGV0YWlscy4gRm9yIGFuCisjIGV4YW1wbGUgc2VlIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgVVNFX01BVEhKQVggaXMgc2V0IHRvIFlFUy4KKworTUFUSEpBWF9DT0RFRklMRSAgICAgICA9IAorCisjIFdoZW4gdGhlIFNFQVJDSEVOR0lORSB0YWcgaXMgZW5hYmxlZCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBzZWFyY2ggYm94IGZvcgorIyB0aGUgSFRNTCBvdXRwdXQuIFRoZSB1bmRlcmx5aW5nIHNlYXJjaCBlbmdpbmUgdXNlcyBqYXZhc2NyaXB0IGFuZCBESFRNTCBhbmQKKyMgc2hvdWxkIHdvcmsgb24gYW55IG1vZGVybiBicm93c2VyLiBOb3RlIHRoYXQgd2hlbiB1c2luZyBIVE1MIGhlbHAKKyMgKEdFTkVSQVRFX0hUTUxIRUxQKSwgUXQgaGVscCAoR0VORVJBVEVfUUhQKSwgb3IgZG9jc2V0cyAoR0VORVJBVEVfRE9DU0VUKQorIyB0aGVyZSBpcyBhbHJlYWR5IGEgc2VhcmNoIGZ1bmN0aW9uIHNvIHRoaXMgb25lIHNob3VsZCB0eXBpY2FsbHkgYmUgZGlzYWJsZWQuCisjIEZvciBsYXJnZSBwcm9qZWN0cyB0aGUgamF2YXNjcmlwdCBiYXNlZCBzZWFyY2ggZW5naW5lIGNhbiBiZSBzbG93LCB0aGVuCisjIGVuYWJsaW5nIFNFUlZFUl9CQVNFRF9TRUFSQ0ggbWF5IHByb3ZpZGUgYSBiZXR0ZXIgc29sdXRpb24uIEl0IGlzIHBvc3NpYmxlIHRvCisjIHNlYXJjaCB1c2luZyB0aGUga2V5Ym9hcmQ7IHRvIGp1bXAgdG8gdGhlIHNlYXJjaCBib3ggdXNlIDxhY2Nlc3Mga2V5PiArIFMKKyMgKHdoYXQgdGhlIDxhY2Nlc3Mga2V5PiBpcyBkZXBlbmRzIG9uIHRoZSBPUyBhbmQgYnJvd3NlciwgYnV0IGl0IGlzIHR5cGljYWxseQorIyA8Q1RSTD4sIDxBTFQ+LzxvcHRpb24+LCBvciBib3RoKS4gSW5zaWRlIHRoZSBzZWFyY2ggYm94IHVzZSB0aGUgPGN1cnNvciBkb3duCisjIGtleT4gdG8ganVtcCBpbnRvIHRoZSBzZWFyY2ggcmVzdWx0cyB3aW5kb3csIHRoZSByZXN1bHRzIGNhbiBiZSBuYXZpZ2F0ZWQKKyMgdXNpbmcgdGhlIDxjdXJzb3Iga2V5cz4uIFByZXNzIDxFbnRlcj4gdG8gc2VsZWN0IGFuIGl0ZW0gb3IgPGVzY2FwZT4gdG8gY2FuY2VsCisjIHRoZSBzZWFyY2guIFRoZSBmaWx0ZXIgb3B0aW9ucyBjYW4gYmUgc2VsZWN0ZWQgd2hlbiB0aGUgY3Vyc29yIGlzIGluc2lkZSB0aGUKKyMgc2VhcmNoIGJveCBieSBwcmVzc2luZyA8U2hpZnQ+KzxjdXJzb3IgZG93bj4uIEFsc28gaGVyZSB1c2UgdGhlIDxjdXJzb3Iga2V5cz4KKyMgdG8gc2VsZWN0IGEgZmlsdGVyIGFuZCA8RW50ZXI+IG9yIDxlc2NhcGU+IHRvIGFjdGl2YXRlIG9yIGNhbmNlbCB0aGUgZmlsdGVyCisjIG9wdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworU0VBUkNIRU5HSU5FICAgICAgICAgICA9IFlFUworCisjIFdoZW4gdGhlIFNFUlZFUl9CQVNFRF9TRUFSQ0ggdGFnIGlzIGVuYWJsZWQgdGhlIHNlYXJjaCBlbmdpbmUgd2lsbCBiZQorIyBpbXBsZW1lbnRlZCB1c2luZyBhIHdlYiBzZXJ2ZXIgaW5zdGVhZCBvZiBhIHdlYiBjbGllbnQgdXNpbmcgSmF2YXNjcmlwdC4gVGhlcmUKKyMgYXJlIHR3byBmbGF2b3VycyBvZiB3ZWIgc2VydmVyIGJhc2VkIHNlYXJjaGluZyBkZXBlbmRpbmcgb24gdGhlCisjIEVYVEVSTkFMX1NFQVJDSCBzZXR0aW5nLiBXaGVuIGRpc2FibGVkLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBQSFAgc2NyaXB0IGZvcgorIyBzZWFyY2hpbmcgYW5kIGFuIGluZGV4IGZpbGUgdXNlZCBieSB0aGUgc2NyaXB0LiBXaGVuIEVYVEVSTkFMX1NFQVJDSCBpcworIyBlbmFibGVkIHRoZSBpbmRleGluZyBhbmQgc2VhcmNoaW5nIG5lZWRzIHRvIGJlIHByb3ZpZGVkIGJ5IGV4dGVybmFsIHRvb2xzLiBTZWUKKyMgdGhlIHNlY3Rpb24gIkV4dGVybmFsIEluZGV4aW5nIGFuZCBTZWFyY2hpbmciIGZvciBkZXRhaWxzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBTRUFSQ0hFTkdJTkUgaXMgc2V0IHRvIFlFUy4KKworU0VSVkVSX0JBU0VEX1NFQVJDSCAgICA9IE5PCisKKyMgV2hlbiBFWFRFUk5BTF9TRUFSQ0ggdGFnIGlzIGVuYWJsZWQgZG94eWdlbiB3aWxsIG5vIGxvbmdlciBnZW5lcmF0ZSB0aGUgUEhQCisjIHNjcmlwdCBmb3Igc2VhcmNoaW5nLiBJbnN0ZWFkIHRoZSBzZWFyY2ggcmVzdWx0cyBhcmUgd3JpdHRlbiB0byBhbiBYTUwgZmlsZQorIyB3aGljaCBuZWVkcyB0byBiZSBwcm9jZXNzZWQgYnkgYW4gZXh0ZXJuYWwgaW5kZXhlci4gRG94eWdlbiB3aWxsIGludm9rZSBhbgorIyBleHRlcm5hbCBzZWFyY2ggZW5naW5lIHBvaW50ZWQgdG8gYnkgdGhlIFNFQVJDSEVOR0lORV9VUkwgb3B0aW9uIHRvIG9idGFpbiB0aGUKKyMgc2VhcmNoIHJlc3VsdHMuCisjCisjIERveHlnZW4gc2hpcHMgd2l0aCBhbiBleGFtcGxlIGluZGV4ZXIgKCBkb3h5aW5kZXhlcikgYW5kIHNlYXJjaCBlbmdpbmUKKyMgKGRveHlzZWFyY2guY2dpKSB3aGljaCBhcmUgYmFzZWQgb24gdGhlIG9wZW4gc291cmNlIHNlYXJjaCBlbmdpbmUgbGlicmFyeQorIyBYYXBpYW4gKHNlZTogaHR0cDovL3hhcGlhbi5vcmcvKS4KKyMKKyMgU2VlIHRoZSBzZWN0aW9uICJFeHRlcm5hbCBJbmRleGluZyBhbmQgU2VhcmNoaW5nIiBmb3IgZGV0YWlscy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgU0VBUkNIRU5HSU5FIGlzIHNldCB0byBZRVMuCisKK0VYVEVSTkFMX1NFQVJDSCAgICAgICAgPSBOTworCisjIFRoZSBTRUFSQ0hFTkdJTkVfVVJMIHNob3VsZCBwb2ludCB0byBhIHNlYXJjaCBlbmdpbmUgaG9zdGVkIGJ5IGEgd2ViIHNlcnZlcgorIyB3aGljaCB3aWxsIHJldHVybiB0aGUgc2VhcmNoIHJlc3VsdHMgd2hlbiBFWFRFUk5BTF9TRUFSQ0ggaXMgZW5hYmxlZC4KKyMKKyMgRG94eWdlbiBzaGlwcyB3aXRoIGFuIGV4YW1wbGUgaW5kZXhlciAoIGRveHlpbmRleGVyKSBhbmQgc2VhcmNoIGVuZ2luZQorIyAoZG94eXNlYXJjaC5jZ2kpIHdoaWNoIGFyZSBiYXNlZCBvbiB0aGUgb3BlbiBzb3VyY2Ugc2VhcmNoIGVuZ2luZSBsaWJyYXJ5CisjIFhhcGlhbiAoc2VlOiBodHRwOi8veGFwaWFuLm9yZy8pLiBTZWUgdGhlIHNlY3Rpb24gIkV4dGVybmFsIEluZGV4aW5nIGFuZAorIyBTZWFyY2hpbmciIGZvciBkZXRhaWxzLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgU0VBUkNIRU5HSU5FIGlzIHNldCB0byBZRVMuCisKK1NFQVJDSEVOR0lORV9VUkwgICAgICAgPSAKKworIyBXaGVuIFNFUlZFUl9CQVNFRF9TRUFSQ0ggYW5kIEVYVEVSTkFMX1NFQVJDSCBhcmUgYm90aCBlbmFibGVkIHRoZSB1bmluZGV4ZWQKKyMgc2VhcmNoIGRhdGEgaXMgd3JpdHRlbiB0byBhIGZpbGUgZm9yIGluZGV4aW5nIGJ5IGFuIGV4dGVybmFsIHRvb2wuIFdpdGggdGhlCisjIFNFQVJDSERBVEFfRklMRSB0YWcgdGhlIG5hbWUgb2YgdGhpcyBmaWxlIGNhbiBiZSBzcGVjaWZpZWQuCisjIFRoZSBkZWZhdWx0IGZpbGUgaXM6IHNlYXJjaGRhdGEueG1sLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgU0VBUkNIRU5HSU5FIGlzIHNldCB0byBZRVMuCisKK1NFQVJDSERBVEFfRklMRSAgICAgICAgPSBzZWFyY2hkYXRhLnhtbAorCisjIFdoZW4gU0VSVkVSX0JBU0VEX1NFQVJDSCBhbmQgRVhURVJOQUxfU0VBUkNIIGFyZSBib3RoIGVuYWJsZWQgdGhlCisjIEVYVEVSTkFMX1NFQVJDSF9JRCB0YWcgY2FuIGJlIHVzZWQgYXMgYW4gaWRlbnRpZmllciBmb3IgdGhlIHByb2plY3QuIFRoaXMgaXMKKyMgdXNlZnVsIGluIGNvbWJpbmF0aW9uIHdpdGggRVhUUkFfU0VBUkNIX01BUFBJTkdTIHRvIHNlYXJjaCB0aHJvdWdoIG11bHRpcGxlCisjIHByb2plY3RzIGFuZCByZWRpcmVjdCB0aGUgcmVzdWx0cyBiYWNrIHRvIHRoZSByaWdodCBwcm9qZWN0LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgU0VBUkNIRU5HSU5FIGlzIHNldCB0byBZRVMuCisKK0VYVEVSTkFMX1NFQVJDSF9JRCAgICAgPSAKKworIyBUaGUgRVhUUkFfU0VBUkNIX01BUFBJTkdTIHRhZyBjYW4gYmUgdXNlZCB0byBlbmFibGUgc2VhcmNoaW5nIHRocm91Z2ggZG94eWdlbgorIyBwcm9qZWN0cyBvdGhlciB0aGFuIHRoZSBvbmUgZGVmaW5lZCBieSB0aGlzIGNvbmZpZ3VyYXRpb24gZmlsZSwgYnV0IHRoYXQgYXJlCisjIGFsbCBhZGRlZCB0byB0aGUgc2FtZSBleHRlcm5hbCBzZWFyY2ggaW5kZXguIEVhY2ggcHJvamVjdCBuZWVkcyB0byBoYXZlIGEKKyMgdW5pcXVlIGlkIHNldCB2aWEgRVhURVJOQUxfU0VBUkNIX0lELiBUaGUgc2VhcmNoIG1hcHBpbmcgdGhlbiBtYXBzIHRoZSBpZCBvZgorIyB0byBhIHJlbGF0aXZlIGxvY2F0aW9uIHdoZXJlIHRoZSBkb2N1bWVudGF0aW9uIGNhbiBiZSBmb3VuZC4gVGhlIGZvcm1hdCBpczoKKyMgRVhUUkFfU0VBUkNIX01BUFBJTkdTID0gdGFnbmFtZTE9bG9jMSB0YWduYW1lMj1sb2MyIC4uLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgU0VBUkNIRU5HSU5FIGlzIHNldCB0byBZRVMuCisKK0VYVFJBX1NFQVJDSF9NQVBQSU5HUyAgPSAKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgTGFUZVggb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEdFTkVSQVRFX0xBVEVYIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBMYVRlWCBvdXRwdXQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0dFTkVSQVRFX0xBVEVYICAgICAgICAgPSBZRVMKKworIyBUaGUgTEFURVhfT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIExhVGVYIGRvY3Mgd2lsbCBiZSBwdXQuIElmIGEKKyMgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkIHRoZSB2YWx1ZSBvZiBPVVRQVVRfRElSRUNUT1JZIHdpbGwgYmUgcHV0IGluIGZyb250IG9mCisjIGl0LgorIyBUaGUgZGVmYXVsdCBkaXJlY3RvcnkgaXM6IGxhdGV4LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworTEFURVhfT1VUUFVUICAgICAgICAgICA9IGxhdGV4CisKKyMgVGhlIExBVEVYX0NNRF9OQU1FIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBMYVRlWCBjb21tYW5kIG5hbWUgdG8gYmUKKyMgaW52b2tlZC4KKyMKKyMgTm90ZSB0aGF0IHdoZW4gZW5hYmxpbmcgVVNFX1BERkxBVEVYIHRoaXMgb3B0aW9uIGlzIG9ubHkgdXNlZCBmb3IgZ2VuZXJhdGluZworIyBiaXRtYXBzIGZvciBmb3JtdWxhcyBpbiB0aGUgSFRNTCBvdXRwdXQsIGJ1dCBub3QgaW4gdGhlIE1ha2VmaWxlIHRoYXQgaXMKKyMgd3JpdHRlbiB0byB0aGUgb3V0cHV0IGRpcmVjdG9yeS4KKyMgVGhlIGRlZmF1bHQgZmlsZSBpczogbGF0ZXguCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitMQVRFWF9DTURfTkFNRSAgICAgICAgID0gbGF0ZXgKKworIyBUaGUgTUFLRUlOREVYX0NNRF9OQU1FIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBjb21tYW5kIG5hbWUgdG8gZ2VuZXJhdGUKKyMgaW5kZXggZm9yIExhVGVYLgorIyBUaGUgZGVmYXVsdCBmaWxlIGlzOiBtYWtlaW5kZXguCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitNQUtFSU5ERVhfQ01EX05BTUUgICAgID0gbWFrZWluZGV4CisKKyMgSWYgdGhlIENPTVBBQ1RfTEFURVggdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiBnZW5lcmF0ZXMgbW9yZSBjb21wYWN0IExhVGVYCisjIGRvY3VtZW50cy4gVGhpcyBtYXkgYmUgdXNlZnVsIGZvciBzbWFsbCBwcm9qZWN0cyBhbmQgbWF5IGhlbHAgdG8gc2F2ZSBzb21lCisjIHRyZWVzIGluIGdlbmVyYWwuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK0NPTVBBQ1RfTEFURVggICAgICAgICAgPSBOTworCisjIFRoZSBQQVBFUl9UWVBFIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIHBhcGVyIHR5cGUgdGhhdCBpcyB1c2VkIGJ5IHRoZQorIyBwcmludGVyLgorIyBQb3NzaWJsZSB2YWx1ZXMgYXJlOiBhNCAoMjEwIHggMjk3IG1tKSwgbGV0dGVyICg4LjUgeCAxMSBpbmNoZXMpLCBsZWdhbCAoOC41IHgKKyMgMTQgaW5jaGVzKSBhbmQgZXhlY3V0aXZlICg3LjI1IHggMTAuNSBpbmNoZXMpLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogYTQuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitQQVBFUl9UWVBFICAgICAgICAgICAgID0gYTQKKworIyBUaGUgRVhUUkFfUEFDS0FHRVMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgTGFUZVggcGFja2FnZSBuYW1lcworIyB0aGF0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgTGFUZVggb3V0cHV0LiBUbyBnZXQgdGhlIHRpbWVzIGZvbnQgZm9yCisjIGluc3RhbmNlIHlvdSBjYW4gc3BlY2lmeQorIyBFWFRSQV9QQUNLQUdFUz10aW1lcworIyBJZiBsZWZ0IGJsYW5rIG5vIGV4dHJhIHBhY2thZ2VzIHdpbGwgYmUgaW5jbHVkZWQuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitFWFRSQV9QQUNLQUdFUyAgICAgICAgID0gCisKKyMgVGhlIExBVEVYX0hFQURFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHBlcnNvbmFsIExhVGVYIGhlYWRlciBmb3IgdGhlCisjIGdlbmVyYXRlZCBMYVRlWCBkb2N1bWVudC4gVGhlIGhlYWRlciBzaG91bGQgY29udGFpbiBldmVyeXRoaW5nIHVudGlsIHRoZSBmaXJzdAorIyBjaGFwdGVyLiBJZiBpdCBpcyBsZWZ0IGJsYW5rIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIHN0YW5kYXJkIGhlYWRlci4gU2VlCisjIHNlY3Rpb24gIkRveHlnZW4gdXNhZ2UiIGZvciBpbmZvcm1hdGlvbiBvbiBob3cgdG8gbGV0IGRveHlnZW4gd3JpdGUgdGhlCisjIGRlZmF1bHQgaGVhZGVyIHRvIGEgc2VwYXJhdGUgZmlsZS4KKyMKKyMgTm90ZTogT25seSB1c2UgYSB1c2VyLWRlZmluZWQgaGVhZGVyIGlmIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZyEgVGhlCisjIGZvbGxvd2luZyBjb21tYW5kcyBoYXZlIGEgc3BlY2lhbCBtZWFuaW5nIGluc2lkZSB0aGUgaGVhZGVyOiAkdGl0bGUsCisjICRkYXRldGltZSwgJGRhdGUsICRkb3h5Z2VudmVyc2lvbiwgJHByb2plY3RuYW1lLCAkcHJvamVjdG51bWJlci4gRG94eWdlbiB3aWxsCisjIHJlcGxhY2UgdGhlbSBieSByZXNwZWN0aXZlbHkgdGhlIHRpdGxlIG9mIHRoZSBwYWdlLCB0aGUgY3VycmVudCBkYXRlIGFuZCB0aW1lLAorIyBvbmx5IHRoZSBjdXJyZW50IGRhdGUsIHRoZSB2ZXJzaW9uIG51bWJlciBvZiBkb3h5Z2VuLCB0aGUgcHJvamVjdCBuYW1lIChzZWUKKyMgUFJPSkVDVF9OQU1FKSwgb3IgdGhlIHByb2plY3QgbnVtYmVyIChzZWUgUFJPSkVDVF9OVU1CRVIpLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworTEFURVhfSEVBREVSICAgICAgICAgICA9IGRvYy9kb3h5Z2VuL2hlYWRlci50ZXgKKworIyBUaGUgTEFURVhfRk9PVEVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcGVyc29uYWwgTGFUZVggZm9vdGVyIGZvciB0aGUKKyMgZ2VuZXJhdGVkIExhVGVYIGRvY3VtZW50LiBUaGUgZm9vdGVyIHNob3VsZCBjb250YWluIGV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlIGxhc3QKKyMgY2hhcHRlci4gSWYgaXQgaXMgbGVmdCBibGFuayBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBzdGFuZGFyZCBmb290ZXIuCisjCisjIE5vdGU6IE9ubHkgdXNlIGEgdXNlci1kZWZpbmVkIGZvb3RlciBpZiB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmchCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitMQVRFWF9GT09URVIgICAgICAgICAgID0gCisKKyMgVGhlIExBVEVYX0VYVFJBX0ZJTEVTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGV4dHJhIGltYWdlcyBvcgorIyBvdGhlciBzb3VyY2UgZmlsZXMgd2hpY2ggc2hvdWxkIGJlIGNvcGllZCB0byB0aGUgTEFURVhfT1VUUFVUIG91dHB1dAorIyBkaXJlY3RvcnkuIE5vdGUgdGhhdCB0aGUgZmlsZXMgd2lsbCBiZSBjb3BpZWQgYXMtaXM7IHRoZXJlIGFyZSBubyBjb21tYW5kcyBvcgorIyBtYXJrZXJzIGF2YWlsYWJsZS4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK0xBVEVYX0VYVFJBX0ZJTEVTICAgICAgPSAKKworIyBJZiB0aGUgUERGX0hZUEVSTElOS1MgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBMYVRlWCB0aGF0IGlzIGdlbmVyYXRlZCBpcworIyBwcmVwYXJlZCBmb3IgY29udmVyc2lvbiB0byBQREYgKHVzaW5nIHBzMnBkZiBvciBwZGZsYXRleCkuIFRoZSBQREYgZmlsZSB3aWxsCisjIGNvbnRhaW4gbGlua3MgKGp1c3QgbGlrZSB0aGUgSFRNTCBvdXRwdXQpIGluc3RlYWQgb2YgcGFnZSByZWZlcmVuY2VzLiBUaGlzCisjIG1ha2VzIHRoZSBvdXRwdXQgc3VpdGFibGUgZm9yIG9ubGluZSBicm93c2luZyB1c2luZyBhIFBERiB2aWV3ZXIuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitQREZfSFlQRVJMSU5LUyAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIExBVEVYX1BERkxBVEVYIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgdXNlIHBkZmxhdGV4IHRvIGdlbmVyYXRlCisjIHRoZSBQREYgZmlsZSBkaXJlY3RseSBmcm9tIHRoZSBMYVRlWCBmaWxlcy4gU2V0IHRoaXMgb3B0aW9uIHRvIFlFUyB0byBnZXQgYQorIyBoaWdoZXIgcXVhbGl0eSBQREYgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK1VTRV9QREZMQVRFWCAgICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgTEFURVhfQkFUQ0hNT0RFIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgYWRkIHRoZSBcYmF0Y2htb2RlCisjIGNvbW1hbmQgdG8gdGhlIGdlbmVyYXRlZCBMYVRlWCBmaWxlcy4gVGhpcyB3aWxsIGluc3RydWN0IExhVGVYIHRvIGtlZXAgcnVubmluZworIyBpZiBlcnJvcnMgb2NjdXIsIGluc3RlYWQgb2YgYXNraW5nIHRoZSB1c2VyIGZvciBoZWxwLiBUaGlzIG9wdGlvbiBpcyBhbHNvIHVzZWQKKyMgd2hlbiBnZW5lcmF0aW5nIGZvcm11bGFzIGluIEhUTUwuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK0xBVEVYX0JBVENITU9ERSAgICAgICAgPSBOTworCisjIElmIHRoZSBMQVRFWF9ISURFX0lORElDRVMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgbm90IGluY2x1ZGUgdGhlCisjIGluZGV4IGNoYXB0ZXJzIChzdWNoIGFzIEZpbGUgSW5kZXgsIENvbXBvdW5kIEluZGV4LCBldGMuKSBpbiB0aGUgb3V0cHV0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitMQVRFWF9ISURFX0lORElDRVMgICAgID0gTk8KKworIyBJZiB0aGUgTEFURVhfU09VUkNFX0NPREUgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgaW5jbHVkZSBzb3VyY2UKKyMgY29kZSB3aXRoIHN5bnRheCBoaWdobGlnaHRpbmcgaW4gdGhlIExhVGVYIG91dHB1dC4KKyMKKyMgTm90ZSB0aGF0IHdoaWNoIHNvdXJjZXMgYXJlIHNob3duIGFsc28gZGVwZW5kcyBvbiBvdGhlciBzZXR0aW5ncyBzdWNoIGFzCisjIFNPVVJDRV9CUk9XU0VSLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitMQVRFWF9TT1VSQ0VfQ09ERSAgICAgID0gTk8KKworIyBUaGUgTEFURVhfQklCX1NUWUxFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBzdHlsZSB0byB1c2UgZm9yIHRoZQorIyBiaWJsaW9ncmFwaHksIGUuZy4gcGxhaW5uYXQsIG9yIGllZWV0ci4gU2VlCisjIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQmliVGVYIGFuZCBcY2l0ZSBmb3IgbW9yZSBpbmZvLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogcGxhaW4uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitMQVRFWF9CSUJfU1RZTEUgICAgICAgID0gcGxhaW4KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgUlRGIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9SVEYgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIFJURiBvdXRwdXQuIFRoZQorIyBSVEYgb3V0cHV0IGlzIG9wdGltaXplZCBmb3IgV29yZCA5NyBhbmQgbWF5IG5vdCBsb29rIHRvbyBwcmV0dHkgd2l0aCBvdGhlciBSVEYKKyMgcmVhZGVycy9lZGl0b3JzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0dFTkVSQVRFX1JURiAgICAgICAgICAgPSBOTworCisjIFRoZSBSVEZfT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIFJURiBkb2NzIHdpbGwgYmUgcHV0LiBJZiBhCisjIHJlbGF0aXZlIHBhdGggaXMgZW50ZXJlZCB0aGUgdmFsdWUgb2YgT1VUUFVUX0RJUkVDVE9SWSB3aWxsIGJlIHB1dCBpbiBmcm9udCBvZgorIyBpdC4KKyMgVGhlIGRlZmF1bHQgZGlyZWN0b3J5IGlzOiBydGYuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9SVEYgaXMgc2V0IHRvIFlFUy4KKworUlRGX09VVFBVVCAgICAgICAgICAgICA9IHJ0ZgorCisjIElmIHRoZSBDT01QQUNUX1JURiB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIGdlbmVyYXRlcyBtb3JlIGNvbXBhY3QgUlRGCisjIGRvY3VtZW50cy4gVGhpcyBtYXkgYmUgdXNlZnVsIGZvciBzbWFsbCBwcm9qZWN0cyBhbmQgbWF5IGhlbHAgdG8gc2F2ZSBzb21lCisjIHRyZWVzIGluIGdlbmVyYWwuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1JURiBpcyBzZXQgdG8gWUVTLgorCitDT01QQUNUX1JURiAgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgUlRGX0hZUEVSTElOS1MgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBSVEYgdGhhdCBpcyBnZW5lcmF0ZWQgd2lsbAorIyBjb250YWluIGh5cGVybGluayBmaWVsZHMuIFRoZSBSVEYgZmlsZSB3aWxsIGNvbnRhaW4gbGlua3MgKGp1c3QgbGlrZSB0aGUgSFRNTAorIyBvdXRwdXQpIGluc3RlYWQgb2YgcGFnZSByZWZlcmVuY2VzLiBUaGlzIG1ha2VzIHRoZSBvdXRwdXQgc3VpdGFibGUgZm9yIG9ubGluZQorIyBicm93c2luZyB1c2luZyBXb3JkIG9yIHNvbWUgb3RoZXIgV29yZCBjb21wYXRpYmxlIHJlYWRlcnMgdGhhdCBzdXBwb3J0IHRob3NlCisjIGZpZWxkcy4KKyMKKyMgTm90ZTogV29yZFBhZCAod3JpdGUpIGFuZCBvdGhlcnMgZG8gbm90IHN1cHBvcnQgbGlua3MuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1JURiBpcyBzZXQgdG8gWUVTLgorCitSVEZfSFlQRVJMSU5LUyAgICAgICAgID0gTk8KKworIyBMb2FkIHN0eWxlc2hlZXQgZGVmaW5pdGlvbnMgZnJvbSBmaWxlLiBTeW50YXggaXMgc2ltaWxhciB0byBkb3h5Z2VuJ3MgY29uZmlnCisjIGZpbGUsIGkuZS4gYSBzZXJpZXMgb2YgYXNzaWdubWVudHMuIFlvdSBvbmx5IGhhdmUgdG8gcHJvdmlkZSByZXBsYWNlbWVudHMsCisjIG1pc3NpbmcgZGVmaW5pdGlvbnMgYXJlIHNldCB0byB0aGVpciBkZWZhdWx0IHZhbHVlLgorIworIyBTZWUgYWxzbyBzZWN0aW9uICJEb3h5Z2VuIHVzYWdlIiBmb3IgaW5mb3JtYXRpb24gb24gaG93IHRvIGdlbmVyYXRlIHRoZQorIyBkZWZhdWx0IHN0eWxlIHNoZWV0IHRoYXQgZG94eWdlbiBub3JtYWxseSB1c2VzLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUlRGIGlzIHNldCB0byBZRVMuCisKK1JURl9TVFlMRVNIRUVUX0ZJTEUgICAgPSAKKworIyBTZXQgb3B0aW9uYWwgdmFyaWFibGVzIHVzZWQgaW4gdGhlIGdlbmVyYXRpb24gb2YgYW4gUlRGIGRvY3VtZW50LiBTeW50YXggaXMKKyMgc2ltaWxhciB0byBkb3h5Z2VuJ3MgY29uZmlnIGZpbGUuIEEgdGVtcGxhdGUgZXh0ZW5zaW9ucyBmaWxlIGNhbiBiZSBnZW5lcmF0ZWQKKyMgdXNpbmcgZG94eWdlbiAtZSBydGYgZXh0ZW5zaW9uRmlsZS4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1JURiBpcyBzZXQgdG8gWUVTLgorCitSVEZfRVhURU5TSU9OU19GSUxFICAgID0gCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIG1hbiBwYWdlIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9NQU4gdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIG1hbiBwYWdlcyBmb3IKKyMgY2xhc3NlcyBhbmQgZmlsZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworR0VORVJBVEVfTUFOICAgICAgICAgICA9IE5PCisKKyMgVGhlIE1BTl9PVVRQVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgbWFuIHBhZ2VzIHdpbGwgYmUgcHV0LiBJZiBhCisjIHJlbGF0aXZlIHBhdGggaXMgZW50ZXJlZCB0aGUgdmFsdWUgb2YgT1VUUFVUX0RJUkVDVE9SWSB3aWxsIGJlIHB1dCBpbiBmcm9udCBvZgorIyBpdC4gQSBkaXJlY3RvcnkgbWFuMyB3aWxsIGJlIGNyZWF0ZWQgaW5zaWRlIHRoZSBkaXJlY3Rvcnkgc3BlY2lmaWVkIGJ5CisjIE1BTl9PVVRQVVQuCisjIFRoZSBkZWZhdWx0IGRpcmVjdG9yeSBpczogbWFuLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTUFOIGlzIHNldCB0byBZRVMuCisKK01BTl9PVVRQVVQgICAgICAgICAgICAgPSBtYW4KKworIyBUaGUgTUFOX0VYVEVOU0lPTiB0YWcgZGV0ZXJtaW5lcyB0aGUgZXh0ZW5zaW9uIHRoYXQgaXMgYWRkZWQgdG8gdGhlIGdlbmVyYXRlZAorIyBtYW4gcGFnZXMuIEluIGNhc2UgdGhlIG1hbnVhbCBzZWN0aW9uIGRvZXMgbm90IHN0YXJ0IHdpdGggYSBudW1iZXIsIHRoZSBudW1iZXIKKyMgMyBpcyBwcmVwZW5kZWQuIFRoZSBkb3QgKC4pIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIE1BTl9FWFRFTlNJT04gdGFnIGlzCisjIG9wdGlvbmFsLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogLjMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9NQU4gaXMgc2V0IHRvIFlFUy4KKworTUFOX0VYVEVOU0lPTiAgICAgICAgICA9IC4zCisKKyMgSWYgdGhlIE1BTl9MSU5LUyB0YWcgaXMgc2V0IHRvIFlFUyBhbmQgZG94eWdlbiBnZW5lcmF0ZXMgbWFuIG91dHB1dCwgdGhlbiBpdAorIyB3aWxsIGdlbmVyYXRlIG9uZSBhZGRpdGlvbmFsIG1hbiBmaWxlIGZvciBlYWNoIGVudGl0eSBkb2N1bWVudGVkIGluIHRoZSByZWFsCisjIG1hbiBwYWdlKHMpLiBUaGVzZSBhZGRpdGlvbmFsIGZpbGVzIG9ubHkgc291cmNlIHRoZSByZWFsIG1hbiBwYWdlLCBidXQgd2l0aG91dAorIyB0aGVtIHRoZSBtYW4gY29tbWFuZCB3b3VsZCBiZSB1bmFibGUgdG8gZmluZCB0aGUgY29ycmVjdCBwYWdlLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9NQU4gaXMgc2V0IHRvIFlFUy4KKworTUFOX0xJTktTICAgICAgICAgICAgICA9IE5PCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIFhNTCBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgR0VORVJBVEVfWE1MIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhbiBYTUwgZmlsZSB0aGF0CisjIGNhcHR1cmVzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGNvZGUgaW5jbHVkaW5nIGFsbCBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0dFTkVSQVRFX1hNTCAgICAgICAgICAgPSBOTworCisjIFRoZSBYTUxfT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIFhNTCBwYWdlcyB3aWxsIGJlIHB1dC4gSWYgYQorIyByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZSBwdXQgaW4gZnJvbnQgb2YKKyMgaXQuCisjIFRoZSBkZWZhdWx0IGRpcmVjdG9yeSBpczogeG1sLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfWE1MIGlzIHNldCB0byBZRVMuCisKK1hNTF9PVVRQVVQgICAgICAgICAgICAgPSB4bWwKKworIyBUaGUgWE1MX1NDSEVNQSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIFhNTCBzY2hlbWEsIHdoaWNoIGNhbiBiZSB1c2VkIGJ5IGEKKyMgdmFsaWRhdGluZyBYTUwgcGFyc2VyIHRvIGNoZWNrIHRoZSBzeW50YXggb2YgdGhlIFhNTCBmaWxlcy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1hNTCBpcyBzZXQgdG8gWUVTLgorCitYTUxfU0NIRU1BICAgICAgICAgICAgID0gCisKKyMgVGhlIFhNTF9EVEQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBYTUwgRFRELCB3aGljaCBjYW4gYmUgdXNlZCBieSBhCisjIHZhbGlkYXRpbmcgWE1MIHBhcnNlciB0byBjaGVjayB0aGUgc3ludGF4IG9mIHRoZSBYTUwgZmlsZXMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9YTUwgaXMgc2V0IHRvIFlFUy4KKworWE1MX0RURCAgICAgICAgICAgICAgICA9IAorCisjIElmIHRoZSBYTUxfUFJPR1JBTUxJU1RJTkcgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGR1bXAgdGhlIHByb2dyYW0KKyMgbGlzdGluZ3MgKGluY2x1ZGluZyBzeW50YXggaGlnaGxpZ2h0aW5nIGFuZCBjcm9zcy1yZWZlcmVuY2luZyBpbmZvcm1hdGlvbikgdG8KKyMgdGhlIFhNTCBvdXRwdXQuIE5vdGUgdGhhdCBlbmFibGluZyB0aGlzIHdpbGwgc2lnbmlmaWNhbnRseSBpbmNyZWFzZSB0aGUgc2l6ZQorIyBvZiB0aGUgWE1MIG91dHB1dC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1hNTCBpcyBzZXQgdG8gWUVTLgorCitYTUxfUFJPR1JBTUxJU1RJTkcgICAgID0gWUVTCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIERPQ0JPT0sgb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEdFTkVSQVRFX0RPQ0JPT0sgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIERvY2Jvb2sgZmlsZXMKKyMgdGhhdCBjYW4gYmUgdXNlZCB0byBnZW5lcmF0ZSBQREYuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworR0VORVJBVEVfRE9DQk9PSyAgICAgICA9IE5PCisKKyMgVGhlIERPQ0JPT0tfT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIERvY2Jvb2sgcGFnZXMgd2lsbCBiZSBwdXQuCisjIElmIGEgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkIHRoZSB2YWx1ZSBvZiBPVVRQVVRfRElSRUNUT1JZIHdpbGwgYmUgcHV0IGluCisjIGZyb250IG9mIGl0LgorIyBUaGUgZGVmYXVsdCBkaXJlY3RvcnkgaXM6IGRvY2Jvb2suCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9ET0NCT09LIGlzIHNldCB0byBZRVMuCisKK0RPQ0JPT0tfT1VUUFVUICAgICAgICAgPSBkb2Nib29rCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgQXV0b0dlbiBEZWZpbml0aW9ucyBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgR0VORVJBVEVfQVVUT0dFTl9ERUYgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGFuIEF1dG9HZW4KKyMgRGVmaW5pdGlvbnMgKHNlZSBodHRwOi8vYXV0b2dlbi5zZi5uZXQpIGZpbGUgdGhhdCBjYXB0dXJlcyB0aGUgc3RydWN0dXJlIG9mCisjIHRoZSBjb2RlIGluY2x1ZGluZyBhbGwgZG9jdW1lbnRhdGlvbi4gTm90ZSB0aGF0IHRoaXMgZmVhdHVyZSBpcyBzdGlsbAorIyBleHBlcmltZW50YWwgYW5kIGluY29tcGxldGUgYXQgdGhlIG1vbWVudC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitHRU5FUkFURV9BVVRPR0VOX0RFRiAgID0gTk8KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgUGVybCBtb2R1bGUgb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEdFTkVSQVRFX1BFUkxNT0QgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgUGVybCBtb2R1bGUKKyMgZmlsZSB0aGF0IGNhcHR1cmVzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGNvZGUgaW5jbHVkaW5nIGFsbCBkb2N1bWVudGF0aW9uLgorIworIyBOb3RlIHRoYXQgdGhpcyBmZWF0dXJlIGlzIHN0aWxsIGV4cGVyaW1lbnRhbCBhbmQgaW5jb21wbGV0ZSBhdCB0aGUgbW9tZW50LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0dFTkVSQVRFX1BFUkxNT0QgICAgICAgPSBOTworCisjIElmIHRoZSBQRVJMTU9EX0xBVEVYIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSB0aGUgbmVjZXNzYXJ5CisjIE1ha2VmaWxlIHJ1bGVzLCBQZXJsIHNjcmlwdHMgYW5kIExhVGVYIGNvZGUgdG8gYmUgYWJsZSB0byBnZW5lcmF0ZSBQREYgYW5kIERWSQorIyBvdXRwdXQgZnJvbSB0aGUgUGVybCBtb2R1bGUgb3V0cHV0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9QRVJMTU9EIGlzIHNldCB0byBZRVMuCisKK1BFUkxNT0RfTEFURVggICAgICAgICAgPSBOTworCisjIElmIHRoZSBQRVJMTU9EX1BSRVRUWSB0YWcgaXMgc2V0IHRvIFlFUyB0aGUgUGVybCBtb2R1bGUgb3V0cHV0IHdpbGwgYmUgbmljZWx5CisjIGZvcm1hdHRlZCBzbyBpdCBjYW4gYmUgcGFyc2VkIGJ5IGEgaHVtYW4gcmVhZGVyLiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3Ugd2FudCB0bworIyB1bmRlcnN0YW5kIHdoYXQgaXMgZ29pbmcgb24uIE9uIHRoZSBvdGhlciBoYW5kLCBpZiB0aGlzIHRhZyBpcyBzZXQgdG8gTk8gdGhlCisjIHNpemUgb2YgdGhlIFBlcmwgbW9kdWxlIG91dHB1dCB3aWxsIGJlIG11Y2ggc21hbGxlciBhbmQgUGVybCB3aWxsIHBhcnNlIGl0CisjIGp1c3QgdGhlIHNhbWUuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9QRVJMTU9EIGlzIHNldCB0byBZRVMuCisKK1BFUkxNT0RfUFJFVFRZICAgICAgICAgPSBZRVMKKworIyBUaGUgbmFtZXMgb2YgdGhlIG1ha2UgdmFyaWFibGVzIGluIHRoZSBnZW5lcmF0ZWQgZG94eXJ1bGVzLm1ha2UgZmlsZSBhcmUKKyMgcHJlZml4ZWQgd2l0aCB0aGUgc3RyaW5nIGNvbnRhaW5lZCBpbiBQRVJMTU9EX01BS0VWQVJfUFJFRklYLiBUaGlzIGlzIHVzZWZ1bAorIyBzbyBkaWZmZXJlbnQgZG94eXJ1bGVzLm1ha2UgZmlsZXMgaW5jbHVkZWQgYnkgdGhlIHNhbWUgTWFrZWZpbGUgZG9uJ3QKKyMgb3ZlcndyaXRlIGVhY2ggb3RoZXIncyB2YXJpYWJsZXMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9QRVJMTU9EIGlzIHNldCB0byBZRVMuCisKK1BFUkxNT0RfTUFLRVZBUl9QUkVGSVggPSAKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgcHJlcHJvY2Vzc29yCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEVOQUJMRV9QUkVQUk9DRVNTSU5HIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBldmFsdWF0ZSBhbGwKKyMgQy1wcmVwcm9jZXNzb3IgZGlyZWN0aXZlcyBmb3VuZCBpbiB0aGUgc291cmNlcyBhbmQgaW5jbHVkZSBmaWxlcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworRU5BQkxFX1BSRVBST0NFU1NJTkcgICA9IFlFUworCisjIElmIHRoZSBNQUNST19FWFBBTlNJT04gdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGV4cGFuZCBhbGwgbWFjcm8gbmFtZXMKKyMgaW4gdGhlIHNvdXJjZSBjb2RlLiBJZiBzZXQgdG8gTk8gb25seSBjb25kaXRpb25hbCBjb21waWxhdGlvbiB3aWxsIGJlCisjIHBlcmZvcm1lZC4gTWFjcm8gZXhwYW5zaW9uIGNhbiBiZSBkb25lIGluIGEgY29udHJvbGxlZCB3YXkgYnkgc2V0dGluZworIyBFWFBBTkRfT05MWV9QUkVERUYgdG8gWUVTLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBFTkFCTEVfUFJFUFJPQ0VTU0lORyBpcyBzZXQgdG8gWUVTLgorCitNQUNST19FWFBBTlNJT04gICAgICAgID0gWUVTCisKKyMgSWYgdGhlIEVYUEFORF9PTkxZX1BSRURFRiBhbmQgTUFDUk9fRVhQQU5TSU9OIHRhZ3MgYXJlIGJvdGggc2V0IHRvIFlFUyB0aGVuCisjIHRoZSBtYWNybyBleHBhbnNpb24gaXMgbGltaXRlZCB0byB0aGUgbWFjcm9zIHNwZWNpZmllZCB3aXRoIHRoZSBQUkVERUZJTkVEIGFuZAorIyBFWFBBTkRfQVNfREVGSU5FRCB0YWdzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBFTkFCTEVfUFJFUFJPQ0VTU0lORyBpcyBzZXQgdG8gWUVTLgorCitFWFBBTkRfT05MWV9QUkVERUYgICAgID0gWUVTCisKKyMgSWYgdGhlIFNFQVJDSF9JTkNMVURFUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGUgaW5jbHVkZXMgZmlsZXMgaW4gdGhlCisjIElOQ0xVREVfUEFUSCB3aWxsIGJlIHNlYXJjaGVkIGlmIGEgI2luY2x1ZGUgaXMgZm91bmQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBFTkFCTEVfUFJFUFJPQ0VTU0lORyBpcyBzZXQgdG8gWUVTLgorCitTRUFSQ0hfSU5DTFVERVMgICAgICAgID0gWUVTCisKKyMgVGhlIElOQ0xVREVfUEFUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBkaXJlY3RvcmllcyB0aGF0CisjIGNvbnRhaW4gaW5jbHVkZSBmaWxlcyB0aGF0IGFyZSBub3QgaW5wdXQgZmlsZXMgYnV0IHNob3VsZCBiZSBwcm9jZXNzZWQgYnkgdGhlCisjIHByZXByb2Nlc3Nvci4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFNFQVJDSF9JTkNMVURFUyBpcyBzZXQgdG8gWUVTLgorCitJTkNMVURFX1BBVEggICAgICAgICAgID0gCisKKyMgWW91IGNhbiB1c2UgdGhlIElOQ0xVREVfRklMRV9QQVRURVJOUyB0YWcgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSB3aWxkY2FyZAorIyBwYXR0ZXJucyAobGlrZSAqLmggYW5kICouaHBwKSB0byBmaWx0ZXIgb3V0IHRoZSBoZWFkZXItZmlsZXMgaW4gdGhlCisjIGRpcmVjdG9yaWVzLiBJZiBsZWZ0IGJsYW5rLCB0aGUgcGF0dGVybnMgc3BlY2lmaWVkIHdpdGggRklMRV9QQVRURVJOUyB3aWxsIGJlCisjIHVzZWQuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBFTkFCTEVfUFJFUFJPQ0VTU0lORyBpcyBzZXQgdG8gWUVTLgorCitJTkNMVURFX0ZJTEVfUEFUVEVSTlMgID0gCisKKyMgVGhlIFBSRURFRklORUQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgbWFjcm8gbmFtZXMgdGhhdCBhcmUKKyMgZGVmaW5lZCBiZWZvcmUgdGhlIHByZXByb2Nlc3NvciBpcyBzdGFydGVkIChzaW1pbGFyIHRvIHRoZSAtRCBvcHRpb24gb2YgZS5nLgorIyBnY2MpLiBUaGUgYXJndW1lbnQgb2YgdGhlIHRhZyBpcyBhIGxpc3Qgb2YgbWFjcm9zIG9mIHRoZSBmb3JtOiBuYW1lIG9yCisjIG5hbWU9ZGVmaW5pdGlvbiAobm8gc3BhY2VzKS4gSWYgdGhlIGRlZmluaXRpb24gYW5kIHRoZSAiPSIgYXJlIG9taXR0ZWQsICI9MSIKKyMgaXMgYXNzdW1lZC4gVG8gcHJldmVudCBhIG1hY3JvIGRlZmluaXRpb24gZnJvbSBiZWluZyB1bmRlZmluZWQgdmlhICN1bmRlZiBvcgorIyByZWN1cnNpdmVseSBleHBhbmRlZCB1c2UgdGhlIDo9IG9wZXJhdG9yIGluc3RlYWQgb2YgdGhlID0gb3BlcmF0b3IuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBFTkFCTEVfUFJFUFJPQ0VTU0lORyBpcyBzZXQgdG8gWUVTLgorCitQUkVERUZJTkVEICAgICAgICAgICAgID0gQ09JX0xJQlJBUllfVkVSU0lPTj0yIC1ETVlPX1NVUFBPUlQgLURPRkZMT0FEX0RFQlVHPTEgLURTRVBfU1VQUE9SVCAtRFRJTUlOR19TVVBQT1JUCisKKyMgSWYgdGhlIE1BQ1JPX0VYUEFOU0lPTiBhbmQgRVhQQU5EX09OTFlfUFJFREVGIHRhZ3MgYXJlIHNldCB0byBZRVMgdGhlbiB0aGlzCisjIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgbGlzdCBvZiBtYWNybyBuYW1lcyB0aGF0IHNob3VsZCBiZSBleHBhbmRlZC4gVGhlCisjIG1hY3JvIGRlZmluaXRpb24gdGhhdCBpcyBmb3VuZCBpbiB0aGUgc291cmNlcyB3aWxsIGJlIHVzZWQuIFVzZSB0aGUgUFJFREVGSU5FRAorIyB0YWcgaWYgeW91IHdhbnQgdG8gdXNlIGEgZGlmZmVyZW50IG1hY3JvIGRlZmluaXRpb24gdGhhdCBvdmVycnVsZXMgdGhlCisjIGRlZmluaXRpb24gZm91bmQgaW4gdGhlIHNvdXJjZSBjb2RlLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgRU5BQkxFX1BSRVBST0NFU1NJTkcgaXMgc2V0IHRvIFlFUy4KKworRVhQQU5EX0FTX0RFRklORUQgICAgICA9IAorCisjIElmIHRoZSBTS0lQX0ZVTkNUSU9OX01BQ1JPUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4ncyBwcmVwcm9jZXNzb3Igd2lsbAorIyByZW1vdmUgYWxsIHJlZmVyZW5jZXMgdG8gZnVuY3Rpb24tbGlrZSBtYWNyb3MgdGhhdCBhcmUgYWxvbmUgb24gYSBsaW5lLCBoYXZlIGFuCisjIGFsbCB1cHBlcmNhc2UgbmFtZSwgYW5kIGRvIG5vdCBlbmQgd2l0aCBhIHNlbWljb2xvbi4gU3VjaCBmdW5jdGlvbiBtYWNyb3MgYXJlCisjIHR5cGljYWxseSB1c2VkIGZvciBib2lsZXItcGxhdGUgY29kZSwgYW5kIHdpbGwgY29uZnVzZSB0aGUgcGFyc2VyIGlmIG5vdAorIyByZW1vdmVkLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgRU5BQkxFX1BSRVBST0NFU1NJTkcgaXMgc2V0IHRvIFlFUy4KKworU0tJUF9GVU5DVElPTl9NQUNST1MgICA9IFlFUworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIGV4dGVybmFsIHJlZmVyZW5jZXMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBUaGUgVEFHRklMRVMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgdGFnIGZpbGVzLiBGb3IgZWFjaCB0YWcKKyMgZmlsZSB0aGUgbG9jYXRpb24gb2YgdGhlIGV4dGVybmFsIGRvY3VtZW50YXRpb24gc2hvdWxkIGJlIGFkZGVkLiBUaGUgZm9ybWF0IG9mCisjIGEgdGFnIGZpbGUgd2l0aG91dCB0aGlzIGxvY2F0aW9uIGlzIGFzIGZvbGxvd3M6CisjIFRBR0ZJTEVTID0gZmlsZTEgZmlsZTIgLi4uCisjIEFkZGluZyBsb2NhdGlvbiBmb3IgdGhlIHRhZyBmaWxlcyBpcyBkb25lIGFzIGZvbGxvd3M6CisjIFRBR0ZJTEVTID0gZmlsZTE9bG9jMSAiZmlsZTIgPSBsb2MyIiAuLi4KKyMgd2hlcmUgbG9jMSBhbmQgbG9jMiBjYW4gYmUgcmVsYXRpdmUgb3IgYWJzb2x1dGUgcGF0aHMgb3IgVVJMcy4gU2VlIHRoZQorIyBzZWN0aW9uICJMaW5raW5nIHRvIGV4dGVybmFsIGRvY3VtZW50YXRpb24iIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSB1c2UKKyMgb2YgdGFnIGZpbGVzLgorIyBOb3RlOiBFYWNoIHRhZyBmaWxlIG11c3QgaGF2ZSBhbiB1bmlxdWUgbmFtZSAod2hlcmUgdGhlIG5hbWUgZG9lcyBOT1QgaW5jbHVkZQorIyB0aGUgcGF0aCkuIElmIGEgdGFnIGZpbGUgaXMgbm90IGxvY2F0ZWQgaW4gdGhlIGRpcmVjdG9yeSBpbiB3aGljaCBkb3h5Z2VuIGlzCisjIHJ1biwgeW91IG11c3QgYWxzbyBzcGVjaWZ5IHRoZSBwYXRoIHRvIHRoZSB0YWdmaWxlIGhlcmUuCisKK1RBR0ZJTEVTICAgICAgICAgICAgICAgPSAKKworIyBXaGVuIGEgZmlsZSBuYW1lIGlzIHNwZWNpZmllZCBhZnRlciBHRU5FUkFURV9UQUdGSUxFLCBkb3h5Z2VuIHdpbGwgY3JlYXRlIGEKKyMgdGFnIGZpbGUgdGhhdCBpcyBiYXNlZCBvbiB0aGUgaW5wdXQgZmlsZXMgaXQgcmVhZHMuIFNlZSBzZWN0aW9uICJMaW5raW5nIHRvCisjIGV4dGVybmFsIGRvY3VtZW50YXRpb24iIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSB1c2FnZSBvZiB0YWcgZmlsZXMuCisKK0dFTkVSQVRFX1RBR0ZJTEUgICAgICAgPSAKKworIyBJZiB0aGUgQUxMRVhURVJOQUxTIHRhZyBpcyBzZXQgdG8gWUVTIGFsbCBleHRlcm5hbCBjbGFzcyB3aWxsIGJlIGxpc3RlZCBpbiB0aGUKKyMgY2xhc3MgaW5kZXguIElmIHNldCB0byBOTyBvbmx5IHRoZSBpbmhlcml0ZWQgZXh0ZXJuYWwgY2xhc3NlcyB3aWxsIGJlIGxpc3RlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitBTExFWFRFUk5BTFMgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgRVhURVJOQUxfR1JPVVBTIHRhZyBpcyBzZXQgdG8gWUVTIGFsbCBleHRlcm5hbCBncm91cHMgd2lsbCBiZSBsaXN0ZWQgaW4KKyMgdGhlIG1vZHVsZXMgaW5kZXguIElmIHNldCB0byBOTywgb25seSB0aGUgY3VycmVudCBwcm9qZWN0J3MgZ3JvdXBzIHdpbGwgYmUKKyMgbGlzdGVkLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitFWFRFUk5BTF9HUk9VUFMgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIEVYVEVSTkFMX1BBR0VTIHRhZyBpcyBzZXQgdG8gWUVTIGFsbCBleHRlcm5hbCBwYWdlcyB3aWxsIGJlIGxpc3RlZCBpbgorIyB0aGUgcmVsYXRlZCBwYWdlcyBpbmRleC4gSWYgc2V0IHRvIE5PLCBvbmx5IHRoZSBjdXJyZW50IHByb2plY3QncyBwYWdlcyB3aWxsCisjIGJlIGxpc3RlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworRVhURVJOQUxfUEFHRVMgICAgICAgICA9IFlFUworCisjIFRoZSBQRVJMX1BBVEggc2hvdWxkIGJlIHRoZSBhYnNvbHV0ZSBwYXRoIGFuZCBuYW1lIG9mIHRoZSBwZXJsIHNjcmlwdAorIyBpbnRlcnByZXRlciAoaS5lLiB0aGUgcmVzdWx0IG9mICd3aGljaCBwZXJsJykuCisjIFRoZSBkZWZhdWx0IGZpbGUgKHdpdGggYWJzb2x1dGUgcGF0aCkgaXM6IC91c3IvYmluL3BlcmwuCisKK1BFUkxfUEFUSCAgICAgICAgICAgICAgPSAvdXNyL2Jpbi9wZXJsCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIGRvdCB0b29sCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIENMQVNTX0RJQUdSQU1TIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGNsYXNzIGRpYWdyYW0KKyMgKGluIEhUTUwgYW5kIExhVGVYKSBmb3IgY2xhc3NlcyB3aXRoIGJhc2Ugb3Igc3VwZXIgY2xhc3Nlcy4gU2V0dGluZyB0aGUgdGFnIHRvCisjIE5PIHR1cm5zIHRoZSBkaWFncmFtcyBvZmYuIE5vdGUgdGhhdCB0aGlzIG9wdGlvbiBhbHNvIHdvcmtzIHdpdGggSEFWRV9ET1QKKyMgZGlzYWJsZWQsIGJ1dCBpdCBpcyByZWNvbW1lbmRlZCB0byBpbnN0YWxsIGFuZCB1c2UgZG90LCBzaW5jZSBpdCB5aWVsZHMgbW9yZQorIyBwb3dlcmZ1bCBncmFwaHMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0NMQVNTX0RJQUdSQU1TICAgICAgICAgPSBZRVMKKworIyBZb3UgY2FuIGRlZmluZSBtZXNzYWdlIHNlcXVlbmNlIGNoYXJ0cyB3aXRoaW4gZG94eWdlbiBjb21tZW50cyB1c2luZyB0aGUgXG1zYworIyBjb21tYW5kLiBEb3h5Z2VuIHdpbGwgdGhlbiBydW4gdGhlIG1zY2dlbiB0b29sIChzZWU6CisjIGh0dHA6Ly93d3cubWN0ZXJuYW4ubWUudWsvbXNjZ2VuLykpIHRvIHByb2R1Y2UgdGhlIGNoYXJ0IGFuZCBpbnNlcnQgaXQgaW4gdGhlCisjIGRvY3VtZW50YXRpb24uIFRoZSBNU0NHRU5fUEFUSCB0YWcgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZSBkaXJlY3Rvcnkgd2hlcmUKKyMgdGhlIG1zY2dlbiB0b29sIHJlc2lkZXMuIElmIGxlZnQgZW1wdHkgdGhlIHRvb2wgaXMgYXNzdW1lZCB0byBiZSBmb3VuZCBpbiB0aGUKKyMgZGVmYXVsdCBzZWFyY2ggcGF0aC4KKworTVNDR0VOX1BBVEggICAgICAgICAgICA9IAorCisjIFlvdSBjYW4gaW5jbHVkZSBkaWFncmFtcyBtYWRlIHdpdGggZGlhIGluIGRveHlnZW4gZG9jdW1lbnRhdGlvbi4gRG94eWdlbiB3aWxsCisjIHRoZW4gcnVuIGRpYSB0byBwcm9kdWNlIHRoZSBkaWFncmFtIGFuZCBpbnNlcnQgaXQgaW4gdGhlIGRvY3VtZW50YXRpb24uIFRoZQorIyBESUFfUEFUSCB0YWcgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIGRpYSBiaW5hcnkgcmVzaWRlcy4KKyMgSWYgbGVmdCBlbXB0eSBkaWEgaXMgYXNzdW1lZCB0byBiZSBmb3VuZCBpbiB0aGUgZGVmYXVsdCBzZWFyY2ggcGF0aC4KKworRElBX1BBVEggICAgICAgICAgICAgICA9IAorCisjIElmIHNldCB0byBZRVMsIHRoZSBpbmhlcml0YW5jZSBhbmQgY29sbGFib3JhdGlvbiBncmFwaHMgd2lsbCBoaWRlIGluaGVyaXRhbmNlCisjIGFuZCB1c2FnZSByZWxhdGlvbnMgaWYgdGhlIHRhcmdldCBpcyB1bmRvY3VtZW50ZWQgb3IgaXMgbm90IGEgY2xhc3MuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0hJREVfVU5ET0NfUkVMQVRJT05TICAgPSBZRVMKKworIyBJZiB5b3Ugc2V0IHRoZSBIQVZFX0RPVCB0YWcgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGFzc3VtZSB0aGUgZG90IHRvb2wgaXMKKyMgYXZhaWxhYmxlIGZyb20gdGhlIHBhdGguIFRoaXMgdG9vbCBpcyBwYXJ0IG9mIEdyYXBodml6IChzZWU6CisjIGh0dHA6Ly93d3cuZ3JhcGh2aXoub3JnLyksIGEgZ3JhcGggdmlzdWFsaXphdGlvbiB0b29sa2l0IGZyb20gQVQmVCBhbmQgTHVjZW50CisjIEJlbGwgTGFicy4gVGhlIG90aGVyIG9wdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGhhdmUgbm8gZWZmZWN0IGlmIHRoaXMgb3B0aW9uIGlzCisjIHNldCB0byBOTworIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0hBVkVfRE9UICAgICAgICAgICAgICAgPSBOTworCisjIFRoZSBET1RfTlVNX1RIUkVBRFMgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgZG90IGludm9jYXRpb25zIGRveHlnZW4gaXMgYWxsb3dlZAorIyB0byBydW4gaW4gcGFyYWxsZWwuIFdoZW4gc2V0IHRvIDAgZG94eWdlbiB3aWxsIGJhc2UgdGhpcyBvbiB0aGUgbnVtYmVyIG9mCisjIHByb2Nlc3NvcnMgYXZhaWxhYmxlIGluIHRoZSBzeXN0ZW0uIFlvdSBjYW4gc2V0IGl0IGV4cGxpY2l0bHkgdG8gYSB2YWx1ZQorIyBsYXJnZXIgdGhhbiAwIHRvIGdldCBjb250cm9sIG92ZXIgdGhlIGJhbGFuY2UgYmV0d2VlbiBDUFUgbG9hZCBhbmQgcHJvY2Vzc2luZworIyBzcGVlZC4KKyMgTWluaW11bSB2YWx1ZTogMCwgbWF4aW11bSB2YWx1ZTogMzIsIGRlZmF1bHQgdmFsdWU6IDAuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitET1RfTlVNX1RIUkVBRFMgICAgICAgID0gMAorCisjIFdoZW4geW91IHdhbnQgYSBkaWZmZXJlbnRseSBsb29raW5nIGZvbnQgbiB0aGUgZG90IGZpbGVzIHRoYXQgZG94eWdlbgorIyBnZW5lcmF0ZXMgeW91IGNhbiBzcGVjaWZ5IHRoZSBmb250IG5hbWUgdXNpbmcgRE9UX0ZPTlROQU1FLiBZb3UgbmVlZCB0byBtYWtlCisjIHN1cmUgZG90IGlzIGFibGUgdG8gZmluZCB0aGUgZm9udCwgd2hpY2ggY2FuIGJlIGRvbmUgYnkgcHV0dGluZyBpdCBpbiBhCisjIHN0YW5kYXJkIGxvY2F0aW9uIG9yIGJ5IHNldHRpbmcgdGhlIERPVEZPTlRQQVRIIGVudmlyb25tZW50IHZhcmlhYmxlIG9yIGJ5CisjIHNldHRpbmcgRE9UX0ZPTlRQQVRIIHRvIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgZm9udC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IEhlbHZldGljYS4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0RPVF9GT05UTkFNRSAgICAgICAgICAgPSBIZWx2ZXRpY2EKKworIyBUaGUgRE9UX0ZPTlRTSVpFIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIHNpemUgKGluIHBvaW50cykgb2YgdGhlIGZvbnQgb2YKKyMgZG90IGdyYXBocy4KKyMgTWluaW11bSB2YWx1ZTogNCwgbWF4aW11bSB2YWx1ZTogMjQsIGRlZmF1bHQgdmFsdWU6IDEwLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworRE9UX0ZPTlRTSVpFICAgICAgICAgICA9IDEwCisKKyMgQnkgZGVmYXVsdCBkb3h5Z2VuIHdpbGwgdGVsbCBkb3QgdG8gdXNlIHRoZSBkZWZhdWx0IGZvbnQgYXMgc3BlY2lmaWVkIHdpdGgKKyMgRE9UX0ZPTlROQU1FLiBJZiB5b3Ugc3BlY2lmeSBhIGRpZmZlcmVudCBmb250IHVzaW5nIERPVF9GT05UTkFNRSB5b3UgY2FuIHNldAorIyB0aGUgcGF0aCB3aGVyZSBkb3QgY2FuIGZpbmQgaXQgdXNpbmcgdGhpcyB0YWcuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitET1RfRk9OVFBBVEggICAgICAgICAgID0gCisKKyMgSWYgdGhlIENMQVNTX0dSQVBIIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgZ3JhcGggZm9yCisjIGVhY2ggZG9jdW1lbnRlZCBjbGFzcyBzaG93aW5nIHRoZSBkaXJlY3QgYW5kIGluZGlyZWN0IGluaGVyaXRhbmNlIHJlbGF0aW9ucy4KKyMgU2V0dGluZyB0aGlzIHRhZyB0byBZRVMgd2lsbCBmb3JjZSB0aGUgQ0xBU1NfRElBR1JBTVMgdGFnIHRvIE5PLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworQ0xBU1NfR1JBUEggICAgICAgICAgICA9IFlFUworCisjIElmIHRoZSBDT0xMQUJPUkFUSU9OX0dSQVBIIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEKKyMgZ3JhcGggZm9yIGVhY2ggZG9jdW1lbnRlZCBjbGFzcyBzaG93aW5nIHRoZSBkaXJlY3QgYW5kIGluZGlyZWN0IGltcGxlbWVudGF0aW9uCisjIGRlcGVuZGVuY2llcyAoaW5oZXJpdGFuY2UsIGNvbnRhaW5tZW50LCBhbmQgY2xhc3MgcmVmZXJlbmNlcyB2YXJpYWJsZXMpIG9mIHRoZQorIyBjbGFzcyB3aXRoIG90aGVyIGRvY3VtZW50ZWQgY2xhc3Nlcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0NPTExBQk9SQVRJT05fR1JBUEggICAgPSBZRVMKKworIyBJZiB0aGUgR1JPVVBfR1JBUEhTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgZ3JhcGggZm9yCisjIGdyb3Vwcywgc2hvd2luZyB0aGUgZGlyZWN0IGdyb3VwcyBkZXBlbmRlbmNpZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitHUk9VUF9HUkFQSFMgICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIFVNTF9MT09LIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBpbmhlcml0YW5jZSBhbmQKKyMgY29sbGFib3JhdGlvbiBkaWFncmFtcyBpbiBhIHN0eWxlIHNpbWlsYXIgdG8gdGhlIE9NRydzIFVuaWZpZWQgTW9kZWxpbmcKKyMgTGFuZ3VhZ2UuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK1VNTF9MT09LICAgICAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBVTUxfTE9PSyB0YWcgaXMgZW5hYmxlZCwgdGhlIGZpZWxkcyBhbmQgbWV0aG9kcyBhcmUgc2hvd24gaW5zaWRlIHRoZQorIyBjbGFzcyBub2RlLiBJZiB0aGVyZSBhcmUgbWFueSBmaWVsZHMgb3IgbWV0aG9kcyBhbmQgbWFueSBub2RlcyB0aGUgZ3JhcGggbWF5CisjIGJlY29tZSB0b28gYmlnIHRvIGJlIHVzZWZ1bC4gVGhlIFVNTF9MSU1JVF9OVU1fRklFTERTIHRocmVzaG9sZCBsaW1pdHMgdGhlCisjIG51bWJlciBvZiBpdGVtcyBmb3IgZWFjaCB0eXBlIHRvIG1ha2UgdGhlIHNpemUgbW9yZSBtYW5hZ2VhYmxlLiBTZXQgdGhpcyB0byAwCisjIGZvciBubyBsaW1pdC4gTm90ZSB0aGF0IHRoZSB0aHJlc2hvbGQgbWF5IGJlIGV4Y2VlZGVkIGJ5IDUwJSBiZWZvcmUgdGhlIGxpbWl0CisjIGlzIGVuZm9yY2VkLiBTbyB3aGVuIHlvdSBzZXQgdGhlIHRocmVzaG9sZCB0byAxMCwgdXAgdG8gMTUgZmllbGRzIG1heSBhcHBlYXIsCisjIGJ1dCBpZiB0aGUgbnVtYmVyIGV4Y2VlZHMgMTUsIHRoZSB0b3RhbCBhbW91bnQgb2YgZmllbGRzIHNob3duIGlzIGxpbWl0ZWQgdG8KKyMgMTAuCisjIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDEwMCwgZGVmYXVsdCB2YWx1ZTogMTAuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitVTUxfTElNSVRfTlVNX0ZJRUxEUyAgID0gMTAKKworIyBJZiB0aGUgVEVNUExBVEVfUkVMQVRJT05TIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gdGhlIGluaGVyaXRhbmNlIGFuZAorIyBjb2xsYWJvcmF0aW9uIGdyYXBocyB3aWxsIHNob3cgdGhlIHJlbGF0aW9ucyBiZXR3ZWVuIHRlbXBsYXRlcyBhbmQgdGhlaXIKKyMgaW5zdGFuY2VzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitURU1QTEFURV9SRUxBVElPTlMgICAgID0gTk8KKworIyBJZiB0aGUgSU5DTFVERV9HUkFQSCwgRU5BQkxFX1BSRVBST0NFU1NJTkcgYW5kIFNFQVJDSF9JTkNMVURFUyB0YWdzIGFyZSBzZXQgdG8KKyMgWUVTIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgZ3JhcGggZm9yIGVhY2ggZG9jdW1lbnRlZCBmaWxlIHNob3dpbmcgdGhlCisjIGRpcmVjdCBhbmQgaW5kaXJlY3QgaW5jbHVkZSBkZXBlbmRlbmNpZXMgb2YgdGhlIGZpbGUgd2l0aCBvdGhlciBkb2N1bWVudGVkCisjIGZpbGVzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworSU5DTFVERV9HUkFQSCAgICAgICAgICA9IFlFUworCisjIElmIHRoZSBJTkNMVURFRF9CWV9HUkFQSCwgRU5BQkxFX1BSRVBST0NFU1NJTkcgYW5kIFNFQVJDSF9JTkNMVURFUyB0YWdzIGFyZQorIyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgZ3JhcGggZm9yIGVhY2ggZG9jdW1lbnRlZCBmaWxlIHNob3dpbmcKKyMgdGhlIGRpcmVjdCBhbmQgaW5kaXJlY3QgaW5jbHVkZSBkZXBlbmRlbmNpZXMgb2YgdGhlIGZpbGUgd2l0aCBvdGhlciBkb2N1bWVudGVkCisjIGZpbGVzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworSU5DTFVERURfQllfR1JBUEggICAgICA9IFlFUworCisjIElmIHRoZSBDQUxMX0dSQVBIIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgY2FsbAorIyBkZXBlbmRlbmN5IGdyYXBoIGZvciBldmVyeSBnbG9iYWwgZnVuY3Rpb24gb3IgY2xhc3MgbWV0aG9kLgorIworIyBOb3RlIHRoYXQgZW5hYmxpbmcgdGhpcyBvcHRpb24gd2lsbCBzaWduaWZpY2FudGx5IGluY3JlYXNlIHRoZSB0aW1lIG9mIGEgcnVuLgorIyBTbyBpbiBtb3N0IGNhc2VzIGl0IHdpbGwgYmUgYmV0dGVyIHRvIGVuYWJsZSBjYWxsIGdyYXBocyBmb3Igc2VsZWN0ZWQKKyMgZnVuY3Rpb25zIG9ubHkgdXNpbmcgdGhlIFxjYWxsZ3JhcGggY29tbWFuZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworQ0FMTF9HUkFQSCAgICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIENBTExFUl9HUkFQSCB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGNhbGxlcgorIyBkZXBlbmRlbmN5IGdyYXBoIGZvciBldmVyeSBnbG9iYWwgZnVuY3Rpb24gb3IgY2xhc3MgbWV0aG9kLgorIworIyBOb3RlIHRoYXQgZW5hYmxpbmcgdGhpcyBvcHRpb24gd2lsbCBzaWduaWZpY2FudGx5IGluY3JlYXNlIHRoZSB0aW1lIG9mIGEgcnVuLgorIyBTbyBpbiBtb3N0IGNhc2VzIGl0IHdpbGwgYmUgYmV0dGVyIHRvIGVuYWJsZSBjYWxsZXIgZ3JhcGhzIGZvciBzZWxlY3RlZAorIyBmdW5jdGlvbnMgb25seSB1c2luZyB0aGUgXGNhbGxlcmdyYXBoIGNvbW1hbmQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0NBTExFUl9HUkFQSCAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBHUkFQSElDQUxfSElFUkFSQ0hZIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGdyYXBoaWNhbAorIyBoaWVyYXJjaHkgb2YgYWxsIGNsYXNzZXMgaW5zdGVhZCBvZiBhIHRleHR1YWwgb25lLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworR1JBUEhJQ0FMX0hJRVJBUkNIWSAgICA9IFlFUworCisjIElmIHRoZSBESVJFQ1RPUllfR1JBUEggdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgc2hvdyB0aGUKKyMgZGVwZW5kZW5jaWVzIGEgZGlyZWN0b3J5IGhhcyBvbiBvdGhlciBkaXJlY3RvcmllcyBpbiBhIGdyYXBoaWNhbCB3YXkuIFRoZQorIyBkZXBlbmRlbmN5IHJlbGF0aW9ucyBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgI2luY2x1ZGUgcmVsYXRpb25zIGJldHdlZW4gdGhlCisjIGZpbGVzIGluIHRoZSBkaXJlY3Rvcmllcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0RJUkVDVE9SWV9HUkFQSCAgICAgICAgPSBZRVMKKworIyBUaGUgRE9UX0lNQUdFX0ZPUk1BVCB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBpbWFnZSBmb3JtYXQgb2YgdGhlIGltYWdlcworIyBnZW5lcmF0ZWQgYnkgZG90LgorIyBOb3RlOiBJZiB5b3UgY2hvb3NlIHN2ZyB5b3UgbmVlZCB0byBzZXQgSFRNTF9GSUxFX0VYVEVOU0lPTiB0byB4aHRtbCBpbiBvcmRlcgorIyB0byBtYWtlIHRoZSBTVkcgZmlsZXMgdmlzaWJsZSBpbiBJRSA5KyAob3RoZXIgYnJvd3NlcnMgZG8gbm90IGhhdmUgdGhpcworIyByZXF1aXJlbWVudCkuCisjIFBvc3NpYmxlIHZhbHVlcyBhcmU6IHBuZywganBnLCBnaWYgYW5kIHN2Zy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IHBuZy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0RPVF9JTUFHRV9GT1JNQVQgICAgICAgPSBwbmcKKworIyBJZiBET1RfSU1BR0VfRk9STUFUIGlzIHNldCB0byBzdmcsIHRoZW4gdGhpcyBvcHRpb24gY2FuIGJlIHNldCB0byBZRVMgdG8KKyMgZW5hYmxlIGdlbmVyYXRpb24gb2YgaW50ZXJhY3RpdmUgU1ZHIGltYWdlcyB0aGF0IGFsbG93IHpvb21pbmcgYW5kIHBhbm5pbmcuCisjCisjIE5vdGUgdGhhdCB0aGlzIHJlcXVpcmVzIGEgbW9kZXJuIGJyb3dzZXIgb3RoZXIgdGhhbiBJbnRlcm5ldCBFeHBsb3Jlci4gVGVzdGVkCisjIGFuZCB3b3JraW5nIGFyZSBGaXJlZm94LCBDaHJvbWUsIFNhZmFyaSwgYW5kIE9wZXJhLgorIyBOb3RlOiBGb3IgSUUgOSsgeW91IG5lZWQgdG8gc2V0IEhUTUxfRklMRV9FWFRFTlNJT04gdG8geGh0bWwgaW4gb3JkZXIgdG8gbWFrZQorIyB0aGUgU1ZHIGZpbGVzIHZpc2libGUuIE9sZGVyIHZlcnNpb25zIG9mIElFIGRvIG5vdCBoYXZlIFNWRyBzdXBwb3J0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitJTlRFUkFDVElWRV9TVkcgICAgICAgID0gTk8KKworIyBUaGUgRE9UX1BBVEggdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIHBhdGggd2hlcmUgdGhlIGRvdCB0b29sIGNhbiBiZQorIyBmb3VuZC4gSWYgbGVmdCBibGFuaywgaXQgaXMgYXNzdW1lZCB0aGUgZG90IHRvb2wgY2FuIGJlIGZvdW5kIGluIHRoZSBwYXRoLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworRE9UX1BBVEggICAgICAgICAgICAgICA9IAorCisjIFRoZSBET1RGSUxFX0RJUlMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZGlyZWN0b3JpZXMgdGhhdAorIyBjb250YWluIGRvdCBmaWxlcyB0aGF0IGFyZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiAoc2VlIHRoZSBcZG90ZmlsZQorIyBjb21tYW5kKS4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0RPVEZJTEVfRElSUyAgICAgICAgICAgPSAKKworIyBUaGUgTVNDRklMRV9ESVJTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGRpcmVjdG9yaWVzIHRoYXQKKyMgY29udGFpbiBtc2MgZmlsZXMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gKHNlZSB0aGUgXG1zY2ZpbGUKKyMgY29tbWFuZCkuCisKK01TQ0ZJTEVfRElSUyAgICAgICAgICAgPSAKKworIyBUaGUgRElBRklMRV9ESVJTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGRpcmVjdG9yaWVzIHRoYXQKKyMgY29udGFpbiBkaWEgZmlsZXMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gKHNlZSB0aGUgXGRpYWZpbGUKKyMgY29tbWFuZCkuCisKK0RJQUZJTEVfRElSUyAgICAgICAgICAgPSAKKworIyBUaGUgRE9UX0dSQVBIX01BWF9OT0RFUyB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBub2RlcworIyB0aGF0IHdpbGwgYmUgc2hvd24gaW4gdGhlIGdyYXBoLiBJZiB0aGUgbnVtYmVyIG9mIG5vZGVzIGluIGEgZ3JhcGggYmVjb21lcworIyBsYXJnZXIgdGhhbiB0aGlzIHZhbHVlLCBkb3h5Z2VuIHdpbGwgdHJ1bmNhdGUgdGhlIGdyYXBoLCB3aGljaCBpcyB2aXN1YWxpemVkCisjIGJ5IHJlcHJlc2VudGluZyBhIG5vZGUgYXMgYSByZWQgYm94LiBOb3RlIHRoYXQgZG94eWdlbiBpZiB0aGUgbnVtYmVyIG9mIGRpcmVjdAorIyBjaGlsZHJlbiBvZiB0aGUgcm9vdCBub2RlIGluIGEgZ3JhcGggaXMgYWxyZWFkeSBsYXJnZXIgdGhhbgorIyBET1RfR1JBUEhfTUFYX05PREVTIHRoZW4gdGhlIGdyYXBoIHdpbGwgbm90IGJlIHNob3duIGF0IGFsbC4gQWxzbyBub3RlIHRoYXQKKyMgdGhlIHNpemUgb2YgYSBncmFwaCBjYW4gYmUgZnVydGhlciByZXN0cmljdGVkIGJ5IE1BWF9ET1RfR1JBUEhfREVQVEguCisjIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDEwMDAwLCBkZWZhdWx0IHZhbHVlOiA1MC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0RPVF9HUkFQSF9NQVhfTk9ERVMgICAgPSA1MAorCisjIFRoZSBNQVhfRE9UX0dSQVBIX0RFUFRIIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIG1heGltdW0gZGVwdGggb2YgdGhlIGdyYXBocworIyBnZW5lcmF0ZWQgYnkgZG90LiBBIGRlcHRoIHZhbHVlIG9mIDMgbWVhbnMgdGhhdCBvbmx5IG5vZGVzIHJlYWNoYWJsZSBmcm9tIHRoZQorIyByb290IGJ5IGZvbGxvd2luZyBhIHBhdGggdmlhIGF0IG1vc3QgMyBlZGdlcyB3aWxsIGJlIHNob3duLiBOb2RlcyB0aGF0IGxheQorIyBmdXJ0aGVyIGZyb20gdGhlIHJvb3Qgbm9kZSB3aWxsIGJlIG9taXR0ZWQuIE5vdGUgdGhhdCBzZXR0aW5nIHRoaXMgb3B0aW9uIHRvIDEKKyMgb3IgMiBtYXkgZ3JlYXRseSByZWR1Y2UgdGhlIGNvbXB1dGF0aW9uIHRpbWUgbmVlZGVkIGZvciBsYXJnZSBjb2RlIGJhc2VzLiBBbHNvCisjIG5vdGUgdGhhdCB0aGUgc2l6ZSBvZiBhIGdyYXBoIGNhbiBiZSBmdXJ0aGVyIHJlc3RyaWN0ZWQgYnkKKyMgRE9UX0dSQVBIX01BWF9OT0RFUy4gVXNpbmcgYSBkZXB0aCBvZiAwIG1lYW5zIG5vIGRlcHRoIHJlc3RyaWN0aW9uLgorIyBNaW5pbXVtIHZhbHVlOiAwLCBtYXhpbXVtIHZhbHVlOiAxMDAwLCBkZWZhdWx0IHZhbHVlOiAwLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworTUFYX0RPVF9HUkFQSF9ERVBUSCAgICA9IDAKKworIyBTZXQgdGhlIERPVF9UUkFOU1BBUkVOVCB0YWcgdG8gWUVTIHRvIGdlbmVyYXRlIGltYWdlcyB3aXRoIGEgdHJhbnNwYXJlbnQKKyMgYmFja2dyb3VuZC4gVGhpcyBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LCBiZWNhdXNlIGRvdCBvbiBXaW5kb3dzIGRvZXMgbm90IHNlZW0KKyMgdG8gc3VwcG9ydCB0aGlzIG91dCBvZiB0aGUgYm94LgorIworIyBXYXJuaW5nOiBEZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtIHVzZWQsIGVuYWJsaW5nIHRoaXMgb3B0aW9uIG1heSBsZWFkIHRvCisjIGJhZGx5IGFudGktYWxpYXNlZCBsYWJlbHMgb24gdGhlIGVkZ2VzIG9mIGEgZ3JhcGggKGkuZS4gdGhleSBiZWNvbWUgaGFyZCB0bworIyByZWFkKS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworRE9UX1RSQU5TUEFSRU5UICAgICAgICA9IE5PCisKKyMgU2V0IHRoZSBET1RfTVVMVElfVEFSR0VUUyB0YWcgdG8gWUVTIGFsbG93IGRvdCB0byBnZW5lcmF0ZSBtdWx0aXBsZSBvdXRwdXQKKyMgZmlsZXMgaW4gb25lIHJ1biAoaS5lLiBtdWx0aXBsZSAtbyBhbmQgLVQgb3B0aW9ucyBvbiB0aGUgY29tbWFuZCBsaW5lKS4gVGhpcworIyBtYWtlcyBkb3QgcnVuIGZhc3RlciwgYnV0IHNpbmNlIG9ubHkgbmV3ZXIgdmVyc2lvbnMgb2YgZG90ICg+MS44LjEwKSBzdXBwb3J0CisjIHRoaXMsIHRoaXMgZmVhdHVyZSBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitET1RfTVVMVElfVEFSR0VUUyAgICAgID0gTk8KKworIyBJZiB0aGUgR0VORVJBVEVfTEVHRU5EIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGxlZ2VuZCBwYWdlCisjIGV4cGxhaW5pbmcgdGhlIG1lYW5pbmcgb2YgdGhlIHZhcmlvdXMgYm94ZXMgYW5kIGFycm93cyBpbiB0aGUgZG90IGdlbmVyYXRlZAorIyBncmFwaHMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitHRU5FUkFURV9MRUdFTkQgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIERPVF9DTEVBTlVQIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCByZW1vdmUgdGhlIGludGVybWVkaWF0ZSBkb3QKKyMgZmlsZXMgdGhhdCBhcmUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgdmFyaW91cyBncmFwaHMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitET1RfQ0xFQU5VUCAgICAgICAgICAgID0gWUVTCmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL2RvYy9kb3h5Z2VuL2hlYWRlci50ZXggYi9maW5hbC9vZmZsb2FkL2RvYy9kb3h5Z2VuL2hlYWRlci50ZXgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNWU5NjNjMgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvZG9jL2RveHlnZW4vaGVhZGVyLnRleApAQCAtMCwwICsxLDkwIEBACislIExhdGV4IGhlYWRlciBmb3IgZG94eWdlbiAxLjguMy4xDQorXGRvY3VtZW50Y2xhc3N7Ym9va30NCitcdXNlcGFja2FnZVthNHBhcGVyLHRvcD0yLjVjbSxib3R0b209Mi41Y20sbGVmdD0yLjVjbSxyaWdodD0yLjVjbV17Z2VvbWV0cnl9DQorXHVzZXBhY2thZ2V7bWFrZWlkeH0NCitcdXNlcGFja2FnZXtuYXRiaWJ9DQorXHVzZXBhY2thZ2V7Z3JhcGhpY3h9DQorXHVzZXBhY2thZ2V7bXVsdGljb2x9DQorXHVzZXBhY2thZ2V7ZmxvYXR9DQorXHVzZXBhY2thZ2V7bGlzdGluZ3N9DQorXHVzZXBhY2thZ2V7Y29sb3J9DQorXHVzZXBhY2thZ2V7aWZ0aGVufQ0KK1x1c2VwYWNrYWdlW3RhYmxlXXt4Y29sb3J9DQorXHVzZXBhY2thZ2V7dGV4dGNvbXB9DQorXHVzZXBhY2thZ2V7YWxsdHR9DQorXHVzZXBhY2thZ2V7aWZwZGZ9DQorXGlmcGRmDQorXHVzZXBhY2thZ2VbcGRmdGV4LA0KKyAgICAgICAgICAgIHBhZ2ViYWNrcmVmPXRydWUsDQorICAgICAgICAgICAgY29sb3JsaW5rcz10cnVlLA0KKyAgICAgICAgICAgIGxpbmtjb2xvcj1ibHVlLA0KKyAgICAgICAgICAgIHVuaWNvZGUNCisgICAgICAgICAgIF17aHlwZXJyZWZ9DQorXGVsc2UNCitcdXNlcGFja2FnZVtwczJwZGYsDQorICAgICAgICAgICAgcGFnZWJhY2tyZWY9dHJ1ZSwNCisgICAgICAgICAgICBjb2xvcmxpbmtzPXRydWUsDQorICAgICAgICAgICAgbGlua2NvbG9yPWJsdWUsDQorICAgICAgICAgICAgdW5pY29kZQ0KKyAgICAgICAgICAgXXtoeXBlcnJlZn0NCitcdXNlcGFja2FnZXtwc3BpY3R1cmV9DQorXGZpDQorXHVzZXBhY2thZ2VbdXRmOF17aW5wdXRlbmN9DQorXHVzZXBhY2thZ2V7bWF0aHB0bXh9DQorXHVzZXBhY2thZ2Vbc2NhbGVkPS45MF17aGVsdmV0fQ0KK1x1c2VwYWNrYWdle2NvdXJpZXJ9DQorXHVzZXBhY2thZ2V7c2VjdHN0eX0NCitcdXNlcGFja2FnZXthbXNzeW1ifQ0KK1x1c2VwYWNrYWdlW3RpdGxlc117dG9jbG9mdH0NCitcdXNlcGFja2FnZXtkb3h5Z2VufQ0KK1x1c2VwYWNrYWdle2ZhbmN5aGRyfQ0KK1xwYWdlc3R5bGV7ZmFuY3l9DQorXGxzdHNldHtsYW5ndWFnZT1DKyssaW5wdXRlbmNvZGluZz11dGY4LGJhc2ljc3R5bGU9XGZvb3Rub3Rlc2l6ZSxicmVha2xpbmVzPXRydWUsYnJlYWthdHdoaXRlc3BhY2U9dHJ1ZSx0YWJzaXplPTQsbnVtYmVycz1sZWZ0IH0NCitcbWFrZWluZGV4DQorXHNldGNvdW50ZXJ7dG9jZGVwdGh9ezN9DQorXHJlbmV3Y29tbWFuZHtcZm9vdHJ1bGV3aWR0aH17MC40cHR9DQorXHJlbmV3Y29tbWFuZHtcZmFtaWx5ZGVmYXVsdH17XHNmZGVmYXVsdH0NCitcaGZ1eno9MTVwdA0KK1xzZXRsZW5ndGh7XGVtZXJnZW5jeXN0cmV0Y2h9ezE1cHR9DQorXGhiYWRuZXNzPTc1MA0KK1x0b2xlcmFuY2U9NzUwDQorXGJlZ2lue2RvY3VtZW50fQ0KK1xoeXBlcnNldHVwe3BhZ2VhbmNob3I9ZmFsc2UsY2l0ZWNvbG9yPWJsdWV9DQorXGJlZ2lue3RpdGxlcGFnZX0NCitcdnNwYWNlKns3Y219DQorXGJlZ2lue2NlbnRlcn0NCit7XExhcmdlIEludGVsXHRleHRzdXBlcnNjcmlwdHtcdGV4dHJlZ2lzdGVyZWR9IE9mZmxvYWQgUnVudGltZSBMaWJyYXJ5IH1cXA0KK1x2c3BhY2UqezFjbX0NCit7XGxhcmdlIEdlbmVyYXRlZCBieSBEb3h5Z2VuICRkb3h5Z2VudmVyc2lvbiB9XFwNCitcdnNwYWNlKnswLjVjbX0NCit7XHNtYWxsICRkYXRldGltZSB9XFwNCitcZW5ke2NlbnRlcn0NCitcZW5ke3RpdGxlcGFnZX0NCisNCit7XGJmIEZUQyBPcHRpbWl6YXRpb24gTm90aWNlfQ0KKw0KK0ludGVsJ3MgY29tcGlsZXJzIG1heSBvciBtYXkgbm90IG9wdGltaXplIHRvIHRoZSBzYW1lIGRlZ3JlZSBmb3Igbm9uLUludGVsIG1pY3JvcHJvY2Vzc29ycyBmb3INCitvcHRpbWl6YXRpb25zIHRoYXQgYXJlIG5vdCB1bmlxdWUgdG8gSW50ZWwgbWljcm9wcm9jZXNzb3JzLiBUaGVzZSBvcHRpbWl6YXRpb25zIGluY2x1ZGUgU1NFMiwNCitTU0UzLCBhbmQgU1NTRTMgaW5zdHJ1Y3Rpb24gc2V0cyBhbmQgb3RoZXIgb3B0aW1pemF0aW9ucy4gSW50ZWwgZG9lcyBub3QgZ3VhcmFudGVlIHRoZQ0KK2F2YWlsYWJpbGl0eSwgZnVuY3Rpb25hbGl0eSwgb3IgZWZmZWN0aXZlbmVzcyBvZiBhbnkgb3B0aW1pemF0aW9uIG9uIG1pY3JvcHJvY2Vzc29ycyBub3QNCittYW51ZmFjdHVyZWQgYnkgSW50ZWwuDQorDQorTWljcm9wcm9jZXNzb3ItZGVwZW5kZW50IG9wdGltaXphdGlvbnMgaW4gdGhpcyBwcm9kdWN0IGFyZSBpbnRlbmRlZCBmb3IgdXNlIHdpdGggSW50ZWwNCittaWNyb3Byb2Nlc3NvcnMuIENlcnRhaW4gb3B0aW1pemF0aW9ucyBub3Qgc3BlY2lmaWMgdG8gSW50ZWwgbWljcm9hcmNoaXRlY3R1cmUgYXJlIHJlc2VydmVkIGZvcg0KK0ludGVsIG1pY3JvcHJvY2Vzc29ycy4gUGxlYXNlIHJlZmVyIHRvIHRoZSBhcHBsaWNhYmxlIHByb2R1Y3QgVXNlciBhbmQgUmVmZXJlbmNlIEd1aWRlcyBmb3INCittb3JlIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGUgc3BlY2lmaWMgaW5zdHJ1Y3Rpb24gc2V0cyBjb3ZlcmVkIGJ5IHRoaXMgbm90aWNlLg0KKw0KK05vdGljZSByZXZpc2lvbiBcIzIwMTEwODA0DQorDQorXHZzcGFjZSp7MC41Y219DQorDQore1xiZiBUcmFkZW1hcmtzfQ0KKw0KK0ludGVsLCBYZW9uLCBhbmQgSW50ZWwgWGVvbiBQaGkgYXJlIHRyYWRlbWFya3Mgb2YgSW50ZWwgQ29ycG9yYXRpb24gaW4gdGhlIFUuUy4gYW5kL29yIG90aGVyIGNvdW50cmllcy4NCisNCitUaGlzIGRvY3VtZW50IGlzIENvcHlyaWdodCBcdGV4dGNvcHlyaWdodCAyMDE0LCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gDQorDQorXHBhZ2VudW1iZXJpbmd7cm9tYW59DQorXHRhYmxlb2Zjb250ZW50cw0KK1xwYWdlbnVtYmVyaW5ne2FyYWJpY30NCitcaHlwZXJzZXR1cHtwYWdlYW5jaG9yPXRydWUsY2l0ZWNvbG9yPWJsdWV9DQpkaWZmIC0tZ2l0IGEvZmluYWwvb2ZmbG9hZC9zcmMvY2Vhbl91dGlsLmNwcCBiL2ZpbmFsL29mZmxvYWQvc3JjL2NlYW5fdXRpbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmUxODkwYgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvc3JjL2NlYW5fdXRpbC5jcHAKQEAgLTAsMCArMSwzNDQgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgImNlYW5fdXRpbC5oIgorI2luY2x1ZGUgIm9mZmxvYWRfY29tbW9uLmgiCisKKy8vIDEuIGFsbG9jYXRlIGVsZW1lbnQgb2YgQ2VhblJlYWRSYW5nZXMgdHlwZQorLy8gMi4gaW5pdGlhbGl6ZWQgaXQgZm9yIHJlYWRpbmcgY29uc2VxdWVudGx5IGNvbnRpZ3VvdXMgcmFuZ2VzCisvLyAgICBkZXNjcmliZWQgYnkgImFwIiBhcmd1bWVudAorQ2VhblJlYWRSYW5nZXMgKiBpbml0X3JlYWRfcmFuZ2VzX2Fycl9kZXNjKGNvbnN0IGFycl9kZXNjICphcCkKK3sKKyAgICBDZWFuUmVhZFJhbmdlcyAqIHJlczsKKworICAgIC8vIGZpbmQgdGhlIG1heCBjb250aWd1b3VzIHJhbmdlCisgICAgaW50NjRfdCByYW5rID0gYXAtPnJhbmsgLSAxOworICAgIGludDY0X3QgbGVuZ3RoID0gYXAtPmRpbVtyYW5rXS5zaXplOworICAgIGZvciAoOyByYW5rID49IDA7IHJhbmstLSkgeworICAgICAgICBpZiAoYXAtPmRpbVtyYW5rXS5zdHJpZGUgPT0gMSkgeworICAgICAgICAgICAgbGVuZ3RoICo9IChhcC0+ZGltW3JhbmtdLnVwcGVyIC0gYXAtPmRpbVtyYW5rXS5sb3dlciArIDEpOworICAgICAgICAgICAgaWYgKHJhbmsgPiAwICYmIGxlbmd0aCAhPSBhcC0+ZGltW3JhbmsgLSAxXS5zaXplKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJlcyA9KENlYW5SZWFkUmFuZ2VzICopbWFsbG9jKHNpemVvZihDZWFuUmVhZFJhbmdlcykgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhcC0+cmFuayAtIHJhbmspICogc2l6ZW9mKENlYW5SZWFkRGltKSk7CisgICAgcmVzLT5jdXJyZW50X251bWJlciA9IDA7CisgICAgcmVzLT5yYW5nZV9zaXplID0gbGVuZ3RoOworICAgIHJlcy0+bGFzdF9ub25jb250X2luZCA9IHJhbms7CisKKyAgICAvLyBjYWxjdWxhdGUgbnVtYmVyIG9mIGNvbnRpZ3VvdXMgcmFuZ2VzIGluc2lkZSBub25jb250aWd1b3VzIGRpbWVuc2lvbnMKKyAgICBpbnQgY291bnQgPSAxOworICAgIGJvb2wgcHJldl9pc19jb250ID0gdHJ1ZTsKKyAgICBpbnQ2NF90IG9mZnNldCA9IDA7CisKKyAgICBmb3IgKDsgcmFuayA+PSAwOyByYW5rLS0pIHsKKyAgICAgICAgcmVzLT5EaW1bcmFua10uY291bnQgPSBjb3VudDsKKyAgICAgICAgcmVzLT5EaW1bcmFua10uc2l6ZSA9IGFwLT5kaW1bcmFua10uc3RyaWRlICogYXAtPmRpbVtyYW5rXS5zaXplOworICAgICAgICBjb3VudCAqPSAocHJldl9pc19jb250ICYmIGFwLT5kaW1bcmFua10uc3RyaWRlID09IDE/IDEgOgorICAgICAgICAgICAgKGFwLT5kaW1bcmFua10udXBwZXIgLSBhcC0+ZGltW3JhbmtdLmxvd2VyICsKKyAgICAgICAgICAgIGFwLT5kaW1bcmFua10uc3RyaWRlKSAvIGFwLT5kaW1bcmFua10uc3RyaWRlKTsKKyAgICAgICAgcHJldl9pc19jb250ID0gZmFsc2U7CisgICAgICAgIG9mZnNldCArPShhcC0+ZGltW3JhbmtdLmxvd2VyIC0gYXAtPmRpbVtyYW5rXS5saW5kZXgpICoKKyAgICAgICAgICAgICAgICAgYXAtPmRpbVtyYW5rXS5zaXplOworICAgIH0KKyAgICByZXMtPnJhbmdlX21heF9udW1iZXIgPSBjb3VudDsKKyAgICByZXMgLT4gcHRyID0gKHZvaWQqKWFwLT5iYXNlOworICAgIHJlcyAtPiBpbml0X29mZnNldCA9IG9mZnNldDsKKyAgICByZXR1cm4gcmVzOworfQorCisvLyBjaGVjayBpZiByYW5nZXMgZGVzY3JpYmVkIGJ5IDEgYXJndW1lbnQgY291bGQgYmUgdHJhbnNmZXJyZWQgaW50byByYW5nZXMKKy8vIGRlc2NyaWJlZCBieSAyLW5kIG9uZQorYm9vbCBjZWFuX3Jhbmdlc19tYXRjaCgKKyAgICBDZWFuUmVhZFJhbmdlcyAqIHJlYWRfcm5nMSwKKyAgICBDZWFuUmVhZFJhbmdlcyAqIHJlYWRfcm5nMgorKQoreworICAgIHJldHVybiAoIHJlYWRfcm5nMSA9PSBOVUxMIHx8IHJlYWRfcm5nMiA9PSBOVUxMIHx8CisgICAgICAgICAgICAocmVhZF9ybmcxLT5yYW5nZV9zaXplICUgcmVhZF9ybmcyLT5yYW5nZV9zaXplID09IDAgfHwKKyAgICAgICAgICAgIHJlYWRfcm5nMi0+cmFuZ2Vfc2l6ZSAlIHJlYWRfcm5nMS0+cmFuZ2Vfc2l6ZSA9PSAwKSk7Cit9CisKKy8vIFNldCBuZXh0IG9mZnNldCBhbmQgbGVuZ3RoIGFuZCByZXR1cm5zIHRydWUgZm9yIG5leHQgcmFuZ2UuCisvLyBSZXR1cm5zIGZhbHNlIGlmIHRoZSByYW5nZXMgYXJlIG92ZXIuCitib29sIGdldF9uZXh0X3JhbmdlKAorICAgIENlYW5SZWFkUmFuZ2VzICogcmVhZF9ybmcsCisgICAgaW50NjRfdCAqb2Zmc2V0CispCit7CisgICAgaWYgKCsrcmVhZF9ybmctPmN1cnJlbnRfbnVtYmVyID4gcmVhZF9ybmctPnJhbmdlX21heF9udW1iZXIpIHsKKyAgICAgICAgcmVhZF9ybmctPmN1cnJlbnRfbnVtYmVyID0gMDsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpbnQgcmFuayA9IDA7CisgICAgaW50IG51bSA9IHJlYWRfcm5nLT5jdXJyZW50X251bWJlciAtIDE7CisgICAgaW50NjRfdCBjdXJfb2Zmc2V0ID0gMDsKKyAgICBpbnQgbnVtX2xvYzsKKyAgICBmb3IgKDsgcmFuayA8PSByZWFkX3JuZy0+bGFzdF9ub25jb250X2luZDsgcmFuaysrKSB7CisgICAgICAgIG51bV9sb2MgPSBudW0gLyByZWFkX3JuZy0+RGltW3JhbmtdLmNvdW50OworICAgICAgICBjdXJfb2Zmc2V0ICs9IG51bV9sb2MgKiByZWFkX3JuZy0+RGltW3JhbmtdLnNpemU7CisgICAgICAgIG51bSA9IG51bSAlIHJlYWRfcm5nLT5EaW1bcmFua10uY291bnQ7CisgICAgfQorICAgICpvZmZzZXQgPSBjdXJfb2Zmc2V0ICsgcmVhZF9ybmctPmluaXRfb2Zmc2V0OworICAgIHJldHVybiB0cnVlOworfQorCitib29sIGlzX2Fycl9kZXNjX2NvbnRpZ3VvdXMoY29uc3QgYXJyX2Rlc2MgKmFwKQoreworICAgIGludDY0X3QgcmFuayA9IGFwLT5yYW5rIC0gMTsKKyAgICBpbnQ2NF90IGxlbmd0aCA9IGFwLT5kaW1bcmFua10uc2l6ZTsKKyAgICBmb3IgKDsgcmFuayA+PSAwOyByYW5rLS0pIHsKKyAgICAgICAgaWYgKGFwLT5kaW1bcmFua10uc3RyaWRlID4gMSAmJgorICAgICAgICAgICAgYXAtPmRpbVtyYW5rXS51cHBlciAtIGFwLT5kaW1bcmFua10ubG93ZXIgIT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChsZW5ndGggIT0gYXAtPmRpbVtyYW5rXS5zaXplKSB7CisgICAgICAgICAgICBmb3IgKDsgcmFuayA+PSAwOyByYW5rLS0pIHsKKyAgICAgICAgICAgICAgICBpZiAoYXAtPmRpbVtyYW5rXS51cHBlciAtIGFwLT5kaW1bcmFua10ubG93ZXIgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgbGVuZ3RoICo9IChhcC0+ZGltW3JhbmtdLnVwcGVyIC0gYXAtPmRpbVtyYW5rXS5sb3dlciArIDEpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworaW50NjRfdCBjZWFuX2dldF90cmFuc2Zfc2l6ZShDZWFuUmVhZFJhbmdlcyAqIHJlYWRfcm5nKQoreworICAgIHJldHVybihyZWFkX3JuZy0+cmFuZ2VfbWF4X251bWJlciAqIHJlYWRfcm5nLT5yYW5nZV9zaXplKTsKK30KKworc3RhdGljIHVpbnQ2NF90IGxhc3RfbGVmdCwgbGFzdF9yaWdodDsKK3R5cGVkZWYgdm9pZCAoKmZwcCkoY29uc3QgY2hhciAqc3BhY2VzLCB1aW50NjRfdCBsb3csIHVpbnQ2NF90IGhpZ2gsIGludCBlc2l6ZSk7CisKK3N0YXRpYyB2b2lkIGdlbmVyYXRlX29uZV9yYW5nZSgKKyAgICBjb25zdCBjaGFyICpzcGFjZXMsCisgICAgdWludDY0X3QgbHJhbmdlLAorICAgIHVpbnQ2NF90IHJyYW5nZSwKKyAgICBmcHAgZnAsCisgICAgaW50IGVzaXplCispCit7CisgICAgT0ZGTE9BRF9UUkFDRSgzLAorICAgICAgICAiJXMgICAgZ2VuZXJhdGVfb25lX3JhbmdlKGxyYW5nZT0lcCwgcnJhbmdlPSVwLCBlc2l6ZT0lZClcbiIsCisgICAgICAgIHNwYWNlcywgKHZvaWQqKWxyYW5nZSwgKHZvaWQqKXJyYW5nZSwgZXNpemUpOworICAgIGlmIChsYXN0X2xlZnQgPT0gLTEpIHsKKyAgICAgICAgLy8gRmlyc3QgcmFuZ2UKKyAgICAgICAgbGFzdF9sZWZ0ID0gbHJhbmdlOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKGxyYW5nZSA9PSBsYXN0X3JpZ2h0KzEpIHsKKyAgICAgICAgICAgIC8vIEV4dGVuZCBwcmV2aW91cyByYW5nZSwgZG9uJ3QgcHJpbnQKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICgqZnApKHNwYWNlcywgbGFzdF9sZWZ0LCBsYXN0X3JpZ2h0LCBlc2l6ZSk7CisgICAgICAgICAgICBsYXN0X2xlZnQgPSBscmFuZ2U7CisgICAgICAgIH0KKyAgICB9CisgICAgbGFzdF9yaWdodCA9IHJyYW5nZTsKK30KKworc3RhdGljIHZvaWQgZ2VuZXJhdGVfbWVtX3Jhbmdlc19vbmVfcmFuaygKKyAgICBjb25zdCBjaGFyICpzcGFjZXMsCisgICAgdWludDY0X3QgYmFzZSwKKyAgICB1aW50NjRfdCByYW5rLAorICAgIGNvbnN0IHN0cnVjdCBkaW1fZGVzYyAqZGRwLAorICAgIGZwcCBmcCwKKyAgICBpbnQgZXNpemUKKykKK3sKKyAgICB1aW50NjRfdCBsaW5kZXggPSBkZHAtPmxpbmRleDsKKyAgICB1aW50NjRfdCBsb3dlciA9IGRkcC0+bG93ZXI7CisgICAgdWludDY0X3QgdXBwZXIgPSBkZHAtPnVwcGVyOworICAgIHVpbnQ2NF90IHN0cmlkZSA9IGRkcC0+c3RyaWRlOworICAgIHVpbnQ2NF90IHNpemUgPSBkZHAtPnNpemU7CisgICAgT0ZGTE9BRF9UUkFDRSgzLAorICAgICAgICAiJXMgICAgIgorICAgICAgICAiZ2VuZXJhdGVfbWVtX3Jhbmdlc19vbmVfcmFuayhiYXNlPSVwLCByYW5rPSVsbGQsIGxpbmRleD0lbGxkLCAiCisgICAgICAgICJsb3dlcj0lbGxkLCB1cHBlcj0lbGxkLCBzdHJpZGU9JWxsZCwgc2l6ZT0lbGxkLCBlc2l6ZT0lZClcbiIsCisgICAgICAgIHNwYWNlcywgKHZvaWQqKWJhc2UsIHJhbmssIGxpbmRleCwgbG93ZXIsIHVwcGVyLCBzdHJpZGUsIHNpemUsIGVzaXplKTsKKyAgICBpZiAocmFuayA9PSAxKSB7CisgICAgICAgIHVpbnQ2NF90IGxyYW5nZSwgcnJhbmdlOworICAgICAgICBpZiAoc3RyaWRlID09IDEpIHsKKyAgICAgICAgICAgIGxyYW5nZSA9IGJhc2UgKyAobG93ZXItbGluZGV4KSpzaXplOworICAgICAgICAgICAgcnJhbmdlID0gbHJhbmdlICsgKHVwcGVyLWxvd2VyKzEpKnNpemUgLSAxOworICAgICAgICAgICAgZ2VuZXJhdGVfb25lX3JhbmdlKHNwYWNlcywgbHJhbmdlLCBycmFuZ2UsIGZwLCBlc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBmb3IgKGludCBpPWxvd2VyLWxpbmRleDsgaTw9dXBwZXItbGluZGV4OyBpKz1zdHJpZGUpIHsKKyAgICAgICAgICAgICAgICBscmFuZ2UgPSBiYXNlICsgaSpzaXplOworICAgICAgICAgICAgICAgIHJyYW5nZSA9IGxyYW5nZSArIHNpemUgLSAxOworICAgICAgICAgICAgICAgIGdlbmVyYXRlX29uZV9yYW5nZShzcGFjZXMsIGxyYW5nZSwgcnJhbmdlLCBmcCwgZXNpemUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBmb3IgKGludCBpPWxvd2VyLWxpbmRleDsgaTw9dXBwZXItbGluZGV4OyBpKz1zdHJpZGUpIHsKKyAgICAgICAgICAgIGdlbmVyYXRlX21lbV9yYW5nZXNfb25lX3JhbmsoCisgICAgICAgICAgICAgICAgc3BhY2VzLCBiYXNlK2kqc2l6ZSwgcmFuay0xLCBkZHArMSwgZnAsIGVzaXplKTsKKworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBnZW5lcmF0ZV9tZW1fcmFuZ2VzKAorICAgIGNvbnN0IGNoYXIgKnNwYWNlcywKKyAgICBjb25zdCBhcnJfZGVzYyAqYWRwLAorICAgIGJvb2wgZGVyZWYsCisgICAgZnBwIGZwCispCit7CisgICAgdWludDY0X3QgZXNpemU7CisKKyAgICBPRkZMT0FEX1RSQUNFKDMsCisgICAgICAgICIlcyAgICAiCisgICAgICAgICJnZW5lcmF0ZV9tZW1fcmFuZ2VzKGFkcD0lcCwgZGVyZWY9JWQsIGZwKVxuIiwKKyAgICAgICAgc3BhY2VzLCBhZHAsIGRlcmVmKTsKKyAgICBsYXN0X2xlZnQgPSAtMTsKKyAgICBsYXN0X3JpZ2h0ID0gLTI7CisKKyAgICAvLyBFbGVtZW50IHNpemUgaXMgZGVyaXZlZCBmcm9tIGxhc3QgZGltZW5zaW9uCisgICAgZXNpemUgPSBhZHAtPmRpbVthZHAtPnJhbmstMV0uc2l6ZTsKKworICAgIGdlbmVyYXRlX21lbV9yYW5nZXNfb25lX3JhbmsoCisgICAgICAgIC8vIEZvciBjX2NlYW5fdmFyIHRoZSBiYXNlIGFkZHIgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGRhdGEKKyAgICAgICAgLy8gRm9yIGNfY2Vhbl92YXJfcHRyIHRoZSBiYXNlIGFkZHIgaXMgZGVyZWZlcmVuY2VkIHRvIGdldCB0byB0aGUgZGF0YQorICAgICAgICBzcGFjZXMsIGRlcmVmID8gKigodWludDY0X3QqKShhZHAtPmJhc2UpKSA6IGFkcC0+YmFzZSwKKyAgICAgICAgYWRwLT5yYW5rLCAmYWRwLT5kaW1bMF0sIGZwLCBlc2l6ZSk7CisgICAgKCpmcCkoc3BhY2VzLCBsYXN0X2xlZnQsIGxhc3RfcmlnaHQsIGVzaXplKTsKK30KKworLy8gcmV0dXJucyBvZmZzZXQgYW5kIGxlbmd0aCBvZiB0aGUgZGF0YSB0byBiZSB0cmFuc2ZlcnJlZAordm9pZCBfX2Fycl9kYXRhX29mZnNldF9hbmRfbGVuZ3RoKAorICAgIGNvbnN0IGFycl9kZXNjICphZHAsCisgICAgaW50NjRfdCAmb2Zmc2V0LAorICAgIGludDY0X3QgJmxlbmd0aAorKQoreworICAgIGludDY0X3QgcmFuayA9IGFkcC0+cmFuayAtIDE7CisgICAgaW50NjRfdCBzaXplID0gYWRwLT5kaW1bcmFua10uc2l6ZTsKKyAgICBpbnQ2NF90IHJfb2ZmID0gMDsgLy8gb2Zmc2V0IGZyb20gcmlnaHQgYm91bmRhcnkKKworICAgIC8vIGZpbmQgdGhlIHJpZ2h0bW9zdCBkaW1lbnNpb24gd2hpY2ggdGFrZXMganVzdCBwYXJ0IG9mIGl0cworICAgIC8vIHJhbmdlLiBXZSBkZWZpbmUgaXQgaWYgdGhlIHNpemUgb2YgbGVmdCByYW5rIGlzIG5vdCBlcXVhbAorICAgIC8vIHRoZSByYW5nZSdzIGxlbmd0aCBiZXR3ZWVuIHVwcGVyIGFuZCBsb3dlciBib3VuZ2FyaWVzCisgICAgd2hpbGUgKHJhbmsgPiAwKSB7CisgICAgICAgIHNpemUgKj0gKGFkcC0+ZGltW3JhbmtdLnVwcGVyIC0gYWRwLT5kaW1bcmFua10ubG93ZXIgKyAxKTsKKyAgICAgICAgaWYgKHNpemUgIT0gYWRwLT5kaW1bcmFuayAtIDFdLnNpemUpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHJhbmstLTsKKyAgICB9CisKKyAgICBvZmZzZXQgPSAoYWRwLT5kaW1bcmFua10ubG93ZXIgLSBhZHAtPmRpbVtyYW5rXS5saW5kZXgpICoKKyAgICAgICAgICAgICBhZHAtPmRpbVtyYW5rXS5zaXplOworCisgICAgLy8gZmluZCBnYXBzIGJvdGggZnJvbSB0aGUgbGVmdCAtIG9mZnNldCBhbmQgZnJvbSB0aGUgcmlnaHQgLSByX29mZgorICAgIGZvciAocmFuay0tOyByYW5rID49IDA7IHJhbmstLSkgeworICAgICAgICBvZmZzZXQgKz0gKGFkcC0+ZGltW3JhbmtdLmxvd2VyIC0gYWRwLT5kaW1bcmFua10ubGluZGV4KSAqCisgICAgICAgICAgICAgICAgICBhZHAtPmRpbVtyYW5rXS5zaXplOworICAgICAgICByX29mZiArPSBhZHAtPmRpbVtyYW5rXS5zaXplIC0KKyAgICAgICAgICAgICAgICAgKGFkcC0+ZGltW3JhbmsgKyAxXS51cHBlciAtIGFkcC0+ZGltW3JhbmsgKyAxXS5saW5kZXggKyAxKSAqCisgICAgICAgICAgICAgICAgIGFkcC0+ZGltW3JhbmsgKyAxXS5zaXplOworICAgIH0KKyAgICBsZW5ndGggPSAoYWRwLT5kaW1bMF0udXBwZXIgLSBhZHAtPmRpbVswXS5saW5kZXggKyAxKSAqCisgICAgICAgICAgICAgYWRwLT5kaW1bMF0uc2l6ZSAtIG9mZnNldCAtIHJfb2ZmOworfQorCisjaWYgT0ZGTE9BRF9ERUJVRyA+IDAKKwordm9pZCBwcmludF9yYW5nZSgKKyAgICBjb25zdCBjaGFyICpzcGFjZXMsCisgICAgdWludDY0X3QgbG93LAorICAgIHVpbnQ2NF90IGhpZ2gsCisgICAgaW50IGVzaXplCispCit7CisgICAgY2hhciBidWZmZXJbMTAyNF07CisgICAgY2hhciBudW1iZXJbMzJdOworCisgICAgT0ZGTE9BRF9UUkFDRSgzLCAiJXMgICAgICAgIHByaW50X3JhbmdlKGxvdz0lcCwgaGlnaD0lcCwgZXNpemU9JWQpXG4iLAorICAgICAgICBzcGFjZXMsICh2b2lkKilsb3csICh2b2lkKiloaWdoLCBlc2l6ZSk7CisKKyAgICBpZiAoY29uc29sZV9lbmFibGVkIDwgNCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIE9GRkxPQURfVFJBQ0UoNCwgIiVzICAgICAgICAgICAgdmFsdWVzOlxuIiwgc3BhY2VzKTsKKyAgICBpbnQgY291bnQgPSAwOworICAgIGJ1ZmZlclswXSA9ICdcMCc7CisgICAgd2hpbGUgKGxvdyA8PSBoaWdoKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChlc2l6ZSkKKyAgICAgICAgeworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBzcHJpbnRmKG51bWJlciwgIiVkICIsICooKGNoYXIgKilsb3cpKTsKKyAgICAgICAgICAgIGxvdyArPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIHNwcmludGYobnVtYmVyLCAiJWQgIiwgKigoc2hvcnQgKilsb3cpKTsKKyAgICAgICAgICAgIGxvdyArPSAyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIHNwcmludGYobnVtYmVyLCAiJWQgIiwgKigoaW50ICopbG93KSk7CisgICAgICAgICAgICBsb3cgKz0gNDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgc3ByaW50ZihudW1iZXIsICIweCUwMTZ4ICIsICooKHVpbnQ2NF90ICopbG93KSk7CisgICAgICAgICAgICBsb3cgKz0gODsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHN0cmNhdChidWZmZXIsIG51bWJlcik7CisgICAgICAgIGNvdW50Kys7CisgICAgICAgIGlmIChjb3VudCA9PSAxMCkgeworICAgICAgICAgICAgT0ZGTE9BRF9UUkFDRSg0LCAiJXMgICAgICAgICAgICAlc1xuIiwgc3BhY2VzLCBidWZmZXIpOworICAgICAgICAgICAgY291bnQgPSAwOworICAgICAgICAgICAgYnVmZmVyWzBdID0gJ1wwJzsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoY291bnQgIT0gMCkgeworICAgICAgICBPRkZMT0FEX1RSQUNFKDQsICIlcyAgICAgICAgICAgICVzXG4iLCBzcGFjZXMsIGJ1ZmZlcik7CisgICAgfQorfQorCit2b2lkIF9fYXJyX2Rlc2NfZHVtcCgKKyAgICBjb25zdCBjaGFyICpzcGFjZXMsCisgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICBjb25zdCBhcnJfZGVzYyAqYWRwLAorICAgIGJvb2wgZGVyZWYKKykKK3sKKyAgICBPRkZMT0FEX1RSQUNFKDIsICIlcyVzIENFQU4gZXhwcmVzc2lvbiAlcFxuIiwgc3BhY2VzLCBuYW1lLCBhZHApOworCisgICAgaWYgKGFkcCAhPSAwKSB7CisgICAgICAgIE9GRkxPQURfVFJBQ0UoMiwgIiVzICAgIGJhc2U9JWxseCwgcmFuaz0lbGxkXG4iLAorICAgICAgICAgICAgc3BhY2VzLCBhZHAtPmJhc2UsIGFkcC0+cmFuayk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhZHAtPnJhbms7IGkrKykgeworICAgICAgICAgICAgT0ZGTE9BRF9UUkFDRSgyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMgICAgZGltZW5zaW9uICVkOiBzaXplPSVsbGQsIGxpbmRleD0lbGxkLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJsb3dlcj0lbGxkLCB1cHBlcj0lbGxkLCBzdHJpZGU9JWxsZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2VzLCBpLCBhZHAtPmRpbVtpXS5zaXplLCBhZHAtPmRpbVtpXS5saW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFkcC0+ZGltW2ldLmxvd2VyLCBhZHAtPmRpbVtpXS51cHBlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYWRwLT5kaW1baV0uc3RyaWRlKTsKKyAgICAgICAgfQorICAgICAgICAvLyBGb3IgY19jZWFuX3ZhciB0aGUgYmFzZSBhZGRyIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBkYXRhCisgICAgICAgIC8vIEZvciBjX2NlYW5fdmFyX3B0ciB0aGUgYmFzZSBhZGRyIGlzIGRlcmVmZXJlbmNlZCB0byBnZXQgdG8gdGhlIGRhdGEKKyAgICAgICAgZ2VuZXJhdGVfbWVtX3JhbmdlcyhzcGFjZXMsIGFkcCwgZGVyZWYsICZwcmludF9yYW5nZSk7CisgICAgfQorfQorI2VuZGlmIC8vIE9GRkxPQURfREVCVUcKZGlmZiAtLWdpdCBhL2ZpbmFsL29mZmxvYWQvc3JjL2NlYW5fdXRpbC5oIGIvZmluYWwvb2ZmbG9hZC9zcmMvY2Vhbl91dGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGViMWY1MwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvc3JjL2NlYW5fdXRpbC5oCkBAIC0wLDAgKzEsOTYgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBDRUFOX1VUSUxfSF9JTkNMVURFRAorI2RlZmluZSBDRUFOX1VUSUxfSF9JTkNMVURFRAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8vIENFQU4gZXhwcmVzc2lvbiByZXByZXNlbnRhdGlvbgorc3RydWN0IGRpbV9kZXNjIHsKKyAgICBpbnQ2NF90IHNpemU7ICAgICAgIC8vIExlbmd0aCBvZiBkYXRhIHR5cGUKKyAgICBpbnQ2NF90IGxpbmRleDsgICAgIC8vIExvd2VyIGluZGV4CisgICAgaW50NjRfdCBsb3dlcjsgICAgICAvLyBMb3dlciBzZWN0aW9uIGJvdW5kCisgICAgaW50NjRfdCB1cHBlcjsgICAgICAvLyBVcHBlciBzZWN0aW9uIGJvdW5kCisgICAgaW50NjRfdCBzdHJpZGU7ICAgICAvLyBTdHJpZGUKK307CisKK3N0cnVjdCBhcnJfZGVzYyB7CisgICAgaW50NjRfdCBiYXNlOyAgICAgICAvLyBCYXNlIGFkZHJlc3MKKyAgICBpbnQ2NF90IHJhbms7ICAgICAgIC8vIFJhbmsgb2YgYXJyYXkKKyAgICBkaW1fZGVzYyBkaW1bMV07Cit9OworCitzdHJ1Y3QgQ2VhblJlYWREaW0geworICAgIGludDY0X3QgY291bnQ7IC8vIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhpcyBkaW1lbnNpb24KKyAgICBpbnQ2NF90IHNpemU7ICAvLyBUaGUgbnVtYmVyIG9mIGJ5dGVzIGJldHdlZW4gc3VjY2Vzc2l2ZQorICAgICAgICAgICAgICAgICAgIC8vIGVsZW1lbnRzIGluIHRoaXMgZGltZW5zaW9uLgorfTsKKworc3RydWN0IENlYW5SZWFkUmFuZ2VzIHsKKyAgICB2b2lkICogIHB0cjsKKyAgICBpbnQ2NF90IGN1cnJlbnRfbnVtYmVyOyAgIC8vIHRoZSBudW1iZXIgb2YgcmFuZ2VzIHJlYWQKKyAgICBpbnQ2NF90IHJhbmdlX21heF9udW1iZXI7IC8vIG51bWJlciBvZiBjb250aWd1b3VzIHJhbmdlcworICAgIGludDY0X3QgcmFuZ2Vfc2l6ZTsgICAgICAgLy8gc2l6ZSBvZiBtYXggY29udGlndW91cyByYW5nZQorICAgIGludCAgICAgbGFzdF9ub25jb250X2luZDsgLy8gc2l6ZSBvZiBEaW0gYXJyYXkKKyAgICBpbnQ2NF90IGluaXRfb2Zmc2V0OyAgICAgIC8vIG9mZnNldCBvZiAxLXN0IGVsZW1lbnQgZnJvbSBhcnJheSBsZWZ0IGJvdW5kCisgICAgQ2VhblJlYWREaW0gRGltWzFdOworfTsKKworLy8gYXJyYXkgZGVzY3JpcHRvciBsZW5ndGgKKyNkZWZpbmUgX19hcnJfZGVzY19sZW5ndGgocmFuaykgXAorICAgIChzaXplb2YoaW50NjRfdCkgKyBzaXplb2YoZGltX2Rlc2MpICogKHJhbmspKQorCisvLyByZXR1cm5zIG9mZnNldCBhbmQgbGVuZ3RoIG9mIHRoZSBkYXRhIHRvIGJlIHRyYW5zZmVycmVkCit2b2lkIF9fYXJyX2RhdGFfb2Zmc2V0X2FuZF9sZW5ndGgoY29uc3QgYXJyX2Rlc2MgKmFkcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICZvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAmbGVuZ3RoKTsKKworLy8gZGVmaW5lIGlmIGRhdGEgYXJyYXkgZGVzY3JpYmVkIGJ5IGFyZ3VtZW50IGlzIGNvbnRpZ3VvdXMgb25lCitib29sIGlzX2Fycl9kZXNjX2NvbnRpZ3VvdXMoY29uc3QgYXJyX2Rlc2MgKmFwKTsKKworLy8gYWxsb2NhdGUgZWxlbWVudCBvZiBDZWFuUmVhZFJhbmdlcyB0eXBlIGluaXRpYWxpemVkCisvLyB0byByZWFkIGNvbnNlcXVlbnRseSBjb250aWd1b3VzIHJhbmdlcyBkZXNjcmliZWQgYnkgImFwIiBhcmd1bWVudAorQ2VhblJlYWRSYW5nZXMgKiBpbml0X3JlYWRfcmFuZ2VzX2Fycl9kZXNjKGNvbnN0IGFycl9kZXNjICphcCk7CisKKy8vIGNoZWNrIGlmIHJhbmdlcyBkZXNjcmliZWQgYnkgMSBhcmd1bWVudCBjb3VsZCBiZSB0cmFuc2ZlcnJlZCBpbnRvIHJhbmdlcworLy8gZGVzY3JpYmVkIGJ5IDItbmQgb25lCitib29sIGNlYW5fcmFuZ2VzX21hdGNoKAorICAgIENlYW5SZWFkUmFuZ2VzICogcmVhZF9ybmcxLAorICAgIENlYW5SZWFkUmFuZ2VzICogcmVhZF9ybmcyCispOworCisvLyBmaXJzdCBhcmd1bWVudCAtIHJldHVybmVkIHZhbHVlIGJ5IGNhbGwgdG8gaW5pdF9yZWFkX3Jhbmdlc19hcnJfZGVzYy4KKy8vIHJldHVybnMgdHJ1ZSBpZiBvZmZzZXQgYW5kIGxlbmd0aCBvZiBuZXh0IHJhbmdlIGlzIHNldCBzdWNjZXNzZnVseS4KKy8vIHJldHVybnMgZmFsc2UgaWYgdGhlIHJhbmdlcyBpcyBvdmVyLgorYm9vbCBnZXRfbmV4dF9yYW5nZSgKKyAgICBDZWFuUmVhZFJhbmdlcyAqIHJlYWRfcm5nLAorICAgIGludDY0X3QgKm9mZnNldAorKTsKKworLy8gcmV0dXJucyBudW1iZXIgb2YgdHJhbnNmZXJyZWQgYnl0ZXMKK2ludDY0X3QgY2Vhbl9nZXRfdHJhbnNmX3NpemUoQ2VhblJlYWRSYW5nZXMgKiByZWFkX3JuZyk7CisKKyNpZiBPRkZMT0FEX0RFQlVHID4gMAorLy8gcHJpbnRzIGFycmF5IGRlc2NyaXB0b3IgY29udGVudHMgdG8gc3RkZXJyCit2b2lkICAgIF9fYXJyX2Rlc2NfZHVtcCgKKyAgICBjb25zdCBjaGFyICpzcGFjZXMsCisgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICBjb25zdCBhcnJfZGVzYyAqYWRwLAorICAgIGJvb2wgZGVyZWZlcmVuY2UpOworI2Vsc2UKKyNkZWZpbmUgX19hcnJfZGVzY19kdW1wKAorICAgIHNwYWNlcywKKyAgICBuYW1lLAorICAgIGFkcCwKKyAgICBkZXJlZmVyZW5jZSkKKyNlbmRpZiAvLyBPRkZMT0FEX0RFQlVHCisKKyNlbmRpZiAvLyBDRUFOX1VUSUxfSF9JTkNMVURFRApkaWZmIC0tZ2l0IGEvZmluYWwvb2ZmbG9hZC9zcmMvY29pL2NvaV9jbGllbnQuY3BwIGIvZmluYWwvb2ZmbG9hZC9zcmMvY29pL2NvaV9jbGllbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiOGM3ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL3NyYy9jb2kvY29pX2NsaWVudC5jcHAKQEAgLTAsMCArMSwzNTAgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworLy8gVGhlIENPSSBob3N0IGludGVyZmFjZQorCisjaW5jbHVkZSAiY29pX2NsaWVudC5oIgorI2luY2x1ZGUgIi4uL29mZmxvYWRfY29tbW9uLmgiCisKK25hbWVzcGFjZSBDT0kgeworCisjZGVmaW5lIENPSV9WRVJTSU9OMSAgICAiQ09JXzEuMCIKKyNkZWZpbmUgQ09JX1ZFUlNJT04yICAgICJDT0lfMi4wIgorCitib29sICAgICAgICAgICAgaXNfYXZhaWxhYmxlOworc3RhdGljIHZvaWQqICAgIGxpYl9oYW5kbGU7CisKKy8vIHBvaW50ZXJzIHRvIGZ1bmN0aW9ucyBmcm9tIENPSSBsaWJyYXJ5CitDT0lSRVNVTFQgKCpFbmdpbmVHZXRDb3VudCkoQ09JX0lTQV9UWVBFLCB1aW50MzJfdCopOworQ09JUkVTVUxUICgqRW5naW5lR2V0SGFuZGxlKShDT0lfSVNBX1RZUEUsIHVpbnQzMl90LCBDT0lFTkdJTkUqKTsKKworQ09JUkVTVUxUICgqUHJvY2Vzc0NyZWF0ZUZyb21NZW1vcnkpKENPSUVOR0lORSwgY29uc3QgY2hhciosIGNvbnN0IHZvaWQqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90LCBpbnQsIGNvbnN0IGNoYXIqKiwgdWludDhfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiosIHVpbnQ4X3QsIGNvbnN0IGNoYXIqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QsIENPSVBST0NFU1MqKTsKK0NPSVJFU1VMVCAoKlByb2Nlc3NEZXN0cm95KShDT0lQUk9DRVNTLCBpbnQzMl90LCB1aW50OF90LCBpbnQ4X3QqLCB1aW50MzJfdCopOworQ09JUkVTVUxUICgqUHJvY2Vzc0dldEZ1bmN0aW9uSGFuZGxlcykoQ09JUFJPQ0VTUywgdWludDMyX3QsIGNvbnN0IGNoYXIqKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPSUZVTkNUSU9OKik7CitDT0lSRVNVTFQgKCpQcm9jZXNzTG9hZExpYnJhcnlGcm9tTWVtb3J5KShDT0lQUk9DRVNTLCBjb25zdCB2b2lkKiwgdWludDY0X3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiwgdWludDY0X3QsIHVpbnQzMl90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JTElCUkFSWSopOworQ09JUkVTVUxUICgqUHJvY2Vzc1JlZ2lzdGVyTGlicmFyaWVzKSh1aW50MzJfdCwgY29uc3Qgdm9pZCoqLCBjb25zdCB1aW50NjRfdCosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqKiwgY29uc3QgdWludDY0X3QqKTsKKworQ09JUkVTVUxUICgqUGlwZWxpbmVDcmVhdGUpKENPSVBST0NFU1MsIENPSV9DUFVfTUFTSywgdWludDMyX3QsIENPSVBJUEVMSU5FKik7CitDT0lSRVNVTFQgKCpQaXBlbGluZURlc3Ryb3kpKENPSVBJUEVMSU5FKTsKK0NPSVJFU1VMVCAoKlBpcGVsaW5lUnVuRnVuY3Rpb24pKENPSVBJUEVMSU5FLCBDT0lGVU5DVElPTiwgdWludDMyX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDT0lCVUZGRVIqLCBjb25zdCBDT0lfQUNDRVNTX0ZMQUdTKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90LCBjb25zdCBDT0lFVkVOVCosIGNvbnN0IHZvaWQqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QsIHZvaWQqLCB1aW50MTZfdCwgQ09JRVZFTlQqKTsKKworQ09JUkVTVUxUICgqQnVmZmVyQ3JlYXRlKSh1aW50NjRfdCwgQ09JX0JVRkZFUl9UWVBFLCB1aW50MzJfdCwgY29uc3Qgdm9pZCosCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90LCBjb25zdCBDT0lQUk9DRVNTKiwgQ09JQlVGRkVSKik7CitDT0lSRVNVTFQgKCpCdWZmZXJDcmVhdGVGcm9tTWVtb3J5KSh1aW50NjRfdCwgQ09JX0JVRkZFUl9UWVBFLCB1aW50MzJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqLCB1aW50MzJfdCwgY29uc3QgQ09JUFJPQ0VTUyosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0lCVUZGRVIqKTsKK0NPSVJFU1VMVCAoKkJ1ZmZlckRlc3Ryb3kpKENPSUJVRkZFUik7CitDT0lSRVNVTFQgKCpCdWZmZXJNYXApKENPSUJVRkZFUiwgdWludDY0X3QsIHVpbnQ2NF90LCBDT0lfTUFQX1RZUEUsIHVpbnQzMl90LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDT0lFVkVOVCosIENPSUVWRU5UKiwgQ09JTUFQSU5TVEFOQ0UqLCB2b2lkKiopOworQ09JUkVTVUxUICgqQnVmZmVyVW5tYXApKENPSU1BUElOU1RBTkNFLCB1aW50MzJfdCwgY29uc3QgQ09JRVZFTlQqLCBDT0lFVkVOVCopOworQ09JUkVTVUxUICgqQnVmZmVyV3JpdGUpKENPSUJVRkZFUiwgdWludDY0X3QsIGNvbnN0IHZvaWQqLCB1aW50NjRfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDT0lfQ09QWV9UWVBFLCB1aW50MzJfdCwgY29uc3QgQ09JRVZFTlQqLCBDT0lFVkVOVCopOworQ09JUkVTVUxUICgqQnVmZmVyUmVhZCkoQ09JQlVGRkVSLCB1aW50NjRfdCwgdm9pZCosIHVpbnQ2NF90LCBDT0lfQ09QWV9UWVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QsIGNvbnN0IENPSUVWRU5UKiwgQ09JRVZFTlQqKTsKK0NPSVJFU1VMVCAoKkJ1ZmZlckNvcHkpKENPSUJVRkZFUiwgQ09JQlVGRkVSLCB1aW50NjRfdCwgdWludDY0X3QsIHVpbnQ2NF90LAorICAgICAgICAgICAgICAgICAgICAgICAgQ09JX0NPUFlfVFlQRSwgdWludDMyX3QsIGNvbnN0IENPSUVWRU5UKiwgQ09JRVZFTlQqKTsKK0NPSVJFU1VMVCAoKkJ1ZmZlckdldFNpbmtBZGRyZXNzKShDT0lCVUZGRVIsIHVpbnQ2NF90Kik7CitDT0lSRVNVTFQgKCpCdWZmZXJTZXRTdGF0ZSkoQ09JQlVGRkVSLCBDT0lQUk9DRVNTLCBDT0lfQlVGRkVSX1NUQVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPSV9CVUZGRVJfTU9WRV9GTEFHLCB1aW50MzJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgIENPSUVWRU5UKiwgQ09JRVZFTlQqKTsKKworQ09JUkVTVUxUICgqRXZlbnRXYWl0KSh1aW50MTZfdCwgY29uc3QgQ09JRVZFTlQqLCBpbnQzMl90LCB1aW50OF90LCB1aW50MzJfdCosCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90Kik7CisKK3VpbnQ2NF90ICAoKlBlcmZHZXRDeWNsZUZyZXF1ZW5jeSkodm9pZCk7CisKK2Jvb2wgaW5pdCh2b2lkKQoreworI2lmbmRlZiBUQVJHRVRfV0lOTlQKKyAgICBjb25zdCBjaGFyICpsaWJfbmFtZSA9ICJsaWJjb2lfaG9zdC5zby4wIjsKKyNlbHNlIC8vIFRBUkdFVF9XSU5OVAorICAgIGNvbnN0IGNoYXIgKmxpYl9uYW1lID0gImNvaV9ob3N0LmRsbCI7CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJMb2FkaW5nIENPSSBsaWJyYXJ5ICVzIC4uLlxuIiwgbGliX25hbWUpOworICAgIGxpYl9oYW5kbGUgPSBETF9vcGVuKGxpYl9uYW1lKTsKKyAgICBpZiAobGliX2hhbmRsZSA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBsb2FkIHRoZSBsaWJyYXJ5XG4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEVuZ2luZUdldENvdW50ID0KKyAgICAgICAgKENPSVJFU1VMVCAoKikoQ09JX0lTQV9UWVBFLCB1aW50MzJfdCopKQorICAgICAgICAgICAgRExfc3ltKGxpYl9oYW5kbGUsICJDT0lFbmdpbmVHZXRDb3VudCIsIENPSV9WRVJTSU9OMSk7CisgICAgaWYgKEVuZ2luZUdldENvdW50ID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gQ09JIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNPSUVuZ2luZUdldENvdW50Iik7CisgICAgICAgIGZpbmkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEVuZ2luZUdldEhhbmRsZSA9CisgICAgICAgIChDT0lSRVNVTFQgKCopKENPSV9JU0FfVFlQRSwgdWludDMyX3QsIENPSUVOR0lORSopKQorICAgICAgICAgICAgRExfc3ltKGxpYl9oYW5kbGUsICJDT0lFbmdpbmVHZXRIYW5kbGUiLCBDT0lfVkVSU0lPTjEpOworICAgIGlmIChFbmdpbmVHZXRIYW5kbGUgPT0gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJGYWlsZWQgdG8gZmluZCAlcyBpbiBDT0kgbGlicmFyeVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ09JRW5naW5lR2V0SGFuZGxlIik7CisgICAgICAgIGZpbmkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIFByb2Nlc3NDcmVhdGVGcm9tTWVtb3J5ID0KKyAgICAgICAgKENPSVJFU1VMVCAoKikoQ09JRU5HSU5FLCBjb25zdCBjaGFyKiwgY29uc3Qgdm9pZCosIHVpbnQ2NF90LCBpbnQsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqKiwgdWludDhfdCwgY29uc3QgY2hhcioqLCB1aW50OF90LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiwgdWludDY0X3QsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QsIENPSVBST0NFU1MqKSkKKyAgICAgICAgICAgIERMX3N5bShsaWJfaGFuZGxlLCAiQ09JUHJvY2Vzc0NyZWF0ZUZyb21NZW1vcnkiLCBDT0lfVkVSU0lPTjEpOworICAgIGlmIChQcm9jZXNzQ3JlYXRlRnJvbU1lbW9yeSA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBmaW5kICVzIGluIENPSSBsaWJyYXJ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDT0lQcm9jZXNzQ3JlYXRlRnJvbU1lbW9yeSIpOworICAgICAgICBmaW5pKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBQcm9jZXNzRGVzdHJveSA9CisgICAgICAgIChDT0lSRVNVTFQgKCopKENPSVBST0NFU1MsIGludDMyX3QsIHVpbnQ4X3QsIGludDhfdCosCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KikpCisgICAgICAgICAgICBETF9zeW0obGliX2hhbmRsZSwgIkNPSVByb2Nlc3NEZXN0cm95IiwgQ09JX1ZFUlNJT04xKTsKKyAgICBpZiAoUHJvY2Vzc0Rlc3Ryb3kgPT0gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJGYWlsZWQgdG8gZmluZCAlcyBpbiBDT0kgbGlicmFyeVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ09JUHJvY2Vzc0Rlc3Ryb3kiKTsKKyAgICAgICAgZmluaSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgUHJvY2Vzc0dldEZ1bmN0aW9uSGFuZGxlcyA9CisgICAgICAgIChDT0lSRVNVTFQgKCopKENPSVBST0NFU1MsIHVpbnQzMl90LCBjb25zdCBjaGFyKiosIENPSUZVTkNUSU9OKikpCisgICAgICAgICAgICBETF9zeW0obGliX2hhbmRsZSwgIkNPSVByb2Nlc3NHZXRGdW5jdGlvbkhhbmRsZXMiLCBDT0lfVkVSU0lPTjEpOworICAgIGlmIChQcm9jZXNzR2V0RnVuY3Rpb25IYW5kbGVzID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gQ09JIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNPSVByb2Nlc3NHZXRGdW5jdGlvbkhhbmRsZXMiKTsKKyAgICAgICAgZmluaSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgUHJvY2Vzc0xvYWRMaWJyYXJ5RnJvbU1lbW9yeSA9CisgICAgICAgIChDT0lSRVNVTFQgKCopKENPSVBST0NFU1MsIGNvbnN0IHZvaWQqLCB1aW50NjRfdCwgY29uc3QgY2hhciosCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgdWludDY0X3QsIHVpbnQzMl90LAorICAgICAgICAgICAgICAgICAgICAgICBDT0lMSUJSQVJZKikpCisgICAgICAgICAgICBETF9zeW0obGliX2hhbmRsZSwgIkNPSVByb2Nlc3NMb2FkTGlicmFyeUZyb21NZW1vcnkiLCBDT0lfVkVSU0lPTjIpOworICAgIGlmIChQcm9jZXNzTG9hZExpYnJhcnlGcm9tTWVtb3J5ID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gQ09JIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNPSVByb2Nlc3NMb2FkTGlicmFyeUZyb21NZW1vcnkiKTsKKyAgICAgICAgZmluaSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgUHJvY2Vzc1JlZ2lzdGVyTGlicmFyaWVzID0KKyAgICAgICAgKENPSVJFU1VMVCAoKikodWludDMyX3QsIGNvbnN0IHZvaWQqKiwgY29uc3QgdWludDY0X3QqLCBjb25zdCBjaGFyKiosCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ2NF90KikpCisgICAgICAgICAgICBETF9zeW0obGliX2hhbmRsZSwgIkNPSVByb2Nlc3NSZWdpc3RlckxpYnJhcmllcyIsIENPSV9WRVJTSU9OMSk7CisgICAgaWYgKFByb2Nlc3NSZWdpc3RlckxpYnJhcmllcyA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBmaW5kICVzIGluIENPSSBsaWJyYXJ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDT0lQcm9jZXNzUmVnaXN0ZXJMaWJyYXJpZXMiKTsKKyAgICAgICAgZmluaSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgUGlwZWxpbmVDcmVhdGUgPQorICAgICAgICAoQ09JUkVTVUxUICgqKShDT0lQUk9DRVNTLCBDT0lfQ1BVX01BU0ssIHVpbnQzMl90LCBDT0lQSVBFTElORSopKQorICAgICAgICAgICAgRExfc3ltKGxpYl9oYW5kbGUsICJDT0lQaXBlbGluZUNyZWF0ZSIsIENPSV9WRVJTSU9OMSk7CisgICAgaWYgKFBpcGVsaW5lQ3JlYXRlID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gQ09JIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNPSVBpcGVsaW5lQ3JlYXRlIik7CisgICAgICAgIGZpbmkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIFBpcGVsaW5lRGVzdHJveSA9CisgICAgICAgIChDT0lSRVNVTFQgKCopKENPSVBJUEVMSU5FKSkKKyAgICAgICAgICAgIERMX3N5bShsaWJfaGFuZGxlLCAiQ09JUGlwZWxpbmVEZXN0cm95IiwgQ09JX1ZFUlNJT04xKTsKKyAgICBpZiAoUGlwZWxpbmVEZXN0cm95ID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gQ09JIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNPSVBpcGVsaW5lRGVzdHJveSIpOworICAgICAgICBmaW5pKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBQaXBlbGluZVJ1bkZ1bmN0aW9uID0KKyAgICAgICAgKENPSVJFU1VMVCAoKikoQ09JUElQRUxJTkUsIENPSUZVTkNUSU9OLCB1aW50MzJfdCwgY29uc3QgQ09JQlVGRkVSKiwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ09JX0FDQ0VTU19GTEFHUyosIHVpbnQzMl90LCBjb25zdCBDT0lFVkVOVCosCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqLCB1aW50MTZfdCwgdm9pZCosIHVpbnQxNl90LCBDT0lFVkVOVCopKQorICAgICAgICAgICAgRExfc3ltKGxpYl9oYW5kbGUsICJDT0lQaXBlbGluZVJ1bkZ1bmN0aW9uIiwgQ09JX1ZFUlNJT04xKTsKKyAgICBpZiAoUGlwZWxpbmVSdW5GdW5jdGlvbiA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBmaW5kICVzIGluIENPSSBsaWJyYXJ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDT0lQaXBlbGluZVJ1bkZ1bmN0aW9uIik7CisgICAgICAgIGZpbmkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEJ1ZmZlckNyZWF0ZSA9CisgICAgICAgIChDT0lSRVNVTFQgKCopKHVpbnQ2NF90LCBDT0lfQlVGRkVSX1RZUEUsIHVpbnQzMl90LCBjb25zdCB2b2lkKiwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QsIGNvbnN0IENPSVBST0NFU1MqLCBDT0lCVUZGRVIqKSkKKyAgICAgICAgICAgIERMX3N5bShsaWJfaGFuZGxlLCAiQ09JQnVmZmVyQ3JlYXRlIiwgQ09JX1ZFUlNJT04xKTsKKyAgICBpZiAoQnVmZmVyQ3JlYXRlID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gQ09JIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNPSUJ1ZmZlckNyZWF0ZSIpOworICAgICAgICBmaW5pKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBCdWZmZXJDcmVhdGVGcm9tTWVtb3J5ID0KKyAgICAgICAgKENPSVJFU1VMVCAoKikodWludDY0X3QsIENPSV9CVUZGRVJfVFlQRSwgdWludDMyX3QsIHZvaWQqLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCwgY29uc3QgQ09JUFJPQ0VTUyosIENPSUJVRkZFUiopKQorICAgICAgICAgICAgRExfc3ltKGxpYl9oYW5kbGUsICJDT0lCdWZmZXJDcmVhdGVGcm9tTWVtb3J5IiwgQ09JX1ZFUlNJT04xKTsKKyAgICBpZiAoQnVmZmVyQ3JlYXRlRnJvbU1lbW9yeSA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBmaW5kICVzIGluIENPSSBsaWJyYXJ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDT0lCdWZmZXJDcmVhdGVGcm9tTWVtb3J5Iik7CisgICAgICAgIGZpbmkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEJ1ZmZlckRlc3Ryb3kgPQorICAgICAgICAoQ09JUkVTVUxUICgqKShDT0lCVUZGRVIpKQorICAgICAgICAgICAgRExfc3ltKGxpYl9oYW5kbGUsICJDT0lCdWZmZXJEZXN0cm95IiwgQ09JX1ZFUlNJT04xKTsKKyAgICBpZiAoQnVmZmVyRGVzdHJveSA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBmaW5kICVzIGluIENPSSBsaWJyYXJ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDT0lCdWZmZXJEZXN0cm95Iik7CisgICAgICAgIGZpbmkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEJ1ZmZlck1hcCA9CisgICAgICAgIChDT0lSRVNVTFQgKCopKENPSUJVRkZFUiwgdWludDY0X3QsIHVpbnQ2NF90LCBDT0lfTUFQX1RZUEUsIHVpbnQzMl90LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDT0lFVkVOVCosIENPSUVWRU5UKiwgQ09JTUFQSU5TVEFOQ0UqLAorICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiopKQorICAgICAgICAgICAgRExfc3ltKGxpYl9oYW5kbGUsICJDT0lCdWZmZXJNYXAiLCBDT0lfVkVSU0lPTjEpOworICAgIGlmIChCdWZmZXJNYXAgPT0gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJGYWlsZWQgdG8gZmluZCAlcyBpbiBDT0kgbGlicmFyeVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ09JQnVmZmVyTWFwIik7CisgICAgICAgIGZpbmkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEJ1ZmZlclVubWFwID0KKyAgICAgICAgKENPSVJFU1VMVCAoKikoQ09JTUFQSU5TVEFOQ0UsIHVpbnQzMl90LCBjb25zdCBDT0lFVkVOVCosCisgICAgICAgICAgICAgICAgICAgICAgIENPSUVWRU5UKikpCisgICAgICAgICAgICBETF9zeW0obGliX2hhbmRsZSwgIkNPSUJ1ZmZlclVubWFwIiwgQ09JX1ZFUlNJT04xKTsKKyAgICBpZiAoQnVmZmVyVW5tYXAgPT0gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJGYWlsZWQgdG8gZmluZCAlcyBpbiBDT0kgbGlicmFyeVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ09JQnVmZmVyVW5tYXAiKTsKKyAgICAgICAgZmluaSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQnVmZmVyV3JpdGUgPQorICAgICAgICAoQ09JUkVTVUxUICgqKShDT0lCVUZGRVIsIHVpbnQ2NF90LCBjb25zdCB2b2lkKiwgdWludDY0X3QsCisgICAgICAgICAgICAgICAgICAgICAgIENPSV9DT1BZX1RZUEUsIHVpbnQzMl90LCBjb25zdCBDT0lFVkVOVCosCisgICAgICAgICAgICAgICAgICAgICAgIENPSUVWRU5UKikpCisgICAgICAgICAgICBETF9zeW0obGliX2hhbmRsZSwgIkNPSUJ1ZmZlcldyaXRlIiwgQ09JX1ZFUlNJT04xKTsKKyAgICBpZiAoQnVmZmVyV3JpdGUgPT0gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJGYWlsZWQgdG8gZmluZCAlcyBpbiBDT0kgbGlicmFyeVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ09JQnVmZmVyV3JpdGUiKTsKKyAgICAgICAgZmluaSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQnVmZmVyUmVhZCA9CisgICAgICAgIChDT0lSRVNVTFQgKCopKENPSUJVRkZFUiwgdWludDY0X3QsIHZvaWQqLCB1aW50NjRfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0lfQ09QWV9UWVBFLCB1aW50MzJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDT0lFVkVOVCosIENPSUVWRU5UKikpCisgICAgICAgICAgICBETF9zeW0obGliX2hhbmRsZSwgIkNPSUJ1ZmZlclJlYWQiLCBDT0lfVkVSU0lPTjEpOworICAgIGlmIChCdWZmZXJSZWFkID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gQ09JIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNPSUJ1ZmZlclJlYWQiKTsKKyAgICAgICAgZmluaSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQnVmZmVyQ29weSA9CisgICAgICAgIChDT0lSRVNVTFQgKCopKENPSUJVRkZFUiwgQ09JQlVGRkVSLCB1aW50NjRfdCwgdWludDY0X3QsIHVpbnQ2NF90LAorICAgICAgICAgICAgICAgICAgICAgICBDT0lfQ09QWV9UWVBFLCB1aW50MzJfdCwgY29uc3QgQ09JRVZFTlQqLAorICAgICAgICAgICAgICAgICAgICAgICBDT0lFVkVOVCopKQorICAgICAgICAgICAgRExfc3ltKGxpYl9oYW5kbGUsICJDT0lCdWZmZXJDb3B5IiwgQ09JX1ZFUlNJT04xKTsKKyAgICBpZiAoQnVmZmVyQ29weSA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBmaW5kICVzIGluIENPSSBsaWJyYXJ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDT0lCdWZmZXJDb3B5Iik7CisgICAgICAgIGZpbmkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEJ1ZmZlckdldFNpbmtBZGRyZXNzID0KKyAgICAgICAgKENPSVJFU1VMVCAoKikoQ09JQlVGRkVSLCB1aW50NjRfdCopKQorICAgICAgICAgICAgRExfc3ltKGxpYl9oYW5kbGUsICJDT0lCdWZmZXJHZXRTaW5rQWRkcmVzcyIsIENPSV9WRVJTSU9OMSk7CisgICAgaWYgKEJ1ZmZlckdldFNpbmtBZGRyZXNzID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gQ09JIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNPSUJ1ZmZlckdldFNpbmtBZGRyZXNzIik7CisgICAgICAgIGZpbmkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEJ1ZmZlclNldFN0YXRlID0KKyAgICAgICAgKENPSVJFU1VMVCgqKShDT0lCVUZGRVIsIENPSVBST0NFU1MsIENPSV9CVUZGRVJfU1RBVEUsCisgICAgICAgICAgICAgICAgICAgICAgQ09JX0JVRkZFUl9NT1ZFX0ZMQUcsIHVpbnQzMl90LCBjb25zdCBDT0lFVkVOVCosCisgICAgICAgICAgICAgICAgICAgICAgQ09JRVZFTlQqKSkKKyAgICAgICAgICAgIERMX3N5bShsaWJfaGFuZGxlLCAiQ09JQnVmZmVyU2V0U3RhdGUiLCBDT0lfVkVSU0lPTjEpOworICAgIGlmIChCdWZmZXJTZXRTdGF0ZSA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBmaW5kICVzIGluIENPSSBsaWJyYXJ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDT0lCdWZmZXJTZXRTdGF0ZSIpOworICAgICAgICBmaW5pKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBFdmVudFdhaXQgPQorICAgICAgICAoQ09JUkVTVUxUICgqKSh1aW50MTZfdCwgY29uc3QgQ09JRVZFTlQqLCBpbnQzMl90LCB1aW50OF90LAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCosIHVpbnQzMl90KikpCisgICAgICAgICAgICBETF9zeW0obGliX2hhbmRsZSwgIkNPSUV2ZW50V2FpdCIsIENPSV9WRVJTSU9OMSk7CisgICAgaWYgKEV2ZW50V2FpdCA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBmaW5kICVzIGluIENPSSBsaWJyYXJ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDT0lFdmVudFdhaXQiKTsKKyAgICAgICAgZmluaSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgUGVyZkdldEN5Y2xlRnJlcXVlbmN5ID0KKyAgICAgICAgKHVpbnQ2NF90ICgqKSh2b2lkKSkKKyAgICAgICAgICAgIERMX3N5bShsaWJfaGFuZGxlLCAiQ09JUGVyZkdldEN5Y2xlRnJlcXVlbmN5IiwgQ09JX1ZFUlNJT04xKTsKKyAgICBpZiAoUGVyZkdldEN5Y2xlRnJlcXVlbmN5ID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gQ09JIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNPSVBlcmZHZXRDeWNsZUZyZXF1ZW5jeSIpOworICAgICAgICBmaW5pKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpc19hdmFpbGFibGUgPSB0cnVlOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgZmluaSh2b2lkKQoreworICAgIGlzX2F2YWlsYWJsZSA9IGZhbHNlOworCisgICAgaWYgKGxpYl9oYW5kbGUgIT0gMCkgeworI2lmbmRlZiBUQVJHRVRfV0lOTlQKKyAgICAgICAgRExfY2xvc2UobGliX2hhbmRsZSk7CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisgICAgICAgIGxpYl9oYW5kbGUgPSAwOworICAgIH0KK30KKworfSAvLyBuYW1lc3BhY2UgQ09JCmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL3NyYy9jb2kvY29pX2NsaWVudC5oIGIvZmluYWwvb2ZmbG9hZC9zcmMvY29pL2NvaV9jbGllbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Nzc1YThiCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9zcmMvY29pL2NvaV9jbGllbnQuaApAQCAtMCwwICsxLDExOCBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisvLyBUaGUgaW50ZXJmYWNlIGJldHdlZW4gb2ZmbG9hZCBsaWJyYXJ5IGFuZCB0aGUgQ09JIEFQSSBvbiB0aGUgaG9zdAorCisjaWZuZGVmIENPSV9DTElFTlRfSF9JTkNMVURFRAorI2RlZmluZSBDT0lfQ0xJRU5UX0hfSU5DTFVERUQKKworI2luY2x1ZGUgPGNvbW1vbi9DT0lQZXJmX2NvbW1vbi5oPgorI2luY2x1ZGUgPHNvdXJjZS9DT0lFbmdpbmVfc291cmNlLmg+CisjaW5jbHVkZSA8c291cmNlL0NPSVByb2Nlc3Nfc291cmNlLmg+CisjaW5jbHVkZSA8c291cmNlL0NPSVBpcGVsaW5lX3NvdXJjZS5oPgorI2luY2x1ZGUgPHNvdXJjZS9DT0lCdWZmZXJfc291cmNlLmg+CisjaW5jbHVkZSA8c291cmNlL0NPSUV2ZW50X3NvdXJjZS5oPgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICIuLi9saWJvZmZsb2FkX2Vycm9yX2NvZGVzLmgiCisjaW5jbHVkZSAiLi4vb2ZmbG9hZF91dGlsLmgiCisKKyNkZWZpbmUgTUlDX0VOR0lORVNfTUFYICAgICAxMjgKKworI2lmIE1JQ19FTkdJTkVTX01BWCA8IENPSV9NQVhfSVNBX01JQ19ERVZJQ0VTCisjZXJyb3IgTUlDX0VOR0lORVNfTUFYIG5lZWQgdG8gYmUgaW5jcmVhc2VkCisjZW5kaWYKKworLy8gQ09JIGxpYnJhcnkgaW50ZXJmYWNlCituYW1lc3BhY2UgQ09JIHsKKworZXh0ZXJuIGJvb2wgaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIGZpbmkodm9pZCk7CisKK2V4dGVybiBib29sIGlzX2F2YWlsYWJsZTsKKworLy8gcG9pbnRlcnMgdG8gZnVuY3Rpb25zIGZyb20gQ09JIGxpYnJhcnkKK2V4dGVybiBDT0lSRVNVTFQgKCpFbmdpbmVHZXRDb3VudCkoQ09JX0lTQV9UWVBFLCB1aW50MzJfdCopOworZXh0ZXJuIENPSVJFU1VMVCAoKkVuZ2luZUdldEhhbmRsZSkoQ09JX0lTQV9UWVBFLCB1aW50MzJfdCwgQ09JRU5HSU5FKik7CisKK2V4dGVybiBDT0lSRVNVTFQgKCpQcm9jZXNzQ3JlYXRlRnJvbU1lbW9yeSkoQ09JRU5HSU5FLCBjb25zdCBjaGFyKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiwgdWludDY0X3QsIGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiosIHVpbnQ4X3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhcioqLCB1aW50OF90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqLCB1aW50NjRfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiwgdWludDY0X3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JUFJPQ0VTUyopOworZXh0ZXJuIENPSVJFU1VMVCAoKlByb2Nlc3NEZXN0cm95KShDT0lQUk9DRVNTLCBpbnQzMl90LCB1aW50OF90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDhfdCosIHVpbnQzMl90Kik7CitleHRlcm4gQ09JUkVTVUxUICgqUHJvY2Vzc0dldEZ1bmN0aW9uSGFuZGxlcykoQ09JUFJPQ0VTUywgdWludDMyX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0lGVU5DVElPTiopOworZXh0ZXJuIENPSVJFU1VMVCAoKlByb2Nlc3NMb2FkTGlicmFyeUZyb21NZW1vcnkpKENPSVBST0NFU1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPSUxJQlJBUlkqKTsKK2V4dGVybiBDT0lSRVNVTFQgKCpQcm9jZXNzUmVnaXN0ZXJMaWJyYXJpZXMpKHVpbnQzMl90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ2NF90KiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhcioqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50NjRfdCopOworCitleHRlcm4gQ09JUkVTVUxUICgqUGlwZWxpbmVDcmVhdGUpKENPSVBST0NFU1MsIENPSV9DUFVfTUFTSywgdWludDMyX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JUElQRUxJTkUqKTsKK2V4dGVybiBDT0lSRVNVTFQgKCpQaXBlbGluZURlc3Ryb3kpKENPSVBJUEVMSU5FKTsKK2V4dGVybiBDT0lSRVNVTFQgKCpQaXBlbGluZVJ1bkZ1bmN0aW9uKShDT0lQSVBFTElORSwgQ09JRlVOQ1RJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCwgY29uc3QgQ09JQlVGRkVSKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENPSV9BQ0NFU1NfRkxBR1MqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QsIGNvbnN0IENPSUVWRU5UKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqLCB1aW50MTZfdCwgdm9pZCosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCwgQ09JRVZFTlQqKTsKKworZXh0ZXJuIENPSVJFU1VMVCAoKkJ1ZmZlckNyZWF0ZSkodWludDY0X3QsIENPSV9CVUZGRVJfVFlQRSwgdWludDMyX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqLCB1aW50MzJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ09JUFJPQ0VTUyosIENPSUJVRkZFUiopOworZXh0ZXJuIENPSVJFU1VMVCAoKkJ1ZmZlckNyZWF0ZUZyb21NZW1vcnkpKHVpbnQ2NF90LCBDT0lfQlVGRkVSX1RZUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCwgdm9pZCosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCwgY29uc3QgQ09JUFJPQ0VTUyosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0lCVUZGRVIqKTsKK2V4dGVybiBDT0lSRVNVTFQgKCpCdWZmZXJEZXN0cm95KShDT0lCVUZGRVIpOworZXh0ZXJuIENPSVJFU1VMVCAoKkJ1ZmZlck1hcCkoQ09JQlVGRkVSLCB1aW50NjRfdCwgdWludDY0X3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPSV9NQVBfVFlQRSwgdWludDMyX3QsIGNvbnN0IENPSUVWRU5UKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JRVZFTlQqLCBDT0lNQVBJTlNUQU5DRSosIHZvaWQqKik7CitleHRlcm4gQ09JUkVTVUxUICgqQnVmZmVyVW5tYXApKENPSU1BUElOU1RBTkNFLCB1aW50MzJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDT0lFVkVOVCosIENPSUVWRU5UKik7CitleHRlcm4gQ09JUkVTVUxUICgqQnVmZmVyV3JpdGUpKENPSUJVRkZFUiwgdWludDY0X3QsIGNvbnN0IHZvaWQqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90LCBDT0lfQ09QWV9UWVBFLCB1aW50MzJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDT0lFVkVOVCosIENPSUVWRU5UKik7CitleHRlcm4gQ09JUkVTVUxUICgqQnVmZmVyUmVhZCkoQ09JQlVGRkVSLCB1aW50NjRfdCwgdm9pZCosIHVpbnQ2NF90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JX0NPUFlfVFlQRSwgdWludDMyX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDT0lFVkVOVCosIENPSUVWRU5UKik7CitleHRlcm4gQ09JUkVTVUxUICgqQnVmZmVyQ29weSkoQ09JQlVGRkVSLCBDT0lCVUZGRVIsIHVpbnQ2NF90LCB1aW50NjRfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90LCBDT0lfQ09QWV9UWVBFLCB1aW50MzJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENPSUVWRU5UKiwgQ09JRVZFTlQqKTsKK2V4dGVybiBDT0lSRVNVTFQgKCpCdWZmZXJHZXRTaW5rQWRkcmVzcykoQ09JQlVGRkVSLCB1aW50NjRfdCopOworZXh0ZXJuIENPSVJFU1VMVCAoKkJ1ZmZlclNldFN0YXRlKShDT0lCVUZGRVIsIENPSVBST0NFU1MsIENPSV9CVUZGRVJfU1RBVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPSV9CVUZGRVJfTU9WRV9GTEFHLCB1aW50MzJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgICBDT0lFVkVOVCosIENPSUVWRU5UKik7CisKK2V4dGVybiBDT0lSRVNVTFQgKCpFdmVudFdhaXQpKHVpbnQxNl90LCBjb25zdCBDT0lFVkVOVCosIGludDMyX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90LCB1aW50MzJfdCosIHVpbnQzMl90Kik7CisKK2V4dGVybiB1aW50NjRfdCAgKCpQZXJmR2V0Q3ljbGVGcmVxdWVuY3kpKHZvaWQpOworCit9IC8vIG5hbWVzcGFjZSBDT0kKKworI2VuZGlmIC8vIENPSV9DTElFTlRfSF9JTkNMVURFRApkaWZmIC0tZ2l0IGEvZmluYWwvb2ZmbG9hZC9zcmMvY29pL2NvaV9zZXJ2ZXIuY3BwIGIvZmluYWwvb2ZmbG9hZC9zcmMvY29pL2NvaV9zZXJ2ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczZTZjMmQKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL3NyYy9jb2kvY29pX3NlcnZlci5jcHAKQEAgLTAsMCArMSwxMzAgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworLy8gVGhlIENPSSBpbnRlcmZhY2Ugb24gdGhlIHRhcmdldAorCisjaW5jbHVkZSAiY29pX3NlcnZlci5oIgorCisjaW5jbHVkZSAiLi4vb2ZmbG9hZF90YXJnZXQuaCIKKyNpbmNsdWRlICIuLi9vZmZsb2FkX3RpbWVyLmgiCisjaWZkZWYgTVlPX1NVUFBPUlQKKyNpbmNsdWRlICIuLi9vZmZsb2FkX215b190YXJnZXQuaCIgICAgICAvLyBmb3IgX19vZmZsb2FkX215b0xpYkluaXQvRmluaQorI2VuZGlmIC8vIE1ZT19TVVBQT1JUCisKK0NPSU5BVElWRUxJQkVYUE9SVAordm9pZCBzZXJ2ZXJfY29tcHV0ZSgKKyAgICB1aW50MzJfdCAgYnVmZmVyX2NvdW50LAorICAgIHZvaWQqKiAgICBidWZmZXJzLAorICAgIHVpbnQ2NF90KiBidWZmZXJzX2xlbiwKKyAgICB2b2lkKiAgICAgbWlzY19kYXRhLAorICAgIHVpbnQxNl90ICBtaXNjX2RhdGFfbGVuLAorICAgIHZvaWQqICAgICByZXR1cm5fZGF0YSwKKyAgICB1aW50MTZfdCAgcmV0dXJuX2RhdGFfbGVuCispCit7CisgICAgT2ZmbG9hZERlc2NyaXB0b3I6Om9mZmxvYWQoYnVmZmVyX2NvdW50LCBidWZmZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pc2NfZGF0YSwgbWlzY19kYXRhX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5fZGF0YSwgcmV0dXJuX2RhdGFfbGVuKTsKK30KKworQ09JTkFUSVZFTElCRVhQT1JUCit2b2lkIHNlcnZlcl9pbml0KAorICAgIHVpbnQzMl90ICBidWZmZXJfY291bnQsCisgICAgdm9pZCoqICAgIGJ1ZmZlcnMsCisgICAgdWludDY0X3QqIGJ1ZmZlcnNfbGVuLAorICAgIHZvaWQqICAgICBtaXNjX2RhdGEsCisgICAgdWludDE2X3QgIG1pc2NfZGF0YV9sZW4sCisgICAgdm9pZCogICAgIHJldHVybl9kYXRhLAorICAgIHVpbnQxNl90ICByZXR1cm5fZGF0YV9sZW4KKykKK3sKKyAgICBzdHJ1Y3QgaW5pdF9kYXRhIHsKKyAgICAgICAgaW50ICBkZXZpY2VfaW5kZXg7CisgICAgICAgIGludCAgZGV2aWNlc190b3RhbDsKKyAgICAgICAgaW50ICBjb25zb2xlX2xldmVsOworICAgICAgICBpbnQgIG9mZmxvYWRfcmVwb3J0X2xldmVsOworICAgIH0gKmRhdGEgPSAoc3RydWN0IGluaXRfZGF0YSopIG1pc2NfZGF0YTsKKworICAgIC8vIHNldCBkZXZpY2UgaW5kZXggYW5kIG51bWJlciBvZiB0b3RhbCBkZXZpY2VzCisgICAgbWljX2luZGV4ID0gZGF0YS0+ZGV2aWNlX2luZGV4OworICAgIG1pY19lbmdpbmVzX3RvdGFsID0gZGF0YS0+ZGV2aWNlc190b3RhbDsKKworICAgIC8vIGluaXRpYWxpemUgdHJhY2UgbGV2ZWwKKyAgICBjb25zb2xlX2VuYWJsZWQgPSBkYXRhLT5jb25zb2xlX2xldmVsOworICAgIG9mZmxvYWRfcmVwb3J0X2xldmVsID0gZGF0YS0+b2ZmbG9hZF9yZXBvcnRfbGV2ZWw7CisKKyAgICAvLyByZXR1cm4gYmFjayB0aGUgcHJvY2VzcyBpZAorICAgICooKHBpZF90KikgcmV0dXJuX2RhdGEpID0gZ2V0cGlkKCk7Cit9CisKK0NPSU5BVElWRUxJQkVYUE9SVAordm9pZCBzZXJ2ZXJfdmFyX3RhYmxlX3NpemUoCisgICAgdWludDMyX3QgIGJ1ZmZlcl9jb3VudCwKKyAgICB2b2lkKiogICAgYnVmZmVycywKKyAgICB1aW50NjRfdCogYnVmZmVyc19sZW4sCisgICAgdm9pZCogICAgIG1pc2NfZGF0YSwKKyAgICB1aW50MTZfdCAgbWlzY19kYXRhX2xlbiwKKyAgICB2b2lkKiAgICAgcmV0dXJuX2RhdGEsCisgICAgdWludDE2X3QgIHJldHVybl9kYXRhX2xlbgorKQoreworICAgIHN0cnVjdCBQYXJhbXMgeworICAgICAgICBpbnQ2NF90IG5lbGVtczsKKyAgICAgICAgaW50NjRfdCBsZW5ndGg7CisgICAgfSAqcGFyYW1zOworCisgICAgcGFyYW1zID0gc3RhdGljX2Nhc3Q8UGFyYW1zKj4ocmV0dXJuX2RhdGEpOworICAgIHBhcmFtcy0+bGVuZ3RoID0gX19vZmZsb2FkX3ZhcnMudGFibGVfc2l6ZShwYXJhbXMtPm5lbGVtcyk7Cit9CisKK0NPSU5BVElWRUxJQkVYUE9SVAordm9pZCBzZXJ2ZXJfdmFyX3RhYmxlX2NvcHkoCisgICAgdWludDMyX3QgIGJ1ZmZlcl9jb3VudCwKKyAgICB2b2lkKiogICAgYnVmZmVycywKKyAgICB1aW50NjRfdCogYnVmZmVyc19sZW4sCisgICAgdm9pZCogICAgIG1pc2NfZGF0YSwKKyAgICB1aW50MTZfdCAgbWlzY19kYXRhX2xlbiwKKyAgICB2b2lkKiAgICAgcmV0dXJuX2RhdGEsCisgICAgdWludDE2X3QgIHJldHVybl9kYXRhX2xlbgorKQoreworICAgIF9fb2ZmbG9hZF92YXJzLnRhYmxlX2NvcHkoYnVmZmVyc1swXSwgKnN0YXRpY19jYXN0PGludDY0X3QqPihtaXNjX2RhdGEpKTsKK30KKworI2lmZGVmIE1ZT19TVVBQT1JUCisvLyB0ZW1wb3Jhcnkgd29ya2Fyb3VuZCBmb3IgYmxvY2tpbmcgYmVoYXZpb3Igb2YgbXlvaUxpYkluaXQvRmluaSBjYWxscworQ09JTkFUSVZFTElCRVhQT1JUCit2b2lkIHNlcnZlcl9teW9pbml0KAorICAgIHVpbnQzMl90ICBidWZmZXJfY291bnQsCisgICAgdm9pZCoqICAgIGJ1ZmZlcnMsCisgICAgdWludDY0X3QqIGJ1ZmZlcnNfbGVuLAorICAgIHZvaWQqICAgICBtaXNjX2RhdGEsCisgICAgdWludDE2X3QgIG1pc2NfZGF0YV9sZW4sCisgICAgdm9pZCogICAgIHJldHVybl9kYXRhLAorICAgIHVpbnQxNl90ICByZXR1cm5fZGF0YV9sZW4KKykKK3sKKyAgICBfX29mZmxvYWRfbXlvTGliSW5pdCgpOworfQorCitDT0lOQVRJVkVMSUJFWFBPUlQKK3ZvaWQgc2VydmVyX215b2ZpbmkoCisgICAgdWludDMyX3QgIGJ1ZmZlcl9jb3VudCwKKyAgICB2b2lkKiogICAgYnVmZmVycywKKyAgICB1aW50NjRfdCogYnVmZmVyc19sZW4sCisgICAgdm9pZCogICAgIG1pc2NfZGF0YSwKKyAgICB1aW50MTZfdCAgbWlzY19kYXRhX2xlbiwKKyAgICB2b2lkKiAgICAgcmV0dXJuX2RhdGEsCisgICAgdWludDE2X3QgIHJldHVybl9kYXRhX2xlbgorKQoreworICAgIF9fb2ZmbG9hZF9teW9MaWJGaW5pKCk7Cit9CisjZW5kaWYgLy8gTVlPX1NVUFBPUlQKZGlmZiAtLWdpdCBhL2ZpbmFsL29mZmxvYWQvc3JjL2NvaS9jb2lfc2VydmVyLmggYi9maW5hbC9vZmZsb2FkL3NyYy9jb2kvY29pX3NlcnZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3NDRkOWUKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL3NyYy9jb2kvY29pX3NlcnZlci5oCkBAIC0wLDAgKzEsNzQgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworLy9UaGUgaW50ZXJmYWNlIGJldHdlZW4gb2ZmbG9hZCBsaWJyYXJ5IGFuZCB0aGUgQ09JIEFQSSBvbiB0aGUgdGFyZ2V0LgorCisjaWZuZGVmIENPSV9TRVJWRVJfSF9JTkNMVURFRAorI2RlZmluZSBDT0lfU0VSVkVSX0hfSU5DTFVERUQKKworI2luY2x1ZGUgPGNvbW1vbi9DT0lFbmdpbmVfY29tbW9uLmg+CisjaW5jbHVkZSA8Y29tbW9uL0NPSVBlcmZfY29tbW9uLmg+CisjaW5jbHVkZSA8c2luay9DT0lQcm9jZXNzX3NpbmsuaD4KKyNpbmNsdWRlIDxzaW5rL0NPSVBpcGVsaW5lX3NpbmsuaD4KKyNpbmNsdWRlIDxzaW5rL0NPSUJ1ZmZlcl9zaW5rLmg+CisjaW5jbHVkZSA8bGlzdD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgIi4uL2xpYm9mZmxvYWRfZXJyb3JfY29kZXMuaCIKKworLy8gd3JhcHBlcnMgZm9yIENPSSBBUEkKKyNkZWZpbmUgUGlwZWxpbmVTdGFydEV4ZWN1dGluZ1J1bkZ1bmN0aW9ucygpIFwKKyAgICB7IFwKKyAgICAgICAgQ09JUkVTVUxUIHJlcyA9IENPSVBpcGVsaW5lU3RhcnRFeGVjdXRpbmdSdW5GdW5jdGlvbnMoKTsgXAorICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7IFwKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19waXBlbGluZV9zdGFydF9ydW5fZnVuY3MsIG1pY19pbmRleCwgcmVzKTsgXAorICAgICAgICAgICAgZXhpdCgxKTsgXAorICAgICAgICB9IFwKKyAgICB9CisKKyNkZWZpbmUgUHJvY2Vzc1dhaXRGb3JTaHV0ZG93bigpIFwKKyAgICB7IFwKKyAgICAgICAgQ09JUkVTVUxUIHJlcyA9IENPSVByb2Nlc3NXYWl0Rm9yU2h1dGRvd24oKTsgXAorICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7IFwKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19wcm9jZXNzX3dhaXRfc2h1dGRvd24sIG1pY19pbmRleCwgcmVzKTsgXAorICAgICAgICAgICAgZXhpdCgxKTsgXAorICAgICAgICB9IFwKKyAgICB9CisKKyNkZWZpbmUgQnVmZmVyQWRkUmVmKGJ1ZikgXAorICAgIHsgXAorICAgICAgICBDT0lSRVNVTFQgcmVzID0gQ09JQnVmZmVyQWRkUmVmKGJ1Zik7IFwKKyAgICAgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeyBcCisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfYnVmX2FkZF9yZWYsIG1pY19pbmRleCwgcmVzKTsgXAorICAgICAgICAgICAgZXhpdCgxKTsgXAorICAgICAgICB9IFwKKyAgICB9CisKKyNkZWZpbmUgQnVmZmVyUmVsZWFzZVJlZihidWYpIFwKKyAgICB7IFwKKyAgICAgICAgQ09JUkVTVUxUIHJlcyA9IENPSUJ1ZmZlclJlbGVhc2VSZWYoYnVmKTsgXAorICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7IFwKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19idWZfcmVsZWFzZV9yZWYsIG1pY19pbmRleCwgcmVzKTsgXAorICAgICAgICAgICAgZXhpdCgxKTsgXAorICAgICAgICB9IFwKKyAgICB9CisKKyNkZWZpbmUgRW5naW5lR2V0SW5kZXgoaW5kZXgpIFwKKyAgICB7IFwKKyAgICAgICAgQ09JX0lTQV9UWVBFIGlzYV90eXBlOyBcCisgICAgICAgIENPSVJFU1VMVCByZXMgPSBDT0lFbmdpbmVHZXRJbmRleCgmaXNhX3R5cGUsIGluZGV4KTsgXAorICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7IFwKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19nZXRfZW5naW5lX2luZGV4LCBtaWNfaW5kZXgsIHJlcyk7IFwKKyAgICAgICAgICAgIGV4aXQoMSk7IFwKKyAgICAgICAgfSBcCisgICAgfQorCisjZW5kaWYgLy8gQ09JX1NFUlZFUl9IX0lOQ0xVREVECmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL3NyYy9jb21waWxlcl9pZl9ob3N0LmNwcCBiL2ZpbmFsL29mZmxvYWQvc3JjL2NvbXBpbGVyX2lmX2hvc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiYzQzMGIKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL3NyYy9jb21waWxlcl9pZl9ob3N0LmNwcApAQCAtMCwwICsxLDMyMyBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAiY29tcGlsZXJfaWZfaG9zdC5oIgorCisjaW5jbHVkZSA8bWFsbG9jLmg+CisjaWZuZGVmIFRBUkdFVF9XSU5OVAorI2luY2x1ZGUgPGFsbG9jYS5oPgorI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorCisvLyBHbG9iYWwgY291bnRlciBvbiBob3N0LiAKKy8vIFRoaXMgdmFyaWFibGUgaXMgdXNlZCBpZiBQMk9QVF9vZmZsb2FkX2RvX2RhdGFfcGVyc2lzdGVuY2UgPT0gMi4KKy8vIFRoZSB2YXJpYWJsZSB1c2VkIHRvIGlkZW50aWZ5IG9mZmxvYWQgY29uc3RydWN0cyBjb250YWluZWQgaW4gb25lIHByb2NlZHVyZS4KKy8vIEluY3JlbWVudCBvZiBPRkZMT0FEX0NBTExfQ09VTlQgaXMgaW5zZXJ0ZWQgYXQgZW50cmllcyBvZiBIT1NUIHJvdXRpbmVzIHdpdGgKKy8vIG9mZmxvYWQgY29uc3RydWN0cy4KK3N0YXRpYyBpbnQgb2ZmbG9hZF9jYWxsX2NvdW50ID0gMDsKKworZXh0ZXJuICJDIiBPRkZMT0FEIE9GRkxPQURfVEFSR0VUX0FDUVVJUkUoCisgICAgVEFSR0VUX1RZUEUgICAgICB0YXJnZXRfdHlwZSwKKyAgICBpbnQgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIsCisgICAgaW50ICAgICAgICAgICAgICBpc19vcHRpb25hbCwKKyAgICBfT2ZmbG9hZF9zdGF0dXMqIHN0YXR1cywKKyAgICBjb25zdCBjaGFyKiAgICAgIGZpbGUsCisgICAgdWludDY0X3QgICAgICAgICBsaW5lCispCit7CisgICAgYm9vbCByZXR2YWw7CisgICAgT0ZGTE9BRCBvZmxkOworCisgICAgLy8gaW5pdGlhbGl6ZSBzdGF0dXMKKyAgICBpZiAoc3RhdHVzICE9IDApIHsKKyAgICAgICAgc3RhdHVzLT5yZXN1bHQgPSBPRkZMT0FEX1VOQVZBSUxBQkxFOworICAgICAgICBzdGF0dXMtPmRldmljZV9udW1iZXIgPSAtMTsKKyAgICAgICAgc3RhdHVzLT5kYXRhX3NlbnQgPSAwOworICAgICAgICBzdGF0dXMtPmRhdGFfcmVjZWl2ZWQgPSAwOworICAgIH0KKworICAgIC8vIG1ha2Ugc3VyZSBsaWJyYXkgaXMgaW5pdGlhbGl6ZWQKKyAgICByZXR2YWwgPSBfX29mZmxvYWRfaW5pdF9saWJyYXJ5KCk7CisKKyAgICAvLyBPRkZMT0FEX1RJTUVSX0lOSVQgbXVzdCBmb2xsb3cgY2FsbCB0byBfX29mZmxvYWRfaW5pdF9saWJyYXJ5CisgICAgT2ZmbG9hZEhvc3RUaW1lckRhdGEgKiB0aW1lcl9kYXRhID0gT0ZGTE9BRF9USU1FUl9JTklUKGZpbGUsIGxpbmUpOworCisgICAgT0ZGTE9BRF9USU1FUl9TVEFSVCh0aW1lcl9kYXRhLCBjX29mZmxvYWRfaG9zdF90b3RhbF9vZmZsb2FkKTsKKworICAgIE9GRkxPQURfVElNRVJfU1RBUlQodGltZXJfZGF0YSwgY19vZmZsb2FkX2hvc3RfaW5pdGlhbGl6ZSk7CisKKyAgICAvLyBpbml0aWFsaXplIGFsbCBkZXZpY2VzIGlzIGluaXRfdHlwZSBpcyBvbl9vZmZsb2FkX2FsbAorICAgIGlmIChyZXR2YWwgJiYgX19vZmZsb2FkX2luaXRfdHlwZSA9PSBjX2luaXRfb25fb2ZmbG9hZF9hbGwpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtaWNfZW5naW5lc190b3RhbDsgaSsrKSB7CisgICAgICAgICAgICAgbWljX2VuZ2luZXNbaV0uaW5pdCgpOworICAgICAgICB9CisgICAgfQorICAgIE9GRkxPQURfVElNRVJfU1RPUCh0aW1lcl9kYXRhLCBjX29mZmxvYWRfaG9zdF9pbml0aWFsaXplKTsKKworICAgIE9GRkxPQURfVElNRVJfU1RBUlQodGltZXJfZGF0YSwgY19vZmZsb2FkX2hvc3RfdGFyZ2V0X2FjcXVpcmUpOworCisgICAgaWYgKHRhcmdldF90eXBlID09IFRBUkdFVF9IT1NUKSB7CisgICAgICAgIC8vIEhvc3QgYWx3YXlzIGF2YWlsYWJsZQorICAgICAgICByZXR2YWwgPSB0cnVlOworICAgIH0KKyAgICBlbHNlIGlmICh0YXJnZXRfdHlwZSA9PSBUQVJHRVRfTUlDKSB7CisgICAgICAgIGlmICh0YXJnZXRfbnVtYmVyID49IC0xKSB7CisgICAgICAgICAgICBpZiAocmV0dmFsKSB7CisgICAgICAgICAgICAgICAgaWYgKHRhcmdldF9udW1iZXIgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAvLyBVc2VyIHByb3ZpZGVkIHRoZSBkZXZpY2UgbnVtYmVyCisgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIgPSB0YXJnZXRfbnVtYmVyICUgbWljX2VuZ2luZXNfdG90YWw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyB1c2UgZGV2aWNlIDAKKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlciA9IDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gcmVzZXJ2ZSBkZXZpY2UgaW4gT1JTTAorICAgICAgICAgICAgICAgIGlmIChpc19vcHRpb25hbCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIU9SU0w6OnRyeV9yZXNlcnZlKHRhcmdldF9udW1iZXIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyID0gLTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghT1JTTDo6cmVzZXJ2ZSh0YXJnZXRfbnVtYmVyKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlciA9IC0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSBkZXZpY2UKKyAgICAgICAgICAgICAgICBpZiAodGFyZ2V0X251bWJlciA+PSAwICYmCisgICAgICAgICAgICAgICAgICAgIF9fb2ZmbG9hZF9pbml0X3R5cGUgPT0gY19pbml0X29uX29mZmxvYWQpIHsKKyAgICAgICAgICAgICAgICAgICAgT0ZGTE9BRF9USU1FUl9TVEFSVCh0aW1lcl9kYXRhLCBjX29mZmxvYWRfaG9zdF9pbml0aWFsaXplKTsKKyAgICAgICAgICAgICAgICAgICAgbWljX2VuZ2luZXNbdGFyZ2V0X251bWJlcl0uaW5pdCgpOworICAgICAgICAgICAgICAgICAgICBPRkZMT0FEX1RJTUVSX1NUT1AodGltZXJfZGF0YSwgY19vZmZsb2FkX2hvc3RfaW5pdGlhbGl6ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gZmFsbGJhY2sgdG8gQ1BVCisgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlciA9IC0xOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodGFyZ2V0X251bWJlciA8IDAgfHwgIXJldHZhbCkgeworICAgICAgICAgICAgICAgIGlmICghaXNfb3B0aW9uYWwgJiYgc3RhdHVzID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX2RldmljZV9pc19ub3RfYXZhaWxhYmxlKTsKKyAgICAgICAgICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR2YWwgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19pbnZhbGlkX2RldmljZV9udW1iZXIpOworICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChyZXR2YWwpIHsKKyAgICAgICAgb2ZsZCA9IG5ldyBPZmZsb2FkRGVzY3JpcHRvcih0YXJnZXRfbnVtYmVyLCBzdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWlzX29wdGlvbmFsLCBmYWxzZSwgdGltZXJfZGF0YSk7CisgICAgICAgIE9GRkxPQURfVElNRVJfSE9TVF9NSUNfTlVNKHRpbWVyX2RhdGEsIHRhcmdldF9udW1iZXIpOworICAgICAgICBPZmZsb2FkX1JlcG9ydF9Qcm9sb2codGltZXJfZGF0YSk7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0VfMSgyLCB0aW1lcl9kYXRhLT5vZmZsb2FkX251bWJlciwgY19vZmZsb2FkX3N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN0YXJ0aW5nIG9mZmxvYWQ6IHRhcmdldF90eXBlID0gJWQsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJudW1iZXIgPSAlZCwgaXNfb3B0aW9uYWwgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCBpc19vcHRpb25hbCk7CisKKyAgICAgICAgT0ZGTE9BRF9USU1FUl9TVE9QKHRpbWVyX2RhdGEsIGNfb2ZmbG9hZF9ob3N0X3RhcmdldF9hY3F1aXJlKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIG9mbGQgPSBOVUxMOworCisgICAgICAgIE9GRkxPQURfVElNRVJfU1RPUCh0aW1lcl9kYXRhLCBjX29mZmxvYWRfaG9zdF90YXJnZXRfYWNxdWlyZSk7CisgICAgICAgIE9GRkxPQURfVElNRVJfU1RPUCh0aW1lcl9kYXRhLCBjX29mZmxvYWRfaG9zdF90b3RhbF9vZmZsb2FkKTsKKyAgICAgICAgb2ZmbG9hZF9yZXBvcnRfZnJlZV9kYXRhKHRpbWVyX2RhdGEpOworICAgIH0KKworICAgIHJldHVybiBvZmxkOworfQorCitleHRlcm4gIkMiIE9GRkxPQUQgT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRTEoCisgICAgY29uc3QgaW50KiAgZGV2aWNlX251bSwKKyAgICBjb25zdCBjaGFyKiBmaWxlLAorICAgIHVpbnQ2NF90ICAgIGxpbmUKKykKK3sKKyAgICBpbnQgdGFyZ2V0X251bWJlcjsKKworICAgIC8vIG1ha2Ugc3VyZSBsaWJyYXkgaXMgaW5pdGlhbGl6ZWQgYW5kIGF0IGxlYXN0IG9uZSBkZXZpY2UgaXMgYXZhaWxhYmxlCisgICAgaWYgKCFfX29mZmxvYWRfaW5pdF9saWJyYXJ5KCkpIHsKKyAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX2RldmljZV9pc19ub3RfYXZhaWxhYmxlKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisKKyAgICAvLyBPRkZMT0FEX1RJTUVSX0lOSVQgbXVzdCBmb2xsb3cgY2FsbCB0byBfX29mZmxvYWRfaW5pdF9saWJyYXJ5CisKKyAgICBPZmZsb2FkSG9zdFRpbWVyRGF0YSAqIHRpbWVyX2RhdGEgPSBPRkZMT0FEX1RJTUVSX0lOSVQoZmlsZSwgbGluZSk7CisKKyAgICBPRkZMT0FEX1RJTUVSX1NUQVJUKHRpbWVyX2RhdGEsIGNfb2ZmbG9hZF9ob3N0X3RvdGFsX29mZmxvYWQpOworCisgICAgT0ZGTE9BRF9USU1FUl9TVEFSVCh0aW1lcl9kYXRhLCBjX29mZmxvYWRfaG9zdF9pbml0aWFsaXplKTsKKworICAgIGlmIChfX29mZmxvYWRfaW5pdF90eXBlID09IGNfaW5pdF9vbl9vZmZsb2FkX2FsbCkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1pY19lbmdpbmVzX3RvdGFsOyBpKyspIHsKKyAgICAgICAgICAgICBtaWNfZW5naW5lc1tpXS5pbml0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBPRkZMT0FEX1RJTUVSX1NUT1AodGltZXJfZGF0YSwgY19vZmZsb2FkX2hvc3RfaW5pdGlhbGl6ZSk7CisKKyAgICBPRkZMT0FEX1RJTUVSX1NUQVJUKHRpbWVyX2RhdGEsIGNfb2ZmbG9hZF9ob3N0X3RhcmdldF9hY3F1aXJlKTsKKworICAgIC8vIHVzZSBkZWZhdWx0IGRldmljZSBudW1iZXIgaWYgaXQgaXMgbm90IHByb3ZpZGVkCisgICAgaWYgKGRldmljZV9udW0gIT0gMCkgeworICAgICAgICB0YXJnZXRfbnVtYmVyID0gKmRldmljZV9udW07CisgICAgfQorICAgIGVsc2UgeworICAgICAgICB0YXJnZXRfbnVtYmVyID0gX19vbXBfZGV2aWNlX251bTsKKyAgICB9CisKKyAgICAvLyBkZXZpY2UgbnVtYmVyIHNob3VsZCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIHZhbHVlCisgICAgaWYgKHRhcmdldF9udW1iZXIgPCAwKSB7CisgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19vbXBfaW52YWxpZF9kZXZpY2VfbnVtKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisKKyAgICAvLyBzaG91bGQgd2UgZG8gdGhpcyBmb3IgT3Blbk1QPworICAgIHRhcmdldF9udW1iZXIgJT0gbWljX2VuZ2luZXNfdG90YWw7CisKKyAgICAvLyByZXNlcnZlIGRldmljZSBpbiBPUlNMCisgICAgaWYgKCFPUlNMOjpyZXNlcnZlKHRhcmdldF9udW1iZXIpKSB7CisgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19kZXZpY2VfaXNfbm90X2F2YWlsYWJsZSk7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorCisgICAgLy8gaW5pdGlhbGl6ZSBkZXZpY2UocykKKyAgICBPRkZMT0FEX1RJTUVSX1NUQVJUKHRpbWVyX2RhdGEsIGNfb2ZmbG9hZF9ob3N0X2luaXRpYWxpemUpOworCisgICAgaWYgKF9fb2ZmbG9hZF9pbml0X3R5cGUgPT0gY19pbml0X29uX29mZmxvYWQpIHsKKyAgICAgICAgbWljX2VuZ2luZXNbdGFyZ2V0X251bWJlcl0uaW5pdCgpOworICAgIH0KKworICAgIE9GRkxPQURfVElNRVJfU1RPUCh0aW1lcl9kYXRhLCBjX29mZmxvYWRfaG9zdF9pbml0aWFsaXplKTsKKworICAgIE9GRkxPQUQgb2ZsZCA9CisgICAgICAgIG5ldyBPZmZsb2FkRGVzY3JpcHRvcih0YXJnZXRfbnVtYmVyLCAwLCB0cnVlLCB0cnVlLCB0aW1lcl9kYXRhKTsKKworICAgIE9GRkxPQURfVElNRVJfSE9TVF9NSUNfTlVNKHRpbWVyX2RhdGEsIHRhcmdldF9udW1iZXIpOworCisgICAgT2ZmbG9hZF9SZXBvcnRfUHJvbG9nKHRpbWVyX2RhdGEpOworCisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRV8xKDIsIHRpbWVyX2RhdGEtPm9mZmxvYWRfbnVtYmVyLCBjX29mZmxvYWRfc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJTdGFydGluZyBPcGVuTVAgb2ZmbG9hZCwgZGV2aWNlID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIpOworCisgICAgT0ZGTE9BRF9USU1FUl9TVE9QKHRpbWVyX2RhdGEsIGNfb2ZmbG9hZF9ob3N0X3RhcmdldF9hY3F1aXJlKTsKKworICAgIHJldHVybiBvZmxkOworfQorCitpbnQgb2ZmbG9hZF9vZmZsb2FkX3dyYXAoCisgICAgT0ZGTE9BRCBvZmxkLAorICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgaW50IGlzX2VtcHR5LAorICAgIGludCBudW1fdmFycywKKyAgICBWYXJEZXNjICp2YXJzLAorICAgIFZhckRlc2MyICp2YXJzMiwKKyAgICBpbnQgbnVtX3dhaXRzLAorICAgIGNvbnN0IHZvaWQgKip3YWl0cywKKyAgICBjb25zdCB2b2lkICoqc2lnbmFsLAorICAgIGludCBlbnRyeV9pZCwKKyAgICBjb25zdCB2b2lkICpzdGFja19hZGRyCispCit7CisgICAgYm9vbCByZXQgPSBvZmxkLT5vZmZsb2FkKG5hbWUsIGlzX2VtcHR5LCB2YXJzLCB2YXJzMiwgbnVtX3ZhcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhaXRzLCBudW1fd2FpdHMsIHNpZ25hbCwgZW50cnlfaWQsIHN0YWNrX2FkZHIpOworICAgIGlmICghcmV0IHx8IHNpZ25hbCA9PSAwKSB7CisgICAgICAgIGRlbGV0ZSBvZmxkOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitleHRlcm4gIkMiIGludCBPRkZMT0FEX09GRkxPQUQxKAorICAgIE9GRkxPQUQgb2ZsZCwKKyAgICBjb25zdCBjaGFyICpuYW1lLAorICAgIGludCBpc19lbXB0eSwKKyAgICBpbnQgbnVtX3ZhcnMsCisgICAgVmFyRGVzYyAqdmFycywKKyAgICBWYXJEZXNjMiAqdmFyczIsCisgICAgaW50IG51bV93YWl0cywKKyAgICBjb25zdCB2b2lkICoqd2FpdHMsCisgICAgY29uc3Qgdm9pZCAqKnNpZ25hbAorKQoreworICAgIHJldHVybiBvZmZsb2FkX29mZmxvYWRfd3JhcChvZmxkLCBuYW1lLCBpc19lbXB0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fdmFycywgdmFycywgdmFyczIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3dhaXRzLCB3YWl0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYWwsIE5VTEwsIE5VTEwpOworfQorCitleHRlcm4gIkMiIGludCBPRkZMT0FEX09GRkxPQUQyKAorICAgIE9GRkxPQUQgb2ZsZCwKKyAgICBjb25zdCBjaGFyICpuYW1lLAorICAgIGludCBpc19lbXB0eSwKKyAgICBpbnQgbnVtX3ZhcnMsCisgICAgVmFyRGVzYyAqdmFycywKKyAgICBWYXJEZXNjMiAqdmFyczIsCisgICAgaW50IG51bV93YWl0cywKKyAgICBjb25zdCB2b2lkKiogd2FpdHMsCisgICAgY29uc3Qgdm9pZCoqIHNpZ25hbCwKKyAgICBpbnQgZW50cnlfaWQsCisgICAgY29uc3Qgdm9pZCAqc3RhY2tfYWRkcgorKQoreworICAgIHJldHVybiBvZmZsb2FkX29mZmxvYWRfd3JhcChvZmxkLCBuYW1lLCBpc19lbXB0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fdmFycywgdmFycywgdmFyczIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3dhaXRzLCB3YWl0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYWwsIGVudHJ5X2lkLCBzdGFja19hZGRyKTsKK30KKworZXh0ZXJuICJDIiBpbnQgT0ZGTE9BRF9PRkZMT0FEKAorICAgIE9GRkxPQUQgb2ZsZCwKKyAgICBjb25zdCBjaGFyICpuYW1lLAorICAgIGludCBpc19lbXB0eSwKKyAgICBpbnQgbnVtX3ZhcnMsCisgICAgVmFyRGVzYyAqdmFycywKKyAgICBWYXJEZXNjMiAqdmFyczIsCisgICAgaW50IG51bV93YWl0cywKKyAgICBjb25zdCB2b2lkICoqd2FpdHMsCisgICAgY29uc3Qgdm9pZCAqc2lnbmFsLAorICAgIGludCBlbnRyeV9pZCwKKyAgICBjb25zdCB2b2lkICpzdGFja19hZGRyCispCit7CisgICAgLy8gc2lnbmFsIGlzIHBhc3NlZCBieSByZWZlcmVuY2Ugbm93CisgICAgY29uc3Qgdm9pZCAqKnNpZ25hbF9uZXcgPSAoc2lnbmFsICE9IDApID8gJnNpZ25hbCA6IDA7CisgICAgY29uc3Qgdm9pZCAqKndhaXRzX25ldyA9IDA7CisgICAgaW50IG51bV93YWl0c19uZXcgPSAwOworCisgICAgLy8gcmVtb3ZlIE5VTEwgdmFsdWVzIGZyb20gdGhlIGxpc3Qgb2Ygc2lnbmFscyB0byB3YWl0IGZvcgorICAgIGlmIChudW1fd2FpdHMgPiAwKSB7CisgICAgICAgIHdhaXRzX25ldyA9IChjb25zdCB2b2lkKiopIGFsbG9jYShzaXplb2Yodm9pZCopICogbnVtX3dhaXRzKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fd2FpdHM7IGkrKykgeworICAgICAgICAgICAgaWYgKHdhaXRzW2ldICE9IDApIHsKKyAgICAgICAgICAgICAgICB3YWl0c19uZXdbbnVtX3dhaXRzX25ldysrXSA9IHdhaXRzW2ldOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE9GRkxPQURfT0ZGTE9BRDEob2ZsZCwgbmFtZSwgaXNfZW1wdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3ZhcnMsIHZhcnMsIHZhcnMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV93YWl0c19uZXcsIHdhaXRzX25ldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYWxfbmV3KTsKK30KKworZXh0ZXJuICJDIiBpbnQgT0ZGTE9BRF9DQUxMX0NPVU5UKCkKK3sKKyAgICBvZmZsb2FkX2NhbGxfY291bnQrKzsKKyAgICByZXR1cm4gb2ZmbG9hZF9jYWxsX2NvdW50OworfQpkaWZmIC0tZ2l0IGEvZmluYWwvb2ZmbG9hZC9zcmMvY29tcGlsZXJfaWZfaG9zdC5oIGIvZmluYWwvb2ZmbG9hZC9zcmMvY29tcGlsZXJfaWZfaG9zdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiMzRjNTEKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL3NyYy9jb21waWxlcl9pZl9ob3N0LmgKQEAgLTAsMCArMSwxMzMgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworLyohIFxmaWxlCisgICAgXGJyaWVmIFRoZSBpbnRlcmZhY2UgYmV0d2VlbiBjb21waWxlci1nZW5lcmF0ZWQgaG9zdCBjb2RlIGFuZCBydW50aW1lIGxpYnJhcnkKKyovCisKKyNpZm5kZWYgQ09NUElMRVJfSUZfSE9TVF9IX0lOQ0xVREVECisjZGVmaW5lIENPTVBJTEVSX0lGX0hPU1RfSF9JTkNMVURFRAorCisjaW5jbHVkZSAib2ZmbG9hZF9ob3N0LmgiCisKKyNkZWZpbmUgT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRSAgICAgICAgICBPRkZMT0FEX1BSRUZJWCh0YXJnZXRfYWNxdWlyZSkKKyNkZWZpbmUgT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRTEgICAgICAgICBPRkZMT0FEX1BSRUZJWCh0YXJnZXRfYWNxdWlyZTEpCisjZGVmaW5lIE9GRkxPQURfT0ZGTE9BRCAgICAgICAgICAgICAgICAgT0ZGTE9BRF9QUkVGSVgob2ZmbG9hZCkKKyNkZWZpbmUgT0ZGTE9BRF9PRkZMT0FEMSAgICAgICAgICAgICAgICBPRkZMT0FEX1BSRUZJWChvZmZsb2FkMSkKKyNkZWZpbmUgT0ZGTE9BRF9PRkZMT0FEMiAgICAgICAgICAgICAgICBPRkZMT0FEX1BSRUZJWChvZmZsb2FkMikKKyNkZWZpbmUgT0ZGTE9BRF9DQUxMX0NPVU5UICAgICAgICAgICAgICBPRkZMT0FEX1BSRUZJWChvZmZsb2FkX2NhbGxfY291bnQpCisKKworLyohIFxmbiBPRkZMT0FEX1RBUkdFVF9BQ1FVSVJFCisgICAgXGJyaWVmIEF0dGVtcHQgdG8gYWNxdWlyZSB0aGUgdGFyZ2V0LgorICAgIFxwYXJhbSB0YXJnZXRfdHlwZSAgIFRoZSB0eXBlIG9mIHRhcmdldC4KKyAgICBccGFyYW0gdGFyZ2V0X251bWJlciBUaGUgZGV2aWNlIG51bWJlci4KKyAgICBccGFyYW0gaXNfb3B0aW9uYWwgICBXaGV0aGVyIENQVSBmYWxsLWJhY2sgaXMgYWxsb3dlZC4KKyAgICBccGFyYW0gc3RhdHVzICAgICAgICBBZGRyZXNzIG9mIHZhcmlhYmxlIHRvIGhvbGQgb2ZmbG9hZCBzdGF0dXMuCisgICAgXHBhcmFtIGZpbGUgICAgICAgICAgRmlsZW5hbWUgaW4gd2hpY2ggdGhpcyBvZmZsb2FkIG9jY3VycmVkLgorICAgIFxwYXJhbSBsaW5lICAgICAgICAgIExpbmUgbnVtYmVyIGluIHRoZSBmaWxlIHdoZXJlIHRoaXMgb2ZmbG9hZCBvY2N1cnJlZC4KKyovCitleHRlcm4gIkMiIE9GRkxPQUQgT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRSgKKyAgICBUQVJHRVRfVFlQRSAgICAgIHRhcmdldF90eXBlLAorICAgIGludCAgICAgICAgICAgICAgdGFyZ2V0X251bWJlciwKKyAgICBpbnQgICAgICAgICAgICAgIGlzX29wdGlvbmFsLAorICAgIF9PZmZsb2FkX3N0YXR1cyogc3RhdHVzLAorICAgIGNvbnN0IGNoYXIqICAgICAgZmlsZSwKKyAgICB1aW50NjRfdCAgICAgICAgIGxpbmUKKyk7CisKKy8qISBcZm4gT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRTEKKyAgICBcYnJpZWYgQWNxdWlyZSB0aGUgdGFyZ2V0IGZvciBvZmZsb2FkIChPcGVuTVApLgorICAgIFxwYXJhbSBkZXZpY2VfbnVtYmVyIERldmljZSBudW1iZXIgb3IgbnVsbCBpZiBub3Qgc3BlY2lmaWVkLgorICAgIFxwYXJhbSBmaWxlICAgICAgICAgIEZpbGVuYW1lIGluIHdoaWNoIHRoaXMgb2ZmbG9hZCBvY2N1cnJlZAorICAgIFxwYXJhbSBsaW5lICAgICAgICAgIExpbmUgbnVtYmVyIGluIHRoZSBmaWxlIHdoZXJlIHRoaXMgb2ZmbG9hZCBvY2N1cnJlZC4KKyovCitleHRlcm4gIkMiIE9GRkxPQUQgT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRTEoCisgICAgY29uc3QgaW50KiAgICAgIGRldmljZV9udW1iZXIsCisgICAgY29uc3QgY2hhciogICAgIGZpbGUsCisgICAgdWludDY0X3QgICAgICAgIGxpbmUKKyk7CisKKy8qISBcZm4gT0ZGTE9BRF9PRkZMT0FEMQorICAgIFxicmllZiBSdW4gZnVuY3Rpb24gb24gdGFyZ2V0IHVzaW5nIGludGVyZmFjZSBmb3Igb2xkIGRhdGEgcGVyc2lzdGVuY2UuCisgICAgXHBhcmFtIG8gT2ZmbG9hZCBkZXNjcmlwdG9yIGNyZWF0ZWQgYnkgT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRS4KKyAgICBccGFyYW0gbmFtZSBOYW1lIG9mIG9mZmxvYWQgZW50cnkgcG9pbnQuCisgICAgXHBhcmFtIGlzX2VtcHR5IElmIG5vIGNvZGUgdG8gZXhlY3V0ZSAoZS5nLiBvZmZsb2FkX3RyYW5zZmVyKQorICAgIFxwYXJhbSBudW1fdmFycyBOdW1iZXIgb2YgdmFyaWFibGUgZGVzY3JpcHRvcnMuCisgICAgXHBhcmFtIHZhcnMgUG9pbnRlciB0byBWYXJEZXNjIGFycmF5LgorICAgIFxwYXJhbSB2YXJzMiBQb2ludGVyIHRvIFZhckRlc2MyIGFycmF5LgorICAgIFxwYXJhbSBudW1fd2FpdHMgTnVtYmVyIG9mICJ3YWl0IiB2YWx1ZXMuCisgICAgXHBhcmFtIHdhaXRzIFBvaW50ZXIgdG8gYXJyYXkgb2Ygd2FpdCB2YWx1ZXMuCisgICAgXHBhcmFtIHNpZ25hbCBQb2ludGVyIHRvIHNpZ25hbCB2YWx1ZSBvciBOVUxMLgorKi8KK2V4dGVybiAiQyIgaW50IE9GRkxPQURfT0ZGTE9BRDEoCisgICAgT0ZGTE9BRCBvLAorICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgaW50IGlzX2VtcHR5LAorICAgIGludCBudW1fdmFycywKKyAgICBWYXJEZXNjICp2YXJzLAorICAgIFZhckRlc2MyICp2YXJzMiwKKyAgICBpbnQgbnVtX3dhaXRzLAorICAgIGNvbnN0IHZvaWQqKiB3YWl0cywKKyAgICBjb25zdCB2b2lkKiogc2lnbmFsCispOworCisvKiEgXGZuIE9GRkxPQURfT0ZGTE9BRDIKKyAgICBcYnJpZWYgUnVuIGZ1bmN0aW9uIG9uIHRhcmdldCB1c2luZyBpbnRlcmZhY2UgZm9yIG5ldyBkYXRhIHBlcnNpc3RlbmNlLgorICAgIFxwYXJhbSBvIE9mZmxvYWQgZGVzY3JpcHRvciBjcmVhdGVkIGJ5IE9GRkxPQURfVEFSR0VUX0FDUVVJUkUuCisgICAgXHBhcmFtIG5hbWUgTmFtZSBvZiBvZmZsb2FkIGVudHJ5IHBvaW50LgorICAgIFxwYXJhbSBpc19lbXB0eSBJZiBubyBjb2RlIHRvIGV4ZWN1dGUgKGUuZy4gb2ZmbG9hZF90cmFuc2ZlcikKKyAgICBccGFyYW0gbnVtX3ZhcnMgTnVtYmVyIG9mIHZhcmlhYmxlIGRlc2NyaXB0b3JzLgorICAgIFxwYXJhbSB2YXJzIFBvaW50ZXIgdG8gVmFyRGVzYyBhcnJheS4KKyAgICBccGFyYW0gdmFyczIgUG9pbnRlciB0byBWYXJEZXNjMiBhcnJheS4KKyAgICBccGFyYW0gbnVtX3dhaXRzIE51bWJlciBvZiAid2FpdCIgdmFsdWVzLgorICAgIFxwYXJhbSB3YWl0cyBQb2ludGVyIHRvIGFycmF5IG9mIHdhaXQgdmFsdWVzLgorICAgIFxwYXJhbSBzaWduYWwgUG9pbnRlciB0byBzaWduYWwgdmFsdWUgb3IgTlVMTC4KKyAgICBccGFyYW0gZW50cnlfaWQgQSBzaWduYXR1cmUgZm9yIHRoZSBmdW5jdGlvbiBkb2luZyB0aGUgb2ZmbG9hZC4KKyAgICBccGFyYW0gc3RhY2tfYWRkciBUaGUgc3RhY2sgZnJhbWUgYWRkcmVzcyBvZiB0aGUgZnVuY3Rpb24gZG9pbmcgb2ZmbG9hZC4KKyovCitleHRlcm4gIkMiIGludCBPRkZMT0FEX09GRkxPQUQyKAorICAgIE9GRkxPQUQgbywKKyAgICBjb25zdCBjaGFyICpuYW1lLAorICAgIGludCBpc19lbXB0eSwKKyAgICBpbnQgbnVtX3ZhcnMsCisgICAgVmFyRGVzYyAqdmFycywKKyAgICBWYXJEZXNjMiAqdmFyczIsCisgICAgaW50IG51bV93YWl0cywKKyAgICBjb25zdCB2b2lkKiogd2FpdHMsCisgICAgY29uc3Qgdm9pZCoqIHNpZ25hbCwKKyAgICBpbnQgZW50cnlfaWQsCisgICAgY29uc3Qgdm9pZCAqc3RhY2tfYWRkcgorKTsKKworLy8gUnVuIGZ1bmN0aW9uIG9uIHRhcmdldCAob2Jzb2xldGUpLgorLy8gQHBhcmFtIG8gICAgT0ZGTE9BRCBvYmplY3QKKy8vIEBwYXJhbSBuYW1lIGZ1bmN0aW9uIG5hbWUKK2V4dGVybiAiQyIgaW50IE9GRkxPQURfT0ZGTE9BRCgKKyAgICBPRkZMT0FEIG8sCisgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICBpbnQgaXNfZW1wdHksCisgICAgaW50IG51bV92YXJzLAorICAgIFZhckRlc2MgKnZhcnMsCisgICAgVmFyRGVzYzIgKnZhcnMyLAorICAgIGludCBudW1fd2FpdHMsCisgICAgY29uc3Qgdm9pZCoqIHdhaXRzLAorICAgIGNvbnN0IHZvaWQqIHNpZ25hbCwKKyAgICBpbnQgZW50cnlfaWQgPSAwLAorICAgIGNvbnN0IHZvaWQgKnN0YWNrX2FkZHIgPSBOVUxMCispOworCisvLyBHbG9iYWwgY291bnRlciBvbiBob3N0LgorLy8gVGhpcyB2YXJpYWJsZSBpcyB1c2VkIGlmIFAyT1BUX29mZmxvYWRfZG9fZGF0YV9wZXJzaXN0ZW5jZSA9PSAyLgorLy8gVGhlIHZhcmlhYmxlIHVzZWQgdG8gaWRlbnRpZnkgb2ZmbG9hZCBjb25zdHJ1Y3RzIGNvbnRhaW5lZCBpbiBvbmUgcHJvY2VkdXJlLgorLy8gQ2FsbCB0byBPRkZMT0FEX0NBTExfQ09VTlQoKSBpcyBpbnNlcnRlZCBhdCBIT1NUIG9uIGVudHJ5IG9mIHRoZSByb3V0aW5lLgorZXh0ZXJuICJDIiBpbnQgIE9GRkxPQURfQ0FMTF9DT1VOVCgpOworCisjZW5kaWYgLy8gQ09NUElMRVJfSUZfSE9TVF9IX0lOQ0xVREVECmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL3NyYy9jb21waWxlcl9pZl90YXJnZXQuY3BwIGIvZmluYWwvb2ZmbG9hZC9zcmMvY29tcGlsZXJfaWZfdGFyZ2V0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWY4MmI4Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9zcmMvY29tcGlsZXJfaWZfdGFyZ2V0LmNwcApAQCAtMCwwICsxLDQ0IEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJjb21waWxlcl9pZl90YXJnZXQuaCIKKworZXh0ZXJuICJDIiB2b2lkIE9GRkxPQURfVEFSR0VUX0VOVEVSKAorICAgIE9GRkxPQUQgb2ZsZCwKKyAgICBpbnQgdmFyc190b3RhbCwKKyAgICBWYXJEZXNjICp2YXJzLAorICAgIFZhckRlc2MyICp2YXJzMgorKQoreworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMywgIiVzKCVwLCAlZCwgJXAsICVwKVxuIiwgX19mdW5jX18sIG9mbGQsCisgICAgICAgICAgICAgICAgICAgICAgICB2YXJzX3RvdGFsLCB2YXJzLCB2YXJzMik7CisgICAgb2ZsZC0+bWVyZ2VfdmFyX2Rlc2NzKHZhcnMsIHZhcnMyLCB2YXJzX3RvdGFsKTsKKyAgICBvZmxkLT5zY2F0dGVyX2NvcHlpbl9kYXRhKCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBPRkZMT0FEX1RBUkdFVF9MRUFWRSgKKyAgICBPRkZMT0FEIG9mbGQKKykKK3sKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDMsICIlcyglcClcbiIsIF9fZnVuY19fLCBvZmxkKTsKKyAgICBvZmxkLT5nYXRoZXJfY29weW91dF9kYXRhKCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBPRkZMT0FEX1RBUkdFVF9NQUlOKHZvaWQpCit7CisgICAgLy8gaW5pdGlhbGl6ZSB0YXJnZXQgcGFydAorICAgIF9fb2ZmbG9hZF90YXJnZXRfaW5pdCgpOworCisgICAgLy8gcGFzcyBjb250cm9sIHRvIENPSQorICAgIFBpcGVsaW5lU3RhcnRFeGVjdXRpbmdSdW5GdW5jdGlvbnMoKTsKKyAgICBQcm9jZXNzV2FpdEZvclNodXRkb3duKCk7CisKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJFeGl0aW5nIG1haW4uLi5cbiIpOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvb2ZmbG9hZC9zcmMvY29tcGlsZXJfaWZfdGFyZ2V0LmggYi9maW5hbC9vZmZsb2FkL3NyYy9jb21waWxlcl9pZl90YXJnZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWQyYzFjCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9zcmMvY29tcGlsZXJfaWZfdGFyZ2V0LmgKQEAgLTAsMCArMSw1MCBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisvKiEgXGZpbGUKKyAgICBcYnJpZWYgVGhlIGludGVyZmFjZSBiZXR3ZWVuIGNvbXBpbGVyLWdlbmVyYXRlZCB0YXJnZXQgY29kZSBhbmQgcnVudGltZSBsaWJyYXJ5CisqLworCisjaWZuZGVmIENPTVBJTEVSX0lGX1RBUkdFVF9IX0lOQ0xVREVECisjZGVmaW5lIENPTVBJTEVSX0lGX1RBUkdFVF9IX0lOQ0xVREVECisKKyNpbmNsdWRlICJvZmZsb2FkX3RhcmdldC5oIgorCisjZGVmaW5lIE9GRkxPQURfVEFSR0VUX0VOVEVSICAgICAgICAgICAgT0ZGTE9BRF9QUkVGSVgodGFyZ2V0X2VudGVyKQorI2RlZmluZSBPRkZMT0FEX1RBUkdFVF9MRUFWRSAgICAgICAgICAgIE9GRkxPQURfUFJFRklYKHRhcmdldF9sZWF2ZSkKKyNkZWZpbmUgT0ZGTE9BRF9UQVJHRVRfTUFJTiAgICAgICAgICAgICBPRkZMT0FEX1BSRUZJWCh0YXJnZXRfbWFpbikKKworLyohIFxmbiBPRkZMT0FEX1RBUkdFVF9FTlRFUgorICAgIFxicmllZiBGaWxsIGluIHZhcmlhYmxlIGFkZHJlc3NlcyB1c2luZyBWYXJEZXNjIGFycmF5LgorICAgIFxicmllZiBUaGVuIGNhbGwgYmFjayB0aGUgcnVudGltZSBsaWJyYXJ5IHRvIGZldGNoIGRhdGEuCisgICAgXHBhcmFtIG9mbGQgICAgICAgICBPZmZsb2FkIGRlc2NyaXB0b3IgY3JlYXRlZCBieSBydW50aW1lLgorICAgIFxwYXJhbSB2YXJfZGVzY19udW0gTnVtYmVyIG9mIHZhcmlhYmxlIGRlc2NyaXB0b3JzLgorICAgIFxwYXJhbSB2YXJfZGVzYyAgICAgUG9pbnRlciB0byBWYXJEZXNjIGFycmF5LgorICAgIFxwYXJhbSB2YXJfZGVzYzIgICAgUG9pbnRlciB0byBWYXJEZXNjMiBhcnJheS4KKyovCitleHRlcm4gIkMiIHZvaWQgT0ZGTE9BRF9UQVJHRVRfRU5URVIoCisgICAgT0ZGTE9BRCBvZmxkLAorICAgIGludCB2YXJfZGVzY19udW0sCisgICAgVmFyRGVzYyAqdmFyX2Rlc2MsCisgICAgVmFyRGVzYzIgKnZhcl9kZXNjMgorKTsKKworLyohIFxmbiBPRkZMT0FEX1RBUkdFVF9MRUFWRQorICAgIFxicmllZiBDYWxsIGJhY2sgdGhlIHJ1bnRpbWUgbGlicmFyeSB0byBnYXRoZXIgb3V0cHV0cyB1c2luZyBWYXJEZXNjIGFycmF5LgorICAgIFxwYXJhbSBvZmxkIE9mZmxvYWQgZGVzY3JpcHRvciBjcmVhdGVkIGJ5IE9GRkxPQURfVEFSR0VUX0FDUVVJUkUuCisqLworZXh0ZXJuICJDIiB2b2lkIE9GRkxPQURfVEFSR0VUX0xFQVZFKAorICAgIE9GRkxPQUQgb2ZsZAorKTsKKworLy8gRW50cnkgcG9pbnQgZm9yIHRoZSB0YXJnZXQgYXBwbGljYXRpb24uCitleHRlcm4gIkMiIHZvaWQgT0ZGTE9BRF9UQVJHRVRfTUFJTih2b2lkKTsKKworI2VuZGlmIC8vIENPTVBJTEVSX0lGX1RBUkdFVF9IX0lOQ0xVREVECmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL3NyYy9kdl91dGlsLmNwcCBiL2ZpbmFsL29mZmxvYWQvc3JjL2R2X3V0aWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhZDcyNzEKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL3NyYy9kdl91dGlsLmNwcApAQCAtMCwwICsxLDEzMSBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAib2ZmbG9hZF9jb21tb24uaCIKKworYm9vbCBfX2R2X2lzX2NvbnRpZ3VvdXMoY29uc3QgQXJyRGVzYyAqZHZwKQoreworICAgIGlmIChkdnAtPkZsYWdzICYgQXJyRGVzY0ZsYWdzQ29udGlndW91cykgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoZHZwLT5SYW5rICE9IDApIHsKKyAgICAgICAgaWYgKGR2cC0+RGltWzBdLk11bHQgIT0gZHZwLT5MZW4pIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IGR2cC0+UmFuazsgaSsrKSB7CisgICAgICAgICAgICBpZiAoZHZwLT5EaW1baV0uTXVsdCAhPQorICAgICAgICAgICAgICAgIGR2cC0+RGltW2ktMV0uRXh0ZW50ICogZHZwLT5EaW1baS0xXS5NdWx0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIF9fZHZfaXNfYWxsb2NhdGVkKGNvbnN0IEFyckRlc2MgKmR2cCkKK3sKKyAgICByZXR1cm4gKGR2cC0+RmxhZ3MgJiBBcnJEZXNjRmxhZ3NEZWZpbmVkKTsKK30KKwordWludDY0X3QgX19kdl9kYXRhX2xlbmd0aChjb25zdCBBcnJEZXNjICpkdnApCit7CisgICAgdWludDY0X3Qgc2l6ZTsKKworICAgIGlmIChkdnAtPlJhbmsgPT0gMCkgeworICAgICAgICBzaXplID0gZHZwLT5MZW47CisgICAgICAgIHJldHVybiBzaXplOworICAgIH0KKworICAgIHNpemUgPSBkdnAtPkxlbjsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGR2cC0+UmFuazsgKytpKSB7CisgICAgICAgIHNpemUgKz0gKGR2cC0+RGltW2ldLkV4dGVudC0xKSAqIGR2cC0+RGltW2ldLk11bHQ7CisgICAgfQorICAgIHJldHVybiBzaXplOworfQorCit1aW50NjRfdCBfX2R2X2RhdGFfbGVuZ3RoKGNvbnN0IEFyckRlc2MgKmR2cCwgaW50NjRfdCBjb3VudCkKK3sKKyAgICBpZiAoZHZwLT5SYW5rID09IDApIHsKKyAgICAgICAgcmV0dXJuIGNvdW50OworICAgIH0KKworICAgIHJldHVybiBjb3VudCAqIGR2cC0+RGltWzBdLk11bHQ7Cit9CisKKy8vIENyZWF0ZSBDZWFuUmVhZFJhbmdlcyBkYXRhIGZvciByZWFkaW5nIGNvbnRpZ3VvdXMgcmFuZ2VzIG9mCisvLyBub25jb250aWd1b3VzIGFycmF5IGRlZmluZWQgYnkgdGhlIGFyZ3VtZW50CitDZWFuUmVhZFJhbmdlcyAqIGluaXRfcmVhZF9yYW5nZXNfZHYoY29uc3QgQXJyRGVzYyAqZHZwKQoreworICAgIGludDY0X3QgICAgICAgICBsZW47CisgICAgaW50ICAgICAgICAgICAgIGNvdW50OworICAgIGludCAgICAgICAgICAgICByYW5rID0gZHZwLT5SYW5rOworICAgIENlYW5SZWFkUmFuZ2VzICpyZXMgPSBOVUxMOworCisgICAgaWYgKHJhbmsgIT0gMCkgeworICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgIGxlbiA9IGR2cC0+TGVuOworICAgICAgICBpZiAoZHZwLT5EaW1bMF0uTXVsdCA9PSBsZW4pIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCByYW5rOyBpKyspIHsKKyAgICAgICAgICAgICAgICBsZW4gKj0gZHZwLT5EaW1baS0xXS5FeHRlbnQ7CisgICAgICAgICAgICAgICAgaWYgKGR2cC0+RGltW2ldLk11bHQgIT0gbGVuKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXMgPSAoQ2VhblJlYWRSYW5nZXMgKiltYWxsb2MoCisgICAgICAgICAgICBzaXplb2YoQ2VhblJlYWRSYW5nZXMpICsgKHJhbmsgLSBpKSAqIHNpemVvZihDZWFuUmVhZERpbSkpOworICAgICAgICByZXMgLT4gbGFzdF9ub25jb250X2luZCA9IHJhbmsgLSBpIC0gMTsKKyAgICAgICAgY291bnQgPSAxOworICAgICAgICBmb3IgKDsgaSA8IHJhbms7IGkrKykgeworICAgICAgICAgICAgcmVzLT5EaW1bcmFuayAtIGkgLSAxXS5jb3VudCA9IGNvdW50OworICAgICAgICAgICAgcmVzLT5EaW1bcmFuayAtIGkgLSAxXS5zaXplID0gZHZwLT5EaW1baV0uTXVsdDsKKyAgICAgICAgICAgIGNvdW50ICo9IGR2cC0+RGltW2ldLkV4dGVudDsKKyAgICAgICAgfQorICAgICAgICByZXMgLT4gcmFuZ2VfbWF4X251bWJlciA9IGNvdW50OworICAgICAgICByZXMgLT4gcmFuZ2Vfc2l6ZSA9IGxlbjsKKyAgICAgICAgcmVzIC0+IHB0ciA9ICh2b2lkKilkdnAtPkJhc2U7CisgICAgICAgIHJlcyAtPiBjdXJyZW50X251bWJlciA9IDA7CisgICAgICAgIHJlcyAtPiBpbml0X29mZnNldCA9IDA7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKKyNpZiBPRkZMT0FEX0RFQlVHID4gMAordm9pZCBfX2R2X2Rlc2NfZHVtcChjb25zdCBjaGFyICpuYW1lLCBjb25zdCBBcnJEZXNjICpkdnApCit7CisgICAgT0ZGTE9BRF9UUkFDRSgzLCAiJXMgRFYgJXBcbiIsIG5hbWUsIGR2cCk7CisKKyAgICBpZiAoZHZwICE9IDApIHsKKyAgICAgICAgT0ZGTE9BRF9UUkFDRSgzLAorICAgICAgICAgICAgICAgICAgICAgICIgICAgZHYtPkJhc2UgICA9IDB4JWx4XG4iCisgICAgICAgICAgICAgICAgICAgICAgIiAgICBkdi0+TGVuICAgID0gMHglbHhcbiIKKyAgICAgICAgICAgICAgICAgICAgICAiICAgIGR2LT5PZmZzZXQgPSAweCVseFxuIgorICAgICAgICAgICAgICAgICAgICAgICIgICAgZHYtPkZsYWdzICA9IDB4JWx4XG4iCisgICAgICAgICAgICAgICAgICAgICAgIiAgICBkdi0+UmFuayAgID0gMHglbHhcbiIKKyAgICAgICAgICAgICAgICAgICAgICAiICAgIGR2LT5SZXNydmQgPSAweCVseFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBkdnAtPkJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgZHZwLT5MZW4sCisgICAgICAgICAgICAgICAgICAgICAgZHZwLT5PZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgZHZwLT5GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICBkdnAtPlJhbmssCisgICAgICAgICAgICAgICAgICAgICAgZHZwLT5SZXNlcnZlZCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgZHZwLT5SYW5rOyBpKyspIHsKKyAgICAgICAgICAgIE9GRkxPQURfVFJBQ0UoMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAoJWQpIEV4dGVudD0lbGQsIE11bHRpcGxpZXI9JWxkLCBMb3dlckJvdW5kPSVsZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZHZwLT5EaW1baV0uRXh0ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICBkdnAtPkRpbVtpXS5NdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBkdnAtPkRpbVtpXS5Mb3dlckJvdW5kKTsKKyAgICAgICAgfQorICAgIH0KK30KKyNlbmRpZiAvLyBPRkZMT0FEX0RFQlVHID4gMApkaWZmIC0tZ2l0IGEvZmluYWwvb2ZmbG9hZC9zcmMvZHZfdXRpbC5oIGIvZmluYWwvb2ZmbG9hZC9zcmMvZHZfdXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZmE3N2QKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL3NyYy9kdl91dGlsLmgKQEAgLTAsMCArMSw2MyBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIERWX1VUSUxfSF9JTkNMVURFRAorI2RlZmluZSBEVl9VVElMX0hfSU5DTFVERUQKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisvLyBEb3BlIHZlY3RvciBkZWNsYXJhdGlvbnMKKyNkZWZpbmUgQXJyRGVzY01heEFycmF5UmFuayAgICAgICAgIDMxCisKKy8vIERvcGUgdmVjdG9yIGZsYWdzCisjZGVmaW5lIEFyckRlc2NGbGFnc0RlZmluZWQgICAgICAgICAxCisjZGVmaW5lIEFyckRlc2NGbGFnc05vZGVhbGxvYyAgICAgICAyCisjZGVmaW5lIEFyckRlc2NGbGFnc0NvbnRpZ3VvdXMgICAgICA0CisKK3R5cGVkZWYgaW50NjRfdCBkdl9zaXplOworCit0eXBlZGVmIHN0cnVjdCBEaW1EZXNjIHsKKyAgICBkdl9zaXplICAgICAgICBFeHRlbnQ7ICAgICAgLy8gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoaXMgZGltZW5zaW9uCisgICAgZHZfc2l6ZSAgICAgICAgTXVsdDsgICAgICAgIC8vIE11bHRpcGxpZXIgZm9yIHRoaXMgZGltZW5zaW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgbnVtYmVyIG9mIGJ5dGVzIGJldHdlZW4gc3VjY2Vzc2l2ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlbGVtZW50cyBpbiB0aGlzIGRpbWVuc2lvbi4KKyAgICBkdl9zaXplICAgICAgICBMb3dlckJvdW5kOyAgLy8gTG93ZXJCb3VuZCBvZiB0aGlzIGRpbWVuc2lvbgorfSBEaW1EZXNjIDsKKwordHlwZWRlZiBzdHJ1Y3QgQXJyRGVzYyB7CisgICAgZHZfc2l6ZSAgICAgICAgQmFzZTsgICAgICAgIC8vIEJhc2UgYWRkcmVzcworICAgIGR2X3NpemUgICAgICAgIExlbjsgICAgICAgICAvLyBMZW5ndGggb2YgZGF0YSB0eXBlLCB1c2VkIG9ubHkgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoYXJhY3RlciBzdHJpbmdzLgorICAgIGR2X3NpemUgICAgICAgIE9mZnNldDsKKyAgICBkdl9zaXplICAgICAgICBGbGFnczsgICAgICAgLy8gRmxhZ3MKKyAgICBkdl9zaXplICAgICAgICBSYW5rOyAgICAgICAgLy8gUmFuayBvZiBwb2ludGVyCisgICAgZHZfc2l6ZSAgICAgICAgUmVzZXJ2ZWQ7ICAgIC8vIHJlc2VydmVkIGZvciBvcGVubXAgcmVxdWVzdHMKKyAgICBEaW1EZXNjIERpbVtBcnJEZXNjTWF4QXJyYXlSYW5rXTsKK30gQXJyRGVzYyA7CisKK3R5cGVkZWYgQXJyRGVzYyogcEFyckRlc2M7CisKK2Jvb2wgX19kdl9pc19jb250aWd1b3VzKGNvbnN0IEFyckRlc2MgKmR2cCk7CisKK2Jvb2wgX19kdl9pc19hbGxvY2F0ZWQoY29uc3QgQXJyRGVzYyAqZHZwKTsKKwordWludDY0X3QgX19kdl9kYXRhX2xlbmd0aChjb25zdCBBcnJEZXNjICpkdnApOworCit1aW50NjRfdCBfX2R2X2RhdGFfbGVuZ3RoKGNvbnN0IEFyckRlc2MgKmR2cCwgaW50NjRfdCBuZWxlbXMpOworCitDZWFuUmVhZFJhbmdlcyAqIGluaXRfcmVhZF9yYW5nZXNfZHYoY29uc3QgQXJyRGVzYyAqZHZwKTsKKworI2lmIE9GRkxPQURfREVCVUcgPiAwCit2b2lkICAgIF9fZHZfZGVzY19kdW1wKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IEFyckRlc2MgKmR2cCk7CisjZWxzZSAvLyBPRkZMT0FEX0RFQlVHCisjZGVmaW5lIF9fZHZfZGVzY19kdW1wKG5hbWUsIGR2cCkKKyNlbmRpZiAvLyBPRkZMT0FEX0RFQlVHCisKKyNlbmRpZiAvLyBEVl9VVElMX0hfSU5DTFVERUQKZGlmZiAtLWdpdCBhL2ZpbmFsL29mZmxvYWQvc3JjL2xpYm9mZmxvYWRfZXJyb3IuYyBiL2ZpbmFsL29mZmxvYWQvc3JjL2xpYm9mZmxvYWRfZXJyb3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzE1ZjhiCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9zcmMvbGlib2ZmbG9hZF9lcnJvci5jCkBAIC0wLDAgKzEsNDUyIEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2lmbmRlZiB2YV9jb3B5CisjZGVmaW5lIHZhX2NvcHkoZHN0LCBzcmMpICgoZHN0KSA9IChzcmMpKQorI2VuZGlmCisKKyNpbmNsdWRlICJsaWJvZmZsb2FkX21zZy5oIgorCisjaW5jbHVkZSAibGlib2ZmbG9hZF9lcnJvcl9jb2Rlcy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBlcnJvci1oYW5kbGluZyBmdW5jdGlvbiwgbGlib2ZmbG9hZF9lcnJvcl9zdXBwb3J0ICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgX19saWJvZmZsb2FkX2Vycm9yX3N1cHBvcnQoZXJyb3JfdHlwZXMgaW5wdXRfdGFnLCAuLi4pCit7CisgICAgdmFfbGlzdCBhcmdzOworICAgIHZhX3N0YXJ0KGFyZ3MsIGlucHV0X3RhZyk7CisKKyAgICBzd2l0Y2ggKGlucHV0X3RhZykgeworICAgICAgICBjYXNlIGNfZGV2aWNlX2lzX25vdF9hdmFpbGFibGU6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfZGV2aWNlX2lzX25vdF9hdmFpbGFibGUsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19pbnZhbGlkX2RldmljZV9udW1iZXI6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfaW52YWxpZF9kZXZpY2VfbnVtYmVyLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfc2VuZF9mdW5jX3B0cjoKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19zZW5kX2Z1bmNfcHRyLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfcmVjZWl2ZV9mdW5jX3B0cjoKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19yZWNlaXZlX2Z1bmNfcHRyLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9tYWxsb2M6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2Nfb2ZmbG9hZF9tYWxsb2MsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vZmZsb2FkMToKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19vZmZsb2FkMSwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX3Vua25vd25fdmFyX3R5cGU6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgY191bmtub3duX3Zhcl90eXBlLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfaW52YWxpZF9lbnZfdmFyX3ZhbHVlOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX2ludmFsaWRfZW52X3Zhcl92YWx1ZSwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX2ludmFsaWRfZW52X3Zhcl9pbnRfdmFsdWU6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfaW52YWxpZF9lbnZfdmFyX2ludF92YWx1ZSwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX2ludmFsaWRfZW52X3JlcG9ydF92YWx1ZToKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19pbnZhbGlkX2Vudl9yZXBvcnRfdmFsdWUsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX3NpZ25hbGVkMToKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19vZmZsb2FkX3NpZ25hbGVkMSwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfc2lnbmFsZWQyOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX29mZmxvYWRfc2lnbmFsZWQyLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfbXlvd3JhcHBlcl9jaGVja3Jlc3VsdDoKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19teW93cmFwcGVyX2NoZWNrcmVzdWx0LCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfbXlvdGFyZ2V0X2NoZWNrcmVzdWx0OgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX215b3RhcmdldF9jaGVja3Jlc3VsdCwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfZGVzY3JpcHRvcl9vZmZsb2FkOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX29mZmxvYWRfZGVzY3JpcHRvcl9vZmZsb2FkLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfbWVyZ2VfdmFyX2Rlc2NzMToKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19tZXJnZV92YXJfZGVzY3MxLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfbWVyZ2VfdmFyX2Rlc2NzMjoKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19tZXJnZV92YXJfZGVzY3MyLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfbWljX3BhcnNlX2Vudl92YXJfbGlzdDE6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfbWljX3BhcnNlX2Vudl92YXJfbGlzdDEsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19taWNfcGFyc2VfZW52X3Zhcl9saXN0MjoKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19taWNfcGFyc2VfZW52X3Zhcl9saXN0MiwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX21pY19wcm9jZXNzX2V4aXRfcmV0OgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX21pY19wcm9jZXNzX2V4aXRfcmV0LCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfbWljX3Byb2Nlc3NfZXhpdF9zaWc6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfbWljX3Byb2Nlc3NfZXhpdF9zaWcsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19taWNfcHJvY2Vzc19leGl0OgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX21pY19wcm9jZXNzX2V4aXQsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19taWNfaW5pdDM6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfbWljX2luaXQzLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfbWljX2luaXQ0OgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX21pY19pbml0NCwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX21pY19pbml0NToKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19taWNfaW5pdDUsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19taWNfaW5pdDY6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfbWljX2luaXQ2LCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfbm9fc3RhdGljX3Zhcl9kYXRhOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX25vX3N0YXRpY192YXJfZGF0YSwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX25vX3B0cl9kYXRhOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX25vX3B0cl9kYXRhLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfZ2V0X2VuZ2luZV9oYW5kbGU6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfZ2V0X2VuZ2luZV9oYW5kbGUsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19nZXRfZW5naW5lX2luZGV4OgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX2dldF9lbmdpbmVfaW5kZXgsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19wcm9jZXNzX2NyZWF0ZToKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19wcm9jZXNzX2NyZWF0ZSwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX3Byb2Nlc3Nfd2FpdF9zaHV0ZG93bjoKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19wcm9jZXNzX3dhaXRfc2h1dGRvd24sIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19wcm9jZXNzX3Byb3h5X2ZsdXNoOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX3Byb2Nlc3NfcHJveHlfZmx1c2gsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19wcm9jZXNzX2dldF9mdW5jX2hhbmRsZXM6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfcHJvY2Vzc19nZXRfZnVuY19oYW5kbGVzLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfbG9hZF9saWJyYXJ5OgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX2xvYWRfbGlicmFyeSwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX2NvaXBpcGVfbWF4X251bWJlcjoKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19jb2lfcGlwZWxpbmVfbWF4X251bWJlciwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX3BpcGVsaW5lX2NyZWF0ZToKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19waXBlbGluZV9jcmVhdGUsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19waXBlbGluZV9ydW5fZnVuYzoKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19waXBlbGluZV9ydW5fZnVuYywgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX3BpcGVsaW5lX3N0YXJ0X3J1bl9mdW5jczoKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19waXBlbGluZV9zdGFydF9ydW5fZnVuY3MsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19idWZfY3JlYXRlOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX2J1Zl9jcmVhdGUsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19idWZfY3JlYXRlX291dF9vZl9tZW06CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfYnVmX2NyZWF0ZV9vdXRfb2ZfbWVtLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfYnVmX2NyZWF0ZV9mcm9tX21lbToKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19idWZfY3JlYXRlX2Zyb21fbWVtLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfYnVmX2Rlc3Ryb3k6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfYnVmX2Rlc3Ryb3ksIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19idWZfbWFwOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX2J1Zl9tYXAsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19idWZfdW5tYXA6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfYnVmX3VubWFwLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfYnVmX3JlYWQ6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfYnVmX3JlYWQsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19idWZfd3JpdGU6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfYnVmX3dyaXRlLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfYnVmX2NvcHk6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfYnVmX2NvcHksIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19idWZfZ2V0X2FkZHJlc3M6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfYnVmX2dldF9hZGRyZXNzLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfYnVmX2FkZF9yZWY6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfYnVmX2FkZF9yZWYsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19idWZfcmVsZWFzZV9yZWY6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfYnVmX3JlbGVhc2VfcmVmLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfYnVmX3NldF9zdGF0ZToKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19idWZfc2V0X3N0YXRlLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfZXZlbnRfd2FpdDoKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19ldmVudF93YWl0LCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfemVyb19vcl9uZWdfcHRyX2xlbjoKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY196ZXJvX29yX25lZ19wdHJfbGVuLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfemVyb19vcl9uZWdfdHJhbnNmZXJfc2l6ZToKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY196ZXJvX29yX25lZ190cmFuc2Zlcl9zaXplLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfYmFkX3B0cl9tZW1fcmFuZ2U6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfYmFkX3B0cl9tZW1fcmFuZ2UsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19kaWZmZXJlbnRfc3JjX2FuZF9kc3RuX3NpemVzOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX2RpZmZlcmVudF9zcmNfYW5kX2RzdG5fc2l6ZXMsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19yYW5nZXNfZG9udF9tYXRjaDoKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19yYW5nZXNfZG9udF9tYXRjaCwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX2Rlc3RpbmF0aW9uX2lzX292ZXI6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfZGVzdGluYXRpb25faXNfb3ZlciwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX3NsaWNlX29mX25vbmNvbnRfYXJyYXk6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2Nfc2xpY2Vfb2Zfbm9uY29udF9hcnJheSwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX25vbl9jb250aWd1b3VzX2RvcGVfdmVjdG9yOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX25vbl9jb250aWd1b3VzX2RvcGVfdmVjdG9yLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfcG9pbnRlcl9hcnJheV9taXNtYXRjaDoKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19wb2ludGVyX2FycmF5X21pc21hdGNoLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfb21wX2ludmFsaWRfZGV2aWNlX251bV9lbnY6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2Nfb21wX2ludmFsaWRfZGV2aWNlX251bV9lbnYsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vbXBfaW52YWxpZF9kZXZpY2VfbnVtOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX29tcF9pbnZhbGlkX2RldmljZV9udW0sIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY191bmtub3duX2JpbmFyeV90eXBlOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX3Vua25vd25fYmluYXJ5X3R5cGUsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19tdWx0aXBsZV90YXJnZXRfZXhlczoKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19tdWx0aXBsZV90YXJnZXRfZXhlcywgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX25vX3RhcmdldF9leGU6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2Nfbm9fdGFyZ2V0X2V4ZSwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF91bmtub3duX3RpbWVyX25vZGU6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfcmVwb3J0X3Vua25vd25fdGltZXJfbm9kZSwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF91bmtub3duX3RyYWNlX25vZGU6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfcmVwb3J0X3Vua25vd25fdHJhY2Vfbm9kZSwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgdmFfZW5kKGFyZ3MpOworfQorCitjaGFyIGNvbnN0ICogcmVwb3J0X2dldF9tZXNzYWdlX3N0cihlcnJvcl90eXBlcyBpbnB1dF90YWcpCit7CisgICAgc3dpdGNoIChpbnB1dF90YWcpIHsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF90aXRsZToKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X3RpdGxlKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfZnJvbV9maWxlOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfZnJvbV9maWxlKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfb2ZmbG9hZDoKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X29mZmxvYWQpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9taWM6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9taWMpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9maWxlOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfZmlsZSkpOworICAgICAgICBjYXNlIGNfcmVwb3J0X2xpbmU6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9saW5lKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfaG9zdDoKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X2hvc3QpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF90YWc6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF90YWcpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9jcHVfdGltZToKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X2NwdV90aW1lKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfc2Vjb25kczoKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X3NlY29uZHMpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9jcHVfdG9fbWljX2RhdGE6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9jcHVfdG9fbWljX2RhdGEpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9ieXRlczoKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X2J5dGVzKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfbWljX3RpbWU6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9taWNfdGltZSkpOworICAgICAgICBjYXNlIGNfcmVwb3J0X21pY190b19jcHVfZGF0YToKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X21pY190b19jcHVfZGF0YSkpOworICAgICAgICBjYXNlIGNfcmVwb3J0X2NvbXB1dGU6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9jb21wdXRlKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfY29weWluX2RhdGE6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9jb3B5aW5fZGF0YSkpOworICAgICAgICBjYXNlIGNfcmVwb3J0X2NvcHlvdXRfZGF0YToKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X2NvcHlvdXRfZGF0YSkpOworICAgICAgICBjYXNlIGNfcmVwb3J0X2NyZWF0ZV9idWZfaG9zdDoKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfY3JlYXRlX2J1Zl9ob3N0KSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfY3JlYXRlX2J1Zl9taWM6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9jcmVhdGVfYnVmX21pYykpOworICAgICAgICBjYXNlIGNfcmVwb3J0X2Rlc3Ryb3k6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9kZXN0cm95KSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfZ2F0aGVyX2NvcHlpbl9kYXRhOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfZ2F0aGVyX2NvcHlpbl9kYXRhKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfZ2F0aGVyX2NvcHlvdXRfZGF0YToKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X2dhdGhlcl9jb3B5b3V0X2RhdGEpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9zdGF0ZV9zaWduYWw6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9zdGF0ZV9zaWduYWwpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9zaWduYWw6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9zaWduYWwpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF93YWl0OgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfd2FpdCkpOworICAgICAgICBjYXNlIGNfcmVwb3J0X2luaXQ6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9pbml0KSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfaW5pdF9mdW5jOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfaW5pdF9mdW5jKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfbG9naWNhbF9jYXJkOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfbG9naWNhbF9jYXJkKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfbWljX215b19mcHRyOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfbWljX215b19mcHRyKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfbWljX215b19zaGFyZWQ6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9taWNfbXlvX3NoYXJlZCkpOworICAgICAgICBjYXNlIGNfcmVwb3J0X215b2FjcXVpcmU6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9teW9hY3F1aXJlKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfbXlvZmluaToKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X215b2ZpbmkpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9teW9pbml0OgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfbXlvaW5pdCkpOworICAgICAgICBjYXNlIGNfcmVwb3J0X215b3JlZ2lzdGVyOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfbXlvcmVnaXN0ZXIpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9teW9yZWxlYXNlOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfbXlvcmVsZWFzZSkpOworICAgICAgICBjYXNlIGNfcmVwb3J0X215b3NoYXJlZGFsaWduZWRmcmVlOgorICAgICAgICAgICAgcmV0dXJuICgKKyAgICAgICAgICAgICAgICBvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfbXlvc2hhcmVkYWxpZ25lZGZyZWUpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9teW9zaGFyZWRhbGlnbmVkbWFsbG9jOgorICAgICAgICAgICAgcmV0dXJuICgKKyAgICAgICAgICAgICAgICBvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfbXlvc2hhcmVkYWxpZ25lZG1hbGxvYykpOworICAgICAgICBjYXNlIGNfcmVwb3J0X215b3NoYXJlZGZyZWU6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9teW9zaGFyZWRmcmVlKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfbXlvc2hhcmVkbWFsbG9jOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfbXlvc2hhcmVkbWFsbG9jKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfcGh5c2ljYWxfY2FyZDoKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X3BoeXNpY2FsX2NhcmQpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9yZWNlaXZlX3BvaW50ZXJfZGF0YToKKyAgICAgICAgICAgIHJldHVybiAoCisgICAgICAgICAgICAgICAgb2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X3JlY2VpdmVfcG9pbnRlcl9kYXRhKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfcmVjZWl2ZWRfcG9pbnRlcl9kYXRhOgorICAgICAgICAgICAgcmV0dXJuICgKKyAgICAgICAgICAgICAgICBvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfcmVjZWl2ZWRfcG9pbnRlcl9kYXRhKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfcmVnaXN0ZXI6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9yZWdpc3RlcikpOworICAgICAgICBjYXNlIGNfcmVwb3J0X3NjYXR0ZXJfY29weWluX2RhdGE6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9zY2F0dGVyX2NvcHlpbl9kYXRhKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfc2NhdHRlcl9jb3B5b3V0X2RhdGE6CisgICAgICAgICAgICByZXR1cm4gKAorICAgICAgICAgICAgICAgIG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9zY2F0dGVyX2NvcHlvdXRfZGF0YSkpOworICAgICAgICBjYXNlIGNfcmVwb3J0X3NlbmRfcG9pbnRlcl9kYXRhOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfc2VuZF9wb2ludGVyX2RhdGEpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9zZW50X3BvaW50ZXJfZGF0YToKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X3NlbnRfcG9pbnRlcl9kYXRhKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfc3RhcnQ6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9zdGFydCkpOworICAgICAgICBjYXNlIGNfcmVwb3J0X3N0YXJ0X3RhcmdldF9mdW5jOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfc3RhcnRfdGFyZ2V0X2Z1bmMpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9zdGF0ZToKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X3N0YXRlKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfdW5yZWdpc3RlcjoKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X3VucmVnaXN0ZXIpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF92YXI6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF92YXIpKTsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3JlcG9ydF91bmtub3duX3RyYWNlX25vZGUpOworICAgICAgICAgICAgYWJvcnQoKTsKKyAgICB9Cit9CisKK2NoYXIgY29uc3QgKiByZXBvcnRfZ2V0X2hvc3Rfc3RhZ2Vfc3RyKGludCBpKQoreworICAgIHN3aXRjaCAoaSkgeworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9ob3N0X3RvdGFsX29mZmxvYWQ6CisgICAgICAgICAgICByZXR1cm4gKAorICAgICAgICAgICAgICAgb2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X2hvc3RfdG90YWxfb2ZmbG9hZF90aW1lKSk7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX2hvc3RfaW5pdGlhbGl6ZToKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X2hvc3RfaW5pdGlhbGl6ZSkpOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9ob3N0X3RhcmdldF9hY3F1aXJlOgorICAgICAgICAgICAgcmV0dXJuICgKKyAgICAgICAgICAgICAgICBvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfaG9zdF90YXJnZXRfYWNxdWlyZSkpOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9ob3N0X3dhaXRfZGVwczoKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X2hvc3Rfd2FpdF9kZXBzKSk7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX2hvc3Rfc2V0dXBfYnVmZmVyczoKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X2hvc3Rfc2V0dXBfYnVmZmVycykpOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9ob3N0X2FsbG9jX2J1ZmZlcnM6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9ob3N0X2FsbG9jX2J1ZmZlcnMpKTsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfaG9zdF9zZXR1cF9taXNjX2RhdGE6CisgICAgICAgICAgICByZXR1cm4gKAorICAgICAgICAgICAgICAgIG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9ob3N0X3NldHVwX21pc2NfZGF0YSkpOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9ob3N0X2FsbG9jX2RhdGFfYnVmZmVyOgorICAgICAgICAgICAgcmV0dXJuICgKKyAgICAgICAgICAgICAgICBvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfaG9zdF9hbGxvY19kYXRhX2J1ZmZlcikpOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9ob3N0X3NlbmRfcG9pbnRlcnM6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9ob3N0X3NlbmRfcG9pbnRlcnMpKTsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfaG9zdF9nYXRoZXJfaW5wdXRzOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfaG9zdF9nYXRoZXJfaW5wdXRzKSk7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX2hvc3RfbWFwX2luX2RhdGFfYnVmZmVyOgorICAgICAgICAgICAgcmV0dXJuICgKKyAgICAgICAgICAgICAgICBvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfaG9zdF9tYXBfaW5fZGF0YV9idWZmZXIpKTsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfaG9zdF91bm1hcF9pbl9kYXRhX2J1ZmZlcjoKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIoCisgICAgICAgICAgICAgICAgbXNnX2NfcmVwb3J0X2hvc3RfdW5tYXBfaW5fZGF0YV9idWZmZXIpKTsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfaG9zdF9zdGFydF9jb21wdXRlOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfaG9zdF9zdGFydF9jb21wdXRlKSk7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX2hvc3Rfd2FpdF9jb21wdXRlOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfaG9zdF93YWl0X2NvbXB1dGUpKTsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfaG9zdF9zdGFydF9idWZmZXJzX3JlYWRzOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cigKKyAgICAgICAgICAgICAgICBtc2dfY19yZXBvcnRfaG9zdF9zdGFydF9idWZmZXJzX3JlYWRzKSk7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX2hvc3Rfc2NhdHRlcl9vdXRwdXRzOgorICAgICAgICAgICAgcmV0dXJuICgKKyAgICAgICAgICAgICAgICBvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfaG9zdF9zY2F0dGVyX291dHB1dHMpKTsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfaG9zdF9tYXBfb3V0X2RhdGFfYnVmZmVyOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cigKKyAgICAgICAgICAgICAgICBtc2dfY19yZXBvcnRfaG9zdF9tYXBfb3V0X2RhdGFfYnVmZmVyKSk7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX2hvc3RfdW5tYXBfb3V0X2RhdGFfYnVmZmVyOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cigKKyAgICAgICAgICAgICAgICBtc2dfY19yZXBvcnRfaG9zdF91bm1hcF9vdXRfZGF0YV9idWZmZXIpKTsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfaG9zdF93YWl0X2J1ZmZlcnNfcmVhZHM6CisgICAgICAgICAgICByZXR1cm4gKAorICAgICAgICAgICAgICAgIG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9ob3N0X3dhaXRfYnVmZmVyc19yZWFkcykpOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9ob3N0X2Rlc3Ryb3lfYnVmZmVyczoKKyAgICAgICAgICAgIHJldHVybiAoCisgICAgICAgICAgICAgICAgb2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X2hvc3RfZGVzdHJveV9idWZmZXJzKSk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfcmVwb3J0X3Vua25vd25fdGltZXJfbm9kZSk7CisgICAgICAgICAgICBhYm9ydCgpOworICAgIH0KK30KKworY2hhciBjb25zdCAqIHJlcG9ydF9nZXRfdGFyZ2V0X3N0YWdlX3N0cihpbnQgaSkKK3sKKyAgICBzd2l0Y2ggKGkpIHsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfdGFyZ2V0X3RvdGFsX3RpbWU6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF90YXJnZXRfdG90YWxfdGltZSkpOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF90YXJnZXRfZGVzY3JpcHRvcl9zZXR1cDoKKyAgICAgICAgICAgIHJldHVybiAoCisgICAgICAgICAgICAgICAgb2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X3RhcmdldF9kZXNjcmlwdG9yX3NldHVwKSk7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX3RhcmdldF9mdW5jX2xvb2t1cDoKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X3RhcmdldF9mdW5jX2xvb2t1cCkpOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF90YXJnZXRfZnVuY190aW1lOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfdGFyZ2V0X2Z1bmNfdGltZSkpOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF90YXJnZXRfc2NhdHRlcl9pbnB1dHM6CisgICAgICAgICAgICByZXR1cm4gKAorICAgICAgICAgICAgICAgIG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF90YXJnZXRfc2NhdHRlcl9pbnB1dHMpKTsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfdGFyZ2V0X2FkZF9idWZmZXJfcmVmczoKKyAgICAgICAgICAgIHJldHVybiAoCisgICAgICAgICAgICAgICAgb2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X3RhcmdldF9hZGRfYnVmZmVyX3JlZnMpKTsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfdGFyZ2V0X2NvbXB1dGU6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF90YXJnZXRfY29tcHV0ZSkpOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF90YXJnZXRfZ2F0aGVyX291dHB1dHM6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyCisgICAgICAgICAgICAgICAgKG1zZ19jX3JlcG9ydF90YXJnZXRfZ2F0aGVyX291dHB1dHMpKTsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfdGFyZ2V0X3JlbGVhc2VfYnVmZmVyX3JlZnM6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKAorICAgICAgICAgICAgICAgIG1zZ19jX3JlcG9ydF90YXJnZXRfcmVsZWFzZV9idWZmZXJfcmVmcykpOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3JlcG9ydF91bmtub3duX3RpbWVyX25vZGUpOworICAgICAgICAgICAgYWJvcnQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL3NyYy9saWJvZmZsb2FkX2Vycm9yX2NvZGVzLmggYi9maW5hbC9vZmZsb2FkL3NyYy9saWJvZmZsb2FkX2Vycm9yX2NvZGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTgyMTY3YgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvc3JjL2xpYm9mZmxvYWRfZXJyb3JfY29kZXMuaApAQCAtMCwwICsxLDI3NiBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWYgIWRlZmluZWQoTElCT0ZGTE9BRF9FUlJPUl9DT0RFU19IKQorI2RlZmluZSBMSUJPRkZMT0FEX0VSUk9SX0NPREVTX0gKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCit0eXBlZGVmIGVudW0KK3sKKyAgICBjX2RldmljZV9pc19ub3RfYXZhaWxhYmxlID0gMCwKKyAgICBjX2ludmFsaWRfZGV2aWNlX251bWJlciwKKyAgICBjX29mZmxvYWQxLAorICAgIGNfdW5rbm93bl92YXJfdHlwZSwKKyAgICBjX3NlbmRfZnVuY19wdHIsCisgICAgY19yZWNlaXZlX2Z1bmNfcHRyLAorICAgIGNfb2ZmbG9hZF9tYWxsb2MsCisgICAgY19pbnZhbGlkX2Vudl92YXJfdmFsdWUsCisgICAgY19pbnZhbGlkX2Vudl92YXJfaW50X3ZhbHVlLAorICAgIGNfaW52YWxpZF9lbnZfcmVwb3J0X3ZhbHVlLAorICAgIGNfb2ZmbG9hZF9zaWduYWxlZDEsCisgICAgY19vZmZsb2FkX3NpZ25hbGVkMiwKKyAgICBjX215b3RhcmdldF9jaGVja3Jlc3VsdCwKKyAgICBjX215b3dyYXBwZXJfY2hlY2tyZXN1bHQsCisgICAgY19vZmZsb2FkX2Rlc2NyaXB0b3Jfb2ZmbG9hZCwKKyAgICBjX21lcmdlX3Zhcl9kZXNjczEsCisgICAgY19tZXJnZV92YXJfZGVzY3MyLAorICAgIGNfbWljX3BhcnNlX2Vudl92YXJfbGlzdDEsCisgICAgY19taWNfcGFyc2VfZW52X3Zhcl9saXN0MiwKKyAgICBjX21pY19wcm9jZXNzX2V4aXRfcmV0LAorICAgIGNfbWljX3Byb2Nlc3NfZXhpdF9zaWcsCisgICAgY19taWNfcHJvY2Vzc19leGl0LAorICAgIGNfbWljX2luaXQzLAorICAgIGNfbWljX2luaXQ0LAorICAgIGNfbWljX2luaXQ1LAorICAgIGNfbWljX2luaXQ2LAorICAgIGNfbm9fc3RhdGljX3Zhcl9kYXRhLAorICAgIGNfbm9fcHRyX2RhdGEsCisgICAgY19nZXRfZW5naW5lX2hhbmRsZSwKKyAgICBjX2dldF9lbmdpbmVfaW5kZXgsCisgICAgY19wcm9jZXNzX2NyZWF0ZSwKKyAgICBjX3Byb2Nlc3NfZ2V0X2Z1bmNfaGFuZGxlcywKKyAgICBjX3Byb2Nlc3Nfd2FpdF9zaHV0ZG93biwKKyAgICBjX3Byb2Nlc3NfcHJveHlfZmx1c2gsCisgICAgY19sb2FkX2xpYnJhcnksCisgICAgY19waXBlbGluZV9jcmVhdGUsCisgICAgY19waXBlbGluZV9ydW5fZnVuYywKKyAgICBjX3BpcGVsaW5lX3N0YXJ0X3J1bl9mdW5jcywKKyAgICBjX2J1Zl9jcmVhdGUsCisgICAgY19idWZfY3JlYXRlX291dF9vZl9tZW0sCisgICAgY19idWZfY3JlYXRlX2Zyb21fbWVtLAorICAgIGNfYnVmX2Rlc3Ryb3ksCisgICAgY19idWZfbWFwLAorICAgIGNfYnVmX3VubWFwLAorICAgIGNfYnVmX3JlYWQsCisgICAgY19idWZfd3JpdGUsCisgICAgY19idWZfY29weSwKKyAgICBjX2J1Zl9nZXRfYWRkcmVzcywKKyAgICBjX2J1Zl9hZGRfcmVmLAorICAgIGNfYnVmX3JlbGVhc2VfcmVmLAorICAgIGNfYnVmX3NldF9zdGF0ZSwKKyAgICBjX2V2ZW50X3dhaXQsCisgICAgY196ZXJvX29yX25lZ19wdHJfbGVuLAorICAgIGNfemVyb19vcl9uZWdfdHJhbnNmZXJfc2l6ZSwKKyAgICBjX2JhZF9wdHJfbWVtX3JhbmdlLAorICAgIGNfZGlmZmVyZW50X3NyY19hbmRfZHN0bl9zaXplcywKKyAgICBjX3Jhbmdlc19kb250X21hdGNoLAorICAgIGNfZGVzdGluYXRpb25faXNfb3ZlciwKKyAgICBjX3NsaWNlX29mX25vbmNvbnRfYXJyYXksCisgICAgY19ub25fY29udGlndW91c19kb3BlX3ZlY3RvciwKKyAgICBjX3BvaW50ZXJfYXJyYXlfbWlzbWF0Y2gsCisgICAgY19vbXBfaW52YWxpZF9kZXZpY2VfbnVtX2VudiwKKyAgICBjX29tcF9pbnZhbGlkX2RldmljZV9udW0sCisgICAgY191bmtub3duX2JpbmFyeV90eXBlLAorICAgIGNfbXVsdGlwbGVfdGFyZ2V0X2V4ZXMsCisgICAgY19ub190YXJnZXRfZXhlLAorICAgIGNfcmVwb3J0X2hvc3QsCisgICAgY19yZXBvcnRfdGFyZ2V0LAorICAgIGNfcmVwb3J0X3RpdGxlLAorICAgIGNfcmVwb3J0X2Zyb21fZmlsZSwKKyAgICBjX3JlcG9ydF9maWxlLAorICAgIGNfcmVwb3J0X2xpbmUsCisgICAgY19yZXBvcnRfdGFnLAorICAgIGNfcmVwb3J0X3NlY29uZHMsCisgICAgY19yZXBvcnRfYnl0ZXMsCisgICAgY19yZXBvcnRfbWljLAorICAgIGNfcmVwb3J0X2NwdV90aW1lLAorICAgIGNfcmVwb3J0X2NwdV90b19taWNfZGF0YSwKKyAgICBjX3JlcG9ydF9taWNfdGltZSwKKyAgICBjX3JlcG9ydF9taWNfdG9fY3B1X2RhdGEsCisgICAgY19yZXBvcnRfdW5rbm93bl90aW1lcl9ub2RlLAorICAgIGNfcmVwb3J0X3Vua25vd25fdHJhY2Vfbm9kZSwKKyAgICBjX3JlcG9ydF9vZmZsb2FkLAorICAgIGNfcmVwb3J0X3dfdGFnLAorICAgIGNfcmVwb3J0X3N0YXRlLAorICAgIGNfcmVwb3J0X3N0YXJ0LAorICAgIGNfcmVwb3J0X2luaXQsCisgICAgY19yZXBvcnRfbG9naWNhbF9jYXJkLAorICAgIGNfcmVwb3J0X3BoeXNpY2FsX2NhcmQsCisgICAgY19yZXBvcnRfcmVnaXN0ZXIsCisgICAgY19yZXBvcnRfaW5pdF9mdW5jLAorICAgIGNfcmVwb3J0X2NyZWF0ZV9idWZfaG9zdCwKKyAgICBjX3JlcG9ydF9jcmVhdGVfYnVmX21pYywKKyAgICBjX3JlcG9ydF9zZW5kX3BvaW50ZXJfZGF0YSwKKyAgICBjX3JlcG9ydF9zZW50X3BvaW50ZXJfZGF0YSwKKyAgICBjX3JlcG9ydF9nYXRoZXJfY29weWluX2RhdGEsCisgICAgY19yZXBvcnRfY29weWluX2RhdGEsCisgICAgY19yZXBvcnRfc3RhdGVfc2lnbmFsLAorICAgIGNfcmVwb3J0X3NpZ25hbCwKKyAgICBjX3JlcG9ydF93YWl0LAorICAgIGNfcmVwb3J0X2NvbXB1dGUsCisgICAgY19yZXBvcnRfcmVjZWl2ZV9wb2ludGVyX2RhdGEsCisgICAgY19yZXBvcnRfcmVjZWl2ZWRfcG9pbnRlcl9kYXRhLAorICAgIGNfcmVwb3J0X3N0YXJ0X3RhcmdldF9mdW5jLAorICAgIGNfcmVwb3J0X3ZhciwKKyAgICBjX3JlcG9ydF9zY2F0dGVyX2NvcHlpbl9kYXRhLAorICAgIGNfcmVwb3J0X2dhdGhlcl9jb3B5b3V0X2RhdGEsCisgICAgY19yZXBvcnRfc2NhdHRlcl9jb3B5b3V0X2RhdGEsCisgICAgY19yZXBvcnRfY29weW91dF9kYXRhLAorICAgIGNfcmVwb3J0X3VucmVnaXN0ZXIsCisgICAgY19yZXBvcnRfZGVzdHJveSwKKyAgICBjX3JlcG9ydF9teW9pbml0LAorICAgIGNfcmVwb3J0X215b3JlZ2lzdGVyLAorICAgIGNfcmVwb3J0X215b2ZpbmksCisgICAgY19yZXBvcnRfbWljX215b19zaGFyZWQsCisgICAgY19yZXBvcnRfbWljX215b19mcHRyLAorICAgIGNfcmVwb3J0X215b3NoYXJlZG1hbGxvYywKKyAgICBjX3JlcG9ydF9teW9zaGFyZWRmcmVlLAorICAgIGNfcmVwb3J0X215b3NoYXJlZGFsaWduZWRtYWxsb2MsCisgICAgY19yZXBvcnRfbXlvc2hhcmVkYWxpZ25lZGZyZWUsCisgICAgY19yZXBvcnRfbXlvYWNxdWlyZSwKKyAgICBjX3JlcG9ydF9teW9yZWxlYXNlLAorICAgIGNfY29pcGlwZV9tYXhfbnVtYmVyCit9IGVycm9yX3R5cGVzOworCitlbnVtIE9mZmxvYWRIb3N0UGhhc2UgeworICAgIC8vIFRvdGFsIHRpbWUgb24gaG9zdCBmb3IgZW50aXJlIG9mZmxvYWQKKyAgICBjX29mZmxvYWRfaG9zdF90b3RhbF9vZmZsb2FkID0gMCwKKworICAgIC8vIFRpbWUgdG8gbG9hZCB0YXJnZXQgYmluYXJ5CisgICAgY19vZmZsb2FkX2hvc3RfaW5pdGlhbGl6ZSwKKworICAgIC8vIFRpbWUgdG8gYWNxdWlyZSBscmIgYXZhaWxhYmlsaXR5IGR5bmFtaWNhbGx5CisgICAgY19vZmZsb2FkX2hvc3RfdGFyZ2V0X2FjcXVpcmUsCisKKyAgICAvLyBUaW1lIHRvIHdhaXQgZm9yIGRlcGVuZGVuY2llcworICAgIGNfb2ZmbG9hZF9ob3N0X3dhaXRfZGVwcywKKworICAgIC8vIFRpbWUgdG8gYWxsb2NhdGUgcG9pbnRlciBidWZmZXJzLCBpbml0aWF0ZSB3cml0ZXMgZm9yIHBvaW50ZXJzCisgICAgLy8gYW5kIGNhbGN1bGF0ZSBzaXplIG9mIGNvcHlpbi9jb3B5b3V0IGJ1ZmZlcgorICAgIGNfb2ZmbG9hZF9ob3N0X3NldHVwX2J1ZmZlcnMsCisKKyAgICAvLyBUaW1lIHRvIGFsbG9jYXRlIHBvaW50ZXIgYnVmZmVycworICAgIGNfb2ZmbG9hZF9ob3N0X2FsbG9jX2J1ZmZlcnMsCisKKyAgICAvLyBUaW1lIHRvIGluaXRpYWxpemUgbWlzYyBkYXRhCisgICAgY19vZmZsb2FkX2hvc3Rfc2V0dXBfbWlzY19kYXRhLAorCisgICAgLy8gVGltZSB0byBhbGxvY2F0ZSBjb3B5aW4vY29weW91dCBidWZmZXIKKyAgICBjX29mZmxvYWRfaG9zdF9hbGxvY19kYXRhX2J1ZmZlciwKKworICAgIC8vIFRpbWUgdG8gaW5pdGlhdGUgd3JpdGVzIGZyb20gaG9zdCBwb2ludGVycyB0byBidWZmZXJzCisgICAgY19vZmZsb2FkX2hvc3Rfc2VuZF9wb2ludGVycywKKworICAgIC8vIFRpbWUgdG8gR2F0aGVyIElOIGRhdGEgb2Ygb2ZmbG9hZCBpbnRvIGJ1ZmZlcgorICAgIGNfb2ZmbG9hZF9ob3N0X2dhdGhlcl9pbnB1dHMsCisKKyAgICAvLyBUaW1lIHRvIG1hcCBidWZmZXIKKyAgICBjX29mZmxvYWRfaG9zdF9tYXBfaW5fZGF0YV9idWZmZXIsCisKKyAgICAvLyBUaW1lIHRvIHVubWFwIGJ1ZmZlcgorICAgIGNfb2ZmbG9hZF9ob3N0X3VubWFwX2luX2RhdGFfYnVmZmVyLAorCisgICAgLy8gVGltZSB0byBzdGFydCByZW1vdGUgZnVuY3Rpb24gY2FsbCB0aGF0IGRvZXMgY29tcHV0YXRpb24gb24gbHJiCisgICAgY19vZmZsb2FkX2hvc3Rfc3RhcnRfY29tcHV0ZSwKKworICAgIC8vIFRpbWUgdG8gd2FpdCBmb3IgY29tcHV0ZSB0byBmaW5pc2gKKyAgICBjX29mZmxvYWRfaG9zdF93YWl0X2NvbXB1dGUsCisKKyAgICAvLyBUaW1lIHRvIGluaXRpYXRlIHJlYWRzIGZyb20gcG9pbnRlciBidWZmZXJzCisgICAgY19vZmZsb2FkX2hvc3Rfc3RhcnRfYnVmZmVyc19yZWFkcywKKworICAgIC8vIFRpbWUgdG8gdXBkYXRlIGhvc3QgdmFyaWFiZWxzIHdpdGggT1VUIGRhdGEgZnJvbSBidWZmZXIKKyAgICBjX29mZmxvYWRfaG9zdF9zY2F0dGVyX291dHB1dHMsCisKKyAgICAvLyBUaW1lIHRvIG1hcCBidWZmZXIKKyAgICBjX29mZmxvYWRfaG9zdF9tYXBfb3V0X2RhdGFfYnVmZmVyLAorCisgICAgLy8gVGltZSB0byB1bm1hcCBidWZmZXIKKyAgICBjX29mZmxvYWRfaG9zdF91bm1hcF9vdXRfZGF0YV9idWZmZXIsCisKKyAgICAvLyBUaW1lIHRvIHdhaXQgcmVhZHMgZnJvbSBidWZmZXJzIHRvIGZpbmlzaAorICAgIGNfb2ZmbG9hZF9ob3N0X3dhaXRfYnVmZmVyc19yZWFkcywKKworICAgIC8vIFRpbWUgdG8gZGVzdHJveSBidWZmZXJzIHRoYXQgYXJlIG5vIGxvbmdlciBuZWVkZWQKKyAgICBjX29mZmxvYWRfaG9zdF9kZXN0cm95X2J1ZmZlcnMsCisKKyAgICAvLyBMQVNUIFRJTUUgTU9OSVRPUgorICAgIGNfb2ZmbG9hZF9ob3N0X21heF9waGFzZQorfTsKKworZW51bSBPZmZsb2FkVGFyZ2V0UGhhc2UgeworICAgIC8vIFRvdGFsIHRpbWUgc3BlbnQgb24gdGhlIHRhcmdldAorICAgIGNfb2ZmbG9hZF90YXJnZXRfdG90YWxfdGltZSA9IDAsCisKKyAgICAvLyBUaW1lIHRvIGluaXRpYWxpemUgb2ZmbG9hZCBkZXNjcmlwdG9yCisgICAgY19vZmZsb2FkX3RhcmdldF9kZXNjcmlwdG9yX3NldHVwLAorCisgICAgLy8gVGltZSB0byBmaW5kIHRhcmdldCBlbnRyeSBwb2ludCBpbiBsb29rdXAgdGFibGUKKyAgICBjX29mZmxvYWRfdGFyZ2V0X2Z1bmNfbG9va3VwLAorCisgICAgLy8gVG90YWwgdGltZSBzcGVuZCBleGVjdXRpbmcgb2ZmbG9hZCBlbnRyeQorICAgIGNfb2ZmbG9hZF90YXJnZXRfZnVuY190aW1lLAorCisgICAgLy8gVGltZSB0byBpbml0aWFsaXplIHRhcmdldCB2YXJpYWJsZXMgd2l0aCBJTiB2YWx1ZXMgZnJvbSBidWZmZXIKKyAgICBjX29mZmxvYWRfdGFyZ2V0X3NjYXR0ZXJfaW5wdXRzLAorCisgICAgLy8gVGltZSB0byBhZGQgYnVmZmVyIHJlZmVyZW5jZSBmb3IgcG9pbnRlciBidWZmZXJzCisgICAgY19vZmZsb2FkX3RhcmdldF9hZGRfYnVmZmVyX3JlZnMsCisKKyAgICAvLyBUb3RhbCB0aW1lIG9uIGxyYiBmb3IgY29tcHV0YXRpb24KKyAgICBjX29mZmxvYWRfdGFyZ2V0X2NvbXB1dGUsCisKKyAgICAvLyBPbiBscmIsIHRpbWUgdG8gY29weSBPVVQgaW50byBidWZmZXIKKyAgICBjX29mZmxvYWRfdGFyZ2V0X2dhdGhlcl9vdXRwdXRzLAorCisgICAgLy8gVGltZSB0byByZWxlYXNlIGJ1ZmZlciByZWZlcmVuY2VzCisgICAgY19vZmZsb2FkX3RhcmdldF9yZWxlYXNlX2J1ZmZlcl9yZWZzLAorCisgICAgLy8gTEFTVCBUSU1FIE1PTklUT1IKKyAgICBjX29mZmxvYWRfdGFyZ2V0X21heF9waGFzZQorfTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgordm9pZCBfX2xpYm9mZmxvYWRfZXJyb3Jfc3VwcG9ydChlcnJvcl90eXBlcyBpbnB1dF90YWcsIC4uLik7Cit2b2lkIF9fbGlib2ZmbG9hZF9yZXBvcnRfc3VwcG9ydChlcnJvcl90eXBlcyBpbnB1dF90YWcsIC4uLik7CitjaGFyIGNvbnN0ICpvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihpbnQgbXNnQ29kZSk7CitjaGFyIGNvbnN0ICogcmVwb3J0X2dldF9tZXNzYWdlX3N0cihlcnJvcl90eXBlcyBpbnB1dF90YWcpOworY2hhciBjb25zdCAqIHJlcG9ydF9nZXRfaG9zdF9zdGFnZV9zdHIoaW50IGkpOworY2hhciBjb25zdCAqIHJlcG9ydF9nZXRfdGFyZ2V0X3N0YWdlX3N0cihpbnQgaSk7CisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZGVmaW5lIHRlc3RfbXNnX2NhdChubSwgbXNnKSBcCisgICAgZnByaW50ZihzdGRlcnIsICJcdCBURVNUIGZvciAlcyBcbiBcdCIsIG5tKTsgXAorICAgIF9fbGlib2ZmbG9hZF9lcnJvcl9zdXBwb3J0KG1zZyk7CisKKyNkZWZpbmUgdGVzdF9tc2dfY2F0MShubSwgbXNnLCAuLi4pIFwKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlx0IFRFU1QgZm9yICVzIFxuIFx0Iiwgbm0pOyBcCisgICAgX19saWJvZmZsb2FkX2Vycm9yX3N1cHBvcnQobXNnLCBfX1ZBX0FSR1NfXyk7CisKK3ZvaWQgd3JpdGVfbWVzc2FnZShGSUxFICogZmlsZSwgaW50IG1zZ0NvZGUsIHZhX2xpc3QgYXJnc19wKTsKKworI2RlZmluZSBMSUJPRkZMT0FEX0VSUk9SIF9fbGlib2ZmbG9hZF9lcnJvcl9zdXBwb3J0CisKKyNpZmRlZiBUQVJHRVRfV0lOTlQKKyNkZWZpbmUgTElCT0ZGTE9BRF9BQk9SVCBcCisgICAgICAgICBfc2V0X2Fib3J0X2JlaGF2aW9yKDAsIF9XUklURV9BQk9SVF9NU0cpOyBcCisgICAgICAgICBhYm9ydCgpCisjZWxzZQorI2RlZmluZSBMSUJPRkZMT0FEX0FCT1JUIFwKKyAgICAgICAgIGFib3J0KCkKKyNlbmRpZgorCisjZW5kaWYgLy8gIWRlZmluZWQoTElCT0ZGTE9BRF9FUlJPUl9DT0RFU19IKQpkaWZmIC0tZ2l0IGEvZmluYWwvb2ZmbG9hZC9zcmMvbGlib2ZmbG9hZF9tc2cuYyBiL2ZpbmFsL29mZmxvYWQvc3JjL2xpYm9mZmxvYWRfbXNnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE2MDM5MgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvc3JjL2xpYm9mZmxvYWRfbXNnLmMKQEAgLTAsMCArMSwzNSBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEJyaW5nIGluIHRoZSBzdGF0aWMgc3RyaW5nIHRhYmxlIGFuZCB0aGUgZW51bWVyYXRpb25zIGZvciBpbmRleGluZyBpbnRvCisvLyBpdC4KKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjaW5jbHVkZSAibGlib2ZmbG9hZF9tc2cuaCIKKworIyBkZWZpbmUgRFlOQVJUX1NUREVSUl9QVVRTKF9fbWVzc2FnZV90ZXh0X18pIGZwdXRzKChfX21lc3NhZ2VfdGV4dF9fKSxzdGRlcnIpCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gTm93IHRoZSBjb2RlIGZvciBhY2Nlc3NpbmcgdGhlIG1lc3NhZ2UgY2F0YWxvZ3MKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisKKyAgICB2b2lkIHdyaXRlX21lc3NhZ2UoRklMRSAqIGZpbGUsIGludCBtc2dDb2RlKSB7CisgICAgICAgIGZwdXRzKE1FU1NBR0VfVEFCTEVfTkFNRVsgbXNnQ29kZSBdLCBmaWxlKTsKKyAgICAgICAgZmZsdXNoKGZpbGUpOworICAgIH0KKworICAgIGNoYXIgY29uc3QgKm9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKGludCBtc2dDb2RlKSB7CisgICAgICAgIHJldHVybiBNRVNTQUdFX1RBQkxFX05BTUVbIG1zZ0NvZGUgXTsKKyAgICB9CmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL3NyYy9saWJvZmZsb2FkX21zZy5oIGIvZmluYWwvb2ZmbG9hZC9zcmMvbGlib2ZmbG9hZF9tc2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTQ0NWY5Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9zcmMvbGlib2ZmbG9hZF9tc2cuaApAQCAtMCwwICsxLDMyNiBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8gZmlsZTogbGlib2ZmbG9hZF9tc2cuaAorZW51bSB7CisJX19kdW1teV9fID0gMCwKKwltc2dfY19kZXZpY2VfaXNfbm90X2F2YWlsYWJsZSwKKwltc2dfY19pbnZhbGlkX2RldmljZV9udW1iZXIsCisJbXNnX2Nfc2VuZF9mdW5jX3B0ciwKKwltc2dfY19yZWNlaXZlX2Z1bmNfcHRyLAorCW1zZ19jX29mZmxvYWRfbWFsbG9jLAorCW1zZ19jX29mZmxvYWQxLAorCW1zZ19jX3Vua25vd25fdmFyX3R5cGUsCisJbXNnX2NfaW52YWxpZF9lbnZfdmFyX3ZhbHVlLAorCW1zZ19jX2ludmFsaWRfZW52X3Zhcl9pbnRfdmFsdWUsCisJbXNnX2NfaW52YWxpZF9lbnZfcmVwb3J0X3ZhbHVlLAorCW1zZ19jX29mZmxvYWRfc2lnbmFsZWQxLAorCW1zZ19jX29mZmxvYWRfc2lnbmFsZWQyLAorCW1zZ19jX215b3dyYXBwZXJfY2hlY2tyZXN1bHQsCisJbXNnX2NfbXlvdGFyZ2V0X2NoZWNrcmVzdWx0LAorCW1zZ19jX29mZmxvYWRfZGVzY3JpcHRvcl9vZmZsb2FkLAorCW1zZ19jX21lcmdlX3Zhcl9kZXNjczEsCisJbXNnX2NfbWVyZ2VfdmFyX2Rlc2NzMiwKKwltc2dfY19taWNfcGFyc2VfZW52X3Zhcl9saXN0MSwKKwltc2dfY19taWNfcGFyc2VfZW52X3Zhcl9saXN0MiwKKwltc2dfY19taWNfcHJvY2Vzc19leGl0X3JldCwKKwltc2dfY19taWNfcHJvY2Vzc19leGl0X3NpZywKKwltc2dfY19taWNfcHJvY2Vzc19leGl0LAorCW1zZ19jX21pY19pbml0MywKKwltc2dfY19taWNfaW5pdDQsCisJbXNnX2NfbWljX2luaXQ1LAorCW1zZ19jX21pY19pbml0NiwKKwltc2dfY19ub19zdGF0aWNfdmFyX2RhdGEsCisJbXNnX2Nfbm9fcHRyX2RhdGEsCisJbXNnX2NfZ2V0X2VuZ2luZV9oYW5kbGUsCisJbXNnX2NfZ2V0X2VuZ2luZV9pbmRleCwKKwltc2dfY19wcm9jZXNzX2NyZWF0ZSwKKwltc2dfY19wcm9jZXNzX2dldF9mdW5jX2hhbmRsZXMsCisJbXNnX2NfcHJvY2Vzc193YWl0X3NodXRkb3duLAorCW1zZ19jX3Byb2Nlc3NfcHJveHlfZmx1c2gsCisJbXNnX2NfbG9hZF9saWJyYXJ5LAorCW1zZ19jX3BpcGVsaW5lX2NyZWF0ZSwKKwltc2dfY19waXBlbGluZV9ydW5fZnVuYywKKwltc2dfY19waXBlbGluZV9zdGFydF9ydW5fZnVuY3MsCisJbXNnX2NfYnVmX2NyZWF0ZSwKKwltc2dfY19idWZfY3JlYXRlX291dF9vZl9tZW0sCisJbXNnX2NfYnVmX2NyZWF0ZV9mcm9tX21lbSwKKwltc2dfY19idWZfZGVzdHJveSwKKwltc2dfY19idWZfbWFwLAorCW1zZ19jX2J1Zl91bm1hcCwKKwltc2dfY19idWZfcmVhZCwKKwltc2dfY19idWZfd3JpdGUsCisJbXNnX2NfYnVmX2NvcHksCisJbXNnX2NfYnVmX2dldF9hZGRyZXNzLAorCW1zZ19jX2J1Zl9hZGRfcmVmLAorCW1zZ19jX2J1Zl9yZWxlYXNlX3JlZiwKKwltc2dfY19idWZfc2V0X3N0YXRlLAorCW1zZ19jX2V2ZW50X3dhaXQsCisJbXNnX2NfemVyb19vcl9uZWdfcHRyX2xlbiwKKwltc2dfY196ZXJvX29yX25lZ190cmFuc2Zlcl9zaXplLAorCW1zZ19jX2JhZF9wdHJfbWVtX3JhbmdlLAorCW1zZ19jX2RpZmZlcmVudF9zcmNfYW5kX2RzdG5fc2l6ZXMsCisJbXNnX2Nfbm9uX2NvbnRpZ3VvdXNfZG9wZV92ZWN0b3IsCisJbXNnX2Nfb21wX2ludmFsaWRfZGV2aWNlX251bV9lbnYsCisJbXNnX2Nfb21wX2ludmFsaWRfZGV2aWNlX251bSwKKwltc2dfY191bmtub3duX2JpbmFyeV90eXBlLAorCW1zZ19jX211bHRpcGxlX3RhcmdldF9leGVzLAorCW1zZ19jX25vX3RhcmdldF9leGUsCisJbXNnX2NfcmVwb3J0X3Vua25vd25fdGltZXJfbm9kZSwKKwltc2dfY19yZXBvcnRfdW5rbm93bl90cmFjZV9ub2RlLAorCW1zZ19jX3JlcG9ydF9ob3N0LAorCW1zZ19jX3JlcG9ydF9taWMsCisJbXNnX2NfcmVwb3J0X3RpdGxlLAorCW1zZ19jX3JlcG9ydF9zZWNvbmRzLAorCW1zZ19jX3JlcG9ydF9ieXRlcywKKwltc2dfY19yZXBvcnRfY3B1X3RpbWUsCisJbXNnX2NfcmVwb3J0X21pY190aW1lLAorCW1zZ19jX3JlcG9ydF90YWcsCisJbXNnX2NfcmVwb3J0X2Zyb21fZmlsZSwKKwltc2dfY19yZXBvcnRfZmlsZSwKKwltc2dfY19yZXBvcnRfbGluZSwKKwltc2dfY19yZXBvcnRfY3B1X3RvX21pY19kYXRhLAorCW1zZ19jX3JlcG9ydF9taWNfdG9fY3B1X2RhdGEsCisJbXNnX2NfcmVwb3J0X29mZmxvYWQsCisJbXNnX2NfcmVwb3J0X3dfdGFnLAorCW1zZ19jX3JlcG9ydF9zdGF0ZSwKKwltc2dfY19yZXBvcnRfc3RhcnQsCisJbXNnX2NfcmVwb3J0X2luaXQsCisJbXNnX2NfcmVwb3J0X2xvZ2ljYWxfY2FyZCwKKwltc2dfY19yZXBvcnRfcGh5c2ljYWxfY2FyZCwKKwltc2dfY19yZXBvcnRfcmVnaXN0ZXIsCisJbXNnX2NfcmVwb3J0X2luaXRfZnVuYywKKwltc2dfY19yZXBvcnRfY3JlYXRlX2J1Zl9ob3N0LAorCW1zZ19jX3JlcG9ydF9jcmVhdGVfYnVmX21pYywKKwltc2dfY19yZXBvcnRfc2VuZF9wb2ludGVyX2RhdGEsCisJbXNnX2NfcmVwb3J0X3NlbnRfcG9pbnRlcl9kYXRhLAorCW1zZ19jX3JlcG9ydF9nYXRoZXJfY29weWluX2RhdGEsCisJbXNnX2NfcmVwb3J0X2NvcHlpbl9kYXRhLAorCW1zZ19jX3JlcG9ydF9zdGF0ZV9zaWduYWwsCisJbXNnX2NfcmVwb3J0X3NpZ25hbCwKKwltc2dfY19yZXBvcnRfd2FpdCwKKwltc2dfY19yZXBvcnRfY29tcHV0ZSwKKwltc2dfY19yZXBvcnRfcmVjZWl2ZV9wb2ludGVyX2RhdGEsCisJbXNnX2NfcmVwb3J0X3JlY2VpdmVkX3BvaW50ZXJfZGF0YSwKKwltc2dfY19yZXBvcnRfc3RhcnRfdGFyZ2V0X2Z1bmMsCisJbXNnX2NfcmVwb3J0X3ZhciwKKwltc2dfY19yZXBvcnRfc2NhdHRlcl9jb3B5aW5fZGF0YSwKKwltc2dfY19yZXBvcnRfZ2F0aGVyX2NvcHlvdXRfZGF0YSwKKwltc2dfY19yZXBvcnRfc2NhdHRlcl9jb3B5b3V0X2RhdGEsCisJbXNnX2NfcmVwb3J0X2NvcHlvdXRfZGF0YSwKKwltc2dfY19yZXBvcnRfdW5yZWdpc3RlciwKKwltc2dfY19yZXBvcnRfZGVzdHJveSwKKwltc2dfY19yZXBvcnRfbXlvaW5pdCwKKwltc2dfY19yZXBvcnRfbXlvcmVnaXN0ZXIsCisJbXNnX2NfcmVwb3J0X215b2ZpbmksCisJbXNnX2NfcmVwb3J0X21pY19teW9fc2hhcmVkLAorCW1zZ19jX3JlcG9ydF9taWNfbXlvX2ZwdHIsCisJbXNnX2NfcmVwb3J0X215b3NoYXJlZG1hbGxvYywKKwltc2dfY19yZXBvcnRfbXlvc2hhcmVkZnJlZSwKKwltc2dfY19yZXBvcnRfbXlvc2hhcmVkYWxpZ25lZG1hbGxvYywKKwltc2dfY19yZXBvcnRfbXlvc2hhcmVkYWxpZ25lZGZyZWUsCisJbXNnX2NfcmVwb3J0X215b2FjcXVpcmUsCisJbXNnX2NfcmVwb3J0X215b3JlbGVhc2UsCisJbXNnX2NfcmVwb3J0X2hvc3RfdG90YWxfb2ZmbG9hZF90aW1lLAorCW1zZ19jX3JlcG9ydF9ob3N0X2luaXRpYWxpemUsCisJbXNnX2NfcmVwb3J0X2hvc3RfdGFyZ2V0X2FjcXVpcmUsCisJbXNnX2NfcmVwb3J0X2hvc3Rfd2FpdF9kZXBzLAorCW1zZ19jX3JlcG9ydF9ob3N0X3NldHVwX2J1ZmZlcnMsCisJbXNnX2NfcmVwb3J0X2hvc3RfYWxsb2NfYnVmZmVycywKKwltc2dfY19yZXBvcnRfaG9zdF9zZXR1cF9taXNjX2RhdGEsCisJbXNnX2NfcmVwb3J0X2hvc3RfYWxsb2NfZGF0YV9idWZmZXIsCisJbXNnX2NfcmVwb3J0X2hvc3Rfc2VuZF9wb2ludGVycywKKwltc2dfY19yZXBvcnRfaG9zdF9nYXRoZXJfaW5wdXRzLAorCW1zZ19jX3JlcG9ydF9ob3N0X21hcF9pbl9kYXRhX2J1ZmZlciwKKwltc2dfY19yZXBvcnRfaG9zdF91bm1hcF9pbl9kYXRhX2J1ZmZlciwKKwltc2dfY19yZXBvcnRfaG9zdF9zdGFydF9jb21wdXRlLAorCW1zZ19jX3JlcG9ydF9ob3N0X3dhaXRfY29tcHV0ZSwKKwltc2dfY19yZXBvcnRfaG9zdF9zdGFydF9idWZmZXJzX3JlYWRzLAorCW1zZ19jX3JlcG9ydF9ob3N0X3NjYXR0ZXJfb3V0cHV0cywKKwltc2dfY19yZXBvcnRfaG9zdF9tYXBfb3V0X2RhdGFfYnVmZmVyLAorCW1zZ19jX3JlcG9ydF9ob3N0X3VubWFwX291dF9kYXRhX2J1ZmZlciwKKwltc2dfY19yZXBvcnRfaG9zdF93YWl0X2J1ZmZlcnNfcmVhZHMsCisJbXNnX2NfcmVwb3J0X2hvc3RfZGVzdHJveV9idWZmZXJzLAorCW1zZ19jX3JlcG9ydF90YXJnZXRfdG90YWxfdGltZSwKKwltc2dfY19yZXBvcnRfdGFyZ2V0X2Rlc2NyaXB0b3Jfc2V0dXAsCisJbXNnX2NfcmVwb3J0X3RhcmdldF9mdW5jX2xvb2t1cCwKKwltc2dfY19yZXBvcnRfdGFyZ2V0X2Z1bmNfdGltZSwKKwltc2dfY19yZXBvcnRfdGFyZ2V0X3NjYXR0ZXJfaW5wdXRzLAorCW1zZ19jX3JlcG9ydF90YXJnZXRfYWRkX2J1ZmZlcl9yZWZzLAorCW1zZ19jX3JlcG9ydF90YXJnZXRfY29tcHV0ZSwKKwltc2dfY19yZXBvcnRfdGFyZ2V0X2dhdGhlcl9vdXRwdXRzLAorCW1zZ19jX3JlcG9ydF90YXJnZXRfcmVsZWFzZV9idWZmZXJfcmVmcywKKwltc2dfY19jb2lfcGlwZWxpbmVfbWF4X251bWJlciwKKwltc2dfY19yYW5nZXNfZG9udF9tYXRjaCwKKwltc2dfY19kZXN0aW5hdGlvbl9pc19vdmVyLAorCW1zZ19jX3NsaWNlX29mX25vbmNvbnRfYXJyYXksCisJbXNnX2NfcG9pbnRlcl9hcnJheV9taXNtYXRjaCwKKwlsYXN0TXNnID0gMTUyLAorCWZpcnN0TXNnID0gMQorfTsKKworCisjaWYgIWRlZmluZWQoTUVTU0FHRV9UQUJMRV9OQU1FKQorIyAgICBkZWZpbmUgTUVTU0FHRV9UQUJMRV9OQU1FIF9fbGlib2ZmbG9hZF9tZXNzYWdlX3RhYmxlCisjZW5kaWYKKworc3RhdGljIGNoYXIgY29uc3QgKiBNRVNTQUdFX1RBQkxFX05BTUVbXSA9IHsKKwkvKiAgIDAgX19kdW1teV9fICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICJVbi11c2VkIG1lc3NhZ2UiLAorCS8qICAgMSBtc2dfY19kZXZpY2VfaXNfbm90X2F2YWlsYWJsZSAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGNhbm5vdCBvZmZsb2FkIHRvIE1JQyAtIGRldmljZSBpcyBub3QgYXZhaWxhYmxlIiwKKwkvKiAgIDIgbXNnX2NfaW52YWxpZF9kZXZpY2VfbnVtYmVyICAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiBleHBlY3RlZCBhIG51bWJlciBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gLTEiLAorCS8qICAgMyBtc2dfY19zZW5kX2Z1bmNfcHRyICAgICAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGNhbm5vdCBmaW5kIGZ1bmN0aW9uIG5hbWUgZm9yIGFkZHJlc3MgJXAiLAorCS8qICAgNCBtc2dfY19yZWNlaXZlX2Z1bmNfcHRyICAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGNhbm5vdCBmaW5kIGFkZHJlc3Mgb2YgZnVuY3Rpb24gJXMiLAorCS8qICAgNSBtc2dfY19vZmZsb2FkX21hbGxvYyAgICAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCAocmVxdWVzdGVkPSVsbGQgYnl0ZXMsIGFsaWduICVsbGQpIiwKKwkvKiAgIDYgbXNnX2Nfb2ZmbG9hZDEgICAgICAgICAgICAgICAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiBkZXZpY2UgJWQgZG9lcyBub3QgaGF2ZSBhIHBlbmRpbmcgc2lnbmFsIGZvciB3YWl0KCVwKSIsCisJLyogICA3IG1zZ19jX3Vua25vd25fdmFyX3R5cGUgICAgICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogdW5rbm93biB2YXJpYWJsZSB0eXBlICVkIiwKKwkvKiAgIDggbXNnX2NfaW52YWxpZF9lbnZfdmFyX3ZhbHVlICAgICAgICAgICAgICovICJvZmZsb2FkIHdhcm5pbmc6IGlnbm9yaW5nIGludmFsaWQgdmFsdWUgc3BlY2lmaWVkIGZvciAlcyIsCisJLyogICA5IG1zZ19jX2ludmFsaWRfZW52X3Zhcl9pbnRfdmFsdWUgICAgICAgICAqLyAib2ZmbG9hZCB3YXJuaW5nOiBzcGVjaWZ5IGFuIGludGVnZXIgdmFsdWUgZm9yICVzIiwKKwkvKiAgMTAgbXNnX2NfaW52YWxpZF9lbnZfcmVwb3J0X3ZhbHVlICAgICAgICAgICovICJvZmZsb2FkIHdhcm5pbmc6IGlnbm9yaW5nICVzIHNldHRpbmc7IHVzZSBhIHZhbHVlIGluIHJhbmdlIDEtMyIsCisJLyogIDExIG1zZ19jX29mZmxvYWRfc2lnbmFsZWQxICAgICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogaW52YWxpZCBkZXZpY2UgbnVtYmVyICVkIHNwZWNpZmllZCBpbiBfT2ZmbG9hZF9zaWduYWxlZCIsCisJLyogIDEyIG1zZ19jX29mZmxvYWRfc2lnbmFsZWQyICAgICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogaW52YWxpZCBzaWduYWwgJXAgc3BlY2lmaWVkIGZvciBfT2ZmbG9hZF9zaWduYWxlZCIsCisJLyogIDEzIG1zZ19jX215b3dyYXBwZXJfY2hlY2tyZXN1bHQgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogJXMgZmFpbGVkIHdpdGggZXJyb3IgJWQiLAorCS8qICAxNCBtc2dfY19teW90YXJnZXRfY2hlY2tyZXN1bHQgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6ICVzIGZhaWxlZCB3aXRoIGVycm9yICVkIiwKKwkvKiAgMTUgbXNnX2Nfb2ZmbG9hZF9kZXNjcmlwdG9yX29mZmxvYWQgICAgICAgICovICJvZmZsb2FkIGVycm9yOiBjYW5ub3QgZmluZCBvZmZsb2FkIGVudHJ5ICVzIiwKKwkvKiAgMTYgbXNnX2NfbWVyZ2VfdmFyX2Rlc2NzMSAgICAgICAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiB1bmV4cGVjdGVkIG51bWJlciBvZiB2YXJpYWJsZSBkZXNjcmlwdG9ycyIsCisJLyogIDE3IG1zZ19jX21lcmdlX3Zhcl9kZXNjczIgICAgICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogdW5leHBlY3RlZCB2YXJpYWJsZSB0eXBlIiwKKwkvKiAgMTggbXNnX2NfbWljX3BhcnNlX2Vudl92YXJfbGlzdDEgICAgICAgICAgICovICJvZmZsb2FkX2Vycm9yOiBNSUMgZW52aXJvbm1lbnQgdmFyaWFibGUgbXVzdCBiZWdpbiB3aXRoIGFuIGFscGFiZXRpYyBjaGFyYWN0ZXIiLAorCS8qICAxOSBtc2dfY19taWNfcGFyc2VfZW52X3Zhcl9saXN0MiAgICAgICAgICAgKi8gIm9mZmxvYWRfZXJyb3I6IE1JQyBlbnZpcm9ubWVudCB2YXJpYWJsZSB2YWx1ZSBtdXN0IGJlIHNwZWNpZmllZCB3aXRoIJE9kiIsCisJLyogIDIwIG1zZ19jX21pY19wcm9jZXNzX2V4aXRfcmV0ICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogcHJvY2VzcyBvbiB0aGUgZGV2aWNlICVkIHVuZXhwZWN0ZWRseSBleGl0ZWQgd2l0aCBjb2RlICVkIiwKKwkvKiAgMjEgbXNnX2NfbWljX3Byb2Nlc3NfZXhpdF9zaWcgICAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiBwcm9jZXNzIG9uIHRoZSBkZXZpY2UgJWQgd2FzIHRlcm1pbmF0ZWQgYnkgc2lnbmFsICVkICglcykiLAorCS8qICAyMiBtc2dfY19taWNfcHJvY2Vzc19leGl0ICAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IHByb2Nlc3Mgb24gdGhlIGRldmljZSAlZCB3YXMgdW5leHBlY3RlZGx5IHRlcm1pbmF0ZWQiLAorCS8qICAyMyBtc2dfY19taWNfaW5pdDMgICAgICAgICAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgd2FybmluZzogaWdub3JpbmcgTUlDX1NUQUNLU0laRSBzZXR0aW5nOyB1c2UgYSB2YWx1ZSA+PSAxNksgYW5kIGEgbXVsdGlwbGUgb2YgNEsiLAorCS8qICAyNCBtc2dfY19taWNfaW5pdDQgICAgICAgICAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IHRocmVhZCBrZXkgY3JlYXRlIGZhaWxlZCB3aXRoIGVycm9yICVkIiwKKwkvKiAgMjUgbXNnX2NfbWljX2luaXQ1ICAgICAgICAgICAgICAgICAgICAgICAgICovICJvZmZsb2FkIHdhcm5pbmc6IHNwZWNpZnkgT0ZGTE9BRF9ERVZJQ0VTIGFzIGNvbW1hLXNlcGFyYXRlZCBwaHlzaWNhbCBkZXZpY2UgbnVtYmVycyBvciAnbm9uZSciLAorCS8qICAyNiBtc2dfY19taWNfaW5pdDYgICAgICAgICAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgd2FybmluZzogT0ZGTE9BRF9ERVZJQ0VTIGRldmljZSBudW1iZXIgJWQgZG9lcyBub3QgY29ycmVzcG9uZCB0byBhIHBoeXNpY2FsIGRldmljZSIsCisJLyogIDI3IG1zZ19jX25vX3N0YXRpY192YXJfZGF0YSAgICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogY2Fubm90IGZpbmQgZGF0YSBhc3NvY2lhdGVkIHdpdGggc3RhdGljYWxseSBhbGxvY2F0ZWQgdmFyaWFibGUgJXAiLAorCS8qICAyOCBtc2dfY19ub19wdHJfZGF0YSAgICAgICAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGNhbm5vdCBmaW5kIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHBvaW50ZXIgdmFyaWFibGUgJXAiLAorCS8qICAyOSBtc2dfY19nZXRfZW5naW5lX2hhbmRsZSAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGNhbm5vdCBnZXQgZGV2aWNlICVkIGhhbmRsZSAoZXJyb3IgY29kZSAlZCkiLAorCS8qICAzMCBtc2dfY19nZXRfZW5naW5lX2luZGV4ICAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGNhbm5vdCBnZXQgcGh5c2ljYWwgaW5kZXggZm9yIGxvZ2ljYWwgZGV2aWNlICVkIChlcnJvciBjb2RlICVkKSIsCisJLyogIDMxIG1zZ19jX3Byb2Nlc3NfY3JlYXRlICAgICAgICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogY2Fubm90IHN0YXJ0IHByb2Nlc3Mgb24gdGhlIGRldmljZSAlZCAoZXJyb3IgY29kZSAlZCkiLAorCS8qICAzMiBtc2dfY19wcm9jZXNzX2dldF9mdW5jX2hhbmRsZXMgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGNhbm5vdCBnZXQgZnVuY3Rpb24gaGFuZGxlcyBvbiB0aGUgZGV2aWNlICVkIChlcnJvciBjb2RlICVkKSIsCisJLyogIDMzIG1zZ19jX3Byb2Nlc3Nfd2FpdF9zaHV0ZG93biAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogd2FpdCBmb3IgcHJvY2VzcyBzaHV0ZG93biBmYWlsZWQgb24gZGV2aWNlICVkIChlcnJvciBjb2RlICVkKSIsCisJLyogIDM0IG1zZ19jX3Byb2Nlc3NfcHJveHlfZmx1c2ggICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogY2Fubm90IGZsdXNoIHByb2Nlc3Mgb3V0cHV0IG9uIGRldmljZSAlZCAoZXJyb3IgY29kZSAlZCkiLAorCS8qICAzNSBtc2dfY19sb2FkX2xpYnJhcnkgICAgICAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGNhbm5vdCBsb2FkIGxpYnJhcnkgdG8gdGhlIGRldmljZSAlZCAoZXJyb3IgY29kZSAlZCkiLAorCS8qICAzNiBtc2dfY19waXBlbGluZV9jcmVhdGUgICAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGNhbm5vdCBjcmVhdGUgcGlwZWxpbmUgb24gdGhlIGRldmljZSAlZCAoZXJyb3IgY29kZSAlZCkiLAorCS8qICAzNyBtc2dfY19waXBlbGluZV9ydW5fZnVuYyAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGNhbm5vdCBleGVjdXRlIGZ1bmN0aW9uIG9uIHRoZSBkZXZpY2UgJWQgKGVycm9yIGNvZGUgJWQpIiwKKwkvKiAgMzggbXNnX2NfcGlwZWxpbmVfc3RhcnRfcnVuX2Z1bmNzICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiBjYW5ub3Qgc3RhcnQgZXhlY3V0aW5nIHBpcGVsaW5lIGZ1bmN0aW9uIG9uIHRoZSBkZXZpY2UgJWQgKGVycm9yIGNvZGUgJWQpIiwKKwkvKiAgMzkgbXNnX2NfYnVmX2NyZWF0ZSAgICAgICAgICAgICAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiBjYW5ub3QgY3JlYXRlIGJ1ZmZlciBvbiBkZXZpY2UgJWQgKGVycm9yIGNvZGUgJWQpIiwKKwkvKiAgNDAgbXNnX2NfYnVmX2NyZWF0ZV9vdXRfb2ZfbWVtICAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiBjYW5ub3QgY3JlYXRlIGJ1ZmZlciBvbiBkZXZpY2UgJWQsIG91dCBvZiBtZW1vcnkiLAorCS8qICA0MSBtc2dfY19idWZfY3JlYXRlX2Zyb21fbWVtICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGNhbm5vdCBjcmVhdGUgYnVmZmVyIGZyb20gbWVtb3J5IG9uIGRldmljZSAlZCAoZXJyb3IgY29kZSAlZCkiLAorCS8qICA0MiBtc2dfY19idWZfZGVzdHJveSAgICAgICAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGJ1ZmZlciBkZXN0cm95IGZhaWxlZCAoZXJyb3IgY29kZSAlZCkiLAorCS8qICA0MyBtc2dfY19idWZfbWFwICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGJ1ZmZlciBtYXAgZmFpbGVkIChlcnJvciBjb2RlICVkKSIsCisJLyogIDQ0IG1zZ19jX2J1Zl91bm1hcCAgICAgICAgICAgICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogYnVmZmVyIHVubWFwIGZhaWxlZCAoZXJyb3IgY29kZSAlZCkiLAorCS8qICA0NSBtc2dfY19idWZfcmVhZCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGJ1ZmZlciByZWFkIGZhaWxlZCAoZXJyb3IgY29kZSAlZCkiLAorCS8qICA0NiBtc2dfY19idWZfd3JpdGUgICAgICAgICAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGJ1ZmZlciB3cml0ZSBmYWlsZWQgKGVycm9yIGNvZGUgJWQpIiwKKwkvKiAgNDcgbXNnX2NfYnVmX2NvcHkgICAgICAgICAgICAgICAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiBidWZmZXIgY29weSBmYWlsZWQgKGVycm9yIGNvZGUgJWQpIiwKKwkvKiAgNDggbXNnX2NfYnVmX2dldF9hZGRyZXNzICAgICAgICAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiBjYW5ub3QgZ2V0IGJ1ZmZlciBhZGRyZXNzIG9uIGRldmljZSAlZCAoZXJyb3IgY29kZSAlZCkiLAorCS8qICA0OSBtc2dfY19idWZfYWRkX3JlZiAgICAgICAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGNhbm5vdCByZXVzZSBidWZmZXIgbWVtb3J5IG9uIGRldmljZSAlZCAoZXJyb3IgY29kZSAlZCkiLAorCS8qICA1MCBtc2dfY19idWZfcmVsZWFzZV9yZWYgICAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGNhbm5vdCByZWxlYXNlIGJ1ZmZlciBtZW1vcnkgb24gZGV2aWNlICVkIChlcnJvciBjb2RlICVkKSIsCisJLyogIDUxIG1zZ19jX2J1Zl9zZXRfc3RhdGUgICAgICAgICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogYnVmZmVyIHNldCBzdGF0ZSBmYWlsZWQgKGVycm9yIGNvZGUgJWQpIiwKKwkvKiAgNTIgbXNnX2NfZXZlbnRfd2FpdCAgICAgICAgICAgICAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiB3YWl0IGZvciBldmVudCB0byBiZWNvbWUgc2lnbmFsZWQgZmFpbGVkIChlcnJvciBjb2RlICVkKSIsCisJLyogIDUzIG1zZ19jX3plcm9fb3JfbmVnX3B0cl9sZW4gICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogbWVtb3J5IGFsbG9jYXRpb24gb2YgbmVnYXRpdmUgbGVuZ3RoIGlzIG5vdCBzdXBwb3J0ZWQiLAorCS8qICA1NCBtc2dfY196ZXJvX29yX25lZ190cmFuc2Zlcl9zaXplICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGRhdGEgdHJhbnNmZXIgb2YgemVybyBvciBuZWdhdGl2ZSBzaXplIGlzIG5vdCBzdXBwb3J0ZWQiLAorCS8qICA1NSBtc2dfY19iYWRfcHRyX21lbV9yYW5nZSAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGFkZHJlc3MgcmFuZ2UgcGFydGlhbGx5IG92ZXJsYXBzIHdpdGggZXhpc3RpbmcgYWxsb2NhdGlvbiIsCisJLyogIDU2IG1zZ19jX2RpZmZlcmVudF9zcmNfYW5kX2RzdG5fc2l6ZXMgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogc2l6ZSBvZiB0aGUgc291cmNlICVkIGRpZmZlcnMgZnJvbSBzaXplIG9mIHRoZSBkZXN0aW5hdGlvbiAlZCIsCisJLyogIDU3IG1zZ19jX25vbl9jb250aWd1b3VzX2RvcGVfdmVjdG9yICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogb2ZmbG9hZCBkYXRhIHRyYW5zZmVyIHN1cHBvcnRzIG9ubHkgYSBzaW5nbGUgY29udGlndW91cyBtZW1vcnkgcmFuZ2UgcGVyIHZhcmlhYmxlIiwKKwkvKiAgNTggbXNnX2Nfb21wX2ludmFsaWRfZGV2aWNlX251bV9lbnYgICAgICAgICovICJvZmZsb2FkIHdhcm5pbmc6IGlnbm9yaW5nICVzIHNldHRpbmc7IHVzZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIHZhbHVlIiwKKwkvKiAgNTkgbXNnX2Nfb21wX2ludmFsaWRfZGV2aWNlX251bSAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiBkZXZpY2UgbnVtYmVyIHNob3VsZCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIHZhbHVlIiwKKwkvKiAgNjAgbXNnX2NfdW5rbm93bl9iaW5hcnlfdHlwZSAgICAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiB1bmV4cGVjdGVkIGVtYmVkZGVkIHRhcmdldCBiaW5hcnkgdHlwZSwgZXhwZWN0ZWQgZWl0aGVyIGFuIGV4ZWN1dGFibGUgb3Igc2hhcmVkIGxpYnJhcnkiLAorCS8qICA2MSBtc2dfY19tdWx0aXBsZV90YXJnZXRfZXhlcyAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IG1vcmUgdGhhdCBvbmUgdGFyZ2V0IGV4ZWN1dGFibGUgZm91bmQiLAorCS8qICA2MiBtc2dfY19ub190YXJnZXRfZXhlICAgICAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IHRhcmdldCBleGVjdXRhYmxlIGlzIG5vdCBhdmFpbGFibGUiLAorCS8qICA2MyBtc2dfY19yZXBvcnRfdW5rbm93bl90aW1lcl9ub2RlICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IHVua25vd24gdGltZXIgbm9kZSIsCisJLyogIDY0IG1zZ19jX3JlcG9ydF91bmtub3duX3RyYWNlX25vZGUgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogdW5rbm93biB0cmFjZSBub2RlIiwKKwkvKiAgNjUgbXNnX2NfcmVwb3J0X2hvc3QgICAgICAgICAgICAgICAgICAgICAgICovICJIT1NUIiwKKwkvKiAgNjYgbXNnX2NfcmVwb3J0X21pYyAgICAgICAgICAgICAgICAgICAgICAgICovICJNSUMiLAorCS8qICA2NyBtc2dfY19yZXBvcnRfdGl0bGUgICAgICAgICAgICAgICAgICAgICAgKi8gInRpbWVyIGRhdGEgICAgICAgKHNlYykiLAorCS8qICA2OCBtc2dfY19yZXBvcnRfc2Vjb25kcyAgICAgICAgICAgICAgICAgICAgKi8gIihzZWNvbmRzKSIsCisJLyogIDY5IG1zZ19jX3JlcG9ydF9ieXRlcyAgICAgICAgICAgICAgICAgICAgICAqLyAiKGJ5dGVzKSIsCisJLyogIDcwIG1zZ19jX3JlcG9ydF9jcHVfdGltZSAgICAgICAgICAgICAgICAgICAqLyAiQ1BVIFRpbWUiLAorCS8qICA3MSBtc2dfY19yZXBvcnRfbWljX3RpbWUgICAgICAgICAgICAgICAgICAgKi8gIk1JQyBUaW1lIiwKKwkvKiAgNzIgbXNnX2NfcmVwb3J0X3RhZyAgICAgICAgICAgICAgICAgICAgICAgICovICJUYWciLAorCS8qICA3MyBtc2dfY19yZXBvcnRfZnJvbV9maWxlICAgICAgICAgICAgICAgICAgKi8gIk9mZmxvYWQgZnJvbSBmaWxlIiwKKwkvKiAgNzQgbXNnX2NfcmVwb3J0X2ZpbGUgICAgICAgICAgICAgICAgICAgICAgICovICJGaWxlIiwKKwkvKiAgNzUgbXNnX2NfcmVwb3J0X2xpbmUgICAgICAgICAgICAgICAgICAgICAgICovICJMaW5lIiwKKwkvKiAgNzYgbXNnX2NfcmVwb3J0X2NwdV90b19taWNfZGF0YSAgICAgICAgICAgICovICJDUFUtPk1JQyBEYXRhIiwKKwkvKiAgNzcgbXNnX2NfcmVwb3J0X21pY190b19jcHVfZGF0YSAgICAgICAgICAgICovICJNSUMtPkNQVSBEYXRhIiwKKwkvKiAgNzggbXNnX2NfcmVwb3J0X29mZmxvYWQgICAgICAgICAgICAgICAgICAgICovICJPZmZsb2FkIiwKKwkvKiAgNzkgbXNnX2NfcmVwb3J0X3dfdGFnICAgICAgICAgICAgICAgICAgICAgICovICJUYWcgJWQiLAorCS8qICA4MCBtc2dfY19yZXBvcnRfc3RhdGUgICAgICAgICAgICAgICAgICAgICAgKi8gIlN0YXRlIiwKKwkvKiAgODEgbXNnX2NfcmVwb3J0X3N0YXJ0ICAgICAgICAgICAgICAgICAgICAgICovICJTdGFydCB0YXJnZXQiLAorCS8qICA4MiBtc2dfY19yZXBvcnRfaW5pdCAgICAgICAgICAgICAgICAgICAgICAgKi8gIkluaXRpYWxpemUiLAorCS8qICA4MyBtc2dfY19yZXBvcnRfbG9naWNhbF9jYXJkICAgICAgICAgICAgICAgKi8gImxvZ2ljYWwgY2FyZCIsCisJLyogIDg0IG1zZ19jX3JlcG9ydF9waHlzaWNhbF9jYXJkICAgICAgICAgICAgICAqLyAicGh5c2ljYWwgY2FyZCIsCisJLyogIDg1IG1zZ19jX3JlcG9ydF9yZWdpc3RlciAgICAgICAgICAgICAgICAgICAqLyAiUmVnaXN0ZXIgc3RhdGljIGRhdGEgdGFibGVzIiwKKwkvKiAgODYgbXNnX2NfcmVwb3J0X2luaXRfZnVuYyAgICAgICAgICAgICAgICAgICovICJTZXR1cCB0YXJnZXQgZW50cnkiLAorCS8qICA4NyBtc2dfY19yZXBvcnRfY3JlYXRlX2J1Zl9ob3N0ICAgICAgICAgICAgKi8gIkNyZWF0ZSBob3N0IGJ1ZmZlciIsCisJLyogIDg4IG1zZ19jX3JlcG9ydF9jcmVhdGVfYnVmX21pYyAgICAgICAgICAgICAqLyAiQ3JlYXRlIHRhcmdldCBidWZmZXIiLAorCS8qICA4OSBtc2dfY19yZXBvcnRfc2VuZF9wb2ludGVyX2RhdGEgICAgICAgICAgKi8gIlNlbmQgcG9pbnRlciBkYXRhIiwKKwkvKiAgOTAgbXNnX2NfcmVwb3J0X3NlbnRfcG9pbnRlcl9kYXRhICAgICAgICAgICovICJIb3N0LT50YXJnZXQgcG9pbnRlciBkYXRhIiwKKwkvKiAgOTEgbXNnX2NfcmVwb3J0X2dhdGhlcl9jb3B5aW5fZGF0YSAgICAgICAgICovICJHYXRoZXIgY29weWluIGRhdGEiLAorCS8qICA5MiBtc2dfY19yZXBvcnRfY29weWluX2RhdGEgICAgICAgICAgICAgICAgKi8gIkhvc3QtPnRhcmdldCBjb3B5aW4gZGF0YSIsCisJLyogIDkzIG1zZ19jX3JlcG9ydF9zdGF0ZV9zaWduYWwgICAgICAgICAgICAgICAqLyAiU2lnbmFsIiwKKwkvKiAgOTQgbXNnX2NfcmVwb3J0X3NpZ25hbCAgICAgICAgICAgICAgICAgICAgICovICJzaWduYWwgOiIsCisJLyogIDk1IG1zZ19jX3JlcG9ydF93YWl0ICAgICAgICAgICAgICAgICAgICAgICAqLyAid2FpdHMgIDoiLAorCS8qICA5NiBtc2dfY19yZXBvcnRfY29tcHV0ZSAgICAgICAgICAgICAgICAgICAgKi8gIkV4ZWN1dGUgdGFzayBvbiB0YXJnZXQiLAorCS8qICA5NyBtc2dfY19yZXBvcnRfcmVjZWl2ZV9wb2ludGVyX2RhdGEgICAgICAgKi8gIlJlY2VpdmUgcG9pbnRlciBkYXRhIiwKKwkvKiAgOTggbXNnX2NfcmVwb3J0X3JlY2VpdmVkX3BvaW50ZXJfZGF0YSAgICAgICovICJUYXJnZXQtPmhvc3QgcG9pbnRlciBkYXRhIiwKKwkvKiAgOTkgbXNnX2NfcmVwb3J0X3N0YXJ0X3RhcmdldF9mdW5jICAgICAgICAgICovICJTdGFydCB0YXJnZXQgZW50cnkiLAorCS8qIDEwMCBtc2dfY19yZXBvcnRfdmFyICAgICAgICAgICAgICAgICAgICAgICAgKi8gIlZhciIsCisJLyogMTAxIG1zZ19jX3JlcG9ydF9zY2F0dGVyX2NvcHlpbl9kYXRhICAgICAgICAqLyAiU2NhdHRlciBjb3B5aW4gZGF0YSIsCisJLyogMTAyIG1zZ19jX3JlcG9ydF9nYXRoZXJfY29weW91dF9kYXRhICAgICAgICAqLyAiR2F0aGVyIGNvcHlvdXQgZGF0YSIsCisJLyogMTAzIG1zZ19jX3JlcG9ydF9zY2F0dGVyX2NvcHlvdXRfZGF0YSAgICAgICAqLyAiU2NhdHRlciBjb3B5b3V0IGRhdGEiLAorCS8qIDEwNCBtc2dfY19yZXBvcnRfY29weW91dF9kYXRhICAgICAgICAgICAgICAgKi8gIlRhcmdldC0+aG9zdCBjb3B5b3V0IGRhdGEiLAorCS8qIDEwNSBtc2dfY19yZXBvcnRfdW5yZWdpc3RlciAgICAgICAgICAgICAgICAgKi8gIlVucmVnaXN0ZXIgZGF0YSB0YWJsZXMiLAorCS8qIDEwNiBtc2dfY19yZXBvcnRfZGVzdHJveSAgICAgICAgICAgICAgICAgICAgKi8gIkRlc3Ryb3kiLAorCS8qIDEwNyBtc2dfY19yZXBvcnRfbXlvaW5pdCAgICAgICAgICAgICAgICAgICAgKi8gIkluaXRpYWxpemUgTVlPIiwKKwkvKiAxMDggbXNnX2NfcmVwb3J0X215b3JlZ2lzdGVyICAgICAgICAgICAgICAgICovICJSZWdpc3RlciBNWU8gdGFibGVzIiwKKwkvKiAxMDkgbXNnX2NfcmVwb3J0X215b2ZpbmkgICAgICAgICAgICAgICAgICAgICovICJGaW5hbGl6ZSBNWU8iLAorCS8qIDExMCBtc2dfY19yZXBvcnRfbWljX215b19zaGFyZWQgICAgICAgICAgICAgKi8gIk1JQyBNWU8gc2hhcmVkIHRhYmxlIHJlZ2lzdGVyIiwKKwkvKiAxMTEgbXNnX2NfcmVwb3J0X21pY19teW9fZnB0ciAgICAgICAgICAgICAgICovICJNSUMgTVlPIGZwdHIgdGFibGUgcmVnaXN0ZXIiLAorCS8qIDExMiBtc2dfY19yZXBvcnRfbXlvc2hhcmVkbWFsbG9jICAgICAgICAgICAgKi8gIk1ZTyBzaGFyZWQgbWFsbG9jIiwKKwkvKiAxMTMgbXNnX2NfcmVwb3J0X215b3NoYXJlZGZyZWUgICAgICAgICAgICAgICovICJNWU8gc2hhcmVkIGZyZWUiLAorCS8qIDExNCBtc2dfY19yZXBvcnRfbXlvc2hhcmVkYWxpZ25lZG1hbGxvYyAgICAgKi8gIk1ZTyBzaGFyZWQgYWxpZ25lZCBtYWxsb2MiLAorCS8qIDExNSBtc2dfY19yZXBvcnRfbXlvc2hhcmVkYWxpZ25lZGZyZWUgICAgICAgKi8gIk1ZTyBzaGFyZWQgYWxpZ25lZCBmcmVlIiwKKwkvKiAxMTYgbXNnX2NfcmVwb3J0X215b2FjcXVpcmUgICAgICAgICAgICAgICAgICovICJNWU8gYWNxdWlyZSIsCisJLyogMTE3IG1zZ19jX3JlcG9ydF9teW9yZWxlYXNlICAgICAgICAgICAgICAgICAqLyAiTVlPIHJlbGVhc2UiLAorCS8qIDExOCBtc2dfY19yZXBvcnRfaG9zdF90b3RhbF9vZmZsb2FkX3RpbWUgICAgKi8gImhvc3Q6IHRvdGFsIG9mZmxvYWQgdGltZSIsCisJLyogMTE5IG1zZ19jX3JlcG9ydF9ob3N0X2luaXRpYWxpemUgICAgICAgICAgICAqLyAiaG9zdDogaW5pdGlhbGl6ZSB0YXJnZXQiLAorCS8qIDEyMCBtc2dfY19yZXBvcnRfaG9zdF90YXJnZXRfYWNxdWlyZSAgICAgICAgKi8gImhvc3Q6IGFjcXVpcmUgdGFyZ2V0IiwKKwkvKiAxMjEgbXNnX2NfcmVwb3J0X2hvc3Rfd2FpdF9kZXBzICAgICAgICAgICAgICovICJob3N0OiB3YWl0IGRlcGVuZGVuY2llcyIsCisJLyogMTIyIG1zZ19jX3JlcG9ydF9ob3N0X3NldHVwX2J1ZmZlcnMgICAgICAgICAqLyAiaG9zdDogc2V0dXAgYnVmZmVycyIsCisJLyogMTIzIG1zZ19jX3JlcG9ydF9ob3N0X2FsbG9jX2J1ZmZlcnMgICAgICAgICAqLyAiaG9zdDogYWxsb2NhdGUgYnVmZmVycyIsCisJLyogMTI0IG1zZ19jX3JlcG9ydF9ob3N0X3NldHVwX21pc2NfZGF0YSAgICAgICAqLyAiaG9zdDogc2V0dXAgbWlzY19kYXRhIiwKKwkvKiAxMjUgbXNnX2NfcmVwb3J0X2hvc3RfYWxsb2NfZGF0YV9idWZmZXIgICAgICovICJob3N0OiBhbGxvY2F0ZSBidWZmZXIiLAorCS8qIDEyNiBtc2dfY19yZXBvcnRfaG9zdF9zZW5kX3BvaW50ZXJzICAgICAgICAgKi8gImhvc3Q6IHNlbmQgcG9pbnRlcnMiLAorCS8qIDEyNyBtc2dfY19yZXBvcnRfaG9zdF9nYXRoZXJfaW5wdXRzICAgICAgICAgKi8gImhvc3Q6IGdhdGhlciBpbnB1dHMiLAorCS8qIDEyOCBtc2dfY19yZXBvcnRfaG9zdF9tYXBfaW5fZGF0YV9idWZmZXIgICAgKi8gImhvc3Q6IG1hcCBJTiBkYXRhIGJ1ZmZlciIsCisJLyogMTI5IG1zZ19jX3JlcG9ydF9ob3N0X3VubWFwX2luX2RhdGFfYnVmZmVyICAqLyAiaG9zdDogdW5tYXAgSU4gZGF0YSBidWZmZXIiLAorCS8qIDEzMCBtc2dfY19yZXBvcnRfaG9zdF9zdGFydF9jb21wdXRlICAgICAgICAgKi8gImhvc3Q6IGluaXRpYXRlIGNvbXB1dGUiLAorCS8qIDEzMSBtc2dfY19yZXBvcnRfaG9zdF93YWl0X2NvbXB1dGUgICAgICAgICAgKi8gImhvc3Q6IHdhaXQgY29tcHV0ZSIsCisJLyogMTMyIG1zZ19jX3JlcG9ydF9ob3N0X3N0YXJ0X2J1ZmZlcnNfcmVhZHMgICAqLyAiaG9zdDogaW5pdGlhdGUgcG9pbnRlciByZWFkcyIsCisJLyogMTMzIG1zZ19jX3JlcG9ydF9ob3N0X3NjYXR0ZXJfb3V0cHV0cyAgICAgICAqLyAiaG9zdDogc2NhdHRlciBvdXRwdXRzIiwKKwkvKiAxMzQgbXNnX2NfcmVwb3J0X2hvc3RfbWFwX291dF9kYXRhX2J1ZmZlciAgICovICJob3N0OiBtYXAgT1VUIGRhdGEgYnVmZmVyIiwKKwkvKiAxMzUgbXNnX2NfcmVwb3J0X2hvc3RfdW5tYXBfb3V0X2RhdGFfYnVmZmVyICovICJob3N0OiB1bm1hcCBPVVQgZGF0YSBidWZmZXIiLAorCS8qIDEzNiBtc2dfY19yZXBvcnRfaG9zdF93YWl0X2J1ZmZlcnNfcmVhZHMgICAgKi8gImhvc3Q6IHdhaXQgcG9pbnRlciByZWFkcyIsCisJLyogMTM3IG1zZ19jX3JlcG9ydF9ob3N0X2Rlc3Ryb3lfYnVmZmVycyAgICAgICAqLyAiaG9zdDogZGVzdHJveSBidWZmZXJzIiwKKwkvKiAxMzggbXNnX2NfcmVwb3J0X3RhcmdldF90b3RhbF90aW1lICAgICAgICAgICovICJ0YXJnZXQ6IHRvdGFsIHRpbWUiLAorCS8qIDEzOSBtc2dfY19yZXBvcnRfdGFyZ2V0X2Rlc2NyaXB0b3Jfc2V0dXAgICAgKi8gInRhcmdldDogc2V0dXAgb2ZmbG9hZCBkZXNjcmlwdG9yIiwKKwkvKiAxNDAgbXNnX2NfcmVwb3J0X3RhcmdldF9mdW5jX2xvb2t1cCAgICAgICAgICovICJ0YXJnZXQ6IGVudHJ5IGxvb2t1cCIsCisJLyogMTQxIG1zZ19jX3JlcG9ydF90YXJnZXRfZnVuY190aW1lICAgICAgICAgICAqLyAidGFyZ2V0OiBlbnRyeSB0aW1lIiwKKwkvKiAxNDIgbXNnX2NfcmVwb3J0X3RhcmdldF9zY2F0dGVyX2lucHV0cyAgICAgICovICJ0YXJnZXQ6IHNjYXR0ZXIgaW5wdXRzIiwKKwkvKiAxNDMgbXNnX2NfcmVwb3J0X3RhcmdldF9hZGRfYnVmZmVyX3JlZnMgICAgICovICJ0YXJnZXQ6IGFkZCBidWZmZXIgcmVmZXJlbmNlIiwKKwkvKiAxNDQgbXNnX2NfcmVwb3J0X3RhcmdldF9jb21wdXRlICAgICAgICAgICAgICovICJ0YXJnZXQ6IGNvbXB1dGUiLAorCS8qIDE0NSBtc2dfY19yZXBvcnRfdGFyZ2V0X2dhdGhlcl9vdXRwdXRzICAgICAgKi8gInRhcmdldDogZ2F0aGVyIG91dHB1dHMiLAorCS8qIDE0NiBtc2dfY19yZXBvcnRfdGFyZ2V0X3JlbGVhc2VfYnVmZmVyX3JlZnMgKi8gInRhcmdldDogcmVtb3ZlIGJ1ZmZlciByZWZlcmVuY2UiLAorCS8qIDE0NyBtc2dfY19jb2lfcGlwZWxpbmVfbWF4X251bWJlciAgICAgICAgICAgKi8gIm51bWJlciBvZiBob3N0IHRocmVhZHMgZG9pbmcgb2ZmbG9hZCBleGNlZWRzIG1heGltdW0gb2YgJWQiLAorCS8qIDE0OCBtc2dfY19yYW5nZXNfZG9udF9tYXRjaCAgICAgICAgICAgICAgICAgKi8gInJhbmdlcyBvZiBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGRvbid0IG1hdGNoIHRvZ2V0aGVyIiwKKwkvKiAxNDkgbXNnX2NfZGVzdGluYXRpb25faXNfb3ZlciAgICAgICAgICAgICAgICovICJpbnN1ZmZpY2llbnQgZGVzdGluYXRpb24gbWVtb3J5IHRvIHRyYW5zZmVyIHNvdXJjZSIsCisJLyogMTUwIG1zZ19jX3NsaWNlX29mX25vbmNvbnRfYXJyYXkgICAgICAgICAgICAqLyAiYSBub24tY29udGlndW91cyBzbGljZSBtYXkgYmUgdGFrZW4gb2YgY29udGlndW91cyBhcnJheXMgb25seSIsCisJLyogMTUxIG1zZ19jX3BvaW50ZXJfYXJyYXlfbWlzbWF0Y2ggICAgICAgICAgICAqLyAibnVtYmVyIG9mICVzIGVsZW1lbnRzIGlzIGxlc3MgdGhhbiBkZXNjcmliZWQgYnkgdGhlIHNvdXJjZSIsCit9OwpkaWZmIC0tZ2l0IGEvZmluYWwvb2ZmbG9hZC9zcmMvbWljX2xpYi5mOTAgYi9maW5hbC9vZmZsb2FkL3NyYy9taWNfbGliLmY5MApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzJlNGRlCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9zcmMvbWljX2xpYi5mOTAKQEAgLTAsMCArMSw0NDEgQEAKKyEKKyEvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIS8vCishLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIS8vCishLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIS8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIS8vCishLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyEKKworCishICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyEgKiBUaGlzIGZpbGUgaXMgaW50ZW5kZWQgdG8gc3VwcG9ydCB0aGUgSW50ZWwocikgTWFueSBJbnRlZ3JhdGVkIENvcmUgQXJjaGl0ZWN0dXJlLgorISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCishIGZyZWUgZm9ybSBGb3J0cmFuIHNvdXJjZSAtIHNob3VsZCBiZSBuYW1lZCAuZjkwCishIGxpbmVzIGFyZSBsb25nZXIgdGhhbiA3MiBjaGFyYWN0ZXJzCisKK21vZHVsZSBtaWNfbGliCit1c2UsIGludHJpbnNpYyA6OiBpc29fY19iaW5kaW5nCisKK2ludGVnZXIsIHBhcmFtZXRlcjo6IHRhcmdldF9taWM9MgoraW50ZWdlciwgcGFyYW1ldGVyOjogZGVmYXVsdF90YXJnZXRfdHlwZT10YXJnZXRfbWljCitpbnRlZ2VyLCBwYXJhbWV0ZXI6OiBkZWZhdWx0X3RhcmdldF9udW1iZXI9MAorCitlbnVtLCBiaW5kKEMpCisgICAgZW51bWVyYXRvciA6OiBPRkZMT0FEX1NVQ0NFU1MgID0gMAorICAgIGVudW1lcmF0b3IgOjogT0ZGTE9BRF9ESVNBQkxFRCAgICAgICAgICAhIG9mZmxvYWQgaXMgZGlzYWJsZWQKKyAgICBlbnVtZXJhdG9yIDo6IE9GRkxPQURfVU5BVkFJTEFCTEUgICAgICAgISBjYXJkIGlzIG5vdCBhdmFpbGFibGUKKyAgICBlbnVtZXJhdG9yIDo6IE9GRkxPQURfT1VUX09GX01FTU9SWSAgICAgISBub3QgZW5vdWdoIG1lbW9yeSBvbiBkZXZpY2UKKyAgICBlbnVtZXJhdG9yIDo6IE9GRkxPQURfUFJPQ0VTU19ESUVEICAgICAgISB0YXJnZXQgcHJvY2VzcyBoYXMgZGllZAorICAgIGVudW1lcmF0b3IgOjogT0ZGTE9BRF9FUlJPUiAgICAgICAgICAgICAhIHVuc3BlY2lmaWVkIGVycm9yCitlbmQgZW51bQorCit0eXBlLCBiaW5kIChDKSA6OiBvZmZsb2FkX3N0YXR1cworICAgIGludGVnZXIoa2luZD1jX2ludCkgICAgOjogIHJlc3VsdCAgICAgICAgICA9IE9GRkxPQURfRElTQUJMRUQKKyAgICBpbnRlZ2VyKGtpbmQ9Y19pbnQpICAgIDo6ICBkZXZpY2VfbnVtYmVyICAgPSAtMQorICAgIGludGVnZXIoa2luZD1jX3NpemVfdCkgOjogIGRhdGFfc2VudCAgICAgICA9IDAKKyAgICBpbnRlZ2VyKGtpbmQ9Y19zaXplX3QpIDo6ICBkYXRhX3JlY2VpdmVkICAgPSAwCitlbmQgdHlwZSBvZmZsb2FkX3N0YXR1cworCitpbnRlcmZhY2UKK2Z1bmN0aW9uIG9mZmxvYWRfbnVtYmVyX29mX2RldmljZXMgKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICBiaW5kIChDLCBuYW1lID0gIl9PZmZsb2FkX251bWJlcl9vZl9kZXZpY2VzIikKKyFkZWMkIGF0dHJpYnV0ZXMgZGVmYXVsdCA6OiBvZmZsb2FkX251bWJlcl9vZl9kZXZpY2VzCisgIGltcG9ydCA6OiBjX2ludAorICBpbnRlZ2VyIChraW5kPWNfaW50KSAgICAgICAgOjogb2ZmbG9hZF9udW1iZXJfb2ZfZGV2aWNlcworIWRlYyQgYXR0cmlidXRlcyBvZmZsb2FkOm1pYyA6OiBvZmZsb2FkX251bWJlcl9vZl9kZXZpY2VzCishZGlyJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiAgb2ZmbG9hZF9udW1iZXJfb2ZfZGV2aWNlcworZW5kIGZ1bmN0aW9uIG9mZmxvYWRfbnVtYmVyX29mX2RldmljZXMKKworZnVuY3Rpb24gb2ZmbG9hZF9zaWduYWxlZCh0YXJnZXRfbnVtYmVyLCBzaWduYWwpICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAiX09mZmxvYWRfc2lnbmFsZWQiKQorIWRlYyQgYXR0cmlidXRlcyBkZWZhdWx0IDo6IG9mZmxvYWRfc2lnbmFsZWQKKyAgaW1wb3J0IDo6IGNfaW50LCBjX2ludDY0X3QKKyAgaW50ZWdlciAoa2luZD1jX2ludCkgOjogb2ZmbG9hZF9zaWduYWxlZAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X251bWJlcgorICBpbnRlZ2VyIChraW5kPWNfaW50NjRfdCksIHZhbHVlIDo6IHNpZ25hbAorIWRlYyQgYXR0cmlidXRlcyBvZmZsb2FkOm1pYyA6OiBvZmZsb2FkX3NpZ25hbGVkCitlbmQgZnVuY3Rpb24gb2ZmbG9hZF9zaWduYWxlZAorCitzdWJyb3V0aW5lIG9mZmxvYWRfcmVwb3J0KHZhbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJfT2ZmbG9hZF9yZXBvcnQiKQorIWRlYyQgYXR0cmlidXRlcyBkZWZhdWx0IDo6IG9mZmxvYWRfcmVwb3J0CisgIGltcG9ydCA6OiBjX2ludAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdmFsCishZGVjJCBhdHRyaWJ1dGVzIG9mZmxvYWQ6bWljIDo6IG9mZmxvYWRfcmVwb3J0CitlbmQgc3Vicm91dGluZSBvZmZsb2FkX3JlcG9ydAorCitmdW5jdGlvbiBvZmZsb2FkX2dldF9kZXZpY2VfbnVtYmVyKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJfT2ZmbG9hZF9nZXRfZGV2aWNlX251bWJlciIpCishZGVjJCBhdHRyaWJ1dGVzIGRlZmF1bHQgOjogb2ZmbG9hZF9nZXRfZGV2aWNlX251bWJlcgorICBpbXBvcnQgOjogY19pbnQKKyAgaW50ZWdlciAoa2luZD1jX2ludCkgICAgICAgIDo6IG9mZmxvYWRfZ2V0X2RldmljZV9udW1iZXIKKyFkZWMkIGF0dHJpYnV0ZXMgb2ZmbG9hZDptaWMgOjogb2ZmbG9hZF9nZXRfZGV2aWNlX251bWJlcgorZW5kIGZ1bmN0aW9uIG9mZmxvYWRfZ2V0X2RldmljZV9udW1iZXIKKworZnVuY3Rpb24gb2ZmbG9hZF9nZXRfcGh5c2ljYWxfZGV2aWNlX251bWJlcigpICAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAiX09mZmxvYWRfZ2V0X3BoeXNpY2FsX2RldmljZV9udW1iZXIiKQorIWRlYyQgYXR0cmlidXRlcyBkZWZhdWx0IDo6IG9mZmxvYWRfZ2V0X3BoeXNpY2FsX2RldmljZV9udW1iZXIKKyAgaW1wb3J0IDo6IGNfaW50CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpICAgICAgICA6OiBvZmZsb2FkX2dldF9waHlzaWNhbF9kZXZpY2VfbnVtYmVyCishZGVjJCBhdHRyaWJ1dGVzIG9mZmxvYWQ6bWljIDo6IG9mZmxvYWRfZ2V0X3BoeXNpY2FsX2RldmljZV9udW1iZXIKK2VuZCBmdW5jdGlvbiBvZmZsb2FkX2dldF9waHlzaWNhbF9kZXZpY2VfbnVtYmVyCisKKyEgT3Blbk1QIEFQSSB3cmFwcGVycworCitzdWJyb3V0aW5lIG9tcF9zZXRfbnVtX3RocmVhZHNfdGFyZ2V0ICh0YXJnZXRfdHlwZSwgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIsICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3RocmVhZHMpICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAib21wX3NldF9udW1fdGhyZWFkc190YXJnZXQiKQorICBpbXBvcnQgOjogY19pbnQKKyAgaW50ZWdlciAoa2luZD1jX2ludCksIHZhbHVlIDo6IHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCBudW1fdGhyZWFkcworZW5kIHN1YnJvdXRpbmUgb21wX3NldF9udW1fdGhyZWFkc190YXJnZXQKKworZnVuY3Rpb24gb21wX2dldF9tYXhfdGhyZWFkc190YXJnZXQgKHRhcmdldF90eXBlLCAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlcikgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAib21wX2dldF9tYXhfdGhyZWFkc190YXJnZXQiKQorICBpbXBvcnQgOjogY19pbnQKKyAgaW50ZWdlciAoa2luZD1jX2ludCkgICAgICAgIDo6IG9tcF9nZXRfbWF4X3RocmVhZHNfdGFyZ2V0CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlcgorZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X3RocmVhZHNfdGFyZ2V0CisKK2Z1bmN0aW9uIG9tcF9nZXRfbnVtX3Byb2NzX3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyKSAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICBiaW5kIChDLCBuYW1lID0gIm9tcF9nZXRfbnVtX3Byb2NzX3RhcmdldCIpCisgIGltcG9ydCA6OiBjX2ludAorICBpbnRlZ2VyIChraW5kPWNfaW50KSAgICAgICAgOjogb21wX2dldF9udW1fcHJvY3NfdGFyZ2V0CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlcgorZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3Byb2NzX3RhcmdldAorCitzdWJyb3V0aW5lIG9tcF9zZXRfZHluYW1pY190YXJnZXQgKHRhcmdldF90eXBlLCAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlciwgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fdGhyZWFkcykgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAib21wX3NldF9keW5hbWljX3RhcmdldCIpCisgIGltcG9ydCA6OiBjX2ludAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIG51bV90aHJlYWRzCitlbmQgc3Vicm91dGluZSBvbXBfc2V0X2R5bmFtaWNfdGFyZ2V0CisKK2Z1bmN0aW9uIG9tcF9nZXRfZHluYW1pY190YXJnZXQgKHRhcmdldF90eXBlLCAgICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlcikgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICBiaW5kIChDLCBuYW1lID0gIm9tcF9nZXRfZHluYW1pY190YXJnZXQiKQorICBpbXBvcnQgOjogY19pbnQKKyAgaW50ZWdlciAoa2luZD1jX2ludCkgICAgICAgIDo6IG9tcF9nZXRfZHluYW1pY190YXJnZXQKKyAgaW50ZWdlciAoa2luZD1jX2ludCksIHZhbHVlIDo6IHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyCitlbmQgZnVuY3Rpb24gb21wX2dldF9keW5hbWljX3RhcmdldAorCitzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdGVkX3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyLCAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lc3RlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAib21wX3NldF9uZXN0ZWRfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgbmVzdGVkCitlbmQgc3Vicm91dGluZSBvbXBfc2V0X25lc3RlZF90YXJnZXQKKworZnVuY3Rpb24gb21wX2dldF9uZXN0ZWRfdGFyZ2V0ICh0YXJnZXRfdHlwZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIpICAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAib21wX2dldF9uZXN0ZWRfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpICAgICAgICA6OiBvbXBfZ2V0X25lc3RlZF90YXJnZXQKKyAgaW50ZWdlciAoa2luZD1jX2ludCksIHZhbHVlIDo6IHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyCitlbmQgZnVuY3Rpb24gb21wX2dldF9uZXN0ZWRfdGFyZ2V0CisKK3N1YnJvdXRpbmUgb21wX3NldF9zY2hlZHVsZV90YXJnZXQgKHRhcmdldF90eXBlLCAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlciwgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBraW5kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVyKSAgICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICBiaW5kIChDLCBuYW1lID0gIm9tcF9zZXRfc2NoZWR1bGVfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwga2luZCwgbW9kaWZpZXIKK2VuZCBzdWJyb3V0aW5lIG9tcF9zZXRfc2NoZWR1bGVfdGFyZ2V0CisKK3N1YnJvdXRpbmUgb21wX2dldF9zY2hlZHVsZV90YXJnZXQgKHRhcmdldF90eXBlLCAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlciwgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBraW5kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVyKSAgICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICBiaW5kIChDLCBuYW1lID0gIm9tcF9nZXRfc2NoZWR1bGVfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50LCBjX2ludHB0cl90CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlcgorICBpbnRlZ2VyIChraW5kPWNfaW50cHRyX3QpLCB2YWx1ZSA6OiBraW5kLCBtb2RpZmllcgorZW5kIHN1YnJvdXRpbmUgb21wX2dldF9zY2hlZHVsZV90YXJnZXQKKworISBsb2NrIEFQSSBmdW5jdGlvbnMKKworc3Vicm91dGluZSBvbXBfaW5pdF9sb2NrX3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyLCAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2spICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICBiaW5kIChDLCBuYW1lID0gIm9tcF9pbml0X2xvY2tfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50LCBjX2ludHB0cl90CisgICFkaXIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6ICBvbXBfaW5pdF9sb2NrX3RhcmdldAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIKKyAgaW50ZWdlciAoa2luZD1jX2ludHB0cl90KSwgdmFsdWUgOjogbG9jaworZW5kIHN1YnJvdXRpbmUgb21wX2luaXRfbG9ja190YXJnZXQKKworc3Vicm91dGluZSBvbXBfZGVzdHJveV9sb2NrX3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyLCAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2spICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICBiaW5kIChDLCBuYW1lID0gIm9tcF9kZXN0cm95X2xvY2tfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50LCBjX2ludHB0cl90CisgICFkaXIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6ICBvbXBfZGVzdHJveV9sb2NrX3RhcmdldAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIKKyAgaW50ZWdlciAoa2luZD1jX2ludHB0cl90KSwgdmFsdWUgOjogbG9jaworZW5kIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbG9ja190YXJnZXQKKworc3Vicm91dGluZSBvbXBfc2V0X2xvY2tfdGFyZ2V0ICh0YXJnZXRfdHlwZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIsICAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jaykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICBiaW5kIChDLCBuYW1lID0gIm9tcF9zZXRfbG9ja190YXJnZXQiKQorICBpbXBvcnQgOjogY19pbnQsIGNfaW50cHRyX3QKKyAgIWRpciQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogIG9tcF9zZXRfbG9ja190YXJnZXQKKyAgaW50ZWdlciAoa2luZD1jX2ludCksIHZhbHVlIDo6IHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyCisgIGludGVnZXIgKGtpbmQ9Y19pbnRwdHJfdCksIHZhbHVlIDo6IGxvY2sKK2VuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbG9ja190YXJnZXQKKworc3Vicm91dGluZSBvbXBfdW5zZXRfbG9ja190YXJnZXQgKHRhcmdldF90eXBlLCAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlciwgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICBiaW5kIChDLCBuYW1lID0gIm9tcF91bnNldF9sb2NrX3RhcmdldCIpCisgIGltcG9ydCA6OiBjX2ludCwgY19pbnRwdHJfdAorICAhZGlyJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiAgb21wX3Vuc2V0X2xvY2tfdGFyZ2V0CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlcgorICBpbnRlZ2VyIChraW5kPWNfaW50cHRyX3QpLCB2YWx1ZSA6OiBsb2NrCitlbmQgc3Vicm91dGluZSBvbXBfdW5zZXRfbG9ja190YXJnZXQKKworZnVuY3Rpb24gb21wX3Rlc3RfbG9ja190YXJnZXQgKHRhcmdldF90eXBlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlciwgICAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICBiaW5kIChDLCBuYW1lID0gIm9tcF90ZXN0X2xvY2tfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50LCBjX2ludHB0cl90CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpICAgICAgICA6OiBvbXBfdGVzdF9sb2NrX3RhcmdldAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIKKyAgaW50ZWdlciAoa2luZD1jX2ludHB0cl90KSwgdmFsdWUgOjogbG9jaworZW5kIGZ1bmN0aW9uIG9tcF90ZXN0X2xvY2tfdGFyZ2V0CisKKyEgbmVzdGVkIGxvY2sgQVBJIGZ1bmN0aW9ucworCitzdWJyb3V0aW5lIG9tcF9pbml0X25lc3RfbG9ja190YXJnZXQgKHRhcmdldF90eXBlLCAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlciwgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAib21wX2luaXRfbmVzdF9sb2NrX3RhcmdldCIpCisgIGltcG9ydCA6OiBjX2ludCwgY19pbnRwdHJfdAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIKKyAgaW50ZWdlciAoa2luZD1jX2ludHB0cl90KSwgdmFsdWUgOjogbG9jaworZW5kIHN1YnJvdXRpbmUgb21wX2luaXRfbmVzdF9sb2NrX3RhcmdldAorCitzdWJyb3V0aW5lIG9tcF9kZXN0cm95X25lc3RfbG9ja190YXJnZXQgKHRhcmdldF90eXBlLCAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlciwgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NrKSAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAib21wX2Rlc3Ryb3lfbmVzdF9sb2NrX3RhcmdldCIpCisgIGltcG9ydCA6OiBjX2ludCwgY19pbnRwdHJfdAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIKKyAgaW50ZWdlciAoa2luZD1jX2ludHB0cl90KSwgdmFsdWUgOjogbG9jaworZW5kIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrX3RhcmdldAorCitzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdF9sb2NrX3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyLCAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2spICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAib21wX3NldF9uZXN0X2xvY2tfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50LCBjX2ludHB0cl90CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlcgorICBpbnRlZ2VyIChraW5kPWNfaW50cHRyX3QpLCB2YWx1ZSA6OiBsb2NrCitlbmQgc3Vicm91dGluZSBvbXBfc2V0X25lc3RfbG9ja190YXJnZXQKKworc3Vicm91dGluZSBvbXBfdW5zZXRfbmVzdF9sb2NrX3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyLCAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2spICAgICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICBiaW5kIChDLCBuYW1lID0gIm9tcF91bnNldF9uZXN0X2xvY2tfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50LCBjX2ludHB0cl90CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlcgorICBpbnRlZ2VyIChraW5kPWNfaW50cHRyX3QpLCB2YWx1ZSA6OiBsb2NrCitlbmQgc3Vicm91dGluZSBvbXBfdW5zZXRfbmVzdF9sb2NrX3RhcmdldAorCitmdW5jdGlvbiBvbXBfdGVzdF9uZXN0X2xvY2tfdGFyZ2V0ICh0YXJnZXRfdHlwZSwgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIsICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jaykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAib21wX3Rlc3RfbmVzdF9sb2NrX3RhcmdldCIpCisgIGltcG9ydCA6OiBjX2ludCwgY19pbnRwdHJfdAorICBpbnRlZ2VyIChraW5kPWNfaW50KSAgICAgICAgOjogb21wX3Rlc3RfbmVzdF9sb2NrX3RhcmdldAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIKKyAgaW50ZWdlciAoa2luZD1jX2ludHB0cl90KSwgdmFsdWUgOjogbG9jaworZW5kIGZ1bmN0aW9uIG9tcF90ZXN0X25lc3RfbG9ja190YXJnZXQKKworISBrbXAgQVBJIGZ1bmN0aW9ucworCitzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplX3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyLCAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAia21wX3NldF9zdGFja3NpemVfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgc2l6ZQorZW5kIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemVfdGFyZ2V0CisKK2Z1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplX3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyKSAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICBiaW5kIChDLCBuYW1lID0gImttcF9nZXRfc3RhY2tzaXplX3RhcmdldCIpCisgIGltcG9ydCA6OiBjX2ludAorICBpbnRlZ2VyIChraW5kPWNfaW50KSAgICAgICAgOjoga21wX2dldF9zdGFja3NpemVfdGFyZ2V0CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlcgorZW5kIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplX3RhcmdldAorCitzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplX3NfdGFyZ2V0ICh0YXJnZXRfdHlwZSwgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIsICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAia21wX3NldF9zdGFja3NpemVfc190YXJnZXQiKQorICBpbXBvcnQgOjogY19pbnQKKyAgaW50ZWdlciAoa2luZD1jX2ludCksIHZhbHVlIDo6IHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCBzaXplCitlbmQgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZV9zX3RhcmdldAorCitmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZV9zX3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyKSAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJrbXBfZ2V0X3N0YWNrc2l6ZV9zX3RhcmdldCIpCisgIGltcG9ydCA6OiBjX2ludAorICBpbnRlZ2VyIChraW5kPWNfaW50KSAgICAgICAgOjoga21wX2dldF9zdGFja3NpemVfc190YXJnZXQKKyAgaW50ZWdlciAoa2luZD1jX2ludCksIHZhbHVlIDo6IHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyCitlbmQgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemVfc190YXJnZXQKKworc3Vicm91dGluZSBrbXBfc2V0X2Jsb2NrdGltZV90YXJnZXQgKHRhcmdldF90eXBlLCAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlciwgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICBiaW5kIChDLCBuYW1lID0gImttcF9zZXRfYmxvY2t0aW1lX3RhcmdldCIpCisgIGltcG9ydCA6OiBjX2ludAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIHRpbWUKK2VuZCBzdWJyb3V0aW5lIGttcF9zZXRfYmxvY2t0aW1lX3RhcmdldAorCitmdW5jdGlvbiBrbXBfZ2V0X2Jsb2NrdGltZV90YXJnZXQgKHRhcmdldF90eXBlLCAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlcikgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJrbXBfZ2V0X2Jsb2NrdGltZV90YXJnZXQiKQorICBpbXBvcnQgOjogY19pbnQKKyAgaW50ZWdlciAoa2luZD1jX2ludCkgICAgICAgIDo6IGttcF9nZXRfYmxvY2t0aW1lX3RhcmdldAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIKK2VuZCBmdW5jdGlvbiBrbXBfZ2V0X2Jsb2NrdGltZV90YXJnZXQKKworc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsX3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyKSAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJrbXBfc2V0X2xpYnJhcnlfc2VyaWFsX3RhcmdldCIpCisgIGltcG9ydCA6OiBjX2ludAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIKK2VuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV9zZXJpYWxfdGFyZ2V0CisKK3N1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmRfdGFyZ2V0ICh0YXJnZXRfdHlwZSwgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIpICAgICAgICAgICAmCisgICAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAia21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmRfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlcgorZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmRfdGFyZ2V0CisKK3N1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXRfdGFyZ2V0ICh0YXJnZXRfdHlwZSwgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIpICAgICAgICAgICAmCisgICAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAia21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXRfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlcgorZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXRfdGFyZ2V0CisKK3N1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyLCAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJrbXBfc2V0X2xpYnJhcnlfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgbW9kZQorZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3RhcmdldAorCitmdW5jdGlvbiBrbXBfZ2V0X2xpYnJhcnlfdGFyZ2V0ICh0YXJnZXRfdHlwZSwgICAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIpICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJrbXBfZ2V0X2xpYnJhcnlfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpICAgICAgICA6OiBrbXBfZ2V0X2xpYnJhcnlfdGFyZ2V0CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlcgorZW5kIGZ1bmN0aW9uIGttcF9nZXRfbGlicmFyeV90YXJnZXQKKworc3Vicm91dGluZSBrbXBfc2V0X2RlZmF1bHRzX3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyLCAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRzKSAgICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICBiaW5kIChDLCBuYW1lID0gImttcF9zZXRfZGVmYXVsdHNfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50LCBjX2NoYXIKKyBjaGFyYWN0ZXIgKGtpbmQ9Y19jaGFyKSA6OiBkZWZhdWx0cygqKQorIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlcgorZW5kIHN1YnJvdXRpbmUga21wX3NldF9kZWZhdWx0c190YXJnZXQKKworISBhZmZpbml0eSBBUEkgZnVuY3Rpb25zCisKK3N1YnJvdXRpbmUga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrX3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyLCAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2spICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJrbXBfY3JlYXRlX2FmZmluaXR5X21hc2tfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50LCBjX2ludHB0cl90CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlcgorICBpbnRlZ2VyIChraW5kPWNfaW50cHRyX3QpLCB2YWx1ZSA6OiBtYXNrCitlbmQgc3Vicm91dGluZSBrbXBfY3JlYXRlX2FmZmluaXR5X21hc2tfdGFyZ2V0CisKK3N1YnJvdXRpbmUga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFza190YXJnZXQgKHRhcmdldF90eXBlLCAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlciwgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrKSAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrX3RhcmdldCIpCisgIGltcG9ydCA6OiBjX2ludCwgY19pbnRwdHJfdAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIKKyAgaW50ZWdlciAoa2luZD1jX2ludHB0cl90KSwgdmFsdWUgOjogbWFzaworZW5kIHN1YnJvdXRpbmUga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFza190YXJnZXQKKworZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eV90YXJnZXQgKHRhcmdldF90eXBlLCAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlciwgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICBiaW5kIChDLCBuYW1lID0gImttcF9zZXRfYWZmaW5pdHlfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50LCBjX2ludHB0cl90CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpICAgICAgICA6OiBrbXBfc2V0X2FmZmluaXR5X3RhcmdldAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIKKyAgaW50ZWdlciAoa2luZD1jX2ludHB0cl90KSwgdmFsdWUgOjogbWFzaworZW5kIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHlfdGFyZ2V0CisKK2Z1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfdGFyZ2V0ICh0YXJnZXRfdHlwZSwgICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIsICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFzaykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJrbXBfZ2V0X2FmZmluaXR5X3RhcmdldCIpCisgIGltcG9ydCA6OiBjX2ludCwgY19pbnRwdHJfdAorICBpbnRlZ2VyIChraW5kPWNfaW50KSAgICAgICAgOjoga21wX2dldF9hZmZpbml0eV90YXJnZXQKKyAgaW50ZWdlciAoa2luZD1jX2ludCksIHZhbHVlIDo6IHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyCisgIGludGVnZXIgKGtpbmQ9Y19pbnRwdHJfdCksIHZhbHVlIDo6IG1hc2sKK2VuZCBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X3RhcmdldAorCitmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jX3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyKSAgICAgICAgICAgICAgJgorICAgICAgICAgICBiaW5kIChDLCBuYW1lID0gImttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2NfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpICAgICAgICA6OiBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jX3RhcmdldAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIKK2VuZCBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jX3RhcmdldAorCitmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvY190YXJnZXQgKHRhcmdldF90eXBlLCAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlciwgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jLCAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2spICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvY190YXJnZXQiKQorICBpbXBvcnQgOjogY19pbnQsIGNfaW50cHRyX3QKKyAgaW50ZWdlciAoa2luZD1jX2ludCkgICAgICAgIDo6IGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jX3RhcmdldAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIHByb2MKKyAgaW50ZWdlciAoa2luZD1jX2ludHB0cl90KSwgdmFsdWUgOjogbWFzaworZW5kIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jX3RhcmdldAorCitmdW5jdGlvbiBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jX3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyLCAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2MsICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFzaykgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jX3RhcmdldCIpCisgIGltcG9ydCA6OiBjX2ludCwgY19pbnRwdHJfdAorICBpbnRlZ2VyIChraW5kPWNfaW50KSAgICAgICAgOjoga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvY190YXJnZXQKKyAgaW50ZWdlciAoa2luZD1jX2ludCksIHZhbHVlIDo6IHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCBwcm9jCisgIGludGVnZXIgKGtpbmQ9Y19pbnRwdHJfdCksIHZhbHVlIDo6IG1hc2sKK2VuZCBmdW5jdGlvbiBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jX3RhcmdldAorCitmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvY190YXJnZXQgKHRhcmdldF90eXBlLCAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlciwgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jLCAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2spICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvY190YXJnZXQiKQorICBpbXBvcnQgOjogY19pbnQsIGNfaW50cHRyX3QKKyAgaW50ZWdlciAoa2luZD1jX2ludCkgICAgICAgIDo6IGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jX3RhcmdldAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIHByb2MKKyAgaW50ZWdlciAoa2luZD1jX2ludHB0cl90KSwgdmFsdWUgOjogbWFzaworZW5kIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jX3RhcmdldAorCitlbmQgaW50ZXJmYWNlCitlbmQgbW9kdWxlIG1pY19saWIKZGlmZiAtLWdpdCBhL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWQuaCBiL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODkxNGI3Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZC5oCkBAIC0wLDAgKzEsNDc0IEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKy8qCisgKiBJbmNsdWRlIGZpbGUgZm9yIE9mZmxvYWQgQVBJLgorICovCisKKyNpZm5kZWYgT0ZGTE9BRF9IX0lOQ0xVREVECisjZGVmaW5lIE9GRkxPQURfSF9JTkNMVURFRAorCisjaWYgZGVmaW5lZChMSU5VWCkgfHwgZGVmaW5lZChGUkVFQlNEKQorI2luY2x1ZGUgPGJpdHMvZnVuY3RleGNlcHQuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8b21wLmg+CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2RlZmluZSBUQVJHRVRfQVRUUklCVVRFIF9fZGVjbHNwZWModGFyZ2V0KG1pYykpCisKKy8qCisgKiAgVGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuCisgKi8KK3R5cGVkZWYgZW51bSBUQVJHRVRfVFlQRSB7CisgICAgVEFSR0VUX05PTkUsICAgIC8qIFVuZGVmaW5lIHRhcmdldCAqLworICAgIFRBUkdFVF9IT1NULCAgICAvKiBIb3N0IHVzZWQgYXMgdGFyZ2V0ICovCisgICAgVEFSR0VUX01JQyAgICAgIC8qIE1JQyB0YXJnZXQgKi8KK30gVEFSR0VUX1RZUEU7CisKKy8qCisgKiAgVGhlIGRlZmF1bHQgdGFyZ2V0IHR5cGUuCisgKi8KKyNkZWZpbmUgREVGQVVMVF9UQVJHRVRfVFlQRSBUQVJHRVRfTUlDCisKKy8qCisgKiAgVGhlIGRlZmF1bHQgdGFyZ2V0IG51bWJlci4KKyAqLworI2RlZmluZSBERUZBVUxUX1RBUkdFVF9OVU1CRVIgMAorCisvKgorICogIE9mZmxvYWQgc3RhdHVzLgorICovCit0eXBlZGVmIGVudW0geworICAgIE9GRkxPQURfU1VDQ0VTUyA9IDAsCisgICAgT0ZGTE9BRF9ESVNBQkxFRCwgICAgICAgICAgICAgICAvKiBvZmZsb2FkIGlzIGRpc2FibGVkICovCisgICAgT0ZGTE9BRF9VTkFWQUlMQUJMRSwgICAgICAgICAgICAvKiBjYXJkIGlzIG5vdCBhdmFpbGFibGUgKi8KKyAgICBPRkZMT0FEX09VVF9PRl9NRU1PUlksICAgICAgICAgIC8qIG5vdCBlbm91Z2ggbWVtb3J5IG9uIGRldmljZSAqLworICAgIE9GRkxPQURfUFJPQ0VTU19ESUVELCAgICAgICAgICAgLyogdGFyZ2V0IHByb2Nlc3MgaGFzIGRpZWQgKi8KKyAgICBPRkZMT0FEX0VSUk9SICAgICAgICAgICAgICAgICAgIC8qIHVuc3BlY2lmaWVkIGVycm9yICovCit9IF9PZmZsb2FkX3Jlc3VsdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIF9PZmZsb2FkX3Jlc3VsdCByZXN1bHQ7ICAgICAgICAgLyogcmVzdWx0LCBzZWUgYWJvdmUgKi8KKyAgICBpbnQgICAgICAgICAgICAgZGV2aWNlX251bWJlcjsgIC8qIGRldmljZSBudW1iZXIgKi8KKyAgICBzaXplX3QgICAgICAgICAgZGF0YV9zZW50OyAgICAgIC8qIG51bWJlciBvZiBieXRlcyBzZW50IHRvIHRoZSB0YXJnZXQgKi8KKyAgICBzaXplX3QgICAgICAgICAgZGF0YV9yZWNlaXZlZDsgIC8qIG51bWJlciBvZiBieXRlcyByZWNlaXZlZCBieSBob3N0ICovCit9IF9PZmZsb2FkX3N0YXR1czsKKworI2RlZmluZSBPRkZMT0FEX1NUQVRVU19JTklUKHgpIFwKKyAgICAoKHgpLnJlc3VsdCA9IE9GRkxPQURfRElTQUJMRUQpCisKKyNkZWZpbmUgT0ZGTE9BRF9TVEFUVVNfSU5JVElBTElaRVIgXAorICAgIHsgT0ZGTE9BRF9ESVNBQkxFRCwgLTEsIDAsIDAgfQorCisvKiBPZmZsb2FkIHJ1bnRpbWUgaW50ZXJmYWNlcyAqLworCitleHRlcm4gaW50IF9PZmZsb2FkX251bWJlcl9vZl9kZXZpY2VzKHZvaWQpOworZXh0ZXJuIGludCBfT2ZmbG9hZF9nZXRfZGV2aWNlX251bWJlcih2b2lkKTsKK2V4dGVybiBpbnQgX09mZmxvYWRfZ2V0X3BoeXNpY2FsX2RldmljZV9udW1iZXIodm9pZCk7CisKK2V4dGVybiB2b2lkKiBfT2ZmbG9hZF9zaGFyZWRfbWFsbG9jKHNpemVfdCBzaXplKTsKK2V4dGVybiB2b2lkICBfT2ZmbG9hZF9zaGFyZWRfZnJlZSh2b2lkICpwdHIpOworCitleHRlcm4gdm9pZCogX09mZmxvYWRfc2hhcmVkX2FsaWduZWRfbWFsbG9jKHNpemVfdCBzaXplLCBzaXplX3QgYWxpZ24pOworZXh0ZXJuIHZvaWQgIF9PZmZsb2FkX3NoYXJlZF9hbGlnbmVkX2ZyZWUodm9pZCAqcHRyKTsKKworZXh0ZXJuIGludCBfT2ZmbG9hZF9zaWduYWxlZChpbnQgaW5kZXgsIHZvaWQgKnNpZ25hbCk7CitleHRlcm4gdm9pZCBfT2ZmbG9hZF9yZXBvcnQoaW50IHZhbCk7CisKKy8qIE9wZW5NUCBBUEkgKi8KKworZXh0ZXJuIHZvaWQgb21wX3NldF9kZWZhdWx0X2RldmljZShpbnQgbnVtKTsKK2V4dGVybiBpbnQgIG9tcF9nZXRfZGVmYXVsdF9kZXZpY2Uodm9pZCk7CitleHRlcm4gaW50ICBvbXBfZ2V0X251bV9kZXZpY2VzKHZvaWQpOworCisvKiBPcGVuTVAgQVBJIHdyYXBwZXJzICovCisKKy8qIFNldCBudW1fdGhyZWFkcyBvbiB0YXJnZXQgKi8KK2V4dGVybiB2b2lkIG9tcF9zZXRfbnVtX3RocmVhZHNfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGludCBudW1fdGhyZWFkcworKTsKKworLyogR2V0IG1heF90aHJlYWRzIGZyb20gdGFyZ2V0ICovCitleHRlcm4gaW50IG9tcF9nZXRfbWF4X3RocmVhZHNfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyCispOworCisvKiBHZXQgbnVtX3Byb2NzIGZyb20gdGFyZ2V0ICovCitleHRlcm4gaW50IG9tcF9nZXRfbnVtX3Byb2NzX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKTsKKworLyogU2V0IGR5bmFtaWMgb24gdGFyZ2V0ICovCitleHRlcm4gdm9pZCBvbXBfc2V0X2R5bmFtaWNfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGludCBudW1fdGhyZWFkcworKTsKKworLyogR2V0IGR5bmFtaWMgZnJvbSB0YXJnZXQgKi8KK2V4dGVybiBpbnQgb21wX2dldF9keW5hbWljX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKTsKKworLyogU2V0IG5lc3RlZCBvbiB0YXJnZXQgKi8KK2V4dGVybiB2b2lkIG9tcF9zZXRfbmVzdGVkX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBpbnQgbmVzdGVkCispOworCisvKiBHZXQgbmVzdGVkIGZyb20gdGFyZ2V0ICovCitleHRlcm4gaW50IG9tcF9nZXRfbmVzdGVkX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKTsKKworZXh0ZXJuIHZvaWQgb21wX3NldF9udW1fdGhyZWFkc190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgaW50IG51bV90aHJlYWRzCispOworCitleHRlcm4gaW50IG9tcF9nZXRfbWF4X3RocmVhZHNfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyCispOworCitleHRlcm4gaW50IG9tcF9nZXRfbnVtX3Byb2NzX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKTsKKworZXh0ZXJuIHZvaWQgb21wX3NldF9keW5hbWljX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBpbnQgbnVtX3RocmVhZHMKKyk7CisKK2V4dGVybiBpbnQgb21wX2dldF9keW5hbWljX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKTsKKworZXh0ZXJuIHZvaWQgb21wX3NldF9uZXN0ZWRfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGludCBudW1fdGhyZWFkcworKTsKKworZXh0ZXJuIGludCBvbXBfZ2V0X25lc3RlZF90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKyk7CisKK2V4dGVybiB2b2lkIG9tcF9zZXRfc2NoZWR1bGVfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIG9tcF9zY2hlZF90IGtpbmQsCisgICAgaW50IG1vZGlmaWVyCispOworCitleHRlcm4gdm9pZCBvbXBfZ2V0X3NjaGVkdWxlX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBvbXBfc2NoZWRfdCAqa2luZCwKKyAgICBpbnQgKm1vZGlmaWVyCispOworCisvKiBsb2NrIEFQSSBmdW5jdGlvbnMgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIG9tcF9sb2NrX3QgbG9jazsKK30gb21wX2xvY2tfdGFyZ2V0X3Q7CisKK2V4dGVybiB2b2lkIG9tcF9pbml0X2xvY2tfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIG9tcF9sb2NrX3RhcmdldF90ICpsb2NrCispOworCitleHRlcm4gdm9pZCBvbXBfZGVzdHJveV9sb2NrX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBvbXBfbG9ja190YXJnZXRfdCAqbG9jaworKTsKKworZXh0ZXJuIHZvaWQgb21wX3NldF9sb2NrX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBvbXBfbG9ja190YXJnZXRfdCAqbG9jaworKTsKKworZXh0ZXJuIHZvaWQgb21wX3Vuc2V0X2xvY2tfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIG9tcF9sb2NrX3RhcmdldF90ICpsb2NrCispOworCitleHRlcm4gaW50IG9tcF90ZXN0X2xvY2tfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIG9tcF9sb2NrX3RhcmdldF90ICpsb2NrCispOworCisvKiBuZXN0ZWQgbG9jayBBUEkgZnVuY3Rpb25zICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBvbXBfbmVzdF9sb2NrX3QgbG9jazsKK30gb21wX25lc3RfbG9ja190YXJnZXRfdDsKKworZXh0ZXJuIHZvaWQgb21wX2luaXRfbmVzdF9sb2NrX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBvbXBfbmVzdF9sb2NrX3RhcmdldF90ICpsb2NrCispOworCitleHRlcm4gdm9pZCBvbXBfZGVzdHJveV9uZXN0X2xvY2tfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIG9tcF9uZXN0X2xvY2tfdGFyZ2V0X3QgKmxvY2sKKyk7CisKK2V4dGVybiB2b2lkIG9tcF9zZXRfbmVzdF9sb2NrX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBvbXBfbmVzdF9sb2NrX3RhcmdldF90ICpsb2NrCispOworCitleHRlcm4gdm9pZCBvbXBfdW5zZXRfbmVzdF9sb2NrX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBvbXBfbmVzdF9sb2NrX3RhcmdldF90ICpsb2NrCispOworCitleHRlcm4gaW50IG9tcF90ZXN0X25lc3RfbG9ja190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgb21wX25lc3RfbG9ja190YXJnZXRfdCAqbG9jaworKTsKKworLyoga21wIEFQSSBmdW5jdGlvbnMgKi8KKworZXh0ZXJuIHZvaWQga21wX3NldF9zdGFja3NpemVfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGludCBzaXplCispOworCitleHRlcm4gaW50IGttcF9nZXRfc3RhY2tzaXplX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKTsKKworZXh0ZXJuIHZvaWQga21wX3NldF9zdGFja3NpemVfc190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgc2l6ZV90IHNpemUKKyk7CisKK2V4dGVybiBzaXplX3Qga21wX2dldF9zdGFja3NpemVfc190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKyk7CisKK2V4dGVybiB2b2lkIGttcF9zZXRfYmxvY2t0aW1lX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBpbnQgdGltZQorKTsKKworZXh0ZXJuIGludCBrbXBfZ2V0X2Jsb2NrdGltZV90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKyk7CisKK2V4dGVybiB2b2lkIGttcF9zZXRfbGlicmFyeV9zZXJpYWxfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyCispOworCitleHRlcm4gdm9pZCBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZF90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKyk7CisKK2V4dGVybiB2b2lkIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0X3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKTsKKworZXh0ZXJuIHZvaWQga21wX3NldF9saWJyYXJ5X3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBpbnQgbW9kZQorKTsKKworZXh0ZXJuIGludCBrbXBfZ2V0X2xpYnJhcnlfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyCispOworCitleHRlcm4gdm9pZCBrbXBfc2V0X2RlZmF1bHRzX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBjaGFyIGNvbnN0ICpkZWZhdWx0cworKTsKKworLyogYWZmaW5pdHkgQVBJIGZ1bmN0aW9ucyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAga21wX2FmZmluaXR5X21hc2tfdCBtYXNrOworfSBrbXBfYWZmaW5pdHlfbWFza190YXJnZXRfdDsKKworZXh0ZXJuIHZvaWQga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBrbXBfYWZmaW5pdHlfbWFza190YXJnZXRfdCAqbWFzaworKTsKKworZXh0ZXJuIHZvaWQga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFza190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAga21wX2FmZmluaXR5X21hc2tfdGFyZ2V0X3QgKm1hc2sKKyk7CisKK2V4dGVybiBpbnQga21wX3NldF9hZmZpbml0eV90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAga21wX2FmZmluaXR5X21hc2tfdGFyZ2V0X3QgKm1hc2sKKyk7CisKK2V4dGVybiBpbnQga21wX2dldF9hZmZpbml0eV90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAga21wX2FmZmluaXR5X21hc2tfdGFyZ2V0X3QgKm1hc2sKKyk7CisKK2V4dGVybiBpbnQga21wX2dldF9hZmZpbml0eV9tYXhfcHJvY190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKyk7CisKK2V4dGVybiBpbnQga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2NfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGludCBwcm9jLAorICAgIGttcF9hZmZpbml0eV9tYXNrX3RhcmdldF90ICptYXNrCispOworCitleHRlcm4gaW50IGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2NfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGludCBwcm9jLAorICAgIGttcF9hZmZpbml0eV9tYXNrX3RhcmdldF90ICptYXNrCispOworCitleHRlcm4gaW50IGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBpbnQgcHJvYywKKyAgICBrbXBfYWZmaW5pdHlfbWFza190YXJnZXRfdCAqbWFzaworKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8qIGV4dGVybiAiQyIgKi8KKworLyogTmFtZXNwYWNlIGZvciB0aGUgc2hhcmVkX2FsbG9jYXRvci4gKi8KK25hbWVzcGFjZSBfX29mZmxvYWQgeworICAvKiBUaGlzIGZvbGxvd3MgdGhlIHNwZWNpZmljYXRpb24gZm9yIHN0ZDo6YWxsb2NhdG9yLiAqLworICAvKiBGb3J3YXJkIGRlY2xhcmF0aW9uIG9mIHRoZSBjbGFzcyB0ZW1wbGF0ZS4gKi8KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIGNsYXNzIHNoYXJlZF9hbGxvY2F0b3I7CisKKyAgLyogU3BlY2lhbGl6YXRpb24gZm9yIHNoYXJlZF9hbGxvY2F0b3I8dm9pZD4uICovCisgIHRlbXBsYXRlIDw+CisgIGNsYXNzIHNoYXJlZF9hbGxvY2F0b3I8dm9pZD4geworICBwdWJsaWM6CisgICAgdHlwZWRlZiB2b2lkICAgICAgICpwb2ludGVyOworICAgIHR5cGVkZWYgY29uc3Qgdm9pZCAqY29uc3RfcG9pbnRlcjsKKyAgICB0eXBlZGVmIHZvaWQgICAgICAgIHZhbHVlX3R5cGU7CisgICAgdGVtcGxhdGUgPGNsYXNzIFU+IHN0cnVjdCByZWJpbmQgeyB0eXBlZGVmIHNoYXJlZF9hbGxvY2F0b3I8VT4gb3RoZXI7IH07CisgIH07CisKKyAgLyogRGVmaW5pdGlvbiBvZiBzaGFyZWRfYWxsb2NhdG9yPFQ+LiAqLworICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KKyAgY2xhc3Mgc2hhcmVkX2FsbG9jYXRvciB7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIHNpemVfdCAgICAgc2l6ZV90eXBlOworICAgIHR5cGVkZWYgcHRyZGlmZl90ICBkaWZmZXJlbmNlX3R5cGU7CisgICAgdHlwZWRlZiBUICAgICAgICAgKnBvaW50ZXI7CisgICAgdHlwZWRlZiBjb25zdCBUICAgKmNvbnN0X3BvaW50ZXI7CisgICAgdHlwZWRlZiBUICAgICAgICAgJnJlZmVyZW5jZTsKKyAgICB0eXBlZGVmIGNvbnN0IFQgICAmY29uc3RfcmVmZXJlbmNlOworICAgIHR5cGVkZWYgVCAgICAgICAgICB2YWx1ZV90eXBlOworICAgIHRlbXBsYXRlIDxjbGFzcyBVPiBzdHJ1Y3QgcmViaW5kIHsgdHlwZWRlZiBzaGFyZWRfYWxsb2NhdG9yPFU+IG90aGVyOyB9OworICAgIHNoYXJlZF9hbGxvY2F0b3IoKSB0aHJvdygpIHsgfQorICAgIHNoYXJlZF9hbGxvY2F0b3IoY29uc3Qgc2hhcmVkX2FsbG9jYXRvciYpIHRocm93KCkgeyB9CisgICAgdGVtcGxhdGUgPGNsYXNzIFU+IHNoYXJlZF9hbGxvY2F0b3IoY29uc3Qgc2hhcmVkX2FsbG9jYXRvcjxVPiYpIHRocm93KCkgeyB9CisgICAgfnNoYXJlZF9hbGxvY2F0b3IoKSB0aHJvdygpIHsgfQorICAgIHBvaW50ZXIgYWRkcmVzcyhyZWZlcmVuY2UgeCkgY29uc3QgeyByZXR1cm4gJng7IH0KKyAgICBjb25zdF9wb2ludGVyIGFkZHJlc3MoY29uc3RfcmVmZXJlbmNlIHgpIGNvbnN0IHsgcmV0dXJuICZ4OyB9CisgICAgcG9pbnRlciBhbGxvY2F0ZSgKKyAgICAgIHNpemVfdHlwZSwgc2hhcmVkX2FsbG9jYXRvcjx2b2lkPjo6Y29uc3RfcG9pbnRlciBoaW50ID0gMCk7CisgICAgdm9pZCBkZWFsbG9jYXRlKHBvaW50ZXIgcCwgc2l6ZV90eXBlIG4pOworICAgIHNpemVfdHlwZSBtYXhfc2l6ZSgpIGNvbnN0IHRocm93KCkgeworICAgICAgcmV0dXJuIHNpemVfdHlwZSgtMSkvc2l6ZW9mKFQpOworICAgIH0gLyogbWF4X3NpemUgKi8KKyAgICB2b2lkIGNvbnN0cnVjdChwb2ludGVyIHAsIGNvbnN0IFQmIGFyZykgeworICAgICAgOjpuZXcgKHApIFQoYXJnKTsKKyAgICB9IC8qIGNvbnN0cnVjdCAqLworICAgIHZvaWQgZGVzdHJveShwb2ludGVyIHApIHsKKyAgICAgIHAtPn5UKCk7CisgICAgfSAvKiBkZXN0cm95ICovCisgIH07CisKKyAgLyogRGVmaW5pdGlvbiBmb3IgYWxsb2NhdGUuICovCisgIHRlbXBsYXRlIDxjbGFzcyBUPgorICB0eXBlbmFtZSBzaGFyZWRfYWxsb2NhdG9yPFQ+Ojpwb2ludGVyCisgIHNoYXJlZF9hbGxvY2F0b3I8VD46OmFsbG9jYXRlKHNoYXJlZF9hbGxvY2F0b3I8VD46OnNpemVfdHlwZSBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfYWxsb2NhdG9yPHZvaWQ+Ojpjb25zdF9wb2ludGVyKSB7CisgICAgLyogQWxsb2NhdGUgZnJvbSBzaGFyZWQgbWVtb3J5LiAqLworICAgIHZvaWQgKnB0ciA9IF9PZmZsb2FkX3NoYXJlZF9tYWxsb2MocypzaXplb2YoVCkpOworICAgIGlmIChwdHIgPT0gMCkgc3RkOjpfX3Rocm93X2JhZF9hbGxvYygpOworICAgIHJldHVybiBzdGF0aWNfY2FzdDxwb2ludGVyPihwdHIpOworICB9IC8qIGFsbG9jYXRlICovCisKKyAgdGVtcGxhdGUgPGNsYXNzIFQ+CisgIHZvaWQgc2hhcmVkX2FsbG9jYXRvcjxUPjo6ZGVhbGxvY2F0ZShwb2ludGVyIHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfYWxsb2NhdG9yPFQ+OjpzaXplX3R5cGUpIHsKKyAgICAvKiBGcmVlIHRoZSBzaGFyZWQgbWVtb3J5LiAqLworICAgIF9PZmZsb2FkX3NoYXJlZF9mcmVlKHApOworICB9IC8qIGRlYWxsb2NhdGUgKi8KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX1QxLCB0eXBlbmFtZSBfVDI+CisgIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3Qgc2hhcmVkX2FsbG9jYXRvcjxfVDE+ICYsIAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9hbGxvY2F0b3I8X1QyPiAmKSB0aHJvdygpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSAgLyogb3BlcmF0b3I9PSAqLworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfVDEsIHR5cGVuYW1lIF9UMj4KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBzaGFyZWRfYWxsb2NhdG9yPF9UMT4gJiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX2FsbG9jYXRvcjxfVDI+ICYpIHRocm93KCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfSAgLyogb3BlcmF0b3IhPSAqLworfSAgLyogX19vZmZsb2FkICovCisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmIC8qIE9GRkxPQURfSF9JTkNMVURFRCAqLwpkaWZmIC0tZ2l0IGEvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9jb21tb24uY3BwIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9jb21tb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2ODFiMDYKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX2NvbW1vbi5jcHAKQEAgLTAsMCArMSwxNzAgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmIGRlZmluZWQoTElOVVgpIHx8IGRlZmluZWQoRlJFRUJTRCkKKyNpbmNsdWRlIDxtbV9tYWxsb2MuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAib2ZmbG9hZF9jb21tb24uaCIKKworLy8gVGhlIGRlYnVnIHJvdXRpbmVzCisKKyNpZiBPRkZMT0FEX0RFQlVHID4gMAorCit2b2lkIF9fZHVtcF9ieXRlcygKKyAgICBpbnQgdHJhY2VfbGV2ZWwsCisgICAgY29uc3Qgdm9pZCAqZGF0YSwKKyAgICBpbnQgbGVuCispCit7CisgICAgaWYgKGNvbnNvbGVfZW5hYmxlZCA+IHRyYWNlX2xldmVsKSB7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmFyciA9IChjb25zdCB1aW50OF90KikgZGF0YTsKKyAgICAgICAgY2hhciBidWZmZXJbNDA5Nl07CisgICAgICAgIGNoYXIgKmJ1ZmZlcnA7CisgICAgICAgIGludCBjb3VudCA9IDA7CisKKyAgICAgICAgYnVmZmVycCA9IGJ1ZmZlcjsKKyAgICAgICAgd2hpbGUgKGxlbi0tKSB7CisgICAgICAgICAgICBzcHJpbnRmKGJ1ZmZlcnAsICIlMDJ4IiwgKmFycisrKTsKKyAgICAgICAgICAgIGJ1ZmZlcnAgKz0gMjsKKyAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgICAgICBpZiAoKGNvdW50JjMpID09IDApIHsKKyAgICAgICAgICAgICAgICBzcHJpbnRmKGJ1ZmZlcnAsICIgIik7CisgICAgICAgICAgICAgICAgYnVmZmVycCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChjb3VudCY2MykgPT0gMCkgeworICAgICAgICAgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UodHJhY2VfbGV2ZWwsICIlc1xuIiwgYnVmZmVyKTsKKyAgICAgICAgICAgICAgICBidWZmZXJwID0gYnVmZmVyOworICAgICAgICAgICAgICAgIGNvdW50ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoY291bnQpIHsKKyAgICAgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UodHJhY2VfbGV2ZWwsICIlc1xuIiwgYnVmZmVyKTsKKyAgICAgICAgfQorICAgIH0KK30KKyNlbmRpZiAvLyBPRkZMT0FEX0RFQlVHCisKKy8vIFRoZSBNYXJzaGFsbGVyIGFuZCBhc3NvY2lhdGVkIHJvdXRpbmVzCisKK3ZvaWQgTWFyc2hhbGxlcjo6c2VuZF9kYXRhKAorICAgIGNvbnN0IHZvaWQgKmRhdGEsCisgICAgaW50NjRfdCBsZW5ndGgKKykKK3sKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJzZW5kX2RhdGEoJXAsICVsbGQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwgbGVuZ3RoKTsKKyAgICBtZW1jcHkoYnVmZmVyX3B0ciwgZGF0YSwgKHNpemVfdClsZW5ndGgpOworICAgIGJ1ZmZlcl9wdHIgKz0gbGVuZ3RoOworICAgIHRmcl9zaXplICs9IGxlbmd0aDsKK30KKwordm9pZCBNYXJzaGFsbGVyOjpyZWNlaXZlX2RhdGEoCisgICAgdm9pZCAqZGF0YSwKKyAgICBpbnQ2NF90IGxlbmd0aAorKQoreworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgInJlY2VpdmVfZGF0YSglcCwgJWxsZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLCBsZW5ndGgpOworICAgIG1lbWNweShkYXRhLCBidWZmZXJfcHRyLCAoc2l6ZV90KWxlbmd0aCk7CisgICAgYnVmZmVyX3B0ciArPSBsZW5ndGg7CisgICAgdGZyX3NpemUgKz0gbGVuZ3RoOworfQorCisvLyBTZW5kIGZ1bmN0aW9uIHBvaW50ZXIKK3ZvaWQgTWFyc2hhbGxlcjo6c2VuZF9mdW5jX3B0cigKKyAgICBjb25zdCB2b2lkKiBkYXRhCispCit7CisgICAgY29uc3QgY2hhciogbmFtZTsKKyAgICBzaXplX3QgICAgICBsZW5ndGg7CisKKyAgICBpZiAoZGF0YSAhPSAwKSB7CisgICAgICAgIG5hbWUgPSBfX29mZmxvYWRfZnVuY3MuZmluZF9uYW1lKGRhdGEpOworICAgICAgICBpZiAobmFtZSA9PSAwKSB7CisjaWYgT0ZGTE9BRF9ERUJVRyA+IDAKKyAgICAgICAgICAgIGlmIChjb25zb2xlX2VuYWJsZWQgPiAyKSB7CisgICAgICAgICAgICAgICAgX19vZmZsb2FkX2Z1bmNzLmR1bXAoKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZiAvLyBPRkZMT0FEX0RFQlVHID4gMAorCisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfc2VuZF9mdW5jX3B0ciwgZGF0YSk7CisgICAgICAgICAgICBleGl0KDEpOworICAgICAgICB9CisgICAgICAgIGxlbmd0aCA9IHN0cmxlbihuYW1lKSArIDE7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBuYW1lID0gIiI7CisgICAgICAgIGxlbmd0aCA9IDE7CisgICAgfQorCisgICAgbWVtY3B5KGJ1ZmZlcl9wdHIsIG5hbWUsIGxlbmd0aCk7CisgICAgYnVmZmVyX3B0ciArPSBsZW5ndGg7CisgICAgdGZyX3NpemUgKz0gbGVuZ3RoOworfQorCisvLyBSZWNlaXZlIGZ1bmN0aW9uIHBvaW50ZXIKK3ZvaWQgTWFyc2hhbGxlcjo6cmVjZWl2ZV9mdW5jX3B0cigKKyAgICBjb25zdCB2b2lkKiogZGF0YQorKQoreworICAgIGNvbnN0IGNoYXIqIG5hbWU7CisgICAgc2l6ZV90ICAgICAgbGVuZ3RoOworCisgICAgbmFtZSA9IChjb25zdCBjaGFyKikgYnVmZmVyX3B0cjsKKyAgICBpZiAobmFtZVswXSAhPSAnXDAnKSB7CisgICAgICAgICpkYXRhID0gX19vZmZsb2FkX2Z1bmNzLmZpbmRfYWRkcihuYW1lKTsKKyAgICAgICAgaWYgKCpkYXRhID09IDApIHsKKyNpZiBPRkZMT0FEX0RFQlVHID4gMAorICAgICAgICAgICAgaWYgKGNvbnNvbGVfZW5hYmxlZCA+IDIpIHsKKyAgICAgICAgICAgICAgICBfX29mZmxvYWRfZnVuY3MuZHVtcCgpOworICAgICAgICAgICAgfQorI2VuZGlmIC8vIE9GRkxPQURfREVCVUcgPiAwCisKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19yZWNlaXZlX2Z1bmNfcHRyLCBuYW1lKTsKKyAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KKyAgICAgICAgbGVuZ3RoID0gc3RybGVuKG5hbWUpICsgMTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICpkYXRhID0gMDsKKyAgICAgICAgbGVuZ3RoID0gMTsKKyAgICB9CisKKyAgICBidWZmZXJfcHRyICs9IGxlbmd0aDsKKyAgICB0ZnJfc2l6ZSArPSBsZW5ndGg7Cit9CisKKy8vIEVuZCBvZiB0aGUgTWFyc2hhbGxlciBhbmQgYXNzb2NpYXRlZCByb3V0aW5lcworCitleHRlcm4gdm9pZCAqT0ZGTE9BRF9NQUxMT0MoCisgICAgc2l6ZV90IHNpemUsCisgICAgc2l6ZV90IGFsaWduCispCit7CisgICAgdm9pZCAqcHRyOworICAgIGludCAgIGVycjsKKworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIiVzKCVsbGQsICVsbGQpXG4iLCBfX2Z1bmNfXywgc2l6ZSwgYWxpZ24pOworCisgICAgaWYgKGFsaWduIDwgc2l6ZW9mKHZvaWQqKSkgeworICAgICAgICBhbGlnbiA9IHNpemVvZih2b2lkKik7CisgICAgfQorCisgICAgcHRyID0gX21tX21hbGxvYyhzaXplLCBhbGlnbik7CisgICAgaWYgKHB0ciA9PSBOVUxMKSB7CisgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19vZmZsb2FkX21hbGxvYywgc2l6ZSwgYWxpZ24pOworICAgICAgICBleGl0KDEpOworICAgIH0KKworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIiVzIHJldHVybmVkICVwXG4iLCBfX2Z1bmNfXywgcHRyKTsKKworICAgIHJldHVybiBwdHI7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX2NvbW1vbi5oIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWNiOGJiCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9jb21tb24uaApAQCAtMCwwICsxLDQ0NCBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisvKiEgXGZpbGUKKyAgICBcYnJpZWYgVGhlIHBhcnRzIG9mIHRoZSBydW50aW1lIGxpYnJhcnkgY29tbW9uIHRvIGhvc3QgYW5kIHRhcmdldAorKi8KKworI2lmbmRlZiBPRkZMT0FEX0NPTU1PTl9IX0lOQ0xVREVECisjZGVmaW5lIE9GRkxPQURfQ09NTU9OX0hfSU5DTFVERUQKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bWVtb3J5Lmg+CisKKyNpbmNsdWRlICJvZmZsb2FkLmgiCisjaW5jbHVkZSAib2ZmbG9hZF90YWJsZS5oIgorI2luY2x1ZGUgIm9mZmxvYWRfdHJhY2UuaCIKKyNpbmNsdWRlICJvZmZsb2FkX3RpbWVyLmgiCisjaW5jbHVkZSAib2ZmbG9hZF91dGlsLmgiCisjaW5jbHVkZSAiY2Vhbl91dGlsLmgiCisjaW5jbHVkZSAiZHZfdXRpbC5oIgorI2luY2x1ZGUgImxpYm9mZmxvYWRfZXJyb3JfY29kZXMuaCIKKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisvLyBUaGUgZGVidWcgcm91dGluZXMKKworLy8gSG9zdCBjb25zb2xlIGFuZCBmaWxlIGxvZ2dpbmcKK2V4dGVybiBpbnQgY29uc29sZV9lbmFibGVkOworZXh0ZXJuIGludCBvZmZsb2FkX3JlcG9ydF9sZXZlbDsKKworI2RlZmluZSBPRkZMT0FEX0RPX1RSQUNFIChvZmZsb2FkX3JlcG9ydF9sZXZlbCA9PSAzKQorCitleHRlcm4gY29uc3QgY2hhciAqcHJlZml4OworZXh0ZXJuIGludCBvZmZsb2FkX251bWJlcjsKKyNpZiAhSE9TVF9MSUJSQVJZCitleHRlcm4gaW50IG1pY19pbmRleDsKKyNlbmRpZgorCisjaWYgSE9TVF9MSUJSQVJZCit2b2lkIE9mZmxvYWRfUmVwb3J0X1Byb2xvZyhPZmZsb2FkSG9zdFRpbWVyRGF0YSogdGltZXJfZGF0YSk7Cit2b2lkIE9mZmxvYWRfUmVwb3J0X0VwaWxvZyhPZmZsb2FkSG9zdFRpbWVyRGF0YSogdGltZXJfZGF0YSk7Cit2b2lkIG9mZmxvYWRfcmVwb3J0X2ZyZWVfZGF0YShPZmZsb2FkSG9zdFRpbWVyRGF0YSAqIHRpbWVyX2RhdGEpOwordm9pZCBPZmZsb2FkX1RpbWVyX1ByaW50KHZvaWQpOworCisjaWZuZGVmIFRBUkdFVF9XSU5OVAorI2RlZmluZSBPRkZMT0FEX0RFQlVHX0lOQ1JfT0ZMRF9OVU0oKSBcCisgICAgICAgIF9fc3luY19hZGRfYW5kX2ZldGNoKCZvZmZsb2FkX251bWJlciwgMSkKKyNlbHNlCisjZGVmaW5lIE9GRkxPQURfREVCVUdfSU5DUl9PRkxEX05VTSgpIFwKKyAgICAgICAgX0ludGVybG9ja2VkSW5jcmVtZW50KHJlaW50ZXJwcmV0X2Nhc3Q8bG9uZyo+KCZvZmZsb2FkX251bWJlcikpCisjZW5kaWYKKworI2RlZmluZSBPRkZMT0FEX0RFQlVHX1BSSU5UX1RBR19QUkVGSVgoKSBcCisgICAgICAgIHByaW50ZigiJXM6ICAiLCBwcmVmaXgpOworCisjZGVmaW5lIE9GRkxPQURfREVCVUdfUFJJTlRfUFJFRklYKCkgXAorICAgICAgICBwcmludGYoIiVzOiAgIiwgcHJlZml4KTsKKyNlbHNlCisjZGVmaW5lIE9GRkxPQURfREVCVUdfUFJJTlRfUFJFRklYKCkgXAorICAgICAgICBwcmludGYoIiVzJWQ6ICAiLCBwcmVmaXgsIG1pY19pbmRleCk7CisjZW5kaWYgLy8gSE9TVF9MSUJSQVJZCisKKyNkZWZpbmUgT0ZGTE9BRF9UUkFDRSh0cmFjZV9sZXZlbCwgLi4uKSAgXAorICAgIGlmIChjb25zb2xlX2VuYWJsZWQgPj0gdHJhY2VfbGV2ZWwpIHsgXAorICAgICAgICBPRkZMT0FEX0RFQlVHX1BSSU5UX1BSRUZJWCgpOyBcCisgICAgICAgIHByaW50ZihfX1ZBX0FSR1NfXyk7IFwKKyAgICAgICAgZmZsdXNoKE5VTEwpOyBcCisgICAgfQorCisjaWYgT0ZGTE9BRF9ERUJVRyA+IDAKKworI2RlZmluZSBPRkZMT0FEX0RFQlVHX1RSQUNFKGxldmVsLCAuLi4pIFwKKyAgICBPRkZMT0FEX1RSQUNFKGxldmVsLCBfX1ZBX0FSR1NfXykKKworI2RlZmluZSBPRkZMT0FEX1JFUE9SVChsZXZlbCwgb2ZmbG9hZF9udW1iZXIsIHN0YWdlLCAuLi4pIFwKKyAgICBpZiAoT0ZGTE9BRF9ET19UUkFDRSkgeyBcCisgICAgICAgIG9mZmxvYWRfc3RhZ2VfcHJpbnQoc3RhZ2UsIG9mZmxvYWRfbnVtYmVyLCBfX1ZBX0FSR1NfXyk7IFwKKyAgICAgICAgZmZsdXNoKE5VTEwpOyBcCisgICAgfQorCisjZGVmaW5lIE9GRkxPQURfREVCVUdfVFJBQ0VfMShsZXZlbCwgb2ZmbG9hZF9udW1iZXIsIHN0YWdlLCAuLi4pIFwKKyAgICBpZiAoT0ZGTE9BRF9ET19UUkFDRSkgeyBcCisgICAgICAgIG9mZmxvYWRfc3RhZ2VfcHJpbnQoc3RhZ2UsIG9mZmxvYWRfbnVtYmVyLCBfX1ZBX0FSR1NfXyk7IFwKKyAgICAgICAgZmZsdXNoKE5VTEwpOyBcCisgICAgfSBcCisgICAgaWYgKCFPRkZMT0FEX0RPX1RSQUNFKSB7IFwKKyAgICAgICAgT0ZGTE9BRF9UUkFDRShsZXZlbCwgX19WQV9BUkdTX18pIFwKKyAgICB9CisKKyNkZWZpbmUgT0ZGTE9BRF9ERUJVR19EVU1QX0JZVEVTKGxldmVsLCBhLCBiKSBcCisgICAgX19kdW1wX2J5dGVzKGxldmVsLCBhLCBiKQorCitleHRlcm4gdm9pZCBfX2R1bXBfYnl0ZXMoCisgICAgaW50IGxldmVsLAorICAgIGNvbnN0IHZvaWQgKmRhdGEsCisgICAgaW50IGxlbgorKTsKKworI2Vsc2UKKworI2RlZmluZSBPRkZMT0FEX0RFQlVHX0xPRyhsZXZlbCwgLi4uKQorI2RlZmluZSBPRkZMT0FEX0RFQlVHX0RVTVBfQllURVMobGV2ZWwsIGEsIGIpCisKKyNlbmRpZgorCisvLyBSdW50aW1lIGludGVyZmFjZQorCisjZGVmaW5lIE9GRkxPQURfUFJFRklYKGEpIF9fb2ZmbG9hZF8jI2EKKworI2RlZmluZSBPRkZMT0FEX01BTExPQyAgICAgICAgICAgIE9GRkxPQURfUFJFRklYKG1hbGxvYykKKyNkZWZpbmUgT0ZGTE9BRF9GUkVFKGEpICAgICAgICAgICBfbW1fZnJlZShhKQorCisvLyBGb3J3YXJkIGZ1bmN0aW9ucworCitleHRlcm4gdm9pZCAqT0ZGTE9BRF9NQUxMT0Moc2l6ZV90IHNpemUsIHNpemVfdCBhbGlnbik7CisKKy8vIFRoZSBNYXJzaGFsbGVyCisKKy8vISBcZW51bSBJbmRpY2F0b3IgZm9yIHRoZSB0eXBlIG9mIGVudHJ5IG9uIGFuIG9mZmxvYWQgaXRlbSBsaXN0LgorZW51bSBPZmZsb2FkSXRlbVR5cGUgeworICAgIGNfZGF0YSA9ICAgMSwgICAgICAgLy8hPCBQbGFpbiBkYXRhCisgICAgY19kYXRhX3B0ciwgICAgICAgICAvLyE8IFBvaW50ZXIgZGF0YQorICAgIGNfZnVuY19wdHIsICAgICAgICAgLy8hPCBGdW5jdGlvbiBwb2ludGVyCisgICAgY192b2lkX3B0ciwgICAgICAgICAvLyE8IHZvaWQqCisgICAgY19zdHJpbmdfcHRyLCAgICAgICAvLyE8IEMgc3RyaW5nCisgICAgY19kdiwgICAgICAgICAgICAgICAvLyE8IERvcGUgdmVjdG9yIHZhcmlhYmxlCisgICAgY19kdl9kYXRhLCAgICAgICAgICAvLyE8IERvcGUtdmVjdG9yIGRhdGEKKyAgICBjX2R2X2RhdGFfc2xpY2UsICAgIC8vITwgRG9wZS12ZWN0b3IgZGF0YSdzIHNsaWNlCisgICAgY19kdl9wdHIsICAgICAgICAgICAvLyE8IERvcGUtdmVjdG9yIHZhcmlhYmxlIHBvaW50ZXIKKyAgICBjX2R2X3B0cl9kYXRhLCAgICAgIC8vITwgRG9wZS12ZWN0b3IgcG9pbnRlciBkYXRhCisgICAgY19kdl9wdHJfZGF0YV9zbGljZSwvLyE8IERvcGUtdmVjdG9yIHBvaW50ZXIgZGF0YSdzIHNsaWNlCisgICAgY19jZWFuX3ZhciwgICAgICAgICAvLyE8IENFQU4gdmFyaWFibGUKKyAgICBjX2NlYW5fdmFyX3B0ciwgICAgIC8vITwgUG9pbnRlciB0byBDRUFOIHZhcmlhYmxlCisgICAgY19kYXRhX3B0cl9hcnJheSwgICAvLyE8IFBvaW50ZXIgdG8gZGF0YSBwb2ludGVyIGFycmF5CisgICAgY19mdW5jX3B0cl9hcnJheSwgICAvLyE8IFBvaW50ZXIgdG8gZnVuY3Rpb24gcG9pbnRlciBhcnJheQorICAgIGNfdm9pZF9wdHJfYXJyYXksICAgLy8hPCBQb2ludGVyIHRvIHZvaWQqIHBvaW50ZXIgYXJyYXkKKyAgICBjX3N0cmluZ19wdHJfYXJyYXkgIC8vITwgUG9pbnRlciB0byBjaGFyKiBwb2ludGVyIGFycmF5Cit9OworCisjZGVmaW5lIFZBUl9UWVBFX0lTX1BUUih0KSAoKHQpID09IGNfc3RyaW5nX3B0ciB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHQpID09IGNfZGF0YV9wdHIgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0KSA9PSBjX2NlYW5fdmFyX3B0ciB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHQpID09IGNfZHZfcHRyKQorCisjZGVmaW5lIFZBUl9UWVBFX0lTX1NDQUxBUih0KSAoKHQpID09IGNfZGF0YSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHQpID09IGNfdm9pZF9wdHIgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0KSA9PSBjX2NlYW5fdmFyIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodCkgPT0gY19kdikKKworI2RlZmluZSBWQVJfVFlQRV9JU19EVl9EQVRBKHQpICgodCkgPT0gY19kdl9kYXRhIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHQpID09IGNfZHZfcHRyX2RhdGEpCisKKyNkZWZpbmUgVkFSX1RZUEVfSVNfRFZfREFUQV9TTElDRSh0KSAoKHQpID09IGNfZHZfZGF0YV9zbGljZSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0KSA9PSBjX2R2X3B0cl9kYXRhX3NsaWNlKQorCisKKy8vISBcZW51bSBTcGVjaWZ5IGRpcmVjdGlvbiB0byBjb3B5IG9mZmxvYWRlZCB2YXJpYWJsZS4KK2VudW0gT2ZmbG9hZFBhcmFtZXRlclR5cGUgeworICAgIGNfcGFyYW1ldGVyX3Vua25vd24gPSAtMSwgLy8hPCBVbmtub3duIGNsYXVzZQorICAgIGNfcGFyYW1ldGVyX25vY29weSwgICAgICAgLy8hPCBWYXJpYWJsZSBsaXN0ZWQgaW4gIm5vY29weSIgY2xhdXNlCisgICAgY19wYXJhbWV0ZXJfaW4sICAgICAgICAgICAvLyE8IFZhcmlhYmxlIGxpc3RlZCBpbiAiaW4iIGNsYXVzZQorICAgIGNfcGFyYW1ldGVyX291dCwgICAgICAgICAgLy8hPCBWYXJpYWJsZSBsaXN0ZWQgaW4gIm91dCIgY2xhdXNlCisgICAgY19wYXJhbWV0ZXJfaW5vdXQgICAgICAgICAvLyE8IFZhcmlhYmxlIGxpc3RlZCBpbiAiaW5vdXQiIGNsYXVzZQorfTsKKworLy8hIEFuIE9mZmxvYWQgVmFyaWFibGUgZGVzY3JpcHRvcgorc3RydWN0IFZhckRlc2MgeworICAgIC8vISBPZmZsb2FkSXRlbVR5cGVzIG9mIHNvdXJjZSBhbmQgZGVzdGluYXRpb24KKyAgICB1bmlvbiB7CisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICB1aW50OF90IGRzdCA6IDQ7IC8vITwgT2ZmbG9hZEl0ZW1UeXBlIG9mIGRlc3RpbmF0aW9uCisgICAgICAgICAgICB1aW50OF90IHNyYyA6IDQ7IC8vITwgT2ZmbG9hZEl0ZW1UeXBlIG9mIHNvdXJjZQorICAgICAgICB9OworICAgICAgICB1aW50OF90IGJpdHM7CisgICAgfSB0eXBlOworCisgICAgLy8hIE9mZmxvYWRQYXJhbWV0ZXJUeXBlIHRoYXQgZGVzY3JpYmVzIGRpcmVjdGlvbiBvZiBkYXRhIHRyYW5zZmVyCisgICAgdW5pb24geworICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgdWludDhfdCBpbiAgOiAxOyAvLyE8IFNldCBpZiBJTiBvciBJTk9VVAorICAgICAgICAgICAgdWludDhfdCBvdXQgOiAxOyAvLyE8IFNldCBpZiBPVVQgb3IgSU5PVVQKKyAgICAgICAgfTsKKyAgICAgICAgdWludDhfdCBiaXRzOworICAgIH0gZGlyZWN0aW9uOworCisgICAgdWludDhfdCBhbGxvY19pZjsgICAgICAgIC8vITwgYWxsb2NfaWYgbW9kaWZpZXIgdmFsdWUKKyAgICB1aW50OF90IGZyZWVfaWY7ICAgICAgICAgLy8hPCBmcmVlX2lmIG1vZGlmaWVyIHZhbHVlCisgICAgdWludDMyX3QgYWxpZ247ICAgICAgICAgIC8vITwgTUlDIGFsaWdubWVudCByZXF1ZXN0ZWQgZm9yIHBvaW50ZXIgZGF0YQorICAgIC8vISBOb3QgdXNlZCBieSBjb21waWxlcjsgc2V0IHRvIDAKKyAgICAvKiEgVXNlZCBieSBydW50aW1lIGFzIG9mZnNldCB0byBkYXRhIGZyb20gc3RhcnQgb2YgTUlDIGJ1ZmZlciAqLworICAgIHVpbnQzMl90IG1pY19vZmZzZXQ7CisgICAgLy8hIEZsYWdzIGRlc2NyaWJpbmcgdGhpcyB2YXJpYWJsZQorICAgIHVuaW9uIHsKKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIC8vISBzb3VyY2UgdmFyaWFibGUgaGFzIHBlcnNpc3RlbnQgc3RvcmFnZQorICAgICAgICAgICAgdWludDMyX3QgaXNfc3RhdGljIDogMTsKKyAgICAgICAgICAgIC8vISBkZXN0aW5hdGlvbiB2YXJpYWJsZSBoYXMgcGVyc2lzdGVudCBzdG9yYWdlCisgICAgICAgICAgICB1aW50MzJfdCBpc19zdGF0aWNfZHN0biA6IDE7CisgICAgICAgICAgICAvLyEgaGFzIGxlbmd0aCBmb3IgY19kdiAmJiBjX2R2X3B0cgorICAgICAgICAgICAgdWludDMyX3QgaGFzX2xlbmd0aCA6IDE7CisgICAgICAgICAgICAvLyEgcGVyc2lzdGVkIGxvY2FsIHNjYWxhciBpcyBpbiBzdGFjayBidWZmZXIKKyAgICAgICAgICAgIHVpbnQzMl90IGlzX3N0YWNrX2J1ZiA6IDE7CisgICAgICAgICAgICAvLyEgYnVmZmVyIGFkZHJlc3MgaXMgc2VudCBpbiBkYXRhCisgICAgICAgICAgICB1aW50MzJfdCBzaW5rX2FkZHIgOiAxOworICAgICAgICAgICAgLy8hIGFsbG9jIGRpc3BsYWNlbWVudCBpcyBzZW50IGluIGRhdGEKKyAgICAgICAgICAgIHVpbnQzMl90IGFsbG9jX2Rpc3AgOiAxOworICAgICAgICAgICAgLy8hIHNvdXJjZSBkYXRhIGlzIG5vbmNvbnRpZ3VvdXMKKyAgICAgICAgICAgIHVpbnQzMl90IGlzX25vbmNvbnRfc3JjIDogMTsKKyAgICAgICAgICAgIC8vISBkZXN0aW5hdGlvbiBkYXRhIGlzIG5vbmNvbnRpZ3VvdXMKKyAgICAgICAgICAgIHVpbnQzMl90IGlzX25vbmNvbnRfZHN0IDogMTsKKyAgICAgICAgfTsKKyAgICAgICAgdWludDMyX3QgYml0czsKKyAgICB9IGZsYWdzOworICAgIC8vISBOb3QgdXNlZCBieSBjb21waWxlcjsgc2V0IHRvIDAKKyAgICAvKiEgVXNlZCBieSBydW50aW1lIGFzIG9mZnNldCB0byBiYXNlIGZyb20gZGF0YSBzdG9yZWQgaW4gYSBidWZmZXIgKi8KKyAgICBpbnQ2NF90IG9mZnNldDsKKyAgICAvLyEgRWxlbWVudCBieXRlLXNpemUgb2YgZGF0YSB0byBiZSB0cmFuc2ZlcnJlZAorICAgIC8qISBGb3IgZG9wZS12ZWN0b3IsIHRoZSBzaXplIG9mIHRoZSBkb3BlLXZlY3RvciAgICAgICovCisgICAgaW50NjRfdCBzaXplOworICAgIHVuaW9uIHsKKyAgICAgICAgLy8hIFNldCB0byAwIGZvciBhcnJheSBleHByZXNzaW9ucyBhbmQgZG9wZS12ZWN0b3JzCisgICAgICAgIC8qISBTZXQgdG8gMSBmb3Igc2NhbGFycyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyohIFNldCB0byB2YWx1ZSBvZiBsZW5ndGggbW9kaWZpZXIgZm9yIHBvaW50ZXJzICAqLworICAgICAgICBpbnQ2NF90IGNvdW50OworICAgICAgICAvLyEgRGlzcGxhY2VtZW50IG5vdCB1c2VkIGJ5IGNvbXBpbGVyCisgICAgICAgIGludDY0X3QgZGlzcDsKKyAgICB9OworCisgICAgLy8hIFRoaXMgZmllbGQgbm90IHVzZWQgYnkgT3Blbk1QIDQuMAorICAgIC8qISBUaGUgYWxsb2Mgc2VjdGlvbiBleHByZXNzaW9uIGluICNwcmFnbWEgb2ZmbG9hZCAgICovCisgICAgdW5pb24geworICAgICAgIHZvaWQgKmFsbG9jOworICAgICAgIGludDY0X3QgcHRyX2Fycl9vZmZzZXQ7CisgICAgfTsKKworICAgIC8vISBUaGlzIGZpZWxkIG5vdCB1c2VkIGJ5IE9wZW5NUCA0LjAKKyAgICAvKiEgVGhlIGludG8gc2VjdGlvbiBleHByZXNzaW9uIGluICNwcmFnbWEgb2ZmbG9hZCAgICAqLworICAgIC8qISBGb3IgY19kYXRhX3B0cl9hcnJheSB0aGlzIGlzIHRoZSBpbnRvIHB0ciBhcnJheSAgICovCisgICAgdm9pZCAqaW50bzsKKworICAgIC8vISBGb3IgYW4gb3JkaW5hcnkgdmFyaWFibGUsIGFkZHJlc3Mgb2YgdGhlIHZhcmlhYmxlCisgICAgLyohIEZvciBjX2NlYW5fdmFyIChDL0MrKyBhcnJheSBleHByZXNzaW9uKSwKKyAgICAgICAgcG9pbnRlciB0byBhcnJfZGVzYywgd2hpY2ggaXMgYW4gYXJyYXkgZGVzY3JpcHRvci4gKi8KKyAgICAvKiEgRm9yIGNfZGF0YV9wdHJfYXJyYXkgKGFycmF5IG9mIGRhdGEgcG9pbnRlcnMpLAorICAgICAgICBwb2ludGVyIHRvIHB0cl9hcnJheV9kZXNjcmlwdG9yLAorICAgICAgICB3aGljaCBpcyBhIGRlc2NyaXB0b3IgZm9yIHBvaW50ZXIgYXJyYXkgdHJhbnNmZXJzLiAqLworICAgIHZvaWQgKnB0cjsKK307CisKKy8vISBBdXhpbGlhcnkgc3RydWN0IHVzZWQgd2hlbiAtZyBpcyBlbmFibGVkIHRoYXQgaG9sZHMgdmFyaWFibGUgbmFtZXMKK3N0cnVjdCBWYXJEZXNjMiB7CisgICAgY29uc3QgY2hhciAqc25hbWU7IC8vITwgU291cmNlIG5hbWUKKyAgICBjb25zdCBjaGFyICpkbmFtZTsgLy8hPCBEZXN0aW5hdGlvbiBuYW1lICh3aGVuICJpbnRvIiBpcyB1c2VkKQorfTsKKworLyohIFdoZW4gdGhlIE9mZmxvYWRJdGVtVHlwZSBpcyBjX2RhdGFfcHRyX2FycmF5CisgICAgdGhlIHB0ciBmaWVsZCBvZiB0aGUgbWFpbiBkZXNjcmlwdG9yIHBvaW50cyB0byB0aGlzIHN0cnVjdC4gICAgICAgICAgKi8KKy8qISBUaGUgdHlwZSBpbiBWYXJEZXNjMSBtZXJlbHkgc2F5cyBjX2NlYW5fZGF0YV9wdHIsIGJ1dCB0aGUgcG9pbnRlcgorICAgIHR5cGUgY2FuIGJlIGNfZGF0YV9wdHIsIGNfZnVuY19wdHIsIGNfdm9pZF9wdHIsIG9yIGNfc3RyaW5nX3B0ci4KKyAgICBUaGVyZWZvcmUgdGhlIGFjdHVhbCBwb2ludGVyIHR5cGUgaXMgaW4gdGhlIGZsYWdzIGZpZWxkIG9mIFZhckRlc2MzLiAqLworLyohIElmIGZsYWdfYWxpZ25faXNfYXJyYXkvZmxhZ19hbGxvY19pZl9pc19hcnJheS9mbGFnX2ZyZWVfaWZfaXNfYXJyYXkKKyAgICBpcyAwIHRoZW4gYWxpZ25tZW50L2FsbG9jX2lmL2ZyZWVfaWYgYXJlIHNwZWNpZmllZCBpbiBWYXJEZXNjMS4gICAgICAqLworLyohIElmIGZsYWdfYWxpZ25faXNfYXJyYXkvZmxhZ19hbGxvY19pZl9pc19hcnJheS9mbGFnX2ZyZWVfaWZfaXNfYXJyYXkKKyAgICBpcyAxIHRoZW4gYWxpZ25fYXJyYXkvYWxsb2NfaWZfYXJyYXkvZnJlZV9pZl9hcnJheSBzcGVjaWZ5CisgICAgdGhlIHNldCBvZiBhbGlnbm1lbnQvYWxsb2NfaWYvZnJlZV9pZiB2YWx1ZXMuICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qISBGb3IgdGhlIG90aGVyIGZpZWxkcywgaWYgbmVpdGhlciB0aGUgc2NhbGFyIG5vciB0aGUgYXJyYXkgZmxhZworICAgIGlzIHNldCwgdGhlbiB0aGF0IG1vZGlmaWVyIHdhcyBub3Qgc3BlY2lmaWVkLiBJZiB0aGUgYml0cyBhcmUgc2V0CisgICAgdGhleSBzcGVjaWZ5IHdoaWNoIG1vZGlmaWVyIHdhcyBzZXQgYW5kIHdoZXRoZXIgaXQgd2FzIGEKKyAgICBzY2FsYXIgb3IgYW4gYXJyYXkgZXhwcmVzc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworc3RydWN0IFZhckRlc2MzCit7CisgICAgdm9pZCAqcHRyX2FycmF5OyAgICAgICAgLy8hPCBQb2ludGVyIHRvIGFycl9kZXNjIG9mIGFycmF5IG9mIHBvaW50ZXJzCisgICAgdm9pZCAqYWxpZ25fYXJyYXk7ICAgICAgLy8hPCBTY2FsYXIgdmFsdWUgb3IgcG9pbnRlciB0byBhcnJfZGVzYworICAgIHZvaWQgKmFsbG9jX2lmX2FycmF5OyAgIC8vITwgU2NhbGFyIHZhbHVlIG9yIHBvaW50ZXIgdG8gYXJyX2Rlc2MKKyAgICB2b2lkICpmcmVlX2lmX2FycmF5OyAgICAvLyE8IFNjYWxhciB2YWx1ZSBvciBwb2ludGVyIHRvIGFycl9kZXNjCisgICAgdm9pZCAqZXh0ZW50X3N0YXJ0OyAgICAgLy8hPCBTY2FsYXIgdmFsdWUgb3IgcG9pbnRlciB0byBhcnJfZGVzYworICAgIHZvaWQgKmV4dGVudF9lbGVtZW50czsgIC8vITwgU2NhbGFyIHZhbHVlIG9yIHBvaW50ZXIgdG8gYXJyX2Rlc2MKKyAgICB2b2lkICppbnRvX3N0YXJ0OyAgICAgICAvLyE8IFNjYWxhciB2YWx1ZSBvciBwb2ludGVyIHRvIGFycl9kZXNjCisgICAgdm9pZCAqaW50b19lbGVtZW50czsgICAgLy8hPCBTY2FsYXIgdmFsdWUgb3IgcG9pbnRlciB0byBhcnJfZGVzYworICAgIHZvaWQgKmFsbG9jX3N0YXJ0OyAgICAgIC8vITwgU2NhbGFyIHZhbHVlIG9yIHBvaW50ZXIgdG8gYXJyX2Rlc2MKKyAgICB2b2lkICphbGxvY19lbGVtZW50czsgICAvLyE8IFNjYWxhciB2YWx1ZSBvciBwb2ludGVyIHRvIGFycl9kZXNjCisgICAgLyohIEZsYWdzIHRoYXQgZGVzY3JpYmUgdGhlIHBvaW50ZXIgdHlwZSBhbmQgd2hldGhlciBlYWNoIGZpZWxkCisgICAgICAgIGlzIGEgc2NhbGFyIHZhbHVlIG9yIGFuIGFycmF5IGV4cHJlc3Npb24uICAgICAgICAqLworICAgIC8qISBGaXJzdCA2IGJpdHMgYXJlIHBvaW50ZXIgYXJyYXkgZWxlbWVudCB0eXBlOgorICAgICAgICBjX2RhdGFfcHRyLCBjX2Z1bmNfcHRyLCBjX3ZvaWRfcHRyLCBjX3N0cmluZ19wdHIgKi8KKyAgICAvKiEgVGhlbiBzaW5nbGUgYml0cyBzcGVjaWZ5OiAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyohICAgICBhbGlnbl9hcnJheSBpcyBhbiBhcnJheSAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qISAgICAgYWxsb2NfaWZfYXJyYXkgaXMgYW4gYXJyYXkgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiEgICAgIGZyZWVfaWZfYXJyYXkgaXMgYW4gYXJyYXkgICAgICAgICAgICAgICAgICAgICovCisgICAgLyohICAgICBleHRlbnRfc3RhcnQgaXMgYSBzY2FsYXIgZXhwcmVzc2lvbiAgICAgICAgICAqLworICAgIC8qISAgICAgZXh0ZW50X3N0YXJ0IGlzIGFuIGFycmF5IGV4cHJlc3Npb24gICAgICAgICAgKi8KKyAgICAvKiEgICAgIGV4dGVudF9lbGVtZW50cyBpcyBhIHNjYWxhciBleHByZXNzaW9uICAgICAgICovCisgICAgLyohICAgICBleHRlbnRfZWxlbWVudHMgaXMgYW4gYXJyYXkgZXhwcmVzc2lvbiAgICAgICAqLworICAgIC8qISAgICAgaW50b19zdGFydCBpcyBhIHNjYWxhciBleHByZXNzaW9uICAgICAgICAgICAgKi8KKyAgICAvKiEgICAgIGludG9fc3RhcnQgaXMgYW4gYXJyYXkgZXhwcmVzc2lvbiAgICAgICAgICAgICovCisgICAgLyohICAgICBpbnRvX2VsZW1lbnRzIGlzIGEgc2NhbGFyIGV4cHJlc3Npb24gICAgICAgICAqLworICAgIC8qISAgICAgaW50b19lbGVtZW50cyBpcyBhbiBhcnJheSBleHByZXNzaW9uICAgICAgICAgKi8KKyAgICAvKiEgICAgIGFsbG9jX3N0YXJ0IGlzIGEgc2NhbGFyIGV4cHJlc3Npb24gICAgICAgICAgICovCisgICAgLyohICAgICBhbGxvY19zdGFydCBpcyBhbiBhcnJheSBleHByZXNzaW9uICAgICAgICAgICAqLworICAgIC8qISAgICAgYWxsb2NfZWxlbWVudHMgaXMgYSBzY2FsYXIgZXhwcmVzc2lvbiAgICAgICAgKi8KKyAgICAvKiEgICAgIGFsbG9jX2VsZW1lbnRzIGlzIGFuIGFycmF5IGV4cHJlc3Npb24gICAgICAgICovCisgICAgdWludDMyX3QgYXJyYXlfZmllbGRzOworfTsKK2NvbnN0IGludCBmbGFnX2FsaWduX2lzX2FycmF5ID0gNjsKK2NvbnN0IGludCBmbGFnX2FsbG9jX2lmX2lzX2FycmF5ID0gNzsKK2NvbnN0IGludCBmbGFnX2ZyZWVfaWZfaXNfYXJyYXkgPSA4OworY29uc3QgaW50IGZsYWdfZXh0ZW50X3N0YXJ0X2lzX3NjYWxhciA9IDk7Citjb25zdCBpbnQgZmxhZ19leHRlbnRfc3RhcnRfaXNfYXJyYXkgPSAxMDsKK2NvbnN0IGludCBmbGFnX2V4dGVudF9lbGVtZW50c19pc19zY2FsYXIgPSAxMTsKK2NvbnN0IGludCBmbGFnX2V4dGVudF9lbGVtZW50c19pc19hcnJheSA9IDEyOworY29uc3QgaW50IGZsYWdfaW50b19zdGFydF9pc19zY2FsYXIgPSAxMzsKK2NvbnN0IGludCBmbGFnX2ludG9fc3RhcnRfaXNfYXJyYXkgPSAxNDsKK2NvbnN0IGludCBmbGFnX2ludG9fZWxlbWVudHNfaXNfc2NhbGFyID0gMTU7Citjb25zdCBpbnQgZmxhZ19pbnRvX2VsZW1lbnRzX2lzX2FycmF5ID0gMTY7Citjb25zdCBpbnQgZmxhZ19hbGxvY19zdGFydF9pc19zY2FsYXIgPSAxNzsKK2NvbnN0IGludCBmbGFnX2FsbG9jX3N0YXJ0X2lzX2FycmF5ID0gMTg7Citjb25zdCBpbnQgZmxhZ19hbGxvY19lbGVtZW50c19pc19zY2FsYXIgPSAxOTsKK2NvbnN0IGludCBmbGFnX2FsbG9jX2VsZW1lbnRzX2lzX2FycmF5ID0gMjA7CisKKy8vIFRoZSBNYXJzaGFsbGVyCitjbGFzcyBNYXJzaGFsbGVyCit7Citwcml2YXRlOgorICAgIC8vIFN0YXJ0IGFkZHJlc3Mgb2YgYnVmZmVyCisgICAgY2hhciAqYnVmZmVyX3N0YXJ0OworCisgICAgLy8gQ3VycmVudCBwb2ludGVyIHdpdGhpbiBidWZmZXIKKyAgICBjaGFyICpidWZmZXJfcHRyOworCisgICAgLy8gUGh5c2ljYWwgc2l6ZSBvZiBkYXRhIHNlbnQgKGluY2x1ZGluZyBmbGFncykKKyAgICBsb25nIGxvbmcgYnVmZmVyX3NpemU7CisKKyAgICAvLyBVc2VyIGRhdGEgc2VudC9yZWNlaXZlZAorICAgIGxvbmcgbG9uZyB0ZnJfc2l6ZTsKKworcHVibGljOgorICAgIC8vIENvbnN0cnVjdG9yCisgICAgTWFyc2hhbGxlcigpIDoKKyAgICAgICAgYnVmZmVyX3N0YXJ0KDApLCBidWZmZXJfcHRyKDApLAorICAgICAgICBidWZmZXJfc2l6ZSgwKSwgdGZyX3NpemUoMCkKKyAgICB7CisgICAgfQorCisgICAgLy8gUmV0dXJuIGNvdW50IG9mIHVzZXIgZGF0YSBzZW50L3JlY2VpdmVkCisgICAgbG9uZyBsb25nIGdldF90ZnJfc2l6ZSgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gdGZyX3NpemU7CisgICAgfQorCisgICAgLy8gUmV0dXJuIHBvaW50ZXIgdG8gYnVmZmVyCisgICAgY2hhciAqZ2V0X2J1ZmZlcl9zdGFydCgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gYnVmZmVyX3N0YXJ0OworICAgIH0KKworICAgIC8vIFJldHVybiBjdXJyZW50IHNpemUgb2YgZGF0YSBpbiBidWZmZXIKKyAgICBsb25nIGxvbmcgZ2V0X2J1ZmZlcl9zaXplKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBidWZmZXJfc2l6ZTsKKyAgICB9CisKKyAgICAvLyBTZXQgYnVmZmVyIHBvaW50ZXIKKyAgICB2b2lkIGluaXRfYnVmZmVyKAorICAgICAgICBjaGFyICpkLAorICAgICAgICBsb25nIGxvbmcgcworICAgICkKKyAgICB7CisgICAgICAgIGJ1ZmZlcl9zdGFydCA9IGJ1ZmZlcl9wdHIgPSBkOworICAgICAgICBidWZmZXJfc2l6ZSA9IHM7CisgICAgfQorCisgICAgLy8gU2VuZCBkYXRhCisgICAgdm9pZCBzZW5kX2RhdGEoCisgICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsCisgICAgICAgIGludDY0X3QgbGVuZ3RoCisgICAgKTsKKworICAgIC8vIFJlY2VpdmUgZGF0YQorICAgIHZvaWQgcmVjZWl2ZV9kYXRhKAorICAgICAgICB2b2lkICpkYXRhLAorICAgICAgICBpbnQ2NF90IGxlbmd0aAorICAgICk7CisKKyAgICAvLyBTZW5kIGZ1bmN0aW9uIHBvaW50ZXIKKyAgICB2b2lkIHNlbmRfZnVuY19wdHIoCisgICAgICAgIGNvbnN0IHZvaWQqIGRhdGEKKyAgICApOworCisgICAgLy8gUmVjZWl2ZSBmdW5jdGlvbiBwb2ludGVyCisgICAgdm9pZCByZWNlaXZlX2Z1bmNfcHRyKAorICAgICAgICBjb25zdCB2b2lkKiogZGF0YQorICAgICk7Cit9OworCisvLyBFbmQgb2YgdGhlIE1hcnNoYWxsZXIKKworLy8gVGhlIG9mZmxvYWRlZCBmdW5jdGlvbiBkZXNjcmlwdG9yLgorLy8gU2VudCBmcm9tIGhvc3QgdG8gdGFyZ2V0IHRvIHNwZWNpZnkgd2hpY2ggZnVuY3Rpb24gdG8gcnVuLgorLy8gQWxzbywgc2V0cyBjb25zb2xlIGFuZCBmaWxlIHRyYWNpbmcgbGV2ZWxzLgorc3RydWN0IEZ1bmN0aW9uRGVzY3JpcHRvcgoreworICAgIC8vIElucHV0IGRhdGEgc2l6ZS4KKyAgICBsb25nIGxvbmcgaW5fZGF0YWxlbjsKKworICAgIC8vIE91dHB1dCBkYXRhIHNpemUuCisgICAgbG9uZyBsb25nIG91dF9kYXRhbGVuOworCisgICAgLy8gV2hldGhlciB0cmFjZSBpcyByZXF1ZXN0ZWQgb24gY29uc29sZS4KKyAgICAvLyBBIHZhbHVlIG9mIDEgcHJvZHVjZXMgb25seSBmdW5jdGlvbiBuYW1lIGFuZCBkYXRhIHNlbnQvcmVjZWl2ZWQuCisgICAgLy8gVmFsdWVzID4gMSBwcm9kdWNlIGNvcGlvdXMgdHJhY2UgaW5mb3JtYXRpb24uCisgICAgdWludDhfdCBjb25zb2xlX2VuYWJsZWQ7CisKKyAgICAvLyBGbGFnIGNvbnRyb2xsaW5nIHRpbWluZyBvbiB0aGUgdGFyZ2V0IHNpZGUuCisgICAgLy8gVmFsdWVzID4gMCBlbmFibGUgdGltaW5nIG9uIHNpbmsuCisgICAgdWludDhfdCB0aW1lcl9lbmFibGVkOworCisgICAgaW50IG9mZmxvYWRfcmVwb3J0X2xldmVsOworICAgIGludCBvZmZsb2FkX251bWJlcjsKKworICAgIC8vIG51bWJlciBvZiB2YXJpYWJsZSBkZXNjcmlwdG9ycworICAgIGludCB2YXJzX251bTsKKworICAgIC8vIGlub3V0IGRhdGEgb2Zmc2V0IGlmIGRhdGEgaXMgcGFzc2VkIGFzIG1pc2MvcmV0dXJuIGRhdGEKKyAgICAvLyBvdGhlcndpc2UgaXQgc2hvdWxkIGJlIHplcm8uCisgICAgaW50IGRhdGFfb2Zmc2V0OworCisgICAgLy8gVGhlIG5hbWUgb2YgdGhlIG9mZmxvYWRlZCBmdW5jdGlvbgorICAgIGNoYXIgZGF0YVtdOworfTsKKworLy8gdHlwZWRlZiBPRkZMT0FELgorLy8gUG9pbnRlciB0byBPZmZsb2FkRGVzY3JpcHRvci4KK3R5cGVkZWYgc3RydWN0IE9mZmxvYWREZXNjcmlwdG9yICpPRkZMT0FEOworCisjZW5kaWYgLy8gT0ZGTE9BRF9DT01NT05fSF9JTkNMVURFRApkaWZmIC0tZ2l0IGEvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9lbmdpbmUuY3BwIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9lbmdpbmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2OWI2MDQKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX2VuZ2luZS5jcHAKQEAgLTAsMCArMSw1MzEgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgIm9mZmxvYWRfZW5naW5lLmgiCisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJvZmZsb2FkX2hvc3QuaCIKKyNpbmNsdWRlICJvZmZsb2FkX3RhYmxlLmgiCisKK2NvbnN0IGNoYXIqIEVuZ2luZTo6bV9mdW5jX25hbWVzW0VuZ2luZTo6Y19mdW5jc190b3RhbF0gPQoreworICAgICJzZXJ2ZXJfY29tcHV0ZSIsCisjaWZkZWYgTVlPX1NVUFBPUlQKKyAgICAic2VydmVyX215b2luaXQiLAorICAgICJzZXJ2ZXJfbXlvZmluaSIsCisjZW5kaWYgLy8gTVlPX1NVUFBPUlQKKyAgICAic2VydmVyX2luaXQiLAorICAgICJzZXJ2ZXJfdmFyX3RhYmxlX3NpemUiLAorICAgICJzZXJ2ZXJfdmFyX3RhYmxlX2NvcHkiCit9OworCisvLyBTeW1ib2xpYyByZXByZXNlbnRhdGlvbiBvZiBzeXN0ZW0gc2lnbmFscy4gRml4IGZvciBDUTIzMzU5MworY29uc3QgY2hhciogRW5naW5lOjpjX3NpZ25hbF9uYW1lc1tFbmdpbmU6OmNfc2lnbmFsX21heF0gPQoreworICAgICJVbmtub3duIFNJR05BTCIsCisgICAgIlNJR0hVUCIsICAgIC8qICAxLCBIYW5ndXAgKFBPU0lYKS4gICovCisgICAgIlNJR0lOVCIsICAgIC8qICAyLCBJbnRlcnJ1cHQgKEFOU0kpLiAgKi8KKyAgICAiU0lHUVVJVCIsICAgLyogIDMsIFF1aXQgKFBPU0lYKS4gICovCisgICAgIlNJR0lMTCIsICAgIC8qICA0LCBJbGxlZ2FsIGluc3RydWN0aW9uIChBTlNJKS4gICovCisgICAgIlNJR1RSQVAiLCAgIC8qICA1LCBUcmFjZSB0cmFwIChQT1NJWCkuICAqLworICAgICJTSUdBQlJUIiwgICAvKiAgNiwgQWJvcnQgKEFOU0kpLiAgKi8KKyAgICAiU0lHQlVTIiwgICAgLyogIDcsIEJVUyBlcnJvciAoNC4yIEJTRCkuICAqLworICAgICJTSUdGUEUiLCAgICAvKiAgOCwgRmxvYXRpbmctcG9pbnQgZXhjZXB0aW9uIChBTlNJKS4gICovCisgICAgIlNJR0tJTEwiLCAgIC8qICA5LCBLaWxsLCB1bmJsb2NrYWJsZSAoUE9TSVgpLiAgKi8KKyAgICAiU0lHVVNSMSIsICAgLyogMTAsIFVzZXItZGVmaW5lZCBzaWduYWwgMSAoUE9TSVgpLiAgKi8KKyAgICAiU0lHU0VHViIsICAgLyogMTEsIFNlZ21lbnRhdGlvbiB2aW9sYXRpb24gKEFOU0kpLiAgKi8KKyAgICAiU0lHVVNSMiIsICAgLyogMTIsIFVzZXItZGVmaW5lZCBzaWduYWwgMiAoUE9TSVgpLiAgKi8KKyAgICAiU0lHUElQRSIsICAgLyogMTMsIEJyb2tlbiBwaXBlIChQT1NJWCkuICAqLworICAgICJTSUdBTFJNIiwgICAvKiAxNCwgQWxhcm0gY2xvY2sgKFBPU0lYKS4gICovCisgICAgIlNJR1RFUk0iLCAgIC8qIDE1LCBUZXJtaW5hdGlvbiAoQU5TSSkuICAqLworICAgICJTSUdTVEtGTFQiLCAvKiAxNiwgU3RhY2sgZmF1bHQuICAqLworICAgICJTSUdDSExEIiwgICAvKiAxNywgQ2hpbGQgc3RhdHVzIGhhcyBjaGFuZ2VkIChQT1NJWCkuICAqLworICAgICJTSUdDT05UIiwgICAvKiAxOCwgQ29udGludWUgKFBPU0lYKS4gICovCisgICAgIlNJR1NUT1AiLCAgIC8qIDE5LCBTdG9wLCB1bmJsb2NrYWJsZSAoUE9TSVgpLiAgKi8KKyAgICAiU0lHVFNUUCIsICAgLyogMjAsIEtleWJvYXJkIHN0b3AgKFBPU0lYKS4gICovCisgICAgIlNJR1RUSU4iLCAgIC8qIDIxLCBCYWNrZ3JvdW5kIHJlYWQgZnJvbSB0dHkgKFBPU0lYKS4gICovCisgICAgIlNJR1RUT1UiLCAgIC8qIDIyLCBCYWNrZ3JvdW5kIHdyaXRlIHRvIHR0eSAoUE9TSVgpLiAgKi8KKyAgICAiU0lHVVJHIiwgICAgLyogMjMsIFVyZ2VudCBjb25kaXRpb24gb24gc29ja2V0ICg0LjIgQlNEKS4gICovCisgICAgIlNJR1hDUFUiLCAgIC8qIDI0LCBDUFUgbGltaXQgZXhjZWVkZWQgKDQuMiBCU0QpLiAgKi8KKyAgICAiU0lHWEZTWiIsICAgLyogMjUsIEZpbGUgc2l6ZSBsaW1pdCBleGNlZWRlZCAoNC4yIEJTRCkuICAqLworICAgICJTSUdWVEFMUk0iLCAvKiAyNiwgVmlydHVhbCBhbGFybSBjbG9jayAoNC4yIEJTRCkuICAqLworICAgICJTSUdQUk9GIiwgICAvKiAyNywgUHJvZmlsaW5nIGFsYXJtIGNsb2NrICg0LjIgQlNEKS4gICovCisgICAgIlNJR1dJTkNIIiwgIC8qIDI4LCBXaW5kb3cgc2l6ZSBjaGFuZ2UgKDQuMyBCU0QsIFN1bikuICAqLworICAgICJTSUdJTyIsICAgICAvKiAyOSwgSS9PIG5vdyBwb3NzaWJsZSAoNC4yIEJTRCkuICAqLworICAgICJTSUdQV1IiLCAgICAvKiAzMCwgUG93ZXIgZmFpbHVyZSByZXN0YXJ0IChTeXN0ZW0gVikuICAqLworICAgICJTSUdTWVMiICAgICAvKiAzMSwgQmFkIHN5c3RlbSBjYWxsLiAgKi8KK307CisKK3ZvaWQgRW5naW5lOjppbml0KHZvaWQpCit7CisgICAgaWYgKCFtX3JlYWR5KSB7CisgICAgICAgIG11dGV4X2xvY2tlcl90IGxvY2tlcihtX2xvY2spOworCisgICAgICAgIGlmICghbV9yZWFkeSkgeworICAgICAgICAgICAgLy8gc3RhcnQgcHJvY2VzcyBpZiBub3QgZG9uZSB5ZXQKKyAgICAgICAgICAgIGlmIChtX3Byb2Nlc3MgPT0gMCkgeworICAgICAgICAgICAgICAgIGluaXRfcHJvY2VzcygpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBsb2FkIHBlbmdpbmcgaW1hZ2VzCisgICAgICAgICAgICBsb2FkX2xpYnJhcmllcygpOworCisgICAgICAgICAgICAvLyBhbmQgKHJlKWJ1aWxkIHBvaW50ZXIgdGFibGUKKyAgICAgICAgICAgIGluaXRfcHRyX2RhdGEoKTsKKworICAgICAgICAgICAgLy8gaXQgaXMgcmVhZHkgbm93CisgICAgICAgICAgICBtX3JlYWR5ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBFbmdpbmU6OmluaXRfcHJvY2Vzcyh2b2lkKQoreworICAgIENPSUVOR0lORSBlbmdpbmU7CisgICAgQ09JUkVTVUxUIHJlczsKKyAgICBjb25zdCBjaGFyICoqZW52aXJvbjsKKworICAgIC8vIGNyZWF0ZSBlbnZpcm9ubWVudCBmb3IgdGhlIHRhcmdldCBwcm9jZXNzCisgICAgZW52aXJvbiA9IChjb25zdCBjaGFyKiopIG1pY19lbnZfdmFycy5jcmVhdGVfZW52aXJvbl9mb3JfY2FyZChtX2luZGV4KTsKKyAgICBpZiAoZW52aXJvbiAhPSAwKSB7CisgICAgICAgIGZvciAoY29uc3QgY2hhciAqKnAgPSBlbnZpcm9uOyAqcCAhPSAwOyBwKyspIHsKKyAgICAgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMywgIkVudiBWYXIgZm9yIGNhcmQgJWQ6ICVzXG4iLCBtX2luZGV4LCAqcCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBDcmVhdGUgZXhlY3V0aW9uIGNvbnRleHQgaW4gdGhlIHNwZWNpZmllZCBkZXZpY2UKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJHZXR0aW5nIGRldmljZSAlZCAoZW5naW5lICVkKSBoYW5kbGVcbiIsIG1faW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICBtX3BoeXNpY2FsX2luZGV4KTsKKyAgICByZXMgPSBDT0k6OkVuZ2luZUdldEhhbmRsZShDT0lfSVNBX0tOQywgbV9waHlzaWNhbF9pbmRleCwgJmVuZ2luZSk7CisgICAgY2hlY2tfcmVzdWx0KHJlcywgY19nZXRfZW5naW5lX2hhbmRsZSwgbV9pbmRleCwgcmVzKTsKKworICAgIC8vIFRhcmdldCBleGVjdXRhYmxlIHNob3VsZCBiZSBhdmFpbGFibGUgYnkgdGhlIHRpbWUgd2hlbiB3ZQorICAgIC8vIGF0dGVtcHQgdG8gaW5pdGlhbGl6ZSB0aGUgZGV2aWNlCisgICAgaWYgKF9fdGFyZ2V0X2V4ZSA9PSAwKSB7CisgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19ub190YXJnZXRfZXhlKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsCisgICAgICAgICJMb2FkaW5nIHRhcmdldCBleGVjdXRhYmxlIFwiJXNcIiBmcm9tICVwLCBzaXplICVsbGRcbiIsCisgICAgICAgIF9fdGFyZ2V0X2V4ZS0+bmFtZSwgX190YXJnZXRfZXhlLT5kYXRhLCBfX3RhcmdldF9leGUtPnNpemUpOworCisgICAgcmVzID0gQ09JOjpQcm9jZXNzQ3JlYXRlRnJvbU1lbW9yeSgKKyAgICAgICAgZW5naW5lLCAgICAgICAgICAgICAgICAgLy8gaW5fRW5naW5lCisgICAgICAgIF9fdGFyZ2V0X2V4ZS0+bmFtZSwgICAgIC8vIGluX3BCaW5hcnlOYW1lCisgICAgICAgIF9fdGFyZ2V0X2V4ZS0+ZGF0YSwgICAgIC8vIGluX3BCaW5hcnlCdWZmZXIKKyAgICAgICAgX190YXJnZXRfZXhlLT5zaXplLCAgICAgLy8gaW5fQmluYXJ5QnVmZmVyTGVuZ3RoLAorICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvLyBpbl9BcmdjCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8vIGluX3BwQXJndgorICAgICAgICBlbnZpcm9uID09IDAsICAgICAgICAgICAvLyBpbl9EdXBFbnYKKyAgICAgICAgZW52aXJvbiwgICAgICAgICAgICAgICAgLy8gaW5fcHBBZGRpdGlvbmFsRW52CisgICAgICAgIG1pY19wcm94eV9pbywgICAgICAgICAgIC8vIGluX1Byb3h5QWN0aXZlCisgICAgICAgIG1pY19wcm94eV9mc19yb290LCAgICAgIC8vIGluX1Byb3h5ZnNSb290CisgICAgICAgIG1pY19idWZmZXJfc2l6ZSwgICAgICAgIC8vIGluX0J1ZmZlclNwYWNlCisgICAgICAgIG1pY19saWJyYXJ5X3BhdGgsICAgICAgIC8vIGluX0xpYnJhcnlTZWFyY2hQYXRoCisgICAgICAgIF9fdGFyZ2V0X2V4ZS0+b3JpZ2luLCAgIC8vIGluX0ZpbGVPZk9yaWdpbgorICAgICAgICBfX3RhcmdldF9leGUtPm9mZnNldCwgICAvLyBpbl9GaWxlT2ZPcmlnaW5PZmZzZXQKKyAgICAgICAgJm1fcHJvY2VzcyAgICAgICAgICAgICAgLy8gb3V0X3BQcm9jZXNzCisgICAgKTsKKyAgICBjaGVja19yZXN1bHQocmVzLCBjX3Byb2Nlc3NfY3JlYXRlLCBtX2luZGV4LCByZXMpOworCisgICAgLy8gZ2V0IGZ1bmN0aW9uIGhhbmRsZXMKKyAgICByZXMgPSBDT0k6OlByb2Nlc3NHZXRGdW5jdGlvbkhhbmRsZXMobV9wcm9jZXNzLCBjX2Z1bmNzX3RvdGFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2Z1bmNfbmFtZXMsIG1fZnVuY3MpOworICAgIGNoZWNrX3Jlc3VsdChyZXMsIGNfcHJvY2Vzc19nZXRfZnVuY19oYW5kbGVzLCBtX2luZGV4LCByZXMpOworCisgICAgLy8gaW5pdGlhbGl6ZSBkZXZpY2Ugc2lkZQorICAgIHBpZF90IHBpZCA9IGluaXRfZGV2aWNlKCk7CisKKyAgICAvLyBGb3IgSURCCisgICAgaWYgKF9fZGJnX2lzX2F0dGFjaGVkKSB7CisgICAgICAgIC8vIFRPRE86IHdlIGhhdmUgaW4tbWVtb3J5IGV4ZWN1dGFibGUgbm93LgorICAgICAgICAvLyBDaGVjayB3aXRoIElEQiB0ZWFtIHdoYXQgc2hvdWxkIHdlIHByb3ZpZGUgdGhlbSBub3c/CisgICAgICAgIGlmIChzdHJsZW4oX190YXJnZXRfZXhlLT5uYW1lKSA8IE1BWF9UQVJHRVRfTkFNRSkgeworICAgICAgICAgICAgc3RyY3B5KF9fZGJnX3RhcmdldF9leGVfbmFtZSwgX190YXJnZXRfZXhlLT5uYW1lKTsKKyAgICAgICAgfQorICAgICAgICBfX2RiZ190YXJnZXRfc29fcGlkID0gcGlkOworICAgICAgICBfX2RiZ190YXJnZXRfaWQgPSBtX3BoeXNpY2FsX2luZGV4OworICAgICAgICBfX2RiZ190YXJnZXRfc29fbG9hZGVkKCk7CisgICAgfQorfQorCit2b2lkIEVuZ2luZTo6ZmluaV9wcm9jZXNzKGJvb2wgdmVyYm9zZSkKK3sKKyAgICBpZiAobV9wcm9jZXNzICE9IDApIHsKKyAgICAgICAgdWludDMyX3Qgc2lnOworICAgICAgICBpbnQ4X3QgcmV0OworCisgICAgICAgIC8vIGRlc3Ryb3kgdGFyZ2V0IHByb2Nlc3MKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRGVzdHJveWluZyBwcm9jZXNzIG9uIHRoZSBkZXZpY2UgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pbmRleCk7CisKKyAgICAgICAgQ09JUkVTVUxUIHJlcyA9IENPSTo6UHJvY2Vzc0Rlc3Ryb3kobV9wcm9jZXNzLCAtMSwgMCwgJnJldCwgJnNpZyk7CisgICAgICAgIG1fcHJvY2VzcyA9IDA7CisKKyAgICAgICAgaWYgKHJlcyA9PSBDT0lfU1VDQ0VTUykgeworICAgICAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgzLCAiRGV2aWNlIHByb2Nlc3M6IHNpZ25hbCAlZCwgZXhpdCBjb2RlICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWcsIHJldCk7CisgICAgICAgICAgICBpZiAodmVyYm9zZSkgeworICAgICAgICAgICAgICAgIGlmIChzaWcgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKAorICAgICAgICAgICAgICAgICAgICAgICAgY19taWNfcHJvY2Vzc19leGl0X3NpZywgbV9pbmRleCwgc2lnLAorICAgICAgICAgICAgICAgICAgICAgICAgY19zaWduYWxfbmFtZXNbc2lnID49IGNfc2lnbmFsX21heCA/IDAgOiBzaWddKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19taWNfcHJvY2Vzc19leGl0X3JldCwgbV9pbmRleCwgcmV0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGZvciBpZGIKKyAgICAgICAgICAgIGlmIChfX2RiZ19pc19hdHRhY2hlZCkgeworICAgICAgICAgICAgICAgIF9fZGJnX3RhcmdldF9zb191bmxvYWRlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKHZlcmJvc2UpIHsKKyAgICAgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfbWljX3Byb2Nlc3NfZXhpdCwgbV9pbmRleCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgRW5naW5lOjpsb2FkX2xpYnJhcmllcygpCit7CisgICAgLy8gbG9hZCBsaWJyYXJpZXMgY29sbGVjdGVkIHNvIGZhcgorICAgIGZvciAoVGFyZ2V0SW1hZ2VMaXN0OjppdGVyYXRvciBpdCA9IG1faW1hZ2VzLmJlZ2luKCk7CisgICAgICAgICBpdCAhPSBtX2ltYWdlcy5lbmQoKTsgaXQrKykgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJMb2FkaW5nIGxpYnJhcnkgXCIlc1wiIGZyb20gJXAsIHNpemUgJWxsdVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdC0+bmFtZSwgaXQtPmRhdGEsIGl0LT5zaXplKTsKKworICAgICAgICAvLyBsb2FkIGxpYnJhcnkgdG8gdGhlIGRldmljZQorICAgICAgICBDT0lMSUJSQVJZIGxpYjsKKyAgICAgICAgQ09JUkVTVUxUIHJlczsKKyAgICAgICAgcmVzID0gQ09JOjpQcm9jZXNzTG9hZExpYnJhcnlGcm9tTWVtb3J5KG1fcHJvY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0LT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQtPnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdC0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pY19saWJyYXJ5X3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdC0+b3JpZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQtPm9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPSV9MT0FETElCUkFSWV9WMV9GTEFHUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsaWIpOworCisgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MgJiYgcmVzICE9IENPSV9BTFJFQURZX0VYSVNUUykgeworICAgICAgICAgICAgY2hlY2tfcmVzdWx0KHJlcywgY19sb2FkX2xpYnJhcnksIG1faW5kZXgsIHJlcyk7CisgICAgICAgIH0KKyAgICB9CisgICAgbV9pbWFnZXMuY2xlYXIoKTsKK30KKworc3RhdGljIGJvb2wgdGFyZ2V0X2VudHJ5X2NtcCgKKyAgICBjb25zdCBWYXJMaXN0OjpCdWZFbnRyeSAmbCwKKyAgICBjb25zdCBWYXJMaXN0OjpCdWZFbnRyeSAmcgorKQoreworICAgIGNvbnN0IGNoYXIgKmxfbmFtZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGwubmFtZSk7CisgICAgY29uc3QgY2hhciAqcl9uYW1lID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oci5uYW1lKTsKKyAgICByZXR1cm4gc3RyY21wKGxfbmFtZSwgcl9uYW1lKSA8IDA7Cit9CisKK3N0YXRpYyBib29sIGhvc3RfZW50cnlfY21wKAorICAgIGNvbnN0IFZhclRhYmxlOjpFbnRyeSAqbCwKKyAgICBjb25zdCBWYXJUYWJsZTo6RW50cnkgKnIKKykKK3sKKyAgICByZXR1cm4gc3RyY21wKGwtPm5hbWUsIHItPm5hbWUpIDwgMDsKK30KKwordm9pZCBFbmdpbmU6OmluaXRfcHRyX2RhdGEodm9pZCkKK3sKKyAgICBDT0lSRVNVTFQgcmVzOworICAgIENPSUVWRU5UIGV2ZW50OworCisgICAgLy8gUHJlcGFyZSB0YWJsZSBvZiBob3N0IGVudHJpZXMKKyAgICBzdGQ6OnZlY3Rvcjxjb25zdCBWYXJUYWJsZTo6RW50cnkqPiBob3N0X3RhYmxlKF9fb2ZmbG9hZF92YXJzLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX29mZmxvYWRfdmFycy5lbmQoKSk7CisKKyAgICAvLyBubyBuZWVkIHRvIGRvIGFueXRoaW5nIGZ1cnRoZXIgaXMgaG9zdCB0YWJsZSBpcyBlbXB0eQorICAgIGlmIChob3N0X3RhYmxlLnNpemUoKSA8PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBHZXQgdmFyIHRhYmxlIGVudHJpZXMgZnJvbSB0aGUgdGFyZ2V0LgorICAgIC8vIEZpcnN0IHdlIG5lZWQgdG8gZ2V0IHNpemUgZm9yIHRoZSBidWZmZXIgdG8gY29weSBkYXRhCisgICAgc3RydWN0IHsKKyAgICAgICAgaW50NjRfdCBuZWxlbXM7CisgICAgICAgIGludDY0X3QgbGVuZ3RoOworICAgIH0gcGFyYW1zOworCisgICAgcmVzID0gQ09JOjpQaXBlbGluZVJ1bkZ1bmN0aW9uKGdldF9waXBlbGluZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2Z1bmNzW2NfZnVuY192YXJfdGFibGVfc2l6ZV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJhbXMsIHNpemVvZihwYXJhbXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXZlbnQpOworICAgIGNoZWNrX3Jlc3VsdChyZXMsIGNfcGlwZWxpbmVfcnVuX2Z1bmMsIG1faW5kZXgsIHJlcyk7CisKKyAgICByZXMgPSBDT0k6OkV2ZW50V2FpdCgxLCAmZXZlbnQsIC0xLCAxLCAwLCAwKTsKKyAgICBjaGVja19yZXN1bHQocmVzLCBjX2V2ZW50X3dhaXQsIHJlcyk7CisKKyAgICBpZiAocGFyYW1zLmxlbmd0aCA9PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBjcmVhdGUgYnVmZmVyIGZvciB0YXJnZXQgZW50cmllcyBhbmQgY29weSBkYXRhIHRvIGhvc3QKKyAgICBDT0lCVUZGRVIgYnVmZmVyOworICAgIHJlcyA9IENPSTo6QnVmZmVyQ3JlYXRlKHBhcmFtcy5sZW5ndGgsIENPSV9CVUZGRVJfTk9STUFMLCAwLCAwLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtX3Byb2Nlc3MsICZidWZmZXIpOworICAgIGNoZWNrX3Jlc3VsdChyZXMsIGNfYnVmX2NyZWF0ZSwgbV9pbmRleCwgcmVzKTsKKworICAgIENPSV9BQ0NFU1NfRkxBR1MgZmxhZ3MgPSBDT0lfU0lOS19XUklURTsKKyAgICByZXMgPSBDT0k6OlBpcGVsaW5lUnVuRnVuY3Rpb24oZ2V0X3BpcGVsaW5lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZnVuY3NbY19mdW5jX3Zhcl90YWJsZV9jb3B5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgJmJ1ZmZlciwgJmZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyYW1zLm5lbGVtcywgc2l6ZW9mKHBhcmFtcy5uZWxlbXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXZlbnQpOworICAgIGNoZWNrX3Jlc3VsdChyZXMsIGNfcGlwZWxpbmVfcnVuX2Z1bmMsIG1faW5kZXgsIHJlcyk7CisKKyAgICByZXMgPSBDT0k6OkV2ZW50V2FpdCgxLCAmZXZlbnQsIC0xLCAxLCAwLCAwKTsKKyAgICBjaGVja19yZXN1bHQocmVzLCBjX2V2ZW50X3dhaXQsIHJlcyk7CisKKyAgICAvLyBwYXRjaCBuYW1lcyBpbiB0YXJnZXQgZGF0YQorICAgIFZhckxpc3Q6OkJ1ZkVudHJ5ICp0YXJnZXRfdGFibGU7CisgICAgQ09JTUFQSU5TVEFOQ0UgbWFwX2luc3Q7CisgICAgcmVzID0gQ09JOjpCdWZmZXJNYXAoYnVmZmVyLCAwLCBwYXJhbXMubGVuZ3RoLCBDT0lfTUFQX1JFQURfT05MWSwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAwLCAmbWFwX2luc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx2b2lkKio+KCZ0YXJnZXRfdGFibGUpKTsKKyAgICBjaGVja19yZXN1bHQocmVzLCBjX2J1Zl9tYXAsIHJlcyk7CisKKyAgICBWYXJMaXN0Ojp0YWJsZV9wYXRjaF9uYW1lcyh0YXJnZXRfdGFibGUsIHBhcmFtcy5uZWxlbXMpOworCisgICAgLy8gYW5kIHNvcnQgZW50cmllcworICAgIHN0ZDo6c29ydCh0YXJnZXRfdGFibGUsIHRhcmdldF90YWJsZSArIHBhcmFtcy5uZWxlbXMsIHRhcmdldF9lbnRyeV9jbXApOworICAgIHN0ZDo6c29ydChob3N0X3RhYmxlLmJlZ2luKCksIGhvc3RfdGFibGUuZW5kKCksIGhvc3RfZW50cnlfY21wKTsKKworICAgIC8vIG1lcmdlIGhvc3QgYW5kIHRhcmdldCBlbnRyaWVzIGFuZCBlbnRlciBtYXRjaGluZyB2YXJzIG1hcAorICAgIHN0ZDo6dmVjdG9yPGNvbnN0IFZhclRhYmxlOjpFbnRyeSo+Ojpjb25zdF9pdGVyYXRvciBoaSA9CisgICAgICAgIGhvc3RfdGFibGUuYmVnaW4oKTsKKyAgICBzdGQ6OnZlY3Rvcjxjb25zdCBWYXJUYWJsZTo6RW50cnkqPjo6Y29uc3RfaXRlcmF0b3IgaGUgPQorICAgICAgICBob3N0X3RhYmxlLmVuZCgpOworICAgIGNvbnN0IFZhckxpc3Q6OkJ1ZkVudHJ5ICp0aSA9IHRhcmdldF90YWJsZTsKKyAgICBjb25zdCBWYXJMaXN0OjpCdWZFbnRyeSAqdGUgPSB0YXJnZXRfdGFibGUgKyBwYXJhbXMubmVsZW1zOworCisgICAgd2hpbGUgKGhpICE9IGhlICYmIHRpICE9IHRlKSB7CisgICAgICAgIGludCByZXMgPSBzdHJjbXAoKCpoaSktPm5hbWUsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHRpLT5uYW1lKSk7CisgICAgICAgIGlmIChyZXMgPT0gMCkgeworICAgICAgICAgICAgLy8gYWRkIG1hdGNoaW5nIGVudHJ5IHRvIHZhciBtYXAKKyAgICAgICAgICAgIHN0ZDo6cGFpcjxQdHJTZXQ6Oml0ZXJhdG9yLCBib29sPiByZXMgPQorICAgICAgICAgICAgICAgIG1fcHRyX3NldC5pbnNlcnQoUHRyRGF0YSgoKmhpKS0+YWRkciwgKCpoaSktPnNpemUpKTsKKworICAgICAgICAgICAgLy8gc3RvcmUgYWRkcmVzcyBmb3IgbmV3IGVudHJpZXMKKyAgICAgICAgICAgIGlmIChyZXMuc2Vjb25kKSB7CisgICAgICAgICAgICAgICAgUHRyRGF0YSAqcHRyID0gY29uc3RfY2FzdDxQdHJEYXRhKj4ocmVzLmZpcnN0Lm9wZXJhdG9yLT4oKSk7CisgICAgICAgICAgICAgICAgcHRyLT5taWNfYWRkciA9IHRpLT5hZGRyOworICAgICAgICAgICAgICAgIHB0ci0+aXNfc3RhdGljID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaGkrKzsKKyAgICAgICAgICAgIHRpKys7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAocmVzIDwgMCkgeworICAgICAgICAgICAgaGkrKzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHRpKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBjbGVhbnVwCisgICAgcmVzID0gQ09JOjpCdWZmZXJVbm1hcChtYXBfaW5zdCwgMCwgMCwgMCk7CisgICAgY2hlY2tfcmVzdWx0KHJlcywgY19idWZfdW5tYXAsIHJlcyk7CisKKyAgICByZXMgPSBDT0k6OkJ1ZmZlckRlc3Ryb3koYnVmZmVyKTsKKyAgICBjaGVja19yZXN1bHQocmVzLCBjX2J1Zl9kZXN0cm95LCByZXMpOworfQorCitDT0lSRVNVTFQgRW5naW5lOjpjb21wdXRlKAorICAgIGNvbnN0IHN0ZDo6bGlzdDxDT0lCVUZGRVI+ICZidWZmZXJzLAorICAgIGNvbnN0IHZvaWQqICAgICAgICAgZGF0YSwKKyAgICB1aW50MTZfdCAgICAgICAgICAgIGRhdGFfc2l6ZSwKKyAgICB2b2lkKiAgICAgICAgICAgICAgIHJldCwKKyAgICB1aW50MTZfdCAgICAgICAgICAgIHJldF9zaXplLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgbnVtX2RlcHMsCisgICAgY29uc3QgQ09JRVZFTlQqICAgICBkZXBzLAorICAgIENPSUVWRU5UKiAgICAgICAgICAgZXZlbnQKKykgLyogY29uc3QgKi8KK3sKKyAgICBDT0lCVUZGRVIgKmJ1ZnM7CisgICAgQ09JX0FDQ0VTU19GTEFHUyAqZmxhZ3M7CisgICAgQ09JUkVTVUxUIHJlczsKKworICAgIC8vIGNvbnZlcnQgYnVmZmVycyBsaXN0IHRvIGFycmF5CisgICAgaW50IG51bV9idWZzID0gYnVmZmVycy5zaXplKCk7CisgICAgaWYgKG51bV9idWZzID4gMCkgeworICAgICAgICBidWZzID0gKENPSUJVRkZFUiopIGFsbG9jYShudW1fYnVmcyAqIHNpemVvZihDT0lCVUZGRVIpKTsKKyAgICAgICAgZmxhZ3MgPSAoQ09JX0FDQ0VTU19GTEFHUyopIGFsbG9jYShudW1fYnVmcyAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKENPSV9BQ0NFU1NfRkxBR1MpKTsKKworICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgIGZvciAoc3RkOjpsaXN0PENPSUJVRkZFUj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gYnVmZmVycy5iZWdpbigpOworICAgICAgICAgICAgIGl0ICE9IGJ1ZmZlcnMuZW5kKCk7IGl0KyspIHsKKyAgICAgICAgICAgIGJ1ZnNbaV0gPSAqaXQ7CisKKyAgICAgICAgICAgIC8vIFRPRE86IHRoaXMgc2hvdWxkIGJlIGZpeGVkCisgICAgICAgICAgICBmbGFnc1tpKytdID0gQ09JX1NJTktfV1JJVEU7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGJ1ZnMgPSAwOworICAgICAgICBmbGFncyA9IDA7CisgICAgfQorCisgICAgLy8gc3RhcnQgY29tcHV0YXRpb24KKyAgICByZXMgPSBDT0k6OlBpcGVsaW5lUnVuRnVuY3Rpb24oZ2V0X3BpcGVsaW5lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZnVuY3NbY19mdW5jX2NvbXB1dGVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fYnVmcywgYnVmcywgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9kZXBzLCBkZXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCwgcmV0X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50KTsKKyAgICByZXR1cm4gcmVzOworfQorCitwaWRfdCBFbmdpbmU6OmluaXRfZGV2aWNlKHZvaWQpCit7CisgICAgc3RydWN0IGluaXRfZGF0YSB7CisgICAgICAgIGludCAgZGV2aWNlX2luZGV4OworICAgICAgICBpbnQgIGRldmljZXNfdG90YWw7CisgICAgICAgIGludCAgY29uc29sZV9sZXZlbDsKKyAgICAgICAgaW50ICBvZmZsb2FkX3JlcG9ydF9sZXZlbDsKKyAgICB9IGRhdGE7CisgICAgQ09JUkVTVUxUIHJlczsKKyAgICBDT0lFVkVOVCBldmVudDsKKyAgICBwaWRfdCBwaWQ7CisKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFXzEoMiwgMCwgY19vZmZsb2FkX2luaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJJbml0aWFsaXppbmcgZGV2aWNlIHdpdGggbG9naWNhbCBpbmRleCAlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJhbmQgcGh5c2ljYWwgaW5kZXggJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2luZGV4LCBtX3BoeXNpY2FsX2luZGV4KTsKKworICAgIC8vIHNldHVwIG1pc2MgZGF0YQorICAgIGRhdGEuZGV2aWNlX2luZGV4ID0gbV9pbmRleDsKKyAgICBkYXRhLmRldmljZXNfdG90YWwgPSBtaWNfZW5naW5lc190b3RhbDsKKyAgICBkYXRhLmNvbnNvbGVfbGV2ZWwgPSBjb25zb2xlX2VuYWJsZWQ7CisgICAgZGF0YS5vZmZsb2FkX3JlcG9ydF9sZXZlbCA9IG9mZmxvYWRfcmVwb3J0X2xldmVsOworCisgICAgcmVzID0gQ09JOjpQaXBlbGluZVJ1bkZ1bmN0aW9uKGdldF9waXBlbGluZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2Z1bmNzW2NfZnVuY19pbml0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGEsIHNpemVvZihkYXRhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBpZCwgc2l6ZW9mKHBpZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZldmVudCk7CisgICAgY2hlY2tfcmVzdWx0KHJlcywgY19waXBlbGluZV9ydW5fZnVuYywgbV9pbmRleCwgcmVzKTsKKworICAgIHJlcyA9IENPSTo6RXZlbnRXYWl0KDEsICZldmVudCwgLTEsIDEsIDAsIDApOworICAgIGNoZWNrX3Jlc3VsdChyZXMsIGNfZXZlbnRfd2FpdCwgcmVzKTsKKworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkRldmljZSBwcm9jZXNzIHBpZCBpcyAlZFxuIiwgcGlkKTsKKworICAgIHJldHVybiBwaWQ7Cit9CisKKy8vIGRhdGEgYXNzb2NpYXRlZCB3aXRoIGVhY2ggdGhyZWFkCitzdHJ1Y3QgVGhyZWFkIHsKKyAgICBUaHJlYWQobG9uZyogYWRkcl9jb2lwaXBlX2NvdW50ZXIpIHsKKyAgICAgICAgbV9hZGRyX2NvaXBpcGVfY291bnRlciA9IGFkZHJfY29pcGlwZV9jb3VudGVyOworICAgICAgICBtZW1zZXQobV9waXBlbGluZXMsIDAsIHNpemVvZihtX3BpcGVsaW5lcykpOworICAgIH0KKworICAgIH5UaHJlYWQoKSB7CisjaWZuZGVmIFRBUkdFVF9XSU5OVAorICAgICAgICBfX3N5bmNfc3ViX2FuZF9mZXRjaChtX2FkZHJfY29pcGlwZV9jb3VudGVyLCAxKTsKKyNlbHNlIC8vIFRBUkdFVF9XSU5OVAorICAgICAgICBfSW50ZXJsb2NrZWREZWNyZW1lbnQobV9hZGRyX2NvaXBpcGVfY291bnRlcik7CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWljX2VuZ2luZXNfdG90YWw7IGkrKykgeworICAgICAgICAgICAgaWYgKG1fcGlwZWxpbmVzW2ldICE9IDApIHsKKyAgICAgICAgICAgICAgICBDT0k6OlBpcGVsaW5lRGVzdHJveShtX3BpcGVsaW5lc1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBDT0lQSVBFTElORSBnZXRfcGlwZWxpbmUoaW50IGluZGV4KSBjb25zdCB7CisgICAgICAgIHJldHVybiBtX3BpcGVsaW5lc1tpbmRleF07CisgICAgfQorCisgICAgdm9pZCBzZXRfcGlwZWxpbmUoaW50IGluZGV4LCBDT0lQSVBFTElORSBwaXBlbGluZSkgeworICAgICAgICBtX3BpcGVsaW5lc1tpbmRleF0gPSBwaXBlbGluZTsKKyAgICB9CisKKyAgICBBdXRvU2V0JiBnZXRfYXV0b192YXJzKCkgeworICAgICAgICByZXR1cm4gbV9hdXRvX3ZhcnM7CisgICAgfQorCitwcml2YXRlOgorICAgIGxvbmcqICAgICAgIG1fYWRkcl9jb2lwaXBlX2NvdW50ZXI7CisgICAgQXV0b1NldCAgICAgbV9hdXRvX3ZhcnM7CisgICAgQ09JUElQRUxJTkUgbV9waXBlbGluZXNbTUlDX0VOR0lORVNfTUFYXTsKK307CisKK0NPSVBJUEVMSU5FIEVuZ2luZTo6Z2V0X3BpcGVsaW5lKHZvaWQpCit7CisgICAgVGhyZWFkKiB0aHJlYWQgPSAoVGhyZWFkKikgdGhyZWFkX2dldHNwZWNpZmljKG1pY190aHJlYWRfa2V5KTsKKyAgICBpZiAodGhyZWFkID09IDApIHsKKyAgICAgICAgdGhyZWFkID0gbmV3IFRocmVhZCgmbV9wcm9jX251bWJlcik7CisgICAgICAgIHRocmVhZF9zZXRzcGVjaWZpYyhtaWNfdGhyZWFkX2tleSwgdGhyZWFkKTsKKyAgICB9CisKKyAgICBDT0lQSVBFTElORSBwaXBlbGluZSA9IHRocmVhZC0+Z2V0X3BpcGVsaW5lKG1faW5kZXgpOworICAgIGlmIChwaXBlbGluZSA9PSAwKSB7CisgICAgICAgIENPSVJFU1VMVCByZXM7CisgICAgICAgIGludCBwcm9jX251bTsKKworI2lmbmRlZiBUQVJHRVRfV0lOTlQKKyAgICAgICAgcHJvY19udW0gPSBfX3N5bmNfZmV0Y2hfYW5kX2FkZCgmbV9wcm9jX251bWJlciwgMSk7CisjZWxzZSAvLyBUQVJHRVRfV0lOTlQKKyAgICAgICAgcHJvY19udW0gPSBfSW50ZXJsb2NrZWRJbmNyZW1lbnQoJm1fcHJvY19udW1iZXIpOworI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorCisgICAgICAgIGlmIChwcm9jX251bSA+IENPSV9QSVBFTElORV9NQVhfUElQRUxJTkVTKSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfY29pcGlwZV9tYXhfbnVtYmVyLCBDT0lfUElQRUxJTkVfTUFYX1BJUEVMSU5FUyk7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0FCT1JUOworICAgICAgICB9CisgICAgICAgIC8vIGNyZWF0ZSBwaXBlbGluZSBmb3IgdGhpcyB0aHJlYWQKKyAgICAgICAgcmVzID0gQ09JOjpQaXBlbGluZUNyZWF0ZShtX3Byb2Nlc3MsIDAsIG1pY19zdGFja19zaXplLCAmcGlwZWxpbmUpOworICAgICAgICBjaGVja19yZXN1bHQocmVzLCBjX3BpcGVsaW5lX2NyZWF0ZSwgbV9pbmRleCwgcmVzKTsKKworICAgICAgICB0aHJlYWQtPnNldF9waXBlbGluZShtX2luZGV4LCBwaXBlbGluZSk7CisgICAgfQorICAgIHJldHVybiBwaXBlbGluZTsKK30KKworQXV0b1NldCYgRW5naW5lOjpnZXRfYXV0b192YXJzKHZvaWQpCit7CisgICAgVGhyZWFkKiB0aHJlYWQgPSAoVGhyZWFkKikgdGhyZWFkX2dldHNwZWNpZmljKG1pY190aHJlYWRfa2V5KTsKKyAgICBpZiAodGhyZWFkID09IDApIHsKKyAgICAgICAgdGhyZWFkID0gbmV3IFRocmVhZCgmbV9wcm9jX251bWJlcik7CisgICAgICAgIHRocmVhZF9zZXRzcGVjaWZpYyhtaWNfdGhyZWFkX2tleSwgdGhyZWFkKTsKKyAgICB9CisKKyAgICByZXR1cm4gdGhyZWFkLT5nZXRfYXV0b192YXJzKCk7Cit9CisKK3ZvaWQgRW5naW5lOjpkZXN0cm95X3RocmVhZF9kYXRhKHZvaWQgKmRhdGEpCit7CisgICAgZGVsZXRlIHN0YXRpY19jYXN0PFRocmVhZCo+KGRhdGEpOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9lbmdpbmUuaCBiL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfZW5naW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFhOTYzMQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfZW5naW5lLmgKQEAgLTAsMCArMSw0ODIgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBPRkZMT0FEX0VOR0lORV9IX0lOQ0xVREVECisjZGVmaW5lIE9GRkxPQURfRU5HSU5FX0hfSU5DTFVERUQKKworI2luY2x1ZGUgPGxpbWl0cy5oPgorCisjaW5jbHVkZSA8bGlzdD4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgIm9mZmxvYWRfY29tbW9uLmgiCisjaW5jbHVkZSAiY29pL2NvaV9jbGllbnQuaCIKKworLy8gQWRkcmVzcyByYW5nZQorY2xhc3MgTWVtUmFuZ2UgeworcHVibGljOgorICAgIE1lbVJhbmdlKCkgOiBtX3N0YXJ0KDApLCBtX2xlbmd0aCgwKSB7fQorICAgIE1lbVJhbmdlKGNvbnN0IHZvaWQgKmFkZHIsIHVpbnQ2NF90IGxlbikgOiBtX3N0YXJ0KGFkZHIpLCBtX2xlbmd0aChsZW4pIHt9CisKKyAgICBjb25zdCB2b2lkKiBzdGFydCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1fc3RhcnQ7CisgICAgfQorCisgICAgY29uc3Qgdm9pZCogZW5kKCkgY29uc3QgeworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgY2hhcio+KG1fc3RhcnQpICsgbV9sZW5ndGg7CisgICAgfQorCisgICAgdWludDY0X3QgbGVuZ3RoKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbV9sZW5ndGg7CisgICAgfQorCisgICAgLy8gcmV0dXJucyB0cnVlIGlmIGdpdmVuIHJhbmdlIG92ZXJsYXBzIHdpdGggYW5vdGhlciBvbmUKKyAgICBib29sIG92ZXJsYXBzKGNvbnN0IE1lbVJhbmdlICZvKSBjb25zdCB7CisgICAgICAgIC8vIFR3byBhZGRyZXNzIHJhbmdlcyBBW3N0YXJ0LCBlbmQpIGFuZCBCW3N0YXJ0LGVuZCkgb3ZlcmxhcAorICAgICAgICAvLyBpZiBBLnN0YXJ0IDwgQi5lbmQgYW5kIEEuZW5kID4gQi5zdGFydC4KKyAgICAgICAgcmV0dXJuIHN0YXJ0KCkgPCBvLmVuZCgpICYmIGVuZCgpID4gby5zdGFydCgpOworICAgIH0KKworICAgIC8vIHJldHVybnMgdHJ1ZSBpZiBnaXZlbiByYW5nZSBjb250YWlucyB0aGUgb3RoZXIgcmFuZ2UKKyAgICBib29sIGNvbnRhaW5zKGNvbnN0IE1lbVJhbmdlICZvKSBjb25zdCB7CisgICAgICAgIHJldHVybiBzdGFydCgpIDw9IG8uc3RhcnQoKSAmJiBvLmVuZCgpIDw9IGVuZCgpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBjb25zdCB2b2lkKiBtX3N0YXJ0OworICAgIHVpbnQ2NF90ICAgIG1fbGVuZ3RoOworfTsKKworLy8gRGF0YSBhc3NvY2lhdGVkIHdpdGggYSBwb2ludGVyIHZhcmlhYmxlCitjbGFzcyBQdHJEYXRhIHsKK3B1YmxpYzoKKyAgICBQdHJEYXRhKGNvbnN0IHZvaWQgKmFkZHIsIHVpbnQ2NF90IGxlbikgOgorICAgICAgICBjcHVfYWRkcihhZGRyLCBsZW4pLCBjcHVfYnVmKDApLAorICAgICAgICBtaWNfYWRkcigwKSwgYWxsb2NfZGlzcCgwKSwgbWljX2J1ZigwKSwgbWljX29mZnNldCgwKSwKKyAgICAgICAgcmVmX2NvdW50KDApLCBpc19zdGF0aWMoZmFsc2UpCisgICAge30KKworICAgIC8vCisgICAgLy8gQ29weSBjb25zdHJ1Y3RvcgorICAgIC8vCisgICAgUHRyRGF0YShjb25zdCBQdHJEYXRhJiBwdHIpOgorICAgICAgICBjcHVfYWRkcihwdHIuY3B1X2FkZHIpLCBjcHVfYnVmKHB0ci5jcHVfYnVmKSwKKyAgICAgICAgbWljX2FkZHIocHRyLm1pY19hZGRyKSwgYWxsb2NfZGlzcChwdHIuYWxsb2NfZGlzcCksCisgICAgICAgIG1pY19idWYocHRyLm1pY19idWYpLCBtaWNfb2Zmc2V0KHB0ci5taWNfb2Zmc2V0KSwKKyAgICAgICAgcmVmX2NvdW50KHB0ci5yZWZfY291bnQpLCBpc19zdGF0aWMocHRyLmlzX3N0YXRpYykKKyAgICB7fQorCisgICAgYm9vbCBvcGVyYXRvcjwoY29uc3QgUHRyRGF0YSAmbykgY29uc3QgeworICAgICAgICAvLyBWYXJpYWJsZXMgYXJlIHNvcnRlZCBieSB0aGUgQ1BVIHN0YXJ0IGFkZHJlc3MuCisgICAgICAgIC8vIE92ZXJsYXBwaW5nIG1lbW9yeSByYW5nZXMgYXJlIGNvbnNpZGVyZWQgZXF1YWwuCisgICAgICAgIHJldHVybiAoY3B1X2FkZHIuc3RhcnQoKSA8IG8uY3B1X2FkZHIuc3RhcnQoKSkgJiYKKyAgICAgICAgICAgICAgICFjcHVfYWRkci5vdmVybGFwcyhvLmNwdV9hZGRyKTsKKyAgICB9CisKKyAgICBsb25nIGFkZF9yZWZlcmVuY2UoKSB7CisgICAgICAgIGlmIChpc19zdGF0aWMpIHsKKyAgICAgICAgICAgIHJldHVybiBMT05HX01BWDsKKyAgICAgICAgfQorI2lmbmRlZiBUQVJHRVRfV0lOTlQKKyAgICAgICAgcmV0dXJuIF9fc3luY19mZXRjaF9hbmRfYWRkKCZyZWZfY291bnQsIDEpOworI2Vsc2UgLy8gVEFSR0VUX1dJTk5UCisgICAgICAgIHJldHVybiBfSW50ZXJsb2NrZWRJbmNyZW1lbnQoJnJlZl9jb3VudCkgLSAxOworI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorICAgIH0KKworICAgIGxvbmcgcmVtb3ZlX3JlZmVyZW5jZSgpIHsKKyAgICAgICAgaWYgKGlzX3N0YXRpYykgeworICAgICAgICAgICAgcmV0dXJuIExPTkdfTUFYOworICAgICAgICB9CisjaWZuZGVmIFRBUkdFVF9XSU5OVAorICAgICAgICByZXR1cm4gX19zeW5jX3N1Yl9hbmRfZmV0Y2goJnJlZl9jb3VudCwgMSk7CisjZWxzZSAvLyBUQVJHRVRfV0lOTlQKKyAgICAgICAgcmV0dXJuIF9JbnRlcmxvY2tlZERlY3JlbWVudCgmcmVmX2NvdW50KTsKKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKKyAgICB9CisKKyAgICBsb25nIGdldF9yZWZlcmVuY2UoKSBjb25zdCB7CisgICAgICAgIGlmIChpc19zdGF0aWMpIHsKKyAgICAgICAgICAgIHJldHVybiBMT05HX01BWDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVmX2NvdW50OworICAgIH0KKworcHVibGljOgorICAgIC8vIENQVSBhZGRyZXNzIHJhbmdlCisgICAgY29uc3QgTWVtUmFuZ2UgIGNwdV9hZGRyOworCisgICAgLy8gQ1BVIGFuZCBNSUMgYnVmZmVycworICAgIENPSUJVRkZFUiAgICAgICBjcHVfYnVmOworICAgIENPSUJVRkZFUiAgICAgICBtaWNfYnVmOworCisgICAgLy8gcGxhY2Vob2xkZXIgZm9yIGJ1ZmZlciBhZGRyZXNzIG9uIG1pYworICAgIHVpbnQ2NF90ICAgICAgICBtaWNfYWRkcjsKKworICAgIHVpbnQ2NF90ICAgICAgICBhbGxvY19kaXNwOworCisgICAgLy8gYWRkaXRpb25hbCBvZmZzZXQgdG8gcG9pbnRlciBkYXRhIG9uIE1JQyBmb3IgaW1wcm92aW5nIGJhbmR3aWR0aCBmb3IKKyAgICAvLyBkYXRhIHdoaWNoIGlzIG5vdCA0SyBhbGlnbmVkCisgICAgdWludDMyX3QgICAgICAgIG1pY19vZmZzZXQ7CisKKyAgICAvLyBpZiB0cnVlIGJ1ZmZlcnMgYXJlIGNyZWF0ZWQgZnJvbSBzdGF0aWMgbWVtb3J5CisgICAgYm9vbCAgICAgICAgICAgIGlzX3N0YXRpYzsKKyAgICBtdXRleF90ICAgICAgICAgYWxsb2NfcHRyX2RhdGFfbG9jazsKKworcHJpdmF0ZToKKyAgICAvLyByZWZlcmVuY2UgY291bnQgZm9yIHRoZSBlbnRyeQorICAgIGxvbmcgICAgICAgICAgICByZWZfY291bnQ7Cit9OworCit0eXBlZGVmIHN0ZDo6bGlzdDxQdHJEYXRhKj4gUHRyRGF0YUxpc3Q7CisKKy8vIERhdGEgYXNzb2NpYXRlZCB3aXRoIGF1dG9tYXRpYyB2YXJpYWJsZQorY2xhc3MgQXV0b0RhdGEgeworcHVibGljOgorICAgIEF1dG9EYXRhKGNvbnN0IHZvaWQgKmFkZHIsIHVpbnQ2NF90IGxlbikgOgorICAgICAgICBjcHVfYWRkcihhZGRyLCBsZW4pLCByZWZfY291bnQoMCkKKyAgICB7fQorCisgICAgYm9vbCBvcGVyYXRvcjwoY29uc3QgQXV0b0RhdGEgJm8pIGNvbnN0IHsKKyAgICAgICAgLy8gVmFyaWFibGVzIGFyZSBzb3J0ZWQgYnkgdGhlIENQVSBzdGFydCBhZGRyZXNzLgorICAgICAgICAvLyBPdmVybGFwcGluZyBtZW1vcnkgcmFuZ2VzIGFyZSBjb25zaWRlcmVkIGVxdWFsLgorICAgICAgICByZXR1cm4gKGNwdV9hZGRyLnN0YXJ0KCkgPCBvLmNwdV9hZGRyLnN0YXJ0KCkpICYmCisgICAgICAgICAgICAgICAhY3B1X2FkZHIub3ZlcmxhcHMoby5jcHVfYWRkcik7CisgICAgfQorCisgICAgbG9uZyBhZGRfcmVmZXJlbmNlKCkgeworI2lmbmRlZiBUQVJHRVRfV0lOTlQKKyAgICAgICAgcmV0dXJuIF9fc3luY19mZXRjaF9hbmRfYWRkKCZyZWZfY291bnQsIDEpOworI2Vsc2UgLy8gVEFSR0VUX1dJTk5UCisgICAgICAgIHJldHVybiBfSW50ZXJsb2NrZWRJbmNyZW1lbnQoJnJlZl9jb3VudCkgLSAxOworI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorICAgIH0KKworICAgIGxvbmcgcmVtb3ZlX3JlZmVyZW5jZSgpIHsKKyNpZm5kZWYgVEFSR0VUX1dJTk5UCisgICAgICAgIHJldHVybiBfX3N5bmNfc3ViX2FuZF9mZXRjaCgmcmVmX2NvdW50LCAxKTsKKyNlbHNlIC8vIFRBUkdFVF9XSU5OVAorICAgICAgICByZXR1cm4gX0ludGVybG9ja2VkRGVjcmVtZW50KCZyZWZfY291bnQpOworI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorICAgIH0KKworICAgIGxvbmcgZ2V0X3JlZmVyZW5jZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHJlZl9jb3VudDsKKyAgICB9CisKK3B1YmxpYzoKKyAgICAvLyBDUFUgYWRkcmVzcyByYW5nZQorICAgIGNvbnN0IE1lbVJhbmdlIGNwdV9hZGRyOworCitwcml2YXRlOgorICAgIC8vIHJlZmVyZW5jZSBjb3VudCBmb3IgdGhlIGVudHJ5CisgICAgbG9uZyByZWZfY291bnQ7Cit9OworCisvLyBTZXQgb2YgYXV0aW1hdGljIHZhcmlhYmxlcwordHlwZWRlZiBzdGQ6OnNldDxBdXRvRGF0YT4gQXV0b1NldDsKKworLy8gVGFyZ2V0IGltYWdlIGRhdGEKK3N0cnVjdCBUYXJnZXRJbWFnZQoreworICAgIFRhcmdldEltYWdlKGNvbnN0IGNoYXIgKl9uYW1lLCBjb25zdCB2b2lkICpfZGF0YSwgdWludDY0X3QgX3NpemUsCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqX29yaWdpbiwgdWludDY0X3QgX29mZnNldCkgOgorICAgICAgICBuYW1lKF9uYW1lKSwgZGF0YShfZGF0YSksIHNpemUoX3NpemUpLAorICAgICAgICBvcmlnaW4oX29yaWdpbiksIG9mZnNldChfb2Zmc2V0KQorICAgIHt9CisKKyAgICAvLyBsaWJyYXJ5IG5hbWUKKyAgICBjb25zdCBjaGFyKiBuYW1lOworCisgICAgLy8gY29udGVudHMgYW5kIHNpemUKKyAgICBjb25zdCB2b2lkKiBkYXRhOworICAgIHVpbnQ2NF90ICAgIHNpemU7CisKKyAgICAvLyBmaWxlIG9mIG9yaWdpbiBhbmQgb2Zmc2V0IHdpdGhpbiB0aGF0IGZpbGUKKyAgICBjb25zdCBjaGFyKiBvcmlnaW47CisgICAgdWludDY0X3QgICAgb2Zmc2V0OworfTsKKwordHlwZWRlZiBzdGQ6Omxpc3Q8VGFyZ2V0SW1hZ2U+IFRhcmdldEltYWdlTGlzdDsKKworLy8gRGF0YSBhc3NvY2lhdGVkIHdpdGggcGVyc2lzdGVudCBhdXRvIG9iamVjdHMKK3N0cnVjdCBQZXJzaXN0RGF0YQoreworICAgIFBlcnNpc3REYXRhKGNvbnN0IHZvaWQgKmFkZHIsIHVpbnQ2NF90IHJvdXRpbmVfbnVtLCB1aW50NjRfdCBzaXplKSA6CisgICAgICAgIHN0YWNrX2NwdV9hZGRyKGFkZHIpLCByb3V0aW5lX2lkKHJvdXRpbmVfbnVtKQorICAgIHsKKyAgICAgICAgc3RhY2tfcHRyX2RhdGEgPSBuZXcgUHRyRGF0YSgwLCBzaXplKTsKKyAgICB9CisgICAgLy8gMS1zdCBrZXkgdmFsdWUgLSBiZWdpbm5pbmcgb2YgdGhlIHN0YWNrIGF0IENQVQorICAgIGNvbnN0IHZvaWQgKiAgIHN0YWNrX2NwdV9hZGRyOworICAgIC8vIDItbmQga2V5IHZhbHVlIC0gaWRlbnRpZmllciBvZiByb3V0aW5lIGludm9jYXRpb24gYXQgQ1BVCisgICAgdWludDY0X3QgICByb3V0aW5lX2lkOworICAgIC8vIGNvcnJlc3BvbmRlZCBQdHJEYXRhOyBvbmx5IHN0YWNrX3B0cl9kYXRhLT5taWNfYnVmIGlzIHVzZWQKKyAgICBQdHJEYXRhICogc3RhY2tfcHRyX2RhdGE7CisgICAgLy8gdXNlZCB0byBnZXQgb2Zmc2V0IG9mIHRoZSB2YXJpYWJsZSBpbiBzdGFjayBidWZmZXIKKyAgICBjaGFyICogY3B1X3N0YWNrX2FkZHI7Cit9OworCit0eXBlZGVmIHN0ZDo6bGlzdDxQZXJzaXN0RGF0YT4gUGVyc2lzdERhdGFMaXN0OworCisvLyBjbGFzcyByZXByZXNlbnRpbmcgYSBzaW5nbGUgZW5naW5lCitzdHJ1Y3QgRW5naW5lIHsKKyAgICBmcmllbmQgdm9pZCBfX29mZmxvYWRfaW5pdF9saWJyYXJ5X29uY2Uodm9pZCk7CisgICAgZnJpZW5kIHZvaWQgX19vZmZsb2FkX2ZpbmlfbGlicmFyeSh2b2lkKTsKKworI2RlZmluZSBjaGVja19yZXN1bHQocmVzLCB0YWcsIC4uLikgXAorICAgIHsgXAorICAgICAgICBpZiAocmVzID09IENPSV9QUk9DRVNTX0RJRUQpIHsgXAorICAgICAgICAgICAgZmluaV9wcm9jZXNzKHRydWUpOyBcCisgICAgICAgICAgICBleGl0KDEpOyBcCisgICAgICAgIH0gXAorICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7IFwKKyAgICAgICAgICAgIF9fbGlib2ZmbG9hZF9lcnJvcl9zdXBwb3J0KHRhZywgX19WQV9BUkdTX18pOyBcCisgICAgICAgICAgICBleGl0KDEpOyBcCisgICAgICAgIH0gXAorICAgIH0KKworICAgIGludCBnZXRfbG9naWNhbF9pbmRleCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1faW5kZXg7CisgICAgfQorCisgICAgaW50IGdldF9waHlzaWNhbF9pbmRleCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1fcGh5c2ljYWxfaW5kZXg7CisgICAgfQorCisgICAgY29uc3QgQ09JUFJPQ0VTUyYgZ2V0X3Byb2Nlc3MoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtX3Byb2Nlc3M7CisgICAgfQorCisgICAgLy8gaW5pdGlhbGl6ZSBkZXZpY2UKKyAgICB2b2lkIGluaXQodm9pZCk7CisKKyAgICAvLyBhZGQgbmV3IGxpYnJhcnkKKyAgICB2b2lkIGFkZF9saWIoY29uc3QgVGFyZ2V0SW1hZ2UgJmxpYikKKyAgICB7CisgICAgICAgIG1fbG9jay5sb2NrKCk7CisgICAgICAgIG1fcmVhZHkgPSBmYWxzZTsKKyAgICAgICAgbV9pbWFnZXMucHVzaF9iYWNrKGxpYik7CisgICAgICAgIG1fbG9jay51bmxvY2soKTsKKyAgICB9CisKKyAgICBDT0lSRVNVTFQgY29tcHV0ZSgKKyAgICAgICAgY29uc3Qgc3RkOjpsaXN0PENPSUJVRkZFUj4gJmJ1ZmZlcnMsCisgICAgICAgIGNvbnN0IHZvaWQqICAgICAgICAgZGF0YSwKKyAgICAgICAgdWludDE2X3QgICAgICAgICAgICBkYXRhX3NpemUsCisgICAgICAgIHZvaWQqICAgICAgICAgICAgICAgcmV0LAorICAgICAgICB1aW50MTZfdCAgICAgICAgICAgIHJldF9zaXplLAorICAgICAgICB1aW50MzJfdCAgICAgICAgICAgIG51bV9kZXBzLAorICAgICAgICBjb25zdCBDT0lFVkVOVCogICAgIGRlcHMsCisgICAgICAgIENPSUVWRU5UKiAgICAgICAgICAgZXZlbnQKKyAgICApOworCisjaWZkZWYgTVlPX1NVUFBPUlQKKyAgICAvLyB0ZW1wb3Jhcnkgd29ya2Fyb3VuZCBmb3IgYmxvY2tpbmcgYmVoYXZpb3IgZm9yIG15b2lMaWJJbml0L0ZpbmkgY2FsbHMKKyAgICB2b2lkIGluaXRfbXlvKENPSUVWRU5UICpldmVudCkgeworICAgICAgICBDT0lSRVNVTFQgcmVzOworICAgICAgICByZXMgPSBDT0k6OlBpcGVsaW5lUnVuRnVuY3Rpb24oZ2V0X3BpcGVsaW5lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2Z1bmNzW2NfZnVuY19teW9faW5pdF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQpOworICAgICAgICBjaGVja19yZXN1bHQocmVzLCBjX3BpcGVsaW5lX3J1bl9mdW5jLCBtX2luZGV4LCByZXMpOworICAgIH0KKworICAgIHZvaWQgZmluaV9teW8oQ09JRVZFTlQgKmV2ZW50KSB7CisgICAgICAgIENPSVJFU1VMVCByZXM7CisgICAgICAgIHJlcyA9IENPSTo6UGlwZWxpbmVSdW5GdW5jdGlvbihnZXRfcGlwZWxpbmUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZnVuY3NbY19mdW5jX215b19maW5pXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCk7CisgICAgICAgIGNoZWNrX3Jlc3VsdChyZXMsIGNfcGlwZWxpbmVfcnVuX2Z1bmMsIG1faW5kZXgsIHJlcyk7CisgICAgfQorI2VuZGlmIC8vIE1ZT19TVVBQT1JUCisKKyAgICAvLworICAgIC8vIE1lbW9yeSBhc3NvY2lhdGlvbiB0YWJsZQorICAgIC8vCisgICAgUHRyRGF0YSogZmluZF9wdHJfZGF0YShjb25zdCB2b2lkICpwdHIpIHsKKyAgICAgICAgbV9wdHJfbG9jay5sb2NrKCk7CisgICAgICAgIFB0clNldDo6aXRlcmF0b3IgcmVzID0gbV9wdHJfc2V0LmZpbmQoUHRyRGF0YShwdHIsIDApKTsKKyAgICAgICAgbV9wdHJfbG9jay51bmxvY2soKTsKKyAgICAgICAgaWYgKHJlcyA9PSBtX3B0cl9zZXQuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjb25zdF9jYXN0PFB0ckRhdGEqPihyZXMub3BlcmF0b3ItPigpKTsKKyAgICB9CisKKyAgICBQdHJEYXRhKiBpbnNlcnRfcHRyX2RhdGEoY29uc3Qgdm9pZCAqcHRyLCB1aW50NjRfdCBsZW4sIGJvb2wgJmlzX25ldykgeworICAgICAgICBtX3B0cl9sb2NrLmxvY2soKTsKKyAgICAgICAgc3RkOjpwYWlyPFB0clNldDo6aXRlcmF0b3IsIGJvb2w+IHJlcyA9CisgICAgICAgICAgICBtX3B0cl9zZXQuaW5zZXJ0KFB0ckRhdGEocHRyLCBsZW4pKTsKKyAgICAgICAgUHRyRGF0YSogcHRyX2RhdGEgPSBjb25zdF9jYXN0PFB0ckRhdGEqPihyZXMuZmlyc3Qub3BlcmF0b3ItPigpKTsKKyAgICAgICAgbV9wdHJfbG9jay51bmxvY2soKTsKKworICAgICAgICBpc19uZXcgPSByZXMuc2Vjb25kOworICAgICAgICBpZiAoaXNfbmV3KSB7CisgICAgICAgICAgICAvLyBJdCdzIG5lY2Vzc2FyeSB0byBsb2NrIGFzIHNvb24gYXMgcG9zc2libGUuCisgICAgICAgICAgICAvLyB1bmxvY2sgbXVzdCBiZSBkb25lIGF0IGNhbGwgc2l0ZSBvZiBpbnNlcnRfcHRyX2RhdGEgYXQKKyAgICAgICAgICAgIC8vIGJyYW5jaCBmb3IgaXNfbmV3CisgICAgICAgICAgICBwdHJfZGF0YS0+YWxsb2NfcHRyX2RhdGFfbG9jay5sb2NrKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHB0cl9kYXRhOworICAgIH0KKworICAgIHZvaWQgcmVtb3ZlX3B0cl9kYXRhKGNvbnN0IHZvaWQgKnB0cikgeworICAgICAgICBtX3B0cl9sb2NrLmxvY2soKTsKKyAgICAgICAgbV9wdHJfc2V0LmVyYXNlKFB0ckRhdGEocHRyLCAwKSk7CisgICAgICAgIG1fcHRyX2xvY2sudW5sb2NrKCk7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBBdXRvbWF0aWMgdmFyaWFibGVzCisgICAgLy8KKyAgICBBdXRvRGF0YSogZmluZF9hdXRvX2RhdGEoY29uc3Qgdm9pZCAqcHRyKSB7CisgICAgICAgIEF1dG9TZXQgJmF1dG9fdmFycyA9IGdldF9hdXRvX3ZhcnMoKTsKKyAgICAgICAgQXV0b1NldDo6aXRlcmF0b3IgcmVzID0gYXV0b192YXJzLmZpbmQoQXV0b0RhdGEocHRyLCAwKSk7CisgICAgICAgIGlmIChyZXMgPT0gYXV0b192YXJzLmVuZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29uc3RfY2FzdDxBdXRvRGF0YSo+KHJlcy5vcGVyYXRvci0+KCkpOworICAgIH0KKworICAgIEF1dG9EYXRhKiBpbnNlcnRfYXV0b19kYXRhKGNvbnN0IHZvaWQgKnB0ciwgdWludDY0X3QgbGVuKSB7CisgICAgICAgIEF1dG9TZXQgJmF1dG9fdmFycyA9IGdldF9hdXRvX3ZhcnMoKTsKKyAgICAgICAgc3RkOjpwYWlyPEF1dG9TZXQ6Oml0ZXJhdG9yLCBib29sPiByZXMgPQorICAgICAgICAgICAgYXV0b192YXJzLmluc2VydChBdXRvRGF0YShwdHIsIGxlbikpOworICAgICAgICByZXR1cm4gY29uc3RfY2FzdDxBdXRvRGF0YSo+KHJlcy5maXJzdC5vcGVyYXRvci0+KCkpOworICAgIH0KKworICAgIHZvaWQgcmVtb3ZlX2F1dG9fZGF0YShjb25zdCB2b2lkICpwdHIpIHsKKyAgICAgICAgZ2V0X2F1dG9fdmFycygpLmVyYXNlKEF1dG9EYXRhKHB0ciwgMCkpOworICAgIH0KKworICAgIC8vCisgICAgLy8gU2lnbmFscworICAgIC8vCisgICAgdm9pZCBhZGRfc2lnbmFsKGNvbnN0IHZvaWQgKnNpZ25hbCwgT2ZmbG9hZERlc2NyaXB0b3IgKmRlc2MpIHsKKyAgICAgICAgbV9zaWduYWxfbG9jay5sb2NrKCk7CisgICAgICAgIG1fc2lnbmFsX21hcFtzaWduYWxdID0gZGVzYzsKKyAgICAgICAgbV9zaWduYWxfbG9jay51bmxvY2soKTsKKyAgICB9CisKKyAgICBPZmZsb2FkRGVzY3JpcHRvciogZmluZF9zaWduYWwoY29uc3Qgdm9pZCAqc2lnbmFsLCBib29sIHJlbW92ZSkgeworICAgICAgICBPZmZsb2FkRGVzY3JpcHRvciAqZGVzYyA9IDA7CisKKyAgICAgICAgbV9zaWduYWxfbG9jay5sb2NrKCk7CisgICAgICAgIHsKKyAgICAgICAgICAgIFNpZ25hbE1hcDo6aXRlcmF0b3IgaXQgPSBtX3NpZ25hbF9tYXAuZmluZChzaWduYWwpOworICAgICAgICAgICAgaWYgKGl0ICE9IG1fc2lnbmFsX21hcC5lbmQoKSkgeworICAgICAgICAgICAgICAgIGRlc2MgPSBpdC0+c2Vjb25kOworICAgICAgICAgICAgICAgIGlmIChyZW1vdmUpIHsKKyAgICAgICAgICAgICAgICAgICAgbV9zaWduYWxfbWFwLmVyYXNlKGl0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbV9zaWduYWxfbG9jay51bmxvY2soKTsKKworICAgICAgICByZXR1cm4gZGVzYzsKKyAgICB9CisKKyAgICAvLyBzdG9wIGRldmljZSBwcm9jZXNzCisgICAgdm9pZCBmaW5pX3Byb2Nlc3MoYm9vbCB2ZXJib3NlKTsKKworICAgIC8vIGxpc3Qgb2Ygc3RhY2tzIGFjdGl2ZSBhdCB0aGUgZW5naW5lCisgICAgUGVyc2lzdERhdGFMaXN0IG1fcGVyc2lzdF9saXN0OworCitwcml2YXRlOgorICAgIEVuZ2luZSgpIDogbV9pbmRleCgtMSksIG1fcGh5c2ljYWxfaW5kZXgoLTEpLCBtX3Byb2Nlc3MoMCksIG1fcmVhZHkoZmFsc2UpLAorICAgICAgICAgICAgICAgbV9wcm9jX251bWJlcigwKQorICAgIHt9CisKKyAgICB+RW5naW5lKCkgeworICAgICAgICBpZiAobV9wcm9jZXNzICE9IDApIHsKKyAgICAgICAgICAgIGZpbmlfcHJvY2VzcyhmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBzZXQgaW5kZXhlcworICAgIHZvaWQgc2V0X2luZGV4ZXMoaW50IGxvZ2ljYWxfaW5kZXgsIGludCBwaHlzaWNhbF9pbmRleCkgeworICAgICAgICBtX2luZGV4ID0gbG9naWNhbF9pbmRleDsKKyAgICAgICAgbV9waHlzaWNhbF9pbmRleCA9IHBoeXNpY2FsX2luZGV4OworICAgIH0KKworICAgIC8vIHN0YXJ0IHByb2Nlc3Mgb24gZGV2aWNlCisgICAgdm9pZCBpbml0X3Byb2Nlc3MoKTsKKworICAgIHZvaWQgbG9hZF9saWJyYXJpZXModm9pZCk7CisgICAgdm9pZCBpbml0X3B0cl9kYXRhKHZvaWQpOworCisgICAgLy8gcGVyZm9ybXMgbGlicmFyeSBpbnRpYWxpemF0aW9uIG9uIHRoZSBkZXZpY2Ugc2lkZQorICAgIHBpZF90IGluaXRfZGV2aWNlKHZvaWQpOworCitwcml2YXRlOgorICAgIC8vIGdldCBwaXBlbGluZSBhc3NvY2lhdGVkIHdpdGggYSBjYWxsaW5nIHRocmVhZAorICAgIENPSVBJUEVMSU5FIGdldF9waXBlbGluZSh2b2lkKTsKKworICAgIC8vIGdldCBhdXRvbWF0aWMgdmFycyBzZXQgYXNzb2NpYXRlZCB3aXRoIHRoZSBjYWxsaW5nIHRocmVhZAorICAgIEF1dG9TZXQmIGdldF9hdXRvX3ZhcnModm9pZCk7CisKKyAgICAvLyBkZXN0cnVjdG9yIGZvciB0aHJlYWQgZGF0YQorICAgIHN0YXRpYyB2b2lkIGRlc3Ryb3lfdGhyZWFkX2RhdGEodm9pZCAqZGF0YSk7CisKK3ByaXZhdGU6CisgICAgdHlwZWRlZiBzdGQ6OnNldDxQdHJEYXRhPiBQdHJTZXQ7CisgICAgdHlwZWRlZiBzdGQ6Om1hcDxjb25zdCB2b2lkKiwgT2ZmbG9hZERlc2NyaXB0b3IqPiBTaWduYWxNYXA7CisKKyAgICAvLyBkZXZpY2UgaW5kZXhlcworICAgIGludCAgICAgICAgIG1faW5kZXg7CisgICAgaW50ICAgICAgICAgbV9waHlzaWNhbF9pbmRleDsKKworICAgIC8vIG51bWJlciBvZiBDT0kgcGlwZXMgY3JlYXRlZCBmb3IgdGhlIGVuZ2luZQorICAgIGxvbmcgICAgICAgIG1fcHJvY19udW1iZXI7CisKKyAgICAvLyBwcm9jZXNzIGhhbmRsZQorICAgIENPSVBST0NFU1MgIG1fcHJvY2VzczsKKworICAgIC8vIElmIGZhbHNlLCBkZXZpY2UgZWl0aGVyIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCBvciBuZXcgbGlicmFyaWVzCisgICAgLy8gaGF2ZSBiZWVuIGFkZGVkLgorICAgIGJvb2wgICAgICAgIG1fcmVhZHk7CisgICAgbXV0ZXhfdCAgICAgbV9sb2NrOworCisgICAgLy8gTGlzdCBvZiBsaWJyYXJpZXMgdG8gYmUgbG9hZGVkCisgICAgVGFyZ2V0SW1hZ2VMaXN0IG1faW1hZ2VzOworCisgICAgLy8gdmFyIHRhYmxlCisgICAgUHRyU2V0ICAgICAgbV9wdHJfc2V0OworICAgIG11dGV4X3QgICAgIG1fcHRyX2xvY2s7CisKKyAgICAvLyBzaWduYWxzCisgICAgU2lnbmFsTWFwIG1fc2lnbmFsX21hcDsKKyAgICBtdXRleF90ICAgbV9zaWduYWxfbG9jazsKKworICAgIC8vIGNvbnN0YW50cyBmb3IgYWNjZXNzaW5nIGRldmljZSBmdW5jdGlvbiBoYW5kbGVzCisgICAgZW51bSB7CisgICAgICAgIGNfZnVuY19jb21wdXRlID0gMCwKKyNpZmRlZiBNWU9fU1VQUE9SVAorICAgICAgICBjX2Z1bmNfbXlvX2luaXQsCisgICAgICAgIGNfZnVuY19teW9fZmluaSwKKyNlbmRpZiAvLyBNWU9fU1VQUE9SVAorICAgICAgICBjX2Z1bmNfaW5pdCwKKyAgICAgICAgY19mdW5jX3Zhcl90YWJsZV9zaXplLAorICAgICAgICBjX2Z1bmNfdmFyX3RhYmxlX2NvcHksCisgICAgICAgIGNfZnVuY3NfdG90YWwKKyAgICB9OworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBtX2Z1bmNfbmFtZXNbY19mdW5jc190b3RhbF07CisKKyAgICAvLyBkZXZpY2UgZnVuY3Rpb24gaGFuZGxlcworICAgIENPSUZVTkNUSU9OIG1fZnVuY3NbY19mdW5jc190b3RhbF07CisKKyAgICAvLyBpbnQgLT4gbmFtZSBtYXBwaW5nIGZvciBkZXZpY2Ugc2lnbmFscworICAgIHN0YXRpYyBjb25zdCBpbnQgICBjX3NpZ25hbF9tYXggPSAzMjsKKyAgICBzdGF0aWMgY29uc3QgY2hhciogY19zaWduYWxfbmFtZXNbY19zaWduYWxfbWF4XTsKK307CisKKyNlbmRpZiAvLyBPRkZMT0FEX0VOR0lORV9IX0lOQ0xVREVECmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX2Vudi5jcHAgYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX2Vudi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAzNzMzOAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfZW52LmNwcApAQCAtMCwwICsxLDM1NCBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAib2ZmbG9hZF9lbnYuaCIKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgIm9mZmxvYWRfdXRpbC5oIgorI2luY2x1ZGUgImxpYm9mZmxvYWRfZXJyb3JfY29kZXMuaCIKKworLy8gZm9yIGVudmlyb25tZW50IHZhcmlhYmxlcyB2YWxpZCBvbiBhbGwgY2FyZHMKK2NvbnN0IGludCBNaWNFbnZWYXI6OmFueV9jYXJkID0gLTE7CisKK01pY0VudlZhcjo6fk1pY0VudlZhcigpCit7CisgICAgZm9yIChzdGQ6Omxpc3Q8TWljRW52VmFyOjpDYXJkRW52VmFycyo+Ojpjb25zdF9pdGVyYXRvcgorICAgICAgICAgaXQgPSBjYXJkX3NwZWNfbGlzdC5iZWdpbigpOworICAgICAgICAgaXQgIT0gY2FyZF9zcGVjX2xpc3QuZW5kKCk7IGl0KyspIHsKKyAgICAgICAgQ2FyZEVudlZhcnMgKmNhcmRfZGF0YSA9ICppdDsKKyAgICAgICAgZGVsZXRlIGNhcmRfZGF0YTsKKyAgICB9Cit9CisKK01pY0VudlZhcjo6VmFyVmFsdWU6On5WYXJWYWx1ZSgpCit7CisgICAgZnJlZShlbnZfdmFyX3ZhbHVlKTsKK30KKworTWljRW52VmFyOjpDYXJkRW52VmFyczo6fkNhcmRFbnZWYXJzKCkKK3sKKyAgICBmb3IgKHN0ZDo6bGlzdDxNaWNFbnZWYXI6OlZhclZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gZW52X3ZhcnMuYmVnaW4oKTsKKyAgICAgICAgaXQgIT0gZW52X3ZhcnMuZW5kKCk7IGl0KyspIHsKKyAgICAgICAgICAgIFZhclZhbHVlICp2YXJfdmFsdWUgPSAqaXQ7CisgICAgICAgICAgICBkZWxldGUgdmFyX3ZhbHVlOworICAgIH0KK30KKworLy8gU2VhcmNoaW5nIGZvciBjYXJkIGluICJjYXJkX3NwZWNfbGlzdCIgbGlzdCB3aXRoIHRoZSBzYW1lICJudW1iZXIiCisKK01pY0VudlZhcjo6Q2FyZEVudlZhcnMqIE1pY0VudlZhcjo6Z2V0X2NhcmQoaW50IG51bWJlcikKK3sKKyAgICBpZiAobnVtYmVyID09IGFueV9jYXJkKSB7CisgICAgICAgIHJldHVybiAmY29tbW9uX3ZhcnM7CisgICAgfQorICAgIGZvciAoc3RkOjpsaXN0PE1pY0VudlZhcjo6Q2FyZEVudlZhcnMqPjo6Y29uc3RfaXRlcmF0b3IKKyAgICAgICAgIGl0ID0gY2FyZF9zcGVjX2xpc3QuYmVnaW4oKTsKKyAgICAgICAgIGl0ICE9IGNhcmRfc3BlY19saXN0LmVuZCgpOyBpdCsrKSB7CisgICAgICAgIENhcmRFbnZWYXJzICpjYXJkX2RhdGEgPSAqaXQ7CisgICAgICAgIGlmIChjYXJkX2RhdGEtPmNhcmRfbnVtYmVyID09IG51bWJlcikgeworICAgICAgICAgICAgcmV0dXJuIGNhcmRfZGF0YTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworLy8gU2VhcmNoaW5nIGZvciBlbnZpcm9ubWVudCB2YXJpYWJsZSBpbiAiZW52X3ZhciIgbGlzdCB3aXRoIHRoZSBzYW1lIG5hbWUKKworTWljRW52VmFyOjpWYXJWYWx1ZSogTWljRW52VmFyOjpDYXJkRW52VmFyczo6ZmluZF92YXIoCisgICAgY2hhciogZW52X3Zhcl9uYW1lLAorICAgIGludCBlbnZfdmFyX25hbWVfbGVuZ3RoCispCit7CisgICAgZm9yIChzdGQ6Omxpc3Q8TWljRW52VmFyOjpWYXJWYWx1ZSo+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGVudl92YXJzLmJlZ2luKCk7CisgICAgICAgIGl0ICE9IGVudl92YXJzLmVuZCgpOyBpdCsrKSB7CisgICAgICAgICAgICBWYXJWYWx1ZSAqdmFyX3ZhbHVlID0gKml0OworICAgICAgICAgICAgaWYgKHZhcl92YWx1ZS0+bGVuZ3RoID09IGVudl92YXJfbmFtZV9sZW5ndGggJiYKKyAgICAgICAgICAgICAgICAhc3RybmNtcCh2YXJfdmFsdWUtPmVudl92YXIsIGVudl92YXJfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBlbnZfdmFyX25hbWVfbGVuZ3RoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB2YXJfdmFsdWU7CisgICAgICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCit2b2lkIE1pY0VudlZhcjo6YW5hbHl6ZV9lbnZfdmFyKGNoYXIgKmVudl92YXJfc3RyaW5nKQoreworICAgIGNoYXIgICAgICAgICAgKmVudl92YXJfbmFtZTsKKyAgICBjaGFyICAgICAgICAgICplbnZfdmFyX2RlZjsKKyAgICBpbnQgICAgICAgICAgIGNhcmRfbnVtYmVyOworICAgIGludCAgICAgICAgICAgZW52X3Zhcl9uYW1lX2xlbmd0aDsKKyAgICBNaWNFbnZWYXJLaW5kIGVudl92YXJfa2luZDsKKworICAgIGVudl92YXJfa2luZCA9IGdldF9lbnZfdmFyX2tpbmQoZW52X3Zhcl9zdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2FyZF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZW52X3Zhcl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVudl92YXJfbmFtZV9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZW52X3Zhcl9kZWYpOworICAgIHN3aXRjaCAoZW52X3Zhcl9raW5kKSB7CisgICAgICAgIGNhc2UgY19taWNfdmFyOgorICAgICAgICBjYXNlIGNfbWljX2NhcmRfdmFyOgorICAgICAgICAgICAgYWRkX2Vudl92YXIoY2FyZF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBlbnZfdmFyX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBlbnZfdmFyX25hbWVfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgZW52X3Zhcl9kZWYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19taWNfY2FyZF9lbnY6CisgICAgICAgICAgICBtaWNfcGFyc2VfZW52X3Zhcl9saXN0KGNhcmRfbnVtYmVyLCBlbnZfdmFyX2RlZik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX25vX21pYzoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKwordm9pZCBNaWNFbnZWYXI6OmFkZF9lbnZfdmFyKAorICAgIGludCBjYXJkX251bWJlciwKKyAgICBjaGFyICplbnZfdmFyX25hbWUsCisgICAgaW50IGVudl92YXJfbmFtZV9sZW5ndGgsCisgICAgY2hhciAqZW52X3Zhcl9kZWYKKykKK3sKKyAgICBWYXJWYWx1ZSAqdmFyOworICAgIENhcmRFbnZWYXJzICpjYXJkOworCisgICAgLy8gVGhlIGNhc2UgY29ycmVzcG9uZHMgdG8gY29tbW9uIGVudiB2YXIgZGVmaW5pdGlvbiBvZiBraW5kCisgICAgLy8gPG1pYy1wcmVmaXg+Xzx2YXI+CisgICAgaWYgKGNhcmRfbnVtYmVyID09IGFueV9jYXJkKSB7CisgICAgICAgIGNhcmQgPSAmY29tbW9uX3ZhcnM7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBjYXJkID0gZ2V0X2NhcmQoY2FyZF9udW1iZXIpOworICAgICAgICBpZiAoIWNhcmQpIHsKKyAgICAgICAgICAgIC8vIGRlZmluaXRpb24gZm9yIG5ldyBjYXJkIG9jY3VycmVkCisgICAgICAgICAgICBjYXJkID0gbmV3IENhcmRFbnZWYXJzKGNhcmRfbnVtYmVyKTsKKyAgICAgICAgICAgIGNhcmRfc3BlY19saXN0LnB1c2hfYmFjayhjYXJkKTsKKyAgICAgICAgfQorCisgICAgfQorICAgIHZhciA9IGNhcmQtPmZpbmRfdmFyKGVudl92YXJfbmFtZSwgZW52X3Zhcl9uYW1lX2xlbmd0aCk7CisgICAgaWYgKCF2YXIpIHsKKyAgICAgICAgLy8gcHV0IG5ldyBlbnYgdmFyIGRlZmluaXRpb24gaW4gImVudl92YXIiIGxpc3QKKyAgICAgICAgdmFyID0gbmV3IFZhclZhbHVlKGVudl92YXJfbmFtZSwgZW52X3Zhcl9uYW1lX2xlbmd0aCwgZW52X3Zhcl9kZWYpOworICAgICAgICBjYXJkLT5lbnZfdmFycy5wdXNoX2JhY2sodmFyKTsKKyAgICB9Cit9CisKKy8vIFRoZSByb3V0aW5lIGFuYWx5c2VzIHN0cmluZyBwb2ludGVkIGJ5ICJlbnZfdmFyX3N0cmluZyIgYXJndW1lbnQKKy8vIGFjY29yZGluZyB0byB0aGUgZm9sbG93aW5nIHN5bnRheDoKKy8vCisvLyBTcGVjaWZpY2F0aW9uIG9mIHByZWZpeCBmb3IgTUlDIGVudmlyb25tZW50IHZhcmlhYmxlcworLy8gTUlDX0VOVl9QUkVGSVg9PG1pYy1wcmVmaXg+CisvLworLy8gU2V0dGluZyBzaW5nbGUgTUlDIGVudmlyb25tZW50IHZhcmlhYmxlCisvLyA8bWljLXByZWZpeD5fPHZhcj49PHZhbHVlPgorLy8gPG1pYy1wcmVmaXg+XzxjYXJkLW51bWJlcj5fPHZhcj49PHZhbHVlPgorCisvLyBTZXR0aW5nIG11bHRpcGxlIE1JQyBlbnZpcm9ubWVudCB2YXJpYWJsZXMKKy8vIDxtaWMtcHJlZml4Pl88Y2FyZC1udW1iZXI+X0VOVj08ZW52LXZhcnM+CisKK01pY0VudlZhcktpbmQgTWljRW52VmFyOjpnZXRfZW52X3Zhcl9raW5kKAorICAgIGNoYXIgKmVudl92YXJfc3RyaW5nLAorICAgIGludCAqY2FyZF9udW1iZXIsCisgICAgY2hhciAqKmVudl92YXJfbmFtZSwKKyAgICBpbnQgKmVudl92YXJfbmFtZV9sZW5ndGgsCisgICAgY2hhciAqKmVudl92YXJfZGVmCispCit7CisgICAgaW50IGxlbiA9IHN0cmxlbihwcmVmaXgpOworICAgIGNoYXIgKmMgPSBlbnZfdmFyX3N0cmluZzsKKyAgICBpbnQgbnVtID0gMDsKKyAgICBib29sIGNhcmRfaXNfc2V0ID0gZmFsc2U7CisKKyAgICBpZiAoc3RybmNtcChjLCBwcmVmaXgsIGxlbikgIT0gMCB8fCBjW2xlbl0gIT0gJ18nKSB7CisgICAgICAgICAgICByZXR1cm4gY19ub19taWM7CisgICAgfQorICAgIGMgKz0gbGVuICsgMTsKKworICAgICpjYXJkX251bWJlciA9IGFueV9jYXJkOworICAgIGlmIChpc2RpZ2l0KCpjKSkgeworICAgICAgICB3aGlsZSAoaXNkaWdpdCAoKmMpKSB7CisgICAgICAgICAgICBudW0gPSAoKmMrKyAtICcwJykgKyAobnVtICogMTApOworICAgICAgICB9CisgICAgaWYgKCpjICE9ICdfJykgeworICAgICAgICByZXR1cm4gY19ub19taWM7CisgICAgfQorICAgIGMrKzsKKyAgICAgICAgKmNhcmRfbnVtYmVyID0gbnVtOworICAgICAgICBjYXJkX2lzX3NldCA9IHRydWU7CisgICAgfQorICAgIGlmICghaXNhbHBoYSgqYykpIHsKKyAgICAgICAgcmV0dXJuIGNfbm9fbWljOworICAgIH0KKyAgICAqZW52X3Zhcl9uYW1lID0gKmVudl92YXJfZGVmID0gYzsKKyAgICBpZiAoc3RybmNtcChjLCAiRU5WPSIsIDQpID09IDApIHsKKyAgICAgICAgaWYgKCFjYXJkX2lzX3NldCkgeworICAgICAgICAgICAgKmVudl92YXJfbmFtZV9sZW5ndGggPSAzOworICAgICAgICAgICAgKmVudl92YXJfbmFtZSA9ICplbnZfdmFyX2RlZiA9IGM7CisgICAgICAgICAgICAqZW52X3Zhcl9kZWYgPSBzdHJkdXAoKmVudl92YXJfZGVmKTsKKyAgICAgICAgICAgIHJldHVybiAgY19taWNfdmFyOworICAgICAgICB9CisgICAgICAgICplbnZfdmFyX2RlZiA9IGMgKyBzdHJsZW4oIkVOVj0iKTsKKyAgICAgICAgKmVudl92YXJfZGVmID0gc3RyZHVwKCplbnZfdmFyX2RlZik7CisgICAgICAgIHJldHVybiBjX21pY19jYXJkX2VudjsKKyAgICB9CisgICAgaWYgKGlzYWxwaGEoKmMpKSB7CisgICAgICAgICplbnZfdmFyX25hbWVfbGVuZ3RoID0gMDsKKyAgICAgICAgd2hpbGUgKGlzYWxudW0oKmMpIHx8ICpjID09ICdfJykgeworICAgICAgICAgICAgYysrOworICAgICAgICAgICAgKCplbnZfdmFyX25hbWVfbGVuZ3RoKSsrOworICAgICAgICB9CisgICAgfQorICAgIGlmICgqYyAhPSAnPScpIHsKKyAgICAgICAgcmV0dXJuIGNfbm9fbWljOworICAgIH0KKyAgICAqZW52X3Zhcl9kZWYgPSBzdHJkdXAoKmVudl92YXJfZGVmKTsKKyAgICByZXR1cm4gY2FyZF9pc19zZXQ/IGNfbWljX2NhcmRfdmFyIDogY19taWNfdmFyOworfQorCisvLyBhbmFseXNpbmcgPGVudi12YXJzPiBpbiBmb3JtOgorLy8gPG1pYy1wcmVmaXg+XzxjYXJkLW51bWJlcj5fRU5WPTxlbnYtdmFycz4KKy8vIHdoZXJlOgorLy8KKy8vIDxlbnYtdmFycz46CisvLyAgICAgICAgICAgICAgICA8ZW52LXZhcj4KKy8vICAgICAgICAgICAgICAgIDxlbnYtdmFycz4gfCA8ZW52LXZhcj4KKy8vCisvLyA8ZW52LXZhcj46CisvLyAgICAgICAgICAgICAgICB2YXJpYWJsZT12YWx1ZQorLy8gICAgICAgICAgICAgICAgdmFyaWFibGU9InZhbHVlIgorLy8gICAgICAgICAgICAgICAgdmFyaWFibGU9CisKK3ZvaWQgTWljRW52VmFyOjptaWNfcGFyc2VfZW52X3Zhcl9saXN0KAorICAgIGludCBjYXJkX251bWJlciwgY2hhciAqZW52X3ZhcnNfZGVmX2xpc3QpCit7CisgICAgY2hhciAqYyA9IGVudl92YXJzX2RlZl9saXN0OworICAgIGNoYXIgKmVudl92YXJfbmFtZTsKKyAgICBpbnQgIGVudl92YXJfbmFtZV9sZW5ndGg7CisgICAgY2hhciAqZW52X3Zhcl9kZWY7CisgICAgYm9vbCB2YXJfaXNfcXVvdGVkOworCisgICAgaWYgKCpjID09ICciJykgeworICAgICAgICBjKys7CisgICAgfQorICAgIHdoaWxlICgqYyAhPSAwKSB7CisgICAgICAgIHZhcl9pc19xdW90ZWQgPSBmYWxzZTsKKyAgICAgICAgZW52X3Zhcl9uYW1lID0gYzsKKyAgICAgICAgZW52X3Zhcl9uYW1lX2xlbmd0aCA9IDA7CisgICAgICAgIGlmIChpc2FscGhhKCpjKSkgeworICAgICAgICAgICAgd2hpbGUgKGlzYWxudW0oKmMpIHx8ICpjID09ICdfJykgeworICAgICAgICAgICAgICAgIGMrKzsKKyAgICAgICAgICAgICAgICBlbnZfdmFyX25hbWVfbGVuZ3RoKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfbWljX3BhcnNlX2Vudl92YXJfbGlzdDEpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICgqYyAhPSAnPScpIHsKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19taWNfcGFyc2VfZW52X3Zhcl9saXN0Mik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgYysrOworCisgICAgICAgIGlmICgqYyA9PSAnIicpIHsKKyAgICAgICAgICAgIHZhcl9pc19xdW90ZWQgPSB0cnVlOworICAgICAgICAgICAgYysrOworICAgICAgICB9CisgICAgICAgIC8vIEVudmlyb25tZW50IHZhcmlhYmxlIHZhbHVlcyB0aGF0IGNvbnRhaW4gfCB3aWxsIG5lZWQgdG8gYmUgZXNjYXBlZC4KKyAgICAgICAgd2hpbGUgKCpjICE9IDAgJiYgKmMgIT0gJ3wnICYmCisgICAgICAgICAgICAgICAoIXZhcl9pc19xdW90ZWQgfHwgKmMgIT0gJyInKSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gc2tpcCBlc2NhcGVkIHN5bWJvbAorICAgICAgICAgICAgaWYgKCpjID09ICdcXCcpIHsKKyAgICAgICAgICAgICAgICBjKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjKys7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZhcl9pc19xdW90ZWQpIHsKKyAgICAgICAgICAgIGMrKzsgLy8gZm9yICIKKyAgICAgICAgICAgIHdoaWxlICgqYyAhPSAwICYmICpjICE9ICd8JykgeworICAgICAgICAgICAgICAgIGMrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGludCBzeiA9IGMgLSBlbnZfdmFyX25hbWU7CisgICAgICAgIGVudl92YXJfZGVmID0gKGNoYXIqKW1hbGxvYyhzeik7CisgICAgICAgIG1lbWNweShlbnZfdmFyX2RlZiwgZW52X3Zhcl9uYW1lLCBzeik7CisgICAgICAgIGVudl92YXJfZGVmW3N6XSA9IDA7CisKKyAgICAgICAgaWYgKCpjID09ICd8JykgeworICAgICAgICAgICAgYysrOworICAgICAgICAgICAgd2hpbGUgKCpjICE9IDAgJiYgKmMgPT0gJyAnKSB7CisgICAgICAgICAgICAgICAgYysrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGFkZF9lbnZfdmFyKGNhcmRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICBlbnZfdmFyX25hbWUsCisgICAgICAgICAgICAgICAgICAgIGVudl92YXJfbmFtZV9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgIGVudl92YXJfZGVmKTsKKyAgICB9Cit9CisKKy8vIENvbGxlY3QgYWxsIGRlZmluaXRpb25zIGZvciB0aGUgY2FyZCB3aXRoIG51bWJlciAiY2FyZF9udW0iLgorLy8gVGhlIHJldHVybmVkIHJlc3VsdCBpcyB2ZWN0b3Igb2Ygc3RyaW5nIHBvaW50ZXJzIGRlZmluaW5nIG9uZQorLy8gZW52aXJvbm1lbnQgdmFyaWFibGUuIFRoZSB2ZWN0b3IgaXMgdGVybWluYXRlZCBieSBOVUxMIHBvaW50ZXIuCisvLyBJbiB0aGUgYmVnaW5uaW5nIG9mIHRoZSB2ZWN0b3IgdGhlcmUgYXJlIGVudiB2YXJzIGRlZmluZWQgYXMKKy8vIDxtaWMtcHJlZml4Pl88Y2FyZC1udW1iZXI+Xzx2YXI+PTx2YWx1ZT4KKy8vIG9yCisvLyA8bWljLXByZWZpeD5fPGNhcmQtbnVtYmVyPl9FTlY9PGVudi12YXJzPgorLy8gd2hlcmUgPGNhcmQtbnVtYmVyPiBpcyBlcXVhbCB0byAiY2FyZF9udW0iCisvLyBUaGV5IGFyZSBmb2xsb3dlZCBieSBkZWZpbml0aW9ucyB2YWxpZCBmb3IgYW55IGNhcmQKKy8vIGFuZCBhYnNlbnQgaW4gcHJldmlvdXMgZGVmaW5pdGlvbnMuCisKK2NoYXIqKiBNaWNFbnZWYXI6OmNyZWF0ZV9lbnZpcm9uX2Zvcl9jYXJkKGludCBjYXJkX251bSkKK3sKKyAgICBWYXJWYWx1ZSAqdmFyX3ZhbHVlOworICAgIFZhclZhbHVlICp2YXJfdmFsdWVfZmluZDsKKyAgICBDYXJkRW52VmFycyAqY2FyZF9kYXRhID0gZ2V0X2NhcmQoY2FyZF9udW0pOworICAgIENhcmRFbnZWYXJzICpjYXJkX2RhdGFfY29tbW9uOworICAgIHN0ZDo6bGlzdDxjaGFyKj4gbmV3X2VudjsKKyAgICBjaGFyICoqcmV6OworCisgICAgaWYgKCFwcmVmaXgpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIC8vIFRoZXJlIGlzIG5vIHBlcnNvbmVsIGVudiB2YXIgZGVmaW5pdGlvbnMgZm9yIHRoZSBjYXJkIHdpdGgKKyAgICAvLyBudW1iZXIgImNhcmRfbnVtIgorICAgIGlmICghY2FyZF9kYXRhKSB7CisgICAgICAgIHJldHVybiBjcmVhdGVfZW52aXJvbl9mb3JfY2FyZChhbnlfY2FyZCk7CisgICAgfQorCisgICAgZm9yIChzdGQ6Omxpc3Q8TWljRW52VmFyOjpWYXJWYWx1ZSo+Ojpjb25zdF9pdGVyYXRvcgorICAgICAgICAgaXQgPSBjYXJkX2RhdGEtPmVudl92YXJzLmJlZ2luKCk7CisgICAgICAgICBpdCAhPSBjYXJkX2RhdGEtPmVudl92YXJzLmVuZCgpOyBpdCsrKSB7CisgICAgICAgIHZhcl92YWx1ZSA9ICppdDsKKyAgICAgICAgbmV3X2Vudi5wdXNoX2JhY2sodmFyX3ZhbHVlLT5lbnZfdmFyX3ZhbHVlKTsKKyAgICB9CisKKyAgICBpZiAoY2FyZF9udW0gIT0gYW55X2NhcmQpIHsKKyAgICAgICAgY2FyZF9kYXRhX2NvbW1vbiA9IGdldF9jYXJkKGFueV9jYXJkKTsKKyAgICAgICAgZm9yIChzdGQ6Omxpc3Q8TWljRW52VmFyOjpWYXJWYWx1ZSo+Ojpjb25zdF9pdGVyYXRvcgorICAgICAgICAgICAgIGl0ID0gY2FyZF9kYXRhX2NvbW1vbi0+ZW52X3ZhcnMuYmVnaW4oKTsKKyAgICAgICAgICAgICBpdCAhPSBjYXJkX2RhdGFfY29tbW9uLT5lbnZfdmFycy5lbmQoKTsgaXQrKykgeworICAgICAgICAgICAgdmFyX3ZhbHVlID0gKml0OworICAgICAgICAgICAgdmFyX3ZhbHVlX2ZpbmQgPSBjYXJkX2RhdGEtPmZpbmRfdmFyKHZhcl92YWx1ZS0+ZW52X3ZhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJfdmFsdWUtPmxlbmd0aCk7CisgICAgICAgICAgICBpZiAoIXZhcl92YWx1ZV9maW5kKSB7CisgICAgICAgICAgICAgICAgbmV3X2Vudi5wdXNoX2JhY2sodmFyX3ZhbHVlLT5lbnZfdmFyX3ZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGludCBuZXdfZW52X3NpemUgPSBuZXdfZW52LnNpemUoKTsKKyAgICByZXogPSAoY2hhcioqKSBtYWxsb2MoKG5ld19lbnZfc2l6ZSArIDEpICogc2l6ZW9mKGNoYXIqKSk7CisgICAgc3RkOjpjb3B5KG5ld19lbnYuYmVnaW4oKSwgbmV3X2Vudi5lbmQoKSwgcmV6KTsKKyAgICByZXpbbmV3X2Vudl9zaXplXSA9IDA7CisgICAgcmV0dXJuIHJlejsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfZW52LmggYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX2Vudi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwMzVmZjYKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX2Vudi5oCkBAIC0wLDAgKzEsOTEgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBPRkZMT0FEX0VOVl9IX0lOQ0xVREVECisjZGVmaW5lIE9GRkxPQURfRU5WX0hfSU5DTFVERUQKKworI2luY2x1ZGUgPGxpc3Q+CisKKy8vIGRhdGEgc3RydWN0dXJlIGFuZCByb3V0aW5lcyB0byBwYXJzZSBNSUMgdXNlciBlbnZpcm9ubWVudCBhbmQgcGFzcyB0byBNSUMKKworZW51bSBNaWNFbnZWYXJLaW5kCit7CisgICAgY19ub19taWMsICAgICAgICAgLy8gbm90IE1JQyBlbnYgdmFyCisgICAgY19taWNfdmFyLCAgICAgICAgLy8gZm9yIDxtaWMtcHJlZml4Pl88dmFyPgorICAgIGNfbWljX2NhcmRfdmFyLCAgIC8vIGZvciA8bWljLXByZWZpeD5fPGNhcmQtbnVtYmVyPl88dmFyPgorICAgIGNfbWljX2NhcmRfZW52ICAgIC8vIGZvciA8bWljLXByZWZpeD5fPGNhcmQtbnVtYmVyPl9FTlYKK307CisKK3N0cnVjdCBNaWNFbnZWYXIgeworcHVibGljOgorICAgIE1pY0VudlZhcigpIDogcHJlZml4KDApIHt9CisgICAgfk1pY0VudlZhcigpOworCisgICAgdm9pZCBhbmFseXplX2Vudl92YXIoY2hhciAqZW52X3Zhcl9zdHJpbmcpOworICAgIGNoYXIqKiBjcmVhdGVfZW52aXJvbl9mb3JfY2FyZChpbnQgY2FyZF9udW0pOworICAgIE1pY0VudlZhcktpbmQgZ2V0X2Vudl92YXJfa2luZCgKKyAgICAgICAgY2hhciAqZW52X3Zhcl9zdHJpbmcsCisgICAgICAgIGludCAqY2FyZF9udW1iZXIsCisgICAgICAgIGNoYXIgKiplbnZfdmFyX25hbWUsCisgICAgICAgIGludCAqZW52X3Zhcl9uYW1lX2xlbmd0aCwKKyAgICAgICAgY2hhciAqKmVudl92YXJfZGVmCisgICAgKTsKKyAgICB2b2lkIGFkZF9lbnZfdmFyKAorICAgICAgICBpbnQgY2FyZF9udW1iZXIsCisgICAgICAgIGNoYXIgKmVudl92YXJfbmFtZSwKKyAgICAgICAgaW50IGVudl92YXJfbmFtZV9sZW5ndGgsCisgICAgICAgIGNoYXIgKmVudl92YXJfZGVmCisgICAgKTsKKworICAgIHZvaWQgc2V0X3ByZWZpeChjb25zdCBjaGFyICpwcmVmKSB7CisgICAgICAgIHByZWZpeCA9IChwcmVmICYmICpwcmVmICE9ICdcMCcpID8gcHJlZiA6IDA7CisgICAgfQorCisgICAgc3RydWN0IFZhclZhbHVlIHsKKyAgICBwdWJsaWM6CisgICAgICAgIGNoYXIqIGVudl92YXI7CisgICAgICAgIGludCAgIGxlbmd0aDsKKyAgICAgICAgY2hhciogZW52X3Zhcl92YWx1ZTsKKworICAgICAgICBWYXJWYWx1ZShjaGFyKiB2YXIsIGludCBsbiwgY2hhciogdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGVudl92YXIgPSB2YXI7CisgICAgICAgICAgICBsZW5ndGggPSBsbjsKKyAgICAgICAgICAgIGVudl92YXJfdmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgfQorICAgICAgICB+VmFyVmFsdWUoKTsKKyAgICB9OworCisgICAgc3RydWN0IENhcmRFbnZWYXJzIHsKKyAgICBwdWJsaWM6CisKKyAgICAgICAgaW50IGNhcmRfbnVtYmVyOworICAgICAgICBzdGQ6Omxpc3Q8c3RydWN0IFZhclZhbHVlKj4gZW52X3ZhcnM7CisKKyAgICAgICAgQ2FyZEVudlZhcnMoKSB7IGNhcmRfbnVtYmVyID0gYW55X2NhcmQ7IH0KKyAgICAgICAgQ2FyZEVudlZhcnMoaW50IG51bSkgeyBjYXJkX251bWJlciA9IG51bTsgfQorICAgICAgICB+Q2FyZEVudlZhcnMoKTsKKworICAgICAgICB2b2lkIGFkZF9uZXdfZW52X3ZhcihpbnQgbnVtYmVyLCBjaGFyICplbnZfdmFyLCBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICplbnZfdmFyX3ZhbHVlKTsKKyAgICAgICAgVmFyVmFsdWUqIGZpbmRfdmFyKGNoYXIqIGVudl92YXJfbmFtZSwgaW50IGVudl92YXJfbmFtZV9sZW5ndGgpOworICAgIH07CisgICAgc3RhdGljIGNvbnN0IGludCBhbnlfY2FyZDsKKworcHJpdmF0ZToKKyAgICB2b2lkICAgICAgICAgbWljX3BhcnNlX2Vudl92YXJfbGlzdChpbnQgY2FyZF9udW1iZXIsIGNoYXIgKmVudl92YXJfZGVmKTsKKyAgICBDYXJkRW52VmFycyogZ2V0X2NhcmQoaW50IG51bWJlcik7CisKKyAgICBjb25zdCBjaGFyICpwcmVmaXg7CisgICAgc3RkOjpsaXN0PHN0cnVjdCBDYXJkRW52VmFycyAqPiBjYXJkX3NwZWNfbGlzdDsKKyAgICBDYXJkRW52VmFycyBjb21tb25fdmFyczsKK307CisKKyNlbmRpZiAvLyBPRkZMT0FEX0VOVl9IX0lOQ0xVREVECmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX2hvc3QuY3BwIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9ob3N0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGQ1MTM5Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9ob3N0LmNwcApAQCAtMCwwICsxLDQzNjAgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworLy8gRm9yd2FyZCBkZWNsYXJhdGlvbiBhcyB0aGUgZm9sbG93aW5nIDIgZnVuY3Rpb25zIGFyZSBkZWNsYXJlZCBhcyBmcmllbmQgaW4gb2ZmbG9hZF9lbmdpbmUuaAorLy8gQ0xBTkcgZG9lcyBub3QgbGlrZSBzdGF0aWMgdG8gYmVlbiBhZnRlciBmcmllbmQgZGVjbGFyYXRpb24uCitzdGF0aWMgdm9pZCBfX29mZmxvYWRfaW5pdF9saWJyYXJ5X29uY2Uodm9pZCk7CitzdGF0aWMgdm9pZCBfX29mZmxvYWRfZmluaV9saWJyYXJ5KHZvaWQpOworCisjaW5jbHVkZSAib2ZmbG9hZF9ob3N0LmgiCisjaWZkZWYgTVlPX1NVUFBPUlQKKyNpbmNsdWRlICJvZmZsb2FkX215b19ob3N0LmgiCisjZW5kaWYKKworI2luY2x1ZGUgPG1hbGxvYy5oPgorI2lmbmRlZiBUQVJHRVRfV0lOTlQKKyNpbmNsdWRlIDxhbGxvY2EuaD4KKyNpbmNsdWRlIDxlbGYuaD4KKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGJpdHNldD4KKworI2lmIGRlZmluZWQoSE9TVF9XSU5OVCkKKyNkZWZpbmUgUEFUSF9TRVBBUkFUT1IgIjsiCisjZWxzZQorI2RlZmluZSBQQVRIX1NFUEFSQVRPUiAiOiIKKyNlbmRpZgorCisjZGVmaW5lIEdFVF9PRkZMT0FEX05VTUJFUih0aW1lcl9kYXRhKSBcCisgICAgdGltZXJfZGF0YT8gdGltZXJfZGF0YS0+b2ZmbG9hZF9udW1iZXIgOiAwCisKKyNpZmRlZiBUQVJHRVRfV0lOTlQKKy8vIFNtYWxsIHN1YnNldCBvZiBFTEYgZGVjbGFyYXRpb25zIGZvciBXaW5kb3dzIHdoaWNoIGlzIG5lZWRlZCB0byBjb21waWxlCisvLyB0aGlzIGZpbGUuIEVMRiBoZWFkZXIgaXMgdXNlZCB0byB1bmRlcnN0YW5kIHdoYXQgYmluYXJ5IHR5cGUgaXMgY29udGFpbmVkCisvLyBpbiB0aGUgdGFyZ2V0IGltYWdlIC0gc2hhcmVkIGxpYnJhcnkgb3IgZXhlY3V0YWJsZS4KKwordHlwZWRlZiB1aW50MTZfdCBFbGY2NF9IYWxmOwordHlwZWRlZiB1aW50MzJfdCBFbGY2NF9Xb3JkOwordHlwZWRlZiB1aW50NjRfdCBFbGY2NF9BZGRyOwordHlwZWRlZiB1aW50NjRfdCBFbGY2NF9PZmY7CisKKyNkZWZpbmUgRUlfTklERU5UICAgMTYKKworI2RlZmluZSBFVF9FWEVDICAgICAyCisjZGVmaW5lIEVUX0RZTiAgICAgIDMKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1bnNpZ25lZCBjaGFyIGVfaWRlbnRbRUlfTklERU5UXTsKKyAgICBFbGY2NF9IYWxmICAgIGVfdHlwZTsKKyAgICBFbGY2NF9IYWxmICAgIGVfbWFjaGluZTsKKyAgICBFbGY2NF9Xb3JkICAgIGVfdmVyc2lvbjsKKyAgICBFbGY2NF9BZGRyICAgIGVfZW50cnk7CisgICAgRWxmNjRfT2ZmICAgICBlX3Bob2ZmOworICAgIEVsZjY0X09mZiAgICAgZV9zaG9mZjsKKyAgICBFbGY2NF9Xb3JkICAgIGVfZmxhZ3M7CisgICAgRWxmNjRfSGFsZiAgICBlX2Voc2l6ZTsKKyAgICBFbGY2NF9IYWxmICAgIGVfcGhlbnRzaXplOworICAgIEVsZjY0X0hhbGYgICAgZV9waG51bTsKKyAgICBFbGY2NF9IYWxmICAgIGVfc2hlbnRzaXplOworICAgIEVsZjY0X0hhbGYgICAgZV9zaG51bTsKKyAgICBFbGY2NF9IYWxmICAgIGVfc2hzdHJuZHg7Cit9IEVsZjY0X0VoZHI7CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisKKy8vIEhvc3QgY29uc29sZSBhbmQgZmlsZSBsb2dnaW5nCitjb25zdCBjaGFyICpwcmVmaXg7CitpbnQgY29uc29sZV9lbmFibGVkID0gMDsKK2ludCBvZmZsb2FkX251bWJlciA9IDA7CisKK3N0YXRpYyBjb25zdCBjaGFyICpodHJhY2VfZW52bmFtZSA9ICJIX1RSQUNFIjsKK3N0YXRpYyBjb25zdCBjaGFyICpvZmZsb2FkX3JlcG9ydF9lbnZuYW1lID0gIk9GRkxPQURfUkVQT1JUIjsKK3N0YXRpYyBjaGFyICp0aW1lcl9lbnZuYW1lID0gIkhfVElNRSI7CisKKy8vIFRyYWNlIGluZm9ybWF0aW9uCitzdGF0aWMgY29uc3QgY2hhciogdmFyZGVzY19kaXJlY3Rpb25fYXNfc3RyaW5nW10gPSB7CisgICAgIk5PQ09QWSIsCisgICAgIklOIiwKKyAgICAiT1VUIiwKKyAgICAiSU5PVVQiCit9Oworc3RhdGljIGNvbnN0IGNoYXIqIHZhcmRlc2NfdHlwZV9hc19zdHJpbmdbXSA9IHsKKyAgICAidW5rbm93biIsCisgICAgImRhdGEiLAorICAgICJkYXRhX3B0ciIsCisgICAgImZ1bmNfcHRyIiwKKyAgICAidm9pZF9wdHIiLAorICAgICJzdHJpbmdfcHRyIiwKKyAgICAiZHYiLAorICAgICJkdl9kYXRhIiwKKyAgICAiZHZfZGF0YV9zbGljZSIsCisgICAgImR2X3B0ciIsCisgICAgImR2X3B0cl9kYXRhIiwKKyAgICAiZHZfcHRyX2RhdGFfc2xpY2UiLAorICAgICJjZWFuX3ZhciIsCisgICAgImNlYW5fdmFyX3B0ciIsCisgICAgImNfZGF0YV9wdHJfYXJyYXkiLAorICAgICJjX2Z1bmNfcHRyX2FycmF5IiwKKyAgICAiY192b2lkX3B0cl9hcnJheSIsCisgICAgImNfc3RyaW5nX3B0cl9hcnJheSIKK307CisKK0VuZ2luZSogICAgICAgICBtaWNfZW5naW5lcyA9IDA7Cit1aW50MzJfdCAgICAgICAgbWljX2VuZ2luZXNfdG90YWwgPSAwOworcHRocmVhZF9rZXlfdCAgIG1pY190aHJlYWRfa2V5OworTWljRW52VmFyICAgICAgIG1pY19lbnZfdmFyczsKK3VpbnQ2NF90ICAgICAgICBjcHVfZnJlcXVlbmN5ID0gMDsKKworLy8gTUlDX1NUQUNLU0laRQordWludDMyX3QgbWljX3N0YWNrX3NpemUgPSAxMiAqIDEwMjQgKiAxMDI0OworCisvLyBNSUNfQlVGRkVSU0laRQordWludDY0X3QgbWljX2J1ZmZlcl9zaXplID0gMDsKKworLy8gTUlDX0xEX0xJQlJBUllfUEFUSAorY2hhciogbWljX2xpYnJhcnlfcGF0aCA9IDA7CisKKy8vIE1JQ19QUk9YWV9JTworYm9vbCBtaWNfcHJveHlfaW8gPSB0cnVlOworCisvLyBNSUNfUFJPWFlfRlNfUk9PVAorY2hhciogbWljX3Byb3h5X2ZzX3Jvb3QgPSAwOworCisvLyBUaHJlc2hvbGQgZm9yIGNyZWF0aW5nIGJ1ZmZlcnMgd2l0aCBsYXJnZSBwYWdlcy4gQnVmZmVyIGlzIGNyZWF0ZWQKKy8vIHdpdGggbGFyZ2UgcGFnZXMgaGludCBpZiBpdHMgc2l6ZSBleGNlZWRzIHRoZSB0aHJlc2hvbGQgdmFsdWUuCisvLyBCeSBkZWZhdWx0IGxhcmdlIHBhZ2VzIGFyZSBkaXNhYmxlZCByaWdodCBub3cgKGJ5IHNldHRpbmcgZGVmYXVsdAorLy8gdmFsdWUgZm9yIHRocmVzaG9sZCB0byBNQVgpIGR1ZSB0byBIU0QgNDExNDYyOS4KK3VpbnQ2NF90IF9fb2ZmbG9hZF91c2VfMm1iX2J1ZmZlcnMgPSAweGZmZmZmZmZmZmZmZmZmZmZVTEw7CitzdGF0aWMgY29uc3QgY2hhciAqbWljX3VzZV8ybWJfYnVmZmVyc19lbnZuYW1lICA9CisgICAgIk1JQ19VU0VfMk1CX0JVRkZFUlMiOworCitzdGF0aWMgdWludDY0X3QgX19vZmZsb2FkX3VzZV9hc3luY19idWZmZXJfd3JpdGUgPSAyICogMTAyNCAqIDEwMjQ7CitzdGF0aWMgY29uc3QgY2hhciAqbWljX3VzZV9hc3luY19idWZmZXJfd3JpdGVfZW52bmFtZSAgPQorICAgICJNSUNfVVNFX0FTWU5DX0JVRkZFUl9XUklURSI7CisKK3N0YXRpYyB1aW50NjRfdCBfX29mZmxvYWRfdXNlX2FzeW5jX2J1ZmZlcl9yZWFkID0gMiAqIDEwMjQgKiAxMDI0Oworc3RhdGljIGNvbnN0IGNoYXIgKm1pY191c2VfYXN5bmNfYnVmZmVyX3JlYWRfZW52bmFtZSAgPQorICAgICJNSUNfVVNFX0FTWU5DX0JVRkZFUl9SRUFEIjsKKworLy8gZGV2aWNlIGluaXRpYWxpemF0aW9uIHR5cGUKK09mZmxvYWRJbml0VHlwZSBfX29mZmxvYWRfaW5pdF90eXBlID0gY19pbml0X29uX29mZmxvYWRfYWxsOworc3RhdGljIGNvbnN0IGNoYXIgKm9mZmxvYWRfaW5pdF9lbnZuYW1lID0gIk9GRkxPQURfSU5JVCI7CisKKy8vIGFjdGl2ZSB3YWl0CitzdGF0aWMgYm9vbCBfX29mZmxvYWRfYWN0aXZlX3dhaXQgPSB0cnVlOworc3RhdGljIGNvbnN0IGNoYXIgKm9mZmxvYWRfYWN0aXZlX3dhaXRfZW52bmFtZSA9ICJPRkZMT0FEX0FDVElWRV9XQUlUIjsKKworLy8gT01QX0RFRkFVTFRfREVWSUNFCitpbnQgX19vbXBfZGV2aWNlX251bSA9IDA7CitzdGF0aWMgY29uc3QgY2hhciAqb21wX2RldmljZV9udW1fZW52bmFtZSA9ICJPTVBfREVGQVVMVF9ERVZJQ0UiOworCisvLyBUaGUgbGlzdCBvZiBwZW5kaW5nIHRhcmdldCBsaWJyYXJpZXMKK3N0YXRpYyBib29sICAgICAgICAgICAgX190YXJnZXRfbGliczsKK3N0YXRpYyBUYXJnZXRJbWFnZUxpc3QgX190YXJnZXRfbGlic19saXN0Oworc3RhdGljIG11dGV4X3QgICAgICAgICBfX3RhcmdldF9saWJzX2xvY2s7CitzdGF0aWMgbXV0ZXhfdCAgICAgICAgIHN0YWNrX2FsbG9jX2xvY2s7CisKKy8vIFRhcmdldCBleGVjdXRhYmxlCitUYXJnZXRJbWFnZSogICAgICAgICAgIF9fdGFyZ2V0X2V4ZTsKKworc3RhdGljIGNoYXIgKiBvZmZsb2FkX2dldF9zcmNfYmFzZSh2b2lkICogcHRyLCB1aW50OF90IHR5cGUpCit7CisgICAgY2hhciAqYmFzZTsKKyAgICBpZiAoVkFSX1RZUEVfSVNfUFRSKHR5cGUpKSB7CisgICAgICAgIGJhc2UgPSAqc3RhdGljX2Nhc3Q8Y2hhcioqPihwdHIpOworICAgIH0KKyAgICBlbHNlIGlmIChWQVJfVFlQRV9JU19TQ0FMQVIodHlwZSkpIHsKKyAgICAgICAgYmFzZSA9IHN0YXRpY19jYXN0PGNoYXIqPihwdHIpOworICAgIH0KKyAgICBlbHNlIGlmIChWQVJfVFlQRV9JU19EVl9EQVRBX1NMSUNFKHR5cGUpIHx8IFZBUl9UWVBFX0lTX0RWX0RBVEEodHlwZSkpIHsKKyAgICAgICAgQXJyRGVzYyAqZHZwOworICAgICAgICBpZiAoVkFSX1RZUEVfSVNfRFZfREFUQV9TTElDRSh0eXBlKSkgeworICAgICAgICAgICAgY29uc3QgYXJyX2Rlc2MgKmFwID0gc3RhdGljX2Nhc3Q8Y29uc3QgYXJyX2Rlc2MqPihwdHIpOworICAgICAgICAgICAgZHZwID0gKHR5cGUgPT0gY19kdl9kYXRhX3NsaWNlKSA/CisgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PEFyckRlc2MqPihhcC0+YmFzZSkgOgorICAgICAgICAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8QXJyRGVzYyoqPihhcC0+YmFzZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBkdnAgPSAodHlwZSA9PSBjX2R2X2RhdGEpID8KKyAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEFyckRlc2MqPihwdHIpIDoKKyAgICAgICAgICAgICAgICAgICpzdGF0aWNfY2FzdDxBcnJEZXNjKio+KHB0cik7CisgICAgICAgIH0KKyAgICAgICAgYmFzZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGR2cC0+QmFzZSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBiYXNlID0gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIGJhc2U7Cit9CisKK3ZvaWQgT2ZmbG9hZERlc2NyaXB0b3I6OnJlcG9ydF9jb2lfZXJyb3IoZXJyb3JfdHlwZXMgbXNnLCBDT0lSRVNVTFQgcmVzKQoreworICAgIC8vIHNwZWNpYWwgY2FzZSBmb3IgdGhlICdwcm9jZXNzIGRpZWQnIGVycm9yCisgICAgaWYgKHJlcyA9PSBDT0lfUFJPQ0VTU19ESUVEKSB7CisgICAgICAgIG1fZGV2aWNlLmZpbmlfcHJvY2Vzcyh0cnVlKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHN3aXRjaCAobXNnKSB7CisgICAgICAgICAgICBjYXNlIGNfYnVmX2NyZWF0ZToKKyAgICAgICAgICAgICAgICBpZiAocmVzID09IENPSV9PVVRfT0ZfTUVNT1JZKSB7CisgICAgICAgICAgICAgICAgICAgIG1zZyA9IGNfYnVmX2NyZWF0ZV9vdXRfb2ZfbWVtOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiBmYWxsdGhydSAqLworCisgICAgICAgICAgICBjYXNlIGNfYnVmX2NyZWF0ZV9mcm9tX21lbToKKyAgICAgICAgICAgIGNhc2UgY19idWZfZ2V0X2FkZHJlc3M6CisgICAgICAgICAgICBjYXNlIGNfcGlwZWxpbmVfY3JlYXRlOgorICAgICAgICAgICAgY2FzZSBjX3BpcGVsaW5lX3J1bl9mdW5jOgorICAgICAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IobXNnLCBtX2RldmljZS5nZXRfbG9naWNhbF9pbmRleCgpLCByZXMpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIGNfYnVmX3JlYWQ6CisgICAgICAgICAgICBjYXNlIGNfYnVmX3dyaXRlOgorICAgICAgICAgICAgY2FzZSBjX2J1Zl9jb3B5OgorICAgICAgICAgICAgY2FzZSBjX2J1Zl9tYXA6CisgICAgICAgICAgICBjYXNlIGNfYnVmX3VubWFwOgorICAgICAgICAgICAgY2FzZSBjX2J1Zl9kZXN0cm95OgorICAgICAgICAgICAgY2FzZSBjX2J1Zl9zZXRfc3RhdGU6CisgICAgICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihtc2csIHJlcyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBleGl0KDEpOworfQorCitfT2ZmbG9hZF9yZXN1bHQgT2ZmbG9hZERlc2NyaXB0b3I6OnRyYW5zbGF0ZV9jb2lfZXJyb3IoQ09JUkVTVUxUIHJlcykgY29uc3QKK3sKKyAgICBzd2l0Y2ggKHJlcykgeworICAgICAgICBjYXNlIENPSV9TVUNDRVNTOgorICAgICAgICAgICAgcmV0dXJuIE9GRkxPQURfU1VDQ0VTUzsKKworICAgICAgICBjYXNlIENPSV9QUk9DRVNTX0RJRUQ6CisgICAgICAgICAgICByZXR1cm4gT0ZGTE9BRF9QUk9DRVNTX0RJRUQ7CisKKyAgICAgICAgY2FzZSBDT0lfT1VUX09GX01FTU9SWToKKyAgICAgICAgICAgIHJldHVybiBPRkZMT0FEX09VVF9PRl9NRU1PUlk7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBPRkZMT0FEX0VSUk9SOworICAgIH0KK30KKworYm9vbCBPZmZsb2FkRGVzY3JpcHRvcjo6YWxsb2NfcHRyX2RhdGEoCisgICAgUHRyRGF0YSogJnB0cl9kYXRhLAorICAgIHZvaWQgKmJhc2UsCisgICAgaW50NjRfdCBkaXNwLAorICAgIGludDY0X3Qgc2l6ZSwKKyAgICBpbnQ2NF90IGFsbG9jX2Rpc3AsCisgICAgaW50IGFsaWduCispCit7CisgICAgLy8gdG90YWwgbGVuZ3RoIG9mIGJhc2UKKyAgICBpbnQ2NF90IGxlbmd0aCA9IGRpc3AgKyBzaXplOworICAgIGJvb2wgaXNfbmV3OworCisgICAgT0ZGTE9BRF9UUkFDRSgzLCAiQ3JlYXRpbmcgYXNzb2NpYXRpb24gZm9yIGRhdGE6IGFkZHIgJXAsIGxlbmd0aCAlbGxkXG4iLAorICAgICAgICAgICAgICAgICAgYmFzZSwgbGVuZ3RoKTsKKworICAgIC8vIGFkZCBuZXcgZW50cnkKKyAgICBwdHJfZGF0YSA9IG1fZGV2aWNlLmluc2VydF9wdHJfZGF0YShiYXNlLCBsZW5ndGgsIGlzX25ldyk7CisgICAgaWYgKGlzX25ldykgeworCisgICAgICAgIE9GRkxPQURfVFJBQ0UoMywgIkFkZGVkIG5ldyBhc3NvY2lhdGlvblxuIik7CisKKyAgICAgICAgaWYgKGxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgIE9mZmxvYWRUaW1lciB0aW1lcihnZXRfdGltZXJfZGF0YSgpLCBjX29mZmxvYWRfaG9zdF9hbGxvY19idWZmZXJzKTsKKyAgICAgICAgICAgIENPSVJFU1VMVCByZXM7CisKKyAgICAgICAgICAgIC8vIGFsaWduIHNob3VsZCBiZSBhIHBvd2VyIG9mIDIKKyAgICAgICAgICAgIGlmIChhbGlnbiA+IDAgJiYgKGFsaWduICYgKGFsaWduIC0gMSkpID09IDApIHsKKyAgICAgICAgICAgICAgICAvLyBvZmZzZXQgd2l0aGluIG1pY19idWZmZXIuIENhbiBkbyBvZmZzZXQgb3B0aW1pemF0aW9uCisgICAgICAgICAgICAgICAgLy8gb25seSB3aGVuIHNvdXJjZSBhZGRyZXNzIGFsaWdubWVudCBzYXRpc2ZpZXMgcmVxdWVzdGVkCisgICAgICAgICAgICAgICAgLy8gYWxpZ25tZW50IG9uIHRoZSB0YXJnZXQgKGNxMTcyNzM2KS4KKyAgICAgICAgICAgICAgICBpZiAoKHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KGJhc2UpICYgKGFsaWduIC0gMSkpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcHRyX2RhdGEtPm1pY19vZmZzZXQgPSByZWludGVycHJldF9jYXN0PGludHB0cl90PihiYXNlKSAmIDQwOTU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBidWZmZXIgc2l6ZSBhbmQgZmxhZ3MKKyAgICAgICAgICAgIHVpbnQ2NF90IGJ1ZmZlcl9zaXplID0gbGVuZ3RoICsgcHRyX2RhdGEtPm1pY19vZmZzZXQ7CisgICAgICAgICAgICB1aW50MzJfdCBidWZmZXJfZmxhZ3MgPSAwOworCisgICAgICAgICAgICAvLyBjcmVhdGUgYnVmZmVyIHdpdGggbGFyZ2UgcGFnZXMgaWYgZGF0YSBsZW5ndGggZXhjZWVkcworICAgICAgICAgICAgLy8gbGFyZ2UgcGFnZSB0aHJlc2hvbGQKKyAgICAgICAgICAgIGlmIChsZW5ndGggPj0gX19vZmZsb2FkX3VzZV8ybWJfYnVmZmVycykgeworICAgICAgICAgICAgICAgIGJ1ZmZlcl9mbGFncyA9IENPSV9PUFRJTUlaRV9IVUdFX1BBR0VfU0laRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gY3JlYXRlIENQVSBidWZmZXIKKyAgICAgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0VfMSgzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHRVRfT0ZGTE9BRF9OVU1CRVIoZ2V0X3RpbWVyX2RhdGEoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNfb2ZmbG9hZF9jcmVhdGVfYnVmX2hvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJDcmVhdGluZyBidWZmZXIgZnJvbSBzb3VyY2UgbWVtb3J5ICVwLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJsZW5ndGggJWxsZFxuIiwgYmFzZSwgbGVuZ3RoKTsKKworICAgICAgICAgICAgLy8gcmVzdWx0IGlzIG5vdCBjaGVja2VkIGJlY2F1c2Ugd2UgY2FuIGNvbnRpbnVlIHdpdGhvdXQgY3B1CisgICAgICAgICAgICAvLyBidWZmZXIuIEluIHRoaXMgY2FzZSB3ZSB3aWxsIHVzZSBDT0lCdWZmZXJSZWFkL1dyaXRlIGluc3RlYWQKKyAgICAgICAgICAgIC8vIG9mIENPSUJ1ZmZlckNvcHkuCisgICAgICAgICAgICBDT0k6OkJ1ZmZlckNyZWF0ZUZyb21NZW1vcnkobGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPSV9CVUZGRVJfTk9STUFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtX2RldmljZS5nZXRfcHJvY2VzcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwdHJfZGF0YS0+Y3B1X2J1Zik7CisKKyAgICAgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0VfMSgzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHRVRfT0ZGTE9BRF9OVU1CRVIoZ2V0X3RpbWVyX2RhdGEoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNfb2ZmbG9hZF9jcmVhdGVfYnVmX21pYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkNyZWF0aW5nIGJ1ZmZlciBmb3Igc2luazogc2l6ZSAlbGxkLCBvZmZzZXQgJWQsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImZsYWdzID0weCV4XG4iLCBidWZmZXJfc2l6ZSAtIGFsbG9jX2Rpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9kYXRhLT5taWNfb2Zmc2V0LCBidWZmZXJfZmxhZ3MpOworCisgICAgICAgICAgICAvLyBjcmVhdGUgTUlDIGJ1ZmZlcgorICAgICAgICAgICAgcmVzID0gQ09JOjpCdWZmZXJDcmVhdGUoYnVmZmVyX3NpemUgLSBhbGxvY19kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JX0JVRkZFUl9OT1JNQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJfZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtX2RldmljZS5nZXRfcHJvY2VzcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnB0cl9kYXRhLT5taWNfYnVmKTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICBpZiAobV9zdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBtX3N0YXR1cy0+cmVzdWx0ID0gdHJhbnNsYXRlX2NvaV9lcnJvcihyZXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChtX2lzX21hbmRhdG9yeSkgeworICAgICAgICAgICAgICAgICAgICByZXBvcnRfY29pX2Vycm9yKGNfYnVmX2NyZWF0ZSwgcmVzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHRyX2RhdGEtPmFsbG9jX3B0cl9kYXRhX2xvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBtYWtlIGJ1ZmZlciB2YWxpZCBvbiB0aGUgZGV2aWNlLgorICAgICAgICAgICAgcmVzID0gQ09JOjpCdWZmZXJTZXRTdGF0ZShwdHJfZGF0YS0+bWljX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9kZXZpY2UuZ2V0X3Byb2Nlc3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JX0JVRkZFUl9WQUxJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JX0JVRkZFUl9OT19NT1ZFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwKTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICBpZiAobV9zdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBtX3N0YXR1cy0+cmVzdWx0ID0gdHJhbnNsYXRlX2NvaV9lcnJvcihyZXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChtX2lzX21hbmRhdG9yeSkgeworICAgICAgICAgICAgICAgICAgICByZXBvcnRfY29pX2Vycm9yKGNfYnVmX3NldF9zdGF0ZSwgcmVzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHRyX2RhdGEtPmFsbG9jX3B0cl9kYXRhX2xvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXMgPSBDT0k6OkJ1ZmZlclNldFN0YXRlKHB0cl9kYXRhLT5taWNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0lfUFJPQ0VTU19TT1VSQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPSV9CVUZGRVJfSU5WQUxJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JX0JVRkZFUl9OT19NT1ZFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwKTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICBpZiAobV9zdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBtX3N0YXR1cy0+cmVzdWx0ID0gdHJhbnNsYXRlX2NvaV9lcnJvcihyZXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChtX2lzX21hbmRhdG9yeSkgeworICAgICAgICAgICAgICAgICAgICByZXBvcnRfY29pX2Vycm9yKGNfYnVmX3NldF9zdGF0ZSwgcmVzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHRyX2RhdGEtPmFsbG9jX3B0cl9kYXRhX2xvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHRyX2RhdGEtPmFsbG9jX2Rpc3AgPSBhbGxvY19kaXNwOworICAgICAgICBwdHJfZGF0YS0+YWxsb2NfcHRyX2RhdGFfbG9jay51bmxvY2soKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIG11dGV4X2xvY2tlcl90IGxvY2tlcihwdHJfZGF0YS0+YWxsb2NfcHRyX2RhdGFfbG9jayk7CisKKyAgICAgICAgT0ZGTE9BRF9UUkFDRSgzLCAiRm91bmQgZXhpc3RpbmcgYXNzb2NpYXRpb246IGFkZHIgJXAsIGxlbmd0aCAlbGxkLCAiCisgICAgICAgICAgICAgICAgICAgICAgImlzX3N0YXRpYyAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBwdHJfZGF0YS0+Y3B1X2FkZHIuc3RhcnQoKSwgcHRyX2RhdGEtPmNwdV9hZGRyLmxlbmd0aCgpLAorICAgICAgICAgICAgICAgICAgICAgIHB0cl9kYXRhLT5pc19zdGF0aWMpOworCisgICAgICAgIC8vIFRoaXMgaXMgbm90IGEgbmV3IGVudHJ5LiBNYWtlIHN1cmUgdGhhdCBwcm92aWRlZCBhZGRyZXNzIHJhbmdlIGZpdHMKKyAgICAgICAgLy8gaW50byBleGlzdGluZyBvbmUuCisgICAgICAgIE1lbVJhbmdlIGFkZHJfcmFuZ2UoYmFzZSwgbGVuZ3RoIC0gcHRyX2RhdGEtPmFsbG9jX2Rpc3ApOworICAgICAgICBpZiAoIXB0cl9kYXRhLT5jcHVfYWRkci5jb250YWlucyhhZGRyX3JhbmdlKSkgeworICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX2JhZF9wdHJfbWVtX3JhbmdlKTsKKyAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBpZiB0aGUgZW50cnkgaXMgYXNzb2NpYXRlZCB3aXRoIHN0YXRpYyBkYXRhIGl0IG1heSBub3QgaGF2ZSBidWZmZXJzCisgICAgICAgIC8vIGNyZWF0ZWQgYmVjYXVzZSB0aGV5IGFyZSBjcmVhdGVkIG9uIGRlbWFuZC4KKyAgICAgICAgaWYgKHB0cl9kYXRhLT5pc19zdGF0aWMgJiYgIWluaXRfc3RhdGljX3B0cl9kYXRhKHB0cl9kYXRhKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgT2ZmbG9hZERlc2NyaXB0b3I6OmZpbmRfcHRyX2RhdGEoCisgICAgUHRyRGF0YSogJnB0cl9kYXRhLAorICAgIHZvaWQgKmJhc2UsCisgICAgaW50NjRfdCBkaXNwLAorICAgIGludDY0X3Qgc2l6ZSwKKyAgICBib29sIHJlcG9ydF9lcnJvcgorKQoreworICAgIC8vIHRvdGFsIGxlbmd0aCBvZiBiYXNlCisgICAgaW50NjRfdCBsZW5ndGggPSBkaXNwICsgc2l6ZTsKKworICAgIE9GRkxPQURfVFJBQ0UoMywgIkxvb2tpbmcgZm9yIGFzc29jaWF0aW9uIGZvciBkYXRhOiBhZGRyICVwLCAiCisgICAgICAgICAgICAgICAgICAibGVuZ3RoICVsbGRcbiIsIGJhc2UsIGxlbmd0aCk7CisKKyAgICAvLyBmaW5kIGV4aXN0aW5nIGFzc29jaWF0aW9uIGluIHBvaW50ZXIgdGFibGUKKyAgICBwdHJfZGF0YSA9IG1fZGV2aWNlLmZpbmRfcHRyX2RhdGEoYmFzZSk7CisgICAgaWYgKHB0cl9kYXRhID09IDApIHsKKyAgICAgICAgaWYgKHJlcG9ydF9lcnJvcikgeworICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX25vX3B0cl9kYXRhLCBiYXNlKTsKKyAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KKyAgICAgICAgT0ZGTE9BRF9UUkFDRSgzLCAiQXNzb2NpYXRpb24gZG9lcyBub3QgZXhpc3RcbiIpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBPRkZMT0FEX1RSQUNFKDMsICJGb3VuZCBhc3NvY2lhdGlvbjogYmFzZSAlcCwgbGVuZ3RoICVsbGQsIGlzX3N0YXRpYyAlZFxuIiwKKyAgICAgICAgICAgICAgICAgIHB0cl9kYXRhLT5jcHVfYWRkci5zdGFydCgpLCBwdHJfZGF0YS0+Y3B1X2FkZHIubGVuZ3RoKCksCisgICAgICAgICAgICAgICAgICBwdHJfZGF0YS0+aXNfc3RhdGljKTsKKworICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHByb3ZpZGVkIGFkZHJlc3MgcmFuZ2UgZml0cyBpbnRvIGV4aXN0aW5nIG9uZQorICAgIE1lbVJhbmdlIGFkZHJfcmFuZ2UoYmFzZSwgbGVuZ3RoKTsKKyAgICBpZiAoIXB0cl9kYXRhLT5jcHVfYWRkci5jb250YWlucyhhZGRyX3JhbmdlKSkgeworICAgICAgICBpZiAocmVwb3J0X2Vycm9yKSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfYmFkX3B0cl9tZW1fcmFuZ2UpOworICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgfQorICAgICAgICBPRkZMT0FEX1RSQUNFKDMsICJFeGlzdGluZyBhc3NvY2lhdGlvbiBwYXJ0aWFsbHkgb3ZlcmxhcHMgd2l0aCAiCisgICAgICAgICAgICAgICAgICAgICAgImRhdGEgYWRkcmVzcyByYW5nZVxuIik7CisgICAgICAgIHB0cl9kYXRhID0gMDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gaWYgdGhlIGVudHJ5IGlzIGFzc29jaWF0ZWQgd2l0aCBzdGF0aWMgZGF0YSBpdCBtYXkgbm90IGhhdmUgYnVmZmVycworICAgIC8vIGNyZWF0ZWQgYmVjYXVzZSB0aGV5IGFyZSBjcmVhdGVkIG9uIGRlbWFuZC4KKyAgICBpZiAocHRyX2RhdGEtPmlzX3N0YXRpYyAmJiAhaW5pdF9zdGF0aWNfcHRyX2RhdGEocHRyX2RhdGEpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBPZmZsb2FkRGVzY3JpcHRvcjo6aW5pdF9zdGF0aWNfcHRyX2RhdGEoUHRyRGF0YSAqcHRyX2RhdGEpCit7CisgICAgT2ZmbG9hZFRpbWVyIHRpbWVyKGdldF90aW1lcl9kYXRhKCksIGNfb2ZmbG9hZF9ob3N0X2FsbG9jX2J1ZmZlcnMpOworCisgICAgaWYgKHB0cl9kYXRhLT5jcHVfYnVmID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9UUkFDRSgzLCAiQ3JlYXRpbmcgYnVmZmVyIGZyb20gc291cmNlIG1lbW9yeSAlbGx4XG4iLAorICAgICAgICAgICAgICAgICAgICAgIHB0cl9kYXRhLT5jcHVfYWRkci5zdGFydCgpKTsKKworICAgICAgICBDT0lSRVNVTFQgcmVzID0gQ09JOjpCdWZmZXJDcmVhdGVGcm9tTWVtb3J5KAorICAgICAgICAgICAgcHRyX2RhdGEtPmNwdV9hZGRyLmxlbmd0aCgpLAorICAgICAgICAgICAgQ09JX0JVRkZFUl9OT1JNQUwsCisgICAgICAgICAgICAwLAorICAgICAgICAgICAgY29uc3RfY2FzdDx2b2lkKj4ocHRyX2RhdGEtPmNwdV9hZGRyLnN0YXJ0KCkpLAorICAgICAgICAgICAgMSwgJm1fZGV2aWNlLmdldF9wcm9jZXNzKCksCisgICAgICAgICAgICAmcHRyX2RhdGEtPmNwdV9idWYpOworCisgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIGlmIChtX3N0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICAgICAgbV9zdGF0dXMtPnJlc3VsdCA9IHRyYW5zbGF0ZV9jb2lfZXJyb3IocmVzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXBvcnRfY29pX2Vycm9yKGNfYnVmX2NyZWF0ZV9mcm9tX21lbSwgcmVzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChwdHJfZGF0YS0+bWljX2J1ZiA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfVFJBQ0UoMywgIkNyZWF0aW5nIGJ1ZmZlciBmcm9tIHNpbmsgbWVtb3J5ICVsbHhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgcHRyX2RhdGEtPm1pY19hZGRyKTsKKworICAgICAgICBDT0lSRVNVTFQgcmVzID0gQ09JOjpCdWZmZXJDcmVhdGVGcm9tTWVtb3J5KAorICAgICAgICAgICAgcHRyX2RhdGEtPmNwdV9hZGRyLmxlbmd0aCgpLAorICAgICAgICAgICAgQ09JX0JVRkZFUl9OT1JNQUwsCisgICAgICAgICAgICBDT0lfU0lOS19NRU1PUlksCisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHZvaWQqPihwdHJfZGF0YS0+bWljX2FkZHIpLAorICAgICAgICAgICAgMSwgJm1fZGV2aWNlLmdldF9wcm9jZXNzKCksCisgICAgICAgICAgICAmcHRyX2RhdGEtPm1pY19idWYpOworCisgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIGlmIChtX3N0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICAgICAgbV9zdGF0dXMtPnJlc3VsdCA9IHRyYW5zbGF0ZV9jb2lfZXJyb3IocmVzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXBvcnRfY29pX2Vycm9yKGNfYnVmX2NyZWF0ZV9mcm9tX21lbSwgcmVzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIE9mZmxvYWREZXNjcmlwdG9yOjppbml0X21pY19hZGRyZXNzKFB0ckRhdGEgKnB0cl9kYXRhKQoreworICAgIGlmIChwdHJfZGF0YS0+bWljX2J1ZiAhPSAwICYmIHB0cl9kYXRhLT5taWNfYWRkciA9PSAwKSB7CisgICAgICAgIENPSVJFU1VMVCByZXMgPSBDT0k6OkJ1ZmZlckdldFNpbmtBZGRyZXNzKHB0cl9kYXRhLT5taWNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHRyX2RhdGEtPm1pY19hZGRyKTsKKyAgICAgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeworICAgICAgICAgICAgaWYgKG1fc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgICAgICBtX3N0YXR1cy0+cmVzdWx0ID0gdHJhbnNsYXRlX2NvaV9lcnJvcihyZXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAobV9pc19tYW5kYXRvcnkpIHsKKyAgICAgICAgICAgICAgICByZXBvcnRfY29pX2Vycm9yKGNfYnVmX2dldF9hZGRyZXNzLCByZXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIE9mZmxvYWREZXNjcmlwdG9yOjpudWxsaWZ5X3RhcmdldF9zdGFjaygKKyAgICBDT0lCVUZGRVIgdGFyZ19idWYsCisgICAgdWludDY0X3Qgc2l6ZQorKQoreworICAgIGNoYXIgKiBwdHIgPSAoY2hhciopbWFsbG9jKHNpemUpOworICAgIENPSVJFU1VMVCByZXM7CisKKyAgICBtZW1zZXQocHRyLCAwLCBzaXplKTsKKyAgICByZXMgPSBDT0k6OkJ1ZmZlcldyaXRlKAorICAgICAgICB0YXJnX2J1ZiwKKyAgICAgICAgMCwKKyAgICAgICAgcHRyLAorICAgICAgICBzaXplLAorICAgICAgICBDT0lfQ09QWV9VTlNQRUNJRklFRCwKKyAgICAgICAgMCwgMCwgMCk7CisgICAgZnJlZShwdHIpOworICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgaWYgKG1fc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgIG1fc3RhdHVzLT5yZXN1bHQgPSB0cmFuc2xhdGVfY29pX2Vycm9yKHJlcyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmVwb3J0X2NvaV9lcnJvcihjX2J1Zl93cml0ZSwgcmVzKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgT2ZmbG9hZERlc2NyaXB0b3I6Om9mZmxvYWRfc3RhY2tfbWVtb3J5X21hbmFnZXIoCisgICAgY29uc3Qgdm9pZCAqIHN0YWNrX2JlZ2luLAorICAgIGludCAgcm91dGluZV9pZCwKKyAgICBpbnQgIGJ1Zl9zaXplLAorICAgIGludCAgYWxpZ24sCisgICAgYm9vbCAqaXNfbmV3KQoreworICAgIG11dGV4X2xvY2tlcl90IGxvY2tlcihzdGFja19hbGxvY19sb2NrKTsKKworICAgIFBlcnNpc3REYXRhICogbmV3X2VsOworICAgIFBlcnNpc3REYXRhTGlzdDo6aXRlcmF0b3IgaXRfYmVnaW4gPSBtX2RldmljZS5tX3BlcnNpc3RfbGlzdC5iZWdpbigpOworICAgIFBlcnNpc3REYXRhTGlzdDo6aXRlcmF0b3IgaXRfZW5kOworICAgIGludCBlcmFzZSA9IDA7CisKKyAgICAqaXNfbmV3ID0gZmFsc2U7CisKKyAgICBmb3IgKFBlcnNpc3REYXRhTGlzdDo6aXRlcmF0b3IgaXQgPSBtX2RldmljZS5tX3BlcnNpc3RfbGlzdC5iZWdpbigpOworICAgICAgICBpdCAhPSBtX2RldmljZS5tX3BlcnNpc3RfbGlzdC5lbmQoKTsgaXQrKykgeworICAgICAgICBQZXJzaXN0RGF0YSBjdXJfZWwgPSAqaXQ7CisKKyAgICAgICAgaWYgKHN0YWNrX2JlZ2luID4gaXQtPnN0YWNrX2NwdV9hZGRyKSB7CisgICAgICAgICAgICAvLyB0aGlzIHN0YWNrIGRhdGEgbXVzdCBiZSBkZXN0cm95ZWQKKyAgICAgICAgICAgIG1fZGVzdHJveV9zdGFjay5wdXNoX2Zyb250KGN1cl9lbC5zdGFja19wdHJfZGF0YSk7CisgICAgICAgICAgICBpdF9lbmQgPSBpdDsKKyAgICAgICAgICAgIGVyYXNlKys7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoc3RhY2tfYmVnaW4gPT0gaXQtPnN0YWNrX2NwdV9hZGRyKSB7CisgICAgICAgICAgICBpZiAocm91dGluZV9pZCAhPSBpdC0+IHJvdXRpbmVfaWQpIHsKKyAgICAgICAgICAgICAgICAvLyB0aGlzIHN0YWNrIGRhdGEgbXVzdCBiZSBkZXN0cm95ZWQKKyAgICAgICAgICAgICAgICBtX2Rlc3Ryb3lfc3RhY2sucHVzaF9mcm9udChjdXJfZWwuc3RhY2tfcHRyX2RhdGEpOworICAgICAgICAgICAgICAgIGl0X2VuZCA9IGl0OworICAgICAgICAgICAgICAgIGVyYXNlKys7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBzdGFjayBkYXRhIGlzIHJldXNlZAorICAgICAgICAgICAgICAgIG1fc3RhY2tfcHRyX2RhdGEgPSBpdC0+c3RhY2tfcHRyX2RhdGE7CisgICAgICAgICAgICAgICAgaWYgKGVyYXNlID4gMCkgeworICAgICAgICAgICAgICAgICAgICAvLyBhbGwgb2Jzb2xldGUgc3RhY2sgc2VjdGlvbnMgbXVzdCBiZSBlcmFzZWQgZnJvbSB0aGUgbGlzdAorICAgICAgICAgICAgICAgICAgICBtX2RldmljZS5tX3BlcnNpc3RfbGlzdC5lcmFzZShpdF9iZWdpbiwgKytpdF9lbmQpOworCisgICAgICAgICAgICAgICAgICAgIG1faW5fZGF0YWxlbiArPQorICAgICAgICAgICAgICAgICAgICAgICAgZXJhc2UgKiBzaXplb2YobmV3X2VsLT5zdGFja19wdHJfZGF0YS0+bWljX2FkZHIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBPRkZMT0FEX1RSQUNFKDMsICJSZXVzZSBvZiBzdGFjayBidWZmZXIgd2l0aCBhZGRyICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zdGFja19wdHJfZGF0YS0+bWljX2FkZHIpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHN0YWNrX2JlZ2luIDwgaXQtPnN0YWNrX2NwdV9hZGRyKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChlcmFzZSA+IDApIHsKKyAgICAgICAgLy8gYWxsIG9ic29sZXRlIHN0YWNrIHNlY3Rpb25zIG11c3QgYmUgZXJhc2VkIGZyb20gdGhlIGxpc3QKKyAgICAgICAgbV9kZXZpY2UubV9wZXJzaXN0X2xpc3QuZXJhc2UoaXRfYmVnaW4sICsraXRfZW5kKTsKKyAgICAgICAgbV9pbl9kYXRhbGVuICs9IGVyYXNlICogc2l6ZW9mKG5ld19lbC0+c3RhY2tfcHRyX2RhdGEtPm1pY19hZGRyKTsKKyAgICB9CisgICAgLy8gbmV3IHN0YWNrIHRhYmxlIGlzIGNyZWF0ZWQKKyAgICBuZXdfZWwgPSBuZXcgUGVyc2lzdERhdGEoc3RhY2tfYmVnaW4sIHJvdXRpbmVfaWQsIGJ1Zl9zaXplKTsKKyAgICAvLyBjcmVhdGUgTUlDIGJ1ZmZlcgorICAgIENPSVJFU1VMVCByZXM7CisgICAgdWludDMyX3QgYnVmZmVyX2ZsYWdzID0gMDsKKworICAgIC8vIGNyZWF0ZSBidWZmZXIgd2l0aCBsYXJnZSBwYWdlcyBpZiBkYXRhIGxlbmd0aCBleGNlZWRzCisgICAgLy8gbGFyZ2UgcGFnZSB0aHJlc2hvbGQKKyAgICBpZiAoYnVmX3NpemUgPj0gX19vZmZsb2FkX3VzZV8ybWJfYnVmZmVycykgeworICAgICAgICBidWZmZXJfZmxhZ3MgPSBDT0lfT1BUSU1JWkVfSFVHRV9QQUdFX1NJWkU7CisgICAgfQorICAgIHJlcyA9IENPSTo6QnVmZmVyQ3JlYXRlKGJ1Zl9zaXplLAorICAgICAgICBDT0lfQlVGRkVSX05PUk1BTCwKKyAgICAgICAgYnVmZmVyX2ZsYWdzLAorICAgICAgICAwLAorICAgICAgICAxLAorICAgICAgICAmbV9kZXZpY2UuZ2V0X3Byb2Nlc3MoKSwKKyAgICAgICAgJm5ld19lbC0+c3RhY2tfcHRyX2RhdGEtPm1pY19idWYpOworICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgaWYgKG1fc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgIG1fc3RhdHVzLT5yZXN1bHQgPSB0cmFuc2xhdGVfY29pX2Vycm9yKHJlcyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAobV9pc19tYW5kYXRvcnkpIHsKKyAgICAgICAgICAgIHJlcG9ydF9jb2lfZXJyb3IoY19idWZfY3JlYXRlLCByZXMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgLy8gbWFrZSBidWZmZXIgdmFsaWQgb24gdGhlIGRldmljZS4KKyAgICByZXMgPSBDT0k6OkJ1ZmZlclNldFN0YXRlKG5ld19lbC0+c3RhY2tfcHRyX2RhdGEtPm1pY19idWYsCisgICAgICAgIG1fZGV2aWNlLmdldF9wcm9jZXNzKCksCisgICAgICAgIENPSV9CVUZGRVJfVkFMSUQsCisgICAgICAgIENPSV9CVUZGRVJfTk9fTU9WRSwKKyAgICAgICAgMCwgMCwgMCk7CisgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeworICAgICAgICBpZiAobV9zdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgbV9zdGF0dXMtPnJlc3VsdCA9IHRyYW5zbGF0ZV9jb2lfZXJyb3IocmVzKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChtX2lzX21hbmRhdG9yeSkgeworICAgICAgICAgICAgcmVwb3J0X2NvaV9lcnJvcihjX2J1Zl9zZXRfc3RhdGUsIHJlcyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXMgPSBDT0k6OkJ1ZmZlclNldFN0YXRlKG5ld19lbC0+c3RhY2tfcHRyX2RhdGEtPm1pY19idWYsCisgICAgICAgIENPSV9QUk9DRVNTX1NPVVJDRSwKKyAgICAgICAgQ09JX0JVRkZFUl9JTlZBTElELAorICAgICAgICBDT0lfQlVGRkVSX05PX01PVkUsCisgICAgICAgIDAsIDAsIDApOworICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgaWYgKG1fc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgIG1fc3RhdHVzLT5yZXN1bHQgPSB0cmFuc2xhdGVfY29pX2Vycm9yKHJlcyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAobV9pc19tYW5kYXRvcnkpIHsKKyAgICAgICAgICAgIHJlcG9ydF9jb2lfZXJyb3IoY19idWZfc2V0X3N0YXRlLCByZXMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgLy8gcGVyc2lzdGVuY2UgYWxnb3JpdGhtIHJlcXVpcmVzIHRhcmdldCBzdGFjayBpbml0aWFseSB0byBiZSBudWxsaWZpZWQKKyAgICBpZiAoIW51bGxpZnlfdGFyZ2V0X3N0YWNrKG5ld19lbC0+c3RhY2tfcHRyX2RhdGEtPm1pY19idWYsIGJ1Zl9zaXplKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbV9zdGFja19wdHJfZGF0YSA9IG5ld19lbC0+c3RhY2tfcHRyX2RhdGE7CisgICAgaW5pdF9taWNfYWRkcmVzcyhtX3N0YWNrX3B0cl9kYXRhKTsKKyAgICBPRkZMT0FEX1RSQUNFKDMsICJBbGxvY2F0aW5nIHN0YWNrIGJ1ZmZlciB3aXRoIGFkZHIgJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgbV9zdGFja19wdHJfZGF0YS0+bWljX2FkZHIpOworICAgIG1fZGV2aWNlLm1fcGVyc2lzdF9saXN0LnB1c2hfZnJvbnQoKm5ld19lbCk7CisgICAgaW5pdF9taWNfYWRkcmVzcyhuZXdfZWwtPnN0YWNrX3B0cl9kYXRhKTsKKyAgICAqaXNfbmV3ID0gdHJ1ZTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBPZmZsb2FkRGVzY3JpcHRvcjo6c2V0dXBfZGVzY3JpcHRvcnMoCisgICAgVmFyRGVzYyAqdmFycywKKyAgICBWYXJEZXNjMiAqdmFyczIsCisgICAgaW50IHZhcnNfdG90YWwsCisgICAgaW50IGVudHJ5X2lkLAorICAgIGNvbnN0IHZvaWQgKnN0YWNrX2FkZHIKKykKK3sKKyAgICBDT0lSRVNVTFQgcmVzOworCisgICAgT2ZmbG9hZFRpbWVyIHRpbWVyKGdldF90aW1lcl9kYXRhKCksIGNfb2ZmbG9hZF9ob3N0X3NldHVwX2J1ZmZlcnMpOworCisgICAgLy8gbWFrZSBhIGNvcHkgb2YgdmFyaWFibGUgZGVzY3JpcHRvcnMKKyAgICBtX3ZhcnNfdG90YWwgPSB2YXJzX3RvdGFsOworICAgIGlmICh2YXJzX3RvdGFsID4gMCkgeworICAgICAgICBtX3ZhcnMgPSAoVmFyRGVzYyopIG1hbGxvYyhtX3ZhcnNfdG90YWwgKiBzaXplb2YoVmFyRGVzYykpOworICAgICAgICBtZW1jcHkobV92YXJzLCB2YXJzLCBtX3ZhcnNfdG90YWwgKiBzaXplb2YoVmFyRGVzYykpOworICAgICAgICBtX3ZhcnNfZXh0cmEgPSAoVmFyRXh0cmEqKSBtYWxsb2MobV92YXJzX3RvdGFsICogc2l6ZW9mKFZhckV4dHJhKSk7CisgICAgfQorCisgICAgLy8gZGVwZW5kZW5jaWVzCisgICAgbV9pbl9kZXBzID0gKENPSUVWRU5UKikgbWFsbG9jKHNpemVvZihDT0lFVkVOVCkgKiAobV92YXJzX3RvdGFsICArIDEpKTsKKyAgICBpZiAobV92YXJzX3RvdGFsID4gMCkgeworICAgICAgICBtX291dF9kZXBzID0gKENPSUVWRU5UKikgbWFsbG9jKHNpemVvZihDT0lFVkVOVCkgKiBtX3ZhcnNfdG90YWwpOworICAgIH0KKworICAgIC8vIGNvcHlpbi9jb3B5b3V0IGRhdGEgbGVuZ3RoCisgICAgbV9pbl9kYXRhbGVuID0gMDsKKyAgICBtX291dF9kYXRhbGVuID0gMDsKKworICAgIC8vIEZpcnN0IHBhc3Mgb3ZlciB2YXJpYWJsZSBkZXNjcmlwdG9ycworICAgIC8vIC0gQ2FsY3VsYXRlIHNpemUgb2YgdGhlIGlucHV0IGFuZCBvdXRwdXQgbm9uLXBvaW50ZXIgZGF0YQorICAgIC8vIC0gQWxsb2NhdGUgYnVmZmVycyBmb3IgaW5wdXQgYW5kIG91dHB1dCBwb2ludGVycworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV92YXJzX3RvdGFsOyBpKyspIHsKKyAgICAgICAgdm9pZCogICBhbGxvY19iYXNlID0gTlVMTDsKKyAgICAgICAgaW50NjRfdCBhbGxvY19kaXNwID0gMDsKKyAgICAgICAgaW50NjRfdCBhbGxvY19zaXplOworICAgICAgICBib29sICAgIHNyY19pc19mb3JfbWljID0gKG1fdmFyc1tpXS5kaXJlY3Rpb24ub3V0IHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmludG8gPT0gTlVMTCk7CisKKyAgICAgICAgY29uc3QgY2hhciAqdmFyX3NuYW1lID0gIiI7CisgICAgICAgIGlmICh2YXJzMiAhPSBOVUxMICYmIGkgPCB2YXJzX3RvdGFsKSB7CisgICAgICAgICAgICBpZiAodmFyczJbaV0uc25hbWUgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHZhcl9zbmFtZSA9IHZhcnMyW2ldLnNuYW1lOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIE9GRkxPQURfVFJBQ0UoMiwgIiAgIFZhckRlc2MgJWQsIHZhcj0lcywgJXMsICVzXG4iLAorICAgICAgICAgICAgaSwgdmFyX3NuYW1lLAorICAgICAgICAgICAgdmFyZGVzY19kaXJlY3Rpb25fYXNfc3RyaW5nW21fdmFyc1tpXS5kaXJlY3Rpb24uYml0c10sCisgICAgICAgICAgICB2YXJkZXNjX3R5cGVfYXNfc3RyaW5nW21fdmFyc1tpXS50eXBlLnNyY10pOworICAgICAgICBpZiAodmFyczIgIT0gTlVMTCAmJiBpIDwgdmFyc190b3RhbCAmJiB2YXJzMltpXS5kbmFtZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBPRkZMT0FEX1RSQUNFKDIsICIgICAgICAgICAgICAgIGludG89JXMsICVzXG4iLCB2YXJzMltpXS5kbmFtZSwKKyAgICAgICAgICAgICAgICB2YXJkZXNjX3R5cGVfYXNfc3RyaW5nW21fdmFyc1tpXS50eXBlLmRzdF0pOworICAgICAgICB9CisgICAgICAgIE9GRkxPQURfVFJBQ0UoMiwKKyAgICAgICAgICAgICIgICAgICAgICAgICAgIHR5cGVfc3JjPSVkLCB0eXBlX2RzdG49JWQsIGRpcmVjdGlvbj0lZCwgIgorICAgICAgICAgICAgImFsbG9jX2lmPSVkLCBmcmVlX2lmPSVkLCBhbGlnbj0lZCwgbWljX29mZnNldD0lZCwgZmxhZ3M9MHgleCwgIgorICAgICAgICAgICAgIm9mZnNldD0lbGxkLCBzaXplPSVsbGQsIGNvdW50L2Rpc3A9JWxsZCwgcHRyPSVwLCBpbnRvPSVwXG4iLAorICAgICAgICAgICAgbV92YXJzW2ldLnR5cGUuc3JjLAorICAgICAgICAgICAgbV92YXJzW2ldLnR5cGUuZHN0LAorICAgICAgICAgICAgbV92YXJzW2ldLmRpcmVjdGlvbi5iaXRzLAorICAgICAgICAgICAgbV92YXJzW2ldLmFsbG9jX2lmLAorICAgICAgICAgICAgbV92YXJzW2ldLmZyZWVfaWYsCisgICAgICAgICAgICBtX3ZhcnNbaV0uYWxpZ24sCisgICAgICAgICAgICBtX3ZhcnNbaV0ubWljX29mZnNldCwKKyAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5iaXRzLAorICAgICAgICAgICAgbV92YXJzW2ldLm9mZnNldCwKKyAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplLAorICAgICAgICAgICAgbV92YXJzW2ldLmNvdW50LAorICAgICAgICAgICAgbV92YXJzW2ldLnB0ciwKKyAgICAgICAgICAgIG1fdmFyc1tpXS5pbnRvKTsKKworICAgICAgICBpZiAobV92YXJzW2ldLmFsbG9jICE9IE5VTEwpIHsKKyAgICAgICAgICAgIC8vIGFycmF5IGRlc2NyaXB0b3IKKyAgICAgICAgICAgIGNvbnN0IGFycl9kZXNjICphcCA9CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgYXJyX2Rlc2MqPihtX3ZhcnNbaV0uYWxsb2MpOworCisgICAgICAgICAgICAvLyBkZWJ1ZyBkdW1wCisgICAgICAgICAgICBfX2Fycl9kZXNjX2R1bXAoIiAgICAiLCAiQUxMT0MiLCBhcCwgMCk7CisKKyAgICAgICAgICAgIF9fYXJyX2RhdGFfb2Zmc2V0X2FuZF9sZW5ndGgoYXAsIGFsbG9jX2Rpc3AsIGFsbG9jX3NpemUpOworCisgICAgICAgICAgICBhbGxvY19iYXNlID0gcmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oYXAtPmJhc2UpOworICAgICAgICB9CisKKyAgICAgICAgbV92YXJzX2V4dHJhW2ldLmNwdV9kaXNwID0gMDsKKyAgICAgICAgbV92YXJzX2V4dHJhW2ldLmNwdV9vZmZzZXQgPSAwOworICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uc3JjX2RhdGEgPSAwOworICAgICAgICBtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfc3JjID0gMDsKKyAgICAgICAgbV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX2RzdCA9IDA7CisgICAgICAgIC8vIGZsYWcgaXNfYXJyX3B0cl9lbCBpcyAxIG9ubHkgZm9yIHZhcl9kZXNjcyBnZW5lcmF0ZWQKKyAgICAgICAgLy8gZm9yIGNfZGF0YV9wdHJfYXJyYXkgdHlwZQorICAgICAgICBpZiAoaSA8IHZhcnNfdG90YWwpIHsKKyAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5pc19hcnJfcHRyX2VsID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAobV92YXJzW2ldLnR5cGUuc3JjKSB7CisgICAgICAgICAgICBjYXNlIGNfZGF0YV9wdHJfYXJyYXk6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBhcnJfZGVzYyAqYXA7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhckRlc2MzICp2ZDMgPQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgVmFyRGVzYzMqPihtX3ZhcnNbaV0ucHRyKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzID0gdmQzLT5hcnJheV9maWVsZHM7CisgICAgICAgICAgICAgICAgICAgIE9GRkxPQURfVFJBQ0UoMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgIHBvaW50ZXIgYXJyYXkgZmxhZ3MgPSAlMDR4XG4iLCBmbGFncyk7CisgICAgICAgICAgICAgICAgICAgIE9GRkxPQURfVFJBQ0UoMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgIHBvaW50ZXIgYXJyYXkgdHlwZSBpcyAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhcmRlc2NfdHlwZV9hc19zdHJpbmdbZmxhZ3MgJiAweDNmXSk7CisgICAgICAgICAgICAgICAgICAgIGFwID0gc3RhdGljX2Nhc3Q8Y29uc3QgYXJyX2Rlc2MqPih2ZDMtPnB0cl9hcnJheSk7CisgICAgICAgICAgICAgICAgICAgIF9fYXJyX2Rlc2NfZHVtcCgiICAgICAgICAgICAgICAiLCAicHRyIGFycmF5IiwgYXAsIDApOworICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmludG8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwID0gc3RhdGljX2Nhc3Q8Y29uc3QgYXJyX2Rlc2MqPihtX3ZhcnNbaV0uaW50byk7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2Fycl9kZXNjX2R1bXAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgIiwgImludG8gYXJyYXkiLCBhcCwgMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKChmbGFncyAmICgxPDxmbGFnX2FsaWduX2lzX2FycmF5KSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXAgPSBzdGF0aWNfY2FzdDxjb25zdCBhcnJfZGVzYyo+KHZkMy0+YWxpZ25fYXJyYXkpOworICAgICAgICAgICAgICAgICAgICAgICAgX19hcnJfZGVzY19kdW1wKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICIsICJhbGlnbiBhcnJheSIsIGFwLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoKGZsYWdzICYgKDE8PGZsYWdfYWxsb2NfaWZfaXNfYXJyYXkpKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcCA9IHN0YXRpY19jYXN0PGNvbnN0IGFycl9kZXNjKj4odmQzLT5hbGxvY19pZl9hcnJheSk7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2Fycl9kZXNjX2R1bXAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgIiwgImFsbG9jX2lmIGFycmF5IiwgYXAsIDApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICgoZmxhZ3MgJiAoMTw8ZmxhZ19mcmVlX2lmX2lzX2FycmF5KSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXAgPSBzdGF0aWNfY2FzdDxjb25zdCBhcnJfZGVzYyo+KHZkMy0+ZnJlZV9pZl9hcnJheSk7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2Fycl9kZXNjX2R1bXAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgIiwgImZyZWVfaWYgYXJyYXkiLCBhcCwgMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKChmbGFncyAmICgxPDxmbGFnX2V4dGVudF9zdGFydF9pc19hcnJheSkpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwID0gc3RhdGljX2Nhc3Q8Y29uc3QgYXJyX2Rlc2MqPih2ZDMtPmV4dGVudF9zdGFydCk7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2Fycl9kZXNjX2R1bXAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgIiwgImV4dGVudF9zdGFydCBhcnJheSIsIGFwLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoZmxhZ3MgJgorICAgICAgICAgICAgICAgICAgICAgICAgKDE8PGZsYWdfZXh0ZW50X3N0YXJ0X2lzX3NjYWxhcikpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE9GRkxPQURfVFJBQ0UoMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICBleHRlbnRfc3RhcnQgc2NhbGFyID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludDY0X3QpdmQzLT5leHRlbnRfc3RhcnQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICgoZmxhZ3MgJiAoMTw8ZmxhZ19leHRlbnRfZWxlbWVudHNfaXNfYXJyYXkpKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcCA9IHN0YXRpY19jYXN0PGNvbnN0IGFycl9kZXNjKj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmQzLT5leHRlbnRfZWxlbWVudHMpOworICAgICAgICAgICAgICAgICAgICAgICAgX19hcnJfZGVzY19kdW1wKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICIsICJleHRlbnRfZWxlbWVudHMgYXJyYXkiLCBhcCwgMCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKGZsYWdzICYKKyAgICAgICAgICAgICAgICAgICAgICAgICgxPDxmbGFnX2V4dGVudF9lbGVtZW50c19pc19zY2FsYXIpKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBPRkZMT0FEX1RSQUNFKDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgZXh0ZW50X2VsZW1lbnRzIHNjYWxhciA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQ2NF90KXZkMy0+ZXh0ZW50X2VsZW1lbnRzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoKGZsYWdzICYgKDE8PGZsYWdfaW50b19zdGFydF9pc19hcnJheSkpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwID0gc3RhdGljX2Nhc3Q8Y29uc3QgYXJyX2Rlc2MqPih2ZDMtPmludG9fc3RhcnQpOworICAgICAgICAgICAgICAgICAgICAgICAgX19hcnJfZGVzY19kdW1wKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICIsICJpbnRvX3N0YXJ0IGFycmF5IiwgYXAsIDApOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChmbGFncyAmCisgICAgICAgICAgICAgICAgICAgICAgICAoMTw8ZmxhZ19pbnRvX3N0YXJ0X2lzX3NjYWxhcikpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE9GRkxPQURfVFJBQ0UoMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICBpbnRvX3N0YXJ0IHNjYWxhciA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQ2NF90KXZkMy0+aW50b19zdGFydCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKChmbGFncyAmICgxPDxmbGFnX2ludG9fZWxlbWVudHNfaXNfYXJyYXkpKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcCA9IHN0YXRpY19jYXN0PGNvbnN0IGFycl9kZXNjKj4odmQzLT5pbnRvX2VsZW1lbnRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fYXJyX2Rlc2NfZHVtcCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAiLCAiaW50b19lbGVtZW50cyBhcnJheSIsIGFwLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoZmxhZ3MgJgorICAgICAgICAgICAgICAgICAgICAgICAgKDE8PGZsYWdfaW50b19lbGVtZW50c19pc19zY2FsYXIpKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBPRkZMT0FEX1RSQUNFKDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgaW50b19lbGVtZW50cyBzY2FsYXIgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50NjRfdCl2ZDMtPmludG9fZWxlbWVudHMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICgoZmxhZ3MgJiAoMTw8ZmxhZ19hbGxvY19zdGFydF9pc19hcnJheSkpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwID0gc3RhdGljX2Nhc3Q8Y29uc3QgYXJyX2Rlc2MqPih2ZDMtPmFsbG9jX3N0YXJ0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fYXJyX2Rlc2NfZHVtcCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAiLCAiYWxsb2Nfc3RhcnQgYXJyYXkiLCBhcCwgMCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKGZsYWdzICYKKyAgICAgICAgICAgICAgICAgICAgICAgICgxPDxmbGFnX2FsbG9jX3N0YXJ0X2lzX3NjYWxhcikpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE9GRkxPQURfVFJBQ0UoMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICBhbGxvY19zdGFydCBzY2FsYXIgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50NjRfdCl2ZDMtPmFsbG9jX3N0YXJ0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoKGZsYWdzICYgKDE8PGZsYWdfYWxsb2NfZWxlbWVudHNfaXNfYXJyYXkpKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcCA9IHN0YXRpY19jYXN0PGNvbnN0IGFycl9kZXNjKj4odmQzLT5hbGxvY19lbGVtZW50cyk7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2Fycl9kZXNjX2R1bXAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgIiwgImFsbG9jX2VsZW1lbnRzIGFycmF5IiwgYXAsIDApOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChmbGFncyAmCisgICAgICAgICAgICAgICAgICAgICAgICAoMTw8ZmxhZ19hbGxvY19lbGVtZW50c19pc19zY2FsYXIpKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBPRkZMT0FEX1RSQUNFKDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgYWxsb2NfZWxlbWVudHMgc2NhbGFyID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludDY0X3QpdmQzLT5hbGxvY19lbGVtZW50cyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFnZW5fdmFyX2Rlc2NzX2Zvcl9wb2ludGVyX2FycmF5KGkpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgY19kYXRhOgorICAgICAgICAgICAgY2FzZSBjX3ZvaWRfcHRyOgorICAgICAgICAgICAgY2FzZSBjX2NlYW5fdmFyOgorICAgICAgICAgICAgICAgIC8vIEluIGFsbCB1c2VzIGxhdGVyCisgICAgICAgICAgICAgICAgLy8gVmFyRGVzYy5zaXplIHdpbGwgaGF2ZSB0aGUgbGVuZ3RoIG9mIHRoZSBkYXRhIHRvIGJlCisgICAgICAgICAgICAgICAgLy8gdHJhbnNmZXJyZWQKKyAgICAgICAgICAgICAgICAvLyBWYXJEZXNjLmRpc3Agd2lsbCBoYXZlIGFuIG9mZnNldCBmcm9tIGJhc2UKKyAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLnR5cGUuc3JjID09IGNfY2Vhbl92YXIpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gYXJyYXkgZGVzY3JpcHRvcgorICAgICAgICAgICAgICAgICAgICBjb25zdCBhcnJfZGVzYyAqYXAgPQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgYXJyX2Rlc2MqPihtX3ZhcnNbaV0ucHRyKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBkZWJ1ZyBkdW1wCisgICAgICAgICAgICAgICAgICAgIF9fYXJyX2Rlc2NfZHVtcCgiIiwgIklOL09VVCIsIGFwLCAwKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQgYW5kIGxlbmd0aCBhcmUgZGVyaXZlZCBmcm9tIHRoZSBhcnJheSBkZXNjcmlwdG9yCisgICAgICAgICAgICAgICAgICAgIF9fYXJyX2RhdGFfb2Zmc2V0X2FuZF9sZW5ndGgoYXAsIG1fdmFyc1tpXS5kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFpc19hcnJfZGVzY19jb250aWd1b3VzKGFwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLmlzX25vbmNvbnRfc3JjID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19zcmMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRfcmVhZF9yYW5nZXNfYXJyX2Rlc2MoYXApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIGFsbCBuZWNlc3NhcnkgaW5mb3JtYXRpb24gYWJvdXQgbGVuZ3RoIGFuZCBvZmZzZXQgaXMKKyAgICAgICAgICAgICAgICAgICAgLy8gdHJhbnNmZXJyZWQgaW4gdmFyIGRlc2NyaXB0b3IuIFRoZXJlIGlzIG5vIG5lZWQgdG8gc2VuZAorICAgICAgICAgICAgICAgICAgICAvLyBhcnJheSBkZXNjcmlwdG9yIHRvIHRoZSB0YXJnZXQgc2lkZS4KKyAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KGFwLT5iYXNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplICo9IG1fdmFyc1tpXS5jb3VudDsKKyAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmRpc3AgPSAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZGlyZWN0aW9uLmJpdHMpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgdHJhbnNmZXIgc2l6ZSA+IDAKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5zaXplIDw9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY196ZXJvX29yX25lZ190cmFuc2Zlcl9zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmZsYWdzLmlzX3N0YXRpYykgeworICAgICAgICAgICAgICAgICAgICAgICAgUHRyRGF0YSAqcHRyX2RhdGE7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgZGF0YSBhc3NvY2lhdGVkIHdpdGggdmFyaWFibGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmluZF9wdHJfZGF0YShwdHJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ucHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHB0cl9kYXRhICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQgdG8gYmFzZSBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lbW9yeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5vZmZzZXQgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciopIG1fdmFyc1tpXS5wdHIgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciopIHB0cl9kYXRhLT5jcHVfYWRkci5zdGFydCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLmlzX3N0YXRpYyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uaW50byA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5pc19zdGF0aWNfZHN0biA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5zcmNfZGF0YSA9IHB0cl9kYXRhOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1faXNfb3Blbm1wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmZsYWdzLmlzX3N0YXRpYykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN0YXRpYyBkYXRhIGlzIHRyYW5zZmVycmVkIG9ubHkgYnkgb21wIHRhcmdldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBjb25zdHJ1Y3Qgd2hpY2ggcGFzc2VzIHplcm9zIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbG9jX2lmIGFuZCBmcmVlX2lmLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uYWxsb2NfaWYgfHwgbV92YXJzW2ldLmZyZWVfaWYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfbm9jb3B5OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1dG9EYXRhICphdXRvX2RhdGE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5hbGxvY19pZikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvX2RhdGEgPSBtX2RldmljZS5pbnNlcnRfYXV0b19kYXRhKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnB0ciwgbV92YXJzW2ldLnNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvX2RhdGEtPmFkZF9yZWZlcmVuY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHdoYXQgc2hvdWxkIGJlIGRvbmUgaWYgdmFyIGlzIG5vdCBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgdGFibGU/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9fZGF0YSA9IG1fZGV2aWNlLmZpbmRfYXV0b19kYXRhKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnB0cik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9yIGF1dG9tYXRpYyB2YXJpYWJsZXMgZGF0YSBpcyB0cmFuc2ZlcnJlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgaWYgYWxsb2NfaWYgPT0gMCAmJiBmcmVlX2lmID09IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvciByZWZlcmVuY2UgY291bnQgaXMgMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobV92YXJzW2ldLmFsbG9jX2lmIHx8IG1fdmFyc1tpXS5mcmVlX2lmKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvX2RhdGEgIT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvX2RhdGEtPmdldF9yZWZlcmVuY2UoKSAhPSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX25vY29weTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzYXZlIGRhdGEgZm9yIGxhdGVyIHVzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5hdXRvX2RhdGEgPSBhdXRvX2RhdGE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5pbiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIW1fdmFyc1tpXS5mbGFncy5pc19zdGF0aWMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1faW5fZGF0YWxlbiArPSBtX3ZhcnNbaV0uc2l6ZTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIG5vbi1zdGF0aWMgdGFyZ2V0IGRlc3RpbmF0aW9uIGRlZmluZWQgYXMgQ0VBTgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhwcmVzc2lvbiB3ZSBwYXNzIHRvIHRhcmdldCBpdHMgc2l6ZSBhbmQgZGlzdAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5pbnRvID09IE5VTEwgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0udHlwZS5zcmMgPT0gY19jZWFuX3ZhcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faW5fZGF0YWxlbiArPSAyICogc2l6ZW9mKHVpbnQ2NF90KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fbmVlZF9ydW5mdW5jdGlvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5kaXJlY3Rpb24ub3V0ICYmCisgICAgICAgICAgICAgICAgICAgICAgICAhbV92YXJzW2ldLmZsYWdzLmlzX3N0YXRpYykgeworICAgICAgICAgICAgICAgICAgICAgICAgbV9vdXRfZGF0YWxlbiArPSBtX3ZhcnNbaV0uc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fbmVlZF9ydW5mdW5jdGlvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgY19kdjoKKyAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5iaXRzIHx8CisgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5hbGxvY19pZiB8fAorICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZnJlZV9pZikgeworICAgICAgICAgICAgICAgICAgICBBcnJEZXNjICpkdnAgPSBzdGF0aWNfY2FzdDxBcnJEZXNjKj4obV92YXJzW2ldLnB0cik7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gZGVidWcgZHVtcAorICAgICAgICAgICAgICAgICAgICBfX2R2X2Rlc2NfZHVtcCgiSU4vT1VUIiwgZHZwKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBzZW5kIGRvcGUgdmVjdG9yIGNvbnRlbnRzIGV4Y2x1ZGluZyBiYXNlCisgICAgICAgICAgICAgICAgICAgIG1faW5fZGF0YWxlbiArPSBtX3ZhcnNbaV0uc2l6ZSAtIHNpemVvZih1aW50NjRfdCk7CisgICAgICAgICAgICAgICAgICAgIG1fbmVlZF9ydW5mdW5jdGlvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIGNfc3RyaW5nX3B0cjoKKyAgICAgICAgICAgICAgICBpZiAoKG1fdmFyc1tpXS5kaXJlY3Rpb24uYml0cyB8fAorICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmFsbG9jX2lmIHx8CisgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZnJlZV9pZikgJiYKKyAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSA9IDE7CisgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5jb3VudCA9CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4oKnN0YXRpY19jYXN0PGNoYXIqKj4obV92YXJzW2ldLnB0cikpICsgMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLyogZmFsbHRocnUgKi8KKworICAgICAgICAgICAgY2FzZSBjX2RhdGFfcHRyOgorICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhY2tfYnVmICYmCisgICAgICAgICAgICAgICAgICAgICFtX3ZhcnNbaV0uZGlyZWN0aW9uLmJpdHMgJiYKKyAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmFsbG9jX2lmKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgdmFyX2Rlc2MgaXMgZm9yIHN0YWNrIGJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICBib29sIGlzX25ldzsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIW9mZmxvYWRfc3RhY2tfbWVtb3J5X21hbmFnZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2tfYWRkciwgZW50cnlfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmNvdW50LCBtX3ZhcnNbaV0uYWxpZ24sICZpc19uZXcpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzX25ldykgeworICAgICAgICAgICAgICAgICAgICAgICAgbV9jb21wdXRlX2J1ZmZlcnMucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc3RhY2tfcHRyX2RhdGEtPm1pY19idWYpOworICAgICAgICAgICAgICAgICAgICAgICAgbV9kZXZpY2UubV9wZXJzaXN0X2xpc3QuZnJvbnQoKS5jcHVfc3RhY2tfYWRkciA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y2hhcio+KG1fdmFyc1tpXS5wdHIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLnNpbmtfYWRkciA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2luX2RhdGFsZW4gKz0gc2l6ZW9mKG1fc3RhY2tfcHRyX2RhdGEtPm1pY19hZGRyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSA9IG1fZGVzdHJveV9zdGFjay5zaXplKCk7CisgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5zcmNfZGF0YSA9IG1fc3RhY2tfcHRyX2RhdGE7CisgICAgICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gYWRkIHJlZmVyZW5jZSBmb3IgYnVmZmVyCisgICAgICAgICAgICAgICAgICAgIG1fbmVlZF9ydW5mdW5jdGlvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiBmYWxsdGhydSAqLworCisgICAgICAgICAgICBjYXNlIGNfY2Vhbl92YXJfcHRyOgorICAgICAgICAgICAgY2FzZSBjX2R2X3B0cjoKKyAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLnR5cGUuc3JjID09IGNfY2Vhbl92YXJfcHRyKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGFycmF5IGRlc2NyaXB0b3IKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgYXJyX2Rlc2MgKmFwID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IGFycl9kZXNjKj4obV92YXJzW2ldLnB0cik7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gZGVidWcgZHVtcAorICAgICAgICAgICAgICAgICAgICBfX2Fycl9kZXNjX2R1bXAoIiIsICJJTi9PVVQiLCBhcCwgMSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gb2Zmc2V0IGFuZCBsZW5ndGggYXJlIGRlcml2ZWQgZnJvbSB0aGUgYXJyYXkgZGVzY3JpcHRvcgorICAgICAgICAgICAgICAgICAgICBfX2Fycl9kYXRhX29mZnNldF9hbmRfbGVuZ3RoKGFwLCBtX3ZhcnNbaV0uZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFpc19hcnJfZGVzY19jb250aWd1b3VzKGFwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLmlzX25vbmNvbnRfc3JjID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19zcmMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRfcmVhZF9yYW5nZXNfYXJyX2Rlc2MoYXApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIGFsbCBuZWNlc3NhcnkgaW5mb3JtYXRpb24gYWJvdXQgbGVuZ3RoIGFuZCBvZmZzZXQgaXMKKyAgICAgICAgICAgICAgICAgICAgLy8gdHJhbnNmZXJyZWQgaW4gdmFyIGRlc2NyaXB0b3IuIFRoZXJlIGlzIG5vIG5lZWQgdG8gc2VuZAorICAgICAgICAgICAgICAgICAgICAvLyBhcnJheSBkZXNjcmlwdG9yIHRvIHRoZSB0YXJnZXQgc2lkZS4KKyAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KGFwLT5iYXNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAobV92YXJzW2ldLnR5cGUuc3JjID09IGNfZHZfcHRyKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gc2VuZCBEViB0byB0aGUgZGV2aWNlIHVubGVzcyBpdCBpcyAnbm9jb3B5JworICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5iaXRzIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uYWxsb2NfaWYgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mcmVlX2lmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBcnJEZXNjICpkdnAgPSAqc3RhdGljX2Nhc3Q8QXJyRGVzYyoqPihtX3ZhcnNbaV0ucHRyKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVidWcgZHVtcAorICAgICAgICAgICAgICAgICAgICAgICAgX19kdl9kZXNjX2R1bXAoIklOL09VVCIsIGR2cCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2luOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gbm8gZGlzcGxhY2VtZW50CisgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5kaXNwID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGNfZGF0YV9wdHIgb3IgY19zdHJpbmdfcHRyCisgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplICo9IG1fdmFyc1tpXS5jb3VudDsKKyAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmRpc3AgPSAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZGlyZWN0aW9uLmJpdHMgfHwKKyAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmFsbG9jX2lmIHx8CisgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mcmVlX2lmKSB7CisgICAgICAgICAgICAgICAgICAgIFB0ckRhdGEgKnB0cl9kYXRhOworCisgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIHRoYXQgYnVmZmVyIGxlbmd0aCA+PSAwCisgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uYWxsb2NfaWYgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5kaXNwICsgbV92YXJzW2ldLnNpemUgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfemVyb19vcl9uZWdfcHRyX2xlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBleGl0KDEpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gYmFzZSBhZGRyZXNzCisgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJhc2UgPSAqc3RhdGljX2Nhc3Q8dm9pZCoqPihtX3ZhcnNbaV0ucHRyKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBhbGxvY2F0ZSBidWZmZXIgaWYgd2UgaGF2ZSBubyBJTlRPIGFuZCBkb24ndCBuZWVkCisgICAgICAgICAgICAgICAgICAgIC8vIGFsbG9jYXRpb24gZm9yIHRoZSBwdHIgYXQgdGFyZ2V0CisgICAgICAgICAgICAgICAgICAgIGlmIChzcmNfaXNfZm9yX21pYykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5mbGFncy5pc19zdGFja19idWYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3Igc3RhY2sgcGVyc2lzdGVudCBvYmplY3RzIHB0ciBkYXRhIGlzIGNyZWF0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBieSB2YXJfZGVzYyB3aXRoIG51bWJlciAwLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEl0cyBwdHJfZGF0YSBpcyBzdG9yZWQgYXQgbV9zdGFja19wdHJfZGF0YQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9kYXRhID0gbV9zdGFja19wdHJfZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3Muc2lua19hZGRyID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1fdmFyc1tpXS5hbGxvY19pZikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZCBuZXcgZW50cnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWFsbG9jX3B0cl9kYXRhKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFsbG9jX2Jhc2UgIT0gTlVMTCkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jX2Rpc3AgOiBtX3ZhcnNbaV0uZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhbGxvY19iYXNlICE9IE5VTEwpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY19zaXplIDogbV92YXJzW2ldLnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY19kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFsbG9jX2Jhc2UgIT0gTlVMTCkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgOiBtX3ZhcnNbaV0uYWxpZ24pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHRyX2RhdGEtPmFkZF9yZWZlcmVuY2UoKSA9PSAwICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9kYXRhLT5taWNfYnVmICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkIGJ1ZmZlciB0byB0aGUgbGlzdCBvZiBidWZmZXJzIHRoYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXJlIHBhc3NlZCB0byBkaXNwYXRjaCBjYWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fY29tcHV0ZV9idWZmZXJzLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9kYXRhLT5taWNfYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpbGwgc2VuZCBidWZmZXIgYWRkcmVzcyB0byBkZXZpY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLnNpbmtfYWRkciA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwdHJfZGF0YS0+aXNfc3RhdGljKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gYWRkIHJlZmVyZW5jZSBmb3IgYnVmZmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fbmVlZF9ydW5mdW5jdGlvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBlcnJvcl9pZl9ub3RfZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX2lzX29wZW5tcCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3Igb21wIHRhcmdldCB1cGRhdGUgdmFyaWFibGUgaXMgaWdub3JlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBpdCBkb2VzIG5vdCBleGlzdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtX3ZhcnNbaV0uYWxsb2NfaWYgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFtX3ZhcnNbaV0uZnJlZV9pZikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfaWZfbm90X2ZvdW5kID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2UgZXhpc3RpbmcgYXNzb2NpYXRpb24gZnJvbSBwb2ludGVyIHRhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaW5kX3B0cl9kYXRhKHB0cl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX2lmX25vdF9mb3VuZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX2lzX29wZW5tcCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYWtlIHZhciBub2NvcHkgaWYgaXQgZG9lcyBub3QgZXhpc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHB0cl9kYXRhID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5kaXJlY3Rpb24uYml0cyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY19wYXJhbWV0ZXJfbm9jb3B5OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHB0cl9kYXRhICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLnNpbmtfYWRkciA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHRyX2RhdGEgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX2lzX29wZW5tcCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkYXRhIGlzIHRyYW5zZmVycmVkIG9ubHkgaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb2NfaWYgPT0gMCAmJiBmcmVlX2lmID09IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3IgcmVmZXJlbmNlIGNvdW50IGlzIDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChtX3ZhcnNbaV0uYWxsb2NfaWYgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZnJlZV9pZikgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9kYXRhLT5nZXRfcmVmZXJlbmNlKCkgIT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmRpcmVjdGlvbi5iaXRzID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX3BhcmFtZXRlcl9ub2NvcHk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHRyX2RhdGEtPmFsbG9jX2Rpc3AgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3MuYWxsb2NfZGlzcCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faW5fZGF0YWxlbiArPSBzaXplb2YoYWxsb2NfZGlzcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5mbGFncy5zaW5rX2FkZHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IGJ1ZmZlcnMncyBhZGRyZXNzIG9uIHRoZSBzaW5rCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaW5pdF9taWNfYWRkcmVzcyhwdHJfZGF0YSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faW5fZGF0YWxlbiArPSBzaXplb2YocHRyX2RhdGEtPm1pY19hZGRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXB0cl9kYXRhLT5pc19zdGF0aWMgJiYgbV92YXJzW2ldLmZyZWVfaWYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmVlZCB0byBkZWNyZW1lbnQgYnVmZmVyIHJlZmVyZW5jZSBvbiB0YXJnZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9uZWVkX3J1bmZ1bmN0aW9uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQgdG8gYmFzZSBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lbW9yeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5vZmZzZXQgPSAoY2hhciopIGJhc2UgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciopIHB0cl9kYXRhLT5jcHVfYWRkci5zdGFydCgpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29weSBvdGhlciBwb2ludGVyIHByb3BlcnRpZXMgdG8gdmFyIGRlc2NyaXB0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ubWljX29mZnNldCA9IHB0cl9kYXRhLT5taWNfb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5pc19zdGF0aWMgPSBwdHJfZGF0YS0+aXNfc3RhdGljOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaW5kX3B0cl9kYXRhKHB0cl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmRpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHB0cl9kYXRhKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLm9mZnNldCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyKikgYmFzZSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyKikgcHRyX2RhdGEtPmNwdV9hZGRyLnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBzYXZlIHBvaW50ZXIgZGF0YQorICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uc3JjX2RhdGEgPSBwdHJfZGF0YTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgY19mdW5jX3B0cjoKKyAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5pbikgeworICAgICAgICAgICAgICAgICAgICBtX2luX2RhdGFsZW4gKz0gX19vZmZsb2FkX2Z1bmNzLm1heF9uYW1lX2xlbmd0aCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5vdXQpIHsKKyAgICAgICAgICAgICAgICAgICAgbV9vdXRfZGF0YWxlbiArPSBfX29mZmxvYWRfZnVuY3MubWF4X25hbWVfbGVuZ3RoKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1fbmVlZF9ydW5mdW5jdGlvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgY19kdl9kYXRhOgorICAgICAgICAgICAgY2FzZSBjX2R2X3B0cl9kYXRhOgorICAgICAgICAgICAgY2FzZSBjX2R2X2RhdGFfc2xpY2U6CisgICAgICAgICAgICBjYXNlIGNfZHZfcHRyX2RhdGFfc2xpY2U6CisgICAgICAgICAgICAgICAgQXJyRGVzYyAqZHZwOworICAgICAgICAgICAgICAgIGlmIChWQVJfVFlQRV9JU19EVl9EQVRBX1NMSUNFKG1fdmFyc1tpXS50eXBlLnNyYykpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgYXJyX2Rlc2MgKmFwOworICAgICAgICAgICAgICAgICAgICBhcCA9IHN0YXRpY19jYXN0PGNvbnN0IGFycl9kZXNjKj4obV92YXJzW2ldLnB0cik7CisKKyAgICAgICAgICAgICAgICAgICAgZHZwID0gKG1fdmFyc1tpXS50eXBlLnNyYyA9PSBjX2R2X2RhdGFfc2xpY2UpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxBcnJEZXNjKj4oYXAtPmJhc2UpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8QXJyRGVzYyoqPihhcC0+YmFzZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBkdnAgPSAobV92YXJzW2ldLnR5cGUuc3JjID09IGNfZHZfZGF0YSkgPworICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxBcnJEZXNjKj4obV92YXJzW2ldLnB0cikgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAqc3RhdGljX2Nhc3Q8QXJyRGVzYyoqPihtX3ZhcnNbaV0ucHRyKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBpZiBhbGxvY2F0YWJsZSBkb3BlIHZlY3RvciBpc24ndCBhbGxvY2F0ZWQgZG9uJ3QKKyAgICAgICAgICAgICAgICAvLyB0cmFuc2ZlciBpdHMgZGF0YQorICAgICAgICAgICAgICAgIGlmICghX19kdl9pc19hbGxvY2F0ZWQoZHZwKSkgeworICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9ub2NvcHk7CisgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5hbGxvY19pZiA9IDA7CisgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mcmVlX2lmID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5kaXJlY3Rpb24uYml0cyB8fAorICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uYWxsb2NfaWYgfHwKKyAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZyZWVfaWYpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgYXJyX2Rlc2MgKmFwOworCisgICAgICAgICAgICAgICAgICAgIGlmIChWQVJfVFlQRV9JU19EVl9EQVRBX1NMSUNFKG1fdmFyc1tpXS50eXBlLnNyYykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwID0gc3RhdGljX2Nhc3Q8Y29uc3QgYXJyX2Rlc2MqPihtX3ZhcnNbaV0ucHRyKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVidWcgZHVtcAorICAgICAgICAgICAgICAgICAgICAgICAgX19hcnJfZGVzY19kdW1wKCIiLCAiSU4vT1VUIiwgYXAsIDApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICghX19kdl9pc19jb250aWd1b3VzKGR2cCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5pc19ub25jb250X3NyYyA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfc3JjID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0X3JlYWRfcmFuZ2VzX2R2KGR2cCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBzaXplIGFuZCBkaXNwbGFjZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgaWYgKFZBUl9UWVBFX0lTX0RWX0RBVEFfU0xJQ0UobV92YXJzW2ldLnR5cGUuc3JjKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2Zmc2V0IGFuZCBsZW5ndGggYXJlIGRlcml2ZWQgZnJvbSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFycmF5IGRlc2NyaXB0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fYXJyX2RhdGFfb2Zmc2V0X2FuZF9sZW5ndGgoYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5iaXRzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc19hcnJfZGVzY19jb250aWd1b3VzKGFwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmZsYWdzLmlzX25vbmNvbnRfc3JjKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfc2xpY2Vfb2Zfbm9uY29udF9hcnJheSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLmlzX25vbmNvbnRfc3JjID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX3NyYyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0X3JlYWRfcmFuZ2VzX2Fycl9kZXNjKGFwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmZsYWdzLmhhc19sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZHZfZGF0YV9sZW5ndGgoZHZwLCBtX3ZhcnNbaV0uY291bnQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUgPSBfX2R2X2RhdGFfbGVuZ3RoKGR2cCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZGlzcCA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayB0aGF0IGxlbmd0aCA+PSAwCisgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uYWxsb2NfaWYgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChtX3ZhcnNbaV0uZGlzcCArIG1fdmFyc1tpXS5zaXplIDwgMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY196ZXJvX29yX25lZ19wdHJfbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBiYXNlIGFkZHJlc3MKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAqYmFzZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KGR2cC0+QmFzZSk7CisgICAgICAgICAgICAgICAgICAgIFB0ckRhdGEgKnB0cl9kYXRhOworCisgICAgICAgICAgICAgICAgICAgIC8vIGFsbG9jYXRlIGJ1ZmZlciBpZiB3ZSBoYXZlIG5vIElOVE8gYW5kIGRvbid0IG5lZWQKKyAgICAgICAgICAgICAgICAgICAgLy8gYWxsb2NhdGlvbiBmb3IgdGhlIHB0ciBhdCB0YXJnZXQKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNyY19pc19mb3JfbWljKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmFsbG9jX2lmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkIG5ldyBlbnRyeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYWxsb2NfcHRyX2RhdGEoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWxsb2NfYmFzZSAhPSBOVUxMKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NfZGlzcCA6IG1fdmFyc1tpXS5kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFsbG9jX2Jhc2UgIT0gTlVMTCkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jX3NpemUgOiBtX3ZhcnNbaV0uc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jX2Rpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWxsb2NfYmFzZSAhPSBOVUxMKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCA6IG1fdmFyc1tpXS5hbGlnbikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwdHJfZGF0YS0+YWRkX3JlZmVyZW5jZSgpID09IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX2RhdGEtPm1pY19idWYgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGQgYnVmZmVyIHRvIHRoZSBsaXN0IG9mIGJ1ZmZlcnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCBhcmUgcGFzc2VkIHRvIGRpc3BhdGNoIGNhbGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9jb21wdXRlX2J1ZmZlcnMucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX2RhdGEtPm1pY19idWYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2lsbCBzZW5kIGJ1ZmZlciBhZGRyZXNzIHRvIGRldmljZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3Muc2lua19hZGRyID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXB0cl9kYXRhLT5pc19zdGF0aWMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmVlZCB0byBhZGQgcmVmZXJlbmNlIGZvciBidWZmZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9uZWVkX3J1bmZ1bmN0aW9uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGVycm9yX2lmX25vdF9mb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1faXNfb3Blbm1wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvciBvbXAgdGFyZ2V0IHVwZGF0ZSB2YXJpYWJsZSBpcyBpZ25vcmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIGl0IGRvZXMgbm90IGV4aXN0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1fdmFyc1tpXS5hbGxvY19pZiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIW1fdmFyc1tpXS5mcmVlX2lmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9pZl9ub3RfZm91bmQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZSBleGlzdGluZyBhc3NvY2lhdGlvbiBmcm9tIHBvaW50ZXIgdGFibGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZpbmRfcHRyX2RhdGEocHRyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfaWZfbm90X2ZvdW5kKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1faXNfb3Blbm1wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1ha2UgdmFyIG5vY29weSBpZiBpdCBkb2VzIG5vdCBleGlzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHRyX2RhdGEgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmRpcmVjdGlvbi5iaXRzID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX3BhcmFtZXRlcl9ub2NvcHk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHRyX2RhdGEgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZWVkIHRvIHVwZGF0ZSBiYXNlIGluIGRvcGUgdmVjdG9yIG9uIGRldmljZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3Muc2lua19hZGRyID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwdHJfZGF0YSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1faXNfb3Blbm1wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRhdGEgaXMgdHJhbnNmZXJyZWQgb25seSBpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvY19pZiA9PSAwICYmIGZyZWVfaWYgPT0gMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvciByZWZlcmVuY2UgY291bnQgaXMgMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKG1fdmFyc1tpXS5hbGxvY19pZiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mcmVlX2lmKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX2RhdGEtPmdldF9yZWZlcmVuY2UoKSAhPSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZGlyZWN0aW9uLmJpdHMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfcGFyYW1ldGVyX25vY29weTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwdHJfZGF0YS0+YWxsb2NfZGlzcCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5hbGxvY19kaXNwID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pbl9kYXRhbGVuICs9IHNpemVvZihhbGxvY19kaXNwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmZsYWdzLnNpbmtfYWRkcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXQgYnVmZmVycydzIGFkZHJlc3Mgb24gdGhlIHNpbmsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbml0X21pY19hZGRyZXNzKHB0cl9kYXRhKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pbl9kYXRhbGVuICs9IHNpemVvZihwdHJfZGF0YS0+bWljX2FkZHIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcHRyX2RhdGEtPmlzX3N0YXRpYyAmJiBtX3ZhcnNbaV0uZnJlZV9pZikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZWVkIHRvIGRlY3JlbWVudCBidWZmZXIgcmVmZXJlbmNlIG9uIHRhcmdldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX25lZWRfcnVuZnVuY3Rpb24gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldCB0byBiYXNlIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVtb3J5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLm9mZnNldCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyKikgYmFzZSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyKikgcHRyX2RhdGEtPmNwdV9hZGRyLnN0YXJ0KCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb3B5IG90aGVyIHBvaW50ZXIgcHJvcGVydGllcyB0byB2YXIgZGVzY3JpcHRvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5taWNfb2Zmc2V0ID0gcHRyX2RhdGEtPm1pY19vZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLmlzX3N0YXRpYyA9IHB0cl9kYXRhLT5pc19zdGF0aWM7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7IC8vICFzcmNfaXNfZm9yX21pYworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaW5kX3B0cl9kYXRhKHB0cl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmRpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLm9mZnNldCA9ICFwdHJfZGF0YSA/IDAgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciopIGJhc2UgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciopIHB0cl9kYXRhLT5jcHVfYWRkci5zdGFydCgpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gc2F2ZSBwb2ludGVyIGRhdGEKKyAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnNyY19kYXRhID0gcHRyX2RhdGE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY191bmtub3duX3Zhcl90eXBlLCBtX3ZhcnNbaV0udHlwZS5zcmMpOworICAgICAgICAgICAgICAgIExJQk9GRkxPQURfQUJPUlQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1fdmFyc1tpXS50eXBlLnNyYyA9PSBjX2RhdGFfcHRyX2FycmF5KSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzcmNfaXNfZm9yX21pYyAmJiBtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhY2tfYnVmKSB7CisgICAgICAgICAgICBtX3ZhcnNbaV0ub2Zmc2V0ID0gc3RhdGljX2Nhc3Q8Y2hhcio+KG1fdmFyc1tpXS5wdHIpIC0KKyAgICAgICAgICAgICAgICBtX2RldmljZS5tX3BlcnNpc3RfbGlzdC5mcm9udCgpLmNwdV9zdGFja19hZGRyOworICAgICAgICB9CisgICAgICAgIC8vIGlmIHNvdXJjZSBpcyB1c2VkIGF0IENQVSBzYXZlIGl0cyBvZmZzZXQgYW5kIGRpc3AKKyAgICAgICAgaWYgKG1fdmFyc1tpXS5pbnRvID09IE5VTEwgfHwgbV92YXJzW2ldLmRpcmVjdGlvbi5pbikgeworICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLmNwdV9vZmZzZXQgPSBtX3ZhcnNbaV0ub2Zmc2V0OworICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLmNwdV9kaXNwICAgPSBtX3ZhcnNbaV0uZGlzcDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIElmICJpbnRvIiBpcyBkZWZpbmUgd2UgbmVlZCB0byBkbyB0aGUgc2ltaWxhciB3b3JrIGZvciBpdAorICAgICAgICBpZiAoIW1fdmFyc1tpXS5pbnRvKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGludDY0X3QgaW50b19kaXNwID0wLCBpbnRvX29mZnNldCA9IDA7CisKKyAgICAgICAgc3dpdGNoIChtX3ZhcnNbaV0udHlwZS5kc3QpIHsKKyAgICAgICAgICAgIGNhc2UgY19kYXRhX3B0cl9hcnJheToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgY19kYXRhOgorICAgICAgICAgICAgY2FzZSBjX3ZvaWRfcHRyOgorICAgICAgICAgICAgY2FzZSBjX2NlYW5fdmFyOiB7CisgICAgICAgICAgICAgICAgaW50NjRfdCBzaXplID0gbV92YXJzW2ldLnNpemU7CisKKyAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLnR5cGUuZHN0ID09IGNfY2Vhbl92YXIpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gYXJyYXkgZGVzY3JpcHRvcgorICAgICAgICAgICAgICAgICAgICBjb25zdCBhcnJfZGVzYyAqYXAgPQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgYXJyX2Rlc2MqPihtX3ZhcnNbaV0uaW50byk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gZGVidWcgZHVtcAorICAgICAgICAgICAgICAgICAgICBfX2Fycl9kZXNjX2R1bXAoIiAgICAiLCAiSU5UTyIsIGFwLCAwKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQgYW5kIGxlbmd0aCBhcmUgZGVyaXZlZCBmcm9tIHRoZSBhcnJheSBkZXNjcmlwdG9yCisgICAgICAgICAgICAgICAgICAgIF9fYXJyX2RhdGFfb2Zmc2V0X2FuZF9sZW5ndGgoYXAsIGludG9fZGlzcCwgc2l6ZSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFpc19hcnJfZGVzY19jb250aWd1b3VzKGFwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLmlzX25vbmNvbnRfZHN0ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19kc3QgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRfcmVhZF9yYW5nZXNfYXJyX2Rlc2MoYXApOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjZWFuX3Jhbmdlc19tYXRjaCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19kc3QpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3Jhbmdlc19kb250X21hdGNoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGl0KDEpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5pbnRvID0gcmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oYXAtPmJhc2UpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGludDY0X3Qgc2l6ZV9zcmMgPSBtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfc3JjID8KKyAgICAgICAgICAgICAgICAgICAgY2Vhbl9nZXRfdHJhbnNmX3NpemUobV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX3NyYykgOgorICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZTsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IHNpemVfZHN0ID0gbV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX2RzdCA/CisgICAgICAgICAgICAgICAgICAgIGNlYW5fZ2V0X3RyYW5zZl9zaXplKG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19kc3QpIDoKKyAgICAgICAgICAgICAgICAgICAgc2l6ZTsKKyAgICAgICAgICAgICAgICAvLyBJdCdzIHN1cHBvc2VkIHRoYXQgImludG8iIHNpemUgbXVzdCBiZSBub3QgbGVzcworICAgICAgICAgICAgICAgIC8vIHRoYW4gc3JjIHNpemUKKyAgICAgICAgICAgICAgICBpZiAoc2l6ZV9zcmMgPiBzaXplX2RzdCkgeworICAgICAgICAgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfZGlmZmVyZW50X3NyY19hbmRfZHN0bl9zaXplcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3NyYywgc2l6ZV9kc3QpOworICAgICAgICAgICAgICAgICAgICBleGl0KDEpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZGlyZWN0aW9uLmJpdHMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5mbGFncy5pc19zdGF0aWNfZHN0bikgeworICAgICAgICAgICAgICAgICAgICAgICAgUHRyRGF0YSAqcHRyX2RhdGE7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgZGF0YSBhc3NvY2lhdGVkIHdpdGggdmFyaWFibGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmluZF9wdHJfZGF0YShwdHJfZGF0YSwgbV92YXJzW2ldLmludG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50b19kaXNwLCBzaXplLCBmYWxzZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHRyX2RhdGEgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldCB0byBiYXNlIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVtb3J5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50b19vZmZzZXQgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciopIG1fdmFyc1tpXS5pbnRvIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIqKSBwdHJfZGF0YS0+Y3B1X2FkZHIuc3RhcnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5pc19zdGF0aWNfZHN0biA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLmRzdF9kYXRhID0gcHRyX2RhdGE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5pbiAmJgorICAgICAgICAgICAgICAgICAgICAhbV92YXJzW2ldLmZsYWdzLmlzX3N0YXRpY19kc3RuKSB7CisgICAgICAgICAgICAgICAgICAgIG1faW5fZGF0YWxlbiArPSBtX3ZhcnNbaV0uc2l6ZTsKKworICAgICAgICAgICAgICAgICAgICAvLyBmb3Igbm9uLXN0YXRpYyB0YXJnZXQgZGVzdGluYXRpb24gZGVmaW5lZCBhcyBDRUFOCisgICAgICAgICAgICAgICAgICAgIC8vIGV4cHJlc3Npb24gd2UgcGFzcyB0byB0YXJnZXQgaXRzIHNpemUgYW5kIGRpc3QKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS50eXBlLmRzdCA9PSBjX2NlYW5fdmFyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2luX2RhdGFsZW4gKz0gMiAqIHNpemVvZih1aW50NjRfdCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbV9uZWVkX3J1bmZ1bmN0aW9uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgY19kdjoKKyAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5iaXRzIHx8CisgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5hbGxvY19pZiB8fAorICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZnJlZV9pZikgeworICAgICAgICAgICAgICAgICAgICBBcnJEZXNjICpkdnAgPSBzdGF0aWNfY2FzdDxBcnJEZXNjKj4obV92YXJzW2ldLmludG8pOworCisgICAgICAgICAgICAgICAgICAgIC8vIGRlYnVnIGR1bXAKKyAgICAgICAgICAgICAgICAgICAgX19kdl9kZXNjX2R1bXAoIklOVE8iLCBkdnApOworCisgICAgICAgICAgICAgICAgICAgIC8vIHNlbmQgZG9wZSB2ZWN0b3IgY29udGVudHMgZXhjbHVkaW5nIGJhc2UKKyAgICAgICAgICAgICAgICAgICAgbV9pbl9kYXRhbGVuICs9IG1fdmFyc1tpXS5zaXplIC0gc2l6ZW9mKHVpbnQ2NF90KTsKKyAgICAgICAgICAgICAgICAgICAgbV9uZWVkX3J1bmZ1bmN0aW9uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgY19zdHJpbmdfcHRyOgorICAgICAgICAgICAgY2FzZSBjX2RhdGFfcHRyOgorICAgICAgICAgICAgY2FzZSBjX2NlYW5fdmFyX3B0cjoKKyAgICAgICAgICAgIGNhc2UgY19kdl9wdHI6IHsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IHNpemUgPSBtX3ZhcnNbaV0uc2l6ZTsKKworICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0udHlwZS5kc3QgPT0gY19jZWFuX3Zhcl9wdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gYXJyYXkgZGVzY3JpcHRvcgorICAgICAgICAgICAgICAgICAgICBjb25zdCBhcnJfZGVzYyAqYXAgPQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgYXJyX2Rlc2MqPihtX3ZhcnNbaV0uaW50byk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gZGVidWcgZHVtcAorICAgICAgICAgICAgICAgICAgICBfX2Fycl9kZXNjX2R1bXAoIiAgICAiLCAiSU5UTyIsIGFwLCAxKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQgYW5kIGxlbmd0aCBhcmUgZGVyaXZlZCBmcm9tIHRoZSBhcnJheSBkZXNjcmlwdG9yCisgICAgICAgICAgICAgICAgICAgIF9fYXJyX2RhdGFfb2Zmc2V0X2FuZF9sZW5ndGgoYXAsIGludG9fZGlzcCwgc2l6ZSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFpc19hcnJfZGVzY19jb250aWd1b3VzKGFwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLmlzX25vbmNvbnRfc3JjID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19kc3QgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRfcmVhZF9yYW5nZXNfYXJyX2Rlc2MoYXApOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjZWFuX3Jhbmdlc19tYXRjaCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19kc3QpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3Jhbmdlc19kb250X21hdGNoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uaW50byA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcioqPihhcC0+YmFzZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1fdmFyc1tpXS50eXBlLmRzdCA9PSBjX2R2X3B0cikgeworICAgICAgICAgICAgICAgICAgICAvLyBuZWVkIHRvIHNlbmQgRFYgdG8gdGhlIGRldmljZSB1bmxlc3MgaXQgaXMgJ25vY29weScKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5kaXJlY3Rpb24uYml0cyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmFsbG9jX2lmIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZnJlZV9pZikgeworICAgICAgICAgICAgICAgICAgICAgICAgQXJyRGVzYyAqZHZwID0gKnN0YXRpY19jYXN0PEFyckRlc2MqKj4obV92YXJzW2ldLmludG8pOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWJ1ZyBkdW1wCisgICAgICAgICAgICAgICAgICAgICAgICBfX2R2X2Rlc2NfZHVtcCgiSU5UTyIsIGR2cCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2luOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaW50NjRfdCBzaXplX3NyYyA9IG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19zcmMgPworICAgICAgICAgICAgICAgICAgICBjZWFuX2dldF90cmFuc2Zfc2l6ZShtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfc3JjKSA6CisgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplOworICAgICAgICAgICAgICAgIGludDY0X3Qgc2l6ZV9kc3QgPSBtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfZHN0ID8KKyAgICAgICAgICAgICAgICAgICAgY2Vhbl9nZXRfdHJhbnNmX3NpemUobV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX2RzdCkgOgorICAgICAgICAgICAgICAgICAgICBzaXplOworICAgICAgICAgICAgICAgIC8vIEl0J3Mgc3VwcG9zZWQgdGhhdCAiaW50byIgc2l6ZSBtdXN0IGJlIG5vdCBsZXNzIHRoYW4KKyAgICAgICAgICAgICAgICAvLyBzcmMgc2l6ZQorICAgICAgICAgICAgICAgIGlmIChzaXplX3NyYyA+IHNpemVfZHN0KSB7CisgICAgICAgICAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19kaWZmZXJlbnRfc3JjX2FuZF9kc3RuX3NpemVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfc3JjLCBzaXplX2RzdCk7CisgICAgICAgICAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5kaXJlY3Rpb24uYml0cykgeworICAgICAgICAgICAgICAgICAgICBQdHJEYXRhICpwdHJfZGF0YTsKKworICAgICAgICAgICAgICAgICAgICAvLyBiYXNlIGFkZHJlc3MKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAqYmFzZSA9ICpzdGF0aWNfY2FzdDx2b2lkKio+KG1fdmFyc1tpXS5pbnRvKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5pbikgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb2NhdGUgYnVmZmVyCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmZsYWdzLmlzX3N0YWNrX2J1ZikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBzdGFjayBwZXJzaXN0ZW50IG9iamVjdHMgcHRyIGRhdGEgaXMgY3JlYXRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ5IHZhcl9kZXNjIHdpdGggbnVtYmVyIDAuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSXRzIHB0cl9kYXRhIGlzIHN0b3JlZCBhdCBtX3N0YWNrX3B0cl9kYXRhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX2RhdGEgPSBtX3N0YWNrX3B0cl9kYXRhOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5zaW5rX2FkZHIgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobV92YXJzW2ldLmFsbG9jX2lmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkIG5ldyBlbnRyeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYWxsb2NfcHRyX2RhdGEoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWxsb2NfYmFzZSAhPSBOVUxMKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NfZGlzcCA6IGludG9fZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhbGxvY19iYXNlICE9IE5VTEwpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY19zaXplIDogc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jX2Rpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWxsb2NfYmFzZSAhPSBOVUxMKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCA6IG1fdmFyc1tpXS5hbGlnbikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwdHJfZGF0YS0+YWRkX3JlZmVyZW5jZSgpID09IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX2RhdGEtPm1pY19idWYgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGQgYnVmZmVyIHRvIHRoZSBsaXN0IG9mIGJ1ZmZlcnMgdGhhdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcmUgcGFzc2VkIHRvIGRpc3BhdGNoIGNhbGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9jb21wdXRlX2J1ZmZlcnMucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX2RhdGEtPm1pY19idWYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2lsbCBzZW5kIGJ1ZmZlciBhZGRyZXNzIHRvIGRldmljZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3Muc2lua19hZGRyID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXB0cl9kYXRhLT5pc19zdGF0aWMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmVlZCB0byBhZGQgcmVmZXJlbmNlIGZvciBidWZmZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9uZWVkX3J1bmZ1bmN0aW9uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2UgZXhpc3RpbmcgYXNzb2NpYXRpb24gZnJvbSBwb2ludGVyIHRhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaW5kX3B0cl9kYXRhKHB0cl9kYXRhLCBiYXNlLCBpbnRvX2Rpc3AsIHNpemUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLnNpbmtfYWRkciA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwdHJfZGF0YS0+YWxsb2NfZGlzcCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLmFsbG9jX2Rpc3AgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faW5fZGF0YWxlbiArPSBzaXplb2YoYWxsb2NfZGlzcCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZmxhZ3Muc2lua19hZGRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IGJ1ZmZlcnMncyBhZGRyZXNzIG9uIHRoZSBzaW5rCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbml0X21pY19hZGRyZXNzKHB0cl9kYXRhKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pbl9kYXRhbGVuICs9IHNpemVvZihwdHJfZGF0YS0+bWljX2FkZHIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXB0cl9kYXRhLT5pc19zdGF0aWMgJiYgbV92YXJzW2ldLmZyZWVfaWYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZWVkIHRvIGRlY3JlbWVudCBidWZmZXIgcmVmZXJlbmNlIG9uIHRhcmdldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fbmVlZF9ydW5mdW5jdGlvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvcHkgb3RoZXIgcG9pbnRlciBwcm9wZXJ0aWVzIHRvIHZhciBkZXNjcmlwdG9yCisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ubWljX29mZnNldCA9IHB0cl9kYXRhLT5taWNfb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLmlzX3N0YXRpY19kc3RuID0gcHRyX2RhdGEtPmlzX3N0YXRpYzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmluZF9wdHJfZGF0YShwdHJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludG9fZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHB0cl9kYXRhKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnRvX29mZnNldCA9IHB0cl9kYXRhID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciopIGJhc2UgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyKikgcHRyX2RhdGEtPmNwdV9hZGRyLnN0YXJ0KCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gc2F2ZSBwb2ludGVyIGRhdGEKKyAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLmRzdF9kYXRhID0gcHRyX2RhdGE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIGNfZnVuY19wdHI6CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgY19kdl9kYXRhOgorICAgICAgICAgICAgY2FzZSBjX2R2X3B0cl9kYXRhOgorICAgICAgICAgICAgY2FzZSBjX2R2X2RhdGFfc2xpY2U6CisgICAgICAgICAgICBjYXNlIGNfZHZfcHRyX2RhdGFfc2xpY2U6CisgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5kaXJlY3Rpb24uYml0cyB8fAorICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uYWxsb2NfaWYgfHwKKyAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZyZWVfaWYpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgYXJyX2Rlc2MgKmFwOworICAgICAgICAgICAgICAgICAgICBBcnJEZXNjICpkdnA7CisgICAgICAgICAgICAgICAgICAgIFB0ckRhdGEgKnB0cl9kYXRhOworICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGRpc3A7CisgICAgICAgICAgICAgICAgICAgIGludDY0X3Qgc2l6ZTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoVkFSX1RZUEVfSVNfRFZfREFUQV9TTElDRShtX3ZhcnNbaV0udHlwZS5kc3QpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcCA9IHN0YXRpY19jYXN0PGNvbnN0IGFycl9kZXNjKj4obV92YXJzW2ldLmludG8pOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWJ1ZyBkdW1wCisgICAgICAgICAgICAgICAgICAgICAgICBfX2Fycl9kZXNjX2R1bXAoIiAgICAiLCAiSU5UTyIsIGFwLCAwKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgZHZwID0gKG1fdmFyc1tpXS50eXBlLmRzdCA9PSBjX2R2X2RhdGFfc2xpY2UpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8QXJyRGVzYyo+KGFwLT5iYXNlKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxBcnJEZXNjKio+KGFwLT5iYXNlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGR2cCA9IChtX3ZhcnNbaV0udHlwZS5kc3QgPT0gY19kdl9kYXRhKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxBcnJEZXNjKj4obV92YXJzW2ldLmludG8pIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzdGF0aWNfY2FzdDxBcnJEZXNjKio+KG1fdmFyc1tpXS5pbnRvKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoIV9fZHZfaXNfY29udGlndW91cyhkdnApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3MuaXNfbm9uY29udF9kc3QgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX2RzdCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdF9yZWFkX3Jhbmdlc19kdihkdnApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIHNpemUgYW5kIGRpc3BsYWNlbWVudAorICAgICAgICAgICAgICAgICAgICBpZiAoVkFSX1RZUEVfSVNfRFZfREFUQV9TTElDRShtX3ZhcnNbaV0udHlwZS5kc3QpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQgYW5kIGxlbmd0aCBhcmUgZGVyaXZlZCBmcm9tIHRoZSBhcnJheQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVzY3JpcHRvcgorICAgICAgICAgICAgICAgICAgICAgICAgX19hcnJfZGF0YV9vZmZzZXRfYW5kX2xlbmd0aChhcCwgaW50b19kaXNwLCBzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZGlyZWN0aW9uLmJpdHMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzX2Fycl9kZXNjX2NvbnRpZ3VvdXMoYXApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZmxhZ3MuaXNfbm9uY29udF9kc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19zbGljZV9vZl9ub25jb250X2FycmF5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3MuaXNfbm9uY29udF9kc3QgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfZHN0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRfcmVhZF9yYW5nZXNfYXJyX2Rlc2MoYXApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNlYW5fcmFuZ2VzX21hdGNoKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX3NyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19kc3QpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfcmFuZ2VzX2RvbnRfbWF0Y2gpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5mbGFncy5oYXNfbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IF9fZHZfZGF0YV9sZW5ndGgoZHZwLCBtX3ZhcnNbaV0uY291bnQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IF9fZHZfZGF0YV9sZW5ndGgoZHZwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRpc3AgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBzaXplX3NyYyA9CisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfc3JjID8KKyAgICAgICAgICAgICAgICAgICAgICAgIGNlYW5fZ2V0X3RyYW5zZl9zaXplKG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19zcmMpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplOworICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHNpemVfZHN0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19kc3QgPworICAgICAgICAgICAgICAgICAgICAgICAgY2Vhbl9nZXRfdHJhbnNmX3NpemUobV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX2RzdCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgLy8gSXQncyBzdXBwb3NlZCB0aGF0ICJpbnRvIiBzaXplIG11c3QgYmUgbm90IGxlc3MKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhhbiBzcmMgc2l6ZQorICAgICAgICAgICAgICAgICAgICBpZiAoc2l6ZV9zcmMgPiBzaXplX2RzdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX2RpZmZlcmVudF9zcmNfYW5kX2RzdG5fc2l6ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV9zcmMsIHNpemVfZHN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBiYXNlIGFkZHJlc3MKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAqYmFzZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KGR2cC0+QmFzZSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gYWxsb2NhdGUgYnVmZmVyCisgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZGlyZWN0aW9uLmluKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmFsbG9jX2lmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkIG5ldyBlbnRyeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYWxsb2NfcHRyX2RhdGEoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWxsb2NfYmFzZSAhPSBOVUxMKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NfZGlzcCA6IGludG9fZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhbGxvY19iYXNlICE9IE5VTEwpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY19zaXplIDogc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jX2Rpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWxsb2NfYmFzZSAhPSBOVUxMKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCA6IG1fdmFyc1tpXS5hbGlnbikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHRyX2RhdGEtPmFkZF9yZWZlcmVuY2UoKSA9PSAwICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9kYXRhLT5taWNfYnVmICE9MCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGQgYnVmZmVyIHRvIHRoZSBsaXN0IG9mIGJ1ZmZlcnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCBhcmUgcGFzc2VkIHRvIGRpc3BhdGNoIGNhbGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9jb21wdXRlX2J1ZmZlcnMucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX2RhdGEtPm1pY19idWYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2lsbCBzZW5kIGJ1ZmZlciBhZGRyZXNzIHRvIGRldmljZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3Muc2lua19hZGRyID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXB0cl9kYXRhLT5pc19zdGF0aWMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmVlZCB0byBhZGQgcmVmZXJlbmNlIGZvciBidWZmZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9uZWVkX3J1bmZ1bmN0aW9uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2UgZXhpc3RpbmcgYXNzb2NpYXRpb24gZnJvbSBwb2ludGVyIHRhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaW5kX3B0cl9kYXRhKHB0cl9kYXRhLCBiYXNlLCBpbnRvX2Rpc3AsIHNpemUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZWVkIHRvIHVwZGF0ZSBiYXNlIGluIGRvcGUgdmVjdG9yIG9uIGRldmljZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5zaW5rX2FkZHIgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHRyX2RhdGEtPmFsbG9jX2Rpc3AgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5hbGxvY19kaXNwID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2luX2RhdGFsZW4gKz0gc2l6ZW9mKGFsbG9jX2Rpc3ApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmZsYWdzLnNpbmtfYWRkcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCBidWZmZXJzJ3MgYWRkcmVzcyBvbiB0aGUgc2luaworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaW5pdF9taWNfYWRkcmVzcyhwdHJfZGF0YSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2luX2RhdGFsZW4gKz0gc2l6ZW9mKHB0cl9kYXRhLT5taWNfYWRkcik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcHRyX2RhdGEtPmlzX3N0YXRpYyAmJiBtX3ZhcnNbaV0uZnJlZV9pZikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gZGVjcmVtZW50IGJ1ZmZlciByZWZlcmVuY2Ugb24gdGFyZ2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9uZWVkX3J1bmZ1bmN0aW9uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2Zmc2V0IHRvIGJhc2UgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lbW9yeQorICAgICAgICAgICAgICAgICAgICAgICAgaW50b19vZmZzZXQgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyKikgYmFzZSAtIChjaGFyKikgcHRyX2RhdGEtPmNwdV9hZGRyLnN0YXJ0KCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvcHkgb3RoZXIgcG9pbnRlciBwcm9wZXJ0aWVzIHRvIHZhciBkZXNjcmlwdG9yCisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ubWljX29mZnNldCA9IHB0cl9kYXRhLT5taWNfb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLmlzX3N0YXRpY19kc3RuID0gcHRyX2RhdGEtPmlzX3N0YXRpYzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsgLy8gc3JjX2lzX2Zvcl9taWMKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmluZF9wdHJfZGF0YShwdHJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludG9fZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludG9fb2Zmc2V0ID0gIXB0cl9kYXRhID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciopIGJhc2UgLSAoY2hhciopIHB0cl9kYXRhLT5jcHVfYWRkci5zdGFydCgpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gc2F2ZSBwb2ludGVyIGRhdGEKKyAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLmRzdF9kYXRhID0gcHRyX2RhdGE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY191bmtub3duX3Zhcl90eXBlLCBtX3ZhcnNbaV0udHlwZS5zcmMpOworICAgICAgICAgICAgICAgIExJQk9GRkxPQURfQUJPUlQ7CisgICAgICAgIH0KKyAgICAgICAgLy8gaWYgaW50byBpcyB1c2VkIGF0IENQVSBzYXZlIGl0cyBvZmZzZXQgYW5kIGRpc3AKKyAgICAgICAgaWYgKG1fdmFyc1tpXS5kaXJlY3Rpb24ub3V0KSB7CisgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uY3B1X29mZnNldCA9IGludG9fb2Zmc2V0OworICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLmNwdV9kaXNwICAgPSBpbnRvX2Rpc3A7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAobV92YXJzW2ldLmZsYWdzLmlzX3N0YWNrX2J1ZikgeworICAgICAgICAgICAgICAgIGludG9fb2Zmc2V0ID0gc3RhdGljX2Nhc3Q8Y2hhcio+KG1fdmFyc1tpXS5pbnRvKSAtCisgICAgICAgICAgICAgICAgICAgIG1fZGV2aWNlLm1fcGVyc2lzdF9saXN0LmZyb250KCkuY3B1X3N0YWNrX2FkZHI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtX3ZhcnNbaV0ub2Zmc2V0ID0gaW50b19vZmZzZXQ7CisgICAgICAgICAgICBtX3ZhcnNbaV0uZGlzcCAgID0gaW50b19kaXNwOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgT2ZmbG9hZERlc2NyaXB0b3I6OnNldHVwX21pc2NfZGF0YShjb25zdCBjaGFyICpuYW1lKQoreworICAgIE9mZmxvYWRUaW1lciB0aW1lcihnZXRfdGltZXJfZGF0YSgpLCBjX29mZmxvYWRfaG9zdF9zZXR1cF9taXNjX2RhdGEpOworCisgICAgLy8gd2UgY2FuIHNraXAgcnVuIGZ1bmN0b24gY2FsbCB0b2dldGhlciB3aXRoIHdhaXQgaWYgb2ZmbG9hZGVkCisgICAgLy8gcmVnaW9uIGlzIGVtcHR5IGFuZCB0aGVyZSBpcyBubyB1c2VyIGRlZmluZWQgbm9uLXBvaW50ZXIgSU4vT1VUIGRhdGEKKyAgICBpZiAobV9uZWVkX3J1bmZ1bmN0aW9uKSB7CisgICAgICAgIC8vIHZhcmlhYmxlIGRlc2NyaXB0b3JzIGFyZSBzZW50IGFzIGlucHV0IGRhdGEKKyAgICAgICAgbV9pbl9kYXRhbGVuICs9IG1fdmFyc190b3RhbCAqIHNpemVvZihWYXJEZXNjKTsKKworICAgICAgICAvLyB0aW1lciBkYXRhIGlzIHNlbnQgYXMgYSBwYXJ0IG9mIHRoZSBvdXRwdXQgZGF0YQorICAgICAgICBtX291dF9kYXRhbGVuICs9IE9GRkxPQURfVElNRVJfREFUQUxFTigpOworCisgICAgICAgIC8vIG1heCBmcm9tIGlucHV0IGRhdGEgYW5kIG91dHB1dCBkYXRhIGxlbmd0aAorICAgICAgICB1aW50NjRfdCBkYXRhX2xlbiA9IG1faW5fZGF0YWxlbiA+IG1fb3V0X2RhdGFsZW4gPyBtX2luX2RhdGFsZW4gOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX291dF9kYXRhbGVuOworCisgICAgICAgIC8vIE1pc2MgZGF0YSBoYXMgdGhlIGZvbGxvd2luZyBsYXlvdXQKKyAgICAgICAgLy8gICAgIDxGdW5jdGlvbiBEZXNjcmlwdG9yPgorICAgICAgICAvLyAgICAgPEZ1bmN0aW9uIE5hbWU+CisgICAgICAgIC8vICAgICA8SW4vT3V0IERhdGE+ICAgICAgICAgICAgKG9wdGlvbmFsKQorICAgICAgICAvLworICAgICAgICAvLyBXZSBjYW4gdHJhbnNmZXIgY29weWluL2NvcHlvdXQgZGF0YSBpbiBtaXNjL3JldHVybiBkYXRhIHdoaWNoIGNhbgorICAgICAgICAvLyBiZSBwYXNzZWQgdG8gcnVuIGZ1bmN0aW9uIGNhbGwgaWYgaXRzIHNpemUgZG9lcyBub3QgZXhjZWVkCisgICAgICAgIC8vIENPSV9QSVBFTElORV9NQVhfSU5fTUlTQ19EQVRBX0xFTi4gT3RoZXJ3aXNlIHdlIGhhdmUgdG8gYWxsb2NhdGUKKyAgICAgICAgLy8gYnVmZmVyIGZvciBpdC4KKworICAgICAgICBtX2Z1bmNfZGVzY19zaXplID0gc2l6ZW9mKEZ1bmN0aW9uRGVzY3JpcHRvcikgKyBzdHJsZW4obmFtZSkgKyAxOworICAgICAgICBtX2Z1bmNfZGVzY19zaXplID0gKG1fZnVuY19kZXNjX3NpemUgKyA3KSAmIH43OworCisgICAgICAgIGludCBtaXNjX2RhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgaW50IG1pc2NfZGF0YV9zaXplID0gMDsKKyAgICAgICAgaWYgKGRhdGFfbGVuID4gMCkgeworICAgICAgICAgICAgaWYgKG1fZnVuY19kZXNjX3NpemUgKworICAgICAgICAgICAgICAgIG1faW5fZGF0YWxlbiA8PSBDT0lfUElQRUxJTkVfTUFYX0lOX01JU0NfREFUQV9MRU4gJiYKKyAgICAgICAgICAgICAgICBtX291dF9kYXRhbGVuIDw9IENPSV9QSVBFTElORV9NQVhfSU5fTUlTQ19EQVRBX0xFTikgeworICAgICAgICAgICAgICAgIC8vIHVzZSBtaXNjL3JldHVybiBkYXRhIGZvciBjb3B5aW4vY29weW91dAorICAgICAgICAgICAgICAgIG1pc2NfZGF0YV9vZmZzZXQgPSBtX2Z1bmNfZGVzY19zaXplOworICAgICAgICAgICAgICAgIG1pc2NfZGF0YV9zaXplID0gZGF0YV9sZW47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBPZmZsb2FkVGltZXIgdGltZXJfYnVmKGdldF90aW1lcl9kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX29mZmxvYWRfaG9zdF9hbGxvY19kYXRhX2J1ZmZlcik7CisKKyAgICAgICAgICAgICAgICAvLyBzZW5kL3JlY2VpdmUgZGF0YSB1c2luZyBidWZmZXIKKyAgICAgICAgICAgICAgICBDT0lSRVNVTFQgcmVzID0gQ09JOjpCdWZmZXJDcmVhdGUoZGF0YV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPSV9CVUZGRVJfTk9STUFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAmbV9kZXZpY2UuZ2V0X3Byb2Nlc3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1faW5vdXRfYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtX3N0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX3N0YXR1cy0+cmVzdWx0ID0gdHJhbnNsYXRlX2NvaV9lcnJvcihyZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9jb2lfZXJyb3IoY19idWZfY3JlYXRlLCByZXMpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG1fY29tcHV0ZV9idWZmZXJzLnB1c2hfYmFjayhtX2lub3V0X2J1Zik7CisgICAgICAgICAgICAgICAgbV9kZXN0cm95X2J1ZmZlcnMucHVzaF9iYWNrKG1faW5vdXRfYnVmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGluaXRpYWxpemUgZnVuY3Rpb24gZGVzY3JpcHRvcgorICAgICAgICBtX2Z1bmNfZGVzYyA9IChGdW5jdGlvbkRlc2NyaXB0b3IqKSBtYWxsb2MobV9mdW5jX2Rlc2Nfc2l6ZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXNjX2RhdGFfc2l6ZSk7CisgICAgICAgIG1fZnVuY19kZXNjLT5jb25zb2xlX2VuYWJsZWQgPSBjb25zb2xlX2VuYWJsZWQ7CisgICAgICAgIG1fZnVuY19kZXNjLT50aW1lcl9lbmFibGVkID0KKyAgICAgICAgICAgIHRpbWVyX2VuYWJsZWQgfHwgKG9mZmxvYWRfcmVwb3J0X2xldmVsICYmIG9mZmxvYWRfcmVwb3J0X2VuYWJsZWQpOworICAgICAgICBtX2Z1bmNfZGVzYy0+b2ZmbG9hZF9yZXBvcnRfbGV2ZWwgPSBvZmZsb2FkX3JlcG9ydF9sZXZlbDsKKyAgICAgICAgbV9mdW5jX2Rlc2MtPm9mZmxvYWRfbnVtYmVyID0gR0VUX09GRkxPQURfTlVNQkVSKGdldF90aW1lcl9kYXRhKCkpOworICAgICAgICBtX2Z1bmNfZGVzYy0+aW5fZGF0YWxlbiA9IG1faW5fZGF0YWxlbjsKKyAgICAgICAgbV9mdW5jX2Rlc2MtPm91dF9kYXRhbGVuID0gbV9vdXRfZGF0YWxlbjsKKyAgICAgICAgbV9mdW5jX2Rlc2MtPnZhcnNfbnVtID0gbV92YXJzX3RvdGFsOworICAgICAgICBtX2Z1bmNfZGVzYy0+ZGF0YV9vZmZzZXQgPSBtaXNjX2RhdGFfb2Zmc2V0OworCisgICAgICAgIC8vIGFwcGVuZCBlbnRyeSBuYW1lCisgICAgICAgIHN0cmNweShtX2Z1bmNfZGVzYy0+ZGF0YSwgbmFtZSk7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgT2ZmbG9hZERlc2NyaXB0b3I6OndhaXRfZGVwZW5kZW5jaWVzKAorICAgIGNvbnN0IHZvaWQgKip3YWl0cywKKyAgICBpbnQgbnVtX3dhaXRzCispCit7CisgICAgT2ZmbG9hZFRpbWVyIHRpbWVyKGdldF90aW1lcl9kYXRhKCksIGNfb2ZmbG9hZF9ob3N0X3dhaXRfZGVwcyk7CisgICAgYm9vbCByZXQgPSB0cnVlOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fd2FpdHM7IGkrKykgeworCisgICAgICAgIE9mZmxvYWREZXNjcmlwdG9yICp0YXNrID0gbV9kZXZpY2UuZmluZF9zaWduYWwod2FpdHNbaV0sIHRydWUpOworICAgICAgICBpZiAodGFzayA9PSAwKSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfb2ZmbG9hZDEsIG1fZGV2aWNlLmdldF9sb2dpY2FsX2luZGV4KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhaXRzW2ldKTsKKyAgICAgICAgICAgIExJQk9GRkxPQURfQUJPUlQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXRhc2stPm9mZmxvYWRfZmluaXNoKCkpIHsKKyAgICAgICAgICAgIHJldCA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgdGFzay0+Y2xlYW51cCgpOworICAgICAgICBkZWxldGUgdGFzazsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitib29sIE9mZmxvYWREZXNjcmlwdG9yOjpvZmZsb2FkKAorICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgYm9vbCBpc19lbXB0eSwKKyAgICBWYXJEZXNjICp2YXJzLAorICAgIFZhckRlc2MyICp2YXJzMiwKKyAgICBpbnQgdmFyc190b3RhbCwKKyAgICBjb25zdCB2b2lkICoqd2FpdHMsCisgICAgaW50IG51bV93YWl0cywKKyAgICBjb25zdCB2b2lkICoqc2lnbmFsLAorICAgIGludCBlbnRyeV9pZCwKKyAgICBjb25zdCB2b2lkICpzdGFja19hZGRyCispCit7CisgICAgaWYgKHNpZ25hbCA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0VfMSgxLAorICAgICAgICAgICAgICAgICAgICAgIEdFVF9PRkZMT0FEX05VTUJFUihnZXRfdGltZXJfZGF0YSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICBjX29mZmxvYWRfaW5pdF9mdW5jLAorICAgICAgICAgICAgICAgICAgICAgICJPZmZsb2FkIGZ1bmN0aW9uICVzLCBpc19lbXB0eT0lZCwgI3ZhckRlc2NzPSVkLCAiCisgICAgICAgICAgICAgICAgICAgICAgIiN3YWl0cz0lZCwgc2lnbmFsPW5vbmVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgaXNfZW1wdHksIHZhcnNfdG90YWwsIG51bV93YWl0cyk7CisgICAgICAgIE9GRkxPQURfUkVQT1JUKDMsIEdFVF9PRkZMT0FEX05VTUJFUihnZXRfdGltZXJfZGF0YSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICBjX29mZmxvYWRfc2VudF9wb2ludGVyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgIiNXYWl0IDogJWQgXG4iLCBudW1fd2FpdHMpOworICAgICAgICBPRkZMT0FEX1JFUE9SVCgzLCBHRVRfT0ZGTE9BRF9OVU1CRVIoZ2V0X3RpbWVyX2RhdGEoKSksCisgICAgICAgICAgICAgICAgICAgICAgY19vZmZsb2FkX3NpZ25hbCwKKyAgICAgICAgICAgICAgICAgICAgICAibm9uZSAlZFxuIiwgMCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFXzEoMSwKKyAgICAgICAgICAgICAgICAgICAgICBHRVRfT0ZGTE9BRF9OVU1CRVIoZ2V0X3RpbWVyX2RhdGEoKSksCisgICAgICAgICAgICAgICAgICAgICAgY19vZmZsb2FkX2luaXRfZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAiT2ZmbG9hZCBmdW5jdGlvbiAlcywgaXNfZW1wdHk9JWQsICN2YXJEZXNjcz0lZCwgIgorICAgICAgICAgICAgICAgICAgICAgICIjd2FpdHM9JWQsIHNpZ25hbD0lcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBpc19lbXB0eSwgdmFyc190b3RhbCwgbnVtX3dhaXRzLAorICAgICAgICAgICAgICAgICAgICAgICpzaWduYWwpOworCisgICAgICAgIE9GRkxPQURfUkVQT1JUKDMsIEdFVF9PRkZMT0FEX05VTUJFUihnZXRfdGltZXJfZGF0YSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICBjX29mZmxvYWRfc2lnbmFsLAorICAgICAgICAgICAgICAgICAgICAgICIlZFxuIiwgc2lnbmFsKTsKKyAgICB9CisgICAgT0ZGTE9BRF9SRVBPUlQoMywgR0VUX09GRkxPQURfTlVNQkVSKGdldF90aW1lcl9kYXRhKCkpLAorICAgICAgICAgICAgICAgICAgICAgIGNfb2ZmbG9hZF93YWl0LAorICAgICAgICAgICAgICAgICAgICAgICIjV2FpdCA6ICVkICAlcFxuIiwgbnVtX3dhaXRzLCB3YWl0cyk7CisKKyAgICBpZiAobV9zdGF0dXMgIT0gMCkgeworICAgICAgICBtX3N0YXR1cy0+cmVzdWx0ID0gT0ZGTE9BRF9TVUNDRVNTOworICAgICAgICBtX3N0YXR1cy0+ZGV2aWNlX251bWJlciA9IG1fZGV2aWNlLmdldF9sb2dpY2FsX2luZGV4KCk7CisgICAgfQorCisgICAgbV9uZWVkX3J1bmZ1bmN0aW9uID0gIWlzX2VtcHR5OworCisgICAgLy8gd2FpdCBmb3IgZGVwZW5kZW5jaWVzIHRvIGZpbmlzaAorICAgIGlmICghd2FpdF9kZXBlbmRlbmNpZXMod2FpdHMsIG51bV93YWl0cykpIHsKKyAgICAgICAgY2xlYW51cCgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gc2V0dXAgYnVmZmVycworICAgIGlmICghc2V0dXBfZGVzY3JpcHRvcnModmFycywgdmFyczIsIHZhcnNfdG90YWwsIGVudHJ5X2lkLCBzdGFja19hZGRyKSkgeworICAgICAgICBjbGVhbnVwKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBpbml0aWF0ZSBzZW5kIGZvciBwb2ludGVycy4gV2FudCB0byBkbyBpdCBhcyBlYXJseSBhcyBwb3NzaWJsZS4KKyAgICBpZiAoIXNlbmRfcG9pbnRlcl9kYXRhKHNpZ25hbCAhPSAwKSkgeworICAgICAgICBjbGVhbnVwKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBzZXR1cCBtaXNjIGRhdGEgZm9yIHJ1biBmdW5jdGlvbgorICAgIGlmICghc2V0dXBfbWlzY19kYXRhKG5hbWUpKSB7CisgICAgICAgIGNsZWFudXAoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIGdhdGhlciBjb3B5aW4gZGF0YSBpbnRvIGJ1ZmZlcgorICAgIGlmICghZ2F0aGVyX2NvcHlpbl9kYXRhKCkpIHsKKyAgICAgICAgY2xlYW51cCgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gU3RhcnQgdGhlIGNvbXB1dGF0aW9uCisgICAgaWYgKCFjb21wdXRlKCkpIHsKKyAgICAgICAgY2xlYW51cCgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gaW5pdGlhdGUgcmVjZWl2ZSBmb3IgcG9pbnRlcnMKKyAgICBpZiAoIXJlY2VpdmVfcG9pbnRlcl9kYXRhKHNpZ25hbCAhPSAwKSkgeworICAgICAgICBjbGVhbnVwKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBpZiB0aGVyZSBpcyBhIHNpZ25hbCBzYXZlIGRlc2NyaXB0b3IgZm9yIHRoZSBsYXRlciB1c2UuCisgICAgaWYgKHNpZ25hbCAhPSAwKSB7CisgICAgICAgIG1fZGV2aWNlLmFkZF9zaWduYWwoKnNpZ25hbCwgdGhpcyk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIHdhaXQgZm9yIHRoZSBvZmZsb2FkIHRvIGZpbmlzaC4KKyAgICBpZiAoIW9mZmxvYWRfZmluaXNoKCkpIHsKKyAgICAgICAgY2xlYW51cCgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgY2xlYW51cCgpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIE9mZmxvYWREZXNjcmlwdG9yOjpvZmZsb2FkX2ZpbmlzaCgpCit7CisgICAgQ09JUkVTVUxUIHJlczsKKworICAgIC8vIHdhaXQgZm9yIGNvbXB1dGUgZGVwZW5kZW5jaWVzIHRvIGJlY29tZSBzaWduYWxlZAorICAgIGlmIChtX2luX2RlcHNfdG90YWwgPiAwKSB7CisgICAgICAgIE9mZmxvYWRUaW1lciB0aW1lcihnZXRfdGltZXJfZGF0YSgpLCBjX29mZmxvYWRfaG9zdF93YWl0X2NvbXB1dGUpOworCisgICAgICAgIGlmIChfX29mZmxvYWRfYWN0aXZlX3dhaXQpIHsKKyAgICAgICAgICAgIC8vIGtlZXAgQ1BVIGJ1c3kKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICByZXMgPSBDT0k6OkV2ZW50V2FpdChtX2luX2RlcHNfdG90YWwsIG1faW5fZGVwcywgMCwgMSwgMCwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAocmVzID09IENPSV9USU1FX09VVF9SRUFDSEVEKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHJlcyA9IENPSTo6RXZlbnRXYWl0KG1faW5fZGVwc190b3RhbCwgbV9pbl9kZXBzLCAtMSwgMSwgMCwgMCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7CisgICAgICAgICAgICBpZiAobV9zdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgICAgIG1fc3RhdHVzLT5yZXN1bHQgPSB0cmFuc2xhdGVfY29pX2Vycm9yKHJlcyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVwb3J0X2NvaV9lcnJvcihjX2V2ZW50X3dhaXQsIHJlcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBzY2F0dGVyIGNvcHlvdXQgZGF0YSByZWNlaXZlZCBmcm9tIHRhcmdldAorICAgIGlmICghc2NhdHRlcl9jb3B5b3V0X2RhdGEoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIC8vIHdhaXQgZm9yIHJlY2VpdmUgZGVwZW5kZW5jaWVzIHRvIGJlY29tZSBzaWduYWxlZAorICAgIGlmIChtX291dF9kZXBzX3RvdGFsID4gMCkgeworICAgICAgICBPZmZsb2FkVGltZXIgdGltZXIoZ2V0X3RpbWVyX2RhdGEoKSwgY19vZmZsb2FkX2hvc3Rfd2FpdF9idWZmZXJzX3JlYWRzKTsKKworICAgICAgICBpZiAoX19vZmZsb2FkX2FjdGl2ZV93YWl0KSB7CisgICAgICAgICAgICAvLyBrZWVwIENQVSBidXN5CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgcmVzID0gQ09JOjpFdmVudFdhaXQobV9vdXRfZGVwc190b3RhbCwgbV9vdXRfZGVwcywgMCwgMSwgMCwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAocmVzID09IENPSV9USU1FX09VVF9SRUFDSEVEKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHJlcyA9IENPSTo6RXZlbnRXYWl0KG1fb3V0X2RlcHNfdG90YWwsIG1fb3V0X2RlcHMsIC0xLCAxLCAwLCAwKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIGlmIChtX3N0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICAgICAgbV9zdGF0dXMtPnJlc3VsdCA9IHRyYW5zbGF0ZV9jb2lfZXJyb3IocmVzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXBvcnRfY29pX2Vycm9yKGNfZXZlbnRfd2FpdCwgcmVzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGRlc3Ryb3kgYnVmZmVycworICAgIHsKKyAgICAgICAgT2ZmbG9hZFRpbWVyIHRpbWVyKGdldF90aW1lcl9kYXRhKCksIGNfb2ZmbG9hZF9ob3N0X2Rlc3Ryb3lfYnVmZmVycyk7CisKKyAgICAgICAgZm9yIChCdWZmZXJMaXN0Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1fZGVzdHJveV9idWZmZXJzLmJlZ2luKCk7CisgICAgICAgICAgICAgaXQgIT0gbV9kZXN0cm95X2J1ZmZlcnMuZW5kKCk7IGl0KyspIHsKKyAgICAgICAgICAgIHJlcyA9IENPSTo6QnVmZmVyRGVzdHJveSgqaXQpOworICAgICAgICAgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgIGlmIChtX3N0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1fc3RhdHVzLT5yZXN1bHQgPSB0cmFuc2xhdGVfY29pX2Vycm9yKHJlcyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVwb3J0X2NvaV9lcnJvcihjX2J1Zl9kZXN0cm95LCByZXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgT2ZmbG9hZERlc2NyaXB0b3I6OmNsZWFudXAoKQoreworICAgIC8vIHJlbGVhc2UgZGV2aWNlIGluIG9yc2wKKyAgICBPUlNMOjpyZWxlYXNlKG1fZGV2aWNlLmdldF9sb2dpY2FsX2luZGV4KCkpOworCisgICAgT0ZGTE9BRF9USU1FUl9TVE9QKGdldF90aW1lcl9kYXRhKCksIGNfb2ZmbG9hZF9ob3N0X3RvdGFsX29mZmxvYWQpOworCisgICAgLy8gcmVwb3J0IHN0dWZmCisgICAgT2ZmbG9hZF9SZXBvcnRfRXBpbG9nKGdldF90aW1lcl9kYXRhKCkpOworfQorCitib29sIE9mZmxvYWREZXNjcmlwdG9yOjppc19zaWduYWxlZCgpCit7CisgICAgYm9vbCBzaWduYWxlZCA9IHRydWU7CisgICAgQ09JUkVTVUxUIHJlczsKKworICAgIC8vIGNoZWNrIGNvbXB1dGUgYW5kIHJlY2VpdmUgZGVwZW5kZW5jaWVzCisgICAgaWYgKG1faW5fZGVwc190b3RhbCA+IDApIHsKKyAgICAgICAgcmVzID0gQ09JOjpFdmVudFdhaXQobV9pbl9kZXBzX3RvdGFsLCBtX2luX2RlcHMsIDAsIDEsIDAsIDApOworICAgICAgICBzaWduYWxlZCA9IHNpZ25hbGVkICYmIChyZXMgPT0gQ09JX1NVQ0NFU1MpOworICAgIH0KKyAgICBpZiAobV9vdXRfZGVwc190b3RhbCA+IDApIHsKKyAgICAgICAgcmVzID0gQ09JOjpFdmVudFdhaXQobV9vdXRfZGVwc190b3RhbCwgbV9vdXRfZGVwcywgMCwgMSwgMCwgMCk7CisgICAgICAgIHNpZ25hbGVkID0gc2lnbmFsZWQgJiYgKHJlcyA9PSBDT0lfU1VDQ0VTUyk7CisgICAgfQorCisgICAgcmV0dXJuIHNpZ25hbGVkOworfQorCisvLyBTZW5kIHBvaW50ZXIgZGF0YSBpZiBzb3VyY2Ugb3IgZGVzdGluYXRpb24gb3IgYm90aCBvZiB0aGVtIGFyZQorLy8gbm9uY29udGlndW91cy4gVGhlcmUgaXMgZ3VhcmFudGVlIHRoYXQgbGVuZ3RoIG9mIGRlc3RpbmF0aW9uIGVub3VnaCBmb3IKKy8vIHRyYW5zZmVycmVkIGRhdGEuCitib29sIE9mZmxvYWREZXNjcmlwdG9yOjpzZW5kX25vbmNvbnRpZ3VvdXNfcG9pbnRlcl9kYXRhKAorICAgIGludCBpLAorICAgIFB0ckRhdGEqIHNyY19kYXRhLAorICAgIFB0ckRhdGEqIGRzdF9kYXRhLAorICAgIENPSUVWRU5UICpldmVudAorICAgICkKK3sKKyAgICBpbnQ2NF90IG9mZnNldF9zcmMsIG9mZnNldF9kc3Q7CisgICAgaW50NjRfdCBsZW5ndGhfc3JjLCBsZW5ndGhfZHN0OworICAgIGludDY0X3QgbGVuZ3RoX3NyY19jdXIsIGxlbmd0aF9kc3RfY3VyOworICAgIGludDY0X3Qgc2VuZF9zaXplLCBkYXRhX3NlbnQgPSAwOworICAgIENPSVJFU1VMVCByZXM7CisgICAgYm9vbCBkc3RfaXNfZW1wdHkgPSB0cnVlOworICAgIGJvb2wgc3JjX2lzX2VtcHR5ID0gdHJ1ZTsKKworICAgIC8vIFNldCBsZW5ndGhfc3JjIGFuZCBsZW5ndGhfZHN0CisgICAgbGVuZ3RoX3NyYyA9IChtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfc3JjKSA/CisgICAgICAgIG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19zcmMtPnJhbmdlX3NpemUgOiBtX3ZhcnNbaV0uc2l6ZTsKKyAgICBsZW5ndGhfZHN0ID0gIW1fdmFyc1tpXS5pbnRvID8gbGVuZ3RoX3NyYyA6CisgICAgICAgICAgICAgICAgICAgICAobV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX2RzdCkgPworICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX2RzdC0+cmFuZ2Vfc2l6ZSA6IG1fdmFyc1tpXS5zaXplOworICAgIHNlbmRfc2l6ZSA9IChsZW5ndGhfc3JjIDwgbGVuZ3RoX2RzdCkgPyBsZW5ndGhfc3JjIDogbGVuZ3RoX2RzdDsKKworICAgIC8vIGNvbnNlcXVlbnRseSBnZXQgY29udGlndW91cyByYW5nZXMsCisgICAgLy8gZGVmaW5lIGNvcnJlc3BvbmRlZCBkZXN0aW5hdGlvbiBvZmZzZXQgYW5kIHNlbmQgZGF0YQorICAgIGRvIHsKKyAgICAgICAgaWYgKHNyY19pc19lbXB0eSkgeworICAgICAgICAgICAgaWYgKG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19zcmMpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWdldF9uZXh0X3JhbmdlKG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19zcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldF9zcmMpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHNvdXJjZSByYW5nZXMgYXJlIG92ZXIgLSBub3RoaW5nIHRvIHNlbmQKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoZGF0YV9zZW50ID09IDApIHsKKyAgICAgICAgICAgICAgICBvZmZzZXRfc3JjID0gbV92YXJzX2V4dHJhW2ldLmNwdV9kaXNwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsZW5ndGhfc3JjX2N1ciA9IGxlbmd0aF9zcmM7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvLyBpZiBzb3VyY2UgaXMgY29udGlndW91cyBvciBpdHMgY29udGlndW91cyByYW5nZSBpcyBncmVhdGVyCisgICAgICAgICAgICAvLyB0aGFuIGRlc3RpbmF0aW9uIG9uZQorICAgICAgICAgICAgb2Zmc2V0X3NyYyArPSBzZW5kX3NpemU7CisgICAgICAgIH0KKyAgICAgICAgbGVuZ3RoX3NyY19jdXIgLT0gc2VuZF9zaXplOworICAgICAgICBzcmNfaXNfZW1wdHkgPSBsZW5ndGhfc3JjX2N1ciA9PSAwOworCisgICAgICAgIGlmIChkc3RfaXNfZW1wdHkpIHsKKyAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uaW50bykgeworICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfZHN0KSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghZ2V0X25leHRfcmFuZ2UobV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX2RzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldF9kc3QpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZXN0aW5hdGlvbiByYW5nZXMgYXJlIG92ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19kZXN0aW5hdGlvbl9pc19vdmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBpbnRvIGlzIGNvbnRpZ3VvdXMuCisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG9mZnNldF9kc3QgPSBtX3ZhcnNbaV0uZGlzcDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbGVuZ3RoX2RzdF9jdXIgPSBsZW5ndGhfZHN0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gc2FtZSBhcyBzb3VyY2UKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIG9mZnNldF9kc3QgPSBvZmZzZXRfc3JjOworICAgICAgICAgICAgICAgIGxlbmd0aF9kc3RfY3VyID0gbGVuZ3RoX3NyYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8vIGlmIGRlc3RpbmF0aW9uIGlzIGNvbnRpZ3VvdXMgb3IgaXRzIGNvbnRpZ3VvdXMgcmFuZ2UgaXMgZ3JlYXRlcgorICAgICAgICAgICAgLy8gdGhhbiBzb3VyY2Ugb25lCisgICAgICAgICAgICBvZmZzZXRfZHN0ICs9IHNlbmRfc2l6ZTsKKyAgICAgICAgfQorICAgICAgICBsZW5ndGhfZHN0X2N1ciAtPSBzZW5kX3NpemU7CisgICAgICAgIGRzdF9pc19lbXB0eSA9IGxlbmd0aF9kc3RfY3VyID09IDA7CisKKyAgICAgICAgaWYgKHNyY19kYXRhICE9IDAgJiYgc3JjX2RhdGEtPmNwdV9idWYgIT0gMCkgeworICAgICAgICAgICAgcmVzID0gQ09JOjpCdWZmZXJDb3B5KAorICAgICAgICAgICAgICAgIGRzdF9kYXRhLT5taWNfYnVmLAorICAgICAgICAgICAgICAgIHNyY19kYXRhLT5jcHVfYnVmLAorICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5taWNfb2Zmc2V0IC0gZHN0X2RhdGEtPmFsbG9jX2Rpc3AgKworICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5vZmZzZXQgKyBvZmZzZXRfZHN0LAorICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5jcHVfb2Zmc2V0ICsgb2Zmc2V0X3NyYywKKyAgICAgICAgICAgICAgICBzZW5kX3NpemUsCisgICAgICAgICAgICAgICAgQ09JX0NPUFlfVU5TUEVDSUZJRUQsCisgICAgICAgICAgICAgICAgMCwgMCwKKyAgICAgICAgICAgICAgICBldmVudCk7CisgICAgICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgaWYgKG1fc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbV9zdGF0dXMtPnJlc3VsdCA9IHRyYW5zbGF0ZV9jb2lfZXJyb3IocmVzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXBvcnRfY29pX2Vycm9yKGNfYnVmX2NvcHksIHJlcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBjaGFyICpiYXNlID0gb2ZmbG9hZF9nZXRfc3JjX2Jhc2UobV92YXJzW2ldLnB0ciwKKyAgICAgICAgICAgICAgICBtX3ZhcnNbaV0udHlwZS5zcmMpOworCisgICAgICAgICAgICByZXMgPSBDT0k6OkJ1ZmZlcldyaXRlKAorICAgICAgICAgICAgICAgIGRzdF9kYXRhLT5taWNfYnVmLAorICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5taWNfb2Zmc2V0IC0gZHN0X2RhdGEtPmFsbG9jX2Rpc3AgKworICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5vZmZzZXQgKyBvZmZzZXRfZHN0LAorICAgICAgICAgICAgICAgIGJhc2UgKyBvZmZzZXRfc3JjLAorICAgICAgICAgICAgICAgIHNlbmRfc2l6ZSwKKyAgICAgICAgICAgICAgICBDT0lfQ09QWV9VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAwLCAwLAorICAgICAgICAgICAgICAgIGV2ZW50KTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICBpZiAobV9zdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBtX3N0YXR1cy0+cmVzdWx0ID0gdHJhbnNsYXRlX2NvaV9lcnJvcihyZXMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlcG9ydF9jb2lfZXJyb3IoY19idWZfd3JpdGUsIHJlcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZGF0YV9zZW50ICs9IGxlbmd0aF9zcmM7CisgICAgfQorICAgIHdoaWxlICh0cnVlKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBPZmZsb2FkRGVzY3JpcHRvcjo6c2VuZF9wb2ludGVyX2RhdGEoYm9vbCBpc19hc3luYykKK3sKKyAgICBPZmZsb2FkVGltZXIgdGltZXIoZ2V0X3RpbWVyX2RhdGEoKSwgY19vZmZsb2FkX2hvc3Rfc2VuZF9wb2ludGVycyk7CisKKyAgICB1aW50NjRfdCBwdHJfc2VudCA9IDA7CisgICAgQ09JUkVTVUxUIHJlczsKKworICAgIC8vIEluaXRpYXRlIHNlbmQgZm9yIHBvaW50ZXIgZGF0YQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV92YXJzX3RvdGFsOyBpKyspIHsKKyAgICAgICAgc3dpdGNoIChtX3ZhcnNbaV0udHlwZS5kc3QpIHsKKyAgICAgICAgICAgIGNhc2UgY19kYXRhX3B0cl9hcnJheToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgY19kYXRhOgorICAgICAgICAgICAgY2FzZSBjX3ZvaWRfcHRyOgorICAgICAgICAgICAgY2FzZSBjX2NlYW5fdmFyOgorICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZGlyZWN0aW9uLmluICYmCisgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5pc19zdGF0aWNfZHN0bikgeworICAgICAgICAgICAgICAgICAgICBDT0lFVkVOVCAqZXZlbnQgPQorICAgICAgICAgICAgICAgICAgICAgICAgKGlzX2FzeW5jIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUgPj0gX19vZmZsb2FkX3VzZV9hc3luY19idWZmZXJfd3JpdGUpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICZtX2luX2RlcHNbbV9pbl9kZXBzX3RvdGFsKytdIDogMDsKKyAgICAgICAgICAgICAgICAgICAgUHRyRGF0YSogZHN0X2RhdGEgPSBtX3ZhcnNbaV0uaW50byA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5kc3RfZGF0YSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5zcmNfZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgUHRyRGF0YSogc3JjX2RhdGEgPQorICAgICAgICAgICAgICAgICAgICAgICAgVkFSX1RZUEVfSVNfUFRSKG1fdmFyc1tpXS50eXBlLnNyYykgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIFZBUl9UWVBFX0lTX1NDQUxBUihtX3ZhcnNbaV0udHlwZS5zcmMpICYmCisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhdGljID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5zcmNfZGF0YSA6IDA7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5mbGFncy5pc19ub25jb250X3NyYyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLmlzX25vbmNvbnRfZHN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbmRfbm9uY29udGlndW91c19wb2ludGVyX2RhdGEoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIHNyY19kYXRhLCBkc3RfZGF0YSwgZXZlbnQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNyY19kYXRhICE9IDAgJiYgc3JjX2RhdGEtPmNwdV9idWYgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gQ09JOjpCdWZmZXJDb3B5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9kYXRhLT5taWNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19kYXRhLT5jcHVfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5taWNfb2Zmc2V0IC0gZHN0X2RhdGEtPmFsbG9jX2Rpc3AgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5vZmZzZXQgKyBtX3ZhcnNbaV0uZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uY3B1X29mZnNldCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLmNwdV9kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPSV9DT1BZX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3N0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc3RhdHVzLT5yZXN1bHQgPSB0cmFuc2xhdGVfY29pX2Vycm9yKHJlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2NvaV9lcnJvcihjX2J1Zl9jb3B5LCByZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqYmFzZSA9IG9mZmxvYWRfZ2V0X3NyY19iYXNlKG1fdmFyc1tpXS5wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnR5cGUuc3JjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IENPSTo6QnVmZmVyV3JpdGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X2RhdGEtPm1pY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLm1pY19vZmZzZXQgLSBkc3RfZGF0YS0+YWxsb2NfZGlzcCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLm9mZnNldCArIG1fdmFyc1tpXS5kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UgKyBtX3ZhcnNfZXh0cmFbaV0uY3B1X2Rpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JX0NPUFlfVU5TUEVDSUZJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zdGF0dXMtPnJlc3VsdCA9IHRyYW5zbGF0ZV9jb2lfZXJyb3IocmVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfY29pX2Vycm9yKGNfYnVmX3dyaXRlLCByZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHB0cl9zZW50ICs9IG1fdmFyc1tpXS5zaXplOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBjX3N0cmluZ19wdHI6CisgICAgICAgICAgICBjYXNlIGNfZGF0YV9wdHI6CisgICAgICAgICAgICBjYXNlIGNfY2Vhbl92YXJfcHRyOgorICAgICAgICAgICAgY2FzZSBjX2R2X3B0cjoKKyAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5pbiAmJiBtX3ZhcnNbaV0uc2l6ZSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgQ09JRVZFTlQgKmV2ZW50ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChpc19hc3luYyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplID49IF9fb2ZmbG9hZF91c2VfYXN5bmNfYnVmZmVyX3dyaXRlKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAmbV9pbl9kZXBzW21faW5fZGVwc190b3RhbCsrXSA6IDA7CisgICAgICAgICAgICAgICAgICAgIFB0ckRhdGEqIGRzdF9kYXRhID0gbV92YXJzW2ldLmludG8gPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uZHN0X2RhdGEgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uc3JjX2RhdGE7CisgICAgICAgICAgICAgICAgICAgIFB0ckRhdGEqIHNyY19kYXRhID0KKyAgICAgICAgICAgICAgICAgICAgICAgIFZBUl9UWVBFX0lTX1BUUihtX3ZhcnNbaV0udHlwZS5zcmMpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBWQVJfVFlQRV9JU19TQ0FMQVIobV92YXJzW2ldLnR5cGUuc3JjKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLmlzX3N0YXRpYyA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnNyY19kYXRhIDogMDsKKworICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmZsYWdzLmlzX25vbmNvbnRfc3JjIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3MuaXNfbm9uY29udF9kc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRfbm9uY29udGlndW91c19wb2ludGVyX2RhdGEoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgc3JjX2RhdGEsIGRzdF9kYXRhLCBldmVudCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3JjX2RhdGEgIT0gMCAmJiBzcmNfZGF0YS0+Y3B1X2J1ZiAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXMgPSBDT0k6OkJ1ZmZlckNvcHkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X2RhdGEtPm1pY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2RhdGEtPmNwdV9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLm1pY19vZmZzZXQgLSBkc3RfZGF0YS0+YWxsb2NfZGlzcCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLm9mZnNldCArIG1fdmFyc1tpXS5kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5jcHVfb2Zmc2V0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uY3B1X2Rpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JX0NPUFlfVU5TUEVDSUZJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zdGF0dXMtPnJlc3VsdCA9IHRyYW5zbGF0ZV9jb2lfZXJyb3IocmVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfY29pX2Vycm9yKGNfYnVmX2NvcHksIHJlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpiYXNlID0gb2ZmbG9hZF9nZXRfc3JjX2Jhc2UobV92YXJzW2ldLnB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0udHlwZS5zcmMpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gQ09JOjpCdWZmZXJXcml0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfZGF0YS0+bWljX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ubWljX29mZnNldCAtIGRzdF9kYXRhLT5hbGxvY19kaXNwICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ub2Zmc2V0ICsgbV92YXJzW2ldLmRpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSArIG1fdmFyc19leHRyYVtpXS5jcHVfZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0lfQ09QWV9VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9zdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3N0YXR1cy0+cmVzdWx0ID0gdHJhbnNsYXRlX2NvaV9lcnJvcihyZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9jb2lfZXJyb3IoY19idWZfd3JpdGUsIHJlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBwdHJfc2VudCArPSBtX3ZhcnNbaV0uc2l6ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgY19kdl9kYXRhOgorICAgICAgICAgICAgY2FzZSBjX2R2X3B0cl9kYXRhOgorICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZGlyZWN0aW9uLmluICYmCisgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplID4gMCkgeworICAgICAgICAgICAgICAgICAgICBQdHJEYXRhICpwdHJfZGF0YSA9IG1fdmFyc1tpXS5pbnRvID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uZHN0X2RhdGEgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5zcmNfZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgUHRyRGF0YSogc3JjX2RhdGEgPSBtX3ZhcnNfZXh0cmFbaV0uc3JjX2RhdGE7CisKKyAgICAgICAgICAgICAgICAgICAgQ09JRVZFTlQgKmV2ZW50ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChpc19hc3luYyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplID49IF9fb2ZmbG9hZF91c2VfYXN5bmNfYnVmZmVyX3dyaXRlKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAmbV9pbl9kZXBzW21faW5fZGVwc190b3RhbCsrXSA6IDA7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5mbGFncy5pc19ub25jb250X3NyYyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLmlzX25vbmNvbnRfZHN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZW5kX25vbmNvbnRpZ3VvdXNfcG9pbnRlcl9kYXRhKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIHNyY19kYXRhLCBwdHJfZGF0YSwgZXZlbnQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNyY19kYXRhICYmIHNyY19kYXRhLT5jcHVfYnVmICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IENPSTo6QnVmZmVyQ29weSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfZGF0YS0+bWljX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfZGF0YS0+Y3B1X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ub2Zmc2V0ICsgcHRyX2RhdGEtPm1pY19vZmZzZXQgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9kYXRhLT5hbGxvY19kaXNwICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uY3B1X29mZnNldCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLmNwdV9kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPSV9DT1BZX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3N0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc3RhdHVzLT5yZXN1bHQgPSB0cmFuc2xhdGVfY29pX2Vycm9yKHJlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2NvaV9lcnJvcihjX2J1Zl9jb3B5LCByZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqYmFzZSA9IG9mZmxvYWRfZ2V0X3NyY19iYXNlKG1fdmFyc1tpXS5wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnR5cGUuc3JjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IENPSTo6QnVmZmVyV3JpdGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX2RhdGEtPm1pY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX2RhdGEtPm1pY19vZmZzZXQgLSBwdHJfZGF0YS0+YWxsb2NfZGlzcCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLm9mZnNldCArIG1fdmFyc1tpXS5kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UgKyBtX3ZhcnNfZXh0cmFbaV0uY3B1X2Rpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JX0NPUFlfVU5TUEVDSUZJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zdGF0dXMtPnJlc3VsdCA9IHRyYW5zbGF0ZV9jb2lfZXJyb3IocmVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfY29pX2Vycm9yKGNfYnVmX3dyaXRlLCByZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHB0cl9zZW50ICs9IG1fdmFyc1tpXS5zaXplOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBjX2R2X2RhdGFfc2xpY2U6CisgICAgICAgICAgICBjYXNlIGNfZHZfcHRyX2RhdGFfc2xpY2U6CisgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5kaXJlY3Rpb24uaW4gJiYKKyAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIFB0ckRhdGEgKmRzdF9kYXRhID0gbV92YXJzW2ldLmludG8gPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5kc3RfZGF0YSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnNyY19kYXRhOworICAgICAgICAgICAgICAgICAgICBQdHJEYXRhKiBzcmNfZGF0YSA9CisgICAgICAgICAgICAgICAgICAgICAgICAoVkFSX1RZUEVfSVNfUFRSKG1fdmFyc1tpXS50eXBlLnNyYykgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIFZBUl9UWVBFX0lTX0RWX0RBVEEobV92YXJzW2ldLnR5cGUuc3JjKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgVkFSX1RZUEVfSVNfRFZfREFUQV9TTElDRShtX3ZhcnNbaV0udHlwZS5zcmMpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBWQVJfVFlQRV9JU19TQ0FMQVIobV92YXJzW2ldLnR5cGUuc3JjKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLmlzX3N0YXRpYykgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5zcmNfZGF0YSA6IDA7CisgICAgICAgICAgICAgICAgICAgIENPSUVWRU5UICpldmVudCA9CisgICAgICAgICAgICAgICAgICAgICAgICAoaXNfYXN5bmMgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSA+PSBfX29mZmxvYWRfdXNlX2FzeW5jX2J1ZmZlcl93cml0ZSkgPworICAgICAgICAgICAgICAgICAgICAgICAgJm1faW5fZGVwc1ttX2luX2RlcHNfdG90YWwrK10gOiAwOworICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmZsYWdzLmlzX25vbmNvbnRfc3JjIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3MuaXNfbm9uY29udF9kc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRfbm9uY29udGlndW91c19wb2ludGVyX2RhdGEoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgc3JjX2RhdGEsIGRzdF9kYXRhLCBldmVudCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3JjX2RhdGEgJiYgc3JjX2RhdGEtPmNwdV9idWYgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gQ09JOjpCdWZmZXJDb3B5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9kYXRhLT5taWNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19kYXRhLT5jcHVfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5vZmZzZXQgLSBkc3RfZGF0YS0+YWxsb2NfZGlzcCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X2RhdGEtPm1pY19vZmZzZXQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5jcHVfb2Zmc2V0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uY3B1X2Rpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JX0NPUFlfVU5TUEVDSUZJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zdGF0dXMtPnJlc3VsdCA9IHRyYW5zbGF0ZV9jb2lfZXJyb3IocmVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfY29pX2Vycm9yKGNfYnVmX2NvcHksIHJlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpiYXNlID0gb2ZmbG9hZF9nZXRfc3JjX2Jhc2UobV92YXJzW2ldLnB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0udHlwZS5zcmMpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gQ09JOjpCdWZmZXJXcml0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfZGF0YS0+bWljX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfZGF0YS0+bWljX29mZnNldCAtIGRzdF9kYXRhLT5hbGxvY19kaXNwICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ub2Zmc2V0ICsgbV92YXJzW2ldLmRpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSArIG1fdmFyc19leHRyYVtpXS5jcHVfZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0lfQ09QWV9VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9zdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3N0YXR1cy0+cmVzdWx0ID0gdHJhbnNsYXRlX2NvaV9lcnJvcihyZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9jb2lfZXJyb3IoY19idWZfd3JpdGUsIHJlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBwdHJfc2VudCArPSBtX3ZhcnNbaV0uc2l6ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvLyBhbGxvYyBmaWVsZCBpc24ndCB1c2VkIGF0IHRhcmdldC4KKyAgICAgICAgLy8gV2UgY2FuIHJldXNlIGl0IGZvciBvZmZzZXQgb2YgYXJyYXkgcG9pbnRlcnMuCisgICAgICAgIGlmIChtX3ZhcnNfZXh0cmFbaV0uaXNfYXJyX3B0cl9lbCkgeworICAgICAgICAgICAgbV92YXJzW2ldLnB0cl9hcnJfb2Zmc2V0ID0gbV92YXJzX2V4dHJhW2ldLnB0cl9hcnJfb2Zmc2V0OworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1fc3RhdHVzKSB7CisgICAgICAgIG1fc3RhdHVzLT5kYXRhX3NlbnQgKz0gcHRyX3NlbnQ7CisgICAgfQorCisgICAgT0ZGTE9BRF9USU1FUl9IT1NUX1NEQVRBKGdldF90aW1lcl9kYXRhKCksIHB0cl9zZW50KTsKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFXzEoMSwgR0VUX09GRkxPQURfTlVNQkVSKGdldF90aW1lcl9kYXRhKCkpLAorICAgICAgICAgICAgICAgICAgY19vZmZsb2FkX3NlbnRfcG9pbnRlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgIlRvdGFsIHBvaW50ZXIgZGF0YSBzZW50IHRvIHRhcmdldDogWyVsbGRdIGJ5dGVzXG4iLAorICAgICAgICAgICAgICAgICAgcHRyX3NlbnQpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgT2ZmbG9hZERlc2NyaXB0b3I6OmdhdGhlcl9jb3B5aW5fZGF0YSgpCit7CisgICAgT2ZmbG9hZFRpbWVyIHRpbWVyKGdldF90aW1lcl9kYXRhKCksIGNfb2ZmbG9hZF9ob3N0X2dhdGhlcl9pbnB1dHMpOworCisgICAgaWYgKG1fbmVlZF9ydW5mdW5jdGlvbiAmJiBtX2luX2RhdGFsZW4gPiAwKSB7CisgICAgICAgIENPSU1BUElOU1RBTkNFIG1hcF9pbnN0OworICAgICAgICBjaGFyICpkYXRhOworCisgICAgICAgIC8vIGluaXQgbWFyc2hhbGxlcgorICAgICAgICBpZiAobV9pbm91dF9idWYgIT0gMCkgeworICAgICAgICAgICAgT2ZmbG9hZFRpbWVyIHRpbWVyX21hcChnZXRfdGltZXJfZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX29mZmxvYWRfaG9zdF9tYXBfaW5fZGF0YV9idWZmZXIpOworCisgICAgICAgICAgICBDT0lSRVNVTFQgcmVzID0gQ09JOjpCdWZmZXJNYXAobV9pbm91dF9idWYsIDAsIG1faW5fZGF0YWxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0lfTUFQX1dSSVRFX0VOVElSRV9CVUZGRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgJm1hcF9pbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCoqPigmZGF0YSkpOworICAgICAgICAgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgIGlmIChtX3N0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1fc3RhdHVzLT5yZXN1bHQgPSB0cmFuc2xhdGVfY29pX2Vycm9yKHJlcyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVwb3J0X2NvaV9lcnJvcihjX2J1Zl9tYXAsIHJlcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBkYXRhID0gKGNoYXIqKSBtX2Z1bmNfZGVzYyArIG1fZnVuY19kZXNjLT5kYXRhX29mZnNldDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHNlbmQgdmFyaWFibGUgZGVzY3JpcHRvcnMKKyAgICAgICAgbWVtY3B5KGRhdGEsIG1fdmFycywgbV92YXJzX3RvdGFsICogc2l6ZW9mKFZhckRlc2MpKTsKKyAgICAgICAgZGF0YSArPSBtX3ZhcnNfdG90YWwgKiBzaXplb2YoVmFyRGVzYyk7CisKKyAgICAgICAgLy8gaW5pdCBtYXJzaGFsbGVyCisgICAgICAgIG1faW4uaW5pdF9idWZmZXIoZGF0YSwgbV9pbl9kYXRhbGVuKTsKKworICAgICAgICAvLyBHYXRoZXIgY29weSBkYXRhIGludG8gYnVmZmVyCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV92YXJzX3RvdGFsOyBpKyspIHsKKyAgICAgICAgICAgIGJvb2wgc3JjX2lzX2Zvcl9taWMgPSAobV92YXJzW2ldLmRpcmVjdGlvbi5vdXQgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmludG8gPT0gTlVMTCk7CisgICAgICAgICAgICBQdHJEYXRhKiBwdHJfZGF0YSA9IHNyY19pc19mb3JfbWljID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnNyY19kYXRhIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLmRzdF9kYXRhOworICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5mbGFncy5hbGxvY19kaXNwKSB7CisgICAgICAgICAgICAgICAgbV9pbi5zZW5kX2RhdGEoJnB0cl9kYXRhLT5hbGxvY19kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihwdHJfZGF0YS0+YWxsb2NfZGlzcCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBzZW5kIHNpbmsgYWRkcmVzcyB0byB0aGUgdGFyZ2V0CisgICAgICAgICAgICBpZiAobV92YXJzW2ldLmZsYWdzLnNpbmtfYWRkcikgeworICAgICAgICAgICAgICAgIG1faW4uc2VuZF9kYXRhKCZwdHJfZGF0YS0+bWljX2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHB0cl9kYXRhLT5taWNfYWRkcikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKG1fdmFyc1tpXS50eXBlLmRzdCkgeworICAgICAgICAgICAgICAgIGNhc2UgY19kYXRhX3B0cl9hcnJheToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBjX2RhdGE6CisgICAgICAgICAgICAgICAgY2FzZSBjX3ZvaWRfcHRyOgorICAgICAgICAgICAgICAgIGNhc2UgY19jZWFuX3ZhcjoKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5kaXJlY3Rpb24uaW4gJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICFtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhdGljX2RzdG4pIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqcHRyID0gb2ZmbG9hZF9nZXRfc3JjX2Jhc2UobV92YXJzW2ldLnB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS50eXBlLnNyYyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLnR5cGUuZHN0ID09IGNfY2Vhbl92YXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQgYW5kIGxlbmd0aCBhcmUgZGVyaXZlZCBmcm9tIHRoZSBhcnJheQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlc2NyaXB0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHNpemUgPSBtX3ZhcnNbaV0uc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGRpc3AgPSBtX3ZhcnNbaV0uZGlzcDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2luLnNlbmRfZGF0YShyZWludGVycHJldF9jYXN0PGNoYXIqPigmc2l6ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGludDY0X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2luLnNlbmRfZGF0YShyZWludGVycHJldF9jYXN0PGNoYXIqPigmZGlzcCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGludDY0X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgbV9pbi5zZW5kX2RhdGEocHRyICsgbV92YXJzX2V4dHJhW2ldLmNwdV9kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBjX2R2OgorICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5iaXRzIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uYWxsb2NfaWYgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mcmVlX2lmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZW5kIGRvcGUgdmVjdG9yIGV4Y2x1ZGluZyBiYXNlCisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpwdHIgPSBzdGF0aWNfY2FzdDxjaGFyKj4obV92YXJzW2ldLnB0cik7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2luLnNlbmRfZGF0YShwdHIgKyBzaXplb2YodWludDY0X3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUgLSBzaXplb2YodWludDY0X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgY19kYXRhX3B0cjoKKyAgICAgICAgICAgICAgICAgICAgLy8gc2VuZCB0byB0YXJnZXQgYWRkcmVzc2VzIG9mIG9ic29sZXRlCisgICAgICAgICAgICAgICAgICAgIC8vIHN0YWNrcyB0byBiZSByZWxlYXNlZAorICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmZsYWdzLmlzX3N0YWNrX2J1ZiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIW1fdmFyc1tpXS5kaXJlY3Rpb24uYml0cyAmJgorICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmFsbG9jX2lmICYmCisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFB0ckRhdGFMaXN0OjppdGVyYXRvciBpdCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9kZXN0cm95X3N0YWNrLmJlZ2luKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgIT0gbV9kZXN0cm95X3N0YWNrLmVuZCgpOyBpdCsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHRyRGF0YSAqIHB0cl9kYXRhID0gKml0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faW4uc2VuZF9kYXRhKCYocHRyX2RhdGEtPm1pY19hZGRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHB0cl9kYXRhLT5taWNfYWRkcikpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgY19mdW5jX3B0cjoKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5kaXJlY3Rpb24uaW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1faW4uc2VuZF9mdW5jX3B0cigqKChjb25zdCB2b2lkKiopIG1fdmFyc1tpXS5wdHIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKG1fc3RhdHVzKSB7CisgICAgICAgICAgICBtX3N0YXR1cy0+ZGF0YV9zZW50ICs9IG1faW4uZ2V0X3Rmcl9zaXplKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobV9mdW5jX2Rlc2MtPmRhdGFfb2Zmc2V0ID09IDApIHsKKyAgICAgICAgICAgIE9mZmxvYWRUaW1lciB0aW1lcl91bm1hcChnZXRfdGltZXJfZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfb2ZmbG9hZF9ob3N0X3VubWFwX2luX2RhdGFfYnVmZmVyKTsKKyAgICAgICAgICAgIENPSVJFU1VMVCByZXMgPSBDT0k6OkJ1ZmZlclVubWFwKG1hcF9pbnN0LCAwLCAwLCAwKTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICBpZiAobV9zdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBtX3N0YXR1cy0+cmVzdWx0ID0gdHJhbnNsYXRlX2NvaV9lcnJvcihyZXMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlcG9ydF9jb2lfZXJyb3IoY19idWZfdW5tYXAsIHJlcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBPRkZMT0FEX1RJTUVSX0hPU1RfU0RBVEEoZ2V0X3RpbWVyX2RhdGEoKSwgbV9pbi5nZXRfdGZyX3NpemUoKSk7CisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRV8xKDEsCisgICAgICAgICAgICAgICAgICBHRVRfT0ZGTE9BRF9OVU1CRVIoZ2V0X3RpbWVyX2RhdGEoKSksIGNfb2ZmbG9hZF9jb3B5aW5fZGF0YSwKKyAgICAgICAgICAgICAgICAgICJUb3RhbCBjb3B5aW4gZGF0YSBzZW50IHRvIHRhcmdldDogWyVsbGRdIGJ5dGVzXG4iLAorICAgICAgICAgICAgICAgICAgbV9pbi5nZXRfdGZyX3NpemUoKSk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBPZmZsb2FkRGVzY3JpcHRvcjo6Y29tcHV0ZSgpCit7CisgICAgT2ZmbG9hZFRpbWVyIHRpbWVyKGdldF90aW1lcl9kYXRhKCksIGNfb2ZmbG9hZF9ob3N0X3N0YXJ0X2NvbXB1dGUpOworCisgICAgaWYgKG1fbmVlZF9ydW5mdW5jdGlvbikgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFXzEoMiwgR0VUX09GRkxPQURfTlVNQkVSKGdldF90aW1lcl9kYXRhKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY19vZmZsb2FkX2NvbXB1dGUsICJDb21wdXRlIHRhc2sgb24gTUlDXG4iKTsKKworICAgICAgICB2b2lkKiBtaXNjID0gbV9mdW5jX2Rlc2M7CisgICAgICAgIGludCAgIG1pc2NfbGVuID0gbV9mdW5jX2Rlc2Nfc2l6ZTsKKyAgICAgICAgdm9pZCogcmV0ID0gMDsKKyAgICAgICAgaW50ICAgcmV0X2xlbiA9IDA7CisKKyAgICAgICAgaWYgKG1fZnVuY19kZXNjLT5kYXRhX29mZnNldCAhPSAwKSB7CisgICAgICAgICAgICBtaXNjX2xlbiArPSBtX2luX2RhdGFsZW47CisKKyAgICAgICAgICAgIGlmIChtX291dF9kYXRhbGVuID4gMCkgeworICAgICAgICAgICAgICAgIHJldCA9IChjaGFyKikgbV9mdW5jX2Rlc2MgKyBtX2Z1bmNfZGVzYy0+ZGF0YV9vZmZzZXQ7CisgICAgICAgICAgICAgICAgcmV0X2xlbiA9IG1fb3V0X2RhdGFsZW47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBkaXNwYXRjaCB0YXNrCisgICAgICAgIENPSVJFU1VMVCByZXM7CisgICAgICAgIENPSUVWRU5UIGV2ZW50OworICAgICAgICByZXMgPSBtX2RldmljZS5jb21wdXRlKG1fY29tcHV0ZV9idWZmZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pc2MsIG1pc2NfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCwgcmV0X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2luX2RlcHNfdG90YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pbl9kZXBzX3RvdGFsID4gMCA/IG1faW5fZGVwcyA6IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmV2ZW50KTsKKyAgICAgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeworICAgICAgICAgICAgaWYgKG1fc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgICAgICBtX3N0YXR1cy0+cmVzdWx0ID0gdHJhbnNsYXRlX2NvaV9lcnJvcihyZXMpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcG9ydF9jb2lfZXJyb3IoY19waXBlbGluZV9ydW5fZnVuYywgcmVzKTsKKyAgICAgICAgfQorCisgICAgICAgIG1faW5fZGVwc190b3RhbCA9IDE7CisgICAgICAgIG1faW5fZGVwc1swXSA9IGV2ZW50OworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCisvLyByZWNlaXZlIHBvaW50ZXIgZGF0YSBpZiBzb3VyY2Ugb3IgZGVzdGluYXRpb24gb3IgYm90aCBvZiB0aGVtIGFyZQorLy8gbm9uY29udGlndW91cy4gVGhlcmUgaXMgZ3VhcmFudGVlIHRoYXQgbGVuZ3RoIG9mIGRlc3RpbmF0aW9uIGVub3VnaCBmb3IKKy8vIHRyYW5zZmVycmVkIGRhdGEuCitib29sIE9mZmxvYWREZXNjcmlwdG9yOjpyZWNlaXZlX25vbmNvbnRpZ3VvdXNfcG9pbnRlcl9kYXRhKAorICAgIGludCBpLAorICAgIGNoYXIqIGJhc2UsCisgICAgQ09JQlVGRkVSIGRzdF9idWYsCisgICAgQ09JRVZFTlQgKmV2ZW50CispCit7CisgICAgaW50NjRfdCBvZmZzZXRfc3JjLCBvZmZzZXRfZHN0OworICAgIGludDY0X3QgbGVuZ3RoX3NyYywgbGVuZ3RoX2RzdDsKKyAgICBpbnQ2NF90IGxlbmd0aF9zcmNfY3VyLCBsZW5ndGhfZHN0X2N1cjsKKyAgICBpbnQ2NF90IHJlY2VpdmVfc2l6ZSwgZGF0YV9yZWNlaXZlZCA9IDA7CisgICAgQ09JUkVTVUxUIHJlczsKKyAgICBib29sIGRzdF9pc19lbXB0eSA9IHRydWU7CisgICAgYm9vbCBzcmNfaXNfZW1wdHkgPSB0cnVlOworCisgICAgLy8gU2V0IGxlbmd0aF9zcmMgYW5kIGxlbmd0aF9kc3QKKyAgICBsZW5ndGhfc3JjID0gKG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19zcmMpID8KKyAgICAgICAgbV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX3NyYy0+cmFuZ2Vfc2l6ZSA6IG1fdmFyc1tpXS5zaXplOworICAgIGxlbmd0aF9kc3QgPSAhbV92YXJzW2ldLmludG8gPyBsZW5ndGhfc3JjIDoKKyAgICAgICAgICAgICAgICAgICAgIChtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfZHN0KSA/CisgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfZHN0LT5yYW5nZV9zaXplIDogbV92YXJzW2ldLnNpemU7CisgICAgcmVjZWl2ZV9zaXplID0gKGxlbmd0aF9zcmMgPCBsZW5ndGhfZHN0KSA/IGxlbmd0aF9zcmMgOiBsZW5ndGhfZHN0OworCisgICAgLy8gY29uc2VxdWVudGx5IGdldCBjb250aWd1b3VzIHJhbmdlcywKKyAgICAvLyBkZWZpbmUgY29ycmVzcG9uZGVkIGRlc3RpbmF0aW9uIG9mZnNldCBhbmQgcmVjZWl2ZSBkYXRhCisgICAgZG8geworICAgICAgICAvLyBnZXQgc29yY2Ugb2Zmc2V0CisgICAgICAgIGlmIChzcmNfaXNfZW1wdHkpIHsKKyAgICAgICAgICAgIGlmIChtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfc3JjKSB7CisgICAgICAgICAgICAgICAgaWYgKCFnZXRfbmV4dF9yYW5nZShtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXRfc3JjKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBzb3VyY2UgcmFuZ2VzIGFyZSBvdmVyIC0gbm90aGluZyB0byBzZW5kCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGRhdGFfcmVjZWl2ZWQgPT0gMCkgeworICAgICAgICAgICAgICAgIG9mZnNldF9zcmMgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsZW5ndGhfc3JjX2N1ciA9IGxlbmd0aF9zcmM7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvLyBpZiBzb3VyY2UgaXMgY29udGlndW91cyBvciBpdHMgY29udGlndW91cyByYW5nZSBpcyBncmVhdGVyCisgICAgICAgICAgICAvLyB0aGFuIGRlc3RpbmF0aW9uIG9uZQorICAgICAgICAgICAgb2Zmc2V0X3NyYyArPSByZWNlaXZlX3NpemU7CisgICAgICAgIH0KKyAgICAgICAgbGVuZ3RoX3NyY19jdXIgLT0gcmVjZWl2ZV9zaXplOworICAgICAgICBzcmNfaXNfZW1wdHkgPSBsZW5ndGhfc3JjX2N1ciA9PSAwOworCisgICAgICAgIC8vIGdldCBkZXN0aW5hdGlvbiBvZmZzZXQKKyAgICAgICAgaWYgKGRzdF9pc19lbXB0eSkgeworICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5pbnRvKSB7CisgICAgICAgICAgICAgICAgaWYgKG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19kc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFnZXRfbmV4dF9yYW5nZShtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0X2RzdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlc3RpbmF0aW9uIHJhbmdlcyBhcmUgb3ZlcgorICAgICAgICAgICAgICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX2Rlc3RpbmF0aW9uX2lzX292ZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIGRlc3RpbmF0aW9uIGlzIGNvbnRpZ3VvdXMuCisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG9mZnNldF9kc3QgPSBtX3ZhcnNfZXh0cmFbaV0uY3B1X2Rpc3A7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxlbmd0aF9kc3RfY3VyID0gbGVuZ3RoX2RzdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIHNhbWUgYXMgc291cmNlCisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBvZmZzZXRfZHN0ID0gb2Zmc2V0X3NyYzsKKyAgICAgICAgICAgICAgICBsZW5ndGhfZHN0X2N1ciA9IGxlbmd0aF9zcmM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvLyBpZiBkZXN0aW5hdGlvbiBpcyBjb250aWd1b3VzIG9yIGl0cyBjb250aWd1b3VzIHJhbmdlIGlzIGdyZWF0ZXIKKyAgICAgICAgICAgIC8vIHRoYW4gc291cmNlIG9uZQorICAgICAgICAgICAgb2Zmc2V0X2RzdCArPSByZWNlaXZlX3NpemU7CisgICAgICAgIH0KKyAgICAgICAgbGVuZ3RoX2RzdF9jdXIgLT0gcmVjZWl2ZV9zaXplOworICAgICAgICBkc3RfaXNfZW1wdHkgPSBsZW5ndGhfZHN0X2N1ciA9PSAwOworCisgICAgICAgIGlmIChkc3RfYnVmICE9IDApIHsKKyAgICAgICAgICAgIHJlcyA9IENPSTo6QnVmZmVyQ29weSgKKyAgICAgICAgICAgICAgICBkc3RfYnVmLAorICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5zcmNfZGF0YS0+bWljX2J1ZiwKKyAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uY3B1X29mZnNldCArIG9mZnNldF9kc3QsCisgICAgICAgICAgICAgICAgbV92YXJzW2ldLm9mZnNldCArIG9mZnNldF9zcmMgKworICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5taWNfb2Zmc2V0IC0KKyAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uc3JjX2RhdGEtPmFsbG9jX2Rpc3AsCisgICAgICAgICAgICAgICAgcmVjZWl2ZV9zaXplLAorICAgICAgICAgICAgICAgIENPSV9DT1BZX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgIG1faW5fZGVwc190b3RhbCwKKyAgICAgICAgICAgICAgICBtX2luX2RlcHNfdG90YWwgPiAwID8gbV9pbl9kZXBzIDogMCwKKyAgICAgICAgICAgICAgICBldmVudCk7CisgICAgICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgaWYgKG1fc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbV9zdGF0dXMtPnJlc3VsdCA9IHRyYW5zbGF0ZV9jb2lfZXJyb3IocmVzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXBvcnRfY29pX2Vycm9yKGNfYnVmX2NvcHksIHJlcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICByZXMgPSBDT0k6OkJ1ZmZlclJlYWQoCisgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnNyY19kYXRhLT5taWNfYnVmLAorICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5vZmZzZXQgKyBvZmZzZXRfc3JjICsKKyAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ubWljX29mZnNldCAtCisgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnNyY19kYXRhLT5hbGxvY19kaXNwLAorICAgICAgICAgICAgICAgIGJhc2UgKyBvZmZzZXRfZHN0LAorICAgICAgICAgICAgICAgIHJlY2VpdmVfc2l6ZSwKKyAgICAgICAgICAgICAgICBDT0lfQ09QWV9VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICBtX2luX2RlcHNfdG90YWwsCisgICAgICAgICAgICAgICAgbV9pbl9kZXBzX3RvdGFsID4gMCA/IG1faW5fZGVwcyA6IDAsCisgICAgICAgICAgICAgICAgZXZlbnQpOworICAgICAgICAgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgIGlmIChtX3N0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1fc3RhdHVzLT5yZXN1bHQgPSB0cmFuc2xhdGVfY29pX2Vycm9yKHJlcyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVwb3J0X2NvaV9lcnJvcihjX2J1Zl9yZWFkLCByZXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGRhdGFfcmVjZWl2ZWQgKz0gcmVjZWl2ZV9zaXplOworICAgIH0KKyAgICB3aGlsZSAodHJ1ZSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgT2ZmbG9hZERlc2NyaXB0b3I6OnJlY2VpdmVfcG9pbnRlcl9kYXRhKGJvb2wgaXNfYXN5bmMpCit7CisgICAgT2ZmbG9hZFRpbWVyIHRpbWVyKGdldF90aW1lcl9kYXRhKCksIGNfb2ZmbG9hZF9ob3N0X3N0YXJ0X2J1ZmZlcnNfcmVhZHMpOworCisgICAgdWludDY0X3QgcHRyX3JlY2VpdmVkID0gMDsKKyAgICBDT0lSRVNVTFQgcmVzOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX3ZhcnNfdG90YWw7IGkrKykgeworICAgICAgICBzd2l0Y2ggKG1fdmFyc1tpXS50eXBlLnNyYykgeworICAgICAgICAgICAgY2FzZSBjX2RhdGFfcHRyX2FycmF5OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBjX2RhdGE6CisgICAgICAgICAgICBjYXNlIGNfdm9pZF9wdHI6CisgICAgICAgICAgICBjYXNlIGNfY2Vhbl92YXI6CisgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5kaXJlY3Rpb24ub3V0ICYmCisgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5pc19zdGF0aWMpIHsKKyAgICAgICAgICAgICAgICAgICAgQ09JRVZFTlQgKmV2ZW50ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChpc19hc3luYyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgIG1faW5fZGVwc190b3RhbCA+IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSA+PSBfX29mZmxvYWRfdXNlX2FzeW5jX2J1ZmZlcl9yZWFkKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAmbV9vdXRfZGVwc1ttX291dF9kZXBzX3RvdGFsKytdIDogMDsKKyAgICAgICAgICAgICAgICAgICAgUHRyRGF0YSAqcHRyX2RhdGEgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICBDT0lCVUZGRVIgZHN0X2J1ZiA9IE5VTEw7IC8vIGJ1ZmZlciBhdCBob3N0CisgICAgICAgICAgICAgICAgICAgIGNoYXIgKmJhc2U7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKFZBUl9UWVBFX0lTX1BUUihtX3ZhcnNbaV0udHlwZS5kc3QpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwdHJfZGF0YSA9IG1fdmFyc1tpXS5pbnRvID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLmRzdF9kYXRhIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnNyY19kYXRhOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKFZBUl9UWVBFX0lTX1NDQUxBUihtX3ZhcnNbaV0udHlwZS5kc3QpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmZsYWdzLmlzX3N0YXRpY19kc3RuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX2RhdGEgPSBtX3ZhcnNbaV0uaW50byA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uZHN0X2RhdGEgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnNyY19kYXRhOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGRzdF9idWYgPSBwdHJfZGF0YSA/IHB0cl9kYXRhLT5jcHVfYnVmIDogTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRzdF9idWYgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSA9IG9mZmxvYWRfZ2V0X3NyY19iYXNlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5pbnRvID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjaGFyKj4obV92YXJzW2ldLmludG8pIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjaGFyKj4obV92YXJzW2ldLnB0ciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnR5cGUuZHN0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZmxhZ3MuaXNfbm9uY29udF9zcmMgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5pc19ub25jb250X2RzdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZV9ub25jb250aWd1b3VzX3BvaW50ZXJfZGF0YSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBiYXNlLCBkc3RfYnVmLCBldmVudCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZHN0X2J1ZiAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXMgPSBDT0k6OkJ1ZmZlckNvcHkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uc3JjX2RhdGEtPm1pY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLmNwdV9vZmZzZXQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5jcHVfZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ub2Zmc2V0ICsgbV92YXJzW2ldLmRpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JX0NPUFlfVU5TUEVDSUZJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pbl9kZXBzX3RvdGFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faW5fZGVwc190b3RhbCA+IDAgPyBtX2luX2RlcHMgOiAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9zdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3N0YXR1cy0+cmVzdWx0ID0gdHJhbnNsYXRlX2NvaV9lcnJvcihyZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9jb2lfZXJyb3IoY19idWZfY29weSwgcmVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gQ09JOjpCdWZmZXJSZWFkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5zcmNfZGF0YS0+bWljX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ub2Zmc2V0ICsgbV92YXJzW2ldLmRpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSArIG1fdmFyc19leHRyYVtpXS5jcHVfb2Zmc2V0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uY3B1X2Rpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JX0NPUFlfVU5TUEVDSUZJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pbl9kZXBzX3RvdGFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faW5fZGVwc190b3RhbCA+IDAgPyBtX2luX2RlcHMgOiAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9zdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3N0YXR1cy0+cmVzdWx0ID0gdHJhbnNsYXRlX2NvaV9lcnJvcihyZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9jb2lfZXJyb3IoY19idWZfcmVhZCwgcmVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwdHJfcmVjZWl2ZWQgKz0gbV92YXJzW2ldLnNpemU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIGNfc3RyaW5nX3B0cjoKKyAgICAgICAgICAgIGNhc2UgY19kYXRhX3B0cjoKKyAgICAgICAgICAgIGNhc2UgY19jZWFuX3Zhcl9wdHI6CisgICAgICAgICAgICBjYXNlIGNfZHZfZGF0YToKKyAgICAgICAgICAgIGNhc2UgY19kdl9wdHJfZGF0YToKKyAgICAgICAgICAgIGNhc2UgY19kdl9kYXRhX3NsaWNlOgorICAgICAgICAgICAgY2FzZSBjX2R2X3B0cl9kYXRhX3NsaWNlOgorICAgICAgICAgICAgY2FzZSBjX2R2X3B0cjogeworICAgICAgICAgICAgICAgIENPSUJVRkZFUiBkc3RfYnVmID0gTlVMTDsgLy8gYnVmZmVyIG9uIGhvc3QKKyAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5vdXQgJiYgbV92YXJzW2ldLnNpemUgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIENPSUVWRU5UICpldmVudCA9CisgICAgICAgICAgICAgICAgICAgICAgICAoaXNfYXN5bmMgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtX2luX2RlcHNfdG90YWwgPiAwIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUgPj0gX19vZmZsb2FkX3VzZV9hc3luY19idWZmZXJfcmVhZCkgPworICAgICAgICAgICAgICAgICAgICAgICAgJm1fb3V0X2RlcHNbbV9vdXRfZGVwc190b3RhbCsrXSA6IDA7CisKKyAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgZHN0X29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgKmJhc2UgPSBzdGF0aWNfY2FzdDxjaGFyKj4obV92YXJzW2ldLnB0cik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKFZBUl9UWVBFX0lTX1BUUihtX3ZhcnNbaV0udHlwZS5kc3QpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBQdHJEYXRhICpwdHJfZGF0YSA9IG1fdmFyc1tpXS5pbnRvID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLmRzdF9kYXRhIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnNyY19kYXRhOworICAgICAgICAgICAgICAgICAgICAgICAgZHN0X2J1ZiA9IHB0cl9kYXRhID8gcHRyX2RhdGEtPmNwdV9idWYgOiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRzdF9idWYgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UgPSBtX3ZhcnNbaV0uaW50byA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzdGF0aWNfY2FzdDxjaGFyKio+KG1fdmFyc1tpXS5pbnRvKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzdGF0aWNfY2FzdDxjaGFyKio+KG1fdmFyc1tpXS5wdHIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZHN0X29mZnNldCA9IG1fdmFyc19leHRyYVtpXS5jcHVfb2Zmc2V0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uY3B1X2Rpc3A7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoVkFSX1RZUEVfSVNfU0NBTEFSKG1fdmFyc1tpXS50eXBlLmRzdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhdGljX2RzdG4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfYnVmID0gbV92YXJzW2ldLmludG8gPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5kc3RfZGF0YS0+Y3B1X2J1ZiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnNyY19kYXRhLT5jcHVfYnVmOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRzdF9idWYgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UgPSBvZmZsb2FkX2dldF9zcmNfYmFzZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmludG8gPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjaGFyKj4obV92YXJzW2ldLmludG8pIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y2hhcio+KG1fdmFyc1tpXS5wdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0udHlwZS5kc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZHN0X29mZnNldCA9IG1fdmFyc19leHRyYVtpXS5jcHVfb2Zmc2V0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uY3B1X2Rpc3A7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoVkFSX1RZUEVfSVNfRFZfREFUQShtX3ZhcnNbaV0udHlwZS5kc3QpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBUl9UWVBFX0lTX0RWX0RBVEFfU0xJQ0UobV92YXJzW2ldLnR5cGUuZHN0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgUHRyRGF0YSAqcHRyX2RhdGEgPSBtX3ZhcnNbaV0uaW50byAhPSAwID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLmRzdF9kYXRhIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnNyY19kYXRhOworICAgICAgICAgICAgICAgICAgICAgICAgZHN0X2J1ZiA9IHB0cl9kYXRhICE9IDAgPyBwdHJfZGF0YS0+Y3B1X2J1ZiA6IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHN0X2J1ZiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSA9IG9mZmxvYWRfZ2V0X3NyY19iYXNlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uaW50byA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNoYXIqPihtX3ZhcnNbaV0uaW50bykgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjaGFyKj4obV92YXJzW2ldLnB0ciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS50eXBlLmRzdCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9vZmZzZXQgPSBtX3ZhcnNfZXh0cmFbaV0uY3B1X29mZnNldCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLmNwdV9kaXNwOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5mbGFncy5pc19ub25jb250X3NyYyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLmlzX25vbmNvbnRfZHN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlX25vbmNvbnRpZ3VvdXNfcG9pbnRlcl9kYXRhKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIGJhc2UsIGRzdF9idWYsIGV2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChkc3RfYnVmICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IENPSTo6QnVmZmVyQ29weSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5zcmNfZGF0YS0+bWljX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3Rfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5vZmZzZXQgKyBtX3ZhcnNbaV0uZGlzcCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5taWNfb2Zmc2V0IC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnNyY19kYXRhLT5hbGxvY19kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPSV9DT1BZX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faW5fZGVwc190b3RhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2luX2RlcHNfdG90YWwgPiAwID8gbV9pbl9kZXBzIDogMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zdGF0dXMtPnJlc3VsdCA9IHRyYW5zbGF0ZV9jb2lfZXJyb3IocmVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfY29pX2Vycm9yKGNfYnVmX2NvcHksIHJlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXMgPSBDT0k6OkJ1ZmZlclJlYWQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnNyY19kYXRhLT5taWNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5vZmZzZXQgKyBtX3ZhcnNbaV0uZGlzcCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5taWNfb2Zmc2V0IC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnNyY19kYXRhLT5hbGxvY19kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UgKyBkc3Rfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPSV9DT1BZX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faW5fZGVwc190b3RhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2luX2RlcHNfdG90YWwgPiAwID8gbV9pbl9kZXBzIDogMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zdGF0dXMtPnJlc3VsdCA9IHRyYW5zbGF0ZV9jb2lfZXJyb3IocmVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfY29pX2Vycm9yKGNfYnVmX3JlYWQsIHJlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHRyX3JlY2VpdmVkICs9IG1fdmFyc1tpXS5zaXplOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGRlc3Ryb3kgYnVmZmVycyBmb3Igb2Jzb2xldGUgc3RhY2tzCisgICAgICAgIGlmIChtX2Rlc3Ryb3lfc3RhY2suc2l6ZSgpICE9IDApIHsKKyAgICAgICAgICAgIGZvciAoUHRyRGF0YUxpc3Q6Oml0ZXJhdG9yIGl0ID0gbV9kZXN0cm95X3N0YWNrLmJlZ2luKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gbV9kZXN0cm95X3N0YWNrLmVuZCgpOyBpdCsrKSB7CisgICAgICAgICAgICAgICAgUHRyRGF0YSAqcHRyX2RhdGEgPSAqaXQ7CisgICAgICAgICAgICAgICAgbV9kZXN0cm95X2J1ZmZlcnMucHVzaF9iYWNrKHB0cl9kYXRhLT5taWNfYnVmKTsKKyAgICAgICAgICAgICAgICBPRkZMT0FEX1RSQUNFKDMsICJSZW1vdmluZyBzdGFjayBidWZmZXIgd2l0aCBhZGRyICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9kYXRhLT5taWNfYWRkcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtX2Rlc3Ryb3lfc3RhY2suY2xlYXIoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobV92YXJzW2ldLmZyZWVfaWYpIHsKKyAgICAgICAgICAgIC8vIHJlbW92ZSBhc3NvY2lhdGlvbiBmb3IgYXV0b21hdGljIHZhcmlhYmxlcworICAgICAgICAgICAgaWYgKG1faXNfb3Blbm1wICYmICFtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhdGljICYmCisgICAgICAgICAgICAgICAgKG1fdmFyc1tpXS50eXBlLnNyYyA9PSBjX2RhdGEgfHwKKyAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnR5cGUuc3JjID09IGNfdm9pZF9wdHIgfHwKKyAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnR5cGUuc3JjID09IGNfY2Vhbl92YXIpKSB7CisgICAgICAgICAgICAgICAgQXV0b0RhdGEgKmF1dG9fZGF0YSA9IG1fdmFyc19leHRyYVtpXS5hdXRvX2RhdGE7CisgICAgICAgICAgICAgICAgaWYgKGF1dG9fZGF0YSAhPSAwICYmIGF1dG9fZGF0YS0+cmVtb3ZlX3JlZmVyZW5jZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbV9kZXZpY2UucmVtb3ZlX2F1dG9fZGF0YShhdXRvX2RhdGEtPmNwdV9hZGRyLnN0YXJ0KCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gZGVzdHJveSBidWZmZXJzCisgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5vdXQgfHwgbV92YXJzW2ldLmludG8gPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGlmICghVkFSX1RZUEVfSVNfUFRSKG1fdmFyc1tpXS50eXBlLnNyYykgJiYKKyAgICAgICAgICAgICAgICAgICAgIVZBUl9UWVBFX0lTX0RWX0RBVEFfU0xJQ0UobV92YXJzW2ldLnR5cGUuc3JjKSAmJgorICAgICAgICAgICAgICAgICAgICAhVkFSX1RZUEVfSVNfRFZfREFUQShtX3ZhcnNbaV0udHlwZS5zcmMpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIFB0ckRhdGEgKnB0cl9kYXRhID0gbV92YXJzX2V4dHJhW2ldLnNyY19kYXRhOworICAgICAgICAgICAgICAgIGlmIChwdHJfZGF0YS0+cmVtb3ZlX3JlZmVyZW5jZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZGVzdHJveSBidWZmZXJzCisgICAgICAgICAgICAgICAgICAgIGlmIChwdHJfZGF0YS0+Y3B1X2J1ZiAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2Rlc3Ryb3lfYnVmZmVycy5wdXNoX2JhY2socHRyX2RhdGEtPmNwdV9idWYpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChwdHJfZGF0YS0+bWljX2J1ZiAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2Rlc3Ryb3lfYnVmZmVycy5wdXNoX2JhY2socHRyX2RhdGEtPm1pY19idWYpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIE9GRkxPQURfVFJBQ0UoMywgIlJlbW92aW5nIGFzc29jaWF0aW9uIGZvciBhZGRyICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9kYXRhLT5jcHVfYWRkci5zdGFydCgpKTsKKworICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgYXNzb2NpYXRpb24gZnJvbSBtYXAKKyAgICAgICAgICAgICAgICAgICAgbV9kZXZpY2UucmVtb3ZlX3B0cl9kYXRhKHB0cl9kYXRhLT5jcHVfYWRkci5zdGFydCgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChWQVJfVFlQRV9JU19QVFIobV92YXJzW2ldLnR5cGUuZHN0KSB8fAorICAgICAgICAgICAgICAgICAgICAgVkFSX1RZUEVfSVNfRFZfREFUQV9TTElDRShtX3ZhcnNbaV0udHlwZS5kc3QpIHx8CisgICAgICAgICAgICAgICAgICAgICBWQVJfVFlQRV9JU19EVl9EQVRBKG1fdmFyc1tpXS50eXBlLmRzdCkpIHsKKyAgICAgICAgICAgICAgICBQdHJEYXRhICpwdHJfZGF0YSA9IG1fdmFyc19leHRyYVtpXS5kc3RfZGF0YTsKKyAgICAgICAgICAgICAgICBpZiAocHRyX2RhdGEtPnJlbW92ZV9yZWZlcmVuY2UoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGRlc3Ryb3kgYnVmZmVycworICAgICAgICAgICAgICAgICAgICBpZiAocHRyX2RhdGEtPmNwdV9idWYgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbV9kZXN0cm95X2J1ZmZlcnMucHVzaF9iYWNrKHB0cl9kYXRhLT5jcHVfYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAocHRyX2RhdGEtPm1pY19idWYgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbV9kZXN0cm95X2J1ZmZlcnMucHVzaF9iYWNrKHB0cl9kYXRhLT5taWNfYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBPRkZMT0FEX1RSQUNFKDMsICJSZW1vdmluZyBhc3NvY2lhdGlvbiBmb3IgYWRkciAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfZGF0YS0+Y3B1X2FkZHIuc3RhcnQoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGFzc29jaWF0aW9uIGZyb20gbWFwCisgICAgICAgICAgICAgICAgICAgIG1fZGV2aWNlLnJlbW92ZV9wdHJfZGF0YShwdHJfZGF0YS0+Y3B1X2FkZHIuc3RhcnQoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1fc3RhdHVzKSB7CisgICAgICAgIG1fc3RhdHVzLT5kYXRhX3JlY2VpdmVkICs9IHB0cl9yZWNlaXZlZDsKKyAgICB9CisKKyAgICBPRkZMT0FEX1RJTUVSX0hPU1RfUkRBVEEoZ2V0X3RpbWVyX2RhdGEoKSwgcHRyX3JlY2VpdmVkKTsKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFXzEoMSwgR0VUX09GRkxPQURfTlVNQkVSKGdldF90aW1lcl9kYXRhKCkpLAorICAgICAgICAgICAgICAgICAgY19vZmZsb2FkX3JlY2VpdmVkX3BvaW50ZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICJUb3RhbCBwb2ludGVyIGRhdGEgcmVjZWl2ZWQgZnJvbSB0YXJnZXQ6IFslbGxkXSBieXRlc1xuIiwKKyAgICAgICAgICAgICAgICAgIHB0cl9yZWNlaXZlZCk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBPZmZsb2FkRGVzY3JpcHRvcjo6c2NhdHRlcl9jb3B5b3V0X2RhdGEoKQoreworICAgIE9mZmxvYWRUaW1lciB0aW1lcihnZXRfdGltZXJfZGF0YSgpLCBjX29mZmxvYWRfaG9zdF9zY2F0dGVyX291dHB1dHMpOworCisgICAgaWYgKG1fbmVlZF9ydW5mdW5jdGlvbiAmJiBtX291dF9kYXRhbGVuID4gMCkgeworCisgICAgICAgIC8vIHRvdGFsIHNpemUgdGhhdCBuZWVkIHRvIGJlIHRyYW5zZmVycmVkIGZyb20gdGFyZ2V0IHRvIGhvc3QKKyAgICAgICAgQ09JTUFQSU5TVEFOQ0UgbWFwX2luc3Q7CisgICAgICAgIENPSVJFU1VMVCByZXM7CisgICAgICAgIGNoYXIgKmRhdGE7CisKKyAgICAgICAgLy8gb3V0cHV0IGRhdGEgYnVmZmVyCisgICAgICAgIGlmIChtX2Z1bmNfZGVzYy0+ZGF0YV9vZmZzZXQgPT0gMCkgeworICAgICAgICAgICAgT2ZmbG9hZFRpbWVyIHRpbWVyX21hcChnZXRfdGltZXJfZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX29mZmxvYWRfaG9zdF9tYXBfb3V0X2RhdGFfYnVmZmVyKTsKKworICAgICAgICAgICAgQ09JUkVTVUxUIHJlcyA9IENPSTo6QnVmZmVyTWFwKG1faW5vdXRfYnVmLCAwLCBtX291dF9kYXRhbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPSV9NQVBfUkVBRF9PTkxZLCAwLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXBfaW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx2b2lkKio+KCZkYXRhKSk7CisgICAgICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgaWYgKG1fc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbV9zdGF0dXMtPnJlc3VsdCA9IHRyYW5zbGF0ZV9jb2lfZXJyb3IocmVzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXBvcnRfY29pX2Vycm9yKGNfYnVmX21hcCwgcmVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGRhdGEgPSAoY2hhciopIG1fZnVuY19kZXNjICsgbV9mdW5jX2Rlc2MtPmRhdGFfb2Zmc2V0OworICAgICAgICB9CisKKyAgICAgICAgLy8gZ2V0IHRpbWluZyBkYXRhCisgICAgICAgIE9GRkxPQURfVElNRVJfVEFSR0VUX0RBVEEoZ2V0X3RpbWVyX2RhdGEoKSwgZGF0YSk7CisgICAgICAgIGRhdGEgKz0gT0ZGTE9BRF9USU1FUl9EQVRBTEVOKCk7CisKKyAgICAgICAgLy8gaW5pdGlhbGl6ZSBvdXRwdXQgbWFyc2hhbGxlcgorICAgICAgICBtX291dC5pbml0X2J1ZmZlcihkYXRhLCBtX291dF9kYXRhbGVuKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fdmFyc190b3RhbDsgaSsrKSB7CisgICAgICAgICAgICBzd2l0Y2ggKG1fdmFyc1tpXS50eXBlLnNyYykgeworICAgICAgICAgICAgICAgIGNhc2UgY19kYXRhX3B0cl9hcnJheToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBjX2RhdGE6CisgICAgICAgICAgICAgICAgY2FzZSBjX3ZvaWRfcHRyOgorICAgICAgICAgICAgICAgIGNhc2UgY19jZWFuX3ZhcjoKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5kaXJlY3Rpb24ub3V0ICYmCisgICAgICAgICAgICAgICAgICAgICAgICAhbV92YXJzW2ldLmZsYWdzLmlzX3N0YXRpYykgeworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmludG8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpwdHIgPSBvZmZsb2FkX2dldF9zcmNfYmFzZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y2hhcio+KG1fdmFyc1tpXS5pbnRvKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnR5cGUuZHN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX291dC5yZWNlaXZlX2RhdGEocHRyICsgbV92YXJzX2V4dHJhW2ldLmNwdV9kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX291dC5yZWNlaXZlX2RhdGEoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNoYXIqPihtX3ZhcnNbaV0ucHRyKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uY3B1X2Rpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgY19mdW5jX3B0cjoKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5kaXJlY3Rpb24ub3V0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX291dC5yZWNlaXZlX2Z1bmNfcHRyKChjb25zdCB2b2lkKiopIG1fdmFyc1tpXS5wdHIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAobV9zdGF0dXMpIHsKKyAgICAgICAgICAgIG1fc3RhdHVzLT5kYXRhX3JlY2VpdmVkICs9IG1fb3V0LmdldF90ZnJfc2l6ZSgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1fZnVuY19kZXNjLT5kYXRhX29mZnNldCA9PSAwKSB7CisgICAgICAgICAgICBPZmZsb2FkVGltZXIgdGltZXJfdW5tYXAoZ2V0X3RpbWVyX2RhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX29mZmxvYWRfaG9zdF91bm1hcF9vdXRfZGF0YV9idWZmZXIpOworCisgICAgICAgICAgICBDT0lSRVNVTFQgcmVzID0gQ09JOjpCdWZmZXJVbm1hcChtYXBfaW5zdCwgMCwgMCwgMCk7CisgICAgICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgaWYgKG1fc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbV9zdGF0dXMtPnJlc3VsdCA9IHRyYW5zbGF0ZV9jb2lfZXJyb3IocmVzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXBvcnRfY29pX2Vycm9yKGNfYnVmX3VubWFwLCByZXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgT0ZGTE9BRF9USU1FUl9IT1NUX1JEQVRBKGdldF90aW1lcl9kYXRhKCksIG1fb3V0LmdldF90ZnJfc2l6ZSgpKTsKKyAgICBPRkZMT0FEX1RSQUNFKDEsICJUb3RhbCBjb3B5b3V0IGRhdGEgcmVjZWl2ZWQgZnJvbSB0YXJnZXQ6IFslbGxkXSBieXRlc1xuIiwKKyAgICAgICAgICAgICAgICAgIG1fb3V0LmdldF90ZnJfc2l6ZSgpKTsKKworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIGdldF9hcnJfZGVzY19udW1iZXJzKAorICAgIGNvbnN0IGFycl9kZXNjICphcCwKKyAgICBpbnQ2NF90IGVsX3NpemUsCisgICAgaW50NjRfdCAmb2Zmc2V0LAorICAgIGludDY0X3QgJnNpemUsCisgICAgaW50ICAgICAmZWxfbnVtYmVyLAorICAgIENlYW5SZWFkUmFuZ2VzKiAmcHRyX3JhbmdlcworKQoreworICAgIGlmIChpc19hcnJfZGVzY19jb250aWd1b3VzKGFwKSkgeworICAgICAgICBwdHJfcmFuZ2VzID0gTlVMTDsKKyAgICAgICAgX19hcnJfZGF0YV9vZmZzZXRfYW5kX2xlbmd0aChhcCwgb2Zmc2V0LCBzaXplKTsKKyAgICAgICAgZWxfbnVtYmVyID0gc2l6ZSAvIGVsX3NpemU7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBwdHJfcmFuZ2VzID0gaW5pdF9yZWFkX3Jhbmdlc19hcnJfZGVzYyhhcCk7CisgICAgICAgIGVsX251bWJlciA9IChwdHJfcmFuZ2VzLT5yYW5nZV9zaXplIC8gZWxfc2l6ZSkgKgorICAgICAgICAgICAgICAgICAgICBwdHJfcmFuZ2VzLT5yYW5nZV9tYXhfbnVtYmVyOworICAgICAgICBzaXplID0gcHRyX3Jhbmdlcy0+cmFuZ2Vfc2l6ZTsKKyAgICB9Cit9CisKK2Fycl9kZXNjICogbWFrZV9hcnJfZGVzYygKKyAgICB2b2lkKiAgIHB0cl92YWwsCisgICAgaW50NjRfdCBleHRlbnRfc3RhcnRfdmFsLAorICAgIGludDY0X3QgZXh0ZW50X2VsZW1lbnRzX3ZhbCwKKyAgICBpbnQ2NF90IHNpemUKKykKK3sKKyAgICBhcnJfZGVzYyAqcmVzOworICAgIHJlcyA9IChhcnJfZGVzYyAqKW1hbGxvYyhzaXplb2YoYXJyX2Rlc2MpKTsKKyAgICByZXMtPmJhc2UgPSByZWludGVycHJldF9jYXN0PGludDY0X3Q+KHB0cl92YWwpOworICAgIHJlcy0+cmFuayA9IDE7CisgICAgcmVzLT5kaW1bMF0uc2l6ZSA9IHNpemU7CisgICAgcmVzLT5kaW1bMF0ubGluZGV4ID0gMDsKKyAgICByZXMtPmRpbVswXS5sb3dlciA9IGV4dGVudF9zdGFydF92YWw7CisgICAgcmVzLT5kaW1bMF0udXBwZXIgPSBleHRlbnRfZWxlbWVudHNfdmFsICsgZXh0ZW50X3N0YXJ0X3ZhbCAtIDE7CisgICAgcmVzLT5kaW1bMF0uc3RyaWRlID0gMTsKKyAgICByZXR1cm4gcmVzOworfQorCitib29sIE9mZmxvYWREZXNjcmlwdG9yOjpnZW5fdmFyX2Rlc2NzX2Zvcl9wb2ludGVyX2FycmF5KGludCBpKQoreworICAgIGludCAgICAgICAgICAgICBwb2ludGVyc19udW1iZXI7CisgICAgaW50ICAgICAgICAgICAgIHRtcF92YWw7CisgICAgaW50ICAgICAgICAgICAgIG5ld19pbmRleCA9IG1fdmFyc190b3RhbDsKKyAgICBjb25zdCBhcnJfZGVzYyAqYXA7CisgICAgY29uc3QgVmFyRGVzYzMgKnZkMyA9IHN0YXRpY19jYXN0PGNvbnN0IFZhckRlc2MzKj4obV92YXJzW2ldLnB0cik7CisgICAgaW50ICAgICAgICAgICAgIGZsYWdzID0gdmQzLT5hcnJheV9maWVsZHM7CisgICAgYm9vbCAgICAgICAgICAgIHNyY19pc19mb3JfbWljID0gKG1fdmFyc1tpXS5kaXJlY3Rpb24ub3V0IHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5pbnRvID09IE5VTEwpOworCisgICAgUmVhZEFyckVsZW1lbnRzPHZvaWQgKj4gIHB0cjsKKyAgICBSZWFkQXJyRWxlbWVudHM8dm9pZCAqPiAgaW50bzsKKyAgICBSZWFkQXJyRWxlbWVudHM8aW50NjRfdD4gZXh0X3N0YXJ0OworICAgIFJlYWRBcnJFbGVtZW50czxpbnQ2NF90PiBleHRfZWxlbWVudHM7CisgICAgUmVhZEFyckVsZW1lbnRzPGludDY0X3Q+IGFsaWduOworICAgIFJlYWRBcnJFbGVtZW50czxpbnQ2NF90PiBhbGxvY19pZjsKKyAgICBSZWFkQXJyRWxlbWVudHM8aW50NjRfdD4gZnJlZV9pZjsKKyAgICBSZWFkQXJyRWxlbWVudHM8aW50NjRfdD4gaW50b19zdGFydDsKKyAgICBSZWFkQXJyRWxlbWVudHM8aW50NjRfdD4gaW50b19lbGVtOworICAgIFJlYWRBcnJFbGVtZW50czxpbnQ2NF90PiBhbGxvY19zdGFydDsKKyAgICBSZWFkQXJyRWxlbWVudHM8aW50NjRfdD4gYWxsb2NfZWxlbTsKKworCisgICAgYXAgPSBzdGF0aWNfY2FzdDxjb25zdCBhcnJfZGVzYyo+KHZkMy0+cHRyX2FycmF5KTsKKworICAgIC8vICJwb2ludGVyc19udW1iZXIiIGZvciB0b3RhbCBudW1iZXIgb2YgdHJhbnNmZXJyZWQgcG9pbnRlcnMuCisgICAgLy8gRm9yIGVhY2ggb2YgdGhlbSB3ZSBjcmVhdGUgbmV3IHZhcl9kZXNjIGFuZCBwdXQgaXQgYXQgdGhlIGJvdHRvbQorICAgIC8vIG9mIHRoZSB2YXJfZGVzYydzIGFycmF5CisgICAgZ2V0X2Fycl9kZXNjX251bWJlcnMoYXAsIHNpemVvZih2b2lkICopLCBwdHIub2Zmc2V0LCBwdHIuc2l6ZSwKKyAgICAgICAgcG9pbnRlcnNfbnVtYmVyLCBwdHIucmFuZ2VzKTsKKyAgICBwdHIuYmFzZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGFwLT5iYXNlKTsKKworICAgIC8vIDIuIHByZXBhcmUgbWVtb3J5IGZvciBuZXcgdmFyX2Rlc2NzCisgICAgbV92YXJzX3RvdGFsICs9IHBvaW50ZXJzX251bWJlcjsKKyAgICBtX3ZhcnMgICAgICAgPSAoVmFyRGVzYyopcmVhbGxvYyhtX3ZhcnMsIG1fdmFyc190b3RhbCAqIHNpemVvZihWYXJEZXNjKSk7CisgICAgbV92YXJzX2V4dHJhID0KKyAgICAgICAgKFZhckV4dHJhKilyZWFsbG9jKG1fdmFyc19leHRyYSwgbV92YXJzX3RvdGFsICogc2l6ZW9mKFZhckV4dHJhKSk7CisgICAgbV9pbl9kZXBzICAgID0KKyAgICAgICAgKENPSUVWRU5UKilyZWFsbG9jKG1faW5fZGVwcywgc2l6ZW9mKENPSUVWRU5UKSAqIChtX3ZhcnNfdG90YWwgKyAxKSk7CisgICAgbV9vdXRfZGVwcyAgID0KKyAgICAgICAgKENPSUVWRU5UKilyZWFsbG9jKG1fb3V0X2RlcHMsIHNpemVvZihDT0lFVkVOVCkgKiBtX3ZhcnNfdG90YWwpOworCisgICAgLy8gMy4gUHJlcGFyZSBmb3IgcmVhZGluZyBuZXcgdmFyX2Rlc2MncyBmaWVsZHMKKyAgICAvLyAgICBFWFRFTlQgU1RBUlQKKyAgICBpZiAoKGZsYWdzICYgKDE8PGZsYWdfZXh0ZW50X3N0YXJ0X2lzX2FycmF5KSkgIT0gMCkgeworICAgICAgICBhcCA9IHN0YXRpY19jYXN0PGNvbnN0IGFycl9kZXNjKj4odmQzLT5leHRlbnRfc3RhcnQpOworICAgICAgICBnZXRfYXJyX2Rlc2NfbnVtYmVycyhhcCwgYXAtPmRpbVthcC0+cmFuayAtIDFdLnNpemUsIGV4dF9zdGFydC5vZmZzZXQsCisgICAgICAgICAgICBleHRfc3RhcnQuc2l6ZSwgdG1wX3ZhbCwgZXh0X3N0YXJ0LnJhbmdlcyk7CisgICAgICAgIGV4dF9zdGFydC5iYXNlID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oYXAtPmJhc2UpOworICAgICAgICBleHRfc3RhcnQuZWxfc2l6ZSA9IGFwLT5kaW1bYXAtPnJhbmsgLSAxXS5zaXplOworCisgICAgICAgIGlmICh0bXBfdmFsIDwgcG9pbnRlcnNfbnVtYmVyKSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfcG9pbnRlcl9hcnJheV9taXNtYXRjaCwgImV4dGVudCBzdGFydCIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKChmbGFncyAmICgxPDxmbGFnX2V4dGVudF9zdGFydF9pc19zY2FsYXIpKSAhPSAwKSB7CisgICAgICAgIGV4dF9zdGFydC52YWwgPSAoaW50NjRfdCl2ZDMtPmV4dGVudF9zdGFydDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGV4dF9zdGFydC52YWwgPSAwOworICAgIH0KKworICAgIC8vICAgIEVYVEVOVCBFTEVNRU5UUyBOVU1CRVIKKyAgICBpZiAoKGZsYWdzICYgKDE8PGZsYWdfZXh0ZW50X2VsZW1lbnRzX2lzX2FycmF5KSkgIT0gMCkgeworICAgICAgICBhcCA9IHN0YXRpY19jYXN0PGNvbnN0IGFycl9kZXNjKj4odmQzLT5leHRlbnRfZWxlbWVudHMpOworICAgICAgICBnZXRfYXJyX2Rlc2NfbnVtYmVycyhhcCwgYXAtPmRpbVthcC0+cmFuayAtIDFdLnNpemUsCisgICAgICAgICAgICBleHRfZWxlbWVudHMub2Zmc2V0LCBleHRfZWxlbWVudHMuc2l6ZSwKKyAgICAgICAgICAgIHRtcF92YWwsIGV4dF9lbGVtZW50cy5yYW5nZXMpOworICAgICAgICBleHRfZWxlbWVudHMuYmFzZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGFwLT5iYXNlKTsKKyAgICAgICAgZXh0X2VsZW1lbnRzLmVsX3NpemUgPSBhcC0+ZGltW2FwLT5yYW5rIC0gMV0uc2l6ZTsKKworICAgICAgICBpZiAodG1wX3ZhbCA8IHBvaW50ZXJzX251bWJlcikgeworICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3BvaW50ZXJfYXJyYXlfbWlzbWF0Y2gsICJleHRlbnQgZWxlbWVudHMiKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICgoZmxhZ3MgJiAoMTw8ZmxhZ19leHRlbnRfZWxlbWVudHNfaXNfc2NhbGFyKSkgIT0gMCkgeworICAgICAgICBleHRfZWxlbWVudHMudmFsID0gKGludDY0X3QpdmQzLT5leHRlbnRfZWxlbWVudHM7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBleHRfZWxlbWVudHMudmFsID0gbV92YXJzW2ldLmNvdW50OworICAgIH0KKworICAgIC8vICAgIEFMTE9DX0lGCisgICAgaWYgKChmbGFncyAmICgxPDxmbGFnX2FsbG9jX2lmX2lzX2FycmF5KSkgIT0gMCkgeworICAgICAgICBhcCA9IHN0YXRpY19jYXN0PGNvbnN0IGFycl9kZXNjKj4odmQzLT5hbGxvY19pZl9hcnJheSk7CisgICAgICAgIGdldF9hcnJfZGVzY19udW1iZXJzKGFwLCBhcC0+ZGltW2FwLT5yYW5rIC0gMV0uc2l6ZSwgYWxsb2NfaWYub2Zmc2V0LAorICAgICAgICAgICAgYWxsb2NfaWYuc2l6ZSwgdG1wX3ZhbCwgYWxsb2NfaWYucmFuZ2VzKTsKKyAgICAgICAgYWxsb2NfaWYuYmFzZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGFwLT5iYXNlKTsKKyAgICAgICAgYWxsb2NfaWYuZWxfc2l6ZSA9IGFwLT5kaW1bYXAtPnJhbmsgLSAxXS5zaXplOworCisgICAgICAgIGlmICh0bXBfdmFsIDwgcG9pbnRlcnNfbnVtYmVyKSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfcG9pbnRlcl9hcnJheV9taXNtYXRjaCwgImFsbG9jX2lmIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGFsbG9jX2lmLnZhbCA9IG1fdmFyc1tpXS5jb3VudDsKKyAgICB9CisKKyAgICAvLyAgICBGUkVFX0lGCisgICAgaWYgKChmbGFncyAmICgxPDxmbGFnX2ZyZWVfaWZfaXNfYXJyYXkpKSAhPSAwKSB7CisgICAgICAgIGFwID0gc3RhdGljX2Nhc3Q8Y29uc3QgYXJyX2Rlc2MqPih2ZDMtPmZyZWVfaWZfYXJyYXkpOworICAgICAgICBnZXRfYXJyX2Rlc2NfbnVtYmVycyhhcCwgYXAtPmRpbVthcC0+cmFuayAtIDFdLnNpemUsIGZyZWVfaWYub2Zmc2V0LAorICAgICAgICAgICAgZnJlZV9pZi5zaXplLCB0bXBfdmFsLCBmcmVlX2lmLnJhbmdlcyk7CisgICAgICAgIGZyZWVfaWYuYmFzZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGFwLT5iYXNlKTsKKyAgICAgICAgZnJlZV9pZi5lbF9zaXplID0gYXAtPmRpbVthcC0+cmFuayAtIDFdLnNpemU7CisKKyAgICAgICAgaWYgKHRtcF92YWwgPCBwb2ludGVyc19udW1iZXIpIHsKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19wb2ludGVyX2FycmF5X21pc21hdGNoLCAiZnJlZV9pZiIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBmcmVlX2lmLnZhbCA9IG1fdmFyc1tpXS5jb3VudDsKKyAgICB9CisKKyAgICAvLyAgICBBTElHTgorCisgICAgaWYgKChmbGFncyAmICgxPDxmbGFnX2FsaWduX2lzX2FycmF5KSkgIT0gMCkgeworICAgICAgICBhcCA9IHN0YXRpY19jYXN0PGNvbnN0IGFycl9kZXNjKj4odmQzLT5hbGlnbl9hcnJheSk7CisgICAgICAgIGdldF9hcnJfZGVzY19udW1iZXJzKGFwLCBhcC0+ZGltW2FwLT5yYW5rIC0gMV0uc2l6ZSwgYWxpZ24ub2Zmc2V0LAorICAgICAgICAgICAgYWxpZ24uc2l6ZSwgdG1wX3ZhbCwgYWxpZ24ucmFuZ2VzKTsKKyAgICAgICAgYWxpZ24uYmFzZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGFwLT5iYXNlKTsKKyAgICAgICAgYWxpZ24uZWxfc2l6ZSA9IGFwLT5kaW1bYXAtPnJhbmsgLSAxXS5zaXplOworCisgICAgICAgIGlmICh0bXBfdmFsIDwgcG9pbnRlcnNfbnVtYmVyKSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfcG9pbnRlcl9hcnJheV9taXNtYXRjaCwgImFsaWduIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGFsaWduLnZhbCA9IG1fdmFyc1tpXS5hbGlnbjsKKyAgICB9CisKKyAgICAvLyAzLjEgSU5UTworCisgICAgaWYgKG1fdmFyc1tpXS5pbnRvKSB7CisgICAgICAgIGFwID0gc3RhdGljX2Nhc3Q8Y29uc3QgYXJyX2Rlc2MqPihtX3ZhcnNbaV0uaW50byk7CisgICAgICAgIGdldF9hcnJfZGVzY19udW1iZXJzKGFwLCBhcC0+ZGltW2FwLT5yYW5rIC0gMV0uc2l6ZSwgaW50by5vZmZzZXQsCisgICAgICAgICAgICBpbnRvLnNpemUsIHRtcF92YWwsIGludG8ucmFuZ2VzKTsKKyAgICAgICAgaW50by5iYXNlID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oYXAtPmJhc2UpOworCisgICAgICAgIGlmICh0bXBfdmFsIDwgcG9pbnRlcnNfbnVtYmVyKSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfcG9pbnRlcl9hcnJheV9taXNtYXRjaCwgImludG8iKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIDMuMiBJTlRPX1NUQVJUCisKKyAgICBpZiAoKGZsYWdzICYgKDE8PGZsYWdfaW50b19zdGFydF9pc19hcnJheSkpICE9IDApIHsKKyAgICAgICAgYXAgPSBzdGF0aWNfY2FzdDxjb25zdCBhcnJfZGVzYyo+KHZkMy0+aW50b19zdGFydCk7CisgICAgICAgIGdldF9hcnJfZGVzY19udW1iZXJzKGFwLCBhcC0+ZGltW2FwLT5yYW5rIC0gMV0uc2l6ZSwgaW50b19zdGFydC5vZmZzZXQsCisgICAgICAgICAgICBpbnRvX3N0YXJ0LnNpemUsIHRtcF92YWwsIGludG9fc3RhcnQucmFuZ2VzKTsKKyAgICAgICAgaW50b19zdGFydC5iYXNlID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oYXAtPmJhc2UpOworICAgICAgICBpbnRvX3N0YXJ0LmVsX3NpemUgPSBhcC0+ZGltW2FwLT5yYW5rIC0gMV0uc2l6ZTsKKworICAgICAgICBpZiAodG1wX3ZhbCA8IHBvaW50ZXJzX251bWJlcikgeworICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3BvaW50ZXJfYXJyYXlfbWlzbWF0Y2gsICJpbnRvX2V4dGVudCBzdGFydCIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKChmbGFncyAmICgxPDxmbGFnX2ludG9fc3RhcnRfaXNfc2NhbGFyKSkgIT0gMCkgeworICAgICAgICBpbnRvX3N0YXJ0LnZhbCA9IChpbnQ2NF90KXZkMy0+aW50b19zdGFydDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGludG9fc3RhcnQudmFsID0gMDsKKyAgICB9CisKKyAgICAvLyAzLjMgSU5UT19FTEVNRU5UUworCisgICAgaWYgKChmbGFncyAmICgxPDxmbGFnX2ludG9fZWxlbWVudHNfaXNfYXJyYXkpKSAhPSAwKSB7CisgICAgICAgIGFwID0gc3RhdGljX2Nhc3Q8Y29uc3QgYXJyX2Rlc2MqPih2ZDMtPmludG9fZWxlbWVudHMpOworICAgICAgICBnZXRfYXJyX2Rlc2NfbnVtYmVycyhhcCwgYXAtPmRpbVthcC0+cmFuayAtIDFdLnNpemUsIGludG9fZWxlbS5vZmZzZXQsCisgICAgICAgICAgICBpbnRvX2VsZW0uc2l6ZSwgdG1wX3ZhbCwgaW50b19lbGVtLnJhbmdlcyk7CisgICAgICAgIGludG9fZWxlbS5iYXNlID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oYXAtPmJhc2UpOworICAgICAgICBpbnRvX2VsZW0uZWxfc2l6ZSA9IGFwLT5kaW1bYXAtPnJhbmsgLSAxXS5zaXplOworCisgICAgICAgIGlmICh0bXBfdmFsIDwgcG9pbnRlcnNfbnVtYmVyKSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfcG9pbnRlcl9hcnJheV9taXNtYXRjaCwgImludG9fZXh0ZW50IGVsZW1lbnRzIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoKGZsYWdzICYgKDE8PGZsYWdfaW50b19lbGVtZW50c19pc19zY2FsYXIpKSAhPSAwKSB7CisgICAgICAgIGludG9fZWxlbS52YWwgPSAoaW50NjRfdCl2ZDMtPmludG9fZWxlbWVudHM7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpbnRvX2VsZW0udmFsID0gbV92YXJzW2ldLmNvdW50OworICAgIH0KKworICAgIC8vICAgIGFsbG9jX3N0YXJ0CisKKyAgICBpZiAoKGZsYWdzICYgKDE8PGZsYWdfYWxsb2Nfc3RhcnRfaXNfYXJyYXkpKSAhPSAwKSB7CisgICAgICAgIGFwID0gc3RhdGljX2Nhc3Q8Y29uc3QgYXJyX2Rlc2MqPih2ZDMtPmFsbG9jX3N0YXJ0KTsKKyAgICAgICAgZ2V0X2Fycl9kZXNjX251bWJlcnMoYXAsIGFwLT5kaW1bYXAtPnJhbmsgLSAxXS5zaXplLAorICAgICAgICAgICAgYWxsb2Nfc3RhcnQub2Zmc2V0LCBhbGxvY19zdGFydC5zaXplLCB0bXBfdmFsLAorICAgICAgICAgICAgYWxsb2Nfc3RhcnQucmFuZ2VzKTsKKyAgICAgICAgYWxsb2Nfc3RhcnQuYmFzZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGFwLT5iYXNlKTsKKyAgICAgICAgYWxsb2Nfc3RhcnQuZWxfc2l6ZSA9IGFwLT5kaW1bYXAtPnJhbmsgLSAxXS5zaXplOworCisgICAgICAgIGlmICh0bXBfdmFsIDwgcG9pbnRlcnNfbnVtYmVyKSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfcG9pbnRlcl9hcnJheV9taXNtYXRjaCwgImFsbG9jX2V4dGVudCBzdGFydCIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKChmbGFncyAmICgxPDxmbGFnX2FsbG9jX3N0YXJ0X2lzX3NjYWxhcikpICE9IDApIHsKKyAgICAgICAgYWxsb2Nfc3RhcnQudmFsID0gKGludDY0X3QpdmQzLT5hbGxvY19zdGFydDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGFsbG9jX3N0YXJ0LnZhbCA9IDA7CisgICAgfQorCisgICAgLy8gICAgYWxsb2NfZWxlbQorCisgICAgaWYgKChmbGFncyAmICgxPDxmbGFnX2FsbG9jX2VsZW1lbnRzX2lzX2FycmF5KSkgIT0gMCkgeworICAgICAgICBhcCA9IHN0YXRpY19jYXN0PGNvbnN0IGFycl9kZXNjKj4odmQzLT5hbGxvY19lbGVtZW50cyk7CisgICAgICAgIGdldF9hcnJfZGVzY19udW1iZXJzKGFwLCBhcC0+ZGltW2FwLT5yYW5rIC0gMV0uc2l6ZSwgYWxsb2NfZWxlbS5vZmZzZXQsCisgICAgICAgICAgICBhbGxvY19lbGVtLnNpemUsIHRtcF92YWwsIGFsbG9jX2VsZW0ucmFuZ2VzKTsKKyAgICAgICAgYWxsb2NfZWxlbS5iYXNlID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oYXAtPmJhc2UpOworICAgICAgICBhbGxvY19lbGVtLmVsX3NpemUgPSBhcC0+ZGltW2FwLT5yYW5rIC0gMV0uc2l6ZTsKKyAgICAgICAgaWYgKHRtcF92YWwgPCBwb2ludGVyc19udW1iZXIpIHsKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19wb2ludGVyX2FycmF5X21pc21hdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWxsb2NfZXh0ZW50IGVsZW1lbnRzIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoKGZsYWdzICYgKDE8PGZsYWdfYWxsb2NfZWxlbWVudHNfaXNfc2NhbGFyKSkgIT0gMCkgeworICAgICAgICBhbGxvY19lbGVtLnZhbCA9IChpbnQ2NF90KXZkMy0+YWxsb2NfZWxlbWVudHM7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBhbGxvY19lbGVtLnZhbCA9IDA7CisgICAgfQorCisgICAgZm9yIChpbnQgayA9IDA7IGsgPCBwb2ludGVyc19udW1iZXI7IGsrKykgeworICAgICAgICBpbnQgdHlwZSA9IGZsYWdzICYgMHgzZjsKKyAgICAgICAgaW50IHR5cGVfc3JjLCB0eXBlX2RzdDsKKyAgICAgICAgLy8gIEdldCBuZXcgdmFsdWVzCisgICAgICAgIC8vIHR5cGVfc3JjLCB0eXBlX2RzdAorICAgICAgICB0eXBlX3NyYyA9IHR5cGVfZHN0ID0gKHR5cGUgPT0gY19kYXRhX3B0cl9hcnJheSkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY19kYXRhX3B0ciAgIDogKHR5cGUgPT0gY19mdW5jX3B0cl9hcnJheSkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY19mdW5jX3B0ciAgIDogKHR5cGUgPT0gY192b2lkX3B0cl9hcnJheSkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY192b2lkX3B0ciAgIDogKHR5cGUgPT0gY19zdHJpbmdfcHRyX2FycmF5KSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX3N0cmluZ19wdHIgOiAwOworCisgICAgICAgIC8vIEdldCBwdHIgdmFsCisgICAgICAgIGlmICghcHRyLnJlYWRfbmV4dCh0cnVlKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBwdHIudmFsID0gKHZvaWQqKShwdHIuYmFzZSArIHB0ci5vZmZzZXQpOworICAgICAgICB9CisKKyAgICAgICAgLy8gISEhIElmIHdlIGdvdCBlcnJvciBhdCBwaGFzZSBvZiByZWFkaW5nIC0gaXQncyBhbiBpbnRlcm5hbAorICAgICAgICAvLyAhISEgZXJyb3IsIGFzIHdlIG11c3QgZGV0ZWN0IG1pc21hdGNoIGJlZm9yZQorCisgICAgICAgIC8vIEdldCBpbnRvIHZhbAorICAgICAgICBpZiAobV92YXJzW2ldLmludG8pIHsKKyAgICAgICAgICAgIGlmICghaW50by5yZWFkX25leHQodHJ1ZSkpIHsKKyAgICAgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfcG9pbnRlcl9hcnJheV9taXNtYXRjaCwgImludG8iKTsKKyAgICAgICAgICAgICAgICBMSUJPRkZMT0FEX0FCT1JUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgaW50by52YWwgPSAodm9pZCopKGludG8uYmFzZSArIGludG8ub2Zmc2V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEdldCBvdGhlciBjb21wb25lbnRzIG9mIHRoZSBjbGF1c2UKKyAgICAgICAgaWYgKCFleHRfc3RhcnQucmVhZF9uZXh0KGZsYWdzICYgKDE8PGZsYWdfZXh0ZW50X3N0YXJ0X2lzX2FycmF5KSkpIHsKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19wb2ludGVyX2FycmF5X21pc21hdGNoLCAiZXh0ZW50IHN0YXJ0Iik7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0FCT1JUOworICAgICAgICB9CisgICAgICAgIGlmICghZXh0X2VsZW1lbnRzLnJlYWRfbmV4dCgKKyAgICAgICAgICAgICAgICBmbGFncyAmICgxPDxmbGFnX2V4dGVudF9lbGVtZW50c19pc19hcnJheSkpKSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfcG9pbnRlcl9hcnJheV9taXNtYXRjaCwgImV4dGVudCBlbGVtZW50cyIpOworICAgICAgICAgICAgTElCT0ZGTE9BRF9BQk9SVDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWFsbG9jX2lmLnJlYWRfbmV4dChmbGFncyAmICgxPDxmbGFnX2FsbG9jX2lmX2lzX2FycmF5KSkpIHsKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19wb2ludGVyX2FycmF5X21pc21hdGNoLCAiYWxsb2NfaWYiKTsKKyAgICAgICAgICAgIExJQk9GRkxPQURfQUJPUlQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFmcmVlX2lmLnJlYWRfbmV4dChmbGFncyAmICgxPDxmbGFnX2ZyZWVfaWZfaXNfYXJyYXkpKSkgeworICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3BvaW50ZXJfYXJyYXlfbWlzbWF0Y2gsICJmcmVlX2lmIik7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0FCT1JUOworICAgICAgICB9CisgICAgICAgIGlmICghYWxpZ24ucmVhZF9uZXh0KGZsYWdzICYgKDE8PGZsYWdfYWxpZ25faXNfYXJyYXkpKSkgeworICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3BvaW50ZXJfYXJyYXlfbWlzbWF0Y2gsICJhbGlnbiIpOworICAgICAgICAgICAgTElCT0ZGTE9BRF9BQk9SVDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWludG9fc3RhcnQucmVhZF9uZXh0KGZsYWdzICYgKDE8PGZsYWdfaW50b19zdGFydF9pc19hcnJheSkpKSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfcG9pbnRlcl9hcnJheV9taXNtYXRjaCwgImludG9fZXh0ZW50IHN0YXJ0Iik7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0FCT1JUOworICAgICAgICB9CisgICAgICAgIGlmICghaW50b19lbGVtLnJlYWRfbmV4dChmbGFncyAmICgxPDxmbGFnX2ludG9fZWxlbWVudHNfaXNfYXJyYXkpKSkgeworICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3BvaW50ZXJfYXJyYXlfbWlzbWF0Y2gsICJpbnRvX2V4dGVudCBlbGVtZW50cyIpOworICAgICAgICAgICAgTElCT0ZGTE9BRF9BQk9SVDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWFsbG9jX3N0YXJ0LnJlYWRfbmV4dChmbGFncyAmICgxPDxmbGFnX2FsbG9jX3N0YXJ0X2lzX2FycmF5KSkpIHsKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19wb2ludGVyX2FycmF5X21pc21hdGNoLCAiYWxsb2NfZXh0ZW50IHN0YXJ0Iik7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0FCT1JUOworICAgICAgICB9CisgICAgICAgIGlmICghYWxsb2NfZWxlbS5yZWFkX25leHQoCisgICAgICAgICAgICAgICAgIGZsYWdzICYgKDE8PGZsYWdfYWxsb2NfZWxlbWVudHNfaXNfYXJyYXkpKSkgeworICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3BvaW50ZXJfYXJyYXlfbWlzbWF0Y2gsICJhbGxvY19leHRlbnQgZWxlbWVudHMiKTsKKyAgICAgICAgICAgIExJQk9GRkxPQURfQUJPUlQ7CisgICAgICAgIH0KKworICAgICAgICBtX3ZhcnNbbmV3X2luZGV4ICsga10uZGlyZWN0aW9uLmJpdHMgPSBtX3ZhcnNbaV0uZGlyZWN0aW9uLmJpdHM7CisgICAgICAgIG1fdmFyc1tuZXdfaW5kZXggKyBrXS5hbGxvY19pZiA9IGFsbG9jX2lmLnZhbDsKKyAgICAgICAgbV92YXJzW25ld19pbmRleCArIGtdLmZyZWVfaWYgPSBmcmVlX2lmLnZhbDsKKyAgICAgICAgbV92YXJzW25ld19pbmRleCArIGtdLmFsaWduID0gYWxpZ24udmFsOworICAgICAgICBtX3ZhcnNbbmV3X2luZGV4ICsga10ubWljX29mZnNldCA9IDA7CisgICAgICAgIG1fdmFyc1tuZXdfaW5kZXggKyBrXS5mbGFncy5iaXRzID0gbV92YXJzW2ldLmZsYWdzLmJpdHM7CisgICAgICAgIG1fdmFyc1tuZXdfaW5kZXggKyBrXS5vZmZzZXQgPSAwOworICAgICAgICBtX3ZhcnNbbmV3X2luZGV4ICsga10uc2l6ZSA9IG1fdmFyc1tpXS5zaXplOworCisgICAgICAgIGlmIChleHRfc3RhcnQudmFsID09IDApIHsKKyAgICAgICAgICAgIG1fdmFyc1tuZXdfaW5kZXggKyBrXS5jb3VudCA9IGV4dF9lbGVtZW50cy52YWw7CisgICAgICAgICAgICBtX3ZhcnNbbmV3X2luZGV4ICsga10ucHRyID0gcHRyLnZhbDsKKyAgICAgICAgICAgIGlmICh0eXBlX3NyYyA9PSBjX3N0cmluZ19wdHIpIHsKKyAgICAgICAgICAgICAgICBtX3ZhcnNbbmV3X2luZGV4ICsga10uc2l6ZSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBtX3ZhcnNbbmV3X2luZGV4ICsga10uY291bnQgPSAwOworICAgICAgICAgICAgbV92YXJzW25ld19pbmRleCArIGtdLnB0ciA9CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dm9pZCo+KG1ha2VfYXJyX2Rlc2MoCisgICAgICAgICAgICAgICAgcHRyLnZhbCwKKyAgICAgICAgICAgICAgICBleHRfc3RhcnQudmFsLAorICAgICAgICAgICAgICAgIGV4dF9lbGVtZW50cy52YWwsCisgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUpKTsKKworICAgICAgICAgICAgdHlwZV9zcmMgPSB0eXBlX3NyYyA9PSBjX2RhdGFfcHRyID8gY19jZWFuX3Zhcl9wdHIgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX3N0cmluZ19wdHIgPyBjX2NlYW5fdmFyX3B0ciA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVfc3JjOworICAgICAgICAgICAgaWYgKCFtX3ZhcnNbaV0uaW50bykgeworICAgICAgICAgICAgICAgIHR5cGVfZHN0ID0gdHlwZV9zcmM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAobV92YXJzW2ldLmludG8gJiYgaW50b19lbGVtLnZhbCAhPSAwKSB7CisgICAgICAgICAgICBtX3ZhcnNbbmV3X2luZGV4ICsga10uaW50byA9CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dm9pZCo+KG1ha2VfYXJyX2Rlc2MoCisgICAgICAgICAgICAgICAgaW50by52YWwsCisgICAgICAgICAgICAgICAgaW50b19zdGFydC52YWwsCisgICAgICAgICAgICAgICAgaW50b19lbGVtLnZhbCwKKyAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSkpOworICAgICAgICAgICAgdHlwZV9kc3QgPSAodHlwZSA9PSBjX2RhdGFfcHRyX2FycmF5KSA/IGNfY2Vhbl92YXJfcHRyIDoKKyAgICAgICAgICAgICAgICAgICAgICAgKHR5cGUgPT0gY19zdHJpbmdfcHRyX2FycmF5KSA/IGNfY2Vhbl92YXJfcHRyIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVfc3JjOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgbV92YXJzW25ld19pbmRleCArIGtdLmludG8gPSBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGFsbG9jX2VsZW0udmFsICE9IDApIHsKKyAgICAgICAgICAgIG1fdmFyc1tuZXdfaW5kZXggKyBrXS5hbGxvYyA9CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dm9pZCo+KG1ha2VfYXJyX2Rlc2MoCisgICAgICAgICAgICAgICAgcHRyLnZhbCwKKyAgICAgICAgICAgICAgICBhbGxvY19zdGFydC52YWwsCisgICAgICAgICAgICAgICAgYWxsb2NfZWxlbS52YWwsCisgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIG1fdmFyc1tuZXdfaW5kZXggKyBrXS5hbGxvYyA9IE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBtX3ZhcnNbbmV3X2luZGV4ICsga10udHlwZS5zcmMgPSB0eXBlX3NyYzsKKyAgICAgICAgbV92YXJzW25ld19pbmRleCArIGtdLnR5cGUuZHN0ID0gdHlwZV9kc3Q7CisKKyAgICAgICAgbV92YXJzX2V4dHJhW25ld19pbmRleCArIGtdLmlzX2Fycl9wdHJfZWwgPSAxOworICAgICAgICBtX3ZhcnNfZXh0cmFbbmV3X2luZGV4ICsga10ucHRyX2Fycl9vZmZzZXQgPQorICAgICAgICAgICAgc3JjX2lzX2Zvcl9taWMgPyBwdHIub2Zmc2V0IDogaW50by5vZmZzZXQ7CisgICAgfQorICAgIC8vIGNvdW50IGFuZCBhbGxvYyBmaWVsZHMgYXJlIHVzZWxlc3MgYXQgdGFyZ2V0LiBUaGV5IGNhbiBiZSByZXVzZWQKKyAgICAvLyBmb3IgcG9pbnRlciBhcnJheXMuCisgICAgbV92YXJzW2ldLmNvdW50ID0gcG9pbnRlcnNfbnVtYmVyOworICAgIG1fdmFyc1tpXS5wdHJfYXJyX29mZnNldCA9IG5ld19pbmRleDsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgX19vZmZsb2FkX2ZpbmlfbGlicmFyeSh2b2lkKQoreworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkNsZWFudXAgb2ZmbG9hZCBsaWJyYXJ5IC4uLlxuIik7CisgICAgaWYgKG1pY19lbmdpbmVzX3RvdGFsID4gMCkgeworICAgICAgICBkZWxldGVbXSBtaWNfZW5naW5lczsKKworICAgICAgICBpZiAobWljX3Byb3h5X2ZzX3Jvb3QgIT0gMCkgeworICAgICAgICAgICAgZnJlZShtaWNfcHJveHlfZnNfcm9vdCk7CisgICAgICAgICAgICBtaWNfcHJveHlfZnNfcm9vdCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAobWljX2xpYnJhcnlfcGF0aCAhPSAwKSB7CisgICAgICAgICAgICBmcmVlKG1pY19saWJyYXJ5X3BhdGgpOworICAgICAgICAgICAgbWljX2xpYnJhcnlfcGF0aCA9IDA7CisgICAgICAgIH0KKworICAgICAgICAvLyBkZXN0cm95IHRocmVhZCBrZXkKKyAgICAgICAgdGhyZWFkX2tleV9kZWxldGUobWljX3RocmVhZF9rZXkpOworICAgIH0KKworICAgIC8vIHVubG9hZCBDT0kgbGlicmFyeQorICAgIGlmIChDT0k6OmlzX2F2YWlsYWJsZSkgeworICAgICAgICBDT0k6OmZpbmkoKTsKKyAgICB9CisKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJDbGVhbnVwIG9mZmxvYWQgbGlicmFyeSAuLi4gZG9uZVxuIik7Cit9CisKK3N0YXRpYyB2b2lkIF9fb2ZmbG9hZF9pbml0X2xpYnJhcnlfb25jZSh2b2lkKQoreworICAgIENPSVJFU1VMVCByZXM7CisgICAgdWludDMyX3QgbnVtX2RldmljZXM7CisgICAgc3RkOjpiaXRzZXQ8TUlDX0VOR0lORVNfTUFYPiBkZXZpY2VzOworCisgICAgcHJlZml4ID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9ob3N0KTsKKworICAgIC8vIGluaXRpYWxpemUgdHJhY2UKKyAgICBjb25zdCBjaGFyICplbnZfdmFyID0gZ2V0ZW52KGh0cmFjZV9lbnZuYW1lKTsKKyAgICBpZiAoZW52X3ZhciAhPSAwICYmICplbnZfdmFyICE9ICdcMCcpIHsKKyAgICAgICAgaW50NjRfdCBuZXdfdmFsOworICAgICAgICBpZiAoX19vZmZsb2FkX3BhcnNlX2ludF9zdHJpbmcoZW52X3ZhciwgbmV3X3ZhbCkpIHsKKyAgICAgICAgICAgIGNvbnNvbGVfZW5hYmxlZCA9IG5ld192YWwgJiAweDBmOworICAgICAgICB9CisgICAgfQorCisgICAgZW52X3ZhciA9IGdldGVudihvZmZsb2FkX3JlcG9ydF9lbnZuYW1lKTsKKyAgICBpZiAoZW52X3ZhciAhPSAwICYmICplbnZfdmFyICE9ICdcMCcpIHsKKyAgICAgICAgaW50NjRfdCBlbnZfdmFsOworICAgICAgICBpZiAoX19vZmZsb2FkX3BhcnNlX2ludF9zdHJpbmcoZW52X3ZhciwgZW52X3ZhbCkpIHsKKyAgICAgICAgICAgIGlmIChlbnZfdmFsID09IE9GRkxPQURfUkVQT1JUXzEgfHwKKyAgICAgICAgICAgICAgICBlbnZfdmFsID09IE9GRkxPQURfUkVQT1JUXzIgfHwKKyAgICAgICAgICAgICAgICBlbnZfdmFsID09IE9GRkxPQURfUkVQT1JUXzMpIHsKKyAgICAgICAgICAgICAgICBvZmZsb2FkX3JlcG9ydF9sZXZlbCA9IGVudl92YWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfaW52YWxpZF9lbnZfcmVwb3J0X3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmbG9hZF9yZXBvcnRfZW52bmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfaW52YWxpZF9lbnZfdmFyX2ludF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmbG9hZF9yZXBvcnRfZW52bmFtZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoIW9mZmxvYWRfcmVwb3J0X2xldmVsKSB7CisgICAgICAgIGVudl92YXIgPSBnZXRlbnYodGltZXJfZW52bmFtZSk7CisgICAgICAgIGlmIChlbnZfdmFyICE9IDAgJiYgKmVudl92YXIgIT0gJ1wwJykgeworICAgICAgICAgICAgdGltZXJfZW5hYmxlZCA9IGF0b2koZW52X3Zhcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBpbml0aWFsaXplIENPSQorICAgIGlmICghQ09JOjppbml0KCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIGdldCBudW1iZXIgb2YgZGV2aWNlcyBpbnN0YWxsZWQgaW4gdGhlIHN5c3RlbQorICAgIHJlcyA9IENPSTo6RW5naW5lR2V0Q291bnQoQ09JX0lTQV9LTkMsICZudW1fZGV2aWNlcyk7CisgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG51bV9kZXZpY2VzID4gTUlDX0VOR0lORVNfTUFYKSB7CisgICAgICAgIG51bV9kZXZpY2VzID0gTUlDX0VOR0lORVNfTUFYOworICAgIH0KKworICAgIC8vIGZpbGwgaW4gdGhlIGxpc3Qgb2YgZGV2aWNlcyB0aGF0IGNhbiBiZSB1c2VkIGZvciBvZmZsb2FkaW5nCisgICAgZW52X3ZhciA9IGdldGVudigiT0ZGTE9BRF9ERVZJQ0VTIik7CisgICAgaWYgKGVudl92YXIgIT0gMCkgeworICAgICAgICBpZiAoc3RyY2FzZWNtcChlbnZfdmFyLCAibm9uZSIpICE9IDApIHsKKyAgICAgICAgICAgIC8vIHZhbHVlIGlzIGNvbXBvc2VkIG9mIGNvbW1hIHNlcGFyYXRlZCBwaHlzaWNhbCBkZXZpY2UgaW5kZXhlcworICAgICAgICAgICAgY2hhciAqYnVmID0gc3RyZHVwKGVudl92YXIpOworICAgICAgICAgICAgY2hhciAqc3RyLCAqcHRyOworICAgICAgICAgICAgZm9yIChzdHIgPSBzdHJ0b2tfcihidWYsICIsIiwgJnB0cik7IHN0ciAhPSAwOworICAgICAgICAgICAgICAgICBzdHIgPSBzdHJ0b2tfcigwLCAiLCIsICZwdHIpKSB7CisgICAgICAgICAgICAgICAgLy8gY29udmVydCBzdHJpbmcgdG8gYW4gaW50CisgICAgICAgICAgICAgICAgaW50NjRfdCBudW07CisgICAgICAgICAgICAgICAgaWYgKCFfX29mZmxvYWRfcGFyc2VfaW50X3N0cmluZyhzdHIsIG51bSkpIHsKKyAgICAgICAgICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX21pY19pbml0NSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gZmFsbGJhY2sgdG8gdXNpbmcgYWxsIGluc3RhbGxlZCBkZXZpY2VzCisgICAgICAgICAgICAgICAgICAgIGRldmljZXMucmVzZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fZGV2aWNlczsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VzLnNldChpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG51bSA8IDAgfHwgbnVtID49IG51bV9kZXZpY2VzKSB7CisgICAgICAgICAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19taWNfaW5pdDYsIG51bSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkZXZpY2VzLnNldChudW0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnJlZShidWYpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvLyB1c2UgYWxsIGF2YWlsYWJsZSBkZXZpY2VzCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX2RldmljZXM7IGkrKykgeworICAgICAgICAgICAgQ09JRU5HSU5FIGVuZ2luZTsKKyAgICAgICAgICAgIHJlcyA9IENPSTo6RW5naW5lR2V0SGFuZGxlKENPSV9JU0FfS05DLCBpLCAmZW5naW5lKTsKKyAgICAgICAgICAgIGlmIChyZXMgPT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICBkZXZpY2VzLnNldChpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIG1pY19lbmdpbmVzX3RvdGFsID0gZGV2aWNlcy5jb3VudCgpOworCisgICAgLy8gbm8gbmVlZCB0byBjb250aW51ZSBpZiB0aGVyZSBhcmUgbm8gZGV2aWNlcyB0byBvZmZsb2FkIHRvCisgICAgaWYgKG1pY19lbmdpbmVzX3RvdGFsIDw9IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIGluaXRpYWxpemUgaW5kZXhlcyBmb3IgYXZhaWxhYmxlIGRldmljZXMKKyAgICBtaWNfZW5naW5lcyA9IG5ldyBFbmdpbmVbbWljX2VuZ2luZXNfdG90YWxdOworICAgIGZvciAoaW50IHBfaWR4ID0gMCwgbF9pZHggPSAwOyBwX2lkeCA8IG51bV9kZXZpY2VzOyBwX2lkeCsrKSB7CisgICAgICAgIGlmIChkZXZpY2VzW3BfaWR4XSkgeworICAgICAgICAgICAgbWljX2VuZ2luZXNbbF9pZHhdLnNldF9pbmRleGVzKGxfaWR4LCBwX2lkeCk7CisgICAgICAgICAgICBsX2lkeCsrOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gbGlicmFyeSBzZWFyY2ggcGF0aCBmb3IgZGV2aWNlIGJpbmFyaWVzCisgICAgZW52X3ZhciA9IGdldGVudigiTUlDX0xEX0xJQlJBUllfUEFUSCIpOworICAgIGlmIChlbnZfdmFyICE9IDApIHsKKyAgICAgICAgbWljX2xpYnJhcnlfcGF0aCA9IHN0cmR1cChlbnZfdmFyKTsKKyAgICB9CisKKyAgICAvLyBtZW1vcnkgc2l6ZSByZXNlcnZlZCBmb3IgQ09JIGJ1ZmZlcnMKKyAgICBlbnZfdmFyID0gZ2V0ZW52KCJNSUNfQlVGRkVSU0laRSIpOworICAgIGlmIChlbnZfdmFyICE9IDApIHsKKyAgICAgICAgdWludDY0X3QgbmV3X3NpemU7CisgICAgICAgIGlmIChfX29mZmxvYWRfcGFyc2Vfc2l6ZV9zdHJpbmcoZW52X3ZhciwgbmV3X3NpemUpKSB7CisgICAgICAgICAgICBtaWNfYnVmZmVyX3NpemUgPSBuZXdfc2l6ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19pbnZhbGlkX2Vudl92YXJfdmFsdWUsICJNSUNfQlVGRkVSU0laRSIpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gZGV0ZXJtaW5lIHN0YWNrc2l6ZSBmb3IgdGhlIHBpcGVsaW5lIG9uIHRoZSBkZXZpY2UKKyAgICBlbnZfdmFyID0gZ2V0ZW52KCJNSUNfU1RBQ0tTSVpFIik7CisgICAgaWYgKGVudl92YXIgIT0gMCAmJiAqZW52X3ZhciAhPSAnXDAnKSB7CisgICAgICAgIHVpbnQ2NF90IG5ld19zaXplOworICAgICAgICBpZiAoX19vZmZsb2FkX3BhcnNlX3NpemVfc3RyaW5nKGVudl92YXIsIG5ld19zaXplKSAmJgorICAgICAgICAgICAgKG5ld19zaXplID49IDE2Mzg0KSAmJiAoKG5ld19zaXplICYgNDA5NSkgPT0gMCkpIHsKKyAgICAgICAgICAgIG1pY19zdGFja19zaXplID0gbmV3X3NpemU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfbWljX2luaXQzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHByb3h5IEkvTworICAgIGVudl92YXIgPSBnZXRlbnYoIk1JQ19QUk9YWV9JTyIpOworICAgIGlmIChlbnZfdmFyICE9IDAgJiYgKmVudl92YXIgIT0gJ1wwJykgeworICAgICAgICBpbnQ2NF90IG5ld192YWw7CisgICAgICAgIGlmIChfX29mZmxvYWRfcGFyc2VfaW50X3N0cmluZyhlbnZfdmFyLCBuZXdfdmFsKSkgeworICAgICAgICAgICAgbWljX3Byb3h5X2lvID0gbmV3X3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19pbnZhbGlkX2Vudl92YXJfaW50X3ZhbHVlLCAiTUlDX1BST1hZX0lPIik7CisgICAgICAgIH0KKyAgICB9CisgICAgZW52X3ZhciA9IGdldGVudigiTUlDX1BST1hZX0ZTX1JPT1QiKTsKKyAgICBpZiAoZW52X3ZhciAhPSAwICYmICplbnZfdmFyICE9ICdcMCcpIHsKKyAgICAgICAgbWljX3Byb3h5X2ZzX3Jvb3QgPSBzdHJkdXAoZW52X3Zhcik7CisgICAgfQorCisgICAgLy8gUHJlcGFyZSBlbnZpcm9ubWVudCBmb3IgdGhlIHRhcmdldCBwcm9jZXNzIHVzaW5nIHRoZSBmb2xsb3dpbmcKKyAgICAvLyBydWxlcworICAgIC8vIC0gSWYgTUlDX0VOVl9QUkVGSVggaXMgc2V0IHRoZW4gYW55IGVudmlyb25tZW50IHZhcmlhYmxlIG9uIHRoZQorICAgIC8vICAgaG9zdCB3aGljaCBoYXMgdGhhdCBwcmVmaXggYXJlIGNvcGllZCB0byB0aGUgZGV2aWNlIHdpdGhvdXQKKyAgICAvLyAgIHRoZSBwcmVmaXguCisgICAgLy8gICBBbGwgb3RoZXIgaG9zdCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIGlnbm9yZWQuCisgICAgLy8gLSBJZiBNSUNfRU5WX1BSRUZJWCBpcyBub3Qgc2V0IG9yIGlmIE1JQ19FTlZfUFJFRklYPSIiIHRoZW4gaG9zdAorICAgIC8vICAgZW52aXJvbm1lbnQgaXMgZHVwbGljYXRlZC4KKyAgICBlbnZfdmFyID0gZ2V0ZW52KCJNSUNfRU5WX1BSRUZJWCIpOworICAgIGlmIChlbnZfdmFyICE9IDAgJiYgKmVudl92YXIgIT0gJ1wwJykgeworICAgICAgICBtaWNfZW52X3ZhcnMuc2V0X3ByZWZpeChlbnZfdmFyKTsKKworICAgICAgICBpbnQgbGVuID0gc3RybGVuKGVudl92YXIpOworICAgICAgICBmb3IgKGludCBpID0gMDsgZW52aXJvbltpXSAhPSAwOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChzdHJuY21wKGVudmlyb25baV0sIGVudl92YXIsIGxlbikgPT0gMCAmJgorICAgICAgICAgICAgICAgIHN0cm5jbXAoZW52aXJvbltpXSwgIk1JQ19MRF9MSUJSQVJZX1BBVEgiLCAxOSkgIT0gMCAmJgorICAgICAgICAgICAgICAgIGVudmlyb25baV1bbGVuXSAhPSAnPScpIHsKKyAgICAgICAgICAgICAgICBtaWNfZW52X3ZhcnMuYW5hbHl6ZV9lbnZfdmFyKGVudmlyb25baV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gY3JlYXRlIGtleSBmb3IgdGhyZWFkIGRhdGEKKyAgICBpZiAodGhyZWFkX2tleV9jcmVhdGUoJm1pY190aHJlYWRfa2V5LCBFbmdpbmU6OmRlc3Ryb3lfdGhyZWFkX2RhdGEpKSB7CisgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19taWNfaW5pdDQsIGVycm5vKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIGNwdSBmcmVxdWVuY3kKKyAgICBjcHVfZnJlcXVlbmN5ID0gQ09JOjpQZXJmR2V0Q3ljbGVGcmVxdWVuY3koKTsKKworICAgIGVudl92YXIgPSBnZXRlbnYobWljX3VzZV8ybWJfYnVmZmVyc19lbnZuYW1lKTsKKyAgICBpZiAoZW52X3ZhciAhPSAwICYmICplbnZfdmFyICE9ICdcMCcpIHsKKyAgICAgICAgdWludDY0X3QgbmV3X3NpemU7CisgICAgICAgIGlmIChfX29mZmxvYWRfcGFyc2Vfc2l6ZV9zdHJpbmcoZW52X3ZhciwgbmV3X3NpemUpKSB7CisgICAgICAgICAgICBfX29mZmxvYWRfdXNlXzJtYl9idWZmZXJzID0gbmV3X3NpemU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfaW52YWxpZF9lbnZfdmFyX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaWNfdXNlXzJtYl9idWZmZXJzX2Vudm5hbWUpOworICAgICAgICB9CisgICAgfQorCisgICAgZW52X3ZhciA9IGdldGVudihtaWNfdXNlX2FzeW5jX2J1ZmZlcl93cml0ZV9lbnZuYW1lKTsKKyAgICBpZiAoZW52X3ZhciAhPSAwICYmICplbnZfdmFyICE9ICdcMCcpIHsKKyAgICAgICAgdWludDY0X3QgbmV3X3NpemU7CisgICAgICAgIGlmIChfX29mZmxvYWRfcGFyc2Vfc2l6ZV9zdHJpbmcoZW52X3ZhciwgbmV3X3NpemUpKSB7CisgICAgICAgICAgICBfX29mZmxvYWRfdXNlX2FzeW5jX2J1ZmZlcl93cml0ZSA9IG5ld19zaXplOworICAgICAgICB9CisgICAgfQorCisgICAgZW52X3ZhciA9IGdldGVudihtaWNfdXNlX2FzeW5jX2J1ZmZlcl9yZWFkX2Vudm5hbWUpOworICAgIGlmIChlbnZfdmFyICE9IDAgJiYgKmVudl92YXIgIT0gJ1wwJykgeworICAgICAgICB1aW50NjRfdCBuZXdfc2l6ZTsKKyAgICAgICAgaWYgKF9fb2ZmbG9hZF9wYXJzZV9zaXplX3N0cmluZyhlbnZfdmFyLCBuZXdfc2l6ZSkpIHsKKyAgICAgICAgICAgIF9fb2ZmbG9hZF91c2VfYXN5bmNfYnVmZmVyX3JlYWQgPSBuZXdfc2l6ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIG1pYyBpbml0aWFsaXphdGlvbiB0eXBlCisgICAgZW52X3ZhciA9IGdldGVudihvZmZsb2FkX2luaXRfZW52bmFtZSk7CisgICAgaWYgKGVudl92YXIgIT0gMCAmJiAqZW52X3ZhciAhPSAnXDAnKSB7CisgICAgICAgIGlmIChzdHJjbXAoZW52X3ZhciwgIm9uX29mZmxvYWQiKSA9PSAwKSB7CisgICAgICAgICAgICBfX29mZmxvYWRfaW5pdF90eXBlID0gY19pbml0X29uX29mZmxvYWQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoc3RyY21wKGVudl92YXIsICJvbl9vZmZsb2FkX2FsbCIpID09IDApIHsKKyAgICAgICAgICAgIF9fb2ZmbG9hZF9pbml0X3R5cGUgPSBjX2luaXRfb25fb2ZmbG9hZF9hbGw7CisgICAgICAgIH0KKyNpZm5kZWYgVEFSR0VUX1dJTk5UCisgICAgICAgIGVsc2UgaWYgKHN0cmNtcChlbnZfdmFyLCAib25fc3RhcnQiKSA9PSAwKSB7CisgICAgICAgICAgICBfX29mZmxvYWRfaW5pdF90eXBlID0gY19pbml0X29uX3N0YXJ0OworICAgICAgICB9CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX2ludmFsaWRfZW52X3Zhcl92YWx1ZSwgb2ZmbG9hZF9pbml0X2Vudm5hbWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gYWN0aXZlIHdhaXQKKyAgICBlbnZfdmFyID0gZ2V0ZW52KG9mZmxvYWRfYWN0aXZlX3dhaXRfZW52bmFtZSk7CisgICAgaWYgKGVudl92YXIgIT0gMCAmJiAqZW52X3ZhciAhPSAnXDAnKSB7CisgICAgICAgIGludDY0X3QgbmV3X3ZhbDsKKyAgICAgICAgaWYgKF9fb2ZmbG9hZF9wYXJzZV9pbnRfc3RyaW5nKGVudl92YXIsIG5ld192YWwpKSB7CisgICAgICAgICAgICBfX29mZmxvYWRfYWN0aXZlX3dhaXQgPSBuZXdfdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX2ludmFsaWRfZW52X3Zhcl9pbnRfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZmxvYWRfYWN0aXZlX3dhaXRfZW52bmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBvbXAgZGV2aWNlIG51bQorICAgIGVudl92YXIgPSBnZXRlbnYob21wX2RldmljZV9udW1fZW52bmFtZSk7CisgICAgaWYgKGVudl92YXIgIT0gMCAmJiAqZW52X3ZhciAhPSAnXDAnKSB7CisgICAgICAgIGludDY0X3QgbmV3X3ZhbDsKKyAgICAgICAgaWYgKF9fb2ZmbG9hZF9wYXJzZV9pbnRfc3RyaW5nKGVudl92YXIsIG5ld192YWwpICYmIG5ld192YWwgPj0gMCkgeworICAgICAgICAgICAgX19vbXBfZGV2aWNlX251bSA9IG5ld192YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfb21wX2ludmFsaWRfZGV2aWNlX251bV9lbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9tcF9kZXZpY2VfbnVtX2Vudm5hbWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gaW5pdCBPUlNMCisgICAgT1JTTDo6aW5pdCgpOworfQorCitleHRlcm4gaW50IF9fb2ZmbG9hZF9pbml0X2xpYnJhcnkodm9pZCkKK3sKKyAgICAvLyBkbyBvbmUgdGltZSBpbnRpYWxpemF0aW9uCisgICAgc3RhdGljIE9mZmxvYWRPbmNlQ29udHJvbCBjdHJsID0gT0ZGTE9BRF9PTkNFX0NPTlRST0xfSU5JVDsKKyAgICBfX29mZmxvYWRfcnVuX29uY2UoJmN0cmwsIF9fb2ZmbG9hZF9pbml0X2xpYnJhcnlfb25jZSk7CisKKyAgICAvLyBvZmZsb2FkIGlzIGF2YWlsYWJsZSBpZiBDT0kgaXMgYXZhaWxhYmxlIGFuZCB0aGUgbnVtYmVyIG9mIGRldmljZXMgPiAwCisgICAgYm9vbCBpc19hdmFpbGFibGUgPSBDT0k6OmlzX2F2YWlsYWJsZSAmJiAobWljX2VuZ2luZXNfdG90YWwgPiAwKTsKKworICAgIC8vIHJlZ2lzdGVyIHBlbmRpbmcgbGlicmFyaWVzIGlmIHRoZXJlIGFyZSBhbnkKKyAgICBpZiAoaXNfYXZhaWxhYmxlICYmIF9fdGFyZ2V0X2xpYnMpIHsKKyAgICAgICAgbXV0ZXhfbG9ja2VyX3QgbG9ja2VyKF9fdGFyZ2V0X2xpYnNfbG9jayk7CisKKyAgICAgICAgZm9yIChUYXJnZXRJbWFnZUxpc3Q6Oml0ZXJhdG9yIGl0ID0gX190YXJnZXRfbGlic19saXN0LmJlZ2luKCk7CisgICAgICAgICAgICAgaXQgIT0gX190YXJnZXRfbGlic19saXN0LmVuZCgpOyBpdCsrKSB7CisgICAgICAgICAgICAvLyBSZWdpc3RlciBsaWJyYXJ5IGluIENPSQorICAgICAgICAgICAgQ09JOjpQcm9jZXNzUmVnaXN0ZXJMaWJyYXJpZXMoMSwgJml0LT5kYXRhLCAmaXQtPnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaXQtPm9yaWdpbiwgJml0LT5vZmZzZXQpOworCisgICAgICAgICAgICAvLyBhZGQgbGliIHRvIGFsbCBlbmdpbmVzCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1pY19lbmdpbmVzX3RvdGFsOyBpKyspIHsKKyAgICAgICAgICAgICAgICBtaWNfZW5naW5lc1tpXS5hZGRfbGliKCppdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBfX3RhcmdldF9saWJzID0gZmFsc2U7CisgICAgICAgIF9fdGFyZ2V0X2xpYnNfbGlzdC5jbGVhcigpOworICAgIH0KKworICAgIHJldHVybiBpc19hdmFpbGFibGU7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBfX29mZmxvYWRfcmVnaXN0ZXJfaW1hZ2UoY29uc3Qgdm9pZCAqdGFyZ2V0X2ltYWdlKQoreworICAgIGNvbnN0IHN0cnVjdCBJbWFnZSAqaW1hZ2UgPSBzdGF0aWNfY2FzdDxjb25zdCBzdHJ1Y3QgSW1hZ2UqPih0YXJnZXRfaW1hZ2UpOworCisgICAgLy8gZGVjb2RlIGltYWdlCisgICAgY29uc3QgY2hhciAqbmFtZSA9IGltYWdlLT5kYXRhOworICAgIGNvbnN0IHZvaWQgKmRhdGEgPSBpbWFnZS0+ZGF0YSArIHN0cmxlbihpbWFnZS0+ZGF0YSkgKyAxOworICAgIHVpbnQ2NF90ICAgIHNpemUgPSBpbWFnZS0+c2l6ZTsKKyAgICBjb25zdCBjaGFyICpvcmlnaW4gPSAwOworICAgIHVpbnQ2NF90ICAgIG9mZnNldCA9IDA7CisKKyAgICAvLyBvdXIgYWN0aW9ucyBkZXBlbmQgb24gdGhlIGltYWdlIHR5cGUKKyAgICBjb25zdCBFbGY2NF9FaGRyICpoZHIgPSBzdGF0aWNfY2FzdDxjb25zdCBFbGY2NF9FaGRyKj4oZGF0YSk7CisgICAgc3dpdGNoIChoZHItPmVfdHlwZSkgeworICAgICAgICBjYXNlIEVUX0VYRUM6CisgICAgICAgICAgICAvLyBFYWNoIG9mZmxvYWQgYXBwbGljYXRpb24gaXMgc3VwcG9zZWQgdG8gaGF2ZSBvbmx5IG9uZSB0YXJnZXQKKyAgICAgICAgICAgIC8vIGltYWdlIHJlcHJlc2VudGluZyB0YXJnZXQgZXhlY3V0YWJsZS4KKyAgICAgICAgICAgIC8vIE5vIHRocmVhZCBzeW5jaHJvbml6YXRpb24gaXMgcmVxdWlyZWQgaGVyZSBhcyB0aGUgaW5pdGlhbGl6YXRpb24KKyAgICAgICAgICAgIC8vIGNvZGUgaXMgYWx3YXlzIGV4ZWN1dGVkIGluIGEgc2luZ2xlIHRocmVhZC4KKyAgICAgICAgICAgIGlmIChfX3RhcmdldF9leGUgIT0gMCkgeworICAgICAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19tdWx0aXBsZV90YXJnZXRfZXhlcyk7CisgICAgICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9fdGFyZ2V0X2V4ZSA9IG5ldyBUYXJnZXRJbWFnZShuYW1lLCBkYXRhLCBzaXplLCBvcmlnaW4sIG9mZnNldCk7CisKKyAgICAgICAgICAgIC8vIFJlZ2lzdHJhdGlvbiBjb2RlIGZvciBleGVjcyBpcyBhbHdheXMgY2FsbGVkIGZyb20gdGhlIGNvbnRleHQKKyAgICAgICAgICAgIC8vIG9mIG1haW4gYW5kIHRodXMgd2UgY2FuIHNhZmVseSBjYWxsIGFueSBmdW5jdGlvbiBoZXJlLAorICAgICAgICAgICAgLy8gaW5jbHVkaW5nIExvYWRMaWJyYXJ5IEFQSSBvbiB3aW5kb3dzLiBUaGlzIGlzIHRoZSBwbGFjZSB3aGVyZQorICAgICAgICAgICAgLy8gd2UgZG8gdGhlIG9mZmxvYWQgbGlicmFyeSBpbml0aWFsaXphdGlvbi4KKyAgICAgICAgICAgIGlmIChfX29mZmxvYWRfaW5pdF9saWJyYXJ5KCkpIHsKKyAgICAgICAgICAgICAgICAvLyBpbml0aWFsaXplIGVuZ2luZSBpZiBpbml0X3R5cGUgaXMgb25fc3RhcnQKKyAgICAgICAgICAgICAgICBpZiAoX19vZmZsb2FkX2luaXRfdHlwZSA9PSBjX2luaXRfb25fc3RhcnQpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtaWNfZW5naW5lc190b3RhbDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtaWNfZW5naW5lc1tpXS5pbml0KCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEVUX0RZTjoKKyAgICAgICAgICAgIC8vIFJlZ2lzdHJhdGlvbiBjb2RlIGZvciBsaWJyYXJpZXMgaXMgY2FsbGVkIGZyb20gdGhlIERsbE1haW4KKyAgICAgICAgICAgIC8vIGNvbnRleHQgKG9uIHdpbmRvd3MpIGFuZCB0aHVzIHdlIGNhbm5vdCBkbyBhbnl0aGluZyB1c2VmdWwKKyAgICAgICAgICAgIC8vIGhlcmUuIFNvIHdlIGp1c3QgYWRkIGl0IHRvIHRoZSBsaXN0IG9mIHBlbmRpbmcgbGlicmFyaWVzIGZvcgorICAgICAgICAgICAgLy8gdGhlIGxhdGVyIHVzZS4KKyAgICAgICAgICAgIF9fdGFyZ2V0X2xpYnNfbG9jay5sb2NrKCk7CisgICAgICAgICAgICBfX3RhcmdldF9saWJzID0gdHJ1ZTsKKyAgICAgICAgICAgIF9fdGFyZ2V0X2xpYnNfbGlzdC5wdXNoX2JhY2soVGFyZ2V0SW1hZ2UobmFtZSwgZGF0YSwgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luLCBvZmZzZXQpKTsKKyAgICAgICAgICAgIF9fdGFyZ2V0X2xpYnNfbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAvLyBzb21ldGhpbmcgaXMgZGVmaW5pdGVseSB3cm9uZywgaXNzdWUgYW4gZXJyb3IgYW5kIGV4aXQKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY191bmtub3duX2JpbmFyeV90eXBlKTsKKyAgICAgICAgICAgIGV4aXQoMSk7CisgICAgfQorfQorCitleHRlcm4gIkMiIHZvaWQgX19vZmZsb2FkX3VucmVnaXN0ZXJfaW1hZ2UoY29uc3Qgdm9pZCAqdGFyZ2V0X2ltYWdlKQoreworICAgIC8vIFRhcmdldCBpbWFnZSBpcyBwYWNrZWQgYXMgZm9sbG93czoKKyAgICAvLyAgICAgIDggYnl0ZXMgICAgICAgICAgICAgICAgLSBzaXplIG9mIHRoZSB0YXJnZXQgYmluYXJ5CisgICAgLy8gICAgICBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nIC0gYmluYXJ5IG5hbWUKKyAgICAvLyAgICAgIDxzaXplPiBieXRlcyAgICAgICAgICAgLSBiaW5hcnkgY29udGVudHMKKyAgICBjb25zdCBzdHJ1Y3QgSW1hZ2UgeworICAgICAgICAgaW50NjRfdCBzaXplOworICAgICAgICAgY2hhciBkYXRhW107CisgICAgfSAqaW1hZ2UgPSBzdGF0aWNfY2FzdDxjb25zdCBzdHJ1Y3QgSW1hZ2UqPih0YXJnZXRfaW1hZ2UpOworCisgICAgLy8gZGVjb2RlIGltYWdlCisgICAgY29uc3QgY2hhciAqbmFtZSA9IGltYWdlLT5kYXRhOworICAgIGNvbnN0IHZvaWQgKmRhdGEgPSBpbWFnZS0+ZGF0YSArIHN0cmxlbihpbWFnZS0+ZGF0YSkgKyAxOworCisgICAgLy8gb3VyIGFjdGlvbnMgZGVwZW5kIG9uIHRoZSBpbWFnZSB0eXBlCisgICAgY29uc3QgRWxmNjRfRWhkciAqaGRyID0gc3RhdGljX2Nhc3Q8Y29uc3QgRWxmNjRfRWhkcio+KGRhdGEpOworICAgIGlmIChoZHItPmVfdHlwZSA9PSBFVF9FWEVDKSB7CisgICAgICAgIC8vIFdlIGFyZSBleGVjdXRpbmcgZXhlYydzIGRlc2N0cnVjdG9ycy4KKyAgICAgICAgLy8gSXQgaXMgdGltZSB0byBkbyBhIGxpYnJhcnkgY2xlYW51cC4KKyAgICAgICAgaWYgKHRpbWVyX2VuYWJsZWQpIHsKKyAgICAgICAgICAgIE9mZmxvYWRfVGltZXJfUHJpbnQoKTsKKyAgICAgICAgfQorCisjaWZkZWYgTVlPX1NVUFBPUlQKKyAgICAgICAgX19vZmZsb2FkX215b0ZpbmkoKTsKKyNlbmRpZiAvLyBNWU9fU1VQUE9SVAorCisgICAgICAgIF9fb2ZmbG9hZF9maW5pX2xpYnJhcnkoKTsKKyAgICB9Cit9CisKKy8vIFJ1bnRpbWUgdHJhY2UgaW50ZXJmYWNlIGZvciB1c2VyIHByb2dyYW1zCisKK3ZvaWQgX19vZmZsb2FkX2NvbnNvbGVfdHJhY2UoaW50IGxldmVsKQoreworICAgIGNvbnNvbGVfZW5hYmxlZCA9IGxldmVsOworfQorCisvLyBVc2VyLXZpc2libGUgb2ZmbG9hZCBBUEkKKworaW50IF9PZmZsb2FkX251bWJlcl9vZl9kZXZpY2VzKHZvaWQpCit7CisgICAgX19vZmZsb2FkX2luaXRfbGlicmFyeSgpOworICAgIHJldHVybiBtaWNfZW5naW5lc190b3RhbDsKK30KKworaW50IF9PZmZsb2FkX2dldF9kZXZpY2VfbnVtYmVyKHZvaWQpCit7CisgICAgcmV0dXJuIC0xOworfQorCitpbnQgX09mZmxvYWRfZ2V0X3BoeXNpY2FsX2RldmljZV9udW1iZXIodm9pZCkKK3sKKyAgICByZXR1cm4gLTE7Cit9CisKK2ludCBfT2ZmbG9hZF9zaWduYWxlZChpbnQgaW5kZXgsIHZvaWQgKnNpZ25hbCkKK3sKKyAgICBfX29mZmxvYWRfaW5pdF9saWJyYXJ5KCk7CisKKyAgICAvLyBjaGVjayBpbmRleCB2YWx1ZQorICAgIGlmIChpbmRleCA8IDAgfHwgbWljX2VuZ2luZXNfdG90YWwgPD0gMCkgeworICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfb2ZmbG9hZF9zaWduYWxlZDEsIGluZGV4KTsKKyAgICAgICAgTElCT0ZGTE9BRF9BQk9SVDsKKyAgICB9CisKKyAgICAvLyBmaW5kIGFzc29jaWF0ZWQgYXN5bmMgdGFzaworICAgIE9mZmxvYWREZXNjcmlwdG9yICp0YXNrID0KKyAgICAgICAgbWljX2VuZ2luZXNbaW5kZXggJSBtaWNfZW5naW5lc190b3RhbF0uZmluZF9zaWduYWwoc2lnbmFsLCBmYWxzZSk7CisgICAgaWYgKHRhc2sgPT0gMCkgeworICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfb2ZmbG9hZF9zaWduYWxlZDIsIHNpZ25hbCk7CisgICAgICAgIExJQk9GRkxPQURfQUJPUlQ7CisgICAgfQorCisgICAgcmV0dXJuIHRhc2stPmlzX3NpZ25hbGVkKCk7Cit9CisKK3ZvaWQgX09mZmxvYWRfcmVwb3J0KGludCB2YWwpCit7CisgICAgaWYgKHZhbCA9PSBPRkZMT0FEX1JFUE9SVF9PTiB8fAorICAgICAgICB2YWwgPT0gT0ZGTE9BRF9SRVBPUlRfT0ZGKSB7CisgICAgICAgIG9mZmxvYWRfcmVwb3J0X2VuYWJsZWQgPSB2YWw7CisgICAgfQorfQorCisvLyBJREIgc3VwcG9ydAoraW50ICAgX19kYmdfaXNfYXR0YWNoZWQgPSAwOworaW50ICAgX19kYmdfdGFyZ2V0X2lkID0gLTE7CitwaWRfdCBfX2RiZ190YXJnZXRfc29fcGlkID0gLTE7CitjaGFyICBfX2RiZ190YXJnZXRfZXhlX25hbWVbTUFYX1RBUkdFVF9OQU1FXSA9IHswfTsKK2NvbnN0IGludCBfX2RiZ19hcGlfbWFqb3JfdmVyc2lvbiA9IDE7Citjb25zdCBpbnQgX19kYmdfYXBpX21pbm9yX3ZlcnNpb24gPSAwOworCit2b2lkIF9fZGJnX3RhcmdldF9zb19sb2FkZWQoKQoreworfQordm9pZCBfX2RiZ190YXJnZXRfc29fdW5sb2FkZWQoKQoreworfQpkaWZmIC0tZ2l0IGEvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9ob3N0LmggYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX2hvc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTIzOTk2Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9ob3N0LmgKQEAgLTAsMCArMSwzNDMgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworLyohIFxmaWxlCisgICAgXGJyaWVmIFRoZSBwYXJ0cyBvZiB0aGUgcnVudGltZSBsaWJyYXJ5IHVzZWQgb25seSBvbiB0aGUgaG9zdAorKi8KKworI2lmbmRlZiBPRkZMT0FEX0hPU1RfSF9JTkNMVURFRAorI2RlZmluZSBPRkZMT0FEX0hPU1RfSF9JTkNMVURFRAorCisjaWZuZGVmIFRBUkdFVF9XSU5OVAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorI2luY2x1ZGUgIm9mZmxvYWRfY29tbW9uLmgiCisjaW5jbHVkZSAib2ZmbG9hZF91dGlsLmgiCisjaW5jbHVkZSAib2ZmbG9hZF9lbmdpbmUuaCIKKyNpbmNsdWRlICJvZmZsb2FkX2Vudi5oIgorI2luY2x1ZGUgIm9mZmxvYWRfb3JzbC5oIgorI2luY2x1ZGUgImNvaS9jb2lfY2xpZW50LmgiCisKKy8vIE1JQyBlbmdpbmVzLgorZXh0ZXJuIEVuZ2luZSogIG1pY19lbmdpbmVzOworZXh0ZXJuIHVpbnQzMl90IG1pY19lbmdpbmVzX3RvdGFsOworCisvLyEgVGhlIHRhcmdldCBpbWFnZSBpcyBwYWNrZWQgYXMgZm9sbG93cy4KKy8qISAgICAgIDEuIDggYnl0ZXMgY29udGFpbmluZyB0aGUgc2l6ZSBvZiB0aGUgdGFyZ2V0IGJpbmFyeSAgICAgICAgICAqLworLyohICAgICAgMi4gYSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nIHdoaWNoIGlzIHRoZSBiaW5hcnkgbmFtZSAgICAgICAgICovCisvKiEgICAgICAzLiA8c2l6ZT4gbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYXJlIHRoZSBjb250ZW50cyBvZiB0aGUgaW1hZ2UgKi8KKy8qISAgICAgIFRoZSBhZGRyZXNzIG9mIHN5bWJvbCBfX29mZmxvYWRfdGFyZ2V0X2ltYWdlCisgICAgICAgICAgICAgaXMgdGhlIGFkZHJlc3Mgb2YgdGhpcyBzdHJ1Y3R1cmUuICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3N0cnVjdCBJbWFnZSB7CisgICAgIGludDY0X3Qgc2l6ZTsgLy8hPCBTaXplIGluIGJ5dGVzIG9mIHRoZSB0YXJnZXQgYmluYXJ5IG5hbWUgYW5kIGNvbnRlbnRzCisgICAgIGNoYXIgZGF0YVtdOyAgLy8hPCBUaGUgbmFtZSBhbmQgY29udGVudHMgb2YgdGhlIHRhcmdldCBpbWFnZQorfTsKKworLy8gVGhlIG9mZmxvYWQgZGVzY3JpcHRvci4KK2NsYXNzIE9mZmxvYWREZXNjcmlwdG9yCit7CitwdWJsaWM6CisgICAgT2ZmbG9hZERlc2NyaXB0b3IoCisgICAgICAgIGludCBpbmRleCwKKyAgICAgICAgX09mZmxvYWRfc3RhdHVzICpzdGF0dXMsCisgICAgICAgIGJvb2wgaXNfbWFuZGF0b3J5LAorICAgICAgICBib29sIGlzX29wZW5tcCwKKyAgICAgICAgT2ZmbG9hZEhvc3RUaW1lckRhdGEgKiB0aW1lcl9kYXRhCisgICAgKSA6CisgICAgICAgIG1fZGV2aWNlKG1pY19lbmdpbmVzW2luZGV4ICUgbWljX2VuZ2luZXNfdG90YWxdKSwKKyAgICAgICAgbV9pc19tYW5kYXRvcnkoaXNfbWFuZGF0b3J5KSwKKyAgICAgICAgbV9pc19vcGVubXAoaXNfb3Blbm1wKSwKKyAgICAgICAgbV9pbm91dF9idWYoMCksCisgICAgICAgIG1fZnVuY19kZXNjKDApLAorICAgICAgICBtX2Z1bmNfZGVzY19zaXplKDApLAorICAgICAgICBtX2luX2RlcHMoMCksCisgICAgICAgIG1faW5fZGVwc190b3RhbCgwKSwKKyAgICAgICAgbV9vdXRfZGVwcygwKSwKKyAgICAgICAgbV9vdXRfZGVwc190b3RhbCgwKSwKKyAgICAgICAgbV92YXJzKDApLAorICAgICAgICBtX3ZhcnNfZXh0cmEoMCksCisgICAgICAgIG1fc3RhdHVzKHN0YXR1cyksCisgICAgICAgIG1fdGltZXJfZGF0YSh0aW1lcl9kYXRhKQorICAgIHt9CisKKyAgICB+T2ZmbG9hZERlc2NyaXB0b3IoKQorICAgIHsKKyAgICAgICAgaWYgKG1faW5fZGVwcyAhPSAwKSB7CisgICAgICAgICAgICBmcmVlKG1faW5fZGVwcyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1fb3V0X2RlcHMgIT0gMCkgeworICAgICAgICAgICAgZnJlZShtX291dF9kZXBzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobV9mdW5jX2Rlc2MgIT0gMCkgeworICAgICAgICAgICAgZnJlZShtX2Z1bmNfZGVzYyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1fdmFycyAhPSAwKSB7CisgICAgICAgICAgICBmcmVlKG1fdmFycyk7CisgICAgICAgICAgICBmcmVlKG1fdmFyc19leHRyYSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBib29sIG9mZmxvYWQoY29uc3QgY2hhciAqbmFtZSwgYm9vbCBpc19lbXB0eSwKKyAgICAgICAgICAgICAgICAgVmFyRGVzYyAqdmFycywgVmFyRGVzYzIgKnZhcnMyLCBpbnQgdmFyc190b3RhbCwKKyAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqKndhaXRzLCBpbnQgbnVtX3dhaXRzLCBjb25zdCB2b2lkICoqc2lnbmFsLAorICAgICAgICAgICAgICAgICBpbnQgZW50cnlfaWQsIGNvbnN0IHZvaWQgKnN0YWNrX2FkZHIpOworICAgIGJvb2wgb2ZmbG9hZF9maW5pc2goKTsKKworICAgIGJvb2wgaXNfc2lnbmFsZWQoKTsKKworICAgIE9mZmxvYWRIb3N0VGltZXJEYXRhKiBnZXRfdGltZXJfZGF0YSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1fdGltZXJfZGF0YTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgYm9vbCB3YWl0X2RlcGVuZGVuY2llcyhjb25zdCB2b2lkICoqd2FpdHMsIGludCBudW1fd2FpdHMpOworICAgIGJvb2wgc2V0dXBfZGVzY3JpcHRvcnMoVmFyRGVzYyAqdmFycywgVmFyRGVzYzIgKnZhcnMyLCBpbnQgdmFyc190b3RhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlbnRyeV9pZCwgY29uc3Qgdm9pZCAqc3RhY2tfYWRkcik7CisgICAgYm9vbCBzZXR1cF9taXNjX2RhdGEoY29uc3QgY2hhciAqbmFtZSk7CisgICAgYm9vbCBzZW5kX3BvaW50ZXJfZGF0YShib29sIGlzX2FzeW5jKTsKKyAgICBib29sIHNlbmRfbm9uY29udGlndW91c19wb2ludGVyX2RhdGEoCisgICAgICAgIGludCBpLAorICAgICAgICBQdHJEYXRhKiBzcmNfYnVmLAorICAgICAgICBQdHJEYXRhKiBkc3RfYnVmLAorICAgICAgICBDT0lFVkVOVCAqZXZlbnQpOworICAgIGJvb2wgcmVjZWl2ZV9ub25jb250aWd1b3VzX3BvaW50ZXJfZGF0YSgKKyAgICAgICAgaW50IGksCisgICAgICAgIGNoYXIqIHNyY19kYXRhLAorICAgICAgICBDT0lCVUZGRVIgZHN0X2J1ZiwKKyAgICAgICAgQ09JRVZFTlQgKmV2ZW50KTsKKworICAgIGJvb2wgZ2F0aGVyX2NvcHlpbl9kYXRhKCk7CisKKyAgICBib29sIGNvbXB1dGUoKTsKKworICAgIGJvb2wgcmVjZWl2ZV9wb2ludGVyX2RhdGEoYm9vbCBpc19hc3luYyk7CisgICAgYm9vbCBzY2F0dGVyX2NvcHlvdXRfZGF0YSgpOworCisgICAgdm9pZCBjbGVhbnVwKCk7CisKKyAgICBib29sIGZpbmRfcHRyX2RhdGEoUHRyRGF0YSogJnB0cl9kYXRhLCB2b2lkICpiYXNlLCBpbnQ2NF90IGRpc3AsCisgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgbGVuZ3RoLCBib29sIGVycm9yX2RvZXNfbm90X2V4aXN0ID0gdHJ1ZSk7CisgICAgYm9vbCBhbGxvY19wdHJfZGF0YShQdHJEYXRhKiAmcHRyX2RhdGEsIHZvaWQgKmJhc2UsIGludDY0X3QgZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgbGVuZ3RoLCBpbnQ2NF90IGFsbG9jX2Rpc3AsIGludCBhbGlnbik7CisgICAgYm9vbCBpbml0X3N0YXRpY19wdHJfZGF0YShQdHJEYXRhICpwdHJfZGF0YSk7CisgICAgYm9vbCBpbml0X21pY19hZGRyZXNzKFB0ckRhdGEgKnB0cl9kYXRhKTsKKyAgICBib29sIG9mZmxvYWRfc3RhY2tfbWVtb3J5X21hbmFnZXIoY29uc3Qgdm9pZCAqIHN0YWNrX2JlZ2luLCBpbnQgcm91dGluZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1Zl9zaXplLCBpbnQgYWxpZ24sIGJvb2wgKmlzX25ldyk7CisgICAgYm9vbCBudWxsaWZ5X3RhcmdldF9zdGFjayhDT0lCVUZGRVIgdGFyZ19idWYsIHVpbnQ2NF90IHNpemUpOworCisgICAgYm9vbCBnZW5fdmFyX2Rlc2NzX2Zvcl9wb2ludGVyX2FycmF5KGludCBpKTsKKworICAgIHZvaWQgcmVwb3J0X2NvaV9lcnJvcihlcnJvcl90eXBlcyBtc2csIENPSVJFU1VMVCByZXMpOworICAgIF9PZmZsb2FkX3Jlc3VsdCB0cmFuc2xhdGVfY29pX2Vycm9yKENPSVJFU1VMVCByZXMpIGNvbnN0OworCitwcml2YXRlOgorICAgIHR5cGVkZWYgc3RkOjpsaXN0PENPSUJVRkZFUj4gQnVmZmVyTGlzdDsKKworICAgIC8vIGV4dHJhIGRhdGEgYXNzb2NpYXRlZCB3aXRoIGVhY2ggdmFyaWFibGUgZGVzY3JpcHRvcgorICAgIHN0cnVjdCBWYXJFeHRyYSB7CisgICAgICAgIFB0ckRhdGEqIHNyY19kYXRhOworICAgICAgICBQdHJEYXRhKiBkc3RfZGF0YTsKKyAgICAgICAgQXV0b0RhdGEqIGF1dG9fZGF0YTsKKyAgICAgICAgaW50NjRfdCBjcHVfZGlzcDsKKyAgICAgICAgaW50NjRfdCBjcHVfb2Zmc2V0OworICAgICAgICBDZWFuUmVhZFJhbmdlcyAqcmVhZF9ybmdfc3JjOworICAgICAgICBDZWFuUmVhZFJhbmdlcyAqcmVhZF9ybmdfZHN0OworICAgICAgICBpbnQ2NF90IHB0cl9hcnJfb2Zmc2V0OworICAgICAgICBib29sIGlzX2Fycl9wdHJfZWw7CisgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGNsYXNzIFJlYWRBcnJFbGVtZW50cyB7CisgICAgcHVibGljOgorICAgICAgICBSZWFkQXJyRWxlbWVudHMoKToKKyAgICAgICAgICAgIHJhbmdlcyhOVUxMKSwKKyAgICAgICAgICAgIGVsX3NpemUoc2l6ZW9mKFQpKSwKKyAgICAgICAgICAgIG9mZnNldCgwKSwKKyAgICAgICAgICAgIGNvdW50KDApLAorICAgICAgICAgICAgaXNfZW1wdHkodHJ1ZSksCisgICAgICAgICAgICBiYXNlKE5VTEwpCisgICAgICAgIHt9CisKKyAgICAgICAgYm9vbCByZWFkX25leHQoYm9vbCBmbGFnKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZmxhZyAhPSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGlzX2VtcHR5KSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChyYW5nZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZ2V0X25leHRfcmFuZ2UocmFuZ2VzLCAmb2Zmc2V0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJhbmdlcyBhcmUgb3ZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBhbGwgY29udGlndW91cyBlbGVtZW50cyBhcmUgb3ZlcgorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjb3VudCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBsZW5ndGhfY3VyID0gc2l6ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBlbF9zaXplOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2YWwgPSAoVClnZXRfZWxfdmFsdWUoYmFzZSwgb2Zmc2V0LCBlbF9zaXplKTsKKyAgICAgICAgICAgICAgICBsZW5ndGhfY3VyIC09IGVsX3NpemU7CisgICAgICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICAgICAgICBpc19lbXB0eSA9IGxlbmd0aF9jdXIgPT0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgcHVibGljOgorICAgICAgICBDZWFuUmVhZFJhbmdlcyAqIHJhbmdlczsKKyAgICAgICAgVCAgICAgICB2YWw7CisgICAgICAgIGludCAgICAgZWxfc2l6ZTsKKyAgICAgICAgaW50NjRfdCBzaXplLAorICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICAgICAgICAgICAgICBsZW5ndGhfY3VyOworICAgICAgICBib29sICAgIGlzX2VtcHR5OworICAgICAgICBpbnQgICAgIGNvdW50OworICAgICAgICBjaGFyICAgKmJhc2U7CisgICAgfTsKKworICAgIC8vIHB0cl9kYXRhIGZvciBwZXJzaXN0ZW50IGF1dG8gb2JqZWN0cworICAgIFB0ckRhdGEqICAgIG1fc3RhY2tfcHRyX2RhdGE7CisgICAgUHRyRGF0YUxpc3QgbV9kZXN0cm95X3N0YWNrOworCisgICAgLy8gRW5naW5lCisgICAgRW5naW5lJiBtX2RldmljZTsKKworICAgIC8vIGlmIHRydWUgb2ZmbG9hZCBpcyBtYW5kYXRvcnkKKyAgICBib29sIG1faXNfbWFuZGF0b3J5OworCisgICAgLy8gaWYgdHJ1ZSBvZmZsb2FkIGhhcyBvcGVubXAgb3JpZ2luCisgICAgY29uc3QgYm9vbCBtX2lzX29wZW5tcDsKKworICAgIC8vIFRoZSBNYXJzaGFsbGVyIGZvciB0aGUgaW5wdXRzIG9mIHRoZSBvZmZsb2FkZWQgcmVnaW9uLgorICAgIE1hcnNoYWxsZXIgbV9pbjsKKworICAgIC8vIFRoZSBNYXJzaGFsbGVyIGZvciB0aGUgb3V0cHV0cyBvZiB0aGUgb2ZmbG9hZGVkIHJlZ2lvbi4KKyAgICBNYXJzaGFsbGVyIG1fb3V0OworCisgICAgLy8gTGlzdCBvZiBidWZmZXJzIHRoYXQgYXJlIHBhc3NlZCB0byBkaXNwYXRjaCBjYWxsCisgICAgQnVmZmVyTGlzdCBtX2NvbXB1dGVfYnVmZmVyczsKKworICAgIC8vIExpc3Qgb2YgYnVmZmVycyB0aGF0IG5lZWQgdG8gYmUgZGVzdHJveWVkIGF0IHRoZSBlbmQgb2Ygb2ZmbG9hZAorICAgIEJ1ZmZlckxpc3QgbV9kZXN0cm95X2J1ZmZlcnM7CisKKyAgICAvLyBWYXJpYWJsZSBkZXNjcmlwdG9ycworICAgIFZhckRlc2MqICBtX3ZhcnM7CisgICAgVmFyRXh0cmEqIG1fdmFyc19leHRyYTsKKyAgICBpbnQgICAgICAgbV92YXJzX3RvdGFsOworCisgICAgLy8gUG9pbnRlciB0byBhIHVzZXItc3BlY2lmaWVkIHN0YXR1cyB2YXJpYWJsZQorICAgIF9PZmZsb2FkX3N0YXR1cyAqbV9zdGF0dXM7CisKKyAgICAvLyBGdW5jdGlvbiBkZXNjcmlwdG9yCisgICAgRnVuY3Rpb25EZXNjcmlwdG9yKiBtX2Z1bmNfZGVzYzsKKyAgICB1aW50MzJfdCAgICAgICAgICAgIG1fZnVuY19kZXNjX3NpemU7CisKKyAgICAvLyBCdWZmZXIgZm9yIHRyYW5zZmVycmluZyBjb3B5aW4vY29weW91dCBkYXRhCisgICAgQ09JQlVGRkVSIG1faW5vdXRfYnVmOworCisgICAgLy8gRGVwZW5kZW5jaWVzCisgICAgQ09JRVZFTlQgKm1faW5fZGVwczsKKyAgICB1aW50MzJfdCAgbV9pbl9kZXBzX3RvdGFsOworICAgIENPSUVWRU5UICptX291dF9kZXBzOworICAgIHVpbnQzMl90ICBtX291dF9kZXBzX3RvdGFsOworCisgICAgLy8gVGltZXIgZGF0YQorICAgIE9mZmxvYWRIb3N0VGltZXJEYXRhICptX3RpbWVyX2RhdGE7CisKKyAgICAvLyBjb3B5aW4vY29weW91dCBkYXRhIGxlbmd0aAorICAgIHVpbnQ2NF90IG1faW5fZGF0YWxlbjsKKyAgICB1aW50NjRfdCBtX291dF9kYXRhbGVuOworCisgICAgLy8gYSBib29sZWFuIHZhbHVlIGNhbGN1bGF0ZWQgaW4gc2V0dXBfZGVzY3JpcHRvcnMuIElmIHRydWUgd2UgbmVlZCB0byBkbworICAgIC8vIGEgcnVuIGZ1bmN0aW9uIG9uIHRoZSB0YXJnZXQuIE90aGVyd2lzZSBpdCBtYXkgYmUgb3B0aW1pemVkIGF3YXkuCisgICAgYm9vbCBtX25lZWRfcnVuZnVuY3Rpb247Cit9OworCisvLyBJbml0aWFsaXphdGlvbiB0eXBlcyBmb3IgTUlDCitlbnVtIE9mZmxvYWRJbml0VHlwZSB7CisgICAgY19pbml0X29uX3N0YXJ0LCAgICAgICAgIC8vIGFsbCBkZXZpY2VzIGJlZm9yZSBlbnRlcmluZyBtYWluCisgICAgY19pbml0X29uX29mZmxvYWQsICAgICAgIC8vIHNpbmdsZSBkZXZpY2UgYmVmb3JlIHN0YXJ0aW5nIHRoZSBmaXJzdCBvZmZsb2FkCisgICAgY19pbml0X29uX29mZmxvYWRfYWxsICAgIC8vIGFsbCBkZXZpY2VzIGJlZm9yZSBzdGFydGluZyB0aGUgZmlyc3Qgb2ZmbG9hZAorfTsKKworLy8gSW5pdGlhbGl6ZXMgbGlicmFyeSBhbmQgcmVnaXN0ZXJzIHNwZWNpZmllZCBvZmZsb2FkIGltYWdlLgorZXh0ZXJuICJDIiB2b2lkIF9fb2ZmbG9hZF9yZWdpc3Rlcl9pbWFnZShjb25zdCB2b2lkKiBpbWFnZSk7CitleHRlcm4gIkMiIHZvaWQgX19vZmZsb2FkX3VucmVnaXN0ZXJfaW1hZ2UoY29uc3Qgdm9pZCogaW1hZ2UpOworCisvLyBJbml0aWFsaXplcyBvZmZsb2FkIHJ1bnRpbWUgbGlicmFyeS4KK2V4dGVybiBpbnQgX19vZmZsb2FkX2luaXRfbGlicmFyeSh2b2lkKTsKKworLy8gdGhyZWFkIGRhdGEgZm9yIGFzc29jaWF0aW5nIHBpcGVsaW5lcyB3aXRoIHRocmVhZHMKK2V4dGVybiBwdGhyZWFkX2tleV90IG1pY190aHJlYWRfa2V5OworCisvLyBFbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIGRldmljZXMKK2V4dGVybiBNaWNFbnZWYXIgbWljX2Vudl92YXJzOworCisvLyBDUFUgZnJlcXVlbmN5CitleHRlcm4gdWludDY0X3QgY3B1X2ZyZXF1ZW5jeTsKKworLy8gTERfTElCUkFSWV9QQVRIIGZvciBNSUMgbGlicmFyaWVzCitleHRlcm4gY2hhciogbWljX2xpYnJhcnlfcGF0aDsKKworLy8gc3RhY2sgc2l6ZSBmb3IgdGFyZ2V0CitleHRlcm4gdWludDMyX3QgbWljX3N0YWNrX3NpemU7CisKKy8vIFByZWFsbG9jYXRlZCBtZW1vcnkgc2l6ZSBmb3IgYnVmZmVycyBvbiBNSUMKK2V4dGVybiB1aW50NjRfdCBtaWNfYnVmZmVyX3NpemU7CisKKy8vIFNldHRpbmcgY29udHJvbGxpbmcgaW5vdXQgcHJveHkKK2V4dGVybiBib29sICBtaWNfcHJveHlfaW87CitleHRlcm4gY2hhciogbWljX3Byb3h5X2ZzX3Jvb3Q7CisKKy8vIFRocmVzaG9sZCBmb3IgY3JlYXRpbmcgYnVmZmVycyB3aXRoIGxhcmdlIHBhZ2VzCitleHRlcm4gdWludDY0X3QgX19vZmZsb2FkX3VzZV8ybWJfYnVmZmVyczsKKworLy8gb2ZmbG9hZCBpbml0aWFsaXphdGlvbiB0eXBlCitleHRlcm4gT2ZmbG9hZEluaXRUeXBlIF9fb2ZmbG9hZF9pbml0X3R5cGU7CisKKy8vIERldmljZSBudW1iZXIgdG8gb2ZmbG9hZCB0byB3aGVuIGRldmljZSBpcyBub3QgZXhwbGljaXRseSBzcGVjaWZpZWQuCitleHRlcm4gaW50IF9fb21wX2RldmljZV9udW07CisKKy8vIHRhcmdldCBleGVjdXRhYmxlCitleHRlcm4gVGFyZ2V0SW1hZ2UqIF9fdGFyZ2V0X2V4ZTsKKworLy8gSURCIHN1cHBvcnQKKworLy8gQ2FsbGVkIGJ5IHRoZSBvZmZsb2FkIHJ1bnRpbWUgYWZ0ZXIgaW5pdGlhbGl6YXRpb24gb2Ygb2ZmbG9hZCBpbmZyYXN0cnVjdHVyZQorLy8gaGFzIGJlZW4gY29tcGxldGVkLgorZXh0ZXJuICJDIiB2b2lkICBfX2RiZ190YXJnZXRfc29fbG9hZGVkKCk7CisKKy8vIENhbGxlZCBieSB0aGUgb2ZmbG9hZCBydW50aW1lIHdoZW4gdGhlIG9mZmxvYWQgaW5mcmFzdHJ1Y3R1cmUgaXMgYWJvdXQgdG8gYmUKKy8vIHNodXQgZG93biwgY3VycmVudGx5IGF0IGFwcGxpY2F0aW9uIGV4aXQuCitleHRlcm4gIkMiIHZvaWQgIF9fZGJnX3RhcmdldF9zb191bmxvYWRlZCgpOworCisvLyBOdWxsLXRlcm1pbmF0ZWQgc3RyaW5nIGNvbnRhaW5pbmcgcGF0aCB0byB0aGUgcHJvY2VzcyBpbWFnZSBvZiB0aGUgaG9zdGluZworLy8gYXBwbGljYXRpb24gKG9mZmxvYWRfbWFpbikKKyNkZWZpbmUgTUFYX1RBUkdFVF9OQU1FIDUxMgorZXh0ZXJuICJDIiBjaGFyICBfX2RiZ190YXJnZXRfZXhlX25hbWVbTUFYX1RBUkdFVF9OQU1FXTsKKworLy8gSW50ZWdlciBzcGVjaWZ5aW5nIHRoZSBwcm9jZXNzIGlkCitleHRlcm4gIkMiIHBpZF90IF9fZGJnX3RhcmdldF9zb19waWQ7CisKKy8vIEludGVnZXIgc3BlY2lmeWluZyB0aGUgMC1iYXNlZCBkZXZpY2UgbnVtYmVyCitleHRlcm4gIkMiIGludCAgIF9fZGJnX3RhcmdldF9pZDsKKworLy8gU2V0IHRvIG5vbi16ZXJvIGJ5IHRoZSBob3N0LXNpZGUgZGVidWdnZXIgdG8gZW5hYmxlIG9mZmxvYWQgZGVidWdnaW5nCisvLyBzdXBwb3J0CitleHRlcm4gIkMiIGludCAgIF9fZGJnX2lzX2F0dGFjaGVkOworCisvLyBNYWpvciB2ZXJzaW9uIG9mIHRoZSBkZWJ1Z2dlciBzdXBwb3J0IEFQSQorZXh0ZXJuICJDIiBjb25zdCBpbnQgX19kYmdfYXBpX21ham9yX3ZlcnNpb247CisKKy8vIE1pbm9yIHZlcnNpb24gb2YgdGhlIGRlYnVnZ2VyIHN1cHBvcnQgQVBJCitleHRlcm4gIkMiIGNvbnN0IGludCBfX2RiZ19hcGlfbWlub3JfdmVyc2lvbjsKKworI2VuZGlmIC8vIE9GRkxPQURfSE9TVF9IX0lOQ0xVREVECmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX215b19ob3N0LmNwcCBiL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfbXlvX2hvc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlMWMxODYKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX215b19ob3N0LmNwcApAQCAtMCwwICsxLDgwNSBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAib2ZmbG9hZF9teW9faG9zdC5oIgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8bWFsbG9jLmg+CisjaW5jbHVkZSAib2ZmbG9hZF9ob3N0LmgiCisKKyNpZiBkZWZpbmVkKExJTlVYKSB8fCBkZWZpbmVkKEZSRUVCU0QpCisjaW5jbHVkZSA8bW1fbWFsbG9jLmg+CisjZW5kaWYKKworI2RlZmluZSBNWU9fVkVSU0lPTjEgICAgIk1ZT18xLjAiCisKK2V4dGVybiAiQyIgdm9pZCBfX2NpbGtydHNfY2lsa19mb3JfMzIodm9pZCosIHZvaWQqLCB1aW50MzJfdCwgaW50MzJfdCk7CitleHRlcm4gIkMiIHZvaWQgX19jaWxrcnRzX2NpbGtfZm9yXzY0KHZvaWQqLCB2b2lkKiwgdWludDY0X3QsIGludDMyX3QpOworCisjaWZuZGVmIFRBUkdFVF9XSU5OVAorI3ByYWdtYSB3ZWFrIF9fY2lsa3J0c19jaWxrX2Zvcl8zMgorI3ByYWdtYSB3ZWFrIF9fY2lsa3J0c19jaWxrX2Zvcl82NAorI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorCisjaWZkZWYgVEFSR0VUX1dJTk5UCisjZGVmaW5lIE1ZT19UQUJMRV9FTkRfTUFSS0VSKCkgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oLTEpCisjZWxzZSAvLyBUQVJHRVRfV0lOTlQKKyNkZWZpbmUgTVlPX1RBQkxFX0VORF9NQVJLRVIoKSByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPigwKQorI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorCitjbGFzcyBNeW9XcmFwcGVyIHsKK3B1YmxpYzoKKyAgICBNeW9XcmFwcGVyKCkgOiBtX2xpYl9oYW5kbGUoMCksIG1faXNfYXZhaWxhYmxlKGZhbHNlKQorICAgIHt9CisKKyAgICBib29sIGlzX2F2YWlsYWJsZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1faXNfYXZhaWxhYmxlOworICAgIH0KKworICAgIGJvb2wgTG9hZExpYnJhcnkodm9pZCk7CisKKyAgICAvLyB1bmxvYWRzIHRoZSBsaWJyYXJ5CisgICAgdm9pZCBVbmxvYWRMaWJyYXJ5KHZvaWQpIHsKKy8vICAgICAgICBpZiAobV9saWJfaGFuZGxlICE9IDApIHsKKy8vICAgICAgICAgICAgRExfY2xvc2UobV9saWJfaGFuZGxlKTsKKy8vICAgICAgICAgICAgbV9saWJfaGFuZGxlID0gMDsKKy8vICAgICAgICB9CisgICAgfQorCisgICAgLy8gV3JhcHBlcnMgZm9yIE1ZTyBjbGllbnQgZnVuY3Rpb25zCisgICAgdm9pZCBMaWJJbml0KHZvaWQgKmFyZywgdm9pZCAqZnVuYykgY29uc3QgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFXzEoNCwgMCwgY19vZmZsb2FkX215b2luaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMoJXAsICVwKVxuIiwgX19mdW5jX18sIGFyZywgZnVuYyk7CisgICAgICAgIENoZWNrUmVzdWx0KF9fZnVuY19fLCBtX2xpYl9pbml0KGFyZywgZnVuYykpOworICAgIH0KKworICAgIHZvaWQgTGliRmluaSh2b2lkKSBjb25zdCB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0VfMSg0LCAwLCBjX29mZmxvYWRfbXlvZmluaSwgIiVzKClcbiIsIF9fZnVuY19fKTsKKyAgICAgICAgbV9saWJfZmluaSgpOworICAgIH0KKworICAgIHZvaWQqIFNoYXJlZE1hbGxvYyhzaXplX3Qgc2l6ZSkgY29uc3QgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFXzEoNCwgMCwgY19vZmZsb2FkX215b3NoYXJlZG1hbGxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcyglbGxkKVxuIiwgX19mdW5jX18sIHNpemUpOworICAgICAgICByZXR1cm4gbV9zaGFyZWRfbWFsbG9jKHNpemUpOworICAgIH0KKworICAgIHZvaWQgU2hhcmVkRnJlZSh2b2lkICpwdHIpIGNvbnN0IHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRV8xKDQsIDAsIGNfb2ZmbG9hZF9teW9zaGFyZWRmcmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzKCVwKVxuIiwgX19mdW5jX18sIHB0cik7CisgICAgICAgIG1fc2hhcmVkX2ZyZWUocHRyKTsKKyAgICB9CisKKyAgICB2b2lkKiBTaGFyZWRBbGlnbmVkTWFsbG9jKHNpemVfdCBzaXplLCBzaXplX3QgYWxpZ24pIGNvbnN0IHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRV8xKDQsIDAsIGNfb2ZmbG9hZF9teW9zaGFyZWRhbGlnbmVkbWFsbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzKCVsbGQsICVsbGQpXG4iLCBfX2Z1bmNfXywgc2l6ZSwgYWxpZ24pOworICAgICAgICByZXR1cm4gbV9zaGFyZWRfYWxpZ25lZF9tYWxsb2Moc2l6ZSwgYWxpZ24pOworICAgIH0KKworICAgIHZvaWQgU2hhcmVkQWxpZ25lZEZyZWUodm9pZCAqcHRyKSBjb25zdCB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0VfMSg0LCAwLCBjX29mZmxvYWRfbXlvc2hhcmVkYWxpZ25lZGZyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMoJXApXG4iLCBfX2Z1bmNfXywgcHRyKTsKKyAgICAgICAgbV9zaGFyZWRfYWxpZ25lZF9mcmVlKHB0cik7CisgICAgfQorCisgICAgdm9pZCBBY3F1aXJlKHZvaWQpIGNvbnN0IHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRV8xKDQsIDAsIGNfb2ZmbG9hZF9teW9hY3F1aXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzKClcbiIsIF9fZnVuY19fKTsKKyAgICAgICAgQ2hlY2tSZXN1bHQoX19mdW5jX18sIG1fYWNxdWlyZSgpKTsKKyAgICB9CisKKyAgICB2b2lkIFJlbGVhc2Uodm9pZCkgY29uc3QgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFXzEoNCwgMCwgY19vZmZsb2FkX215b3JlbGVhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzKClcbiIsIF9fZnVuY19fKTsKKyAgICAgICAgQ2hlY2tSZXN1bHQoX19mdW5jX18sIG1fcmVsZWFzZSgpKTsKKyAgICB9CisKKyAgICB2b2lkIEhvc3RWYXJUYWJsZVByb3BhZ2F0ZSh2b2lkICp0YWJsZSwgaW50IG51bV9lbnRyaWVzKSBjb25zdCB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoNCwgIiVzKCVwLCAlZClcbiIsIF9fZnVuY19fLCB0YWJsZSwgbnVtX2VudHJpZXMpOworICAgICAgICBDaGVja1Jlc3VsdChfX2Z1bmNfXywgbV9ob3N0X3Zhcl90YWJsZV9wcm9wYWdhdGUodGFibGUsIG51bV9lbnRyaWVzKSk7CisgICAgfQorCisgICAgdm9pZCBIb3N0RnB0clRhYmxlUmVnaXN0ZXIodm9pZCAqdGFibGUsIGludCBudW1fZW50cmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3JkZXJlZCkgY29uc3QgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFXzEoNCwgMCwgY19vZmZsb2FkX215b3JlZ2lzdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcyglcCwgJWQsICVkKVxuIiwgX19mdW5jX18sIHRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9lbnRyaWVzLCBvcmRlcmVkKTsKKyAgICAgICAgQ2hlY2tSZXN1bHQoX19mdW5jX18sCisgICAgICAgICAgICAgICAgICAgIG1faG9zdF9mcHRyX3RhYmxlX3JlZ2lzdGVyKHRhYmxlLCBudW1fZW50cmllcywgb3JkZXJlZCkpOworICAgIH0KKworICAgIHZvaWQgUmVtb3RlVGh1bmtDYWxsKHZvaWQgKnRodW5rLCB2b2lkICphcmdzLCBpbnQgZGV2aWNlKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoNCwgIiVzKCVwLCAlcCwgJWQpXG4iLCBfX2Z1bmNfXywgdGh1bmssIGFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlKTsKKyAgICAgICAgQ2hlY2tSZXN1bHQoX19mdW5jX18sIG1fcmVtb3RlX3RodW5rX2NhbGwodGh1bmssIGFyZ3MsIGRldmljZSkpOworICAgIH0KKworICAgIE15b2lSRnVuY0NhbGxIYW5kbGUgUmVtb3RlQ2FsbChjaGFyICpmdW5jLCB2b2lkICphcmdzLCBpbnQgZGV2aWNlKSBjb25zdCB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoNCwgIiVzKCVzLCAlcCwgJWQpXG4iLCBfX2Z1bmNfXywgZnVuYywgYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UpOworICAgICAgICByZXR1cm4gbV9yZW1vdGVfY2FsbChmdW5jLCBhcmdzLCBkZXZpY2UpOworICAgIH0KKworICAgIHZvaWQgR2V0UmVzdWx0KE15b2lSRnVuY0NhbGxIYW5kbGUgaGFuZGxlKSBjb25zdCB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoNCwgIiVzKCVwKVxuIiwgX19mdW5jX18sIGhhbmRsZSk7CisgICAgICAgIENoZWNrUmVzdWx0KF9fZnVuY19fLCBtX2dldF9yZXN1bHQoaGFuZGxlKSk7CisgICAgfQorCitwcml2YXRlOgorICAgIHZvaWQgQ2hlY2tSZXN1bHQoY29uc3QgY2hhciAqZnVuYywgTXlvRXJyb3IgZXJyb3IpIGNvbnN0IHsKKyAgICAgICAgaWYgKGVycm9yICE9IE1ZT19TVUNDRVNTKSB7CisgICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX215b3dyYXBwZXJfY2hlY2tyZXN1bHQsIGZ1bmMsIGVycm9yKTsKKyAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KKyAgICB9CisKK3ByaXZhdGU6CisgICAgdm9pZCogbV9saWJfaGFuZGxlOworICAgIGJvb2wgIG1faXNfYXZhaWxhYmxlOworCisgICAgLy8gcG9pbnRlcnMgdG8gZnVuY3Rpb25zIGZyb20gbXlvIGxpYnJhcnkKKyAgICBNeW9FcnJvciAoKm1fbGliX2luaXQpKHZvaWQqLCB2b2lkKik7CisgICAgdm9pZCAgICAgKCptX2xpYl9maW5pKSh2b2lkKTsKKyAgICB2b2lkKiAgICAoKm1fc2hhcmVkX21hbGxvYykoc2l6ZV90KTsKKyAgICB2b2lkICAgICAoKm1fc2hhcmVkX2ZyZWUpKHZvaWQqKTsKKyAgICB2b2lkKiAgICAoKm1fc2hhcmVkX2FsaWduZWRfbWFsbG9jKShzaXplX3QsIHNpemVfdCk7CisgICAgdm9pZCAgICAgKCptX3NoYXJlZF9hbGlnbmVkX2ZyZWUpKHZvaWQqKTsKKyAgICBNeW9FcnJvciAoKm1fYWNxdWlyZSkodm9pZCk7CisgICAgTXlvRXJyb3IgKCptX3JlbGVhc2UpKHZvaWQpOworICAgIE15b0Vycm9yICgqbV9ob3N0X3Zhcl90YWJsZV9wcm9wYWdhdGUpKHZvaWQqLCBpbnQpOworICAgIE15b0Vycm9yICgqbV9ob3N0X2ZwdHJfdGFibGVfcmVnaXN0ZXIpKHZvaWQqLCBpbnQsIGludCk7CisgICAgTXlvRXJyb3IgKCptX3JlbW90ZV90aHVua19jYWxsKSh2b2lkKiwgdm9pZCosIGludCk7CisgICAgTXlvaVJGdW5jQ2FsbEhhbmRsZSAoKm1fcmVtb3RlX2NhbGwpKGNoYXIqLCB2b2lkKiwgaW50KTsKKyAgICBNeW9FcnJvciAoKm1fZ2V0X3Jlc3VsdCkoTXlvaVJGdW5jQ2FsbEhhbmRsZSk7Cit9OworCitib29sIE15b1dyYXBwZXI6OkxvYWRMaWJyYXJ5KHZvaWQpCit7CisjaWZuZGVmIFRBUkdFVF9XSU5OVAorICAgIGNvbnN0IGNoYXIgKmxpYl9uYW1lID0gImxpYm15by1jbGllbnQuc28iOworI2Vsc2UgLy8gVEFSR0VUX1dJTk5UCisgICAgY29uc3QgY2hhciAqbGliX25hbWUgPSAibXlvLWNsaWVudC5kbGwiOworI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorCisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiTG9hZGluZyBNWU8gbGlicmFyeSAlcyAuLi5cbiIsIGxpYl9uYW1lKTsKKworICAgIG1fbGliX2hhbmRsZSA9IERMX29wZW4obGliX25hbWUpOworICAgIGlmIChtX2xpYl9oYW5kbGUgPT0gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJGYWlsZWQgdG8gbG9hZCB0aGUgbGlicmFyeS4gZXJybm8gPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJubyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBtX2xpYl9pbml0ID0gKE15b0Vycm9yICgqKSh2b2lkKiwgdm9pZCopKQorICAgICAgICBETF9zeW0obV9saWJfaGFuZGxlLCAibXlvaUxpYkluaXQiLCBNWU9fVkVSU0lPTjEpOworICAgIGlmIChtX2xpYl9pbml0ID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gTVlPIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm15b2lMaWJJbml0Iik7CisgICAgICAgIFVubG9hZExpYnJhcnkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1fbGliX2ZpbmkgPSAodm9pZCAoKikodm9pZCkpCisgICAgICAgIERMX3N5bShtX2xpYl9oYW5kbGUsICJteW9pTGliRmluaSIsIE1ZT19WRVJTSU9OMSk7CisgICAgaWYgKG1fbGliX2ZpbmkgPT0gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJGYWlsZWQgdG8gZmluZCAlcyBpbiBNWU8gbGlicmFyeVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXlvaUxpYkZpbmkiKTsKKyAgICAgICAgVW5sb2FkTGlicmFyeSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbV9zaGFyZWRfbWFsbG9jID0gKHZvaWQqICgqKShzaXplX3QpKQorICAgICAgICBETF9zeW0obV9saWJfaGFuZGxlLCAibXlvU2hhcmVkTWFsbG9jIiwgTVlPX1ZFUlNJT04xKTsKKyAgICBpZiAobV9zaGFyZWRfbWFsbG9jID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gTVlPIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm15b1NoYXJlZE1hbGxvYyIpOworICAgICAgICBVbmxvYWRMaWJyYXJ5KCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBtX3NoYXJlZF9mcmVlID0gKHZvaWQgKCopKHZvaWQqKSkKKyAgICAgICAgRExfc3ltKG1fbGliX2hhbmRsZSwgIm15b1NoYXJlZEZyZWUiLCBNWU9fVkVSU0lPTjEpOworICAgIGlmIChtX3NoYXJlZF9mcmVlID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gTVlPIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm15b1NoYXJlZEZyZWUiKTsKKyAgICAgICAgVW5sb2FkTGlicmFyeSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbV9zaGFyZWRfYWxpZ25lZF9tYWxsb2MgPSAodm9pZCogKCopKHNpemVfdCwgc2l6ZV90KSkKKyAgICAgICAgRExfc3ltKG1fbGliX2hhbmRsZSwgIm15b1NoYXJlZEFsaWduZWRNYWxsb2MiLCBNWU9fVkVSU0lPTjEpOworICAgIGlmIChtX3NoYXJlZF9hbGlnbmVkX21hbGxvYyA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBmaW5kICVzIGluIE1ZTyBsaWJyYXJ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJteW9TaGFyZWRBbGlnbmVkTWFsbG9jIik7CisgICAgICAgIFVubG9hZExpYnJhcnkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1fc2hhcmVkX2FsaWduZWRfZnJlZSA9ICh2b2lkICgqKSh2b2lkKikpCisgICAgICAgIERMX3N5bShtX2xpYl9oYW5kbGUsICJteW9TaGFyZWRBbGlnbmVkRnJlZSIsIE1ZT19WRVJTSU9OMSk7CisgICAgaWYgKG1fc2hhcmVkX2FsaWduZWRfZnJlZSA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBmaW5kICVzIGluIE1ZTyBsaWJyYXJ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJteW9TaGFyZWRBbGlnbmVkRnJlZSIpOworICAgICAgICBVbmxvYWRMaWJyYXJ5KCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBtX2FjcXVpcmUgPSAoTXlvRXJyb3IgKCopKHZvaWQpKQorICAgICAgICBETF9zeW0obV9saWJfaGFuZGxlLCAibXlvQWNxdWlyZSIsIE1ZT19WRVJTSU9OMSk7CisgICAgaWYgKG1fYWNxdWlyZSA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBmaW5kICVzIGluIE1ZTyBsaWJyYXJ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJteW9BY3F1aXJlIik7CisgICAgICAgIFVubG9hZExpYnJhcnkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1fcmVsZWFzZSA9IChNeW9FcnJvciAoKikodm9pZCkpCisgICAgICAgIERMX3N5bShtX2xpYl9oYW5kbGUsICJteW9SZWxlYXNlIiwgTVlPX1ZFUlNJT04xKTsKKyAgICBpZiAobV9yZWxlYXNlID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gTVlPIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm15b1JlbGVhc2UiKTsKKyAgICAgICAgVW5sb2FkTGlicmFyeSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbV9ob3N0X3Zhcl90YWJsZV9wcm9wYWdhdGUgPSAoTXlvRXJyb3IgKCopKHZvaWQqLCBpbnQpKQorICAgICAgICBETF9zeW0obV9saWJfaGFuZGxlLCAibXlvaUhvc3RWYXJUYWJsZVByb3BhZ2F0ZSIsIE1ZT19WRVJTSU9OMSk7CisgICAgaWYgKG1faG9zdF92YXJfdGFibGVfcHJvcGFnYXRlID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gTVlPIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm15b2lIb3N0VmFyVGFibGVQcm9wYWdhdGUiKTsKKyAgICAgICAgVW5sb2FkTGlicmFyeSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbV9ob3N0X2ZwdHJfdGFibGVfcmVnaXN0ZXIgPSAoTXlvRXJyb3IgKCopKHZvaWQqLCBpbnQsIGludCkpCisgICAgICAgIERMX3N5bShtX2xpYl9oYW5kbGUsICJteW9pSG9zdEZwdHJUYWJsZVJlZ2lzdGVyIiwgTVlPX1ZFUlNJT04xKTsKKyAgICBpZiAobV9ob3N0X2ZwdHJfdGFibGVfcmVnaXN0ZXIgPT0gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJGYWlsZWQgdG8gZmluZCAlcyBpbiBNWU8gbGlicmFyeVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXlvaUhvc3RGcHRyVGFibGVSZWdpc3RlciIpOworICAgICAgICBVbmxvYWRMaWJyYXJ5KCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBtX3JlbW90ZV90aHVua19jYWxsID0gKE15b0Vycm9yICgqKSh2b2lkKiwgdm9pZCosIGludCkpCisgICAgICAgIERMX3N5bShtX2xpYl9oYW5kbGUsICJteW9pUmVtb3RlVGh1bmtDYWxsIiwgTVlPX1ZFUlNJT04xKTsKKyAgICBpZiAobV9yZW1vdGVfdGh1bmtfY2FsbCA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBmaW5kICVzIGluIE1ZTyBsaWJyYXJ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJteW9pUmVtb3RlVGh1bmtDYWxsIik7CisgICAgICAgIFVubG9hZExpYnJhcnkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1fcmVtb3RlX2NhbGwgPSAoTXlvaVJGdW5jQ2FsbEhhbmRsZSAoKikoY2hhciosIHZvaWQqLCBpbnQpKQorICAgICAgICBETF9zeW0obV9saWJfaGFuZGxlLCAibXlvaVJlbW90ZUNhbGwiLCBNWU9fVkVSU0lPTjEpOworICAgIGlmIChtX3JlbW90ZV9jYWxsID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gTVlPIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm15b2lSZW1vdGVDYWxsIik7CisgICAgICAgIFVubG9hZExpYnJhcnkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1fZ2V0X3Jlc3VsdCA9IChNeW9FcnJvciAoKikoTXlvaVJGdW5jQ2FsbEhhbmRsZSkpCisgICAgICAgIERMX3N5bShtX2xpYl9oYW5kbGUsICJteW9pR2V0UmVzdWx0IiwgTVlPX1ZFUlNJT04xKTsKKyAgICBpZiAobV9nZXRfcmVzdWx0ID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gTVlPIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm15b2lHZXRSZXN1bHQiKTsKKyAgICAgICAgVW5sb2FkTGlicmFyeSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiVGhlIGxpYnJhcnkgd2FzIHN1Y2Nlc3NmdWxseSBsb2FkZWRcbiIpOworCisgICAgbV9pc19hdmFpbGFibGUgPSB0cnVlOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIG15b19pc19hdmFpbGFibGU7CitzdGF0aWMgTXlvV3JhcHBlciBteW9fd3JhcHBlcjsKKworc3RydWN0IE15b1RhYmxlCit7CisgICAgTXlvVGFibGUoU2hhcmVkVGFibGVFbnRyeSAqdGFiLCBpbnQgbGVuKSA6IHZhcl90YWIodGFiKSwgdmFyX3RhYl9sZW4obGVuKQorICAgIHt9CisKKyAgICBTaGFyZWRUYWJsZUVudHJ5KiAgIHZhcl90YWI7CisgICAgaW50ICAgICAgICAgICAgICAgICB2YXJfdGFiX2xlbjsKK307CisKK3R5cGVkZWYgc3RkOjpsaXN0PE15b1RhYmxlPiBNeW9UYWJsZUxpc3Q7CitzdGF0aWMgTXlvVGFibGVMaXN0IF9fbXlvX3RhYmxlX2xpc3Q7CitzdGF0aWMgbXV0ZXhfdCAgICAgIF9fbXlvX3RhYmxlX2xvY2s7CitzdGF0aWMgYm9vbCAgICAgICAgIF9fbXlvX3RhYmxlcyA9IGZhbHNlOworCitzdGF0aWMgdm9pZCBfX29mZmxvYWRfbXlvX3NoYXJlZF90YWJsZV9yZWdpc3RlcihTaGFyZWRUYWJsZUVudHJ5ICplbnRyeSk7CitzdGF0aWMgdm9pZCBfX29mZmxvYWRfbXlvX3NoYXJlZF9pbml0X3RhYmxlX3JlZ2lzdGVyKEluaXRUYWJsZUVudHJ5KiBlbnRyeSk7CitzdGF0aWMgdm9pZCBfX29mZmxvYWRfbXlvX2ZwdHJfdGFibGVfcmVnaXN0ZXIoRnB0clRhYmxlRW50cnkgKmVudHJ5KTsKKworc3RhdGljIHZvaWQgX19vZmZsb2FkX215b0xvYWRMaWJyYXJ5X29uY2Uodm9pZCkKK3sKKyAgICBpZiAoX19vZmZsb2FkX2luaXRfbGlicmFyeSgpKSB7CisgICAgICAgIG15b193cmFwcGVyLkxvYWRMaWJyYXJ5KCk7CisgICAgfQorfQorCitzdGF0aWMgYm9vbCBfX29mZmxvYWRfbXlvTG9hZExpYnJhcnkodm9pZCkKK3sKKyAgICBzdGF0aWMgT2ZmbG9hZE9uY2VDb250cm9sIGN0cmwgPSBPRkZMT0FEX09OQ0VfQ09OVFJPTF9JTklUOworICAgIF9fb2ZmbG9hZF9ydW5fb25jZSgmY3RybCwgX19vZmZsb2FkX215b0xvYWRMaWJyYXJ5X29uY2UpOworCisgICAgcmV0dXJuIG15b193cmFwcGVyLmlzX2F2YWlsYWJsZSgpOworfQorCitzdGF0aWMgdm9pZCBfX29mZmxvYWRfbXlvSW5pdF9vbmNlKHZvaWQpCit7CisgICAgaWYgKCFfX29mZmxvYWRfbXlvTG9hZExpYnJhcnkoKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gaW5pdGlhbGl6ZSBhbGwgZGV2aWNlcworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWljX2VuZ2luZXNfdG90YWw7IGkrKykgeworICAgICAgICBtaWNfZW5naW5lc1tpXS5pbml0KCk7CisgICAgfQorCisgICAgLy8gbG9hZCBhbmQgaW5pdGlhbGl6ZSBNWU8gbGlicmFyeQorICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkluaXRpYWxpemluZyBNWU8gbGlicmFyeSAuLi5cbiIpOworCisgICAgQ09JRVZFTlQgZXZlbnRzW01JQ19FTkdJTkVTX01BWF07CisgICAgTXlvaVVzZXJQYXJhbXMgcGFyYW1zW01JQ19FTkdJTkVTX01BWCsxXTsKKworICAgIC8vIGxvYWQgdGFyZ2V0IGxpYnJhcnkgdG8gYWxsIGRldmljZXMKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1pY19lbmdpbmVzX3RvdGFsOyBpKyspIHsKKyAgICAgICAgbWljX2VuZ2luZXNbaV0uaW5pdF9teW8oJmV2ZW50c1tpXSk7CisKKyAgICAgICAgcGFyYW1zW2ldLnR5cGUgPSBNWU9JX1VTRVJQQVJBTVNfREVWSUQ7CisgICAgICAgIHBhcmFtc1tpXS5ub2RlaWQgPSBtaWNfZW5naW5lc1tpXS5nZXRfcGh5c2ljYWxfaW5kZXgoKSArIDE7CisgICAgfQorCisgICAgcGFyYW1zW21pY19lbmdpbmVzX3RvdGFsXS50eXBlID0gTVlPSV9VU0VSUEFSQU1TX0xBU1RfTVNHOworCisgICAgLy8gaW5pdGlhbGl6ZSBteW8gcnVudGltZSBvbiBob3N0CisgICAgbXlvX3dyYXBwZXIuTGliSW5pdChwYXJhbXMsIDApOworCisgICAgLy8gd2FpdCBmb3IgdGhlIHRhcmdldCBpbml0IGNhbGxzIHRvIGZpbmlzaAorICAgIENPSVJFU1VMVCByZXM7CisgICAgcmVzID0gQ09JOjpFdmVudFdhaXQobWljX2VuZ2luZXNfdG90YWwsIGV2ZW50cywgLTEsIDEsIDAsIDApOworICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX2V2ZW50X3dhaXQsIHJlcyk7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorCisgICAgbXlvX2lzX2F2YWlsYWJsZSA9IHRydWU7CisKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJJbml0aWFsaXppbmcgTVlPIGxpYnJhcnkgLi4uIGRvbmVcbiIpOworfQorCitzdGF0aWMgYm9vbCBfX29mZmxvYWRfbXlvSW5pdCh2b2lkKQoreworICAgIHN0YXRpYyBPZmZsb2FkT25jZUNvbnRyb2wgY3RybCA9IE9GRkxPQURfT05DRV9DT05UUk9MX0lOSVQ7CisgICAgX19vZmZsb2FkX3J1bl9vbmNlKCZjdHJsLCBfX29mZmxvYWRfbXlvSW5pdF9vbmNlKTsKKworICAgIC8vIHJlZ2lzdGVyIHBlbmRpbmcgc2hhcmVkIHZhciB0YWJsZXMKKyAgICBpZiAobXlvX2lzX2F2YWlsYWJsZSAmJiBfX215b190YWJsZXMpIHsKKyAgICAgICAgbXV0ZXhfbG9ja2VyX3QgbG9ja2VyKF9fbXlvX3RhYmxlX2xvY2spOworCisgICAgICAgIGlmIChfX215b190YWJsZXMpIHsKKyAgICAgICAgICAgIC8vICBSZWdpc3RlciB0YWJsZXMgd2l0aCBNWU8gc28gaXQgY2FuIHByb3BhZ2F0ZSB0byB0YXJnZXQuCisgICAgICAgICAgICBmb3IoTXlvVGFibGVMaXN0Ojpjb25zdF9pdGVyYXRvciBpdCA9IF9fbXlvX3RhYmxlX2xpc3QuYmVnaW4oKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBfX215b190YWJsZV9saXN0LmVuZCgpOyArK2l0KSB7CisjaWZkZWYgVEFSR0VUX1dJTk5UCisgICAgICAgICAgICAgICAgZm9yIChTaGFyZWRUYWJsZUVudHJ5ICplbnRyeSA9IGl0LT52YXJfdGFiOworICAgICAgICAgICAgICAgICAgICAgZW50cnktPnZhck5hbWUgIT0gTVlPX1RBQkxFX0VORF9NQVJLRVIoKTsgZW50cnkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoZW50cnktPnZhck5hbWUgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbXlvX3dyYXBwZXIuSG9zdFZhclRhYmxlUHJvcGFnYXRlKGVudHJ5LCAxKTsKKyAgICAgICAgICAgICAgICB9CisjZWxzZSAvLyBUQVJHRVRfV0lOTlQKKyAgICAgICAgICAgICAgICBteW9fd3JhcHBlci5Ib3N0VmFyVGFibGVQcm9wYWdhdGUoaXQtPnZhcl90YWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0LT52YXJfdGFiX2xlbik7CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIF9fbXlvX3RhYmxlX2xpc3QuY2xlYXIoKTsKKyAgICAgICAgICAgIF9fbXlvX3RhYmxlcyA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG15b19pc19hdmFpbGFibGU7Cit9CisKK3N0YXRpYyBib29sIHNoYXJlZF90YWJsZV9lbnRyaWVzKAorICAgIFNoYXJlZFRhYmxlRW50cnkgKmVudHJ5CispCit7CisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgzLCAiJXMoJXApXG4iLCBfX2Z1bmNfXywgZW50cnkpOworCisgICAgZm9yICg7IGVudHJ5LT52YXJOYW1lICE9IE1ZT19UQUJMRV9FTkRfTUFSS0VSKCk7IGVudHJ5KyspIHsKKyNpZmRlZiBUQVJHRVRfV0lOTlQKKyAgICAgICAgaWYgKGVudHJ5LT52YXJOYW1lID09IDApIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9vbCBmcHRyX3RhYmxlX2VudHJpZXMoCisgICAgRnB0clRhYmxlRW50cnkgKmVudHJ5CispCit7CisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgzLCAiJXMoJXApXG4iLCBfX2Z1bmNfXywgZW50cnkpOworCisgICAgZm9yICg7IGVudHJ5LT5mdW5jTmFtZSAhPSBNWU9fVEFCTEVfRU5EX01BUktFUigpOyBlbnRyeSsrKSB7CisjaWZkZWYgVEFSR0VUX1dJTk5UCisgICAgICAgIGlmIChlbnRyeS0+ZnVuY05hbWUgPT0gMCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBfX29mZmxvYWRfbXlvUmVnaXN0ZXJUYWJsZXMoCisgICAgSW5pdFRhYmxlRW50cnkqIGluaXRfdGFibGUsCisgICAgU2hhcmVkVGFibGVFbnRyeSAqc2hhcmVkX3RhYmxlLAorICAgIEZwdHJUYWJsZUVudHJ5ICpmcHRyX3RhYmxlCispCit7CisgICAgLy8gY2hlY2sgd2hldGhlciB3ZSBuZWVkIHRvIGluaXRpYWxpemUgTVlPIGxpYnJhcnkuIEl0IGlzCisgICAgLy8gaW5pdGlhbGl6ZWQgb25seSBpZiBhdCBsZWFzdCBvbmUgbXlvIHRhYmxlIGlzIG5vdCBlbXB0eQorICAgIGlmIChzaGFyZWRfdGFibGVfZW50cmllcyhzaGFyZWRfdGFibGUpIHx8IGZwdHJfdGFibGVfZW50cmllcyhmcHRyX3RhYmxlKSkgeworICAgICAgICAvLyBtYWtlIHN1cmUgbXlvIGxpYnJhcnkgaXMgbG9hZGVkCisgICAgICAgIF9fb2ZmbG9hZF9teW9Mb2FkTGlicmFyeSgpOworCisgICAgICAgIC8vIHJlZ2lzdGVyIHRhYmxlcworICAgICAgICBfX29mZmxvYWRfbXlvX3NoYXJlZF90YWJsZV9yZWdpc3RlcihzaGFyZWRfdGFibGUpOworICAgICAgICBfX29mZmxvYWRfbXlvX2ZwdHJfdGFibGVfcmVnaXN0ZXIoZnB0cl90YWJsZSk7CisgICAgICAgIF9fb2ZmbG9hZF9teW9fc2hhcmVkX2luaXRfdGFibGVfcmVnaXN0ZXIoaW5pdF90YWJsZSk7CisgICAgfQorfQorCit2b2lkIF9fb2ZmbG9hZF9teW9GaW5pKHZvaWQpCit7CisgICAgaWYgKG15b19pc19hdmFpbGFibGUpIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgzLCAiJXNcbiIsIF9fZnVuY19fKTsKKworICAgICAgICBDT0lFVkVOVCBldmVudHNbTUlDX0VOR0lORVNfTUFYXTsKKworICAgICAgICAvLyBraWNrIG9mZiBteW9pTGliRmluaSBjYWxscyBvbiBhbGwgZGV2aWNlcworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1pY19lbmdpbmVzX3RvdGFsOyBpKyspIHsKKyAgICAgICAgICAgIG1pY19lbmdpbmVzW2ldLmZpbmlfbXlvKCZldmVudHNbaV0pOworICAgICAgICB9CisKKyAgICAgICAgLy8gY2xlYW51cCBteW8gcnVudGltZSBvbiBob3N0CisgICAgICAgIG15b193cmFwcGVyLkxpYkZpbmkoKTsKKworICAgICAgICAvLyB3YWl0IGZvciB0aGUgdGFyZ2V0IGZpbmkgY2FsbHMgdG8gZmluaXNoCisgICAgICAgIENPSVJFU1VMVCByZXM7CisgICAgICAgIHJlcyA9IENPSTo6RXZlbnRXYWl0KG1pY19lbmdpbmVzX3RvdGFsLCBldmVudHMsIC0xLCAxLCAwLCAwKTsKKyAgICAgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeworICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX2V2ZW50X3dhaXQsIHJlcyk7CisgICAgICAgICAgICBleGl0KDEpOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBfX29mZmxvYWRfbXlvX3NoYXJlZF90YWJsZV9yZWdpc3RlcigKKyAgICBTaGFyZWRUYWJsZUVudHJ5ICplbnRyeQorKQoreworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMywgIiVzKCVwKVxuIiwgX19mdW5jX18sIGVudHJ5KTsKKworICAgIFNoYXJlZFRhYmxlRW50cnkgKnN0YXJ0ID0gZW50cnk7CisgICAgaW50IGVudHJpZXMgPSAwOworCisgICAgLy8gYWxsb2NhdGUgc2hhcmVkIG1lbW9yeSBmb3IgdmFycworICAgIGZvciAoOyBlbnRyeS0+dmFyTmFtZSAhPSBNWU9fVEFCTEVfRU5EX01BUktFUigpOyBlbnRyeSsrKSB7CisjaWZkZWYgVEFSR0VUX1dJTk5UCisgICAgICAgIGlmIChlbnRyeS0+dmFyTmFtZSA9PSAwKSB7CisgICAgICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDQsICJza2lwIHJlZ2lzdGVyaW5nIGEgTlVMTCBNeW9TaGFyZWRUYWJsZSBlbnRyeVxuIik7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorCisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoNCwgInJlZ2lzdGVyaW5nIE15b1NoYXJlZFRhYmxlIGVudHJ5IGZvciAlcyBAJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnktPnZhck5hbWUsIGVudHJ5KTsKKworICAgICAgICAvLyBJbnZva2UgdGhlIGZ1bmN0aW9uIHRvIGNyZWF0ZSBzaGFyZWQgbWVtb3J5CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCgqKSh2b2lkKT4oZW50cnktPnNoYXJlZEFkZHIpKCk7CisgICAgICAgIGVudHJpZXMrKzsKKyAgICB9CisKKyAgICAvLyBhbmQgdGFibGUgdG8gdGhlIGxpc3QgaWYgaXQgaXMgbm90IGVtcHR5CisgICAgaWYgKGVudHJpZXMgPiAwKSB7CisgICAgICAgIG11dGV4X2xvY2tlcl90IGxvY2tlcihfX215b190YWJsZV9sb2NrKTsKKyAgICAgICAgX19teW9fdGFibGVfbGlzdC5wdXNoX2JhY2soTXlvVGFibGUoc3RhcnQsIGVudHJpZXMpKTsKKyAgICAgICAgX19teW9fdGFibGVzID0gdHJ1ZTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIF9fb2ZmbG9hZF9teW9fc2hhcmVkX2luaXRfdGFibGVfcmVnaXN0ZXIoSW5pdFRhYmxlRW50cnkqIGVudHJ5KQoreworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMywgIiVzKCVwKVxuIiwgX19mdW5jX18sIGVudHJ5KTsKKworI2lmZGVmIFRBUkdFVF9XSU5OVAorICAgIGZvciAoOyBlbnRyeS0+ZnVuY05hbWUgIT0gTVlPX1RBQkxFX0VORF9NQVJLRVIoKTsgZW50cnkrKykgeworICAgICAgICBpZiAoZW50cnktPmZ1bmNOYW1lID09IDApIHsKKyAgICAgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoNCwgInNraXAgcmVnaXN0ZXJpbmcgYSBOVUxMIE15b1NoYXJlZEluaXQgZW50cnlcbiIpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvLyAgSW52b2tlIHRoZSBmdW5jdGlvbiB0byBpbml0IHRoZSBzaGFyZWQgbWVtb3J5CisgICAgICAgIGVudHJ5LT5mdW5jKCk7CisgICAgfQorI2Vsc2UgLy8gVEFSR0VUX1dJTk5UCisgICAgZm9yICg7IGVudHJ5LT5mdW5jICE9IDA7IGVudHJ5KyspIHsKKyAgICAgICAgLy8gSW52b2tlIHRoZSBmdW5jdGlvbiB0byBpbml0IHRoZSBzaGFyZWQgbWVtb3J5CisgICAgICAgIGVudHJ5LT5mdW5jKCk7CisgICAgfQorI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorfQorCitzdGF0aWMgdm9pZCBfX29mZmxvYWRfbXlvX2ZwdHJfdGFibGVfcmVnaXN0ZXIoCisgICAgRnB0clRhYmxlRW50cnkgKmVudHJ5CispCit7CisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgzLCAiJXMoJXApXG4iLCBfX2Z1bmNfXywgZW50cnkpOworCisgICAgRnB0clRhYmxlRW50cnkgKnN0YXJ0ID0gZW50cnk7CisgICAgaW50IGVudHJpZXMgPSAwOworCisgICAgZm9yICg7IGVudHJ5LT5mdW5jTmFtZSAhPSBNWU9fVEFCTEVfRU5EX01BUktFUigpOyBlbnRyeSsrKSB7CisjaWZkZWYgVEFSR0VUX1dJTk5UCisgICAgICAgIGlmIChlbnRyeS0+ZnVuY05hbWUgPT0gMCkgeworICAgICAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSg0LCAic2tpcCByZWdpc3RlcmluZyBhIE5VTEwgTXlvRnB0clRhYmxlIGVudHJ5XG4iKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisKKyAgICAgICAgaWYgKCFteW9fd3JhcHBlci5pc19hdmFpbGFibGUoKSkgeworICAgICAgICAgICAgKihzdGF0aWNfY2FzdDx2b2lkKio+KGVudHJ5LT5sb2NhbFRodW5rQWRkcikpID0gZW50cnktPmZ1bmNBZGRyOworICAgICAgICB9CisKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSg0LCAicmVnaXN0ZXJpbmcgTXlvRnB0clRhYmxlIGVudHJ5IGZvciAlcyBAJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnktPmZ1bmNOYW1lLCBlbnRyeSk7CisKKyNpZmRlZiBUQVJHRVRfV0lOTlQKKyAgICAgICAgaWYgKG15b193cmFwcGVyLmlzX2F2YWlsYWJsZSgpKSB7CisgICAgICAgICAgICBteW9fd3JhcHBlci5Ib3N0RnB0clRhYmxlUmVnaXN0ZXIoZW50cnksIDEsIGZhbHNlKTsKKyAgICAgICAgfQorI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorCisgICAgICAgIGVudHJpZXMrKzsKKyAgICB9CisKKyNpZm5kZWYgVEFSR0VUX1dJTk5UCisgICAgaWYgKG15b193cmFwcGVyLmlzX2F2YWlsYWJsZSgpICYmIGVudHJpZXMgPiAwKSB7CisgICAgICAgIG15b193cmFwcGVyLkhvc3RGcHRyVGFibGVSZWdpc3RlcihzdGFydCwgZW50cmllcywgZmFsc2UpOworICAgIH0KKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKK30KKworZXh0ZXJuICJDIiBpbnQgX19vZmZsb2FkX215b0lzQXZhaWxhYmxlKGludCB0YXJnZXRfbnVtYmVyKQoreworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMywgIiVzKCVkKVxuIiwgX19mdW5jX18sIHRhcmdldF9udW1iZXIpOworCisgICAgaWYgKHRhcmdldF9udW1iZXIgPj0gLTIpIHsKKyAgICAgICAgYm9vbCBpc19kZWZhdWx0X251bWJlciA9ICh0YXJnZXRfbnVtYmVyID09IC0yKTsKKworICAgICAgICBpZiAoX19vZmZsb2FkX215b0luaXQoKSkgeworICAgICAgICAgICAgaWYgKHRhcmdldF9udW1iZXIgPj0gMCkgeworICAgICAgICAgICAgICAgIC8vIFVzZXIgcHJvdmlkZWQgdGhlIGRldmljZSBudW1iZXIKKyAgICAgICAgICAgICAgICBpbnQgbnVtID0gdGFyZ2V0X251bWJlciAlIG1pY19lbmdpbmVzX3RvdGFsOworCisgICAgICAgICAgICAgICAgLy8gcmVzZXJ2ZSBkZXZpY2UgaW4gT1JTTAorICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIgPSBPUlNMOjpyZXNlcnZlKG51bSkgPyBudW0gOiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIC8vIHRyeSB0byB1c2UgZGV2aWNlIDAKKyAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyID0gT1JTTDo6cmVzZXJ2ZSgwKSA/IDAgOiAtMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gbWFrZSBzdXJlIGRldmljZSBpcyBpbml0aWFsaXplZAorICAgICAgICAgICAgaWYgKHRhcmdldF9udW1iZXIgPj0gMCkgeworICAgICAgICAgICAgICAgIG1pY19lbmdpbmVzW3RhcmdldF9udW1iZXJdLmluaXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8vIGZhbGxiYWNrIHRvIENQVQorICAgICAgICAgICAgdGFyZ2V0X251bWJlciA9IC0xOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRhcmdldF9udW1iZXIgPCAwICYmICFpc19kZWZhdWx0X251bWJlcikgeworICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX2RldmljZV9pc19ub3RfYXZhaWxhYmxlKTsKKyAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19pbnZhbGlkX2RldmljZV9udW1iZXIpOworICAgICAgICBleGl0KDEpOworICAgIH0KKworICAgIHJldHVybiB0YXJnZXRfbnVtYmVyOworfQorCitleHRlcm4gIkMiIHZvaWQgX19vZmZsb2FkX215b2lSZW1vdGVJVGh1bmtDYWxsKAorICAgIHZvaWQgKnRodW5rLAorICAgIHZvaWQgKmFyZywKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKQoreworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMywgIiVzKCVwLCAlcCwgJWQpXG4iLCBfX2Z1bmNfXywgdGh1bmssIGFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIpOworCisgICAgbXlvX3dyYXBwZXIuUmVsZWFzZSgpOworICAgIG15b193cmFwcGVyLlJlbW90ZVRodW5rQ2FsbCh0aHVuaywgYXJnLCB0YXJnZXRfbnVtYmVyKTsKKyAgICBteW9fd3JhcHBlci5BY3F1aXJlKCk7CisKKyAgICBPUlNMOjpyZWxlYXNlKHRhcmdldF9udW1iZXIpOworfQorCitleHRlcm4gIkMiIHZvaWQqIF9PZmZsb2FkX3NoYXJlZF9tYWxsb2Moc2l6ZV90IHNpemUpCit7CisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgzLCAiJXMoJWxsZClcbiIsIF9fZnVuY19fLCBzaXplKTsKKworICAgIGlmIChfX29mZmxvYWRfbXlvTG9hZExpYnJhcnkoKSkgeworICAgICAgICByZXR1cm4gbXlvX3dyYXBwZXIuU2hhcmVkTWFsbG9jKHNpemUpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcmV0dXJuIG1hbGxvYyhzaXplKTsKKyAgICB9Cit9CisKK2V4dGVybiAiQyIgdm9pZCBfT2ZmbG9hZF9zaGFyZWRfZnJlZSh2b2lkICpwdHIpCit7CisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgzLCAiJXMoJXApXG4iLCBfX2Z1bmNfXywgcHRyKTsKKworICAgIGlmIChfX29mZmxvYWRfbXlvTG9hZExpYnJhcnkoKSkgeworICAgICAgICBteW9fd3JhcHBlci5TaGFyZWRGcmVlKHB0cik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBmcmVlKHB0cik7CisgICAgfQorfQorCitleHRlcm4gIkMiIHZvaWQqIF9PZmZsb2FkX3NoYXJlZF9hbGlnbmVkX21hbGxvYyhzaXplX3Qgc2l6ZSwgc2l6ZV90IGFsaWduKQoreworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMywgIiVzKCVsbGQsICVsbGQpXG4iLCBfX2Z1bmNfXywgc2l6ZSwgYWxpZ24pOworCisgICAgaWYgKF9fb2ZmbG9hZF9teW9Mb2FkTGlicmFyeSgpKSB7CisgICAgICAgIHJldHVybiBteW9fd3JhcHBlci5TaGFyZWRBbGlnbmVkTWFsbG9jKHNpemUsIGFsaWduKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmIChhbGlnbiA8IHNpemVvZih2b2lkKikpIHsKKyAgICAgICAgICAgIGFsaWduID0gc2l6ZW9mKHZvaWQqKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX21tX21hbGxvYyhzaXplLCBhbGlnbik7CisgICAgfQorfQorCitleHRlcm4gIkMiIHZvaWQgX09mZmxvYWRfc2hhcmVkX2FsaWduZWRfZnJlZSh2b2lkICpwdHIpCit7CisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgzLCAiJXMoJXApXG4iLCBfX2Z1bmNfXywgcHRyKTsKKworICAgIGlmIChfX29mZmxvYWRfbXlvTG9hZExpYnJhcnkoKSkgeworICAgICAgICBteW9fd3JhcHBlci5TaGFyZWRBbGlnbmVkRnJlZShwdHIpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgX21tX2ZyZWUocHRyKTsKKyAgICB9Cit9CisKK2V4dGVybiAiQyIgdm9pZCBfX2ludGVsX2NpbGtfZm9yXzMyX29mZmxvYWQoCisgICAgaW50IHNpemUsCisgICAgdm9pZCAoKmNvcHlfY29uc3RydWN0b3IpKHZvaWQqLCB2b2lkKiksCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgdm9pZCAqcmFkZHIsCisgICAgdm9pZCAqY2xvc3VyZV9vYmplY3QsCisgICAgdW5zaWduZWQgaW50IGl0ZXJzLAorICAgIHVuc2lnbmVkIGludCBncmFpbl9zaXplKQoreworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMywgIiVzXG4iLCBfX2Z1bmNfXyk7CisKKyAgICB0YXJnZXRfbnVtYmVyID0gX19vZmZsb2FkX215b0lzQXZhaWxhYmxlKHRhcmdldF9udW1iZXIpOworICAgIGlmICh0YXJnZXRfbnVtYmVyID49IDApIHsKKyAgICAgICAgc3RydWN0IFMgeworICAgICAgICAgICAgdm9pZCAqTTE7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgTTI7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgTTM7CisgICAgICAgICAgICBjaGFyIGNsb3N1cmVbXTsKKyAgICAgICAgfSAqYXJnczsKKworICAgICAgICBhcmdzID0gKHN0cnVjdCBTKikgX09mZmxvYWRfc2hhcmVkX21hbGxvYyhzaXplb2Yoc3RydWN0IFMpICsgc2l6ZSk7CisgICAgICAgIGFyZ3MtPk0xID0gcmFkZHI7CisgICAgICAgIGFyZ3MtPk0yID0gaXRlcnM7CisgICAgICAgIGFyZ3MtPk0zID0gZ3JhaW5fc2l6ZTsKKworICAgICAgICBpZiAoY29weV9jb25zdHJ1Y3RvciA9PSAwKSB7CisgICAgICAgICAgICBtZW1jcHkoYXJncy0+Y2xvc3VyZSwgY2xvc3VyZV9vYmplY3QsIHNpemUpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgY29weV9jb25zdHJ1Y3RvcihhcmdzLT5jbG9zdXJlLCBjbG9zdXJlX29iamVjdCk7CisgICAgICAgIH0KKworICAgICAgICBteW9fd3JhcHBlci5SZWxlYXNlKCk7CisgICAgICAgIG15b193cmFwcGVyLkdldFJlc3VsdCgKKyAgICAgICAgICAgIG15b193cmFwcGVyLlJlbW90ZUNhbGwoIl9faW50ZWxfY2lsa19mb3JfMzJfb2ZmbG9hZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MsIHRhcmdldF9udW1iZXIpCisgICAgICAgICk7CisgICAgICAgIG15b193cmFwcGVyLkFjcXVpcmUoKTsKKworICAgICAgICBfT2ZmbG9hZF9zaGFyZWRfZnJlZShhcmdzKTsKKworICAgICAgICBPUlNMOjpyZWxlYXNlKHRhcmdldF9udW1iZXIpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgX19jaWxrcnRzX2NpbGtfZm9yXzMyKHJhZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc3VyZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYWluX3NpemUpOworICAgIH0KK30KKworZXh0ZXJuICJDIiB2b2lkIF9faW50ZWxfY2lsa19mb3JfNjRfb2ZmbG9hZCgKKyAgICBpbnQgc2l6ZSwKKyAgICB2b2lkICgqY29weV9jb25zdHJ1Y3Rvcikodm9pZCosIHZvaWQqKSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICB2b2lkICpyYWRkciwKKyAgICB2b2lkICpjbG9zdXJlX29iamVjdCwKKyAgICB1aW50NjRfdCBpdGVycywKKyAgICB1aW50NjRfdCBncmFpbl9zaXplKQoreworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMywgIiVzXG4iLCBfX2Z1bmNfXyk7CisKKyAgICB0YXJnZXRfbnVtYmVyID0gX19vZmZsb2FkX215b0lzQXZhaWxhYmxlKHRhcmdldF9udW1iZXIpOworICAgIGlmICh0YXJnZXRfbnVtYmVyID49IDApIHsKKyAgICAgICAgc3RydWN0IFMgeworICAgICAgICAgICAgdm9pZCAqTTE7CisgICAgICAgICAgICB1aW50NjRfdCBNMjsKKyAgICAgICAgICAgIHVpbnQ2NF90IE0zOworICAgICAgICAgICAgY2hhciBjbG9zdXJlW107CisgICAgICAgIH0gKmFyZ3M7CisKKyAgICAgICAgYXJncyA9IChzdHJ1Y3QgUyopIF9PZmZsb2FkX3NoYXJlZF9tYWxsb2Moc2l6ZW9mKHN0cnVjdCBTKSArIHNpemUpOworICAgICAgICBhcmdzLT5NMSA9IHJhZGRyOworICAgICAgICBhcmdzLT5NMiA9IGl0ZXJzOworICAgICAgICBhcmdzLT5NMyA9IGdyYWluX3NpemU7CisKKyAgICAgICAgaWYgKGNvcHlfY29uc3RydWN0b3IgPT0gMCkgeworICAgICAgICAgICAgbWVtY3B5KGFyZ3MtPmNsb3N1cmUsIGNsb3N1cmVfb2JqZWN0LCBzaXplKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGNvcHlfY29uc3RydWN0b3IoYXJncy0+Y2xvc3VyZSwgY2xvc3VyZV9vYmplY3QpOworICAgICAgICB9CisKKyAgICAgICAgbXlvX3dyYXBwZXIuUmVsZWFzZSgpOworICAgICAgICBteW9fd3JhcHBlci5HZXRSZXN1bHQoCisgICAgICAgICAgICBteW9fd3JhcHBlci5SZW1vdGVDYWxsKCJfX2ludGVsX2NpbGtfZm9yXzY0X29mZmxvYWQiLCBhcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyKQorICAgICAgICApOworICAgICAgICBteW9fd3JhcHBlci5BY3F1aXJlKCk7CisKKyAgICAgICAgX09mZmxvYWRfc2hhcmVkX2ZyZWUoYXJncyk7CisKKyAgICAgICAgT1JTTDo6cmVsZWFzZSh0YXJnZXRfbnVtYmVyKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIF9fY2lsa3J0c19jaWxrX2Zvcl82NChyYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3N1cmVfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFpbl9zaXplKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX215b19ob3N0LmggYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX215b19ob3N0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJhNjFmNAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfbXlvX2hvc3QuaApAQCAtMCwwICsxLDgwIEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgT0ZGTE9BRF9NWU9fSE9TVF9IX0lOQ0xVREVECisjZGVmaW5lIE9GRkxPQURfTVlPX0hPU1RfSF9JTkNMVURFRAorCisjaW5jbHVkZSA8bXlvdHlwZXMuaD4KKyNpbmNsdWRlIDxteW9pbXBsLmg+CisjaW5jbHVkZSA8bXlvLmg+CisjaW5jbHVkZSAib2ZmbG9hZC5oIgorCit0eXBlZGVmIE15b2lTaGFyZWRWYXJFbnRyeSAgICAgIFNoYXJlZFRhYmxlRW50cnk7CisvL3R5cGVkZWYgTXlvaUhvc3RTaGFyZWRGcHRyRW50cnkgRnB0clRhYmxlRW50cnk7Cit0eXBlZGVmIHN0cnVjdCB7CisgICAgLy8hIEZ1bmN0aW9uIE5hbWUKKyAgICBjb25zdCBjaGFyICpmdW5jTmFtZTsKKyAgICAvLyEgRnVuY3Rpb24gQWRkcmVzcworICAgIHZvaWQgKmZ1bmNBZGRyOworICAgIC8vISBMb2NhbCBUaHVuayBBZGRyZXNzCisgICAgdm9pZCAqbG9jYWxUaHVua0FkZHI7CisjaWZkZWYgVEFSR0VUX1dJTk5UCisgICAgLy8gRHVtbXkgdG8gcGFkIHVwIHRvIDMyIGJ5dGVzCisgICAgdm9pZCAqZHVtbXk7CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCit9IEZwdHJUYWJsZUVudHJ5OworCitzdHJ1Y3QgSW5pdFRhYmxlRW50cnkgeworI2lmZGVmIFRBUkdFVF9XSU5OVAorICAgIC8vIER1bW15IHRvIHBhZCB1cCB0byAxNiBieXRlcworICAgIC8vIEZ1bmN0aW9uIE5hbWUKKyAgICBjb25zdCBjaGFyICpmdW5jTmFtZTsKKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKKyAgICB2b2lkICgqZnVuYykodm9pZCk7Cit9OworCisjaWZkZWYgVEFSR0VUX1dJTk5UCisjZGVmaW5lIE9GRkxPQURfTVlPX1NIQVJFRF9UQUJMRV9TRUNUSU9OX1NUQVJUICAgICAgICAgICIuTXlvU2hhcmVkVGFibGUkYSIKKyNkZWZpbmUgT0ZGTE9BRF9NWU9fU0hBUkVEX1RBQkxFX1NFQ1RJT05fRU5EICAgICAgICAgICAgIi5NeW9TaGFyZWRUYWJsZSR6IgorCisjZGVmaW5lIE9GRkxPQURfTVlPX1NIQVJFRF9JTklUX1RBQkxFX1NFQ1RJT05fU1RBUlQgICAgICIuTXlvU2hhcmVkSW5pdFRhYmxlJGEiCisjZGVmaW5lIE9GRkxPQURfTVlPX1NIQVJFRF9JTklUX1RBQkxFX1NFQ1RJT05fRU5EICAgICAgICIuTXlvU2hhcmVkSW5pdFRhYmxlJHoiCisKKyNkZWZpbmUgT0ZGTE9BRF9NWU9fRlBUUl9UQUJMRV9TRUNUSU9OX1NUQVJUICAgICAgICAgICAgIi5NeW9GcHRyVGFibGUkYSIKKyNkZWZpbmUgT0ZGTE9BRF9NWU9fRlBUUl9UQUJMRV9TRUNUSU9OX0VORCAgICAgICAgICAgICAgIi5NeW9GcHRyVGFibGUkeiIKKyNlbHNlICAvLyBUQVJHRVRfV0lOTlQKKyNkZWZpbmUgT0ZGTE9BRF9NWU9fU0hBUkVEX1RBQkxFX1NFQ1RJT05fU1RBUlQgICAgICAgICAgIi5NeW9TaGFyZWRUYWJsZS4iCisjZGVmaW5lIE9GRkxPQURfTVlPX1NIQVJFRF9UQUJMRV9TRUNUSU9OX0VORCAgICAgICAgICAgICIuTXlvU2hhcmVkVGFibGUuIgorCisjZGVmaW5lIE9GRkxPQURfTVlPX1NIQVJFRF9JTklUX1RBQkxFX1NFQ1RJT05fU1RBUlQgICAgICIuTXlvU2hhcmVkSW5pdFRhYmxlLiIKKyNkZWZpbmUgT0ZGTE9BRF9NWU9fU0hBUkVEX0lOSVRfVEFCTEVfU0VDVElPTl9FTkQgICAgICAgIi5NeW9TaGFyZWRJbml0VGFibGUuIgorCisjZGVmaW5lIE9GRkxPQURfTVlPX0ZQVFJfVEFCTEVfU0VDVElPTl9TVEFSVCAgICAgICAgICAgICIuTXlvRnB0clRhYmxlLiIKKyNkZWZpbmUgT0ZGTE9BRF9NWU9fRlBUUl9UQUJMRV9TRUNUSU9OX0VORCAgICAgICAgICAgICAgIi5NeW9GcHRyVGFibGUuIgorI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorCisjcHJhZ21hIHNlY3Rpb24oT0ZGTE9BRF9NWU9fU0hBUkVEX1RBQkxFX1NFQ1RJT05fU1RBUlQsIHJlYWQsIHdyaXRlKQorI3ByYWdtYSBzZWN0aW9uKE9GRkxPQURfTVlPX1NIQVJFRF9UQUJMRV9TRUNUSU9OX0VORCwgcmVhZCwgd3JpdGUpCisKKyNwcmFnbWEgc2VjdGlvbihPRkZMT0FEX01ZT19TSEFSRURfSU5JVF9UQUJMRV9TRUNUSU9OX1NUQVJULCByZWFkLCB3cml0ZSkKKyNwcmFnbWEgc2VjdGlvbihPRkZMT0FEX01ZT19TSEFSRURfSU5JVF9UQUJMRV9TRUNUSU9OX0VORCwgcmVhZCwgd3JpdGUpCisKKyNwcmFnbWEgc2VjdGlvbihPRkZMT0FEX01ZT19GUFRSX1RBQkxFX1NFQ1RJT05fU1RBUlQsIHJlYWQsIHdyaXRlKQorI3ByYWdtYSBzZWN0aW9uKE9GRkxPQURfTVlPX0ZQVFJfVEFCTEVfU0VDVElPTl9FTkQsIHJlYWQsIHdyaXRlKQorCitleHRlcm4gIkMiIHZvaWQgX19vZmZsb2FkX215b1JlZ2lzdGVyVGFibGVzKAorICAgIEluaXRUYWJsZUVudHJ5ICppbml0X3RhYmxlLAorICAgIFNoYXJlZFRhYmxlRW50cnkgKnNoYXJlZF90YWJsZSwKKyAgICBGcHRyVGFibGVFbnRyeSAqZnB0cl90YWJsZQorKTsKKworZXh0ZXJuIHZvaWQgX19vZmZsb2FkX215b0Zpbmkodm9pZCk7CisKKyNlbmRpZiAvLyBPRkZMT0FEX01ZT19IT1NUX0hfSU5DTFVERUQKZGlmZiAtLWdpdCBhL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfbXlvX3RhcmdldC5jcHAgYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX215b190YXJnZXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlYjFjNGYKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX215b190YXJnZXQuY3BwCkBAIC0wLDAgKzEsMTg0IEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJvZmZsb2FkX215b190YXJnZXQuaCIKKyNpbmNsdWRlICJvZmZsb2FkX3RhcmdldC5oIgorCitleHRlcm4gIkMiIHZvaWQgX19jaWxrcnRzX2NpbGtfZm9yXzMyKHZvaWQqLCB2b2lkKiwgdWludDMyX3QsIGludDMyX3QpOworZXh0ZXJuICJDIiB2b2lkIF9fY2lsa3J0c19jaWxrX2Zvcl82NCh2b2lkKiwgdm9pZCosIHVpbnQ2NF90LCBpbnQzMl90KTsKKworI3ByYWdtYSB3ZWFrIF9fY2lsa3J0c19jaWxrX2Zvcl8zMgorI3ByYWdtYSB3ZWFrIF9fY2lsa3J0c19jaWxrX2Zvcl82NAorCitzdGF0aWMgdm9pZCBDaGVja1Jlc3VsdChjb25zdCBjaGFyICpmdW5jLCBNeW9FcnJvciBlcnJvcikgeworICAgIGlmIChlcnJvciAhPSBNWU9fU1VDQ0VTUykgeworICAgICAgIExJQk9GRkxPQURfRVJST1IoY19teW90YXJnZXRfY2hlY2tyZXN1bHQsIGZ1bmMsIGVycm9yKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIF9fb2ZmbG9hZF9teW9fc2hhcmVkX3RhYmxlX3JlZ2lzdGVyKFNoYXJlZFRhYmxlRW50cnkgKmVudHJ5KQoreworICAgIGludCBlbnRyaWVzID0gMDsKKyAgICBTaGFyZWRUYWJsZUVudHJ5ICp0X3N0YXJ0OworCisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgzLCAiJXMoJXApXG4iLCBfX2Z1bmNfXywgZW50cnkpOworCisgICAgdF9zdGFydCA9IGVudHJ5OworICAgIHdoaWxlICh0X3N0YXJ0LT52YXJOYW1lICE9IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRV8xKDQsIDAsIGNfb2ZmbG9hZF9taWNfbXlvX3NoYXJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJteW8gc2hhcmVkIGVudHJ5IG5hbWUgPSBcIiVzXCIgYWRkciA9ICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdGFydC0+dmFyTmFtZSwgdF9zdGFydC0+c2hhcmVkQWRkcik7CisgICAgICAgIHRfc3RhcnQrKzsKKyAgICAgICAgZW50cmllcysrOworICAgIH0KKworICAgIGlmIChlbnRyaWVzID4gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDMsICJteW9pTWljVmFyVGFibGVSZWdpc3RlciglcCwgJWQpXG4iLCBlbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyaWVzKTsKKyAgICAgICAgQ2hlY2tSZXN1bHQoIm15b2lNaWNWYXJUYWJsZVJlZ2lzdGVyIiwKKyAgICAgICAgICAgICAgICAgICAgbXlvaU1pY1ZhclRhYmxlUmVnaXN0ZXIoZW50cnksIGVudHJpZXMpKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIF9fb2ZmbG9hZF9teW9fZnB0cl90YWJsZV9yZWdpc3RlcigKKyAgICBGcHRyVGFibGVFbnRyeSAqZW50cnkKKykKK3sKKyAgICBpbnQgZW50cmllcyA9IDA7CisgICAgRnB0clRhYmxlRW50cnkgKnRfc3RhcnQ7CisKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDMsICIlcyglcClcbiIsIF9fZnVuY19fLCBlbnRyeSk7CisKKyAgICB0X3N0YXJ0ID0gZW50cnk7CisgICAgd2hpbGUgKHRfc3RhcnQtPmZ1bmNOYW1lICE9IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRV8xKDQsIDAsIGNfb2ZmbG9hZF9taWNfbXlvX2ZwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXlvIGZwdHIgZW50cnkgbmFtZSA9IFwiJXNcIiBhZGRyID0gJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0YXJ0LT5mdW5jTmFtZSwgdF9zdGFydC0+ZnVuY0FkZHIpOworICAgICAgICB0X3N0YXJ0Kys7CisgICAgICAgIGVudHJpZXMrKzsKKyAgICB9CisKKyAgICBpZiAoZW50cmllcyA+IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgzLCAibXlvaVRhcmdldEZwdHJUYWJsZVJlZ2lzdGVyKCVwLCAlZCwgMClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnksIGVudHJpZXMpOworICAgICAgICBDaGVja1Jlc3VsdCgibXlvaVRhcmdldEZwdHJUYWJsZVJlZ2lzdGVyIiwKKyAgICAgICAgICAgICAgICAgICAgbXlvaVRhcmdldEZwdHJUYWJsZVJlZ2lzdGVyKGVudHJ5LCBlbnRyaWVzLCAwKSk7CisgICAgfQorfQorCitleHRlcm4gIkMiIHZvaWQgX19vZmZsb2FkX215b0FjcXVpcmUodm9pZCkKK3sKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDMsICIlc1xuIiwgX19mdW5jX18pOworICAgIENoZWNrUmVzdWx0KCJteW9BY3F1aXJlIiwgbXlvQWNxdWlyZSgpKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIF9fb2ZmbG9hZF9teW9SZWxlYXNlKHZvaWQpCit7CisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgzLCAiJXNcbiIsIF9fZnVuY19fKTsKKyAgICBDaGVja1Jlc3VsdCgibXlvUmVsZWFzZSIsIG15b1JlbGVhc2UoKSk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBfX2ludGVsX2NpbGtfZm9yXzMyX29mZmxvYWRfd3JhcHBlcih2b2lkICphcmdzXykKK3sKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDMsICIlc1xuIiwgX19mdW5jX18pOworCisgICAgc3RydWN0IFMgeworICAgICAgICB2b2lkICpNMTsKKyAgICAgICAgdW5zaWduZWQgaW50IE0yOworICAgICAgICB1bnNpZ25lZCBpbnQgTTM7CisgICAgICAgIGNoYXIgY2xvc3VyZVtdOworICAgIH0gKmFyZ3MgPSAoc3RydWN0IFMqKSBhcmdzXzsKKworICAgIF9fY2lsa3J0c19jaWxrX2Zvcl8zMihhcmdzLT5NMSwgYXJncy0+Y2xvc3VyZSwgYXJncy0+TTIsIGFyZ3MtPk0zKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIF9faW50ZWxfY2lsa19mb3JfNjRfb2ZmbG9hZF93cmFwcGVyKHZvaWQgKmFyZ3NfKQoreworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMywgIiVzXG4iLCBfX2Z1bmNfXyk7CisKKyAgICBzdHJ1Y3QgUyB7CisgICAgICAgIHZvaWQgKk0xOworICAgICAgICB1aW50NjRfdCBNMjsKKyAgICAgICAgdWludDY0X3QgTTM7CisgICAgICAgIGNoYXIgY2xvc3VyZVtdOworICAgIH0gKmFyZ3MgPSAoc3RydWN0IFMqKSBhcmdzXzsKKworICAgIF9fY2lsa3J0c19jaWxrX2Zvcl82NChhcmdzLT5NMSwgYXJncy0+Y2xvc3VyZSwgYXJncy0+TTIsIGFyZ3MtPk0zKTsKK30KKworc3RhdGljIHZvaWQgX19vZmZsb2FkX215b19vbmNlX2luaXQodm9pZCkKK3sKKyAgICBDaGVja1Jlc3VsdCgibXlvaVJlbW90ZUZ1bmNSZWdpc3RlciIsCisgICAgICAgICAgICAgICAgbXlvaVJlbW90ZUZ1bmNSZWdpc3RlcigKKyAgICAgICAgICAgICAgICAgICAgKE15b2lSZW1vdGVGdW5jVHlwZSkgX19pbnRlbF9jaWxrX2Zvcl8zMl9vZmZsb2FkX3dyYXBwZXIsCisgICAgICAgICAgICAgICAgICAgICJfX2ludGVsX2NpbGtfZm9yXzMyX29mZmxvYWQiKSk7CisgICAgQ2hlY2tSZXN1bHQoIm15b2lSZW1vdGVGdW5jUmVnaXN0ZXIiLAorICAgICAgICAgICAgICAgIG15b2lSZW1vdGVGdW5jUmVnaXN0ZXIoCisgICAgICAgICAgICAgICAgICAgIChNeW9pUmVtb3RlRnVuY1R5cGUpIF9faW50ZWxfY2lsa19mb3JfNjRfb2ZmbG9hZF93cmFwcGVyLAorICAgICAgICAgICAgICAgICAgICAiX19pbnRlbF9jaWxrX2Zvcl82NF9vZmZsb2FkIikpOworfQorCitleHRlcm4gIkMiIHZvaWQgX19vZmZsb2FkX215b1JlZ2lzdGVyVGFibGVzKAorICAgIFNoYXJlZFRhYmxlRW50cnkgKnNoYXJlZF90YWJsZSwKKyAgICBGcHRyVGFibGVFbnRyeSAqZnB0cl90YWJsZQorKQoreworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMywgIiVzXG4iLCBfX2Z1bmNfXyk7CisKKyAgICAvLyBvbmUgdGltZSByZWdpc3RyYXRpb24gb2YgSW50ZWwoUikgQ2lsayhUTSkgbGFuZ3VhZ2UgZW50cmllcworICAgIHN0YXRpYyBwdGhyZWFkX29uY2VfdCBvbmNlX2NvbnRyb2wgPSBQVEhSRUFEX09OQ0VfSU5JVDsKKyAgICBwdGhyZWFkX29uY2UoJm9uY2VfY29udHJvbCwgX19vZmZsb2FkX215b19vbmNlX2luaXQpOworCisgICAgLy8gcmVnaXN0ZXIgbW9kdWxlJ3MgdGFibGVzCisgICAgaWYgKHNoYXJlZF90YWJsZS0+dmFyTmFtZSA9PSAwICYmIGZwdHJfdGFibGUtPmZ1bmNOYW1lID09IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIF9fb2ZmbG9hZF9teW9fc2hhcmVkX3RhYmxlX3JlZ2lzdGVyKHNoYXJlZF90YWJsZSk7CisgICAgX19vZmZsb2FkX215b19mcHRyX3RhYmxlX3JlZ2lzdGVyKGZwdHJfdGFibGUpOworfQorCitleHRlcm4gIkMiIHZvaWQqIF9PZmZsb2FkX3NoYXJlZF9tYWxsb2Moc2l6ZV90IHNpemUpCit7CisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgzLCAiJXMoJWxsZClcbiIsIF9fZnVuY19fLCBzaXplKTsKKyAgICByZXR1cm4gbXlvU2hhcmVkTWFsbG9jKHNpemUpOworfQorCitleHRlcm4gIkMiIHZvaWQgX09mZmxvYWRfc2hhcmVkX2ZyZWUodm9pZCAqcHRyKQoreworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMywgIiVzKCVwKVxuIiwgX19mdW5jX18sIHB0cik7CisgICAgbXlvU2hhcmVkRnJlZShwdHIpOworfQorCitleHRlcm4gIkMiIHZvaWQqIF9PZmZsb2FkX3NoYXJlZF9hbGlnbmVkX21hbGxvYyhzaXplX3Qgc2l6ZSwgc2l6ZV90IGFsaWduKQoreworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMywgIiVzKCVsbGQsICVsbGQpXG4iLCBfX2Z1bmNfXywgc2l6ZSwgYWxpZ24pOworICAgIHJldHVybiBteW9TaGFyZWRBbGlnbmVkTWFsbG9jKHNpemUsIGFsaWduKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIF9PZmZsb2FkX3NoYXJlZF9hbGlnbmVkX2ZyZWUodm9pZCAqcHRyKQoreworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMywgIiVzKCVwKVxuIiwgX19mdW5jX18sIHB0cik7CisgICAgbXlvU2hhcmVkQWxpZ25lZEZyZWUocHRyKTsKK30KKworLy8gdGVtcG9yYXJ5IHdvcmthcm91bmQgZm9yIGJsb2NraW5nIGJlaGF2aW9yIG9mIG15b2lMaWJJbml0L0ZpbmkgY2FsbHMKK2V4dGVybiAiQyIgdm9pZCBfX29mZmxvYWRfbXlvTGliSW5pdCgpCit7CisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgzLCAiJXMoKVxuIiwgX19mdW5jX18pOworICAgIENoZWNrUmVzdWx0KCJteW9pTGliSW5pdCIsIG15b2lMaWJJbml0KDAsIDApKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIF9fb2ZmbG9hZF9teW9MaWJGaW5pKCkKK3sKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDMsICIlcygpXG4iLCBfX2Z1bmNfXyk7CisgICAgbXlvaUxpYkZpbmkoKTsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfbXlvX3RhcmdldC5oIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9teW9fdGFyZ2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI3Zjc4OQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfbXlvX3RhcmdldC5oCkBAIC0wLDAgKzEsNTQgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBPRkZMT0FEX01ZT19UQVJHRVRfSF9JTkNMVURFRAorI2RlZmluZSBPRkZMT0FEX01ZT19UQVJHRVRfSF9JTkNMVURFRAorCisjaW5jbHVkZSA8bXlvdHlwZXMuaD4KKyNpbmNsdWRlIDxteW9pbXBsLmg+CisjaW5jbHVkZSA8bXlvLmg+CisjaW5jbHVkZSAib2ZmbG9hZC5oIgorCit0eXBlZGVmIE15b2lTaGFyZWRWYXJFbnRyeSAgICAgICAgICBTaGFyZWRUYWJsZUVudHJ5OwordHlwZWRlZiBNeW9pVGFyZ2V0U2hhcmVkRnB0ckVudHJ5ICAgRnB0clRhYmxlRW50cnk7CisKKyNpZmRlZiBUQVJHRVRfV0lOTlQKKyNkZWZpbmUgT0ZGTE9BRF9NWU9fU0hBUkVEX1RBQkxFX1NFQ1RJT05fU1RBUlQgICAgICAgICAgIi5NeW9TaGFyZWRUYWJsZSRhIgorI2RlZmluZSBPRkZMT0FEX01ZT19TSEFSRURfVEFCTEVfU0VDVElPTl9FTkQgICAgICAgICAgICAiLk15b1NoYXJlZFRhYmxlJHoiCisKKyNkZWZpbmUgT0ZGTE9BRF9NWU9fRlBUUl9UQUJMRV9TRUNUSU9OX1NUQVJUICAgICAgICAgICAgIi5NeW9GcHRyVGFibGUkYSIKKyNkZWZpbmUgT0ZGTE9BRF9NWU9fRlBUUl9UQUJMRV9TRUNUSU9OX0VORCAgICAgICAgICAgICAgIi5NeW9GcHRyVGFibGUkeiIKKyNlbHNlICAvLyBUQVJHRVRfV0lOTlQKKyNkZWZpbmUgT0ZGTE9BRF9NWU9fU0hBUkVEX1RBQkxFX1NFQ1RJT05fU1RBUlQgICAgICAgICAgIi5NeW9TaGFyZWRUYWJsZS4iCisjZGVmaW5lIE9GRkxPQURfTVlPX1NIQVJFRF9UQUJMRV9TRUNUSU9OX0VORCAgICAgICAgICAgICIuTXlvU2hhcmVkVGFibGUuIgorCisjZGVmaW5lIE9GRkxPQURfTVlPX0ZQVFJfVEFCTEVfU0VDVElPTl9TVEFSVCAgICAgICAgICAgICIuTXlvRnB0clRhYmxlLiIKKyNkZWZpbmUgT0ZGTE9BRF9NWU9fRlBUUl9UQUJMRV9TRUNUSU9OX0VORCAgICAgICAgICAgICAgIi5NeW9GcHRyVGFibGUuIgorI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorCisjcHJhZ21hIHNlY3Rpb24oT0ZGTE9BRF9NWU9fU0hBUkVEX1RBQkxFX1NFQ1RJT05fU1RBUlQsIHJlYWQsIHdyaXRlKQorI3ByYWdtYSBzZWN0aW9uKE9GRkxPQURfTVlPX1NIQVJFRF9UQUJMRV9TRUNUSU9OX0VORCwgcmVhZCwgd3JpdGUpCisKKyNwcmFnbWEgc2VjdGlvbihPRkZMT0FEX01ZT19GUFRSX1RBQkxFX1NFQ1RJT05fU1RBUlQsIHJlYWQsIHdyaXRlKQorI3ByYWdtYSBzZWN0aW9uKE9GRkxPQURfTVlPX0ZQVFJfVEFCTEVfU0VDVElPTl9FTkQsIHJlYWQsIHdyaXRlKQorCitleHRlcm4gIkMiIHZvaWQgX19vZmZsb2FkX215b1JlZ2lzdGVyVGFibGVzKAorICAgIFNoYXJlZFRhYmxlRW50cnkgKnNoYXJlZF90YWJsZSwKKyAgICBGcHRyVGFibGVFbnRyeSAqZnB0cl90YWJsZQorKTsKKworZXh0ZXJuICJDIiB2b2lkIF9fb2ZmbG9hZF9teW9BY3F1aXJlKHZvaWQpOworZXh0ZXJuICJDIiB2b2lkIF9fb2ZmbG9hZF9teW9SZWxlYXNlKHZvaWQpOworCisvLyB0ZW1wb3Jhcnkgd29ya2Fyb3VuZCBmb3IgYmxvY2tpbmcgYmVoYXZpb3IgZm9yIG15b2lMaWJJbml0L0ZpbmkgY2FsbHMKK2V4dGVybiAiQyIgdm9pZCBfX29mZmxvYWRfbXlvTGliSW5pdCgpOworZXh0ZXJuICJDIiB2b2lkIF9fb2ZmbG9hZF9teW9MaWJGaW5pKCk7CisKKyNlbmRpZiAvLyBPRkZMT0FEX01ZT19UQVJHRVRfSF9JTkNMVURFRApkaWZmIC0tZ2l0IGEvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9vbXBfaG9zdC5jcHAgYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX29tcF9ob3N0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGQ0NDQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9vbXBfaG9zdC5jcHAKQEAgLTAsMCArMSw4NTEgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgPG9tcC5oPgorI2luY2x1ZGUgIm9mZmxvYWQuaCIKKyNpbmNsdWRlICJjb21waWxlcl9pZl9ob3N0LmgiCisKKy8vIE9wZW5NUCBBUEkKKwordm9pZCBvbXBfc2V0X2RlZmF1bHRfZGV2aWNlKGludCBudW0pCit7CisgICAgaWYgKG51bSA+PSAwKSB7CisgICAgICAgIF9fb21wX2RldmljZV9udW0gPSBudW07CisgICAgfQorfQorCitpbnQgb21wX2dldF9kZWZhdWx0X2RldmljZSh2b2lkKQoreworICAgIHJldHVybiBfX29tcF9kZXZpY2VfbnVtOworfQorCitpbnQgb21wX2dldF9udW1fZGV2aWNlcygpCit7CisgICAgX19vZmZsb2FkX2luaXRfbGlicmFyeSgpOworICAgIHJldHVybiBtaWNfZW5naW5lc190b3RhbDsKK30KKworLy8gT3Blbk1QIEFQSSB3cmFwcGVycworCitzdGF0aWMgdm9pZCBvbXBfc2V0X2ludF90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgaW50IHNldHRpbmcsCisgICAgY29uc3QgY2hhciogZl9uYW1lCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRSh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgMCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZfbmFtZSwgMCk7CisgICAgaWYgKG9mbGQpIHsKKyAgICAgICAgVmFyRGVzYyB2YXJzWzFdID0gezB9OworCisgICAgICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbjsKKyAgICAgICAgdmFyc1swXS5zaXplID0gc2l6ZW9mKGludCk7CisgICAgICAgIHZhcnNbMF0uY291bnQgPSAxOworICAgICAgICB2YXJzWzBdLnB0ciA9ICZzZXR0aW5nOworCisgICAgICAgIE9GRkxPQURfT0ZGTE9BRChvZmxkLCBmX25hbWUsIDAsIDEsIHZhcnMsIE5VTEwsIDAsIDAsIDApOworICAgIH0KK30KKworc3RhdGljIGludCBvbXBfZ2V0X2ludF90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgY29uc3QgY2hhciAqIGZfbmFtZQorKQoreworICAgIGludCBzZXR0aW5nID0gMDsKKworICAgIE9GRkxPQUQgb2ZsZCA9IE9GRkxPQURfVEFSR0VUX0FDUVVJUkUodGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIDAsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmX25hbWUsIDApOworICAgIGlmIChvZmxkKSB7CisgICAgICAgIFZhckRlc2MgdmFyc1sxXSA9IHswfTsKKworICAgICAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfb3V0OworICAgICAgICB2YXJzWzBdLnNpemUgPSBzaXplb2YoaW50KTsKKyAgICAgICAgdmFyc1swXS5jb3VudCA9IDE7CisgICAgICAgIHZhcnNbMF0ucHRyID0gJnNldHRpbmc7CisKKyAgICAgICAgT0ZGTE9BRF9PRkZMT0FEKG9mbGQsIGZfbmFtZSwgMCwgMSwgdmFycywgTlVMTCwgMCwgMCwgMCk7CisgICAgfQorICAgIHJldHVybiBzZXR0aW5nOworfQorCit2b2lkIG9tcF9zZXRfbnVtX3RocmVhZHNfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGludCBudW1fdGhyZWFkcworKQoreworICAgIG9tcF9zZXRfaW50X3RhcmdldCh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgbnVtX3RocmVhZHMsCisgICAgICAgICAgICAgICAgICAgICAgICJvbXBfc2V0X251bV90aHJlYWRzX3RhcmdldCIpOworfQorCitpbnQgb21wX2dldF9tYXhfdGhyZWFkc190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKykKK3sKKyAgICByZXR1cm4gb21wX2dldF9pbnRfdGFyZ2V0KHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9tcF9nZXRfbWF4X3RocmVhZHNfdGFyZ2V0Iik7Cit9CisKK2ludCBvbXBfZ2V0X251bV9wcm9jc190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKykKK3sKKyAgICByZXR1cm4gb21wX2dldF9pbnRfdGFyZ2V0KHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9tcF9nZXRfbnVtX3Byb2NzX3RhcmdldCIpOworfQorCit2b2lkIG9tcF9zZXRfZHluYW1pY190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgaW50IG51bV90aHJlYWRzCispCit7CisgICAgb21wX3NldF9pbnRfdGFyZ2V0KHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCBudW1fdGhyZWFkcywKKyAgICAgICAgICAgICAgICAgICAgICAgIm9tcF9zZXRfZHluYW1pY190YXJnZXQiKTsKK30KKworaW50IG9tcF9nZXRfZHluYW1pY190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKykKK3sKKyAgICByZXR1cm4gb21wX2dldF9pbnRfdGFyZ2V0KHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9tcF9nZXRfZHluYW1pY190YXJnZXQiKTsKK30KKwordm9pZCBvbXBfc2V0X25lc3RlZF90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgaW50IG5lc3RlZAorKQoreworICAgIG9tcF9zZXRfaW50X3RhcmdldCh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgbmVzdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAib21wX3NldF9uZXN0ZWRfdGFyZ2V0Iik7Cit9CisKK2ludCBvbXBfZ2V0X25lc3RlZF90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKykKK3sKKyAgICByZXR1cm4gb21wX2dldF9pbnRfdGFyZ2V0KHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9tcF9nZXRfbmVzdGVkX3RhcmdldCIpOworfQorCit2b2lkIG9tcF9zZXRfc2NoZWR1bGVfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIG9tcF9zY2hlZF90IGtpbmQsCisgICAgaW50IG1vZGlmaWVyCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRSh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgMCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCAwKTsKKyAgICBpZiAob2ZsZCAhPSAwKSB7CisgICAgICAgIFZhckRlc2MgdmFyc1syXSA9IHswfTsKKworICAgICAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW47CisgICAgICAgIHZhcnNbMF0uc2l6ZSA9IHNpemVvZihvbXBfc2NoZWRfdCk7CisgICAgICAgIHZhcnNbMF0uY291bnQgPSAxOworICAgICAgICB2YXJzWzBdLnB0ciA9ICZraW5kOworCisgICAgICAgIHZhcnNbMV0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMV0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMV0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbjsKKyAgICAgICAgdmFyc1sxXS5zaXplID0gc2l6ZW9mKGludCk7CisgICAgICAgIHZhcnNbMV0uY291bnQgPSAxOworICAgICAgICB2YXJzWzFdLnB0ciA9ICZtb2RpZmllcjsKKworICAgICAgICBPRkZMT0FEX09GRkxPQUQob2ZsZCwgIm9tcF9zZXRfc2NoZWR1bGVfdGFyZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDIsIHZhcnMsIE5VTEwsIDAsIDAsIDApOworICAgIH0KK30KKwordm9pZCBvbXBfZ2V0X3NjaGVkdWxlX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBvbXBfc2NoZWRfdCAqa2luZCwKKyAgICBpbnQgKm1vZGlmaWVyCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRSh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgMCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCAwKTsKKyAgICBpZiAob2ZsZCAhPSAwKSB7CisgICAgICAgIFZhckRlc2MgdmFyc1syXSA9IHswfTsKKworICAgICAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfb3V0OworICAgICAgICB2YXJzWzBdLnNpemUgPSBzaXplb2Yob21wX3NjaGVkX3QpOworICAgICAgICB2YXJzWzBdLmNvdW50ID0gMTsKKyAgICAgICAgdmFyc1swXS5wdHIgPSBraW5kOworCisgICAgICAgIHZhcnNbMV0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMV0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMV0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9vdXQ7CisgICAgICAgIHZhcnNbMV0uc2l6ZSA9IHNpemVvZihpbnQpOworICAgICAgICB2YXJzWzFdLmNvdW50ID0gMTsKKyAgICAgICAgdmFyc1sxXS5wdHIgPSBtb2RpZmllcjsKKworICAgICAgICBPRkZMT0FEX09GRkxPQUQob2ZsZCwgIm9tcF9nZXRfc2NoZWR1bGVfdGFyZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDIsIHZhcnMsIE5VTEwsIDAsIDAsIDApOworICAgIH0KK30KKworLy8gbG9jayBBUEkgZnVuY3Rpb25zCisKK3ZvaWQgb21wX2luaXRfbG9ja190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgb21wX2xvY2tfdGFyZ2V0X3QgKmxvY2sKKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSBPRkZMT0FEX1RBUkdFVF9BQ1FVSVJFKHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCAwLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIDApOworICAgIGlmIChvZmxkICE9IDApIHsKKyAgICAgICAgVmFyRGVzYyB2YXJzWzFdID0gezB9OworCisgICAgICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9vdXQ7CisgICAgICAgIHZhcnNbMF0uc2l6ZSA9IHNpemVvZihvbXBfbG9ja190YXJnZXRfdCk7CisgICAgICAgIHZhcnNbMF0uY291bnQgPSAxOworICAgICAgICB2YXJzWzBdLnB0ciA9IGxvY2s7CisKKyAgICAgICAgT0ZGTE9BRF9PRkZMT0FEKG9mbGQsICJvbXBfaW5pdF9sb2NrX3RhcmdldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAxLCB2YXJzLCBOVUxMLCAwLCAwLCAwKTsKKyAgICB9Cit9CisKK3ZvaWQgb21wX2Rlc3Ryb3lfbG9ja190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgb21wX2xvY2tfdGFyZ2V0X3QgKmxvY2sKKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSBPRkZMT0FEX1RBUkdFVF9BQ1FVSVJFKHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCAwLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIDApOworICAgIGlmIChvZmxkICE9IDApIHsKKyAgICAgICAgVmFyRGVzYyB2YXJzWzFdID0gezB9OworCisgICAgICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbjsKKyAgICAgICAgdmFyc1swXS5zaXplID0gc2l6ZW9mKG9tcF9sb2NrX3RhcmdldF90KTsKKyAgICAgICAgdmFyc1swXS5jb3VudCA9IDE7CisgICAgICAgIHZhcnNbMF0ucHRyID0gbG9jazsKKworICAgICAgICBPRkZMT0FEX09GRkxPQUQob2ZsZCwgIm9tcF9kZXN0cm95X2xvY2tfdGFyZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDEsIHZhcnMsIE5VTEwsIDAsIDAsIDApOworICAgIH0KK30KKwordm9pZCBvbXBfc2V0X2xvY2tfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIG9tcF9sb2NrX3RhcmdldF90ICpsb2NrCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRSh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgMCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCAwKTsKKyAgICBpZiAob2ZsZCAhPSAwKSB7CisgICAgICAgIFZhckRlc2MgdmFyc1sxXSA9IHswfTsKKworICAgICAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW5vdXQ7CisgICAgICAgIHZhcnNbMF0uc2l6ZSA9IHNpemVvZihvbXBfbG9ja190YXJnZXRfdCk7CisgICAgICAgIHZhcnNbMF0uY291bnQgPSAxOworICAgICAgICB2YXJzWzBdLnB0ciA9IGxvY2s7CisKKyAgICAgICAgT0ZGTE9BRF9PRkZMT0FEKG9mbGQsICJvbXBfc2V0X2xvY2tfdGFyZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDEsIHZhcnMsIE5VTEwsIDAsIDAsIDApOworICAgIH0KK30KKwordm9pZCBvbXBfdW5zZXRfbG9ja190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgb21wX2xvY2tfdGFyZ2V0X3QgKmxvY2sKKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSBPRkZMT0FEX1RBUkdFVF9BQ1FVSVJFKHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCAwLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIDApOworICAgIGlmIChvZmxkICE9IDApIHsKKyAgICAgICAgVmFyRGVzYyB2YXJzWzFdID0gezB9OworCisgICAgICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbm91dDsKKyAgICAgICAgdmFyc1swXS5zaXplID0gc2l6ZW9mKG9tcF9sb2NrX3RhcmdldF90KTsKKyAgICAgICAgdmFyc1swXS5jb3VudCA9IDE7CisgICAgICAgIHZhcnNbMF0ucHRyID0gbG9jazsKKworICAgICAgICBPRkZMT0FEX09GRkxPQUQob2ZsZCwgIm9tcF91bnNldF9sb2NrX3RhcmdldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAxLCB2YXJzLCBOVUxMLCAwLCAwLCAwKTsKKyAgICB9Cit9CisKK2ludCBvbXBfdGVzdF9sb2NrX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBvbXBfbG9ja190YXJnZXRfdCAqbG9jaworKQoreworICAgIGludCByZXN1bHQgPSAwOworCisgICAgT0ZGTE9BRCBvZmxkID0gT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRSh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgMCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCAwKTsKKyAgICBpZiAob2ZsZCAhPSAwKSB7CisgICAgICAgIFZhckRlc2MgdmFyc1syXSA9IHswfTsKKworICAgICAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW5vdXQ7CisgICAgICAgIHZhcnNbMF0uc2l6ZSA9IHNpemVvZihvbXBfbG9ja190YXJnZXRfdCk7CisgICAgICAgIHZhcnNbMF0uY291bnQgPSAxOworICAgICAgICB2YXJzWzBdLnB0ciA9IGxvY2s7CisKKyAgICAgICAgdmFyc1sxXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1sxXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1sxXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX291dDsKKyAgICAgICAgdmFyc1sxXS5zaXplID0gc2l6ZW9mKGludCk7CisgICAgICAgIHZhcnNbMV0uY291bnQgPSAxOworICAgICAgICB2YXJzWzFdLnB0ciA9ICZyZXN1bHQ7CisKKyAgICAgICAgT0ZGTE9BRF9PRkZMT0FEKG9mbGQsICJvbXBfdGVzdF9sb2NrX3RhcmdldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAyLCB2YXJzLCBOVUxMLCAwLCAwLCAwKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gbmVzdGVkIGxvY2sgQVBJIGZ1bmN0aW9ucworCit2b2lkIG9tcF9pbml0X25lc3RfbG9ja190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgb21wX25lc3RfbG9ja190YXJnZXRfdCAqbG9jaworKQoreworICAgIE9GRkxPQUQgb2ZsZCA9IE9GRkxPQURfVEFSR0VUX0FDUVVJUkUodGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIDAsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgMCk7CisgICAgaWYgKG9mbGQgIT0gMCkgeworICAgICAgICBWYXJEZXNjIHZhcnNbMV0gPSB7MH07CisKKyAgICAgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX291dDsKKyAgICAgICAgdmFyc1swXS5zaXplID0gc2l6ZW9mKG9tcF9uZXN0X2xvY2tfdGFyZ2V0X3QpOworICAgICAgICB2YXJzWzBdLmNvdW50ID0gMTsKKyAgICAgICAgdmFyc1swXS5wdHIgPSBsb2NrOworCisgICAgICAgIE9GRkxPQURfT0ZGTE9BRChvZmxkLCAib21wX2luaXRfbmVzdF9sb2NrX3RhcmdldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAxLCB2YXJzLCBOVUxMLCAwLCAwLCAwKTsKKyAgICB9Cit9CisKK3ZvaWQgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBvbXBfbmVzdF9sb2NrX3RhcmdldF90ICpsb2NrCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRSh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgMCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCAwKTsKKyAgICBpZiAob2ZsZCAhPSAwKSB7CisgICAgICAgIFZhckRlc2MgdmFyc1sxXSA9IHswfTsKKworICAgICAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW47CisgICAgICAgIHZhcnNbMF0uc2l6ZSA9IHNpemVvZihvbXBfbmVzdF9sb2NrX3RhcmdldF90KTsKKyAgICAgICAgdmFyc1swXS5jb3VudCA9IDE7CisgICAgICAgIHZhcnNbMF0ucHRyID0gbG9jazsKKworICAgICAgICBPRkZMT0FEX09GRkxPQUQob2ZsZCwgIm9tcF9kZXN0cm95X25lc3RfbG9ja190YXJnZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMSwgdmFycywgTlVMTCwgMCwgMCwgMCk7CisgICAgfQorfQorCit2b2lkIG9tcF9zZXRfbmVzdF9sb2NrX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBvbXBfbmVzdF9sb2NrX3RhcmdldF90ICpsb2NrCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRSh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgMCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCAwKTsKKyAgICBpZiAob2ZsZCAhPSAwKSB7CisgICAgICAgIFZhckRlc2MgdmFyc1sxXSA9IHswfTsKKworICAgICAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW5vdXQ7CisgICAgICAgIHZhcnNbMF0uc2l6ZSA9IHNpemVvZihvbXBfbmVzdF9sb2NrX3RhcmdldF90KTsKKyAgICAgICAgdmFyc1swXS5jb3VudCA9IDE7CisgICAgICAgIHZhcnNbMF0ucHRyID0gbG9jazsKKworICAgICAgICBPRkZMT0FEX09GRkxPQUQob2ZsZCwgIm9tcF9zZXRfbmVzdF9sb2NrX3RhcmdldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAxLCB2YXJzLCBOVUxMLCAwLCAwLCAwKTsKKyAgICB9Cit9CisKK3ZvaWQgb21wX3Vuc2V0X25lc3RfbG9ja190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgb21wX25lc3RfbG9ja190YXJnZXRfdCAqbG9jaworKQoreworICAgIE9GRkxPQUQgb2ZsZCA9IE9GRkxPQURfVEFSR0VUX0FDUVVJUkUodGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIDAsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgMCk7CisgICAgaWYgKG9mbGQgIT0gMCkgeworICAgICAgICBWYXJEZXNjIHZhcnNbMV0gPSB7MH07CisKKyAgICAgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2lub3V0OworICAgICAgICB2YXJzWzBdLnNpemUgPSBzaXplb2Yob21wX25lc3RfbG9ja190YXJnZXRfdCk7CisgICAgICAgIHZhcnNbMF0uY291bnQgPSAxOworICAgICAgICB2YXJzWzBdLnB0ciA9IGxvY2s7CisKKyAgICAgICAgT0ZGTE9BRF9PRkZMT0FEKG9mbGQsICJvbXBfdW5zZXRfbmVzdF9sb2NrX3RhcmdldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAxLCB2YXJzLCBOVUxMLCAwLCAwLCAwKTsKKyAgICB9Cit9CisKK2ludCBvbXBfdGVzdF9uZXN0X2xvY2tfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIG9tcF9uZXN0X2xvY2tfdGFyZ2V0X3QgKmxvY2sKKykKK3sKKyAgICBpbnQgcmVzdWx0ID0gMDsKKworICAgIE9GRkxPQUQgb2ZsZCA9IE9GRkxPQURfVEFSR0VUX0FDUVVJUkUodGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIDAsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgMCk7CisgICAgaWYgKG9mbGQgIT0gMCkgeworICAgICAgICBWYXJEZXNjIHZhcnNbMl0gPSB7MH07CisKKyAgICAgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2lub3V0OworICAgICAgICB2YXJzWzBdLnNpemUgPSBzaXplb2Yob21wX25lc3RfbG9ja190YXJnZXRfdCk7CisgICAgICAgIHZhcnNbMF0uY291bnQgPSAxOworICAgICAgICB2YXJzWzBdLnB0ciA9IGxvY2s7CisKKyAgICAgICAgdmFyc1sxXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1sxXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1sxXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX291dDsKKyAgICAgICAgdmFyc1sxXS5zaXplID0gc2l6ZW9mKGludCk7CisgICAgICAgIHZhcnNbMV0uY291bnQgPSAxOworICAgICAgICB2YXJzWzFdLnB0ciA9ICZyZXN1bHQ7CisKKyAgICAgICAgT0ZGTE9BRF9PRkZMT0FEKG9mbGQsICJvbXBfdGVzdF9uZXN0X2xvY2tfdGFyZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDIsIHZhcnMsIE5VTEwsIDAsIDAsIDApOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvLyBrbXAgQVBJIGZ1bmN0aW9ucworCit2b2lkIGttcF9zZXRfc3RhY2tzaXplX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBpbnQgc2l6ZQorKQoreworICAgIG9tcF9zZXRfaW50X3RhcmdldCh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgImttcF9zZXRfc3RhY2tzaXplX3RhcmdldCIpOworfQorCitpbnQga21wX2dldF9zdGFja3NpemVfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyCispCit7CisgICAgcmV0dXJuIG9tcF9nZXRfaW50X3RhcmdldCh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJrbXBfZ2V0X3N0YWNrc2l6ZV90YXJnZXQiKTsKK30KKwordm9pZCBrbXBfc2V0X3N0YWNrc2l6ZV9zX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBzaXplX3Qgc2l6ZQorKQoreworICAgIG9tcF9zZXRfaW50X3RhcmdldCh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgImttcF9zZXRfc3RhY2tzaXplX3NfdGFyZ2V0Iik7Cit9CisKK3NpemVfdCBrbXBfZ2V0X3N0YWNrc2l6ZV9zX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKQoreworICAgIHJldHVybiBvbXBfZ2V0X2ludF90YXJnZXQodGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAia21wX2dldF9zdGFja3NpemVfc190YXJnZXQiKTsKK30KKwordm9pZCBrbXBfc2V0X2Jsb2NrdGltZV90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgaW50IHRpbWUKKykKK3sKKyAgICBvbXBfc2V0X2ludF90YXJnZXQodGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIHRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICJrbXBfc2V0X2Jsb2NrdGltZV90YXJnZXQiKTsKK30KKworaW50IGttcF9nZXRfYmxvY2t0aW1lX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKQoreworICAgIHJldHVybiBvbXBfZ2V0X2ludF90YXJnZXQodGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAia21wX2dldF9ibG9ja3RpbWVfdGFyZ2V0Iik7Cit9CisKK3ZvaWQga21wX3NldF9saWJyYXJ5X3NlcmlhbF90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSBPRkZMT0FEX1RBUkdFVF9BQ1FVSVJFKHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCAwLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIDApOworICAgIGlmIChvZmxkICE9IDApIHsKKyAgICAgICAgT0ZGTE9BRF9PRkZMT0FEKG9mbGQsICJrbXBfc2V0X2xpYnJhcnlfc2VyaWFsX3RhcmdldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwKTsKKyAgICB9Cit9CisKK3ZvaWQga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmRfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRSh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgMCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCAwKTsKKyAgICBpZiAob2ZsZCAhPSAwKSB7CisgICAgICAgIE9GRkxPQURfT0ZGTE9BRChvZmxkLCAia21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmRfdGFyZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDApOworICAgIH0KK30KKwordm9pZCBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dF90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSBPRkZMT0FEX1RBUkdFVF9BQ1FVSVJFKHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCAwLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIDApOworICAgIGlmIChvZmxkICE9IDApIHsKKyAgICAgICAgT0ZGTE9BRF9PRkZMT0FEKG9mbGQsICJrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dF90YXJnZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCk7CisgICAgfQorfQorCit2b2lkIGttcF9zZXRfbGlicmFyeV90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgaW50IG1vZGUKKykKK3sKKyAgICBvbXBfc2V0X2ludF90YXJnZXQodGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICJrbXBfc2V0X2xpYnJhcnlfdGFyZ2V0Iik7Cit9CisKK2ludCBrbXBfZ2V0X2xpYnJhcnlfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyCispCit7CisgICAgcmV0dXJuIG9tcF9nZXRfaW50X3RhcmdldCh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJrbXBfZ2V0X2xpYnJhcnlfdGFyZ2V0Iik7Cit9CisKK3ZvaWQga21wX3NldF9kZWZhdWx0c190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgY2hhciBjb25zdCAqZGVmYXVsdHMKKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSBPRkZMT0FEX1RBUkdFVF9BQ1FVSVJFKHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCAwLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIDApOworICAgIGlmIChvZmxkICE9IDApIHsKKyAgICAgICAgVmFyRGVzYyB2YXJzWzFdID0gezB9OworCisgICAgICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX3N0cmluZ19wdHI7CisgICAgICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX3N0cmluZ19wdHI7CisgICAgICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbjsKKyAgICAgICAgdmFyc1swXS5hbGxvY19pZiA9IDE7CisgICAgICAgIHZhcnNbMF0uZnJlZV9pZiA9IDE7CisgICAgICAgIHZhcnNbMF0ucHRyID0gJmRlZmF1bHRzOworCisgICAgICAgIE9GRkxPQURfT0ZGTE9BRChvZmxkLCAia21wX3NldF9kZWZhdWx0c190YXJnZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMSwgdmFycywgTlVMTCwgMCwgMCwgMCk7CisgICAgfQorfQorCisvLyBhZmZpbml0eSBBUEkgZnVuY3Rpb25zCisKK3ZvaWQga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBrbXBfYWZmaW5pdHlfbWFza190YXJnZXRfdCAqbWFzaworKQoreworICAgIE9GRkxPQUQgb2ZsZCA9IE9GRkxPQURfVEFSR0VUX0FDUVVJUkUodGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIDAsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgMCk7CisgICAgaWYgKG9mbGQgIT0gMCkgeworICAgICAgICBWYXJEZXNjIHZhcnNbMV0gPSB7MH07CisKKyAgICAgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX291dDsKKyAgICAgICAgdmFyc1swXS5zaXplID0gc2l6ZW9mKGttcF9hZmZpbml0eV9tYXNrX3RhcmdldF90KTsKKyAgICAgICAgdmFyc1swXS5jb3VudCA9IDE7CisgICAgICAgIHZhcnNbMF0ucHRyID0gbWFzazsKKworICAgICAgICBPRkZMT0FEX09GRkxPQUQob2ZsZCwgImttcF9jcmVhdGVfYWZmaW5pdHlfbWFza190YXJnZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMSwgdmFycywgTlVMTCwgMCwgMCwgMCk7CisgICAgfQorfQorCit2b2lkIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2tfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGttcF9hZmZpbml0eV9tYXNrX3RhcmdldF90ICptYXNrCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRSh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgMCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCAwKTsKKyAgICBpZiAob2ZsZCAhPSAwKSB7CisgICAgICAgIFZhckRlc2MgdmFyc1sxXSA9IHswfTsKKworICAgICAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW47CisgICAgICAgIHZhcnNbMF0uc2l6ZSA9IHNpemVvZihrbXBfYWZmaW5pdHlfbWFza190YXJnZXRfdCk7CisgICAgICAgIHZhcnNbMF0uY291bnQgPSAxOworICAgICAgICB2YXJzWzBdLnB0ciA9IG1hc2s7CisKKyAgICAgICAgT0ZGTE9BRF9PRkZMT0FEKG9mbGQsICJrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrX3RhcmdldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAxLCB2YXJzLCBOVUxMLCAwLCAwLCAwKTsKKyAgICB9Cit9CisKK2ludCBrbXBfc2V0X2FmZmluaXR5X3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBrbXBfYWZmaW5pdHlfbWFza190YXJnZXRfdCAqbWFzaworKQoreworICAgIGludCByZXN1bHQgPSAxOworCisgICAgT0ZGTE9BRCBvZmxkID0gT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRSh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgMCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCAwKTsKKyAgICBpZiAob2ZsZCAhPSAwKSB7CisgICAgICAgIFZhckRlc2MgdmFyc1syXSA9IHswfTsKKworICAgICAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW47CisgICAgICAgIHZhcnNbMF0uc2l6ZSA9IHNpemVvZihrbXBfYWZmaW5pdHlfbWFza190YXJnZXRfdCk7CisgICAgICAgIHZhcnNbMF0uY291bnQgPSAxOworICAgICAgICB2YXJzWzBdLnB0ciA9IG1hc2s7CisKKyAgICAgICAgdmFyc1sxXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1sxXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1sxXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX291dDsKKyAgICAgICAgdmFyc1sxXS5zaXplID0gc2l6ZW9mKGludCk7CisgICAgICAgIHZhcnNbMV0uY291bnQgPSAxOworICAgICAgICB2YXJzWzFdLnB0ciA9ICZyZXN1bHQ7CisKKyAgICAgICAgT0ZGTE9BRF9PRkZMT0FEKG9mbGQsICJrbXBfc2V0X2FmZmluaXR5X3RhcmdldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAyLCB2YXJzLCBOVUxMLCAwLCAwLCAwKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworaW50IGttcF9nZXRfYWZmaW5pdHlfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGttcF9hZmZpbml0eV9tYXNrX3RhcmdldF90ICptYXNrCispCit7CisgICAgaW50IHJlc3VsdCA9IDE7CisKKyAgICBPRkZMT0FEIG9mbGQgPSBPRkZMT0FEX1RBUkdFVF9BQ1FVSVJFKHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCAwLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIDApOworICAgIGlmIChvZmxkICE9IDApIHsKKyAgICAgICAgVmFyRGVzYyB2YXJzWzJdID0gezB9OworCisgICAgICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbm91dDsKKyAgICAgICAgdmFyc1swXS5zaXplID0gc2l6ZW9mKGttcF9hZmZpbml0eV9tYXNrX3RhcmdldF90KTsKKyAgICAgICAgdmFyc1swXS5jb3VudCA9IDE7CisgICAgICAgIHZhcnNbMF0ucHRyID0gbWFzazsKKworICAgICAgICB2YXJzWzFdLnR5cGUuc3JjID0gY19kYXRhOworICAgICAgICB2YXJzWzFdLnR5cGUuZHN0ID0gY19kYXRhOworICAgICAgICB2YXJzWzFdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfb3V0OworICAgICAgICB2YXJzWzFdLnNpemUgPSBzaXplb2YoaW50KTsKKyAgICAgICAgdmFyc1sxXS5jb3VudCA9IDE7CisgICAgICAgIHZhcnNbMV0ucHRyID0gJnJlc3VsdDsKKworICAgICAgICBPRkZMT0FEX09GRkxPQUQob2ZsZCwgImttcF9nZXRfYWZmaW5pdHlfdGFyZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDIsIHZhcnMsIE5VTEwsIDAsIDAsIDApOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitpbnQga21wX2dldF9hZmZpbml0eV9tYXhfcHJvY190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKykKK3sKKyAgICByZXR1cm4gb21wX2dldF9pbnRfdGFyZ2V0KHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2NfdGFyZ2V0Iik7Cit9CisKK2ludCBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvY190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgaW50IHByb2MsCisgICAga21wX2FmZmluaXR5X21hc2tfdGFyZ2V0X3QgKm1hc2sKKykKK3sKKyAgICBpbnQgcmVzdWx0ID0gMTsKKworICAgIE9GRkxPQUQgb2ZsZCA9IE9GRkxPQURfVEFSR0VUX0FDUVVJUkUodGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIDAsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgMCk7CisgICAgaWYgKG9mbGQgIT0gMCkgeworICAgICAgICBWYXJEZXNjIHZhcnNbM10gPSB7MH07CisKKyAgICAgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2luOworICAgICAgICB2YXJzWzBdLnNpemUgPSBzaXplb2YoaW50KTsKKyAgICAgICAgdmFyc1swXS5jb3VudCA9IDE7CisgICAgICAgIHZhcnNbMF0ucHRyID0gJnByb2M7CisKKyAgICAgICAgdmFyc1sxXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1sxXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1sxXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2lub3V0OworICAgICAgICB2YXJzWzFdLnNpemUgPSBzaXplb2Yoa21wX2FmZmluaXR5X21hc2tfdGFyZ2V0X3QpOworICAgICAgICB2YXJzWzFdLmNvdW50ID0gMTsKKyAgICAgICAgdmFyc1sxXS5wdHIgPSBtYXNrOworCisgICAgICAgIHZhcnNbMl0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMl0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMl0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9vdXQ7CisgICAgICAgIHZhcnNbMl0uc2l6ZSA9IHNpemVvZihpbnQpOworICAgICAgICB2YXJzWzJdLmNvdW50ID0gMTsKKyAgICAgICAgdmFyc1syXS5wdHIgPSAmcmVzdWx0OworCisgICAgICAgIE9GRkxPQURfT0ZGTE9BRChvZmxkLCAia21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2NfdGFyZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDMsIHZhcnMsIE5VTEwsIDAsIDAsIDApOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitpbnQga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvY190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgaW50IHByb2MsCisgICAga21wX2FmZmluaXR5X21hc2tfdGFyZ2V0X3QgKm1hc2sKKykKK3sKKyAgICBpbnQgcmVzdWx0ID0gMTsKKworICAgIE9GRkxPQUQgb2ZsZCA9IE9GRkxPQURfVEFSR0VUX0FDUVVJUkUodGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIDAsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgMCk7CisgICAgaWYgKG9mbGQgIT0gMCkgeworICAgICAgICBWYXJEZXNjIHZhcnNbM10gPSB7MH07CisKKyAgICAgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2luOworICAgICAgICB2YXJzWzBdLnNpemUgPSBzaXplb2YoaW50KTsKKyAgICAgICAgdmFyc1swXS5jb3VudCA9IDE7CisgICAgICAgIHZhcnNbMF0ucHRyID0gJnByb2M7CisKKyAgICAgICAgdmFyc1sxXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1sxXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1sxXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2lub3V0OworICAgICAgICB2YXJzWzFdLnNpemUgPSBzaXplb2Yoa21wX2FmZmluaXR5X21hc2tfdGFyZ2V0X3QpOworICAgICAgICB2YXJzWzFdLmNvdW50ID0gMTsKKyAgICAgICAgdmFyc1sxXS5wdHIgPSBtYXNrOworCisgICAgICAgIHZhcnNbMl0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMl0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMl0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9vdXQ7CisgICAgICAgIHZhcnNbMl0uc2l6ZSA9IHNpemVvZihpbnQpOworICAgICAgICB2YXJzWzJdLmNvdW50ID0gMTsKKyAgICAgICAgdmFyc1syXS5wdHIgPSAmcmVzdWx0OworCisgICAgICAgIE9GRkxPQURfT0ZGTE9BRChvZmxkLCAia21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvY190YXJnZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMywgdmFycywgTlVMTCwgMCwgMCwgMCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK2ludCBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvY190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgaW50IHByb2MsCisgICAga21wX2FmZmluaXR5X21hc2tfdGFyZ2V0X3QgKm1hc2sKKykKK3sKKyAgICBpbnQgcmVzdWx0ID0gMTsKKworICAgIE9GRkxPQUQgb2ZsZCA9IE9GRkxPQURfVEFSR0VUX0FDUVVJUkUodGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIDAsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgMCk7CisgICAgaWYgKG9mbGQgIT0gMCkgeworICAgICAgICBWYXJEZXNjIHZhcnNbM10gPSB7MH07CisKKyAgICAgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2luOworICAgICAgICB2YXJzWzBdLnNpemUgPSBzaXplb2YoaW50KTsKKyAgICAgICAgdmFyc1swXS5jb3VudCA9IDE7CisgICAgICAgIHZhcnNbMF0ucHRyID0gJnByb2M7CisKKyAgICAgICAgdmFyc1sxXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1sxXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1sxXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2luOworICAgICAgICB2YXJzWzFdLnNpemUgPSBzaXplb2Yoa21wX2FmZmluaXR5X21hc2tfdGFyZ2V0X3QpOworICAgICAgICB2YXJzWzFdLmNvdW50ID0gMTsKKyAgICAgICAgdmFyc1sxXS5wdHIgPSBtYXNrOworCisgICAgICAgIHZhcnNbMl0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMl0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMl0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9vdXQ7CisgICAgICAgIHZhcnNbMl0uc2l6ZSA9IHNpemVvZihpbnQpOworICAgICAgICB2YXJzWzJdLmNvdW50ID0gMTsKKyAgICAgICAgdmFyc1syXS5wdHIgPSAmcmVzdWx0OworCisgICAgICAgIE9GRkxPQURfT0ZGTE9BRChvZmxkLCAia21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2NfdGFyZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDMsIHZhcnMsIE5VTEwsIDAsIDAsIDApOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQpkaWZmIC0tZ2l0IGEvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9vbXBfdGFyZ2V0LmNwcCBiL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfb21wX3RhcmdldC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYyMDUyYQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfb21wX3RhcmdldC5jcHAKQEAgLTAsMCArMSwxMDIxIEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlIDxvbXAuaD4KKyNpbmNsdWRlICJvZmZsb2FkLmgiCisjaW5jbHVkZSAiY29tcGlsZXJfaWZfdGFyZ2V0LmgiCisKKy8vIE9wZW5NUCBBUEkKKwordm9pZCBvbXBfc2V0X2RlZmF1bHRfZGV2aWNlKGludCBudW0pCit7Cit9CisKK2ludCBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlKHZvaWQpCit7CisgICAgcmV0dXJuIG1pY19pbmRleDsKK30KKworaW50IG9tcF9nZXRfbnVtX2RldmljZXMoKQoreworICAgIHJldHVybiBtaWNfZW5naW5lc190b3RhbDsKK30KKworLy8gT3Blbk1QIEFQSSB3cmFwcGVycworCitzdGF0aWMgdm9pZCBvbXBfc2VuZF9pbnRfdG9faG9zdCgKKyAgICB2b2lkICpvZmxkXywKKyAgICBpbnQgc2V0dGluZworKQoreworICAgIE9GRkxPQUQgb2ZsZCA9IChPRkZMT0FEKSBvZmxkXzsKKyAgICBWYXJEZXNjIHZhcnNbMV0gPSB7MH07CisKKyAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX291dDsKKyAgICB2YXJzWzBdLnB0ciA9ICZzZXR0aW5nOworCisgICAgT0ZGTE9BRF9UQVJHRVRfRU5URVIob2ZsZCwgMSwgdmFycywgTlVMTCk7CisgICAgT0ZGTE9BRF9UQVJHRVRfTEVBVkUob2ZsZCk7Cit9CisKK3N0YXRpYyBpbnQgb21wX2dldF9pbnRfZnJvbV9ob3N0KAorICAgIHZvaWQgKm9mbGRfCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gKE9GRkxPQUQpIG9mbGRfOworICAgIFZhckRlc2MgdmFyc1sxXSA9IHswfTsKKyAgICBpbnQgc2V0dGluZzsKKworICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW47CisgICAgdmFyc1swXS5wdHIgPSAmc2V0dGluZzsKKworICAgIE9GRkxPQURfVEFSR0VUX0VOVEVSKG9mbGQsIDEsIHZhcnMsIE5VTEwpOworICAgIE9GRkxPQURfVEFSR0VUX0xFQVZFKG9mbGQpOworCisgICAgcmV0dXJuIHNldHRpbmc7Cit9CisKK3ZvaWQgb21wX3NldF9udW1fdGhyZWFkc19scmIoCisgICAgdm9pZCAqb2ZsZAorKQoreworICAgIGludCBudW1fdGhyZWFkczsKKworICAgIG51bV90aHJlYWRzID0gb21wX2dldF9pbnRfZnJvbV9ob3N0KG9mbGQpOworICAgIG9tcF9zZXRfbnVtX3RocmVhZHMobnVtX3RocmVhZHMpOworfQorCit2b2lkIG9tcF9nZXRfbWF4X3RocmVhZHNfbHJiKAorICAgIHZvaWQgKm9mbGQKKykKK3sKKyAgICBpbnQgbnVtX3RocmVhZHM7CisKKyAgICBudW1fdGhyZWFkcyA9IG9tcF9nZXRfbWF4X3RocmVhZHMoKTsKKyAgICBvbXBfc2VuZF9pbnRfdG9faG9zdChvZmxkLCBudW1fdGhyZWFkcyk7Cit9CisKK3ZvaWQgb21wX2dldF9udW1fcHJvY3NfbHJiKAorICAgIHZvaWQgKm9mbGQKKykKK3sKKyAgICBpbnQgbnVtX3Byb2NzOworCisgICAgbnVtX3Byb2NzID0gb21wX2dldF9udW1fcHJvY3MoKTsKKyAgICBvbXBfc2VuZF9pbnRfdG9faG9zdChvZmxkLCBudW1fcHJvY3MpOworfQorCit2b2lkIG9tcF9zZXRfZHluYW1pY19scmIoCisgICAgdm9pZCAqb2ZsZAorKQoreworICAgIGludCBkeW5hbWljOworCisgICAgZHluYW1pYyA9IG9tcF9nZXRfaW50X2Zyb21faG9zdChvZmxkKTsKKyAgICBvbXBfc2V0X2R5bmFtaWMoZHluYW1pYyk7Cit9CisKK3ZvaWQgb21wX2dldF9keW5hbWljX2xyYigKKyAgICB2b2lkICpvZmxkCispCit7CisgICAgaW50IGR5bmFtaWM7CisKKyAgICBkeW5hbWljID0gb21wX2dldF9keW5hbWljKCk7CisgICAgb21wX3NlbmRfaW50X3RvX2hvc3Qob2ZsZCwgZHluYW1pYyk7Cit9CisKK3ZvaWQgb21wX3NldF9uZXN0ZWRfbHJiKAorICAgIHZvaWQgKm9mbGQKKykKK3sKKyAgICBpbnQgbmVzdGVkOworCisgICAgbmVzdGVkID0gb21wX2dldF9pbnRfZnJvbV9ob3N0KG9mbGQpOworICAgIG9tcF9zZXRfbmVzdGVkKG5lc3RlZCk7Cit9CisKK3ZvaWQgb21wX2dldF9uZXN0ZWRfbHJiKAorICAgIHZvaWQgKm9mbGQKKykKK3sKKyAgICBpbnQgbmVzdGVkOworCisgICAgbmVzdGVkID0gb21wX2dldF9uZXN0ZWQoKTsKKyAgICBvbXBfc2VuZF9pbnRfdG9faG9zdChvZmxkLCBuZXN0ZWQpOworfQorCit2b2lkIG9tcF9zZXRfc2NoZWR1bGVfbHJiKAorICAgIHZvaWQgKm9mbGRfCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gKE9GRkxPQUQpIG9mbGRfOworICAgIFZhckRlc2MgdmFyc1syXSA9IHswfTsKKyAgICBvbXBfc2NoZWRfdCBraW5kOworICAgIGludCBtb2RpZmllcjsKKworICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW47CisgICAgdmFyc1swXS5wdHIgPSAma2luZDsKKworICAgIHZhcnNbMV0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgdmFyc1sxXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICB2YXJzWzFdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW47CisgICAgdmFyc1sxXS5wdHIgPSAmbW9kaWZpZXI7CisKKyAgICBPRkZMT0FEX1RBUkdFVF9FTlRFUihvZmxkLCAyLCB2YXJzLCBOVUxMKTsKKyAgICBvbXBfc2V0X3NjaGVkdWxlKGtpbmQsIG1vZGlmaWVyKTsKKyAgICBPRkZMT0FEX1RBUkdFVF9MRUFWRShvZmxkKTsKK30KKwordm9pZCBvbXBfZ2V0X3NjaGVkdWxlX2xyYigKKyAgICB2b2lkICpvZmxkXworKQoreworICAgIE9GRkxPQUQgb2ZsZCA9IChPRkZMT0FEKSBvZmxkXzsKKyAgICBWYXJEZXNjIHZhcnNbMl0gPSB7MH07CisgICAgb21wX3NjaGVkX3Qga2luZDsKKyAgICBpbnQgbW9kaWZpZXI7CisKKyAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX291dDsKKyAgICB2YXJzWzBdLnB0ciA9ICZraW5kOworCisgICAgdmFyc1sxXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICB2YXJzWzFdLnR5cGUuZHN0ID0gY19kYXRhOworICAgIHZhcnNbMV0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9vdXQ7CisgICAgdmFyc1sxXS5wdHIgPSAmbW9kaWZpZXI7CisKKyAgICBPRkZMT0FEX1RBUkdFVF9FTlRFUihvZmxkLCAyLCB2YXJzLCBOVUxMKTsKKyAgICBvbXBfZ2V0X3NjaGVkdWxlKCZraW5kLCAmbW9kaWZpZXIpOworICAgIE9GRkxPQURfVEFSR0VUX0xFQVZFKG9mbGQpOworfQorCisvLyBsb2NrIEFQSSBmdW5jdGlvbnMKKwordm9pZCBvbXBfaW5pdF9sb2NrX2xyYigKKyAgICB2b2lkICpvZmxkXworKQoreworICAgIE9GRkxPQUQgb2ZsZCA9IChPRkZMT0FEKSBvZmxkXzsKKyAgICBWYXJEZXNjIHZhcnNbMV0gPSB7MH07CisgICAgb21wX2xvY2tfdGFyZ2V0X3QgbG9jazsKKworICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfb3V0OworICAgIHZhcnNbMF0ucHRyID0gJmxvY2s7CisKKyAgICBPRkZMT0FEX1RBUkdFVF9FTlRFUihvZmxkLCAxLCB2YXJzLCBOVUxMKTsKKyAgICBvbXBfaW5pdF9sb2NrKCZsb2NrLmxvY2spOworICAgIE9GRkxPQURfVEFSR0VUX0xFQVZFKG9mbGQpOworfQorCit2b2lkIG9tcF9kZXN0cm95X2xvY2tfbHJiKAorICAgIHZvaWQgKm9mbGRfCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gKE9GRkxPQUQpIG9mbGRfOworICAgIFZhckRlc2MgdmFyc1sxXSA9IHswfTsKKyAgICBvbXBfbG9ja190YXJnZXRfdCBsb2NrOworCisgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbjsKKyAgICB2YXJzWzBdLnB0ciA9ICZsb2NrOworCisgICAgT0ZGTE9BRF9UQVJHRVRfRU5URVIob2ZsZCwgMSwgdmFycywgTlVMTCk7CisgICAgb21wX2Rlc3Ryb3lfbG9jaygmbG9jay5sb2NrKTsKKyAgICBPRkZMT0FEX1RBUkdFVF9MRUFWRShvZmxkKTsKK30KKwordm9pZCBvbXBfc2V0X2xvY2tfbHJiKAorICAgIHZvaWQgKm9mbGRfCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gKE9GRkxPQUQpIG9mbGRfOworICAgIFZhckRlc2MgdmFyc1sxXSA9IHswfTsKKyAgICBvbXBfbG9ja190YXJnZXRfdCBsb2NrOworCisgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbm91dDsKKyAgICB2YXJzWzBdLnB0ciA9ICZsb2NrOworCisgICAgT0ZGTE9BRF9UQVJHRVRfRU5URVIob2ZsZCwgMSwgdmFycywgTlVMTCk7CisgICAgb21wX3NldF9sb2NrKCZsb2NrLmxvY2spOworICAgIE9GRkxPQURfVEFSR0VUX0xFQVZFKG9mbGQpOworfQorCit2b2lkIG9tcF91bnNldF9sb2NrX2xyYigKKyAgICB2b2lkICpvZmxkXworKQoreworICAgIE9GRkxPQUQgb2ZsZCA9IChPRkZMT0FEKSBvZmxkXzsKKyAgICBWYXJEZXNjIHZhcnNbMV0gPSB7MH07CisgICAgb21wX2xvY2tfdGFyZ2V0X3QgbG9jazsKKworICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW5vdXQ7CisgICAgdmFyc1swXS5wdHIgPSAmbG9jazsKKworICAgIE9GRkxPQURfVEFSR0VUX0VOVEVSKG9mbGQsIDEsIHZhcnMsIE5VTEwpOworICAgIG9tcF91bnNldF9sb2NrKCZsb2NrLmxvY2spOworICAgIE9GRkxPQURfVEFSR0VUX0xFQVZFKG9mbGQpOworfQorCit2b2lkIG9tcF90ZXN0X2xvY2tfbHJiKAorICAgIHZvaWQgKm9mbGRfCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gKE9GRkxPQUQpIG9mbGRfOworICAgIFZhckRlc2MgdmFyc1syXSA9IHswfTsKKyAgICBvbXBfbG9ja190YXJnZXRfdCBsb2NrOworICAgIGludCByZXN1bHQ7CisKKyAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2lub3V0OworICAgIHZhcnNbMF0ucHRyID0gJmxvY2s7CisKKyAgICB2YXJzWzFdLnR5cGUuc3JjID0gY19kYXRhOworICAgIHZhcnNbMV0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgdmFyc1sxXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX291dDsKKyAgICB2YXJzWzFdLnB0ciA9ICZyZXN1bHQ7CisKKyAgICBPRkZMT0FEX1RBUkdFVF9FTlRFUihvZmxkLCAyLCB2YXJzLCBOVUxMKTsKKyAgICByZXN1bHQgPSBvbXBfdGVzdF9sb2NrKCZsb2NrLmxvY2spOworICAgIE9GRkxPQURfVEFSR0VUX0xFQVZFKG9mbGQpOworfQorCisvLyBuZXN0ZWQgbG9jayBBUEkgZnVuY3Rpb25zCisKK3ZvaWQgb21wX2luaXRfbmVzdF9sb2NrX2xyYigKKyAgICB2b2lkICpvZmxkXworKQoreworICAgIE9GRkxPQUQgb2ZsZCA9IChPRkZMT0FEKSBvZmxkXzsKKyAgICBWYXJEZXNjIHZhcnNbMV0gPSB7MH07CisgICAgb21wX25lc3RfbG9ja190YXJnZXRfdCBsb2NrOworCisgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9vdXQ7CisgICAgdmFyc1swXS5wdHIgPSAmbG9jazsKKworICAgIE9GRkxPQURfVEFSR0VUX0VOVEVSKG9mbGQsIDEsIHZhcnMsIE5VTEwpOworICAgIG9tcF9pbml0X25lc3RfbG9jaygmbG9jay5sb2NrKTsKKyAgICBPRkZMT0FEX1RBUkdFVF9MRUFWRShvZmxkKTsKK30KKwordm9pZCBvbXBfZGVzdHJveV9uZXN0X2xvY2tfbHJiKAorICAgIHZvaWQgKm9mbGRfCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gKE9GRkxPQUQpIG9mbGRfOworICAgIFZhckRlc2MgdmFyc1sxXSA9IHswfTsKKyAgICBvbXBfbmVzdF9sb2NrX3RhcmdldF90IGxvY2s7CisKKyAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2luOworICAgIHZhcnNbMF0ucHRyID0gJmxvY2s7CisKKyAgICBPRkZMT0FEX1RBUkdFVF9FTlRFUihvZmxkLCAxLCB2YXJzLCBOVUxMKTsKKyAgICBvbXBfZGVzdHJveV9uZXN0X2xvY2soJmxvY2subG9jayk7CisgICAgT0ZGTE9BRF9UQVJHRVRfTEVBVkUob2ZsZCk7Cit9CisKK3ZvaWQgb21wX3NldF9uZXN0X2xvY2tfbHJiKAorICAgIHZvaWQgKm9mbGRfCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gKE9GRkxPQUQpIG9mbGRfOworICAgIFZhckRlc2MgdmFyc1sxXSA9IHswfTsKKyAgICBvbXBfbmVzdF9sb2NrX3RhcmdldF90IGxvY2s7CisKKyAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2lub3V0OworICAgIHZhcnNbMF0ucHRyID0gJmxvY2s7CisKKyAgICBPRkZMT0FEX1RBUkdFVF9FTlRFUihvZmxkLCAxLCB2YXJzLCBOVUxMKTsKKyAgICBvbXBfc2V0X25lc3RfbG9jaygmbG9jay5sb2NrKTsKKyAgICBPRkZMT0FEX1RBUkdFVF9MRUFWRShvZmxkKTsKK30KKwordm9pZCBvbXBfdW5zZXRfbmVzdF9sb2NrX2xyYigKKyAgICB2b2lkICpvZmxkXworKQoreworICAgIE9GRkxPQUQgb2ZsZCA9IChPRkZMT0FEKSBvZmxkXzsKKyAgICBWYXJEZXNjIHZhcnNbMV0gPSB7MH07CisgICAgb21wX25lc3RfbG9ja190YXJnZXRfdCBsb2NrOworCisgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbm91dDsKKyAgICB2YXJzWzBdLnB0ciA9ICZsb2NrOworCisgICAgT0ZGTE9BRF9UQVJHRVRfRU5URVIob2ZsZCwgMSwgdmFycywgTlVMTCk7CisgICAgb21wX3Vuc2V0X25lc3RfbG9jaygmbG9jay5sb2NrKTsKKyAgICBPRkZMT0FEX1RBUkdFVF9MRUFWRShvZmxkKTsKK30KKwordm9pZCBvbXBfdGVzdF9uZXN0X2xvY2tfbHJiKAorICAgIHZvaWQgKm9mbGRfCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gKE9GRkxPQUQpIG9mbGRfOworICAgIFZhckRlc2MgdmFyc1syXSA9IHswfTsKKyAgICBvbXBfbmVzdF9sb2NrX3RhcmdldF90IGxvY2s7CisgICAgaW50IHJlc3VsdDsKKworICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW5vdXQ7CisgICAgdmFyc1swXS5wdHIgPSAmbG9jazsKKworICAgIHZhcnNbMV0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgdmFyc1sxXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICB2YXJzWzFdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfb3V0OworICAgIHZhcnNbMV0ucHRyID0gJnJlc3VsdDsKKworICAgIE9GRkxPQURfVEFSR0VUX0VOVEVSKG9mbGQsIDIsIHZhcnMsIE5VTEwpOworICAgIHJlc3VsdCA9IG9tcF90ZXN0X25lc3RfbG9jaygmbG9jay5sb2NrKTsKKyAgICBPRkZMT0FEX1RBUkdFVF9MRUFWRShvZmxkKTsKK30KKworLy8ga21wIEFQSSBmdW5jdGlvbnMKKwordm9pZCBrbXBfc2V0X3N0YWNrc2l6ZV9scmIoCisgICAgdm9pZCAqb2ZsZAorKQoreworICAgIGludCBzaXplOworCisgICAgc2l6ZSA9IG9tcF9nZXRfaW50X2Zyb21faG9zdChvZmxkKTsKKyAgICBrbXBfc2V0X3N0YWNrc2l6ZShzaXplKTsKK30KKwordm9pZCBrbXBfZ2V0X3N0YWNrc2l6ZV9scmIoCisgICAgdm9pZCAqb2ZsZAorKQoreworICAgIGludCBzaXplOworCisgICAgc2l6ZSA9IGttcF9nZXRfc3RhY2tzaXplKCk7CisgICAgb21wX3NlbmRfaW50X3RvX2hvc3Qob2ZsZCwgc2l6ZSk7Cit9CisKK3ZvaWQga21wX3NldF9zdGFja3NpemVfc19scmIoCisgICAgdm9pZCAqb2ZsZAorKQoreworICAgIGludCBzaXplOworCisgICAgc2l6ZSA9IG9tcF9nZXRfaW50X2Zyb21faG9zdChvZmxkKTsKKyAgICBrbXBfc2V0X3N0YWNrc2l6ZV9zKHNpemUpOworfQorCit2b2lkIGttcF9nZXRfc3RhY2tzaXplX3NfbHJiKAorICAgIHZvaWQgKm9mbGQKKykKK3sKKyAgICBpbnQgc2l6ZTsKKworICAgIHNpemUgPSBrbXBfZ2V0X3N0YWNrc2l6ZV9zKCk7CisgICAgb21wX3NlbmRfaW50X3RvX2hvc3Qob2ZsZCwgc2l6ZSk7Cit9CisKK3ZvaWQga21wX3NldF9ibG9ja3RpbWVfbHJiKAorICAgIHZvaWQgKm9mbGQKKykKK3sKKyAgICBpbnQgdGltZTsKKworICAgIHRpbWUgPSBvbXBfZ2V0X2ludF9mcm9tX2hvc3Qob2ZsZCk7CisgICAga21wX3NldF9ibG9ja3RpbWUodGltZSk7Cit9CisKK3ZvaWQga21wX2dldF9ibG9ja3RpbWVfbHJiKAorICAgIHZvaWQgKm9mbGQKKykKK3sKKyAgICBpbnQgdGltZTsKKworICAgIHRpbWUgPSBrbXBfZ2V0X2Jsb2NrdGltZSgpOworICAgIG9tcF9zZW5kX2ludF90b19ob3N0KG9mbGQsIHRpbWUpOworfQorCit2b2lkIGttcF9zZXRfbGlicmFyeV9zZXJpYWxfbHJiKAorICAgIHZvaWQgKm9mbGRfCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gKE9GRkxPQUQpIG9mbGRfOworCisgICAgT0ZGTE9BRF9UQVJHRVRfRU5URVIob2ZsZCwgMCwgMCwgMCk7CisgICAga21wX3NldF9saWJyYXJ5X3NlcmlhbCgpOworICAgIE9GRkxPQURfVEFSR0VUX0xFQVZFKG9mbGQpOworfQorCit2b2lkIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kX2xyYigKKyAgICB2b2lkICpvZmxkXworKQoreworICAgIE9GRkxPQUQgb2ZsZCA9IChPRkZMT0FEKSBvZmxkXzsKKworICAgIE9GRkxPQURfVEFSR0VUX0VOVEVSKG9mbGQsIDAsIDAsIDApOworICAgIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kKCk7CisgICAgT0ZGTE9BRF9UQVJHRVRfTEVBVkUob2ZsZCk7Cit9CisKK3ZvaWQga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXRfbHJiKAorICAgIHZvaWQgKm9mbGRfCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gKE9GRkxPQUQpIG9mbGRfOworCisgICAgT0ZGTE9BRF9UQVJHRVRfRU5URVIob2ZsZCwgMCwgMCwgMCk7CisgICAga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQoKTsKKyAgICBPRkZMT0FEX1RBUkdFVF9MRUFWRShvZmxkKTsKK30KKwordm9pZCBrbXBfc2V0X2xpYnJhcnlfbHJiKAorICAgIHZvaWQgKm9mbGQKKykKK3sKKyAgICBpbnQgbW9kZTsKKworICAgIG1vZGUgPSBvbXBfZ2V0X2ludF9mcm9tX2hvc3Qob2ZsZCk7CisgICAga21wX3NldF9saWJyYXJ5KG1vZGUpOworfQorCit2b2lkIGttcF9nZXRfbGlicmFyeV9scmIoCisgICAgdm9pZCAqb2ZsZAorKQoreworICAgIGludCBtb2RlOworCisgICAgbW9kZSA9IGttcF9nZXRfbGlicmFyeSgpOworICAgIG9tcF9zZW5kX2ludF90b19ob3N0KG9mbGQsIG1vZGUpOworfQorCit2b2lkIGttcF9zZXRfZGVmYXVsdHNfbHJiKAorICAgIHZvaWQgKm9mbGRfCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gKE9GRkxPQUQpIG9mbGRfOworICAgIFZhckRlc2MgdmFyc1sxXSA9IHswfTsKKyAgICBjaGFyICpkZWZhdWx0cyA9IDA7CisKKyAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19zdHJpbmdfcHRyOworICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX3N0cmluZ19wdHI7CisgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2luOworICAgIHZhcnNbMF0ucHRyID0gJmRlZmF1bHRzOworCisgICAgT0ZGTE9BRF9UQVJHRVRfRU5URVIob2ZsZCwgMSwgdmFycywgTlVMTCk7CisgICAga21wX3NldF9kZWZhdWx0cyhkZWZhdWx0cyk7CisgICAgT0ZGTE9BRF9UQVJHRVRfTEVBVkUob2ZsZCk7Cit9CisKKy8vIGFmZmluaXR5IEFQSSBmdW5jdGlvbnMKKwordm9pZCBrbXBfY3JlYXRlX2FmZmluaXR5X21hc2tfbHJiKAorICAgIHZvaWQgKm9mbGRfCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gKE9GRkxPQUQpIG9mbGRfOworICAgIFZhckRlc2MgdmFyc1sxXSA9IHswfTsKKyAgICBrbXBfYWZmaW5pdHlfbWFza190YXJnZXRfdCBtYXNrOworCisgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9vdXQ7CisgICAgdmFyc1swXS5wdHIgPSAmbWFzazsKKworICAgIE9GRkxPQURfVEFSR0VUX0VOVEVSKG9mbGQsIDEsIHZhcnMsIE5VTEwpOworICAgIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFzaygmbWFzay5tYXNrKTsKKyAgICBPRkZMT0FEX1RBUkdFVF9MRUFWRShvZmxkKTsKK30KKwordm9pZCBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrX2xyYigKKyAgICB2b2lkICpvZmxkXworKQoreworICAgIE9GRkxPQUQgb2ZsZCA9IChPRkZMT0FEKSBvZmxkXzsKKyAgICBWYXJEZXNjIHZhcnNbMV0gPSB7MH07CisgICAga21wX2FmZmluaXR5X21hc2tfdGFyZ2V0X3QgbWFzazsKKworICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW47CisgICAgdmFyc1swXS5wdHIgPSAmbWFzazsKKworICAgIE9GRkxPQURfVEFSR0VUX0VOVEVSKG9mbGQsIDEsIHZhcnMsIE5VTEwpOworICAgIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2soJm1hc2subWFzayk7CisgICAgT0ZGTE9BRF9UQVJHRVRfTEVBVkUob2ZsZCk7Cit9CisKK3ZvaWQga21wX3NldF9hZmZpbml0eV9scmIoCisgICAgdm9pZCAqb2ZsZF8KKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSAoT0ZGTE9BRCkgb2ZsZF87CisgICAgVmFyRGVzYyB2YXJzWzJdID0gezB9OworICAgIGttcF9hZmZpbml0eV9tYXNrX3RhcmdldF90IG1hc2s7CisgICAgaW50IHJlc3VsdDsKKworICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW47CisgICAgdmFyc1swXS5wdHIgPSAmbWFzazsKKworICAgIHZhcnNbMV0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgdmFyc1sxXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICB2YXJzWzFdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfb3V0OworICAgIHZhcnNbMV0ucHRyID0gJnJlc3VsdDsKKworICAgIE9GRkxPQURfVEFSR0VUX0VOVEVSKG9mbGQsIDIsIHZhcnMsIE5VTEwpOworICAgIHJlc3VsdCA9IGttcF9zZXRfYWZmaW5pdHkoJm1hc2subWFzayk7CisgICAgT0ZGTE9BRF9UQVJHRVRfTEVBVkUob2ZsZCk7Cit9CisKK3ZvaWQga21wX2dldF9hZmZpbml0eV9scmIoCisgICAgdm9pZCAqb2ZsZF8KKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSAoT0ZGTE9BRCkgb2ZsZF87CisgICAgVmFyRGVzYyB2YXJzWzJdID0gezB9OworICAgIGttcF9hZmZpbml0eV9tYXNrX3RhcmdldF90IG1hc2s7CisgICAgaW50IHJlc3VsdDsKKworICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW5vdXQ7CisgICAgdmFyc1swXS5wdHIgPSAmbWFzazsKKworICAgIHZhcnNbMV0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgdmFyc1sxXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICB2YXJzWzFdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfb3V0OworICAgIHZhcnNbMV0ucHRyID0gJnJlc3VsdDsKKworICAgIE9GRkxPQURfVEFSR0VUX0VOVEVSKG9mbGQsIDIsIHZhcnMsIE5VTEwpOworICAgIHJlc3VsdCA9IGttcF9nZXRfYWZmaW5pdHkoJm1hc2subWFzayk7CisgICAgT0ZGTE9BRF9UQVJHRVRfTEVBVkUob2ZsZCk7Cit9CisKK3ZvaWQga21wX2dldF9hZmZpbml0eV9tYXhfcHJvY19scmIoCisgICAgdm9pZCAqb2ZsZAorKQoreworICAgIGludCBtYXhfcHJvYzsKKworICAgIG1heF9wcm9jID0ga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYygpOworICAgIG9tcF9zZW5kX2ludF90b19ob3N0KG9mbGQsIG1heF9wcm9jKTsKK30KKwordm9pZCBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvY19scmIoCisgICAgdm9pZCAqb2ZsZF8KKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSAoT0ZGTE9BRCkgb2ZsZF87CisgICAgVmFyRGVzYyB2YXJzWzNdID0gezB9OworICAgIGttcF9hZmZpbml0eV9tYXNrX3RhcmdldF90IG1hc2s7CisgICAgaW50IHByb2MsIHJlc3VsdDsKKworICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW47CisgICAgdmFyc1swXS5wdHIgPSAmcHJvYzsKKworICAgIHZhcnNbMV0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgdmFyc1sxXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICB2YXJzWzFdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW5vdXQ7CisgICAgdmFyc1sxXS5wdHIgPSAmbWFzazsKKworICAgIHZhcnNbMl0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgdmFyc1syXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICB2YXJzWzJdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfb3V0OworICAgIHZhcnNbMl0ucHRyID0gJnJlc3VsdDsKKworICAgIE9GRkxPQURfVEFSR0VUX0VOVEVSKG9mbGQsIDMsIHZhcnMsIE5VTEwpOworICAgIHJlc3VsdCA9IGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jKHByb2MsICZtYXNrLm1hc2spOworICAgIE9GRkxPQURfVEFSR0VUX0xFQVZFKG9mbGQpOworfQorCit2b2lkIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2NfbHJiKAorICAgIHZvaWQgKm9mbGRfCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gKE9GRkxPQUQpIG9mbGRfOworICAgIFZhckRlc2MgdmFyc1szXSA9IHswfTsKKyAgICBrbXBfYWZmaW5pdHlfbWFza190YXJnZXRfdCBtYXNrOworICAgIGludCBwcm9jLCByZXN1bHQ7CisKKyAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2luOworICAgIHZhcnNbMF0ucHRyID0gJnByb2M7CisKKyAgICB2YXJzWzFdLnR5cGUuc3JjID0gY19kYXRhOworICAgIHZhcnNbMV0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgdmFyc1sxXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2lub3V0OworICAgIHZhcnNbMV0ucHRyID0gJm1hc2s7CisKKyAgICB2YXJzWzJdLnR5cGUuc3JjID0gY19kYXRhOworICAgIHZhcnNbMl0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgdmFyc1syXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX291dDsKKyAgICB2YXJzWzJdLnB0ciA9ICZyZXN1bHQ7CisKKyAgICBPRkZMT0FEX1RBUkdFVF9FTlRFUihvZmxkLCAzLCB2YXJzLCBOVUxMKTsKKyAgICByZXN1bHQgPSBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jKHByb2MsICZtYXNrLm1hc2spOworICAgIE9GRkxPQURfVEFSR0VUX0xFQVZFKG9mbGQpOworfQorCit2b2lkIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jX2xyYigKKyAgICB2b2lkICpvZmxkXworKQoreworICAgIE9GRkxPQUQgb2ZsZCA9IChPRkZMT0FEKSBvZmxkXzsKKyAgICBWYXJEZXNjIHZhcnNbM10gPSB7MH07CisgICAga21wX2FmZmluaXR5X21hc2tfdGFyZ2V0X3QgbWFzazsKKyAgICBpbnQgcHJvYywgcmVzdWx0OworCisgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbjsKKyAgICB2YXJzWzBdLnB0ciA9ICZwcm9jOworCisgICAgdmFyc1sxXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICB2YXJzWzFdLnR5cGUuZHN0ID0gY19kYXRhOworICAgIHZhcnNbMV0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbjsKKyAgICB2YXJzWzFdLnB0ciA9ICZtYXNrOworCisgICAgdmFyc1syXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICB2YXJzWzJdLnR5cGUuZHN0ID0gY19kYXRhOworICAgIHZhcnNbMl0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9vdXQ7CisgICAgdmFyc1syXS5wdHIgPSAmcmVzdWx0OworCisgICAgT0ZGTE9BRF9UQVJHRVRfRU5URVIob2ZsZCwgMywgdmFycywgTlVMTCk7CisgICAgcmVzdWx0ID0ga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MocHJvYywgJm1hc2subWFzayk7CisgICAgT0ZGTE9BRF9UQVJHRVRfTEVBVkUob2ZsZCk7Cit9CisKKy8vIFRhcmdldC1zaWRlIHN0dWJzIGZvciB0aGUgaG9zdCBmdW5jdGlvbnMgKHRvIGF2b2lkIHVucmVzb2x2ZWRzKQorLy8gVGhlc2UgYXJlIG5lZWRlZCBmb3IgdGhlIG9mZmxvYWRtIHRhYmxlCisKK3ZvaWQgb21wX3NldF9udW1fdGhyZWFkc190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgaW50IG51bV90aHJlYWRzCispCit7Cit9CisKK2ludCBvbXBfZ2V0X21heF90aHJlYWRzX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKQoreworICAgIHJldHVybiAwOworfQorCitpbnQgb21wX2dldF9udW1fcHJvY3NfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyCispCit7CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgb21wX3NldF9keW5hbWljX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBpbnQgbnVtX3RocmVhZHMKKykKK3sKK30KKworaW50IG9tcF9nZXRfZHluYW1pY190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKykKK3sKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBvbXBfc2V0X25lc3RlZF90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgaW50IG51bV90aHJlYWRzCispCit7Cit9CisKK2ludCBvbXBfZ2V0X25lc3RlZF90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKykKK3sKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBvbXBfc2V0X3NjaGVkdWxlX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBvbXBfc2NoZWRfdCBraW5kLAorICAgIGludCBtb2RpZmllcgorKQoreworfQorCit2b2lkIG9tcF9nZXRfc2NoZWR1bGVfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIG9tcF9zY2hlZF90ICpraW5kLAorICAgIGludCAqbW9kaWZpZXIKKykKK3sKK30KKwordm9pZCBvbXBfaW5pdF9sb2NrX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBvbXBfbG9ja190YXJnZXRfdCAqbG9jaworKQoreworfQorCit2b2lkIG9tcF9kZXN0cm95X2xvY2tfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIG9tcF9sb2NrX3RhcmdldF90ICpsb2NrCispCit7Cit9CisKK3ZvaWQgb21wX3NldF9sb2NrX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBvbXBfbG9ja190YXJnZXRfdCAqbG9jaworKQoreworfQorCit2b2lkIG9tcF91bnNldF9sb2NrX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBvbXBfbG9ja190YXJnZXRfdCAqbG9jaworKQoreworfQorCitpbnQgb21wX3Rlc3RfbG9ja190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgb21wX2xvY2tfdGFyZ2V0X3QgKmxvY2sKKykKK3sKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBvbXBfaW5pdF9uZXN0X2xvY2tfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIG9tcF9uZXN0X2xvY2tfdGFyZ2V0X3QgKmxvY2sKKykKK3sKK30KKwordm9pZCBvbXBfZGVzdHJveV9uZXN0X2xvY2tfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIG9tcF9uZXN0X2xvY2tfdGFyZ2V0X3QgKmxvY2sKKykKK3sKK30KKwordm9pZCBvbXBfc2V0X25lc3RfbG9ja190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgb21wX25lc3RfbG9ja190YXJnZXRfdCAqbG9jaworKQoreworfQorCit2b2lkIG9tcF91bnNldF9uZXN0X2xvY2tfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIG9tcF9uZXN0X2xvY2tfdGFyZ2V0X3QgKmxvY2sKKykKK3sKK30KKworaW50IG9tcF90ZXN0X25lc3RfbG9ja190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgb21wX25lc3RfbG9ja190YXJnZXRfdCAqbG9jaworKQoreworICAgIHJldHVybiAwOworfQorCit2b2lkIGttcF9zZXRfc3RhY2tzaXplX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBpbnQgc2l6ZQorKQoreworfQorCitpbnQga21wX2dldF9zdGFja3NpemVfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyCispCit7CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQga21wX3NldF9zdGFja3NpemVfc190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgc2l6ZV90IHNpemUKKykKK3sKK30KKworc2l6ZV90IGttcF9nZXRfc3RhY2tzaXplX3NfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyCispCit7CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQga21wX3NldF9ibG9ja3RpbWVfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGludCB0aW1lCispCit7Cit9CisKK2ludCBrbXBfZ2V0X2Jsb2NrdGltZV90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKykKK3sKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKQoreworfQorCit2b2lkIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKQoreworfQorCit2b2lkIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0X3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKQoreworfQorCit2b2lkIGttcF9zZXRfbGlicmFyeV90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgaW50IG1vZGUKKykKK3sKK30KKworaW50IGttcF9nZXRfbGlicmFyeV90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKykKK3sKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBrbXBfc2V0X2RlZmF1bHRzX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBjaGFyIGNvbnN0ICpkZWZhdWx0cworKQoreworfQorCit2b2lkIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFza190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAga21wX2FmZmluaXR5X21hc2tfdGFyZ2V0X3QgKm1hc2sKKykKK3sKK30KKwordm9pZCBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBrbXBfYWZmaW5pdHlfbWFza190YXJnZXRfdCAqbWFzaworKQoreworfQorCitpbnQga21wX3NldF9hZmZpbml0eV90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAga21wX2FmZmluaXR5X21hc2tfdGFyZ2V0X3QgKm1hc2sKKykKK3sKKyAgICByZXR1cm4gMDsKK30KKworaW50IGttcF9nZXRfYWZmaW5pdHlfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGttcF9hZmZpbml0eV9tYXNrX3RhcmdldF90ICptYXNrCispCit7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKQoreworICAgIHJldHVybiAwOworfQorCitpbnQga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2NfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGludCBwcm9jLAorICAgIGttcF9hZmZpbml0eV9tYXNrX3RhcmdldF90ICptYXNrCispCit7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBpbnQgcHJvYywKKyAgICBrbXBfYWZmaW5pdHlfbWFza190YXJnZXRfdCAqbWFzaworKQoreworICAgIHJldHVybiAwOworfQorCitpbnQga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2NfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGludCBwcm9jLAorICAgIGttcF9hZmZpbml0eV9tYXNrX3RhcmdldF90ICptYXNrCispCit7CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX29yc2wuY3BwIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9vcnNsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTYyZjhhCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9vcnNsLmNwcApAQCAtMCwwICsxLDg0IEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJvZmZsb2FkX29yc2wuaCIKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJvZmZsb2FkX2hvc3QuaCIKKyNpbmNsdWRlICJvcnNsLWxpdGUvaW5jbHVkZS9vcnNsLWxpdGUuaCIKKworbmFtZXNwYWNlIE9SU0wgeworCitzdGF0aWMgYm9vbCAgICAgICAgICAgIGlzX2VuYWJsZWQgPSBmYWxzZTsKK3N0YXRpYyBjb25zdCBPUlNMVGFnICAgbXlfdGFnID0gIk9mZmxvYWQiOworCit2b2lkIGluaXQoKQoreworICAgIGNvbnN0IGNoYXIgKmVudl92YXIgPSBnZXRlbnYoIk9GRkxPQURfRU5BQkxFX09SU0wiKTsKKyAgICBpZiAoZW52X3ZhciAhPSAwICYmICplbnZfdmFyICE9ICdcMCcpIHsKKyAgICAgICAgaW50NjRfdCBuZXdfdmFsOworICAgICAgICBpZiAoX19vZmZsb2FkX3BhcnNlX2ludF9zdHJpbmcoZW52X3ZhciwgbmV3X3ZhbCkpIHsKKyAgICAgICAgICAgIGlzX2VuYWJsZWQgPSBuZXdfdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX2ludmFsaWRfZW52X3Zhcl9pbnRfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPRkZMT0FEX0VOQUJMRV9PUlNMIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoaXNfZW5hYmxlZCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJPUlNMIGlzIGVuYWJsZWRcbiIpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiT1JTTCBpcyBkaXNhYmxlZFxuIik7CisgICAgfQorfQorCitib29sIHJlc2VydmUoaW50IGRldmljZSkKK3sKKyAgICBpZiAoaXNfZW5hYmxlZCkgeworICAgICAgICBpbnQgcG51bSA9IG1pY19lbmdpbmVzW2RldmljZV0uZ2V0X3BoeXNpY2FsX2luZGV4KCk7CisgICAgICAgIE9SU0xCdXN5U2V0IGJzZXQ7CisKKyAgICAgICAgYnNldC50eXBlID0gQlVTWV9TRVRfRlVMTDsKKyAgICAgICAgaWYgKE9SU0xSZXNlcnZlKDEsICZwbnVtLCAmYnNldCwgbXlfdGFnKSAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgdHJ5X3Jlc2VydmUoaW50IGRldmljZSkKK3sKKyAgICBpZiAoaXNfZW5hYmxlZCkgeworICAgICAgICBpbnQgcG51bSA9IG1pY19lbmdpbmVzW2RldmljZV0uZ2V0X3BoeXNpY2FsX2luZGV4KCk7CisgICAgICAgIE9SU0xCdXN5U2V0IGJzZXQ7CisKKyAgICAgICAgYnNldC50eXBlID0gQlVTWV9TRVRfRlVMTDsKKyAgICAgICAgaWYgKE9SU0xUcnlSZXNlcnZlKDEsICZwbnVtLCAmYnNldCwgbXlfdGFnKSAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgcmVsZWFzZShpbnQgZGV2aWNlKQoreworICAgIGlmIChpc19lbmFibGVkKSB7CisgICAgICAgIGludCBwbnVtID0gbWljX2VuZ2luZXNbZGV2aWNlXS5nZXRfcGh5c2ljYWxfaW5kZXgoKTsKKyAgICAgICAgT1JTTEJ1c3lTZXQgYnNldDsKKworICAgICAgICBic2V0LnR5cGUgPSBCVVNZX1NFVF9GVUxMOworICAgICAgICBpZiAoT1JTTFJlbGVhc2UoMSwgJnBudW0sICZic2V0LCBteV90YWcpICE9IDApIHsKKyAgICAgICAgICAgIC8vIHNob3VsZCBuZXZlciBnZXQgaGVyZQorICAgICAgICB9CisgICAgfQorfQorCit9IC8vIG5hbWVzcGFjZSBPUlNMCmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX29yc2wuaCBiL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfb3JzbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkYjg2ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX29yc2wuaApAQCAtMCwwICsxLDI1IEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgT0ZGTE9BRF9PUlNMX0hfSU5DTFVERUQKKyNkZWZpbmUgT0ZGTE9BRF9PUlNMX0hfSU5DTFVERUQKKworLy8gT1JTTCBpbnRlcmZhY2UKK25hbWVzcGFjZSBPUlNMIHsKKworZXh0ZXJuIHZvaWQgaW5pdCgpOworCitleHRlcm4gYm9vbCByZXNlcnZlKGludCBkZXZpY2UpOworZXh0ZXJuIGJvb2wgdHJ5X3Jlc2VydmUoaW50IGRldmljZSk7CitleHRlcm4gdm9pZCByZWxlYXNlKGludCBkZXZpY2UpOworCit9IC8vIG5hbWVzcGFjZSBPUlNMCisKKyNlbmRpZiAvLyBPRkZMT0FEX09SU0xfSF9JTkNMVURFRApkaWZmIC0tZ2l0IGEvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF90YWJsZS5jcHAgYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX3RhYmxlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjE2NWRmCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF90YWJsZS5jcHAKQEAgLTAsMCArMSwzNzUgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgIm9mZmxvYWRfdGFibGUuaCIKKyNpbmNsdWRlICJvZmZsb2FkX2NvbW1vbi5oIgorCisjaWYgIUhPU1RfTElCUkFSWQorLy8gUHJlZGVmaW5lZCBvZmZsb2FkIGVudHJpZXMKK2V4dGVybiB2b2lkIG9tcF9zZXRfbnVtX3RocmVhZHNfbHJiKHZvaWQqKTsKK2V4dGVybiB2b2lkIG9tcF9nZXRfbWF4X3RocmVhZHNfbHJiKHZvaWQqKTsKK2V4dGVybiB2b2lkIG9tcF9nZXRfbnVtX3Byb2NzX2xyYih2b2lkKik7CitleHRlcm4gdm9pZCBvbXBfc2V0X2R5bmFtaWNfbHJiKHZvaWQqKTsKK2V4dGVybiB2b2lkIG9tcF9nZXRfZHluYW1pY19scmIodm9pZCopOworZXh0ZXJuIHZvaWQgb21wX3NldF9uZXN0ZWRfbHJiKHZvaWQqKTsKK2V4dGVybiB2b2lkIG9tcF9nZXRfbmVzdGVkX2xyYih2b2lkKik7CitleHRlcm4gdm9pZCBvbXBfc2V0X3NjaGVkdWxlX2xyYih2b2lkKik7CitleHRlcm4gdm9pZCBvbXBfZ2V0X3NjaGVkdWxlX2xyYih2b2lkKik7CisKK2V4dGVybiB2b2lkIG9tcF9pbml0X2xvY2tfbHJiKHZvaWQqKTsKK2V4dGVybiB2b2lkIG9tcF9kZXN0cm95X2xvY2tfbHJiKHZvaWQqKTsKK2V4dGVybiB2b2lkIG9tcF9zZXRfbG9ja19scmIodm9pZCopOworZXh0ZXJuIHZvaWQgb21wX3Vuc2V0X2xvY2tfbHJiKHZvaWQqKTsKK2V4dGVybiB2b2lkIG9tcF90ZXN0X2xvY2tfbHJiKHZvaWQqKTsKKworZXh0ZXJuIHZvaWQgb21wX2luaXRfbmVzdF9sb2NrX2xyYih2b2lkKik7CitleHRlcm4gdm9pZCBvbXBfZGVzdHJveV9uZXN0X2xvY2tfbHJiKHZvaWQqKTsKK2V4dGVybiB2b2lkIG9tcF9zZXRfbmVzdF9sb2NrX2xyYih2b2lkKik7CitleHRlcm4gdm9pZCBvbXBfdW5zZXRfbmVzdF9sb2NrX2xyYih2b2lkKik7CitleHRlcm4gdm9pZCBvbXBfdGVzdF9uZXN0X2xvY2tfbHJiKHZvaWQqKTsKKworZXh0ZXJuIHZvaWQga21wX3NldF9zdGFja3NpemVfbHJiKHZvaWQqKTsKK2V4dGVybiB2b2lkIGttcF9nZXRfc3RhY2tzaXplX2xyYih2b2lkKik7CitleHRlcm4gdm9pZCBrbXBfc2V0X3N0YWNrc2l6ZV9zX2xyYih2b2lkKik7CitleHRlcm4gdm9pZCBrbXBfZ2V0X3N0YWNrc2l6ZV9zX2xyYih2b2lkKik7CitleHRlcm4gdm9pZCBrbXBfc2V0X2Jsb2NrdGltZV9scmIodm9pZCopOworZXh0ZXJuIHZvaWQga21wX2dldF9ibG9ja3RpbWVfbHJiKHZvaWQqKTsKK2V4dGVybiB2b2lkIGttcF9zZXRfbGlicmFyeV9zZXJpYWxfbHJiKHZvaWQqKTsKK2V4dGVybiB2b2lkIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kX2xyYih2b2lkKik7CitleHRlcm4gdm9pZCBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dF9scmIodm9pZCopOworZXh0ZXJuIHZvaWQga21wX3NldF9saWJyYXJ5X2xyYih2b2lkKik7CitleHRlcm4gdm9pZCBrbXBfZ2V0X2xpYnJhcnlfbHJiKHZvaWQqKTsKK2V4dGVybiB2b2lkIGttcF9zZXRfZGVmYXVsdHNfbHJiKHZvaWQqKTsKKworZXh0ZXJuIHZvaWQga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrX2xyYih2b2lkKik7CitleHRlcm4gdm9pZCBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrX2xyYih2b2lkKik7CitleHRlcm4gdm9pZCBrbXBfc2V0X2FmZmluaXR5X2xyYih2b2lkKik7CitleHRlcm4gdm9pZCBrbXBfZ2V0X2FmZmluaXR5X2xyYih2b2lkKik7CitleHRlcm4gdm9pZCBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jX2xyYih2b2lkKik7CitleHRlcm4gdm9pZCBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvY19scmIodm9pZCopOworZXh0ZXJuIHZvaWQga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvY19scmIodm9pZCopOworZXh0ZXJuIHZvaWQga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2NfbHJiKHZvaWQqKTsKKworLy8gUHJlZGVmaW5lZCBlbnRyaWVzIG9uIHRoZSB0YXJnZXQgc2lkZQorc3RhdGljIEZ1bmNUYWJsZTo6RW50cnkgcHJlZGVmaW5lZF9lbnRyaWVzW10gPSB7CisgICAgIm9tcF9zZXRfbnVtX3RocmVhZHNfdGFyZ2V0IiwKKyAgICAodm9pZCopICZvbXBfc2V0X251bV90aHJlYWRzX2xyYiwKKyAgICAib21wX2dldF9tYXhfdGhyZWFkc190YXJnZXQiLAorICAgICh2b2lkKikgJm9tcF9nZXRfbWF4X3RocmVhZHNfbHJiLAorICAgICJvbXBfZ2V0X251bV9wcm9jc190YXJnZXQiLAorICAgICh2b2lkKikgJm9tcF9nZXRfbnVtX3Byb2NzX2xyYiwKKyAgICAib21wX3NldF9keW5hbWljX3RhcmdldCIsCisgICAgKHZvaWQqKSAmb21wX3NldF9keW5hbWljX2xyYiwKKyAgICAib21wX2dldF9keW5hbWljX3RhcmdldCIsCisgICAgKHZvaWQqKSAmb21wX2dldF9keW5hbWljX2xyYiwKKyAgICAib21wX3NldF9uZXN0ZWRfdGFyZ2V0IiwKKyAgICAodm9pZCopICZvbXBfc2V0X25lc3RlZF9scmIsCisgICAgIm9tcF9nZXRfbmVzdGVkX3RhcmdldCIsCisgICAgKHZvaWQqKSAmb21wX2dldF9uZXN0ZWRfbHJiLAorICAgICJvbXBfc2V0X3NjaGVkdWxlX3RhcmdldCIsCisgICAgKHZvaWQqKSAmb21wX3NldF9zY2hlZHVsZV9scmIsCisgICAgIm9tcF9nZXRfc2NoZWR1bGVfdGFyZ2V0IiwKKyAgICAodm9pZCopICZvbXBfZ2V0X3NjaGVkdWxlX2xyYiwKKworICAgICJvbXBfaW5pdF9sb2NrX3RhcmdldCIsCisgICAgKHZvaWQqKSAmb21wX2luaXRfbG9ja19scmIsCisgICAgIm9tcF9kZXN0cm95X2xvY2tfdGFyZ2V0IiwKKyAgICAodm9pZCopICZvbXBfZGVzdHJveV9sb2NrX2xyYiwKKyAgICAib21wX3NldF9sb2NrX3RhcmdldCIsCisgICAgKHZvaWQqKSAmb21wX3NldF9sb2NrX2xyYiwKKyAgICAib21wX3Vuc2V0X2xvY2tfdGFyZ2V0IiwKKyAgICAodm9pZCopICZvbXBfdW5zZXRfbG9ja19scmIsCisgICAgIm9tcF90ZXN0X2xvY2tfdGFyZ2V0IiwKKyAgICAodm9pZCopICZvbXBfdGVzdF9sb2NrX2xyYiwKKworICAgICJvbXBfaW5pdF9uZXN0X2xvY2tfdGFyZ2V0IiwKKyAgICAodm9pZCopICZvbXBfaW5pdF9uZXN0X2xvY2tfbHJiLAorICAgICJvbXBfZGVzdHJveV9uZXN0X2xvY2tfdGFyZ2V0IiwKKyAgICAodm9pZCopICZvbXBfZGVzdHJveV9uZXN0X2xvY2tfbHJiLAorICAgICJvbXBfc2V0X25lc3RfbG9ja190YXJnZXQiLAorICAgICh2b2lkKikgJm9tcF9zZXRfbmVzdF9sb2NrX2xyYiwKKyAgICAib21wX3Vuc2V0X25lc3RfbG9ja190YXJnZXQiLAorICAgICh2b2lkKikgJm9tcF91bnNldF9uZXN0X2xvY2tfbHJiLAorICAgICJvbXBfdGVzdF9uZXN0X2xvY2tfdGFyZ2V0IiwKKyAgICAodm9pZCopICZvbXBfdGVzdF9uZXN0X2xvY2tfbHJiLAorCisgICAgImttcF9zZXRfc3RhY2tzaXplX3RhcmdldCIsCisgICAgKHZvaWQqKSAma21wX3NldF9zdGFja3NpemVfbHJiLAorICAgICJrbXBfZ2V0X3N0YWNrc2l6ZV90YXJnZXQiLAorICAgICh2b2lkKikgJmttcF9nZXRfc3RhY2tzaXplX2xyYiwKKyAgICAia21wX3NldF9zdGFja3NpemVfc190YXJnZXQiLAorICAgICh2b2lkKikgJmttcF9zZXRfc3RhY2tzaXplX3NfbHJiLAorICAgICJrbXBfZ2V0X3N0YWNrc2l6ZV9zX3RhcmdldCIsCisgICAgKHZvaWQqKSAma21wX2dldF9zdGFja3NpemVfc19scmIsCisgICAgImttcF9zZXRfYmxvY2t0aW1lX3RhcmdldCIsCisgICAgKHZvaWQqKSAma21wX3NldF9ibG9ja3RpbWVfbHJiLAorICAgICJrbXBfZ2V0X2Jsb2NrdGltZV90YXJnZXQiLAorICAgICh2b2lkKikgJmttcF9nZXRfYmxvY2t0aW1lX2xyYiwKKyAgICAia21wX3NldF9saWJyYXJ5X3NlcmlhbF90YXJnZXQiLAorICAgICh2b2lkKikgJmttcF9zZXRfbGlicmFyeV9zZXJpYWxfbHJiLAorICAgICJrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZF90YXJnZXQiLAorICAgICh2b2lkKikgJmttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kX2xyYiwKKyAgICAia21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXRfdGFyZ2V0IiwKKyAgICAodm9pZCopICZrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dF9scmIsCisgICAgImttcF9zZXRfbGlicmFyeV90YXJnZXQiLAorICAgICh2b2lkKikgJmttcF9zZXRfbGlicmFyeV9scmIsCisgICAgImttcF9nZXRfbGlicmFyeV90YXJnZXQiLAorICAgICh2b2lkKikgJmttcF9nZXRfbGlicmFyeV9scmIsCisgICAgImttcF9zZXRfZGVmYXVsdHNfdGFyZ2V0IiwKKyAgICAodm9pZCopICZrbXBfc2V0X2RlZmF1bHRzX2xyYiwKKworICAgICJrbXBfY3JlYXRlX2FmZmluaXR5X21hc2tfdGFyZ2V0IiwKKyAgICAodm9pZCopICZrbXBfY3JlYXRlX2FmZmluaXR5X21hc2tfbHJiLAorICAgICJrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrX3RhcmdldCIsCisgICAgKHZvaWQqKSAma21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFza19scmIsCisgICAgImttcF9zZXRfYWZmaW5pdHlfdGFyZ2V0IiwKKyAgICAodm9pZCopICZrbXBfc2V0X2FmZmluaXR5X2xyYiwKKyAgICAia21wX2dldF9hZmZpbml0eV90YXJnZXQiLAorICAgICh2b2lkKikgJmttcF9nZXRfYWZmaW5pdHlfbHJiLAorICAgICJrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jX3RhcmdldCIsCisgICAgKHZvaWQqKSAma21wX2dldF9hZmZpbml0eV9tYXhfcHJvY19scmIsCisgICAgImttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jX3RhcmdldCIsCisgICAgKHZvaWQqKSAma21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2NfbHJiLAorICAgICJrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jX3RhcmdldCIsCisgICAgKHZvaWQqKSAma21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvY19scmIsCisgICAgImttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jX3RhcmdldCIsCisgICAgKHZvaWQqKSAma21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2NfbHJiLAorCisgICAgKGNvbnN0IGNoYXIqKSAtMSwKKyAgICAodm9pZCopIC0xCit9OworCitzdGF0aWMgRnVuY0xpc3Q6Ok5vZGUgcHJlZGVmaW5lZF90YWJsZSA9IHsKKyAgICB7IHByZWRlZmluZWRfZW50cmllcywgLTEgfSwKKyAgICAwLCAwCit9OworCisvLyBFbnRyeSB0YWJsZQorRnVuY0xpc3QgX19vZmZsb2FkX2VudHJpZXMoJnByZWRlZmluZWRfdGFibGUpOworI2Vsc2UKK0Z1bmNMaXN0IF9fb2ZmbG9hZF9lbnRyaWVzOworI2VuZGlmIC8vICFIT1NUX0xJQlJBUlkKKworLy8gRnVuY3Rpb24gdGFibGUuIE5vIHByZWRlZmluZWQgZW50cmllcy4KK0Z1bmNMaXN0IF9fb2ZmbG9hZF9mdW5jczsKKworLy8gVmFyIHRhYmxlCitWYXJMaXN0ICBfX29mZmxvYWRfdmFyczsKKworLy8gR2l2ZW4gdGhlIGZ1bmN0aW9uIG5hbWUgcmV0dXJucyB0aGUgYXNzb2NpdGF0ZWQgZnVuY3Rpb24gcG9pbnRlcgorY29uc3Qgdm9pZCogRnVuY0xpc3Q6OmZpbmRfYWRkcihjb25zdCBjaGFyICpuYW1lKQoreworICAgIGNvbnN0IHZvaWQqIGZ1bmMgPSAwOworCisgICAgbV9sb2NrLmxvY2soKTsKKworICAgIGZvciAoTm9kZSAqbiA9IG1faGVhZDsgbiAhPSAwOyBuID0gbi0+bmV4dCkgeworICAgICAgICBmb3IgKGNvbnN0IFRhYmxlOjpFbnRyeSAqZSA9IG4tPnRhYmxlLmVudHJpZXM7CisgICAgICAgICAgICAgZS0+bmFtZSAhPSAoY29uc3QgY2hhciopIC0xOyBlKyspIHsKKyAgICAgICAgICAgIGlmIChlLT5uYW1lICE9IDAgJiYgc3RyY21wKGUtPm5hbWUsIG5hbWUpID09IDApIHsKKyAgICAgICAgICAgICAgICBmdW5jID0gZS0+ZnVuYzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIG1fbG9jay51bmxvY2soKTsKKworICAgIHJldHVybiBmdW5jOworfQorCisvLyBHaXZlbiB0aGUgZnVuY3Rpb24gcG9pbnRlciByZXR1cm5zIHRoZSBhc3NvY2l0YXRlZCBmdW5jdGlvbiBuYW1lCitjb25zdCBjaGFyKiBGdW5jTGlzdDo6ZmluZF9uYW1lKGNvbnN0IHZvaWQgKmZ1bmMpCit7CisgICAgY29uc3QgY2hhciogbmFtZSA9IDA7CisKKyAgICBtX2xvY2subG9jaygpOworCisgICAgZm9yIChOb2RlICpuID0gbV9oZWFkOyBuICE9IDA7IG4gPSBuLT5uZXh0KSB7CisgICAgICAgIGZvciAoY29uc3QgVGFibGU6OkVudHJ5ICplID0gbi0+dGFibGUuZW50cmllczsKKyAgICAgICAgICAgICBlLT5uYW1lICE9IChjb25zdCBjaGFyKikgLTE7IGUrKykgeworICAgICAgICAgICAgaWYgKGUtPmZ1bmMgPT0gZnVuYykgeworICAgICAgICAgICAgICAgIG5hbWUgPSBlLT5uYW1lOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgbV9sb2NrLnVubG9jaygpOworCisgICAgcmV0dXJuIG5hbWU7Cit9CisKKy8vIFJldHVybnMgbWF4IG5hbWUgbGVuZ3RoIGZyb20gYWxsIHRhYmxlcworaW50NjRfdCBGdW5jTGlzdDo6bWF4X25hbWVfbGVuZ3RoKHZvaWQpCit7CisgICAgaWYgKG1fbWF4X25hbWVfbGVuIDwgMCkgeworICAgICAgICBtX2xvY2subG9jaygpOworCisgICAgICAgIG1fbWF4X25hbWVfbGVuID0gMDsKKyAgICAgICAgZm9yIChOb2RlICpuID0gbV9oZWFkOyBuICE9IDA7IG4gPSBuLT5uZXh0KSB7CisgICAgICAgICAgICBpZiAobi0+dGFibGUubWF4X25hbWVfbGVuIDwgMCkgeworICAgICAgICAgICAgICAgIG4tPnRhYmxlLm1heF9uYW1lX2xlbiA9IDA7CisKKyAgICAgICAgICAgICAgICAvLyBjYWxjdWxhdGUgbWF4IG5hbWUgbGVuZ3RoIGluIGEgc2luZ2xlIHRhYmxlCisgICAgICAgICAgICAgICAgZm9yIChjb25zdCBUYWJsZTo6RW50cnkgKmUgPSBuLT50YWJsZS5lbnRyaWVzOworICAgICAgICAgICAgICAgICAgICAgZS0+bmFtZSAhPSAoY29uc3QgY2hhciopIC0xOyBlKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGUtPm5hbWUgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbiA9IHN0cmxlbihlLT5uYW1lKSArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobi0+dGFibGUubWF4X25hbWVfbGVuIDwgbGVuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi0+dGFibGUubWF4X25hbWVfbGVuID0gbGVuOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBzZWxlY3QgbWF4IGZyb20gYWxsIHRhYmxlcworICAgICAgICAgICAgaWYgKG1fbWF4X25hbWVfbGVuIDwgbi0+dGFibGUubWF4X25hbWVfbGVuKSB7CisgICAgICAgICAgICAgICAgbV9tYXhfbmFtZV9sZW4gPSBuLT50YWJsZS5tYXhfbmFtZV9sZW47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBtX2xvY2sudW5sb2NrKCk7CisgICAgfQorICAgIHJldHVybiBtX21heF9uYW1lX2xlbjsKK30KKworLy8gRGVidWdnaW5nIGR1bXAKK3ZvaWQgRnVuY0xpc3Q6OmR1bXAodm9pZCkKK3sKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJGdW5jdGlvbiB0YWJsZTpcbiIpOworCisgICAgbV9sb2NrLmxvY2soKTsKKworICAgIGZvciAoTm9kZSAqbiA9IG1faGVhZDsgbiAhPSAwOyBuID0gbi0+bmV4dCkgeworICAgICAgICBmb3IgKGNvbnN0IFRhYmxlOjpFbnRyeSAqZSA9IG4tPnRhYmxlLmVudHJpZXM7CisgICAgICAgICAgICAgZS0+bmFtZSAhPSAoY29uc3QgY2hhciopIC0xOyBlKyspIHsKKyAgICAgICAgICAgIGlmIChlLT5uYW1lICE9IDApIHsKKyAgICAgICAgICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICIlcCAlc1xuIiwgZS0+ZnVuYywgZS0+bmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtX2xvY2sudW5sb2NrKCk7Cit9CisKKy8vIERlYnVnZ2luZyBkdW1wCit2b2lkIFZhckxpc3Q6OmR1bXAodm9pZCkKK3sKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJWYXIgdGFibGU6XG4iKTsKKworICAgIG1fbG9jay5sb2NrKCk7CisKKyAgICBmb3IgKE5vZGUgKm4gPSBtX2hlYWQ7IG4gIT0gMDsgbiA9IG4tPm5leHQpIHsKKyAgICAgICAgZm9yIChjb25zdCBUYWJsZTo6RW50cnkgKmUgPSBuLT50YWJsZS5lbnRyaWVzOworICAgICAgICAgICAgIGUtPm5hbWUgIT0gKGNvbnN0IGNoYXIqKSAtMTsgZSsrKSB7CisgICAgICAgICAgICBpZiAoZS0+bmFtZSAhPSAwKSB7CisjaWYgSE9TVF9MSUJSQVJZCisgICAgICAgICAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiJXMgJXAgJWxkXG4iLCBlLT5uYW1lLCBlLT5hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS0+c2l6ZSk7CisjZWxzZSAgLy8gSE9TVF9MSUJSQVJZCisgICAgICAgICAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiJXMgJXBcbiIsIGUtPm5hbWUsIGUtPmFkZHIpOworI2VuZGlmIC8vIEhPU1RfTElCUkFSWQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgbV9sb2NrLnVubG9jaygpOworfQorCisvLworaW50NjRfdCBWYXJMaXN0Ojp0YWJsZV9zaXplKGludDY0X3QgJm5lbGVtcykKK3sKKyAgICBpbnQ2NF90IGxlbmd0aCA9IDA7CisKKyAgICBuZWxlbXMgPSAwOworCisgICAgLy8gY2FsY3VsYXRlIHN0cmluZyB0YWJsZSBzaXplIGFuZCBudW1iZXIgb2YgZWxlbWVudHMKKyAgICBmb3IgKE5vZGUgKm4gPSBtX2hlYWQ7IG4gIT0gMDsgbiA9IG4tPm5leHQpIHsKKyAgICAgICAgZm9yIChjb25zdCBUYWJsZTo6RW50cnkgKmUgPSBuLT50YWJsZS5lbnRyaWVzOworICAgICAgICAgICAgIGUtPm5hbWUgIT0gKGNvbnN0IGNoYXIqKSAtMTsgZSsrKSB7CisgICAgICAgICAgICBpZiAoZS0+bmFtZSAhPSAwKSB7CisgICAgICAgICAgICAgICAgbGVuZ3RoICs9IHN0cmxlbihlLT5uYW1lKSArIDE7CisgICAgICAgICAgICAgICAgbmVsZW1zKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbmVsZW1zICogc2l6ZW9mKEJ1ZkVudHJ5KSArIGxlbmd0aDsKK30KKworLy8gY29weSB0YWJsZSB0byB0aGUgZ3ZlbiBidWZmZXIKK3ZvaWQgVmFyTGlzdDo6dGFibGVfY29weSh2b2lkICpidWYsIGludDY0X3QgbmVsZW1zKQoreworICAgIEJ1ZkVudHJ5KiBlbGVtcyA9IHN0YXRpY19jYXN0PEJ1ZkVudHJ5Kj4oYnVmKTsKKyAgICBjaGFyKiAgICAgbmFtZXMgPSByZWludGVycHJldF9jYXN0PGNoYXIqPihlbGVtcyArIG5lbGVtcyk7CisKKyAgICAvLyBjb3B5IGVudHJpZXMgdG8gYnVmZmVyCisgICAgZm9yIChOb2RlICpuID0gbV9oZWFkOyBuICE9IDA7IG4gPSBuLT5uZXh0KSB7CisgICAgICAgIGZvciAoY29uc3QgVGFibGU6OkVudHJ5ICplID0gbi0+dGFibGUuZW50cmllczsKKyAgICAgICAgICAgICBlLT5uYW1lICE9IChjb25zdCBjaGFyKikgLTE7IGUrKykgeworICAgICAgICAgICAgaWYgKGUtPm5hbWUgIT0gMCkgeworICAgICAgICAgICAgICAgIC8vIG5hbWUgZmllbGQgY29udGFpbnMgb2Zmc2V0IHRvIHRoZSBuYW1lIGZyb20gdGhlIGJlZ2lubmluZworICAgICAgICAgICAgICAgIC8vIG9mIHRoZSBidWZmZXIKKyAgICAgICAgICAgICAgICBlbGVtcy0+bmFtZSA9IG5hbWVzIC0gc3RhdGljX2Nhc3Q8Y2hhcio+KGJ1Zik7CisgICAgICAgICAgICAgICAgZWxlbXMtPmFkZHIgPSByZWludGVycHJldF9jYXN0PGludHB0cl90PihlLT5hZGRyKTsKKworICAgICAgICAgICAgICAgIC8vIGNvcHkgbmFtZSB0byBzdHJpbmcgdGFibGUKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lID0gZS0+bmFtZTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoKCpuYW1lcysrID0gKm5hbWUrKykgIT0gJ1wwJyk7CisKKyAgICAgICAgICAgICAgICBlbGVtcysrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisvLyBwYXRjaCBuYW1lIG9mZnNldHMgaW4gYSBidWZmZXIKK3ZvaWQgVmFyTGlzdDo6dGFibGVfcGF0Y2hfbmFtZXModm9pZCAqYnVmLCBpbnQ2NF90IG5lbGVtcykKK3sKKyAgICBCdWZFbnRyeSogZWxlbXMgPSBzdGF0aWNfY2FzdDxCdWZFbnRyeSo+KGJ1Zik7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuZWxlbXM7IGkrKykgeworICAgICAgICBlbGVtc1tpXS5uYW1lICs9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KGJ1Zik7CisgICAgfQorfQorCisvLyBBZGRzIGdpdmVuIGxpc3QgZWxlbWVudCB0byB0aGUgZ2xvYmFsIGxvb2t1cCB0YWJsZSBsaXN0CitleHRlcm4gIkMiIHZvaWQgX19vZmZsb2FkX3JlZ2lzdGVyX3RhYmxlcygKKyAgICBGdW5jTGlzdDo6Tm9kZSAqZW50cnlfdGFibGUsCisgICAgRnVuY0xpc3Q6Ok5vZGUgKmZ1bmNfdGFibGUsCisgICAgVmFyTGlzdDo6Tm9kZSAqdmFyX3RhYmxlCispCit7CisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiUmVnaXN0ZXJpbmcgb2ZmbG9hZCBmdW5jdGlvbiBlbnRyeSB0YWJsZSAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5X3RhYmxlKTsKKyAgICBfX29mZmxvYWRfZW50cmllcy5hZGRfdGFibGUoZW50cnlfdGFibGUpOworCisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiUmVnaXN0ZXJpbmcgZnVuY3Rpb24gdGFibGUgJXBcbiIsIGZ1bmNfdGFibGUpOworICAgIF9fb2ZmbG9hZF9mdW5jcy5hZGRfdGFibGUoZnVuY190YWJsZSk7CisKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJSZWdpc3RlcmluZyB2YXIgdGFibGUgJXBcbiIsIHZhcl90YWJsZSk7CisgICAgX19vZmZsb2FkX3ZhcnMuYWRkX3RhYmxlKHZhcl90YWJsZSk7Cit9CisKKy8vIFJlbW92ZXMgZ2l2ZW4gbGlzdCBlbGVtZW50IGZyb20gdGhlIGdsb2JhbCBsb29rdXAgdGFibGUgbGlzdAorZXh0ZXJuICJDIiB2b2lkIF9fb2ZmbG9hZF91bnJlZ2lzdGVyX3RhYmxlcygKKyAgICBGdW5jTGlzdDo6Tm9kZSAqZW50cnlfdGFibGUsCisgICAgRnVuY0xpc3Q6Ok5vZGUgKmZ1bmNfdGFibGUsCisgICAgVmFyTGlzdDo6Tm9kZSAqdmFyX3RhYmxlCispCit7CisgICAgX19vZmZsb2FkX2VudHJpZXMucmVtb3ZlX3RhYmxlKGVudHJ5X3RhYmxlKTsKKworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIlVucmVnaXN0ZXJpbmcgZnVuY3Rpb24gdGFibGUgJXBcbiIsIGZ1bmNfdGFibGUpOworICAgIF9fb2ZmbG9hZF9mdW5jcy5yZW1vdmVfdGFibGUoZnVuY190YWJsZSk7CisKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJVbnJlZ2lzdGVyaW5nIHZhciB0YWJsZSAlcFxuIiwgdmFyX3RhYmxlKTsKKyAgICBfX29mZmxvYWRfdmFycy5yZW1vdmVfdGFibGUodmFyX3RhYmxlKTsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfdGFibGUuaCBiL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfdGFibGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmNlZDNlCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF90YWJsZS5oCkBAIC0wLDAgKzEsMzAxIEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKy8qISBcZmlsZQorICAgIFxicmllZiBGdW5jdGlvbiBhbmQgVmFyaWFibGUgdGFibGVzIHVzZWQgYnkgdGhlIHJ1bnRpbWUgbGlicmFyeQorKi8KKworI2lmbmRlZiBPRkZMT0FEX1RBQkxFX0hfSU5DTFVERUQKKyNkZWZpbmUgT0ZGTE9BRF9UQUJMRV9IX0lOQ0xVREVECisKKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlICJvZmZsb2FkX3V0aWwuaCIKKworLy8gVGVtcGxhdGUgcmVwcmVzZW50aW5nIGRvdWJsZSBsaW5rZWQgbGlzdCBvZiB0YWJsZXMKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBUYWJsZUxpc3QgeworcHVibGljOgorICAgIC8vIHRhYmxlIHR5cGUKKyAgICB0eXBlZGVmIFQgVGFibGU7CisKKyAgICAvLyBMaXN0IG5vZGUKKyAgICBzdHJ1Y3QgTm9kZSB7CisgICAgICAgIFRhYmxlICAgdGFibGU7CisgICAgICAgIE5vZGUqICAgcHJldjsKKyAgICAgICAgTm9kZSogICBuZXh0OworICAgIH07CisKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBUYWJsZUxpc3QoTm9kZSAqbm9kZSA9IDApIDogbV9oZWFkKG5vZGUpIHt9CisKKyAgICB2b2lkIGFkZF90YWJsZShOb2RlICpub2RlKSB7CisgICAgICAgIG1fbG9jay5sb2NrKCk7CisKKyAgICAgICAgaWYgKG1faGVhZCAhPSAwKSB7CisgICAgICAgICAgICBub2RlLT5uZXh0ID0gbV9oZWFkOworICAgICAgICAgICAgbV9oZWFkLT5wcmV2ID0gbm9kZTsKKyAgICAgICAgfQorICAgICAgICBtX2hlYWQgPSBub2RlOworCisgICAgICAgIG1fbG9jay51bmxvY2soKTsKKyAgICB9CisKKyAgICB2b2lkIHJlbW92ZV90YWJsZShOb2RlICpub2RlKSB7CisgICAgICAgIG1fbG9jay5sb2NrKCk7CisKKyAgICAgICAgaWYgKG5vZGUtPm5leHQgIT0gMCkgeworICAgICAgICAgICAgbm9kZS0+bmV4dC0+cHJldiA9IG5vZGUtPnByZXY7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5vZGUtPnByZXYgIT0gMCkgeworICAgICAgICAgICAgbm9kZS0+cHJldi0+bmV4dCA9IG5vZGUtPm5leHQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1faGVhZCA9PSBub2RlKSB7CisgICAgICAgICAgICBtX2hlYWQgPSBub2RlLT5uZXh0OworICAgICAgICB9CisKKyAgICAgICAgbV9sb2NrLnVubG9jaygpOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIE5vZGUqICAgICAgICAgICBtX2hlYWQ7CisgICAgbXV0ZXhfdCAgICAgICAgIG1fbG9jazsKK307CisKKy8vIEZ1bmN0aW9uIGxvb2t1cCB0YWJsZS4KK3N0cnVjdCBGdW5jVGFibGUgeworICAgIC8vISBGdW5jdGlvbiB0YWJsZSBlbnRyeQorICAgIC8qISBUaGlzIHRhYmxlIGNvbnRhaW5zIGZ1bmN0aW9ucyBjcmVhdGVkIGZyb20gb2ZmbG9hZCByZWdpb25zLiAgICovCisgICAgLyohIEVhY2ggZW50cnkgY29uc2lzdHMgb2YgYSBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbidzICJrZXkiCisgICAgICAgIGFuZCB0aGUgZnVuY3Rpb24gYWRkcmVzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiEgRWFjaCBzaGFyZWQgbGlicmFyeSBvciBleGVjdXRhYmxlIG1heSBjb250YWluIG9uZSBzdWNoIHRhYmxlLiAqLworICAgIC8qISBUaGUgZW5kIG9mIHRoZSB0YWJsZSBpcyBtYXJrZWQgd2l0aCBhbiBlbnRyeSB3aG9zZSBuYW1lIGZpZWxkCisgICAgICAgIGhhcyB2YWx1ZSAtMS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBzdHJ1Y3QgRW50cnkgeworICAgICAgICBjb25zdCBjaGFyKiBuYW1lOyAvLyE8IE5hbWUgb2YgdGhlIGZ1bmN0aW9uCisgICAgICAgIHZvaWQqICAgICAgIGZ1bmM7IC8vITwgQWRkcmVzcyBvZiB0aGUgZnVuY3Rpb24KKyAgICB9OworCisgICAgLy8gZW50cmllcworICAgIGNvbnN0IEVudHJ5ICplbnRyaWVzOworCisgICAgLy8gbWF4IG5hbWUgbGVuZ3RoCisgICAgaW50NjRfdCBtYXhfbmFtZV9sZW47Cit9OworCisvLyBGdW5jdGlvbiB0YWJsZQorY2xhc3MgRnVuY0xpc3QgOiBwdWJsaWMgVGFibGVMaXN0PEZ1bmNUYWJsZT4geworcHVibGljOgorICAgIGV4cGxpY2l0IEZ1bmNMaXN0KE5vZGUgKm5vZGUgPSAwKSA6IFRhYmxlTGlzdDxUYWJsZT4obm9kZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9tYXhfbmFtZV9sZW4oLTEpCisgICAge30KKworICAgIC8vIGFkZCB0YWJsZSB0byB0aGUgbGlzdAorICAgIHZvaWQgYWRkX3RhYmxlKE5vZGUgKm5vZGUpIHsKKyAgICAgICAgLy8gcmVjYWxjdWxhdGUgbWF4IGZ1bmN0aW9uIG5hbWUgbGVuZ3RoCisgICAgICAgIG1fbWF4X25hbWVfbGVuID0gLTE7CisKKyAgICAgICAgLy8gYWRkIHRhYmxlCisgICAgICAgIFRhYmxlTGlzdDxUYWJsZT46OmFkZF90YWJsZShub2RlKTsKKyAgICB9CisKKyAgICAvLyBmaW5kIGZ1bmN0aW9uIGFkZHJlc3MgZm9yIHRoZSBnaXZlbiBuYW1lCisgICAgY29uc3Qgdm9pZCogZmluZF9hZGRyKGNvbnN0IGNoYXIgKm5hbWUpOworCisgICAgLy8gZmluZCBmdW5jdGlvbiBuYW1lIGZvciB0aGUgZ2l2ZW4gYWRkcmVzcworICAgIGNvbnN0IGNoYXIqIGZpbmRfbmFtZShjb25zdCB2b2lkICphZGRyKTsKKworICAgIC8vIG1heCBuYW1lIGxlbmd0aCBmcm9tIGFsbCB0YWJsZXMgaW4gdGhlIGxpc3QKKyAgICBpbnQ2NF90IG1heF9uYW1lX2xlbmd0aCh2b2lkKTsKKworICAgIC8vIGRlYnVnIGR1bXAKKyAgICB2b2lkIGR1bXAodm9pZCk7CisKK3ByaXZhdGU6CisgICAgLy8gbWF4IG5hbWUgbGVuZ3RoIHdpdGhpbiBmcm9tIGFsbCB0YWJsZXMKKyAgICBpbnQ2NF90IG1fbWF4X25hbWVfbGVuOworfTsKKworLy8gVGFibGUgZW50cnkgZm9yIHN0YXRpYyB2YXJpYWJsZXMKK3N0cnVjdCBWYXJUYWJsZSB7CisgICAgLy8hIFZhcmlhYmxlIHRhYmxlIGVudHJ5CisgICAgLyohIFRoaXMgdGFibGUgY29udGFpbnMgc3RhdGljYWxseSBhbGxvY2F0ZWQgdmFyaWFibGVzIG1hcmtlZCB3aXRoCisgICAgICAgIF9fZGVjbHNwZWModGFyZ2V0KG1pYykgb3IgI3ByYWdtYSBvbXAgZGVjbGFyZSB0YXJnZXQuICAgICAgICAgICAqLworICAgIC8qISBFYWNoIGVudHJ5IGNvbnNpc3RzIG9mIGEgcG9pbnRlciB0byB0aGUgdmFyaWFibGUncyAia2V5IiwKKyAgICAgICAgdGhlIHZhcmlhYmxlIGFkZHJlc3MgYW5kIGl0cyBzaXplIGluIGJ5dGVzLiAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyohIEJlY2F1c2UgbWVtb3J5IGFsbG9jYXRpb24gaXMgZG9uZSBmcm9tIHRoZSBob3N0LAorICAgICAgICB0aGUgTUlDIHRhYmxlIGRvZXMgbm90IG5lZWQgdGhlIHNpemUgb2YgdGhlIHZhcmlhYmxlLiAgICAgICAgICAgKi8KKyAgICAvKiEgUGFkZGluZyB0byBtYWtlIHRoZSB0YWJsZSBlbnRyeSBzaXplIGEgcG93ZXIgb2YgMiBpcyBuZWNlc3NhcnkKKyAgICAgICAgdG8gYXZvaWQgImhvbGVzIiBiZXR3ZWVuIHRhYmxlIGNvbnRyaWJ1dGlvbnMgZnJvbSBkaWZmZXJlbnQgb2JqZWN0CisgICAgICAgIGZpbGVzIG9uIFdpbmRvd3Mgd2hlbiBkZWJ1ZyBpbmZvcm1hdGlvbiBpcyBzcGVjaWZpZWQgd2l0aCAvWmkuICAqLworICAgIHN0cnVjdCBFbnRyeSB7CisgICAgICAgIGNvbnN0IGNoYXIqIG5hbWU7IC8vITwgTmFtZSBvZiB0aGUgdmFyaWFibGUKKyAgICAgICAgdm9pZCogICAgICAgYWRkcjsgLy8hPCBBZGRyZXNzIG9mIHRoZSB2YXJpYWJsZQorCisjaWYgSE9TVF9MSUJSQVJZCisgICAgICAgIHVpbnQ2NF90ICAgIHNpemU7CisKKyNpZmRlZiBUQVJHRVRfV0lOTlQKKwkJLy8gcGFkZGluZyB0byBtYWtlIGVudHJ5IHNpemUgYSBwb3dlciBvZiAyCisgICAgICAgIHVpbnQ2NF90ICAgIHBhZGRpbmc7CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisjZW5kaWYKKyAgICB9OworCisgICAgLy8gVGFibGUgdGVybWluYXRlZCBieSBhbiBlbnRyeSB3aXRoIG5hbWUgPT0gLTEKKyAgICBjb25zdCBFbnRyeSAqZW50cmllczsKK307CisKKy8vIExpc3Qgb2YgdmFyIHRhYmxlcworY2xhc3MgVmFyTGlzdCA6IHB1YmxpYyBUYWJsZUxpc3Q8VmFyVGFibGU+IHsKK3B1YmxpYzoKKyAgICBWYXJMaXN0KCkgOiBUYWJsZUxpc3Q8VGFibGU+KCkKKyAgICB7fQorCisgICAgLy8gZGVidWcgZHVtcAorICAgIHZvaWQgZHVtcCgpOworCitwdWJsaWM6CisgICAgLy8gdmFyIHRhYmxlIGxpc3QgaXRlcmF0b3IKKyAgICBjbGFzcyBJdGVyYXRvciA6IHB1YmxpYyBzdGQ6Oml0ZXJhdG9yPHN0ZDo6aW5wdXRfaXRlcmF0b3JfdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFibGU6OkVudHJ5PiB7CisgICAgcHVibGljOgorICAgICAgICBJdGVyYXRvcigpIDogbV9ub2RlKDApLCBtX2VudHJ5KDApIHt9CisKKyAgICAgICAgZXhwbGljaXQgSXRlcmF0b3IoTm9kZSAqbm9kZSkgeworICAgICAgICAgICAgbmV3X25vZGUobm9kZSk7CisgICAgICAgIH0KKworICAgICAgICBJdGVyYXRvciYgb3BlcmF0b3IrKygpIHsKKyAgICAgICAgICAgIGlmIChtX2VudHJ5ICE9IDApIHsKKyAgICAgICAgICAgICAgICBtX2VudHJ5Kys7CisgICAgICAgICAgICAgICAgd2hpbGUgKG1fZW50cnktPm5hbWUgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBtX2VudHJ5Kys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtX2VudHJ5LT5uYW1lID09IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KC0xKSkgeworICAgICAgICAgICAgICAgICAgICBuZXdfbm9kZShtX25vZGUtPm5leHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBJdGVyYXRvciAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtX2VudHJ5ID09IG90aGVyLm1fZW50cnk7CisgICAgICAgIH0KKworICAgICAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgSXRlcmF0b3IgJm90aGVyKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbV9lbnRyeSAhPSBvdGhlci5tX2VudHJ5OworICAgICAgICB9CisKKyAgICAgICAgY29uc3QgVGFibGU6OkVudHJ5KiBvcGVyYXRvciooKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbV9lbnRyeTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgdm9pZCBuZXdfbm9kZShOb2RlICpub2RlKSB7CisgICAgICAgICAgICBtX25vZGUgPSBub2RlOworICAgICAgICAgICAgbV9lbnRyeSA9IDA7CisgICAgICAgICAgICB3aGlsZSAobV9ub2RlICE9IDApIHsKKyAgICAgICAgICAgICAgICBtX2VudHJ5ID0gbV9ub2RlLT50YWJsZS5lbnRyaWVzOworICAgICAgICAgICAgICAgIHdoaWxlIChtX2VudHJ5LT5uYW1lID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbV9lbnRyeSsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobV9lbnRyeS0+bmFtZSAhPSByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPigtMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1fbm9kZSA9IG1fbm9kZS0+bmV4dDsKKyAgICAgICAgICAgICAgICBtX2VudHJ5ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgTm9kZSAgICAgICAgICAgICAgICAqbV9ub2RlOworICAgICAgICBjb25zdCBUYWJsZTo6RW50cnkgICptX2VudHJ5OworICAgIH07CisKKyAgICBJdGVyYXRvciBiZWdpbigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIEl0ZXJhdG9yKG1faGVhZCk7CisgICAgfQorCisgICAgSXRlcmF0b3IgZW5kKCkgY29uc3QgeworICAgICAgICByZXR1cm4gSXRlcmF0b3IoKTsKKyAgICB9CisKK3B1YmxpYzoKKyAgICAvLyBFbnRyeSByZXByZXNlbnRhdGlvbiBpbiBhIGNvcHkgYnVmZmVyCisgICAgc3RydWN0IEJ1ZkVudHJ5IHsKKyAgICAgICAgaW50cHRyX3QgbmFtZTsKKyAgICAgICAgaW50cHRyX3QgYWRkcjsKKyAgICB9OworCisgICAgLy8gQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHRhYmxlIGFuZAorICAgIC8vIHJldHVybnMgdGhlIHNpemUgb2YgYnVmZmVyIGZvciB0aGUgdGFibGUKKyAgICBpbnQ2NF90IHRhYmxlX3NpemUoaW50NjRfdCAmbmVsZW1zKTsKKworICAgIC8vIENvcHkgdGFibGUgY29udGVudHMgdG8gZ2l2ZW4gYnVmZmVyLiBJdCBpcyBzdXBwb3NlZCB0byBiZSBsYXJnZQorICAgIC8vIGVub3VnaCB0byBob2xkIGFsbCBlbGVtZW50cyBhcyBzdHJpbmcgdGFibGUuCisgICAgdm9pZCB0YWJsZV9jb3B5KHZvaWQgKmJ1ZiwgaW50NjRfdCBuZWxlbXMpOworCisgICAgLy8gUGF0Y2ggbmFtZSBvZmZzZXRzIGluIGEgdGFibGUgYWZ0ZXIgaXQncyBiZWVuIGNvcGllZCB0byBvdGhlciBzaWRlCisgICAgc3RhdGljIHZvaWQgdGFibGVfcGF0Y2hfbmFtZXModm9pZCAqYnVmLCBpbnQ2NF90IG5lbGVtcyk7Cit9OworCitleHRlcm4gRnVuY0xpc3QgX19vZmZsb2FkX2VudHJpZXM7CitleHRlcm4gRnVuY0xpc3QgX19vZmZsb2FkX2Z1bmNzOworZXh0ZXJuIFZhckxpc3QgIF9fb2ZmbG9hZF92YXJzOworCisvLyBTZWN0aW9uIG5hbWVzIHdoZXJlIHRoZSBsb29rdXAgdGFibGVzIGFyZSBzdG9yZWQKKyNpZmRlZiBUQVJHRVRfV0lOTlQKKyNkZWZpbmUgT0ZGTE9BRF9FTlRSWV9UQUJMRV9TRUNUSU9OX1NUQVJUICAgIi5PZmZsb2FkRW50cnlUYWJsZSRhIgorI2RlZmluZSBPRkZMT0FEX0VOVFJZX1RBQkxFX1NFQ1RJT05fRU5EICAgICAiLk9mZmxvYWRFbnRyeVRhYmxlJHoiCisKKyNkZWZpbmUgT0ZGTE9BRF9GVU5DX1RBQkxFX1NFQ1RJT05fU1RBUlQgICAgIi5PZmZsb2FkRnVuY1RhYmxlJGEiCisjZGVmaW5lIE9GRkxPQURfRlVOQ19UQUJMRV9TRUNUSU9OX0VORCAgICAgICIuT2ZmbG9hZEZ1bmNUYWJsZSR6IgorCisjZGVmaW5lIE9GRkxPQURfVkFSX1RBQkxFX1NFQ1RJT05fU1RBUlQgICAgICIuT2ZmbG9hZFZhclRhYmxlJGEiCisjZGVmaW5lIE9GRkxPQURfVkFSX1RBQkxFX1NFQ1RJT05fRU5EICAgICAgICIuT2ZmbG9hZFZhclRhYmxlJHoiCisKKyNkZWZpbmUgT0ZGTE9BRF9DUlRJTklUX1NFQ1RJT05fU1RBUlQgICAgICAgIi5DUlQkWENUIgorCisjcHJhZ21hIHNlY3Rpb24oT0ZGTE9BRF9DUlRJTklUX1NFQ1RJT05fU1RBUlQsIHJlYWQpCisKKyNlbHNlICAvLyBUQVJHRVRfV0lOTlQKKworI2RlZmluZSBPRkZMT0FEX0VOVFJZX1RBQkxFX1NFQ1RJT05fU1RBUlQgICAiLk9mZmxvYWRFbnRyeVRhYmxlLiIKKyNkZWZpbmUgT0ZGTE9BRF9FTlRSWV9UQUJMRV9TRUNUSU9OX0VORCAgICAgIi5PZmZsb2FkRW50cnlUYWJsZS4iCisKKyNkZWZpbmUgT0ZGTE9BRF9GVU5DX1RBQkxFX1NFQ1RJT05fU1RBUlQgICAgIi5PZmZsb2FkRnVuY1RhYmxlLiIKKyNkZWZpbmUgT0ZGTE9BRF9GVU5DX1RBQkxFX1NFQ1RJT05fRU5EICAgICAgIi5PZmZsb2FkRnVuY1RhYmxlLiIKKworI2RlZmluZSBPRkZMT0FEX1ZBUl9UQUJMRV9TRUNUSU9OX1NUQVJUICAgICAiLk9mZmxvYWRWYXJUYWJsZS4iCisjZGVmaW5lIE9GRkxPQURfVkFSX1RBQkxFX1NFQ1RJT05fRU5EICAgICAgICIuT2ZmbG9hZFZhclRhYmxlLiIKKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKKworI3ByYWdtYSBzZWN0aW9uKE9GRkxPQURfRU5UUllfVEFCTEVfU0VDVElPTl9TVEFSVCwgcmVhZCwgd3JpdGUpCisjcHJhZ21hIHNlY3Rpb24oT0ZGTE9BRF9FTlRSWV9UQUJMRV9TRUNUSU9OX0VORCwgcmVhZCwgd3JpdGUpCisKKyNwcmFnbWEgc2VjdGlvbihPRkZMT0FEX0ZVTkNfVEFCTEVfU0VDVElPTl9TVEFSVCwgcmVhZCwgd3JpdGUpCisjcHJhZ21hIHNlY3Rpb24oT0ZGTE9BRF9GVU5DX1RBQkxFX1NFQ1RJT05fRU5ELCByZWFkLCB3cml0ZSkKKworI3ByYWdtYSBzZWN0aW9uKE9GRkxPQURfVkFSX1RBQkxFX1NFQ1RJT05fU1RBUlQsIHJlYWQsIHdyaXRlKQorI3ByYWdtYSBzZWN0aW9uKE9GRkxPQURfVkFSX1RBQkxFX1NFQ1RJT05fRU5ELCByZWFkLCB3cml0ZSkKKworCisvLyByZWdpc3Rlci91bnJlZ2lzdGVyIGdpdmVuIHRhYmxlcworZXh0ZXJuICJDIiB2b2lkIF9fb2ZmbG9hZF9yZWdpc3Rlcl90YWJsZXMoCisgICAgRnVuY0xpc3Q6Ok5vZGUgKmVudHJ5X3RhYmxlLAorICAgIEZ1bmNMaXN0OjpOb2RlICpmdW5jX3RhYmxlLAorICAgIFZhckxpc3Q6Ok5vZGUgKnZhcl90YWJsZQorKTsKKworZXh0ZXJuICJDIiB2b2lkIF9fb2ZmbG9hZF91bnJlZ2lzdGVyX3RhYmxlcygKKyAgICBGdW5jTGlzdDo6Tm9kZSAqZW50cnlfdGFibGUsCisgICAgRnVuY0xpc3Q6Ok5vZGUgKmZ1bmNfdGFibGUsCisgICAgVmFyTGlzdDo6Tm9kZSAqdmFyX3RhYmxlCispOworI2VuZGlmICAvLyBPRkZMT0FEX1RBQkxFX0hfSU5DTFVERUQKZGlmZiAtLWdpdCBhL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfdGFyZ2V0LmNwcCBiL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfdGFyZ2V0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmMxYjA0Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF90YXJnZXQuY3BwCkBAIC0wLDAgKzEsNzU0IEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJvZmZsb2FkX3RhcmdldC5oIgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2lmZGVmIFNFUF9TVVBQT1JUCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNlbmRpZiAvLyBTRVBfU1VQUE9SVAorI2luY2x1ZGUgPG9tcC5oPgorI2luY2x1ZGUgPG1hcD4KKworLy8gdHlwZWRlZiBvZmZsb2FkX2Z1bmNfd2l0aF9wYXJtcy4KKy8vIFBvaW50ZXIgdG8gZnVuY3Rpb24gdGhhdCByZXByZXNlbnRzIGFuIG9mZmxvYWRlZCBlbnRyeSBwb2ludC4KKy8vIFRoZSBwYXJhbWV0ZXJzIGFyZSBhIHRlbXBvcmFyeSBmaXggZm9yIHBhcmFtZXRlcnMgb24gdGhlIHN0YWNrLgordHlwZWRlZiB2b2lkICgqb2ZmbG9hZF9mdW5jX3dpdGhfcGFybXMpKHZvaWQgKik7CisKKy8vIFRhcmdldCBjb25zb2xlIGFuZCBmaWxlIGxvZ2dpbmcKK2NvbnN0IGNoYXIgKnByZWZpeDsKK2ludCBjb25zb2xlX2VuYWJsZWQgPSAwOworaW50IG9mZmxvYWRfcmVwb3J0X2xldmVsID0gMDsKKworLy8gVHJhY2UgaW5mb3JtYXRpb24KK3N0YXRpYyBjb25zdCBjaGFyKiB2YXJkZXNjX2RpcmVjdGlvbl9hc19zdHJpbmdbXSA9IHsKKyAgICAiTk9DT1BZIiwKKyAgICAiSU4iLAorICAgICJPVVQiLAorICAgICJJTk9VVCIKK307CitzdGF0aWMgY29uc3QgY2hhciogdmFyZGVzY190eXBlX2FzX3N0cmluZ1tdID0geworICAgICJ1bmtub3duIiwKKyAgICAiZGF0YSIsCisgICAgImRhdGFfcHRyIiwKKyAgICAiZnVuY19wdHIiLAorICAgICJ2b2lkX3B0ciIsCisgICAgInN0cmluZ19wdHIiLAorICAgICJkdiIsCisgICAgImR2X2RhdGEiLAorICAgICJkdl9kYXRhX3NsaWNlIiwKKyAgICAiZHZfcHRyIiwKKyAgICAiZHZfcHRyX2RhdGEiLAorICAgICJkdl9wdHJfZGF0YV9zbGljZSIsCisgICAgImNlYW5fdmFyIiwKKyAgICAiY2Vhbl92YXJfcHRyIiwKKyAgICAiY19kYXRhX3B0cl9hcnJheSIKK307CisKK2ludCBtaWNfaW5kZXggPSAtMTsKK2ludCBtaWNfZW5naW5lc190b3RhbCA9IC0xOwordWludDY0X3QgbWljX2ZyZXF1ZW5jeSA9IDA7CitpbnQgb2ZmbG9hZF9udW1iZXIgPSAwOworc3RhdGljIHN0ZDo6bWFwPHZvaWQqLCBSZWZJbmZvKj4gcmVmX2RhdGE7CitzdGF0aWMgbXV0ZXhfdCBhZGRfcmVmX2xvY2s7CisKKyNpZmRlZiBTRVBfU1VQUE9SVAorc3RhdGljIGNvbnN0IGNoYXIqICBzZXBfbW9uaXRvcl9lbnYgPSAiU0VQX01PTklUT1IiOworc3RhdGljIGJvb2wgICAgICAgICBzZXBfbW9uaXRvciA9IGZhbHNlOworc3RhdGljIGNvbnN0IGNoYXIqICBzZXBfZGV2aWNlX2VudiA9ICJTRVBfREVWSUNFIjsKK3N0YXRpYyBjb25zdCBjaGFyKiAgc2VwX2RldmljZSA9ICAiL2Rldi9zZXAzLjgvYyI7CitzdGF0aWMgaW50ICAgICAgICAgIHNlcF9jb3VudGVyID0gMDsKKworI2RlZmluZSBTRVBfQVBJX0lPQ19NQUdJQyAgIDk5CisjZGVmaW5lIFNFUF9JT0NUTF9QQVVTRSAgICAgX0lPIChTRVBfQVBJX0lPQ19NQUdJQywgMzEpCisjZGVmaW5lIFNFUF9JT0NUTF9SRVNVTUUgICAgX0lPIChTRVBfQVBJX0lPQ19NQUdJQywgMzIpCisKK3N0YXRpYyB2b2lkIGFkZF9yZWZfY291bnQodm9pZCAqIGJ1ZiwgYm9vbCBjcmVhdGVkKQoreworICAgIG11dGV4X2xvY2tlcl90IGxvY2tlcihhZGRfcmVmX2xvY2spOworICAgIFJlZkluZm8gKiBpbmZvID0gcmVmX2RhdGFbYnVmXTsKKworICAgIGlmIChpbmZvKSB7CisgICAgICAgIGluZm8tPmNvdW50Kys7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpbmZvID0gbmV3IFJlZkluZm8oKGludCljcmVhdGVkLChsb25nKTEpOworICAgIH0KKyAgICBpbmZvLT5pc19hZGRlZCB8PSBjcmVhdGVkOworICAgIHJlZl9kYXRhW2J1Zl0gPSBpbmZvOworfQorCitzdGF0aWMgdm9pZCBCdWZSZWxlYXNlUmVmKHZvaWQgKiBidWYpCit7CisgICAgbXV0ZXhfbG9ja2VyX3QgbG9ja2VyKGFkZF9yZWZfbG9jayk7CisgICAgUmVmSW5mbyAqIGluZm8gPSByZWZfZGF0YVtidWZdOworCisgICAgaWYgKGluZm8pIHsKKyAgICAgICAgLS1pbmZvLT5jb3VudDsKKyAgICAgICAgaWYgKGluZm8tPmNvdW50ID09IDAgJiYgaW5mby0+aXNfYWRkZWQpIHsKKyAgICAgICAgICAgIEJ1ZmZlclJlbGVhc2VSZWYoYnVmKTsKKyAgICAgICAgICAgIGluZm8tPmlzX2FkZGVkID0gMDsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIGludCBWVFBhdXNlU2FtcGxpbmcodm9pZCkKK3sKKyAgICBpbnQgcmV0ID0gLTE7CisgICAgaW50IGhhbmRsZSA9IG9wZW4oc2VwX2RldmljZSwgT19SRFdSKTsKKyAgICBpZiAoaGFuZGxlID4gMCkgeworICAgICAgICByZXQgPSBpb2N0bChoYW5kbGUsIFNFUF9JT0NUTF9QQVVTRSk7CisgICAgICAgIGNsb3NlKGhhbmRsZSk7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgVlRSZXN1bWVTYW1wbGluZyh2b2lkKQoreworICAgIGludCByZXQgPSAtMTsKKyAgICBpbnQgaGFuZGxlID0gb3BlbihzZXBfZGV2aWNlLCBPX1JEV1IpOworICAgIGlmIChoYW5kbGUgPiAwKSB7CisgICAgICAgIHJldCA9IGlvY3RsKGhhbmRsZSwgU0VQX0lPQ1RMX1JFU1VNRSk7CisgICAgICAgIGNsb3NlKGhhbmRsZSk7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisjZW5kaWYgLy8gU0VQX1NVUFBPUlQKKwordm9pZCBPZmZsb2FkRGVzY3JpcHRvcjo6b2ZmbG9hZCgKKyAgICB1aW50MzJfdCAgYnVmZmVyX2NvdW50LAorICAgIHZvaWQqKiAgICBidWZmZXJzLAorICAgIHZvaWQqICAgICBtaXNjX2RhdGEsCisgICAgdWludDE2X3QgIG1pc2NfZGF0YV9sZW4sCisgICAgdm9pZCogICAgIHJldHVybl9kYXRhLAorICAgIHVpbnQxNl90ICByZXR1cm5fZGF0YV9sZW4KKykKK3sKKyAgICBGdW5jdGlvbkRlc2NyaXB0b3IgKmZ1bmMgPSAoRnVuY3Rpb25EZXNjcmlwdG9yKikgbWlzY19kYXRhOworICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBmdW5jLT5kYXRhOworICAgIE9mZmxvYWREZXNjcmlwdG9yIG9mbGQ7CisgICAgY2hhciAqaW5fZGF0YSA9IDA7CisgICAgY2hhciAqb3V0X2RhdGEgPSAwOworICAgIGNoYXIgKnRpbWVyX2RhdGEgPSAwOworCisgICAgY29uc29sZV9lbmFibGVkID0gZnVuYy0+Y29uc29sZV9lbmFibGVkOworICAgIHRpbWVyX2VuYWJsZWQgPSBmdW5jLT50aW1lcl9lbmFibGVkOworICAgIG9mZmxvYWRfcmVwb3J0X2xldmVsID0gZnVuYy0+b2ZmbG9hZF9yZXBvcnRfbGV2ZWw7CisgICAgb2ZmbG9hZF9udW1iZXIgPSBmdW5jLT5vZmZsb2FkX251bWJlcjsKKyAgICBvZmxkLnNldF9vZmZsb2FkX251bWJlcihmdW5jLT5vZmZsb2FkX251bWJlcik7CisKKyNpZmRlZiBTRVBfU1VQUE9SVAorICAgIGlmIChzZXBfbW9uaXRvcikgeworICAgICAgICBpZiAoX19zeW5jX2ZldGNoX2FuZF9hZGQoJnNlcF9jb3VudGVyLCAxKSA9PSAwKSB7CisgICAgICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJWVFJlc3VtZVNhbXBsaW5nXG4iKTsKKyAgICAgICAgICAgIFZUUmVzdW1lU2FtcGxpbmcoKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvLyBTRVBfU1VQUE9SVAorCisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRV8xKDIsIG9mbGQuZ2V0X29mZmxvYWRfbnVtYmVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNfb2ZmbG9hZF9zdGFydF90YXJnZXRfZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIk9mZmxvYWQgXCIlc1wiIHN0YXJ0ZWRcbiIsIG5hbWUpOworCisgICAgLy8gaW5pdGlhbGl6ZSB0aW1lciBkYXRhCisgICAgT0ZGTE9BRF9USU1FUl9JTklUKCk7CisKKyAgICBPRkZMT0FEX1RJTUVSX1NUQVJUKGNfb2ZmbG9hZF90YXJnZXRfdG90YWxfdGltZSk7CisKKyAgICBPRkZMT0FEX1RJTUVSX1NUQVJUKGNfb2ZmbG9hZF90YXJnZXRfZGVzY3JpcHRvcl9zZXR1cCk7CisKKyAgICAvLyBnZXQgaW5wdXQvb3V0cHV0IGJ1ZmZlciBhZGRyZXNzZXMKKyAgICBpZiAoZnVuYy0+aW5fZGF0YWxlbiA+IDAgfHwgZnVuYy0+b3V0X2RhdGFsZW4gPiAwKSB7CisgICAgICAgIGlmIChmdW5jLT5kYXRhX29mZnNldCAhPSAwKSB7CisgICAgICAgICAgICBpbl9kYXRhID0gKGNoYXIqKSBtaXNjX2RhdGEgKyBmdW5jLT5kYXRhX29mZnNldDsKKyAgICAgICAgICAgIG91dF9kYXRhID0gKGNoYXIqKSByZXR1cm5fZGF0YTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGNoYXIgKmlub3V0X2J1ZiA9IChjaGFyKikgYnVmZmVyc1stLWJ1ZmZlcl9jb3VudF07CisgICAgICAgICAgICBpbl9kYXRhID0gaW5vdXRfYnVmOworICAgICAgICAgICAgb3V0X2RhdGEgPSBpbm91dF9idWY7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBhc3NpZ24gdmFyaWFibGUgZGVzY3JpcHRvcnMKKyAgICBvZmxkLm1fdmFyc190b3RhbCA9IGZ1bmMtPnZhcnNfbnVtOworICAgIGlmIChvZmxkLm1fdmFyc190b3RhbCA+IDApIHsKKyAgICAgICAgdWludDY0X3QgdmFyX2RhdGFfbGVuID0gb2ZsZC5tX3ZhcnNfdG90YWwgKiBzaXplb2YoVmFyRGVzYyk7CisKKyAgICAgICAgb2ZsZC5tX3ZhcnMgPSAoVmFyRGVzYyopIG1hbGxvYyh2YXJfZGF0YV9sZW4pOworICAgICAgICBtZW1jcHkob2ZsZC5tX3ZhcnMsIGluX2RhdGEsIHZhcl9kYXRhX2xlbik7CisKKyAgICAgICAgaW5fZGF0YSArPSB2YXJfZGF0YV9sZW47CisgICAgICAgIGZ1bmMtPmluX2RhdGFsZW4gLT0gdmFyX2RhdGFfbGVuOworICAgIH0KKworICAgIC8vIHRpbWVyIGRhdGEKKyAgICBpZiAoZnVuYy0+dGltZXJfZW5hYmxlZCkgeworICAgICAgICB1aW50NjRfdCB0aW1lcl9kYXRhX2xlbiA9IE9GRkxPQURfVElNRVJfREFUQUxFTigpOworCisgICAgICAgIHRpbWVyX2RhdGEgPSBvdXRfZGF0YTsKKyAgICAgICAgb3V0X2RhdGEgKz0gdGltZXJfZGF0YV9sZW47CisgICAgICAgIGZ1bmMtPm91dF9kYXRhbGVuIC09IHRpbWVyX2RhdGFfbGVuOworICAgIH0KKworICAgIC8vIGluaXQgTWFyc2hhbGxlcnMKKyAgICBvZmxkLm1faW4uaW5pdF9idWZmZXIoaW5fZGF0YSwgZnVuYy0+aW5fZGF0YWxlbik7CisgICAgb2ZsZC5tX291dC5pbml0X2J1ZmZlcihvdXRfZGF0YSwgZnVuYy0+b3V0X2RhdGFsZW4pOworCisgICAgLy8gY29weSBidWZmZXJzIHRvIG9mZmxvYWQgZGVzY3JpcHRvcgorICAgIHN0ZDo6Y29weShidWZmZXJzLCBidWZmZXJzICsgYnVmZmVyX2NvdW50LAorICAgICAgICAgICAgICBzdGQ6OmJhY2tfaW5zZXJ0ZXIob2ZsZC5tX2J1ZmZlcnMpKTsKKworICAgIE9GRkxPQURfVElNRVJfU1RPUChjX29mZmxvYWRfdGFyZ2V0X2Rlc2NyaXB0b3Jfc2V0dXApOworCisgICAgLy8gZmluZCBvZmZsb2FkIGVudHJ5IGFkZHJlc3MKKyAgICBPRkZMT0FEX1RJTUVSX1NUQVJUKGNfb2ZmbG9hZF90YXJnZXRfZnVuY19sb29rdXApOworCisgICAgb2ZmbG9hZF9mdW5jX3dpdGhfcGFybXMgZW50cnkgPSAob2ZmbG9hZF9mdW5jX3dpdGhfcGFybXMpCisgICAgICAgIF9fb2ZmbG9hZF9lbnRyaWVzLmZpbmRfYWRkcihuYW1lKTsKKworICAgIGlmIChlbnRyeSA9PSBOVUxMKSB7CisjaWYgT0ZGTE9BRF9ERUJVRyA+IDAKKyAgICAgICAgaWYgKGNvbnNvbGVfZW5hYmxlZCA+IDIpIHsKKyAgICAgICAgICAgIF9fb2ZmbG9hZF9lbnRyaWVzLmR1bXAoKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19vZmZsb2FkX2Rlc2NyaXB0b3Jfb2ZmbG9hZCwgbmFtZSk7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorCisgICAgT0ZGTE9BRF9USU1FUl9TVE9QKGNfb2ZmbG9hZF90YXJnZXRfZnVuY19sb29rdXApOworCisgICAgT0ZGTE9BRF9USU1FUl9TVEFSVChjX29mZmxvYWRfdGFyZ2V0X2Z1bmNfdGltZSk7CisKKyAgICAvLyBleGVjdXRlIG9mZmxvYWQgZW50cnkKKyAgICBlbnRyeSgmb2ZsZCk7CisKKyAgICBPRkZMT0FEX1RJTUVSX1NUT1AoY19vZmZsb2FkX3RhcmdldF9mdW5jX3RpbWUpOworCisgICAgT0ZGTE9BRF9USU1FUl9TVE9QKGNfb2ZmbG9hZF90YXJnZXRfdG90YWxfdGltZSk7CisKKyAgICAvLyBjb3B5IHRpbWVyIGRhdGEgdG8gdGhlIGJ1ZmZlcgorICAgIE9GRkxPQURfVElNRVJfVEFSR0VUX0RBVEEodGltZXJfZGF0YSk7CisKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJPZmZsb2FkIFwiJXNcIiBmaW5pc2hlZFxuIiwgbmFtZSk7CisKKyNpZmRlZiBTRVBfU1VQUE9SVAorICAgIGlmIChzZXBfbW9uaXRvcikgeworICAgICAgICBpZiAoX19zeW5jX3N1Yl9hbmRfZmV0Y2goJnNlcF9jb3VudGVyLCAxKSA9PSAwKSB7CisgICAgICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJWVFBhdXNlU2FtcGxpbmdcbiIpOworICAgICAgICAgICAgVlRQYXVzZVNhbXBsaW5nKCk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLy8gU0VQX1NVUFBPUlQKK30KKwordm9pZCBPZmZsb2FkRGVzY3JpcHRvcjo6bWVyZ2VfdmFyX2Rlc2NzKAorICAgIFZhckRlc2MgKnZhcnMsCisgICAgVmFyRGVzYzIgKnZhcnMyLAorICAgIGludCB2YXJzX3RvdGFsCispCit7CisgICAgLy8gbnVtYmVyIG9mIHZhcmlhYmxlIGRlc2NyaXB0b3JzIHJlY2VpdmVkIGZyb20gaG9zdCBhbmQgZ2VuZXJhdGVkCisgICAgLy8gbG9jYWxseSBzaG91bGQgbWF0Y2gKKyAgICBpZiAobV92YXJzX3RvdGFsIDwgdmFyc190b3RhbCkgeworICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfbWVyZ2VfdmFyX2Rlc2NzMSk7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX3ZhcnNfdG90YWw7IGkrKykgeworICAgICAgICBpZiAoaSA8IHZhcnNfdG90YWwpIHsKKyAgICAgICAgICAgIC8vIHZhcmlhYmxlIHR5cGUgbXVzdCBtYXRjaAorICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS50eXBlLmJpdHMgIT0gdmFyc1tpXS50eXBlLmJpdHMpIHsKKyAgICAgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfbWVyZ2VfdmFyX2Rlc2NzMik7CisgICAgICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbV92YXJzW2ldLnB0ciA9IHZhcnNbaV0ucHRyOworICAgICAgICAgICAgbV92YXJzW2ldLmludG8gPSB2YXJzW2ldLmludG87CisKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZhcl9zbmFtZSA9ICIiOworICAgICAgICAgICAgaWYgKHZhcnMyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpZiAodmFyczJbaV0uc25hbWUgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICB2YXJfc25hbWUgPSB2YXJzMltpXS5zbmFtZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFXzEoMiwgZ2V0X29mZmxvYWRfbnVtYmVyKCksIGNfb2ZmbG9hZF92YXIsCisgICAgICAgICAgICAgICAgIiAgIFZhckRlc2MgJWQsIHZhcj0lcywgJXMsICVzXG4iLAorICAgICAgICAgICAgICAgIGksIHZhcl9zbmFtZSwKKyAgICAgICAgICAgICAgICB2YXJkZXNjX2RpcmVjdGlvbl9hc19zdHJpbmdbbV92YXJzW2ldLmRpcmVjdGlvbi5iaXRzXSwKKyAgICAgICAgICAgICAgICB2YXJkZXNjX3R5cGVfYXNfc3RyaW5nW21fdmFyc1tpXS50eXBlLnNyY10pOworICAgICAgICAgICAgaWYgKHZhcnMyICE9IE5VTEwgJiYgdmFyczJbaV0uZG5hbWUgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIE9GRkxPQURfVFJBQ0UoMiwgIiAgICAgICAgICAgICAgaW50bz0lcywgJXNcbiIsIHZhcnMyW2ldLmRuYW1lLAorICAgICAgICAgICAgICAgICAgICB2YXJkZXNjX3R5cGVfYXNfc3RyaW5nW21fdmFyc1tpXS50eXBlLmRzdF0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIE9GRkxPQURfVFJBQ0UoMiwKKyAgICAgICAgICAgICIgICAgICAgICAgICAgIHR5cGVfc3JjPSVkLCB0eXBlX2RzdG49JWQsIGRpcmVjdGlvbj0lZCwgIgorICAgICAgICAgICAgImFsbG9jX2lmPSVkLCBmcmVlX2lmPSVkLCBhbGlnbj0lZCwgbWljX29mZnNldD0lZCwgZmxhZ3M9MHgleCwgIgorICAgICAgICAgICAgIm9mZnNldD0lbGxkLCBzaXplPSVsbGQsIGNvdW50L2Rpc3A9JWxsZCwgcHRyPSVwIGludG89JXBcbiIsCisgICAgICAgICAgICBtX3ZhcnNbaV0udHlwZS5zcmMsCisgICAgICAgICAgICBtX3ZhcnNbaV0udHlwZS5kc3QsCisgICAgICAgICAgICBtX3ZhcnNbaV0uZGlyZWN0aW9uLmJpdHMsCisgICAgICAgICAgICBtX3ZhcnNbaV0uYWxsb2NfaWYsCisgICAgICAgICAgICBtX3ZhcnNbaV0uZnJlZV9pZiwKKyAgICAgICAgICAgIG1fdmFyc1tpXS5hbGlnbiwKKyAgICAgICAgICAgIG1fdmFyc1tpXS5taWNfb2Zmc2V0LAorICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLmJpdHMsCisgICAgICAgICAgICBtX3ZhcnNbaV0ub2Zmc2V0LAorICAgICAgICAgICAgbV92YXJzW2ldLnNpemUsCisgICAgICAgICAgICBtX3ZhcnNbaV0uY291bnQsCisgICAgICAgICAgICBtX3ZhcnNbaV0ucHRyLAorICAgICAgICAgICAgbV92YXJzW2ldLmludG8pOworICAgIH0KK30KKwordm9pZCBPZmZsb2FkRGVzY3JpcHRvcjo6c2NhdHRlcl9jb3B5aW5fZGF0YSgpCit7CisgICAgT0ZGTE9BRF9USU1FUl9TVEFSVChjX29mZmxvYWRfdGFyZ2V0X3NjYXR0ZXJfaW5wdXRzKTsKKworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIklOICBidWZmZXIgQCAlcCBzaXplICVsbGRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBtX2luLmdldF9idWZmZXJfc3RhcnQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1faW4uZ2V0X2J1ZmZlcl9zaXplKCkpOworICAgIE9GRkxPQURfREVCVUdfRFVNUF9CWVRFUygyLCBtX2luLmdldF9idWZmZXJfc3RhcnQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pbi5nZXRfYnVmZmVyX3NpemUoKSk7CisKKyAgICAvLyByZWNlaXZlIGRhdGEKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fdmFyc190b3RhbDsgaSsrKSB7CisgICAgICAgIGJvb2wgc3JjX2lzX2Zvcl9taWMgPSAobV92YXJzW2ldLmRpcmVjdGlvbi5vdXQgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uaW50byA9PSBOVUxMKTsKKyAgICAgICAgdm9pZCoqIHB0cl9hZGRyID0gc3JjX2lzX2Zvcl9taWMgPworICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx2b2lkKio+KG1fdmFyc1tpXS5wdHIpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dm9pZCoqPihtX3ZhcnNbaV0uaW50byk7CisgICAgICAgIGludCB0eXBlID0gc3JjX2lzX2Zvcl9taWMgPyBtX3ZhcnNbaV0udHlwZS5zcmMgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnR5cGUuZHN0OworICAgICAgICBib29sIGlzX3N0YXRpYyA9IHNyY19pc19mb3JfbWljID8KKyAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhdGljIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhdGljX2RzdG47CisgICAgICAgIHZvaWQgKnB0ciA9IE5VTEw7CisKKyAgICAgICAgaWYgKG1fdmFyc1tpXS5mbGFncy5hbGxvY19kaXNwKSB7CisgICAgICAgICAgICBpbnQ2NF90IG9mZnNldCA9IDA7CisgICAgICAgICAgICBtX2luLnJlY2VpdmVfZGF0YSgmb2Zmc2V0LCBzaXplb2Yob2Zmc2V0KSk7CisgICAgICAgICAgICBtX3ZhcnNbaV0ub2Zmc2V0ID0gLW9mZnNldDsKKyAgICAgICAgfQorICAgICAgICBpZiAoVkFSX1RZUEVfSVNfRFZfREFUQV9TTElDRSh0eXBlKSB8fAorICAgICAgICAgICAgVkFSX1RZUEVfSVNfRFZfREFUQSh0eXBlKSkgeworICAgICAgICAgICAgQXJyRGVzYyAqZHZwID0gKHR5cGUgPT0gY19kdl9kYXRhX3NsaWNlIHx8IHR5cGUgPT0gY19kdl9kYXRhKT8KKyAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8QXJyRGVzYyo+KHB0cl9hZGRyKSA6CisgICAgICAgICAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxBcnJEZXNjKio+KHB0cl9hZGRyKTsKKyAgICAgICAgICAgIHB0cl9hZGRyID0gcmVpbnRlcnByZXRfY2FzdDx2b2lkKio+KCZkdnAtPkJhc2UpOworICAgICAgICB9CisKKyAgICAgICAgLy8gU2V0IHBvaW50ZXIgdmFsdWVzCisgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgY2FzZSBjX2RhdGFfcHRyX2FycmF5OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGogPSBtX3ZhcnNbaV0ucHRyX2Fycl9vZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgIGludCBtYXhfZWwgPSBqICsgbV92YXJzW2ldLmNvdW50OworICAgICAgICAgICAgICAgICAgICBjaGFyICpkc3RfYXJyX3B0ciA9IChzcmNfaXNfZm9yX21pYyk/CisgICAgICAgICAgICAgICAgICAgICAgICAqKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcioqPihtX3ZhcnNbaV0ucHRyKSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4obV92YXJzW2ldLmludG8pOworCisgICAgICAgICAgICAgICAgICAgIGZvciAoOyBqIDwgbWF4X2VsOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcmNfaXNfZm9yX21pYykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tqXS5wdHIgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfYXJyX3B0ciArIG1fdmFyc1tqXS5wdHJfYXJyX29mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tqXS5pbnRvID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X2Fycl9wdHIgKyBtX3ZhcnNbal0ucHRyX2Fycl9vZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGNfZGF0YToKKyAgICAgICAgICAgIGNhc2UgY192b2lkX3B0cjoKKyAgICAgICAgICAgIGNhc2UgY19jZWFuX3ZhcjoKKyAgICAgICAgICAgIGNhc2UgY19kdjoKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBjX3N0cmluZ19wdHI6CisgICAgICAgICAgICBjYXNlIGNfZGF0YV9wdHI6CisgICAgICAgICAgICBjYXNlIGNfY2Vhbl92YXJfcHRyOgorICAgICAgICAgICAgY2FzZSBjX2R2X3B0cjoKKyAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmFsbG9jX2lmKSB7CisgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5mbGFncy5zaW5rX2FkZHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1faW4ucmVjZWl2ZV9kYXRhKCZidWYsIHNpemVvZihidWYpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiA9IG1fYnVmZmVycy5mcm9udCgpOworICAgICAgICAgICAgICAgICAgICAgICAgbV9idWZmZXJzLnBvcF9mcm9udCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChidWYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNfc3RhdGljKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtX3ZhcnNbaV0uZmxhZ3Muc2lua19hZGRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluY3JlbWVudCBidWZmZXIgcmVmZXJlbmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9GRkxPQURfVElNRVJfU1RBUlQoY19vZmZsb2FkX3RhcmdldF9hZGRfYnVmZmVyX3JlZnMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJBZGRSZWYoYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0ZGTE9BRF9USU1FUl9TVE9QKGNfb2ZmbG9hZF90YXJnZXRfYWRkX2J1ZmZlcl9yZWZzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkX3JlZl9jb3VudChidWYsIDAgPT0gbV92YXJzW2ldLmZsYWdzLnNpbmtfYWRkcik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBwdHIgPSBzdGF0aWNfY2FzdDxjaGFyKj4oYnVmKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLm1pY19vZmZzZXQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhY2tfYnVmID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCA6IG1fdmFyc1tpXS5vZmZzZXQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICpwdHJfYWRkciA9IHB0cjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAobV92YXJzW2ldLmZsYWdzLnNpbmtfYWRkcikgeworICAgICAgICAgICAgICAgICAgICB2b2lkICpidWY7CisgICAgICAgICAgICAgICAgICAgIG1faW4ucmVjZWl2ZV9kYXRhKCZidWYsIHNpemVvZihidWYpKTsKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAqcHRyID0gc3RhdGljX2Nhc3Q8Y2hhcio+KGJ1ZikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLm1pY19vZmZzZXQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1fdmFyc1tpXS5mbGFncy5pc19zdGFja19idWYgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgOiBtX3ZhcnNbaV0ub2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgKnB0cl9hZGRyID0gcHRyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBjX2Z1bmNfcHRyOgorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIGNfZHZfZGF0YToKKyAgICAgICAgICAgIGNhc2UgY19kdl9wdHJfZGF0YToKKyAgICAgICAgICAgIGNhc2UgY19kdl9kYXRhX3NsaWNlOgorICAgICAgICAgICAgY2FzZSBjX2R2X3B0cl9kYXRhX3NsaWNlOgorICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uYWxsb2NfaWYpIHsKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAqYnVmOworICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmZsYWdzLnNpbmtfYWRkcikgeworICAgICAgICAgICAgICAgICAgICAgICAgbV9pbi5yZWNlaXZlX2RhdGEoJmJ1Ziwgc2l6ZW9mKGJ1ZikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgYnVmID0gbV9idWZmZXJzLmZyb250KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2J1ZmZlcnMucG9wX2Zyb250KCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGJ1ZikgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc19zdGF0aWMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1fdmFyc1tpXS5mbGFncy5zaW5rX2FkZHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5jcmVtZW50IGJ1ZmZlciByZWZlcmVuY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0ZGTE9BRF9USU1FUl9TVEFSVChjX29mZmxvYWRfdGFyZ2V0X2FkZF9idWZmZXJfcmVmcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlckFkZFJlZihidWYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPRkZMT0FEX1RJTUVSX1NUT1AoY19vZmZsb2FkX3RhcmdldF9hZGRfYnVmZmVyX3JlZnMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRfcmVmX2NvdW50KGJ1ZiwgMCA9PSBtX3ZhcnNbaV0uZmxhZ3Muc2lua19hZGRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHB0ciA9IHN0YXRpY19jYXN0PGNoYXIqPihidWYpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ubWljX29mZnNldCArIG1fdmFyc1tpXS5vZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgKnB0cl9hZGRyID0gcHRyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChtX3ZhcnNbaV0uZmxhZ3Muc2lua19hZGRyKSB7CisgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZjsKKyAgICAgICAgICAgICAgICAgICAgbV9pbi5yZWNlaXZlX2RhdGEoJmJ1Ziwgc2l6ZW9mKGJ1ZikpOworICAgICAgICAgICAgICAgICAgICBwdHIgPSBzdGF0aWNfY2FzdDxjaGFyKj4oYnVmKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5taWNfb2Zmc2V0ICsgbV92YXJzW2ldLm9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgKnB0cl9hZGRyID0gcHRyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfdW5rbm93bl92YXJfdHlwZSwgdHlwZSk7CisgICAgICAgICAgICAgICAgYWJvcnQoKTsKKyAgICAgICAgfQorICAgICAgICAvLyBSZWxlYXNlIG9ic29sZXRlIGJ1ZmZlcnMgZm9yIHN0YWNrIG9mIHBlcnNpc3RlbnQgb2JqZWN0cworICAgICAgICBpZiAodHlwZSA9IGNfZGF0YV9wdHIgJiYKKyAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5pc19zdGFja19idWYgJiYKKyAgICAgICAgICAgICFtX3ZhcnNbaV0uZGlyZWN0aW9uLmJpdHMgJiYKKyAgICAgICAgICAgIG1fdmFyc1tpXS5hbGxvY19pZiAmJgorICAgICAgICAgICAgbV92YXJzW2ldLnNpemUgIT0gMCkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGo9MDsgaiA8IG1fdmFyc1tpXS5zaXplOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAqYnVmOworICAgICAgICAgICAgICAgICAgICBtX2luLnJlY2VpdmVfZGF0YSgmYnVmLCBzaXplb2YoYnVmKSk7CisgICAgICAgICAgICAgICAgICAgIEJ1ZmZlclJlbGVhc2VSZWYoYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgcmVmX2RhdGEuZXJhc2UoYnVmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gRG8gY29weWluCisgICAgICAgIHN3aXRjaCAobV92YXJzW2ldLnR5cGUuZHN0KSB7CisgICAgICAgICAgICBjYXNlIGNfZGF0YV9wdHJfYXJyYXk6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGNfZGF0YToKKyAgICAgICAgICAgIGNhc2UgY192b2lkX3B0cjoKKyAgICAgICAgICAgIGNhc2UgY19jZWFuX3ZhcjoKKyAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5pbiAmJgorICAgICAgICAgICAgICAgICAgICAhbV92YXJzW2ldLmZsYWdzLmlzX3N0YXRpY19kc3RuKSB7CisgICAgICAgICAgICAgICAgICAgIGludDY0X3Qgc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBkaXNwOworICAgICAgICAgICAgICAgICAgICBjaGFyKiBwdHIgPSBtX3ZhcnNbaV0uaW50byA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjaGFyKj4obV92YXJzW2ldLmludG8pIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNoYXIqPihtX3ZhcnNbaV0ucHRyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS50eXBlLmRzdCA9PSBjX2NlYW5fdmFyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2luLnJlY2VpdmVfZGF0YSgoJnNpemUpLCBzaXplb2YoaW50NjRfdCkpOworICAgICAgICAgICAgICAgICAgICAgICAgbV9pbi5yZWNlaXZlX2RhdGEoKCZkaXNwKSwgc2l6ZW9mKGludDY0X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSBtX3ZhcnNbaV0uc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpc3AgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1faW4ucmVjZWl2ZV9kYXRhKHB0ciArIGRpc3AsIHNpemUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBjX2R2OgorICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZGlyZWN0aW9uLmJpdHMgfHwKKyAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmFsbG9jX2lmIHx8CisgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mcmVlX2lmKSB7CisgICAgICAgICAgICAgICAgICAgIGNoYXIqIHB0ciA9IG1fdmFyc1tpXS5pbnRvID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNoYXIqPihtX3ZhcnNbaV0uaW50bykgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y2hhcio+KG1fdmFyc1tpXS5wdHIpOworICAgICAgICAgICAgICAgICAgICBtX2luLnJlY2VpdmVfZGF0YShwdHIgKyBzaXplb2YodWludDY0X3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSAtIHNpemVvZih1aW50NjRfdCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBjX3N0cmluZ19wdHI6CisgICAgICAgICAgICBjYXNlIGNfZGF0YV9wdHI6CisgICAgICAgICAgICBjYXNlIGNfY2Vhbl92YXJfcHRyOgorICAgICAgICAgICAgY2FzZSBjX2R2X3B0cjoKKyAgICAgICAgICAgIGNhc2UgY19kdl9kYXRhOgorICAgICAgICAgICAgY2FzZSBjX2R2X3B0cl9kYXRhOgorICAgICAgICAgICAgY2FzZSBjX2R2X2RhdGFfc2xpY2U6CisgICAgICAgICAgICBjYXNlIGNfZHZfcHRyX2RhdGFfc2xpY2U6CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgY19mdW5jX3B0cjoKKyAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5pbikgeworICAgICAgICAgICAgICAgICAgICBtX2luLnJlY2VpdmVfZnVuY19wdHIoKGNvbnN0IHZvaWQqKikgbV92YXJzW2ldLnB0cik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY191bmtub3duX3Zhcl90eXBlLCBtX3ZhcnNbaV0udHlwZS5kc3QpOworICAgICAgICAgICAgICAgIGFib3J0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBPRkZMT0FEX1RSQUNFKDEsICJUb3RhbCBjb3B5aW4gZGF0YSByZWNlaXZlZCBmcm9tIGhvc3Q6IFslbGxkXSBieXRlc1xuIiwKKyAgICAgICAgICAgICAgICAgIG1faW4uZ2V0X3Rmcl9zaXplKCkpOworCisgICAgT0ZGTE9BRF9USU1FUl9TVE9QKGNfb2ZmbG9hZF90YXJnZXRfc2NhdHRlcl9pbnB1dHMpOworCisgICAgT0ZGTE9BRF9USU1FUl9TVEFSVChjX29mZmxvYWRfdGFyZ2V0X2NvbXB1dGUpOworfQorCit2b2lkIE9mZmxvYWREZXNjcmlwdG9yOjpnYXRoZXJfY29weW91dF9kYXRhKCkKK3sKKyAgICBPRkZMT0FEX1RJTUVSX1NUT1AoY19vZmZsb2FkX3RhcmdldF9jb21wdXRlKTsKKworICAgIE9GRkxPQURfVElNRVJfU1RBUlQoY19vZmZsb2FkX3RhcmdldF9nYXRoZXJfb3V0cHV0cyk7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fdmFyc190b3RhbDsgaSsrKSB7CisgICAgICAgIGJvb2wgc3JjX2lzX2Zvcl9taWMgPSAobV92YXJzW2ldLmRpcmVjdGlvbi5vdXQgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uaW50byA9PSBOVUxMKTsKKworICAgICAgICBzd2l0Y2ggKG1fdmFyc1tpXS50eXBlLnNyYykgeworICAgICAgICAgICAgY2FzZSBjX2RhdGFfcHRyX2FycmF5OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBjX2RhdGE6CisgICAgICAgICAgICBjYXNlIGNfdm9pZF9wdHI6CisgICAgICAgICAgICBjYXNlIGNfY2Vhbl92YXI6CisgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5kaXJlY3Rpb24ub3V0ICYmCisgICAgICAgICAgICAgICAgICAgICFtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhdGljKSB7CisgICAgICAgICAgICAgICAgICAgIG1fb3V0LnNlbmRfZGF0YSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNoYXIqPihtX3ZhcnNbaV0ucHRyKSArIG1fdmFyc1tpXS5kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBjX2R2OgorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIGNfc3RyaW5nX3B0cjoKKyAgICAgICAgICAgIGNhc2UgY19kYXRhX3B0cjoKKyAgICAgICAgICAgIGNhc2UgY19jZWFuX3Zhcl9wdHI6CisgICAgICAgICAgICBjYXNlIGNfZHZfcHRyOgorICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZnJlZV9pZiAmJgorICAgICAgICAgICAgICAgICAgICBzcmNfaXNfZm9yX21pYyAmJgorICAgICAgICAgICAgICAgICAgICAhbV92YXJzW2ldLmZsYWdzLmlzX3N0YXRpYykgeworICAgICAgICAgICAgICAgICAgICB2b2lkICpidWYgPSAqc3RhdGljX2Nhc3Q8Y2hhcioqPihtX3ZhcnNbaV0ucHRyKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ubWljX29mZnNldCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobV92YXJzW2ldLmZsYWdzLmlzX3N0YWNrX2J1Zj8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIDogbV92YXJzW2ldLm9mZnNldCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChidWYgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gZGVjcmVtZW50IGJ1ZmZlciByZWZlcmVuY2UgY291bnQKKyAgICAgICAgICAgICAgICAgICAgT0ZGTE9BRF9USU1FUl9TVEFSVChjX29mZmxvYWRfdGFyZ2V0X3JlbGVhc2VfYnVmZmVyX3JlZnMpOworICAgICAgICAgICAgICAgICAgICBCdWZSZWxlYXNlUmVmKGJ1Zik7CisgICAgICAgICAgICAgICAgICAgIE9GRkxPQURfVElNRVJfU1RPUChjX29mZmxvYWRfdGFyZ2V0X3JlbGVhc2VfYnVmZmVyX3JlZnMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBjX2Z1bmNfcHRyOgorICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZGlyZWN0aW9uLm91dCkgeworICAgICAgICAgICAgICAgICAgICBtX291dC5zZW5kX2Z1bmNfcHRyKCooKHZvaWQqKikgbV92YXJzW2ldLnB0cikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBjX2R2X2RhdGE6CisgICAgICAgICAgICBjYXNlIGNfZHZfcHRyX2RhdGE6CisgICAgICAgICAgICBjYXNlIGNfZHZfZGF0YV9zbGljZToKKyAgICAgICAgICAgIGNhc2UgY19kdl9wdHJfZGF0YV9zbGljZToKKyAgICAgICAgICAgICAgICBpZiAoc3JjX2lzX2Zvcl9taWMgJiYKKyAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZyZWVfaWYgJiYKKyAgICAgICAgICAgICAgICAgICAgIW1fdmFyc1tpXS5mbGFncy5pc19zdGF0aWMpIHsKKyAgICAgICAgICAgICAgICAgICAgQXJyRGVzYyAqZHZwID0gKG1fdmFyc1tpXS50eXBlLnNyYyA9PSBjX2R2X2RhdGEgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS50eXBlLnNyYyA9PSBjX2R2X2RhdGFfc2xpY2UpID8KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEFyckRlc2MqPihtX3ZhcnNbaV0ucHRyKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAqc3RhdGljX2Nhc3Q8QXJyRGVzYyoqPihtX3ZhcnNbaV0ucHRyKTsKKworICAgICAgICAgICAgICAgICAgICB2b2lkICpidWYgPSByZWludGVycHJldF9jYXN0PGNoYXIqPihkdnAtPkJhc2UpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLm1pY19vZmZzZXQgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ub2Zmc2V0OworCisgICAgICAgICAgICAgICAgICAgIGlmIChidWYgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBkZWNyZW1lbnQgYnVmZmVyIHJlZmVyZW5jZSBjb3VudAorICAgICAgICAgICAgICAgICAgICBPRkZMT0FEX1RJTUVSX1NUQVJUKGNfb2ZmbG9hZF90YXJnZXRfcmVsZWFzZV9idWZmZXJfcmVmcyk7CisgICAgICAgICAgICAgICAgICAgIEJ1ZlJlbGVhc2VSZWYoYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgT0ZGTE9BRF9USU1FUl9TVE9QKGNfb2ZmbG9hZF90YXJnZXRfcmVsZWFzZV9idWZmZXJfcmVmcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY191bmtub3duX3Zhcl90eXBlLCBtX3ZhcnNbaV0udHlwZS5kc3QpOworICAgICAgICAgICAgICAgIGFib3J0KCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobV92YXJzW2ldLmludG8pIHsKKyAgICAgICAgICAgIHN3aXRjaCAobV92YXJzW2ldLnR5cGUuZHN0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBjX2RhdGFfcHRyX2FycmF5OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIGNfZGF0YToKKyAgICAgICAgICAgICAgICBjYXNlIGNfdm9pZF9wdHI6CisgICAgICAgICAgICAgICAgY2FzZSBjX2NlYW5fdmFyOgorICAgICAgICAgICAgICAgIGNhc2UgY19kdjoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIGNfc3RyaW5nX3B0cjoKKyAgICAgICAgICAgICAgICBjYXNlIGNfZGF0YV9wdHI6CisgICAgICAgICAgICAgICAgY2FzZSBjX2NlYW5fdmFyX3B0cjoKKyAgICAgICAgICAgICAgICBjYXNlIGNfZHZfcHRyOgorICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5pbiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZyZWVfaWYgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICFtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhdGljX2RzdG4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZiA9ICpzdGF0aWNfY2FzdDxjaGFyKio+KG1fdmFyc1tpXS5pbnRvKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ubWljX29mZnNldCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobV92YXJzW2ldLmZsYWdzLmlzX3N0YWNrX2J1Zj8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIDogbV92YXJzW2ldLm9mZnNldCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChidWYgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVjcmVtZW50IGJ1ZmZlciByZWZlcmVuY2UgY291bnQKKyAgICAgICAgICAgICAgICAgICAgICAgIE9GRkxPQURfVElNRVJfU1RBUlQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY19vZmZsb2FkX3RhcmdldF9yZWxlYXNlX2J1ZmZlcl9yZWZzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZlJlbGVhc2VSZWYoYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE9GRkxPQURfVElNRVJfU1RPUCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX29mZmxvYWRfdGFyZ2V0X3JlbGVhc2VfYnVmZmVyX3JlZnMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBjX2Z1bmNfcHRyOgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgY19kdl9kYXRhOgorICAgICAgICAgICAgICAgIGNhc2UgY19kdl9wdHJfZGF0YToKKyAgICAgICAgICAgICAgICBjYXNlIGNfZHZfZGF0YV9zbGljZToKKyAgICAgICAgICAgICAgICBjYXNlIGNfZHZfcHRyX2RhdGFfc2xpY2U6CisgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZnJlZV9pZiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmRpcmVjdGlvbi5pbiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIW1fdmFyc1tpXS5mbGFncy5pc19zdGF0aWNfZHN0bikgeworICAgICAgICAgICAgICAgICAgICAgICAgQXJyRGVzYyAqZHZwID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobV92YXJzW2ldLnR5cGUuZHN0ID09IGNfZHZfZGF0YV9zbGljZSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0udHlwZS5kc3QgPT0gY19kdl9kYXRhKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8QXJyRGVzYyo+KG1fdmFyc1tpXS5pbnRvKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnN0YXRpY19jYXN0PEFyckRlc2MqKj4obV92YXJzW2ldLmludG8pOworICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYnVmID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oZHZwLT5CYXNlKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ubWljX29mZnNldCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ub2Zmc2V0OworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnVmID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlY3JlbWVudCBidWZmZXIgcmVmZXJlbmNlIGNvdW50CisgICAgICAgICAgICAgICAgICAgICAgICBPRkZMT0FEX1RJTUVSX1NUQVJUKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfb2ZmbG9hZF90YXJnZXRfcmVsZWFzZV9idWZmZXJfcmVmcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBCdWZSZWxlYXNlUmVmKGJ1Zik7CisgICAgICAgICAgICAgICAgICAgICAgICBPRkZMT0FEX1RJTUVSX1NUT1AoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY19vZmZsb2FkX3RhcmdldF9yZWxlYXNlX2J1ZmZlcl9yZWZzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY191bmtub3duX3Zhcl90eXBlLCBtX3ZhcnNbaV0udHlwZS5kc3QpOworICAgICAgICAgICAgICAgICAgICBhYm9ydCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiT1VUIGJ1ZmZlciBAIHAgJXAgc2l6ZSAlbGxkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgbV9vdXQuZ2V0X2J1ZmZlcl9zdGFydCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgbV9vdXQuZ2V0X2J1ZmZlcl9zaXplKCkpOworCisgICAgT0ZGTE9BRF9ERUJVR19EVU1QX0JZVEVTKDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fb3V0LmdldF9idWZmZXJfc3RhcnQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9vdXQuZ2V0X2J1ZmZlcl9zaXplKCkpOworCisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRV8xKDEsIGdldF9vZmZsb2FkX251bWJlcigpLCBjX29mZmxvYWRfY29weW91dF9kYXRhLAorICAgICAgICAgICAgICAgICAgIlRvdGFsIGNvcHlvdXQgZGF0YSBzZW50IHRvIGhvc3Q6IFslbGxkXSBieXRlc1xuIiwKKyAgICAgICAgICAgICAgICAgIG1fb3V0LmdldF90ZnJfc2l6ZSgpKTsKKworICAgIE9GRkxPQURfVElNRVJfU1RPUChjX29mZmxvYWRfdGFyZ2V0X2dhdGhlcl9vdXRwdXRzKTsKK30KKwordm9pZCBfX29mZmxvYWRfdGFyZ2V0X2luaXQodm9pZCkKK3sKKyNpZmRlZiBTRVBfU1VQUE9SVAorICAgIGNvbnN0IGNoYXIqIGVudl92YXIgPSBnZXRlbnYoc2VwX21vbml0b3JfZW52KTsKKyAgICBpZiAoZW52X3ZhciAhPSAwICYmICplbnZfdmFyICE9ICdcMCcpIHsKKyAgICAgICAgc2VwX21vbml0b3IgPSBhdG9pKGVudl92YXIpOworICAgIH0KKyAgICBlbnZfdmFyID0gZ2V0ZW52KHNlcF9kZXZpY2VfZW52KTsKKyAgICBpZiAoZW52X3ZhciAhPSAwICYmICplbnZfdmFyICE9ICdcMCcpIHsKKyAgICAgICAgc2VwX2RldmljZSA9IGVudl92YXI7CisgICAgfQorI2VuZGlmIC8vIFNFUF9TVVBQT1JUCisKKyAgICBwcmVmaXggPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X21pYyk7CisKKyAgICAvLyBpbml0IGZyZXF1ZW5jeQorICAgIG1pY19mcmVxdWVuY3kgPSBDT0lQZXJmR2V0Q3ljbGVGcmVxdWVuY3koKTsKK30KKworLy8gVXNlci12aXNpYmxlIG9mZmxvYWQgQVBJCisKK2ludCBfT2ZmbG9hZF9udW1iZXJfb2ZfZGV2aWNlcyh2b2lkKQoreworICAgIHJldHVybiBtaWNfZW5naW5lc190b3RhbDsKK30KKworaW50IF9PZmZsb2FkX2dldF9kZXZpY2VfbnVtYmVyKHZvaWQpCit7CisgICAgcmV0dXJuIG1pY19pbmRleDsKK30KKworaW50IF9PZmZsb2FkX2dldF9waHlzaWNhbF9kZXZpY2VfbnVtYmVyKHZvaWQpCit7CisgICAgdWludDMyX3QgaW5kZXg7CisgICAgRW5naW5lR2V0SW5kZXgoJmluZGV4KTsKKyAgICByZXR1cm4gaW5kZXg7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX3RhcmdldC5oIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF90YXJnZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGIzMTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF90YXJnZXQuaApAQCAtMCwwICsxLDEwMCBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisvLyBUaGUgcGFydHMgb2YgdGhlIG9mZmxvYWQgbGlicmFyeSB1c2VkIG9ubHkgb24gdGhlIHRhcmdldAorCisjaWZuZGVmIE9GRkxPQURfVEFSR0VUX0hfSU5DTFVERUQKKyNkZWZpbmUgT0ZGTE9BRF9UQVJHRVRfSF9JTkNMVURFRAorCisjaW5jbHVkZSAib2ZmbG9hZF9jb21tb24uaCIKKyNpbmNsdWRlICJjb2kvY29pX3NlcnZlci5oIgorCisvLyBUaGUgb2ZmbG9hZCBkZXNjcmlwdG9yLgorY2xhc3MgT2ZmbG9hZERlc2NyaXB0b3IKK3sKK3B1YmxpYzoKKyAgICB+T2ZmbG9hZERlc2NyaXB0b3IoKSB7CisgICAgICAgIGlmIChtX3ZhcnMgIT0gMCkgeworICAgICAgICAgICAgZnJlZShtX3ZhcnMpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gRW50cnkgcG9pbnQgZm9yIENPSS4gU3luY2hyb25vdXNseSBleGVjdXRlIG9mZmxvYWRlZCByZWdpb24gZ2l2ZW4KKyAgICAvLyB0aGUgcHJvdmlkZWQgYnVmZmVycywgbWlzYyBhbmQgcmV0dXJuIGRhdGEuCisgICAgc3RhdGljIHZvaWQgb2ZmbG9hZCgKKyAgICAgICAgdWludDMyX3QgIGJ1ZmZlcl9jb3VudCwKKyAgICAgICAgdm9pZCoqICAgIGJ1ZmZlcnMsCisgICAgICAgIHZvaWQqICAgICBtaXNjX2RhdGEsCisgICAgICAgIHVpbnQxNl90ICBtaXNjX2RhdGFfbGVuLAorICAgICAgICB2b2lkKiAgICAgcmV0dXJuX2RhdGEsCisgICAgICAgIHVpbnQxNl90ICByZXR1cm5fZGF0YV9sZW4KKyAgICApOworCisgICAgLy8gc2NhdHRlcnMgaW5wdXQgZGF0YSBmcm9tIGluIGJ1ZmZlciB0byB0YXJnZXQgdmFyaWFibGVzCisgICAgdm9pZCBzY2F0dGVyX2NvcHlpbl9kYXRhKCk7CisKKyAgICAvLyBnYXRoZXJzIG91dHB1dCBkYXRhIHRvIHRoZSBidWZmZXIKKyAgICB2b2lkIGdhdGhlcl9jb3B5b3V0X2RhdGEoKTsKKworICAgIC8vIG1lcmdlcyBsb2NhbCB2YXJpYWJsZSBkZXNjcmlwdG9ycyB3aXRoIHRoZSBkZXNjcmlwdG9ycyByZWNlaXZlZCBmcm9tCisgICAgLy8gaG9zdAorICAgIHZvaWQgbWVyZ2VfdmFyX2Rlc2NzKFZhckRlc2MgKnZhcnMsIFZhckRlc2MyICp2YXJzMiwgaW50IHZhcnNfdG90YWwpOworCisgICAgaW50IGdldF9vZmZsb2FkX251bWJlcigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1fb2ZmbG9hZF9udW1iZXI7CisgICAgfQorCisgICAgdm9pZCBzZXRfb2ZmbG9hZF9udW1iZXIoaW50IG51bWJlcikgeworICAgICAgICBtX29mZmxvYWRfbnVtYmVyID0gbnVtYmVyOworICAgIH0KKworcHJpdmF0ZToKKyAgICAvLyBDb25zdHJ1Y3RvcgorICAgIE9mZmxvYWREZXNjcmlwdG9yKCkgOiBtX3ZhcnMoMCkKKyAgICB7fQorCitwcml2YXRlOgorICAgIHR5cGVkZWYgc3RkOjpsaXN0PHZvaWQqPiBCdWZmZXJMaXN0OworCisgICAgLy8gVGhlIE1hcnNoYWxsZXIgZm9yIHRoZSBpbnB1dHMgb2YgdGhlIG9mZmxvYWRlZCByZWdpb24uCisgICAgTWFyc2hhbGxlciBtX2luOworCisgICAgLy8gVGhlIE1hcnNoYWxsZXIgZm9yIHRoZSBvdXRwdXRzIG9mIHRoZSBvZmZsb2FkZWQgcmVnaW9uLgorICAgIE1hcnNoYWxsZXIgbV9vdXQ7CisKKyAgICAvLyBMaXN0IG9mIGJ1ZmZlcnMgdGhhdCBhcmUgcGFzc2VkIHRvIGRpc3BhdGNoIGNhbGwKKyAgICBCdWZmZXJMaXN0IG1fYnVmZmVyczsKKworICAgIC8vIFZhcmlhYmxlIGRlc2NyaXB0b3JzIHJlY2VpdmVkIGZyb20gaG9zdAorICAgIFZhckRlc2MqIG1fdmFyczsKKyAgICBpbnQgICAgICBtX3ZhcnNfdG90YWw7CisgICAgaW50ICAgICAgbV9vZmZsb2FkX251bWJlcjsKK307CisKKy8vIG9uZSB0aW1lIHRhcmdldCBpbml0aWFsaXphdGlvbiBpbiBtYWluCitleHRlcm4gdm9pZCBfX29mZmxvYWRfdGFyZ2V0X2luaXQodm9pZCk7CisKKy8vIGxvZ2ljYWwgZGV2aWNlIGluZGV4CitleHRlcm4gaW50IG1pY19pbmRleDsKKworLy8gdG90YWwgbnVtYmVyIG9mIGF2YWlsYWJsZSBsb2dpY2FsIGRldmljZXMKK2V4dGVybiBpbnQgbWljX2VuZ2luZXNfdG90YWw7CisKKy8vIGRldmljZSBmcmVxdWVuY3kgKGZyb20gQ09JKQorZXh0ZXJuIHVpbnQ2NF90IG1pY19mcmVxdWVuY3k7CisKK3N0cnVjdCBSZWZJbmZvIHsKKyAgICBSZWZJbmZvKGJvb2wgaXNfYWRkLCBsb25nIGFtb3VudCk6aXNfYWRkZWQoaXNfYWRkKSxjb3VudChhbW91bnQpCisgICAge30KKyAgICBib29sIGlzX2FkZGVkOworICAgIGxvbmcgY291bnQ7Cit9OworCisjZW5kaWYgLy8gT0ZGTE9BRF9UQVJHRVRfSF9JTkNMVURFRApkaWZmIC0tZ2l0IGEvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF90YXJnZXRfbWFpbi5jcHAgYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX3RhcmdldF9tYWluLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDkyMWQyCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF90YXJnZXRfbWFpbi5jcHAKQEAgLTAsMCArMSwxNyBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCitleHRlcm4gIkMiIHZvaWQgX19vZmZsb2FkX3RhcmdldF9tYWluKHZvaWQpOworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKiBhcmd2KQoreworICAgIF9fb2ZmbG9hZF90YXJnZXRfbWFpbigpOworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF90aW1lci5oIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF90aW1lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0MDFhOWQKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX3RpbWVyLmgKQEAgLTAsMCArMSwxNzIgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBPRkZMT0FEX1RJTUVSX0hfSU5DTFVERUQKKyNkZWZpbmUgT0ZGTE9BRF9USU1FUl9IX0lOQ0xVREVECisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgImxpYm9mZmxvYWRfZXJyb3JfY29kZXMuaCIKKworZXh0ZXJuIGludCB0aW1lcl9lbmFibGVkOworCisjaWZkZWYgVElNSU5HX1NVUFBPUlQKKworc3RydWN0IE9mZmxvYWRUYXJnZXRUaW1lckRhdGEgeworICAgIHVpbnQ2NF90IGZyZXF1ZW5jeTsKKyAgICBzdHJ1Y3QgeworICAgICAgICB1aW50NjRfdCBzdGFydDsKKyAgICAgICAgdWludDY0X3QgdG90YWw7CisgICAgfSBwaGFzZXNbY19vZmZsb2FkX3RhcmdldF9tYXhfcGhhc2VdOworfTsKKworc3RydWN0IE9mZmxvYWRIb3N0VGltZXJEYXRhIHsKKyAgICAvLyBzb3VyY2UgZmlsZSBuYW1lIGFuZCBsaW5lIG51bWJlcgorICAgIGNvbnN0IGNoYXIqIGZpbGU7CisgICAgaW50ICAgICAgICAgbGluZTsKKworICAgIC8vIGhvc3QgdGltZXIgZGF0YQorICAgIHN0cnVjdCB7CisgICAgICAgIHVpbnQ2NF90IHN0YXJ0OworICAgICAgICB1aW50NjRfdCB0b3RhbDsKKyAgICB9IHBoYXNlc1tjX29mZmxvYWRfaG9zdF9tYXhfcGhhc2VdOworCisgICAgdWludDY0X3Qgc2VudF9ieXRlczsKKyAgICB1aW50NjRfdCByZWNlaXZlZF9ieXRlczsKKyAgICBpbnQgY2FyZF9udW1iZXI7CisgICAgaW50IG9mZmxvYWRfbnVtYmVyOworCisgICAgLy8gdGFyZ2V0IHRpbWVyIGRhdGEKKyAgICBPZmZsb2FkVGFyZ2V0VGltZXJEYXRhIHRhcmdldDsKKworICAgIC8vIG5leHQgZWxlbWVudAorICAgIE9mZmxvYWRIb3N0VGltZXJEYXRhICpuZXh0OworfTsKKworI2lmIEhPU1RfTElCUkFSWQorCitleHRlcm4gaW50IG9mZmxvYWRfcmVwb3J0X2xldmVsOworZXh0ZXJuIGludCBvZmZsb2FkX3JlcG9ydF9lbmFibGVkOworI2RlZmluZSBPRkZMT0FEX1JFUE9SVF8xIDEKKyNkZWZpbmUgT0ZGTE9BRF9SRVBPUlRfMiAyCisjZGVmaW5lIE9GRkxPQURfUkVQT1JUXzMgMworI2RlZmluZSBPRkZMT0FEX1JFUE9SVF9PTiAxCisjZGVmaW5lIE9GRkxPQURfUkVQT1JUX09GRiAwCisKKyNkZWZpbmUgT0ZGTE9BRF9USU1FUl9EQVRBTEVOKCkgXAorICAgICgodGltZXJfZW5hYmxlZCB8fCAob2ZmbG9hZF9yZXBvcnRfbGV2ZWwgJiYgb2ZmbG9hZF9yZXBvcnRfZW5hYmxlZCkpID8gXAorICAgICAoKDEgKyBjX29mZmxvYWRfdGFyZ2V0X21heF9waGFzZSkgKiBzaXplb2YodWludDY0X3QpKSA6IDApCisKKyNkZWZpbmUgT0ZGTE9BRF9USU1FUl9TVEFSVCh0aW1lcl9kYXRhLCBwbm9kZSkgXAorICAgIGlmICh0aW1lcl9lbmFibGVkIHx8IFwKKyAgICAgICAgKG9mZmxvYWRfcmVwb3J0X2xldmVsICYmIG9mZmxvYWRfcmVwb3J0X2VuYWJsZWQpKSB7IFwKKyAgICAgICAgb2ZmbG9hZF90aW1lcl9zdGFydCh0aW1lcl9kYXRhLCBwbm9kZSk7IFwKKyAgICB9CisKKyNkZWZpbmUgT0ZGTE9BRF9USU1FUl9TVE9QKHRpbWVyX2RhdGEsIHBub2RlKSBcCisgICAgaWYgKHRpbWVyX2VuYWJsZWQgfHwgXAorICAgICAgICAob2ZmbG9hZF9yZXBvcnRfbGV2ZWwgJiYgb2ZmbG9hZF9yZXBvcnRfZW5hYmxlZCkpIHsgXAorICAgICAgICBvZmZsb2FkX3RpbWVyX3N0b3AodGltZXJfZGF0YSwgcG5vZGUpOyBcCisgICAgfQorCisjZGVmaW5lIE9GRkxPQURfVElNRVJfSU5JVChmaWxlLCBsaW5lKSBcCisgICAgb2ZmbG9hZF90aW1lcl9pbml0KGZpbGUsIGxpbmUpOworCisjZGVmaW5lIE9GRkxPQURfVElNRVJfVEFSR0VUX0RBVEEodGltZXJfZGF0YSwgZGF0YSkgXAorICAgIGlmICh0aW1lcl9lbmFibGVkIHx8IFwKKyAgICAgICAgKG9mZmxvYWRfcmVwb3J0X2xldmVsICYmIG9mZmxvYWRfcmVwb3J0X2VuYWJsZWQpKSB7IFwKKyAgICAgICAgb2ZmbG9hZF90aW1lcl9maWxsX3RhcmdldF9kYXRhKHRpbWVyX2RhdGEsIGRhdGEpOyBcCisgICAgfQorCisjZGVmaW5lIE9GRkxPQURfVElNRVJfSE9TVF9TREFUQSh0aW1lcl9kYXRhLCBkYXRhKSBcCisgICAgaWYgKG9mZmxvYWRfcmVwb3J0X2xldmVsICYmIG9mZmxvYWRfcmVwb3J0X2VuYWJsZWQpIHsgXAorICAgICAgICBvZmZsb2FkX3RpbWVyX2ZpbGxfaG9zdF9zZGF0YSh0aW1lcl9kYXRhLCBkYXRhKTsgXAorICAgIH0KKworI2RlZmluZSBPRkZMT0FEX1RJTUVSX0hPU1RfUkRBVEEodGltZXJfZGF0YSwgZGF0YSkgXAorICAgIGlmIChvZmZsb2FkX3JlcG9ydF9sZXZlbCAmJiBvZmZsb2FkX3JlcG9ydF9lbmFibGVkKSB7IFwKKyAgICAgICAgb2ZmbG9hZF90aW1lcl9maWxsX2hvc3RfcmRhdGEodGltZXJfZGF0YSwgZGF0YSk7IFwKKyAgICB9CisKKyNkZWZpbmUgT0ZGTE9BRF9USU1FUl9IT1NUX01JQ19OVU0odGltZXJfZGF0YSwgZGF0YSkgXAorICAgIGlmIChvZmZsb2FkX3JlcG9ydF9sZXZlbCAmJiBvZmZsb2FkX3JlcG9ydF9lbmFibGVkKSB7IFwKKyAgICAgICAgb2ZmbG9hZF90aW1lcl9maWxsX2hvc3RfbWljX251bSh0aW1lcl9kYXRhLCBkYXRhKTsgXAorICAgIH0KKworZXh0ZXJuIHZvaWQgb2ZmbG9hZF90aW1lcl9zdGFydChPZmZsb2FkSG9zdFRpbWVyRGF0YSAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPZmZsb2FkSG9zdFBoYXNlIHRfbm9kZSk7CitleHRlcm4gdm9pZCBvZmZsb2FkX3RpbWVyX3N0b3AoT2ZmbG9hZEhvc3RUaW1lckRhdGEgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPZmZsb2FkSG9zdFBoYXNlIHRfbm9kZSk7CitleHRlcm4gT2ZmbG9hZEhvc3RUaW1lckRhdGEgKiBvZmZsb2FkX3RpbWVyX2luaXQoY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUpOworZXh0ZXJuIHZvaWQgb2ZmbG9hZF90aW1lcl9maWxsX3RhcmdldF9kYXRhKE9mZmxvYWRIb3N0VGltZXJEYXRhICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSk7CitleHRlcm4gdm9pZCBvZmZsb2FkX3RpbWVyX2ZpbGxfaG9zdF9zZGF0YShPZmZsb2FkSG9zdFRpbWVyRGF0YSAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3Qgc2VudF9ieXRlcyk7CitleHRlcm4gdm9pZCBvZmZsb2FkX3RpbWVyX2ZpbGxfaG9zdF9yZGF0YShPZmZsb2FkSG9zdFRpbWVyRGF0YSAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3Qgc2VudF9ieXRlcyk7CitleHRlcm4gdm9pZCBvZmZsb2FkX3RpbWVyX2ZpbGxfaG9zdF9taWNfbnVtKE9mZmxvYWRIb3N0VGltZXJEYXRhICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjYXJkX251bWJlcik7CisKKy8vIFV0aWxpdHkgc3RydWN0dXJlIGZvciBzdGFydGluZy9zdG9wcGluZyB0aW1lcgorc3RydWN0IE9mZmxvYWRUaW1lciB7CisgICAgT2ZmbG9hZFRpbWVyKE9mZmxvYWRIb3N0VGltZXJEYXRhICpkYXRhLCBPZmZsb2FkSG9zdFBoYXNlIHBoYXNlKSA6CisgICAgICAgIG1fZGF0YShkYXRhKSwKKyAgICAgICAgbV9waGFzZShwaGFzZSkKKyAgICB7CisgICAgICAgIE9GRkxPQURfVElNRVJfU1RBUlQobV9kYXRhLCBtX3BoYXNlKTsKKyAgICB9CisKKyAgICB+T2ZmbG9hZFRpbWVyKCkKKyAgICB7CisgICAgICAgIE9GRkxPQURfVElNRVJfU1RPUChtX2RhdGEsIG1fcGhhc2UpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBPZmZsb2FkSG9zdFRpbWVyRGF0YSogICBtX2RhdGE7CisgICAgT2ZmbG9hZEhvc3RQaGFzZSAgICAgICAgbV9waGFzZTsKK307CisKKyNlbHNlCisKKyNkZWZpbmUgT0ZGTE9BRF9USU1FUl9EQVRBTEVOKCkgXAorICAgICgodGltZXJfZW5hYmxlZCkgPyBcCisgICAgICgoMSArIGNfb2ZmbG9hZF90YXJnZXRfbWF4X3BoYXNlKSAqIHNpemVvZih1aW50NjRfdCkpIDogMCkKKworI2RlZmluZSBPRkZMT0FEX1RJTUVSX1NUQVJUKHBub2RlKSBcCisgICAgaWYgKHRpbWVyX2VuYWJsZWQpIG9mZmxvYWRfdGltZXJfc3RhcnQocG5vZGUpOworCisjZGVmaW5lIE9GRkxPQURfVElNRVJfU1RPUChwbm9kZSkgXAorICAgIGlmICh0aW1lcl9lbmFibGVkKSBvZmZsb2FkX3RpbWVyX3N0b3AocG5vZGUpOworCisjZGVmaW5lIE9GRkxPQURfVElNRVJfSU5JVCgpIFwKKyAgICBpZiAodGltZXJfZW5hYmxlZCkgb2ZmbG9hZF90aW1lcl9pbml0KCk7CisKKyNkZWZpbmUgT0ZGTE9BRF9USU1FUl9UQVJHRVRfREFUQShkYXRhKSBcCisgICAgaWYgKHRpbWVyX2VuYWJsZWQpIG9mZmxvYWRfdGltZXJfZmlsbF90YXJnZXRfZGF0YShkYXRhKTsKKworZXh0ZXJuIHZvaWQgb2ZmbG9hZF90aW1lcl9zdGFydChPZmZsb2FkVGFyZ2V0UGhhc2UgdF9ub2RlKTsKK2V4dGVybiB2b2lkIG9mZmxvYWRfdGltZXJfc3RvcChPZmZsb2FkVGFyZ2V0UGhhc2UgdF9ub2RlKTsKK2V4dGVybiB2b2lkIG9mZmxvYWRfdGltZXJfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIG9mZmxvYWRfdGltZXJfZmlsbF90YXJnZXRfZGF0YSh2b2lkICpkYXRhKTsKKworI2VuZGlmIC8vIEhPU1RfTElCUkFSWQorCisjZWxzZSAvLyBUSU1JTkdfU1VQUE9SVAorCisjZGVmaW5lIE9GRkxPQURfVElNRVJfU1RBUlQoLi4uKQorI2RlZmluZSBPRkZMT0FEX1RJTUVSX1NUT1AoLi4uKQorI2RlZmluZSBPRkZMT0FEX1RJTUVSX0lOSVQoLi4uKQorI2RlZmluZSBPRkZMT0FEX1RJTUVSX1RBUkdFVF9EQVRBKC4uLikKKyNkZWZpbmUgT0ZGTE9BRF9USU1FUl9EQVRBTEVOKC4uLikgICAgICAoMCkKKworI2VuZGlmIC8vIFRJTUlOR19TVVBQT1JUCisKKyNlbmRpZiAvLyBPRkZMT0FEX1RJTUVSX0hfSU5DTFVERUQKZGlmZiAtLWdpdCBhL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfdGltZXJfaG9zdC5jcHAgYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX3RpbWVyX2hvc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiMjdkYjAKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX3RpbWVyX2hvc3QuY3BwCkBAIC0wLDAgKzEsMzU5IEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJvZmZsb2FkX3RpbWVyLmgiCisKKyNpZmRlZiBfX0lOVEVMX0NPTVBJTEVSCisjaW5jbHVkZSA8aWEzMmludHJpbi5oPgorI2Vsc2UgLy8gX19JTlRFTF9DT01QSUxFUgorI2luY2x1ZGUgPHg4NmludHJpbi5oPgorI2VuZGlmIC8vIF9fSU5URUxfQ09NUElMRVIKKworI2luY2x1ZGUgIm9mZmxvYWRfaG9zdC5oIgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8aW9tYW5pcD4KKworaW50IHRpbWVyX2VuYWJsZWQgPSAwOworCisjaWZkZWYgVElNSU5HX1NVUFBPUlQKKworaW50IG9mZmxvYWRfcmVwb3J0X2xldmVsID0gMDsKK2ludCBvZmZsb2FkX3JlcG9ydF9lbmFibGVkID0gMTsKKworc3RhdGljIGNvbnN0IGludCBob3N0X3RpbWVyX3ByZWZpeF9zcGFjZXNbXSA9IHsKKyAgICAvKmNfb2ZmbG9hZF9ob3N0X3NldHVwX2J1ZmZlcnMqLyAgICAgICAgIDAsCisgICAgLypjX29mZmxvYWRfaG9zdF9pbml0aWFsaXplKi8gICAgICAgICAgICAyLAorICAgIC8qY19vZmZsb2FkX2hvc3RfdGFyZ2V0X2FjcXVpcmUqLyAgICAgICAgMiwKKyAgICAvKmNfb2ZmbG9hZF9ob3N0X3dhaXRfZGVwcyovICAgICAgICAgICAgIDIsCisgICAgLypjX29mZmxvYWRfaG9zdF9zZXR1cF9idWZmZXJzKi8gICAgICAgICAyLAorICAgIC8qY19vZmZsb2FkX2hvc3RfYWxsb2NfYnVmZmVycyovICAgICAgICAgNCwKKyAgICAvKmNfb2ZmbG9hZF9ob3N0X3NldHVwX21pc2NfZGF0YSovICAgICAgIDIsCisgICAgLypjX29mZmxvYWRfaG9zdF9hbGxvY19kYXRhX2J1ZmZlciovICAgICA0LAorICAgIC8qY19vZmZsb2FkX2hvc3Rfc2VuZF9wb2ludGVycyovICAgICAgICAgMiwKKyAgICAvKmNfb2ZmbG9hZF9ob3N0X2dhdGhlcl9pbnB1dHMqLyAgICAgICAgIDIsCisgICAgLypjX29mZmxvYWRfaG9zdF9tYXBfaW5fZGF0YV9idWZmZXIqLyAgICA0LAorICAgIC8qY19vZmZsb2FkX2hvc3RfdW5tYXBfaW5fZGF0YV9idWZmZXIqLyAgNCwKKyAgICAvKmNfb2ZmbG9hZF9ob3N0X3N0YXJ0X2NvbXB1dGUqLyAgICAgICAgIDIsCisgICAgLypjX29mZmxvYWRfaG9zdF93YWl0X2NvbXB1dGUqLyAgICAgICAgICAyLAorICAgIC8qY19vZmZsb2FkX2hvc3Rfc3RhcnRfYnVmZmVyc19yZWFkcyovICAgMiwKKyAgICAvKmNfb2ZmbG9hZF9ob3N0X3NjYXR0ZXJfb3V0cHV0cyovICAgICAgIDIsCisgICAgLypjX29mZmxvYWRfaG9zdF9tYXBfb3V0X2RhdGFfYnVmZmVyKi8gICA0LAorICAgIC8qY19vZmZsb2FkX2hvc3RfdW5tYXBfb3V0X2RhdGFfYnVmZmVyKi8gNCwKKyAgICAvKmNfb2ZmbG9hZF9ob3N0X3dhaXRfYnVmZmVyc19yZWFkcyovICAgIDIsCisgICAgLypjX29mZmxvYWRfaG9zdF9kZXN0cm95X2J1ZmZlcnMqLyAgICAgICAyCit9OworCitjb25zdCBzdGF0aWMgaW50IHRhcmdldF90aW1lcl9wcmVmaXhfc3BhY2VzW10gPSB7CisvKmNfb2ZmbG9hZF90YXJnZXRfdG90YWxfdGltZSovICAgICAgICAgIDAsCisvKmNfb2ZmbG9hZF90YXJnZXRfZGVzY3JpcHRvcl9zZXR1cCovICAgIDIsCisvKmNfb2ZmbG9hZF90YXJnZXRfZnVuY19sb29rdXAqLyAgICAgICAgIDIsCisvKmNfb2ZmbG9hZF90YXJnZXRfZnVuY190aW1lKi8gICAgICAgICAgIDIsCisvKmNfb2ZmbG9hZF90YXJnZXRfc2NhdHRlcl9pbnB1dHMqLyAgICAgIDQsCisvKmNfb2ZmbG9hZF90YXJnZXRfYWRkX2J1ZmZlcl9yZWZzKi8gICAgIDYsCisvKmNfb2ZmbG9hZF90YXJnZXRfY29tcHV0ZSovICAgICAgICAgICAgIDQsCisvKmNfb2ZmbG9hZF90YXJnZXRfZ2F0aGVyX291dHB1dHMqLyAgICAgIDQsCisvKmNfb2ZmbG9hZF90YXJnZXRfcmVsZWFzZV9idWZmZXJfcmVmcyovIDYKK307CisKK3N0YXRpYyBPZmZsb2FkSG9zdFRpbWVyRGF0YSogdGltZXJfZGF0YV9oZWFkOworc3RhdGljIE9mZmxvYWRIb3N0VGltZXJEYXRhKiB0aW1lcl9kYXRhX3RhaWw7CitzdGF0aWMgbXV0ZXhfdCAgICAgICAgICAgICAgIHRpbWVyX2RhdGFfbXV0ZXg7CisKK3N0YXRpYyB2b2lkIG9mZmxvYWRfaG9zdF9waGFzZV9uYW1lKHN0ZDo6c3RyaW5nc3RyZWFtICZzcywgaW50IHBfbm9kZSk7CitzdGF0aWMgdm9pZCBvZmZsb2FkX3RhcmdldF9waGFzZV9uYW1lKHN0ZDo6c3RyaW5nc3RyZWFtICZzcywgaW50IHBfbm9kZSk7CisKK2V4dGVybiB2b2lkIE9mZmxvYWRfVGltZXJfUHJpbnQodm9pZCkKK3sKKyAgICBzdGQ6OnN0cmluZyAgICAgICBidWY7CisgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgICAgY29uc3QgY2hhciAqc3RhcnMgPQorICAgICAgICAiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiOworCisgICAgc3MgPDwgIlxuXG4iIDw8IHN0YXJzIDw8ICJcbiI7CisgICAgc3MgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjsKKyAgICBzcyA8PCByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3RpdGxlKSA8PCAiXG4iOworICAgIHNzIDw8IHN0YXJzIDw8ICJcbiI7CisgICAgZG91YmxlIGZyZXF1ZW5jeSA9IGNwdV9mcmVxdWVuY3k7CisKKyAgICBmb3IgKE9mZmxvYWRIb3N0VGltZXJEYXRhICpwbm9kZSA9IHRpbWVyX2RhdGFfaGVhZDsKKyAgICAgICAgIHBub2RlICE9IDA7IHBub2RlID0gcG5vZGUtPm5leHQpIHsKKyAgICAgICAgc3MgPDwgIiAgICAgICI7CisgICAgICAgIHNzIDw8IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfZnJvbV9maWxlKSA8PCAiICI8PCBwbm9kZS0+ZmlsZTsKKyAgICAgICAgc3MgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9saW5lKSA8PCAiICIgPDwgcG5vZGUtPmxpbmU7CisgICAgICAgIHNzIDw8ICJcbiI7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY19vZmZsb2FkX2hvc3RfbWF4X3BoYXNlIDsgaSsrKSB7CisgICAgICAgICAgICBzcyA8PCAiICAgICAgICAgICI7CisgICAgICAgICAgICBvZmZsb2FkX2hvc3RfcGhhc2VfbmFtZShzcywgaSk7CisgICAgICAgICAgICBzcyA8PCAiICAgIiA8PCBzdGQ6OmZpeGVkIDw8IHN0ZDo6c2V0cHJlY2lzaW9uKDUpOworICAgICAgICAgICAgc3MgPDwgKGRvdWJsZSlwbm9kZS0+cGhhc2VzW2ldLnRvdGFsIC8gZnJlcXVlbmN5IDw8ICJcbiI7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNfb2ZmbG9hZF90YXJnZXRfbWF4X3BoYXNlIDsgaSsrKSB7CisgICAgICAgICAgICBkb3VibGUgdGltZSA9IDA7CisgICAgICAgICAgICBpZiAocG5vZGUtPnRhcmdldC5mcmVxdWVuY3kgIT0gMCkgeworICAgICAgICAgICAgICAgIHRpbWUgPSAoZG91YmxlKSBwbm9kZS0+dGFyZ2V0LnBoYXNlc1tpXS50b3RhbCAvCisgICAgICAgICAgICAgICAgICAgICAgIChkb3VibGUpIHBub2RlLT50YXJnZXQuZnJlcXVlbmN5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3MgPDwgIiAgICAgICAgICAiOworICAgICAgICAgICAgb2ZmbG9hZF90YXJnZXRfcGhhc2VfbmFtZShzcywgaSk7CisgICAgICAgICAgICBzcyA8PCAiICAgIiA8PCBzdGQ6OmZpeGVkIDw8IHN0ZDo6c2V0cHJlY2lzaW9uKDUpOworICAgICAgICAgICAgc3MgPDwgdGltZSA8PCAiXG4iOworICAgICAgICB9CisgICAgfQorCisgICAgYnVmID0gc3Muc3RyKCk7CisgICAgZnByaW50ZihzdGRvdXQsIGJ1Zi5kYXRhKCkpOworICAgIGZmbHVzaChzdGRvdXQpOworfQorCitleHRlcm4gdm9pZCBPZmZsb2FkX1JlcG9ydF9Qcm9sb2coT2ZmbG9hZEhvc3RUaW1lckRhdGEgKnBub2RlKQoreworICAgIGRvdWJsZSBmcmVxdWVuY3kgPSBjcHVfZnJlcXVlbmN5OworICAgIHN0ZDo6c3RyaW5nICAgICAgIGJ1ZjsKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKworICAgIGlmIChwbm9kZSkgeworICAgICAgICAvLyBbT2ZmbG9hZF0gW01pYyAwXSBbRmlsZV0gICAgICAgICAgZmlsZS5jCisgICAgICAgIHNzIDw8ICJbIiA8PCByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X29mZmxvYWQpIDw8ICJdIFsiOworICAgICAgICBzcyA8PCByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X21pYykgPDwgIiAiOworICAgICAgICBzcyA8PCBwbm9kZS0+Y2FyZF9udW1iZXIgPDwgIl0gWyI7CisgICAgICAgIHNzIDw8IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfZmlsZSk7CisgICAgICAgIHNzIDw8ICJdICAgICAgICAgICAgICAgICAgICAiIDw8IHBub2RlLT5maWxlIDw8ICJcbiI7CisKKyAgICAgICAgLy8gW09mZmxvYWRdIFtNaWMgMF0gW0xpbmVdICAgICAgICAgIDEyMzQKKyAgICAgICAgc3MgPDwgIlsiIDw8IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfb2ZmbG9hZCkgPDwgIl0gWyI7CisgICAgICAgIHNzIDw8IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfbWljKSA8PCAiICI7CisgICAgICAgIHNzIDw8IHBub2RlLT5jYXJkX251bWJlciA8PCAiXSBbIjsKKyAgICAgICAgc3MgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9saW5lKTsKKyAgICAgICAgc3MgPDwgIl0gICAgICAgICAgICAgICAgICAgICIgPDwgcG5vZGUtPmxpbmUgPDwgIlxuIjsKKworICAgICAgICAvLyBbT2ZmbG9hZF0gW01pYyAwXSBbVGFnXSAgICAgICAgICBUYWcgMQorICAgICAgICBzcyA8PCAiWyIgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9vZmZsb2FkKSA8PCAiXSBbIjsKKyAgICAgICAgc3MgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9taWMpIDw8ICIgIjsKKyAgICAgICAgc3MgPDwgcG5vZGUtPmNhcmRfbnVtYmVyIDw8ICJdIFsiOworICAgICAgICBzcyA8PCByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3RhZyk7CisgICAgICAgIHNzIDw8ICJdICAgICAgICAgICAgICAgICAgICAgIiA8PCByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3RhZyk7CisgICAgICAgIHNzIDw8ICIgIiA8PCBwbm9kZS0+b2ZmbG9hZF9udW1iZXIgPDwgIlxuIjsKKworICAgICAgICBidWYgPSBzcy5zdHIoKTsKKyAgICAgICAgZnByaW50ZihzdGRvdXQsIGJ1Zi5kYXRhKCkpOworICAgICAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICB9Cit9CisKK2V4dGVybiB2b2lkIE9mZmxvYWRfUmVwb3J0X0VwaWxvZyhPZmZsb2FkSG9zdFRpbWVyRGF0YSAqIHRpbWVyX2RhdGEpCit7CisgICAgZG91YmxlIGZyZXF1ZW5jeSA9IGNwdV9mcmVxdWVuY3k7CisgICAgc3RkOjpzdHJpbmcgICAgICAgYnVmOworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworCisgICAgT2ZmbG9hZEhvc3RUaW1lckRhdGEgKnBub2RlID0gdGltZXJfZGF0YTsKKworICAgIGlmICghcG5vZGUpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzcyA8PCAiWyIgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9vZmZsb2FkKSA8PCAiXSBbIjsKKyAgICBzcyA8PCByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X2hvc3QpIDw8ICJdICBbIjsKKyAgICBzcyA8PCByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3RhZykgPDwgICIgIjsKKyAgICBzcyA8PCBwbm9kZS0+b2ZmbG9hZF9udW1iZXIgPDwgIl0gWyI7CisgICAgc3MgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9jcHVfdGltZSkgPDwgIl0gICAgICAgICI7CisgICAgc3MgPDwgc3RkOjpmaXhlZCA8PCBzdGQ6OnNldHByZWNpc2lvbig2KTsKKyAgICBzcyA8PCAoZG91YmxlKSBwbm9kZS0+cGhhc2VzWzBdLnRvdGFsIC8gZnJlcXVlbmN5OworICAgIHNzIDw8IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfc2Vjb25kcykgPDwgIlxuIjsKKworICAgIGlmIChvZmZsb2FkX3JlcG9ydF9sZXZlbCA+PSBPRkZMT0FEX1JFUE9SVF8yKSB7CisgICAgICAgIHNzIDw8ICJbIiA8PCByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X29mZmxvYWQpIDw8ICJdIFsiOworICAgICAgICBzcyA8PCByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X21pYyk7CisgICAgICAgIHNzIDw8ICIgIiA8PCBwbm9kZS0+Y2FyZF9udW1iZXI7CisgICAgICAgIHNzIDw8ICJdIFsiIDw8IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfdGFnKSA8PCAiICI7CisgICAgICAgIHNzIDw8ICBwbm9kZS0+b2ZmbG9hZF9udW1iZXIgPDwgIl0gWyI7CisgICAgICAgIHNzIDw8IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfY3B1X3RvX21pY19kYXRhKSA8PCAiXSAgICI7CisgICAgICAgIHNzIDw8IHBub2RlLT5zZW50X2J5dGVzIDw8ICIgIjsKKyAgICAgICAgc3MgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9ieXRlcykgPDwgIlxuIjsKKyAgICB9CisKKyAgICBkb3VibGUgdGltZSA9IDA7CisgICAgaWYgKHBub2RlLT50YXJnZXQuZnJlcXVlbmN5ICE9IDApIHsKKyAgICAgICAgdGltZSA9IChkb3VibGUpIHBub2RlLT50YXJnZXQucGhhc2VzWzBdLnRvdGFsIC8KKyAgICAgICAgICAgIChkb3VibGUpIHBub2RlLT50YXJnZXQuZnJlcXVlbmN5OworICAgIH0KKyAgICBzcyA8PCAiWyIgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9vZmZsb2FkKSA8PCAiXSBbIjsKKyAgICBzcyA8PCByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X21pYykgPDwgIiAiOworICAgIHNzIDw8IHBub2RlLT5jYXJkX251bWJlcjw8ICJdIFsiOworICAgIHNzIDw8IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfdGFnKSA8PCAgIiAiOworICAgIHNzIDw8IHBub2RlLT5vZmZsb2FkX251bWJlciA8PCAiXSBbIjsKKyAgICBzcyA8PCByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X21pY190aW1lKSA8PCAiXSAgICAgICAgIjsKKyAgICBzcyA8PCBzdGQ6OmZpeGVkIDw8IHN0ZDo6c2V0cHJlY2lzaW9uKDYpIDw8IHRpbWU7CisgICAgc3MgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zZWNvbmRzKSA8PCAiXG4iOworCisgICAgaWYgKG9mZmxvYWRfcmVwb3J0X2xldmVsID49IE9GRkxPQURfUkVQT1JUXzIpIHsKKyAgICAgICAgc3MgPDwgIlsiIDw8IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfb2ZmbG9hZCkgPDwgIl0gWyI7CisgICAgICAgIHNzIDw8IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfbWljKTsKKyAgICAgICAgc3MgPDwgIiAiIDw8IHBub2RlLT5jYXJkX251bWJlcjsKKyAgICAgICAgc3MgPDwgIl0gWyIgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF90YWcpIDw8ICIgIjsKKyAgICAgICAgc3MgPDwgIHBub2RlLT5vZmZsb2FkX251bWJlciA8PCAiXSBbIjsKKyAgICAgICAgc3MgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9taWNfdG9fY3B1X2RhdGEpIDw8ICJdICAgIjsKKyAgICAgICAgc3MgPDwgcG5vZGUtPnJlY2VpdmVkX2J5dGVzIDw8ICIgIjsKKyAgICAgICAgc3MgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9ieXRlcykgPDwgIlxuIjsKKyAgICB9CisgICAgc3MgPDwgIlxuIjsKKworICAgIGJ1ZiA9IHNzLnN0cigpOworICAgIGZwcmludGYoc3Rkb3V0LCBidWYuZGF0YSgpKTsKKyAgICBmZmx1c2goc3Rkb3V0KTsKKworICAgIG9mZmxvYWRfcmVwb3J0X2ZyZWVfZGF0YSh0aW1lcl9kYXRhKTsKK30KKworZXh0ZXJuIHZvaWQgb2ZmbG9hZF9yZXBvcnRfZnJlZV9kYXRhKE9mZmxvYWRIb3N0VGltZXJEYXRhICogdGltZXJfZGF0YSkKK3sKKyAgICBPZmZsb2FkSG9zdFRpbWVyRGF0YSAqcG5vZGVfbGFzdCA9IE5VTEw7CisKKyAgICBmb3IgKE9mZmxvYWRIb3N0VGltZXJEYXRhICpwbm9kZSA9IHRpbWVyX2RhdGFfaGVhZDsKKyAgICAgICAgIHBub2RlICE9IDA7IHBub2RlID0gcG5vZGUtPm5leHQpIHsKKyAgICAgICAgaWYgKHRpbWVyX2RhdGEgPT0gcG5vZGUpIHsKKyAgICAgICAgICAgIGlmIChwbm9kZV9sYXN0KSB7CisgICAgICAgICAgICAgICAgcG5vZGVfbGFzdC0+bmV4dCA9IHBub2RlLT5uZXh0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgdGltZXJfZGF0YV9oZWFkID0gcG5vZGUtPm5leHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBPRkZMT0FEX0ZSRUUocG5vZGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcG5vZGVfbGFzdCA9IHBub2RlOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZmlsbF9idWZfd2l0aF9zcGFjZXMoc3RkOjpzdHJpbmdzdHJlYW0gJnNzLCBpbnQgbnVtKQoreworICAgIGZvciAoOyBudW0gPiAwOyBudW0tLSkgeworICAgICAgICBzcyA8PCAiICI7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBvZmZsb2FkX2hvc3RfcGhhc2VfbmFtZShzdGQ6OnN0cmluZ3N0cmVhbSAmc3MsIGludCBwX25vZGUpCit7CisgICAgaW50IHByZWZpeF9zcGFjZXM7CisgICAgaW50IHN0cl9sZW5ndGg7CisgICAgaW50IHRhaWxfbGVuZ3RoOworICAgIGNvbnN0IGludCBtZXNzYWdlX2xlbmd0aCA9IDQwOworICAgIGNoYXIgY29uc3QgKnN0cjsKKworICAgIHN0ciA9IHJlcG9ydF9nZXRfaG9zdF9zdGFnZV9zdHIocF9ub2RlKTsKKyAgICBwcmVmaXhfc3BhY2VzID0gaG9zdF90aW1lcl9wcmVmaXhfc3BhY2VzW3Bfbm9kZV07CisgICAgZmlsbF9idWZfd2l0aF9zcGFjZXMoc3MsIHByZWZpeF9zcGFjZXMpOworICAgIHN0cl9sZW5ndGggPSBzdHJsZW4oc3RyKTsKKyAgICBzcyA8PCBzdHI7CisgICAgdGFpbF9sZW5ndGggPSBtZXNzYWdlX2xlbmd0aCAtIHByZWZpeF9zcGFjZXMgLSBzdHJfbGVuZ3RoOworICAgIHRhaWxfbGVuZ3RoID0gdGFpbF9sZW5ndGggPiAwPyB0YWlsX2xlbmd0aCA6IDE7CisgICAgZmlsbF9idWZfd2l0aF9zcGFjZXMoc3MsIHRhaWxfbGVuZ3RoKTsKK30KKworc3RhdGljIHZvaWQgb2ZmbG9hZF90YXJnZXRfcGhhc2VfbmFtZShzdGQ6OnN0cmluZ3N0cmVhbSAmc3MsIGludCBwX25vZGUpCit7CisgICAgaW50IHByZWZpeF9zcGFjZXM7CisgICAgaW50IHN0cl9sZW5ndGg7CisgICAgY29uc3QgaW50IG1lc3NhZ2VfbGVuZ3RoID0gNDA7CisgICAgaW50IHRhaWxfbGVuZ3RoOworICAgIGNoYXIgY29uc3QgKnN0cjsKKworICAgIHN0ciA9IHJlcG9ydF9nZXRfdGFyZ2V0X3N0YWdlX3N0cihwX25vZGUpOworICAgIHByZWZpeF9zcGFjZXMgPSB0YXJnZXRfdGltZXJfcHJlZml4X3NwYWNlc1twX25vZGVdOworICAgIGZpbGxfYnVmX3dpdGhfc3BhY2VzKHNzLCBwcmVmaXhfc3BhY2VzKTsKKyAgICBzdHJfbGVuZ3RoID0gc3RybGVuKHN0cik7CisgICAgc3MgPDwgc3RyOworICAgIHRhaWxfbGVuZ3RoID0gbWVzc2FnZV9sZW5ndGggLSBwcmVmaXhfc3BhY2VzIC0gc3RyX2xlbmd0aDsKKyAgICB0YWlsX2xlbmd0aCA9ICh0YWlsX2xlbmd0aCA+IDApPyB0YWlsX2xlbmd0aCA6IDE7CisgICAgZmlsbF9idWZfd2l0aF9zcGFjZXMoc3MsIHRhaWxfbGVuZ3RoKTsKK30KKwordm9pZCBvZmZsb2FkX3RpbWVyX3N0YXJ0KE9mZmxvYWRIb3N0VGltZXJEYXRhICogdGltZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBPZmZsb2FkSG9zdFBoYXNlIHBfdHlwZSkKK3sKKyAgICB0aW1lcl9kYXRhLT5waGFzZXNbcF90eXBlXS5zdGFydCA9IF9yZHRzYygpOworfQorCit2b2lkIG9mZmxvYWRfdGltZXJfc3RvcChPZmZsb2FkSG9zdFRpbWVyRGF0YSAqIHRpbWVyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICBPZmZsb2FkSG9zdFBoYXNlIHBfdHlwZSkKK3sKKyAgICB0aW1lcl9kYXRhLT5waGFzZXNbcF90eXBlXS50b3RhbCArPSBfcmR0c2MoKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXJfZGF0YS0+cGhhc2VzW3BfdHlwZV0uc3RhcnQ7Cit9CisKK3ZvaWQgb2ZmbG9hZF90aW1lcl9maWxsX3RhcmdldF9kYXRhKE9mZmxvYWRIb3N0VGltZXJEYXRhICogdGltZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZikKK3sKKyAgICB1aW50NjRfdCAqZGF0YSA9ICh1aW50NjRfdCopIGJ1ZjsKKworICAgIHRpbWVyX2RhdGEtPnRhcmdldC5mcmVxdWVuY3kgPSAqZGF0YSsrOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY19vZmZsb2FkX3RhcmdldF9tYXhfcGhhc2U7IGkrKykgeworICAgICAgICB0aW1lcl9kYXRhLT50YXJnZXQucGhhc2VzW2ldLnRvdGFsID0gKmRhdGErKzsKKyAgICB9Cit9CisKK3ZvaWQgb2ZmbG9hZF90aW1lcl9maWxsX2hvc3Rfc2RhdGEoT2ZmbG9hZEhvc3RUaW1lckRhdGEgKiB0aW1lcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBzZW50X2J5dGVzKQoreworICAgIGlmICh0aW1lcl9kYXRhKSB7CisgICAgICAgIHRpbWVyX2RhdGEtPnNlbnRfYnl0ZXMgKz0gc2VudF9ieXRlczsKKyAgICB9Cit9CisKK3ZvaWQgb2ZmbG9hZF90aW1lcl9maWxsX2hvc3RfcmRhdGEoT2ZmbG9hZEhvc3RUaW1lckRhdGEgKiB0aW1lcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCByZWNlaXZlZF9ieXRlcykKK3sKKyAgICBpZiAodGltZXJfZGF0YSkgeworICAgICAgICB0aW1lcl9kYXRhLT5yZWNlaXZlZF9ieXRlcyArPSByZWNlaXZlZF9ieXRlczsKKyAgICB9Cit9CisKK3ZvaWQgb2ZmbG9hZF90aW1lcl9maWxsX2hvc3RfbWljX251bShPZmZsb2FkSG9zdFRpbWVyRGF0YSAqIHRpbWVyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNhcmRfbnVtYmVyKQoreworICAgIGlmICh0aW1lcl9kYXRhKSB7CisgICAgICAgIHRpbWVyX2RhdGEtPmNhcmRfbnVtYmVyID0gY2FyZF9udW1iZXI7CisgICAgfQorfQorCitPZmZsb2FkSG9zdFRpbWVyRGF0YSogb2ZmbG9hZF90aW1lcl9pbml0KGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lKQoreworICAgIHN0YXRpYyBib29sIGZpcnN0X3RpbWUgPSB0cnVlOworICAgIE9mZmxvYWRIb3N0VGltZXJEYXRhKiB0aW1lcl9kYXRhID0gTlVMTDsKKworICAgIHRpbWVyX2RhdGFfbXV0ZXgubG9jaygpOworICAgIHsKKyAgICAgICAgaWYgKHRpbWVyX2VuYWJsZWQgfHwKKyAgICAgICAgICAgIChvZmZsb2FkX3JlcG9ydF9sZXZlbCAmJiBvZmZsb2FkX3JlcG9ydF9lbmFibGVkKSkgeworICAgICAgICAgICAgdGltZXJfZGF0YSA9IChPZmZsb2FkSG9zdFRpbWVyRGF0YSopCisgICAgICAgICAgICAgICAgT0ZGTE9BRF9NQUxMT0Moc2l6ZW9mKE9mZmxvYWRIb3N0VGltZXJEYXRhKSwgMCk7CisgICAgICAgICAgICBtZW1zZXQodGltZXJfZGF0YSwgMCwgc2l6ZW9mKE9mZmxvYWRIb3N0VGltZXJEYXRhKSk7CisKKyAgICAgICAgICAgIHRpbWVyX2RhdGEtPm9mZmxvYWRfbnVtYmVyID0gT0ZGTE9BRF9ERUJVR19JTkNSX09GTERfTlVNKCkgLSAxOworCisgICAgICAgICAgICBpZiAodGltZXJfZGF0YV9oZWFkID09IDApIHsKKyAgICAgICAgICAgICAgICB0aW1lcl9kYXRhX2hlYWQgPSB0aW1lcl9kYXRhOworICAgICAgICAgICAgICAgIHRpbWVyX2RhdGFfdGFpbCA9IHRpbWVyX2RhdGE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aW1lcl9kYXRhX3RhaWwtPm5leHQgPSB0aW1lcl9kYXRhOworICAgICAgICAgICAgICAgIHRpbWVyX2RhdGFfdGFpbCA9IHRpbWVyX2RhdGE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRpbWVyX2RhdGEtPmZpbGUgPSBmaWxlOworICAgICAgICAgICAgdGltZXJfZGF0YS0+bGluZSA9IGxpbmU7CisgICAgICAgIH0KKyAgICB9CisgICAgdGltZXJfZGF0YV9tdXRleC51bmxvY2soKTsKKyAgICByZXR1cm4gdGltZXJfZGF0YTsKK30KKworI2VuZGlmIC8vIFRJTUlOR19TVVBQT1JUCmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX3RpbWVyX3RhcmdldC5jcHAgYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX3RpbWVyX3RhcmdldC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBhNGM5MQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfdGltZXJfdGFyZ2V0LmNwcApAQCAtMCwwICsxLDY3IEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJvZmZsb2FkX3RpbWVyLmgiCisjaW5jbHVkZSAib2ZmbG9hZF90YXJnZXQuaCIKKworI2lmZGVmIF9fSU5URUxfQ09NUElMRVIKKyNpbmNsdWRlIDxpYTMyaW50cmluLmg+CisjZWxzZSAvLyBfX0lOVEVMX0NPTVBJTEVSCisjaW5jbHVkZSA8eDg2aW50cmluLmg+CisjZW5kaWYgLy8gX19JTlRFTF9DT01QSUxFUgorCisKKworaW50IHRpbWVyX2VuYWJsZWQgPSAwOworCisjaWZkZWYgVElNSU5HX1NVUFBPUlQKKworI2lmIGRlZmluZWQoTElOVVgpIHx8IGRlZmluZWQoRlJFRUJTRCkKK3N0YXRpYyBfX3RocmVhZCBPZmZsb2FkVGFyZ2V0VGltZXJEYXRhIHRpbWVyX2RhdGE7CisjZWxzZSAvLyBXSU5OVAorc3RhdGljIF9fZGVjbHNwZWModGhyZWFkKSBPZmZsb2FkVGFyZ2V0VGltZXJEYXRhIHRpbWVyX2RhdGE7CisjZW5kaWYgLy8gZGVmaW5lZChMSU5VWCkgfHwgZGVmaW5lZChGUkVFQlNEKQorCisKK3ZvaWQgb2ZmbG9hZF90aW1lcl9zdGFydCgKKyAgICBPZmZsb2FkVGFyZ2V0UGhhc2UgcF90eXBlCispCit7CisgICAgdGltZXJfZGF0YS5waGFzZXNbcF90eXBlXS5zdGFydCA9IF9yZHRzYygpOworfQorCit2b2lkIG9mZmxvYWRfdGltZXJfc3RvcCgKKyAgICBPZmZsb2FkVGFyZ2V0UGhhc2UgcF90eXBlCispCit7CisgICAgdGltZXJfZGF0YS5waGFzZXNbcF90eXBlXS50b3RhbCArPSBfcmR0c2MoKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lcl9kYXRhLnBoYXNlc1twX3R5cGVdLnN0YXJ0OworfQorCit2b2lkIG9mZmxvYWRfdGltZXJfaW5pdCgpCit7CisgICAgbWVtc2V0KCZ0aW1lcl9kYXRhLCAwLCBzaXplb2YoT2ZmbG9hZFRhcmdldFRpbWVyRGF0YSkpOworfQorCit2b2lkIG9mZmxvYWRfdGltZXJfZmlsbF90YXJnZXRfZGF0YSgKKyAgICB2b2lkICpidWYKKykKK3sKKyAgICB1aW50NjRfdCAqZGF0YSA9ICh1aW50NjRfdCopIGJ1ZjsKKworICAgIHRpbWVyX2RhdGEuZnJlcXVlbmN5ID0gbWljX2ZyZXF1ZW5jeTsKKyAgICBtZW1jcHkoZGF0YSsrLCAmKHRpbWVyX2RhdGEuZnJlcXVlbmN5KSwgc2l6ZW9mKHVpbnQ2NF90KSk7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNfb2ZmbG9hZF90YXJnZXRfbWF4X3BoYXNlOyBpKyspIHsKKyAgICAgICAgbWVtY3B5KGRhdGErKywgJih0aW1lcl9kYXRhLnBoYXNlc1tpXS50b3RhbCksIHNpemVvZih1aW50NjRfdCkpOworICAgIH0KK30KKworI2VuZGlmIC8vIFRJTUlOR19TVVBQT1JUCmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX3RyYWNlLmNwcCBiL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfdHJhY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhMDYyMDQKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX3RyYWNlLmNwcApAQCAtMCwwICsxLDMwOSBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAib2ZmbG9hZF90cmFjZS5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlICJsaWJvZmZsb2FkX2Vycm9yX2NvZGVzLmgiCisKK2V4dGVybiBjb25zdCBjaGFyICpwcmVmaXg7CisKKyNpZiAhSE9TVF9MSUJSQVJZCitleHRlcm4gaW50IG1pY19pbmRleDsKKyNlbmRpZgorCisvLyBUaGUgZGVidWcgcm91dGluZXMKKworc3RhdGljIGNvbnN0IGNoYXIgKiBvZmZsb2FkX3N0YWdlKHN0ZDo6c3RyaW5nc3RyZWFtICZzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2ZmbG9hZF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwcmludF90YWcpCit7CisgICAgc3MgPDwgIlsiIDw8IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfb2ZmbG9hZCkgPDwgIl0iOworI2lmIEhPU1RfTElCUkFSWQorICAgIHNzIDw8ICIgWyIgPDwgcHJlZml4IDw8ICJdIjsKKyAgICBpZiAocHJpbnRfdGFnKSB7CisgICAgICAgIHNzIDw8ICIgIFsiIDw8IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfdGFnKTsKKyAgICAgICAgc3MgPDwgIiAiIDw8IG9mZmxvYWRfbnVtYmVyIDw8ICJdIjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHNzIDw8ICIgICAgICAgICAiOworICAgIH0KKyAgICBzcyA8PCAiIFsiIDw8IHRhZyA8PCAiXSI7CisgICAgc3MgPDwgIiAgICAgICAgICAgIiA8PCB0ZXh0OworI2Vsc2UKKyAgICBzcyA8PCAiIFsiIDw8IHByZWZpeCA8PCAiICIgPDwgbWljX2luZGV4IDw8ICJdIjsKKyAgICBpZiAocHJpbnRfdGFnKSB7CisgICAgICAgIHNzIDw8ICIgWyIgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF90YWcpOworICAgICAgICBzcyA8PCAiICIgPDwgb2ZmbG9hZF9udW1iZXIgPDwgIl0iOworICAgIH0KKyAgICBzcyA8PCAiIFsiIDw8IHRhZyA8PCAiXSI7CisgICAgc3MgPDwgIiAgICAgICAgICAgIiA8PCB0ZXh0OworI2VuZGlmCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICogb2ZmbG9hZF9zaWduYWwoc3RkOjpzdHJpbmdzdHJlYW0gJnNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZsb2FkX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp0YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdGV4dCkKK3sKKyAgICBzcyA8PCAiWyIgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9vZmZsb2FkKSA8PCAiXSI7CisgICAgc3MgPDwgIiBbIiA8PCBwcmVmaXggPDwgIl0iOworICAgIHNzIDw8ICIgIFsiIDw8IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfdGFnKTsKKyAgICBzcyA8PCAiICIgPDwgb2ZmbG9hZF9udW1iZXIgPDwgIl0iOworICAgIHNzIDw8ICIgWyIgPDwgdGFnIDw8ICJdIjsKKyAgICBzcyA8PCAiICAgICAgICAgICIgPDwgdGV4dDsKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBvZmZsb2FkX3N0YWdlX3ByaW50KGludCBzdGFnZSwgaW50IG9mZmxvYWRfbnVtYmVyLCAuLi4pCit7CisgICAgc3RkOjpzdHJpbmcgYnVmOworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICAgIGNoYXIgY29uc3QgKnN0cjE7CisgICAgY2hhciBjb25zdCAqc3RyMjsKKyAgICB2YV9saXN0IHZhX2FyZ3M7CisgICAgdmFfc3RhcnQodmFfYXJncywgb2ZmbG9hZF9udW1iZXIpOworICAgIHZhX2FyZyh2YV9hcmdzLCBjaGFyKik7CisKKyAgICBzd2l0Y2ggKHN0YWdlKSB7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX3N0YXJ0OgorICAgICAgICAgICAgc3RyMSA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfc3RhdGUpOworICAgICAgICAgICAgc3RyMiA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfc3RhcnQpOworICAgICAgICAgICAgb2ZmbG9hZF9zdGFnZShzcywgb2ZmbG9hZF9udW1iZXIsIHN0cjEsIHN0cjIsIHRydWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX2luaXQ6CisgICAgICAgICAgICBzdHIxID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zdGF0ZSk7CisgICAgICAgICAgICBzdHIyID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9pbml0KTsKKyAgICAgICAgICAgIG9mZmxvYWRfc3RhZ2Uoc3MsIG9mZmxvYWRfbnVtYmVyLCBzdHIxLCBzdHIyLCBmYWxzZSk7CisgICAgICAgICAgICBzcyA8PCAiICIgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9sb2dpY2FsX2NhcmQpOworICAgICAgICAgICAgc3MgPDwgIiAiIDw8IHZhX2FyZyh2YV9hcmdzLCBpbnQpOworICAgICAgICAgICAgc3MgPDwgIiA9ICIgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9waHlzaWNhbF9jYXJkKTsKKyAgICAgICAgICAgIHNzIDw8ICIgIiA8PCB2YV9hcmcodmFfYXJncywgaW50KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9yZWdpc3RlcjoKKyAgICAgICAgICAgIHN0cjEgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3N0YXRlKTsKKyAgICAgICAgICAgIHN0cjIgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3JlZ2lzdGVyKTsKKyAgICAgICAgICAgIG9mZmxvYWRfc3RhZ2Uoc3MsIG9mZmxvYWRfbnVtYmVyLCBzdHIxLCBzdHIyLCB0cnVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9pbml0X2Z1bmM6CisgICAgICAgICAgICBzdHIxID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zdGF0ZSk7CisgICAgICAgICAgICBzdHIyID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9pbml0X2Z1bmMpOworICAgICAgICAgICAgb2ZmbG9hZF9zdGFnZShzcywgb2ZmbG9hZF9udW1iZXIsIHN0cjEsIHN0cjIsIHRydWUpOworICAgICAgICAgICAgc3MgPDwgIjogIiA8PCB2YV9hcmcodmFfYXJncywgY2hhciopOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX2NyZWF0ZV9idWZfaG9zdDoKKyAgICAgICAgICAgIHN0cjEgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3N0YXRlKTsKKyAgICAgICAgICAgIHN0cjIgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X2NyZWF0ZV9idWZfaG9zdCk7CisgICAgICAgICAgICBvZmZsb2FkX3N0YWdlKHNzLCBvZmZsb2FkX251bWJlciwgc3RyMSwgc3RyMiwgdHJ1ZSk7CisgICAgICAgICAgICBzcyA8PCAiOiBiYXNlPTB4IiA8PCBzdGQ6OmhleCA8PCB2YV9hcmcodmFfYXJncywgdWludDY0X3QpOworICAgICAgICAgICAgc3MgPDwgIiBsZW5ndGg9IiA8PCBzdGQ6OmRlYyA8PCB2YV9hcmcodmFfYXJncywgdWludDY0X3QpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX2NyZWF0ZV9idWZfbWljOgorICAgICAgICAgICAgc3RyMSA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfc3RhdGUpOworICAgICAgICAgICAgc3RyMiA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfY3JlYXRlX2J1Zl9taWMpOworICAgICAgICAgICAgb2ZmbG9hZF9zdGFnZShzcywgb2ZmbG9hZF9udW1iZXIsIHN0cjEsIHN0cjIsIHRydWUpOworICAgICAgICAgICAgc3MgPDwgIjogc2l6ZT0iIDw8IHZhX2FyZyh2YV9hcmdzLCB1aW50NjRfdCk7CisgICAgICAgICAgICBzcyA8PCAiIG9mZnNldD0iIDw8IHZhX2FyZyh2YV9hcmdzLCBpbnQpOworICAgICAgICAgICAgaWYgKHZhX2FyZyh2YV9hcmdzLGludCkpCisgICAgICAgICAgICAgICBzcyA8PCAiICgyTSBwYWdlKSI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfc2VuZF9wb2ludGVyX2RhdGE6CisgICAgICAgICAgICBzdHIxID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zdGF0ZSk7CisgICAgICAgICAgICBzdHIyID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zZW5kX3BvaW50ZXJfZGF0YSk7CisgICAgICAgICAgICBvZmZsb2FkX3N0YWdlKHNzLCBvZmZsb2FkX251bWJlciwgc3RyMSwgc3RyMiwgdHJ1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfc2VudF9wb2ludGVyX2RhdGE6CisgICAgICAgICAgICBzdHIxID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zdGF0ZSk7CisgICAgICAgICAgICBzdHIyID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zZW50X3BvaW50ZXJfZGF0YSk7CisgICAgICAgICAgICBvZmZsb2FkX3N0YWdlKHNzLCBvZmZsb2FkX251bWJlciwgc3RyMSwgc3RyMiwgdHJ1ZSk7CisgICAgICAgICAgICBzcyA8PCAiICIgPDwgdmFfYXJnKHZhX2FyZ3MsIHVpbnQ2NF90KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9nYXRoZXJfY29weWluX2RhdGE6CisgICAgICAgICAgICBzdHIxID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zdGF0ZSk7CisgICAgICAgICAgICBzdHIyID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9nYXRoZXJfY29weWluX2RhdGEpOworICAgICAgICAgICAgb2ZmbG9hZF9zdGFnZShzcywgb2ZmbG9hZF9udW1iZXIsIHN0cjEsIHN0cjIsIHRydWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX2NvcHlpbl9kYXRhOgorICAgICAgICAgICAgc3RyMSA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfc3RhdGUpOworICAgICAgICAgICAgc3RyMiA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfY29weWluX2RhdGEpOworICAgICAgICAgICAgb2ZmbG9hZF9zdGFnZShzcywgb2ZmbG9hZF9udW1iZXIsIHN0cjEsIHN0cjIsIHRydWUpOworICAgICAgICAgICAgc3MgPDwgIiAiIDw8IHZhX2FyZyh2YV9hcmdzLCB1aW50NjRfdCkgPDwgIiAiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX2NvbXB1dGU6CisgICAgICAgICAgICBzdHIxID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zdGF0ZSk7CisgICAgICAgICAgICBzdHIyID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9jb21wdXRlKTsKKyAgICAgICAgICAgIG9mZmxvYWRfc3RhZ2Uoc3MsIG9mZmxvYWRfbnVtYmVyLCBzdHIxLCBzdHIyLCB0cnVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9yZWNlaXZlX3BvaW50ZXJfZGF0YToKKyAgICAgICAgICAgIHN0cjEgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3N0YXRlKTsKKyAgICAgICAgICAgIHN0cjIgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3JlY2VpdmVfcG9pbnRlcl9kYXRhKTsKKyAgICAgICAgICAgIG9mZmxvYWRfc3RhZ2Uoc3MsIG9mZmxvYWRfbnVtYmVyLCBzdHIxLCBzdHIyLCB0cnVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9yZWNlaXZlZF9wb2ludGVyX2RhdGE6CisgICAgICAgICAgICBzdHIxID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zdGF0ZSk7CisgICAgICAgICAgICBzdHIyID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9yZWNlaXZlZF9wb2ludGVyX2RhdGEpOworICAgICAgICAgICAgb2ZmbG9hZF9zdGFnZShzcywgb2ZmbG9hZF9udW1iZXIsIHN0cjEsIHN0cjIsIHRydWUpOworICAgICAgICAgICAgc3MgPDwgIiAiIDw8IHZhX2FyZyh2YV9hcmdzLCB1aW50NjRfdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfc3RhcnRfdGFyZ2V0X2Z1bmM6CisgICAgICAgICAgICBzdHIxID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zdGF0ZSk7CisgICAgICAgICAgICBzdHIyID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zdGFydF90YXJnZXRfZnVuYyk7CisgICAgICAgICAgICBvZmZsb2FkX3N0YWdlKHNzLCBvZmZsb2FkX251bWJlciwgc3RyMSwgc3RyMiwgdHJ1ZSk7CisgICAgICAgICAgICBzcyA8PCAiOiAiIDw8IHZhX2FyZyh2YV9hcmdzLCBjaGFyKik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfdmFyOgorICAgICAgICAgICAgc3RyMSA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfdmFyKTsKKyAgICAgICAgICAgIG9mZmxvYWRfc3RhZ2Uoc3MsIG9mZmxvYWRfbnVtYmVyLCBzdHIxLCAiICAiLCB0cnVlKTsKKyAgICAgICAgICAgIHZhX2FyZyh2YV9hcmdzLCBpbnQpOworICAgICAgICAgICAgc3MgPDwgdmFfYXJnKHZhX2FyZ3MsIGNoYXIqKTsKKyAgICAgICAgICAgIHNzIDw8ICIgIiA8PCAiICIgPDwgdmFfYXJnKHZhX2FyZ3MsIGNoYXIqKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9zY2F0dGVyX2NvcHlpbl9kYXRhOgorICAgICAgICAgICAgc3RyMSA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfc3RhdGUpOworICAgICAgICAgICAgc3RyMiA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfc2NhdHRlcl9jb3B5aW5fZGF0YSk7CisgICAgICAgICAgICBvZmZsb2FkX3N0YWdlKHNzLCBvZmZsb2FkX251bWJlciwgc3RyMSwgc3RyMiwgdHJ1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfZ2F0aGVyX2NvcHlvdXRfZGF0YToKKyAgICAgICAgICAgIHN0cjEgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3N0YXRlKTsKKyAgICAgICAgICAgIHN0cjIgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X2dhdGhlcl9jb3B5b3V0X2RhdGEpOworICAgICAgICAgICAgb2ZmbG9hZF9zdGFnZShzcywgb2ZmbG9hZF9udW1iZXIsIHN0cjEsIHN0cjIsIHRydWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX3NjYXR0ZXJfY29weW91dF9kYXRhOgorICAgICAgICAgICAgc3RyMSA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfc3RhdGUpOworICAgICAgICAgICAgc3RyMiA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfc2NhdHRlcl9jb3B5b3V0X2RhdGEpOworICAgICAgICAgICAgb2ZmbG9hZF9zdGFnZShzcywgb2ZmbG9hZF9udW1iZXIsIHN0cjEsIHN0cjIsIHRydWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX2NvcHlvdXRfZGF0YToKKyAgICAgICAgICAgIHN0cjEgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3N0YXRlKTsKKyAgICAgICAgICAgIHN0cjIgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X2NvcHlvdXRfZGF0YSk7CisgICAgICAgICAgICBvZmZsb2FkX3N0YWdlKHNzLCBvZmZsb2FkX251bWJlciwgc3RyMSwgc3RyMiwgdHJ1ZSk7CisgICAgICAgICAgICBzcyA8PCAiICAgIiA8PCB2YV9hcmcodmFfYXJncywgdWludDY0X3QpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX3NpZ25hbDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50NjRfdCAgKnNpZ25hbDsKKyAgICAgICAgICAgICAgICBzdHIxID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zdGF0ZV9zaWduYWwpOworICAgICAgICAgICAgICAgIHN0cjIgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3NpZ25hbCk7CisgICAgICAgICAgICAgICAgb2ZmbG9hZF9zaWduYWwoc3MsIG9mZmxvYWRfbnVtYmVyLCBzdHIxLCBzdHIyKTsKKwkgICAgICAgIHNpZ25hbCA9IHZhX2FyZyh2YV9hcmdzLCB1aW50NjRfdCopOworCSAgICAgICAgaWYgKHNpZ25hbCkKKyAgICAgICAgICAgICAgICAgICBzcyA8PCAiIDB4IiA8PCBzdGQ6OmhleCA8PCAqc2lnbmFsOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICBzcyA8PCAiIG5vbmUiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX3dhaXQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGNvdW50OworICAgICAgICAgICAgICAgIHVpbnQ2NF90ICAqKnNpZ25hbDsKKyAgICAgICAgICAgICAgICBzdHIxID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zdGF0ZV9zaWduYWwpOworICAgICAgICAgICAgICAgIHN0cjIgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3dhaXQpOworICAgICAgICAgICAgICAgIG9mZmxvYWRfc2lnbmFsKHNzLCBvZmZsb2FkX251bWJlciwgc3RyMSwgc3RyMik7CisgICAgICAgICAgICAgICAgY291bnQgPSB2YV9hcmcodmFfYXJncywgaW50KTsKKyAgICAgICAgICAgICAgICBzaWduYWwgPSB2YV9hcmcodmFfYXJncywgdWludDY0X3QqKik7CisgICAgICAgICAgICAgICAgaWYgKGNvdW50KSB7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChjb3VudCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3MgPDwgIiAiIDw8IHN0ZDo6aGV4IDw8IHNpZ25hbFtjb3VudC0xXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50LS07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBzcyA8PCAiIG5vbmUiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX3VucmVnaXN0ZXI6CisgICAgICAgICAgICBzdHIxID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zdGF0ZSk7CisgICAgICAgICAgICBzdHIyID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF91bnJlZ2lzdGVyKTsKKyAgICAgICAgICAgIG9mZmxvYWRfc3RhZ2Uoc3MsIG9mZmxvYWRfbnVtYmVyLCBzdHIxLCBzdHIyLCBmYWxzZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfZGVzdHJveToKKyAgICAgICAgICAgIHN0cjEgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3N0YXRlKTsKKyAgICAgICAgICAgIHN0cjIgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X2Rlc3Ryb3kpOworICAgICAgICAgICAgb2ZmbG9hZF9zdGFnZShzcywgb2ZmbG9hZF9udW1iZXIsIHN0cjEsIHN0cjIsIHRydWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX215b2luaXQ6CisgICAgICAgICAgICBzdHIxID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zdGF0ZSk7CisgICAgICAgICAgICBzdHIyID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9teW9pbml0KTsKKyAgICAgICAgICAgIG9mZmxvYWRfc3RhZ2Uoc3MsIG9mZmxvYWRfbnVtYmVyLCBzdHIxLCBzdHIyLCBmYWxzZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfbXlvcmVnaXN0ZXI6CisgICAgICAgICAgICBzdHIxID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zdGF0ZSk7CisgICAgICAgICAgICBzdHIyID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9teW9yZWdpc3Rlcik7CisgICAgICAgICAgICBvZmZsb2FkX3N0YWdlKHNzLCBvZmZsb2FkX251bWJlciwgc3RyMSwgc3RyMiwgZmFsc2UpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX215b2Zpbmk6CisgICAgICAgICAgICBzdHIxID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zdGF0ZSk7CisgICAgICAgICAgICBzdHIyID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9teW9maW5pKTsKKyAgICAgICAgICAgIG9mZmxvYWRfc3RhZ2Uoc3MsIG9mZmxvYWRfbnVtYmVyLCBzdHIxLCBzdHIyLCBmYWxzZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfbWljX215b19zaGFyZWQ6CisgICAgICAgICAgICBzdHIxID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zdGF0ZSk7CisgICAgICAgICAgICBzdHIyID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9taWNfbXlvX3NoYXJlZCk7CisgICAgICAgICAgICBvZmZsb2FkX3N0YWdlKHNzLCBvZmZsb2FkX251bWJlciwgc3RyMSwgc3RyMiwgZmFsc2UpOworICAgICAgICAgICAgc3MgPDwgIiAiIDw8IHZhX2FyZyh2YV9hcmdzLCBjaGFyKik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfbWljX215b19mcHRyOgorICAgICAgICAgICAgc3RyMSA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfc3RhdGUpOworICAgICAgICAgICAgc3RyMiA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfbWljX215b19mcHRyKTsKKyAgICAgICAgICAgIG9mZmxvYWRfc3RhZ2Uoc3MsIG9mZmxvYWRfbnVtYmVyLCBzdHIxLCBzdHIyLCBmYWxzZSk7CisgICAgICAgICAgICBzcyA8PCAiICIgPDwgdmFfYXJnKHZhX2FyZ3MsIGNoYXIqKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9teW9zaGFyZWRtYWxsb2M6CisgICAgICAgICAgICBzdHIxID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zdGF0ZSk7CisgICAgICAgICAgICBzdHIyID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9teW9zaGFyZWRtYWxsb2MpOworICAgICAgICAgICAgb2ZmbG9hZF9zdGFnZShzcywgb2ZmbG9hZF9udW1iZXIsIHN0cjEsIHN0cjIsIGZhbHNlKTsKKyAgICAgICAgICAgIHZhX2FyZyh2YV9hcmdzLCBjaGFyKik7CisgICAgICAgICAgICBzcyA8PCAiICIgPDwgdmFfYXJnKHZhX2FyZ3MsIHNpemVfdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfbXlvc2hhcmVkZnJlZToKKyAgICAgICAgICAgIHN0cjEgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3N0YXRlKTsKKyAgICAgICAgICAgIHN0cjIgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X215b3NoYXJlZGZyZWUpOworICAgICAgICAgICAgb2ZmbG9hZF9zdGFnZShzcywgb2ZmbG9hZF9udW1iZXIsIHN0cjEsIHN0cjIsIGZhbHNlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9teW9zaGFyZWRhbGlnbmVkbWFsbG9jOgorICAgICAgICAgICAgc3RyMSA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfc3RhdGUpOworICAgICAgICAgICAgc3RyMiA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfbXlvc2hhcmVkYWxpZ25lZG1hbGxvYyk7CisgICAgICAgICAgICBvZmZsb2FkX3N0YWdlKHNzLCBvZmZsb2FkX251bWJlciwgc3RyMSwgc3RyMiwgZmFsc2UpOworICAgICAgICAgICAgdmFfYXJnKHZhX2FyZ3MsIGNoYXIqKTsKKyAgICAgICAgICAgIHNzIDw8ICIgIiA8PCB2YV9hcmcodmFfYXJncywgc2l6ZV90KTsKKyAgICAgICAgICAgIHNzIDw8ICIgIiA8PCB2YV9hcmcodmFfYXJncywgc2l6ZV90KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9teW9zaGFyZWRhbGlnbmVkZnJlZToKKyAgICAgICAgICAgIHN0cjEgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3N0YXRlKTsKKyAgICAgICAgICAgIHN0cjIgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X215b3NoYXJlZGFsaWduZWRmcmVlKTsKKyAgICAgICAgICAgIG9mZmxvYWRfc3RhZ2Uoc3MsIG9mZmxvYWRfbnVtYmVyLCBzdHIxLCBzdHIyLCBmYWxzZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfbXlvYWNxdWlyZToKKyAgICAgICAgICAgIHN0cjEgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3N0YXRlKTsKKyAgICAgICAgICAgIHN0cjIgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X215b2FjcXVpcmUpOworICAgICAgICAgICAgb2ZmbG9hZF9zdGFnZShzcywgb2ZmbG9hZF9udW1iZXIsIHN0cjEsIHN0cjIsIGZhbHNlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9teW9yZWxlYXNlOgorICAgICAgICAgICAgc3RyMSA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfc3RhdGUpOworICAgICAgICAgICAgc3RyMiA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfbXlvcmVsZWFzZSk7CisgICAgICAgICAgICBvZmZsb2FkX3N0YWdlKHNzLCBvZmZsb2FkX251bWJlciwgc3RyMSwgc3RyMiwgZmFsc2UpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfcmVwb3J0X3Vua25vd25fdHJhY2Vfbm9kZSk7CisgICAgICAgICAgICBhYm9ydCgpOworICAgIH0KKyAgICBzcyA8PCAiXG4iOworICAgIGJ1ZiA9IHNzLnN0cigpOworICAgIGZwcmludGYoc3Rkb3V0LCBidWYuZGF0YSgpKTsKKyAgICBmZmx1c2goc3Rkb3V0KTsKKworICAgIHZhX2VuZCh2YV9hcmdzKTsKKyAgICByZXR1cm47Cit9CmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX3RyYWNlLmggYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX3RyYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVjMjhhNAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfdHJhY2UuaApAQCAtMCwwICsxLDUyIEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKy8vIFRoZSBwYXJ0cyBvZiB0aGUgb2ZmbG9hZCBsaWJyYXJ5IGNvbW1vbiB0byBob3N0IGFuZCB0YXJnZXQKKwordm9pZCBvZmZsb2FkX3N0YWdlX3ByaW50KGludCBzdGFnZSwgaW50IG9mZmxvYWRfbnVtYmVyLCAuLi4pOworCitlbnVtIE9mZmxvYWRUcmFjZVN0YWdlIHsKKyAgICAvLyBUb3RhbCB0aW1lIHNwZW50IG9uIHRoZSB0YXJnZXQKKyAgICBjX29mZmxvYWRfc3RhcnQgPSAwLAorICAgIGNfb2ZmbG9hZF9pbml0LAorICAgIGNfb2ZmbG9hZF9yZWdpc3RlciwKKyAgICBjX29mZmxvYWRfaW5pdF9mdW5jLAorICAgIGNfb2ZmbG9hZF9jcmVhdGVfYnVmX2hvc3QsCisgICAgY19vZmZsb2FkX2NyZWF0ZV9idWZfbWljLAorICAgIGNfb2ZmbG9hZF9zZW5kX3BvaW50ZXJfZGF0YSwKKyAgICBjX29mZmxvYWRfc2VudF9wb2ludGVyX2RhdGEsCisgICAgY19vZmZsb2FkX2dhdGhlcl9jb3B5aW5fZGF0YSwKKyAgICBjX29mZmxvYWRfY29weWluX2RhdGEsCisgICAgY19vZmZsb2FkX2NvbXB1dGUsCisgICAgY19vZmZsb2FkX3JlY2VpdmVfcG9pbnRlcl9kYXRhLAorICAgIGNfb2ZmbG9hZF9yZWNlaXZlZF9wb2ludGVyX2RhdGEsCisgICAgY19vZmZsb2FkX3N0YXJ0X3RhcmdldF9mdW5jLAorICAgIGNfb2ZmbG9hZF92YXIsCisgICAgY19vZmZsb2FkX3NjYXR0ZXJfY29weWluX2RhdGEsCisgICAgY19vZmZsb2FkX2dhdGhlcl9jb3B5b3V0X2RhdGEsCisgICAgY19vZmZsb2FkX3NjYXR0ZXJfY29weW91dF9kYXRhLAorICAgIGNfb2ZmbG9hZF9jb3B5b3V0X2RhdGEsCisgICAgY19vZmZsb2FkX3NpZ25hbCwKKyAgICBjX29mZmxvYWRfd2FpdCwKKyAgICBjX29mZmxvYWRfdW5yZWdpc3RlciwKKyAgICBjX29mZmxvYWRfZGVzdHJveSwKKyAgICBjX29mZmxvYWRfZmluaXNoLAorICAgIGNfb2ZmbG9hZF9teW9pbml0LAorICAgIGNfb2ZmbG9hZF9teW9yZWdpc3RlciwKKyAgICBjX29mZmxvYWRfbWljX215b19zaGFyZWQsCisgICAgY19vZmZsb2FkX21pY19teW9fZnB0ciwKKyAgICBjX29mZmxvYWRfbXlvc2hhcmVkbWFsbG9jLAorICAgIGNfb2ZmbG9hZF9teW9zaGFyZWRmcmVlLAorICAgIGNfb2ZmbG9hZF9teW9zaGFyZWRhbGlnbmVkbWFsbG9jLAorICAgIGNfb2ZmbG9hZF9teW9zaGFyZWRhbGlnbmVkZnJlZSwKKyAgICBjX29mZmxvYWRfbXlvYWNxdWlyZSwKKyAgICBjX29mZmxvYWRfbXlvcmVsZWFzZSwKKyAgICBjX29mZmxvYWRfbXlvZmluaQorfTsKZGlmZiAtLWdpdCBhL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfdXRpbC5jcHAgYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX3V0aWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4NDYyYzgKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX3V0aWwuY3BwCkBAIC0wLDAgKzEsMjA2IEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJvZmZsb2FkX3V0aWwuaCIKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgImxpYm9mZmxvYWRfZXJyb3JfY29kZXMuaCIKKworI2lmZGVmIFRBUkdFVF9XSU5OVAordm9pZCAqdGhyZWFkX2dldHNwZWNpZmljKHB0aHJlYWRfa2V5X3Qga2V5KQoreworICAgIGlmIChrZXkgPT0gMCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJldHVybiBUbHNHZXRWYWx1ZShrZXkpOworICAgIH0KK30KKworaW50IHRocmVhZF9zZXRzcGVjaWZpYyhwdGhyZWFkX2tleV90IGtleSwgY29uc3Qgdm9pZCAqdmFsdWUpCit7CisgICAgcmV0dXJuIChUbHNTZXRWYWx1ZShrZXksIChMUFZPSUQpdmFsdWUpKSA/IDAgOiBHZXRMYXN0RXJyb3IoKTsKK30KKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKKworYm9vbCBfX29mZmxvYWRfcGFyc2Vfc2l6ZV9zdHJpbmcoY29uc3QgY2hhciAqc3RyLCB1aW50NjRfdCAmbmV3X3NpemUpCit7CisgICAgdWludDY0X3QgdmFsOworICAgIGNoYXIgKnN1ZmZpeDsKKworICAgIGVycm5vID0gMDsKKyNpZmRlZiBUQVJHRVRfV0lOTlQKKyAgICB2YWwgPSBzdHJ0b3VsKHN0ciwgJnN1ZmZpeCwgMTApOworI2Vsc2UgLy8gVEFSR0VUX1dJTk5UCisgICAgdmFsID0gc3RydG91bGwoc3RyLCAmc3VmZml4LCAxMCk7CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisgICAgaWYgKGVycm5vICE9IDAgfHwgc3VmZml4ID09IHN0cikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKHN1ZmZpeFswXSA9PSAnXDAnKSB7CisgICAgICAgIC8vIGRlZmF1bHQgaXMgS2lsb2J5dGVzCisgICAgICAgIG5ld19zaXplID0gdmFsICogMTAyNDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGVsc2UgaWYgKHN1ZmZpeFsxXSA9PSAnXDAnKSB7CisgICAgICAgIC8vIE9wdGlvbmFsIHN1ZmZpeGVzOiBCIChieXRlcyksIEsgKEtpbG9ieXRlcyksIE0gKE1lZ2FieXRlcyksCisgICAgICAgIC8vIEcgKEdpZ2FieXRlcyksIG9yIFQgKFRlcmFieXRlcykgc3BlY2lmeSB0aGUgdW5pdHMuCisgICAgICAgIHN3aXRjaCAoc3VmZml4WzBdKSB7CisgICAgICAgICAgICBjYXNlICdiJzoKKyAgICAgICAgICAgIGNhc2UgJ0InOgorICAgICAgICAgICAgICAgIG5ld19zaXplID0gdmFsOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlICdrJzoKKyAgICAgICAgICAgIGNhc2UgJ0snOgorICAgICAgICAgICAgICAgIG5ld19zaXplID0gdmFsICogMTAyNDsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAnbSc6CisgICAgICAgICAgICBjYXNlICdNJzoKKyAgICAgICAgICAgICAgICBuZXdfc2l6ZSA9IHZhbCAqIDEwMjQgKiAxMDI0OworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlICdnJzoKKyAgICAgICAgICAgIGNhc2UgJ0cnOgorICAgICAgICAgICAgICAgIG5ld19zaXplID0gdmFsICogMTAyNCAqIDEwMjQgKiAxMDI0OworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlICd0JzoKKyAgICAgICAgICAgIGNhc2UgJ1QnOgorICAgICAgICAgICAgICAgIG5ld19zaXplID0gdmFsICogMTAyNCAqIDEwMjQgKiAxMDI0ICogMTAyNDsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIF9fb2ZmbG9hZF9wYXJzZV9pbnRfc3RyaW5nKGNvbnN0IGNoYXIgKnN0ciwgaW50NjRfdCAmdmFsdWUpCit7CisgICAgaW50NjRfdCB2YWw7CisgICAgY2hhciAqc3VmZml4OworCisgICAgZXJybm8gPSAwOworI2lmZGVmIFRBUkdFVF9XSU5OVAorICAgIHZhbCA9IHN0cnRvbChzdHIsICZzdWZmaXgsIDApOworI2Vsc2UKKyAgICB2YWwgPSBzdHJ0b2xsKHN0ciwgJnN1ZmZpeCwgMCk7CisjZW5kaWYKKyAgICBpZiAoZXJybm8gPT0gMCAmJiBzdWZmaXggIT0gc3RyICYmICpzdWZmaXggPT0gJ1wwJykgeworICAgICAgICB2YWx1ZSA9IHZhbDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworI2lmZGVmIFRBUkdFVF9XSU5OVAorZXh0ZXJuIHZvaWQqIERMX29wZW4oY29uc3QgY2hhciAqcGF0aCkKK3sKKyAgICB2b2lkICpoYW5kbGU7CisgICAgaW50IGVycm9yX21vZGU7CisKKyAgICAvKgorICAgICAqIGRvIG5vdCBkaXNwbGF5IG1lc3NhZ2UgYm94IHdpdGggZXJyb3IgaWYgaXQgdGhlIGNhbGwgYmVsb3cgZmFpbHMgdG8KKyAgICAgKiBsb2FkIGR5bmFtaWMgbGlicmFyeS4KKyAgICAgKi8KKyAgICBlcnJvcl9tb2RlID0gU2V0RXJyb3JNb2RlKFNFTV9GQUlMQ1JJVElDQUxFUlJPUlMgfCBTRU1fTk9PUEVORklMRUVSUk9SQk9YKTsKKworICAgIC8qIGxvYWQgZHluYW1pYyBsaWJyYXJ5ICovCisgICAgaGFuZGxlID0gKHZvaWQqKSBMb2FkTGlicmFyeShwYXRoKTsKKworICAgIC8qIHJlc3RvcmUgZXJyb3IgbW9kZSAqLworICAgIFNldEVycm9yTW9kZShlcnJvcl9tb2RlKTsKKworICAgIHJldHVybiBoYW5kbGU7Cit9CisKK2V4dGVybiBpbnQgRExfYWRkcihjb25zdCB2b2lkICphZGRyLCBEbF9pbmZvICpkbF9pbmZvKQoreworICAgIE1FTU9SWV9CQVNJQ19JTkZPUk1BVElPTiBtZW1faW5mbzsKKyAgICBjaGFyIG1vZF9uYW1lW01BWF9QQVRIXTsKKyAgICBITU9EVUxFIG1vZF9oYW5kbGU7CisKKyAgICAvKiBGaWxsIE1FTU9SWV9CQVNJQ19JTkZPUk1BVElPTiBzdHJ1Y3QgKi8KKyAgICBpZiAoIVZpcnR1YWxRdWVyeShhZGRyLCAmbWVtX2luZm8sIHNpemVvZihtZW1faW5mbykpKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBtb2RfaGFuZGxlID0gKEhNT0RVTEUpbWVtX2luZm8uQWxsb2NhdGlvbkJhc2U7CisKKyAgICAvKiBBTlNJIGZpbGUgbmFtZSBmb3IgbW9kdWxlICovCisgICAgaWYgKCFHZXRNb2R1bGVGaWxlTmFtZUEobW9kX2hhbmRsZSwgKGNoYXIqKSBtb2RfbmFtZSwgc2l6ZW9mKG1vZF9uYW1lKSkpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHN0cmNweShkbF9pbmZvLT5kbGlfZm5hbWUsIG1vZF9uYW1lKTsKKyAgICBkbF9pbmZvLT5kbGlfZmJhc2UgPSBtZW1faW5mby5CYXNlQWRkcmVzczsKKyAgICBkbF9pbmZvLT5kbGlfc2FkZHIgPSBhZGRyOworICAgIHN0cmNweShkbF9pbmZvLT5kbGlfc25hbWUsIG1vZF9uYW1lKTsKKyAgICByZXR1cm4gMTsKK30KKworLy8gUnVuIG9uY2UKK3N0YXRpYyBCT09MIENBTExCQUNLIF9fb2ZmbG9hZF9ydW5fb25jZV93cmFwcGVyKAorICAgIFBJTklUX09OQ0UgaW5pdE9uY2UsCisgICAgUFZPSUQgcGFyYW1ldGVyLAorICAgIFBWT0lEICpjb250ZXh0CispCit7CisgICAgdm9pZCAoKmluaXRfcm91dGluZSkodm9pZCkgPSAodm9pZCgqKSh2b2lkKSkgcGFyYW1ldGVyOworICAgIGluaXRfcm91dGluZSgpOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIF9fb2ZmbG9hZF9ydW5fb25jZShPZmZsb2FkT25jZUNvbnRyb2wgKmN0cmwsIHZvaWQgKCpmdW5jKSh2b2lkKSkKK3sKKyAgICBJbml0T25jZUV4ZWN1dGVPbmNlKGN0cmwsIF9fb2ZmbG9hZF9ydW5fb25jZV93cmFwcGVyLCAodm9pZCopIGZ1bmMsIDApOworfQorI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorCisvKiBBUkdTVVNFRCAqLyAvLyB2ZXJzaW9uIGlzIG5vdCB1c2VkIG9uIHdpbmRvd3MKK3ZvaWQqIERMX3N5bSh2b2lkICpoYW5kbGUsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZlcnNpb24pCit7CisjaWZkZWYgVEFSR0VUX1dJTk5UCisgICAgcmV0dXJuIEdldFByb2NBZGRyZXNzKChITU9EVUxFKSBoYW5kbGUsIG5hbWUpOworI2Vsc2UgLy8gVEFSR0VUX1dJTk5UCisgICAgaWYgKHZlcnNpb24gPT0gMCkgeworICAgICAgICByZXR1cm4gZGxzeW0oaGFuZGxlLCBuYW1lKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJldHVybiBkbHZzeW0oaGFuZGxlLCBuYW1lLCB2ZXJzaW9uKTsKKyAgICB9CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCit9CisKK2ludDY0X3QgZ2V0X2VsX3ZhbHVlKAorICAgICAgICAgICAgICAgICAgICAgY2hhciAqYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgIGludDY0X3Qgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBzaXplKQoreworICAgIGludDY0X3QgdmFsID0gMDsKKyAgICBzd2l0Y2ggKHNpemUpIHsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgdmFsID0gc3RhdGljX2Nhc3Q8aW50NjRfdD4oKigoY2hhciAqKShiYXNlICsgb2Zmc2V0KSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIHZhbCA9IHN0YXRpY19jYXN0PGludDY0X3Q+KCooKHNob3J0ICopKGJhc2UgKyBvZmZzZXQpKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgdmFsID0gc3RhdGljX2Nhc3Q8aW50NjRfdD4oKigoaW50ICopKGJhc2UgKyBvZmZzZXQpKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHZhbCA9ICooKGludDY0X3QgKikoYmFzZSArIG9mZnNldCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiB2YWw7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX3V0aWwuaCBiL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfdXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1MGQ3N2QKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX3V0aWwuaApAQCAtMCwwICsxLDE1MyBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIE9GRkxPQURfVVRJTF9IX0lOQ0xVREVECisjZGVmaW5lIE9GRkxPQURfVVRJTF9IX0lOQ0xVREVECisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaWZkZWYgVEFSR0VUX1dJTk5UCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgPHByb2Nlc3MuaD4KKyNlbHNlIC8vIFRBUkdFVF9XSU5OVAorI2luY2x1ZGUgPGRsZmNuLmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorCisjaWZkZWYgVEFSR0VUX1dJTk5UCit0eXBlZGVmIHVuc2lnbmVkIHB0aHJlYWRfa2V5X3Q7Cit0eXBlZGVmIGludCBwaWRfdDsKKworI2RlZmluZSBfX2Z1bmNfXyBfX0ZVTkNUSU9OX18KKyNkZWZpbmUgc3RydG9rX3IocyxkLHApIHN0cnRva19zKHMsZCxwKQorI2RlZmluZSBzdHJjYXNlY21wKGEsYikgc3RyaWNtcChhLGIpCisKKyNkZWZpbmUgdGhyZWFkX2tleV9jcmVhdGUoa2V5LCBkZXN0cnVjdG9yKSBcCisgICAgKCgoKmtleSA9IFRsc0FsbG9jKCkpID4gMCkgPyAwIDogR2V0TGFzdEVycm9yKCkpCisjZGVmaW5lIHRocmVhZF9rZXlfZGVsZXRlKGtleSkgVGxzRnJlZShrZXkpCisKKyNpZm5kZWYgU19JU1JFRworI2RlZmluZSBTX0lTUkVHKG1vZGUpICAoKChtb2RlKSAmIFNfSUZNVCkgPT0gU19JRlJFRykKKyNlbmRpZgorCit2b2lkKiAgIHRocmVhZF9nZXRzcGVjaWZpYyhwdGhyZWFkX2tleV90IGtleSk7CitpbnQgICAgIHRocmVhZF9zZXRzcGVjaWZpYyhwdGhyZWFkX2tleV90IGtleSwgY29uc3Qgdm9pZCAqdmFsdWUpOworI2Vsc2UKKyNkZWZpbmUgdGhyZWFkX2tleV9jcmVhdGUoa2V5LCBkZXN0cnVjdG9yKSBcCisgICAgICAgICAgICBwdGhyZWFkX2tleV9jcmVhdGUoKGtleSksIChkZXN0cnVjdG9yKSkKKyNkZWZpbmUgdGhyZWFkX2tleV9kZWxldGUoa2V5KSAgcHRocmVhZF9rZXlfZGVsZXRlKGtleSkKKyNkZWZpbmUgdGhyZWFkX2dldHNwZWNpZmljKGtleSkgcHRocmVhZF9nZXRzcGVjaWZpYyhrZXkpCisjZGVmaW5lIHRocmVhZF9zZXRzcGVjaWZpYyhrZXksIHZhbHVlKSBwdGhyZWFkX3NldHNwZWNpZmljKGtleSwgdmFsdWUpCisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisKKy8vIE11dGV4IGltcGxlbWVudGF0aW9uCitzdHJ1Y3QgbXV0ZXhfdCB7CisgICAgbXV0ZXhfdCgpIHsKKyNpZmRlZiBUQVJHRVRfV0lOTlQKKyAgICAgICAgSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbigmbV9sb2NrKTsKKyNlbHNlIC8vIFRBUkdFVF9XSU5OVAorICAgICAgICBwdGhyZWFkX211dGV4X2luaXQoJm1fbG9jaywgMCk7CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisgICAgfQorCisgICAgfm11dGV4X3QoKSB7CisjaWZkZWYgVEFSR0VUX1dJTk5UCisgICAgICAgIERlbGV0ZUNyaXRpY2FsU2VjdGlvbigmbV9sb2NrKTsKKyNlbHNlIC8vIFRBUkdFVF9XSU5OVAorICAgICAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJm1fbG9jayk7CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisgICAgfQorCisgICAgdm9pZCBsb2NrKCkgeworI2lmZGVmIFRBUkdFVF9XSU5OVAorICAgICAgICBFbnRlckNyaXRpY2FsU2VjdGlvbigmbV9sb2NrKTsKKyNlbHNlIC8vIFRBUkdFVF9XSU5OVAorICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJm1fbG9jayk7CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisgICAgfQorCisgICAgdm9pZCB1bmxvY2soKSB7CisjaWZkZWYgVEFSR0VUX1dJTk5UCisgICAgICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZtX2xvY2spOworI2Vsc2UgLy8gVEFSR0VUX1dJTk5UCisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtX2xvY2spOworI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorICAgIH0KKworcHJpdmF0ZToKKyNpZmRlZiBUQVJHRVRfV0lOTlQKKyAgICBDUklUSUNBTF9TRUNUSU9OICAgIG1fbG9jazsKKyNlbHNlCisgICAgcHRocmVhZF9tdXRleF90ICAgICBtX2xvY2s7CisjZW5kaWYKK307CisKK3N0cnVjdCBtdXRleF9sb2NrZXJfdCB7CisgICAgbXV0ZXhfbG9ja2VyX3QobXV0ZXhfdCAmbXV0ZXgpIDogbV9tdXRleChtdXRleCkgeworICAgICAgICBtX211dGV4LmxvY2soKTsKKyAgICB9CisKKyAgICB+bXV0ZXhfbG9ja2VyX3QoKSB7CisgICAgICAgIG1fbXV0ZXgudW5sb2NrKCk7CisgICAgfQorCitwcml2YXRlOgorICAgIG11dGV4X3QgJm1fbXV0ZXg7Cit9OworCisvLyBEeW5hbWljIGxvYWRlciBpbnRlcmZhY2UKKyNpZmRlZiBUQVJHRVRfV0lOTlQKK3N0cnVjdCBEbF9pbmZvCit7CisgICAgY2hhciAgICAgICAgZGxpX2ZuYW1lW01BWF9QQVRIXTsKKyAgICB2b2lkICAgICAgICpkbGlfZmJhc2U7CisgICAgY2hhciAgICAgICAgZGxpX3NuYW1lW01BWF9QQVRIXTsKKyAgICBjb25zdCB2b2lkICpkbGlfc2FkZHI7Cit9OworCit2b2lkKiAgIERMX29wZW4oY29uc3QgY2hhciAqcGF0aCk7CisjZGVmaW5lIERMX2Nsb3NlKGhhbmRsZSkgICAgICAgIEZyZWVMaWJyYXJ5KChITU9EVUxFKSAoaGFuZGxlKSkKK2ludCAgICAgRExfYWRkcihjb25zdCB2b2lkICphZGRyLCBEbF9pbmZvICppbmZvKTsKKyNlbHNlCisjZGVmaW5lIERMX29wZW4ocGF0aCkgICAgICAgICAgIGRsb3BlbigocGF0aCksIFJUTERfTk9XKQorI2RlZmluZSBETF9jbG9zZShoYW5kbGUpICAgICAgICBkbGNsb3NlKGhhbmRsZSkKKyNkZWZpbmUgRExfYWRkcihhZGRyLCBpbmZvKSAgICAgZGxhZGRyKChhZGRyKSwgKGluZm8pKQorI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorCitleHRlcm4gdm9pZCogRExfc3ltKHZvaWQgKmhhbmRsZSwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmVyc2lvbik7CisKKy8vIE9uZS10aW1lIGluaXRpYWxpemF0aW9uIEFQSQorI2lmZGVmIFRBUkdFVF9XSU5OVAordHlwZWRlZiBJTklUX09OQ0UgICAgICAgICAgICAgICAgICAgT2ZmbG9hZE9uY2VDb250cm9sOworI2RlZmluZSBPRkZMT0FEX09OQ0VfQ09OVFJPTF9JTklUICAgSU5JVF9PTkNFX1NUQVRJQ19JTklUCisKK2V4dGVybiB2b2lkIF9fb2ZmbG9hZF9ydW5fb25jZShPZmZsb2FkT25jZUNvbnRyb2wgKmN0cmwsIHZvaWQgKCpmdW5jKSh2b2lkKSk7CisjZWxzZQordHlwZWRlZiBwdGhyZWFkX29uY2VfdCAgICAgICAgICAgICAgT2ZmbG9hZE9uY2VDb250cm9sOworI2RlZmluZSBPRkZMT0FEX09OQ0VfQ09OVFJPTF9JTklUICAgUFRIUkVBRF9PTkNFX0lOSVQKKworI2RlZmluZSBfX29mZmxvYWRfcnVuX29uY2UoY3RybCwgZnVuYykgcHRocmVhZF9vbmNlKGN0cmwsIGZ1bmMpCisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisKKy8vIFBhcnNlcyBzaXplIHNwZWNpZmljYXRpb24gc3RyaW5nLgorZXh0ZXJuIGJvb2wgX19vZmZsb2FkX3BhcnNlX3NpemVfc3RyaW5nKGNvbnN0IGNoYXIgKnN0ciwgdWludDY0X3QgJm5ld19zaXplKTsKKworLy8gUGFyc2VzIHN0cmluZyB3aXRoIGludGVnZXIgdmFsdWUKK2V4dGVybiBib29sIF9fb2ZmbG9hZF9wYXJzZV9pbnRfc3RyaW5nKGNvbnN0IGNoYXIgKnN0ciwgaW50NjRfdCAmdmFsdWUpOworCisvLyBnZXQgdmFsdWUgYnkgaXRzIGJhc2UsIG9mZnNldCBhbmQgc2l6ZQoraW50NjRfdCBnZXRfZWxfdmFsdWUoCisgICAgY2hhciAgICpiYXNlLAorICAgIGludDY0X3Qgb2Zmc2V0LAorICAgIGludDY0X3Qgc2l6ZQorKTsKKyNlbmRpZiAvLyBPRkZMT0FEX1VUSUxfSF9JTkNMVURFRApkaWZmIC0tZ2l0IGEvZmluYWwvb2ZmbG9hZC9zcmMvb2ZsZGJlZ2luLmNwcCBiL2ZpbmFsL29mZmxvYWQvc3JjL29mbGRiZWdpbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ1Zjk4MgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvc3JjL29mbGRiZWdpbi5jcHAKQEAgLTAsMCArMSwxNjQgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmIEhPU1RfTElCUkFSWQorI2luY2x1ZGUgIm9mZmxvYWRfaG9zdC5oIgorI2luY2x1ZGUgIm9mZmxvYWRfbXlvX2hvc3QuaCIKKyNlbHNlCisjaW5jbHVkZSAiY29tcGlsZXJfaWZfdGFyZ2V0LmgiCisjaW5jbHVkZSAib2ZmbG9hZF90YXJnZXQuaCIKKyNpbmNsdWRlICJvZmZsb2FkX215b190YXJnZXQuaCIKKyNlbmRpZgorCisjaWZkZWYgVEFSR0VUX1dJTk5UCisjZGVmaW5lIEFMTE9DQVRFKG5hbWUpIF9fZGVjbHNwZWMoYWxsb2NhdGUobmFtZSkpCisjZGVmaW5lIERMTF9MT0NBTAorI2Vsc2UgLy8gVEFSR0VUX1dJTk5UCisjZGVmaW5lIEFMTE9DQVRFKG5hbWUpIF9fYXR0cmlidXRlX18oKHNlY3Rpb24obmFtZSkpKQorI2RlZmluZSBETExfTE9DQUwgIF9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImhpZGRlbiIpKSkKKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKKworI2lmIEhPU1RfTElCUkFSWQorLy8gdGhlIGhvc3QgcHJvZ3JhbS9zaGFyZWQgbGlicmFyeSBzaG91bGQgYWx3YXlzIGhhdmUgX19vZmZsb2FkX3RhcmdldF9pbWFnZQorLy8gc3ltYm9sIGRlZmluZWQuIFRoaXMgc3ltYm9sIHNwZWNpZmllcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0YXJnZXQgcHJvZ3JhbQorLy8gaW1hZ2UuCitleHRlcm4gIkMiIERMTF9MT0NBTCBjb25zdCB2b2lkKiBfX29mZmxvYWRfdGFyZ2V0X2ltYWdlOworI2Vsc2UgLy8gSE9TVF9MSUJSQVJZCisvLyBEZWZpbmUgYSB3ZWFrIG1haW4gd2hpY2ggd291bGQgYmUgdXNlZCBvbiB0YXJnZXQgc2lkZSBpbiBjYXNlIHVzZXJlJ3MKKy8vIHNvdXJjZSBmaWxlIGNvbnRhaW5pbmcgbWFpbiBkb2VzIG5vdCBoYXZlIG9mZmxvYWQgY29kZS4KKyNwcmFnbWEgd2VhayBtYWluCitpbnQgbWFpbih2b2lkKQoreworICAgIE9GRkxPQURfVEFSR0VUX01BSU4oKTsKKyAgICByZXR1cm4gMDsKK30KKworI3ByYWdtYSB3ZWFrIE1BSU5fXworZXh0ZXJuICJDIiBpbnQgTUFJTl9fKHZvaWQpCit7CisgICAgT0ZGTE9BRF9UQVJHRVRfTUFJTigpOworICAgIHJldHVybiAwOworfQorI2VuZGlmIC8vIEhPU1RfTElCUkFSWQorCisvLyBvZmZsb2FkIHNlY3Rpb24gcHJvbG9nCitBTExPQ0FURShPRkZMT0FEX0VOVFJZX1RBQkxFX1NFQ1RJT05fU1RBUlQpCisjaWZkZWYgVEFSR0VUX1dJTk5UCitfX2RlY2xzcGVjKGFsaWduKHNpemVvZihGdW5jVGFibGU6OkVudHJ5KSkpCisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCitzdGF0aWMgRnVuY1RhYmxlOjpFbnRyeSBfX29mZmxvYWRfZW50cnlfdGFibGVfc3RhcnQgPSB7IDAgfTsKKworLy8gbGlzdCBlbGVtZW50IGZvciB0aGUgY3VycmVudCBtb2R1bGUKK3N0YXRpYyBGdW5jTGlzdDo6Tm9kZSBfX29mZmxvYWRfZW50cnlfbm9kZSA9IHsKKyAgICB7ICZfX29mZmxvYWRfZW50cnlfdGFibGVfc3RhcnQgKyAxLCAtMSB9LAorICAgIDAsIDAKK307CisKKy8vIG9mZmxvYWQgZnAgc2VjdGlvbiBwcm9sb2cKK0FMTE9DQVRFKE9GRkxPQURfRlVOQ19UQUJMRV9TRUNUSU9OX1NUQVJUKQorI2lmZGVmIFRBUkdFVF9XSU5OVAorX19kZWNsc3BlYyhhbGlnbihzaXplb2YoRnVuY1RhYmxlOjpFbnRyeSkpKQorI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorc3RhdGljIEZ1bmNUYWJsZTo6RW50cnkgX19vZmZsb2FkX2Z1bmNfdGFibGVfc3RhcnQgPSB7IDAgfTsKKworLy8gbGlzdCBlbGVtZW50IGZvciB0aGUgY3VycmVudCBtb2R1bGUKK3N0YXRpYyBGdW5jTGlzdDo6Tm9kZSBfX29mZmxvYWRfZnVuY19ub2RlID0geworICAgIHsgJl9fb2ZmbG9hZF9mdW5jX3RhYmxlX3N0YXJ0ICsgMSwgLTEgfSwKKyAgICAwLCAwCit9OworCisvLyBvZmZsb2FkIGZwIHNlY3Rpb24gcHJvbG9nCitBTExPQ0FURShPRkZMT0FEX1ZBUl9UQUJMRV9TRUNUSU9OX1NUQVJUKQorI2lmZGVmIFRBUkdFVF9XSU5OVAorX19kZWNsc3BlYyhhbGlnbihzaXplb2YoVmFyVGFibGU6OkVudHJ5KSkpCisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCitzdGF0aWMgVmFyVGFibGU6OkVudHJ5IF9fb2ZmbG9hZF92YXJfdGFibGVfc3RhcnQgPSB7IDAgfTsKKworLy8gbGlzdCBlbGVtZW50IGZvciB0aGUgY3VycmVudCBtb2R1bGUKK3N0YXRpYyBWYXJMaXN0OjpOb2RlIF9fb2ZmbG9hZF92YXJfbm9kZSA9IHsKKyAgICB7ICZfX29mZmxvYWRfdmFyX3RhYmxlX3N0YXJ0ICsgMSB9LAorICAgIDAsIDAKK307CisKKyNpZmRlZiBNWU9fU1VQUE9SVAorCisvLyBvZmZsb2FkIG15byBzaGFyZWQgdmFyIHNlY3Rpb24gcHJvbG9nCitBTExPQ0FURShPRkZMT0FEX01ZT19TSEFSRURfVEFCTEVfU0VDVElPTl9TVEFSVCkKKyNpZmRlZiBUQVJHRVRfV0lOTlQKK19fZGVjbHNwZWMoYWxpZ24oc2l6ZW9mKFNoYXJlZFRhYmxlRW50cnkpKSkKKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKK3N0YXRpYyBTaGFyZWRUYWJsZUVudHJ5IF9fb2ZmbG9hZF9teW9fc2hhcmVkX3RhYmxlX3N0YXJ0ID0geyAwIH07CisKKyNpZiBIT1NUX0xJQlJBUlkKKy8vIG9mZmxvYWQgbXlvIHNoYXJlZCB2YXIgaW5pdCBzZWN0aW9uIHByb2xvZworQUxMT0NBVEUoT0ZGTE9BRF9NWU9fU0hBUkVEX0lOSVRfVEFCTEVfU0VDVElPTl9TVEFSVCkKKyNpZmRlZiBUQVJHRVRfV0lOTlQKK19fZGVjbHNwZWMoYWxpZ24oc2l6ZW9mKEluaXRUYWJsZUVudHJ5KSkpCisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCitzdGF0aWMgSW5pdFRhYmxlRW50cnkgX19vZmZsb2FkX215b19zaGFyZWRfaW5pdF90YWJsZV9zdGFydCA9IHsgMCB9OworI2VuZGlmCisKKy8vIG9mZmxvYWQgbXlvIGZwdHIgc2VjdGlvbiBwcm9sb2cKK0FMTE9DQVRFKE9GRkxPQURfTVlPX0ZQVFJfVEFCTEVfU0VDVElPTl9TVEFSVCkKKyNpZmRlZiBUQVJHRVRfV0lOTlQKK19fZGVjbHNwZWMoYWxpZ24oc2l6ZW9mKEZwdHJUYWJsZUVudHJ5KSkpCisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCitzdGF0aWMgRnB0clRhYmxlRW50cnkgX19vZmZsb2FkX215b19mcHRyX3RhYmxlX3N0YXJ0ID0geyAwIH07CisKKyNlbmRpZiAvLyBNWU9fU1VQUE9SVAorCisvLyBpbml0L2ZpbmkgY29kZSB3aGljaCBhZGRzL3JlbW92ZXMgbG9jYWwgbG9va3VwIGRhdGEgdG8vZnJvbSB0aGUgZ2xvYmFsIGxpc3QKKworc3RhdGljIHZvaWQgb2ZmbG9hZF9maW5pKCk7CisKKyNpZm5kZWYgVEFSR0VUX1dJTk5UCitzdGF0aWMgdm9pZCBvZmZsb2FkX2luaXQoKSBfX2F0dHJpYnV0ZV9fKChjb25zdHJ1Y3RvcigxMDEpKSk7CisjZWxzZSAvLyBUQVJHRVRfV0lOTlQKK3N0YXRpYyB2b2lkIG9mZmxvYWRfaW5pdCgpOworCisvLyBQbGFjZSBvZmZsb2FkIGluaXRpYWxpemF0aW9uIGJlZm9yZSB1c2VyIGNvbnN0cnVjdG9ycworQUxMT0NBVEUoT0ZGTE9BRF9DUlRJTklUX1NFQ1RJT05fU1RBUlQpCitzdGF0aWMgdm9pZCAoKmFkZHJlc3NvZl9vZmZsb2FkX2luaXQpKCkgPSBvZmZsb2FkX2luaXQ7CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisKK3N0YXRpYyB2b2lkIG9mZmxvYWRfaW5pdCgpCit7CisgICAgLy8gcmVnaXN0ZXIgb2ZmbG9hZCB0YWJsZXMKKyAgICBfX29mZmxvYWRfcmVnaXN0ZXJfdGFibGVzKCZfX29mZmxvYWRfZW50cnlfbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZfX29mZmxvYWRfZnVuY19ub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJl9fb2ZmbG9hZF92YXJfbm9kZSk7CisKKyNpZiBIT1NUX0xJQlJBUlkKKyAgICBfX29mZmxvYWRfcmVnaXN0ZXJfaW1hZ2UoJl9fb2ZmbG9hZF90YXJnZXRfaW1hZ2UpOworICAgIGF0ZXhpdChvZmZsb2FkX2ZpbmkpOworI2VuZGlmIC8vIEhPU1RfTElCUkFSWQorCisjaWZkZWYgTVlPX1NVUFBPUlQKKyAgICBfX29mZmxvYWRfbXlvUmVnaXN0ZXJUYWJsZXMoCisjaWYgSE9TVF9MSUJSQVJZCisgICAgICAgICZfX29mZmxvYWRfbXlvX3NoYXJlZF9pbml0X3RhYmxlX3N0YXJ0ICsgMSwKKyNlbmRpZiAvLyBIT1NUX0xJQlJBUlkKKyAgICAgICAgJl9fb2ZmbG9hZF9teW9fc2hhcmVkX3RhYmxlX3N0YXJ0ICsgMSwKKyAgICAgICAgJl9fb2ZmbG9hZF9teW9fZnB0cl90YWJsZV9zdGFydCArIDEKKyAgICApOworI2VuZGlmIC8vIE1ZT19TVVBQT1JUCit9CisKK3N0YXRpYyB2b2lkIG9mZmxvYWRfZmluaSgpCit7CisjaWYgSE9TVF9MSUJSQVJZCisgICAgX19vZmZsb2FkX3VucmVnaXN0ZXJfaW1hZ2UoJl9fb2ZmbG9hZF90YXJnZXRfaW1hZ2UpOworI2VuZGlmIC8vIEhPU1RfTElCUkFSWQorCisgICAgLy8gdW5yZWdpc3RlciBvZmZsb2FkIHRhYmxlcworICAgIF9fb2ZmbG9hZF91bnJlZ2lzdGVyX3RhYmxlcygmX19vZmZsb2FkX2VudHJ5X25vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZfX29mZmxvYWRfZnVuY19ub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmX19vZmZsb2FkX3Zhcl9ub2RlKTsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL29mZmxvYWQvc3JjL29mbGRlbmQuY3BwIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZsZGVuZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYxZmU1OQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvc3JjL29mbGRlbmQuY3BwCkBAIC0wLDAgKzEsNzcgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmIEhPU1RfTElCUkFSWQorI2luY2x1ZGUgIm9mZmxvYWRfaG9zdC5oIgorI2luY2x1ZGUgIm9mZmxvYWRfbXlvX2hvc3QuaCIKKyNlbHNlCisjaW5jbHVkZSAib2ZmbG9hZF90YXJnZXQuaCIKKyNpbmNsdWRlICJvZmZsb2FkX215b190YXJnZXQuaCIKKyNlbmRpZgorCisjaWZkZWYgVEFSR0VUX1dJTk5UCisjZGVmaW5lIEFMTE9DQVRFKG5hbWUpIF9fZGVjbHNwZWMoYWxsb2NhdGUobmFtZSkpCisjZWxzZSAvLyBUQVJHRVRfV0lOTlQKKyNkZWZpbmUgQUxMT0NBVEUobmFtZSkgX19hdHRyaWJ1dGVfXygoc2VjdGlvbihuYW1lKSkpCisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisKKy8vIG9mZmxvYWQgZW50cnkgdGFibGUKK0FMTE9DQVRFKE9GRkxPQURfRU5UUllfVEFCTEVfU0VDVElPTl9FTkQpCisjaWZkZWYgVEFSR0VUX1dJTk5UCitfX2RlY2xzcGVjKGFsaWduKHNpemVvZihGdW5jVGFibGU6OkVudHJ5KSkpCisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCitzdGF0aWMgRnVuY1RhYmxlOjpFbnRyeSBfX29mZmxvYWRfZW50cnlfdGFibGVfZW5kID0geyAoY29uc3QgY2hhciopLTEgfTsKKworLy8gb2ZmbG9hZCBmdW5jdGlvbiB0YWJsZQorQUxMT0NBVEUoT0ZGTE9BRF9GVU5DX1RBQkxFX1NFQ1RJT05fRU5EKQorI2lmZGVmIFRBUkdFVF9XSU5OVAorX19kZWNsc3BlYyhhbGlnbihzaXplb2YoRnVuY1RhYmxlOjpFbnRyeSkpKQorI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorc3RhdGljIEZ1bmNUYWJsZTo6RW50cnkgX19vZmZsb2FkX2Z1bmNfdGFibGVfZW5kID0geyAoY29uc3QgY2hhciopLTEgfTsKKworLy8gZGF0YSB0YWJsZQorQUxMT0NBVEUoT0ZGTE9BRF9WQVJfVEFCTEVfU0VDVElPTl9FTkQpCisjaWZkZWYgVEFSR0VUX1dJTk5UCitfX2RlY2xzcGVjKGFsaWduKHNpemVvZihWYXJUYWJsZTo6RW50cnkpKSkKKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKK3N0YXRpYyBWYXJUYWJsZTo6RW50cnkgX19vZmZsb2FkX3Zhcl90YWJsZV9lbmQgPSB7IChjb25zdCBjaGFyKiktMSB9OworCisjaWZkZWYgTVlPX1NVUFBPUlQKKworLy8gb2ZmbG9hZCBteW8gc2hhcmVkIHZhciBzZWN0aW9uIGVwaWxvZworQUxMT0NBVEUoT0ZGTE9BRF9NWU9fU0hBUkVEX1RBQkxFX1NFQ1RJT05fRU5EKQorI2lmZGVmIFRBUkdFVF9XSU5OVAorX19kZWNsc3BlYyhhbGlnbihzaXplb2YoU2hhcmVkVGFibGVFbnRyeSkpKQorc3RhdGljIFNoYXJlZFRhYmxlRW50cnkgX19vZmZsb2FkX215b19zaGFyZWRfdGFibGVfZW5kID0geyAoY29uc3QgY2hhciopLTEsIDAgfTsKKyNlbHNlIC8vIFRBUkdFVF9XSU5OVAorc3RhdGljIFNoYXJlZFRhYmxlRW50cnkgX19vZmZsb2FkX215b19zaGFyZWRfdGFibGVfZW5kID0geyAwIH07CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisKKyNpZiBIT1NUX0xJQlJBUlkKKy8vIG9mZmxvYWQgbXlvIHNoYXJlZCB2YXIgaW5pdCBzZWN0aW9uIGVwaWxvZworQUxMT0NBVEUoT0ZGTE9BRF9NWU9fU0hBUkVEX0lOSVRfVEFCTEVfU0VDVElPTl9FTkQpCisjaWZkZWYgVEFSR0VUX1dJTk5UCitfX2RlY2xzcGVjKGFsaWduKHNpemVvZihJbml0VGFibGVFbnRyeSkpKQorc3RhdGljIEluaXRUYWJsZUVudHJ5IF9fb2ZmbG9hZF9teW9fc2hhcmVkX2luaXRfdGFibGVfZW5kID0geyAoY29uc3QgY2hhciopLTEsIDAgfTsKKyNlbHNlIC8vIFRBUkdFVF9XSU5OVAorc3RhdGljIEluaXRUYWJsZUVudHJ5IF9fb2ZmbG9hZF9teW9fc2hhcmVkX2luaXRfdGFibGVfZW5kID0geyAwIH07CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisjZW5kaWYgLy8gSE9TVF9MSUJSQVJZCisKKy8vIG9mZmxvYWQgbXlvIGZwdHIgc2VjdGlvbiBlcGlsb2cKK0FMTE9DQVRFKE9GRkxPQURfTVlPX0ZQVFJfVEFCTEVfU0VDVElPTl9FTkQpCisjaWZkZWYgVEFSR0VUX1dJTk5UCitfX2RlY2xzcGVjKGFsaWduKHNpemVvZihGcHRyVGFibGVFbnRyeSkpKQorc3RhdGljIEZwdHJUYWJsZUVudHJ5IF9fb2ZmbG9hZF9teW9fZnB0cl90YWJsZV9lbmQgPSB7IChjb25zdCBjaGFyKiktMSwgMCwgMCB9OworI2Vsc2UgLy8gVEFSR0VUX1dJTk5UCitzdGF0aWMgRnB0clRhYmxlRW50cnkgX19vZmZsb2FkX215b19mcHRyX3RhYmxlX2VuZCA9IHsgMCB9OworI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorCisjZW5kaWYgLy8gTVlPX1NVUFBPUlQKZGlmZiAtLWdpdCBhL2ZpbmFsL29mZmxvYWQvc3JjL29yc2wtbGl0ZS9pbmNsdWRlL29yc2wtbGl0ZS5oIGIvZmluYWwvb2ZmbG9hZC9zcmMvb3JzbC1saXRlL2luY2x1ZGUvb3JzbC1saXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI2YTMzNQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvc3JjL29yc2wtbGl0ZS9pbmNsdWRlL29yc2wtbGl0ZS5oCkBAIC0wLDAgKzEsMjIxIEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgX09SU0xfTElURV9IXworI2RlZmluZSBfT1JTTF9MSVRFX0hfCisKKyNpZm5kZWYgVEFSR0VUX1dJTk5UCisjaW5jbHVkZSA8c2NoZWQuaD4KKyNlbHNlCisjZGVmaW5lIGNwdV9zZXRfdCBpbnQKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKiBUeXBlIG9mIGEgT1JTTEJ1c3lTZXQgKi8KK3R5cGVkZWYgZW51bSBPUlNMQnVzeVNldFR5cGUgeworICAgIEJVU1lfU0VUX0VNUFRZID0gMCwgICAgIC8qKjwgRW1wdHkgc2V0ICovCisgICAgQlVTWV9TRVRfUEFSVElBTCA9IDEsICAgLyoqPCBOb24tZW1wdHkgc2V0IHRoYXQgb21pdHMgc29tZSB0aHJlYWRzICovCisgICAgQlVTWV9TRVRfRlVMTCA9IDIgICAgICAgLyoqPCBBIHNldCB0aGF0IGluY2x1ZGVzIGFsbCB0aHJlYWRzIG9uIHRoZSBjYXJkICovCit9IEJ1c3lTZXRUeXBlOworCisvKiogT1JTTEJ1c3lTZXQgZW5jYXBzdWxhdGlvbiAqLwordHlwZWRlZiBzdHJ1Y3QgT1JTTEJ1c3lTZXQgeworICAgIEJ1c3lTZXRUeXBlIHR5cGU7ICAgLyoqPCBTZXQgdHlwZSAqLworI2lmZGVmIF9fbGludXhfXworICAgIGNwdV9zZXRfdCBjcHVfc2V0OyAgLyoqPCBDUFUgbWFzayAodW51c2VkIGZvciBCVVNZX1NFVF9FTVBUWSBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJVU1lfU0VUX1BBUlRJQUwgc2V0cykgcmVwcmVzZW50ZWQgYnkgdGhlIHN0YW5kYXJkCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMaW51eCBDUFUgc2V0IHR5cGUgLS0gY3B1X3NldF90LiBUaHJlYWRzIGFyZSBudW1iZXJlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRpbmcgZnJvbSAwLiBUaGUgbWF4aW1hbCBwb3NzaWJsZSB0aHJlYWQgbnVtYmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBzeXN0ZW0tc3BlY2lmaWMuIFNlZSBDUFVfU0VUKDMpIGZhbWlseSBvZiBtYWNyb3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBtb3JlIGRldGFpbHMuIFVudXNlZCBpbiBPUlNMIExpdGUuICovCisjZW5kaWYKK30gT1JTTEJ1c3lTZXQ7CisKKy8qKiBDbGllbnQgdGFnICovCit0eXBlZGVmIGNoYXIqIE9SU0xUYWc7CisKKy8qKiBNYXhpbWFsIGxlbmd0aCBvZiB0YWcgaW4gY2hhcmFjdGVycyAqLworI2RlZmluZSBPUlNMX01BWF9UQUdfTEVOIDEyOAorCisvKiogTWF4aW1hbCBudW1iZXIgb2YgY2FyZHMgdGhhdCBjYW4gYmUgbWFuYWdlZCBieSBPUlNMICovCisjZGVmaW5lIE9SU0xfTUFYX0NBUkRTIDMyCisKKy8qKiBSZXNlcnZlcyBjb21wdXRhdGlvbmFsIHJlc291cmNlcyBvbiBhIHNldCBvZiBjYXJkcy4gQmxvY2tzLgorICoKKyAqIElmIGFueSBvZiB0aGUgcmVzb3VyY2VzIGNhbm5vdCBiZSByZXNlcnZlZCwgdGhpcyBmdW5jdGlvbiB3aWxsIGJsb2NrIHVudGlsCisgKiB0aGV5IGJlY29tZSBhdmFpbGFibGUuIFJlc2VydmF0aW9uIGNhbiBiZSByZWN1cnNpdmUgaWYgcGVyZm9ybWVkIGJ5IHRoZQorICogc2FtZSB0YWcuIEEgcmVjdXJzaXZlbHkgcmVzZXJ2ZWQgcmVzb3VyY2UgbXVzdCBiZSByZWxlYXNlZCB0aGUgc2FtZSBudW1iZXIKKyAqIG9mIHRpbWVzIGl0IHdhcyByZXNlcnZlZC4KKyAqCisgKiBAc2VlIE9SU0xUcnlSZXNlcnZlCisgKgorICogQHBhcmFtW2luXSAgbiAgICAgIE51bWJlciBvZiBjYXJkcyB0byByZXNlcnZlIHJlc291cmNlcyBvbi4gQ2Fubm90IGJlIDwgMAorICogICAgICAgICAgICAgICAgICAgIG9yID4gT1JTTF9NQVhfQ0FSRFMuCisgKgorICogQHBhcmFtW2luXSAgaW5kcyAgIEluZGljZXMgb2YgdGhlIGNhcmRzOiBhbiBpbnRlZ2VyIGFycmF5IHdpdGggbiBlbGVtZW50cy4KKyAqICAgICAgICAgICAgICAgICAgICBDYW5ub3QgYmUgTlVMTCBpZiBuID4gMC4gVmFsaWQgY2FyZCBpbmRpY2VzIGFyZSBmcm9tIDAKKyAqICAgICAgICAgICAgICAgICAgICB0byBPUlNMX01BWF9DQVJEUy0xLiBDYW5ub3QgY29udGFpbiBkdXBsaWNhdGUgZWxlbWVudHMuCisgKgorICogQHBhcmFtW2luXSAgYnNldHMgIFJlcXVlc3RlZCByZXNvdXJjZXMgb24gZWFjaCBvZiB0aGUgY2FyZC4gQ2Fubm90IGJlIE5VTEwKKyAqICAgICAgICAgICAgICAgICAgICBpZiBuID4gMC4KKyAqCisgKiBAcGFyYW1baW5dICB0YWcgICAgT1JTTFRhZyBvZiB0aGUgY2FsbGluZyBjbGllbnQuIENhbm5vdCBiZSBOVUxMLiBMZW5ndGgKKyAqICAgICAgICAgICAgICAgICAgICBtdXN0IG5vdCBleGVlZCBPUlNMX01BWF9UQUdfTEVOLgorICoKKyAqIEByZXR1cm5zICAgIDAgICAgICBpZiB0aGUgcmVzb3VyY2VzIHdlcmUgc3VjY2Vzc2Z1bGx5IHJlc2VydmVkCisgKgorICogQHJldHVybnMgICAgRUlOVkFMIGlmIGFueSBvZiB0aGUgYXJndW1lbnRzIGlzIGludmFsaWQKKyAqCisgKiBAcmV0dXJucyAgICBFQUdBSU4gbGltaXQgb2YgcmVjdXJzaXZlIHJlc2VydmF0aW9ucyByZWFjaGVkCisgKiAgICAgICAgICAgICAgICAgICAgKG5vdCBpbiBPUlNMIExpdGUpCisgKgorICogQHJldHVybnMgICAgRU5PU1lTIChpbiBPUlNMIExpdGUpIGlmIHR5cGUgb2YgYW55IG9mIHRoZSBidXN5IHNldHMgaXMKKyAqICAgICAgICAgICAgICAgICAgICBlcXVhbCB0byBCVVNZX1NFVF9QQVJUSUFMCisgKi8KK2ludCBPUlNMUmVzZXJ2ZShjb25zdCBpbnQgbiwgY29uc3QgaW50ICpfX3Jlc3RyaWN0IGluZHMsCisgICAgICAgICAgICAgICAgY29uc3QgT1JTTEJ1c3lTZXQgKl9fcmVzdHJpY3QgYnNldHMsCisgICAgICAgICAgICAgICAgY29uc3QgT1JTTFRhZyBfX3Jlc3RyaWN0IHRhZyk7CisKKy8qKiBSZXNlcnZlcyBjb21wdXRhdGlvbmFsIHJlc291cmNlcyBvbiBhIHNldCBvZiBjYXJkcy4gRG9lcyBub3QgYmxvY2suCisgKgorICogSWYgYW55IG9mIHRoZSByZXNvdXJjZXMgY2Fubm90IGJlIHJlc2VydmVkLCB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuCisgKiBpbW1lZGlhdGVseS4gUmVzZXJ2YXRpb24gY2FuIGJlIHJlY3Vyc2l2ZSBpZiBwZXJmb3JtZWQgYnkgdGhlIHNhbWUgdGFnLgorICogQSByZWN1cnNpdmVseSByZXNlcnZlZCByZXNvdXJjZSBtdXN0IGJlIHJlbGVhc2VkIHRoZSBzYW1lIG51bWJlciBvZiB0aW1lcworICogaXQgd2FzIHJlc2VydmVkLgorICoKKyAqIEBzZWUgT1JTTFJlc2VydmUKKyAqCisgKiBAcGFyYW1baW5dICBuICAgICAgTnVtYmVyIG9mIGNhcmRzIHRvIHJlc2VydmUgcmVzb3VyY2VzIG9uLiBDYW5ub3QgYmUgPCAwCisgKiAgICAgICAgICAgICAgICAgICAgb3IgPiBPUlNMX01BWF9DQVJEUy4KKyAqCisgKiBAcGFyYW1baW5dICBpbmRzICAgICBJbmRpY2VzIG9mIHRoZSBjYXJkczogYW4gaW50ZWdlciBhcnJheSB3aXRoIG4gZWxlbWVudHMuCisgKiAgICAgICAgICAgICAgICAgICAgICBDYW5ub3QgYmUgTlVMTCBpZiBuID4gMC4gVmFsaWQgY2FyZCBpbmRpY2VzIGFyZSBmcm9tIDAKKyAqICAgICAgICAgICAgICAgICAgICAgIHRvIE9SU0xfTUFYX0NBUkRTLTEuIENhbm5vdCBjb250YWluIGR1cGxpY2F0ZSBlbGVtZW50cy4KKyAqCisgKiBAcGFyYW1baW5vdXRdIGJzZXRzICBSZXF1ZXN0ZWQgcmVzb3VyY2VzIG9uIGVhY2ggb2YgdGhlIGNhcmQuIENhbm5vdCBiZQorICogICAgICAgICAgICAgICAgICAgICAgTlVMTCBpZiBuID4gMC4KKyAqCisgKiBAcGFyYW1baW5dICAgIHRhZyAgICBPUlNMVGFnIG9mIHRoZSBjYWxsaW5nIGNsaWVudC4gQ2Fubm90IGJlIE5VTEwuIExlbmd0aAorICogICAgICAgICAgICAgICAgICAgICAgbXVzdCBub3QgZXhjZWVkIE9SU0xfTUFYX1RBR19MRU4uCisgKgorICogQHJldHVybnMgICAgICAwICAgICAgaWYgdGhlIHJlc291cmNlcyB3ZXJlIHN1Y2Nlc3NmdWxseSByZXNlcnZlZAorICoKKyAqIEByZXR1cm5zICAgICAgRUJVU1kgIGlmIHNvbWUgb2YgdGhlIHJlcXVlc3RlZCByZXNvdXJjZXMgYXJlIGJ1c3kKKyAqCisgKiBAcmV0dXJucyAgICAgIEVJTlZBTCBpZiBhbnkgb2YgdGhlIGFyZ3VtZW50cyBpcyBpbnZhbGlkCisgKgorICogQHJldHVybnMgICAgICBFQUdBSU4gbGltaXQgb2YgcmVjdXJzaXZlIHJlc2VydmF0aW9ucyByZWFjaGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAobm90IGluIE9SU0wgTGl0ZSkKKyAqCisgKiBAcmV0dXJucyAgICAgIEVOT1NZUyAoaW4gT1JTTCBMaXRlKSBpZiB0eXBlIG9mIGFueSBvZiB0aGUgYnVzeSBzZXRzIGlzCisgKiAgICAgICAgICAgICAgICAgICAgICBlcXVhbCB0byBCVVNZX1NFVF9QQVJUSUFMCisgKi8KK2ludCBPUlNMVHJ5UmVzZXJ2ZShjb25zdCBpbnQgbiwgY29uc3QgaW50ICpfX3Jlc3RyaWN0IGluZHMsCisgICAgICAgICAgICAgICAgICAgY29uc3QgT1JTTEJ1c3lTZXQgKl9fcmVzdHJpY3QgYnNldHMsCisgICAgICAgICAgICAgICAgICAgY29uc3QgT1JTTFRhZyBfX3Jlc3RyaWN0IHRhZyk7CisKKy8qKiBHcmFudWxhcmlmeSBvZiBwYXJ0aWFsIHJlc2VydmF0aW9uICovCit0eXBlZGVmIGVudW0gT1JTTFBhcnRpYWxHcmFudWxhcml0eSB7CisgICAgR1JBTl9DQVJEID0gMCwgLyoqPCBDYXJkIGdyYW51bGFyaXR5ICovCisgICAgR1JBTl9USFJFQUQgPSAxIC8qKjwgVGhyZWFkIGdyYW51bGFyaXR5ICovCit9IE9SU0xQYXJ0aWFsR3JhbnVsYXJpdHk7CisKKy8qKiBSZXF1ZXN0cyByZXNlcnZhdGlvbiBvZiBzb21lIG9mIGNvbXB1dGF0aW9uYWwgcmVzb3VyY2VzIG9uIGEgc2V0IG9mIGNhcmRzLgorICogRG9lcyBub3QgYmxvY2suIFVwZGF0ZXMgdXNlci1wcm92aWRlZCBic2V0cyB0byBpbmRpY2F0ZSB3aGljaCByZXNvdXJjZXMKKyAqIHdlcmUgcmVzZXJ2ZWQuCisgKgorICogSWYgYW55IG9mIHRoZSByZXNvdXJjZXMgY2Fubm90IGJlIHJlc2VydmVkLCB0aGlzIGZ1bmN0aW9uIHdpbGwgdXBkYXRlIGJ1c3kKKyAqIHNldHMgcHJvdmlkZWQgYnkgdGhlIGNhbGxlciB0byByZWZsZWN0IHdoYXQgcmVzb3VyY2VzIHdlcmUgYWN0dWFsbHkKKyAqIHJlc2VydmVkLiBUaGlzIGZ1bmN0aW9uIHN1cHBvcnRzIHR3byBncmFudWxhcml0eSBtb2RlczogJ2NhcmQnIGFuZAorICogJ3RocmVhZCcuICBXaGVuIGdyYW51bGFyaXR5IGlzIHNldCB0byAnY2FyZCcsIGEgZmFpbHVyZSB0byByZXNlcnZlIGEgdGhyZWFkCisgKiBvbiB0aGUgY2FyZCB3aWxsIGltcGx5IHRoYXQgcmVzZXJ2YXRpb24gaGFzIGZhaWxlZCBmb3IgdGhlIHdob2xlIGNhcmQuIFdoZW4KKyAqIGdyYW51bGFyaXR5IGlzIHNldCB0byAndGhyZWFkJywgcmVzZXJ2YXRpb24gb24gYSBjYXJkIHdpbGwgYmUgY29uc2lkZXJlZAorICogc3VjY2Vzc2Z1bCBhcyBsb25nIGFzIGF0IGxlYXN0IG9uZSB0aHJlYWQgb24gdGhlIGNhcmQgd2FzIHN1Y2Nlc3NmdWxseQorICogcmVzZXJ2ZWQuIFJlc2VydmF0aW9uIGNhbiBiZSByZWN1cnNpdmUgaWYgcGVyZm9ybWVkIGJ5IHRoZSBzYW1lIHRhZy4gQQorICogcmVjdXJzaXZlbHkgcmVzZXJ2ZWQgcmVzb3VyY2UgbXVzdCBiZSByZWxlYXNlZCB0aGUgc2FtZSBudW1iZXIgb2YgdGltZXMgaXQKKyAqIHdhcyByZXNlcnZlZC4KKyAqCisgKiBAcGFyYW1baW5dICBncmFuICAgUmVzZXJ2YXRpb24gZ3JhbnVsYXJpdHkKKyAqCisgKiBAcGFyYW1baW5dICBuICAgICAgTnVtYmVyIG9mIGNhcmRzIHRvIHJlc2VydmUgcmVzb3VyY2VzIG9uLiBDYW5ub3QgYmUgPCAwCisgKiAgICAgICAgICAgICAgICAgICAgb3IgPiBPUlNMX01BWF9DQVJEUy4KKyAqCisgKiBAcGFyYW1baW5dICBpbmRzICAgSW5kaWNlcyBvZiB0aGUgY2FyZHM6IGFuIGludGVnZXIgYXJyYXkgd2l0aCBuIGVsZW1lbnRzLgorICogICAgICAgICAgICAgICAgICAgIENhbm5vdCBiZSBOVUxMIGlmIG4gPiAwLiBWYWxpZCBjYXJkIGluZGljZXMgYXJlIGZyb20gMAorICogICAgICAgICAgICAgICAgICAgIHRvIE9SU0xfTUFYX0NBUkRTLTEuIENhbm5vdCBjb250YWluIGR1cGxpY2F0ZSBlbGVtZW50cy4KKyAqCisgKiBAcGFyYW1baW5dICBic2V0cyAgUmVxdWVzdGVkIHJlc291cmNlcyBvbiBlYWNoIG9mIHRoZSBjYXJkLiBDYW5ub3QgYmUgTlVMTAorICogICAgICAgICAgICAgICAgICAgIGlmIG4gPiAwLgorICoKKyAqIEBwYXJhbVtpbl0gIHRhZyAgICBPUlNMVGFnIG9mIHRoZSBjYWxsaW5nIGNsaWVudC4gQ2Fubm90IGJlIE5VTEwuIExlbmd0aAorICogICAgICAgICAgICAgICAgICAgIG11c3Qgbm90IGV4Y2VlZCBPUlNMX01BWF9UQUdfTEVOLgorICoKKyAqIEByZXR1cm5zICAgIDAgICAgICBpZiBhdCBsZWFzdCBzb21lIG9mIHRoZSByZXNvdXJjZXMgd2VyZSBzdWNjZXNzZnVsbHkKKyAqICAgICAgICAgICAgICAgICAgICByZXNlcnZlZAorICoKKyAqIEByZXR1cm5zICAgIEVCVVNZICBpZiBhbGwgb2YgdGhlIHJlcXVlc3RlZCByZXNvdXJjZXMgYXJlIGJ1c3kKKyAqCisgKiBAcmV0dXJucyAgICBFSU5WQUwgaWYgYW55IG9mIHRoZSBhcmd1bWVudHMgaXMgaW52YWxpZAorICoKKyAqIEByZXR1cm5zICAgIEVBR0FJTiBsaW1pdCBvZiByZWN1cnNpdmUgcmVzZXJ2YXRpb25zIHJlYWNoZWQKKyAqICAgICAgICAgICAgICAgICAgICAobm90IGluIE9SU0wgTGl0ZSkKKyAqCisgKiBAcmV0dXJucyAgICBFTk9TWVMgKGluIE9SU0wgTGl0ZSkgaWYgdHlwZSBvZiBhbnkgb2YgdGhlIGJ1c3kgc2V0cyBpcworICogICAgICAgICAgICAgICAgICAgIGVxdWFsIHRvIEJVU1lfU0VUX1BBUlRJQUwKKyAqLworaW50IE9SU0xSZXNlcnZlUGFydGlhbChjb25zdCBPUlNMUGFydGlhbEdyYW51bGFyaXR5IGdyYW4sIGNvbnN0IGludCBuLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgKl9fcmVzdHJpY3QgaW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgT1JTTEJ1c3lTZXQgKl9fcmVzdHJpY3QgYnNldHMsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9SU0xUYWcgX19yZXN0cmljdCB0YWcpOworCisvKiogUmVsZWFzZXMgcHJldmlvdXNseSByZXNlcnZlZCBjb21wdXRhdGlvbmFsIHJlc291cmNlcyBvbiBhIHNldCBvZiBjYXJkcy4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgZmFpbCBpZiBhbnkgb2YgdGhlIHJlc291cmNlcyB0byBiZSByZWxlYXNlZCB3ZXJlIG5vdAorICogcmVzZXJ2ZWQgYnkgdGhlIGNhbGxpbmcgY2xpZW50LgorICoKKyAqIEBzZWUgT1JTTFJlc2VydmUKKyAqIEBzZWUgT1JTTFRyeVJlc2VydmUKKyAqIEBzZWUgT1JTTFJlc2VydmVQYXJ0aWFsCisgKgorICogQHBhcmFtW2luXSAgbiAgICAgIE51bWJlciBvZiBjYXJkcyB0byByZXNlcnZlIHJlc291cmNlcyBvbi4gQ2Fubm90IGJlIDwgMAorICogICAgICAgICAgICAgICAgICAgIG9yID4gT1JTTF9NQVhfQ0FSRFMuCisgKgorICogQHBhcmFtW2luXSAgaW5kcyAgIEluZGljZXMgb2YgdGhlIGNhcmRzOiBhbiBpbnRlZ2VyIGFycmF5IHdpdGggbiBlbGVtZW50cy4KKyAqICAgICAgICAgICAgICAgICAgICBDYW5ub3QgYmUgTlVMTCBpZiBuID4gMC4gVmFsaWQgY2FyZCBpbmRpY2VzIGFyZSBmcm9tIDAKKyAqICAgICAgICAgICAgICAgICAgICB0byBPUlNMX01BWF9DQVJEUy0xLiBDYW5ub3QgY29udGFpbiBkdXBsaWNhdGUgZWxlbWVudHMuCisgKgorICogQHBhcmFtW2luXSAgYnNldHMgIFJlcXVlc3RlZCByZXNvdXJjZXMgb24gZWFjaCBvZiB0aGUgY2FyZC4gQ2Fubm90IGJlIE5VTEwKKyAqICAgICAgICAgICAgICAgICAgICBpZiBuID4gMC4KKyAqCisgKiBAcGFyYW1baW5dICB0YWcgICAgT1JTTFRhZyBvZiB0aGUgY2FsbGluZyBjbGllbnQuIENhbm5vdCBiZSBOVUxMLiBMZW5ndGgKKyAqICAgICAgICAgICAgICAgICAgICBtdXN0IG5vdCBleGNlZWQgT1JTTF9NQVhfVEFHX0xFTi4KKyAqCisgKiBAcmV0dXJucyAgICAwICAgICAgaWYgdGhlIHJlc291cmNlcyB3ZXJlIHN1Y2Nlc3NmdWxseSByZWxlYXNlZAorICoKKyAqIEByZXR1cm5zICAgIEVJTlZBTCBpZiBhbnkgb2YgdGhlIGFyZ3VtZW50cyBpcyBpbnZhbGlkCisgKgorICogQHJldHVybnMgICAgRVBFUk0gIHRoZSBjYWxsaW5nIGNsaWVudCBkaWQgbm90IHJlc2VydmUgc29tZSBvZiB0aGUKKyAqICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMgaXQgaXMgdHJ5aW5nIHRvIHJlbGVhc2UuCisgKgorICogQHJldHVybnMgICAgRU5PU1lTIChpbiBPUlNMIExpdGUpIGlmIHR5cGUgb2YgYW55IG9mIHRoZSBidXN5IHNldHMgaXMKKyAqICAgICAgICAgICAgICAgICAgICBlcXVhbCB0byBCVVNZX1NFVF9QQVJUSUFMCisgKi8KK2ludCBPUlNMUmVsZWFzZShjb25zdCBpbnQgbiwgY29uc3QgaW50ICpfX3Jlc3RyaWN0IGluZHMsCisgICAgICAgICAgICAgICAgY29uc3QgT1JTTEJ1c3lTZXQgKl9fcmVzdHJpY3QgYnNldHMsCisgICAgICAgICAgICAgICAgY29uc3QgT1JTTFRhZyBfX3Jlc3RyaWN0IHRhZyk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZmluYWwvb2ZmbG9hZC9zcmMvb3JzbC1saXRlL2xpYi9vcnNsLWxpdGUuYyBiL2ZpbmFsL29mZmxvYWQvc3JjL29yc2wtbGl0ZS9saWIvb3JzbC1saXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjIxY2RhNwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvc3JjL29yc2wtbGl0ZS9saWIvb3JzbC1saXRlLmMKQEAgLTAsMCArMSwzMzcgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNpbmNsdWRlICJvcnNsLWxpdGUvaW5jbHVkZS9vcnNsLWxpdGUuaCIKKworI2RlZmluZSBESVNBQkxFX1NZTUJPTF9WRVJTSU9OSU5HCisKKyNpZiBkZWZpbmVkKF9fbGludXhfXykgJiYgIWRlZmluZWQoRElTQUJMRV9TWU1CT0xfVkVSU0lPTklORykKKyNkZWZpbmUgc3ltdmVyKHNyYywgdGd0LCB2ZXJzdHIpIF9fYXNtX18oIi5zeW12ZXIgIiAjc3JjICIsIiAjdGd0IHZlcnN0cikKK3N5bXZlcihPUlNMUmVzZXJ2ZTAsIE9SU0xSZXNlcnZlLCAiQEBPUlNMXzAuMCIpOworc3ltdmVyKE9SU0xUcnlSZXNlcnZlMCwgT1JTTFRyeVJlc2VydmUsICJAQE9SU0xfMC4wIik7CitzeW12ZXIoT1JTTFJlc2VydmVQYXJ0aWFsMCwgT1JTTFJlc2VydmVQYXJ0aWFsLCAiQEBPUlNMXzAuMCIpOworc3ltdmVyKE9SU0xSZWxlYXNlMCwgT1JTTFJlbGVhc2UsICJAQE9SU0xfMC4wIik7CisjZWxzZQorI2RlZmluZSBPUlNMUmVzZXJ2ZTAgT1JTTFJlc2VydmUKKyNkZWZpbmUgT1JTTFRyeVJlc2VydmUwIE9SU0xUcnlSZXNlcnZlCisjZGVmaW5lIE9SU0xSZXNlcnZlUGFydGlhbDAgT1JTTFJlc2VydmVQYXJ0aWFsCisjZGVmaW5lIE9SU0xSZWxlYXNlMCBPUlNMUmVsZWFzZQorI2VuZGlmCisKKyNpZmRlZiBfX2xpbnV4X18KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CitzdGF0aWMgcHRocmVhZF9tdXRleF90IGdsb2JhbF9tdXRleCA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7CitzdGF0aWMgcHRocmVhZF9jb25kX3QgcmVsZWFzZV9jb25kID0gUFRIUkVBRF9DT05EX0lOSVRJQUxJWkVSOworI2VuZGlmCisKKyNpZmRlZiBfV0lOMzIKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjcHJhZ21hIGludHJpbnNpYyhfUmVhZFdyaXRlQmFycmllcikKK3N0YXRpYyBTUldMT0NLIGdsb2JhbF9tdXRleCA9IFNSV0xPQ0tfSU5JVDsKK3N0YXRpYyB2b2xhdGlsZSBpbnQgcmVsZWFzZV9jb25kX2luaXRpYWxpemVkID0gMDsKK3N0YXRpYyBDT05ESVRJT05fVkFSSUFCTEUgcmVsZWFzZV9jb25kOworCitzdGF0aWMgdm9pZCBzdGF0ZV9sYXp5X2luaXRfc3luYygpCit7CisgICAgaWYgKCFyZWxlYXNlX2NvbmRfaW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgQWNxdWlyZVNSV0xvY2tFeGNsdXNpdmUoJmdsb2JhbF9tdXRleCk7CisgICAgICAgIF9SZWFkV3JpdGVCYXJyaWVyKCk7CisgICAgICAgIGlmICghcmVsZWFzZV9jb25kX2luaXRpYWxpemVkKSB7CisgICAgICAgICAgICBJbml0aWFsaXplQ29uZGl0aW9uVmFyaWFibGUoJnJlbGVhc2VfY29uZCk7CisgICAgICAgICAgICByZWxlYXNlX2NvbmRfaW5pdGlhbGl6ZWQgPSAxOworICAgICAgICB9CisgICAgICAgIFJlbGVhc2VTUldMb2NrRXhjbHVzaXZlKCZnbG9iYWxfbXV0ZXgpOworICAgIH0KK30KKyNlbmRpZgorCitzdGF0aWMgaW50IHN0YXRlX2xvY2soKQoreworI2lmZGVmIF9fbGludXhfXworICAgIHJldHVybiBwdGhyZWFkX211dGV4X2xvY2soJmdsb2JhbF9tdXRleCk7CisjZW5kaWYKKworI2lmZGVmIF9XSU4zMgorICAgIEFjcXVpcmVTUldMb2NrRXhjbHVzaXZlKCZnbG9iYWxfbXV0ZXgpOworICAgIHJldHVybiAwOworI2VuZGlmCit9CisKK3N0YXRpYyBpbnQgc3RhdGVfdW5sb2NrKCkKK3sKKyNpZmRlZiBfX2xpbnV4X18KKyAgICByZXR1cm4gcHRocmVhZF9tdXRleF91bmxvY2soJmdsb2JhbF9tdXRleCk7CisjZW5kaWYKKworI2lmZGVmIF9XSU4zMgorICAgIFJlbGVhc2VTUldMb2NrRXhjbHVzaXZlKCZnbG9iYWxfbXV0ZXgpOworICAgIHJldHVybiAwOworI2VuZGlmCit9CisKK3N0YXRpYyBpbnQgc3RhdGVfd2FpdF9mb3JfcmVsZWFzZSgpCit7CisjaWZkZWYgX19saW51eF9fCisgICAgcmV0dXJuIHB0aHJlYWRfY29uZF93YWl0KCZyZWxlYXNlX2NvbmQsICZnbG9iYWxfbXV0ZXgpOworI2VuZGlmCisKKyNpZmRlZiBfV0lOMzIKKyAgICByZXR1cm4gU2xlZXBDb25kaXRpb25WYXJpYWJsZVNSVygmcmVsZWFzZV9jb25kLAorICAgICAgICAgICAgJmdsb2JhbF9tdXRleCwgSU5GSU5JVEUsIDApID09IDAgPyAxIDogMDsKKyNlbmRpZgorfQorCitzdGF0aWMgaW50IHN0YXRlX3NpZ25hbF9yZWxlYXNlKCkKK3sKKyNpZmRlZiBfX2xpbnV4X18KKyAgICByZXR1cm4gcHRocmVhZF9jb25kX3NpZ25hbCgmcmVsZWFzZV9jb25kKTsKKyNlbmRpZgorCisjaWZkZWYgX1dJTjMyCisgICAgV2FrZUNvbmRpdGlvblZhcmlhYmxlKCZyZWxlYXNlX2NvbmQpOworICAgIHJldHVybiAwOworI2VuZGlmCit9CisKK3N0YXRpYyBzdHJ1Y3QgeworICAgIGNoYXIgb3duZXJbT1JTTF9NQVhfVEFHX0xFTiArIDFdOworICAgIHVuc2lnbmVkIGxvbmcgcnNydl9jbnQ7Cit9IHJzcnZfZGF0YVtPUlNMX01BWF9DQVJEU107CisKK3N0YXRpYyBpbnQgY2hlY2tfYXJncyhjb25zdCBpbnQgbiwgY29uc3QgaW50ICpfX3Jlc3RyaWN0IGluZHMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT1JTTEJ1c3lTZXQgKl9fcmVzdHJpY3QgYnNldHMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT1JTTFRhZyBfX3Jlc3RyaWN0IHRhZykKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgY2FyZF9zcGVjaWZpZWRbT1JTTF9NQVhfQ0FSRFNdOworICAgIGlmICh0YWcgPT0gTlVMTCkgcmV0dXJuIC0xOworICAgIGlmIChzdHJsZW4oKGNoYXIgKil0YWcpID4gT1JTTF9NQVhfVEFHX0xFTikgcmV0dXJuIC0xOworICAgIGlmIChuIDwgMCB8fCBuID49IE9SU0xfTUFYX0NBUkRTKSByZXR1cm4gLTE7CisgICAgaWYgKG4gIT0gMCAmJiAoaW5kcyA9PSBOVUxMIHx8IGJzZXRzID09IE5VTEwpKSByZXR1cm4gLTE7CisgICAgZm9yIChpID0gMDsgaSA8IE9SU0xfTUFYX0NBUkRTOyBpKyspCisgICAgICAgIGNhcmRfc3BlY2lmaWVkW2ldID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIGludCBpbmQgPSBpbmRzW2ldOworICAgICAgICBpZiAoaW5kIDwgMCB8fCBpbmQgPj0gT1JTTF9NQVhfQ0FSRFMpIHJldHVybiAtMTsKKyAgICAgICAgaWYgKGNhcmRfc3BlY2lmaWVkW2luZF0pIHJldHVybiAtMTsKKyAgICAgICAgY2FyZF9zcGVjaWZpZWRbaW5kXSA9IDE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNoZWNrX2JzZXRzKGNvbnN0IGludCBuLCBjb25zdCBPUlNMQnVzeVNldCAqYnNldHMpCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICAgICAgaWYgKGJzZXRzW2ldLnR5cGUgPT0gQlVTWV9TRVRfUEFSVElBTCkgcmV0dXJuIC0xOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNhbl9yZXNlcnZlX2NhcmQoaW50IGNhcmQsIGNvbnN0IE9SU0xCdXN5U2V0ICpfX3Jlc3RyaWN0IGJzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT1JTTFRhZyBfX3Jlc3RyaWN0IHRhZykKK3sKKyAgICBhc3NlcnQodGFnICE9IE5VTEwpOworICAgIGFzc2VydChic2V0ICE9IE5VTEwpOworICAgIGFzc2VydChzdHJsZW4oKGNoYXIgKil0YWcpIDwgT1JTTF9NQVhfVEFHX0xFTik7CisgICAgYXNzZXJ0KGJzZXQtPnR5cGUgIT0gQlVTWV9TRVRfUEFSVElBTCk7CisKKyAgICByZXR1cm4gKGJzZXQtPnR5cGUgPT0gQlVTWV9TRVRfRU1QVFkgfHwKKyAgICAgICAgICAgICgocnNydl9kYXRhW2NhcmRdLnJzcnZfY250ID09IDAgfHwKKyAgICAgICAgICAgIHN0cm5jbXAoKGNoYXIgKil0YWcsCisgICAgICAgICAgICAgICAgcnNydl9kYXRhW2NhcmRdLm93bmVyLCBPUlNMX01BWF9UQUdfTEVOKSA9PSAwKSAmJgorICAgICAgICAgICAgcnNydl9kYXRhW2NhcmRdLnJzcnZfY250IDwgVUxPTkdfTUFYKSkgPyAwIDogLSAxOworfQorCitzdGF0aWMgdm9pZCByZXNlcnZlX2NhcmQoaW50IGNhcmQsIGNvbnN0IE9SU0xCdXN5U2V0ICpfX3Jlc3RyaWN0IGJzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT1JTTFRhZyBfX3Jlc3RyaWN0IHRhZykKK3sKKyAgICBhc3NlcnQodGFnICE9IE5VTEwpOworICAgIGFzc2VydChic2V0ICE9IE5VTEwpOworICAgIGFzc2VydChzdHJsZW4oKGNoYXIgKil0YWcpIDwgT1JTTF9NQVhfVEFHX0xFTik7CisgICAgYXNzZXJ0KGJzZXQtPnR5cGUgIT0gQlVTWV9TRVRfUEFSVElBTCk7CisKKyAgICBpZiAoYnNldC0+dHlwZSA9PSBCVVNZX1NFVF9FTVBUWSkKKyAgICAgICAgcmV0dXJuOworCisgICAgYXNzZXJ0KHJzcnZfZGF0YVtjYXJkXS5yc3J2X2NudCA9PSAwIHx8CisgICAgICAgICAgICBzdHJuY21wKChjaGFyICopdGFnLAorICAgICAgICAgICAgICAgIHJzcnZfZGF0YVtjYXJkXS5vd25lciwgT1JTTF9NQVhfVEFHX0xFTikgPT0gMCk7CisgICAgYXNzZXJ0KHJzcnZfZGF0YVtjYXJkXS5yc3J2X2NudCA8IFVMT05HX01BWCk7CisKKyAgICBpZiAocnNydl9kYXRhW2NhcmRdLnJzcnZfY250ID09IDApCisgICAgICAgIHN0cm5jcHkocnNydl9kYXRhW2NhcmRdLm93bmVyLCAoY2hhciAqKXRhZywgT1JTTF9NQVhfVEFHX0xFTik7CisgICAgcnNydl9kYXRhW2NhcmRdLm93bmVyW09SU0xfTUFYX1RBR19MRU5dID0gJ1wwJzsKKyAgICByc3J2X2RhdGFbY2FyZF0ucnNydl9jbnQrKzsKK30KKworc3RhdGljIGludCBjYW5fcmVsZWFzZV9jYXJkKGludCBjYXJkLCBjb25zdCBPUlNMQnVzeVNldCAqX19yZXN0cmljdCBic2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9SU0xUYWcgX19yZXN0cmljdCB0YWcpCit7CisgICAgYXNzZXJ0KHRhZyAhPSBOVUxMKTsKKyAgICBhc3NlcnQoYnNldCAhPSBOVUxMKTsKKyAgICBhc3NlcnQoc3RybGVuKChjaGFyICopdGFnKSA8IE9SU0xfTUFYX1RBR19MRU4pOworICAgIGFzc2VydChic2V0LT50eXBlICE9IEJVU1lfU0VUX1BBUlRJQUwpOworCisgICAgcmV0dXJuIChic2V0LT50eXBlID09IEJVU1lfU0VUX0VNUFRZIHx8IChyc3J2X2RhdGFbY2FyZF0ucnNydl9jbnQgPiAwICYmCisgICAgICAgICAgICAgICAgc3RybmNtcCgoY2hhciAqKXRhZywKKyAgICAgICAgICAgICAgICAgICAgcnNydl9kYXRhW2NhcmRdLm93bmVyLCBPUlNMX01BWF9UQUdfTEVOKSA9PSAwKSkgPyAwIDogMTsKK30KKworc3RhdGljIHZvaWQgcmVsZWFzZV9jYXJkKGludCBjYXJkLCBjb25zdCBPUlNMQnVzeVNldCAqX19yZXN0cmljdCBic2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9SU0xUYWcgX19yZXN0cmljdCB0YWcpCit7CisgICAgYXNzZXJ0KHRhZyAhPSBOVUxMKTsKKyAgICBhc3NlcnQoYnNldCAhPSBOVUxMKTsKKyAgICBhc3NlcnQoc3RybGVuKChjaGFyICopdGFnKSA8IE9SU0xfTUFYX1RBR19MRU4pOworICAgIGFzc2VydChic2V0LT50eXBlICE9IEJVU1lfU0VUX1BBUlRJQUwpOworCisgICAgaWYgKGJzZXQtPnR5cGUgPT0gQlVTWV9TRVRfRU1QVFkpCisgICAgICAgIHJldHVybjsKKworICAgIGFzc2VydChzdHJuY21wKChjaGFyICopdGFnLAorICAgICAgICAgICAgICAgIHJzcnZfZGF0YVtjYXJkXS5vd25lciwgT1JTTF9NQVhfVEFHX0xFTikgPT0gMCk7CisgICAgYXNzZXJ0KHJzcnZfZGF0YVtjYXJkXS5yc3J2X2NudCA+IDApOworCisgICAgcnNydl9kYXRhW2NhcmRdLnJzcnZfY250LS07Cit9CisKK2ludCBPUlNMUmVzZXJ2ZTAoY29uc3QgaW50IG4sIGNvbnN0IGludCAqX19yZXN0cmljdCBpbmRzLAorICAgICAgICAgICAgICAgIGNvbnN0IE9SU0xCdXN5U2V0ICpfX3Jlc3RyaWN0IGJzZXRzLAorICAgICAgICAgICAgICAgIGNvbnN0IE9SU0xUYWcgX19yZXN0cmljdCB0YWcpCit7CisgICAgaW50IGksIG9rOworCisgICAgaWYgKG4gPT0gMCkgcmV0dXJuIDA7CisgICAgaWYgKGNoZWNrX2FyZ3MobiwgaW5kcywgYnNldHMsIHRhZykgIT0gMCkgcmV0dXJuIEVJTlZBTDsKKyAgICBpZiAoY2hlY2tfYnNldHMobiwgYnNldHMpICE9IDApIHJldHVybiBFTk9TWVM7CisKKyAgICBzdGF0ZV9sb2NrKCk7CisKKyAgICAvKiBMb29wIHVudGlsIHdlIGZpbmQgdGhhdCBhbGwgdGhlIHJlc291cmNlcyB3ZSB3YW50IGFyZSBhdmFpbGFibGUgKi8KKyAgICBkbyB7CisgICAgICAgIG9rID0gMTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICAgICAgICAgIGlmIChjYW5fcmVzZXJ2ZV9jYXJkKGluZHNbaV0sICZic2V0c1tpXSwgdGFnKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgb2sgPSAwOworICAgICAgICAgICAgICAgIC8qIFdhaXQgZm9yIHNvbWVvbmUgdG8gcmVsZWFzZSBzb21lIHJlc291cmNlcyAqLworICAgICAgICAgICAgICAgIHN0YXRlX3dhaXRfZm9yX3JlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICB9IHdoaWxlICghb2spOworCisgICAgLyogQXQgdGhpcyBwb2ludCB3ZSBhcmUgZ29vZCB0byByZXNlcnZlX2NhcmQgdGhlIHJlc291cmNlcyB3ZSB3YW50ICovCisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICAgICAgcmVzZXJ2ZV9jYXJkKGluZHNbaV0sICZic2V0c1tpXSwgdGFnKTsKKworICAgIHN0YXRlX3VubG9jaygpOworICAgIHJldHVybiAwOworfQorCitpbnQgT1JTTFRyeVJlc2VydmUwKGNvbnN0IGludCBuLCBjb25zdCBpbnQgKl9fcmVzdHJpY3QgaW5kcywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBPUlNMQnVzeVNldCAqX19yZXN0cmljdCBic2V0cywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBPUlNMVGFnIF9fcmVzdHJpY3QgdGFnKQoreworICAgIGludCBpLCByYyA9IEVCVVNZOworCisgICAgaWYgKG4gPT0gMCkgcmV0dXJuIDA7CisgICAgaWYgKGNoZWNrX2FyZ3MobiwgaW5kcywgYnNldHMsIHRhZykgIT0gMCkgcmV0dXJuIEVJTlZBTDsKKyAgICBpZiAoY2hlY2tfYnNldHMobiwgYnNldHMpICE9IDApIHJldHVybiBFTk9TWVM7CisKKyAgICBzdGF0ZV9sb2NrKCk7CisKKyAgICAvKiBDaGVjayByZXNvdXJjZSBhdmFpbGFiaWxpdHkgb25jZSAqLworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgICAgICAgIGlmIChjYW5fcmVzZXJ2ZV9jYXJkKGluZHNbaV0sICZic2V0c1tpXSwgdGFnKSAhPSAwKQorICAgICAgICAgICAgZ290byBiYWlsX291dDsKKworICAgIC8qIEF0IHRoaXMgcG9pbnQgd2UgYXJlIGdvb2QgdG8gcmVzZXJ2ZSB0aGUgcmVzb3VyY2VzIHdlIHdhbnQgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICAgICAgICByZXNlcnZlX2NhcmQoaW5kc1tpXSwgJmJzZXRzW2ldLCB0YWcpOworCisgICAgcmMgPSAwOworCitiYWlsX291dDoKKyAgICBzdGF0ZV91bmxvY2soKTsKKyAgICByZXR1cm4gcmM7Cit9CisKK2ludCBPUlNMUmVzZXJ2ZVBhcnRpYWwwKGNvbnN0IE9SU0xQYXJ0aWFsR3JhbnVsYXJpdHkgZ3JhbiwgY29uc3QgaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAqX19yZXN0cmljdCBpbmRzLCBPUlNMQnVzeVNldCAqX19yZXN0cmljdCBic2V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT1JTTFRhZyBfX3Jlc3RyaWN0IHRhZykKK3sKKyAgICBpbnQgcmMgPSBFQlVTWTsKKyAgICBpbnQgaSwgbnVtX2F2YWlsID0gbjsKKworICAgIGlmIChuID09IDApIHJldHVybiAwOworICAgIGlmIChncmFuICE9IEdSQU5fQ0FSRCAmJiBncmFuICE9IEdSQU5fVEhSRUFEKSByZXR1cm4gRUlOVkFMOworICAgIGlmIChncmFuICE9IEdSQU5fQ0FSRCkgcmV0dXJuIEVJTlZBTDsKKyAgICBpZiAoY2hlY2tfYXJncyhuLCBpbmRzLCBic2V0cywgdGFnKSAhPSAwKSByZXR1cm4gRUlOVkFMOworICAgIGlmIChjaGVja19ic2V0cyhuLCBic2V0cykgIT0gMCkgcmV0dXJuIEVOT1NZUzsKKworICAgIHN0YXRlX2xvY2soKTsKKworICAgIC8qIENoZWNrIHJlc291cmNlIGF2YWlsYWJpbGl0eSBvbmNlOyByZW1vdmUgdW5hdmFpbGFibGUgcmVzb3VyY2VzIGZyb20gdGhlCisgICAgICogdXNlci1wcm92aWRlZCBsaXN0ICovCisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICAgICAgaWYgKGNhbl9yZXNlcnZlX2NhcmQoaW5kc1tpXSwgJmJzZXRzW2ldLCB0YWcpICE9IDApIHsKKyAgICAgICAgICAgIG51bV9hdmFpbC0tOworICAgICAgICAgICAgYnNldHNbaV0udHlwZSA9IEJVU1lfU0VUX0VNUFRZOworICAgICAgICB9CisKKyAgICBpZiAobnVtX2F2YWlsID09IDApCisgICAgICAgIGdvdG8gYmFpbF9vdXQ7CisKKyAgICAvKiBBdCB0aGlzIHBvaW50IHdlIGFyZSBnb29kIHRvIHJlc2VydmUgdGhlIHJlc291cmNlcyB3ZSB3YW50ICovCisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICAgICAgcmVzZXJ2ZV9jYXJkKGluZHNbaV0sICZic2V0c1tpXSwgdGFnKTsKKworICAgIHJjID0gMDsKKworYmFpbF9vdXQ6CisgICAgc3RhdGVfdW5sb2NrKCk7CisgICAgcmV0dXJuIHJjOworfQorCitpbnQgT1JTTFJlbGVhc2UwKGNvbnN0IGludCBuLCBjb25zdCBpbnQgKl9fcmVzdHJpY3QgaW5kcywKKyAgICAgICAgICAgICAgICBjb25zdCBPUlNMQnVzeVNldCAqX19yZXN0cmljdCBic2V0cywKKyAgICAgICAgICAgICAgICBjb25zdCBPUlNMVGFnIF9fcmVzdHJpY3QgdGFnKQoreworICAgIGludCBpLCByYyA9IEVQRVJNOworCisgICAgaWYgKG4gPT0gMCkgcmV0dXJuIDA7CisgICAgaWYgKGNoZWNrX2FyZ3MobiwgaW5kcywgYnNldHMsIHRhZykgIT0gMCkgcmV0dXJuIEVJTlZBTDsKKyAgICBpZiAoY2hlY2tfYnNldHMobiwgYnNldHMpICE9IDApIHJldHVybiBFTk9TWVM7CisKKyAgICBzdGF0ZV9sb2NrKCk7CisKKyAgICAvKiBDaGVjayB0aGF0IHdlIGNhbiByZWxlYXNlIGFsbCB0aGUgcmVzb3VyY2VzICovCisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICAgICAgaWYgKGNhbl9yZWxlYXNlX2NhcmQoaW5kc1tpXSwgJmJzZXRzW2ldLCB0YWcpICE9IDApCisgICAgICAgICAgICBnb3RvIGJhaWxfb3V0OworCisgICAgLyogQXQgdGhpcyBwb2ludCB3ZSBhcmUgZ29vZCB0byByZWxlYXNlIHRoZSByZXNvdXJjZXMgd2Ugd2FudCAqLworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgICAgICAgIHJlbGVhc2VfY2FyZChpbmRzW2ldLCAmYnNldHNbaV0sIHRhZyk7CisKKyAgICBzdGF0ZV9zaWduYWxfcmVsZWFzZSgpOworCisgICAgcmMgPSAwOworCitiYWlsX291dDoKKyAgICBzdGF0ZV91bmxvY2soKTsKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qIHZpbTpzZXQgZXQ6ICovCmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL3NyYy9vcnNsLWxpdGUvdmVyc2lvbi50eHQgYi9maW5hbC9vZmZsb2FkL3NyYy9vcnNsLWxpdGUvdmVyc2lvbi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI1ZjU5OQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvc3JjL29yc2wtbGl0ZS92ZXJzaW9uLnR4dApAQCAtMCwwICsxIEBACitPUlNMLWxpdGUgMC43CmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL3NyYy9yZHRzYy5oIGIvZmluYWwvb2ZmbG9hZC9zcmMvcmR0c2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTkxZDcxCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9zcmMvcmR0c2MuaApAQCAtMCwwICsxLDE3IEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK3VpbnQ2NF90IF9yZHRzYygpCit7CisgIHVpbnQzMl90IGVheCwgZWR4OworICBhc20gdm9sYXRpbGUgKCJyZHRzYyIgOiAiPWEiIChlYXgpLCAiPWQiIChlZHgpKTsKKyAgcmV0dXJuICgodWludDY0X3QpZWR4IDw8IDMyKSB8IGVheDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL29mZmxvYWQvc3JjL3VzZV9tcHNzMi50eHQgYi9maW5hbC9vZmZsb2FkL3NyYy91c2VfbXBzczIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0OGY0ODMKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL3NyYy91c2VfbXBzczIudHh0CkBAIC0wLDAgKzEgQEAKKzIuMS42NzIwLTEzCmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL3NyYy91c2VfbXBzc193aW4udHh0IGIvZmluYWwvb2ZmbG9hZC9zcmMvdXNlX21wc3Nfd2luLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDhmNDgzCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9zcmMvdXNlX21wc3Nfd2luLnR4dApAQCAtMCwwICsxIEBACisyLjEuNjcyMC0xMwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9CdWlsZF9XaXRoX0NNYWtlLnR4dCBiL2ZpbmFsL3J1bnRpbWUvQnVpbGRfV2l0aF9DTWFrZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM1YjlkMAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvQnVpbGRfV2l0aF9DTWFrZS50eHQKQEAgLTAsMCArMSwyMjQgQEAKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKKworICAgICAgICAgICAgICAgQnVpbGRpbmcgbGliaW9tcDUgdXNpbmcgQ01ha2UKKyAgICAgICAgICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgIC0tLS0gVmVyc2lvbiBvZiBDTWFrZSByZXF1aXJlZDogdjIuOC4wIG9yIGFib3ZlIC0tLS0KKyAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitIb3cgdG8gY2FsbCBjbWFrZSBpbml0aWFsbHksIHRoZW4gcmVwZWF0ZWRseQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy0gV2hlbiBjYWxsaW5nIGNtYWtlIGZvciB0aGUgZmlyc3QgdGltZSwgYWxsIG5lZWRlZCBjb21waWxlciBvcHRpb25zCisgIG11c3QgYmUgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUuICBBZnRlciB0aGlzIGluaXRpYWwgY2FsbCB0bworICBjbWFrZSwgdGhlIGNvbXBpbGVyIGRlZmluaXRpb25zIG11c3Qgbm90IGJlIGluY2x1ZGVkIGZvciBmdXJ0aGVyIGNhbGxzCisgIHRvIGNtYWtlLiAgT3RoZXIgb3B0aW9ucyBjYW4gYmUgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUgbXVsdGlwbGUKKyAgdGltZXMgaW5jbHVkaW5nIGFsbCBkZWZpbml0aW9ucyBpbiB0aGUgQnVpbGQgb3B0aW9ucyBzZWN0aW9uIGJlbG93LgorLSBFeGFtcGxlIG9mIGNvbmZpZ3VyaW5nLCBidWlsZGluZywgcmVjb25maWd1cmluZywgcmVidWlsZGluZzoKKyAgJCBta2RpciBidWlsZAorICAkIGNkIGJ1aWxkCisgICQgY21ha2UgLURDTUFLRV9DX0NPTVBJTEVSPWdjYyAtRENNQUtFX0NYWF9DT01QSUxFUj1nKysgLURhcmNoPTMyIC4uICAjIEluaXRpYWwgY29uZmlndXJhdGlvbgorICAkIG1ha2UgYWxsIGNvbW1vbgorICAuLi4KKyAgJCBtYWtlIGNsZWFuCisgICQgY21ha2UgLURhcmNoPTMyZSAtRENNQUtFX0JVSUxEX1RZUEU9RGVidWcgLi4gICAgICAgICAgICAgICAgICAgICAgICAjIFNlY29uZCBjb25maWd1cmF0aW9uCisgICQgbWFrZSBhbGwgY29tbW9uCisgIC4uLgorICAkIHJtIC1yZiAqCisgICQgY21ha2UgLURDTUFLRV9DX0NPTVBJTEVSPWdjYyAtRENNQUtFX0NYWF9DT01QSUxFUj1nKysgLURhcmNoPTMyZSAuLiAjIFRoaXJkIGNvbmZpZ3VyYXRpb24KKyAgJCBtYWtlIGFsbCBjb21tb24KKy0gTm90aWNlIGluIHRoZSBleGFtcGxlIGhvdyB0aGUgY29tcGlsZXIgZGVmaW5pdGlvbnMgYXJlIG9ubHkgc3BlY2lmaWVkCisgIGZvciBhbiBlbXB0eSBidWlsZCBkaXJlY3RvcnksIGJ1dCBvdGhlciBCdWlsZCBvcHRpb25zIGFyZSB1c2VkIGF0IGFueSB0aW1lLgorLSBUaGUgZmlsZSBDTWFrZUNhY2hlLnR4dCB3aGljaCBpcyBjcmVhdGVkIGFmdGVyIHRoZSBmaXJzdCBjYWxsIHRvIGNtYWtlCisgIGlzIGEgY29uZmlndXJhdGlvbiBmaWxlIHdoaWNoIGhvbGRzIGFsbCB0aGUgdmFsdWVzIGZvciB0aGUgQnVpbGQgb3B0aW9ucy4KKyAgVGhlc2UgY29uZmlndXJhdGlvbiB2YWx1ZXMgY2FuIGJlIGNoYW5nZWQgdXNpbmcgYSB0ZXh0IGVkaXRvciB0byBtb2RpZnkgCisgIENNYWtlQ2FjaGUudHh0IGFzIG9wcG9zZWQgdG8gdXNpbmcgZGVmaW5pdGlvbnMgb24gdGhlIGNvbW1hbmQgbGluZS4KKy0gVG8gaGF2ZSBjbWFrZSBjcmVhdGUgYSBwYXJ0aWN1bGFyIHR5cGUgb2YgYnVpbGQgZ2VuZXJhdG9yIGZpbGUgc2ltcGx5IAorICBpbmx1ZGUgdGhlIC1HIDxHZW5lcmF0b3IgbmFtZT4gb3B0aW9uOgorICAkIGNtYWtlIC1HICJVbml4IE1ha2VmaWxlcyIgLi4uCisgIFlvdSBjYW4gc2VlIGEgbGlzdCBvZiBnZW5lcmF0b3JzIGNtYWtlIHN1cHBvcnRzIGJ5IGV4ZWN1dGluZyBjbWFrZSB3aXRoCisgIG5vIGFyZ3VtZW50cyBhbmQgYSBsaXN0IHdpbGwgYmUgcHJpbnRlZC4KKworPT09PT09PT09PT09PT09PT09PT09CitJbnN0cnVjdGlvbnMgdG8gQnVpbGQKKz09PT09PT09PT09PT09PT09PT09PQorICQgY2QgbGlib21wX3RvcF9sZXZlbC8gWyBkaXJlY3Rvcnkgd2l0aCBzcmMvICwgZXhwb3J0cy8gLCB0b29scy8gLCBldGMuIF0KKyAkIG1rZGlyIGJ1aWxkCisgJCBjZCBidWlsZAorCisgWyBMaW51eCogLCBNYWMqIExpYnJhcmllcyBdCisgJCBjbWFrZSAtRENNQUtFX0NfQ09NUElMRVI9PEMgQ29tcGlsZXI+IC1EQ01BS0VfQ1hYX0NPTVBJTEVSPTxDKysgQ29tcGlsZXI+IC4uCisKKyBbIEludGVsKFIpIE1hbnkgSW50ZWdyYXRlZCBDb3JlIExpYnJhcnkgKEludGVsKFIpIE1JQyBMaWJyYXJ5KSBdCisgJCBjbWFrZSAtRENNQUtFX0NfQ09NUElMRVI9PEMgQ29tcGlsZXI+IC1EQ01BS0VfQ1hYX0NPTVBJTEVSPTxDKysgQ29tcGlsZXI+IC1Eb3M9bWljIC1EYXJjaD0zMmUgLi4KKworIFsgV2luZG93cyBMaWJyYXJpZXMgXQorICQgY21ha2UgLUcgIlVuaXggTWFrZWZpbGVzIiAtRENNQUtFX0NfQ09NUElMRVI9PEMgQ29tcGlsZXI+IC1EQ01BS0VfQ1hYX0NPTVBJTEVSPTxDKysgQ29tcGlsZXI+IC1EQ01BS0VfQVNNX01BU01fQ09NUElMRVI9W21sIHwgbWw2NF0gLURDTUFLRV9CVUlMRF9UWVBFPVJlbGVhc2UgLi4KKworICQgbWFrZSBhbGwgY29tbW9uCisKKz09PT09PT09PT09PT09PT09CitNYWMqIEZhdCBMaWJyYXJpZXMKKz09PT09PT09PT09PT09PT09CitPbiBPUyBYKiBtYWNoaW5lcywgaXQgaXMgcG9zc2libGUgdG8gYnVpbGQgdW5pdmVyc2FsIChvciBmYXQpIGxpYnJhcmllcyB3aGljaAoraW5jbHVkZSBib3RoIElBLTMyIGFyY2hpdGVjdHVyZSBhbmQgSW50ZWwoUikgNjQgYXJjaGl0ZWN0dXJlIG9iamVjdHMgaW4gYQorc2luZ2xlIGFyY2hpdmU7IGp1c3QgYnVpbGQgdGhlIDMyIGFuZCAzMmUgbGlicmFyaWVzIHNlcGFyYXRlbHk6CisgJCBjbWFrZSAtRENNQUtFX0NfQ09NUElMRVI9Y2xhbmcgLURDTUFLRV9DWFhfQ09NUElMRVI9Y2xhbmcrKyAtRGFyY2g9MzIgLi4KKyAkIG1ha2UKKyAkIGNtYWtlIC1EYXJjaD0zMmUgLi4KKyAkIG1ha2UKK3RoZW4gaW52b2tlIG1ha2UgYWdhaW4gd2l0aCBhIHNwZWNpYWwgYXJndW1lbnQgYXMgZm9sbG93czoKKyAkIG1ha2UgZmF0CistIFRoZSBmYXQgdGFyZ2V0IGlzIG9ubHkgYXZhaWxhYmxlIGZvciB0aGUgYXJjaD0zMmUgY29uZmlndXJhdGlvbi4KKy0gVGhlIGZhdCBsaWJyYXJpZXMgd2lsbCBiZSBwdXQgaW4gZXhwb3J0cy9tYWNfMzJlL2xpYiB3aGlsZSB0aGUgInRoaW4iIGxpYnJhcmllcworICB3aWxsIGJlIGluIGV4cG9ydHMvbWFjXzMyZS9saWIudGhpbiBhbmQgZXhwb3J0cy9tYWNfMzIvbGliLnRoaW4KKworPT09PT09PT09PT09PT09PQorQ29tcGlsZXIgb3B0aW9ucworPT09PT09PT09PT09PT09PQorLURDTUFLRV9DX0NPTVBJTEVSPTxDIGNvbXBpbGVyIG5hbWU+CistRENNQUtFX0NYWF9DT01QSUxFUj08QysrIGNvbXBpbGVyIG5hbWU+CisKKy1EQ01BS0VfRm9ydHJhbl9DT01QSUxFUj08Rm9ydHJhbiBjb21waWxlciBuYW1lPgorVW5peCogc3lzdGVtcyAoT3B0aW9uYWwgYXMgY29tcGlsZXIgaXMgZGVmYXVsdCk6CitUaGlzIG9wdGlvbiBpcyBvbmx5IG5lZWRlZCB3aGVuIC1EY3JlYXRlX2ZvcnRyYW5fbW9kdWxlcyBpcyB0cnVlCisKKy1EQ01BS0VfQVNNX0NPTVBJTEVSPTxBc3NlbWJsZXIgbmFtZT4KK1RoaXMgb3B0aW9uIGlzbid0IHVzdWFsbHkgbmVlZGVkIGZvciBOb24tV2luZG93cyogYnVpbGRzCisKKy1EQ01BS0VfQVNNX01BU01fQ09NUElMRVI9W21sIHwgbWw2NCBdCitUaGlzIG9wdGlvbiBpcyBXaW5kb3dzKiBPbmx5CisKKz09PT09PT09PT09PT0KK0J1aWxkIG9wdGlvbnMKKz09PT09PT09PT09PT0KKworPT09PT09PT09PT09PT09PT09PT09PT09PT0KKz09PT0gT3BlcmF0aW5nIFN5c3RlbSA9PT09Cis9PT09PT09PT09PT09PT09PT09PT09PT09PQorLURvcz1saW58bWFjfHdpbnxtaWMKKyogT3BlcmF0aW5nIHN5c3RlbSBjYW4gYmUgbGluIChMaW51eCopLCBtYWMgKE1hYyopLCB3aW4gKFdpbmRvd3MqKSwgb3IKKyAgbWljIChJbnRlbChSKSBNYW55IEludGVncmF0ZWQgQ29yZSBBcmNoaXRlY3R1cmUgKEludGVsKFIpIE1JQyBBcmNoaXRlY3R1cmUpKS4KKyAgSWYgbm90IHNwZWNpZmllZCwgY21ha2Ugd2lsbCB0cnkgdG8gZGV0ZXJtaW5lIHlvdXIgY3VycmVudCBvcGVyYXRpbmcgc3lzdGVtLgorCis9PT09PT09PT09PT09PT09PT09PT09Cis9PT09IEFyY2hpdGVjdHVyZSA9PT09Cis9PT09PT09PT09PT09PT09PT09PT09CistRGFyY2g9MzJ8MzJlfGFybXxwcGM2NHxhYXJjaDY0CisqIEFyY2hpdGVjdHVyZSBjYW4gYmUgMzIgKElBLTMyIGFyY2hpdGVjdHVyZSksIDMyZSAoSW50ZWwoUikgNjQgYXJjaGl0ZWN0dXJlKSwKKyAgYXJtIChBUk0gYXJjaGl0ZWN0dXJlKSwgYWFyY2g2NCAoQVJNdjggYXJjaGl0ZWN0dXJlKSBvciBwcGM2NCAoUFBDNjQgYXJjaGl0ZWN0dXJlKS4KKyAgVGhpcyBvcHRpb24sIGJ5IGRlZmF1bHQgaXMgY2hvc2VuIGJhc2VkIG9uIHRoZQorICBDTWFrZSB2YXJpYWJsZSBDTUFLRV9TSVpFT0ZfVk9JRF9QLiAgSWYgaXQgaXMgOCwgdGhlbiBJbnRlbChSKSA2NCBhcmNoaXRlY3R1cmUKKyAgaXMgYXNzdW1lZC4gIElmIGl0IGlzIDQsIHRoZW4gSUEtMzIgYXJjaGl0ZWN0dXJlIGlzIGFzc3VtZWQuICBJZiB5b3Ugd2FudCB0bworICB1c2UgYSBkaWZmZXJlbnQgYXJjaGl0ZWN0dXJlIG90aGVyIHRoYW4geDg2IGJhc2VkIGFyY2hpdGVjdHVyZSwgeW91IG11c3Qgc3BlY2lmeQorICBpdCB3aGVuIGNhbGxpbmcgY21ha2UgaW5pdGlhbGx5IHVzaW5nIHRoaXMgLURhcmNoPTxhcmNoPiBvcHRpb24gb3IgYnkgY2hhbmdpbmcgCisgIHRoZSBhcmNoIHZhbHVlIHZpYSBDTWFrZUNhY2hlLnR4dCBvciB0aGUgQ01ha2UgR1VJIGFmdGVyIHRoZSBpbml0aWFsIENNYWtlIHJ1bi4KKworLS0tLSBGaXJzdCB2YWx1ZXMgbGlzdGVkIGFyZSB0aGUgZGVmYXVsdCB2YWx1ZSAtLS0tCistRGxpYl90eXBlPW5vcm1hbHxwcm9maWxlfHN0dWJzCitMaWJyYXJ5IHR5cGUgY2FuIGJlIG5vcm1hbCwgcHJvZmlsZSwgb3Igc3R1YnMuCisKKy1EQ01BS0VfQlVJTERfVFlQRT1SZWxlYXNlfERlYnVnfFJlbFdpdGhEZWJJbmZvCitCdWlsZCB0eXBlIGNhbiBiZSBSZWxlYXNlLCBEZWJ1Zywgb3IgUmVsV2l0aERlYkluZm8uCitTZWUgYmVsb3cgZm9yIGludGVyYWN0aW9uIHdoZW4gLURVU0VfQlVJTERQTF9SVUxFUyBpcyBvbi4KKworLUR2ZXJzaW9uPTV8NAorbGliaW9tcDUgdmVyc2lvbiBjYW4gYmUgNSBvciA0LgorCistRG9tcF92ZXJzaW9uPTQwfDMwCitPcGVuTVAgdmVyc2lvbiBjYW4gYmUgZWl0aGVyIDQwIG9yIDMwLgorCistRG1pY19hcmNoPWtuY3xrbmYKK0ludGVsKFIpIE1JQyBBcmNoaXRlY3R1cmUsIGNhbiBiZSBrbmYgb3Iga25jLgorVGhpcyB2YWx1ZSBpcyBpZ25vcmVkIGlmIG9zICE9IG1pYworICAKKy1EbWljX29zPWxpbnxic2QKK09wZXJhdGluZyBzeXN0ZW0gb24gSW50ZWwoUikgTUlDIEFyY2hpdGVjdHVyZS4KK0NhbiBiZSBlaXRoZXIgYnNkIG9yIGxpbi4gIFRoaXMgdmFsdWUgaXMgaWdub3JlZCBpZiBvcyAhPSBtaWMKKworLURjcmVhdGVfZm9ydHJhbl9tb2R1bGVzPW9mZnxvbgorU2hvdWxkIHRoZSBGb3J0cmFuIG1vZHVsZXMgYmUgY3JlYXRlZCAocmVxdWlyZXMgRm9ydHJhbiBjb21waWxlcikKKworLURzdGF0cz1vZmZ8b24KK1Nob3VsZCBpbmNsdWRlIHN0YXRzLWdhdGhlcmluZyBjb2RlPworCis9PT09PT09PT09PT09PT09PT09PT0KKz09PT0gTWljcm8gdGVzdHMgPT09PQorPT09PT09PT09PT09PT09PT09PT09CitBZnRlciB0aGUgbGlicmFyeSBoYXMgYmVlbiBidWlsdCwgZml2ZSBtaWNyb3Rlc3RzIGFyZSBwZXJmb3JtZWQuCitTb21lIHdpbGwgYmUgc2tpcHBlZCBiYXNlZCB1cG9uIHRoZSBwbGF0Zm9ybS4KK1RoZXNlIHRlc3RzIGNhbiBiZSB0dXJuZWQgb24gKGRlZmF1bHQpIG9yIG9mZiB3aXRoIHRoZSBmb2xsb3dpbmcgb3B0aW9uczoKKy1EdGVzdF90b3VjaD1vbnxvZmYgICAgIC0tIFNob3VsZCB0aGUgdG91Y2ggdGVzdCBiZSBkb25lPworLUR0ZXN0X3JlbG89b258b2ZmICAgICAgLS0gU2hvdWxkIHRoZSBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlIHRlc3QgYmUgZG9uZT8KKy1EdGVzdF9leGVjc3RhY2s9b258b2ZmIC0tIFNob3VsZCB0aGUgc3RhY2sgYmUgY2hlY2tlZCBmb3IgZXhlY3V0YWJpbGl0eT8KKy1EdGVzdF9pbnN0cj1vbnxvZmYgICAgIC0tIFNob3VsZCB0aGUgSW50ZWwoUikgTUlDIExpYnJhcmllcyBiZSBjaGVja2VkIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBjb3JyZWN0IGluc3RydWN0aW9uIHNldD8KKy1EdGVzdF9kZXBzPW9ufG9mZiAgICAgIC0tIFNob3VsZCBsaWJpb21wNSdzIGRlcGVuZGVuY2llcyBiZSBjaGVja2VkPworLUR0ZXN0cz1vZmZ8b24gICAgICAgICAgLS0gU2hvdWxkIGFueSBvZiB0aGUgYWJvdmUgdGVzdHMgYmUgZG9uZT8KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKz09PT0gSG93IHRvIGFwcGVuZCBmbGFncyB0byBjb21waWxhdGlvbiA9PT09Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLSBUaGVzZSBmbGFncyBhcmUgKmFwcGVuZGVkKi4gIFRoZXkgZG8gbm90IAorICBvdmVyd3JpdGUgYW55IG9mIHRoZSBwcmVzZXQgZmxhZ3MuCistRFVTRVJfQ1BQX0ZMQUdTPTxzcGFjZS1zZXBhcmF0ZWQgZmxhZ3M+ICAgIC0tIEFkZGl0aW9uYWwgQyBQcmVwcm9jZXNzb3IgZmxhZ3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHR5cGljYWxseSBhZGRpdGlvbmFsIC1EZGVmPXZhbCBmbGFncykKKy1EVVNFUl9DX0ZMQUdTPTxzcGFjZS1zZXBhcmF0ZWQgZmxhZ3M+ICAgICAgLS0gQWRkaXRpb25hbCBDIGNvbXBpbGVyIGZsYWdzCistRFVTRVJfQ1hYX0ZMQUdTPTxzcGFjZS1zZXBhcmF0ZWQgZmxhZ3M+ICAgIC0tIEFkZGl0aW9uYWwgQysrIGNvbXBpbGVyIGZsYWdzCistRFVTRVJfQVNNX0ZMQUdTPTxzcGFjZS1zZXBhcmF0ZWQgZmxhZ3M+ICAgIC0tIEFkZGl0aW9uYWwgYXNzZW1ibHkgZmxhZ3MKKy1EVVNFUl9MRF9GTEFHUz08c3BhY2Utc2VwYXJhdGVkIGZsYWdzPiAgICAgLS0gQWRkaXRpb25hbCBsaW5rZXIgZmxhZ3MKKy1EVVNFUl9MRF9MSUJfRkxBR1M9PHNwYWNlLXNlcGFyYXRlZCBmbGFncz4gLS0gQWRkaXRpb25hbCBsaWJyYXJpZXMgdG8gbGluayAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gZHVyaW5nIGxpbmsgcGhhc2UKKy1EVVNFUl9GX0ZMQUdTPTxzcGFjZS1zZXBhcmF0ZWQgZmxhZ3M+ICAtLSBBZGRpdGlvbmFsIEZvcnRyYW4gY29tcGlsZXIgZmxhZ3MKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKz09PT0gRmVhdHVyZSBCYXNlZCBDb21waWxhdGlvbiA9PT09Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLURVU0VfQlVJTERQTF9SVUxFUz1mYWxzZXx0cnVlCitTaG91bGQgdGhlIGJ1aWxkIGltaXRhdGUgYnVpbGQucGwncyBidWlsZCBwcm9jZXNzLgorV2hlbiB0aGlzIGlzIHRydWUsIHRoZSBVbml4KiBSZWxlYXNlIGJ1aWxkcyB3aWxsIGJ1aWxkIGxpYmlvbXA1Cit3aXRoIC1PMiBhbmQgLWcgZmxhZ3MgYWN0aXZhdGVkIChzYW1lIGFzIFJlbFdpdGhEZWJJbmZvKS4gVGhlbiwKK3RoZSBkZWJ1ZyBpbmZvIGlzIHN0cmlwcGVkIG91dCBvZiB0aGUgbGlicmFyeSBhbmQgcHV0IGludG8gbGliaW9tcDUuZGJnCitUaGlzIGlzIGRvbmUgZm9yIGludGVyYWN0aW9uIHdpdGggSW50ZWwoUikgUGFyYWxsZWwgQW1wbGlmaWVyLgorCistRFVTRV9BREFQVElWRV9MT0NLUz10cnVlfGZhbHNlICAgICAgIAorU2hvdWxkIGFkYXB0aXZlIChUU1gtYmFzZWQpIGxvY2tzIGJlIGluY2x1ZGVkPyAgCitUaGVzZSBhcmUgeDg2IHNwZWNpZmljLiAgVGhpcyBmZWF0dXJlIGlzIHR1cm5lZCBvbiBieSBkZWZhdWx0IAorZm9yIElBLTMyIGFyY2hpdGVjdHVyZSBhbmQgSW50ZWwoUikgNjQgYXJjaGl0ZWN0dXJlLiAKK090aGVyd2lzZSwgaXQgaXMgdHVybmVkIG9mZi4KKworLURVU0VfUFJFREVGSU5FRF9MSU5LRVJfRkxBR1M9dHJ1ZXxmYWxzZQorU2hvdWxkIHRoZSBwcmVkZWZpbmVkIGxpbmtlciBmbGFncyBpbiBDb21tb25GbGFncy5jbWFrZSBiZSBpbmNsdWRlZAoraW4gdGhlIGxpbmsgY29tbWFuZD8gVGhpcyBpcyB0cnVlIGJ5IGRlZmF1bHQgYW5kIHNob3VsZCB3b3JrIGZvcgorTGludXgqLCBNYWMqLCBhbmQgV2luZG93cyouICBUaGUgLS12ZXJzaW9uLXNjcmlwdCBmbGFnIG9uIFVuaXgqIGJhc2VkCitvcGVyYXRpbmcgc3lzdGVtcyB3aWxsIGJlIGluY2x1ZGVkIHJlZ2FyZGxlc3MuCisKKz09PT09PT09PT09PT09PT09PT09PT09PQorRXhhbXBsZXMgdXNhZ2VzIG9mIENNYWtlCis9PT09PT09PT09PT09PT09PT09PT09PT0KKy0tLS0gVHlwaWNhbCB1c2FnZSAtLS0tCitjbWFrZSAtRENNQUtFX0NfQ09NUElMRVI9aWNjIC1EQ01BS0VfQ1hYX0NPTVBJTEVSPWljcGMgLi4KK2NtYWtlIC1EQ01BS0VfQ19DT01QSUxFUj1nY2MgLURDTUFLRV9DWFhfQ09NUElMRVI9ZysrIC4uCitjbWFrZSAtRENNQUtFX0NfQ09NUElMRVI9Y2xhbmcgLURDTUFLRV9DWFhfQ09NUElMRVI9Y2xhbmcrKyAuLgorCistLS0tIFdpdGggVmFyaW91cyBPcHRpb25zIC0tLS0KK2NtYWtlIC1EQ01BS0VfQ19DT01QSUxFUj1nY2MgLURDTUFLRV9DWFhfQ09NUElMRVI9ZysrIC1Eb3M9bGluIC1EYXJjaD0zMiAuLgorY21ha2UgLURDTUFLRV9DX0NPTVBJTEVSPWNsYW5nIC1EQ01BS0VfQ1hYX0NPTVBJTEVSPWNsYW5nKysgLURvcz1tYWMgLURhcmNoPTMyIC1EQ01BS0VfQlVJTERfVFlQRT1EZWJ1ZyAuLgorY21ha2UgLURDTUFLRV9DX0NPTVBJTEVSPWljYyAtRENNQUtFX0NYWF9DT01QSUxFUj1pY3BjIC1EQ01BS0VfRm9ydHJhbl9DT01QSUxFUj1pZm9ydCAtRHRlc3RzPW9uIC1EY3JlYXRlX2ZvcnRyYW5fbW9kdWxlcz1vbiAtRFVTRV9CVUlMRFBMX1JVTEVTPW9uIC4uCitjbWFrZSAtRFVTRVJfQ0ZMQUdTPSdXZXJyb3InIC1EVVNFUl9DUFBfRkxBR1M9Jy1ETkVXX0ZFQVRVUkU9MSAtRE9MRF9GRUFUVVJFPTAnIC1EVVNFUl9DWFhfRkxBR1M9Jy1XZXJyb3IgLVdzaWduLWNvbXBhcmUnIC4uCisKKy0tLS0gU3R1YnMgbGlicmFyeSAtLS0tCitjbWFrZSAtRENNQUtFX0NfQ09NUElMRVI9Z2NjIC1EQ01BS0VfQ1hYX0NPTVBJTEVSPWcrKyAtRGxpYl90eXBlPXN0dWJzIC4uCisKKz09PT09PT09PQorRm9vdG5vdGVzCis9PT09PT09PT0KK1sqXSBPdGhlciBuYW1lcyBhbmQgYnJhbmRzIG1heSBiZSBjbGFpbWVkIGFzIHRoZSBwcm9wZXJ0eSBvZiBvdGhlcnMuCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL0NNYWtlTGlzdHMudHh0IGIvZmluYWwvcnVudGltZS9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDNkZDQwCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDg0NSBAQAorIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworCisjIyMjIyMjIyMjIyMjIyMjCisjIENNQUtFIGxpYmlvbXA1CitjbWFrZV9taW5pbXVtX3JlcXVpcmVkKFZFUlNJT04gMi44IEZBVEFMX0VSUk9SKQorcHJvamVjdChsaWJpb21wIEMgQ1hYKQorCisjIyMjIyMjIyMKKyMgR0xPQkFMUyAKK3NldChHTE9CQUxfREVCVUcgMCkKKworIyBBZGQgY21ha2UgZGlyZWN0b3J5IHRvIHNlYXJjaCBmb3IgY3VzdG9tIGNtYWtlIGZ1bmN0aW9ucworc2V0KENNQUtFX01PRFVMRV9QQVRIICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9jbWFrZSAke0NNQUtFX01PRFVMRV9QQVRIfSkKKworIyBTZXQgYmFzZSBsaWJvbXAgZGlyZWN0b3J5IChkaXJlY3Rvcnkgd2l0aCBleHBvcnRzLyAsIHNyYy8gLCB0b29scy8gLCBldGMuKQorIyBUaGUgdG9wLWxldmVsIENNYWtlTGlzdHMudHh0IHNob3VsZCBkZWZpbmUgdGhpcyB2YXJpYWJsZS4KK3NldChMSUJPTVBfV09SSyAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0pCisKKyMgVGhlc2UgaW5jbHVkZSBmaWxlcyBhcmUgaW4gY21ha2UvIHN1YmRpcmVjdG9yeSBleGNlcHQgZm9yIEZpbmRQZXJsIHdoaWNoIGlzIGEgY21ha2Ugc3RhbmRhcmQgbW9kdWxlCitpbmNsdWRlKEhlbHBlckZ1bmN0aW9ucykKK2luY2x1ZGUoRGVmaW5pdGlvbnMpICMgLUQgZGVmaW5pdGlvbnMgd2hlbiBjb21waWxpbmcgCitpbmNsdWRlKENvbW1vbkZsYWdzKSAjIGNvbXBpbGVyLCBhc3NlbWJsZXIsIGZvcnRyYW4sIGxpbmtlciBmbGFncyBjb21tb24gZm9yIGFsbCBjb21waWxlcnMKK2luY2x1ZGUoU291cmNlRmlsZXMpICMgc291cmNlIGZpbGVzIHRvIGNvbXBpbGUgCitpbmNsdWRlKFBlcmxGbGFncykgICAjIFBlcmwgZmxhZ3MgZm9yIGdlbmVyYXRlLWRlZi5wbCBhbmQgZXhwYW5kLXZhcnMucGwKK2luY2x1ZGUoRmluZFBlcmwpICMgU3RhbmRhcmQgY21ha2UgbW9kdWxlIHRvIGNoZWNrIGZvciBQZXJsCitpbmNsdWRlKEdldEFyY2hpdGVjdHVyZSkgIyBnZXRfYXJjaGl0ZWN0dXJlKCkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgICAgICAgICAgICAgICAgICAgICAgICAgQ09ORklHVVJBVElPTgorIworIyAqIEFueSB2YXJpYWJsZS92YWx1ZSB0aGF0IGlzIENBQ0hFLWVkIGNhbiBiZSBjaGFuZ2VkIGFmdGVyIHRoZSBpbml0aWFsIHJ1biBvZiBjbWFrZQorIyB0aHJvdWdoIHRoZSBmaWxlLCBDTWFrZUNhY2hlLnR4dCB3aGljaCBpcyBpbiB0aGUgYnVpbGQgZGlyZWN0b3J5LgorIyAqIElmIHlvdSBjaGFuZ2UgYW55IHZhbHVlIGluIENNYWtlQ2FjaGUudHh0LCB0aGVuIGp1c3QgcnVuIGNtYWtlIC4uCisjIGFuZCB0aGUgY2hhbmdlZCB3aWxsIGJlIHBpY2tlZCB1cC4gIE9uZSBjYW4gYWxzbyB1c2UgLURWQVJJQUJMRT1WQUxVRQorIyB3aGVuIGNhbGxpbmcgY21ha2UgdG8gY2hhbmdlZCBjb25maWd1cmF0aW9uIHZhbHVlcy4gIAorIyAqIENNQUtFX0NfQ09NUElMRVIsIENNQUtFX0NYWF9DT01QSUxFUiwgQ01BS0VfQVNNX01BU01fQ09NUElMRVIsIENNQUtFX0FTTV9DT01QSUxFUiwKKyMgQ01BS0VfRm9ydHJhbl9DT01QSUxFUiBjYW4gb25seSBieSBzcGVjaWZpZWQgb24gdGhlIGluaXRpYWwgcnVuIG9mIGNtYWtlLiAKKyMgVGhpcyBtZWFucyB5b3UgY2Fubm90IHNwZWNpZnkgLURDTUFLRV9DX0NPTVBJTEVSPSBvbiBhIHN1YnNlcXVlbnQgcnVuIG9mIGNtYWtlCisjIGluIHRoZSBzYW1lIGJ1aWxkIGRpcmVjdG9yeSB1bnRpbCB0aGF0IGJ1aWxkIGRpcmVjdG9yeSBpcyBlbXB0aWVkLgorIyBJZiB5b3Ugd2FudCB0byBjaGFuZ2UgdGhlIGNvbXBpbGVyLCB0aGVuIGVtcHR5IHRoZSBidWlsZCBkaXJlY3RvcnkgYW5kIHJlcnVuIGNtYWtlLgorCisjIEJ1aWxkIENvbmZpZ3VyYXRpb24KK3NldChvc19wb3NzaWJsZV92YWx1ZXMgICAgICAgICAgbGluIG1hYyB3aW4gbWljKQorc2V0KGFyY2hfcG9zc2libGVfdmFsdWVzICAgICAgICAzMmUgMzIgYXJtIHBwYzY0IGFhcmNoNjQpCitzZXQoYnVpbGRfdHlwZV9wb3NzaWJsZV92YWx1ZXMgIHJlbGVhc2UgZGVidWcgcmVsd2l0aGRlYmluZm8pCitzZXQob21wX3ZlcnNpb25fcG9zc2libGVfdmFsdWVzIDQwIDMwKQorc2V0KGxpYl90eXBlX3Bvc3NpYmxlX3ZhbHVlcyAgICBub3JtYWwgcHJvZmlsZSBzdHVicykKK3NldChtaWNfYXJjaF9wb3NzaWJsZV92YWx1ZXMgICAga25mIGtuYykKK3NldChtaWNfb3NfcG9zc2libGVfdmFsdWVzICAgICAgYnNkIGxpbikKKworIyBCZWxvdywgY21ha2Ugd2lsbCB0cnkgYW5kIGRldGVybWluZSB0aGUgb3BlcmF0aW5nIHN5c3RlbSBhbmQgYXJjaGl0ZWN0dXJlIGZvciB5b3UuCisjIFRoZXNlIHZhbHVlcyBhcmUgc2V0IGluIENNYWtlQ2FjaGUudHh0IHdoZW4gY21ha2UgaXMgZmlyc3QgcnVuICgtRHZhcl9uYW1lPS4uLiB3aWxsIHRha2UgcHJlY2VkZW5jZSkKKyMgIHBhcmFtZXRlciAgfCBkZWZhdWx0IHZhbHVlICAgICAgICAgICAgIAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFJpZ2h0IG5vdywgdGhpcyBidWlsZCBzeXN0ZW0gY29uc2lkZXJzIG9zPWxpbiB0byBtZWFuICJVbml4LWxpa2UgdGhhdCBpcyBub3QgTUFDIgoraWYoJHtBUFBMRX0pICMgQXBwbGUgZ29lcyBmaXJzdCBiZWNhdXNlIENNYWtlIGNvbnNpZGVycyBNYWMgdG8gYmUgYSBVbml4IGJhc2VkIG9wZXJhdGluZyBzeXN0ZW0sIHdoaWxlIGxpYmlvbXA1IGNvbnNpZGVycyBpdCBhIHNwZWNpYWwgY2FzZQorICAgIHNldCh0ZW1wX29zIG1hYykKK2Vsc2VpZigke1VOSVh9KQorICAgIHNldCh0ZW1wX29zIGxpbikKK2Vsc2VpZigke1dJTjMyfSkgICAgICAgCisgICAgc2V0KHRlbXBfb3Mgd2luKQorZWxzZSgpCisgICAgc2V0KHRlbXBfb3MgbGluKQorZW5kaWYoKQorCisjIElmIGFkZGluZyBhIG5ldyBhcmNoaXRlY3R1cmUsIHRha2UgYSBsb29rIGF0IGNtYWtlL0dldEFyY2hpdGVjdHVyZS5jbWFrZQorZ2V0X2FyY2hpdGVjdHVyZShkZXRlY3RlZF9hcmNoKQorCitzZXQob3MgICAgICAgICAgICAke3RlbXBfb3N9ICAgICBDQUNIRSBTVFJJTkcgIlRoZSBvcGVyYXRpbmcgc3lzdGVtIHRvIGJ1aWxkIGZvciAobGluL21hYy93aW4vbWljKSIpCitzZXQoYXJjaCAgICAgICAgICAke2RldGVjdGVkX2FyY2h9ICAgQ0FDSEUgU1RSSU5HICJUaGUgYXJjaGl0ZWN0dXJlIHRvIGJ1aWxkIGZvciAoMzJlLzMyL2FybS9wcGM2NCkuICAzMmUgaXMgSW50ZWwoUikgNjQgYXJjaGl0ZWN0dXJlLCAzMiBpcyBJQS0zMiBhcmNoaXRlY3R1cmUiKQorc2V0KGxpYl90eXBlICAgICAgIG5vcm1hbCAgICAgICAgQ0FDSEUgU1RSSU5HICJQZXJmb3JtYW5jZSxQcm9maWxpbmcsU3R1YnMgbGlicmFyeSAobm9ybWFsL3Byb2ZpbGUvc3R1YnMpIikKK3NldCh2ZXJzaW9uICAgICAgICA1ICAgICAgICAgICAgIENBQ0hFIFNUUklORyAiUHJvZHVjZSBsaWJndWlkZSAodmVyc2lvbiA0KSBvciBsaWJpb21wNSAodmVyc2lvbiA1KSIpCitzZXQob21wX3ZlcnNpb24gICAgNDAgICAgICAgICAgICBDQUNIRSBTVFJJTkcgIlRoZSBPcGVuTVAgdmVyc2lvbiAoNDAvMzApIikKK3NldChtaWNfYXJjaCAgICAgICBrbmMgICAgICAgICAgIENBQ0hFIFNUUklORyAiSW50ZWwoUikgTWFueSBJbnRlZ3JhdGVkIENvcmUgQXJjaGl0ZWN0dXJlIChJbnRlbChSKSBNSUMgQXJjaGl0ZWN0dXJlKSAoa25mL2tuYykuICAgSWdub3JlZCBpZiBub3QgSW50ZWwoUikgTUlDIEFyY2hpdGVjdHVyZSBidWlsZC4iKQorc2V0KG1pY19vcyAgICAgICAgIGxpbiAgICAgICAgICAgQ0FDSEUgU1RSSU5HICJJbnRlbChSKSBNSUMgQXJjaGl0ZWN0dXJlIG9wZXJhdGluZyBzeXN0ZW0gKGJzZC9saW4pLiAgIElnbm9yZWQgaWYgbm90IEludGVsKFIpIE1JQyBBcmNoaXRlY3R1cmUgYnVpbGQuIikKK3NldChjcmVhdGVfZm9ydHJhbl9tb2R1bGVzIGZhbHNlIENBQ0hFIFNUUklORyAiQ3JlYXRlIEZvcnRyYW4gbW9kdWxlIGZpbGVzPyAocmVxdWlyZXMgZm9ydHJhbiBjb21waWxlcikiKQorCisjIC0gVGhlc2UgdGVzdHMgYXJlIGxpdHRsZSB0ZXN0cyBwZXJmb3JtZWQgYWZ0ZXIgdGhlIGxpYnJhcnkgaXMgZm9ybWVkLgorIyAtIFRoZSBsaWJyYXJ5IHdvbid0IGJlIGNvcGllZCB0byB0aGUgZXhwb3J0cyBkaXJlY3RvcnkgdW50aWwgaXQgaGFzIHBhc3NlZC9za2lwcGVkIGFsbCBiZWxvdyB0ZXN0cworIyAtIFRvIHNraXAgdGhlc2UgdGVzdHMsIGp1c3QgcGFzcyAtRHRlc3RzPU9GRiB0byBjbWFrZSBvciBjaGFuZ2UgdGVzdHMgdmFsdWUgaW4gQ01ha2VDYWNoZS50eHQgdG8gT0ZGIGFmdGVyIHJ1bm5pbmcgY21ha2UKK3NldCh0ZXN0X3RvdWNoICAgICAgdHJ1ZSAgICAgICAgIENBQ0hFIEJPT0wgICAiUGVyZm9ybSBhIHNtYWxsIHRvdWNoIHRlc3Q/IiAgICAgICAgICAgICAgICAgICAgICAgICAgICApCitzZXQodGVzdF9yZWxvICAgICAgIHRydWUgICAgICAgICBDQUNIRSBCT09MICAgIlBlcmZvcm0gYSByZWxvY2F0aW9uIHRlc3QgZm9yIGR5bmFtaWMgbGlicmFyaWVzPyIgICAgICAgKQorc2V0KHRlc3RfZXhlY3N0YWNrICB0cnVlICAgICAgICAgQ0FDSEUgQk9PTCAgICJQZXJmb3JtIGEgZXhlY3N0YWNrIHRlc3QgZm9yIGxpbnV4IGR5bmFtaWMgbGlicmFyaWVzPyIgICkKK3NldCh0ZXN0X2luc3RyICAgICAgdHJ1ZSAgICAgICAgIENBQ0hFIEJPT0wgICAiUGVyZm9ybSBhbiBpbnN0cnVjdGlvbiB0ZXN0IGZvciBJbnRlbChSKSBNSUMgQXJjaGl0ZWN0dXJlIGxpYnJhcmllcz8iICkKK3NldCh0ZXN0X2RlcHMgICAgICAgdHJ1ZSAgICAgICAgIENBQ0hFIEJPT0wgICAiUGVyZm9ybSBhIGxpYnJhcnkgZGVwZW5kZW5jeSB0ZXN0PyIgICAgICAgICAgICAgICAgICAgICApCitzZXQodGVzdHMgICAgICAgICAgIGZhbHNlICAgICAgICBDQUNIRSBCT09MICAgIlBlcmZvcm0gdG91Y2gsIHJlbG8sIGV4ZWNzdGFjaywgaW5zdHIsIGFuZCBkZXBzIHRlc3RzPyIgKQorCisjIC0gc3RhdHMtZ2F0aGVyaW5nIGVuYWJsZXMgT3Blbk1QIHN0YXRzIHdoZXJlIHRoaW5ncyBsaWtlIHRoZSBudW1iZXIgb2YgcGFyYWxsZWwgcmVnaW9ucywgY2xvY2sgdGlja3Mgc3BlbnQgaW4KKyMgICBwYXJ0aWN1bGFyIG9wZW5tcCByZWdpb25zIGFyZSByZWNvcmRlZC4KK3NldChzdGF0cyAgICAgICAgICAgZmFsc2UgICAgICAgICBDQUNIRSBCT09MICAgIlN0YXRzLUdhdGhlcmluZyBmdW5jdGlvbmFsaXR5PyIgICAgICAgICAgICAgICAgICAgICAgICAgKQorCisjIFVzZXIgc3BlY2lmaWVkIGZsYWdzLiAgVGhlc2UgYXJlIGFwcGVuZGVkIHRvIHRoZSBwcmVkZXRlcm1pbmVkIGZsYWdzIGZvdW5kIGluIENvbW1vbkZsYWdzLmNtYWtlIGFuZCAke0NNQUtFX0NfQ09NUElMRVJfSUR9LypGbGFncy5jbWFrZSAoaS5lLiwgR05VL0NGbGFncy5jbWFrZSkKK3NldChVU0VSX0NfRkxBR1MgICAgICAiIiBDQUNIRSBTVFJJTkcgIkFwcGVuZGVkIHVzZXIgc3BlY2lmaWVkIEMgY29tcGlsZXIgZmxhZ3MuIiAgICAgICAgICAgICApCitzZXQoVVNFUl9DWFhfRkxBR1MgICAgIiIgQ0FDSEUgU1RSSU5HICJBcHBlbmRlZCB1c2VyIHNwZWNpZmllZCBDKysgY29tcGlsZXIgZmxhZ3MuIiAgICAgICAgICAgKQorc2V0KFVTRVJfQ1BQX0ZMQUdTICAgICIiIENBQ0hFIFNUUklORyAiQXBwZW5kZWQgdXNlciBzcGVjaWZpZWQgQyBwcmVwcm9jZXNzb3IgZmxhZ3MuIiAgICAgICAgICkKK3NldChVU0VSX0FTTV9GTEFHUyAgICAiIiBDQUNIRSBTVFJJTkcgIkFwcGVuZGVkIHVzZXIgc3BlY2lmaWVkIGFzc2VtYmxlciBmbGFncy4iICAgICAgICAgICAgICApCitzZXQoVVNFUl9MRF9GTEFHUyAgICAgIiIgQ0FDSEUgU1RSSU5HICJBcHBlbmRlZCB1c2VyIHNwZWNpZmllZCBsaW5rZXIgZmxhZ3MuIiAgICAgICAgICAgICAgICAgKQorc2V0KFVTRVJfTERfTElCX0ZMQUdTICIiIENBQ0hFIFNUUklORyAiQXBwZW5kZWQgdXNlciBzcGVjaWZpZWQgbGlua2VkIGxpYnMgZmxhZ3MuIChpLmUuLCAtbG0pIikKK3NldChVU0VSX0ZfRkxBR1MgICAgICAiIiBDQUNIRSBTVFJJTkcgIkFwcGVuZGVkIHVzZXIgc3BlY2lmaWVkIEZvcnRyYW4gY29tcGlsZXIgZmxhZ3MuICBUaGVzZSBhcmUgb25seSB1c2VkIGlmIGNyZWF0ZV9mb3J0cmFuX21vZHVsZXM9PXRydWUuIiAgICAgICApCisKKyMgLSBBbGxvdyB0aHJlZSBidWlsZCB0eXBlczogUmVsZWFzZSwgRGVidWcsIFJlbFdpdGhEZWJJbmZvICh0aGVzZSByZWxhdGUgdG8gYnVpbGQucGwncyByZWxlYXNlLCBkZWJ1ZywgYW5kIGRpYWcgc2V0dGluZ3MgcmVzcGVjdGl2ZWx5KQorIyAtIGRlZmF1bHQgaXMgUmVsZWFzZSAod2hlbiBDTUFLRV9CVUlMRF9UWVBFIGlzIG5vdCBkZWZpbmVkKQorIyAtIENNQUtFX0JVSUxEX1RZUEUgYWZmZWN0cyB0aGUgLU8gYW5kIC1nIGZsYWdzIChDTWFrZSBtYWdpY2FsbHkgaW5jbHVkZXMgY29ycmVjdCB2ZXJzaW9uIG9mIHRoZW0gb24gcGVyIGNvbXBpbGVyIGJhc2lzKQorIyAtIHR5cGljYWw6IFJlbGVhc2UgPSAtTzMgLUROREVCVUcKKyMgICAgICAgICAgICBSZWxXaXRoRGViSW5mbyA9IC1PMiAtZyAtRE5ERUJVRworIyAgICAgICAgICAgIERlYnVnID0gLWcKK2lmKENNQUtFX0JVSUxEX1RZUEUpCisgICAgIyBDTUFLRV9CVUlMRF9UWVBFIHdhcyBkZWZpbmVkLCBjaGVjayBmb3IgdmFsaWRpdHkgCisgICAgc3RyaW5nKFRPTE9XRVIgIiR7Q01BS0VfQlVJTERfVFlQRX0iIGNtYWtlX2J1aWxkX3R5cGVfbG93ZXJjYXNlKQorICAgIGNoZWNrX3ZhcmlhYmxlKGNtYWtlX2J1aWxkX3R5cGVfbG93ZXJjYXNlICAiJHtidWlsZF90eXBlX3Bvc3NpYmxlX3ZhbHVlc30iKQorZWxzZSgpCisgICAgIyBDTUFLRV9CVUlMRF9UWVBFIHdhcyBub3QgZGVmaW5lZCwgc2V0IGRlZmF1bHQgdG8gUmVsZWFzZQorICAgIHVuc2V0KENNQUtFX0JVSUxEX1RZUEUgQ0FDSEUpCisgICAgc2V0KENNQUtFX0JVSUxEX1RZUEUgUmVsZWFzZSBDQUNIRSBTVFJJTkcgIkNob29zZSB0aGUgdHlwZSBvZiBidWlsZCwgb3B0aW9ucyBhcmU6IFJlbGVhc2UvRGVidWcvUmVsV2l0aERlYkluZm8iKQorICAgIHN0cmluZyhUT0xPV0VSICIke0NNQUtFX0JVSUxEX1RZUEV9IiBjbWFrZV9idWlsZF90eXBlX2xvd2VyY2FzZSkKKyAgICBjaGVja192YXJpYWJsZShjbWFrZV9idWlsZF90eXBlX2xvd2VyY2FzZSAgIiR7YnVpbGRfdHlwZV9wb3NzaWJsZV92YWx1ZXN9IikKK2VuZGlmKCkKKworIyBDaGVjayB2YWxpZCB2YWx1ZXMKK2NoZWNrX3ZhcmlhYmxlKG9zICAgICAgICAgICIke29zX3Bvc3NpYmxlX3ZhbHVlc30iICAgICAgICAgKQorY2hlY2tfdmFyaWFibGUoYXJjaCAgICAgICAgIiR7YXJjaF9wb3NzaWJsZV92YWx1ZXN9IiAgICAgICApCitjaGVja192YXJpYWJsZShvbXBfdmVyc2lvbiAiJHtvbXBfdmVyc2lvbl9wb3NzaWJsZV92YWx1ZXN9IikKK2NoZWNrX3ZhcmlhYmxlKGxpYl90eXBlICAgICIke2xpYl90eXBlX3Bvc3NpYmxlX3ZhbHVlc30iICAgKQoraWYoIiR7b3N9IiBTVFJFUVVBTCAibWljIikKKyAgICBjaGVja192YXJpYWJsZShtaWNfYXJjaCAiJHttaWNfYXJjaF9wb3NzaWJsZV92YWx1ZXN9IiAgKQorICAgIGNoZWNrX3ZhcmlhYmxlKG1pY19vcyAgICIke21pY19vc19wb3NzaWJsZV92YWx1ZXN9IiAgICApCitlbmRpZigpCisjIEdldCB0aGUgYnVpbGQgbnVtYmVyIGZyb20ga21wX3ZlcnNpb24uYworZ2V0X2J1aWxkX251bWJlcigiJHtMSUJPTVBfV09SS30iIGJ1aWxkX251bWJlcikKKworIyBHZXR0aW5nIHRpbWUgYW5kIGRhdGUgCisjIEFzIG9mIG5vdywgbm8gdGltZXN0YW1wIHdpbGwgYmUgY3JlYXRlZC4KK3NldChkYXRlICJObyBUaW1lc3RhbXAiKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBTZXQgc29tZSB1c2VmdWwgZmxhZ3MgdmFyaWFibGVzIGZvciBvdGhlciBwYXJ0cyBvZiBjbWFrZSB0byB1c2UKKyMgT3BlcmF0aW5nIFN5c3RlbQorc2V0KExJTlVYIEZBTFNFKQorc2V0KE1BQyBGQUxTRSkKK3NldChXSU5ET1dTIEZBTFNFKQorc2V0KE1JQyBGQUxTRSkKK3NldChGUkVFQlNEIEZBTFNFKQoraWYoIiR7b3N9IiBTVFJFUVVBTCAibGluIikKKyAgICBzZXQoTElOVVggVFJVRSkKKyAgICBzZXQocmVhbF9vcyBsaW4pCitlbHNlaWYoIiR7b3N9IiBTVFJFUVVBTCAibWFjIikKKyAgICBzZXQoTUFDIFRSVUUpCisgICAgc2V0KHJlYWxfb3MgbWFjKQorZWxzZWlmKCIke29zfSIgU1RSRVFVQUwgIndpbiIpCisgICAgc2V0KFdJTkRPV1MgVFJVRSkKKyAgICBzZXQocmVhbF9vcyB3aW4pCitlbHNlaWYoIiR7b3N9IiBTVFJFUVVBTCAibWljIikKKyAgICBzZXQoTUlDIFRSVUUpCisgICAgc2V0KHJlYWxfb3MgbHJiKQorZW5kaWYoKQoraWYoIiR7Q01BS0VfU1lTVEVNX05BTUV9IiBTVFJFUVVBTCAiRnJlZUJTRCIpCisgICAgc2V0KEZSRUVCU0QgVFJVRSkKK2VuZGlmKCkKKworIyBBcmNoaXRlY3R1cmUKK3NldChJQTMyIEZBTFNFKQorc2V0KElOVEVMNjQgRkFMU0UpCitzZXQoQVJNIEZBTFNFKQorc2V0KEFBUkNINjQgRkFMU0UpCitzZXQoUFBDNjQgRkFMU0UpCitpZigiJHthcmNofSIgU1RSRVFVQUwgIjMyIikgICAgICAjIElBLTMyIGFyY2hpdGVjdHVyZQorICAgIHNldChJQTMyIFRSVUUpCitlbHNlaWYoIiR7YXJjaH0iIFNUUkVRVUFMICIzMmUiKSAjIEludGVsKFIpIDY0IGFyY2hpdGVjdHVyZQorICAgIHNldChJTlRFTDY0IFRSVUUpCitlbHNlaWYoIiR7YXJjaH0iIFNUUkVRVUFMICJhcm0iKSAjIEFSTSBhcmNoaXRlY3R1cmUKKyAgICBzZXQoQVJNIFRSVUUpCitlbHNlaWYoIiR7YXJjaH0iIFNUUkVRVUFMICJhYXJjaDY0IikgIyBBQVJDSDY0IGFyY2hpdGVjdHVyZQorICAgIHNldChBQVJDSDY0IFRSVUUpCitlbHNlaWYoIiR7YXJjaH0iIFNUUkVRVUFMICJwcGM2NCIpICMgUFBDNjQgYXJjaGl0ZWN0dXJlCisgICAgc2V0KFBQQzY0IFRSVUUpCitlbmRpZigpCisKKyMgU2V0IHNvbWUgZmxhZ3MgYmFzZWQgb24gYnVpbGRfdHlwZQorIyBjbWFrZV9idWlsZF90eXBlX2xvd2VyY2FzZSBpcyBiYXNlZCBvZmYgb2YgQ01BS0VfQlVJTERfVFlQRSwganVzdCBwdXQgaW4gbG93ZXJjYXNlLgorc2V0KFJFTEVBU0VfQlVJTEQgICAgICAgIEZBTFNFKQorc2V0KERFQlVHX0JVSUxEICAgICAgICAgIEZBTFNFKQorc2V0KFJFTFdJVEhERUJJTkZPX0JVSUxEIEZBTFNFKQoraWYoIiR7Y21ha2VfYnVpbGRfdHlwZV9sb3dlcmNhc2V9IiBTVFJFUVVBTCAicmVsZWFzZSIpCisgICAgc2V0KFJFTEVBU0VfQlVJTEQgVFJVRSkKK2Vsc2VpZigiJHtjbWFrZV9idWlsZF90eXBlX2xvd2VyY2FzZX0iIFNUUkVRVUFMICJkZWJ1ZyIpCisgICAgc2V0KERFQlVHX0JVSUxEIFRSVUUpCitlbHNlaWYoIiR7Y21ha2VfYnVpbGRfdHlwZV9sb3dlcmNhc2V9IiBTVFJFUVVBTCAicmVsd2l0aGRlYmluZm8iKQorICAgIHNldChSRUxXSVRIREVCSU5GT19CVUlMRCBUUlVFKQorZW5kaWYoKQorCisjIFN0YXRzLWdhdGhlcmluZyBvbiBvciBvZmY/CitzZXQoU1RBVFNfR0FUSEVSSU5HIEZBTFNFKQoraWYoIiR7c3RhdHN9IikgIyBzdHJpbmcgIm9uIiBvciAiT04iIGlzIHNlZW4gYXMgYm9vbGVhbiBUUlVFCisgICAgc2V0KFNUQVRTX0dBVEhFUklORyBUUlVFKQorZW5kaWYoKQorCisjIEluY2x1ZGUgaXR0IG5vdGlmeSBpbnRlcmZhY2U/IFJpZ2h0IG5vdywgYWx3YXlzLgorc2V0KFVTRV9JVFRfTk9USUZZIFRSVUUpCisKKyMgbm9ybWFsLCBwcm9maWxlLCBzdHVicyBsaWJyYXJ5Lgorc2V0KE5PUk1BTF9MSUJSQVJZIEZBTFNFKQorc2V0KFNUVUJTX0xJQlJBUlkgRkFMU0UpCitzZXQoUFJPRklMRV9MSUJSQVJZIEZBTFNFKQoraWYoIiR7bGliX3R5cGV9IiBTVFJFUVVBTCAibm9ybWFsIikKKyAgICBzZXQoTk9STUFMX0xJQlJBUlkgVFJVRSkKK2Vsc2VpZigiJHtsaWJfdHlwZX0iIFNUUkVRVUFMICJwcm9maWxlIikKKyAgICBzZXQoUFJPRklMRV9MSUJSQVJZIFRSVUUpCitlbHNlaWYoIiR7bGliX3R5cGV9IiBTVFJFUVVBTCAic3R1YnMiKQorICAgIHNldChTVFVCU19MSUJSQVJZIFRSVUUpCitlbmRpZigpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEZlYXR1cmVzIGZvciBjb21waWxhdGlvbiBhbmQgYnVpbGQgaW4gZ2VuZXJhbAorCisjIC0gRG9lcyB0aGUgY29tcGlsZXIgc3VwcG9ydCBhIDEyOC1iaXQgZmxvYXRpbmcgcG9pbnQgZGF0YSB0eXBlPyBEZWZhdWx0IGlzIGZhbHNlCisjIC0gSWYgYSBjb21waWxlciBkb2VzLCB0aGVuIGNoYW5nZSBpdCBpbiB0aGUgQ01ha2VDYWNoZS50eHQgZmlsZSAob3IgdXNpbmcgdGhlIGNtYWtlIEdVSSkKKyMgICBvciBzZW5kIHRvIGNtYWtlIC1EQ09NUElMRVJfU1VQUE9SVFNfUVVBRF9QUkVDSVNJT049dHJ1ZQorIyAtIElmIENPTVBJTEVSX1NVUFBPUlRTX1FVQURfUFJFQ0lTSU9OIGlzIHRydWUsIHRoZW4gYSBjb3JyZXNwb25kaW5nIENPTVBJTEVSX1FVQURfVFlQRSBtdXN0IGJlIGdpdmVuCisjICAgVGhpcyBpcyB0aGUgY29tcGlsZXIncyBxdWFkLXByZWNpc2lvbiBkYXRhIHR5cGUuCisjICoqIFRPRE86IFRoaXMgaXNuJ3QgY29tcGxldGUgeWV0LiBGaW5pc2ggaXQuIFJlcXVpcmVzIGNoYW5naW5nIG1hY3JvcyBpbiBrbXBfb3MuaCAqKgorc2V0KENPTVBJTEVSX1NVUFBPUlRTX1FVQURfUFJFQ0lTSU9OIGZhbHNlIENBQ0hFIEJPT0wgICAiKklOQ09NUExFVEUqIERvZXMgdGhlIGNvbXBpbGVyIHN1cHBvcnQgYSAxMjgtYml0IGZsb2F0aW5nIHBvaW50IHR5cGU/IikKK3NldChDT01QSUxFUl9RVUFEX1RZUEUgICAgICAgICAgICAgICAiIiAgICBDQUNIRSBTVFJJTkcgIipJTkNPTVBMRVRFKiBUaGUgcXVhZCBwcmVjaXNpb24gZGF0YSB0eXBlIChpLmUuLCBmb3IgZ2NjLCBfX2Zsb2F0MTI4KSIpCisKKyMgLSBTaG91bGQgdGhlIG9yaWduYWwgYnVpbGQgcnVsZXMgZm9yIGJ1aWxkcyBiZSB1c2VkPyAoY21ha2UvT3JpZ2luYWxCdWlsZFJ1bGVzLmNtYWtlKS4gIFRoaXMgc2V0dGluZyBpcyBvZmYgYnkgZGVmYXVsdC4KKyMgLSBUaGlzIGFsd2F5cyBjb21waWxlcyB3aXRoIC1nLiAgQW5kIGlmIGl0IGlzIGEgcmVsZWFzZSBidWlsZCwgdGhlIGRlYnVnIGluZm8gaXMgc3RyaXBwZWQgb3V0IHZpYSBvYmpjb3B5IGFuZCBwdXQgaW50byBsaWJpb21wNS5kYmcuCitzZXQoVVNFX0JVSUxEUExfUlVMRVMgZmFsc2UgQ0FDSEUgQk9PTCAiU2hvdWxkIHRoZSBidWlsZCBmb2xsb3cgYnVpbGQucGwgcnVsZXMvcmVjaXBlcz8iKQorCisjIC0gU2hvdWxkIHRoZSBidWlsZCB1c2UgdGhlIHByZWRlZmluZWQgbGlua2VyIGZsYWdzIChPUy1kZXBlbmRlbnQpIGluIENvbW1vbkZsYWdzLmNtYWtlPworIyAtIHRoZXNlIHByZWRlZmluZWQgbGlua2VyIGZsYWdzIHNob3VsZCB3b3JrIGZvciBXaW5kb3dzLCBNYWMsIGFuZCBUcnVlIExpbnV4IGZvciB0aGUgbW9zdCBwb3B1bGFyIGNvbXBpbGVycy9saW5rZXJzCitzZXQoVVNFX1BSRURFRklORURfTElOS0VSX0ZMQUdTIHRydWUgQ0FDSEUgQk9PTCAiU2hvdWxkIHRoZSBidWlsZCB1c2UgdGhlIHByZWRlZmluZWQgbGlua2VyIGZsYWdzIGluIENvbW1vbkZsYWdzLmNtYWtlPyIpCisKKyMgLSBPbiBtdWx0aW5vZGUgc3lzdGVtcywgbGFyZ2VyIGFsaWdubWVudCBpcyBkZXNpcmVkIHRvIGF2b2lkIGZhbHNlIHNoYXJpbmcKK3NldChVU0VfSU5URVJOT0RFX0FMSUdOTUVOVCBmYWxzZSBDQUNIRSBCT09MICJTaG91bGQgbGFyZ2VyIGFsaWdubWVudCAoNDA5NiBieXRlcykgYmUgdXNlZCBmb3Igc29tZSBsb2NrcyBhbmQgZGF0YSBzdHJ1Y3R1cmVzPyIpCisKKyMgLSBsaWJnb21wIGRyb3AtaW4gY29tcGF0aWJpbGl0eQoraWYoJHtMSU5VWH0gQU5EIE5PVCAke1BQQzY0fSkKKyAgICBzZXQoVVNFX1ZFUlNJT05fU1lNQk9MUyB0cnVlIENBQ0hFIEJPT0wgIlNob3VsZCB2ZXJzaW9uIHN5bWJvbHMgYmUgdXNlZD8gVGhlc2UgcHJvdmlkZSBiaW5hcnkgY29tcGF0aWJpbGl0eSB3aXRoIGxpYmdvbXAuIikKK2Vsc2UoKQorICAgIHNldChVU0VfVkVSU0lPTl9TWU1CT0xTIGZhbHNlIENBQ0hFIEJPT0wgIlNob3VsZCB2ZXJzaW9uIHN5bWJvbHMgYmUgdXNlZD8gVGhlc2UgcHJvdmlkZSBiaW5hcnkgY29tcGF0aWJpbGl0eSB3aXRoIGxpYmdvbXAuIikKK2VuZGlmKCkKKworIyAtIFRTWCBiYXNlZCBsb2NrcyBoYXZlIF9fYXNtIGNvZGUgd2hpY2ggY2FuIGJlIHRyb3VibGVzb21lIGZvciBzb21lIGNvbXBpbGVycy4gIFRoaXMgZmVhdHVyZSBpcyBhbHNvIHg4NiBzcGVjaWZpYy4KK2lmKCR7SUEzMn0gT1IgJHtJTlRFTDY0fSkKKyAgICBzZXQoVVNFX0FEQVBUSVZFX0xPQ0tTIHRydWUgQ0FDSEUgQk9PTCAiU2hvdWxkIFRTWC1iYXNlZCBsb2NrIGJlIGNvbXBpbGVkIChhZGFwdGl2ZSBsb2NrIGluIGttcF9sb2NrLmNwcCkuICBUaGVzZSBhcmUgeDg2IHNwZWNpZmljLiIpCitlbHNlKCkKKyAgICBzZXQoVVNFX0FEQVBUSVZFX0xPQ0tTIGZhbHNlIENBQ0hFIEJPT0wgIlNob3VsZCBUU1gtYmFzZWQgbG9jayBiZSBjb21waWxlZCAoYWRhcHRpdmUgbG9jayBpbiBrbXBfbG9jay5jcHApLiAgVGhlc2UgYXJlIHg4NiBzcGVjaWZpYy4iKQorZW5kaWYoKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEVycm9yIGNoZWNraW5nIHRoZSBjb25maWd1cmF0aW9uIAoraWYoJHtTVEFUU19HQVRIRVJJTkd9IEFORCAoJHtXSU5ET1dTfSBPUiAke01BQ30pKQorICAgIGVycm9yX3NheSgiU3RhdHMtZ2F0aGVyaW5nIGZ1bmN0aW9uYWxpdHkgaXMgb25seSBzdXBwb3J0ZWQgb24geDg2LUxpbnV4IGFuZCBJbnRlbChSKSBNSUMgQXJjaGl0ZWN0dXJlIikKK2VuZGlmKCkKK2lmKCR7U1RBVFNfR0FUSEVSSU5HfSBBTkQgTk9UICgke0lBMzJ9IE9SICR7SU5URUw2NH0pKQorICAgIGVycm9yX3NheSgiU3RhdHMtZ2F0aGVyaW5nIGZ1bmN0aW9uYWxpdHkgaXMgb25seSBzdXBwb3J0ZWQgb24geDg2LUxpbnV4IGFuZCBJbnRlbChSKSBNSUMgQXJjaGl0ZWN0dXJlIikKK2VuZGlmKCkKK2lmKCR7VVNFX0FEQVBUSVZFX0xPQ0tTfSBBTkQgTk9UKCR7SUEzMn0gT1IgJHtJTlRFTDY0fSkpCisgICAgZXJyb3Jfc2F5KCJBZGFwdGl2ZSBsb2NrcyAoVFNYKSBmdW5jdGlvbmFsaXR5IGlzIG9ubHkgc3VwcG9ydGVkIG9uIHg4NiBBcmNoaXRlY3R1cmUiKQorZW5kaWYoKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAtIENyZWF0ZSB0aGUgc3VmZml4IGZvciB0aGUgZXhwb3J0IGRpcmVjdG9yeQorIyAtIE9ubHkgYWRkIHRvIHN1ZmZpeCB3aGVuIG5vdCBhIGRlZmF1bHQgdmFsdWUKKyMgLSBFeGFtcGxlIHN1ZmZpeDogLmRlYi4zMC5zMSAKKyMgICBmaW5hbCBleHBvcnQgZGlyZWN0b3J5OiBleHBvcnRzL2xpbl8zMmUuZGViLjMwLnMxL2xpYgorIyAtIFRoZXNlIHN1ZmZpeGVzIGltcGx5IHRoZSBidWlsZCBpcyBhIERlYnVnLCBPcGVuTVAgMy4wLCBTdGF0cy1HYXRoZXJpbmcgdmVyc2lvbiBvZiB0aGUgbGlicmFyeQoraWYoTk9UICIke2NtYWtlX2J1aWxkX3R5cGVfbG93ZXJjYXNlfSIgU1RSRVFVQUwgInJlbGVhc2UiKQorICAgIHN0cmluZyhTVUJTVFJJTkcgIiR7Y21ha2VfYnVpbGRfdHlwZV9sb3dlcmNhc2V9IiAwIDMgYnVpbGRfdHlwZV9zdWZmaXgpCisgICAgc2V0KHN1ZmZpeCAiJHtzdWZmaXh9LiR7YnVpbGRfdHlwZV9zdWZmaXh9IikKK2VuZGlmKCkKK2lmKE5PVCAiJHtvbXBfdmVyc2lvbn0iIFNUUkVRVUFMICI0MCIpCisgICAgc2V0KHN1ZmZpeCAiJHtzdWZmaXh9LiR7b21wX3ZlcnNpb259IikKK2VuZGlmKCkKK2lmKCR7U1RBVFNfR0FUSEVSSU5HfSkKKyAgICBzZXQoc3VmZml4ICIke3N1ZmZpeH0uczEiKQorZW5kaWYoKQoraWYoJHtNSUN9KQorICAgIGlmKE5PVCAiJHttaWNfYXJjaH0iIFNUUkVRVUFMICJrbmYiKQorICAgICAgICBzZXQoc3VmZml4ICIke3N1ZmZpeH0uJHttaWNfYXJjaH0iKQorICAgIGVuZGlmKCkKKyAgICBpZihOT1QgIiR7bWljX29zfSIgU1RSRVFVQUwgImJzZCIpCisgICAgICAgIHNldChzdWZmaXggIiR7c3VmZml4fS4ke21pY19vc30iKQorICAgIGVuZGlmKCkKK2VuZGlmKCkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFNldHRpbmcgZmlsZSBleHRlbnNpb25zIC8gc3VmZml4ZXMKK3NldChvYmogJHtDTUFLRV9DX09VVFBVVF9FWFRFTlNJT059ICAgKQorc2V0KGxpYiAke0NNQUtFX1NUQVRJQ19MSUJSQVJZX1NVRkZJWH0pCitzZXQoZGxsICR7Q01BS0VfU0hBUkVEX0xJQlJBUllfU1VGRklYfSkKK3NldChleGUgJHtDTUFLRV9FWEVDVVRBQkxFX1NVRkZJWH0gICAgKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEZpbmQgcGVybCBleGVjdXRhYmxlCisjIFBlcmwgaXMgdXNlZCB0byBjcmVhdGUgb21wLmggKGFuZCBvdGhlciBoZWFkZXJzKSBhbG9uZyB3aXRoIGttcF9pMThuX2lkLmluYyBhbmQga21wX2kxOG5fZGVmYXVsdC5pbmMgKHNlZSBiZWxvdyBpbiBSdWxlcyBzZWN0aW9uKQoraWYoTk9UICIke1BFUkxfRk9VTkR9IikgIyB2YXJpYWJsZSBpcyBkZWZpbmVkIGluIEZpbmRQZXJsIFN0YW5kYXJkIENNYWtlIE1vZHVsZQorICAgIGVycm9yX3NheSgiRXJyb3I6IENvdWxkIG5vdCBmaW5kIHZhbGlkIHBlcmwiKQorZW5kaWYoKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFNldHRpbmcgZGlyZWN0b3J5IG5hbWVzCitzZXQocGxhdGZvcm0gICAgICAgIiR7cmVhbF9vc31fJHthcmNofSIgICAgICAgICAgICAgICAgKSAjIGkuZS4sIGxpbl8zMmUsIG1hY18zMgorc2V0KGJ1aWxkX2RpciAgICAgICIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0iICAgICAgICkgIyBidWlsZCBkaXJlY3RvcnkgKFdoZXJlIENNYWtlQ2FjaGUudHh0IGlzIGNyZWF0ZWQsIGJ1aWxkIGZpbGVzIGdlbmVyYXRlZCkKK3NldChzcmNfZGlyICAgICAgICAiJHtMSUJPTVBfV09SS30vc3JjIiAgICAgICAgICAgICAgICApCitzZXQodG9vbHNfZGlyICAgICAgIiR7TElCT01QX1dPUkt9L3Rvb2xzIiAgICAgICAgICAgICAgKSAKK3NldChleHBvcnRfZGlyICAgICAiJHtMSUJPTVBfV09SS30vZXhwb3J0cyIgICAgICAgICAgICApIAorc2V0KGV4cG9ydF9jbW5fZGlyICIke2V4cG9ydF9kaXJ9L2NvbW1vbiR7c3VmZml4fSIgICAgICkgCitzZXQoZXhwb3J0X3B0Zl9kaXIgIiR7ZXhwb3J0X2Rpcn0vJHtwbGF0Zm9ybX0ke3N1ZmZpeH0iKQorX2V4cG9ydF9saWJfZGlyKCR7cGxhdGZvcm19IGV4cG9ydF9saWJfZGlyKSAgIyBzZXQgZXhwb3J0cyBkaXJlY3RvcnkgKHJlbGF0aXZlIHRvIGJ1aWxkX2RpcikgaS5lLiwgLi4vZXhwb3J0cy9saW5fMzJlL2xpYi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgb3IgaS5lLiwgLi4vZXhwb3J0cy9tYWNfMzJlL2xpYi50aGluLyBmb3IgbWFjCitpZigke01BQ30pCisgICAgIyBtYWNzIHVzZSBsaWIudGhpbi8gc3ViZGlyZWN0b3J5IGZvciBub24tZmF0IGxpYnJhcmllcyB0aGF0IG9ubHkgY29udGFpbiBvbmUgYXJjaGl0ZWN0dXJlCisgICAgIyBtYWNzIHVzZSBsaWIvIHN1YmRpcmVjdG9yeSBmb3IgZmF0IGxpYnJhcmllcyB0aGF0IGNvbnRhaW4gYm90aCBJQS0zMiBhcmNoaXRlY3R1cmUgYW5kIEludGVsKFIpIDY0IGFyY2hpdGVjdHVyZSBjb2RlLgorICAgIF9leHBvcnRfbGliX2ZhdF9kaXIoJHtwbGF0Zm9ybX0gZXhwb3J0X2xpYl9mYXRfZGlyKQorZW5kaWYoKQorc2V0KGluY19kaXIgICAgICAgICIke0xJQk9NUF9XT1JLfS9zcmMvaW5jbHVkZS8ke29tcF92ZXJzaW9ufSIpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgU2V0dGluZyBmaW5hbCBsaWJyYXJ5IG5hbWUKK3NldChsaWJfaXRlbSAibGliaW9tcCIpCitpZigke1BST0ZJTEVfTElCUkFSWX0pCisgICAgc2V0KGxpYl9pdGVtICIke2xpYl9pdGVtfXByb2YiKQorZW5kaWYoKQoraWYoJHtTVFVCU19MSUJSQVJZfSkKKyAgICBzZXQobGliX2l0ZW0gIiR7bGliX2l0ZW19c3R1YnMiKQorZW5kaWYoKQorc2V0KGxpYl9pdGVtICIke2xpYl9pdGVtfSR7dmVyc2lvbn0iKQoraWYoJHtXSU5ET1dTfSkKKyAgICBzZXQobGliX2l0ZW0gIiR7bGliX2l0ZW19bWQiKQorZW5kaWYoKQorc2V0KGxpYl9leHQgIiR7ZGxsfSIpCisjICR7bGliX2ZpbGV9IGlzIHJlYWwgbGlicmFyeSBuYW1lOgorIyBsaWJpb21wNS5zbyAgICBmb3IgTGludXgKKyMgbGliaW9tcDUuZHlsaWIgZm9yIE1hYworIyBsaWJpb21wNW1kLmRsbCBmb3IgV2luZG93cworc2V0KGxpYl9maWxlICIke2xpYl9pdGVtfSR7bGliX2V4dH0iKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFNldHRpbmcgZXhwb3J0IGZpbGUgbmFtZXMgKGZ1bGwgcGF0aHMpCitpZigke1dJTkRPV1N9KQorICAgIHNldChpbXBfZmlsZSAiJHtsaWJfaXRlbX0ke2xpYn0iKSAjIHRoaXMgaXMgZXhwb3J0ZWQgKGxpYmlvbXA1bWQubGliKQorICAgIHNldChkZWZfZmlsZSAiJHtsaWJfaXRlbX0uZGVmIikgIyB0aGlzIGlzIG5vdCBleHBvcnRlZAorICAgIHNldChyY19maWxlICAiJHtsaWJfaXRlbX0ucmMiKSAgIyB0aGlzIGlzIG5vdCBleHBvcnRlZAorICAgIGlmKCIke0NNQUtFX0JVSUxEX1RZUEV9IiBTVFJFUVVBTCAiRGVidWciIE9SICIke0NNQUtFX0JVSUxEX1RZUEV9IiBTVFJFUVVBTCAiUmVsV2l0aERlYkluZm8iIE9SICR7VVNFX0JVSUxEUExfUlVMRVN9KQorICAgICAgICBzZXQocGRiX2ZpbGUgIiR7bGliX2ZpbGV9LnBkYiIpICMgdGhpcyBpcyBleHBvcnRlZCBpZiBpdCBleGlzdHMgKGxpYmlvbXA1bWQuZGxsLnBkYikKKyAgICBlbmRpZigpCitlbmRpZigpCitzZXQoZXhwb3J0X2xpYl9maWxlcyAgIiR7bGliX2ZpbGV9IiAiJHtpbXBfZmlsZX0iICIke3BkYl9maWxlfSIpIAorc2V0KGV4cG9ydF9pbmNfZmlsZXMgICJpb21wX2xpYi5oIikKK3NldChleHBvcnRfbW9kX2ZpbGVzICAib21wX2xpYi5tb2QiICJvbXBfbGliX2tpbmRzLm1vZCIpCitzZXQoZXhwb3J0X2Ntbl9maWxlczEgIm9tcC5oIiAib21wX2xpYi5oIiAib21wX2xpYi5mIiAib21wX2xpYi5mOTAiKQorc2V0KGV4cG9ydF9jbW5fZmlsZXMyICJpb21wLmgiKQorYWRkX3ByZWZpeCgiJHtleHBvcnRfbGliX2Rpcn0vIiAgICAgICAgICAgICAgICBleHBvcnRfbGliX2ZpbGVzKQorYWRkX3ByZWZpeCgiJHtleHBvcnRfcHRmX2Rpcn0vaW5jbHVkZV9jb21wYXQvIiBleHBvcnRfaW5jX2ZpbGVzKQorYWRkX3ByZWZpeCgiJHtleHBvcnRfcHRmX2Rpcn0vaW5jbHVkZS8iICAgICAgICBleHBvcnRfbW9kX2ZpbGVzKQorYWRkX3ByZWZpeCgiJHtleHBvcnRfY21uX2Rpcn0vaW5jbHVkZS8iICAgICAgICBleHBvcnRfY21uX2ZpbGVzMSkKK2FkZF9wcmVmaXgoIiR7ZXhwb3J0X2Ntbl9kaXJ9L2luY2x1ZGVfY29tcGF0LyIgZXhwb3J0X2Ntbl9maWxlczIpCitzZXQoZXhwb3J0X2Ntbl9maWxlcyAiJHtleHBvcnRfY21uX2ZpbGVzMX0iICIke2V4cG9ydF9jbW5fZmlsZXMyfSIpCitpZigiJHtleHBvcnRfbGliX2ZhdF9kaXJ9IikKKyAgICBzZXQoZXhwb3J0X2xpYl9mYXRfZmlsZXMgIiR7bGliX2ZpbGV9IiAiJHtpbXBfZmlsZX0iKQorICAgIGFkZF9wcmVmaXgoIiR7ZXhwb3J0X2xpYl9mYXRfZGlyfS8iIGV4cG9ydF9saWJfZmF0X2ZpbGVzKQorZW5kaWYoKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEdldHRpbmcgbGVnYWwgdHlwZS9hcmNoCitzZXRfbGVnYWxfdHlwZShsZWdhbF90eXBlKQorc2V0X2xlZ2FsX2FyY2gobGVnYWxfYXJjaCkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBQcmVwcm9jZXNzb3IgRGVmaW5pdGlvbnMgKGNtYWtlL0RlZmluaXRpb25zLmNtYWtlKQorIyBQcmVwcm9jZXNzb3IgSW5jbHVkZXMgCisjIENvbXBpbGVyIChDL0MrKykgRmxhZ3MgKGNtYWtlL0NvbW1vbkZsYWdzLmNtYWtlKQorIyBBc3NlbWJsZXIgRmxhZ3MgKGNtYWtlL0NvbW1vbkZsYWdzLmNtYWtlKQorIyBGb3J0cmFuICAgRmxhZ3MgKGNtYWtlL0NvbW1vbkZsYWdzLmNtYWtlKQorIyBMaW5rZXIgICAgRmxhZ3MgKGNtYWtlL0NvbW1vbkZsYWdzLmNtYWtlKQorIyBBcmNoaXZlciAgRmxhZ3MgKGNtYWtlL0NvbW1vbkZsYWdzLmNtYWtlKQorIyBIZWxwZXIgUGVybCBTY3JpcHQgRmxhZ3MgKGNtYWtlL1BlcmxGbGFncy5jbWFrZSkKKyMgKiBJbnNpZGUgdGhlIGNtYWtlL0NvbW1vbkZsYWdzLmNtYWtlIGZpbGUsIHRoZSBVU0VSXypfRkxBR1MgYXJlIGFkZGVkLgorIyAqIENhbm5vdCB1c2UgQ01BS0VfKl9GTEFHUyBkaXJlY3RseSBiZWNhdXNlIC14IGMrKyBpcyBwdXQgaW4gdGhlIGxpbmtlciBjb21tYW5kIGFuZCBtYW5nbGVzIHRoZSBsaW5raW5nIHBoYXNlLgorCisjIHByZXByb2Nlc3NvciBmbGFncyAoLUQgZGVmaW5pdGlvbnMgYW5kIC1JIGluY2x1ZGVzKQorIyBHcmFiIGVudmlyb25tZW50IHZhcmlhYmxlIENQUEZMQUdTIGFuZCBhcHBlbmQgdGhvc2UgdG8gZGVmaW5pdGlvbnMKK3NldChpbmNsdWRlX2RpcnMgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9ICR7c3JjX2Rpcn0gJHtzcmNfZGlyfS9pMThuICR7aW5jX2Rpcn0gJHtzcmNfZGlyfS90aGlyZHBhcnR5L2l0dG5vdGlmeSkKK2luY2x1ZGVfZGlyZWN0b3JpZXMoJHtpbmNsdWRlX2RpcnN9KQorCisjIEdyYWIgYXNzZW1ibGVyLWRlcGVuZGVudCBmbGFncworIyBDTWFrZSB3aWxsIGxvb2sgZm9yIGNtYWtlLyR7Q01BS0VfQVNNX0NPTVBJTEVSX0lEfS9Bc21GbGFncy5jbWFrZSB0byBhcHBlbmQgYWRkaXRpb25hbCBhc3NlbWJsZXIgZmxhZ3MuCitpZigke1dJTkRPV1N9KQorICAgICMgV2luZG93cyBiYXNlZCBzeXN0ZW1zIHVzZSBDTUFLRV9BU01fTUFTTV9DT01QSUxFUgorICAgICMgVGhlIHdpbmRvd3MgYXNzZW1ibHkgZmlsZXMgYXJlIGluIE1BU00gZm9ybWF0LCBhbmQgdGhleSByZXF1aXJlIGEgdG9vbCB0aGF0IGNhbiBoYW5kbGUgTUFTTSBzeW50YXggKG1sLmV4ZSBvciBtbDY0LmV4ZSB0eXBpY2FsbHkpCisgICAgZW5hYmxlX2xhbmd1YWdlKEFTTV9NQVNNKSAKKyAgICBzZXQoQ01BS0VfTU9EVUxFX1BBVEggJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2NtYWtlLyR7Q01BS0VfQVNNX01BU01fQ09NUElMRVJfSUR9ICR7Q01BS0VfTU9EVUxFX1BBVEh9KQorICAgIGZpbmRfZmlsZShhc3NlbWJsZXJfc3BlY2lmaWNfaW5jbHVkZV9maWxlX2ZvdW5kIEFzbUZsYWdzLmNtYWtlICR7Q01BS0VfTU9EVUxFX1BBVEh9KQorICAgIGlmKGFzc2VtYmxlcl9zcGVjaWZpY19pbmNsdWRlX2ZpbGVfZm91bmQpCisgICAgICAgIGluY2x1ZGUoQXNtRmxhZ3MpCisgICAgICAgIGFwcGVuZF9hc3NlbWJsZXJfc3BlY2lmaWNfYXNtX2ZsYWdzKEFTTV9GTEFHUykKKyAgICBlbHNlKCkKKyAgICAgICAgd2FybmluZ19zYXkoIkNvdWxkIG5vdCBmaW5kIGNtYWtlLyR7Q01BS0VfQVNNX01BU01fQ09NUElMRVJfSUR9L0FzbUZsYWdzLmNtYWtlOiB3aWxsIG9ubHkgdXNlIGRlZmF1bHQgZmxhZ3MiKQorICAgIGVuZGlmKCkKK2Vsc2UoKQorICAgICMgVW5peCAoaW5jbHVkaW5nIE1hYykgYmFzZWQgc3lzdGVtcyB1c2UgQ01BS0VfQVNNX0NPTVBJTEVSCisgICAgIyBVbml4IGFzc2VtYmx5IGZpbGVzIGNhbiBiZSBoYW5kbGVkIGJ5IGNvbXBpbGVyIHVzdWFsbHkuCisgICAgZW5hYmxlX2xhbmd1YWdlKEFTTSkKKyAgICBzZXQoQ01BS0VfTU9EVUxFX1BBVEggJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2NtYWtlLyR7Q01BS0VfQVNNX0NPTVBJTEVSX0lEfSAke0NNQUtFX01PRFVMRV9QQVRIfSkKKyAgICBmaW5kX2ZpbGUoYXNzZW1ibGVyX3NwZWNpZmljX2luY2x1ZGVfZmlsZV9mb3VuZCBBc21GbGFncy5jbWFrZSAke0NNQUtFX01PRFVMRV9QQVRIfSkKKyAgICBpZihhc3NlbWJsZXJfc3BlY2lmaWNfaW5jbHVkZV9maWxlX2ZvdW5kKQorICAgICAgICBpbmNsdWRlKEFzbUZsYWdzKQorICAgICAgICBhcHBlbmRfYXNzZW1ibGVyX3NwZWNpZmljX2FzbV9mbGFncyhBU01fRkxBR1MpCisgICAgZWxzZSgpCisgICAgICAgIHdhcm5pbmdfc2F5KCJDb3VsZCBub3QgZmluZCBjbWFrZS8ke0NNQUtFX0FTTV9DT01QSUxFUl9JRH0vQXNtRmxhZ3MuY21ha2U6IHdpbGwgb25seSB1c2UgZGVmYXVsdCBmbGFncyIpCisgICAgZW5kaWYoKQorZW5kaWYoKQorIyBHcmFiIGNvbXBpbGVyLWRlcGVuZGVudCBmbGFncworIyBDbWFrZSB3aWxsIGxvb2sgZm9yIGNtYWtlLyR7Q01BS0VfQ19DT01QSUxFUl9JRH0vQ0ZsYWdzLmNtYWtlIHRvIGFwcGVuZCBhZGRpdGlvbmFsIGMsIGN4eCwgYW5kIGxpbmtlciBmbGFncy4KK3NldChDTUFLRV9NT0RVTEVfUEFUSCAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vY21ha2UvJHtDTUFLRV9DX0NPTVBJTEVSX0lEfSAke0NNQUtFX01PRFVMRV9QQVRIfSkKK2ZpbmRfZmlsZShjb21waWxlcl9zcGVjaWZpY19pbmNsdWRlX2ZpbGVfZm91bmQgQ0ZsYWdzLmNtYWtlICR7Q01BS0VfTU9EVUxFX1BBVEh9KQoraWYoY29tcGlsZXJfc3BlY2lmaWNfaW5jbHVkZV9maWxlX2ZvdW5kKQorICAgIGluY2x1ZGUoQ0ZsYWdzKSAjIENPTVBJTEVSX1NVUFBPUlRTX1FVQURfUFJFQ0lTSU9OIGNoYW5nZWQgaW4gaGVyZQorICAgIGFwcGVuZF9jb21waWxlcl9zcGVjaWZpY19jX2FuZF9jeHhfZmxhZ3MoQ19GTEFHUyBDWFhfRkxBR1MpCisgICAgYXBwZW5kX2NvbXBpbGVyX3NwZWNpZmljX2xpbmtlcl9mbGFncyhMRF9GTEFHUyBMRF9MSUJfRkxBR1MpCitlbHNlKCkKKyAgICB3YXJuaW5nX3NheSgiQ291bGQgbm90IGZpbmQgY21ha2UvJHtDTUFLRV9DX0NPTVBJTEVSX0lEfS9DRmxhZ3MuY21ha2U6IHdpbGwgb25seSB1c2UgZGVmYXVsdCBmbGFncyIpCitlbmRpZigpCisKKyMgR3JhYiBhbGwgdGhlIGNvbXBpbGVyLWluZGVwZW5kZW50IGZsYWdzCithcHBlbmRfY19hbmRfY3h4X2ZsYWdzX2NvbW1vbihDX0ZMQUdTIENYWF9GTEFHUykgCithcHBlbmRfYXNtX2ZsYWdzX2NvbW1vbihBU01fRkxBR1MpCithcHBlbmRfZm9ydF9mbGFnc19jb21tb24oRl9GTEFHUykKK2FwcGVuZF9saW5rZXJfZmxhZ3NfY29tbW9uKExEX0ZMQUdTIExEX0xJQl9GTEFHUykKK2FwcGVuZF9hcmNoaXZlcl9mbGFnc19jb21tb24oQVJfRkxBR1MpCithcHBlbmRfY3BwX2ZsYWdzKERFRklOSVRJT05TX0ZMQUdTKQorCisjIFNldHVwIHRoZSBmbGFncyBjb3JyZWN0bHkgZm9yIGNtYWtlIChjb3ZlcnQgdG8gc3RyaW5nKQorIyBQcmV0dHkgdGhlbSB1cCAoU1RSSVAgYW55IGJlZ2lubmluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSkKK2xpc3RfdG9fc3RyaW5nKCIke0RFRklOSVRJT05TX0ZMQUdTfSIgREVGSU5JVElPTlNfRkxBR1MpCitsaXN0X3RvX3N0cmluZygiJHtDX0ZMQUdTfSIgICAgICAgICAgIENfRkxBR1MgICAgICAgICAgKQorbGlzdF90b19zdHJpbmcoIiR7Q1hYX0ZMQUdTfSIgICAgICAgICBDWFhfRkxBR1MgICAgICAgICkKK2xpc3RfdG9fc3RyaW5nKCIke0FTTV9GTEFHU30iICAgICAgICAgQVNNX0ZMQUdTICAgICAgICApCitsaXN0X3RvX3N0cmluZygiJHtMRF9GTEFHU30iICAgICAgICAgIExEX0ZMQUdTICAgICAgICAgKQorbGlzdF90b19zdHJpbmcoIiR7TERfTElCX0ZMQUdTfSIgICAgICBMRF9MSUJfRkxBR1MgICAgICkKK2xpc3RfdG9fc3RyaW5nKCIke0FSX0ZMQUdTfSIgICAgICAgICAgQVJfRkxBR1MgICAgICAgICApICMgV2luZG93cyBzcGVjaWZpYyBmb3IgY3JlYXRpbmcgaW1wb3J0IGxpYnJhcnkKK3N0cmluZyhTVFJJUCAgICIke0RFRklOSVRJT05TX0ZMQUdTfSIgREVGSU5JVElPTlNfRkxBR1MpCitzdHJpbmcoU1RSSVAgICAiJHtDX0ZMQUdTfSIgICAgICAgICAgIENfRkxBR1MgICAgICAgICAgKQorc3RyaW5nKFNUUklQICAgIiR7Q1hYX0ZMQUdTfSIgICAgICAgICBDWFhfRkxBR1MgICAgICAgICkKK3N0cmluZyhTVFJJUCAgICIke0FTTV9GTEFHU30iICAgICAgICAgQVNNX0ZMQUdTICAgICAgICApCitzdHJpbmcoU1RSSVAgICAiJHtMRF9GTEFHU30iICAgICAgICAgIExEX0ZMQUdTICAgICAgICAgKQorc3RyaW5nKFNUUklQICAgIiR7TERfTElCX0ZMQUdTfSIgICAgICBMRF9MSUJfRkxBR1MgICAgICkKK3N0cmluZyhTVFJJUCAgICIke0FSX0ZMQUdTfSIgICAgICAgICAgQVJfRkxBR1MgICAgICAgICApICMgV2luZG93cyBzcGVjaWZpYyBmb3IgY3JlYXRpbmcgaW1wb3J0IGxpYnJhcnkKKworIyBHcmFiIHRoZSBQZXJsIGZsYWdzCitzZXRfZXZfZmxhZ3MoZXZfZmxhZ3MpICMgZXhwYW5kLXZhcnMucGwgZmxhZ3MKK3NldF9nZF9mbGFncyhnZF9mbGFncykgIyBnZW5lcmF0ZS1kZWYucGwgZmxhZ3MgKFdpbmRvd3Mgb25seSkKK3NldChvYV9vcHRzICItLW9zPSR7cmVhbF9vc30iICItLWFyY2g9JHthcmNofSIpICMgc2VudCB0byB0aGUgcGVybCBzY3JpcHRzCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBHZXR0aW5nIGNvcnJlY3Qgc291cmNlIGZpbGVzIChjbWFrZS9Tb3VyY2VGaWxlcy5jbWFrZSkKK3NldF9jX2ZpbGVzKGxpYl9jX2l0ZW1zKQorc2V0X2NwcF9maWxlcyhsaWJfY3h4X2l0ZW1zKQorc2V0X2FzbV9maWxlcyhsaWJfYXNtX2l0ZW1zKQorc2V0X2ltcF9jX2ZpbGVzKGltcF9jX2l0ZW1zKSAjIFdpbmRvd3Mtc3BlY2lmaWMKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgU2V0dGluZyBhbGwgc291cmNlIGZpbGUgdmFyaWFibGVzCitzZXQobGliX3NyY19maWxlcyAiJHtsaWJfY19pdGVtc30iICIke2xpYl9jeHhfaXRlbXN9IiAiJHtsaWJfYXNtX2l0ZW1zfSIpCitzZXQoaW1wX3NyY19maWxlcyAiJHtpbXBfY19pdGVtc30iKQorYWRkX3ByZWZpeCgiJHtzcmNfZGlyfS8iIGxpYl9zcmNfZmlsZXMpCithZGRfcHJlZml4KCIke3NyY19kaXJ9LyIgaW1wX3NyY19maWxlcykgIyBXaW5kb3dzLXNwZWNpZmljCithZGRfcHJlZml4KCIke3NyY19kaXJ9LyIgbGliX2NfaXRlbXMgICkKK2FkZF9wcmVmaXgoIiR7c3JjX2Rpcn0vIiBsaWJfY3h4X2l0ZW1zKQorYWRkX3ByZWZpeCgiJHtzcmNfZGlyfS8iIGxpYl9hc21faXRlbXMpCithZGRfcHJlZml4KCIke3NyY19kaXJ9LyIgaW1wX2NfaXRlbXMgICkgIyBXaW5kb3dzLXNwZWNpZmljCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBEZWJ1ZyBwcmludCBvdXRzLiAgV2lsbCBwcmludCAidmFyaWFibGUgPSAke3ZhcmlhYmxlfSIgaWYgR0xPQkFMX0RFQlVHID09IDEKK2lmKEdMT0JBTF9ERUJVRykKKyAgICBpbmNsdWRlKENNYWtlUHJpbnRTeXN0ZW1JbmZvcm1hdGlvbikKK2VuZGlmKCkKK2RlYnVnX3NheV92YXIoQ01BS0VfQVNNX0NPTVBJTEVfT0JKRUNUKQorZGVidWdfc2F5X3ZhcihDTUFLRV9SQ19DT01QSUxFUikKK2RlYnVnX3NheV92YXIoQ01BS0VfQ19DT01QSUxFUl9JRCkKK2RlYnVnX3NheV92YXIoTElCT01QX1dPUkspCitkZWJ1Z19zYXlfdmFyKGRhdGUpCitkZWJ1Z19zYXlfdmFyKHN0YXRzKQorZGVidWdfc2F5X3ZhcihsaWJfZmlsZSkKK2RlYnVnX3NheV92YXIoZXhwb3J0X2xpYl9maWxlcykKK2RlYnVnX3NheV92YXIoREVGSU5JVElPTlNfRkxBR1MpCitkZWJ1Z19zYXlfdmFyKENfRkxBR1MpCitkZWJ1Z19zYXlfdmFyKENYWF9GTEFHUykKK2RlYnVnX3NheV92YXIoQVNNX0ZMQUdTKQorZGVidWdfc2F5X3ZhcihGX0ZMQUdTKQorZGVidWdfc2F5X3ZhcihMRF9GTEFHUykKK2RlYnVnX3NheV92YXIoTERfTElCX0ZMQUdTKQorZGVidWdfc2F5X3ZhcihBUl9GTEFHUykKK2RlYnVnX3NheV92YXIoZXZfZmxhZ3MpCitkZWJ1Z19zYXlfdmFyKGdkX2ZsYWdzKQorZGVidWdfc2F5X3ZhcihvYV9vcHRzKQorZGVidWdfc2F5X3ZhcihsaWJfY19pdGVtcykKK2RlYnVnX3NheV92YXIobGliX2N4eF9pdGVtcykKK2RlYnVnX3NheV92YXIobGliX2FzbV9pdGVtcykKK2RlYnVnX3NheV92YXIoaW1wX2NfaXRlbXMpCitkZWJ1Z19zYXlfdmFyKGxpYl9zcmNfZmlsZXMpCitkZWJ1Z19zYXlfdmFyKGltcF9zcmNfZmlsZXMpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgICAgICAgICAgIworIyAgICAgICAgICAgICAgICAgICAgIC0tLSBSdWxlcy9SZWNpcGVzIC0tLSAgICAgICAgICAgICAgICAgICAgICAgICMKKyMgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgICAgICAjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCZWxvdywgJHtsZGVwc30gYWx3YXlzIHN0YW5kcyBmb3IgImxvY2FsIGRlcGVuZGVuY2llcyIgZm9yIHRoZSAKKyMgbmV4dCBpbW1lZGlhdGUgdGFyZ2V0IHRvIGJlIGNyZWF0ZWQgdmlhIGFkZF9jdXN0b21fdGFyZ2V0KCkgb3IgCisjIGFkZF9jdXN0b21fY29tbWFuZCgpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIC0tLSBDcmVhdGUgYWxsIC0tLQorYWRkX2N1c3RvbV90YXJnZXQobGliIEFMTCBERVBFTkRTICR7ZXhwb3J0X2xpYl9maWxlc30pCithZGRfY3VzdG9tX3RhcmdldChpbmMgQUxMIERFUEVORFMgJHtleHBvcnRfaW5jX2ZpbGVzfSkKK2lmKCR7Y3JlYXRlX2ZvcnRyYW5fbW9kdWxlc30pCithZGRfY3VzdG9tX3RhcmdldChtb2QgQUxMIERFUEVORFMgJHtleHBvcnRfbW9kX2ZpbGVzfSkKK2VuZGlmKCkKKyMgLS0tIEVuZm9yY2UgdGhlIHRlc3RzIHRvIGJlIGNvbXBsZXRlZC9za2lwcGVkIGJlZm9yZSBjb3B5aW5nIHRvIGV4cG9ydHMgZGlyZWN0b3J5IC0tLQoraWYoJHt0ZXN0c30pCisgICAgaWYoJHtXSU5ET1dTfSkKKyAgICAgICAgc2V0KHRlc3QtZGVwZW5kZW5jaWVzIHRlc3QtdG91Y2gtbXQvLnN1Y2Nlc3MgdGVzdC10b3VjaC1tZC8uc3VjY2VzcyB0ZXN0LXJlbG8vLnN1Y2Nlc3MgdGVzdC1leGVjc3RhY2svLnN1Y2Nlc3MgdGVzdC1pbnN0ci8uc3VjY2VzcyB0ZXN0LWRlcHMvLnN1Y2Nlc3MpCisgICAgZWxzZSgpCisgICAgICAgIHNldCh0ZXN0LWRlcGVuZGVuY2llcyB0ZXN0LXRvdWNoLXJ0Ly5zdWNjZXNzIHRlc3QtcmVsby8uc3VjY2VzcyB0ZXN0LWV4ZWNzdGFjay8uc3VjY2VzcyB0ZXN0LWluc3RyLy5zdWNjZXNzIHRlc3QtZGVwcy8uc3VjY2VzcykKKyAgICBlbmRpZigpCisgICAgc2V0X3NvdXJjZV9maWxlc19wcm9wZXJ0aWVzKCR7ZXhwb3J0X2xpYl9maWxlc30gUFJPUEVSVElFUyBPQkpFQ1RfREVQRU5EUyAiJHt0ZXN0LWRlcGVuZGVuY2llc30iKQorZW5kaWYoKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAtLS0gQ3JlYXRlIENvbW1vbiBGaWxlcyAtLS0KK2FkZF9jdXN0b21fdGFyZ2V0KGNvbW1vbiBERVBFTkRTICR7ZXhwb3J0X2Ntbl9maWxlc30pCithZGRfY3VzdG9tX3RhcmdldChjbGVhbi1jb21tb24gQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIHJlbW92ZSAtZiAke2V4cG9ydF9jbW5fZmlsZXN9KQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgLS0tIENvcHkgZmlsZXMgdG8gZXhwb3J0IGRpcmVjdG9yaWVzIC0tLQorIyAtIGp1c3QgYSBzaW1wbGUgY29weSByZWNpcGUgd2hpY2ggYWN0cyBhcyBhbiBpbnN0YWxsIHN0ZXAKKyMgLSBjb3BpZXMgb3V0IG9mIHRoZSBzcmNfZGlyIGludG8gdGhlIGRlc3RfZGlyCisjCisjIGRlc3RfZGlyL3RhcmdldCA6IHNyY19kaXIvdGFyZ2V0CisjICAgIGNwIHNyY19kaXIvdGFyZ2V0IGRlc3RfZGlyL3RhcmdldAorbWFjcm8gKHNpbXBsZV9jb3B5X3JlY2lwZSB0YXJnZXQgc3JjX2RpciBkZXN0X2RpcikKKyAgICBnZXRfc291cmNlX2ZpbGVfcHJvcGVydHkoZXh0cmFfZGVwZW5kcyAke2Rlc3RfZGlyfS8ke3RhcmdldH0gT0JKRUNUX0RFUEVORFMpCisgICAgaWYoIiR7ZXh0cmFfZGVwZW5kc30iIE1BVENIRVMgIk5PVEZPVU5EIikKKyAgICAgICAgc2V0KGV4dHJhX2RlcGVuZHMpCisgICAgZW5kaWYoKQorICAgIHNldChsZGVwcyAke3NyY19kaXJ9LyR7dGFyZ2V0fSAiJHtleHRyYV9kZXBlbmRzfSIpCisgICAgaWYoTk9UICIke3RhcmdldH0iIFNUUkVRVUFMICIiKQorICAgICAgICBmaWxlKE1BS0VfRElSRUNUT1JZICR7ZGVzdF9kaXJ9KSAjIG1ha2Ugc3VyZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgZXhpc3RzCisgICAgICAgIGFkZF9jdXN0b21fY29tbWFuZCgKKyAgICAgICAgICAgIE9VVFBVVCAgICR7ZGVzdF9kaXJ9LyR7dGFyZ2V0fQorICAgICAgICAgICAgQ09NTUFORCAgJHtDTUFLRV9DT01NQU5EfSAtRSBjb3B5ICR7c3JjX2Rpcn0vJHt0YXJnZXR9ICR7ZGVzdF9kaXJ9LyR7dGFyZ2V0fQorICAgICAgICAgICAgREVQRU5EUyAgJHtsZGVwc30KKyAgICAgICAgKQorICAgIGVuZGlmKCkKK2VuZG1hY3JvKCkKKyMgY29weSBmcm9tIGJ1aWxkIGRpcmVjdG9yeSB0byBmaW5hbCByZXN0aW5nIHBsYWNlcyBpbiBleHBvcnRzIGRpcmVjdG9yeQorc2ltcGxlX2NvcHlfcmVjaXBlKCJvbXAuaCIgICAgICAgICAgICAgIiR7YnVpbGRfZGlyfSIgICIke2V4cG9ydF9jbW5fZGlyfS9pbmNsdWRlIikKK3NpbXBsZV9jb3B5X3JlY2lwZSgib21wX2xpYi5oIiAgICAgICAgICIke2J1aWxkX2Rpcn0iICAiJHtleHBvcnRfY21uX2Rpcn0vaW5jbHVkZSIpCitzaW1wbGVfY29weV9yZWNpcGUoIm9tcF9saWIuZiIgICAgICAgICAiJHtidWlsZF9kaXJ9IiAgIiR7ZXhwb3J0X2Ntbl9kaXJ9L2luY2x1ZGUiKQorc2ltcGxlX2NvcHlfcmVjaXBlKCJvbXBfbGliLmY5MCIgICAgICAgIiR7YnVpbGRfZGlyfSIgICIke2V4cG9ydF9jbW5fZGlyfS9pbmNsdWRlIikKK3NpbXBsZV9jb3B5X3JlY2lwZSgiaW9tcC5oIiAgICAgICAgICAgICIke2J1aWxkX2Rpcn0iICAiJHtleHBvcnRfY21uX2Rpcn0vaW5jbHVkZV9jb21wYXQiKQorc2ltcGxlX2NvcHlfcmVjaXBlKCIke2xpYl9maWxlfSIgICAgICAgIiR7YnVpbGRfZGlyfSIgICIke2V4cG9ydF9saWJfZGlyfSIpCitzaW1wbGVfY29weV9yZWNpcGUoIiR7aW1wX2ZpbGV9IiAgICAgICAiJHtidWlsZF9kaXJ9IiAgIiR7ZXhwb3J0X2xpYl9kaXJ9IikKK3NpbXBsZV9jb3B5X3JlY2lwZSgiJHtwZGJfZmlsZX0iICAgICAgICIke2J1aWxkX2Rpcn0iICAiJHtleHBvcnRfbGliX2Rpcn0iKQorc2ltcGxlX2NvcHlfcmVjaXBlKCIke2RiZ19maWxlfSIgICAgICAgIiR7YnVpbGRfZGlyfSIgICIke2V4cG9ydF9saWJfZGlyfSIpCitzaW1wbGVfY29weV9yZWNpcGUoIm9tcF9saWIubW9kIiAgICAgICAiJHtidWlsZF9kaXJ9IiAgIiR7ZXhwb3J0X3B0Zl9kaXJ9L2luY2x1ZGUiKQorc2ltcGxlX2NvcHlfcmVjaXBlKCJvbXBfbGliX2tpbmRzLm1vZCIgIiR7YnVpbGRfZGlyfSIgICIke2V4cG9ydF9wdGZfZGlyfS9pbmNsdWRlIikKK3NpbXBsZV9jb3B5X3JlY2lwZSgiaW9tcF9saWIuaCIgICAgICAgICIke2J1aWxkX2Rpcn0iICAiJHtleHBvcnRfcHRmX2Rpcn0vaW5jbHVkZV9jb21wYXQiKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgLS0tIEJ1aWxkIHRoZSBtYWluIGxpYnJhcnkgLS0tCisjICQobGliX2ZpbGUpIDw9PSBNYWluIGxpYnJhcnkgZmlsZSB0byBjcmVhdGUKKworIyBvYmplY3RzIGRlcGVuZCBvbiA6IC5pbmMgZmlsZXMgYW5kIG9tcC5oCisjIFRoaXMgd2F5IHRoZSAqLmluYyBhbmQgb21wLmggYXJlIGdlbmVyYXRlZCBiZWZvcmUgYW55IGNvbXBpbGF0aW9ucyB0YWtlIHBsYWNlCithZGRfY3VzdG9tX3RhcmdldChuZWVkZWQtaGVhZGVycyBERVBFTkRTICR7YnVpbGRfZGlyfS9rbXBfaTE4bl9pZC5pbmMgJHtidWlsZF9kaXJ9L2ttcF9pMThuX2RlZmF1bHQuaW5jICR7YnVpbGRfZGlyfS9vbXAuaCkKKworIyBGb3IgV2luZG93cywgdGhlcmUgaXMgYSBkZWZpbml0aW9ucyBmaWxlICguZGVmKSBhbmQgcmVzb3VyY2UgZmlsZSAoLnJlcykgY3JlYXRlZCB1c2luZyBnZW5lcmF0ZS1kZWYucGwgYW5kIHJjLmV4ZSByZXNwZWN0aXZlbHkuCitpZigke1dJTkRPV1N9KQorICAgIGFkZF9jdXN0b21fdGFyZ2V0KG5lZWRlZC13aW5kb3dzLWZpbGVzIERFUEVORFMgJHtidWlsZF9kaXJ9LyR7ZGVmX2ZpbGV9ICR7YnVpbGRfZGlyfS8ke3JjX2ZpbGV9KQorICAgIGxpc3QoQVBQRU5EIGxpYl9zcmNfZmlsZXMgJHtidWlsZF9kaXJ9LyR7cmNfZmlsZX0pCisgICAgIyBUaGUgd2luZG93cyBhc3NlbWJseSBmaWxlcyBhcmUgaW4gTUFTTSBmb3JtYXQsIGFuZCB0aGV5IHJlcXVpcmUgYSB0b29sIHRoYXQgY2FuIGhhbmRsZSBNQVNNIHN5bnRheCAobWwuZXhlIG9yIG1sNjQuZXhlIHR5cGljYWxseSkKKyAgICBlbmFibGVfbGFuZ3VhZ2UoQVNNX01BU00pIAorZWxzZSgpCisgICAgIyBVbml4IGFzc2VtYmx5IGZpbGVzIGNhbiBiZSBoYW5kbGVkIGJ5IGNvbXBpbGVyLgorICAgIGVuYWJsZV9sYW5ndWFnZShBU00pCitlbmRpZigpCisKKyMgUmVtb3ZlIGFueSBjbWFrZS1hdXRvbWF0aWMgbGlua2luZyBvZiBsaWJyYXJpZXMgYnkgbGlua2VyLCBUaGlzIGlzIHNvIGxpbnV4IAorIyBhbmQgbWFjIGRvbid0IGluY2x1ZGUgbGlic3RkYysrIGp1c3QgYmVjYXVzZSB3ZSBjb21waWxlIGMrKyBmaWxlcy4KK2lmKCR7VVNFX1BSRURFRklORURfTElOS0VSX0ZMQUdTfSkKKyAgICBzZXQoQ01BS0VfQ19JTVBMSUNJVF9MSU5LX0xJQlJBUklFUyAgICIiKQorICAgIHNldChDTUFLRV9DWFhfSU1QTElDSVRfTElOS19MSUJSQVJJRVMgIiIpCisgICAgc2V0KENNQUtFX0FTTV9JTVBMSUNJVF9MSU5LX0xJQlJBUklFUyAiIikKK2VuZGlmKCkKKworIyAtLS0gJHtsaWJfZmlsZX0gcnVsZSAtLS0KK2FkZF9saWJyYXJ5KGlvbXA1IFNIQVJFRCAke2xpYl9zcmNfZmlsZXN9KQorc2V0X3RhcmdldF9wcm9wZXJ0aWVzKGlvbXA1IFBST1BFUlRJRVMgCisgICAgUFJFRklYICIiIFNVRkZJWCAiIiAgICAgICAgICAjIFRha2UgY29udHJvbCAKKyAgICBPVVRQVVRfTkFNRSAiJHtsaWJfZmlsZX0iICAgICMgb2Ygb3V0cHV0IG5hbWUKKyAgICBMSU5LX0ZMQUdTICAiJHtMRF9GTEFHU30iICAgICAKKyAgICBMSU5LRVJfTEFOR1VBR0UgQyAgICAgICAgICAgICMgdXNlIEMgQ29tcGlsZXIgZm9yIGxpbmtpbmcgc3RlcAorICAgIFNLSVBfQlVJTERfUlBBVEggdHJ1ZSAgICAgICAgIyBoYXZlIE1hYyBsaW5rZXIgLWluc3RhbGxfbmFtZSBqdXN0IGJlICItaW5zdGFsbF9uYW1lIGxpYmlvbXA1LmR5bGliIgorKQorIyBUYXJnZXQgbGliIChleHBvcnQgZmlsZXMpIGRlcGVuZCBvbiB0aGUgbGlicmFyeSAoaW9tcDUpIGJlaW5nIGJ1aWx0CithZGRfZGVwZW5kZW5jaWVzKGxpYiBpb21wNSkKKworIyBMaW5raW5nIGNvbW1hbmQgd2lsbCBpbmNsdWRlIGxpYnJhcmllcyBpbiBMRF9MSUJfRkxBR1MKK3RhcmdldF9saW5rX2xpYnJhcmllcyhpb21wNSAke0xEX0xJQl9GTEFHU30pCisKKyMgQ3JlYXRlICouaW5jIGFuZCBvbXAuaCBiZWZvcmUgY29tcGlsaW5nIGFueSBzb3VyY2VzCithZGRfZGVwZW5kZW5jaWVzKGlvbXA1IG5lZWRlZC1oZWFkZXJzKQoraWYoJHtXSU5ET1dTfSkKKyMgQ3JlYXRlIC5kZWYgYW5kIC5yYyBmaWxlIGJlZm9yZSBjb21waWxpbmcgYW55IHNvdXJjZXMKKyAgICBhZGRfZGVwZW5kZW5jaWVzKGlvbXA1IG5lZWRlZC13aW5kb3dzLWZpbGVzKQorZW5kaWYoKQorCisjIFNldCB0aGUgY29tcGlsZXIgZmxhZ3MgZm9yIGVhY2ggdHlwZSBvZiBzb3VyY2UKK3NldF9zb3VyY2VfZmlsZXNfcHJvcGVydGllcygke2xpYl9jX2l0ZW1zfSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAke2ltcF9jX2l0ZW1zfSAgIFBST1BFUlRJRVMgQ09NUElMRV9GTEFHUyAiJHtDX0ZMQUdTfSIgICkKK3NldF9zb3VyY2VfZmlsZXNfcHJvcGVydGllcygke2xpYl9jeHhfaXRlbXN9IFBST1BFUlRJRVMgQ09NUElMRV9GTEFHUyAiJHtDWFhfRkxBR1N9IikKK3NldF9zb3VyY2VfZmlsZXNfcHJvcGVydGllcygke2xpYl9hc21faXRlbXN9IFBST1BFUlRJRVMgQ09NUElMRV9GTEFHUyAiJHtBU01fRkxBR1N9IikKKyMgU2V0IHRoZSAtRCBkZWZpbml0aW9ucyBmb3IgYWxsIHNvdXJjZXMKK2FkZF9kZWZpbml0aW9ucygke0RFRklOSVRJT05TX0ZMQUdTfSkKKworIyBJZiBjcmVhdGluZyBhIGJ1aWxkIHRoYXQgaW1pdGF0ZXMgYnVpbGQucGwncyBydWxlcyB0aGVuIHNldCBVU0VfQlVJTERQTF9SVUxFUyB0byB0cnVlCitpZigke1VTRV9CVUlMRFBMX1JVTEVTfSkKKyAgICBpbmNsdWRlKEJ1aWxkUExSdWxlcykKK2VuZGlmKCkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIC0tLSBTb3VyY2UgZmlsZSBzcGVjaWZpYyBmbGFncyAtLS0KKyMga21wX3ZlcnNpb24ubyA6IC1EIF9LTVBfQlVJTERfVElNRT0iXCIkKGRhdGUpfVwiIgorc2V0X3NvdXJjZV9maWxlc19wcm9wZXJ0aWVzKCR7c3JjX2Rpcn0va21wX3ZlcnNpb24uYyAgUFJPUEVSVElFUyBDT01QSUxFX0RFRklOSVRJT05TICJfS01QX0JVSUxEX1RJTUU9XCJcXFwiJHtkYXRlfVxcXCJcIiIpCisKKyMgel9MaW51eF9hc20ubyA6IC1EIEtNUF9BUkNIXyoKK2lmKCR7QVJNfSkKKyAgICBzZXRfc291cmNlX2ZpbGVzX3Byb3BlcnRpZXMoJHtzcmNfZGlyfS96X0xpbnV4X2FzbS5zIFBST1BFUlRJRVMgQ09NUElMRV9ERUZJTklUSU9OUyAiS01QX0FSQ0hfQVJNIikKK2Vsc2VpZigke0FBUkNINjR9KQorICAgIHNldF9zb3VyY2VfZmlsZXNfcHJvcGVydGllcygke3NyY19kaXJ9L3pfTGludXhfYXNtLnMgUFJPUEVSVElFUyBDT01QSUxFX0RFRklOSVRJT05TICJLTVBfQVJDSF9BQVJDSDY0IikgICAgIAorZWxzZWlmKCR7SU5URUw2NH0pCisgICAgc2V0X3NvdXJjZV9maWxlc19wcm9wZXJ0aWVzKCR7c3JjX2Rpcn0vel9MaW51eF9hc20ucyBQUk9QRVJUSUVTIENPTVBJTEVfREVGSU5JVElPTlMgIktNUF9BUkNIX1g4Nl82NCIpCitlbHNlaWYoJHtJQTMyfSkKKyAgICBzZXRfc291cmNlX2ZpbGVzX3Byb3BlcnRpZXMoJHtzcmNfZGlyfS96X0xpbnV4X2FzbS5zIFBST1BFUlRJRVMgQ09NUElMRV9ERUZJTklUSU9OUyAiS01QX0FSQ0hfWDg2IikKK2Vsc2VpZigke1BQQzY0fSkKKwlzZXRfc291cmNlX2ZpbGVzX3Byb3BlcnRpZXMoJHtzcmNfZGlyfS96X0xpbnV4X2FzbS5zIFBST1BFUlRJRVMgQ09NUElMRV9ERUZJTklUSU9OUyAiS01QX0FSQ0hfUFBDNjQiKQorZW5kaWYoKQorCitpZigke1dJTkRPV1N9KQorICAgIHNldF9zb3VyY2VfZmlsZXNfcHJvcGVydGllcygke3NyY19kaXJ9L3RoaXJkcGFydHkvaXR0bm90aWZ5L2l0dG5vdGlmeV9zdGF0aWMuYyBQUk9QRVJUSUVTIENPTVBJTEVfREVGSU5JVElPTlMgIlVOSUNPREUiKQorZW5kaWYoKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgTUFDIHNwZWNpZmljIGJ1aWxkIHJ1bGVzCitpZigke01BQ30pCisgICAgIyBmYXQgbGlicmFyeSBydWxlcworICAgIGlmKCR7SU5URUw2NH0pCisgICAgICAgIF9leHBvcnRfbGliX2ZhdF9kaXIoICJtYWNfMzJlIiBleHBvcnRfZmF0X21hY18zMmUpCisgICAgICAgIF9leHBvcnRfbGliX2RpciggICAgICJtYWNfMzIiICBleHBvcnRfbWFjXzMyICAgICApCisgICAgICAgIF9leHBvcnRfbGliX2RpciggICAgICJtYWNfMzJlIiBleHBvcnRfbWFjXzMyZSAgICApCisgICAgICAgIGZpbGUoTUFLRV9ESVJFQ1RPUlkgJHtleHBvcnRfZmF0X21hY18zMmV9KQorICAgICAgICBhZGRfY3VzdG9tX3RhcmdldChmYXQKKyAgICAgICAgICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSBlY2hvIEJ1aWxkaW5nIDMyIGFuZCAzMmUgZmF0IGxpYnJhcmllcyBmcm9tICR7ZXhwb3J0X21hY18zMn0vJHtsaWJfZmlsZX0gYW5kICR7ZXhwb3J0X21hY18zMmV9LyR7bGliX2ZpbGV9CisgICAgICAgICAgICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgZWNobyBXaWxsIHB1dCBmYXQgbGlicmFyeSBpbiAke2V4cG9ydF9mYXRfbWFjXzMyZX0gZGlyZWN0b3J5CisgICAgICAgICAgICBDT01NQU5EIGxpcG8gLWNyZWF0ZSAtb3V0cHV0ICR7ZXhwb3J0X2ZhdF9tYWNfMzJlfS8ke2xpYl9maWxlfSAke2V4cG9ydF9tYWNfMzJ9LyR7bGliX2ZpbGV9ICR7ZXhwb3J0X21hY18zMmV9LyR7bGliX2ZpbGV9CisgICAgICAgICkKKyAgICBlbmRpZigpCitlbmRpZigpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBXaW5kb3dzIHNwZWNpZmljIGJ1aWxkIHJ1bGVzCitpZigke1dJTkRPV1N9KQorCisgICAgIyAtLS0gQ3JlYXRlICQoaW1wX2ZpbGUpIC0tLQorICAgICMgVGhpcyBmaWxlIGlzIGZpcnN0IGNyZWF0ZWQgaW4gdGhlIHVuc3RyaXBwZWQvJHtsaWJfZmlsZX0gY3JlYXRpb24gc3RlcC4KKyAgICAjIEl0IGlzIHRoZW4gInJlLWxpbmtlZCIgdG8gaW5jbHVkZSBrbXBfaW1wb3J0LmMgd2hpY2ggcHJldmVudHMgbGlua2luZyBvZiBib3RoIFZpc3VhbCBTdHVkaW8gT3Blbk1QIGFuZCBuZXdseSBidWlsdCBPcGVuTVAKKyAgICBpZihOT1QgIiR7aW1wX2ZpbGV9IiBTVFJFUVVBTCAiIikKKyAgICAgICAgc2V0KGdlbmVyYXRlZF9pbXBvcnRfZmlsZSAke2xpYl9maWxlfSR7bGlifSkKKyAgICAgICAgYWRkX2xpYnJhcnkoaW9tcDVpbXAgU1RBVElDICR7Z2VuZXJhdGVkX2ltcG9ydF9maWxlfSAke2ltcF9zcmNfZmlsZXN9KQorICAgICAgICBzZXRfc291cmNlX2ZpbGVzX3Byb3BlcnRpZXMoJHtnZW5lcmF0ZWRfaW1wb3J0X2ZpbGV9IFBST1BFUlRJRVMgR0VORVJBVEVEIFRSVUUgRVhURVJOQUxfT0JKRUNUIFRSVUUpCisgICAgICAgIHNldF90YXJnZXRfcHJvcGVydGllcyhpb21wNWltcCBQUk9QRVJUSUVTCisgICAgICAgICAgICBQUkVGSVggIiIgU1VGRklYICIiCisgICAgICAgICAgICBPVVRQVVRfTkFNRSAiJHtpbXBfZmlsZX0iCisgICAgICAgICAgICBTVEFUSUNfTElCUkFSWV9GTEFHUyAiJHtBUl9GTEFHU30iCisgICAgICAgICAgICBMSU5LRVJfTEFOR1VBR0UgQworICAgICAgICAgICAgU0tJUF9CVUlMRF9SUEFUSCB0cnVlCisgICAgICAgICkKKyAgICAgICAgYWRkX2N1c3RvbV9jb21tYW5kKFRBUkdFVCBpb21wNWltcCBQUkVfQlVJTEQgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIHJlbW92ZSAtZiAke2ltcF9maWxlfSkKKyAgICAgICAgYWRkX2RlcGVuZGVuY2llcyhpb21wNWltcCBpb21wNSkKKyAgICBlbmRpZigpCisKKyAgICAjIC0tLSBDcmVhdGUgJChkZWZfZmlsZSkgLS0tCisgICAgaWYoTk9UICIke2RlZl9maWxlfSIgU1RSRVFVQUwgIiIpCisgICAgICAgIHN0cmluZ190b19saXN0KCIke2dkX2ZsYWdzfSIgZ2RfZmxhZ3MpCisgICAgICAgIGFkZF9jdXN0b21fY29tbWFuZCgKKyAgICAgICAgICAgIE9VVFBVVCAgJHtkZWZfZmlsZX0KKyAgICAgICAgICAgIENPTU1BTkQgJHtQRVJMX0VYRUNVVEFCTEV9ICR7dG9vbHNfZGlyfS9nZW5lcmF0ZS1kZWYucGwgJHtnZF9mbGFnc30gLW8gJHtkZWZfZmlsZX0gJHtzcmNfZGlyfS9kbGxleHBvcnRzCisgICAgICAgICAgICBERVBFTkRTICR7c3JjX2Rpcn0vZGxsZXhwb3J0cyAke3Rvb2xzX2Rpcn0vZ2VuZXJhdGUtZGVmLnBsCisgICAgICAgICkKKyAgICBlbmRpZigpCisKKyAgICAjIC0tLSBDcmVhdGUgJChyY19maWxlKSAtLS0KKyAgICBpZihOT1QgIiR7cmNfZmlsZX0iIFNUUkVRVUFMICIiKQorICAgICAgICBhZGRfY3VzdG9tX2NvbW1hbmQoCisgICAgICAgICAgICBPVVRQVVQgICR7cmNfZmlsZX0KKyAgICAgICAgICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSBjb3B5IGxpYmlvbXAucmMgJHtyY19maWxlfQorICAgICAgICAgICAgREVQRU5EUyBsaWJpb21wLnJjCisgICAgICAgICkKKyAgICBlbmRpZigpCitlbmRpZigpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBrbXBfaTE4bl9pZC5pbmMgYW5kIGttcF9pMThuX2RlZmF1bHQuaW5jCitzZXQocGVybGNtZCAiJHtQRVJMX0VYRUNVVEFCTEV9IiAiJHt0b29sc19kaXJ9L21lc3NhZ2UtY29udmVydGVyLnBsIiAiJHtvYV9vcHRzfSIgIi0tcHJlZml4PWttcF9pMThuIiAiLS1lbnVtPWttcF9pMThuX2lkLmluYyIgIiR7c3JjX2Rpcn0vaTE4bi9lbl9VUy50eHQiKQorYWRkX2N1c3RvbV9jb21tYW5kKAorICAgIE9VVFBVVCAgJHtidWlsZF9kaXJ9L2ttcF9pMThuX2lkLmluYworICAgIENPTU1BTkQgJHtwZXJsY21kfQorICAgIERFUEVORFMgJHtzcmNfZGlyfS9pMThuL2VuX1VTLnR4dCAke3Rvb2xzX2Rpcn0vbWVzc2FnZS1jb252ZXJ0ZXIucGwKKykKK3NldChwZXJsY21kICIke1BFUkxfRVhFQ1VUQUJMRX0iICIke3Rvb2xzX2Rpcn0vbWVzc2FnZS1jb252ZXJ0ZXIucGwiICIke29hX29wdHN9IiAiLS1wcmVmaXg9a21wX2kxOG4iICItLWRlZmF1bHQ9a21wX2kxOG5fZGVmYXVsdC5pbmMiICIke3NyY19kaXJ9L2kxOG4vZW5fVVMudHh0IikKK2FkZF9jdXN0b21fY29tbWFuZCgKKyAgICBPVVRQVVQgICR7YnVpbGRfZGlyfS9rbXBfaTE4bl9kZWZhdWx0LmluYworICAgIENPTU1BTkQgJHtwZXJsY21kfQorICAgIERFUEVORFMgJHtzcmNfZGlyfS9pMThuL2VuX1VTLnR4dCAke3Rvb2xzX2Rpcn0vbWVzc2FnZS1jb252ZXJ0ZXIucGwKKykKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIE1pY3JvIHRlc3QgcnVsZXMgZm9yIGFmdGVyIGxpYnJhcnkgaGFzIGJlZW4gYnVpbHQgKGNtYWtlL01pY3JvVGVzdHMuY21ha2UpCisjIC0gT25seSBwZXJmb3JtIGlmICR7dGVzdHN9ID09IHRydWUgKHNwZWNpZnkgd2hlbiBpbnZva2luZzogY21ha2UgLUR0ZXN0cz1vbiAuLi4pCitpZigke3Rlc3RzfSkKKyAgICBpbmNsdWRlKE1pY3JvVGVzdHMpCitlbmRpZigpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAtLS0gQ3JlYXRlIEZvcnRyYW4gRmlsZXMgLS0tCisjIG9tcF9saWIubW9kCitpZigke2NyZWF0ZV9mb3J0cmFuX21vZHVsZXN9KQorICAgICMgR3JhYiBmb3J0cmFuLWNvbXBpbGVyLWRlcGVuZGVudCBmbGFncworICAgICMgQ21ha2Ugd2lsbCBsb29rIGZvciBjbWFrZS8ke0NNQUtFX0ZvcnRyYW5fQ09NUElMRVJfSUR9L0ZvcnRyYW5GbGFncy5jbWFrZSB0byBhcHBlbmQgYWRkaXRpb25hbCBmb3J0cmFuIGZsYWdzLgorICAgIGVuYWJsZV9sYW5ndWFnZShGb3J0cmFuKQorICAgIHNldChDTUFLRV9NT0RVTEVfUEFUSCAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vY21ha2UvJHtDTUFLRV9Gb3J0cmFuX0NPTVBJTEVSX0lEfSAke0NNQUtFX01PRFVMRV9QQVRIfSkKKyAgICBmaW5kX2ZpbGUoZm9ydHJhbl9zcGVjaWZpY19pbmNsdWRlX2ZpbGVfZm91bmQgRm9ydHJhbkZsYWdzLmNtYWtlICR7Q01BS0VfTU9EVUxFX1BBVEh9KQorICAgIGlmKGZvcnRyYW5fc3BlY2lmaWNfaW5jbHVkZV9maWxlX2ZvdW5kKQorICAgICAgICBpbmNsdWRlKEZvcnRyYW5GbGFncykKKyAgICAgICAgYXBwZW5kX2ZvcnRyYW5fY29tcGlsZXJfc3BlY2lmaWNfZm9ydF9mbGFncyhGX0ZMQUdTKQorICAgIGVsc2UoKQorICAgICAgICB3YXJuaW5nX3NheSgiQ291bGQgbm90IGZpbmQgY21ha2UvJHtDTUFLRV9Gb3J0cmFuX0NPTVBJTEVSX0lEfS9Gb3J0cmFuRmxhZ3MuY21ha2U6IHdpbGwgb25seSB1c2UgZGVmYXVsdCBmbGFncyBpbiBDb21tb25GbGFncy5jbWFrZSIpCisgICAgZW5kaWYoKQorICAgIHNldChvbXBfbGliX2YgIm9tcF9saWIuZjkwIiApCisgICAgYWRkX2N1c3RvbV9jb21tYW5kKAorICAgICAgICBPVVRQVVQgIm9tcF9saWIubW9kIgorICAgICAgICBDT01NQU5EICR7Q01BS0VfRm9ydHJhbl9DT01QSUxFUn0gLWMgJHtGX0ZMQUdTfSAke29tcF9saWJfZn0KKyAgICAgICAgREVQRU5EUyAke29tcF9saWJfZn0KKyAgICApCisgICAgYWRkX2N1c3RvbV9jb21tYW5kKAorICAgICAgICBPVVRQVVQgIm9tcF9saWJfa2luZHMubW9kIgorICAgICAgICBDT01NQU5EICR7Q01BS0VfRm9ydHJhbl9DT01QSUxFUn0gLWMgJHtGX0ZMQUdTfSAke29tcF9saWJfZn0KKyAgICAgICAgREVQRU5EUyAke29tcF9saWJfZn0KKyAgICApCisgICAgIyBjbGVhbiBvbXBfbGliLm8gZnJvbSBidWlsZCBkaXJlY3Rvcnkgd2hlbiAibWFrZSBjbGVhbiIgCisgICAgc2V0X2RpcmVjdG9yeV9wcm9wZXJ0aWVzKFBST1BFUlRJRVMgQURESVRJT05BTF9NQUtFX0NMRUFOX0ZJTEVTIG9tcF9saWIke29ian0pCitlbmRpZigpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAtLS0gVXNpbmcgZXhwYW5kLXZhcnMucGwgdG8gZ2VuZXJhdGUgZmlsZXMgLS0tCisjIC0gJ2ZpbGUnIGlzIGdlbmVyYXRlZCB1c2luZyBleHBhbmQtdmFycy5wbCBhbmQgJ2ZpbGUnLnZhcgorIyAtIEFueSAuaCAuZiAuZjkwIC5yYyBmaWxlcyBzaG91bGQgYmUgY3JlYXRlZCB3aXRoIHRoaXMgcmVjaXBlCittYWNybyhleHBhbmRfdmFyc19yZWNpcGUgZmlsZW5hbWUpCisgICAgZ2V0X3NvdXJjZV9maWxlX3Byb3BlcnR5KGV4dHJhX2V2X2ZsYWdzICR7ZmlsZW5hbWV9IENPTVBJTEVfREVGSU5JVElPTlMpCisgICAgaWYoIiR7ZXh0cmFfZXZfZmxhZ3N9IiBNQVRDSEVTICJOT1RGT1VORCIpCisgICAgICAgIHNldChleHRyYV9ldl9mbGFncykKKyAgICBlbHNlKCkKKyAgICAgICAgc3RyaW5nX3RvX2xpc3QoIiR7ZXh0cmFfZXZfZmxhZ3N9IiBleHRyYV9ldl9mbGFncykKKyAgICBlbmRpZigpCisgICAgZmluZF9maWxlKCR7ZmlsZW5hbWV9X3BhdGggJHtmaWxlbmFtZX0udmFyIFBBVEhTICR7c3JjX2Rpcn0vaW5jbHVkZS8ke29tcF92ZXJzaW9ufSAke3NyY19kaXJ9KQorICAgIHNldChsZGVwcyAiJHske2ZpbGVuYW1lfV9wYXRofSIgIiR7c3JjX2Rpcn0va21wX3ZlcnNpb24uYyIgIiR7dG9vbHNfZGlyfS9leHBhbmQtdmFycy5wbCIpCisgICAgc2V0KGV4cGFuZHZhcnNjbWQgJHtQRVJMX0VYRUNVVEFCTEV9ICR7dG9vbHNfZGlyfS9leHBhbmQtdmFycy5wbCAtLXN0cmljdCAke2V2X2ZsYWdzfSAke2V4dHJhX2V2X2ZsYWdzfSAkeyR7ZmlsZW5hbWV9X3BhdGh9ICR7ZmlsZW5hbWV9KQorICAgIGlmKE5PVCAiJHtmaWxlbmFtZX0iIFNUUkVRVUFMICIiKQorICAgICAgICBhZGRfY3VzdG9tX2NvbW1hbmQoCisgICAgICAgICAgICBPVVRQVVQgICR7ZmlsZW5hbWV9CisgICAgICAgICAgICBDT01NQU5EICR7ZXhwYW5kdmFyc2NtZH0KKyAgICAgICAgICAgIERFUEVORFMgJHtsZGVwc30KKyAgICAgICAgKQorICAgIGVuZGlmKCkKK2VuZG1hY3JvKCkKK3N0cmluZ190b19saXN0KCIke2V2X2ZsYWdzfSIgZXZfZmxhZ3MpCisjIG9tcF9saWIuaCAgOiBldi1mbGFncyArPSAtRCBLTVBfSU5UX1BUUl9LSU5EPSJpbnRfcHRyX2tpbmQoKSIKK3NldF9zb3VyY2VfZmlsZXNfcHJvcGVydGllcyhvbXBfbGliLmggUFJPUEVSVElFUyBDT01QSUxFX0RFRklOSVRJT05TICItRCBLTVBfSU5UX1BUUl9LSU5EPVwiaW50X3B0cl9raW5kKClcIiIpIAorIyBpb21wX2xpYi5oIDogZXYtZmxhZ3MgKz0gLUQgS01QX0lOVF9QVFJfS0lORD0kKGlmICQoZmlsdGVyIDMyLCQoYXJjaCkpLDQsOCkKK2lmKCR7SUEzMn0pICMgMzIgYml0IGFyY2hzCisgICAgc2V0X3NvdXJjZV9maWxlc19wcm9wZXJ0aWVzKGlvbXBfbGliLmggUFJPUEVSVElFUyBDT01QSUxFX0RFRklOSVRJT05TICItRCBLTVBfSU5UX1BUUl9LSU5EPTQiKSAKK2Vsc2UoKQorICAgIHNldF9zb3VyY2VfZmlsZXNfcHJvcGVydGllcyhpb21wX2xpYi5oIFBST1BFUlRJRVMgQ09NUElMRV9ERUZJTklUSU9OUyAiLUQgS01QX0lOVF9QVFJfS0lORD04IikgCitlbmRpZigpCisjIGxpYmlvbXAucmMgOiBldi1mbGFncyArPSAtRCBLTVBfRklMRT0kKGxpYl9maWxlKQorc2V0X3NvdXJjZV9maWxlc19wcm9wZXJ0aWVzKGxpYmlvbXAucmMgUFJPUEVSVElFUyBDT01QSUxFX0RFRklOSVRJT05TICItRCBLTVBfRklMRT0ke2xpYl9maWxlfSIpIAorZXhwYW5kX3ZhcnNfcmVjaXBlKG9tcC5oKQorZXhwYW5kX3ZhcnNfcmVjaXBlKG9tcF9saWIuaCkKK2V4cGFuZF92YXJzX3JlY2lwZShvbXBfbGliLmYpCitleHBhbmRfdmFyc19yZWNpcGUob21wX2xpYi5mOTApCitleHBhbmRfdmFyc19yZWNpcGUoaW9tcC5oKQorZXhwYW5kX3ZhcnNfcmVjaXBlKGlvbXBfbGliLmgpCitleHBhbmRfdmFyc19yZWNpcGUobGliaW9tcC5yYykKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBQcmludCBjb25maWd1cmF0aW9uIGFmdGVyIGFsbCB2YXJpYWJsZXMgYXJlIHNldC4KK3NheSgiIikKK3NheSgiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ09ORklHVVJBVElPTiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpCitzYXkoIk9wZXJhdGluZyBTeXN0ZW0gICA6ICR7b3N9IikKK3NheSgiQXJjaGl0ZWN0dXJlICAgICAgIDogJHthcmNofSIpCitzYXkoIkJ1aWxkIFR5cGUgICAgICAgICA6ICR7Q01BS0VfQlVJTERfVFlQRX0iKQorc2F5KCJPcGVuTVAgVmVyc2lvbiAgICAgOiAke29tcF92ZXJzaW9ufSIpCitzYXkoIkxpYiBUeXBlICAgICAgICAgICA6ICR7bGliX3R5cGV9IikKK2lmKCR7TUlDfSkKKyAgICBzYXkoIkludGVsKFIpIE1JQyBBcmNoaXRlY3R1cmUgICAgOiAke21pY19hcmNofSIpCisgICAgc2F5KCJJbnRlbChSKSBNSUMgQXJjaGl0ZWN0dXJlIE9TIDogJHttaWNfb3N9IikKK2VuZGlmKCkKK3NheSgiRm9ydHJhbiBNb2R1bGVzICAgIDogJHtjcmVhdGVfZm9ydHJhbl9tb2R1bGVzfSIpCisjIHdpbGwgc2F5IGRldmVsb3BtZW50IGlmIGFsbCB6ZXJvcworaWYoIiR7YnVpbGRfbnVtYmVyfSIgU1RSRVFVQUwgIjAwMDAwMDAwIikKKyAgICBzZXQoYnVpbGQgImRldmVsb3BtZW50IikKK2Vsc2UoKQorICAgIHNldChidWlsZCAiJHtidWlsZF9udW1iZXJ9IikKK2VuZGlmKCkKK3NheSgiQnVpbGQgICAgICAgICAgICAgIDogJHtidWlsZH0iKQorc2F5KCJTdGF0cy1HYXRoZXJpbmcgICAgOiAke3N0YXRzfSIpCitzYXkoIlVzZSBidWlsZC5wbCBydWxlcyA6ICR7VVNFX0JVSUxEUExfUlVMRVN9IikKK3NheSgiQWRhcHRpdmUgbG9ja3MgICAgIDogJHtVU0VfQURBUFRJVkVfTE9DS1N9IikKK3NheSgiVXNlIHByZWRlZmluZWQgbGlua2VyIGZsYWdzICAgICAgOiAke1VTRV9QUkVERUZJTkVEX0xJTktFUl9GTEFHU30iKQorc2F5KCJDb21waWxlciBzdXBwb3J0cyBxdWFkIHByZWNpc2lvbiA6ICR7Q09NUElMRVJfU1VQUE9SVFNfUVVBRF9QUkVDSVNJT059IikKK3NheSgiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpCitzYXkoIiIpCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvQ01ha2VMaXN0cy50eHQub2xkIGIvZmluYWwvcnVudGltZS9DTWFrZUxpc3RzLnR4dC5vbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA4ZTUwMAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvQ01ha2VMaXN0cy50eHQub2xkCkBAIC0wLDAgKzEsOCBAQAorcHJvamVjdChvcGVubXApCitjbWFrZV9taW5pbXVtX3JlcXVpcmVkKFZFUlNJT04gMi44KQorCitzZXQoVkVSU0lPTiA1KQorc2V0KE9NUF9WRVJTSU9OICIyMDExMDciKQorc2V0KE9NUF9WRVJTSU9OX05VTSAiNDAiKQorCithZGRfc3ViZGlyZWN0b3J5KHNyYykKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvTWFrZWZpbGUgYi9maW5hbC9ydW50aW1lL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjOTUyOTgKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL01ha2VmaWxlCkBAIC0wLDAgKzEsNDUgQEAKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKKworb21wX3Jvb3Q/PS4KK2luY2x1ZGUgJChvbXBfcm9vdCkvdG9vbHMvY29tbW9uLmluYworLlBIT05ZOiBkZWZhdWx0IGFsbCBvbXAKKworZGVmYXVsdDogb21wCisKK2FsbDogb21wIHN0dWJzCisKK29tcDogaW5mbyBta2RpcgorCUBlY2hvICQob21wX3Jvb3QpL3Rvb2xzL2J1aWxkLnBsICQoYnVpbGRfYXJncykgLS1hcmNoPSQoYXJjaCkgLS1tb2RlPSQobW9kZSkgbGliIGluYyBjb21tb24KKwkkKG9tcF9yb290KS90b29scy9idWlsZC5wbCAkKGJ1aWxkX2FyZ3MpIC0tYXJjaD0kKGFyY2gpIC0tbW9kZT0kKG1vZGUpIGxpYiBpbmMgY29tbW9uCisKK3N0dWJzOiBta2RpcgorCUBlY2hvICQob21wX3Jvb3QpL3Rvb2xzL2J1aWxkLnBsICQoYnVpbGRfYXJncykgLS1hcmNoPSQoYXJjaCkgLS1tb2RlPSQobW9kZSkgLS1zdHVicyBsaWIgaW5jIGNvbW1vbiAKKwkkKG9tcF9yb290KS90b29scy9idWlsZC5wbCAkKGJ1aWxkX2FyZ3MpIC0tYXJjaD0kKGFyY2gpIC0tbW9kZT0kKG1vZGUpIC0tc3R1YnMgbGliIGluYyBjb21tb24KKworLlBIT05ZOiBjbGVhbiBpbmZvCisKK2NsZWFuOgorCSQoc2hlbGwgJChSTSkgLXJmICQob21wX3Jvb3QpJChTTEFTSCl0bXApCisJQGVjaG8gY2xlYW4gZG9uZQorCitta2RpcjoKKwkkKHNoZWxsICQoTUQpICQob21wX3Jvb3QpJChTTEFTSCl0bXAgPiQoTlVMKSAyPiQoTlVMKSkKKwlAZWNobyBDcmVhdGVkICQob21wX3Jvb3QpJChTTEFTSCl0bXAgZGlyZWN0b3J5CisKK2luZm86CisJQGVjaG8gb21wX3Jvb3Q9JChvbXBfcm9vdCkKKwlAZWNobyBvbXBfb3M9JChvbXBfb3MpCisJQGVjaG8gYXJjaD0kKGFyY2gpCisJQGVjaG8gY29tcGlsZXI9JChjb21waWxlcikJCisJQGVjaG8gbWljPSQobWljKQorCUBlY2hvIG1vZGU9JChtb2RlKQorCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL1JFQURNRS50eHQgYi9maW5hbC9ydW50aW1lL1JFQURNRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVkN2IyYwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvUkVBRE1FLnR4dApAQCAtMCwwICsxLDEyNSBAQAorCisgICAgICAgICAgICAgICBSRUFETUUgZm9yIEludGVsKFIpIE9wZW5NUCogUnVudGltZSBMaWJyYXJ5CisgICAgICAgICAgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0hvdyB0byBCdWlsZCBEb2N1bWVudGF0aW9uCis9PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGUgbWFpbiBkb2N1bWVudGF0aW9uIGlzIGluIERveHlnZW4qIGZvcm1hdCwgYW5kIHRoaXMgZGlzdHJpYnV0aW9uCitzaG91bGQgY29tZSB3aXRoIHByZS1idWlsdCBQREYgZG9jdW1lbnRhdGlvbiBpbiBkb2MvUmVmZXJlbmNlLnBkZi4gIAorSG93ZXZlciwgYW4gSFRNTCB2ZXJzaW9uIGNhbiBiZSBidWlsdCBieSBleGVjdXRpbmc6CisKKyUgZG94eWdlbiBkb2MvZG94eWdlbi9jb25maWcgCisKK2luIHRoaXMgZGlyZWN0b3J5LgorCitUaGF0IHdpbGwgcHJvZHVjZSBIVE1MIGRvY3VtZW50YXRpb24gaW4gdGhlIGRvYy9kb3h5Z2VuL2dlbmVyYXRlZAorZGlyZWN0b3J5LCB3aGljaCBjYW4gYmUgYWNjZXNzZWQgYnkgcG9pbnRpbmcgYSB3ZWIgYnJvd3NlciBhdCB0aGUKK2luZGV4Lmh0bWwgZmlsZSB0aGVyZS4KKworSWYgeW91IGRvbid0IGhhdmUgRG94eWdlbiBpbnN0YWxsZWQsIHlvdSBjYW4gZG93bmxvYWQgaXQgZnJvbQord3d3LmRveHlnZW4ub3JnLgorCisKK0hvdyB0byBCdWlsZCB0aGUgSW50ZWwoUikgT3Blbk1QKiBSdW50aW1lIExpYnJhcnkKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhlIE1ha2VmaWxlIGF0IHRoZSB0b3AtbGV2ZWwgd2lsbCBhdHRlbXB0IHRvIGRldGVjdCB3aGF0IGl0IG5lZWRzIHRvCitidWlsZCB0aGUgSW50ZWwoUikgT3Blbk1QKiBSdW50aW1lIExpYnJhcnkuICBUbyBzZWUgdGhlIGRlZmF1bHQgc2V0dGluZ3MsIAordHlwZToKKworbWFrZSBpbmZvCisKK1lvdSBjYW4gY2hhbmdlIHRoZSBNYWtlZmlsZSdzIGJlaGF2aW9yIHdpdGggdGhlIGZvbGxvd2luZyBvcHRpb25zOgorCitvbXBfcm9vdDogICAgVGhlIHBhdGggdG8gdGhlIHRvcC1sZXZlbCBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgdG9wLWxldmVsCisJICAgICBNYWtlZmlsZS4gIEJ5IGRlZmF1bHQsIHRoaXMgd2lsbCB0YWtlIG9uIHRoZSB2YWx1ZSBvZiB0aGUgCisJICAgICBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LgorCitvbXBfb3M6ICAgICAgT3BlcmF0aW5nIHN5c3RlbS4gIEJ5IGRlZmF1bHQsIHRoZSBidWlsZCB3aWxsIGF0dGVtcHQgdG8gCisJICAgICBkZXRlY3QgdGhpcy4gQ3VycmVudGx5IHN1cHBvcnRzICJsaW51eCIsICJmcmVlYnNkIiwgIm1hY29zIiwgYW5kIAorCSAgICAgIndpbmRvd3MiLgorCithcmNoOiAgICAgICAgQXJjaGl0ZWN0dXJlLiBCeSBkZWZhdWx0LCB0aGUgYnVpbGQgd2lsbCBhdHRlbXB0IHRvIAorCSAgICAgZGV0ZWN0IHRoaXMgaWYgbm90IHNwZWNpZmllZCBieSB0aGUgdXNlci4gQ3VycmVudGx5IAorCSAgICAgc3VwcG9ydGVkIHZhbHVlcyBhcmUKKyAgICAgICAgICAgICAgICAgIjMyIiBmb3IgSUEtMzIgYXJjaGl0ZWN0dXJlIAorICAgICAgICAgICAgICAgICAiMzJlIiBmb3IgSW50ZWwoUikgNjQgYXJjaGl0ZWN0dXJlCisgICAgICAgICAgICAgICAgICJtaWMiIGZvciBJbnRlbChSKSBNYW55IEludGVncmF0ZWQgQ29yZSBBcmNoaXRlY3R1cmUKKworICAgICAgICAgICAgIElmICJtaWMiIGlzIHNwZWNpZmllZCB0aGVuICJpY2MiIHdpbGwgYmUgdXNlZCBhcyB0aGUKKwkgICAgIGNvbXBpbGVyLCBhbmQgYXBwcm9wcmlhdGUgazFvbSBiaW51dGlscyB3aWxsIGJlIHVzZWQuIFRoZQorCSAgICAgbmVjZXNzYXJ5IHBhY2thZ2VzIG11c3QgYmUgaW5zdGFsbGVkIG9uIHRoZSBidWlsZCBtYWNoaW5lCisJICAgICBmb3IgdGhpcyB0byBiZSBwb3NzaWJsZSAoYnV0IGFuIEludGVsKFIpIFhlb24gUGhpKFRNKQorCSAgICAgY29wcm9jZXNzb3IgY2FyZCBpcyBub3QgcmVxdWlyZWQgdG8gYnVpbGQgdGhlIGxpYnJhcnkpLgorCitjb21waWxlcjogICAgV2hpY2ggY29tcGlsZXIgdG8gdXNlIGZvciB0aGUgYnVpbGQuICBEZWZhdWx0cyB0byAiaWNjIiAKKwkgICAgIG9yICJpY2wiIGRlcGVuZGluZyBvbiB0aGUgdmFsdWUgb2Ygb21wX29zLiBBbHNvIHN1cHBvcnRzIAorCSAgICAgc29tZSB2ZXJzaW9ucyBvZiAiZ2NjIiogd2hlbiBvbXBfb3MgaXMgImxpbnV4Ii4gVGhlIHNlbGVjdGVkIAorCSAgICAgY29tcGlsZXIgc2hvdWxkIGJlIGluc3RhbGxlZCBhbmQgaW4gdGhlIHVzZXIncyBwYXRoLiBUaGUgCisJICAgICBjb3JyZXNwb25kaW5nIEZvcnRyYW4gY29tcGlsZXIgc2hvdWxkIGFsc28gYmUgaW4gdGhlIHBhdGguIAorCSAgICAgU2VlICJTdXBwb3J0ZWQgUlRMIEJ1aWxkIENvbmZpZ3VyYXRpb25zIiBiZWxvdyBmb3IgbW9yZSAKKwkgICAgIGluZm9ybWF0aW9uIG9uIGNvbXBpbGVyIHZlcnNpb25zLgorCittb2RlOiAgICAgICAgTGlicmFyeSBtb2RlOiBkZWZhdWx0IGlzICJyZWxlYXNlIi4gIEFsc28gc3VwcG9ydHMgImRlYnVnIi4KKworVG8gdXNlIGFueSBvZiB0aGUgb3B0aW9ucyBhYm92ZSwgc2ltcGxlIGFkZCA8b3B0aW9uX25hbWU+PTx2YWx1ZT4uICBGb3IgCitleGFtcGxlLCBpZiB5b3Ugd2FudCB0byBidWlsZCB3aXRoIGdjYyBpbnN0ZWFkIG9mIGljYywgdHlwZToKKworbWFrZSBjb21waWxlcj1nY2MKKworVGhlcmUgaXMgYWxzbyBhbiBleHBlcmltZW50YWwgQ01ha2UgYnVpbGQgc3lzdGVtLiBUaGlzIGlzICpub3QqIHlldAorc3VwcG9ydGVkIGZvciBwcm9kdWN0aW9uIHVzZSBhbmQgcmVzdWx0aW5nIGJpbmFyaWVzIGhhdmUgbm90IGJlZW4gY2hlY2tlZAorZm9yIGNvbXBhdGliaWxpdHkuCisKK09uIE9TIFgqIG1hY2hpbmVzLCBpdCBpcyBwb3NzaWJsZSB0byBidWlsZCB1bml2ZXJzYWwgKG9yIGZhdCkgbGlicmFyaWVzIHdoaWNoCitpbmNsdWRlIGJvdGggSUEtMzIgYXJjaGl0ZWN0dXJlIGFuZCBJbnRlbChSKSA2NCBhcmNoaXRlY3R1cmUgb2JqZWN0cyBpbiBhCitzaW5nbGUgYXJjaGl2ZTsganVzdCBidWlsZCB0aGUgMzIgYW5kIDMyZSBsaWJyYXJpZXMgc2VwYXJhdGVseSwgdGhlbiBpbnZva2UgCittYWtlIGFnYWluIHdpdGggYSBzcGVjaWFsIGFyZ3VtZW50IGFzIGZvbGxvd3M6CisKK21ha2UgY29tcGlsZXI9Y2xhbmcgYnVpbGRfYXJncz1mYXQKKworU3VwcG9ydGVkIFJUTCBCdWlsZCBDb25maWd1cmF0aW9ucworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitTdXBwb3J0ZWQgQXJjaGl0ZWN0dXJlczogSUEtMzIgYXJjaGl0ZWN0dXJlLCBJbnRlbChSKSA2NCwgYW5kIAorSW50ZWwoUikgTWFueSBJbnRlZ3JhdGVkIENvcmUgQXJjaGl0ZWN0dXJlCisKKyAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICB8ICAgaWNjL2ljbCAgICAgfCAgICBnY2MgICAgICB8ICAgY2xhbmcgICAgICB8CistLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKK3wgTGludXgqIE9TICAgfCAgIFllcygxLDUpICAgIHwgIFllcygyLDQpICAgfCBZZXMoNCw2LDcpICAgfAorfCBGcmVlQlNEKiAgICB8ICAgTm8gICAgICAgICAgfCAgTm8gICAgICAgICB8IFllcyg0LDYsNyw4KSB8Cit8IE9TIFgqICAgICAgIHwgICBZZXMoMSwzLDQpICB8ICBObyAgICAgICAgIHwgWWVzKDQsNiw3KSAgIHwKK3wgV2luZG93cyogT1MgfCAgIFllcygxLDQpICAgIHwgIE5vICAgICAgICAgfCBObyAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKygxKSBPbiBJQS0zMiBhcmNoaXRlY3R1cmUgYW5kIEludGVsKFIpIDY0LCBpY2MvaWNsIHZlcnNpb25zIDEyLnggYXJlIAorICAgIHN1cHBvcnRlZCAoMTIuMSBpcyByZWNvbW1lbmRlZCkuCisoMikgR0NDKiB2ZXJzaW9uIDQuNi4yIGlzIHN1cHBvcnRlZC4KKygzKSBGb3IgaWNjIG9uIE9TIFgqLCBPUyBYKiB2ZXJzaW9uIDEwLjUuOCBpcyBzdXBwb3J0ZWQuCisoNCkgSW50ZWwoUikgTWFueSBJbnRlZ3JhdGVkIENvcmUgQXJjaGl0ZWN0dXJlIG5vdCBzdXBwb3J0ZWQuCisoNSkgT24gSW50ZWwoUikgTWFueSBJbnRlZ3JhdGVkIENvcmUgQXJjaGl0ZWN0dXJlLCBpY2MvaWNsIHZlcnNpb25zIDEzLjAgCisgICAgb3IgbGF0ZXIgYXJlIHJlcXVpcmVkLgorKDYpIENsYW5nKiB2ZXJzaW9uIDMuMyBpcyBzdXBwb3J0ZWQuCisoNykgQ2xhbmcqIGN1cnJlbnRseSBkb2VzIG5vdCBvZmZlciBhIHNvZnR3YXJlLWltcGxlbWVudGVkIDEyOCBiaXQgZXh0ZW5kZWQgCisgICAgcHJlY2lzaW9uIHR5cGUuICBUaHVzLCBhbGwgZW50cnkgcG9pbnRzIHJlbGlhbnQgb24gdGhpcyB0eXBlIGFyZSByZW1vdmVkCisgICAgZnJvbSB0aGUgbGlicmFyeSBhbmQgY2Fubm90IGJlIGNhbGxlZCBpbiB0aGUgdXNlciBwcm9ncmFtLiAgVGhlIGZvbGxvd2luZworICAgIGZ1bmN0aW9ucyBhcmUgbm90IGF2YWlsYWJsZToKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfKgorICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl8qCisgICAgX19rbXBjX2F0b21pY18qX2ZwCisoOCkgQ29tbXVuaXR5IGNvbnRyaWJ1dGlvbiBwcm92aWRlZCBBUyBJUywgbm90IHRlc3RlZCBieSBJbnRlbC4KKworRnJvbnQtZW5kIENvbXBpbGVycyB0aGF0IHdvcmsgd2l0aCB0aGlzIFJUTAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGUgZm9sbG93aW5nIGNvbXBpbGVycyBhcmUga25vd24gdG8gZG8gY29tcGF0aWJsZSBjb2RlIGdlbmVyYXRpb24gZm9yCit0aGlzIFJUTDogIGljYy9pY2wsIGdjYy4gIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBkZXRhaWwuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05vdGljZXMKKz09PT09PT0KKworKk90aGVyIG5hbWVzIGFuZCBicmFuZHMgbWF5IGJlIGNsYWltZWQgYXMgdGhlIHByb3BlcnR5IG9mIG90aGVycy4KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvY21ha2UvQnVpbGRQTFJ1bGVzLmNtYWtlIGIvZmluYWwvcnVudGltZS9jbWFrZS9CdWlsZFBMUnVsZXMuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFhZjA1OAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvY21ha2UvQnVpbGRQTFJ1bGVzLmNtYWtlCkBAIC0wLDAgKzEsMTExIEBACisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgVGhpcyBmaWxlIGNvbnRhaW5zIGFkZGl0aW9uYWwgYnVpbGQgcnVsZXMgdGhhdCBjb3JyZXNwb25kIHRvIGJ1aWxkLnBsJ3MgcnVsZXMKKyMgQnVpbGRpbmcgbGliaW9tcDUuZGJnIGlzIGxpbnV4IG9ubHksIFdpbmRvd3Mgd2lsbCBidWlsZCBsaWJpb21wNW1kLmRsbC5wZGIKKyMKKyMgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIyMgQlVJTEQgREVQRU5ERU5DSUVTICMjIyMjIyMjIyMKKyMKKyMgICAgICAgIGV4cG9ydHMvLi4uL2xpYmlvbXA1LnNvICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3J0cy8uLi4vbGliaW9tcDUuZGJnCisjICAgICAgICBbY29weV0gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBbY29weV0KKyMgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisjICAgICAgICAgICAuL2xpYmlvbXA1LnNvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4vbGliaW9tcDUuZGJnCisjICAgIFtjb3B5XSAgICAvICBPUiAgXF9fX19fX19fX19fXyBbY29weV0gICAgICAgICAgICAgICAgICAgICAgICAgfCBbY29weV0KKyMgICAgICAgICAgICAgLyAgICAgICAgICAgICAgICAgICAgXCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisjICAgIC4vdW5zdHJpcHBlZC9saWJpb21wNS5zbyAgIC4vc3RyaXBwZWQvbGliaW9tcDUuc28gICAuL3Vuc3RyaXBwZWQvbGliaW9tcDUuZGJnCisjICAgICAgICAgICAvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcICAgICAgICAgICAgICAgIC8KKyMgICAgICAgICAgLyBbbGlua2luZ10gICAgICAgICAgICAgICAgICAgICAgICBcW3N0cmlwXSAgICAgICAvW3N0cmlwIGFuZCBzdG9yZV0KKyMgICAgICAgICAvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCAgICAgICAgICAgIC8KKyMgICAgICR7b2Jqc30gKG1heWJlIGNvbXBpbGVkIHdpdGggLWcpICAgICAuL3Vuc3RyaXBwZWQvbGliaW9tcDUuc28gKGxpYnJhcnkgd2l0aCBkZWJ1ZyBpbmZvIGluIGl0KQorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgW2xpbmtpbmddCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtvYmpzfSAoYWx3YXlzIGNvbXBpbGVkIHdpdGggLWcpCisjCisjIEZvciBpY2MgTGludXggYnVpbGRzLCB3ZSBhbHdheXMgaW5jbHVkZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gdmlhIC1nIGFuZCBjcmVhdGUgbGliaW9tcDUuZGJnIAorIyBzbyB0aGF0IEludGVsKFIpIFBhcmFsbGVsIEFtcGxpZmllciBjYW4gdXNlIHRoZSAuZGJnIGZpbGUuCisjIEZvciBpY2MgV2luZG93cyBidWlsZHMsIHdlIGFsd2F5cyBpbmNsdWRlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiB2aWEgLVppIGFuZCBjcmVhdGUgbGliaW9tcDUucGRiCisjIGluIGEgZmFzaGlvbiBzaW1pbGFyIHRvIGxpYmlvbXA1LmRiZworIyBGb3IgaWNjIE1hYyBidWlsZHMsIHdlIGRvbid0IGJvdGhlciB3aXRoIHRoZSBkZWJ1ZyBpbmZvLgorCisjIFdlIGJ1aWxkIGxpYnJhcnkgaW4gdW5zdHJpcHBlZCBkaXJlY3RvcnkKK2ZpbGUoTUFLRV9ESVJFQ1RPUlkgJHtidWlsZF9kaXJ9L3Vuc3RyaXBwZWQpCisKKyMgT25seSBidWlsZCB0aGUgLmRiZyBmaWxlIGZvciBSZWxlYXNlIGJ1aWxkcworIyBEZWJ1ZyBhbmQgUmVsV2l0aERlYkluZm8gYnVpbGRzIHNob3VsZCBub3QgY3JlYXRlIGEgLmRiZyBmaWxlLiAgCisjIFRoZSBkZWJ1ZyBpbmZvIHNob3VsZCByZW1haW4gaW4gdGhlIGxpYnJhcnkgZmlsZS4KK2lmKCR7TElOVVh9IEFORCAke1JFTEVBU0VfQlVJTER9KQorICAgIHNldChkYmdfZmlsZSAke2xpYl9pdGVtfS5kYmcpCitlbmRpZigpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIC0tLSBDcmVhdGUgJChsaWJfZmlsZSkuZGJnIC0tLQoraWYoTk9UICIke2RiZ19maWxlfSIgU1RSRVFVQUwgIiIpCisgICAgIyBpZiBhICR7ZGJnX2ZpbGV9IGZpbGUgaXMgZ29pbmcgdG8gYmUgY3JlYXRlZCwgdGhlbiAKKyAgICBmaWxlKE1BS0VfRElSRUNUT1JZICR7YnVpbGRfZGlyfS9zdHJpcHBlZCkKKworICAgICMgLi8ke2xpYl9maWxlfSA6IHN0cmlwcGVkLyR7bGliX2ZpbGV9CisgICAgIyAgICAgY29weSBzdHJpcHBlZC8ke2xpYl9maWxlfSAuLyR7bGliX2ZpbGV9CisgICAgc2ltcGxlX2NvcHlfcmVjaXBlKCIke2xpYl9maWxlfSIgICAiJHtidWlsZF9kaXJ9L3N0cmlwcGVkIiAgICIke2J1aWxkX2Rpcn0iKQorCisgICAgIyBzdHJpcHBlZC8ke2xpYl9maWxlfSA6IHVuc3RyaXBwZWQvJHtsaWJfZmlsZX0gLi8ke2RiZ19maWxlfQorICAgICMgICAgIG9iamNvcHkgLS1zdHJpcC1kZWJ1ZyB1bnN0cmlwcGVkLyR7bGliX2ZpbGV9IHN0cmlwcGVkLyR7bGliX2ZpbGV9LnRtcAorICAgICMgICAgIG9iamNvcHkgLS1hZGQtZ251LWRlYnVnbGluaz0ke2RiZ19maWxlfSBzdHJpcHBlZC8ke2xpYl9maWxlfS50bXAgc3RyaXBwZWQvJHtsaWJfZmlsZX0KKyAgICBhZGRfY3VzdG9tX2NvbW1hbmQoCisgICAgICAgIE9VVFBVVCAgJHtidWlsZF9kaXJ9L3N0cmlwcGVkLyR7bGliX2ZpbGV9CisgICAgICAgIENPTU1BTkQgJHtDTUFLRV9PQkpDT1BZfSAtLXN0cmlwLWRlYnVnICR7YnVpbGRfZGlyfS91bnN0cmlwcGVkLyR7bGliX2ZpbGV9ICR7YnVpbGRfZGlyfS9zdHJpcHBlZC8ke2xpYl9maWxlfS50bXAKKyAgICAgICAgQ09NTUFORCAke0NNQUtFX09CSkNPUFl9IC0tYWRkLWdudS1kZWJ1Z2xpbms9JHtkYmdfZmlsZX0gJHtidWlsZF9kaXJ9L3N0cmlwcGVkLyR7bGliX2ZpbGV9LnRtcCAke2J1aWxkX2Rpcn0vc3RyaXBwZWQvJHtsaWJfZmlsZX0KKyAgICAgICAgREVQRU5EUyAiJHtidWlsZF9kaXJ9LyR7ZGJnX2ZpbGV9IgorICAgICkKKworICAgICMgLi8ke2RiZ19maWxlfSA6IHVuc3RyaXBwZWQvJHtkYmdfZmlsZX0KKyAgICAjICAgICBjb3B5IHVuc3RyaXBwZWQvJHtkYmdfZmlsZX0gLi8ke2RiZ19maWxlfQorICAgIHNpbXBsZV9jb3B5X3JlY2lwZSgiJHtkYmdfZmlsZX0iICAgIiR7YnVpbGRfZGlyfS91bnN0cmlwcGVkIiAiJHtidWlsZF9kaXJ9IikKKworICAgICMgdW5zdHJpcHBlZC8ke2RiZ19maWxlfSA6IHVuc3RyaXBwZWQvJHtsaWJfZmlsZX0KKyAgICAjICAgICBvYmpjb3B5IC0tb25seS1rZWVwLWRlYnVnIHVuc3RyaXBwZWQvJHtsaWJfZmlsZX0gdW5zdHJpcHBlZC8ke2RiZ19maWxlfQorICAgIGFkZF9jdXN0b21fY29tbWFuZCgKKyAgICAgICAgT1VUUFVUICAke2J1aWxkX2Rpcn0vdW5zdHJpcHBlZC8ke2RiZ19maWxlfQorICAgICAgICBDT01NQU5EICR7Q01BS0VfT0JKQ09QWX0gLS1vbmx5LWtlZXAtZGVidWcgJHtidWlsZF9kaXJ9L3Vuc3RyaXBwZWQvJHtsaWJfZmlsZX0gJHtidWlsZF9kaXJ9L3Vuc3RyaXBwZWQvJHtkYmdfZmlsZX0gCisgICAgICAgIERFUEVORFMgaW9tcDUKKyAgICApCisgICAgCitlbHNlKCkKKworICAgICMgLi8ke2xpYl9maWxlfSA6IHVuc3RyaXBwZWQvJHtsaWJfZmlsZX0KKyAgICAjICAgICAgY29weSB1bnN0cmlwcGVkLyR7bGliX2ZpbGV9IC4vJHtsaWJfZmlsZX0KKyAgICBzaW1wbGVfY29weV9yZWNpcGUoIiR7bGliX2ZpbGV9IiAgICIke2J1aWxkX2Rpcn0vdW5zdHJpcHBlZCIgICIke2J1aWxkX2Rpcn0iKQorZW5kaWYoKQorCisjIFdpbmRvd3Mgc3BlY2lmaWMgY29tbWFuZCB0byBtb3ZlIGFyb3VuZCBkZWJ1ZyBpbmZvIGZpbGVzIHBvc3QtYnVpbGQKK2lmKE5PVCAiJHtwZGJfZmlsZX0iIFNUUkVRVUFMICIiIEFORCAke1JFTEVBU0VfQlVJTER9KQorICAgIGFkZF9jdXN0b21fY29tbWFuZChUQVJHRVQgaW9tcDUgUE9TVF9CVUlMRAorICAgICAgICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgcmVuYW1lICR7cGRiX2ZpbGV9ICR7cGRiX2ZpbGV9Lm5vbnN0cmlwcGVkCisgICAgICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSByZW5hbWUgJHtwZGJfZmlsZX0uc3RyaXBwZWQgJHtwZGJfZmlsZX0KKyAgICApCitlbmRpZigpCisKKyMgSGF2ZSBpY2MgYnVpbGQgbGliaW9tcDUgaW4gdW5zdHJpcHBlZCBkaXJlY3RvcnkKK3NldF90YXJnZXRfcHJvcGVydGllcyhpb21wNSBQUk9QRVJUSUVTIAorICAgIExJQlJBUllfT1VUUFVUX0RJUkVDVE9SWSAiJHtidWlsZF9kaXJ9L3Vuc3RyaXBwZWQiIAorICAgIFJVTlRJTUVfT1VUUFVUX0RJUkVDVE9SWSAiJHtidWlsZF9kaXJ9L3Vuc3RyaXBwZWQiCisgICAgQVJDSElWRV9PVVRQVVRfRElSRUNUT1JZICIke2J1aWxkX2Rpcn0iCispCisKKyMgQWx3YXlzIHVzZSBSZWxXaXRoRGViSW5mbyBmbGFncyBmb3IgUmVsZWFzZSBidWlsZHMgd2hlbiB1c2luZyB0aGUgYnVpbGQucGwncyBidWlsZCBydWxlcyAodXNlIC1nIC1PMiBpbnN0ZWFkIG9mIGp1c3QgLU8zKQorIyBUaGUgZGVidWcgaW5mbyBpcyB0aGVuIHN0cmlwcGVkIG91dCBhdCB0aGUgZW5kIG9mIHRoZSBidWlsZCBhbmQgcHV0IGludG8gbGliaW9tcDUuZGJnIGZvciBMaW51eAoraWYoJHtSRUxFQVNFX0JVSUxEfSBBTkQgTk9UICR7TUFDfSkKKyAgICBzZXQoQ01BS0VfQ19GTEFHU19SRUxFQVNFICAgJHtDTUFLRV9DX0ZMQUdTX1JFTFdJVEhERUJJTkZPfSAgKQorICAgIHNldChDTUFLRV9DWFhfRkxBR1NfUkVMRUFTRSAke0NNQUtFX0NYWF9GTEFHU19SRUxXSVRIREVCSU5GT30pCisgICAgc2V0KENNQUtFX0FTTV9GTEFHU19SRUxFQVNFICR7Q01BS0VfQVNNX0ZMQUdTX1JFTFdJVEhERUJJTkZPfSkKK2VuZGlmKCkKKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9jbWFrZS9DbGFuZy9Bc21GbGFncy5jbWFrZSBiL2ZpbmFsL3J1bnRpbWUvY21ha2UvQ2xhbmcvQXNtRmxhZ3MuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGEyYjY2NgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvY21ha2UvQ2xhbmcvQXNtRmxhZ3MuY21ha2UKQEAgLTAsMCArMSwyNyBAQAorIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworCisjIFRoaXMgZmlsZSBob2xkcyBDbGFuZyAoY2xhbmcvY2xhbmcrKykgc3BlY2lmaWMgY29tcGlsZXIgZGVwZW5kZW50IGZsYWdzCisjIFRoZSBmbGFnIHR5cGVzIGFyZToKKyMgICAxKSBBc3NlbWJseSBmbGFncworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQXNzZW1ibHkgZmxhZ3MKK2Z1bmN0aW9uKGFwcGVuZF9hc3NlbWJsZXJfc3BlY2lmaWNfYXNtX2ZsYWdzIGlucHV0X2FzbV9mbGFncykKKyAgICBzZXQobG9jYWxfYXNtX2ZsYWdzKQorICAgIGFwcGVuZF9hc21fZmxhZ3MoIi14IGFzc2VtYmxlci13aXRoLWNwcCIpICMgQXNzZW1ibHkgZmlsZSB0aGF0IG5lZWRzIHRvIGJlIHByZXByb2Nlc3NlZAorICAgIGlmKCR7SUEzMn0pCisgICAgICAgIGFwcGVuZF9hc21fZmxhZ3MoIi1tMzIiKSAjIEdlbmVyYXRlIDMyIGJpdCBJQS0zMiBhcmNoaXRlY3R1cmUgY29kZSAKKyAgICAgICAgYXBwZW5kX2FzbV9mbGFncygiLW1zc2UyIikgIyBBbGxvdyB1c2Ugb2YgU3RyZWFtaW5nIFNJTUQgSW5zdHJ1Y3Rpb25zCisgICAgZW5kaWYoKQorICAgIHNldCgke2lucHV0X2FzbV9mbGFnc30gJHske2lucHV0X2FzbV9mbGFnc319ICIke2xvY2FsX2FzbV9mbGFnc30iIFBBUkVOVF9TQ09QRSkKK2VuZGZ1bmN0aW9uKCkKKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9jbWFrZS9DbGFuZy9DRmxhZ3MuY21ha2UgYi9maW5hbC9ydW50aW1lL2NtYWtlL0NsYW5nL0NGbGFncy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGMxNGEwCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9jbWFrZS9DbGFuZy9DRmxhZ3MuY21ha2UKQEAgLTAsMCArMSw1MCBAQAorIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworCisjIFRoaXMgZmlsZSBob2xkcyBDbGFuZyAoY2xhbmcvY2xhbmcrKykgc3BlY2lmaWMgY29tcGlsZXIgZGVwZW5kZW50IGZsYWdzCisjIFRoZSBmbGFnIHR5cGVzIGFyZToKKyMgICAxKSBDL0MrKyBDb21waWxlciBmbGFncworIyAgIDIpIExpbmtlciBmbGFncworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQy9DKysgQ29tcGlsZXIgZmxhZ3MKK2Z1bmN0aW9uKGFwcGVuZF9jb21waWxlcl9zcGVjaWZpY19jX2FuZF9jeHhfZmxhZ3MgaW5wdXRfY19mbGFncyBpbnB1dF9jeHhfZmxhZ3MpCisgICAgc2V0KGxvY2FsX2NfZmxhZ3MpCisgICAgc2V0KGxvY2FsX2N4eF9mbGFncykKKyAgICBhcHBlbmRfY19hbmRfY3h4X2ZsYWdzKCItc3RkPWMrKzB4IikgIyBFbmFibGVzIHN1cHBvcnQgZm9yIG1hbnkgQysrMTEgKGZvcm1lcmx5IGtub3duIGFzIEMrKzB4KSBmZWF0dXJlcy4gVGhlIGZvbGxvd2luZyBhcmUgdGhlIG1vc3QgcmVjZW50bHkgYWRkZWQgZmVhdHVyZXM6CisgICAgYXBwZW5kX2NfYW5kX2N4eF9mbGFncygiLWZuby1leGNlcHRpb25zIikgIyBFeGNlcHRpb24gaGFuZGxpbmcgdGFibGUgZ2VuZXJhdGlvbiBpcyBkaXNhYmxlZC4KKyAgICBhcHBlbmRfY19hbmRfY3h4X2ZsYWdzKCIteCBjKysiKSAjIENvbXBpbGUgQyBmaWxlcyBhcyBDKysgZmlsZXMKKyAgICBpZigke0lBMzJ9KQorICAgICAgICBhcHBlbmRfY19hbmRfY3h4X2ZsYWdzKCItbTMyIikgIyBHZW5lcmF0ZSAzMiBiaXQgSUEtMzIgYXJjaGl0ZWN0dXJlIGNvZGUKKyAgICAgICAgYXBwZW5kX2NfYW5kX2N4eF9mbGFncygiLW1zc2UyIikgIyBBbGxvdyB1c2Ugb2YgU3RyZWFtaW5nIFNJTUQgSW5zdHJ1Y3Rpb25zCisgICAgZWxzZWlmKCR7QVJNfSkKKyAgICAgICAgYXBwZW5kX2NfYW5kX2N4eF9mbGFncygiLW1hcm0iKSAjIFRhcmdldCB0aGUgQVJNIGFyY2hpdGVjdHVyZQorICAgIGVuZGlmKCkKKyAgICBhcHBlbmRfY19hbmRfY3h4X2ZsYWdzKCItV25vLXVudXNlZC12YWx1ZSIpICMgRG9uJ3Qgd2FybiBhYm91dCB1bnVzZWQgdmFsdWVzCisgICAgYXBwZW5kX2NfYW5kX2N4eF9mbGFncygiLVduby1zd2l0Y2giKSAjIERvbid0IHdhcm4gYWJvdXQgc3dpdGNoIHN0YXRlbWVudHMgdGhhdCBkb24ndCBjb3ZlciBlbnRpcmUgcmFuZ2Ugb2YgdmFsdWVzCisgICAgYXBwZW5kX2NfYW5kX2N4eF9mbGFncygiLVduby1kZXByZWNhdGVkLXJlZ2lzdGVyIikgIyBEb24ndCB3YXJuIGFib3V0IHVzaW5nIHJlZ2lzdGVyIGtleXdvcmQKKyAgICBzZXQoJHtpbnB1dF9jX2ZsYWdzfSAgICR7JHtpbnB1dF9jX2ZsYWdzfX0gICAiJHtsb2NhbF9jX2ZsYWdzfSIgUEFSRU5UX1NDT1BFKQorICAgIHNldCgke2lucHV0X2N4eF9mbGFnc30gJHske2lucHV0X2N4eF9mbGFnc319ICIke2xvY2FsX2N4eF9mbGFnc30iIFBBUkVOVF9TQ09QRSkKK2VuZGZ1bmN0aW9uKCkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIExpbmtlciBmbGFncworZnVuY3Rpb24oYXBwZW5kX2NvbXBpbGVyX3NwZWNpZmljX2xpbmtlcl9mbGFncyBpbnB1dF9sZF9mbGFncyBpbnB1dF9sZF9mbGFnc19saWJzKQorICAgIHNldChsb2NhbF9sZF9mbGFncykKKyAgICBzZXQobG9jYWxfbGRfZmxhZ3NfbGlicykKKyAgICBpZigke0lBMzJ9KQorICAgICAgICBhcHBlbmRfbGlua2VyX2ZsYWdzKCItbTMyIikKKyAgICAgICAgYXBwZW5kX2xpbmtlcl9mbGFncygiLW1zc2UyIikKKyAgICBlbmRpZigpCisgICAgc2V0KCR7aW5wdXRfbGRfZmxhZ3N9ICAgICAgJHske2lucHV0X2xkX2ZsYWdzfX0gICAgICAiJHtsb2NhbF9sZF9mbGFnc30iICAgICAgIFBBUkVOVF9TQ09QRSkKKyAgICBzZXQoJHtpbnB1dF9sZF9mbGFnc19saWJzfSAkeyR7aW5wdXRfbGRfZmxhZ3NfbGlic319ICIke2xvY2FsX2xkX2ZsYWdzX2xpYnN9IiAgUEFSRU5UX1NDT1BFKQorZW5kZnVuY3Rpb24oKQorCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL2NtYWtlL0NvbW1vbkZsYWdzLmNtYWtlIGIvZmluYWwvcnVudGltZS9jbWFrZS9Db21tb25GbGFncy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTA2M2QwCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9jbWFrZS9Db21tb25GbGFncy5jbWFrZQpAQCAtMCwwICsxLDE0MiBAQAorIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworCisjIFRoaXMgZmlsZSBob2xkcyB0aGUgY29tbW9uIGZsYWdzIGluZGVwZW5kZW50IG9mIGNvbXBpbGVyCisjIFRoZSBmbGFnIHR5cGVzIGFyZTogCisjICAgMSkgQXNzZW1ibHkgZmxhZ3MgICAgICAgICAgKGFwcGVuZF9hc21fZmxhZ3NfY29tbW9uKQorIyAgIDIpIEMvQysrIENvbXBpbGVyIGZsYWdzICAgIChhcHBlbmRfY19hbmRfY3h4X2ZsYWdzX2NvbW1vbikKKyMgICAzKSBGb3J0cmFuIENvbXBpbGVyIGZsYWdzICAoYXBwZW5kX2ZvcnRfZmxhZ3NfY29tbW9uKQorIyAgIDQpIExpbmtlciBmbGFncyAgICAgICAgICAgIChhcHBlbmRfbGlua2VyX2ZsYWdzX2NvbW1vbikKKyMgICA1KSBBcmNoaXZlciBmbGFncyAgICAgICAgICAoYXBwZW5kX2FyY2hpdmVyX2ZsYWdzX2NvbW1vbikKKworIyBUaGVzZSBhcHBlbmRfKiBtYWNyb3MgYWxsIGFwcGVuZCB0byB0aGUgY29ycmVzcG9uZGluZyBsaXN0IHZhcmlhYmxlIGhvbGRpbmcgdGhlIGZsYWdzLgorbWFjcm8oYXBwZW5kX2NfZmxhZ3MgbmV3X2ZsYWcpCisgICAgbGlzdChBUFBFTkQgbG9jYWxfY19mbGFncyAgICAiJHtuZXdfZmxhZ30iKQorZW5kbWFjcm8oKQorCittYWNybyhhcHBlbmRfY3h4X2ZsYWdzIG5ld19mbGFnKQorICAgIGxpc3QoQVBQRU5EIGxvY2FsX2N4eF9mbGFncyAgIiR7bmV3X2ZsYWd9IikKK2VuZG1hY3JvKCkKKworbWFjcm8oYXBwZW5kX2NfYW5kX2N4eF9mbGFncyBuZXdfZmxhZykKKyAgICBhcHBlbmRfY19mbGFncygiJHtuZXdfZmxhZ30iKQorICAgIGFwcGVuZF9jeHhfZmxhZ3MoIiR7bmV3X2ZsYWd9IikKK2VuZG1hY3JvKCkKKworbWFjcm8oYXBwZW5kX2FzbV9mbGFncyBuZXdfZmxhZykKKyAgICBsaXN0KEFQUEVORCBsb2NhbF9hc21fZmxhZ3MgICIke25ld19mbGFnfSIpCitlbmRtYWNybygpCisKK21hY3JvKGFwcGVuZF9mb3J0X2ZsYWdzIG5ld19mbGFnKQorICAgIGxpc3QoQVBQRU5EIGxvY2FsX2ZvcnRfZmxhZ3MgIiR7bmV3X2ZsYWd9IikKK2VuZG1hY3JvKCkKKworIyBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGxpbmtlcl9mbGFncyBhbmQgbGlua2VyX2ZsYWdzX2xpYnMgaXMgbGlua2VyX2ZsYWdzX2xpYnMKKyMgaXMgcHV0IGF0IHRoZSBlbmQgb2YgdGhlIGxpbmtlciBjb21tYW5kIHdoZXJlIGxpbmtpbmcgbGlicmFyaWVzIHNob3VsZCBiZSBkb25lLgorbWFjcm8oYXBwZW5kX2xpbmtlcl9mbGFncyBuZXdfZmxhZykKKyAgICBsaXN0KEFQUEVORCBsb2NhbF9sZF9mbGFncyAgICIke25ld19mbGFnfSIpCitlbmRtYWNybygpCisKK21hY3JvKGFwcGVuZF9saW5rZXJfZmxhZ3NfbGlicmFyeSBuZXdfZmxhZykKKyAgICBsaXN0KEFQUEVORCBsb2NhbF9sZF9mbGFnc19saWJzICIke25ld19mbGFnfSIpCitlbmRtYWNybygpCisKK21hY3JvKGFwcGVuZF9hcmNoaXZlcl9mbGFncyBuZXdfZmxhZykKKyAgICBsaXN0KEFQUEVORCBsb2NhbF9hcl9mbGFncyAgICIke25ld19mbGFnfSIpCitlbmRtYWNybygpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBHbG9iYWwgQXNzZW1ibHkgZmxhZ3MKK2Z1bmN0aW9uKGFwcGVuZF9hc21fZmxhZ3NfY29tbW9uIGlucHV0X2FzbV9mbGFncykKKyAgICBzZXQobG9jYWxfYXNtX2ZsYWdzKQorICAgIHNldCgke2lucHV0X2FzbV9mbGFnc30gIiR7JHtpbnB1dF9hc21fZmxhZ3N9fSIgIiR7bG9jYWxfYXNtX2ZsYWdzfSIgIiR7VVNFUl9BU01fRkxBR1N9IiBQQVJFTlRfU0NPUEUpCitlbmRmdW5jdGlvbigpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBHbG9iYWwgQy9DKysgQ29tcGlsZXIgZmxhZ3MKK2Z1bmN0aW9uKGFwcGVuZF9jX2FuZF9jeHhfZmxhZ3NfY29tbW9uIGlucHV0X2NfZmxhZ3MgaW5wdXRfY3h4X2ZsYWdzKQorICAgIHNldChsb2NhbF9jX2ZsYWdzKQorICAgIHNldChsb2NhbF9jeHhfZmxhZ3MpCisgICAgc2V0KCR7aW5wdXRfY19mbGFnc30gICAiJHske2lucHV0X2NfZmxhZ3N9fSIgICAiJHtsb2NhbF9jX2ZsYWdzfSIgICAiJHtVU0VSX0NfRkxBR1N9IiAgIFBBUkVOVF9TQ09QRSkKKyAgICBzZXQoJHtpbnB1dF9jeHhfZmxhZ3N9ICIkeyR7aW5wdXRfY3h4X2ZsYWdzfX0iICIke2xvY2FsX2N4eF9mbGFnc30iICIke1VTRVJfQ1hYX0ZMQUdTfSIgUEFSRU5UX1NDT1BFKQorZW5kZnVuY3Rpb24oKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgR2xvYmFsIEZvcnRyYW4gQ29tcGlsZXIgZmxhZ3MgKGZvciBjcmVhdGluZyAubW9kIGZpbGVzKQorZnVuY3Rpb24oYXBwZW5kX2ZvcnRfZmxhZ3NfY29tbW9uIGlucHV0X2ZvcnRfZmxhZ3MpCisgICAgc2V0KGxvY2FsX2ZvcnRfZmxhZ3MpCisgICAgc2V0KCR7aW5wdXRfZm9ydF9mbGFnc30gIiR7JHtpbnB1dF9mb3J0X2ZsYWdzfX0iICIke2xvY2FsX2ZvcnRfZmxhZ3N9IiAiJHtVU0VSX0ZfRkxBR1N9IiBQQVJFTlRfU0NPUEUpCitlbmRmdW5jdGlvbigpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBMaW5rZXIgZmxhZ3MKK2Z1bmN0aW9uKGFwcGVuZF9saW5rZXJfZmxhZ3NfY29tbW9uIGlucHV0X2xkX2ZsYWdzIGlucHV0X2xkX2ZsYWdzX2xpYnMpCisgICAgc2V0KGxvY2FsX2xkX2ZsYWdzKQorICAgIHNldChsb2NhbF9sZF9mbGFnc19saWJzKQorCisgICAgaWYoJHtVU0VfUFJFREVGSU5FRF9MSU5LRVJfRkxBR1N9KQorCisgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICAgICAjIFdpbmRvd3MgbGlua2VyIGZsYWdzCisgICAgICAgIGlmKCR7V0lORE9XU30pIAorCisgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIworICAgICAgICAjIE1BQyBsaW5rZXIgZmxhZ3MKKyAgICAgICAgZWxzZWlmKCR7TUFDfSkKKyAgICAgICAgICAgIGFwcGVuZF9saW5rZXJfZmxhZ3MoIi1zaW5nbGVfbW9kdWxlIikKKyAgICAgICAgICAgIGFwcGVuZF9saW5rZXJfZmxhZ3MoIi1jdXJyZW50X3ZlcnNpb24gJHt2ZXJzaW9ufS4wIikKKyAgICAgICAgICAgIGFwcGVuZF9saW5rZXJfZmxhZ3MoIi1jb21wYXRpYmlsaXR5X3ZlcnNpb24gJHt2ZXJzaW9ufS4wIikKKyAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICAgICAjIEludGVsKFIpIE1hbnkgSW50ZWdyYXRlZCBDb3JlIEFyY2hpdGVjdHVyZSAoSW50ZWwoUikgTUlDIEFyY2hpdGVjdHVyZSkgbGlua2VyIGZsYWdzCisgICAgICAgIGVsc2VpZigke01JQ30pCisgICAgICAgICAgICBhcHBlbmRfbGlua2VyX2ZsYWdzKCItV2wsLXgiKQorICAgICAgICAgICAgYXBwZW5kX2xpbmtlcl9mbGFncygiLVdsLC0td2Fybi1zaGFyZWQtdGV4dHJlbCIpICMgIFdhcm4gaWYgdGhlIGxpbmtlciBhZGRzIGEgRFRfVEVYVFJFTCB0byBhIHNoYXJlZCBvYmplY3QuCisgICAgICAgICAgICBhcHBlbmRfbGlua2VyX2ZsYWdzKCItV2wsLS1hcy1uZWVkZWQiKQorICAgICAgICAgICAgYXBwZW5kX2xpbmtlcl9mbGFncygiLVdsLC0tdmVyc2lvbi1zY3JpcHQ9JHtzcmNfZGlyfS9leHBvcnRzX3NvLnR4dCIpICMgVXNlIGV4cG9ydHNfc28udHh0IGFzIHZlcnNpb24gc2NyaXB0IHRvIGNyZWF0ZSB2ZXJzaW9uZWQgc3ltYm9scyBmb3IgRUxGIGxpYnJhcmllcworICAgICAgICAgICAgaWYoTk9UICR7U1RVQlNfTElCUkFSWX0pCisgICAgICAgICAgICAgICAgYXBwZW5kX2xpbmtlcl9mbGFnc19saWJyYXJ5KCItcHRocmVhZCIpICMgbGluayBpbiBwdGhyZWFkIGxpYnJhcnkKKyAgICAgICAgICAgICAgICBhcHBlbmRfbGlua2VyX2ZsYWdzX2xpYnJhcnkoIi1sZGwiKSAjIGxpbmsgaW4gbGliZGwgKGR5bmFtaWMgbG9hZGVyIGxpYnJhcnkpCisgICAgICAgICAgICBlbmRpZigpCisgICAgICAgICAgICBpZigke1NUQVRTX0dBVEhFUklOR30pCisgICAgICAgICAgICAgICAgYXBwZW5kX2xpbmtlcl9mbGFnc19saWJyYXJ5KCItV2wsLWxzdGRjKysiKSAjIGxpbmsgaW4gc3RhbmRhcmQgYysrIGxpYnJhcnkgKHN0YXRzLWdhdGhlcmluZyBuZWVkcyBpdCkKKyAgICAgICAgICAgIGVuZGlmKCkKKyAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICAgICAjIFVuaXggYmFzZWQgbGlua2VyIGZsYWdzCisgICAgICAgIGVsc2UoKQorICAgICAgICAgICAgIyBGb3Igbm93LCBhbHdheXMgaW5jbHVkZSAtLXZlcnNpb24tc2NyaXB0IGZsYWcgb24gVW5peCBzeXN0ZW1zLgorICAgICAgICAgICAgYXBwZW5kX2xpbmtlcl9mbGFncygiLVdsLC0tdmVyc2lvbi1zY3JpcHQ9JHtzcmNfZGlyfS9leHBvcnRzX3NvLnR4dCIpICMgVXNlIGV4cG9ydHNfc28udHh0IGFzIHZlcnNpb24gc2NyaXB0IHRvIGNyZWF0ZSB2ZXJzaW9uZWQgc3ltYm9scyBmb3IgRUxGIGxpYnJhcmllcworICAgICAgICAgICAgYXBwZW5kX2xpbmtlcl9mbGFncygiLVdsLC16LG5vZXhlY3N0YWNrIikgIyAgTWFya3MgdGhlIG9iamVjdCBhcyBub3QgcmVxdWlyaW5nIGV4ZWN1dGFibGUgc3RhY2suCisgICAgICAgICAgICBhcHBlbmRfbGlua2VyX2ZsYWdzKCItV2wsLS1hcy1uZWVkZWQiKSAgICAjICBPbmx5IGFkZHMgbGlicmFyeSBkZXBlbmRlbmNpZXMgYXMgdGhleSBhcmUgbmVlZGVkLiAoaWYgbGliaW9tcDUgYWN0dWFsbHkgdXNlcyBhIGZ1bmN0aW9uIGZyb20gdGhlIGxpYnJhcnksIHRoZW4gYWRkIGl0KQorICAgICAgICAgICAgaWYoTk9UICR7U1RVQlNfTElCUkFSWX0pCisgICAgICAgICAgICAgICAgYXBwZW5kX2xpbmtlcl9mbGFncygiLVdsLC0td2Fybi1zaGFyZWQtdGV4dHJlbCIpICMgIFdhcm4gaWYgdGhlIGxpbmtlciBhZGRzIGEgRFRfVEVYVFJFTCB0byBhIHNoYXJlZCBvYmplY3QuCisgICAgICAgICAgICAgICAgYXBwZW5kX2xpbmtlcl9mbGFncygiLVdsLC1maW5pPV9fa21wX2ludGVybmFsX2VuZF9maW5pIikgIyBXaGVuIGNyZWF0aW5nIGFuIEVMRiBleGVjdXRhYmxlIG9yIHNoYXJlZCBvYmplY3QsIGNhbGwgTkFNRSB3aGVuIHRoZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGV4ZWN1dGFibGUgb3Igc2hhcmVkIG9iamVjdCBpcyB1bmxvYWRlZCwgYnkgc2V0dGluZyBEVF9GSU5JIHRvIHRoZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGFkZHJlc3Mgb2YgdGhlIGZ1bmN0aW9uLiAgQnkgZGVmYXVsdCwgdGhlIGxpbmtlciB1c2VzICJfZmluaSIgYXMgdGhlIGZ1bmN0aW9uIHRvIGNhbGwuCisgICAgICAgICAgICAgICAgYXBwZW5kX2xpbmtlcl9mbGFnc19saWJyYXJ5KCItcHRocmVhZCIpICMgbGluayBwdGhyZWFkIGxpYnJhcnkKKyAgICAgICAgICAgICAgICBpZihOT1QgJHtGUkVFQlNEfSkKKyAgICAgICAgICAgICAgICAgICAgYXBwZW5kX2xpbmtlcl9mbGFnc19saWJyYXJ5KCItV2wsLWxkbCIpICMgbGluayBpbiBsaWJkbCAoZHluYW1pYyBsb2FkZXIgbGlicmFyeSkKKyAgICAgICAgICAgICAgICBlbmRpZigpCisgICAgICAgICAgICBlbmRpZigpCisgICAgICAgIGVuZGlmKCkgIyBpZigke09QRVJBVElOR19TWVNURU19KSAuLi4KKworICAgIGVuZGlmKCkgIyBVU0VfUFJFREVGSU5FRF9MSU5LRVJfRkxBR1MKKworICAgIHNldCgke2lucHV0X2xkX2ZsYWdzfSAgICAgICIkeyR7aW5wdXRfbGRfZmxhZ3N9fSIgICAgICAiJHtsb2NhbF9sZF9mbGFnc30iICAgICAgIiR7VVNFUl9MRF9GTEFHU30iICAgICBQQVJFTlRfU0NPUEUpCisgICAgc2V0KCR7aW5wdXRfbGRfZmxhZ3NfbGlic30gIiR7JHtpbnB1dF9sZF9mbGFnc19saWJzfX0iICIke2xvY2FsX2xkX2ZsYWdzX2xpYnN9IiAiJHtVU0VSX0xEX0xJQl9GTEFHU30iIFBBUkVOVF9TQ09QRSkKK2VuZGZ1bmN0aW9uKCkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEFyY2hpdmVyIEZsYWdzCitmdW5jdGlvbihhcHBlbmRfYXJjaGl2ZXJfZmxhZ3NfY29tbW9uIGlucHV0X2FyX2ZsYWdzKQorICAgIHNldChsb2NhbF9hcl9mbGFncykKKyAgICBzZXQoJHtpbnB1dF9hcl9mbGFnc30gIiR7JHtpbnB1dF9hcl9mbGFnc319IiAiJHtsb2NhbF9hcl9mbGFnc30iIFBBUkVOVF9TQ09QRSkKK2VuZGZ1bmN0aW9uKCkKKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9jbWFrZS9EZWZpbml0aW9ucy5jbWFrZSBiL2ZpbmFsL3J1bnRpbWUvY21ha2UvRGVmaW5pdGlvbnMuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFmYmZmMgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvY21ha2UvRGVmaW5pdGlvbnMuY21ha2UKQEAgLTAsMCArMSwxNDcgQEAKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKKworIyB2b2lkIGFwcGVuZF9kZWZpbml0aW9ucyhzdHJpbmcgbmV3X2ZsYWcpOworIyAtIGFwcGVuZHMgbmV3X2ZsYWcgdG8gY3BwX2ZsYWdzIGxpc3QKK21hY3JvKGFwcGVuZF9kZWZpbml0aW9ucyBuZXdfZmxhZykKKyAgICBsaXN0KEFQUEVORCBsb2NhbF9jcHBfZmxhZ3MgIiR7bmV3X2ZsYWd9IikKK2VuZG1hY3JvKCkKKworZnVuY3Rpb24oYXBwZW5kX2NwcF9mbGFncyBpbnB1dF9jcHBfZmxhZ3MpCisgICAgc2V0KGxvY2FsX2NwcF9mbGFncykKKworICAgIGFwcGVuZF9kZWZpbml0aW9ucygiLUQgVVNFX0lUVF9CVUlMRCIpCisgICAgYXBwZW5kX2RlZmluaXRpb25zKCItRCBLTVBfQVJDSF9TVFI9XCJcXFxcXCIke2xlZ2FsX2FyY2h9XFxcXFwiXCIiKQorICAgIGFwcGVuZF9kZWZpbml0aW9ucygiLUQgQlVJTERfSTgiKQorICAgIGFwcGVuZF9kZWZpbml0aW9ucygiLUQgS01QX0xJQlJBUllfRklMRT1cXFxcXCIke2xpYl9maWxlfVxcXFxcIiIpICMgeWVzLi4uIHlvdSBuZWVkIDUgYmFja3NsYXNoZXMuLi4KKyAgICBhcHBlbmRfZGVmaW5pdGlvbnMoIi1EIEtNUF9WRVJTSU9OX01BSk9SPSR7dmVyc2lvbn0iKQorICAgIAorICAgICMgY3VzdG9taXplIHRvIDEyOCBieXRlcyBmb3IgcHBjNjQKKyAgICBpZigke1BQQzY0fSkKKyAgICAJYXBwZW5kX2RlZmluaXRpb25zKCItRCBDQUNIRV9MSU5FPTEyOCIpCisgICAgZWxzZSgpCisgICAgCWFwcGVuZF9kZWZpbml0aW9ucygiLUQgQ0FDSEVfTElORT02NCIpCisgICAgZW5kaWYoKQorICAgIAorICAgIGFwcGVuZF9kZWZpbml0aW9ucygiLUQgS01QX0FESlVTVF9CTE9DS1RJTUU9MSIpCisgICAgYXBwZW5kX2RlZmluaXRpb25zKCItRCBCVUlMRF9QQVJBTExFTF9PUkRFUkVEIikKKyAgICBhcHBlbmRfZGVmaW5pdGlvbnMoIi1EIEtNUF9BU01fSU5UUklOUyIpCisgICAgaWYoJHtVU0VfSVRUX05PVElGWX0pCisgICAgICAgIGFwcGVuZF9kZWZpbml0aW9ucygiLUQgVVNFX0lUVF9OT1RJRlk9MSIpCisgICAgZWxzZSgpCisgICAgICAgIGFwcGVuZF9kZWZpbml0aW9ucygiLUQgVVNFX0lUVF9OT1RJRlk9MCIpCisgICAgICAgIGFwcGVuZF9kZWZpbml0aW9ucygiLUQgSU5URUxfTk9fSVRUTk9USUZZX0FQSSIpCisgICAgZW5kaWYoKQorICAgIGFwcGVuZF9kZWZpbml0aW9ucygiLUQgSU5URUxfSVRUTk9USUZZX1BSRUZJWD1fX2ttcF9pdHRfIikKKworICAgIGlmKCR7VVNFX1ZFUlNJT05fU1lNQk9MU30pCisgICAgICAgIGFwcGVuZF9kZWZpbml0aW9ucygiLUQgS01QX1VTRV9WRVJTSU9OX1NZTUJPTFMiKQorICAgIGVuZGlmKCkKKworICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMgV2luZG93cyBkZWZpbml0aW9ucworICAgIGlmKCR7V0lORE9XU30pCisgICAgICAgIGFwcGVuZF9kZWZpbml0aW9ucygiLUQgX0NSVF9TRUNVUkVfTk9fV0FSTklOR1MiKQorICAgICAgICBhcHBlbmRfZGVmaW5pdGlvbnMoIi1EIF9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURSIpCisgICAgICAgIGFwcGVuZF9kZWZpbml0aW9ucygiLUQgX1dJTkRPV1MiKQorICAgICAgICBhcHBlbmRfZGVmaW5pdGlvbnMoIi1EIF9XSU5OVCIpCisgICAgICAgIGFwcGVuZF9kZWZpbml0aW9ucygiLUQgX1dJTjMyX1dJTk5UPTB4MDUwMSIpCisgICAgICAgIGFwcGVuZF9kZWZpbml0aW9ucygiLUQgS01QX1dJTl9DREVDTCIpCisgICAgICAgIGFwcGVuZF9kZWZpbml0aW9ucygiLUQgX1VTUkRMTCIpCisgICAgICAgIGlmKCR7REVCVUdfQlVJTER9KQorICAgICAgICAgICAgYXBwZW5kX2RlZmluaXRpb25zKCItRCBfSVRFUkFUT1JfREVCVUdfTEVWRUw9MCIpCisgICAgICAgIGVuZGlmKCkKKyAgICBlbHNlKCkgIyBPdGhlciB0aGFuIHdpbmRvd3MuLi4gKFVuaXggYmFzZWQgc3lzdGVtcywgSW50ZWwoUikgTWFueSBJbnRlZ3JhdGVkIENvcmUgQXJjaGl0ZWN0dXJlIChJbnRlbChSKSBNSUMgQXJjaGl0ZWN0dXJlKSwgYW5kIE1hYykKKyAgICAgICAgYXBwZW5kX2RlZmluaXRpb25zKCItRCBfR05VX1NPVVJDRSIpCisgICAgICAgIGFwcGVuZF9kZWZpbml0aW9ucygiLUQgX1JFRU5UUkFOVCIpCisgICAgICAgIGFwcGVuZF9kZWZpbml0aW9ucygiLUQgQlVJTERfVFYiKQorICAgICAgICBhcHBlbmRfZGVmaW5pdGlvbnMoIi1EIFVTRV9DQkxLREFUQSIpCisgICAgICAgIGlmKE5PVCAiJHt2ZXJzaW9ufSIgU1RSRVFVQUwgIjQiKQorICAgICAgICAgICAgYXBwZW5kX2RlZmluaXRpb25zKCItRCBLTVBfR09NUF9DT01QQVQiKQorICAgICAgICBlbmRpZigpCisgICAgZW5kaWYoKQorCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIyBJbnRlbChSKSBNSUMgQXJjaGl0ZWN0dXJlIGRlZmluaXRpb25zCisgICAgaWYoJHtNSUN9KQorICAgICAgICBhcHBlbmRfZGVmaW5pdGlvbnMoIi1EIEtNUF9UREFUQV9HVElEIikKKyAgICBlbHNlKCkgIyBPdGhlciB0aGFuIEludGVsKFIpIE1JQyBBcmNoaXRlY3R1cmUuLi4KKyAgICAgICAgYXBwZW5kX2RlZmluaXRpb25zKCItRCBVU0VfTE9BRF9CQUxBTkNFIikKKyAgICBlbmRpZigpCisKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjIFVuaXggZGVmaW5pdGlvbnMKKyAgICBpZigke0xJTlVYfSkKKyAgICAgICAgYXBwZW5kX2RlZmluaXRpb25zKCItRCBLTVBfVERBVEFfR1RJRCIpCisgICAgZW5kaWYoKQorCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMgT3RoZXIgY29uZGl0aW9uYWwgZGVmaW5pdGlvbnMKKyAgICBhcHBlbmRfZGVmaW5pdGlvbnMoIi1EIEtNUF9VU0VfQVNTRVJUIikKKyAgICBhcHBlbmRfZGVmaW5pdGlvbnMoIi1EIEdVSURFRExMX0VYUE9SVFMiKSAKKyAgICBpZigke1NUVUJTX0xJQlJBUll9KSAKKyAgICAgICAgYXBwZW5kX2RlZmluaXRpb25zKCItRCBLTVBfU1RVQiIpIAorICAgIGVuZGlmKCkKKyAgICBpZigke0RFQlVHX0JVSUxEfSBPUiAke1JFTFdJVEhERUJJTkZPX0JVSUxEfSkgCisgICAgICAgIGFwcGVuZF9kZWZpbml0aW9ucygiLUQgS01QX0RFQlVHIikgCisgICAgZW5kaWYoKQorICAgIGlmKCR7REVCVUdfQlVJTER9KQorICAgICAgICBhcHBlbmRfZGVmaW5pdGlvbnMoIi1EIF9ERUJVRyIpCisgICAgICAgIGFwcGVuZF9kZWZpbml0aW9ucygiLUQgQlVJTERfREVCVUciKQorICAgIGVuZGlmKCkKKyAgICBpZigke1NUQVRTX0dBVEhFUklOR30pCisgICAgICAgIGFwcGVuZF9kZWZpbml0aW9ucygiLUQgS01QX1NUQVRTX0VOQUJMRUQ9MSIpCisgICAgZWxzZSgpCisgICAgICAgIGFwcGVuZF9kZWZpbml0aW9ucygiLUQgS01QX1NUQVRTX0VOQUJMRUQ9MCIpCisgICAgZW5kaWYoKQorCisgICAgIyBPcGVuTVAgdmVyc2lvbiBmbGFncworICAgIHNldChoYXZlX29tcF81MCAwKQorICAgIHNldChoYXZlX29tcF80MSAwKQorICAgIHNldChoYXZlX29tcF80MCAwKQorICAgIHNldChoYXZlX29tcF8zMCAwKQorICAgIGlmKCR7b21wX3ZlcnNpb259IEVRVUFMIDUwIE9SICR7b21wX3ZlcnNpb259IEdSRUFURVIgNTApCisgICAgICAgIHNldChoYXZlX29tcF81MCAxKQorICAgIGVuZGlmKCkKKyAgICBpZigke29tcF92ZXJzaW9ufSBFUVVBTCA0MSBPUiAke29tcF92ZXJzaW9ufSBHUkVBVEVSIDQxKQorICAgICAgICBzZXQoaGF2ZV9vbXBfNDEgMSkKKyAgICBlbmRpZigpCisgICAgaWYoJHtvbXBfdmVyc2lvbn0gRVFVQUwgNDAgT1IgJHtvbXBfdmVyc2lvbn0gR1JFQVRFUiA0MCkKKyAgICAgICAgc2V0KGhhdmVfb21wXzQwIDEpCisgICAgZW5kaWYoKQorICAgIGlmKCR7b21wX3ZlcnNpb259IEVRVUFMIDMwIE9SICR7b21wX3ZlcnNpb259IEdSRUFURVIgMzApCisgICAgICAgIHNldChoYXZlX29tcF8zMCAxKQorICAgIGVuZGlmKCkKKyAgICBhcHBlbmRfZGVmaW5pdGlvbnMoIi1EIE9NUF81MF9FTkFCTEVEPSR7aGF2ZV9vbXBfNTB9IikKKyAgICBhcHBlbmRfZGVmaW5pdGlvbnMoIi1EIE9NUF80MV9FTkFCTEVEPSR7aGF2ZV9vbXBfNDF9IikKKyAgICBhcHBlbmRfZGVmaW5pdGlvbnMoIi1EIE9NUF80MF9FTkFCTEVEPSR7aGF2ZV9vbXBfNDB9IikKKyAgICBhcHBlbmRfZGVmaW5pdGlvbnMoIi1EIE9NUF8zMF9FTkFCTEVEPSR7aGF2ZV9vbXBfMzB9IikKKworICAgICMgQXJjaGl0ZWN0dXJhbCBkZWZpbml0aW9ucworICAgIGlmKCR7SU5URUw2NH0gT1IgJHtJQTMyfSkKKyAgICAgICAgaWYoJHtVU0VfQURBUFRJVkVfTE9DS1N9KQorICAgICAgICAgICAgYXBwZW5kX2RlZmluaXRpb25zKCItRCBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTPTEiKQorICAgICAgICBlbHNlKCkKKyAgICAgICAgICAgIGFwcGVuZF9kZWZpbml0aW9ucygiLUQgS01QX1VTRV9BREFQVElWRV9MT0NLUz0wIikKKyAgICAgICAgZW5kaWYoKQorICAgICAgICBhcHBlbmRfZGVmaW5pdGlvbnMoIi1EIEtNUF9ERUJVR19BREFQVElWRV9MT0NLUz0wIikKKyAgICBlbHNlKCkKKyAgICAgICAgYXBwZW5kX2RlZmluaXRpb25zKCItRCBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTPTAiKQorICAgICAgICBhcHBlbmRfZGVmaW5pdGlvbnMoIi1EIEtNUF9ERUJVR19BREFQVElWRV9MT0NLUz0wIikKKyAgICBlbmRpZigpCisgICAgaWYoJHtVU0VfSU5URVJOT0RFX0FMSUdOTUVOVH0pCisgICAgICAgIGFwcGVuZF9kZWZpbml0aW9ucygiLUQgS01QX1VTRV9JTlRFUk5PREVfQUxJR05NRU5UPTEiKQorICAgIGVsc2UoKQorICAgICAgICBhcHBlbmRfZGVmaW5pdGlvbnMoIi1EIEtNUF9VU0VfSU5URVJOT0RFX0FMSUdOTUVOVD0wIikKKyAgICBlbmRpZigpCisgICAgc2V0KCR7aW5wdXRfY3BwX2ZsYWdzfSAiJHske2lucHV0X2NwcF9mbGFnc319IiAiJHtsb2NhbF9jcHBfZmxhZ3N9IiAiJHtVU0VSX0NQUF9GTEFHU30iICIkRU5We0NQUEZMQUdTfSIgUEFSRU5UX1NDT1BFKQorZW5kZnVuY3Rpb24oKQorCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL2NtYWtlL0dOVS9Bc21GbGFncy5jbWFrZSBiL2ZpbmFsL3J1bnRpbWUvY21ha2UvR05VL0FzbUZsYWdzLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MjIzNDkKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL2NtYWtlL0dOVS9Bc21GbGFncy5jbWFrZQpAQCAtMCwwICsxLDI3IEBACisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKKyMgVGhpcyBmaWxlIGhvbGRzIEdOVSAoZ2NjL2crKykgc3BlY2lmaWMgY29tcGlsZXIgZGVwZW5kZW50IGZsYWdzCisjIFRoZSBmbGFnIHR5cGVzIGFyZToKKyMgICAxKSBBc3NlbWJseSBmbGFncworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQXNzZW1ibHkgZmxhZ3MKK2Z1bmN0aW9uKGFwcGVuZF9hc3NlbWJsZXJfc3BlY2lmaWNfYXNtX2ZsYWdzIGlucHV0X2FzbV9mbGFncykKKyAgICBzZXQobG9jYWxfYXNtX2ZsYWdzKQorICAgIGFwcGVuZF9hc21fZmxhZ3MoIi14IGFzc2VtYmxlci13aXRoLWNwcCIpICMgQXNzZW1ibHkgZmlsZSB0aGF0IG5lZWRzIHRvIGJlIHByZXByb2Nlc3NlZAorICAgIGlmKCR7SUEzMn0pCisgICAgICAgIGFwcGVuZF9hc21fZmxhZ3MoIi1tMzIiKSAjIEdlbmVyYXRlIDMyIGJpdCBJQS0zMiBhcmNoaXRlY3R1cmUgY29kZSAKKyAgICAgICAgYXBwZW5kX2FzbV9mbGFncygiLW1zc2UyIikgIyBBbGxvdyB1c2Ugb2YgU3RyZWFtaW5nIFNJTUQgSW5zdHJ1Y3Rpb25zCisgICAgZW5kaWYoKQorICAgIHNldCgke2lucHV0X2FzbV9mbGFnc30gJHske2lucHV0X2FzbV9mbGFnc319ICIke2xvY2FsX2FzbV9mbGFnc30iIFBBUkVOVF9TQ09QRSkKK2VuZGZ1bmN0aW9uKCkKKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9jbWFrZS9HTlUvQ0ZsYWdzLmNtYWtlIGIvZmluYWwvcnVudGltZS9jbWFrZS9HTlUvQ0ZsYWdzLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3ODVhM2MKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL2NtYWtlL0dOVS9DRmxhZ3MuY21ha2UKQEAgLTAsMCArMSw1NiBAQAorIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworCisjIFRoaXMgZmlsZSBob2xkcyBHTlUgKGdjYy9nKyspIHNwZWNpZmljIGNvbXBpbGVyIGRlcGVuZGVudCBmbGFncworIyBUaGUgZmxhZyB0eXBlcyBhcmU6CisjICAgMikgQy9DKysgQ29tcGlsZXIgZmxhZ3MKKyMgICA0KSBMaW5rZXIgZmxhZ3MKK3Vuc2V0KENPTVBJTEVSX1NVUFBPUlRTX1FVQURfUFJFQ0lTSU9OIENBQ0hFKQorc2V0KENPTVBJTEVSX1NVUFBPUlRTX1FVQURfUFJFQ0lTSU9OIHRydWUgQ0FDSEUgQk9PTCAiRG9lcyB0aGUgY29tcGlsZXIgc3VwcG9ydCBhIDEyOC1iaXQgZmxvYXRpbmcgcG9pbnQgdHlwZT8iKQorc2V0KENPTVBJTEVSX1FVQURfVFlQRSBfX2Zsb2F0MTI4KQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQy9DKysgQ29tcGlsZXIgZmxhZ3MKK2Z1bmN0aW9uKGFwcGVuZF9jb21waWxlcl9zcGVjaWZpY19jX2FuZF9jeHhfZmxhZ3MgaW5wdXRfY19mbGFncyBpbnB1dF9jeHhfZmxhZ3MpCisgICAgc2V0KGxvY2FsX2NfZmxhZ3MpCisgICAgc2V0KGxvY2FsX2N4eF9mbGFncykKKyAgICBhcHBlbmRfY19hbmRfY3h4X2ZsYWdzKCItc3RkPWMrKzB4IikgIyBFbmFibGVzIHN1cHBvcnQgZm9yIG1hbnkgQysrMTEgKGZvcm1lcmx5IGtub3duIGFzIEMrKzB4KSBmZWF0dXJlcy4gVGhlIGZvbGxvd2luZyBhcmUgdGhlIG1vc3QgcmVjZW50bHkgYWRkZWQgZmVhdHVyZXM6CisgICAgYXBwZW5kX2NfYW5kX2N4eF9mbGFncygiLWZuby1leGNlcHRpb25zIikgIyBFeGNlcHRpb24gaGFuZGxpbmcgdGFibGUgZ2VuZXJhdGlvbiBpcyBkaXNhYmxlZC4KKyAgICBhcHBlbmRfY19hbmRfY3h4X2ZsYWdzKCIteCBjKysiKSAjIENvbXBpbGUgQyBmaWxlcyBhcyBDKysgZmlsZXMKKyAgICBpZigke0lBMzJ9KQorICAgICAgICBhcHBlbmRfY19hbmRfY3h4X2ZsYWdzKCItbTMyIikgIyBHZW5lcmF0ZSAzMiBiaXQgSUEtMzIgYXJjaGl0ZWN0dXJlIGNvZGUKKyAgICAgICAgYXBwZW5kX2NfYW5kX2N4eF9mbGFncygiLW1zc2UyIikgIyBBbGxvdyB1c2Ugb2YgU3RyZWFtaW5nIFNJTUQgSW5zdHJ1Y3Rpb25zCisgICAgZWxzZWlmKCR7QVJNfSkKKyAgICAgICAgYXBwZW5kX2NfYW5kX2N4eF9mbGFncygiLW1hcm0iKSAjIFRhcmdldCB0aGUgQVJNIGFyY2hpdGVjdHVyZQorICAgIGVuZGlmKCkKKyAgICBzZXQoJHtpbnB1dF9jX2ZsYWdzfSAkeyR7aW5wdXRfY19mbGFnc319ICIke2xvY2FsX2NfZmxhZ3N9IiBQQVJFTlRfU0NPUEUpCisgICAgc2V0KCR7aW5wdXRfY3h4X2ZsYWdzfSAkeyR7aW5wdXRfY3h4X2ZsYWdzfX0gIiR7bG9jYWxfY3h4X2ZsYWdzfSIgUEFSRU5UX1NDT1BFKQorZW5kZnVuY3Rpb24oKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgTGlua2VyIGZsYWdzCitmdW5jdGlvbihhcHBlbmRfY29tcGlsZXJfc3BlY2lmaWNfbGlua2VyX2ZsYWdzIGlucHV0X2xkX2ZsYWdzIGlucHV0X2xkX2ZsYWdzX2xpYnMpCisgICAgc2V0KGxvY2FsX2xkX2ZsYWdzKQorICAgIHNldChsb2NhbF9sZF9mbGFnc19saWJzKQorICAgIGlmKCR7V0lORE9XU30pCisgICAgZWxzZWlmKCR7TUFDfSkKKyAgICBlbHNlaWYoJHtNSUN9KQorICAgIGVsc2UoKQorICAgICAgICBhcHBlbmRfbGlua2VyX2ZsYWdzKCItc3RhdGljLWxpYmdjYyIpICMgQ2F1c2VzIGxpYmdjYyB0byBiZSBsaW5rZWQgaW4gc3RhdGljYWxseQorICAgIGVuZGlmKCkKKyAgICBpZigke0lBMzJ9KQorICAgICAgICBhcHBlbmRfbGlua2VyX2ZsYWdzKCItbTMyIikKKyAgICAgICAgYXBwZW5kX2xpbmtlcl9mbGFncygiLW1zc2UyIikKKyAgICBlbmRpZigpCisgICAgc2V0KCR7aW5wdXRfbGRfZmxhZ3N9ICAgICAgJHske2lucHV0X2xkX2ZsYWdzfX0gICAgICAiJHtsb2NhbF9sZF9mbGFnc30iICAgICAgIFBBUkVOVF9TQ09QRSkKKyAgICBzZXQoJHtpbnB1dF9sZF9mbGFnc19saWJzfSAkeyR7aW5wdXRfbGRfZmxhZ3NfbGlic319ICIke2xvY2FsX2xkX2ZsYWdzX2xpYnN9IiAgUEFSRU5UX1NDT1BFKQorZW5kZnVuY3Rpb24oKQorCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL2NtYWtlL0dOVS9Gb3J0cmFuRmxhZ3MuY21ha2UgYi9maW5hbC9ydW50aW1lL2NtYWtlL0dOVS9Gb3J0cmFuRmxhZ3MuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU3OTg1MAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvY21ha2UvR05VL0ZvcnRyYW5GbGFncy5jbWFrZQpAQCAtMCwwICsxLDI1IEBACisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKKyMgVGhpcyBmaWxlIGhvbGRzIEdOVSAoZ2NjL2crKykgc3BlY2lmaWMgY29tcGlsZXIgZGVwZW5kZW50IGZsYWdzCisjIFRoZSBmbGFnIHR5cGVzIGFyZToKKyMgICAxKSBGb3J0cmFuIENvbXBpbGVyIGZsYWdzCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBGb3J0cmFuIENvbXBpbGVyIGZsYWdzIChmb3IgY3JlYXRpbmcgLm1vZCBmaWxlcykKK2Z1bmN0aW9uKGFwcGVuZF9mb3J0cmFuX2NvbXBpbGVyX3NwZWNpZmljX2ZvcnRfZmxhZ3MgaW5wdXRfZm9ydF9mbGFncykKKyAgICBzZXQobG9jYWxfZm9ydF9mbGFncykKKyAgICBpZigke0lBMzJ9KQorICAgICAgICBhcHBlbmRfZm9ydF9mbGFncygiLW0zMiIpCisgICAgICAgIGFwcGVuZF9mb3J0X2ZsYWdzKCItbXNzZTIiKQorICAgIGVuZGlmKCkKKyAgICBzZXQoJHtpbnB1dF9mb3J0X2ZsYWdzfSAkeyR7aW5wdXRfZm9ydF9mbGFnc319ICIke2xvY2FsX2ZvcnRfZmxhZ3N9IiBQQVJFTlRfU0NPUEUpCitlbmRmdW5jdGlvbigpCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL2NtYWtlL0dldEFyY2hpdGVjdHVyZS5jbWFrZSBiL2ZpbmFsL3J1bnRpbWUvY21ha2UvR2V0QXJjaGl0ZWN0dXJlLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiNzRiYzAKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL2NtYWtlL0dldEFyY2hpdGVjdHVyZS5jbWFrZQpAQCAtMCwwICsxLDY3IEBACisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKKyMgRGV0ZXJtaW5lIHRoZSBhcmNoaXRlY3R1cmUgZnJvbSBwcmVkZWZpbmVkIGNvbXBpbGVyIG1hY3JvcworIyBUaGUgYXJjaGl0ZWN0dXJlIG5hbWUgY2FuIG9ubHkgY29udGFpbiBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBhbmQgdW5kZXJzY29yZXMgKGkuZS4sIEMgaWRlbnRpZmllcikKKworIyB2b2lkIGdldF9hcmNoaXRlY3R1cmUoc3RyaW5nKiByZXR1cm5fYXJjaCkKKyMgLSBSZXR1cm5zIHRoZSBhcmNoaXRlY3R1cmUgaW4gcmV0dXJuX2FyY2gKK2Z1bmN0aW9uKGdldF9hcmNoaXRlY3R1cmUgcmV0dXJuX2FyY2gpCisgICAgc2V0KGRldGVjdF9hcmNoX3NyY190eHQgIgorICAgICNpZiBkZWZpbmVkKF9fS05DX18pCisgICAgICAgICNlcnJvciBBUkNISVRFQ1RVUkU9bWljCisgICAgI2VsaWYgZGVmaW5lZChfX2FtZDY0X18pIHx8IGRlZmluZWQoX19hbWQ2NCkgfHwgZGVmaW5lZChfX3g4Nl82NF9fKSB8fCBkZWZpbmVkKF9feDg2XzY0KSB8fCBkZWZpbmVkKF9NX1g2NCkgfHwgZGVmaW5lZChfTV9BTUQ2NCkKKyAgICAgICAgI2Vycm9yIEFSQ0hJVEVDVFVSRT0zMmUKKyAgICAjZWxpZiBkZWZpbmVkKF9faTM4NikgfHwgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX0lBMzJfXykgfHwgZGVmaW5lZChfTV9JODYpIHx8IGRlZmluZWQoX01fSVg4NikgfHwgZGVmaW5lZChfX1g4Nl9fKSB8fCBkZWZpbmVkKF9YODZfKQorICAgICAgICAjZXJyb3IgQVJDSElURUNUVVJFPTMyCisgICAgI2VsaWYgZGVmaW5lZChfX0FSTV9BUkNIXzdfXykgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzdSX18pIHx8ICBkZWZpbmVkKF9fQVJNX0FSQ0hfN0FfXykgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzdNX18pICB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfN1NfXykKKyAgICAgICAgI2Vycm9yIEFSQ0hJVEVDVFVSRT1hcm0KKyAgICAjZWxpZiBkZWZpbmVkKF9fQVJNX0FSQ0hfNl9fKSB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfNkpfXykgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzZLX18pICB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfNlpfXykgIHx8IGRlZmluZWQoX19BUk1fQVJDSF82VDJfXykgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzZaS19fKQorICAgICAgICAjZXJyb3IgQVJDSElURUNUVVJFPWFybQorICAgICNlbGlmIGRlZmluZWQoX19BUk1fQVJDSF81X18pIHx8IGRlZmluZWQoX19BUk1fQVJDSF81VF9fKSB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfNUVfXykgIHx8IGRlZmluZWQoX19BUk1fQVJDSF81VEVfXykgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzVURUpfXykKKyAgICAgICAgI2Vycm9yIEFSQ0hJVEVDVFVSRT1hcm0KKyAgICAjZWxpZiBkZWZpbmVkKF9fQVJNX0FSQ0hfNF9fKSB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfNFRfXykgCisgICAgICAgICNlcnJvciBBUkNISVRFQ1RVUkU9YXJtCisgICAgI2VsaWYgZGVmaW5lZChfX0FSTV9BUkNIXzNfXykgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzNNX18pCisgICAgICAgICNlcnJvciBBUkNISVRFQ1RVUkU9YXJtCisgICAgI2VsaWYgZGVmaW5lZChfX0FSTV9BUkNIXzJfXykKKyAgICAgICAgI2Vycm9yIEFSQ0hJVEVDVFVSRT1hcm0KKyAgICAjZWxpZiBkZWZpbmVkKF9fYXJtX18pIHx8IGRlZmluZWQoX01fQVJNKSB8fCBkZWZpbmVkKF9BUk0pCisgICAgICAgICNlcnJvciBBUkNISVRFQ1RVUkU9YXJtCisgICAgI2VsaWYgZGVmaW5lZChfX2FhcmNoNjRfXykKKyAgICAgICAgI2Vycm9yIEFSQ0hJVEVDVFVSRT1hYXJjaDY0CisgICAgI2VsaWYgZGVmaW5lZChfX3Bvd2VycGM2NF9fKSAmJiBkZWZpbmVkKF9fTElUVExFX0VORElBTl9fKQorICAgICAgICAjZXJyb3IgQVJDSElURUNUVVJFPXBwYzY0bGUKKyAgICAjZWxpZiBkZWZpbmVkKF9fcG93ZXJwYzY0X18pCisgICAgICAgICNlcnJvciBBUkNISVRFQ1RVUkU9cHBjNjQKKyAgICAjZWxzZQorICAgICAgICAjZXJyb3IgQVJDSElURUNUVVJFPVVua25vd25BcmNoaXRlY3R1cmUKKyAgICAjZW5kaWYKKyAgICAiCisgICAgKQorICAgICMgV3JpdGUgb3V0ICR7ZGV0ZWN0X2FyY2hfc3JjX3R4dH0gdG8gYSBmaWxlIHdpdGhpbiB0aGUgY21ha2UvIHN1YmRpcmVjdG9yeQorICAgIGZpbGUoV1JJVEUgIiR7TElCT01QX1dPUkt9L2NtYWtlL2RldGVjdF9hcmNoLmMiICR7ZGV0ZWN0X2FyY2hfc3JjX3R4dH0pIAorCisgICAgIyBUcnkgdG8gY29tcGlsZSB1c2luZyB0aGUgQyBDb21waWxlci4gIEl0IHdpbGwgYWx3YXlzIGVycm9yIG91dCB3aXRoIGFuICNlcnJvciBkaXJlY3RpdmUsIHNvIHN0b3JlIGVycm9yIG91dHB1dCB0byAke2xvY2FsX2FyY2hpdGVjdHVyZX0KKyAgICB0cnlfcnVuKHJ1bl9kdW1teSBjb21waWxlX2R1bW15ICIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0iICIke0xJQk9NUF9XT1JLfS9jbWFrZS9kZXRlY3RfYXJjaC5jIiBDT01QSUxFX09VVFBVVF9WQVJJQUJMRSBsb2NhbF9hcmNoaXRlY3R1cmUpCisKKyAgICAjIE1hdGNoIHRoZSBpbXBvcnRhbnQgYXJjaGl0ZWN0dXJlIGxpbmUgYW5kIHN0b3JlIG9ubHkgdGhhdCBtYXRjaGluZyBzdHJpbmcgaW4gJHtsb2NhbF9hcmNoaXRlY3R1cmV9CisgICAgc3RyaW5nKFJFR0VYIE1BVENIICJBUkNISVRFQ1RVUkU9KFthLXpBLVowLTlfXSspIiBsb2NhbF9hcmNoaXRlY3R1cmUgIiR7bG9jYWxfYXJjaGl0ZWN0dXJlfSIpCisKKyAgICAjIEdldCByaWQgb2YgdGhlIEFSQ0hJVEVDVFVSRT0gcGFydCBvZiB0aGUgc3RyaW5nCisgICAgc3RyaW5nKFJFUExBQ0UgIkFSQ0hJVEVDVFVSRT0iICIiIGxvY2FsX2FyY2hpdGVjdHVyZSAiJHtsb2NhbF9hcmNoaXRlY3R1cmV9IikKKworICAgICMgc2V0IHRoZSByZXR1cm4gdmFsdWUgdG8gdGhlIGFyY2hpdGVjdHVyZSBkZXRlY3RlZCAoZS5nLiwgMzJlLCAzMiwgYXJtLCBwcGM2NCwgZXRjLikKKyAgICBzZXQoJHtyZXR1cm5fYXJjaH0gIiR7bG9jYWxfYXJjaGl0ZWN0dXJlfSIgUEFSRU5UX1NDT1BFKQorCisgICAgIyBSZW1vdmUgJHtkZXRlY3RfYXJjaF9zcmNfdHh0fSBmcm9tIGNtYWtlLyBzdWJkaXJlY3RvcnkKKyAgICBmaWxlKFJFTU9WRSAiJHtMSUJPTVBfV09SS30vY21ha2UvZGV0ZWN0X2FyY2guYyIpCitlbmRmdW5jdGlvbigpCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL2NtYWtlL0hlbHBlckZ1bmN0aW9ucy5jbWFrZSBiL2ZpbmFsL3J1bnRpbWUvY21ha2UvSGVscGVyRnVuY3Rpb25zLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2ZjhiMjYKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL2NtYWtlL0hlbHBlckZ1bmN0aW9ucy5jbWFrZQpAQCAtMCwwICsxLDI1OCBAQAorIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRlVOQ1RJT05TL01BQ1JPUyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEl0IHNob3VsZCBiZSBub3RlZCB0aGF0IGluIGNtYWtlLCBmdW5jdGlvbnMgY2FuIG9ubHkgYmUgdXNlZCBvbiBhIHNpbmdsZSBsaW5lIHdpdGggdGhlIHJldHVybiB2YWx1ZQorIyBzdG9yZWQgaW4gYSBwYXJhbWV0ZXIgeW91IHNlbmQgdG8gdGhlIGZ1bmN0aW9uLiAgVGhlcmUgaXNuJ3QgYSB0cnVlIHJldHVybiB2YWx1ZS4gIFNvIHRlY2huaWNhbGx5LCAKKyMgYWxsIGZ1bmN0aW9ucyB3b3VsZCBoYXZlIGEgQy9DKysgcHJvdG90eXBlIG9mOgorIyB2b2lkIGZ1bmN0aW9uX25hbWUocGFyYW1ldGVyMSwgcGFyYW1ldGVyMiwgLi4uKTsKKyMgIAorIyBJZiB5b3Ugd2FudCBhIHJldHVybiB2YWx1ZSwgeW91IGhhdmUgdG8gdXNlIGEgcGFyYW1ldGVyIHNvIHRoZSBmdW5jdGlvbiBwcm90b3R5cGUgd291bGQgYmU6CisjIHZvaWQgZnVuY3Rpb25fbmFtZShpbnB1dF9wYXJhbWV0ZXIxLCBpbnB1dF9wYXJhbWV0ZXIyLCAuLi4sICByZXR1cm5fdmFsdWUpCisjICMjIyMjIyMjIyMjIyMjIyMjIworCisjIHZvaWQgc2F5KHN0cmluZyBtZXNzYWdlX3RvX3VzZXIpOworIyAtIHByaW50cyBvdXQgbWVzc2FnZV90b191c2VyCittYWNybyhzYXkgbWVzc2FnZV90b191c2VyKQorICAgIG1lc3NhZ2UoIiR7bWVzc2FnZV90b191c2VyfSIpCitlbmRtYWNybygpCisKKyMgdm9pZCB3YXJuaW5nX3NheShzdHJpbmcgbWVzc2FnZV90b191c2VyKTsKKyMgLSBwcmludHMgb3V0IG1lc3NhZ2VfdG9fdXNlciB3aXRoIGEgd2FybmluZworbWFjcm8od2FybmluZ19zYXkgbWVzc2FnZV90b191c2VyKQorICAgIG1lc3NhZ2UoV0FSTklORyAiJHttZXNzYWdlX3RvX3VzZXJ9IikKK2VuZG1hY3JvKCkKKworIyB2b2lkIGVycm9yX3NheShzdHJpbmcgbWVzc2FnZV90b191c2VyKTsKKyMgLSBwcmludHMgb3V0IG1lc3NhZ2VfdG9fdXNlciB3aXRoIGFuIGVycm9yIGFuZCBleGl0cyBjbWFrZQorbWFjcm8oZXJyb3Jfc2F5IG1lc3NhZ2VfdG9fdXNlcikKKyAgICBtZXNzYWdlKEZBVEFMX0VSUk9SICIke21lc3NhZ2VfdG9fdXNlcn0iKQorZW5kbWFjcm8oKQorCisjIHZvaWQgZGVidWdfc2F5KHN0cmluZyBtZXNzYWdlX3RvX2RldmVsb3Blcik7CisjIC0gcHJpbnRzIG91dCBtZXNzYWdlIHdoZW4gR0xPQkFMX0RFQlVHID09IDEgKGZvciBkZWJ1Z2dpbmcgY21ha2UgYnVpbGQpCittYWNybyhkZWJ1Z19zYXkgbWVzc2FnZV90b19kZXZlbG9wZXIpCisgICAgaWYoJHtHTE9CQUxfREVCVUd9IFNUUkVRVUFMICIxIikKKyAgICAgICAgc2F5KCJERUJVRzogJHttZXNzYWdlX3RvX2RldmVsb3Blcn0iKQorICAgIGVuZGlmKCkKK2VuZG1hY3JvKCkKKworIyB2b2lkIGRlYnVnX3NheV92YXIodmFyaWFibGUgdmFyKTsKKyMgLSBwcmludHMgdGhlIHZhcmlhYmxlIG5hbWUgYW5kIGl0cyB2YWx1ZSAoZm9yIGRlYnVnZ2luZyBjbWFrZSBidWlsZCkKK21hY3JvKGRlYnVnX3NheV92YXIgdmFyKQorICAgIGlmKCR7R0xPQkFMX0RFQlVHfSBTVFJFUVVBTCAiMSIpCisgICAgICAgIHNheSgiREVCVUc6IFZhcmlhYmxlOiAke3Zhcn0gPSAkeyR7dmFyfX0gIikKKyAgICBlbmRpZigpCitlbmRtYWNybygpCisKKyMgdm9pZCBzZXRfbGVnYWxfYXJjaChzdHJpbmcqIHJldHVybl9hcmNoX3N0cmluZyk7CisjIC0gcmV0dXJucyAodGhyb3VnaCByZXR1cm5fYXJjaF9zdHJpbmcpIHRoZSBmb3JtYWwgYXJjaGl0ZWN0dXJlIAorIyAgIHN0cmluZyBvciB3YXJucyB1c2VyIG9mIHVua25vd24gYXJjaGl0ZWN0dXJlCitmdW5jdGlvbihzZXRfbGVnYWxfYXJjaCByZXR1cm5fYXJjaF9zdHJpbmcpCisgICAgaWYoJHtJQTMyfSkgCisgICAgICAgIHNldCgke3JldHVybl9hcmNoX3N0cmluZ30gIklBLTMyIiBQQVJFTlRfU0NPUEUpCisgICAgZWxzZWlmKCR7SU5URUw2NH0pCisgICAgICAgIHNldCgke3JldHVybl9hcmNoX3N0cmluZ30gIkludGVsKFIpIDY0IiBQQVJFTlRfU0NPUEUpCisgICAgZWxzZWlmKCR7TUlDfSkKKyAgICAgICAgc2V0KCR7cmV0dXJuX2FyY2hfc3RyaW5nfSAiSW50ZWwoUikgTWFueSBJbnRlZ3JhdGVkIENvcmUgQXJjaGl0ZWN0dXJlIiBQQVJFTlRfU0NPUEUpCisgICAgZWxzZWlmKCR7YXJjaH0gU1RSRVFVQUwgImwxIikKKyAgICAgICAgc2V0KCR7cmV0dXJuX2FyY2hfc3RyaW5nfSAiTDFPTSIgUEFSRU5UX1NDT1BFKQorICAgIGVsc2VpZigke0FSTX0pCisgICAgICAgIHNldCgke3JldHVybl9hcmNoX3N0cmluZ30gIkFSTSIgUEFSRU5UX1NDT1BFKQorICAgIGVsc2VpZigke1BQQzY0fSkKKyAgICAgICAgc2V0KCR7cmV0dXJuX2FyY2hfc3RyaW5nfSAiUFBDNjQiIFBBUkVOVF9TQ09QRSkKKyAgICBlbHNlaWYoJHtBQVJDSDY0fSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBzZXQoJHtyZXR1cm5fYXJjaF9zdHJpbmd9ICJBQVJDSDY0IiBQQVJFTlRfU0NPUEUpCisgICAgZWxzZSgpCisgICAgICAgIHdhcm5pbmdfc2F5KCJzZXRfbGVnYWxfYXJjaCgpOiBXYXJuaW5nOiBVbmtub3duIGFyY2hpdGVjdHVyZS4uLiIpCisgICAgZW5kaWYoKQorZW5kZnVuY3Rpb24oKQorCisjIHZvaWQgY2hlY2tfdmFyaWFibGUoc3RyaW5nIHZhciwgc3RyaW5nIHZhcl9uYW1lLCBsaXN0PHN0cmluZz52YWx1ZXNfbGlzdCk7CisjIC0gcnVucyB0aHJvdWdoIHZhbHVlc19saXN0IGNoZWNraW5nIGlmICR7dmFyfSA9PSB2YWx1ZXNfbGlzdFtpXSBmb3IgYW55IGkuCisjIC0gaWYgdGhlIHZhciBpcyBmb3VuZCwgdGhlbiBqdXN0IHByaW50IGl0IG91dAorIyAtIGlmIHRoZSB2YXIgaXMgbm90IGZvdW5kLCB0aGVuIHdhcm4gdXNlcgorZnVuY3Rpb24oY2hlY2tfdmFyaWFibGUgdmFyIHZhbHVlc19saXN0KQorICAgIHNldCh2YWxpZF9mbGFnIDApCisgICAgZm9yZWFjaCh2YWx1ZSBJTiBMSVNUUyB2YWx1ZXNfbGlzdCkKKyAgICAgICAgaWYoIiR7JHt2YXJ9fSIgU1RSRVFVQUwgIiR7dmFsdWV9IikKKyAgICAgICAgICAgIHNldCh2YWxpZF9mbGFnIDEpCisgICAgICAgICAgICBzZXQodGhlX3ZhbHVlICIke3ZhbHVlfSIpCisgICAgICAgIGVuZGlmKCkKKyAgICBlbmRmb3JlYWNoKCkKKyAgICBpZigke3ZhbGlkX2ZsYWd9IEVRVUFMIDApCisgICAgICAgIGVycm9yX3NheSgiY2hlY2tfdmFyaWFibGUoKTogJHt2YXJ9ID0gJHske3Zhcn19IGlzIHVua25vd24iKQorICAgIGVuZGlmKCkKK2VuZGZ1bmN0aW9uKCkKKworIyB2b2lkIF9leHBvcnRfbGliX2RpcihzdHJpbmcgZXhwb3J0X2Rpciwgc3RyaW5nIHBsYXRmb3JtLCBzdHJpbmcgc3VmZml4LCBzdHJpbmcqIHJldHVybl92YWx1ZSk7CisjIC0gYmFzaWNhbGx5IGEgc3BlY2lhbCBjYXNlIGZvciBtYWMgcGxhdGZvcm1zIHdoZXJlIGl0IGFkZHMgJy50aGluJyB0byB0aGUgb3V0cHV0IGxpYiBkaXJlY3RvcnkKK2Z1bmN0aW9uKF9leHBvcnRfbGliX2RpciBwbHRmcm0gcmV0dXJuX3ZhbHVlKQorICAgIGlmKCR7TUFDfSkKKyAgICAgICAgc2V0KCR7cmV0dXJuX3ZhbHVlfSAiJHtleHBvcnRfZGlyfS8ke3BsdGZybX0ke3N1ZmZpeH0vbGliLnRoaW4iIFBBUkVOVF9TQ09QRSkKKyAgICBlbHNlKCkKKyAgICAgICAgc2V0KCR7cmV0dXJuX3ZhbHVlfSAiJHtleHBvcnRfZGlyfS8ke3BsdGZybX0ke3N1ZmZpeH0vbGliIiBQQVJFTlRfU0NPUEUpCisgICAgZW5kaWYoKQorZW5kZnVuY3Rpb24oKQorCisjIHZvaWQgX2V4cG9ydF9saWJfZmF0X2RpcihzdHJpbmcgZXhwb3J0X2Rpciwgc3RyaW5nIHBsYXRmb3JtLCBzdHJpbmcgc3VmZml4LCBzdHJpbmcqIHJldHVybl92YWx1ZSk7CisjIC0gYW5vdGhlciBtYWMgc3BlY2lhbHR5IGNhc2UgZm9yIGZhdCBsaWJyYXJpZXMuCisjIC0gdGhpcyBzZXRzIGV4cG9ydF9saWJfZmF0X2RpciBpbiB0aGUgTUFJTiBwYXJ0IG9mIENNYWtlTGlzdHMudHh0CitmdW5jdGlvbihfZXhwb3J0X2xpYl9mYXRfZGlyIHBsdGZybSByZXR1cm5fdmFsdWUpCisgICAgc2V0KCR7cmV0dXJuX3ZhbHVlfSAiJHtleHBvcnRfZGlyfS8ke3BsdGZybX0ke3N1ZmZpeH0vbGliIiBQQVJFTlRfU0NPUEUpCitlbmRmdW5jdGlvbigpCisKKyMgdm9pZCBnZXRfYnVpbGRfbnVtYmVyKHN0cmluZyBzcmNfZGlyLCBzdHJpbmcqIHJldHVybl9idWlsZF9udW1iZXIpOworIyAtIGdyYWIgdGhlIGVpZ2h0IGRpZ2l0IGJ1aWxkIG51bWJlciAob3IgMDAwMDAwMDApIGZyb20ga21wX3ZlcnNpb24uYworZnVuY3Rpb24oZ2V0X2J1aWxkX251bWJlciBzcmNfZGlyIHJldHVybl9idWlsZF9udW1iZXIpCisgICAgIyBzZXRzIGZpbGVfbGluZXNfbGlzdCB0byBhIGxpc3Qgb2YgYWxsIGxpbmVzIGluIGttcF92ZXJzaW9uLmMKKyAgICBmaWxlKFNUUklOR1MgIiR7c3JjX2Rpcn0vc3JjL2ttcF92ZXJzaW9uLmMiIGZpbGVfbGluZXNfbGlzdCkKKworICAgICMgcnVucyB0aHJvdWdoIGVhY2ggbGluZSBpbiBrbXBfdmVyc2lvbi5jCisgICAgZm9yZWFjaChsaW5lIElOIExJU1RTIGZpbGVfbGluZXNfbGlzdCkKKyAgICAgICAgIyBpZiB0aGUgbGluZSBiZWdpbnMgd2l0aCAiI2RlZmluZSBLTVBfVkVSU0lPTl9CVUlMRCIgdGhlbiB3ZSB0YWtlIG5vdCBvZiB0aGUgYnVpbGQgbnVtYmVyCisgICAgICAgIHN0cmluZyhSRUdFWCBNQVRDSCAiXlsgXHRdKiNkZWZpbmVbIFx0XStLTVBfVkVSU0lPTl9CVUlMRCIgdmFsaWQgIiR7bGluZX0iKQorICAgICAgICBpZihOT1QgIiR7dmFsaWR9IiBTVFJFUVVBTCAiIikgIyBpZiB3ZSBtYXRjaGVkICIjZGVmaW5lIEtNUF9WRVJTSU9OX0JVSUxEIiwgdGhlbiBncmFiIHRoZSBidWlsZCBudW1iZXIKKyAgICAgICAgICAgIHN0cmluZyhSRUdFWCBSRVBMQUNFICJeWyBcdF0qI2RlZmluZVsgXHRdK0tNUF9WRVJTSU9OX0JVSUxEWyBcdF0rKFswLTldKykiICJcXDEiCisgICAgICAgICAgICAgICAgICAgYnVpbGRfbnVtYmVyICIke2xpbmV9IgorICAgICAgICAgICAgKQorICAgICAgICBlbmRpZigpCisgICAgZW5kZm9yZWFjaCgpCisgICAgc2V0KCR7cmV0dXJuX2J1aWxkX251bWJlcn0gIiR7YnVpbGRfbnVtYmVyfSIgUEFSRU5UX1NDT1BFKSAjIHJldHVybiBidWlsZCBudW1iZXIKK2VuZGZ1bmN0aW9uKCkKKworIyB2b2lkIHNldF9sZWdhbF90eXBlKHN0cmluZyogcmV0dXJuX2xlZ2FsX3R5cGUpOworIyAtIHNldCB0aGUgbGVnYWwgdHlwZSBuYW1lIFBlcmZvcm1hbmNlL1Byb2ZpbGluZy9TdHViCitmdW5jdGlvbihzZXRfbGVnYWxfdHlwZSByZXR1cm5fbGVnYWxfdHlwZSkKKyAgICBpZigke05PUk1BTF9MSUJSQVJZfSkKKyAgICAgICAgc2V0KCR7cmV0dXJuX2xlZ2FsX3R5cGV9ICJQZXJmb3JtYW5jZSIgUEFSRU5UX1NDT1BFKQorICAgIGVsc2VpZigke1BST0ZJTEVfTElCUkFSWX0pCisgICAgICAgIHNldCgke3JldHVybl9sZWdhbF90eXBlfSAiUHJvZmlsaW5nIiBQQVJFTlRfU0NPUEUpCisgICAgZWxzZWlmKCR7U1RVQlNfTElCUkFSWX0pCisgICAgICAgIHNldCgke3JldHVybl9sZWdhbF90eXBlfSAiU3R1YiIgUEFSRU5UX1NDT1BFKQorICAgIGVuZGlmKCkKK2VuZGZ1bmN0aW9uKCkKKworIyB2b2lkIHNldF9tYWNfb3NfbmV3KGJvb2wqIHJldHVybl9tYWNfb3NfbmV3KTsKKyMgLSBzZXRzIHRoZSByZXR1cm5fbWFjX29zX25ldyB2YXJpYWJsZSB0byB0cnVlIG9yIGZhbHNlIGJhc2VkIG9uIG1hY29zeCB2ZXJzaW9uCisjIC0gbm8gcmVhbCAiY21ha2V5IiB3YXkgdG8gZG8gdGhpcy4gIEhhdmUgdG8gY2FsbCBleGVjdXRlX3Byb2Nlc3MoKQorZnVuY3Rpb24oc2V0X21hY19vc19uZXcgcmV0dXJuX21hY19vc19uZXcpCisgICAgZXhlY3V0ZV9wcm9jZXNzKENPTU1BTkQgInN3X3ZlcnMiICItcHJvZHVjdFZlcnNpb24iIE9VVFBVVF9WQVJJQUJMRSBtYWNfb3N4X3ZlcnNpb24pCisgICAgaWYoIiR7bWFjX29zeF92ZXJzaW9ufSIgVkVSU0lPTl9HUkVBVEVSICIxMC42IikKKyAgICAgICAgc2V0KCR7cmV0dXJuX21hY19vc19uZXd9IFRSVUUgUEFSRU5UX1NDT1BFKQorICAgIGVsc2UoKQorICAgICAgICBzZXQoJHtyZXR1cm5fbWFjX29zX25ld30gRkFMU0UgUEFSRU5UX1NDT1BFKQorICAgIGVuZGlmKCkKK2VuZGZ1bmN0aW9uKCkKKworIyB2b2lkIGFkZF9wcmVmaXgoc3RyaW5nIHByZWZpeCwgbGlzdDxzdHJpbmc+KiBsaXN0X29mX2l0ZW1zKTsKKyMgLSByZXR1cm5zIGxpc3Rfb2ZfaXRlbXMgd2l0aCBwcmVmaXggcHJlcGVuZGVkIHRvIGFsbCBpdGVtcworIyAtIG9yaWdpbmFsIGxpc3QgaXMgbW9kaWZpZWQKK2Z1bmN0aW9uKGFkZF9wcmVmaXggcHJlZml4IGxpc3Rfb2ZfaXRlbXMpCisgICAgc2V0KGxvY2FsX2xpc3QgIiIpCisgICAgZm9yZWFjaChpdGVtIElOIExJU1RTICIke2xpc3Rfb2ZfaXRlbXN9IikKKyAgICAgICAgaWYoTk9UICIke2l0ZW19IiBTVFJFUVVBTCAiIikKKyAgICAgICAgICAgIGxpc3QoQVBQRU5EIGxvY2FsX2xpc3QgIiR7cHJlZml4fSR7aXRlbX0iKQorICAgICAgICBlbmRpZigpCisgICAgZW5kZm9yZWFjaCgpCisgICAgc2V0KCR7bGlzdF9vZl9pdGVtc30gIiR7bG9jYWxfbGlzdH0iIFBBUkVOVF9TQ09QRSkKK2VuZGZ1bmN0aW9uKCkKKworIyB2b2lkIGFkZF9zdWZmaXgoc3RyaW5nIHN1ZmZpeCwgbGlzdDxzdHJpbmc+KiBsaXN0X29mX2l0ZW1zKTsKKyMgLSByZXR1cm5zIGxpc3Rfb2ZfaXRlbXMgd2l0aCBzdWZmaXggYXBwZW5kZWQgdG8gYWxsIGl0ZW1zCisjIC0gb3JpZ2luYWwgbGlzdCBpcyBtb2RpZmllZAorZnVuY3Rpb24oYWRkX3N1ZmZpeCBzdWZmaXggbGlzdF9vZl9pdGVtcykKKyAgICBzZXQobG9jYWxfbGlzdCAiIikKKyAgICBmb3JlYWNoKGl0ZW0gSU4gTElTVFMgIiR7bGlzdF9vZl9pdGVtc30iKQorICAgICAgICBpZihOT1QgIiR7aXRlbX0iIFNUUkVRVUFMICIiKQorICAgICAgICAgICAgbGlzdChBUFBFTkQgbG9jYWxfbGlzdCAiJHtpdGVtfSR7c3VmZml4fSIpCisgICAgICAgIGVuZGlmKCkKKyAgICBlbmRmb3JlYWNoKCkKKyAgICBzZXQoJHtsaXN0X29mX2l0ZW1zfSAiJHtsb2NhbF9saXN0fSIgUEFSRU5UX1NDT1BFKQorZW5kZnVuY3Rpb24oKQorCisjIHZvaWQgc3RyaXBfc3VmZml4KGxpc3Q8c3RyaW5nPiBsaXN0X29mX2l0ZW1zLCBsaXN0PHN0cmluZz4qIHJldHVybl9saXN0KTsKKyMgLSByZXR1cm5zIGEgbmV3IGxpc3Qgd2l0aCBzdWZmaXggc3RyaXBwZWQgKGkuZS4sIGZvby5jID0+IGZvbykKKyMgLSBsaXN0X29mX2l0ZW1zIGlzIG5vdCBtb2RpZmllZCwgcmV0dXJuX2xpc3QgaXMgbW9kaWZpZWQKK2Z1bmN0aW9uKHN0cmlwX3N1ZmZpeCBsaXN0X29mX2l0ZW1zIHJldHVybl9saXN0KQorICAgIHNldChsb2NhbF9saXN0ICIiKQorICAgIGZvcmVhY2goaXRlbSBJTiBMSVNUUyAiJHtsaXN0X29mX2l0ZW1zfSIpCisgICAgICAgIGlmKE5PVCAiJHtpdGVtfSIgU1RSRVFVQUwgIiIpCisgICAgICAgICAgICBnZXRfZmlsZW5hbWVfY29tcG9uZW50KGZpbGVuYW1lICIke2l0ZW19IiBOQU1FX1dFKQorICAgICAgICAgICAgbGlzdChBUFBFTkQgbG9jYWxfbGlzdCAiJHtmaWxlbmFtZX0iKQorICAgICAgICBlbmRpZigpCisgICAgZW5kZm9yZWFjaCgpCisgICAgc2V0KCR7cmV0dXJuX2xpc3R9ICIke2xvY2FsX2xpc3R9IiBQQVJFTlRfU0NPUEUpCitlbmRmdW5jdGlvbigpCisKKyMgdm9pZCBsaXN0X3RvX3N0cmluZyhsaXN0PHN0cmluZz4gbGlzdF9vZl90aGluZ3MsIHN0cmluZyogcmV0dXJuX3N0cmluZyk7CisjIC0gY29udmVydHMgYSBsaXN0IHRvIGEgc3BhY2Ugc2VwYXJhdGVkIHN0cmluZworZnVuY3Rpb24obGlzdF90b19zdHJpbmcgbGlzdF9vZl90aGluZ3MgcmV0dXJuX3N0cmluZykKKyAgICBzdHJpbmcoUkVQTEFDRSAiOyIgIiAiIG91dHB1dF92YXJpYWJsZSAiJHtsaXN0X29mX3RoaW5nc30iKQorICAgIHNldCgke3JldHVybl9zdHJpbmd9ICIke291dHB1dF92YXJpYWJsZX0iIFBBUkVOVF9TQ09QRSkKK2VuZGZ1bmN0aW9uKCkKKworIyB2b2lkIHN0cmluZ190b19saXN0KHN0cmluZyBzdHIsIGxpc3Q8c3RyaW5nPiogcmV0dXJuX2xpc3QpOworIyAtIGNvbnZlcnRzIGEgc3RyaW5nIHRvIGEgc2VtaWNvbG9uIHNlcGFyYXRlZCBsaXN0CisjIC0gd2hhdCBpdCByZWFsbHkgZG9lcyBpcyBqdXN0IHN0cmluZ19yZXBsYWNlIGFsbCBydW5uaW5nIHdoaXRlc3BhY2UgdG8gYSBzZW1pY29sb24KKyMgLSBpbiBjbWFrZSwgYSBsaXN0IGlzIHN0cmluZ3Mgc2VwYXJhdGVkIGJ5IHNlbWljb2xvbnM6IGkuZS4sIGxpc3Qgb2YgZm91ciBpdGVtcywgbGlzdCA9ICJpdGVtMTtpdGVtMjtpdGVtMztpdGVtNCIKK2Z1bmN0aW9uKHN0cmluZ190b19saXN0IHN0ciByZXR1cm5fbGlzdCkKKyAgICBzZXQob3V0c3RyKQorICAgIHN0cmluZyhSRUdFWCBSRVBMQUNFICJbIFx0XSsiICI7IiBvdXRzdHIgIiR7c3RyfSIpCisgICAgc2V0KCR7cmV0dXJuX2xpc3R9ICIke291dHN0cn0iIFBBUkVOVF9TQ09QRSkgCitlbmRmdW5jdGlvbigpCisKKyMgdm9pZCBnZXRfZGF0ZShzdHJpbmcqIHJldHVybl9kYXRlKTsKKyMgLSByZXR1cm5zIHRoZSBjdXJyZW50IGRhdGUgInl5eXktbW0tZGQgaGg6bW06c3MgVVRDIgorIyAtIHRoaXMgZnVuY3Rpb24gYWxvbmUgY2F1c2VzIHRoZSBuZWVkIGZvciBDTWFrZSB2Mi44LjExIChUSU1FU1RBTVApCisjZnVuY3Rpb24oZ2V0X2RhdGUgcmV0dXJuX2RhdGUpCisjICAgIHN0cmluZyhUSU1FU1RBTVAgbG9jYWxfZGF0ZSAiJVktJW0tJWQgJUg6JU06JVMgVVRDIiBVVEMpCisjICAgIHNldCgke3JldHVybl9kYXRlfSAke2xvY2FsX2RhdGV9IFBBUkVOVF9TQ09QRSkKKyNlbmRmdW5jdGlvbigpCisKKyMgdm9pZCBmaW5kX2FfcHJvZ3JhbShzdHJpbmcgcHJvZ3JhbV9uYW1lLCBsaXN0PHN0cmluZz4gZXh0cmFfcGF0aHMsIGJvb2wgZmFpbF9vbl9ub3RfZm91bmQsIHN0cmluZyByZXR1cm5fdmFyaWFibGVfbmFtZSk7CisjIC0gcmV0dXJucyB0aGUgZnVsbCBwYXRoIG9mIGEgcHJvZ3JhbV9uYW1lCisjIC0gZmlyc3QgbG9va3MgaW4gdGhlIGxpc3Qgb2YgZXh0cmFfcGF0aHMKKyMgLSBpZiBub3QgZm91bmQgaW4gZXh0cmFfcGF0aHMsIHRoZW4gbG9vayB0aHJvdWdoIHN5c3RlbSBwYXRoCisjIC0gZXJyb3JzIG91dCBpZiBmYWlsX29uX25vdF9mb3VuZCA9PSB0cnVlIGFuZCBjbWFrZSBjb3VsZCBub3QgZmluZCBwcm9ncmFtX25hbWUuCitmdW5jdGlvbihmaW5kX2FfcHJvZ3JhbSBwcm9ncmFtX25hbWUgZXh0cmFfcGF0aHMgZmFpbF9vbl9ub3RfZm91bmQgcmV0dXJuX3ZhcmlhYmxlX25hbWUpCisgICAgIyBmaXJzdCB0cnkgdG8gZmluZCB0aGUgcHJvZ3JhbSBpbiB0aGUgZXh0cmFfcGF0aHMKKyAgICBmaW5kX3Byb2dyYW0oJHtyZXR1cm5fdmFyaWFibGVfbmFtZX0gIiR7cHJvZ3JhbV9uYW1lfSIgUEFUSFMgIiR7ZXh0cmFfcGF0aHN9IiBET0MgIlBhdGggdG8gJHtwcm9ncmFtX25hbWV9IiBOT19DTUFLRV9FTlZJUk9OTUVOVF9QQVRIIE5PX0NNQUtFX1BBVEggTk9fU1lTVEVNX0VOVklST05NRU5UX1BBVEggTk9fQ01BS0VfU1lTVEVNX1BBVEgpCisgICAgaWYoIiR7JHtyZXR1cm5fdmFyaWFibGVfbmFtZX19IiBNQVRDSEVTIE5PVEZPVU5EKQorICAgICAgICAjIGlmIG5vIGV4dHJhX3BhdGhzLCBvciBjb3VsZG4ndCBmaW5kIGl0LCB0aGVuIGxvb2sgaW4gc3lzdGVtICRQQVRICisgICAgICAgIGZpbmRfcHJvZ3JhbSgke3JldHVybl92YXJpYWJsZV9uYW1lfSAiJHtwcm9ncmFtX25hbWV9IiBET0MgIlBhdGggdG8gJHtwcm9ncmFtX25hbWV9IikKKyAgICAgICAgaWYoIiR7JHtyZXR1cm5fdmFyaWFibGVfbmFtZX19IiBNQVRDSEVTIE5PVEZPVU5EIEFORCAke2ZhaWxfb25fbm90X2ZvdW5kfSkKKyAgICAgICAgICAgIGVycm9yX3NheSgiRXJyb3I6IENvdWxkIG5vdCBmaW5kIHByb2dyYW06ICR7cHJvZ3JhbV9uYW1lfSIpCisgICAgICAgIGVuZGlmKCkKKyAgICBlbmRpZigpCisKKyAgICBpZihOT1QgIiR7JHtyZXR1cm5fdmFyaWFibGVfbmFtZX19IiBNQVRDSEVTIE5PVEZPVU5EKQorICAgICAgICBzYXkoIi0tIEZvdW5kICR7cHJvZ3JhbV9uYW1lfTogJHske3JldHVybl92YXJpYWJsZV9uYW1lfX0iKQorICAgIGVuZGlmKCkKKworICAgIHNldCgke3JldHVybl92YXJpYWJsZV9uYW1lfSAkeyR7cmV0dXJuX3ZhcmlhYmxlX25hbWV9fSBQQVJFTlRfU0NPUEUpCitlbmRmdW5jdGlvbigpCisKKyMgV0lORE9XUyBTUEVDSUZJQyAKKyMgdm9pZCByZXBsYWNlX21kX3dpdGhfbXQoc3RyaW5nIGZsYWdzX3ZhcikKKyMgLSBUaGlzIG1hY3JvIHJlcGxhY2VzIHRoZSAvTUQgY29tcGlsZXIgZmxhZ3MgKFdpbmRvd3Mgc3BlY2lmaWMpIHdpdGggL01UIGNvbXBpbGVyIGZsYWdzCisjIC0gVGhpcyBkb2VzIG5vdGhpbmcgaWYgbm8gL01EIGZsYWdzIHdlcmUgcmVwbGFjZWQuCittYWNybyhyZXBsYWNlX21kX3dpdGhfbXQgZmxhZ3NfdmFyKQorICAgIHNldChmbGFnc192YXJfbmFtZSAgJHtmbGFnc192YXJ9KSAjIGkuZS4sIENNQUtFX0NfRkxBR1NfUkVMRUFTRQorICAgIHNldChmbGFnc192YXJfdmFsdWUgJHske2ZsYWdzX3Zhcn19KSAjIGkuZS4sICIvTUQgL08yIC4uLiIKKyAgICBzdHJpbmcoUkVQTEFDRSAvTUQgL01UIHRlbXBfb3V0ICIke2ZsYWdzX3Zhcl92YWx1ZX0iKQorICAgIHN0cmluZyhDT01QQVJFIE5PVEVRVUFMICIke3RlbXBfb3V0fSIgIiR7ZmxhZ3NfdmFyX3ZhbHVlfSIgc29tZXRoaW5nX3dhc19yZXBsYWNlZCkKKyAgICBpZigiJHtzb21ldGhpbmdfd2FzX3JlcGxhY2VkfSIpCisgICAgICAgIHVuc2V0KCR7ZmxhZ3NfdmFyX25hbWV9IENBQ0hFKQorICAgICAgICBzZXQoJHtmbGFnc192YXJfbmFtZX0gJHt0ZW1wX291dH0gQ0FDSEUgU1RSSU5HICJSZXBsYWNlZCAvTUQgd2l0aCAvTVQgY29tcGlsZXIgZmxhZ3MiKQorICAgIGVuZGlmKCkKK2VuZG1hY3JvKCkKKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9jbWFrZS9JbnRlbC9Bc21GbGFncy5jbWFrZSBiL2ZpbmFsL3J1bnRpbWUvY21ha2UvSW50ZWwvQXNtRmxhZ3MuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjgwMGFmNQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvY21ha2UvSW50ZWwvQXNtRmxhZ3MuY21ha2UKQEAgLTAsMCArMSw0MiBAQAorIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworCisjIFRoaXMgZmlsZSBob2xkcyBJbnRlbChSKSBDIENvbXBpbGVyIC8gSW50ZWwoUikgQysrIENvbXBpbGVyIC8gSW50ZWwoUikgRm9ydHJhbiBDb21waWxlciAoaWNjL2ljcGMvaWNsLmV4ZS9pZm9ydCkgZGVwZW5kZW50IGZsYWdzCisjIFRoZSBmbGFnIHR5cGVzIGFyZToKKyMgICAxKSBBc3NlbWJseSBmbGFncworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQXNzZW1ibHkgZmxhZ3MKK2Z1bmN0aW9uKGFwcGVuZF9hc3NlbWJsZXJfc3BlY2lmaWNfYXNtX2ZsYWdzIGlucHV0X2FzbV9mbGFncykKKyAgICBzZXQobG9jYWxfYXNtX2ZsYWdzKQorICAgIGFwcGVuZF9hc21fZmxhZ3MoIi14IGFzc2VtYmxlci13aXRoLWNwcCIpICMgQXNzZW1ibHkgZmlsZSB0aGF0IG5lZWRzIHRvIGJlIHByZXByb2Nlc3NlZAorICAgIGlmKCR7SUEzMn0pCisgICAgICAgIGFwcGVuZF9hc21fZmxhZ3MoIi1zYWZlc2VoIikgIyBSZWdpc3RlcnMgZXhjZXB0aW9uIGhhbmRsZXJzIGZvciBzYWZlIGV4Y2VwdGlvbiBoYW5kbGluZy4KKyAgICAgICAgYXBwZW5kX2FzbV9mbGFncygiLWNvZmYiKSAjIEdlbmVyYXRlcyBjb21tb24gb2JqZWN0IGZpbGUgZm9ybWF0IChDT0ZGKSB0eXBlIG9mIG9iamVjdCBtb2R1bGUuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgR2VuZXJhbGx5IHJlcXVpcmVkIGZvciBXaW4zMiBhc3NlbWJseSBsYW5ndWFnZSBkZXZlbG9wbWVudC4KKyAgICAgICAgYXBwZW5kX2FzbV9mbGFncygiLUQgX01fSUEzMiIpCisgICAgZWxzZWlmKCR7SU5URUw2NH0pCisgICAgICAgIGFwcGVuZF9hc21fZmxhZ3MoIi1EIF9NX0FNRDY0IikKKyAgICBlbmRpZigpCisgICAgaWYoJHtNSUN9KQorICAgICAgICBhcHBlbmRfYXNtX2ZsYWdzKCItbW1pYyIpICMgQnVpbGQgSW50ZWwoUikgTUlDIEFyY2hpdGVjdHVyZSBuYXRpdmUgY29kZQorICAgIGVuZGlmKCkKKyAgICBpZigke1dJTkRPV1N9KQorICAgICAgICAjIENNYWtlIHByZWZlcnMgdGhlIC9NRCBmbGFncyB3aGVuIGNvbXBpbGluZyBXaW5kb3dzIHNvdXJjZXMsIGJ1dCBsaWJpb21wNSBuZWVkcyB0byB1c2UgL01UIGluc3RlYWQKKyAgICAgICAgIyBTbyB3ZSByZXBsYWNlIHRoZXNlIC9NRCBpbnN0YW5jZXMgd2l0aCAvTVQgd2l0aGluIHRoZSBDTUFLRV8qX0ZMQUdTIHZhcmlhYmxlcyBhbmQgcHV0IHRoYXQgb3V0IHRvIHRoZSBDQUNIRS4KKyAgICAgICAgIyByZXBsYWNlX21kX3dpdGhfbXQoKSBpcyBpbiBIZWxwZXJGdW5jdGlvbnMuY21ha2UKKyAgICAgICAgcmVwbGFjZV9tZF93aXRoX210KENNQUtFX0FTTV9NQVNNX0ZMQUdTKQorICAgICAgICByZXBsYWNlX21kX3dpdGhfbXQoQ01BS0VfQVNNX01BU01fRkxBR1NfUkVMRUFTRSkKKyAgICAgICAgcmVwbGFjZV9tZF93aXRoX210KENNQUtFX0FTTV9NQVNNX0ZMQUdTX1JFTFdJVEhERUJJTkZPKQorICAgICAgICByZXBsYWNlX21kX3dpdGhfbXQoQ01BS0VfQVNNX01BU01fRkxBR1NfREVCVUcpCisgICAgZW5kaWYoKQorICAgIHNldCgke2lucHV0X2FzbV9mbGFnc30gJHske2lucHV0X2FzbV9mbGFnc319ICIke2xvY2FsX2FzbV9mbGFnc30iIFBBUkVOVF9TQ09QRSkKK2VuZGZ1bmN0aW9uKCkKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvY21ha2UvSW50ZWwvQ0ZsYWdzLmNtYWtlIGIvZmluYWwvcnVudGltZS9jbWFrZS9JbnRlbC9DRmxhZ3MuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ0YjU0NQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvY21ha2UvSW50ZWwvQ0ZsYWdzLmNtYWtlCkBAIC0wLDAgKzEsMTU4IEBACisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKKyMgVGhpcyBmaWxlIGhvbGRzIEludGVsKFIpIEMgQ29tcGlsZXIgLyBJbnRlbChSKSBDKysgQ29tcGlsZXIgLyBJbnRlbChSKSBGb3J0cmFuIENvbXBpbGVyIChpY2MvaWNwYy9pY2wuZXhlL2lmb3J0KSBkZXBlbmRlbnQgZmxhZ3MKKyMgVGhlIGZsYWcgdHlwZXMgYXJlOgorIyAgIDIpIEMvQysrIENvbXBpbGVyIGZsYWdzCisjICAgNCkgTGlua2VyIGZsYWdzCisKKyMgaWNjIGhhcyBhIDEyOC1iaXQgZmxvYXRpbmcgcG9pbnQgdHlwZSBjYWxsZWQgX1F1YWQuICBBbHdheXMgY29tcGlsZSB3aXRoIDEyOC1iaXQgZmxvYXRpbmcgcG9pbnQgaWYgaXQgZXhpc3RzLgordW5zZXQoQ09NUElMRVJfU1VQUE9SVFNfUVVBRF9QUkVDSVNJT04gQ0FDSEUpCitzZXQoQ09NUElMRVJfU1VQUE9SVFNfUVVBRF9QUkVDSVNJT04gdHJ1ZSBDQUNIRSBCT09MICJEb2VzIHRoZSBjb21waWxlciBzdXBwb3J0IGEgMTI4LWJpdCBmbG9hdGluZyBwb2ludCB0eXBlPyIpCitzZXQoQ09NUElMRVJfUVVBRF9UWVBFIF9RdWFkKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgaWNjIEMvQysrIENvbXBpbGVyIGZsYWdzCitmdW5jdGlvbihhcHBlbmRfY29tcGlsZXJfc3BlY2lmaWNfY19hbmRfY3h4X2ZsYWdzIGlucHV0X2NfZmxhZ3MgaW5wdXRfY3h4X2ZsYWdzKQorICAgIHNldChsb2NhbF9jX2ZsYWdzKQorICAgIHNldChsb2NhbF9jeHhfZmxhZ3MpCisgICAgaWYoJHtXSU5ET1dTfSkKKyAgICAgICAgCisgICAgICAgIGFwcGVuZF9jX2ZsYWdzKCItVFAiKSAjIFRlbGxzIHRoZSBjb21waWxlciB0byBwcm9jZXNzIGEgZmlsZSBhcyBhIEMrKyBzb3VyY2UgZmlsZS4KKyAgICAgICAgYXBwZW5kX2N4eF9mbGFncygiLUVIc2MiKSAjIEVuYWJsZSBDKysgZXhjZXB0aW9uIGhhbmRsaW5nLgorICAgICAgICBhcHBlbmRfY19hbmRfY3h4X2ZsYWdzKCItbm9sb2dvIikgIyBUdXJuIG9mZiB0b29sIGJhbm5lci4KKyAgICAgICAgYXBwZW5kX2NfYW5kX2N4eF9mbGFncygiLVczIikgIyBFbmFibGVzIGRpYWdub3N0aWNzIGZvciByZW1hcmtzLCB3YXJuaW5ncywgYW5kIGVycm9ycy4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgQWRkaXRpb25hbCB3YXJuaW5ncyBhcmUgYWxzbyBlbmFibGVkIGFib3ZlIGxldmVsIDIgd2FybmluZ3MuCisgICAgICAgIGFwcGVuZF9jX2FuZF9jeHhfZmxhZ3MoIi1XWCIpICMgQ2hhbmdlIGFsbCBXYXJuaW5ncyB0byBFcnJvcnMKKyAgICAgICAgYXBwZW5kX2NfYW5kX2N4eF9mbGFncygiLUdTIikgIyBMZXRzIHlvdSBjb250cm9sIHRoZSB0aHJlc2hvbGQgYXQgd2hpY2ggdGhlIHN0YWNrIGNoZWNraW5nIHJvdXRpbmUgaXMgY2FsbGVkIG9yIG5vdCBjYWxsZWQuCisgICAgICAgIGFwcGVuZF9jX2FuZF9jeHhfZmxhZ3MoIi1Rb3B0aW9uLGNwcCwtLWV4dGVuZGVkX2Zsb2F0X3R5cGVzIikgIyBFbmFibGVkIF9RdWFkIHR5cGUuCisgICAgICAgIGlmKCR7SUEzMn0pCisgICAgICAgICAgIGFwcGVuZF9jX2FuZF9jeHhfZmxhZ3MoIi1hcmNoOmlhMzIiKSAjIFRlbGxzIHRoZSBjb21waWxlciB3aGljaCBmZWF0dXJlcyBpdCBtYXkgdGFyZ2V0IChpYTMyKQorICAgICAgICAgICBhcHBlbmRfY19hbmRfY3h4X2ZsYWdzKCItT3ktIikgIyBlcXVpdmFsZW50IHRvIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyCisgICAgICAgIGVuZGlmKCkKKyAgICAgICAgYXBwZW5kX2NfYW5kX2N4eF9mbGFncygiLVFsb25nX2RvdWJsZSIpICMgZW5hYmxlIGxvbmcgZG91YmxlCisgICAgICAgIGFwcGVuZF9jX2FuZF9jeHhfZmxhZ3MoIi1RZGlhZy1kaXNhYmxlOjE3NyIpICMgRGlzYWJsZSB3YXJuaW5nOiAiLi4uIGRlY2xhcmVkIGJ1dCBuZXZlciByZWZlcmVuY2VkIgorICAgICAgICBpZigke0lBMzJ9KQorICAgICAgICAgICAgYXBwZW5kX2NfYW5kX2N4eF9mbGFncygiLVFzYWZlc2VoIikgIyBSZWdpc3RlcnMgZXhjZXB0aW9uIGhhbmRsZXJzIGZvciBzYWZlIGV4Y2VwdGlvbiBoYW5kbGluZy4KKyAgICAgICAgZW5kaWYoKQorICAgICAgICBpZigke1JFTEVBU0VfQlVJTER9IE9SICR7UkVMV0lUSERFQklORk9fQlVJTER9KQorICAgICAgICAgICAgYXBwZW5kX2NfYW5kX2N4eF9mbGFncygiLVFpbmxpbmUtbWluLXNpemU9MSIpICMgU3BlY2lmaWVzIHRoZSB1cHBlciBsaW1pdCBmb3IgdGhlIHNpemUgb2Ygd2hhdCB0aGUgaW5saW5lciBjb25zaWRlcnMgdG8gYmUgYSBzbWFsbCByb3V0aW5lLgorICAgICAgICBlbHNlKCkKKyAgICAgICAgICAgIGFwcGVuZF9jX2FuZF9jeHhfZmxhZ3MoIi1PZCIpICMgRGlzYWJsZXMgYWxsIG9wdGltaXphdGlvbnMuCisgICAgICAgICAgICBhcHBlbmRfY19hbmRfY3h4X2ZsYWdzKCItUlRDMSIpICMgRW5hYmxlcyBydW4tdGltZSBjaGVja3Mgb2YgdGhlIHN0YWNrIGZyYW1lLCBhbmQgZW5hYmxlcyBydW4tdGltZSBjaGVja3MgZm9yIHVuaW50aWFsaXplZCB2YXJpYWJsZXMuCisgICAgICAgICAgICBhcHBlbmRfY19hbmRfY3h4X2ZsYWdzKCItTVRkIikgIyBUZWxscyB0aGUgbGlua2VyIHRvIHNlYXJjaCBmb3IgdW5yZXNvbHZlZCByZWZlcmVuY2VzIGluIGEgbXVsdGl0aHJlYWRlZCwgc3RhdGljIHJ1bi10aW1lIGxpYnJhcnkuCisgICAgICAgIGVuZGlmKCkKKyAgICBlbHNlKCkKKyAgICAgICAgYXBwZW5kX2NfYW5kX2N4eF9mbGFncygiLVdzaWduLWNvbXBhcmUiKSAjIHdhcm4gb24gc2lnbiBjb21wYXJpc29ucworICAgICAgICBhcHBlbmRfY19hbmRfY3h4X2ZsYWdzKCItUW9wdGlvbixjcHAsLS1leHRlbmRlZF9mbG9hdF90eXBlcyIpICMgRW5hYmxlZCBfUXVhZCB0eXBlLgorICAgICAgICBhcHBlbmRfY19hbmRfY3h4X2ZsYWdzKCItZm5vLWV4Y2VwdGlvbnMiKSAjIEV4Y2VwdGlvbiBoYW5kbGluZyB0YWJsZSBnZW5lcmF0aW9uIGlzIGRpc2FibGVkLgorICAgICAgICBhcHBlbmRfY19hbmRfY3h4X2ZsYWdzKCIteCBjKysiKSAjIENvbXBpbGUgQyBmaWxlcyBhcyBDKysgZmlsZXMKKyAgICAgICAgaWYoJHtNSUN9KQorICAgICAgICAgICAgYXBwZW5kX2NfYW5kX2N4eF9mbGFncygiLW1taWMiKSAjIEJ1aWxkIEludGVsKFIpIE1JQyBBcmNoaXRlY3R1cmUgbmF0aXZlIGNvZGUKKyAgICAgICAgICAgIGFwcGVuZF9jX2FuZF9jeHhfZmxhZ3MoIi1mdGxzLW1vZGVsPWluaXRpYWwtZXhlYyIpICMgQ2hhbmdlcyB0aGUgdGhyZWFkIGxvY2FsIHN0b3JhZ2UgKFRMUykgbW9kZWwuIEdlbmVyYXRlcyBhIHJlc3RyaWN0aXZlLCBvcHRpbWl6ZWQgVExTIGNvZGUuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBUbyB1c2UgdGhpcyBzZXR0aW5nLCB0aGUgdGhyZWFkLWxvY2FsIHZhcmlhYmxlcyBhY2Nlc3NlZCBtdXN0IGJlIGRlZmluZWQgaW4gb25lIG9mIHRoZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbW9kdWxlcyBhdmFpbGFibGUgdG8gdGhlIHByb2dyYW0uCisgICAgICAgICAgICBhcHBlbmRfY19hbmRfY3h4X2ZsYWdzKCItb3B0LXN0cmVhbWluZy1zdG9yZXMgbmV2ZXIiKSAjIERpc2FibGVzIGdlbmVyYXRpb24gb2Ygc3RyZWFtaW5nIHN0b3JlcyBmb3Igb3B0aW1pemF0aW9uLgorICAgICAgICAgICAgYXBwZW5kX2NfYW5kX2N4eF9mbGFncygiLXNveCIpICMgVGVsbHMgdGhlIGNvbXBpbGVyIHRvIHNhdmUgdGhlIGNvbXBpbGF0aW9uIG9wdGlvbnMgYW5kIHZlcnNpb24gbnVtYmVyIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaW4gdGhlIGV4ZWN1dGFibGUgZmlsZS4gSXQgYWxzbyBsZXRzIHlvdSBjaG9vc2Ugd2hldGhlciB0byBpbmNsdWRlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbGlzdHMgb2YgY2VydGFpbiBmdW5jdGlvbnMuCisgICAgICAgIGVsc2VpZigke0xJTlVYfSkKKyAgICAgICAgICAgIGFwcGVuZF9jX2FuZF9jeHhfZmxhZ3MoIi1XZXJyb3IiKSAjIENoYW5nZXMgYWxsIHdhcm5pbmdzIHRvIGVycm9ycy4KKyAgICAgICAgICAgIGFwcGVuZF9jX2FuZF9jeHhfZmxhZ3MoIi1zb3giKSAKKyAgICAgICAgICAgIGlmKCR7SUEzMn0pCisgICAgICAgICAgICAgICAgYXBwZW5kX2NfYW5kX2N4eF9mbGFncygiLWZhbGlnbi1zdGFjaz1tYWludGFpbi0xNi1ieXRlIikgIyBUZWxscyB0aGUgY29tcGlsZXIgdGhlIHN0YWNrIGFsaWdubWVudCB0byB1c2Ugb24gZW50cnkgdG8gcm91dGluZXMuCisgICAgICAgICAgICAgICAgYXBwZW5kX2NfYW5kX2N4eF9mbGFncygiLW1pYTMyIikgICMgVGVsbHMgdGhlIGNvbXBpbGVyIHdoaWNoIGZlYXR1cmVzIGl0IG1heSB0YXJnZXQgKGlhMzIpCisgICAgICAgICAgICBlbmRpZigpCisgICAgICAgIGVuZGlmKCkKKyAgICBlbmRpZigpCisgICAgIyBDTWFrZSBwcmVmZXJzIHRoZSAvTUQgZmxhZ3Mgd2hlbiBjb21waWxpbmcgV2luZG93cyBzb3VyY2VzLCBidXQgbGliaW9tcDUgbmVlZHMgdG8gdXNlIC9NVCBpbnN0ZWFkCisgICAgIyBTbyB3ZSByZXBsYWNlIHRoZXNlIC9NRCBpbnN0YW5jZXMgd2l0aCAvTVQgd2l0aGluIHRoZSBDTUFLRV8qX0ZMQUdTIHZhcmlhYmxlcyBhbmQgcHV0IHRoYXQgb3V0IHRvIHRoZSBDQUNIRS4KKyAgICAjIHJlcGxhY2VfbWRfd2l0aF9tdCgpIGlzIGluIEhlbHBlckZ1bmN0aW9ucy5jbWFrZQorICAgIGlmKCR7V0lORE9XU30pCisgICAgICAgIHJlcGxhY2VfbWRfd2l0aF9tdChDTUFLRV9DX0ZMQUdTKQorICAgICAgICByZXBsYWNlX21kX3dpdGhfbXQoQ01BS0VfQ19GTEFHU19SRUxFQVNFKQorICAgICAgICByZXBsYWNlX21kX3dpdGhfbXQoQ01BS0VfQ19GTEFHU19SRUxXSVRIREVCSU5GTykKKyAgICAgICAgcmVwbGFjZV9tZF93aXRoX210KENNQUtFX0NfRkxBR1NfREVCVUcpCisgICAgICAgIHJlcGxhY2VfbWRfd2l0aF9tdChDTUFLRV9DWFhfRkxBR1MpCisgICAgICAgIHJlcGxhY2VfbWRfd2l0aF9tdChDTUFLRV9DWFhfRkxBR1NfUkVMRUFTRSkKKyAgICAgICAgcmVwbGFjZV9tZF93aXRoX210KENNQUtFX0NYWF9GTEFHU19SRUxXSVRIREVCSU5GTykKKyAgICAgICAgcmVwbGFjZV9tZF93aXRoX210KENNQUtFX0NYWF9GTEFHU19ERUJVRykKKyAgICBlbmRpZigpCisgICAgc2V0KCR7aW5wdXRfY19mbGFnc30gICAkeyR7aW5wdXRfY19mbGFnc319ICAgIiR7bG9jYWxfY19mbGFnc30iIFBBUkVOVF9TQ09QRSkKKyAgICBzZXQoJHtpbnB1dF9jeHhfZmxhZ3N9ICR7JHtpbnB1dF9jeHhfZmxhZ3N9fSAiJHtsb2NhbF9jeHhfZmxhZ3N9IiBQQVJFTlRfU0NPUEUpCitlbmRmdW5jdGlvbigpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBpY2MgTGlua2VyIGZsYWdzCitmdW5jdGlvbihhcHBlbmRfY29tcGlsZXJfc3BlY2lmaWNfbGlua2VyX2ZsYWdzIGlucHV0X2xkX2ZsYWdzIGlucHV0X2xkX2ZsYWdzX2xpYnMpCisgICAgc2V0KGxvY2FsX2xkX2ZsYWdzKQorICAgIHNldChsb2NhbF9sZF9mbGFnc19saWJzKQorICAgIGlmKCR7V0lORE9XU30pCisgICAgICAgICMgSGF2ZSBpY2MgdXNlIGxpbmsuZXhlIGRpcmVjdGx5IHdoZW4gV2luZG93cworICAgICAgICBzZXQoQ01BS0VfQ19DUkVBVEVfU0hBUkVEX0xJQlJBUlkgImxpbmsuZXhlIC9vdXQ6PFRBUkdFVD4gPExJTktfRkxBR1M+IDxPQkpFQ1RTPiA8TElOS19MSUJSQVJJRVM+IiBQQVJFTlRfU0NPUEUpCisgICAgICAgIHNldChDTUFLRV9TSEFSRURfTElOS0VSX0ZMQUdTICIkRU5We0xERkxBR1N9IiBDQUNIRSBTVFJJTkcgIkxpbmtlciBGbGFncyIgRk9SQ0UpCisgICAgICAgIGFwcGVuZF9saW5rZXJfZmxhZ3MoIi1ub2xvZ28iKSAjIFR1cm4gb2ZmIHRvb2wgYmFubmVyLgorICAgICAgICBhcHBlbmRfbGlua2VyX2ZsYWdzKCItZGxsIikgCisgICAgICAgIGFwcGVuZF9saW5rZXJfZmxhZ3MoIi1XWDpOTyIpCisgICAgICAgIGFwcGVuZF9saW5rZXJfZmxhZ3MoIi1pbmNyZW1lbnRhbDpubyIpCisgICAgICAgIGFwcGVuZF9saW5rZXJfZmxhZ3MoIi12ZXJzaW9uOiR7dmVyc2lvbn0uMCIpCisgICAgICAgIGFwcGVuZF9saW5rZXJfZmxhZ3MoIi1OWENvbXBhdCIpCisgICAgICAgIGFwcGVuZF9saW5rZXJfZmxhZ3MoIi1EeW5hbWljQmFzZSIpICMgVGhpcyBvcHRpb24gbW9kaWZpZXMgdGhlIGhlYWRlciBvZiBhbiBleGVjdXRhYmxlIHRvIGluZGljYXRlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHdoZXRoZXIgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBiZSByYW5kb21seSByZWJhc2VkIGF0IGxvYWQgdGltZS4KKyAgICAgICAgaWYoJHtJQTMyfSkKKyAgICAgICAgICAgIGFwcGVuZF9saW5rZXJfZmxhZ3MoIi1tYWNoaW5lOmkzODYiKQorICAgICAgICAgICAgYXBwZW5kX2xpbmtlcl9mbGFncygiLXNhZmVzZWgiKQorICAgICAgICBlbHNlaWYoJHtJTlRFTDY0fSkKKyAgICAgICAgICAgIGFwcGVuZF9saW5rZXJfZmxhZ3MoIi1tYWNoaW5lOmFtZDY0IikKKyAgICAgICAgZW5kaWYoKQorICAgICAgICBpZigke0RFQlVHX0JVSUxEfSBPUiAke1JFTFdJVEhERUJJTkZPX0JVSUxEfSkKKyAgICAgICAgICAgIGlmKE5PVCAiJHtwZGJfZmlsZX0iIFNUUkVRVUFMICIiKQorICAgICAgICAgICAgICAgIGFwcGVuZF9saW5rZXJfZmxhZ3MoIi1kZWJ1ZyIpCisgICAgICAgICAgICAgICAgYXBwZW5kX2xpbmtlcl9mbGFncygiLXBkYjoke3BkYl9maWxlfSIpCisgICAgICAgICAgICBlbmRpZigpCisgICAgICAgIGVsc2UoKQorICAgICAgICAgICAgaWYoTk9UICIke3BkYl9maWxlfSIgU1RSRVFVQUwgIiIpCisgICAgICAgICAgICAgICAgYXBwZW5kX2xpbmtlcl9mbGFncygiLWRlYnVnIikKKyAgICAgICAgICAgICAgICBhcHBlbmRfbGlua2VyX2ZsYWdzKCItcGRiOiR7cGRiX2ZpbGV9IikKKyAgICAgICAgICAgICAgICBhcHBlbmRfbGlua2VyX2ZsYWdzKCItcGRic3RyaXBwZWQ6JHtwZGJfZmlsZX0uc3RyaXBwZWQiKQorICAgICAgICAgICAgZW5kaWYoKQorICAgICAgICBlbmRpZigpCisgICAgICAgIGlmKE5PVCAiJHtpbXBfZmlsZX0iIFNUUkVRVUFMICIiKQorICAgICAgICAgICAgYXBwZW5kX2xpbmtlcl9mbGFncygiLWltcGxpYjoke2xpYl9maWxlfSR7bGlifSIpCisgICAgICAgIGVuZGlmKCkKKyAgICAgICAgaWYoTk9UICIke2RlZl9maWxlfSIgU1RSRVFVQUwgIiIpCisgICAgICAgICAgICBhcHBlbmRfbGlua2VyX2ZsYWdzKCItZGVmOiR7ZGVmX2ZpbGV9IikKKyAgICAgICAgZW5kaWYoKQorICAgIGVsc2VpZigke01BQ30pCisgICAgICAgIGFwcGVuZF9saW5rZXJfZmxhZ3MoIi1uby1pbnRlbC1leHRlbnNpb25zIikKKyAgICAgICAgaWYoTk9UICR7U1RVQlNfTElCUkFSWX0pCisgICAgICAgICAgICBhcHBlbmRfbGlua2VyX2ZsYWdzX2xpYnJhcnkoIi1wdGhyZWFkIikgIyBsaW5rIGluIHB0aHJlYWQgbGlicmFyeQorICAgICAgICAgICAgYXBwZW5kX2xpbmtlcl9mbGFnc19saWJyYXJ5KCItbGRsIikgIyBsaW5rIGluIGxpYmRsIChkeW5hbWljIGxvYWRlciBsaWJyYXJ5KQorICAgICAgICBlbmRpZigpCisgICAgICAgIGlmKCR7U1RBVFNfR0FUSEVSSU5HfSkKKyAgICAgICAgICAgIGFwcGVuZF9saW5rZXJfZmxhZ3NfbGlicmFyeSgiLVdsLC1sc3RkYysrIikgIyBsaW5rIGluIHN0YW5kYXJkIGMrKyBsaWJyYXJ5IChzdGF0cy1nYXRoZXJpbmcgbmVlZHMgaXQpCisgICAgICAgIGVuZGlmKCkKKyAgICBlbHNlaWYoJHtNSUN9KQorICAgICAgICBhcHBlbmRfbGlua2VyX2ZsYWdzKCItbW1pYyIpICMgZW5hYmxlIE1JQyBsaW5raW5nCisgICAgICAgIGFwcGVuZF9saW5rZXJfZmxhZ3MoIi1zdGF0aWMtaW50ZWwiKSAjIENhdXNlcyBJbnRlbC1wcm92aWRlZCBsaWJyYXJpZXMgdG8gYmUgbGlua2VkIGluIHN0YXRpY2FsbHkuIAorICAgICAgICBhcHBlbmRfbGlua2VyX2ZsYWdzKCItbm8taW50ZWwtZXh0ZW5zaW9ucyIpICMgRW5hYmxlcyBvciBkaXNhYmxlcyBhbGwgSW50ZWwgQyBhbmQgSW50ZWwgQysrIGxhbmd1YWdlIGV4dGVuc2lvbnMuCisgICAgZWxzZSgpCisgICAgICAgIGFwcGVuZF9saW5rZXJfZmxhZ3MoIi1zdGF0aWMtaW50ZWwiKSAjIENhdXNlcyBJbnRlbC1wcm92aWRlZCBsaWJyYXJpZXMgdG8gYmUgbGlua2VkIGluIHN0YXRpY2FsbHkuCisgICAgICAgIGFwcGVuZF9saW5rZXJfZmxhZ3MoIi1XZXJyb3IiKSAjIFdhcm5pbmdzIGJlY29tZSBlcnJvcnMKKyAgICAgICAgaWYoJHtJQTMyfSkKKyAgICAgICAgICAgIGFwcGVuZF9saW5rZXJfZmxhZ3NfbGlicmFyeSgiLWxpcmNfcGljIikgIyBsaW5rIGluIGxpYmlyY19waWMKKyAgICAgICAgZW5kaWYoKQorICAgIGVuZGlmKCkKKworICAgIHNldCgke2lucHV0X2xkX2ZsYWdzfSAgICAgICR7JHtpbnB1dF9sZF9mbGFnc319ICAgICAgIiR7bG9jYWxfbGRfZmxhZ3N9IiAgICAgICBQQVJFTlRfU0NPUEUpCisgICAgc2V0KCR7aW5wdXRfbGRfZmxhZ3NfbGlic30gJHske2lucHV0X2xkX2ZsYWdzX2xpYnN9fSAiJHtsb2NhbF9sZF9mbGFnc19saWJzfSIgIFBBUkVOVF9TQ09QRSkKK2VuZGZ1bmN0aW9uKCkKKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9jbWFrZS9JbnRlbC9Gb3J0cmFuRmxhZ3MuY21ha2UgYi9maW5hbC9ydW50aW1lL2NtYWtlL0ludGVsL0ZvcnRyYW5GbGFncy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmIxNjU2Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9jbWFrZS9JbnRlbC9Gb3J0cmFuRmxhZ3MuY21ha2UKQEAgLTAsMCArMSw0OCBAQAorIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworCisjIFRoaXMgZmlsZSBob2xkcyBJbnRlbChSKSBDIENvbXBpbGVyIC8gSW50ZWwoUikgQysrIENvbXBpbGVyIC8gSW50ZWwoUikgRm9ydHJhbiBDb21waWxlciAoaWNjL2ljcGMvaWNsLmV4ZS9pZm9ydCkgZGVwZW5kZW50IGZsYWdzCisjIFRoZSBmbGFnIHR5cGVzIGFyZToKKyMgICAxKSBGb3J0cmFuIENvbXBpbGVyIGZsYWdzCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBpY2MgRm9ydHJhbiBDb21waWxlciBmbGFncyAoZm9yIGNyZWF0aW5nIC5tb2QgZmlsZXMpCitmdW5jdGlvbihhcHBlbmRfZm9ydHJhbl9jb21waWxlcl9zcGVjaWZpY19mb3J0X2ZsYWdzIGlucHV0X2ZvcnRfZmxhZ3MpCisgICAgc2V0KGxvY2FsX2ZvcnRfZmxhZ3MpCisgICAgI3NldChDTUFLRV9Gb3J0cmFuX0ZMQUdTICAgICAgIiRFTlZ7RkZMQUdTfSIgICBDQUNIRSBTVFJJTkcgIkZvcnRyYW4gZmxhZ3MiICBGT1JDRSkKKyAgICAjc2V0KENNQUtFX0ZvcnRyYW5fRkxBR1NfUkVMRUFTRSAgICAgICAgICAiIiAgIENBQ0hFIFNUUklORyAiRm9ydHJhbiBmbGFncyIgIEZPUkNFKQorICAgICNzZXQoQ01BS0VfRm9ydHJhbl9GTEFHU19ERUJVRyAgICAgICAgICAgICIiICAgQ0FDSEUgU1RSSU5HICJGb3J0cmFuIGZsYWdzIiAgRk9SQ0UpCisgICAgI3NldChDTUFLRV9Gb3J0cmFuX0ZMQUdTX1JFTFdJVEhERUJJTkZPICAgIiIgICBDQUNIRSBTVFJJTkcgIkZvcnRyYW4gZmxhZ3MiICBGT1JDRSkKKyAgICBpZigke1dJTkRPV1N9KQorICAgICAgICBhcHBlbmRfZm9ydF9mbGFncygiLVFkaWFnLWRpc2FibGU6MTc3LDUwODIiKQorICAgICAgICBhcHBlbmRfZm9ydF9mbGFncygiLVFzb3giKQorICAgICAgICBhcHBlbmRfZm9ydF9mbGFncygiLW5vbG9nbyIpCisgICAgICAgIGFwcGVuZF9mb3J0X2ZsYWdzKCItR1MiKQorICAgICAgICBhcHBlbmRfZm9ydF9mbGFncygiLUR5bmFtaWNCYXNlIikKKyAgICAgICAgYXBwZW5kX2ZvcnRfZmxhZ3MoIi1aaSIpCisgICAgICAgICMgT24gTGludXggYW5kIFdpbmRvd3MgSW50ZWwoUikgNjQgYXJjaGl0ZWN0dXJlIHdlIG5lZWQgb2ZmbG9hZCBhdHRyaWJ1dGUKKyAgICAgICAgIyBmb3IgYWxsIEZvcnRyYW4gZW50cmllcyBpbiBvcmRlciB0byBzdXBwb3J0IE9wZW5NUCBmdW5jdGlvbiBjYWxscyBpbnNpZGUgZGV2aWNlIGNvbnRydWN0cworICAgICAgICBpZigke0lOVEVMNjR9KQorICAgICAgICAgICAgYXBwZW5kX2ZvcnRfZmxhZ3MoIi9Rb2ZmbG9hZC1hdHRyaWJ1dGUtdGFyZ2V0Om1pYyIpCisgICAgICAgIGVuZGlmKCkKKyAgICBlbHNlKCkKKyAgICAgICAgaWYoJHtNSUN9KQorICAgICAgICAgICAgYXBwZW5kX2ZvcnRfZmxhZ3MoIi1tbWljIikKKyAgICAgICAgZW5kaWYoKQorICAgICAgICBpZihOT1QgJHtNQUN9KQorICAgICAgICAgICAgYXBwZW5kX2ZvcnRfZmxhZ3MoIi1zb3giKQorICAgICAgICAgICAgaWYoJHtJTlRFTDY0fSBBTkQgJHtMSU5VWH0pCisgICAgICAgICAgICAgICAgYXBwZW5kX2ZvcnRfZmxhZ3MoIi1vZmZsb2FkLWF0dHJpYnV0ZS10YXJnZXQ9bWljIikKKyAgICAgICAgICAgIGVuZGlmKCkKKyAgICAgICAgZW5kaWYoKQorICAgIGVuZGlmKCkKKyAgICBzZXQoJHtpbnB1dF9mb3J0X2ZsYWdzfSAkeyR7aW5wdXRfZm9ydF9mbGFnc319ICIke2xvY2FsX2ZvcnRfZmxhZ3N9IiBQQVJFTlRfU0NPUEUpCitlbmRmdW5jdGlvbigpCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL2NtYWtlL01TVkMvQXNtRmxhZ3MuY21ha2UgYi9maW5hbC9ydW50aW1lL2NtYWtlL01TVkMvQXNtRmxhZ3MuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg1NzYyZAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvY21ha2UvTVNWQy9Bc21GbGFncy5jbWFrZQpAQCAtMCwwICsxLDM3IEBACisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKKyMgVGhpcyBmaWxlIGhvbGRzIE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIGRlcGVuZGVudCBmbGFncworIyBUaGUgZmxhZyB0eXBlcyBhcmU6CisjICAgMSkgQXNzZW1ibHkgZmxhZ3MKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEFzc2VtYmx5IGZsYWdzCitmdW5jdGlvbihhcHBlbmRfYXNzZW1ibGVyX3NwZWNpZmljX2FzbV9mbGFncyBpbnB1dF9hc21fZmxhZ3MpCisgICAgc2V0KGxvY2FsX2FzbV9mbGFncykKKyAgICBhcHBlbmRfYXNtX2ZsYWdzKCItbm9sb2dvIikgIyBUdXJuIG9mZiB0b29sIGJhbm5lci4KKyAgICBpZigke0lBMzJ9KQorICAgICAgICBhcHBlbmRfYXNtX2ZsYWdzKCItc2FmZXNlaCIpICMgUmVnaXN0ZXJzIGV4Y2VwdGlvbiBoYW5kbGVycyBmb3Igc2FmZSBleGNlcHRpb24gaGFuZGxpbmcuCisgICAgICAgIGFwcGVuZF9hc21fZmxhZ3MoIi1jb2ZmIikgIyBHZW5lcmF0ZXMgY29tbW9uIG9iamVjdCBmaWxlIGZvcm1hdCAoQ09GRikgdHlwZSBvZiBvYmplY3QgbW9kdWxlLiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIEdlbmVyYWxseSByZXF1aXJlZCBmb3IgV2luMzIgYXNzZW1ibHkgbGFuZ3VhZ2UgZGV2ZWxvcG1lbnQuCisgICAgICAgIGFwcGVuZF9hc21fZmxhZ3MoIi1EIF9NX0lBMzIiKQorICAgIGVsc2VpZigke0lOVEVMNjR9KQorICAgICAgICBhcHBlbmRfYXNtX2ZsYWdzKCItRCBfTV9BTUQ2NCIpCisgICAgZW5kaWYoKQorICAgICMgQ01ha2UgcHJlZmVycyB0aGUgL01EIGZsYWdzIHdoZW4gY29tcGlsaW5nIFdpbmRvd3Mgc291cmNlcywgYnV0IGxpYmlvbXA1IG5lZWRzIHRvIHVzZSAvTVQgaW5zdGVhZAorICAgICMgU28gd2UgcmVwbGFjZSB0aGVzZSAvTUQgaW5zdGFuY2VzIHdpdGggL01UIHdpdGhpbiB0aGUgQ01BS0VfKl9GTEFHUyB2YXJpYWJsZXMgYW5kIHB1dCB0aGF0IG91dCB0byB0aGUgQ0FDSEUuCisgICAgIyByZXBsYWNlX21kX3dpdGhfbXQoKSBpcyBpbiBIZWxwZXJGdW5jdGlvbnMuY21ha2UKKyAgICByZXBsYWNlX21kX3dpdGhfbXQoQ01BS0VfQVNNX01BU01fRkxBR1MpCisgICAgcmVwbGFjZV9tZF93aXRoX210KENNQUtFX0FTTV9NQVNNX0ZMQUdTX1JFTEVBU0UpCisgICAgcmVwbGFjZV9tZF93aXRoX210KENNQUtFX0FTTV9NQVNNX0ZMQUdTX1JFTFdJVEhERUJJTkZPKQorICAgIHJlcGxhY2VfbWRfd2l0aF9tdChDTUFLRV9BU01fTUFTTV9GTEFHU19ERUJVRykKKyAgICBzZXQoJHtpbnB1dF9hc21fZmxhZ3N9ICR7JHtpbnB1dF9hc21fZmxhZ3N9fSAiJHtsb2NhbF9hc21fZmxhZ3N9IiBQQVJFTlRfU0NPUEUpCitlbmRmdW5jdGlvbigpCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL2NtYWtlL01TVkMvQ0ZsYWdzLmNtYWtlIGIvZmluYWwvcnVudGltZS9jbWFrZS9NU1ZDL0NGbGFncy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjE3Y2ViCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9jbWFrZS9NU1ZDL0NGbGFncy5jbWFrZQpAQCAtMCwwICsxLDc1IEBACisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKKyMgVGhpcyBmaWxlIGhvbGRzIE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIGRlcGVuZGVudCBmbGFncworIyBUaGUgZmxhZyB0eXBlcyBhcmU6CisjICAgMSkgQy9DKysgQ29tcGlsZXIgZmxhZ3MKKyMgICAyKSBGb3J0cmFuIENvbXBpbGVyIGZsYWdzCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBWaXN1YWwgU3R1ZGlvIEMvQysrIENvbXBpbGVyIGZsYWdzCitmdW5jdGlvbihhcHBlbmRfY29tcGlsZXJfc3BlY2lmaWNfY19hbmRfY3h4X2ZsYWdzIGlucHV0X2NfZmxhZ3MgaW5wdXRfY3h4X2ZsYWdzKQorICAgIHNldChsb2NhbF9jX2ZsYWdzKQorICAgIHNldChsb2NhbF9jeHhfZmxhZ3MpCisgICAgYXBwZW5kX2NfZmxhZ3MoIi1UUCIpICMgVGVsbHMgdGhlIGNvbXBpbGVyIHRvIHByb2Nlc3MgYSBmaWxlIGFzIGEgQysrIHNvdXJjZSBmaWxlLgorICAgIGFwcGVuZF9jeHhfZmxhZ3MoIi1FSHNjIikgIyBFbmFibGUgQysrIGV4Y2VwdGlvbiBoYW5kbGluZy4KKyAgICBhcHBlbmRfY19hbmRfY3h4X2ZsYWdzKCItVzMiKSAjIEVuYWJsZXMgZGlhZ25vc3RpY3MgZm9yIHJlbWFya3MsIHdhcm5pbmdzLCBhbmQgZXJyb3JzLiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIEFkZGl0aW9uYWwgd2FybmluZ3MgYXJlIGFsc28gZW5hYmxlZCBhYm92ZSBsZXZlbCAyIHdhcm5pbmdzLgorICAgIGFwcGVuZF9jX2FuZF9jeHhfZmxhZ3MoIi1HUyIpICMgTGV0cyB5b3UgY29udHJvbCB0aGUgdGhyZXNob2xkIGF0IHdoaWNoIHRoZSBzdGFjayBjaGVja2luZyByb3V0aW5lIGlzIGNhbGxlZCBvciBub3QgY2FsbGVkLgorICAgIGlmKCR7SUEzMn0pCisgICAgICAgIGFwcGVuZF9jX2FuZF9jeHhfZmxhZ3MoIi1hcmNoOmlhMzIiKSAjIFRlbGxzIHRoZSBjb21waWxlciB3aGljaCBmZWF0dXJlcyBpdCBtYXkgdGFyZ2V0IChpYTMyKQorICAgICAgICBhcHBlbmRfY19hbmRfY3h4X2ZsYWdzKCItT3ktIikgIyBlcXVpdmFsZW50IHRvIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyCisgICAgZW5kaWYoKQorICAgICMgQ01ha2UgcHJlZmVycyB0aGUgL01EIGZsYWdzIHdoZW4gY29tcGlsaW5nIFdpbmRvd3Mgc291cmNlcywgYnV0IGxpYmlvbXA1IG5lZWRzIHRvIHVzZSAvTVQgaW5zdGVhZAorICAgICMgU28gd2UgcmVwbGFjZSB0aGVzZSAvTUQgaW5zdGFuY2VzIHdpdGggL01UIHdpdGhpbiB0aGUgQ01BS0VfKl9GTEFHUyB2YXJpYWJsZXMgYW5kIHB1dCB0aGF0IG91dCB0byB0aGUgQ0FDSEUuCisgICAgIyByZXBsYWNlX21kX3dpdGhfbXQoKSBpcyBpbiBIZWxwZXJGdW5jdGlvbnMuY21ha2UKKyAgICByZXBsYWNlX21kX3dpdGhfbXQoQ01BS0VfQ19GTEFHUykKKyAgICByZXBsYWNlX21kX3dpdGhfbXQoQ01BS0VfQ19GTEFHU19SRUxFQVNFKQorICAgIHJlcGxhY2VfbWRfd2l0aF9tdChDTUFLRV9DX0ZMQUdTX1JFTFdJVEhERUJJTkZPKQorICAgIHJlcGxhY2VfbWRfd2l0aF9tdChDTUFLRV9DX0ZMQUdTX0RFQlVHKQorICAgIHJlcGxhY2VfbWRfd2l0aF9tdChDTUFLRV9DWFhfRkxBR1MpCisgICAgcmVwbGFjZV9tZF93aXRoX210KENNQUtFX0NYWF9GTEFHU19SRUxFQVNFKQorICAgIHJlcGxhY2VfbWRfd2l0aF9tdChDTUFLRV9DWFhfRkxBR1NfUkVMV0lUSERFQklORk8pCisgICAgcmVwbGFjZV9tZF93aXRoX210KENNQUtFX0NYWF9GTEFHU19ERUJVRykKKyAgICByZXBsYWNlX21kX3dpdGhfbXQoQ01BS0VfQVNNX01BU01fRkxBR1MpCisgICAgcmVwbGFjZV9tZF93aXRoX210KENNQUtFX0FTTV9NQVNNX0ZMQUdTX1JFTEVBU0UpCisgICAgcmVwbGFjZV9tZF93aXRoX210KENNQUtFX0FTTV9NQVNNX0ZMQUdTX1JFTFdJVEhERUJJTkZPKQorICAgIHJlcGxhY2VfbWRfd2l0aF9tdChDTUFLRV9BU01fTUFTTV9GTEFHU19ERUJVRykKKyAgICBzZXQoJHtpbnB1dF9jX2ZsYWdzfSAgICR7JHtpbnB1dF9jX2ZsYWdzfX0gICAiJHtsb2NhbF9jX2ZsYWdzfSIgUEFSRU5UX1NDT1BFKQorICAgIHNldCgke2lucHV0X2N4eF9mbGFnc30gJHske2lucHV0X2N4eF9mbGFnc319ICIke2xvY2FsX2N4eF9mbGFnc30iIFBBUkVOVF9TQ09QRSkKK2VuZGZ1bmN0aW9uKCkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFZpc3VhbCBTdHVkaW8gTGlua2VyIGZsYWdzCitmdW5jdGlvbihhcHBlbmRfY29tcGlsZXJfc3BlY2lmaWNfbGlua2VyX2ZsYWdzIGlucHV0X2xkX2ZsYWdzIGlucHV0X2xkX2ZsYWdzX2xpYnMpCisgICAgc2V0KGxvY2FsX2xkX2ZsYWdzKQorICAgIHNldChsb2NhbF9sZF9mbGFnc19saWJzKQorICAgIGFwcGVuZF9saW5rZXJfZmxhZ3MoIi1XWDpOTyIpCisgICAgYXBwZW5kX2xpbmtlcl9mbGFncygiLXZlcnNpb246JHt2ZXJzaW9ufS4wIikKKyAgICBhcHBlbmRfbGlua2VyX2ZsYWdzKCItTlhDb21wYXQiKQorICAgIGFwcGVuZF9saW5rZXJfZmxhZ3MoIi1EeW5hbWljQmFzZSIpICMgVGhpcyBvcHRpb24gbW9kaWZpZXMgdGhlIGhlYWRlciBvZiBhbiBleGVjdXRhYmxlIHRvIGluZGljYXRlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgd2hldGhlciB0aGUgYXBwbGljYXRpb24gc2hvdWxkIGJlIHJhbmRvbWx5IHJlYmFzZWQgYXQgbG9hZCB0aW1lLgorICAgIGlmKCR7SUEzMn0pCisgICAgICAgIGFwcGVuZF9saW5rZXJfZmxhZ3MoIi1tYWNoaW5lOmkzODYiKQorICAgICAgICBhcHBlbmRfbGlua2VyX2ZsYWdzKCItc2FmZXNlaCIpCisgICAgZWxzZWlmKCR7SU5URUw2NH0pCisgICAgICAgIGFwcGVuZF9saW5rZXJfZmxhZ3MoIi1tYWNoaW5lOmFtZDY0IikKKyAgICBlbmRpZigpCisgICAgaWYoTk9UICIke2RlZl9maWxlfSIgU1RSRVFVQUwgIiIpCisgICAgICAgIGFwcGVuZF9saW5rZXJfZmxhZ3MoIi1kZWY6JHtkZWZfZmlsZX0iKQorICAgIGVuZGlmKCkKKyAgICAjIEhhdmUgVmlzdWFsIFN0dWRpbyB1c2UgbGluay5leGUgZGlyZWN0bHkKKyAgICAjc2V0KENNQUtFX0NfQ1JFQVRFX1NIQVJFRF9MSUJSQVJZICJsaW5rLmV4ZSAvb3V0OjxUQVJHRVQ+IDxMSU5LX0ZMQUdTPiA8T0JKRUNUUz4gPExJTktfTElCUkFSSUVTPiIgUEFSRU5UX1NDT1BFKQorICAgICNzZXQoQ01BS0VfU0hBUkVEX0xJTktFUl9GTEFHUyAiJEVOVntMRExGQUdTfSIgQ0FDSEUgU1RSSU5HICJMaW5rZXIgRmxhZ3MiIEZPUkNFKQorICAgIHNldCgke2lucHV0X2xkX2ZsYWdzfSAgICAgICR7JHtpbnB1dF9sZF9mbGFnc319ICAgICAgIiR7bG9jYWxfbGRfZmxhZ3N9IiAgICAgICBQQVJFTlRfU0NPUEUpCisgICAgc2V0KCR7aW5wdXRfbGRfZmxhZ3NfbGlic30gJHske2lucHV0X2xkX2ZsYWdzX2xpYnN9fSAiJHtsb2NhbF9sZF9mbGFnc19saWJzfSIgIFBBUkVOVF9TQ09QRSkKK2VuZGZ1bmN0aW9uKCkKKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9jbWFrZS9NaWNyb1Rlc3RzLmNtYWtlIGIvZmluYWwvcnVudGltZS9jbWFrZS9NaWNyb1Rlc3RzLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmZmM0ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL2NtYWtlL01pY3JvVGVzdHMuY21ha2UKQEAgLTAsMCArMSwyODcgQEAKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIE1JQ1JPIFRFU1RTCisjIFRoZSBmb2xsb3dpbmcgbWljcm8tdGVzdHMgYXJlIHNtYWxsIHRlc3RzIHRvIHBlcmZvcm0gb24gCisjIHRoZSBsaWJyYXJ5IGp1c3QgY3JlYXRlZCBpbiAke2J1aWxkX2Rpcn0vLCB0aGVyZSBhcmUgY3VycmVudGx5CisjIGZpdmUgbWljcm8tdGVzdHM6IAorIyAoMSkgdGVzdC10b3VjaCAKKyMgICAgLSBDb21waWxlIGFuZCBydW4gYSBzbWFsbCBwcm9ncmFtIHVzaW5nIG5ld2x5IGNyZWF0ZWQgbGliaW9tcDUgbGlicmFyeQorIyAgICAtIEZhaWxzIGlmIHRlc3QtdG91Y2guYyBkb2VzIG5vdCBjb21waWxlIG9yIGlmIHRlc3QtdG91Y2guYyBkb2VzIG5vdCBydW4gYWZ0ZXIgY29tcGlsYXRpb24KKyMgICAgLSBQcm9ncmFtIGRlcGVuZGVuY2llczogZ2NjIG9yIGcrKywgZ3JlcCwgYm91cm5lIHNoZWxsCisjICAgIC0gQXZhaWxhYmxlIGZvciBhbGwgTGludXgsTWFjLFdpbmRvd3MgYnVpbGRzLiAgTm90IGF2YWlsYmxlIG9uIEludGVsKFIpIE1JQyBBcmNoaXRlY3R1cmUgYnVpbGRzLgorIyAoMikgdGVzdC1yZWxvCisjICAgIC0gVGVzdHMgZHluYW1pYyBsaWJyYXJpZXMgZm9yIHBvc2l0aW9uLWRlcGVuZGVudCBjb2RlIChjYW4gbm90IGhhdmUgYW55IHBvc2l0aW9uIGRlcGVuZGVudCBjb2RlKQorIyAgICAtIEZhaWxzIGlmIFRFWFRSRUwgaXMgaW4gb3V0cHV0IG9mIHJlYWRlbGYgLWQgbGliaW9tcDUuc28gY29tbWFuZAorIyAgICAtIFByb2dyYW0gZGVwZW5kZW5jaWVzOiByZWFkZWxmLCBncmVwLCBib3VybmUgc2hlbGwKKyMgICAgLSBBdmFpbGFibGUgZm9yIExpbnV4LCBJbnRlbChSKSBNSUMgQXJjaGl0ZWN0dXJlIGR5bmFtaWMgbGlicmFyeSBidWlsZHMuIE5vdCBhdmFpbGFibGUgb3RoZXJ3aXNlLgorIyAoMykgdGVzdC1leGVjc3RhY2sgCisjICAgIC0gVGVzdHMgaWYgc3RhY2sgaXMgZXhlY3V0YWJsZQorIyAgICAtIEZhaWxzIGlmIHN0YWNrIGlzIGV4ZWN1dGFibGUuIFNob3VsZCBvbmx5IGJlIHJlYWRhYmxlIGFuZCB3cml0YWJsZS4gTm90IGV4ZWN0dWFibGUuCisjICAgIC0gUHJvZ3JhbSBkZXBlbmRlbmNpZXM6IHBlcmwsIHJlYWRlbGYKKyMgICAgLSBBdmFpbGFibGUgZm9yIExpbnV4IGR5bmFtaWMgbGlicmFyeSBidWlsZHMuIE5vdCBhdmFpbGFibGUgb3RoZXJ3aXNlLgorIyAoNCkgdGVzdC1pbnN0ciAoSW50ZWwoUikgTUlDIEFyY2hpdGVjdXRyZSBvbmx5KSAKKyMgICAgLSBUZXN0cyBJbnRlbChSKSBNSUMgQXJjaGl0ZWN0dXJlIGxpYnJhcmllcyBmb3IgdmFsaWQgaW5zdHJ1Y3Rpb24gc2V0CisjICAgIC0gRmFpbHMgaWYgZmluZHMgaW52YWxpZCBpbnN0cnVjdGlvbiBmb3IgSW50ZWwoUikgTUlDIEFyY2hpdGVjdHVyZSAod2Fzbid0IGNvbXBpbGVkIHdpdGggY29ycmVjdCBmbGFncykKKyMgICAgLSBQcm9ncmFtIGRlcGVuZGVuY2llczogcGVybCwgb2JqZHVtcCAKKyMgICAgLSBBdmFpbGFibGUgZm9yIEludGVsKFIpIE1JQyBBcmNoaXRlY3R1cmUgYnVpbGRzLiBOb3QgYXZhaWxhYmxlIG90aGVyd2lzZS4KKyMgKDUpIHRlc3QtZGVwcyAgICAgIAorIyAgICAtIFRlc3RzIG5ld2x5IGNyZWF0ZWQgbGliaW9tcDUgZm9yIGxpYnJhcnkgZGVwZW5kZW5jaWVzCisjICAgIC0gRmFpbHMgaWYgc2VlcyBhIGRlcGVuZGVuY2Ugbm90IGxpc3RlZCBpbiB0ZF9leHAgdmFyaWFibGUgYmVsb3cKKyMgICAgLSBQcm9ncmFtIGRlcGVuZGVuY2llczogcGVybCwgKGxpbnV4KXJlYWRlbGYsIChtYWMpb3Rvb2xbNjRdLCAod2luZG93cylsaW5rLmV4ZQorIyAgICAtIEF2YWlsYWJsZSBmb3IgTGludXgsTWFjLFdpbmRvd3MsIEludGVsKFIpIE1JQyBBcmNoaXRlY3R1cmUgZHluYW1pYyBidWlsZHMgYW5kIFdpbmRvd3Mgc3RhdGljIGJ1aWxkcy4gTm90IGF2YWlsYWJsZSBvdGhlcndpc2UuCisjCisjIEFsbCB0ZXN0cyBjYW4gYmUgdHVybmVkIG9mZiBieSBpbmNsdWRpbmcgLUR0ZXN0cz1vZmYgd2hlbiBjYWxsaW5nIGNtYWtlCisjIEFuIGluZGl2aWR1YWwgdGVzdCBjYW4gYmUgdHVybmVkIG9mZiBieSBpc3N1aW5nIHNvbWV0aGluZyBsaWtlIC1EdGVzdF90b3VjaD1vZmYgd2hlbiBjYWxsaW5nIGNtYWtlCisKKyMgdGVzdC10b3VjaAoraWYoTk9UICR7TUlDfSBBTkQgJHt0ZXN0X3RvdWNofSBBTkQgJHt0ZXN0c30pCisgICAgaWYoJHtXSU5ET1dTfSkKKyAgICAgICAgc2V0KGRvX3Rlc3RfdG91Y2hfbXQgVFJVRSkKKyAgICAgICAgaWYoJHtkb190ZXN0X3RvdWNoX210fSkKKyAgICAgICAgICAgIHNldCh0ZXN0X3RvdWNoX2l0ZW1zICR7dGVzdF90b3VjaF9pdGVtc30gdGVzdC10b3VjaC1tZCB0ZXN0LXRvdWNoLW10KQorICAgICAgICBlbHNlKCkKKyAgICAgICAgICAgIHNldCh0ZXN0X3RvdWNoX2l0ZW1zICR7dGVzdF90b3VjaF9pdGVtc30gdGVzdC10b3VjaC1tZCkKKyAgICAgICAgZW5kaWYoKQorICAgIGVsc2UoKQorICAgICAgICBzZXQodGVzdF90b3VjaF9pdGVtcyAke3Rlc3RfdG91Y2hfaXRlbXN9IHRlc3QtdG91Y2gtcnQpCisgICAgZW5kaWYoKQorICAgIHNldChyZWd1bGFyX3Rlc3RfdG91Y2hfaXRlbXMgIiR7dGVzdF90b3VjaF9pdGVtc30iKQorICAgIGFkZF9zdWZmaXgoIi8uc3VjY2VzcyIgIHJlZ3VsYXJfdGVzdF90b3VjaF9pdGVtcykKKyAgICAjIHRlc3QtdG91Y2ggOiAke3Rlc3RfdG91Y2hfaXRlbXN9Ly5zdWNjZXNzCisgICAgc2V0KGxkZXBzICIke3JlZ3VsYXJfdGVzdF90b3VjaF9pdGVtc30iKQorICAgIGFkZF9jdXN0b21fdGFyZ2V0KCB0ZXN0LXRvdWNoIERFUEVORFMgJHtsZGVwc30pCisKKyAgICBpZigke1dJTkRPV1N9KQorICAgICAgICAjIHBpY2sgdGVzdC10b3VjaCBjb21waWxlcgorICAgICAgICBzZXQodHQtYyBjbCkKKyAgICAgICAgIyB0ZXN0LXRvdWNoIGNvbXBpbGF0aW9uIGZsYWdzCisgICAgICAgIGxpc3QoQVBQRU5EIHR0LWMtZmxhZ3MgLW5vbG9nbykKKyAgICAgICAgaWYoJHtSRUxFQVNFX0JVSUxEfSBPUiAke1JFTFdJVEhERUJJTkZPX0JVSUxEfSkKKyAgICAgICAgICAgIGxpc3QoQVBQRU5EIHR0LWMtZmxhZ3MtbXQgLU1UKQorICAgICAgICAgICAgbGlzdChBUFBFTkQgdHQtYy1mbGFncy1tZCAtTUQpCisgICAgICAgIGVsc2UoKQorICAgICAgICAgICAgbGlzdChBUFBFTkQgdHQtYy1mbGFncy1tdCAtTVRkKQorICAgICAgICAgICAgbGlzdChBUFBFTkQgdHQtYy1mbGFncy1tZCAtTURkKQorICAgICAgICBlbmRpZigpCisgICAgICAgIGxpc3QoQVBQRU5EIHR0LWxpYnMgJHtidWlsZF9kaXJ9LyR7aW1wX2ZpbGV9KQorICAgICAgICBsaXN0KEFQUEVORCB0dC1sZC1mbGFncyAtbGluayAtbm9kZWZhdWx0bGliOm9sZG5hbWVzKQorICAgICAgICBpZigke0lBMzJ9KQorICAgICAgICAgICAgbGlzdChBUFBFTkQgdHQtbGQtZmxhZ3MgLXNhZmVzZWgpCisgICAgICAgIGVuZGlmKCkKKyAgICAgICAgbGlzdChBUFBFTkQgdHQtbGQtZmxhZ3MtdiAtdmVyYm9zZSkKKyAgICBlbHNlKCkgIyAoVW5peCBiYXNlZCBzeXN0ZW1zLCBJbnRlbChSKSBNSUMgQXJjaGl0ZWN0dXJlLCBhbmQgTWFjKQorICAgICAgICAjIHBpY2sgdGVzdC10b3VjaCBjb21waWxlcgorICAgICAgICBpZigke1NURF9DUFBfTElCfSkKKyAgICAgICAgICAgIHNldCh0dC1jICR7Q01BS0VfQ1hYX0NPTVBJTEVSfSkKKyAgICAgICAgZWxzZSgpCisgICAgICAgICAgICBzZXQodHQtYyAke0NNQUtFX0NfQ09NUElMRVJ9KQorICAgICAgICBlbmRpZigpCisgICAgICAgICMgdGVzdC10b3VjaCBjb21waWxhdGlvbiBmbGFncworICAgICAgICBpZigke0xJTlVYfSkKKyAgICAgICAgICAgIGxpc3QoQVBQRU5EIHR0LWMtZmxhZ3MgLXB0aHJlYWQpCisgICAgICAgIGVuZGlmKCkKKyAgICAgICAgaWYoJHtJQTMyfSkKKyAgICAgICAgICAgIGxpc3QoQVBQRU5EIHR0LWMtZmxhZ3MgLW0zMikKKyAgICAgICAgZWxzZWlmKCR7SU5URUw2NH0pCisgICAgICAgICAgICBsaXN0KEFQUEVORCB0dC1jLWZsYWdzIC1tNjQpCisgICAgICAgIGVuZGlmKCkKKyAgICAgICAgbGlzdChBUFBFTkQgdHQtbGlicyAke2J1aWxkX2Rpcn0vJHtsaWJfZmlsZX0pCisgICAgICAgIGlmKCR7TUFDfSkKKyAgICAgICAgICAgIGxpc3QoQVBQRU5EIHR0LWxkLWZsYWdzLXYgLVdsLC10KQorICAgICAgICAgICAgc2V0KHR0LWVudiAiRFlMRF9MSUJSQVJZX1BBVEg9LjokRU5We0RZTERfTElCUkFSWV9QQVRIfSIpCisgICAgICAgIGVsc2UoKQorICAgICAgICAgICAgbGlzdChBUFBFTkQgdHQtbGQtZmxhZ3MtdiAtV2wsLS12ZXJib3NlKQorICAgICAgICAgICAgc2V0KHR0LWVudiBMRF9MSUJSQVJZX1BBVEg9Ii46JHtidWlsZF9kaXJ9OiRFTlZ7TERfTElCUkFSWV9QQVRIfSIpCisgICAgICAgIGVuZGlmKCkKKyAgICBlbmRpZigpCisgICAgbGlzdChBUFBFTkQgdHQtYy1mbGFncyAiJHt0dC1jLWZsYWdzLXJ0fSIpCisgICAgbGlzdChBUFBFTkQgdHQtZW52ICJLTVBfVkVSU0lPTj0xIikKKworICAgIG1hY3JvKHRlc3RfdG91Y2hfcmVjaXBlIHRlc3RfdG91Y2hfZGlyKQorICAgICAgICBmaWxlKE1BS0VfRElSRUNUT1JZICR7YnVpbGRfZGlyfS8ke3Rlc3RfdG91Y2hfZGlyfSkKKyAgICAgICAgc2V0KGxkZXBzICR7c3JjX2Rpcn0vdGVzdC10b3VjaC5jICR7YnVpbGRfZGlyfS8ke2xpYl9maWxlfSkKKyAgICAgICAgc2V0KHR0LWV4ZS1maWxlICR7dGVzdF90b3VjaF9kaXJ9L3Rlc3QtdG91Y2gke2V4ZX0pCisgICAgICAgIGlmKCR7V0lORE9XU30pCisgICAgICAgICAgICAjICoqKioqKiBsaXN0KEFQUEVORCB0dC1jLWZsYWdzIC1GbyQoZGlyICRAKXRlc3QtdG91Y2gke29ian0gLUZlJChkaXIgJEApdGVzdC10b3VjaCR7ZXhlfSkgKioqKioqKgorICAgICAgICAgICAgc2V0KHR0LWMtZmxhZ3Mtb3V0IC1GbyR7dGVzdF90b3VjaF9kaXJ9L3Rlc3QtdG91Y2gke29ian0gLUZlJHt0ZXN0X3RvdWNoX2Rpcn0vdGVzdC10b3VjaCR7ZXhlfSkKKyAgICAgICAgICAgIGxpc3QoQVBQRU5EIGxkZXBzICR7YnVpbGRfZGlyfS8ke2ltcF9maWxlfSkKKyAgICAgICAgZWxzZSgpCisgICAgICAgICAgICAjICoqKioqKiBsaXN0KEFQUEVORCB0dC1jLWZsYWdzIC1vICQoZGlyICRAKXRlc3QtdG91Y2gke2V4ZX0pICoqKioqKioqCisgICAgICAgICAgICBzZXQodHQtYy1mbGFncy1vdXQgLW8gJHt0ZXN0X3RvdWNoX2Rpcn0vdGVzdC10b3VjaCR7ZXhlfSkKKyAgICAgICAgZW5kaWYoKQorICAgICAgICBhZGRfY3VzdG9tX2NvbW1hbmQoCisgICAgICAgICAgICBPVVRQVVQgICR7dGVzdF90b3VjaF9kaXJ9Ly5zdWNjZXNzCisgICAgICAgICAgICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgcmVtb3ZlIC1mICR7dGVzdF90b3VjaF9kaXJ9LyoKKyAgICAgICAgICAgIENPTU1BTkQgJHt0dC1jfSAke3R0LWMtZmxhZ3Mtb3V0fSAke3R0LWMtZmxhZ3N9ICR7c3JjX2Rpcn0vdGVzdC10b3VjaC5jICR7dHQtbGlic30gJHt0dC1sZC1mbGFnc30KKyAgICAgICAgICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSByZW1vdmUgLWYgJHt0dC1leGUtZmlsZX0KKyAgICAgICAgICAgIENPTU1BTkQgJHt0dC1jfSAke3R0LWMtZmxhZ3Mtb3V0fSAke3R0LWMtZmxhZ3N9ICR7c3JjX2Rpcn0vdGVzdC10b3VjaC5jICR7dHQtbGlic30gJHt0dC1sZC1mbGFnc30gJHt0dC1sZC1mbGFncy12fSA+ICR7dGVzdF90b3VjaF9kaXJ9L2J1aWxkLmxvZyAyPiYxCisgICAgICAgICAgICBDT01NQU5EICR7dHQtZW52fSAke3R0LWV4ZS1maWxlfQorICAgICAgICAgICAgI0NPTU1BTkQgZ3JlcCAtaSAtZSBcIlteX11saWJpcmNcIiAke3Rlc3RfdG91Y2hfZGlyfS9idWlsZC5sb2cgPiAke3Rlc3RfdG91Y2hfZGlyfS9saWJpcmMubG9nIFw7IFsgJCQ/IC1lcSAxIF0KKyAgICAgICAgICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSB0b3VjaCAke3Rlc3RfdG91Y2hfZGlyfS8uc3VjY2VzcworICAgICAgICAgICAgREVQRU5EUyAke2xkZXBzfQorICAgICAgICApCisgICAgZW5kbWFjcm8oKQorICAgIGlmKCR7V0lORE9XU30pCisgICAgICAgIHRlc3RfdG91Y2hfcmVjaXBlKHRlc3QtdG91Y2gtbXQpCisgICAgICAgIHRlc3RfdG91Y2hfcmVjaXBlKHRlc3QtdG91Y2gtbWQpCisgICAgZWxzZSgpCisgICAgICAgIHRlc3RfdG91Y2hfcmVjaXBlKHRlc3QtdG91Y2gtcnQpCisgICAgZW5kaWYoKQorZWxzZSgpCisgICAgYWRkX2N1c3RvbV90YXJnZXQodGVzdC10b3VjaCBERVBFTkRTIHRlc3QtdG91Y2gvLnN1Y2Nlc3MpCisgICAgbWFjcm8odGVzdF90b3VjaF9yZWNpcGVfc2tpcCB0ZXN0X3RvdWNoX2RpcikKKyAgICAgICAgaWYoJHt0ZXN0c30gQU5EICR7dGVzdF90b3VjaH0pCisgICAgICAgICAgICBzZXQodGVzdF90b3VjaF9tZXNzYWdlICd0ZXN0LXRvdWNoIGlzIG5vdCBhdmFpbGFibGUgZm9yIHRoZSBJbnRlbChSKSBNSUMgQXJjaGl0ZWN0dXJlLiAgV2lsbCBub3QgcGVyZm9ybSBpdC4nKQorICAgICAgICBlbHNlKCkKKyAgICAgICAgICAgIHNldCh0ZXN0X3RvdWNoX21lc3NhZ2UgInRlc3QtdG91Y2ggaXMgdHVybmVkIG9mZi4gIFdpbGwgbm90IHBlcmZvcm0gaXQuIikKKyAgICAgICAgZW5kaWYoKQorICAgICAgICBhZGRfY3VzdG9tX2NvbW1hbmQoCisgICAgICAgICAgICBPVVRQVVQgJHt0ZXN0X3RvdWNoX2Rpcn0vLnN1Y2Nlc3MKKyAgICAgICAgICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSBlY2hvICR7dGVzdF90b3VjaF9tZXNzYWdlfQorICAgICAgICApCisgICAgZW5kbWFjcm8oKQorICAgIHRlc3RfdG91Y2hfcmVjaXBlX3NraXAodGVzdC10b3VjaC1ydCkKKyAgICB0ZXN0X3RvdWNoX3JlY2lwZV9za2lwKHRlc3QtdG91Y2gtbXQpCisgICAgdGVzdF90b3VjaF9yZWNpcGVfc2tpcCh0ZXN0LXRvdWNoLW1kKQorZW5kaWYoKQorCisjIHRlc3QtcmVsbyAKK2FkZF9jdXN0b21fdGFyZ2V0KHRlc3QtcmVsbyBERVBFTkRTIHRlc3QtcmVsby8uc3VjY2VzcykKK2lmKCgke0xJTlVYfSBPUiAke01JQ30pIEFORCAke3Rlc3RfcmVsb30gQU5EICR7dGVzdHN9KQorICAgIGZpbGUoTUFLRV9ESVJFQ1RPUlkgJHtidWlsZF9kaXJ9L3Rlc3QtcmVsbykKKyAgICBhZGRfY3VzdG9tX2NvbW1hbmQoCisgICAgICAgIE9VVFBVVCAgdGVzdC1yZWxvLy5zdWNjZXNzCisgICAgICAgIENPTU1BTkQgcmVhZGVsZiAtZCAke2J1aWxkX2Rpcn0vJHtsaWJfZmlsZX0gPiB0ZXN0LXJlbG8vcmVhZGVsZi5sb2cKKyAgICAgICAgQ09NTUFORCBncmVwIC1lIFRFWFRSRUwgdGVzdC1yZWxvL3JlYWRlbGYubG9nIFw7IFsgJCQ/IC1lcSAxIF0KKyAgICAgICAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIHRvdWNoIHRlc3QtcmVsby8uc3VjY2VzcworICAgICAgICBERVBFTkRTICR7YnVpbGRfZGlyfS8ke2xpYl9maWxlfQorICAgICkKK2Vsc2UoKQorICAgIGlmKCR7dGVzdHN9IEFORCAke3Rlc3RfcmVsb30pCisgICAgICAgIHNldCh0ZXN0X3JlbG9fbWVzc2FnZSAndGVzdC1yZWxvIGlzIG9ubHkgYXZhaWxhYmxlIGZvciBkeW5hbWljIGxpYnJhcnkgb24gTGludXggb3IgSW50ZWwoUikgTUlDIEFyY2hpdGVjdHVyZS4gIFdpbGwgbm90IHBlcmZvcm0gaXQuJykKKyAgICBlbHNlKCkKKyAgICAgICAgc2V0KHRlc3RfcmVsb19tZXNzYWdlICJ0ZXN0LXJlbG8gaXMgdHVybmVkIG9mZi4gIFdpbGwgbm90IHBlcmZvcm0gaXQuIikKKyAgICBlbmRpZigpCisgICAgYWRkX2N1c3RvbV9jb21tYW5kKAorICAgICAgICBPVVRQVVQgIHRlc3QtcmVsby8uc3VjY2VzcworICAgICAgICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgZWNobyAke3Rlc3RfcmVsb19tZXNzYWdlfQorICAgICkKK2VuZGlmKCkKKworIyB0ZXN0LWV4ZWNzdGFjaworYWRkX2N1c3RvbV90YXJnZXQodGVzdC1leGVjc3RhY2sgREVQRU5EUyB0ZXN0LWV4ZWNzdGFjay8uc3VjY2VzcykKK2lmKCR7TElOVVh9IEFORCAke3Rlc3RfZXhlY3N0YWNrfSBBTkQgJHt0ZXN0c30pCisgICAgZmlsZShNQUtFX0RJUkVDVE9SWSAke2J1aWxkX2Rpcn0vdGVzdC1leGVjc3RhY2spCisgICAgYWRkX2N1c3RvbV9jb21tYW5kKAorICAgICAgICBPVVRQVVQgIHRlc3QtZXhlY3N0YWNrLy5zdWNjZXNzCisgICAgICAgIENPTU1BTkQgJHtQRVJMX0VYRUNVVEFCTEV9ICR7dG9vbHNfZGlyfS9jaGVjay1leGVjc3RhY2sucGwgJHtidWlsZF9kaXJ9LyR7bGliX2ZpbGV9CisgICAgICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSB0b3VjaCB0ZXN0LWV4ZWNzdGFjay8uc3VjY2VzcworICAgICAgICBERVBFTkRTICR7YnVpbGRfZGlyfS8ke2xpYl9maWxlfQorICAgICkKK2Vsc2UoKQorICAgIGlmKCR7dGVzdHN9IEFORCAke3Rlc3RfZXhlY3N0YWNrfSkKKyAgICAgICAgc2V0KHRlc3RfZXhlY3N0YWNrX21lc3NhZ2UgInRlc3QtZXhlY3N0YWNrIGlzIG9ubHkgYXZhaWxhYmxlIGZvciBkeW5hbWljIGxpYnJhcnkgb24gTGludXguICBXaWxsIG5vdCBwZXJmb3JtIGl0LiIpCisgICAgZWxzZSgpCisgICAgICAgIHNldCh0ZXN0X2V4ZWNzdGFja19tZXNzYWdlICJ0ZXN0LWV4ZWNzdGFjayBpcyB0dXJuZWQgb2ZmLiAgV2lsbCBub3QgcGVyZm9ybSBpdC4iKQorICAgIGVuZGlmKCkKKyAgICBhZGRfY3VzdG9tX2NvbW1hbmQoCisgICAgICAgIE9VVFBVVCAgdGVzdC1leGVjc3RhY2svLnN1Y2Nlc3MKKyAgICAgICAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIGVjaG8gJHt0ZXN0X2V4ZWNzdGFja19tZXNzYWdlfQorICAgICkKK2VuZGlmKCkKKworIyB0ZXN0LWluc3RyCithZGRfY3VzdG9tX3RhcmdldCh0ZXN0LWluc3RyIERFUEVORFMgdGVzdC1pbnN0ci8uc3VjY2VzcykKK2lmKCR7TUlDfSBBTkQgJHt0ZXN0X2luc3RyfSBBTkQgJHt0ZXN0c30pCisgICAgZmlsZShNQUtFX0RJUkVDVE9SWSAke2J1aWxkX2Rpcn0vdGVzdC1pbnN0cikKKyAgICBhZGRfY3VzdG9tX2NvbW1hbmQoCisgICAgICAgIE9VVFBVVCAgdGVzdC1pbnN0ci8uc3VjY2VzcworICAgICAgICBDT01NQU5EICR7UEVSTF9FWEVDVVRBQkxFfSAke3Rvb2xzX2Rpcn0vY2hlY2staW5zdHJ1Y3Rpb24tc2V0LnBsICR7b2Ffb3B0c30gLS1zaG93IC0tbWljLWFyY2g9JHttaWNfYXJjaH0gLS1taWMtb3M9JHttaWNfb3N9ICR7YnVpbGRfZGlyfS8ke2xpYl9maWxlfQorICAgICAgICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgdG91Y2ggdGVzdC1pbnN0ci8uc3VjY2VzcworICAgICAgICBERVBFTkRTICR7YnVpbGRfZGlyfS8ke2xpYl9maWxlfSAke3Rvb2xzX2Rpcn0vY2hlY2staW5zdHJ1Y3Rpb24tc2V0LnBsCisgICAgKQorZWxzZSgpCisgICAgaWYoJHt0ZXN0c30gQU5EICR7dGVzdF9pbnN0cn0pCisgICAgICAgIHNldCh0ZXN0X2luc3RyX21lc3NhZ2UgJ3Rlc3QtaW5zdHIgaXMgb25seSBhdmFpbGFibGUgZm9yIEludGVsKFIpIE1JQyBBcmNoaXRlY3R1cmUgbGlicmFyaWVzLiAgV2lsbCBub3QgcGVyZm9ybSBpdC4nKQorICAgIGVsc2UoKQorICAgICAgICBzZXQodGVzdF9pbnN0cl9tZXNzYWdlICJ0ZXN0LWluc3RyIGlzIHR1cm5lZCBvZmYuICBXaWxsIG5vdCBwZXJmb3JtIGl0LiIpCisgICAgZW5kaWYoKQorICAgIGFkZF9jdXN0b21fY29tbWFuZCgKKyAgICAgICAgT1VUUFVUICB0ZXN0LWluc3RyLy5zdWNjZXNzCisgICAgICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSBlY2hvICR7dGVzdF9pbnN0cl9tZXNzYWdlfQorICAgICkKK2VuZGlmKCkKKworIyB0ZXN0LWRlcHMKK2FkZF9jdXN0b21fdGFyZ2V0KHRlc3QtZGVwcyBERVBFTkRTIHRlc3QtZGVwcy8uc3VjY2VzcykKK2lmKCR7dGVzdF9kZXBzfSBBTkQgJHt0ZXN0c30pCisgICAgc2V0KHRkX2V4cCkKKyAgICBpZigke0ZSRUVCU0R9KQorICAgICAgICBzZXQodGRfZXhwIGxpYmMuc28uNyBsaWJ0aHIuc28uMyBsaWJ1bndpbmQuc28uNSkKKyAgICBlbHNlaWYoJHtMSU5VWH0pCisgICAgICAgIHNldCh0ZF9leHAgbGliZGwuc28uMixsaWJnY2Nfcy5zby4xKQorICAgICAgICBpZigke0lBMzJ9KQorICAgICAgICAgICAgc2V0KHRkX2V4cCAke3RkX2V4cH0sbGliYy5zby42LGxkLWxpbnV4LnNvLjIpICAKKyAgICAgICAgZWxzZWlmKCR7SU5URUw2NH0pCisgICAgICAgICAgICBzZXQodGRfZXhwICR7dGRfZXhwfSxsaWJjLnNvLjYsbGQtbGludXgteDg2LTY0LnNvLjIpICAKKyAgICAgICAgZWxzZWlmKCR7QVJNfSkKKyAgICAgICAgICAgIHNldCh0ZF9leHAgJHt0ZF9leHB9LGxpYmZmaS5zby42LGxpYmZmaS5zby41LGxpYmMuc28uNixsZC1saW51eC1hcm1oZi5zby4zKSAgCisgICAgICAgIGVsc2VpZigke1BQQzY0fSkKKyAgICAgICAgICAgIHNldCh0ZF9leHAgJHt0ZF9leHB9LGxpYmMuc28uNixsZDY0LnNvLjEpICAKKyAgICAgICAgZW5kaWYoKQorICAgICAgICBpZigke1NURF9DUFBfTElCfSkKKyAgICAgICAgICAgIHNldCh0ZF9leHAgJHt0ZF9leHB9LGxpYnN0ZGMrKy5zby42KQorICAgICAgICBlbmRpZigpCisgICAgICAgIGlmKE5PVCAke1NUVUJTX0xJQlJBUll9KQorICAgICAgICAgICAgc2V0KHRkX2V4cCAke3RkX2V4cH0sbGlicHRocmVhZC5zby4wKQorICAgICAgICBlbmRpZigpCisgICAgZWxzZWlmKCR7TUlDfSkKKyAgICAgICAgaWYoIiR7bWljX29zfSIgU1RSRVFVQUwgImxpbiIpCisgICAgICAgICAgICBzZXQodGRfZXhwIGxpYmMuc28uNixsaWJwdGhyZWFkLnNvLjAsbGliZGwuc28uMikKKyAgICAgICAgICAgIGlmKCR7U1REX0NQUF9MSUJ9KQorICAgICAgICAgICAgICAgIHNldCh0ZF9leHAgJHt0ZF9leHB9LGxpYnN0ZGMrKy5zby42KQorICAgICAgICAgICAgZW5kaWYoKQorICAgICAgICAgICAgaWYoIiR7bWljX2FyY2h9IiBTVFJFUVVBTCAia25mIikKKyAgICAgICAgICAgICAgICBzZXQodGRfZXhwICR7dGRfZXhwfSxsZC1saW51eC1sMW9tLnNvLjIsbGliZ2NjX3Muc28uMSkKKyAgICAgICAgICAgIGVsc2VpZigiJHttaWNfYXJjaH0iIFNUUkVRVUFMICJrbmMiKQorICAgICAgICAgICAgICAgIHNldCh0ZF9leHAgJHt0ZF9leHB9LGxkLWxpbnV4LWsxb20uc28uMikKKyAgICAgICAgICAgIGVuZGlmKCkKKyAgICAgICAgZWxzZWlmKCIke21pY19vc30iIFNUUkVRVUFMICJic2QiKQorICAgICAgICAgICAgc2V0KHRkX2V4cCBsaWJjLnNvLjcsbGlidGhyLnNvLjMsbGlidW53aW5kLnNvLjUpCisgICAgICAgIGVuZGlmKCkKKyAgICBlbHNlaWYoJHtNQUN9KQorICAgICAgICBzZXQodGRfZXhwIC91c3IvbGliL2xpYlN5c3RlbS5CLmR5bGliKQorICAgIGVsc2VpZigke1dJTkRPV1N9KQorICAgICAgICBzZXQodGRfZXhwIGtlcm5lbDMyLmRsbCkKKyAgICBlbmRpZigpCisKKyAgICBmaWxlKE1BS0VfRElSRUNUT1JZICR7YnVpbGRfZGlyfS90ZXN0LWRlcHMpCisgICAgYWRkX2N1c3RvbV9jb21tYW5kKAorICAgICAgICBPVVRQVVQgIHRlc3QtZGVwcy8uc3VjY2VzcworICAgICAgICBDT01NQU5EICR7UEVSTF9FWEVDVVRBQkxFfSAke3Rvb2xzX2Rpcn0vY2hlY2stZGVwZW5kcy5wbCAke29hX29wdHN9IC0tZXhwZWN0ZWQ9IiR7dGRfZXhwfSIgJHtidWlsZF9kaXJ9LyR7bGliX2ZpbGV9CisgICAgICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSB0b3VjaCB0ZXN0LWRlcHMvLnN1Y2Nlc3MKKyAgICAgICAgREVQRU5EUyAke2J1aWxkX2Rpcn0vJHtsaWJfZmlsZX0gJHt0b29sc19kaXJ9L2NoZWNrLWRlcGVuZHMucGwKKyAgICApCitlbHNlKCkKKyAgICBpZigke3Rlc3RzfSBBTkQgJHt0ZXN0X2RlcHN9KQorICAgICAgICBzZXQodGVzdF9kZXBzX21lc3NhZ2UgJ3Rlc3QtZGVwcyBpcyBhdmFpbGFibGUgZm9yIGR5bmFtaWMgbGlicmFyaWVzIG9uIExpbnV4LCBNYWMsIEludGVsKFIpIE1JQyBBcmNoaXRlY3R1cmUsIFdpbmRvd3MgYW5kIHN0YXRpYyBsaWJyYXJpZXMgb24gV2luZG93cy4gIFdpbGwgbm90IHBlcmZvcm0gaXQuJykKKyAgICBlbHNlKCkKKyAgICAgICAgc2V0KHRlc3RfZGVwc19tZXNzYWdlICJ0ZXN0LWRlcHMgaXMgdHVybmVkIG9mZi4gIFdpbGwgbm90IHBlcmZvcm0gaXQuIikKKyAgICBlbmRpZigpCisgICAgYWRkX2N1c3RvbV9jb21tYW5kKAorICAgICAgICBPVVRQVVQgIHRlc3QtZGVwcy8uc3VjY2VzcworICAgICAgICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgZWNobyAke3Rlc3RfZGVwc19tZXNzYWdlfQorICAgICkKK2VuZGlmKCkKKyMgRU5EIE9GIFRFU1RTCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvY21ha2UvUGVybEZsYWdzLmNtYWtlIGIvZmluYWwvcnVudGltZS9jbWFrZS9QZXJsRmxhZ3MuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM0ZDI5ZAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvY21ha2UvUGVybEZsYWdzLmNtYWtlCkBAIC0wLDAgKzEsOTAgQEAKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKKworIyB2b2lkIGFwcGVuZF9ldl9mbGFncyhzdHJpbmcgbmV3X2ZsYWcpOworIyAtIGFwcGVuZHMgbmV3X2ZsYWcgdG8gZXZfZmxhZ3MgbGlzdAorbWFjcm8oYXBwZW5kX2V2X2ZsYWdzIG5ld19mbGFnKQorICAgIGxpc3QoQVBQRU5EIGxvY2FsX2V2X2ZsYWdzICIke25ld19mbGFnfSIpCitlbmRtYWNybygpCisKKyMgdm9pZCBhcHBlbmRfZ2RfZmxhZ3Moc3RyaW5nIG5ld19mbGFnKTsKKyMgLSBhcHBlbmRzIG5ld19mbGFnIHRvIGdkX2ZsYWdzIGxpc3QKK21hY3JvKGFwcGVuZF9nZF9mbGFncyBuZXdfZmxhZykKKyAgICBsaXN0KEFQUEVORCBsb2NhbF9nZF9mbGFncyAiJHtuZXdfZmxhZ30iKQorZW5kbWFjcm8oKQorCitpbmNsdWRlKEhlbHBlckZ1bmN0aW9ucykgIyBmb3Igc2V0X2xlZ2FsX3R5cGUoKSwgc2V0X2xlZ2FsX2FyY2goKQorCisjIFBlcmwgZXhwYW5kLXZhcnMucGwgZmxhZ3MKK2Z1bmN0aW9uKHNldF9ldl9mbGFncyBpbnB1dF9ldl9mbGFncykKKyAgICBzZXQobG9jYWxfZXZfZmxhZ3MpCisgICAgc2V0X2xlZ2FsX3R5cGUoIiR7bGliX3R5cGV9IiBsZWdhbF90eXBlKQorICAgIHNldF9sZWdhbF9hcmNoKCIke2FyY2h9IiBsZWdhbF9hcmNoKQorICAgICMgbmVlZCAtRCBSZXZpc2lvbj0iXCRSZXZpc2lvbiIgdG8gc2hvdyB1cAorICAgIGFwcGVuZF9ldl9mbGFncygiLUQgUmV2aXNpb249XCJcXFxcJCRSZXZpc2lvblwiIikgCisgICAgYXBwZW5kX2V2X2ZsYWdzKCItRCBEYXRlPVwiXFxcXCQkRGF0ZVwiIikKKyAgICBhcHBlbmRfZXZfZmxhZ3MoIi1EIEtNUF9UWVBFPVwiJHtsZWdhbF90eXBlfVwiIikKKyAgICBhcHBlbmRfZXZfZmxhZ3MoIi1EIEtNUF9BUkNIPVwiJHtsZWdhbF9hcmNofVwiIikKKyAgICBhcHBlbmRfZXZfZmxhZ3MoIi1EIEtNUF9WRVJTSU9OX01BSk9SPSR7dmVyc2lvbn0iKQorICAgIGFwcGVuZF9ldl9mbGFncygiLUQgS01QX1ZFUlNJT05fTUlOT1I9MCIpCisgICAgYXBwZW5kX2V2X2ZsYWdzKCItRCBLTVBfVkVSU0lPTl9CVUlMRD0ke2J1aWxkX251bWJlcn0iKQorICAgIGFwcGVuZF9ldl9mbGFncygiLUQgS01QX0JVSUxEX0RBVEU9XCIke2RhdGV9XCIiKQorICAgIGFwcGVuZF9ldl9mbGFncygiLUQgS01QX1RBUkdFVF9DT01QSUxFUj0xMiIpCisgICAgaWYoJHtERUJVR19CVUlMRH0gT1IgJHtSRUxXSVRIREVCSU5GT19CVUlMRH0pCisgICAgICAgIGFwcGVuZF9ldl9mbGFncygiLUQgS01QX0RJQUc9MSIpCisgICAgICAgIGFwcGVuZF9ldl9mbGFncygiLUQgS01QX0RFQlVHX0lORk89MSIpCisgICAgZWxzZSgpCisgICAgICAgIGFwcGVuZF9ldl9mbGFncygiLUQgS01QX0RJQUc9MCIpCisgICAgICAgIGFwcGVuZF9ldl9mbGFncygiLUQgS01QX0RFQlVHX0lORk89MCIpCisgICAgZW5kaWYoKQorICAgIGlmKCR7b21wX3ZlcnNpb259IEVRVUFMIDQwKQorICAgICAgICBhcHBlbmRfZXZfZmxhZ3MoIi1EIE9NUF9WRVJTSU9OPTIwMTMwNyIpCisgICAgZWxzZWlmKCR7b21wX3ZlcnNpb259IEVRVUFMIDMwKQorICAgICAgICBhcHBlbmRfZXZfZmxhZ3MoIi1EIE9NUF9WRVJTSU9OPTIwMTEwNyIpCisgICAgZWxzZSgpCisgICAgICAgIGFwcGVuZF9ldl9mbGFncygiLUQgT01QX1ZFUlNJT049MjAwNTA1IikKKyAgICBlbmRpZigpCisgICAgc2V0KCR7aW5wdXRfZXZfZmxhZ3N9ICIke2xvY2FsX2V2X2ZsYWdzfSIgUEFSRU5UX1NDT1BFKQorZW5kZnVuY3Rpb24oKQorCitmdW5jdGlvbihzZXRfZ2RfZmxhZ3MgaW5wdXRfZ2RfZmxhZ3MpCisgICAgc2V0KGxvY2FsX2dkX2ZsYWdzKQorICAgIGlmKCR7SUEzMn0pCisgICAgICAgIGFwcGVuZF9nZF9mbGFncygiLUQgYXJjaF8zMiIpCisgICAgZWxzZWlmKCR7SU5URUw2NH0pCisgICAgICAgIGFwcGVuZF9nZF9mbGFncygiLUQgYXJjaF8zMmUiKQorICAgIGVsc2UoKQorICAgICAgICBhcHBlbmRfZ2RfZmxhZ3MoIi1EIGFyY2hfJHthcmNofSIpCisgICAgZW5kaWYoKQorICAgIGlmKCR7Tk9STUFMX0xJQlJBUll9KQorICAgICAgICBhcHBlbmRfZ2RfZmxhZ3MoIi1EIG5vcm0iKQorICAgIGVsc2VpZigke1BST0ZJTEVfTElCUkFSWX0pCisgICAgICAgIGFwcGVuZF9nZF9mbGFncygiLUQgcHJvZiIpCisgICAgZWxzZWlmKCR7U1RVQlNfTElCUkFSWX0pCisgICAgICAgIGFwcGVuZF9nZF9mbGFncygiLUQgc3R1YiIpCisgICAgZW5kaWYoKQorICAgIGlmKCR7b21wX3ZlcnNpb259IEdSRUFURVIgNDAgT1IgJHtvbXBfdmVyc2lvbn0gRVFVQUwgNDApCisgICAgICAgIGFwcGVuZF9nZF9mbGFncygiLUQgT01QXzQwIikKKyAgICBlbmRpZigpCisgICAgaWYoJHtvbXBfdmVyc2lvbn0gR1JFQVRFUiAzMCBPUiAke29tcF92ZXJzaW9ufSBFUVVBTCAzMCkKKyAgICAgICAgYXBwZW5kX2dkX2ZsYWdzKCItRCBPTVBfMzAiKQorICAgIGVuZGlmKCkKKyAgICBpZihOT1QgIiR7dmVyc2lvbn0iIFNUUkVRVUFMICI0IikKKyAgICAgICAgYXBwZW5kX2dkX2ZsYWdzKCItRCBtc3ZjX2NvbXBhdCIpCisgICAgZW5kaWYoKQorICAgIGlmKCR7REVCVUdfQlVJTER9IE9SICR7UkVMV0lUSERFQklORk9fQlVJTER9KQorICAgICAgICBhcHBlbmRfZ2RfZmxhZ3MoIi1EIEtNUF9ERUJVRyIpCisgICAgZW5kaWYoKQorICAgIGlmKCR7Q09NUElMRVJfU1VQUE9SVFNfUVVBRF9QUkVDSVNJT059KQorICAgICAgICBhcHBlbmRfZ2RfZmxhZ3MoIi1EIEhBVkVfUVVBRCIpCisgICAgZW5kaWYoKQorICAgIHNldCgke2lucHV0X2dkX2ZsYWdzfSAiJHtsb2NhbF9nZF9mbGFnc30iIFBBUkVOVF9TQ09QRSkKK2VuZGZ1bmN0aW9uKCkKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvY21ha2UvU291cmNlRmlsZXMuY21ha2UgYi9maW5hbC9ydW50aW1lL2NtYWtlL1NvdXJjZUZpbGVzLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjYzc4Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL2NtYWtlL1NvdXJjZUZpbGVzLmNtYWtlCkBAIC0wLDAgKzEsMTExIEBACisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKK21hY3JvKGFwcGVuZF9jX3NvdXJjZV9maWxlIG5ld19jX2ZpbGUpCisgICAgbGlzdChBUFBFTkQgbG9jYWxfY19zb3VyY2VfZmlsZXMgIiR7bmV3X2NfZmlsZX0iKQorZW5kbWFjcm8oKQorCittYWNybyhhcHBlbmRfY3BwX3NvdXJjZV9maWxlIG5ld19jcHBfZmlsZSkKKyAgICBsaXN0KEFQUEVORCBsb2NhbF9jcHBfc291cmNlX2ZpbGVzICIke25ld19jcHBfZmlsZX0iKQorZW5kbWFjcm8oKQorCittYWNybyhhcHBlbmRfYXNtX3NvdXJjZV9maWxlIG5ld19hc21fZmlsZSkKKyAgICBsaXN0KEFQUEVORCBsb2NhbF9hc21fc291cmNlX2ZpbGVzICIke25ld19hc21fZmlsZX0iKQorZW5kbWFjcm8oKQorCittYWNybyhhcHBlbmRfaW1wX2Nfc291cmNlX2ZpbGUgbmV3X2ltcG9ydF9jX2ZpbGUpCisgICAgbGlzdChBUFBFTkQgbG9jYWxfaW1wX2NfZmlsZXMgIiR7bmV3X2ltcG9ydF9jX2ZpbGV9IikKK2VuZG1hY3JvKCkKKworIyBmaWxlcyBhcmUgcmVsYXRpdmUgdG8gdGhlIHNyYyBkaXJlY3RvcnkKKworZnVuY3Rpb24oc2V0X2NfZmlsZXMgaW5wdXRfY19zb3VyY2VfZmlsZXMpIAorICAgIHNldChsb2NhbF9jX3NvdXJjZV9maWxlcyAiIikKKyAgICBhcHBlbmRfY19zb3VyY2VfZmlsZSgia21wX2Z0bl9jZGVjbC5jIikKKyAgICBhcHBlbmRfY19zb3VyY2VfZmlsZSgia21wX2Z0bl9leHRyYS5jIikKKyAgICBhcHBlbmRfY19zb3VyY2VfZmlsZSgia21wX3ZlcnNpb24uYyIpCisgICAgaWYoJHtTVFVCU19MSUJSQVJZfSkKKyAgICAgICAgYXBwZW5kX2Nfc291cmNlX2ZpbGUoImttcF9zdHViLmMiKQorICAgIGVsc2UoKQorICAgICAgICBhcHBlbmRfY19zb3VyY2VfZmlsZSgia21wX2FsbG9jLmMiKQorICAgICAgICBhcHBlbmRfY19zb3VyY2VfZmlsZSgia21wX2F0b21pYy5jIikKKyAgICAgICAgYXBwZW5kX2Nfc291cmNlX2ZpbGUoImttcF9jc3VwcG9ydC5jIikKKyAgICAgICAgYXBwZW5kX2Nfc291cmNlX2ZpbGUoImttcF9kZWJ1Zy5jIikKKyAgICAgICAgYXBwZW5kX2Nfc291cmNlX2ZpbGUoImttcF9pdHQuYyIpCisgICAgICAgIGFwcGVuZF9jX3NvdXJjZV9maWxlKCJrbXBfZW52aXJvbm1lbnQuYyIpCisgICAgICAgIGFwcGVuZF9jX3NvdXJjZV9maWxlKCJrbXBfZXJyb3IuYyIpCisgICAgICAgIGFwcGVuZF9jX3NvdXJjZV9maWxlKCJrbXBfZ2xvYmFsLmMiKQorICAgICAgICBhcHBlbmRfY19zb3VyY2VfZmlsZSgia21wX2kxOG4uYyIpCisgICAgICAgIGFwcGVuZF9jX3NvdXJjZV9maWxlKCJrbXBfaW8uYyIpCisgICAgICAgIGFwcGVuZF9jX3NvdXJjZV9maWxlKCJrbXBfcnVudGltZS5jIikKKyAgICAgICAgYXBwZW5kX2Nfc291cmNlX2ZpbGUoImttcF9zZXR0aW5ncy5jIikKKyAgICAgICAgYXBwZW5kX2Nfc291cmNlX2ZpbGUoImttcF9zdHIuYyIpCisgICAgICAgIGFwcGVuZF9jX3NvdXJjZV9maWxlKCJrbXBfdGFza2luZy5jIikKKyAgICAgICAgYXBwZW5kX2Nfc291cmNlX2ZpbGUoImttcF90YXNrcS5jIikKKyAgICAgICAgYXBwZW5kX2Nfc291cmNlX2ZpbGUoImttcF90aHJlYWRwcml2YXRlLmMiKQorICAgICAgICBhcHBlbmRfY19zb3VyY2VfZmlsZSgia21wX3V0aWxpdHkuYyIpCisgICAgICAgIGlmKCR7VVNFX0lUVF9OT1RJRll9KQorICAgICAgICAgICAgYXBwZW5kX2Nfc291cmNlX2ZpbGUoInRoaXJkcGFydHkvaXR0bm90aWZ5L2l0dG5vdGlmeV9zdGF0aWMuYyIpCisgICAgICAgIGVuZGlmKCkKKyAgICAgICAgaWYoJHtXSU5ET1dTfSkKKyAgICAgICAgICAgIGFwcGVuZF9jX3NvdXJjZV9maWxlKCJ6X1dpbmRvd3NfTlRfdXRpbC5jIikKKyAgICAgICAgICAgIGFwcGVuZF9jX3NvdXJjZV9maWxlKCJ6X1dpbmRvd3NfTlQtNTg2X3V0aWwuYyIpCisgICAgICAgIGVsc2UoKQorICAgICAgICAgICAgYXBwZW5kX2Nfc291cmNlX2ZpbGUoInpfTGludXhfdXRpbC5jIikKKyAgICAgICAgICAgIGFwcGVuZF9jX3NvdXJjZV9maWxlKCJrbXBfZ3N1cHBvcnQuYyIpCisgICAgICAgIGVuZGlmKCkKKyAgICBlbmRpZigpCisgICAgc2V0KCR7aW5wdXRfY19zb3VyY2VfZmlsZXN9ICIke2xvY2FsX2Nfc291cmNlX2ZpbGVzfSIgUEFSRU5UX1NDT1BFKQorZW5kZnVuY3Rpb24oKQorCitmdW5jdGlvbihzZXRfY3BwX2ZpbGVzIGlucHV0X2NwcF9zb3VyY2VfZmlsZXMpIAorICAgIHNldChsb2NhbF9jcHBfc291cmNlX2ZpbGVzICIiKQorICAgIGlmKE5PVCAke1NUVUJTX0xJQlJBUll9KQorICAgICAgICBhcHBlbmRfY3BwX3NvdXJjZV9maWxlKCJrbXBfYmFycmllci5jcHAiKQorICAgICAgICBhcHBlbmRfY3BwX3NvdXJjZV9maWxlKCJrbXBfd2FpdF9yZWxlYXNlLmNwcCIpCisgICAgICAgIGFwcGVuZF9jcHBfc291cmNlX2ZpbGUoImttcF9hZmZpbml0eS5jcHAiKQorICAgICAgICBhcHBlbmRfY3BwX3NvdXJjZV9maWxlKCJrbXBfZGlzcGF0Y2guY3BwIikKKyAgICAgICAgYXBwZW5kX2NwcF9zb3VyY2VfZmlsZSgia21wX2xvY2suY3BwIikKKyAgICAgICAgYXBwZW5kX2NwcF9zb3VyY2VfZmlsZSgia21wX3NjaGVkLmNwcCIpCisgICAgICAgIGlmKCIke29tcF92ZXJzaW9ufSIgU1RSRVFVQUwgIjQwIikKKyAgICAgICAgICAgIGFwcGVuZF9jcHBfc291cmNlX2ZpbGUoImttcF90YXNrZGVwcy5jcHAiKQorICAgICAgICAgICAgYXBwZW5kX2NwcF9zb3VyY2VfZmlsZSgia21wX2NhbmNlbC5jcHAiKQorICAgICAgICBlbmRpZigpCisgICAgICAgIGlmKCR7U1RBVFNfR0FUSEVSSU5HfSkKKyAgICAgICAgICAgIGFwcGVuZF9jcHBfc291cmNlX2ZpbGUoImttcF9zdGF0cy5jcHAiKQorICAgICAgICAgICAgYXBwZW5kX2NwcF9zb3VyY2VfZmlsZSgia21wX3N0YXRzX3RpbWluZy5jcHAiKQorICAgICAgICBlbmRpZigpCisgICAgZW5kaWYoKQorCisgICAgc2V0KCR7aW5wdXRfY3BwX3NvdXJjZV9maWxlc30gIiR7bG9jYWxfY3BwX3NvdXJjZV9maWxlc30iIFBBUkVOVF9TQ09QRSkKK2VuZGZ1bmN0aW9uKCkKKworCitmdW5jdGlvbihzZXRfYXNtX2ZpbGVzIGlucHV0X2FzbV9zb3VyY2VfZmlsZXMpIAorICAgIHNldChsb2NhbF9hc21fc291cmNlX2ZpbGVzICIiKQorICAgIGlmKE5PVCAke1NUVUJTX0xJQlJBUll9KQorICAgICAgICBpZigke1dJTkRPV1N9KQorICAgICAgICAgICAgYXBwZW5kX2FzbV9zb3VyY2VfZmlsZSgiel9XaW5kb3dzX05ULTU4Nl9hc20uYXNtIikKKyAgICAgICAgZWxzZSgpCisgICAgICAgICAgICBhcHBlbmRfYXNtX3NvdXJjZV9maWxlKCJ6X0xpbnV4X2FzbS5zIikKKyAgICAgICAgZW5kaWYoKQorICAgIGVuZGlmKCkKKyAgICBzZXQoJHtpbnB1dF9hc21fc291cmNlX2ZpbGVzfSAiJHtsb2NhbF9hc21fc291cmNlX2ZpbGVzfSIgUEFSRU5UX1NDT1BFKQorZW5kZnVuY3Rpb24oKQorCisKK2Z1bmN0aW9uKHNldF9pbXBfY19maWxlcyBpbnB1dF9pbXBfY19maWxlcykKKyAgICBzZXQobG9jYWxfaW1wX2NfZmlsZXMgIiIpCisgICAgaWYoJHtXSU5ET1dTfSkKKyAgICAgICAgYXBwZW5kX2ltcF9jX3NvdXJjZV9maWxlKCJrbXBfaW1wb3J0LmMiKQorICAgIGVuZGlmKCkKKyAgICBzZXQoJHtpbnB1dF9pbXBfY19maWxlc30gIiR7bG9jYWxfaW1wX2NfZmlsZXN9IiBQQVJFTlRfU0NPUEUpCitlbmRmdW5jdGlvbigpCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL2RvYy9SZWZlcmVuY2UucGRmIGIvZmluYWwvcnVudGltZS9kb2MvUmVmZXJlbmNlLnBkZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmZhZjdlCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9kb2MvUmVmZXJlbmNlLnBkZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL2RvYy9kb3h5Z2VuL2NvbmZpZyBiL2ZpbmFsL3J1bnRpbWUvZG9jL2RveHlnZW4vY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNTEyNzUKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL2RvYy9kb3h5Z2VuL2NvbmZpZwpAQCAtMCwwICsxLDE4MjIgQEAKKyMgRG94eWZpbGUgMS5vOC4yDQorDQorIyBUaGlzIGZpbGUgZGVzY3JpYmVzIHRoZSBzZXR0aW5ncyB0byBiZSB1c2VkIGJ5IHRoZSBkb2N1bWVudGF0aW9uIHN5c3RlbQ0KKyMgZG94eWdlbiAod3d3LmRveHlnZW4ub3JnKSBmb3IgYSBwcm9qZWN0Lg0KKyMNCisjIEFsbCB0ZXh0IGFmdGVyIGEgaGFzaCAoIykgaXMgY29uc2lkZXJlZCBhIGNvbW1lbnQgYW5kIHdpbGwgYmUgaWdub3JlZC4NCisjIFRoZSBmb3JtYXQgaXM6DQorIyAgICAgICBUQUcgPSB2YWx1ZSBbdmFsdWUsIC4uLl0NCisjIEZvciBsaXN0cyBpdGVtcyBjYW4gYWxzbyBiZSBhcHBlbmRlZCB1c2luZzoNCisjICAgICAgIFRBRyArPSB2YWx1ZSBbdmFsdWUsIC4uLl0NCisjIFZhbHVlcyB0aGF0IGNvbnRhaW4gc3BhY2VzIHNob3VsZCBiZSBwbGFjZWQgYmV0d2VlbiBxdW90ZXMgKCIgIikuDQorDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyMgUHJvamVjdCByZWxhdGVkIGNvbmZpZ3VyYXRpb24gb3B0aW9ucw0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCisjIFRoaXMgdGFnIHNwZWNpZmllcyB0aGUgZW5jb2RpbmcgdXNlZCBmb3IgYWxsIGNoYXJhY3RlcnMgaW4gdGhlIGNvbmZpZyBmaWxlDQorIyB0aGF0IGZvbGxvdy4gVGhlIGRlZmF1bHQgaXMgVVRGLTggd2hpY2ggaXMgYWxzbyB0aGUgZW5jb2RpbmcgdXNlZCBmb3IgYWxsDQorIyB0ZXh0IGJlZm9yZSB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGlzIHRhZy4gRG94eWdlbiB1c2VzIGxpYmljb252IChvciB0aGUNCisjIGljb252IGJ1aWx0IGludG8gbGliYykgZm9yIHRoZSB0cmFuc2NvZGluZy4gU2VlDQorIyBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvbGliaWNvbnYgZm9yIHRoZSBsaXN0IG9mIHBvc3NpYmxlIGVuY29kaW5ncy4NCisNCitET1hZRklMRV9FTkNPRElORyAgICAgID0gVVRGLTgNCisNCisjIFRoZSBQUk9KRUNUX05BTUUgdGFnIGlzIGEgc2luZ2xlIHdvcmQgKG9yIHNlcXVlbmNlIG9mIHdvcmRzKSB0aGF0IHNob3VsZA0KKyMgaWRlbnRpZnkgdGhlIHByb2plY3QuIE5vdGUgdGhhdCBpZiB5b3UgZG8gbm90IHVzZSBEb3h5d2l6YXJkIHlvdSBuZWVkDQorIyB0byBwdXQgcXVvdGVzIGFyb3VuZCB0aGUgcHJvamVjdCBuYW1lIGlmIGl0IGNvbnRhaW5zIHNwYWNlcy4NCisNCitQUk9KRUNUX05BTUUgICAgICAgICAgID0gIkludGVsJnJlZzsmbmJzcDtPcGVuTVAqIFJ1bnRpbWUgTGlicmFyeSINCisNCisjIFRoZSBQUk9KRUNUX05VTUJFUiB0YWcgY2FuIGJlIHVzZWQgdG8gZW50ZXIgYSBwcm9qZWN0IG9yIHJldmlzaW9uIG51bWJlci4NCisjIFRoaXMgY291bGQgYmUgaGFuZHkgZm9yIGFyY2hpdmluZyB0aGUgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24gb3INCisjIGlmIHNvbWUgdmVyc2lvbiBjb250cm9sIHN5c3RlbSBpcyB1c2VkLg0KKw0KK1BST0pFQ1RfTlVNQkVSICAgICAgICAgPQ0KKw0KKyMgVXNpbmcgdGhlIFBST0pFQ1RfQlJJRUYgdGFnIG9uZSBjYW4gcHJvdmlkZSBhbiBvcHRpb25hbCBvbmUgbGluZSBkZXNjcmlwdGlvbg0KKyMgZm9yIGEgcHJvamVjdCB0aGF0IGFwcGVhcnMgYXQgdGhlIHRvcCBvZiBlYWNoIHBhZ2UgYW5kIHNob3VsZCBnaXZlIHZpZXdlcg0KKyMgYSBxdWljayBpZGVhIGFib3V0IHRoZSBwdXJwb3NlIG9mIHRoZSBwcm9qZWN0LiBLZWVwIHRoZSBkZXNjcmlwdGlvbiBzaG9ydC4NCisNCitQUk9KRUNUX0JSSUVGICAgICAgICAgID0NCisNCisjIFdpdGggdGhlIFBST0pFQ1RfTE9HTyB0YWcgb25lIGNhbiBzcGVjaWZ5IGFuIGxvZ28gb3IgaWNvbiB0aGF0IGlzDQorIyBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4gVGhlIG1heGltdW0gaGVpZ2h0IG9mIHRoZSBsb2dvIHNob3VsZCBub3QNCisjIGV4Y2VlZCA1NSBwaXhlbHMgYW5kIHRoZSBtYXhpbXVtIHdpZHRoIHNob3VsZCBub3QgZXhjZWVkIDIwMCBwaXhlbHMuDQorIyBEb3h5Z2VuIHdpbGwgY29weSB0aGUgbG9nbyB0byB0aGUgb3V0cHV0IGRpcmVjdG9yeS4NCisNCitQUk9KRUNUX0xPR08gICAgICAgICAgID0NCisNCisjIFRoZSBPVVRQVVRfRElSRUNUT1JZIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIChyZWxhdGl2ZSBvciBhYnNvbHV0ZSkNCisjIGJhc2UgcGF0aCB3aGVyZSB0aGUgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24gd2lsbCBiZSBwdXQuDQorIyBJZiBhIHJlbGF0aXZlIHBhdGggaXMgZW50ZXJlZCwgaXQgd2lsbCBiZSByZWxhdGl2ZSB0byB0aGUgbG9jYXRpb24NCisjIHdoZXJlIGRveHlnZW4gd2FzIHN0YXJ0ZWQuIElmIGxlZnQgYmxhbmsgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHdpbGwgYmUgdXNlZC4NCisNCitPVVRQVVRfRElSRUNUT1JZICAgICAgID0gZG9jL2RveHlnZW4vZ2VuZXJhdGVkDQorDQorIyBJZiB0aGUgQ1JFQVRFX1NVQkRJUlMgdGFnIGlzIHNldCB0byBZRVMsIHRoZW4gZG94eWdlbiB3aWxsIGNyZWF0ZQ0KKyMgNDA5NiBzdWItZGlyZWN0b3JpZXMgKGluIDIgbGV2ZWxzKSB1bmRlciB0aGUgb3V0cHV0IGRpcmVjdG9yeSBvZiBlYWNoIG91dHB1dA0KKyMgZm9ybWF0IGFuZCB3aWxsIGRpc3RyaWJ1dGUgdGhlIGdlbmVyYXRlZCBmaWxlcyBvdmVyIHRoZXNlIGRpcmVjdG9yaWVzLg0KKyMgRW5hYmxpbmcgdGhpcyBvcHRpb24gY2FuIGJlIHVzZWZ1bCB3aGVuIGZlZWRpbmcgZG94eWdlbiBhIGh1Z2UgYW1vdW50IG9mDQorIyBzb3VyY2UgZmlsZXMsIHdoZXJlIHB1dHRpbmcgYWxsIGdlbmVyYXRlZCBmaWxlcyBpbiB0aGUgc2FtZSBkaXJlY3Rvcnkgd291bGQNCisjIG90aGVyd2lzZSBjYXVzZSBwZXJmb3JtYW5jZSBwcm9ibGVtcyBmb3IgdGhlIGZpbGUgc3lzdGVtLg0KKw0KK0NSRUFURV9TVUJESVJTICAgICAgICAgPSBOTw0KKw0KKyMgVGhlIE9VVFBVVF9MQU5HVUFHRSB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBsYW5ndWFnZSBpbiB3aGljaCBhbGwNCisjIGRvY3VtZW50YXRpb24gZ2VuZXJhdGVkIGJ5IGRveHlnZW4gaXMgd3JpdHRlbi4gRG94eWdlbiB3aWxsIHVzZSB0aGlzDQorIyBpbmZvcm1hdGlvbiB0byBnZW5lcmF0ZSBhbGwgY29uc3RhbnQgb3V0cHV0IGluIHRoZSBwcm9wZXIgbGFuZ3VhZ2UuDQorIyBUaGUgZGVmYXVsdCBsYW5ndWFnZSBpcyBFbmdsaXNoLCBvdGhlciBzdXBwb3J0ZWQgbGFuZ3VhZ2VzIGFyZToNCisjIEFmcmlrYWFucywgQXJhYmljLCBCcmF6aWxpYW4sIENhdGFsYW4sIENoaW5lc2UsIENoaW5lc2UtVHJhZGl0aW9uYWwsDQorIyBDcm9hdGlhbiwgQ3plY2gsIERhbmlzaCwgRHV0Y2gsIEVzcGVyYW50bywgRmFyc2ksIEZpbm5pc2gsIEZyZW5jaCwgR2VybWFuLA0KKyMgR3JlZWssIEh1bmdhcmlhbiwgSXRhbGlhbiwgSmFwYW5lc2UsIEphcGFuZXNlLWVuIChKYXBhbmVzZSB3aXRoIEVuZ2xpc2gNCisjIG1lc3NhZ2VzKSwgS29yZWFuLCBLb3JlYW4tZW4sIExpdGh1YW5pYW4sIE5vcndlZ2lhbiwgTWFjZWRvbmlhbiwgUGVyc2lhbiwNCisjIFBvbGlzaCwgUG9ydHVndWVzZSwgUm9tYW5pYW4sIFJ1c3NpYW4sIFNlcmJpYW4sIFNlcmJpYW4tQ3lyaWxsaWMsIFNsb3ZhaywNCisjIFNsb3ZlbmUsIFNwYW5pc2gsIFN3ZWRpc2gsIFVrcmFpbmlhbiwgYW5kIFZpZXRuYW1lc2UuDQorDQorT1VUUFVUX0xBTkdVQUdFICAgICAgICA9IEVuZ2xpc2gNCisNCisjIElmIHRoZSBCUklFRl9NRU1CRVJfREVTQyB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIERveHlnZW4gd2lsbA0KKyMgaW5jbHVkZSBicmllZiBtZW1iZXIgZGVzY3JpcHRpb25zIGFmdGVyIHRoZSBtZW1iZXJzIHRoYXQgYXJlIGxpc3RlZCBpbg0KKyMgdGhlIGZpbGUgYW5kIGNsYXNzIGRvY3VtZW50YXRpb24gKHNpbWlsYXIgdG8gSmF2YURvYykuDQorIyBTZXQgdG8gTk8gdG8gZGlzYWJsZSB0aGlzLg0KKw0KK0JSSUVGX01FTUJFUl9ERVNDICAgICAgPSBZRVMNCisNCisjIElmIHRoZSBSRVBFQVRfQlJJRUYgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSBEb3h5Z2VuIHdpbGwgcHJlcGVuZA0KKyMgdGhlIGJyaWVmIGRlc2NyaXB0aW9uIG9mIGEgbWVtYmVyIG9yIGZ1bmN0aW9uIGJlZm9yZSB0aGUgZGV0YWlsZWQgZGVzY3JpcHRpb24uDQorIyBOb3RlOiBpZiBib3RoIEhJREVfVU5ET0NfTUVNQkVSUyBhbmQgQlJJRUZfTUVNQkVSX0RFU0MgYXJlIHNldCB0byBOTywgdGhlDQorIyBicmllZiBkZXNjcmlwdGlvbnMgd2lsbCBiZSBjb21wbGV0ZWx5IHN1cHByZXNzZWQuDQorDQorUkVQRUFUX0JSSUVGICAgICAgICAgICA9IFlFUw0KKw0KKyMgVGhpcyB0YWcgaW1wbGVtZW50cyBhIHF1YXNpLWludGVsbGlnZW50IGJyaWVmIGRlc2NyaXB0aW9uIGFiYnJldmlhdG9yDQorIyB0aGF0IGlzIHVzZWQgdG8gZm9ybSB0aGUgdGV4dCBpbiB2YXJpb3VzIGxpc3RpbmdzLiBFYWNoIHN0cmluZw0KKyMgaW4gdGhpcyBsaXN0LCBpZiBmb3VuZCBhcyB0aGUgbGVhZGluZyB0ZXh0IG9mIHRoZSBicmllZiBkZXNjcmlwdGlvbiwgd2lsbCBiZQ0KKyMgc3RyaXBwZWQgZnJvbSB0aGUgdGV4dCBhbmQgdGhlIHJlc3VsdCBhZnRlciBwcm9jZXNzaW5nIHRoZSB3aG9sZSBsaXN0LCBpcw0KKyMgdXNlZCBhcyB0aGUgYW5ub3RhdGVkIHRleHQuIE90aGVyd2lzZSwgdGhlIGJyaWVmIGRlc2NyaXB0aW9uIGlzIHVzZWQgYXMtaXMuDQorIyBJZiBsZWZ0IGJsYW5rLCB0aGUgZm9sbG93aW5nIHZhbHVlcyBhcmUgdXNlZCAoIiRuYW1lIiBpcyBhdXRvbWF0aWNhbGx5DQorIyByZXBsYWNlZCB3aXRoIHRoZSBuYW1lIG9mIHRoZSBlbnRpdHkpOiAiVGhlICRuYW1lIGNsYXNzIiAiVGhlICRuYW1lIHdpZGdldCINCisjICJUaGUgJG5hbWUgZmlsZSIgImlzIiAicHJvdmlkZXMiICJzcGVjaWZpZXMiICJjb250YWlucyINCisjICJyZXByZXNlbnRzIiAiYSIgImFuIiAidGhlIg0KKw0KK0FCQlJFVklBVEVfQlJJRUYgICAgICAgPQ0KKw0KKyMgSWYgdGhlIEFMV0FZU19ERVRBSUxFRF9TRUMgYW5kIFJFUEVBVF9CUklFRiB0YWdzIGFyZSBib3RoIHNldCB0byBZRVMgdGhlbg0KKyMgRG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgZGV0YWlsZWQgc2VjdGlvbiBldmVuIGlmIHRoZXJlIGlzIG9ubHkgYSBicmllZg0KKyMgZGVzY3JpcHRpb24uDQorDQorQUxXQVlTX0RFVEFJTEVEX1NFQyAgICA9IE5PDQorDQorIyBJZiB0aGUgSU5MSU5FX0lOSEVSSVRFRF9NRU1CIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgc2hvdyBhbGwNCisjIGluaGVyaXRlZCBtZW1iZXJzIG9mIGEgY2xhc3MgaW4gdGhlIGRvY3VtZW50YXRpb24gb2YgdGhhdCBjbGFzcyBhcyBpZiB0aG9zZQ0KKyMgbWVtYmVycyB3ZXJlIG9yZGluYXJ5IGNsYXNzIG1lbWJlcnMuIENvbnN0cnVjdG9ycywgZGVzdHJ1Y3RvcnMgYW5kIGFzc2lnbm1lbnQNCisjIG9wZXJhdG9ycyBvZiB0aGUgYmFzZSBjbGFzc2VzIHdpbGwgbm90IGJlIHNob3duLg0KKw0KK0lOTElORV9JTkhFUklURURfTUVNQiAgPSBOTw0KKw0KKyMgSWYgdGhlIEZVTExfUEFUSF9OQU1FUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIERveHlnZW4gd2lsbCBwcmVwZW5kIHRoZSBmdWxsDQorIyBwYXRoIGJlZm9yZSBmaWxlcyBuYW1lIGluIHRoZSBmaWxlIGxpc3QgYW5kIGluIHRoZSBoZWFkZXIgZmlsZXMuIElmIHNldA0KKyMgdG8gTk8gdGhlIHNob3J0ZXN0IHBhdGggdGhhdCBtYWtlcyB0aGUgZmlsZSBuYW1lIHVuaXF1ZSB3aWxsIGJlIHVzZWQuDQorDQorRlVMTF9QQVRIX05BTUVTICAgICAgICA9IE5PDQorDQorIyBJZiB0aGUgRlVMTF9QQVRIX05BTUVTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gdGhlIFNUUklQX0ZST01fUEFUSCB0YWcNCisjIGNhbiBiZSB1c2VkIHRvIHN0cmlwIGEgdXNlci1kZWZpbmVkIHBhcnQgb2YgdGhlIHBhdGguIFN0cmlwcGluZyBpcw0KKyMgb25seSBkb25lIGlmIG9uZSBvZiB0aGUgc3BlY2lmaWVkIHN0cmluZ3MgbWF0Y2hlcyB0aGUgbGVmdC1oYW5kIHBhcnQgb2YNCisjIHRoZSBwYXRoLiBUaGUgdGFnIGNhbiBiZSB1c2VkIHRvIHNob3cgcmVsYXRpdmUgcGF0aHMgaW4gdGhlIGZpbGUgbGlzdC4NCisjIElmIGxlZnQgYmxhbmsgdGhlIGRpcmVjdG9yeSBmcm9tIHdoaWNoIGRveHlnZW4gaXMgcnVuIGlzIHVzZWQgYXMgdGhlDQorIyBwYXRoIHRvIHN0cmlwLiBOb3RlIHRoYXQgeW91IHNwZWNpZnkgYWJzb2x1dGUgcGF0aHMgaGVyZSwgYnV0IGFsc28NCisjIHJlbGF0aXZlIHBhdGhzLCB3aGljaCB3aWxsIGJlIHJlbGF0aXZlIGZyb20gdGhlIGRpcmVjdG9yeSB3aGVyZSBkb3h5Z2VuIGlzDQorIyBzdGFydGVkLg0KKw0KK1NUUklQX0ZST01fUEFUSCAgICAgICAgPQ0KKw0KKyMgVGhlIFNUUklQX0ZST01fSU5DX1BBVEggdGFnIGNhbiBiZSB1c2VkIHRvIHN0cmlwIGEgdXNlci1kZWZpbmVkIHBhcnQgb2YNCisjIHRoZSBwYXRoIG1lbnRpb25lZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvZiBhIGNsYXNzLCB3aGljaCB0ZWxscw0KKyMgdGhlIHJlYWRlciB3aGljaCBoZWFkZXIgZmlsZSB0byBpbmNsdWRlIGluIG9yZGVyIHRvIHVzZSBhIGNsYXNzLg0KKyMgSWYgbGVmdCBibGFuayBvbmx5IHRoZSBuYW1lIG9mIHRoZSBoZWFkZXIgZmlsZSBjb250YWluaW5nIHRoZSBjbGFzcw0KKyMgZGVmaW5pdGlvbiBpcyB1c2VkLiBPdGhlcndpc2Ugb25lIHNob3VsZCBzcGVjaWZ5IHRoZSBpbmNsdWRlIHBhdGhzIHRoYXQNCisjIGFyZSBub3JtYWxseSBwYXNzZWQgdG8gdGhlIGNvbXBpbGVyIHVzaW5nIHRoZSAtSSBmbGFnLg0KKw0KK1NUUklQX0ZST01fSU5DX1BBVEggICAgPQ0KKw0KKyMgSWYgdGhlIFNIT1JUX05BTUVTIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgbXVjaCBzaG9ydGVyDQorIyAoYnV0IGxlc3MgcmVhZGFibGUpIGZpbGUgbmFtZXMuIFRoaXMgY2FuIGJlIHVzZWZ1bCBpZiB5b3VyIGZpbGUgc3lzdGVtDQorIyBkb2Vzbid0IHN1cHBvcnQgbG9uZyBuYW1lcyBsaWtlIG9uIERPUywgTWFjLCBvciBDRC1ST00uDQorDQorU0hPUlRfTkFNRVMgICAgICAgICAgICA9IE5PDQorDQorIyBJZiB0aGUgSkFWQURPQ19BVVRPQlJJRUYgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBEb3h5Z2VuDQorIyB3aWxsIGludGVycHJldCB0aGUgZmlyc3QgbGluZSAodW50aWwgdGhlIGZpcnN0IGRvdCkgb2YgYSBKYXZhRG9jLXN0eWxlDQorIyBjb21tZW50IGFzIHRoZSBicmllZiBkZXNjcmlwdGlvbi4gSWYgc2V0IHRvIE5PLCB0aGUgSmF2YURvYw0KKyMgY29tbWVudHMgd2lsbCBiZWhhdmUganVzdCBsaWtlIHJlZ3VsYXIgUXQtc3R5bGUgY29tbWVudHMNCisjICh0aHVzIHJlcXVpcmluZyBhbiBleHBsaWNpdCBAYnJpZWYgY29tbWFuZCBmb3IgYSBicmllZiBkZXNjcmlwdGlvbi4pDQorDQorSkFWQURPQ19BVVRPQlJJRUYgICAgICA9IE5PDQorDQorIyBJZiB0aGUgUVRfQVVUT0JSSUVGIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gRG94eWdlbiB3aWxsDQorIyBpbnRlcnByZXQgdGhlIGZpcnN0IGxpbmUgKHVudGlsIHRoZSBmaXJzdCBkb3QpIG9mIGEgUXQtc3R5bGUNCisjIGNvbW1lbnQgYXMgdGhlIGJyaWVmIGRlc2NyaXB0aW9uLiBJZiBzZXQgdG8gTk8sIHRoZSBjb21tZW50cw0KKyMgd2lsbCBiZWhhdmUganVzdCBsaWtlIHJlZ3VsYXIgUXQtc3R5bGUgY29tbWVudHMgKHRodXMgcmVxdWlyaW5nDQorIyBhbiBleHBsaWNpdCBcYnJpZWYgY29tbWFuZCBmb3IgYSBicmllZiBkZXNjcmlwdGlvbi4pDQorDQorUVRfQVVUT0JSSUVGICAgICAgICAgICA9IE5PDQorDQorIyBUaGUgTVVMVElMSU5FX0NQUF9JU19CUklFRiB0YWcgY2FuIGJlIHNldCB0byBZRVMgdG8gbWFrZSBEb3h5Z2VuDQorIyB0cmVhdCBhIG11bHRpLWxpbmUgQysrIHNwZWNpYWwgY29tbWVudCBibG9jayAoaS5lLiBhIGJsb2NrIG9mIC8vISBvciAvLy8NCisjIGNvbW1lbnRzKSBhcyBhIGJyaWVmIGRlc2NyaXB0aW9uLiBUaGlzIHVzZWQgdG8gYmUgdGhlIGRlZmF1bHQgYmVoYXZpb3VyLg0KKyMgVGhlIG5ldyBkZWZhdWx0IGlzIHRvIHRyZWF0IGEgbXVsdGktbGluZSBDKysgY29tbWVudCBibG9jayBhcyBhIGRldGFpbGVkDQorIyBkZXNjcmlwdGlvbi4gU2V0IHRoaXMgdGFnIHRvIFlFUyBpZiB5b3UgcHJlZmVyIHRoZSBvbGQgYmVoYXZpb3VyIGluc3RlYWQuDQorDQorTVVMVElMSU5FX0NQUF9JU19CUklFRiA9IE5PDQorDQorIyBJZiB0aGUgSU5IRVJJVF9ET0NTIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgdGhlbiBhbiB1bmRvY3VtZW50ZWQNCisjIG1lbWJlciBpbmhlcml0cyB0aGUgZG9jdW1lbnRhdGlvbiBmcm9tIGFueSBkb2N1bWVudGVkIG1lbWJlciB0aGF0IGl0DQorIyByZS1pbXBsZW1lbnRzLg0KKw0KK0lOSEVSSVRfRE9DUyAgICAgICAgICAgPSBZRVMNCisNCisjIElmIHRoZSBTRVBBUkFURV9NRU1CRVJfUEFHRVMgdGFnIGlzIHNldCB0byBZRVMsIHRoZW4gZG94eWdlbiB3aWxsIHByb2R1Y2UNCisjIGEgbmV3IHBhZ2UgZm9yIGVhY2ggbWVtYmVyLiBJZiBzZXQgdG8gTk8sIHRoZSBkb2N1bWVudGF0aW9uIG9mIGEgbWVtYmVyIHdpbGwNCisjIGJlIHBhcnQgb2YgdGhlIGZpbGUvY2xhc3MvbmFtZXNwYWNlIHRoYXQgY29udGFpbnMgaXQuDQorDQorU0VQQVJBVEVfTUVNQkVSX1BBR0VTICA9IE5PDQorDQorIyBUaGUgVEFCX1NJWkUgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgbnVtYmVyIG9mIHNwYWNlcyBpbiBhIHRhYi4NCisjIERveHlnZW4gdXNlcyB0aGlzIHZhbHVlIHRvIHJlcGxhY2UgdGFicyBieSBzcGFjZXMgaW4gY29kZSBmcmFnbWVudHMuDQorDQorVEFCX1NJWkUgICAgICAgICAgICAgICA9IDgNCisNCisjIFRoaXMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBudW1iZXIgb2YgYWxpYXNlcyB0aGF0IGFjdHMNCisjIGFzIGNvbW1hbmRzIGluIHRoZSBkb2N1bWVudGF0aW9uLiBBbiBhbGlhcyBoYXMgdGhlIGZvcm0gIm5hbWU9dmFsdWUiLg0KKyMgRm9yIGV4YW1wbGUgYWRkaW5nICJzaWRlZWZmZWN0PVxwYXIgU2lkZSBFZmZlY3RzOlxuIiB3aWxsIGFsbG93IHlvdSB0bw0KKyMgcHV0IHRoZSBjb21tYW5kIFxzaWRlZWZmZWN0IChvciBAc2lkZWVmZmVjdCkgaW4gdGhlIGRvY3VtZW50YXRpb24sIHdoaWNoDQorIyB3aWxsIHJlc3VsdCBpbiBhIHVzZXItZGVmaW5lZCBwYXJhZ3JhcGggd2l0aCBoZWFkaW5nICJTaWRlIEVmZmVjdHM6Ii4NCisjIFlvdSBjYW4gcHV0IFxuJ3MgaW4gdGhlIHZhbHVlIHBhcnQgb2YgYW4gYWxpYXMgdG8gaW5zZXJ0IG5ld2xpbmVzLg0KKw0KK0FMSUFTRVMgICAgICAgICAgICAgICAgPSAib3RoZXI9PHN1cD4qPC9zdXA+Ig0KKw0KKyMgVGhpcyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIG51bWJlciBvZiB3b3JkLWtleXdvcmQgbWFwcGluZ3MgKFRDTCBvbmx5KS4NCisjIEEgbWFwcGluZyBoYXMgdGhlIGZvcm0gIm5hbWU9dmFsdWUiLiBGb3IgZXhhbXBsZSBhZGRpbmcNCisjICJjbGFzcz1pdGNsOjpjbGFzcyIgd2lsbCBhbGxvdyB5b3UgdG8gdXNlIHRoZSBjb21tYW5kIGNsYXNzIGluIHRoZQ0KKyMgaXRjbDo6Y2xhc3MgbWVhbmluZy4NCisNCitUQ0xfU1VCU1QgICAgICAgICAgICAgID0NCisNCisjIFNldCB0aGUgT1BUSU1JWkVfT1VUUFVUX0ZPUl9DIHRhZyB0byBZRVMgaWYgeW91ciBwcm9qZWN0IGNvbnNpc3RzIG9mIEMNCisjIHNvdXJjZXMgb25seS4gRG94eWdlbiB3aWxsIHRoZW4gZ2VuZXJhdGUgb3V0cHV0IHRoYXQgaXMgbW9yZSB0YWlsb3JlZCBmb3IgQy4NCisjIEZvciBpbnN0YW5jZSwgc29tZSBvZiB0aGUgbmFtZXMgdGhhdCBhcmUgdXNlZCB3aWxsIGJlIGRpZmZlcmVudC4gVGhlIGxpc3QNCisjIG9mIGFsbCBtZW1iZXJzIHdpbGwgYmUgb21pdHRlZCwgZXRjLg0KKw0KK09QVElNSVpFX09VVFBVVF9GT1JfQyAgPSBOTw0KKw0KKyMgU2V0IHRoZSBPUFRJTUlaRV9PVVRQVVRfSkFWQSB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBKYXZhDQorIyBzb3VyY2VzIG9ubHkuIERveHlnZW4gd2lsbCB0aGVuIGdlbmVyYXRlIG91dHB1dCB0aGF0IGlzIG1vcmUgdGFpbG9yZWQgZm9yDQorIyBKYXZhLiBGb3IgaW5zdGFuY2UsIG5hbWVzcGFjZXMgd2lsbCBiZSBwcmVzZW50ZWQgYXMgcGFja2FnZXMsIHF1YWxpZmllZA0KKyMgc2NvcGVzIHdpbGwgbG9vayBkaWZmZXJlbnQsIGV0Yy4NCisNCitPUFRJTUlaRV9PVVRQVVRfSkFWQSAgID0gTk8NCisNCisjIFNldCB0aGUgT1BUSU1JWkVfRk9SX0ZPUlRSQU4gdGFnIHRvIFlFUyBpZiB5b3VyIHByb2plY3QgY29uc2lzdHMgb2YgRm9ydHJhbg0KKyMgc291cmNlcyBvbmx5LiBEb3h5Z2VuIHdpbGwgdGhlbiBnZW5lcmF0ZSBvdXRwdXQgdGhhdCBpcyBtb3JlIHRhaWxvcmVkIGZvcg0KKyMgRm9ydHJhbi4NCisNCitPUFRJTUlaRV9GT1JfRk9SVFJBTiAgID0gTk8NCisNCisjIFNldCB0aGUgT1BUSU1JWkVfT1VUUFVUX1ZIREwgdGFnIHRvIFlFUyBpZiB5b3VyIHByb2plY3QgY29uc2lzdHMgb2YgVkhETA0KKyMgc291cmNlcy4gRG94eWdlbiB3aWxsIHRoZW4gZ2VuZXJhdGUgb3V0cHV0IHRoYXQgaXMgdGFpbG9yZWQgZm9yDQorIyBWSERMLg0KKw0KK09QVElNSVpFX09VVFBVVF9WSERMICAgPSBOTw0KKw0KKyMgRG94eWdlbiBzZWxlY3RzIHRoZSBwYXJzZXIgdG8gdXNlIGRlcGVuZGluZyBvbiB0aGUgZXh0ZW5zaW9uIG9mIHRoZSBmaWxlcyBpdA0KKyMgcGFyc2VzLiBXaXRoIHRoaXMgdGFnIHlvdSBjYW4gYXNzaWduIHdoaWNoIHBhcnNlciB0byB1c2UgZm9yIGEgZ2l2ZW4NCisjIGV4dGVuc2lvbi4gRG94eWdlbiBoYXMgYSBidWlsdC1pbiBtYXBwaW5nLCBidXQgeW91IGNhbiBvdmVycmlkZSBvciBleHRlbmQgaXQNCisjIHVzaW5nIHRoaXMgdGFnLiBUaGUgZm9ybWF0IGlzIGV4dD1sYW5ndWFnZSwgd2hlcmUgZXh0IGlzIGEgZmlsZSBleHRlbnNpb24sDQorIyBhbmQgbGFuZ3VhZ2UgaXMgb25lIG9mIHRoZSBwYXJzZXJzIHN1cHBvcnRlZCBieSBkb3h5Z2VuOiBJREwsIEphdmEsDQorIyBKYXZhc2NyaXB0LCBDU2hhcnAsIEMsIEMrKywgRCwgUEhQLCBPYmplY3RpdmUtQywgUHl0aG9uLCBGb3J0cmFuLCBWSERMLCBDLA0KKyMgQysrLiBGb3IgaW5zdGFuY2UgdG8gbWFrZSBkb3h5Z2VuIHRyZWF0IC5pbmMgZmlsZXMgYXMgRm9ydHJhbiBmaWxlcyAoZGVmYXVsdA0KKyMgaXMgUEhQKSwgYW5kIC5mIGZpbGVzIGFzIEMgKGRlZmF1bHQgaXMgRm9ydHJhbiksIHVzZTogaW5jPUZvcnRyYW4gZj1DLiBOb3RlDQorIyB0aGF0IGZvciBjdXN0b20gZXh0ZW5zaW9ucyB5b3UgYWxzbyBuZWVkIHRvIHNldCBGSUxFX1BBVFRFUk5TIG90aGVyd2lzZSB0aGUNCisjIGZpbGVzIGFyZSBub3QgcmVhZCBieSBkb3h5Z2VuLg0KKw0KK0VYVEVOU0lPTl9NQVBQSU5HICAgICAgPQ0KKw0KKyMgSWYgTUFSS0RPV05fU1VQUE9SVCBpcyBlbmFibGVkICh0aGUgZGVmYXVsdCkgdGhlbiBkb3h5Z2VuIHByZS1wcm9jZXNzZXMgYWxsDQorIyBjb21tZW50cyBhY2NvcmRpbmcgdG8gdGhlIE1hcmtkb3duIGZvcm1hdCwgd2hpY2ggYWxsb3dzIGZvciBtb3JlIHJlYWRhYmxlDQorIyBkb2N1bWVudGF0aW9uLiBTZWUgaHR0cDovL2RhcmluZ2ZpcmViYWxsLm5ldC9wcm9qZWN0cy9tYXJrZG93bi8gZm9yIGRldGFpbHMuDQorIyBUaGUgb3V0cHV0IG9mIG1hcmtkb3duIHByb2Nlc3NpbmcgaXMgZnVydGhlciBwcm9jZXNzZWQgYnkgZG94eWdlbiwgc28geW91DQorIyBjYW4gbWl4IGRveHlnZW4sIEhUTUwsIGFuZCBYTUwgY29tbWFuZHMgd2l0aCBNYXJrZG93biBmb3JtYXR0aW5nLg0KKyMgRGlzYWJsZSBvbmx5IGluIGNhc2Ugb2YgYmFja3dhcmQgY29tcGF0aWJpbGl0aWVzIGlzc3Vlcy4NCisNCitNQVJLRE9XTl9TVVBQT1JUICAgICAgID0gWUVTDQorDQorIyBXaGVuIGVuYWJsZWQgZG94eWdlbiB0cmllcyB0byBsaW5rIHdvcmRzIHRoYXQgY29ycmVzcG9uZCB0byBkb2N1bWVudGVkIGNsYXNzZXMsDQorIyBvciBuYW1lc3BhY2VzIHRvIHRoZWlyIGNvcnJlc3BvbmRpbmcgZG9jdW1lbnRhdGlvbi4gU3VjaCBhIGxpbmsgY2FuIGJlDQorIyBwcmV2ZW50ZWQgaW4gaW5kaXZpZHVhbCBjYXNlcyBieSBieSBwdXR0aW5nIGEgJSBzaWduIGluIGZyb250IG9mIHRoZSB3b3JkIG9yDQorIyBnbG9iYWxseSBieSBzZXR0aW5nIEFVVE9MSU5LX1NVUFBPUlQgdG8gTk8uDQorDQorQVVUT0xJTktfU1VQUE9SVCAgICAgICA9IFlFUw0KKw0KKyMgSWYgeW91IHVzZSBTVEwgY2xhc3NlcyAoaS5lLiBzdGQ6OnN0cmluZywgc3RkOjp2ZWN0b3IsIGV0Yy4pIGJ1dCBkbyBub3Qgd2FudA0KKyMgdG8gaW5jbHVkZSAoYSB0YWcgZmlsZSBmb3IpIHRoZSBTVEwgc291cmNlcyBhcyBpbnB1dCwgdGhlbiB5b3Ugc2hvdWxkDQorIyBzZXQgdGhpcyB0YWcgdG8gWUVTIGluIG9yZGVyIHRvIGxldCBkb3h5Z2VuIG1hdGNoIGZ1bmN0aW9ucyBkZWNsYXJhdGlvbnMgYW5kDQorIyBkZWZpbml0aW9ucyB3aG9zZSBhcmd1bWVudHMgY29udGFpbiBTVEwgY2xhc3NlcyAoZS5nLiBmdW5jKHN0ZDo6c3RyaW5nKTsgdi5zLg0KKyMgZnVuYyhzdGQ6OnN0cmluZykge30pLiBUaGlzIGFsc28gbWFrZXMgdGhlIGluaGVyaXRhbmNlIGFuZCBjb2xsYWJvcmF0aW9uDQorIyBkaWFncmFtcyB0aGF0IGludm9sdmUgU1RMIGNsYXNzZXMgbW9yZSBjb21wbGV0ZSBhbmQgYWNjdXJhdGUuDQorDQorQlVJTFRJTl9TVExfU1VQUE9SVCAgICA9IE5PDQorDQorIyBJZiB5b3UgdXNlIE1pY3Jvc29mdCdzIEMrKy9DTEkgbGFuZ3VhZ2UsIHlvdSBzaG91bGQgc2V0IHRoaXMgb3B0aW9uIHRvIFlFUyB0bw0KKyMgZW5hYmxlIHBhcnNpbmcgc3VwcG9ydC4NCisNCitDUFBfQ0xJX1NVUFBPUlQgICAgICAgID0gTk8NCisNCisjIFNldCB0aGUgU0lQX1NVUFBPUlQgdGFnIHRvIFlFUyBpZiB5b3VyIHByb2plY3QgY29uc2lzdHMgb2Ygc2lwIHNvdXJjZXMgb25seS4NCisjIERveHlnZW4gd2lsbCBwYXJzZSB0aGVtIGxpa2Ugbm9ybWFsIEMrKyBidXQgd2lsbCBhc3N1bWUgYWxsIGNsYXNzZXMgdXNlIHB1YmxpYw0KKyMgaW5zdGVhZCBvZiBwcml2YXRlIGluaGVyaXRhbmNlIHdoZW4gbm8gZXhwbGljaXQgcHJvdGVjdGlvbiBrZXl3b3JkIGlzIHByZXNlbnQuDQorDQorU0lQX1NVUFBPUlQgICAgICAgICAgICA9IE5PDQorDQorIyBGb3IgTWljcm9zb2Z0J3MgSURMIHRoZXJlIGFyZSBwcm9wZ2V0IGFuZCBwcm9wcHV0IGF0dHJpYnV0ZXMgdG8NCisjIGluZGljYXRlIGdldHRlciBhbmQgc2V0dGVyIG1ldGhvZHMgZm9yIGEgcHJvcGVydHkuIFNldHRpbmcgdGhpcw0KKyMgb3B0aW9uIHRvIFlFUyAodGhlIGRlZmF1bHQpIHdpbGwgbWFrZSBkb3h5Z2VuIHJlcGxhY2UgdGhlIGdldCBhbmQNCisjIHNldCBtZXRob2RzIGJ5IGEgcHJvcGVydHkgaW4gdGhlIGRvY3VtZW50YXRpb24uIFRoaXMgd2lsbCBvbmx5IHdvcmsNCisjIGlmIHRoZSBtZXRob2RzIGFyZSBpbmRlZWQgZ2V0dGluZyBvciBzZXR0aW5nIGEgc2ltcGxlIHR5cGUuIElmIHRoaXMNCisjIGlzIG5vdCB0aGUgY2FzZSwgb3IgeW91IHdhbnQgdG8gc2hvdyB0aGUgbWV0aG9kcyBhbnl3YXksIHlvdSBzaG91bGQNCisjIHNldCB0aGlzIG9wdGlvbiB0byBOTy4NCisNCitJRExfUFJPUEVSVFlfU1VQUE9SVCAgID0gWUVTDQorDQorIyBJZiBtZW1iZXIgZ3JvdXBpbmcgaXMgdXNlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQgdGhlIERJU1RSSUJVVEVfR1JPVVBfRE9DDQorIyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlbiBkb3h5Z2VuIHdpbGwgcmV1c2UgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIGZpcnN0DQorIyBtZW1iZXIgaW4gdGhlIGdyb3VwIChpZiBhbnkpIGZvciB0aGUgb3RoZXIgbWVtYmVycyBvZiB0aGUgZ3JvdXAuIEJ5IGRlZmF1bHQNCisjIGFsbCBtZW1iZXJzIG9mIGEgZ3JvdXAgbXVzdCBiZSBkb2N1bWVudGVkIGV4cGxpY2l0bHkuDQorDQorRElTVFJJQlVURV9HUk9VUF9ET0MgICA9IE5PDQorDQorIyBTZXQgdGhlIFNVQkdST1VQSU5HIHRhZyB0byBZRVMgKHRoZSBkZWZhdWx0KSB0byBhbGxvdyBjbGFzcyBtZW1iZXIgZ3JvdXBzIG9mDQorIyB0aGUgc2FtZSB0eXBlIChmb3IgaW5zdGFuY2UgYSBncm91cCBvZiBwdWJsaWMgZnVuY3Rpb25zKSB0byBiZSBwdXQgYXMgYQ0KKyMgc3ViZ3JvdXAgb2YgdGhhdCB0eXBlIChlLmcuIHVuZGVyIHRoZSBQdWJsaWMgRnVuY3Rpb25zIHNlY3Rpb24pLiBTZXQgaXQgdG8NCisjIE5PIHRvIHByZXZlbnQgc3ViZ3JvdXBpbmcuIEFsdGVybmF0aXZlbHksIHRoaXMgY2FuIGJlIGRvbmUgcGVyIGNsYXNzIHVzaW5nDQorIyB0aGUgXG5vc3ViZ3JvdXBpbmcgY29tbWFuZC4NCisNCitTVUJHUk9VUElORyAgICAgICAgICAgID0gWUVTDQorDQorIyBXaGVuIHRoZSBJTkxJTkVfR1JPVVBFRF9DTEFTU0VTIHRhZyBpcyBzZXQgdG8gWUVTLCBjbGFzc2VzLCBzdHJ1Y3RzIGFuZA0KKyMgdW5pb25zIGFyZSBzaG93biBpbnNpZGUgdGhlIGdyb3VwIGluIHdoaWNoIHRoZXkgYXJlIGluY2x1ZGVkIChlLmcuIHVzaW5nDQorIyBAaW5ncm91cCkgaW5zdGVhZCBvZiBvbiBhIHNlcGFyYXRlIHBhZ2UgKGZvciBIVE1MIGFuZCBNYW4gcGFnZXMpIG9yDQorIyBzZWN0aW9uIChmb3IgTGFUZVggYW5kIFJURikuDQorDQorSU5MSU5FX0dST1VQRURfQ0xBU1NFUyA9IE5PDQorDQorIyBXaGVuIHRoZSBJTkxJTkVfU0lNUExFX1NUUlVDVFMgdGFnIGlzIHNldCB0byBZRVMsIHN0cnVjdHMsIGNsYXNzZXMsIGFuZA0KKyMgdW5pb25zIHdpdGggb25seSBwdWJsaWMgZGF0YSBmaWVsZHMgd2lsbCBiZSBzaG93biBpbmxpbmUgaW4gdGhlIGRvY3VtZW50YXRpb24NCisjIG9mIHRoZSBzY29wZSBpbiB3aGljaCB0aGV5IGFyZSBkZWZpbmVkIChpLmUuIGZpbGUsIG5hbWVzcGFjZSwgb3IgZ3JvdXANCisjIGRvY3VtZW50YXRpb24pLCBwcm92aWRlZCB0aGlzIHNjb3BlIGlzIGRvY3VtZW50ZWQuIElmIHNldCB0byBOTyAodGhlIGRlZmF1bHQpLA0KKyMgc3RydWN0cywgY2xhc3NlcywgYW5kIHVuaW9ucyBhcmUgc2hvd24gb24gYSBzZXBhcmF0ZSBwYWdlIChmb3IgSFRNTCBhbmQgTWFuDQorIyBwYWdlcykgb3Igc2VjdGlvbiAoZm9yIExhVGVYIGFuZCBSVEYpLg0KKw0KK0lOTElORV9TSU1QTEVfU1RSVUNUUyAgPSBOTw0KKw0KKyMgV2hlbiBUWVBFREVGX0hJREVTX1NUUlVDVCBpcyBlbmFibGVkLCBhIHR5cGVkZWYgb2YgYSBzdHJ1Y3QsIHVuaW9uLCBvciBlbnVtDQorIyBpcyBkb2N1bWVudGVkIGFzIHN0cnVjdCwgdW5pb24sIG9yIGVudW0gd2l0aCB0aGUgbmFtZSBvZiB0aGUgdHlwZWRlZi4gU28NCisjIHR5cGVkZWYgc3RydWN0IFR5cGVTIHt9IFR5cGVULCB3aWxsIGFwcGVhciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhcyBhIHN0cnVjdA0KKyMgd2l0aCBuYW1lIFR5cGVULiBXaGVuIGRpc2FibGVkIHRoZSB0eXBlZGVmIHdpbGwgYXBwZWFyIGFzIGEgbWVtYmVyIG9mIGEgZmlsZSwNCisjIG5hbWVzcGFjZSwgb3IgY2xhc3MuIEFuZCB0aGUgc3RydWN0IHdpbGwgYmUgbmFtZWQgVHlwZVMuIFRoaXMgY2FuIHR5cGljYWxseQ0KKyMgYmUgdXNlZnVsIGZvciBDIGNvZGUgaW4gY2FzZSB0aGUgY29kaW5nIGNvbnZlbnRpb24gZGljdGF0ZXMgdGhhdCBhbGwgY29tcG91bmQNCisjIHR5cGVzIGFyZSB0eXBlZGVmJ2VkIGFuZCBvbmx5IHRoZSB0eXBlZGVmIGlzIHJlZmVyZW5jZWQsIG5ldmVyIHRoZSB0YWcgbmFtZS4NCisNCitUWVBFREVGX0hJREVTX1NUUlVDVCAgID0gTk8NCisNCisjIFRoZSBTWU1CT0xfQ0FDSEVfU0laRSBkZXRlcm1pbmVzIHRoZSBzaXplIG9mIHRoZSBpbnRlcm5hbCBjYWNoZSB1c2UgdG8NCisjIGRldGVybWluZSB3aGljaCBzeW1ib2xzIHRvIGtlZXAgaW4gbWVtb3J5IGFuZCB3aGljaCB0byBmbHVzaCB0byBkaXNrLg0KKyMgV2hlbiB0aGUgY2FjaGUgaXMgZnVsbCwgbGVzcyBvZnRlbiB1c2VkIHN5bWJvbHMgd2lsbCBiZSB3cml0dGVuIHRvIGRpc2suDQorIyBGb3Igc21hbGwgdG8gbWVkaXVtIHNpemUgcHJvamVjdHMgKDwxMDAwIGlucHV0IGZpbGVzKSB0aGUgZGVmYXVsdCB2YWx1ZSBpcw0KKyMgcHJvYmFibHkgZ29vZCBlbm91Z2guIEZvciBsYXJnZXIgcHJvamVjdHMgYSB0b28gc21hbGwgY2FjaGUgc2l6ZSBjYW4gY2F1c2UNCisjIGRveHlnZW4gdG8gYmUgYnVzeSBzd2FwcGluZyBzeW1ib2xzIHRvIGFuZCBmcm9tIGRpc2sgbW9zdCBvZiB0aGUgdGltZQ0KKyMgY2F1c2luZyBhIHNpZ25pZmljYW50IHBlcmZvcm1hbmNlIHBlbmFsdHkuDQorIyBJZiB0aGUgc3lzdGVtIGhhcyBlbm91Z2ggcGh5c2ljYWwgbWVtb3J5IGluY3JlYXNpbmcgdGhlIGNhY2hlIHdpbGwgaW1wcm92ZSB0aGUNCisjIHBlcmZvcm1hbmNlIGJ5IGtlZXBpbmcgbW9yZSBzeW1ib2xzIGluIG1lbW9yeS4gTm90ZSB0aGF0IHRoZSB2YWx1ZSB3b3JrcyBvbg0KKyMgYSBsb2dhcml0aG1pYyBzY2FsZSBzbyBpbmNyZWFzaW5nIHRoZSBzaXplIGJ5IG9uZSB3aWxsIHJvdWdobHkgZG91YmxlIHRoZQ0KKyMgbWVtb3J5IHVzYWdlLiBUaGUgY2FjaGUgc2l6ZSBpcyBnaXZlbiBieSB0aGlzIGZvcm11bGE6DQorIyAyXigxNitTWU1CT0xfQ0FDSEVfU0laRSkuIFRoZSB2YWxpZCByYW5nZSBpcyAwLi45LCB0aGUgZGVmYXVsdCBpcyAwLA0KKyMgY29ycmVzcG9uZGluZyB0byBhIGNhY2hlIHNpemUgb2YgMl4xNiA9IDY1NTM2IHN5bWJvbHMuDQorDQorU1lNQk9MX0NBQ0hFX1NJWkUgICAgICA9IDANCisNCisjIFNpbWlsYXIgdG8gdGhlIFNZTUJPTF9DQUNIRV9TSVpFIHRoZSBzaXplIG9mIHRoZSBzeW1ib2wgbG9va3VwIGNhY2hlIGNhbiBiZQ0KKyMgc2V0IHVzaW5nIExPT0tVUF9DQUNIRV9TSVpFLiBUaGlzIGNhY2hlIGlzIHVzZWQgdG8gcmVzb2x2ZSBzeW1ib2xzIGdpdmVuDQorIyB0aGVpciBuYW1lIGFuZCBzY29wZS4gU2luY2UgdGhpcyBjYW4gYmUgYW4gZXhwZW5zaXZlIHByb2Nlc3MgYW5kIG9mdGVuIHRoZQ0KKyMgc2FtZSBzeW1ib2wgYXBwZWFyIG11bHRpcGxlIHRpbWVzIGluIHRoZSBjb2RlLCBkb3h5Z2VuIGtlZXBzIGEgY2FjaGUgb2YNCisjIHByZS1yZXNvbHZlZCBzeW1ib2xzLiBJZiB0aGUgY2FjaGUgaXMgdG9vIHNtYWxsIGRveHlnZW4gd2lsbCBiZWNvbWUgc2xvd2VyLg0KKyMgSWYgdGhlIGNhY2hlIGlzIHRvbyBsYXJnZSwgbWVtb3J5IGlzIHdhc3RlZC4gVGhlIGNhY2hlIHNpemUgaXMgZ2l2ZW4gYnkgdGhpcw0KKyMgZm9ybXVsYTogMl4oMTYrTE9PS1VQX0NBQ0hFX1NJWkUpLiBUaGUgdmFsaWQgcmFuZ2UgaXMgMC4uOSwgdGhlIGRlZmF1bHQgaXMgMCwNCisjIGNvcnJlc3BvbmRpbmcgdG8gYSBjYWNoZSBzaXplIG9mIDJeMTYgPSA2NTUzNiBzeW1ib2xzLg0KKw0KK0xPT0tVUF9DQUNIRV9TSVpFICAgICAgPSAwDQorDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyMgQnVpbGQgcmVsYXRlZCBjb25maWd1cmF0aW9uIG9wdGlvbnMNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorIyBJZiB0aGUgRVhUUkFDVF9BTEwgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGFzc3VtZSBhbGwgZW50aXRpZXMgaW4NCisjIGRvY3VtZW50YXRpb24gYXJlIGRvY3VtZW50ZWQsIGV2ZW4gaWYgbm8gZG9jdW1lbnRhdGlvbiB3YXMgYXZhaWxhYmxlLg0KKyMgUHJpdmF0ZSBjbGFzcyBtZW1iZXJzIGFuZCBzdGF0aWMgZmlsZSBtZW1iZXJzIHdpbGwgYmUgaGlkZGVuIHVubGVzcw0KKyMgdGhlIEVYVFJBQ1RfUFJJVkFURSBhbmQgRVhUUkFDVF9TVEFUSUMgdGFncyBhcmUgc2V0IHRvIFlFUw0KKw0KK0VYVFJBQ1RfQUxMICAgICAgICAgICAgPSBOTw0KKw0KKyMgSWYgdGhlIEVYVFJBQ1RfUFJJVkFURSB0YWcgaXMgc2V0IHRvIFlFUyBhbGwgcHJpdmF0ZSBtZW1iZXJzIG9mIGEgY2xhc3MNCisjIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uDQorDQorRVhUUkFDVF9QUklWQVRFICAgICAgICA9IFlFUw0KKw0KKyMgSWYgdGhlIEVYVFJBQ1RfUEFDS0FHRSB0YWcgaXMgc2V0IHRvIFlFUyBhbGwgbWVtYmVycyB3aXRoIHBhY2thZ2Ugb3IgaW50ZXJuYWwNCisjIHNjb3BlIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uDQorDQorRVhUUkFDVF9QQUNLQUdFICAgICAgICA9IE5PDQorDQorIyBJZiB0aGUgRVhUUkFDVF9TVEFUSUMgdGFnIGlzIHNldCB0byBZRVMgYWxsIHN0YXRpYyBtZW1iZXJzIG9mIGEgZmlsZQ0KKyMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4NCisNCitFWFRSQUNUX1NUQVRJQyAgICAgICAgID0gWUVTDQorDQorIyBJZiB0aGUgRVhUUkFDVF9MT0NBTF9DTEFTU0VTIHRhZyBpcyBzZXQgdG8gWUVTIGNsYXNzZXMgKGFuZCBzdHJ1Y3RzKQ0KKyMgZGVmaW5lZCBsb2NhbGx5IGluIHNvdXJjZSBmaWxlcyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLg0KKyMgSWYgc2V0IHRvIE5PIG9ubHkgY2xhc3NlcyBkZWZpbmVkIGluIGhlYWRlciBmaWxlcyBhcmUgaW5jbHVkZWQuDQorDQorRVhUUkFDVF9MT0NBTF9DTEFTU0VTICA9IFlFUw0KKw0KKyMgVGhpcyBmbGFnIGlzIG9ubHkgdXNlZnVsIGZvciBPYmplY3RpdmUtQyBjb2RlLiBXaGVuIHNldCB0byBZRVMgbG9jYWwNCisjIG1ldGhvZHMsIHdoaWNoIGFyZSBkZWZpbmVkIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBzZWN0aW9uIGJ1dCBub3QgaW4NCisjIHRoZSBpbnRlcmZhY2UgYXJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLg0KKyMgSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkgb25seSBtZXRob2RzIGluIHRoZSBpbnRlcmZhY2UgYXJlIGluY2x1ZGVkLg0KKw0KK0VYVFJBQ1RfTE9DQUxfTUVUSE9EUyAgPSBOTw0KKw0KKyMgSWYgdGhpcyBmbGFnIGlzIHNldCB0byBZRVMsIHRoZSBtZW1iZXJzIG9mIGFub255bW91cyBuYW1lc3BhY2VzIHdpbGwgYmUNCisjIGV4dHJhY3RlZCBhbmQgYXBwZWFyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFzIGEgbmFtZXNwYWNlIGNhbGxlZA0KKyMgJ2Fub255bW91c19uYW1lc3BhY2V7ZmlsZX0nLCB3aGVyZSBmaWxlIHdpbGwgYmUgcmVwbGFjZWQgd2l0aCB0aGUgYmFzZQ0KKyMgbmFtZSBvZiB0aGUgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBhbm9ueW1vdXMgbmFtZXNwYWNlLiBCeSBkZWZhdWx0DQorIyBhbm9ueW1vdXMgbmFtZXNwYWNlcyBhcmUgaGlkZGVuLg0KKw0KK0VYVFJBQ1RfQU5PTl9OU1BBQ0VTICAgPSBOTw0KKw0KKyMgSWYgdGhlIEhJREVfVU5ET0NfTUVNQkVSUyB0YWcgaXMgc2V0IHRvIFlFUywgRG94eWdlbiB3aWxsIGhpZGUgYWxsDQorIyB1bmRvY3VtZW50ZWQgbWVtYmVycyBvZiBkb2N1bWVudGVkIGNsYXNzZXMsIGZpbGVzIG9yIG5hbWVzcGFjZXMuDQorIyBJZiBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KSB0aGVzZSBtZW1iZXJzIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlDQorIyB2YXJpb3VzIG92ZXJ2aWV3cywgYnV0IG5vIGRvY3VtZW50YXRpb24gc2VjdGlvbiBpcyBnZW5lcmF0ZWQuDQorIyBUaGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0IGlmIEVYVFJBQ1RfQUxMIGlzIGVuYWJsZWQuDQorDQorSElERV9VTkRPQ19NRU1CRVJTICAgICA9IFlFUw0KKw0KKyMgSWYgdGhlIEhJREVfVU5ET0NfQ0xBU1NFUyB0YWcgaXMgc2V0IHRvIFlFUywgRG94eWdlbiB3aWxsIGhpZGUgYWxsDQorIyB1bmRvY3VtZW50ZWQgY2xhc3NlcyB0aGF0IGFyZSBub3JtYWxseSB2aXNpYmxlIGluIHRoZSBjbGFzcyBoaWVyYXJjaHkuDQorIyBJZiBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KSB0aGVzZSBjbGFzc2VzIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIHZhcmlvdXMNCisjIG92ZXJ2aWV3cy4gVGhpcyBvcHRpb24gaGFzIG5vIGVmZmVjdCBpZiBFWFRSQUNUX0FMTCBpcyBlbmFibGVkLg0KKw0KK0hJREVfVU5ET0NfQ0xBU1NFUyAgICAgPSBZRVMNCisNCisjIElmIHRoZSBISURFX0ZSSUVORF9DT01QT1VORFMgdGFnIGlzIHNldCB0byBZRVMsIERveHlnZW4gd2lsbCBoaWRlIGFsbA0KKyMgZnJpZW5kIChjbGFzc3xzdHJ1Y3R8dW5pb24pIGRlY2xhcmF0aW9ucy4NCisjIElmIHNldCB0byBOTyAodGhlIGRlZmF1bHQpIHRoZXNlIGRlY2xhcmF0aW9ucyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZQ0KKyMgZG9jdW1lbnRhdGlvbi4NCisNCitISURFX0ZSSUVORF9DT01QT1VORFMgID0gTk8NCisNCisjIElmIHRoZSBISURFX0lOX0JPRFlfRE9DUyB0YWcgaXMgc2V0IHRvIFlFUywgRG94eWdlbiB3aWxsIGhpZGUgYW55DQorIyBkb2N1bWVudGF0aW9uIGJsb2NrcyBmb3VuZCBpbnNpZGUgdGhlIGJvZHkgb2YgYSBmdW5jdGlvbi4NCisjIElmIHNldCB0byBOTyAodGhlIGRlZmF1bHQpIHRoZXNlIGJsb2NrcyB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZQ0KKyMgZnVuY3Rpb24ncyBkZXRhaWxlZCBkb2N1bWVudGF0aW9uIGJsb2NrLg0KKw0KK0hJREVfSU5fQk9EWV9ET0NTICAgICAgPSBOTw0KKw0KKyMgVGhlIElOVEVSTkFMX0RPQ1MgdGFnIGRldGVybWluZXMgaWYgZG9jdW1lbnRhdGlvbg0KKyMgdGhhdCBpcyB0eXBlZCBhZnRlciBhIFxpbnRlcm5hbCBjb21tYW5kIGlzIGluY2x1ZGVkLiBJZiB0aGUgdGFnIGlzIHNldA0KKyMgdG8gTk8gKHRoZSBkZWZhdWx0KSB0aGVuIHRoZSBkb2N1bWVudGF0aW9uIHdpbGwgYmUgZXhjbHVkZWQuDQorIyBTZXQgaXQgdG8gWUVTIHRvIGluY2x1ZGUgdGhlIGludGVybmFsIGRvY3VtZW50YXRpb24uDQorDQorSU5URVJOQUxfRE9DUyAgICAgICAgICA9IE5PDQorDQorIyBJZiB0aGUgQ0FTRV9TRU5TRV9OQU1FUyB0YWcgaXMgc2V0IHRvIE5PIHRoZW4gRG94eWdlbiB3aWxsIG9ubHkgZ2VuZXJhdGUNCisjIGZpbGUgbmFtZXMgaW4gbG93ZXItY2FzZSBsZXR0ZXJzLiBJZiBzZXQgdG8gWUVTIHVwcGVyLWNhc2UgbGV0dGVycyBhcmUgYWxzbw0KKyMgYWxsb3dlZC4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IGhhdmUgY2xhc3NlcyBvciBmaWxlcyB3aG9zZSBuYW1lcyBvbmx5IGRpZmZlcg0KKyMgaW4gY2FzZSBhbmQgaWYgeW91ciBmaWxlIHN5c3RlbSBzdXBwb3J0cyBjYXNlIHNlbnNpdGl2ZSBmaWxlIG5hbWVzLiBXaW5kb3dzDQorIyBhbmQgTWFjIHVzZXJzIGFyZSBhZHZpc2VkIHRvIHNldCB0aGlzIG9wdGlvbiB0byBOTy4NCisNCitDQVNFX1NFTlNFX05BTUVTICAgICAgID0gWUVTDQorDQorIyBJZiB0aGUgSElERV9TQ09QRV9OQU1FUyB0YWcgaXMgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkgdGhlbiBEb3h5Z2VuDQorIyB3aWxsIHNob3cgbWVtYmVycyB3aXRoIHRoZWlyIGZ1bGwgY2xhc3MgYW5kIG5hbWVzcGFjZSBzY29wZXMgaW4gdGhlDQorIyBkb2N1bWVudGF0aW9uLiBJZiBzZXQgdG8gWUVTIHRoZSBzY29wZSB3aWxsIGJlIGhpZGRlbi4NCisNCitISURFX1NDT1BFX05BTUVTICAgICAgID0gTk8NCisNCisjIElmIHRoZSBTSE9XX0lOQ0xVREVfRklMRVMgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSB0aGVuIERveHlnZW4NCisjIHdpbGwgcHV0IGEgbGlzdCBvZiB0aGUgZmlsZXMgdGhhdCBhcmUgaW5jbHVkZWQgYnkgYSBmaWxlIGluIHRoZSBkb2N1bWVudGF0aW9uDQorIyBvZiB0aGF0IGZpbGUuDQorDQorU0hPV19JTkNMVURFX0ZJTEVTICAgICA9IFlFUw0KKw0KKyMgSWYgdGhlIEZPUkNFX0xPQ0FMX0lOQ0xVREVTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gRG94eWdlbg0KKyMgd2lsbCBsaXN0IGluY2x1ZGUgZmlsZXMgd2l0aCBkb3VibGUgcXVvdGVzIGluIHRoZSBkb2N1bWVudGF0aW9uDQorIyByYXRoZXIgdGhhbiB3aXRoIHNoYXJwIGJyYWNrZXRzLg0KKw0KK0ZPUkNFX0xPQ0FMX0lOQ0xVREVTICAgPSBOTw0KKw0KKyMgSWYgdGhlIElOTElORV9JTkZPIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgdGhlbiBhIHRhZyBbaW5saW5lXQ0KKyMgaXMgaW5zZXJ0ZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gZm9yIGlubGluZSBtZW1iZXJzLg0KKw0KK0lOTElORV9JTkZPICAgICAgICAgICAgPSBZRVMNCisNCisjIElmIHRoZSBTT1JUX01FTUJFUl9ET0NTIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgdGhlbiBkb3h5Z2VuDQorIyB3aWxsIHNvcnQgdGhlIChkZXRhaWxlZCkgZG9jdW1lbnRhdGlvbiBvZiBmaWxlIGFuZCBjbGFzcyBtZW1iZXJzDQorIyBhbHBoYWJldGljYWxseSBieSBtZW1iZXIgbmFtZS4gSWYgc2V0IHRvIE5PIHRoZSBtZW1iZXJzIHdpbGwgYXBwZWFyIGluDQorIyBkZWNsYXJhdGlvbiBvcmRlci4NCisNCitTT1JUX01FTUJFUl9ET0NTICAgICAgID0gWUVTDQorDQorIyBJZiB0aGUgU09SVF9CUklFRl9ET0NTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIHNvcnQgdGhlDQorIyBicmllZiBkb2N1bWVudGF0aW9uIG9mIGZpbGUsIG5hbWVzcGFjZSBhbmQgY2xhc3MgbWVtYmVycyBhbHBoYWJldGljYWxseQ0KKyMgYnkgbWVtYmVyIG5hbWUuIElmIHNldCB0byBOTyAodGhlIGRlZmF1bHQpIHRoZSBtZW1iZXJzIHdpbGwgYXBwZWFyIGluDQorIyBkZWNsYXJhdGlvbiBvcmRlci4NCisNCitTT1JUX0JSSUVGX0RPQ1MgICAgICAgID0gTk8NCisNCisjIElmIHRoZSBTT1JUX01FTUJFUlNfQ1RPUlNfMVNUIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbg0KKyMgd2lsbCBzb3J0IHRoZSAoYnJpZWYgYW5kIGRldGFpbGVkKSBkb2N1bWVudGF0aW9uIG9mIGNsYXNzIG1lbWJlcnMgc28gdGhhdA0KKyMgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycyBhcmUgbGlzdGVkIGZpcnN0LiBJZiBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KQ0KKyMgdGhlIGNvbnN0cnVjdG9ycyB3aWxsIGFwcGVhciBpbiB0aGUgcmVzcGVjdGl2ZSBvcmRlcnMgZGVmaW5lZCBieQ0KKyMgU09SVF9NRU1CRVJfRE9DUyBhbmQgU09SVF9CUklFRl9ET0NTLg0KKyMgVGhpcyB0YWcgd2lsbCBiZSBpZ25vcmVkIGZvciBicmllZiBkb2NzIGlmIFNPUlRfQlJJRUZfRE9DUyBpcyBzZXQgdG8gTk8NCisjIGFuZCBpZ25vcmVkIGZvciBkZXRhaWxlZCBkb2NzIGlmIFNPUlRfTUVNQkVSX0RPQ1MgaXMgc2V0IHRvIE5PLg0KKw0KK1NPUlRfTUVNQkVSU19DVE9SU18xU1QgPSBOTw0KKw0KKyMgSWYgdGhlIFNPUlRfR1JPVVBfTkFNRVMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgc29ydCB0aGUNCisjIGhpZXJhcmNoeSBvZiBncm91cCBuYW1lcyBpbnRvIGFscGhhYmV0aWNhbCBvcmRlci4gSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkNCisjIHRoZSBncm91cCBuYW1lcyB3aWxsIGFwcGVhciBpbiB0aGVpciBkZWZpbmVkIG9yZGVyLg0KKw0KK1NPUlRfR1JPVVBfTkFNRVMgICAgICAgPSBOTw0KKw0KKyMgSWYgdGhlIFNPUlRfQllfU0NPUEVfTkFNRSB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIGNsYXNzIGxpc3Qgd2lsbCBiZQ0KKyMgc29ydGVkIGJ5IGZ1bGx5LXF1YWxpZmllZCBuYW1lcywgaW5jbHVkaW5nIG5hbWVzcGFjZXMuIElmIHNldCB0bw0KKyMgTk8gKHRoZSBkZWZhdWx0KSwgdGhlIGNsYXNzIGxpc3Qgd2lsbCBiZSBzb3J0ZWQgb25seSBieSBjbGFzcyBuYW1lLA0KKyMgbm90IGluY2x1ZGluZyB0aGUgbmFtZXNwYWNlIHBhcnQuDQorIyBOb3RlOiBUaGlzIG9wdGlvbiBpcyBub3QgdmVyeSB1c2VmdWwgaWYgSElERV9TQ09QRV9OQU1FUyBpcyBzZXQgdG8gWUVTLg0KKyMgTm90ZTogVGhpcyBvcHRpb24gYXBwbGllcyBvbmx5IHRvIHRoZSBjbGFzcyBsaXN0LCBub3QgdG8gdGhlDQorIyBhbHBoYWJldGljYWwgbGlzdC4NCisNCitTT1JUX0JZX1NDT1BFX05BTUUgICAgID0gTk8NCisNCisjIElmIHRoZSBTVFJJQ1RfUFJPVE9fTUFUQ0hJTkcgb3B0aW9uIGlzIGVuYWJsZWQgYW5kIGRveHlnZW4gZmFpbHMgdG8NCisjIGRvIHByb3BlciB0eXBlIHJlc29sdXRpb24gb2YgYWxsIHBhcmFtZXRlcnMgb2YgYSBmdW5jdGlvbiBpdCB3aWxsIHJlamVjdCBhDQorIyBtYXRjaCBiZXR3ZWVuIHRoZSBwcm90b3R5cGUgYW5kIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBhIG1lbWJlciBmdW5jdGlvbiBldmVuDQorIyBpZiB0aGVyZSBpcyBvbmx5IG9uZSBjYW5kaWRhdGUgb3IgaXQgaXMgb2J2aW91cyB3aGljaCBjYW5kaWRhdGUgdG8gY2hvb3NlDQorIyBieSBkb2luZyBhIHNpbXBsZSBzdHJpbmcgbWF0Y2guIEJ5IGRpc2FibGluZyBTVFJJQ1RfUFJPVE9fTUFUQ0hJTkcgZG94eWdlbg0KKyMgd2lsbCBzdGlsbCBhY2NlcHQgYSBtYXRjaCBiZXR3ZWVuIHByb3RvdHlwZSBhbmQgaW1wbGVtZW50YXRpb24gaW4gc3VjaCBjYXNlcy4NCisNCitTVFJJQ1RfUFJPVE9fTUFUQ0hJTkcgID0gTk8NCisNCisjIFRoZSBHRU5FUkFURV9UT0RPTElTVCB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlIChZRVMpIG9yDQorIyBkaXNhYmxlIChOTykgdGhlIHRvZG8gbGlzdC4gVGhpcyBsaXN0IGlzIGNyZWF0ZWQgYnkgcHV0dGluZyBcdG9kbw0KKyMgY29tbWFuZHMgaW4gdGhlIGRvY3VtZW50YXRpb24uDQorDQorR0VORVJBVEVfVE9ET0xJU1QgICAgICA9IFlFUw0KKw0KKyMgVGhlIEdFTkVSQVRFX1RFU1RMSVNUIHRhZyBjYW4gYmUgdXNlZCB0byBlbmFibGUgKFlFUykgb3INCisjIGRpc2FibGUgKE5PKSB0aGUgdGVzdCBsaXN0LiBUaGlzIGxpc3QgaXMgY3JlYXRlZCBieSBwdXR0aW5nIFx0ZXN0DQorIyBjb21tYW5kcyBpbiB0aGUgZG9jdW1lbnRhdGlvbi4NCisNCitHRU5FUkFURV9URVNUTElTVCAgICAgID0gWUVTDQorDQorIyBUaGUgR0VORVJBVEVfQlVHTElTVCB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlIChZRVMpIG9yDQorIyBkaXNhYmxlIChOTykgdGhlIGJ1ZyBsaXN0LiBUaGlzIGxpc3QgaXMgY3JlYXRlZCBieSBwdXR0aW5nIFxidWcNCisjIGNvbW1hbmRzIGluIHRoZSBkb2N1bWVudGF0aW9uLg0KKw0KK0dFTkVSQVRFX0JVR0xJU1QgICAgICAgPSBZRVMNCisNCisjIFRoZSBHRU5FUkFURV9ERVBSRUNBVEVETElTVCB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlIChZRVMpIG9yDQorIyBkaXNhYmxlIChOTykgdGhlIGRlcHJlY2F0ZWQgbGlzdC4gVGhpcyBsaXN0IGlzIGNyZWF0ZWQgYnkgcHV0dGluZw0KKyMgXGRlcHJlY2F0ZWQgY29tbWFuZHMgaW4gdGhlIGRvY3VtZW50YXRpb24uDQorDQorR0VORVJBVEVfREVQUkVDQVRFRExJU1Q9IFlFUw0KKw0KKyMgVGhlIEVOQUJMRURfU0VDVElPTlMgdGFnIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSBjb25kaXRpb25hbA0KKyMgZG9jdW1lbnRhdGlvbiBzZWN0aW9ucywgbWFya2VkIGJ5IFxpZiBzZWN0aW9ubmFtZSAuLi4gXGVuZGlmLg0KKw0KK0VOQUJMRURfU0VDVElPTlMgICAgICAgPQ0KKw0KKyMgVGhlIE1BWF9JTklUSUFMSVpFUl9MSU5FUyB0YWcgZGV0ZXJtaW5lcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgbGluZXMNCisjIHRoZSBpbml0aWFsIHZhbHVlIG9mIGEgdmFyaWFibGUgb3IgbWFjcm8gY29uc2lzdHMgb2YgZm9yIGl0IHRvIGFwcGVhciBpbg0KKyMgdGhlIGRvY3VtZW50YXRpb24uIElmIHRoZSBpbml0aWFsaXplciBjb25zaXN0cyBvZiBtb3JlIGxpbmVzIHRoYW4gc3BlY2lmaWVkDQorIyBoZXJlIGl0IHdpbGwgYmUgaGlkZGVuLiBVc2UgYSB2YWx1ZSBvZiAwIHRvIGhpZGUgaW5pdGlhbGl6ZXJzIGNvbXBsZXRlbHkuDQorIyBUaGUgYXBwZWFyYW5jZSBvZiB0aGUgaW5pdGlhbGl6ZXIgb2YgaW5kaXZpZHVhbCB2YXJpYWJsZXMgYW5kIG1hY3JvcyBpbiB0aGUNCisjIGRvY3VtZW50YXRpb24gY2FuIGJlIGNvbnRyb2xsZWQgdXNpbmcgXHNob3dpbml0aWFsaXplciBvciBcaGlkZWluaXRpYWxpemVyDQorIyBjb21tYW5kIGluIHRoZSBkb2N1bWVudGF0aW9uIHJlZ2FyZGxlc3Mgb2YgdGhpcyBzZXR0aW5nLg0KKw0KK01BWF9JTklUSUFMSVpFUl9MSU5FUyAgPSAzMA0KKw0KKyMgU2V0IHRoZSBTSE9XX1VTRURfRklMRVMgdGFnIHRvIE5PIHRvIGRpc2FibGUgdGhlIGxpc3Qgb2YgZmlsZXMgZ2VuZXJhdGVkDQorIyBhdCB0aGUgYm90dG9tIG9mIHRoZSBkb2N1bWVudGF0aW9uIG9mIGNsYXNzZXMgYW5kIHN0cnVjdHMuIElmIHNldCB0byBZRVMgdGhlDQorIyBsaXN0IHdpbGwgbWVudGlvbiB0aGUgZmlsZXMgdGhhdCB3ZXJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGRvY3VtZW50YXRpb24uDQorDQorU0hPV19VU0VEX0ZJTEVTICAgICAgICA9IFlFUw0KKw0KKyMgU2V0IHRoZSBTSE9XX0ZJTEVTIHRhZyB0byBOTyB0byBkaXNhYmxlIHRoZSBnZW5lcmF0aW9uIG9mIHRoZSBGaWxlcyBwYWdlLg0KKyMgVGhpcyB3aWxsIHJlbW92ZSB0aGUgRmlsZXMgZW50cnkgZnJvbSB0aGUgUXVpY2sgSW5kZXggYW5kIGZyb20gdGhlDQorIyBGb2xkZXIgVHJlZSBWaWV3IChpZiBzcGVjaWZpZWQpLiBUaGUgZGVmYXVsdCBpcyBZRVMuDQorDQorIyBXZSBwcm9iYWJseSB3aWxsIHdhbnQgdGhpcywgYnV0IHdlIGhhdmUgbm8gZmlsZSBkb2N1bWVudGF0aW9uIHlldCBzbyBpdCdzIHNpbXBsZXIgdG8gcmVtb3ZlDQorIyBpdCBmb3Igbm93Lg0KK1NIT1dfRklMRVMgICAgICAgICAgICAgPSBOTw0KKw0KKyMgU2V0IHRoZSBTSE9XX05BTUVTUEFDRVMgdGFnIHRvIE5PIHRvIGRpc2FibGUgdGhlIGdlbmVyYXRpb24gb2YgdGhlDQorIyBOYW1lc3BhY2VzIHBhZ2UuDQorIyBUaGlzIHdpbGwgcmVtb3ZlIHRoZSBOYW1lc3BhY2VzIGVudHJ5IGZyb20gdGhlIFF1aWNrIEluZGV4DQorIyBhbmQgZnJvbSB0aGUgRm9sZGVyIFRyZWUgVmlldyAoaWYgc3BlY2lmaWVkKS4gVGhlIGRlZmF1bHQgaXMgWUVTLg0KKw0KK1NIT1dfTkFNRVNQQUNFUyAgICAgICAgPSBZRVMNCisNCisjIFRoZSBGSUxFX1ZFUlNJT05fRklMVEVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcHJvZ3JhbSBvciBzY3JpcHQgdGhhdA0KKyMgZG94eWdlbiBzaG91bGQgaW52b2tlIHRvIGdldCB0aGUgY3VycmVudCB2ZXJzaW9uIGZvciBlYWNoIGZpbGUgKHR5cGljYWxseSBmcm9tDQorIyB0aGUgdmVyc2lvbiBjb250cm9sIHN5c3RlbSkuIERveHlnZW4gd2lsbCBpbnZva2UgdGhlIHByb2dyYW0gYnkgZXhlY3V0aW5nICh2aWENCisjIHBvcGVuKCkpIHRoZSBjb21tYW5kIDxjb21tYW5kPiA8aW5wdXQtZmlsZT4sIHdoZXJlIDxjb21tYW5kPiBpcyB0aGUgdmFsdWUgb2YNCisjIHRoZSBGSUxFX1ZFUlNJT05fRklMVEVSIHRhZywgYW5kIDxpbnB1dC1maWxlPiBpcyB0aGUgbmFtZSBvZiBhbiBpbnB1dCBmaWxlDQorIyBwcm92aWRlZCBieSBkb3h5Z2VuLiBXaGF0ZXZlciB0aGUgcHJvZ3JhbSB3cml0ZXMgdG8gc3RhbmRhcmQgb3V0cHV0DQorIyBpcyB1c2VkIGFzIHRoZSBmaWxlIHZlcnNpb24uIFNlZSB0aGUgbWFudWFsIGZvciBleGFtcGxlcy4NCisNCitGSUxFX1ZFUlNJT05fRklMVEVSICAgID0NCisNCisjIFRoZSBMQVlPVVRfRklMRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIGxheW91dCBmaWxlIHdoaWNoIHdpbGwgYmUgcGFyc2VkDQorIyBieSBkb3h5Z2VuLiBUaGUgbGF5b3V0IGZpbGUgY29udHJvbHMgdGhlIGdsb2JhbCBzdHJ1Y3R1cmUgb2YgdGhlIGdlbmVyYXRlZA0KKyMgb3V0cHV0IGZpbGVzIGluIGFuIG91dHB1dCBmb3JtYXQgaW5kZXBlbmRlbnQgd2F5LiBUbyBjcmVhdGUgdGhlIGxheW91dCBmaWxlDQorIyB0aGF0IHJlcHJlc2VudHMgZG94eWdlbidzIGRlZmF1bHRzLCBydW4gZG94eWdlbiB3aXRoIHRoZSAtbCBvcHRpb24uDQorIyBZb3UgY2FuIG9wdGlvbmFsbHkgc3BlY2lmeSBhIGZpbGUgbmFtZSBhZnRlciB0aGUgb3B0aW9uLCBpZiBvbWl0dGVkDQorIyBEb3h5Z2VuTGF5b3V0LnhtbCB3aWxsIGJlIHVzZWQgYXMgdGhlIG5hbWUgb2YgdGhlIGxheW91dCBmaWxlLg0KKw0KK0xBWU9VVF9GSUxFICAgICAgICAgICAgPQ0KKw0KKyMgVGhlIENJVEVfQklCX0ZJTEVTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGJpYiBmaWxlcw0KKyMgY29udGFpbmluZyB0aGUgcmVmZXJlbmNlcyBkYXRhLiBUaGlzIG11c3QgYmUgYSBsaXN0IG9mIC5iaWIgZmlsZXMuIFRoZQ0KKyMgLmJpYiBleHRlbnNpb24gaXMgYXV0b21hdGljYWxseSBhcHBlbmRlZCBpZiBvbWl0dGVkLiBVc2luZyB0aGlzIGNvbW1hbmQNCisjIHJlcXVpcmVzIHRoZSBiaWJ0ZXggdG9vbCB0byBiZSBpbnN0YWxsZWQuIFNlZSBhbHNvDQorIyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0JpYlRlWCBmb3IgbW9yZSBpbmZvLiBGb3IgTGFUZVggdGhlIHN0eWxlDQorIyBvZiB0aGUgYmlibGlvZ3JhcGh5IGNhbiBiZSBjb250cm9sbGVkIHVzaW5nIExBVEVYX0JJQl9TVFlMRS4gVG8gdXNlIHRoaXMNCisjIGZlYXR1cmUgeW91IG5lZWQgYmlidGV4IGFuZCBwZXJsIGF2YWlsYWJsZSBpbiB0aGUgc2VhcmNoIHBhdGguDQorDQorQ0lURV9CSUJfRklMRVMgICAgICAgICA9DQorDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gd2FybmluZyBhbmQgcHJvZ3Jlc3MgbWVzc2FnZXMNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorIyBUaGUgUVVJRVQgdGFnIGNhbiBiZSB1c2VkIHRvIHR1cm4gb24vb2ZmIHRoZSBtZXNzYWdlcyB0aGF0IGFyZSBnZW5lcmF0ZWQNCisjIGJ5IGRveHlnZW4uIFBvc3NpYmxlIHZhbHVlcyBhcmUgWUVTIGFuZCBOTy4gSWYgbGVmdCBibGFuayBOTyBpcyB1c2VkLg0KKw0KK1FVSUVUICAgICAgICAgICAgICAgICAgPSBOTw0KKw0KKyMgVGhlIFdBUk5JTkdTIHRhZyBjYW4gYmUgdXNlZCB0byB0dXJuIG9uL29mZiB0aGUgd2FybmluZyBtZXNzYWdlcyB0aGF0IGFyZQ0KKyMgZ2VuZXJhdGVkIGJ5IGRveHlnZW4uIFBvc3NpYmxlIHZhbHVlcyBhcmUgWUVTIGFuZCBOTy4gSWYgbGVmdCBibGFuaw0KKyMgTk8gaXMgdXNlZC4NCisNCitXQVJOSU5HUyAgICAgICAgICAgICAgID0gWUVTDQorDQorIyBJZiBXQVJOX0lGX1VORE9DVU1FTlRFRCBpcyBzZXQgdG8gWUVTLCB0aGVuIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSB3YXJuaW5ncw0KKyMgZm9yIHVuZG9jdW1lbnRlZCBtZW1iZXJzLiBJZiBFWFRSQUNUX0FMTCBpcyBzZXQgdG8gWUVTIHRoZW4gdGhpcyBmbGFnIHdpbGwNCisjIGF1dG9tYXRpY2FsbHkgYmUgZGlzYWJsZWQuDQorDQorV0FSTl9JRl9VTkRPQ1VNRU5URUQgICA9IFlFUw0KKw0KKyMgSWYgV0FSTl9JRl9ET0NfRVJST1IgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGdlbmVyYXRlIHdhcm5pbmdzIGZvcg0KKyMgcG90ZW50aWFsIGVycm9ycyBpbiB0aGUgZG9jdW1lbnRhdGlvbiwgc3VjaCBhcyBub3QgZG9jdW1lbnRpbmcgc29tZQ0KKyMgcGFyYW1ldGVycyBpbiBhIGRvY3VtZW50ZWQgZnVuY3Rpb24sIG9yIGRvY3VtZW50aW5nIHBhcmFtZXRlcnMgdGhhdA0KKyMgZG9uJ3QgZXhpc3Qgb3IgdXNpbmcgbWFya3VwIGNvbW1hbmRzIHdyb25nbHkuDQorDQorV0FSTl9JRl9ET0NfRVJST1IgICAgICA9IFlFUw0KKw0KKyMgVGhlIFdBUk5fTk9fUEFSQU1ET0Mgb3B0aW9uIGNhbiBiZSBlbmFibGVkIHRvIGdldCB3YXJuaW5ncyBmb3INCisjIGZ1bmN0aW9ucyB0aGF0IGFyZSBkb2N1bWVudGVkLCBidXQgaGF2ZSBubyBkb2N1bWVudGF0aW9uIGZvciB0aGVpciBwYXJhbWV0ZXJzDQorIyBvciByZXR1cm4gdmFsdWUuIElmIHNldCB0byBOTyAodGhlIGRlZmF1bHQpIGRveHlnZW4gd2lsbCBvbmx5IHdhcm4gYWJvdXQNCisjIHdyb25nIG9yIGluY29tcGxldGUgcGFyYW1ldGVyIGRvY3VtZW50YXRpb24sIGJ1dCBub3QgYWJvdXQgdGhlIGFic2VuY2Ugb2YNCisjIGRvY3VtZW50YXRpb24uDQorDQorV0FSTl9OT19QQVJBTURPQyAgICAgICA9IE5PDQorDQorIyBUaGUgV0FSTl9GT1JNQVQgdGFnIGRldGVybWluZXMgdGhlIGZvcm1hdCBvZiB0aGUgd2FybmluZyBtZXNzYWdlcyB0aGF0DQorIyBkb3h5Z2VuIGNhbiBwcm9kdWNlLiBUaGUgc3RyaW5nIHNob3VsZCBjb250YWluIHRoZSAkZmlsZSwgJGxpbmUsIGFuZCAkdGV4dA0KKyMgdGFncywgd2hpY2ggd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgZmlsZSBhbmQgbGluZSBudW1iZXIgZnJvbSB3aGljaCB0aGUNCisjIHdhcm5pbmcgb3JpZ2luYXRlZCBhbmQgdGhlIHdhcm5pbmcgdGV4dC4gT3B0aW9uYWxseSB0aGUgZm9ybWF0IG1heSBjb250YWluDQorIyAkdmVyc2lvbiwgd2hpY2ggd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgdmVyc2lvbiBvZiB0aGUgZmlsZSAoaWYgaXQgY291bGQNCisjIGJlIG9idGFpbmVkIHZpYSBGSUxFX1ZFUlNJT05fRklMVEVSKQ0KKw0KK1dBUk5fRk9STUFUICAgICAgICAgICAgPQ0KKw0KKyMgVGhlIFdBUk5fTE9HRklMRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIGZpbGUgdG8gd2hpY2ggd2FybmluZw0KKyMgYW5kIGVycm9yIG1lc3NhZ2VzIHNob3VsZCBiZSB3cml0dGVuLiBJZiBsZWZ0IGJsYW5rIHRoZSBvdXRwdXQgaXMgd3JpdHRlbg0KKyMgdG8gc3RkZXJyLg0KKw0KK1dBUk5fTE9HRklMRSAgICAgICAgICAgPQ0KKw0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBpbnB1dCBmaWxlcw0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCisjIFRoZSBJTlBVVCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgZmlsZXMgYW5kL29yIGRpcmVjdG9yaWVzIHRoYXQgY29udGFpbg0KKyMgZG9jdW1lbnRlZCBzb3VyY2UgZmlsZXMuIFlvdSBtYXkgZW50ZXIgZmlsZSBuYW1lcyBsaWtlICJteWZpbGUuY3BwIiBvcg0KKyMgZGlyZWN0b3JpZXMgbGlrZSAiL3Vzci9zcmMvbXlwcm9qZWN0Ii4gU2VwYXJhdGUgdGhlIGZpbGVzIG9yIGRpcmVjdG9yaWVzDQorIyB3aXRoIHNwYWNlcy4NCisNCitJTlBVVCAgICAgICAgICAgICAgICAgID0gc3JjICBkb2MvZG94eWdlbi9saWJvbXBfaW50ZXJmYWNlLmggDQorIyBUaGUgaXR0bm90aWZ5IGNvZGUgYWxzbyBoYXMgZG94eWdlbiBkb2N1bWVudGF0aW9uLCBidXQgaWYgd2UgaW5jbHVkZSBpdCBoZXJlDQorIyBpdCB0YWtlcyBvdmVyIGZyb20gdXMhDQorIyBzcmMvdGhpcmRwYXJ0eS9pdHRub3RpZnkgICAgICAgICAgICAgICAgICAgICAgICAgDQorDQorIyBUaGlzIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBjaGFyYWN0ZXIgZW5jb2Rpbmcgb2YgdGhlIHNvdXJjZSBmaWxlcw0KKyMgdGhhdCBkb3h5Z2VuIHBhcnNlcy4gSW50ZXJuYWxseSBkb3h5Z2VuIHVzZXMgdGhlIFVURi04IGVuY29kaW5nLCB3aGljaCBpcw0KKyMgYWxzbyB0aGUgZGVmYXVsdCBpbnB1dCBlbmNvZGluZy4gRG94eWdlbiB1c2VzIGxpYmljb252IChvciB0aGUgaWNvbnYgYnVpbHQNCisjIGludG8gbGliYykgZm9yIHRoZSB0cmFuc2NvZGluZy4gU2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9saWJpY29udiBmb3INCisjIHRoZSBsaXN0IG9mIHBvc3NpYmxlIGVuY29kaW5ncy4NCisNCitJTlBVVF9FTkNPRElORyAgICAgICAgID0gVVRGLTgNCisNCisjIElmIHRoZSB2YWx1ZSBvZiB0aGUgSU5QVVQgdGFnIGNvbnRhaW5zIGRpcmVjdG9yaWVzLCB5b3UgY2FuIHVzZSB0aGUNCisjIEZJTEVfUEFUVEVSTlMgdGFnIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgd2lsZGNhcmQgcGF0dGVybiAobGlrZSAqLmNwcA0KKyMgYW5kICouaCkgdG8gZmlsdGVyIG91dCB0aGUgc291cmNlLWZpbGVzIGluIHRoZSBkaXJlY3Rvcmllcy4gSWYgbGVmdA0KKyMgYmxhbmsgdGhlIGZvbGxvd2luZyBwYXR0ZXJucyBhcmUgdGVzdGVkOg0KKyMgKi5jICouY2MgKi5jeHggKi5jcHAgKi5jKysgKi5kICouamF2YSAqLmlpICouaXh4ICouaXBwICouaSsrICouaW5sICouaCAqLmhoDQorIyAqLmh4eCAqLmhwcCAqLmgrKyAqLmlkbCAqLm9kbCAqLmNzICoucGhwICoucGhwMyAqLmluYyAqLm0gKi5tbSAqLmRveCAqLnB5DQorIyAqLmY5MCAqLmYgKi5mb3IgKi52aGQgKi52aGRsDQorDQorRklMRV9QQVRURVJOUyAgICAgICAgICA9ICouYyAqLmggKi5jcHAgDQorIyBXZSBtYXkgYWxzbyB3YW50IHRvIGluY2x1ZGUgdGhlIGFzbSBmaWxlcyB3aXRoIGFwcHJvcHJpYXRlIGlmZGVmIHRvIGVuc3VyZQ0KKyMgZG94eWdlbiBkb2Vzbid0IHNlZSB0aGUgY29udGVudCwganVzdCB0aGUgZG9jdW1lbnRhdGlvbi4uLg0KKw0KKyMgVGhlIFJFQ1VSU0lWRSB0YWcgY2FuIGJlIHVzZWQgdG8gdHVybiBzcGVjaWZ5IHdoZXRoZXIgb3Igbm90IHN1YmRpcmVjdG9yaWVzDQorIyBzaG91bGQgYmUgc2VhcmNoZWQgZm9yIGlucHV0IGZpbGVzIGFzIHdlbGwuIFBvc3NpYmxlIHZhbHVlcyBhcmUgWUVTIGFuZCBOTy4NCisjIElmIGxlZnQgYmxhbmsgTk8gaXMgdXNlZC4NCisNCisjIE9ubHkgbG9vayBpbiB0aGUgb25lIGRpcmVjdG9yeS4NCitSRUNVUlNJVkUgICAgICAgICAgICAgID0gTk8NCisNCisjIFRoZSBFWENMVURFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGZpbGVzIGFuZC9vciBkaXJlY3RvcmllcyB0aGF0IHNob3VsZCBiZQ0KKyMgZXhjbHVkZWQgZnJvbSB0aGUgSU5QVVQgc291cmNlIGZpbGVzLiBUaGlzIHdheSB5b3UgY2FuIGVhc2lseSBleGNsdWRlIGENCisjIHN1YmRpcmVjdG9yeSBmcm9tIGEgZGlyZWN0b3J5IHRyZWUgd2hvc2Ugcm9vdCBpcyBzcGVjaWZpZWQgd2l0aCB0aGUgSU5QVVQgdGFnLg0KKyMgTm90ZSB0aGF0IHJlbGF0aXZlIHBhdGhzIGFyZSByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IGZyb20gd2hpY2ggZG94eWdlbiBpcw0KKyMgcnVuLg0KKw0KK0VYQ0xVREUgICAgICAgICAgICAgICAgPSBzcmMvdGVzdC10b3VjaC5jDQorDQorIyBUaGUgRVhDTFVERV9TWU1MSU5LUyB0YWcgY2FuIGJlIHVzZWQgdG8gc2VsZWN0IHdoZXRoZXIgb3Igbm90IGZpbGVzIG9yDQorIyBkaXJlY3RvcmllcyB0aGF0IGFyZSBzeW1ib2xpYyBsaW5rcyAoYSBVbml4IGZpbGUgc3lzdGVtIGZlYXR1cmUpIGFyZSBleGNsdWRlZA0KKyMgZnJvbSB0aGUgaW5wdXQuDQorDQorRVhDTFVERV9TWU1MSU5LUyAgICAgICA9IE5PDQorDQorIyBJZiB0aGUgdmFsdWUgb2YgdGhlIElOUFVUIHRhZyBjb250YWlucyBkaXJlY3RvcmllcywgeW91IGNhbiB1c2UgdGhlDQorIyBFWENMVURFX1BBVFRFUk5TIHRhZyB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHdpbGRjYXJkIHBhdHRlcm5zIHRvIGV4Y2x1ZGUNCisjIGNlcnRhaW4gZmlsZXMgZnJvbSB0aG9zZSBkaXJlY3Rvcmllcy4gTm90ZSB0aGF0IHRoZSB3aWxkY2FyZHMgYXJlIG1hdGNoZWQNCisjIGFnYWluc3QgdGhlIGZpbGUgd2l0aCBhYnNvbHV0ZSBwYXRoLCBzbyB0byBleGNsdWRlIGFsbCB0ZXN0IGRpcmVjdG9yaWVzDQorIyBmb3IgZXhhbXBsZSB1c2UgdGhlIHBhdHRlcm4gKi90ZXN0LyoNCisNCitFWENMVURFX1BBVFRFUk5TICAgICAgID0NCisNCisjIFRoZSBFWENMVURFX1NZTUJPTFMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgc3ltYm9sIG5hbWVzDQorIyAobmFtZXNwYWNlcywgY2xhc3NlcywgZnVuY3Rpb25zLCBldGMuKSB0aGF0IHNob3VsZCBiZSBleGNsdWRlZCBmcm9tIHRoZQ0KKyMgb3V0cHV0LiBUaGUgc3ltYm9sIG5hbWUgY2FuIGJlIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUsIGEgd29yZCwgb3IgaWYgdGhlDQorIyB3aWxkY2FyZCAqIGlzIHVzZWQsIGEgc3Vic3RyaW5nLiBFeGFtcGxlczogQU5hbWVzcGFjZSwgQUNsYXNzLA0KKyMgQUNsYXNzOjpBTmFtZXNwYWNlLCBBTmFtZXNwYWNlOjoqVGVzdA0KKw0KK0VYQ0xVREVfU1lNQk9MUyAgICAgICAgPQ0KKw0KKyMgVGhlIEVYQU1QTEVfUEFUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBmaWxlcyBvcg0KKyMgZGlyZWN0b3JpZXMgdGhhdCBjb250YWluIGV4YW1wbGUgY29kZSBmcmFnbWVudHMgdGhhdCBhcmUgaW5jbHVkZWQgKHNlZQ0KKyMgdGhlIFxpbmNsdWRlIGNvbW1hbmQpLg0KKw0KK0VYQU1QTEVfUEFUSCAgICAgICAgICAgPQ0KKw0KKyMgSWYgdGhlIHZhbHVlIG9mIHRoZSBFWEFNUExFX1BBVEggdGFnIGNvbnRhaW5zIGRpcmVjdG9yaWVzLCB5b3UgY2FuIHVzZSB0aGUNCisjIEVYQU1QTEVfUEFUVEVSTlMgdGFnIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgd2lsZGNhcmQgcGF0dGVybiAobGlrZSAqLmNwcA0KKyMgYW5kICouaCkgdG8gZmlsdGVyIG91dCB0aGUgc291cmNlLWZpbGVzIGluIHRoZSBkaXJlY3Rvcmllcy4gSWYgbGVmdA0KKyMgYmxhbmsgYWxsIGZpbGVzIGFyZSBpbmNsdWRlZC4NCisNCitFWEFNUExFX1BBVFRFUk5TICAgICAgID0NCisNCisjIElmIHRoZSBFWEFNUExFX1JFQ1VSU0lWRSB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIHN1YmRpcmVjdG9yaWVzIHdpbGwgYmUNCisjIHNlYXJjaGVkIGZvciBpbnB1dCBmaWxlcyB0byBiZSB1c2VkIHdpdGggdGhlIFxpbmNsdWRlIG9yIFxkb250aW5jbHVkZQ0KKyMgY29tbWFuZHMgaXJyZXNwZWN0aXZlIG9mIHRoZSB2YWx1ZSBvZiB0aGUgUkVDVVJTSVZFIHRhZy4NCisjIFBvc3NpYmxlIHZhbHVlcyBhcmUgWUVTIGFuZCBOTy4gSWYgbGVmdCBibGFuayBOTyBpcyB1c2VkLg0KKw0KK0VYQU1QTEVfUkVDVVJTSVZFICAgICAgPSBOTw0KKw0KKyMgVGhlIElNQUdFX1BBVEggdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZmlsZXMgb3INCisjIGRpcmVjdG9yaWVzIHRoYXQgY29udGFpbiBpbWFnZSB0aGF0IGFyZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiAoc2VlDQorIyB0aGUgXGltYWdlIGNvbW1hbmQpLg0KKw0KK0lNQUdFX1BBVEggICAgICAgICAgICAgPQ0KKw0KKyMgVGhlIElOUFVUX0ZJTFRFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHByb2dyYW0gdGhhdCBkb3h5Z2VuIHNob3VsZA0KKyMgaW52b2tlIHRvIGZpbHRlciBmb3IgZWFjaCBpbnB1dCBmaWxlLiBEb3h5Z2VuIHdpbGwgaW52b2tlIHRoZSBmaWx0ZXIgcHJvZ3JhbQ0KKyMgYnkgZXhlY3V0aW5nICh2aWEgcG9wZW4oKSkgdGhlIGNvbW1hbmQgPGZpbHRlcj4gPGlucHV0LWZpbGU+LCB3aGVyZSA8ZmlsdGVyPg0KKyMgaXMgdGhlIHZhbHVlIG9mIHRoZSBJTlBVVF9GSUxURVIgdGFnLCBhbmQgPGlucHV0LWZpbGU+IGlzIHRoZSBuYW1lIG9mIGFuDQorIyBpbnB1dCBmaWxlLiBEb3h5Z2VuIHdpbGwgdGhlbiB1c2UgdGhlIG91dHB1dCB0aGF0IHRoZSBmaWx0ZXIgcHJvZ3JhbSB3cml0ZXMNCisjIHRvIHN0YW5kYXJkIG91dHB1dC4NCisjIElmIEZJTFRFUl9QQVRURVJOUyBpcyBzcGVjaWZpZWQsIHRoaXMgdGFnIHdpbGwgYmUNCisjIGlnbm9yZWQuDQorDQorSU5QVVRfRklMVEVSICAgICAgICAgICA9DQorDQorIyBUaGUgRklMVEVSX1BBVFRFUk5TIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGZpbHRlcnMgb24gYSBwZXIgZmlsZSBwYXR0ZXJuDQorIyBiYXNpcy4NCisjIERveHlnZW4gd2lsbCBjb21wYXJlIHRoZSBmaWxlIG5hbWUgd2l0aCBlYWNoIHBhdHRlcm4gYW5kIGFwcGx5IHRoZQ0KKyMgZmlsdGVyIGlmIHRoZXJlIGlzIGEgbWF0Y2guDQorIyBUaGUgZmlsdGVycyBhcmUgYSBsaXN0IG9mIHRoZSBmb3JtOg0KKyMgcGF0dGVybj1maWx0ZXIgKGxpa2UgKi5jcHA9bXlfY3BwX2ZpbHRlcikuIFNlZSBJTlBVVF9GSUxURVIgZm9yIGZ1cnRoZXINCisjIGluZm8gb24gaG93IGZpbHRlcnMgYXJlIHVzZWQuIElmIEZJTFRFUl9QQVRURVJOUyBpcyBlbXB0eSBvciBpZg0KKyMgbm9uIG9mIHRoZSBwYXR0ZXJucyBtYXRjaCB0aGUgZmlsZSBuYW1lLCBJTlBVVF9GSUxURVIgaXMgYXBwbGllZC4NCisNCitGSUxURVJfUEFUVEVSTlMgICAgICAgID0NCisNCisjIElmIHRoZSBGSUxURVJfU09VUkNFX0ZJTEVTIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgaW5wdXQgZmlsdGVyIChpZiBzZXQgdXNpbmcNCisjIElOUFVUX0ZJTFRFUikgd2lsbCBiZSB1c2VkIHRvIGZpbHRlciB0aGUgaW5wdXQgZmlsZXMgd2hlbiBwcm9kdWNpbmcgc291cmNlDQorIyBmaWxlcyB0byBicm93c2UgKGkuZS4gd2hlbiBTT1VSQ0VfQlJPV1NFUiBpcyBzZXQgdG8gWUVTKS4NCisNCitGSUxURVJfU09VUkNFX0ZJTEVTICAgID0gTk8NCisNCisjIFRoZSBGSUxURVJfU09VUkNFX1BBVFRFUk5TIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHNvdXJjZSBmaWx0ZXJzIHBlciBmaWxlDQorIyBwYXR0ZXJuLiBBIHBhdHRlcm4gd2lsbCBvdmVycmlkZSB0aGUgc2V0dGluZyBmb3IgRklMVEVSX1BBVFRFUk4gKGlmIGFueSkNCisjIGFuZCBpdCBpcyBhbHNvIHBvc3NpYmxlIHRvIGRpc2FibGUgc291cmNlIGZpbHRlcmluZyBmb3IgYSBzcGVjaWZpYyBwYXR0ZXJuDQorIyB1c2luZyAqLmV4dD0gKHNvIHdpdGhvdXQgbmFtaW5nIGEgZmlsdGVyKS4gVGhpcyBvcHRpb24gb25seSBoYXMgZWZmZWN0IHdoZW4NCisjIEZJTFRFUl9TT1VSQ0VfRklMRVMgaXMgZW5hYmxlZC4NCisNCitGSUxURVJfU09VUkNFX1BBVFRFUk5TID0NCisNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byBzb3VyY2UgYnJvd3NpbmcNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorIyBJZiB0aGUgU09VUkNFX0JST1dTRVIgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBhIGxpc3Qgb2Ygc291cmNlIGZpbGVzIHdpbGwNCisjIGJlIGdlbmVyYXRlZC4gRG9jdW1lbnRlZCBlbnRpdGllcyB3aWxsIGJlIGNyb3NzLXJlZmVyZW5jZWQgd2l0aCB0aGVzZSBzb3VyY2VzLg0KKyMgTm90ZTogVG8gZ2V0IHJpZCBvZiBhbGwgc291cmNlIGNvZGUgaW4gdGhlIGdlbmVyYXRlZCBvdXRwdXQsIG1ha2Ugc3VyZSBhbHNvDQorIyBWRVJCQVRJTV9IRUFERVJTIGlzIHNldCB0byBOTy4NCisNCitTT1VSQ0VfQlJPV1NFUiAgICAgICAgID0gWUVTDQorDQorIyBTZXR0aW5nIHRoZSBJTkxJTkVfU09VUkNFUyB0YWcgdG8gWUVTIHdpbGwgaW5jbHVkZSB0aGUgYm9keQ0KKyMgb2YgZnVuY3Rpb25zIGFuZCBjbGFzc2VzIGRpcmVjdGx5IGluIHRoZSBkb2N1bWVudGF0aW9uLg0KKw0KK0lOTElORV9TT1VSQ0VTICAgICAgICAgPSBOTw0KKw0KKyMgU2V0dGluZyB0aGUgU1RSSVBfQ09ERV9DT01NRU5UUyB0YWcgdG8gWUVTICh0aGUgZGVmYXVsdCkgd2lsbCBpbnN0cnVjdA0KKyMgZG94eWdlbiB0byBoaWRlIGFueSBzcGVjaWFsIGNvbW1lbnQgYmxvY2tzIGZyb20gZ2VuZXJhdGVkIHNvdXJjZSBjb2RlDQorIyBmcmFnbWVudHMuIE5vcm1hbCBDLCBDKysgYW5kIEZvcnRyYW4gY29tbWVudHMgd2lsbCBhbHdheXMgcmVtYWluIHZpc2libGUuDQorDQorU1RSSVBfQ09ERV9DT01NRU5UUyAgICA9IFlFUw0KKw0KKyMgSWYgdGhlIFJFRkVSRU5DRURfQllfUkVMQVRJT04gdGFnIGlzIHNldCB0byBZRVMNCisjIHRoZW4gZm9yIGVhY2ggZG9jdW1lbnRlZCBmdW5jdGlvbiBhbGwgZG9jdW1lbnRlZA0KKyMgZnVuY3Rpb25zIHJlZmVyZW5jaW5nIGl0IHdpbGwgYmUgbGlzdGVkLg0KKw0KK1JFRkVSRU5DRURfQllfUkVMQVRJT04gPSBZRVMNCisNCisjIElmIHRoZSBSRUZFUkVOQ0VTX1JFTEFUSU9OIHRhZyBpcyBzZXQgdG8gWUVTDQorIyB0aGVuIGZvciBlYWNoIGRvY3VtZW50ZWQgZnVuY3Rpb24gYWxsIGRvY3VtZW50ZWQgZW50aXRpZXMNCisjIGNhbGxlZC91c2VkIGJ5IHRoYXQgZnVuY3Rpb24gd2lsbCBiZSBsaXN0ZWQuDQorDQorUkVGRVJFTkNFU19SRUxBVElPTiAgICA9IE5PDQorDQorIyBJZiB0aGUgUkVGRVJFTkNFU19MSU5LX1NPVVJDRSB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpDQorIyBhbmQgU09VUkNFX0JST1dTRVIgdGFnIGlzIHNldCB0byBZRVMsIHRoZW4gdGhlIGh5cGVybGlua3MgZnJvbQ0KKyMgZnVuY3Rpb25zIGluIFJFRkVSRU5DRVNfUkVMQVRJT04gYW5kIFJFRkVSRU5DRURfQllfUkVMQVRJT04gbGlzdHMgd2lsbA0KKyMgbGluayB0byB0aGUgc291cmNlIGNvZGUuDQorIyBPdGhlcndpc2UgdGhleSB3aWxsIGxpbmsgdG8gdGhlIGRvY3VtZW50YXRpb24uDQorDQorUkVGRVJFTkNFU19MSU5LX1NPVVJDRSA9IFlFUw0KKw0KKyMgSWYgdGhlIFVTRV9IVEFHUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIHRoZSByZWZlcmVuY2VzIHRvIHNvdXJjZSBjb2RlDQorIyB3aWxsIHBvaW50IHRvIHRoZSBIVE1MIGdlbmVyYXRlZCBieSB0aGUgaHRhZ3MoMSkgdG9vbCBpbnN0ZWFkIG9mIGRveHlnZW4NCisjIGJ1aWx0LWluIHNvdXJjZSBicm93c2VyLiBUaGUgaHRhZ3MgdG9vbCBpcyBwYXJ0IG9mIEdOVSdzIGdsb2JhbCBzb3VyY2UNCisjIHRhZ2dpbmcgc3lzdGVtIChzZWUgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2dsb2JhbC9nbG9iYWwuaHRtbCkuIFlvdQ0KKyMgd2lsbCBuZWVkIHZlcnNpb24gNC44LjYgb3IgaGlnaGVyLg0KKw0KK1VTRV9IVEFHUyAgICAgICAgICAgICAgPSBOTw0KKw0KKyMgSWYgdGhlIFZFUkJBVElNX0hFQURFUlMgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSB0aGVuIERveHlnZW4NCisjIHdpbGwgZ2VuZXJhdGUgYSB2ZXJiYXRpbSBjb3B5IG9mIHRoZSBoZWFkZXIgZmlsZSBmb3IgZWFjaCBjbGFzcyBmb3INCisjIHdoaWNoIGFuIGluY2x1ZGUgaXMgc3BlY2lmaWVkLiBTZXQgdG8gTk8gdG8gZGlzYWJsZSB0aGlzLg0KKw0KK1ZFUkJBVElNX0hFQURFUlMgICAgICAgPSBZRVMNCisNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgYWxwaGFiZXRpY2FsIGNsYXNzIGluZGV4DQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KKyMgSWYgdGhlIEFMUEhBQkVUSUNBTF9JTkRFWCB0YWcgaXMgc2V0IHRvIFlFUywgYW4gYWxwaGFiZXRpY2FsIGluZGV4DQorIyBvZiBhbGwgY29tcG91bmRzIHdpbGwgYmUgZ2VuZXJhdGVkLiBFbmFibGUgdGhpcyBpZiB0aGUgcHJvamVjdA0KKyMgY29udGFpbnMgYSBsb3Qgb2YgY2xhc3Nlcywgc3RydWN0cywgdW5pb25zIG9yIGludGVyZmFjZXMuDQorDQorQUxQSEFCRVRJQ0FMX0lOREVYICAgICA9IFlFUw0KKw0KKyMgSWYgdGhlIGFscGhhYmV0aWNhbCBpbmRleCBpcyBlbmFibGVkIChzZWUgQUxQSEFCRVRJQ0FMX0lOREVYKSB0aGVuDQorIyB0aGUgQ09MU19JTl9BTFBIQV9JTkRFWCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgbnVtYmVyIG9mIGNvbHVtbnMNCisjIGluIHdoaWNoIHRoaXMgbGlzdCB3aWxsIGJlIHNwbGl0IChjYW4gYmUgYSBudW1iZXIgaW4gdGhlIHJhbmdlIFsxLi4yMF0pDQorDQorQ09MU19JTl9BTFBIQV9JTkRFWCAgICA9IDUNCisNCisjIEluIGNhc2UgYWxsIGNsYXNzZXMgaW4gYSBwcm9qZWN0IHN0YXJ0IHdpdGggYSBjb21tb24gcHJlZml4LCBhbGwNCisjIGNsYXNzZXMgd2lsbCBiZSBwdXQgdW5kZXIgdGhlIHNhbWUgaGVhZGVyIGluIHRoZSBhbHBoYWJldGljYWwgaW5kZXguDQorIyBUaGUgSUdOT1JFX1BSRUZJWCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBwcmVmaXhlcyB0aGF0DQorIyBzaG91bGQgYmUgaWdub3JlZCB3aGlsZSBnZW5lcmF0aW5nIHRoZSBpbmRleCBoZWFkZXJzLg0KKw0KK0lHTk9SRV9QUkVGSVggICAgICAgICAgPQ0KKw0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBIVE1MIG91dHB1dA0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCisjIElmIHRoZSBHRU5FUkFURV9IVE1MIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgRG94eWdlbiB3aWxsDQorIyBnZW5lcmF0ZSBIVE1MIG91dHB1dC4NCisNCitHRU5FUkFURV9IVE1MICAgICAgICAgID0gWUVTDQorDQorIyBUaGUgSFRNTF9PVVRQVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgSFRNTCBkb2NzIHdpbGwgYmUgcHV0Lg0KKyMgSWYgYSByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZQ0KKyMgcHV0IGluIGZyb250IG9mIGl0LiBJZiBsZWZ0IGJsYW5rIGBodG1sJyB3aWxsIGJlIHVzZWQgYXMgdGhlIGRlZmF1bHQgcGF0aC4NCisNCitIVE1MX09VVFBVVCAgICAgICAgICAgID0NCisNCisjIFRoZSBIVE1MX0ZJTEVfRVhURU5TSU9OIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBmaWxlIGV4dGVuc2lvbiBmb3INCisjIGVhY2ggZ2VuZXJhdGVkIEhUTUwgcGFnZSAoZm9yIGV4YW1wbGU6IC5odG0sLnBocCwuYXNwKS4gSWYgaXQgaXMgbGVmdCBibGFuaw0KKyMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGZpbGVzIHdpdGggLmh0bWwgZXh0ZW5zaW9uLg0KKw0KK0hUTUxfRklMRV9FWFRFTlNJT04gICAgPSAuaHRtbA0KKw0KKyMgVGhlIEhUTUxfSEVBREVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcGVyc29uYWwgSFRNTCBoZWFkZXIgZm9yDQorIyBlYWNoIGdlbmVyYXRlZCBIVE1MIHBhZ2UuIElmIGl0IGlzIGxlZnQgYmxhbmsgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGENCisjIHN0YW5kYXJkIGhlYWRlci4gTm90ZSB0aGF0IHdoZW4gdXNpbmcgYSBjdXN0b20gaGVhZGVyIHlvdSBhcmUgcmVzcG9uc2libGUNCisjICBmb3IgdGhlIHByb3BlciBpbmNsdXNpb24gb2YgYW55IHNjcmlwdHMgYW5kIHN0eWxlIHNoZWV0cyB0aGF0IGRveHlnZW4NCisjIG5lZWRzLCB3aGljaCBpcyBkZXBlbmRlbnQgb24gdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB1c2VkLg0KKyMgSXQgaXMgYWR2aXNlZCB0byBnZW5lcmF0ZSBhIGRlZmF1bHQgaGVhZGVyIHVzaW5nICJkb3h5Z2VuIC13IGh0bWwNCisjIGhlYWRlci5odG1sIGZvb3Rlci5odG1sIHN0eWxlc2hlZXQuY3NzIFlvdXJDb25maWdGaWxlIiBhbmQgdGhlbiBtb2RpZnkNCisjIHRoYXQgaGVhZGVyLiBOb3RlIHRoYXQgdGhlIGhlYWRlciBpcyBzdWJqZWN0IHRvIGNoYW5nZSBzbyB5b3UgdHlwaWNhbGx5DQorIyBoYXZlIHRvIHJlZG8gdGhpcyB3aGVuIHVwZ3JhZGluZyB0byBhIG5ld2VyIHZlcnNpb24gb2YgZG94eWdlbiBvciB3aGVuDQorIyBjaGFuZ2luZyB0aGUgdmFsdWUgb2YgY29uZmlndXJhdGlvbiBzZXR0aW5ncyBzdWNoIGFzIEdFTkVSQVRFX1RSRUVWSUVXIQ0KKw0KK0hUTUxfSEVBREVSICAgICAgICAgICAgPQ0KKw0KKyMgVGhlIEhUTUxfRk9PVEVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcGVyc29uYWwgSFRNTCBmb290ZXIgZm9yDQorIyBlYWNoIGdlbmVyYXRlZCBIVE1MIHBhZ2UuIElmIGl0IGlzIGxlZnQgYmxhbmsgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGENCisjIHN0YW5kYXJkIGZvb3Rlci4NCisNCitIVE1MX0ZPT1RFUiAgICAgICAgICAgID0NCisNCisjIFRoZSBIVE1MX1NUWUxFU0hFRVQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSB1c2VyLWRlZmluZWQgY2FzY2FkaW5nDQorIyBzdHlsZSBzaGVldCB0aGF0IGlzIHVzZWQgYnkgZWFjaCBIVE1MIHBhZ2UuIEl0IGNhbiBiZSB1c2VkIHRvDQorIyBmaW5lLXR1bmUgdGhlIGxvb2sgb2YgdGhlIEhUTUwgb3V0cHV0LiBJZiBsZWZ0IGJsYW5rIGRveHlnZW4gd2lsbA0KKyMgZ2VuZXJhdGUgYSBkZWZhdWx0IHN0eWxlIHNoZWV0LiBOb3RlIHRoYXQgaXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlDQorIyBIVE1MX0VYVFJBX1NUWUxFU0hFRVQgaW5zdGVhZCBvZiB0aGlzIG9uZSwgYXMgaXQgaXMgbW9yZSByb2J1c3QgYW5kIHRoaXMNCisjIHRhZyB3aWxsIGluIHRoZSBmdXR1cmUgYmVjb21lIG9ic29sZXRlLg0KKw0KK0hUTUxfU1RZTEVTSEVFVCAgICAgICAgPQ0KKw0KKyMgVGhlIEhUTUxfRVhUUkFfU1RZTEVTSEVFVCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhbiBhZGRpdGlvbmFsDQorIyB1c2VyLWRlZmluZWQgY2FzY2FkaW5nIHN0eWxlIHNoZWV0IHRoYXQgaXMgaW5jbHVkZWQgYWZ0ZXIgdGhlIHN0YW5kYXJkDQorIyBzdHlsZSBzaGVldHMgY3JlYXRlZCBieSBkb3h5Z2VuLiBVc2luZyB0aGlzIG9wdGlvbiBvbmUgY2FuIG92ZXJydWxlDQorIyBjZXJ0YWluIHN0eWxlIGFzcGVjdHMuIFRoaXMgaXMgcHJlZmVycmVkIG92ZXIgdXNpbmcgSFRNTF9TVFlMRVNIRUVUDQorIyBzaW5jZSBpdCBkb2VzIG5vdCByZXBsYWNlIHRoZSBzdGFuZGFyZCBzdHlsZSBzaGVldCBhbmQgaXMgdGhlcmVmb3IgbW9yZQ0KKyMgcm9idXN0IGFnYWluc3QgZnV0dXJlIHVwZGF0ZXMuIERveHlnZW4gd2lsbCBjb3B5IHRoZSBzdHlsZSBzaGVldCBmaWxlIHRvDQorIyB0aGUgb3V0cHV0IGRpcmVjdG9yeS4NCisNCitIVE1MX0VYVFJBX1NUWUxFU0hFRVQgID0NCisNCisjIFRoZSBIVE1MX0VYVFJBX0ZJTEVTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGV4dHJhIGltYWdlcyBvcg0KKyMgb3RoZXIgc291cmNlIGZpbGVzIHdoaWNoIHNob3VsZCBiZSBjb3BpZWQgdG8gdGhlIEhUTUwgb3V0cHV0IGRpcmVjdG9yeS4gTm90ZQ0KKyMgdGhhdCB0aGVzZSBmaWxlcyB3aWxsIGJlIGNvcGllZCB0byB0aGUgYmFzZSBIVE1MIG91dHB1dCBkaXJlY3RvcnkuIFVzZSB0aGUNCisjICRyZWxwYXRoJCBtYXJrZXIgaW4gdGhlIEhUTUxfSEVBREVSIGFuZC9vciBIVE1MX0ZPT1RFUiBmaWxlcyB0byBsb2FkIHRoZXNlDQorIyBmaWxlcy4gSW4gdGhlIEhUTUxfU1RZTEVTSEVFVCBmaWxlLCB1c2UgdGhlIGZpbGUgbmFtZSBvbmx5LiBBbHNvIG5vdGUgdGhhdA0KKyMgdGhlIGZpbGVzIHdpbGwgYmUgY29waWVkIGFzLWlzOyB0aGVyZSBhcmUgbm8gY29tbWFuZHMgb3IgbWFya2VycyBhdmFpbGFibGUuDQorDQorSFRNTF9FWFRSQV9GSUxFUyAgICAgICA9DQorDQorIyBUaGUgSFRNTF9DT0xPUlNUWUxFX0hVRSB0YWcgY29udHJvbHMgdGhlIGNvbG9yIG9mIHRoZSBIVE1MIG91dHB1dC4NCisjIERveHlnZW4gd2lsbCBhZGp1c3QgdGhlIGNvbG9ycyBpbiB0aGUgc3R5bGUgc2hlZXQgYW5kIGJhY2tncm91bmQgaW1hZ2VzDQorIyBhY2NvcmRpbmcgdG8gdGhpcyBjb2xvci4gSHVlIGlzIHNwZWNpZmllZCBhcyBhbiBhbmdsZSBvbiBhIGNvbG9yd2hlZWwsDQorIyBzZWUgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9IdWUgZm9yIG1vcmUgaW5mb3JtYXRpb24uDQorIyBGb3IgaW5zdGFuY2UgdGhlIHZhbHVlIDAgcmVwcmVzZW50cyByZWQsIDYwIGlzIHllbGxvdywgMTIwIGlzIGdyZWVuLA0KKyMgMTgwIGlzIGN5YW4sIDI0MCBpcyBibHVlLCAzMDAgcHVycGxlLCBhbmQgMzYwIGlzIHJlZCBhZ2Fpbi4NCisjIFRoZSBhbGxvd2VkIHJhbmdlIGlzIDAgdG8gMzU5Lg0KKw0KK0hUTUxfQ09MT1JTVFlMRV9IVUUgICAgPSAyMjANCisNCisjIFRoZSBIVE1MX0NPTE9SU1RZTEVfU0FUIHRhZyBjb250cm9scyB0aGUgcHVyaXR5IChvciBzYXR1cmF0aW9uKSBvZg0KKyMgdGhlIGNvbG9ycyBpbiB0aGUgSFRNTCBvdXRwdXQuIEZvciBhIHZhbHVlIG9mIDAgdGhlIG91dHB1dCB3aWxsIHVzZQ0KKyMgZ3JheXNjYWxlcyBvbmx5LiBBIHZhbHVlIG9mIDI1NSB3aWxsIHByb2R1Y2UgdGhlIG1vc3Qgdml2aWQgY29sb3JzLg0KKw0KK0hUTUxfQ09MT1JTVFlMRV9TQVQgICAgPSAxMDANCisNCisjIFRoZSBIVE1MX0NPTE9SU1RZTEVfR0FNTUEgdGFnIGNvbnRyb2xzIHRoZSBnYW1tYSBjb3JyZWN0aW9uIGFwcGxpZWQgdG8NCisjIHRoZSBsdW1pbmFuY2UgY29tcG9uZW50IG9mIHRoZSBjb2xvcnMgaW4gdGhlIEhUTUwgb3V0cHV0LiBWYWx1ZXMgYmVsb3cNCisjIDEwMCBncmFkdWFsbHkgbWFrZSB0aGUgb3V0cHV0IGxpZ2h0ZXIsIHdoZXJlYXMgdmFsdWVzIGFib3ZlIDEwMCBtYWtlDQorIyB0aGUgb3V0cHV0IGRhcmtlci4gVGhlIHZhbHVlIGRpdmlkZWQgYnkgMTAwIGlzIHRoZSBhY3R1YWwgZ2FtbWEgYXBwbGllZCwNCisjIHNvIDgwIHJlcHJlc2VudHMgYSBnYW1tYSBvZiAwLjgsIFRoZSB2YWx1ZSAyMjAgcmVwcmVzZW50cyBhIGdhbW1hIG9mIDIuMiwNCisjIGFuZCAxMDAgZG9lcyBub3QgY2hhbmdlIHRoZSBnYW1tYS4NCisNCitIVE1MX0NPTE9SU1RZTEVfR0FNTUEgID0gODANCisNCisjIElmIHRoZSBIVE1MX1RJTUVTVEFNUCB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIHRoZSBmb290ZXIgb2YgZWFjaCBnZW5lcmF0ZWQgSFRNTA0KKyMgcGFnZSB3aWxsIGNvbnRhaW4gdGhlIGRhdGUgYW5kIHRpbWUgd2hlbiB0aGUgcGFnZSB3YXMgZ2VuZXJhdGVkLiBTZXR0aW5nDQorIyB0aGlzIHRvIE5PIGNhbiBoZWxwIHdoZW4gY29tcGFyaW5nIHRoZSBvdXRwdXQgb2YgbXVsdGlwbGUgcnVucy4NCisNCitIVE1MX1RJTUVTVEFNUCAgICAgICAgID0gWUVTDQorDQorIyBJZiB0aGUgSFRNTF9EWU5BTUlDX1NFQ1RJT05TIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gdGhlIGdlbmVyYXRlZCBIVE1MDQorIyBkb2N1bWVudGF0aW9uIHdpbGwgY29udGFpbiBzZWN0aW9ucyB0aGF0IGNhbiBiZSBoaWRkZW4gYW5kIHNob3duIGFmdGVyIHRoZQ0KKyMgcGFnZSBoYXMgbG9hZGVkLg0KKw0KK0hUTUxfRFlOQU1JQ19TRUNUSU9OUyAgPSBOTw0KKw0KKyMgV2l0aCBIVE1MX0lOREVYX05VTV9FTlRSSUVTIG9uZSBjYW4gY29udHJvbCB0aGUgcHJlZmVycmVkIG51bWJlciBvZg0KKyMgZW50cmllcyBzaG93biBpbiB0aGUgdmFyaW91cyB0cmVlIHN0cnVjdHVyZWQgaW5kaWNlcyBpbml0aWFsbHk7IHRoZSB1c2VyDQorIyBjYW4gZXhwYW5kIGFuZCBjb2xsYXBzZSBlbnRyaWVzIGR5bmFtaWNhbGx5IGxhdGVyIG9uLiBEb3h5Z2VuIHdpbGwgZXhwYW5kDQorIyB0aGUgdHJlZSB0byBzdWNoIGEgbGV2ZWwgdGhhdCBhdCBtb3N0IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGVudHJpZXMgYXJlDQorIyB2aXNpYmxlICh1bmxlc3MgYSBmdWxseSBjb2xsYXBzZWQgdHJlZSBhbHJlYWR5IGV4Y2VlZHMgdGhpcyBhbW91bnQpLg0KKyMgU28gc2V0dGluZyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgMSB3aWxsIHByb2R1Y2UgYSBmdWxsIGNvbGxhcHNlZCB0cmVlIGJ5DQorIyBkZWZhdWx0LiAwIGlzIGEgc3BlY2lhbCB2YWx1ZSByZXByZXNlbnRpbmcgYW4gaW5maW5pdGUgbnVtYmVyIG9mIGVudHJpZXMNCisjIGFuZCB3aWxsIHJlc3VsdCBpbiBhIGZ1bGwgZXhwYW5kZWQgdHJlZSBieSBkZWZhdWx0Lg0KKw0KK0hUTUxfSU5ERVhfTlVNX0VOVFJJRVMgPSAxMDANCisNCisjIElmIHRoZSBHRU5FUkFURV9ET0NTRVQgdGFnIGlzIHNldCB0byBZRVMsIGFkZGl0aW9uYWwgaW5kZXggZmlsZXMNCisjIHdpbGwgYmUgZ2VuZXJhdGVkIHRoYXQgY2FuIGJlIHVzZWQgYXMgaW5wdXQgZm9yIEFwcGxlJ3MgWGNvZGUgMw0KKyMgaW50ZWdyYXRlZCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCwgaW50cm9kdWNlZCB3aXRoIE9TWCAxMC41IChMZW9wYXJkKS4NCisjIFRvIGNyZWF0ZSBhIGRvY3VtZW50YXRpb24gc2V0LCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBNYWtlZmlsZSBpbiB0aGUNCisjIEhUTUwgb3V0cHV0IGRpcmVjdG9yeS4gUnVubmluZyBtYWtlIHdpbGwgcHJvZHVjZSB0aGUgZG9jc2V0IGluIHRoYXQNCisjIGRpcmVjdG9yeSBhbmQgcnVubmluZyAibWFrZSBpbnN0YWxsIiB3aWxsIGluc3RhbGwgdGhlIGRvY3NldCBpbg0KKyMgfi9MaWJyYXJ5L0RldmVsb3Blci9TaGFyZWQvRG9jdW1lbnRhdGlvbi9Eb2NTZXRzIHNvIHRoYXQgWGNvZGUgd2lsbCBmaW5kDQorIyBpdCBhdCBzdGFydHVwLg0KKyMgU2VlIGh0dHA6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL3Rvb2xzL2NyZWF0aW5nZG9jc2V0c3dpdGhkb3h5Z2VuLmh0bWwNCisjIGZvciBtb3JlIGluZm9ybWF0aW9uLg0KKw0KK0dFTkVSQVRFX0RPQ1NFVCAgICAgICAgPSBOTw0KKw0KKyMgV2hlbiBHRU5FUkFURV9ET0NTRVQgdGFnIGlzIHNldCB0byBZRVMsIHRoaXMgdGFnIGRldGVybWluZXMgdGhlIG5hbWUgb2YgdGhlDQorIyBmZWVkLiBBIGRvY3VtZW50YXRpb24gZmVlZCBwcm92aWRlcyBhbiB1bWJyZWxsYSB1bmRlciB3aGljaCBtdWx0aXBsZQ0KKyMgZG9jdW1lbnRhdGlvbiBzZXRzIGZyb20gYSBzaW5nbGUgcHJvdmlkZXIgKHN1Y2ggYXMgYSBjb21wYW55IG9yIHByb2R1Y3Qgc3VpdGUpDQorIyBjYW4gYmUgZ3JvdXBlZC4NCisNCitET0NTRVRfRkVFRE5BTUUgICAgICAgID0gIkRveHlnZW4gZ2VuZXJhdGVkIGRvY3MiDQorDQorIyBXaGVuIEdFTkVSQVRFX0RPQ1NFVCB0YWcgaXMgc2V0IHRvIFlFUywgdGhpcyB0YWcgc3BlY2lmaWVzIGEgc3RyaW5nIHRoYXQNCisjIHNob3VsZCB1bmlxdWVseSBpZGVudGlmeSB0aGUgZG9jdW1lbnRhdGlvbiBzZXQgYnVuZGxlLiBUaGlzIHNob3VsZCBiZSBhDQorIyByZXZlcnNlIGRvbWFpbi1uYW1lIHN0eWxlIHN0cmluZywgZS5nLiBjb20ubXljb21wYW55Lk15RG9jU2V0LiBEb3h5Z2VuDQorIyB3aWxsIGFwcGVuZCAuZG9jc2V0IHRvIHRoZSBuYW1lLg0KKw0KK0RPQ1NFVF9CVU5ETEVfSUQgICAgICAgPSBvcmcuZG94eWdlbi5Qcm9qZWN0DQorDQorIyBXaGVuIEdFTkVSQVRFX1BVQkxJU0hFUl9JRCB0YWcgc3BlY2lmaWVzIGEgc3RyaW5nIHRoYXQgc2hvdWxkIHVuaXF1ZWx5DQorIyBpZGVudGlmeSB0aGUgZG9jdW1lbnRhdGlvbiBwdWJsaXNoZXIuIFRoaXMgc2hvdWxkIGJlIGEgcmV2ZXJzZSBkb21haW4tbmFtZQ0KKyMgc3R5bGUgc3RyaW5nLCBlLmcuIGNvbS5teWNvbXBhbnkuTXlEb2NTZXQuZG9jdW1lbnRhdGlvbi4NCisNCitET0NTRVRfUFVCTElTSEVSX0lEICAgID0gb3JnLmRveHlnZW4uUHVibGlzaGVyDQorDQorIyBUaGUgR0VORVJBVEVfUFVCTElTSEVSX05BTUUgdGFnIGlkZW50aWZpZXMgdGhlIGRvY3VtZW50YXRpb24gcHVibGlzaGVyLg0KKw0KK0RPQ1NFVF9QVUJMSVNIRVJfTkFNRSAgPSBQdWJsaXNoZXINCisNCisjIElmIHRoZSBHRU5FUkFURV9IVE1MSEVMUCB0YWcgaXMgc2V0IHRvIFlFUywgYWRkaXRpb25hbCBpbmRleCBmaWxlcw0KKyMgd2lsbCBiZSBnZW5lcmF0ZWQgdGhhdCBjYW4gYmUgdXNlZCBhcyBpbnB1dCBmb3IgdG9vbHMgbGlrZSB0aGUNCisjIE1pY3Jvc29mdCBIVE1MIGhlbHAgd29ya3Nob3AgdG8gZ2VuZXJhdGUgYSBjb21waWxlZCBIVE1MIGhlbHAgZmlsZSAoLmNobSkNCisjIG9mIHRoZSBnZW5lcmF0ZWQgSFRNTCBkb2N1bWVudGF0aW9uLg0KKw0KK0dFTkVSQVRFX0hUTUxIRUxQICAgICAgPSBOTw0KKw0KKyMgSWYgdGhlIEdFTkVSQVRFX0hUTUxIRUxQIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgQ0hNX0ZJTEUgdGFnIGNhbg0KKyMgYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBmaWxlIG5hbWUgb2YgdGhlIHJlc3VsdGluZyAuY2htIGZpbGUuIFlvdQ0KKyMgY2FuIGFkZCBhIHBhdGggaW4gZnJvbnQgb2YgdGhlIGZpbGUgaWYgdGhlIHJlc3VsdCBzaG91bGQgbm90IGJlDQorIyB3cml0dGVuIHRvIHRoZSBodG1sIG91dHB1dCBkaXJlY3RvcnkuDQorDQorQ0hNX0ZJTEUgICAgICAgICAgICAgICA9DQorDQorIyBJZiB0aGUgR0VORVJBVEVfSFRNTEhFTFAgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBISENfTE9DQVRJT04gdGFnIGNhbg0KKyMgYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBsb2NhdGlvbiAoYWJzb2x1dGUgcGF0aCBpbmNsdWRpbmcgZmlsZSBuYW1lKSBvZg0KKyMgdGhlIEhUTUwgaGVscCBjb21waWxlciAoaGhjLmV4ZSkuIElmIG5vbi1lbXB0eSBkb3h5Z2VuIHdpbGwgdHJ5IHRvIHJ1bg0KKyMgdGhlIEhUTUwgaGVscCBjb21waWxlciBvbiB0aGUgZ2VuZXJhdGVkIGluZGV4LmhocC4NCisNCitISENfTE9DQVRJT04gICAgICAgICAgID0NCisNCisjIElmIHRoZSBHRU5FUkFURV9IVE1MSEVMUCB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIEdFTkVSQVRFX0NISSBmbGFnDQorIyBjb250cm9scyBpZiBhIHNlcGFyYXRlIC5jaGkgaW5kZXggZmlsZSBpcyBnZW5lcmF0ZWQgKFlFUykgb3IgdGhhdA0KKyMgaXQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBtYXN0ZXIgLmNobSBmaWxlIChOTykuDQorDQorR0VORVJBVEVfQ0hJICAgICAgICAgICA9IE5PDQorDQorIyBJZiB0aGUgR0VORVJBVEVfSFRNTEhFTFAgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBDSE1fSU5ERVhfRU5DT0RJTkcNCisjIGlzIHVzZWQgdG8gZW5jb2RlIEh0bWxIZWxwIGluZGV4IChoaGspLCBjb250ZW50IChoaGMpIGFuZCBwcm9qZWN0IGZpbGUNCisjIGNvbnRlbnQuDQorDQorQ0hNX0lOREVYX0VOQ09ESU5HICAgICA9DQorDQorIyBJZiB0aGUgR0VORVJBVEVfSFRNTEhFTFAgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBCSU5BUllfVE9DIGZsYWcNCisjIGNvbnRyb2xzIHdoZXRoZXIgYSBiaW5hcnkgdGFibGUgb2YgY29udGVudHMgaXMgZ2VuZXJhdGVkIChZRVMpIG9yIGENCisjIG5vcm1hbCB0YWJsZSBvZiBjb250ZW50cyAoTk8pIGluIHRoZSAuY2htIGZpbGUuDQorDQorQklOQVJZX1RPQyAgICAgICAgICAgICA9IE5PDQorDQorIyBUaGUgVE9DX0VYUEFORCBmbGFnIGNhbiBiZSBzZXQgdG8gWUVTIHRvIGFkZCBleHRyYSBpdGVtcyBmb3IgZ3JvdXAgbWVtYmVycw0KKyMgdG8gdGhlIGNvbnRlbnRzIG9mIHRoZSBIVE1MIGhlbHAgZG9jdW1lbnRhdGlvbiBhbmQgdG8gdGhlIHRyZWUgdmlldy4NCisNCitUT0NfRVhQQU5EICAgICAgICAgICAgID0gTk8NCisNCisjIElmIHRoZSBHRU5FUkFURV9RSFAgdGFnIGlzIHNldCB0byBZRVMgYW5kIGJvdGggUUhQX05BTUVTUEFDRSBhbmQNCisjIFFIUF9WSVJUVUFMX0ZPTERFUiBhcmUgc2V0LCBhbiBhZGRpdGlvbmFsIGluZGV4IGZpbGUgd2lsbCBiZSBnZW5lcmF0ZWQNCisjIHRoYXQgY2FuIGJlIHVzZWQgYXMgaW5wdXQgZm9yIFF0J3MgcWhlbHBnZW5lcmF0b3IgdG8gZ2VuZXJhdGUgYQ0KKyMgUXQgQ29tcHJlc3NlZCBIZWxwICgucWNoKSBvZiB0aGUgZ2VuZXJhdGVkIEhUTUwgZG9jdW1lbnRhdGlvbi4NCisNCitHRU5FUkFURV9RSFAgICAgICAgICAgID0gTk8NCisNCisjIElmIHRoZSBRSEdfTE9DQVRJT04gdGFnIGlzIHNwZWNpZmllZCwgdGhlIFFDSF9GSUxFIHRhZyBjYW4NCisjIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgZmlsZSBuYW1lIG9mIHRoZSByZXN1bHRpbmcgLnFjaCBmaWxlLg0KKyMgVGhlIHBhdGggc3BlY2lmaWVkIGlzIHJlbGF0aXZlIHRvIHRoZSBIVE1MIG91dHB1dCBmb2xkZXIuDQorDQorUUNIX0ZJTEUgICAgICAgICAgICAgICA9DQorDQorIyBUaGUgUUhQX05BTUVTUEFDRSB0YWcgc3BlY2lmaWVzIHRoZSBuYW1lc3BhY2UgdG8gdXNlIHdoZW4gZ2VuZXJhdGluZw0KKyMgUXQgSGVscCBQcm9qZWN0IG91dHB1dC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHNlZQ0KKyMgaHR0cDovL2RvYy50cm9sbHRlY2guY29tL3F0aGVscHByb2plY3QuaHRtbCNuYW1lc3BhY2UNCisNCitRSFBfTkFNRVNQQUNFICAgICAgICAgID0gb3JnLmRveHlnZW4uUHJvamVjdA0KKw0KKyMgVGhlIFFIUF9WSVJUVUFMX0ZPTERFUiB0YWcgc3BlY2lmaWVzIHRoZSBuYW1lc3BhY2UgdG8gdXNlIHdoZW4gZ2VuZXJhdGluZw0KKyMgUXQgSGVscCBQcm9qZWN0IG91dHB1dC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHNlZQ0KKyMgaHR0cDovL2RvYy50cm9sbHRlY2guY29tL3F0aGVscHByb2plY3QuaHRtbCN2aXJ0dWFsLWZvbGRlcnMNCisNCitRSFBfVklSVFVBTF9GT0xERVIgICAgID0gZG9jDQorDQorIyBJZiBRSFBfQ1VTVF9GSUxURVJfTkFNRSBpcyBzZXQsIGl0IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhIGN1c3RvbSBmaWx0ZXIgdG8NCisjIGFkZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHNlZQ0KKyMgaHR0cDovL2RvYy50cm9sbHRlY2guY29tL3F0aGVscHByb2plY3QuaHRtbCNjdXN0b20tZmlsdGVycw0KKw0KK1FIUF9DVVNUX0ZJTFRFUl9OQU1FICAgPQ0KKw0KKyMgVGhlIFFIUF9DVVNUX0ZJTFRfQVRUUlMgdGFnIHNwZWNpZmllcyB0aGUgbGlzdCBvZiB0aGUgYXR0cmlidXRlcyBvZiB0aGUNCisjIGN1c3RvbSBmaWx0ZXIgdG8gYWRkLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2Ugc2VlDQorIyA8YSBocmVmPSJodHRwOi8vZG9jLnRyb2xsdGVjaC5jb20vcXRoZWxwcHJvamVjdC5odG1sI2N1c3RvbS1maWx0ZXJzIj4NCisjIFF0IEhlbHAgUHJvamVjdCAvIEN1c3RvbSBGaWx0ZXJzPC9hPi4NCisNCitRSFBfQ1VTVF9GSUxURVJfQVRUUlMgID0NCisNCisjIFRoZSBRSFBfU0VDVF9GSUxURVJfQVRUUlMgdGFnIHNwZWNpZmllcyB0aGUgbGlzdCBvZiB0aGUgYXR0cmlidXRlcyB0aGlzDQorIyBwcm9qZWN0J3MNCisjIGZpbHRlciBzZWN0aW9uIG1hdGNoZXMuDQorIyA8YSBocmVmPSJodHRwOi8vZG9jLnRyb2xsdGVjaC5jb20vcXRoZWxwcHJvamVjdC5odG1sI2ZpbHRlci1hdHRyaWJ1dGVzIj4NCisjIFF0IEhlbHAgUHJvamVjdCAvIEZpbHRlciBBdHRyaWJ1dGVzPC9hPi4NCisNCitRSFBfU0VDVF9GSUxURVJfQVRUUlMgID0NCisNCisjIElmIHRoZSBHRU5FUkFURV9RSFAgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBRSEdfTE9DQVRJT04gdGFnIGNhbg0KKyMgYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBsb2NhdGlvbiBvZiBRdCdzIHFoZWxwZ2VuZXJhdG9yLg0KKyMgSWYgbm9uLWVtcHR5IGRveHlnZW4gd2lsbCB0cnkgdG8gcnVuIHFoZWxwZ2VuZXJhdG9yIG9uIHRoZSBnZW5lcmF0ZWQNCisjIC5xaHAgZmlsZS4NCisNCitRSEdfTE9DQVRJT04gICAgICAgICAgID0NCisNCisjIElmIHRoZSBHRU5FUkFURV9FQ0xJUFNFSEVMUCB0YWcgaXMgc2V0IHRvIFlFUywgYWRkaXRpb25hbCBpbmRleCBmaWxlcw0KKyMgIHdpbGwgYmUgZ2VuZXJhdGVkLCB3aGljaCB0b2dldGhlciB3aXRoIHRoZSBIVE1MIGZpbGVzLCBmb3JtIGFuIEVjbGlwc2UgaGVscA0KKyMgcGx1Z2luLiBUbyBpbnN0YWxsIHRoaXMgcGx1Z2luIGFuZCBtYWtlIGl0IGF2YWlsYWJsZSB1bmRlciB0aGUgaGVscCBjb250ZW50cw0KKyMgbWVudSBpbiBFY2xpcHNlLCB0aGUgY29udGVudHMgb2YgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBIVE1MIGFuZCBYTUwNCisjIGZpbGVzIG5lZWRzIHRvIGJlIGNvcGllZCBpbnRvIHRoZSBwbHVnaW5zIGRpcmVjdG9yeSBvZiBlY2xpcHNlLiBUaGUgbmFtZSBvZg0KKyMgdGhlIGRpcmVjdG9yeSB3aXRoaW4gdGhlIHBsdWdpbnMgZGlyZWN0b3J5IHNob3VsZCBiZSB0aGUgc2FtZSBhcw0KKyMgdGhlIEVDTElQU0VfRE9DX0lEIHZhbHVlLiBBZnRlciBjb3B5aW5nIEVjbGlwc2UgbmVlZHMgdG8gYmUgcmVzdGFydGVkIGJlZm9yZQ0KKyMgdGhlIGhlbHAgYXBwZWFycy4NCisNCitHRU5FUkFURV9FQ0xJUFNFSEVMUCAgID0gTk8NCisNCisjIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBlY2xpcHNlIGhlbHAgcGx1Z2luLiBXaGVuIGluc3RhbGxpbmcgdGhlIHBsdWdpbg0KKyMgdGhlIGRpcmVjdG9yeSBuYW1lIGNvbnRhaW5pbmcgdGhlIEhUTUwgYW5kIFhNTCBmaWxlcyBzaG91bGQgYWxzbyBoYXZlDQorIyB0aGlzIG5hbWUuDQorDQorRUNMSVBTRV9ET0NfSUQgICAgICAgICA9IG9yZy5kb3h5Z2VuLlByb2plY3QNCisNCisjIFRoZSBESVNBQkxFX0lOREVYIHRhZyBjYW4gYmUgdXNlZCB0byB0dXJuIG9uL29mZiB0aGUgY29uZGVuc2VkIGluZGV4ICh0YWJzKQ0KKyMgYXQgdG9wIG9mIGVhY2ggSFRNTCBwYWdlLiBUaGUgdmFsdWUgTk8gKHRoZSBkZWZhdWx0KSBlbmFibGVzIHRoZSBpbmRleCBhbmQNCisjIHRoZSB2YWx1ZSBZRVMgZGlzYWJsZXMgaXQuIFNpbmNlIHRoZSB0YWJzIGhhdmUgdGhlIHNhbWUgaW5mb3JtYXRpb24gYXMgdGhlDQorIyBuYXZpZ2F0aW9uIHRyZWUgeW91IGNhbiBzZXQgdGhpcyBvcHRpb24gdG8gTk8gaWYgeW91IGFscmVhZHkgc2V0DQorIyBHRU5FUkFURV9UUkVFVklFVyB0byBZRVMuDQorDQorRElTQUJMRV9JTkRFWCAgICAgICAgICA9IE5PDQorDQorIyBUaGUgR0VORVJBVEVfVFJFRVZJRVcgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGV0aGVyIGEgdHJlZS1saWtlIGluZGV4DQorIyBzdHJ1Y3R1cmUgc2hvdWxkIGJlIGdlbmVyYXRlZCB0byBkaXNwbGF5IGhpZXJhcmNoaWNhbCBpbmZvcm1hdGlvbi4NCisjIElmIHRoZSB0YWcgdmFsdWUgaXMgc2V0IHRvIFlFUywgYSBzaWRlIHBhbmVsIHdpbGwgYmUgZ2VuZXJhdGVkDQorIyBjb250YWluaW5nIGEgdHJlZS1saWtlIGluZGV4IHN0cnVjdHVyZSAoanVzdCBsaWtlIHRoZSBvbmUgdGhhdA0KKyMgaXMgZ2VuZXJhdGVkIGZvciBIVE1MIEhlbHApLiBGb3IgdGhpcyB0byB3b3JrIGEgYnJvd3NlciB0aGF0IHN1cHBvcnRzDQorIyBKYXZhU2NyaXB0LCBESFRNTCwgQ1NTIGFuZCBmcmFtZXMgaXMgcmVxdWlyZWQgKGkuZS4gYW55IG1vZGVybiBicm93c2VyKS4NCisjIFdpbmRvd3MgdXNlcnMgYXJlIHByb2JhYmx5IGJldHRlciBvZmYgdXNpbmcgdGhlIEhUTUwgaGVscCBmZWF0dXJlLg0KKyMgU2luY2UgdGhlIHRyZWUgYmFzaWNhbGx5IGhhcyB0aGUgc2FtZSBpbmZvcm1hdGlvbiBhcyB0aGUgdGFiIGluZGV4IHlvdQ0KKyMgY291bGQgY29uc2lkZXIgdG8gc2V0IERJU0FCTEVfSU5ERVggdG8gTk8gd2hlbiBlbmFibGluZyB0aGlzIG9wdGlvbi4NCisNCitHRU5FUkFURV9UUkVFVklFVyAgICAgID0gTk8NCisNCisjIFRoZSBFTlVNX1ZBTFVFU19QRVJfTElORSB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBudW1iZXIgb2YgZW51bSB2YWx1ZXMNCisjIChyYW5nZSBbMCwxLi4yMF0pIHRoYXQgZG94eWdlbiB3aWxsIGdyb3VwIG9uIG9uZSBsaW5lIGluIHRoZSBnZW5lcmF0ZWQgSFRNTA0KKyMgZG9jdW1lbnRhdGlvbi4gTm90ZSB0aGF0IGEgdmFsdWUgb2YgMCB3aWxsIGNvbXBsZXRlbHkgc3VwcHJlc3MgdGhlIGVudW0NCisjIHZhbHVlcyBmcm9tIGFwcGVhcmluZyBpbiB0aGUgb3ZlcnZpZXcgc2VjdGlvbi4NCisNCitFTlVNX1ZBTFVFU19QRVJfTElORSAgID0gNA0KKw0KKyMgSWYgdGhlIHRyZWV2aWV3IGlzIGVuYWJsZWQgKHNlZSBHRU5FUkFURV9UUkVFVklFVykgdGhlbiB0aGlzIHRhZyBjYW4gYmUNCisjIHVzZWQgdG8gc2V0IHRoZSBpbml0aWFsIHdpZHRoIChpbiBwaXhlbHMpIG9mIHRoZSBmcmFtZSBpbiB3aGljaCB0aGUgdHJlZQ0KKyMgaXMgc2hvd24uDQorDQorVFJFRVZJRVdfV0lEVEggICAgICAgICA9IDI1MA0KKw0KKyMgV2hlbiB0aGUgRVhUX0xJTktTX0lOX1dJTkRPVyBvcHRpb24gaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgb3Blbg0KKyMgbGlua3MgdG8gZXh0ZXJuYWwgc3ltYm9scyBpbXBvcnRlZCB2aWEgdGFnIGZpbGVzIGluIGEgc2VwYXJhdGUgd2luZG93Lg0KKw0KK0VYVF9MSU5LU19JTl9XSU5ET1cgICAgPSBOTw0KKw0KKyMgVXNlIHRoaXMgdGFnIHRvIGNoYW5nZSB0aGUgZm9udCBzaXplIG9mIExhdGV4IGZvcm11bGFzIGluY2x1ZGVkDQorIyBhcyBpbWFnZXMgaW4gdGhlIEhUTUwgZG9jdW1lbnRhdGlvbi4gVGhlIGRlZmF1bHQgaXMgMTAuIE5vdGUgdGhhdA0KKyMgd2hlbiB5b3UgY2hhbmdlIHRoZSBmb250IHNpemUgYWZ0ZXIgYSBzdWNjZXNzZnVsIGRveHlnZW4gcnVuIHlvdSBuZWVkDQorIyB0byBtYW51YWxseSByZW1vdmUgYW55IGZvcm1fKi5wbmcgaW1hZ2VzIGZyb20gdGhlIEhUTUwgb3V0cHV0IGRpcmVjdG9yeQ0KKyMgdG8gZm9yY2UgdGhlbSB0byBiZSByZWdlbmVyYXRlZC4NCisNCitGT1JNVUxBX0ZPTlRTSVpFICAgICAgID0gMTANCisNCisjIFVzZSB0aGUgRk9STVVMQV9UUkFOUEFSRU5UIHRhZyB0byBkZXRlcm1pbmUgd2hldGhlciBvciBub3QgdGhlIGltYWdlcw0KKyMgZ2VuZXJhdGVkIGZvciBmb3JtdWxhcyBhcmUgdHJhbnNwYXJlbnQgUE5Hcy4gVHJhbnNwYXJlbnQgUE5HcyBhcmUNCisjIG5vdCBzdXBwb3J0ZWQgcHJvcGVybHkgZm9yIElFIDYuMCwgYnV0IGFyZSBzdXBwb3J0ZWQgb24gYWxsIG1vZGVybiBicm93c2Vycy4NCisjIE5vdGUgdGhhdCB3aGVuIGNoYW5naW5nIHRoaXMgb3B0aW9uIHlvdSBuZWVkIHRvIGRlbGV0ZSBhbnkgZm9ybV8qLnBuZyBmaWxlcw0KKyMgaW4gdGhlIEhUTUwgb3V0cHV0IGJlZm9yZSB0aGUgY2hhbmdlcyBoYXZlIGVmZmVjdC4NCisNCitGT1JNVUxBX1RSQU5TUEFSRU5UICAgID0gWUVTDQorDQorIyBFbmFibGUgdGhlIFVTRV9NQVRISkFYIG9wdGlvbiB0byByZW5kZXIgTGFUZVggZm9ybXVsYXMgdXNpbmcgTWF0aEpheA0KKyMgKHNlZSBodHRwOi8vd3d3Lm1hdGhqYXgub3JnKSB3aGljaCB1c2VzIGNsaWVudCBzaWRlIEphdmFzY3JpcHQgZm9yIHRoZQ0KKyMgcmVuZGVyaW5nIGluc3RlYWQgb2YgdXNpbmcgcHJlcmVuZGVyZWQgYml0bWFwcy4gVXNlIHRoaXMgaWYgeW91IGRvIG5vdA0KKyMgaGF2ZSBMYVRlWCBpbnN0YWxsZWQgb3IgaWYgeW91IHdhbnQgdG8gZm9ybXVsYXMgbG9vayBwcmV0dGllciBpbiB0aGUgSFRNTA0KKyMgb3V0cHV0LiBXaGVuIGVuYWJsZWQgeW91IG1heSBhbHNvIG5lZWQgdG8gaW5zdGFsbCBNYXRoSmF4IHNlcGFyYXRlbHkgYW5kDQorIyBjb25maWd1cmUgdGhlIHBhdGggdG8gaXQgdXNpbmcgdGhlIE1BVEhKQVhfUkVMUEFUSCBvcHRpb24uDQorDQorVVNFX01BVEhKQVggICAgICAgICAgICA9IE5PDQorDQorIyBXaGVuIE1hdGhKYXggaXMgZW5hYmxlZCB5b3UgbmVlZCB0byBzcGVjaWZ5IHRoZSBsb2NhdGlvbiByZWxhdGl2ZSB0byB0aGUNCisjIEhUTUwgb3V0cHV0IGRpcmVjdG9yeSB1c2luZyB0aGUgTUFUSEpBWF9SRUxQQVRIIG9wdGlvbi4gVGhlIGRlc3RpbmF0aW9uDQorIyBkaXJlY3Rvcnkgc2hvdWxkIGNvbnRhaW4gdGhlIE1hdGhKYXguanMgc2NyaXB0LiBGb3IgaW5zdGFuY2UsIGlmIHRoZSBtYXRoamF4DQorIyBkaXJlY3RvcnkgaXMgbG9jYXRlZCBhdCB0aGUgc2FtZSBsZXZlbCBhcyB0aGUgSFRNTCBvdXRwdXQgZGlyZWN0b3J5LCB0aGVuDQorIyBNQVRISkFYX1JFTFBBVEggc2hvdWxkIGJlIC4uL21hdGhqYXguIFRoZSBkZWZhdWx0IHZhbHVlIHBvaW50cyB0bw0KKyMgdGhlIE1hdGhKYXggQ29udGVudCBEZWxpdmVyeSBOZXR3b3JrIHNvIHlvdSBjYW4gcXVpY2tseSBzZWUgdGhlIHJlc3VsdCB3aXRob3V0DQorIyBpbnN0YWxsaW5nIE1hdGhKYXguDQorIyBIb3dldmVyLCBpdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB0byBpbnN0YWxsIGEgbG9jYWwNCisjIGNvcHkgb2YgTWF0aEpheCBmcm9tIGh0dHA6Ly93d3cubWF0aGpheC5vcmcgYmVmb3JlIGRlcGxveW1lbnQuDQorDQorTUFUSEpBWF9SRUxQQVRIICAgICAgICA9IGh0dHA6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QNCisNCisjIFRoZSBNQVRISkFYX0VYVEVOU0lPTlMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIE1hdGhKYXggZXh0ZW5zaW9uDQorIyBuYW1lcyB0aGF0IHNob3VsZCBiZSBlbmFibGVkIGR1cmluZyBNYXRoSmF4IHJlbmRlcmluZy4NCisNCitNQVRISkFYX0VYVEVOU0lPTlMgICAgID0NCisNCisjIFdoZW4gdGhlIFNFQVJDSEVOR0lORSB0YWcgaXMgZW5hYmxlZCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBzZWFyY2ggYm94DQorIyBmb3IgdGhlIEhUTUwgb3V0cHV0LiBUaGUgdW5kZXJseWluZyBzZWFyY2ggZW5naW5lIHVzZXMgamF2YXNjcmlwdA0KKyMgYW5kIERIVE1MIGFuZCBzaG91bGQgd29yayBvbiBhbnkgbW9kZXJuIGJyb3dzZXIuIE5vdGUgdGhhdCB3aGVuIHVzaW5nDQorIyBIVE1MIGhlbHAgKEdFTkVSQVRFX0hUTUxIRUxQKSwgUXQgaGVscCAoR0VORVJBVEVfUUhQKSwgb3IgZG9jc2V0cw0KKyMgKEdFTkVSQVRFX0RPQ1NFVCkgdGhlcmUgaXMgYWxyZWFkeSBhIHNlYXJjaCBmdW5jdGlvbiBzbyB0aGlzIG9uZSBzaG91bGQNCisjIHR5cGljYWxseSBiZSBkaXNhYmxlZC4gRm9yIGxhcmdlIHByb2plY3RzIHRoZSBqYXZhc2NyaXB0IGJhc2VkIHNlYXJjaCBlbmdpbmUNCisjIGNhbiBiZSBzbG93LCB0aGVuIGVuYWJsaW5nIFNFUlZFUl9CQVNFRF9TRUFSQ0ggbWF5IHByb3ZpZGUgYSBiZXR0ZXIgc29sdXRpb24uDQorDQorU0VBUkNIRU5HSU5FICAgICAgICAgICA9IFlFUw0KKw0KKyMgV2hlbiB0aGUgU0VSVkVSX0JBU0VEX1NFQVJDSCB0YWcgaXMgZW5hYmxlZCB0aGUgc2VhcmNoIGVuZ2luZSB3aWxsIGJlDQorIyBpbXBsZW1lbnRlZCB1c2luZyBhIFBIUCBlbmFibGVkIHdlYiBzZXJ2ZXIgaW5zdGVhZCBvZiBhdCB0aGUgd2ViIGNsaWVudA0KKyMgdXNpbmcgSmF2YXNjcmlwdC4gRG94eWdlbiB3aWxsIGdlbmVyYXRlIHRoZSBzZWFyY2ggUEhQIHNjcmlwdCBhbmQgaW5kZXgNCisjIGZpbGUgdG8gcHV0IG9uIHRoZSB3ZWIgc2VydmVyLiBUaGUgYWR2YW50YWdlIG9mIHRoZSBzZXJ2ZXINCisjIGJhc2VkIGFwcHJvYWNoIGlzIHRoYXQgaXQgc2NhbGVzIGJldHRlciB0byBsYXJnZSBwcm9qZWN0cyBhbmQgYWxsb3dzDQorIyBmdWxsIHRleHQgc2VhcmNoLiBUaGUgZGlzYWR2YW50YWdlcyBhcmUgdGhhdCBpdCBpcyBtb3JlIGRpZmZpY3VsdCB0byBzZXR1cA0KKyMgYW5kIGRvZXMgbm90IGhhdmUgbGl2ZSBzZWFyY2hpbmcgY2FwYWJpbGl0aWVzLg0KKw0KK1NFUlZFUl9CQVNFRF9TRUFSQ0ggICAgPSBOTw0KKw0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBMYVRlWCBvdXRwdXQNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorIyBJZiB0aGUgR0VORVJBVEVfTEFURVggdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSBEb3h5Z2VuIHdpbGwNCisjIGdlbmVyYXRlIExhdGV4IG91dHB1dC4NCisNCitHRU5FUkFURV9MQVRFWCAgICAgICAgID0gWUVTDQorDQorIyBUaGUgTEFURVhfT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIExhVGVYIGRvY3Mgd2lsbCBiZSBwdXQuDQorIyBJZiBhIHJlbGF0aXZlIHBhdGggaXMgZW50ZXJlZCB0aGUgdmFsdWUgb2YgT1VUUFVUX0RJUkVDVE9SWSB3aWxsIGJlDQorIyBwdXQgaW4gZnJvbnQgb2YgaXQuIElmIGxlZnQgYmxhbmsgYGxhdGV4JyB3aWxsIGJlIHVzZWQgYXMgdGhlIGRlZmF1bHQgcGF0aC4NCisNCitMQVRFWF9PVVRQVVQgICAgICAgICAgID0NCisNCisjIFRoZSBMQVRFWF9DTURfTkFNRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgTGFUZVggY29tbWFuZCBuYW1lIHRvIGJlDQorIyBpbnZva2VkLiBJZiBsZWZ0IGJsYW5rIGBsYXRleCcgd2lsbCBiZSB1c2VkIGFzIHRoZSBkZWZhdWx0IGNvbW1hbmQgbmFtZS4NCisjIE5vdGUgdGhhdCB3aGVuIGVuYWJsaW5nIFVTRV9QREZMQVRFWCB0aGlzIG9wdGlvbiBpcyBvbmx5IHVzZWQgZm9yDQorIyBnZW5lcmF0aW5nIGJpdG1hcHMgZm9yIGZvcm11bGFzIGluIHRoZSBIVE1MIG91dHB1dCwgYnV0IG5vdCBpbiB0aGUNCisjIE1ha2VmaWxlIHRoYXQgaXMgd3JpdHRlbiB0byB0aGUgb3V0cHV0IGRpcmVjdG9yeS4NCisNCitMQVRFWF9DTURfTkFNRSAgICAgICAgID0gbGF0ZXgNCisNCisjIFRoZSBNQUtFSU5ERVhfQ01EX05BTUUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGNvbW1hbmQgbmFtZSB0bw0KKyMgZ2VuZXJhdGUgaW5kZXggZm9yIExhVGVYLiBJZiBsZWZ0IGJsYW5rIGBtYWtlaW5kZXgnIHdpbGwgYmUgdXNlZCBhcyB0aGUNCisjIGRlZmF1bHQgY29tbWFuZCBuYW1lLg0KKw0KK01BS0VJTkRFWF9DTURfTkFNRSAgICAgPSBtYWtlaW5kZXgNCisNCisjIElmIHRoZSBDT01QQUNUX0xBVEVYIHRhZyBpcyBzZXQgdG8gWUVTIERveHlnZW4gZ2VuZXJhdGVzIG1vcmUgY29tcGFjdA0KKyMgTGFUZVggZG9jdW1lbnRzLiBUaGlzIG1heSBiZSB1c2VmdWwgZm9yIHNtYWxsIHByb2plY3RzIGFuZCBtYXkgaGVscCB0bw0KKyMgc2F2ZSBzb21lIHRyZWVzIGluIGdlbmVyYWwuDQorDQorQ09NUEFDVF9MQVRFWCAgICAgICAgICA9IE5PDQorDQorIyBUaGUgUEFQRVJfVFlQRSB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBwYXBlciB0eXBlIHRoYXQgaXMgdXNlZA0KKyMgYnkgdGhlIHByaW50ZXIuIFBvc3NpYmxlIHZhbHVlcyBhcmU6IGE0LCBsZXR0ZXIsIGxlZ2FsIGFuZA0KKyMgZXhlY3V0aXZlLiBJZiBsZWZ0IGJsYW5rIGE0d2lkZSB3aWxsIGJlIHVzZWQuDQorDQorUEFQRVJfVFlQRSAgICAgICAgICAgICA9IGE0d2lkZQ0KKw0KKyMgVGhlIEVYVFJBX1BBQ0tBR0VTIHRhZyBjYW4gYmUgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBuYW1lcyBvZiBMYVRlWA0KKyMgcGFja2FnZXMgdGhhdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIExhVGVYIG91dHB1dC4NCisNCitFWFRSQV9QQUNLQUdFUyAgICAgICAgID0NCisNCisjIFRoZSBMQVRFWF9IRUFERVIgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBwZXJzb25hbCBMYVRlWCBoZWFkZXIgZm9yDQorIyB0aGUgZ2VuZXJhdGVkIGxhdGV4IGRvY3VtZW50LiBUaGUgaGVhZGVyIHNob3VsZCBjb250YWluIGV2ZXJ5dGhpbmcgdW50aWwNCisjIHRoZSBmaXJzdCBjaGFwdGVyLiBJZiBpdCBpcyBsZWZ0IGJsYW5rIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhDQorIyBzdGFuZGFyZCBoZWFkZXIuIE5vdGljZTogb25seSB1c2UgdGhpcyB0YWcgaWYgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nIQ0KKw0KK0xBVEVYX0hFQURFUiAgICAgICAgICAgPSBkb2MvZG94eWdlbi9oZWFkZXIudGV4DQorDQorIyBUaGUgTEFURVhfRk9PVEVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcGVyc29uYWwgTGFUZVggZm9vdGVyIGZvcg0KKyMgdGhlIGdlbmVyYXRlZCBsYXRleCBkb2N1bWVudC4gVGhlIGZvb3RlciBzaG91bGQgY29udGFpbiBldmVyeXRoaW5nIGFmdGVyDQorIyB0aGUgbGFzdCBjaGFwdGVyLiBJZiBpdCBpcyBsZWZ0IGJsYW5rIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhDQorIyBzdGFuZGFyZCBmb290ZXIuIE5vdGljZTogb25seSB1c2UgdGhpcyB0YWcgaWYgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nIQ0KKw0KK0xBVEVYX0ZPT1RFUiAgICAgICAgICAgPQ0KKw0KKyMgSWYgdGhlIFBERl9IWVBFUkxJTktTIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgTGFUZVggdGhhdCBpcyBnZW5lcmF0ZWQNCisjIGlzIHByZXBhcmVkIGZvciBjb252ZXJzaW9uIHRvIHBkZiAodXNpbmcgcHMycGRmKS4gVGhlIHBkZiBmaWxlIHdpbGwNCisjIGNvbnRhaW4gbGlua3MgKGp1c3QgbGlrZSB0aGUgSFRNTCBvdXRwdXQpIGluc3RlYWQgb2YgcGFnZSByZWZlcmVuY2VzDQorIyBUaGlzIG1ha2VzIHRoZSBvdXRwdXQgc3VpdGFibGUgZm9yIG9ubGluZSBicm93c2luZyB1c2luZyBhIHBkZiB2aWV3ZXIuDQorDQorUERGX0hZUEVSTElOS1MgICAgICAgICA9IFlFUw0KKw0KKyMgSWYgdGhlIFVTRV9QREZMQVRFWCB0YWcgaXMgc2V0IHRvIFlFUywgcGRmbGF0ZXggd2lsbCBiZSB1c2VkIGluc3RlYWQgb2YNCisjIHBsYWluIGxhdGV4IGluIHRoZSBnZW5lcmF0ZWQgTWFrZWZpbGUuIFNldCB0aGlzIG9wdGlvbiB0byBZRVMgdG8gZ2V0IGENCisjIGhpZ2hlciBxdWFsaXR5IFBERiBkb2N1bWVudGF0aW9uLg0KKw0KK1VTRV9QREZMQVRFWCAgICAgICAgICAgPSBZRVMNCisNCisjIElmIHRoZSBMQVRFWF9CQVRDSE1PREUgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBhZGQgdGhlIFxcYmF0Y2htb2RlLg0KKyMgY29tbWFuZCB0byB0aGUgZ2VuZXJhdGVkIExhVGVYIGZpbGVzLiBUaGlzIHdpbGwgaW5zdHJ1Y3QgTGFUZVggdG8ga2VlcA0KKyMgcnVubmluZyBpZiBlcnJvcnMgb2NjdXIsIGluc3RlYWQgb2YgYXNraW5nIHRoZSB1c2VyIGZvciBoZWxwLg0KKyMgVGhpcyBvcHRpb24gaXMgYWxzbyB1c2VkIHdoZW4gZ2VuZXJhdGluZyBmb3JtdWxhcyBpbiBIVE1MLg0KKw0KK0xBVEVYX0JBVENITU9ERSAgICAgICAgPSBOTw0KKw0KKyMgSWYgTEFURVhfSElERV9JTkRJQ0VTIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgbm90DQorIyBpbmNsdWRlIHRoZSBpbmRleCBjaGFwdGVycyAoc3VjaCBhcyBGaWxlIEluZGV4LCBDb21wb3VuZCBJbmRleCwgZXRjLikNCisjIGluIHRoZSBvdXRwdXQuDQorDQorTEFURVhfSElERV9JTkRJQ0VTICAgICA9IE5PDQorDQorIyBJZiBMQVRFWF9TT1VSQ0VfQ09ERSBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGluY2x1ZGUNCisjIHNvdXJjZSBjb2RlIHdpdGggc3ludGF4IGhpZ2hsaWdodGluZyBpbiB0aGUgTGFUZVggb3V0cHV0Lg0KKyMgTm90ZSB0aGF0IHdoaWNoIHNvdXJjZXMgYXJlIHNob3duIGFsc28gZGVwZW5kcyBvbiBvdGhlciBzZXR0aW5ncw0KKyMgc3VjaCBhcyBTT1VSQ0VfQlJPV1NFUi4NCisNCitMQVRFWF9TT1VSQ0VfQ09ERSAgICAgID0gTk8NCisNCisjIFRoZSBMQVRFWF9CSUJfU1RZTEUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIHN0eWxlIHRvIHVzZSBmb3IgdGhlDQorIyBiaWJsaW9ncmFwaHksIGUuZy4gcGxhaW5uYXQsIG9yIGllZWV0ci4gVGhlIGRlZmF1bHQgc3R5bGUgaXMgInBsYWluIi4gU2VlDQorIyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0JpYlRlWCBmb3IgbW9yZSBpbmZvLg0KKw0KK0xBVEVYX0JJQl9TVFlMRSAgICAgICAgPSBwbGFpbg0KKw0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBSVEYgb3V0cHV0DQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KKyMgSWYgdGhlIEdFTkVSQVRFX1JURiB0YWcgaXMgc2V0IHRvIFlFUyBEb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgUlRGIG91dHB1dA0KKyMgVGhlIFJURiBvdXRwdXQgaXMgb3B0aW1pemVkIGZvciBXb3JkIDk3IGFuZCBtYXkgbm90IGxvb2sgdmVyeSBwcmV0dHkgd2l0aA0KKyMgb3RoZXIgUlRGIHJlYWRlcnMgb3IgZWRpdG9ycy4NCisNCitHRU5FUkFURV9SVEYgICAgICAgICAgID0gTk8NCisNCisjIFRoZSBSVEZfT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIFJURiBkb2NzIHdpbGwgYmUgcHV0Lg0KKyMgSWYgYSByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZQ0KKyMgcHV0IGluIGZyb250IG9mIGl0LiBJZiBsZWZ0IGJsYW5rIGBydGYnIHdpbGwgYmUgdXNlZCBhcyB0aGUgZGVmYXVsdCBwYXRoLg0KKw0KK1JURl9PVVRQVVQgICAgICAgICAgICAgPQ0KKw0KKyMgSWYgdGhlIENPTVBBQ1RfUlRGIHRhZyBpcyBzZXQgdG8gWUVTIERveHlnZW4gZ2VuZXJhdGVzIG1vcmUgY29tcGFjdA0KKyMgUlRGIGRvY3VtZW50cy4gVGhpcyBtYXkgYmUgdXNlZnVsIGZvciBzbWFsbCBwcm9qZWN0cyBhbmQgbWF5IGhlbHAgdG8NCisjIHNhdmUgc29tZSB0cmVlcyBpbiBnZW5lcmFsLg0KKw0KK0NPTVBBQ1RfUlRGICAgICAgICAgICAgPSBOTw0KKw0KKyMgSWYgdGhlIFJURl9IWVBFUkxJTktTIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgUlRGIHRoYXQgaXMgZ2VuZXJhdGVkDQorIyB3aWxsIGNvbnRhaW4gaHlwZXJsaW5rIGZpZWxkcy4gVGhlIFJURiBmaWxlIHdpbGwNCisjIGNvbnRhaW4gbGlua3MgKGp1c3QgbGlrZSB0aGUgSFRNTCBvdXRwdXQpIGluc3RlYWQgb2YgcGFnZSByZWZlcmVuY2VzLg0KKyMgVGhpcyBtYWtlcyB0aGUgb3V0cHV0IHN1aXRhYmxlIGZvciBvbmxpbmUgYnJvd3NpbmcgdXNpbmcgV09SRCBvciBvdGhlcg0KKyMgcHJvZ3JhbXMgd2hpY2ggc3VwcG9ydCB0aG9zZSBmaWVsZHMuDQorIyBOb3RlOiB3b3JkcGFkICh3cml0ZSkgYW5kIG90aGVycyBkbyBub3Qgc3VwcG9ydCBsaW5rcy4NCisNCitSVEZfSFlQRVJMSU5LUyAgICAgICAgID0gTk8NCisNCisjIExvYWQgc3R5bGUgc2hlZXQgZGVmaW5pdGlvbnMgZnJvbSBmaWxlLiBTeW50YXggaXMgc2ltaWxhciB0byBkb3h5Z2VuJ3MNCisjIGNvbmZpZyBmaWxlLCBpLmUuIGEgc2VyaWVzIG9mIGFzc2lnbm1lbnRzLiBZb3Ugb25seSBoYXZlIHRvIHByb3ZpZGUNCisjIHJlcGxhY2VtZW50cywgbWlzc2luZyBkZWZpbml0aW9ucyBhcmUgc2V0IHRvIHRoZWlyIGRlZmF1bHQgdmFsdWUuDQorDQorUlRGX1NUWUxFU0hFRVRfRklMRSAgICA9DQorDQorIyBTZXQgb3B0aW9uYWwgdmFyaWFibGVzIHVzZWQgaW4gdGhlIGdlbmVyYXRpb24gb2YgYW4gcnRmIGRvY3VtZW50Lg0KKyMgU3ludGF4IGlzIHNpbWlsYXIgdG8gZG94eWdlbidzIGNvbmZpZyBmaWxlLg0KKw0KK1JURl9FWFRFTlNJT05TX0ZJTEUgICAgPQ0KKw0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBtYW4gcGFnZSBvdXRwdXQNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorIyBJZiB0aGUgR0VORVJBVEVfTUFOIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgRG94eWdlbiB3aWxsDQorIyBnZW5lcmF0ZSBtYW4gcGFnZXMNCisNCitHRU5FUkFURV9NQU4gICAgICAgICAgID0gTk8NCisNCisjIFRoZSBNQU5fT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIG1hbiBwYWdlcyB3aWxsIGJlIHB1dC4NCisjIElmIGEgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkIHRoZSB2YWx1ZSBvZiBPVVRQVVRfRElSRUNUT1JZIHdpbGwgYmUNCisjIHB1dCBpbiBmcm9udCBvZiBpdC4gSWYgbGVmdCBibGFuayBgbWFuJyB3aWxsIGJlIHVzZWQgYXMgdGhlIGRlZmF1bHQgcGF0aC4NCisNCitNQU5fT1VUUFVUICAgICAgICAgICAgID0NCisNCisjIFRoZSBNQU5fRVhURU5TSU9OIHRhZyBkZXRlcm1pbmVzIHRoZSBleHRlbnNpb24gdGhhdCBpcyBhZGRlZCB0bw0KKyMgdGhlIGdlbmVyYXRlZCBtYW4gcGFnZXMgKGRlZmF1bHQgaXMgdGhlIHN1YnJvdXRpbmUncyBzZWN0aW9uIC4zKQ0KKw0KK01BTl9FWFRFTlNJT04gICAgICAgICAgPQ0KKw0KKyMgSWYgdGhlIE1BTl9MSU5LUyB0YWcgaXMgc2V0IHRvIFlFUyBhbmQgRG94eWdlbiBnZW5lcmF0ZXMgbWFuIG91dHB1dCwNCisjIHRoZW4gaXQgd2lsbCBnZW5lcmF0ZSBvbmUgYWRkaXRpb25hbCBtYW4gZmlsZSBmb3IgZWFjaCBlbnRpdHkNCisjIGRvY3VtZW50ZWQgaW4gdGhlIHJlYWwgbWFuIHBhZ2UocykuIFRoZXNlIGFkZGl0aW9uYWwgZmlsZXMNCisjIG9ubHkgc291cmNlIHRoZSByZWFsIG1hbiBwYWdlLCBidXQgd2l0aG91dCB0aGVtIHRoZSBtYW4gY29tbWFuZA0KKyMgd291bGQgYmUgdW5hYmxlIHRvIGZpbmQgdGhlIGNvcnJlY3QgcGFnZS4gVGhlIGRlZmF1bHQgaXMgTk8uDQorDQorTUFOX0xJTktTICAgICAgICAgICAgICA9IE5PDQorDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIFhNTCBvdXRwdXQNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorIyBJZiB0aGUgR0VORVJBVEVfWE1MIHRhZyBpcyBzZXQgdG8gWUVTIERveHlnZW4gd2lsbA0KKyMgZ2VuZXJhdGUgYW4gWE1MIGZpbGUgdGhhdCBjYXB0dXJlcyB0aGUgc3RydWN0dXJlIG9mDQorIyB0aGUgY29kZSBpbmNsdWRpbmcgYWxsIGRvY3VtZW50YXRpb24uDQorDQorR0VORVJBVEVfWE1MICAgICAgICAgICA9IE5PDQorDQorIyBUaGUgWE1MX09VVFBVVCB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHdoZXJlIHRoZSBYTUwgcGFnZXMgd2lsbCBiZSBwdXQuDQorIyBJZiBhIHJlbGF0aXZlIHBhdGggaXMgZW50ZXJlZCB0aGUgdmFsdWUgb2YgT1VUUFVUX0RJUkVDVE9SWSB3aWxsIGJlDQorIyBwdXQgaW4gZnJvbnQgb2YgaXQuIElmIGxlZnQgYmxhbmsgYHhtbCcgd2lsbCBiZSB1c2VkIGFzIHRoZSBkZWZhdWx0IHBhdGguDQorDQorWE1MX09VVFBVVCAgICAgICAgICAgICA9IHhtbA0KKw0KKyMgVGhlIFhNTF9TQ0hFTUEgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYW4gWE1MIHNjaGVtYSwNCisjIHdoaWNoIGNhbiBiZSB1c2VkIGJ5IGEgdmFsaWRhdGluZyBYTUwgcGFyc2VyIHRvIGNoZWNrIHRoZQ0KKyMgc3ludGF4IG9mIHRoZSBYTUwgZmlsZXMuDQorDQorWE1MX1NDSEVNQSAgICAgICAgICAgICA9DQorDQorIyBUaGUgWE1MX0RURCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhbiBYTUwgRFRELA0KKyMgd2hpY2ggY2FuIGJlIHVzZWQgYnkgYSB2YWxpZGF0aW5nIFhNTCBwYXJzZXIgdG8gY2hlY2sgdGhlDQorIyBzeW50YXggb2YgdGhlIFhNTCBmaWxlcy4NCisNCitYTUxfRFREICAgICAgICAgICAgICAgID0NCisNCisjIElmIHRoZSBYTUxfUFJPR1JBTUxJU1RJTkcgdGFnIGlzIHNldCB0byBZRVMgRG94eWdlbiB3aWxsDQorIyBkdW1wIHRoZSBwcm9ncmFtIGxpc3RpbmdzIChpbmNsdWRpbmcgc3ludGF4IGhpZ2hsaWdodGluZw0KKyMgYW5kIGNyb3NzLXJlZmVyZW5jaW5nIGluZm9ybWF0aW9uKSB0byB0aGUgWE1MIG91dHB1dC4gTm90ZSB0aGF0DQorIyBlbmFibGluZyB0aGlzIHdpbGwgc2lnbmlmaWNhbnRseSBpbmNyZWFzZSB0aGUgc2l6ZSBvZiB0aGUgWE1MIG91dHB1dC4NCisNCitYTUxfUFJPR1JBTUxJU1RJTkcgICAgID0gWUVTDQorDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgQXV0b0dlbiBEZWZpbml0aW9ucyBvdXRwdXQNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorIyBJZiB0aGUgR0VORVJBVEVfQVVUT0dFTl9ERUYgdGFnIGlzIHNldCB0byBZRVMgRG94eWdlbiB3aWxsDQorIyBnZW5lcmF0ZSBhbiBBdXRvR2VuIERlZmluaXRpb25zIChzZWUgYXV0b2dlbi5zZi5uZXQpIGZpbGUNCisjIHRoYXQgY2FwdHVyZXMgdGhlIHN0cnVjdHVyZSBvZiB0aGUgY29kZSBpbmNsdWRpbmcgYWxsDQorIyBkb2N1bWVudGF0aW9uLiBOb3RlIHRoYXQgdGhpcyBmZWF0dXJlIGlzIHN0aWxsIGV4cGVyaW1lbnRhbA0KKyMgYW5kIGluY29tcGxldGUgYXQgdGhlIG1vbWVudC4NCisNCitHRU5FUkFURV9BVVRPR0VOX0RFRiAgID0gTk8NCisNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgUGVybCBtb2R1bGUgb3V0cHV0DQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KKyMgSWYgdGhlIEdFTkVSQVRFX1BFUkxNT0QgdGFnIGlzIHNldCB0byBZRVMgRG94eWdlbiB3aWxsDQorIyBnZW5lcmF0ZSBhIFBlcmwgbW9kdWxlIGZpbGUgdGhhdCBjYXB0dXJlcyB0aGUgc3RydWN0dXJlIG9mDQorIyB0aGUgY29kZSBpbmNsdWRpbmcgYWxsIGRvY3VtZW50YXRpb24uIE5vdGUgdGhhdCB0aGlzDQorIyBmZWF0dXJlIGlzIHN0aWxsIGV4cGVyaW1lbnRhbCBhbmQgaW5jb21wbGV0ZSBhdCB0aGUNCisjIG1vbWVudC4NCisNCitHRU5FUkFURV9QRVJMTU9EICAgICAgID0gTk8NCisNCisjIElmIHRoZSBQRVJMTU9EX0xBVEVYIHRhZyBpcyBzZXQgdG8gWUVTIERveHlnZW4gd2lsbCBnZW5lcmF0ZQ0KKyMgdGhlIG5lY2Vzc2FyeSBNYWtlZmlsZSBydWxlcywgUGVybCBzY3JpcHRzIGFuZCBMYVRlWCBjb2RlIHRvIGJlIGFibGUNCisjIHRvIGdlbmVyYXRlIFBERiBhbmQgRFZJIG91dHB1dCBmcm9tIHRoZSBQZXJsIG1vZHVsZSBvdXRwdXQuDQorDQorUEVSTE1PRF9MQVRFWCAgICAgICAgICA9IE5PDQorDQorIyBJZiB0aGUgUEVSTE1PRF9QUkVUVFkgdGFnIGlzIHNldCB0byBZRVMgdGhlIFBlcmwgbW9kdWxlIG91dHB1dCB3aWxsIGJlDQorIyBuaWNlbHkgZm9ybWF0dGVkIHNvIGl0IGNhbiBiZSBwYXJzZWQgYnkgYSBodW1hbiByZWFkZXIuDQorIyBUaGlzIGlzIHVzZWZ1bA0KKyMgaWYgeW91IHdhbnQgdG8gdW5kZXJzdGFuZCB3aGF0IGlzIGdvaW5nIG9uLg0KKyMgT24gdGhlIG90aGVyIGhhbmQsIGlmIHRoaXMNCisjIHRhZyBpcyBzZXQgdG8gTk8gdGhlIHNpemUgb2YgdGhlIFBlcmwgbW9kdWxlIG91dHB1dCB3aWxsIGJlIG11Y2ggc21hbGxlcg0KKyMgYW5kIFBlcmwgd2lsbCBwYXJzZSBpdCBqdXN0IHRoZSBzYW1lLg0KKw0KK1BFUkxNT0RfUFJFVFRZICAgICAgICAgPSBZRVMNCisNCisjIFRoZSBuYW1lcyBvZiB0aGUgbWFrZSB2YXJpYWJsZXMgaW4gdGhlIGdlbmVyYXRlZCBkb3h5cnVsZXMubWFrZSBmaWxlDQorIyBhcmUgcHJlZml4ZWQgd2l0aCB0aGUgc3RyaW5nIGNvbnRhaW5lZCBpbiBQRVJMTU9EX01BS0VWQVJfUFJFRklYLg0KKyMgVGhpcyBpcyB1c2VmdWwgc28gZGlmZmVyZW50IGRveHlydWxlcy5tYWtlIGZpbGVzIGluY2x1ZGVkIGJ5IHRoZSBzYW1lDQorIyBNYWtlZmlsZSBkb24ndCBvdmVyd3JpdGUgZWFjaCBvdGhlcidzIHZhcmlhYmxlcy4NCisNCitQRVJMTU9EX01BS0VWQVJfUFJFRklYID0NCisNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgcHJlcHJvY2Vzc29yDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KKyMgSWYgdGhlIEVOQUJMRV9QUkVQUk9DRVNTSU5HIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgRG94eWdlbiB3aWxsDQorIyBldmFsdWF0ZSBhbGwgQy1wcmVwcm9jZXNzb3IgZGlyZWN0aXZlcyBmb3VuZCBpbiB0aGUgc291cmNlcyBhbmQgaW5jbHVkZQ0KKyMgZmlsZXMuDQorDQorRU5BQkxFX1BSRVBST0NFU1NJTkcgICA9IFlFUw0KKw0KKyMgSWYgdGhlIE1BQ1JPX0VYUEFOU0lPTiB0YWcgaXMgc2V0IHRvIFlFUyBEb3h5Z2VuIHdpbGwgZXhwYW5kIGFsbCBtYWNybw0KKyMgbmFtZXMgaW4gdGhlIHNvdXJjZSBjb2RlLiBJZiBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KSBvbmx5IGNvbmRpdGlvbmFsDQorIyBjb21waWxhdGlvbiB3aWxsIGJlIHBlcmZvcm1lZC4gTWFjcm8gZXhwYW5zaW9uIGNhbiBiZSBkb25lIGluIGEgY29udHJvbGxlZA0KKyMgd2F5IGJ5IHNldHRpbmcgRVhQQU5EX09OTFlfUFJFREVGIHRvIFlFUy4NCisNCitNQUNST19FWFBBTlNJT04gICAgICAgID0gWUVTDQorDQorIyBJZiB0aGUgRVhQQU5EX09OTFlfUFJFREVGIGFuZCBNQUNST19FWFBBTlNJT04gdGFncyBhcmUgYm90aCBzZXQgdG8gWUVTDQorIyB0aGVuIHRoZSBtYWNybyBleHBhbnNpb24gaXMgbGltaXRlZCB0byB0aGUgbWFjcm9zIHNwZWNpZmllZCB3aXRoIHRoZQ0KKyMgUFJFREVGSU5FRCBhbmQgRVhQQU5EX0FTX0RFRklORUQgdGFncy4NCisNCitFWFBBTkRfT05MWV9QUkVERUYgICAgID0gWUVTDQorDQorIyBJZiB0aGUgU0VBUkNIX0lOQ0xVREVTIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgdGhlIGluY2x1ZGVzIGZpbGVzDQorIyBwb2ludGVkIHRvIGJ5IElOQ0xVREVfUEFUSCB3aWxsIGJlIHNlYXJjaGVkIHdoZW4gYSAjaW5jbHVkZSBpcyBmb3VuZC4NCisNCitTRUFSQ0hfSU5DTFVERVMgICAgICAgID0gWUVTDQorDQorIyBUaGUgSU5DTFVERV9QQVRIIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGRpcmVjdG9yaWVzIHRoYXQNCisjIGNvbnRhaW4gaW5jbHVkZSBmaWxlcyB0aGF0IGFyZSBub3QgaW5wdXQgZmlsZXMgYnV0IHNob3VsZCBiZSBwcm9jZXNzZWQgYnkNCisjIHRoZSBwcmVwcm9jZXNzb3IuDQorDQorSU5DTFVERV9QQVRIICAgICAgICAgICA9DQorDQorIyBZb3UgY2FuIHVzZSB0aGUgSU5DTFVERV9GSUxFX1BBVFRFUk5TIHRhZyB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHdpbGRjYXJkDQorIyBwYXR0ZXJucyAobGlrZSAqLmggYW5kICouaHBwKSB0byBmaWx0ZXIgb3V0IHRoZSBoZWFkZXItZmlsZXMgaW4gdGhlDQorIyBkaXJlY3Rvcmllcy4gSWYgbGVmdCBibGFuaywgdGhlIHBhdHRlcm5zIHNwZWNpZmllZCB3aXRoIEZJTEVfUEFUVEVSTlMgd2lsbA0KKyMgYmUgdXNlZC4NCisNCitJTkNMVURFX0ZJTEVfUEFUVEVSTlMgID0NCisNCisjIFRoZSBQUkVERUZJTkVEIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIG1hY3JvIG5hbWVzIHRoYXQNCisjIGFyZSBkZWZpbmVkIGJlZm9yZSB0aGUgcHJlcHJvY2Vzc29yIGlzIHN0YXJ0ZWQgKHNpbWlsYXIgdG8gdGhlIC1EIG9wdGlvbiBvZg0KKyMgZ2NjKS4gVGhlIGFyZ3VtZW50IG9mIHRoZSB0YWcgaXMgYSBsaXN0IG9mIG1hY3JvcyBvZiB0aGUgZm9ybTogbmFtZQ0KKyMgb3IgbmFtZT1kZWZpbml0aW9uIChubyBzcGFjZXMpLiBJZiB0aGUgZGVmaW5pdGlvbiBhbmQgdGhlID0gYXJlDQorIyBvbWl0dGVkID0xIGlzIGFzc3VtZWQuIFRvIHByZXZlbnQgYSBtYWNybyBkZWZpbml0aW9uIGZyb20gYmVpbmcNCisjIHVuZGVmaW5lZCB2aWEgI3VuZGVmIG9yIHJlY3Vyc2l2ZWx5IGV4cGFuZGVkIHVzZSB0aGUgOj0gb3BlcmF0b3INCisjIGluc3RlYWQgb2YgdGhlID0gb3BlcmF0b3IuDQorDQorUFJFREVGSU5FRCAgICAgICAgICAgICA9IE9NUF8zMF9FTkFCTEVEPTEsIE9NUF80MF9FTkFCTEVEPTEsIEtNUF9TVEFUU19FTkFCTEVEPTENCisNCisjIElmIHRoZSBNQUNST19FWFBBTlNJT04gYW5kIEVYUEFORF9PTkxZX1BSRURFRiB0YWdzIGFyZSBzZXQgdG8gWUVTIHRoZW4NCisjIHRoaXMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBsaXN0IG9mIG1hY3JvIG5hbWVzIHRoYXQgc2hvdWxkIGJlIGV4cGFuZGVkLg0KKyMgVGhlIG1hY3JvIGRlZmluaXRpb24gdGhhdCBpcyBmb3VuZCBpbiB0aGUgc291cmNlcyB3aWxsIGJlIHVzZWQuDQorIyBVc2UgdGhlIFBSRURFRklORUQgdGFnIGlmIHlvdSB3YW50IHRvIHVzZSBhIGRpZmZlcmVudCBtYWNybyBkZWZpbml0aW9uIHRoYXQNCisjIG92ZXJydWxlcyB0aGUgZGVmaW5pdGlvbiBmb3VuZCBpbiB0aGUgc291cmNlIGNvZGUuDQorDQorRVhQQU5EX0FTX0RFRklORUQgICAgICA9DQorDQorIyBJZiB0aGUgU0tJUF9GVU5DVElPTl9NQUNST1MgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSB0aGVuDQorIyBkb3h5Z2VuJ3MgcHJlcHJvY2Vzc29yIHdpbGwgcmVtb3ZlIGFsbCByZWZlcmVuY2VzIHRvIGZ1bmN0aW9uLWxpa2UgbWFjcm9zDQorIyB0aGF0IGFyZSBhbG9uZSBvbiBhIGxpbmUsIGhhdmUgYW4gYWxsIHVwcGVyY2FzZSBuYW1lLCBhbmQgZG8gbm90IGVuZCB3aXRoIGENCisjIHNlbWljb2xvbiwgYmVjYXVzZSB0aGVzZSB3aWxsIGNvbmZ1c2UgdGhlIHBhcnNlciBpZiBub3QgcmVtb3ZlZC4NCisNCitTS0lQX0ZVTkNUSU9OX01BQ1JPUyAgID0gWUVTDQorDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyMgQ29uZmlndXJhdGlvbjo6YWRkaXRpb25zIHJlbGF0ZWQgdG8gZXh0ZXJuYWwgcmVmZXJlbmNlcw0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCisjIFRoZSBUQUdGSUxFUyBvcHRpb24gY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSB0YWdmaWxlcy4gRm9yIGVhY2gNCisjIHRhZyBmaWxlIHRoZSBsb2NhdGlvbiBvZiB0aGUgZXh0ZXJuYWwgZG9jdW1lbnRhdGlvbiBzaG91bGQgYmUgYWRkZWQuIFRoZQ0KKyMgZm9ybWF0IG9mIGEgdGFnIGZpbGUgd2l0aG91dCB0aGlzIGxvY2F0aW9uIGlzIGFzIGZvbGxvd3M6DQorIw0KKyMgVEFHRklMRVMgPSBmaWxlMSBmaWxlMiAuLi4NCisjIEFkZGluZyBsb2NhdGlvbiBmb3IgdGhlIHRhZyBmaWxlcyBpcyBkb25lIGFzIGZvbGxvd3M6DQorIw0KKyMgVEFHRklMRVMgPSBmaWxlMT1sb2MxICJmaWxlMiA9IGxvYzIiIC4uLg0KKyMgd2hlcmUgImxvYzEiIGFuZCAibG9jMiIgY2FuIGJlIHJlbGF0aXZlIG9yIGFic29sdXRlIHBhdGhzDQorIyBvciBVUkxzLiBOb3RlIHRoYXQgZWFjaCB0YWcgZmlsZSBtdXN0IGhhdmUgYSB1bmlxdWUgbmFtZSAod2hlcmUgdGhlIG5hbWUgZG9lcw0KKyMgTk9UIGluY2x1ZGUgdGhlIHBhdGgpLiBJZiBhIHRhZyBmaWxlIGlzIG5vdCBsb2NhdGVkIGluIHRoZSBkaXJlY3RvcnkgaW4gd2hpY2gNCisjIGRveHlnZW4gaXMgcnVuLCB5b3UgbXVzdCBhbHNvIHNwZWNpZnkgdGhlIHBhdGggdG8gdGhlIHRhZ2ZpbGUgaGVyZS4NCisNCitUQUdGSUxFUyAgICAgICAgICAgICAgID0NCisNCisjIFdoZW4gYSBmaWxlIG5hbWUgaXMgc3BlY2lmaWVkIGFmdGVyIEdFTkVSQVRFX1RBR0ZJTEUsIGRveHlnZW4gd2lsbCBjcmVhdGUNCisjIGEgdGFnIGZpbGUgdGhhdCBpcyBiYXNlZCBvbiB0aGUgaW5wdXQgZmlsZXMgaXQgcmVhZHMuDQorDQorR0VORVJBVEVfVEFHRklMRSAgICAgICA9DQorDQorIyBJZiB0aGUgQUxMRVhURVJOQUxTIHRhZyBpcyBzZXQgdG8gWUVTIGFsbCBleHRlcm5hbCBjbGFzc2VzIHdpbGwgYmUgbGlzdGVkDQorIyBpbiB0aGUgY2xhc3MgaW5kZXguIElmIHNldCB0byBOTyBvbmx5IHRoZSBpbmhlcml0ZWQgZXh0ZXJuYWwgY2xhc3Nlcw0KKyMgd2lsbCBiZSBsaXN0ZWQuDQorDQorQUxMRVhURVJOQUxTICAgICAgICAgICA9IE5PDQorDQorIyBJZiB0aGUgRVhURVJOQUxfR1JPVVBTIHRhZyBpcyBzZXQgdG8gWUVTIGFsbCBleHRlcm5hbCBncm91cHMgd2lsbCBiZSBsaXN0ZWQNCisjIGluIHRoZSBtb2R1bGVzIGluZGV4LiBJZiBzZXQgdG8gTk8sIG9ubHkgdGhlIGN1cnJlbnQgcHJvamVjdCdzIGdyb3VwcyB3aWxsDQorIyBiZSBsaXN0ZWQuDQorDQorRVhURVJOQUxfR1JPVVBTICAgICAgICA9IFlFUw0KKw0KKyMgVGhlIFBFUkxfUEFUSCBzaG91bGQgYmUgdGhlIGFic29sdXRlIHBhdGggYW5kIG5hbWUgb2YgdGhlIHBlcmwgc2NyaXB0DQorIyBpbnRlcnByZXRlciAoaS5lLiB0aGUgcmVzdWx0IG9mIGB3aGljaCBwZXJsJykuDQorDQorUEVSTF9QQVRIICAgICAgICAgICAgICA9DQorDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIGRvdCB0b29sDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KKyMgSWYgdGhlIENMQVNTX0RJQUdSQU1TIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgRG94eWdlbiB3aWxsDQorIyBnZW5lcmF0ZSBhIGluaGVyaXRhbmNlIGRpYWdyYW0gKGluIEhUTUwsIFJURiBhbmQgTGFUZVgpIGZvciBjbGFzc2VzIHdpdGggYmFzZQ0KKyMgb3Igc3VwZXIgY2xhc3Nlcy4gU2V0dGluZyB0aGUgdGFnIHRvIE5PIHR1cm5zIHRoZSBkaWFncmFtcyBvZmYuIE5vdGUgdGhhdA0KKyMgdGhpcyBvcHRpb24gYWxzbyB3b3JrcyB3aXRoIEhBVkVfRE9UIGRpc2FibGVkLCBidXQgaXQgaXMgcmVjb21tZW5kZWQgdG8NCisjIGluc3RhbGwgYW5kIHVzZSBkb3QsIHNpbmNlIGl0IHlpZWxkcyBtb3JlIHBvd2VyZnVsIGdyYXBocy4NCisNCitDTEFTU19ESUFHUkFNUyAgICAgICAgID0gWUVTDQorDQorIyBZb3UgY2FuIGRlZmluZSBtZXNzYWdlIHNlcXVlbmNlIGNoYXJ0cyB3aXRoaW4gZG94eWdlbiBjb21tZW50cyB1c2luZyB0aGUgXG1zYw0KKyMgY29tbWFuZC4gRG94eWdlbiB3aWxsIHRoZW4gcnVuIHRoZSBtc2NnZW4gdG9vbCAoc2VlDQorIyBodHRwOi8vd3d3Lm1jdGVybmFuLm1lLnVrL21zY2dlbi8pIHRvIHByb2R1Y2UgdGhlIGNoYXJ0IGFuZCBpbnNlcnQgaXQgaW4gdGhlDQorIyBkb2N1bWVudGF0aW9uLiBUaGUgTVNDR0VOX1BBVEggdGFnIGFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUgZGlyZWN0b3J5IHdoZXJlDQorIyB0aGUgbXNjZ2VuIHRvb2wgcmVzaWRlcy4gSWYgbGVmdCBlbXB0eSB0aGUgdG9vbCBpcyBhc3N1bWVkIHRvIGJlIGZvdW5kIGluIHRoZQ0KKyMgZGVmYXVsdCBzZWFyY2ggcGF0aC4NCisNCitNU0NHRU5fUEFUSCAgICAgICAgICAgID0NCisNCisjIElmIHNldCB0byBZRVMsIHRoZSBpbmhlcml0YW5jZSBhbmQgY29sbGFib3JhdGlvbiBncmFwaHMgd2lsbCBoaWRlDQorIyBpbmhlcml0YW5jZSBhbmQgdXNhZ2UgcmVsYXRpb25zIGlmIHRoZSB0YXJnZXQgaXMgdW5kb2N1bWVudGVkDQorIyBvciBpcyBub3QgYSBjbGFzcy4NCisNCitISURFX1VORE9DX1JFTEFUSU9OUyAgID0gWUVTDQorDQorIyBJZiB5b3Ugc2V0IHRoZSBIQVZFX0RPVCB0YWcgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGFzc3VtZSB0aGUgZG90IHRvb2wgaXMNCisjIGF2YWlsYWJsZSBmcm9tIHRoZSBwYXRoLiBUaGlzIHRvb2wgaXMgcGFydCBvZiBHcmFwaHZpeiwgYSBncmFwaCB2aXN1YWxpemF0aW9uDQorIyB0b29sa2l0IGZyb20gQVQmVCBhbmQgTHVjZW50IEJlbGwgTGFicy4gVGhlIG90aGVyIG9wdGlvbnMgaW4gdGhpcyBzZWN0aW9uDQorIyBoYXZlIG5vIGVmZmVjdCBpZiB0aGlzIG9wdGlvbiBpcyBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KQ0KKw0KK0hBVkVfRE9UICAgICAgICAgICAgICAgPSBOTw0KKw0KKyMgVGhlIERPVF9OVU1fVEhSRUFEUyBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBkb3QgaW52b2NhdGlvbnMgZG94eWdlbiBpcw0KKyMgYWxsb3dlZCB0byBydW4gaW4gcGFyYWxsZWwuIFdoZW4gc2V0IHRvIDAgKHRoZSBkZWZhdWx0KSBkb3h5Z2VuIHdpbGwNCisjIGJhc2UgdGhpcyBvbiB0aGUgbnVtYmVyIG9mIHByb2Nlc3NvcnMgYXZhaWxhYmxlIGluIHRoZSBzeXN0ZW0uIFlvdSBjYW4gc2V0IGl0DQorIyBleHBsaWNpdGx5IHRvIGEgdmFsdWUgbGFyZ2VyIHRoYW4gMCB0byBnZXQgY29udHJvbCBvdmVyIHRoZSBiYWxhbmNlDQorIyBiZXR3ZWVuIENQVSBsb2FkIGFuZCBwcm9jZXNzaW5nIHNwZWVkLg0KKw0KK0RPVF9OVU1fVEhSRUFEUyAgICAgICAgPSAwDQorDQorIyBCeSBkZWZhdWx0IGRveHlnZW4gd2lsbCB1c2UgdGhlIEhlbHZldGljYSBmb250IGZvciBhbGwgZG90IGZpbGVzIHRoYXQNCisjIGRveHlnZW4gZ2VuZXJhdGVzLiBXaGVuIHlvdSB3YW50IGEgZGlmZmVyZW50bHkgbG9va2luZyBmb250IHlvdSBjYW4gc3BlY2lmeQ0KKyMgdGhlIGZvbnQgbmFtZSB1c2luZyBET1RfRk9OVE5BTUUuIFlvdSBuZWVkIHRvIG1ha2Ugc3VyZSBkb3QgaXMgYWJsZSB0byBmaW5kDQorIyB0aGUgZm9udCwgd2hpY2ggY2FuIGJlIGRvbmUgYnkgcHV0dGluZyBpdCBpbiBhIHN0YW5kYXJkIGxvY2F0aW9uIG9yIGJ5IHNldHRpbmcNCisjIHRoZSBET1RGT05UUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZSBvciBieSBzZXR0aW5nIERPVF9GT05UUEFUSCB0byB0aGUNCisjIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBmb250Lg0KKw0KK0RPVF9GT05UTkFNRSAgICAgICAgICAgPSBIZWx2ZXRpY2ENCisNCisjIFRoZSBET1RfRk9OVFNJWkUgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgc2l6ZSBvZiB0aGUgZm9udCBvZiBkb3QgZ3JhcGhzLg0KKyMgVGhlIGRlZmF1bHQgc2l6ZSBpcyAxMHB0Lg0KKw0KK0RPVF9GT05UU0laRSAgICAgICAgICAgPSAxMA0KKw0KKyMgQnkgZGVmYXVsdCBkb3h5Z2VuIHdpbGwgdGVsbCBkb3QgdG8gdXNlIHRoZSBIZWx2ZXRpY2EgZm9udC4NCisjIElmIHlvdSBzcGVjaWZ5IGEgZGlmZmVyZW50IGZvbnQgdXNpbmcgRE9UX0ZPTlROQU1FIHlvdSBjYW4gdXNlIERPVF9GT05UUEFUSCB0bw0KKyMgc2V0IHRoZSBwYXRoIHdoZXJlIGRvdCBjYW4gZmluZCBpdC4NCisNCitET1RfRk9OVFBBVEggICAgICAgICAgID0NCisNCisjIElmIHRoZSBDTEFTU19HUkFQSCBhbmQgSEFWRV9ET1QgdGFncyBhcmUgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4NCisjIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IgZWFjaCBkb2N1bWVudGVkIGNsYXNzIHNob3dpbmcgdGhlIGRpcmVjdCBhbmQNCisjIGluZGlyZWN0IGluaGVyaXRhbmNlIHJlbGF0aW9ucy4gU2V0dGluZyB0aGlzIHRhZyB0byBZRVMgd2lsbCBmb3JjZSB0aGUNCisjIENMQVNTX0RJQUdSQU1TIHRhZyB0byBOTy4NCisNCitDTEFTU19HUkFQSCAgICAgICAgICAgID0gWUVTDQorDQorIyBJZiB0aGUgQ09MTEFCT1JBVElPTl9HUkFQSCBhbmQgSEFWRV9ET1QgdGFncyBhcmUgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4NCisjIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IgZWFjaCBkb2N1bWVudGVkIGNsYXNzIHNob3dpbmcgdGhlIGRpcmVjdCBhbmQNCisjIGluZGlyZWN0IGltcGxlbWVudGF0aW9uIGRlcGVuZGVuY2llcyAoaW5oZXJpdGFuY2UsIGNvbnRhaW5tZW50LCBhbmQNCisjIGNsYXNzIHJlZmVyZW5jZXMgdmFyaWFibGVzKSBvZiB0aGUgY2xhc3Mgd2l0aCBvdGhlciBkb2N1bWVudGVkIGNsYXNzZXMuDQorDQorQ09MTEFCT1JBVElPTl9HUkFQSCAgICA9IFlFUw0KKw0KKyMgSWYgdGhlIEdST1VQX0dSQVBIUyBhbmQgSEFWRV9ET1QgdGFncyBhcmUgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4NCisjIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IgZ3JvdXBzLCBzaG93aW5nIHRoZSBkaXJlY3QgZ3JvdXBzIGRlcGVuZGVuY2llcw0KKw0KK0dST1VQX0dSQVBIUyAgICAgICAgICAgPSBZRVMNCisNCisjIElmIHRoZSBVTUxfTE9PSyB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgaW5oZXJpdGFuY2UgYW5kDQorIyBjb2xsYWJvcmF0aW9uIGRpYWdyYW1zIGluIGEgc3R5bGUgc2ltaWxhciB0byB0aGUgT01HJ3MgVW5pZmllZCBNb2RlbGluZw0KKyMgTGFuZ3VhZ2UuDQorDQorVU1MX0xPT0sgICAgICAgICAgICAgICA9IE5PDQorDQorIyBJZiB0aGUgVU1MX0xPT0sgdGFnIGlzIGVuYWJsZWQsIHRoZSBmaWVsZHMgYW5kIG1ldGhvZHMgYXJlIHNob3duIGluc2lkZQ0KKyMgdGhlIGNsYXNzIG5vZGUuIElmIHRoZXJlIGFyZSBtYW55IGZpZWxkcyBvciBtZXRob2RzIGFuZCBtYW55IG5vZGVzIHRoZQ0KKyMgZ3JhcGggbWF5IGJlY29tZSB0b28gYmlnIHRvIGJlIHVzZWZ1bC4gVGhlIFVNTF9MSU1JVF9OVU1fRklFTERTDQorIyB0aHJlc2hvbGQgbGltaXRzIHRoZSBudW1iZXIgb2YgaXRlbXMgZm9yIGVhY2ggdHlwZSB0byBtYWtlIHRoZSBzaXplIG1vcmUNCisjIG1hbmFnYWJsZS4gU2V0IHRoaXMgdG8gMCBmb3Igbm8gbGltaXQuIE5vdGUgdGhhdCB0aGUgdGhyZXNob2xkIG1heSBiZQ0KKyMgZXhjZWVkZWQgYnkgNTAlIGJlZm9yZSB0aGUgbGltaXQgaXMgZW5mb3JjZWQuDQorDQorVU1MX0xJTUlUX05VTV9GSUVMRFMgICA9IDEwDQorDQorIyBJZiBzZXQgdG8gWUVTLCB0aGUgaW5oZXJpdGFuY2UgYW5kIGNvbGxhYm9yYXRpb24gZ3JhcGhzIHdpbGwgc2hvdyB0aGUNCisjIHJlbGF0aW9ucyBiZXR3ZWVuIHRlbXBsYXRlcyBhbmQgdGhlaXIgaW5zdGFuY2VzLg0KKw0KK1RFTVBMQVRFX1JFTEFUSU9OUyAgICAgPSBZRVMNCisNCisjIElmIHRoZSBFTkFCTEVfUFJFUFJPQ0VTU0lORywgU0VBUkNIX0lOQ0xVREVTLCBJTkNMVURFX0dSQVBILCBhbmQgSEFWRV9ET1QNCisjIHRhZ3MgYXJlIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IgZWFjaCBkb2N1bWVudGVkDQorIyBmaWxlIHNob3dpbmcgdGhlIGRpcmVjdCBhbmQgaW5kaXJlY3QgaW5jbHVkZSBkZXBlbmRlbmNpZXMgb2YgdGhlIGZpbGUgd2l0aA0KKyMgb3RoZXIgZG9jdW1lbnRlZCBmaWxlcy4NCisNCitJTkNMVURFX0dSQVBIICAgICAgICAgID0gWUVTDQorDQorIyBJZiB0aGUgRU5BQkxFX1BSRVBST0NFU1NJTkcsIFNFQVJDSF9JTkNMVURFUywgSU5DTFVERURfQllfR1JBUEgsIGFuZA0KKyMgSEFWRV9ET1QgdGFncyBhcmUgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGdyYXBoIGZvciBlYWNoDQorIyBkb2N1bWVudGVkIGhlYWRlciBmaWxlIHNob3dpbmcgdGhlIGRvY3VtZW50ZWQgZmlsZXMgdGhhdCBkaXJlY3RseSBvcg0KKyMgaW5kaXJlY3RseSBpbmNsdWRlIHRoaXMgZmlsZS4NCisNCitJTkNMVURFRF9CWV9HUkFQSCAgICAgID0gWUVTDQorDQorIyBJZiB0aGUgQ0FMTF9HUkFQSCBhbmQgSEFWRV9ET1Qgb3B0aW9ucyBhcmUgc2V0IHRvIFlFUyB0aGVuDQorIyBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBjYWxsIGRlcGVuZGVuY3kgZ3JhcGggZm9yIGV2ZXJ5IGdsb2JhbCBmdW5jdGlvbg0KKyMgb3IgY2xhc3MgbWV0aG9kLiBOb3RlIHRoYXQgZW5hYmxpbmcgdGhpcyBvcHRpb24gd2lsbCBzaWduaWZpY2FudGx5IGluY3JlYXNlDQorIyB0aGUgdGltZSBvZiBhIHJ1bi4gU28gaW4gbW9zdCBjYXNlcyBpdCB3aWxsIGJlIGJldHRlciB0byBlbmFibGUgY2FsbCBncmFwaHMNCisjIGZvciBzZWxlY3RlZCBmdW5jdGlvbnMgb25seSB1c2luZyB0aGUgXGNhbGxncmFwaCBjb21tYW5kLg0KKw0KK0NBTExfR1JBUEggICAgICAgICAgICAgPSBOTw0KKw0KKyMgSWYgdGhlIENBTExFUl9HUkFQSCBhbmQgSEFWRV9ET1QgdGFncyBhcmUgc2V0IHRvIFlFUyB0aGVuDQorIyBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBjYWxsZXIgZGVwZW5kZW5jeSBncmFwaCBmb3IgZXZlcnkgZ2xvYmFsIGZ1bmN0aW9uDQorIyBvciBjbGFzcyBtZXRob2QuIE5vdGUgdGhhdCBlbmFibGluZyB0aGlzIG9wdGlvbiB3aWxsIHNpZ25pZmljYW50bHkgaW5jcmVhc2UNCisjIHRoZSB0aW1lIG9mIGEgcnVuLiBTbyBpbiBtb3N0IGNhc2VzIGl0IHdpbGwgYmUgYmV0dGVyIHRvIGVuYWJsZSBjYWxsZXINCisjIGdyYXBocyBmb3Igc2VsZWN0ZWQgZnVuY3Rpb25zIG9ubHkgdXNpbmcgdGhlIFxjYWxsZXJncmFwaCBjb21tYW5kLg0KKw0KK0NBTExFUl9HUkFQSCAgICAgICAgICAgPSBOTw0KKw0KKyMgSWYgdGhlIEdSQVBISUNBTF9ISUVSQVJDSFkgYW5kIEhBVkVfRE9UIHRhZ3MgYXJlIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuDQorIyB3aWxsIGdlbmVyYXRlIGEgZ3JhcGhpY2FsIGhpZXJhcmNoeSBvZiBhbGwgY2xhc3NlcyBpbnN0ZWFkIG9mIGEgdGV4dHVhbCBvbmUuDQorDQorR1JBUEhJQ0FMX0hJRVJBUkNIWSAgICA9IFlFUw0KKw0KKyMgSWYgdGhlIERJUkVDVE9SWV9HUkFQSCBhbmQgSEFWRV9ET1QgdGFncyBhcmUgc2V0IHRvIFlFUw0KKyMgdGhlbiBkb3h5Z2VuIHdpbGwgc2hvdyB0aGUgZGVwZW5kZW5jaWVzIGEgZGlyZWN0b3J5IGhhcyBvbiBvdGhlciBkaXJlY3Rvcmllcw0KKyMgaW4gYSBncmFwaGljYWwgd2F5LiBUaGUgZGVwZW5kZW5jeSByZWxhdGlvbnMgYXJlIGRldGVybWluZWQgYnkgdGhlICNpbmNsdWRlDQorIyByZWxhdGlvbnMgYmV0d2VlbiB0aGUgZmlsZXMgaW4gdGhlIGRpcmVjdG9yaWVzLg0KKw0KK0RJUkVDVE9SWV9HUkFQSCAgICAgICAgPSBZRVMNCisNCisjIFRoZSBET1RfSU1BR0VfRk9STUFUIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIGltYWdlIGZvcm1hdCBvZiB0aGUgaW1hZ2VzDQorIyBnZW5lcmF0ZWQgYnkgZG90LiBQb3NzaWJsZSB2YWx1ZXMgYXJlIHN2ZywgcG5nLCBqcGcsIG9yIGdpZi4NCisjIElmIGxlZnQgYmxhbmsgcG5nIHdpbGwgYmUgdXNlZC4gSWYgeW91IGNob29zZSBzdmcgeW91IG5lZWQgdG8gc2V0DQorIyBIVE1MX0ZJTEVfRVhURU5TSU9OIHRvIHhodG1sIGluIG9yZGVyIHRvIG1ha2UgdGhlIFNWRyBmaWxlcw0KKyMgdmlzaWJsZSBpbiBJRSA5KyAob3RoZXIgYnJvd3NlcnMgZG8gbm90IGhhdmUgdGhpcyByZXF1aXJlbWVudCkuDQorDQorRE9UX0lNQUdFX0ZPUk1BVCAgICAgICA9IHBuZw0KKw0KKyMgSWYgRE9UX0lNQUdFX0ZPUk1BVCBpcyBzZXQgdG8gc3ZnLCB0aGVuIHRoaXMgb3B0aW9uIGNhbiBiZSBzZXQgdG8gWUVTIHRvDQorIyBlbmFibGUgZ2VuZXJhdGlvbiBvZiBpbnRlcmFjdGl2ZSBTVkcgaW1hZ2VzIHRoYXQgYWxsb3cgem9vbWluZyBhbmQgcGFubmluZy4NCisjIE5vdGUgdGhhdCB0aGlzIHJlcXVpcmVzIGEgbW9kZXJuIGJyb3dzZXIgb3RoZXIgdGhhbiBJbnRlcm5ldCBFeHBsb3Jlci4NCisjIFRlc3RlZCBhbmQgd29ya2luZyBhcmUgRmlyZWZveCwgQ2hyb21lLCBTYWZhcmksIGFuZCBPcGVyYS4gRm9yIElFIDkrIHlvdQ0KKyMgbmVlZCB0byBzZXQgSFRNTF9GSUxFX0VYVEVOU0lPTiB0byB4aHRtbCBpbiBvcmRlciB0byBtYWtlIHRoZSBTVkcgZmlsZXMNCisjIHZpc2libGUuIE9sZGVyIHZlcnNpb25zIG9mIElFIGRvIG5vdCBoYXZlIFNWRyBzdXBwb3J0Lg0KKw0KK0lOVEVSQUNUSVZFX1NWRyAgICAgICAgPSBOTw0KKw0KKyMgVGhlIHRhZyBET1RfUEFUSCBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBwYXRoIHdoZXJlIHRoZSBkb3QgdG9vbCBjYW4gYmUNCisjIGZvdW5kLiBJZiBsZWZ0IGJsYW5rLCBpdCBpcyBhc3N1bWVkIHRoZSBkb3QgdG9vbCBjYW4gYmUgZm91bmQgaW4gdGhlIHBhdGguDQorDQorRE9UX1BBVEggICAgICAgICAgICAgICA9DQorDQorIyBUaGUgRE9URklMRV9ESVJTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGRpcmVjdG9yaWVzIHRoYXQNCisjIGNvbnRhaW4gZG90IGZpbGVzIHRoYXQgYXJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uIChzZWUgdGhlDQorIyBcZG90ZmlsZSBjb21tYW5kKS4NCisNCitET1RGSUxFX0RJUlMgICAgICAgICAgID0NCisNCisjIFRoZSBNU0NGSUxFX0RJUlMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZGlyZWN0b3JpZXMgdGhhdA0KKyMgY29udGFpbiBtc2MgZmlsZXMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gKHNlZSB0aGUNCisjIFxtc2NmaWxlIGNvbW1hbmQpLg0KKw0KK01TQ0ZJTEVfRElSUyAgICAgICAgICAgPQ0KKw0KKyMgVGhlIERPVF9HUkFQSF9NQVhfTk9ERVMgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgbWF4aW11bSBudW1iZXIgb2YNCisjIG5vZGVzIHRoYXQgd2lsbCBiZSBzaG93biBpbiB0aGUgZ3JhcGguIElmIHRoZSBudW1iZXIgb2Ygbm9kZXMgaW4gYSBncmFwaA0KKyMgYmVjb21lcyBsYXJnZXIgdGhhbiB0aGlzIHZhbHVlLCBkb3h5Z2VuIHdpbGwgdHJ1bmNhdGUgdGhlIGdyYXBoLCB3aGljaCBpcw0KKyMgdmlzdWFsaXplZCBieSByZXByZXNlbnRpbmcgYSBub2RlIGFzIGEgcmVkIGJveC4gTm90ZSB0aGF0IGRveHlnZW4gaWYgdGhlDQorIyBudW1iZXIgb2YgZGlyZWN0IGNoaWxkcmVuIG9mIHRoZSByb290IG5vZGUgaW4gYSBncmFwaCBpcyBhbHJlYWR5IGxhcmdlciB0aGFuDQorIyBET1RfR1JBUEhfTUFYX05PREVTIHRoZW4gdGhlIGdyYXBoIHdpbGwgbm90IGJlIHNob3duIGF0IGFsbC4gQWxzbyBub3RlDQorIyB0aGF0IHRoZSBzaXplIG9mIGEgZ3JhcGggY2FuIGJlIGZ1cnRoZXIgcmVzdHJpY3RlZCBieSBNQVhfRE9UX0dSQVBIX0RFUFRILg0KKw0KK0RPVF9HUkFQSF9NQVhfTk9ERVMgICAgPSA1MA0KKw0KKyMgVGhlIE1BWF9ET1RfR1JBUEhfREVQVEggdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgbWF4aW11bSBkZXB0aCBvZiB0aGUNCisjIGdyYXBocyBnZW5lcmF0ZWQgYnkgZG90LiBBIGRlcHRoIHZhbHVlIG9mIDMgbWVhbnMgdGhhdCBvbmx5IG5vZGVzIHJlYWNoYWJsZQ0KKyMgZnJvbSB0aGUgcm9vdCBieSBmb2xsb3dpbmcgYSBwYXRoIHZpYSBhdCBtb3N0IDMgZWRnZXMgd2lsbCBiZSBzaG93bi4gTm9kZXMNCisjIHRoYXQgbGF5IGZ1cnRoZXIgZnJvbSB0aGUgcm9vdCBub2RlIHdpbGwgYmUgb21pdHRlZC4gTm90ZSB0aGF0IHNldHRpbmcgdGhpcw0KKyMgb3B0aW9uIHRvIDEgb3IgMiBtYXkgZ3JlYXRseSByZWR1Y2UgdGhlIGNvbXB1dGF0aW9uIHRpbWUgbmVlZGVkIGZvciBsYXJnZQ0KKyMgY29kZSBiYXNlcy4gQWxzbyBub3RlIHRoYXQgdGhlIHNpemUgb2YgYSBncmFwaCBjYW4gYmUgZnVydGhlciByZXN0cmljdGVkIGJ5DQorIyBET1RfR1JBUEhfTUFYX05PREVTLiBVc2luZyBhIGRlcHRoIG9mIDAgbWVhbnMgbm8gZGVwdGggcmVzdHJpY3Rpb24uDQorDQorTUFYX0RPVF9HUkFQSF9ERVBUSCAgICA9IDANCisNCisjIFNldCB0aGUgRE9UX1RSQU5TUEFSRU5UIHRhZyB0byBZRVMgdG8gZ2VuZXJhdGUgaW1hZ2VzIHdpdGggYSB0cmFuc3BhcmVudA0KKyMgYmFja2dyb3VuZC4gVGhpcyBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LCBiZWNhdXNlIGRvdCBvbiBXaW5kb3dzIGRvZXMgbm90DQorIyBzZWVtIHRvIHN1cHBvcnQgdGhpcyBvdXQgb2YgdGhlIGJveC4gV2FybmluZzogRGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybSB1c2VkLA0KKyMgZW5hYmxpbmcgdGhpcyBvcHRpb24gbWF5IGxlYWQgdG8gYmFkbHkgYW50aS1hbGlhc2VkIGxhYmVscyBvbiB0aGUgZWRnZXMgb2YNCisjIGEgZ3JhcGggKGkuZS4gdGhleSBiZWNvbWUgaGFyZCB0byByZWFkKS4NCisNCitET1RfVFJBTlNQQVJFTlQgICAgICAgID0gTk8NCisNCisjIFNldCB0aGUgRE9UX01VTFRJX1RBUkdFVFMgdGFnIHRvIFlFUyBhbGxvdyBkb3QgdG8gZ2VuZXJhdGUgbXVsdGlwbGUgb3V0cHV0DQorIyBmaWxlcyBpbiBvbmUgcnVuIChpLmUuIG11bHRpcGxlIC1vIGFuZCAtVCBvcHRpb25zIG9uIHRoZSBjb21tYW5kIGxpbmUpLiBUaGlzDQorIyBtYWtlcyBkb3QgcnVuIGZhc3RlciwgYnV0IHNpbmNlIG9ubHkgbmV3ZXIgdmVyc2lvbnMgb2YgZG90ICg+MS44LjEwKQ0KKyMgc3VwcG9ydCB0aGlzLCB0aGlzIGZlYXR1cmUgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdC4NCisNCitET1RfTVVMVElfVEFSR0VUUyAgICAgID0gTk8NCisNCisjIElmIHRoZSBHRU5FUkFURV9MRUdFTkQgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSBEb3h5Z2VuIHdpbGwNCisjIGdlbmVyYXRlIGEgbGVnZW5kIHBhZ2UgZXhwbGFpbmluZyB0aGUgbWVhbmluZyBvZiB0aGUgdmFyaW91cyBib3hlcyBhbmQNCisjIGFycm93cyBpbiB0aGUgZG90IGdlbmVyYXRlZCBncmFwaHMuDQorDQorR0VORVJBVEVfTEVHRU5EICAgICAgICA9IFlFUw0KKw0KKyMgSWYgdGhlIERPVF9DTEVBTlVQIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgRG94eWdlbiB3aWxsDQorIyByZW1vdmUgdGhlIGludGVybWVkaWF0ZSBkb3QgZmlsZXMgdGhhdCBhcmUgdXNlZCB0byBnZW5lcmF0ZQ0KKyMgdGhlIHZhcmlvdXMgZ3JhcGhzLg0KKw0KK0RPVF9DTEVBTlVQICAgICAgICAgICAgPSBZRVMNCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL2RvYy9kb3h5Z2VuL2hlYWRlci50ZXggYi9maW5hbC9ydW50aW1lL2RvYy9kb3h5Z2VuL2hlYWRlci50ZXgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJjNzVhMwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvZG9jL2RveHlnZW4vaGVhZGVyLnRleApAQCAtMCwwICsxLDkyIEBACislIExhdGV4IGhlYWRlciBmb3IgZG94eWdlbiAxLjguMy4xCitcZG9jdW1lbnRjbGFzc3tib29rfQorXHVzZXBhY2thZ2VbYTRwYXBlcix0b3A9Mi41Y20sYm90dG9tPTIuNWNtLGxlZnQ9Mi41Y20scmlnaHQ9Mi41Y21de2dlb21ldHJ5fQorXHVzZXBhY2thZ2V7bWFrZWlkeH0KK1x1c2VwYWNrYWdle25hdGJpYn0KK1x1c2VwYWNrYWdle2dyYXBoaWN4fQorXHVzZXBhY2thZ2V7bXVsdGljb2x9CitcdXNlcGFja2FnZXtmbG9hdH0KK1x1c2VwYWNrYWdle2xpc3RpbmdzfQorXHVzZXBhY2thZ2V7Y29sb3J9CitcdXNlcGFja2FnZXtpZnRoZW59CitcdXNlcGFja2FnZVt0YWJsZV17eGNvbG9yfQorXHVzZXBhY2thZ2V7dGV4dGNvbXB9CitcdXNlcGFja2FnZXthbGx0dH0KK1x1c2VwYWNrYWdle2lmcGRmfQorXGlmcGRmCitcdXNlcGFja2FnZVtwZGZ0ZXgsCisgICAgICAgICAgICBwYWdlYmFja3JlZj10cnVlLAorICAgICAgICAgICAgY29sb3JsaW5rcz10cnVlLAorICAgICAgICAgICAgbGlua2NvbG9yPWJsdWUsCisgICAgICAgICAgICB1bmljb2RlCisgICAgICAgICAgIF17aHlwZXJyZWZ9CitcZWxzZQorXHVzZXBhY2thZ2VbcHMycGRmLAorICAgICAgICAgICAgcGFnZWJhY2tyZWY9dHJ1ZSwKKyAgICAgICAgICAgIGNvbG9ybGlua3M9dHJ1ZSwKKyAgICAgICAgICAgIGxpbmtjb2xvcj1ibHVlLAorICAgICAgICAgICAgdW5pY29kZQorICAgICAgICAgICBde2h5cGVycmVmfQorXHVzZXBhY2thZ2V7cHNwaWN0dXJlfQorXGZpCitcdXNlcGFja2FnZVt1dGY4XXtpbnB1dGVuY30KK1x1c2VwYWNrYWdle21hdGhwdG14fQorXHVzZXBhY2thZ2Vbc2NhbGVkPS45MF17aGVsdmV0fQorXHVzZXBhY2thZ2V7Y291cmllcn0KK1x1c2VwYWNrYWdle3NlY3RzdHl9CitcdXNlcGFja2FnZXthbXNzeW1ifQorXHVzZXBhY2thZ2VbdGl0bGVzXXt0b2Nsb2Z0fQorXHVzZXBhY2thZ2V7ZG94eWdlbn0KK1xsc3RzZXR7bGFuZ3VhZ2U9QysrLGlucHV0ZW5jb2Rpbmc9dXRmOCxiYXNpY3N0eWxlPVxmb290bm90ZXNpemUsYnJlYWtsaW5lcz10cnVlLGJyZWFrYXR3aGl0ZXNwYWNlPXRydWUsdGFic2l6ZT00LG51bWJlcnM9bGVmdCB9CitcbWFrZWluZGV4Citcc2V0Y291bnRlcnt0b2NkZXB0aH17M30KK1xyZW5ld2NvbW1hbmR7XGZvb3RydWxld2lkdGh9ezAuNHB0fQorXHJlbmV3Y29tbWFuZHtcZmFtaWx5ZGVmYXVsdH17XHNmZGVmYXVsdH0KK1xoZnV6ej0xNXB0Citcc2V0bGVuZ3Roe1xlbWVyZ2VuY3lzdHJldGNofXsxNXB0fQorXGhiYWRuZXNzPTc1MAorXHRvbGVyYW5jZT03NTAKK1xiZWdpbntkb2N1bWVudH0KK1xoeXBlcnNldHVwe3BhZ2VhbmNob3I9ZmFsc2UsY2l0ZWNvbG9yPWJsdWV9CitcYmVnaW57dGl0bGVwYWdlfQorXHZzcGFjZSp7N2NtfQorXGJlZ2lue2NlbnRlcn0KK3tcTGFyZ2UgSW50ZWxcdGV4dHN1cGVyc2NyaXB0e1x0ZXh0cmVnaXN0ZXJlZH0gIE9wZW5NUFx0ZXh0c3VwZXJzY3JpcHR7Kn0gUnVudGltZSBMaWJyYXJ5IH1cXAorXHZzcGFjZSp7MWNtfQore1xsYXJnZSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAkZG94eWdlbnZlcnNpb24gfVxcCitcdnNwYWNlKnswLjVjbX0KK3tcc21hbGwgJGRhdGV0aW1lIH1cXAorXGVuZHtjZW50ZXJ9CitcZW5ke3RpdGxlcGFnZX0KKwore1xiZiBGVEMgT3B0aW1pemF0aW9uIE5vdGljZX0KK1xcCitJbnRlbCdzIGNvbXBpbGVycyBtYXkgb3IgbWF5IG5vdCBvcHRpbWl6ZSB0byB0aGUgc2FtZSBkZWdyZWUgZm9yIG5vbi1JbnRlbCBtaWNyb3Byb2Nlc3NvcnMgZm9yCitvcHRpbWl6YXRpb25zIHRoYXQgYXJlIG5vdCB1bmlxdWUgdG8gSW50ZWwgbWljcm9wcm9jZXNzb3JzLiBUaGVzZSBvcHRpbWl6YXRpb25zIGluY2x1ZGUgU1NFMiwKK1NTRTMsIGFuZCBTU0UzIGluc3RydWN0aW9uIHNldHMgYW5kIG90aGVyIG9wdGltaXphdGlvbnMuIEludGVsIGRvZXMgbm90IGd1YXJhbnRlZSB0aGUKK2F2YWlsYWJpbGl0eSwgZnVuY3Rpb25hbGl0eSwgb3IgZWZmZWN0aXZlbmVzcyBvZiBhbnkgb3B0aW1pemF0aW9uIG9uIG1pY3JvcHJvY2Vzc29ycyBub3QKK21hbnVmYWN0dXJlZCBieSBJbnRlbC4KKworTWljcm9wcm9jZXNzb3ItZGVwZW5kZW50IG9wdGltaXphdGlvbnMgaW4gdGhpcyBwcm9kdWN0IGFyZSBpbnRlbmRlZCBmb3IgdXNlIHdpdGggSW50ZWwKK21pY3JvcHJvY2Vzc29ycy4gQ2VydGFpbiBvcHRpbWl6YXRpb25zIG5vdCBzcGVjaWZpYyB0byBJbnRlbCBtaWNyb2FyY2hpdGVjdHVyZSBhcmUgcmVzZXJ2ZWQgZm9yCitJbnRlbCBtaWNyb3Byb2Nlc3NvcnMuIFBsZWFzZSByZWZlciB0byB0aGUgYXBwbGljYWJsZSBwcm9kdWN0IFVzZXIgYW5kIFJlZmVyZW5jZSBHdWlkZXMgZm9yCittb3JlIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGUgc3BlY2lmaWMgaW5zdHJ1Y3Rpb24gc2V0cyBjb3ZlcmVkIGJ5IHRoaXMgbm90aWNlLgorCitOb3RpY2UgcmV2aXNpb24gXCMyMDExMDgwNAorCit7XGJmIFRyYWRlbWFya3N9CitcXAorSW50ZWwsIFhlb24sIGFuZCBJbnRlbCBYZW9uIFBoaSBhcmUgdHJhZGVtYXJrcyBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBpbiB0aGUgVS5TLiBhbmQvb3Igb3RoZXIgY291bnRyaWVzLgorCitcdGV4dHN1cGVyc2NyaXB0eyp9IE90aGVyIG5hbWVzIGFuZCBicmFuZHMgbWF5IGJlIGNsYWltZWQgYXMgdGhlIHByb3BlcnR5IG9mIG90aGVycy4KKworVGhlIE9wZW5NUCBuYW1lIGFuZCB0aGUgT3Blbk1QIGxvZ28gYXJlIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiB0aGUgT3Blbk1QIEFyY2hpdGVjdHVyZSBSZXZpZXcgQm9hcmQuCisKK1RoaXMgZG9jdW1lbnQgaXMgQ29weXJpZ2h0IFx0ZXh0Y29weXJpZ2h0IDIwMTMsIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAKKyAKK1xjbGVhcmVtcHR5ZG91YmxlcGFnZQorXHBhZ2VudW1iZXJpbmd7cm9tYW59CitcdGFibGVvZmNvbnRlbnRzCitcY2xlYXJlbXB0eWRvdWJsZXBhZ2UKK1xwYWdlbnVtYmVyaW5ne2FyYWJpY30KK1xoeXBlcnNldHVwe3BhZ2VhbmNob3I9dHJ1ZSxjaXRlY29sb3I9Ymx1ZX0KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvZG9jL2RveHlnZW4vbGlib21wX2ludGVyZmFjZS5oIGIvZmluYWwvcnVudGltZS9kb2MvZG94eWdlbi9saWJvbXBfaW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBkMzllNgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvZG9jL2RveHlnZW4vbGlib21wX2ludGVyZmFjZS5oCkBAIC0wLDAgKzEsMzQ4IEBACisvLyBUaGlzIGZpbGUgZG9lcyBub3QgY29udGFpbiBhbnkgY29kZTsgaXQganVzdCBjb250YWlucyBhZGRpdGlvbmFsIHRleHQgYW5kIGZvcm1hdHRpbmcNCisvLyBmb3IgZG94eWdlbi4NCisNCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKw0KKy8qISBAbWFpbnBhZ2UgSW50ZWwmcmVnOyZuYnNwOyBPcGVuTVAqIFJ1bnRpbWUgTGlicmFyeSBJbnRlcmZhY2UNCitAc2VjdGlvbiBzZWNfaW50cm8gSW50cm9kdWN0aW9uDQorDQorVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdGhlIGludGVyZmFjZSBwcm92aWRlZCBieSB0aGUNCitJbnRlbCZyZWc7Jm5ic3A7T3Blbk1QXG90aGVyIHJ1bnRpbWUgbGlicmFyeSB0byB0aGUgY29tcGlsZXIuDQorUm91dGluZXMgdGhhdCBhcmUgZGlyZWN0bHkgY2FsbGVkIGFzIHNpbXBsZSBmdW5jdGlvbnMgYnkgdXNlciBjb2RlIGFyZQ0KK25vdCBjdXJyZW50bHkgZGVzY3JpYmVkIGhlcmUsIHNpbmNlIHRoZWlyIGRlZmluaXRpb24gaXMgaW4gdGhlIE9wZW5NUA0KK3NwZWNpZmljYXRpb24gYXZhaWxhYmxlIGZyb20gaHR0cDovL29wZW5tcC5vcmcNCisNCitUaGUgYWltIGhlcmUgaXMgdG8gZXhwbGFpbiB0aGUgaW50ZXJmYWNlIGZyb20gdGhlIGNvbXBpbGVyIHRvIHRoZSBydW50aW1lLg0KKw0KK1RoZSBvdmVyYWxsIGRlc2lnbiBpcyBkZXNjcmliZWQsIGFuZCBlYWNoIGZ1bmN0aW9uIGluIHRoZSBpbnRlcmZhY2UNCitoYXMgaXRzIG93biBkZXNjcmlwdGlvbi4gKEF0IGxlYXN0LCB0aGF0J3MgdGhlIGFtYml0aW9uLCB3ZSBtYXkgbm90IGJlIHRoZXJlIHlldCkuDQorDQorQHNlY3Rpb24gc2VjX2J1aWxkaW5nIEJ1aWxkaW5nIHRoZSBSdW50aW1lDQorRm9yIHRoZSBpbXBhdGllbnQsIHdlIGNvdmVyIGJ1aWxkaW5nIHRoZSBydW50aW1lIGFzIHRoZSBmaXJzdCB0b3BpYyBoZXJlLg0KKw0KK0EgdG9wLWxldmVsIE1ha2VmaWxlIGlzIHByb3ZpZGVkIHRoYXQgYXR0ZW1wdHMgdG8gZGVyaXZlIGEgc3VpdGFibGUNCitjb25maWd1cmF0aW9uIGZvciB0aGUgbW9zdCBjb21tb25seSB1c2VkIGVudmlyb25tZW50cy4gIFRvIHNlZSB0aGUNCitkZWZhdWx0IHNldHRpbmdzLCB0eXBlOg0KK0Bjb2RlDQorJSBtYWtlIGluZm8NCitAZW5kY29kZQ0KKw0KK1lvdSBjYW4gY2hhbmdlIHRoZSBNYWtlZmlsZSdzIGJlaGF2aW9yIHdpdGggdGhlIGZvbGxvd2luZyBvcHRpb25zOg0KKw0KKyAtIDxiPm9tcF9yb290PC9iPjogICAgVGhlIHBhdGggdG8gdGhlIHRvcC1sZXZlbCBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgdG9wLWxldmVsDQorICAgICAgICAgICAgIE1ha2VmaWxlLiAgQnkgZGVmYXVsdCwgdGhpcyB3aWxsIHRha2Ugb24gdGhlIHZhbHVlIG9mIHRoZQ0KKyAgICAgICAgICAgICBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5Lg0KKw0KKyAtIDxiPm9tcF9vczwvYj46ICAgICAgT3BlcmF0aW5nIHN5c3RlbS4gIEJ5IGRlZmF1bHQsIHRoZSBidWlsZCB3aWxsIGF0dGVtcHQgdG8NCisgICAgICAgICAgICAgZGV0ZWN0IHRoaXMuIEN1cnJlbnRseSBzdXBwb3J0cyAibGludXgiLCAibWFjb3MiLCBhbmQNCisgICAgICAgICAgICAgIndpbmRvd3MiLg0KKw0KKyAtIDxiPmFyY2g8L2I+OiAgICAgICAgQXJjaGl0ZWN0dXJlLiBCeSBkZWZhdWx0LCB0aGUgYnVpbGQgd2lsbCBhdHRlbXB0IHRvDQorCSAgICAgZGV0ZWN0IHRoaXMgaWYgbm90IHNwZWNpZmllZCBieSB0aGUgdXNlci4gQ3VycmVudGx5IA0KKwkgICAgIHN1cHBvcnRlZCB2YWx1ZXMgYXJlDQorICAgICAgICAgICAgIC0gIjMyIiBmb3IgSUEtMzIgYXJjaGl0ZWN0dXJlIA0KKyAgICAgICAgICAgICAtICIzMmUiIGZvciBJbnRlbCZyZWc7Jm5ic3A7NjQgYXJjaGl0ZWN0dXJlDQorICAgICAgICAgICAgIC0gIm1pYyIgZm9yIEludGVsJnJlZzsmbmJzcDtNYW55IEludGVncmF0ZWQgQ29yZSBBcmNoaXRlY3R1cmUgKA0KKyAgICAgICAgICAgICBJZiAibWljIiBpcyBzcGVjaWZpZWQgdGhlbiAiaWNjIiB3aWxsIGJlIHVzZWQgYXMgdGhlDQorICAgICAgICAgICAgIGNvbXBpbGVyLCBhbmQgYXBwcm9wcmlhdGUgazFvbSBiaW51dGlscyB3aWxsIGJlIHVzZWQuIFRoZQ0KKyAgICAgICAgICAgICBuZWNlc3NhcnkgcGFja2FnZXMgbXVzdCBiZSBpbnN0YWxsZWQgb24gdGhlIGJ1aWxkIG1hY2hpbmUNCisgICAgICAgICAgICAgZm9yIHRoaXMgdG8gYmUgcG9zc2libGUsIGJ1dCBhbg0KKwkgICAgIEludGVsJnJlZzsmbmJzcDtYZW9uIFBoaSZ0cmFkZTsmbmJzcDsNCisgICAgICAgICAgICAgY29wcm9jZXNzb3IgaXMgbm90IHJlcXVpcmVkIHRvIGJ1aWxkIHRoZSBsaWJyYXJ5KS4NCisNCisgLSA8Yj5jb21waWxlcjwvYj46ICAgIFdoaWNoIGNvbXBpbGVyIHRvIHVzZSBmb3IgdGhlIGJ1aWxkLiAgRGVmYXVsdHMgdG8gImljYyINCisgICAgICAgICAgICAgb3IgImljbCIgZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBvZiBvbXBfb3MuIEFsc28gc3VwcG9ydHMNCisgICAgICAgICAgICAgImdjYyIgd2hlbiBvbXBfb3MgaXMgImxpbnV4IiBmb3IgZ2NjXG90aGVyIHZlcnNpb25zDQorICAgICAgICAgICAgIDQuNi4yIGFuZCBoaWdoZXIuIEZvciBpY2Mgb24gT1MgWFxvdGhlciwgT1MgWFxvdGhlciB2ZXJzaW9ucyANCisJICAgICBncmVhdGVyIHRoYW4gMTAuNiBhcmUgbm90IHN1cHBvcnRlZCBjdXJyZW50bHkuIEFsc28sIGljYw0KKwkgICAgIHZlcnNpb24gMTMuMCBpcyBub3Qgc3VwcG9ydGVkLiBUaGUgc2VsZWN0ZWQgY29tcGlsZXIgc2hvdWxkIGJlDQorICAgICAgICAgICAgIGluc3RhbGxlZCBhbmQgaW4gdGhlIHVzZXIncyBwYXRoLiBUaGUgY29ycmVzcG9uZGluZw0KKyAgICAgICAgICAgICBGb3J0cmFuIGNvbXBpbGVyIHNob3VsZCBhbHNvIGJlIGluIHRoZSBwYXRoLg0KKw0KKyAtIDxiPm1vZGU8L2I+OiAgICAgICAgTGlicmFyeSBtb2RlOiBkZWZhdWx0IGlzICJyZWxlYXNlIi4gIEFsc28gc3VwcG9ydHMgImRlYnVnIi4NCisNCitUbyB1c2UgYW55IG9mIHRoZSBvcHRpb25zIGFib3ZlLCBzaW1wbGUgYWRkICZsdDtvcHRpb25fbmFtZSZndDs9Jmx0O3ZhbHVlJmd0Oy4gIEZvcg0KK2V4YW1wbGUsIGlmIHlvdSB3YW50IHRvIGJ1aWxkIHdpdGggZ2NjIGluc3RlYWQgb2YgaWNjLCB0eXBlOg0KK0Bjb2RlDQorJSBtYWtlIGNvbXBpbGVyPWdjYw0KK0BlbmRjb2RlDQorDQorVW5kZXJuZWF0aCB0aGUgaG9vZCBvZiB0aGUgdG9wLWxldmVsIE1ha2VmaWxlLCB0aGUgcnVudGltZSBpcyBidWlsdCBieQ0KK2EgcGVybCBzY3JpcHQgdGhhdCBpbiB0dXJuIGRyaXZlcyBhIGRldGFpbGVkIHJ1bnRpbWUgc3lzdGVtIG1ha2UuICBUaGUNCitzY3JpcHQgY2FuIGJlIGZvdW5kIGF0IDx0dD50b29scy9idWlsZC5wbDwvdHQ+LCBhbmQgd2lsbCBwcmludA0KK2luZm9ybWF0aW9uIGFib3V0IGFsbCBpdHMgZmxhZ3MgYW5kIGNvbnRyb2xzIGlmIGludm9rZWQgYXMgDQorQGNvZGUgDQorJSB0b29scy9idWlsZC5wbCAtLWhlbHAgDQorQGVuZGNvZGUNCisNCitJZiBpbnZva2VkIHdpdGggbm8gYXJndW1lbnRzLCBpdCB3aWxsIHRyeSB0byBidWlsZCBhIHNldCBvZiBsaWJyYXJpZXMNCit0aGF0IGFyZSBhcHByb3ByaWF0ZSBmb3IgdGhlIG1hY2hpbmUgb24gd2hpY2ggdGhlIGJ1aWxkIGlzIGhhcHBlbmluZy4gDQorVGhlcmUgYXJlIG1hbnkgb3B0aW9ucyBmb3IgYnVpbGRpbmcgb3V0IG9mIHRyZWUsIGFuZCBjb25maWd1cmluZyBsaWJyYXJ5DQorZmVhdHVyZXMgdGhhdCBjYW4gYWxzbyBiZSB1c2VkLiBDb25zdWx0IHRoZSA8dHQ+LS1oZWxwPC90dD4gb3V0cHV0IGZvciBkZXRhaWxzLg0KKw0KK0BzZWN0aW9uIHNlY19zdXBwb3J0ZWQgU3VwcG9ydGVkIFJUTCBCdWlsZCBDb25maWd1cmF0aW9ucw0KKw0KK1RoZSBhcmNoaXRlY3R1cmVzIHN1cHBvcnRlZCBhcmUgSUEtMzIgYXJjaGl0ZWN0dXJlLCBJbnRlbCZyZWc7Jm5ic3A7IDY0LCBhbmQNCitJbnRlbCZyZWc7Jm5ic3A7IE1hbnkgSW50ZWdyYXRlZCBDb3JlIEFyY2hpdGVjdHVyZS4gIFRoZSBidWlsZCBjb25maWd1cmF0aW9ucw0KK3N1cHBvcnRlZCBhcmUgc2hvd24gaW4gdGhlIHRhYmxlIGJlbG93Lg0KKw0KKzx0YWJsZSBib3JkZXI9MT4NCis8dHI+PHRoPiA8dGg+aWNjL2ljbDx0aD5nY2MNCis8dHI+PHRkPkxpbnV4XG90aGVyIE9TPHRkPlllcygxLDUpPHRkPlllcygyLDQpDQorPHRyPjx0ZD5PUyBYXG90aGVyPHRkPlllcygxLDMsNCk8dGQ+Tm8NCis8dHI+PHRkPldpbmRvd3Ncb3RoZXIgT1M8dGQ+WWVzKDEsNCk8dGQ+Tm8NCis8L3RhYmxlPg0KKygxKSBPbiBJQS0zMiBhcmNoaXRlY3R1cmUgYW5kIEludGVsJnJlZzsmbmJzcDsgNjQsIGljYy9pY2wgdmVyc2lvbnMgMTIueCANCisgICAgYXJlIHN1cHBvcnRlZCAoMTIuMSBpcyByZWNvbW1lbmRlZCkuPGJyPg0KKygyKSBnY2MgdmVyc2lvbiA0LjYuMiBpcyBzdXBwb3J0ZWQuPGJyPg0KKygzKSBGb3IgaWNjIG9uIE9TIFhcb3RoZXIsIE9TIFhcb3RoZXIgdmVyc2lvbiAxMC41LjggaXMgc3VwcG9ydGVkLjxicj4NCisoNCkgSW50ZWwmcmVnOyZuYnNwOyBNYW55IEludGVncmF0ZWQgQ29yZSBBcmNoaXRlY3R1cmUgbm90IHN1cHBvcnRlZC48YnI+DQorKDUpIE9uIEludGVsJnJlZzsmbmJzcDsgTWFueSBJbnRlZ3JhdGVkIENvcmUgQXJjaGl0ZWN0dXJlLCBpY2MvaWNsIHZlcnNpb25zIDEzLjAgb3IgbGF0ZXIgYXJlIHJlcXVpcmVkLg0KKw0KK0BzZWN0aW9uIHNlY19mcm9udGVuZCBGcm9udC1lbmQgQ29tcGlsZXJzIHRoYXQgd29yayB3aXRoIHRoaXMgUlRMDQorDQorVGhlIGZvbGxvd2luZyBjb21waWxlcnMgYXJlIGtub3duIHRvIGRvIGNvbXBhdGlibGUgY29kZSBnZW5lcmF0aW9uIGZvcg0KK3RoaXMgUlRMOiBpY2MvaWNsLCBnY2MuICBDb2RlIGdlbmVyYXRpb24gaXMgZGlzY3Vzc2VkIGluIG1vcmUgZGV0YWlsDQorbGF0ZXIgaW4gdGhpcyBkb2N1bWVudC4NCisNCitAc2VjdGlvbiBzZWNfb3V0bGluaW5nIE91dGxpbmluZw0KKw0KK1RoZSBydW50aW1lIGludGVyZmFjZSBpcyBiYXNlZCBvbiB0aGUgaWRlYSB0aGF0IHRoZSBjb21waWxlcg0KKyJvdXRsaW5lcyIgc2VjdGlvbnMgb2YgY29kZSB0aGF0IGFyZSB0byBydW4gaW4gcGFyYWxsZWwgaW50byBzZXBhcmF0ZQ0KK2Z1bmN0aW9ucyB0aGF0IGNhbiB0aGVuIGJlIGludm9rZWQgaW4gbXVsdGlwbGUgdGhyZWFkcy4gIEZvciBpbnN0YW5jZSwNCitzaW1wbGUgY29kZSBsaWtlIHRoaXMNCisNCitAY29kZQ0KK3ZvaWQgZm9vKCkNCit7DQorI3ByYWdtYSBvbXAgcGFyYWxsZWwNCisgICAgew0KKyAgICAgICAgLi4uIGRvIHNvbWV0aGluZyAuLi4NCisgICAgfQ0KK30NCitAZW5kY29kZQ0KK2lzIGNvbnZlcnRlZCBpbnRvIHNvbWV0aGluZyB0aGF0IGxvb2tzIGNvbmNlcHR1YWxseSBsaWtlIHRoaXMgKHdoZXJlDQordGhlIG5hbWVzIHVzZWQgYXJlIG1lcmVseSBpbGx1c3RyYXRpdmU7IHRoZSByZWFsIGxpYnJhcnkgZnVuY3Rpb24NCituYW1lcyB3aWxsIGJlIHVzZWQgbGF0ZXIgYWZ0ZXIgd2UndmUgZGlzY3Vzc2VkIHNvbWUgbW9yZSBpc3N1ZXMuLi4pDQorDQorQGNvZGUNCitzdGF0aWMgdm9pZCBvdXRsaW5lZEZvb0JvZHkoKQ0KK3sNCisgICAgLi4uIGRvIHNvbWV0aGluZyAuLi4NCit9DQorDQordm9pZCBmb28oKQ0KK3sNCisgICAgX19PTVBfcnVudGltZV9mb3JrKG91dGxpbmVkRm9vQm9keSwgKHZvaWQqKTApOyAgIC8vIE5vdCB0aGUgcmVhbCBmdW5jdGlvbiBuYW1lIQ0KK30NCitAZW5kY29kZQ0KKw0KK0BzdWJzZWN0aW9uIFNFQ19TSEFSRURWQVJTIEFkZHJlc3Npbmcgc2hhcmVkIHZhcmlhYmxlcw0KKw0KK0luIHJlYWwgdXNlcyBvZiB0aGUgT3Blbk1QXG90aGVyIEFQSSB0aGVyZSBhcmUgbm9ybWFsbHkgcmVmZXJlbmNlcyANCitmcm9tIHRoZSBvdXRsaW5lZCBjb2RlICB0byBzaGFyZWQgdmFyaWFibGVzIHRoYXQgYXJlIGluIHNjb3BlIGluIHRoZSBjb250YWluaW5nIGZ1bmN0aW9uLiANCitUaGVyZWZvcmUgdGhlIGNvbnRhaW5pbmcgZnVuY3Rpb24gbXVzdCBiZSBhYmxlIHRvIGFkZHJlc3MgDQordGhlc2UgdmFyaWFibGVzLiBUaGUgcnVudGltZSBzdXBwb3J0cyB0d28gYWx0ZXJuYXRlIHdheXMgb2YgZG9pbmcNCit0aGlzLg0KKw0KK0BzdWJzdWJzZWN0aW9uIFNFQ19TRUNfT1QgQ3VycmVudCBUZWNobmlxdWUNCitUaGUgdGVjaG5pcXVlIGN1cnJlbnRseSBzdXBwb3J0ZWQgYnkgdGhlIHJ1bnRpbWUgbGlicmFyeSBpcyB0byByZWNlaXZlDQorYSBzZXBhcmF0ZSBwb2ludGVyIHRvIGVhY2ggc2hhcmVkIHZhcmlhYmxlIHRoYXQgY2FuIGJlIGFjY2Vzc2VkIGZyb20NCit0aGUgb3V0bGluZWQgZnVuY3Rpb24uICBUaGlzIGlzIHdoYXQgaXMgc2hvd24gaW4gdGhlIGV4YW1wbGUgYmVsb3cuDQorDQorV2UgaG9wZSBzb29uIHRvIHByb3ZpZGUgYW4gYWx0ZXJuYXRpdmUgaW50ZXJmYWNlIHRvIHN1cHBvcnQgdGhlDQorYWx0ZXJuYXRlIGltcGxlbWVudGF0aW9uIGRlc2NyaWJlZCBpbiB0aGUgbmV4dCBzZWN0aW9uLiBUaGUNCithbHRlcm5hdGl2ZSBpbXBsZW1lbnRhdGlvbiBoYXMgcGVyZm9ybWFuY2UgYWR2YW50YWdlcyBmb3Igc21hbGwNCitwYXJhbGxlbCByZWdpb25zIHRoYXQgaGF2ZSBtYW55IHNoYXJlZCB2YXJpYWJsZXMuDQorDQorQHN1YnN1YnNlY3Rpb24gU0VDX1NFQ19QVCBGdXR1cmUgVGVjaG5pcXVlDQorVGhlIGlkZWEgaXMgdG8gdHJlYXQgdGhlIG91dGxpbmVkIGZ1bmN0aW9uIGFzIHRob3VnaCBpdA0KK3dlcmUgYSBsZXhpY2FsbHkgbmVzdGVkIGZ1bmN0aW9uLCBhbmQgcGFzcyBpdCBhIHNpbmdsZSBhcmd1bWVudCB3aGljaA0KK2lzIHRoZSBwb2ludGVyIHRvIHRoZSBwYXJlbnQncyBzdGFjayBmcmFtZS4gUHJvdmlkZWQgdGhhdCB0aGUgY29tcGlsZXINCitrbm93cyB0aGUgbGF5b3V0IG9mIHRoZSBwYXJlbnQgZnJhbWUgd2hlbiBpdCBpcyBnZW5lcmF0aW5nIHRoZSBvdXRsaW5lZA0KK2Z1bmN0aW9uIGl0IGNhbiB0aGVuIGFjY2VzcyB0aGUgdXAtbGV2ZWwgdmFyaWFibGVzIGF0IGFwcHJvcHJpYXRlDQorb2Zmc2V0cyBmcm9tIHRoZSBwYXJlbnQgZnJhbWUuICBUaGlzIGlzIGEgY2xhc3NpY2FsIGNvbXBpbGVyIHRlY2huaXF1ZQ0KK2Zyb20gdGhlIDE5NjBzIHRvIHN1cHBvcnQgbGFuZ3VhZ2VzIGxpa2UgQWxnb2wgKGFuZCBpdHMgZGVzY2VuZGFudHMpDQordGhhdCBzdXBwb3J0IGxleGljYWxseSBuZXN0ZWQgZnVuY3Rpb25zLg0KKw0KK1RoZSBtYWluIGJlbmVmaXQgb2YgdGhpcyB0ZWNobmlxdWUgaXMgdGhhdCB0aGVyZSBpcyBubyBjb2RlIHJlcXVpcmVkDQorYXQgdGhlIGZvcmsgcG9pbnQgdG8gbWFyc2hhbCB0aGUgYXJndW1lbnRzIHRvIHRoZSBvdXRsaW5lZCBmdW5jdGlvbi4NCitTaW5jZSB0aGUgcnVudGltZSBrbm93cyBzdGF0aWNhbGx5IGhvdyBtYW55IGFyZ3VtZW50cyBtdXN0IGJlIHBhc3NlZCB0byB0aGUNCitvdXRsaW5lZCBmdW5jdGlvbiwgaXQgY2FuIGVhc2lseSBjb3B5IHRoZW0gdG8gdGhlIHRocmVhZCdzIHN0YWNrDQorZnJhbWUuICBUaGVyZWZvcmUgdGhlIHBlcmZvcm1hbmNlIG9mIHRoZSBmb3JrIGNvZGUgaXMgaW5kZXBlbmRlbnQgb2YNCit0aGUgbnVtYmVyIG9mIHNoYXJlZCB2YXJpYWJsZXMgdGhhdCBhcmUgYWNjZXNzZWQgYnkgdGhlIG91dGxpbmVkDQorZnVuY3Rpb24uDQorDQorSWYgaXQgaXMgaGFyZCB0byBkZXRlcm1pbmUgdGhlIHN0YWNrIGxheW91dCBvZiB0aGUgcGFyZW50IHdoaWxlIGdlbmVyYXRpbmcgdGhlDQorb3V0bGluZWQgY29kZSwgaXQgaXMgc3RpbGwgcG9zc2libGUgdG8gdXNlIHRoaXMgYXBwcm9hY2ggYnkgY29sbGVjdGluZyBhbGwgb2YNCit0aGUgdmFyaWFibGVzIGluIHRoZSBwYXJlbnQgdGhhdCBhcmUgYWNjZXNzZWQgZnJvbSBvdXRsaW5lZCBmdW5jdGlvbnMgaW50bw0KK2Egc2luZ2xlIGBzdHJ1Y3RgIHdoaWNoIGlzIHBsYWNlZCBvbiB0aGUgc3RhY2ssIGFuZCB3aG9zZSBhZGRyZXNzIGlzIHBhc3NlZA0KK3RvIHRoZSBvdXRsaW5lZCBmdW5jdGlvbnMuIEluIHRoaXMgd2F5IHRoZSBvZmZzZXRzIG9mIHRoZSBzaGFyZWQgdmFyaWFibGVzDQorYXJlIGtub3duIChzaW5jZSB0aGV5IGFyZSBpbnNpZGUgdGhlIHN0cnVjdCkgd2l0aG91dCBuZWVkaW5nIHRvIGtub3cNCit0aGUgY29tcGxldGUgbGF5b3V0IG9mIHRoZSBwYXJlbnQgc3RhY2stZnJhbWUuIEZyb20gdGhlIHBvaW50IG9mIHZpZXcNCitvZiB0aGUgcnVudGltZSBlaXRoZXIgb2YgdGhlc2UgdGVjaG5pcXVlcyBpcyBlcXVpdmFsZW50LCBzaW5jZSBpbiBlaXRoZXINCitjYXNlIGl0IG9ubHkgaGFzIHRvIHBhc3MgYSBzaW5nbGUgYXJndW1lbnQgdG8gdGhlIG91dGxpbmVkIGZ1bmN0aW9uIHRvIGFsbG93IA0KK2l0IHRvIGFjY2VzcyBzaGFyZWQgdmFyaWFibGVzLg0KKw0KK0Egc2NoZW1lIGxpa2UgdGhpcyBpcyBob3cgZ2NjXG90aGVyIGdlbmVyYXRlcyBvdXRsaW5lZCBmdW5jdGlvbnMuDQorDQorQHNlY3Rpb24gU0VDX0lOVEVSRkFDRVMgTGlicmFyeSBJbnRlcmZhY2VzDQorVGhlIGxpYnJhcnkgZnVuY3Rpb25zIHVzZWQgZm9yIHNwZWNpZmljIHBhcnRzIG9mIHRoZSBPcGVuTVBcb3RoZXIgbGFuZ3VhZ2UgaW1wbGVtZW50YXRpb24NCithcmUgZG9jdW1lbnRlZCBpbiBkaWZmZXJlbnQgbW9kdWxlcy4NCisNCisgLSBAcmVmIEJBU0lDX1RZUEVTIGZ1bmRhbWVudGFsIHR5cGVzIHVzZWQgYnkgdGhlIHJ1bnRpbWUgaW4gbWFueSBwbGFjZXMNCisgLSBAcmVmIERFUFJFQ0FURUQgIGZ1bmN0aW9ucyB0aGF0IGFyZSBpbiB0aGUgbGlicmFyeSBidXQgYXJlIG5vIGxvbmdlciByZXF1aXJlZA0KKyAtIEByZWYgU1RBUlRVUF9TSFVURE9XTiBmdW5jdGlvbnMgZm9yIGluaXRpYWxpemluZyBhbmQgZmluYWxpemluZyB0aGUgcnVudGltZQ0KKyAtIEByZWYgUEFSQUxMRUwgZnVuY3Rpb25zIGZvciBpbXBsZW1lbnRpbmcgYG9tcCBwYXJhbGxlbGANCisgLSBAcmVmIFRIUkVBRF9TVEFURVMgZnVuY3Rpb25zIGZvciBzdXBwb3J0aW5nIHRocmVhZCBzdGF0ZSBpbnF1aXJpZXMNCisgLSBAcmVmIFdPUktfU0hBUklORyBmdW5jdGlvbnMgZm9yIHdvcmsgc2hhcmluZyBjb25zdHJ1Y3RzIHN1Y2ggYXMgYG9tcCBmb3JgLCBgb21wIHNlY3Rpb25zYA0KKyAtIEByZWYgVEhSRUFEUFJJVkFURSBmdW5jdGlvbnMgdG8gc3VwcG9ydCB0aHJlYWQgcHJpdmF0ZSBkYXRhLCBjb3B5aW4gZXRjDQorIC0gQHJlZiBTWU5DSFJPTklaQVRJT04gZnVuY3Rpb25zIHRvIHN1cHBvcnQgYG9tcCBjcml0aWNhbGAsIGBvbXAgYmFycmllcmAsIGBvbXAgbWFzdGVyYCwgcmVkdWN0aW9ucyBldGMNCisgLSBAcmVmIEFUT01JQ19PUFMgZnVuY3Rpb25zIHRvIHN1cHBvcnQgYXRvbWljIG9wZXJhdGlvbnMNCisgLSBAcmVmIFNUQVRTX0dBVEhFUklORyBtYWNyb3MgdG8gc3VwcG9ydCBkZXZlbG9wZXIgcHJvZmlsaW5nIG9mIGxpYmlvbXA1DQorIC0gRG9jdW1lbnRhdGlvbiBvbiB0YXNraW5nIGhhcyBzdGlsbCB0byBiZSB3cml0dGVuLi4uDQorDQorQHNlY3Rpb24gU0VDX0VYQU1QTEVTIEV4YW1wbGVzDQorQHN1YnNlY3Rpb24gU0VDX1dPUktTSEFSSU5HX0VYQU1QTEUgV29yayBTaGFyaW5nIEV4YW1wbGUNCitUaGlzIGV4YW1wbGUgc2hvd3MgdGhlIGNvZGUgZ2VuZXJhdGVkIGZvciBhIHBhcmFsbGVsIGZvciB3aXRoIHJlZHVjdGlvbiBhbmQgZHluYW1pYyBzY2hlZHVsaW5nLg0KKw0KK0Bjb2RlDQorZXh0ZXJuIGZsb2F0IGZvbyggdm9pZCApOw0KKw0KK2ludCBtYWluICgpIHsNCisgICAgaW50IGk7IA0KKyAgICBmbG9hdCByID0gMC4wOyANCisgICAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMpIHJlZHVjdGlvbigrOnIpIA0KKyAgICBmb3IgKCBpID0gMDsgaSA8IDEwOyBpICsrICkgew0KKyAgICAgICAgciArPSBmb28oKTsgDQorICAgIH0NCit9DQorQGVuZGNvZGUNCisNCitUaGUgdHJhbnNmb3JtZWQgY29kZSBsb29rcyBsaWtlIHRoaXMuDQorQGNvZGUNCitleHRlcm4gZmxvYXQgZm9vKCB2b2lkICk7IA0KKw0KK2ludCBtYWluICgpIHsNCisgICAgc3RhdGljIGludCB6ZXJvID0gMDsgDQorICAgIGF1dG8gaW50IGd0aWQ7IA0KKyAgICBhdXRvIGZsb2F0IHIgPSAwLjA7IA0KKyAgICBfX2ttcGNfYmVnaW4oICYgbG9jMywgMCApOyANCisgICAgLy8gVGhlIGd0aWQgaXMgbm90IGFjdHVhbGx5IHJlcXVpcmVkIGluIHRoaXMgZXhhbXBsZSBzbyBjb3VsZCBiZSBvbWl0dGVkOw0KKyAgICAvLyBXZSBzaG93IGl0cyBpbml0aWFsaXphdGlvbiBoZXJlIGJlY2F1c2UgaXQgaXMgb2Z0ZW4gcmVxdWlyZWQgZm9yIGNhbGxzIGludG8NCisgICAgLy8gdGhlIHJ1bnRpbWUgYW5kIHNob3VsZCBiZSBsb2NhbGx5IGNhY2hlZCBsaWtlIHRoaXMuDQorICAgIGd0aWQgPSBfX2ttcGNfZ2xvYmFsIHRocmVhZCBudW0oICYgbG9jMyApOyANCisgICAgX19rbXBjX2ZvcmsgY2FsbCggJiBsb2M3LCAxLCBtYWluXzdfcGFyYWxsZWxfMywgJiByICk7IA0KKyAgICBfX2ttcGNfZW5kKCAmIGxvYzAgKTsgDQorICAgIHJldHVybiAwOyANCit9DQorDQorc3RydWN0IG1haW5fMTBfcmVkdWN0aW9uX3RfNSB7IGZsb2F0IHJfMTBfcnByOyB9OyANCisNCitzdGF0aWMga21wX2NyaXRpY2FsX25hbWUgbGNrID0geyAwIH07DQorc3RhdGljIGlkZW50X3QgbG9jMTA7IC8vIGxvYzEwLmZsYWdzIHNob3VsZCBjb250YWluIEtNUF9JREVOVF9BVE9NSUNfUkVEVUNFIGJpdCBzZXQgDQorICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIGNvbXBpbGVyIGhhcyBnZW5lcmF0ZWQgYW4gYXRvbWljIHJlZHVjdGlvbi4NCisNCit2b2lkIG1haW5fN19wYXJhbGxlbF8zKCBpbnQgKmd0aWQsIGludCAqYnRpZCwgZmxvYXQgKnJfN19zaHAgKSB7DQorICAgIGF1dG8gaW50IGlfN19wcjsgDQorICAgIGF1dG8gaW50IGxvd2VyLCB1cHBlciwgbGl0ZXIsIGluY3I7IA0KKyAgICBhdXRvIHN0cnVjdCBtYWluXzEwX3JlZHVjdGlvbl90XzUgcmVkdWNlOyANCisgICAgcmVkdWNlLnJfMTBfcnByID0gMC5GOyANCisgICAgbGl0ZXIgPSAwOyANCisgICAgX19rbXBjX2Rpc3BhdGNoX2luaXRfNCggJiBsb2M3LCpndGlkLCAzNSwgMCwgOSwgMSwgMSApOyANCisgICAgd2hpbGUgKCBfX2ttcGNfZGlzcGF0Y2hfbmV4dF80KCAmIGxvYzcsICpndGlkLCAmIGxpdGVyLCAmIGxvd2VyLCAmIHVwcGVyLCAmIGluY3IgKSApIHsNCisgICAgICAgIGZvciggaV83X3ByID0gbG93ZXI7IHVwcGVyID49IGlfN19wcjsgaV83X3ByICsrICkgDQorICAgICAgICAgIHJlZHVjZS5yXzEwX3JwciArPSBmb28oKTsgDQorICAgIH0NCisgICAgc3dpdGNoKCBfX2ttcGNfcmVkdWNlX25vd2FpdCggJiBsb2MxMCwgKmd0aWQsIDEsIDQsICYgcmVkdWNlLCBtYWluXzEwX3JlZHVjZV81LCAmIGxjayApICkgew0KKyAgICAgICAgY2FzZSAxOg0KKyAgICAgICAgICAgKnJfN19zaHAgKz0gcmVkdWNlLnJfMTBfcnByOw0KKyAgICAgICAgICAgX19rbXBjX2VuZF9yZWR1Y2Vfbm93YWl0KCAmIGxvYzEwLCAqZ3RpZCwgJiBsY2sgKTsNCisgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSAyOg0KKyAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDRfYWRkKCAmIGxvYzEwLCAqZ3RpZCwgcl83X3NocCwgcmVkdWNlLnJfMTBfcnByICk7DQorICAgICAgICAgICBicmVhazsNCisgICAgICAgIGRlZmF1bHQ6Ow0KKyAgICB9DQorfSANCisNCit2b2lkIG1haW5fMTBfcmVkdWNlXzUoIHN0cnVjdCBtYWluXzEwX3JlZHVjdGlvbl90XzUgKnJlZHVjZV9saHMsIA0KKyAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG1haW5fMTBfcmVkdWN0aW9uX3RfNSAqcmVkdWNlX3JocyApIA0KK3sgDQorICAgIHJlZHVjZV9saHMtPnJfMTBfcnByICs9IHJlZHVjZV9yaHMtPnJfMTBfcnByOyANCit9DQorQGVuZGNvZGUNCisNCitAZGVmZ3JvdXAgQkFTSUNfVFlQRVMgQmFzaWMgVHlwZXMNCitUeXBlcyB0aGF0IGFyZSB1c2VkIHRocm91Z2hvdXQgdGhlIHJ1bnRpbWUuDQorDQorQGRlZmdyb3VwIERFUFJFQ0FURUQgRGVwcmVjYXRlZCBGdW5jdGlvbnMNCitGdW5jdGlvbnMgaW4gdGhpcyBncm91cCBhcmUgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IG9ubHksIGFuZA0KK3Nob3VsZCBub3QgYmUgdXNlZCBpbiBuZXcgY29kZS4NCisNCitAZGVmZ3JvdXAgU1RBUlRVUF9TSFVURE9XTiBTdGFydHVwIGFuZCBTaHV0ZG93bg0KK1RoZXNlIGZ1bmN0aW9ucyBhcmUgZm9yIGxpYnJhcnkgaW5pdGlhbGl6YXRpb24gYW5kIHNodXRkb3duLg0KKw0KK0BkZWZncm91cCBQQVJBTExFTCBQYXJhbGxlbCAoZm9yay9qb2luKQ0KK1RoZXNlIGZ1bmN0aW9ucyBhcmUgdXNlZCBmb3IgaW1wbGVtZW50aW5nIDx0dD5cI3ByYWdtYSBvbXAgcGFyYWxsZWw8L3R0Pi4NCisNCitAZGVmZ3JvdXAgVEhSRUFEX1NUQVRFUyBUaHJlYWQgSW5mb3JtYXRpb24NCitUaGVzZSBmdW5jdGlvbnMgcmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIHRocmVhZC4NCisNCitAZGVmZ3JvdXAgV09SS19TSEFSSU5HIFdvcmsgU2hhcmluZw0KK1RoZXNlIGZ1bmN0aW9ucyBhcmUgdXNlZCBmb3IgaW1wbGVtZW50aW5nIA0KKzx0dD5cI3ByYWdtYSBvbXAgZm9yPC90dD4sIDx0dD5cI3ByYWdtYSBvbXAgc2VjdGlvbnM8L3R0PiwgPHR0PlwjcHJhZ21hIG9tcCBzaW5nbGU8L3R0PiBhbmQgDQorPHR0PlwjcHJhZ21hIG9tcCBtYXN0ZXI8L3R0PiBjb25zdHJ1Y3RzLiANCisNCitXaGVuIGhhbmRsaW5nIGxvb3BzLCB0aGVyZSBhcmUgZGlmZmVyZW50IGZ1bmN0aW9ucyBmb3IgZWFjaCBvZiB0aGUgc2lnbmVkIGFuZCB1bnNpZ25lZCAzMiBhbmQgNjQgYml0IGludGVnZXIgdHlwZXMNCit3aGljaCBoYXZlIHRoZSBuYW1lIHN1ZmZpeGVzIGBfNGAsIGBfNHVgLCBgXzhgIGFuZCBgXzh1YC4gVGhlIHNlbWFudGljcyBvZiBlYWNoIG9mIHRoZSBmdW5jdGlvbnMgaXMgdGhlIHNhbWUsDQorc28gdGhleSBhcmUgb25seSBkZXNjcmliZWQgb25jZS4NCisNCitTdGF0aWMgbG9vcCBzY2hlZHVsaW5nIGlzIGhhbmRsZWQgYnkgIEByZWYgX19rbXBjX2Zvcl9zdGF0aWNfaW5pdF80IGFuZCBmcmllbmRzLiBPbmx5IGEgc2luZ2xlIGNhbGwgaXMgbmVlZGVkLA0KK3NpbmNlIHRoZSBpdGVyYXRpb25zIHRvIGJlIGV4ZWN1dGVkIGJ5IGFueSBnaXZlIHRocmVhZCBjYW4gYmUgZGV0ZXJtaW5lZCBhcyBzb29uIGFzIHRoZSBsb29wIHBhcmFtZXRlcnMgYXJlIGtub3duLg0KKw0KK0R5bmFtaWMgc2NoZWR1bGluZyBpcyBoYW5kbGVkIGJ5IHRoZSBAcmVmIF9fa21wY19kaXNwYXRjaF9pbml0XzQgYW5kIEByZWYgX19rbXBjX2Rpc3BhdGNoX25leHRfNCBmdW5jdGlvbnMuIA0KK1RoZSBpbml0IGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlIGluIGVhY2ggdGhyZWFkIG91dHNpZGUgdGhlIGxvb3AsIHdoaWxlIHRoZSBuZXh0IGZ1bmN0aW9uIGlzIGNhbGxlZCBlYWNoDQordGltZSB0aGF0IHRoZSBwcmV2aW91cyBjaHVuayBvZiB3b3JrIGhhcyBiZWVuIGV4aGF1c3RlZC4gDQorDQorQGRlZmdyb3VwIFNZTkNIUk9OSVpBVElPTiBTeW5jaHJvbml6YXRpb24NCitUaGVzZSBmdW5jdGlvbnMgYXJlIHVzZWQgZm9yIGltcGxlbWVudGluZyBiYXJyaWVycy4NCisNCitAZGVmZ3JvdXAgVEhSRUFEUFJJVkFURSBUaHJlYWQgcHJpdmF0ZSBkYXRhIHN1cHBvcnQNCitUaGVzZSBmdW5jdGlvbnMgc3VwcG9ydCBjb3B5aW4vb3V0IGFuZCB0aHJlYWQgcHJpdmF0ZSBkYXRhLg0KKw0KK0BkZWZncm91cCBTVEFUU19HQVRIRVJJTkcgU3RhdGlzdGljcyBHYXRoZXJpbmcgZnJvbSBPTVBUQg0KK1RoZXNlIG1hY3JvcyBzdXBwb3J0IHByb2ZpbGluZyB0aGUgbGliaW9tcDUgbGlicmFyeS4gIFVzZSAtLXN0YXRzPW9uIHdoZW4gYnVpbGRpbmcgd2l0aCBidWlsZC5wbCB0byBlbmFibGUNCithbmQgdGhlbiB1c2UgdGhlIEtNUF8qIG1hY3JvcyB0byBwcm9maWxlICh0aHJvdWdoIGNvdW50cyBvciBjbG9jayB0aWNrcykgbGliaW9tcDUgZHVyaW5nIGV4ZWN1dGlvbiBvZiBhbiBPcGVuTVAgcHJvZ3JhbS4NCisNCitAc2VjdGlvbiBzZWNfc3RhdHNfZW52X3ZhcnMgRW52aXJvbm1lbnQgVmFyaWFibGVzDQorDQorVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIHJlbGV2ZW50IHRvIHN0YXRzLWdhdGhlcmluZyBpbiBsaWJpb21wNQ0KKw0KK0Bjb2RlDQorS01QX1NUQVRTX0ZJTEUNCitAZW5kY29kZQ0KK1RoaXMgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgc2V0IHRvIGFuIG91dHB1dCBmaWxlbmFtZSB0aGF0IHdpbGwgYmUgYXBwZW5kZWQgKk5PVCBPVkVSV1JJVFRFTiogaWYgaXQgZXhpc3RzLiAgSWYgdGhpcyBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyB1bmRlZmluZWQsIHRoZSBzdGF0aXN0aWNzIHdpbGwgYmUgb3V0cHV0IHRvIHN0ZGVycg0KKw0KK0Bjb2RlDQorS01QX1NUQVRTX1RIUkVBRFMNCitAZW5kY29kZQ0KK1RoaXMgZW52aXJvbm1lbnQgdmFyaWFibGUgaW5kaWNhdGVzIHRvIHByaW50IHRocmVhZC1zcGVjaWZpYyBzdGF0aXN0aWNzIGFzIHdlbGwgYXMgYWdncmVnYXRlIHN0YXRpc3RpY3MuICBFYWNoIHRocmVhZCdzIHN0YXRpc3RpY3Mgd2lsbCBiZSBzaG93biBhcyB3ZWxsIGFzIHRoZSBjb2xsZWN0aXZlIHN1bSBvZiBhbGwgdGhyZWFkcy4gIFRoZSB2YWx1ZXMgInRydWUiLCAib24iLCAiMSIsICJ5ZXMiIHdpbGwgYWxsIGluZGljYXRlIHRvIHByaW50IHBlciB0aHJlYWQgc3RhdGlzdGljcy4NCisNCitAZGVmZ3JvdXAgVEFTS0lORyBUYXNraW5nIHN1cHBvcnQNCitUaGVzZSBmdW5jdGlvbnMgc3VwcG9ydCB0YXNraW5nIGNvbnN0cnVjdHMuDQorDQorQGRlZmdyb3VwIFVTRVIgVXNlciB2aXNpYmxlIGZ1bmN0aW9ucw0KK1RoZXNlIGZ1bmN0aW9ucyBjYW4gYmUgY2FsbGVkIGRpcmVjdGx5IGJ5IHRoZSB1c2VyLCBidXQgYXJlIHJ1bnRpbWUgbGlicmFyeSBzcGVjaWZpYywgcmF0aGVyIHRoYW4gYmVpbmcgT3Blbk1QIGludGVyZmFjZXMuDQorDQorKi8NCisNCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9DTWFrZUxpc3RzLnR4dCBiL2ZpbmFsL3J1bnRpbWUvc3JjL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzNzI4OWIKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDE4MyBAQAorc2V0KE9NUF9TSExJQkVYVCAiJHtDTUFLRV9TSEFSRURfTElCUkFSWV9TVUZGSVh9IikKKworZXhlY3V0ZV9wcm9jZXNzKENPTU1BTkQgImRhdGUiICIrJVktJW0tJWQgJUg6JU06JVMiIE9VVFBVVF9WQVJJQUJMRSBCVUlMRF9USU1FKQorc3RyaW5nKFJFR0VYIFJFUExBQ0UgIlxuIiAiIiBCVUlMRF9USU1FICR7QlVJTERfVElNRX0pCisKK2luY2x1ZGVfZGlyZWN0b3JpZXMoCisgIC4KKyAgaW5jbHVkZQorICBpbmNsdWRlLyR7T01QX1ZFUlNJT059CisgIGkxOG4KKyAgdGhpcmRwYXJ0eS9pdHRub3RpZnkKKyAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9CispCisKK2lmKFdJTjMyKQorICBzZXQoT1NfR0VOICJ3aW4iKQorZWxzZWlmKEFQUExFKQorICBzZXQoT1NfR0VOICJtYWMiKQorZWxzZWlmKFVOSVgpCisgIHNldChPU19HRU4gImxpbiIpCitlbHNlKCkKKyAgbWVzc2FnZShGQVRBTF9FUlJPUiAiVW5zdXBwb3J0ZWQgT1MiKQorZW5kaWYoKQorCitpZihhcmNoKQkKKwlzZXQoQVJDSCAke2FyY2h9KSAjYWNxdWlyZSBmcm9tIGNvbW1hbmQgbGluZQorZWxzZSgpICMgRW5zdXJlIEFSQ0ggaXMgc2V0CisgIG1lc3NhZ2UoRkFUQUxfRVJST1IgIkFSQ0ggbm90IHNldC4gUG9zc2libGUgdmFsdWVzIGFyZSAzMmUgMzIgYXJtIHBwYzY0IGFhcmNoNjQuIEV4YW1wbGUgLURBUkNIPWUzMiBmb3IgeDg2LTY0L0ludGVsNjQiKQorZW5kaWYoKQorCitpZigiJHthcmNofSIgU1RSRVFVQUwgIjMyZSIpCisgIHNldChBUkNIX1NUUiAiSW50ZWwoUikgNjQiKQorZWxzZWlmKCIke2FyY2h9IiBTVFJFUVVBTCAicHBjNjQiKQorICBzZXQoQVJDSF9TVFIgIlBQQzY0IikKK2Vsc2VpZigiJHthcmNofSIgU1RSRVFVQUwgImFhcmNoNjQiKSAgICAgICAgICAgICAgICAgICAgICAgCisgIHNldChBUkNIX1NUUiAiQUFSQ0g2NCIpICAKK2VuZGlmKCkKKworc2V0KEZFQVRVUkVfRkxBR1MgIi1EIFVTRV9JVFRfQlVJTEQiKQorc2V0KEZFQVRVUkVfRkxBR1MgIiR7RkVBVFVSRV9GTEFHU30gLUQgTkRFQlVHIikKK3NldChGRUFUVVJFX0ZMQUdTICIke0ZFQVRVUkVfRkxBR1N9IC1EIEtNUF9BUkNIX1NUUj1cIlxcXCIke0FSQ0hfU1RSfVxcXCJcIiIpCitzZXQoRkVBVFVSRV9GTEFHUyAiJHtGRUFUVVJFX0ZMQUdTfSAtRCBfR05VX1NPVVJDRSIpCitzZXQoRkVBVFVSRV9GTEFHUyAiJHtGRUFUVVJFX0ZMQUdTfSAtRCBfUkVFTlRSQU5UIikKK3NldChGRUFUVVJFX0ZMQUdTICIke0ZFQVRVUkVfRkxBR1N9IC1EIEtNUF9VU0VfQVNTRVJUIikKK3NldChGRUFUVVJFX0ZMQUdTICIke0ZFQVRVUkVfRkxBR1N9IC1EIEJVSUxEX0k4IikKK3NldChGRUFUVVJFX0ZMQUdTICIke0ZFQVRVUkVfRkxBR1N9IC1EIEJVSUxEX1RWIikKKworaWYoQVBQTEUpCisgIHNldChDTUFLRV9TSEFSRURfTElOS0VSX0ZMQUdTICIke0NNQUtFX1NIQVJFRF9MSU5LRVJfRkxBR1N9IC1jdXJyZW50X3ZlcnNpb24gNS4wIikKKyAgc2V0KENNQUtFX1NIQVJFRF9MSU5LRVJfRkxBR1MgIiR7Q01BS0VfU0hBUkVEX0xJTktFUl9GTEFHU30gLWNvbXBhdGliaWxpdHlfdmVyc2lvbiA1LjAiKQorZW5kaWYoKQorCitzZXQoRkVBVFVSRV9GTEFHUyAiJHtGRUFUVVJFX0ZMQUdTfSAtRCBLTVBfTElCUkFSWV9GSUxFPVxcXCJsaWJpb21wNS4ke09NUF9TSExJQkVYVH1cXFwiIikKK3NldChGRUFUVVJFX0ZMQUdTICIke0ZFQVRVUkVfRkxBR1N9IC1EIEtNUF9WRVJTSU9OX01BSk9SPSR7VkVSU0lPTn0iKQorCisjIGN1c3RvbWl6ZSBjYWNoZSBsaW5lIHNpemUgZm9yIHBwYzY0IHRvIDEyOCBieXRlczogNjQgaW4gYWxsIG90aGVyIGNhc2VzCitpZigiJHthcmNofSIgU1RSRVFVQUwgInBwYzY0IikKKwlzZXQoRkVBVFVSRV9GTEFHUyAiJHtGRUFUVVJFX0ZMQUdTfSAtRCBDQUNIRV9MSU5FPTEyOCIpCitlbHNlKCkKKwlzZXQoRkVBVFVSRV9GTEFHUyAiJHtGRUFUVVJFX0ZMQUdTfSAtRCBDQUNIRV9MSU5FPTY0IikJCitlbmRpZigpCisKK3NldChGRUFUVVJFX0ZMQUdTICIke0ZFQVRVUkVfRkxBR1N9IC1EIEtNUF9BREpVU1RfQkxPQ0tUSU1FPTEiKQorc2V0KEZFQVRVUkVfRkxBR1MgIiR7RkVBVFVSRV9GTEFHU30gLUQgQlVJTERfUEFSQUxMRUxfT1JERVJFRCIpCitzZXQoRkVBVFVSRV9GTEFHUyAiJHtGRUFUVVJFX0ZMQUdTfSAtRCBLTVBfQVNNX0lOVFJJTlMiKQorc2V0KEZFQVRVUkVfRkxBR1MgIiR7RkVBVFVSRV9GTEFHU30gLUQgVVNFX0xPQURfQkFMQU5DRSIpCitzZXQoRkVBVFVSRV9GTEFHUyAiJHtGRUFUVVJFX0ZMQUdTfSAtRCBVU0VfQ0JMS0RBVEEiKQorc2V0KEZFQVRVUkVfRkxBR1MgIiR7RkVBVFVSRV9GTEFHU30gLUQgR1VJREVETExfRVhQT1JUUyIpCitzZXQoRkVBVFVSRV9GTEFHUyAiJHtGRUFUVVJFX0ZMQUdTfSAtRCBLTVBfR09NUF9DT01QQVQiKQorCisjYWRhcHRpdmUgbG9ja3MgdXNlIHg4NiBhc3NlbWJseSAtIGRpc2FibGUgZm9yIHBwYzY0CitpZigiJHthcmNofSIgU1RSRVFVQUwgIjMyZSIgT1IgIiR7YXJjaH0iIFNUUkVRVUFMICIzMiIpCisJc2V0KEZFQVRVUkVfRkxBR1MgIiR7RkVBVFVSRV9GTEFHU30gLUQgS01QX1VTRV9BREFQVElWRV9MT0NLUz0xIikKKwlzZXQoRkVBVFVSRV9GTEFHUyAiJHtGRUFUVVJFX0ZMQUdTfSAtRCBLTVBfREVCVUdfQURBUFRJVkVfTE9DS1M9MCIpCitlbmRpZigpCisKK3NldChGRUFUVVJFX0ZMQUdTICIke0ZFQVRVUkVfRkxBR1N9IC1EIE9NUF81MF9FTkFCTEVEPTAiKQorc2V0KEZFQVRVUkVfRkxBR1MgIiR7RkVBVFVSRV9GTEFHU30gLUQgT01QXzQxX0VOQUJMRUQ9MCIpCitzZXQoRkVBVFVSRV9GTEFHUyAiJHtGRUFUVVJFX0ZMQUdTfSAtRCBPTVBfNDBfRU5BQkxFRD0xIikKK3NldChGRUFUVVJFX0ZMQUdTICIke0ZFQVRVUkVfRkxBR1N9IC1EIE9NUF8zMF9FTkFCTEVEPTEiKQorc2V0KEZFQVRVUkVfRkxBR1MgIiR7RkVBVFVSRV9GTEFHU30gLUQgVVNFX0lUVF9OT1RJRlk9MSIpCitzZXQoRkVBVFVSRV9GTEFHUyAiJHtGRUFUVVJFX0ZMQUdTfSAtRCBJTlRFTF9JVFROT1RJRllfUFJFRklYPV9fa21wX2l0dF8iKQoraWYgKE5PVCBBUFBMRSkKKyAgc2V0KEZFQVRVUkVfRkxBR1MgIiR7RkVBVFVSRV9GTEFHU30gLUQgS01QX1REQVRBX0dUSUQiKQorZW5kaWYoKQorc2V0KEZFQVRVUkVfRkxBR1MgIiR7RkVBVFVSRV9GTEFHU30gLUQgX0tNUF9CVUlMRF9USU1FPVwiXFxcIiR7QlVJTERfVElNRX0gVVRDXFxcIlwiIikKKworc2V0KENPTU1PTl9GTEFHUyAiLWZQSUMiKQorc2V0KENPTU1PTl9GTEFHUyAiJHtDT01NT05fRkxBR1N9IC1Xbm8tdW51c2VkLXZhbHVlIikKK3NldChDT01NT05fRkxBR1MgIiR7Q09NTU9OX0ZMQUdTfSAtV25vLXN3aXRjaCIpCitzZXQoQ09NTU9OX0ZMQUdTICIke0NPTU1PTl9GTEFHU30gLVduby1kZXByZWNhdGVkLXJlZ2lzdGVyIikKK3NldChDT01NT05fRkxBR1MgIiR7Q09NTU9OX0ZMQUdTfSAtZm5vLWV4Y2VwdGlvbnMiKQorCitzZXQoQ01BS0VfQ1hYX0ZMQUdTICIke0NNQUtFX0NYWF9GTEFHU30gJHtGRUFUVVJFX0ZMQUdTfSAke0NPTU1PTl9GTEFHU30iKQorc2V0KENNQUtFX0NfRkxBR1MgIiR7Q01BS0VfQ19GTEFHU30gJHtGRUFUVVJFX0ZMQUdTfSAke0NPTU1PTl9GTEFHU30iKQorCitzZXQoQVNNX1NPVVJDRVMKKyAgel9MaW51eF9hc20ucworKQorc2V0KFNPVVJDRVMKKyAgdGhpcmRwYXJ0eS9pdHRub3RpZnkvaXR0bm90aWZ5X3N0YXRpYy5jCisgIGttcF9hZmZpbml0eS5jcHAKKyAga21wX2FsbG9jLmMKKyAga21wX2F0b21pYy5jCisgIGttcF9jYW5jZWwuY3BwCisgIGttcF9jc3VwcG9ydC5jCisgIGttcF9kZWJ1Zy5jCisgIGttcF9kaXNwYXRjaC5jcHAKKyAga21wX2Vudmlyb25tZW50LmMKKyAga21wX2Vycm9yLmMKKyAga21wX2Z0bl9jZGVjbC5jCisgIGttcF9mdG5fZXh0cmEuYworICBrbXBfZ2xvYmFsLmMKKyAga21wX2dzdXBwb3J0LmMKKyAga21wX2kxOG4uYworICBrbXBfaW8uYworICBrbXBfaXR0LmMKKyAga21wX2xvY2suY3BwCisgIGttcF9ydW50aW1lLmMKKyAga21wX3NjaGVkLmNwcAorICBrbXBfc2V0dGluZ3MuYworICBrbXBfc3RyLmMKKyAga21wX3Rhc2tkZXBzLmNwcAorICBrbXBfdGFza2luZy5jCisgIGttcF90YXNrcS5jCisgIGttcF90aHJlYWRwcml2YXRlLmMKKyAga21wX3V0aWxpdHkuYworICBrbXBfdmVyc2lvbi5jCisgIHpfTGludXhfdXRpbC5jCispCisKK3NldF9zb3VyY2VfZmlsZXNfcHJvcGVydGllcygke1NPVVJDRVN9IFBST1BFUlRJRVMgTEFOR1VBR0UgQ1hYKQorc2V0X3NvdXJjZV9maWxlc19wcm9wZXJ0aWVzKCR7QVNNX1NPVVJDRVN9IFBST1BFUlRJRVMgTEFOR1VBR0UgQ1hYKQorCithZGRfY3VzdG9tX2NvbW1hbmQoCisgIE9VVFBVVCBrbXBfaTE4bl9pZC5pbmMKKyAgICBDT01NQU5EIHBlcmwgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9Ly4uL3Rvb2xzL21lc3NhZ2UtY29udmVydGVyLnBsIC0tb3M9JHtPU19HRU59IC0tYXJjaD0ke0FSQ0h9IC0tcHJlZml4PWttcF9pMThuIC0tZW51bT1rbXBfaTE4bl9pZC5pbmMgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2kxOG4vZW5fVVMudHh0CispCithZGRfY3VzdG9tX2NvbW1hbmQoCisgIE9VVFBVVCBrbXBfaTE4bl9kZWZhdWx0LmluYworICAgIENPTU1BTkQgcGVybCAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vLi4vdG9vbHMvbWVzc2FnZS1jb252ZXJ0ZXIucGwgLS1vcz0ke09TX0dFTn0gLS1hcmNoPSR7QVJDSH0gLS1wcmVmaXg9a21wX2kxOG4gLS1kZWZhdWx0PWttcF9pMThuX2RlZmF1bHQuaW5jICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9pMThuL2VuX1VTLnR4dAorKQorYWRkX2N1c3RvbV9jb21tYW5kKAorICBPVVRQVVQgb21wLmgKKyAgICBDT01NQU5EIHBlcmwgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9Ly4uL3Rvb2xzL2V4cGFuZC12YXJzLnBsIC0tc3RyaWN0IC1EIFJldmlzaW9uPVwiXFwkJFJldmlzaW9uXCIgLUQgRGF0ZT1cIlxcJCREYXRlXCIgLUQgS01QX1RZUEU9XCJQZXJmb3JtYW5jZVwiIC1EIEtNUF9BUkNIPVwiXFxcIiR7QVJDSF9TVFJ9XFxcIlwiIC1EIEtNUF9WRVJTSU9OX01BSk9SPSR7VkVSU0lPTn0gLUQgS01QX1ZFUlNJT05fTUlOT1I9MCAtRCBLTVBfVkVSU0lPTl9CVUlMRD0wMDAwMDAwMCAtRCBLTVBfQlVJTERfREFURT1cIiR7QlVJTERfVElNRX0gVVRDXCIgLUQgS01QX1RBUkdFVF9DT01QSUxFUj0xMiAtRCBLTVBfRElBRz0wIC1EIEtNUF9ERUJVR19JTkZPPTAgLUQgT01QX1ZFUlNJT049JHtPTVBfVkVSU0lPTn0gJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2luY2x1ZGUvJHtPTVBfVkVSU0lPTl9OVU19L29tcC5oLnZhciBvbXAuaAorKQorCitpZigiJHtBUkNIfSIgU1RSRVFVQUwgInBwYzY0IikKKyAgc2V0KEtNUF9BUkNIX1RFTVAgIktNUF9BUkNIX1BQQzY0IikKK2Vsc2VpZigiJHtBUkNIfSIgU1RSRVFVQUwgImFybSIpCisgIHNldChLTVBfQVJDSF9URU1QICJLTVBfQVJDSF9BUk0iKQorZWxzZWlmKCIke0FSQ0h9IiBTVFJFUVVBTCAiYWFyY2g2NCIpCisgIHNldChLTVBfQVJDSF9URU1QICJLTVBfQVJDSF9BQVJDSDY0IikKK2Vsc2UKKyAgc2V0KEtNUF9BUkNIX1RFTVAgIktNUF9BUkNIX1g4Nl82NCIpCitlbmRpZigpCisKK2FkZF9jdXN0b21fY29tbWFuZCgKKyAgT1VUUFVUIHpfTGludXhfYXNtLm8KKyAgICBDT01NQU5EICR7Q01BS0VfQ1hYX0NPTVBJTEVSfSAtYyAtbyB6X0xpbnV4X2FzbS5vIC1EIEtNUF9BU01fSU5UUklOUyAtRCBLTVBfR09NUF9DT01QQVQgLUQgJHtLTVBfQVJDSF9URU1QfSAteCBhc3NlbWJsZXItd2l0aC1jcHAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9LyR7QVNNX1NPVVJDRVN9CispCisKK2FkZF9jdXN0b21fdGFyZ2V0KGdlbl9rbXBfaTE4biBERVBFTkRTIGttcF9pMThuX2lkLmluYyBrbXBfaTE4bl9kZWZhdWx0LmluYyBvbXAuaCB6X0xpbnV4X2FzbS5vKQorCitpZihOT1QgQVBQTEUpCisJaWYoJHtBUkNIfSBTVFJFUVVBTCAicHBjNjQiIEFORCAke09TX0dFTn0gU1RSRVFVQUwgImxpbiIpCisgIAkJc2V0KENNQUtFX1NIQVJFRF9MSU5LRVJfRkxBR1MgIi1XbCwtLXZlcnNpb24tc2NyaXB0PSR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9leHBvcnRzX3NvLnR4dCAtbGRsIikKKyAJZWxzZSgpCisgICAJCXNldChDTUFLRV9TSEFSRURfTElOS0VSX0ZMQUdTICItV2wsLS12ZXJzaW9uLXNjcmlwdD0ke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vZXhwb3J0c19zby50eHQiKQorCWVuZGlmKCkKK2VuZGlmKCkKKworYWRkX2xpYnJhcnkoaW9tcDUgU0hBUkVEICR7U09VUkNFU30gel9MaW51eF9hc20ubykKKworIyBUaGlzIGlzIGEgd29ya2Fyb3VuZCB0byBhIGtub3duIHBwYzY0IGlzc3VlIGFib3V0IGxpYnB0aHJlYWQuIEZvciBtb3JlCisjIGluZm9ybWF0aW9uIHNlZQorIyBodHRwOi8vcnlhbmFybi5ibG9nc3BvdC5jb20vMjAxMS8wNy9jdXJpb3VzLWNhc2Utb2YtcHRocmVhZGF0Zm9yay1vbi5odG1sCitpZigiJHtBUkNIfSIgU1RSRVFVQUwgInBwYzY0IikKKwkgICAgICBmaW5kX2xpYnJhcnkoUFRIUkVBRCBOQU1FUyBwdGhyZWFkKQorCSAgICAgIHRhcmdldF9saW5rX2xpYnJhcmllcyhpb21wNSAke1BUSFJFQUR9KQorZW5kaWYoKQorCithZGRfZGVwZW5kZW5jaWVzKGlvbXA1IGdlbl9rbXBfaTE4bikKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2RlZnMubWsgYi9maW5hbC9ydW50aW1lL3NyYy9kZWZzLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0YTBlOTAKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9kZWZzLm1rCkBAIC0wLDAgKzEsNjUgQEAKKyMgZGVmcy5taworIyAkUmV2aXNpb246IDQyOTUxICQKKyMgJERhdGU6IDIwMTQtMDEtMjEgMTQ6NDE6NDEgLTA2MDAgKFR1ZSwgMjEgSmFuIDIwMTQpICQKKworIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRoaXMgZmlsZSBjb250YWlucyBkZWZpbml0aW9ucyBjb21tb24gZm9yIE9wZW5NUCBSVEwgYW5kIERTTCBtYWtlZmlsZXMuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSW5jbHVkZSByZWFsbHkgY29tbW9uIGRlZmluaXRpb25zLgoraW5jbHVkZSAkKExJQk9NUF9XT1JLKXRvb2xzL3NyYy9jb21tb24tZGVmcy5taworCisjCisjIERpcmVjdG9yaWVzLgorIworCisjIENoZWNrIGFuZCBub3JtYWxpemUgTElCT01QX0VYUE9SVFMuCitpZmVxICIkKExJQk9NUF9FWFBPUlRTKSIgIiIKKyAgICAkKGVycm9yIExJQk9NUF9FWFBPUlRTIGVudmlyb25tZW50IHZhcmlhYmxlIG11c3QgYmUgc2V0KQorZW5kaWYKK2lmbmVxICIkKHdvcmRzICQoTElCT01QX0VYUE9SVFMpKSIgIjEiCisgICAgJChlcnJvciBMSUJPTVBfRVhQT1JUUyBtdXN0IG5vdCBjb250YWluIHNwYWNlcykKK2VuZGlmCitvdmVycmlkZSBMSUJPTVBfRVhQT1JUUyA6PSAkKHN1YnN0IFwsLywkKExJQk9NUF9FWFBPUlRTKSkKK2lmZXEgIiQoZmlsdGVyICUvLCQoTElCT01QX0VYUE9SVFMpKSIgIiIKKyAgICBvdmVycmlkZSBMSUJPTVBfRVhQT1JUUyA6PSAkKExJQk9NUF9FWFBPUlRTKS8KK2VuZGlmCisjIE91dHB1dCBkaXJlY3Rvcmllcy4KK291dF9kaXIgICAgICA9ICQoTElCT01QX0VYUE9SVFMpCitvdXRfY21uX2RpciAgPSAkKG91dF9kaXIpY29tbW9uJChzdWZmaXgpLworb3V0X3B0Zl9kaXIgID0gJChvdXRfZGlyKSQocGxhdGZvcm0pJChzdWZmaXgpLworX291dF9saWJfZGlyID0gJChvdXRfZGlyKSQoMSkkKHN1ZmZpeCkvbGliJChpZiAkKGZpbHRlciBtYWNfJSwkKDEpKSwudGhpbikvCitvdXRfbGliX2RpciAgPSAkKGNhbGwgX291dF9saWJfZGlyLCQocGxhdGZvcm0pKQorb3V0X2wxMG5fZGlyID0gJChvdXRfbGliX2RpcikkKGlmICQoZmlsdGVyIGxpbiBtYWMsJChvcykpLGxvY2FsZS8pCitpZmVxICIkKG9zKSIgIm1hYyIKKyAgICBfb3V0X2xpYl9mYXRfZGlyID0gJChvdXRfZGlyKSQoMSkkKHN1ZmZpeCkvbGliLworICAgIG91dF9saWJfZmF0X2RpciAgPSAkKGNhbGwgX291dF9saWJfZmF0X2RpciwkKHBsYXRmb3JtKSkKKyAgICBvdXRfbDEwbl9mYXRfZGlyID0gJChvdXRfbGliX2ZhdF9kaXIpbG9jYWxlLworZW5kaWYKKworIworIyBSZXRyaWV2ZSBidWlsZCBudW1iZXIsCisjCisKK2lmZXEgIiQoY2xlYW4pIiAiIgorICAgICMgUGFyc2Uga21wX3ZlcnNpb24uYyBmaWxlLCBsb29rIGZvciAiI2RlZmluZSBLTVBfVkVSU0lPTl9CVUlMRCB5eXl5bW1kZCIgc3RyaW5nLAorICAgICMgbGVhdmUgb25seSAieXl5eW1tZGQiLiBOb3RlOiBTcGFjZSBhZnRlciAkJDEgaXMgaW1wb3J0YW50LCBpdCBoZWxwcyB0byBkZXRlY3QgcG9zc2libGUgZXJyb3JzLgorICAgIGJ1aWxkIDo9ICQoc3RyaXAgJChzaGVsbCAkKHBlcmwpIC1wIC1lICckJF8gPX4gc3teKD86XHMqXCNkZWZpbmVccytLTVBfVkVSU0lPTl9CVUlMRFxzKyhbMC05XXs4fSl8LiopXHMqXG59eyQkMSB9JyAkKExJQk9NUF9XT1JLKXNyYy9rbXBfdmVyc2lvbi5jKSkKKyAgICBpZm5lcSAiJCh3b3JkcyAkKGJ1aWxkKSkiICIxIgorICAgICAgICAkKGVycm9yIEZhaWxlZCB0byBwYXNlICJrbXBfdmVyc2lvbi5jIiwgY2Fubm90IGV4dHJhY3QgYnVpbGQgbnVtYmVyKQorICAgIGVuZGlmCisgICAgJChjYWxsIHNheSxCdWlsZCAgOiAkKGJ1aWxkKSQoaWYgJChmaWx0ZXIgMDAwMDAwMDAsJChidWlsZCkpLCAoZGV2ZWxvcG1lbnQpKSkKK2VuZGlmCisKKyMgZW5kIG9mIGZpbGUgIwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMvZGxsZXhwb3J0cyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2RsbGV4cG9ydHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgyYjdhZgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2RsbGV4cG9ydHMKQEAgLTAsMCArMSw5NjMgQEAKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKKworIyBEZXByZWNhdGVkIGVudHJ5IHBvaW50cyAobnVtYmVycyBhcmUgcmVzZXJ2ZWQpOgorLSBfX2ttcGNfYmFycmllcl9yZWR1Y2VfbWFzdGVyICAgICAgICAgICAgICAxMDkKKy0gX19rbXBjX2VuZF9iYXJyaWVyX3JlZHVjZV9tYXN0ZXIgICAgICAgICAgMTIyCistIF9fa21wY19mb3JfaW5pdF80ICAgICAgICAgICAgICAgICAgICAgICAgIDEzMQorLSBfX2ttcGNfZm9yX2luaXRfOCAgICAgICAgICAgICAgICAgICAgICAgICAxMzIKKy0gX19rbXBjX2Zvcl9uZXh0XzQgICAgICAgICAgICAgICAgICAgICAgICAgMTMzCistIF9fa21wY19mb3JfbmV4dF84ICAgICAgICAgICAgICAgICAgICAgICAgIDEzNAorLSBfX2ttcGNfZm9ya19jYWxsX2JvdW5kICAgICAgICAgICAgICAgICAgICAxMzkKKy0gX19rbXBjX3JlZHVjZV9tYXN0ZXJfbm93YWl0ICAgICAgICAgICAgICAgMTQ5CistIF9fa21wY19vbXBfdGFza19iZWdpbiAgICAgICAgICAgICAgICAgICAgIDE5NAorLSBfX2ttcGNfb21wX3Rhc2tfY29tcGxldGUgICAgICAgICAgICAgICAgICAxOTUKKy0ga21wY19zaGFyYWJsZV9jYWxsb2MgICAgICAgICAgICAgICAgICAgICAgMjE4CistIGttcGNfc2hhcmFibGVfZnJlZSAgICAgICAgICAgICAgICAgICAgICAgIDIxOQorLSBrbXBjX3NoYXJhYmxlX21hbGxvYyAgICAgICAgICAgICAgICAgICAgICAyMjAKKy0ga21wY19zaGFyYWJsZV9yZWFsbG9jICAgICAgICAgICAgICAgICAgICAgMjIxCistIGttcGNfYWxpZ25lZF9zaGFyYWJsZV9tYWxsb2MgICAgICAgICAgICAgIDIyMworLSBtcGFpNGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MDAKKy0gbXBhaThhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTAxCistIG1wYXI0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwMgorLSBtcGFyOGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MDMKKy0gbXBheDR4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTA0CistIG1wYXg4eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwNQorLSBtcG9iYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MDYKKy0gbXBvZWJyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTA3CistIG1wb2ZvcmsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwOAorLSBtcG9mcmsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MDkKKy0gbXBvam9pbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTEwCistIG1wb3hiciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUxMQorLSBtcHBhZGogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MTIKKy0gbXBwYWZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTEzCistIG1wcGJhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUxNAorLSBtcHBiZWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MTUKKy0gbXBwZGVvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTE2CistIG1wcGRueCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUxNworLSBtcHBkbnhkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MTgKKy0gbXBwZG9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTE5CistIG1wcGR4byAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUyMAorLSBtcHBlYnIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MjEKKy0gbXBwZWNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTIyCistIG1wcGVtcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUyMworLSBtcHBlbmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MjQKKy0gbXBwZW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTI1CistIG1wcGVwYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUyNgorLSBtcHBlc3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MjcKKy0gbXBwZmtkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTI4CistIG1wcGZrdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUyOQorLSBtcHBmb3JrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MzAKKy0gbXBwZnJrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTMxCistIG1wcGlvYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUzMgorLSBtcHBpd3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MzMKKy0gbXBwam9pbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTM0CistIG1wcG50aCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUzNQorLSBtcHBwcWEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MzYKKy0gbXBwcHFjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTM3CistIG1wcHBxcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUzOAorLSBtcHB0aWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MzkKKy0gbXBwdHBhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTQwCistIG1wcHRwYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU0MQorLSBtcHB0cHogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NDIKKy0gbXBwdnN5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTQzCistIG1wcHhiciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU0NAorLSBtcHB4Y3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NDUKKy0gbXBweG1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTQ2CistIG1wcHhuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU0NworLSBtcHB4cGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NDgKKy0gbXBweHByICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTQ5CistIG1wcHhzcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU1MAorLSBtcHB4dGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NTEKKy0gbXBzYmFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTUyCistIG1wc2NwciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU5NworLSBtcHNlYnIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NTMKKy0gbXBzZXJkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTU0CistIG1wc2ZkNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU1NQorLSBtcHNmZDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NTYKKy0gbXBzaWQ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTU3CistIG1wc2lkOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU1OAorLSBtcHNuZDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NTkKKy0gbXBzbmQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTYwCistIG1wc29udCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU2MQorLSBtcHNyZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NjIKKy0gbXBzdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTYzCistIG1wc3hiciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU2NAorLSBtcHN4cmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NjUKKy0gbXB0YWRqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTY2CistIG1wdGFmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU2NworLSBtcHRiYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NjgKKy0gbXB0ZGVvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTY5CistIG1wdGRpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU3MAorLSBtcHRkaW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NzEKKy0gbXB0ZG54ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTcyCistIG1wdGRueGQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU3MworLSBtcHRkb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NzQKKy0gbXB0ZHhvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTc1CistIG1wdGViciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU3NgorLSBtcHRlY3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NzcKKy0gbXB0ZW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTc4CistIG1wdGVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU3OQorLSBtcHRlcGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1ODAKKy0gbXB0ZXNwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTgxCistIG1wdGZrZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU4MgorLSBtcHRwcGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1ODMKKy0gbXB0cHBjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTg0CistIG1wdHBwcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU4NQorLSBtcHR0cGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1ODYKKy0gbXB0dHBjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTg3CistIG1wdHRweiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU4OAorLSBtcHR2c3kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1ODkKKy0gbXB0eGJyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTkwCistIG1wdHhjcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU5MQorLSBtcHR4bXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1OTIKKy0gbXB0eG5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTkzCistIG1wdHhwYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU5NAorLSBtcHR4c3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1OTUKKy0gbXBwY3ByICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTk2CistIGZ0bl9zZXRfbGlicmFyeV9nYW5nICAgICAgICAgICAgICAgICAgICAgIDczNgorLSBrbXBfc2V0X2xpYnJhcnlfZ2FuZworLSBrbXBfc2hhcmFibGVfY2FsbG9jICAgICAgICAgICAgICAgICAgICAgICA3NjAKKy0ga21wX3NoYXJhYmxlX2ZyZWUgICAgICAgICAgICAgICAgICAgICAgICAgNzYxCistIGttcF9zaGFyYWJsZV9tYWxsb2MgICAgICAgICAgICAgICAgICAgICAgIDc2MgorLSBrbXBfc2hhcmFibGVfcmVhbGxvYyAgICAgICAgICAgICAgICAgICAgICA3NjMKKy0ga21wX2FsaWduZWRfc2hhcmFibGVfbWFsbG9jICAgICAgICAgICAgICAgNzY0CistIGttcF9kZWZlcnJlZF9hdG9taWNfYWRkX2k0ICAgICAgICAgICAgICAgIDc2NQorLSBrbXBfZGVmZXJyZWRfYXRvbWljX2FkZF9pOCAgICAgICAgICAgICAgICA3NjYKKy0ga21wX2RlZmVycmVkX2F0b21pY19hZGRfcjQgICAgICAgICAgICAgICAgNzY3CistIGttcF9kZWZlcnJlZF9hdG9taWNfYWRkX3I4ICAgICAgICAgICAgICAgIDc2OAorLSBrbXBfbG9ja19jb25kX3dhaXQgICAgICAgICAgICAgICAgICAgICAgICA3NzAKKy0ga21wX2xvY2tfY29uZF9zaWduYWwgICAgICAgICAgICAgICAgICAgICAgNzcxCistIGttcF9sb2NrX2NvbmRfYnJvYWRjYXN0ICAgICAgICAgICAgICAgICAgIDc3MgorLSBrbXBfbmVzdF9sb2NrX2NvbmRfd2FpdCAgICAgICAgICAgICAgICAgICA3NzMKKy0ga21wX25lc3RfbG9ja19jb25kX3NpZ25hbCAgICAgICAgICAgICAgICAgNzc0CistIGttcF9uZXN0X2xvY2tfY29uZF9icm9hZGNhc3QgICAgICAgICAgICAgIDc3NQorLSBrbXBfZ2V0X3Byb2Nlc3NfbnVtICAgICAgICAgICAgICAgICAgICAgICA3ODEKKy0ga21wX2dldF9udW1fcHJvY2Vzc2VzICAgICAgICAgICAgICAgICAgICAgNzgyCistIGttcF9nZXRfcHJvY2Vzc190aHJlYWRfbnVtICAgICAgICAgICAgICAgIDc4MworLSBrbXBfcHJpdmF0ZV9tbWFwICAgICAgICAgICAgICAgICAgICAgICAgICA3ODQgICAjIG5vdCBpbXBsZW1lbnRlZD8KKy0ga21wX3NoYXJhYmxlX21tYXAgICAgICAgICAgICAgICAgICAgICAgICAgNzg1ICAgIyBub3QgaW1wbGVtZW50ZWQ/CistIGttcF9wcml2YXRlX211bm1hcCAgICAgICAgICAgICAgICAgICAgICAgIDc4NiAgICMgbm90IGltcGxlbWVudGVkPworLSBrbXBfc2hhcmFibGVfbXVubWFwICAgICAgICAgICAgICAgICAgICAgICA3ODcgICAjIG5vdCBpbXBsZW1lbnRlZD8KKy0ga21wX2lzX3NoYXJhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgNzg4ICAgIyBub3QgaW1wbGVtZW50ZWQ/CisKKyVpZm5kZWYgc3R1YgorCisKKyAgICAjCisgICAgIyBUaGUgZm9sbG93aW5nIGVudHJ5IHBvaW50cyBhcmUgYWRkZWQgc28gdGhhdCB0aGUgYmFja3RyYWNlcyBmcm9tCisgICAgIyB0aGUgdG9vbHMgY29udGFpbiBtZWFuaW5nZnVsIG5hbWVzIGZvciBhbGwgdGhlIGZ1bmN0aW9ucyB0aGF0IG1pZ2h0CisgICAgIyBhcHBlYXIgaW4gYSBiYWNrdHJhY2Ugb2YgYSB0aHJlYWQgd2hpY2ggaXMgYmxvY2tlZCBpbiB0aGUgUlRMLgorICAgICMKKworICAgICMgUmVndWxhciBlbnRyeSBwb2ludHMKKyAgICAgICAgX19rbXBfd2FpdF95aWVsZF80CisgICAgICAgIF9fa21wX3dhaXRfeWllbGRfOAorICAgICAgICBfX2ttcF9mb3JrX2NhbGwKKyAgICAgICAgX19rbXBfaW52b2tlX21pY3JvdGFzaworICAgICAgICBfX2ttcF9sYXVuY2hfbW9uaXRvcgorICAgICAgICBfX2ttcF9sYXVuY2hfd29ya2VyCisgICAgICAgIF9fa21wX3JlYXBfbW9uaXRvcgorICAgICAgICBfX2ttcF9yZWFwX3dvcmtlcgorICAgICAgICBfX2ttcF9hY3F1aXJlX3Rhc19sb2NrCisgICAgICAgIF9fa21wX2FjcXVpcmVfbmVzdGVkX3Rhc19sb2NrCisgICAgICAgIF9fa21wX2FjcXVpcmVfdGlja2V0X2xvY2sKKyAgICAgICAgX19rbXBfYWNxdWlyZV9uZXN0ZWRfdGlja2V0X2xvY2sKKyAgICAgICAgX19rbXBfYWNxdWlyZV9xdWV1aW5nX2xvY2sKKyAgICAgICAgX19rbXBfYWNxdWlyZV9uZXN0ZWRfcXVldWluZ19sb2NrCisgICAgICAgIF9fa21wX2FjcXVpcmVfZHJkcGFfbG9jaworICAgICAgICBfX2ttcF9hY3F1aXJlX25lc3RlZF9kcmRwYV9sb2NrCisKKyAgICAlaWZkZWYgS01QX0RFQlVHCisgICAgICAgICMgYWxsb3dzIGNvbnNvbGUgb3V0cHV0IGNhcGFiaWxpdHkgZm9yIGFwcGxpY2F0aW9ucyB0aG9zZSBkb24ndCBoYXZlIGl0CisgICAgICAgIF9fa21wX3ByaW50ZgorICAgICVlbmRpZgorCisKKworICAgICAgICAjIFN5bWJvbHMgZm9yIE1TIG11dHVhbCBkZXRlY3Rpb246CisgICAgICAgIF9Zb3VfbXVzdF9saW5rX3dpdGhfZXhhY3RseV9vbmVfT3Blbk1QX2xpYnJhcnkgICAgREFUQQorICAgICAgICBfWW91X211c3RfbGlua193aXRoX0ludGVsX09wZW5NUF9saWJyYXJ5ICAgICAgICAgIERBVEEKKyAgICAgICAgJWlmZGVmIG1zdmNfY29tcGF0CisgICAgICAgICAgICBfWW91X211c3RfbGlua193aXRoX01pY3Jvc29mdF9PcGVuTVBfbGlicmFyeSAgREFUQQorICAgICAgICAlZW5kaWYKKworICAgICAgICBfX2ttcF93YWl0XzMyCisgICAgICAgIF9fa21wX3dhaXRfNjQKKyAgICAgICAgX19rbXBfd2FpdF9vbmNvcmUKKyAgICAgICAgX19rbXBfcmVsZWFzZV8zMgorICAgICAgICBfX2ttcF9yZWxlYXNlXzY0CisgICAgICAgIF9fa21wX3JlbGVhc2Vfb25jb3JlCisKKworIyAgICBWVF9nZXR0aGlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorIyAgICB2dGd0aGlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMgorCisgICAgX19rbXBjX2F0b21pY180ICAgICAgICAgICAgICAgICAgICAgICAgIDEwMAorICAgIF9fa21wY19hdG9taWNfOCAgICAgICAgICAgICAgICAgICAgICAgICAxMDEKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hZGQgICAgICAgICAgICAgICAgMTAyCisgICAgX19rbXBjX2F0b21pY19maXhlZDhfYWRkICAgICAgICAgICAgICAgIDEwMworICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X2FkZCAgICAgICAgICAgICAgICAxMDQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9hZGQgICAgICAgICAgICAgICAgMTA1CisgICAgX19rbXBjX2JhcnJpZXIgICAgICAgICAgICAgICAgICAgICAgICAgIDEwNgorICAgIF9fa21wY19iYXJyaWVyX21hc3RlciAgICAgICAgICAgICAgICAgICAxMDcKKyAgICBfX2ttcGNfYmFycmllcl9tYXN0ZXJfbm93YWl0ICAgICAgICAgICAgMTA4CisgICAgX19rbXBjX2JlZ2luICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMAorICAgIF9fa21wY19ib3VuZF9udW1fdGhyZWFkcyAgICAgICAgICAgICAgICAxMTEKKyAgICBfX2ttcGNfYm91bmRfdGhyZWFkX251bSAgICAgICAgICAgICAgICAgMTEyCisgICAgX19rbXBjX2NyaXRpY2FsICAgICAgICAgICAgICAgICAgICAgICAgIDExMworICAgIF9fa21wY19kaXNwYXRjaF9maW5pXzQgICAgICAgICAgICAgICAgICAxMTQKKyAgICBfX2ttcGNfZGlzcGF0Y2hfZmluaV84ICAgICAgICAgICAgICAgICAgMTE1CisgICAgX19rbXBjX2Rpc3BhdGNoX2luaXRfNCAgICAgICAgICAgICAgICAgIDExNgorICAgIF9fa21wY19kaXNwYXRjaF9pbml0XzggICAgICAgICAgICAgICAgICAxMTcKKyAgICBfX2ttcGNfZGlzcGF0Y2hfbmV4dF80ICAgICAgICAgICAgICAgICAgMTE4CisgICAgX19rbXBjX2Rpc3BhdGNoX25leHRfOCAgICAgICAgICAgICAgICAgIDExOQorICAgIF9fa21wY19lbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjAKKyAgICBfX2ttcGNfZW5kX2JhcnJpZXJfbWFzdGVyICAgICAgICAgICAgICAgMTIxCisgICAgX19rbXBjX2VuZF9jcml0aWNhbCAgICAgICAgICAgICAgICAgICAgIDEyMworICAgIF9fa21wY19lbmRfbWFzdGVyICAgICAgICAgICAgICAgICAgICAgICAxMjQKKyAgICBfX2ttcGNfZW5kX29yZGVyZWQgICAgICAgICAgICAgICAgICAgICAgMTI1CisgICAgX19rbXBjX2VuZF9zZXJpYWxpemVkX3BhcmFsbGVsICAgICAgICAgIDEyNgorICAgIF9fa21wY19lbmRfc2luZ2xlICAgICAgICAgICAgICAgICAgICAgICAxMjcKKyAgICBfX2ttcGNfZW5kX3Rhc2txICAgICAgICAgICAgICAgICAgICAgICAgMTI4CisgICAgX19rbXBjX2VuZF90YXNrcV90YXNrICAgICAgICAgICAgICAgICAgIDEyOQorICAgIF9fa21wY19mbHVzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMzAKKyAgICBfX2ttcGNfZm9yX3N0YXRpY19maW5pICAgICAgICAgICAgICAgICAgMTM1CisgICAgX19rbXBjX2Zvcl9zdGF0aWNfaW5pdF80ICAgICAgICAgICAgICAgIDEzNgorICAgIF9fa21wY19mb3Jfc3RhdGljX2luaXRfOCAgICAgICAgICAgICAgICAxMzcKKyAgICBfX2ttcGNfZm9ya19jYWxsICAgICAgICAgICAgICAgICAgICAgICAgMTM4CisgICAgX19rbXBjX2dsb2JhbF9udW1fdGhyZWFkcyAgICAgICAgICAgICAgIDE0MAorICAgIF9fa21wY19nbG9iYWxfdGhyZWFkX251bSAgICAgICAgICAgICAgICAxNDEKKyAgICBfX2ttcGNfaW5fcGFyYWxsZWwgICAgICAgICAgICAgICAgICAgICAgMTQyCisgICAgX19rbXBjX2ludm9rZV90YXNrX2Z1bmMgICAgICAgICAgICAgICAgIDE0MworICAgIF9fa21wY19tYXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAxNDQKKyAgICBfX2ttcGNfb2tfdG9fZm9yayAgICAgICAgICAgICAgICAgICAgICAgMTQ1CisgICAgX19rbXBjX29yZGVyZWQgICAgICAgICAgICAgICAgICAgICAgICAgIDE0NgorICAgIF9fa21wY19wb3BfbnVtX3RocmVhZHMgICAgICAgICAgICAgICAgICAxNDcKKyAgICBfX2ttcGNfcHVzaF9udW1fdGhyZWFkcyAgICAgICAgICAgICAgICAgMTQ4CisgICAgX19rbXBjX3NlcmlhbGl6ZWRfcGFyYWxsZWwgICAgICAgICAgICAgIDE1MAorICAgIF9fa21wY19zaW5nbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAxNTEKKyAgICBfX2ttcGNfdGFzayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTUyCisgICAgX19rbXBjX3Rhc2tfYnVmZmVyICAgICAgICAgICAgICAgICAgICAgIDE1MworICAgIF9fa21wY190YXNrcSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNTQKKyAgICBfX2ttcGNfdGFza3FfdGFzayAgICAgICAgICAgICAgICAgICAgICAgMTU1CisgICAgX19rbXBjX3RocmVhZHByaXZhdGUgICAgICAgICAgICAgICAgICAgIDE1NgorICAgIF9fa21wY190aHJlYWRwcml2YXRlX2NhY2hlZCAgICAgICAgICAgICAxNTcKKyAgICBfX2ttcGNfdGhyZWFkcHJpdmF0ZV9yZWdpc3RlciAgICAgICAgICAgMTU4CisgICAgX19rbXBjX3RocmVhZHByaXZhdGVfcmVnaXN0ZXJfdmVjICAgICAgIDE1OQorIyAgICBfX2ttcGNfc3NwX2JlZ2luICAgICAgICAgICAgICAgICAgICAgICAgMTYwCisjICAgIF9fa21wY19zc3BfZm9yayAgICAgICAgICAgICAgICAgICAgICAgICAxNjEKKyMgICAgX19rbXBjX3NzcF9lbmQgICAgICAgICAgICAgICAgICAgICAgICAgIDE2MgorIyAgICBfX2ttcGNfc3NwX3Bvc3RfNCAgICAgICAgICAgICAgICAgICAgICAgMTYzCisjICAgIF9fa21wY19zc3BfcG9zdF84ICAgICAgICAgICAgICAgICAgICAgICAxNjQKKyMgICAgX19rbXBjX3NzcF93YWl0XzQgICAgICAgICAgICAgICAgICAgICAgIDE2NQorIyAgICBfX2ttcGNfc3NwX3dhaXRfOCAgICAgICAgICAgICAgICAgICAgICAgMTY2CisjICAgIF9fa21wY19zc3BfZGlzdGFuY2VfNCAgICAgICAgICAgICAgICAgICAxNjcKKyMgICAgX19rbXBjX3NzcF9kaXN0YW5jZV84ICAgICAgICAgICAgICAgICAgIDE2OAorIyAgICBfX2ttcGNfaW5fc3NwICAgICAgICAgICAgICAgICAgICAgICAgICAgMTY5CisjICAgIF9fa21wY19zc3BfdGhyZWFkX251bSAgICAgICAgICAgICAgICAgICAxNzAKKyMgICAgX19rbXBjX3NzcF9udW1fdGhyZWFkcyAgICAgICAgICAgICAgICAgIDE3MQorICAgIF9fa21wY19jb3B5cHJpdmF0ZSAgICAgICAgICAgICAgICAgICAgICAxNzIKKyMgICAgX19rbXBjX3NzcF9nZXRfbWF4X3RocmVhZHMgICAgICAgICAgICAgIDE3MworIyAgICBfX2ttcGNfc3NwX3NldF9tYXhfdGhyZWFkcyAgICAgICAgICAgICAgMTc0CisgICAgX19rbXBjX2luaXRfbG9jayAgICAgICAgICAgICAgICAgICAgICAgIDE3NQorICAgIF9fa21wY19kZXN0cm95X2xvY2sgICAgICAgICAgICAgICAgICAgICAxNzYKKyAgICBfX2ttcGNfc2V0X2xvY2sgICAgICAgICAgICAgICAgICAgICAgICAgMTc3CisgICAgX19rbXBjX3Vuc2V0X2xvY2sgICAgICAgICAgICAgICAgICAgICAgIDE3OAorICAgIF9fa21wY190ZXN0X2xvY2sgICAgICAgICAgICAgICAgICAgICAgICAxNzkKKyAgICBfX2ttcGNfaW5pdF9uZXN0X2xvY2sgICAgICAgICAgICAgICAgICAgMTgwCisgICAgX19rbXBjX2Rlc3Ryb3lfbmVzdF9sb2NrICAgICAgICAgICAgICAgIDE4MQorICAgIF9fa21wY19zZXRfbmVzdF9sb2NrICAgICAgICAgICAgICAgICAgICAxODIKKyAgICBfX2ttcGNfdW5zZXRfbmVzdF9sb2NrICAgICAgICAgICAgICAgICAgMTgzCisgICAgX19rbXBjX3Rlc3RfbmVzdF9sb2NrICAgICAgICAgICAgICAgICAgIDE4NAorIyAgICBfX2ttcGNfc3NwX2luaXRfdGhyZWFkICAgICAgICAgICAgICAgICAgMTg1CisjICAgIF9fa21wY19zc3Bfc2V0X2V2ZW50ICAgICAgICAgICAgICAgICAgICAxODYKKyAgICBfX2ttcGNfcmVkdWNlX25vd2FpdCAgICAgICAgICAgICAgICAgICAgMTg3CisgICAgX19rbXBjX2VuZF9yZWR1Y2Vfbm93YWl0ICAgICAgICAgICAgICAgIDE4OAorICAgIF9fa21wY19yZWR1Y2UgICAgICAgICAgICAgICAgICAgICAgICAgICAxODkKKyAgICBfX2ttcGNfZW5kX3JlZHVjZSAgICAgICAgICAgICAgICAgICAgICAgMTkwCisKKyMgT3Blbk1QIDMuMAorCislaWZkZWYgT01QXzMwCisgICAgX19rbXBjX29tcF90YXNrX2FsbG9jICAgICAgICAgICAgICAgICAgIDE5MQorICAgIF9fa21wY19vbXBfdGFzayAgICAgICAgICAgICAgICAgICAgICAgICAxOTIKKyAgICBfX2ttcGNfb21wX3Rhc2t3YWl0ICAgICAgICAgICAgICAgICAgICAgMTkzCisgICAgX19rbXBjX29tcF90YXNrX2JlZ2luX2lmMCAgICAgICAgICAgICAgIDE5NgorICAgIF9fa21wY19vbXBfdGFza19jb21wbGV0ZV9pZjAgICAgICAgICAgICAxOTcKKyAgICBfX2ttcGNfb21wX3Rhc2tfcGFydHMgICAgICAgICAgICAgICAgICAgMTk4CislZW5kaWYgIyBPTVBfMzAKKworIyAgIF9fb21wX2NvbGxlY3Rvcl9hcGkgICAgICAgICAgICAgICAgICAxOTkKKworICAgICMgVGhlc2UgZnVuY3Rpb25zIGFyZSBmb3IgdGVzdGluZyBwdXJwb3Nlcy4gVGhlcmUgaXMgbm8gbmVlZCBpbiBzdGFibGUgb3JkaW5hbCBudW1iZXI6CisgICAgX19rbXBfZ2V0X3JlZHVjZV9tZXRob2QKKworJWVuZGlmICAjIG5vdCBkZWZpbmVkIHN0dWIKKwora21wY19jYWxsb2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDAKK2ttcGNfZnJlZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAxCislaWZuZGVmIHN0dWIKKyAgICAjIFRoZXNlIGZ1bmN0aW9ucyBhcmUgZXhwb3J0ZWQgZnJvbSBsaWJndWlkZSwgYnV0IGRlY2xhcmVkIG5laXRoZXIgaW4gb21wLmggbm90IGluIG9tcF9saWIuaC4KKyMgICAga21wY19nZXRfYmFubmVyICAgICAgICAgICAgICAgICAgICAgICAgIDIwMgorIyAgICBrbXBjX2dldF9wb29sbW9kZSAgICAgICAgICAgICAgICAgICAgICAgMjAzCisjICAgIGttcGNfZ2V0X3Bvb2xzaXplICAgICAgICAgICAgICAgICAgICAgICAyMDQKKyMgICAga21wY19nZXRfcG9vbHN0YXQgICAgICAgICAgICAgICAgICAgICAgIDIwNQorIyAgICBrbXBjX3Bvb2xwcmludCAgICAgICAgICAgICAgICAgICAgICAgICAgMjA3CisjICAgIGttcGNfcHJpbnRfYmFubmVyICAgICAgICAgICAgICAgICAgICAgICAyMDgKKyMgICAga21wY19zZXRfcG9vbG1vZGUgICAgICAgICAgICAgICAgICAgICAgIDIxNAorIyAgICBrbXBjX3NldF9wb29sc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgMjE1CislZW5kaWYKK2ttcGNfbWFsbG9jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjA2CitrbXBjX3JlYWxsb2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwOQora21wY19zZXRfYmxvY2t0aW1lICAgICAgICAgICAgICAgICAgICAgICAgICAyMTEKK2ttcGNfc2V0X2xpYnJhcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjEyCisjIGttcGNfc2V0X3BhcmFsbGVsX25hbWUgICAgICAgICAgICAgICAgICAgICAgMjEzCitrbXBjX3NldF9zdGFja3NpemUgICAgICAgICAgICAgICAgICAgICAgICAgIDIxNgora21wY19zZXRfc3RhY2tzaXplX3MgICAgICAgICAgICAgICAgICAgICAgICAyMjIKKyMga21wY19zZXRfc3RhdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMTcKK2ttcGNfc2V0X2RlZmF1bHRzICAgICAgICAgICAgICAgICAgICAgICAgICAgMjI0CisKKyMgT01QIDMuMCBlbnRyeSBwb2ludHMgZm9yIHVuc2lnbmVkIGxvb3AgaXRlcmF0aW9uIHZhcmlhYmxlcworJWlmbmRlZiBzdHViCisgICAgJWlmZGVmIE9NUF8zMAorICAgICAgICBfX2ttcGNfZm9yX3N0YXRpY19pbml0Xzh1ICAgICAgICAgICAyMjUKKyAgICAgICAgX19rbXBjX2Rpc3BhdGNoX2luaXRfOHUgICAgICAgICAgICAgMjI2CisgICAgICAgIF9fa21wY19kaXNwYXRjaF9uZXh0Xzh1ICAgICAgICAgICAgIDIyNworICAgICAgICBfX2ttcGNfZGlzcGF0Y2hfZmluaV84dSAgICAgICAgICAgICAyMjgKKyAgICAgICAgX19rbXBjX2Zvcl9zdGF0aWNfaW5pdF80dSAgICAgICAgICAgMjI5CisgICAgICAgIF9fa21wY19kaXNwYXRjaF9pbml0XzR1ICAgICAgICAgICAgIDIzMAorICAgICAgICBfX2ttcGNfZGlzcGF0Y2hfbmV4dF80dSAgICAgICAgICAgICAyMzEKKyAgICAgICAgX19rbXBjX2Rpc3BhdGNoX2ZpbmlfNHUgICAgICAgICAgICAgMjMyCisgICAgJWVuZGlmICMgT01QXzMwCislZW5kaWYKKworJWlmbmRlZiBzdHViCisgICAgX19rbXBjX2dldF90YXNraWQgICAgICAgICAgICAgICAgICAgICAgIDIzMworICAgIF9fa21wY19nZXRfcGFyZW50X3Rhc2tpZCAgICAgICAgICAgICAgICAyMzQKKyVlbmRpZgorCisjIE9wZW5NUCAzLjEgZW50cnkgcG9pbnRzCislaWZuZGVmIHN0dWIKKyAgICAlaWZkZWYgT01QXzMwCisgICAgICAgIF9fa21wY19vbXBfdGFza3lpZWxkICAgICAgICAgICAgICAgIDIzNQorICAgICVlbmRpZiAjIE9NUF8zMAorICAgIF9fa21wY19wbGFjZV90aHJlYWRzICAgICAgICAgICAgICAgICAgICAyMzYKKyVlbmRpZgorCisjIE9wZW5NUCA0LjAgZW50cnkgcG9pbnRzCislaWZuZGVmIHN0dWIKKyAgICAlaWZkZWYgT01QXzQwCisgICAgICAgIF9fa21wY19wdXNoX3Byb2NfYmluZCAgICAgICAgICAgICAgIDIzNworICAgICAgICBfX2ttcGNfdGFza2dyb3VwICAgICAgICAgICAgICAgICAgICAyMzgKKyAgICAgICAgX19rbXBjX2VuZF90YXNrZ3JvdXAgICAgICAgICAgICAgICAgMjM5CisgICAgICAgIF9fa21wY19wdXNoX251bV90ZWFtcyAgICAgICAgICAgICAgIDI0MAorICAgICAgICBfX2ttcGNfZm9ya190ZWFtcyAgICAgICAgICAgICAgICAgICAyNDEKKyAgICAgICAgX19rbXBjX29tcF90YXNrX3dpdGhfZGVwcyAgICAgICAgICAgMjQyCisgICAgICAgIF9fa21wY19vbXBfd2FpdF9kZXBzICAgICAgICAgICAgICAgIDI0MworICAgICAgICBfX2ttcGNfY2FuY2VsICAgICAgICAgICAgICAgICAgICAgICAyNDQKKyAgICAgICAgX19rbXBjX2NhbmNlbGxhdGlvbnBvaW50ICAgICAgICAgICAgMjQ1CisgICAgICAgIF9fa21wY19jYW5jZWxfYmFycmllciAgICAgICAgICAgICAgIDI0NgorICAgICAgICBfX2ttcGNfZGlzdF9mb3Jfc3RhdGljX2luaXRfNCAgICAgICAyNDcKKyAgICAgICAgX19rbXBjX2Rpc3RfZm9yX3N0YXRpY19pbml0XzR1ICAgICAgMjQ4CisgICAgICAgIF9fa21wY19kaXN0X2Zvcl9zdGF0aWNfaW5pdF84ICAgICAgIDI0OQorICAgICAgICBfX2ttcGNfZGlzdF9mb3Jfc3RhdGljX2luaXRfOHUgICAgICAyNTAKKyAgICAgICAgX19rbXBjX2Rpc3RfZGlzcGF0Y2hfaW5pdF80ICAgICAgICAgMjUxCisgICAgICAgIF9fa21wY19kaXN0X2Rpc3BhdGNoX2luaXRfNHUgICAgICAgIDI1MgorICAgICAgICBfX2ttcGNfZGlzdF9kaXNwYXRjaF9pbml0XzggICAgICAgICAyNTMKKyAgICAgICAgX19rbXBjX2Rpc3RfZGlzcGF0Y2hfaW5pdF84dSAgICAgICAgMjU0CisgICAgICAgIF9fa21wY190ZWFtX3N0YXRpY19pbml0XzQgICAgICAgICAgIDI1NQorICAgICAgICBfX2ttcGNfdGVhbV9zdGF0aWNfaW5pdF80dSAgICAgICAgICAyNTYKKyAgICAgICAgX19rbXBjX3RlYW1fc3RhdGljX2luaXRfOCAgICAgICAgICAgMjU3CisgICAgICAgIF9fa21wY190ZWFtX3N0YXRpY19pbml0Xzh1ICAgICAgICAgIDI1OAorICAgICVlbmRpZiAjIE9NUF80MAorJWVuZGlmCisKKyMgVXNlciBBUEkgZW50cnkgcG9pbnRzIHRoYXQgaGF2ZSBib3RoIGxvd2VyLSBhbmQgdXBwZXItIGNhc2UgdmVyc2lvbnMgZm9yIEZvcnRyYW4uCisjIE51bWJlciBmb3IgbG93ZXJjYXNlIHZlcnNpb24gaXMgaW5kaWNhdGVkLiAgTnVtYmVyIGZvciB1cHBlcmNhc2UgaXMgb2J0YWluZWQgYnkgYWRkaW5nIDEwMDAuCisjIFVzZXIgQVBJIGVudHJ5IHBvaW50cyBhcmUgZW50cnkgcG9pbnRzIHRoYXQgc3RhcnQgd2l0aCAna21wXycgb3IgJ29tcF8nLgorCitvbXBfZGVzdHJveV9sb2NrICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcwMAorb21wX2Rlc3Ryb3lfbmVzdF9sb2NrICAgICAgICAgICAgICAgICAgICAgICA3MDEKK29tcF9nZXRfZHluYW1pYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzAyCitvbXBfZ2V0X21heF90aHJlYWRzICAgICAgICAgICAgICAgICAgICAgICAgIDcwMworb21wX2dldF9uZXN0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MDQKK29tcF9nZXRfbnVtX3Byb2NzICAgICAgICAgICAgICAgICAgICAgICAgICAgNzA1CitvbXBfZ2V0X251bV90aHJlYWRzICAgICAgICAgICAgICAgICAgICAgICAgIDcwNgorb21wX2dldF90aHJlYWRfbnVtICAgICAgICAgICAgICAgICAgICAgICAgICA3MDcKK29tcF9nZXRfd3RpY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzA4CitvbXBfZ2V0X3d0aW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcwOQorb21wX2luX3BhcmFsbGVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MTAKK29tcF9pbml0X2xvY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzExCitvbXBfaW5pdF9uZXN0X2xvY2sgICAgICAgICAgICAgICAgICAgICAgICAgIDcxMgorb21wX3NldF9keW5hbWljICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MTMKK29tcF9zZXRfbG9jayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzE0CitvbXBfc2V0X25lc3RfbG9jayAgICAgICAgICAgICAgICAgICAgICAgICAgIDcxNQorb21wX3NldF9uZXN0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MTYKK29tcF9zZXRfbnVtX3RocmVhZHMgICAgICAgICAgICAgICAgICAgICAgICAgNzE3CitvbXBfdGVzdF9sb2NrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcxOAorb21wX3Rlc3RfbmVzdF9sb2NrICAgICAgICAgICAgICAgICAgICAgICAgICA3MTkKK29tcF91bnNldF9sb2NrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzIwCitvbXBfdW5zZXRfbmVzdF9sb2NrICAgICAgICAgICAgICAgICAgICAgICAgIDcyMQorCitvbXBjX3NldF9keW5hbWljICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcyMgorb21wY19zZXRfbmVzdGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MjMKK29tcGNfc2V0X251bV90aHJlYWRzICAgICAgICAgICAgICAgICAgICAgICAgNzI0CisKK2ttcF9jYWxsb2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzI1CitrbXBfZnJlZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcyNgora21wX2dldF9ibG9ja3RpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICA3MjcKK2ttcF9nZXRfbGlicmFyeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzI4CitrbXBfZ2V0X3N0YWNrc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgIDcyOQora21wX21hbGxvYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MzAKKyNrbXBfcHJpbnRfYmFubmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDczMQora21wX3JlYWxsb2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MzIKK2ttcF9zZXRfYmxvY2t0aW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgNzM0CitrbXBfc2V0X2xpYnJhcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDczNQora21wX3NldF9saWJyYXJ5X3NlcmlhbCAgICAgICAgICAgICAgICAgICAgICA3MzcKK2ttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0ICAgICAgICAgICAgICAgICAgNzM4CitrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZCAgICAgICAgICAgICAgICAgIDczOQorIyBrbXBfc2V0X3BhcmFsbGVsX25hbWUgICAgICAgICAgICAgICAgICAgICAgIDc0MAora21wX3NldF9zdGFja3NpemUgICAgICAgICAgICAgICAgICAgICAgICAgICA3NDEKKyMga21wX3NldF9zdGF0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3NDIKK2ttcF9nZXRfbnVtX2tub3duX3RocmVhZHMgICAgICAgICAgICAgICAgICAgNzQzCitrbXBfc2V0X3N0YWNrc2l6ZV9zICAgICAgICAgICAgICAgICAgICAgICAgIDc0NAora21wX2dldF9zdGFja3NpemVfcyAgICAgICAgICAgICAgICAgICAgICAgICA3NDUKK2ttcF9zZXRfZGVmYXVsdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzQ2CitrbXBfc2V0X3dhcm5pbmdzX29uICAgICAgICAgICAgICAgICAgICAgICAgIDc3OQora21wX3NldF93YXJuaW5nc19vZmYgICAgICAgICAgICAgICAgICAgICAgICA3ODAKKworJWlmZGVmIE9NUF8zMAorICAgIG9tcF9nZXRfYWN0aXZlX2xldmVsICAgICAgICAgICAgICAgICAgICA3ODkKKyAgICBvbXBfZ2V0X2xldmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgNzkwCisgICAgb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtICAgICAgICAgICAgIDc5MQorICAgIG9tcF9nZXRfdGVhbV9zaXplICAgICAgICAgICAgICAgICAgICAgICA3OTIKKyAgICBvbXBfZ2V0X3RocmVhZF9saW1pdCAgICAgICAgICAgICAgICAgICAgNzkzCisgICAgb21wX2dldF9tYXhfYWN0aXZlX2xldmVscyAgICAgICAgICAgICAgIDc5NAorICAgIG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMgICAgICAgICAgICAgICA3OTUKKyAgICBvbXBfZ2V0X3NjaGVkdWxlICAgICAgICAgICAgICAgICAgICAgICAgNzk2CisgICAgb21wX3NldF9zY2hlZHVsZSAgICAgICAgICAgICAgICAgICAgICAgIDc5NworICAgIG9tcGNfc2V0X21heF9hY3RpdmVfbGV2ZWxzICAgICAgICAgICAgICA3OTgKKyAgICBvbXBjX3NldF9zY2hlZHVsZSAgICAgICAgICAgICAgICAgICAgICAgNzk5CisgICAgb21wY19nZXRfYW5jZXN0b3JfdGhyZWFkX251bSAgICAgICAgICAgIDgwMAorICAgIG9tcGNfZ2V0X3RlYW1fc2l6ZSAgICAgICAgICAgICAgICAgICAgICA4MDEKKyAgICBrbXBfc2V0X2FmZmluaXR5ICAgICAgICAgICAgICAgICAgICAgICAgODUwCisgICAga21wX2dldF9hZmZpbml0eSAgICAgICAgICAgICAgICAgICAgICAgIDg1MQorICAgIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MgICAgICAgICAgICAgICA4NTIKKyAgICBrbXBfY3JlYXRlX2FmZmluaXR5X21hc2sgICAgICAgICAgICAgICAgODUzCisgICAga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzayAgICAgICAgICAgICAgIDg1NAorICAgIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jICAgICAgICAgICAgICA4NTUKKyAgICBrbXBjX3NldF9hZmZpbml0eV9tYXNrX3Byb2MgICAgICAgICAgICAgODU2CisgICAga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYyAgICAgICAgICAgIDg1NworICAgIGttcGNfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jICAgICAgICAgICA4NTgKKyAgICBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYyAgICAgICAgICAgICAgODU5CisgICAga21wY19nZXRfYWZmaW5pdHlfbWFza19wcm9jICAgICAgICAgICAgIDg2MAorJWVuZGlmICMgT01QXzMwCisKKyMgT3Blbk1QIDMuMQorCislaWZkZWYgT01QXzMwCisgICAgb21wX2luX2ZpbmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg2MQorJWVuZGlmICMgT01QXzMwCisKKyMgT3Blbk1QIDQwCisKKyVpZmRlZiBPTVBfNDAKKyAgICBvbXBfZ2V0X3Byb2NfYmluZCAgICAgICAgICAgICAgICAgICAgICAgODYyCisgICAjb21wX3NldF9wcm9jX2JpbmQgICAgICAgICAgICAgICAgICAgICAgIDg2MworICAgI29tcF9jdXJyX3Byb2NfYmluZCAgICAgICAgICAgICAgICAgICAgICA4NjQKKyAgICBvbXBfZ2V0X251bV90ZWFtcyAgICAgICAgICAgICAgICAgICAgICAgODY1CisgICAgb21wX2dldF90ZWFtX251bSAgICAgICAgICAgICAgICAgICAgICAgIDg2NgorICAgIG9tcF9nZXRfY2FuY2VsbGF0aW9uICAgICAgICAgICAgICAgICAgICA4NjcKKyAgICBrbXBfZ2V0X2NhbmNlbGxhdGlvbl9zdGF0dXMgICAgICAgICAgICAgODY4CislZW5kaWYgIyBPTVBfNDAKKworJWlmbmRlZiBzdHViCisgICAgIyBPcmRpbmFscyBiZXR3ZWVuIDkwMCBhbmQgOTk5IGFyZSByZXNlcnZlZAorCisgICAgIyBPcmRpbmFscyBiZXR3ZWVuIDEwMDAgYW5kIDE5OTkgYXJlIHJlc2VydmVkCisgICAgIyBmb3IgdXNlci1jYWxsYWJsZSB1cHBlcmNhc2UgRm9ydHJhbiBlbnRyaWVzLgorCisKKyAgICAjIEFUT01JQyBlbnRyaWVzCisKKyAgICAlaWZkZWYgSEFWRV9RVUFECisgICAgX19rbXBjX2F0b21pY19jbXBseDE2X2RpdiAgICAgICAgICAgICAgMjAwMAorICAgICVlbmRpZgorCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfYWRkICAgICAgICAgICAgICAgMjAwMQorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2FuZGIgICAgICAgICAgICAgIDIwMDIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9kaXYgICAgICAgICAgICAgICAyMDAzCisgICAgX19rbXBjX2F0b21pY19maXhlZDF1X2RpdiAgICAgICAgICAgICAgMjAwNAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX211bCAgICAgICAgICAgICAgIDIwMDUKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9vcmIgICAgICAgICAgICAgICAyMDA2CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfc2hsICAgICAgICAgICAgICAgMjAwNworICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3NociAgICAgICAgICAgICAgIDIwMDgKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfc2hyICAgICAgICAgICAgICAyMDA5CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfc3ViICAgICAgICAgICAgICAgMjAxMAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3hvciAgICAgICAgICAgICAgIDIwMTEKKworICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2FkZCAgICAgICAgICAgICAgIDIwMTIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hbmRiICAgICAgICAgICAgICAyMDEzCisgICAgX19rbXBjX2F0b21pY19maXhlZDJfZGl2ICAgICAgICAgICAgICAgMjAxNAorICAgIF9fa21wY19hdG9taWNfZml4ZWQydV9kaXYgICAgICAgICAgICAgIDIwMTUKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9tdWwgICAgICAgICAgICAgICAyMDE2CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfb3JiICAgICAgICAgICAgICAgMjAxNworICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3NobCAgICAgICAgICAgICAgIDIwMTgKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaHIgICAgICAgICAgICAgICAyMDE5CisgICAgX19rbXBjX2F0b21pY19maXhlZDJ1X3NociAgICAgICAgICAgICAgMjAyMAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3N1YiAgICAgICAgICAgICAgIDIwMjEKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl94b3IgICAgICAgICAgICAgICAyMDIyCisKKyAgICNfX2ttcGNfYXRvbWljX2ZpeGVkNF9hZGQgICAgICAgICAgICMgZGVjbGFyZWQgYWJvdmUgIzEwMgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3N1YiAgICAgICAgICAgICAgIDIwMjQKKyAgICNfX2ttcGNfYXRvbWljX2Zsb2F0NF9hZGQgICAgICAgICAgICMgZGVjbGFyZWQgYWJvdmUgIzEwNAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X3N1YiAgICAgICAgICAgICAgIDIwMjYKKyAgICNfX2ttcGNfYXRvbWljX2ZpeGVkOF9hZGQgICAgICAgICAgICMgZGVjbGFyZWQgYWJvdmUgIzEwMworICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3N1YiAgICAgICAgICAgICAgIDIwMjgKKyAgICNfX2ttcGNfYXRvbWljX2Zsb2F0OF9hZGQgICAgICAgICAgICMgZGVjbGFyZWQgYWJvdmUgIzEwNQorICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X3N1YiAgICAgICAgICAgICAgIDIwMzAKKworICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2FuZGIgICAgICAgICAgICAgIDIwMzEKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9kaXYgICAgICAgICAgICAgICAyMDMyCisgICAgX19rbXBjX2F0b21pY19maXhlZDR1X2RpdiAgICAgICAgICAgICAgMjAzMworICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X211bCAgICAgICAgICAgICAgIDIwMzQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9vcmIgICAgICAgICAgICAgICAyMDM1CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfc2hsICAgICAgICAgICAgICAgMjAzNgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3NociAgICAgICAgICAgICAgIDIwMzcKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfc2hyICAgICAgICAgICAgICAyMDM4CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfeG9yICAgICAgICAgICAgICAgMjAzOQorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2FuZGIgICAgICAgICAgICAgIDIwNDAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9kaXYgICAgICAgICAgICAgICAyMDQxCisgICAgX19rbXBjX2F0b21pY19maXhlZDh1X2RpdiAgICAgICAgICAgICAgMjA0MgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X211bCAgICAgICAgICAgICAgIDIwNDMKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9vcmIgICAgICAgICAgICAgICAyMDQ0CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfc2hsICAgICAgICAgICAgICAgMjA0NQorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3NociAgICAgICAgICAgICAgIDIwNDYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfc2hyICAgICAgICAgICAgICAyMDQ3CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfeG9yICAgICAgICAgICAgICAgMjA0OAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X2RpdiAgICAgICAgICAgICAgIDIwNDkKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9tdWwgICAgICAgICAgICAgICAyMDUwCisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfZGl2ICAgICAgICAgICAgICAgMjA1MQorICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X211bCAgICAgICAgICAgICAgIDIwNTIKKworICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2FuZGwgICAgICAgICAgICAgIDIwNTMKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9vcmwgICAgICAgICAgICAgICAyMDU0CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfYW5kbCAgICAgICAgICAgICAgMjA1NQorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX29ybCAgICAgICAgICAgICAgIDIwNTYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hbmRsICAgICAgICAgICAgICAyMDU3CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfb3JsICAgICAgICAgICAgICAgMjA1OAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2FuZGwgICAgICAgICAgICAgIDIwNTkKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9vcmwgICAgICAgICAgICAgICAyMDYwCisKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9tYXggICAgICAgICAgICAgICAyMDYxCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfbWluICAgICAgICAgICAgICAgMjA2MgorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX21heCAgICAgICAgICAgICAgIDIwNjMKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9taW4gICAgICAgICAgICAgICAyMDY0CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfbWF4ICAgICAgICAgICAgICAgMjA2NQorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X21pbiAgICAgICAgICAgICAgIDIwNjYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9tYXggICAgICAgICAgICAgICAyMDY3CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfbWluICAgICAgICAgICAgICAgMjA2OAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X21heCAgICAgICAgICAgICAgIDIwNjkKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9taW4gICAgICAgICAgICAgICAyMDcwCisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfbWF4ICAgICAgICAgICAgICAgMjA3MQorICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X21pbiAgICAgICAgICAgICAgIDIwNzIKKworICAgIF9fa21wY19hdG9taWNfZml4ZWQxX25lcXYgICAgICAgICAgICAgIDIwNzMKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9uZXF2ICAgICAgICAgICAgICAyMDc0CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfbmVxdiAgICAgICAgICAgICAgMjA3NQorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X25lcXYgICAgICAgICAgICAgIDIwNzYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9lcXYgICAgICAgICAgICAgICAyMDc3CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfZXF2ICAgICAgICAgICAgICAgMjA3OAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2VxdiAgICAgICAgICAgICAgIDIwNzkKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9lcXYgICAgICAgICAgICAgICAyMDgwCisKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfYWRkICAgICAgICAgICAgICAyMDgxCisgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX3N1YiAgICAgICAgICAgICAgMjA4MgorICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9tdWwgICAgICAgICAgICAgIDIwODMKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfZGl2ICAgICAgICAgICAgICAyMDg0CisKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9hZGQgICAgICAgICAgICAgICAyMDg1CisgICAgX19rbXBjX2F0b21pY19jbXBseDRfc3ViICAgICAgICAgICAgICAgMjA4NgorICAgIF9fa21wY19hdG9taWNfY21wbHg0X211bCAgICAgICAgICAgICAgIDIwODcKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9kaXYgICAgICAgICAgICAgICAyMDg4CisgICAgX19rbXBjX2F0b21pY19jbXBseDhfYWRkICAgICAgICAgICAgICAgMjA4OQorICAgIF9fa21wY19hdG9taWNfY21wbHg4X3N1YiAgICAgICAgICAgICAgIDIwOTAKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4OF9tdWwgICAgICAgICAgICAgICAyMDkxCisgICAgX19rbXBjX2F0b21pY19jbXBseDhfZGl2ICAgICAgICAgICAgICAgMjA5MgorICAgIF9fa21wY19hdG9taWNfY21wbHgxMF9hZGQgICAgICAgICAgICAgIDIwOTMKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTBfc3ViICAgICAgICAgICAgICAyMDk0CisgICAgX19rbXBjX2F0b21pY19jbXBseDEwX211bCAgICAgICAgICAgICAgMjA5NQorICAgIF9fa21wY19hdG9taWNfY21wbHgxMF9kaXYgICAgICAgICAgICAgIDIwOTYKKyAgICAlaWZkZWYgSEFWRV9RVUFECisgICAgX19rbXBjX2F0b21pY19jbXBseDE2X2FkZCAgICAgICAgICAgICAgMjA5NworICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9zdWIgICAgICAgICAgICAgIDIwOTgKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfbXVsICAgICAgICAgICAgICAyMDk5CisgICAjX19rbXBjX2F0b21pY19jbXBseDE2X2RpdiAgICAgICAgICAgICAgMjAwMCAjIG1vdmVkIHVwIGJlY2F1c2Ugb2YgbWlzdGFrZSBpbiBudW1iZXIgKHN1cHBvc2VkIHRvIGJlIDIxMDApCisKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfYWRkICAgICAgICAgICAgICAyMTAxCisgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X3N1YiAgICAgICAgICAgICAgMjEwMgorICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9tdWwgICAgICAgICAgICAgIDIxMDMKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2ICAgICAgICAgICAgICAyMTA0CisgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X21heCAgICAgICAgICAgICAgMjEwNQorICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9taW4gICAgICAgICAgICAgIDIxMDYKKworICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2FkZF9mcCAgICAgICAgICAgIDIxMDcKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zdWJfZnAgICAgICAgICAgICAyMTA4CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfbXVsX2ZwICAgICAgICAgICAgMjEwOQorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2Rpdl9mcCAgICAgICAgICAgIDIxMTAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfZGl2X2ZwICAgICAgICAgICAyMTExCisKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hZGRfZnAgICAgICAgICAgICAyMTEyCisgICAgX19rbXBjX2F0b21pY19maXhlZDJfc3ViX2ZwICAgICAgICAgICAgMjExMworICAgIF9fa21wY19hdG9taWNfZml4ZWQyX211bF9mcCAgICAgICAgICAgIDIxMTQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9kaXZfZnAgICAgICAgICAgICAyMTE1CisgICAgX19rbXBjX2F0b21pY19maXhlZDJ1X2Rpdl9mcCAgICAgICAgICAgMjExNgorCisgICAgX19rbXBjX2F0b21pY19maXhlZDRfYWRkX2ZwICAgICAgICAgICAgMjExNworICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3N1Yl9mcCAgICAgICAgICAgIDIxMTgKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9tdWxfZnAgICAgICAgICAgICAyMTE5CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfZGl2X2ZwICAgICAgICAgICAgMjEyMAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0dV9kaXZfZnAgICAgICAgICAgIDIxMjEKKworICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2FkZF9mcCAgICAgICAgICAgIDIxMjIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zdWJfZnAgICAgICAgICAgICAyMTIzCisgICAgX19rbXBjX2F0b21pY19maXhlZDhfbXVsX2ZwICAgICAgICAgICAgMjEyNAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2Rpdl9mcCAgICAgICAgICAgIDIxMjUKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfZGl2X2ZwICAgICAgICAgICAyMTI2CisKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9hZGRfZnAgICAgICAgICAgICAyMTI3CisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfc3ViX2ZwICAgICAgICAgICAgMjEyOAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X211bF9mcCAgICAgICAgICAgIDIxMjkKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9kaXZfZnAgICAgICAgICAgICAyMTMwCisKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9hZGRfZnAgICAgICAgICAgICAyMTMxCisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfc3ViX2ZwICAgICAgICAgICAgMjEzMgorICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X211bF9mcCAgICAgICAgICAgIDIxMzMKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9kaXZfZnAgICAgICAgICAgICAyMTM0CisKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfYWRkX2ZwICAgICAgICAgICAyMTM1CisgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX3N1Yl9mcCAgICAgICAgICAgMjEzNgorICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9tdWxfZnAgICAgICAgICAgIDIxMzcKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfZGl2X2ZwICAgICAgICAgICAyMTM4CisgICAgJWVuZGlmCisKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9tdWxfZmxvYXQ4ICAgICAgICAyMTY5CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfZGl2X2Zsb2F0OCAgICAgICAgMjE3MAorCisgICAgX19rbXBjX2F0b21pY19maXhlZDJfbXVsX2Zsb2F0OCAgICAgICAgMjE3NAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2Rpdl9mbG9hdDggICAgICAgIDIxNzUKKworICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X211bF9mbG9hdDggICAgICAgIDIxNzkKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9kaXZfZmxvYXQ4ICAgICAgICAyMTgwCisKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9tdWxfZmxvYXQ4ICAgICAgICAyMTg0CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfZGl2X2Zsb2F0OCAgICAgICAgMjE4NQorCisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfYWRkX2Zsb2F0OCAgICAgICAgMjE4NworICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X3N1Yl9mbG9hdDggICAgICAgIDIxODgKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9tdWxfZmxvYXQ4ICAgICAgICAyMTg5CisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfZGl2X2Zsb2F0OCAgICAgICAgMjE5MAorCisgICAgX19rbXBjX2F0b21pY19jbXBseDRfYWRkX2NtcGx4OCAgICAgICAgMjIzMQorICAgIF9fa21wY19hdG9taWNfY21wbHg0X3N1Yl9jbXBseDggICAgICAgIDIyMzIKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9tdWxfY21wbHg4ICAgICAgICAyMjMzCisgICAgX19rbXBjX2F0b21pY19jbXBseDRfZGl2X2NtcGx4OCAgICAgICAgMjIzNAorCisgICAgX19rbXBjX2F0b21pY18xICAgICAgICAgICAgICAgICAgICAgICAgMjI0NworICAgIF9fa21wY19hdG9taWNfMiAgICAgICAgICAgICAgICAgICAgICAgIDIyNDgKKyAgICNfX2ttcGNfYXRvbWljXzQgICAgICAgICAgICAgICAgICAgICMgZGVjbGFyZWQgYWJvdmUgIzEwMAorICAgI19fa21wY19hdG9taWNfOCAgICAgICAgICAgICAgICAgICAgIyBkZWNsYXJlZCBhYm92ZSAjMTAxCisgICAgX19rbXBjX2F0b21pY18xMCAgICAgICAgICAgICAgICAgICAgICAgMjI1MQorICAgIF9fa21wY19hdG9taWNfMTYgICAgICAgICAgICAgICAgICAgICAgIDIyNTIKKyAgICBfX2ttcGNfYXRvbWljXzIwICAgICAgICAgICAgICAgICAgICAgICAyMjUzCisgICAgX19rbXBjX2F0b21pY18zMiAgICAgICAgICAgICAgICAgICAgICAgMjI1NAorCisgICAgJWlmZGVmIGFyY2hfMzIKKworICAgICAgICAlaWZkZWYgSEFWRV9RVUFECisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9hZGRfYTE2ICAgICAgMjI1NQorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3ViX2ExNiAgICAgIDIyNTYKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X211bF9hMTYgICAgICAyMjU3CisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9kaXZfYTE2ICAgICAgMjI1OAorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbWF4X2ExNiAgICAgIDIyNTkKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X21pbl9hMTYgICAgICAyMjYwCisKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDE2X2FkZF9hMTYgICAgICAyMjYxCisgICAgICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9zdWJfYTE2ICAgICAgMjI2MgorICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfbXVsX2ExNiAgICAgIDIyNjMKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDE2X2Rpdl9hMTYgICAgICAyMjY0CisgICAgICAgICVlbmRpZgorCisgICAgJWVuZGlmCisKKyAgICAlaWZuZGVmIGFyY2hfNjQKKworICAgICAgICAjIEFUT01JQyBleHRlbnNpb25zIGZvciBPcGVuTVAgMy4xIHNwZWMgKHg4NiBhbmQgeDY0IG9ubHkpCisKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfcmQgICAgICAgICAgICAgICAgMjI2NQorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9yZCAgICAgICAgICAgICAgICAyMjY2CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3JkICAgICAgICAgICAgICAgIDIyNjcKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDhfcmQgICAgICAgICAgICAgICAgMjI2OAorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9yZCAgICAgICAgICAgICAgICAyMjY5CisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X3JkICAgICAgICAgICAgICAgIDIyNzAKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX3JkICAgICAgICAgICAgICAgMjI3MQorICAgICAgICAlaWZkZWYgSEFWRV9RVUFECisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9yZCAgICAgICAgICAgICAgIDIyNzIKKyAgICAgICAgJWVuZGlmCisgICAgICAgIF9fa21wY19hdG9taWNfY21wbHg0X3JkICAgICAgICAgICAgICAgIDIyNzMKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDhfcmQgICAgICAgICAgICAgICAgMjI3NAorICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTBfcmQgICAgICAgICAgICAgICAyMjc1CisgICAgICAgICVpZmRlZiBIQVZFX1FVQUQKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDE2X3JkICAgICAgICAgICAgICAgMjI3NgorICAgICAgICAgICAgJWlmZGVmIGFyY2hfMzIKKyAgICAgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfYTE2X3JkICAgICAgIDIyNzcKKyAgICAgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfYTE2X3JkICAgICAgIDIyNzgKKyAgICAgICAgICAgICVlbmRpZgorICAgICAgICAlZW5kaWYKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfd3IgICAgICAgICAgICAgICAgMjI3OQorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl93ciAgICAgICAgICAgICAgICAyMjgwCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3dyICAgICAgICAgICAgICAgIDIyODEKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDhfd3IgICAgICAgICAgICAgICAgMjI4MgorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF93ciAgICAgICAgICAgICAgICAyMjgzCisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X3dyICAgICAgICAgICAgICAgIDIyODQKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX3dyICAgICAgICAgICAgICAgMjI4NQorICAgICAgICAlaWZkZWYgSEFWRV9RVUFECisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl93ciAgICAgICAgICAgICAgIDIyODYKKyAgICAgICAgJWVuZGlmCisgICAgICAgIF9fa21wY19hdG9taWNfY21wbHg0X3dyICAgICAgICAgICAgICAgIDIyODcKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDhfd3IgICAgICAgICAgICAgICAgMjI4OAorICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTBfd3IgICAgICAgICAgICAgICAyMjg5CisgICAgICAgICVpZmRlZiBIQVZFX1FVQUQKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDE2X3dyICAgICAgICAgICAgICAgMjI5MAorICAgICAgICAlaWZkZWYgYXJjaF8zMgorICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X2ExNl93ciAgICAgICAyMjkxCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfYTE2X3dyICAgICAgIDIyOTIKKyAgICAgICAgJWVuZGlmCisgICAgICAgICVlbmRpZgorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9hZGRfY3B0ICAgICAgICAgICAyMjkzCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2FuZGJfY3B0ICAgICAgICAgIDIyOTQKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfZGl2X2NwdCAgICAgICAgICAgMjI5NQorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfZGl2X2NwdCAgICAgICAgICAyMjk2CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX211bF9jcHQgICAgICAgICAgIDIyOTcKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfb3JiX2NwdCAgICAgICAgICAgMjI5OAorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zaGxfY3B0ICAgICAgICAgICAyMjk5CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3Nocl9jcHQgICAgICAgICAgIDIzMDAKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDF1X3Nocl9jcHQgICAgICAgICAgMjMwMQorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zdWJfY3B0ICAgICAgICAgICAyMzAyCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3hvcl9jcHQgICAgICAgICAgIDIzMDMKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJfYWRkX2NwdCAgICAgICAgICAgMjMwNAorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hbmRiX2NwdCAgICAgICAgICAyMzA1CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2Rpdl9jcHQgICAgICAgICAgIDIzMDYKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJ1X2Rpdl9jcHQgICAgICAgICAgMjMwNworICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9tdWxfY3B0ICAgICAgICAgICAyMzA4CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX29yYl9jcHQgICAgICAgICAgIDIzMDkKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJfc2hsX2NwdCAgICAgICAgICAgMjMxMAorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaHJfY3B0ICAgICAgICAgICAyMzExCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQydV9zaHJfY3B0ICAgICAgICAgIDIzMTIKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJfc3ViX2NwdCAgICAgICAgICAgMjMxMworICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl94b3JfY3B0ICAgICAgICAgICAyMzE0CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2FkZF9jcHQgICAgICAgICAgIDIzMTUKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDRfc3ViX2NwdCAgICAgICAgICAgMjMxNgorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9hZGRfY3B0ICAgICAgICAgICAyMzE3CisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X3N1Yl9jcHQgICAgICAgICAgIDIzMTgKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDhfYWRkX2NwdCAgICAgICAgICAgMjMxOQorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zdWJfY3B0ICAgICAgICAgICAyMzIwCisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X2FkZF9jcHQgICAgICAgICAgIDIzMjEKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDhfc3ViX2NwdCAgICAgICAgICAgMjMyMgorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hbmRiX2NwdCAgICAgICAgICAyMzIzCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2Rpdl9jcHQgICAgICAgICAgIDIzMjQKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDR1X2Rpdl9jcHQgICAgICAgICAgMjMyNQorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9tdWxfY3B0ICAgICAgICAgICAyMzI2CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X29yYl9jcHQgICAgICAgICAgIDIzMjcKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDRfc2hsX2NwdCAgICAgICAgICAgMjMyOAorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaHJfY3B0ICAgICAgICAgICAyMzI5CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0dV9zaHJfY3B0ICAgICAgICAgIDIzMzAKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDRfeG9yX2NwdCAgICAgICAgICAgMjMzMQorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9hbmRiX2NwdCAgICAgICAgICAyMzMyCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2Rpdl9jcHQgICAgICAgICAgIDIzMzMKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDh1X2Rpdl9jcHQgICAgICAgICAgMjMzNAorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9tdWxfY3B0ICAgICAgICAgICAyMzM1CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X29yYl9jcHQgICAgICAgICAgIDIzMzYKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDhfc2hsX2NwdCAgICAgICAgICAgMjMzNworICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zaHJfY3B0ICAgICAgICAgICAyMzM4CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4dV9zaHJfY3B0ICAgICAgICAgIDIzMzkKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDhfeG9yX2NwdCAgICAgICAgICAgMjM0MAorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9kaXZfY3B0ICAgICAgICAgICAyMzQxCisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X211bF9jcHQgICAgICAgICAgIDIzNDIKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDhfZGl2X2NwdCAgICAgICAgICAgMjM0MworICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9tdWxfY3B0ICAgICAgICAgICAyMzQ0CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2FuZGxfY3B0ICAgICAgICAgIDIzNDUKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfb3JsX2NwdCAgICAgICAgICAgMjM0NgorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hbmRsX2NwdCAgICAgICAgICAyMzQ3CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX29ybF9jcHQgICAgICAgICAgIDIzNDgKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDRfYW5kbF9jcHQgICAgICAgICAgMjM0OQorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9vcmxfY3B0ICAgICAgICAgICAyMzUwCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2FuZGxfY3B0ICAgICAgICAgIDIzNTEKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDhfb3JsX2NwdCAgICAgICAgICAgMjM1MgorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9tYXhfY3B0ICAgICAgICAgICAyMzUzCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX21pbl9jcHQgICAgICAgICAgIDIzNTQKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJfbWF4X2NwdCAgICAgICAgICAgMjM1NQorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9taW5fY3B0ICAgICAgICAgICAyMzU2CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X21heF9jcHQgICAgICAgICAgIDIzNTcKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDRfbWluX2NwdCAgICAgICAgICAgMjM1OAorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9tYXhfY3B0ICAgICAgICAgICAyMzU5CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X21pbl9jcHQgICAgICAgICAgIDIzNjAKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDRfbWF4X2NwdCAgICAgICAgICAgMjM2MQorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9taW5fY3B0ICAgICAgICAgICAyMzYyCisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X21heF9jcHQgICAgICAgICAgIDIzNjMKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDhfbWluX2NwdCAgICAgICAgICAgMjM2NAorICAgICAgICAlaWZkZWYgSEFWRV9RVUFECisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9tYXhfY3B0ICAgICAgICAgIDIzNjUKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X21pbl9jcHQgICAgICAgICAgMjM2NgorICAgICAgICAlZW5kaWYKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfbmVxdl9jcHQgICAgICAgICAgMjM2NworICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9uZXF2X2NwdCAgICAgICAgICAyMzY4CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X25lcXZfY3B0ICAgICAgICAgIDIzNjkKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDhfbmVxdl9jcHQgICAgICAgICAgMjM3MAorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9lcXZfY3B0ICAgICAgICAgICAyMzcxCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2Vxdl9jcHQgICAgICAgICAgIDIzNzIKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDRfZXF2X2NwdCAgICAgICAgICAgMjM3MworICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9lcXZfY3B0ICAgICAgICAgICAyMzc0CisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9hZGRfY3B0ICAgICAgICAgIDIzNzUKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX3N1Yl9jcHQgICAgICAgICAgMjM3NgorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfbXVsX2NwdCAgICAgICAgICAyMzc3CisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9kaXZfY3B0ICAgICAgICAgIDIzNzgKKyAgICAgICAgJWlmZGVmIEhBVkVfUVVBRAorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfYWRkX2NwdCAgICAgICAgICAyMzc5CisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9zdWJfY3B0ICAgICAgICAgIDIzODAKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X211bF9jcHQgICAgICAgICAgMjM4MQorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2X2NwdCAgICAgICAgICAyMzgyCisgICAgICAgICVlbmRpZgorICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9hZGRfY3B0ICAgICAgICAgICAyMzgzCisgICAgICAgIF9fa21wY19hdG9taWNfY21wbHg0X3N1Yl9jcHQgICAgICAgICAgIDIzODQKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDRfbXVsX2NwdCAgICAgICAgICAgMjM4NQorICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9kaXZfY3B0ICAgICAgICAgICAyMzg2CisgICAgICAgIF9fa21wY19hdG9taWNfY21wbHg4X2FkZF9jcHQgICAgICAgICAgIDIzODcKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDhfc3ViX2NwdCAgICAgICAgICAgMjM4OAorICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4OF9tdWxfY3B0ICAgICAgICAgICAyMzg5CisgICAgICAgIF9fa21wY19hdG9taWNfY21wbHg4X2Rpdl9jcHQgICAgICAgICAgIDIzOTAKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDEwX2FkZF9jcHQgICAgICAgICAgMjM5MQorICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTBfc3ViX2NwdCAgICAgICAgICAyMzkyCisgICAgICAgIF9fa21wY19hdG9taWNfY21wbHgxMF9tdWxfY3B0ICAgICAgICAgIDIzOTMKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDEwX2Rpdl9jcHQgICAgICAgICAgMjM5NAorICAgICAgICAlaWZkZWYgSEFWRV9RVUFECisgICAgICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9hZGRfY3B0ICAgICAgICAgIDIzOTUKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDE2X3N1Yl9jcHQgICAgICAgICAgMjM5NgorICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfbXVsX2NwdCAgICAgICAgICAyMzk3CisgICAgICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9kaXZfY3B0ICAgICAgICAgIDIzOTgKKyAgICAgICAgJWVuZGlmCisgICAgICAgI19fa21wY19hdG9taWNfY21wbHg0X2FkZF9jcHRfdG1wICAgICAgICAgICAgMjQwOQorCisgICAgICAgICVpZmRlZiBhcmNoXzMyCisgICAgICAgICVpZmRlZiBIQVZFX1FVQUQKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9hZGRfYTE2X2NwdCAgMjM5OQorICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X3N1Yl9hMTZfY3B0ICAyNDAwCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbXVsX2ExNl9jcHQgIDI0MDEKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9kaXZfYTE2X2NwdCAgMjQwMgorICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X21heF9hMTZfY3B0ICAyNDAzCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbWluX2ExNl9jcHQgIDI0MDQKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9hZGRfYTE2X2NwdCAgMjQwNQorICAgICAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDE2X3N1Yl9hMTZfY3B0ICAyNDA2CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfbXVsX2ExNl9jcHQgIDI0MDcKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9kaXZfYTE2X2NwdCAgMjQwOAorICAgICAgICAlZW5kaWYKKyAgICAgICAgJWVuZGlmCisKKyAgICAgICAgX19rbXBjX2F0b21pY19zdGFydCAgICAgICAgICAgICAgICAgICAgMjQxMAorICAgICAgICBfX2ttcGNfYXRvbWljX2VuZCAgICAgICAgICAgICAgICAgICAgICAyNDExCisKKyAgICAgICAgJWlmZGVmIE9NUF80MAorCisgICAgICAgICAgICAjIEFUT01JQyBleHRlbnNpb25zIGZvciBPcGVuTVAgNC4wIHNwZWMgKHg4NiBhbmQgeDY0IG9ubHkpCisKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3N3cCAgICAgICAgICAgMjQxMgorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJfc3dwICAgICAgICAgICAyNDEzCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zd3AgICAgICAgICAgIDI0MTQKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3N3cCAgICAgICAgICAgMjQxNQorICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDRfc3dwICAgICAgICAgICAyNDE2CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9zd3AgICAgICAgICAgIDI0MTcKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9zd3AgICAgICAgICAgMjQxOAorICAgICAgICAgICAgJWlmZGVmIEhBVkVfUVVBRAorICAgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3dwICAgICAgICAyNDE5CisgICAgICAgICAgICAlZW5kaWYKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfY21wbHg0X3N3cCAgICAgICAgICAgMjQyMAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDhfc3dwICAgICAgICAgICAyNDIxCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTBfc3dwICAgICAgICAgIDI0MjIKKyAgICAgICAgICAgICVpZmRlZiBIQVZFX1FVQUQKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9zd3AgICAgICAgICAgMjQyMworCisgICAgICAgICAgICAlaWZkZWYgYXJjaF8zMgorICAgICAgICAgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9hMTZfc3dwICAyNDI0CisgICAgICAgICAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDE2X2ExNl9zd3AgIDI0MjUKKyAgICAgICAgICAgICVlbmRpZgorICAgICAgICAgICAgJWVuZGlmCisKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3N1Yl9jcHRfcmV2ICAgMjQyNgorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfZGl2X2NwdF9yZXYgICAyNDI3CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfZGl2X2NwdF9yZXYgIDI0MjgKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3NobF9jcHRfcmV2ICAgMjQyOQorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfc2hyX2NwdF9yZXYgICAyNDMwCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfc2hyX2NwdF9yZXYgIDI0MzEKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3N1Yl9jcHRfcmV2ICAgMjQzMgorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJfZGl2X2NwdF9yZXYgICAyNDMzCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfZGl2X2NwdF9yZXYgIDI0MzQKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3NobF9jcHRfcmV2ICAgMjQzNQorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJfc2hyX2NwdF9yZXYgICAyNDM2CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfc2hyX2NwdF9yZXYgIDI0MzcKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3N1Yl9jcHRfcmV2ICAgMjQzOAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDRfZGl2X2NwdF9yZXYgICAyNDM5CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfZGl2X2NwdF9yZXYgIDI0NDAKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3NobF9jcHRfcmV2ICAgMjQ0MQorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDRfc2hyX2NwdF9yZXYgICAyNDQyCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfc2hyX2NwdF9yZXYgIDI0NDMKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3N1Yl9jcHRfcmV2ICAgMjQ0NAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDhfZGl2X2NwdF9yZXYgICAyNDQ1CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfZGl2X2NwdF9yZXYgIDI0NDYKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3NobF9jcHRfcmV2ICAgMjQ0NworICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDhfc2hyX2NwdF9yZXYgICAyNDQ4CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfc2hyX2NwdF9yZXYgIDI0NDkKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X3N1Yl9jcHRfcmV2ICAgMjQ1MAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDRfZGl2X2NwdF9yZXYgICAyNDUxCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9zdWJfY3B0X3JldiAgIDI0NTIKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X2Rpdl9jcHRfcmV2ICAgMjQ1MworICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX3N1Yl9jcHRfcmV2ICAyNDU0CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfZGl2X2NwdF9yZXYgIDI0NTUKKyAgICAgICAgICAgICVpZmRlZiBIQVZFX1FVQUQKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9zdWJfY3B0X3JldiAgMjQ1NgorICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X2Rpdl9jcHRfcmV2ICAyNDU3CisgICAgICAgICAgICAlZW5kaWYKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfY21wbHg0X3N1Yl9jcHRfcmV2ICAgMjQ1OAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDRfZGl2X2NwdF9yZXYgICAyNDU5CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4OF9zdWJfY3B0X3JldiAgIDI0NjAKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfY21wbHg4X2Rpdl9jcHRfcmV2ICAgMjQ2MQorICAgICAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDEwX3N1Yl9jcHRfcmV2ICAyNDYyCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTBfZGl2X2NwdF9yZXYgIDI0NjMKKyAgICAgICAgICAgICVpZmRlZiBIQVZFX1FVQUQKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9zdWJfY3B0X3JldiAgMjQ2NAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDE2X2Rpdl9jcHRfcmV2ICAyNDY1CisKKyAgICAgICAgICAgICVpZmRlZiBhcmNoXzMyCisgICAgICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X3N1Yl9hMTZfY3B0X3JldiAgMjQ2NgorICAgICAgICAgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9kaXZfYTE2X2NwdF9yZXYgIDI0NjcKKyAgICAgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfc3ViX2ExNl9jcHRfcmV2ICAyNDY4CisgICAgICAgICAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDE2X2Rpdl9hMTZfY3B0X3JldiAgMjQ2OQorICAgICAgICAgICAgJWVuZGlmCisgICAgICAgICAgICAlZW5kaWYKKworICAgICAgICAlZW5kaWYgICAjIE9NUF80MAorCisKKyAgICAlZW5kaWYgICAjIGFyY2hfNjQKKworJWVuZGlmCisKKyMgZW5kIG9mIGZpbGUgIwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMvZXhwb3J0c19zby50eHQgYi9maW5hbC9ydW50aW1lL3NyYy9leHBvcnRzX3NvLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjE2MDQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMvZXhwb3J0c19zby50eHQKQEAgLTAsMCArMSwxMTEgQEAKKyMgZXhwb3J0c19zby50eHQgIworCisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKKyMgVGhpcyBpcyB2ZXJzaW9uIHNjcmlwdCBmb3IgT01QIFJUTCBzaGFyZWQgbGlicmFyeSAobGliaW9tcDUqLnNvKQorCitWRVJTSU9OIHsKKworICAgIGdsb2JhbDogIyBFeHBvcnRlZCBzeW1ib2xzLgorCisgICAgICAgICMKKyAgICAgICAgIyAiTm9ybWFsIiBzeW1ib2xzLgorICAgICAgICAjCisgICAgICAgIG9tcF8qOyAgICAgIyBTdGFuZGFyZCBPcGVuTVAgZnVuY3Rpb25zLgorICAgICAgICBvbXBjXyo7ICAgICMgb21wLmggcmVuYW1lcyBzb21lIHN0YW5kYXJkIGZ1bmN0aW9ucyB0byBvbXBjXyouCisgICAgICAgIGttcF8qOyAgICAgIyBJbnRlbCBleHRlbnNpb25zLgorICAgICAgICBrbXBjXyo7ICAgICMgSW50ZWwgZXh0ZW5zaW9ucy4KKyAgICAgICAgX19rbXBjXyo7ICAjIEZ1bmN0aW9ucyBjYWxsZWQgYnkgY29tcGlsZXItZ2VuZXJhdGVkIGNvZGUuCisgICAgICAgIEdPTVBfKjsgICAgIyBHTlUgQyBjb21wYXRpYmlsaXR5IGZ1bmN0aW9ucy4KKworICAgICAgICBfWW91X211c3RfbGlua193aXRoXyo7ICAgICAjIE11dHVhbCBkZXRlY3Rpb24vTVMgY29tcGF0aWJpbGl0eSBzeW1ib2xzLgorCisKKworICAgICAgICAjCisgICAgICAgICMgSW50ZXJuYWwgZnVuY3Rpb25zIGV4cG9ydGVkIGZvciB0ZXN0aW5nIHB1cnBvc2VzLgorICAgICAgICAjCisgICAgICAgIF9fa21wX2dldF9yZWR1Y2VfbWV0aG9kOworICAgICAgICBfX19rbXBfYWxsb2NhdGU7CisgICAgICAgIF9fX2ttcF9mcmVlOworICAgICAgICBfX2ttcF90aHJlYWRfcG9vbDsKKyAgICAgICAgX19rbXBfdGhyZWFkX3Bvb2xfbnRoOworCisJX19rbXBfcmVzZXRfc3RhdHM7CisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgICMKKyAgICAgICAgIyBJVFQgc3VwcG9ydC4KKyAgICAgICAgIworICAgICAgICAjIFRoZSBmb2xsb3dpbmcgZW50cnkgcG9pbnRzIGFyZSBhZGRlZCBzbyB0aGF0IHRoZSBiYWNrdHJhY2VzIGZyb20KKyAgICAgICAgIyB0aGUgdG9vbHMgY29udGFpbiBtZWFuaW5nZnVsIG5hbWVzIGZvciBhbGwgdGhlIGZ1bmN0aW9ucyB0aGF0IG1pZ2h0CisgICAgICAgICMgYXBwZWFyIGluIGEgYmFja3RyYWNlIG9mIGEgdGhyZWFkIHdoaWNoIGlzIGJsb2NrZWQgaW4gdGhlIFJUTC4KKyAgICAgICAgX19rbXBfYWNxdWlyZV9kcmRwYV9sb2NrOworICAgICAgICBfX2ttcF9hY3F1aXJlX25lc3RlZF9kcmRwYV9sb2NrOworICAgICAgICBfX2ttcF9hY3F1aXJlX25lc3RlZF9xdWV1aW5nX2xvY2s7CisgICAgICAgIF9fa21wX2FjcXVpcmVfbmVzdGVkX3Rhc19sb2NrOworICAgICAgICBfX2ttcF9hY3F1aXJlX25lc3RlZF90aWNrZXRfbG9jazsKKyAgICAgICAgX19rbXBfYWNxdWlyZV9xdWV1aW5nX2xvY2s7CisgICAgICAgIF9fa21wX2FjcXVpcmVfdGFzX2xvY2s7CisgICAgICAgIF9fa21wX2FjcXVpcmVfdGlja2V0X2xvY2s7CisgICAgICAgIF9fa21wX2ZvcmtfY2FsbDsKKyAgICAgICAgX19rbXBfZ2V0X3JlZHVjZV9tZXRob2Q7CisgICAgICAgIF9fa21wX2ludm9rZV9taWNyb3Rhc2s7CisgICAgICAgIF9fa21wX2l0dF9maW5pX2l0dGxpYjsKKyAgICAgICAgX19rbXBfaXR0X2luaXRfaXR0bGliOworICAgICAgICBfX2ttcF9sYXVuY2hfbW9uaXRvcjsKKyAgICAgICAgX19rbXBfbGF1bmNoX3dvcmtlcjsKKyAgICAgICAgX19rbXBfcmVhcF9tb25pdG9yOworICAgICAgICBfX2ttcF9yZWFwX3dvcmtlcjsKKyAgICAgICAgX19rbXBfcmVsZWFzZV8zMjsKKyAgICAgICAgX19rbXBfcmVsZWFzZV82NDsKKyAgICAgICAgX19rbXBfcmVsZWFzZV9vbmNvcmU7CisgICAgICAgIF9fa21wX3dhaXRfMzI7CisgICAgICAgIF9fa21wX3dhaXRfNjQ7CisgICAgICAgIF9fa21wX3dhaXRfb25jb3JlOworICAgICAgICBfX2ttcF93YWl0X3lpZWxkXzQ7CisgICAgICAgIF9fa21wX3dhaXRfeWllbGRfODsKKworICAgICAgICAjIGl0dG5vdGlmeSBzeW1ib2xzIHRvIGJlIHVzZWQgYnkgZGVidWdnZXIKKyAgICAgICAgX19rbXBfaXR0X2ZpbmlfaXR0bGliOworICAgICAgICBfX2ttcF9pdHRfaW5pdF9pdHRsaWI7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgICAgbG9jYWw6ICMgTm9uLWV4cG9ydGVkIHN5bWJvbHMuCisKKyAgICAgICAgKjsgICAgICAgICAjIEFsbCBvdGhlciBzeW1ib2xzIGFyZSBub3QgZXhwb3J0ZWQuCisKK307ICMgVkVSU0lPTgorCisjIHNldHMgdXAgR0NDIE9NUF8gdmVyc2lvbiBkZXBlbmRlbmN5IGNoYWluCitPTVBfMS4wIHsKK307CitPTVBfMi4wIHsKK30gT01QXzEuMDsKK09NUF8zLjAgeworfSBPTVBfMi4wOworT01QXzMuMSB7Cit9IE9NUF8zLjA7CitPTVBfNC4wIHsKK30gT01QXzMuMTsKKworIyBzZXRzIHVwIEdDQyBHT01QXyB2ZXJzaW9uIGRlcGVuZGVuY3kgY2hhaW4KK0dPTVBfMS4wIHsKK307CitHT01QXzIuMCB7Cit9IEdPTVBfMS4wOworR09NUF8zLjAgeworfSBHT01QXzIuMDsKK0dPTVBfNC4wIHsKK30gR09NUF8zLjA7CisKKyMgZW5kIG9mIGZpbGUgIwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMvZXh0cmFjdEV4dGVybmFsLmNwcCBiL2ZpbmFsL3J1bnRpbWUvc3JjL2V4dHJhY3RFeHRlcm5hbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFmMDNhNAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2V4dHJhY3RFeHRlcm5hbC5jcHAKQEAgLTAsMCArMSw0OTkgQEAKKy8qCisgKiBleHRyYWN0RXh0ZXJuYWwuY3BwCisgKiAkUmV2aXNpb246IDQzMDg0ICQKKyAqICREYXRlOiAyMDE0LTA0LTE1IDA5OjE1OjE0IC0wNTAwIChUdWUsIDE1IEFwciAyMDE0KSAkCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxzdHJzdHJlYW0+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPG1hcD4KKworLyogR2l2ZW4gYSBzZXQgb2YgbiBvYmplY3QgZmlsZXMgaCAoJ2V4dGVybmFsJyBvYmplY3QgZmlsZXMpIGFuZCBhIHNldCBvZiBtCisgICBvYmplY3QgZmlsZXMgbyAoJ2ludGVybmFsJyBvYmplY3QgZmlsZXMpLAorICAgMS4gRGV0ZXJtaW5lcyByLCB0aGUgc3Vic2V0IG9mIGggdGhhdCBvIGRlcGVuZHMgb24sIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkKKyAgIDIuIFJlbW92ZXMgdGhlIGZpbGVzIGluIGggLSByIGZyb20gdGhlIGZpbGUgc3lzdGVtCisgICAzLiBGb3IgZWFjaCBleHRlcm5hbCBzeW1ib2wgZGVmaW5lZCBpbiBzb21lIGZpbGUgaW4gciwgcmVuYW1lIGl0IGluIHIgVSBvCisgICAgICBieSBwcmVmaXhpbmcgaXQgd2l0aCAiX19rbXBfZXh0ZXJuYWxfIgorICAgVXNhZ2U6CisgICBoaWRlLmV4ZSA8bj4gPGZpbGVuYW1lcyBmb3IgaD4gPGZpbGVuYW1lcyBmb3Igbz4KKworICAgVGh1cywgdGhlIHByZWZpeGVkIHN5bWJvbHMgYmVjb21lIGhpZGRlbiBpbiB0aGUgc2Vuc2UgdGhhdCB0aGV5IG5vdyBoYXZlIGEgc3BlY2lhbAorICAgcHJlZml4LgorKi8KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKwordm9pZCBzdG9wKGNoYXIqIGVycm9yTXNnKSB7CisgICAgcHJpbnRmKCIlc1xuIiwgZXJyb3JNc2cpOworICAgIGV4aXQoMSk7Cit9CisKKy8vIGFuIGVudHJ5IGluIHRoZSBzeW1ib2wgdGFibGUgb2YgYSAuT0JKIGZpbGUKK2NsYXNzIFN5bWJvbCB7CitwdWJsaWM6CisgICAgX19pbnQ2NCBuYW1lOworICAgIHVuc2lnbmVkIHZhbHVlOworICAgIHVuc2lnbmVkIHNob3J0IHNlY3Rpb25OdW0sIHR5cGU7CisgICAgY2hhciBzdG9yYWdlQ2xhc3MsIG5BdXg7Cit9OworCitjbGFzcyBfcnN0cmVhbSA6IHB1YmxpYyBpc3Ryc3RyZWFtIHsKK3ByaXZhdGU6CisgICAgY29uc3QgY2hhciAqYnVmOworcHJvdGVjdGVkOgorICAgIF9yc3RyZWFtKHBhaXI8Y29uc3QgY2hhciosIHN0cmVhbXNpemU+IHApOmlzdHJzdHJlYW0ocC5maXJzdCxwLnNlY29uZCksYnVmKHAuZmlyc3Qpe30KKyAgICB+X3JzdHJlYW0oKSB7CisJZGVsZXRlW11idWY7CisgICAgfQorfTsKKworLyogQSBzdHJlYW0gZW5jYXB1c2xhdGluZyB0aGUgY29udGVudCBvZiBhIGZpbGUgb3IgdGhlIGNvbnRlbnQgb2YgYSBzdHJpbmcsIG92ZXJyaWRpbmcgdGhlCisgICA+PiBvcGVyYXRvciB0byByZWFkIHZhcmlvdXMgaW50ZWdlciB0eXBlcyBpbiBiaW5hcnkgZm9ybSwgYXMgd2VsbCBhcyBhIHN5bWJvbCB0YWJsZQorICAgZW50cnkuCisqLworY2xhc3MgcnN0cmVhbSA6IHB1YmxpYyBfcnN0cmVhbSB7Citwcml2YXRlOgorICAgIHRlbXBsYXRlPGNsYXNzIFQ+CisgICAgaW5saW5lIHJzdHJlYW0mIGRvUmVhZChUICZ4KSB7CisJcmVhZCgoY2hhciopJngsIHNpemVvZihUKSk7CisJcmV0dXJuICp0aGlzOworICAgIH0KKyAgICBzdGF0aWMgcGFpcjxjb25zdCBjaGFyKiwgc3RyZWFtc2l6ZT4gZ2V0QnVmKGNvbnN0IGNoYXIgKmZpbGVOYW1lKSB7CisJaWZzdHJlYW0gcmF3KGZpbGVOYW1lLGlvczo6YmluYXJ5IHwgaW9zOjppbik7CisJaWYoIXJhdy5pc19vcGVuKCkpCisJICAgIHN0b3AoInJzdHJlYW0uZ2V0QnVmOiBFcnJvciBvcGVuaW5nIGZpbGUiKTsKKwlyYXcuc2Vla2coMCxpb3M6OmVuZCk7CisJc3RyZWFtcG9zIGZpbGVTaXplID0gcmF3LnRlbGxnKCk7CisJaWYoZmlsZVNpemUgPCAwKQorCSAgICBzdG9wKCJyc3RyZWFtLmdldEJ1ZjogRXJyb3IgcmVhZGluZyBmaWxlIik7CisJY2hhciAqYnVmID0gbmV3IGNoYXJbZmlsZVNpemVdOworCXJhdy5zZWVrZygwLGlvczo6YmVnKTsKKwlyYXcucmVhZChidWYsIGZpbGVTaXplKTsKKwlyZXR1cm4gcGFpcjxjb25zdCBjaGFyKiwgc3RyZWFtc2l6ZT4oYnVmLGZpbGVTaXplKTsKKyAgICB9CitwdWJsaWM6CisgICAgLy8gY29uc3RydWN0IGZyb20gYSBzdHJpbmcKKyAgICByc3RyZWFtKGNvbnN0IGNoYXIgKmJ1ZixzdHJlYW1zaXplIHNpemUpOl9yc3RyZWFtKHBhaXI8Y29uc3QgY2hhciosc3RyZWFtc2l6ZT4oYnVmLCBzaXplKSl7fQorICAgIC8qIGNvbnN0cnVjdCBmcm9tIGEgZmlsZSB3aG9sZSBjb250ZW50IGlzIGZ1bGx5IHJlYWQgb25jZSB0byBpbml0aWFsaXplIHRoZSBjb250ZW50IG9mCisgICAgICAgdGhpcyBzdHJlYW0KKyAgICAqLworICAgIHJzdHJlYW0oY29uc3QgY2hhciAqZmlsZU5hbWUpOl9yc3RyZWFtKGdldEJ1ZihmaWxlTmFtZSkpe30KKyAgICByc3RyZWFtJiBvcGVyYXRvcj4+KGludCAmeCkgeworCXJldHVybiBkb1JlYWQoeCk7CisgICAgfQorICAgIHJzdHJlYW0mIG9wZXJhdG9yPj4odW5zaWduZWQgJngpIHsKKwlyZXR1cm4gZG9SZWFkKHgpOworICAgIH0KKyAgICByc3RyZWFtJiBvcGVyYXRvcj4+KHNob3J0ICZ4KSB7CisJcmV0dXJuIGRvUmVhZCh4KTsKKyAgICB9CisgICAgcnN0cmVhbSYgb3BlcmF0b3I+Pih1bnNpZ25lZCBzaG9ydCAmeCkgeworCXJldHVybiBkb1JlYWQoeCk7CisgICAgfQorICAgIHJzdHJlYW0mIG9wZXJhdG9yPj4oU3ltYm9sICZlKSB7CisJcmVhZCgoY2hhciopJmUsIDE4KTsKKwlyZXR1cm4gKnRoaXM7CisgICAgfQorfTsKKworLy8gc3RyaW5nIHRhYmxlIGluIGEgLk9CSiBmaWxlCitjbGFzcyBTdHJpbmdUYWJsZSB7Citwcml2YXRlOgorICAgIG1hcDxzdHJpbmcsIHVuc2lnbmVkPiBkaXJlY3Rvcnk7CisgICAgc2l6ZV90IGxlbmd0aDsKKyAgICBjaGFyICpkYXRhOworCisgICAgLy8gbWFrZSA8ZGlyZWN0b3J5PiBmcm9tIDxsZW5ndGg+IGJ5dGVzIGluIDxkYXRhPgorICAgIHZvaWQgbWFrZURpcmVjdG9yeSh2b2lkKSB7CisJdW5zaWduZWQgaSA9IDQ7CisJd2hpbGUoaSA8IGxlbmd0aCkgeworCSAgICBzdHJpbmcgcyA9IHN0cmluZyhkYXRhICsgaSk7CisJICAgIGRpcmVjdG9yeS5pbnNlcnQobWFrZV9wYWlyKHMsIGkpKTsKKwkgICAgaSArPSBzLnNpemUoKSArIDE7CisJfQorICAgIH0KKyAgICAvLyBpbml0aWFsaXplIDxsZW5ndGg+IGFuZCA8ZGF0YT4gd2l0aCBjb250ZW50cyBzcGVjaWZpZWQgYnkgdGhlIGFyZ3VtZW50cworICAgIHZvaWQgaW5pdChjb25zdCBjaGFyICpfZGF0YSkgeworCXVuc2lnbmVkIF9sZW5ndGggPSAqKHVuc2lnbmVkKilfZGF0YTsKKworCWlmKF9sZW5ndGggPCBzaXplb2YodW5zaWduZWQpIHx8IF9sZW5ndGggIT0gKih1bnNpZ25lZCopX2RhdGEpCisJICAgIHN0b3AoIlN0cmluZ1RhYmxlLmluaXQ6IEludmFsaWQgc3ltYm9sIHRhYmxlIik7CisJaWYoX2RhdGFbX2xlbmd0aCAtIDFdKSB7CisJICAgIC8vIHRvIHByZXZlbnQgcnVuYXdheSBzdHJpbmdzLCBtYWtlIHN1cmUgdGhlIGRhdGEgZW5kcyB3aXRoIGEgemVybworCSAgICBkYXRhID0gbmV3IGNoYXJbbGVuZ3RoID0gX2xlbmd0aCArIDFdOworCSAgICBkYXRhW19sZW5ndGhdID0gMDsKKwl9IGVsc2UgeworCSAgICBkYXRhID0gbmV3IGNoYXJbbGVuZ3RoID0gX2xlbmd0aF07CisJfQorCSoodW5zaWduZWQqKWRhdGEgPSBsZW5ndGg7CisJbWVtY3B5KGRhdGEgKyBzaXplb2YodW5zaWduZWQpLCBfZGF0YSArIHNpemVvZih1bnNpZ25lZCksCisJICAgICAgIGxlbmd0aCAtIHNpemVvZih1bnNpZ25lZCkpOworCW1ha2VEaXJlY3RvcnkoKTsKKyAgICB9CitwdWJsaWM6CisgICAgU3RyaW5nVGFibGUocnN0cmVhbSAmZikgeworCS8qIENvbnN0cnVjdCBzdHJpbmcgdGFibGUgYnkgcmVhZGluZyBmcm9tIGYuCisJICovCisJc3RyZWFtcG9zIHM7CisJdW5zaWduZWQgc3RyU2l6ZTsKKwljaGFyICpzdHJEYXRhOworCisJcyA9IGYudGVsbGcoKTsKKwlmPj5zdHJTaXplOworCWlmKHN0clNpemUgPCBzaXplb2YodW5zaWduZWQpKQorCSAgICBzdG9wKCJTdHJpbmdUYWJsZTogSW52YWxpZCBzdHJpbmcgdGFibGUiKTsKKwlzdHJEYXRhID0gbmV3IGNoYXJbc3RyU2l6ZV07CisJKih1bnNpZ25lZCopc3RyRGF0YSA9IHN0clNpemU7CisJLy8gcmVhZCB0aGUgcmF3IGRhdGEgaW50byA8c3RyRGF0YT4KKwlmLnJlYWQoc3RyRGF0YSArIHNpemVvZih1bnNpZ25lZCksIHN0clNpemUgLSBzaXplb2YodW5zaWduZWQpKTsKKwlzID0gZi50ZWxsZygpIC0gczsKKwlpZihzIDwgc3RyU2l6ZSkKKwkgICAgc3RvcCgiU3RyaW5nVGFibGU6IFVuZXhwZWN0ZWQgRU9GIik7CisJaW5pdChzdHJEYXRhKTsKKwlkZWxldGVbXXN0ckRhdGE7CisgICAgfQorICAgIFN0cmluZ1RhYmxlKGNvbnN0IHNldDxzdHJpbmc+ICZzdHJpbmdzKSB7CisJLyogQ29uc3RydWN0IHN0cmluZyB0YWJsZSBmcm9tIGdpdmVuIHN0cmluZ3MuCisJICovCisJY2hhciAqcDsKKwlzZXQ8c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXQ7CisJc2l6ZV90IHM7CisKKwkvLyBjb3VudCByZXF1aXJlZCBzaXplIGZvciBkYXRhCisJZm9yKGxlbmd0aCA9IHNpemVvZih1bnNpZ25lZCksIGl0ID0gc3RyaW5ncy5iZWdpbigpOyBpdCAhPSBzdHJpbmdzLmVuZCgpOyArK2l0KSB7CisJICAgIHNpemVfdCBsID0gKCppdCkuc2l6ZSgpOworCisJICAgIGlmKGwgPiAodW5zaWduZWQpIDB4RkZGRkZGRkYpCisJCXN0b3AoIlN0cmluZ1RhYmxlOiBTdHJpbmcgdG9vIGxvbmciKTsKKwkgICAgaWYobCA+IDgpIHsKKwkJbGVuZ3RoICs9IGwgKyAxOworCQlpZihsZW5ndGggPiAodW5zaWduZWQpIDB4RkZGRkZGRkYpCisJCSAgICBzdG9wKCJTdHJpbmdUYWJsZTogU3ltYm9sIHRhYmxlIHRvbyBsb25nIik7CisJICAgIH0KKwl9CisJZGF0YSA9IG5ldyBjaGFyW2xlbmd0aF07CisJKih1bnNpZ25lZCopZGF0YSA9IGxlbmd0aDsKKwkvLyBwb3B1bGF0ZSBkYXRhIGFuZCBkaXJlY3RvcnkKKwlmb3IocCA9IGRhdGEgKyBzaXplb2YodW5zaWduZWQpLCBpdCA9IHN0cmluZ3MuYmVnaW4oKTsgaXQgIT0gc3RyaW5ncy5lbmQoKTsgKytpdCkgeworCSAgICBjb25zdCBzdHJpbmcgJnN0ciA9ICppdDsKKwkgICAgc2l6ZV90IGwgPSBzdHIuc2l6ZSgpOworCSAgICBpZihsID4gOCkgeworCQlkaXJlY3RvcnkuaW5zZXJ0KG1ha2VfcGFpcihzdHIsIHAgLSBkYXRhKSk7CisJCW1lbWNweShwLCBzdHIuY19zdHIoKSwgbCk7CisJCXBbbF0gPSAwOworCQlwICs9IGwgKyAxOworCSAgICB9CisJfQorICAgIH0KKyAgICB+U3RyaW5nVGFibGUoKSB7CisJZGVsZXRlW10gZGF0YTsKKyAgICB9CisgICAgLyogUmV0dXJucyBlbmNvZGluZyBmb3IgZ2l2ZW4gc3RyaW5nIGJhc2VkIG9uIHRoaXMgc3RyaW5nIHRhYmxlLgorICAgICAgIEVycm9yIGlmIHN0cmluZyBsZW5ndGggaXMgZ3JlYXRlciB0aGFuIDggYnV0IHN0cmluZyBpcyBub3QgaW4KKyAgICAgICB0aGUgc3RyaW5nIHRhYmxlLS1yZXR1cm5zIDAuCisgICAgKi8KKyAgICBfX2ludDY0IGVuY29kZShjb25zdCBzdHJpbmcgJnN0cikgeworCV9faW50NjQgcjsKKworCWlmKHN0ci5zaXplKCkgPD0gOCkgeworCSAgICAvLyBlbmNvZGVkIGRpcmVjdGx5CisJICAgICgoY2hhciopJnIpWzddID0gMDsKKwkgICAgc3RybmNweSgoY2hhciopJnIsIHN0ci5jX3N0cigpLCA4KTsKKwkgICAgcmV0dXJuIHI7CisJfSBlbHNlIHsKKwkgICAgLy8gcmVwcmVzZW50ZWQgYXMgaW5kZXggaW50byB0YWJsZQorCSAgICBtYXA8c3RyaW5nLHVuc2lnbmVkPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBkaXJlY3RvcnkuZmluZChzdHIpOworCSAgICBpZihpdCA9PSBkaXJlY3RvcnkuZW5kKCkpCisJCXN0b3AoIlN0cmluZ1RhYmxlOjplbmNvZGU6IFN0cmluZyBub3cgZm91bmQgaW4gc3RyaW5nIHRhYmxlIik7CisJICAgICgodW5zaWduZWQqKSZyKVswXSA9IDA7CisJICAgICgodW5zaWduZWQqKSZyKVsxXSA9ICgqaXQpLnNlY29uZDsKKwkgICAgcmV0dXJuIHI7CisJfQorICAgIH0KKyAgICAvKiBSZXR1cm5zIHN0cmluZyByZXByZXNlbnRlZCBieSB4IGJhc2VkIG9uIHRoaXMgc3RyaW5nIHRhYmxlLgorICAgICAgIEVycm9yIGlmIHggcmVmZXJlbmNlcyBhbiBpbnZhbGlkIHBvc2l0aW9uIGluIHRoZSB0YWJsZS0tcmV0dXJucworICAgICAgIHRoZSBlbXB0eSBzdHJpbmcuCisgICAgKi8KKyAgICBzdHJpbmcgZGVjb2RlKF9faW50NjQgeCkgY29uc3QgeworCWlmKCoodW5zaWduZWQqKSZ4ID09IDApIHsKKwkgICAgLy8gcmVwcmVzZW50ZWQgYXMgaW5kZXggaW50byB0YWJsZQorCSAgICB1bnNpZ25lZCAmcCA9ICgodW5zaWduZWQqKSZ4KVsxXTsKKwkgICAgaWYocCA+PSBsZW5ndGgpCisJCXN0b3AoIlN0cmluZ1RhYmxlOjpkZWNvZGU6IEludmFsaWQgc3RyaW5nIHRhYmxlIGxvb2t1cCIpOworCSAgICByZXR1cm4gc3RyaW5nKGRhdGEgKyBwKTsKKwl9IGVsc2UgeworCSAgICAvLyBlbmNvZGVkIGRpcmVjdGx5CisJICAgIGNoYXIgKnAgPSAoY2hhciopJng7CisJICAgIGludCBpOworCisJICAgIGZvcihpID0gMDsgaSA8IDggJiYgcFtpXTsgKytpKTsKKwkgICAgcmV0dXJuIHN0cmluZyhwLCBpKTsKKwl9CisgICAgfQorICAgIHZvaWQgd3JpdGUob3N0cmVhbSAmb3MpIHsKKwlvcy53cml0ZShkYXRhLCBsZW5ndGgpOworICAgIH0KK307CisKKy8qIGZvciB0aGUgbmFtZWQgb2JqZWN0IGZpbGUsIGRldGVybWluZXMgdGhlIHNldCBvZiBkZWZpbmVkIHN5bWJvbHMgYW5kIHRoZSBzZXQgb2YgdW5kZWZpbmVkIGV4dGVybmFsIHN5bWJvbHMKKyAgIGFuZCB3cml0ZXMgdGhlbSB0byA8ZGVmaW5lZD4gYW5kIDx1bmRlZmluZWQ+IHJlc3BlY3RpdmVseQorKi8KK3ZvaWQgY29tcHV0ZUV4dGVybmFsU3ltYm9scyhjb25zdCBjaGFyICpmaWxlTmFtZSwgc2V0PHN0cmluZz4gKmRlZmluZWQsIHNldDxzdHJpbmc+ICp1bmRlZmluZWQpeworICAgIHN0cmVhbXBvcyBmaWxlU2l6ZTsKKyAgICBzaXplX3Qgc3RyVGFiU3RhcnQ7CisgICAgdW5zaWduZWQgc3ltVGFiU3RhcnQsIHN5bU5FbnRyaWVzOworICAgIHJzdHJlYW0gZihmaWxlTmFtZSk7CisKKyAgICBmLnNlZWtnKDAsaW9zOjplbmQpOworICAgIGZpbGVTaXplID0gZi50ZWxsZygpOworCisgICAgZi5zZWVrZyg4KTsKKyAgICBmID4+IHN5bVRhYlN0YXJ0ID4+IHN5bU5FbnRyaWVzOworICAgIC8vIHNlZWsgdG8gdGhlIHN0cmluZyB0YWJsZQorICAgIGYuc2Vla2coc3RyVGFiU3RhcnQgPSBzeW1UYWJTdGFydCArIDE4ICogKHNpemVfdClzeW1ORW50cmllcyk7CisgICAgaWYoZi5lb2YoKSkgeworCXByaW50ZigiY29tcHV0ZUV4dGVybmFsU3ltYm9sczogZmlsZU5hbWU9JyVzJywgZmlsZVNpemUgPSAlbHUsIHN5bVRhYlN0YXJ0ID0gJXUsIHN5bU5FbnRyaWVzID0gJXVcbiIsCisJICAgICAgIGZpbGVOYW1lLCAodW5zaWduZWQgbG9uZykgZmlsZVNpemUsIHN5bVRhYlN0YXJ0LCBzeW1ORW50cmllcyk7CisJc3RvcCgiY29tcHV0ZUV4dGVybmFsU3ltYm9sczogVW5leHBlY3RlZCBFT0YgMSIpOworICAgIH0KKyAgICBTdHJpbmdUYWJsZSBzdHJpbmdUYWJsZShmKTsgLy8gcmVhZCB0aGUgc3RyaW5nIHRhYmxlCisgICAgaWYoZi50ZWxsZygpICE9IGZpbGVTaXplKQorCXN0b3AoImNvbXB1dGVFeHRlcm5hbFN5bWJvbHM6IFVuZXhwZWN0ZWQgZGF0YSBhZnRlciBzdHJpbmcgdGFibGUiKTsKKworICAgIGYuY2xlYXIoKTsKKyAgICBmLnNlZWtnKHN5bVRhYlN0YXJ0KTsgLy8gc2VlayB0byB0aGUgc3ltYm9sIHRhYmxlCisKKyAgICBkZWZpbmVkLT5jbGVhcigpOyB1bmRlZmluZWQtPmNsZWFyKCk7CisgICAgZm9yKGludCBpID0gMDsgaSA8IHN5bU5FbnRyaWVzOyArK2kpIHsKKwkvLyBwcm9jZXNzIGVhY2ggZW50cnkKKwlTeW1ib2wgZTsKKworCWlmKGYuZW9mKCkpCisJICAgIHN0b3AoImNvbXB1dGVFeHRlcm5hbFN5bWJvbHM6IFVuZXhwZWN0ZWQgRU9GIDIiKTsKKwlmPj5lOworCWlmKGYuZmFpbCgpKQorCSAgICBzdG9wKCJjb21wdXRlRXh0ZXJuYWxTeW1ib2xzOiBGaWxlIHJlYWQgZXJyb3IiKTsKKwlpZihlLm5BdXgpIHsgLy8gYXV4aWxpYXJ5IGVudHJ5OiBza2lwCisJICAgIGYuc2Vla2coZS5uQXV4ICogMTgsIGlvczo6Y3VyKTsKKwkgICAgaSArPSBlLm5BdXg7CisJfQorCS8vIGlmIHN5bWJvbCBpcyBleHRlcm4gYW5kIGRlZmluZWQgaW4gdGhlIGN1cnJlbnQgZmlsZSwgaW5zZXJ0IGl0CisJaWYoZS5zdG9yYWdlQ2xhc3MgPT0gMikKKwkgICAgaWYoZS5zZWN0aW9uTnVtKQorCQlkZWZpbmVkLT5pbnNlcnQoc3RyaW5nVGFibGUuZGVjb2RlKGUubmFtZSkpOworCSAgICBlbHNlCisJCXVuZGVmaW5lZC0+aW5zZXJ0KHN0cmluZ1RhYmxlLmRlY29kZShlLm5hbWUpKTsKKyAgICB9Cit9CisKKy8qIEZvciBlYWNoIG9jY3VycmVuY2Ugb2YgYW4gZXh0ZXJuYWwgc3ltYm9sIGluIHRoZSBvYmplY3QgZmlsZSBuYW1lZCBieQorICAgYnkgPGZpbGVOYW1lPiB0aGF0IGlzIGEgbWVtYmVyIG9mIDxoaWRlPiwgcmVuYW1lcyBpdCBieSBwcmVmaXhpbmcKKyAgIHdpdGggIl9fa21wX2V4dGVybmFsXyIsIHdyaXRpbmcgYmFjayB0aGUgZmlsZSBpbi1wbGFjZQorKi8KK3ZvaWQgaGlkZVN5bWJvbHMoY2hhciAqZmlsZU5hbWUsIGNvbnN0IHNldDxzdHJpbmc+ICZoaWRlKSB7CisgICAgc3RhdGljIGNvbnN0IHN0cmluZyBwcmVmaXgoIl9fa21wX2V4dGVybmFsXyIpOworICAgIHNldDxzdHJpbmc+IHN0cmluZ3M7IC8vIHNldCBvZiBhbGwgb2NjdXJyaW5nIHN5bWJvbHMsIGFwcHJvcHJpYXRlbHkgcHJlZml4ZWQKKyAgICBzdHJlYW1wb3MgZmlsZVNpemU7CisgICAgc2l6ZV90IHN0clRhYlN0YXJ0OworICAgIHVuc2lnbmVkIHN5bVRhYlN0YXJ0LCBzeW1ORW50cmllczsKKyAgICBpbnQgaTsKKyAgICByc3RyZWFtIGluKGZpbGVOYW1lKTsKKworICAgIGluLnNlZWtnKDAsaW9zOjplbmQpOworICAgIGZpbGVTaXplID0gaW4udGVsbGcoKTsKKworICAgIGluLnNlZWtnKDgpOworICAgIGluID4+IHN5bVRhYlN0YXJ0ID4+IHN5bU5FbnRyaWVzOworICAgIGluLnNlZWtnKHN0clRhYlN0YXJ0ID0gc3ltVGFiU3RhcnQgKyAxOCAqIChzaXplX3Qpc3ltTkVudHJpZXMpOworICAgIGlmKGluLmVvZigpKQorCXN0b3AoImhpZGVTeW1ib2xzOiBVbmV4cGVjdGVkIEVPRiIpOworICAgIFN0cmluZ1RhYmxlIHN0cmluZ1RhYmxlT2xkKGluKTsgLy8gcmVhZCBvcmlnaW5hbCBzdHJpbmcgdGFibGUKKworICAgIGlmKGluLnRlbGxnKCkgIT0gZmlsZVNpemUpCisJc3RvcCgiaGlkZVN5bWJvbHM6IFVuZXhwZWN0ZWQgZGF0YSBhZnRlciBzdHJpbmcgdGFibGUiKTsKKworICAgIC8vIGNvbXB1dGUgc2V0IG9mIG9jY3VycmluZyBzdHJpbmdzIHdpdGggcHJlZml4IGFkZGVkCisgICAgZm9yKGkgPSAwOyBpIDwgc3ltTkVudHJpZXM7ICsraSkgeworCVN5bWJvbCBlOworCisJaW4uc2Vla2coc3ltVGFiU3RhcnQgKyBpICogMTgpOworCWlmKGluLmVvZigpKQorCSAgICBzdG9wKCJoaWRlU3ltYm9sczogVW5leHBlY3RlZCBFT0YiKTsKKwlpbiA+PiBlOworCWlmKGluLmZhaWwoKSkKKwkgICAgc3RvcCgiaGlkZVN5bWJvbHM6IEZpbGUgcmVhZCBlcnJvciIpOworCWlmKGUubkF1eCkKKwkgICAgaSArPSBlLm5BdXg7CisJY29uc3Qgc3RyaW5nICZzID0gc3RyaW5nVGFibGVPbGQuZGVjb2RlKGUubmFtZSk7CisJLy8gaWYgc3ltYm9sIGlzIGV4dGVybiBhbmQgZm91bmQgaW4gPGhpZGU+LCBwcmVmaXggYW5kIGluc2VydCBpbnRvIHN0cmluZ3MsCisJLy8gb3RoZXJ3aXNlLCBqdXN0IGluc2VydCBpbnRvIHN0cmluZ3Mgd2l0aG91dCBwcmVmaXgKKwlzdHJpbmdzLmluc2VydCggKGUuc3RvcmFnZUNsYXNzID09IDIgJiYgaGlkZS5maW5kKHMpICE9IGhpZGUuZW5kKCkpID8KKwkJCXByZWZpeCArIHMgOiBzKTsKKyAgICB9CisKKyAgICBvZnN0cmVhbSBvdXQoZmlsZU5hbWUsIGlvczo6dHJ1bmMgfCBpb3M6Om91dCB8IGlvczo6YmluYXJ5KTsKKyAgICBpZighb3V0LmlzX29wZW4oKSkKKwlzdG9wKCJoaWRlU3ltYm9sczogRXJyb3Igb3BlbmluZyBvdXRwdXQgZmlsZSIpOworCisgICAgLy8gbWFrZSBuZXcgc3RyaW5nIHRhYmxlIGZyb20gc3RyaW5nIHNldAorICAgIFN0cmluZ1RhYmxlIHN0cmluZ1RhYmxlTmV3ID0gU3RyaW5nVGFibGUoc3RyaW5ncyk7CisKKyAgICAvLyBjb3B5IGlucHV0IGZpbGUgdG8gb3V0cHV0IGZpbGUgdXAgdG8ganVzdCBiZWZvcmUgdGhlIHN5bWJvbCB0YWJsZQorICAgIGluLnNlZWtnKDApOworICAgIGNoYXIgKmJ1ZiA9IG5ldyBjaGFyW3N5bVRhYlN0YXJ0XTsKKyAgICBpbi5yZWFkKGJ1Ziwgc3ltVGFiU3RhcnQpOworICAgIG91dC53cml0ZShidWYsIHN5bVRhYlN0YXJ0KTsKKyAgICBkZWxldGUgW11idWY7CisKKyAgICAvLyBjb3B5IGlucHV0IHN5bWJvbCB0YWJsZSB0byBvdXRwdXQgc3ltYm9sIHRhYmxlIHdpdGggbmFtZSB0cmFuc2xhdGlvbgorICAgIGZvcihpID0gMDsgaSA8IHN5bU5FbnRyaWVzOyArK2kpIHsKKwlTeW1ib2wgZTsKKworCWluLnNlZWtnKHN5bVRhYlN0YXJ0ICsgaSoxOCk7CisJaWYoaW4uZW9mKCkpCisJICAgIHN0b3AoImhpZGVTeW1ib2xzOiBVbmV4cGVjdGVkIEVPRiIpOworCWluID4+IGU7CisJaWYoaW4uZmFpbCgpKQorCSAgICBzdG9wKCJoaWRlU3ltYm9sczogRmlsZSByZWFkIGVycm9yIik7CisJY29uc3Qgc3RyaW5nICZzID0gc3RyaW5nVGFibGVPbGQuZGVjb2RlKGUubmFtZSk7CisJb3V0LnNlZWtwKHN5bVRhYlN0YXJ0ICsgaSoxOCk7CisJZS5uYW1lID0gc3RyaW5nVGFibGVOZXcuZW5jb2RlKCAoZS5zdG9yYWdlQ2xhc3MgPT0gMiAmJiBoaWRlLmZpbmQocykgIT0gaGlkZS5lbmQoKSkgPworCQkJCQlwcmVmaXggKyBzIDogcyk7CisJb3V0LndyaXRlKChjaGFyKikmZSwgMTgpOworCWlmKG91dC5mYWlsKCkpCisJICAgIHN0b3AoImhpZGVTeW1ib2xzOiBGaWxlIHdyaXRlIGVycm9yIik7CisJaWYoZS5uQXV4KSB7CisJICAgIC8vIGNvcHkgYXV4aWxpYXJ5IHN5bWJvbCB0YWJsZSBlbnRyaWVzCisJICAgIGludCBuQXV4ID0gZS5uQXV4OworCSAgICBmb3IoaW50IGogPSAxOyBqIDw9IG5BdXg7ICsraikgeworCQlpbiA+PiBlOworCQlvdXQuc2Vla3Aoc3ltVGFiU3RhcnQgKyAoaSArIGopICogMTgpOworCQlvdXQud3JpdGUoKGNoYXIqKSZlLCAxOCk7CisJICAgIH0KKwkgICAgaSArPSBuQXV4OworCX0KKyAgICB9CisgICAgLy8gb3V0cHV0IHN0cmluZyB0YWJsZQorICAgIHN0cmluZ1RhYmxlTmV3LndyaXRlKG91dCk7Cit9CisKKy8vIHJldHVybnMgdHJ1ZSBpZmYgPGE+IGFuZCA8Yj4gaGF2ZSBubyBjb21tb24gZWxlbWVudAordGVtcGxhdGUgPGNsYXNzIFQ+Citib29sIGlzRGlzam9pbnQoY29uc3Qgc2V0PFQ+ICZhLCBjb25zdCBzZXQ8VD4gJmIpIHsKKyAgICBzZXQ8VD46OmNvbnN0X2l0ZXJhdG9yIGl0YSwgaXRiOworCisgICAgZm9yKGl0YSA9IGEuYmVnaW4oKSwgaXRiID0gYi5iZWdpbigpOyBpdGEgIT0gYS5lbmQoKSAmJiBpdGIgIT0gYi5lbmQoKTspIHsKKwljb25zdCBUICZ0YSA9ICppdGEsICZ0YiA9ICppdGI7CisJaWYodGEgPCB0YikKKwkgICAgKytpdGE7CisJZWxzZSBpZiAodGIgPCB0YSkKKwkgICAgKytpdGI7CisJZWxzZQorCSAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvKiBwcmVjb25kaXRpb246IDxkZWZpbmVkPiBhbmQgPHVuZGVmaW5lZD4gYXJlIGFycmF5cyB3aXRoIDxuVG90YWw+IGVsZW1lbnRzIHdoZXJlCisgICA8blRvdGFsPiA+PSA8bkV4dGVybmFsPi4gIFRoZSBmaXJzdCA8bkV4dGVybmFsPiBlbGVtZW50cyBjb3JyZXNwb25kIHRvIHRoZSBleHRlcm5hbCBvYmplY3QKKyAgIGZpbGVzIGFuZCB0aGUgcmVzdCBjb3JyZXNwb25kIHRvIHRoZSBpbnRlcm5hbCBvYmplY3QgZmlsZXMuCisgICBwb3N0Y29uZGl0aW9uOiBmaWxlIHggaXMgc2FpZCB0byBkZXBlbmQgb24gZmlsZSB5IGlmIHVuZGVmaW5lZFt4XSBhbmQgZGVmaW5lZFt5XSBhcmUgbm90CisgICBkaXNqb2ludC4gIFJldHVybnMgdGhlIHRyYW5zaXRpdmUgY2xvc3VyZSBvZiB0aGUgc2V0IG9mIGludGVybmFsIG9iamVjdCBmaWxlcywgYXMgYSBzZXQgb2YKKyAgIGZpbGUgaW5kZXhlcywgdW5kZXIgdGhlICdkZXBlbmRzIG9uJyByZWxhdGlvbiwgbWludXMgdGhlIHNldCBvZiBpbnRlcm5hbCBvYmplY3QgZmlsZXMuCisqLworc2V0PGludD4gKmZpbmRSZXF1aXJlZEV4dGVybmFsKGludCBuRXh0ZXJuYWwsIGludCBuVG90YWwsIHNldDxzdHJpbmc+ICpkZWZpbmVkLCBzZXQ8c3RyaW5nPiAqdW5kZWZpbmVkKSB7CisgICAgc2V0PGludD4gKnJlcXVpcmVkID0gbmV3IHNldDxpbnQ+OworICAgIHNldDxpbnQ+IGZyZXNoWzJdOworICAgIGludCBpLCBjdXIgPSAwOworICAgIGJvb2wgY2hhbmdlZDsKKworICAgIGZvcihpID0gblRvdGFsIC0gMTsgaSA+PSBuRXh0ZXJuYWw7IC0taSkKKwlmcmVzaFtjdXJdLmluc2VydChpKTsKKyAgICBkbyB7CisJY2hhbmdlZCA9IGZhbHNlOworCWZvcihzZXQ8aW50Pjo6aXRlcmF0b3IgaXQgPSBmcmVzaFtjdXJdLmJlZ2luKCk7IGl0ICE9IGZyZXNoW2N1cl0uZW5kKCk7ICsraXQpIHsKKwkgICAgc2V0PHN0cmluZz4gJnMgPSB1bmRlZmluZWRbKml0XTsKKworCSAgICBmb3IoaSA9IDA7IGkgPCBuRXh0ZXJuYWw7ICsraSkgeworCQlpZihyZXF1aXJlZC0+ZmluZChpKSA9PSByZXF1aXJlZC0+ZW5kKCkpIHsKKwkJICAgIGlmKCFpc0Rpc2pvaW50KGRlZmluZWRbaV0sIHMpKSB7CisJCQkvLyBmb3VuZCBhIG5ldyBxdWFsaWZ5aW5nIGVsZW1lbnQKKwkJCXJlcXVpcmVkLT5pbnNlcnQoaSk7CisJCQlmcmVzaFsxIC0gY3VyXS5pbnNlcnQoaSk7CisJCQljaGFuZ2VkID0gdHJ1ZTsKKwkJICAgIH0KKwkJfQorCSAgICB9CisJfQorCWZyZXNoW2N1cl0uY2xlYXIoKTsKKwljdXIgPSAxIC0gY3VyOworICAgIH0gd2hpbGUoY2hhbmdlZCk7CisgICAgcmV0dXJuIHJlcXVpcmVkOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgICBpbnQgbkV4dGVybmFsLCBuSW50ZXJuYWwsIGk7CisgICAgc2V0PHN0cmluZz4gKmRlZmluZWQsICp1bmRlZmluZWQ7CisgICAgc2V0PGludD46Oml0ZXJhdG9yIGl0OworCisgICAgaWYoYXJnYyA8IDMpCisJc3RvcCgiUGxlYXNlIHNwZWNpZnkgYSBwb3NpdGl2ZSBpbnRlZ2VyIGZvbGxvd2VkIGJ5IGEgbGlzdCBvZiBvYmplY3QgZmlsZW5hbWVzIik7CisgICAgbkV4dGVybmFsID0gYXRvaShhcmd2WzFdKTsKKyAgICBpZihuRXh0ZXJuYWwgPD0gMCkKKwlzdG9wKCJQbGVhc2Ugc3BlY2lmeSBhIHBvc2l0aXZlIGludGVnZXIgZm9sbG93ZWQgYnkgYSBsaXN0IG9mIG9iamVjdCBmaWxlbmFtZXMiKTsKKyAgICBpZihuRXh0ZXJuYWwgKyAgMiA+IGFyZ2MpCisJc3RvcCgiVG9vIGZldyBleHRlcm5hbCBvYmplY3RzIik7CisgICAgbkludGVybmFsID0gYXJnYyAtIG5FeHRlcm5hbCAtIDI7CisgICAgZGVmaW5lZCA9IG5ldyBzZXQ8c3RyaW5nPlthcmdjIC0gMl07CisgICAgdW5kZWZpbmVkID0gbmV3IHNldDxzdHJpbmc+W2FyZ2MgLSAyXTsKKworICAgIC8vIGRldGVybWluZSB0aGUgc2V0IG9mIGRlZmluZWQgYW5kIHVuZGVmaW5lZCBleHRlcm5hbCBzeW1ib2xzCisgICAgZm9yKGkgPSAyOyBpIDwgYXJnYzsgKytpKQorCWNvbXB1dGVFeHRlcm5hbFN5bWJvbHMoYXJndltpXSwgZGVmaW5lZCArIGkgLSAyLCB1bmRlZmluZWQgKyBpIC0gMik7CisKKyAgICAvLyBkZXRlcm1pbmUgdGhlIHNldCBvZiByZXF1aXJlZCBleHRlcm5hbCBmaWxlcworICAgIHNldDxpbnQ+ICpyZXF1aXJlZEV4dGVybmFsID0gZmluZFJlcXVpcmVkRXh0ZXJuYWwobkV4dGVybmFsLCBhcmdjIC0gMiwgZGVmaW5lZCwgdW5kZWZpbmVkKTsKKyAgICBzZXQ8c3RyaW5nPiBoaWRlOworCisgICAgLyogZGV0ZXJtaW5lIHRoZSBzZXQgb2Ygc3ltYm9scyB0byBoaWRlLS1uYW1lbHkgZGVmaW5lZCBleHRlcm5hbCBzeW1ib2xzIG9mIHRoZQorICAgICAgIHJlcXVpcmVkIGV4dGVybmFsIGZpbGVzCisgICAgKi8KKyAgICBmb3IoaXQgPSByZXF1aXJlZEV4dGVybmFsLT5iZWdpbigpOyBpdCAhPSByZXF1aXJlZEV4dGVybmFsLT5lbmQoKTsgKytpdCkgeworCWludCBpZHggPSAqaXQ7CisJc2V0PHN0cmluZz46Oml0ZXJhdG9yIGl0MjsKKwkvKiBXZSBoYXZlIHRvIGluc2VydCBvbmUgZWxlbWVudCBhdCBhIHRpbWUgaW5zdGVhZCBvZiBpbnNlcnRpbmcgYSByYW5nZSBiZWNhdXNlCisJICAgdGhlIGluc2VydCBtZW1iZXIgZnVuY3Rpb24gdGFraW5nIGEgcmFuZ2UgZG9lc24ndCBleGlzdCBvbiBXaW5kb3dzKiBPUywgYXQgbGVhc3QKKwkgICBhdCB0aGUgdGltZSBvZiB0aGlzIHdyaXRpbmcuCisJKi8KKwlmb3IoaXQyID0gZGVmaW5lZFtpZHhdLmJlZ2luKCk7IGl0MiAhPSBkZWZpbmVkW2lkeF0uZW5kKCk7ICsraXQyKQorCSAgICBoaWRlLmluc2VydCgqaXQyKTsKKyAgICB9CisKKyAgICAvKiBwcm9jZXNzIHRoZSBleHRlcm5hbCBmaWxlcy0tcmVtb3ZpbmcgdGhvc2UgdGhhdCBhcmUgbm90IHJlcXVpcmVkIGFuZCBoaWRpbmcKKyAgICAgICB0aGUgYXBwcm9wcmlhdGUgc3ltYm9scyBpbiB0aGUgb3RoZXJzCisgICAgKi8KKyAgICBmb3IoaSA9IDA7IGkgPCBuRXh0ZXJuYWw7ICsraSkKKwlpZihyZXF1aXJlZEV4dGVybmFsLT5maW5kKGkpICE9IHJlcXVpcmVkRXh0ZXJuYWwtPmVuZCgpKQorCSAgICBoaWRlU3ltYm9scyhhcmd2WzIgKyBpXSwgaGlkZSk7CisJZWxzZQorCSAgICByZW1vdmUoYXJndlsyICsgaV0pOworICAgIC8vIGhpZGUgdGhlIGFwcHJvcHJpYXRlIHN5bWJvbHMgaW4gdGhlIGludGVybmFsIGZpbGVzCisgICAgZm9yKGkgPSBuRXh0ZXJuYWwgKyAyOyBpIDwgYXJnYzsgKytpKQorCWhpZGVTeW1ib2xzKGFyZ3ZbaV0sIGhpZGUpOworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMvaTE4bi9lbl9VUy50eHQgYi9maW5hbC9ydW50aW1lL3NyYy9pMThuL2VuX1VTLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTI1ZWY5Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMvaTE4bi9lbl9VUy50eHQKQEAgLTAsMCArMSw0NzIgQEAKKyMgZW5fVVMudHh0ICMKKyMgJFJldmlzaW9uOiA0MzQxOSAkCisjICREYXRlOiAyMDE0LTA4LTI3IDE0OjU5OjUyIC0wNTAwIChXZWQsIDI3IEF1ZyAyMDE0KSAkCisKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKKworIyBEZWZhdWx0IG1lc3NhZ2VzLCBlbWJlZGRlZCBpbnRvIHRoZSBPcGVuTVAgUlRMLCBhbmQgc291cmNlIGZvciBFbmdsaXNoIGNhdGFsb2cuCisKKworIyBDb21wYXRpYmxlIGNoYW5nZXMgKHdoaWNoIGRvZXMgbm90IHJlcXVpcmUgdmVyc2lvbiBidW1waW5nKToKKyMgICAgICogRWRpdGluZyBtZXNzYWdlIChudW1iZXIgYW5kIHR5cGUgb2YgcGxhY2Vob2xkZXJzIG11c3QgcmVtYWluLCByZWxhdGl2ZSBvcmRlciBvZgorIyAgICAgICBwbGFjZWhvbGRlcnMgbWF5IGJlIGNoYW5nZWQsIGUuZy4gIkZpbGUgJTEkcyBsaW5lICUyJGQiIG1heSBiZSBzYWZlbHkgZWRpdGVkIHRvCisjICAgICAgICJMaW5lICUyJGQgZmlsZSAlMSRzIikuCisjICAgICAqIEFkZGluZyBuZXcgbWVzc2FnZSB0byB0aGUgZW5kIG9mIHNlY3Rpb24uCisjIEluY29tcGF0aWJsZSBjaGFuZ2VzICh2ZXJzaW9uIG11c3QgYmUgYnVtYmVkIGJ5IDEpOgorIyAgICAgKiBJbnRyb2R1Y2luZyBuZXcgcGxhY2Vob2xkZXJzIHRvIGV4aXN0aW5nIG1lc3NhZ2VzLgorIyAgICAgKiBDaGFuZ2luZyB0eXBlIG9mIHBsYWNlaG9sZGVycyAoZS5nLiAibGluZSAlMSRkIiAtPiAibGluZSAlMSRzIikuCisjICAgICAqIFJlYXJyYW5naW5nIG9yZGVyIG9mIG1lc3NhZ2VzLgorIyAgICAgKiBEZWxldGluZyBtZXNzYWdlcy4KKyMgVXNlIHNwZWNpYWwgIk9CU09MRVRFIiBwc2V1ZG9pZGVudGlmaWVyIGZvciBvYnNvbGV0ZSBlbnRyaWVzLCB3aGljaCBpcyBrZXB0IG9ubHkgZm9yIGJhY2t3YXJkCisjIGNvbXBhdGliaWxpdHkuIFdoZW4gdmVyc2lvbiBpcyBidW1wZWQsIGRvIG5vdCBmb3JnZXQgdG8gZGVsZXRlIGFsbCBvYnNvbGV0ZSBlbnRyaWVzLgorCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0qLSBNRVRBIC0qLQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIE1ldGEgaW5mb3JtYXRpb24gYWJvdXQgbWVzc2FnZSBjYXRhbG9nLgorCitMYW5ndWFnZSAiRW5nbGlzaCIKK0NvdW50cnkgICJVU0EiCitMYW5nSWQgICAiMTAzMyIKK1ZlcnNpb24gICIyIgorUmV2aXNpb24gIjIwMTQwODI3IgorCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLSotIFNUUklOR1MgLSotCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgU3RyaW5ncyBhcmUgbm90IGNvbXBsZXRlIG1lc3NhZ2VzLCBqdXN0IGZyYWdtZW50cy4gV2UgbmVlZCB0byB3b3JrIG9uIGl0IGFuZCByZWR1Y2UgbnVtYmVyIG9mCisjIHN0cmluZ3MgKHRvIHplcm8/KS4KKworRXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IiCitVbmtub3duRmlsZSAgICAgICAgICAgICAgICAgICIodW5rbm93biBmaWxlKSIKK05vdEFOdW1iZXIgICAgICAgICAgICAgICAgICAgIm5vdCBhIG51bWJlciIKK0JhZFVuaXQgICAgICAgICAgICAgICAgICAgICAgImJhZCB1bml0IgorSWxsZWdhbENoYXJhY3RlcnMgICAgICAgICAgICAiaWxsZWdhbCBjaGFyYWN0ZXJzIgorVmFsdWVUb29MYXJnZSAgICAgICAgICAgICAgICAidmFsdWUgdG9vIGxhcmdlIgorVmFsdWVUb29TbWFsbCAgICAgICAgICAgICAgICAidmFsdWUgdG9vIHNtYWxsIgorTm90TXVsdGlwbGU0SyAgICAgICAgICAgICAgICAidmFsdWUgaXMgbm90IGEgbXVsdGlwbGUgb2YgNGsiCitVbmtub3duVG9wb2xvZ3kgICAgICAgICAgICAgICJVbmtub3duIHByb2Nlc3NvciB0b3BvbG9neSIKK0NhbnRPcGVuQ3B1aW5mbyAgICAgICAgICAgICAgIkNhbm5vdCBvcGVuIC9wcm9jL2NwdWluZm8iCitQcm9jQ3B1aW5mbyAgICAgICAgICAgICAgICAgICIvcHJvYy9jcHVpbmZvIgorTm9Qcm9jUmVjb3JkcyAgICAgICAgICAgICAgICAiY3B1aW5mbyBmaWxlIGludmFsaWQgKE5vIHByb2Nlc3NvciByZWNvcmRzKSIKK1Rvb01hbnlQcm9jUmVjb3JkcyAgICAgICAgICAgImNwdWluZm8gZmlsZSBpbnZhbGlkIChUb28gbWFueSBwcm9jZXNzb3IgcmVjb3JkcykiCitDYW50UmV3aW5kQ3B1aW5mbyAgICAgICAgICAgICJDYW5ub3QgcmV3aW5kIGNwdWluZm8gZmlsZSIKK0xvbmdMaW5lQ3B1aW5mbyAgICAgICAgICAgICAgImNwdWluZm8gZmlsZSBpbnZhbGlkIChsb25nIGxpbmUpIgorVG9vTWFueUVudHJpZXMgICAgICAgICAgICAgICAiY3B1aW5mbyBmaWxlIGNvbnRhaW5zIHRvbyBtYW55IGVudHJpZXMiCitNaXNzaW5nUHJvY0ZpZWxkICAgICAgICAgICAgICJjcHVpbmZvIGZpbGUgbWlzc2luZyBwcm9jZXNzb3IgZmllbGQiCitNaXNzaW5nUGh5c2ljYWxJREZpZWxkICAgICAgICJjcHVpbmZvIGZpbGUgbWlzc2luZyBwaHlzaWNhbCBpZCBmaWVsZCIKK01pc3NpbmdWYWxDcHVpbmZvICAgICAgICAgICAgImNwdWluZm8gZmlsZSBpbnZhbGlkIChtaXNzaW5nIHZhbCkiCitEdXBsaWNhdGVGaWVsZENwdWluZm8gICAgICAgICJjcHVpbmZvIGZpbGUgaW52YWxpZCAoZHVwbGljYXRlIGZpZWxkKSIKK1BoeXNpY2FsSURzTm90VW5pcXVlICAgICAgICAgIlBoeXNpY2FsIG5vZGUvcGtnL2NvcmUvdGhyZWFkIGlkcyBub3QgdW5pcXVlIgorQXBpY05vdFByZXNlbnQgICAgICAgICAgICAgICAiQVBJQyBub3QgcHJlc2VudCIKK0ludmFsaWRDcHVpZEluZm8gICAgICAgICAgICAgIkludmFsaWQgY3B1aWQgaW5mbyIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIkFQSUMgaWRzIG5vdCB1bmlxdWUiCitJbmNvbnNpc3RlbnRDcHVpZEluZm8gICAgICAgICJJbmNvbnNpc3RlbnQgY3B1aWQgaW5mbyIKK091dE9mSGVhcE1lbW9yeSAgICAgICAgICAgICAgIk91dCBvZiBoZWFwIG1lbW9yeSIKK01lbW9yeUFsbG9jRmFpbGVkICAgICAgICAgICAgIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCIKK0NvcmUgICAgICAgICAgICAgICAgICAgICAgICAgImNvcmUiCitUaHJlYWQgICAgICAgICAgICAgICAgICAgICAgICJ0aHJlYWQiCitQYWNrYWdlICAgICAgICAgICAgICAgICAgICAgICJwYWNrYWdlIgorTm9kZSAgICAgICAgICAgICAgICAgICAgICAgICAibm9kZSIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIjx1bmRlZj4iCitEZWNvZGluZ0xlZ2FjeUFQSUMgICAgICAgICAgICJkZWNvZGluZyBsZWdhY3kgQVBJQyBpZHMiCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICJwYXJzaW5nIC9wcm9jL2NwdWluZm8iCitOb3REZWZpbmVkICAgICAgICAgICAgICAgICAgICJ2YWx1ZSBpcyBub3QgZGVmaW5lZCIKK0VmZmVjdGl2ZVNldHRpbmdzICAgICAgICAgICAgIkVmZmVjdGl2ZSBzZXR0aW5nczoiCitVc2VyU2V0dGluZ3MgICAgICAgICAgICAgICAgICJVc2VyIHNldHRpbmdzOiIKK1N0b3JhZ2VNYXBXYXJuaW5nICAgICAgICAgICAgIndhcm5pbmc6IHBvaW50ZXJzIG9yIHNpemUgZG9uJ3QgbWFrZSBzZW5zZSIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIkNQVSIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIlRQVSIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIlRQVXMgcGVyIHBhY2thZ2UiCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICJIVCBlbmFibGVkIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiSFQgZGlzYWJsZWQiCitEZWNvZGluZ3gyQVBJQyAgICAgICAgICAgICAgICJkZWNvZGluZyB4MkFQSUMgaWRzIgorTm9MZWFmMTFTdXBwb3J0ICAgICAgICAgICAgICAiY3B1aWQgbGVhZiAxMSBub3Qgc3VwcG9ydGVkIgorTm9MZWFmNFN1cHBvcnQgICAgICAgICAgICAgICAiY3B1aWQgbGVhZiA0IG5vdCBzdXBwb3J0ZWQiCitUaHJlYWRJRHNOb3RVbmlxdWUgICAgICAgICAgICJ0aHJlYWQgaWRzIG5vdCB1bmlxdWUiCitVc2luZ1B0aHJlYWQgICAgICAgICAgICAgICAgICJ1c2luZyBwdGhyZWFkIGluZm8iCitMZWdhY3lBcGljSURzTm90VW5pcXVlICAgICAgICJsZWdhY3kgQVBJQyBpZHMgbm90IHVuaXF1ZSIKK3gyQXBpY0lEc05vdFVuaXF1ZSAgICAgICAgICAgIngyQVBJQyBpZHMgbm90IHVuaXF1ZSIKK0Rpc3BsYXlFbnZCZWdpbgkJICAgICAiT1BFTk1QIERJU1BMQVkgRU5WSVJPTk1FTlQgQkVHSU4iCitEaXNwbGF5RW52RW5kCQkgICAgICJPUEVOTVAgRElTUExBWSBFTlZJUk9OTUVOVCBFTkQiCitEZXZpY2UJCQkgICAgICJbZGV2aWNlXSIKK0hvc3QJCQkgICAgICJbaG9zdF0iCisKKworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistKi0gRk9STUFUUyAtKi0KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSW5mbyAgICAgICAgICAgICAgICAgICAgICAgICAiT01QOiBJbmZvICMlMSRkOiAlMiRzXG4iCitXYXJuaW5nICAgICAgICAgICAgICAgICAgICAgICJPTVA6IFdhcm5pbmcgIyUxJGQ6ICUyJHNcbiIKK0ZhdGFsICAgICAgICAgICAgICAgICAgICAgICAgIk9NUDogRXJyb3IgIyUxJGQ6ICUyJHNcbiIKK1N5c0VyciAgICAgICAgICAgICAgICAgICAgICAgIk9NUDogU3lzdGVtIGVycm9yICMlMSRkOiAlMiRzXG4iCitIaW50ICAgICAgICAgICAgICAgICAgICAgICAgICJPTVA6IEhpbnQ6ICUyJHNcbiIKKworUHJhZ21hICAgICAgICAgICAgICAgICAgICAgICAiJTEkcyBwcmFnbWEgKGF0ICUyJHM6JTMkcygpOiU0JHMpIgorICAgICMgJTEgaXMgcHJhZ21hIG5hbWUgKGxpa2UgInBhcmFsbGVsIiBvciAibWFzdGVyIiwKKyAgICAjICUyIGlzIGZpbGUgbmFtZSwKKyAgICAjICUzIGlzIGZ1bmN0aW9uIChyb3V0aW5lKSBuYW1lLAorICAgICMgJTQgaXMgdGhlIGxpbmUgbnVtYmVyIChhcyBzdHJpbmcsIHNvICJzIiB0eXBlIHNwZWNpZmllciBzaG91bGQgYmUgdXNlZCkuCisKKworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistKi0gTUVTU0FHRVMgLSotCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgTWVzc2FnZXMgb2YgYW55IHNldmVyaXR5OiBpbmZvcm1hdGlvbmFsLCB3YXJuaW5nLCBvciBmYXRhbC4KKyMgVG8gbWFpbnRhaW4gbWVzc2FnZSBudW1iZXJzICh0aGV5IGFyZSB2aXNpYmxlIHRvIGN1c3RvbWVycyksIGFkZCBuZXcgbWVzc2FnZXMgdG8gdGhlIGVuZC4KKworIyBVc2UgZm9sbG93aW5nIHByZWZpeGVzIGZvciBtZXNzYWdlcyBhbmQgaGludHMgd2hlbiBhcHByb3ByaWF0ZToKKyMgICAgQWZmIC0tIEFmZmluaXR5IG1lc3NhZ2VzLgorIyAgICBDbnMgLS0gQ29uc2lzdGVuY3kgY2hlY2sgZmFpbHVyZXMgKEtNUF9DT05TSVNURU5DWV9DSEVDSykuCisjICAgIEl0dCAtLSBJVFQgTm90aWZ5LXJlbGF0ZWQgbWVzc2FnZXMuCisjICAgIFJtbCAtLSBSTUwtcmVsYXRlZCBtZXNzYWdlcy4KKworTGlicmFyeUlzU2VyaWFsICAgICAgICAgICAgICAiTGlicmFyeSBpcyBcInNlcmlhbFwiLiIKK0NhbnRPcGVuTWVzc2FnZUNhdGFsb2cgICAgICAgIkNhbm5vdCBvcGVuIG1lc3NhZ2UgY2F0YWxvZyBcIiUxJHNcIjoiCitXaWxsVXNlRGVmYXVsdE1lc3NhZ2VzICAgICAgICJEZWZhdWx0IG1lc3NhZ2VzIHdpbGwgYmUgdXNlZC4iCitMb2NrSXNVbmluaXRpYWxpemVkICAgICAgICAgICIlMSRzOiBMb2NrIGlzIHVuaW5pdGlhbGl6ZWQiCitMb2NrU2ltcGxlVXNlZEFzTmVzdGFibGUgICAgICIlMSRzOiBMb2NrIHdhcyBpbml0aWFsaXplZCBhcyBzaW1wbGUsIGJ1dCB1c2VkIGFzIG5lc3RhYmxlIgorTG9ja05lc3RhYmxlVXNlZEFzU2ltcGxlICAgICAiJTEkczogTG9jayB3YXMgaW5pdGlhbGl6ZWQgYXMgbmVzdGFibGUsIGJ1dCB1c2VkIGFzIHNpbXBsZSIKK0xvY2tJc0FscmVhZHlPd25lZCAgICAgICAgICAgIiUxJHM6IExvY2sgaXMgYWxyZWFkeSBvd25lZCBieSByZXF1ZXN0aW5nIHRocmVhZCIKK0xvY2tTdGlsbE93bmVkICAgICAgICAgICAgICAgIiUxJHM6IExvY2sgaXMgc3RpbGwgb3duZWQgYnkgYSB0aHJlYWQiCitMb2NrVW5zZXR0aW5nRnJlZSAgICAgICAgICAgICIlMSRzOiBBdHRlbXB0IHRvIHJlbGVhc2UgYSBsb2NrIG5vdCBvd25lZCBieSBhbnkgdGhyZWFkIgorTG9ja1Vuc2V0dGluZ1NldEJ5QW5vdGhlciAgICAiJTEkczogQXR0ZW1wdCB0byByZWxlYXNlIGEgbG9jayBvd25lZCBieSBhbm90aGVyIHRocmVhZCIKK1N0YWNrT3ZlcmZsb3cgICAgICAgICAgICAgICAgIlN0YWNrIG92ZXJmbG93IGRldGVjdGVkIGZvciBPcGVuTVAgdGhyZWFkICMlMSRkIgorU3RhY2tPdmVybGFwICAgICAgICAgICAgICAgICAiU3RhY2sgb3ZlcmxhcCBkZXRlY3RlZC4gIgorQXNzZXJ0aW9uRmFpbHVyZSAgICAgICAgICAgICAiQXNzZXJ0aW9uIGZhaWx1cmUgYXQgJTEkcyglMiRkKS4iCitDYW50UmVnaXN0ZXJOZXdUaHJlYWQgICAgICAgICJVbmFibGUgdG8gcmVnaXN0ZXIgYSBuZXcgdXNlciB0aHJlYWQuIgorRHVwbGljYXRlTGlicmFyeSAgICAgICAgICAgICAiSW5pdGlhbGl6aW5nICUxJHMsIGJ1dCBmb3VuZCAlMiRzIGFscmVhZHkgaW5pdGlhbGl6ZWQuIgorQ2FudE9wZW5GaWxlRm9yUmVhZGluZyAgICAgICAiQ2Fubm90IG9wZW4gZmlsZSBcIiUxJHNcIiBmb3IgcmVhZGluZzoiCitDYW50R2V0RW52VmFyICAgICAgICAgICAgICAgICJHZXR0aW5nIGVudmlyb25tZW50IHZhcmlhYmxlIFwiJTEkc1wiIGZhaWxlZDoiCitDYW50U2V0RW52VmFyICAgICAgICAgICAgICAgICJTZXR0aW5nIGVudmlyb25tZW50IHZhcmlhYmxlIFwiJTEkc1wiIGZhaWxlZDoiCitDYW50R2V0RW52aXJvbm1lbnQgICAgICAgICAgICJHZXR0aW5nIGVudmlyb25tZW50IGZhaWxlZDoiCitCYWRCb29sVmFsdWUgICAgICAgICAgICAgICAgICIlMSRzPVwiJTIkc1wiOiBXcm9uZyB2YWx1ZSwgYm9vbGVhbiBleHBlY3RlZC4iCitTU1BOb3RCdWlsdEluICAgICAgICAgICAgICAgICJObyBIZWxwZXIgVGhyZWFkIHN1cHBvcnQgYnVpbHQgaW4gdGhpcyBPTVAgbGlicmFyeS4iCitTUFBTb3RmVGVybWluYXRlRmFpbGVkICAgICAgICJIZWxwZXIgdGhyZWFkIGZhaWxlZCB0byBzb2Z0IHRlcm1pbmF0ZS4iCitCdWZmZXJPdmVyZmxvdyAgICAgICAgICAgICAgICJCdWZmZXIgb3ZlcmZsb3cgZGV0ZWN0ZWQuIgorUmVhbFRpbWVTY2hlZE5vdFN1cHBvcnRlZCAgICAiUmVhbC10aW1lIHNjaGVkdWxpbmcgcG9saWN5IGlzIG5vdCBzdXBwb3J0ZWQuIgorUnVubmluZ0F0TWF4UHJpb3JpdHkgICAgICAgICAiT01QIGFwcGxpY2F0aW9uIGlzIHJ1bm5pbmcgYXQgbWF4aW11bSBwcmlvcml0eSB3aXRoIHJlYWwtdGltZSBzY2hlZHVsaW5nIHBvbGljeS4gIgorQ2FudENoYW5nZU1vbml0b3JQcmlvcml0eSAgICAiQ2hhbmdpbmcgcHJpb3JpdHkgb2YgdGhlIG1vbml0b3IgdGhyZWFkIGZhaWxlZDoiCitNb25pdG9yV2lsbFN0YXJ2ZSAgICAgICAgICAgICJEZWFkbG9ja3MgYXJlIGhpZ2hseSBwb3NzaWJsZSBkdWUgdG8gbW9uaXRvciB0aHJlYWQgc3RhcnZhdGlvbi4iCitDYW50U2V0TW9uaXRvclN0YWNrU2l6ZSAgICAgICJVbmFibGUgdG8gc2V0IG1vbml0b3IgdGhyZWFkIHN0YWNrIHNpemUgdG8gJTEkbHUgYnl0ZXM6IgorQ2FudFNldFdvcmtlclN0YWNrU2l6ZSAgICAgICAiVW5hYmxlIHRvIHNldCBPTVAgdGhyZWFkIHN0YWNrIHNpemUgdG8gJTEkbHUgYnl0ZXM6IgorQ2FudEluaXRUaHJlYWRBdHRycyAgICAgICAgICAiVGhyZWFkIGF0dHJpYnV0ZSBpbml0aWFsaXphdGlvbiBmYWlsZWQ6IgorQ2FudERlc3Ryb3lUaHJlYWRBdHRycyAgICAgICAiVGhyZWFkIGF0dHJpYnV0ZSBkZXN0cm95aW5nIGZhaWxlZDoiCitDYW50U2V0V29ya2VyU3RhdGUgICAgICAgICAgICJPTVAgdGhyZWFkIGpvaW5hYmxlIHN0YXRlIHNldHRpbmcgZmFpbGVkOiIKK0NhbnRTZXRNb25pdG9yU3RhdGUgICAgICAgICAgIk1vbml0b3IgdGhyZWFkIGpvaW5hYmxlIHN0YXRlIHNldHRpbmcgZmFpbGVkOiIKK05vUmVzb3VyY2VzRm9yV29ya2VyVGhyZWFkICAgIlN5c3RlbSB1bmFibGUgdG8gYWxsb2NhdGUgbmVjZXNzYXJ5IHJlc291cmNlcyBmb3IgT01QIHRocmVhZDoiCitOb1Jlc291cmNlc0Zvck1vbml0b3JUaHJlYWQgICJTeXN0ZW0gdW5hYmxlIHRvIGFsbG9jYXRlIG5lY2Vzc2FyeSByZXNvdXJjZXMgZm9yIHRoZSBtb25pdG9yIHRocmVhZDoiCitDYW50VGVybWluYXRlV29ya2VyVGhyZWFkICAgICJVbmFibGUgdG8gdGVybWluYXRlIE9NUCB0aHJlYWQ6IgorU2NoZWR1bGVLaW5kT3V0T2ZSYW5nZSAgICAgICAiV3Jvbmcgc2NoZWR1bGUgdHlwZSAlMSRkLCBzZWUgPG9tcC5oPiBvciA8b21wX2xpYi5oPiBmaWxlIGZvciB0aGUgbGlzdCBvZiB2YWx1ZXMgc3VwcG9ydGVkLiIKK1Vua25vd25TY2hlZHVsaW5nVHlwZSAgICAgICAgIlVua25vd24gc2NoZWR1bGluZyB0eXBlIFwiJTEkZFwiLiIKK0ludmFsaWRWYWx1ZSAgICAgICAgICAgICAgICAgIiUxJHMgdmFsdWUgXCIlMiRzXCIgaXMgaW52YWxpZC4iCitTbWFsbFZhbHVlICAgICAgICAgICAgICAgICAgICIlMSRzIHZhbHVlIFwiJTIkc1wiIGlzIHRvbyBzbWFsbC4iCitMYXJnZVZhbHVlICAgICAgICAgICAgICAgICAgICIlMSRzIHZhbHVlIFwiJTIkc1wiIGlzIHRvbyBsYXJnZS4iCitTdGdJbnZhbGlkVmFsdWUgICAgICAgICAgICAgICIlMSRzOiBcIiUyJHNcIiBpcyBhbiBpbnZhbGlkIHZhbHVlOyBpZ25vcmVkLiIKK0JhcnJSZWxlYXNlVmFsdWVJbnZhbGlkICAgICAgIiUxJHMgcmVsZWFzZSB2YWx1ZSBcIiUyJHNcIiBpcyBpbnZhbGlkLiIKK0JhcnJHYXRoZXJWYWx1ZUludmFsaWQgICAgICAgIiUxJHMgZ2F0aGVyIHZhbHVlIFwiJTIkc1wiIGlzIGludmFsaWQuIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiJTEkcyBzdXBwb3J0ZWQgb25seSBvbiBkZWJ1ZyBidWlsZHM7IGlnbm9yZWQuIgorUGFyUmFuZ2VTeW50YXggICAgICAgICAgICAgICAiU3ludGF4IGVycm9yOiBVc2FnZTogJTEkcz1bIHJvdXRpbmU9PGZ1bmM+IHwgZmlsZW5hbWU9PGZpbGU+IHwgcmFuZ2U9PGxiPjo8dWI+ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInwgZXhjbF9yYW5nZT08bGI+Ojx1Yj4gXSwuLi4iCitVbmJhbGFuY2VkUXVvdGVzICAgICAgICAgICAgICJVbmJhbGFuY2VkIHF1b3RlcyBpbiAlMSRzLiIKK0VtcHR5U3RyaW5nICAgICAgICAgICAgICAgICAgIkVtcHR5IHN0cmluZyBzcGVjaWZpZWQgZm9yICUxJHM7IGlnbm9yZWQuIgorTG9uZ1ZhbHVlICAgICAgICAgICAgICAgICAgICAiJTEkcyB2YWx1ZSBpcyB0b28gbG9uZzsgaWdub3JlZC4iCitJbnZhbGlkQ2xhdXNlICAgICAgICAgICAgICAgICIlMSRzOiBJbnZhbGlkIGNsYXVzZSBpbiBcIiUyJHNcIi4iCitFbXB0eUNsYXVzZSAgICAgICAgICAgICAgICAgICJFbXB0eSBjbGF1c2UgaW4gJTEkcy4iCitJbnZhbGlkQ2h1bmsgICAgICAgICAgICAgICAgICIlMSRzIHZhbHVlIFwiJTIkc1wiIGlzIGludmFsaWQgY2h1bmsgc2l6ZS4iCitMYXJnZUNodW5rICAgICAgICAgICAgICAgICAgICIlMSRzIHZhbHVlIFwiJTIkc1wiIGlzIHRvIGxhcmdlIGNodW5rIHNpemUuIgorSWdub3JlQ2h1bmsgICAgICAgICAgICAgICAgICAiJTEkcyB2YWx1ZSBcIiUyJHNcIiBpcyBpZ25vcmVkLiIKK0NhbnRHZXRQcm9jRnJlcSAgICAgICAgICAgICAgIkNhbm5vdCBnZXQgcHJvY2Vzc29yIGZyZXF1ZW5jeSwgdXNpbmcgemVybyBLTVBfSVRUX1BSRVBBUkVfREVMQVkuIgorRW52UGFyYWxsZWxXYXJuICAgICAgICAgICAgICAiJTEkcyBtdXN0IGJlIHNldCBwcmlvciB0byBmaXJzdCBwYXJhbGxlbCByZWdpb247IGlnbm9yZWQuIgorQWZmUGFyYW1EZWZpbmVkICAgICAgICAgICAgICAiJTEkczogcGFyYW1ldGVyIGhhcyBiZWVuIHNwZWNpZmllZCBhbHJlYWR5LCBpZ25vcmluZyBcIiUyJHNcIi4iCitBZmZJbnZhbGlkUGFyYW0gICAgICAgICAgICAgICIlMSRzOiBwYXJhbWV0ZXIgaW52YWxpZCwgaWdub3JpbmcgXCIlMiRzXCIuIgorQWZmTWFueVBhcmFtcyAgICAgICAgICAgICAgICAiJTEkczogdG9vIG1hbnkgaW50ZWdlciBwYXJhbWV0ZXJzIHNwZWNpZmllZCwgaWdub3JpbmcgXCIlMiRzXCIuIgorQWZmTWFueVBhcmFtc0ZvckxvZ2ljICAgICAgICAiJTEkczogdG9vIG1hbnkgaW50ZWdlciBwYXJhbWV0ZXJzIHNwZWNpZmllZCBmb3IgbG9naWNhbCBvciBwaHlzaWNhbCB0eXBlLCBpZ25vcmluZyBcIiUyJGRcIi4iCitBZmZOb1BhcmFtICAgICAgICAgICAgICAgICAgICIlMSRzOiAnJTIkcycgdHlwZSBkb2VzIG5vdCB0YWtlIGFueSBpbnRlZ2VyIHBhcmFtZXRlcnMsIGlnbm9yaW5nIHRoZW0uIgorQWZmTm9Qcm9jTGlzdCAgICAgICAgICAgICAgICAiJTEkczogcHJvY2xpc3Qgbm90IHNwZWNpZmllZCB3aXRoIGV4cGxpY2l0IGFmZmluaXR5IHR5cGUsIHVzaW5nIFwibm9uZVwiLiIKK0FmZlByb2NMaXN0Tm9UeXBlICAgICAgICAgICAgIiUxJHM6IHByb2NsaXN0IHNwZWNpZmllZCwgc2V0dGluZyBhZmZpbml0eSB0eXBlIHRvIFwiZXhwbGljaXRcIi4iCitBZmZQcm9jTGlzdE5vdEV4cGxpY2l0ICAgICAgICIlMSRzOiBwcm9jbGlzdCBzcGVjaWZpZWQgd2l0aG91dCBcImV4cGxpY2l0XCIgYWZmaW5pdHkgdHlwZSwgcHJvY2xpc3QgaWdub3JlZC4iCitBZmZTeW50YXhFcnJvciAgICAgICAgICAgICAgICIlMSRzOiBzeW50YXggZXJyb3IsIG5vdCB1c2luZyBhZmZpbml0eS4iCitBZmZaZXJvU3RyaWRlICAgICAgICAgICAgICAgICIlMSRzOiByYW5nZSBlcnJvciAoemVybyBzdHJpZGUpLCBub3QgdXNpbmcgYWZmaW5pdHkuIgorQWZmU3RhcnRHcmVhdGVyRW5kICAgICAgICAgICAiJTEkczogcmFuZ2UgZXJyb3IgKCUyJGQgPiAlMyRkKSwgbm90IHVzaW5nIGFmZmluaXR5LiIKK0FmZlN0cmlkZUxlc3NaZXJvICAgICAgICAgICAgIiUxJHM6IHJhbmdlIGVycm9yICglMiRkIDwgJTMkZCAmIHN0cmlkZSA8IDApLCBub3QgdXNpbmcgYWZmaW5pdHkuIgorQWZmUmFuZ2VUb29CaWcgICAgICAgICAgICAgICAiJTEkczogcmFuZ2UgZXJyb3IgKCglMiRkLSUzJGQpLyU0JGQgdG9vIGJpZyksIG5vdCB1c2luZyBhZmZpbml0eS4iCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICIlMSRzOiAlMiRzIGlzIGRlZmluZWQuICUzJHMgd2lsbCBiZSBpZ25vcmVkLiIKK0FmZk5vdFN1cHBvcnRlZCAgICAgICAgICAgICAgIiUxJHM6IGFmZmluaXR5IG5vdCBzdXBwb3J0ZWQsIHVzaW5nIFwiZGlzYWJsZWRcIi4iCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICIlMSRzOiBhZmZpbml0eSBvbmx5IHN1cHBvcnRlZCBmb3IgSW50ZWwoUikgcHJvY2Vzc29ycy4iCitHZXRBZmZTeXNDYWxsTm90U3VwcG9ydGVkICAgICIlMSRzOiBnZXRhZmZpbml0eSBzeXN0ZW0gY2FsbCBub3Qgc3VwcG9ydGVkLiIKK1NldEFmZlN5c0NhbGxOb3RTdXBwb3J0ZWQgICAgIiUxJHM6IHNldGFmZmluaXR5IHN5c3RlbSBjYWxsIG5vdCBzdXBwb3J0ZWQuIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiJTEkczogcHRocmVhZF9hZmZfc2V0X25wIGNhbGwgbm90IGZvdW5kLiIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIiUxJHM6IHB0aHJlYWRfZ2V0X251bV9yZXNvdXJjZXNfbnAgY2FsbCBub3QgZm91bmQuIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiJTEkczogdGhlIE9TIGtlcm5lbCBkb2VzIG5vdCBzdXBwb3J0IGFmZmluaXR5LiIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIiUxJHM6IHB0aHJlYWRfZ2V0X251bV9yZXNvdXJjZXNfbnAgcmV0dXJuZWQgJTIkZC4iCitBZmZDYW50R2V0TWFza1NpemUgICAgICAgICAgICIlMSRzOiBjYW5ub3QgZGV0ZXJtaW5lIHByb3BlciBhZmZpbml0eSBtYXNrIHNpemUuIgorUGFyc2VTaXplSW50V2FybiAgICAgICAgICAgICAiJTEkcz1cIiUyJHNcIjogJTMkcy4iCitQYXJzZUV4dHJhQ2hhcnNXYXJuICAgICAgICAgICIlMSRzOiBleHRyYSB0cmFpbGluZyBjaGFyYWN0ZXJzIGlnbm9yZWQ6IFwiJTIkc1wiLiIKK1Vua25vd25Gb3JjZVJlZHVjdGlvbiAgICAgICAgIiUxJHM6IHVua25vd24gbWV0aG9kIFwiJTIkc1wiLiIKK1RpbWVyVXNlR2V0dGltZW9mZGF5ICAgICAgICAgIktNUF9TVEFUU19USU1FUjogY2xvY2tfZ2V0dGltZSBpcyB1bmRlZmluZWQsIHVzaW5nIGdldHRpbWVvZmRheS4iCitUaW1lck5lZWRNb3JlUGFyYW0gICAgICAgICAgICJLTVBfU1RBVFNfVElNRVI6IFwiJTEkc1wiIG5lZWRzIGFkZGl0aW9uYWwgcGFyYW1ldGVyLCBlLmcuICdjbG9ja19nZXR0aW1lLDInLiBVc2luZyBnZXR0aW1lb2ZkYXkuIgorVGltZXJJbnZhbGlkUGFyYW0gICAgICAgICAgICAiS01QX1NUQVRTX1RJTUVSOiBjbG9ja19nZXR0aW1lIHBhcmFtZXRlciBcIiUxJHNcIiBpcyBpbnZhbGlkLCB1c2luZyBnZXR0aW1lb2ZkYXkuIgorVGltZXJHZXR0aW1lRmFpbGVkICAgICAgICAgICAiS01QX1NUQVRTX1RJTUVSOiBjbG9ja19nZXR0aW1lIGZhaWxlZCwgdXNpbmcgZ2V0dGltZW9mZGF5LiIKK1RpbWVyVW5rbm93bkZ1bmN0aW9uICAgICAgICAgIktNUF9TVEFUU19USU1FUjogY2xvY2sgZnVuY3Rpb24gdW5rbm93biAoaWdub3JpbmcgdmFsdWUgXCIlMSRzXCIpLiIKK1Vua25vd25TY2hlZFR5cGVEZXRlY3RlZCAgICAgIlVua25vd24gc2NoZWR1bGluZyB0eXBlIGRldGVjdGVkLiIKK0Rpc3BhdGNoTWFueVRocmVhZHMgICAgICAgICAgIlRvbyBtYW55IHRocmVhZHMgdG8gdXNlIGFuYWx5dGljYWwgZ3VpZGVkIHNjaGVkdWxpbmcgLSBzd2l0Y2hpbmcgdG8gaXRlcmF0aXZlIGd1aWRlZCBzY2hlZHVsaW5nLiIKK0l0dExvb2t1cEZhaWxlZCAgICAgICAgICAgICAgIml0dG5vdGlmeTogTG9va3VwIG9mIFwiJTEkc1wiIGZ1bmN0aW9uIGluIFwiJTIkc1wiIGxpYnJhcnkgZmFpbGVkLiIKK0l0dExvYWRMaWJGYWlsZWQgICAgICAgICAgICAgIml0dG5vdGlmeTogTG9hZGluZyBcIiUxJHNcIiBsaWJyYXJ5IGZhaWxlZC4iCitJdHRBbGxOb3RpZkRpc2FibGVkICAgICAgICAgICJpdHRub3RpZnk6IEFsbCBpdHQgbm90aWZpY2F0aW9ucyBkaXNhYmxlZC4iCitJdHRPYmpOb3RpZkRpc2FibGVkICAgICAgICAgICJpdHRub3RpZnk6IE9iamVjdCBzdGF0ZSBpdHQgbm90aWZpY2F0aW9ucyBkaXNhYmxlZC4iCitJdHRNYXJrTm90aWZEaXNhYmxlZCAgICAgICAgICJpdHRub3RpZnk6IE1hcmsgaXR0IG5vdGlmaWNhdGlvbnMgZGlzYWJsZWQuIgorSXR0VW5sb2FkTGliRmFpbGVkICAgICAgICAgICAiaXR0bm90aWZ5OiBVbmxvYWRpbmcgXCIlMSRzXCIgbGlicmFyeSBmYWlsZWQuIgorQ2FudEZvcm1UaHJUZWFtICAgICAgICAgICAgICAiQ2Fubm90IGZvcm0gYSB0ZWFtIHdpdGggJTEkZCB0aHJlYWRzLCB1c2luZyAlMiRkIGluc3RlYWQuIgorQWN0aXZlTGV2ZWxzTmVnYXRpdmUgICAgICAgICAiUmVxdWVzdGVkIG51bWJlciBvZiBhY3RpdmUgcGFyYWxsZWwgbGV2ZWxzIFwiJTEkZFwiIGlzIG5lZ2F0aXZlOyBpZ25vcmVkLiIKK0FjdGl2ZUxldmVsc0V4Y2VlZExpbWl0ICAgICAgIlJlcXVlc3RlZCBudW1iZXIgb2YgYWN0aXZlIHBhcmFsbGVsIGxldmVscyBcIiUxJGRcIiBleGNlZWRzIHN1cHBvcnRlZCBsaW1pdDsgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhlIGZvbGxvd2luZyBsaW1pdCB2YWx1ZSB3aWxsIGJlIHVzZWQ6IFwiJTEkZFwiLiIKK1NldExpYnJhcnlJbmNvcnJlY3RDYWxsICAgICAgImttcF9zZXRfbGlicmFyeSBtdXN0IG9ubHkgYmUgY2FsbGVkIGZyb20gdGhlIHRvcCBsZXZlbCBzZXJpYWwgdGhyZWFkOyBpZ25vcmVkLiIKK0ZhdGFsU3lzRXJyb3IgICAgICAgICAgICAgICAgIkZhdGFsIHN5c3RlbSBlcnJvciBkZXRlY3RlZC4iCitPdXRPZkhlYXBNZW1vcnkgICAgICAgICAgICAgICJPdXQgb2YgaGVhcCBtZW1vcnkuIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiQ2xlYXJpbmcgX19LTVBfUkVHSVNURVJFRF9MSUIgZW52IHZhciBmYWlsZWQuIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiUmVnaXN0ZXJpbmcgbGlicmFyeSB3aXRoIGVudiB2YXIgZmFpbGVkLiIKK1VzaW5nX2ludF9WYWx1ZSAgICAgICAgICAgICAgIiUxJHMgdmFsdWUgXCIlMiRkXCIgd2lsbCBiZSB1c2VkLiIKK1VzaW5nX3VpbnRfVmFsdWUgICAgICAgICAgICAgIiUxJHMgdmFsdWUgXCIlMiR1XCIgd2lsbCBiZSB1c2VkLiIKK1VzaW5nX3VpbnQ2NF9WYWx1ZSAgICAgICAgICAgIiUxJHMgdmFsdWUgXCIlMiRzXCIgd2lsbCBiZSB1c2VkLiIKK1VzaW5nX3N0cl9WYWx1ZSAgICAgICAgICAgICAgIiUxJHMgdmFsdWUgXCIlMiRzXCIgd2lsbCBiZSB1c2VkLiIKK01heFZhbHVlVXNpbmcgICAgICAgICAgICAgICAgIiUxJHMgbWF4aW11bSB2YWx1ZSBcIiUyJGRcIiB3aWxsIGJlIHVzZWQuIgorTWluVmFsdWVVc2luZyAgICAgICAgICAgICAgICAiJTEkcyBtaW5pbXVtIHZhbHVlIFwiJTIkZFwiIHdpbGwgYmUgdXNlZC4iCitNZW1vcnlBbGxvY0ZhaWxlZCAgICAgICAgICAgICJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQuIgorRmlsZU5hbWVUb29Mb25nICAgICAgICAgICAgICAiRmlsZSBuYW1lIHRvbyBsb25nLiIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIkxvY2sgdGFibGUgb3ZlcmZsb3cuIgorTWFueVRocmVhZHNGb3JUUERpcmVjdGl2ZSAgICAiVG9vIG1hbnkgdGhyZWFkcyB0byB1c2UgdGhyZWFkcHJpdmF0ZSBkaXJlY3RpdmUuIgorQWZmaW5pdHlJbnZhbGlkTWFzayAgICAgICAgICAiJTEkczogaW52YWxpZCBtYXNrLiIKK1dyb25nRGVmaW5pdGlvbiAgICAgICAgICAgICAgIldyb25nIGRlZmluaXRpb24uIgorVExTU2V0VmFsdWVGYWlsZWQgICAgICAgICAgICAiV2luZG93cyogT1M6IFRMUyBTZXQgVmFsdWUgZmFpbGVkLiIKK1RMU091dE9mSW5kZXhlcyAgICAgICAgICAgICAgIldpbmRvd3MqIE9TOiBUTFMgb3V0IG9mIGluZGV4ZXMuIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiUERPTkUgZGlyZWN0aXZlIG11c3QgYmUgbmVzdGVkIHdpdGhpbiBhIERPIGRpcmVjdGl2ZS4iCitDYW50R2V0TnVtQXZhaWxDUFUgICAgICAgICAgICJDYW5ub3QgZ2V0IG51bWJlciBvZiBhdmFpbGFibGUgQ1BVcy4iCitBc3N1bWVkTnVtQ1BVICAgICAgICAgICAgICAgICJBc3N1bWVkIG51bWJlciBvZiBDUFVzIGlzIDIuIgorRXJyb3JJbml0aWFsaXplQWZmaW5pdHkgICAgICAiRXJyb3IgaW5pdGlhbGl6aW5nIGFmZmluaXR5IC0gbm90IHVzaW5nIGFmZmluaXR5LiIKK0FmZlRocmVhZHNNYXlNaWdyYXRlICAgICAgICAgIlRocmVhZHMgbWF5IG1pZ3JhdGUgYWNyb3NzIGFsbCBhdmFpbGFibGUgT1MgcHJvY3MgKGdyYW51bGFyaXR5IHNldHRpbmcgdG9vIGNvYXJzZSkuIgorQWZmSWdub3JlSW52YWxpZFByb2NJRCAgICAgICAiSWdub3JpbmcgaW52YWxpZCBPUyBwcm9jIElEICUxJGQuIgorQWZmTm9WYWxpZFByb2NJRCAgICAgICAgICAgICAiTm8gdmFsaWQgT1MgcHJvYyBJRHMgc3BlY2lmaWVkIC0gbm90IHVzaW5nIGFmZmluaXR5LiIKK1VzaW5nRmxhdE9TICAgICAgICAgICAgICAgICAgIiUxJHMgLSB1c2luZyBcImZsYXRcIiBPUyA8LT4gcGh5c2ljYWwgcHJvYyBtYXBwaW5nLiIKK1VzaW5nRmxhdE9TRmlsZSAgICAgICAgICAgICAgIiUxJHM6ICUyJHMgLSB1c2luZyBcImZsYXRcIiBPUyA8LT4gcGh5c2ljYWwgcHJvYyBtYXBwaW5nLiIKK1VzaW5nRmxhdE9TRmlsZUxpbmUgICAgICAgICAgIiUxJHMsIGxpbmUgJTIkZDogJTMkcyAtIHVzaW5nIFwiZmxhdFwiIE9TIDwtPiBwaHlzaWNhbCBwcm9jIG1hcHBpbmcuIgorRmlsZU1zZ0V4aXRpbmcgICAgICAgICAgICAgICAiJTEkczogJTIkcyAtIGV4aXRpbmcuIgorRmlsZUxpbmVNc2dFeGl0aW5nICAgICAgICAgICAiJTEkcywgbGluZSAlMiRkOiAlMyRzIC0gZXhpdGluZy4iCitDb25zdHJ1Y3RJZGVudEludmFsaWQgICAgICAgICJDb25zdHJ1Y3QgaWRlbnRpZmllciBpbnZhbGlkLiIKK1RocmVhZElkZW50SW52YWxpZCAgICAgICAgICAgIlRocmVhZCBpZGVudGlmaWVyIGludmFsaWQuIgorUlRMTm90SW5pdGlhbGl6ZWQgICAgICAgICAgICAicnVudGltZSBsaWJyYXJ5IG5vdCBpbml0aWFsaXplZC4iCitUUENvbW1vbkJsb2Nrc0luY29uc2lzdCAgICAgICJJbmNvbnNpc3RlbnQgVEhSRUFEUFJJVkFURSBjb21tb24gYmxvY2sgZGVjbGFyYXRpb25zIGFyZSBub24tY29uZm9ybWluZyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbmQgYXJlIHVuc3VwcG9ydGVkLiBFaXRoZXIgYWxsIHRocmVhZHByaXZhdGUgY29tbW9uIGJsb2NrcyBtdXN0IGJlIGRlY2xhcmVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlkZW50aWNhbGx5LCBvciB0aGUgbGFyZ2VzdCBpbnN0YW5jZSBvZiBlYWNoIHRocmVhZHByaXZhdGUgY29tbW9uIGJsb2NrICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm11c3QgYmUgcmVmZXJlbmNlZCBmaXJzdCBkdXJpbmcgdGhlIHJ1bi4iCitDYW50U2V0VGhyZWFkQWZmTWFzayAgICAgICAgICJDYW5ub3Qgc2V0IHRocmVhZCBhZmZpbml0eSBtYXNrLiIKK0NhbnRTZXRUaHJlYWRQcmlvcml0eSAgICAgICAgIkNhbm5vdCBzZXQgdGhyZWFkIHByaW9yaXR5LiIKK0NhbnRDcmVhdGVUaHJlYWQgICAgICAgICAgICAgIkNhbm5vdCBjcmVhdGUgdGhyZWFkLiIKK0NhbnRDcmVhdGVFdmVudCAgICAgICAgICAgICAgIkNhbm5vdCBjcmVhdGUgZXZlbnQuIgorQ2FudFNldEV2ZW50ICAgICAgICAgICAgICAgICAiQ2Fubm90IHNldCBldmVudC4iCitDYW50Q2xvc2VIYW5kbGUgICAgICAgICAgICAgICJDYW5ub3QgY2xvc2UgaGFuZGxlLiIKK1Vua25vd25MaWJyYXJ5VHlwZSAgICAgICAgICAgIlVua25vd24gbGlicmFyeSB0eXBlOiAlMSRkLiIKK1JlYXBNb25pdG9yRXJyb3IgICAgICAgICAgICAgIk1vbml0b3IgZGlkIG5vdCByZWFwIHByb3Blcmx5LiIKK1JlYXBXb3JrZXJFcnJvciAgICAgICAgICAgICAgIldvcmtlciB0aHJlYWQgZmFpbGVkIHRvIGpvaW4uIgorQ2hhbmdlVGhyZWFkQWZmTWFza0Vycm9yICAgICAiQ2Fubm90IGNoYW5nZSB0aHJlYWQgYWZmaW5pdHkgbWFzay4iCitUaHJlYWRzTWlncmF0ZSAgICAgICAgICAgICAgICIlMSRzOiBUaHJlYWRzIG1heSBtaWdyYXRlIGFjcm9zcyAlMiRkIGlubmVybW9zdCBsZXZlbHMgb2YgbWFjaGluZSIKK0RlY3JlYXNlVG9UaHJlYWRzICAgICAgICAgICAgIiUxJHM6IGRlY3JlYXNlIHRvICUyJGQgdGhyZWFkcyIKK0luY3JlYXNlVG9UaHJlYWRzICAgICAgICAgICAgIiUxJHM6IGluY3JlYXNlIHRvICUyJGQgdGhyZWFkcyIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIiUxJHM6IEludGVybmFsIHRocmVhZCAlMiRkIGJvdW5kIHRvIE9TIHByb2Mgc2V0ICUzJHMiCitBZmZDYXBhYmxlVXNlQ3B1aW5mbyAgICAgICAgICIlMSRzOiBBZmZpbml0eSBjYXBhYmxlLCB1c2luZyBjcHVpbmZvIGZpbGUiCitBZmZVc2VHbG9iQ3B1aWQgICAgICAgICAgICAgICIlMSRzOiBBZmZpbml0eSBjYXBhYmxlLCB1c2luZyBnbG9iYWwgY3B1aWQgaW5mbyIKK0FmZkNhcGFibGVVc2VGbGF0ICAgICAgICAgICAgIiUxJHM6IEFmZmluaXR5IGNhcGFibGUsIHVzaW5nIGRlZmF1bHQgXCJmbGF0XCIgdG9wb2xvZ3kiCitBZmZOb3RDYXBhYmxlVXNlTG9jQ3B1aWQgICAgICIlMSRzOiBBZmZpbml0eSBub3QgY2FwYWJsZSwgdXNpbmcgbG9jYWwgY3B1aWQgaW5mbyIKK0FmZk5vdENhcGFibGVVc2VDcHVpbmZvICAgICAgIiUxJHM6IEFmZmluaXR5IG5vdCBjYXBhYmxlLCB1c2luZyBjcHVpbmZvIGZpbGUiCitBZmZGbGF0VG9wb2xvZ3kgICAgICAgICAgICAgICIlMSRzOiBBZmZpbml0eSBub3QgY2FwYWJsZSwgYXNzdW1taW5nIFwiZmxhdFwiIHRvcG9sb2d5IgorSW5pdE9TUHJvY1NldFJlc3BlY3QgICAgICAgICAiJTEkczogSW5pdGlhbCBPUyBwcm9jIHNldCByZXNwZWN0ZWQ6ICUyJHMiCitJbml0T1NQcm9jU2V0Tm90UmVzcGVjdCAgICAgICIlMSRzOiBJbml0aWFsIE9TIHByb2Mgc2V0IG5vdCByZXNwZWN0ZWQ6ICUyJHMiCitBdmFpbGFibGVPU1Byb2MgICAgICAgICAgICAgICIlMSRzOiAlMiRkIGF2YWlsYWJsZSBPUyBwcm9jcyIKK1VuaWZvcm0gICAgICAgICAgICAgICAgICAgICAgIiUxJHM6IFVuaWZvcm0gdG9wb2xvZ3kiCitOb25Vbmlmb3JtICAgICAgICAgICAgICAgICAgICIlMSRzOiBOb251bmlmb3JtIHRvcG9sb2d5IgorVG9wb2xvZ3kgICAgICAgICAgICAgICAgICAgICAiJTEkczogJTIkZCBwYWNrYWdlcyB4ICUzJGQgY29yZXMvcGtnIHggJTQkZCB0aHJlYWRzL2NvcmUgKCU1JGQgdG90YWwgY29yZXMpIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiJTEkczogT1MgcHJvYyB0byBwaHlzaWNhbCB0aHJlYWQgbWFwIChbXSA9PiBsZXZlbCBub3QgaW4gbWFwKToiCitPU1Byb2NUb1BhY2thZ2UgICAgICAgICAgICAgICIlMSRzOiBPUyBwcm9jIDxuPiBtYXBzIHRvIDxuPnRoIHBhY2thZ2UgY29yZSAwIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiJTEkczogT1MgcHJvYyAlMiRkIG1hcHMgdG8gcGFja2FnZSAlMyRkIFtjb3JlICU0JGRdIFt0aHJlYWQgJTUkZF0iCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICIlMSRzOiBPUyBwcm9jICUyJGQgbWFwcyB0byBbcGFja2FnZSAlMyRkXSBbY29yZSAlNCRkXSBbdGhyZWFkICU1JGRdIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiJTEkczogT1MgcHJvYyAlMiRkIG1hcHMgdG8gW3BhY2thZ2UgJTMkZF0gW2NvcmUgJTQkZF0gdGhyZWFkICU1JGQiCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICIlMSRzOiBPUyBwcm9jICUyJGQgbWFwcyB0byBbcGFja2FnZSAlMyRkXSBjb3JlICU0JGQgW3RocmVhZCAlNSRkXSIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIiUxJHM6IE9TIHByb2MgJTIkZCBtYXBzIHRvIHBhY2thZ2UgJTMkZCBbY29yZSAlNCRkXSBbdGhyZWFkICU1JGRdIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiJTEkczogT1MgcHJvYyAlMiRkIG1hcHMgdG8gW3BhY2thZ2UgJTMkZF0gY29yZSAlNCRkIHRocmVhZCAlNSRkIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiJTEkczogT1MgcHJvYyAlMiRkIG1hcHMgdG8gcGFja2FnZSAlMyRkIGNvcmUgJTQkZCBbdGhyZWFkICU1JGRdIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiJTEkczogT1MgcHJvYyAlMiRkIG1hcHMgdG8gcGFja2FnZSAlMyRkIFtjb3JlICU0JGRdIHRocmVhZCAlNSRkIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiJTEkczogT1MgcHJvYyAlMiRkIG1hcHMgdG8gcGFja2FnZSAlMyRkIGNvcmUgJTQkZCB0aHJlYWQgJTUkZCIKK09TUHJvY01hcFRvUGFjayAgICAgICAgICAgICAgIiUxJHM6IE9TIHByb2MgJTIkZCBtYXBzIHRvICUzJHMiCitDaGFuZ2VBZmZNYXNrICAgICAgICAgICAgICAgICIlMSRzOiBJbnRlcm5hbCB0aHJlYWQgJTIkZCBjaGFuZ2VkIGFmZmluaXR5IG1hc2sgZnJvbSAlMyRzIHRvICU0JHMiCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICIlMSRzOiBPUyBwcm9jICUyJGQgbWFwcyB0byBwYWNrYWdlICUzJGQsIENQVSAlNCRkLCBUUFUgJTUkZCIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIiUxJHM6IE9TIHByb2MgJTIkZCBtYXBzIHRvIHBhY2thZ2UgJTMkZCwgQ1BVICU0JGQiCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICIlMSRzOiBIVCBlbmFibGVkOyAlMiRkIHBhY2thZ2VzOyAlMyRkIFRQVTsgJTQkZCBUUFVzIHBlciBwYWNrYWdlIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiJTEkczogSFQgZGlzYWJsZWQ7ICUyJGQgcGFja2FnZXMiCitCYXJyaWVyc0luRGlmZmVyZW50T3JkZXIgICAgICJUaHJlYWRzIGVuY291bnRlcmVkIGJhcnJpZXJzIGluIGRpZmZlcmVudCBvcmRlci4gIgorRnVuY3Rpb25FcnJvciAgICAgICAgICAgICAgICAiRnVuY3Rpb24gJTEkcyBmYWlsZWQ6IgorVG9wb2xvZ3lFeHRyYSAgICAgICAgICAgICAgICAiJTEkczogJTIkcyBwYWNrYWdlcyB4ICUzJGQgY29yZXMvcGtnIHggJTQkZCB0aHJlYWRzL2NvcmUgKCU1JGQgdG90YWwgY29yZXMpIgorV3JvbmdNZXNzYWdlQ2F0YWxvZyAgICAgICAgICAiSW5jb21wYXRpYmxlIG1lc3NhZ2UgY2F0YWxvZyBcIiUxJHNcIjogVmVyc2lvbiBcIiUyJHNcIiBmb3VuZCwgdmVyc2lvbiBcIiUzJHNcIiBleHBlY3RlZC4iCitTdGdJZ25vcmVkICAgICAgICAgICAgICAgICAgICIlMSRzOiBpZ25vcmVkIGJlY2F1c2UgJTMkcyBoYXMgYmVlbiBkZWZpbmVkIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAlMSwgJTIgLS0gbmFtZSBhbmQgdmFsdWUgb2YgaWdub3JlZCB2YXJpYWJsZSwgJTMgLS0gbmFtZSBvZiB2YXJpYWJsZSB3aXRoIGhpZ2hlciBwcmlvcml0eS4KK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIiUxJHM6IG92ZXJyaWRlcyAlMyRzIHNwZWNpZmllZCBiZWZvcmUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICUxLCAlMiAtLSBuYW1lIGFuZCB2YWx1ZSBvZiB0aGUgb3ZlcnJpZGluZyB2YXJpYWJsZSwgJTMgLS0gbmFtZSBvZiBvdmVycmlkZW4gdmFyaWFibGUuCisKKyMgLS0tIE9wZW5NUCBlcnJvcnMgZGV0ZWN0ZWQgYXQgcnVudGltZSAtLS0KKyMKKyMgICAgJTEgaXMgdGhlIG5hbWUgb2YgT3Blbk1QIGNvbnN0cnVjdCAoZm9ybWF0dGVkIHdpdGggIlByYWdtYSIgZm9ybWF0KS4KKyMKK0Nuc0JvdW5kVG9Xb3Jrc2hhcmluZyAgICAgICAgIiUxJHMgbXVzdCBiZSBib3VuZCB0byBhIHdvcmstc2hhcmluZyBvciB3b3JrLXF1ZXVpbmcgY29uc3RydWN0IHdpdGggYW4gXCJvcmRlcmVkXCIgY2xhdXNlIgorQ25zRGV0ZWN0ZWRFbmQgICAgICAgICAgICAgICAiRGV0ZWN0ZWQgZW5kIG9mICUxJHMgd2l0aG91dCBmaXJzdCBleGVjdXRpbmcgYSBjb3JyZXNwb25kaW5nIGJlZ2lubmluZy4iCitDbnNJdGVyYXRpb25SYW5nZVRvb0xhcmdlICAgICJJdGVyYXRpb24gcmFuZ2UgdG9vIGxhcmdlIGluICUxJHMuIgorQ25zTG9vcEluY3JaZXJvUHJvaGliaXRlZCAgICAiJTEkcyBtdXN0IG5vdCBoYXZlIGEgbG9vcCBpbmNyZW1lbnQgdGhhdCBldmFsdWF0ZXMgdG8gemVyby4iCisjCisjICAgICUxIGlzIHRoZSBuYW1lIG9mIHRoZSBmaXJzdCBPcGVuTVAgY29uc3RydWN0LCAlMiAtLSB0aGUgbmFtZSBvZiB0aGUgc2Vjb25kIG9uZSAoYm90aCBmb3JtYXR0ZWQgd2l0aCAiUHJhZ21hIiBmb3JtYXQpLgorIworQ25zRXhwZWN0ZWRFbmQgICAgICAgICAgICAgICAiRXhwZWN0ZWQgZW5kIG9mICUxJHM7ICUyJHMsIGhvd2V2ZXIsIGhhcyBtb3N0IHJlY2VudGx5IGJlZ3VuIGV4ZWN1dGlvbi4iCitDbnNJbnZhbGlkTmVzdGluZyAgICAgICAgICAgICIlMSRzIGlzIGluY29ycmVjdGx5IG5lc3RlZCB3aXRoaW4gJTIkcyIKK0Nuc011bHRpcGxlTmVzdGluZyAgICAgICAgICAgIiUxJHMgY2Fubm90IGJlIGV4ZWN1dGVkIG11bHRpcGxlIHRpbWVzIGR1cmluZyBleGVjdXRpb24gb2Ygb25lIHBhcmFsbGVsIGl0ZXJhdGlvbi9zZWN0aW9uIG9mICUyJHMiCitDbnNOZXN0aW5nU2FtZU5hbWUgICAgICAgICAgICIlMSRzIGlzIGluY29ycmVjdGx5IG5lc3RlZCB3aXRoaW4gJTIkcyBvZiB0aGUgc2FtZSBuYW1lIgorQ25zTm9PcmRlcmVkQ2xhdXNlICAgICAgICAgICAiJTEkcyBpcyBpbmNvcnJlY3RseSBuZXN0ZWQgd2l0aGluICUyJHMgdGhhdCBkb2VzIG5vdCBoYXZlIGFuIFwib3JkZXJlZFwiIGNsYXVzZSIKK0Nuc05vdEluVGFza0NvbnN0cnVjdCAgICAgICAgIiUxJHMgaXMgaW5jb3JyZWN0bHkgbmVzdGVkIHdpdGhpbiAlMiRzIGJ1dCBub3Qgd2l0aGluIGFueSBvZiBpdHMgXCJ0YXNrXCIgY29uc3RydWN0cyIKK0Nuc1RocmVhZHNBdEJhcnJpZXIgICAgICAgICAgIk9uZSB0aHJlYWQgYXQgJTEkcyB3aGlsZSBhbm90aGVyIHRocmVhZCBpcyBhdCAlMiRzLiIKKworIyBOZXcgZXJyb3JzCitDYW50Q29ubmVjdCAgICAgICAgICAgICAgICAgICJDYW5ub3QgY29ubmVjdCB0byAlMSRzIgorQ2FudENvbm5lY3RVc2luZyAgICAgICAgICAgICAiQ2Fubm90IGNvbm5lY3QgdG8gJTEkcyAtIFVzaW5nICUyJHMiCitMaWJOb3RTdXBwb3J0ICAgICAgICAgICAgICAgICIlMSRzIGRvZXMgbm90IHN1cHBvcnQgJTIkcy4gQ29udGludWluZyB3aXRob3V0IHVzaW5nICUyJHMuIgorTGliTm90U3VwcG9ydEZvciAgICAgICAgICAgICAiJTEkcyBkb2VzIG5vdCBzdXBwb3J0ICUyJHMgZm9yICUzJHMuIENvbnRpbnVpbmcgd2l0aG91dCB1c2luZyAlMiRzLiIKK1N0YXRpY0xpYk5vdFN1cHBvcnQgICAgICAgICAgIlN0YXRpYyAlMSRzIGRvZXMgbm90IHN1cHBvcnQgJTIkcy4gQ29udGludWluZyB3aXRob3V0IHVzaW5nICUyJHMuIgorRHluSVJNTHdvVXNlSXJtbCAgICAgICAgICAgICAiS01QX0RZTkFNSUNfTU9ERT1pcm1sIGNhbm5vdCBiZSB1c2VkIHdpdGggS01QX1VTRV9JUk1MPTAiCitJdHRVbmtub3duR3JvdXAgICAgICAgICAgICAgICJpdHRub3RpZnk6IFVua25vd24gZ3JvdXAgXCIlMiRzXCIgc3BlY2lmaWVkIGluIGVudmlyb25tZW50IHZhcmlhYmxlIFwiJTEkc1wiLiIKK0l0dEVudlZhclRvb0xvbmcgICAgICAgICAgICAgIml0dG5vdGlmeTogRW52aXJvbm1lbnQgdmFyaWFibGUgXCIlMSRzXCIgdG9vIGxvbmc6IEFjdHVhbCBsZW5ndGhzIGlzICUyJGx1LCBtYXggYWxsb3dlZCBsZW5ndGggaXMgJTMkbHUuIgorQWZmVXNlR2xvYkNwdWlkTDExICAgICAgICAgICAiJTEkczogQWZmaW5pdHkgY2FwYWJsZSwgdXNpbmcgZ2xvYmFsIGNwdWlkIGxlYWYgMTEgaW5mbyIKK0FmZk5vdENhcGFibGVVc2VMb2NDcHVpZEwxMSAgIiUxJHM6IEFmZmluaXR5IG5vdCBjYXBhYmxlLCB1c2luZyBsb2NhbCBjcHVpZCBsZWFmIDExIGluZm8iCitBZmZJbmZvU3RyICAgICAgICAgICAgICAgICAgICIlMSRzOiAlMiRzLiIKK0FmZkluZm9TdHJTdHIgICAgICAgICAgICAgICAgIiUxJHM6ICUyJHMgLSAlMyRzLiIKK09TUHJvY1RvUGh5c2ljYWxUaHJlYWRNYXAgICAgIiUxJHM6IE9TIHByb2MgdG8gcGh5c2ljYWwgdGhyZWFkIG1hcDoiCitBZmZVc2luZ0ZsYXRPUyAgICAgICAgICAgICAgICIlMSRzOiB1c2luZyBcImZsYXRcIiBPUyA8LT4gcGh5c2ljYWwgcHJvYyBtYXBwaW5nLiIKK0FmZlBhcnNlRmlsZW5hbWUgICAgICAgICAgICAgIiUxJHM6IHBhcnNpbmcgJTIkcy4iCitNc2dFeGl0aW5nICAgICAgICAgICAgICAgICAgICIlMSRzIC0gZXhpdGluZy4iCitJbmNvbXBhdGlibGVMaWJyYXJ5ICAgICAgICAgICJJbmNvbXBhdGlibGUgJTEkcyBsaWJyYXJ5IHdpdGggdmVyc2lvbiAlMiRzIGZvdW5kLiIKK0l0dEZ1bmN0aW9uRXJyb3IgICAgICAgICAgICAgIml0dG5vdGlmeTogRnVuY3Rpb24gJTEkcyBmYWlsZWQ6IgorSXR0VW5rbm93bkVycm9yICAgICAgICAgICAgICAiaXR0bm9maWZ5OiBFcnJvciAjJTEkZC4iCitFbnZNaWRkbGVXYXJuICAgICAgICAgICAgICAgICIlMSRzIG11c3QgYmUgc2V0IHByaW9yIHRvIGZpcnN0IHBhcmFsbGVsIHJlZ2lvbiBvciBjZXJ0YWluIEFQSSBjYWxsczsgaWdub3JlZC4iCitDbnNMb2NrTm90RGVzdHJveWVkICAgICAgICAgICJMb2NrIGluaXRpYWxpemVkIGF0ICUxJHMoJTMkZCkgd2FzIG5vdCBkZXN0cm95ZWQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICUxLCAlMiwgJTMsICU0IC0tIGZpbGUsIGZ1bmMsIGxpbmUsIGNvbAorQ2FudExvYWRCYWxVc2luZyAgICAgICAgICAgICAiQ2Fubm90IGRldGVybWluZSBtYWNoaW5lIGxvYWQgYmFsYW5jZSAtIFVzaW5nICUxJHMiCitBZmZOb3RDYXBhYmxlVXNlUHRocmVhZCAgICAgICIlMSRzOiBBZmZpbml0eSBub3QgY2FwYWJsZSwgdXNpbmcgcHRocmVhZCBpbmZvIgorQWZmVXNlUHRocmVhZCAgICAgICAgICAgICAgICAiJTEkczogQWZmaW5pdHkgY2FwYWJsZSwgdXNpbmcgcHRocmVhZCBpbmZvIgorUm1sTG9hZExpYkZhaWxlZCAgICAgICAgICAgICAiTG9hZGluZyBcIiUxJHNcIiBsaWJyYXJ5IGZhaWxlZDoiCitSbWxMb29rdXBGYWlsZWQgICAgICAgICAgICAgICJMb29rdXAgb2YgXCIlMSRzXCIgZnVuY3Rpb24gZmFpbGVkOiIKK1JtbEJ1ZmZlclRvb1NtYWxsICAgICAgICAgICAgIkJ1ZmZlciB0b28gc21hbGwuIgorUm1sVW5rbm93bkVycm9yICAgICAgICAgICAgICAiRXJyb3IgIyUxJGQuIgorTnRoU3ludGF4RXJyb3IgICAgICAgICAgICAgICAiJTEkczogSW52YWxpZCBzeW1ib2xzIGZvdW5kLiBDaGVjayB0aGUgdmFsdWUgXCIlMiRzXCIuIgorTnRoU3BhY2VzTm90QWxsb3dlZCAgICAgICAgICAiJTEkczogU3BhY2VzIGJldHdlZW4gZGlnaXRzIGFyZSBub3QgYWxsb3dlZCBcIiUyJHNcIi4iCitBZmZTdHJQYXJzZUZpbGVuYW1lICAgICAgICAgICIlMSRzOiAlMiRzIC0gcGFyc2luZyAlMyRzLiIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIiUxJHMgY2Fubm90IGJlIHNwZWNpZmllZCB2aWEga21wX3NldF9kZWZhdWx0cygpIG9uIHRoaXMgbWFjaGluZSBiZWNhdXNlIGl0IGhhcyBtb3JlIHRoYW4gb25lIHByb2Nlc3NvciBncm91cC4iCitBZmZUeXBlQ2FudFVzZU11bHRHcm91cHMgICAgICJDYW5ub3QgdXNlIGFmZmluaXR5IHR5cGUgXCIlMSRzXCIgd2l0aCBtdWx0aXBsZSBXaW5kb3dzKiBPUyBwcm9jZXNzb3IgZ3JvdXBzLCB1c2luZyBcIiUyJHNcIi4iCitBZmZHcmFuQ2FudFVzZU11bHRHcm91cHMgICAgICJDYW5ub3QgdXNlIGFmZmluaXR5IGdyYW51bGFyaXR5IFwiJTEkc1wiIHdpdGggbXVsdGlwbGUgV2luZG93cyogT1MgcHJvY2Vzc29yIGdyb3VwcywgdXNpbmcgXCIlMiRzXCIuIgorQWZmV2luZG93c1Byb2NHcm91cE1hcCAgICAgICAiJTEkczogTWFwcGluZyBXaW5kb3dzKiBPUyBwcm9jZXNzb3IgZ3JvdXAgPGk+IHByb2MgPGo+IHRvIE9TIHByb2MgNjQqPGk+KzxqPi4iCitBZmZPU1Byb2NUb0dyb3VwICAgICAgICAgICAgICIlMSRzOiBPUyBwcm9jICUyJGQgbWFwcyB0byBXaW5kb3dzKiBPUyBwcm9jZXNzb3IgZ3JvdXAgJTMkZCBwcm9jICU0JGQiCitBZmZCYWxhbmNlZE5vdEF2YWlsICAgICAgICAgICIlMSRzOiBBZmZpbml0eSBiYWxhbmNlZCBpcyBub3QgYXZhaWxhYmxlLiIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIiUxJHM6IGdyYW51bGFyaXR5PWNvcmUgd2lsbCBiZSB1c2VkLiIKK0VudkxvY2tXYXJuICAgICAgICAgICAgICAgICAgIiUxJHMgbXVzdCBiZSBzZXQgcHJpb3IgdG8gZmlyc3QgT01QIGxvY2sgY2FsbCBvciBjcml0aWNhbCBzZWN0aW9uOyBpZ25vcmVkLiIKK0Z1dGV4Tm90U3VwcG9ydGVkICAgICAgICAgICAgImZ1dGV4IHN5c3RlbSBjYWxsIG5vdCBzdXBwb3J0ZWQ7ICUxJHM9JTIkcyBpZ25vcmVkLiIKK0FmZkdyYW5Vc2luZyAgICAgICAgICAgICAgICAgIiUxJHM6IGdyYW51bGFyaXR5PSUyJHMgd2lsbCBiZSB1c2VkLiIKK0FmZlRoclBsYWNlSW52YWxpZCAgICAgICAgICAgIiUxJHM6IGludmFsaWQgdmFsdWUgXCIlMiRzXCIsIHZhbGlkIGZvcm1hdCBpcyBcIm5DLG1UWyxrT11cIi4iCitBZmZUaHJQbGFjZVVuc3VwcG9ydGVkICAgICAgICJLTVBfUExBQ0VfVEhSRUFEUyBpZ25vcmVkOiB1bnN1cHBvcnRlZCBhcmNoaXRlY3R1cmUuIgorQWZmVGhyUGxhY2VNYW55Q29yZXMgICAgICAgICAiS01QX1BMQUNFX1RIUkVBRFMgaWdub3JlZDogdG9vIG1hbnkgY29yZXMgcmVxdWVzdGVkLiIKK1N5bnRheEVycm9yVXNpbmcgICAgICAgICAgICAgIiUxJHM6IHN5bnRheCBlcnJvciwgdXNpbmcgJTIkcy4iCitBZGFwdGl2ZU5vdFN1cHBvcnRlZCAgICAgICAgICIlMSRzOiBBZGFwdGl2ZSBsb2NrcyBhcmUgbm90IHN1cHBvcnRlZDsgdXNpbmcgcXVldWluZy4iCitFbnZTeW50YXhFcnJvciAgICAgICAgICAgICAgICIlMSRzOiBJbnZhbGlkIHN5bWJvbHMgZm91bmQuIENoZWNrIHRoZSB2YWx1ZSBcIiUyJHNcIi4iCitFbnZTcGFjZXNOb3RBbGxvd2VkICAgICAgICAgICIlMSRzOiBTcGFjZXMgYmV0d2VlbiBkaWdpdHMgYXJlIG5vdCBhbGxvd2VkIFwiJTIkc1wiLiIKK0JvdW5kVG9PU1Byb2NTZXQgICAgICAgICAgICAgIiUxJHM6IHBpZCAlMiRkIHRocmVhZCAlMyRkIGJvdW5kIHRvIE9TIHByb2Mgc2V0ICU0JHMiCitDbnNMb29wSW5jcklsbGVnYWwgICAgICAgICAgICIlMSRzIGVycm9yOiBwYXJhbGxlbCBsb29wIGluY3JlbWVudCBhbmQgY29uZGl0aW9uIGFyZSBpbmNvbnNpc3RlbnQuIgorTm9Hb21wQ2FuY2VsbGF0aW9uICAgICAgICAgICAibGliZ29tcCBjYW5jZWxsYXRpb24gaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQuIgorQWZmVGhyUGxhY2VOb25Vbmlmb3JtICAgICAgICAiS01QX1BMQUNFX1RIUkVBRFMgaWdub3JlZDogbm9uLXVuaWZvcm0gdG9wb2xvZ3kuIgorQWZmVGhyUGxhY2VOb25UaHJlZUxldmVsICAgICAiS01QX1BMQUNFX1RIUkVBRFMgaWdub3JlZDogb25seSB0aHJlZS1sZXZlbCB0b3BvbG9neSBpcyBzdXBwb3J0ZWQuIgorQWZmR3JhblRvcEdyb3VwICAgICAgICAgICAgICAiJTEkczogZ3JhbnVsYXJpdHk9JTIkcyBpcyBub3Qgc3VwcG9ydGVkIHdpdGggS01QX1RPUE9MT0dZX01FVEhPRD1ncm91cC4gVXNpbmcgXCJncmFudWxhcml0eT1maW5lXCIuIgorQWZmR3Jhbkdyb3VwVHlwZSAgICAgICAgICAgICAiJTEkczogZ3JhbnVsYXJpdHk9Z3JvdXAgaXMgbm90IHN1cHBvcnRlZCB3aXRoIEtNUF9BRkZJTklUWT0lMiRzLiBVc2luZyBcImdyYW51bGFyaXR5PWNvcmVcIi4iCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLSotIEhJTlRTIC0qLQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIEhpbnRzLiBIaW50IG1heSBiZSBwcmludGVkIGFmdGVyIGEgbWVzc2FnZS4gVXN1YWxseSBpdCBpcyBsb25nZXIgZXhwbGFuYXRpb24gdGV4dCBvciBzdWdnZXN0aW9uLgorIyBUbyBtYWludGFpbiBoaW50IG51bWJlcnMgKHRoZXkgYXJlIHZpc2libGUgdG8gY3VzdG9tZXJzKSwgYWRkIG5ldyBoaW50cyB0byB0aGUgZW5kLgorCitTdWJtaXRCdWdSZXBvcnQgICAgICAgICAgICAgICJQbGVhc2Ugc3VibWl0IGEgYnVnIHJlcG9ydCB3aXRoIHRoaXMgbWVzc2FnZSwgY29tcGlsZSBhbmQgcnVuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbW1hbmRzIHVzZWQsIGFuZCBtYWNoaW5lIGNvbmZpZ3VyYXRpb24gaW5mbyBpbmNsdWRpbmcgbmF0aXZlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbXBpbGVyIGFuZCBvcGVyYXRpbmcgc3lzdGVtIHZlcnNpb25zLiBGYXN0ZXIgcmVzcG9uc2Ugd2lsbCBiZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvYnRhaW5lZCBieSBpbmNsdWRpbmcgYWxsIHByb2dyYW0gc291cmNlcy4gRm9yIGluZm9ybWF0aW9uIG9uICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN1Ym1pdHRpbmcgdGhpcyBpc3N1ZSwgcGxlYXNlIHNlZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LmludGVsLmNvbS9zb2Z0d2FyZS9wcm9kdWN0cy9zdXBwb3J0Ly4iCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICJDaGVjayBOTFNQQVRIIGVudmlyb25tZW50IHZhcmlhYmxlLCBpdHMgdmFsdWUgaXMgXCIlMSRzXCIuIgorQ2hhbmdlU3RhY2tMaW1pdCAgICAgICAgICAgICAiUGxlYXNlIHRyeSBjaGFuZ2luZyB0aGUgc2hlbGwgc3RhY2sgbGltaXQgb3IgYWRqdXN0aW5nIHRoZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPTVBfU1RBQ0tTSVpFIGVudmlyb25tZW50IHZhcmlhYmxlLiIKK1Vuc2V0X0FMTF9USFJFQURTICAgICAgICAgICAgIkNvbnNpZGVyIHVuc2V0dGluZyBLTVBfQUxMX1RIUkVBRFMgYW5kIE9NUF9USFJFQURfTElNSVQgKGlmIGVpdGhlciBpcyBzZXQpLiIKK1NldF9BTExfVEhSRUFEUFJJVkFURSAgICAgICAgIkNvbnNpZGVyIHNldHRpbmcgS01QX0FMTF9USFJFQURQUklWQVRFIHRvIGEgdmFsdWUgbGFyZ2VyIHRoYW4gJTEkZC4iCitQb3NzaWJsZVN5c3RlbUxpbWl0T25UaHJlYWRzICJUaGlzIGNvdWxkIGFsc28gYmUgZHVlIHRvIGEgc3lzdGVtLXJlbGF0ZWQgbGltaXQgb24gdGhlIG51bWJlciBvZiB0aHJlYWRzLiIKK0R1cGxpY2F0ZUxpYnJhcnkgICAgICAgICAgICAgIlRoaXMgbWVhbnMgdGhhdCBtdWx0aXBsZSBjb3BpZXMgb2YgdGhlIE9wZW5NUCBydW50aW1lIGhhdmUgYmVlbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsaW5rZWQgaW50byB0aGUgcHJvZ3JhbS4gVGhhdCBpcyBkYW5nZXJvdXMsIHNpbmNlIGl0IGNhbiBkZWdyYWRlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBlcmZvcm1hbmNlIG9yIGNhdXNlIGluY29ycmVjdCByZXN1bHRzLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgYmVzdCB0aGluZyB0byBkbyBpcyB0byBlbnN1cmUgdGhhdCBvbmx5IGEgc2luZ2xlIE9wZW5NUCBydW50aW1lIGlzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxpbmtlZCBpbnRvIHRoZSBwcm9jZXNzLCBlLmcuIGJ5IGF2b2lkaW5nIHN0YXRpYyBsaW5raW5nIG9mIHRoZSBPcGVuTVAgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicnVudGltZSBpbiBhbnkgbGlicmFyeS4gQXMgYW4gdW5zYWZlLCB1bnN1cHBvcnRlZCwgdW5kb2N1bWVudGVkIHdvcmthcm91bmQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAieW91IGNhbiBzZXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIEtNUF9EVVBMSUNBVEVfTElCX09LPVRSVUUgdG8gYWxsb3cgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhlIHByb2dyYW0gdG8gY29udGludWUgdG8gZXhlY3V0ZSwgYnV0IHRoYXQgbWF5IGNhdXNlIGNyYXNoZXMgb3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2lsZW50bHkgcHJvZHVjZSBpbmNvcnJlY3QgcmVzdWx0cy4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSBzZWUgaHR0cDovL3d3dy5pbnRlbC5jb20vc29mdHdhcmUvcHJvZHVjdHMvc3VwcG9ydC8uIgorTmFtZUNvbWVzRnJvbV9DUFVJTkZPX0ZJTEUgICAiVGhpcyBuYW1lIGlzIHNwZWNpZmllZCBpbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBLTVBfQ1BVSU5GT19GSUxFLiIKK05vdEVub3VnaE1lbW9yeSAgICAgICAgICAgICAgIlNlZW1zIGFwcGxpY2F0aW9uIHJlcXVpcmVkIHRvbyBtdWNoIG1lbW9yeS4iCitWYWxpZEJvb2xWYWx1ZXMgICAgICAgICAgICAgICJVc2UgXCIwXCIsIFwiRkFMU0VcIi4gXCIuRi5cIiwgXCJvZmZcIiwgXCJub1wiIGFzIGZhbHNlIHZhbHVlcywgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIxXCIsIFwiVFJVRVwiLCBcIi5ULlwiLCBcIm9uXCIsIFwieWVzXCIgYXMgdHJ1ZSB2YWx1ZXMuIgorQnVmZmVyT3ZlcmZsb3cgICAgICAgICAgICAgICAiUGVyaGFwcyB0b28gbWFueSB0aHJlYWRzLiIKK1J1bm5pbmdBdE1heFByaW9yaXR5ICAgICAgICAgIkRlY3JlYXNlIHByaW9yaXR5IG9mIGFwcGxpY2F0aW9uLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGlzIHdpbGwgYWxsb3cgdGhlIG1vbml0b3IgdGhyZWFkIHJ1biBhdCBoaWdoZXIgcHJpb3JpdHkgdGhhbiBvdGhlciB0aHJlYWRzLiIKK0NoYW5nZU1vbml0b3JTdGFja1NpemUgICAgICAgIlRyeSBjaGFuZ2luZyBLTVBfTU9OSVRPUl9TVEFDS1NJWkUgb3IgdGhlIHNoZWxsIHN0YWNrIGxpbWl0LiIKK0NoYW5nZVdvcmtlclN0YWNrU2l6ZSAgICAgICAgIlRyeSBjaGFuZ2luZyBPTVBfU1RBQ0tTSVpFIGFuZC9vciB0aGUgc2hlbGwgc3RhY2sgbGltaXQuIgorSW5jcmVhc2VXb3JrZXJTdGFja1NpemUgICAgICAiVHJ5IGluY3JlYXNpbmcgT01QX1NUQUNLU0laRSBvciB0aGUgc2hlbGwgc3RhY2sgbGltaXQuIgorRGVjcmVhc2VXb3JrZXJTdGFja1NpemUgICAgICAiVHJ5IGRlY3JlYXNpbmcgT01QX1NUQUNLU0laRS4iCitEZWNyZWFzZV9OVU1fVEhSRUFEUyAgICAgICAgICJUcnkgZGVjcmVhc2luZyB0aGUgdmFsdWUgb2YgT01QX05VTV9USFJFQURTLiIKK0luY3JlYXNlTW9uaXRvclN0YWNrU2l6ZSAgICAgIlRyeSBpbmNyZWFzaW5nIEtNUF9NT05JVE9SX1NUQUNLU0laRS4iCitEZWNyZWFzZU1vbml0b3JTdGFja1NpemUgICAgICJUcnkgZGVjcmVhc2luZyBLTVBfTU9OSVRPUl9TVEFDS1NJWkUuIgorRGVjcmVhc2VOdW1iZXJPZlRocmVhZHNJblVzZSAiVHJ5IGRlY3JlYXNpbmcgdGhlIG51bWJlciBvZiB0aHJlYWRzIGluIHVzZSBzaW11bHRhbmVvdXNseS4iCitEZWZhdWx0U2NoZWR1bGVLaW5kVXNlZCAgICAgICJXaWxsIHVzZSBkZWZhdWx0IHNjaGVkdWxlIHR5cGUgKCUxJHMpLiIKK0dldE5ld2VyTGlicmFyeSAgICAgICAgICAgICAgIkl0IGNvdWxkIGJlIGEgcmVzdWx0IG9mIHVzaW5nIGFuIG9sZGVyIE9NUCBsaWJyYXJ5IHdpdGggYSBuZXdlciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb21waWxlciBvciBtZW1vcnkgY29ycnVwdGlvbi4gWW91IG1heSBjaGVjayB0aGUgcHJvcGVyIE9NUCBsaWJyYXJ5ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlzIGxpbmtlZCB0byB0aGUgYXBwbGljYXRpb24uIgorQ2hlY2tFbnZWYXIgICAgICAgICAgICAgICAgICAiQ2hlY2sgJTEkcyBlbnZpcm9ubWVudCB2YXJpYWJsZSwgaXRzIHZhbHVlIGlzIFwiJTIkc1wiLiIKK0dldE5ld2VySU9NUExpYnJhcnkgICAgICAgICAgIllvdSBtYXkgd2FudCB0byB1c2UgYW4gJTEkcyBsaWJyYXJ5IHRoYXQgc3VwcG9ydHMgJTIkcyBpbnRlcmZhY2Ugd2l0aCB2ZXJzaW9uICUzJHMuIgorR2V0TmV3ZXJJUk1MTGlicmFyeSAgICAgICAgICAiWW91IG1heSB3YW50IHRvIHVzZSBhbiAlMSRzIGxpYnJhcnkgd2l0aCB2ZXJzaW9uICUyJHMuIgorQmFkRXhlRm9ybWF0ICAgICAgICAgICAgICAgICAiU3lzdGVtIGVycm9yICMxOTMgaXMgXCJCYWQgZm9ybWF0IG9mIEVYRSBvciBETEwgZmlsZVwiLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVc3VhbGx5IGl0IG1lYW5zIHRoZSBmaWxlIGlzIGZvdW5kLCBidXQgaXQgaXMgY29ycnVwdGVkIG9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImEgZmlsZSBmb3IgYW5vdGhlciBhcmNoaXRlY3R1cmUuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNoZWNrIHdoZXRoZXIgXCIlMSRzXCIgaXMgYSBmaWxlIGZvciAlMiRzIGFyY2hpdGVjdHVyZS4iCitTeXN0ZW1MaW1pdE9uVGhyZWFkcyAgICAgICAgICJTeXN0ZW0tcmVsYXRlZCBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIHRocmVhZHMuIgorCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBlbmQgb2YgZmlsZSAjCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvMjUvaW9tcC5oLnZhciBiL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvMjUvaW9tcC5oLnZhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGFmMjI0Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS8yNS9pb21wLmgudmFyCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBpbmNsdWRlLzI1L2lvbXAuaC52YXIKKyAqICRSZXZpc2lvbjogNDI5NTEgJAorICogJERhdGU6IDIwMTQtMDEtMjEgMTQ6NDE6NDEgLTA2MDAgKFR1ZSwgMjEgSmFuIDIwMTQpICQKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBfX0lPTVBfSAorIyAgIGRlZmluZSBfX0lPTVBfSAorCisjICAgZGVmaW5lIEtNUF9WRVJTSU9OX01BSk9SICAgICRLTVBfVkVSU0lPTl9NQUpPUgorIyAgIGRlZmluZSBLTVBfVkVSU0lPTl9NSU5PUiAgICAkS01QX1ZFUlNJT05fTUlOT1IKKyMgICBkZWZpbmUgS01QX1ZFUlNJT05fQlVJTEQgICAgJEtNUF9WRVJTSU9OX0JVSUxECisjICAgZGVmaW5lIEtNUF9CVUlMRF9EQVRFICAgICAgICIkS01QX0JVSUxEX0RBVEUiCisKKyMgICBpZmRlZiBfX2NwbHVzcGx1cworICAgICAgICBleHRlcm4gIkMiIHsKKyMgICBlbmRpZgorCisjICAgICAgIGRlZmluZSBrbXBfc2V0X3N0YWNrc2l6ZSAgICAgIGttcGNfc2V0X3N0YWNrc2l6ZQorIyAgICAgICBkZWZpbmUga21wX3NldF9zdGFja3NpemVfcyAgICBrbXBjX3NldF9zdGFja3NpemVfcworIyAgICAgICBkZWZpbmUga21wX3NldF9ibG9ja3RpbWUgICAgICBrbXBjX3NldF9ibG9ja3RpbWUKKyMgICAgICAgZGVmaW5lIGttcF9zZXRfbGlicmFyeSAgICAgICAga21wY19zZXRfbGlicmFyeQorIyAgICAgICBkZWZpbmUga21wX3NldF9kZWZhdWx0cyAgICAgICBrbXBjX3NldF9kZWZhdWx0cworCisjICAgICAgIGRlZmluZSBrbXBfbWFsbG9jICAgICAgICAgICAgIGttcGNfbWFsbG9jCisjICAgICAgIGRlZmluZSBrbXBfY2FsbG9jICAgICAgICAgICAgIGttcGNfY2FsbG9jCisjICAgICAgIGRlZmluZSBrbXBfcmVhbGxvYyAgICAgICAgICAgIGttcGNfcmVhbGxvYworIyAgICAgICBkZWZpbmUga21wX2ZyZWUgICAgICAgICAgICAgICBrbXBjX2ZyZWUKKworIyAgIGlmIGRlZmluZWQoX1dJTjMyKQorIyAgICAgICBkZWZpbmUgX19LQUlfS01QQ19DT05WRU5USU9OIF9fY2RlY2wKKyMgICBlbHNlCisjICAgICAgIGRlZmluZSBfX0tBSV9LTVBDX0NPTlZFTlRJT04KKyMgICBlbmRpZgorCisjICAgaW5jbHVkZSA8c3RkbGliLmg+CisgICAgLyoga21wIEFQSSBmdW5jdGlvbnMgKi8KKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2dldF9zdGFja3NpemUgICAgICAgICAgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X3N0YWNrc2l6ZSAgICAgICAgICAoaW50KTsKKyAgICBleHRlcm4gc2l6ZV90IF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2dldF9zdGFja3NpemVfcyAgICAgICAgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X3N0YWNrc2l6ZV9zICAgICAgICAoc2l6ZV90KTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2dldF9ibG9ja3RpbWUgICAgICAgICAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZ2V0X2xpYnJhcnkgICAgICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfYmxvY2t0aW1lICAgICAgICAgIChpbnQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2xpYnJhcnkgICAgICAgICAgICAoaW50KTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9saWJyYXJ5X3NlcmlhbCAgICAgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZCAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0ICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9kZWZhdWx0cyAgICAgICAgICAgKGNoYXIgY29uc3QgKik7CisKKyAgICBleHRlcm4gdm9pZCAqIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX21hbGxvYyAgKHNpemVfdCk7CisgICAgZXh0ZXJuIHZvaWQgKiBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9jYWxsb2MgIChzaXplX3QsIHNpemVfdCk7CisgICAgZXh0ZXJuIHZvaWQgKiBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9yZWFsbG9jICh2b2lkICosIHNpemVfdCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9mcmVlICAgICh2b2lkICopOworCisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfd2FybmluZ3Nfb24odm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfd2FybmluZ3Nfb2ZmKHZvaWQpOworCisjICAgdW5kZWYgX19LQUlfS01QQ19DT05WRU5USU9OCisKKyAgICAvKiBXYXJuaW5nOgorICAgICAgIFRoZSBmb2xsb3dpbmcgdHlwZWRlZnMgYXJlIG5vdCBzdGFuZGFyZCwgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHJlbGVhc2UuCisgICAgKi8KKyAgICB0eXBlZGVmIGludCAgICAgb21wX2ludF90OworICAgIHR5cGVkZWYgZG91YmxlICBvbXBfd3RpbWVfdDsKKworIyAgIGlmZGVmIF9fY3BsdXNwbHVzCisgICAgICAgIH0KKyMgICBlbmRpZgorCisjZW5kaWYgLyogX19JT01QX0ggKi8KKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS8yNS9pb21wX2xpYi5oLnZhciBiL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvMjUvaW9tcF9saWIuaC52YXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZhYTA5MwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvMjUvaW9tcF9saWIuaC52YXIKQEAgLTAsMCArMSw2NiBAQAorISBpbmNsdWRlLzI1L2lvbXBfbGliLmgudmFyCishICRSZXZpc2lvbjogNDI5NTEgJAorISAkRGF0ZTogMjAxNC0wMS0yMSAxNDo0MTo0MSAtMDYwMCAoVHVlLCAyMSBKYW4gMjAxNCkgJAorCishCishLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyEvLworIS8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyEvLworIS8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyEvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyEvLworIS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCishCisKKyEqKioKKyEqKiogb21wX2ludGVnZXJfa2luZCBhbmQgb21wX2xvZ2ljYWxfa2luZCBhcHBlYXIgdG8gYmUgcHJlZGVmaW5lZCBieSBnY2MgYW5kCishKioqIGdmb3J0cmFuIChkZWZpbml0aW9ucyBkbyBub3QgYXBwZWFyIGluIHRoZSBvbXAuaCAvIG9tcF9saWIuaCAvb21wX2xpYi5mKS4KKyEqKiogb21wX3JlYWxfa2luZCBpcyBub3QgcHJlZGVmaW5lZCwgaG93ZXZlci4KKyEqKioKKworICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fbWFqb3IgPSAkS01QX1ZFUlNJT05fTUFKT1IKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX21pbm9yID0gJEtNUF9WRVJTSU9OX01JTk9SCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9idWlsZCA9ICRLTVBfVkVSU0lPTl9CVUlMRAorICAgICAgICBjaGFyYWN0ZXIoKikgICAgICAgICAga21wX2J1aWxkX2RhdGUKKyAgICAgICAgcGFyYW1ldGVyKCBrbXBfYnVpbGRfZGF0ZSA9ICckS01QX0JVSUxEX0RBVEUnICkKKworICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX3JlYWxfa2luZCA9IDQKKworISoqKgorISoqKiBrbXBfKiB0eXBlIGV4dGVuc2lvbnMKKyEqKioKKworICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX3BvaW50ZXJfa2luZCA9ICRLTVBfSU5UX1BUUl9LSU5ECisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfc2l6ZV90X2tpbmQgID0gJEtNUF9JTlRfUFRSX0tJTkQKKworISoqKgorISoqKiBrbXBfKiBlbnRyeSBwb2ludHMKKyEqKioKKworICAgICAgICBleHRlcm5hbCBrbXBfc2V0X3N0YWNrc2l6ZQorICAgICAgICBleHRlcm5hbCBrbXBfc2V0X3N0YWNrc2l6ZV9zCisgICAgICAgIGV4dGVybmFsIGttcF9zZXRfYmxvY2t0aW1lCisgICAgICAgIGV4dGVybmFsIGttcF9zZXRfbGlicmFyeV9zZXJpYWwKKyAgICAgICAgZXh0ZXJuYWwga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKyAgICAgICAgZXh0ZXJuYWwga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKyAgICAgICAgZXh0ZXJuYWwga21wX3NldF9saWJyYXJ5CisgICAgICAgIGV4dGVybmFsIGttcF9zZXRfZGVmYXVsdHMKKyAgICAgICAgZXh0ZXJuYWwga21wX2dldF9zdGFja3NpemUKKyAgICAgICAgaW50ZWdlciBrbXBfZ2V0X3N0YWNrc2l6ZQorICAgICAgICBleHRlcm5hbCBrbXBfZ2V0X3N0YWNrc2l6ZV9zCisgICAgICAgIGludGVnZXIgKGtpbmQgPSBrbXBfc2l6ZV90X2tpbmQpIGttcF9nZXRfc3RhY2tzaXplX3MKKyAgICAgICAgZXh0ZXJuYWwga21wX2dldF9ibG9ja3RpbWUKKyAgICAgICAgaW50ZWdlciBrbXBfZ2V0X2Jsb2NrdGltZQorICAgICAgICBleHRlcm5hbCBrbXBfZ2V0X2xpYnJhcnkKKyAgICAgICAgaW50ZWdlciBrbXBfZ2V0X2xpYnJhcnkKKyAgICAgICAgZXh0ZXJuYWwga21wX21hbGxvYworICAgICAgICBpbnRlZ2VyIChraW5kID0ga21wX3BvaW50ZXJfa2luZCkga21wX21hbGxvYworICAgICAgICBleHRlcm5hbCBrbXBfY2FsbG9jCisgICAgICAgIGludGVnZXIgKGtpbmQgPSBrbXBfcG9pbnRlcl9raW5kKSBrbXBfY2FsbG9jCisgICAgICAgIGV4dGVybmFsIGttcF9yZWFsbG9jCisgICAgICAgIGludGVnZXIgKGtpbmQgPSBrbXBfcG9pbnRlcl9raW5kKSBrbXBfcmVhbGxvYworICAgICAgICBleHRlcm5hbCBrbXBfZnJlZQorICAgICAgICBleHRlcm5hbCBrbXBfc2V0X3dhcm5pbmdzX29uCisgICAgICAgIGV4dGVybmFsIGttcF9zZXRfd2FybmluZ3Nfb2ZmCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvMjUvb21wLmgudmFyIGIvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS8yNS9vbXAuaC52YXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJmNzFhNAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvMjUvb21wLmgudmFyCkBAIC0wLDAgKzEsMTI4IEBACisvKgorICogaW5jbHVkZS8yNS9vbXAuaC52YXIKKyAqICRSZXZpc2lvbjogNDI5NTEgJAorICogJERhdGU6IDIwMTQtMDEtMjEgMTQ6NDE6NDEgLTA2MDAgKFR1ZSwgMjEgSmFuIDIwMTQpICQKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBfX09NUF9ICisjICAgZGVmaW5lIF9fT01QX0gKKworIyAgIGRlZmluZSBLTVBfVkVSU0lPTl9NQUpPUiAgICAkS01QX1ZFUlNJT05fTUFKT1IKKyMgICBkZWZpbmUgS01QX1ZFUlNJT05fTUlOT1IgICAgJEtNUF9WRVJTSU9OX01JTk9SCisjICAgZGVmaW5lIEtNUF9WRVJTSU9OX0JVSUxEICAgICRLTVBfVkVSU0lPTl9CVUlMRAorIyAgIGRlZmluZSBLTVBfQlVJTERfREFURSAgICAgICAiJEtNUF9CVUlMRF9EQVRFIgorCisjICAgaWZkZWYgX19jcGx1c3BsdXMKKyAgICBleHRlcm4gIkMiIHsKKyMgICBlbmRpZgorCisjICAgICAgIGRlZmluZSBvbXBfc2V0X251bV90aHJlYWRzICAgIG9tcGNfc2V0X251bV90aHJlYWRzCisjICAgICAgIGRlZmluZSBvbXBfc2V0X2R5bmFtaWMgICAgICAgIG9tcGNfc2V0X2R5bmFtaWMKKyMgICAgICAgZGVmaW5lIG9tcF9zZXRfbmVzdGVkICAgICAgICAgb21wY19zZXRfbmVzdGVkCisKKyMgICAgICAgZGVmaW5lIGttcF9zZXRfc3RhY2tzaXplICAgICAga21wY19zZXRfc3RhY2tzaXplCisjICAgICAgIGRlZmluZSBrbXBfc2V0X3N0YWNrc2l6ZV9zICAgIGttcGNfc2V0X3N0YWNrc2l6ZV9zCisjICAgICAgIGRlZmluZSBrbXBfc2V0X2Jsb2NrdGltZSAgICAgIGttcGNfc2V0X2Jsb2NrdGltZQorIyAgICAgICBkZWZpbmUga21wX3NldF9saWJyYXJ5ICAgICAgICBrbXBjX3NldF9saWJyYXJ5CisjICAgICAgIGRlZmluZSBrbXBfc2V0X2RlZmF1bHRzICAgICAgIGttcGNfc2V0X2RlZmF1bHRzCisKKyMgICAgICAgZGVmaW5lIGttcF9tYWxsb2MgICAgICAgICAgICAga21wY19tYWxsb2MKKyMgICAgICAgZGVmaW5lIGttcF9jYWxsb2MgICAgICAgICAgICAga21wY19jYWxsb2MKKyMgICAgICAgZGVmaW5lIGttcF9yZWFsbG9jICAgICAgICAgICAga21wY19yZWFsbG9jCisjICAgICAgIGRlZmluZSBrbXBfZnJlZSAgICAgICAgICAgICAgIGttcGNfZnJlZQorCisKKyMgICBpZiBkZWZpbmVkKF9XSU4zMikKKyMgICAgICAgZGVmaW5lIF9fS0FJX0tNUENfQ09OVkVOVElPTiBfX2NkZWNsCisjICAgZWxzZQorIyAgICAgICBkZWZpbmUgX19LQUlfS01QQ19DT05WRU5USU9OCisjICAgZW5kaWYKKworICAgIC8qIHNldCBBUEkgZnVuY3Rpb25zICovCisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9zZXRfbnVtX3RocmVhZHMgKGludCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9zZXRfZHluYW1pYyAgICAgKGludCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9zZXRfbmVzdGVkICAgICAgKGludCk7CisKKyAgICAvKiBxdWVyeSBBUEkgZnVuY3Rpb25zICovCisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfbnVtX3RocmVhZHMgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9keW5hbWljICAgICAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X25lc3RlZCAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfbWF4X3RocmVhZHMgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF90aHJlYWRfbnVtICAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X251bV9wcm9jcyAgICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9pbl9wYXJhbGxlbCAgICAgICh2b2lkKTsKKworICAgIC8qIGxvY2sgQVBJIGZ1bmN0aW9ucyAqLworICAgIHR5cGVkZWYgc3RydWN0IG9tcF9sb2NrX3QgeworICAgICAgICB2b2lkICogX2xrOworICAgIH0gb21wX2xvY2tfdDsKKworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfaW5pdF9sb2NrICAgIChvbXBfbG9ja190ICopOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfc2V0X2xvY2sgICAgIChvbXBfbG9ja190ICopOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfdW5zZXRfbG9jayAgIChvbXBfbG9ja190ICopOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZGVzdHJveV9sb2NrIChvbXBfbG9ja190ICopOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfdGVzdF9sb2NrICAgIChvbXBfbG9ja190ICopOworCisgICAgLyogbmVzdGVkIGxvY2sgQVBJIGZ1bmN0aW9ucyAqLworICAgIHR5cGVkZWYgc3RydWN0IG9tcF9uZXN0X2xvY2tfdCB7CisgICAgICAgIHZvaWQgKiBfbGs7CisgICAgfSBvbXBfbmVzdF9sb2NrX3Q7CisKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2luaXRfbmVzdF9sb2NrICAgIChvbXBfbmVzdF9sb2NrX3QgKik7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9zZXRfbmVzdF9sb2NrICAgICAob21wX25lc3RfbG9ja190ICopOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfdW5zZXRfbmVzdF9sb2NrICAgKG9tcF9uZXN0X2xvY2tfdCAqKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrIChvbXBfbmVzdF9sb2NrX3QgKik7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF90ZXN0X25lc3RfbG9jayAgICAob21wX25lc3RfbG9ja190ICopOworCisgICAgLyogdGltZSBBUEkgZnVuY3Rpb25zICovCisgICAgZXh0ZXJuIGRvdWJsZSBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfd3RpbWUgKHZvaWQpOworICAgIGV4dGVybiBkb3VibGUgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X3d0aWNrICh2b2lkKTsKKworIyAgIGluY2x1ZGUgPHN0ZGxpYi5oPgorICAgIC8qIGttcCBBUEkgZnVuY3Rpb25zICovCisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9nZXRfc3RhY2tzaXplICAgICAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9zdGFja3NpemUgICAgICAgICAgKGludCk7CisgICAgZXh0ZXJuIHNpemVfdCBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9nZXRfc3RhY2tzaXplX3MgICAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9zdGFja3NpemVfcyAgICAgICAgKHNpemVfdCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9nZXRfYmxvY2t0aW1lICAgICAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2dldF9saWJyYXJ5ICAgICAgICAgICAgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2Jsb2NrdGltZSAgICAgICAgICAoaW50KTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9saWJyYXJ5ICAgICAgICAgICAgKGludCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfbGlicmFyeV9zZXJpYWwgICAgICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dCAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfZGVmYXVsdHMgICAgICAgICAgIChjaGFyIGNvbnN0ICopOworCisgICAgZXh0ZXJuIHZvaWQgKiBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9tYWxsb2MgIChzaXplX3QpOworICAgIGV4dGVybiB2b2lkICogX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfY2FsbG9jICAoc2l6ZV90LCBzaXplX3QpOworICAgIGV4dGVybiB2b2lkICogX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfcmVhbGxvYyAodm9pZCAqLCBzaXplX3QpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZnJlZSAgICAodm9pZCAqKTsKKworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X3dhcm5pbmdzX29uKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X3dhcm5pbmdzX29mZih2b2lkKTsKKworIyAgIHVuZGVmIF9fS0FJX0tNUENfQ09OVkVOVElPTgorCisgICAgLyogV2FybmluZzoKKyAgICAgICBUaGUgZm9sbG93aW5nIHR5cGVkZWZzIGFyZSBub3Qgc3RhbmRhcmQsIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSByZWxlYXNlLgorICAgICovCisgICAgdHlwZWRlZiBpbnQgICAgIG9tcF9pbnRfdDsKKyAgICB0eXBlZGVmIGRvdWJsZSAgb21wX3d0aW1lX3Q7CisKKyMgICBpZmRlZiBfX2NwbHVzcGx1cworICAgIH0KKyMgICBlbmRpZgorCisjZW5kaWYgLyogX19PTVBfSCAqLworCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9pbmNsdWRlLzI1L29tcF9saWIuZi52YXIgYi9maW5hbC9ydW50aW1lL3NyYy9pbmNsdWRlLzI1L29tcF9saWIuZi52YXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VjZTI1OQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvMjUvb21wX2xpYi5mLnZhcgpAQCAtMCwwICsxLDQ3MiBAQAorISBpbmNsdWRlLzI1L29tcF9saWIuZi52YXIKKyEgJFJldmlzaW9uOiA0Mjk1MSAkCishICREYXRlOiAyMDE0LTAxLTIxIDE0OjQxOjQxIC0wNjAwIChUdWUsIDIxIEphbiAyMDE0KSAkCisKKyEKKyEvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIS8vCishLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIS8vCishLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIS8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIS8vCishLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyEKKworISoqKgorISoqKiBTb21lIG9mIHRoZSBkaXJlY3RpdmVzIGZvciB0aGUgZm9sbG93aW5nIHJvdXRpbmUgZXh0ZW5kIHBhc3QgY29sdW1uIDcyLAorISoqKiBzbyBwcm9jZXNzIHRoaXMgZmlsZSBpbiAxMzItY29sdW1uIG1vZGUuCishKioqCisKKyFkZWMkIGZpeGVkZm9ybWxpbmVzaXplOjEzMgorCisgICAgICBtb2R1bGUgb21wX2xpYl9raW5kcworCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfaW50ZWdlcl9raW5kICAgPSA0CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfbG9naWNhbF9raW5kICAgPSA0CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfcmVhbF9raW5kICAgICAgPSA0CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfbG9ja19raW5kICAgICAgPSBpbnRfcHRyX2tpbmQoKQorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX25lc3RfbG9ja19raW5kID0gaW50X3B0cl9raW5kKCkKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF9wb2ludGVyX2tpbmQgICA9IGludF9wdHJfa2luZCgpCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfc2l6ZV90X2tpbmQgICAgPSBpbnRfcHRyX2tpbmQoKQorCisgICAgICBlbmQgbW9kdWxlIG9tcF9saWJfa2luZHMKKworICAgICAgbW9kdWxlIG9tcF9saWIKKworICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworCisgICAgICAgIGludGVnZXIsICAgICAgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX21ham9yID0gJEtNUF9WRVJTSU9OX01BSk9SCisgICAgICAgIGludGVnZXIsICAgICAgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX21pbm9yID0gJEtNUF9WRVJTSU9OX01JTk9SCisgICAgICAgIGludGVnZXIsICAgICAgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX2J1aWxkID0gJEtNUF9WRVJTSU9OX0JVSUxECisgICAgICAgIGNoYXJhY3RlcigqKSwgcGFyYW1ldGVyIDo6IGttcF9idWlsZF9kYXRlICAgID0gJyRLTVBfQlVJTERfREFURScKKyAgICAgICAgaW50ZWdlciwgICAgICBwYXJhbWV0ZXIgOjogb3Blbm1wX3ZlcnNpb24gICAgPSAyMDA1MDUKKworICAgICAgICBpbnRlcmZhY2UKKworISAgICAgICAgICoqKgorISAgICAgICAgICoqKiBvbXBfKiBlbnRyeSBwb2ludHMKKyEgICAgICAgICAqKioKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9udW1fdGhyZWFkcyhudGhyZWFkcykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG50aHJlYWRzCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9udW1fdGhyZWFkcworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X2R5bmFtaWMoZW5hYmxlKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgZW5hYmxlCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9keW5hbWljCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdGVkKGVuYWJsZSkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIGVuYWJsZQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdGVkCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X251bV90aHJlYWRzKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX3RocmVhZHMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fdGhyZWFkcworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9tYXhfdGhyZWFkcygpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X21heF90aHJlYWRzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X3RocmVhZHMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX251bSgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RocmVhZF9udW0KKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbnVtCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X251bV9wcm9jcygpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV9wcm9jcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV9wcm9jcworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2luX3BhcmFsbGVsKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9pbl9wYXJhbGxlbAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfaW5fcGFyYWxsZWwKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfZHluYW1pYygpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfZ2V0X2R5bmFtaWMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9keW5hbWljCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X25lc3RlZCgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfZ2V0X25lc3RlZAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X25lc3RlZAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF93dGltZSgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgZG91YmxlIHByZWNpc2lvbiBvbXBfZ2V0X3d0aW1lCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfd3RpbWUKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfd3RpY2sgKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBkb3VibGUgcHJlY2lzaW9uIG9tcF9nZXRfd3RpY2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF93dGljaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfaW5pdF9sb2NrKGxvY2t2YXIpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2luaXRfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfZGVzdHJveV9sb2NrKGxvY2t2YXIpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X2xvY2sobG9ja3ZhcikKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3Vuc2V0X2xvY2sobG9ja3ZhcikKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfdW5zZXRfbG9jaworCisgICAgICAgICAgZnVuY3Rpb24gb21wX3Rlc3RfbG9jayhsb2NrdmFyKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX3Rlc3RfbG9jaworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF90ZXN0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2luaXRfbmVzdF9sb2NrKGxvY2t2YXIpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfaW5pdF9uZXN0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrKGxvY2t2YXIpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfZGVzdHJveV9uZXN0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0X2xvY2sobG9ja3ZhcikKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF91bnNldF9uZXN0X2xvY2sobG9ja3ZhcikKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF91bnNldF9uZXN0X2xvY2sKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF90ZXN0X25lc3RfbG9jayhsb2NrdmFyKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX3Rlc3RfbmVzdF9sb2NrCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfdGVzdF9uZXN0X2xvY2sKKworISAgICAgICAgICoqKgorISAgICAgICAgICoqKiBrbXBfKiBlbnRyeSBwb2ludHMKKyEgICAgICAgICAqKioKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemUoc2l6ZSkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIHNpemUKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZQorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZV9zKHNpemUpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIHNpemUKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZV9zCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfYmxvY2t0aW1lKG1zZWMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBtc2VjCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9ibG9ja3RpbWUKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3NlcmlhbCgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV9zZXJpYWwKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZAorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dCgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeShsaWJudW0pCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBsaWJudW0KKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnkKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9kZWZhdWx0cyhzdHJpbmcpCisgICAgICAgICAgICBjaGFyYWN0ZXIqKCopIHN0cmluZworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfZGVmYXVsdHMKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfc3RhY2tzaXplCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZV9zKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkga21wX2dldF9zdGFja3NpemVfcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZV9zCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2Jsb2NrdGltZSgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2Jsb2NrdGltZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2Jsb2NrdGltZQorCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9saWJyYXJ5KCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfbGlicmFyeQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2xpYnJhcnkKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9tYWxsb2Moc2l6ZSkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGttcF9tYWxsb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBzaXplCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9tYWxsb2MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9jYWxsb2MobmVsZW0sIGVsc2l6ZSkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGttcF9jYWxsb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBuZWxlbQorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIGVsc2l6ZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfY2FsbG9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfcmVhbGxvYyhwdHIsIHNpemUpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfcmVhbGxvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBwdHIKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBzaXplCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9yZWFsbG9jCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9mcmVlKHB0cikKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIHB0cgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9mcmVlCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb24oKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29uCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb2ZmKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vZmYKKworICAgICAgIGVuZCBpbnRlcmZhY2UKKworIWRlYyQgaWYgZGVmaW5lZChfV0lOMzIpCishZGVjJCAgIGlmIGRlZmluZWQoX1dJTjY0KSAub3IuIGRlZmluZWQoX01fQU1ENjQpCisKKyEqKioKKyEqKiogVGhlIEZvcnRyYW4gZW50cnkgcG9pbnRzIG11c3QgYmUgaW4gdXBwZXJjYXNlLCBldmVuIGlmIHRoZSAvUWxvd2VyY2FzZQorISoqKiBvcHRpb24gaXMgc3BlY2lmaWVkLiAgVGhlIGFsaWFzIGF0dHJpYnV0ZSBlbnN1cmVzIHRoYXQgdGhlIHNwZWNpZmllZAorISoqKiBzdHJpbmcgaXMgdXNlZCBhcyB0aGUgZW50cnkgcG9pbnQuCishKioqCishKioqIE9uIHRoZSBXaW5kb3dzKiBPUyBJQS0zMiBhcmNoaXRlY3R1cmUsIHRoZSBGb3J0cmFuIGVudHJ5IHBvaW50cyBoYXZlIGFuCishKioqIHVuZGVyc2NvcmUgcHJlcGVuZGVkLiAgT24gdGhlIFdpbmRvd3MqIE9TIEludGVsKFIpIDY0CishKioqIGFyY2hpdGVjdHVyZSwgbm8gdW5kZXJzY29yZSBpcyBwcmVwZW5kZWQuCishKioqCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9TRVRfTlVNX1RIUkVBRFMnIDo6IG9tcF9zZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9TRVRfRFlOQU1JQycgOjogb21wX3NldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfU0VUX05FU1RFRCcgOjogb21wX3NldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTlVNX1RIUkVBRFMnIDo6IG9tcF9nZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTUFYX1RIUkVBRFMnIDo6IG9tcF9nZXRfbWF4X3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfVEhSRUFEX05VTScgOjogb21wX2dldF90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX05VTV9QUk9DUycgOjogb21wX2dldF9udW1fcHJvY3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9JTl9QQVJBTExFTCcgOjogb21wX2luX3BhcmFsbGVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX0RZTkFNSUMnIDo6IG9tcF9nZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9ORVNURUQnIDo6IG9tcF9nZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1dUSU1FJyA6OiBvbXBfZ2V0X3d0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1dUSUNLJyA6OiBvbXBfZ2V0X3d0aWNrCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9pbml0X2xvY2snIDo6IG9tcF9pbml0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9kZXN0cm95X2xvY2snIDo6IG9tcF9kZXN0cm95X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbG9jaycgOjogb21wX3NldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdW5zZXRfbG9jaycgOjogb21wX3Vuc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF90ZXN0X2xvY2snIDo6IG9tcF90ZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9pbml0X25lc3RfbG9jaycgOjogb21wX2luaXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZGVzdHJveV9uZXN0X2xvY2snIDo6IG9tcF9kZXN0cm95X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9uZXN0X2xvY2snIDo6IG9tcF9zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdW5zZXRfbmVzdF9sb2NrJyA6OiBvbXBfdW5zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdGVzdF9uZXN0X2xvY2snIDo6IG9tcF90ZXN0X25lc3RfbG9jaworCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX1NUQUNLU0laRSc6OmttcF9zZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX1NUQUNLU0laRV9TJzo6a21wX3NldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9CTE9DS1RJTUUnOjprbXBfc2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9MSUJSQVJZX1NFUklBTCc6OmttcF9zZXRfbGlicmFyeV9zZXJpYWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfTElCUkFSWV9UVVJOQVJPVU5EJzo6a21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfTElCUkFSWV9USFJPVUdIUFVUJzo6a21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfTElCUkFSWSc6OmttcF9zZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9TVEFDS1NJWkUnOjprbXBfZ2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9TVEFDS1NJWkVfUyc6OmttcF9nZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9HRVRfQkxPQ0tUSU1FJzo6a21wX2dldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9HRVRfTElCUkFSWSc6OmttcF9nZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX01BTExPQyc6OmttcF9tYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9DQUxMT0MnOjprbXBfY2FsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfUkVBTExPQyc6OmttcF9yZWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfRlJFRSc6OmttcF9mcmVlCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfV0FSTklOR1NfT04nOjprbXBfc2V0X3dhcm5pbmdzX29uCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX1dBUk5JTkdTX09GRic6OmttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKyFkZWMkICAgZWxzZQorCishKioqCishKioqIE9uIFdpbmRvd3MqIE9TIElBLTMyIGFyY2hpdGVjdHVyZSwgdGhlIEZvcnRyYW4gZW50cnkgcG9pbnRzIGhhdmUgYW4KKyEqKiogdW5kZXJzY29yZSBwcmVwZW5kZWQuCishKioqCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfU0VUX05VTV9USFJFQURTJyA6OiBvbXBfc2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX1NFVF9EWU5BTUlDJyA6OiBvbXBfc2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfU0VUX05FU1RFRCcgOjogb21wX3NldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX05VTV9USFJFQURTJyA6OiBvbXBfZ2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9NQVhfVEhSRUFEUycgOjogb21wX2dldF9tYXhfdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfVEhSRUFEX05VTScgOjogb21wX2dldF90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9OVU1fUFJPQ1MnIDo6IG9tcF9nZXRfbnVtX3Byb2NzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0lOX1BBUkFMTEVMJyA6OiBvbXBfaW5fcGFyYWxsZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX0RZTkFNSUMnIDo6IG9tcF9nZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfTkVTVEVEJyA6OiBvbXBfZ2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfV1RJTUUnIDo6IG9tcF9nZXRfd3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX1dUSUNLJyA6OiBvbXBfZ2V0X3d0aWNrCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfaW5pdF9sb2NrJyA6OiBvbXBfaW5pdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2Rlc3Ryb3lfbG9jaycgOjogb21wX2Rlc3Ryb3lfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbG9jaycgOjogb21wX3NldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Vuc2V0X2xvY2snIDo6IG9tcF91bnNldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Rlc3RfbG9jaycgOjogb21wX3Rlc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pbml0X25lc3RfbG9jaycgOjogb21wX2luaXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2Rlc3Ryb3lfbmVzdF9sb2NrJyA6OiBvbXBfZGVzdHJveV9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X25lc3RfbG9jaycgOjogb21wX3NldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdW5zZXRfbmVzdF9sb2NrJyA6OiBvbXBfdW5zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Rlc3RfbmVzdF9sb2NrJyA6OiBvbXBfdGVzdF9uZXN0X2xvY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfU1RBQ0tTSVpFJzo6a21wX3NldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX1NUQUNLU0laRV9TJzo6a21wX3NldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfQkxPQ0tUSU1FJzo6a21wX3NldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0xJQlJBUllfU0VSSUFMJzo6a21wX3NldF9saWJyYXJ5X3NlcmlhbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfTElCUkFSWV9UVVJOQVJPVU5EJzo6a21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0xJQlJBUllfVEhST1VHSFBVVCc6OmttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9MSUJSQVJZJzo6a21wX3NldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9TVEFDS1NJWkUnOjprbXBfZ2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfU1RBQ0tTSVpFX1MnOjprbXBfZ2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9CTE9DS1RJTUUnOjprbXBfZ2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfTElCUkFSWSc6OmttcF9nZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9NQUxMT0MnOjprbXBfbWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0NBTExPQyc6OmttcF9jYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfUkVBTExPQyc6OmttcF9yZWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0ZSRUUnOjprbXBfZnJlZQorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9XQVJOSU5HU19PTic6OmttcF9zZXRfd2FybmluZ3Nfb24KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX1dBUk5JTkdTX09GRic6OmttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKyFkZWMkICAgZW5kaWYKKyFkZWMkIGVuZGlmCisKKyFkZWMkIGlmIGRlZmluZWQoX19saW51eCkKKworISoqKgorISoqKiBUaGUgTGludXgqIE9TIGVudHJ5IHBvaW50cyBhcmUgaW4gbG93ZXJjYXNlLCB3aXRoIGFuIHVuZGVyc2NvcmUgYXBwZW5kZWQuCishKioqCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbnVtX3RocmVhZHNfJzo6b21wX3NldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9keW5hbWljXyc6Om9tcF9zZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9uZXN0ZWRfJzo6b21wX3NldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbnVtX3RocmVhZHNfJzo6b21wX2dldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9tYXhfdGhyZWFkc18nOjpvbXBfZ2V0X21heF90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X3RocmVhZF9udW1fJzo6b21wX2dldF90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X251bV9wcm9jc18nOjpvbXBfZ2V0X251bV9wcm9jcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2luX3BhcmFsbGVsXyc6Om9tcF9pbl9wYXJhbGxlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9keW5hbWljXyc6Om9tcF9nZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9uZXN0ZWRfJzo6b21wX2dldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfd3RpbWVfJzo6b21wX2dldF93dGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF93dGlja18nOjpvbXBfZ2V0X3d0aWNrCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9pbml0X2xvY2tfJzo6b21wX2luaXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2Rlc3Ryb3lfbG9ja18nOjpvbXBfZGVzdHJveV9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X2xvY2tfJzo6b21wX3NldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdW5zZXRfbG9ja18nOjpvbXBfdW5zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Rlc3RfbG9ja18nOjpvbXBfdGVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfaW5pdF9uZXN0X2xvY2tfJzo6b21wX2luaXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZGVzdHJveV9uZXN0X2xvY2tfJzo6b21wX2Rlc3Ryb3lfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X25lc3RfbG9ja18nOjpvbXBfc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Vuc2V0X25lc3RfbG9ja18nOjpvbXBfdW5zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdGVzdF9uZXN0X2xvY2tfJzo6b21wX3Rlc3RfbmVzdF9sb2NrCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfc3RhY2tzaXplXyc6OmttcF9zZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X3N0YWNrc2l6ZV9zXyc6OmttcF9zZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfYmxvY2t0aW1lXyc6OmttcF9zZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2xpYnJhcnlfc2VyaWFsXyc6OmttcF9zZXRfbGlicmFyeV9zZXJpYWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kXyc6OmttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dF8nOjprbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9saWJyYXJ5Xyc6OmttcF9zZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2dldF9zdGFja3NpemVfJzo6a21wX2dldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfc3RhY2tzaXplX3NfJzo6a21wX2dldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2dldF9ibG9ja3RpbWVfJzo6a21wX2dldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfbGlicmFyeV8nOjprbXBfZ2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9tYWxsb2NfJzo6a21wX21hbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2NhbGxvY18nOjprbXBfY2FsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfcmVhbGxvY18nOjprbXBfcmVhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2ZyZWVfJzo6a21wX2ZyZWUKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF93YXJuaW5nc19vbl8nOjprbXBfc2V0X3dhcm5pbmdzX29uCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X3dhcm5pbmdzX29mZl8nOjprbXBfc2V0X3dhcm5pbmdzX29mZgorCishZGVjJCBlbmRpZgorCishZGVjJCBpZiBkZWZpbmVkKF9fQVBQTEVfXykKKworISoqKgorISoqKiBUaGUgTWFjIGVudHJ5IHBvaW50cyBhcmUgaW4gbG93ZXJjYXNlLCB3aXRoIGFuIGJvdGggYW4gdW5kZXJzY29yZQorISoqKiBhcHBlbmRlZCBhbmQgYW4gdW5kZXJzY29yZSBwcmVwZW5kZWQuCishKioqCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X251bV90aHJlYWRzXyc6Om9tcF9zZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X2R5bmFtaWNfJzo6b21wX3NldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9uZXN0ZWRfJzo6b21wX3NldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X251bV90aHJlYWRzXyc6Om9tcF9nZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X21heF90aHJlYWRzXyc6Om9tcF9nZXRfbWF4X3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X3RocmVhZF9udW1fJzo6b21wX2dldF90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9udW1fcHJvY3NfJzo6b21wX2dldF9udW1fcHJvY3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfaW5fcGFyYWxsZWxfJzo6b21wX2luX3BhcmFsbGVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9keW5hbWljXyc6Om9tcF9nZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbmVzdGVkXyc6Om9tcF9nZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF93dGltZV8nOjpvbXBfZ2V0X3d0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF93dGlja18nOjpvbXBfZ2V0X3d0aWNrCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfaW5pdF9sb2NrXyc6Om9tcF9pbml0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZGVzdHJveV9sb2NrXyc6Om9tcF9kZXN0cm95X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X2xvY2tfJzo6b21wX3NldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Vuc2V0X2xvY2tfJzo6b21wX3Vuc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdGVzdF9sb2NrXyc6Om9tcF90ZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfaW5pdF9uZXN0X2xvY2tfJzo6b21wX2luaXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2Rlc3Ryb3lfbmVzdF9sb2NrXyc6Om9tcF9kZXN0cm95X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbmVzdF9sb2NrXyc6Om9tcF9zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Vuc2V0X25lc3RfbG9ja18nOjpvbXBfdW5zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Rlc3RfbmVzdF9sb2NrXyc6Om9tcF90ZXN0X25lc3RfbG9jaworCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9zdGFja3NpemVfJzo6a21wX3NldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X3N0YWNrc2l6ZV9zXyc6OmttcF9zZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2Jsb2NrdGltZV8nOjprbXBfc2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfbGlicmFyeV9zZXJpYWxfJzo6a21wX3NldF9saWJyYXJ5X3NlcmlhbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kXyc6OmttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXRfJzo6a21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2xpYnJhcnlfJzo6a21wX3NldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9zdGFja3NpemVfJzo6a21wX2dldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X3N0YWNrc2l6ZV9zXyc6OmttcF9nZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X2Jsb2NrdGltZV8nOjprbXBfZ2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfbGlicmFyeV8nOjprbXBfZ2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfbWFsbG9jXyc6OmttcF9tYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfY2FsbG9jXyc6OmttcF9jYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfcmVhbGxvY18nOjprbXBfcmVhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9mcmVlXyc6OmttcF9mcmVlCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X3dhcm5pbmdzX29uXyc6OmttcF9zZXRfd2FybmluZ3Nfb24KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X3dhcm5pbmdzX29mZl8nOjprbXBfc2V0X3dhcm5pbmdzX29mZgorCishZGVjJCBlbmRpZgorCisgICAgICBlbmQgbW9kdWxlIG9tcF9saWIKKworCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9pbmNsdWRlLzI1L29tcF9saWIuZjkwLnZhciBiL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvMjUvb21wX2xpYi5mOTAudmFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkODZhOTgKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9pbmNsdWRlLzI1L29tcF9saWIuZjkwLnZhcgpAQCAtMCwwICsxLDI1NiBAQAorISBpbmNsdWRlLzI1L29tcF9saWIuZjkwLnZhcgorISAkUmV2aXNpb246IDQyOTUxICQKKyEgJERhdGU6IDIwMTQtMDEtMjEgMTQ6NDE6NDEgLTA2MDAgKFR1ZSwgMjEgSmFuIDIwMTQpICQKKworIQorIS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCishLy8KKyEvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCishLy8KKyEvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCishLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCishLy8KKyEvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIQorCisgICAgICBtb2R1bGUgb21wX2xpYl9raW5kcworCisgICAgICAgIHVzZSwgaW50cmluc2ljIDo6IGlzb19jX2JpbmRpbmcKKworICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2ludGVnZXJfa2luZCAgICAgICA9IGNfaW50CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfbG9naWNhbF9raW5kICAgICAgID0gNAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX3JlYWxfa2luZCAgICAgICAgICA9IGNfZmxvYXQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF9kb3VibGVfa2luZCAgICAgICAgPSBjX2RvdWJsZQorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2xvY2tfa2luZCAgICAgICAgICA9IGNfaW50cHRyX3QKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9uZXN0X2xvY2tfa2luZCAgICAgPSBjX2ludHB0cl90CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfcG9pbnRlcl9raW5kICAgICAgID0gY19pbnRwdHJfdAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX3NpemVfdF9raW5kICAgICAgICA9IGNfc2l6ZV90CisKKyAgICAgIGVuZCBtb2R1bGUgb21wX2xpYl9raW5kcworCisgICAgICBtb2R1bGUgb21wX2xpYgorCisgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisKKyAgICAgICAgaW50ZWdlciwgICAgICBwYXJhbWV0ZXIgOjogb3Blbm1wX3ZlcnNpb24gICAgPSAyMDA1MDUKKyAgICAgICAgaW50ZWdlciwgICAgICBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fbWFqb3IgPSAkS01QX1ZFUlNJT05fTUFKT1IKKyAgICAgICAgaW50ZWdlciwgICAgICBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fbWlub3IgPSAkS01QX1ZFUlNJT05fTUlOT1IKKyAgICAgICAgaW50ZWdlciwgICAgICBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fYnVpbGQgPSAkS01QX1ZFUlNJT05fQlVJTEQKKyAgICAgICAgY2hhcmFjdGVyKCopICAgICAgICAgICAgICAga21wX2J1aWxkX2RhdGUKKyAgICAgICAgcGFyYW1ldGVyKCBrbXBfYnVpbGRfZGF0ZSA9ICckS01QX0JVSUxEX0RBVEUnICkKKworICAgICAgICBpbnRlcmZhY2UKKworISAgICAgICAgICoqKgorISAgICAgICAgICoqKiBvbXBfKiBlbnRyeSBwb2ludHMKKyEgICAgICAgICAqKioKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9udW1fdGhyZWFkcyhudGhyZWFkcykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IG50aHJlYWRzCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9udW1fdGhyZWFkcworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X2R5bmFtaWMoZW5hYmxlKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSwgdmFsdWUgOjogZW5hYmxlCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9keW5hbWljCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdGVkKGVuYWJsZSkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCksIHZhbHVlIDo6IGVuYWJsZQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdGVkCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X251bV90aHJlYWRzKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fdGhyZWFkcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV90aHJlYWRzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X21heF90aHJlYWRzKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9tYXhfdGhyZWFkcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X21heF90aHJlYWRzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9udW0oKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RocmVhZF9udW0KKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbnVtCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X251bV9wcm9jcygpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX3Byb2NzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3Byb2NzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfaW5fcGFyYWxsZWwoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfaW5fcGFyYWxsZWwKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2luX3BhcmFsbGVsCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2R5bmFtaWMoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfZ2V0X2R5bmFtaWMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9keW5hbWljCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X25lc3RlZCgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9nZXRfbmVzdGVkCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbmVzdGVkCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3d0aW1lKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIHJlYWwgKGtpbmQ9a21wX2RvdWJsZV9raW5kKSBvbXBfZ2V0X3d0aW1lCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfd3RpbWUKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfd3RpY2soKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgcmVhbCAoa2luZD1rbXBfZG91YmxlX2tpbmQpIG9tcF9nZXRfd3RpY2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF93dGljaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfaW5pdF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfaW5pdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X2xvY2sobG9ja3ZhcikgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3Vuc2V0X2xvY2sobG9ja3ZhcikgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF91bnNldF9sb2NrCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfdGVzdF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF90ZXN0X2xvY2sKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfdGVzdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9pbml0X25lc3RfbG9jayhsb2NrdmFyKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfaW5pdF9uZXN0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X25lc3RfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X25lc3RfbG9jayhsb2NrdmFyKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X25lc3RfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfdW5zZXRfbmVzdF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF91bnNldF9uZXN0X2xvY2sKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF90ZXN0X25lc3RfbG9jayhsb2NrdmFyKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfdGVzdF9uZXN0X2xvY2sKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF90ZXN0X25lc3RfbG9jaworCishICAgICAgICAgKioqCishICAgICAgICAgKioqIGttcF8qIGVudHJ5IHBvaW50cworISAgICAgICAgICoqKgorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZShzaXplKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogc2l6ZQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplX3Moc2l6ZSkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSwgdmFsdWUgOjogc2l6ZQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplX3MKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9ibG9ja3RpbWUobXNlYykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IG1zZWMKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2Jsb2NrdGltZQorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZAorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dCgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5KGxpYm51bSkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IGxpYm51bQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeQorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2RlZmF1bHRzKHN0cmluZykgYmluZChjKQorICAgICAgICAgICAgdXNlLCBpbnRyaW5zaWMgOjogaXNvX2NfYmluZGluZworICAgICAgICAgICAgY2hhcmFjdGVyIChraW5kPWNfY2hhcikgOjogc3RyaW5nKCopCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9kZWZhdWx0cworCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemUoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X3N0YWNrc2l6ZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZQorCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemVfcygpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkga21wX2dldF9zdGFja3NpemVfcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZV9zCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2Jsb2NrdGltZSgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYmxvY2t0aW1lCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYmxvY2t0aW1lCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2xpYnJhcnkoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2xpYnJhcnkKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9saWJyYXJ5CisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfbWFsbG9jKHNpemUpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGttcF9tYWxsb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSwgdmFsdWUgOjogc2l6ZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfbWFsbG9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfY2FsbG9jKG5lbGVtLCBlbHNpemUpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGttcF9jYWxsb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSwgdmFsdWUgOjogbmVsZW0KKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSwgdmFsdWUgOjogZWxzaXplCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9jYWxsb2MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9yZWFsbG9jKHB0ciwgc2l6ZSkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX3JlYWxsb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCksIHZhbHVlIDo6IHB0cgorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBzaXplCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9yZWFsbG9jCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9mcmVlKHB0cikgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCksIHZhbHVlIDo6IHB0cgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9mcmVlCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb24oKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb24KKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vZmYoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKyAgICAgICAgZW5kIGludGVyZmFjZQorCisgICAgICBlbmQgbW9kdWxlIG9tcF9saWIKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvMjUvb21wX2xpYi5oLnZhciBiL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvMjUvb21wX2xpYi5oLnZhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjkzYzk4Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS8yNS9vbXBfbGliLmgudmFyCkBAIC0wLDAgKzEsNDYwIEBACishIGluY2x1ZGUvMjUvb21wX2xpYi5oLnZhcgorISAkUmV2aXNpb246IDQyOTUxICQKKyEgJERhdGU6IDIwMTQtMDEtMjEgMTQ6NDE6NDEgLTA2MDAgKFR1ZSwgMjEgSmFuIDIwMTQpICQKKworIQorIS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCishLy8KKyEvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCishLy8KKyEvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCishLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCishLy8KKyEvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIQorCishKioqCishKioqIFNvbWUgb2YgdGhlIGRpcmVjdGl2ZXMgZm9yIHRoZSBmb2xsb3dpbmcgcm91dGluZSBleHRlbmQgcGFzdCBjb2x1bW4gNzIsCishKioqIHNvIHByb2Nlc3MgdGhpcyBmaWxlIGluIDEzMi1jb2x1bW4gbW9kZS4KKyEqKioKKworIWRlYyQgZml4ZWRmb3JtbGluZXNpemU6MTMyCisKKyAgICAgIGluY2x1ZGUgJ29tcF9saWJfa2luZHMuaCcKKworICAgICAgaW50ZWdlciwgICAgICBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fbWFqb3IgPSAkS01QX1ZFUlNJT05fTUFKT1IKKyAgICAgIGludGVnZXIsICAgICAgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX21pbm9yID0gJEtNUF9WRVJTSU9OX01JTk9SCisgICAgICBpbnRlZ2VyLCAgICAgIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9idWlsZCA9ICRLTVBfVkVSU0lPTl9CVUlMRAorICAgICAgY2hhcmFjdGVyKCopLCBwYXJhbWV0ZXIgOjoga21wX2J1aWxkX2RhdGUgICAgPSAnJEtNUF9CVUlMRF9EQVRFJworICAgICAgaW50ZWdlciwgICAgICBwYXJhbWV0ZXIgOjogb3Blbm1wX3ZlcnNpb24gICAgPSAyMDA1MDUKKworICAgICAgaW50ZXJmYWNlCisKKyEgICAgICAgKioqCishICAgICAgICoqKiBvbXBfKiBlbnRyeSBwb2ludHMKKyEgICAgICAgKioqCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X251bV90aHJlYWRzKG50aHJlYWRzKQorICAgICAgICAgIGluY2x1ZGUgJ29tcF9saWJfa2luZHMuaCcKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG50aHJlYWRzCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbnVtX3RocmVhZHMKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfZHluYW1pYyhlbmFibGUpCisgICAgICAgICAgaW5jbHVkZSAnb21wX2xpYl9raW5kcy5oJworICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgZW5hYmxlCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfZHluYW1pYworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0ZWQoZW5hYmxlKQorICAgICAgICAgIGluY2x1ZGUgJ29tcF9saWJfa2luZHMuaCcKKyAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIGVuYWJsZQorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X25lc3RlZAorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3RocmVhZHMoKQorICAgICAgICAgIGluY2x1ZGUgJ29tcF9saWJfa2luZHMuaCcKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX3RocmVhZHMKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3RocmVhZHMKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X21heF90aHJlYWRzKCkKKyAgICAgICAgICBpbmNsdWRlICdvbXBfbGliX2tpbmRzLmgnCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X21heF90aHJlYWRzCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X21heF90aHJlYWRzCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbnVtKCkKKyAgICAgICAgICBpbmNsdWRlICdvbXBfbGliX2tpbmRzLmgnCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RocmVhZF9udW0KKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX251bQorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3Byb2NzKCkKKyAgICAgICAgICBpbmNsdWRlICdvbXBfbGliX2tpbmRzLmgnCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV9wcm9jcworICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fcHJvY3MKKworICAgICAgICBmdW5jdGlvbiBvbXBfaW5fcGFyYWxsZWwoKQorICAgICAgICAgIGluY2x1ZGUgJ29tcF9saWJfa2luZHMuaCcKKyAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9pbl9wYXJhbGxlbAorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2luX3BhcmFsbGVsCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9keW5hbWljKCkKKyAgICAgICAgICBpbmNsdWRlICdvbXBfbGliX2tpbmRzLmgnCisgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfZ2V0X2R5bmFtaWMKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfZHluYW1pYworCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbmVzdGVkKCkKKyAgICAgICAgICBpbmNsdWRlICdvbXBfbGliX2tpbmRzLmgnCisgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfZ2V0X25lc3RlZAorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9uZXN0ZWQKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3d0aW1lKCkKKyAgICAgICAgICBpbmNsdWRlICdvbXBfbGliX2tpbmRzLmgnCisgICAgICAgICAgZG91YmxlIHByZWNpc2lvbiBvbXBfZ2V0X3d0aW1lCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3d0aW1lCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF93dGljayAoKQorICAgICAgICAgIGluY2x1ZGUgJ29tcF9saWJfa2luZHMuaCcKKyAgICAgICAgICBkb3VibGUgcHJlY2lzaW9uIG9tcF9nZXRfd3RpY2sKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfd3RpY2sKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9pbml0X2xvY2sobG9ja3ZhcikKKyAgICAgICAgICBpbmNsdWRlICdvbXBfbGliX2tpbmRzLmgnCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9pbml0X2xvY2sKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X2xvY2sobG9ja3ZhcikKKyAgICAgICAgICBpbmNsdWRlICdvbXBfbGliX2tpbmRzLmgnCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X2xvY2sKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbG9jayhsb2NrdmFyKQorICAgICAgICAgIGluY2x1ZGUgJ29tcF9saWJfa2luZHMuaCcKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9sb2NrCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfdW5zZXRfbG9jayhsb2NrdmFyKQorICAgICAgICAgIGluY2x1ZGUgJ29tcF9saWJfa2luZHMuaCcKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3Vuc2V0X2xvY2sKKworICAgICAgICBmdW5jdGlvbiBvbXBfdGVzdF9sb2NrKGxvY2t2YXIpCisgICAgICAgICAgaW5jbHVkZSAnb21wX2xpYl9raW5kcy5oJworICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX3Rlc3RfbG9jaworICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX3Rlc3RfbG9jaworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX2luaXRfbmVzdF9sb2NrKGxvY2t2YXIpCisgICAgICAgICAgaW5jbHVkZSAnb21wX2xpYl9raW5kcy5oJworICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9pbml0X25lc3RfbG9jaworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrKGxvY2t2YXIpCisgICAgICAgICAgaW5jbHVkZSAnb21wX2xpYl9raW5kcy5oJworICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X25lc3RfbG9jaworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0X2xvY2sobG9ja3ZhcikKKyAgICAgICAgICBpbmNsdWRlICdvbXBfbGliX2tpbmRzLmgnCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0X2xvY2sKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF91bnNldF9uZXN0X2xvY2sobG9ja3ZhcikKKyAgICAgICAgICBpbmNsdWRlICdvbXBfbGliX2tpbmRzLmgnCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3Vuc2V0X25lc3RfbG9jaworCisgICAgICAgIGZ1bmN0aW9uIG9tcF90ZXN0X25lc3RfbG9jayhsb2NrdmFyKQorICAgICAgICAgIGluY2x1ZGUgJ29tcF9saWJfa2luZHMuaCcKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF90ZXN0X25lc3RfbG9jaworICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfdGVzdF9uZXN0X2xvY2sKKworISAgICAgICAqKioKKyEgICAgICAgKioqIGttcF8qIGVudHJ5IHBvaW50cworISAgICAgICAqKioKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplKHNpemUpCisgICAgICAgICAgaW5jbHVkZSAnb21wX2xpYl9raW5kcy5oJworICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgc2l6ZQorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZQorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemVfcyhzaXplKQorICAgICAgICAgIGluY2x1ZGUgJ29tcF9saWJfa2luZHMuaCcKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkgc2l6ZQorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZV9zCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2Jsb2NrdGltZShtc2VjKQorICAgICAgICAgIGluY2x1ZGUgJ29tcF9saWJfa2luZHMuaCcKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG1zZWMKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9ibG9ja3RpbWUKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV9zZXJpYWwoKQorICAgICAgICAgIGluY2x1ZGUgJ29tcF9saWJfa2luZHMuaCcKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3NlcmlhbAorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQoKQorICAgICAgICAgIGluY2x1ZGUgJ29tcF9saWJfa2luZHMuaCcKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0KCkKKyAgICAgICAgICBpbmNsdWRlICdvbXBfbGliX2tpbmRzLmgnCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnkobGlibnVtKQorICAgICAgICAgIGluY2x1ZGUgJ29tcF9saWJfa2luZHMuaCcKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGxpYm51bQorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnkKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfZGVmYXVsdHMoc3RyaW5nKQorICAgICAgICAgIGNoYXJhY3RlciooKikgc3RyaW5nCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfZGVmYXVsdHMKKworICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZSgpCisgICAgICAgICAgaW5jbHVkZSAnb21wX2xpYl9raW5kcy5oJworICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9zdGFja3NpemUKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplCisKKyAgICAgICAgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemVfcygpCisgICAgICAgICAgaW5jbHVkZSAnb21wX2xpYl9raW5kcy5oJworICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBrbXBfZ2V0X3N0YWNrc2l6ZV9zCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZV9zCisKKyAgICAgICAgZnVuY3Rpb24ga21wX2dldF9ibG9ja3RpbWUoKQorICAgICAgICAgIGluY2x1ZGUgJ29tcF9saWJfa2luZHMuaCcKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYmxvY2t0aW1lCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2Jsb2NrdGltZQorCisgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfbGlicmFyeSgpCisgICAgICAgICAgaW5jbHVkZSAnb21wX2xpYl9raW5kcy5oJworICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9saWJyYXJ5CisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2xpYnJhcnkKKworICAgICAgICBmdW5jdGlvbiBrbXBfbWFsbG9jKHNpemUpCisgICAgICAgICAgaW5jbHVkZSAnb21wX2xpYl9raW5kcy5oJworICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX21hbGxvYworICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBzaXplCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfbWFsbG9jCisKKyAgICAgICAgZnVuY3Rpb24ga21wX2NhbGxvYyhuZWxlbSwgZWxzaXplKQorICAgICAgICAgIGluY2x1ZGUgJ29tcF9saWJfa2luZHMuaCcKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGttcF9jYWxsb2MKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkgbmVsZW0KKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkgZWxzaXplCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfY2FsbG9jCisKKyAgICAgICAgZnVuY3Rpb24ga21wX3JlYWxsb2MocHRyLCBzaXplKQorICAgICAgICAgIGluY2x1ZGUgJ29tcF9saWJfa2luZHMuaCcKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGttcF9yZWFsbG9jCisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBwdHIKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkgc2l6ZQorICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3JlYWxsb2MKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9mcmVlKHB0cikKKyAgICAgICAgICBpbmNsdWRlICdvbXBfbGliX2tpbmRzLmgnCisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBwdHIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX2ZyZWUKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb24oKQorICAgICAgICAgIGluY2x1ZGUgJ29tcF9saWJfa2luZHMuaCcKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vbgorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vZmYoKQorICAgICAgICAgIGluY2x1ZGUgJ29tcF9saWJfa2luZHMuaCcKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vZmYKKworICAgICAgZW5kIGludGVyZmFjZQorCishZGVjJCBpZiBkZWZpbmVkKF9XSU4zMikKKyFkZWMkICAgaWYgZGVmaW5lZChfV0lONjQpIC5vci4gZGVmaW5lZChfTV9BTUQ2NCkKKworISoqKgorISoqKiBUaGUgRm9ydHJhbiBlbnRyeSBwb2ludHMgbXVzdCBiZSBpbiB1cHBlcmNhc2UsIGV2ZW4gaWYgdGhlIC9RbG93ZXJjYXNlCishKioqIG9wdGlvbiBpcyBzcGVjaWZpZWQuICBUaGUgYWxpYXMgYXR0cmlidXRlIGVuc3VyZXMgdGhhdCB0aGUgc3BlY2lmaWVkCishKioqIHN0cmluZyBpcyB1c2VkIGFzIHRoZSBlbnRyeSBwb2ludC4KKyEqKioKKyEqKiogT24gdGhlIFdpbmRvd3MqIE9TIElBLTMyIGFyY2hpdGVjdHVyZSwgdGhlIEZvcnRyYW4gZW50cnkgcG9pbnRzIGhhdmUgYW4KKyEqKiogdW5kZXJzY29yZSBwcmVwZW5kZWQuICBPbiB0aGUgV2luZG93cyogT1MgSW50ZWwoUikgNjQKKyEqKiogYXJjaGl0ZWN0dXJlLCBubyB1bmRlcnNjb3JlIGlzIHByZXBlbmRlZC4KKyEqKioKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX1NFVF9OVU1fVEhSRUFEUyc6Om9tcF9zZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9TRVRfRFlOQU1JQyc6Om9tcF9zZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX1NFVF9ORVNURUQnOjpvbXBfc2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9OVU1fVEhSRUFEUyc6Om9tcF9nZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTUFYX1RIUkVBRFMnOjpvbXBfZ2V0X21heF90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1RIUkVBRF9OVU0nOjpvbXBfZ2V0X3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTlVNX1BST0NTJzo6b21wX2dldF9udW1fcHJvY3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9JTl9QQVJBTExFTCc6Om9tcF9pbl9wYXJhbGxlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9EWU5BTUlDJzo6b21wX2dldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX05FU1RFRCc6Om9tcF9nZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1dUSU1FJzo6b21wX2dldF93dGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9XVElDSyc6Om9tcF9nZXRfd3RpY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2luaXRfbG9jayc6Om9tcF9pbml0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9kZXN0cm95X2xvY2snOjpvbXBfZGVzdHJveV9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X2xvY2snOjpvbXBfc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF91bnNldF9sb2NrJzo6b21wX3Vuc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF90ZXN0X2xvY2snOjpvbXBfdGVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfaW5pdF9uZXN0X2xvY2snOjpvbXBfaW5pdF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9kZXN0cm95X25lc3RfbG9jayc6Om9tcF9kZXN0cm95X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9uZXN0X2xvY2snOjpvbXBfc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Vuc2V0X25lc3RfbG9jayc6Om9tcF91bnNldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF90ZXN0X25lc3RfbG9jayc6Om9tcF90ZXN0X25lc3RfbG9jaworCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX1NUQUNLU0laRSc6OmttcF9zZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX1NUQUNLU0laRV9TJzo6a21wX3NldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9CTE9DS1RJTUUnOjprbXBfc2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9MSUJSQVJZX1NFUklBTCc6OmttcF9zZXRfbGlicmFyeV9zZXJpYWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfTElCUkFSWV9UVVJOQVJPVU5EJzo6a21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfTElCUkFSWV9USFJPVUdIUFVUJzo6a21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfTElCUkFSWSc6OmttcF9zZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9ERUZBVUxUUyc6OmttcF9zZXRfZGVmYXVsdHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9HRVRfU1RBQ0tTSVpFJzo6a21wX2dldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9HRVRfU1RBQ0tTSVpFX1MnOjprbXBfZ2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX0JMT0NLVElNRSc6OmttcF9nZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX0xJQlJBUlknOjprbXBfZ2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9NQUxMT0MnOjprbXBfbWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfQ0FMTE9DJzo6a21wX2NhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1JFQUxMT0MnOjprbXBfcmVhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0ZSRUUnOjprbXBfZnJlZQorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX1dBUk5JTkdTX09OJzo6a21wX3NldF93YXJuaW5nc19vbgorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9XQVJOSU5HU19PRkYnOjprbXBfc2V0X3dhcm5pbmdzX29mZgorCishZGVjJCAgIGVsc2UKKworISoqKgorISoqKiBPbiBXaW5kb3dzKiBPUyBJQS0zMiBhcmNoaXRlY3R1cmUsIHRoZSBGb3J0cmFuIGVudHJ5IHBvaW50cyBoYXZlIGFuCishKioqIHVuZGVyc2NvcmUgcHJlcGVuZGVkLgorISoqKgorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX1NFVF9OVU1fVEhSRUFEUyc6Om9tcF9zZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfU0VUX0RZTkFNSUMnOjpvbXBfc2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfU0VUX05FU1RFRCc6Om9tcF9zZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9OVU1fVEhSRUFEUyc6Om9tcF9nZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX01BWF9USFJFQURTJzo6b21wX2dldF9tYXhfdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfVEhSRUFEX05VTSc6Om9tcF9nZXRfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfTlVNX1BST0NTJzo6b21wX2dldF9udW1fcHJvY3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfSU5fUEFSQUxMRUwnOjpvbXBfaW5fcGFyYWxsZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX0RZTkFNSUMnOjpvbXBfZ2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX05FU1RFRCc6Om9tcF9nZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9XVElNRSc6Om9tcF9nZXRfd3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX1dUSUNLJzo6b21wX2dldF93dGljaworCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2luaXRfbG9jayc6Om9tcF9pbml0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZGVzdHJveV9sb2NrJzo6b21wX2Rlc3Ryb3lfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbG9jayc6Om9tcF9zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF91bnNldF9sb2NrJzo6b21wX3Vuc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdGVzdF9sb2NrJzo6b21wX3Rlc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pbml0X25lc3RfbG9jayc6Om9tcF9pbml0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9kZXN0cm95X25lc3RfbG9jayc6Om9tcF9kZXN0cm95X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbmVzdF9sb2NrJzo6b21wX3NldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdW5zZXRfbmVzdF9sb2NrJzo6b21wX3Vuc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF90ZXN0X25lc3RfbG9jayc6Om9tcF90ZXN0X25lc3RfbG9jaworCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9TVEFDS1NJWkUnOjprbXBfc2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfU1RBQ0tTSVpFX1MnOjprbXBfc2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9CTE9DS1RJTUUnOjprbXBfc2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfTElCUkFSWV9TRVJJQUwnOjprbXBfc2V0X2xpYnJhcnlfc2VyaWFsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9MSUJSQVJZX1RVUk5BUk9VTkQnOjprbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfTElCUkFSWV9USFJPVUdIUFVUJzo6a21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0xJQlJBUlknOjprbXBfc2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0RFRkFVTFRTJzo6a21wX3NldF9kZWZhdWx0cworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfU1RBQ0tTSVpFJzo6a21wX2dldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX1NUQUNLU0laRV9TJzo6a21wX2dldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfQkxPQ0tUSU1FJzo6a21wX2dldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX0xJQlJBUlknOjprbXBfZ2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfTUFMTE9DJzo6a21wX21hbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9DQUxMT0MnOjprbXBfY2FsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1JFQUxMT0MnOjprbXBfcmVhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9GUkVFJzo6a21wX2ZyZWUKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfV0FSTklOR1NfT04nOjprbXBfc2V0X3dhcm5pbmdzX29uCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9XQVJOSU5HU19PRkYnOjprbXBfc2V0X3dhcm5pbmdzX29mZgorCishZGVjJCAgIGVuZGlmCishZGVjJCBlbmRpZgorCishZGVjJCBpZiBkZWZpbmVkKF9fbGludXgpCisKKyEqKioKKyEqKiogVGhlIExpbnV4KiBPUyBlbnRyeSBwb2ludHMgYXJlIGluIGxvd2VyY2FzZSwgd2l0aCBhbiB1bmRlcnNjb3JlIGFwcGVuZGVkLgorISoqKgorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X251bV90aHJlYWRzXyc6Om9tcF9zZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfZHluYW1pY18nOjpvbXBfc2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbmVzdGVkXyc6Om9tcF9zZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X251bV90aHJlYWRzXyc6Om9tcF9nZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbWF4X3RocmVhZHNfJzo6b21wX2dldF9tYXhfdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF90aHJlYWRfbnVtXyc6Om9tcF9nZXRfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9udW1fcHJvY3NfJzo6b21wX2dldF9udW1fcHJvY3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9pbl9wYXJhbGxlbF8nOjpvbXBfaW5fcGFyYWxsZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfZHluYW1pY18nOjpvbXBfZ2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbmVzdGVkXyc6Om9tcF9nZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X3d0aW1lXyc6Om9tcF9nZXRfd3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfd3RpY2tfJzo6b21wX2dldF93dGljaworCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfaW5pdF9sb2NrXyc6Om9tcF9pbml0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9kZXN0cm95X2xvY2tfJzo6b21wX2Rlc3Ryb3lfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9sb2NrXyc6Om9tcF9zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Vuc2V0X2xvY2tfJzo6b21wX3Vuc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF90ZXN0X2xvY2tfJzo6b21wX3Rlc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2luaXRfbmVzdF9sb2NrXyc6Om9tcF9pbml0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2Rlc3Ryb3lfbmVzdF9sb2NrXyc6Om9tcF9kZXN0cm95X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9uZXN0X2xvY2tfJzo6b21wX3NldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF91bnNldF9uZXN0X2xvY2tfJzo6b21wX3Vuc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Rlc3RfbmVzdF9sb2NrXyc6Om9tcF90ZXN0X25lc3RfbG9jaworCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X3N0YWNrc2l6ZV8nOjprbXBfc2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9zdGFja3NpemVfc18nOjprbXBfc2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2Jsb2NrdGltZV8nOjprbXBfc2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9saWJyYXJ5X3NlcmlhbF8nOjprbXBfc2V0X2xpYnJhcnlfc2VyaWFsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZF8nOjprbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXRfJzo6a21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfbGlicmFyeV8nOjprbXBfc2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfZGVmYXVsdHNfJzo6a21wX3NldF9kZWZhdWx0cworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2dldF9zdGFja3NpemVfJzo6a21wX2dldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfc3RhY2tzaXplX3NfJzo6a21wX2dldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2dldF9ibG9ja3RpbWVfJzo6a21wX2dldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfbGlicmFyeV8nOjprbXBfZ2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9tYWxsb2NfJzo6a21wX21hbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2NhbGxvY18nOjprbXBfY2FsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfcmVhbGxvY18nOjprbXBfcmVhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2ZyZWVfJzo6a21wX2ZyZWUKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF93YXJuaW5nc19vbl8nOjprbXBfc2V0X3dhcm5pbmdzX29uCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X3dhcm5pbmdzX29mZl8nOjprbXBfc2V0X3dhcm5pbmdzX29mZgorCishZGVjJCBlbmRpZgorCishZGVjJCBpZiBkZWZpbmVkKF9fQVBQTEVfXykKKworISoqKgorISoqKiBUaGUgTWFjIGVudHJ5IHBvaW50cyBhcmUgaW4gbG93ZXJjYXNlLCB3aXRoIGFuIGJvdGggYW4gdW5kZXJzY29yZQorISoqKiBhcHBlbmRlZCBhbmQgYW4gdW5kZXJzY29yZSBwcmVwZW5kZWQuCishKioqCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X251bV90aHJlYWRzXyc6Om9tcF9zZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X2R5bmFtaWNfJzo6b21wX3NldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9uZXN0ZWRfJzo6b21wX3NldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X251bV90aHJlYWRzXyc6Om9tcF9nZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X21heF90aHJlYWRzXyc6Om9tcF9nZXRfbWF4X3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X3RocmVhZF9udW1fJzo6b21wX2dldF90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9udW1fcHJvY3NfJzo6b21wX2dldF9udW1fcHJvY3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfaW5fcGFyYWxsZWxfJzo6b21wX2luX3BhcmFsbGVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9keW5hbWljXyc6Om9tcF9nZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbmVzdGVkXyc6Om9tcF9nZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF93dGltZV8nOjpvbXBfZ2V0X3d0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF93dGlja18nOjpvbXBfZ2V0X3d0aWNrCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfaW5pdF9sb2NrXyc6Om9tcF9pbml0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZGVzdHJveV9sb2NrXyc6Om9tcF9kZXN0cm95X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X2xvY2tfJzo6b21wX3NldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Vuc2V0X2xvY2tfJzo6b21wX3Vuc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdGVzdF9sb2NrXyc6Om9tcF90ZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfaW5pdF9uZXN0X2xvY2tfJzo6b21wX2luaXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2Rlc3Ryb3lfbmVzdF9sb2NrXyc6Om9tcF9kZXN0cm95X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbmVzdF9sb2NrXyc6Om9tcF9zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Vuc2V0X25lc3RfbG9ja18nOjpvbXBfdW5zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Rlc3RfbmVzdF9sb2NrXyc6Om9tcF90ZXN0X25lc3RfbG9jaworCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9zdGFja3NpemVfJzo6a21wX3NldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X3N0YWNrc2l6ZV9zXyc6OmttcF9zZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2Jsb2NrdGltZV8nOjprbXBfc2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfbGlicmFyeV9zZXJpYWxfJzo6a21wX3NldF9saWJyYXJ5X3NlcmlhbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kXyc6OmttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXRfJzo6a21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2xpYnJhcnlfJzo6a21wX3NldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9kZWZhdWx0c18nOjprbXBfc2V0X2RlZmF1bHRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9zdGFja3NpemVfJzo6a21wX2dldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X3N0YWNrc2l6ZV9zXyc6OmttcF9nZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X2Jsb2NrdGltZV8nOjprbXBfZ2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfbGlicmFyeV8nOjprbXBfZ2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfbWFsbG9jXyc6OmttcF9tYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfY2FsbG9jXyc6OmttcF9jYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfcmVhbGxvY18nOjprbXBfcmVhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9mcmVlXyc6OmttcF9mcmVlCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X3dhcm5pbmdzX29uXyc6OmttcF9zZXRfd2FybmluZ3Nfb24KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X3dhcm5pbmdzX29mZl8nOjprbXBfc2V0X3dhcm5pbmdzX29mZgorCishZGVjJCBlbmRpZgorCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvMzAvaW9tcC5oLnZhciBiL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvMzAvaW9tcC5oLnZhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjQ5MDFiCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS8zMC9pb21wLmgudmFyCkBAIC0wLDAgKzEsOTggQEAKKy8qCisgKiBpbmNsdWRlLzMwL2lvbXAuaC52YXIKKyAqICRSZXZpc2lvbjogNDI5NTEgJAorICogJERhdGU6IDIwMTQtMDEtMjEgMTQ6NDE6NDEgLTA2MDAgKFR1ZSwgMjEgSmFuIDIwMTQpICQKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBfX0lPTVBfSAorIyAgIGRlZmluZSBfX0lPTVBfSAorCisjICAgZGVmaW5lIEtNUF9WRVJTSU9OX01BSk9SICAgICRLTVBfVkVSU0lPTl9NQUpPUgorIyAgIGRlZmluZSBLTVBfVkVSU0lPTl9NSU5PUiAgICAkS01QX1ZFUlNJT05fTUlOT1IKKyMgICBkZWZpbmUgS01QX1ZFUlNJT05fQlVJTEQgICAgJEtNUF9WRVJTSU9OX0JVSUxECisjICAgZGVmaW5lIEtNUF9CVUlMRF9EQVRFICAgICAgICIkS01QX0JVSUxEX0RBVEUiCisKKyMgICBpZmRlZiBfX2NwbHVzcGx1cworICAgICAgICBleHRlcm4gIkMiIHsKKyMgICBlbmRpZgorCisjICAgICAgIGRlZmluZSBrbXBfc2V0X3N0YWNrc2l6ZSAgICAgICAgICAgIGttcGNfc2V0X3N0YWNrc2l6ZQorIyAgICAgICBkZWZpbmUga21wX3NldF9zdGFja3NpemVfcyAgICAgICAgICBrbXBjX3NldF9zdGFja3NpemVfcworIyAgICAgICBkZWZpbmUga21wX3NldF9ibG9ja3RpbWUgICAgICAgICAgICBrbXBjX3NldF9ibG9ja3RpbWUKKyMgICAgICAgZGVmaW5lIGttcF9zZXRfbGlicmFyeSAgICAgICAgICAgICAga21wY19zZXRfbGlicmFyeQorIyAgICAgICBkZWZpbmUga21wX3NldF9kZWZhdWx0cyAgICAgICAgICAgICBrbXBjX3NldF9kZWZhdWx0cworIyAgICAgICBkZWZpbmUga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MgICBrbXBjX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyMgICAgICAgZGVmaW5lIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2Mga21wY191bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKyMgICAgICAgZGVmaW5lIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jICAga21wY19nZXRfYWZmaW5pdHlfbWFza19wcm9jCisKKyMgICAgICAgZGVmaW5lIGttcF9tYWxsb2MgICAgICAgICAgICAgICAgICAga21wY19tYWxsb2MKKyMgICAgICAgZGVmaW5lIGttcF9jYWxsb2MgICAgICAgICAgICAgICAgICAga21wY19jYWxsb2MKKyMgICAgICAgZGVmaW5lIGttcF9yZWFsbG9jICAgICAgICAgICAgICAgICAga21wY19yZWFsbG9jCisjICAgICAgIGRlZmluZSBrbXBfZnJlZSAgICAgICAgICAgICAgICAgICAgIGttcGNfZnJlZQorCisjICAgaWYgZGVmaW5lZChfV0lOMzIpCisjICAgICAgIGRlZmluZSBfX0tBSV9LTVBDX0NPTlZFTlRJT04gX19jZGVjbAorIyAgIGVsc2UKKyMgICAgICAgZGVmaW5lIF9fS0FJX0tNUENfQ09OVkVOVElPTgorIyAgIGVuZGlmCisKKyMgICBpbmNsdWRlIDxzdGRsaWIuaD4KKyAgICAvKiBrbXAgQVBJIGZ1bmN0aW9ucyAqLworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZ2V0X3N0YWNrc2l6ZSAgICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfc3RhY2tzaXplICAgICAgICAgIChpbnQpOworICAgIGV4dGVybiBzaXplX3QgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZ2V0X3N0YWNrc2l6ZV9zICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfc3RhY2tzaXplX3MgICAgICAgIChzaXplX3QpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZ2V0X2Jsb2NrdGltZSAgICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9nZXRfbGlicmFyeSAgICAgICAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9ibG9ja3RpbWUgICAgICAgICAgKGludCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfbGlicmFyeSAgICAgICAgICAgIChpbnQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsICAgICAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2RlZmF1bHRzICAgICAgICAgICAoY2hhciBjb25zdCAqKTsKKworICAgIC8qIGFmZmluaXR5IEFQSSBmdW5jdGlvbnMgKi8KKyAgICB0eXBlZGVmIHZvaWQgKiBrbXBfYWZmaW5pdHlfbWFza190OworCisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfYWZmaW5pdHkgICAgICAgICAgICAgKGttcF9hZmZpbml0eV9tYXNrX3QgKik7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9nZXRfYWZmaW5pdHkgICAgICAgICAgICAgKGttcF9hZmZpbml0eV9tYXNrX3QgKik7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MgICAgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfY3JlYXRlX2FmZmluaXR5X21hc2sgICAgIChrbXBfYWZmaW5pdHlfbWFza190ICopOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrICAgIChrbXBfYWZmaW5pdHlfbWFza190ICopOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYyAgIChpbnQsIGttcF9hZmZpbml0eV9tYXNrX3QgKik7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MgKGludCwga21wX2FmZmluaXR5X21hc2tfdCAqKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MgICAoaW50LCBrbXBfYWZmaW5pdHlfbWFza190ICopOworCisgICAgZXh0ZXJuIHZvaWQgKiBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9tYWxsb2MgIChzaXplX3QpOworICAgIGV4dGVybiB2b2lkICogX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfY2FsbG9jICAoc2l6ZV90LCBzaXplX3QpOworICAgIGV4dGVybiB2b2lkICogX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfcmVhbGxvYyAodm9pZCAqLCBzaXplX3QpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZnJlZSAgICAodm9pZCAqKTsKKworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X3dhcm5pbmdzX29uKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X3dhcm5pbmdzX29mZih2b2lkKTsKKworIyAgIHVuZGVmIF9fS0FJX0tNUENfQ09OVkVOVElPTgorCisgICAgLyogV2FybmluZzoKKyAgICAgICBUaGUgZm9sbG93aW5nIHR5cGVkZWZzIGFyZSBub3Qgc3RhbmRhcmQsIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSByZWxlYXNlLgorICAgICovCisgICAgdHlwZWRlZiBpbnQgICAgIG9tcF9pbnRfdDsKKyAgICB0eXBlZGVmIGRvdWJsZSAgb21wX3d0aW1lX3Q7CisKKyMgICBpZmRlZiBfX2NwbHVzcGx1cworICAgICAgICB9CisjICAgZW5kaWYKKworI2VuZGlmIC8qIF9fSU9NUF9IICovCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvMzAvaW9tcF9saWIuaC52YXIgYi9maW5hbC9ydW50aW1lL3NyYy9pbmNsdWRlLzMwL2lvbXBfbGliLmgudmFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4MzEwNzMKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9pbmNsdWRlLzMwL2lvbXBfbGliLmgudmFyCkBAIC0wLDAgKzEsODMgQEAKKyEgaW5jbHVkZS8zMC9pb21wX2xpYi5oLnZhcgorISAkUmV2aXNpb246IDQyOTUxICQKKyEgJERhdGU6IDIwMTQtMDEtMjEgMTQ6NDE6NDEgLTA2MDAgKFR1ZSwgMjEgSmFuIDIwMTQpICQKKworIQorIS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCishLy8KKyEvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCishLy8KKyEvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCishLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCishLy8KKyEvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIQorCishKioqCishKioqIG9tcF9pbnRlZ2VyX2tpbmQgYW5kIG9tcF9sb2dpY2FsX2tpbmQgYXBwZWFyIHRvIGJlIHByZWRlZmluZWQgYnkgZ2NjIGFuZAorISoqKiBnZm9ydHJhbiAoZGVmaW5pdGlvbnMgZG8gbm90IGFwcGVhciBpbiB0aGUgb21wLmggLyBvbXBfbGliLmggL29tcF9saWIuZikuCishKioqIG9tcF9yZWFsX2tpbmQgaXMgbm90IHByZWRlZmluZWQsIGhvd2V2ZXIuCishKioqCisKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX21ham9yID0gJEtNUF9WRVJTSU9OX01BSk9SCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9taW5vciA9ICRLTVBfVkVSU0lPTl9NSU5PUgorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fYnVpbGQgPSAkS01QX1ZFUlNJT05fQlVJTEQKKyAgICAgICAgY2hhcmFjdGVyKCopICAgICAgICAgIGttcF9idWlsZF9kYXRlCisgICAgICAgIHBhcmFtZXRlcigga21wX2J1aWxkX2RhdGUgPSAnJEtNUF9CVUlMRF9EQVRFJyApCisKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9yZWFsX2tpbmQgPSA0CisKKyEqKioKKyEqKioga21wXyogdHlwZSBleHRlbnNpb25zCishKioqCisKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF9wb2ludGVyX2tpbmQgICAgICAgPSAkS01QX0lOVF9QVFJfS0lORAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX3NpemVfdF9raW5kICAgICAgICA9ICRLTVBfSU5UX1BUUl9LSU5ECisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfYWZmaW5pdHlfbWFza19raW5kID0gJEtNUF9JTlRfUFRSX0tJTkQKKworISoqKgorISoqKiBrbXBfKiBlbnRyeSBwb2ludHMKKyEqKioKKworICAgICAgICBleHRlcm5hbCBrbXBfc2V0X3N0YWNrc2l6ZQorICAgICAgICBleHRlcm5hbCBrbXBfc2V0X3N0YWNrc2l6ZV9zCisgICAgICAgIGV4dGVybmFsIGttcF9zZXRfYmxvY2t0aW1lCisgICAgICAgIGV4dGVybmFsIGttcF9zZXRfbGlicmFyeV9zZXJpYWwKKyAgICAgICAgZXh0ZXJuYWwga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKyAgICAgICAgZXh0ZXJuYWwga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKyAgICAgICAgZXh0ZXJuYWwga21wX3NldF9saWJyYXJ5CisgICAgICAgIGV4dGVybmFsIGttcF9zZXRfZGVmYXVsdHMKKyAgICAgICAgZXh0ZXJuYWwga21wX2dldF9zdGFja3NpemUKKyAgICAgICAgaW50ZWdlciBrbXBfZ2V0X3N0YWNrc2l6ZQorICAgICAgICBleHRlcm5hbCBrbXBfZ2V0X3N0YWNrc2l6ZV9zCisgICAgICAgIGludGVnZXIgKGtpbmQgPSBrbXBfc2l6ZV90X2tpbmQpIGttcF9nZXRfc3RhY2tzaXplX3MKKyAgICAgICAgZXh0ZXJuYWwga21wX2dldF9ibG9ja3RpbWUKKyAgICAgICAgaW50ZWdlciBrbXBfZ2V0X2Jsb2NrdGltZQorICAgICAgICBleHRlcm5hbCBrbXBfZ2V0X2xpYnJhcnkKKyAgICAgICAgaW50ZWdlciBrbXBfZ2V0X2xpYnJhcnkKKyAgICAgICAgZXh0ZXJuYWwga21wX3NldF9hZmZpbml0eQorICAgICAgICBpbnRlZ2VyIGttcF9zZXRfYWZmaW5pdHkKKyAgICAgICAgZXh0ZXJuYWwga21wX2dldF9hZmZpbml0eQorICAgICAgICBpbnRlZ2VyIGttcF9nZXRfYWZmaW5pdHkKKyAgICAgICAgZXh0ZXJuYWwga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworICAgICAgICBpbnRlZ2VyIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKyAgICAgICAgZXh0ZXJuYWwga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrCisgICAgICAgIGV4dGVybmFsIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2sKKyAgICAgICAgZXh0ZXJuYWwga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyAgICAgICAgaW50ZWdlciBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICAgICBleHRlcm5hbCBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgIGludGVnZXIga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICAgICBleHRlcm5hbCBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICAgICBpbnRlZ2VyIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgIGV4dGVybmFsIGttcF9tYWxsb2MKKyAgICAgICAgaW50ZWdlciAoa2luZCA9IGttcF9wb2ludGVyX2tpbmQpIGttcF9tYWxsb2MKKyAgICAgICAgZXh0ZXJuYWwga21wX2NhbGxvYworICAgICAgICBpbnRlZ2VyIChraW5kID0ga21wX3BvaW50ZXJfa2luZCkga21wX2NhbGxvYworICAgICAgICBleHRlcm5hbCBrbXBfcmVhbGxvYworICAgICAgICBpbnRlZ2VyIChraW5kID0ga21wX3BvaW50ZXJfa2luZCkga21wX3JlYWxsb2MKKyAgICAgICAgZXh0ZXJuYWwga21wX2ZyZWUKKworICAgICAgICBleHRlcm5hbCBrbXBfc2V0X3dhcm5pbmdzX29uCisgICAgICAgIGV4dGVybmFsIGttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS8zMC9vbXAuaC52YXIgYi9maW5hbC9ydW50aW1lL3NyYy9pbmNsdWRlLzMwL29tcC5oLnZhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmY2NTEwCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS8zMC9vbXAuaC52YXIKQEAgLTAsMCArMSwxNjUgQEAKKy8qCisgKiBpbmNsdWRlLzMwL29tcC5oLnZhcgorICogJFJldmlzaW9uOiA0Mjk1MSAkCisgKiAkRGF0ZTogMjAxNC0wMS0yMSAxNDo0MTo0MSAtMDYwMCAoVHVlLCAyMSBKYW4gMjAxNCkgJAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIF9fT01QX0gKKyMgICBkZWZpbmUgX19PTVBfSAorCisjICAgZGVmaW5lIEtNUF9WRVJTSU9OX01BSk9SICAgICRLTVBfVkVSU0lPTl9NQUpPUgorIyAgIGRlZmluZSBLTVBfVkVSU0lPTl9NSU5PUiAgICAkS01QX1ZFUlNJT05fTUlOT1IKKyMgICBkZWZpbmUgS01QX1ZFUlNJT05fQlVJTEQgICAgJEtNUF9WRVJTSU9OX0JVSUxECisjICAgZGVmaW5lIEtNUF9CVUlMRF9EQVRFICAgICAgICIkS01QX0JVSUxEX0RBVEUiCisKKyMgICBpZmRlZiBfX2NwbHVzcGx1cworICAgIGV4dGVybiAiQyIgeworIyAgIGVuZGlmCisKKyMgICAgICAgZGVmaW5lIG9tcF9zZXRfbnVtX3RocmVhZHMgICAgICAgICAgb21wY19zZXRfbnVtX3RocmVhZHMKKyMgICAgICAgZGVmaW5lIG9tcF9zZXRfZHluYW1pYyAgICAgICAgICAgICAgb21wY19zZXRfZHluYW1pYworIyAgICAgICBkZWZpbmUgb21wX3NldF9uZXN0ZWQgICAgICAgICAgICAgICBvbXBjX3NldF9uZXN0ZWQKKyMgICAgICAgZGVmaW5lIG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMgICAgb21wY19zZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyMgICAgICAgZGVmaW5lIG9tcF9zZXRfc2NoZWR1bGUgICAgICAgICAgICAgb21wY19zZXRfc2NoZWR1bGUKKyMgICAgICAgZGVmaW5lIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bSAgb21wY19nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorIyAgICAgICBkZWZpbmUgb21wX2dldF90ZWFtX3NpemUgICAgICAgICAgICBvbXBjX2dldF90ZWFtX3NpemUKKworCisjICAgICAgIGRlZmluZSBrbXBfc2V0X3N0YWNrc2l6ZSAgICAgICAgICAgIGttcGNfc2V0X3N0YWNrc2l6ZQorIyAgICAgICBkZWZpbmUga21wX3NldF9zdGFja3NpemVfcyAgICAgICAgICBrbXBjX3NldF9zdGFja3NpemVfcworIyAgICAgICBkZWZpbmUga21wX3NldF9ibG9ja3RpbWUgICAgICAgICAgICBrbXBjX3NldF9ibG9ja3RpbWUKKyMgICAgICAgZGVmaW5lIGttcF9zZXRfbGlicmFyeSAgICAgICAgICAgICAga21wY19zZXRfbGlicmFyeQorIyAgICAgICBkZWZpbmUga21wX3NldF9kZWZhdWx0cyAgICAgICAgICAgICBrbXBjX3NldF9kZWZhdWx0cworIyAgICAgICBkZWZpbmUga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MgICBrbXBjX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyMgICAgICAgZGVmaW5lIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2Mga21wY191bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKyMgICAgICAgZGVmaW5lIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jICAga21wY19nZXRfYWZmaW5pdHlfbWFza19wcm9jCisKKyMgICAgICAgZGVmaW5lIGttcF9tYWxsb2MgICAgICAgICAgICAgICAgICAga21wY19tYWxsb2MKKyMgICAgICAgZGVmaW5lIGttcF9jYWxsb2MgICAgICAgICAgICAgICAgICAga21wY19jYWxsb2MKKyMgICAgICAgZGVmaW5lIGttcF9yZWFsbG9jICAgICAgICAgICAgICAgICAga21wY19yZWFsbG9jCisjICAgICAgIGRlZmluZSBrbXBfZnJlZSAgICAgICAgICAgICAgICAgICAgIGttcGNfZnJlZQorCisKKyMgICBpZiBkZWZpbmVkKF9XSU4zMikKKyMgICAgICAgZGVmaW5lIF9fS0FJX0tNUENfQ09OVkVOVElPTiBfX2NkZWNsCisjICAgZWxzZQorIyAgICAgICBkZWZpbmUgX19LQUlfS01QQ19DT05WRU5USU9OCisjICAgZW5kaWYKKworICAgIC8qIHNjaGVkdWxlIGtpbmQgY29uc3RhbnRzICovCisgICAgdHlwZWRlZiBlbnVtIG9tcF9zY2hlZF90IHsKKwlvbXBfc2NoZWRfc3RhdGljICA9IDEsCisJb21wX3NjaGVkX2R5bmFtaWMgPSAyLAorCW9tcF9zY2hlZF9ndWlkZWQgID0gMywKKwlvbXBfc2NoZWRfYXV0byAgICA9IDQKKyAgICB9IG9tcF9zY2hlZF90OworCisgICAgLyogc2V0IEFQSSBmdW5jdGlvbnMgKi8KKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3NldF9udW1fdGhyZWFkcyAoaW50KTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3NldF9keW5hbWljICAgICAoaW50KTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3NldF9uZXN0ZWQgICAgICAoaW50KTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3NldF9tYXhfYWN0aXZlX2xldmVscyAoaW50KTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3NldF9zY2hlZHVsZSAgICAgICAgICAob21wX3NjaGVkX3QsIGludCk7CisKKyAgICAvKiBxdWVyeSBBUEkgZnVuY3Rpb25zICovCisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfbnVtX3RocmVhZHMgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9keW5hbWljICAgICAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X25lc3RlZCAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfbWF4X3RocmVhZHMgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF90aHJlYWRfbnVtICAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X251bV9wcm9jcyAgICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9pbl9wYXJhbGxlbCAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9hY3RpdmVfbGV2ZWwgICAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9sZXZlbCAgICAgICAgICAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtIChpbnQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X3RlYW1fc2l6ZSAgICAgICAgICAgKGludCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfdGhyZWFkX2xpbWl0ICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMgICAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfc2NoZWR1bGUgICAgICAgICAgICAob21wX3NjaGVkX3QgKiwgaW50ICopOworCisgICAgLyogbG9jayBBUEkgZnVuY3Rpb25zICovCisgICAgdHlwZWRlZiBzdHJ1Y3Qgb21wX2xvY2tfdCB7CisgICAgICAgIHZvaWQgKiBfbGs7CisgICAgfSBvbXBfbG9ja190OworCisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9pbml0X2xvY2sgICAgKG9tcF9sb2NrX3QgKik7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9zZXRfbG9jayAgICAgKG9tcF9sb2NrX3QgKik7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF91bnNldF9sb2NrICAgKG9tcF9sb2NrX3QgKik7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9kZXN0cm95X2xvY2sgKG9tcF9sb2NrX3QgKik7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF90ZXN0X2xvY2sgICAgKG9tcF9sb2NrX3QgKik7CisKKyAgICAvKiBuZXN0ZWQgbG9jayBBUEkgZnVuY3Rpb25zICovCisgICAgdHlwZWRlZiBzdHJ1Y3Qgb21wX25lc3RfbG9ja190IHsKKyAgICAgICAgdm9pZCAqIF9sazsKKyAgICB9IG9tcF9uZXN0X2xvY2tfdDsKKworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfaW5pdF9uZXN0X2xvY2sgICAgKG9tcF9uZXN0X2xvY2tfdCAqKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3NldF9uZXN0X2xvY2sgICAgIChvbXBfbmVzdF9sb2NrX3QgKik7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF91bnNldF9uZXN0X2xvY2sgICAob21wX25lc3RfbG9ja190ICopOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZGVzdHJveV9uZXN0X2xvY2sgKG9tcF9uZXN0X2xvY2tfdCAqKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3Rlc3RfbmVzdF9sb2NrICAgIChvbXBfbmVzdF9sb2NrX3QgKik7CisKKyAgICAvKiB0aW1lIEFQSSBmdW5jdGlvbnMgKi8KKyAgICBleHRlcm4gZG91YmxlIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF93dGltZSAodm9pZCk7CisgICAgZXh0ZXJuIGRvdWJsZSBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfd3RpY2sgKHZvaWQpOworCisjICAgaW5jbHVkZSA8c3RkbGliLmg+CisgICAgLyoga21wIEFQSSBmdW5jdGlvbnMgKi8KKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2dldF9zdGFja3NpemUgICAgICAgICAgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X3N0YWNrc2l6ZSAgICAgICAgICAoaW50KTsKKyAgICBleHRlcm4gc2l6ZV90IF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2dldF9zdGFja3NpemVfcyAgICAgICAgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X3N0YWNrc2l6ZV9zICAgICAgICAoc2l6ZV90KTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2dldF9ibG9ja3RpbWUgICAgICAgICAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZ2V0X2xpYnJhcnkgICAgICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfYmxvY2t0aW1lICAgICAgICAgIChpbnQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2xpYnJhcnkgICAgICAgICAgICAoaW50KTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9saWJyYXJ5X3NlcmlhbCAgICAgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZCAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0ICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9kZWZhdWx0cyAgICAgICAgICAgKGNoYXIgY29uc3QgKik7CisKKyAgICAvKiBhZmZpbml0eSBBUEkgZnVuY3Rpb25zICovCisgICAgdHlwZWRlZiB2b2lkICoga21wX2FmZmluaXR5X21hc2tfdDsKKworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2FmZmluaXR5ICAgICAgICAgICAgIChrbXBfYWZmaW5pdHlfbWFza190ICopOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZ2V0X2FmZmluaXR5ICAgICAgICAgICAgIChrbXBfYWZmaW5pdHlfbWFza190ICopOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jICAgICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrICAgICAoa21wX2FmZmluaXR5X21hc2tfdCAqKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzayAgICAoa21wX2FmZmluaXR5X21hc2tfdCAqKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MgICAoaW50LCBrbXBfYWZmaW5pdHlfbWFza190ICopOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jIChpbnQsIGttcF9hZmZpbml0eV9tYXNrX3QgKik7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jICAgKGludCwga21wX2FmZmluaXR5X21hc2tfdCAqKTsKKworICAgIGV4dGVybiB2b2lkICogX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfbWFsbG9jICAoc2l6ZV90KTsKKyAgICBleHRlcm4gdm9pZCAqIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2NhbGxvYyAgKHNpemVfdCwgc2l6ZV90KTsKKyAgICBleHRlcm4gdm9pZCAqIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3JlYWxsb2MgKHZvaWQgKiwgc2l6ZV90KTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2ZyZWUgICAgKHZvaWQgKik7CisKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF93YXJuaW5nc19vbih2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF93YXJuaW5nc19vZmYodm9pZCk7CisKKyMgICB1bmRlZiBfX0tBSV9LTVBDX0NPTlZFTlRJT04KKworICAgIC8qIFdhcm5pbmc6CisgICAgICAgVGhlIGZvbGxvd2luZyB0eXBlZGVmcyBhcmUgbm90IHN0YW5kYXJkLCBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgcmVsZWFzZS4KKyAgICAqLworICAgIHR5cGVkZWYgaW50ICAgICBvbXBfaW50X3Q7CisgICAgdHlwZWRlZiBkb3VibGUgIG9tcF93dGltZV90OworCisjICAgaWZkZWYgX19jcGx1c3BsdXMKKyAgICB9CisjICAgZW5kaWYKKworI2VuZGlmIC8qIF9fT01QX0ggKi8KKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS8zMC9vbXBfbGliLmYudmFyIGIvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS8zMC9vbXBfbGliLmYudmFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0NjA3ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9pbmNsdWRlLzMwL29tcF9saWIuZi52YXIKQEAgLTAsMCArMSw2MzUgQEAKKyEgaW5jbHVkZS8zMC9vbXBfbGliLmYudmFyCishICRSZXZpc2lvbjogNDI5NTEgJAorISAkRGF0ZTogMjAxNC0wMS0yMSAxNDo0MTo0MSAtMDYwMCAoVHVlLCAyMSBKYW4gMjAxNCkgJAorCishCishLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyEvLworIS8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyEvLworIS8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyEvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyEvLworIS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCishCisKKyEqKioKKyEqKiogU29tZSBvZiB0aGUgZGlyZWN0aXZlcyBmb3IgdGhlIGZvbGxvd2luZyByb3V0aW5lIGV4dGVuZCBwYXN0IGNvbHVtbiA3MiwKKyEqKiogc28gcHJvY2VzcyB0aGlzIGZpbGUgaW4gMTMyLWNvbHVtbiBtb2RlLgorISoqKgorCishZGVjJCBmaXhlZGZvcm1saW5lc2l6ZToxMzIKKworICAgICAgbW9kdWxlIG9tcF9saWJfa2luZHMKKworICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2ludGVnZXJfa2luZCAgICAgICA9IDQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9sb2dpY2FsX2tpbmQgICAgICAgPSA0CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfcmVhbF9raW5kICAgICAgICAgID0gNAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2xvY2tfa2luZCAgICAgICAgICA9IGludF9wdHJfa2luZCgpCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfbmVzdF9sb2NrX2tpbmQgICAgID0gaW50X3B0cl9raW5kKCkKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9raW5kICAgICAgICAgPSBvbXBfaW50ZWdlcl9raW5kCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfcG9pbnRlcl9raW5kICAgICAgID0gaW50X3B0cl9raW5kKCkKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF9zaXplX3Rfa2luZCAgICAgICAgPSBpbnRfcHRyX2tpbmQoKQorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX2FmZmluaXR5X21hc2tfa2luZCA9IGludF9wdHJfa2luZCgpCisKKyAgICAgIGVuZCBtb2R1bGUgb21wX2xpYl9raW5kcworCisgICAgICBtb2R1bGUgb21wX2xpYgorCisgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX21ham9yID0gJEtNUF9WRVJTSU9OX01BSk9SCisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9taW5vciA9ICRLTVBfVkVSU0lPTl9NSU5PUgorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fYnVpbGQgPSAkS01QX1ZFUlNJT05fQlVJTEQKKyAgICAgICAgY2hhcmFjdGVyKCopLCBwYXJhbWV0ZXIgOjoga21wX2J1aWxkX2RhdGUgICAgPSAnJEtNUF9CVUlMRF9EQVRFJworICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjogb3Blbm1wX3ZlcnNpb24gICAgPSAkT01QX1ZFUlNJT04KKworICAgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX3N0YXRpYyAgPSAxCisgICAgICAgIGludGVnZXIoa2luZD1vbXBfc2NoZWRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfZHluYW1pYyA9IDIKKyAgICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9ndWlkZWQgID0gMworICAgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2F1dG8gICAgPSA0CisKKyAgICAgICAgaW50ZXJmYWNlCisKKyEgICAgICAgICAqKioKKyEgICAgICAgICAqKiogb21wXyogZW50cnkgcG9pbnRzCishICAgICAgICAgKioqCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbnVtX3RocmVhZHMobnRocmVhZHMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBudGhyZWFkcworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbnVtX3RocmVhZHMKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9keW5hbWljKGVuYWJsZSkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIGVuYWJsZQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfZHluYW1pYworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X25lc3RlZChlbmFibGUpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBlbmFibGUKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X25lc3RlZAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fdGhyZWFkcygpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV90aHJlYWRzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3RocmVhZHMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X3RocmVhZHMoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9tYXhfdGhyZWFkcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X21heF90aHJlYWRzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9udW0oKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90aHJlYWRfbnVtCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX251bQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fcHJvY3MoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fcHJvY3MKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fcHJvY3MKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9pbl9wYXJhbGxlbCgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfaW5fcGFyYWxsZWwKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2luX3BhcmFsbGVsCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2R5bmFtaWMoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2dldF9keW5hbWljCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfZHluYW1pYworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9uZXN0ZWQoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2dldF9uZXN0ZWQKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9uZXN0ZWQKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX2xpbWl0KCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfdGhyZWFkX2xpbWl0CisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX2xpbWl0CisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMobWF4X2xldmVscykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG1heF9sZXZlbHMKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9tYXhfYWN0aXZlX2xldmVscworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9sZXZlbCgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2xldmVsCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbGV2ZWwKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfYWN0aXZlX2xldmVsKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfYWN0aXZlX2xldmVsCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfYWN0aXZlX2xldmVsCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0obGV2ZWwpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBsZXZlbAorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RlYW1fc2l6ZShsZXZlbCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGxldmVsCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfdGVhbV9zaXplCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGVhbV9zaXplCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfc2NoZWR1bGUoa2luZCwgbW9kaWZpZXIpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfc2NoZWRfa2luZCkga2luZAorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBtb2RpZmllcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfc2NoZWR1bGUKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2dldF9zY2hlZHVsZShraW5kLCBtb2RpZmllcikKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9zY2hlZF9raW5kKSBraW5kCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG1vZGlmaWVyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2dldF9zY2hlZHVsZQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF93dGltZSgpCisgICAgICAgICAgICBkb3VibGUgcHJlY2lzaW9uIG9tcF9nZXRfd3RpbWUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF93dGltZQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF93dGljayAoKQorICAgICAgICAgICAgZG91YmxlIHByZWNpc2lvbiBvbXBfZ2V0X3d0aWNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfd3RpY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2luaXRfbG9jayhsb2NrdmFyKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9pbml0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbG9jayhsb2NrdmFyKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9sb2NrKGxvY2t2YXIpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF91bnNldF9sb2NrKGxvY2t2YXIpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3Vuc2V0X2xvY2sKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF90ZXN0X2xvY2sobG9ja3ZhcikKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF90ZXN0X2xvY2sKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfdGVzdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9pbml0X25lc3RfbG9jayhsb2NrdmFyKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2luaXRfbmVzdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X25lc3RfbG9jayhsb2NrdmFyKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdF9sb2NrKGxvY2t2YXIpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X25lc3RfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfdW5zZXRfbmVzdF9sb2NrKGxvY2t2YXIpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfdW5zZXRfbmVzdF9sb2NrCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfdGVzdF9uZXN0X2xvY2sobG9ja3ZhcikKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF90ZXN0X25lc3RfbG9jaworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX3Rlc3RfbmVzdF9sb2NrCisKKyEgICAgICAgICAqKioKKyEgICAgICAgICAqKioga21wXyogZW50cnkgcG9pbnRzCishICAgICAgICAgKioqCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplKHNpemUpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBzaXplCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemUKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemVfcyhzaXplKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBzaXplCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemVfcworCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2Jsb2NrdGltZShtc2VjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbXNlYworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfYmxvY2t0aW1lCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV9zZXJpYWwoKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV9zZXJpYWwKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQoKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0KCkKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dAorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnkobGlibnVtKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbGlibnVtCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5CisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfZGVmYXVsdHMoc3RyaW5nKQorICAgICAgICAgICAgY2hhcmFjdGVyKigqKSBzdHJpbmcKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2RlZmF1bHRzCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZSgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X3N0YWNrc2l6ZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZQorCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemVfcygpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIGttcF9nZXRfc3RhY2tzaXplX3MKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemVfcworCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9ibG9ja3RpbWUoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9ibG9ja3RpbWUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9ibG9ja3RpbWUKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfbGlicmFyeSgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2xpYnJhcnkKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9saWJyYXJ5CisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5KG1hc2spCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfc2V0X2FmZmluaXR5CisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eQorCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eShtYXNrKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9hZmZpbml0eQorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHkKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFzayhtYXNrKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFzaworCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrKG1hc2spCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzaworCisgICAgICAgICAgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MocHJvYywgbWFzaykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIHByb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYyhwcm9jLCBtYXNrKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBwcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MocHJvYywgbWFzaykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIHByb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX21hbGxvYyhzaXplKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX21hbGxvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIHNpemUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX21hbGxvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX2NhbGxvYyhuZWxlbSwgZWxzaXplKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX2NhbGxvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIG5lbGVtCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkgZWxzaXplCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9jYWxsb2MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9yZWFsbG9jKHB0ciwgc2l6ZSkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGttcF9yZWFsbG9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIHB0cgorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIHNpemUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3JlYWxsb2MKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX2ZyZWUocHRyKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkgcHRyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX2ZyZWUKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vbigpCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vbgorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29mZigpCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vZmYKKworICAgICAgICBlbmQgaW50ZXJmYWNlCisKKyFkZWMkIGlmIGRlZmluZWQoX1dJTjMyKQorIWRlYyQgICBpZiBkZWZpbmVkKF9XSU42NCkgLm9yLiBkZWZpbmVkKF9NX0FNRDY0KQorCishKioqCishKioqIFRoZSBGb3J0cmFuIGVudHJ5IHBvaW50cyBtdXN0IGJlIGluIHVwcGVyY2FzZSwgZXZlbiBpZiB0aGUgL1Fsb3dlcmNhc2UKKyEqKiogb3B0aW9uIGlzIHNwZWNpZmllZC4gIFRoZSBhbGlhcyBhdHRyaWJ1dGUgZW5zdXJlcyB0aGF0IHRoZSBzcGVjaWZpZWQKKyEqKiogc3RyaW5nIGlzIHVzZWQgYXMgdGhlIGVudHJ5IHBvaW50LgorISoqKgorISoqKiBPbiB0aGUgV2luZG93cyogT1MgSUEtMzIgYXJjaGl0ZWN0dXJlLCB0aGUgRm9ydHJhbiBlbnRyeSBwb2ludHMgaGF2ZSBhbgorISoqKiB1bmRlcnNjb3JlIHByZXBlbmRlZC4gIE9uIHRoZSBXaW5kb3dzKiBPUyBJbnRlbChSKSA2NAorISoqKiBhcmNoaXRlY3R1cmUsIG5vIHVuZGVyc2NvcmUgaXMgcHJlcGVuZGVkLgorISoqKgorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfU0VUX05VTV9USFJFQURTJyA6OiBvbXBfc2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfU0VUX0RZTkFNSUMnIDo6IG9tcF9zZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX1NFVF9ORVNURUQnIDo6IG9tcF9zZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX05VTV9USFJFQURTJyA6OiBvbXBfZ2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX01BWF9USFJFQURTJyA6OiBvbXBfZ2V0X21heF90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1RIUkVBRF9OVU0nIDo6IG9tcF9nZXRfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9OVU1fUFJPQ1MnIDo6IG9tcF9nZXRfbnVtX3Byb2NzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfSU5fUEFSQUxMRUwnIDo6IG9tcF9pbl9wYXJhbGxlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9EWU5BTUlDJyA6OiBvbXBfZ2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTkVTVEVEJyA6OiBvbXBfZ2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9USFJFQURfTElNSVQnIDo6IG9tcF9nZXRfdGhyZWFkX2xpbWl0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfU0VUX01BWF9BQ1RJVkVfTEVWRUxTJyA6OiBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX01BWF9BQ1RJVkVfTEVWRUxTJyA6OiBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX0xFVkVMJyA6OiBvbXBfZ2V0X2xldmVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX0FDVElWRV9MRVZFTCcgOjogb21wX2dldF9hY3RpdmVfbGV2ZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfQU5DRVNUT1JfVEhSRUFEX05VTScgOjogb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1RFQU1fU0laRScgOjogb21wX2dldF90ZWFtX3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9TRVRfU0NIRURVTEUnIDo6IG9tcF9zZXRfc2NoZWR1bGUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfU0NIRURVTEUnIDo6IG9tcF9nZXRfc2NoZWR1bGUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfV1RJTUUnIDo6IG9tcF9nZXRfd3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfV1RJQ0snIDo6IG9tcF9nZXRfd3RpY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2luaXRfbG9jaycgOjogb21wX2luaXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2Rlc3Ryb3lfbG9jaycgOjogb21wX2Rlc3Ryb3lfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9sb2NrJyA6OiBvbXBfc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF91bnNldF9sb2NrJyA6OiBvbXBfdW5zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Rlc3RfbG9jaycgOjogb21wX3Rlc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2luaXRfbmVzdF9sb2NrJyA6OiBvbXBfaW5pdF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9kZXN0cm95X25lc3RfbG9jaycgOjogb21wX2Rlc3Ryb3lfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X25lc3RfbG9jaycgOjogb21wX3NldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF91bnNldF9uZXN0X2xvY2snIDo6IG9tcF91bnNldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF90ZXN0X25lc3RfbG9jaycgOjogb21wX3Rlc3RfbmVzdF9sb2NrCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfU1RBQ0tTSVpFJzo6a21wX3NldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfU1RBQ0tTSVpFX1MnOjprbXBfc2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0JMT0NLVElNRSc6OmttcF9zZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0xJQlJBUllfU0VSSUFMJzo6a21wX3NldF9saWJyYXJ5X3NlcmlhbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9MSUJSQVJZX1RVUk5BUk9VTkQnOjprbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9MSUJSQVJZX1RIUk9VR0hQVVQnOjprbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9MSUJSQVJZJzo6a21wX3NldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX1NUQUNLU0laRSc6OmttcF9nZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX1NUQUNLU0laRV9TJzo6a21wX2dldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9CTE9DS1RJTUUnOjprbXBfZ2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9MSUJSQVJZJzo6a21wX2dldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0FGRklOSVRZJzo6a21wX3NldF9hZmZpbml0eQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9BRkZJTklUWSc6OmttcF9nZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9HRVRfQUZGSU5JVFlfTUFYX1BST0MnOjprbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfQ1JFQVRFX0FGRklOSVRZX01BU0snOjprbXBfY3JlYXRlX2FmZmluaXR5X21hc2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9ERVNUUk9ZX0FGRklOSVRZX01BU0snOjprbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0FGRklOSVRZX01BU0tfUFJPQyc6OmttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfVU5TRVRfQUZGSU5JVFlfTUFTS19QUk9DJzo6a21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9BRkZJTklUWV9NQVNLX1BST0MnOjprbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX01BTExPQyc6OmttcF9tYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9DQUxMT0MnOjprbXBfY2FsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfUkVBTExPQyc6OmttcF9yZWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfRlJFRSc6OmttcF9mcmVlCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfV0FSTklOR1NfT04nOjprbXBfc2V0X3dhcm5pbmdzX29uCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX1dBUk5JTkdTX09GRic6OmttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKyFkZWMkICAgZWxzZQorCishKioqCishKioqIE9uIFdpbmRvd3MqIE9TIElBLTMyIGFyY2hpdGVjdHVyZSwgdGhlIEZvcnRyYW4gZW50cnkgcG9pbnRzIGhhdmUgYW4gdW5kZXJzY29yZSBwcmVwZW5kZWQuCishKioqCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfU0VUX05VTV9USFJFQURTJyA6OiBvbXBfc2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX1NFVF9EWU5BTUlDJyA6OiBvbXBfc2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfU0VUX05FU1RFRCcgOjogb21wX3NldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX05VTV9USFJFQURTJyA6OiBvbXBfZ2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9NQVhfVEhSRUFEUycgOjogb21wX2dldF9tYXhfdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfVEhSRUFEX05VTScgOjogb21wX2dldF90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9OVU1fUFJPQ1MnIDo6IG9tcF9nZXRfbnVtX3Byb2NzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0lOX1BBUkFMTEVMJyA6OiBvbXBfaW5fcGFyYWxsZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX0RZTkFNSUMnIDo6IG9tcF9nZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfTkVTVEVEJyA6OiBvbXBfZ2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfVEhSRUFEX0xJTUlUJyA6OiBvbXBfZ2V0X3RocmVhZF9saW1pdAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9TRVRfTUFYX0FDVElWRV9MRVZFTFMnIDo6IG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX01BWF9BQ1RJVkVfTEVWRUxTJyA6OiBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9MRVZFTCcgOjogb21wX2dldF9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfQUNUSVZFX0xFVkVMJyA6OiBvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfQU5DRVNUT1JfVEhSRUFEX05VTScgOjogb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9URUFNX1NJWkUnIDo6IG9tcF9nZXRfdGVhbV9zaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX1NFVF9TQ0hFRFVMRScgOjogb21wX3NldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfU0NIRURVTEUnIDo6IG9tcF9nZXRfc2NoZWR1bGUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX1dUSU1FJyA6OiBvbXBfZ2V0X3d0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9XVElDSycgOjogb21wX2dldF93dGljaworCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2luaXRfbG9jaycgOjogb21wX2luaXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9kZXN0cm95X2xvY2snIDo6IG9tcF9kZXN0cm95X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X2xvY2snIDo6IG9tcF9zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF91bnNldF9sb2NrJyA6OiBvbXBfdW5zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF90ZXN0X2xvY2snIDo6IG9tcF90ZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfaW5pdF9uZXN0X2xvY2snIDo6IG9tcF9pbml0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9kZXN0cm95X25lc3RfbG9jaycgOjogb21wX2Rlc3Ryb3lfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9uZXN0X2xvY2snIDo6IG9tcF9zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Vuc2V0X25lc3RfbG9jaycgOjogb21wX3Vuc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF90ZXN0X25lc3RfbG9jaycgOjogb21wX3Rlc3RfbmVzdF9sb2NrCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX1NUQUNLU0laRSc6OmttcF9zZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9TVEFDS1NJWkVfUyc6OmttcF9zZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0JMT0NLVElNRSc6OmttcF9zZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9MSUJSQVJZX1NFUklBTCc6OmttcF9zZXRfbGlicmFyeV9zZXJpYWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0xJQlJBUllfVFVSTkFST1VORCc6OmttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9MSUJSQVJZX1RIUk9VR0hQVVQnOjprbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfTElCUkFSWSc6OmttcF9zZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfU1RBQ0tTSVpFJzo6a21wX2dldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX1NUQUNLU0laRV9TJzo6a21wX2dldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfQkxPQ0tUSU1FJzo6a21wX2dldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX0xJQlJBUlknOjprbXBfZ2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0FGRklOSVRZJzo6a21wX3NldF9hZmZpbml0eQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfQUZGSU5JVFknOjprbXBfZ2V0X2FmZmluaXR5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9BRkZJTklUWV9NQVhfUFJPQyc6OmttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfQ1JFQVRFX0FGRklOSVRZX01BU0snOjprbXBfY3JlYXRlX2FmZmluaXR5X21hc2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfREVTVFJPWV9BRkZJTklUWV9NQVNLJzo6a21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfQUZGSU5JVFlfTUFTS19QUk9DJzo6a21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfVU5TRVRfQUZGSU5JVFlfTUFTS19QUk9DJzo6a21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfQUZGSU5JVFlfTUFTS19QUk9DJzo6a21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfTUFMTE9DJzo6a21wX21hbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9DQUxMT0MnOjprbXBfY2FsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1JFQUxMT0MnOjprbXBfcmVhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9GUkVFJzo6a21wX2ZyZWUKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfV0FSTklOR1NfT04nOjprbXBfc2V0X3dhcm5pbmdzX29uCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9XQVJOSU5HU19PRkYnOjprbXBfc2V0X3dhcm5pbmdzX29mZgorCishZGVjJCAgIGVuZGlmCishZGVjJCBlbmRpZgorCishZGVjJCBpZiBkZWZpbmVkKF9fbGludXgpCisKKyEqKioKKyEqKiogVGhlIExpbnV4KiBPUyBlbnRyeSBwb2ludHMgYXJlIGluIGxvd2VyY2FzZSwgd2l0aCBhbiB1bmRlcnNjb3JlIGFwcGVuZGVkLgorISoqKgorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X251bV90aHJlYWRzXyc6Om9tcF9zZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfZHluYW1pY18nOjpvbXBfc2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbmVzdGVkXyc6Om9tcF9zZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X251bV90aHJlYWRzXyc6Om9tcF9nZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbWF4X3RocmVhZHNfJzo6b21wX2dldF9tYXhfdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF90aHJlYWRfbnVtXyc6Om9tcF9nZXRfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9udW1fcHJvY3NfJzo6b21wX2dldF9udW1fcHJvY3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9pbl9wYXJhbGxlbF8nOjpvbXBfaW5fcGFyYWxsZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfZHluYW1pY18nOjpvbXBfZ2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbmVzdGVkXyc6Om9tcF9nZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X3RocmVhZF9saW1pdF8nOjpvbXBfZ2V0X3RocmVhZF9saW1pdAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9tYXhfYWN0aXZlX2xldmVsc18nOjpvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzXyc6Om9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbGV2ZWxfJzo6b21wX2dldF9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9hY3RpdmVfbGV2ZWxfJzo6b21wX2dldF9hY3RpdmVfbGV2ZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bV8nOjpvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfdGVhbV9zaXplXyc6Om9tcF9nZXRfdGVhbV9zaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X3NjaGVkdWxlXyc6Om9tcF9zZXRfc2NoZWR1bGUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfc2NoZWR1bGVfJzo6b21wX2dldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF93dGltZV8nOjpvbXBfZ2V0X3d0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X3d0aWNrXyc6Om9tcF9nZXRfd3RpY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2luaXRfbG9ja18nOjpvbXBfaW5pdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZGVzdHJveV9sb2NrXyc6Om9tcF9kZXN0cm95X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbG9ja18nOjpvbXBfc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF91bnNldF9sb2NrXyc6Om9tcF91bnNldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdGVzdF9sb2NrXyc6Om9tcF90ZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9pbml0X25lc3RfbG9ja18nOjpvbXBfaW5pdF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9kZXN0cm95X25lc3RfbG9ja18nOjpvbXBfZGVzdHJveV9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbmVzdF9sb2NrXyc6Om9tcF9zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdW5zZXRfbmVzdF9sb2NrXyc6Om9tcF91bnNldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF90ZXN0X25lc3RfbG9ja18nOjpvbXBfdGVzdF9uZXN0X2xvY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9zdGFja3NpemVfJzo6a21wX3NldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfc3RhY2tzaXplX3NfJzo6a21wX3NldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9ibG9ja3RpbWVfJzo6a21wX3NldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfbGlicmFyeV9zZXJpYWxfJzo6a21wX3NldF9saWJyYXJ5X3NlcmlhbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmRfJzo6a21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0Xyc6OmttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2xpYnJhcnlfJzo6a21wX3NldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X3N0YWNrc2l6ZV8nOjprbXBfZ2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2dldF9zdGFja3NpemVfc18nOjprbXBfZ2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X2Jsb2NrdGltZV8nOjprbXBfZ2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2dldF9saWJyYXJ5Xyc6OmttcF9nZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9hZmZpbml0eV8nOjprbXBfc2V0X2FmZmluaXR5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X2FmZmluaXR5Xyc6OmttcF9nZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2NfJzo6a21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrXyc6OmttcF9jcmVhdGVfYWZmaW5pdHlfbWFzaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFza18nOjprbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvY18nOjprbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvY18nOjprbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvY18nOjprbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX21hbGxvY18nOjprbXBfbWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfY2FsbG9jXyc6OmttcF9jYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9yZWFsbG9jXyc6OmttcF9yZWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZnJlZV8nOjprbXBfZnJlZQorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X3dhcm5pbmdzX29uXyc6OmttcF9zZXRfd2FybmluZ3Nfb24KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfd2FybmluZ3Nfb2ZmXyc6OmttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKyFkZWMkIGVuZGlmCisKKyFkZWMkIGlmIGRlZmluZWQoX19BUFBMRV9fKQorCishKioqCishKioqIFRoZSBNYWMgZW50cnkgcG9pbnRzIGFyZSBpbiBsb3dlcmNhc2UsIHdpdGggYW4gYm90aCBhbiB1bmRlcnNjb3JlCishKioqIGFwcGVuZGVkIGFuZCBhbiB1bmRlcnNjb3JlIHByZXBlbmRlZC4KKyEqKioKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbnVtX3RocmVhZHNfJzo6b21wX3NldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfZHluYW1pY18nOjpvbXBfc2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X25lc3RlZF8nOjpvbXBfc2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbnVtX3RocmVhZHNfJzo6b21wX2dldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbWF4X3RocmVhZHNfJzo6b21wX2dldF9tYXhfdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfdGhyZWFkX251bV8nOjpvbXBfZ2V0X3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X251bV9wcm9jc18nOjpvbXBfZ2V0X251bV9wcm9jcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pbl9wYXJhbGxlbF8nOjpvbXBfaW5fcGFyYWxsZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X2R5bmFtaWNfJzo6b21wX2dldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9uZXN0ZWRfJzo6b21wX2dldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X3RocmVhZF9saW1pdF8nOjpvbXBfZ2V0X3RocmVhZF9saW1pdAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHNfJzo6b21wX3NldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHNfJzo6b21wX2dldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbGV2ZWxfJzo6b21wX2dldF9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfYWN0aXZlX2xldmVsXyc6Om9tcF9nZXRfYWN0aXZlX2xldmVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtXyc6Om9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfdGVhbV9zaXplXyc6Om9tcF9nZXRfdGVhbV9zaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9zY2hlZHVsZV8nOjpvbXBfc2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9zY2hlZHVsZV8nOjpvbXBfZ2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF93dGltZV8nOjpvbXBfZ2V0X3d0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF93dGlja18nOjpvbXBfZ2V0X3d0aWNrCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfaW5pdF9sb2NrXyc6Om9tcF9pbml0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZGVzdHJveV9sb2NrXyc6Om9tcF9kZXN0cm95X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X2xvY2tfJzo6b21wX3NldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Vuc2V0X2xvY2tfJzo6b21wX3Vuc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdGVzdF9sb2NrXyc6Om9tcF90ZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfaW5pdF9uZXN0X2xvY2tfJzo6b21wX2luaXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2Rlc3Ryb3lfbmVzdF9sb2NrXyc6Om9tcF9kZXN0cm95X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbmVzdF9sb2NrXyc6Om9tcF9zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Vuc2V0X25lc3RfbG9ja18nOjpvbXBfdW5zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Rlc3RfbmVzdF9sb2NrXyc6Om9tcF90ZXN0X25lc3RfbG9jaworCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9zdGFja3NpemVfJzo6a21wX3NldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X3N0YWNrc2l6ZV9zXyc6OmttcF9zZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2Jsb2NrdGltZV8nOjprbXBfc2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfbGlicmFyeV9zZXJpYWxfJzo6a21wX3NldF9saWJyYXJ5X3NlcmlhbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kXyc6OmttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXRfJzo6a21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2xpYnJhcnlfJzo6a21wX3NldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9zdGFja3NpemVfJzo6a21wX2dldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X3N0YWNrc2l6ZV9zXyc6OmttcF9nZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X2Jsb2NrdGltZV8nOjprbXBfZ2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfbGlicmFyeV8nOjprbXBfZ2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2FmZmluaXR5Xyc6OmttcF9zZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X2FmZmluaXR5Xyc6OmttcF9nZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jXyc6OmttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfY3JlYXRlX2FmZmluaXR5X21hc2tfJzo6a21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFza18nOjprbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2NfJzo6a21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jXyc6OmttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvY18nOjprbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9tYWxsb2NfJzo6a21wX21hbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9jYWxsb2NfJzo6a21wX2NhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9yZWFsbG9jXyc6OmttcF9yZWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2ZyZWVfJzo6a21wX2ZyZWUKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfd2FybmluZ3Nfb25fJzo6a21wX3NldF93YXJuaW5nc19vbgorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfd2FybmluZ3Nfb2ZmXyc6OmttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKyFkZWMkIGVuZGlmCisKKyAgICAgIGVuZCBtb2R1bGUgb21wX2xpYgorCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9pbmNsdWRlLzMwL29tcF9saWIuZjkwLnZhciBiL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvMzAvb21wX2xpYi5mOTAudmFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3YzJiN2QKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9pbmNsdWRlLzMwL29tcF9saWIuZjkwLnZhcgpAQCAtMCwwICsxLDM1NSBAQAorISBpbmNsdWRlLzMwL29tcF9saWIuZjkwLnZhcgorISAkUmV2aXNpb246IDQyOTUxICQKKyEgJERhdGU6IDIwMTQtMDEtMjEgMTQ6NDE6NDEgLTA2MDAgKFR1ZSwgMjEgSmFuIDIwMTQpICQKKworIQorIS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCishLy8KKyEvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCishLy8KKyEvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCishLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCishLy8KKyEvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIQorCisgICAgICBtb2R1bGUgb21wX2xpYl9raW5kcworCisgICAgICAgIHVzZSwgaW50cmluc2ljIDo6IGlzb19jX2JpbmRpbmcKKworICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2ludGVnZXJfa2luZCAgICAgICA9IGNfaW50CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfbG9naWNhbF9raW5kICAgICAgID0gNAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX3JlYWxfa2luZCAgICAgICAgICA9IGNfZmxvYXQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF9kb3VibGVfa2luZCAgICAgICAgPSBjX2RvdWJsZQorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2xvY2tfa2luZCAgICAgICAgICA9IGNfaW50cHRyX3QKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9uZXN0X2xvY2tfa2luZCAgICAgPSBjX2ludHB0cl90CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfa2luZCAgICAgICAgID0gb21wX2ludGVnZXJfa2luZAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX3BvaW50ZXJfa2luZCAgICAgICA9IGNfaW50cHRyX3QKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF9zaXplX3Rfa2luZCAgICAgICAgPSBjX3NpemVfdAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX2FmZmluaXR5X21hc2tfa2luZCA9IGNfaW50cHRyX3QKKworICAgICAgZW5kIG1vZHVsZSBvbXBfbGliX2tpbmRzCisKKyAgICAgIG1vZHVsZSBvbXBfbGliCisKKyAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKworICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjogb3Blbm1wX3ZlcnNpb24gICAgPSAkT01QX1ZFUlNJT04KKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX21ham9yID0gJEtNUF9WRVJTSU9OX01BSk9SCisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9taW5vciA9ICRLTVBfVkVSU0lPTl9NSU5PUgorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fYnVpbGQgPSAkS01QX1ZFUlNJT05fQlVJTEQKKyAgICAgICAgY2hhcmFjdGVyKCopICAgICAgICAgICAgICAga21wX2J1aWxkX2RhdGUKKyAgICAgICAgcGFyYW1ldGVyKCBrbXBfYnVpbGRfZGF0ZSA9ICckS01QX0JVSUxEX0RBVEUnICkKKworICAgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX3N0YXRpYyAgPSAxCisgICAgICAgIGludGVnZXIoa2luZD1vbXBfc2NoZWRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfZHluYW1pYyA9IDIKKyAgICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9ndWlkZWQgID0gMworICAgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2F1dG8gICAgPSA0CisKKyAgICAgICAgaW50ZXJmYWNlCisKKyEgICAgICAgICAqKioKKyEgICAgICAgICAqKiogb21wXyogZW50cnkgcG9pbnRzCishICAgICAgICAgKioqCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbnVtX3RocmVhZHMobnRocmVhZHMpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBudGhyZWFkcworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbnVtX3RocmVhZHMKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9keW5hbWljKGVuYWJsZSkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCksIHZhbHVlIDo6IGVuYWJsZQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfZHluYW1pYworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X25lc3RlZChlbmFibGUpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpLCB2YWx1ZSA6OiBlbmFibGUKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X25lc3RlZAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fdGhyZWFkcygpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX3RocmVhZHMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fdGhyZWFkcworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9tYXhfdGhyZWFkcygpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbWF4X3RocmVhZHMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9tYXhfdGhyZWFkcworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbnVtKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90aHJlYWRfbnVtCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX251bQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fcHJvY3MoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV9wcm9jcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV9wcm9jcworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2luX3BhcmFsbGVsKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2luX3BhcmFsbGVsCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9pbl9wYXJhbGxlbAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9keW5hbWljKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2dldF9keW5hbWljCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfZHluYW1pYworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9uZXN0ZWQoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfZ2V0X25lc3RlZAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X25lc3RlZAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbGltaXQoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RocmVhZF9saW1pdAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9saW1pdAorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzKG1heF9sZXZlbHMpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBtYXhfbGV2ZWxzCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9tYXhfYWN0aXZlX2xldmVscworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9tYXhfYWN0aXZlX2xldmVscygpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9tYXhfYWN0aXZlX2xldmVscworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9sZXZlbCgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIDo6IG9tcF9nZXRfbGV2ZWwKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9sZXZlbAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9hY3RpdmVfbGV2ZWwoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSA6OiBvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtKGxldmVsKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IGxldmVsCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF90ZWFtX3NpemUobGV2ZWwpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfdGVhbV9zaXplCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBsZXZlbAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RlYW1fc2l6ZQorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X3NjaGVkdWxlKGtpbmQsIG1vZGlmaWVyKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfc2NoZWRfa2luZCksIHZhbHVlIDo6IGtpbmQKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IG1vZGlmaWVyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9zY2hlZHVsZQorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfZ2V0X3NjaGVkdWxlKGtpbmQsIG1vZGlmaWVyKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfc2NoZWRfa2luZCkgICA6OiBraW5kCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIDo6IG1vZGlmaWVyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2dldF9zY2hlZHVsZQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF93dGltZSgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICByZWFsIChraW5kPWttcF9kb3VibGVfa2luZCkgb21wX2dldF93dGltZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3d0aW1lCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3d0aWNrKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIHJlYWwgKGtpbmQ9a21wX2RvdWJsZV9raW5kKSBvbXBfZ2V0X3d0aWNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfd3RpY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2luaXRfbG9jayhsb2NrdmFyKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2luaXRfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfZGVzdHJveV9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfZGVzdHJveV9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbG9jayhsb2NrdmFyKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF91bnNldF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfdW5zZXRfbG9jaworCisgICAgICAgICAgZnVuY3Rpb24gb21wX3Rlc3RfbG9jayhsb2NrdmFyKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfdGVzdF9sb2NrCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX3Rlc3RfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfaW5pdF9uZXN0X2xvY2sobG9ja3ZhcikgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2luaXRfbmVzdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X25lc3RfbG9jayhsb2NrdmFyKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfZGVzdHJveV9uZXN0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0X2xvY2sobG9ja3ZhcikgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3Vuc2V0X25lc3RfbG9jayhsb2NrdmFyKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfdW5zZXRfbmVzdF9sb2NrCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfdGVzdF9uZXN0X2xvY2sobG9ja3ZhcikgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX3Rlc3RfbmVzdF9sb2NrCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfdGVzdF9uZXN0X2xvY2sKKworISAgICAgICAgICoqKgorISAgICAgICAgICoqKiBrbXBfKiBlbnRyeSBwb2ludHMKKyEgICAgICAgICAqKioKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemUoc2l6ZSkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IHNpemUKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZQorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZV9zKHNpemUpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCksIHZhbHVlIDo6IHNpemUKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZV9zCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfYmxvY2t0aW1lKG1zZWMpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBtc2VjCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9ibG9ja3RpbWUKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3NlcmlhbCgpIGJpbmQoYykKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kKCkgYmluZChjKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0KCkgYmluZChjKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeShsaWJudW0pIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBsaWJudW0KKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnkKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9kZWZhdWx0cyhzdHJpbmcpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSwgaW50cmluc2ljIDo6IGlzb19jX2JpbmRpbmcKKyAgICAgICAgICAgIGNoYXJhY3RlciAoa2luZD1jX2NoYXIpIDo6IHN0cmluZygqKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfZGVmYXVsdHMKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9zdGFja3NpemUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemUKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplX3MoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIGttcF9nZXRfc3RhY2tzaXplX3MKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemVfcworCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9ibG9ja3RpbWUoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2Jsb2NrdGltZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2Jsb2NrdGltZQorCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9saWJyYXJ5KCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9saWJyYXJ5CisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfbGlicmFyeQorCisgICAgICAgICAgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eShtYXNrKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfc2V0X2FmZmluaXR5CisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eQorCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eShtYXNrKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2FmZmluaXR5CisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eQorCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYygpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfY3JlYXRlX2FmZmluaXR5X21hc2sobWFzaykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFzaworCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrKG1hc2spIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYyhwcm9jLCBtYXNrKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jKHByb2MsIG1hc2spIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IHByb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYyhwcm9jLCBtYXNrKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfbWFsbG9jKHNpemUpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGttcF9tYWxsb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSwgdmFsdWUgOjogc2l6ZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfbWFsbG9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfY2FsbG9jKG5lbGVtLCBlbHNpemUpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGttcF9jYWxsb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSwgdmFsdWUgOjogbmVsZW0KKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSwgdmFsdWUgOjogZWxzaXplCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9jYWxsb2MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9yZWFsbG9jKHB0ciwgc2l6ZSkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX3JlYWxsb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCksIHZhbHVlIDo6IHB0cgorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBzaXplCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9yZWFsbG9jCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9mcmVlKHB0cikgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCksIHZhbHVlIDo6IHB0cgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9mcmVlCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb24oKSBiaW5kKGMpCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vbgorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29mZigpIGJpbmQoYykKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29mZgorCisgICAgICAgIGVuZCBpbnRlcmZhY2UKKworICAgICAgZW5kIG1vZHVsZSBvbXBfbGliCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9pbmNsdWRlLzMwL29tcF9saWIuaC52YXIgYi9maW5hbC9ydW50aW1lL3NyYy9pbmNsdWRlLzMwL29tcF9saWIuaC52YXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY0M2M5MwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvMzAvb21wX2xpYi5oLnZhcgpAQCAtMCwwICsxLDYzMSBAQAorISBpbmNsdWRlLzMwL29tcF9saWIuaC52YXIKKyEgJFJldmlzaW9uOiA0Mjk1MSAkCishICREYXRlOiAyMDE0LTAxLTIxIDE0OjQxOjQxIC0wNjAwIChUdWUsIDIxIEphbiAyMDE0KSAkCisKKyEKKyEvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIS8vCishLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIS8vCishLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIS8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIS8vCishLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyEKKworISoqKgorISoqKiBTb21lIG9mIHRoZSBkaXJlY3RpdmVzIGZvciB0aGUgZm9sbG93aW5nIHJvdXRpbmUgZXh0ZW5kIHBhc3QgY29sdW1uIDcyLAorISoqKiBzbyBwcm9jZXNzIHRoaXMgZmlsZSBpbiAxMzItY29sdW1uIG1vZGUuCishKioqCisKKyFkZWMkIGZpeGVkZm9ybWxpbmVzaXplOjEzMgorCisgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2ludGVnZXJfa2luZCAgICAgICA9IDQKKyAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfbG9naWNhbF9raW5kICAgICAgID0gNAorICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9yZWFsX2tpbmQgICAgICAgICAgPSA0CisgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2xvY2tfa2luZCAgICAgICAgICA9IGludF9wdHJfa2luZCgpCisgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX25lc3RfbG9ja19raW5kICAgICA9IGludF9wdHJfa2luZCgpCisgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2tpbmQgICAgICAgICA9IG9tcF9pbnRlZ2VyX2tpbmQKKyAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfcG9pbnRlcl9raW5kICAgICAgID0gaW50X3B0cl9raW5kKCkKKyAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfc2l6ZV90X2tpbmQgICAgICAgID0gaW50X3B0cl9raW5kKCkKKyAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfYWZmaW5pdHlfbWFza19raW5kID0gaW50X3B0cl9raW5kKCkKKworICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9zdGF0aWMgID0gMQorICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9keW5hbWljID0gMgorICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9ndWlkZWQgID0gMworICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9hdXRvICAgID0gNAorCisgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fbWFqb3IgPSAkS01QX1ZFUlNJT05fTUFKT1IKKyAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9taW5vciA9ICRLTVBfVkVSU0lPTl9NSU5PUgorICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX2J1aWxkID0gJEtNUF9WRVJTSU9OX0JVSUxECisgICAgICBjaGFyYWN0ZXIoKikgICAgICAgICAgICAgICBrbXBfYnVpbGRfZGF0ZQorICAgICAgcGFyYW1ldGVyKCBrbXBfYnVpbGRfZGF0ZSA9ICckS01QX0JVSUxEX0RBVEUnICkKKyAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHBhcmFtZXRlciA6OiBvcGVubXBfdmVyc2lvbiAgICA9ICRPTVBfVkVSU0lPTgorCisgICAgICBpbnRlcmZhY2UKKworISAgICAgICAqKioKKyEgICAgICAgKioqIG9tcF8qIGVudHJ5IHBvaW50cworISAgICAgICAqKioKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbnVtX3RocmVhZHMobnRocmVhZHMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBudGhyZWFkcworICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X251bV90aHJlYWRzCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X2R5bmFtaWMoZW5hYmxlKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgZW5hYmxlCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfZHluYW1pYworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0ZWQoZW5hYmxlKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgZW5hYmxlCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdGVkCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fdGhyZWFkcygpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV90aHJlYWRzCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV90aHJlYWRzCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9tYXhfdGhyZWFkcygpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X21heF90aHJlYWRzCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X21heF90aHJlYWRzCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbnVtKCkKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfdGhyZWFkX251bQorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbnVtCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fcHJvY3MoKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fcHJvY3MKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3Byb2NzCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2luX3BhcmFsbGVsKCkKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9pbl9wYXJhbGxlbAorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2luX3BhcmFsbGVsCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9keW5hbWljKCkKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9nZXRfZHluYW1pYworICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9keW5hbWljCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9uZXN0ZWQoKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2dldF9uZXN0ZWQKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbmVzdGVkCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbGltaXQoKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90aHJlYWRfbGltaXQKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX2xpbWl0CisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzKG1heF9sZXZlbHMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBtYXhfbGV2ZWxzCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzKCkKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2xldmVsKCkKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbGV2ZWwKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbGV2ZWwKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2FjdGl2ZV9sZXZlbCgpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9hY3RpdmVfbGV2ZWwKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0obGV2ZWwpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBsZXZlbAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RlYW1fc2l6ZShsZXZlbCkKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGxldmVsCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RlYW1fc2l6ZQorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF90ZWFtX3NpemUKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfc2NoZWR1bGUoa2luZCwgbW9kaWZpZXIpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfc2NoZWRfa2luZCkga2luZAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbW9kaWZpZXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9zY2hlZHVsZQorCisgICAgICAgIHN1YnJvdXRpbmUgb21wX2dldF9zY2hlZHVsZShraW5kLCBtb2RpZmllcikKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9zY2hlZF9raW5kKSBraW5kCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBtb2RpZmllcgorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfZ2V0X3NjaGVkdWxlCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF93dGltZSgpCisgICAgICAgICAgZG91YmxlIHByZWNpc2lvbiBvbXBfZ2V0X3d0aW1lCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3d0aW1lCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF93dGljayAoKQorICAgICAgICAgIGRvdWJsZSBwcmVjaXNpb24gb21wX2dldF93dGljaworICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF93dGljaworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX2luaXRfbG9jayhsb2NrdmFyKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfaW5pdF9sb2NrCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfZGVzdHJveV9sb2NrKGxvY2t2YXIpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X2xvY2sKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbG9jayhsb2NrdmFyKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X2xvY2sKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF91bnNldF9sb2NrKGxvY2t2YXIpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF91bnNldF9sb2NrCisKKyAgICAgICAgZnVuY3Rpb24gb21wX3Rlc3RfbG9jayhsb2NrdmFyKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX3Rlc3RfbG9jaworICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX3Rlc3RfbG9jaworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX2luaXRfbmVzdF9sb2NrKGxvY2t2YXIpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2luaXRfbmVzdF9sb2NrCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfZGVzdHJveV9uZXN0X2xvY2sobG9ja3ZhcikKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfZGVzdHJveV9uZXN0X2xvY2sKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdF9sb2NrKGxvY2t2YXIpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0X2xvY2sKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF91bnNldF9uZXN0X2xvY2sobG9ja3ZhcikKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfdW5zZXRfbmVzdF9sb2NrCisKKyAgICAgICAgZnVuY3Rpb24gb21wX3Rlc3RfbmVzdF9sb2NrKGxvY2t2YXIpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfdGVzdF9uZXN0X2xvY2sKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX3Rlc3RfbmVzdF9sb2NrCisKKyEgICAgICAgKioqCishICAgICAgICoqKiBrbXBfKiBlbnRyeSBwb2ludHMKKyEgICAgICAgKioqCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZShzaXplKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgc2l6ZQorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZQorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemVfcyhzaXplKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBzaXplCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplX3MKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfYmxvY2t0aW1lKG1zZWMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBtc2VjCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfYmxvY2t0aW1lCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsKCkKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3NlcmlhbAorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQoKQorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZAorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQoKQorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dAorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5KGxpYm51bSkKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGxpYm51bQorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnkKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfZGVmYXVsdHMoc3RyaW5nKQorICAgICAgICAgIGNoYXJhY3RlciooKikgc3RyaW5nCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfZGVmYXVsdHMKKworICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZSgpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X3N0YWNrc2l6ZQorICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemUKKworICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZV9zKCkKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkga21wX2dldF9zdGFja3NpemVfcworICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemVfcworCisgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYmxvY2t0aW1lKCkKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYmxvY2t0aW1lCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2Jsb2NrdGltZQorCisgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfbGlicmFyeSgpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2xpYnJhcnkKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfbGlicmFyeQorCisgICAgICAgIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHkobWFzaykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9zZXRfYWZmaW5pdHkKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHkKKworICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5KG1hc2spCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2FmZmluaXR5CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5CisKKyAgICAgICAgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYygpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfY3JlYXRlX2FmZmluaXR5X21hc2sobWFzaykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrKG1hc2spCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2sKKworICAgICAgICBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYyhwcm9jLCBtYXNrKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIHByb2MKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCisKKyAgICAgICAgZnVuY3Rpb24ga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYyhwcm9jLCBtYXNrKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgcHJvYworICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworCisgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jKHByb2MsIG1hc2spCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgcHJvYworICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKworICAgICAgICBmdW5jdGlvbiBrbXBfbWFsbG9jKHNpemUpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfbWFsbG9jCisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIHNpemUKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9tYWxsb2MKKworICAgICAgICBmdW5jdGlvbiBrbXBfY2FsbG9jKG5lbGVtLCBlbHNpemUpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfY2FsbG9jCisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIG5lbGVtCisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIGVsc2l6ZQorICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2NhbGxvYworCisgICAgICAgIGZ1bmN0aW9uIGttcF9yZWFsbG9jKHB0ciwgc2l6ZSkKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGttcF9yZWFsbG9jCisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBwdHIKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkgc2l6ZQorICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3JlYWxsb2MKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9mcmVlKHB0cikKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIHB0cgorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfZnJlZQorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vbigpCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb24KKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb2ZmKCkKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vZmYKKworICAgICAgZW5kIGludGVyZmFjZQorCishZGVjJCBpZiBkZWZpbmVkKF9XSU4zMikKKyFkZWMkICAgaWYgZGVmaW5lZChfV0lONjQpIC5vci4gZGVmaW5lZChfTV9BTUQ2NCkKKworISoqKgorISoqKiBUaGUgRm9ydHJhbiBlbnRyeSBwb2ludHMgbXVzdCBiZSBpbiB1cHBlcmNhc2UsIGV2ZW4gaWYgdGhlIC9RbG93ZXJjYXNlCishKioqIG9wdGlvbiBpcyBzcGVjaWZpZWQuICBUaGUgYWxpYXMgYXR0cmlidXRlIGVuc3VyZXMgdGhhdCB0aGUgc3BlY2lmaWVkCishKioqIHN0cmluZyBpcyB1c2VkIGFzIHRoZSBlbnRyeSBwb2ludC4KKyEqKioKKyEqKiogT24gdGhlIFdpbmRvd3MqIE9TIElBLTMyIGFyY2hpdGVjdHVyZSwgdGhlIEZvcnRyYW4gZW50cnkgcG9pbnRzIGhhdmUgYW4KKyEqKiogdW5kZXJzY29yZSBwcmVwZW5kZWQuICBPbiB0aGUgV2luZG93cyogT1MgSW50ZWwoUikgNjQKKyEqKiogYXJjaGl0ZWN0dXJlLCBubyB1bmRlcnNjb3JlIGlzIHByZXBlbmRlZC4KKyEqKioKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX1NFVF9OVU1fVEhSRUFEUyc6Om9tcF9zZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9TRVRfRFlOQU1JQyc6Om9tcF9zZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX1NFVF9ORVNURUQnOjpvbXBfc2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9OVU1fVEhSRUFEUyc6Om9tcF9nZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTUFYX1RIUkVBRFMnOjpvbXBfZ2V0X21heF90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1RIUkVBRF9OVU0nOjpvbXBfZ2V0X3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTlVNX1BST0NTJzo6b21wX2dldF9udW1fcHJvY3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9JTl9QQVJBTExFTCc6Om9tcF9pbl9wYXJhbGxlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9EWU5BTUlDJzo6b21wX2dldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX05FU1RFRCc6Om9tcF9nZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1RIUkVBRF9MSU1JVCc6Om9tcF9nZXRfdGhyZWFkX2xpbWl0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfU0VUX01BWF9BQ1RJVkVfTEVWRUxTJzo6b21wX3NldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9NQVhfQUNUSVZFX0xFVkVMUyc6Om9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTEVWRUwnOjpvbXBfZ2V0X2xldmVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX0FDVElWRV9MRVZFTCc6Om9tcF9nZXRfYWN0aXZlX2xldmVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX0FOQ0VTVE9SX1RIUkVBRF9OVU0nOjpvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfVEVBTV9TSVpFJzo6b21wX2dldF90ZWFtX3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9TRVRfU0NIRURVTEUnOjpvbXBfc2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1NDSEVEVUxFJzo6b21wX2dldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9XVElNRSc6Om9tcF9nZXRfd3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfV1RJQ0snOjpvbXBfZ2V0X3d0aWNrCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9pbml0X2xvY2snOjpvbXBfaW5pdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZGVzdHJveV9sb2NrJzo6b21wX2Rlc3Ryb3lfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9sb2NrJzo6b21wX3NldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdW5zZXRfbG9jayc6Om9tcF91bnNldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdGVzdF9sb2NrJzo6b21wX3Rlc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2luaXRfbmVzdF9sb2NrJzo6b21wX2luaXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZGVzdHJveV9uZXN0X2xvY2snOjpvbXBfZGVzdHJveV9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbmVzdF9sb2NrJzo6b21wX3NldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF91bnNldF9uZXN0X2xvY2snOjpvbXBfdW5zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdGVzdF9uZXN0X2xvY2snOjpvbXBfdGVzdF9uZXN0X2xvY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9TVEFDS1NJWkUnOjprbXBfc2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9TVEFDS1NJWkVfUyc6OmttcF9zZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfQkxPQ0tUSU1FJzo6a21wX3NldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfTElCUkFSWV9TRVJJQUwnOjprbXBfc2V0X2xpYnJhcnlfc2VyaWFsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0xJQlJBUllfVFVSTkFST1VORCc6OmttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0xJQlJBUllfVEhST1VHSFBVVCc6OmttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0xJQlJBUlknOjprbXBfc2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfREVGQVVMVFMnOjprbXBfc2V0X2RlZmF1bHRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX1NUQUNLU0laRSc6OmttcF9nZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX1NUQUNLU0laRV9TJzo6a21wX2dldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9CTE9DS1RJTUUnOjprbXBfZ2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9MSUJSQVJZJzo6a21wX2dldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0FGRklOSVRZJzo6a21wX3NldF9hZmZpbml0eQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9BRkZJTklUWSc6OmttcF9nZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9HRVRfQUZGSU5JVFlfTUFYX1BST0MnOjprbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfQ1JFQVRFX0FGRklOSVRZX01BU0snOjprbXBfY3JlYXRlX2FmZmluaXR5X21hc2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9ERVNUUk9ZX0FGRklOSVRZX01BU0snOjprbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0FGRklOSVRZX01BU0tfUFJPQyc6OmttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfVU5TRVRfQUZGSU5JVFlfTUFTS19QUk9DJzo6a21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9BRkZJTklUWV9NQVNLX1BST0MnOjprbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX01BTExPQyc6OmttcF9tYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9DQUxMT0MnOjprbXBfY2FsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfUkVBTExPQyc6OmttcF9yZWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfRlJFRSc6OmttcF9mcmVlCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfV0FSTklOR1NfT04nOjprbXBfc2V0X3dhcm5pbmdzX29uCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX1dBUk5JTkdTX09GRic6OmttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKyFkZWMkICAgZWxzZQorCishKioqCishKioqIE9uIFdpbmRvd3MqIE9TIElBLTMyIGFyY2hpdGVjdHVyZSwgdGhlIEZvcnRyYW4gZW50cnkgcG9pbnRzIGhhdmUgYW4gdW5kZXJzY29yZSBwcmVwZW5kZWQuCishKioqCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfU0VUX05VTV9USFJFQURTJzo6b21wX3NldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9TRVRfRFlOQU1JQyc6Om9tcF9zZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9TRVRfTkVTVEVEJzo6b21wX3NldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX05VTV9USFJFQURTJzo6b21wX2dldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfTUFYX1RIUkVBRFMnOjpvbXBfZ2V0X21heF90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9USFJFQURfTlVNJzo6b21wX2dldF90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9OVU1fUFJPQ1MnOjpvbXBfZ2V0X251bV9wcm9jcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9JTl9QQVJBTExFTCc6Om9tcF9pbl9wYXJhbGxlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfRFlOQU1JQyc6Om9tcF9nZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfTkVTVEVEJzo6b21wX2dldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX1RIUkVBRF9MSU1JVCc6Om9tcF9nZXRfdGhyZWFkX2xpbWl0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX1NFVF9NQVhfQUNUSVZFX0xFVkVMUyc6Om9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX01BWF9BQ1RJVkVfTEVWRUxTJzo6b21wX2dldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfTEVWRUwnOjpvbXBfZ2V0X2xldmVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9BQ1RJVkVfTEVWRUwnOjpvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfQU5DRVNUT1JfVEhSRUFEX05VTSc6Om9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfVEVBTV9TSVpFJzo6b21wX2dldF90ZWFtX3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfU0VUX1NDSEVEVUxFJzo6b21wX3NldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfU0NIRURVTEUnOjpvbXBfZ2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9XVElNRSc6Om9tcF9nZXRfd3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX1dUSUNLJzo6b21wX2dldF93dGljaworCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2luaXRfbG9jayc6Om9tcF9pbml0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZGVzdHJveV9sb2NrJzo6b21wX2Rlc3Ryb3lfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbG9jayc6Om9tcF9zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF91bnNldF9sb2NrJzo6b21wX3Vuc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdGVzdF9sb2NrJzo6b21wX3Rlc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pbml0X25lc3RfbG9jayc6Om9tcF9pbml0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9kZXN0cm95X25lc3RfbG9jayc6Om9tcF9kZXN0cm95X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbmVzdF9sb2NrJzo6b21wX3NldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdW5zZXRfbmVzdF9sb2NrJzo6b21wX3Vuc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF90ZXN0X25lc3RfbG9jayc6Om9tcF90ZXN0X25lc3RfbG9jaworCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9TVEFDS1NJWkUnOjprbXBfc2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfU1RBQ0tTSVpFX1MnOjprbXBfc2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9CTE9DS1RJTUUnOjprbXBfc2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfTElCUkFSWV9TRVJJQUwnOjprbXBfc2V0X2xpYnJhcnlfc2VyaWFsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9MSUJSQVJZX1RVUk5BUk9VTkQnOjprbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfTElCUkFSWV9USFJPVUdIUFVUJzo6a21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0xJQlJBUlknOjprbXBfc2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0RFRkFVTFRTJzo6a21wX3NldF9kZWZhdWx0cworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfU1RBQ0tTSVpFJzo6a21wX2dldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX1NUQUNLU0laRV9TJzo6a21wX2dldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfQkxPQ0tUSU1FJzo6a21wX2dldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX0xJQlJBUlknOjprbXBfZ2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0FGRklOSVRZJzo6a21wX3NldF9hZmZpbml0eQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfQUZGSU5JVFknOjprbXBfZ2V0X2FmZmluaXR5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9BRkZJTklUWV9NQVhfUFJPQyc6OmttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfQ1JFQVRFX0FGRklOSVRZX01BU0snOjprbXBfY3JlYXRlX2FmZmluaXR5X21hc2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfREVTVFJPWV9BRkZJTklUWV9NQVNLJzo6a21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfQUZGSU5JVFlfTUFTS19QUk9DJzo6a21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfVU5TRVRfQUZGSU5JVFlfTUFTS19QUk9DJzo6a21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfQUZGSU5JVFlfTUFTS19QUk9DJzo6a21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfTUFMTE9DJzo6a21wX21hbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9DQUxMT0MnOjprbXBfY2FsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1JFQUxMT0MnOjprbXBfcmVhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9GUkVFJzo6a21wX2ZyZWUKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfV0FSTklOR1NfT04nOjprbXBfc2V0X3dhcm5pbmdzX29uCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9XQVJOSU5HU19PRkYnOjprbXBfc2V0X3dhcm5pbmdzX29mZgorCishZGVjJCAgIGVuZGlmCishZGVjJCBlbmRpZgorCishZGVjJCBpZiBkZWZpbmVkKF9fbGludXgpCisKKyEqKioKKyEqKiogVGhlIExpbnV4KiBPUyBlbnRyeSBwb2ludHMgYXJlIGluIGxvd2VyY2FzZSwgd2l0aCBhbiB1bmRlcnNjb3JlIGFwcGVuZGVkLgorISoqKgorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X251bV90aHJlYWRzXyc6Om9tcF9zZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfZHluYW1pY18nOjpvbXBfc2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbmVzdGVkXyc6Om9tcF9zZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X251bV90aHJlYWRzXyc6Om9tcF9nZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbWF4X3RocmVhZHNfJzo6b21wX2dldF9tYXhfdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF90aHJlYWRfbnVtXyc6Om9tcF9nZXRfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9udW1fcHJvY3NfJzo6b21wX2dldF9udW1fcHJvY3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9pbl9wYXJhbGxlbF8nOjpvbXBfaW5fcGFyYWxsZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfZHluYW1pY18nOjpvbXBfZ2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbmVzdGVkXyc6Om9tcF9nZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X3RocmVhZF9saW1pdF8nOjpvbXBfZ2V0X3RocmVhZF9saW1pdAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9tYXhfYWN0aXZlX2xldmVsc18nOjpvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzXyc6Om9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbGV2ZWxfJzo6b21wX2dldF9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9hY3RpdmVfbGV2ZWxfJzo6b21wX2dldF9hY3RpdmVfbGV2ZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bV8nOjpvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfdGVhbV9zaXplXyc6Om9tcF9nZXRfdGVhbV9zaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X3NjaGVkdWxlXyc6Om9tcF9zZXRfc2NoZWR1bGUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfc2NoZWR1bGVfJzo6b21wX2dldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF93dGltZV8nOjpvbXBfZ2V0X3d0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X3d0aWNrXyc6Om9tcF9nZXRfd3RpY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2luaXRfbG9ja18nOjpvbXBfaW5pdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZGVzdHJveV9sb2NrXyc6Om9tcF9kZXN0cm95X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbG9ja18nOjpvbXBfc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF91bnNldF9sb2NrXyc6Om9tcF91bnNldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdGVzdF9sb2NrXyc6Om9tcF90ZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9pbml0X25lc3RfbG9ja18nOjpvbXBfaW5pdF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9kZXN0cm95X25lc3RfbG9ja18nOjpvbXBfZGVzdHJveV9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbmVzdF9sb2NrXyc6Om9tcF9zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdW5zZXRfbmVzdF9sb2NrXyc6Om9tcF91bnNldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF90ZXN0X25lc3RfbG9ja18nOjpvbXBfdGVzdF9uZXN0X2xvY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9zdGFja3NpemVfJzo6a21wX3NldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfc3RhY2tzaXplX3NfJzo6a21wX3NldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9ibG9ja3RpbWVfJzo6a21wX3NldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfbGlicmFyeV9zZXJpYWxfJzo6a21wX3NldF9saWJyYXJ5X3NlcmlhbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmRfJzo6a21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0Xyc6OmttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2xpYnJhcnlfJzo6a21wX3NldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2RlZmF1bHRzXyc6OmttcF9zZXRfZGVmYXVsdHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfc3RhY2tzaXplXyc6OmttcF9nZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X3N0YWNrc2l6ZV9zXyc6OmttcF9nZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfYmxvY2t0aW1lXyc6OmttcF9nZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X2xpYnJhcnlfJzo6a21wX2dldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2FmZmluaXR5Xyc6OmttcF9zZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfYWZmaW5pdHlfJzo6a21wX2dldF9hZmZpbml0eQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2dldF9hZmZpbml0eV9tYXhfcHJvY18nOjprbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfY3JlYXRlX2FmZmluaXR5X21hc2tfJzo6a21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrXyc6OmttcF9kZXN0cm95X2FmZmluaXR5X21hc2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jXyc6OmttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jXyc6OmttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jXyc6OmttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfbWFsbG9jXyc6OmttcF9tYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9jYWxsb2NfJzo6a21wX2NhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3JlYWxsb2NfJzo6a21wX3JlYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9mcmVlXyc6OmttcF9mcmVlCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfd2FybmluZ3Nfb25fJzo6a21wX3NldF93YXJuaW5nc19vbgorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF93YXJuaW5nc19vZmZfJzo6a21wX3NldF93YXJuaW5nc19vZmYKKworIWRlYyQgZW5kaWYKKworIWRlYyQgaWYgZGVmaW5lZChfX0FQUExFX18pCisKKyEqKioKKyEqKiogVGhlIE1hYyBlbnRyeSBwb2ludHMgYXJlIGluIGxvd2VyY2FzZSwgd2l0aCBhbiBib3RoIGFuIHVuZGVyc2NvcmUKKyEqKiogYXBwZW5kZWQgYW5kIGFuIHVuZGVyc2NvcmUgcHJlcGVuZGVkLgorISoqKgorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9udW1fdGhyZWFkc18nOjpvbXBfc2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9keW5hbWljXyc6Om9tcF9zZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbmVzdGVkXyc6Om9tcF9zZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9udW1fdGhyZWFkc18nOjpvbXBfZ2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9tYXhfdGhyZWFkc18nOjpvbXBfZ2V0X21heF90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF90aHJlYWRfbnVtXyc6Om9tcF9nZXRfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbnVtX3Byb2NzXyc6Om9tcF9nZXRfbnVtX3Byb2NzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2luX3BhcmFsbGVsXyc6Om9tcF9pbl9wYXJhbGxlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfZHluYW1pY18nOjpvbXBfZ2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X25lc3RlZF8nOjpvbXBfZ2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfdGhyZWFkX2xpbWl0Xyc6Om9tcF9nZXRfdGhyZWFkX2xpbWl0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9tYXhfYWN0aXZlX2xldmVsc18nOjpvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9tYXhfYWN0aXZlX2xldmVsc18nOjpvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9sZXZlbF8nOjpvbXBfZ2V0X2xldmVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9hY3RpdmVfbGV2ZWxfJzo6b21wX2dldF9hY3RpdmVfbGV2ZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW1fJzo6b21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF90ZWFtX3NpemVfJzo6b21wX2dldF90ZWFtX3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X3NjaGVkdWxlXyc6Om9tcF9zZXRfc2NoZWR1bGUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X3NjaGVkdWxlXyc6Om9tcF9nZXRfc2NoZWR1bGUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X3d0aW1lXyc6Om9tcF9nZXRfd3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X3d0aWNrXyc6Om9tcF9nZXRfd3RpY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pbml0X2xvY2tfJzo6b21wX2luaXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9kZXN0cm95X2xvY2tfJzo6b21wX2Rlc3Ryb3lfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbG9ja18nOjpvbXBfc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdW5zZXRfbG9ja18nOjpvbXBfdW5zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF90ZXN0X2xvY2tfJzo6b21wX3Rlc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pbml0X25lc3RfbG9ja18nOjpvbXBfaW5pdF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZGVzdHJveV9uZXN0X2xvY2tfJzo6b21wX2Rlc3Ryb3lfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9uZXN0X2xvY2tfJzo6b21wX3NldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdW5zZXRfbmVzdF9sb2NrXyc6Om9tcF91bnNldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdGVzdF9uZXN0X2xvY2tfJzo6b21wX3Rlc3RfbmVzdF9sb2NrCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X3N0YWNrc2l6ZV8nOjprbXBfc2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfc3RhY2tzaXplX3NfJzo6a21wX3NldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfYmxvY2t0aW1lXyc6OmttcF9zZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9saWJyYXJ5X3NlcmlhbF8nOjprbXBfc2V0X2xpYnJhcnlfc2VyaWFsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmRfJzo6a21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dF8nOjprbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfbGlicmFyeV8nOjprbXBfc2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2RlZmF1bHRzXyc6OmttcF9zZXRfZGVmYXVsdHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X3N0YWNrc2l6ZV8nOjprbXBfZ2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfc3RhY2tzaXplX3NfJzo6a21wX2dldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfYmxvY2t0aW1lXyc6OmttcF9nZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9saWJyYXJ5Xyc6OmttcF9nZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfYWZmaW5pdHlfJzo6a21wX3NldF9hZmZpbml0eQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfYWZmaW5pdHlfJzo6a21wX2dldF9hZmZpbml0eQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2NfJzo6a21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9jcmVhdGVfYWZmaW5pdHlfbWFza18nOjprbXBfY3JlYXRlX2FmZmluaXR5X21hc2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrXyc6OmttcF9kZXN0cm95X2FmZmluaXR5X21hc2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvY18nOjprbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2NfJzo6a21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jXyc6OmttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX21hbGxvY18nOjprbXBfbWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2NhbGxvY18nOjprbXBfY2FsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3JlYWxsb2NfJzo6a21wX3JlYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZnJlZV8nOjprbXBfZnJlZQorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF93YXJuaW5nc19vbl8nOjprbXBfc2V0X3dhcm5pbmdzX29uCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF93YXJuaW5nc19vZmZfJzo6a21wX3NldF93YXJuaW5nc19vZmYKKworIWRlYyQgZW5kaWYKKworCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9pbmNsdWRlLzQwL2lvbXAuaC52YXIgYi9maW5hbC9ydW50aW1lL3NyYy9pbmNsdWRlLzQwL2lvbXAuaC52YXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRiN2RjYwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDAvaW9tcC5oLnZhcgpAQCAtMCwwICsxLDEwOCBAQAorLyoKKyAqIGluY2x1ZGUvNDAvaW9tcC5oLnZhcgorICogJFJldmlzaW9uOiA0MTY3NCAkCisgKiAkRGF0ZTogMjAxMi0wNi0wNSAwODozMzozNSAtMDUwMCAoVHVlLCAwNSBKdW4gMjAxMikgJAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIF9fSU9NUF9ICisjICAgZGVmaW5lIF9fSU9NUF9ICisKKyMgICBkZWZpbmUgS01QX1ZFUlNJT05fTUFKT1IgICAgJEtNUF9WRVJTSU9OX01BSk9SCisjICAgZGVmaW5lIEtNUF9WRVJTSU9OX01JTk9SICAgICRLTVBfVkVSU0lPTl9NSU5PUgorIyAgIGRlZmluZSBLTVBfVkVSU0lPTl9CVUlMRCAgICAkS01QX1ZFUlNJT05fQlVJTEQKKyMgICBkZWZpbmUgS01QX0JVSUxEX0RBVEUgICAgICAgIiRLTVBfQlVJTERfREFURSIKKworIyAgIGlmZGVmIF9fY3BsdXNwbHVzCisgICAgICAgIGV4dGVybiAiQyIgeworIyAgIGVuZGlmCisKKyMgICAgICAgZGVmaW5lIGttcF9zZXRfc3RhY2tzaXplICAgICAgICAgICAga21wY19zZXRfc3RhY2tzaXplCisjICAgICAgIGRlZmluZSBrbXBfc2V0X3N0YWNrc2l6ZV9zICAgICAgICAgIGttcGNfc2V0X3N0YWNrc2l6ZV9zCisjICAgICAgIGRlZmluZSBrbXBfc2V0X2Jsb2NrdGltZSAgICAgICAgICAgIGttcGNfc2V0X2Jsb2NrdGltZQorIyAgICAgICBkZWZpbmUga21wX3NldF9saWJyYXJ5ICAgICAgICAgICAgICBrbXBjX3NldF9saWJyYXJ5CisjICAgICAgIGRlZmluZSBrbXBfc2V0X2RlZmF1bHRzICAgICAgICAgICAgIGttcGNfc2V0X2RlZmF1bHRzCisjICAgICAgIGRlZmluZSBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYyAgIGttcGNfc2V0X2FmZmluaXR5X21hc2tfcHJvYworIyAgICAgICBkZWZpbmUga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYyBrbXBjX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworIyAgICAgICBkZWZpbmUga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MgICBrbXBjX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKworIyAgICAgICBkZWZpbmUga21wX21hbGxvYyAgICAgICAgICAgICAgICAgICBrbXBjX21hbGxvYworIyAgICAgICBkZWZpbmUga21wX2NhbGxvYyAgICAgICAgICAgICAgICAgICBrbXBjX2NhbGxvYworIyAgICAgICBkZWZpbmUga21wX3JlYWxsb2MgICAgICAgICAgICAgICAgICBrbXBjX3JlYWxsb2MKKyMgICAgICAgZGVmaW5lIGttcF9mcmVlICAgICAgICAgICAgICAgICAgICAga21wY19mcmVlCisKKyMgICBpZiBkZWZpbmVkKF9XSU4zMikKKyMgICAgICAgZGVmaW5lIF9fS0FJX0tNUENfQ09OVkVOVElPTiBfX2NkZWNsCisjICAgZWxzZQorIyAgICAgICBkZWZpbmUgX19LQUlfS01QQ19DT05WRU5USU9OCisjICAgZW5kaWYKKworIyAgIGluY2x1ZGUgPHN0ZGxpYi5oPgorICAgIC8qIGttcCBBUEkgZnVuY3Rpb25zICovCisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9nZXRfc3RhY2tzaXplICAgICAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9zdGFja3NpemUgICAgICAgICAgKGludCk7CisgICAgZXh0ZXJuIHNpemVfdCBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9nZXRfc3RhY2tzaXplX3MgICAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9zdGFja3NpemVfcyAgICAgICAgKHNpemVfdCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9nZXRfYmxvY2t0aW1lICAgICAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2dldF9saWJyYXJ5ICAgICAgICAgICAgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2Jsb2NrdGltZSAgICAgICAgICAoaW50KTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9saWJyYXJ5ICAgICAgICAgICAgKGludCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfbGlicmFyeV9zZXJpYWwgICAgICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dCAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfZGVmYXVsdHMgICAgICAgICAgIChjaGFyIGNvbnN0ICopOworCisgICAgLyogYWZmaW5pdHkgQVBJIGZ1bmN0aW9ucyAqLworICAgIHR5cGVkZWYgdm9pZCAqIGttcF9hZmZpbml0eV9tYXNrX3Q7CisKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9hZmZpbml0eSAgICAgICAgICAgICAoa21wX2FmZmluaXR5X21hc2tfdCAqKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2dldF9hZmZpbml0eSAgICAgICAgICAgICAoa21wX2FmZmluaXR5X21hc2tfdCAqKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYyAgICAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFzayAgICAgKGttcF9hZmZpbml0eV9tYXNrX3QgKik7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2sgICAgKGttcF9hZmZpbml0eV9tYXNrX3QgKik7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jICAgKGludCwga21wX2FmZmluaXR5X21hc2tfdCAqKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYyAoaW50LCBrbXBfYWZmaW5pdHlfbWFza190ICopOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYyAgIChpbnQsIGttcF9hZmZpbml0eV9tYXNrX3QgKik7CisKKyAgICBleHRlcm4gdm9pZCAqIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX21hbGxvYyAgKHNpemVfdCk7CisgICAgZXh0ZXJuIHZvaWQgKiBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9jYWxsb2MgIChzaXplX3QsIHNpemVfdCk7CisgICAgZXh0ZXJuIHZvaWQgKiBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9yZWFsbG9jICh2b2lkICosIHNpemVfdCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9mcmVlICAgICh2b2lkICopOworCisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfd2FybmluZ3Nfb24odm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfd2FybmluZ3Nfb2ZmKHZvaWQpOworCisgICAgLyogc2NoZWR1bGUga2luZCBjb25zdGFudHMgKi8KKyAgICB0eXBlZGVmIGVudW0ga21wX2NhbmNlbF9raW5kX3QgeworICAgICAgICBrbXBfY2FuY2VsX3BhcmFsbGVsICA9IDEsCisgICAgICAgIGttcF9jYW5jZWxfbG9vcCA9IDIsCisgICAgICAgIGttcF9jYW5jZWxfc2VjdGlvbnMgID0gMywKKyAgICAgICAga21wX2NhbmNlbF90YXNrZ3JvdXAgPSA0CisgICAgfSBrbXBfY2FuY2VsX2tpbmRfdDsKKworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZ2V0X2NhbmNlbGxhdGlvbl9zdGF0dXMoa21wX2NhbmNlbF9raW5kX3QpOworCisjICAgdW5kZWYgX19LQUlfS01QQ19DT05WRU5USU9OCisKKyAgICAvKiBXYXJuaW5nOgorICAgICAgIFRoZSBmb2xsb3dpbmcgdHlwZWRlZnMgYXJlIG5vdCBzdGFuZGFyZCwgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHJlbGVhc2UuCisgICAgKi8KKyAgICB0eXBlZGVmIGludCAgICAgb21wX2ludF90OworICAgIHR5cGVkZWYgZG91YmxlICBvbXBfd3RpbWVfdDsKKworIyAgIGlmZGVmIF9fY3BsdXNwbHVzCisgICAgICAgIH0KKyMgICBlbmRpZgorCisjZW5kaWYgLyogX19JT01QX0ggKi8KKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS80MC9pb21wX2xpYi5oLnZhciBiL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDAvaW9tcF9saWIuaC52YXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdjNjNmOAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDAvaW9tcF9saWIuaC52YXIKQEAgLTAsMCArMSw4MyBAQAorISBpbmNsdWRlLzQwL2lvbXBfbGliLmgudmFyCishICRSZXZpc2lvbjogNDE2NzQgJAorISAkRGF0ZTogMjAxMi0wNi0wNSAwODozMzozNSAtMDUwMCAoVHVlLCAwNSBKdW4gMjAxMikgJAorCishCishLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyEvLworIS8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyEvLworIS8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyEvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyEvLworIS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCishCisKKyEqKioKKyEqKiogb21wX2ludGVnZXJfa2luZCBhbmQgb21wX2xvZ2ljYWxfa2luZCBhcHBlYXIgdG8gYmUgcHJlZGVmaW5lZCBieSBnY2MgYW5kCishKioqIGdmb3J0cmFuIChkZWZpbml0aW9ucyBkbyBub3QgYXBwZWFyIGluIHRoZSBvbXAuaCAvIG9tcF9saWIuaCAvb21wX2xpYi5mKS4KKyEqKiogb21wX3JlYWxfa2luZCBpcyBub3QgcHJlZGVmaW5lZCwgaG93ZXZlci4KKyEqKioKKworICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fbWFqb3IgPSAkS01QX1ZFUlNJT05fTUFKT1IKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX21pbm9yID0gJEtNUF9WRVJTSU9OX01JTk9SCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9idWlsZCA9ICRLTVBfVkVSU0lPTl9CVUlMRAorICAgICAgICBjaGFyYWN0ZXIoKikgICAgICAgICAga21wX2J1aWxkX2RhdGUKKyAgICAgICAgcGFyYW1ldGVyKCBrbXBfYnVpbGRfZGF0ZSA9ICckS01QX0JVSUxEX0RBVEUnICkKKworICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX3JlYWxfa2luZCA9IDQKKworISoqKgorISoqKiBrbXBfKiB0eXBlIGV4dGVuc2lvbnMKKyEqKioKKworICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX3BvaW50ZXJfa2luZCAgICAgICA9ICRLTVBfSU5UX1BUUl9LSU5ECisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfc2l6ZV90X2tpbmQgICAgICAgID0gJEtNUF9JTlRfUFRSX0tJTkQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF9hZmZpbml0eV9tYXNrX2tpbmQgPSAkS01QX0lOVF9QVFJfS0lORAorCishKioqCishKioqIGttcF8qIGVudHJ5IHBvaW50cworISoqKgorCisgICAgICAgIGV4dGVybmFsIGttcF9zZXRfc3RhY2tzaXplCisgICAgICAgIGV4dGVybmFsIGttcF9zZXRfc3RhY2tzaXplX3MKKyAgICAgICAgZXh0ZXJuYWwga21wX3NldF9ibG9ja3RpbWUKKyAgICAgICAgZXh0ZXJuYWwga21wX3NldF9saWJyYXJ5X3NlcmlhbAorICAgICAgICBleHRlcm5hbCBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZAorICAgICAgICBleHRlcm5hbCBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dAorICAgICAgICBleHRlcm5hbCBrbXBfc2V0X2xpYnJhcnkKKyAgICAgICAgZXh0ZXJuYWwga21wX3NldF9kZWZhdWx0cworICAgICAgICBleHRlcm5hbCBrbXBfZ2V0X3N0YWNrc2l6ZQorICAgICAgICBpbnRlZ2VyIGttcF9nZXRfc3RhY2tzaXplCisgICAgICAgIGV4dGVybmFsIGttcF9nZXRfc3RhY2tzaXplX3MKKyAgICAgICAgaW50ZWdlciAoa2luZCA9IGttcF9zaXplX3Rfa2luZCkga21wX2dldF9zdGFja3NpemVfcworICAgICAgICBleHRlcm5hbCBrbXBfZ2V0X2Jsb2NrdGltZQorICAgICAgICBpbnRlZ2VyIGttcF9nZXRfYmxvY2t0aW1lCisgICAgICAgIGV4dGVybmFsIGttcF9nZXRfbGlicmFyeQorICAgICAgICBpbnRlZ2VyIGttcF9nZXRfbGlicmFyeQorICAgICAgICBleHRlcm5hbCBrbXBfc2V0X2FmZmluaXR5CisgICAgICAgIGludGVnZXIga21wX3NldF9hZmZpbml0eQorICAgICAgICBleHRlcm5hbCBrbXBfZ2V0X2FmZmluaXR5CisgICAgICAgIGludGVnZXIga21wX2dldF9hZmZpbml0eQorICAgICAgICBleHRlcm5hbCBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCisgICAgICAgIGludGVnZXIga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworICAgICAgICBleHRlcm5hbCBrbXBfY3JlYXRlX2FmZmluaXR5X21hc2sKKyAgICAgICAgZXh0ZXJuYWwga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzaworICAgICAgICBleHRlcm5hbCBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICAgICBpbnRlZ2VyIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgIGV4dGVybmFsIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKyAgICAgICAgaW50ZWdlciBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgIGV4dGVybmFsIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgIGludGVnZXIga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKyAgICAgICAgZXh0ZXJuYWwga21wX21hbGxvYworICAgICAgICBpbnRlZ2VyIChraW5kID0ga21wX3BvaW50ZXJfa2luZCkga21wX21hbGxvYworICAgICAgICBleHRlcm5hbCBrbXBfY2FsbG9jCisgICAgICAgIGludGVnZXIgKGtpbmQgPSBrbXBfcG9pbnRlcl9raW5kKSBrbXBfY2FsbG9jCisgICAgICAgIGV4dGVybmFsIGttcF9yZWFsbG9jCisgICAgICAgIGludGVnZXIgKGtpbmQgPSBrbXBfcG9pbnRlcl9raW5kKSBrbXBfcmVhbGxvYworICAgICAgICBleHRlcm5hbCBrbXBfZnJlZQorCisgICAgICAgIGV4dGVybmFsIGttcF9zZXRfd2FybmluZ3Nfb24KKyAgICAgICAgZXh0ZXJuYWwga21wX3NldF93YXJuaW5nc19vZmYKKworCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9pbmNsdWRlLzQwL29tcC5oLnZhciBiL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDAvb21wLmgudmFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2ZGQ0Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9pbmNsdWRlLzQwL29tcC5oLnZhcgpAQCAtMCwwICsxLDE2MCBAQAorLyoKKyAqIGluY2x1ZGUvNDAvb21wLmgudmFyCisgKiAkUmV2aXNpb246IDQxNjc0ICQKKyAqICREYXRlOiAyMDEyLTA2LTA1IDA4OjMzOjM1IC0wNTAwIChUdWUsIDA1IEp1biAyMDEyKSAkCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgX19PTVBfSAorIyAgIGRlZmluZSBfX09NUF9ICisKKyMgICBkZWZpbmUgS01QX1ZFUlNJT05fTUFKT1IgICAgJEtNUF9WRVJTSU9OX01BSk9SCisjICAgZGVmaW5lIEtNUF9WRVJTSU9OX01JTk9SICAgICRLTVBfVkVSU0lPTl9NSU5PUgorIyAgIGRlZmluZSBLTVBfVkVSU0lPTl9CVUlMRCAgICAkS01QX1ZFUlNJT05fQlVJTEQKKyMgICBkZWZpbmUgS01QX0JVSUxEX0RBVEUgICAgICAgIiRLTVBfQlVJTERfREFURSIKKworIyAgIGlmZGVmIF9fY3BsdXNwbHVzCisgICAgZXh0ZXJuICJDIiB7CisjICAgZW5kaWYKKworIyAgIGlmIGRlZmluZWQoX1dJTjMyKQorIyAgICAgICBkZWZpbmUgX19LQUlfS01QQ19DT05WRU5USU9OIF9fY2RlY2wKKyMgICBlbHNlCisjICAgICAgIGRlZmluZSBfX0tBSV9LTVBDX0NPTlZFTlRJT04KKyMgICBlbmRpZgorCisgICAgLyogc2NoZWR1bGUga2luZCBjb25zdGFudHMgKi8KKyAgICB0eXBlZGVmIGVudW0gb21wX3NjaGVkX3QgeworCW9tcF9zY2hlZF9zdGF0aWMgID0gMSwKKwlvbXBfc2NoZWRfZHluYW1pYyA9IDIsCisJb21wX3NjaGVkX2d1aWRlZCAgPSAzLAorCW9tcF9zY2hlZF9hdXRvICAgID0gNAorICAgIH0gb21wX3NjaGVkX3Q7CisKKyAgICAvKiBzZXQgQVBJIGZ1bmN0aW9ucyAqLworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfc2V0X251bV90aHJlYWRzIChpbnQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfc2V0X2R5bmFtaWMgICAgIChpbnQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfc2V0X25lc3RlZCAgICAgIChpbnQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzIChpbnQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfc2V0X3NjaGVkdWxlICAgICAgICAgIChvbXBfc2NoZWRfdCwgaW50KTsKKworICAgIC8qIHF1ZXJ5IEFQSSBmdW5jdGlvbnMgKi8KKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9udW1fdGhyZWFkcyAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X2R5bmFtaWMgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfbmVzdGVkICAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9tYXhfdGhyZWFkcyAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X3RocmVhZF9udW0gICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfbnVtX3Byb2NzICAgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2luX3BhcmFsbGVsICAgICAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X2FjdGl2ZV9sZXZlbCAgICAgICAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X2xldmVsICAgICAgICAgICAgICAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0gKGludCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfdGVhbV9zaXplICAgICAgICAgICAoaW50KTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF90aHJlYWRfbGltaXQgICAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9tYXhfYWN0aXZlX2xldmVscyAgICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9zY2hlZHVsZSAgICAgICAgICAgIChvbXBfc2NoZWRfdCAqLCBpbnQgKik7CisKKyAgICAvKiBsb2NrIEFQSSBmdW5jdGlvbnMgKi8KKyAgICB0eXBlZGVmIHN0cnVjdCBvbXBfbG9ja190IHsKKyAgICAgICAgdm9pZCAqIF9sazsKKyAgICB9IG9tcF9sb2NrX3Q7CisKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2luaXRfbG9jayAgICAob21wX2xvY2tfdCAqKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3NldF9sb2NrICAgICAob21wX2xvY2tfdCAqKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3Vuc2V0X2xvY2sgICAob21wX2xvY2tfdCAqKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2Rlc3Ryb3lfbG9jayAob21wX2xvY2tfdCAqKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3Rlc3RfbG9jayAgICAob21wX2xvY2tfdCAqKTsKKworICAgIC8qIG5lc3RlZCBsb2NrIEFQSSBmdW5jdGlvbnMgKi8KKyAgICB0eXBlZGVmIHN0cnVjdCBvbXBfbmVzdF9sb2NrX3QgeworICAgICAgICB2b2lkICogX2xrOworICAgIH0gb21wX25lc3RfbG9ja190OworCisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9pbml0X25lc3RfbG9jayAgICAob21wX25lc3RfbG9ja190ICopOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfc2V0X25lc3RfbG9jayAgICAgKG9tcF9uZXN0X2xvY2tfdCAqKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3Vuc2V0X25lc3RfbG9jayAgIChvbXBfbmVzdF9sb2NrX3QgKik7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9kZXN0cm95X25lc3RfbG9jayAob21wX25lc3RfbG9ja190ICopOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfdGVzdF9uZXN0X2xvY2sgICAgKG9tcF9uZXN0X2xvY2tfdCAqKTsKKworICAgIC8qIHRpbWUgQVBJIGZ1bmN0aW9ucyAqLworICAgIGV4dGVybiBkb3VibGUgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X3d0aW1lICh2b2lkKTsKKyAgICBleHRlcm4gZG91YmxlIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF93dGljayAodm9pZCk7CisKKyAgICAvKiBPcGVuTVAgNC4wICovCisgICAgZXh0ZXJuIGludCAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9zZXRfZGVmYXVsdF9kZXZpY2UgKGludCk7CisgICAgZXh0ZXJuIGludCAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X251bV9kZXZpY2VzICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfbnVtX3RlYW1zICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfdGVhbV9udW0gKHZvaWQpOworICAgIGV4dGVybiBpbnQgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9jYW5jZWxsYXRpb24gKHZvaWQpOworCisjICAgaW5jbHVkZSA8c3RkbGliLmg+CisgICAgLyoga21wIEFQSSBmdW5jdGlvbnMgKi8KKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2dldF9zdGFja3NpemUgICAgICAgICAgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X3N0YWNrc2l6ZSAgICAgICAgICAoaW50KTsKKyAgICBleHRlcm4gc2l6ZV90IF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2dldF9zdGFja3NpemVfcyAgICAgICAgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X3N0YWNrc2l6ZV9zICAgICAgICAoc2l6ZV90KTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2dldF9ibG9ja3RpbWUgICAgICAgICAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZ2V0X2xpYnJhcnkgICAgICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfYmxvY2t0aW1lICAgICAgICAgIChpbnQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2xpYnJhcnkgICAgICAgICAgICAoaW50KTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9saWJyYXJ5X3NlcmlhbCAgICAgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZCAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0ICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9kZWZhdWx0cyAgICAgICAgICAgKGNoYXIgY29uc3QgKik7CisKKyAgICAvKiBJbnRlbCBhZmZpbml0eSBBUEkgKi8KKyAgICB0eXBlZGVmIHZvaWQgKiBrbXBfYWZmaW5pdHlfbWFza190OworCisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfYWZmaW5pdHkgICAgICAgICAgICAgKGttcF9hZmZpbml0eV9tYXNrX3QgKik7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9nZXRfYWZmaW5pdHkgICAgICAgICAgICAgKGttcF9hZmZpbml0eV9tYXNrX3QgKik7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MgICAgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfY3JlYXRlX2FmZmluaXR5X21hc2sgICAgIChrbXBfYWZmaW5pdHlfbWFza190ICopOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrICAgIChrbXBfYWZmaW5pdHlfbWFza190ICopOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYyAgIChpbnQsIGttcF9hZmZpbml0eV9tYXNrX3QgKik7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MgKGludCwga21wX2FmZmluaXR5X21hc2tfdCAqKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MgICAoaW50LCBrbXBfYWZmaW5pdHlfbWFza190ICopOworCisgICAgLyogT3Blbk1QIDQuMCBhZmZpbml0eSBBUEkgKi8KKyAgICB0eXBlZGVmIGVudW0gb21wX3Byb2NfYmluZF90IHsKKyAgICAgICAgb21wX3Byb2NfYmluZF9mYWxzZSA9IDAsCisgICAgICAgIG9tcF9wcm9jX2JpbmRfdHJ1ZSA9IDEsCisgICAgICAgIG9tcF9wcm9jX2JpbmRfbWFzdGVyID0gMiwKKyAgICAgICAgb21wX3Byb2NfYmluZF9jbG9zZSA9IDMsCisgICAgICAgIG9tcF9wcm9jX2JpbmRfc3ByZWFkID0gNAorICAgIH0gb21wX3Byb2NfYmluZF90OworCisgICAgZXh0ZXJuIG9tcF9wcm9jX2JpbmRfdCBfX0tBSV9LTVBDX0NPTlZFTlRJT04gb21wX2dldF9wcm9jX2JpbmQgKHZvaWQpOworCisgICAgZXh0ZXJuIHZvaWQgKiBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9tYWxsb2MgIChzaXplX3QpOworICAgIGV4dGVybiB2b2lkICogX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfY2FsbG9jICAoc2l6ZV90LCBzaXplX3QpOworICAgIGV4dGVybiB2b2lkICogX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfcmVhbGxvYyAodm9pZCAqLCBzaXplX3QpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZnJlZSAgICAodm9pZCAqKTsKKworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X3dhcm5pbmdzX29uKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X3dhcm5pbmdzX29mZih2b2lkKTsKKworIyAgIHVuZGVmIF9fS0FJX0tNUENfQ09OVkVOVElPTgorCisgICAgLyogV2FybmluZzoKKyAgICAgICBUaGUgZm9sbG93aW5nIHR5cGVkZWZzIGFyZSBub3Qgc3RhbmRhcmQsIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSByZWxlYXNlLgorICAgICovCisgICAgdHlwZWRlZiBpbnQgICAgIG9tcF9pbnRfdDsKKyAgICB0eXBlZGVmIGRvdWJsZSAgb21wX3d0aW1lX3Q7CisKKyMgICBpZmRlZiBfX2NwbHVzcGx1cworICAgIH0KKyMgICBlbmRpZgorCisjZW5kaWYgLyogX19PTVBfSCAqLworCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9pbmNsdWRlLzQwL29tcF9saWIuZi52YXIgYi9maW5hbC9ydW50aW1lL3NyYy9pbmNsdWRlLzQwL29tcF9saWIuZi52YXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI5YjJmMgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDAvb21wX2xpYi5mLnZhcgpAQCAtMCwwICsxLDc1MCBAQAorISBpbmNsdWRlLzQwL29tcF9saWIuZi52YXIKKyEgJFJldmlzaW9uOiA0MTY3NCAkCishICREYXRlOiAyMDEyLTA2LTA1IDA4OjMzOjM1IC0wNTAwIChUdWUsIDA1IEp1biAyMDEyKSAkCisKKyEKKyEvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIS8vCishLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIS8vCishLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIS8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIS8vCishLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyEKKworISoqKgorISoqKiBTb21lIG9mIHRoZSBkaXJlY3RpdmVzIGZvciB0aGUgZm9sbG93aW5nIHJvdXRpbmUgZXh0ZW5kIHBhc3QgY29sdW1uIDcyLAorISoqKiBzbyBwcm9jZXNzIHRoaXMgZmlsZSBpbiAxMzItY29sdW1uIG1vZGUuCishKioqCisKKyFkZWMkIGZpeGVkZm9ybWxpbmVzaXplOjEzMgorCisgICAgICBtb2R1bGUgb21wX2xpYl9raW5kcworCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfaW50ZWdlcl9raW5kICAgICAgID0gNAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2xvZ2ljYWxfa2luZCAgICAgICA9IDQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9yZWFsX2tpbmQgICAgICAgICAgPSA0CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfbG9ja19raW5kICAgICAgICAgID0gaW50X3B0cl9raW5kKCkKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9uZXN0X2xvY2tfa2luZCAgICAgPSBpbnRfcHRyX2tpbmQoKQorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2tpbmQgICAgICAgICA9IG9tcF9pbnRlZ2VyX2tpbmQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9wcm9jX2JpbmRfa2luZCAgICAgPSBvbXBfaW50ZWdlcl9raW5kCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfcG9pbnRlcl9raW5kICAgICAgID0gaW50X3B0cl9raW5kKCkKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF9zaXplX3Rfa2luZCAgICAgICAgPSBpbnRfcHRyX2tpbmQoKQorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX2FmZmluaXR5X21hc2tfa2luZCA9IGludF9wdHJfa2luZCgpCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfY2FuY2VsX2tpbmQgICAgICAgID0gb21wX2ludGVnZXJfa2luZAorCisgICAgICBlbmQgbW9kdWxlIG9tcF9saWJfa2luZHMKKworICAgICAgbW9kdWxlIG9tcF9saWIKKworICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworCisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9tYWpvciA9ICRLTVBfVkVSU0lPTl9NQUpPUgorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fbWlub3IgPSAkS01QX1ZFUlNJT05fTUlOT1IKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX2J1aWxkID0gJEtNUF9WRVJTSU9OX0JVSUxECisgICAgICAgIGNoYXJhY3RlcigqKSwgcGFyYW1ldGVyIDo6IGttcF9idWlsZF9kYXRlICAgID0gJyRLTVBfQlVJTERfREFURScKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IG9wZW5tcF92ZXJzaW9uICAgID0gJE9NUF9WRVJTSU9OCisKKyAgICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9zdGF0aWMgID0gMQorICAgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2R5bmFtaWMgPSAyCisgICAgICAgIGludGVnZXIoa2luZD1vbXBfc2NoZWRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfZ3VpZGVkICA9IDMKKyAgICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9hdXRvICAgID0gNAorCisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3Byb2NfYmluZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9wcm9jX2JpbmRfZmFsc2UgPSAwCisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3Byb2NfYmluZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9wcm9jX2JpbmRfdHJ1ZSA9IDEKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF9tYXN0ZXIgPSAyCisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3Byb2NfYmluZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9wcm9jX2JpbmRfY2xvc2UgPSAzCisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3Byb2NfYmluZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9wcm9jX2JpbmRfc3ByZWFkID0gNAorCisgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2NhbmNlbF9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF9jYW5jZWxfcGFyYWxsZWwgPSAxCisgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2NhbmNlbF9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF9jYW5jZWxfbG9vcCA9IDIKKyAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfY2FuY2VsX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX2NhbmNlbF9zZWN0aW9ucyA9IDMKKyAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfY2FuY2VsX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX2NhbmNlbF90YXNrZ3JvdXAgPSA0CisKKyAgICAgICAgaW50ZXJmYWNlCisKKyEgICAgICAgICAqKioKKyEgICAgICAgICAqKiogb21wXyogZW50cnkgcG9pbnRzCishICAgICAgICAgKioqCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbnVtX3RocmVhZHMobnRocmVhZHMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBudGhyZWFkcworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbnVtX3RocmVhZHMKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9keW5hbWljKGVuYWJsZSkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIGVuYWJsZQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfZHluYW1pYworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X25lc3RlZChlbmFibGUpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBlbmFibGUKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X25lc3RlZAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fdGhyZWFkcygpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV90aHJlYWRzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3RocmVhZHMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X3RocmVhZHMoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9tYXhfdGhyZWFkcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X21heF90aHJlYWRzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9udW0oKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90aHJlYWRfbnVtCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX251bQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fcHJvY3MoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fcHJvY3MKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fcHJvY3MKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9pbl9wYXJhbGxlbCgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfaW5fcGFyYWxsZWwKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2luX3BhcmFsbGVsCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2R5bmFtaWMoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2dldF9keW5hbWljCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfZHluYW1pYworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9uZXN0ZWQoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2dldF9uZXN0ZWQKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9uZXN0ZWQKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX2xpbWl0KCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfdGhyZWFkX2xpbWl0CisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX2xpbWl0CisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMobWF4X2xldmVscykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG1heF9sZXZlbHMKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9tYXhfYWN0aXZlX2xldmVscworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9sZXZlbCgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2xldmVsCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbGV2ZWwKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfYWN0aXZlX2xldmVsKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfYWN0aXZlX2xldmVsCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfYWN0aXZlX2xldmVsCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0obGV2ZWwpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBsZXZlbAorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RlYW1fc2l6ZShsZXZlbCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGxldmVsCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfdGVhbV9zaXplCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGVhbV9zaXplCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfc2NoZWR1bGUoa2luZCwgbW9kaWZpZXIpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfc2NoZWRfa2luZCkga2luZAorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBtb2RpZmllcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfc2NoZWR1bGUKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2dldF9zY2hlZHVsZShraW5kLCBtb2RpZmllcikKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9zY2hlZF9raW5kKSBraW5kCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG1vZGlmaWVyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2dldF9zY2hlZHVsZQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9wcm9jX2JpbmQoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3Byb2NfYmluZF9raW5kKSBvbXBfZ2V0X3Byb2NfYmluZAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3Byb2NfYmluZAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF93dGltZSgpCisgICAgICAgICAgICBkb3VibGUgcHJlY2lzaW9uIG9tcF9nZXRfd3RpbWUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF93dGltZQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF93dGljayAoKQorICAgICAgICAgICAgZG91YmxlIHByZWNpc2lvbiBvbXBfZ2V0X3d0aWNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfd3RpY2sKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfZGVmYXVsdF9kZXZpY2UoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9kZWZhdWx0X2RldmljZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfZGVmYXVsdF9kZXZpY2UoZGZsdF9kZXZpY2UpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBkZmx0X2RldmljZQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfZGVmYXVsdF9kZXZpY2UKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX2RldmljZXMoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fZGV2aWNlcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV9kZXZpY2VzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X251bV90ZWFtcygpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV90ZWFtcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV90ZWFtcworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF90ZWFtX251bSgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RlYW1fbnVtCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGVhbV9udW0KKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfY2FuY2VsbGF0aW9uKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfY2FuY2VsbGF0aW9uCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfY2FuY2VsbGF0aW9uCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9pbml0X2xvY2sobG9ja3ZhcikKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF9pbml0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2luaXRfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfZGVzdHJveV9sb2NrKGxvY2t2YXIpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfZGVzdHJveV9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9sb2NrKGxvY2t2YXIpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfc2V0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF91bnNldF9sb2NrKGxvY2t2YXIpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfdW5zZXRfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfdW5zZXRfbG9jaworCisgICAgICAgICAgZnVuY3Rpb24gb21wX3Rlc3RfbG9jayhsb2NrdmFyKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3Rlc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF90ZXN0X2xvY2sKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfdGVzdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9pbml0X25lc3RfbG9jayhsb2NrdmFyKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX2luaXRfbmVzdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2luaXRfbmVzdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X25lc3RfbG9jayhsb2NrdmFyKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX2Rlc3Ryb3lfbmVzdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdF9sb2NrKGxvY2t2YXIpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfc2V0X25lc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF91bnNldF9uZXN0X2xvY2sobG9ja3ZhcikKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF91bnNldF9uZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfdW5zZXRfbmVzdF9sb2NrCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfdGVzdF9uZXN0X2xvY2sobG9ja3ZhcikKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF90ZXN0X25lc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF90ZXN0X25lc3RfbG9jaworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX3Rlc3RfbmVzdF9sb2NrCisKKyEgICAgICAgICAqKioKKyEgICAgICAgICAqKioga21wXyogZW50cnkgcG9pbnRzCishICAgICAgICAgKioqCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplKHNpemUpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBzaXplCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemUKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemVfcyhzaXplKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBzaXplCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemVfcworCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2Jsb2NrdGltZShtc2VjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbXNlYworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfYmxvY2t0aW1lCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV9zZXJpYWwoKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV9zZXJpYWwKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQoKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0KCkKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dAorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnkobGlibnVtKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbGlibnVtCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5CisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfZGVmYXVsdHMoc3RyaW5nKQorICAgICAgICAgICAgY2hhcmFjdGVyKigqKSBzdHJpbmcKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2RlZmF1bHRzCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZSgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X3N0YWNrc2l6ZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZQorCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemVfcygpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIGttcF9nZXRfc3RhY2tzaXplX3MKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemVfcworCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9ibG9ja3RpbWUoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9ibG9ja3RpbWUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9ibG9ja3RpbWUKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfbGlicmFyeSgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2xpYnJhcnkKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9saWJyYXJ5CisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5KG1hc2spCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfc2V0X2FmZmluaXR5CisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eQorCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eShtYXNrKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9hZmZpbml0eQorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHkKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFzayhtYXNrKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFzaworCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrKG1hc2spCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzaworCisgICAgICAgICAgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MocHJvYywgbWFzaykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIHByb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYyhwcm9jLCBtYXNrKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBwcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MocHJvYywgbWFzaykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIHByb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX21hbGxvYyhzaXplKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX21hbGxvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIHNpemUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX21hbGxvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX2NhbGxvYyhuZWxlbSwgZWxzaXplKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX2NhbGxvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIG5lbGVtCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkgZWxzaXplCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9jYWxsb2MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9yZWFsbG9jKHB0ciwgc2l6ZSkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGttcF9yZWFsbG9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIHB0cgorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIHNpemUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3JlYWxsb2MKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX2ZyZWUocHRyKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkgcHRyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX2ZyZWUKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vbigpCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vbgorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29mZigpCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vZmYKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfY2FuY2VsbGF0aW9uX3N0YXR1cyhjYW5jZWxraW5kKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2NhbmNlbF9raW5kKSBjYW5jZWxraW5kCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIGttcF9nZXRfY2FuY2VsbGF0aW9uX3N0YXR1cworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2NhbmNlbGxhdGlvbl9zdGF0dXMKKyAgICAgICAgZW5kIGludGVyZmFjZQorCishZGVjJCBpZiBkZWZpbmVkKF9XSU4zMikKKyFkZWMkICAgaWYgZGVmaW5lZChfV0lONjQpIC5vci4gZGVmaW5lZChfTV9BTUQ2NCkKKworISoqKgorISoqKiBUaGUgRm9ydHJhbiBlbnRyeSBwb2ludHMgbXVzdCBiZSBpbiB1cHBlcmNhc2UsIGV2ZW4gaWYgdGhlIC9RbG93ZXJjYXNlCishKioqIG9wdGlvbiBpcyBzcGVjaWZpZWQuICBUaGUgYWxpYXMgYXR0cmlidXRlIGVuc3VyZXMgdGhhdCB0aGUgc3BlY2lmaWVkCishKioqIHN0cmluZyBpcyB1c2VkIGFzIHRoZSBlbnRyeSBwb2ludC4KKyEqKioKKyEqKiogT24gdGhlIFdpbmRvd3MqIE9TIElBLTMyIGFyY2hpdGVjdHVyZSwgdGhlIEZvcnRyYW4gZW50cnkgcG9pbnRzIGhhdmUgYW4KKyEqKiogdW5kZXJzY29yZSBwcmVwZW5kZWQuICBPbiB0aGUgV2luZG93cyogT1MgSW50ZWwoUikgNjQKKyEqKiogYXJjaGl0ZWN0dXJlLCBubyB1bmRlcnNjb3JlIGlzIHByZXBlbmRlZC4KKyEqKioKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX1NFVF9OVU1fVEhSRUFEUycgOjogb21wX3NldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX1NFVF9EWU5BTUlDJyA6OiBvbXBfc2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9TRVRfTkVTVEVEJyA6OiBvbXBfc2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9OVU1fVEhSRUFEUycgOjogb21wX2dldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9NQVhfVEhSRUFEUycgOjogb21wX2dldF9tYXhfdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9USFJFQURfTlVNJyA6OiBvbXBfZ2V0X3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTlVNX1BST0NTJyA6OiBvbXBfZ2V0X251bV9wcm9jcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0lOX1BBUkFMTEVMJyA6OiBvbXBfaW5fcGFyYWxsZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfRFlOQU1JQycgOjogb21wX2dldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX05FU1RFRCcgOjogb21wX2dldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfVEhSRUFEX0xJTUlUJyA6OiBvbXBfZ2V0X3RocmVhZF9saW1pdAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX1NFVF9NQVhfQUNUSVZFX0xFVkVMUycgOjogb21wX3NldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9NQVhfQUNUSVZFX0xFVkVMUycgOjogb21wX2dldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9MRVZFTCcgOjogb21wX2dldF9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9BQ1RJVkVfTEVWRUwnIDo6IG9tcF9nZXRfYWN0aXZlX2xldmVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX0FOQ0VTVE9SX1RIUkVBRF9OVU0nIDo6IG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9URUFNX1NJWkUnIDo6IG9tcF9nZXRfdGVhbV9zaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfU0VUX1NDSEVEVUxFJyA6OiBvbXBfc2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1NDSEVEVUxFJyA6OiBvbXBfZ2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1BST0NfQklORCcgOjogb21wX2dldF9wcm9jX2JpbmQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfV1RJTUUnIDo6IG9tcF9nZXRfd3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfV1RJQ0snIDo6IG9tcF9nZXRfd3RpY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfREVGQVVMVF9ERVZJQ0UnIDo6IG9tcF9nZXRfZGVmYXVsdF9kZXZpY2UKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9TRVRfREVGQVVMVF9ERVZJQ0UnIDo6IG9tcF9zZXRfZGVmYXVsdF9kZXZpY2UKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTlVNX0RFVklDRVMnIDo6IG9tcF9nZXRfbnVtX2RldmljZXMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTlVNX1RFQU1TJyA6OiBvbXBfZ2V0X251bV90ZWFtcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9URUFNX05VTScgOjogb21wX2dldF90ZWFtX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9DQU5DRUxMQVRJT04nIDo6IG9tcF9nZXRfY2FuY2VsbGF0aW9uCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9pbml0X2xvY2snIDo6IG9tcF9pbml0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9kZXN0cm95X2xvY2snIDo6IG9tcF9kZXN0cm95X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbG9jaycgOjogb21wX3NldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdW5zZXRfbG9jaycgOjogb21wX3Vuc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF90ZXN0X2xvY2snIDo6IG9tcF90ZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9pbml0X25lc3RfbG9jaycgOjogb21wX2luaXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZGVzdHJveV9uZXN0X2xvY2snIDo6IG9tcF9kZXN0cm95X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9uZXN0X2xvY2snIDo6IG9tcF9zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdW5zZXRfbmVzdF9sb2NrJyA6OiBvbXBfdW5zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdGVzdF9uZXN0X2xvY2snIDo6IG9tcF90ZXN0X25lc3RfbG9jaworCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX1NUQUNLU0laRSc6OmttcF9zZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX1NUQUNLU0laRV9TJzo6a21wX3NldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9CTE9DS1RJTUUnOjprbXBfc2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9MSUJSQVJZX1NFUklBTCc6OmttcF9zZXRfbGlicmFyeV9zZXJpYWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfTElCUkFSWV9UVVJOQVJPVU5EJzo6a21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfTElCUkFSWV9USFJPVUdIUFVUJzo6a21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfTElCUkFSWSc6OmttcF9zZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9TVEFDS1NJWkUnOjprbXBfZ2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9TVEFDS1NJWkVfUyc6OmttcF9nZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9HRVRfQkxPQ0tUSU1FJzo6a21wX2dldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9HRVRfTElCUkFSWSc6OmttcF9nZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9BRkZJTklUWSc6OmttcF9zZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9HRVRfQUZGSU5JVFknOjprbXBfZ2V0X2FmZmluaXR5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX0FGRklOSVRZX01BWF9QUk9DJzo6a21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0NSRUFURV9BRkZJTklUWV9NQVNLJzo6a21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfREVTVFJPWV9BRkZJTklUWV9NQVNLJzo6a21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9BRkZJTklUWV9NQVNLX1BST0MnOjprbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1VOU0VUX0FGRklOSVRZX01BU0tfUFJPQyc6OmttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9HRVRfQUZGSU5JVFlfTUFTS19QUk9DJzo6a21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9NQUxMT0MnOjprbXBfbWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfQ0FMTE9DJzo6a21wX2NhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1JFQUxMT0MnOjprbXBfcmVhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0ZSRUUnOjprbXBfZnJlZQorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX1dBUk5JTkdTX09OJzo6a21wX3NldF93YXJuaW5nc19vbgorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9XQVJOSU5HU19PRkYnOjprbXBfc2V0X3dhcm5pbmdzX29mZgorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX0NBTkNFTExBVElPTl9TVEFUVVMnIDo6IGttcF9nZXRfY2FuY2VsbGF0aW9uX3N0YXR1cworCishZGVjJCAgIGVsc2UKKworISoqKgorISoqKiBPbiBXaW5kb3dzKiBPUyBJQS0zMiBhcmNoaXRlY3R1cmUsIHRoZSBGb3J0cmFuIGVudHJ5IHBvaW50cyBoYXZlIGFuIHVuZGVyc2NvcmUgcHJlcGVuZGVkLgorISoqKgorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX1NFVF9OVU1fVEhSRUFEUycgOjogb21wX3NldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9TRVRfRFlOQU1JQycgOjogb21wX3NldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX1NFVF9ORVNURUQnIDo6IG9tcF9zZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9OVU1fVEhSRUFEUycgOjogb21wX2dldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfTUFYX1RIUkVBRFMnIDo6IG9tcF9nZXRfbWF4X3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX1RIUkVBRF9OVU0nIDo6IG9tcF9nZXRfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfTlVNX1BST0NTJyA6OiBvbXBfZ2V0X251bV9wcm9jcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9JTl9QQVJBTExFTCcgOjogb21wX2luX3BhcmFsbGVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9EWU5BTUlDJyA6OiBvbXBfZ2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX05FU1RFRCcgOjogb21wX2dldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX1RIUkVBRF9MSU1JVCcgOjogb21wX2dldF90aHJlYWRfbGltaXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfU0VUX01BWF9BQ1RJVkVfTEVWRUxTJyA6OiBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9NQVhfQUNUSVZFX0xFVkVMUycgOjogb21wX2dldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfTEVWRUwnIDo6IG9tcF9nZXRfbGV2ZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX0FDVElWRV9MRVZFTCcgOjogb21wX2dldF9hY3RpdmVfbGV2ZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX0FOQ0VTVE9SX1RIUkVBRF9OVU0nIDo6IG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfVEVBTV9TSVpFJyA6OiBvbXBfZ2V0X3RlYW1fc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9TRVRfU0NIRURVTEUnIDo6IG9tcF9zZXRfc2NoZWR1bGUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX1NDSEVEVUxFJyA6OiBvbXBfZ2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9QUk9DX0JJTkQnIDo6IG9tcF9nZXRfcHJvY19iaW5kCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9XVElNRScgOjogb21wX2dldF93dGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfV1RJQ0snIDo6IG9tcF9nZXRfd3RpY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX0RFRkFVTFRfREVWSUNFJyA6OiBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX1NFVF9ERUZBVUxUX0RFVklDRScgOjogb21wX3NldF9kZWZhdWx0X2RldmljZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfTlVNX0RFVklDRVMnIDo6IG9tcF9nZXRfbnVtX2RldmljZXMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX05VTV9URUFNUycgOjogb21wX2dldF9udW1fdGVhbXMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX1RFQU1fTlVNJyA6OiBvbXBfZ2V0X3RlYW1fbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9DQU5DRUxMQVRJT04nIDo6IG9tcF9nZXRfY2FuY2VsbGF0aW9uCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfaW5pdF9sb2NrJyA6OiBvbXBfaW5pdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2Rlc3Ryb3lfbG9jaycgOjogb21wX2Rlc3Ryb3lfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbG9jaycgOjogb21wX3NldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Vuc2V0X2xvY2snIDo6IG9tcF91bnNldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Rlc3RfbG9jaycgOjogb21wX3Rlc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pbml0X25lc3RfbG9jaycgOjogb21wX2luaXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2Rlc3Ryb3lfbmVzdF9sb2NrJyA6OiBvbXBfZGVzdHJveV9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X25lc3RfbG9jaycgOjogb21wX3NldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdW5zZXRfbmVzdF9sb2NrJyA6OiBvbXBfdW5zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Rlc3RfbmVzdF9sb2NrJyA6OiBvbXBfdGVzdF9uZXN0X2xvY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfU1RBQ0tTSVpFJzo6a21wX3NldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX1NUQUNLU0laRV9TJzo6a21wX3NldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfQkxPQ0tUSU1FJzo6a21wX3NldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0xJQlJBUllfU0VSSUFMJzo6a21wX3NldF9saWJyYXJ5X3NlcmlhbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfTElCUkFSWV9UVVJOQVJPVU5EJzo6a21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0xJQlJBUllfVEhST1VHSFBVVCc6OmttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9MSUJSQVJZJzo6a21wX3NldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9TVEFDS1NJWkUnOjprbXBfZ2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfU1RBQ0tTSVpFX1MnOjprbXBfZ2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9CTE9DS1RJTUUnOjprbXBfZ2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfTElCUkFSWSc6OmttcF9nZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfQUZGSU5JVFknOjprbXBfc2V0X2FmZmluaXR5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9BRkZJTklUWSc6OmttcF9nZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX0FGRklOSVRZX01BWF9QUk9DJzo6a21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9DUkVBVEVfQUZGSU5JVFlfTUFTSyc6OmttcF9jcmVhdGVfYWZmaW5pdHlfbWFzaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9ERVNUUk9ZX0FGRklOSVRZX01BU0snOjprbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9BRkZJTklUWV9NQVNLX1BST0MnOjprbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9VTlNFVF9BRkZJTklUWV9NQVNLX1BST0MnOjprbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9BRkZJTklUWV9NQVNLX1BST0MnOjprbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9NQUxMT0MnOjprbXBfbWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0NBTExPQyc6OmttcF9jYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfUkVBTExPQyc6OmttcF9yZWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0ZSRUUnOjprbXBfZnJlZQorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9XQVJOSU5HU19PTic6OmttcF9zZXRfd2FybmluZ3Nfb24KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX1dBUk5JTkdTX09GRic6OmttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX0NBTkNFTExBVElPTl9TVEFUVVMnIDo6IGttcF9nZXRfY2FuY2VsbGF0aW9uX3N0YXR1cworCishZGVjJCAgIGVuZGlmCishZGVjJCBlbmRpZgorCishZGVjJCBpZiBkZWZpbmVkKF9fbGludXgpCisKKyEqKioKKyEqKiogVGhlIExpbnV4KiBPUyBlbnRyeSBwb2ludHMgYXJlIGluIGxvd2VyY2FzZSwgd2l0aCBhbiB1bmRlcnNjb3JlIGFwcGVuZGVkLgorISoqKgorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X251bV90aHJlYWRzXyc6Om9tcF9zZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfZHluYW1pY18nOjpvbXBfc2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbmVzdGVkXyc6Om9tcF9zZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X251bV90aHJlYWRzXyc6Om9tcF9nZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbWF4X3RocmVhZHNfJzo6b21wX2dldF9tYXhfdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF90aHJlYWRfbnVtXyc6Om9tcF9nZXRfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9udW1fcHJvY3NfJzo6b21wX2dldF9udW1fcHJvY3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9pbl9wYXJhbGxlbF8nOjpvbXBfaW5fcGFyYWxsZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfZHluYW1pY18nOjpvbXBfZ2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbmVzdGVkXyc6Om9tcF9nZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X3RocmVhZF9saW1pdF8nOjpvbXBfZ2V0X3RocmVhZF9saW1pdAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9tYXhfYWN0aXZlX2xldmVsc18nOjpvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzXyc6Om9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbGV2ZWxfJzo6b21wX2dldF9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9hY3RpdmVfbGV2ZWxfJzo6b21wX2dldF9hY3RpdmVfbGV2ZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bV8nOjpvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfdGVhbV9zaXplXyc6Om9tcF9nZXRfdGVhbV9zaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X3NjaGVkdWxlXyc6Om9tcF9zZXRfc2NoZWR1bGUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfc2NoZWR1bGVfJzo6b21wX2dldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9wcm9jX2JpbmRfJyA6OiBvbXBfZ2V0X3Byb2NfYmluZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF93dGltZV8nOjpvbXBfZ2V0X3d0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X3d0aWNrXyc6Om9tcF9nZXRfd3RpY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfZGVmYXVsdF9kZXZpY2VfJzo6b21wX2dldF9kZWZhdWx0X2RldmljZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9kZWZhdWx0X2RldmljZV8nOjpvbXBfc2V0X2RlZmF1bHRfZGV2aWNlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X251bV9kZXZpY2VzXyc6Om9tcF9nZXRfbnVtX2RldmljZXMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbnVtX3RlYW1zXyc6Om9tcF9nZXRfbnVtX3RlYW1zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X3RlYW1fbnVtXyc6Om9tcF9nZXRfdGVhbV9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfY2FuY2VsbGF0aW9uXyc6Om9tcF9nZXRfY2FuY2VsbGF0aW9uCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9pbml0X2xvY2tfJzo6b21wX2luaXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2Rlc3Ryb3lfbG9ja18nOjpvbXBfZGVzdHJveV9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X2xvY2tfJzo6b21wX3NldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdW5zZXRfbG9ja18nOjpvbXBfdW5zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Rlc3RfbG9ja18nOjpvbXBfdGVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfaW5pdF9uZXN0X2xvY2tfJzo6b21wX2luaXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZGVzdHJveV9uZXN0X2xvY2tfJzo6b21wX2Rlc3Ryb3lfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X25lc3RfbG9ja18nOjpvbXBfc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Vuc2V0X25lc3RfbG9ja18nOjpvbXBfdW5zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdGVzdF9uZXN0X2xvY2tfJzo6b21wX3Rlc3RfbmVzdF9sb2NrCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfc3RhY2tzaXplXyc6OmttcF9zZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X3N0YWNrc2l6ZV9zXyc6OmttcF9zZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfYmxvY2t0aW1lXyc6OmttcF9zZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2xpYnJhcnlfc2VyaWFsXyc6OmttcF9zZXRfbGlicmFyeV9zZXJpYWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kXyc6OmttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dF8nOjprbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9saWJyYXJ5Xyc6OmttcF9zZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2dldF9zdGFja3NpemVfJzo6a21wX2dldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfc3RhY2tzaXplX3NfJzo6a21wX2dldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2dldF9ibG9ja3RpbWVfJzo6a21wX2dldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfbGlicmFyeV8nOjprbXBfZ2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfYWZmaW5pdHlfJzo6a21wX3NldF9hZmZpbml0eQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2dldF9hZmZpbml0eV8nOjprbXBfZ2V0X2FmZmluaXR5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jXyc6OmttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9jcmVhdGVfYWZmaW5pdHlfbWFza18nOjprbXBfY3JlYXRlX2FmZmluaXR5X21hc2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9kZXN0cm95X2FmZmluaXR5X21hc2tfJzo6a21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2NfJzo6a21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2NfJzo6a21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2NfJzo6a21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9tYWxsb2NfJzo6a21wX21hbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2NhbGxvY18nOjprbXBfY2FsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfcmVhbGxvY18nOjprbXBfcmVhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2ZyZWVfJzo6a21wX2ZyZWUKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF93YXJuaW5nc19vbl8nOjprbXBfc2V0X3dhcm5pbmdzX29uCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X3dhcm5pbmdzX29mZl8nOjprbXBfc2V0X3dhcm5pbmdzX29mZgorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzXyc6OmttcF9nZXRfY2FuY2VsbGF0aW9uX3N0YXR1cworCishZGVjJCBlbmRpZgorCishZGVjJCBpZiBkZWZpbmVkKF9fQVBQTEVfXykKKworISoqKgorISoqKiBUaGUgTWFjIGVudHJ5IHBvaW50cyBhcmUgaW4gbG93ZXJjYXNlLCB3aXRoIGFuIGJvdGggYW4gdW5kZXJzY29yZQorISoqKiBhcHBlbmRlZCBhbmQgYW4gdW5kZXJzY29yZSBwcmVwZW5kZWQuCishKioqCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X251bV90aHJlYWRzXyc6Om9tcF9zZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X2R5bmFtaWNfJzo6b21wX3NldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9uZXN0ZWRfJzo6b21wX3NldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X251bV90aHJlYWRzXyc6Om9tcF9nZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X21heF90aHJlYWRzXyc6Om9tcF9nZXRfbWF4X3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X3RocmVhZF9udW1fJzo6b21wX2dldF90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9udW1fcHJvY3NfJzo6b21wX2dldF9udW1fcHJvY3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfaW5fcGFyYWxsZWxfJzo6b21wX2luX3BhcmFsbGVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9keW5hbWljXyc6Om9tcF9nZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbmVzdGVkXyc6Om9tcF9nZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF90aHJlYWRfbGltaXRfJzo6b21wX2dldF90aHJlYWRfbGltaXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzXyc6Om9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzXyc6Om9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X2xldmVsXyc6Om9tcF9nZXRfbGV2ZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X2FjdGl2ZV9sZXZlbF8nOjpvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bV8nOjpvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X3RlYW1fc2l6ZV8nOjpvbXBfZ2V0X3RlYW1fc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfc2NoZWR1bGVfJzo6b21wX3NldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfc2NoZWR1bGVfJzo6b21wX2dldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfcHJvY19iaW5kXycgOjogb21wX2dldF9wcm9jX2JpbmQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X3d0aW1lXyc6Om9tcF9nZXRfd3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X3d0aWNrXyc6Om9tcF9nZXRfd3RpY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X251bV90ZWFtc18nOjpvbXBfZ2V0X251bV90ZWFtcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfdGVhbV9udW1fJzo6b21wX2dldF90ZWFtX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfY2FuY2VsbGF0aW9uXyc6Om9tcF9nZXRfY2FuY2VsbGF0aW9uCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfaW5pdF9sb2NrXyc6Om9tcF9pbml0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZGVzdHJveV9sb2NrXyc6Om9tcF9kZXN0cm95X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X2xvY2tfJzo6b21wX3NldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Vuc2V0X2xvY2tfJzo6b21wX3Vuc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdGVzdF9sb2NrXyc6Om9tcF90ZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfaW5pdF9uZXN0X2xvY2tfJzo6b21wX2luaXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2Rlc3Ryb3lfbmVzdF9sb2NrXyc6Om9tcF9kZXN0cm95X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbmVzdF9sb2NrXyc6Om9tcF9zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Vuc2V0X25lc3RfbG9ja18nOjpvbXBfdW5zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Rlc3RfbmVzdF9sb2NrXyc6Om9tcF90ZXN0X25lc3RfbG9jaworCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9zdGFja3NpemVfJzo6a21wX3NldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X3N0YWNrc2l6ZV9zXyc6OmttcF9zZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2Jsb2NrdGltZV8nOjprbXBfc2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfbGlicmFyeV9zZXJpYWxfJzo6a21wX3NldF9saWJyYXJ5X3NlcmlhbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kXyc6OmttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXRfJzo6a21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2xpYnJhcnlfJzo6a21wX3NldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9zdGFja3NpemVfJzo6a21wX2dldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X3N0YWNrc2l6ZV9zXyc6OmttcF9nZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X2Jsb2NrdGltZV8nOjprbXBfZ2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfbGlicmFyeV8nOjprbXBfZ2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2FmZmluaXR5Xyc6OmttcF9zZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X2FmZmluaXR5Xyc6OmttcF9nZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jXyc6OmttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfY3JlYXRlX2FmZmluaXR5X21hc2tfJzo6a21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFza18nOjprbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2NfJzo6a21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jXyc6OmttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvY18nOjprbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9tYWxsb2NfJzo6a21wX21hbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9jYWxsb2NfJzo6a21wX2NhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9yZWFsbG9jXyc6OmttcF9yZWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2ZyZWVfJzo6a21wX2ZyZWUKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfd2FybmluZ3Nfb25fJzo6a21wX3NldF93YXJuaW5nc19vbgorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfd2FybmluZ3Nfb2ZmXyc6OmttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X2NhbmNlbGxhdGlvbl9zdGF0dXNfJzo6a21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzCisKKyFkZWMkIGVuZGlmCisKKyAgICAgIGVuZCBtb2R1bGUgb21wX2xpYgorCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9pbmNsdWRlLzQwL29tcF9saWIuZjkwLnZhciBiL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDAvb21wX2xpYi5mOTAudmFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3ODUzNTIKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9pbmNsdWRlLzQwL29tcF9saWIuZjkwLnZhcgpAQCAtMCwwICsxLDQ0MCBAQAorISBpbmNsdWRlLzQwL29tcF9saWIuZjkwLnZhcgorISAkUmV2aXNpb246IDQxNjc0ICQKKyEgJERhdGU6IDIwMTItMDYtMDUgMDg6MzM6MzUgLTA1MDAgKFR1ZSwgMDUgSnVuIDIwMTIpICQKKworIQorIS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCishLy8KKyEvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCishLy8KKyEvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCishLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCishLy8KKyEvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIQorCisgICAgICBtb2R1bGUgb21wX2xpYl9raW5kcworCisgICAgICAgIHVzZSwgaW50cmluc2ljIDo6IGlzb19jX2JpbmRpbmcKKworICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2ludGVnZXJfa2luZCAgICAgICA9IGNfaW50CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfbG9naWNhbF9raW5kICAgICAgID0gNAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX3JlYWxfa2luZCAgICAgICAgICA9IGNfZmxvYXQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF9kb3VibGVfa2luZCAgICAgICAgPSBjX2RvdWJsZQorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2xvY2tfa2luZCAgICAgICAgICA9IGNfaW50cHRyX3QKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9uZXN0X2xvY2tfa2luZCAgICAgPSBjX2ludHB0cl90CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfa2luZCAgICAgICAgID0gb21wX2ludGVnZXJfa2luZAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF9raW5kICAgICA9IG9tcF9pbnRlZ2VyX2tpbmQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF9wb2ludGVyX2tpbmQgICAgICAgPSBjX2ludHB0cl90CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfc2l6ZV90X2tpbmQgICAgICAgID0gY19zaXplX3QKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF9hZmZpbml0eV9tYXNrX2tpbmQgPSBjX2ludHB0cl90CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfY2FuY2VsX2tpbmQgICAgICAgID0gb21wX2ludGVnZXJfa2luZAorCisgICAgICBlbmQgbW9kdWxlIG9tcF9saWJfa2luZHMKKworICAgICAgbW9kdWxlIG9tcF9saWIKKworICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworCisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHBhcmFtZXRlciA6OiBvcGVubXBfdmVyc2lvbiAgICA9ICRPTVBfVkVSU0lPTgorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fbWFqb3IgPSAkS01QX1ZFUlNJT05fTUFKT1IKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX21pbm9yID0gJEtNUF9WRVJTSU9OX01JTk9SCisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9idWlsZCA9ICRLTVBfVkVSU0lPTl9CVUlMRAorICAgICAgICBjaGFyYWN0ZXIoKikgICAgICAgICAgICAgICBrbXBfYnVpbGRfZGF0ZQorICAgICAgICBwYXJhbWV0ZXIoIGttcF9idWlsZF9kYXRlID0gJyRLTVBfQlVJTERfREFURScgKQorCisgICAgICAgIGludGVnZXIoa2luZD1vbXBfc2NoZWRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfc3RhdGljICA9IDEKKyAgICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9keW5hbWljID0gMgorICAgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2d1aWRlZCAgPSAzCisgICAgICAgIGludGVnZXIoa2luZD1vbXBfc2NoZWRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfYXV0byAgICA9IDQKKworCisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3Byb2NfYmluZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9wcm9jX2JpbmRfZmFsc2UgPSAwCisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3Byb2NfYmluZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9wcm9jX2JpbmRfdHJ1ZSA9IDEKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF9tYXN0ZXIgPSAyCisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3Byb2NfYmluZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9wcm9jX2JpbmRfY2xvc2UgPSAzCisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3Byb2NfYmluZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9wcm9jX2JpbmRfc3ByZWFkID0gNAorCisgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2NhbmNlbF9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF9jYW5jZWxfcGFyYWxsZWwgPSAxCisgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2NhbmNlbF9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF9jYW5jZWxfbG9vcCA9IDIKKyAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfY2FuY2VsX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX2NhbmNlbF9zZWN0aW9ucyA9IDMKKyAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfY2FuY2VsX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX2NhbmNlbF90YXNrZ3JvdXAgPSA0CisKKyAgICAgICAgaW50ZXJmYWNlCisKKyEgICAgICAgICAqKioKKyEgICAgICAgICAqKiogb21wXyogZW50cnkgcG9pbnRzCishICAgICAgICAgKioqCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbnVtX3RocmVhZHMobnRocmVhZHMpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBudGhyZWFkcworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbnVtX3RocmVhZHMKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9keW5hbWljKGVuYWJsZSkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCksIHZhbHVlIDo6IGVuYWJsZQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfZHluYW1pYworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X25lc3RlZChlbmFibGUpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpLCB2YWx1ZSA6OiBlbmFibGUKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X25lc3RlZAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fdGhyZWFkcygpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX3RocmVhZHMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fdGhyZWFkcworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9tYXhfdGhyZWFkcygpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbWF4X3RocmVhZHMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9tYXhfdGhyZWFkcworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbnVtKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90aHJlYWRfbnVtCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX251bQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fcHJvY3MoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV9wcm9jcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV9wcm9jcworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2luX3BhcmFsbGVsKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2luX3BhcmFsbGVsCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9pbl9wYXJhbGxlbAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9keW5hbWljKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2dldF9keW5hbWljCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfZHluYW1pYworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9uZXN0ZWQoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfZ2V0X25lc3RlZAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X25lc3RlZAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbGltaXQoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RocmVhZF9saW1pdAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9saW1pdAorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzKG1heF9sZXZlbHMpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBtYXhfbGV2ZWxzCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9tYXhfYWN0aXZlX2xldmVscworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9tYXhfYWN0aXZlX2xldmVscygpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9tYXhfYWN0aXZlX2xldmVscworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9sZXZlbCgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbGV2ZWwKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9sZXZlbAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9hY3RpdmVfbGV2ZWwoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtKGxldmVsKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IGxldmVsCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF90ZWFtX3NpemUobGV2ZWwpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfdGVhbV9zaXplCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBsZXZlbAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RlYW1fc2l6ZQorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X3NjaGVkdWxlKGtpbmQsIG1vZGlmaWVyKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfc2NoZWRfa2luZCksIHZhbHVlIDo6IGtpbmQKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IG1vZGlmaWVyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9zY2hlZHVsZQorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfZ2V0X3NjaGVkdWxlKGtpbmQsIG1vZGlmaWVyKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfc2NoZWRfa2luZCkga2luZAorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBtb2RpZmllcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9nZXRfc2NoZWR1bGUKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfcHJvY19iaW5kKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3Byb2NfYmluZF9raW5kKSBvbXBfZ2V0X3Byb2NfYmluZAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3Byb2NfYmluZAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF93dGltZSgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICByZWFsIChraW5kPWttcF9kb3VibGVfa2luZCkgb21wX2dldF93dGltZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3d0aW1lCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3d0aWNrKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIHJlYWwgKGtpbmQ9a21wX2RvdWJsZV9raW5kKSBvbXBfZ2V0X3d0aWNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfd3RpY2sKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfZGVmYXVsdF9kZXZpY2UoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfZGVmYXVsdF9kZXZpY2UKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9kZWZhdWx0X2RldmljZShkZmx0X2RldmljZSkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IGRmbHRfZGV2aWNlCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9kZWZhdWx0X2RldmljZQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fZGV2aWNlcygpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX2RldmljZXMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fZGV2aWNlcworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fdGVhbXMoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV90ZWFtcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV90ZWFtcworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF90ZWFtX251bSgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfdGVhbV9udW0KKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF90ZWFtX251bQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9jYW5jZWxsYXRpb24oKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2NhbmNlbGxhdGlvbgorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2NhbmNlbGxhdGlvbgorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfaW5pdF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF9pbml0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2luaXRfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfZGVzdHJveV9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF9kZXN0cm95X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X2xvY2sobG9ja3ZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3NldF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfdW5zZXRfbG9jayhsb2NrdmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfdW5zZXRfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfdW5zZXRfbG9jaworCisgICAgICAgICAgZnVuY3Rpb24gb21wX3Rlc3RfbG9jayhsb2NrdmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfdGVzdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX3Rlc3RfbG9jaworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF90ZXN0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2luaXRfbmVzdF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF9pbml0X25lc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9pbml0X25lc3RfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfZGVzdHJveV9uZXN0X2xvY2sobG9ja3ZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX2Rlc3Ryb3lfbmVzdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF9zZXRfbmVzdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3Vuc2V0X25lc3RfbG9jayhsb2NrdmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfdW5zZXRfbmVzdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3Vuc2V0X25lc3RfbG9jaworCisgICAgICAgICAgZnVuY3Rpb24gb21wX3Rlc3RfbmVzdF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF90ZXN0X25lc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF90ZXN0X25lc3RfbG9jaworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX3Rlc3RfbmVzdF9sb2NrCisKKyEgICAgICAgICAqKioKKyEgICAgICAgICAqKioga21wXyogZW50cnkgcG9pbnRzCishICAgICAgICAgKioqCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplKHNpemUpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBzaXplCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemUKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemVfcyhzaXplKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBzaXplCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemVfcworCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2Jsb2NrdGltZShtc2VjKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbXNlYworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfYmxvY2t0aW1lCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV9zZXJpYWwoKSBiaW5kKGMpCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3NlcmlhbAorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZCgpIGJpbmQoYykKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZAorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dCgpIGJpbmQoYykKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dAorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnkobGlibnVtKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbGlibnVtCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5CisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfZGVmYXVsdHMoc3RyaW5nKSBiaW5kKGMpCisgICAgICAgICAgICB1c2UsIGludHJpbnNpYyA6OiBpc29fY19iaW5kaW5nCisgICAgICAgICAgICBjaGFyYWN0ZXIgKGtpbmQ9Y19jaGFyKSA6OiBzdHJpbmcoKikKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2RlZmF1bHRzCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZSgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfc3RhY2tzaXplCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZV9zKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBrbXBfZ2V0X3N0YWNrc2l6ZV9zCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplX3MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYmxvY2t0aW1lKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9ibG9ja3RpbWUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9ibG9ja3RpbWUKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfbGlicmFyeSgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfbGlicmFyeQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2xpYnJhcnkKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHkobWFzaykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX3NldF9hZmZpbml0eQorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHkKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHkobWFzaykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9hZmZpbml0eQorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHkKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrKG1hc2spIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfY3JlYXRlX2FmZmluaXR5X21hc2sKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzayhtYXNrKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzaworCisgICAgICAgICAgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MocHJvYywgbWFzaykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IHByb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYyhwcm9jLCBtYXNrKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBwcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MocHJvYywgbWFzaykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IHByb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX21hbGxvYyhzaXplKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfbWFsbG9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCksIHZhbHVlIDo6IHNpemUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX21hbGxvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX2NhbGxvYyhuZWxlbSwgZWxzaXplKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfY2FsbG9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCksIHZhbHVlIDo6IG5lbGVtCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCksIHZhbHVlIDo6IGVsc2l6ZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfY2FsbG9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfcmVhbGxvYyhwdHIsIHNpemUpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGttcF9yZWFsbG9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpLCB2YWx1ZSA6OiBwdHIKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSwgdmFsdWUgOjogc2l6ZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfcmVhbGxvYworCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfZnJlZShwdHIpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpLCB2YWx1ZSA6OiBwdHIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfZnJlZQorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29uKCkgYmluZChjKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb24KKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vZmYoKSBiaW5kKGMpCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vZmYKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfY2FuY2VsbGF0aW9uX3N0YXR1cyhjYW5jZWxraW5kKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfY2FuY2VsX2tpbmQpLCB2YWx1ZSA6OiBjYW5jZWxraW5kCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIGttcF9nZXRfY2FuY2VsbGF0aW9uX3N0YXR1cworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2NhbmNlbGxhdGlvbl9zdGF0dXMKKworICAgICAgICBlbmQgaW50ZXJmYWNlCisKKyAgICAgIGVuZCBtb2R1bGUgb21wX2xpYgpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS80MC9vbXBfbGliLmgudmFyIGIvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS80MC9vbXBfbGliLmgudmFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNzQ4ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9pbmNsdWRlLzQwL29tcF9saWIuaC52YXIKQEAgLTAsMCArMSw1NDYgQEAKKyEgaW5jbHVkZS80MC9vbXBfbGliLmgudmFyCishICRSZXZpc2lvbjogNDE2NzQgJAorISAkRGF0ZTogMjAxMi0wNi0wNSAwODozMzozNSAtMDUwMCAoVHVlLCAwNSBKdW4gMjAxMikgJAorCishCishLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyEvLworIS8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyEvLworIS8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyEvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyEvLworIS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCishCisKKyEqKioKKyEqKiogU29tZSBvZiB0aGUgZGlyZWN0aXZlcyBmb3IgdGhlIGZvbGxvd2luZyByb3V0aW5lIGV4dGVuZCBwYXN0IGNvbHVtbiA3MiwKKyEqKiogc28gcHJvY2VzcyB0aGlzIGZpbGUgaW4gMTMyLWNvbHVtbiBtb2RlLgorISoqKgorCishRElSJCBmaXhlZGZvcm1saW5lc2l6ZToxMzIKKworICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9pbnRlZ2VyX2tpbmQgICAgICAgPSA0CisgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2xvZ2ljYWxfa2luZCAgICAgICA9IDQKKyAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfcmVhbF9raW5kICAgICAgICAgID0gNAorICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9sb2NrX2tpbmQgICAgICAgICAgPSBpbnRfcHRyX2tpbmQoKQorICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9uZXN0X2xvY2tfa2luZCAgICAgPSBpbnRfcHRyX2tpbmQoKQorICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9raW5kICAgICAgICAgPSBvbXBfaW50ZWdlcl9raW5kCisgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF9raW5kICAgICA9IG9tcF9pbnRlZ2VyX2tpbmQKKyAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfcG9pbnRlcl9raW5kICAgICAgID0gaW50X3B0cl9raW5kKCkKKyAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfc2l6ZV90X2tpbmQgICAgICAgID0gaW50X3B0cl9raW5kKCkKKyAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfYWZmaW5pdHlfbWFza19raW5kID0gaW50X3B0cl9raW5kKCkKKworICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IG9wZW5tcF92ZXJzaW9uICAgID0gJE9NUF9WRVJTSU9OCisgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fbWFqb3IgPSAkS01QX1ZFUlNJT05fTUFKT1IKKyAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9taW5vciA9ICRLTVBfVkVSU0lPTl9NSU5PUgorICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX2J1aWxkID0gJEtNUF9WRVJTSU9OX0JVSUxECisgICAgICBjaGFyYWN0ZXIoKikgICAgICAgICAgICAgICBrbXBfYnVpbGRfZGF0ZQorICAgICAgcGFyYW1ldGVyKCBrbXBfYnVpbGRfZGF0ZSA9ICckS01QX0JVSUxEX0RBVEUnICkKKworICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9zdGF0aWMgID0gMQorICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9keW5hbWljID0gMgorICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9ndWlkZWQgID0gMworICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9hdXRvICAgID0gNAorCisgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX2ZhbHNlID0gMAorICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF90cnVlID0gMQorICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF9tYXN0ZXIgPSAyCisgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX2Nsb3NlID0gMworICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF9zcHJlYWQgPSA0CisKKyAgICAgIGludGVyZmFjZQorCishICAgICAgICoqKgorISAgICAgICAqKiogb21wXyogZW50cnkgcG9pbnRzCishICAgICAgICoqKgorCisgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9udW1fdGhyZWFkcyhudGhyZWFkcykgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IG50aHJlYWRzCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbnVtX3RocmVhZHMKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfZHluYW1pYyhlbmFibGUpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpLCB2YWx1ZSA6OiBlbmFibGUKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9keW5hbWljCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X25lc3RlZChlbmFibGUpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpLCB2YWx1ZSA6OiBlbmFibGUKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0ZWQKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X251bV90aHJlYWRzKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fdGhyZWFkcworICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fdGhyZWFkcworCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X3RocmVhZHMoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X21heF90aHJlYWRzCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X21heF90aHJlYWRzCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbnVtKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90aHJlYWRfbnVtCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9udW0KKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X251bV9wcm9jcygpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX3Byb2NzCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV9wcm9jcworCisgICAgICAgIGZ1bmN0aW9uIG9tcF9pbl9wYXJhbGxlbCgpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9pbl9wYXJhbGxlbAorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2luX3BhcmFsbGVsCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9keW5hbWljKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2dldF9keW5hbWljCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2R5bmFtaWMKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X25lc3RlZCgpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9nZXRfbmVzdGVkCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X25lc3RlZAorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX2xpbWl0KCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90aHJlYWRfbGltaXQKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX2xpbWl0CisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzKG1heF9sZXZlbHMpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBtYXhfbGV2ZWxzCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9tYXhfYWN0aXZlX2xldmVscworICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9tYXhfYWN0aXZlX2xldmVscworCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbGV2ZWwoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2xldmVsCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2xldmVsCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9hY3RpdmVfbGV2ZWwoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9hY3RpdmVfbGV2ZWwKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0obGV2ZWwpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IGxldmVsCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RlYW1fc2l6ZShsZXZlbCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90ZWFtX3NpemUKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBsZXZlbAorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF90ZWFtX3NpemUKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfc2NoZWR1bGUoa2luZCwgbW9kaWZpZXIpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9zY2hlZF9raW5kKSwgdmFsdWUgOjoga2luZAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IG1vZGlmaWVyCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfc2NoZWR1bGUKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9nZXRfc2NoZWR1bGUoa2luZCwgbW9kaWZpZXIpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9zY2hlZF9raW5kKSBraW5kCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBtb2RpZmllcgorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfZ2V0X3NjaGVkdWxlCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9wcm9jX2JpbmQoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpIG9tcF9nZXRfcHJvY19iaW5kCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3Byb2NfYmluZAorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfd3RpbWUoKSBiaW5kKGMpCisgICAgICAgICAgZG91YmxlIHByZWNpc2lvbiBvbXBfZ2V0X3d0aW1lCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3d0aW1lCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF93dGljaygpIGJpbmQoYykKKyAgICAgICAgICBkb3VibGUgcHJlY2lzaW9uIG9tcF9nZXRfd3RpY2sKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfd3RpY2sKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9kZWZhdWx0X2RldmljZQorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9kZWZhdWx0X2RldmljZQorCisgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9kZWZhdWx0X2RldmljZShkZmx0X2RldmljZSkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IGRmbHRfZGV2aWNlCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfZGVmYXVsdF9kZXZpY2UKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X251bV9kZXZpY2VzKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fZGV2aWNlcworICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fZGV2aWNlcworCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3RlYW1zKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fdGVhbXMKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3RlYW1zCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF90ZWFtX251bSgpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfdGVhbV9udW0KKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGVhbV9udW0KKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9pbml0X2xvY2sobG9ja3ZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX2luaXRfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2luaXRfbG9jaworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbG9jayhsb2NrdmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfZGVzdHJveV9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfZGVzdHJveV9sb2NrCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X2xvY2sobG9ja3ZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3NldF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X2xvY2sKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF91bnNldF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF91bnNldF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfdW5zZXRfbG9jaworCisgICAgICAgIGZ1bmN0aW9uIG9tcF90ZXN0X2xvY2sobG9ja3ZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3Rlc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF90ZXN0X2xvY2sKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF90ZXN0X2xvY2sKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9pbml0X25lc3RfbG9jayhsb2NrdmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfaW5pdF9uZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2luaXRfbmVzdF9sb2NrCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfZGVzdHJveV9uZXN0X2xvY2sobG9ja3ZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX2Rlc3Ryb3lfbmVzdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X25lc3RfbG9jaworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0X2xvY2sobG9ja3ZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3NldF9uZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0X2xvY2sKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF91bnNldF9uZXN0X2xvY2sobG9ja3ZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3Vuc2V0X25lc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfdW5zZXRfbmVzdF9sb2NrCisKKyAgICAgICAgZnVuY3Rpb24gb21wX3Rlc3RfbmVzdF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF90ZXN0X25lc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF90ZXN0X25lc3RfbG9jaworICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfdGVzdF9uZXN0X2xvY2sKKworISAgICAgICAqKioKKyEgICAgICAgKioqIGttcF8qIGVudHJ5IHBvaW50cworISAgICAgICAqKioKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplKHNpemUpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBzaXplCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZV9zKHNpemUpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCksIHZhbHVlIDo6IHNpemUKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemVfcworCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9ibG9ja3RpbWUobXNlYykgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IG1zZWMKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9ibG9ja3RpbWUKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV9zZXJpYWwoKSBiaW5kKGMpCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV9zZXJpYWwKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kKCkgYmluZChjKQorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZAorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQoKSBiaW5kKGMpCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnkobGlibnVtKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbGlibnVtCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeQorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9kZWZhdWx0cyhzdHJpbmcpIGJpbmQoYykKKyAgICAgICAgICBjaGFyYWN0ZXIgc3RyaW5nKCopCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfZGVmYXVsdHMKKworICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZSgpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfc3RhY2tzaXplCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZQorCisgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplX3MoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIGttcF9nZXRfc3RhY2tzaXplX3MKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplX3MKKworICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2Jsb2NrdGltZSgpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYmxvY2t0aW1lCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2Jsb2NrdGltZQorCisgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfbGlicmFyeSgpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfbGlicmFyeQorICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9saWJyYXJ5CisKKyAgICAgICAgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eShtYXNrKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfc2V0X2FmZmluaXR5CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5CisKKyAgICAgICAgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eShtYXNrKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2FmZmluaXR5CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5CisKKyAgICAgICAgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYygpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFzayhtYXNrKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFzaworCisgICAgICAgIHN1YnJvdXRpbmUga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzayhtYXNrKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2sKKworICAgICAgICBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYyhwcm9jLCBtYXNrKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IHByb2MKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCisKKyAgICAgICAgZnVuY3Rpb24ga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYyhwcm9jLCBtYXNrKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogcHJvYworICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworCisgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jKHByb2MsIG1hc2spIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogcHJvYworICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKworICAgICAgICBmdW5jdGlvbiBrbXBfbWFsbG9jKHNpemUpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGttcF9tYWxsb2MKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCksIHZhbHVlIDo6IHNpemUKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9tYWxsb2MKKworICAgICAgICBmdW5jdGlvbiBrbXBfY2FsbG9jKG5lbGVtLCBlbHNpemUpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGttcF9jYWxsb2MKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCksIHZhbHVlIDo6IG5lbGVtCisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBlbHNpemUKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9jYWxsb2MKKworICAgICAgICBmdW5jdGlvbiBrbXBfcmVhbGxvYyhwdHIsIHNpemUpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGttcF9yZWFsbG9jCisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSwgdmFsdWUgOjogcHRyCisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBzaXplCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfcmVhbGxvYworCisgICAgICAgIHN1YnJvdXRpbmUga21wX2ZyZWUocHRyKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSwgdmFsdWUgOjogcHRyCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9mcmVlCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29uKCkgYmluZChjKQorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29uCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29mZigpIGJpbmQoYykKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vZmYKKworICAgICAgZW5kIGludGVyZmFjZQorCishRElSJCBJRiBERUZJTkVEIChfX0lOVEVMX09GRkxPQUQpCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9zZXRfbnVtX3RocmVhZHMKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX3NldF9keW5hbWljCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9zZXRfbmVzdGVkCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfbnVtX3RocmVhZHMKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF9tYXhfdGhyZWFkcworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X3RocmVhZF9udW0KKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF9udW1fcHJvY3MKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2luX3BhcmFsbGVsCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfZHluYW1pYworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X25lc3RlZAorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X3RocmVhZF9saW1pdAorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF9sZXZlbAorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF90ZWFtX3NpemUKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX3NldF9zY2hlZHVsZQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X3NjaGVkdWxlCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfcHJvY19iaW5kCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfd3RpbWUKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF93dGljaworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9zZXRfZGVmYXVsdF9kZXZpY2UKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF9udW1fZGV2aWNlcworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X251bV90ZWFtcworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X3RlYW1fbnVtCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9pbml0X2xvY2sKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2Rlc3Ryb3lfbG9jaworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfc2V0X2xvY2sKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX3Vuc2V0X2xvY2sKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX3Rlc3RfbG9jaworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfaW5pdF9uZXN0X2xvY2sKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2Rlc3Ryb3lfbmVzdF9sb2NrCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9zZXRfbmVzdF9sb2NrCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF91bnNldF9uZXN0X2xvY2sKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX3Rlc3RfbmVzdF9sb2NrCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9zZXRfc3RhY2tzaXplCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9zZXRfc3RhY2tzaXplX3MKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX3NldF9ibG9ja3RpbWUKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX3NldF9saWJyYXJ5X3NlcmlhbAorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZAorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dAorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfc2V0X2xpYnJhcnkKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX3NldF9kZWZhdWx0cworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfZ2V0X3N0YWNrc2l6ZQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfZ2V0X3N0YWNrc2l6ZV9zCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9nZXRfYmxvY2t0aW1lCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9nZXRfbGlicmFyeQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfc2V0X2FmZmluaXR5CishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9nZXRfYWZmaW5pdHkKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfY3JlYXRlX2FmZmluaXR5X21hc2sKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzaworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9tYWxsb2MKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX2NhbGxvYworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfcmVhbGxvYworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfZnJlZQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfc2V0X3dhcm5pbmdzX29uCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9zZXRfbnVtX3RocmVhZHMgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX3NldF9keW5hbWljICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9zZXRfbmVzdGVkICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfbnVtX3RocmVhZHMgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF9tYXhfdGhyZWFkcyApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X3RocmVhZF9udW0gKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF9udW1fcHJvY3MgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2luX3BhcmFsbGVsICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfZHluYW1pYyApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X25lc3RlZCApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X3RocmVhZF9saW1pdCApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF9sZXZlbCApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X2FjdGl2ZV9sZXZlbCApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0gKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF90ZWFtX3NpemUgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX3NldF9zY2hlZHVsZSApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X3NjaGVkdWxlICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfcHJvY19iaW5kICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfd3RpbWUgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF93dGljayApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9zZXRfZGVmYXVsdF9kZXZpY2UgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF9udW1fZGV2aWNlcyApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X251bV90ZWFtcyApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X3RlYW1fbnVtICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9pbml0X2xvY2sgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2Rlc3Ryb3lfbG9jayApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfc2V0X2xvY2sgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX3Vuc2V0X2xvY2sgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX3Rlc3RfbG9jayApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfaW5pdF9uZXN0X2xvY2sgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2Rlc3Ryb3lfbmVzdF9sb2NrICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9zZXRfbmVzdF9sb2NrICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF91bnNldF9uZXN0X2xvY2sgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX3Rlc3RfbmVzdF9sb2NrICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9zZXRfc3RhY2tzaXplICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9zZXRfc3RhY2tzaXplX3MgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX3NldF9ibG9ja3RpbWUgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX3NldF9saWJyYXJ5X3NlcmlhbCApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZCApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dCApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfc2V0X2xpYnJhcnkgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX3NldF9kZWZhdWx0cyApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfZ2V0X3N0YWNrc2l6ZSApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfZ2V0X3N0YWNrc2l6ZV9zICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9nZXRfYmxvY2t0aW1lICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9nZXRfbGlicmFyeSApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfc2V0X2FmZmluaXR5ICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9nZXRfYWZmaW5pdHkgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX2dldF9hZmZpbml0eV9tYXhfcHJvYyApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfY3JlYXRlX2FmZmluaXR5X21hc2sgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzayApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYyApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9tYWxsb2MgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX2NhbGxvYyApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfcmVhbGxvYyApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfZnJlZSApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfc2V0X3dhcm5pbmdzX29uICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9zZXRfd2FybmluZ3Nfb2ZmICkKKyFESVIkIEVORElGCishRElSJCBFTkRJRgorCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXAuaCBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzZWNiMTUKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXAuaApAQCAtMCwwICsxLDMzODQgQEAKKy8qISBcZmlsZSAqLworLyoKKyAqIGttcC5oIC0tIEtQVFMgcnVudGltZSBoZWFkZXIgZmlsZS4KKyAqICRSZXZpc2lvbjogNDM0NzMgJAorICogJERhdGU6IDIwMTQtMDktMjYgMTU6MDI6NTcgLTA1MDAgKEZyaSwgMjYgU2VwIDIwMTQpICQKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBLTVBfSAorI2RlZmluZSBLTVBfSAorCisvKiAjZGVmaW5lIEJVSUxEX1BBUkFMTEVMX09SREVSRUQgMSAqLworCisvKiBUaGlzIGZpeCByZXBsYWNlcyBnZXR0aW1lb2ZkYXkgd2l0aCBjbG9ja19nZXR0aW1lIGZvciBiZXR0ZXIgc2NhbGFiaWxpdHkgb24KKyAgIHRoZSBBbHRpeC4gIFJlcXVpcmVzIHVzZXIgY29kZSB0byBiZSBsaW5rZWQgd2l0aCAtbHJ0LgorKi8KKy8vI2RlZmluZSBGSVhfU0dJX0NMT0NLCisKKy8qIERlZmluZXMgZm9yIE9wZW5NUCAzLjAgdGFza2luZyBhbmQgYXV0byBzY2hlZHVsaW5nICovCisKKyMgaWZuZGVmIEtNUF9TVEFUSUNfU1RFQUxfRU5BQkxFRAorIyAgZGVmaW5lIEtNUF9TVEFUSUNfU1RFQUxfRU5BQkxFRCAxCisjIGVuZGlmCisKKyNkZWZpbmUgVEFTS19DVVJSRU5UX05PVF9RVUVVRUQgIDAKKyNkZWZpbmUgVEFTS19DVVJSRU5UX1FVRVVFRCAgICAgIDEKKworI2RlZmluZSBUQVNLX0RFUVVFX0JJVFMgICAgICAgICAgOCAgLy8gVXNlZCBzb2xlbHkgdG8gZGVmaW5lIFRBU0tfREVRVUVfU0laRSBhbmQgVEFTS19ERVFVRV9NQVNLLgorI2RlZmluZSBUQVNLX0RFUVVFX1NJWkUgICAgICAgICAgKCAxIDw8IFRBU0tfREVRVUVfQklUUyApCisjZGVmaW5lIFRBU0tfREVRVUVfTUFTSyAgICAgICAgICAoIFRBU0tfREVRVUVfU0laRSAtIDEgKQorCisjaWZkZWYgQlVJTERfVElFRF9UQVNLX1NUQUNLCisjZGVmaW5lIFRBU0tfU1RBQ0tfRU1QVFkgICAgICAgICAwICAvLyBlbnRyaWVzIHdoZW4gdGhlIHN0YWNrIGlzIGVtcHR5CisKKyNkZWZpbmUgVEFTS19TVEFDS19CTE9DS19CSVRTICAgIDUgIC8vIFVzZWQgdG8gZGVmaW5lIFRBU0tfU1RBQ0tfU0laRSBhbmQgVEFTS19TVEFDS19NQVNLCisjZGVmaW5lIFRBU0tfU1RBQ0tfQkxPQ0tfU0laRSAgICAoIDEgPDwgVEFTS19TVEFDS19CTE9DS19CSVRTICkgLy8gTnVtYmVyIG9mIGVudHJpZXMgaW4gZWFjaCB0YXNrIHN0YWNrIGFycmF5CisjZGVmaW5lIFRBU0tfU1RBQ0tfSU5ERVhfTUFTSyAgICAoIFRBU0tfU1RBQ0tfQkxPQ0tfU0laRSAtIDEgKSAgLy8gTWFzayBmb3IgZGV0ZXJtaW5pbmcgaW5kZXggaW50byBzdGFjayBibG9jaworI2VuZGlmIC8vIEJVSUxEX1RJRURfVEFTS19TVEFDSworCisjZGVmaW5lIFRBU0tfTk9UX1BVU0hFRCAgICAgICAgICAxCisjZGVmaW5lIFRBU0tfU1VDQ0VTU0ZVTExZX1BVU0hFRCAwCisjZGVmaW5lIFRBU0tfVElFRCAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFRBU0tfVU5USUVEICAgICAgICAgICAgICAwCisjZGVmaW5lIFRBU0tfRVhQTElDSVQgICAgICAgICAgICAxCisjZGVmaW5lIFRBU0tfSU1QTElDSVQgICAgICAgICAgICAwCisKKyNkZWZpbmUgS01QX0NBTkNFTF9USFJFQURTCisjZGVmaW5lIEtNUF9USFJFQURfQVRUUgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKy8qICBpbmNsdWRlIDxjdHlwZS5oPiBkb24ndCB1c2U7IHByb2JsZW1zIHdpdGggL01EIG9uIFdpbmRvd3MqIE9TIE5UIGR1ZSB0byBiYWQgTWljcm9zb2Z0IGxpYnJhcnkgICovCisvKiAgc29tZSBtYWNyb3MgcHJvdmlkZWQgYmVsb3cgdG8gcmVwbGFjZSBzb21lIG9mIHRoZXNlIGZ1bmN0aW9ucyAgKi8KKyNpZm5kZWYgX19BQlNPRlRfV0lOCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisKKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSAia21wX29zLmgiCisKKyNpZiBLTVBfU1RBVFNfRU5BQkxFRAorY2xhc3Mga21wX3N0YXRzX2xpc3Q7CisjZW5kaWYKKworI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKyNpbmNsdWRlIDx4bW1pbnRyaW4uaD4KKyNlbmRpZgorCisjaW5jbHVkZSAia21wX3ZlcnNpb24uaCIKKyNpbmNsdWRlICJrbXBfZGVidWcuaCIKKyNpbmNsdWRlICJrbXBfbG9jay5oIgorI2luY2x1ZGUgImttcF9pMThuLmgiCisKKyNkZWZpbmUgS01QX0hBTkRMRV9TSUdOQUxTIChLTVBfT1NfTElOVVggfHwgS01QX09TX0ZSRUVCU0QgfHwgS01QX09TX1dJTkRPV1MgfHwgS01QX09TX0RBUldJTikKKworI2lmZGVmIEtNUF9TRVRWRVJTSU9OCisvKiAgZnJvbSBmYWN0b3J5L0luY2x1ZGUsIHRvIGdldCBWRVJTSU9OX1NUUklORyBlbWJlZGRlZCBmb3IgJ3doYXQnICAqLworI2luY2x1ZGUgImthaWNvbmZpZy5oIgorI2luY2x1ZGUgImV5ZS5oIgorI2luY2x1ZGUgIm93bi5oIgorI2luY2x1ZGUgInNldHZlcnNpb24uaCIKKyNlbmRpZgorCisjaW5jbHVkZSAia21wX3dyYXBwZXJfbWFsbG9jLmgiCisjaWYgS01QX09TX1VOSVgKKyMgaW5jbHVkZSA8dW5pc3RkLmg+CisjIGlmICFkZWZpbmVkIE5TSUcgJiYgZGVmaW5lZCBfTlNJRworIyAgZGVmaW5lIE5TSUcgX05TSUcKKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgS01QX09TX0xJTlVYCisjIHByYWdtYSB3ZWFrIGNsb2NrX2dldHRpbWUKKyNlbmRpZgorCisvKlNlbGVjdCBkYXRhIHBsYWNlbWVudCBpbiBOVU1BIG1lbW9yeSAqLworI2RlZmluZSBOT19GSVJTVF9UT1VDSCAwCisjZGVmaW5lIEZJUlNUX1RPVUNIIDEgICAgICAgLyogRXhwbG9pdCBTR0kncyBmaXJzdCB0b3VjaCBwYWdlIHBsYWNlbWVudCBhbGdvICovCisKKy8qIElmIG5vdCBzcGVjaWZpZWQgb24gY29tcGlsZSBjb21tYW5kIGxpbmUsIGFzc3VtZSBubyBmaXJzdCB0b3VjaCAqLworI2lmbmRlZiBCVUlMRF9NRU1PUlkKKyNkZWZpbmUgQlVJTERfTUVNT1JZIE5PX0ZJUlNUX1RPVUNICisjZW5kaWYKKworLy8gMCAtIG5vIGZhc3QgbWVtb3J5IGFsbG9jYXRpb24sIGFsaWdubWVudDogOC1ieXRlIG9uIHg4NiwgMTYtYnl0ZSBvbiB4NjQuCisvLyAzIC0gZmFzdCBhbGxvY2F0aW9uIHVzaW5nIHN5bmMsIG5vbi1zeW5jIGZyZWUgbGlzdHMgb2YgYW55IHNpemUsIG5vbi1zZWxmIGZyZWUgbGlzdHMgb2YgbGltaXRlZCBzaXplLgorI2lmbmRlZiBVU0VfRkFTVF9NRU1PUlkKKyNkZWZpbmUgVVNFX0ZBU1RfTUVNT1JZIDMKKyNlbmRpZgorCisjaWZuZGVmIEtNUF9ORVNURURfSE9UX1RFQU1TCisjIGRlZmluZSBLTVBfTkVTVEVEX0hPVF9URUFNUyAwCisjIGRlZmluZSBVU0VfTkVTVEVEX0hPVF9BUkcoeCkKKyNlbHNlCisjIGlmIEtNUF9ORVNURURfSE9UX1RFQU1TCisjICBpZiBPTVBfNDBfRU5BQkxFRAorIyAgIGRlZmluZSBVU0VfTkVTVEVEX0hPVF9BUkcoeCkgLHgKKyMgIGVsc2UKKy8vIE5lc3RlZCBob3QgdGVhbXMgZmVhdHVyZSBkZXBlbmRzIG9uIG9tcCA0LjAsIGRpc2FibGUgaXQgZm9yIGVhcmxpZXIgdmVyc2lvbnMKKyMgICB1bmRlZiBLTVBfTkVTVEVEX0hPVF9URUFNUworIyAgIGRlZmluZSBLTVBfTkVTVEVEX0hPVF9URUFNUyAwCisjICAgZGVmaW5lIFVTRV9ORVNURURfSE9UX0FSRyh4KQorIyAgZW5kaWYKKyMgZWxzZQorIyAgZGVmaW5lIFVTRV9ORVNURURfSE9UX0FSRyh4KQorIyBlbmRpZgorI2VuZGlmCisKKy8vIEFzc3VtZSB1c2luZyBCR0VUIGNvbXBhcmVfZXhjaGFuZ2UgaW5zdHJ1Y3Rpb24gaW5zdGVhZCBvZiBsb2NrIGJ5IGRlZmF1bHQuCisjaWZuZGVmIFVTRV9DTVBfWENIR19GT1JfQkdFVAorI2RlZmluZSBVU0VfQ01QX1hDSEdfRk9SX0JHRVQgMQorI2VuZGlmCisKKy8vIFRlc3QgdG8gc2VlIGlmIHF1ZXVpbmcgbG9jayBpcyBiZXR0ZXIgdGhhbiBib290c3RyYXAgbG9jayBmb3IgYmdldAorLy8gI2lmbmRlZiBVU0VfUVVFVUlOR19MT0NLX0ZPUl9CR0VUCisvLyAjZGVmaW5lIFVTRV9RVUVVSU5HX0xPQ0tfRk9SX0JHRVQKKy8vICNlbmRpZgorCisjaWZuZGVmIE5TRUNfUEVSX1NFQworIyBkZWZpbmUgTlNFQ19QRVJfU0VDIDEwMDAwMDAwMDBMCisjZW5kaWYKKworI2lmbmRlZiBVU0VDX1BFUl9TRUMKKyMgZGVmaW5lIFVTRUNfUEVSX1NFQyAxMDAwMDAwTAorI2VuZGlmCisKKy8vIEZvciBlcnJvciBtZXNzYWdlcworI2RlZmluZSBLTVBfSU9NUF9OQU1FICAgICAgICJJbnRlbChSKSBPTVAiCisKKy8qIQorQGluZ3JvdXAgQkFTSUNfVFlQRVMKK0B7CisqLworCisvLyBGSVhNRSBET1hZR0VOLi4uIG5lZWQgdG8gZ3JvdXAgdGhlc2UgZmxhZ3Mgc29tZWhvdyAoTWFraW5nIHRoZW0gYW4gYW5vbnltb3VzIGVudW0gd291bGQgZG8gaXQuLi4pCisvKiEKK1ZhbHVlcyBmb3IgYml0IGZsYWdzIHVzZWQgaW4gdGhlIGlkZW50X3QgdG8gZGVzY3JpYmUgdGhlIGZpZWxkcy4KKyovCisvKiEgVXNlIHRyYW1wb2xpbmUgZm9yIGludGVybmFsIG1pY3JvdGFza3MgKi8KKyNkZWZpbmUgS01QX0lERU5UX0lNQiAgICAgICAgICAgICAweDAxCisvKiEgVXNlIGMtc3R5bGUgaWRlbnQgc3RydWN0dXJlICovCisjZGVmaW5lIEtNUF9JREVOVF9LTVBDICAgICAgICAgICAgMHgwMgorLyogMHgwNCBpcyBubyBsb25nZXIgdXNlZCAqLworLyohIEVudHJ5IHBvaW50IGdlbmVyYXRlZCBieSBhdXRvLXBhcmFsbGVsaXphdGlvbiAqLworI2RlZmluZSBLTVBfSURFTlRfQVVUT1BBUiAgICAgICAgIDB4MDgKKy8qISBDb21waWxlciBnZW5lcmF0ZXMgYXRvbWljIHJlZHVjdGlvbiBvcHRpb24gZm9yIGttcGNfcmVkdWNlKiAqLworI2RlZmluZSBLTVBfSURFTlRfQVRPTUlDX1JFRFVDRSAgIDB4MTAKKy8qISBUbyBtYXJrIGEgJ2JhcnJpZXInIGRpcmVjdGl2ZSBpbiB1c2VyIGNvZGUgKi8KKyNkZWZpbmUgS01QX0lERU5UX0JBUlJJRVJfRVhQTCAgICAweDIwCisvKiEgVG8gTWFyayBpbXBsaWNpdCBiYXJyaWVycy4gKi8KKyNkZWZpbmUgS01QX0lERU5UX0JBUlJJRVJfSU1QTCAgICAgICAgICAgMHgwMDQwCisjZGVmaW5lIEtNUF9JREVOVF9CQVJSSUVSX0lNUExfTUFTSyAgICAgIDB4MDFDMAorI2RlZmluZSBLTVBfSURFTlRfQkFSUklFUl9JTVBMX0ZPUiAgICAgICAweDAwNDAKKyNkZWZpbmUgS01QX0lERU5UX0JBUlJJRVJfSU1QTF9TRUNUSU9OUyAgMHgwMEMwCisKKyNkZWZpbmUgS01QX0lERU5UX0JBUlJJRVJfSU1QTF9TSU5HTEUgICAgMHgwMTQwCisjZGVmaW5lIEtNUF9JREVOVF9CQVJSSUVSX0lNUExfV09SS1NIQVJFIDB4MDFDMAorCisvKiEKKyAqIFRoZSBpZGVudCBzdHJ1Y3R1cmUgdGhhdCBkZXNjcmliZXMgYSBzb3VyY2UgbG9jYXRpb24uCisgKi8KK3R5cGVkZWYgc3RydWN0IGlkZW50IHsKKyAgICBrbXBfaW50MzIgcmVzZXJ2ZWRfMTsgICAvKio8ICBtaWdodCBiZSB1c2VkIGluIEZvcnRyYW47IHNlZSBhYm92ZSAgKi8KKyAgICBrbXBfaW50MzIgZmxhZ3M7ICAgICAgICAvKio8ICBhbHNvIGYuZmxhZ3M7IEtNUF9JREVOVF94eHggZmxhZ3M7IEtNUF9JREVOVF9LTVBDIGlkZW50aWZpZXMgdGhpcyB1bmlvbiBtZW1iZXIgICovCisgICAga21wX2ludDMyIHJlc2VydmVkXzI7ICAgLyoqPCAgbm90IHJlYWxseSB1c2VkIGluIEZvcnRyYW4gYW55IG1vcmU7IHNlZSBhYm92ZSAqLworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgYnV0IGN1cnJlbnRseSB1c2VkIGZvciBzdG9yaW5nIHJlZ2lvbi1zcGVjaWZpYyBJVFQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgY29udGV4dHVhbCBpbmZvcm1hdGlvbi4gKi8KKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAga21wX2ludDMyIHJlc2VydmVkXzM7ICAgLyoqPCBzb3VyY2VbNF0gaW4gRm9ydHJhbiwgZG8gbm90IHVzZSBmb3IgQysrICAqLworICAgIGNoYXIgY29uc3QgKnBzb3VyY2U7ICAgIC8qKjwgU3RyaW5nIGRlc2NyaWJpbmcgdGhlIHNvdXJjZSBsb2NhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgc3RyaW5nIGlzIGNvbXBvc2VkIG9mIHNlbWktY29sb24gc2VwYXJhdGVkIGZpZWxkcyB3aGljaCBkZXNjcmliZSB0aGUgc291cmNlIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGZ1bmN0aW9uIGFuZCBhIHBhaXIgb2YgbGluZSBudW1iZXJzIHRoYXQgZGVsaW1pdCB0aGUgY29uc3RydWN0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworfSBpZGVudF90OworLyohCitAfQorKi8KKworLy8gU29tZSBmb3J3YXJkIGRlY2xhcmF0aW9ucy4KKwordHlwZWRlZiB1bmlvbiAga21wX3RlYW0gICAgICBrbXBfdGVhbV90OwordHlwZWRlZiBzdHJ1Y3Qga21wX3Rhc2tkYXRhICBrbXBfdGFza2RhdGFfdDsKK3R5cGVkZWYgdW5pb24gIGttcF90YXNrX3RlYW0ga21wX3Rhc2tfdGVhbV90OwordHlwZWRlZiB1bmlvbiAga21wX3RlYW0gICAgICBrbXBfdGVhbV9wOwordHlwZWRlZiB1bmlvbiAga21wX2luZm8gICAgICBrbXBfaW5mb19wOwordHlwZWRlZiB1bmlvbiAga21wX3Jvb3QgICAgICBrbXBfcm9vdF9wOworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogUGFjayB0d28gMzItYml0IHNpZ25lZCBpbnRlZ2VycyBpbnRvIGEgNjQtYml0IHNpZ25lZCBpbnRlZ2VyICovCisvKiBUb0RvOiBGaXggd29yZCBvcmRlcmluZyBmb3IgYmlnLWVuZGlhbiBtYWNoaW5lcy4gKi8KKyNkZWZpbmUgS01QX1BBQ0tfNjQoSElHSF8zMixMT1dfMzIpIFwKKyAgICAoIChrbXBfaW50NjQpICgoKChrbXBfdWludDY0KShISUdIXzMyKSk8PDMyKSB8IChrbXBfdWludDY0KShMT1dfMzIpKSApCisKKworLyoKKyAqIEdlbmVyaWMgc3RyaW5nIG1hbmlwdWxhdGlvbiBtYWNyb3MuCisgKiBBc3N1bWUgdGhhdCBfeCBpcyBvZiB0eXBlIGNoYXIgKgorICovCisjZGVmaW5lIFNLSVBfV1MoX3gpICAgICB7IHdoaWxlICgqKF94KSA9PSAnICcgfHwgKihfeCkgPT0gJ1x0JykgKF94KSsrOyB9CisjZGVmaW5lIFNLSVBfRElHSVRTKF94KSB7IHdoaWxlICgqKF94KSA+PSAnMCcgJiYgKihfeCkgPD0gJzknKSAoX3gpKys7IH0KKyNkZWZpbmUgU0tJUF9UTyhfeCxfYykgIHsgd2hpbGUgKCooX3gpICE9ICdcMCcgJiYgKihfeCkgIT0gKF9jKSkgKF94KSsrOyB9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgS01QX01BWCggeCwgeSApICggKHgpID4gKHkpID8gKHgpIDogKHkpICkKKyNkZWZpbmUgS01QX01JTiggeCwgeSApICggKHgpIDwgKHkpID8gKHgpIDogKHkpICkKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCisvKiBFbnVtZXJhdGlvbiB0eXBlcyAqLworCitlbnVtIGttcF9zdGF0ZV90aW1lciB7CisgICAgdHNfc3RvcCwKKyAgICB0c19zdGFydCwKKyAgICB0c19wYXVzZSwKKworICAgIHRzX2xhc3Rfc3RhdGUKK307CisKK2VudW0gZHluYW1pY19tb2RlIHsKKyAgICBkeW5hbWljX2RlZmF1bHQsCisjaWZkZWYgVVNFX0xPQURfQkFMQU5DRQorICAgIGR5bmFtaWNfbG9hZF9iYWxhbmNlLAorI2VuZGlmIC8qIFVTRV9MT0FEX0JBTEFOQ0UgKi8KKyAgICBkeW5hbWljX3JhbmRvbSwKKyAgICBkeW5hbWljX3RocmVhZF9saW1pdCwKKyAgICBkeW5hbWljX21heAorfTsKKworLyogZXh0ZXJuYWwgc2NoZWR1bGUgY29uc3RhbnRzLCBkdXBsaWNhdGUgZW51bSBvbXBfc2NoZWQgaW4gb21wLmggaW4gb3JkZXIgdG8gbm90IGluY2x1ZGUgaXQgaGVyZSAqLworI2lmbmRlZiBLTVBfU0NIRURfVFlQRV9ERUZJTkVECisjZGVmaW5lIEtNUF9TQ0hFRF9UWVBFX0RFRklORUQKK3R5cGVkZWYgZW51bSBrbXBfc2NoZWQgeworICAgIGttcF9zY2hlZF9sb3dlciAgICAgICAgICAgICA9IDAsICAgICAvLyBsb3dlciBhbmQgdXBwZXIgYm91bmRzIGFyZSBmb3Igcm91dGluZSBwYXJhbWV0ZXIgY2hlY2sKKyAgICAvLyBOb3RlOiBuZWVkIHRvIGFkanVzdCBfX2ttcF9zY2hfbWFwIGdsb2JhbCBhcnJheSBpbiBjYXNlIHRoaXMgZW51bSBpcyBjaGFuZ2VkCisgICAga21wX3NjaGVkX3N0YXRpYyAgICAgICAgICAgID0gMSwgICAgIC8vIG1hcHBlZCB0byBrbXBfc2NoX3N0YXRpY19jaHVua2VkICAgICAgICAgICAoMzMpCisgICAga21wX3NjaGVkX2R5bmFtaWMgICAgICAgICAgID0gMiwgICAgIC8vIG1hcHBlZCB0byBrbXBfc2NoX2R5bmFtaWNfY2h1bmtlZCAgICAgICAgICAoMzUpCisgICAga21wX3NjaGVkX2d1aWRlZCAgICAgICAgICAgID0gMywgICAgIC8vIG1hcHBlZCB0byBrbXBfc2NoX2d1aWRlZF9jaHVua2VkICAgICAgICAgICAoMzYpCisgICAga21wX3NjaGVkX2F1dG8gICAgICAgICAgICAgID0gNCwgICAgIC8vIG1hcHBlZCB0byBrbXBfc2NoX2F1dG8gICAgICAgICAgICAgICAgICAgICAoMzgpCisgICAga21wX3NjaGVkX3VwcGVyX3N0ZCAgICAgICAgID0gNSwgICAgIC8vIHVwcGVyIGJvdW5kIGZvciBzdGFuZGFyZCBzY2hlZHVsZXMKKyAgICBrbXBfc2NoZWRfbG93ZXJfZXh0ICAgICAgICAgPSAxMDAsICAgLy8gbG93ZXIgYm91bmQgb2YgSW50ZWwgZXh0ZW5zaW9uIHNjaGVkdWxlcworICAgIGttcF9zY2hlZF90cmFwZXpvaWRhbCAgICAgICA9IDEwMSwgICAvLyBtYXBwZWQgdG8ga21wX3NjaF90cmFwZXpvaWRhbCAgICAgICAgICAgICAgKDM5KQorLy8gIGttcF9zY2hlZF9zdGF0aWNfc3RlYWwgICAgICA9IDEwMiwgICAvLyBtYXBwZWQgdG8ga21wX3NjaF9zdGF0aWNfc3RlYWwgICAgICAgICAgICAgKDQ0KQorICAgIGttcF9zY2hlZF91cHBlciAgICAgICAgICAgICA9IDEwMiwKKyAgICBrbXBfc2NoZWRfZGVmYXVsdCA9IGttcF9zY2hlZF9zdGF0aWMgLy8gZGVmYXVsdCBzY2hlZHVsaW5nCit9IGttcF9zY2hlZF90OworI2VuZGlmCisKKy8qIQorIEBpbmdyb3VwIFdPUktfU0hBUklORworICogRGVzY3JpYmVzIHRoZSBsb29wIHNjaGVkdWxlIHRvIGJlIHVzZWQgZm9yIGEgcGFyYWxsZWwgZm9yIGxvb3AuCisgKi8KK2VudW0gc2NoZWRfdHlwZSB7CisgICAga21wX3NjaF9sb3dlciAgICAgICAgICAgICAgICAgICAgID0gMzIsICAgLyoqPCBsb3dlciBib3VuZCBmb3IgdW5vcmRlcmVkIHZhbHVlcyAqLworICAgIGttcF9zY2hfc3RhdGljX2NodW5rZWQgICAgICAgICAgICA9IDMzLAorICAgIGttcF9zY2hfc3RhdGljICAgICAgICAgICAgICAgICAgICA9IDM0LCAgIC8qKjwgc3RhdGljIHVuc3BlY2lhbGl6ZWQgKi8KKyAgICBrbXBfc2NoX2R5bmFtaWNfY2h1bmtlZCAgICAgICAgICAgPSAzNSwKKyAgICBrbXBfc2NoX2d1aWRlZF9jaHVua2VkICAgICAgICAgICAgPSAzNiwgICAvKio8IGd1aWRlZCB1bnNwZWNpYWxpemVkICovCisgICAga21wX3NjaF9ydW50aW1lICAgICAgICAgICAgICAgICAgID0gMzcsCisgICAga21wX3NjaF9hdXRvICAgICAgICAgICAgICAgICAgICAgID0gMzgsICAgLyoqPCBhdXRvICovCisgICAga21wX3NjaF90cmFwZXpvaWRhbCAgICAgICAgICAgICAgID0gMzksCisKKyAgICAvKiBhY2Nlc3NpYmxlIG9ubHkgdGhyb3VnaCBLTVBfU0NIRURVTEUgZW52aXJvbm1lbnQgdmFyaWFibGUgKi8KKyAgICBrbXBfc2NoX3N0YXRpY19ncmVlZHkgICAgICAgICAgICAgPSA0MCwKKyAgICBrbXBfc2NoX3N0YXRpY19iYWxhbmNlZCAgICAgICAgICAgPSA0MSwKKyAgICAvKiBhY2Nlc3NpYmxlIG9ubHkgdGhyb3VnaCBLTVBfU0NIRURVTEUgZW52aXJvbm1lbnQgdmFyaWFibGUgKi8KKyAgICBrbXBfc2NoX2d1aWRlZF9pdGVyYXRpdmVfY2h1bmtlZCAgPSA0MiwKKyAgICBrbXBfc2NoX2d1aWRlZF9hbmFseXRpY2FsX2NodW5rZWQgPSA0MywKKworICAgIGttcF9zY2hfc3RhdGljX3N0ZWFsICAgICAgICAgICAgICA9IDQ0LCAgIC8qKjwgYWNjZXNzaWJsZSBvbmx5IHRocm91Z2ggS01QX1NDSEVEVUxFIGVudmlyb25tZW50IHZhcmlhYmxlICovCisKKyAgICAvKiBhY2Nlc3NpYmxlIG9ubHkgdGhyb3VnaCBLTVBfU0NIRURVTEUgZW52aXJvbm1lbnQgdmFyaWFibGUgKi8KKyAgICBrbXBfc2NoX3VwcGVyICAgICAgICAgICAgICAgICAgICAgPSA0NSwgICAvKio8IHVwcGVyIGJvdW5kIGZvciB1bm9yZGVyZWQgdmFsdWVzICovCisKKyAgICBrbXBfb3JkX2xvd2VyICAgICAgICAgICAgICAgICAgICAgPSA2NCwgICAvKio8IGxvd2VyIGJvdW5kIGZvciBvcmRlcmVkIHZhbHVlcywgbXVzdCBiZSBwb3dlciBvZiAyICovCisgICAga21wX29yZF9zdGF0aWNfY2h1bmtlZCAgICAgICAgICAgID0gNjUsCisgICAga21wX29yZF9zdGF0aWMgICAgICAgICAgICAgICAgICAgID0gNjYsICAgLyoqPCBvcmRlcmVkIHN0YXRpYyB1bnNwZWNpYWxpemVkICovCisgICAga21wX29yZF9keW5hbWljX2NodW5rZWQgICAgICAgICAgID0gNjcsCisgICAga21wX29yZF9ndWlkZWRfY2h1bmtlZCAgICAgICAgICAgID0gNjgsCisgICAga21wX29yZF9ydW50aW1lICAgICAgICAgICAgICAgICAgID0gNjksCisgICAga21wX29yZF9hdXRvICAgICAgICAgICAgICAgICAgICAgID0gNzAsICAgLyoqPCBvcmRlcmVkIGF1dG8gKi8KKyAgICBrbXBfb3JkX3RyYXBlem9pZGFsICAgICAgICAgICAgICAgPSA3MSwKKyAgICBrbXBfb3JkX3VwcGVyICAgICAgICAgICAgICAgICAgICAgPSA3MiwgICAvKio8IHVwcGVyIGJvdW5kIGZvciBvcmRlcmVkIHZhbHVlcyAqLworCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAvKiBTY2hlZHVsZXMgZm9yIERpc3RyaWJ1dGUgY29uc3RydWN0ICovCisgICAga21wX2Rpc3RyaWJ1dGVfc3RhdGljX2NodW5rZWQgICAgID0gOTEsICAgLyoqPCBkaXN0cmlidXRlIHN0YXRpYyBjaHVua2VkICovCisgICAga21wX2Rpc3RyaWJ1dGVfc3RhdGljICAgICAgICAgICAgID0gOTIsICAgLyoqPCBkaXN0cmlidXRlIHN0YXRpYyB1bnNwZWNpYWxpemVkICovCisjZW5kaWYKKworICAgIC8qCisgICAgICogRm9yIHRoZSAibm9tZXJnZSIgdmVyc2lvbnMsIGttcF9kaXNwYXRjaF9uZXh0KigpIHdpbGwgYWx3YXlzIHJldHVybgorICAgICAqIGEgc2luZ2xlIGl0ZXJhdGlvbi9jaHVuaywgZXZlbiBpZiB0aGUgbG9vcCBpcyBzZXJpYWxpemVkLiAgRm9yIHRoZQorICAgICAqIHNjaGVkdWxlIHR5cGVzIGxpc3RlZCBhYm92ZSwgdGhlIGVudGlyZSBpdGVyYXRpb24gdmVjdG9yIGlzIHJldHVybmVkCisgICAgICogaWYgdGhlIGxvb3AgaXMgc2VyaWFsaXplZC4gIFRoaXMgZG9lc24ndCB3b3JrIGZvciBnY2MvZ2NvbXAgc2VjdGlvbnMuCisgICAgICovCisgICAga21wX25tX2xvd2VyICAgICAgICAgICAgICAgICAgICAgID0gMTYwLCAgLyoqPCBsb3dlciBib3VuZCBmb3Igbm9tZXJnZSB2YWx1ZXMgKi8KKworICAgIGttcF9ubV9zdGF0aWNfY2h1bmtlZCAgICAgICAgICAgICA9IChrbXBfc2NoX3N0YXRpY19jaHVua2VkIC0ga21wX3NjaF9sb3dlciArIGttcF9ubV9sb3dlciksCisgICAga21wX25tX3N0YXRpYyAgICAgICAgICAgICAgICAgICAgID0gMTYyLCAgLyoqPCBzdGF0aWMgdW5zcGVjaWFsaXplZCAqLworICAgIGttcF9ubV9keW5hbWljX2NodW5rZWQgICAgICAgICAgICA9IDE2MywKKyAgICBrbXBfbm1fZ3VpZGVkX2NodW5rZWQgICAgICAgICAgICAgPSAxNjQsICAvKio8IGd1aWRlZCB1bnNwZWNpYWxpemVkICovCisgICAga21wX25tX3J1bnRpbWUgICAgICAgICAgICAgICAgICAgID0gMTY1LAorICAgIGttcF9ubV9hdXRvICAgICAgICAgICAgICAgICAgICAgICA9IDE2NiwgIC8qKjwgYXV0byAqLworICAgIGttcF9ubV90cmFwZXpvaWRhbCAgICAgICAgICAgICAgICA9IDE2NywKKworICAgIC8qIGFjY2Vzc2libGUgb25seSB0aHJvdWdoIEtNUF9TQ0hFRFVMRSBlbnZpcm9ubWVudCB2YXJpYWJsZSAqLworICAgIGttcF9ubV9zdGF0aWNfZ3JlZWR5ICAgICAgICAgICAgICA9IDE2OCwKKyAgICBrbXBfbm1fc3RhdGljX2JhbGFuY2VkICAgICAgICAgICAgPSAxNjksCisgICAgLyogYWNjZXNzaWJsZSBvbmx5IHRocm91Z2ggS01QX1NDSEVEVUxFIGVudmlyb25tZW50IHZhcmlhYmxlICovCisgICAga21wX25tX2d1aWRlZF9pdGVyYXRpdmVfY2h1bmtlZCAgID0gMTcwLAorICAgIGttcF9ubV9ndWlkZWRfYW5hbHl0aWNhbF9jaHVua2VkICA9IDE3MSwKKyAgICBrbXBfbm1fc3RhdGljX3N0ZWFsICAgICAgICAgICAgICAgPSAxNzIsICAvKiBhY2Nlc3NpYmxlIG9ubHkgdGhyb3VnaCBPTVBfU0NIRURVTEUgZW52aXJvbm1lbnQgdmFyaWFibGUgKi8KKworICAgIGttcF9ubV9vcmRfc3RhdGljX2NodW5rZWQgICAgICAgICA9IDE5MywKKyAgICBrbXBfbm1fb3JkX3N0YXRpYyAgICAgICAgICAgICAgICAgPSAxOTQsICAvKio8IG9yZGVyZWQgc3RhdGljIHVuc3BlY2lhbGl6ZWQgKi8KKyAgICBrbXBfbm1fb3JkX2R5bmFtaWNfY2h1bmtlZCAgICAgICAgPSAxOTUsCisgICAga21wX25tX29yZF9ndWlkZWRfY2h1bmtlZCAgICAgICAgID0gMTk2LAorICAgIGttcF9ubV9vcmRfcnVudGltZSAgICAgICAgICAgICAgICA9IDE5NywKKyAgICBrbXBfbm1fb3JkX2F1dG8gICAgICAgICAgICAgICAgICAgPSAxOTgsICAvKio8IGF1dG8gKi8KKyAgICBrbXBfbm1fb3JkX3RyYXBlem9pZGFsICAgICAgICAgICAgPSAxOTksCisgICAga21wX25tX3VwcGVyICAgICAgICAgICAgICAgICAgICAgID0gMjAwLCAgLyoqPCB1cHBlciBib3VuZCBmb3Igbm9tZXJnZSB2YWx1ZXMgKi8KKworICAgIGttcF9zY2hfZGVmYXVsdCA9IGttcF9zY2hfc3RhdGljICAvKio8IGRlZmF1bHQgc2NoZWR1bGluZyBhbGdvcml0aG0gKi8KK307CisKKy8qIFR5cGUgdG8ga2VlcCBydW50aW1lIHNjaGVkdWxlIHNldCB2aWEgT01QX1NDSEVEVUxFIG9yIG9tcF9zZXRfc2NoZWR1bGUoKSAqLwordHlwZWRlZiBzdHJ1Y3Qga21wX3Jfc2NoZWQgeworICAgIGVudW0gc2NoZWRfdHlwZSByX3NjaGVkX3R5cGU7CisgICAgaW50ICAgICAgICAgICAgIGNodW5rOworfSBrbXBfcl9zY2hlZF90OworCitleHRlcm4gZW51bSBzY2hlZF90eXBlIF9fa21wX3NjaF9tYXBbXTsgLy8gbWFwIE9NUCAzLjAgc2NoZWR1bGUgdHlwZXMgd2l0aCBvdXIgaW50ZXJuYWwgc2NoZWR1bGUgdHlwZXMKKworZW51bSBsaWJyYXJ5X3R5cGUgeworICAgIGxpYnJhcnlfbm9uZSwKKyAgICBsaWJyYXJ5X3NlcmlhbCwKKyAgICBsaWJyYXJ5X3R1cm5hcm91bmQsCisgICAgbGlicmFyeV90aHJvdWdocHV0Cit9OworCisjaWYgS01QX09TX0xJTlVYCitlbnVtIGNsb2NrX2Z1bmN0aW9uX3R5cGUgeworICAgIGNsb2NrX2Z1bmN0aW9uX2dldHRpbWVvZmRheSwKKyAgICBjbG9ja19mdW5jdGlvbl9jbG9ja19nZXR0aW1lCit9OworI2VuZGlmIC8qIEtNUF9PU19MSU5VWCAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tIGZhc3QgcmVkdWN0aW9uIHN0dWZmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjdW5kZWYgS01QX0ZBU1RfUkVEVUNUSU9OX0JBUlJJRVIKKyNkZWZpbmUgS01QX0ZBU1RfUkVEVUNUSU9OX0JBUlJJRVIgMQorCisjdW5kZWYgS01QX0ZBU1RfUkVEVUNUSU9OX0NPUkVfRFVPCisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorICAgICNkZWZpbmUgS01QX0ZBU1RfUkVEVUNUSU9OX0NPUkVfRFVPIDEKKyNlbmRpZgorCitlbnVtIF9yZWR1Y3Rpb25fbWV0aG9kIHsKKyAgICByZWR1Y3Rpb25fbWV0aG9kX25vdF9kZWZpbmVkID0gMCwKKyAgICBjcml0aWNhbF9yZWR1Y2VfYmxvY2sgICAgICAgID0gKCAxIDw8IDggKSwKKyAgICBhdG9taWNfcmVkdWNlX2Jsb2NrICAgICAgICAgID0gKCAyIDw8IDggKSwKKyAgICB0cmVlX3JlZHVjZV9ibG9jayAgICAgICAgICAgID0gKCAzIDw8IDggKSwKKyAgICBlbXB0eV9yZWR1Y2VfYmxvY2sgICAgICAgICAgID0gKCA0IDw8IDggKQorfTsKKworLy8gZGVzY3JpcHRpb24gb2YgdGhlIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kIHZhcmlhYmxlCisvLyB0aGUgcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgdmFyaWFibGUgY29uc2lzdHMgb2YgdHdvIGVudW0gdHlwZXMgdmFyaWFibGVzIHRoYXQgYXJlIHBhY2tlZCB0b2dldGhlciBpbnRvIDAtdGggYnl0ZSBhbmQgMS1zdCBieXRlOgorLy8gMDogKCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCAmIDB4MDAwMDAwRkYgKSBpcyBhICdlbnVtIGJhcnJpZXJfdHlwZScgdmFsdWUgb2YgYmFycmllciB0aGF0IHdpbGwgYmUgdXNlZCBpbiBmYXN0IHJlZHVjdGlvbjogYnNfcGxhaW5fYmFycmllciBvciBic19yZWR1Y3Rpb25fYmFycmllcgorLy8gMTogKCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCAmIDB4MDAwMEZGMDAgKSBpcyBhIHJlZHVjdGlvbiBtZXRob2QgdGhhdCB3aWxsIGJlIHVzZWQgaW4gZmFzdCByZWR1Y3Rpb247CisvLyByZWR1Y3Rpb24gbWV0aG9kIGlzIG9mICdlbnVtIF9yZWR1Y3Rpb25fbWV0aG9kJyB0eXBlIGFuZCBpdCdzIGRlZmluZWQgdGhlIHdheSBzbyB0aGF0IHRoZSBiaXRzIG9mIDAtdGggYnl0ZSBhcmUgZW1wdHksCisvLyBzbyBubyBuZWVkIHRvIGV4ZWN1dGUgYSBzaGlmdCBpbnN0cnVjdGlvbiB3aGlsZSBwYWNraW5nL3VucGFja2luZworCisjaWYgS01QX0ZBU1RfUkVEVUNUSU9OX0JBUlJJRVIKKyAgICAjZGVmaW5lIFBBQ0tfUkVEVUNUSU9OX01FVEhPRF9BTkRfQkFSUklFUihyZWR1Y3Rpb25fbWV0aG9kLGJhcnJpZXJfdHlwZSkgXAorICAgICAgICAgICAgKCAoIHJlZHVjdGlvbl9tZXRob2QgKSB8ICggYmFycmllcl90eXBlICkgKQorCisgICAgI2RlZmluZSBVTlBBQ0tfUkVEVUNUSU9OX01FVEhPRChwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCkgXAorICAgICAgICAgICAgKCAoIGVudW0gX3JlZHVjdGlvbl9tZXRob2QgKSggKCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCApICYgKCAweDAwMDBGRjAwICkgKSApCisKKyAgICAjZGVmaW5lIFVOUEFDS19SRURVQ1RJT05fQkFSUklFUihwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCkgXAorICAgICAgICAgICAgKCAoIGVudW0gYmFycmllcl90eXBlICkoICAgICAgKCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCApICYgKCAweDAwMDAwMEZGICkgKSApCisjZWxzZQorICAgICNkZWZpbmUgUEFDS19SRURVQ1RJT05fTUVUSE9EX0FORF9CQVJSSUVSKHJlZHVjdGlvbl9tZXRob2QsYmFycmllcl90eXBlKSBcCisgICAgICAgICAgICAoIHJlZHVjdGlvbl9tZXRob2QgKQorCisgICAgI2RlZmluZSBVTlBBQ0tfUkVEVUNUSU9OX01FVEhPRChwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCkgXAorICAgICAgICAgICAgKCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCApCisKKyAgICAjZGVmaW5lIFVOUEFDS19SRURVQ1RJT05fQkFSUklFUihwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCkgXAorICAgICAgICAgICAgKCBic19wbGFpbl9iYXJyaWVyICkKKyNlbmRpZgorCisjZGVmaW5lIFRFU1RfUkVEVUNUSU9OX01FVEhPRChwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCx3aGljaF9yZWR1Y3Rpb25fYmxvY2spIFwKKyAgICAgICAgICAgICggKCBVTlBBQ0tfUkVEVUNUSU9OX01FVEhPRCggcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgKSApID09ICggd2hpY2hfcmVkdWN0aW9uX2Jsb2NrICkgKQorCisjaWYgS01QX0ZBU1RfUkVEVUNUSU9OX0JBUlJJRVIKKyAgICAjZGVmaW5lIFRSRUVfUkVEVUNFX0JMT0NLX1dJVEhfUkVEVUNUSU9OX0JBUlJJRVIgXAorICAgICAgICAgICAgKCBQQUNLX1JFRFVDVElPTl9NRVRIT0RfQU5EX0JBUlJJRVIoIHRyZWVfcmVkdWNlX2Jsb2NrLCBic19yZWR1Y3Rpb25fYmFycmllciApICkKKworICAgICNkZWZpbmUgVFJFRV9SRURVQ0VfQkxPQ0tfV0lUSF9QTEFJTl9CQVJSSUVSIFwKKyAgICAgICAgICAgICggUEFDS19SRURVQ1RJT05fTUVUSE9EX0FORF9CQVJSSUVSKCB0cmVlX3JlZHVjZV9ibG9jaywgYnNfcGxhaW5fYmFycmllciApICkKKyNlbmRpZgorCit0eXBlZGVmIGludCBQQUNLRURfUkVEVUNUSU9OX01FVEhPRF9UOworCisvKiAtLSBlbmQgb2YgZmFzdCByZWR1Y3Rpb24gc3R1ZmYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmIEtNUF9PU19XSU5ET1dTCisjIGRlZmluZSBVU0VfQ0JMS0RBVEEKKyMgcHJhZ21hIHdhcm5pbmcoIHB1c2ggKQorIyBwcmFnbWEgd2FybmluZyggZGlzYWJsZTogMjcxIDMxMCApCisjIGluY2x1ZGUgPHdpbmRvd3MuaD4KKyMgcHJhZ21hIHdhcm5pbmcoIHBvcCApCisjZW5kaWYKKworI2lmIEtNUF9PU19VTklYCisjIGluY2x1ZGUgPHB0aHJlYWQuaD4KKyMgaW5jbHVkZSA8ZGxmY24uaD4KKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogT25seSBMaW51eCogT1MgYW5kIFdpbmRvd3MqIE9TIHN1cHBvcnQgdGhyZWFkIGFmZmluaXR5LgorICovCisjaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorCitleHRlcm4gc2l6ZV90IF9fa21wX2FmZmluX21hc2tfc2l6ZTsKKyMgZGVmaW5lIEtNUF9BRkZJTklUWV9DQVBBQkxFKCkgKF9fa21wX2FmZmluX21hc2tfc2l6ZSA+IDApCisjIGRlZmluZSBLTVBfQ1BVX1NFVFNJWkUgICAgICAgIChfX2ttcF9hZmZpbl9tYXNrX3NpemUgKiBDSEFSX0JJVCkKKworIyBpZiBLTVBfT1NfTElOVVgKKy8vCisvLyBPbiBMaW51eCogT1MsIHRoZSBtYXNrIGlzIGFjdHVhbGx5IGEgdmVjdG9yIG9mIGxlbmd0aCBfX2ttcF9hZmZpbl9tYXNrX3NpemUKKy8vIChpbiBieXRlcykuICBJdCBzaG91bGQgYmUgYWxsb2NhdGVkIG9uIGEgd29yZCBib3VuZGFyeS4KKy8vCisvLyBXQVJOSU5HISEhICBXZSBoYXZlIG1hZGUgdGhlIGJhc2UgdHlwZSBvZiB0aGUgYWZmaW5pdHkgbWFzayB1bnNpZ25lZCBjaGFyLAorLy8gaW4gb3JkZXIgdG8gZWxpbWluYXRlIGEgbG90IG9mIGNoZWNrcyB0aGF0IHRoZSB0cnVlIHN5c3RlbSBtYXNrIHNpemUgaXMKKy8vIHJlYWxseSBhIG11bHRpcGxlIG9mIDQgYnl0ZXMgKG9uIExpbnV4KiBPUykuCisvLworLy8gVEhFU0UgTUFDUk9TIFdPTidUIFdPUksgUFJPUEVSTFkgT04gQklHIEVORElBTiBNQUNISU5FUyEhIQorLy8KKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIGttcF9hZmZpbl9tYXNrX3Q7CisKKyMgIGRlZmluZSBfS01QX0NQVV9TRVQoaSxtYXNrKSAgIChtYXNrW2kvQ0hBUl9CSVRdIHw9ICgoKGttcF9hZmZpbl9tYXNrX3QpMSkgPDwgKGkgJSBDSEFSX0JJVCkpKQorIyAgZGVmaW5lIEtNUF9DUFVfU0VUKGksbWFzaykgICAgX0tNUF9DUFVfU0VUKChpKSwgKChrbXBfYWZmaW5fbWFza190ICopKG1hc2spKSkKKyMgIGRlZmluZSBfS01QX0NQVV9JU1NFVChpLG1hc2spICghIShtYXNrW2kvQ0hBUl9CSVRdICYgKCgoa21wX2FmZmluX21hc2tfdCkxKSA8PCAoaSAlIENIQVJfQklUKSkpKQorIyAgZGVmaW5lIEtNUF9DUFVfSVNTRVQoaSxtYXNrKSAgX0tNUF9DUFVfSVNTRVQoKGkpLCAoKGttcF9hZmZpbl9tYXNrX3QgKikobWFzaykpKQorIyAgZGVmaW5lIF9LTVBfQ1BVX0NMUihpLG1hc2spICAgKG1hc2tbaS9DSEFSX0JJVF0gJj0gfigoKGttcF9hZmZpbl9tYXNrX3QpMSkgPDwgKGkgJSBDSEFSX0JJVCkpKQorIyAgZGVmaW5lIEtNUF9DUFVfQ0xSKGksbWFzaykgICAgX0tNUF9DUFVfQ0xSKChpKSwgKChrbXBfYWZmaW5fbWFza190ICopKG1hc2spKSkKKworIyAgZGVmaW5lIEtNUF9DUFVfWkVSTyhtYXNrKSBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHNpemVfdCBfX2k7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yIChfX2kgPSAwOyBfX2kgPCBfX2ttcF9hZmZpbl9tYXNrX3NpemU7IF9faSsrKSB7ICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKChrbXBfYWZmaW5fbWFza190ICopKG1hc2spKVtfX2ldID0gMDsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9CisKKyMgIGRlZmluZSBLTVBfQ1BVX0NPUFkoZGVzdCwgc3JjKSBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHNpemVfdCBfX2k7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yIChfX2kgPSAwOyBfX2kgPCBfX2ttcF9hZmZpbl9tYXNrX3NpemU7IF9faSsrKSB7ICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKChrbXBfYWZmaW5fbWFza190ICopKGRlc3QpKVtfX2ldICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgID0gKChrbXBfYWZmaW5fbWFza190ICopKHNyYykpW19faV07ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0KKworIyAgZGVmaW5lIEtNUF9DUFVfQ09NUExFTUVOVChtYXNrKSBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHNpemVfdCBfX2k7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yIChfX2kgPSAwOyBfX2kgPCBfX2ttcF9hZmZpbl9tYXNrX3NpemU7IF9faSsrKSB7ICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKChrbXBfYWZmaW5fbWFza190ICopKG1hc2spKVtfX2ldICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgID0gfigoa21wX2FmZmluX21hc2tfdCAqKShtYXNrKSlbX19pXTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0KKworIyAgZGVmaW5lIEtNUF9DUFVfVU5JT04oZGVzdCwgc3JjKSBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHNpemVfdCBfX2k7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yIChfX2kgPSAwOyBfX2kgPCBfX2ttcF9hZmZpbl9tYXNrX3NpemU7IF9faSsrKSB7ICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKChrbXBfYWZmaW5fbWFza190ICopKGRlc3QpKVtfX2ldICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIHw9ICgoa21wX2FmZmluX21hc2tfdCAqKShzcmMpKVtfX2ldOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0KKworIyBlbmRpZiAvKiBLTVBfT1NfTElOVVggKi8KKworIyBpZiBLTVBfT1NfV0lORE9XUworLy8KKy8vIE9uIFdpbmRvd3MqIE9TLCB0aGUgbWFzayBzaXplIGlzIDQgYnl0ZXMgZm9yIElBLTMyIGFyY2hpdGVjdHVyZSwgYW5kIG9uCisvLyBJbnRlbChSKSA2NCBpdCBpcyA4IGJ5dGVzIHRpbWVzIHRoZSBudW1iZXIgb2YgcHJvY2Vzc29yIGdyb3Vwcy4KKy8vCisKKyMgIGlmIEtNUF9BUkNIX1g4Nl82NAorCisvLyBHUk9VUF9BRkZJTklUWSBpcyBhbHJlYWR5IGRlZmluZWQgZm9yIF9NU0NfVkVSPj0xNjAwIChWUzIwMTAgYW5kIGxhdGVyKS4KKyMgICBpZiBfTVNDX1ZFUiA8IDE2MDAKK3R5cGVkZWYgc3RydWN0IEdST1VQX0FGRklOSVRZIHsKKyAgICBLQUZGSU5JVFkgTWFzazsKKyAgICBXT1JEIEdyb3VwOworICAgIFdPUkQgUmVzZXJ2ZWRbM107Cit9IEdST1VQX0FGRklOSVRZOworIyAgIGVuZGlmCisKK3R5cGVkZWYgRFdPUkRfUFRSIGttcF9hZmZpbl9tYXNrX3Q7CisKK2V4dGVybiBpbnQgX19rbXBfbnVtX3Byb2NfZ3JvdXBzOworCisjICAgZGVmaW5lIF9LTVBfQ1BVX1NFVChpLG1hc2spIFwKKyAgICAgICAgKG1hc2tbaS8oQ0hBUl9CSVQgKiBzaXplb2Yoa21wX2FmZmluX21hc2tfdCkpXSB8PSAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoKChrbXBfYWZmaW5fbWFza190KTEpIDw8IChpICUgKENIQVJfQklUICogc2l6ZW9mKGttcF9hZmZpbl9tYXNrX3QpKSkpKQorCisjICAgZGVmaW5lIEtNUF9DUFVfU0VUKGksbWFzaykgXAorICAgICAgICBfS01QX0NQVV9TRVQoKGkpLCAoKGttcF9hZmZpbl9tYXNrX3QgKikobWFzaykpKQorCisjICAgZGVmaW5lIF9LTVBfQ1BVX0lTU0VUKGksbWFzaykgXAorICAgICAgICAoISEobWFza1tpLyhDSEFSX0JJVCAqIHNpemVvZihrbXBfYWZmaW5fbWFza190KSldICYgICAgICAgICAgICAgICAgICBcCisgICAgICAgICgoKGttcF9hZmZpbl9tYXNrX3QpMSkgPDwgKGkgJSAoQ0hBUl9CSVQgKiBzaXplb2Yoa21wX2FmZmluX21hc2tfdCkpKSkpKQorCisjICAgZGVmaW5lIEtNUF9DUFVfSVNTRVQoaSxtYXNrKSBcCisgICAgICAgIF9LTVBfQ1BVX0lTU0VUKChpKSwgKChrbXBfYWZmaW5fbWFza190ICopKG1hc2spKSkKKworIyAgIGRlZmluZSBfS01QX0NQVV9DTFIoaSxtYXNrKSBcCisgICAgICAgIChtYXNrW2kvKENIQVJfQklUICogc2l6ZW9mKGttcF9hZmZpbl9tYXNrX3QpKV0gJj0gICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfigoKGttcF9hZmZpbl9tYXNrX3QpMSkgPDwgKGkgJSAoQ0hBUl9CSVQgKiBzaXplb2Yoa21wX2FmZmluX21hc2tfdCkpKSkpCisKKyMgICBkZWZpbmUgS01QX0NQVV9DTFIoaSxtYXNrKSBcCisgICAgICAgIF9LTVBfQ1BVX0NMUigoaSksICgoa21wX2FmZmluX21hc2tfdCAqKShtYXNrKSkpCisKKyMgICBkZWZpbmUgS01QX0NQVV9aRVJPKG1hc2spIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaW50IF9faTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IgKF9faSA9IDA7IF9faSA8IF9fa21wX251bV9wcm9jX2dyb3VwczsgX19pKyspIHsgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAoKGttcF9hZmZpbl9tYXNrX3QgKikobWFzaykpW19faV0gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0KKworIyAgIGRlZmluZSBLTVBfQ1BVX0NPUFkoZGVzdCwgc3JjKSBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGludCBfX2k7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yIChfX2kgPSAwOyBfX2kgPCBfX2ttcF9udW1fcHJvY19ncm91cHM7IF9faSsrKSB7ICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKChrbXBfYWZmaW5fbWFza190ICopKGRlc3QpKVtfX2ldICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgID0gKChrbXBfYWZmaW5fbWFza190ICopKHNyYykpW19faV07ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0KKworIyAgIGRlZmluZSBLTVBfQ1BVX0NPTVBMRU1FTlQobWFzaykgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpbnQgX19pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZvciAoX19pID0gMDsgX19pIDwgX19rbXBfbnVtX3Byb2NfZ3JvdXBzOyBfX2krKykgeyAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICgoa21wX2FmZmluX21hc2tfdCAqKShtYXNrKSlbX19pXSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICA9IH4oKGttcF9hZmZpbl9tYXNrX3QgKikobWFzaykpW19faV07ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9CisKKyMgICBkZWZpbmUgS01QX0NQVV9VTklPTihkZXN0LCBzcmMpIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaW50IF9faTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IgKF9faSA9IDA7IF9faSA8IF9fa21wX251bV9wcm9jX2dyb3VwczsgX19pKyspIHsgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAoKGttcF9hZmZpbl9tYXNrX3QgKikoZGVzdCkpW19faV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgfD0gKChrbXBfYWZmaW5fbWFza190ICopKHNyYykpW19faV07ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfQorCit0eXBlZGVmIERXT1JEICgqa21wX0dldEFjdGl2ZVByb2Nlc3NvckNvdW50X3QpKFdPUkQpOworZXh0ZXJuIGttcF9HZXRBY3RpdmVQcm9jZXNzb3JDb3VudF90IF9fa21wX0dldEFjdGl2ZVByb2Nlc3NvckNvdW50OworCit0eXBlZGVmIFdPUkQgKCprbXBfR2V0QWN0aXZlUHJvY2Vzc29yR3JvdXBDb3VudF90KSh2b2lkKTsKK2V4dGVybiBrbXBfR2V0QWN0aXZlUHJvY2Vzc29yR3JvdXBDb3VudF90IF9fa21wX0dldEFjdGl2ZVByb2Nlc3Nvckdyb3VwQ291bnQ7CisKK3R5cGVkZWYgQk9PTCAoKmttcF9HZXRUaHJlYWRHcm91cEFmZmluaXR5X3QpKEhBTkRMRSwgR1JPVVBfQUZGSU5JVFkgKik7CitleHRlcm4ga21wX0dldFRocmVhZEdyb3VwQWZmaW5pdHlfdCBfX2ttcF9HZXRUaHJlYWRHcm91cEFmZmluaXR5OworCit0eXBlZGVmIEJPT0wgKCprbXBfU2V0VGhyZWFkR3JvdXBBZmZpbml0eV90KShIQU5ETEUsIGNvbnN0IEdST1VQX0FGRklOSVRZICosIEdST1VQX0FGRklOSVRZICopOworZXh0ZXJuIGttcF9TZXRUaHJlYWRHcm91cEFmZmluaXR5X3QgX19rbXBfU2V0VGhyZWFkR3JvdXBBZmZpbml0eTsKKworZXh0ZXJuIGludCBfX2ttcF9nZXRfcHJvY19ncm91cChrbXBfYWZmaW5fbWFza190IGNvbnN0ICptYXNrKTsKKworIyAgZWxzZQorCit0eXBlZGVmIERXT1JEIGttcF9hZmZpbl9tYXNrX3Q7IC8qIGZvciBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgd2luYmFzZS5oICovCisKKyMgICBkZWZpbmUgS01QX0NQVV9TRVQoaSxtYXNrKSAgICAgICgqKG1hc2spIHw9ICgoKGttcF9hZmZpbl9tYXNrX3QpMSkgPDwgKGkpKSkKKyMgICBkZWZpbmUgS01QX0NQVV9JU1NFVChpLG1hc2spICAgICghISgqKG1hc2spICYgKCgoa21wX2FmZmluX21hc2tfdCkxKSA8PCAoaSkpKSkKKyMgICBkZWZpbmUgS01QX0NQVV9DTFIoaSxtYXNrKSAgICAgICgqKG1hc2spICY9IH4oKChrbXBfYWZmaW5fbWFza190KTEpIDw8IChpKSkpCisjICAgZGVmaW5lIEtNUF9DUFVfWkVSTyhtYXNrKSAgICAgICAoKihtYXNrKSA9IDApCisjICAgZGVmaW5lIEtNUF9DUFVfQ09QWShkZXN0LCBzcmMpICAoKihkZXN0KSA9ICooc3JjKSkKKyMgICBkZWZpbmUgS01QX0NQVV9DT01QTEVNRU5UKG1hc2spICgqKG1hc2spID0gfioobWFzaykpCisjICAgZGVmaW5lIEtNUF9DUFVfVU5JT04oZGVzdCwgc3JjKSAoKihkZXN0KSB8PSAqKHNyYykpCisKKyMgIGVuZGlmIC8qIEtNUF9BUkNIX1g4NiAqLworCisjIGVuZGlmIC8qIEtNUF9PU19XSU5ET1dTICovCisKKy8vCisvLyBfX2ttcF9hbGxvY2F0ZSgpIHdpbGwgcmV0dXJuIG1lbW9yeSBhbGxvY2F0ZWQgb24gYSA0LWJ5dGVzIGJvdW5kYXJ5LgorLy8gYWZ0ZXIgemVyb2luZyBpdCAtIGl0IHRha2VzIGNhcmUgb2YgdGhvc2UgYXNzdW1wdGlvbnMgc3RhdGVkIGFib3ZlLgorLy8KKyMgZGVmaW5lIEtNUF9DUFVfQUxMT0MocHRyKSBcCisgICAgICAgIChwdHIgPSAoKGttcF9hZmZpbl9tYXNrX3QgKilfX2ttcF9hbGxvY2F0ZShfX2ttcF9hZmZpbl9tYXNrX3NpemUpKSkKKyMgZGVmaW5lIEtNUF9DUFVfRlJFRShwdHIpIF9fa21wX2ZyZWUocHRyKQorCisvLworLy8gVGhlIGZvbGxvd2luZyBtYWNybyBzaG91bGQgYmUgdXNlZCB0byBpbmRleCBhbiBhcnJheSBvZiBtYXNrcy4KKy8vIFRoZSBhcnJheSBzaG91bGQgYmUgZGVjbGFyZWQgYXMgImttcF9hZmZpbml0eV90ICoiIGFuZCBhbGxvY2F0ZWQgd2l0aAorLy8gc2l6ZSAiX19rbXBfYWZmaW5pdHlfbWFza19zaXplICogbGVuIi4gIFRoZSBtYWNybyB0YWtlcyBjYXJlIG9mIHRoZSBmYWN0CisvLyB0aGF0IG9uIFdpbmRvd3MqIE9TLCBzaXplb2Yoa21wX2FmZmluX3QpIGlzIHJlYWxseSB0aGUgc2l6ZSBvZiB0aGUgbWFzaywgYnV0CisvLyBvbiBMaW51eCogT1MsIHNpemVvZihrbXBfYWZmaW5fdCkgaXMgMS4KKy8vCisjIGRlZmluZSBLTVBfQ1BVX0lOREVYKGFycmF5LGkpIFwKKyAgICAgICAgKChrbXBfYWZmaW5fbWFza190ICopKCgoY2hhciAqKShhcnJheSkpICsgKGkpICogX19rbXBfYWZmaW5fbWFza19zaXplKSkKKworLy8KKy8vIERlY2xhcmUgbG9jYWwgY2hhciBidWZmZXJzIHdpdGggdGhpcyBzaXplIGZvciBwcmludGluZyBkZWJ1ZyBhbmQgaW5mbworLy8gbWVzc2FnZXMsIHVzaW5nIF9fa21wX2FmZmluaXR5X3ByaW50X21hc2soKS4KKy8vCisjZGVmaW5lIEtNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTiAgICAgICAgMTAyNAorCitlbnVtIGFmZmluaXR5X3R5cGUgeworICAgIGFmZmluaXR5X25vbmUgPSAwLAorICAgIGFmZmluaXR5X3BoeXNpY2FsLAorICAgIGFmZmluaXR5X2xvZ2ljYWwsCisgICAgYWZmaW5pdHlfY29tcGFjdCwKKyAgICBhZmZpbml0eV9zY2F0dGVyLAorICAgIGFmZmluaXR5X2V4cGxpY2l0LAorICAgIGFmZmluaXR5X2JhbGFuY2VkLAorICAgIGFmZmluaXR5X2Rpc2FibGVkLCAgLy8gbm90IHVzZWQgb3V0c2l6ZSB0aGUgZW52IHZhciBwYXJzZXIKKyAgICBhZmZpbml0eV9kZWZhdWx0Cit9OworCitlbnVtIGFmZmluaXR5X2dyYW4geworICAgIGFmZmluaXR5X2dyYW5fZmluZSA9IDAsCisgICAgYWZmaW5pdHlfZ3Jhbl90aHJlYWQsCisgICAgYWZmaW5pdHlfZ3Jhbl9jb3JlLAorICAgIGFmZmluaXR5X2dyYW5fcGFja2FnZSwKKyAgICBhZmZpbml0eV9ncmFuX25vZGUsCisjaWYgS01QX09TX1dJTkRPV1MgJiYgS01QX0FSQ0hfWDg2XzY0CisgICAgLy8KKyAgICAvLyBUaGUgImdyb3VwIiBncmFudWxhcml0eSBpc24ndCBuZWNlc3NzYXJpbHkgY29hcnNlciB0aGFuIGFsbCBvZiB0aGUKKyAgICAvLyBvdGhlciBsZXZlbHMsIGJ1dCB3ZSBwdXQgaXQgbGFzdCBpbiB0aGUgZW51bS4KKyAgICAvLworICAgIGFmZmluaXR5X2dyYW5fZ3JvdXAsCisjZW5kaWYgLyogS01QX09TX1dJTkRPV1MgJiYgS01QX0FSQ0hfWDg2XzY0ICovCisgICAgYWZmaW5pdHlfZ3Jhbl9kZWZhdWx0Cit9OworCitlbnVtIGFmZmluaXR5X3RvcF9tZXRob2QgeworICAgIGFmZmluaXR5X3RvcF9tZXRob2RfYWxsID0gMCwgLy8gdHJ5IGFsbCAoc3VwcG9ydGVkKSBtZXRob2RzLCBpbiBvcmRlcgorI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKyAgICBhZmZpbml0eV90b3BfbWV0aG9kX2FwaWNpZCwKKyAgICBhZmZpbml0eV90b3BfbWV0aG9kX3gyYXBpY2lkLAorI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKyAgICBhZmZpbml0eV90b3BfbWV0aG9kX2NwdWluZm8sIC8vIEtNUF9DUFVJTkZPX0ZJTEUgaXMgdXNhYmxlIG9uIFdpbmRvd3MqIE9TLCB0b28KKyNpZiBLTVBfT1NfV0lORE9XUyAmJiBLTVBfQVJDSF9YODZfNjQKKyAgICBhZmZpbml0eV90b3BfbWV0aG9kX2dyb3VwLAorI2VuZGlmIC8qIEtNUF9PU19XSU5ET1dTICYmIEtNUF9BUkNIX1g4Nl82NCAqLworICAgIGFmZmluaXR5X3RvcF9tZXRob2RfZmxhdCwKKyAgICBhZmZpbml0eV90b3BfbWV0aG9kX2RlZmF1bHQKK307CisKKyNkZWZpbmUgYWZmaW5pdHlfcmVzcGVjdF9tYXNrX2RlZmF1bHQgICAoLTEpCisKK2V4dGVybiBlbnVtIGFmZmluaXR5X3R5cGUgX19rbXBfYWZmaW5pdHlfdHlwZTsgLyogQWZmaW5pdHkgdHlwZSAqLworZXh0ZXJuIGVudW0gYWZmaW5pdHlfZ3JhbiBfX2ttcF9hZmZpbml0eV9ncmFuOyAvKiBBZmZpbml0eSBncmFudWxhcml0eSAqLworZXh0ZXJuIGludCBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVsczsgLyogY29ycmVzcG9uZGluZyBpbnQgdmFsdWUgKi8KK2V4dGVybiBpbnQgX19rbXBfYWZmaW5pdHlfZHVwczsgLyogQWZmaW5pdHkgZHVwbGljYXRlIG1hc2tzICovCitleHRlcm4gZW51bSBhZmZpbml0eV90b3BfbWV0aG9kIF9fa21wX2FmZmluaXR5X3RvcF9tZXRob2Q7CitleHRlcm4gaW50IF9fa21wX2FmZmluaXR5X2NvbXBhY3Q7IC8qIEFmZmluaXR5ICdjb21wYWN0JyB2YWx1ZSAqLworZXh0ZXJuIGludCBfX2ttcF9hZmZpbml0eV9vZmZzZXQ7IC8qIEFmZmluaXR5IG9mZnNldCB2YWx1ZSAgKi8KK2V4dGVybiBpbnQgX19rbXBfYWZmaW5pdHlfdmVyYm9zZTsgLyogV2FzIHZlcmJvc2Ugc3BlY2lmaWVkIGZvciBLTVBfQUZGSU5JVFk/ICovCitleHRlcm4gaW50IF9fa21wX2FmZmluaXR5X3dhcm5pbmdzOyAvKiBLTVBfQUZGSU5JVFkgd2FybmluZ3MgZW5hYmxlZCA/ICovCitleHRlcm4gaW50IF9fa21wX2FmZmluaXR5X3Jlc3BlY3RfbWFzazsgLyogUmVzcGVjdCBwcm9jZXNzJyBpbml0aWFsIGFmZmluaXR5IG1hc2s/ICovCitleHRlcm4gY2hhciAqIF9fa21wX2FmZmluaXR5X3Byb2NsaXN0OyAvKiBwcm9jIElEIGxpc3QgKi8KK2V4dGVybiBrbXBfYWZmaW5fbWFza190ICpfX2ttcF9hZmZpbml0eV9tYXNrczsKK2V4dGVybiB1bnNpZ25lZCBfX2ttcF9hZmZpbml0eV9udW1fbWFza3M7CitleHRlcm4gaW50IF9fa21wX2dldF9zeXN0ZW1fYWZmaW5pdHkoa21wX2FmZmluX21hc2tfdCAqbWFzaywgaW50IGFib3J0X29uX2Vycm9yKTsKK2V4dGVybiBpbnQgX19rbXBfc2V0X3N5c3RlbV9hZmZpbml0eShrbXBfYWZmaW5fbWFza190IGNvbnN0ICptYXNrLCBpbnQgYWJvcnRfb25fZXJyb3IpOworZXh0ZXJuIHZvaWQgX19rbXBfYWZmaW5pdHlfYmluZF90aHJlYWQoaW50IHdoaWNoKTsKKworIyBpZiBLTVBfT1NfTElOVVgKK2V4dGVybiBrbXBfYWZmaW5fbWFza190ICpfX2ttcF9hZmZpbml0eV9nZXRfZnVsbE1hc2soKTsKKyMgZW5kaWYgLyogS01QX09TX0xJTlVYICovCitleHRlcm4gY2hhciBjb25zdCAqIF9fa21wX2NwdWluZm9fZmlsZTsKKworI2VuZGlmIC8qIEtNUF9BRkZJTklUWV9TVVBQT1JURUQgKi8KKworI2lmIE9NUF80MF9FTkFCTEVECisKKy8vCisvLyBUaGlzIG5lZWRzIHRvIGJlIGtlcHQgaW4gc3luYyB3aXRoIHRoZSB2YWx1ZXMgaW4gb21wLmggISEhCisvLwordHlwZWRlZiBlbnVtIGttcF9wcm9jX2JpbmRfdCB7CisgICAgcHJvY19iaW5kX2ZhbHNlID0gMCwKKyAgICBwcm9jX2JpbmRfdHJ1ZSwKKyAgICBwcm9jX2JpbmRfbWFzdGVyLAorICAgIHByb2NfYmluZF9jbG9zZSwKKyAgICBwcm9jX2JpbmRfc3ByZWFkLAorICAgIHByb2NfYmluZF9kaXNhYmxlZCwKKyAgICBwcm9jX2JpbmRfaW50ZWwsICAgIC8vIHVzZSBLTVBfQUZGSU5JVFkgaW50ZXJmYWNlCisgICAgcHJvY19iaW5kX2RlZmF1bHQKK30ga21wX3Byb2NfYmluZF90OworCit0eXBlZGVmIHN0cnVjdCBrbXBfbmVzdGVkX3Byb2NfYmluZF90IHsKKyAgICBrbXBfcHJvY19iaW5kX3QgKmJpbmRfdHlwZXM7CisgICAgaW50IHNpemU7CisgICAgaW50IHVzZWQ7Cit9IGttcF9uZXN0ZWRfcHJvY19iaW5kX3Q7CisKK2V4dGVybiBrbXBfbmVzdGVkX3Byb2NfYmluZF90IF9fa21wX25lc3RlZF9wcm9jX2JpbmQ7CisKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworCisjIGlmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyMgIGRlZmluZSBLTVBfUExBQ0VfQUxMICAgICAgICgtMSkKKyMgIGRlZmluZSBLTVBfUExBQ0VfVU5ERUZJTkVEICgtMikKKyMgZW5kaWYgLyogS01QX0FGRklOSVRZX1NVUFBPUlRFRCAqLworCitleHRlcm4gaW50IF9fa21wX2FmZmluaXR5X251bV9wbGFjZXM7CisKKworI2lmIE9NUF80MF9FTkFCTEVECit0eXBlZGVmIGVudW0ga21wX2NhbmNlbF9raW5kX3QgeworICAgIGNhbmNlbF9ub3JlcSA9IDAsCisgICAgY2FuY2VsX3BhcmFsbGVsID0gMSwKKyAgICBjYW5jZWxfbG9vcCA9IDIsCisgICAgY2FuY2VsX3NlY3Rpb25zID0gMywKKyAgICBjYW5jZWxfdGFza2dyb3VwID0gNAorfSBrbXBfY2FuY2VsX2tpbmRfdDsKKyNlbmRpZiAvLyBPTVBfNDBfRU5BQkxFRAorCisjaWYgS01QX01JQworZXh0ZXJuIHVuc2lnbmVkIGludCBfX2ttcF9wbGFjZV9udW1fY29yZXM7CitleHRlcm4gdW5zaWduZWQgaW50IF9fa21wX3BsYWNlX251bV90aHJlYWRzX3Blcl9jb3JlOworZXh0ZXJuIHVuc2lnbmVkIGludCBfX2ttcF9wbGFjZV9jb3JlX29mZnNldDsKKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIEtNUF9QQUQodHlwZSwgc3opICAgICAoc2l6ZW9mKHR5cGUpICsgKHN6IC0gKChzaXplb2YodHlwZSkgLSAxKSAlIChzeikpIC0gMSkpCisKKy8vCisvLyBXZSBuZWVkIHRvIGF2b2lkIHVzaW5nIC0xIGFzIGEgR1RJRCBhcyArMSBpcyBhZGRlZCB0byB0aGUgZ3RpZAorLy8gd2hlbiBzdG9yaW5nIGl0IGluIGEgbG9jaywgYW5kIHRoZSB2YWx1ZSAwIGlzIHJlc2VydmVkLgorLy8KKyNkZWZpbmUgS01QX0dUSURfRE5FICAgICAgICAgICAgKC0yKSAgICAvKiBEb2VzIG5vdCBleGlzdCAqLworI2RlZmluZSBLTVBfR1RJRF9TSFVURE9XTiAgICAgICAoLTMpICAgIC8qIExpYnJhcnkgaXMgc2h1dHRpbmcgZG93biAqLworI2RlZmluZSBLTVBfR1RJRF9NT05JVE9SICAgICAgICAoLTQpICAgIC8qIE1vbml0b3IgdGhyZWFkIElEICovCisjZGVmaW5lIEtNUF9HVElEX1VOS05PV04gICAgICAgICgtNSkgICAgLyogSXMgbm90IGtub3duICovCisjZGVmaW5lIEtNUF9HVElEX01JTiAgICAgICAgICAgICgtNikgICAgLyogTWluaW1hbCBndGlkIGZvciBsb3cgYm91bmQgY2hlY2sgaW4gREVCVUcgKi8KKworI2RlZmluZSBfX2ttcF9nZXRfZ3RpZCgpICAgICAgICAgICAgICAgX19rbXBfZ2V0X2dsb2JhbF90aHJlYWRfaWQoKQorI2RlZmluZSBfX2ttcF9lbnRyeV9ndGlkKCkgICAgICAgICAgICAgX19rbXBfZ2V0X2dsb2JhbF90aHJlYWRfaWRfcmVnKCkKKworI2RlZmluZSBfX2ttcF90aWRfZnJvbV9ndGlkKGd0aWQpICAgICAoIEtNUF9ERUJVR19BU1NFUlQoIChndGlkKSA+PSAwICksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF90aHJlYWRzWyAoZ3RpZCkgXS0+dGgudGhfaW5mby5kcy5kc190aWQgKQorCisjZGVmaW5lIF9fa21wX2dldF90aWQoKSAgICAgICAgICAgICAgICggX19rbXBfdGlkX2Zyb21fZ3RpZCggX19rbXBfZ2V0X2d0aWQoKSApICkKKyNkZWZpbmUgX19rbXBfZ3RpZF9mcm9tX3RpZCh0aWQsdGVhbSkgKCBLTVBfREVCVUdfQVNTRVJUKCAodGlkKSA+PSAwICYmICh0ZWFtKSAhPSBOVUxMICksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWFtIC0+IHQudF90aHJlYWRzWyAodGlkKSBdIC0+IHRoLnRoX2luZm8gLmRzLmRzX2d0aWQgKQorCisjZGVmaW5lIF9fa21wX2dldF90ZWFtKCkgICAgICAgICAgICAgICggX19rbXBfdGhyZWFkc1sgKF9fa21wX2dldF9ndGlkKCkpIF0tPiB0aC50aF90ZWFtICkKKyNkZWZpbmUgX19rbXBfdGVhbV9mcm9tX2d0aWQoZ3RpZCkgICAgKCBLTVBfREVCVUdfQVNTRVJUKCAoZ3RpZCkgPj0gMCApLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfdGhyZWFkc1sgKGd0aWQpIF0tPiB0aC50aF90ZWFtICkKKworI2RlZmluZSBfX2ttcF90aHJlYWRfZnJvbV9ndGlkKGd0aWQpICAoIEtNUF9ERUJVR19BU1NFUlQoIChndGlkKSA+PSAwICksIF9fa21wX3RocmVhZHNbIChndGlkKSBdICkKKyNkZWZpbmUgX19rbXBfZ2V0X3RocmVhZCgpICAgICAgICAgICAgKCBfX2ttcF90aHJlYWRfZnJvbV9ndGlkKCBfX2ttcF9nZXRfZ3RpZCgpICkgKQorCisgICAgLy8gUmV0dXJucyBjdXJyZW50IHRocmVhZCAocG9pbnRlciB0byBrbXBfaW5mb190KS4gSW4gY29udHJhc3QgdG8gX19rbXBfZ2V0X3RocmVhZCgpLCBpdCB3b3JrcworICAgIC8vIHdpdGggcmVnaXN0ZXJlZCBhbmQgbm90LXlldC1yZWdpc3RlcmVkIHRocmVhZHMuCisjZGVmaW5lIF9fa21wX2d0aWRfZnJvbV90aHJlYWQodGhyKSAgICggS01QX0RFQlVHX0FTU0VSVCggKHRocikgIT0gTlVMTCApLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRociktPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCApCisKKy8vIEFUOiBXaGljaCB3YXkgaXMgY29ycmVjdD8KKy8vIEFUOiAxLiBucHJvYyA9IF9fa21wX3RocmVhZHNbICggZ3RpZCApIF0gLT4gdGgudGhfdGVhbSAtPiB0LnRfbnByb2M7CisvLyBBVDogMi4gbnByb2MgPSBfX2ttcF90aHJlYWRzWyAoIGd0aWQgKSBdIC0+IHRoLnRoX3RlYW1fbnByb2M7CisjZGVmaW5lIF9fa21wX2dldF90ZWFtX251bV90aHJlYWRzKGd0aWQpICggX19rbXBfdGhyZWFkc1sgKCBndGlkICkgXSAtPiB0aC50aF90ZWFtIC0+IHQudF9ucHJvYyApCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBLTVBfVUlOVDY0X01BWCAgICAgICAgICh+KChrbXBfdWludDY0KTE8PCgoc2l6ZW9mKGttcF91aW50NjQpKigxPDwzKSktMSkpKQorCisjZGVmaW5lIEtNUF9NSU5fTlRIICAgICAgICAgICAxCisKKyNpZm5kZWYgS01QX01BWF9OVEgKKyMgIGlmZGVmIFBUSFJFQURfVEhSRUFEU19NQVgKKyMgICAgZGVmaW5lIEtNUF9NQVhfTlRIICAgICAgICAgIFBUSFJFQURfVEhSRUFEU19NQVgKKyMgIGVsc2UKKyMgICAgZGVmaW5lIEtNUF9NQVhfTlRIICAgICAgICAgICgzMiAqIDEwMjQpCisjICBlbmRpZgorI2VuZGlmIC8qIEtNUF9NQVhfTlRIICovCisKKyNpZmRlZiBQVEhSRUFEX1NUQUNLX01JTgorIyBkZWZpbmUgS01QX01JTl9TVEtTSVpFICAgICAgICAgUFRIUkVBRF9TVEFDS19NSU4KKyNlbHNlCisjIGRlZmluZSBLTVBfTUlOX1NUS1NJWkUgICAgICAgICAoKHNpemVfdCkoMzIgKiAxMDI0KSkKKyNlbmRpZgorCisjZGVmaW5lIEtNUF9NQVhfU1RLU0laRSAgICAgICAgICAofigoc2l6ZV90KTE8PCgoc2l6ZW9mKHNpemVfdCkqKDE8PDMpKS0xKSkpCisKKyNpZiBLTVBfQVJDSF9YODYKKyMgZGVmaW5lIEtNUF9ERUZBVUxUX1NUS1NJWkUgICAgICgoc2l6ZV90KSgyICogMTAyNCAqIDEwMjQpKQorI2VsaWYgS01QX0FSQ0hfWDg2XzY0CisjIGRlZmluZSBLTVBfREVGQVVMVF9TVEtTSVpFICAgICAoKHNpemVfdCkoNCAqIDEwMjQgKiAxMDI0KSkKKyMgZGVmaW5lIEtNUF9CQUNLVVBfU1RLU0laRSAgICAgICgoc2l6ZV90KSgyICogMTAyNCAqIDEwMjQpKQorI2Vsc2UKKyMgZGVmaW5lIEtNUF9ERUZBVUxUX1NUS1NJWkUgICAgICgoc2l6ZV90KSgxMDI0ICogMTAyNCkpCisjZW5kaWYKKworI2RlZmluZSBLTVBfREVGQVVMVF9NT05JVE9SX1NUS1NJWkUgICAgICgoc2l6ZV90KSg2NCAqIDEwMjQpKQorCisjZGVmaW5lIEtNUF9ERUZBVUxUX01BTExPQ19QT09MX0lOQ1IgICAgKChzaXplX3QpICgxMDI0ICogMTAyNCkpCisjZGVmaW5lIEtNUF9NSU5fTUFMTE9DX1BPT0xfSU5DUiAgICAgICAgKChzaXplX3QpICg0ICogMTAyNCkpCisjZGVmaW5lIEtNUF9NQVhfTUFMTE9DX1BPT0xfSU5DUiAgICAgICAgKH4oKHNpemVfdCkxPDwoKHNpemVvZihzaXplX3QpKigxPDwzKSktMSkpKQorCisjZGVmaW5lIEtNUF9NSU5fU1RLT0ZGU0VUICAgICAgICgwKQorI2RlZmluZSBLTVBfTUFYX1NUS09GRlNFVCAgICAgICBLTVBfTUFYX1NUS1NJWkUKKyNkZWZpbmUgS01QX0RFRkFVTFRfU1RLT0ZGU0VUICAgS01QX01JTl9TVEtPRkZTRVQKKworI2RlZmluZSBLTVBfTUlOX1NUS1BBRERJTkcgICAgICAoMCkKKyNkZWZpbmUgS01QX01BWF9TVEtQQURESU5HICAgICAgKDIgKiAxMDI0ICogMTAyNCkKKworI2RlZmluZSBLTVBfTUlOX01PTklUT1JfV0FLRVVQUyAgICAgICgxKSAgICAgICAvKiBtaW4gbnVtYmVyIG9mIHRpbWVzIG1vbml0b3Igd2FrZXMgdXAgcGVyIHNlY29uZCAqLworI2RlZmluZSBLTVBfTUFYX01PTklUT1JfV0FLRVVQUyAgICAgICgxMDAwKSAgICAvKiBtYXhpbXVtIG51bWJlciBvZiB0aW1lcyBtb25pdG9yIGNhbiB3YWtlIHVwIHBlciBzZWNvbmQgKi8KKyNkZWZpbmUgS01QX0JMT0NLVElNRV9NVUxUSVBMSUVSICAgICAoMTAwMCkgICAgLyogbnVtYmVyIG9mIGJsb2NrdGltZSB1bml0cyBwZXIgc2Vjb25kICovCisjZGVmaW5lIEtNUF9NSU5fQkxPQ0tUSU1FICAgICAgICAgICAgKDApCisjZGVmaW5lIEtNUF9NQVhfQkxPQ0tUSU1FICAgICAgICAgICAgKElOVF9NQVgpIC8qIE11c3QgYmUgdGhpcyBmb3IgImluZmluaXRlIiBzZXR0aW5nIHRoZSB3b3JrICovCisjZGVmaW5lIEtNUF9ERUZBVUxUX0JMT0NLVElNRSAgICAgICAgKDIwMCkgICAgIC8qICBfX2ttcF9ibG9ja3RpbWUgaXMgaW4gbWlsbGlzZWNvbmRzICAqLworLyogQ2FsY3VsYXRlIG5ldyBudW1iZXIgb2YgbW9uaXRvciB3YWtldXBzIGZvciBhIHNwZWNpZmljIGJsb2NrIHRpbWUgYmFzZWQgb24gcHJldmlvdXMgbW9uaXRvcl93YWtldXBzICovCisvKiBPbmx5IGFsbG93IGluY3JlYXNpbmcgbnVtYmVyIG9mIHdha2V1cHMgKi8KKyNkZWZpbmUgS01QX1dBS0VVUFNfRlJPTV9CTE9DS1RJTUUoYmxvY2t0aW1lLCBtb25pdG9yX3dha2V1cHMpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggKChibG9ja3RpbWUpID09IEtNUF9NQVhfQkxPQ0tUSU1FKSA/IChtb25pdG9yX3dha2V1cHMpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGJsb2NrdGltZSkgPT0gS01QX01JTl9CTE9DS1RJTUUpID8gS01QX01BWF9NT05JVE9SX1dBS0VVUFMgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgobW9uaXRvcl93YWtldXBzKSA+IChLTVBfQkxPQ0tUSU1FX01VTFRJUExJRVIgLyAoYmxvY2t0aW1lKSkpID8gKG1vbml0b3Jfd2FrZXVwcykgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoS01QX0JMT0NLVElNRV9NVUxUSVBMSUVSKSAvIChibG9ja3RpbWUpICkKKworLyogQ2FsY3VsYXRlIG51bWJlciBvZiBpbnRlcnZhbHMgZm9yIGEgc3BlY2lmaWMgYmxvY2sgdGltZSBiYXNlZCBvbiBtb25pdG9yX3dha2V1cHMgKi8KKyNkZWZpbmUgS01QX0lOVEVSVkFMU19GUk9NX0JMT0NLVElNRShibG9ja3RpbWUsIG1vbml0b3Jfd2FrZXVwcykgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggKCAoYmxvY2t0aW1lKSArIChLTVBfQkxPQ0tUSU1FX01VTFRJUExJRVIgLyAobW9uaXRvcl93YWtldXBzKSkgLSAxICkgLyAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoS01QX0JMT0NLVElNRV9NVUxUSVBMSUVSIC8gKG1vbml0b3Jfd2FrZXVwcykpICkKKworI2RlZmluZSBLTVBfTUlOX1NUQVRTQ09MUyAgICAgICA0MAorI2RlZmluZSBLTVBfTUFYX1NUQVRTQ09MUyAgICAgICA0MDk2CisjZGVmaW5lIEtNUF9ERUZBVUxUX1NUQVRTQ09MUyAgIDgwCisKKyNkZWZpbmUgS01QX01JTl9JTlRFUlZBTCAgICAgICAgMAorI2RlZmluZSBLTVBfTUFYX0lOVEVSVkFMICAgICAgICAoSU5UX01BWC0xKQorI2RlZmluZSBLTVBfREVGQVVMVF9JTlRFUlZBTCAgICAwCisKKyNkZWZpbmUgS01QX01JTl9DSFVOSyAgICAgICAgICAgMQorI2RlZmluZSBLTVBfTUFYX0NIVU5LICAgICAgICAgICAoSU5UX01BWC0xKQorI2RlZmluZSBLTVBfREVGQVVMVF9DSFVOSyAgICAgICAxCisKKyNkZWZpbmUgS01QX01JTl9JTklUX1dBSVQgICAgICAgMQorI2RlZmluZSBLTVBfTUFYX0lOSVRfV0FJVCAgICAgICAoSU5UX01BWC8yKQorI2RlZmluZSBLTVBfREVGQVVMVF9JTklUX1dBSVQgICAyMDQ4VQorCisjZGVmaW5lIEtNUF9NSU5fTkVYVF9XQUlUICAgICAgIDEKKyNkZWZpbmUgS01QX01BWF9ORVhUX1dBSVQgICAgICAgKElOVF9NQVgvMikKKyNkZWZpbmUgS01QX0RFRkFVTFRfTkVYVF9XQUlUICAgMTAyNFUKKworLy8gbWF4IHBvc3NpYmxlIGR5bmFtaWMgbG9vcHMgaW4gY29uY3VycmVudCBleGVjdXRpb24gcGVyIHRlYW0KKyNkZWZpbmUgS01QX01BWF9ESVNQX0JVRiAgICAgICAgNworI2RlZmluZSBLTVBfTUFYX09SREVSRUQgICAgICAgICA4CisKKyNkZWZpbmUgS01QX01BWF9GSUVMRFMgICAgICAgICAgMzIKKworI2RlZmluZSBLTVBfTUFYX0JSQU5DSF9CSVRTICAgICAzMQorCisjZGVmaW5lIEtNUF9NQVhfQUNUSVZFX0xFVkVMU19MSU1JVCBJTlRfTUFYCisKKy8qIE1pbmltdW0gbnVtYmVyIG9mIHRocmVhZHMgYmVmb3JlIHN3aXRjaCB0byBUTFMgZ3RpZCAoZXhwZXJpbWVudGFsbHkgZGV0ZXJtaW5lZCkgKi8KKy8qIGpvc2ggVE9ETzogd2hhdCBhYm91dCBPUyBYKiB0dW5pbmc/ICovCisjaWYgICBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisjIGRlZmluZSBLTVBfVExTX0dUSURfTUlOICAgICA1CisjZWxzZQorIyBkZWZpbmUgS01QX1RMU19HVElEX01JTiAgICAgSU5UX01BWAorI2VuZGlmCisKKyNkZWZpbmUgS01QX01BU1RFUl9USUQodGlkKSAgICAgICggKHRpZCkgPT0gMCApCisjZGVmaW5lIEtNUF9XT1JLRVJfVElEKHRpZCkgICAgICAoICh0aWQpICE9IDAgKQorCisjZGVmaW5lIEtNUF9NQVNURVJfR1RJRChndGlkKSAgICAoIF9fa21wX3RpZF9mcm9tX2d0aWQoKGd0aWQpKSA9PSAwICkKKyNkZWZpbmUgS01QX1dPUktFUl9HVElEKGd0aWQpICAgICggX19rbXBfdGlkX2Zyb21fZ3RpZCgoZ3RpZCkpICE9IDAgKQorI2RlZmluZSBLTVBfVUJFUl9HVElEKGd0aWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIChndGlkKSA+PSBLTVBfR1RJRF9NSU4gKSwgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCAoZ3RpZCkgPCBfX2ttcF90aHJlYWRzX2NhcGFjaXR5ICksICAgICAgICAgIFwKKyAgICAgICAgKGd0aWQpID49IDAgJiYgX19rbXBfcm9vdFsoZ3RpZCldICYmIF9fa21wX3RocmVhZHNbKGd0aWQpXSAmJiBcCisgICAgICAgIChfX2ttcF90aHJlYWRzWyhndGlkKV0gPT0gX19rbXBfcm9vdFsoZ3RpZCldLT5yLnJfdWJlcl90aHJlYWQpXAorICAgICkKKyNkZWZpbmUgS01QX0lOSVRJQUxfR1RJRChndGlkKSAgICggKGd0aWQpID09IDAgKQorCisjaWZuZGVmIFRSVUUKKyNkZWZpbmUgRkFMU0UgICAwCisjZGVmaW5lIFRSVUUgICAgKCEgRkFMU0UpCisjZW5kaWYKKworLyogTk9URTogYWxsIG9mIHRoZSBmb2xsb3dpbmcgY29uc3RhbnRzIG11c3QgYmUgZXZlbiAqLworCisjaWYgS01QX09TX1dJTkRPV1MKKyMgIGRlZmluZSBLTVBfSU5JVF9XQUlUICAgIDY0VSAgICAgICAgICAvKiBpbml0aWFsIG51bWJlciBvZiBzcGluLXRlc3RzICAgKi8KKyMgIGRlZmluZSBLTVBfTkVYVF9XQUlUICAgIDMyVSAgICAgICAgICAvKiBzdXNlcXVlbnQgbnVtYmVyIG9mIHNwaW4tdGVzdHMgKi8KKyNlbGlmIEtNUF9PU19DTksKKyMgIGRlZmluZSBLTVBfSU5JVF9XQUlUICAgIDE2VSAgICAgICAgICAvKiBpbml0aWFsIG51bWJlciBvZiBzcGluLXRlc3RzICAgKi8KKyMgIGRlZmluZSBLTVBfTkVYVF9XQUlUICAgICA4VSAgICAgICAgICAvKiBzdXNlcXVlbnQgbnVtYmVyIG9mIHNwaW4tdGVzdHMgKi8KKyNlbGlmIEtNUF9PU19MSU5VWAorIyAgZGVmaW5lIEtNUF9JTklUX1dBSVQgIDEwMjRVICAgICAgICAgIC8qIGluaXRpYWwgbnVtYmVyIG9mIHNwaW4tdGVzdHMgICAqLworIyAgZGVmaW5lIEtNUF9ORVhUX1dBSVQgICA1MTJVICAgICAgICAgIC8qIHN1c2VxdWVudCBudW1iZXIgb2Ygc3Bpbi10ZXN0cyAqLworI2VsaWYgS01QX09TX0RBUldJTgorLyogVE9ETzogdHVuZSBmb3IgS01QX09TX0RBUldJTiAqLworIyAgZGVmaW5lIEtNUF9JTklUX1dBSVQgIDEwMjRVICAgICAgICAgIC8qIGluaXRpYWwgbnVtYmVyIG9mIHNwaW4tdGVzdHMgICAqLworIyAgZGVmaW5lIEtNUF9ORVhUX1dBSVQgICA1MTJVICAgICAgICAgIC8qIHN1c2VxdWVudCBudW1iZXIgb2Ygc3Bpbi10ZXN0cyAqLworI2VsaWYgS01QX09TX0ZSRUVCU0QKKy8qIFRPRE86IHR1bmUgZm9yIEtNUF9PU19GUkVFQlNEICovCisjICBkZWZpbmUgS01QX0lOSVRfV0FJVCAgMTAyNFUgICAgICAgICAgLyogaW5pdGlhbCBudW1iZXIgb2Ygc3Bpbi10ZXN0cyAgICovCisjICBkZWZpbmUgS01QX05FWFRfV0FJVCAgIDUxMlUgICAgICAgICAgLyogc3VzZXF1ZW50IG51bWJlciBvZiBzcGluLXRlc3RzICovCisjZW5kaWYKKworI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKK3N0cnVjdCBrbXBfY3B1aWQgeworICAgIGttcF91aW50MzIgIGVheDsKKyAgICBrbXBfdWludDMyICBlYng7CisgICAga21wX3VpbnQzMiAgZWN4OworICAgIGttcF91aW50MzIgIGVkeDsKK307CitleHRlcm4gdm9pZCBfX2ttcF94ODZfY3B1aWQoIGludCBtb2RlLCBpbnQgbW9kZTIsIHN0cnVjdCBrbXBfY3B1aWQgKnAgKTsKKyMgaWYgS01QX0FSQ0hfWDg2CisgIGV4dGVybiB2b2lkIF9fa21wX3g4Nl9wYXVzZSggdm9pZCApOworIyBlbGlmIEtNUF9NSUMKKyAgc3RhdGljIHZvaWQgX19rbXBfeDg2X3BhdXNlKCB2b2lkICkgeyBfbW1fZGVsYXlfMzIoIDEwMCApOyB9OworIyBlbHNlCisgIHN0YXRpYyB2b2lkIF9fa21wX3g4Nl9wYXVzZSggdm9pZCApIHsgX21tX3BhdXNlKCk7IH07CisjIGVuZGlmCisjIGRlZmluZSBLTVBfQ1BVX1BBVVNFKCkgX19rbXBfeDg2X3BhdXNlKCkKKyNlbGlmIEtNUF9BUkNIX1BQQzY0CisjIGRlZmluZSBLTVBfUFBDNjRfUFJJX0xPVygpIF9fYXNtX18gdm9sYXRpbGUgKCJvciAxLCAxLCAxIikKKyMgZGVmaW5lIEtNUF9QUEM2NF9QUklfTUVEKCkgX19hc21fXyB2b2xhdGlsZSAoIm9yIDIsIDIsIDIiKQorIyBkZWZpbmUgS01QX1BQQzY0X1BSSV9MT0NfTUIoKSBfX2FzbV9fIHZvbGF0aWxlICgiIiA6IDogOiAibWVtb3J5IikKKyMgZGVmaW5lIEtNUF9DUFVfUEFVU0UoKSBkbyB7IEtNUF9QUEM2NF9QUklfTE9XKCk7IEtNUF9QUEM2NF9QUklfTUVEKCk7IEtNUF9QUEM2NF9QUklfTE9DX01CKCk7IH0gd2hpbGUgKDApCisjZWxzZQorIyBkZWZpbmUgS01QX0NQVV9QQVVTRSgpICAgICAgICAvKiBub3RoaW5nIHRvIGRvICovCisjZW5kaWYKKworI2RlZmluZSBLTVBfSU5JVF9ZSUVMRChjb3VudCkgICAgICAgICAgIHsgKGNvdW50KSA9IF9fa21wX3lpZWxkX2luaXQ7IH0KKworI2RlZmluZSBLTVBfWUlFTEQoY29uZCkgICAgICAgICAgICAgICAgIHsgS01QX0NQVV9QQVVTRSgpOyBfX2ttcF95aWVsZCggKGNvbmQpICk7IH0KKworLy8gTm90ZSB0aGUgZGVjcmVtZW50IG9mIDIgaW4gdGhlIGZvbGxvd2luZyBNYWNyb3MuICBXaXRoIEtNUF9MSUJSQVJZPXR1cm5hcm91bmQsCisvLyB0aGVyZSBzaG91bGQgYmUgbm8geWllbGRpbmcgc2luY2UgdGhlIHN0YXJ0aW5nIHZhbHVlIGZyb20gS01QX0lOSVRfWUlFTEQoKSBpcyBvZGQuCisKKyNkZWZpbmUgS01QX1lJRUxEX1dIRU4oY29uZCxjb3VudCkgICAgICB7IEtNUF9DUFVfUEFVU0UoKTsgKGNvdW50KSAtPSAyOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShjb3VudCkpIHsgS01QX1lJRUxEKGNvbmQpOyAoY291bnQpID0gX19rbXBfeWllbGRfbmV4dDsgfSB9CisjZGVmaW5lIEtNUF9ZSUVMRF9TUElOKGNvdW50KSAgICAgICAgICAgeyBLTVBfQ1BVX1BBVVNFKCk7IChjb3VudCkgLT0yOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShjb3VudCkpIHsgS01QX1lJRUxEKDEpOyAoY291bnQpID0gX19rbXBfeWllbGRfbmV4dDsgfSB9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogU3VwcG9ydCBkYXRhdHlwZXMgZm9yIHRoZSBvcnBoYW5lZCBjb25zdHJ1Y3QgbmVzdGluZyBjaGVja3MuICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworZW51bSBjb25zX3R5cGUgeworICAgIGN0X25vbmUsCisgICAgY3RfcGFyYWxsZWwsCisgICAgY3RfcGRvLAorICAgIGN0X3Bkb19vcmRlcmVkLAorICAgIGN0X3BzZWN0aW9ucywKKyAgICBjdF9wc2luZ2xlLAorCisgICAgLyogdGhlIGZvbGxvd2luZyBtdXN0IGJlIGxlZnQgaW4gb3JkZXIgYW5kIG5vdCBzcGxpdCB1cCAqLworICAgIGN0X3Rhc2txLAorICAgIGN0X3Rhc2ssICAgICAgICAgICAgICAgICAgICAvKiByZWFsbHkgdGFzayBpbnNpZGUgbm9uLW9yZGVyZWQgdGFza3EsIGNvbnNpZGVyZWQgYSB3b3Jrc2hhcmluZyB0eXBlICovCisgICAgY3RfdGFza19vcmRlcmVkLCAgICAgICAgICAgIC8qIHJlYWxseSB0YXNrIGluc2lkZSBvcmRlcmVkIHRhc2txLCBjb25zaWRlcmVkIGEgd29ya3NoYXJpbmcgdHlwZSAqLworICAgIC8qIHRoZSBwcmVjZWRpbmcgbXVzdCBiZSBsZWZ0IGluIG9yZGVyIGFuZCBub3Qgc3BsaXQgdXAgKi8KKworICAgIGN0X2NyaXRpY2FsLAorICAgIGN0X29yZGVyZWRfaW5fcGFyYWxsZWwsCisgICAgY3Rfb3JkZXJlZF9pbl9wZG8sCisgICAgY3Rfb3JkZXJlZF9pbl90YXNrcSwKKyAgICBjdF9tYXN0ZXIsCisgICAgY3RfcmVkdWNlLAorICAgIGN0X2JhcnJpZXIKK307CisKKy8qIHRlc3QgdG8gc2VlIGlmIHdlIGFyZSBpbiBhIHRhc2txIGNvbnN0cnVjdCAqLworIyBkZWZpbmUgSVNfQ09OU19UWVBFX1RBU0tRKCBjdCApICAgICAgICggKChpbnQpKGN0KSkgPj0gKChpbnQpY3RfdGFza3EpICYmICgoaW50KShjdCkpIDw9ICgoaW50KWN0X3Rhc2tfb3JkZXJlZCkgKQorIyBkZWZpbmUgSVNfQ09OU19UWVBFX09SREVSRUQoIGN0ICkgICAgICgoY3QpID09IGN0X3Bkb19vcmRlcmVkIHx8IChjdCkgPT0gY3RfdGFza19vcmRlcmVkKQorCitzdHJ1Y3QgY29uc19kYXRhIHsKKyAgICBpZGVudF90IGNvbnN0ICAgICAqaWRlbnQ7CisgICAgZW51bSBjb25zX3R5cGUgICAgIHR5cGU7CisgICAgaW50ICAgICAgICAgICAgICAgIHByZXY7CisgICAga21wX3VzZXJfbG9ja19wICAgIG5hbWU7ICAgIC8qIGFkZHJlc3MgZXhjbHVzaXZlbHkgZm9yIGNyaXRpY2FsIHNlY3Rpb24gbmFtZSBjb21wYXJpc29uICovCit9OworCitzdHJ1Y3QgY29uc19oZWFkZXIgeworICAgIGludCAgICAgICAgICAgICAgICAgcF90b3AsIHdfdG9wLCBzX3RvcDsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHN0YWNrX3NpemUsIHN0YWNrX3RvcDsKKyAgICBzdHJ1Y3QgY29uc19kYXRhICAgKnN0YWNrX2RhdGE7Cit9OworCitzdHJ1Y3Qga21wX3JlZ2lvbl9pbmZvIHsKKyAgICBjaGFyICAgICAgICAgICAgICAgICp0ZXh0OworICAgIGludCAgICAgICAgICAgICAgICAgb2Zmc2V0W0tNUF9NQVhfRklFTERTXTsKKyAgICBpbnQgICAgICAgICAgICAgICAgIGxlbmd0aFtLTVBfTUFYX0ZJRUxEU107Cit9OworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmIEtNUF9PU19XSU5ET1dTCisgICAgdHlwZWRlZiBIQU5ETEUgICAgICAgICAgICAgIGttcF90aHJlYWRfdDsKKyAgICB0eXBlZGVmIERXT1JEICAgICAgICAgICAgICAga21wX2tleV90OworI2VuZGlmIC8qIEtNUF9PU19XSU5ET1dTICovCisKKyNpZiBLTVBfT1NfVU5JWAorICAgIHR5cGVkZWYgcHRocmVhZF90ICAgICAgICAgICBrbXBfdGhyZWFkX3Q7CisgICAgdHlwZWRlZiBwdGhyZWFkX2tleV90ICAgICAgIGttcF9rZXlfdDsKKyNlbmRpZgorCitleHRlcm4ga21wX2tleV90ICBfX2ttcF9ndGlkX3RocmVhZHByaXZhdGVfa2V5OworCit0eXBlZGVmIHN0cnVjdCBrbXBfc3lzX2luZm8geworICAgIGxvbmcgbWF4cnNzOyAgICAgICAgICAvKiB0aGUgbWF4aW11bSByZXNpZGVudCBzZXQgc2l6ZSB1dGlsaXplZCAoaW4ga2lsb2J5dGVzKSAgICAgKi8KKyAgICBsb25nIG1pbmZsdDsgICAgICAgICAgLyogdGhlIG51bWJlciBvZiBwYWdlIGZhdWx0cyBzZXJ2aWNlZCB3aXRob3V0IGFueSBJL08gICAgICAgICovCisgICAgbG9uZyBtYWpmbHQ7ICAgICAgICAgIC8qIHRoZSBudW1iZXIgb2YgcGFnZSBmYXVsdHMgc2VydmljZWQgdGhhdCByZXF1aXJlZCBJL08gICAgICAqLworICAgIGxvbmcgbnN3YXA7ICAgICAgICAgICAvKiB0aGUgbnVtYmVyIG9mIHRpbWVzIGEgcHJvY2VzcyB3YXMgInN3YXBwZWQiIG91dCBvZiBtZW1vcnkgKi8KKyAgICBsb25nIGluYmxvY2s7ICAgICAgICAgLyogdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgZmlsZSBzeXN0ZW0gaGFkIHRvIHBlcmZvcm0gaW5wdXQgICovCisgICAgbG9uZyBvdWJsb2NrOyAgICAgICAgIC8qIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGZpbGUgc3lzdGVtIGhhZCB0byBwZXJmb3JtIG91dHB1dCAqLworICAgIGxvbmcgbnZjc3c7ICAgICAgICAgICAvKiB0aGUgbnVtYmVyIG9mIHRpbWVzIGEgY29udGV4dCBzd2l0Y2ggd2FzIHZvbHVudGFyaWx5ICAgICAgKi8KKyAgICBsb25nIG5pdmNzdzsgICAgICAgICAgLyogdGhlIG51bWJlciBvZiB0aW1lcyBhIGNvbnRleHQgc3dpdGNoIHdhcyBmb3JjZWQgICAgICAgICAgICovCit9IGttcF9zeXNfaW5mb190OworCit0eXBlZGVmIHN0cnVjdCBrbXBfY3B1aW5mbyB7CisgICAgaW50ICAgICAgICBpbml0aWFsaXplZDsgIC8vIElmIDAsIG90aGVyIGZpZWxkcyBhcmUgbm90IGluaXRpYWxpemVkLgorICAgIGludCAgICAgICAgc2lnbmF0dXJlOyAgICAvLyBDUFVJRCgxKS5FQVgKKyAgICBpbnQgICAgICAgIGZhbWlseTsgICAgICAgLy8gQ1BVSUQoMSkuRUFYWzI3OjIwXSArIENQVUlEKDEpLkVBWFsxMTo4XSAoIEV4dGVuZGVkIEZhbWlseSArIEZhbWlseSApCisgICAgaW50ICAgICAgICBtb2RlbDsgICAgICAgIC8vICggQ1BVSUQoMSkuRUFYWzE5OjE2XSA8PCA0ICkgKyBDUFVJRCgxKS5FQVhbNzo0XSAoICggRXh0ZW5kZWQgTW9kZWwgPDwgNCApICsgTW9kZWwpCisgICAgaW50ICAgICAgICBzdGVwcGluZzsgICAgIC8vIENQVUlEKDEpLkVBWFszOjBdICggU3RlcHBpbmcgKQorICAgIGludCAgICAgICAgc3NlMjsgICAgICAgICAvLyAwIGlmIFNTRTIgaW5zdHJ1Y3Rpb25zIGFyZSBub3Qgc3VwcG9ydGVkLCAxIG90aGVyd2lzZS4KKyAgICBpbnQgICAgICAgIHJ0bTsgICAgICAgICAgLy8gMCBpZiBSVE0gaW5zdHJ1Y3Rpb25zIGFyZSBub3Qgc3VwcG9ydGVkLCAxIG90aGVyd2lzZS4KKyAgICBpbnQgICAgICAgIGNwdV9zdGFja29mZnNldDsKKyAgICBpbnQgICAgICAgIGFwaWNfaWQ7CisgICAgaW50ICAgICAgICBwaHlzaWNhbF9pZDsKKyAgICBpbnQgICAgICAgIGxvZ2ljYWxfaWQ7CisgICAga21wX3VpbnQ2NCBmcmVxdWVuY3k7ICAgIC8vIE5vbWluYWwgQ1BVIGZyZXF1ZW5jeSBpbiBIei4KK30ga21wX2NwdWluZm9fdDsKKworCisjaWZkZWYgQlVJTERfVFYKKworc3RydWN0IHR2X3RocmVhZHByaXZhdGUgeworICAgIC8qIFJlY29yZCB0eXBlICMxICovCisgICAgdm9pZCAgICAgICAgKmdsb2JhbF9hZGRyOworICAgIHZvaWQgICAgICAgICp0aHJlYWRfYWRkcjsKK307CisKK3N0cnVjdCB0dl9kYXRhIHsKKyAgICBzdHJ1Y3QgdHZfZGF0YSAgICAgICpuZXh0OworICAgIHZvaWQgICAgICAgICAgICAgICAgKnR5cGU7CisgICAgdW5pb24gdHZfdW5pb24geworICAgICAgICBzdHJ1Y3QgdHZfdGhyZWFkcHJpdmF0ZSB0cDsKKyAgICB9IHU7Cit9OworCitleHRlcm4ga21wX2tleV90IF9fa21wX3R2X2tleTsKKworI2VuZGlmIC8qIEJVSUxEX1RWICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgVVNFX0lUVF9CVUlMRAorLy8gV2UgY2Fubm90IGluY2x1ZGUgImttcF9pdHQuaCIgZHVlIHRvIGNpcmN1bGFyIGRlcGVuZGVuY3kuIERlY2xhcmUgdGhlIG9ubHkgcmVxdWlyZWQgdHlwZSBoZXJlLgorLy8gTGF0ZXIgd2Ugd2lsbCBjaGVjayB0aGUgdHlwZSBtZWV0cyByZXF1aXJlbWVudHMuCit0eXBlZGVmIGludCBrbXBfaXR0X21hcmtfdDsKKyNkZWZpbmUgS01QX0lUVF9ERUJVRyAwCisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIFRhc2txIGRhdGEgc3RydWN0dXJlcworICovCisKKyNkZWZpbmUgSElHSF9XQVRFUl9NQVJLKG5zbG90cykgICAgICAgICAoKChuc2xvdHMpICogMykgLyA0KQorI2RlZmluZSBfX0tNUF9UQVNLUV9USFVOS1NfUEVSX1RIICAgICAgICAxICAgICAgLyogbnVtIHRodW5rcyB0aGF0IGVhY2ggdGhyZWFkIGNhbiBzaW11bHRhbmVvdXNseSBleGVjdXRlIGZyb20gYSB0YXNrIHF1ZXVlICovCisKKy8qICBmbGFncyBmb3IgdGFza3FfZ2xvYmFsX2ZsYWdzLCBrbXBfdGFza19xdWV1ZV90IHRxX2ZsYWdzLCBrbXBjX3RodW5rX3QgdGhfZmxhZ3MgICovCisKKyNkZWZpbmUgVFFGX0lTX09SREVSRUQgICAgICAgICAgMHgwMDAxICAvKiAgX19rbXBjX3Rhc2txIGludGVyZmFjZSwgdGFza3Egb3JkZXJlZCAgKi8KKyNkZWZpbmUgVFFGX0lTX0xBU1RQUklWQVRFICAgICAgMHgwMDAyICAvKiAgX19rbXBjX3Rhc2txIGludGVyZmFjZSwgdGFza3Egd2l0aCBsYXN0cHJpdmF0ZSBsaXN0ICAqLworI2RlZmluZSBUUUZfSVNfTk9XQUlUICAgICAgICAgICAweDAwMDQgIC8qICBfX2ttcGNfdGFza3EgaW50ZXJmYWNlLCBlbmQgdGFza3Egbm93YWl0ICAqLworI2RlZmluZSBUUUZfSEVVUklTVElDUyAgICAgICAgICAweDAwMDggIC8qICBfX2ttcGNfdGFza3EgaW50ZXJmYWNlLCB1c2UgaGV1cmlzdGljcyB0byBkZWNpZGUgdGFzayBxdWV1ZSBzaXplICAqLworI2RlZmluZSBUUUZfSU5URVJGQUNFX1JFU0VSVkVEMSAweDAwMTAgIC8qICBfX2ttcGNfdGFza3EgaW50ZXJmYWNlLCByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAgKi8KKyNkZWZpbmUgVFFGX0lOVEVSRkFDRV9SRVNFUlZFRDIgMHgwMDIwICAvKiAgX19rbXBjX3Rhc2txIGludGVyZmFjZSwgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgICovCisjZGVmaW5lIFRRRl9JTlRFUkZBQ0VfUkVTRVJWRUQzIDB4MDA0MCAgLyogIF9fa21wY190YXNrcSBpbnRlcmZhY2UsIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlICAqLworI2RlZmluZSBUUUZfSU5URVJGQUNFX1JFU0VSVkVENCAweDAwODAgIC8qICBfX2ttcGNfdGFza3EgaW50ZXJmYWNlLCByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAgKi8KKworI2RlZmluZSBUUUZfSU5URVJGQUNFX0ZMQUdTICAgICAweDAwZmYgIC8qICBhbGwgdGhlIF9fa21wY190YXNrcSBpbnRlcmZhY2UgZmxhZ3MgICovCisKKyNkZWZpbmUgVFFGX0lTX0xBU1RfVEFTSyAgICAgICAgMHgwMTAwICAvKiAgaW50ZXJuYWwvcmVhZCBieSBpbnN0cnVtZW50YXRpb247IG9ubHkgdXNlZCB3aXRoIFRRRl9JU19MQVNUUFJJVkFURSAgKi8KKyNkZWZpbmUgVFFGX1RBU0tRX1RBU0sgICAgICAgICAgMHgwMjAwICAvKiAgaW50ZXJuYWwgdXNlIG9ubHk7IHRoaXMgdGh1bmstPnRoX3Rhc2sgaXMgdGhlIHRhc2txX3Rhc2sgICovCisjZGVmaW5lIFRRRl9SRUxFQVNFX1dPUktFUlMgICAgIDB4MDQwMCAgLyogIGludGVybmFsIHVzZSBvbmx5OyBtdXN0IHJlbGVhc2Ugd29ya2VyIHRocmVhZHMgb25jZSBBTlkgcXVldWVkIHRhc2sgZXhpc3RzIChnbG9iYWwpICovCisjZGVmaW5lIFRRRl9BTExfVEFTS1NfUVVFVUVEICAgIDB4MDgwMCAgLyogIGludGVybmFsIHVzZSBvbmx5OyBub3RpZnkgd29ya2VycyB0aGF0IG1hc3RlciBoYXMgZmluaXNoZWQgZW5xdWV1aW5nIHRhc2tzICovCisjZGVmaW5lIFRRRl9QQVJBTExFTF9DT05URVhUICAgIDB4MTAwMCAgLyogIGludGVybmFsIHVzZSBvbmx5OiB0aGlzIHF1ZXVlIGVuY291bnRlcmVkIGluIGEgcGFyYWxsZWwgY29udGV4dDogbm90IHNlcmlhbGl6ZWQgKi8KKyNkZWZpbmUgVFFGX0RFQUxMT0NBVEVEICAgICAgICAgMHgyMDAwICAvKiAgaW50ZXJuYWwgdXNlIG9ubHk7IHRoaXMgcXVldWUgaXMgb24gdGhlIGZyZWVsaXN0IGFuZCBub3QgaW4gdXNlICovCisKKyNkZWZpbmUgVFFGX0lOVEVSTkFMX0ZMQUdTICAgICAgMHgzZjAwICAvKiAgYWxsIHRoZSBpbnRlcm5hbCB1c2Ugb25seSBmbGFncyAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgS01QX0FMSUdOX0NBQ0hFIGttcGNfYWxpZ25lZF9pbnQzMl90IHsKKyAgICBrbXBfaW50MzIgICAgICAgICAgICAgICAgICAgICAgYWlfZGF0YTsKK30ga21wY19hbGlnbmVkX2ludDMyX3Q7CisKK3R5cGVkZWYgc3RydWN0IEtNUF9BTElHTl9DQUNIRSBrbXBjX2FsaWduZWRfcXVldWVfc2xvdF90IHsKKyAgICBzdHJ1Y3Qga21wY190aHVua190ICAgKnFzX3RodW5rOworfSBrbXBjX2FsaWduZWRfcXVldWVfc2xvdF90OworCit0eXBlZGVmIHN0cnVjdCBrbXBjX3Rhc2tfcXVldWVfdCB7CisgICAgICAgIC8qIHRhc2sgcXVldWUgbGlua2FnZSBmaWVsZHMgZm9yIG4tYXJ5IHRyZWUgb2YgcXVldWVzIChsb2NrZWQgd2l0aCBnbG9iYWwgdGFza3FfdHJlZV9sY2spICovCisgICAga21wX2xvY2tfdCAgICAgICAgICAgICAgICAgICAgdHFfbGlua19sY2s7ICAgICAgICAgIC8qICBsb2NrIGZvciBjaGlsZCBsaW5rLCBjaGlsZCBuZXh0L3ByZXYgbGlua3MgYW5kIGNoaWxkIHJlZiBjb3VudHMgKi8KKyAgICB1bmlvbiB7CisgICAgICAgIHN0cnVjdCBrbXBjX3Rhc2tfcXVldWVfdCAqdHFfcGFyZW50OyAgICAgICAgICAgIC8qICBwb2ludGVyIHRvIHBhcmVudCB0YXNrcSwgbm90IGxvY2tlZCAqLworICAgICAgICBzdHJ1Y3Qga21wY190YXNrX3F1ZXVlX3QgKnRxX25leHRfZnJlZTsgICAgICAgICAvKiAgZm9yIHRhc2txIGludGVybmFsIGZyZWVsaXN0cywgbG9ja2VkIHdpdGggZ2xvYmFsIHRhc2txX2ZyZWVsaXN0X2xjayAqLworICAgIH0gdHE7CisgICAgdm9sYXRpbGUgc3RydWN0IGttcGNfdGFza19xdWV1ZV90ICp0cV9maXJzdF9jaGlsZDsgIC8qICBwb2ludGVyIHRvIGxpbmtlZC1saXN0IG9mIGNoaWxkcmVuLCBsb2NrZWQgYnkgdHEncyB0cV9saW5rX2xjayAqLworICAgIHN0cnVjdCBrbXBjX3Rhc2tfcXVldWVfdCAgICAgKnRxX25leHRfY2hpbGQ7ICAgICAgICAvKiAgbmV4dCBjaGlsZCBpbiBsaW5rZWQtbGlzdCwgbG9ja2VkIGJ5IHBhcmVudCB0cSdzIHRxX2xpbmtfbGNrICovCisgICAgc3RydWN0IGttcGNfdGFza19xdWV1ZV90ICAgICAqdHFfcHJldl9jaGlsZDsgICAgICAgIC8qICBwcmV2aW91cyBjaGlsZCBpbiBsaW5rZWQtbGlzdCwgbG9ja2VkIGJ5IHBhcmVudCB0cSdzIHRxX2xpbmtfbGNrICovCisgICAgdm9sYXRpbGUga21wX2ludDMyICAgICAgICAgICAgdHFfcmVmX2NvdW50OyAgICAgICAgIC8qICByZWZlcmVuY2UgY291bnQgb2YgdGhyZWFkcyB3aXRoIGFjY2VzcyB0byB0aGlzIHRhc2sgcXVldWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIChvdGhlciB0aGFuIHRoZSB0aHJlYWQgZXhlY3V0aW5nIHRoZSBrbXBjX2VuZF90YXNrcSBjYWxsKSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgbG9ja2VkIGJ5IHBhcmVudCB0cSdzIHRxX2xpbmtfbGNrICovCisKKyAgICAgICAgLyogc2hhcmVkIGRhdGEgZm9yIHRhc2sgcXVldWUgKi8KKyAgICBzdHJ1Y3Qga21wY19hbGlnbmVkX3NoYXJlZF92YXJzX3QgICAgKnRxX3NoYXJlZHM7ICAgLyogIHBlci10aHJlYWQgYXJyYXkgb2YgcG9pbnRlcnMgdG8gc2hhcmVkIHZhcmlhYmxlIHN0cnVjdHVyZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIG9ubHkgb25lIGFycmF5IGVsZW1lbnQgZXhpc3RzIGZvciBhbGwgYnV0IG91dGVybW9zdCB0YXNrcSAqLworCisgICAgICAgIC8qIGJvb2trZWVwaW5nIGZvciBvcmRlcmVkIHRhc2sgcXVldWUgKi8KKyAgICBrbXBfdWludDMyICAgICAgICAgICAgICAgICAgICB0cV90YXNrbnVtX3F1ZXVpbmc7ICAgLyogIG9yZGVyZWQgdGFzayBudW1iZXIgYXNzaWduZWQgd2hpbGUgcXVldWluZyB0YXNrcyAqLworICAgIHZvbGF0aWxlIGttcF91aW50MzIgICAgICAgICAgIHRxX3Rhc2tudW1fc2VydmluZzsgICAvKiAgb3JkZXJlZCBudW1iZXIgb2YgbmV4dCB0YXNrIHRvIGJlIHNlcnZlZCAoZXhlY3V0ZWQpICovCisKKyAgICAgICAgLyogdGh1bmsgc3RvcmFnZSBtYW5hZ2VtZW50IGZvciB0YXNrIHF1ZXVlICovCisgICAga21wX2xvY2tfdCAgICAgICAgICAgICAgICAgICAgdHFfZnJlZV90aHVua3NfbGNrOyAgIC8qICBsb2NrIGZvciB0aHVuayBmcmVlbGlzdCBtYW5pcHVsYXRpb24gKi8KKyAgICBzdHJ1Y3Qga21wY190aHVua190ICAgICAgICAgICp0cV9mcmVlX3RodW5rczsgICAgICAgLyogIHRodW5rIGZyZWVsaXN0LCBjaGFpbmVkIHZpYSB0aC50aF9uZXh0X2ZyZWUgICovCisgICAgc3RydWN0IGttcGNfdGh1bmtfdCAgICAgICAgICAqdHFfdGh1bmtfc3BhY2U7ICAgICAgIC8qICBzcGFjZSBhbGxvY2F0ZWQgZm9yIHRodW5rcyBmb3IgdGhpcyB0YXNrIHF1ZXVlICAqLworCisgICAgICAgIC8qIGRhdGEgZmllbGRzIGZvciBxdWV1ZSBpdHNlbGYgKi8KKyAgICBrbXBfbG9ja190ICAgICAgICAgICAgICAgICAgICB0cV9xdWV1ZV9sY2s7ICAgICAgICAgLyogIGxvY2sgZm9yIFtkZV1lbnF1ZXVlIG9wZXJhdGlvbnM6IHRxX3F1ZXVlLCB0cV9oZWFkLCB0cV90YWlsLCB0cV9uZnVsbCAqLworICAgIGttcGNfYWxpZ25lZF9xdWV1ZV9zbG90X3QgICAgKnRxX3F1ZXVlOyAgICAgICAgICAgICAvKiAgYXJyYXkgb2YgcXVldWUgc2xvdHMgdG8gaG9sZCB0aHVua3MgZm9yIHRhc2tzICovCisgICAgdm9sYXRpbGUgc3RydWN0IGttcGNfdGh1bmtfdCAqdHFfdGFza3Ffc2xvdDsgICAgICAgIC8qICBzcGVjaWFsIHNsb3QgZm9yIHRhc2txIHRhc2sgdGh1bmssIG9jY3VwaWVkIGlmIG5vdCBOVUxMICAqLworICAgIGttcF9pbnQzMiAgICAgICAgICAgICAgICAgICAgIHRxX25zbG90czsgICAgICAgICAgICAvKiAgIyBvZiB0cV90aHVua19zcGFjZSB0aHVua3MgYWxsb2MnZCAobm90IGluY2wuIHRxX3Rhc2txX3Nsb3Qgc3BhY2UpICAqLworICAgIGttcF9pbnQzMiAgICAgICAgICAgICAgICAgICAgIHRxX2hlYWQ7ICAgICAgICAgICAgICAvKiAgZW5xdWV1ZSBwdXRzIG5leHQgaXRlbSBpbiBoZXJlIChpbmRleCBpbnRvIHRxX3F1ZXVlIGFycmF5KSAqLworICAgIGttcF9pbnQzMiAgICAgICAgICAgICAgICAgICAgIHRxX3RhaWw7ICAgICAgICAgICAgICAvKiAgZGVxdWV1ZSB0YWtlcyBuZXh0IGl0ZW0gb3V0IG9mIGhlcmUgKGluZGV4IGludG8gdHFfcXVldWUgYXJyYXkpICovCisgICAgdm9sYXRpbGUga21wX2ludDMyICAgICAgICAgICAgdHFfbmZ1bGw7ICAgICAgICAgICAgIC8qICAjIG9mIG9jY3VwaWVkIGVudHJpZXMgaW4gdGFzayBxdWV1ZSByaWdodCBub3cgICovCisgICAga21wX2ludDMyICAgICAgICAgICAgICAgICAgICAgdHFfaGl3YXQ7ICAgICAgICAgICAgIC8qICBoaWdoLXdhdGVyIG1hcmsgZm9yIHRxX25mdWxsIGFuZCBxdWV1ZSBzY2hlZHVsaW5nICAqLworICAgIHZvbGF0aWxlIGttcF9pbnQzMiAgICAgICAgICAgIHRxX2ZsYWdzOyAgICAgICAgICAgICAvKiAgVFFGX3h4eCAgKi8KKworICAgICAgICAvKiBib29ra2VlcGluZyBmb3Igb3V0c3RhbmRpbmcgdGh1bmtzICovCisgICAgc3RydWN0IGttcGNfYWxpZ25lZF9pbnQzMl90ICAqdHFfdGhfdGh1bmtzOyAgICAgICAgIC8qICBwZXItdGhyZWFkIGFycmF5IGZvciAjIG9mIHJlZ3VsYXIgdGh1bmtzIGN1cnJlbnRseSBiZWluZyBleGVjdXRlZCAqLworICAgIGttcF9pbnQzMiAgICAgICAgICAgICAgICAgICAgIHRxX25wcm9jOyAgICAgICAgICAgICAvKiAgbnVtYmVyIG9mIHRodW5rcyBpbiB0aGUgdGhfdGh1bmtzIGFycmF5ICovCisKKyAgICAgICAgLyogc3RhdGlzdGljcyBsaWJyYXJ5IGJvb2trZWVwaW5nICovCisgICAgaWRlbnRfdCAgICAgICAgICAgICAgICAgICAgICAgKnRxX2xvYzsgICAgICAgICAgICAgIC8qICBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24gZm9yIHRhc2txIGRpcmVjdGl2ZSAqLworfSBrbXBjX3Rhc2tfcXVldWVfdDsKKwordHlwZWRlZiB2b2lkICgqa21wY190YXNrX3QpIChrbXBfaW50MzIgZ2xvYmFsX3RpZCwgc3RydWN0IGttcGNfdGh1bmtfdCAqdGh1bmspOworCisvKiAgc2l6ZW9mX3NoYXJlZHMgcGFzc2VkIGFzIGFyZyB0byBfX2ttcGNfdGFza3EgY2FsbCAgKi8KK3R5cGVkZWYgc3RydWN0IGttcGNfc2hhcmVkX3ZhcnNfdCB7ICAgICAgICAgICAgIC8qICBhbGlnbmVkIGR1cmluZyBkeW5hbWljIGFsbG9jYXRpb24gKi8KKyAgICBrbXBjX3Rhc2tfcXVldWVfdCAgICAgICAgICpzdl9xdWV1ZTsKKyAgICAvKiAgKHBvaW50ZXJzIHRvKSBzaGFyZWQgdmFycyAgKi8KK30ga21wY19zaGFyZWRfdmFyc190OworCit0eXBlZGVmIHN0cnVjdCBLTVBfQUxJR05fQ0FDSEUga21wY19hbGlnbmVkX3NoYXJlZF92YXJzX3QgeworICAgIHZvbGF0aWxlIHN0cnVjdCBrbXBjX3NoYXJlZF92YXJzX3QgICAgICphaV9kYXRhOworfSBrbXBjX2FsaWduZWRfc2hhcmVkX3ZhcnNfdDsKKworLyogIHNpemVvZl90aHVuayBwYXNzZWQgYXMgYXJnIHRvIGttcGNfdGFza3EgY2FsbCAgKi8KK3R5cGVkZWYgc3RydWN0IGttcGNfdGh1bmtfdCB7ICAgICAgICAgICAgICAgICAgIC8qICBhbGlnbmVkIGR1cmluZyBkeW5hbWljIGFsbG9jYXRpb24gKi8KKyAgICB1bmlvbiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBmaWVsZCB1c2VkIGZvciBpbnRlcm5hbCBmcmVlbGlzdHMgdG9vICAqLworICAgICAgICBrbXBjX3NoYXJlZF92YXJzX3QgICp0aF9zaGFyZWRzOworICAgICAgICBzdHJ1Y3Qga21wY190aHVua190ICp0aF9uZXh0X2ZyZWU7ICAgICAgLyogIGZyZWVsaXN0IG9mIGluZGl2aWR1YWwgdGh1bmtzIHdpdGhpbiBxdWV1ZSwgaGVhZCBhdCB0cV9mcmVlX3RodW5rcyAgKi8KKyAgICB9IHRoOworICAgIGttcGNfdGFza190IHRoX3Rhc2s7ICAgICAgICAgICAgICAgICAgICAgICAgLyogIHRhc2txX3Rhc2sgaWYgZmxhZ3MgJiBUUUZfVEFTS1FfVEFTSyAgKi8KKyAgICBzdHJ1Y3Qga21wY190aHVua190ICp0aF9lbmNsX3RodW5rOyAgICAgICAgIC8qICBwb2ludGVyIHRvIGR5bmFtaWNhbGx5IGVuY2xvc2luZyB0aHVuayBvbiB0aGlzIHRocmVhZCdzIGNhbGwgc3RhY2sgKi8KKyAgICBrbXBfaW50MzIgdGhfZmxhZ3M7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBUUUZfeHh4ICh0cV9mbGFncyBpbnRlcmZhY2UgcGx1cyBwb3NzaWJsZSBpbnRlcm5hbCBmbGFncykgICovCisgICAga21wX2ludDMyIHRoX3N0YXR1czsKKyAgICBrbXBfdWludDMyIHRoX3Rhc2tudW07ICAgICAgICAgICAgICAgICAgICAgIC8qICB0YXNrIG51bWJlciBhc3NpZ25lZCBpbiBvcmRlciBvZiBxdWV1aW5nLCB1c2VkIGZvciBvcmRlcmVkIHNlY3Rpb25zICovCisgICAgLyogIHByaXZhdGUgdmFycyAgKi8KK30ga21wY190aHVua190OworCit0eXBlZGVmIHN0cnVjdCBLTVBfQUxJR05fQ0FDSEUga21wX3Rhc2txIHsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHRxX2N1cnJfdGh1bmtfY2FwYWNpdHk7CisKKyAgICBrbXBjX3Rhc2tfcXVldWVfdCAgKnRxX3Jvb3Q7CisgICAga21wX2ludDMyICAgICAgICAgICB0cV9nbG9iYWxfZmxhZ3M7CisKKyAgICBrbXBfbG9ja190ICAgICAgICAgIHRxX2ZyZWVsaXN0X2xjazsKKyAgICBrbXBjX3Rhc2tfcXVldWVfdCAgKnRxX2ZyZWVsaXN0OworCisgICAga21wY190aHVua190ICAgICAgKip0cV9jdXJyX3RodW5rOworfSBrbXBfdGFza3FfdDsKKworLyogRU5EIFRhc2txIGRhdGEgc3RydWN0dXJlcyAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3R5cGVkZWYga21wX2ludDMyIGttcF9jcml0aWNhbF9uYW1lWzhdOworCisvKiEKK0Bpbmdyb3VwIFBBUkFMTEVMCitUaGUgdHlwZSBmb3IgYSBtaWNyb3Rhc2sgd2hpY2ggZ2V0cyBwYXNzZWQgdG8gQHJlZiBfX2ttcGNfZm9ya19jYWxsKCkuCitUaGUgYXJndW1lbnRzIHRvIHRoZSBvdXRsaW5lZCBmdW5jdGlvbiBhcmUKK0BwYXJhbSBnbG9iYWxfdGlkIHRoZSBnbG9iYWwgdGhyZWFkIGlkZW50aXR5IG9mIHRoZSB0aHJlYWQgZXhlY3V0aW5nIHRoZSBmdW5jdGlvbi4KK0BwYXJhbSBib3VuZF90aWQgIHRoZSBsb2NhbCBpZGVudGl0aXkgb2YgdGhlIHRocmVhZCBleGVjdXRpbmcgdGhlIGZ1bmN0aW9uCitAcGFyYW0gLi4uIHBvaW50ZXJzIHRvIHNoYXJlZCB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgdGhlIGZ1bmN0aW9uLgorKi8KK3R5cGVkZWYgdm9pZCAoKmttcGNfbWljcm8pICAgICAgICAgICAgICAoIGttcF9pbnQzMiAqIGdsb2JhbF90aWQsIGttcF9pbnQzMiAqIGJvdW5kX3RpZCwgLi4uICk7Cit0eXBlZGVmIHZvaWQgKCprbXBjX21pY3JvX2JvdW5kKSAgICAgICAgKCBrbXBfaW50MzIgKiBib3VuZF90aWQsIGttcF9pbnQzMiAqIGJvdW5kX250aCwgLi4uICk7CisKKy8qIQorQGluZ3JvdXAgVEhSRUFEUFJJVkFURQorQHsKKyovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIFRocmVhZHByaXZhdGUgaW5pdGlhbGl6YXRpb24vZmluYWxpemF0aW9uIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyAqLworCisvKiAgZm9yIG5vbi1hcnJheSBvYmplY3RzOiAgX19rbXBjX3RocmVhZHByaXZhdGVfcmVnaXN0ZXIoKSAgKi8KKworLyohCisgUG9pbnRlciB0byB0aGUgY29uc3RydWN0b3IgZnVuY3Rpb24uCisgVGhlIGZpcnN0IGFyZ3VtZW50IGlzIHRoZSA8dHQ+dGhpczwvdHQ+IHBvaW50ZXIKKyovCit0eXBlZGVmIHZvaWQgKigqa21wY19jdG9yKSAgICAodm9pZCAqKTsKKworLyohCisgUG9pbnRlciB0byB0aGUgZGVzdHJ1Y3RvciBmdW5jdGlvbi4KKyBUaGUgZmlyc3QgYXJndW1lbnQgaXMgdGhlIDx0dD50aGlzPC90dD4gcG9pbnRlcgorKi8KK3R5cGVkZWYgdm9pZCAoKmttcGNfZHRvcikgICAgICh2b2lkICogLyosIHNpemVfdCAqLyk7IC8qIDJuZCBhcmc6IG1hZ2ljIG51bWJlciBmb3IgS0NDIHVudXNlZCBieSBJbnRlbCBjb21waWxlciAqLworLyohCisgUG9pbnRlciB0byBhbiBhbHRlcm5hdGUgY29uc3RydWN0b3IuCisgVGhlIGZpcnN0IGFyZ3VtZW50IGlzIHRoZSA8dHQ+dGhpczwvdHQ+IHBvaW50ZXIuCisqLwordHlwZWRlZiB2b2lkICooKmttcGNfY2N0b3IpICAgKHZvaWQgKiwgdm9pZCAqKTsKKworLyogIGZvciBhcnJheSBvYmplY3RzOiBfX2ttcGNfdGhyZWFkcHJpdmF0ZV9yZWdpc3Rlcl92ZWMoKSAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmlyc3QgYXJnOiAidGhpcyIgcG9pbnRlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMYXN0IGFyZzogbnVtYmVyIG9mIGFycmF5IGVsZW1lbnRzICovCisvKiEKKyBBcnJheSBjb25zdHJ1Y3Rvci4KKyBGaXJzdCBhcmd1bWVudCBpcyB0aGUgPHR0PnRoaXM8L3R0PiBwb2ludGVyCisgU2Vjb25kIGFyZ3VtZW50IHRoZSBudW1iZXIgb2YgYXJyYXkgZWxlbWVudHMuCisqLwordHlwZWRlZiB2b2lkICooKmttcGNfY3Rvcl92ZWMpICAodm9pZCAqLCBzaXplX3QpOworLyohCisgUG9pbnRlciB0byB0aGUgYXJyYXkgZGVzdHJ1Y3RvciBmdW5jdGlvbi4KKyBUaGUgZmlyc3QgYXJndW1lbnQgaXMgdGhlIDx0dD50aGlzPC90dD4gcG9pbnRlcgorIFNlY29uZCBhcmd1bWVudCB0aGUgbnVtYmVyIG9mIGFycmF5IGVsZW1lbnRzLgorKi8KK3R5cGVkZWYgdm9pZCAoKmttcGNfZHRvcl92ZWMpICAgKHZvaWQgKiwgc2l6ZV90KTsKKy8qIQorIEFycmF5IGNvbnN0cnVjdG9yLgorIEZpcnN0IGFyZ3VtZW50IGlzIHRoZSA8dHQ+dGhpczwvdHQ+IHBvaW50ZXIKKyBUaGlyZCBhcmd1bWVudCB0aGUgbnVtYmVyIG9mIGFycmF5IGVsZW1lbnRzLgorKi8KK3R5cGVkZWYgdm9pZCAqKCprbXBjX2NjdG9yX3ZlYykgKHZvaWQgKiwgdm9pZCAqLCBzaXplX3QpOyAvKiBmdW5jdGlvbiB1bnVzZWQgYnkgY29tcGlsZXIgKi8KKworLyohCitAfQorKi8KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoga2VlcHMgdHJhY2tlZCBvZiB0aHJlYWRwcml2YXRlIGNhY2hlIGFsbG9jYXRpb25zIGZvciBjbGVhbnVwIGxhdGVyICovCit0eXBlZGVmIHN0cnVjdCBrbXBfY2FjaGVkX2FkZHIgeworICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgKiphZGRyOyAgICAgICAgICAgLyogYWRkcmVzcyBvZiBhbGxvY2F0ZWQgY2FjaGUgKi8KKyAgICBzdHJ1Y3Qga21wX2NhY2hlZF9hZGRyICAgICAqbmV4dDsgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gbmV4dCBjYWNoZWQgYWRkcmVzcyAqLworfSBrbXBfY2FjaGVkX2FkZHJfdDsKKworc3RydWN0IHByaXZhdGVfZGF0YSB7CisgICAgc3RydWN0IHByaXZhdGVfZGF0YSAqbmV4dDsgICAgICAgICAgLyogVGhlIG5leHQgZGVzY3JpcHRvciBpbiB0aGUgbGlzdCAgICAgICovCisgICAgdm9pZCAgICAgICAgICAgICAgICAqZGF0YTsgICAgICAgICAgLyogVGhlIGRhdGEgYnVmZmVyIGZvciB0aGlzIGRlc2NyaXB0b3IgICovCisgICAgaW50ICAgICAgICAgICAgICAgICAgbW9yZTsgICAgICAgICAgLyogVGhlIHJlcGVhdCBjb3VudCBmb3IgdGhpcyBkZXNjcmlwdG9yICovCisgICAgc2l6ZV90ICAgICAgICAgICAgICAgc2l6ZTsgICAgICAgICAgLyogVGhlIGRhdGEgc2l6ZSBmb3IgdGhpcyBkZXNjcmlwdG9yICAgICovCit9OworCitzdHJ1Y3QgcHJpdmF0ZV9jb21tb24geworICAgIHN0cnVjdCBwcml2YXRlX2NvbW1vbiAgICAgKm5leHQ7CisgICAgc3RydWN0IHByaXZhdGVfY29tbW9uICAgICAqbGluazsKKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICpnYmxfYWRkcjsKKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICpwYXJfYWRkcjsgICAgICAgIC8qIHBhcl9hZGRyID09IGdibF9hZGRyIGZvciBNQVNURVIgdGhyZWFkICovCisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgY21uX3NpemU7Cit9OworCitzdHJ1Y3Qgc2hhcmVkX2NvbW1vbgoreworICAgIHN0cnVjdCBzaGFyZWRfY29tbW9uICAgICAgKm5leHQ7CisgICAgc3RydWN0IHByaXZhdGVfZGF0YSAgICAgICAqcG9kX2luaXQ7CisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAqb2JqX2luaXQ7CisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAqZ2JsX2FkZHI7CisgICAgdW5pb24geworICAgICAgICBrbXBjX2N0b3IgICAgICAgICAgICAgIGN0b3I7CisgICAgICAgIGttcGNfY3Rvcl92ZWMgICAgICAgICAgY3RvcnY7CisgICAgfSBjdDsKKyAgICB1bmlvbiB7CisgICAgICAgIGttcGNfY2N0b3IgICAgICAgICAgICAgY2N0b3I7CisgICAgICAgIGttcGNfY2N0b3JfdmVjICAgICAgICAgY2N0b3J2OworICAgIH0gY2N0OworICAgIHVuaW9uIHsKKyAgICAgICAga21wY19kdG9yICAgICAgICAgICAgICBkdG9yOworICAgICAgICBrbXBjX2R0b3JfdmVjICAgICAgICAgIGR0b3J2OworICAgIH0gZHQ7CisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgdmVjX2xlbjsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICBpc192ZWM7CisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgY21uX3NpemU7Cit9OworCisjZGVmaW5lIEtNUF9IQVNIX1RBQkxFX0xPRzIgICAgIDkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbG9nMiBvZiB0aGUgaGFzaCB0YWJsZSBzaXplICovCisjZGVmaW5lIEtNUF9IQVNIX1RBQkxFX1NJWkUgICAgICgxIDw8IEtNUF9IQVNIX1RBQkxFX0xPRzIpICAgICAgLyogc2l6ZSBvZiB0aGUgaGFzaCB0YWJsZSAqLworI2RlZmluZSBLTVBfSEFTSF9TSElGVCAgICAgICAgICAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRocm93IGF3YXkgdGhpcyBtYW55IGxvdyBiaXRzIGZyb20gdGhlIGFkZHJlc3MgKi8KKyNkZWZpbmUgS01QX0hBU0goeCkgICAgICAgICAgICAgKCgoKGttcF91aW50cHRyX3QpIHgpID4+IEtNUF9IQVNIX1NISUZUKSAmIChLTVBfSEFTSF9UQUJMRV9TSVpFLTEpKQorCitzdHJ1Y3QgY29tbW9uX3RhYmxlIHsKKyAgICBzdHJ1Y3QgIHByaXZhdGVfY29tbW9uICAgICAgKmRhdGFbIEtNUF9IQVNIX1RBQkxFX1NJWkUgXTsKK307CisKK3N0cnVjdCBzaGFyZWRfdGFibGUgeworICAgIHN0cnVjdCAgc2hhcmVkX2NvbW1vbiAgICAgICAqZGF0YVsgS01QX0hBU0hfVEFCTEVfU0laRSBdOworfTsKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZmRlZiBLTVBfU1RBVElDX1NURUFMX0VOQUJMRUQKK3R5cGVkZWYgc3RydWN0IEtNUF9BTElHTl9DQUNIRSBkaXNwYXRjaF9wcml2YXRlX2luZm8zMiB7CisgICAga21wX2ludDMyIGNvdW50OworICAgIGttcF9pbnQzMiB1YjsKKyAgICAvKiBBZGRpbmcgS01QX0FMSUdOX0NBQ0hFIGhlcmUgZG9lc24ndCBoZWxwIC8gY2FuIGh1cnQgcGVyZm9ybWFuY2UgKi8KKyAgICBrbXBfaW50MzIgbGI7CisgICAga21wX2ludDMyIHN0OworICAgIGttcF9pbnQzMiB0YzsKKyAgICBrbXBfaW50MzIgc3RhdGljX3N0ZWFsX2NvdW50ZXI7IC8qIGZvciBzdGF0aWNfc3RlYWwgb25seTsgbWF5YmUgYmV0dGVyIHRvIHB1dCBhZnRlciB1YiAqLworCisgICAgLy8gS01QX0FMSUdOKCAxNiApIGVuc3VyZXMgKCBpZiB0aGUgS01QX0FMSUdOIG1hY3JvIGlzIHR1cm5lZCBvbiApCisgICAgLy8gICAgYSkgcGFybTMgaXMgcHJvcGVybHkgYWxpZ25lZCBhbmQKKyAgICAvLyAgICBiKSBhbGwgcGFybTEtNCBhcmUgaW4gdGhlIHNhbWUgY2FjaGUgbGluZS4KKyAgICAvLyBCZWNhdXNlIG9mIHBhcm0xLTQgYXJlIHVzZWQgdG9nZXRoZXIsIHBlcmZvcm1hbmNlIHNlZW1zIHRvIGJlIGJldHRlcgorICAgIC8vIGlmIHRoZXkgYXJlIGluIHRoZSBzYW1lIGxpbmUgKG5vdCBtZWFzdXJlZCB0aG91Z2gpLgorCisgICAgc3RydWN0IEtNUF9BTElHTiggMzIgKSB7IC8vIEFDOiBjaGFuZ2VkIDE2IHRvIDMyIGluIG9yZGVyIHRvIHNpbXBsaWZ5IHRlbXBsYXRlCisgICAgICAgIGttcF9pbnQzMiBwYXJtMTsgICAgIC8vICAgICBzdHJ1Y3R1cmVzIGluIGttcF9kaXNwYXRjaC5jcHAuIFRoaXMgc2hvdWxkCisgICAgICAgIGttcF9pbnQzMiBwYXJtMjsgICAgIC8vICAgICBtYWtlIG5vIHJlYWwgY2hhbmdlIGF0IGxlYXN0IHdoaWxlIHBhZGRpbmcgaXMgb2ZmLgorICAgICAgICBrbXBfaW50MzIgcGFybTM7CisgICAgICAgIGttcF9pbnQzMiBwYXJtNDsKKyAgICB9OworCisgICAga21wX3VpbnQzMiBvcmRlcmVkX2xvd2VyOworICAgIGttcF91aW50MzIgb3JkZXJlZF91cHBlcjsKKyNpZiBLTVBfT1NfV0lORE9XUworICAgIC8vIFRoaXMgdmFyIGNhbiBiZSBwbGFjZWQgaW4gdGhlIGhvbGUgYmV0d2VlbiAndGMnIGFuZCAncGFybTEnLCBpbnN0ZWFkIG9mICdzdGF0aWNfc3RlYWxfY291bnRlcicuCisgICAgLy8gSXQgd291bGQgYmUgbmljZSB0byBtZWFzdXJlIGV4ZWN1dGlvbiB0aW1lcy4KKyAgICAvLyBDb25kaXRpb25hbCBpZi9lbmRpZiBjYW4gYmUgcmVtb3ZlZCBhdCBhbGwuCisgICAga21wX2ludDMyIGxhc3RfdXBwZXI7CisjZW5kaWYgLyogS01QX09TX1dJTkRPV1MgKi8KK30gZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvMzJfdDsKKwordHlwZWRlZiBzdHJ1Y3QgS01QX0FMSUdOX0NBQ0hFIGRpc3BhdGNoX3ByaXZhdGVfaW5mbzY0IHsKKyAgICBrbXBfaW50NjQgY291bnQ7ICAgLyogY3VycmVudCBjaHVuayBudW1iZXIgZm9yIHN0YXRpYyBhbmQgc3RhdGljLXN0ZWFsIHNjaGVkdWxpbmcqLworICAgIGttcF9pbnQ2NCB1YjsgICAgICAvKiB1cHBlci1ib3VuZCAqLworICAgIC8qIEFkZGluZyBLTVBfQUxJR05fQ0FDSEUgaGVyZSBkb2Vzbid0IGhlbHAgLyBjYW4gaHVydCBwZXJmb3JtYW5jZSAqLworICAgIGttcF9pbnQ2NCBsYjsgICAgICAvKiBsb3dlci1ib3VuZCAqLworICAgIGttcF9pbnQ2NCBzdDsgICAgICAvKiBzdHJpZGUgKi8KKyAgICBrbXBfaW50NjQgdGM7ICAgICAgLyogdHJpcCBjb3VudCAobnVtYmVyIG9mIGl0ZXJhdGlvbnMpICovCisgICAga21wX2ludDY0IHN0YXRpY19zdGVhbF9jb3VudGVyOyAvKiBmb3Igc3RhdGljX3N0ZWFsIG9ubHk7IG1heWJlIGJldHRlciB0byBwdXQgYWZ0ZXIgdWIgKi8KKworICAgIC8qIHBhcm1bMS00XSBhcmUgdXNlZCBpbiBkaWZmZXJlbnQgd2F5cyBieSBkaWZmZXJlbnQgc2NoZWR1bGluZyBhbGdvcml0aG1zICovCisKKyAgICAvLyBLTVBfQUxJR04oIDMyICkgZW5zdXJlcyAoIGlmIHRoZSBLTVBfQUxJR04gbWFjcm8gaXMgdHVybmVkIG9uICkKKyAgICAvLyAgICBhKSBwYXJtMyBpcyBwcm9wZXJseSBhbGlnbmVkIGFuZAorICAgIC8vICAgIGIpIGFsbCBwYXJtMS00IGFyZSBpbiB0aGUgc2FtZSBjYWNoZSBsaW5lLgorICAgIC8vIEJlY2F1c2Ugb2YgcGFybTEtNCBhcmUgdXNlZCB0b2dldGhlciwgcGVyZm9ybWFuY2Ugc2VlbXMgdG8gYmUgYmV0dGVyCisgICAgLy8gaWYgdGhleSBhcmUgaW4gdGhlIHNhbWUgbGluZSAobm90IG1lYXN1cmVkIHRob3VnaCkuCisKKyAgICBzdHJ1Y3QgS01QX0FMSUdOKCAzMiApIHsKKyAgICAgICAga21wX2ludDY0IHBhcm0xOworICAgICAgICBrbXBfaW50NjQgcGFybTI7CisgICAgICAgIGttcF9pbnQ2NCBwYXJtMzsKKyAgICAgICAga21wX2ludDY0IHBhcm00OworICAgIH07CisKKyAgICBrbXBfdWludDY0IG9yZGVyZWRfbG93ZXI7CisgICAga21wX3VpbnQ2NCBvcmRlcmVkX3VwcGVyOworI2lmIEtNUF9PU19XSU5ET1dTCisgICAgLy8gVGhpcyB2YXIgY2FuIGJlIHBsYWNlZCBpbiB0aGUgaG9sZSBiZXR3ZWVuICd0YycgYW5kICdwYXJtMScsIGluc3RlYWQgb2YgJ3N0YXRpY19zdGVhbF9jb3VudGVyJy4KKyAgICAvLyBJdCB3b3VsZCBiZSBuaWNlIHRvIG1lYXN1cmUgZXhlY3V0aW9uIHRpbWVzLgorICAgIC8vIENvbmRpdGlvbmFsIGlmL2VuZGlmIGNhbiBiZSByZW1vdmVkIGF0IGFsbC4KKyAgICBrbXBfaW50NjQgbGFzdF91cHBlcjsKKyNlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAqLworfSBkaXNwYXRjaF9wcml2YXRlX2luZm82NF90OworI2Vsc2UgLyogS01QX1NUQVRJQ19TVEVBTF9FTkFCTEVEICovCit0eXBlZGVmIHN0cnVjdCBLTVBfQUxJR05fQ0FDSEUgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvMzIgeworICAgIGttcF9pbnQzMiBsYjsKKyAgICBrbXBfaW50MzIgdWI7CisgICAga21wX2ludDMyIHN0OworICAgIGttcF9pbnQzMiB0YzsKKworICAgIGttcF9pbnQzMiBwYXJtMTsKKyAgICBrbXBfaW50MzIgcGFybTI7CisgICAga21wX2ludDMyIHBhcm0zOworICAgIGttcF9pbnQzMiBwYXJtNDsKKworICAgIGttcF9pbnQzMiBjb3VudDsKKworICAgIGttcF91aW50MzIgb3JkZXJlZF9sb3dlcjsKKyAgICBrbXBfdWludDMyIG9yZGVyZWRfdXBwZXI7CisjaWYgS01QX09TX1dJTkRPV1MKKyAgICBrbXBfaW50MzIgbGFzdF91cHBlcjsKKyNlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAqLworfSBkaXNwYXRjaF9wcml2YXRlX2luZm8zMl90OworCit0eXBlZGVmIHN0cnVjdCBLTVBfQUxJR05fQ0FDSEUgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvNjQgeworICAgIGttcF9pbnQ2NCBsYjsgICAgICAvKiBsb3dlci1ib3VuZCAqLworICAgIGttcF9pbnQ2NCB1YjsgICAgICAvKiB1cHBlci1ib3VuZCAqLworICAgIGttcF9pbnQ2NCBzdDsgICAgICAvKiBzdHJpZGUgKi8KKyAgICBrbXBfaW50NjQgdGM7ICAgICAgLyogdHJpcCBjb3VudCAobnVtYmVyIG9mIGl0ZXJhdGlvbnMpICovCisKKyAgICAvKiBwYXJtWzEtNF0gYXJlIHVzZWQgaW4gZGlmZmVyZW50IHdheXMgYnkgZGlmZmVyZW50IHNjaGVkdWxpbmcgYWxnb3JpdGhtcyAqLworICAgIGttcF9pbnQ2NCBwYXJtMTsKKyAgICBrbXBfaW50NjQgcGFybTI7CisgICAga21wX2ludDY0IHBhcm0zOworICAgIGttcF9pbnQ2NCBwYXJtNDsKKworICAgIGttcF9pbnQ2NCBjb3VudDsgICAvKiBjdXJyZW50IGNodW5rIG51bWJlciBmb3Igc3RhdGljIHNjaGVkdWxpbmcgKi8KKworICAgIGttcF91aW50NjQgb3JkZXJlZF9sb3dlcjsKKyAgICBrbXBfdWludDY0IG9yZGVyZWRfdXBwZXI7CisjaWYgS01QX09TX1dJTkRPV1MKKyAgICBrbXBfaW50NjQgbGFzdF91cHBlcjsKKyNlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAqLworfSBkaXNwYXRjaF9wcml2YXRlX2luZm82NF90OworI2VuZGlmIC8qIEtNUF9TVEFUSUNfU1RFQUxfRU5BQkxFRCAqLworCit0eXBlZGVmIHN0cnVjdCBLTVBfQUxJR05fQ0FDSEUgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvIHsKKyAgICB1bmlvbiBwcml2YXRlX2luZm8geworICAgICAgICBkaXNwYXRjaF9wcml2YXRlX2luZm8zMl90ICBwMzI7CisgICAgICAgIGRpc3BhdGNoX3ByaXZhdGVfaW5mbzY0X3QgIHA2NDsKKyAgICB9IHU7CisgICAgZW51bSBzY2hlZF90eXBlIHNjaGVkdWxlOyAgLyogc2NoZWR1bGluZyBhbGdvcml0aG0gKi8KKyAgICBrbXBfaW50MzIgICAgICAgb3JkZXJlZDsgICAvKiBvcmRlcmVkIGNsYXVzZSBzcGVjaWZpZWQgKi8KKyAgICBrbXBfaW50MzIgICAgICAgb3JkZXJlZF9idW1wZWQ7CisgICAga21wX2ludDMyICAgb3JkZXJlZF9kdW1teVtLTVBfTUFYX09SREVSRUQtM107IC8vIHRvIHJldGFpbiB0aGUgc3RydWN0dXJlIHNpemUgYWZ0ZXIgbWFraW5nIG9yZGVyZWRfaXRlcmF0aW9uIHNjYWxhcgorICAgIHN0cnVjdCBkaXNwYXRjaF9wcml2YXRlX2luZm8gKiBuZXh0OyAvKiBzdGFjayBvZiBidWZmZXJzIGZvciBuZXN0IG9mIHNlcmlhbCByZWdpb25zICovCisgICAga21wX2ludDMyICAgICAgIG5vbWVyZ2U7ICAgLyogZG9uJ3QgbWVyZ2UgaXRlcnMgaWYgc2VyaWFsaXplZCAqLworICAgIGttcF9pbnQzMiAgICAgICB0eXBlX3NpemU7IC8qIHRoZSBzaXplIG9mIHR5cGVzIGluIHByaXZhdGVfaW5mbyAqLworICAgIGVudW0gY29uc190eXBlICBwdXNoZWRfd3M7Cit9IGRpc3BhdGNoX3ByaXZhdGVfaW5mb190OworCit0eXBlZGVmIHN0cnVjdCBkaXNwYXRjaF9zaGFyZWRfaW5mbzMyIHsKKyAgICAvKiBjaHVuayBpbmRleCB1bmRlciBkeW5hbWljLCBudW1iZXIgb2YgaWRsZSB0aHJlYWRzIHVuZGVyIHN0YXRpYy1zdGVhbDsKKyAgICAgICBpdGVyYXRpb24gaW5kZXggb3RoZXJ3aXNlICovCisgICAgdm9sYXRpbGUga21wX3VpbnQzMiAgICAgIGl0ZXJhdGlvbjsKKyAgICB2b2xhdGlsZSBrbXBfdWludDMyICAgICAgbnVtX2RvbmU7CisgICAgdm9sYXRpbGUga21wX3VpbnQzMiAgICAgIG9yZGVyZWRfaXRlcmF0aW9uOworICAgIGttcF9pbnQzMiAgIG9yZGVyZWRfZHVtbXlbS01QX01BWF9PUkRFUkVELTFdOyAvLyB0byByZXRhaW4gdGhlIHN0cnVjdHVyZSBzaXplIGFmdGVyIG1ha2luZyBvcmRlcmVkX2l0ZXJhdGlvbiBzY2FsYXIKK30gZGlzcGF0Y2hfc2hhcmVkX2luZm8zMl90OworCit0eXBlZGVmIHN0cnVjdCBkaXNwYXRjaF9zaGFyZWRfaW5mbzY0IHsKKyAgICAvKiBjaHVuayBpbmRleCB1bmRlciBkeW5hbWljLCBudW1iZXIgb2YgaWRsZSB0aHJlYWRzIHVuZGVyIHN0YXRpYy1zdGVhbDsKKyAgICAgICBpdGVyYXRpb24gaW5kZXggb3RoZXJ3aXNlICovCisgICAgdm9sYXRpbGUga21wX3VpbnQ2NCAgICAgIGl0ZXJhdGlvbjsKKyAgICB2b2xhdGlsZSBrbXBfdWludDY0ICAgICAgbnVtX2RvbmU7CisgICAgdm9sYXRpbGUga21wX3VpbnQ2NCAgICAgIG9yZGVyZWRfaXRlcmF0aW9uOworICAgIGttcF9pbnQ2NCAgIG9yZGVyZWRfZHVtbXlbS01QX01BWF9PUkRFUkVELTFdOyAvLyB0byByZXRhaW4gdGhlIHN0cnVjdHVyZSBzaXplIGFmdGVyIG1ha2luZyBvcmRlcmVkX2l0ZXJhdGlvbiBzY2FsYXIKK30gZGlzcGF0Y2hfc2hhcmVkX2luZm82NF90OworCit0eXBlZGVmIHN0cnVjdCBkaXNwYXRjaF9zaGFyZWRfaW5mbyB7CisgICAgdW5pb24gc2hhcmVkX2luZm8geworICAgICAgICBkaXNwYXRjaF9zaGFyZWRfaW5mbzMyX3QgIHMzMjsKKyAgICAgICAgZGlzcGF0Y2hfc2hhcmVkX2luZm82NF90ICBzNjQ7CisgICAgfSB1OworLyogICAgdm9sYXRpbGUga21wX2ludDMyICAgICAgZGlzcGF0Y2hfYWJvcnQ7ICBkZXByaWNhdGVkICovCisgICAgdm9sYXRpbGUga21wX3VpbnQzMiAgICAgYnVmZmVyX2luZGV4OworfSBkaXNwYXRjaF9zaGFyZWRfaW5mb190OworCit0eXBlZGVmIHN0cnVjdCBrbXBfZGlzcCB7CisgICAgLyogVmVjdG9yIGZvciBPUkRFUkVEIFNFQ1RJT04gKi8KKyAgICB2b2lkICgqdGhfZGVvX2ZjbikoIGludCAqIGd0aWQsIGludCAqIGNpZCwgaWRlbnRfdCAqKTsKKyAgICAvKiBWZWN0b3IgZm9yIEVORCBPUkRFUkVEIFNFQ1RJT04gKi8KKyAgICB2b2lkICgqdGhfZHhvX2ZjbikoIGludCAqIGd0aWQsIGludCAqIGNpZCwgaWRlbnRfdCAqKTsKKworICAgIGRpc3BhdGNoX3NoYXJlZF9pbmZvX3QgICp0aF9kaXNwYXRjaF9zaF9jdXJyZW50OworICAgIGRpc3BhdGNoX3ByaXZhdGVfaW5mb190ICp0aF9kaXNwYXRjaF9wcl9jdXJyZW50OworCisgICAgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3QgKnRoX2Rpc3BfYnVmZmVyOworICAgIGttcF9pbnQzMiAgICAgICAgICAgICAgICB0aF9kaXNwX2luZGV4OworICAgIHZvaWQqIGR1bW15X3BhZGRpbmdbMl07IC8vIG1ha2UgaXQgNjQgYnl0ZXMgb24gSW50ZWwoUikgNjQKKyNpZiBLTVBfVVNFX0lOVEVSTk9ERV9BTElHTk1FTlQKKyAgICBjaGFyIG1vcmVfcGFkZGluZ1tJTlRFUk5PREVfQ0FDSEVfTElORV07CisjZW5kaWYKK30ga21wX2Rpc3BfdDsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogQmFycmllciBzdHVmZiAqLworCisvKiBjb25zdGFudHMgZm9yIGJhcnJpZXIgc3RhdGUgdXBkYXRlICovCisjZGVmaW5lIEtNUF9JTklUX0JBUlJJRVJfU1RBVEUgIDAgICAgICAgLyogc2hvdWxkIHByb2JhYmx5IHN0YXJ0IGZyb20gemVybyAqLworI2RlZmluZSBLTVBfQkFSUklFUl9TTEVFUF9CSVQgICAwICAgICAgIC8qIGJpdCB1c2VkIGZvciBzdXNwZW5kL3NsZWVwIHBhcnQgb2Ygc3RhdGUgKi8KKyNkZWZpbmUgS01QX0JBUlJJRVJfVU5VU0VEX0JJVCAgMSAgICAgICAvKiBiaXQgdGhhdCBtdXN0IG5ldmVyIGJlIHNldCBmb3IgdmFsaWQgc3RhdGUgKi8KKyNkZWZpbmUgS01QX0JBUlJJRVJfQlVNUF9CSVQgICAgMiAgICAgICAvKiBsc2IgdXNlZCBmb3IgYnVtcCBvZiBnby9hcnJpdmVkIHN0YXRlICovCisKKyNkZWZpbmUgS01QX0JBUlJJRVJfU0xFRVBfU1RBVEUgICAgICAgICAoKGttcF91aW50KSAoMSA8PCBLTVBfQkFSUklFUl9TTEVFUF9CSVQpKQorI2RlZmluZSBLTVBfQkFSUklFUl9VTlVTRURfU1RBVEUgICAgICAgICgoa21wX3VpbnQpICgxIDw8IEtNUF9CQVJSSUVSX1VOVVNFRF9CSVQpKQorI2RlZmluZSBLTVBfQkFSUklFUl9TVEFURV9CVU1QICAgICAgICAgICgoa21wX3VpbnQpICgxIDw8IEtNUF9CQVJSSUVSX0JVTVBfQklUKSkKKworI2lmIChLTVBfQkFSUklFUl9TTEVFUF9CSVQgPj0gS01QX0JBUlJJRVJfQlVNUF9CSVQpCisjIGVycm9yICJCYXJyaWVyIHNsZWVwIGJpdCBtdXN0IGJlIHNtYWxsZXIgdGhhbiBiYXJyaWVyIGJ1bXAgYml0IgorI2VuZGlmCisjaWYgKEtNUF9CQVJSSUVSX1VOVVNFRF9CSVQgPj0gS01QX0JBUlJJRVJfQlVNUF9CSVQpCisjIGVycm9yICJCYXJyaWVyIHVudXNlZCBiaXQgbXVzdCBiZSBzbWFsbGVyIHRoYW4gYmFycmllciBidW1wIGJpdCIKKyNlbmRpZgorCisvLyBDb25zdGFudHMgZm9yIHJlbGVhc2UgYmFycmllciB3YWl0IHN0YXRlOiBjdXJyZW50bHksIGhpZXJhcmNoaWNhbCBvbmx5CisjZGVmaW5lIEtNUF9CQVJSSUVSX05PVF9XQUlUSU5HICAgICAgICAwICAvLyBOb3JtYWwgc3RhdGU7IHdvcmtlciBub3QgaW4gd2FpdF9zbGVlcAorI2RlZmluZSBLTVBfQkFSUklFUl9PV05fRkxBRyAgICAgICAgICAgMSAgLy8gTm9ybWFsIHN0YXRlOyB3b3JrZXIgd2FpdGluZyBvbiBvd24gYl9nbyBmbGFnIGluIHJlbGVhc2UKKyNkZWZpbmUgS01QX0JBUlJJRVJfUEFSRU5UX0ZMQUcgICAgICAgIDIgIC8vIFNwZWNpYWwgc3RhdGU7IHdvcmtlciB3YWl0aW5nIG9uIHBhcmVudCdzIGJfZ28gZmxhZyBpbiByZWxlYXNlCisjZGVmaW5lIEtNUF9CQVJSSUVSX1NXSVRDSF9UT19PV05fRkxBRyAzICAvLyBTcGVjaWFsIHN0YXRlOyB0ZWxscyB3b3JrZXIgdG8gc2hpZnQgZnJvbSBwYXJlbnQgdG8gb3duIGJfZ28KKyNkZWZpbmUgS01QX0JBUlJJRVJfU1dJVENISU5HICAgICAgICAgIDQgIC8vIFNwZWNpYWwgc3RhdGU7IHdvcmtlciByZXNldHMgYXBwcm9wcmlhdGUgZmxhZyBvbiB3YWtlLXVwCisKK2VudW0gYmFycmllcl90eXBlIHsKKyAgICBic19wbGFpbl9iYXJyaWVyID0gMCwgICAgICAgLyogMCwgQWxsIG5vbi1mb3JrL2pvaW4gYmFycmllcnMgKGV4Y2VwdCByZWR1Y3Rpb24gYmFycmllcnMgaWYgZW5hYmxlZCkgKi8KKyAgICBic19mb3Jram9pbl9iYXJyaWVyLCAgICAgICAgLyogMSwgQWxsIGZvcmsvam9pbiAocGFyYWxsZWwgcmVnaW9uKSBiYXJyaWVycyAqLworICAgICNpZiBLTVBfRkFTVF9SRURVQ1RJT05fQkFSUklFUgorICAgICAgICBic19yZWR1Y3Rpb25fYmFycmllciwgICAvKiAyLCBBbGwgYmFycmllcnMgdGhhdCBhcmUgdXNlZCBpbiByZWR1Y3Rpb24gKi8KKyAgICAjZW5kaWYgLy8gS01QX0ZBU1RfUkVEVUNUSU9OX0JBUlJJRVIKKyAgICBic19sYXN0X2JhcnJpZXIgICAgICAgICAgICAgLyogSnVzdCBhIHBsYWNlaG9sZGVyIHRvIG1hcmsgdGhlIGVuZCAqLworfTsKKworLy8gdG8gd29yayB3aXRoIHJlZHVjdGlvbiBiYXJyaWVycyBqdXN0IGxpa2Ugd2l0aCBwbGFpbiBiYXJyaWVycworI2lmICFLTVBfRkFTVF9SRURVQ1RJT05fQkFSUklFUgorICAgICNkZWZpbmUgYnNfcmVkdWN0aW9uX2JhcnJpZXIgYnNfcGxhaW5fYmFycmllcgorI2VuZGlmIC8vIEtNUF9GQVNUX1JFRFVDVElPTl9CQVJSSUVSCisKK3R5cGVkZWYgZW51bSBrbXBfYmFyX3BhdCB7ICAgICAgLyogQmFycmllciBjb21tdW5pY2F0aW9uIHBhdHRlcm5zICovCisgICAgYnBfbGluZWFyX2JhciA9IDAsICAgICAgICAgIC8qIFNpbmdsZSBsZXZlbCAoZGVnZW5lcmF0ZSkgdHJlZSAqLworICAgIGJwX3RyZWVfYmFyID0gMSwgICAgICAgICAgICAvKiBCYWxhbmNlZCB0cmVlIHdpdGggYnJhbmNoaW5nIGZhY3RvciAyXm4gKi8KKyAgICBicF9oeXBlcl9iYXIgPSAyLCAgICAgICAgICAgLyogSHlwZXJjdWJlLWVtYmVkZGVkIHRyZWUgd2l0aCBtaW4gYnJhbmNoaW5nIGZhY3RvciAyXm4gKi8KKyAgICBicF9oaWVyYXJjaGljYWxfYmFyID0gMywgICAgLyogTWFjaGluZSBoaWVyYXJjaHkgdHJlZSAqLworICAgIGJwX2xhc3RfYmFyID0gNCAgICAgICAgICAgICAvKiBQbGFjZWhvbGRlciB0byBtYXJrIHRoZSBlbmQgKi8KK30ga21wX2Jhcl9wYXRfZTsKKworIyBkZWZpbmUgS01QX0JBUlJJRVJfSUNWX1BVU0ggICAxCisKKy8qIFJlY29yZCBmb3IgaG9sZGluZyB0aGUgdmFsdWVzIG9mIHRoZSBpbnRlcm5hbCBjb250cm9scyBzdGFjayByZWNvcmRzICovCit0eXBlZGVmIHN0cnVjdCBrbXBfaW50ZXJuYWxfY29udHJvbCB7CisgICAgaW50ICAgICAgICAgICBzZXJpYWxfbmVzdGluZ19sZXZlbDsgIC8qIGNvcnJlc3BvbmRzIHRvIHRoZSB2YWx1ZSBvZiB0aGUgdGhfdGVhbV9zZXJpYWxpemVkIGZpZWxkICovCisgICAga21wX2ludDggICAgICBuZXN0ZWQ7ICAgICAgICAgICAgICAgIC8qIGludGVybmFsIGNvbnRyb2wgZm9yIG5lc3RlZCBwYXJhbGxlbGlzbSAocGVyIHRocmVhZCkgKi8KKyAgICBrbXBfaW50OCAgICAgIGR5bmFtaWM7ICAgICAgICAgICAgICAgLyogaW50ZXJuYWwgY29udHJvbCBmb3IgZHluYW1pYyBhZGp1c3RtZW50IG9mIHRocmVhZHMgKHBlciB0aHJlYWQpICovCisgICAga21wX2ludDggICAgICBidF9zZXQ7ICAgICAgICAgICAgICAgIC8qIGludGVybmFsIGNvbnRyb2wgZm9yIHdoZXRoZXIgYmxvY2t0aW1lIGlzIGV4cGxpY2l0bHkgc2V0ICovCisgICAgaW50ICAgICAgICAgICBibG9ja3RpbWU7ICAgICAgICAgICAgIC8qIGludGVybmFsIGNvbnRyb2wgZm9yIGJsb2NrdGltZSAqLworICAgIGludCAgICAgICAgICAgYnRfaW50ZXJ2YWxzOyAgICAgICAgICAvKiBpbnRlcm5hbCBjb250cm9sIGZvciBibG9ja3RpbWUgaW50ZXJ2YWxzICovCisgICAgaW50ICAgICAgICAgICBucHJvYzsgICAgICAgICAgICAgICAgIC8qIGludGVybmFsIGNvbnRyb2wgZm9yICN0aHJlYWRzIGZvciBuZXh0IHBhcmFsbGVsIHJlZ2lvbiAocGVyIHRocmVhZCkgKi8KKyAgICBpbnQgICAgICAgICAgIG1heF9hY3RpdmVfbGV2ZWxzOyAgICAgLyogaW50ZXJuYWwgY29udHJvbCBmb3IgbWF4X2FjdGl2ZV9sZXZlbHMgKi8KKyAgICBrbXBfcl9zY2hlZF90IHNjaGVkOyAgICAgICAgICAgICAgICAgLyogaW50ZXJuYWwgY29udHJvbCBmb3IgcnVudGltZSBzY2hlZHVsZSB7c2NoZWQsY2h1bmt9IHBhaXIgKi8KKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIGttcF9wcm9jX2JpbmRfdCBwcm9jX2JpbmQ7ICAgICAgICAgICAvKiBpbnRlcm5hbCBjb250cm9sIGZvciBhZmZpbml0eSAgKi8KKyNlbmRpZiAvLyBPTVBfNDBfRU5BQkxFRAorICAgIHN0cnVjdCBrbXBfaW50ZXJuYWxfY29udHJvbCAqbmV4dDsKK30ga21wX2ludGVybmFsX2NvbnRyb2xfdDsKKworc3RhdGljIGlubGluZSB2b2lkCitjb3B5X2ljdnMoIGttcF9pbnRlcm5hbF9jb250cm9sX3QgKmRzdCwga21wX2ludGVybmFsX2NvbnRyb2xfdCAqc3JjICkgeworICAgICpkc3QgPSAqc3JjOworfQorCisvKiBUaHJlYWQgYmFycmllciBuZWVkcyB2b2xhdGlsZSBiYXJyaWVyIGZpZWxkcyAqLwordHlwZWRlZiBzdHJ1Y3QgS01QX0FMSUdOX0NBQ0hFIGttcF9ic3RhdGUgeworICAgIC8vIHRoX2ZpeGVkX2ljdnMgaXMgYWxpZ25lZCBieSB2aXJ0dWUgb2Yga21wX2JzdGF0ZSBiZWluZyBhbGlnbmVkIChhbmQgYWxsIHVzZXMgb2YgaXQpLgorICAgIC8vIEl0IGlzIG5vdCBleHBsaWNpdGx5IGFsaWduZWQgYmVsb3csIGJlY2F1c2Ugd2UgKmRvbid0KiB3YW50IGl0IHRvIGJlIHBhZGRlZCAtLSBpbnN0ZWFkLAorICAgIC8vIHdlIGZpdCBiX2dvIGludG8gdGhlIHNhbWUgY2FjaGUgbGluZSB3aXRoIHRoX2ZpeGVkX2ljdnMsIGVuYWJsaW5nIE5HTyBjYWNoZSBsaW5lcworICAgIC8vIHN0b3JlcyBpbiB0aGUgaGllcmFyY2hpY2FsIGJhcnJpZXIuCisgICAga21wX2ludGVybmFsX2NvbnRyb2xfdCB0aF9maXhlZF9pY3ZzOyAgICAgICAgICAvLyBJbml0aWFsIElDVnMgZm9yIHRoZSB0aHJlYWQKKyAgICAvLyBUdWNrIGJfZ28gaW50byBlbmQgb2YgdGhfZml4ZWRfaWN2cyBjYWNoZSBsaW5lLCBzbyBpdCBjYW4gYmUgc3RvcmVkIHdpdGggc2FtZSBOR08gc3RvcmUKKyAgICB2b2xhdGlsZSBrbXBfdWludDY0IGJfZ287ICAgICAgICAgICAgICAgICAgICAgIC8vIFNUQVRFID0+IHRhc2sgc2hvdWxkIHByb2NlZWQgKGhpZXJhcmNoaWNhbCkKKyAgICBLTVBfQUxJR05fQ0FDSEUgdm9sYXRpbGUga21wX3VpbnQ2NCBiX2Fycml2ZWQ7IC8vIFNUQVRFID0+IHRhc2sgcmVhY2hlZCBzeW5jaCBwb2ludC4KKyAgICBrbXBfdWludDMyICpza2lwX3Blcl9sZXZlbDsKKyAgICBrbXBfdWludDMyIG15X2xldmVsOworICAgIGttcF9pbnQzMiBwYXJlbnRfdGlkOworICAgIGttcF91aW50MzIgb2xkX3RpZDsKKyAgICBrbXBfdWludDMyIGRlcHRoOworICAgIHN0cnVjdCBrbXBfYnN0YXRlICpwYXJlbnRfYmFyOworICAgIGttcF90ZWFtX3QgKnRlYW07CisgICAga21wX3VpbnQ2NCBsZWFmX3N0YXRlOworICAgIGttcF91aW50MzIgbnByb2M7CisgICAga21wX3VpbnQ4IGJhc2VfbGVhZl9raWRzOworICAgIGttcF91aW50OCBsZWFmX2tpZHM7CisgICAga21wX3VpbnQ4IG9mZnNldDsKKyAgICBrbXBfdWludDggd2FpdF9mbGFnOworICAgIGttcF91aW50OCB1c2Vfb25jb3JlX2JhcnJpZXI7Cit9IGttcF9ic3RhdGVfdDsKKwordW5pb24gS01QX0FMSUdOX0NBQ0hFIGttcF9iYXJyaWVyX3VuaW9uIHsKKyAgICBkb3VibGUgICAgICAgYl9hbGlnbjsgICAgICAgIC8qIHVzZSB3b3JzdCBjYXNlIGFsaWdubWVudCAqLworICAgIGNoYXIgICAgICAgICBiX3BhZFsgS01QX1BBRChrbXBfYnN0YXRlX3QsIENBQ0hFX0xJTkUpIF07CisgICAga21wX2JzdGF0ZV90IGJiOworfTsKKwordHlwZWRlZiB1bmlvbiBrbXBfYmFycmllcl91bmlvbiBrbXBfYmFsaWduX3Q7CisKKy8qIFRlYW0gYmFycmllciBuZWVkcyBvbmx5IG5vbi12b2xhdGlsZSBhcnJpdmVkIGNvdW50ZXIgKi8KK3VuaW9uIEtNUF9BTElHTl9DQUNIRSBrbXBfYmFycmllcl90ZWFtX3VuaW9uIHsKKyAgICBkb3VibGUgICAgICAgYl9hbGlnbjsgICAgICAgIC8qIHVzZSB3b3JzdCBjYXNlIGFsaWdubWVudCAqLworICAgIGNoYXIgICAgICAgICBiX3BhZFsgQ0FDSEVfTElORSBdOworICAgIHN0cnVjdCB7CisgICAgICAgIGttcF91aW50ICAgICBiX2Fycml2ZWQ7ICAgICAgIC8qIFNUQVRFID0+IHRhc2sgcmVhY2hlZCBzeW5jaCBwb2ludC4gKi8KKyAgICB9OworfTsKKwordHlwZWRlZiB1bmlvbiBrbXBfYmFycmllcl90ZWFtX3VuaW9uIGttcF9iYWxpZ25fdGVhbV90OworCisvKgorICogUGFkZGluZyBmb3IgTGludXgqIE9TIHB0aHJlYWRzIGNvbmRpdGlvbiB2YXJpYWJsZXMgYW5kIG11dGV4ZXMgdXNlZCB0byBzaWduYWwKKyAqIHRocmVhZHMgd2hlbiBhIGNvbmRpdGlvbiBjaGFuZ2VzLiAgVGhpcyBpcyB0byB3b3JrYXJvdW5kIGFuIE5QVEwgYnVnCisgKiB3aGVyZSBwYWRkaW5nIHdhcyBhZGRlZCB0byBwdGhyZWFkX2NvbmRfdCB3aGljaCBjYXVzZWQgdGhlIGluaXRpYWxpemF0aW9uCisgKiByb3V0aW5lIHRvIHdyaXRlIG91dHNpZGUgb2YgdGhlIHN0cnVjdHVyZSBpZiBjb21waWxlZCBvbiBwcmUtTlBUTCB0aHJlYWRzLgorICovCisKKyNpZiBLTVBfT1NfV0lORE9XUwordHlwZWRlZiBzdHJ1Y3Qga21wX3dpbjMyX211dGV4Cit7CisgICAgLyogVGhlIExvY2sgKi8KKyAgICBDUklUSUNBTF9TRUNUSU9OIGNzOworfSBrbXBfd2luMzJfbXV0ZXhfdDsKKwordHlwZWRlZiBzdHJ1Y3Qga21wX3dpbjMyX2NvbmQKK3sKKyAgICAvKiBDb3VudCBvZiB0aGUgbnVtYmVyIG9mIHdhaXRlcnMuICovCisgICAgaW50IHdhaXRlcnNfY291bnRfOworCisgICAgLyogU2VyaWFsaXplIGFjY2VzcyB0byA8d2FpdGVyc19jb3VudF8+ICovCisgICAga21wX3dpbjMyX211dGV4X3Qgd2FpdGVyc19jb3VudF9sb2NrXzsKKworICAgIC8qIE51bWJlciBvZiB0aHJlYWRzIHRvIHJlbGVhc2UgdmlhIGEgPGNvbmRfYnJvYWRjYXN0PiBvciBhICovCisgICAgLyogPGNvbmRfc2lnbmFsPiAqLworICAgIGludCByZWxlYXNlX2NvdW50XzsKKworICAgIC8qIEtlZXBzIHRyYWNrIG9mIHRoZSBjdXJyZW50ICJnZW5lcmF0aW9uIiBzbyB0aGF0IHdlIGRvbid0IGFsbG93ICovCisgICAgLyogb25lIHRocmVhZCB0byBzdGVhbCBhbGwgdGhlICJyZWxlYXNlcyIgZnJvbSB0aGUgYnJvYWRjYXN0LiAqLworICAgIGludCB3YWl0X2dlbmVyYXRpb25fY291bnRfOworCisgICAgLyogQSBtYW51YWwtcmVzZXQgZXZlbnQgdGhhdCdzIHVzZWQgdG8gYmxvY2sgYW5kIHJlbGVhc2Ugd2FpdGluZyAqLworICAgIC8qIHRocmVhZHMuICovCisgICAgSEFORExFIGV2ZW50XzsKK30ga21wX3dpbjMyX2NvbmRfdDsKKyNlbmRpZgorCisjaWYgS01QX09TX1VOSVgKKwordW5pb24gS01QX0FMSUdOX0NBQ0hFIGttcF9jb25kX3VuaW9uIHsKKyAgICBkb3VibGUgICAgICAgICAgICAgIGNfYWxpZ247CisgICAgY2hhciAgICAgICAgICAgICAgICBjX3BhZFsgQ0FDSEVfTElORSBdOworICAgIHB0aHJlYWRfY29uZF90ICAgICAgY19jb25kOworfTsKKwordHlwZWRlZiB1bmlvbiBrbXBfY29uZF91bmlvbiBrbXBfY29uZF9hbGlnbl90OworCit1bmlvbiBLTVBfQUxJR05fQ0FDSEUga21wX211dGV4X3VuaW9uIHsKKyAgICBkb3VibGUgICAgICAgICAgICAgIG1fYWxpZ247CisgICAgY2hhciAgICAgICAgICAgICAgICBtX3BhZFsgQ0FDSEVfTElORSBdOworICAgIHB0aHJlYWRfbXV0ZXhfdCAgICAgbV9tdXRleDsKK307CisKK3R5cGVkZWYgdW5pb24ga21wX211dGV4X3VuaW9uIGttcF9tdXRleF9hbGlnbl90OworCisjZW5kaWYgLyogS01QX09TX1VOSVggKi8KKwordHlwZWRlZiBzdHJ1Y3Qga21wX2Rlc2NfYmFzZSB7CisgICAgdm9pZCAgICAqZHNfc3RhY2tiYXNlOworICAgIHNpemVfdCAgICAgICAgICAgIGRzX3N0YWNrc2l6ZTsKKyAgICBpbnQgICAgICAgICAgICAgICBkc19zdGFja2dyb3c7CisgICAga21wX3RocmVhZF90ICAgICAgZHNfdGhyZWFkOworICAgIHZvbGF0aWxlIGludCAgICAgIGRzX3RpZDsKKyAgICBpbnQgICAgICAgICAgICAgICBkc19ndGlkOworI2lmIEtNUF9PU19XSU5ET1dTCisgICAgdm9sYXRpbGUgaW50ICAgICAgZHNfYWxpdmU7CisgICAgRFdPUkQgICAgICAgICAgICAgZHNfdGhyZWFkX2lkOworICAgICAgICAvKgorICAgICAgICAgICAgZHNfdGhyZWFkIGtlZXBzIHRocmVhZCBoYW5kbGUgb24gV2luZG93cyogT1MuIEl0IGlzIGVub3VnaCBmb3IgUlRMIHB1cnBvc2VzLiBIb3dldmVyLAorICAgICAgICAgICAgZGVidWdnZXIgc3VwcG9ydCAobGlib21wX2RiKSBjYW5ub3Qgd29yayB3aXRoIGhhbmRsZXMsIGJlY2F1c2UgdGhleSB1bmNvbXBhcmFibGUuIEZvcgorICAgICAgICAgICAgZXhhbXBsZSwgZGVidWdnZXIgcmVxdWVzdHMgaW5mbyBhYm91dCB0aHJlYWQgd2l0aCBoYW5kbGUgaC4gaCBpcyB2YWxpZCB3aXRoaW4gZGVidWdnZXIKKyAgICAgICAgICAgIHByb2Nlc3MsIGFuZCBtZWFuaW5nbGVzcyB3aXRoaW4gZGVidWdlZSBwcm9jZXNzLiBFdmVuIGlmIGggaXMgZHVwZWQgYnkgY2FsbCB0bworICAgICAgICAgICAgRHVwbGljYXRlSGFuZGxlKCksIHNvIHRoZSByZXN1bHQgaCcgaXMgdmFsaWQgd2l0aGluIGRlYnVnZWUgcHJvY2VzcywgYnV0IGl0IGlzIGEgKm5ldyoKKyAgICAgICAgICAgIGhhbmRsZSB3aGljaCBkb2VzICpub3QqIGVxdWFsIHRvIGFueSBvdGhlciBoYW5kbGUgaW4gZGVidWdlZS4uLiBUaGUgb25seSB3YXkgdG8KKyAgICAgICAgICAgIGNvbXBhcmUgaGFuZGxlcyBpcyBjb252ZXJ0IHRoZW0gdG8gc3lzdGVtLXdpZGUgaWRzLiBHZXRUaHJlYWRJZCgpIGZ1bmN0aW9uIGlzCisgICAgICAgICAgICBhdmFpbGFibGUgb25seSBpbiBMb25naG9ybiBhbmQgU2VydmVyIDIwMDMuIDotKCBJbiBjb250cmFzdCwgR2V0Q3VycmVudFRocmVhZElkKCkgaXMKKyAgICAgICAgICAgIGF2YWlsYWJsZSBvbiBhbGwgV2luZG93cyogT1MgZmxhdm91cnMgKGluY2x1ZGluZyBXaW5kb3dzKiA5NSkuIFRodXMsIHdlIGhhdmUgdG8gZ2V0IHRocmVhZCBpZCBieQorICAgICAgICAgICAgY2FsbCB0byBHZXRDdXJyZW50VGhyZWFkSWQoKSBmcm9tIHdpdGhpbiB0aGUgdGhyZWFkIGFuZCBzYXZlIGl0IHRvIGxldCBsaWJvbXBfZGIKKyAgICAgICAgICAgIGlkZW50aWZ5IHRocmVhZHMuCisgICAgICAgICovCisjZW5kaWYgLyogS01QX09TX1dJTkRPV1MgKi8KK30ga21wX2Rlc2NfYmFzZV90OworCit0eXBlZGVmIHVuaW9uIEtNUF9BTElHTl9DQUNIRSBrbXBfZGVzYyB7CisgICAgZG91YmxlICAgICAgICAgICBkc19hbGlnbjsgICAgICAgIC8qIHVzZSB3b3JzdCBjYXNlIGFsaWdubWVudCAqLworICAgIGNoYXIgICAgICAgICAgICAgZHNfcGFkWyBLTVBfUEFEKGttcF9kZXNjX2Jhc2VfdCwgQ0FDSEVfTElORSkgXTsKKyAgICBrbXBfZGVzY19iYXNlX3QgIGRzOworfSBrbXBfZGVzY190OworCisKK3R5cGVkZWYgc3RydWN0IGttcF9sb2NhbCB7CisgICAgdm9sYXRpbGUgaW50ICAgICAgICAgICB0aGlzX2NvbnN0cnVjdDsgLyogY291bnQgb2Ygc2luZ2xlJ3MgZW5jb3VudGVyZWQgYnkgdGhyZWFkICovCisgICAgdm9pZCAgICAgICAgICAgICAgICAgICpyZWR1Y2VfZGF0YTsKKyNpZiBLTVBfVVNFX0JHRVQKKyAgICB2b2lkICAgICAgICAgICAgICAgICAgKmJnZXRfZGF0YTsKKyAgICB2b2lkICAgICAgICAgICAgICAgICAgKmJnZXRfbGlzdDsKKyNpZiAhIFVTRV9DTVBfWENIR19GT1JfQkdFVAorI2lmZGVmIFVTRV9RVUVVSU5HX0xPQ0tfRk9SX0JHRVQKKyAgICBrbXBfbG9ja190ICAgICAgICAgICAgIGJnZXRfbG9jazsgICAgICAvKiBMb2NrIGZvciBhY2Nlc3NpbmcgYmdldCBmcmVlIGxpc3QgKi8KKyNlbHNlCisgICAga21wX2Jvb3RzdHJhcF9sb2NrX3QgICBiZ2V0X2xvY2s7ICAgICAgLyogTG9jayBmb3IgYWNjZXNzaW5nIGJnZXQgZnJlZSBsaXN0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTXVzdCBiZSBib290c3RyYXAgbG9jayBzbyB3ZSBjYW4gdXNlIGl0IGF0IGxpYnJhcnkgc2h1dGRvd24gKi8KKyNlbmRpZiAvKiBVU0VfTE9DS19GT1JfQkdFVCAqLworI2VuZGlmIC8qICEgVVNFX0NNUF9YQ0hHX0ZPUl9CR0VUICovCisjZW5kaWYgLyogS01QX1VTRV9CR0VUICovCisKKyNpZmRlZiBCVUlMRF9UVgorICAgIHN0cnVjdCB0dl9kYXRhICAgICAgICAqdHZfZGF0YTsKKyNlbmRpZgorCisgICAgUEFDS0VEX1JFRFVDVElPTl9NRVRIT0RfVCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZDsgLyogc3RvcmVkIGJ5IF9fa21wY19yZWR1Y2UqKCksIHVzZWQgYnkgX19rbXBjX2VuZF9yZWR1Y2UqKCkgKi8KKworfSBrbXBfbG9jYWxfdDsKKworI2RlZmluZSBnZXRfX2Jsb2NrdGltZSggeHRlYW0sIHh0aWQgKSAgICAgKCh4dGVhbSktPnQudF90aHJlYWRzWyh4dGlkKV0tPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5ibG9ja3RpbWUpCisjZGVmaW5lIGdldF9fYnRfc2V0KCB4dGVhbSwgeHRpZCApICAgICAgICAoKHh0ZWFtKS0+dC50X3RocmVhZHNbKHh0aWQpXS0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLmJ0X3NldCkKKyNkZWZpbmUgZ2V0X19idF9pbnRlcnZhbHMoIHh0ZWFtLCB4dGlkICkgICgoeHRlYW0pLT50LnRfdGhyZWFkc1soeHRpZCldLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMuYnRfaW50ZXJ2YWxzKQorCisjZGVmaW5lIGdldF9fbmVzdGVkXzIoeHRlYW0seHRpZCkgICAgICAgICAoKHh0ZWFtKS0+dC50X3RocmVhZHNbKHh0aWQpXS0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLm5lc3RlZCkKKyNkZWZpbmUgZ2V0X19keW5hbWljXzIoeHRlYW0seHRpZCkgICAgICAgICgoeHRlYW0pLT50LnRfdGhyZWFkc1soeHRpZCldLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMuZHluYW1pYykKKyNkZWZpbmUgZ2V0X19ucHJvY18yKHh0ZWFtLHh0aWQpICAgICAgICAgICgoeHRlYW0pLT50LnRfdGhyZWFkc1soeHRpZCldLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMubnByb2MpCisjZGVmaW5lIGdldF9fc2NoZWRfMih4dGVhbSx4dGlkKSAgICAgICAgICAoKHh0ZWFtKS0+dC50X3RocmVhZHNbKHh0aWQpXS0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLnNjaGVkKQorCisjZGVmaW5lIHNldF9fYmxvY2t0aW1lX3RlYW0oIHh0ZWFtLCB4dGlkLCB4dmFsICkgXAorICAgICAgICAoICggKHh0ZWFtKS0+dC50X3RocmVhZHNbKHh0aWQpXS0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLmJsb2NrdGltZSApICAgID0gKHh2YWwpICkKKworI2RlZmluZSBzZXRfX2J0X2ludGVydmFsc190ZWFtKCB4dGVhbSwgeHRpZCwgeHZhbCApIFwKKyAgICAgICAgKCAoICh4dGVhbSktPnQudF90aHJlYWRzWyh4dGlkKV0tPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5idF9pbnRlcnZhbHMgKSA9ICh4dmFsKSApCisKKyNkZWZpbmUgc2V0X19idF9zZXRfdGVhbSggeHRlYW0sIHh0aWQsIHh2YWwgKSBcCisgICAgICAgICggKCAoeHRlYW0pLT50LnRfdGhyZWFkc1soeHRpZCldLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMuYnRfc2V0ICkgICAgICAgPSAoeHZhbCkgKQorCisKKyNkZWZpbmUgc2V0X19uZXN0ZWQoIHh0aHJlYWQsIHh2YWwgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICggKCAoeHRocmVhZCktPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5uZXN0ZWQgKSA9ICh4dmFsKSApCisjZGVmaW5lIGdldF9fbmVzdGVkKCB4dGhyZWFkICkgXAorICAgICAgICAoICggKHh0aHJlYWQpLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMubmVzdGVkICkgPyAoRlROX1RSVUUpIDogKEZUTl9GQUxTRSkgKQorCisjZGVmaW5lIHNldF9fZHluYW1pYyggeHRocmVhZCwgeHZhbCApICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKCAoICh4dGhyZWFkKS0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLmR5bmFtaWMgKSA9ICh4dmFsKSApCisjZGVmaW5lIGdldF9fZHluYW1pYyggeHRocmVhZCApIFwKKyAgICAgICAgKCAoICh4dGhyZWFkKS0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLmR5bmFtaWMgKSA/IChGVE5fVFJVRSkgOiAoRlROX0ZBTFNFKSApCisKKyNkZWZpbmUgc2V0X19ucHJvYyggeHRocmVhZCwgeHZhbCApICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKCAoICh4dGhyZWFkKS0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLm5wcm9jICkgPSAoeHZhbCkgKQorCisjZGVmaW5lIHNldF9fbWF4X2FjdGl2ZV9sZXZlbHMoIHh0aHJlYWQsIHh2YWwgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICggKCAoeHRocmVhZCktPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5tYXhfYWN0aXZlX2xldmVscyApID0gKHh2YWwpICkKKworI2RlZmluZSBzZXRfX3NjaGVkKCB4dGhyZWFkLCB4dmFsICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoICggKHh0aHJlYWQpLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMuc2NoZWQgKSA9ICh4dmFsKSApCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorCisjZGVmaW5lIHNldF9fcHJvY19iaW5kKCB4dGhyZWFkLCB4dmFsICkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKCAoICh4dGhyZWFkKS0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLnByb2NfYmluZCApID0gKHh2YWwpICkKKyNkZWZpbmUgZ2V0X19wcm9jX2JpbmQoIHh0aHJlYWQgKSBcCisgICAgICAgICggKHh0aHJlYWQpLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMucHJvY19iaW5kICkKKworI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvLyBPcGVuTVAgdGFza2luZyBkYXRhIHN0cnVjdHVyZXMKKy8vCisKK3R5cGVkZWYgZW51bSBrbXBfdGFza2luZ19tb2RlIHsKKyAgICB0c2ttX2ltbWVkaWF0ZV9leGVjID0gMCwKKyAgICB0c2ttX2V4dHJhX2JhcnJpZXIgPSAxLAorICAgIHRza21fdGFza190ZWFtcyA9IDIsCisgICAgdHNrbV9tYXggPSAyCit9IGttcF90YXNraW5nX21vZGVfdDsKKworZXh0ZXJuIGttcF90YXNraW5nX21vZGVfdCBfX2ttcF90YXNraW5nX21vZGU7ICAgICAgICAgLyogZGV0ZXJtaW5lcyBob3cvd2hlbiB0byBleGVjdXRlIHRhc2tzICovCitleHRlcm4ga21wX2ludDMyIF9fa21wX3Rhc2tfc3RlYWxpbmdfY29uc3RyYWludDsKKworLyogTk9URToga21wX3Rhc2tkYXRhX3QgYW5kIGttcF90YXNrX3Qgc3RydWN0dXJlcyBhbGxvY2F0ZWQgaW4gc2luZ2xlIGJsb2NrIHdpdGggdGFza2RhdGEgZmlyc3QgKi8KKyNkZWZpbmUgS01QX1RBU0tfVE9fVEFTS0RBVEEodGFzaykgICAgICgoKGttcF90YXNrZGF0YV90ICopIHRhc2spIC0gMSkKKyNkZWZpbmUgS01QX1RBU0tEQVRBX1RPX1RBU0sodGFza2RhdGEpIChrbXBfdGFza190ICopICh0YXNrZGF0YSArIDEpCisKKy8vIFRoZSB0dF9mb3VuZF90YXNrcyBmbGFnIGlzIGEgc2lnbmFsIHRvIGFsbCB0aHJlYWRzIGluIHRoZSB0ZWFtIHRoYXQgdGFza3Mgd2VyZSBzcGF3bmVkIGFuZAorLy8gcXVldWVkIHNpbmNlIHRoZSBwcmV2aW91cyBiYXJyaWVyIHJlbGVhc2UuCisvLyBTdGF0ZSBpcyB1c2VkIHRvIGFsdGVybmF0ZSB0YXNrIHRlYW1zIGZvciBzdWNjZXNzaXZlIGJhcnJpZXJzCisjZGVmaW5lIEtNUF9UQVNLSU5HX0VOQUJMRUQodGFza190ZWFtLHN0YXRlKSBcCisgICAgKChUQ1JfU1lOQ180KCh0YXNrX3RlYW0pLT50dC50dF9mb3VuZF90YXNrcykgPT0gVFJVRSkgJiYgXAorICAgICAoVENSXzQoKHRhc2tfdGVhbSktPnR0LnR0X3N0YXRlKSAgICAgICA9PSAoc3RhdGUpKSkKKy8qIQorQGluZ3JvdXAgQkFTSUNfVFlQRVMKK0B7CisqLworCisvKiEKKyAqLwordHlwZWRlZiBrbXBfaW50MzIgKCoga21wX3JvdXRpbmVfZW50cnlfdCkoIGttcF9pbnQzMiwgdm9pZCAqICk7CisKKy8qICBzaXplb2Zfa21wX3Rhc2tfdCBwYXNzZWQgYXMgYXJnIHRvIGttcGNfb21wX3Rhc2sgY2FsbCAgKi8KKy8qIQorICovCit0eXBlZGVmIHN0cnVjdCBrbXBfdGFzayB7ICAgICAgICAgICAgICAgICAgIC8qIEdFSDogU2hvdWxkbid0IHRoaXMgYmUgYWxpZ25lZCBzb21laG93PyAqLworICAgIHZvaWQgKiAgICAgICAgICAgICAgc2hhcmVkczsgICAgICAgICAgICAvKio8IHBvaW50ZXIgdG8gYmxvY2sgb2YgcG9pbnRlcnMgdG8gc2hhcmVkIHZhcnMgICAqLworICAgIGttcF9yb3V0aW5lX2VudHJ5X3Qgcm91dGluZTsgICAgICAgICAgICAvKio8IHBvaW50ZXIgdG8gcm91dGluZSB0byBjYWxsIGZvciBleGVjdXRpbmcgdGFzayAqLworICAgIGttcF9pbnQzMiAgICAgICAgICAgcGFydF9pZDsgICAgICAgICAgICAvKio8IHBhcnQgaWQgZm9yIHRoZSB0YXNrICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2lmIE9NUF80MF9FTkFCTEVECisgICAga21wX3JvdXRpbmVfZW50cnlfdCBkZXN0cnVjdG9yczsgICAgICAgIC8qIHBvaW50ZXIgdG8gZnVuY3Rpb24gdG8gaW52b2tlIGRlY29uc3RydWN0b3JzIG9mIGZpcnN0cHJpdmF0ZSBDKysgb2JqZWN0cyAqLworI2VuZGlmIC8vIE9NUF80MF9FTkFCTEVECisgICAgLyogIHByaXZhdGUgdmFycyAgKi8KK30ga21wX3Rhc2tfdDsKKworLyohCitAfQorKi8KKworI2lmIE9NUF80MF9FTkFCTEVECit0eXBlZGVmIHN0cnVjdCBrbXBfdGFza2dyb3VwIHsKKyAgICBrbXBfdWludDMyICAgICAgICAgICAgY291bnQ7ICAgLy8gbnVtYmVyIG9mIGFsbG9jYXRlZCBhbmQgbm90IHlldCBjb21wbGV0ZSB0YXNrcworICAgIGttcF9pbnQzMiAgICAgICAgICAgICBjYW5jZWxfcmVxdWVzdDsgLy8gcmVxdWVzdCBmb3IgY2FuY2VsbGF0aW9uIG9mIHRoaXMgdGFza2dyb3VwCisgICAgc3RydWN0IGttcF90YXNrZ3JvdXAgKnBhcmVudDsgIC8vIHBhcmVudCB0YXNrZ3JvdXAKK30ga21wX3Rhc2tncm91cF90OworCisKKy8vIGZvcndhcmQgZGVjbGFyYXRpb25zCit0eXBlZGVmIHVuaW9uIGttcF9kZXBub2RlICAgICAgIGttcF9kZXBub2RlX3Q7Cit0eXBlZGVmIHN0cnVjdCBrbXBfZGVwbm9kZV9saXN0ICBrbXBfZGVwbm9kZV9saXN0X3Q7Cit0eXBlZGVmIHN0cnVjdCBrbXBfZGVwaGFzaF9lbnRyeSBrbXBfZGVwaGFzaF9lbnRyeV90OworCit0eXBlZGVmIHN0cnVjdCBrbXBfZGVwZW5kX2luZm8geworICAgICBrbXBfaW50cHRyX3QgICAgICAgICAgICAgICBiYXNlX2FkZHI7CisgICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgIGxlbjsKKyAgICAgc3RydWN0IHsKKyAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgaW46MTsKKyAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgb3V0OjE7CisgICAgIH0gZmxhZ3M7Cit9IGttcF9kZXBlbmRfaW5mb190OworCitzdHJ1Y3Qga21wX2RlcG5vZGVfbGlzdCB7CisgICBrbXBfZGVwbm9kZV90ICogICAgICAgICAgICAgIG5vZGU7CisgICBrbXBfZGVwbm9kZV9saXN0X3QgKiAgICAgICAgIG5leHQ7Cit9OworCit0eXBlZGVmIHN0cnVjdCBrbXBfYmFzZV9kZXBub2RlIHsKKyAgICBrbXBfZGVwbm9kZV9saXN0X3QgICAgICAgICogc3VjY2Vzc29yczsKKyAgICBrbXBfdGFza190ICAgICAgICAgICAgICAgICogdGFzazsKKworICAgIGttcF9sb2NrX3QgICAgICAgICAgICAgICAgICBsb2NrOworCisjaWYgS01QX1NVUFBPUlRfR1JBUEhfT1VUUFVUCisgICAga21wX3VpbnQzMiAgICAgICAgICAgICAgICAgIGlkOworI2VuZGlmCisKKyAgICB2b2xhdGlsZSBrbXBfaW50MzIgICAgICAgICAgbnByZWRlY2Vzc29yczsKKyAgICB2b2xhdGlsZSBrbXBfaW50MzIgICAgICAgICAgbnJlZnM7Cit9IGttcF9iYXNlX2RlcG5vZGVfdDsKKwordW5pb24gS01QX0FMSUdOX0NBQ0hFIGttcF9kZXBub2RlIHsKKyAgICBkb3VibGUgICAgICAgICAgZG5fYWxpZ247ICAgICAgICAvKiB1c2Ugd29yc3QgY2FzZSBhbGlnbm1lbnQgKi8KKyAgICBjaGFyICAgICAgICAgICAgZG5fcGFkWyBLTVBfUEFEKGttcF9iYXNlX2RlcG5vZGVfdCwgQ0FDSEVfTElORSkgXTsKKyAgICBrbXBfYmFzZV9kZXBub2RlX3QgZG47Cit9OworCitzdHJ1Y3Qga21wX2RlcGhhc2hfZW50cnkgeworICAgIGttcF9pbnRwdHJfdCAgICAgICAgICAgICAgIGFkZHI7CisgICAga21wX2RlcG5vZGVfdCAgICAgICAgICAgICogbGFzdF9vdXQ7CisgICAga21wX2RlcG5vZGVfbGlzdF90ICAgICAgICogbGFzdF9pbnM7CisgICAga21wX2RlcGhhc2hfZW50cnlfdCAgICAgICogbmV4dF9pbl9idWNrZXQ7Cit9OworCit0eXBlZGVmIHN0cnVjdCBrbXBfZGVwaGFzaCB7CisgICBrbXBfZGVwaGFzaF9lbnRyeV90ICAgICAqKiBidWNrZXRzOworI2lmZGVmIEtNUF9ERUJVRworICAga21wX3VpbnQzMiAgICAgICAgICAgICAgICAgbmVsZW1lbnRzOworICAga21wX3VpbnQzMiAgICAgICAgICAgICAgICAgbmNvbmZsaWN0czsKKyNlbmRpZgorfSBrbXBfZGVwaGFzaF90OworCisjZW5kaWYKKworI2lmZGVmIEJVSUxEX1RJRURfVEFTS19TVEFDSworCisvKiBUaWVkIFRhc2sgc3RhY2sgZGVmaW5pdGlvbnMgKi8KK3R5cGVkZWYgc3RydWN0IGttcF9zdGFja19ibG9jayB7CisgICAga21wX3Rhc2tkYXRhX3QgKiAgICAgICAgICBzYl9ibG9ja1sgVEFTS19TVEFDS19CTE9DS19TSVpFIF07CisgICAgc3RydWN0IGttcF9zdGFja19ibG9jayAqICBzYl9uZXh0OworICAgIHN0cnVjdCBrbXBfc3RhY2tfYmxvY2sgKiAgc2JfcHJldjsKK30ga21wX3N0YWNrX2Jsb2NrX3Q7CisKK3R5cGVkZWYgc3RydWN0IGttcF90YXNrX3N0YWNrIHsKKyAgICBrbXBfc3RhY2tfYmxvY2tfdCAgICAgICAgIHRzX2ZpcnN0X2Jsb2NrOyAgLy8gZmlyc3QgYmxvY2sgb2Ygc3RhY2sgZW50cmllcworICAgIGttcF90YXNrZGF0YV90ICoqICAgICAgICAgdHNfdG9wOyAgICAgICAgICAvLyBwb2ludGVyIHRvIHRoZSB0b3Agb2Ygc3RhY2sKKyAgICBrbXBfaW50MzIgICAgICAgICAgICAgICAgIHRzX2VudHJpZXM7ICAgICAgLy8gbnVtYmVyIG9mIGVudHJpZXMgb24gdGhlIHN0YWNrCit9IGttcF90YXNrX3N0YWNrX3Q7CisKKyNlbmRpZiAvLyBCVUlMRF9USUVEX1RBU0tfU1RBQ0sKKwordHlwZWRlZiBzdHJ1Y3Qga21wX3Rhc2tpbmdfZmxhZ3MgeyAgICAgICAgICAvKiBUb3RhbCBzdHJ1Y3QgbXVzdCBiZSBleGFjdGx5IDMyIGJpdHMgKi8KKyAgICAvKiBDb21waWxlciBmbGFncyAqLyAgICAgICAgICAgICAgICAgICAgLyogVG90YWwgY29tcGlsZXIgZmxhZ3MgbXVzdCBiZSAxNiBiaXRzICovCisgICAgdW5zaWduZWQgdGllZG5lc3MgICAgOiAxOyAgICAgICAgICAgICAgIC8qIHRhc2sgaXMgZWl0aGVyIHRpZWQgKDEpIG9yIHVudGllZCAoMCkgKi8KKyAgICB1bnNpZ25lZCBmaW5hbCAgICAgICA6IDE7ICAgICAgICAgICAgICAgLyogdGFzayBpcyBmaW5hbCgxKSBzbyBleGVjdXRlIGltbWVkaWF0ZWx5ICovCisgICAgdW5zaWduZWQgbWVyZ2VkX2lmMCAgOiAxOyAgICAgICAgICAgICAgIC8qIG5vIF9fa21wY190YXNrX3tiZWdpbi9jb21wbGV0ZX1faWYwIGNhbGxzIGluIGlmMCBjb2RlIHBhdGggKi8KKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIHVuc2lnbmVkIGRlc3RydWN0b3JzX3RodW5rIDogMTsgICAgICAgICAvKiBzZXQgaWYgdGhlIGNvbXBpbGVyIGNyZWF0ZXMgYSB0aHVuayB0byBpbnZva2UgZGVzdHJ1Y3RvcnMgZnJvbSB0aGUgcnVudGltZSAqLworICAgIHVuc2lnbmVkIHJlc2VydmVkICAgIDogMTI7ICAgICAgICAgICAgICAvKiByZXNlcnZlZCBmb3IgY29tcGlsZXIgdXNlICovCisjZWxzZSAvLyBPTVBfNDBfRU5BQkxFRAorICAgIHVuc2lnbmVkIHJlc2VydmVkICAgIDogMTM7ICAgICAgICAgICAgICAvKiByZXNlcnZlZCBmb3IgY29tcGlsZXIgdXNlICovCisjZW5kaWYgLy8gT01QXzQwX0VOQUJMRUQKKworICAgIC8qIExpYnJhcnkgZmxhZ3MgKi8gICAgICAgICAgICAgICAgICAgICAvKiBUb3RhbCBsaWJyYXJ5IGZsYWdzIG11c3QgYmUgMTYgYml0cyAqLworICAgIHVuc2lnbmVkIHRhc2t0eXBlICAgIDogMTsgICAgICAgICAgICAgICAvKiB0YXNrIGlzIGVpdGhlciBleHBsaWNpdCgxKSBvciBpbXBsaWNpdCAoMCkgKi8KKyAgICB1bnNpZ25lZCB0YXNrX3NlcmlhbCA6IDE7ICAgICAgICAgICAgICAgLyogdGhpcyB0YXNrIGlzIGV4ZWN1dGVkIGltbWVkaWF0ZWx5ICgxKSBvciBkZWZlcnJlZCAoMCkgKi8KKyAgICB1bnNpZ25lZCB0YXNraW5nX3NlciA6IDE7ICAgICAgICAgICAgICAgLyogYWxsIHRhc2tzIGluIHRlYW0gYXJlIGVpdGhlciBleGVjdXRlZCBpbW1lZGlhdGVseSAoMSkgb3IgbWF5IGJlIGRlZmVycmVkICgwKSAqLworICAgIHVuc2lnbmVkIHRlYW1fc2VyaWFsIDogMTsgICAgICAgICAgICAgICAvKiBlbnRpcmUgdGVhbSBpcyBzZXJpYWwgKDEpIFsxIHRocmVhZF0gb3IgcGFyYWxsZWwgKDApIFs+PSAyIHRocmVhZHNdICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElmIGVpdGhlciB0ZWFtX3NlcmlhbCBvciB0YXNraW5nX3NlciBpcyBzZXQsIHRhc2sgdGVhbSBtYXkgYmUgTlVMTCAqLworICAgIC8qIFRhc2sgU3RhdGUgRmxhZ3M6ICovCisgICAgdW5zaWduZWQgc3RhcnRlZCAgICAgOiAxOyAgICAgICAgICAgICAgIC8qIDE9PXN0YXJ0ZWQsIDA9PW5vdCBzdGFydGVkICAgICAqLworICAgIHVuc2lnbmVkIGV4ZWN1dGluZyAgIDogMTsgICAgICAgICAgICAgICAvKiAxPT1leGVjdXRpbmcsIDA9PW5vdCBleGVjdXRpbmcgKi8KKyAgICB1bnNpZ25lZCBjb21wbGV0ZSAgICA6IDE7ICAgICAgICAgICAgICAgLyogMT09Y29tcGxldGUsIDA9PW5vdCBjb21wbGV0ZSAgICovCisgICAgdW5zaWduZWQgZnJlZWQgICAgICAgOiAxOyAgICAgICAgICAgICAgIC8qIDE9PWZyZWVkLCAwPT1hbGxvY2F0ZWVkICAgICAgICAqLworICAgIHVuc2lnbmVkIG5hdGl2ZSAgICAgIDogMTsgICAgICAgICAgICAgICAvKiAxPT1nY2MtY29tcGlsZWQgdGFzaywgMD09aW50ZWwgKi8KKyAgICB1bnNpZ25lZCByZXNlcnZlZDMxICA6IDc7ICAgICAgICAgICAgICAgLyogcmVzZXJ2ZWQgZm9yIGxpYnJhcnkgdXNlICovCisKK30ga21wX3Rhc2tpbmdfZmxhZ3NfdDsKKworCitzdHJ1Y3Qga21wX3Rhc2tkYXRhIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbGlnbmVkIGR1cmluZyBkeW5hbWljIGFsbG9jYXRpb24gICAgICAgKi8KKyAgICBrbXBfaW50MzIgICAgICAgICAgICAgICB0ZF90YXNrX2lkOyAgICAgICAgICAgICAgIC8qIGlkLCBhc3NpZ25lZCBieSBkZWJ1Z2dlciAgICAgICAgICAgICAgICAqLworICAgIGttcF90YXNraW5nX2ZsYWdzX3QgICAgIHRkX2ZsYWdzOyAgICAgICAgICAgICAgICAgLyogdGFzayBmbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAga21wX3RlYW1fdCAqICAgICAgICAgICAgdGRfdGVhbTsgICAgICAgICAgICAgICAgICAvKiB0ZWFtIGZvciB0aGlzIHRhc2sgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBrbXBfaW5mb19wICogICAgICAgICAgICB0ZF9hbGxvY190aHJlYWQ7ICAgICAgICAgIC8qIHRocmVhZCB0aGF0IGFsbG9jYXRlZCBkYXRhIHN0cnVjdHVyZXMgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ3VycmVudGx5IG5vdCB1c2VkIGV4Y2VwdCBmb3IgcGVyaGFwcyBJREIgKi8KKyAgICBrbXBfdGFza2RhdGFfdCAqICAgICAgICB0ZF9wYXJlbnQ7ICAgICAgICAgICAgICAgIC8qIHBhcmVudCB0YXNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGttcF9pbnQzMiAgICAgICAgICAgICAgIHRkX2xldmVsOyAgICAgICAgICAgICAgICAgLyogdGFzayBuZXN0aW5nIGxldmVsICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaWRlbnRfdCAqICAgICAgICAgICAgICAgdGRfaWRlbnQ7ICAgICAgICAgICAgICAgICAvKiB0YXNrIGlkZW50aWZpZXIgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUYXNrd2FpdCBkYXRhLgorICAgIGlkZW50X3QgKiAgICAgICAgICAgICAgIHRkX3Rhc2t3YWl0X2lkZW50OworICAgIGttcF91aW50MzIgICAgICAgICAgICAgIHRkX3Rhc2t3YWl0X2NvdW50ZXI7CisgICAga21wX2ludDMyICAgICAgICAgICAgICAgdGRfdGFza3dhaXRfdGhyZWFkOyAgICAgICAvKiBndGlkICsgMSBvZiB0aHJlYWQgZW5jb3VudGVyZWQgdGFza3dhaXQgKi8KKyAgICBLTVBfQUxJR05fQ0FDSEUga21wX2ludGVybmFsX2NvbnRyb2xfdCAgdGRfaWN2czsgIC8qIEludGVybmFsIGNvbnRyb2wgdmFyaWFibGVzIGZvciB0aGUgdGFzayAqLworICAgIHZvbGF0aWxlIGttcF91aW50MzIgICAgIHRkX2FsbG9jYXRlZF9jaGlsZF90YXNrczsgIC8qIENoaWxkIHRhc2tzICgrIGN1cnJlbnQgdGFzaykgbm90IHlldCBkZWFsbG9jYXRlZCAqLworICAgIHZvbGF0aWxlIGttcF91aW50MzIgICAgIHRkX2luY29tcGxldGVfY2hpbGRfdGFza3M7IC8qIENoaWxkIHRhc2tzIG5vdCB5ZXQgY29tcGxldGUgKi8KKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIGttcF90YXNrZ3JvdXBfdCAqICAgICAgIHRkX3Rhc2tncm91cDsgICAgICAgICAvLyBFYWNoIHRhc2sga2VlcHMgcG9pbnRlciB0byBpdHMgY3VycmVudCB0YXNrZ3JvdXAKKyAgICBrbXBfZGVwaGFzaF90ICogICAgICAgICB0ZF9kZXBoYXNoOyAgICAgICAgICAgLy8gRGVwZW5kZW5jaWVzIGZvciBjaGlsZHJlbiB0YXNrcyBhcmUgdHJhY2tlZCBmcm9tIGhlcmUKKyAgICBrbXBfZGVwbm9kZV90ICogICAgICAgICB0ZF9kZXBub2RlOyAgICAgICAgICAgLy8gUG9pbnRlciB0byBncmFwaCBub2RlIGlmIHRoaXMgdGFzayBoYXMgZGVwZW5kZW5jaWVzCisjZW5kaWYKKyNpZiBLTVBfSEFWRV9RVUFECisgICAgX1F1YWQgICAgICAgICAgICAgICAgICAgdGRfZHVtbXk7ICAgICAgICAgICAgIC8vIEFsaWduIHN0cnVjdHVyZSAxNi1ieXRlIHNpemUgc2luY2UgYWxsb2NhdGVkIGp1c3QgYmVmb3JlIGttcF90YXNrX3QKKyNlbHNlCisgICAga21wX3VpbnQzMiAgICAgICAgICAgICAgdGRfZHVtbXlbMl07CisjZW5kaWYKK307IC8vIHN0cnVjdCBrbXBfdGFza2RhdGEKKworLy8gTWFrZSBzdXJlIHBhZGRpbmcgYWJvdmUgd29ya2VkCitLTVBfQlVJTERfQVNTRVJUKCBzaXplb2Yoa21wX3Rhc2tkYXRhX3QpICUgc2l6ZW9mKHZvaWQgKikgPT0gMCApOworCisvLyBEYXRhIGZvciB0YXNrIHRlYW0gYnV0IHBlciB0aHJlYWQKK3R5cGVkZWYgc3RydWN0IGttcF9iYXNlX3RocmVhZF9kYXRhIHsKKyAgICBrbXBfaW5mb19wICogICAgICAgICAgICB0ZF90aHI7ICAgICAgICAgICAgICAgIC8vIFBvaW50ZXIgYmFjayB0byB0aHJlYWQgaW5mbworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXNlZCBvbmx5IGluIF9fa21wX2V4ZWN1dGVfdGFza3NfdGVtcGxhdGUsIG1heWJlIG5vdCBhdmFpbCB1bnRpbCB0YXNrIGlzIHF1ZXVlZD8KKyAgICBrbXBfYm9vdHN0cmFwX2xvY2tfdCAgICB0ZF9kZXF1ZV9sb2NrOyAgICAgICAgIC8vIExvY2sgZm9yIGFjY2Vzc2luZyBkZXF1ZQorICAgIGttcF90YXNrZGF0YV90ICoqICAgICAgIHRkX2RlcXVlOyAgICAgICAgICAgICAgLy8gRGVxdWUgb2YgdGFza3MgZW5jb3VudGVyZWQgYnkgdGRfdGhyLCBkeW5hbWljYWxseSBhbGxvY2F0ZWQKKyAgICBrbXBfdWludDMyICAgICAgICAgICAgICB0ZF9kZXF1ZV9oZWFkOyAgICAgICAgIC8vIEhlYWQgb2YgZGVxdWUgKHdpbGwgd3JhcCkKKyAgICBrbXBfdWludDMyICAgICAgICAgICAgICB0ZF9kZXF1ZV90YWlsOyAgICAgICAgIC8vIFRhaWwgb2YgZGVxdWUgKHdpbGwgd3JhcCkKKyAgICBrbXBfaW50MzIgICAgICAgICAgICAgICB0ZF9kZXF1ZV9udGFza3M7ICAgICAgIC8vIE51bWJlciBvZiB0YXNrcyBpbiBkZXF1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR0VIOiBzaG91bGRuJ3QgdGhpcyBiZSB2b2xhdGlsZSBzaW5jZSB1c2VkIGluIHdoaWxlLXNwaW4/CisgICAga21wX2ludDMyICAgICAgICAgICAgICAgdGRfZGVxdWVfbGFzdF9zdG9sZW47ICAvLyBUaHJlYWQgbnVtYmVyIG9mIGxhc3Qgc3VjY2Vzc2Z1bCBzdGVhbAorI2lmZGVmIEJVSUxEX1RJRURfVEFTS19TVEFDSworICAgIGttcF90YXNrX3N0YWNrX3QgICAgICAgIHRkX3N1c3BfdGllZF90YXNrczsgICAgLy8gU3RhY2sgb2Ygc3VzcGVuZGVkIHRpZWQgdGFza3MgZm9yIHRhc2sgc2NoZWR1bGluZyBjb25zdHJhaW50CisjZW5kaWYgLy8gQlVJTERfVElFRF9UQVNLX1NUQUNLCit9IGttcF9iYXNlX3RocmVhZF9kYXRhX3Q7CisKK3R5cGVkZWYgdW5pb24gS01QX0FMSUdOX0NBQ0hFIGttcF90aHJlYWRfZGF0YSB7CisgICAga21wX2Jhc2VfdGhyZWFkX2RhdGFfdCAgdGQ7CisgICAgZG91YmxlICAgICAgICAgICAgICAgICAgdGRfYWxpZ247ICAgICAgIC8qIHVzZSB3b3JzdCBjYXNlIGFsaWdubWVudCAqLworICAgIGNoYXIgICAgICAgICAgICAgICAgICAgIHRkX3BhZFsgS01QX1BBRChrbXBfYmFzZV90aHJlYWRfZGF0YV90LCBDQUNIRV9MSU5FKSBdOworfSBrbXBfdGhyZWFkX2RhdGFfdDsKKworCisvLyBEYXRhIGZvciB0YXNrIHRlYW1zIHdoaWNoIGFyZSB1c2VkIHdoZW4gdGFza2luZyBpcyBlbmFibGVkIGZvciB0aGUgdGVhbQordHlwZWRlZiBzdHJ1Y3Qga21wX2Jhc2VfdGFza190ZWFtIHsKKyAgICBrbXBfYm9vdHN0cmFwX2xvY2tfdCAgICB0dF90aHJlYWRzX2xvY2s7ICAgICAgIC8qIExvY2sgdXNlZCB0byBhbGxvY2F0ZSBwZXItdGhyZWFkIHBhcnQgb2YgdGFzayB0ZWFtICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtdXN0IGJlIGJvb3RzdHJhcCBsb2NrIHNpbmNlIHVzZWQgYXQgbGlicmFyeSBzaHV0ZG93biovCisgICAga21wX3Rhc2tfdGVhbV90ICogICAgICAgdHRfbmV4dDsgICAgICAgICAgICAgICAvKiBGb3IgbGlua2luZyB0aGUgdGFzayB0ZWFtIGZyZWUgbGlzdCAqLworICAgIGttcF90aHJlYWRfZGF0YV90ICogICAgIHR0X3RocmVhZHNfZGF0YTsgICAgICAgLyogQXJyYXkgb2YgcGVyLXRocmVhZCBzdHJ1Y3R1cmVzIGZvciB0YXNrIHRlYW0gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERhdGEgc3Vydml2ZXMgdGFzayB0ZWFtIGRlYWxsb2NhdGlvbiAqLworICAgIGttcF9pbnQzMiAgICAgICAgICAgICAgIHR0X2ZvdW5kX3Rhc2tzOyAgICAgICAgLyogSGF2ZSB3ZSBmb3VuZCB0YXNrcyBhbmQgcXVldWVkIHRoZW0gd2hpbGUgZXhlY3V0aW5nIHRoaXMgdGVhbT8gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRSVUUgbWVhbnMgdHRfdGhyZWFkc19kYXRhIGlzIHNldCB1cCBhbmQgaW5pdGlhbGl6ZWQgKi8KKyAgICBrbXBfaW50MzIgICAgICAgICAgICAgICB0dF9ucHJvYzsgICAgICAgICAgICAgIC8qICN0aHJlYWRzIGluIHRlYW0gICAgICAgICAgICovCisgICAga21wX2ludDMyICAgICAgICAgICAgICAgdHRfbWF4X3RocmVhZHM7ICAgICAgICAvKiBudW1iZXIgb2YgZW50cmllcyBhbGxvY2F0ZWQgZm9yIHRocmVhZHNfZGF0YSBhcnJheSAqLworCisgICAgS01QX0FMSUdOX0NBQ0hFCisgICAgdm9sYXRpbGUga21wX3VpbnQzMiAgICAgdHRfdW5maW5pc2hlZF90aHJlYWRzOyAvKiAjdGhyZWFkcyBzdGlsbCBhY3RpdmUgICAgICAqLworCisgICAgS01QX0FMSUdOX0NBQ0hFCisgICAgdm9sYXRpbGUga21wX3VpbnQzMiAgICAgdHRfYWN0aXZlOyAgICAgICAgICAgICAvKiBpcyB0aGUgdGVhbSBzdGlsbCBhY3RpdmVseSBleGVjdXRpbmcgdGFza3MgKi8KKworICAgIEtNUF9BTElHTl9DQUNIRQorI2lmIEtNUF9VU0VfSU5URVJOT0RFX0FMSUdOTUVOVAorICAgIGttcF9pbnQzMiAgICAgICAgICAgICAgIHR0X3BhZG1lW0lOVEVSTk9ERV9DQUNIRV9MSU5FL3NpemVvZihrbXBfaW50MzIpXTsKKyNlbmRpZgorCisgICAgdm9sYXRpbGUga21wX3VpbnQzMiAgICAgdHRfcmVmX2N0OyAgICAgICAgICAgICAvKiAjdGhyZWFkcyBhY2Nlc3Npbmcgc3RydWN0ICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKG5vdCBpbmNsLiBtYXN0ZXIpICAgICAgICAgKi8KKyAgICBrbXBfaW50MzIgICAgICAgICAgICAgICB0dF9zdGF0ZTsgICAgICAgICAgICAgIC8qIGFsdGVybmF0aW5nIDAvMSBmb3IgdGFzayB0ZWFtIGlkZW50aWZpY2F0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOb3RlOiBWRVJZIHNlbnNpdGl2ZSB0byBwYWRkaW5nISAqLworfSBrbXBfYmFzZV90YXNrX3RlYW1fdDsKKwordW5pb24gS01QX0FMSUdOX0NBQ0hFIGttcF90YXNrX3RlYW0geworICAgIGttcF9iYXNlX3Rhc2tfdGVhbV90IHR0OworICAgIGRvdWJsZSAgICAgICAgICAgICAgIHR0X2FsaWduOyAgICAgICAvKiB1c2Ugd29yc3QgY2FzZSBhbGlnbm1lbnQgKi8KKyAgICBjaGFyICAgICAgICAgICAgICAgICB0dF9wYWRbIEtNUF9QQUQoa21wX2Jhc2VfdGFza190ZWFtX3QsIENBQ0hFX0xJTkUpIF07Cit9OworCisjaWYgKCBVU0VfRkFTVF9NRU1PUlkgPT0gMyApIHx8ICggVVNFX0ZBU1RfTUVNT1JZID09IDUgKQorLy8gRnJlZSBsaXN0cyBrZWVwIHNhbWUtc2l6ZSBmcmVlIG1lbW9yeSBzbG90cyBmb3IgZmFzdCBtZW1vcnkgYWxsb2NhdGlvbiByb3V0aW5lcwordHlwZWRlZiBzdHJ1Y3Qga21wX2ZyZWVfbGlzdCB7CisgICAgdm9pZCAgICAgICAgICAgICAqdGhfZnJlZV9saXN0X3NlbGY7ICAgLy8gU2VsZi1hbGxvY2F0ZWQgdGFza3MgZnJlZSBsaXN0CisgICAgdm9pZCAgICAgICAgICAgICAqdGhfZnJlZV9saXN0X3N5bmM7ICAgLy8gU2VsZi1hbGxvY2F0ZWQgdGFza3Mgc3RvbGVuL3JldHVybmVkIGJ5IG90aGVyIHRocmVhZHMKKyAgICB2b2lkICAgICAgICAgICAgICp0aF9mcmVlX2xpc3Rfb3RoZXI7ICAvLyBOb24tc2VsZiBmcmVlIGxpc3QgKHRvIGJlIHJldHVybmVkIHRvIG93bmVyJ3Mgc3luYyBsaXN0KQorfSBrbXBfZnJlZV9saXN0X3Q7CisjZW5kaWYKKyNpZiBLTVBfTkVTVEVEX0hPVF9URUFNUworLy8gSG90IHRlYW1zIGFycmF5IGtlZXBzIGhvdCB0ZWFtcyBhbmQgdGhlaXIgc2l6ZXMgZm9yIGdpdmVuIHRocmVhZC4KKy8vIEhvdCB0ZWFtcyBhcmUgbm90IHB1dCBpbiB0ZWFtcyBwb29sLCBhbmQgdGhleSBkb24ndCBwdXQgdGhyZWFkcyBpbiB0aHJlYWRzIHBvb2wuCit0eXBlZGVmIHN0cnVjdCBrbXBfaG90X3RlYW1fcHRyIHsKKyAgICBrbXBfdGVhbV9wICpob3RfdGVhbTsgICAgICAvLyBwb2ludGVyIHRvIGhvdF90ZWFtIG9mIGdpdmVuIG5lc3RpbmcgbGV2ZWwKKyAgICBrbXBfaW50MzIgICBob3RfdGVhbV9udGg7ICAvLyBudW1iZXIgb2YgdGhyZWFkcyBhbGxvY2F0ZWQgZm9yIHRoZSBob3RfdGVhbQorfSBrbXBfaG90X3RlYW1fcHRyX3Q7CisjZW5kaWYKKyNpZiBPTVBfNDBfRU5BQkxFRAordHlwZWRlZiBzdHJ1Y3Qga21wX3RlYW1zX3NpemUgeworICAgIGttcF9pbnQzMiAgIG50ZWFtczsgICAgICAgIC8vIG51bWJlciBvZiB0ZWFtcyBpbiBhIGxlYWd1ZQorICAgIGttcF9pbnQzMiAgIG50aDsgICAgICAgICAgIC8vIG51bWJlciBvZiB0aHJlYWRzIGluIGVhY2ggdGVhbSBvZiB0aGUgbGVhZ3VlCit9IGttcF90ZWFtc19zaXplX3Q7CisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvLyBPcGVuTVAgdGhyZWFkIGRhdGEgc3RydWN0dXJlcworLy8KKwordHlwZWRlZiBzdHJ1Y3QgS01QX0FMSUdOX0NBQ0hFIGttcF9iYXNlX2luZm8geworLyoKKyAqIFN0YXJ0IHdpdGggdGhlIHJlYWRvbmx5IGRhdGEgd2hpY2ggaXMgY2FjaGUgYWxpZ25lZCBhbmQgcGFkZGVkLgorICogdGhpcyBpcyB3cml0dGVuIGJlZm9yZSB0aGUgdGhyZWFkIHN0YXJ0cyB3b3JraW5nIGJ5IHRoZSBtYXN0ZXIuCisgKiAodWJlciBtYXN0ZXJzIG1heSB1cGRhdGUgdGhlbXNlbHZlcyBsYXRlcikKKyAqICh1c2FnZSBkb2VzIG5vdCBjb25zaWRlciBzZXJpYWxpemVkIHJlZ2lvbnMpCisgKi8KKyAgICBrbXBfZGVzY190ICAgICAgICB0aF9pbmZvOworICAgIGttcF90ZWFtX3AgICAgICAgKnRoX3RlYW07ICAgICAgIC8qIHRlYW0gd2UgYmVsb25nIHRvICovCisgICAga21wX3Jvb3RfcCAgICAgICAqdGhfcm9vdDsgICAgICAgLyogcG9pbnRlciB0byByb290IG9mIHRhc2sgaGllcmFyY2h5ICovCisgICAga21wX2luZm9fcCAgICAgICAqdGhfbmV4dF9wb29sOyAgLyogbmV4dCBhdmFpbGFibGUgdGhyZWFkIGluIHRoZSBwb29sICovCisgICAga21wX2Rpc3BfdCAgICAgICAqdGhfZGlzcGF0Y2g7ICAgLyogdGhyZWFkJ3MgZGlzcGF0Y2ggZGF0YSAqLworICAgIGludCAgICAgICAgICAgICAgIHRoX2luX3Bvb2w7ICAgIC8qIGluIHRocmVhZCBwb29sICgzMiBiaXRzIGZvciBUQ1IvVENXKSAqLworCisgICAgLyogVGhlIGZvbGxvd2luZyBhcmUgY2FjaGVkIGZyb20gdGhlIHRlYW0gaW5mbyBzdHJ1Y3R1cmUgKi8KKyAgICAvKiBUT0RPIHVzZSB0aGVzZSBpbiBtb3JlIHBsYWNlcyBhcyBkZXRlcm1pbmVkIHRvIGJlIG5lZWRlZCB2aWEgcHJvZmlsaW5nICovCisgICAgaW50ICAgICAgICAgICAgICAgdGhfdGVhbV9ucHJvYzsgICAgICAvKiBudW1iZXIgb2YgdGhyZWFkcyBpbiBhIHRlYW0gKi8KKyAgICBrbXBfaW5mb19wICAgICAgICp0aF90ZWFtX21hc3RlcjsgICAgIC8qIHRoZSB0ZWFtJ3MgbWFzdGVyIHRocmVhZCAqLworICAgIGludCAgICAgICAgICAgICAgIHRoX3RlYW1fc2VyaWFsaXplZDsgLyogdGVhbSBpcyBzZXJpYWxpemVkICovCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBtaWNyb3Rhc2tfdCAgICAgICB0aF90ZWFtc19taWNyb3Rhc2s7IC8qIHNhdmUgZW50cnkgYWRkcmVzcyBmb3IgdGVhbXMgY29uc3RydWN0ICovCisgICAgaW50ICAgICAgICAgICAgICAgdGhfdGVhbXNfbGV2ZWw7ICAgICAvKiBzYXZlIGluaXRpYWwgbGV2ZWwgb2YgdGVhbXMgY29uc3RydWN0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpdCBpcyAwIG9uIGRldmljZSBidXQgbWF5IGJlIGFueSBvbiBob3N0ICovCisjZW5kaWYKKworICAgIC8qIFRoZSBibG9ja3RpbWUgaW5mbyBpcyBjb3BpZWQgZnJvbSB0aGUgdGVhbSBzdHJ1Y3QgdG8gdGhlIHRocmVhZCBzcnVjdCAqLworICAgIC8qIGF0IHRoZSBzdGFydCBvZiBhIGJhcnJpZXIsIGFuZCB0aGUgdmFsdWVzIHN0b3JlZCBpbiB0aGUgdGVhbSBhcmUgdXNlZCAqLworICAgIC8qIGF0IHBvaW50cyBpbiB0aGUgY29kZSB3aGVyZSB0aGUgdGVhbSBzdHJ1Y3QgaXMgbm8gbG9uZ2VyIGd1YXJhbnRlZWQgICAqLworICAgIC8qIHRvIGV4aXN0IChmcm9tIHRoZSBQT1Ygb2Ygd29ya2VyIHRocmVhZHMpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGludCAgICAgICAgICAgICAgIHRoX3RlYW1fYnRfaW50ZXJ2YWxzOworICAgIGludCAgICAgICAgICAgICAgIHRoX3RlYW1fYnRfc2V0OworCisKKyNpZiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAga21wX2FmZmluX21hc2tfdCAgKnRoX2FmZmluX21hc2s7IC8qIHRocmVhZCdzIGN1cnJlbnQgYWZmaW5pdHkgbWFzayAqLworI2VuZGlmCisKKy8qCisgKiBUaGUgZGF0YSBzZXQgYnkgdGhlIG1hc3RlciBhdCByZWluaXQsIHRoZW4gUi9XIGJ5IHRoZSB3b3JrZXIKKyAqLworICAgIEtNUF9BTElHTl9DQUNIRSBpbnQgICAgIHRoX3NldF9ucHJvYzsgIC8qIGlmID4gMCwgdGhlbiBvbmx5IHVzZSB0aGlzIHJlcXVlc3QgZm9yIHRoZSBuZXh0IGZvcmsgKi8KKyNpZiBLTVBfTkVTVEVEX0hPVF9URUFNUworICAgIGttcF9ob3RfdGVhbV9wdHJfdCAgICAgKnRoX2hvdF90ZWFtczsgICAgIC8qIGFycmF5IG9mIGhvdCB0ZWFtcyAqLworI2VuZGlmCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBrbXBfcHJvY19iaW5kX3QgICAgICAgICB0aF9zZXRfcHJvY19iaW5kOyAvKiBpZiAhPSBwcm9jX2JpbmRfZGVmYXVsdCwgdXNlIHJlcXVlc3QgZm9yIG5leHQgZm9yayAqLworICAgIGttcF90ZWFtc19zaXplX3QgICAgICAgIHRoX3RlYW1zX3NpemU7ICAgIC8qIG51bWJlciBvZiB0ZWFtcy90aHJlYWRzIGluIHRlYW1zIGNvbnN0cnVjdCAqLworIyBpZiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgdGhfY3VycmVudF9wbGFjZTsgLyogcGxhY2UgY3VycmVudGx5IGJvdW5kIHRvICovCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgdGhfbmV3X3BsYWNlOyAgICAgLyogcGxhY2UgdG8gYmluZCB0byBpbiBwYXIgcmVnICovCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgdGhfZmlyc3RfcGxhY2U7ICAgLyogZmlyc3QgcGxhY2UgaW4gcGFydGl0aW9uICovCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgdGhfbGFzdF9wbGFjZTsgICAgLyogbGFzdCBwbGFjZSBpbiBwYXJ0aXRpb24gKi8KKyMgZW5kaWYKKyNlbmRpZgorI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBrbXBfdWludDY0ICAgICAgICAgICAgICB0aF9iYXJfYXJyaXZlX3RpbWU7ICAgICAgICAgICAvKiBhcnJpdmFsIHRvIGJhcnJpZXIgdGltZXN0YW1wICovCisgICAga21wX3VpbnQ2NCAgICAgICAgICAgICAgdGhfYmFyX21pbl90aW1lOyAgICAgICAgICAgICAgLyogbWluaW11bSBhcnJpdmFsIHRpbWUgYXQgdGhlIGJhcnJpZXIgKi8KKyAgICBrbXBfdWludDY0ICAgICAgICAgICAgICB0aF9mcmFtZV90aW1lOyAgICAgICAgICAgICAgICAvKiBmcmFtZSB0aW1lc3RhbXAgKi8KKyAgICBrbXBfdWludDY0ICAgICAgICAgICAgICB0aF9mcmFtZV90aW1lX3NlcmlhbGl6ZWQ7ICAgICAvKiBmcmFtZSB0aW1lc3RhbXAgaW4gc2VyaWFsaXplZCBwYXJhbGxlbCAqLworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICBrbXBfbG9jYWxfdCAgICAgICAgICAgICB0aF9sb2NhbDsKKyAgICBzdHJ1Y3QgcHJpdmF0ZV9jb21tb24gICp0aF9wcmlfaGVhZDsKKworLyoKKyAqIE5vdyB0aGUgZGF0YSBvbmx5IHVzZWQgYnkgdGhlIHdvcmtlciAoYWZ0ZXIgaW5pdGlhbCBhbGxvY2F0aW9uKQorICovCisgICAgLyogVE9ETyB0aGUgZmlyc3Qgc2VyaWFsIHRlYW0gc2hvdWxkIGFjdHVhbGx5IGJlIHN0b3JlZCBpbiB0aGUgaW5mb190CisgICAgICogc3RydWN0dXJlLiAgdGhpcyB3aWxsIGhlbHAgcmVkdWNlIGluaXRpYWwgYWxsb2NhdGlvbiBvdmVyaGVhZCAqLworICAgIEtNUF9BTElHTl9DQUNIRSBrbXBfdGVhbV9wICp0aF9zZXJpYWxfdGVhbTsgLypzZXJpYWxpemVkIHRlYW0gaGVsZCBpbiByZXNlcnZlKi8KKy8qIFRoZSBmb2xsb3dpbmcgYXJlIGFsc28gcmVhZCBieSB0aGUgbWFzdGVyIGR1cmluZyByZWluaXQgKi8KKyAgICBzdHJ1Y3QgY29tbW9uX3RhYmxlICAgICp0aF9wcmlfY29tbW9uOworCisgICAgdm9sYXRpbGUga21wX3VpbnQzMiAgICAgdGhfc3Bpbl9oZXJlOyAgIC8qIHRocmVhZC1sb2NhbCBsb2NhdGlvbiBmb3Igc3Bpbm5pbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogd2hpbGUgYXdhaXRpbmcgcXVldWluZyBsb2NrIGFjcXVpcmUgKi8KKworICAgIHZvbGF0aWxlIHZvaWQgICAgICAgICAgKnRoX3NsZWVwX2xvYzsgICAvLyB0aGlzIHBvaW50cyBhdCBhIGttcF9mbGFnPFQ+CisKKyAgICBpZGVudF90ICAgICAgICAgICp0aF9pZGVudDsKKyAgICB1bnNpZ25lZCAgICAgICAgIHRoX3g7ICAgICAgICAgICAgICAgICAgICAgLy8gUmFuZG9tIG51bWJlciBnZW5lcmF0b3IgZGF0YQorICAgIHVuc2lnbmVkICAgICAgICAgdGhfYTsgICAgICAgICAgICAgICAgICAgICAvLyBSYW5kb20gbnVtYmVyIGdlbmVyYXRvciBkYXRhCisKKy8qCisgKiBUYXNraW5nLXJlbGF0ZWQgZGF0YSBmb3IgdGhlIHRocmVhZAorICovCisgICAga21wX3Rhc2tfdGVhbV90ICAgICogdGhfdGFza190ZWFtOyAgICAgICAgICAgLy8gVGFzayB0ZWFtIHN0cnVjdAorICAgIGttcF90YXNrZGF0YV90ICAgICAqIHRoX2N1cnJlbnRfdGFzazsgICAgICAgIC8vIElubmVybW9zdCBUYXNrIGJlaW5nIGV4ZWN1dGVkCisgICAga21wX3VpbnQ4ICAgICAgICAgICAgdGhfdGFza19zdGF0ZTsgICAgICAgICAgLy8gYWx0ZXJuYXRpbmcgMC8xIGZvciB0YXNrIHRlYW0gaWRlbnRpZmljYXRpb24KKworICAgIC8qCisgICAgICogTW9yZSBzdHVmZiBmb3Iga2VlcGluZyB0cmFjayBvZiBhY3RpdmUvc2xlZXBpbmcgdGhyZWFkcworICAgICAqICh0aGlzIHBhcnQgaXMgd3JpdHRlbiBieSB0aGUgd29ya2VyIHRocmVhZCkKKyAgICAgKi8KKyAgICBrbXBfdWludDggICAgICAgICAgICB0aF9hY3RpdmVfaW5fcG9vbDsgICAgICAvLyBpbmNsdWRlZCBpbiBjb3VudCBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICNhY3RpdmUgdGhyZWFkcyBpbiBwb29sCisgICAgaW50ICAgICAgICAgICAgICAgICAgdGhfYWN0aXZlOyAgICAgICAgICAgICAgLy8gISBzbGVlcGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDMyIGJpdHMgZm9yIFRDUi9UQ1cKKworCisgICAgc3RydWN0IGNvbnNfaGVhZGVyICogdGhfY29uczsgLy8gdXNlZCBmb3IgY29uc2lzdGVuY3kgY2hlY2sKKworLyoKKyAqIEFkZCB0aGUgc3luY3Jvbml6aW5nIGRhdGEgd2hpY2ggaXMgY2FjaGUgYWxpZ25lZCBhbmQgcGFkZGVkLgorICovCisgICAgS01QX0FMSUdOX0NBQ0hFIGttcF9iYWxpZ25fdCAgICAgIHRoX2JhclsgYnNfbGFzdF9iYXJyaWVyIF07CisKKyAgICBLTVBfQUxJR05fQ0FDSEUgdm9sYXRpbGUgICAgIGttcF9pbnQzMiAgICB0aF9uZXh0X3dhaXRpbmc7ICAvKiBndGlkKzEgb2YgbmV4dCB0aHJlYWQgb24gbG9jayB3YWl0IHF1ZXVlLCAwIGlmIG5vbmUgKi8KKworI2lmICggVVNFX0ZBU1RfTUVNT1JZID09IDMgKSB8fCAoIFVTRV9GQVNUX01FTU9SWSA9PSA1ICkKKyAgICAjZGVmaW5lIE5VTV9MSVNUUyA0CisgICAga21wX2ZyZWVfbGlzdF90ICAgdGhfZnJlZV9saXN0c1tOVU1fTElTVFNdOyAgIC8vIEZyZWUgbGlzdHMgZm9yIGZhc3QgbWVtb3J5IGFsbG9jYXRpb24gcm91dGluZXMKKyNlbmRpZgorCisjaWYgS01QX09TX1dJTkRPV1MKKyAgICBrbXBfd2luMzJfY29uZF90ICB0aF9zdXNwZW5kX2N2OworICAgIGttcF93aW4zMl9tdXRleF90IHRoX3N1c3BlbmRfbXg7CisgICAgaW50ICAgICAgICAgICAgICAgdGhfc3VzcGVuZF9pbml0OworI2VuZGlmCisjaWYgS01QX09TX1VOSVgKKyAgICBrbXBfY29uZF9hbGlnbl90ICB0aF9zdXNwZW5kX2N2OworICAgIGttcF9tdXRleF9hbGlnbl90IHRoX3N1c3BlbmRfbXg7CisgICAgaW50ICAgICAgICAgICAgICAgdGhfc3VzcGVuZF9pbml0X2NvdW50OworI2VuZGlmCisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAga21wX2l0dF9tYXJrX3QgICAgICAgIHRoX2l0dF9tYXJrX3NpbmdsZTsKKyAgICAvLyBhbGlnbm1lbnQgPz8/CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworI2lmIEtNUF9TVEFUU19FTkFCTEVECisgICAga21wX3N0YXRzX2xpc3QqIHRoX3N0YXRzOworI2VuZGlmCit9IGttcF9iYXNlX2luZm9fdDsKKwordHlwZWRlZiB1bmlvbiBLTVBfQUxJR05fQ0FDSEUga21wX2luZm8geworICAgIGRvdWJsZSAgICAgICAgICB0aF9hbGlnbjsgICAgICAgIC8qIHVzZSB3b3JzdCBjYXNlIGFsaWdubWVudCAqLworICAgIGNoYXIgICAgICAgICAgICB0aF9wYWRbIEtNUF9QQUQoa21wX2Jhc2VfaW5mb190LCBDQUNIRV9MSU5FKSBdOworICAgIGttcF9iYXNlX2luZm9fdCB0aDsKK30ga21wX2luZm9fdDsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvLyBPcGVuTVAgdGhyZWFkIHRlYW0gZGF0YSBzdHJ1Y3R1cmVzCisvLwordHlwZWRlZiBzdHJ1Y3Qga21wX2Jhc2VfZGF0YSB7CisgICAgdm9sYXRpbGUga21wX3VpbnQzMiB0X3ZhbHVlOworfSBrbXBfYmFzZV9kYXRhX3Q7CisKK3R5cGVkZWYgdW5pb24gS01QX0FMSUdOX0NBQ0hFIGttcF9zbGVlcF90ZWFtIHsKKyAgICBkb3VibGUgICAgICAgICAgICAgIGR0X2FsaWduOyAgICAgICAgLyogdXNlIHdvcnN0IGNhc2UgYWxpZ25tZW50ICovCisgICAgY2hhciAgICAgICAgICAgICAgICBkdF9wYWRbIEtNUF9QQUQoa21wX2Jhc2VfZGF0YV90LCBDQUNIRV9MSU5FKSBdOworICAgIGttcF9iYXNlX2RhdGFfdCAgICAgZHQ7Cit9IGttcF9zbGVlcF90ZWFtX3Q7CisKK3R5cGVkZWYgdW5pb24gS01QX0FMSUdOX0NBQ0hFIGttcF9vcmRlcmVkX3RlYW0geworICAgIGRvdWJsZSAgICAgICAgICAgICAgZHRfYWxpZ247ICAgICAgICAvKiB1c2Ugd29yc3QgY2FzZSBhbGlnbm1lbnQgKi8KKyAgICBjaGFyICAgICAgICAgICAgICAgIGR0X3BhZFsgS01QX1BBRChrbXBfYmFzZV9kYXRhX3QsIENBQ0hFX0xJTkUpIF07CisgICAga21wX2Jhc2VfZGF0YV90ICAgICBkdDsKK30ga21wX29yZGVyZWRfdGVhbV90OworCit0eXBlZGVmIGludCAgICAgKCpsYXVuY2hfdCkoIGludCBndGlkICk7CisKKy8qIE1pbmltdW0gbnVtYmVyIG9mIEFSR1YgZW50cmllcyB0byBtYWxsb2MgaWYgbmVjZXNzYXJ5ICovCisjZGVmaW5lIEtNUF9NSU5fTUFMTE9DX0FSR1ZfRU5UUklFUyAgICAgMTAwCisKKy8vIFNldCB1cCBob3cgbWFueSBhcmd2IHBvaW50ZXJzIHdpbGwgZml0IGluIGNhY2hlIGxpbmVzIGNvbnRhaW5pbmcgdF9pbmxpbmVfYXJndi4gSGlzdG9yaWNhbGx5LCB3ZQorLy8gaGF2ZSBzdXBwb3J0ZWQgYXQgbGVhc3QgOTYgYnl0ZXMuIFVzaW5nIGEgbGFyZ2VyIHZhbHVlIGZvciBtb3JlIHNwYWNlIGJldHdlZW4gdGhlIG1hc3RlciB3cml0ZS93b3JrZXIKKy8vIHJlYWQgc2VjdGlvbiBhbmQgcmVhZC93cml0ZSBieSBhbGwgc2VjdGlvbiBzZWVtcyB0byBidXkgbW9yZSBwZXJmb3JtYW5jZSBvbiBFUENDIFBBUkFMTEVMLgorI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKyMgZGVmaW5lIEtNUF9JTkxJTkVfQVJHVl9CWVRFUyAgICAgICAgICggNCAqIENBQ0hFX0xJTkUgLSAoICggMyAqIEtNUF9QVFJfU0tJUCArIDIgKiBzaXplb2YoaW50KSArIDIgKiBzaXplb2Yoa21wX2ludDgpICsgc2l6ZW9mKGttcF9pbnQxNikgKyBzaXplb2Yoa21wX3VpbnQzMikgKSAlIENBQ0hFX0xJTkUgKSApCisjZWxzZQorIyBkZWZpbmUgS01QX0lOTElORV9BUkdWX0JZVEVTICAgICAgICAgKCAyICogQ0FDSEVfTElORSAtICggKCAzICogS01QX1BUUl9TS0lQICsgMiAqIHNpemVvZihpbnQpICkgJSBDQUNIRV9MSU5FICkgKQorI2VuZGlmCisjZGVmaW5lIEtNUF9JTkxJTkVfQVJHVl9FTlRSSUVTICAgICAgICAoaW50KSggS01QX0lOTElORV9BUkdWX0JZVEVTIC8gS01QX1BUUl9TS0lQICkKKwordHlwZWRlZiBzdHJ1Y3QgS01QX0FMSUdOX0NBQ0hFIGttcF9iYXNlX3RlYW0geworICAgIC8vIFN5bmNocm9uaXphdGlvbiBEYXRhIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEtNUF9BTElHTl9DQUNIRSBrbXBfb3JkZXJlZF90ZWFtX3QgdF9vcmRlcmVkOworICAgIGttcF9iYWxpZ25fdGVhbV90ICAgICAgICB0X2JhclsgYnNfbGFzdF9iYXJyaWVyIF07CisgICAgdm9sYXRpbGUgaW50ICAgICAgICAgICAgIHRfY29uc3RydWN0OyAgICAvLyBjb3VudCBvZiBzaW5nbGUgZGlyZWN0aXZlIGVuY291bnRlcmVkIGJ5IHRlYW0KKyAgICBrbXBfbG9ja190ICAgICAgICAgICAgICAgdF9zaW5nbGVfbG9jazsgIC8vIHRlYW0gc3BlY2lmaWMgbG9jaworCisgICAgLy8gTWFzdGVyIG9ubHkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBLTVBfQUxJR05fQ0FDSEUgaW50ICAgICAgdF9tYXN0ZXJfdGlkOyAgIC8vIHRpZCBvZiBtYXN0ZXIgaW4gcGFyZW50IHRlYW0KKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgdF9tYXN0ZXJfdGhpc19jb25zOyAvLyAidGhpc19jb25zdHJ1Y3QiIHNpbmdsZSBjb3VudGVyIG9mIG1hc3RlciBpbiBwYXJlbnQgdGVhbQorICAgIGlkZW50X3QgICAgICAgICAgICAgICAgICp0X2lkZW50OyAgICAgICAgLy8gaWYgdm9sYXRpbGUsIGhhdmUgdG8gY2hhbmdlIHRvbyBtdWNoIG90aGVyIGNydWQgdG8gdm9sYXRpbGUgdG9vCisgICAga21wX3RlYW1fcCAgICAgICAgICAgICAgKnRfcGFyZW50OyAgICAgICAvLyBwYXJlbnQgdGVhbQorICAgIGttcF90ZWFtX3AgICAgICAgICAgICAgICp0X25leHRfcG9vbDsgICAgLy8gbmV4dCBmcmVlIHRlYW0gaW4gdGhlIHRlYW0gcG9vbAorICAgIGttcF9kaXNwX3QgICAgICAgICAgICAgICp0X2Rpc3BhdGNoOyAgICAgLy8gdGhyZWFkJ3MgZGlzcGF0Y2ggZGF0YQorICAgIGttcF90YXNrX3RlYW1fdCAgICAgICAgICp0X3Rhc2tfdGVhbTsgICAgLy8gVGFzayB0ZWFtIHN0cnVjdAorI2lmIE9NUF80MF9FTkFCTEVECisgICAga21wX3Byb2NfYmluZF90ICAgICAgICAgIHRfcHJvY19iaW5kOyAgICAvLyBiaW5kIHR5cGUgZm9yIHBhciByZWdpb24KKyNlbmRpZiAvLyBPTVBfNDBfRU5BQkxFRAorI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBrbXBfdWludDY0ICAgICAgICAgICAgICAgdF9yZWdpb25fdGltZTsgIC8vIHJlZ2lvbiBiZWdpbiB0aW1lc3RhbXAKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICAvLyBNYXN0ZXIgd3JpdGUsIHdvcmtlcnMgcmVhZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEtNUF9BTElHTl9DQUNIRSB2b2lkICAgKip0X2FyZ3Y7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgIHRfYXJnYzsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgdF9ucHJvYzsgICAgICAgIC8vIG51bWJlciBvZiB0aHJlYWRzIGluIHRlYW0KKyAgICBtaWNyb3Rhc2tfdCAgICAgICAgICAgICAgdF9wa2ZuOworICAgIGxhdW5jaF90ICAgICAgICAgICAgICAgICB0X2ludm9rZTsgICAgICAgLy8gcHJvY2VkdXJlIHRvIGxhdW5jaCB0aGUgbWljcm90YXNrCisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorICAgIGttcF9pbnQ4ICAgICAgICAgICAgICAgICB0X2ZwX2NvbnRyb2xfc2F2ZWQ7CisgICAga21wX2ludDggICAgICAgICAgICAgICAgIHRfcGFkMmI7CisgICAga21wX2ludDE2ICAgICAgICAgICAgICAgIHRfeDg3X2ZwdV9jb250cm9sX3dvcmQ7IC8vIEZQIGNvbnRyb2wgcmVncworICAgIGttcF91aW50MzIgICAgICAgICAgICAgICB0X214Y3NyOworI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKworICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICp0X2lubGluZV9hcmd2WyBLTVBfSU5MSU5FX0FSR1ZfRU5UUklFUyBdOworCisgICAgS01QX0FMSUdOX0NBQ0hFIGttcF9pbmZvX3QgKip0X3RocmVhZHM7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgIHRfbWF4X2FyZ2M7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgIHRfbWF4X25wcm9jOyAgICAvLyBtYXhpbXVtIHRocmVhZHMgdGhpcyB0ZWFtIGNhbiBoYW5kbGUgKGR5bmFtaWNseSBleHBhbmRhYmxlKQorICAgIGludCAgICAgICAgICAgICAgICAgICAgICB0X3NlcmlhbGl6ZWQ7ICAgLy8gbGV2ZWxzIGRlZXAgb2Ygc2VyaWFsaXplZCB0ZWFtcworICAgIGRpc3BhdGNoX3NoYXJlZF9pbmZvX3QgICp0X2Rpc3BfYnVmZmVyOyAgLy8gYnVmZmVycyBmb3IgZGlzcGF0Y2ggc3lzdGVtCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgIHRfaWQ7ICAgICAgICAgICAvLyB0ZWFtJ3MgaWQsIGFzc2lnbmVkIGJ5IGRlYnVnZ2VyLgorICAgIGludCAgICAgICAgICAgICAgICAgICAgICB0X2xldmVsOyAgICAgICAgLy8gbmVzdGVkIHBhcmFsbGVsIGxldmVsCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgIHRfYWN0aXZlX2xldmVsOyAvLyBuZXN0ZWQgYWN0aXZlIHBhcmFsbGVsIGxldmVsCisgICAga21wX3Jfc2NoZWRfdCAgICAgICAgICAgIHRfc2NoZWQ7ICAgICAgICAvLyBydW4tdGltZSBzY2hlZHVsZSBmb3IgdGhlIHRlYW0KKyNpZiBPTVBfNDBfRU5BQkxFRCAmJiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgIHRfZmlyc3RfcGxhY2U7ICAvLyBmaXJzdCAmIGxhc3QgcGxhY2UgaW4gcGFyZW50IHRocmVhZCdzIHBhcnRpdGlvbi4KKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgdF9sYXN0X3BsYWNlOyAgIC8vIFJlc3RvcmUgdGhlc2UgdmFsdWVzIHRvIG1hc3RlciBhZnRlciBwYXIgcmVnaW9uLgorI2VuZGlmIC8vIE9NUF80MF9FTkFCTEVEICYmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICBpbnQgdF9zaXplX2NoYW5nZWQ7IC8vIHRlYW0gc2l6ZSB3YXMgY2hhbmdlZD86IDA6IG5vLCAxOiB5ZXMsIC0xOiBjaGFuZ2VkIHZpYSBvbXBfc2V0X251bV90aHJlYWRzKCkgY2FsbAorCisgICAgLy8gUmVhZC93cml0ZSBieSB3b3JrZXJzIGFzIHdlbGwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisgICAgLy8gVXNpbmcgQ0FDSEVfTElORT02NCByZWR1Y2VzIG1lbW9yeSBmb290cHJpbnQsIGJ1dCBjYXVzZXMgYSBiaWcgcGVyZiByZWdyZXNzaW9uIG9mIGVwY2MgJ3BhcmFsbGVsJworICAgIC8vIGFuZCAnYmFycmllcicgb24gZnhlMjU2bGluMDEuIFRoaXMgZXh0cmEgcGFkZGluZyBzZXJ2ZXMgdG8gZml4IHRoZSBwZXJmb3JtYW5jZSBvZiBlcGNjICdwYXJhbGxlbCcKKyAgICAvLyBhbmQgJ2JhcnJpZXInIHdoZW4gQ0FDSEVfTElORT02NC4gVE9ETzogaW52ZXN0aWdhdGUgbW9yZSBhbmQgZ2V0IHJpZCBpZiB0aGlzIHBhZGRpbmcuCisgICAgY2hhciBkdW1teV9wYWRkaW5nWzEwMjRdOworI2VuZGlmCisgICAgS01QX0FMSUdOX0NBQ0hFIGttcF90YXNrZGF0YV90ICp0X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGE7ICAvLyBUYXNrZGF0YSBmb3IgdGhlIHRocmVhZCdzIGltcGxpY2l0IHRhc2sKKyAgICBrbXBfaW50ZXJuYWxfY29udHJvbF90ICAqdF9jb250cm9sX3N0YWNrX3RvcDsgIC8vIGludGVybmFsIGNvbnRyb2wgc3RhY2sgZm9yIGFkZGl0aW9uYWwgbmVzdGVkIHRlYW1zLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIFNFUklBTElaRUQgdGVhbXMgbmVzdGVkIDIgb3IgbW9yZSBsZXZlbHMgZGVlcAorI2lmIE9NUF80MF9FTkFCTEVECisgICAga21wX2ludDMyICAgICAgICAgICAgICAgIHRfY2FuY2VsX3JlcXVlc3Q7IC8vIHR5cGVkIGZsYWcgdG8gc3RvcmUgcmVxdWVzdCBzdGF0ZSBvZiBjYW5jZWxsYXRpb24KKyNlbmRpZgorICAgIGludCAgICAgICAgICAgICAgICAgICAgICB0X21hc3Rlcl9hY3RpdmU7ICAvLyBzYXZlIG9uIGZvcmssIHJlc3RvcmUgb24gam9pbgorICAgIGttcF90YXNrcV90ICAgICAgICAgICAgICB0X3Rhc2txOyAgICAgICAgICAvLyB0aGlzIHRlYW0ncyB0YXNrIHF1ZXVlCisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgKnRfY29weXByaXZfZGF0YTsgIC8vIHRlYW0gc3BlY2lmaWMgcG9pbnRlciB0byBjb3B5cHJpdmF0ZSBkYXRhIGFycmF5CisgICAga21wX3VpbnQzMiAgICAgICAgICAgICAgIHRfY29weWluX2NvdW50ZXI7CisjaWYgVVNFX0lUVF9CVUlMRAorICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICp0X3N0YWNrX2lkOyAgICAgICAvLyB0ZWFtIHNwZWNpZmljIHN0YWNrIHN0aXRjaGluZyBpZCAoZm9yIGl0dG5vdGlmeSkKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCit9IGttcF9iYXNlX3RlYW1fdDsKKwordW5pb24gS01QX0FMSUdOX0NBQ0hFIGttcF90ZWFtIHsKKyAgICBrbXBfYmFzZV90ZWFtX3QgICAgIHQ7CisgICAgZG91YmxlICAgICAgICAgICAgICB0X2FsaWduOyAgICAgICAvKiB1c2Ugd29yc3QgY2FzZSBhbGlnbm1lbnQgKi8KKyAgICBjaGFyICAgICAgICAgICAgICAgIHRfcGFkWyBLTVBfUEFEKGttcF9iYXNlX3RlYW1fdCwgQ0FDSEVfTElORSkgXTsKK307CisKKwordHlwZWRlZiB1bmlvbiBLTVBfQUxJR05fQ0FDSEUga21wX3RpbWVfZ2xvYmFsIHsKKyAgICBkb3VibGUgICAgICAgICAgICAgIGR0X2FsaWduOyAgICAgICAgLyogdXNlIHdvcnN0IGNhc2UgYWxpZ25tZW50ICovCisgICAgY2hhciAgICAgICAgICAgICAgICBkdF9wYWRbIEtNUF9QQUQoa21wX2Jhc2VfZGF0YV90LCBDQUNIRV9MSU5FKSBdOworICAgIGttcF9iYXNlX2RhdGFfdCAgICAgZHQ7Cit9IGttcF90aW1lX2dsb2JhbF90OworCit0eXBlZGVmIHN0cnVjdCBrbXBfYmFzZV9nbG9iYWwgeworICAgIC8qIGNhY2hlLWFsaWduZWQgKi8KKyAgICBrbXBfdGltZV9nbG9iYWxfdCAgIGdfdGltZTsKKworICAgIC8qIG5vbiBjYWNoZS1hbGlnbmVkICovCisgICAgdm9sYXRpbGUgaW50ICAgICAgICBnX2Fib3J0OworICAgIHZvbGF0aWxlIGludCAgICAgICAgZ19kb25lOworCisgICAgaW50ICAgICAgICAgICAgICAgICBnX2R5bmFtaWM7CisgICAgZW51bSBkeW5hbWljX21vZGUgICBnX2R5bmFtaWNfbW9kZTsKKworfSBrbXBfYmFzZV9nbG9iYWxfdDsKKwordHlwZWRlZiB1bmlvbiBLTVBfQUxJR05fQ0FDSEUga21wX2dsb2JhbCB7CisgICAga21wX2Jhc2VfZ2xvYmFsX3QgICBnOworICAgIGRvdWJsZSAgICAgICAgICAgICAgZ19hbGlnbjsgICAgICAgIC8qIHVzZSB3b3JzdCBjYXNlIGFsaWdubWVudCAqLworICAgIGNoYXIgICAgICAgICAgICAgICAgZ19wYWRbIEtNUF9QQUQoa21wX2Jhc2VfZ2xvYmFsX3QsIENBQ0hFX0xJTkUpIF07Cit9IGttcF9nbG9iYWxfdDsKKworCit0eXBlZGVmIHN0cnVjdCBrbXBfYmFzZV9yb290IHsKKyAgICAvLyBUT0RPOiBHRUggLSBjb21iaW5lIHJfYWN0aXZlIHdpdGggcl9pbl9wYXJhbGxlbCB0aGVuIHJfYWN0aXZlID09IChyX2luX3BhcmFsbGVsPj0gMCkKKyAgICAvLyBUT0RPOiBHRUggLSB0aGVuIHJlcGxhY2Ugcl9hY3RpdmUgd2l0aCB0X2FjdGl2ZV9sZXZlbHMgaWYgd2UgY2FuIHRvIHJlZHVjZSB0aGUgc3luY2gKKyAgICAvLyAgICAgICAgICAgICBvdmVyaGVhZCBvciBrZWVwaW5nIHJfYWN0aXZlCisKKyAgICB2b2xhdGlsZSBpbnQgICAgICAgIHJfYWN0aXZlOyAgICAgICAvKiBUUlVFIGlmIHNvbWUgcmVnaW9uIGluIGEgbmVzdCBoYXMgPiAxIHRocmVhZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdFSDogVGhpcyBpcyBtaXNuYW1lZCwgc2hvdWxkIGJlIHJfaW5fcGFyYWxsZWwKKyAgICB2b2xhdGlsZSBpbnQgICAgICAgIHJfbmVzdGVkOyAgICAgICAvLyBUT0RPOiBHRUggLSBUaGlzIGlzIHVudXNlZCwganVzdCByZW1vdmUgaXQgZW50aXJlbHkuCisgICAgaW50ICAgICAgICAgICAgICAgICByX2luX3BhcmFsbGVsOyAgLyoga2VlcHMgYSBjb3VudCBvZiBhY3RpdmUgcGFyYWxsZWwgcmVnaW9ucyBwZXIgcm9vdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdFSDogVGhpcyBpcyBtaXNuYW1lZCwgc2hvdWxkIGJlIHJfYWN0aXZlX2xldmVscworICAgIGttcF90ZWFtX3QgICAgICAgICAqcl9yb290X3RlYW07CisgICAga21wX3RlYW1fdCAgICAgICAgICpyX2hvdF90ZWFtOworICAgIGttcF9pbmZvX3QgICAgICAgICAqcl91YmVyX3RocmVhZDsKKyAgICBrbXBfbG9ja190ICAgICAgICAgIHJfYmVnaW5fbG9jazsKKyAgICB2b2xhdGlsZSBpbnQgICAgICAgIHJfYmVnaW47CisgICAgaW50ICAgICAgICAgICAgICAgICByX2Jsb2NrdGltZTsgLyogYmxvY2t0aW1lIGZvciB0aGlzIHJvb3QgYW5kIGRlc2NlbmRhbnRzICovCit9IGttcF9iYXNlX3Jvb3RfdDsKKwordHlwZWRlZiB1bmlvbiBLTVBfQUxJR05fQ0FDSEUga21wX3Jvb3QgeworICAgIGttcF9iYXNlX3Jvb3RfdCAgICAgcjsKKyAgICBkb3VibGUgICAgICAgICAgICAgIHJfYWxpZ247ICAgICAgICAvKiB1c2Ugd29yc3QgY2FzZSBhbGlnbm1lbnQgKi8KKyAgICBjaGFyICAgICAgICAgICAgICAgIHJfcGFkWyBLTVBfUEFEKGttcF9iYXNlX3Jvb3RfdCwgQ0FDSEVfTElORSkgXTsKK30ga21wX3Jvb3RfdDsKKworc3RydWN0IGZvcnRyYW5faW54X2luZm8geworICAgIGttcF9pbnQzMiAgIGRhdGE7Cit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworZXh0ZXJuIGludCAgICAgIF9fa21wX3NldHRpbmdzOworZXh0ZXJuIGludCAgICAgIF9fa21wX2R1cGxpY2F0ZV9saWJyYXJ5X29rOworI2lmIFVTRV9JVFRfQlVJTEQKK2V4dGVybiBpbnQgICAgICBfX2ttcF9mb3Jram9pbl9mcmFtZXM7CitleHRlcm4gaW50ICAgICAgX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGU7CisjZW5kaWYKK2V4dGVybiBQQUNLRURfUkVEVUNUSU9OX01FVEhPRF9UIF9fa21wX2ZvcmNlX3JlZHVjdGlvbl9tZXRob2Q7CitleHRlcm4gaW50ICAgICAgX19rbXBfZGV0ZXJtX3JlZDsKKworI2lmZGVmIEtNUF9ERUJVRworZXh0ZXJuIGludCAgICAgIGttcF9hX2RlYnVnOworZXh0ZXJuIGludCAgICAgIGttcF9iX2RlYnVnOworZXh0ZXJuIGludCAgICAgIGttcF9jX2RlYnVnOworZXh0ZXJuIGludCAgICAgIGttcF9kX2RlYnVnOworZXh0ZXJuIGludCAgICAgIGttcF9lX2RlYnVnOworZXh0ZXJuIGludCAgICAgIGttcF9mX2RlYnVnOworI2VuZGlmIC8qIEtNUF9ERUJVRyAqLworCisvKiBGb3IgZGVidWcgaW5mb3JtYXRpb24gbG9nZ2luZyB1c2luZyByb3RhdGluZyBidWZmZXIgKi8KKyNkZWZpbmUgS01QX0RFQlVHX0JVRl9MSU5FU19JTklUICAgICAgICA1MTIKKyNkZWZpbmUgS01QX0RFQlVHX0JVRl9MSU5FU19NSU4gICAgICAgICAxCisKKyNkZWZpbmUgS01QX0RFQlVHX0JVRl9DSEFSU19JTklUICAgICAgICAxMjgKKyNkZWZpbmUgS01QX0RFQlVHX0JVRl9DSEFSU19NSU4gICAgICAgICAyCisKK2V4dGVybiBpbnQgICAgIF9fa21wX2RlYnVnX2J1ZjsgICAgICAgICAgICAvKiBUUlVFIG1lYW5zIHVzZSBidWZmZXIsIEZBTFNFIG1lYW5zIHByaW50IHRvIHN0ZGVyciAqLworZXh0ZXJuIGludCAgICAgX19rbXBfZGVidWdfYnVmX2xpbmVzOyAgICAgIC8qIEhvdyBtYW55IGxpbmVzIG9mIGRlYnVnIHN0b3JlZCBpbiBidWZmZXIgKi8KK2V4dGVybiBpbnQgICAgIF9fa21wX2RlYnVnX2J1Zl9jaGFyczsgICAgICAvKiBIb3cgbWFueSBjaGFyYWN0ZXJzIGFsbG93ZWQgcGVyIGxpbmUgaW4gYnVmZmVyICovCitleHRlcm4gaW50ICAgICBfX2ttcF9kZWJ1Z19idWZfYXRvbWljOyAgICAgLyogVFJVRSBtZWFucyB1c2UgYXRvbWljIHVwZGF0ZSBvZiBidWZmZXIgZW50cnkgcG9pbnRlciAqLworCitleHRlcm4gY2hhciAgICpfX2ttcF9kZWJ1Z19idWZmZXI7ICAgICAgICAgLyogRGVidWcgYnVmZmVyIGl0c2VsZiAqLworZXh0ZXJuIGludCAgICAgX19rbXBfZGVidWdfY291bnQ7ICAgICAgICAgIC8qIENvdW50ZXIgZm9yIG51bWJlciBvZiBsaW5lcyBwcmludGVkIGluIGJ1ZmZlciBzbyBmYXIgKi8KK2V4dGVybiBpbnQgICAgIF9fa21wX2RlYnVnX2J1Zl93YXJuX2NoYXJzOyAvKiBLZWVwIHRyYWNrIG9mIGNoYXIgaW5jcmVhc2UgcmVjb21tZW5kZWQgaW4gd2FybmluZ3MgKi8KKy8qIGVuZCByb3RhdGluZyBkZWJ1ZyBidWZmZXIgKi8KKworI2lmZGVmIEtNUF9ERUJVRworZXh0ZXJuIGludCAgICAgIF9fa21wX3Bhcl9yYW5nZTsgICAgICAgICAgIC8qICsxID0+IG9ubHkgZ28gcGFyIGZvciBjb25zdHJ1Y3RzIGluIHJhbmdlICovCisKKyNkZWZpbmUgS01QX1BBUl9SQU5HRV9ST1VUSU5FX0xFTiAgICAgICAxMDI0CitleHRlcm4gY2hhciAgICAgX19rbXBfcGFyX3JhbmdlX3JvdXRpbmVbS01QX1BBUl9SQU5HRV9ST1VUSU5FX0xFTl07CisjZGVmaW5lIEtNUF9QQVJfUkFOR0VfRklMRU5BTUVfTEVOICAgICAgMTAyNAorZXh0ZXJuIGNoYXIgICAgIF9fa21wX3Bhcl9yYW5nZV9maWxlbmFtZVtLTVBfUEFSX1JBTkdFX0ZJTEVOQU1FX0xFTl07CitleHRlcm4gaW50ICAgICAgX19rbXBfcGFyX3JhbmdlX2xiOworZXh0ZXJuIGludCAgICAgIF9fa21wX3Bhcl9yYW5nZV91YjsKKyNlbmRpZgorCisvKiBGb3IgcHJpbnRpbmcgb3V0IGR5bmFtaWMgc3RvcmFnZSBtYXAgZm9yIHRocmVhZHMgYW5kIHRlYW1zICovCitleHRlcm4gaW50ICAgICAgX19rbXBfc3RvcmFnZV9tYXA7ICAgICAgICAgLyogVHJ1ZSBtZWFucyBwcmludCBzdG9yYWdlIG1hcCBmb3IgdGhyZWFkcyBhbmQgdGVhbXMgKi8KK2V4dGVybiBpbnQgICAgICBfX2ttcF9zdG9yYWdlX21hcF92ZXJib3NlOyAvKiBUcnVlIG1lYW5zIHN0b3JhZ2UgbWFwIGluY2x1ZGVzIHBsYWNlbWVudCBpbmZvICovCitleHRlcm4gaW50ICAgICAgX19rbXBfc3RvcmFnZV9tYXBfdmVyYm9zZV9zcGVjaWZpZWQ7CisKK2V4dGVybiBrbXBfY3B1aW5mb190ICAgIF9fa21wX2NwdWluZm87CisKK2V4dGVybiB2b2xhdGlsZSBpbnQgX19rbXBfaW5pdF9zZXJpYWw7CitleHRlcm4gdm9sYXRpbGUgaW50IF9fa21wX2luaXRfZ3RpZDsKK2V4dGVybiB2b2xhdGlsZSBpbnQgX19rbXBfaW5pdF9jb21tb247CitleHRlcm4gdm9sYXRpbGUgaW50IF9fa21wX2luaXRfbWlkZGxlOworZXh0ZXJuIHZvbGF0aWxlIGludCBfX2ttcF9pbml0X3BhcmFsbGVsOworZXh0ZXJuIHZvbGF0aWxlIGludCBfX2ttcF9pbml0X21vbml0b3I7CitleHRlcm4gdm9sYXRpbGUgaW50IF9fa21wX2luaXRfdXNlcl9sb2NrczsKK2V4dGVybiBpbnQgX19rbXBfaW5pdF9jb3VudGVyOworZXh0ZXJuIGludCBfX2ttcF9yb290X2NvdW50ZXI7CitleHRlcm4gaW50IF9fa21wX3ZlcnNpb247CisKKy8qIGxpc3Qgb2YgYWRkcmVzcyBvZiBhbGxvY2F0ZWQgY2FjaGVzIGZvciBjb21tb25zICovCitleHRlcm4ga21wX2NhY2hlZF9hZGRyX3QgKl9fa21wX3RocmVhZHByaXZfY2FjaGVfbGlzdDsKKworLyogQmFycmllciBhbGdvcml0aG0gdHlwZXMgYW5kIG9wdGlvbnMgKi8KK2V4dGVybiBrbXBfdWludDMyICAgIF9fa21wX2JhcnJpZXJfZ2F0aGVyX2JiX2RmbHQ7CitleHRlcm4ga21wX3VpbnQzMiAgICBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfYmJfZGZsdDsKK2V4dGVybiBrbXBfYmFyX3BhdF9lIF9fa21wX2JhcnJpZXJfZ2F0aGVyX3BhdF9kZmx0OworZXh0ZXJuIGttcF9iYXJfcGF0X2UgX19rbXBfYmFycmllcl9yZWxlYXNlX3BhdF9kZmx0OworZXh0ZXJuIGttcF91aW50MzIgICAgX19rbXBfYmFycmllcl9nYXRoZXJfYnJhbmNoX2JpdHMgIFsgYnNfbGFzdF9iYXJyaWVyIF07CitleHRlcm4ga21wX3VpbnQzMiAgICBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfYnJhbmNoX2JpdHMgWyBic19sYXN0X2JhcnJpZXIgXTsKK2V4dGVybiBrbXBfYmFyX3BhdF9lIF9fa21wX2JhcnJpZXJfZ2F0aGVyX3BhdHRlcm4gICAgICBbIGJzX2xhc3RfYmFycmllciBdOworZXh0ZXJuIGttcF9iYXJfcGF0X2UgX19rbXBfYmFycmllcl9yZWxlYXNlX3BhdHRlcm4gICAgIFsgYnNfbGFzdF9iYXJyaWVyIF07CitleHRlcm4gY2hhciBjb25zdCAgICpfX2ttcF9iYXJyaWVyX2JyYW5jaF9iaXRfZW52X25hbWUgWyBic19sYXN0X2JhcnJpZXIgXTsKK2V4dGVybiBjaGFyIGNvbnN0ICAgKl9fa21wX2JhcnJpZXJfcGF0dGVybl9lbnZfbmFtZSAgICBbIGJzX2xhc3RfYmFycmllciBdOworZXh0ZXJuIGNoYXIgY29uc3QgICAqX19rbXBfYmFycmllcl90eXBlX25hbWUgICAgICAgICAgIFsgYnNfbGFzdF9iYXJyaWVyIF07CitleHRlcm4gY2hhciBjb25zdCAgICpfX2ttcF9iYXJyaWVyX3BhdHRlcm5fbmFtZSAgICAgICAgWyBicF9sYXN0X2JhciBdOworCisvKiBHbG9iYWwgTG9ja3MgKi8KK2V4dGVybiBrbXBfYm9vdHN0cmFwX2xvY2tfdCBfX2ttcF9pbml0el9sb2NrOyAgICAgLyogY29udHJvbCBpbml0aWFsaXphdGlvbiAqLworZXh0ZXJuIGttcF9ib290c3RyYXBfbG9ja190IF9fa21wX2Zvcmtqb2luX2xvY2s7ICAvKiBjb250cm9sIGZvcmsvam9pbiBhY2Nlc3MgYW5kIGxvYWQgY2FsY3VsYXRpb24gaWYgcm1sIGlzIHVzZWQqLworZXh0ZXJuIGttcF9ib290c3RyYXBfbG9ja190IF9fa21wX2V4aXRfbG9jazsgICAgICAvKiBleGl0KCkgaXMgbm90IGFsd2F5cyB0aHJlYWQtc2FmZSAqLworZXh0ZXJuIGttcF9ib290c3RyYXBfbG9ja190IF9fa21wX21vbml0b3JfbG9jazsgICAvKiBjb250cm9sIG1vbml0b3IgdGhyZWFkIGNyZWF0aW9uICovCitleHRlcm4ga21wX2Jvb3RzdHJhcF9sb2NrX3QgX19rbXBfdHBfY2FjaGVkX2xvY2s7IC8qIHVzZWQgZm9yIHRoZSBoYWNrIHRvIGFsbG93IHRocmVhZHByaXZhdGUgY2FjaGUgYW5kIF9fa21wX3RocmVhZHMgZXhwYW5zaW9uIHRvIGNvLWV4aXN0ICovCisKK2V4dGVybiBrbXBfbG9ja190IF9fa21wX2dsb2JhbF9sb2NrOyAgICAvKiBjb250cm9sIE9TL2dsb2JhbCBhY2Nlc3MgICovCitleHRlcm4ga21wX3F1ZXVpbmdfbG9ja190IF9fa21wX2Rpc3BhdGNoX2xvY2s7ICAvKiBjb250cm9sIGRpc3BhdGNoIGFjY2VzcyAgKi8KK2V4dGVybiBrbXBfbG9ja190IF9fa21wX2RlYnVnX2xvY2s7ICAgICAvKiBjb250cm9sIEkvTyBhY2Nlc3MgZm9yIEtNUF9ERUJVRyAqLworCisvKiB1c2VkIGZvciB5aWVsZGluZyBzcGluLXdhaXRzICovCitleHRlcm4gdW5zaWduZWQgaW50IF9fa21wX2luaXRfd2FpdDsgICAgLyogaW5pdGlhbCBudW1iZXIgb2Ygc3Bpbi10ZXN0cyAgICovCitleHRlcm4gdW5zaWduZWQgaW50IF9fa21wX25leHRfd2FpdDsgICAgLyogc3VzZXF1ZW50IG51bWJlciBvZiBzcGluLXRlc3RzICovCisKK2V4dGVybiBlbnVtIGxpYnJhcnlfdHlwZSBfX2ttcF9saWJyYXJ5OworCitleHRlcm4gZW51bSBzY2hlZF90eXBlICBfX2ttcF9zY2hlZDsgICAgLyogZGVmYXVsdCBydW50aW1lIHNjaGVkdWxpbmcgKi8KK2V4dGVybiBlbnVtIHNjaGVkX3R5cGUgIF9fa21wX3N0YXRpYzsgICAvKiBkZWZhdWx0IHN0YXRpYyBzY2hlZHVsaW5nIG1ldGhvZCAqLworZXh0ZXJuIGVudW0gc2NoZWRfdHlwZSAgX19rbXBfZ3VpZGVkOyAgIC8qIGRlZmF1bHQgZ3VpZGVkIHNjaGVkdWxpbmcgbWV0aG9kICovCitleHRlcm4gZW51bSBzY2hlZF90eXBlICBfX2ttcF9hdXRvOyAgICAgLyogZGVmYXVsdCBhdXRvIHNjaGVkdWxpbmcgbWV0aG9kICovCitleHRlcm4gaW50ICAgICAgICAgICAgICBfX2ttcF9jaHVuazsgICAgLyogZGVmYXVsdCBydW50aW1lIGNodW5rIHNpemUgKi8KKworZXh0ZXJuIHNpemVfdCAgICAgX19rbXBfc3Rrc2l6ZTsgICAgICAgIC8qIHN0YWNrIHNpemUgcGVyIHRocmVhZCAgICAgICAgICovCitleHRlcm4gc2l6ZV90ICAgICBfX2ttcF9tb25pdG9yX3N0a3NpemU7Lyogc3RhY2sgc2l6ZSBmb3IgbW9uaXRvciB0aHJlYWQgKi8KK2V4dGVybiBzaXplX3QgICAgIF9fa21wX3N0a29mZnNldDsgICAgICAvKiBzdGFjayBvZmZzZXQgcGVyIHRocmVhZCAgICAgICAqLworZXh0ZXJuIGludCAgICAgICAgX19rbXBfc3RrcGFkZGluZzsgICAgIC8qIFNob3VsZCB3ZSBwYWQgcm9vdCB0aHJlYWQocykgc3RhY2sgKi8KKworZXh0ZXJuIHNpemVfdCAgICAgX19rbXBfbWFsbG9jX3Bvb2xfaW5jcjsgLyogaW5jcmVtZW50YWwgc2l6ZSBvZiBwb29sIGZvciBrbXBfbWFsbG9jKCkgKi8KK2V4dGVybiBpbnQgICAgICAgIF9fa21wX2Vudl9jaHVuazsgICAgICAvKiB3YXMgS01QX0NIVU5LIHNwZWNpZmllZD8gICAgICovCitleHRlcm4gaW50ICAgICAgICBfX2ttcF9lbnZfc3Rrc2l6ZTsgICAgLyogd2FzIEtNUF9TVEFDS1NJWkUgc3BlY2lmaWVkPyAqLworZXh0ZXJuIGludCAgICAgICAgX19rbXBfZW52X29tcF9zdGtzaXplOy8qIHdhcyBPTVBfU1RBQ0tTSVpFIHNwZWNpZmllZD8gKi8KK2V4dGVybiBpbnQgICAgICAgIF9fa21wX2Vudl9hbGxfdGhyZWFkczsgICAgLyogd2FzIEtNUF9BTExfVEhSRUFEUyBvciBLTVBfTUFYX1RIUkVBRFMgc3BlY2lmaWVkPyAqLworZXh0ZXJuIGludCAgICAgICAgX19rbXBfZW52X29tcF9hbGxfdGhyZWFkczsvKiB3YXMgT01QX1RIUkVBRF9MSU1JVCBzcGVjaWZpZWQ/ICovCitleHRlcm4gaW50ICAgICAgICBfX2ttcF9lbnZfYmxvY2t0aW1lOyAgLyogd2FzIEtNUF9CTE9DS1RJTUUgc3BlY2lmaWVkPyAqLworZXh0ZXJuIGludCAgICAgICAgX19rbXBfZW52X2NoZWNrczsgICAgIC8qIHdhcyBLTVBfQ0hFQ0tTIHNwZWNpZmllZD8gICAgKi8KK2V4dGVybiBpbnQgICAgICAgIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjazsgICAgIC8qIHdhcyBLTVBfQ09OU0lTVEVOQ1lfQ0hFQ0sgc3BlY2lmaWVkPyAgICAqLworZXh0ZXJuIGludCAgICAgICAgX19rbXBfZ2VuZXJhdGVfd2FybmluZ3M7IC8qIHNob3VsZCB3ZSBpc3N1ZSB3YXJuaW5ncz8gKi8KK2V4dGVybiBpbnQgICAgICAgIF9fa21wX3Jlc2VydmVfd2FybjsgICAvKiBoYXZlIHdlIGlzc3VlZCByZXNlcnZlX3RocmVhZHMgd2FybmluZz8gKi8KKworI2lmZGVmIERFQlVHX1NVU1BFTkQKK2V4dGVybiBpbnQgICAgICAgIF9fa21wX3N1c3BlbmRfY291bnQ7ICAvKiBjb3VudCBpbnNpZGUgX19rbXBfc3VzcGVuZF90ZW1wbGF0ZSgpICovCisjZW5kaWYKKworZXh0ZXJuIGttcF91aW50MzIgX19rbXBfeWllbGRfaW5pdDsKK2V4dGVybiBrbXBfdWludDMyIF9fa21wX3lpZWxkX25leHQ7CitleHRlcm4ga21wX3VpbnQzMiBfX2ttcF95aWVsZGluZ19vbjsKK2V4dGVybiBrbXBfdWludDMyIF9fa21wX3lpZWxkX2N5Y2xlOworZXh0ZXJuIGttcF9pbnQzMiAgX19rbXBfeWllbGRfb25fY291bnQ7CitleHRlcm4ga21wX2ludDMyICBfX2ttcF95aWVsZF9vZmZfY291bnQ7CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworZXh0ZXJuIGludCAgICAgICAgX19rbXBfYWxsVGhyZWFkc1NwZWNpZmllZDsKKworZXh0ZXJuIHNpemVfdCAgICAgX19rbXBfYWxpZ25fYWxsb2M7CisvKiBmb2xsb3dpbmcgZGF0YSBwcm90ZWN0ZWQgYnkgaW5pdGlhbGl6YXRpb24gcm91dGluZXMgKi8KK2V4dGVybiBpbnQgICAgICAgIF9fa21wX3hwcm9jOyAgICAgICAgICAvKiBudW1iZXIgb2YgcHJvY2Vzc29ycyBpbiB0aGUgc3lzdGVtICovCitleHRlcm4gaW50ICAgICAgICBfX2ttcF9hdmFpbF9wcm9jOyAgICAgIC8qIG51bWJlciBvZiBwcm9jZXNzb3JzIGF2YWlsYWJsZSB0byB0aGUgcHJvY2VzcyAqLworZXh0ZXJuIHNpemVfdCAgICAgX19rbXBfc3lzX21pbl9zdGtzaXplOyAvKiBzeXN0ZW0tZGVmaW5lZCBtaW5pbXVtIHN0YWNrIHNpemUgKi8KK2V4dGVybiBpbnQgICAgICAgIF9fa21wX3N5c19tYXhfbnRoOyAgICAvKiBzeXN0ZW0taW1wb3NlZCBtYXhpbXVtIG51bWJlciBvZiB0aHJlYWRzICovCitleHRlcm4gaW50ICAgICAgICBfX2ttcF9tYXhfbnRoOyAgICAgICAgLyogbWF4aW11bSB0b3RhbCBudW1iZXIgb2YgY29uY3VycmVudGx5LWV4aXN0aW5nIHRocmVhZHMgKi8KK2V4dGVybiBpbnQgICAgICAgIF9fa21wX3RocmVhZHNfY2FwYWNpdHk7IC8qIGNhcGFjaXR5IG9mIHRoZSBhcnJheXMgX19rbXBfdGhyZWFkcyBhbmQgX19rbXBfcm9vdCAqLworZXh0ZXJuIGludCAgICAgICAgX19rbXBfZGZsdF90ZWFtX250aDsgIC8qIGRlZmF1bHQgbnVtYmVyIG9mIHRocmVhZHMgaW4gYSBwYXJhbGxlbCByZWdpb24gYSBsYSBPTVBfTlVNX1RIUkVBRFMgKi8KK2V4dGVybiBpbnQgICAgICAgIF9fa21wX2RmbHRfdGVhbV9udGhfdWI7IC8qIHVwcGVyIGJvdW5kIG9uICIiIGRldGVybWluZWQgYXQgc2VyaWFsIGluaXRpYWxpemF0aW9uICovCitleHRlcm4gaW50ICAgICAgICBfX2ttcF90cF9jYXBhY2l0eTsgICAgLyogY2FwYWNpdHkgb2YgX19rbXBfdGhyZWFkcyBpZiB0aHJlYWRwcml2YXRlIGlzIHVzZWQgKGZpeGVkKSAqLworZXh0ZXJuIGludCAgICAgICAgX19rbXBfdHBfY2FjaGVkOyAgICAgIC8qIHdoZXRoZXIgdGhyZWFkcHJpdmF0ZSBjYWNoZSBoYXMgYmVlbiBjcmVhdGVkIChfX2ttcGNfdGhyZWFkcHJpdmF0ZV9jYWNoZWQoKSkgKi8KK2V4dGVybiBpbnQgICAgICAgIF9fa21wX2RmbHRfbmVzdGVkOyAgICAvKiBuZXN0ZWQgcGFyYWxsZWxpc20gZW5hYmxlZCBieSBkZWZhdWx0IGEgbGEgT01QX05FU1RFRCAqLworZXh0ZXJuIGludCAgICAgICAgX19rbXBfZGZsdF9ibG9ja3RpbWU7IC8qIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCBiZWZvcmUgYmxvY2tpbmcgKGVudiBzZXR0aW5nKSAqLworZXh0ZXJuIGludCAgICAgICAgX19rbXBfbW9uaXRvcl93YWtldXBzOy8qIG51bWJlciBvZiB0aW1lcyBtb25pdG9yIHdha2VzIHVwIHBlciBzZWNvbmQgKi8KK2V4dGVybiBpbnQgICAgICAgIF9fa21wX2J0X2ludGVydmFsczsgICAvKiBudW1iZXIgb2YgbW9uaXRvciB0aW1lc3RhbXAgaW50ZXJ2YWxzIGJlZm9yZSBibG9ja2luZyAqLworI2lmZGVmIEtNUF9BREpVU1RfQkxPQ0tUSU1FCitleHRlcm4gaW50ICAgICAgICBfX2ttcF96ZXJvX2J0OyAgICAgICAgLyogd2hldGhlciBibG9ja3RpbWUgaGFzIGJlZW4gZm9yY2VkIHRvIHplcm8gKi8KKyNlbmRpZiAvKiBLTVBfQURKVVNUX0JMT0NLVElNRSAqLworZXh0ZXJuIGludCAgICAgICAgX19rbXBfaHRfY2FwYWJsZTsgICAgIC8qIHdoZXRoZXIgQ1BVcyBzdXBwb3J0IEludGVsKFIpIEh5cGVyLVRocmVhZGluZyBUZWNobm9sb2d5ICovCitleHRlcm4gaW50ICAgICAgICBfX2ttcF9odF9lbmFibGVkOyAgICAgLyogd2hldGhlciBJbnRlbChSKSBIeXBlci1UaHJlYWRpbmcgVGVjaG5vbG9neSBpcyBlbmFibGVkIGluIE9TICovCitleHRlcm4gaW50ICAgICAgICBfX2ttcF9uY29yZXM7ICAgICAgICAgLyogTnVtYmVyIG9mIHBoeXNpY2FsIHByb2NzIGluIEhUIG1hY2hpbmUgKi8KK2V4dGVybiBpbnQgICAgICAgIF9fa21wX2h0X2xvZ19wZXJfcGh5OyAvKiBNYXhpbXVtIHBvc3NpYmxlIG51bWJlciBvZiBsb2dpY2FsIHByb2Nlc3NvcnMgcGVyIHBhY2thZ2UgKi8KK2V4dGVybiBpbnQgICAgICAgIF9fa21wX25UaHJlYWRzUGVyQ29yZTsvKiBOdW1iZXIgb2YgaHlwZXJ0aHJlYWRzIHBlciBjb3JlIGluIEhUIG1hY2hpbmUuICovCitleHRlcm4gaW50ICAgICAgICBfX2ttcF9hYm9ydF9kZWxheTsgICAgLyogTnVtYmVyIG9mIG1pbGxpc2VjcyB0byBkZWxheSBvbiBhYm9ydCBmb3IgVlR1bmUgKi8KKworZXh0ZXJuIGludCAgICAgICAgX19rbXBfbmVlZF9yZWdpc3Rlcl9hdGZvcmtfc3BlY2lmaWVkOworZXh0ZXJuIGludCAgICAgICAgX19rbXBfbmVlZF9yZWdpc3Rlcl9hdGZvcms7LyogQXQgaW5pdGlhbGl6YXRpb24sIGNhbGwgcHRocmVhZF9hdGZvcmsgdG8gaW5zdGFsbCBmb3JrIGhhbmRsZXIgKi8KK2V4dGVybiBpbnQgICAgICAgIF9fa21wX2d0aWRfbW9kZTsgICAgICAvKiBNZXRob2Qgb2YgZ2V0dGluZyBndGlkLCB2YWx1ZXM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAtIG5vdCBzZXQsIHdpbGwgYmUgc2V0IGF0IHJ1bnRpbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIC0gdXNpbmcgc3RhY2sgc2VhcmNoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAtIGR5bmFtaWMgVExTIChwdGhyZWFkX2dldHNwZWNpZmljKExpbnV4KiBPUy9PUyBYKikgb3IgVGxzR2V0VmFsdWUoV2luZG93cyogT1MpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgLSBzdGF0aWMgVExTIChfX2RlY2xzcGVjKHRocmVhZCkgX19rbXBfZ3RpZCksIExpbnV4KiBPUyAuc28gb25seS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK2V4dGVybiBpbnQgICAgICAgIF9fa21wX2FkanVzdF9ndGlkX21vZGU7IC8qIElmIHRydWUsIGFkanVzdCBtZXRob2QgYmFzZWQgb24gI3RocmVhZHMgKi8KKyNpZmRlZiBLTVBfVERBVEFfR1RJRAorI2lmIEtNUF9PU19XSU5ET1dTCitleHRlcm4gX19kZWNsc3BlYyh0aHJlYWQpIGludCBfX2ttcF9ndGlkOyAvKiBUaGlzIHRocmVhZCdzIGd0aWQsIGlmIF9fa21wX2d0aWRfbW9kZSA9PSAzICovCisjZWxzZQorZXh0ZXJuIF9fdGhyZWFkIGludCBfX2ttcF9ndGlkOworI2VuZGlmIC8qIEtNUF9PU19XSU5ET1dTIC0gd29ya2Fyb3VuZCBiZWNhdXNlIEludGVsKFIpIE1hbnkgSW50ZWdyYXRlZCBDb3JlIGNvbXBpbGVyIDIwMTEwMzE2IGRvZXNuJ3QgYWNjZXB0IF9fZGVjbHNwZWMgKi8KKyNlbmRpZgorZXh0ZXJuIGludCAgICAgICAgX19rbXBfdGxzX2d0aWRfbWluOyAgIC8qICN0aHJlYWRzIGJlbG93IHdoaWNoIHVzZSBzcCBzZWFyY2ggZm9yIGd0aWQgKi8KK2V4dGVybiBpbnQgICAgICAgIF9fa21wX2ZvcmVpZ25fdHA7ICAgICAvKiBJZiB0cnVlLCBzZXBhcmF0ZSBUUCB2YXIgZm9yIGVhY2ggZm9yZWlnbiB0aHJlYWQgKi8KKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CitleHRlcm4gaW50ICAgICAgICBfX2ttcF9pbmhlcml0X2ZwX2NvbnRyb2w7IC8qIGNvcHkgZnAgY3JlZyhzKSBwYXJlbnQtPndvcmtlcnMgYXQgZm9yayAqLworZXh0ZXJuIGttcF9pbnQxNiAgX19rbXBfaW5pdF94ODdfZnB1X2NvbnRyb2xfd29yZDsgLyogaW5pdCB0aHJlYWQncyBGUCBjb250cm9sIHJlZyAqLworZXh0ZXJuIGttcF91aW50MzIgX19rbXBfaW5pdF9teGNzcjsgICAgICAvKiBpbml0IHRocmVhZCdzIG14c2NyICovCisjZW5kaWYgLyogS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCAqLworCitleHRlcm4gaW50ICAgICAgICBfX2ttcF9kZmx0X21heF9hY3RpdmVfbGV2ZWxzOyAvKiBtYXhfYWN0aXZlX2xldmVscyBmb3IgbmVzdGVkIHBhcmFsbGVsaXNtIGVuYWJsZWQgYnkgZGVmYXVsdCBhIGxhIE9NUF9NQVhfQUNUSVZFX0xFVkVMUyAqLworI2lmIEtNUF9ORVNURURfSE9UX1RFQU1TCitleHRlcm4gaW50ICAgICAgICBfX2ttcF9ob3RfdGVhbXNfbW9kZTsKK2V4dGVybiBpbnQgICAgICAgIF9fa21wX2hvdF90ZWFtc19tYXhfbGV2ZWw7CisjZW5kaWYKKworIyBpZiBLTVBfT1NfTElOVVgKK2V4dGVybiBlbnVtIGNsb2NrX2Z1bmN0aW9uX3R5cGUgX19rbXBfY2xvY2tfZnVuY3Rpb247CitleHRlcm4gaW50IF9fa21wX2Nsb2NrX2Z1bmN0aW9uX3BhcmFtOworIyBlbmRpZiAvKiBLTVBfT1NfTElOVVggKi8KKworIyBpZmRlZiBVU0VfTE9BRF9CQUxBTkNFCitleHRlcm4gZG91YmxlICAgICAgX19rbXBfbG9hZF9iYWxhbmNlX2ludGVydmFsOyAgIC8qIEludGVydmFsIGZvciB0aGUgbG9hZCBiYWxhbmNlIGFsZ29yaXRobSAqLworIyBlbmRpZiAvKiBVU0VfTE9BRF9CQUxBTkNFICovCisKKy8vIE9wZW5NUCAzLjEgLSBOZXN0ZWQgbnVtIHRocmVhZHMgYXJyYXkKK3R5cGVkZWYgc3RydWN0IGttcF9uZXN0ZWRfbnRocmVhZHNfdCB7CisgICAgaW50ICogbnRoOworICAgIGludCAgIHNpemU7CisgICAgaW50ICAgdXNlZDsKK30ga21wX25lc3RlZF9udGhyZWFkc190OworCitleHRlcm4ga21wX25lc3RlZF9udGhyZWFkc190IF9fa21wX25lc3RlZF9udGg7CisKKyNpZiBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisKKy8vIFBhcmFtZXRlcnMgZm9yIHRoZSBzcGVjdWxhdGl2ZSBsb2NrIGJhY2tvZmYgc3lzdGVtLgorc3RydWN0IGttcF9hZGFwdGl2ZV9iYWNrb2ZmX3BhcmFtc190IHsKKyAgICAvLyBOdW1iZXIgb2Ygc29mdCByZXRyaWVzIGJlZm9yZSBpdCBjb3VudHMgYXMgYSBoYXJkIHJldHJ5LgorICAgIGttcF91aW50MzIgbWF4X3NvZnRfcmV0cmllczsKKyAgICAvLyBCYWRuZXNzIGlzIGEgYml0IG1hc2sgOiAwLDEsMyw3LDE1LC4uLiBvbiBlYWNoIGhhcmQgZmFpbHVyZSB3ZSBtb3ZlIG9uZSB0byB0aGUgcmlnaHQKKyAgICBrbXBfdWludDMyIG1heF9iYWRuZXNzOworfTsKKworZXh0ZXJuIGttcF9hZGFwdGl2ZV9iYWNrb2ZmX3BhcmFtc190IF9fa21wX2FkYXB0aXZlX2JhY2tvZmZfcGFyYW1zOworCisjaWYgS01QX0RFQlVHX0FEQVBUSVZFX0xPQ0tTCitleHRlcm4gY2hhciAqIF9fa21wX3NwZWN1bGF0aXZlX3N0YXRzZmlsZTsKKyNlbmRpZgorCisjZW5kaWYgLy8gS01QX1VTRV9BREFQVElWRV9MT0NLUworCisjaWYgT01QXzQwX0VOQUJMRUQKK2V4dGVybiBpbnQgX19rbXBfZGlzcGxheV9lbnY7ICAgICAgICAgICAvKiBUUlVFIG9yIEZBTFNFICovCitleHRlcm4gaW50IF9fa21wX2Rpc3BsYXlfZW52X3ZlcmJvc2U7ICAgLyogVFJVRSBpZiBPTVBfRElTUExBWV9FTlY9VkVSQk9TRSAqLworZXh0ZXJuIGludCBfX2ttcF9vbXBfY2FuY2VsbGF0aW9uOyAgICAgIC8qIFRSVUUgb3IgRkFMU0UgKi8KKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogdGhlIGZvbGxvd2luZyBhcmUgcHJvdGVjdGVkIGJ5IHRoZSBmb3JrL2pvaW4gbG9jayAqLworLyogd3JpdGU6IGxvY2sgIHJlYWQ6IGFueXRpbWUgKi8KK2V4dGVybiAgICAgICAgICBrbXBfaW5mb190ICoqX19rbXBfdGhyZWFkczsgICAgICAvKiBEZXNjcmlwdG9ycyBmb3IgdGhlIHRocmVhZHMgKi8KKy8qIHJlYWQvd3JpdGU6IGxvY2sgKi8KK2V4dGVybiB2b2xhdGlsZSBrbXBfdGVhbV90ICAqICAgICBfX2ttcF90ZWFtX3Bvb2w7CitleHRlcm4gdm9sYXRpbGUga21wX2luZm9fdCAgKiAgICAgX19rbXBfdGhyZWFkX3Bvb2w7CisKKy8qIHRvdGFsIG51bWJlciBvZiB0aHJlYWRzIHJlYWNoYWJsZSBmcm9tIHNvbWUgcm9vdCB0aHJlYWQgaW5jbHVkaW5nIGFsbCByb290IHRocmVhZHMqLworZXh0ZXJuIHZvbGF0aWxlIGludCBfX2ttcF9udGg7CisvKiB0b3RhbCBudW1iZXIgb2YgdGhyZWFkcyByZWFjaGFibGUgZnJvbSBzb21lIHJvb3QgdGhyZWFkIGluY2x1ZGluZyBhbGwgcm9vdCB0aHJlYWRzLAorICAgYW5kIHRob3NlIGluIHRoZSB0aHJlYWQgcG9vbCAqLworZXh0ZXJuIHZvbGF0aWxlIGludCBfX2ttcF9hbGxfbnRoOworZXh0ZXJuIGludCBfX2ttcF90aHJlYWRfcG9vbF9udGg7CitleHRlcm4gdm9sYXRpbGUgaW50IF9fa21wX3RocmVhZF9wb29sX2FjdGl2ZV9udGg7CisKK2V4dGVybiBrbXBfcm9vdF90ICoqX19rbXBfcm9vdDsgICAgICAgICAvKiByb290IG9mIHRocmVhZCBoaWVyYXJjaHkgKi8KKy8qIGVuZCBkYXRhIHByb3RlY3RlZCBieSBmb3JrL2pvaW4gbG9jayAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2V4dGVybiBrbXBfZ2xvYmFsX3QgIF9fa21wX2dsb2JhbDsgICAgICAgICAvKiBnbG9iYWwgc3RhdHVzICovCisKK2V4dGVybiBrbXBfaW5mb190IF9fa21wX21vbml0b3I7CitleHRlcm4gdm9sYXRpbGUga21wX3VpbnQzMiBfX2ttcF90ZWFtX2NvdW50ZXI7ICAgICAgLy8gVXNlZCBieSBEZWJ1Z2dpbmcgU3VwcG9ydCBMaWJyYXJ5LgorZXh0ZXJuIHZvbGF0aWxlIGttcF91aW50MzIgX19rbXBfdGFza19jb3VudGVyOyAgICAgIC8vIFVzZWQgYnkgRGVidWdnaW5nIFN1cHBvcnQgTGlicmFyeS4KKworI2RlZmluZSBfS01QX0dFTl9JRCggY291bnRlciApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfiAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICkKKworCisKKyNkZWZpbmUgS01QX0dFTl9UQVNLX0lEKCkgICAgX0tNUF9HRU5fSUQoIF9fa21wX3Rhc2tfY291bnRlciApCisjZGVmaW5lIEtNUF9HRU5fVEVBTV9JRCgpICAgIF9LTVBfR0VOX0lEKCBfX2ttcF90ZWFtX2NvdW50ZXIgKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitleHRlcm4gdm9pZCBfX2ttcF9wcmludF9zdG9yYWdlX21hcF9ndGlkKCBpbnQgZ3RpZCwgdm9pZCAqcDEsIHZvaWQqIHAyLCBzaXplX3Qgc2l6ZSwgY2hhciBjb25zdCAqZm9ybWF0LCAuLi4gKTsKKworZXh0ZXJuIHZvaWQgX19rbXBfc2VyaWFsX2luaXRpYWxpemUoIHZvaWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX21pZGRsZV9pbml0aWFsaXplKCB2b2lkICk7CitleHRlcm4gdm9pZCBfX2ttcF9wYXJhbGxlbF9pbml0aWFsaXplKCB2b2lkICk7CisKK2V4dGVybiB2b2lkIF9fa21wX2ludGVybmFsX2JlZ2luKCB2b2lkICk7CitleHRlcm4gdm9pZCBfX2ttcF9pbnRlcm5hbF9lbmRfbGlicmFyeSggaW50IGd0aWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX2ludGVybmFsX2VuZF90aHJlYWQoIGludCBndGlkICk7CitleHRlcm4gdm9pZCBfX2ttcF9pbnRlcm5hbF9lbmRfYXRleGl0KCB2b2lkICk7CitleHRlcm4gdm9pZCBfX2ttcF9pbnRlcm5hbF9lbmRfZmluaSggdm9pZCApOworZXh0ZXJuIHZvaWQgX19rbXBfaW50ZXJuYWxfZW5kX2R0b3IoIHZvaWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX2ludGVybmFsX2VuZF9kZXN0KCB2b2lkKiApOworCitleHRlcm4gaW50ICBfX2ttcF9yZWdpc3Rlcl9yb290KCBpbnQgaW5pdGlhbF90aHJlYWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX3VucmVnaXN0ZXJfcm9vdCggaW50IGd0aWQgKTsKKworZXh0ZXJuIGludCAgX19rbXBfaWdub3JlX21wcGJlZyggdm9pZCApOworZXh0ZXJuIGludCAgX19rbXBfaWdub3JlX21wcGVuZCggdm9pZCApOworCitleHRlcm4gaW50ICBfX2ttcF9lbnRlcl9zaW5nbGUoIGludCBndGlkLCBpZGVudF90ICppZF9yZWYsIGludCBwdXNoX3dzICk7CitleHRlcm4gdm9pZCBfX2ttcF9leGl0X3NpbmdsZSggaW50IGd0aWQgKTsKKworZXh0ZXJuIHZvaWQgX19rbXBfcGFyYWxsZWxfZGVvKCBpbnQgKmd0aWRfcmVmLCBpbnQgKmNpZF9yZWYsIGlkZW50X3QgKmxvY19yZWYgKTsKK2V4dGVybiB2b2lkIF9fa21wX3BhcmFsbGVsX2R4byggaW50ICpndGlkX3JlZiwgaW50ICpjaWRfcmVmLCBpZGVudF90ICpsb2NfcmVmICk7CisKKworI2lmZGVmIFVTRV9MT0FEX0JBTEFOQ0UKK2V4dGVybiBpbnQgIF9fa21wX2dldF9sb2FkX2JhbGFuY2UoIGludCApOworI2VuZGlmCisKKyNpZmRlZiBCVUlMRF9UVgorZXh0ZXJuIHZvaWQgX19rbXBfdHZfdGhyZWFkcHJpdmF0ZV9zdG9yZSgga21wX2luZm9fdCAqdGgsIHZvaWQgKmdsb2JhbF9hZGRyLCB2b2lkICp0aHJlYWRfYWRkciApOworI2VuZGlmCisKK2V4dGVybiBpbnQgIF9fa21wX2dldF9nbG9iYWxfdGhyZWFkX2lkKCB2b2lkICk7CitleHRlcm4gaW50ICBfX2ttcF9nZXRfZ2xvYmFsX3RocmVhZF9pZF9yZWcoIHZvaWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX2V4aXRfdGhyZWFkKCBpbnQgZXhpdF9zdGF0dXMgKTsKK2V4dGVybiB2b2lkIF9fa21wX2Fib3J0KCBjaGFyIGNvbnN0ICogZm9ybWF0LCAuLi4gKTsKK2V4dGVybiB2b2lkIF9fa21wX2Fib3J0X3RocmVhZCggdm9pZCApOworZXh0ZXJuIHZvaWQgX19rbXBfYWJvcnRfcHJvY2Vzcyggdm9pZCApOworZXh0ZXJuIHZvaWQgX19rbXBfd2FybiggY2hhciBjb25zdCAqIGZvcm1hdCwgLi4uICk7CisKK2V4dGVybiB2b2lkIF9fa21wX3NldF9udW1fdGhyZWFkcyggaW50IG5ld19udGgsIGludCBndGlkICk7CisKKy8vIFJldHVybnMgY3VycmVudCB0aHJlYWQgKHBvaW50ZXIgdG8ga21wX2luZm9fdCkuIEN1cnJlbnQgdGhyZWFkICptdXN0KiBiZSByZWdpc3RlcmVkLgorc3RhdGljIGlubGluZSBrbXBfaW5mb190ICogX19rbXBfZW50cnlfdGhyZWFkKCkKK3sKKyAgICAgIGludCBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOworCisgICAgICByZXR1cm4gX19rbXBfdGhyZWFkc1tndGlkXTsKK30KKworZXh0ZXJuIHZvaWQgX19rbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzKCBpbnQgZ3RpZCwgaW50IG5ld19tYXhfYWN0aXZlX2xldmVscyApOworZXh0ZXJuIGludCAgX19rbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzKCBpbnQgZ3RpZCApOworZXh0ZXJuIGludCAgX19rbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0oIGludCBndGlkLCBpbnQgbGV2ZWwgKTsKK2V4dGVybiBpbnQgIF9fa21wX2dldF90ZWFtX3NpemUoIGludCBndGlkLCBpbnQgbGV2ZWwgKTsKK2V4dGVybiB2b2lkIF9fa21wX3NldF9zY2hlZHVsZSggaW50IGd0aWQsIGttcF9zY2hlZF90IG5ld19zY2hlZCwgaW50IGNodW5rICk7CitleHRlcm4gdm9pZCBfX2ttcF9nZXRfc2NoZWR1bGUoIGludCBndGlkLCBrbXBfc2NoZWRfdCAqIHNjaGVkLCBpbnQgKiBjaHVuayApOworCitleHRlcm4gdW5zaWduZWQgc2hvcnQgX19rbXBfZ2V0X3JhbmRvbSgga21wX2luZm9fdCAqIHRocmVhZCApOworZXh0ZXJuIHZvaWQgX19rbXBfaW5pdF9yYW5kb20oIGttcF9pbmZvX3QgKiB0aHJlYWQgKTsKKworZXh0ZXJuIGttcF9yX3NjaGVkX3QgX19rbXBfZ2V0X3NjaGVkdWxlX2dsb2JhbCggdm9pZCApOworZXh0ZXJuIHZvaWQgX19rbXBfYWRqdXN0X251bV90aHJlYWRzKCBpbnQgbmV3X25wcm9jICk7CisKK2V4dGVybiB2b2lkICogX19fa21wX2FsbG9jYXRlKCBzaXplX3Qgc2l6ZSBLTVBfU1JDX0xPQ19ERUNMICk7CitleHRlcm4gdm9pZCAqIF9fX2ttcF9wYWdlX2FsbG9jYXRlKCBzaXplX3Qgc2l6ZSBLTVBfU1JDX0xPQ19ERUNMICk7CitleHRlcm4gdm9pZCAgIF9fX2ttcF9mcmVlKCB2b2lkICogcHRyIEtNUF9TUkNfTE9DX0RFQ0wgKTsKKyNkZWZpbmUgX19rbXBfYWxsb2NhdGUoIHNpemUgKSAgICAgIF9fX2ttcF9hbGxvY2F0ZSggKHNpemUpIEtNUF9TUkNfTE9DX0NVUlIgKQorI2RlZmluZSBfX2ttcF9wYWdlX2FsbG9jYXRlKCBzaXplICkgX19fa21wX3BhZ2VfYWxsb2NhdGUoIChzaXplKSBLTVBfU1JDX0xPQ19DVVJSICkKKyNkZWZpbmUgX19rbXBfZnJlZSggcHRyICkgICAgICAgICAgIF9fX2ttcF9mcmVlKCAocHRyKSBLTVBfU1JDX0xPQ19DVVJSICkKKworI2lmIFVTRV9GQVNUX01FTU9SWQorZXh0ZXJuIHZvaWQgKiBfX19rbXBfZmFzdF9hbGxvY2F0ZSgga21wX2luZm9fdCAqdGhpc190aHIsIHNpemVfdCBzaXplIEtNUF9TUkNfTE9DX0RFQ0wgKTsKK2V4dGVybiB2b2lkICAgX19fa21wX2Zhc3RfZnJlZSgga21wX2luZm9fdCAqdGhpc190aHIsIHZvaWQgKnB0ciBLTVBfU1JDX0xPQ19ERUNMICk7CitleHRlcm4gdm9pZCAgIF9fa21wX2ZyZWVfZmFzdF9tZW1vcnkoIGttcF9pbmZvX3QgKnRoaXNfdGhyICk7CitleHRlcm4gdm9pZCAgIF9fa21wX2luaXRpYWxpemVfZmFzdF9tZW1vcnkoIGttcF9pbmZvX3QgKnRoaXNfdGhyICk7CisjZGVmaW5lIF9fa21wX2Zhc3RfYWxsb2NhdGUoIHRoaXNfdGhyLCBzaXplICkgX19fa21wX2Zhc3RfYWxsb2NhdGUoICh0aGlzX3RociksIChzaXplKSBLTVBfU1JDX0xPQ19DVVJSICkKKyNkZWZpbmUgX19rbXBfZmFzdF9mcmVlKCB0aGlzX3RociwgcHRyICkgICAgICBfX19rbXBfZmFzdF9mcmVlKCAodGhpc190aHIpLCAocHRyKSBLTVBfU1JDX0xPQ19DVVJSICkKKyNlbmRpZgorCitleHRlcm4gdm9pZCAqIF9fX2ttcF90aHJlYWRfbWFsbG9jKCBrbXBfaW5mb190ICp0aCwgc2l6ZV90IHNpemUgS01QX1NSQ19MT0NfREVDTCApOworZXh0ZXJuIHZvaWQgKiBfX19rbXBfdGhyZWFkX2NhbGxvYygga21wX2luZm9fdCAqdGgsIHNpemVfdCBuZWxlbSwgc2l6ZV90IGVsc2l6ZSBLTVBfU1JDX0xPQ19ERUNMICk7CitleHRlcm4gdm9pZCAqIF9fX2ttcF90aHJlYWRfcmVhbGxvYygga21wX2luZm9fdCAqdGgsIHZvaWQgKnB0ciwgc2l6ZV90IHNpemUgS01QX1NSQ19MT0NfREVDTCApOworZXh0ZXJuIHZvaWQgICBfX19rbXBfdGhyZWFkX2ZyZWUoIGttcF9pbmZvX3QgKnRoLCB2b2lkICpwdHIgS01QX1NSQ19MT0NfREVDTCApOworI2RlZmluZSBfX2ttcF90aHJlYWRfbWFsbG9jKCAgdGgsIHNpemUgKSAgICAgICAgICBfX19rbXBfdGhyZWFkX21hbGxvYyggICh0aCksIChzaXplKSAgICAgICAgICAgIEtNUF9TUkNfTE9DX0NVUlIgKQorI2RlZmluZSBfX2ttcF90aHJlYWRfY2FsbG9jKCAgdGgsIG5lbGVtLCBlbHNpemUgKSBfX19rbXBfdGhyZWFkX2NhbGxvYyggICh0aCksIChuZWxlbSksIChlbHNpemUpIEtNUF9TUkNfTE9DX0NVUlIgKQorI2RlZmluZSBfX2ttcF90aHJlYWRfcmVhbGxvYyggdGgsIHB0ciwgc2l6ZSApICAgICBfX19rbXBfdGhyZWFkX3JlYWxsb2MoICh0aCksIChwdHIpLCAoc2l6ZSkgICAgIEtNUF9TUkNfTE9DX0NVUlIgKQorI2RlZmluZSBfX2ttcF90aHJlYWRfZnJlZSggICAgdGgsIHB0ciApICAgICAgICAgICBfX19rbXBfdGhyZWFkX2ZyZWUoICAgICh0aCksIChwdHIpICAgICAgICAgICAgIEtNUF9TUkNfTE9DX0NVUlIgKQorCisjZGVmaW5lIEtNUF9JTlRFUk5BTF9NQUxMT0Moc3opICAgIG1hbGxvYyhzeikKKyNkZWZpbmUgS01QX0lOVEVSTkFMX0ZSRUUocCkgICAgICAgZnJlZShwKQorI2RlZmluZSBLTVBfSU5URVJOQUxfUkVBTExPQyhwLHN6KSByZWFsbG9jKChwKSwoc3opKQorI2RlZmluZSBLTVBfSU5URVJOQUxfQ0FMTE9DKG4sc3opICBjYWxsb2MoKG4pLChzeikpCisKK2V4dGVybiB2b2lkIF9fa21wX3B1c2hfbnVtX3RocmVhZHMoIGlkZW50X3QgKmxvYywgaW50IGd0aWQsIGludCBudW1fdGhyZWFkcyApOworCisjaWYgT01QXzQwX0VOQUJMRUQKK2V4dGVybiB2b2lkIF9fa21wX3B1c2hfcHJvY19iaW5kKCBpZGVudF90ICpsb2MsIGludCBndGlkLCBrbXBfcHJvY19iaW5kX3QgcHJvY19iaW5kICk7CitleHRlcm4gdm9pZCBfX2ttcF9wdXNoX251bV90ZWFtcyggaWRlbnRfdCAqbG9jLCBpbnQgZ3RpZCwgaW50IG51bV90ZWFtcywgaW50IG51bV90aHJlYWRzICk7CisjZW5kaWYKKworZXh0ZXJuIHZvaWQgX19rbXBfeWllbGQoIGludCBjb25kICk7CisKK2V4dGVybiB2b2lkIF9fa21wY19kaXNwYXRjaF9pbml0XzQoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsCisgICAgZW51bSBzY2hlZF90eXBlIHNjaGVkdWxlLCBrbXBfaW50MzIgbGIsIGttcF9pbnQzMiB1Yiwga21wX2ludDMyIHN0LAorICAgIGttcF9pbnQzMiBjaHVuayApOworZXh0ZXJuIHZvaWQgX19rbXBjX2Rpc3BhdGNoX2luaXRfNHUoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsCisgICAgZW51bSBzY2hlZF90eXBlIHNjaGVkdWxlLCBrbXBfdWludDMyIGxiLCBrbXBfdWludDMyIHViLCBrbXBfaW50MzIgc3QsCisgICAga21wX2ludDMyIGNodW5rICk7CitleHRlcm4gdm9pZCBfX2ttcGNfZGlzcGF0Y2hfaW5pdF84KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLAorICAgIGVudW0gc2NoZWRfdHlwZSBzY2hlZHVsZSwga21wX2ludDY0IGxiLCBrbXBfaW50NjQgdWIsIGttcF9pbnQ2NCBzdCwKKyAgICBrbXBfaW50NjQgY2h1bmsgKTsKK2V4dGVybiB2b2lkIF9fa21wY19kaXNwYXRjaF9pbml0Xzh1KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLAorICAgIGVudW0gc2NoZWRfdHlwZSBzY2hlZHVsZSwga21wX3VpbnQ2NCBsYiwga21wX3VpbnQ2NCB1Yiwga21wX2ludDY0IHN0LAorICAgIGttcF9pbnQ2NCBjaHVuayApOworCitleHRlcm4gaW50IF9fa21wY19kaXNwYXRjaF9uZXh0XzQoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsCisgICAga21wX2ludDMyICpwX2xhc3QsIGttcF9pbnQzMiAqcF9sYiwga21wX2ludDMyICpwX3ViLCBrbXBfaW50MzIgKnBfc3QgKTsKK2V4dGVybiBpbnQgX19rbXBjX2Rpc3BhdGNoX25leHRfNHUoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsCisgICAga21wX2ludDMyICpwX2xhc3QsIGttcF91aW50MzIgKnBfbGIsIGttcF91aW50MzIgKnBfdWIsIGttcF9pbnQzMiAqcF9zdCApOworZXh0ZXJuIGludCBfX2ttcGNfZGlzcGF0Y2hfbmV4dF84KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLAorICAgIGttcF9pbnQzMiAqcF9sYXN0LCBrbXBfaW50NjQgKnBfbGIsIGttcF9pbnQ2NCAqcF91Yiwga21wX2ludDY0ICpwX3N0ICk7CitleHRlcm4gaW50IF9fa21wY19kaXNwYXRjaF9uZXh0Xzh1KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLAorICAgIGttcF9pbnQzMiAqcF9sYXN0LCBrbXBfdWludDY0ICpwX2xiLCBrbXBfdWludDY0ICpwX3ViLCBrbXBfaW50NjQgKnBfc3QgKTsKKworZXh0ZXJuIHZvaWQgX19rbXBjX2Rpc3BhdGNoX2ZpbmlfNCggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIHZvaWQgX19rbXBjX2Rpc3BhdGNoX2ZpbmlfOCggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIHZvaWQgX19rbXBjX2Rpc3BhdGNoX2ZpbmlfNHUoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQgKTsKK2V4dGVybiB2b2lkIF9fa21wY19kaXNwYXRjaF9maW5pXzh1KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkICk7CisKKworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorCitleHRlcm4gdm9pZCBfX2ttcF9hdXhfZGlzcGF0Y2hfaW5pdF80KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLAorICAgIGVudW0gc2NoZWRfdHlwZSBzY2hlZHVsZSwga21wX2ludDMyIGxiLCBrbXBfaW50MzIgdWIsIGttcF9pbnQzMiBzdCwKKyAgICBrbXBfaW50MzIgY2h1bmssIGludCBwdXNoX3dzICk7CitleHRlcm4gdm9pZCBfX2ttcF9hdXhfZGlzcGF0Y2hfaW5pdF80dSggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwKKyAgICBlbnVtIHNjaGVkX3R5cGUgc2NoZWR1bGUsIGttcF91aW50MzIgbGIsIGttcF91aW50MzIgdWIsIGttcF9pbnQzMiBzdCwKKyAgICBrbXBfaW50MzIgY2h1bmssIGludCBwdXNoX3dzICk7CitleHRlcm4gdm9pZCBfX2ttcF9hdXhfZGlzcGF0Y2hfaW5pdF84KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLAorICAgIGVudW0gc2NoZWRfdHlwZSBzY2hlZHVsZSwga21wX2ludDY0IGxiLCBrbXBfaW50NjQgdWIsIGttcF9pbnQ2NCBzdCwKKyAgICBrbXBfaW50NjQgY2h1bmssIGludCBwdXNoX3dzICk7CitleHRlcm4gdm9pZCBfX2ttcF9hdXhfZGlzcGF0Y2hfaW5pdF84dSggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwKKyAgICBlbnVtIHNjaGVkX3R5cGUgc2NoZWR1bGUsIGttcF91aW50NjQgbGIsIGttcF91aW50NjQgdWIsIGttcF9pbnQ2NCBzdCwKKyAgICBrbXBfaW50NjQgY2h1bmssIGludCBwdXNoX3dzICk7CitleHRlcm4gdm9pZCBfX2ttcF9hdXhfZGlzcGF0Y2hfZmluaV9jaHVua180KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gdm9pZCBfX2ttcF9hdXhfZGlzcGF0Y2hfZmluaV9jaHVua184KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gdm9pZCBfX2ttcF9hdXhfZGlzcGF0Y2hfZmluaV9jaHVua180dSggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIHZvaWQgX19rbXBfYXV4X2Rpc3BhdGNoX2ZpbmlfY2h1bmtfOHUoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQgKTsKKworI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworCisKK2V4dGVybiBrbXBfdWludDMyIF9fa21wX2VxXzQoICBrbXBfdWludDMyIHZhbHVlLCBrbXBfdWludDMyIGNoZWNrZXIgKTsKK2V4dGVybiBrbXBfdWludDMyIF9fa21wX25lcV80KCBrbXBfdWludDMyIHZhbHVlLCBrbXBfdWludDMyIGNoZWNrZXIgKTsKK2V4dGVybiBrbXBfdWludDMyIF9fa21wX2x0XzQoICBrbXBfdWludDMyIHZhbHVlLCBrbXBfdWludDMyIGNoZWNrZXIgKTsKK2V4dGVybiBrbXBfdWludDMyIF9fa21wX2dlXzQoICBrbXBfdWludDMyIHZhbHVlLCBrbXBfdWludDMyIGNoZWNrZXIgKTsKK2V4dGVybiBrbXBfdWludDMyIF9fa21wX2xlXzQoICBrbXBfdWludDMyIHZhbHVlLCBrbXBfdWludDMyIGNoZWNrZXIgKTsKKworZXh0ZXJuIGttcF91aW50MzIgX19rbXBfZXFfOCggIGttcF91aW50NjQgdmFsdWUsIGttcF91aW50NjQgY2hlY2tlciApOworZXh0ZXJuIGttcF91aW50MzIgX19rbXBfbmVxXzgoIGttcF91aW50NjQgdmFsdWUsIGttcF91aW50NjQgY2hlY2tlciApOworZXh0ZXJuIGttcF91aW50MzIgX19rbXBfbHRfOCggIGttcF91aW50NjQgdmFsdWUsIGttcF91aW50NjQgY2hlY2tlciApOworZXh0ZXJuIGttcF91aW50MzIgX19rbXBfZ2VfOCggIGttcF91aW50NjQgdmFsdWUsIGttcF91aW50NjQgY2hlY2tlciApOworZXh0ZXJuIGttcF91aW50MzIgX19rbXBfbGVfOCggIGttcF91aW50NjQgdmFsdWUsIGttcF91aW50NjQgY2hlY2tlciApOworCitleHRlcm4ga21wX3VpbnQzMiBfX2ttcF93YWl0X3lpZWxkXzQoIGttcF91aW50MzIgdm9sYXRpbGUgKiBzcGlubmVyLCBrbXBfdWludDMyIGNoZWNrZXIsIGttcF91aW50MzIgKCpwcmVkKSAoa21wX3VpbnQzMiwga21wX3VpbnQzMiksIHZvaWQgKiBvYmogKTsKK2V4dGVybiBrbXBfdWludDY0IF9fa21wX3dhaXRfeWllbGRfOCgga21wX3VpbnQ2NCB2b2xhdGlsZSAqIHNwaW5uZXIsIGttcF91aW50NjQgY2hlY2tlciwga21wX3VpbnQzMiAoKnByZWQpIChrbXBfdWludDY0LCBrbXBfdWludDY0KSwgdm9pZCAqIG9iaiApOworCitjbGFzcyBrbXBfZmxhZ18zMjsKK2NsYXNzIGttcF9mbGFnXzY0OworY2xhc3Mga21wX2ZsYWdfb25jb3JlOworZXh0ZXJuIHZvaWQgX19rbXBfd2FpdF8zMihrbXBfaW5mb190ICp0aGlzX3Rociwga21wX2ZsYWdfMzIgKmZsYWcsIGludCBmaW5hbF9zcGluCisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICAgICAgICAgICAgICwgdm9pZCAqIGl0dF9zeW5jX29iagorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgKTsKK2V4dGVybiB2b2lkIF9fa21wX3JlbGVhc2VfMzIoa21wX2ZsYWdfMzIgKmZsYWcpOworZXh0ZXJuIHZvaWQgX19rbXBfd2FpdF82NChrbXBfaW5mb190ICp0aGlzX3Rociwga21wX2ZsYWdfNjQgKmZsYWcsIGludCBmaW5hbF9zcGluCisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICAgICAgICAgICAgICwgdm9pZCAqIGl0dF9zeW5jX29iagorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgKTsKK2V4dGVybiB2b2lkIF9fa21wX3JlbGVhc2VfNjQoa21wX2ZsYWdfNjQgKmZsYWcpOworZXh0ZXJuIHZvaWQgX19rbXBfd2FpdF9vbmNvcmUoa21wX2luZm9fdCAqdGhpc190aHIsIGttcF9mbGFnX29uY29yZSAqZmxhZywgaW50IGZpbmFsX3NwaW4KKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgICAgICAgICAgICAgLCB2b2lkICogaXR0X3N5bmNfb2JqCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICApOworZXh0ZXJuIHZvaWQgX19rbXBfcmVsZWFzZV9vbmNvcmUoa21wX2ZsYWdfb25jb3JlICpmbGFnKTsKKworZXh0ZXJuIHZvaWQgX19rbXBfaW5maW5pdGVfbG9vcCggdm9pZCApOworCitleHRlcm4gdm9pZCBfX2ttcF9jbGVhbnVwKCB2b2lkICk7CisKKyNpZiBLTVBfSEFORExFX1NJR05BTFMKKyAgICBleHRlcm4gaW50ICBfX2ttcF9oYW5kbGVfc2lnbmFsczsKKyAgICBleHRlcm4gdm9pZCBfX2ttcF9pbnN0YWxsX3NpZ25hbHMoIGludCBwYXJhbGxlbF9pbml0ICk7CisgICAgZXh0ZXJuIHZvaWQgX19rbXBfcmVtb3ZlX3NpZ25hbHMoIHZvaWQgKTsKKyNlbmRpZgorCitleHRlcm4gdm9pZCBfX2ttcF9jbGVhcl9zeXN0ZW1fdGltZSggdm9pZCApOworZXh0ZXJuIHZvaWQgX19rbXBfcmVhZF9zeXN0ZW1fdGltZSggZG91YmxlICpkZWx0YSApOworCitleHRlcm4gdm9pZCBfX2ttcF9jaGVja19zdGFja19vdmVybGFwKCBrbXBfaW5mb190ICp0aHIgKTsKKworZXh0ZXJuIHZvaWQgX19rbXBfZXhwYW5kX2hvc3RfbmFtZSggY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSApOworZXh0ZXJuIHZvaWQgX19rbXBfZXhwYW5kX2ZpbGVfbmFtZSggY2hhciAqcmVzdWx0LCBzaXplX3QgcmxlbiwgY2hhciAqcGF0dGVybiApOworCisjaWYgS01QX09TX1dJTkRPV1MKK2V4dGVybiB2b2lkIF9fa21wX2luaXRpYWxpemVfc3lzdGVtX3RpY2soIHZvaWQgKTsgIC8qIEluaXRpYWxpemUgdGltZXIgdGljayB2YWx1ZSAqLworI2VuZGlmCisKK2V4dGVybiB2b2lkIF9fa21wX3J1bnRpbWVfaW5pdGlhbGl6ZSggdm9pZCApOyAgLyogbWFjaGluZSBzcGVjaWZpYyBpbml0aWFsaXphdGlvbiAqLworZXh0ZXJuIHZvaWQgX19rbXBfcnVudGltZV9kZXN0cm95KCB2b2lkICk7CisKKyNpZiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECitleHRlcm4gY2hhciAqX19rbXBfYWZmaW5pdHlfcHJpbnRfbWFzayhjaGFyICpidWYsIGludCBidWZfbGVuLCBrbXBfYWZmaW5fbWFza190ICptYXNrKTsKK2V4dGVybiB2b2lkIF9fa21wX2FmZmluaXR5X2luaXRpYWxpemUodm9pZCk7CitleHRlcm4gdm9pZCBfX2ttcF9hZmZpbml0eV91bmluaXRpYWxpemUodm9pZCk7CitleHRlcm4gdm9pZCBfX2ttcF9hZmZpbml0eV9zZXRfaW5pdF9tYXNrKGludCBndGlkLCBpbnQgaXNhX3Jvb3QpOyAvKiBzZXQgYWZmaW5pdHkgYWNjb3JkaW5nIHRvIEtNUF9BRkZJTklUWSAqLworI2lmIE9NUF80MF9FTkFCTEVECitleHRlcm4gdm9pZCBfX2ttcF9hZmZpbml0eV9zZXRfcGxhY2UoaW50IGd0aWQpOworI2VuZGlmCitleHRlcm4gdm9pZCBfX2ttcF9jaGFuZ2VfdGhyZWFkX2FmZmluaXR5X21hc2soIGludCBndGlkLCBrbXBfYWZmaW5fbWFza190ICpuZXdfbWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2FmZmluX21hc2tfdCAqb2xkX21hc2sgKTsKK2V4dGVybiB2b2lkIF9fa21wX2FmZmluaXR5X2RldGVybWluZV9jYXBhYmxlKCBjb25zdCBjaGFyICplbnZfdmFyICk7CitleHRlcm4gaW50IF9fa21wX2F1eF9zZXRfYWZmaW5pdHkodm9pZCAqKm1hc2spOworZXh0ZXJuIGludCBfX2ttcF9hdXhfZ2V0X2FmZmluaXR5KHZvaWQgKiptYXNrKTsKK2V4dGVybiBpbnQgX19rbXBfYXV4X3NldF9hZmZpbml0eV9tYXNrX3Byb2MoaW50IHByb2MsIHZvaWQgKiptYXNrKTsKK2V4dGVybiBpbnQgX19rbXBfYXV4X3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYyhpbnQgcHJvYywgdm9pZCAqKm1hc2spOworZXh0ZXJuIGludCBfX2ttcF9hdXhfZ2V0X2FmZmluaXR5X21hc2tfcHJvYyhpbnQgcHJvYywgdm9pZCAqKm1hc2spOworZXh0ZXJuIHZvaWQgX19rbXBfYmFsYW5jZWRfYWZmaW5pdHkoIGludCB0aWQsIGludCB0ZWFtX3NpemUgKTsKKyNlbmRpZiAvKiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVEICovCisKK2V4dGVybiB2b2lkIF9fa21wX2dldF9oaWVyYXJjaHkoa21wX3VpbnQzMiBucHJvYywga21wX2JzdGF0ZV90ICp0aHJfYmFyKTsKKworI2lmIEtNUF9PU19MSU5VWCAmJiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0gfHwgS01QX0FSQ0hfQUFSQ0g2NCkKKworZXh0ZXJuIGludCBfX2ttcF9mdXRleF9kZXRlcm1pbmVfY2FwYWJsZSggdm9pZCApOworCisjZW5kaWYgLy8gS01QX09TX0xJTlVYICYmIChLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSB8fCBLTVBfQVJDSF9BQVJDSDY0KQorCitleHRlcm4gdm9pZCBfX2ttcF9ndGlkX3NldF9zcGVjaWZpYyggaW50IGd0aWQgKTsKK2V4dGVybiBpbnQgIF9fa21wX2d0aWRfZ2V0X3NwZWNpZmljKCB2b2lkICk7CisKK2V4dGVybiBkb3VibGUgX19rbXBfcmVhZF9jcHVfdGltZSggdm9pZCApOworCitleHRlcm4gaW50ICBfX2ttcF9yZWFkX3N5c3RlbV9pbmZvKCBzdHJ1Y3Qga21wX3N5c19pbmZvICppbmZvICk7CisKK2V4dGVybiB2b2lkIF9fa21wX2NyZWF0ZV9tb25pdG9yKCBrbXBfaW5mb190ICp0aCApOworCitleHRlcm4gdm9pZCAqX19rbXBfbGF1bmNoX3RocmVhZCgga21wX2luZm9fdCAqdGhyICk7CisKK2V4dGVybiB2b2lkIF9fa21wX2NyZWF0ZV93b3JrZXIoIGludCBndGlkLCBrbXBfaW5mb190ICp0aCwgc2l6ZV90IHN0YWNrX3NpemUgKTsKKworI2lmIEtNUF9PU19XSU5ET1dTCitleHRlcm4gaW50ICBfX2ttcF9zdGlsbF9ydW5uaW5nKGttcF9pbmZvX3QgKnRoKTsKK2V4dGVybiBpbnQgIF9fa21wX2lzX3RocmVhZF9hbGl2ZSgga21wX2luZm9fdCAqIHRoLCBEV09SRCAqZXhpdF92YWwgKTsKK2V4dGVybiB2b2lkIF9fa21wX2ZyZWVfaGFuZGxlKCBrbXBfdGhyZWFkX3QgdEhhbmRsZSApOworI2VuZGlmCisKK2V4dGVybiB2b2lkIF9fa21wX3JlYXBfbW9uaXRvcigga21wX2luZm9fdCAqdGggKTsKK2V4dGVybiB2b2lkIF9fa21wX3JlYXBfd29ya2VyKCBrbXBfaW5mb190ICp0aCApOworZXh0ZXJuIHZvaWQgX19rbXBfdGVybWluYXRlX3RocmVhZCggaW50IGd0aWQgKTsKKworZXh0ZXJuIHZvaWQgX19rbXBfc3VzcGVuZF8zMiggaW50IHRoX2d0aWQsIGttcF9mbGFnXzMyICpmbGFnICk7CitleHRlcm4gdm9pZCBfX2ttcF9zdXNwZW5kXzY0KCBpbnQgdGhfZ3RpZCwga21wX2ZsYWdfNjQgKmZsYWcgKTsKK2V4dGVybiB2b2lkIF9fa21wX3N1c3BlbmRfb25jb3JlKCBpbnQgdGhfZ3RpZCwga21wX2ZsYWdfb25jb3JlICpmbGFnICk7CitleHRlcm4gdm9pZCBfX2ttcF9yZXN1bWVfMzIoIGludCB0YXJnZXRfZ3RpZCwga21wX2ZsYWdfMzIgKmZsYWcgKTsKK2V4dGVybiB2b2lkIF9fa21wX3Jlc3VtZV82NCggaW50IHRhcmdldF9ndGlkLCBrbXBfZmxhZ182NCAqZmxhZyApOworZXh0ZXJuIHZvaWQgX19rbXBfcmVzdW1lX29uY29yZSggaW50IHRhcmdldF9ndGlkLCBrbXBfZmxhZ19vbmNvcmUgKmZsYWcgKTsKKworZXh0ZXJuIHZvaWQgX19rbXBfZWxhcHNlZCggZG91YmxlICogKTsKK2V4dGVybiB2b2lkIF9fa21wX2VsYXBzZWRfdGljayggZG91YmxlICogKTsKKworZXh0ZXJuIHZvaWQgX19rbXBfZW5hYmxlKCBpbnQgb2xkX3N0YXRlICk7CitleHRlcm4gdm9pZCBfX2ttcF9kaXNhYmxlKCBpbnQgKm9sZF9zdGF0ZSApOworCitleHRlcm4gdm9pZCBfX2ttcF90aHJlYWRfc2xlZXAoIGludCBtaWxsaXMgKTsKKworZXh0ZXJuIHZvaWQgX19rbXBfY29tbW9uX2luaXRpYWxpemUoIHZvaWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX2NvbW1vbl9kZXN0cm95KCB2b2lkICk7CitleHRlcm4gdm9pZCBfX2ttcF9jb21tb25fZGVzdHJveV9ndGlkKCBpbnQgZ3RpZCApOworCisjaWYgS01QX09TX1VOSVgKK2V4dGVybiB2b2lkIF9fa21wX3JlZ2lzdGVyX2F0Zm9yayggdm9pZCApOworI2VuZGlmCitleHRlcm4gdm9pZCBfX2ttcF9zdXNwZW5kX2luaXRpYWxpemUoIHZvaWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX3N1c3BlbmRfdW5pbml0aWFsaXplX3RocmVhZCgga21wX2luZm9fdCAqdGggKTsKKworZXh0ZXJuIGttcF9pbmZvX3QgKiBfX2ttcF9hbGxvY2F0ZV90aHJlYWQoIGttcF9yb290X3QgKnJvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX3RlYW1fdCAqdGVhbSwgaW50IHRpZCk7CisjaWYgT01QXzQwX0VOQUJMRUQKK2V4dGVybiBrbXBfdGVhbV90ICogX19rbXBfYWxsb2NhdGVfdGVhbSgga21wX3Jvb3RfdCAqcm9vdCwgaW50IG5ld19ucHJvYywgaW50IG1heF9ucHJvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX3Byb2NfYmluZF90IHByb2NfYmluZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludGVybmFsX2NvbnRyb2xfdCAqbmV3X2ljdnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhcmdjIFVTRV9ORVNURURfSE9UX0FSRyhrbXBfaW5mb190ICp0aHIpICk7CisjZWxzZQorZXh0ZXJuIGttcF90ZWFtX3QgKiBfX2ttcF9hbGxvY2F0ZV90ZWFtKCBrbXBfcm9vdF90ICpyb290LCBpbnQgbmV3X25wcm9jLCBpbnQgbWF4X25wcm9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50ZXJuYWxfY29udHJvbF90ICpuZXdfaWN2cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFyZ2MgVVNFX05FU1RFRF9IT1RfQVJHKGttcF9pbmZvX3QgKnRocikgKTsKKyNlbmRpZiAvLyBPTVBfNDBfRU5BQkxFRAorZXh0ZXJuIHZvaWQgX19rbXBfZnJlZV90aHJlYWQoIGttcF9pbmZvX3QgKiApOworZXh0ZXJuIHZvaWQgX19rbXBfZnJlZV90ZWFtKCBrbXBfcm9vdF90ICosIGttcF90ZWFtX3QgKiAgVVNFX05FU1RFRF9IT1RfQVJHKGttcF9pbmZvX3QgKikgKTsKK2V4dGVybiBrbXBfdGVhbV90ICogX19rbXBfcmVhcF90ZWFtKCBrbXBfdGVhbV90ICogKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2V4dGVybiB2b2lkIF9fa21wX2luaXRpYWxpemVfYmdldCgga21wX2luZm9fdCAqdGggKTsKK2V4dGVybiB2b2lkIF9fa21wX2ZpbmFsaXplX2JnZXQoIGttcF9pbmZvX3QgKnRoICk7CisKK0tNUF9FWFBPUlQgdm9pZCAqa21wY19tYWxsb2MoIHNpemVfdCBzaXplICk7CitLTVBfRVhQT1JUIHZvaWQgKmttcGNfY2FsbG9jKCBzaXplX3QgbmVsZW0sIHNpemVfdCBlbHNpemUgKTsKK0tNUF9FWFBPUlQgdm9pZCAqa21wY19yZWFsbG9jKCB2b2lkICpwdHIsIHNpemVfdCBzaXplICk7CitLTVBfRVhQT1JUIHZvaWQgIGttcGNfZnJlZSggdm9pZCAqcHRyICk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogZGVjbGFyYXRpb25zIGZvciBpbnRlcm5hbCB1c2UgKi8KKworZXh0ZXJuIGludCAgX19rbXBfYmFycmllciggZW51bSBiYXJyaWVyX3R5cGUgYnQsIGludCBndGlkLCBpbnQgaXNfc3BsaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgcmVkdWNlX3NpemUsIHZvaWQgKnJlZHVjZV9kYXRhLCB2b2lkICgqcmVkdWNlKSh2b2lkICosIHZvaWQgKikgKTsKK2V4dGVybiB2b2lkIF9fa21wX2VuZF9zcGxpdF9iYXJyaWVyICggZW51bSBiYXJyaWVyX3R5cGUgYnQsIGludCBndGlkICk7CisKKy8qIQorICogVGVsbCB0aGUgZm9yayBjYWxsIHdoaWNoIGNvbXBpbGVyIGdlbmVyYXRlZCB0aGUgZm9yayBjYWxsLCBhbmQgdGhlcmVmb3JlIGhvdyB0byBkZWFsIHdpdGggdGhlIGNhbGwuCisgKi8KK2VudW0gZm9ya19jb250ZXh0X2UKK3sKKyAgICBmb3JrX2NvbnRleHRfZ251LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQ2FsbGVkIGZyb20gR05VIGdlbmVyYXRlZCBjb2RlLCBzbyBtdXN0IG5vdCBpbnZva2UgdGhlIG1pY3JvdGFzayBpbnRlcm5hbGx5LiAqLworICAgIGZvcmtfY29udGV4dF9pbnRlbCwgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBDYWxsZWQgZnJvbSBJbnRlbCBnZW5lcmF0ZWQgY29kZS4gICovCisgICAgZm9ya19jb250ZXh0X2xhc3QKK307CitleHRlcm4gaW50IF9fa21wX2ZvcmtfY2FsbCggaWRlbnRfdCAqbG9jLCBpbnQgZ3RpZCwgZW51bSBmb3JrX2NvbnRleHRfZSBmb3JrX2NvbnRleHQsCisgIGttcF9pbnQzMiBhcmdjLCBtaWNyb3Rhc2tfdCBtaWNyb3Rhc2ssIGxhdW5jaF90IGludm9rZXIsCisvKiBUT0RPOiByZXZlcnQgd29ya2Fyb3VuZCBmb3IgSW50ZWwoUikgNjQgdHJhY2tlciAjOTYgKi8KKyNpZiAoS01QX0FSQ0hfQVJNIHx8IEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BQVJDSDY0KSAmJiBLTVBfT1NfTElOVVgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCAqYXAKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhX2xpc3QgYXAKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworCitleHRlcm4gdm9pZCBfX2ttcF9qb2luX2NhbGwoIGlkZW50X3QgKmxvYywgaW50IGd0aWQKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBpbnQgZXhpdF90ZWFtcyA9IDAKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworZXh0ZXJuIHZvaWQgX19rbXBfc2VyaWFsaXplZF9wYXJhbGxlbChpZGVudF90ICppZCwga21wX2ludDMyIGd0aWQpOworZXh0ZXJuIHZvaWQgX19rbXBfaW50ZXJuYWxfZm9yayggaWRlbnRfdCAqaWQsIGludCBndGlkLCBrbXBfdGVhbV90ICp0ZWFtICk7CitleHRlcm4gdm9pZCBfX2ttcF9pbnRlcm5hbF9qb2luKCBpZGVudF90ICppZCwgaW50IGd0aWQsIGttcF90ZWFtX3QgKnRlYW0gKTsKK2V4dGVybiBpbnQgX19rbXBfaW52b2tlX3Rhc2tfZnVuYyggaW50IGd0aWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX3J1bl9iZWZvcmVfaW52b2tlZF90YXNrKCBpbnQgZ3RpZCwgaW50IHRpZCwga21wX2luZm9fdCAqdGhpc190aHIsIGttcF90ZWFtX3QgKnRlYW0gKTsKK2V4dGVybiB2b2lkIF9fa21wX3J1bl9hZnRlcl9pbnZva2VkX3Rhc2soIGludCBndGlkLCBpbnQgdGlkLCBrbXBfaW5mb190ICp0aGlzX3Rociwga21wX3RlYW1fdCAqdGVhbSApOworCisvLyBzaG91bGQgbmV2ZXIgaGF2ZSBiZWVuIGV4cG9ydGVkCitLTVBfRVhQT1JUIGludCBfX2ttcGNfaW52b2tlX3Rhc2tfZnVuYyggaW50IGd0aWQgKTsKKyNpZiBPTVBfNDBfRU5BQkxFRAorZXh0ZXJuIGludCAgX19rbXBfaW52b2tlX3RlYW1zX21hc3RlciggaW50IGd0aWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX3RlYW1zX21hc3RlciggaW50IGd0aWQgKTsKKyNlbmRpZgorZXh0ZXJuIHZvaWQgX19rbXBfc2F2ZV9pbnRlcm5hbF9jb250cm9scygga21wX2luZm9fdCAqIHRocmVhZCApOworZXh0ZXJuIHZvaWQgX19rbXBfdXNlcl9zZXRfbGlicmFyeSAoZW51bSBsaWJyYXJ5X3R5cGUgYXJnKTsKK2V4dGVybiB2b2lkIF9fa21wX2F1eF9zZXRfbGlicmFyeSAoZW51bSBsaWJyYXJ5X3R5cGUgYXJnKTsKK2V4dGVybiB2b2lkIF9fa21wX2F1eF9zZXRfc3RhY2tzaXplKCBzaXplX3QgYXJnKTsKK2V4dGVybiB2b2lkIF9fa21wX2F1eF9zZXRfYmxvY2t0aW1lIChpbnQgYXJnLCBrbXBfaW5mb190ICp0aHJlYWQsIGludCB0aWQpOworZXh0ZXJuIHZvaWQgX19rbXBfYXV4X3NldF9kZWZhdWx0cyggY2hhciBjb25zdCAqIHN0ciwgaW50IGxlbiApOworCisvKiBGdW5jdGlvbnMgYmVsb3cgcHV0IGhlcmUgdG8gY2FsbCB0aGVtIGZyb20gX19rbXBfYXV4X2Vudl9pbml0aWFsaXplKCkgaW4ga21wX3NldHRpbmdzLmMgKi8KK3ZvaWQga21wY19zZXRfYmxvY2t0aW1lIChpbnQgYXJnKTsKK3ZvaWQgb21wY19zZXRfbmVzdGVkKCBpbnQgZmxhZyApOwordm9pZCBvbXBjX3NldF9keW5hbWljKCBpbnQgZmxhZyApOwordm9pZCBvbXBjX3NldF9udW1fdGhyZWFkcyggaW50IGFyZyApOworCitleHRlcm4gdm9pZCBfX2ttcF9wdXNoX2N1cnJlbnRfdGFza190b190aHJlYWQoIGttcF9pbmZvX3QgKnRoaXNfdGhyLAorICAgICAgICAgICAgICAgICAga21wX3RlYW1fdCAqdGVhbSwgaW50IHRpZCApOworZXh0ZXJuIHZvaWQgX19rbXBfcG9wX2N1cnJlbnRfdGFza19mcm9tX3RocmVhZCgga21wX2luZm9fdCAqdGhpc190aHIgKTsKK2V4dGVybiBrbXBfdGFza190KiBfX2ttcF90YXNrX2FsbG9jKCBpZGVudF90ICpsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwKKyAga21wX3Rhc2tpbmdfZmxhZ3NfdCAqZmxhZ3MsIHNpemVfdCBzaXplb2Zfa21wX3Rhc2tfdCwgc2l6ZV90IHNpemVvZl9zaGFyZWRzLAorICBrbXBfcm91dGluZV9lbnRyeV90IHRhc2tfZW50cnkgKTsKK2V4dGVybiB2b2lkIF9fa21wX2luaXRfaW1wbGljaXRfdGFzayggaWRlbnRfdCAqbG9jX3JlZiwga21wX2luZm9fdCAqdGhpc190aHIsCisgICAgICAgICAgICAgICAgICBrbXBfdGVhbV90ICp0ZWFtLCBpbnQgdGlkLCBpbnQgc2V0X2N1cnJfdGFzayApOworCitpbnQgX19rbXBfZXhlY3V0ZV90YXNrc18zMihrbXBfaW5mb190ICp0aHJlYWQsIGttcF9pbnQzMiBndGlkLCBrbXBfZmxhZ18zMiAqZmxhZywgaW50IGZpbmFsX3NwaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnRocmVhZF9maW5pc2hlZCwKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICogaXR0X3N5bmNfb2JqLAorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBpc19jb25zdHJhaW5lZCk7CitpbnQgX19rbXBfZXhlY3V0ZV90YXNrc182NChrbXBfaW5mb190ICp0aHJlYWQsIGttcF9pbnQzMiBndGlkLCBrbXBfZmxhZ182NCAqZmxhZywgaW50IGZpbmFsX3NwaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnRocmVhZF9maW5pc2hlZCwKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICogaXR0X3N5bmNfb2JqLAorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBpc19jb25zdHJhaW5lZCk7CitpbnQgX19rbXBfZXhlY3V0ZV90YXNrc19vbmNvcmUoa21wX2luZm9fdCAqdGhyZWFkLCBrbXBfaW50MzIgZ3RpZCwga21wX2ZsYWdfb25jb3JlICpmbGFnLCBpbnQgZmluYWxfc3BpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnRocmVhZF9maW5pc2hlZCwKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqIGl0dF9zeW5jX29iaiwKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIGlzX2NvbnN0cmFpbmVkKTsKKworZXh0ZXJuIHZvaWQgX19rbXBfcmVhcF90YXNrX3RlYW1zKCB2b2lkICk7CitleHRlcm4gdm9pZCBfX2ttcF91bnJlZl90YXNrX3RlYW0oIGttcF90YXNrX3RlYW1fdCAqdGFza190ZWFtLCBrbXBfaW5mb190ICp0aHJlYWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX3dhaXRfdG9fdW5yZWZfdGFza190ZWFtcyggdm9pZCApOworZXh0ZXJuIHZvaWQgX19rbXBfdGFza190ZWFtX3NldHVwICgga21wX2luZm9fdCAqdGhpc190aHIsIGttcF90ZWFtX3QgKnRlYW0gKTsKK2V4dGVybiB2b2lkIF9fa21wX3Rhc2tfdGVhbV9zeW5jICAoIGttcF9pbmZvX3QgKnRoaXNfdGhyLCBrbXBfdGVhbV90ICp0ZWFtICk7CitleHRlcm4gdm9pZCBfX2ttcF90YXNrX3RlYW1fd2FpdCAgKCBrbXBfaW5mb190ICp0aGlzX3Rociwga21wX3RlYW1fdCAqdGVhbQorI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgdm9pZCAqIGl0dF9zeW5jX29iagorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyk7CitleHRlcm4gdm9pZCBfX2ttcF90YXNraW5nX2JhcnJpZXIoIGttcF90ZWFtX3QgKnRlYW0sIGttcF9pbmZvX3QgKnRocmVhZCwgaW50IGd0aWQgKTsKKworZXh0ZXJuIGludCAgX19rbXBfaXNfYWRkcmVzc19tYXBwZWQoIHZvaWQgKmFkZHIgKTsKK2V4dGVybiBrbXBfdWludDY0IF9fa21wX2hhcmR3YXJlX3RpbWVzdGFtcCh2b2lkKTsKKworI2lmIEtNUF9PU19VTklYCitleHRlcm4gaW50ICBfX2ttcF9yZWFkX2Zyb21fZmlsZSggY2hhciBjb25zdCAqcGF0aCwgY2hhciBjb25zdCAqZm9ybWF0LCAuLi4gKTsKKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8vCisvLyBBc3NlbWJseSByb3V0aW5lcyB0aGF0IGhhdmUgbm8gY29tcGlsZXIgaW50cmluc2ljIHJlcGxhY2VtZW50CisvLworCisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorCitleHRlcm4gdm9pZCAgICAgICBfX2ttcF9xdWVyeV9jcHVpZCgga21wX2NwdWluZm9fdCAqcCApOworCisjZGVmaW5lIF9fa21wX2xvYWRfbXhjc3IocCkgX21tX3NldGNzcigqKHApKQorc3RhdGljIGlubGluZSB2b2lkIF9fa21wX3N0b3JlX214Y3NyKCBrbXBfdWludDMyICpwICkgeyAqcCA9IF9tbV9nZXRjc3IoKTsgfQorCitleHRlcm4gdm9pZCBfX2ttcF9sb2FkX3g4N19mcHVfY29udHJvbF93b3JkKCBrbXBfaW50MTYgKnAgKTsKK2V4dGVybiB2b2lkIF9fa21wX3N0b3JlX3g4N19mcHVfY29udHJvbF93b3JkKCBrbXBfaW50MTYgKnAgKTsKK2V4dGVybiB2b2lkIF9fa21wX2NsZWFyX3g4N19mcHVfc3RhdHVzX3dvcmQoKTsKKyMgZGVmaW5lIEtNUF9YODZfTVhDU1JfTUFTSyAgICAgIDB4ZmZmZmZmYzAgICAvKiBpZ25vcmUgc3RhdHVzIGZsYWdzICg2IGxzYikgKi8KKworI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKworZXh0ZXJuIGludCBfX2ttcF9pbnZva2VfbWljcm90YXNrKCBtaWNyb3Rhc2tfdCBwa2ZuLCBpbnQgZ3RpZCwgaW50IG5wciwgaW50IGFyZ2MsIHZvaWQgKmFyZ3ZbXSApOworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitLTVBfRVhQT1JUIHZvaWQgICBfX2ttcGNfYmVnaW4gICAgICAgICAgICAgICAgKCBpZGVudF90ICosIGttcF9pbnQzMiBmbGFncyApOworS01QX0VYUE9SVCB2b2lkICAgX19rbXBjX2VuZCAgICAgICAgICAgICAgICAgICggaWRlbnRfdCAqICk7CisKK0tNUF9FWFBPUlQgdm9pZCAgIF9fa21wY190aHJlYWRwcml2YXRlX3JlZ2lzdGVyX3ZlYyAoIGlkZW50X3QgKiwgdm9pZCAqIGRhdGEsIGttcGNfY3Rvcl92ZWMgY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wY19jY3Rvcl92ZWMgY2N0b3IsIGttcGNfZHRvcl92ZWMgZHRvciwgc2l6ZV90IHZlY3Rvcl9sZW5ndGggKTsKK0tNUF9FWFBPUlQgdm9pZCAgIF9fa21wY190aHJlYWRwcml2YXRlX3JlZ2lzdGVyICAgICAoIGlkZW50X3QgKiwgdm9pZCAqIGRhdGEsIGttcGNfY3RvciBjdG9yLCBrbXBjX2NjdG9yIGNjdG9yLCBrbXBjX2R0b3IgZHRvciApOworS01QX0VYUE9SVCB2b2lkICogX19rbXBjX3RocmVhZHByaXZhdGUgICAgICAgICAgICAgICggaWRlbnRfdCAqLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwgdm9pZCAqIGRhdGEsIHNpemVfdCBzaXplICk7CisKK0tNUF9FWFBPUlQga21wX2ludDMyICBfX2ttcGNfZ2xvYmFsX3RocmVhZF9udW0gICggaWRlbnRfdCAqICk7CitLTVBfRVhQT1JUIGttcF9pbnQzMiAgX19rbXBjX2dsb2JhbF9udW1fdGhyZWFkcyAoIGlkZW50X3QgKiApOworS01QX0VYUE9SVCBrbXBfaW50MzIgIF9fa21wY19ib3VuZF90aHJlYWRfbnVtICAgKCBpZGVudF90ICogKTsKK0tNUF9FWFBPUlQga21wX2ludDMyICBfX2ttcGNfYm91bmRfbnVtX3RocmVhZHMgICggaWRlbnRfdCAqICk7CisKK0tNUF9FWFBPUlQga21wX2ludDMyICBfX2ttcGNfb2tfdG9fZm9yayAgICAgKCBpZGVudF90ICogKTsKK0tNUF9FWFBPUlQgdm9pZCAgIF9fa21wY19mb3JrX2NhbGwgICAgICAgICAgKCBpZGVudF90ICosIGttcF9pbnQzMiBuYXJncywga21wY19taWNybyBtaWNyb3Rhc2ssIC4uLiApOworCitLTVBfRVhQT1JUIHZvaWQgICBfX2ttcGNfc2VyaWFsaXplZF9wYXJhbGxlbCAgICAgKCBpZGVudF90ICosIGttcF9pbnQzMiBnbG9iYWxfdGlkICk7CitLTVBfRVhQT1JUIHZvaWQgICBfX2ttcGNfZW5kX3NlcmlhbGl6ZWRfcGFyYWxsZWwgKCBpZGVudF90ICosIGttcF9pbnQzMiBnbG9iYWxfdGlkICk7CisKK0tNUF9FWFBPUlQgdm9pZCAgIF9fa21wY19mbHVzaCAgICAgICAgICAgICAgKCBpZGVudF90ICosIC4uLiApOworS01QX0VYUE9SVCB2b2lkICAgX19rbXBjX2JhcnJpZXIgICAgICAgICAgICAoIGlkZW50X3QgKiwga21wX2ludDMyIGdsb2JhbF90aWQgKTsKK0tNUF9FWFBPUlQga21wX2ludDMyICBfX2ttcGNfbWFzdGVyICAgICAgICAgKCBpZGVudF90ICosIGttcF9pbnQzMiBnbG9iYWxfdGlkICk7CitLTVBfRVhQT1JUIHZvaWQgICBfX2ttcGNfZW5kX21hc3RlciAgICAgICAgICggaWRlbnRfdCAqLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCApOworS01QX0VYUE9SVCB2b2lkICAgX19rbXBjX29yZGVyZWQgICAgICAgICAgICAoIGlkZW50X3QgKiwga21wX2ludDMyIGdsb2JhbF90aWQgKTsKK0tNUF9FWFBPUlQgdm9pZCAgIF9fa21wY19lbmRfb3JkZXJlZCAgICAgICAgKCBpZGVudF90ICosIGttcF9pbnQzMiBnbG9iYWxfdGlkICk7CitLTVBfRVhQT1JUIHZvaWQgICBfX2ttcGNfY3JpdGljYWwgICAgICAgICAgICggaWRlbnRfdCAqLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wX2NyaXRpY2FsX25hbWUgKiApOworS01QX0VYUE9SVCB2b2lkICAgX19rbXBjX2VuZF9jcml0aWNhbCAgICAgICAoIGlkZW50X3QgKiwga21wX2ludDMyIGdsb2JhbF90aWQsIGttcF9jcml0aWNhbF9uYW1lICogKTsKKworS01QX0VYUE9SVCBrbXBfaW50MzIgIF9fa21wY19iYXJyaWVyX21hc3RlciAoIGlkZW50X3QgKiwga21wX2ludDMyIGdsb2JhbF90aWQgKTsKK0tNUF9FWFBPUlQgdm9pZCAgIF9fa21wY19lbmRfYmFycmllcl9tYXN0ZXIgKCBpZGVudF90ICosIGttcF9pbnQzMiBnbG9iYWxfdGlkICk7CisKK0tNUF9FWFBPUlQga21wX2ludDMyICBfX2ttcGNfYmFycmllcl9tYXN0ZXJfbm93YWl0ICggaWRlbnRfdCAqLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCApOworCitLTVBfRVhQT1JUIGttcF9pbnQzMiAgX19rbXBjX3NpbmdsZSAgICAgICAgICggaWRlbnRfdCAqLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCApOworS01QX0VYUE9SVCB2b2lkICAgX19rbXBjX2VuZF9zaW5nbGUgICAgICAgICAoIGlkZW50X3QgKiwga21wX2ludDMyIGdsb2JhbF90aWQgKTsKKworS01QX0VYUE9SVCB2b2lkIEtNUENfRk9SX1NUQVRJQ19JTklUICAgICggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wX2ludDMyIHNjaGVkdHlwZSwga21wX2ludDMyICpwbGFzdGl0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50ICpwbG93ZXIsIGttcF9pbnQgKnB1cHBlciwga21wX2ludCAqcHN0cmlkZSwga21wX2ludCBpbmNyLCBrbXBfaW50IGNodW5rICk7CisKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfZm9yX3N0YXRpY19maW5pICAoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQgKTsKKworS01QX0VYUE9SVCB2b2lkIF9fa21wY19jb3B5cHJpdmF0ZSggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwgc2l6ZV90IGNweV9zaXplLCB2b2lkICpjcHlfZGF0YSwgdm9pZCgqY3B5X2Z1bmMpKHZvaWQqLHZvaWQqKSwga21wX2ludDMyIGRpZGl0ICk7CisKK2V4dGVybiB2b2lkIEtNUENfU0VUX05VTV9USFJFQURTICAgICAgICAoIGludCBhcmcgKTsKK2V4dGVybiB2b2lkIEtNUENfU0VUX0RZTkFNSUMgICAgICAgICAgICAoIGludCBmbGFnICk7CitleHRlcm4gdm9pZCBLTVBDX1NFVF9ORVNURUQgICAgICAgICAgICAgKCBpbnQgZmxhZyApOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIFRhc2txIGludGVyZmFjZSByb3V0aW5lcworICovCisKK0tNUF9FWFBPUlQga21wY190aHVua190ICogX19rbXBjX3Rhc2txIChpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBjX3Rhc2tfdCB0YXNrcV90YXNrLCBzaXplX3Qgc2l6ZW9mX3RodW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplb2Zfc2hhcmVkcywga21wX2ludDMyIGZsYWdzLCBrbXBjX3NoYXJlZF92YXJzX3QgKipzaGFyZWRzKTsKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfZW5kX3Rhc2txIChpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBjX3RodW5rX3QgKnRodW5rKTsKK0tNUF9FWFBPUlQga21wX2ludDMyIF9fa21wY190YXNrIChpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBjX3RodW5rX3QgKnRodW5rKTsKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfdGFza3FfdGFzayAoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wY190aHVua190ICp0aHVuaywga21wX2ludDMyIHN0YXR1cyk7CitLTVBfRVhQT1JUIHZvaWQgX19rbXBjX2VuZF90YXNrcV90YXNrIChpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBjX3RodW5rX3QgKnRodW5rKTsKK0tNUF9FWFBPUlQga21wY190aHVua190ICogX19rbXBjX3Rhc2tfYnVmZmVyIChpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBjX3RodW5rX3QgKnRhc2txX3RodW5rLCBrbXBjX3Rhc2tfdCB0YXNrKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBPTVAgMy4wIHRhc2tpbmcgaW50ZXJmYWNlIHJvdXRpbmVzCisgKi8KKworS01QX0VYUE9SVCBrbXBfaW50MzIKK19fa21wY19vbXBfdGFzayggaWRlbnRfdCAqbG9jX3JlZiwga21wX2ludDMyIGd0aWQsIGttcF90YXNrX3QgKiBuZXdfdGFzayApOworS01QX0VYUE9SVCBrbXBfdGFza190KgorX19rbXBjX29tcF90YXNrX2FsbG9jKCBpZGVudF90ICpsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwga21wX2ludDMyIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZW9mX2ttcF90YXNrX3QsIHNpemVfdCBzaXplb2Zfc2hhcmVkcywKKyAgICAgICAgICAgICAgICAgICAgICAga21wX3JvdXRpbmVfZW50cnlfdCB0YXNrX2VudHJ5ICk7CitLTVBfRVhQT1JUIHZvaWQKK19fa21wY19vbXBfdGFza19iZWdpbl9pZjAoIGlkZW50X3QgKmxvY19yZWYsIGttcF9pbnQzMiBndGlkLCBrbXBfdGFza190ICogdGFzayApOworS01QX0VYUE9SVCB2b2lkCitfX2ttcGNfb21wX3Rhc2tfY29tcGxldGVfaWYwKCBpZGVudF90ICpsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tfdCAqdGFzayApOworS01QX0VYUE9SVCBrbXBfaW50MzIKK19fa21wY19vbXBfdGFza19wYXJ0cyggaWRlbnRfdCAqbG9jX3JlZiwga21wX2ludDMyIGd0aWQsIGttcF90YXNrX3QgKiBuZXdfdGFzayApOworS01QX0VYUE9SVCBrbXBfaW50MzIKK19fa21wY19vbXBfdGFza3dhaXQoIGlkZW50X3QgKmxvY19yZWYsIGttcF9pbnQzMiBndGlkICk7CisKK0tNUF9FWFBPUlQga21wX2ludDMyCitfX2ttcGNfb21wX3Rhc2t5aWVsZCggaWRlbnRfdCAqbG9jX3JlZiwga21wX2ludDMyIGd0aWQsIGludCBlbmRfcGFydCApOworCisjaWYgVEFTS19VTlVTRUQKK3ZvaWQgX19rbXBjX29tcF90YXNrX2JlZ2luKCBpZGVudF90ICpsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tfdCAqIHRhc2sgKTsKK3ZvaWQgX19rbXBjX29tcF90YXNrX2NvbXBsZXRlKCBpZGVudF90ICpsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tfdCAqdGFzayApOworI2VuZGlmIC8vIFRBU0tfVU5VU0VECisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgT01QXzQwX0VOQUJMRUQKKworS01QX0VYUE9SVCB2b2lkIF9fa21wY190YXNrZ3JvdXAoIGlkZW50X3QgKiBsb2MsIGludCBndGlkICk7CitLTVBfRVhQT1JUIHZvaWQgX19rbXBjX2VuZF90YXNrZ3JvdXAoIGlkZW50X3QgKiBsb2MsIGludCBndGlkICk7CisKK0tNUF9FWFBPUlQga21wX2ludDMyIF9fa21wY19vbXBfdGFza193aXRoX2RlcHMgKCBpZGVudF90ICpsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tfdCAqIG5ld190YXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBuZGVwcywga21wX2RlcGVuZF9pbmZvX3QgKmRlcF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBuZGVwc19ub2FsaWFzLCBrbXBfZGVwZW5kX2luZm9fdCAqbm9hbGlhc19kZXBfbGlzdCApOworS01QX0VYUE9SVCB2b2lkIF9fa21wY19vbXBfd2FpdF9kZXBzICggaWRlbnRfdCAqbG9jX3JlZiwga21wX2ludDMyIGd0aWQsIGttcF9pbnQzMiBuZGVwcywga21wX2RlcGVuZF9pbmZvX3QgKmRlcF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIG5kZXBzX25vYWxpYXMsIGttcF9kZXBlbmRfaW5mb190ICpub2FsaWFzX2RlcF9saXN0ICk7CitleHRlcm4gdm9pZCBfX2ttcF9yZWxlYXNlX2RlcHMgKCBrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tkYXRhX3QgKnRhc2sgKTsKKworZXh0ZXJuIGttcF9pbnQzMiBfX2ttcF9vbXBfdGFzaygga21wX2ludDMyIGd0aWQsIGttcF90YXNrX3QgKiBuZXdfdGFzaywgYm9vbCBzZXJpYWxpemVfaW1tZWRpYXRlICk7CisKK0tNUF9FWFBPUlQga21wX2ludDMyIF9fa21wY19jYW5jZWwoaWRlbnRfdCogbG9jX3JlZiwga21wX2ludDMyIGd0aWQsIGttcF9pbnQzMiBjbmNsX2tpbmQpOworS01QX0VYUE9SVCBrbXBfaW50MzIgX19rbXBjX2NhbmNlbGxhdGlvbnBvaW50KGlkZW50X3QqIGxvY19yZWYsIGttcF9pbnQzMiBndGlkLCBrbXBfaW50MzIgY25jbF9raW5kKTsKK0tNUF9FWFBPUlQga21wX2ludDMyIF9fa21wY19jYW5jZWxfYmFycmllcihpZGVudF90KiBsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCk7CitLTVBfRVhQT1JUIGludCBfX2ttcF9nZXRfY2FuY2VsbGF0aW9uX3N0YXR1cyhpbnQgY2FuY2VsX2tpbmQpOworCisjZW5kaWYKKworLyoKKyAqIExvY2sgaW50ZXJmYWNlIHJvdXRpbmVzIChmYXN0IHZlcnNpb25zIHdpdGggZ3RpZCBwYXNzZWQgaW4pCisgKi8KK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfaW5pdF9sb2NrKCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCAgdm9pZCAqKnVzZXJfbG9jayApOworS01QX0VYUE9SVCB2b2lkIF9fa21wY19pbml0X25lc3RfbG9jayggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwgdm9pZCAqKnVzZXJfbG9jayApOworS01QX0VYUE9SVCB2b2lkIF9fa21wY19kZXN0cm95X2xvY2soIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIHZvaWQgKip1c2VyX2xvY2sgKTsKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfZGVzdHJveV9uZXN0X2xvY2soIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIHZvaWQgKip1c2VyX2xvY2sgKTsKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfc2V0X2xvY2soIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIHZvaWQgKip1c2VyX2xvY2sgKTsKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfc2V0X25lc3RfbG9jayggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwgdm9pZCAqKnVzZXJfbG9jayApOworS01QX0VYUE9SVCB2b2lkIF9fa21wY191bnNldF9sb2NrKCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCB2b2lkICoqdXNlcl9sb2NrICk7CitLTVBfRVhQT1JUIHZvaWQgX19rbXBjX3Vuc2V0X25lc3RfbG9jayggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwgdm9pZCAqKnVzZXJfbG9jayApOworS01QX0VYUE9SVCBpbnQgX19rbXBjX3Rlc3RfbG9jayggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwgdm9pZCAqKnVzZXJfbG9jayApOworS01QX0VYUE9SVCBpbnQgX19rbXBjX3Rlc3RfbmVzdF9sb2NrKCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCB2b2lkICoqdXNlcl9sb2NrICk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogSW50ZXJmYWNlIHRvIGZhc3Qgc2NhbGFibGUgcmVkdWNlIG1ldGhvZHMgcm91dGluZXMKKyAqLworCitLTVBfRVhQT1JUIGttcF9pbnQzMiBfX2ttcGNfcmVkdWNlX25vd2FpdCggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgbnVtX3ZhcnMsIHNpemVfdCByZWR1Y2Vfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpyZWR1Y2VfZGF0YSwgdm9pZCAoKnJlZHVjZV9mdW5jKSh2b2lkICpsaHNfZGF0YSwgdm9pZCAqcmhzX2RhdGEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9jcml0aWNhbF9uYW1lICpsY2sgKTsKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfZW5kX3JlZHVjZV9ub3dhaXQoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQsIGttcF9jcml0aWNhbF9uYW1lICpsY2sgKTsKK0tNUF9FWFBPUlQga21wX2ludDMyIF9fa21wY19yZWR1Y2UoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgbnVtX3ZhcnMsIHNpemVfdCByZWR1Y2Vfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnJlZHVjZV9kYXRhLCB2b2lkICgqcmVkdWNlX2Z1bmMpKHZvaWQgKmxoc19kYXRhLCB2b2lkICpyaHNfZGF0YSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfY3JpdGljYWxfbmFtZSAqbGNrICk7CitLTVBfRVhQT1JUIHZvaWQgX19rbXBjX2VuZF9yZWR1Y2UoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQsIGttcF9jcml0aWNhbF9uYW1lICpsY2sgKTsKKworLyoKKyAqIGludGVybmFsIGZhc3QgcmVkdWN0aW9uIHJvdXRpbmVzCisgKi8KKworZXh0ZXJuIFBBQ0tFRF9SRURVQ1RJT05fTUVUSE9EX1QKK19fa21wX2RldGVybWluZV9yZWR1Y3Rpb25fbWV0aG9kKCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBudW1fdmFycywgc2l6ZV90IHJlZHVjZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnJlZHVjZV9kYXRhLCB2b2lkICgqcmVkdWNlX2Z1bmMpKHZvaWQgKmxoc19kYXRhLCB2b2lkICpyaHNfZGF0YSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2NyaXRpY2FsX25hbWUgKmxjayApOworCisvLyB0aGlzIGZ1bmN0aW9uIGlzIGZvciB0ZXN0aW5nIHNldC9nZXQvZGV0ZXJtaW5lIHJlZHVjZSBtZXRob2QKK0tNUF9FWFBPUlQga21wX2ludDMyIF9fa21wX2dldF9yZWR1Y2VfbWV0aG9kKCB2b2lkICk7CisKK0tNUF9FWFBPUlQga21wX3VpbnQ2NCBfX2ttcGNfZ2V0X3Rhc2tpZCgpOworS01QX0VYUE9SVCBrbXBfdWludDY0IF9fa21wY19nZXRfcGFyZW50X3Rhc2tpZCgpOworCitLTVBfRVhQT1JUIHZvaWQgX19rbXBjX3BsYWNlX3RocmVhZHMoaW50LGludCxpbnQpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvLyBDKysgcG9ydAorLy8gbWlzc2luZyAnZXh0ZXJuICJDIicgZGVjbGFyYXRpb25zCisKK0tNUF9FWFBPUlQga21wX2ludDMyIF9fa21wY19pbl9wYXJhbGxlbCggaWRlbnRfdCAqbG9jICk7CitLTVBfRVhQT1JUIHZvaWQgX19rbXBjX3BvcF9udW1fdGhyZWFkcyggIGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQgKTsKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfcHVzaF9udW1fdGhyZWFkcyggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wX2ludDMyIG51bV90aHJlYWRzICk7CisKKyNpZiBPTVBfNDBfRU5BQkxFRAorS01QX0VYUE9SVCB2b2lkIF9fa21wY19wdXNoX3Byb2NfYmluZCggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwgaW50IHByb2NfYmluZCApOworS01QX0VYUE9SVCB2b2lkIF9fa21wY19wdXNoX251bV90ZWFtcyggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wX2ludDMyIG51bV90ZWFtcywga21wX2ludDMyIG51bV90aHJlYWRzICk7CitLTVBfRVhQT1JUIHZvaWQgX19rbXBjX2ZvcmtfdGVhbXMoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgYXJnYywga21wY19taWNybyBtaWNyb3Rhc2ssIC4uLik7CisKKyNlbmRpZgorCitLTVBfRVhQT1JUIHZvaWQqCitfX2ttcGNfdGhyZWFkcHJpdmF0ZV9jYWNoZWQoIGlkZW50X3QgKiBsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICogZGF0YSwgc2l6ZV90IHNpemUsIHZvaWQgKioqIGNhY2hlICk7CisKKy8vIFN5bWJvbHMgZm9yIE1TIG11dHVhbCBkZXRlY3Rpb24uCitleHRlcm4gaW50IF9Zb3VfbXVzdF9saW5rX3dpdGhfZXhhY3RseV9vbmVfT3Blbk1QX2xpYnJhcnk7CitleHRlcm4gaW50IF9Zb3VfbXVzdF9saW5rX3dpdGhfSW50ZWxfT3Blbk1QX2xpYnJhcnk7CisjaWYgS01QX09TX1dJTkRPV1MgJiYgKCBLTVBfVkVSU0lPTl9NQUpPUiA+IDQgKQorICAgIGV4dGVybiBpbnQgX1lvdV9tdXN0X2xpbmtfd2l0aF9NaWNyb3NvZnRfT3Blbk1QX2xpYnJhcnk7CisjZW5kaWYKKworCisvLyBUaGUgcm91dGluZXMgYmVsb3cgYXJlIG5vdCBleHBvcnRlZC4KKy8vIENvbnNpZGVyIG1ha2luZyB0aGVtICdzdGF0aWMnIGluIGNvcnJlc3BvbmRpbmcgc291cmNlIGZpbGVzLgordm9pZAora21wX3RocmVhZHByaXZhdGVfaW5zZXJ0X3ByaXZhdGVfZGF0YSggaW50IGd0aWQsIHZvaWQgKnBjX2FkZHIsIHZvaWQgKmRhdGFfYWRkciwgc2l6ZV90IHBjX3NpemUgKTsKK3N0cnVjdCBwcml2YXRlX2NvbW1vbiAqCitrbXBfdGhyZWFkcHJpdmF0ZV9pbnNlcnQoIGludCBndGlkLCB2b2lkICpwY19hZGRyLCB2b2lkICpkYXRhX2FkZHIsIHNpemVfdCBwY19zaXplICk7CisKKy8vCisvLyBvbXBjXywga21wY18gZW50cmllcyBtb3ZlZCBmcm9tIG9tcC5oLgorLy8KKyNpZiBLTVBfT1NfV0lORE9XUworIyAgIGRlZmluZSBLTVBDX0NPTlZFTlRJT04gX19jZGVjbAorI2Vsc2UKKyMgICBkZWZpbmUgS01QQ19DT05WRU5USU9OCisjZW5kaWYKKworI2lmbmRlZiBfX09NUF9ICit0eXBlZGVmIGVudW0gb21wX3NjaGVkX3QgeworICAgIG9tcF9zY2hlZF9zdGF0aWMgID0gMSwKKyAgICBvbXBfc2NoZWRfZHluYW1pYyA9IDIsCisgICAgb21wX3NjaGVkX2d1aWRlZCAgPSAzLAorICAgIG9tcF9zY2hlZF9hdXRvICAgID0gNAorfSBvbXBfc2NoZWRfdDsKK3R5cGVkZWYgdm9pZCAqIGttcF9hZmZpbml0eV9tYXNrX3Q7CisjZW5kaWYKKworS01QX0VYUE9SVCB2b2lkIEtNUENfQ09OVkVOVElPTiBvbXBjX3NldF9tYXhfYWN0aXZlX2xldmVscyhpbnQpOworS01QX0VYUE9SVCB2b2lkIEtNUENfQ09OVkVOVElPTiBvbXBjX3NldF9zY2hlZHVsZShvbXBfc2NoZWRfdCwgaW50KTsKK0tNUF9FWFBPUlQgaW50ICBLTVBDX0NPTlZFTlRJT04gb21wY19nZXRfYW5jZXN0b3JfdGhyZWFkX251bShpbnQpOworS01QX0VYUE9SVCBpbnQgIEtNUENfQ09OVkVOVElPTiBvbXBjX2dldF90ZWFtX3NpemUoaW50KTsKK0tNUF9FWFBPUlQgaW50ICBLTVBDX0NPTlZFTlRJT04ga21wY19zZXRfYWZmaW5pdHlfbWFza19wcm9jKGludCwga21wX2FmZmluaXR5X21hc2tfdCAqKTsKK0tNUF9FWFBPUlQgaW50ICBLTVBDX0NPTlZFTlRJT04ga21wY191bnNldF9hZmZpbml0eV9tYXNrX3Byb2MoaW50LCBrbXBfYWZmaW5pdHlfbWFza190ICopOworS01QX0VYUE9SVCBpbnQgIEtNUENfQ09OVkVOVElPTiBrbXBjX2dldF9hZmZpbml0eV9tYXNrX3Byb2MoaW50LCBrbXBfYWZmaW5pdHlfbWFza190ICopOworCitLTVBfRVhQT1JUIHZvaWQgS01QQ19DT05WRU5USU9OIGttcGNfc2V0X3N0YWNrc2l6ZShpbnQpOworS01QX0VYUE9SVCB2b2lkIEtNUENfQ09OVkVOVElPTiBrbXBjX3NldF9zdGFja3NpemVfcyhzaXplX3QpOworS01QX0VYUE9SVCB2b2lkIEtNUENfQ09OVkVOVElPTiBrbXBjX3NldF9saWJyYXJ5KGludCk7CitLTVBfRVhQT1JUIHZvaWQgS01QQ19DT05WRU5USU9OIGttcGNfc2V0X2RlZmF1bHRzKGNoYXIgY29uc3QgKik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBLTVBfSCAqLworCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfYWZmaW5pdHkuY3BwIGIvZmluYWwvcnVudGltZS9zcmMva21wX2FmZmluaXR5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTMzOGMyCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX2FmZmluaXR5LmNwcApAQCAtMCwwICsxLDQ2NjkgQEAKKy8qCisgKiBrbXBfYWZmaW5pdHkuY3BwIC0tIGFmZmluaXR5IG1hbmFnZW1lbnQKKyAqICRSZXZpc2lvbjogNDM0NzMgJAorICogJERhdGU6IDIwMTQtMDktMjYgMTU6MDI6NTcgLTA1MDAgKEZyaSwgMjYgU2VwIDIwMTQpICQKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgImttcC5oIgorI2luY2x1ZGUgImttcF9pMThuLmgiCisjaW5jbHVkZSAia21wX2lvLmgiCisjaW5jbHVkZSAia21wX3N0ci5oIgorI2luY2x1ZGUgImttcF93cmFwcGVyX2dldHBpZC5oIgorCisjaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorCisvLworLy8gUHJpbnQgdGhlIGFmZmluaXR5IG1hc2sgdG8gdGhlIGNoYXJhY3RlciBhcnJheSBpbiBhIHByZXR0eSBmb3JtYXQuCisvLworY2hhciAqCitfX2ttcF9hZmZpbml0eV9wcmludF9tYXNrKGNoYXIgKmJ1ZiwgaW50IGJ1Zl9sZW4sIGttcF9hZmZpbl9tYXNrX3QgKm1hc2spCit7CisgICAgS01QX0FTU0VSVChidWZfbGVuID49IDQwKTsKKyAgICBjaGFyICpzY2FuID0gYnVmOworICAgIGNoYXIgKmVuZCA9IGJ1ZiArIGJ1Zl9sZW4gLSAxOworCisgICAgLy8KKyAgICAvLyBGaW5kIGZpcnN0IGVsZW1lbnQgLyBjaGVjayBmb3IgZW1wdHkgc2V0LgorICAgIC8vCisgICAgc2l6ZV90IGk7CisgICAgZm9yIChpID0gMDsgaSA8IEtNUF9DUFVfU0VUU0laRTsgaSsrKSB7CisgICAgICAgIGlmIChLTVBfQ1BVX0lTU0VUKGksIG1hc2spKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoaSA9PSBLTVBfQ1BVX1NFVFNJWkUpIHsKKyAgICAgICAgc3ByaW50ZihzY2FuLCAiezxlbXB0eT59Iik7CisgICAgICAgIHdoaWxlICgqc2NhbiAhPSAnXDAnKSBzY2FuKys7CisgICAgICAgIEtNUF9BU1NFUlQoc2NhbiA8PSBlbmQpOworICAgICAgICByZXR1cm4gYnVmOworICAgIH0KKworICAgIHNwcmludGYoc2NhbiwgInslbGQiLCAobG9uZylpKTsKKyAgICB3aGlsZSAoKnNjYW4gIT0gJ1wwJykgc2NhbisrOworICAgIGkrKzsKKyAgICBmb3IgKDsgaSA8IEtNUF9DUFVfU0VUU0laRTsgaSsrKSB7CisgICAgICAgIGlmICghIEtNUF9DUFVfSVNTRVQoaSwgbWFzaykpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gQ2hlY2sgZm9yIGJ1ZmZlciBvdmVyZmxvdy4gIEEgc3RyaW5nIG9mIHRoZSBmb3JtICIsPG4+IiB3aWxsIGhhdmUKKyAgICAgICAgLy8gYXQgbW9zdCAxMCBjaGFyYWN0ZXJzLCBwbHVzIHdlIHdhbnQgdG8gbGVhdmUgcm9vbSB0byBwcmludCAiLC4uLn0iCisgICAgICAgIC8vIGlmIHRoZSBzZXQgaXMgdG9vIGxhcmdlIHRvIHByaW50IGZvciBhIHRvdGFsIG9mIDE1IGNoYXJhY3RlcnMuCisgICAgICAgIC8vIFdlIGFscmVhZHkgbGVmdCByb29tIGZvciAnXDAnIGluIHNldHRpbmcgZW5kLgorICAgICAgICAvLworICAgICAgICBpZiAoZW5kIC0gc2NhbiA8IDE1KSB7CisgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHNwcmludGYoc2NhbiwgIiwlLWxkIiwgKGxvbmcpaSk7CisgICAgICAgIHdoaWxlICgqc2NhbiAhPSAnXDAnKSBzY2FuKys7CisgICAgfQorICAgIGlmIChpIDwgS01QX0NQVV9TRVRTSVpFKSB7CisgICAgICAgIHNwcmludGYoc2NhbiwgIiwuLi4iKTsKKyAgICAgICAgd2hpbGUgKCpzY2FuICE9ICdcMCcpIHNjYW4rKzsKKyAgICB9CisgICAgc3ByaW50ZihzY2FuLCAifSIpOworICAgIHdoaWxlICgqc2NhbiAhPSAnXDAnKSBzY2FuKys7CisgICAgS01QX0FTU0VSVChzY2FuIDw9IGVuZCk7CisgICAgcmV0dXJuIGJ1ZjsKK30KKworCit2b2lkCitfX2ttcF9hZmZpbml0eV9lbnRpcmVfbWFjaGluZV9tYXNrKGttcF9hZmZpbl9tYXNrX3QgKm1hc2spCit7CisgICAgS01QX0NQVV9aRVJPKG1hc2spOworCisjIGlmIEtNUF9PU19XSU5ET1dTICYmIEtNUF9BUkNIX1g4Nl82NAorCisgICAgaWYgKF9fa21wX251bV9wcm9jX2dyb3VwcyA+IDEpIHsKKyAgICAgICAgaW50IGdyb3VwOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKF9fa21wX0dldEFjdGl2ZVByb2Nlc3NvckNvdW50ICE9IE5VTEwpOworICAgICAgICBmb3IgKGdyb3VwID0gMDsgZ3JvdXAgPCBfX2ttcF9udW1fcHJvY19ncm91cHM7IGdyb3VwKyspIHsKKyAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgaW50IG51bSA9IF9fa21wX0dldEFjdGl2ZVByb2Nlc3NvckNvdW50KGdyb3VwKTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgeworICAgICAgICAgICAgICAgIEtNUF9DUFVfU0VUKGkgKyBncm91cCAqIChDSEFSX0JJVCAqIHNpemVvZihEV09SRF9QVFIpKSwgbWFzayk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorCisjIGVuZGlmIC8qIEtNUF9PU19XSU5ET1dTICYmIEtNUF9BUkNIX1g4Nl82NCAqLworCisgICAgeworICAgICAgICBpbnQgcHJvYzsKKyAgICAgICAgZm9yIChwcm9jID0gMDsgcHJvYyA8IF9fa21wX3hwcm9jOyBwcm9jKyspIHsKKyAgICAgICAgICAgIEtNUF9DUFVfU0VUKHByb2MsIG1hc2spOworICAgICAgICB9CisgICAgfQorfQorCisKKy8vCisvLyBJbiBMaW51eCogT1MgZGVidWcgJiBjb3ZlciAoLU8wKSBidWlsZHMsIHdlIG5lZWQgdG8gYXZvaWQgaW5saW5lIG1lbWJlcgorLy8gZnVuY3Rpb25zLgorLy8KKy8vIFRoZSBpY2MgY29kZWdlbiBlbWl0cyBzZWN0aW9ucyB3aXRoIGV4dHJlbWVseSBsb25nIG5hbWVzLCBvZiB0aGUgZm9ybQorLy8gIi5nbnUubGlua29uY2UuPG1hbmdsZWRfbmFtZT4iLiAgVGhlcmUgc2VlbXMgdG8gaGF2ZSBiZWVuIGEgbGlua2VyIGJ1ZworLy8gaW50cm9kdWNlZCBiZXR3ZWVuIEdOVSBsZCB2ZXJzaW9uIDIuMTQuOTAuMC40IGFuZCAyLjE1LjkyLjAuMiBpbnZvbHZpbmcKKy8vIHNvbWUgc29ydCBvZiBtZW1vcnkgY29ycnVwdGlvbiBvciB0YWJsZSBvdmVyZmxvdyB0aGF0IGlzIHRyaWdnZXJlZCBieQorLy8gdGhlc2UgbG9uZyBzdHJpbmdzLiAgSSBjaGVja2VkIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGUgbGlua2VyIC0KKy8vIEdOVSBsZCAoTGludXgqIE9TL0dOVSBCaW51dGlscykgMi4xOC41MC4wLjcuMjAwODA0MjIgLSBhbmQgdGhlIGJ1ZyBpcyBub3QKKy8vIGZpeGVkLgorLy8KKy8vIFVuZm9ydHVuYXRlbHksIG15IGF0dGVtcHRzIHRvIHJlcHJvZHVjZSBpdCBpbiBhIHNtYWxsZXIgZXhhbXBsZSBoYXZlCisvLyBmYWlsZWQgLSBJJ20gbm90IHN1cmUgd2hhdCB0aGUgcHJvc3BlY3RzIGFyZSBvZiBnZXR0aW5nIGl0IGZpeGVkCisvLyBwcm9wZXJseSAtIGJ1dCB3ZSBuZWVkIGEgcmVwcm9kdWNlciBzbWFsbGVyIHRoYW4gYWxsIG9mIGxpYmlvbXAuCisvLworLy8gV29yayBhcm91bmQgdGhlIHByb2JsZW0gYnkgYXZvaWRpbmcgaW5saW5lIGNvbnN0cnVjdG9ycyBpbiBzdWNoIGJ1aWxkcy4KKy8vIFdlIGRvIHRoaXMgZm9yIGFsbCBwbGF0Zm9ybXMsIG5vdCBqdXN0IExpbnV4KiBPUyAtIG5vbi1pbmxpbmUgZnVuY3Rpb25zIGFyZQorLy8gbW9yZSBkZWJ1Z2dhYmxlIGFuZCBwcm92aWRlIGJldHRlciBjb3ZlcmFnZSBpbnRvIHRoYW4gaW5saW5lIGZ1bmN0aW9ucy4KKy8vIFVzZSBpbmxpbmUgZnVuY3Rpb25zIGluIHNoaXBwaW5nIGxpYnMsIGZvciBwZXJmb3JtYW5jZS4KKy8vCisKKyMgaWYgIWRlZmluZWQoS01QX0RFQlVHKSAmJiAhZGVmaW5lZChDT1ZFUikKKworY2xhc3MgQWRkcmVzcyB7CitwdWJsaWM6CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIG1heERlcHRoID0gMzI7CisgICAgdW5zaWduZWQgbGFiZWxzW21heERlcHRoXTsKKyAgICB1bnNpZ25lZCBjaGlsZE51bXNbbWF4RGVwdGhdOworICAgIHVuc2lnbmVkIGRlcHRoOworICAgIHVuc2lnbmVkIGxlYWRlcjsKKyAgICBBZGRyZXNzKHVuc2lnbmVkIF9kZXB0aCkKKyAgICAgIDogZGVwdGgoX2RlcHRoKSwgbGVhZGVyKEZBTFNFKSB7CisgICAgfQorICAgIEFkZHJlc3MgJm9wZXJhdG9yPShjb25zdCBBZGRyZXNzICZiKSB7CisgICAgICAgIGRlcHRoID0gYi5kZXB0aDsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGRlcHRoOyBpKyspIHsKKyAgICAgICAgICAgIGxhYmVsc1tpXSA9IGIubGFiZWxzW2ldOworICAgICAgICAgICAgY2hpbGROdW1zW2ldID0gYi5jaGlsZE51bXNbaV07CisgICAgICAgIH0KKyAgICAgICAgbGVhZGVyID0gRkFMU0U7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEFkZHJlc3MgJmIpIGNvbnN0IHsKKyAgICAgICAgaWYgKGRlcHRoICE9IGIuZGVwdGgpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBkZXB0aDsgaSsrKQorICAgICAgICAgICAgaWYobGFiZWxzW2ldICE9IGIubGFiZWxzW2ldKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGJvb2wgaXNDbG9zZShjb25zdCBBZGRyZXNzICZiLCBpbnQgbGV2ZWwpIGNvbnN0IHsKKyAgICAgICAgaWYgKGRlcHRoICE9IGIuZGVwdGgpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICgodW5zaWduZWQpbGV2ZWwgPj0gZGVwdGgpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IChkZXB0aCAtIGxldmVsKTsgaSsrKQorICAgICAgICAgICAgaWYobGFiZWxzW2ldICE9IGIubGFiZWxzW2ldKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBBZGRyZXNzICZiKSBjb25zdCB7CisgICAgICAgIHJldHVybiAhb3BlcmF0b3I9PShiKTsKKyAgICB9Cit9OworCitjbGFzcyBBZGRyVW5zUGFpciB7CitwdWJsaWM6CisgICAgQWRkcmVzcyBmaXJzdDsKKyAgICB1bnNpZ25lZCBzZWNvbmQ7CisgICAgQWRkclVuc1BhaXIoQWRkcmVzcyBfZmlyc3QsIHVuc2lnbmVkIF9zZWNvbmQpCisgICAgICA6IGZpcnN0KF9maXJzdCksIHNlY29uZChfc2Vjb25kKSB7CisgICAgfQorICAgIEFkZHJVbnNQYWlyICZvcGVyYXRvcj0oY29uc3QgQWRkclVuc1BhaXIgJmIpCisgICAgeworICAgICAgICBmaXJzdCA9IGIuZmlyc3Q7CisgICAgICAgIHNlY29uZCA9IGIuc2Vjb25kOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorfTsKKworIyBlbHNlCisKK2NsYXNzIEFkZHJlc3MgeworcHVibGljOgorICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBtYXhEZXB0aCA9IDMyOworICAgIHVuc2lnbmVkIGxhYmVsc1ttYXhEZXB0aF07CisgICAgdW5zaWduZWQgY2hpbGROdW1zW21heERlcHRoXTsKKyAgICB1bnNpZ25lZCBkZXB0aDsKKyAgICB1bnNpZ25lZCBsZWFkZXI7CisgICAgQWRkcmVzcyh1bnNpZ25lZCBfZGVwdGgpOworICAgIEFkZHJlc3MgJm9wZXJhdG9yPShjb25zdCBBZGRyZXNzICZiKTsKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgQWRkcmVzcyAmYikgY29uc3Q7CisgICAgYm9vbCBpc0Nsb3NlKGNvbnN0IEFkZHJlc3MgJmIsIGludCBsZXZlbCkgY29uc3Q7CisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEFkZHJlc3MgJmIpIGNvbnN0OworfTsKKworQWRkcmVzczo6QWRkcmVzcyh1bnNpZ25lZCBfZGVwdGgpCit7CisgICAgZGVwdGggPSBfZGVwdGg7CisgICAgbGVhZGVyID0gRkFMU0U7Cit9CisKK0FkZHJlc3MgJkFkZHJlc3M6Om9wZXJhdG9yPShjb25zdCBBZGRyZXNzICZiKSB7CisgICAgZGVwdGggPSBiLmRlcHRoOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBkZXB0aDsgaSsrKSB7CisgICAgICAgIGxhYmVsc1tpXSA9IGIubGFiZWxzW2ldOworICAgICAgICBjaGlsZE51bXNbaV0gPSBiLmNoaWxkTnVtc1tpXTsKKyAgICB9CisgICAgbGVhZGVyID0gRkFMU0U7CisgICAgcmV0dXJuICp0aGlzOworfQorCitib29sIEFkZHJlc3M6Om9wZXJhdG9yPT0oY29uc3QgQWRkcmVzcyAmYikgY29uc3QgeworICAgIGlmIChkZXB0aCAhPSBiLmRlcHRoKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGRlcHRoOyBpKyspCisgICAgICAgIGlmKGxhYmVsc1tpXSAhPSBiLmxhYmVsc1tpXSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBBZGRyZXNzOjppc0Nsb3NlKGNvbnN0IEFkZHJlc3MgJmIsIGludCBsZXZlbCkgY29uc3QgeworICAgIGlmIChkZXB0aCAhPSBiLmRlcHRoKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKCh1bnNpZ25lZClsZXZlbCA+PSBkZXB0aCkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IChkZXB0aCAtIGxldmVsKTsgaSsrKQorICAgICAgICBpZihsYWJlbHNbaV0gIT0gYi5sYWJlbHNbaV0pCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQWRkcmVzczo6b3BlcmF0b3IhPShjb25zdCBBZGRyZXNzICZiKSBjb25zdCB7CisgICAgcmV0dXJuICFvcGVyYXRvcj09KGIpOworfQorCitjbGFzcyBBZGRyVW5zUGFpciB7CitwdWJsaWM6CisgICAgQWRkcmVzcyBmaXJzdDsKKyAgICB1bnNpZ25lZCBzZWNvbmQ7CisgICAgQWRkclVuc1BhaXIoQWRkcmVzcyBfZmlyc3QsIHVuc2lnbmVkIF9zZWNvbmQpOworICAgIEFkZHJVbnNQYWlyICZvcGVyYXRvcj0oY29uc3QgQWRkclVuc1BhaXIgJmIpOworfTsKKworQWRkclVuc1BhaXI6OkFkZHJVbnNQYWlyKEFkZHJlc3MgX2ZpcnN0LCB1bnNpZ25lZCBfc2Vjb25kKQorICA6IGZpcnN0KF9maXJzdCksIHNlY29uZChfc2Vjb25kKQoreworfQorCitBZGRyVW5zUGFpciAmQWRkclVuc1BhaXI6Om9wZXJhdG9yPShjb25zdCBBZGRyVW5zUGFpciAmYikKK3sKKyAgICBmaXJzdCA9IGIuZmlyc3Q7CisgICAgc2Vjb25kID0gYi5zZWNvbmQ7CisgICAgcmV0dXJuICp0aGlzOworfQorCisjIGVuZGlmIC8qICFkZWZpbmVkKEtNUF9ERUJVRykgJiYgIWRlZmluZWQoQ09WRVIpICovCisKKworc3RhdGljIGludAorX19rbXBfYWZmaW5pdHlfY21wX0FkZHJlc3NfbGFiZWxzKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCit7CisgICAgY29uc3QgQWRkcmVzcyAqYWEgPSAoY29uc3QgQWRkcmVzcyAqKSYoKChBZGRyVW5zUGFpciAqKWEpCisgICAgICAtPmZpcnN0KTsKKyAgICBjb25zdCBBZGRyZXNzICpiYiA9IChjb25zdCBBZGRyZXNzICopJigoKEFkZHJVbnNQYWlyICopYikKKyAgICAgIC0+Zmlyc3QpOworICAgIHVuc2lnbmVkIGRlcHRoID0gYWEtPmRlcHRoOworICAgIHVuc2lnbmVkIGk7CisgICAgS01QX0RFQlVHX0FTU0VSVChkZXB0aCA9PSBiYi0+ZGVwdGgpOworICAgIGZvciAoaSAgPSAwOyBpIDwgZGVwdGg7IGkrKykgeworICAgICAgICBpZiAoYWEtPmxhYmVsc1tpXSA8IGJiLT5sYWJlbHNbaV0pIHJldHVybiAtMTsKKyAgICAgICAgaWYgKGFhLT5sYWJlbHNbaV0gPiBiYi0+bGFiZWxzW2ldKSByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludAorX19rbXBfYWZmaW5pdHlfY21wX0FkZHJlc3NfY2hpbGRfbnVtKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCit7CisgICAgY29uc3QgQWRkcmVzcyAqYWEgPSAoY29uc3QgQWRkcmVzcyAqKSYoKChBZGRyVW5zUGFpciAqKWEpCisgICAgICAtPmZpcnN0KTsKKyAgICBjb25zdCBBZGRyZXNzICpiYiA9IChjb25zdCBBZGRyZXNzICopJigoKEFkZHJVbnNQYWlyICopYikKKyAgICAgIC0+Zmlyc3QpOworICAgIHVuc2lnbmVkIGRlcHRoID0gYWEtPmRlcHRoOworICAgIHVuc2lnbmVkIGk7CisgICAgS01QX0RFQlVHX0FTU0VSVChkZXB0aCA9PSBiYi0+ZGVwdGgpOworICAgIEtNUF9ERUJVR19BU1NFUlQoKHVuc2lnbmVkKV9fa21wX2FmZmluaXR5X2NvbXBhY3QgPD0gZGVwdGgpOworICAgIEtNUF9ERUJVR19BU1NFUlQoX19rbXBfYWZmaW5pdHlfY29tcGFjdCA+PSAwKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgKHVuc2lnbmVkKV9fa21wX2FmZmluaXR5X2NvbXBhY3Q7IGkrKykgeworICAgICAgICBpbnQgaiA9IGRlcHRoIC0gaSAtIDE7CisgICAgICAgIGlmIChhYS0+Y2hpbGROdW1zW2pdIDwgYmItPmNoaWxkTnVtc1tqXSkgcmV0dXJuIC0xOworICAgICAgICBpZiAoYWEtPmNoaWxkTnVtc1tqXSA+IGJiLT5jaGlsZE51bXNbal0pIHJldHVybiAxOworICAgIH0KKyAgICBmb3IgKDsgaSA8IGRlcHRoOyBpKyspIHsKKyAgICAgICAgaW50IGogPSBpIC0gX19rbXBfYWZmaW5pdHlfY29tcGFjdDsKKyAgICAgICAgaWYgKGFhLT5jaGlsZE51bXNbal0gPCBiYi0+Y2hpbGROdW1zW2pdKSByZXR1cm4gLTE7CisgICAgICAgIGlmIChhYS0+Y2hpbGROdW1zW2pdID4gYmItPmNoaWxkTnVtc1tqXSkgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKiogQSBzdHJ1Y3R1cmUgZm9yIGhvbGRpbmcgbWFjaGluZS1zcGVjaWZpYyBoaWVyYXJjaHkgaW5mbyB0byBiZSBjb21wdXRlZCBvbmNlIGF0IGluaXQuICovCitjbGFzcyBoaWVyYXJjaHlfaW5mbyB7CitwdWJsaWM6CisgICAgLyoqIFR5cGljYWwgbGV2ZWxzIGFyZSB0aHJlYWRzL2NvcmUsIGNvcmVzL3BhY2thZ2Ugb3Igc29ja2V0LCBwYWNrYWdlcy9ub2RlLCBub2Rlcy9tYWNoaW5lLAorICAgICAgICBldGMuICBXZSBkb24ndCB3YW50IHRvIGdldCBzcGVjaWZpYyB3aXRoIG5vbWVuY2xhdHVyZSAqLworICAgIHN0YXRpYyBjb25zdCBrbXBfdWludDMyIG1heExldmVscz03OworCisgICAgLyoqIFRoaXMgaXMgc3BlY2lmaWNhbGx5IHRoZSBkZXB0aCBvZiB0aGUgbWFjaGluZSBjb25maWd1cmF0aW9uIGhpZXJhcmNoeSwgaW4gdGVybXMgb2YgdGhlCisgICAgICAgIG51bWJlciBvZiBsZXZlbHMgYWxvbmcgdGhlIGxvbmdlc3QgcGF0aCBmcm9tIHJvb3QgdG8gYW55IGxlYWYuIEl0IGNvcnJlc3BvbmRzIHRvIHRoZQorICAgICAgICBudW1iZXIgb2YgZW50cmllcyBpbiBudW1QZXJMZXZlbCBpZiB3ZSBleGNsdWRlIGFsbCBidXQgb25lIHRyYWlsaW5nIDEuICovCisgICAga21wX3VpbnQzMiBkZXB0aDsKKyAgICBrbXBfdWludDMyIGJhc2VfZGVwdGg7CisgICAga21wX3VpbnQzMiBiYXNlX251bV90aHJlYWRzOworICAgIGJvb2wgdW5pbml0aWFsaXplZDsKKworICAgIC8qKiBMZXZlbCAwIGNvcnJlc3BvbmRzIHRvIGxlYXZlcy4gbnVtUGVyTGV2ZWxbaV0gaXMgdGhlIG51bWJlciBvZiBjaGlsZHJlbiB0aGUgcGFyZW50IG9mIGEKKyAgICAgICAgbm9kZSBhdCBsZXZlbCBpIGhhcy4gRm9yIGV4YW1wbGUsIGlmIHdlIGhhdmUgYSBtYWNoaW5lIHdpdGggNCBwYWNrYWdlcywgNCBjb3Jlcy9wYWNrYWdlCisgICAgICAgIGFuZCAyIEhUIHBlciBjb3JlLCB0aGVuIG51bVBlckxldmVsID0gezIsIDQsIDQsIDEsIDF9LiBBbGwgZW1wdHkgbGV2ZWxzIGFyZSBzZXQgdG8gMS4gKi8KKyAgICBrbXBfdWludDMyIG51bVBlckxldmVsW21heExldmVsc107CisgICAga21wX3VpbnQzMiBza2lwUGVyTGV2ZWxbbWF4TGV2ZWxzXTsKKworICAgIHZvaWQgZGVyaXZlTGV2ZWxzKEFkZHJVbnNQYWlyICphZHIyb3MsIGludCBudW1fYWRkcnMpIHsKKyAgICAgICAgaW50IGhpZXJfZGVwdGggPSBhZHIyb3NbMF0uZmlyc3QuZGVwdGg7CisgICAgICAgIGludCBsZXZlbCA9IDA7CisgICAgICAgIGZvciAoaW50IGk9aGllcl9kZXB0aC0xOyBpPj0wOyAtLWkpIHsKKyAgICAgICAgICAgIGludCBtYXggPSAtMTsKKyAgICAgICAgICAgIGZvciAoaW50IGo9MDsgajxudW1fYWRkcnM7ICsraikgeworICAgICAgICAgICAgICAgIGludCBuZXh0ID0gYWRyMm9zW2pdLmZpcnN0LmNoaWxkTnVtc1tpXTsKKyAgICAgICAgICAgICAgICBpZiAobmV4dCA+IG1heCkgbWF4ID0gbmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG51bVBlckxldmVsW2xldmVsXSA9IG1heCsxOworICAgICAgICAgICAgKytsZXZlbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGhpZXJhcmNoeV9pbmZvKCkgOiBkZXB0aCgxKSwgdW5pbml0aWFsaXplZCh0cnVlKSB7fQorICAgIHZvaWQgaW5pdChBZGRyVW5zUGFpciAqYWRyMm9zLCBpbnQgbnVtX2FkZHJzKQorICAgIHsKKyAgICAgICAgdW5pbml0aWFsaXplZCA9IGZhbHNlOworICAgICAgICBmb3IgKGttcF91aW50MzIgaT0wOyBpPG1heExldmVsczsgKytpKSB7IC8vIGluaXQgbnVtUGVyTGV2ZWxbKl0gdG8gMSBpdGVtIHBlciBsZXZlbAorICAgICAgICAgICAgbnVtUGVyTGV2ZWxbaV0gPSAxOworICAgICAgICAgICAgc2tpcFBlckxldmVsW2ldID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFNvcnQgdGFibGUgYnkgcGh5c2ljYWwgSUQKKyAgICAgICAgaWYgKGFkcjJvcykgeworICAgICAgICAgICAgcXNvcnQoYWRyMm9zLCBudW1fYWRkcnMsIHNpemVvZigqYWRyMm9zKSwgX19rbXBfYWZmaW5pdHlfY21wX0FkZHJlc3NfbGFiZWxzKTsKKyAgICAgICAgICAgIGRlcml2ZUxldmVscyhhZHIyb3MsIG51bV9hZGRycyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBudW1QZXJMZXZlbFswXSA9IDQ7CisgICAgICAgICAgICBudW1QZXJMZXZlbFsxXSA9IG51bV9hZGRycy80OworICAgICAgICAgICAgaWYgKG51bV9hZGRycyU0KSBudW1QZXJMZXZlbFsxXSsrOworICAgICAgICB9CisKKyAgICAgICAgYmFzZV9udW1fdGhyZWFkcyA9IG51bV9hZGRyczsKKyAgICAgICAgZm9yIChpbnQgaT1tYXhMZXZlbHMtMTsgaT49MDsgLS1pKSAvLyBjb3VudCBub24tZW1wdHkgbGV2ZWxzIHRvIGdldCBkZXB0aAorICAgICAgICAgICAgaWYgKG51bVBlckxldmVsW2ldICE9IDEgfHwgZGVwdGggPiAxKSAvLyBvbmx5IGNvdW50IG9uZSB0b3AtbGV2ZWwgJzEnCisgICAgICAgICAgICAgICAgZGVwdGgrKzsKKworICAgICAgICBrbXBfdWludDMyIGJyYW5jaCA9IDQ7CisgICAgICAgIGlmIChudW1QZXJMZXZlbFswXSA9PSAxKSBicmFuY2ggPSBudW1fYWRkcnMvNDsKKyAgICAgICAgaWYgKGJyYW5jaDw0KSBicmFuY2g9NDsKKyAgICAgICAgZm9yIChrbXBfdWludDMyIGQ9MDsgZDxkZXB0aC0xOyArK2QpIHsgLy8gb3B0aW1pemUgaGllcmFyY2h5IHdpZHRoCisgICAgICAgICAgICB3aGlsZSAobnVtUGVyTGV2ZWxbZF0gPiBicmFuY2ggfHwgKGQ9PTAgJiYgbnVtUGVyTGV2ZWxbZF0+NCkpIHsgLy8gbWF4IDQgb24gbGV2ZWwgMCEKKyAgICAgICAgICAgICAgICBpZiAobnVtUGVyTGV2ZWxbZF0gJiAxKSBudW1QZXJMZXZlbFtkXSsrOworICAgICAgICAgICAgICAgIG51bVBlckxldmVsW2RdID0gbnVtUGVyTGV2ZWxbZF0gPj4gMTsKKyAgICAgICAgICAgICAgICBpZiAobnVtUGVyTGV2ZWxbZCsxXSA9PSAxKSBkZXB0aCsrOworICAgICAgICAgICAgICAgIG51bVBlckxldmVsW2QrMV0gPSBudW1QZXJMZXZlbFtkKzFdIDw8IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihudW1QZXJMZXZlbFswXSA9PSAxKSB7CisgICAgICAgICAgICAgICAgYnJhbmNoID0gYnJhbmNoID4+IDE7CisgICAgICAgICAgICAgICAgaWYgKGJyYW5jaDw0KSBicmFuY2ggPSA0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChrbXBfdWludDMyIGk9MTsgaTxkZXB0aDsgKytpKQorICAgICAgICAgICAgc2tpcFBlckxldmVsW2ldID0gbnVtUGVyTGV2ZWxbaS0xXSAqIHNraXBQZXJMZXZlbFtpLTFdOworCisgICAgICAgIGJhc2VfZGVwdGggPSBkZXB0aDsKKyAgICB9Cit9OworCitzdGF0aWMgaGllcmFyY2h5X2luZm8gbWFjaGluZV9oaWVyYXJjaHk7CisKK3ZvaWQgX19rbXBfZ2V0X2hpZXJhcmNoeShrbXBfdWludDMyIG5wcm9jLCBrbXBfYnN0YXRlX3QgKnRocl9iYXIpIHsKKyAgICBpZiAobWFjaGluZV9oaWVyYXJjaHkudW5pbml0aWFsaXplZCkKKyAgICAgICAgbWFjaGluZV9oaWVyYXJjaHkuaW5pdChOVUxMLCBucHJvYyk7CisKKyAgICBpZiAobnByb2MgPD0gbWFjaGluZV9oaWVyYXJjaHkuYmFzZV9udW1fdGhyZWFkcykKKyAgICAgICAgbWFjaGluZV9oaWVyYXJjaHkuZGVwdGggPSBtYWNoaW5lX2hpZXJhcmNoeS5iYXNlX2RlcHRoOworICAgIEtNUF9ERUJVR19BU1NFUlQobWFjaGluZV9oaWVyYXJjaHkuZGVwdGggPiAwKTsKKyAgICB3aGlsZSAobnByb2MgPiBtYWNoaW5lX2hpZXJhcmNoeS5za2lwUGVyTGV2ZWxbbWFjaGluZV9oaWVyYXJjaHkuZGVwdGgtMV0pIHsKKyAgICAgICAgbWFjaGluZV9oaWVyYXJjaHkuZGVwdGgrKzsKKyAgICAgICAgbWFjaGluZV9oaWVyYXJjaHkuc2tpcFBlckxldmVsW21hY2hpbmVfaGllcmFyY2h5LmRlcHRoLTFdID0gMiptYWNoaW5lX2hpZXJhcmNoeS5za2lwUGVyTGV2ZWxbbWFjaGluZV9oaWVyYXJjaHkuZGVwdGgtMl07CisgICAgfQorICAgIHRocl9iYXItPmRlcHRoID0gbWFjaGluZV9oaWVyYXJjaHkuZGVwdGg7CisgICAgdGhyX2Jhci0+YmFzZV9sZWFmX2tpZHMgPSAoa21wX3VpbnQ4KW1hY2hpbmVfaGllcmFyY2h5Lm51bVBlckxldmVsWzBdLTE7CisgICAgdGhyX2Jhci0+c2tpcF9wZXJfbGV2ZWwgPSBtYWNoaW5lX2hpZXJhcmNoeS5za2lwUGVyTGV2ZWw7Cit9CisKKy8vCisvLyBXaGVuIHNvcnRpbmcgYnkgbGFiZWxzLCBfX2ttcF9hZmZpbml0eV9hc3NpZ25fY2hpbGRfbnVtcygpIG11c3QgZmlyc3QgYmUKKy8vIGNhbGxlZCB0byByZW51bWJlciB0aGUgbGFiZWxzIGZyb20gWzAuLm5dIGFuZCBwbGFjZSB0aGVtIGludG8gdGhlIGNoaWxkX251bQorLy8gdmVjdG9yIG9mIHRoZSBhZGRyZXNzIG9iamVjdC4gIFRoaXMgaXMgZG9uZSBpbiBjYXNlIHRoZSBsYWJlbHMgdXNlZCBmb3IKKy8vIHRoZSBjaGlsZHJlbiBhdCBvbmUgbm9kZSBvZiB0aGUgaGllcmFyY2h5IGRpZmZlciBmcm9tIHRob3NlIHVzZWQgZm9yCisvLyBhbm90aGVyIG5vZGUgYXQgdGhlIHNhbWUgbGV2ZWwuICBFeGFtcGxlOiAgc3VwcG9zZSB0aGUgbWFjaGluZSBoYXMgMiBub2RlcworLy8gd2l0aCAyIHBhY2thZ2VzIGVhY2guICBUaGUgZmlyc3Qgbm9kZSBjb250YWlucyBwYWNrYWdlcyA2MDEgYW5kIDYwMiwgYW5kCisvLyBzZWNvbmQgbm9kZSBjb250YWlucyBwYWNrYWdlcyA2MDMgYW5kIDYwNC4gIElmIHdlIHRyeSB0byBzb3J0IHRoZSB0YWJsZQorLy8gZm9yICJzY2F0dGVyIiBhZmZpbml0eSwgdGhlIHRhYmxlIHdpbGwgc3RpbGwgYmUgc29ydGVkIDYwMSwgNjAyLCA2MDMsIDYwNAorLy8gYmVjYXVzZSB3ZSBhcmUgcGF5aW5nIGF0dGVudGlvbiB0byB0aGUgbGFiZWxzIHRoZW1zZWx2ZXMsIG5vdCB0aGUgb3JkaW5hbAorLy8gY2hpbGQgbnVtYmVycy4gIEJ5IHVzaW5nIHRoZSBjaGlsZCBudW1iZXJzIGluIHRoZSBzb3J0LCB0aGUgcmVzdWx0IGlzCisvLyB7MCwwfT02MDEsIHswLDF9PTYwMywgezEsMH09NjAyLCB7MSwxfT02MDQuCisvLworc3RhdGljIHZvaWQKK19fa21wX2FmZmluaXR5X2Fzc2lnbl9jaGlsZF9udW1zKEFkZHJVbnNQYWlyICphZGRyZXNzMm9zLAorICBpbnQgbnVtQWRkcnMpCit7CisgICAgS01QX0RFQlVHX0FTU0VSVChudW1BZGRycyA+IDApOworICAgIGludCBkZXB0aCA9IGFkZHJlc3Myb3MtPmZpcnN0LmRlcHRoOworICAgIHVuc2lnbmVkICpjb3VudHMgPSAodW5zaWduZWQgKilfX2ttcF9hbGxvY2F0ZShkZXB0aCAqIHNpemVvZih1bnNpZ25lZCkpOworICAgIHVuc2lnbmVkICpsYXN0TGFiZWwgPSAodW5zaWduZWQgKilfX2ttcF9hbGxvY2F0ZShkZXB0aAorICAgICAgKiBzaXplb2YodW5zaWduZWQpKTsKKyAgICBpbnQgbGFiQ3Q7CisgICAgZm9yIChsYWJDdCA9IDA7IGxhYkN0IDwgZGVwdGg7IGxhYkN0KyspIHsKKyAgICAgICAgYWRkcmVzczJvc1swXS5maXJzdC5jaGlsZE51bXNbbGFiQ3RdID0gY291bnRzW2xhYkN0XSA9IDA7CisgICAgICAgIGxhc3RMYWJlbFtsYWJDdF0gPSBhZGRyZXNzMm9zWzBdLmZpcnN0LmxhYmVsc1tsYWJDdF07CisgICAgfQorICAgIGludCBpOworICAgIGZvciAoaSA9IDE7IGkgPCBudW1BZGRyczsgaSsrKSB7CisgICAgICAgIGZvciAobGFiQ3QgPSAwOyBsYWJDdCA8IGRlcHRoOyBsYWJDdCsrKSB7CisgICAgICAgICAgICBpZiAoYWRkcmVzczJvc1tpXS5maXJzdC5sYWJlbHNbbGFiQ3RdICE9IGxhc3RMYWJlbFtsYWJDdF0pIHsKKyAgICAgICAgICAgICAgICBpbnQgbGFiQ3QyOworICAgICAgICAgICAgICAgIGZvciAobGFiQ3QyID0gbGFiQ3QgKyAxOyBsYWJDdDIgPCBkZXB0aDsgbGFiQ3QyKyspIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnRzW2xhYkN0Ml0gPSAwOworICAgICAgICAgICAgICAgICAgICBsYXN0TGFiZWxbbGFiQ3QyXSA9IGFkZHJlc3Myb3NbaV0uZmlyc3QubGFiZWxzW2xhYkN0Ml07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvdW50c1tsYWJDdF0rKzsKKyAgICAgICAgICAgICAgICBsYXN0TGFiZWxbbGFiQ3RdID0gYWRkcmVzczJvc1tpXS5maXJzdC5sYWJlbHNbbGFiQ3RdOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvciAobGFiQ3QgPSAwOyBsYWJDdCA8IGRlcHRoOyBsYWJDdCsrKSB7CisgICAgICAgICAgICBhZGRyZXNzMm9zW2ldLmZpcnN0LmNoaWxkTnVtc1tsYWJDdF0gPSBjb3VudHNbbGFiQ3RdOworICAgICAgICB9CisgICAgICAgIGZvciAoOyBsYWJDdCA8IChpbnQpQWRkcmVzczo6bWF4RGVwdGg7IGxhYkN0KyspIHsKKyAgICAgICAgICAgIGFkZHJlc3Myb3NbaV0uZmlyc3QuY2hpbGROdW1zW2xhYkN0XSA9IDA7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworLy8KKy8vIEFsbCBvZiB0aGUgX19rbXBfYWZmaW5pdHlfY3JlYXRlXypfbWFwKCkgcm91dGluZXMgc2hvdWxkIHNldAorLy8gX19rbXBfYWZmaW5pdHlfbWFza3MgdG8gYSB2ZWN0b3Igb2YgYWZmaW5pdHkgbWFzayBvYmplY3RzIG9mIGxlbmd0aAorLy8gX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzLCBpZiBfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X25vbmUsIGFuZAorLy8gcmV0dXJuIHRoZSBudW1iZXIgb2YgbGV2ZWxzIGluIHRoZSBtYWNoaW5lIHRvcG9sb2d5IHRyZWUgKHplcm8gaWYKKy8vIF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfbm9uZSkuCisvLworLy8gQWxsIG9mIHRoZSBfX2ttcF9hZmZpbml0eV9jcmVhdGVfKl9tYXAoKSByb3V0aW5lcyBzaG91bGQgc2V0ICpmdWxsTWFzaworLy8gdG8gdGhlIGFmZmluaXR5IG1hc2sgZm9yIHRoZSBpbml0aWFsaXphdGlvbiB0aHJlYWQuICBUaGV5IG5lZWQgdG8gc2F2ZSBhbmQKKy8vIHJlc3RvcmUgdGhlIG1hc2ssIGFuZCBpdCBjb3VsZCBiZSBuZWVkZWQgbGF0ZXIsIHNvIHNhdmluZyBpdCBpcyBqdXN0IGFuCisvLyBvcHRpbWl6YXRpb24gdG8gYXZvaWQgY2FsbGluZyBrbXBfZ2V0X3N5c3RlbV9hZmZpbml0eSgpIGFnYWluLgorLy8KK3N0YXRpYyBrbXBfYWZmaW5fbWFza190ICpmdWxsTWFzayA9IE5VTEw7CisKK2ttcF9hZmZpbl9tYXNrX3QgKgorX19rbXBfYWZmaW5pdHlfZ2V0X2Z1bGxNYXNrKCkgeyByZXR1cm4gZnVsbE1hc2s7IH0KKworCitzdGF0aWMgaW50IG5Db3Jlc1BlclBrZywgblBhY2thZ2VzOworaW50IF9fa21wX25UaHJlYWRzUGVyQ29yZTsKKworLy8KKy8vIF9fa21wX2FmZmluaXR5X3VuaWZvcm1fdG9wb2xvZ3koKSBkb2Vzbid0IHdvcmsgd2hlbiBjYWxsZWQgZnJvbQorLy8gcGxhY2VzIHdoaWNoIHN1cHBvcnQgYXJiaXRyYXJpbHkgbWFueSBsZXZlbHMgaW4gdGhlIG1hY2hpbmUgdG9wb2xvZ3kKKy8vIG1hcCwgaS5lLiB0aGUgbm9uLWRlZmF1bHQgY2FzZXMgaW4gX19rbXBfYWZmaW5pdHlfY3JlYXRlX2NwdWluZm9fbWFwKCkKKy8vIF9fa21wX2FmZmluaXR5X2NyZWF0ZV94MmFwaWNpZF9tYXAoKS4KKy8vCitpbmxpbmUgc3RhdGljIGJvb2wKK19fa21wX2FmZmluaXR5X3VuaWZvcm1fdG9wb2xvZ3koKQoreworICAgIHJldHVybiBfX2ttcF9hdmFpbF9wcm9jID09IChfX2ttcF9uVGhyZWFkc1BlckNvcmUgKiBuQ29yZXNQZXJQa2cgKiBuUGFja2FnZXMpOworfQorCisKKy8vCisvLyBQcmludCBvdXQgdGhlIGRldGFpbGVkIG1hY2hpbmUgdG9wb2xvZ3kgbWFwLCBpLmUuIHRoZSBwaHlzaWNhbCBsb2NhdGlvbnMKKy8vIG9mIGVhY2ggT1MgcHJvYy4KKy8vCitzdGF0aWMgdm9pZAorX19rbXBfYWZmaW5pdHlfcHJpbnRfdG9wb2xvZ3koQWRkclVuc1BhaXIgKmFkZHJlc3Myb3MsIGludCBsZW4sIGludCBkZXB0aCwKKyAgaW50IHBrZ0xldmVsLCBpbnQgY29yZUxldmVsLCBpbnQgdGhyZWFkTGV2ZWwpCit7CisgICAgaW50IHByb2M7CisKKyAgICBLTVBfSU5GT1JNKE9TUHJvY1RvUGh5c2ljYWxUaHJlYWRNYXAsICJLTVBfQUZGSU5JVFkiKTsKKyAgICBmb3IgKHByb2MgPSAwOyBwcm9jIDwgbGVuOyBwcm9jKyspIHsKKyAgICAgICAgaW50IGxldmVsOworICAgICAgICBrbXBfc3RyX2J1Zl90IGJ1ZjsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9pbml0KCZidWYpOworICAgICAgICBmb3IgKGxldmVsID0gMDsgbGV2ZWwgPCBkZXB0aDsgbGV2ZWwrKykgeworICAgICAgICAgICAgaWYgKGxldmVsID09IHRocmVhZExldmVsKSB7CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCgmYnVmLCAiJXMgIiwgS01QX0kxOE5fU1RSKFRocmVhZCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAobGV2ZWwgPT0gY29yZUxldmVsKSB7CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCgmYnVmLCAiJXMgIiwgS01QX0kxOE5fU1RSKENvcmUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGxldmVsID09IHBrZ0xldmVsKSB7CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCgmYnVmLCAiJXMgIiwgS01QX0kxOE5fU1RSKFBhY2thZ2UpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGxldmVsID4gcGtnTGV2ZWwpIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCZidWYsICIlc18lZCAiLCBLTVBfSTE4Tl9TVFIoTm9kZSksCisgICAgICAgICAgICAgICAgICBsZXZlbCAtIHBrZ0xldmVsIC0gMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCZidWYsICJMJWQgIiwgbGV2ZWwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCgmYnVmLCAiJWQgIiwKKyAgICAgICAgICAgICAgYWRkcmVzczJvc1twcm9jXS5maXJzdC5sYWJlbHNbbGV2ZWxdKTsKKyAgICAgICAgfQorICAgICAgICBLTVBfSU5GT1JNKE9TUHJvY01hcFRvUGFjaywgIktNUF9BRkZJTklUWSIsIGFkZHJlc3Myb3NbcHJvY10uc2Vjb25kLAorICAgICAgICAgIGJ1Zi5zdHIpOworICAgICAgICBfX2ttcF9zdHJfYnVmX2ZyZWUoJmJ1Zik7CisgICAgfQorfQorCisKKy8vCisvLyBJZiB3ZSBkb24ndCBrbm93IGhvdyB0byByZXRyaWV2ZSB0aGUgbWFjaGluZSdzIHByb2Nlc3NvciB0b3BvbG9neSwgb3IKKy8vIGVuY291bnRlciBhbiBlcnJvciBpbiBkb2luZyBzbywgdGhpcyByb3V0aW5lIGlzIGNhbGxlZCB0byBmb3JtIGEgImZsYXQiCisvLyBtYXBwaW5nIG9mIG9zIHRocmVhZCBpZCdzIDwtPiBwcm9jZXNzb3IgaWQncy4KKy8vCitzdGF0aWMgaW50CitfX2ttcF9hZmZpbml0eV9jcmVhdGVfZmxhdF9tYXAoQWRkclVuc1BhaXIgKiphZGRyZXNzMm9zLAorICBrbXBfaTE4bl9pZF90ICpjb25zdCBtc2dfaWQpCit7CisgICAgKmFkZHJlc3Myb3MgPSBOVUxMOworICAgICptc2dfaWQgPSBrbXBfaTE4bl9udWxsOworCisgICAgLy8KKyAgICAvLyBFdmVuIGlmIF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfbm9uZSwgdGhpcyByb3V0aW5lIG1pZ2h0IHN0aWxsCisgICAgLy8gY2FsbGVkIHRvIHNldCBfX2ttcF9odF9lbmFibGVkLCAmIF9fa21wX25jb3JlcywgYXMgd2VsbCBhcworICAgIC8vIF9fa21wX25UaHJlYWRzUGVyQ29yZSwgbkNvcmVzUGVyUGtnLCAmIG5QYWNrYWdlcy4KKyAgICAvLworICAgIGlmICghIEtNUF9BRkZJTklUWV9DQVBBQkxFKCkpIHsKKyAgICAgICAgS01QX0FTU0VSVChfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUpOworICAgICAgICBfX2ttcF9uY29yZXMgPSBuUGFja2FnZXMgPSBfX2ttcF94cHJvYzsKKyAgICAgICAgX19rbXBfblRocmVhZHNQZXJDb3JlID0gbkNvcmVzUGVyUGtnID0gMTsKKyAgICAgICAgX19rbXBfaHRfZW5hYmxlZCA9IEZBTFNFOworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICAgICAgS01QX0lORk9STShBZmZGbGF0VG9wb2xvZ3ksICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oQXZhaWxhYmxlT1NQcm9jLCAiS01QX0FGRklOSVRZIiwgX19rbXBfYXZhaWxfcHJvYyk7CisgICAgICAgICAgICBLTVBfSU5GT1JNKFVuaWZvcm0sICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oVG9wb2xvZ3ksICJLTVBfQUZGSU5JVFkiLCBuUGFja2FnZXMsIG5Db3Jlc1BlclBrZywKKyAgICAgICAgICAgICAgX19rbXBfblRocmVhZHNQZXJDb3JlLCBfX2ttcF9uY29yZXMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8vCisgICAgLy8gV2hlbiBhZmZpbml0eSBpcyBvZmYsIHRoaXMgcm91dGluZSB3aWxsIHN0aWxsIGJlIGNhbGxlZCB0byBzZXQKKyAgICAvLyBfX2ttcF9odF9lbmFibGVkLCAmIF9fa21wX25jb3JlcywgYXMgd2VsbCBhcyBfX2ttcF9uVGhyZWFkc1BlckNvcmUsCisgICAgLy8gbkNvcmVzUGVyUGtnLCAmIG5QYWNrYWdlcy4gIE1ha2Ugc3VyZSBhbGwgdGhlc2UgdmFycyBhcmUgc2V0CisgICAgLy8gIGNvcnJlY3RseSwgYW5kIHJldHVybiBub3cgaWYgYWZmaW5pdHkgaXMgbm90IGVuYWJsZWQuCisgICAgLy8KKyAgICBfX2ttcF9uY29yZXMgPSBuUGFja2FnZXMgPSBfX2ttcF9hdmFpbF9wcm9jOworICAgIF9fa21wX25UaHJlYWRzUGVyQ29yZSA9IG5Db3Jlc1BlclBrZyA9IDE7CisgICAgX19rbXBfaHRfZW5hYmxlZCA9IEZBTFNFOworICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgIGNoYXIgYnVmW0tNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTl07CisgICAgICAgIF9fa21wX2FmZmluaXR5X3ByaW50X21hc2soYnVmLCBLTVBfQUZGSU5fTUFTS19QUklOVF9MRU4sIGZ1bGxNYXNrKTsKKworICAgICAgICBLTVBfSU5GT1JNKEFmZkNhcGFibGVVc2VGbGF0LCAiS01QX0FGRklOSVRZIik7CisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV9yZXNwZWN0X21hc2spIHsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oSW5pdE9TUHJvY1NldFJlc3BlY3QsICJLTVBfQUZGSU5JVFkiLCBidWYpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgS01QX0lORk9STShJbml0T1NQcm9jU2V0Tm90UmVzcGVjdCwgIktNUF9BRkZJTklUWSIsIGJ1Zik7CisgICAgICAgIH0KKyAgICAgICAgS01QX0lORk9STShBdmFpbGFibGVPU1Byb2MsICJLTVBfQUZGSU5JVFkiLCBfX2ttcF9hdmFpbF9wcm9jKTsKKyAgICAgICAgS01QX0lORk9STShVbmlmb3JtLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgIEtNUF9JTkZPUk0oVG9wb2xvZ3ksICJLTVBfQUZGSU5JVFkiLCBuUGFja2FnZXMsIG5Db3Jlc1BlclBrZywKKyAgICAgICAgICBfX2ttcF9uVGhyZWFkc1BlckNvcmUsIF9fa21wX25jb3Jlcyk7CisgICAgfQorICAgIGlmIChfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBDb250cnVjdCB0aGUgZGF0YSBzdHJ1Y3R1cmUgdG8gYmUgcmV0dXJuZWQuCisgICAgLy8KKyAgICAqYWRkcmVzczJvcyA9IChBZGRyVW5zUGFpciopCisgICAgICBfX2ttcF9hbGxvY2F0ZShzaXplb2YoKiphZGRyZXNzMm9zKSAqIF9fa21wX2F2YWlsX3Byb2MpOworICAgIGludCBhdmFpbF9jdCA9IDA7CisgICAgdW5zaWduZWQgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IEtNUF9DUFVfU0VUU0laRTsgKytpKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIFNraXAgdGhpcyBwcm9jIGlmIGl0IGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgbWFjaGluZSBtb2RlbC4KKyAgICAgICAgLy8KKyAgICAgICAgaWYgKCEgS01QX0NQVV9JU1NFVChpLCBmdWxsTWFzaykpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgQWRkcmVzcyBhZGRyKDEpOworICAgICAgICBhZGRyLmxhYmVsc1swXSA9IGk7CisgICAgICAgICgqYWRkcmVzczJvcylbYXZhaWxfY3QrK10gPSBBZGRyVW5zUGFpcihhZGRyLGkpOworICAgIH0KKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICBLTVBfSU5GT1JNKE9TUHJvY1RvUGFja2FnZSwgIktNUF9BRkZJTklUWSIpOworICAgIH0KKworICAgIGlmIChfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscyA8IDApIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gT25seSB0aGUgcGFja2FnZSBsZXZlbCBpcyBtb2RlbGVkIGluIHRoZSBtYWNoaW5lIHRvcG9sb2d5IG1hcCwKKyAgICAgICAgLy8gc28gdGhlICNsZXZlbHMgb2YgZ3JhbnVsYXJpdHkgaXMgZWl0aGVyIDAgb3IgMS4KKyAgICAgICAgLy8KKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X2dyYW4gPiBhZmZpbml0eV9ncmFuX3BhY2thZ2UpIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzID0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMTsKK30KKworCisjIGlmIEtNUF9PU19XSU5ET1dTICYmIEtNUF9BUkNIX1g4Nl82NAorCisvLworLy8gSWYgbXVsdGlwbGUgV2luZG93cyogT1MgcHJvY2Vzc29yIGdyb3VwcyBleGlzdCwgd2UgY2FuIGNyZWF0ZSBhIDItbGV2ZWwKKy8vIHRvcG9sb2d5IG1hcCB3aXRoIHRoZSBncm91cHMgYXQgbGV2ZWwgMCBhbmQgdGhlIGluZGl2aWR1YWwgcHJvY3MgYXQKKy8vIGxldmVsIDEuCisvLworLy8gVGhpcyBmYWNpbGl0YXRlcyBsZXR0aW5nIHRoZSB0aHJlYWRzIGZsb2F0IGFtb25nIGFsbCBwcm9jcyBpbiBhIGdyb3VwLAorLy8gaWYgZ3JhbnVsYXJpdHk9Z3JvdXAgKHRoZSBkZWZhdWx0IHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlIGdyb3VwcykuCisvLworc3RhdGljIGludAorX19rbXBfYWZmaW5pdHlfY3JlYXRlX3Byb2NfZ3JvdXBfbWFwKEFkZHJVbnNQYWlyICoqYWRkcmVzczJvcywKKyAga21wX2kxOG5faWRfdCAqY29uc3QgbXNnX2lkKQoreworICAgICphZGRyZXNzMm9zID0gTlVMTDsKKyAgICAqbXNnX2lkID0ga21wX2kxOG5fbnVsbDsKKworICAgIC8vCisgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBtdWx0aXBsZSBwcm9jZXNzb3IgZ3JvdXBzLCByZXR1cm4gbm93LgorICAgIC8vIFRoZSBmbGF0IG1hcHBpbmcgd2lsbCBiZSB1c2VkLgorICAgIC8vCisgICAgaWYgKCghIEtNUF9BRkZJTklUWV9DQVBBQkxFKCkpIHx8IChfX2ttcF9nZXRfcHJvY19ncm91cChmdWxsTWFzaykgPj0gMCkpIHsKKyAgICAgICAgLy8gRklYTUUgc2V0ICptc2dfaWQKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8vCisgICAgLy8gQ29udHJ1Y3QgdGhlIGRhdGEgc3RydWN0dXJlIHRvIGJlIHJldHVybmVkLgorICAgIC8vCisgICAgKmFkZHJlc3Myb3MgPSAoQWRkclVuc1BhaXIqKQorICAgICAgX19rbXBfYWxsb2NhdGUoc2l6ZW9mKCoqYWRkcmVzczJvcykgKiBfX2ttcF9hdmFpbF9wcm9jKTsKKyAgICBpbnQgYXZhaWxfY3QgPSAwOworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBLTVBfQ1BVX1NFVFNJWkU7ICsraSkgeworICAgICAgICAvLworICAgICAgICAvLyBTa2lwIHRoaXMgcHJvYyBpZiBpdCBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIG1hY2hpbmUgbW9kZWwuCisgICAgICAgIC8vCisgICAgICAgIGlmICghIEtNUF9DUFVfSVNTRVQoaSwgZnVsbE1hc2spKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIEFkZHJlc3MgYWRkcigyKTsKKyAgICAgICAgYWRkci5sYWJlbHNbMF0gPSBpIC8gKENIQVJfQklUICogc2l6ZW9mKERXT1JEX1BUUikpOworICAgICAgICBhZGRyLmxhYmVsc1sxXSA9IGkgJSAoQ0hBUl9CSVQgKiBzaXplb2YoRFdPUkRfUFRSKSk7CisgICAgICAgICgqYWRkcmVzczJvcylbYXZhaWxfY3QrK10gPSBBZGRyVW5zUGFpcihhZGRyLGkpOworCisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgICAgICBLTVBfSU5GT1JNKEFmZk9TUHJvY1RvR3JvdXAsICJLTVBfQUZGSU5JVFkiLCBpLCBhZGRyLmxhYmVsc1swXSwKKyAgICAgICAgICAgICAgYWRkci5sYWJlbHNbMV0pOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzIDwgMCkgeworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfZ3JhbiA9PSBhZmZpbml0eV9ncmFuX2dyb3VwKSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscyA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoKF9fa21wX2FmZmluaXR5X2dyYW4gPT0gYWZmaW5pdHlfZ3Jhbl9maW5lKQorICAgICAgICAgIHx8IChfX2ttcF9hZmZpbml0eV9ncmFuID09IGFmZmluaXR5X2dyYW5fdGhyZWFkKSkgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMgPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgY29uc3QgY2hhciAqZ3Jhbl9zdHIgPSBOVUxMOworICAgICAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X2dyYW4gPT0gYWZmaW5pdHlfZ3Jhbl9jb3JlKSB7CisgICAgICAgICAgICAgICAgZ3Jhbl9zdHIgPSAiY29yZSI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChfX2ttcF9hZmZpbml0eV9ncmFuID09IGFmZmluaXR5X2dyYW5fcGFja2FnZSkgeworICAgICAgICAgICAgICAgIGdyYW5fc3RyID0gInBhY2thZ2UiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoX19rbXBfYWZmaW5pdHlfZ3JhbiA9PSBhZmZpbml0eV9ncmFuX25vZGUpIHsKKyAgICAgICAgICAgICAgICBncmFuX3N0ciA9ICJub2RlIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQoMCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFdhcm5pbmc6IGNhbid0IHVzZSBhZmZpbml0eSBncmFudWxhcml0eSBcImdyYW5cIiB3aXRoIGdyb3VwIHRvcG9sb2d5IG1ldGhvZCwgdXNpbmcgInRocmVhZCIKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzID0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMjsKK30KKworIyBlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAmJiBLTVBfQVJDSF9YODZfNjQgKi8KKworCisjIGlmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKworc3RhdGljIGludAorX19rbXBfY3B1aWRfbWFza193aWR0aChpbnQgY291bnQpIHsKKyAgICBpbnQgciA9IDA7CisKKyAgICB3aGlsZSgoMTw8cikgPCBjb3VudCkKKyAgICAgICAgKytyOworICAgIHJldHVybiByOworfQorCisKK2NsYXNzIGFwaWNUaHJlYWRJbmZvIHsKK3B1YmxpYzoKKyAgICB1bnNpZ25lZCBvc0lkOyAgICAgICAgICAgICAgLy8gcGFyYW0gdG8gX19rbXBfYWZmaW5pdHlfYmluZF90aHJlYWQKKyAgICB1bnNpZ25lZCBhcGljSWQ7ICAgICAgICAgICAgLy8gZnJvbSBjcHVpZCBhZnRlciBiaW5kaW5nCisgICAgdW5zaWduZWQgbWF4Q29yZXNQZXJQa2c7ICAgIC8vICAgICAgIiIKKyAgICB1bnNpZ25lZCBtYXhUaHJlYWRzUGVyUGtnOyAgLy8gICAgICAiIgorICAgIHVuc2lnbmVkIHBrZ0lkOyAgICAgICAgICAgICAvLyBpbmZlcnJlZCBmcm9tIGFib3ZlIHZhbHVlcworICAgIHVuc2lnbmVkIGNvcmVJZDsgICAgICAgICAgICAvLyAgICAgICIiCisgICAgdW5zaWduZWQgdGhyZWFkSWQ7ICAgICAgICAgIC8vICAgICAgIiIKK307CisKKworc3RhdGljIGludAorX19rbXBfYWZmaW5pdHlfY21wX2FwaWNUaHJlYWRJbmZvX29zX2lkKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCit7CisgICAgY29uc3QgYXBpY1RocmVhZEluZm8gKmFhID0gKGNvbnN0IGFwaWNUaHJlYWRJbmZvICopYTsKKyAgICBjb25zdCBhcGljVGhyZWFkSW5mbyAqYmIgPSAoY29uc3QgYXBpY1RocmVhZEluZm8gKiliOworICAgIGlmIChhYS0+b3NJZCA8IGJiLT5vc0lkKSByZXR1cm4gLTE7CisgICAgaWYgKGFhLT5vc0lkID4gYmItPm9zSWQpIHJldHVybiAxOworICAgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQKK19fa21wX2FmZmluaXR5X2NtcF9hcGljVGhyZWFkSW5mb19waHlzX2lkKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCit7CisgICAgY29uc3QgYXBpY1RocmVhZEluZm8gKmFhID0gKGNvbnN0IGFwaWNUaHJlYWRJbmZvICopYTsKKyAgICBjb25zdCBhcGljVGhyZWFkSW5mbyAqYmIgPSAoY29uc3QgYXBpY1RocmVhZEluZm8gKiliOworICAgIGlmIChhYS0+cGtnSWQgPCBiYi0+cGtnSWQpIHJldHVybiAtMTsKKyAgICBpZiAoYWEtPnBrZ0lkID4gYmItPnBrZ0lkKSByZXR1cm4gMTsKKyAgICBpZiAoYWEtPmNvcmVJZCA8IGJiLT5jb3JlSWQpIHJldHVybiAtMTsKKyAgICBpZiAoYWEtPmNvcmVJZCA+IGJiLT5jb3JlSWQpIHJldHVybiAxOworICAgIGlmIChhYS0+dGhyZWFkSWQgPCBiYi0+dGhyZWFkSWQpIHJldHVybiAtMTsKKyAgICBpZiAoYWEtPnRocmVhZElkID4gYmItPnRocmVhZElkKSByZXR1cm4gMTsKKyAgICByZXR1cm4gMDsKK30KKworCisvLworLy8gT24gSUEtMzIgYXJjaGl0ZWN0dXJlIGFuZCBJbnRlbChSKSA2NCBhcmNoaXRlY3R1cmUsIHdlIGF0dGVtcHQgdG8gdXNlCisvLyBhbiBhbGdvcml0aG0gd2hpY2ggY3ljbGVzIHRocm91Z2ggdGhlIGF2YWlsYWJsZSBvcyB0aHJlYWRzLCBzZXR0aW5nCisvLyB0aGUgY3VycmVudCB0aHJlYWQncyBhZmZpbml0eSBtYXNrIHRvIHRoYXQgdGhyZWFkLCBhbmQgdGhlbiByZXRyaWV2ZXMKKy8vIHRoZSBBcGljIElkIGZvciBlYWNoIHRocmVhZCBjb250ZXh0IHVzaW5nIHRoZSBjcHVpZCBpbnN0cnVjdGlvbi4KKy8vCitzdGF0aWMgaW50CitfX2ttcF9hZmZpbml0eV9jcmVhdGVfYXBpY2lkX21hcChBZGRyVW5zUGFpciAqKmFkZHJlc3Myb3MsCisgIGttcF9pMThuX2lkX3QgKmNvbnN0IG1zZ19pZCkKK3sKKyAgICBpbnQgcmM7CisgICAgKmFkZHJlc3Myb3MgPSBOVUxMOworICAgICptc2dfaWQgPSBrbXBfaTE4bl9udWxsOworCisjICBpZiBLTVBfTUlDCisgICAgeworICAgICAgICAvLyBUaGUgY29kZSBiZWxvdyB3aWxsIHVzZSBjcHVpZCg0KS4KKyAgICAgICAgLy8gQ2hlY2sgaWYgY3B1aWQoNCkgaXMgc3VwcG9ydGVkLgorICAgICAgICAvLyBGSVhNRT8gLSB0aGlzIHJlYWxseSBkb2Vzbid0IG5lZWQgdG8gYmUgc3BlY2lmaWMgdG8gTUlDLgorICAgICAgICBrbXBfY3B1aWQgYnVmOworICAgICAgICBfX2ttcF94ODZfY3B1aWQoMCwgMCwgJmJ1Zik7CisgICAgICAgIGlmIChidWYuZWF4IDwgNCkgeworICAgICAgICAgICAgKm1zZ19pZCA9IGttcF9pMThuX3N0cl9Ob0xlYWY0U3VwcG9ydDsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKyMgIGVuZGlmIC8vIEtNUF9NSUMKKworICAgIC8vCisgICAgLy8gRXZlbiBpZiBfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUsIHRoaXMgcm91dGluZSBpcyBzdGlsbAorICAgIC8vIGNhbGxlZCB0byBzZXQgX19rbXBfaHRfZW5hYmxlZCwgJiBfX2ttcF9uY29yZXMsIGFzIHdlbGwgYXMKKyAgICAvLyBfX2ttcF9uVGhyZWFkc1BlckNvcmUsIG5Db3Jlc1BlclBrZywgJiBuUGFja2FnZXMuCisgICAgLy8KKyAgICAvLyBUaGUgYWxnb3JpdGhtIHVzZWQgc3RhcnRzIGJ5IHNldHRpbmcgdGhlIGFmZmluaXR5IHRvIGVhY2ggYXZhaWxhYmxlCisgICAgLy8gdGhyZWFkIGFuZCByZXRyZWl2aW5nIGluZm8gZnJvbSB0aGUgY3B1aWQgaW5zdHJ1Y3Rpb24sIHNvIGlmIHdlIGFyZSBub3QKKyAgICAvLyBjYXBhYmxlIG9mIGNhbGxpbmcgX19rbXBfYWZmaW5pdHlfZ2V0X21hcCgpL19fa21wX2FmZmluaXR5X2dldF9tYXAoKSwKKyAgICAvLyB0aGVuIHdlIG5lZWQgdG8gZG8gc29tZXRoaW5nIGVsc2UuCisgICAgLy8KKyAgICBpZiAoISBLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIEhhY2sgdG8gdHJ5IGFuZCBpbmZlciB0aGUgbWFjaGluZSB0b3BvbG9neSB1c2luZyBvbmx5IHRoZSBkYXRhCisgICAgICAgIC8vIGF2YWlsYWJsZSBmcm9tIGNwdWlkIG9uIHRoZSBjdXJyZW50IHRocmVhZCwgYW5kIF9fa21wX3hwcm9jLgorICAgICAgICAvLworICAgICAgICBLTVBfQVNTRVJUKF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfbm9uZSk7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gR2V0IGFuIHVwcGVyIGJvdW5kIG9uIHRoZSBudW1iZXIgb2YgdGhyZWFkcyBwZXIgcGFja2FnZSB1c2luZworICAgICAgICAvLyBjcHVpZCgxKS4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gT24gc29tZSBPUy9jaHBzIGNvbWJpbmF0aW9ucyB3aGVyZSBIVCBpcyBzdXBwb3J0ZWQgYnkgdGhlIGNoaXAKKyAgICAgICAgLy8gYnV0IGlzIGRpc2FibGVkLCB0aGlzIHZhbHVlIHdpbGwgYmUgMiBvbiBhIHNpbmdsZSBjb3JlIGNoaXAuCisgICAgICAgIC8vIFVzdWFsbHksIGl0IHdpbGwgYmUgMiBpZiBIVCBpcyBlbmFibGVkIGFuZCAxIGlmIEhUIGlzIGRpc2FibGVkLgorICAgICAgICAvLworICAgICAgICBrbXBfY3B1aWQgYnVmOworICAgICAgICBfX2ttcF94ODZfY3B1aWQoMSwgMCwgJmJ1Zik7CisgICAgICAgIGludCBtYXhUaHJlYWRzUGVyUGtnID0gKGJ1Zi5lYnggPj4gMTYpICYgMHhmZjsKKyAgICAgICAgaWYgKG1heFRocmVhZHNQZXJQa2cgPT0gMCkgeworICAgICAgICAgICAgbWF4VGhyZWFkc1BlclBrZyA9IDE7CisgICAgICAgIH0KKworICAgICAgICAvLworICAgICAgICAvLyBUaGUgbnVtIGNvcmVzIHBlciBwa2cgY29tZXMgZnJvbSBjcHVpZCg0KS4KKyAgICAgICAgLy8gMSBtdXN0IGJlIGFkZGVkIHRvIHRoZSBlbmNvZGVkIHZhbHVlLgorICAgICAgICAvLworICAgICAgICAvLyBUaGUgYXV0aG9yIG9mIGNwdV9jb3VudC5jcHAgdHJlYXRlZCB0aGlzIG9ubHkgYW4gdXBwZXIgYm91bmQKKyAgICAgICAgLy8gb24gdGhlIG51bWJlciBvZiBjb3JlcywgYnV0IEkgaGF2ZW4ndCBzZWVuIGFueSBjYXNlcyB3aGVyZSBpdAorICAgICAgICAvLyB3YXMgZ3JlYXRlciB0aGFuIHRoZSBhY3R1YWwgbnVtYmVyIG9mIGNvcmVzLCBzbyB3ZSB3aWxsIHRyZWF0CisgICAgICAgIC8vIGl0IGFzIGV4YWN0IGluIHRoaXMgYmxvY2sgb2YgY29kZS4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gRmlyc3QsIHdlIG5lZWQgdG8gY2hlY2sgaWYgY3B1aWQoNCkgaXMgc3VwcG9ydGVkIG9uIHRoaXMgY2hpcC4KKyAgICAgICAgLy8gVG8gc2VlIGlmIGNwdWlkKG4pIGlzIHN1cHBvcnRlZCwgaXNzdWUgY3B1aWQoMCkgYW5kIGNoZWNrIGlmIGVheAorICAgICAgICAvLyBoYXMgdGhlIHZhbHVlIG4gb3IgZ3JlYXRlci4KKyAgICAgICAgLy8KKyAgICAgICAgX19rbXBfeDg2X2NwdWlkKDAsIDAsICZidWYpOworICAgICAgICBpZiAoYnVmLmVheCA+PSA0KSB7CisgICAgICAgICAgICBfX2ttcF94ODZfY3B1aWQoNCwgMCwgJmJ1Zik7CisgICAgICAgICAgICBuQ29yZXNQZXJQa2cgPSAoKGJ1Zi5lYXggPj4gMjYpICYgMHgzZikgKyAxOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgbkNvcmVzUGVyUGtnID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIFRoZXJlIGlzIG5vIHdheSB0byByZWxpYWJseSB0ZWxsIGlmIEhUIGlzIGVuYWJsZWQgd2l0aG91dCBpc3N1aW5nCisgICAgICAgIC8vIHRoZSBjcHVpZCBpbnN0cnVjdGlvbiBmcm9tIGV2ZXJ5IHRocmVhZCwgY2FuIGNvcnJlbGF0aW5nIHRoZSBjcHVpZAorICAgICAgICAvLyBpbmZvLCBzbyBpZiB0aGUgbWFjaGluZSBpcyBub3QgYWZmaW5pdHkgY2FwYWJsZSwgd2UgYXNzdW1lIHRoYXQgSFQKKyAgICAgICAgLy8gaXMgb2ZmLiAgV2UgaGF2ZSBzZWVuIHF1aXRlIGEgZmV3IG1hY2hpbmVzIHdoZXJlIG1heFRocmVhZHNQZXJQa2cKKyAgICAgICAgLy8gaXMgMiwgeWV0IHRoZSBtYWNoaW5lIGRvZXMgbm90IHN1cHBvcnQgSFQuCisgICAgICAgIC8vCisgICAgICAgIC8vIC0gT2xkZXIgT1NlcyBhcmUgdXN1YWxseSBmb3VuZCBvbiBtYWNoaW5lcyB3aXRoIG9sZGVyIGNoaXBzLCB3aGljaAorICAgICAgICAvLyAgIGRvIG5vdCBzdXBwb3J0IEhULgorICAgICAgICAvLworICAgICAgICAvLyAtIFRoZSBwZXJmb3JtYW5jZSBwZW5hbHR5IGZvciBtaXN0YWtlbmx5IGlkZW50aWZ5aW5nIGEgbWFjaGluZSBhcworICAgICAgICAvLyAgIEhUIHdoZW4gaXQgaXNuJ3QgKHdoaWNoIHJlc3VsdHMgaW4gYmxvY2t0aW1lIGJlaW5nIGluY29ycmVjbHkgc2V0CisgICAgICAgIC8vICAgdG8gMCkgaXMgZ3JlYXRlciB0aGFuIHRoZSBwZW5hbHR5IHdoZW4gZm9yIG1pc3Rha2VubHkgaWRlbnRpZnlpbmcKKyAgICAgICAgLy8gICBhIG1hY2hpbmUgYXMgYmVpbmcgMSB0aHJlYWQvY29yZSB3aGVuIGl0IGlzIHJlYWxseSBIVCBlbmFibGVkCisgICAgICAgIC8vICAgKHdoaWNoIHJlc3VsdHMgaW4gYmxvY2t0aW1lIGJlaW5nIGluY29ycmVjdGx5IHNldCB0byBhIHBvc2l0aXZlCisgICAgICAgIC8vICAgdmFsdWUpLgorICAgICAgICAvLworICAgICAgICBfX2ttcF9uY29yZXMgPSBfX2ttcF94cHJvYzsKKyAgICAgICAgblBhY2thZ2VzID0gKF9fa21wX3hwcm9jICsgbkNvcmVzUGVyUGtnIC0gMSkgLyBuQ29yZXNQZXJQa2c7CisgICAgICAgIF9fa21wX25UaHJlYWRzUGVyQ29yZSA9IDE7CisgICAgICAgIF9fa21wX2h0X2VuYWJsZWQgPSBGQUxTRTsKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oQWZmTm90Q2FwYWJsZVVzZUxvY0NwdWlkLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgICAgICBLTVBfSU5GT1JNKEF2YWlsYWJsZU9TUHJvYywgIktNUF9BRkZJTklUWSIsIF9fa21wX2F2YWlsX3Byb2MpOworICAgICAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3VuaWZvcm1fdG9wb2xvZ3koKSkgeworICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oVW5pZm9ybSwgIktNUF9BRkZJTklUWSIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKE5vblVuaWZvcm0sICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEtNUF9JTkZPUk0oVG9wb2xvZ3ksICJLTVBfQUZGSU5JVFkiLCBuUGFja2FnZXMsIG5Db3Jlc1BlclBrZywKKyAgICAgICAgICAgICAgX19rbXBfblRocmVhZHNQZXJDb3JlLCBfX2ttcF9uY29yZXMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8vCisgICAgLy8KKyAgICAvLyBGcm9tIGhlcmUgb24sIHdlIGNhbiBhc3N1bWUgdGhhdCBpdCBpcyBzYWZlIHRvIGNhbGwKKyAgICAvLyBfX2ttcF9nZXRfc3lzdGVtX2FmZmluaXR5KCkgYW5kIF9fa21wX3NldF9zeXN0ZW1fYWZmaW5pdHkoKSwKKyAgICAvLyBldmVuIGlmIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9ub25lLgorICAgIC8vCisKKyAgICAvLworICAgIC8vIFNhdmUgdGhlIGFmZmluaXR5IG1hc2sgZm9yIHRoZSBjdXJyZW50IHRocmVhZC4KKyAgICAvLworICAgIGttcF9hZmZpbl9tYXNrX3QgKm9sZE1hc2s7CisgICAgS01QX0NQVV9BTExPQyhvbGRNYXNrKTsKKyAgICBLTVBfQVNTRVJUKG9sZE1hc2sgIT0gTlVMTCk7CisgICAgX19rbXBfZ2V0X3N5c3RlbV9hZmZpbml0eShvbGRNYXNrLCBUUlVFKTsKKworICAgIC8vCisgICAgLy8gUnVuIHRocm91Z2ggZWFjaCBvZiB0aGUgYXZhaWxhYmxlIGNvbnRleHRzLCBiaW5kaW5nIHRoZSBjdXJyZW50IHRocmVhZAorICAgIC8vIHRvIGl0LCBhbmQgb2J0YWluaW5nIHRoZSBwZXJ0aW5lbnQgaW5mb3JtYXRpb24gdXNpbmcgdGhlIGNwdWlkIGluc3RyLgorICAgIC8vCisgICAgLy8gVGhlIHJlbGV2YW50IGluZm9ybWF0aW9uIGlzOgorICAgIC8vCisgICAgLy8gQXBpYyBJZDogQml0cyAyNDozMSBvZiBlYnggYWZ0ZXIgaXNzdWluZyBjcHVpZCgxKSAtIGVhY2ggdGhyZWFkIGNvbnRleHQKKyAgICAvLyAgICBoYXMgYSB1bmlxaWUgQXBpYyBJZCwgd2hpY2ggaXMgb2YgdGhlIGZvcm0gcGtnIyA6IGNvcmUjIDogdGhyZWFkIy4KKyAgICAvLworICAgIC8vIE1heCBUaHJlYWRzIFBlciBQa2c6IEJpdHMgMTY6MjMgb2YgZWJ4IGFmdGVyIGlzc3VpbmcgY3B1aWQoMSkuICBUaGUKKyAgICAvLyAgICB2YWx1ZSBvZiB0aGlzIGZpZWxkIGRldGVybWluZXMgdGhlIHdpZHRoIG9mIHRoZSBjb3JlIyArIHRocmVhZCMKKyAgICAvLyAgICBmaWVsZHMgaW4gdGhlIEFwaWMgSWQuICBJdCBpcyBhbHNvIGFuIHVwcGVyIGJvdW5kIG9uIHRoZSBudW1iZXIKKyAgICAvLyAgICBvZiB0aHJlYWRzIHBlciBwYWNrYWdlLCBidXQgaXQgaGFzIGJlZW4gdmVyaWZpZWQgdGhhdCBzaXR1YXRpb25zCisgICAgLy8gICAgaGFwcGVuIHdlcmUgaXQgaXMgbm90IGV4YWN0LiAgSW4gcGFydGljdWxhciwgb24gY2VydGFpbiBPUy9jaGlwCisgICAgLy8gICAgY29tYmluYXRpb25zIHdoZXJlIEludGVsKFIpIEh5cGVyLVRocmVhZGluZyBUZWNobm9sb2d5IGlzIHN1cHBvcnRlZAorICAgIC8vICAgIGJ5IHRoZSBjaGlwIGJ1dCBoYXMKKyAgICAvLyAgICBiZWVuIGRpc2FibGVkLCB0aGUgdmFsdWUgb2YgdGhpcyBmaWVsZCB3aWxsIGJlIDIgKGZvciBhIHNpbmdsZSBjb3JlCisgICAgLy8gICAgY2hpcCkuICBPbiBvdGhlciBPUy9jaGlwIGNvbWJpbmF0aW9ucyBzdXBwb3J0aW5nCisgICAgLy8gICAgSW50ZWwoUikgSHlwZXItVGhyZWFkaW5nIFRlY2hub2xvZ3ksIHRoZSB2YWx1ZSBvZgorICAgIC8vICAgIHRoaXMgZmllbGQgd2lsbCBiZSAxIHdoZW4gSW50ZWwoUikgSHlwZXItVGhyZWFkaW5nIFRlY2hub2xvZ3kgaXMKKyAgICAvLyAgICBkaXNhYmxlZCBhbmQgMiB3aGVuIGl0IGlzIGVuYWJsZWQuCisgICAgLy8KKyAgICAvLyBNYXggQ29yZXMgUGVyIFBrZzogIEJpdHMgMjY6MzEgb2YgZWF4IGFmdGVyIGlzc3VpbmcgY3B1aWQoNCkuICBUaGUKKyAgICAvLyAgICB2YWx1ZSBvZiB0aGlzIGZpZWxkICgrMSkgZGV0ZXJtaW5lcyB0aGUgd2lkdGggb2YgdGhlIGNvcmUjIGZpZWxkIGluCisgICAgLy8gICAgdGhlIEFwaWMgSWQuICBUaGUgY29tbWVudHMgaW4gImNwdWNvdW50LmNwcCIgc2F5IHRoYXQgdGhpcyB2YWx1ZSBpcworICAgIC8vICAgIGFuIHVwcGVyIGJvdW5kLCBidXQgdGhlIElBLTMyIGFyY2hpdGVjdHVyZSBtYW51YWwgc2F5cyB0aGF0IGl0IGlzCisgICAgLy8gICAgZXhhY3RseSB0aGUgbnVtYmVyIG9mIGNvcmVzIHBlciBwYWNrYWdlLCBhbmQgSSBoYXZlbid0IHNlZW4gYW55CisgICAgLy8gICAgY2FzZSB3aGVyZSBpdCB3YXNuJ3QuCisgICAgLy8KKyAgICAvLyBGcm9tIHRoaXMgaW5mb3JtYXRpb24sIGRlZHVjZSB0aGUgcGFja2FnZSBJZCwgY29yZSBJZCwgYW5kIHRocmVhZCBJZCwKKyAgICAvLyBhbmQgc2V0IHRoZSBjb3JyZXNwb25kaW5nIGZpZWxkcyBpbiB0aGUgYXBpY1RocmVhZEluZm8gc3RydWN0LgorICAgIC8vCisgICAgdW5zaWduZWQgaTsKKyAgICBhcGljVGhyZWFkSW5mbyAqdGhyZWFkSW5mbyA9IChhcGljVGhyZWFkSW5mbyAqKV9fa21wX2FsbG9jYXRlKAorICAgICAgX19rbXBfYXZhaWxfcHJvYyAqIHNpemVvZihhcGljVGhyZWFkSW5mbykpOworICAgIHVuc2lnbmVkIG5BcGljcyA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IEtNUF9DUFVfU0VUU0laRTsgKytpKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIFNraXAgdGhpcyBwcm9jIGlmIGl0IGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgbWFjaGluZSBtb2RlbC4KKyAgICAgICAgLy8KKyAgICAgICAgaWYgKCEgS01QX0NQVV9JU1NFVChpLCBmdWxsTWFzaykpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoKGludCluQXBpY3MgPCBfX2ttcF9hdmFpbF9wcm9jKTsKKworICAgICAgICBfX2ttcF9hZmZpbml0eV9iaW5kX3RocmVhZChpKTsKKyAgICAgICAgdGhyZWFkSW5mb1tuQXBpY3NdLm9zSWQgPSBpOworCisgICAgICAgIC8vCisgICAgICAgIC8vIFRoZSBhcGljIGlkIGFuZCBtYXggdGhyZWFkcyBwZXIgcGtnIGNvbWUgZnJvbSBjcHVpZCgxKS4KKyAgICAgICAgLy8KKyAgICAgICAga21wX2NwdWlkIGJ1ZjsKKyAgICAgICAgX19rbXBfeDg2X2NwdWlkKDEsIDAsICZidWYpOworICAgICAgICBpZiAoISAoYnVmLmVkeCA+PiA5KSAmIDEpIHsKKyAgICAgICAgICAgIF9fa21wX3NldF9zeXN0ZW1fYWZmaW5pdHkob2xkTWFzaywgVFJVRSk7CisgICAgICAgICAgICBfX2ttcF9mcmVlKHRocmVhZEluZm8pOworICAgICAgICAgICAgS01QX0NQVV9GUkVFKG9sZE1hc2spOworICAgICAgICAgICAgKm1zZ19pZCA9IGttcF9pMThuX3N0cl9BcGljTm90UHJlc2VudDsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICB0aHJlYWRJbmZvW25BcGljc10uYXBpY0lkID0gKGJ1Zi5lYnggPj4gMjQpICYgMHhmZjsKKyAgICAgICAgdGhyZWFkSW5mb1tuQXBpY3NdLm1heFRocmVhZHNQZXJQa2cgPSAoYnVmLmVieCA+PiAxNikgJiAweGZmOworICAgICAgICBpZiAodGhyZWFkSW5mb1tuQXBpY3NdLm1heFRocmVhZHNQZXJQa2cgPT0gMCkgeworICAgICAgICAgICAgdGhyZWFkSW5mb1tuQXBpY3NdLm1heFRocmVhZHNQZXJQa2cgPSAxOworICAgICAgICB9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gTWF4IGNvcmVzIHBlciBwa2cgY29tZXMgZnJvbSBjcHVpZCg0KS4KKyAgICAgICAgLy8gMSBtdXN0IGJlIGFkZGVkIHRvIHRoZSBlbmNvZGVkIHZhbHVlLgorICAgICAgICAvLworICAgICAgICAvLyBGaXJzdCwgd2UgbmVlZCB0byBjaGVjayBpZiBjcHVpZCg0KSBpcyBzdXBwb3J0ZWQgb24gdGhpcyBjaGlwLgorICAgICAgICAvLyBUbyBzZWUgaWYgY3B1aWQobikgaXMgc3VwcG9ydGVkLCBpc3N1ZSBjcHVpZCgwKSBhbmQgY2hlY2sgaWYgZWF4CisgICAgICAgIC8vIGhhcyB0aGUgdmFsdWUgbiBvciBncmVhdGVyLgorICAgICAgICAvLworICAgICAgICBfX2ttcF94ODZfY3B1aWQoMCwgMCwgJmJ1Zik7CisgICAgICAgIGlmIChidWYuZWF4ID49IDQpIHsKKyAgICAgICAgICAgIF9fa21wX3g4Nl9jcHVpZCg0LCAwLCAmYnVmKTsKKyAgICAgICAgICAgIHRocmVhZEluZm9bbkFwaWNzXS5tYXhDb3Jlc1BlclBrZyA9ICgoYnVmLmVheCA+PiAyNikgJiAweDNmKSArIDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB0aHJlYWRJbmZvW25BcGljc10ubWF4Q29yZXNQZXJQa2cgPSAxOworICAgICAgICB9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gSW5mZXIgdGhlIHBrZ0lkIC8gY29yZUlkIC8gdGhyZWFkSWQgdXNpbmcgb25seSB0aGUgaW5mbworICAgICAgICAvLyBvYnRhaW5lZCBsb2NhbGx5LgorICAgICAgICAvLworICAgICAgICBpbnQgd2lkdGhDVCA9IF9fa21wX2NwdWlkX21hc2tfd2lkdGgoCisgICAgICAgICAgdGhyZWFkSW5mb1tuQXBpY3NdLm1heFRocmVhZHNQZXJQa2cpOworICAgICAgICB0aHJlYWRJbmZvW25BcGljc10ucGtnSWQgPSB0aHJlYWRJbmZvW25BcGljc10uYXBpY0lkID4+IHdpZHRoQ1Q7CisKKyAgICAgICAgaW50IHdpZHRoQyA9IF9fa21wX2NwdWlkX21hc2tfd2lkdGgoCisgICAgICAgICAgdGhyZWFkSW5mb1tuQXBpY3NdLm1heENvcmVzUGVyUGtnKTsKKyAgICAgICAgaW50IHdpZHRoVCA9IHdpZHRoQ1QgLSB3aWR0aEM7CisgICAgICAgIGlmICh3aWR0aFQgPCAwKSB7CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gSSd2ZSBuZXZlciBzZWVuIHRoaXMgb25lIGhhcHBlbiwgYnV0IEkgc3VwcG9zZSBpdCBjb3VsZCwgaWYKKyAgICAgICAgICAgIC8vIHRoZSBjcHVpZCBpbnN0cnVjdGlvbiBvbiBhIGNoaXAgd2FzIHJlYWxseSBzY3Jld2VkIHVwLgorICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRvIHJlc3RvcmUgdGhlIGFmZmluaXR5IG1hc2sgYmVmb3JlIHRoZSB0YWlsIGNhbGwuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgX19rbXBfc2V0X3N5c3RlbV9hZmZpbml0eShvbGRNYXNrLCBUUlVFKTsKKyAgICAgICAgICAgIF9fa21wX2ZyZWUodGhyZWFkSW5mbyk7CisgICAgICAgICAgICBLTVBfQ1BVX0ZSRUUob2xkTWFzayk7CisgICAgICAgICAgICAqbXNnX2lkID0ga21wX2kxOG5fc3RyX0ludmFsaWRDcHVpZEluZm87CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBpbnQgbWFza0MgPSAoMSA8PCB3aWR0aEMpIC0gMTsKKyAgICAgICAgdGhyZWFkSW5mb1tuQXBpY3NdLmNvcmVJZCA9ICh0aHJlYWRJbmZvW25BcGljc10uYXBpY0lkID4+IHdpZHRoVCkKKyAgICAgICAgICAmbWFza0M7CisKKyAgICAgICAgaW50IG1hc2tUID0gKDEgPDwgd2lkdGhUKSAtIDE7CisgICAgICAgIHRocmVhZEluZm9bbkFwaWNzXS50aHJlYWRJZCA9IHRocmVhZEluZm9bbkFwaWNzXS5hcGljSWQgJm1hc2tUOworCisgICAgICAgIG5BcGljcysrOworICAgIH0KKworICAgIC8vCisgICAgLy8gV2UndmUgY29sbGVjdGVkIGFsbCB0aGUgaW5mbyB3ZSBuZWVkLgorICAgIC8vIFJlc3RvcmUgdGhlIG9sZCBhZmZpbml0eSBtYXNrIGZvciB0aGlzIHRocmVhZC4KKyAgICAvLworICAgIF9fa21wX3NldF9zeXN0ZW1fYWZmaW5pdHkob2xkTWFzaywgVFJVRSk7CisKKyAgICAvLworICAgIC8vIElmIHRoZXJlJ3Mgb25seSBvbmUgdGhyZWFkIGNvbnRleHQgdG8gYmluZCB0bywgZm9ybSBhbiBBZGRyZXNzIG9iamVjdAorICAgIC8vIHdpdGggZGVwdGggMSBhbmQgcmV0dXJuIGltbWVkaWF0ZWx5IChvciwgaWYgYWZmaW5pdHkgaXMgb2ZmLCBzZXQKKyAgICAvLyBhZGRyZXNzMm9zIHRvIE5VTEwgYW5kIHJldHVybikuCisgICAgLy8KKyAgICAvLyBJZiBpdCBpcyBjb25maWd1cmVkIHRvIG9taXQgdGhlIHBhY2thZ2UgbGV2ZWwgd2hlbiB0aGVyZSBpcyBvbmx5IGEKKyAgICAvLyBzaW5nbGUgcGFja2FnZSwgdGhlIGxvZ2ljIGF0IHRoZSBlbmQgb2YgdGhpcyByb3V0aW5lIHdvbid0IHdvcmsgaWYKKyAgICAvLyB0aGVyZSBpcyBvbmx5IGEgc2luZ2xlIHRocmVhZCAtIGl0IHdvdWxkIHRyeSB0byBmb3JtIGFuIEFkZHJlc3MKKyAgICAvLyBvYmplY3Qgd2l0aCBkZXB0aCAwLgorICAgIC8vCisgICAgS01QX0FTU0VSVChuQXBpY3MgPiAwKTsKKyAgICBpZiAobkFwaWNzID09IDEpIHsKKyAgICAgICAgX19rbXBfbmNvcmVzID0gblBhY2thZ2VzID0gMTsKKyAgICAgICAgX19rbXBfblRocmVhZHNQZXJDb3JlID0gbkNvcmVzUGVyUGtnID0gMTsKKyAgICAgICAgX19rbXBfaHRfZW5hYmxlZCA9IEZBTFNFOworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICAgICAgY2hhciBidWZbS01QX0FGRklOX01BU0tfUFJJTlRfTEVOXTsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3ByaW50X21hc2soYnVmLCBLTVBfQUZGSU5fTUFTS19QUklOVF9MRU4sIG9sZE1hc2spOworCisgICAgICAgICAgICBLTVBfSU5GT1JNKEFmZlVzZUdsb2JDcHVpZCwgIktNUF9BRkZJTklUWSIpOworICAgICAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3Jlc3BlY3RfbWFzaykgeworICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oSW5pdE9TUHJvY1NldFJlc3BlY3QsICJLTVBfQUZGSU5JVFkiLCBidWYpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKEluaXRPU1Byb2NTZXROb3RSZXNwZWN0LCAiS01QX0FGRklOSVRZIiwgYnVmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEtNUF9JTkZPUk0oQXZhaWxhYmxlT1NQcm9jLCAiS01QX0FGRklOSVRZIiwgX19rbXBfYXZhaWxfcHJvYyk7CisgICAgICAgICAgICBLTVBfSU5GT1JNKFVuaWZvcm0sICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oVG9wb2xvZ3ksICJLTVBfQUZGSU5JVFkiLCBuUGFja2FnZXMsIG5Db3Jlc1BlclBrZywKKyAgICAgICAgICAgICAgX19rbXBfblRocmVhZHNQZXJDb3JlLCBfX2ttcF9uY29yZXMpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfbm9uZSkgeworICAgICAgICAgICAgX19rbXBfZnJlZSh0aHJlYWRJbmZvKTsKKyAgICAgICAgICAgIEtNUF9DUFVfRlJFRShvbGRNYXNrKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgKmFkZHJlc3Myb3MgPSAoQWRkclVuc1BhaXIqKV9fa21wX2FsbG9jYXRlKHNpemVvZihBZGRyVW5zUGFpcikpOworICAgICAgICBBZGRyZXNzIGFkZHIoMSk7CisgICAgICAgIGFkZHIubGFiZWxzWzBdID0gdGhyZWFkSW5mb1swXS5wa2dJZDsKKyAgICAgICAgKCphZGRyZXNzMm9zKVswXSA9IEFkZHJVbnNQYWlyKGFkZHIsIHRocmVhZEluZm9bMF0ub3NJZCk7CisKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzIDwgMCkgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMgPSAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3ByaW50X3RvcG9sb2d5KCphZGRyZXNzMm9zLCAxLCAxLCAwLCAtMSwgLTEpOworICAgICAgICB9CisKKyAgICAgICAgX19rbXBfZnJlZSh0aHJlYWRJbmZvKTsKKyAgICAgICAgS01QX0NQVV9GUkVFKG9sZE1hc2spOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIFNvcnQgdGhlIHRocmVhZEluZm8gdGFibGUgYnkgcGh5c2ljYWwgSWQuCisgICAgLy8KKyAgICBxc29ydCh0aHJlYWRJbmZvLCBuQXBpY3MsIHNpemVvZigqdGhyZWFkSW5mbyksCisgICAgICBfX2ttcF9hZmZpbml0eV9jbXBfYXBpY1RocmVhZEluZm9fcGh5c19pZCk7CisKKyAgICAvLworICAgIC8vIFRoZSB0YWJsZSBpcyBub3cgc29ydGVkIGJ5IHBrZ0lkIC8gY29yZUlkIC8gdGhyZWFkSWQsIGJ1dCB3ZSByZWFsbHkKKyAgICAvLyBkb24ndCBrbm93IHRoZSByYWRpeCBvZiBhbnkgb2YgdGhlIGZpZWxkcy4gIHBrZ0lkJ3MgbWF5IGJlIHNwYXJzZWx5CisgICAgLy8gYXNzaWduZWQgYW1vbmcgdGhlIGNoaXBzIG9uIGEgc3lzdGVtLiAgQWx0aG91Z2ggY29yZUlkJ3MgYXJlIHVzdWFsbHkKKyAgICAvLyBhc3NpZ25lZCBbMCAuLiBjb3Jlc1BlclBrZy0xXSBhbmQgdGhyZWFkSWQncyBhcmUgdXN1YWxseSBhc3NpZ25lZAorICAgIC8vIFswLi50aHJlYWRzUGVyQ29yZS0xXSwgd2UgZG9uJ3Qgd2FudCB0byBtYWtlIGFueSBzdWNoIGFzc3VtcHRpb25zLgorICAgIC8vCisgICAgLy8gRm9yIHRoYXQgbWF0dGVyLCB3ZSBkb24ndCBrbm93IHdoYXQgY29yZXNQZXJQa2cgYW5kIHRocmVhZHNQZXJDb3JlCisgICAgLy8gKG9yIHRoZSB0b3RhbCAjIHBhY2thZ2VzKSBhcmUgYXQgdGhpcyBwb2ludCAtIHdlIHdhbnQgdG8gZGV0ZXJtaW5lCisgICAgLy8gdGhhdCBub3cuICBXZSBvbmx5IGhhdmUgYW4gdXBwZXIgYm91bmQgb24gdGhlIGZpcnN0IHR3byBmaWd1cmVzLgorICAgIC8vCisgICAgLy8gV2UgYWxzbyBwZXJmb3JtIGEgY29uc2lzdGVuY3kgY2hlY2sgYXQgdGhpcyBwb2ludDogdGhlIHZhbHVlcyByZXR1cm5lZAorICAgIC8vIGJ5IHRoZSBjcHVpZCBpbnN0cnVjdGlvbiBmb3IgYW55IHRocmVhZCBib3VuZCB0byBhIGdpdmVuIHBhY2thZ2UgaGFkCisgICAgLy8gYmV0dGVyIHJldHVybiB0aGUgc2FtZSBpbmZvIGZvciBtYXhUaHJlYWRzUGVyUGtnIGFuZCBtYXhDb3Jlc1BlclBrZy4KKyAgICAvLworICAgIG5QYWNrYWdlcyA9IDE7CisgICAgbkNvcmVzUGVyUGtnID0gMTsKKyAgICBfX2ttcF9uVGhyZWFkc1BlckNvcmUgPSAxOworICAgIHVuc2lnbmVkIG5Db3JlcyA9IDE7CisKKyAgICB1bnNpZ25lZCBwa2dDdCA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGRldGVybWluZSByYWRpaQorICAgIHVuc2lnbmVkIGxhc3RQa2dJZCA9IHRocmVhZEluZm9bMF0ucGtnSWQ7CisgICAgdW5zaWduZWQgY29yZUN0ID0gMTsKKyAgICB1bnNpZ25lZCBsYXN0Q29yZUlkID0gdGhyZWFkSW5mb1swXS5jb3JlSWQ7CisgICAgdW5zaWduZWQgdGhyZWFkQ3QgPSAxOworICAgIHVuc2lnbmVkIGxhc3RUaHJlYWRJZCA9IHRocmVhZEluZm9bMF0udGhyZWFkSWQ7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludHJhLXBrZyBjb25zaXN0IGNoZWNrcworICAgIHVuc2lnbmVkIHByZXZNYXhDb3Jlc1BlclBrZyA9IHRocmVhZEluZm9bMF0ubWF4Q29yZXNQZXJQa2c7CisgICAgdW5zaWduZWQgcHJldk1heFRocmVhZHNQZXJQa2cgPSB0aHJlYWRJbmZvWzBdLm1heFRocmVhZHNQZXJQa2c7CisKKyAgICBmb3IgKGkgPSAxOyBpIDwgbkFwaWNzOyBpKyspIHsKKyAgICAgICAgaWYgKHRocmVhZEluZm9baV0ucGtnSWQgIT0gbGFzdFBrZ0lkKSB7CisgICAgICAgICAgICBuQ29yZXMrKzsKKyAgICAgICAgICAgIHBrZ0N0Kys7CisgICAgICAgICAgICBsYXN0UGtnSWQgPSB0aHJlYWRJbmZvW2ldLnBrZ0lkOworICAgICAgICAgICAgaWYgKChpbnQpY29yZUN0ID4gbkNvcmVzUGVyUGtnKSBuQ29yZXNQZXJQa2cgPSBjb3JlQ3Q7CisgICAgICAgICAgICBjb3JlQ3QgPSAxOworICAgICAgICAgICAgbGFzdENvcmVJZCA9IHRocmVhZEluZm9baV0uY29yZUlkOworICAgICAgICAgICAgaWYgKChpbnQpdGhyZWFkQ3QgPiBfX2ttcF9uVGhyZWFkc1BlckNvcmUpIF9fa21wX25UaHJlYWRzUGVyQ29yZSA9IHRocmVhZEN0OworICAgICAgICAgICAgdGhyZWFkQ3QgPSAxOworICAgICAgICAgICAgbGFzdFRocmVhZElkID0gdGhyZWFkSW5mb1tpXS50aHJlYWRJZDsKKworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBkaWZmZXJlbnQgcGFja2FnZSwgc28gZ28gb24gdG8gdGhlIG5leHQgaXRlcmF0aW9uCisgICAgICAgICAgICAvLyB3aXRob3V0IGRvaW5nIGFueSBjb25zaXN0ZW5jeSBjaGVja3MuICBSZXNldCB0aGUgY29uc2lzdGVuY3kKKyAgICAgICAgICAgIC8vIGNoZWNrIHZhcnMsIHRob3VnaC4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBwcmV2TWF4Q29yZXNQZXJQa2cgPSB0aHJlYWRJbmZvW2ldLm1heENvcmVzUGVyUGtnOworICAgICAgICAgICAgcHJldk1heFRocmVhZHNQZXJQa2cgPSB0aHJlYWRJbmZvW2ldLm1heFRocmVhZHNQZXJQa2c7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0aHJlYWRJbmZvW2ldLmNvcmVJZCAhPSBsYXN0Q29yZUlkKSB7CisgICAgICAgICAgICBuQ29yZXMrKzsKKyAgICAgICAgICAgIGNvcmVDdCsrOworICAgICAgICAgICAgbGFzdENvcmVJZCA9IHRocmVhZEluZm9baV0uY29yZUlkOworICAgICAgICAgICAgaWYgKChpbnQpdGhyZWFkQ3QgPiBfX2ttcF9uVGhyZWFkc1BlckNvcmUpIF9fa21wX25UaHJlYWRzUGVyQ29yZSA9IHRocmVhZEN0OworICAgICAgICAgICAgdGhyZWFkQ3QgPSAxOworICAgICAgICAgICAgbGFzdFRocmVhZElkID0gdGhyZWFkSW5mb1tpXS50aHJlYWRJZDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh0aHJlYWRJbmZvW2ldLnRocmVhZElkICE9IGxhc3RUaHJlYWRJZCkgeworICAgICAgICAgICAgdGhyZWFkQ3QrKzsKKyAgICAgICAgICAgIGxhc3RUaHJlYWRJZCA9IHRocmVhZEluZm9baV0udGhyZWFkSWQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBfX2ttcF9mcmVlKHRocmVhZEluZm8pOworICAgICAgICAgICAgS01QX0NQVV9GUkVFKG9sZE1hc2spOworICAgICAgICAgICAgKm1zZ19pZCA9IGttcF9pMThuX3N0cl9MZWdhY3lBcGljSURzTm90VW5pcXVlOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gQ2hlY2sgdG8gbWFrZSBjZXJ0YWluIHRoYXQgdGhlIG1heENvcmVzUGVyUGtnIGFuZCBtYXhUaHJlYWRzUGVyUGtnCisgICAgICAgIC8vIGZpZWxkcyBhZ3JlZSBiZXR3ZWVuIGFsbCB0aGUgdGhyZWFkcyBib3VuZHMgdG8gYSBnaXZlbiBwYWNrYWdlLgorICAgICAgICAvLworICAgICAgICBpZiAoKHByZXZNYXhDb3Jlc1BlclBrZyAhPSB0aHJlYWRJbmZvW2ldLm1heENvcmVzUGVyUGtnKQorICAgICAgICAgIHx8IChwcmV2TWF4VGhyZWFkc1BlclBrZyAhPSB0aHJlYWRJbmZvW2ldLm1heFRocmVhZHNQZXJQa2cpKSB7CisgICAgICAgICAgICBfX2ttcF9mcmVlKHRocmVhZEluZm8pOworICAgICAgICAgICAgS01QX0NQVV9GUkVFKG9sZE1hc2spOworICAgICAgICAgICAgKm1zZ19pZCA9IGttcF9pMThuX3N0cl9JbmNvbnNpc3RlbnRDcHVpZEluZm87CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisgICAgblBhY2thZ2VzID0gcGtnQ3Q7CisgICAgaWYgKChpbnQpY29yZUN0ID4gbkNvcmVzUGVyUGtnKSBuQ29yZXNQZXJQa2cgPSBjb3JlQ3Q7CisgICAgaWYgKChpbnQpdGhyZWFkQ3QgPiBfX2ttcF9uVGhyZWFkc1BlckNvcmUpIF9fa21wX25UaHJlYWRzUGVyQ29yZSA9IHRocmVhZEN0OworCisgICAgLy8KKyAgICAvLyBXaGVuIGFmZmluaXR5IGlzIG9mZiwgdGhpcyByb3V0aW5lIHdpbGwgc3RpbGwgYmUgY2FsbGVkIHRvIHNldAorICAgIC8vIF9fa21wX2h0X2VuYWJsZWQsICYgX19rbXBfbmNvcmVzLCBhcyB3ZWxsIGFzIF9fa21wX25UaHJlYWRzUGVyQ29yZSwKKyAgICAvLyBuQ29yZXNQZXJQa2csICYgblBhY2thZ2VzLiAgTWFrZSBzdXJlIGFsbCB0aGVzZSB2YXJzIGFyZSBzZXQKKyAgICAvLyBjb3JyZWN0bHksIGFuZCByZXR1cm4gbm93IGlmIGFmZmluaXR5IGlzIG5vdCBlbmFibGVkLgorICAgIC8vCisgICAgX19rbXBfaHRfZW5hYmxlZCA9IChfX2ttcF9uVGhyZWFkc1BlckNvcmUgPiAxKTsKKyAgICBfX2ttcF9uY29yZXMgPSBuQ29yZXM7CisgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgICAgY2hhciBidWZbS01QX0FGRklOX01BU0tfUFJJTlRfTEVOXTsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJpbnRfbWFzayhidWYsIEtNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTiwgb2xkTWFzayk7CisKKyAgICAgICAgS01QX0lORk9STShBZmZVc2VHbG9iQ3B1aWQsICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3Jlc3BlY3RfbWFzaykgeworICAgICAgICAgICAgS01QX0lORk9STShJbml0T1NQcm9jU2V0UmVzcGVjdCwgIktNUF9BRkZJTklUWSIsIGJ1Zik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBLTVBfSU5GT1JNKEluaXRPU1Byb2NTZXROb3RSZXNwZWN0LCAiS01QX0FGRklOSVRZIiwgYnVmKTsKKyAgICAgICAgfQorICAgICAgICBLTVBfSU5GT1JNKEF2YWlsYWJsZU9TUHJvYywgIktNUF9BRkZJTklUWSIsIF9fa21wX2F2YWlsX3Byb2MpOworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdW5pZm9ybV90b3BvbG9neSgpKSB7CisgICAgICAgICAgICBLTVBfSU5GT1JNKFVuaWZvcm0sICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oTm9uVW5pZm9ybSwgIktNUF9BRkZJTklUWSIpOworICAgICAgICB9CisgICAgICAgIEtNUF9JTkZPUk0oVG9wb2xvZ3ksICJLTVBfQUZGSU5JVFkiLCBuUGFja2FnZXMsIG5Db3Jlc1BlclBrZywKKyAgICAgICAgICBfX2ttcF9uVGhyZWFkc1BlckNvcmUsIF9fa21wX25jb3Jlcyk7CisKKyAgICB9CisKKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9ub25lKSB7CisgICAgICAgIF9fa21wX2ZyZWUodGhyZWFkSW5mbyk7CisgICAgICAgIEtNUF9DUFVfRlJFRShvbGRNYXNrKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBOb3cgdGhhdCB3ZSd2ZSBkZXRlcm1pbmVkIHRoZSBudW1iZXIgb2YgcGFja2FnZXMsIHRoZSBudW1iZXIgb2YgY29yZXMKKyAgICAvLyBwZXIgcGFja2FnZSwgYW5kIHRoZSBudW1iZXIgb2YgdGhyZWFkcyBwZXIgY29yZSwgd2UgY2FuIGNvbnN0cnVjdCB0aGUKKyAgICAvLyBkYXRhIHN0cnVjdHVyZSB0aGF0IGlzIHRvIGJlIHJldHVybmVkLgorICAgIC8vCisgICAgaW50IHBrZ0xldmVsID0gMDsKKyAgICBpbnQgY29yZUxldmVsID0gKG5Db3Jlc1BlclBrZyA8PSAxKSA/IC0xIDogMTsKKyAgICBpbnQgdGhyZWFkTGV2ZWwgPSAoX19rbXBfblRocmVhZHNQZXJDb3JlIDw9IDEpID8gLTEgOiAoKGNvcmVMZXZlbCA+PSAwKSA/IDIgOiAxKTsKKyAgICB1bnNpZ25lZCBkZXB0aCA9IChwa2dMZXZlbCA+PSAwKSArIChjb3JlTGV2ZWwgPj0gMCkgKyAodGhyZWFkTGV2ZWwgPj0gMCk7CisKKyAgICBLTVBfQVNTRVJUKGRlcHRoID4gMCk7CisgICAgKmFkZHJlc3Myb3MgPSAoQWRkclVuc1BhaXIqKV9fa21wX2FsbG9jYXRlKHNpemVvZihBZGRyVW5zUGFpcikgKiBuQXBpY3MpOworCisgICAgZm9yIChpID0gMDsgaSA8IG5BcGljczsgKytpKSB7CisgICAgICAgIEFkZHJlc3MgYWRkcihkZXB0aCk7CisgICAgICAgIHVuc2lnbmVkIG9zID0gdGhyZWFkSW5mb1tpXS5vc0lkOworICAgICAgICBpbnQgZCA9IDA7CisKKyAgICAgICAgaWYgKHBrZ0xldmVsID49IDApIHsKKyAgICAgICAgICAgIGFkZHIubGFiZWxzW2QrK10gPSB0aHJlYWRJbmZvW2ldLnBrZ0lkOworICAgICAgICB9CisgICAgICAgIGlmIChjb3JlTGV2ZWwgPj0gMCkgeworICAgICAgICAgICAgYWRkci5sYWJlbHNbZCsrXSA9IHRocmVhZEluZm9baV0uY29yZUlkOworICAgICAgICB9CisgICAgICAgIGlmICh0aHJlYWRMZXZlbCA+PSAwKSB7CisgICAgICAgICAgICBhZGRyLmxhYmVsc1tkKytdID0gdGhyZWFkSW5mb1tpXS50aHJlYWRJZDsKKyAgICAgICAgfQorICAgICAgICAoKmFkZHJlc3Myb3MpW2ldID0gQWRkclVuc1BhaXIoYWRkciwgb3MpOworICAgIH0KKworICAgIGlmIChfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscyA8IDApIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gU2V0IHRoZSBncmFudWxhcml0eSBsZXZlbCBiYXNlZCBvbiB3aGF0IGxldmVscyBhcmUgbW9kZWxlZAorICAgICAgICAvLyBpbiB0aGUgbWFjaGluZSB0b3BvbG9neSBtYXAuCisgICAgICAgIC8vCisgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzID0gMDsKKyAgICAgICAgaWYgKCh0aHJlYWRMZXZlbCA+PSAwKQorICAgICAgICAgICYmIChfX2ttcF9hZmZpbml0eV9ncmFuID4gYWZmaW5pdHlfZ3Jhbl90aHJlYWQpKSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscysrOworICAgICAgICB9CisgICAgICAgIGlmICgoY29yZUxldmVsID49IDApICYmIChfX2ttcF9hZmZpbml0eV9ncmFuID4gYWZmaW5pdHlfZ3Jhbl9jb3JlKSkgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMrKzsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHBrZ0xldmVsID49IDApICYmIChfX2ttcF9hZmZpbml0eV9ncmFuID4gYWZmaW5pdHlfZ3Jhbl9wYWNrYWdlKSkgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgIF9fa21wX2FmZmluaXR5X3ByaW50X3RvcG9sb2d5KCphZGRyZXNzMm9zLCBuQXBpY3MsIGRlcHRoLCBwa2dMZXZlbCwKKyAgICAgICAgICBjb3JlTGV2ZWwsIHRocmVhZExldmVsKTsKKyAgICB9CisKKyAgICBfX2ttcF9mcmVlKHRocmVhZEluZm8pOworICAgIEtNUF9DUFVfRlJFRShvbGRNYXNrKTsKKyAgICByZXR1cm4gZGVwdGg7Cit9CisKKworLy8KKy8vIEludGVsKFIpIG1pY3JvYXJjaGl0ZWN0dXJlIGNvZGUgbmFtZSBOZWhhbGVtLCBEdW5uaW5ndG9uIGFuZCBsYXRlcgorLy8gYXJjaGl0ZWN0dXJlcyBzdXBwb3J0IGEgbmV3ZXIgaW50ZXJmYWNlIGZvciBzcGVjaWZ5aW5nIHRoZSB4MkFQSUMgSWRzLAorLy8gYmFzZWQgb24gY3B1aWQgbGVhZiAxMS4KKy8vCitzdGF0aWMgaW50CitfX2ttcF9hZmZpbml0eV9jcmVhdGVfeDJhcGljaWRfbWFwKEFkZHJVbnNQYWlyICoqYWRkcmVzczJvcywKKyAga21wX2kxOG5faWRfdCAqY29uc3QgbXNnX2lkKQoreworICAgIGttcF9jcHVpZCBidWY7CisKKyAgICAqYWRkcmVzczJvcyA9IE5VTEw7CisgICAgKm1zZ19pZCA9IGttcF9pMThuX251bGw7CisKKyAgICAvLworICAgIC8vIENoZWNrIHRvIHNlZSBpZiBjcHVpZCBsZWFmIDExIGlzIHN1cHBvcnRlZC4KKyAgICAvLworICAgIF9fa21wX3g4Nl9jcHVpZCgwLCAwLCAmYnVmKTsKKyAgICBpZiAoYnVmLmVheCA8IDExKSB7CisgICAgICAgICptc2dfaWQgPSBrbXBfaTE4bl9zdHJfTm9MZWFmMTFTdXBwb3J0OworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIF9fa21wX3g4Nl9jcHVpZCgxMSwgMCwgJmJ1Zik7CisgICAgaWYgKGJ1Zi5lYnggPT0gMCkgeworICAgICAgICAqbXNnX2lkID0ga21wX2kxOG5fc3RyX05vTGVhZjExU3VwcG9ydDsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8vCisgICAgLy8gRmluZCB0aGUgbnVtYmVyIG9mIGxldmVscyBpbiB0aGUgbWFjaGluZSB0b3BvbG9neS4gIFdoaWxlIHdlJ3JlIGF0IGl0LAorICAgIC8vIGdldCB0aGUgZGVmYXVsdCB2YWx1ZXMgZm9yIF9fa21wX25UaHJlYWRzUGVyQ29yZSAmIG5Db3Jlc1BlclBrZy4gIFdlIHdpbGwKKyAgICAvLyB0cnkgdG8gZ2V0IG1vcmUgYWNjdXJhdGUgdmFsdWVzIGxhdGVyIGJ5IGV4cGxpY2l0bHkgY291bnRpbmcgdGhlbSwKKyAgICAvLyBidXQgZ2V0IHJlYXNvbmFibGUgZGVmYXVsdHMgbm93LCBpbiBjYXNlIHdlIHJldHVybiBlYXJseS4KKyAgICAvLworICAgIGludCBsZXZlbDsKKyAgICBpbnQgdGhyZWFkTGV2ZWwgPSAtMTsKKyAgICBpbnQgY29yZUxldmVsID0gLTE7CisgICAgaW50IHBrZ0xldmVsID0gLTE7CisgICAgX19rbXBfblRocmVhZHNQZXJDb3JlID0gbkNvcmVzUGVyUGtnID0gblBhY2thZ2VzID0gMTsKKworICAgIGZvciAobGV2ZWwgPSAwOzsgbGV2ZWwrKykgeworICAgICAgICBpZiAobGV2ZWwgPiAzMSkgeworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIEZJWE1FOiBIYWNrIGZvciBEUEQyMDAxNjMxODAKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBJZiBsZXZlbCBpcyBiaWcgdGhlbiBzb21ldGhpbmcgd2VudCB3cm9uZyAtPiBleGl0aW5nCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gVGhlcmUgY291bGQgYWN0dWFsbHkgYmUgMzIgdmFsaWQgbGV2ZWxzIGluIHRoZSBtYWNoaW5lIHRvcG9sb2d5LAorICAgICAgICAgICAgLy8gYnV0IHNvIGZhciwgdGhlIG9ubHkgbWFjaGluZSB3ZSBoYXZlIHNlZW4gd2hpY2ggZG9lcyBub3QgZXhpdAorICAgICAgICAgICAgLy8gdGhpcyBsb29wIGJlZm9yZSBpdGVyYXRpb24gMzIgaGFzIGZ1YmFyIHgyQVBJQyBzZXR0aW5ncy4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBGb3Igbm93LCBqdXN0IHJlamVjdCB0aGlzIGNhc2UgYmFzZWQgdXBvbiBsb29wIHRyaXAgY291bnQuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgKm1zZ19pZCA9IGttcF9pMThuX3N0cl9JbnZhbGlkQ3B1aWRJbmZvOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIF9fa21wX3g4Nl9jcHVpZCgxMSwgbGV2ZWwsICZidWYpOworICAgICAgICBpZiAoYnVmLmVieCA9PSAwKSB7CisgICAgICAgICAgICBpZiAocGtnTGV2ZWwgPCAwKSB7CisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyBXaWxsIGluZmVyIG5QYWNrYWdlcyBmcm9tIF9fa21wX3hwcm9jCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICBwa2dMZXZlbCA9IGxldmVsOworICAgICAgICAgICAgICAgIGxldmVsKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpbnQga2luZCA9IChidWYuZWN4ID4+IDgpICYgMHhmZjsKKyAgICAgICAgaWYgKGtpbmQgPT0gMSkgeworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFNNVCBsZXZlbAorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIHRocmVhZExldmVsID0gbGV2ZWw7CisgICAgICAgICAgICBjb3JlTGV2ZWwgPSAtMTsKKyAgICAgICAgICAgIHBrZ0xldmVsID0gLTE7CisgICAgICAgICAgICBfX2ttcF9uVGhyZWFkc1BlckNvcmUgPSBidWYuZWJ4ICYgMHhmZjsKKyAgICAgICAgICAgIGlmIChfX2ttcF9uVGhyZWFkc1BlckNvcmUgPT0gMCkgeworICAgICAgICAgICAgICAgICptc2dfaWQgPSBrbXBfaTE4bl9zdHJfSW52YWxpZENwdWlkSW5mbzsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoa2luZCA9PSAyKSB7CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gY29yZSBsZXZlbAorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGNvcmVMZXZlbCA9IGxldmVsOworICAgICAgICAgICAgcGtnTGV2ZWwgPSAtMTsKKyAgICAgICAgICAgIG5Db3Jlc1BlclBrZyA9IGJ1Zi5lYnggJiAweGZmOworICAgICAgICAgICAgaWYgKG5Db3Jlc1BlclBrZyA9PSAwKSB7CisgICAgICAgICAgICAgICAgKm1zZ19pZCA9IGttcF9pMThuX3N0cl9JbnZhbGlkQ3B1aWRJbmZvOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmIChsZXZlbCA8PSAwKSB7CisgICAgICAgICAgICAgICAgKm1zZ19pZCA9IGttcF9pMThuX3N0cl9JbnZhbGlkQ3B1aWRJbmZvOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwa2dMZXZlbCA+PSAwKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwa2dMZXZlbCA9IGxldmVsOworICAgICAgICAgICAgblBhY2thZ2VzID0gYnVmLmVieCAmIDB4ZmY7CisgICAgICAgICAgICBpZiAoblBhY2thZ2VzID09IDApIHsKKyAgICAgICAgICAgICAgICAqbXNnX2lkID0ga21wX2kxOG5fc3RyX0ludmFsaWRDcHVpZEluZm87CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGludCBkZXB0aCA9IGxldmVsOworCisgICAgLy8KKyAgICAvLyBJbiB0aGUgYWJvdmUgbG9vcCwgImxldmVsIiB3YXMgY291bnRlZCBmcm9tIHRoZSBmaW5lc3QgbGV2ZWwgKHVzdWFsbHkKKyAgICAvLyB0aHJlYWQpIHRvIHRoZSBjb2Fyc2VzdC4gIFRoZSBjYWxsZXIgZXhwZWN0cyB0aGF0IHdlIHdpbGwgcGxhY2UgdGhlCisgICAgLy8gbGFiZWxzIGluICgqYWRkcmVzczJvcylbXS5maXJzdC5sYWJlbHNbXSBpbiB0aGUgaW52ZXJzZSBvcmRlciwgc28KKyAgICAvLyB3ZSBuZWVkIHRvIGludmVydCB0aGUgdmFycyBzYXlpbmcgd2hpY2ggbGV2ZWwgbWVhbnMgd2hhdC4KKyAgICAvLworICAgIGlmICh0aHJlYWRMZXZlbCA+PSAwKSB7CisgICAgICAgIHRocmVhZExldmVsID0gZGVwdGggLSB0aHJlYWRMZXZlbCAtIDE7CisgICAgfQorICAgIGlmIChjb3JlTGV2ZWwgPj0gMCkgeworICAgICAgICBjb3JlTGV2ZWwgPSBkZXB0aCAtIGNvcmVMZXZlbCAtIDE7CisgICAgfQorICAgIEtNUF9ERUJVR19BU1NFUlQocGtnTGV2ZWwgPj0gMCk7CisgICAgcGtnTGV2ZWwgPSBkZXB0aCAtIHBrZ0xldmVsIC0gMTsKKworICAgIC8vCisgICAgLy8gVGhlIGFsZ29yaXRobSB1c2VkIHN0YXJ0cyBieSBzZXR0aW5nIHRoZSBhZmZpbml0eSB0byBlYWNoIGF2YWlsYWJsZQorICAgIC8vIHRocmVhZCBhbmQgcmV0cmlldmluZyBpbmZvIGZyb20gdGhlIGNwdWlkIGluc3RydWN0aW9uLCBzbyBpZiB3ZSBhcmUgbm90CisgICAgLy8gY2FwYWJsZSBvZiBjYWxsaW5nIF9fa21wX2FmZmluaXR5X2dldF9tYXAoKS9fX2ttcF9hZmZpbml0eV9nZXRfbWFwKCksCisgICAgLy8gdGhlbiB3ZSBuZWVkIHRvIGRvIHNvbWV0aGluZyBlbHNlIC0gdXNlIHRoZSBkZWZhdWx0cyB0aGF0IHdlIGNhbGN1bGF0ZWQKKyAgICAvLyBmcm9tIGlzc3VpbmcgY3B1aWQgd2l0aG91dCBiaW5kaW5nIHRvIGVhY2ggcHJvYy4KKyAgICAvLworICAgIGlmICghIEtNUF9BRkZJTklUWV9DQVBBQkxFKCkpCisgICAgeworICAgICAgICAvLworICAgICAgICAvLyBIYWNrIHRvIHRyeSBhbmQgaW5mZXIgdGhlIG1hY2hpbmUgdG9wb2xvZ3kgdXNpbmcgb25seSB0aGUgZGF0YQorICAgICAgICAvLyBhdmFpbGFibGUgZnJvbSBjcHVpZCBvbiB0aGUgY3VycmVudCB0aHJlYWQsIGFuZCBfX2ttcF94cHJvYy4KKyAgICAgICAgLy8KKyAgICAgICAgS01QX0FTU0VSVChfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUpOworCisgICAgICAgIF9fa21wX25jb3JlcyA9IF9fa21wX3hwcm9jIC8gX19rbXBfblRocmVhZHNQZXJDb3JlOworICAgICAgICBuUGFja2FnZXMgPSAoX19rbXBfeHByb2MgKyBuQ29yZXNQZXJQa2cgLSAxKSAvIG5Db3Jlc1BlclBrZzsKKyAgICAgICAgX19rbXBfaHRfZW5hYmxlZCA9IChfX2ttcF9uVGhyZWFkc1BlckNvcmUgPiAxKTsKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oQWZmTm90Q2FwYWJsZVVzZUxvY0NwdWlkTDExLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgICAgICBLTVBfSU5GT1JNKEF2YWlsYWJsZU9TUHJvYywgIktNUF9BRkZJTklUWSIsIF9fa21wX2F2YWlsX3Byb2MpOworICAgICAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3VuaWZvcm1fdG9wb2xvZ3koKSkgeworICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oVW5pZm9ybSwgIktNUF9BRkZJTklUWSIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKE5vblVuaWZvcm0sICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEtNUF9JTkZPUk0oVG9wb2xvZ3ksICJLTVBfQUZGSU5JVFkiLCBuUGFja2FnZXMsIG5Db3Jlc1BlclBrZywKKyAgICAgICAgICAgICAgX19rbXBfblRocmVhZHNQZXJDb3JlLCBfX2ttcF9uY29yZXMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8vCisgICAgLy8KKyAgICAvLyBGcm9tIGhlcmUgb24sIHdlIGNhbiBhc3N1bWUgdGhhdCBpdCBpcyBzYWZlIHRvIGNhbGwKKyAgICAvLyBfX2ttcF9nZXRfc3lzdGVtX2FmZmluaXR5KCkgYW5kIF9fa21wX3NldF9zeXN0ZW1fYWZmaW5pdHkoKSwKKyAgICAvLyBldmVuIGlmIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9ub25lLgorICAgIC8vCisKKyAgICAvLworICAgIC8vIFNhdmUgdGhlIGFmZmluaXR5IG1hc2sgZm9yIHRoZSBjdXJyZW50IHRocmVhZC4KKyAgICAvLworICAgIGttcF9hZmZpbl9tYXNrX3QgKm9sZE1hc2s7CisgICAgS01QX0NQVV9BTExPQyhvbGRNYXNrKTsKKyAgICBfX2ttcF9nZXRfc3lzdGVtX2FmZmluaXR5KG9sZE1hc2ssIFRSVUUpOworCisgICAgLy8KKyAgICAvLyBBbGxvY2F0ZSB0aGUgZGF0YSBzdHJ1Y3R1cmUgdG8gYmUgcmV0dXJuZWQuCisgICAgLy8KKyAgICBBZGRyVW5zUGFpciAqcmV0dmFsID0gKEFkZHJVbnNQYWlyICopCisgICAgICBfX2ttcF9hbGxvY2F0ZShzaXplb2YoQWRkclVuc1BhaXIpICogX19rbXBfYXZhaWxfcHJvYyk7CisKKyAgICAvLworICAgIC8vIFJ1biB0aHJvdWdoIGVhY2ggb2YgdGhlIGF2YWlsYWJsZSBjb250ZXh0cywgYmluZGluZyB0aGUgY3VycmVudCB0aHJlYWQKKyAgICAvLyB0byBpdCwgYW5kIG9idGFpbmluZyB0aGUgcGVydGluZW50IGluZm9ybWF0aW9uIHVzaW5nIHRoZSBjcHVpZCBpbnN0ci4KKyAgICAvLworICAgIHVuc2lnbmVkIGludCBwcm9jOworICAgIGludCBuQXBpY3MgPSAwOworICAgIGZvciAocHJvYyA9IDA7IHByb2MgPCBLTVBfQ1BVX1NFVFNJWkU7ICsrcHJvYykgeworICAgICAgICAvLworICAgICAgICAvLyBTa2lwIHRoaXMgcHJvYyBpZiBpdCBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIG1hY2hpbmUgbW9kZWwuCisgICAgICAgIC8vCisgICAgICAgIGlmICghIEtNUF9DUFVfSVNTRVQocHJvYywgZnVsbE1hc2spKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBLTVBfREVCVUdfQVNTRVJUKG5BcGljcyA8IF9fa21wX2F2YWlsX3Byb2MpOworCisgICAgICAgIF9fa21wX2FmZmluaXR5X2JpbmRfdGhyZWFkKHByb2MpOworCisgICAgICAgIC8vCisgICAgICAgIC8vIEV4dHJhY2ggdGhlIGxhYmVscyBmb3IgZWFjaCBsZXZlbCBpbiB0aGUgbWFjaGluZSB0b3BvbG9neSBtYXAKKyAgICAgICAgLy8gZnJvbSB0aGUgQXBpYyBJRC4KKyAgICAgICAgLy8KKyAgICAgICAgQWRkcmVzcyBhZGRyKGRlcHRoKTsKKyAgICAgICAgaW50IHByZXZfc2hpZnQgPSAwOworCisgICAgICAgIGZvciAobGV2ZWwgPSAwOyBsZXZlbCA8IGRlcHRoOyBsZXZlbCsrKSB7CisgICAgICAgICAgICBfX2ttcF94ODZfY3B1aWQoMTEsIGxldmVsLCAmYnVmKTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGFwaWNJZCA9IGJ1Zi5lZHg7CisgICAgICAgICAgICBpZiAoYnVmLmVieCA9PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGxldmVsICE9IGRlcHRoIC0gMSkgeworICAgICAgICAgICAgICAgICAgICBLTVBfQ1BVX0ZSRUUob2xkTWFzayk7CisgICAgICAgICAgICAgICAgICAgICptc2dfaWQgPSBrbXBfaTE4bl9zdHJfSW5jb25zaXN0ZW50Q3B1aWRJbmZvOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFkZHIubGFiZWxzW2RlcHRoIC0gbGV2ZWwgLSAxXSA9IGFwaWNJZCA+PiBwcmV2X3NoaWZ0OworICAgICAgICAgICAgICAgIGxldmVsKys7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgc2hpZnQgPSBidWYuZWF4ICYgMHgxZjsKKyAgICAgICAgICAgIGludCBtYXNrID0gKDEgPDwgc2hpZnQpIC0gMTsKKyAgICAgICAgICAgIGFkZHIubGFiZWxzW2RlcHRoIC0gbGV2ZWwgLSAxXSA9IChhcGljSWQgJiBtYXNrKSA+PiBwcmV2X3NoaWZ0OworICAgICAgICAgICAgcHJldl9zaGlmdCA9IHNoaWZ0OworICAgICAgICB9CisgICAgICAgIGlmIChsZXZlbCAhPSBkZXB0aCkgeworICAgICAgICAgICAgS01QX0NQVV9GUkVFKG9sZE1hc2spOworICAgICAgICAgICAgKm1zZ19pZCA9IGttcF9pMThuX3N0cl9JbmNvbnNpc3RlbnRDcHVpZEluZm87CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICByZXR2YWxbbkFwaWNzXSA9IEFkZHJVbnNQYWlyKGFkZHIsIHByb2MpOworICAgICAgICBuQXBpY3MrKzsKKyAgICB9CisKKyAgICAvLworICAgIC8vIFdlJ3ZlIGNvbGxlY3RlZCBhbGwgdGhlIGluZm8gd2UgbmVlZC4KKyAgICAvLyBSZXN0b3JlIHRoZSBvbGQgYWZmaW5pdHkgbWFzayBmb3IgdGhpcyB0aHJlYWQuCisgICAgLy8KKyAgICBfX2ttcF9zZXRfc3lzdGVtX2FmZmluaXR5KG9sZE1hc2ssIFRSVUUpOworCisgICAgLy8KKyAgICAvLyBJZiB0aGVyZSdzIG9ubHkgb25lIHRocmVhZCBjb250ZXh0IHRvIGJpbmQgdG8sIHJldHVybiBub3cuCisgICAgLy8KKyAgICBLTVBfQVNTRVJUKG5BcGljcyA+IDApOworICAgIGlmIChuQXBpY3MgPT0gMSkgeworICAgICAgICBfX2ttcF9uY29yZXMgPSBuUGFja2FnZXMgPSAxOworICAgICAgICBfX2ttcF9uVGhyZWFkc1BlckNvcmUgPSBuQ29yZXNQZXJQa2cgPSAxOworICAgICAgICBfX2ttcF9odF9lbmFibGVkID0gRkFMU0U7CisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgICAgICBjaGFyIGJ1ZltLTVBfQUZGSU5fTUFTS19QUklOVF9MRU5dOworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJpbnRfbWFzayhidWYsIEtNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTiwgb2xkTWFzayk7CisKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oQWZmVXNlR2xvYkNwdWlkTDExLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfcmVzcGVjdF9tYXNrKSB7CisgICAgICAgICAgICAgICAgS01QX0lORk9STShJbml0T1NQcm9jU2V0UmVzcGVjdCwgIktNUF9BRkZJTklUWSIsIGJ1Zik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oSW5pdE9TUHJvY1NldE5vdFJlc3BlY3QsICJLTVBfQUZGSU5JVFkiLCBidWYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgS01QX0lORk9STShBdmFpbGFibGVPU1Byb2MsICJLTVBfQUZGSU5JVFkiLCBfX2ttcF9hdmFpbF9wcm9jKTsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oVW5pZm9ybSwgIktNUF9BRkZJTklUWSIpOworICAgICAgICAgICAgS01QX0lORk9STShUb3BvbG9neSwgIktNUF9BRkZJTklUWSIsIG5QYWNrYWdlcywgbkNvcmVzUGVyUGtnLAorICAgICAgICAgICAgICBfX2ttcF9uVGhyZWFkc1BlckNvcmUsIF9fa21wX25jb3Jlcyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9ub25lKSB7CisgICAgICAgICAgICBfX2ttcF9mcmVlKHJldHZhbCk7CisgICAgICAgICAgICBLTVBfQ1BVX0ZSRUUob2xkTWFzayk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIEZvcm0gYW4gQWRkcmVzcyBvYmplY3Qgd2hpY2ggb25seSBpbmNsdWRlcyB0aGUgcGFja2FnZSBsZXZlbC4KKyAgICAgICAgLy8KKyAgICAgICAgQWRkcmVzcyBhZGRyKDEpOworICAgICAgICBhZGRyLmxhYmVsc1swXSA9IHJldHZhbFswXS5maXJzdC5sYWJlbHNbcGtnTGV2ZWxdOworICAgICAgICByZXR2YWxbMF0uZmlyc3QgPSBhZGRyOworCisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscyA8IDApIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9wcmludF90b3BvbG9neShyZXR2YWwsIDEsIDEsIDAsIC0xLCAtMSk7CisgICAgICAgIH0KKworICAgICAgICAqYWRkcmVzczJvcyA9IHJldHZhbDsKKyAgICAgICAgS01QX0NQVV9GUkVFKG9sZE1hc2spOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIFNvcnQgdGhlIHRhYmxlIGJ5IHBoeXNpY2FsIElkLgorICAgIC8vCisgICAgcXNvcnQocmV0dmFsLCBuQXBpY3MsIHNpemVvZigqcmV0dmFsKSwgX19rbXBfYWZmaW5pdHlfY21wX0FkZHJlc3NfbGFiZWxzKTsKKworICAgIC8vCisgICAgLy8gRmluZCB0aGUgcmFkaXggYXQgZWFjaCBvZiB0aGUgbGV2ZWxzLgorICAgIC8vCisgICAgdW5zaWduZWQgKnRvdGFscyA9ICh1bnNpZ25lZCAqKV9fa21wX2FsbG9jYXRlKGRlcHRoICogc2l6ZW9mKHVuc2lnbmVkKSk7CisgICAgdW5zaWduZWQgKmNvdW50cyA9ICh1bnNpZ25lZCAqKV9fa21wX2FsbG9jYXRlKGRlcHRoICogc2l6ZW9mKHVuc2lnbmVkKSk7CisgICAgdW5zaWduZWQgKm1heEN0ID0gKHVuc2lnbmVkICopX19rbXBfYWxsb2NhdGUoZGVwdGggKiBzaXplb2YodW5zaWduZWQpKTsKKyAgICB1bnNpZ25lZCAqbGFzdCA9ICh1bnNpZ25lZCAqKV9fa21wX2FsbG9jYXRlKGRlcHRoICogc2l6ZW9mKHVuc2lnbmVkKSk7CisgICAgZm9yIChsZXZlbCA9IDA7IGxldmVsIDwgZGVwdGg7IGxldmVsKyspIHsKKyAgICAgICAgdG90YWxzW2xldmVsXSA9IDE7CisgICAgICAgIG1heEN0W2xldmVsXSA9IDE7CisgICAgICAgIGNvdW50c1tsZXZlbF0gPSAxOworICAgICAgICBsYXN0W2xldmVsXSA9IHJldHZhbFswXS5maXJzdC5sYWJlbHNbbGV2ZWxdOworICAgIH0KKworICAgIC8vCisgICAgLy8gRnJvbSBoZXJlIG9uLCB0aGUgaXRlcmF0aW9uIHZhcmlhYmxlICJsZXZlbCIgcnVucyBmcm9tIHRoZSBmaW5lc3QKKyAgICAvLyBsZXZlbCB0byB0aGUgY29hcnNlc3QsIGkuZS4gd2UgaXRlcmF0ZSBmb3J3YXJkIHRocm91Z2gKKyAgICAvLyAoKmFkZHJlc3Myb3MpW10uZmlyc3QubGFiZWxzW10gLSBpbiB0aGUgcHJldmlvdXMgbG9vcHMsIHdlIGl0ZXJhdGVkCisgICAgLy8gYmFja3dhcmRzLgorICAgIC8vCisgICAgZm9yIChwcm9jID0gMTsgKGludClwcm9jIDwgbkFwaWNzOyBwcm9jKyspIHsKKyAgICAgICAgaW50IGxldmVsOworICAgICAgICBmb3IgKGxldmVsID0gMDsgbGV2ZWwgPCBkZXB0aDsgbGV2ZWwrKykgeworICAgICAgICAgICAgaWYgKHJldHZhbFtwcm9jXS5maXJzdC5sYWJlbHNbbGV2ZWxdICE9IGxhc3RbbGV2ZWxdKSB7CisgICAgICAgICAgICAgICAgaW50IGo7CisgICAgICAgICAgICAgICAgZm9yIChqID0gbGV2ZWwgKyAxOyBqIDwgZGVwdGg7IGorKykgeworICAgICAgICAgICAgICAgICAgICB0b3RhbHNbal0rKzsKKyAgICAgICAgICAgICAgICAgICAgY291bnRzW2pdID0gMTsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGxpbmUgYmVsb3cgY2F1c2VzIHByaW50aW5nIGluY29ycmVjdCB0b3BvbG9neSBpbmZvcm1hdGlvbgorICAgICAgICAgICAgICAgICAgICAvLyBpbiBjYXNlIHRoZSBtYXggdmFsdWUgZm9yIHNvbWUgbGV2ZWwgKG1heEN0W2xldmVsXSkgaXMgZW5jb3VudGVyZWQgZWFybGllciB0aGFuCisgICAgICAgICAgICAgICAgICAgIC8vIHNvbWUgbGVzcyB2YWx1ZSB3aGlsZSBnb2luZyB0aHJvdWdoIHRoZSBhcnJheS4KKyAgICAgICAgICAgICAgICAgICAgLy8gRm9yIGV4YW1wbGUsIGxldCBwa2cwIGhhcyA0IGNvcmVzIGFuZCBwa2cxIGhhcyAyIGNvcmVzLiBUaGVuIG1heEN0WzFdID09IDIKKyAgICAgICAgICAgICAgICAgICAgLy8gd2hlcmVhcyBpdCBtdXN0IGJlIDQuCisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8hISEgQ2hlY2sgaWYgaXQgY2FuIGJlIGNvbW1lbnRlZCBzYWZlbHkKKyAgICAgICAgICAgICAgICAgICAgLy9tYXhDdFtqXSA9IDE7CisgICAgICAgICAgICAgICAgICAgIGxhc3Rbal0gPSByZXR2YWxbcHJvY10uZmlyc3QubGFiZWxzW2pdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0b3RhbHNbbGV2ZWxdKys7CisgICAgICAgICAgICAgICAgY291bnRzW2xldmVsXSsrOworICAgICAgICAgICAgICAgIGlmIChjb3VudHNbbGV2ZWxdID4gbWF4Q3RbbGV2ZWxdKSB7CisgICAgICAgICAgICAgICAgICAgIG1heEN0W2xldmVsXSA9IGNvdW50c1tsZXZlbF07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxhc3RbbGV2ZWxdID0gcmV0dmFsW3Byb2NdLmZpcnN0LmxhYmVsc1tsZXZlbF07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChsZXZlbCA9PSBkZXB0aCAtIDEpIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9mcmVlKGxhc3QpOworICAgICAgICAgICAgICAgIF9fa21wX2ZyZWUobWF4Q3QpOworICAgICAgICAgICAgICAgIF9fa21wX2ZyZWUoY291bnRzKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9mcmVlKHRvdGFscyk7CisgICAgICAgICAgICAgICAgX19rbXBfZnJlZShyZXR2YWwpOworICAgICAgICAgICAgICAgIEtNUF9DUFVfRlJFRShvbGRNYXNrKTsKKyAgICAgICAgICAgICAgICAqbXNnX2lkID0ga21wX2kxOG5fc3RyX3gyQXBpY0lEc05vdFVuaXF1ZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLworICAgIC8vIFdoZW4gYWZmaW5pdHkgaXMgb2ZmLCB0aGlzIHJvdXRpbmUgd2lsbCBzdGlsbCBiZSBjYWxsZWQgdG8gc2V0CisgICAgLy8gX19rbXBfaHRfZW5hYmxlZCwgJiBfX2ttcF9uY29yZXMsIGFzIHdlbGwgYXMgX19rbXBfblRocmVhZHNQZXJDb3JlLAorICAgIC8vIG5Db3Jlc1BlclBrZywgJiBuUGFja2FnZXMuICBNYWtlIHN1cmUgYWxsIHRoZXNlIHZhcnMgYXJlIHNldAorICAgIC8vIGNvcnJlY3RseSwgYW5kIHJldHVybiBpZiBhZmZpbml0eSBpcyBub3QgZW5hYmxlZC4KKyAgICAvLworICAgIGlmICh0aHJlYWRMZXZlbCA+PSAwKSB7CisgICAgICAgIF9fa21wX25UaHJlYWRzUGVyQ29yZSA9IG1heEN0W3RocmVhZExldmVsXTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIF9fa21wX25UaHJlYWRzUGVyQ29yZSA9IDE7CisgICAgfQorICAgIF9fa21wX2h0X2VuYWJsZWQgPSAoX19rbXBfblRocmVhZHNQZXJDb3JlID4gMSk7CisKKyAgICBuUGFja2FnZXMgPSB0b3RhbHNbcGtnTGV2ZWxdOworCisgICAgaWYgKGNvcmVMZXZlbCA+PSAwKSB7CisgICAgICAgIF9fa21wX25jb3JlcyA9IHRvdGFsc1tjb3JlTGV2ZWxdOworICAgICAgICBuQ29yZXNQZXJQa2cgPSBtYXhDdFtjb3JlTGV2ZWxdOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgX19rbXBfbmNvcmVzID0gblBhY2thZ2VzOworICAgICAgICBuQ29yZXNQZXJQa2cgPSAxOworICAgIH0KKworICAgIC8vCisgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBtYWNoaW5lIHRvcG9sb2d5IGlzIHVuaWZvcm0KKyAgICAvLworICAgIHVuc2lnbmVkIHByb2QgPSBtYXhDdFswXTsKKyAgICBmb3IgKGxldmVsID0gMTsgbGV2ZWwgPCBkZXB0aDsgbGV2ZWwrKykgeworICAgICAgIHByb2QgKj0gbWF4Q3RbbGV2ZWxdOworICAgIH0KKyAgICBib29sIHVuaWZvcm0gPSAocHJvZCA9PSB0b3RhbHNbbGV2ZWwgLSAxXSk7CisKKyAgICAvLworICAgIC8vIFByaW50IHRoZSBtYWNoaW5lIHRvcG9sb2d5IHN1bW1hcnkuCisgICAgLy8KKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICBjaGFyIG1hc2tbS01QX0FGRklOX01BU0tfUFJJTlRfTEVOXTsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJpbnRfbWFzayhtYXNrLCBLTVBfQUZGSU5fTUFTS19QUklOVF9MRU4sIG9sZE1hc2spOworCisgICAgICAgIEtNUF9JTkZPUk0oQWZmVXNlR2xvYkNwdWlkTDExLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV9yZXNwZWN0X21hc2spIHsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oSW5pdE9TUHJvY1NldFJlc3BlY3QsICJLTVBfQUZGSU5JVFkiLCBtYXNrKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oSW5pdE9TUHJvY1NldE5vdFJlc3BlY3QsICJLTVBfQUZGSU5JVFkiLCBtYXNrKTsKKyAgICAgICAgfQorICAgICAgICBLTVBfSU5GT1JNKEF2YWlsYWJsZU9TUHJvYywgIktNUF9BRkZJTklUWSIsIF9fa21wX2F2YWlsX3Byb2MpOworICAgICAgICBpZiAodW5pZm9ybSkgeworICAgICAgICAgICAgS01QX0lORk9STShVbmlmb3JtLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBLTVBfSU5GT1JNKE5vblVuaWZvcm0sICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgfQorCisgICAgICAgIGttcF9zdHJfYnVmX3QgYnVmOworICAgICAgICBfX2ttcF9zdHJfYnVmX2luaXQoJmJ1Zik7CisKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCgmYnVmLCAiJWQiLCB0b3RhbHNbMF0pOworICAgICAgICBmb3IgKGxldmVsID0gMTsgbGV2ZWwgPD0gcGtnTGV2ZWw7IGxldmVsKyspIHsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoJmJ1ZiwgIiB4ICVkIiwgbWF4Q3RbbGV2ZWxdKTsKKyAgICAgICAgfQorICAgICAgICBLTVBfSU5GT1JNKFRvcG9sb2d5RXh0cmEsICJLTVBfQUZGSU5JVFkiLCBidWYuc3RyLCBuQ29yZXNQZXJQa2csCisgICAgICAgICAgX19rbXBfblRocmVhZHNQZXJDb3JlLCBfX2ttcF9uY29yZXMpOworCisgICAgICAgIF9fa21wX3N0cl9idWZfZnJlZSgmYnVmKTsKKyAgICB9CisKKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9ub25lKSB7CisgICAgICAgIF9fa21wX2ZyZWUobGFzdCk7CisgICAgICAgIF9fa21wX2ZyZWUobWF4Q3QpOworICAgICAgICBfX2ttcF9mcmVlKGNvdW50cyk7CisgICAgICAgIF9fa21wX2ZyZWUodG90YWxzKTsKKyAgICAgICAgX19rbXBfZnJlZShyZXR2YWwpOworICAgICAgICBLTVBfQ1BVX0ZSRUUob2xkTWFzayk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8vCisgICAgLy8gRmluZCBhbnkgbGV2ZWxzIHdpdGggcmFkaWl4IDEsIGFuZCByZW1vdmUgdGhlbSBmcm9tIHRoZSBtYXAKKyAgICAvLyAoZXhjZXB0IGZvciB0aGUgcGFja2FnZSBsZXZlbCkuCisgICAgLy8KKyAgICBpbnQgbmV3X2RlcHRoID0gMDsKKyAgICBmb3IgKGxldmVsID0gMDsgbGV2ZWwgPCBkZXB0aDsgbGV2ZWwrKykgeworICAgICAgICBpZiAoKG1heEN0W2xldmVsXSA9PSAxKSAmJiAobGV2ZWwgIT0gcGtnTGV2ZWwpKSB7CisgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIG5ld19kZXB0aCsrOworICAgIH0KKworICAgIC8vCisgICAgLy8gSWYgd2UgYXJlIHJlbW92aW5nIGFueSBsZXZlbHMsIGFsbG9jYXRlIGEgbmV3IHZlY3RvciB0byByZXR1cm4sCisgICAgLy8gYW5kIGNvcHkgdGhlIHJlbGV2YW50IGluZm9ybWF0aW9uIHRvIGl0LgorICAgIC8vCisgICAgaWYgKG5ld19kZXB0aCAhPSBkZXB0aCkgeworICAgICAgICBBZGRyVW5zUGFpciAqbmV3X3JldHZhbCA9IChBZGRyVW5zUGFpciAqKV9fa21wX2FsbG9jYXRlKAorICAgICAgICAgIHNpemVvZihBZGRyVW5zUGFpcikgKiBuQXBpY3MpOworICAgICAgICBmb3IgKHByb2MgPSAwOyAoaW50KXByb2MgPCBuQXBpY3M7IHByb2MrKykgeworICAgICAgICAgICAgQWRkcmVzcyBhZGRyKG5ld19kZXB0aCk7CisgICAgICAgICAgICBuZXdfcmV0dmFsW3Byb2NdID0gQWRkclVuc1BhaXIoYWRkciwgcmV0dmFsW3Byb2NdLnNlY29uZCk7CisgICAgICAgIH0KKyAgICAgICAgaW50IG5ld19sZXZlbCA9IDA7CisgICAgICAgIGZvciAobGV2ZWwgPSAwOyBsZXZlbCA8IGRlcHRoOyBsZXZlbCsrKSB7CisgICAgICAgICAgICBpZiAoKG1heEN0W2xldmVsXSA9PSAxKSAmJiAobGV2ZWwgIT0gcGtnTGV2ZWwpKSB7CisgICAgICAgICAgICAgICBpZiAobGV2ZWwgPT0gdGhyZWFkTGV2ZWwpIHsKKyAgICAgICAgICAgICAgICAgICB0aHJlYWRMZXZlbCA9IC0xOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgZWxzZSBpZiAoKHRocmVhZExldmVsID49IDApICYmIChsZXZlbCA8IHRocmVhZExldmVsKSkgeworICAgICAgICAgICAgICAgICAgIHRocmVhZExldmVsLS07CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBpZiAobGV2ZWwgPT0gY29yZUxldmVsKSB7CisgICAgICAgICAgICAgICAgICAgY29yZUxldmVsID0gLTE7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBlbHNlIGlmICgoY29yZUxldmVsID49IDApICYmIChsZXZlbCA8IGNvcmVMZXZlbCkpIHsKKyAgICAgICAgICAgICAgICAgICBjb3JlTGV2ZWwtLTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIGlmIChsZXZlbCA8IHBrZ0xldmVsKSB7CisgICAgICAgICAgICAgICAgICAgcGtnTGV2ZWwtLTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChwcm9jID0gMDsgKGludClwcm9jIDwgbkFwaWNzOyBwcm9jKyspIHsKKyAgICAgICAgICAgICAgICBuZXdfcmV0dmFsW3Byb2NdLmZpcnN0LmxhYmVsc1tuZXdfbGV2ZWxdCisgICAgICAgICAgICAgICAgICA9IHJldHZhbFtwcm9jXS5maXJzdC5sYWJlbHNbbGV2ZWxdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbmV3X2xldmVsKys7CisgICAgICAgIH0KKworICAgICAgICBfX2ttcF9mcmVlKHJldHZhbCk7CisgICAgICAgIHJldHZhbCA9IG5ld19yZXR2YWw7CisgICAgICAgIGRlcHRoID0gbmV3X2RlcHRoOworICAgIH0KKworICAgIGlmIChfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscyA8IDApIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gU2V0IHRoZSBncmFudWxhcml0eSBsZXZlbCBiYXNlZCBvbiB3aGF0IGxldmVscyBhcmUgbW9kZWxlZAorICAgICAgICAvLyBpbiB0aGUgbWFjaGluZSB0b3BvbG9neSBtYXAuCisgICAgICAgIC8vCisgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzID0gMDsKKyAgICAgICAgaWYgKCh0aHJlYWRMZXZlbCA+PSAwKSAmJiAoX19rbXBfYWZmaW5pdHlfZ3JhbiA+IGFmZmluaXR5X2dyYW5fdGhyZWFkKSkgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMrKzsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGNvcmVMZXZlbCA+PSAwKSAmJiAoX19rbXBfYWZmaW5pdHlfZ3JhbiA+IGFmZmluaXR5X2dyYW5fY29yZSkpIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzKys7CisgICAgICAgIH0KKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X2dyYW4gPiBhZmZpbml0eV9ncmFuX3BhY2thZ2UpIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICBfX2ttcF9hZmZpbml0eV9wcmludF90b3BvbG9neShyZXR2YWwsIG5BcGljcywgZGVwdGgsIHBrZ0xldmVsLAorICAgICAgICAgIGNvcmVMZXZlbCwgdGhyZWFkTGV2ZWwpOworICAgIH0KKworICAgIF9fa21wX2ZyZWUobGFzdCk7CisgICAgX19rbXBfZnJlZShtYXhDdCk7CisgICAgX19rbXBfZnJlZShjb3VudHMpOworICAgIF9fa21wX2ZyZWUodG90YWxzKTsKKyAgICBLTVBfQ1BVX0ZSRUUob2xkTWFzayk7CisgICAgKmFkZHJlc3Myb3MgPSByZXR2YWw7CisgICAgcmV0dXJuIGRlcHRoOworfQorCisKKyMgZW5kaWYgLyogS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCAqLworCisKKyNkZWZpbmUgb3NJZEluZGV4ICAgICAgIDAKKyNkZWZpbmUgdGhyZWFkSWRJbmRleCAgIDEKKyNkZWZpbmUgY29yZUlkSW5kZXggICAgIDIKKyNkZWZpbmUgcGtnSWRJbmRleCAgICAgIDMKKyNkZWZpbmUgbm9kZUlkSW5kZXggICAgIDQKKwordHlwZWRlZiB1bnNpZ25lZCAqUHJvY0NwdUluZm87CitzdGF0aWMgdW5zaWduZWQgbWF4SW5kZXggPSBwa2dJZEluZGV4OworCisKK3N0YXRpYyBpbnQKK19fa21wX2FmZmluaXR5X2NtcF9Qcm9jQ3B1SW5mb19vc19pZChjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKQoreworICAgIGNvbnN0IHVuc2lnbmVkICphYSA9IChjb25zdCB1bnNpZ25lZCAqKWE7CisgICAgY29uc3QgdW5zaWduZWQgKmJiID0gKGNvbnN0IHVuc2lnbmVkICopYjsKKyAgICBpZiAoYWFbb3NJZEluZGV4XSA8IGJiW29zSWRJbmRleF0pIHJldHVybiAtMTsKKyAgICBpZiAoYWFbb3NJZEluZGV4XSA+IGJiW29zSWRJbmRleF0pIHJldHVybiAxOworICAgIHJldHVybiAwOworfTsKKworCitzdGF0aWMgaW50CitfX2ttcF9hZmZpbml0eV9jbXBfUHJvY0NwdUluZm9fcGh5c19pZChjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKQoreworICAgIHVuc2lnbmVkIGk7CisgICAgY29uc3QgdW5zaWduZWQgKmFhID0gKigoY29uc3QgdW5zaWduZWQgKiopYSk7CisgICAgY29uc3QgdW5zaWduZWQgKmJiID0gKigoY29uc3QgdW5zaWduZWQgKiopYik7CisgICAgZm9yIChpID0gbWF4SW5kZXg7IDsgaS0tKSB7CisgICAgICAgIGlmIChhYVtpXSA8IGJiW2ldKSByZXR1cm4gLTE7CisgICAgICAgIGlmIChhYVtpXSA+IGJiW2ldKSByZXR1cm4gMTsKKyAgICAgICAgaWYgKGkgPT0gb3NJZEluZGV4KSBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKworLy8KKy8vIFBhcnNlIC9wcm9jL2NwdWluZm8gKG9yIGFuIGFsdGVybmF0ZSBmaWxlIGluIHRoZSBzYW1lIGZvcm1hdCkgdG8gb2J0YWluIHRoZQorLy8gYWZmaW5pdHkgbWFwLgorLy8KK3N0YXRpYyBpbnQKK19fa21wX2FmZmluaXR5X2NyZWF0ZV9jcHVpbmZvX21hcChBZGRyVW5zUGFpciAqKmFkZHJlc3Myb3MsIGludCAqbGluZSwKKyAga21wX2kxOG5faWRfdCAqY29uc3QgbXNnX2lkLCBGSUxFICpmKQoreworICAgICphZGRyZXNzMm9zID0gTlVMTDsKKyAgICAqbXNnX2lkID0ga21wX2kxOG5fbnVsbDsKKworICAgIC8vCisgICAgLy8gU2NhbiBvZiB0aGUgZmlsZSwgYW5kIGNvdW50IHRoZSBudW1iZXIgb2YgInByb2Nlc3NvciIgKG9zSWQpIGZpZWxkcywKKyAgICAvLyBhbmQgZmluZCB0aGUgaGlnaGVzdCB2YWx1ZSBvZiA8bj4gZm9yIGEgbm9kZV88bj4gZmllbGQuCisgICAgLy8KKyAgICBjaGFyIGJ1ZlsyNTZdOworICAgIHVuc2lnbmVkIG51bV9yZWNvcmRzID0gMDsKKyAgICB3aGlsZSAoISBmZW9mKGYpKSB7CisgICAgICAgIGJ1ZltzaXplb2YoYnVmKSAtIDFdID0gMTsKKyAgICAgICAgaWYgKCEgZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZikpIHsKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBSZWFkIGVycm9ycyBwcmVzdW1hYmx5IGJlY2F1c2Ugb2YgRU9GCisgICAgICAgICAgICAvLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjaGFyIHMxW10gPSAicHJvY2Vzc29yIjsKKyAgICAgICAgaWYgKHN0cm5jbXAoYnVmLCBzMSwgc2l6ZW9mKHMxKSAtIDEpID09IDApIHsKKyAgICAgICAgICAgIG51bV9yZWNvcmRzKys7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIEZJWE1FIC0gdGhpcyB3aWxsIG1hdGNoICJub2RlXzxuPiA8Z2FyYmFnZT4iCisgICAgICAgIC8vCisgICAgICAgIHVuc2lnbmVkIGxldmVsOworICAgICAgICBpZiAoc3NjYW5mKGJ1ZiwgIm5vZGVfJWQgaWQiLCAmbGV2ZWwpID09IDEpIHsKKyAgICAgICAgICAgIGlmIChub2RlSWRJbmRleCArIGxldmVsID49IG1heEluZGV4KSB7CisgICAgICAgICAgICAgICAgbWF4SW5kZXggPSBub2RlSWRJbmRleCArIGxldmVsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLworICAgIC8vIENoZWNrIGZvciBlbXB0eSBmaWxlIC8gbm8gdmFsaWQgcHJvY2Vzc29yIHJlY29yZHMsIG9yIHRvbyBtYW55LgorICAgIC8vIFRoZSBudW1iZXIgb2YgcmVjb3JkcyBjYW4ndCBleGNlZWQgdGhlIG51bWJlciBvZiB2YWxpZCBiaXRzIGluIHRoZQorICAgIC8vIGFmZmluaXR5IG1hc2suCisgICAgLy8KKyAgICBpZiAobnVtX3JlY29yZHMgPT0gMCkgeworICAgICAgICAqbGluZSA9IDA7CisgICAgICAgICptc2dfaWQgPSBrbXBfaTE4bl9zdHJfTm9Qcm9jUmVjb3JkczsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAobnVtX3JlY29yZHMgPiAodW5zaWduZWQpX19rbXBfeHByb2MpIHsKKyAgICAgICAgKmxpbmUgPSAwOworICAgICAgICAqbXNnX2lkID0ga21wX2kxOG5fc3RyX1Rvb01hbnlQcm9jUmVjb3JkczsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8vCisgICAgLy8gU2V0IHRoZSBmaWxlIHBvaW50ZXIgYmFjayB0byB0aGUgYmVnZ2lubmluZywgc28gdGhhdCB3ZSBjYW4gc2NhbiB0aGUKKyAgICAvLyBmaWxlIGFnYWluLCB0aGlzIHRpbWUgcGVyZm9ybWluZyBhIGZ1bGwgcGFyc2Ugb2YgdGhlIGRhdGEuCisgICAgLy8gQWxsb2NhdGUgYSB2ZWN0b3Igb2YgUHJvY0NwdUluZm8gb2JqZWN0LCB3aGVyZSB3ZSB3aWxsIHBsYWNlIHRoZSBkYXRhLgorICAgIC8vIEFkZGluZyBhbiBleHRyYSBlbGVtZW50IGF0IHRoZSBlbmQgYWxsb3dzIHVzIHRvIHJlbW92ZSBhIGxvdCBvZiBleHRyYQorICAgIC8vIGNoZWNrcyBmb3IgdGVybWluYXRpb24gY29uZGl0aW9ucy4KKyAgICAvLworICAgIGlmIChmc2VlayhmLCAwLCBTRUVLX1NFVCkgIT0gMCkgeworICAgICAgICAqbGluZSA9IDA7CisgICAgICAgICptc2dfaWQgPSBrbXBfaTE4bl9zdHJfQ2FudFJld2luZENwdWluZm87CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIEFsbG9jYXRlIHRoZSBhcnJheSBvZiByZWNvcmRzIHRvIHN0b3JlIHRoZSBwcm9jIGluZm8gaW4uICBUaGUgZHVtbXkKKyAgICAvLyBlbGVtZW50IGF0IHRoZSBlbmQgbWFrZXMgdGhlIGxvZ2ljIGluIGZpbGxpbmcgdGhlbSBvdXQgZWFzaWVyIHRvIGNvZGUuCisgICAgLy8KKyAgICB1bnNpZ25lZCAqKnRocmVhZEluZm8gPSAodW5zaWduZWQgKiopX19rbXBfYWxsb2NhdGUoKG51bV9yZWNvcmRzICsgMSkKKyAgICAgICogc2l6ZW9mKHVuc2lnbmVkICopKTsKKyAgICB1bnNpZ25lZCBpOworICAgIGZvciAoaSA9IDA7IGkgPD0gbnVtX3JlY29yZHM7IGkrKykgeworICAgICAgICB0aHJlYWRJbmZvW2ldID0gKHVuc2lnbmVkICopX19rbXBfYWxsb2NhdGUoKG1heEluZGV4ICsgMSkKKyAgICAgICAgICAqIHNpemVvZih1bnNpZ25lZCkpOworICAgIH0KKworI2RlZmluZSBDTEVBTlVQX1RIUkVBRF9JTkZPIFwKKyAgICBmb3IgKGkgPSAwOyBpIDw9IG51bV9yZWNvcmRzOyBpKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgX19rbXBfZnJlZSh0aHJlYWRJbmZvW2ldKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2ttcF9mcmVlKHRocmVhZEluZm8pOworCisgICAgLy8KKyAgICAvLyBBIHZhbHVlIG9mIFVJTlRfTUFYIG1lYW5zIHRoYXQgd2UgZGlkbid0IGZpbmQgdGhlIGZpZWxkCisgICAgLy8KKyAgICB1bnNpZ25lZCBfX2luZGV4OworCisjZGVmaW5lIElOSVRfUFJPQ19JTkZPKHApIFwKKyAgICBmb3IgKF9faW5kZXggPSAwOyBfX2luZGV4IDw9IG1heEluZGV4OyBfX2luZGV4KyspIHsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKHApW19faW5kZXhdID0gVUlOVF9NQVg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDw9IG51bV9yZWNvcmRzOyBpKyspIHsKKyAgICAgICAgSU5JVF9QUk9DX0lORk8odGhyZWFkSW5mb1tpXSk7CisgICAgfQorCisgICAgdW5zaWduZWQgbnVtX2F2YWlsID0gMDsKKyAgICAqbGluZSA9IDA7CisgICAgd2hpbGUgKCEgZmVvZihmKSkgeworICAgICAgICAvLworICAgICAgICAvLyBDcmVhdGUgYW4gaW5uZXIgc2NvcGluZyBsZXZlbCwgc28gdGhhdCBhbGwgdGhlIGdvdG8gdGFyZ2V0cyBhdCB0aGUKKyAgICAgICAgLy8gZW5kIG9mIHRoZSBsb29wIGFwcGVhciBpbiBhbiBvdXRlciBzY29waW5nIGxldmVsLiAgVGhpcyBhdm9pZHMKKyAgICAgICAgLy8gd2FybmluZ3MgYWJvdXQganVtcGluZyBwYXN0IGFuIGluaXRpYWxpemF0aW9uIHRvIGEgdGFyZ2V0IGluIHRoZQorICAgICAgICAvLyBzYW1lIGJsb2NrLgorICAgICAgICAvLworICAgICAgICB7CisgICAgICAgICAgICBidWZbc2l6ZW9mKGJ1ZikgLSAxXSA9IDE7CisgICAgICAgICAgICBib29sIGxvbmdfbGluZSA9IGZhbHNlOworICAgICAgICAgICAgaWYgKCEgZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZikpIHsKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIFJlYWQgZXJyb3JzIHByZXN1bWFibHkgYmVjYXVzZSBvZiBFT0YKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIHZhbGlkIGRhdGEgaW4gdGhyZWFkSW5mb1tudW1fYXZhaWxdLCB0aGVuIGZha2UKKyAgICAgICAgICAgICAgICAvLyBhIGJsYW5rIGxpbmUgaW4gZW5zdXJlIHRoYXQgdGhlIGxhc3QgYWRkcmVzcyBnZXRzIHBhcnNlZC4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIGJvb2wgdmFsaWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IG1heEluZGV4OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRocmVhZEluZm9bbnVtX2F2YWlsXVtpXSAhPSBVSU5UX01BWCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghIHZhbGlkKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBidWZbMF0gPSAwOworICAgICAgICAgICAgfSBlbHNlIGlmICghYnVmW3NpemVvZihidWYpIC0gMV0pIHsKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIFRoZSBsaW5lIGlzIGxvbmdlciB0aGFuIHRoZSBidWZmZXIuICBTZXQgYSBmbGFnIGFuZCBkb24ndAorICAgICAgICAgICAgICAgIC8vIGVtaXQgYW4gZXJyb3IgaWYgd2Ugd2VyZSBnb2luZyB0byBpZ25vcmUgdGhlIGxpbmUsIGFueXdheS4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIGxvbmdfbGluZSA9IHRydWU7CisKKyNkZWZpbmUgQ0hFQ0tfTElORSBcCisgICAgaWYgKGxvbmdfbGluZSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIENMRUFOVVBfVEhSRUFEX0lORk87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICptc2dfaWQgPSBrbXBfaTE4bl9zdHJfTG9uZ0xpbmVDcHVpbmZvOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiAtMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgKCpsaW5lKSsrOworCisgICAgICAgICAgICBjaGFyIHMxW10gPSAicHJvY2Vzc29yIjsKKyAgICAgICAgICAgIGlmIChzdHJuY21wKGJ1ZiwgczEsIHNpemVvZihzMSkgLSAxKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgQ0hFQ0tfTElORTsKKyAgICAgICAgICAgICAgICBjaGFyICpwID0gc3RyY2hyKGJ1ZiArIHNpemVvZihzMSkgLSAxLCAnOicpOworICAgICAgICAgICAgICAgIHVuc2lnbmVkIHZhbDsKKyAgICAgICAgICAgICAgICBpZiAoKHAgPT0gTlVMTCkgfHwgKHNzY2FuZihwICsgMSwgIiV1XG4iLCAmdmFsKSAhPSAxKSkgZ290byBub192YWw7CisgICAgICAgICAgICAgICAgaWYgKHRocmVhZEluZm9bbnVtX2F2YWlsXVtvc0lkSW5kZXhdICE9IFVJTlRfTUFYKSBnb3RvIGR1cF9maWVsZDsKKyAgICAgICAgICAgICAgICB0aHJlYWRJbmZvW251bV9hdmFpbF1bb3NJZEluZGV4XSA9IHZhbDsKKyNpZiBLTVBfT1NfTElOVVggJiYgVVNFX1NZU0ZTX0lORk8KKyAgICAgICAgICAgICAgICBjaGFyIHBhdGhbMjU2XTsKKyAgICAgICAgICAgICAgICBzbnByaW50ZihwYXRoLCBzaXplb2YocGF0aCksCisgICAgICAgICAgICAgICAgICAgICIvc3lzL2RldmljZXMvc3lzdGVtL2NwdS9jcHUldS90b3BvbG9neS9waHlzaWNhbF9wYWNrYWdlX2lkIiwKKyAgICAgICAgICAgICAgICAgICAgdGhyZWFkSW5mb1tudW1fYXZhaWxdW29zSWRJbmRleF0pOworICAgICAgICAgICAgICAgIF9fa21wX3JlYWRfZnJvbV9maWxlKHBhdGgsICIldSIsICZ0aHJlYWRJbmZvW251bV9hdmFpbF1bcGtnSWRJbmRleF0pOworCisgICAgICAgICAgICAgICAgc25wcmludGYocGF0aCwgc2l6ZW9mKHBhdGgpLAorICAgICAgICAgICAgICAgICAgICAiL3N5cy9kZXZpY2VzL3N5c3RlbS9jcHUvY3B1JXUvdG9wb2xvZ3kvY29yZV9pZCIsCisgICAgICAgICAgICAgICAgICAgIHRocmVhZEluZm9bbnVtX2F2YWlsXVtvc0lkSW5kZXhdKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9yZWFkX2Zyb21fZmlsZShwYXRoLCAiJXUiLCAmdGhyZWFkSW5mb1tudW1fYXZhaWxdW2NvcmVJZEluZGV4XSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisjZWxzZQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2hhciBzMltdID0gInBoeXNpY2FsIGlkIjsKKyAgICAgICAgICAgIGlmIChzdHJuY21wKGJ1ZiwgczIsIHNpemVvZihzMikgLSAxKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgQ0hFQ0tfTElORTsKKyAgICAgICAgICAgICAgICBjaGFyICpwID0gc3RyY2hyKGJ1ZiArIHNpemVvZihzMikgLSAxLCAnOicpOworICAgICAgICAgICAgICAgIHVuc2lnbmVkIHZhbDsKKyAgICAgICAgICAgICAgICBpZiAoKHAgPT0gTlVMTCkgfHwgKHNzY2FuZihwICsgMSwgIiV1XG4iLCAmdmFsKSAhPSAxKSkgZ290byBub192YWw7CisgICAgICAgICAgICAgICAgaWYgKHRocmVhZEluZm9bbnVtX2F2YWlsXVtwa2dJZEluZGV4XSAhPSBVSU5UX01BWCkgZ290byBkdXBfZmllbGQ7CisgICAgICAgICAgICAgICAgdGhyZWFkSW5mb1tudW1fYXZhaWxdW3BrZ0lkSW5kZXhdID0gdmFsOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2hhciBzM1tdID0gImNvcmUgaWQiOworICAgICAgICAgICAgaWYgKHN0cm5jbXAoYnVmLCBzMywgc2l6ZW9mKHMzKSAtIDEpID09IDApIHsKKyAgICAgICAgICAgICAgICBDSEVDS19MSU5FOworICAgICAgICAgICAgICAgIGNoYXIgKnAgPSBzdHJjaHIoYnVmICsgc2l6ZW9mKHMzKSAtIDEsICc6Jyk7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgdmFsOworICAgICAgICAgICAgICAgIGlmICgocCA9PSBOVUxMKSB8fCAoc3NjYW5mKHAgKyAxLCAiJXVcbiIsICZ2YWwpICE9IDEpKSBnb3RvIG5vX3ZhbDsKKyAgICAgICAgICAgICAgICBpZiAodGhyZWFkSW5mb1tudW1fYXZhaWxdW2NvcmVJZEluZGV4XSAhPSBVSU5UX01BWCkgZ290byBkdXBfZmllbGQ7CisgICAgICAgICAgICAgICAgdGhyZWFkSW5mb1tudW1fYXZhaWxdW2NvcmVJZEluZGV4XSA9IHZhbDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyNlbmRpZiAvLyBLTVBfT1NfTElOVVggJiYgVVNFX1NZU0ZTX0lORk8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNoYXIgczRbXSA9ICJ0aHJlYWQgaWQiOworICAgICAgICAgICAgaWYgKHN0cm5jbXAoYnVmLCBzNCwgc2l6ZW9mKHM0KSAtIDEpID09IDApIHsKKyAgICAgICAgICAgICAgICBDSEVDS19MSU5FOworICAgICAgICAgICAgICAgIGNoYXIgKnAgPSBzdHJjaHIoYnVmICsgc2l6ZW9mKHM0KSAtIDEsICc6Jyk7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgdmFsOworICAgICAgICAgICAgICAgIGlmICgocCA9PSBOVUxMKSB8fCAoc3NjYW5mKHAgKyAxLCAiJXVcbiIsICZ2YWwpICE9IDEpKSBnb3RvIG5vX3ZhbDsKKyAgICAgICAgICAgICAgICBpZiAodGhyZWFkSW5mb1tudW1fYXZhaWxdW3RocmVhZElkSW5kZXhdICE9IFVJTlRfTUFYKSBnb3RvIGR1cF9maWVsZDsKKyAgICAgICAgICAgICAgICB0aHJlYWRJbmZvW251bV9hdmFpbF1bdGhyZWFkSWRJbmRleF0gPSB2YWw7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1bnNpZ25lZCBsZXZlbDsKKyAgICAgICAgICAgIGlmIChzc2NhbmYoYnVmLCAibm9kZV8lZCBpZCIsICZsZXZlbCkgPT0gMSkgeworICAgICAgICAgICAgICAgIENIRUNLX0xJTkU7CisgICAgICAgICAgICAgICAgY2hhciAqcCA9IHN0cmNocihidWYgKyBzaXplb2YoczQpIC0gMSwgJzonKTsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCB2YWw7CisgICAgICAgICAgICAgICAgaWYgKChwID09IE5VTEwpIHx8IChzc2NhbmYocCArIDEsICIldVxuIiwgJnZhbCkgIT0gMSkpIGdvdG8gbm9fdmFsOworICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQobm9kZUlkSW5kZXggKyBsZXZlbCA8PSBtYXhJbmRleCk7CisgICAgICAgICAgICAgICAgaWYgKHRocmVhZEluZm9bbnVtX2F2YWlsXVtub2RlSWRJbmRleCArIGxldmVsXSAhPSBVSU5UX01BWCkgZ290byBkdXBfZmllbGQ7CisgICAgICAgICAgICAgICAgdGhyZWFkSW5mb1tudW1fYXZhaWxdW25vZGVJZEluZGV4ICsgbGV2ZWxdID0gdmFsOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gV2UgZGlkbid0IHJlY29nbml6ZSB0aGUgbGVhZGluZyB0b2tlbiBvbiB0aGUgbGluZS4KKyAgICAgICAgICAgIC8vIFRoZXJlIGFyZSBsb3RzIG9mIGxlYWRpbmcgdG9rZW5zIHRoYXQgd2UgZG9uJ3QgcmVjb2duaXplIC0KKyAgICAgICAgICAgIC8vIGlmIHRoZSBsaW5lIGlzbid0IGVtcHR5LCBnbyBvbiB0byB0aGUgbmV4dCBsaW5lLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGlmICgoKmJ1ZiAhPSAwKSAmJiAoKmJ1ZiAhPSAnXG4nKSkgeworICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGxpbmUgaXMgbG9uZ2VyIHRoYW4gdGhlIGJ1ZmZlciwgcmVhZCBjaGFyYWN0ZXJzCisgICAgICAgICAgICAgICAgLy8gdW50aWwgd2UgZmluZCBhIG5ld2xpbmUuCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICBpZiAobG9uZ19saW5lKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBjaDsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCgoY2ggPSBmZ2V0YyhmKSkgIT0gRU9GKSAmJiAoY2ggIT0gJ1xuJykpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIEEgbmV3bGluZSBoYXMgc2lnbmFsbGVkIHRoZSBlbmQgb2YgdGhlIHByb2Nlc3NvciByZWNvcmQuCisgICAgICAgICAgICAvLyBDaGVjayB0aGF0IHRoZXJlIGFyZW4ndCB0b28gbWFueSBwcm9jcyBzcGVjaWZpZWQuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgaWYgKChpbnQpbnVtX2F2YWlsID09IF9fa21wX3hwcm9jKSB7CisgICAgICAgICAgICAgICAgQ0xFQU5VUF9USFJFQURfSU5GTzsKKyAgICAgICAgICAgICAgICAqbXNnX2lkID0ga21wX2kxOG5fc3RyX1Rvb01hbnlFbnRyaWVzOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIENoZWNrIGZvciBtaXNzaW5nIGZpZWxkcy4gIFRoZSBvc0lkIGZpZWxkIG11c3QgYmUgdGhlcmUsIGFuZCB3ZQorICAgICAgICAgICAgLy8gY3VycmVudGx5IHJlcXVpcmUgdGhhdCB0aGUgcGh5c2ljYWwgaWQgZmllbGQgaXMgc3BlY2lmaWVkLCBhbHNvLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGlmICh0aHJlYWRJbmZvW251bV9hdmFpbF1bb3NJZEluZGV4XSA9PSBVSU5UX01BWCkgeworICAgICAgICAgICAgICAgIENMRUFOVVBfVEhSRUFEX0lORk87CisgICAgICAgICAgICAgICAgKm1zZ19pZCA9IGttcF9pMThuX3N0cl9NaXNzaW5nUHJvY0ZpZWxkOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0aHJlYWRJbmZvWzBdW3BrZ0lkSW5kZXhdID09IFVJTlRfTUFYKSB7CisgICAgICAgICAgICAgICAgQ0xFQU5VUF9USFJFQURfSU5GTzsKKyAgICAgICAgICAgICAgICAqbXNnX2lkID0ga21wX2kxOG5fc3RyX01pc3NpbmdQaHlzaWNhbElERmllbGQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gU2tpcCB0aGlzIHByb2MgaWYgaXQgaXMgbm90IGluY2x1ZGVkIGluIHRoZSBtYWNoaW5lIG1vZGVsLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGlmICghIEtNUF9DUFVfSVNTRVQodGhyZWFkSW5mb1tudW1fYXZhaWxdW29zSWRJbmRleF0sIGZ1bGxNYXNrKSkgeworICAgICAgICAgICAgICAgIElOSVRfUFJPQ19JTkZPKHRocmVhZEluZm9bbnVtX2F2YWlsXSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBXZSBoYXZlIGEgc3VjY2Vzc2Z1bCBwYXJzZSBvZiB0aGlzIHByb2MncyBpbmZvLgorICAgICAgICAgICAgLy8gSW5jcmVtZW50IHRoZSBjb3VudGVyLCBhbmQgcHJlcGFyZSBmb3IgdGhlIG5leHQgcHJvYy4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBudW1fYXZhaWwrKzsKKyAgICAgICAgICAgIEtNUF9BU1NFUlQobnVtX2F2YWlsIDw9IG51bV9yZWNvcmRzKTsKKyAgICAgICAgICAgIElOSVRfUFJPQ19JTkZPKHRocmVhZEluZm9bbnVtX2F2YWlsXSk7CisgICAgICAgIH0KKyAgICAgICAgY29udGludWU7CisKKyAgICAgICAgbm9fdmFsOgorICAgICAgICBDTEVBTlVQX1RIUkVBRF9JTkZPOworICAgICAgICAqbXNnX2lkID0ga21wX2kxOG5fc3RyX01pc3NpbmdWYWxDcHVpbmZvOworICAgICAgICByZXR1cm4gLTE7CisKKyAgICAgICAgZHVwX2ZpZWxkOgorICAgICAgICBDTEVBTlVQX1RIUkVBRF9JTkZPOworICAgICAgICAqbXNnX2lkID0ga21wX2kxOG5fc3RyX0R1cGxpY2F0ZUZpZWxkQ3B1aW5mbzsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICAqbGluZSA9IDA7CisKKyMgaWYgS01QX01JQyAmJiBSRURVQ0VfVEVBTV9TSVpFCisgICAgdW5zaWduZWQgdGVhbVNpemUgPSAwOworIyBlbmRpZiAvLyBLTVBfTUlDICYmIFJFRFVDRV9URUFNX1NJWkUKKworICAgIC8vIGNoZWNrIGZvciBudW1fcmVjb3JkcyA9PSBfX2ttcF94cHJvYyA/Pz8KKworICAgIC8vCisgICAgLy8gSWYgdGhlcmUncyBvbmx5IG9uZSB0aHJlYWQgY29udGV4dCB0byBiaW5kIHRvLCBmb3JtIGFuIEFkZHJlc3Mgb2JqZWN0CisgICAgLy8gd2l0aCBkZXB0aCAxIGFuZCByZXR1cm4gaW1tZWRpYXRlbHkgKG9yLCBpZiBhZmZpbml0eSBpcyBvZmYsIHNldAorICAgIC8vIGFkZHJlc3Myb3MgdG8gTlVMTCBhbmQgcmV0dXJuKS4KKyAgICAvLworICAgIC8vIElmIGl0IGlzIGNvbmZpZ3VyZWQgdG8gb21pdCB0aGUgcGFja2FnZSBsZXZlbCB3aGVuIHRoZXJlIGlzIG9ubHkgYQorICAgIC8vIHNpbmdsZSBwYWNrYWdlLCB0aGUgbG9naWMgYXQgdGhlIGVuZCBvZiB0aGlzIHJvdXRpbmUgd29uJ3Qgd29yayBpZgorICAgIC8vIHRoZXJlIGlzIG9ubHkgYSBzaW5nbGUgdGhyZWFkIC0gaXQgd291bGQgdHJ5IHRvIGZvcm0gYW4gQWRkcmVzcworICAgIC8vIG9iamVjdCB3aXRoIGRlcHRoIDAuCisgICAgLy8KKyAgICBLTVBfQVNTRVJUKG51bV9hdmFpbCA+IDApOworICAgIEtNUF9BU1NFUlQobnVtX2F2YWlsIDw9IG51bV9yZWNvcmRzKTsKKyAgICBpZiAobnVtX2F2YWlsID09IDEpIHsKKyAgICAgICAgX19rbXBfbmNvcmVzID0gMTsKKyAgICAgICAgX19rbXBfblRocmVhZHNQZXJDb3JlID0gbkNvcmVzUGVyUGtnID0gblBhY2thZ2VzID0gMTsKKyAgICAgICAgX19rbXBfaHRfZW5hYmxlZCA9IEZBTFNFOworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICAgICAgaWYgKCEgS01QX0FGRklOSVRZX0NBUEFCTEUoKSkgeworICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oQWZmTm90Q2FwYWJsZVVzZUNwdWluZm8sICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKEF2YWlsYWJsZU9TUHJvYywgIktNUF9BRkZJTklUWSIsIF9fa21wX2F2YWlsX3Byb2MpOworICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oVW5pZm9ybSwgIktNUF9BRkZJTklUWSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgY2hhciBidWZbS01QX0FGRklOX01BU0tfUFJJTlRfTEVOXTsKKyAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9wcmludF9tYXNrKGJ1ZiwgS01QX0FGRklOX01BU0tfUFJJTlRfTEVOLAorICAgICAgICAgICAgICAgICAgZnVsbE1hc2spOworICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oQWZmQ2FwYWJsZVVzZUNwdWluZm8sICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfcmVzcGVjdF9tYXNrKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oSW5pdE9TUHJvY1NldFJlc3BlY3QsICJLTVBfQUZGSU5JVFkiLCBidWYpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oSW5pdE9TUHJvY1NldE5vdFJlc3BlY3QsICJLTVBfQUZGSU5JVFkiLCBidWYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKEF2YWlsYWJsZU9TUHJvYywgIktNUF9BRkZJTklUWSIsIF9fa21wX2F2YWlsX3Byb2MpOworICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oVW5pZm9ybSwgIktNUF9BRkZJTklUWSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IGluZGV4OworICAgICAgICAgICAga21wX3N0cl9idWZfdCBidWY7CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX2luaXQoJmJ1Zik7CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCZidWYsICIxIik7CisgICAgICAgICAgICBmb3IgKGluZGV4ID0gbWF4SW5kZXggLSAxOyBpbmRleCA+IHBrZ0lkSW5kZXg7IGluZGV4LS0pIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCZidWYsICIgeCAxIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBLTVBfSU5GT1JNKFRvcG9sb2d5RXh0cmEsICJLTVBfQUZGSU5JVFkiLCBidWYuc3RyLCAxLCAxLCAxKTsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfZnJlZSgmYnVmKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUpIHsKKyAgICAgICAgICAgIENMRUFOVVBfVEhSRUFEX0lORk87CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgICphZGRyZXNzMm9zID0gKEFkZHJVbnNQYWlyKilfX2ttcF9hbGxvY2F0ZShzaXplb2YoQWRkclVuc1BhaXIpKTsKKyAgICAgICAgQWRkcmVzcyBhZGRyKDEpOworICAgICAgICBhZGRyLmxhYmVsc1swXSA9IHRocmVhZEluZm9bMF1bcGtnSWRJbmRleF07CisgICAgICAgICgqYWRkcmVzczJvcylbMF0gPSBBZGRyVW5zUGFpcihhZGRyLCB0aHJlYWRJbmZvWzBdW29zSWRJbmRleF0pOworCisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscyA8IDApIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9wcmludF90b3BvbG9neSgqYWRkcmVzczJvcywgMSwgMSwgMCwgLTEsIC0xKTsKKyAgICAgICAgfQorCisgICAgICAgIENMRUFOVVBfVEhSRUFEX0lORk87CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIC8vCisgICAgLy8gU29ydCB0aGUgdGhyZWFkSW5mbyB0YWJsZSBieSBwaHlzaWNhbCBJZC4KKyAgICAvLworICAgIHFzb3J0KHRocmVhZEluZm8sIG51bV9hdmFpbCwgc2l6ZW9mKCp0aHJlYWRJbmZvKSwKKyAgICAgIF9fa21wX2FmZmluaXR5X2NtcF9Qcm9jQ3B1SW5mb19waHlzX2lkKTsKKworICAgIC8vCisgICAgLy8gVGhlIHRhYmxlIGlzIG5vdyBzb3J0ZWQgYnkgcGtnSWQgLyBjb3JlSWQgLyB0aHJlYWRJZCwgYnV0IHdlIHJlYWxseQorICAgIC8vIGRvbid0IGtub3cgdGhlIHJhZGl4IG9mIGFueSBvZiB0aGUgZmllbGRzLiAgcGtnSWQncyBtYXkgYmUgc3BhcnNlbHkKKyAgICAvLyBhc3NpZ25lZCBhbW9uZyB0aGUgY2hpcHMgb24gYSBzeXN0ZW0uICBBbHRob3VnaCBjb3JlSWQncyBhcmUgdXN1YWxseQorICAgIC8vIGFzc2lnbmVkIFswIC4uIGNvcmVzUGVyUGtnLTFdIGFuZCB0aHJlYWRJZCdzIGFyZSB1c3VhbGx5IGFzc2lnbmVkCisgICAgLy8gWzAuLnRocmVhZHNQZXJDb3JlLTFdLCB3ZSBkb24ndCB3YW50IHRvIG1ha2UgYW55IHN1Y2ggYXNzdW1wdGlvbnMuCisgICAgLy8KKyAgICAvLyBGb3IgdGhhdCBtYXR0ZXIsIHdlIGRvbid0IGtub3cgd2hhdCBjb3Jlc1BlclBrZyBhbmQgdGhyZWFkc1BlckNvcmUKKyAgICAvLyAob3IgdGhlIHRvdGFsICMgcGFja2FnZXMpIGFyZSBhdCB0aGlzIHBvaW50IC0gd2Ugd2FudCB0byBkZXRlcm1pbmUKKyAgICAvLyB0aGF0IG5vdy4gIFdlIG9ubHkgaGF2ZSBhbiB1cHBlciBib3VuZCBvbiB0aGUgZmlyc3QgdHdvIGZpZ3VyZXMuCisgICAgLy8KKyAgICB1bnNpZ25lZCAqY291bnRzID0gKHVuc2lnbmVkICopX19rbXBfYWxsb2NhdGUoKG1heEluZGV4ICsgMSkKKyAgICAgICogc2l6ZW9mKHVuc2lnbmVkKSk7CisgICAgdW5zaWduZWQgKm1heEN0ID0gKHVuc2lnbmVkICopX19rbXBfYWxsb2NhdGUoKG1heEluZGV4ICsgMSkKKyAgICAgICogc2l6ZW9mKHVuc2lnbmVkKSk7CisgICAgdW5zaWduZWQgKnRvdGFscyA9ICh1bnNpZ25lZCAqKV9fa21wX2FsbG9jYXRlKChtYXhJbmRleCArIDEpCisgICAgICAqIHNpemVvZih1bnNpZ25lZCkpOworICAgIHVuc2lnbmVkICpsYXN0SWQgPSAodW5zaWduZWQgKilfX2ttcF9hbGxvY2F0ZSgobWF4SW5kZXggKyAxKQorICAgICAgKiBzaXplb2YodW5zaWduZWQpKTsKKworICAgIGJvb2wgYXNzaWduX3RocmVhZF9pZHMgPSBmYWxzZTsKKyAgICB1bnNpZ25lZCB0aHJlYWRJZEN0OworICAgIHVuc2lnbmVkIGluZGV4OworCisgICAgcmVzdGFydF9yYWRpeF9jaGVjazoKKyAgICB0aHJlYWRJZEN0ID0gMDsKKworICAgIC8vCisgICAgLy8gSW5pdGlhbGl6ZSB0aGUgY291bnRlciBhcnJheXMgd2l0aCBkYXRhIGZyb20gdGhyZWFkSW5mb1swXS4KKyAgICAvLworICAgIGlmIChhc3NpZ25fdGhyZWFkX2lkcykgeworICAgICAgICBpZiAodGhyZWFkSW5mb1swXVt0aHJlYWRJZEluZGV4XSA9PSBVSU5UX01BWCkgeworICAgICAgICAgICAgdGhyZWFkSW5mb1swXVt0aHJlYWRJZEluZGV4XSA9IHRocmVhZElkQ3QrKzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh0aHJlYWRJZEN0IDw9IHRocmVhZEluZm9bMF1bdGhyZWFkSWRJbmRleF0pIHsKKyAgICAgICAgICAgIHRocmVhZElkQ3QgPSB0aHJlYWRJbmZvWzBdW3RocmVhZElkSW5kZXhdICsgMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPD0gbWF4SW5kZXg7IGluZGV4KyspIHsKKyAgICAgICAgY291bnRzW2luZGV4XSA9IDE7CisgICAgICAgIG1heEN0W2luZGV4XSA9IDE7CisgICAgICAgIHRvdGFsc1tpbmRleF0gPSAxOworICAgICAgICBsYXN0SWRbaW5kZXhdID0gdGhyZWFkSW5mb1swXVtpbmRleF07OworICAgIH0KKworICAgIC8vCisgICAgLy8gUnVuIHRocm91Z2ggdGhlIHJlc3Qgb2YgdGhlIE9TIHByb2NzLgorICAgIC8vCisgICAgZm9yIChpID0gMTsgaSA8IG51bV9hdmFpbDsgaSsrKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIEZpbmQgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgaW5kZXggd2hvc2UgaWQgZGlmZmVycworICAgICAgICAvLyBmcm9tIHRoZSBpZCBmb3IgdGhlIHByZXZpb3VzIE9TIHByb2MuCisgICAgICAgIC8vCisgICAgICAgIGZvciAoaW5kZXggPSBtYXhJbmRleDsgaW5kZXggPj0gdGhyZWFkSWRJbmRleDsgaW5kZXgtLSkgeworICAgICAgICAgICAgaWYgKGFzc2lnbl90aHJlYWRfaWRzICYmIChpbmRleCA9PSB0aHJlYWRJZEluZGV4KSkgeworICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gQXV0by1hc3NpZ24gdGhlIHRocmVhZCBpZCBmaWVsZCBpZiBpdCB3YXNuJ3Qgc3BlY2lmaWVkLgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgaWYgKHRocmVhZEluZm9baV1bdGhyZWFkSWRJbmRleF0gPT0gVUlOVF9NQVgpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyZWFkSW5mb1tpXVt0aHJlYWRJZEluZGV4XSA9IHRocmVhZElkQ3QrKzsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIEFwYXJyZW50bHkgdGhlIHRocmVhZCBpZCBmaWVsZCB3YXMgc3BlY2lmaWVkIGZvciBzb21lCisgICAgICAgICAgICAgICAgLy8gZW50cmllcyBhbmQgbm90IG90aGVycy4gIFN0YXJ0IHRoZSB0aHJlYWQgaWQgY291bnRlcgorICAgICAgICAgICAgICAgIC8vIG9mZiBhdCB0aGUgbmV4dCBoaWdoZXIgdGhyZWFkIGlkLgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgZWxzZSBpZiAodGhyZWFkSWRDdCA8PSB0aHJlYWRJbmZvW2ldW3RocmVhZElkSW5kZXhdKSB7CisgICAgICAgICAgICAgICAgICAgIHRocmVhZElkQ3QgPSB0aHJlYWRJbmZvW2ldW3RocmVhZElkSW5kZXhdICsgMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodGhyZWFkSW5mb1tpXVtpbmRleF0gIT0gbGFzdElkW2luZGV4XSkgeworICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gUnVuIHRocm91Z2ggYWxsIGluZGljZXMgd2hpY2ggYXJlIGxlc3Mgc2lnbmlmaWNhbnQsCisgICAgICAgICAgICAgICAgLy8gYW5kIHJlc2V0IHRoZSBjb3VudHMgdG8gMS4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIEF0IGFsbCBsZXZlbHMgdXAgdG8gYW5kIGluY2x1ZGluZyBpbmRleCwgd2UgbmVlZCB0bworICAgICAgICAgICAgICAgIC8vIGluY3JlbWVudCB0aGUgdG90YWxzIGFuZCByZWNvcmQgdGhlIGxhc3QgaWQuCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbmRleDI7CisgICAgICAgICAgICAgICAgZm9yIChpbmRleDIgPSB0aHJlYWRJZEluZGV4OyBpbmRleDIgPCBpbmRleDsgaW5kZXgyKyspIHsKKyAgICAgICAgICAgICAgICAgICAgdG90YWxzW2luZGV4Ml0rKzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvdW50c1tpbmRleDJdID4gbWF4Q3RbaW5kZXgyXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWF4Q3RbaW5kZXgyXSA9IGNvdW50c1tpbmRleDJdOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNvdW50c1tpbmRleDJdID0gMTsKKyAgICAgICAgICAgICAgICAgICAgbGFzdElkW2luZGV4Ml0gPSB0aHJlYWRJbmZvW2ldW2luZGV4Ml07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvdW50c1tpbmRleF0rKzsKKyAgICAgICAgICAgICAgICB0b3RhbHNbaW5kZXhdKys7CisgICAgICAgICAgICAgICAgbGFzdElkW2luZGV4XSA9IHRocmVhZEluZm9baV1baW5kZXhdOworCisgICAgICAgICAgICAgICAgaWYgKGFzc2lnbl90aHJlYWRfaWRzICYmIChpbmRleCA+IHRocmVhZElkSW5kZXgpKSB7CisKKyMgaWYgS01QX01JQyAmJiBSRURVQ0VfVEVBTV9TSVpFCisgICAgICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBkZWZhdWx0IHRlYW0gc2l6ZSBpcyB0aGUgdG90YWwgI3RocmVhZHMgaW4gdGhlIG1hY2hpbmUKKyAgICAgICAgICAgICAgICAgICAgLy8gbWludXMgMSB0aHJlYWQgZm9yIGV2ZXJ5IGNvcmUgdGhhdCBoYXMgMyBvciBtb3JlIHRocmVhZHMuCisgICAgICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgICAgIHRlYW1TaXplICs9ICggdGhyZWFkSWRDdCA8PSAyICkgPyAoIHRocmVhZElkQ3QgKSA6ICggdGhyZWFkSWRDdCAtIDEgKTsKKyMgZW5kaWYgLy8gS01QX01JQyAmJiBSRURVQ0VfVEVBTV9TSVpFCisKKyAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgLy8gUmVzdGFydCB0aGUgdGhyZWFkIGNvdW50ZXIsIGFzIHdlIGFyZSBvbiBhIG5ldyBjb3JlLgorICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICB0aHJlYWRJZEN0ID0gMDsKKworICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICAvLyBBdXRvLWFzc2lnbiB0aGUgdGhyZWFkIGlkIGZpZWxkIGlmIGl0IHdhc24ndCBzcGVjaWZpZWQuCisgICAgICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgICAgIGlmICh0aHJlYWRJbmZvW2ldW3RocmVhZElkSW5kZXhdID09IFVJTlRfTUFYKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRJbmZvW2ldW3RocmVhZElkSW5kZXhdID0gdGhyZWFkSWRDdCsrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgLy8gQXBhcnJlbnRseSB0aGUgdGhyZWFkIGlkIGZpZWxkIHdhcyBzcGVjaWZpZWQgZm9yIHNvbWUKKyAgICAgICAgICAgICAgICAgICAgLy8gZW50cmllcyBhbmQgbm90IG90aGVycy4gIFN0YXJ0IHRoZSB0aHJlYWQgaWQgY291bnRlcgorICAgICAgICAgICAgICAgICAgICAvLyBvZmYgYXQgdGhlIG5leHQgaGlnaGVyIHRocmVhZCBpZC4KKyAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodGhyZWFkSWRDdCA8PSB0aHJlYWRJbmZvW2ldW3RocmVhZElkSW5kZXhdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRJZEN0ID0gdGhyZWFkSW5mb1tpXVt0aHJlYWRJZEluZGV4XSArIDE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGluZGV4IDwgdGhyZWFkSWRJbmRleCkgeworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIElmIHRocmVhZCBpZHMgd2VyZSBzcGVjaWZpZWQsIGl0IGlzIGFuIGVycm9yIGlmIHRoZXkgYXJlIG5vdAorICAgICAgICAgICAgLy8gdW5pcXVlLiAgQWxzbywgY2hlY2sgdGhhdCB3ZSB3YXZlbid0IGFscmVhZHkgcmVzdGFydGVkIHRoZQorICAgICAgICAgICAgLy8gbG9vcCAodG8gYmUgc2FmZSAtIHNob3VsZG4ndCBuZWVkIHRvKS4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBpZiAoKHRocmVhZEluZm9baV1bdGhyZWFkSWRJbmRleF0gIT0gVUlOVF9NQVgpCisgICAgICAgICAgICAgIHx8IGFzc2lnbl90aHJlYWRfaWRzKSB7CisgICAgICAgICAgICAgICAgX19rbXBfZnJlZShsYXN0SWQpOworICAgICAgICAgICAgICAgIF9fa21wX2ZyZWUodG90YWxzKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9mcmVlKG1heEN0KTsKKyAgICAgICAgICAgICAgICBfX2ttcF9mcmVlKGNvdW50cyk7CisgICAgICAgICAgICAgICAgQ0xFQU5VUF9USFJFQURfSU5GTzsKKyAgICAgICAgICAgICAgICAqbXNnX2lkID0ga21wX2kxOG5fc3RyX1BoeXNpY2FsSURzTm90VW5pcXVlOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIElmIHRoZSB0aHJlYWQgaWRzIHdlcmUgbm90IHNwZWNpZmllZCBhbmQgd2Ugc2VlIGVudHJpZXMKKyAgICAgICAgICAgIC8vIGVudHJpZXMgdGhhdCBhcmUgZHVwbGljYXRlcywgc3RhcnQgdGhlIGxvb3Agb3ZlciBhbmQKKyAgICAgICAgICAgIC8vIGFzc2lnbiB0aGUgdGhyZWFkIGlkcyBtYW51YWxseS4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBhc3NpZ25fdGhyZWFkX2lkcyA9IHRydWU7CisgICAgICAgICAgICBnb3RvIHJlc3RhcnRfcmFkaXhfY2hlY2s7CisgICAgICAgIH0KKyAgICB9CisKKyMgaWYgS01QX01JQyAmJiBSRURVQ0VfVEVBTV9TSVpFCisgICAgLy8KKyAgICAvLyBUaGUgZGVmYXVsdCB0ZWFtIHNpemUgaXMgdGhlIHRvdGFsICN0aHJlYWRzIGluIHRoZSBtYWNoaW5lCisgICAgLy8gbWludXMgMSB0aHJlYWQgZm9yIGV2ZXJ5IGNvcmUgdGhhdCBoYXMgMyBvciBtb3JlIHRocmVhZHMuCisgICAgLy8KKyAgICB0ZWFtU2l6ZSArPSAoIHRocmVhZElkQ3QgPD0gMiApID8gKCB0aHJlYWRJZEN0ICkgOiAoIHRocmVhZElkQ3QgLSAxICk7CisjIGVuZGlmIC8vIEtNUF9NSUMgJiYgUkVEVUNFX1RFQU1fU0laRQorCisgICAgZm9yIChpbmRleCA9IHRocmVhZElkSW5kZXg7IGluZGV4IDw9IG1heEluZGV4OyBpbmRleCsrKSB7CisgICAgICAgIGlmIChjb3VudHNbaW5kZXhdID4gbWF4Q3RbaW5kZXhdKSB7CisgICAgICAgICAgICBtYXhDdFtpbmRleF0gPSBjb3VudHNbaW5kZXhdOworICAgICAgICB9CisgICAgfQorCisgICAgX19rbXBfblRocmVhZHNQZXJDb3JlID0gbWF4Q3RbdGhyZWFkSWRJbmRleF07CisgICAgbkNvcmVzUGVyUGtnID0gbWF4Q3RbY29yZUlkSW5kZXhdOworICAgIG5QYWNrYWdlcyA9IHRvdGFsc1twa2dJZEluZGV4XTsKKworICAgIC8vCisgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBtYWNoaW5lIHRvcG9sb2d5IGlzIHVuaWZvcm0KKyAgICAvLworICAgIHVuc2lnbmVkIHByb2QgPSB0b3RhbHNbbWF4SW5kZXhdOworICAgIGZvciAoaW5kZXggPSB0aHJlYWRJZEluZGV4OyBpbmRleCA8IG1heEluZGV4OyBpbmRleCsrKSB7CisgICAgICAgcHJvZCAqPSBtYXhDdFtpbmRleF07CisgICAgfQorICAgIGJvb2wgdW5pZm9ybSA9IChwcm9kID09IHRvdGFsc1t0aHJlYWRJZEluZGV4XSk7CisKKyAgICAvLworICAgIC8vIFdoZW4gYWZmaW5pdHkgaXMgb2ZmLCB0aGlzIHJvdXRpbmUgd2lsbCBzdGlsbCBiZSBjYWxsZWQgdG8gc2V0CisgICAgLy8gX19rbXBfaHRfZW5hYmxlZCwgJiBfX2ttcF9uY29yZXMsIGFzIHdlbGwgYXMgX19rbXBfblRocmVhZHNQZXJDb3JlLAorICAgIC8vIG5Db3Jlc1BlclBrZywgJiBuUGFja2FnZXMuICBNYWtlIHN1cmUgYWxsIHRoZXNlIHZhcnMgYXJlIHNldAorICAgIC8vIGNvcnJlY3RseSwgYW5kIHJldHVybiBub3cgaWYgYWZmaW5pdHkgaXMgbm90IGVuYWJsZWQuCisgICAgLy8KKyAgICBfX2ttcF9odF9lbmFibGVkID0gKG1heEN0W3RocmVhZElkSW5kZXhdID4gMSk7IC8vIHRocmVhZHMgcGVyIGNvcmUgPiAxCisgICAgX19rbXBfbmNvcmVzID0gdG90YWxzW2NvcmVJZEluZGV4XTsKKworICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgIGlmICghIEtNUF9BRkZJTklUWV9DQVBBQkxFKCkpIHsKKyAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKEFmZk5vdENhcGFibGVVc2VDcHVpbmZvLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgICAgICAgICAgS01QX0lORk9STShBdmFpbGFibGVPU1Byb2MsICJLTVBfQUZGSU5JVFkiLCBfX2ttcF9hdmFpbF9wcm9jKTsKKyAgICAgICAgICAgICAgICBpZiAodW5pZm9ybSkgeworICAgICAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKFVuaWZvcm0sICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKE5vblVuaWZvcm0sICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBjaGFyIGJ1ZltLTVBfQUZGSU5fTUFTS19QUklOVF9MRU5dOworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJpbnRfbWFzayhidWYsIEtNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTiwgZnVsbE1hc2spOworICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oQWZmQ2FwYWJsZVVzZUNwdWluZm8sICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfcmVzcGVjdF9tYXNrKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oSW5pdE9TUHJvY1NldFJlc3BlY3QsICJLTVBfQUZGSU5JVFkiLCBidWYpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oSW5pdE9TUHJvY1NldE5vdFJlc3BlY3QsICJLTVBfQUZGSU5JVFkiLCBidWYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKEF2YWlsYWJsZU9TUHJvYywgIktNUF9BRkZJTklUWSIsIF9fa21wX2F2YWlsX3Byb2MpOworICAgICAgICAgICAgICAgIGlmICh1bmlmb3JtKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oVW5pZm9ybSwgIktNUF9BRkZJTklUWSIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oTm9uVW5pZm9ybSwgIktNUF9BRkZJTklUWSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBrbXBfc3RyX2J1Zl90IGJ1ZjsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9pbml0KCZidWYpOworCisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoJmJ1ZiwgIiVkIiwgdG90YWxzW21heEluZGV4XSk7CisgICAgICAgIGZvciAoaW5kZXggPSBtYXhJbmRleCAtIDE7IGluZGV4ID49IHBrZ0lkSW5kZXg7IGluZGV4LS0pIHsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoJmJ1ZiwgIiB4ICVkIiwgbWF4Q3RbaW5kZXhdKTsKKyAgICAgICAgfQorICAgICAgICBLTVBfSU5GT1JNKFRvcG9sb2d5RXh0cmEsICJLTVBfQUZGSU5JVFkiLCBidWYuc3RyLCAgbWF4Q3RbY29yZUlkSW5kZXhdLAorICAgICAgICAgIG1heEN0W3RocmVhZElkSW5kZXhdLCBfX2ttcF9uY29yZXMpOworCisgICAgICAgIF9fa21wX3N0cl9idWZfZnJlZSgmYnVmKTsKKyAgICB9CisKKyMgaWYgS01QX01JQyAmJiBSRURVQ0VfVEVBTV9TSVpFCisgICAgLy8KKyAgICAvLyBTZXQgdGhlIGRlZmF1bHQgdGVhbSBzaXplLgorICAgIC8vCisgICAgaWYgKChfX2ttcF9kZmx0X3RlYW1fbnRoID09IDApICYmICh0ZWFtU2l6ZSA+IDApKSB7CisgICAgICAgIF9fa21wX2RmbHRfdGVhbV9udGggPSB0ZWFtU2l6ZTsKKyAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfYWZmaW5pdHlfY3JlYXRlX2NwdWluZm9fbWFwOiBzZXR0aW5nIF9fa21wX2RmbHRfdGVhbV9udGggPSAlZFxuIiwKKyAgICAgICAgICBfX2ttcF9kZmx0X3RlYW1fbnRoKSk7CisgICAgfQorIyBlbmRpZiAvLyBLTVBfTUlDICYmIFJFRFVDRV9URUFNX1NJWkUKKworICAgIGlmIChfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUpIHsKKyAgICAgICAgX19rbXBfZnJlZShsYXN0SWQpOworICAgICAgICBfX2ttcF9mcmVlKHRvdGFscyk7CisgICAgICAgIF9fa21wX2ZyZWUobWF4Q3QpOworICAgICAgICBfX2ttcF9mcmVlKGNvdW50cyk7CisgICAgICAgIENMRUFOVVBfVEhSRUFEX0lORk87CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8vCisgICAgLy8gQ291bnQgdGhlIG51bWJlciBvZiBsZXZlbHMgd2hpY2ggaGF2ZSBtb3JlIG5vZGVzIGF0IHRoYXQgbGV2ZWwgdGhhbgorICAgIC8vIGF0IHRoZSBwYXJlbnQncyBsZXZlbCAod2l0aCB0aGVyZSBiZWluZyBhbiBpbXBsaWNpdCByb290IG5vZGUgb2YKKyAgICAvLyB0aGUgdG9wIGxldmVsKS4gIFRoaXMgaXMgZXF1aXZhbGVudCB0byBzYXlpbmcgdGhhdCB0aGVyZSBpcyBhdCBsZWFzdAorICAgIC8vIG9uZSBub2RlIGF0IHRoaXMgbGV2ZWwgd2hpY2ggaGFzIGEgc2libGluZy4gIFRoZXNlIGxldmVscyBhcmUgaW4gdGhlCisgICAgLy8gbWFwLCBhbmQgdGhlIHBhY2thZ2UgbGV2ZWwgaXMgYWx3YXlzIGluIHRoZSBtYXAuCisgICAgLy8KKyAgICBib29sICppbk1hcCA9IChib29sICopX19rbXBfYWxsb2NhdGUoKG1heEluZGV4ICsgMSkgKiBzaXplb2YoYm9vbCkpOworICAgIGludCBsZXZlbCA9IDA7CisgICAgZm9yIChpbmRleCA9IHRocmVhZElkSW5kZXg7IGluZGV4IDwgbWF4SW5kZXg7IGluZGV4KyspIHsKKyAgICAgICAgS01QX0FTU0VSVCh0b3RhbHNbaW5kZXhdID49IHRvdGFsc1tpbmRleCArIDFdKTsKKyAgICAgICAgaW5NYXBbaW5kZXhdID0gKHRvdGFsc1tpbmRleF0gPiB0b3RhbHNbaW5kZXggKyAxXSk7CisgICAgfQorICAgIGluTWFwW21heEluZGV4XSA9ICh0b3RhbHNbbWF4SW5kZXhdID4gMSk7CisgICAgaW5NYXBbcGtnSWRJbmRleF0gPSB0cnVlOworCisgICAgaW50IGRlcHRoID0gMDsKKyAgICBmb3IgKGluZGV4ID0gdGhyZWFkSWRJbmRleDsgaW5kZXggPD0gbWF4SW5kZXg7IGluZGV4KyspIHsKKyAgICAgICAgaWYgKGluTWFwW2luZGV4XSkgeworICAgICAgICAgICAgZGVwdGgrKzsKKyAgICAgICAgfQorICAgIH0KKyAgICBLTVBfQVNTRVJUKGRlcHRoID4gMCk7CisKKyAgICAvLworICAgIC8vIENvbnN0cnVjdCB0aGUgZGF0YSBzdHJ1Y3R1cmUgdGhhdCBpcyB0byBiZSByZXR1cm5lZC4KKyAgICAvLworICAgICphZGRyZXNzMm9zID0gKEFkZHJVbnNQYWlyKikKKyAgICAgIF9fa21wX2FsbG9jYXRlKHNpemVvZihBZGRyVW5zUGFpcikgKiBudW1fYXZhaWwpOworICAgIGludCBwa2dMZXZlbCA9IC0xOworICAgIGludCBjb3JlTGV2ZWwgPSAtMTsKKyAgICBpbnQgdGhyZWFkTGV2ZWwgPSAtMTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBudW1fYXZhaWw7ICsraSkgeworICAgICAgICBBZGRyZXNzIGFkZHIoZGVwdGgpOworICAgICAgICB1bnNpZ25lZCBvcyA9IHRocmVhZEluZm9baV1bb3NJZEluZGV4XTsKKyAgICAgICAgaW50IHNyY19pbmRleDsKKyAgICAgICAgaW50IGRzdF9pbmRleCA9IDA7CisKKyAgICAgICAgZm9yIChzcmNfaW5kZXggPSBtYXhJbmRleDsgc3JjX2luZGV4ID49IHRocmVhZElkSW5kZXg7IHNyY19pbmRleC0tKSB7CisgICAgICAgICAgICBpZiAoISBpbk1hcFtzcmNfaW5kZXhdKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhZGRyLmxhYmVsc1tkc3RfaW5kZXhdID0gdGhyZWFkSW5mb1tpXVtzcmNfaW5kZXhdOworICAgICAgICAgICAgaWYgKHNyY19pbmRleCA9PSBwa2dJZEluZGV4KSB7CisgICAgICAgICAgICAgICAgcGtnTGV2ZWwgPSBkc3RfaW5kZXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChzcmNfaW5kZXggPT0gY29yZUlkSW5kZXgpIHsKKyAgICAgICAgICAgICAgICBjb3JlTGV2ZWwgPSBkc3RfaW5kZXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChzcmNfaW5kZXggPT0gdGhyZWFkSWRJbmRleCkgeworICAgICAgICAgICAgICAgIHRocmVhZExldmVsID0gZHN0X2luZGV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZHN0X2luZGV4Kys7CisgICAgICAgIH0KKyAgICAgICAgKCphZGRyZXNzMm9zKVtpXSA9IEFkZHJVbnNQYWlyKGFkZHIsIG9zKTsKKyAgICB9CisKKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMgPCAwKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIFNldCB0aGUgZ3JhbnVsYXJpdHkgbGV2ZWwgYmFzZWQgb24gd2hhdCBsZXZlbHMgYXJlIG1vZGVsZWQKKyAgICAgICAgLy8gaW4gdGhlIG1hY2hpbmUgdG9wb2xvZ3kgbWFwLgorICAgICAgICAvLworICAgICAgICB1bnNpZ25lZCBzcmNfaW5kZXg7CisgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzID0gMDsKKyAgICAgICAgZm9yIChzcmNfaW5kZXggPSB0aHJlYWRJZEluZGV4OyBzcmNfaW5kZXggPD0gbWF4SW5kZXg7IHNyY19pbmRleCsrKSB7CisgICAgICAgICAgICBpZiAoISBpbk1hcFtzcmNfaW5kZXhdKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKHNyY19pbmRleCkgeworICAgICAgICAgICAgICAgIGNhc2UgdGhyZWFkSWRJbmRleDoKKyAgICAgICAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfZ3JhbiA+IGFmZmluaXR5X2dyYW5fdGhyZWFkKSB7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzKys7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBjb3JlSWRJbmRleDoKKyAgICAgICAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfZ3JhbiA+IGFmZmluaXR5X2dyYW5fY29yZSkgeworICAgICAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscysrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgcGtnSWRJbmRleDoKKyAgICAgICAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfZ3JhbiA+IGFmZmluaXR5X2dyYW5fcGFja2FnZSkgeworICAgICAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscysrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgIF9fa21wX2FmZmluaXR5X3ByaW50X3RvcG9sb2d5KCphZGRyZXNzMm9zLCBudW1fYXZhaWwsIGRlcHRoLCBwa2dMZXZlbCwKKyAgICAgICAgICBjb3JlTGV2ZWwsIHRocmVhZExldmVsKTsKKyAgICB9CisKKyAgICBfX2ttcF9mcmVlKGluTWFwKTsKKyAgICBfX2ttcF9mcmVlKGxhc3RJZCk7CisgICAgX19rbXBfZnJlZSh0b3RhbHMpOworICAgIF9fa21wX2ZyZWUobWF4Q3QpOworICAgIF9fa21wX2ZyZWUoY291bnRzKTsKKyAgICBDTEVBTlVQX1RIUkVBRF9JTkZPOworICAgIHJldHVybiBkZXB0aDsKK30KKworCisvLworLy8gQ3JlYXRlIGFuZCByZXR1cm4gYSB0YWJsZSBvZiBhZmZpbml0eSBtYXNrcywgaW5kZXhlZCBieSBPUyB0aHJlYWQgSUQuCisvLyBUaGlzIHJvdXRpbmUgaGFuZGxlcyBPUidpbmcgdG9nZXRoZXIgYWxsIHRoZSBhZmZpbml0eSBtYXNrcyBvZiB0aHJlYWRzCisvLyB0aGF0IGFyZSBzdWZmaWNpZW50bHkgY2xvc2UsIGlmIGdyYW51bGFyaXR5ID4gZmluZS4KKy8vCitzdGF0aWMga21wX2FmZmluX21hc2tfdCAqCitfX2ttcF9jcmVhdGVfbWFza3ModW5zaWduZWQgKm1heEluZGV4LCB1bnNpZ25lZCAqbnVtVW5pcXVlLAorICBBZGRyVW5zUGFpciAqYWRkcmVzczJvcywgdW5zaWduZWQgbnVtQWRkcnMpCit7CisgICAgLy8KKyAgICAvLyBGaXJzdCBmb3JtIGEgdGFibGUgb2YgYWZmaW5pdHkgbWFza3MgaW4gb3JkZXIgb2YgT1MgdGhyZWFkIGlkLgorICAgIC8vCisgICAgdW5zaWduZWQgZGVwdGg7CisgICAgdW5zaWduZWQgbWF4T3NJZDsKKyAgICB1bnNpZ25lZCBpOworCisgICAgS01QX0FTU0VSVChudW1BZGRycyA+IDApOworICAgIGRlcHRoID0gYWRkcmVzczJvc1swXS5maXJzdC5kZXB0aDsKKworICAgIG1heE9zSWQgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBudW1BZGRyczsgaSsrKSB7CisgICAgICAgIHVuc2lnbmVkIG9zSWQgPSBhZGRyZXNzMm9zW2ldLnNlY29uZDsKKyAgICAgICAgaWYgKG9zSWQgPiBtYXhPc0lkKSB7CisgICAgICAgICAgICBtYXhPc0lkID0gb3NJZDsKKyAgICAgICAgfQorICAgIH0KKyAgICBrbXBfYWZmaW5fbWFza190ICpvc0lkMk1hc2sgPSAoa21wX2FmZmluX21hc2tfdCAqKV9fa21wX2FsbG9jYXRlKAorICAgICAgKG1heE9zSWQgKyAxKSAqIF9fa21wX2FmZmluX21hc2tfc2l6ZSk7CisKKyAgICAvLworICAgIC8vIFNvcnQgdGhlIGFkZHJlc3Myb3MgdGFibGUgYWNjb3JkaW5nIHRvIHBoeXNpY2FsIG9yZGVyLiAgRG9pbmcgc28KKyAgICAvLyB3aWxsIHB1dCBhbGwgdGhyZWFkcyBvbiB0aGUgc2FtZSBjb3JlL3BhY2thZ2Uvbm9kZSBpbiBjb25zZWN1dGl2ZQorICAgIC8vIGxvY2F0aW9ucy4KKyAgICAvLworICAgIHFzb3J0KGFkZHJlc3Myb3MsIG51bUFkZHJzLCBzaXplb2YoKmFkZHJlc3Myb3MpLAorICAgICAgX19rbXBfYWZmaW5pdHlfY21wX0FkZHJlc3NfbGFiZWxzKTsKKworICAgIEtNUF9BU1NFUlQoX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMgPj0gMCk7CisgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UgJiYgKF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzID4gMCkpIHsKKyAgICAgICAgS01QX0lORk9STShUaHJlYWRzTWlncmF0ZSwgIktNUF9BRkZJTklUWSIsICBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscyk7CisgICAgfQorICAgIGlmIChfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscyA+PSAoaW50KWRlcHRoKSB7CisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlIHx8IChfX2ttcF9hZmZpbml0eV93YXJuaW5ncworICAgICAgICAgICYmIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X25vbmUpKSkgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoQWZmVGhyZWFkc01heU1pZ3JhdGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8KKyAgICAvLyBSdW4gdGhyb3VnaCB0aGUgdGFibGUsIGZvcm1pbmcgdGhlIG1hc2tzIGZvciBhbGwgdGhyZWFkcyBvbiBlYWNoCisgICAgLy8gY29yZS4gIFRocmVhZHMgb24gdGhlIHNhbWUgY29yZSB3aWxsIGhhdmUgaWRlbnRpY2FsICJBZGRyZXNzIgorICAgIC8vIG9iamVjdHMsIG5vdCBjb25zaWRlcmluZyB0aGUgbGFzdCBsZXZlbCwgd2hpY2ggbXVzdCBiZSB0aGUgdGhyZWFkCisgICAgLy8gaWQuICBBbGwgdGhyZWFkcyBvbiBhIGNvcmUgd2lsbCBhcHBlYXIgY29uc2VjdXRpdmVseS4KKyAgICAvLworICAgIHVuc2lnbmVkIHVuaXF1ZSA9IDA7CisgICAgdW5zaWduZWQgaiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmRleCBvZiAxc3QgdGhyZWFkIG9uIGNvcmUKKyAgICB1bnNpZ25lZCBsZWFkZXIgPSAwOworICAgIEFkZHJlc3MgKmxlYWRlckFkZHIgPSAmKGFkZHJlc3Myb3NbMF0uZmlyc3QpOworICAgIGttcF9hZmZpbl9tYXNrX3QgKnN1bQorICAgICAgPSAoa21wX2FmZmluX21hc2tfdCAqKWFsbG9jYShfX2ttcF9hZmZpbl9tYXNrX3NpemUpOworICAgIEtNUF9DUFVfWkVSTyhzdW0pOworICAgIEtNUF9DUFVfU0VUKGFkZHJlc3Myb3NbMF0uc2Vjb25kLCBzdW0pOworICAgIGZvciAoaSA9IDE7IGkgPCBudW1BZGRyczsgaSsrKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIElmIHRoaXMgdGhyZWFkIGlzIHN1ZmZpY2llbnRseSBjbG9zZSB0byB0aGUgbGVhZGVyICh3aXRoaW4gdGhlCisgICAgICAgIC8vIGdyYW51bGFyaXR5IHNldHRpbmcpLCB0aGVuIHNldCB0aGUgYml0IGZvciB0aGlzIG9zIHRocmVhZCBpbiB0aGUKKyAgICAgICAgLy8gYWZmaW5pdHkgbWFzayBmb3IgdGhpcyBncm91cCwgYW5kIGdvIG9uIHRvIHRoZSBuZXh0IHRocmVhZC4KKyAgICAgICAgLy8KKyAgICAgICAgaWYgKGxlYWRlckFkZHItPmlzQ2xvc2UoYWRkcmVzczJvc1tpXS5maXJzdCwKKyAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscykpIHsKKyAgICAgICAgICAgIEtNUF9DUFVfU0VUKGFkZHJlc3Myb3NbaV0uc2Vjb25kLCBzdW0pOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvLworICAgICAgICAvLyBGb3IgZXZlcnkgdGhyZWFkIGluIHRoaXMgZ3JvdXAsIGNvcHkgdGhlIG1hc2sgdG8gdGhlIHRocmVhZCdzCisgICAgICAgIC8vIGVudHJ5IGluIHRoZSBvc0lkMk1hc2sgdGFibGUuICBNYXJrIHRoZSBmaXJzdCBhZGRyZXNzIGFzIGEKKyAgICAgICAgLy8gbGVhZGVyLgorICAgICAgICAvLworICAgICAgICBmb3IgKDsgaiA8IGk7IGorKykgeworICAgICAgICAgICAgdW5zaWduZWQgb3NJZCA9IGFkZHJlc3Myb3Nbal0uc2Vjb25kOworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChvc0lkIDw9IG1heE9zSWQpOworICAgICAgICAgICAga21wX2FmZmluX21hc2tfdCAqbWFzayA9IEtNUF9DUFVfSU5ERVgob3NJZDJNYXNrLCBvc0lkKTsKKyAgICAgICAgICAgIEtNUF9DUFVfQ09QWShtYXNrLCBzdW0pOworICAgICAgICAgICAgYWRkcmVzczJvc1tqXS5maXJzdC5sZWFkZXIgPSAoaiA9PSBsZWFkZXIpOworICAgICAgICB9CisgICAgICAgIHVuaXF1ZSsrOworCisgICAgICAgIC8vCisgICAgICAgIC8vIFN0YXJ0IGEgbmV3IG1hc2suCisgICAgICAgIC8vCisgICAgICAgIGxlYWRlciA9IGk7CisgICAgICAgIGxlYWRlckFkZHIgPSAmKGFkZHJlc3Myb3NbaV0uZmlyc3QpOworICAgICAgICBLTVBfQ1BVX1pFUk8oc3VtKTsKKyAgICAgICAgS01QX0NQVV9TRVQoYWRkcmVzczJvc1tpXS5zZWNvbmQsIHN1bSk7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBGb3IgZXZlcnkgdGhyZWFkIGluIGxhc3QgZ3JvdXAsIGNvcHkgdGhlIG1hc2sgdG8gdGhlIHRocmVhZCdzCisgICAgLy8gZW50cnkgaW4gdGhlIG9zSWQyTWFzayB0YWJsZS4KKyAgICAvLworICAgIGZvciAoOyBqIDwgaTsgaisrKSB7CisgICAgICAgIHVuc2lnbmVkIG9zSWQgPSBhZGRyZXNzMm9zW2pdLnNlY29uZDsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVChvc0lkIDw9IG1heE9zSWQpOworICAgICAgICBrbXBfYWZmaW5fbWFza190ICptYXNrID0gS01QX0NQVV9JTkRFWChvc0lkMk1hc2ssIG9zSWQpOworICAgICAgICBLTVBfQ1BVX0NPUFkobWFzaywgc3VtKTsKKyAgICAgICAgYWRkcmVzczJvc1tqXS5maXJzdC5sZWFkZXIgPSAoaiA9PSBsZWFkZXIpOworICAgIH0KKyAgICB1bmlxdWUrKzsKKworICAgICptYXhJbmRleCA9IG1heE9zSWQ7CisgICAgKm51bVVuaXF1ZSA9IHVuaXF1ZTsKKyAgICByZXR1cm4gb3NJZDJNYXNrOworfQorCisKKy8vCisvLyBTdHVmZiBmb3IgdGhlIGFmZmluaXR5IHByb2NsaXN0IHBhcnNlcnMuICBJdCdzIGVhc2llciB0byBkZWNsYXJlIHRoZXNlIHZhcnMKKy8vIGFzIGZpbGUtc3RhdGljIHRoYW4gdG8gdHJ5IGFuZCBwYXNzIHRoZW0gdGhyb3VnaCB0aGUgY2FsbGluZyBzZXF1ZW5jZSBvZgorLy8gdGhlIHJlY3Vyc2l2ZS1kZXNjZW50IE9NUF9QTEFDRVMgcGFyc2VyLgorLy8KK3N0YXRpYyBrbXBfYWZmaW5fbWFza190ICpuZXdNYXNrczsKK3N0YXRpYyBpbnQgbnVtTmV3TWFza3M7CitzdGF0aWMgaW50IG5leHROZXdNYXNrOworCisjZGVmaW5lIEFERF9NQVNLKF9tYXNrKSBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChuZXh0TmV3TWFzayA+PSBudW1OZXdNYXNrcykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBudW1OZXdNYXNrcyAqPSAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBuZXdNYXNrcyA9IChrbXBfYWZmaW5fbWFza190ICopS01QX0lOVEVSTkFMX1JFQUxMT0MobmV3TWFza3MsIFwKKyAgICAgICAgICAgICAgbnVtTmV3TWFza3MgKiBfX2ttcF9hZmZpbl9tYXNrX3NpemUpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0NQVV9DT1BZKEtNUF9DUFVfSU5ERVgobmV3TWFza3MsIG5leHROZXdNYXNrKSwgKF9tYXNrKSk7ICAgIFwKKyAgICAgICAgbmV4dE5ld01hc2srKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKyNkZWZpbmUgQUREX01BU0tfT1NJRChfb3NJZCxfb3NJZDJNYXNrLF9tYXhPc0lkKSBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICgoKF9vc0lkKSA+IF9tYXhPc0lkKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKCEgS01QX0NQVV9JU1NFVCgoX29zSWQpLCBLTVBfQ1BVX0lOREVYKChfb3NJZDJNYXNrKSwgKF9vc0lkKSkpKSkgeyBcCisgICAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSB8fCAoX19rbXBfYWZmaW5pdHlfd2FybmluZ3MgICAgICBcCisgICAgICAgICAgICAgICYmIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X25vbmUpKSkgeyAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoQWZmSWdub3JlSW52YWxpZFByb2NJRCwgX29zSWQpOyAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBBRERfTUFTSyhLTVBfQ1BVX0lOREVYKF9vc0lkMk1hc2ssIChfb3NJZCkpKTsgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisKKy8vCisvLyBSZS1wYXJzZSB0aGUgcHJvY2xpc3QgKGZvciB0aGUgZXhwbGljaXQgYWZmaW5pdHkgdHlwZSksIGFuZCBmb3JtIHRoZSBsaXN0CisvLyBvZiBhZmZpbml0eSBuZXdNYXNrcyBpbmRleGVkIGJ5IGd0aWQuCisvLworc3RhdGljIHZvaWQKK19fa21wX2FmZmluaXR5X3Byb2Nlc3NfcHJvY2xpc3Qoa21wX2FmZmluX21hc2tfdCAqKm91dF9tYXNrcywKKyAgdW5zaWduZWQgaW50ICpvdXRfbnVtTWFza3MsIGNvbnN0IGNoYXIgKnByb2NsaXN0LAorICBrbXBfYWZmaW5fbWFza190ICpvc0lkMk1hc2ssIGludCBtYXhPc0lkKQoreworICAgIGNvbnN0IGNoYXIgKnNjYW4gPSBwcm9jbGlzdDsKKyAgICBjb25zdCBjaGFyICpuZXh0ID0gcHJvY2xpc3Q7CisKKyAgICAvLworICAgIC8vIFdlIHVzZSBtYWxsb2MoKSBmb3IgdGhlIHRlbXBvcmFyeSBtYXNrIHZlY3RvciwKKyAgICAvLyBzbyB0aGF0IHdlIGNhbiB1c2UgcmVhbGxvYygpIHRvIGV4dGVuZCBpdC4KKyAgICAvLworICAgIG51bU5ld01hc2tzID0gMjsKKyAgICBuZXdNYXNrcyA9IChrbXBfYWZmaW5fbWFza190ICopS01QX0lOVEVSTkFMX01BTExPQyhudW1OZXdNYXNrcworICAgICAgKiBfX2ttcF9hZmZpbl9tYXNrX3NpemUpOworICAgIG5leHROZXdNYXNrID0gMDsKKyAgICBrbXBfYWZmaW5fbWFza190ICpzdW1NYXNrID0gKGttcF9hZmZpbl9tYXNrX3QgKilfX2ttcF9hbGxvY2F0ZSgKKyAgICAgIF9fa21wX2FmZmluX21hc2tfc2l6ZSk7CisgICAgaW50IHNldFNpemUgPSAwOworCisgICAgZm9yICg7OykgeworICAgICAgICBpbnQgc3RhcnQsIGVuZCwgc3RyaWRlOworCisgICAgICAgIFNLSVBfV1Moc2Nhbik7CisgICAgICAgIG5leHQgPSBzY2FuOworICAgICAgICBpZiAoKm5leHQgPT0gJ1wwJykgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKm5leHQgPT0gJ3snKSB7CisgICAgICAgICAgICBpbnQgbnVtOworICAgICAgICAgICAgc2V0U2l6ZSA9IDA7CisgICAgICAgICAgICBuZXh0Kys7ICAgICAvLyBza2lwICd7JworICAgICAgICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICAgICAgICAgIHNjYW4gPSBuZXh0OworCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gUmVhZCB0aGUgZmlyc3QgaW50ZWdlciBpbiB0aGUgc2V0LgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIEtNUF9BU1NFUlQyKCgqbmV4dCA+PSAnMCcpICYmICgqbmV4dCA8PSAnOScpLAorICAgICAgICAgICAgICAiYmFkIHByb2NsaXN0Iik7CisgICAgICAgICAgICBTS0lQX0RJR0lUUyhuZXh0KTsKKyAgICAgICAgICAgIG51bSA9IF9fa21wX3N0cl90b19pbnQoc2NhbiwgKm5leHQpOworICAgICAgICAgICAgS01QX0FTU0VSVDIobnVtID49IDAsICJiYWQgZXhwbGljaXQgcHJvYyBsaXN0Iik7CisKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBDb3B5IHRoZSBtYXNrIGZvciB0aGF0IG9zSWQgdG8gdGhlIHN1bSAodW5pb24pIG1hc2suCisgICAgICAgICAgICAvLworICAgICAgICAgICAgaWYgKChudW0gPiBtYXhPc0lkKSB8fAorICAgICAgICAgICAgICAoISBLTVBfQ1BVX0lTU0VUKG51bSwgS01QX0NQVV9JTkRFWChvc0lkMk1hc2ssIG51bSkpKSkgeworICAgICAgICAgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlIHx8IChfX2ttcF9hZmZpbml0eV93YXJuaW5ncworICAgICAgICAgICAgICAgICAgJiYgKF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfbm9uZSkpKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKEFmZklnbm9yZUludmFsaWRQcm9jSUQsIG51bSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEtNUF9DUFVfWkVSTyhzdW1NYXNrKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIEtNUF9DUFVfQ09QWShzdW1NYXNrLCBLTVBfQ1BVX0lOREVYKG9zSWQyTWFzaywgbnVtKSk7CisgICAgICAgICAgICAgICAgc2V0U2l6ZSA9IDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBlbmQgb2Ygc2V0LgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICAgICAgICAgICAgICBpZiAoKm5leHQgPT0gJ30nKSB7CisgICAgICAgICAgICAgICAgICAgIG5leHQrKzsgICAgIC8vIHNraXAgJ30nCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gU2tpcCBvcHRpb25hbCBjb21tYS4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIGlmICgqbmV4dCA9PSAnLCcpIHsKKyAgICAgICAgICAgICAgICAgICAgbmV4dCsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTS0lQX1dTKG5leHQpOworCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyBSZWFkIHRoZSBuZXh0IGludGVnZXIgaW4gdGhlIHNldC4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIHNjYW4gPSBuZXh0OworICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQyKCgqbmV4dCA+PSAnMCcpICYmICgqbmV4dCA8PSAnOScpLAorICAgICAgICAgICAgICAgICAgImJhZCBleHBsaWNpdCBwcm9jIGxpc3QiKTsKKworICAgICAgICAgICAgICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgICAgICAgICAgICAgIG51bSA9IF9fa21wX3N0cl90b19pbnQoc2NhbiwgKm5leHQpOworICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQyKG51bSA+PSAwLCAiYmFkIGV4cGxpY2l0IHByb2MgbGlzdCIpOworCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIG1hc2sgZm9yIHRoYXQgb3NJZCB0byB0aGUgc3VtIG1hc2suCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICBpZiAoKG51bSA+IG1heE9zSWQpIHx8CisgICAgICAgICAgICAgICAgICAoISBLTVBfQ1BVX0lTU0VUKG51bSwgS01QX0NQVV9JTkRFWChvc0lkMk1hc2ssIG51bSkpKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSB8fCAoX19rbXBfYWZmaW5pdHlfd2FybmluZ3MKKyAgICAgICAgICAgICAgICAgICAgICAmJiAoX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9ub25lKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKEFmZklnbm9yZUludmFsaWRQcm9jSUQsIG51bSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9DUFVfVU5JT04oc3VtTWFzaywgS01QX0NQVV9JTkRFWChvc0lkMk1hc2ssIG51bSkpOworICAgICAgICAgICAgICAgICAgICBzZXRTaXplKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNldFNpemUgPiAwKSB7CisgICAgICAgICAgICAgICAgQUREX01BU0soc3VtTWFzayk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFNLSVBfV1MobmV4dCk7CisgICAgICAgICAgICBpZiAoKm5leHQgPT0gJywnKSB7CisgICAgICAgICAgICAgICAgbmV4dCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2NhbiA9IG5leHQ7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIFJlYWQgdGhlIGZpcnN0IGludGVnZXIuCisgICAgICAgIC8vCisgICAgICAgIEtNUF9BU1NFUlQyKCgqbmV4dCA+PSAnMCcpICYmICgqbmV4dCA8PSAnOScpLCAiYmFkIGV4cGxpY2l0IHByb2MgbGlzdCIpOworICAgICAgICBTS0lQX0RJR0lUUyhuZXh0KTsKKyAgICAgICAgc3RhcnQgPSBfX2ttcF9zdHJfdG9faW50KHNjYW4sICpuZXh0KTsKKyAgICAgICAgS01QX0FTU0VSVDIoc3RhcnQgPj0gMCwgImJhZCBleHBsaWNpdCBwcm9jIGxpc3QiKTsKKyAgICAgICAgU0tJUF9XUyhuZXh0KTsKKworICAgICAgICAvLworICAgICAgICAvLyBJZiB0aGlzIGlzbid0IGEgcmFuZ2UsIHRoZW4gYWRkIGEgbWFzayB0byB0aGUgbGlzdCBhbmQgZ28gb24uCisgICAgICAgIC8vCisgICAgICAgIGlmICgqbmV4dCAhPSAnLScpIHsKKyAgICAgICAgICAgIEFERF9NQVNLX09TSUQoc3RhcnQsIG9zSWQyTWFzaywgbWF4T3NJZCk7CisKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBTa2lwIG9wdGlvbmFsIGNvbW1hLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGlmICgqbmV4dCA9PSAnLCcpIHsKKyAgICAgICAgICAgICAgICBuZXh0Kys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzY2FuID0gbmV4dDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gVGhpcyBpcyBhIHJhbmdlLiAgU2tpcCBvdmVyIHRoZSAnLScgYW5kIHJlYWQgaW4gdGhlIDJuZCBpbnQuCisgICAgICAgIC8vCisgICAgICAgIG5leHQrKzsgICAgICAgICAvLyBza2lwICctJworICAgICAgICBTS0lQX1dTKG5leHQpOworICAgICAgICBzY2FuID0gbmV4dDsKKyAgICAgICAgS01QX0FTU0VSVDIoKCpuZXh0ID49ICcwJykgJiYgKCpuZXh0IDw9ICc5JyksICJiYWQgZXhwbGljaXQgcHJvYyBsaXN0Iik7CisgICAgICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgICAgICBlbmQgPSBfX2ttcF9zdHJfdG9faW50KHNjYW4sICpuZXh0KTsKKyAgICAgICAgS01QX0FTU0VSVDIoZW5kID49IDAsICJiYWQgZXhwbGljaXQgcHJvYyBsaXN0Iik7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gQ2hlY2sgZm9yIGEgc3RyaWRlIHBhcmFtZXRlcgorICAgICAgICAvLworICAgICAgICBzdHJpZGUgPSAxOworICAgICAgICBTS0lQX1dTKG5leHQpOworICAgICAgICBpZiAoKm5leHQgPT0gJzonKSB7CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gQSBzdHJpZGUgaXMgc3BlY2lmaWVkLiAgU2tpcCBvdmVyIHRoZSAnOiIgYW5kIHJlYWQgdGhlIDNyZCBpbnQuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgaW50IHNpZ24gPSArMTsKKyAgICAgICAgICAgIG5leHQrKzsgICAgICAgICAvLyBza2lwICc6JworICAgICAgICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICAgICAgICAgIHNjYW4gPSBuZXh0OworICAgICAgICAgICAgaWYgKCpuZXh0ID09ICctJykgeworICAgICAgICAgICAgICAgIHNpZ24gPSAtMTsKKyAgICAgICAgICAgICAgICBuZXh0Kys7CisgICAgICAgICAgICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICAgICAgICAgICAgICBzY2FuID0gbmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEtNUF9BU1NFUlQyKCgqbmV4dCA+PSAgJzAnKSAmJiAoKm5leHQgPD0gJzknKSwKKyAgICAgICAgICAgICAgImJhZCBleHBsaWNpdCBwcm9jIGxpc3QiKTsKKyAgICAgICAgICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgICAgICAgICAgc3RyaWRlID0gX19rbXBfc3RyX3RvX2ludChzY2FuLCAqbmV4dCk7CisgICAgICAgICAgICBLTVBfQVNTRVJUMihzdHJpZGUgPj0gMCwgImJhZCBleHBsaWNpdCBwcm9jIGxpc3QiKTsKKyAgICAgICAgICAgIHN0cmlkZSAqPSBzaWduOworICAgICAgICB9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gRG8gc29tZSByYW5nZSBjaGVja3MuCisgICAgICAgIC8vCisgICAgICAgIEtNUF9BU1NFUlQyKHN0cmlkZSAhPSAwLCAiYmFkIGV4cGxpY2l0IHByb2MgbGlzdCIpOworICAgICAgICBpZiAoc3RyaWRlID4gMCkgeworICAgICAgICAgICAgS01QX0FTU0VSVDIoc3RhcnQgPD0gZW5kLCAiYmFkIGV4cGxpY2l0IHByb2MgbGlzdCIpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgS01QX0FTU0VSVDIoc3RhcnQgPj0gZW5kLCAiYmFkIGV4cGxpY2l0IHByb2MgbGlzdCIpOworICAgICAgICB9CisgICAgICAgIEtNUF9BU1NFUlQyKChlbmQgLSBzdGFydCkgLyBzdHJpZGUgPD0gNjU1MzYsICJiYWQgZXhwbGljaXQgcHJvYyBsaXN0Iik7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gQWRkIHRoZSBtYXNrIGZvciBlYWNoIE9TIHByb2MgIyB0byB0aGUgbGlzdC4KKyAgICAgICAgLy8KKyAgICAgICAgaWYgKHN0cmlkZSA+IDApIHsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBBRERfTUFTS19PU0lEKHN0YXJ0LCBvc0lkMk1hc2ssIG1heE9zSWQpOworICAgICAgICAgICAgICAgIHN0YXJ0ICs9IHN0cmlkZTsKKyAgICAgICAgICAgIH0gd2hpbGUgKHN0YXJ0IDw9IGVuZCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgQUREX01BU0tfT1NJRChzdGFydCwgb3NJZDJNYXNrLCBtYXhPc0lkKTsKKyAgICAgICAgICAgICAgICBzdGFydCArPSBzdHJpZGU7CisgICAgICAgICAgICB9IHdoaWxlIChzdGFydCA+PSBlbmQpOworICAgICAgICB9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gU2tpcCBvcHRpb25hbCBjb21tYS4KKyAgICAgICAgLy8KKyAgICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICAgICAgaWYgKCpuZXh0ID09ICcsJykgeworICAgICAgICAgICAgbmV4dCsrOworICAgICAgICB9CisgICAgICAgIHNjYW4gPSBuZXh0OworICAgIH0KKworICAgICpvdXRfbnVtTWFza3MgPSBuZXh0TmV3TWFzazsKKyAgICBpZiAobmV4dE5ld01hc2sgPT0gMCkgeworICAgICAgICAqb3V0X21hc2tzID0gTlVMTDsKKyAgICAgICAgS01QX0lOVEVSTkFMX0ZSRUUobmV3TWFza3MpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgICpvdXRfbWFza3MKKyAgICAgID0gKGttcF9hZmZpbl9tYXNrX3QgKilfX2ttcF9hbGxvY2F0ZShuZXh0TmV3TWFzayAqIF9fa21wX2FmZmluX21hc2tfc2l6ZSk7CisgICAgbWVtY3B5KCpvdXRfbWFza3MsIG5ld01hc2tzLCBuZXh0TmV3TWFzayAqIF9fa21wX2FmZmluX21hc2tfc2l6ZSk7CisgICAgX19rbXBfZnJlZShzdW1NYXNrKTsKKyAgICBLTVBfSU5URVJOQUxfRlJFRShuZXdNYXNrcyk7Cit9CisKKworIyBpZiBPTVBfNDBfRU5BQkxFRAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1JlLXBhcnNlIHRoZSBPTVBfUExBQ0VTIHByb2MgaWQgbGlzdCwgZm9ybWluZyB0aGUgbmV3TWFza3MgZm9yIHRoZSBkaWZmZXJlbnQKK3BsYWNlcy4gIEFnYWluLCBIZXJlIGlzIHRoZSBncmFtbWFyOgorCitwbGFjZV9saXN0IDo9IHBsYWNlCitwbGFjZV9saXN0IDo9IHBsYWNlICwgcGxhY2VfbGlzdAorcGxhY2UgOj0gbnVtCitwbGFjZSA6PSBwbGFjZSA6IG51bQorcGxhY2UgOj0gcGxhY2UgOiBudW0gOiBzaWduZWQKK3BsYWNlIDo9IHsgc3VicGxhY2VsaXN0IH0KK3BsYWNlIDo9ICEgcGxhY2UgICAgICAgICAgICAgICAgICAvLyAobG93ZXN0IHByaW9yaXR5KQorc3VicGxhY2VfbGlzdCA6PSBzdWJwbGFjZQorc3VicGxhY2VfbGlzdCA6PSBzdWJwbGFjZSAsIHN1YnBsYWNlX2xpc3QKK3N1YnBsYWNlIDo9IG51bQorc3VicGxhY2UgOj0gbnVtIDogbnVtCitzdWJwbGFjZSA6PSBudW0gOiBudW0gOiBzaWduZWQKK3NpZ25lZCA6PSBudW0KK3NpZ25lZCA6PSArIHNpZ25lZAorc2lnbmVkIDo9IC0gc2lnbmVkCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHZvaWQKK19fa21wX3Byb2Nlc3Nfc3VicGxhY2VfbGlzdChjb25zdCBjaGFyICoqc2Nhbiwga21wX2FmZmluX21hc2tfdCAqb3NJZDJNYXNrLAorICBpbnQgbWF4T3NJZCwga21wX2FmZmluX21hc2tfdCAqdGVtcE1hc2ssIGludCAqc2V0U2l6ZSkKK3sKKyAgICBjb25zdCBjaGFyICpuZXh0OworCisgICAgZm9yICg7OykgeworICAgICAgICBpbnQgc3RhcnQsIGNvdW50LCBzdHJpZGUsIGk7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gUmVhZCBpbiB0aGUgc3RhcnRpbmcgcHJvYyBpZAorICAgICAgICAvLworICAgICAgICBTS0lQX1dTKCpzY2FuKTsKKyAgICAgICAgS01QX0FTU0VSVDIoKCoqc2NhbiA+PSAnMCcpICYmICgqKnNjYW4gPD0gJzknKSwKKyAgICAgICAgICAiYmFkIGV4cGxpY2l0IHBsYWNlcyBsaXN0Iik7CisgICAgICAgIG5leHQgPSAqc2NhbjsKKyAgICAgICAgU0tJUF9ESUdJVFMobmV4dCk7CisgICAgICAgIHN0YXJ0ID0gX19rbXBfc3RyX3RvX2ludCgqc2NhbiwgKm5leHQpOworICAgICAgICBLTVBfQVNTRVJUKHN0YXJ0ID49IDApOworICAgICAgICAqc2NhbiA9IG5leHQ7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gdmFsaWQgZm9sbG93IHNldHMgYXJlICcsJyAnOicgYW5kICd9JworICAgICAgICAvLworICAgICAgICBTS0lQX1dTKCpzY2FuKTsKKyAgICAgICAgaWYgKCoqc2NhbiA9PSAnfScgfHwgKipzY2FuID09ICcsJykgeworICAgICAgICAgICAgaWYgKChzdGFydCA+IG1heE9zSWQpIHx8CisgICAgICAgICAgICAgICghIEtNUF9DUFVfSVNTRVQoc3RhcnQsIEtNUF9DUFVfSU5ERVgob3NJZDJNYXNrLCBzdGFydCkpKSkgeworICAgICAgICAgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlIHx8IChfX2ttcF9hZmZpbml0eV93YXJuaW5ncworICAgICAgICAgICAgICAgICAgJiYgKF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfbm9uZSkpKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKEFmZklnbm9yZUludmFsaWRQcm9jSUQsIHN0YXJ0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBLTVBfQ1BVX1VOSU9OKHRlbXBNYXNrLCBLTVBfQ1BVX0lOREVYKG9zSWQyTWFzaywgc3RhcnQpKTsKKyAgICAgICAgICAgICAgICAoKnNldFNpemUpKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKipzY2FuID09ICd9JykgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKCpzY2FuKSsrOyAgLy8gc2tpcCAnLCcKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIEtNUF9BU1NFUlQyKCoqc2NhbiA9PSAnOicsICJiYWQgZXhwbGljaXQgcGxhY2VzIGxpc3QiKTsKKyAgICAgICAgKCpzY2FuKSsrOyAgICAgIC8vIHNraXAgJzonCisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gUmVhZCBjb3VudCBwYXJhbWV0ZXIKKyAgICAgICAgLy8KKyAgICAgICAgU0tJUF9XUygqc2Nhbik7CisgICAgICAgIEtNUF9BU1NFUlQyKCgqKnNjYW4gPj0gJzAnKSAmJiAoKipzY2FuIDw9ICc5JyksCisgICAgICAgICAgImJhZCBleHBsaWNpdCBwbGFjZXMgbGlzdCIpOworICAgICAgICBuZXh0ID0gKnNjYW47CisgICAgICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgICAgICBjb3VudCA9IF9fa21wX3N0cl90b19pbnQoKnNjYW4sICpuZXh0KTsKKyAgICAgICAgS01QX0FTU0VSVChjb3VudCA+PSAwKTsKKyAgICAgICAgKnNjYW4gPSBuZXh0OworCisgICAgICAgIC8vCisgICAgICAgIC8vIHZhbGlkIGZvbGxvdyBzZXRzIGFyZSAnLCcgJzonIGFuZCAnfScKKyAgICAgICAgLy8KKyAgICAgICAgU0tJUF9XUygqc2Nhbik7CisgICAgICAgIGlmICgqKnNjYW4gPT0gJ30nIHx8ICoqc2NhbiA9PSAnLCcpIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKChzdGFydCA+IG1heE9zSWQpIHx8CisgICAgICAgICAgICAgICAgICAoISBLTVBfQ1BVX0lTU0VUKHN0YXJ0LCBLTVBfQ1BVX0lOREVYKG9zSWQyTWFzaywgc3RhcnQpKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UgfHwgKF9fa21wX2FmZmluaXR5X3dhcm5pbmdzCisgICAgICAgICAgICAgICAgICAgICAgJiYgKF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfbm9uZSkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfV0FSTklORyhBZmZJZ25vcmVJbnZhbGlkUHJvY0lELCBzdGFydCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAvLyBkb24ndCBwcm9saWZlcmF0ZSB3YXJuaW5ncyBmb3IgbGFyZ2UgY291bnQKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9DUFVfVU5JT04odGVtcE1hc2ssIEtNUF9DUFVfSU5ERVgob3NJZDJNYXNrLCBzdGFydCkpOworICAgICAgICAgICAgICAgICAgICBzdGFydCsrOworICAgICAgICAgICAgICAgICAgICAoKnNldFNpemUpKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCoqc2NhbiA9PSAnfScpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICgqc2NhbikrKzsgIC8vIHNraXAgJywnCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBLTVBfQVNTRVJUMigqKnNjYW4gPT0gJzonLCAiYmFkIGV4cGxpY2l0IHBsYWNlcyBsaXN0Iik7CisgICAgICAgICgqc2NhbikrKzsgICAgICAvLyBza2lwICc6JworCisgICAgICAgIC8vCisgICAgICAgIC8vIFJlYWQgc3RyaWRlIHBhcmFtZXRlcgorICAgICAgICAvLworICAgICAgICBpbnQgc2lnbiA9ICsxOworICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICBTS0lQX1dTKCpzY2FuKTsKKyAgICAgICAgICAgIGlmICgqKnNjYW4gPT0gJysnKSB7CisgICAgICAgICAgICAgICAgKCpzY2FuKSsrOyAvLyBza2lwICcrJworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCoqc2NhbiA9PSAnLScpIHsKKyAgICAgICAgICAgICAgICBzaWduICo9IC0xOworICAgICAgICAgICAgICAgICgqc2NhbikrKzsgLy8gc2tpcCAnLScKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIFNLSVBfV1MoKnNjYW4pOworICAgICAgICBLTVBfQVNTRVJUMigoKipzY2FuID49ICcwJykgJiYgKCoqc2NhbiA8PSAnOScpLAorICAgICAgICAgICJiYWQgZXhwbGljaXQgcGxhY2VzIGxpc3QiKTsKKyAgICAgICAgbmV4dCA9ICpzY2FuOworICAgICAgICBTS0lQX0RJR0lUUyhuZXh0KTsKKyAgICAgICAgc3RyaWRlID0gX19rbXBfc3RyX3RvX2ludCgqc2NhbiwgKm5leHQpOworICAgICAgICBLTVBfQVNTRVJUKHN0cmlkZSA+PSAwKTsKKyAgICAgICAgKnNjYW4gPSBuZXh0OworICAgICAgICBzdHJpZGUgKj0gc2lnbjsKKworICAgICAgICAvLworICAgICAgICAvLyB2YWxpZCBmb2xsb3cgc2V0cyBhcmUgJywnIGFuZCAnfScKKyAgICAgICAgLy8KKyAgICAgICAgU0tJUF9XUygqc2Nhbik7CisgICAgICAgIGlmICgqKnNjYW4gPT0gJ30nIHx8ICoqc2NhbiA9PSAnLCcpIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKChzdGFydCA+IG1heE9zSWQpIHx8CisgICAgICAgICAgICAgICAgICAoISBLTVBfQ1BVX0lTU0VUKHN0YXJ0LCBLTVBfQ1BVX0lOREVYKG9zSWQyTWFzaywgc3RhcnQpKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UgfHwgKF9fa21wX2FmZmluaXR5X3dhcm5pbmdzCisgICAgICAgICAgICAgICAgICAgICAgJiYgKF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfbm9uZSkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfV0FSTklORyhBZmZJZ25vcmVJbnZhbGlkUHJvY0lELCBzdGFydCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAvLyBkb24ndCBwcm9saWZlcmF0ZSB3YXJuaW5ncyBmb3IgbGFyZ2UgY291bnQKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9DUFVfVU5JT04odGVtcE1hc2ssIEtNUF9DUFVfSU5ERVgob3NJZDJNYXNrLCBzdGFydCkpOworICAgICAgICAgICAgICAgICAgICBzdGFydCArPSBzdHJpZGU7CisgICAgICAgICAgICAgICAgICAgICgqc2V0U2l6ZSkrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKipzY2FuID09ICd9JykgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKCpzY2FuKSsrOyAgLy8gc2tpcCAnLCcKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgS01QX0FTU0VSVDIoMCwgImJhZCBleHBsaWNpdCBwbGFjZXMgbGlzdCIpOworICAgIH0KK30KKworCitzdGF0aWMgdm9pZAorX19rbXBfcHJvY2Vzc19wbGFjZShjb25zdCBjaGFyICoqc2Nhbiwga21wX2FmZmluX21hc2tfdCAqb3NJZDJNYXNrLAorICBpbnQgbWF4T3NJZCwga21wX2FmZmluX21hc2tfdCAqdGVtcE1hc2ssIGludCAqc2V0U2l6ZSkKK3sKKyAgICBjb25zdCBjaGFyICpuZXh0OworCisgICAgLy8KKyAgICAvLyB2YWxpZCBmb2xsb3cgc2V0cyBhcmUgJ3snICchJyBhbmQgbnVtCisgICAgLy8KKyAgICBTS0lQX1dTKCpzY2FuKTsKKyAgICBpZiAoKipzY2FuID09ICd7JykgeworICAgICAgICAoKnNjYW4pKys7ICAgICAgLy8gc2tpcCAneycKKyAgICAgICAgX19rbXBfcHJvY2Vzc19zdWJwbGFjZV9saXN0KHNjYW4sIG9zSWQyTWFzaywgbWF4T3NJZCAsIHRlbXBNYXNrLAorICAgICAgICAgIHNldFNpemUpOworICAgICAgICBLTVBfQVNTRVJUMigqKnNjYW4gPT0gJ30nLCAiYmFkIGV4cGxpY2l0IHBsYWNlcyBsaXN0Iik7CisgICAgICAgICgqc2NhbikrKzsgICAgICAvLyBza2lwICd9JworICAgIH0KKyAgICBlbHNlIGlmICgqKnNjYW4gPT0gJyEnKSB7CisgICAgICAgIF9fa21wX3Byb2Nlc3NfcGxhY2Uoc2Nhbiwgb3NJZDJNYXNrLCBtYXhPc0lkLCB0ZW1wTWFzaywgc2V0U2l6ZSk7CisgICAgICAgIEtNUF9DUFVfQ09NUExFTUVOVCh0ZW1wTWFzayk7CisgICAgICAgICgqc2NhbikrKzsgICAgICAvLyBza2lwICchJworICAgIH0KKyAgICBlbHNlIGlmICgoKipzY2FuID49ICcwJykgJiYgKCoqc2NhbiA8PSAnOScpKSB7CisgICAgICAgIG5leHQgPSAqc2NhbjsKKyAgICAgICAgU0tJUF9ESUdJVFMobmV4dCk7CisgICAgICAgIGludCBudW0gPSBfX2ttcF9zdHJfdG9faW50KCpzY2FuLCAqbmV4dCk7CisgICAgICAgIEtNUF9BU1NFUlQobnVtID49IDApOworICAgICAgICBpZiAoKG51bSA+IG1heE9zSWQpIHx8CisgICAgICAgICAgKCEgS01QX0NQVV9JU1NFVChudW0sIEtNUF9DUFVfSU5ERVgob3NJZDJNYXNrLCBudW0pKSkpIHsKKyAgICAgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlIHx8IChfX2ttcF9hZmZpbml0eV93YXJuaW5ncworICAgICAgICAgICAgICAmJiAoX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9ub25lKSkpIHsKKyAgICAgICAgICAgICAgICBLTVBfV0FSTklORyhBZmZJZ25vcmVJbnZhbGlkUHJvY0lELCBudW0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgS01QX0NQVV9VTklPTih0ZW1wTWFzaywgS01QX0NQVV9JTkRFWChvc0lkMk1hc2ssIG51bSkpOworICAgICAgICAgICAgKCpzZXRTaXplKSsrOworICAgICAgICB9CisgICAgICAgICpzY2FuID0gbmV4dDsgIC8vIHNraXAgbnVtCisgICAgfQorICAgIGVsc2UgeworICAgICAgICBLTVBfQVNTRVJUMigwLCAiYmFkIGV4cGxpY2l0IHBsYWNlcyBsaXN0Iik7CisgICAgfQorfQorCisKKy8vc3RhdGljIHZvaWQKK3ZvaWQKK19fa21wX2FmZmluaXR5X3Byb2Nlc3NfcGxhY2VsaXN0KGttcF9hZmZpbl9tYXNrX3QgKipvdXRfbWFza3MsCisgIHVuc2lnbmVkIGludCAqb3V0X251bU1hc2tzLCBjb25zdCBjaGFyICpwbGFjZWxpc3QsCisgIGttcF9hZmZpbl9tYXNrX3QgKm9zSWQyTWFzaywgaW50IG1heE9zSWQpCit7CisgICAgY29uc3QgY2hhciAqc2NhbiA9IHBsYWNlbGlzdDsKKyAgICBjb25zdCBjaGFyICpuZXh0ID0gcGxhY2VsaXN0OworCisgICAgbnVtTmV3TWFza3MgPSAyOworICAgIG5ld01hc2tzID0gKGttcF9hZmZpbl9tYXNrX3QgKilLTVBfSU5URVJOQUxfTUFMTE9DKG51bU5ld01hc2tzCisgICAgICAqIF9fa21wX2FmZmluX21hc2tfc2l6ZSk7CisgICAgbmV4dE5ld01hc2sgPSAwOworCisgICAga21wX2FmZmluX21hc2tfdCAqdGVtcE1hc2sgPSAoa21wX2FmZmluX21hc2tfdCAqKV9fa21wX2FsbG9jYXRlKAorICAgICAgX19rbXBfYWZmaW5fbWFza19zaXplKTsKKyAgICBLTVBfQ1BVX1pFUk8odGVtcE1hc2spOworICAgIGludCBzZXRTaXplID0gMDsKKworICAgIGZvciAoOzspIHsKKyAgICAgICAgX19rbXBfcHJvY2Vzc19wbGFjZSgmc2Nhbiwgb3NJZDJNYXNrLCBtYXhPc0lkLCB0ZW1wTWFzaywgJnNldFNpemUpOworCisgICAgICAgIC8vCisgICAgICAgIC8vIHZhbGlkIGZvbGxvdyBzZXRzIGFyZSAnLCcgJzonIGFuZCBFT0wKKyAgICAgICAgLy8KKyAgICAgICAgU0tJUF9XUyhzY2FuKTsKKyAgICAgICAgaWYgKCpzY2FuID09ICdcMCcgfHwgKnNjYW4gPT0gJywnKSB7CisgICAgICAgICAgICBpZiAoc2V0U2l6ZSA+IDApIHsKKyAgICAgICAgICAgICAgICBBRERfTUFTSyh0ZW1wTWFzayk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBLTVBfQ1BVX1pFUk8odGVtcE1hc2spOworICAgICAgICAgICAgc2V0U2l6ZSA9IDA7CisgICAgICAgICAgICBpZiAoKnNjYW4gPT0gJ1wwJykgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2NhbisrOyAgICAgLy8gc2tpcCAnLCcKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgS01QX0FTU0VSVDIoKnNjYW4gPT0gJzonLCAiYmFkIGV4cGxpY2l0IHBsYWNlcyBsaXN0Iik7CisgICAgICAgIHNjYW4rKzsgICAgICAgICAvLyBza2lwICc6JworCisgICAgICAgIC8vCisgICAgICAgIC8vIFJlYWQgY291bnQgcGFyYW1ldGVyCisgICAgICAgIC8vCisgICAgICAgIFNLSVBfV1Moc2Nhbik7CisgICAgICAgIEtNUF9BU1NFUlQyKCgqc2NhbiA+PSAnMCcpICYmICgqc2NhbiA8PSAnOScpLAorICAgICAgICAgICJiYWQgZXhwbGljaXQgcGxhY2VzIGxpc3QiKTsKKyAgICAgICAgbmV4dCA9IHNjYW47CisgICAgICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgICAgICBpbnQgY291bnQgPSBfX2ttcF9zdHJfdG9faW50KHNjYW4sICpuZXh0KTsKKyAgICAgICAgS01QX0FTU0VSVChjb3VudCA+PSAwKTsKKyAgICAgICAgc2NhbiA9IG5leHQ7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gdmFsaWQgZm9sbG93IHNldHMgYXJlICcsJyAnOicgYW5kIEVPTAorICAgICAgICAvLworICAgICAgICBTS0lQX1dTKHNjYW4pOworICAgICAgICBpbnQgc3RyaWRlOworICAgICAgICBpZiAoKnNjYW4gPT0gJ1wwJyB8fCAqc2NhbiA9PSAnLCcpIHsKKyAgICAgICAgICAgIHN0cmlkZSA9ICsxOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgS01QX0FTU0VSVDIoKnNjYW4gPT0gJzonLCAiYmFkIGV4cGxpY2l0IHBsYWNlcyBsaXN0Iik7CisgICAgICAgICAgICBzY2FuKys7ICAgICAgICAgLy8gc2tpcCAnOicKKworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFJlYWQgc3RyaWRlIHBhcmFtZXRlcgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGludCBzaWduID0gKzE7CisgICAgICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICAgICAgU0tJUF9XUyhzY2FuKTsKKyAgICAgICAgICAgICAgICBpZiAoKnNjYW4gPT0gJysnKSB7CisgICAgICAgICAgICAgICAgICAgIHNjYW4rKzsgLy8gc2tpcCAnKycKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgqc2NhbiA9PSAnLScpIHsKKyAgICAgICAgICAgICAgICAgICAgc2lnbiAqPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgc2NhbisrOyAvLyBza2lwICctJworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTS0lQX1dTKHNjYW4pOworICAgICAgICAgICAgS01QX0FTU0VSVDIoKCpzY2FuID49ICcwJykgJiYgKCpzY2FuIDw9ICc5JyksCisgICAgICAgICAgICAgICJiYWQgZXhwbGljaXQgcGxhY2VzIGxpc3QiKTsKKyAgICAgICAgICAgIG5leHQgPSBzY2FuOworICAgICAgICAgICAgU0tJUF9ESUdJVFMobmV4dCk7CisgICAgICAgICAgICBzdHJpZGUgPSBfX2ttcF9zdHJfdG9faW50KHNjYW4sICpuZXh0KTsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoc3RyaWRlID49IDApOworICAgICAgICAgICAgc2NhbiA9IG5leHQ7CisgICAgICAgICAgICBzdHJpZGUgKj0gc2lnbjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzdHJpZGUgPiAwKSB7CisgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaW50IGo7CisgICAgICAgICAgICAgICAgaWYgKHNldFNpemUgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQUREX01BU0sodGVtcE1hc2spOworICAgICAgICAgICAgICAgIHNldFNpemUgPSAwOworICAgICAgICAgICAgICAgIGZvciAoaiA9IF9fa21wX2FmZmluX21hc2tfc2l6ZSAqIENIQVJfQklUIC0gMTsgaiA+PSBzdHJpZGU7IGotLSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoISBLTVBfQ1BVX0lTU0VUKGogLSBzdHJpZGUsIHRlbXBNYXNrKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgS01QX0NQVV9DTFIoaiwgdGVtcE1hc2spOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKChqID4gbWF4T3NJZCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAoISBLTVBfQ1BVX0lTU0VUKGosIEtNUF9DUFVfSU5ERVgob3NJZDJNYXNrLCBqKSkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSB8fCAoX19rbXBfYWZmaW5pdHlfd2FybmluZ3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfbm9uZSkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoQWZmSWdub3JlSW52YWxpZFByb2NJRCwgaik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfQ1BVX0NMUihqLCB0ZW1wTWFzayk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfQ1BVX1NFVChqLCB0ZW1wTWFzayk7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRTaXplKys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yICg7IGogPj0gMDsgai0tKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9DUFVfQ0xSKGosIHRlbXBNYXNrKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaW50IGo7CisgICAgICAgICAgICAgICAgaWYgKHNldFNpemUgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQUREX01BU0sodGVtcE1hc2spOworICAgICAgICAgICAgICAgIHNldFNpemUgPSAwOworICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAoKGludClfX2ttcF9hZmZpbl9tYXNrX3NpemUgKiBDSEFSX0JJVCkgKyBzdHJpZGU7CisgICAgICAgICAgICAgICAgICBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCEgS01QX0NQVV9JU1NFVChqIC0gc3RyaWRlLCB0ZW1wTWFzaykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9DUFVfQ0xSKGosIHRlbXBNYXNrKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgoaiA+IG1heE9zSWQpIHx8CisgICAgICAgICAgICAgICAgICAgICAgKCEgS01QX0NQVV9JU1NFVChqLCBLTVBfQ1BVX0lOREVYKG9zSWQyTWFzaywgaikpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UgfHwgKF9fa21wX2FmZmluaXR5X3dhcm5pbmdzCisgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X25vbmUpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKEFmZklnbm9yZUludmFsaWRQcm9jSUQsIGopOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgS01QX0NQVV9DTFIoaiwgdGVtcE1hc2spOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgS01QX0NQVV9TRVQoaiwgdGVtcE1hc2spOworICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2l6ZSsrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciAoOyBqIDwgKGludClfX2ttcF9hZmZpbl9tYXNrX3NpemUgKiBDSEFSX0JJVDsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9DUFVfQ0xSKGosIHRlbXBNYXNrKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgS01QX0NQVV9aRVJPKHRlbXBNYXNrKTsKKyAgICAgICAgc2V0U2l6ZSA9IDA7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gdmFsaWQgZm9sbG93IHNldHMgYXJlICcsJyBhbmQgRU9MCisgICAgICAgIC8vCisgICAgICAgIFNLSVBfV1Moc2Nhbik7CisgICAgICAgIGlmICgqc2NhbiA9PSAnXDAnKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoKnNjYW4gPT0gJywnKSB7CisgICAgICAgICAgICBzY2FuKys7ICAgICAvLyBza2lwICcsJworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBLTVBfQVNTRVJUMigwLCAiYmFkIGV4cGxpY2l0IHBsYWNlcyBsaXN0Iik7CisgICAgfQorCisgICAgKm91dF9udW1NYXNrcyA9IG5leHROZXdNYXNrOworICAgIGlmIChuZXh0TmV3TWFzayA9PSAwKSB7CisgICAgICAgICpvdXRfbWFza3MgPSBOVUxMOworICAgICAgICBLTVBfSU5URVJOQUxfRlJFRShuZXdNYXNrcyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgKm91dF9tYXNrcworICAgICAgPSAoa21wX2FmZmluX21hc2tfdCAqKV9fa21wX2FsbG9jYXRlKG5leHROZXdNYXNrICogX19rbXBfYWZmaW5fbWFza19zaXplKTsKKyAgICBtZW1jcHkoKm91dF9tYXNrcywgbmV3TWFza3MsIG5leHROZXdNYXNrICogX19rbXBfYWZmaW5fbWFza19zaXplKTsKKyAgICBfX2ttcF9mcmVlKHRlbXBNYXNrKTsKKyAgICBLTVBfSU5URVJOQUxfRlJFRShuZXdNYXNrcyk7Cit9CisKKyMgZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKworI3VuZGVmIEFERF9NQVNLCisjdW5kZWYgQUREX01BU0tfT1NJRAorCisKKyMgaWYgS01QX01JQworCitzdGF0aWMgdm9pZAorX19rbXBfYXBwbHlfdGhyZWFkX3BsYWNlcyhBZGRyVW5zUGFpciAqKnBBZGRyLCBpbnQgZGVwdGgpCit7CisgICAgaWYgKCBfX2ttcF9wbGFjZV9udW1fY29yZXMgPT0gMCApIHsKKyAgICAgICAgaWYgKCBfX2ttcF9wbGFjZV9udW1fdGhyZWFkc19wZXJfY29yZSA9PSAwICkgeworICAgICAgICAgICAgcmV0dXJuOyAgIC8vIG5vIGNvcmVzIGxpbWl0aW5nIGFjdGlvbnMgcmVxdWVzdGVkLCBleGl0CisgICAgICAgIH0KKyAgICAgICAgX19rbXBfcGxhY2VfbnVtX2NvcmVzID0gbkNvcmVzUGVyUGtnOyAgIC8vIHVzZSBhbGwgYXZhaWxhYmxlIGNvcmVzCisgICAgfQorICAgIGlmICggIV9fa21wX2FmZmluaXR5X3VuaWZvcm1fdG9wb2xvZ3koKSApIHsKKyAgICAgICAgS01QX1dBUk5JTkcoIEFmZlRoclBsYWNlTm9uVW5pZm9ybSApOworICAgICAgICByZXR1cm47IC8vIGRvbid0IHN1cHBvcnQgbm9uLXVuaWZvcm0gdG9wb2xvZ3kKKyAgICB9CisgICAgaWYgKCBkZXB0aCAhPSAzICkgeworICAgICAgICBLTVBfV0FSTklORyggQWZmVGhyUGxhY2VOb25UaHJlZUxldmVsICk7CisgICAgICAgIHJldHVybjsgLy8gZG9uJ3Qgc3VwcG9ydCBub3QtMy1sZXZlbCB0b3BvbG9neQorICAgIH0KKyAgICBpZiAoIF9fa21wX3BsYWNlX251bV90aHJlYWRzX3Blcl9jb3JlID09IDAgKSB7CisgICAgICAgIF9fa21wX3BsYWNlX251bV90aHJlYWRzX3Blcl9jb3JlID0gX19rbXBfblRocmVhZHNQZXJDb3JlOyAgLy8gdXNlIGFsbCBIVyBjb250ZXh0cworICAgIH0KKyAgICBpZiAoIF9fa21wX3BsYWNlX2NvcmVfb2Zmc2V0ICsgX19rbXBfcGxhY2VfbnVtX2NvcmVzID4gbkNvcmVzUGVyUGtnICkgeworICAgICAgICBLTVBfV0FSTklORyggQWZmVGhyUGxhY2VNYW55Q29yZXMgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFkZHJVbnNQYWlyICpuZXdBZGRyID0gKEFkZHJVbnNQYWlyICopX19rbXBfYWxsb2NhdGUoIHNpemVvZihBZGRyVW5zUGFpcikgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5QYWNrYWdlcyAqIF9fa21wX3BsYWNlX251bV9jb3JlcyAqIF9fa21wX3BsYWNlX251bV90aHJlYWRzX3Blcl9jb3JlKTsKKyAgICBpbnQgaSwgaiwgaywgbl9vbGQgPSAwLCBuX25ldyA9IDA7CisgICAgZm9yICggaSA9IDA7IGkgPCBuUGFja2FnZXM7ICsraSApIHsKKyAgICAgICAgZm9yICggaiA9IDA7IGogPCBuQ29yZXNQZXJQa2c7ICsraiApIHsKKyAgICAgICAgICAgIGlmICggaiA8IF9fa21wX3BsYWNlX2NvcmVfb2Zmc2V0IHx8IGogPj0gX19rbXBfcGxhY2VfY29yZV9vZmZzZXQgKyBfX2ttcF9wbGFjZV9udW1fY29yZXMgKSB7CisgICAgICAgICAgICAgICAgbl9vbGQgKz0gX19rbXBfblRocmVhZHNQZXJDb3JlOyAgIC8vIHNraXAgbm90LXJlcXVlc3RlZCBjb3JlCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZvciAoIGsgPSAwOyBrIDwgX19rbXBfblRocmVhZHNQZXJDb3JlOyArK2sgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICggayA8IF9fa21wX3BsYWNlX251bV90aHJlYWRzX3Blcl9jb3JlICkgeworICAgICAgICAgICAgICAgICAgICAgICAgbmV3QWRkcltuX25ld10gPSAoKnBBZGRyKVtuX29sZF07ICAgLy8gY29weSByZXF1ZXN0ZWQgY29yZScgZGF0YSB0byBuZXcgbG9jYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIG5fbmV3Kys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbl9vbGQrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgbkNvcmVzUGVyUGtnID0gX19rbXBfcGxhY2VfbnVtX2NvcmVzOyAgICAgICAgICAgICAgICAgICAgIC8vIGNvcnJlY3QgbkNvcmVzUGVyUGtnCisgICAgX19rbXBfblRocmVhZHNQZXJDb3JlID0gX19rbXBfcGxhY2VfbnVtX3RocmVhZHNfcGVyX2NvcmU7IC8vIGNvcnJlY3QgX19rbXBfblRocmVhZHNQZXJDb3JlCisgICAgX19rbXBfYXZhaWxfcHJvYyA9IG5fbmV3OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvcnJlY3QgYXZhaWxfcHJvYworICAgIF9fa21wX25jb3JlcyA9IG5QYWNrYWdlcyAqIF9fa21wX3BsYWNlX251bV9jb3JlczsgICAgICAgICAvLyBjb3JyZWN0IG5jb3JlcworCisgICAgX19rbXBfZnJlZSggKnBBZGRyICk7CisgICAgKnBBZGRyID0gbmV3QWRkcjsgICAgICAvLyByZXBsYWNlIG9sZCB0b3BvbG9neSB3aXRoIG5ldyBvbmUKK30KKworIyBlbmRpZiAvKiBLTVBfTUlDICovCisKKworc3RhdGljIEFkZHJVbnNQYWlyICphZGRyZXNzMm9zID0gTlVMTDsKK3N0YXRpYyBpbnQgICAgICAgICAgICogcHJvY2FyciA9IE5VTEw7CitzdGF0aWMgaW50ICAgICBfX2ttcF9hZmZfZGVwdGggPSAwOworCitzdGF0aWMgdm9pZAorX19rbXBfYXV4X2FmZmluaXR5X2luaXRpYWxpemUodm9pZCkKK3sKKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfbWFza3MgIT0gTlVMTCkgeworICAgICAgICBLTVBfQVNTRVJUKGZ1bGxNYXNrICE9IE5VTEwpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8KKyAgICAvLyBDcmVhdGUgdGhlICJmdWxsIiBtYXNrIC0gdGhpcyBkZWZpbmVzIGFsbCBvZiB0aGUgcHJvY2Vzc29ycyB0aGF0IHdlCisgICAgLy8gY29uc2lkZXIgdG8gYmUgaW4gdGhlIG1hY2hpbmUgbW9kZWwuICBJZiByZXNwZWN0IGlzIHNldCwgdGhlbiBpdCBpcworICAgIC8vIHRoZSBpbml0aWFsaXphdGlvbiB0aHJlYWQncyBhZmZpbml0eSBtYXNrLiAgT3RoZXJ3aXNlLCBpdCBpcyBhbGwKKyAgICAvLyBwcm9jZXNzb3JzIHRoYXQgd2Uga25vdyBhYm91dCBvbiB0aGUgbWFjaGluZS4KKyAgICAvLworICAgIGlmIChmdWxsTWFzayA9PSBOVUxMKSB7CisgICAgICAgIGZ1bGxNYXNrID0gKGttcF9hZmZpbl9tYXNrX3QgKilfX2ttcF9hbGxvY2F0ZShfX2ttcF9hZmZpbl9tYXNrX3NpemUpOworICAgIH0KKyAgICBpZiAoS01QX0FGRklOSVRZX0NBUEFCTEUoKSkgeworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfcmVzcGVjdF9tYXNrKSB7CisgICAgICAgICAgICBfX2ttcF9nZXRfc3lzdGVtX2FmZmluaXR5KGZ1bGxNYXNrLCBUUlVFKTsKKworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIENvdW50IHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIHByb2Nlc3NvcnMuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgdW5zaWduZWQgaTsKKyAgICAgICAgICAgIF9fa21wX2F2YWlsX3Byb2MgPSAwOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IEtNUF9DUFVfU0VUU0laRTsgKytpKSB7CisgICAgICAgICAgICAgICAgaWYgKCEgS01QX0NQVV9JU1NFVChpLCBmdWxsTWFzaykpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIF9fa21wX2F2YWlsX3Byb2MrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChfX2ttcF9hdmFpbF9wcm9jID4gX19rbXBfeHByb2MpIHsKKyAgICAgICAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSB8fCAoX19rbXBfYWZmaW5pdHlfd2FybmluZ3MKKyAgICAgICAgICAgICAgICAgICYmIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X25vbmUpKSkgeworICAgICAgICAgICAgICAgICAgICBLTVBfV0FSTklORyhFcnJvckluaXRpYWxpemVBZmZpbml0eSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9ub25lOworICAgICAgICAgICAgICAgIF9fa21wX2FmZmluX21hc2tfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZW50aXJlX21hY2hpbmVfbWFzayhmdWxsTWFzayk7CisgICAgICAgICAgICBfX2ttcF9hdmFpbF9wcm9jID0gX19rbXBfeHByb2M7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbnQgZGVwdGggPSAtMTsKKyAgICBrbXBfaTE4bl9pZF90IG1zZ19pZCA9IGttcF9pMThuX251bGw7CisKKyAgICAvLworICAgIC8vIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCBzZXR0aW5nIEtNUF9DUFVJTkZPX0ZJTEUgPT4KKyAgICAvLyBLTVBfVE9QT0xPR1lfTUVUSE9EPWNwdWluZm8KKyAgICAvLworICAgIGlmICgoX19rbXBfY3B1aW5mb19maWxlICE9IE5VTEwpICYmCisgICAgICAoX19rbXBfYWZmaW5pdHlfdG9wX21ldGhvZCA9PSBhZmZpbml0eV90b3BfbWV0aG9kX2FsbCkpIHsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfdG9wX21ldGhvZCA9IGFmZmluaXR5X3RvcF9tZXRob2RfY3B1aW5mbzsKKyAgICB9CisKKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfdG9wX21ldGhvZCA9PSBhZmZpbml0eV90b3BfbWV0aG9kX2FsbCkgeworICAgICAgICAvLworICAgICAgICAvLyBJbiB0aGUgZGVmYXVsdCBjb2RlIHBhdGgsIGVycm9ycyBhcmUgbm90IGZhdGFsIC0gd2UganVzdCB0cnkgdXNpbmcKKyAgICAgICAgLy8gYW5vdGhlciBtZXRob2QuICBXZSBvbmx5IGVtaXQgYSB3YXJuaW5nIG1lc3NhZ2UgaWYgYWZmaW5pdHkgaXMgb24sCisgICAgICAgIC8vIG9yIHRoZSB2ZXJib3NlIGZsYWcgaXMgc2V0LCBhbiB0aGUgbm93YXJuaW5ncyBmbGFnIHdhcyBub3Qgc2V0LgorICAgICAgICAvLworICAgICAgICBjb25zdCBjaGFyICpmaWxlX25hbWUgPSBOVUxMOworICAgICAgICBpbnQgbGluZSA9IDA7CisKKyMgaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorCisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgICAgICBLTVBfSU5GT1JNKEFmZkluZm9TdHIsICJLTVBfQUZGSU5JVFkiLCBLTVBfSTE4Tl9TVFIoRGVjb2Rpbmd4MkFQSUMpKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbGVfbmFtZSA9IE5VTEw7CisgICAgICAgIGRlcHRoID0gX19rbXBfYWZmaW5pdHlfY3JlYXRlX3gyYXBpY2lkX21hcCgmYWRkcmVzczJvcywgJm1zZ19pZCk7CisgICAgICAgIGlmIChkZXB0aCA9PSAwKSB7CisgICAgICAgICAgICBLTVBfQVNTRVJUKF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfbm9uZSk7CisgICAgICAgICAgICBLTVBfQVNTRVJUKGFkZHJlc3Myb3MgPT0gTlVMTCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoZGVwdGggPCAwKSB7CisgICAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICAgICAgICAgIGlmIChtc2dfaWQgIT0ga21wX2kxOG5fbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKEFmZkluZm9TdHJTdHIsICJLTVBfQUZGSU5JVFkiLCBfX2ttcF9pMThuX2NhdGdldHMobXNnX2lkKSwKKyAgICAgICAgICAgICAgICAgICAgICBLTVBfSTE4Tl9TVFIoRGVjb2RpbmdMZWdhY3lBUElDKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKEFmZkluZm9TdHIsICJLTVBfQUZGSU5JVFkiLCBLTVBfSTE4Tl9TVFIoRGVjb2RpbmdMZWdhY3lBUElDKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaWxlX25hbWUgPSBOVUxMOworICAgICAgICAgICAgZGVwdGggPSBfX2ttcF9hZmZpbml0eV9jcmVhdGVfYXBpY2lkX21hcCgmYWRkcmVzczJvcywgJm1zZ19pZCk7CisgICAgICAgICAgICBpZiAoZGVwdGggPT0gMCkgeworICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQoX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9ub25lKTsKKyAgICAgICAgICAgICAgICBLTVBfQVNTRVJUKGFkZHJlc3Myb3MgPT0gTlVMTCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyMgZW5kaWYgLyogS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCAqLworCisjIGlmIEtNUF9PU19MSU5VWAorCisgICAgICAgIGlmIChkZXB0aCA8IDApIHsKKyAgICAgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgICAgICAgICAgaWYgKG1zZ19pZCAhPSBrbXBfaTE4bl9udWxsKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oQWZmU3RyUGFyc2VGaWxlbmFtZSwgIktNUF9BRkZJTklUWSIsIF9fa21wX2kxOG5fY2F0Z2V0cyhtc2dfaWQpLCAiL3Byb2MvY3B1aW5mbyIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX0lORk9STShBZmZQYXJzZUZpbGVuYW1lLCAiS01QX0FGRklOSVRZIiwgIi9wcm9jL2NwdWluZm8iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEZJTEUgKmYgPSBmb3BlbigiL3Byb2MvY3B1aW5mbyIsICJyIik7CisgICAgICAgICAgICBpZiAoZiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbXNnX2lkID0ga21wX2kxOG5fc3RyX0NhbnRPcGVuQ3B1aW5mbzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGZpbGVfbmFtZSA9ICIvcHJvYy9jcHVpbmZvIjsKKyAgICAgICAgICAgICAgICBkZXB0aCA9IF9fa21wX2FmZmluaXR5X2NyZWF0ZV9jcHVpbmZvX21hcCgmYWRkcmVzczJvcywgJmxpbmUsICZtc2dfaWQsIGYpOworICAgICAgICAgICAgICAgIGZjbG9zZShmKTsKKyAgICAgICAgICAgICAgICBpZiAoZGVwdGggPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBLTVBfQVNTRVJUKF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfbm9uZSk7CisgICAgICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQoYWRkcmVzczJvcyA9PSBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisjIGVuZGlmIC8qIEtNUF9PU19MSU5VWCAqLworCisjIGlmIEtNUF9PU19XSU5ET1dTICYmIEtNUF9BUkNIX1g4Nl82NAorCisgICAgICAgIGlmICgoZGVwdGggPCAwKSAmJiAoX19rbXBfbnVtX3Byb2NfZ3JvdXBzID4gMSkpIHsKKyAgICAgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgICAgICAgICAgS01QX0lORk9STShBZmZXaW5kb3dzUHJvY0dyb3VwTWFwLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRlcHRoID0gX19rbXBfYWZmaW5pdHlfY3JlYXRlX3Byb2NfZ3JvdXBfbWFwKCZhZGRyZXNzMm9zLCAmbXNnX2lkKTsKKyAgICAgICAgICAgIEtNUF9BU1NFUlQoZGVwdGggIT0gMCk7CisgICAgICAgIH0KKworIyBlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAmJiBLTVBfQVJDSF9YODZfNjQgKi8KKworICAgICAgICBpZiAoZGVwdGggPCAwKSB7CisgICAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSAmJiAobXNnX2lkICE9IGttcF9pMThuX251bGwpKSB7CisgICAgICAgICAgICAgICAgaWYgKGZpbGVfbmFtZSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oVXNpbmdGbGF0T1MsIF9fa21wX2kxOG5fY2F0Z2V0cyhtc2dfaWQpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAobGluZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oVXNpbmdGbGF0T1NGaWxlLCBmaWxlX25hbWUsIF9fa21wX2kxOG5fY2F0Z2V0cyhtc2dfaWQpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oVXNpbmdGbGF0T1NGaWxlTGluZSwgZmlsZV9uYW1lLCBsaW5lLCBfX2ttcF9pMThuX2NhdGdldHMobXNnX2lkKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gRklYTUUgLSBwcmludCBtc2cgaWYgbXNnX2lkID0ga21wX2kxOG5fbnVsbCA/Pz8KKworICAgICAgICAgICAgZmlsZV9uYW1lID0gIiI7CisgICAgICAgICAgICBkZXB0aCA9IF9fa21wX2FmZmluaXR5X2NyZWF0ZV9mbGF0X21hcCgmYWRkcmVzczJvcywgJm1zZ19pZCk7CisgICAgICAgICAgICBpZiAoZGVwdGggPT0gMCkgeworICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQoX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9ub25lKTsKKyAgICAgICAgICAgICAgICBLTVBfQVNTRVJUKGFkZHJlc3Myb3MgPT0gTlVMTCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgS01QX0FTU0VSVChkZXB0aCA+IDApOworICAgICAgICAgICAgS01QX0FTU0VSVChhZGRyZXNzMm9zICE9IE5VTEwpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8KKyAgICAvLyBJZiB0aGUgdXNlciBoYXMgc3BlY2lmaWVkIHRoYXQgYSBwYXJpY3VsYXIgdG9wb2xvZ3kgZGlzY292ZXJ5IG1ldGhvZAorICAgIC8vIGlzIHRvIGJlIHVzZWQsIHRoZW4gd2UgYWJvcnQgaWYgdGhhdCBtZXRob2QgZmFpbHMuICBUaGUgZXhjZXB0aW9uIGlzCisgICAgLy8gZ3JvdXAgYWZmaW5pdHksIHdoaWNoIG1pZ2h0IGhhdmUgYmVlbiBpbXBsaWNpdGx5IHNldC4KKyAgICAvLworCisjIGlmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKworICAgIGVsc2UgaWYgKF9fa21wX2FmZmluaXR5X3RvcF9tZXRob2QgPT0gYWZmaW5pdHlfdG9wX21ldGhvZF94MmFwaWNpZCkgeworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICAgICAgS01QX0lORk9STShBZmZJbmZvU3RyLCAiS01QX0FGRklOSVRZIiwKKyAgICAgICAgICAgICAgS01QX0kxOE5fU1RSKERlY29kaW5neDJBUElDKSk7CisgICAgICAgIH0KKworICAgICAgICBkZXB0aCA9IF9fa21wX2FmZmluaXR5X2NyZWF0ZV94MmFwaWNpZF9tYXAoJmFkZHJlc3Myb3MsICZtc2dfaWQpOworICAgICAgICBpZiAoZGVwdGggPT0gMCkgeworICAgICAgICAgICAgS01QX0FTU0VSVChfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUpOworICAgICAgICAgICAgS01QX0FTU0VSVChhZGRyZXNzMm9zID09IE5VTEwpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChkZXB0aCA8IDApIHsKKyAgICAgICAgICAgIEtNUF9BU1NFUlQobXNnX2lkICE9IGttcF9pMThuX251bGwpOworICAgICAgICAgICAgS01QX0ZBVEFMKE1zZ0V4aXRpbmcsIF9fa21wX2kxOG5fY2F0Z2V0cyhtc2dfaWQpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID09IGFmZmluaXR5X3RvcF9tZXRob2RfYXBpY2lkKSB7CisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgICAgICBLTVBfSU5GT1JNKEFmZkluZm9TdHIsICJLTVBfQUZGSU5JVFkiLAorICAgICAgICAgICAgICBLTVBfSTE4Tl9TVFIoRGVjb2RpbmdMZWdhY3lBUElDKSk7CisgICAgICAgIH0KKworICAgICAgICBkZXB0aCA9IF9fa21wX2FmZmluaXR5X2NyZWF0ZV9hcGljaWRfbWFwKCZhZGRyZXNzMm9zLCAmbXNnX2lkKTsKKyAgICAgICAgaWYgKGRlcHRoID09IDApIHsKKyAgICAgICAgICAgIEtNUF9BU1NFUlQoX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9ub25lKTsKKyAgICAgICAgICAgIEtNUF9BU1NFUlQoYWRkcmVzczJvcyA9PSBOVUxMKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGVwdGggPCAwKSB7CisgICAgICAgICAgICBLTVBfQVNTRVJUKG1zZ19pZCAhPSBrbXBfaTE4bl9udWxsKTsKKyAgICAgICAgICAgIEtNUF9GQVRBTChNc2dFeGl0aW5nLCBfX2ttcF9pMThuX2NhdGdldHMobXNnX2lkKSk7CisgICAgICAgIH0KKyAgICB9CisKKyMgZW5kaWYgLyogS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCAqLworCisgICAgZWxzZSBpZiAoX19rbXBfYWZmaW5pdHlfdG9wX21ldGhvZCA9PSBhZmZpbml0eV90b3BfbWV0aG9kX2NwdWluZm8pIHsKKyAgICAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7CisgICAgICAgIGlmIChfX2ttcF9jcHVpbmZvX2ZpbGUgIT0gTlVMTCkgeworICAgICAgICAgICAgZmlsZW5hbWUgPSBfX2ttcF9jcHVpbmZvX2ZpbGU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBmaWxlbmFtZSA9ICIvcHJvYy9jcHVpbmZvIjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgICAgICBLTVBfSU5GT1JNKEFmZlBhcnNlRmlsZW5hbWUsICJLTVBfQUZGSU5JVFkiLCBmaWxlbmFtZSk7CisgICAgICAgIH0KKworICAgICAgICBGSUxFICpmID0gZm9wZW4oZmlsZW5hbWUsICJyIik7CisgICAgICAgIGlmIChmID09IE5VTEwpIHsKKyAgICAgICAgICAgIGludCBjb2RlID0gZXJybm87CisgICAgICAgICAgICBpZiAoX19rbXBfY3B1aW5mb19maWxlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgICAgICAgICAgS01QX01TRyhDYW50T3BlbkZpbGVGb3JSZWFkaW5nLCBmaWxlbmFtZSksCisgICAgICAgICAgICAgICAgICAgIEtNUF9FUlIoY29kZSksCisgICAgICAgICAgICAgICAgICAgIEtNUF9ITlQoTmFtZUNvbWVzRnJvbV9DUFVJTkZPX0ZJTEUpLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgICAgICAgICAgS01QX01TRyhDYW50T3BlbkZpbGVGb3JSZWFkaW5nLCBmaWxlbmFtZSksCisgICAgICAgICAgICAgICAgICAgIEtNUF9FUlIoY29kZSksCisgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpbnQgbGluZSA9IDA7CisgICAgICAgIGRlcHRoID0gX19rbXBfYWZmaW5pdHlfY3JlYXRlX2NwdWluZm9fbWFwKCZhZGRyZXNzMm9zLCAmbGluZSwgJm1zZ19pZCwgZik7CisgICAgICAgIGZjbG9zZShmKTsKKyAgICAgICAgaWYgKGRlcHRoIDwgMCkgeworICAgICAgICAgICAgS01QX0FTU0VSVChtc2dfaWQgIT0ga21wX2kxOG5fbnVsbCk7CisgICAgICAgICAgICBpZiAobGluZSA+IDApIHsKKyAgICAgICAgICAgICAgICBLTVBfRkFUQUwoRmlsZUxpbmVNc2dFeGl0aW5nLCBmaWxlbmFtZSwgbGluZSwgX19rbXBfaTE4bl9jYXRnZXRzKG1zZ19pZCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgS01QX0ZBVEFMKEZpbGVNc2dFeGl0aW5nLCBmaWxlbmFtZSwgX19rbXBfaTE4bl9jYXRnZXRzKG1zZ19pZCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUpIHsKKyAgICAgICAgICAgIEtNUF9BU1NFUlQoZGVwdGggPT0gMCk7CisgICAgICAgICAgICBLTVBfQVNTRVJUKGFkZHJlc3Myb3MgPT0gTlVMTCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyMgaWYgS01QX09TX1dJTkRPV1MgJiYgS01QX0FSQ0hfWDg2XzY0CisKKyAgICBlbHNlIGlmIChfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID09IGFmZmluaXR5X3RvcF9tZXRob2RfZ3JvdXApIHsKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oQWZmV2luZG93c1Byb2NHcm91cE1hcCwgIktNUF9BRkZJTklUWSIpOworICAgICAgICB9CisKKyAgICAgICAgZGVwdGggPSBfX2ttcF9hZmZpbml0eV9jcmVhdGVfcHJvY19ncm91cF9tYXAoJmFkZHJlc3Myb3MsICZtc2dfaWQpOworICAgICAgICBLTVBfQVNTRVJUKGRlcHRoICE9IDApOworICAgICAgICBpZiAoZGVwdGggPCAwKSB7CisgICAgICAgICAgICBLTVBfQVNTRVJUKG1zZ19pZCAhPSBrbXBfaTE4bl9udWxsKTsKKyAgICAgICAgICAgIEtNUF9GQVRBTChNc2dFeGl0aW5nLCBfX2ttcF9pMThuX2NhdGdldHMobXNnX2lkKSk7CisgICAgICAgIH0KKyAgICB9CisKKyMgZW5kaWYgLyogS01QX09TX1dJTkRPV1MgJiYgS01QX0FSQ0hfWDg2XzY0ICovCisKKyAgICBlbHNlIGlmIChfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID09IGFmZmluaXR5X3RvcF9tZXRob2RfZmxhdCkgeworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICAgICAgS01QX0lORk9STShBZmZVc2luZ0ZsYXRPUywgIktNUF9BRkZJTklUWSIpOworICAgICAgICB9CisKKyAgICAgICAgZGVwdGggPSBfX2ttcF9hZmZpbml0eV9jcmVhdGVfZmxhdF9tYXAoJmFkZHJlc3Myb3MsICZtc2dfaWQpOworICAgICAgICBpZiAoZGVwdGggPT0gMCkgeworICAgICAgICAgICAgS01QX0FTU0VSVChfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUpOworICAgICAgICAgICAgS01QX0FTU0VSVChhZGRyZXNzMm9zID09IE5VTEwpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8vIHNob3VsZCBub3QgZmFpbAorICAgICAgICBLTVBfQVNTRVJUKGRlcHRoID4gMCk7CisgICAgICAgIEtNUF9BU1NFUlQoYWRkcmVzczJvcyAhPSBOVUxMKTsKKyAgICB9CisKKyAgICBpZiAoYWRkcmVzczJvcyA9PSBOVUxMKSB7CisgICAgICAgIGlmIChLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpCisgICAgICAgICAgJiYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UgfHwgKF9fa21wX2FmZmluaXR5X3dhcm5pbmdzCisgICAgICAgICAgJiYgKF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfbm9uZSkpKSkgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoRXJyb3JJbml0aWFsaXplQWZmaW5pdHkpOworICAgICAgICB9CisgICAgICAgIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9ub25lOworICAgICAgICBfX2ttcF9hZmZpbl9tYXNrX3NpemUgPSAwOworICAgICAgICByZXR1cm47CisgICAgfQorCisjIGlmIEtNUF9NSUMKKyAgICBfX2ttcF9hcHBseV90aHJlYWRfcGxhY2VzKCZhZGRyZXNzMm9zLCBkZXB0aCk7CisjIGVuZGlmCisKKyAgICAvLworICAgIC8vIENyZWF0ZSB0aGUgdGFibGUgb2YgbWFza3MsIGluZGV4ZWQgYnkgdGhyZWFkIElkLgorICAgIC8vCisgICAgdW5zaWduZWQgbWF4SW5kZXg7CisgICAgdW5zaWduZWQgbnVtVW5pcXVlOworICAgIGttcF9hZmZpbl9tYXNrX3QgKm9zSWQyTWFzayA9IF9fa21wX2NyZWF0ZV9tYXNrcygmbWF4SW5kZXgsICZudW1VbmlxdWUsCisgICAgICBhZGRyZXNzMm9zLCBfX2ttcF9hdmFpbF9wcm9jKTsKKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMgPT0gMCkgeworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKChpbnQpbnVtVW5pcXVlID09IF9fa21wX2F2YWlsX3Byb2MpOworICAgIH0KKworICAgIC8vCisgICAgLy8gU2V0IHRoZSBjaGlsZE51bXMgdmVjdG9yIGluIGFsbCBBZGRyZXNzIG9iamVjdHMuICBUaGlzIG11c3QgYmUgZG9uZQorICAgIC8vIGJlZm9yZSB3ZSBjYW4gc29ydCB1c2luZyBfX2ttcF9hZmZpbml0eV9jbXBfQWRkcmVzc19jaGlsZF9udW0oKSwKKyAgICAvLyB3aGljaCB0YWtlcyBpbnRvIGFjY291bnQgdGhlIHNldHRpbmcgb2YgX19rbXBfYWZmaW5pdHlfY29tcGFjdC4KKyAgICAvLworICAgIF9fa21wX2FmZmluaXR5X2Fzc2lnbl9jaGlsZF9udW1zKGFkZHJlc3Myb3MsIF9fa21wX2F2YWlsX3Byb2MpOworCisgICAgc3dpdGNoIChfX2ttcF9hZmZpbml0eV90eXBlKSB7CisKKyAgICAgICAgY2FzZSBhZmZpbml0eV9leHBsaWNpdDoKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF9hZmZpbml0eV9wcm9jbGlzdCAhPSBOVUxMKTsKKyMgaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgaWYgKF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSA9PSBwcm9jX2JpbmRfaW50ZWwpCisjIGVuZGlmCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3Byb2Nlc3NfcHJvY2xpc3QoJl9fa21wX2FmZmluaXR5X21hc2tzLAorICAgICAgICAgICAgICAmX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzLCBfX2ttcF9hZmZpbml0eV9wcm9jbGlzdCwgb3NJZDJNYXNrLAorICAgICAgICAgICAgICBtYXhJbmRleCk7CisgICAgICAgIH0KKyMgaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9wcm9jZXNzX3BsYWNlbGlzdCgmX19rbXBfYWZmaW5pdHlfbWFza3MsCisgICAgICAgICAgICAgICZfX2ttcF9hZmZpbml0eV9udW1fbWFza3MsIF9fa21wX2FmZmluaXR5X3Byb2NsaXN0LCBvc0lkMk1hc2ssCisgICAgICAgICAgICAgIG1heEluZGV4KTsKKyAgICAgICAgfQorIyBlbmRpZgorICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzID09IDApIHsKKyAgICAgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlIHx8IChfX2ttcF9hZmZpbml0eV93YXJuaW5ncworICAgICAgICAgICAgICAmJiAoX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9ub25lKSkpIHsKKyAgICAgICAgICAgICAgICBLTVBfV0FSTklORyhBZmZOb1ZhbGlkUHJvY0lEKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9ub25lOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICAgIC8vCisgICAgICAgIC8vIFRoZSBvdGhlciBhZmZpbml0eSB0eXBlcyByZWx5IG9uIHNvcnRpbmcgdGhlIEFkZHJlc3NlcyBhY2NvcmRpbmcKKyAgICAgICAgLy8gdG8gc29tZSBwZXJtdXRhdGlvbiBvZiB0aGUgbWFjaGluZSB0b3BvbG9neSB0cmVlLiAgU2V0CisgICAgICAgIC8vIF9fa21wX2FmZmluaXR5X2NvbXBhY3QgYW5kIF9fa21wX2FmZmluaXR5X29mZnNldCBhcHByb3ByaWF0ZWx5LAorICAgICAgICAvLyB0aGVuIGp1bXAgdG8gYSBjb21tb24gY29kZSBmcmFnbWVudCB0byBkbyB0aGUgc29ydCBhbmQgY3JlYXRlCisgICAgICAgIC8vIHRoZSBhcnJheSBvZiBhZmZpbml0eSBtYXNrcy4KKyAgICAgICAgLy8KKworICAgICAgICBjYXNlIGFmZmluaXR5X2xvZ2ljYWw6CisgICAgICAgIF9fa21wX2FmZmluaXR5X2NvbXBhY3QgPSAwOworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfb2Zmc2V0KSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9vZmZzZXQgPSBfX2ttcF9uVGhyZWFkc1BlckNvcmUgKiBfX2ttcF9hZmZpbml0eV9vZmZzZXQKKyAgICAgICAgICAgICAgJSBfX2ttcF9hdmFpbF9wcm9jOworICAgICAgICB9CisgICAgICAgIGdvdG8gc29ydEFkZHJlc3NlczsKKworICAgICAgICBjYXNlIGFmZmluaXR5X3BoeXNpY2FsOgorICAgICAgICBpZiAoX19rbXBfblRocmVhZHNQZXJDb3JlID4gMSkgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfY29tcGFjdCA9IDE7CisgICAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfY29tcGFjdCA+PSBkZXB0aCkgeworICAgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2NvbXBhY3QgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfY29tcGFjdCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X29mZnNldCkgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfb2Zmc2V0ID0gX19rbXBfblRocmVhZHNQZXJDb3JlICogX19rbXBfYWZmaW5pdHlfb2Zmc2V0CisgICAgICAgICAgICAgICUgX19rbXBfYXZhaWxfcHJvYzsKKyAgICAgICAgfQorICAgICAgICBnb3RvIHNvcnRBZGRyZXNzZXM7CisKKyAgICAgICAgY2FzZSBhZmZpbml0eV9zY2F0dGVyOgorICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfY29tcGFjdCA+PSBkZXB0aCkgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfY29tcGFjdCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9jb21wYWN0ID0gZGVwdGggLSAxIC0gX19rbXBfYWZmaW5pdHlfY29tcGFjdDsKKyAgICAgICAgfQorICAgICAgICBnb3RvIHNvcnRBZGRyZXNzZXM7CisKKyAgICAgICAgY2FzZSBhZmZpbml0eV9jb21wYWN0OgorICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfY29tcGFjdCA+PSBkZXB0aCkgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfY29tcGFjdCA9IGRlcHRoIC0gMTsKKyAgICAgICAgfQorICAgICAgICBnb3RvIHNvcnRBZGRyZXNzZXM7CisKKyAgICAgICAgY2FzZSBhZmZpbml0eV9iYWxhbmNlZDoKKyAgICAgICAgLy8gQmFsYW5jZWQgd29ya3Mgb25seSBmb3IgdGhlIGNhc2Ugb2YgYSBzaW5nbGUgcGFja2FnZQorICAgICAgICBpZiggblBhY2thZ2VzID4gMSApIHsKKyAgICAgICAgICAgIGlmKCBfX2ttcF9hZmZpbml0eV92ZXJib3NlIHx8IF9fa21wX2FmZmluaXR5X3dhcm5pbmdzICkgeworICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBBZmZCYWxhbmNlZE5vdEF2YWlsLCAiS01QX0FGRklOSVRZIiApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfdHlwZSA9IGFmZmluaXR5X25vbmU7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSBpZiggX19rbXBfYWZmaW5pdHlfdW5pZm9ybV90b3BvbG9neSgpICkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSB7IC8vIE5vbi11bmlmb3JtIHRvcG9sb2d5CisKKyAgICAgICAgICAgIC8vIFNhdmUgdGhlIGRlcHRoIGZvciBmdXJ0aGVyIHVzYWdlCisgICAgICAgICAgICBfX2ttcF9hZmZfZGVwdGggPSBkZXB0aDsKKworICAgICAgICAgICAgLy8gTnVtYmVyIG9mIGh5cGVyIHRocmVhZHMgcGVyIGNvcmUgaW4gSFQgbWFjaGluZQorICAgICAgICAgICAgaW50IG50aF9wZXJfY29yZSA9IF9fa21wX25UaHJlYWRzUGVyQ29yZTsKKworICAgICAgICAgICAgaW50IGNvcmVfbGV2ZWw7CisgICAgICAgICAgICBpZiggbnRoX3Blcl9jb3JlID4gMSApIHsKKyAgICAgICAgICAgICAgICBjb3JlX2xldmVsID0gZGVwdGggLSAyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjb3JlX2xldmVsID0gZGVwdGggLSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IG5jb3JlcyA9IGFkZHJlc3Myb3NbIF9fa21wX2F2YWlsX3Byb2MgLSAxIF0uZmlyc3QubGFiZWxzWyBjb3JlX2xldmVsIF0gKyAxOworICAgICAgICAgICAgaW50IG5wcm9jID0gbnRoX3Blcl9jb3JlICogbmNvcmVzOworCisgICAgICAgICAgICBwcm9jYXJyID0gKCBpbnQgKiApX19rbXBfYWxsb2NhdGUoIHNpemVvZiggaW50ICkgKiBucHJvYyApOworICAgICAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBucHJvYzsgaSsrICkgeworICAgICAgICAgICAgICAgIHByb2NhcnJbIGkgXSA9IC0xOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IF9fa21wX2F2YWlsX3Byb2M7IGkrKyApIHsKKyAgICAgICAgICAgICAgICBpbnQgcHJvYyA9IGFkZHJlc3Myb3NbIGkgXS5zZWNvbmQ7CisgICAgICAgICAgICAgICAgLy8gSWYgZGVwdGggPT0gMyB0aGVuIGxldmVsPTAgLSBwYWNrYWdlLCBsZXZlbD0xIC0gY29yZSwgbGV2ZWw9MiAtIHRocmVhZC4KKyAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBvbmx5IG9uZSB0aHJlYWQgcGVyIGNvcmUgdGhlbiBkZXB0aCA9PSAyOiBsZXZlbCAwIC0gcGFja2FnZSwKKyAgICAgICAgICAgICAgICAvLyBsZXZlbCAxIC0gY29yZS4KKyAgICAgICAgICAgICAgICBpbnQgbGV2ZWwgPSBkZXB0aCAtIDE7CisKKyAgICAgICAgICAgICAgICAvLyBfX2ttcF9udGhfcGVyX2NvcmUgPT0gMQorICAgICAgICAgICAgICAgIGludCB0aHJlYWQgPSAwOworICAgICAgICAgICAgICAgIGludCBjb3JlID0gYWRkcmVzczJvc1sgaSBdLmZpcnN0LmxhYmVsc1sgbGV2ZWwgXTsKKyAgICAgICAgICAgICAgICAvLyBJZiB0aGUgdGhyZWFkIGxldmVsIGV4aXN0cywgdGhhdCBpcyB3ZSBoYXZlIG1vcmUgdGhhbiBvbmUgdGhyZWFkIGNvbnRleHQgcGVyIGNvcmUKKyAgICAgICAgICAgICAgICBpZiggbnRoX3Blcl9jb3JlID4gMSApIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyZWFkID0gYWRkcmVzczJvc1sgaSBdLmZpcnN0LmxhYmVsc1sgbGV2ZWwgXSAlIG50aF9wZXJfY29yZTsKKyAgICAgICAgICAgICAgICAgICAgY29yZSA9IGFkZHJlc3Myb3NbIGkgXS5maXJzdC5sYWJlbHNbIGxldmVsIC0gMSBdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwcm9jYXJyWyBjb3JlICogbnRoX3Blcl9jb3JlICsgdGhyZWFkIF0gPSBwcm9jOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHNvcnRBZGRyZXNzZXM6CisgICAgICAgIC8vCisgICAgICAgIC8vIEFsbG9jYXRlIHRoZSBndGlkLT5hZmZpbml0eSBtYXNrIHRhYmxlLgorICAgICAgICAvLworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfZHVwcykgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzID0gX19rbXBfYXZhaWxfcHJvYzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X251bV9tYXNrcyA9IG51bVVuaXF1ZTsKKyAgICAgICAgfQorCisjIGlmIE9NUF80MF9FTkFCTEVECisgICAgICAgIGlmICggKCBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gIT0gcHJvY19iaW5kX2ludGVsICkKKyAgICAgICAgICAmJiAoIF9fa21wX2FmZmluaXR5X251bV9wbGFjZXMgPiAwICkKKyAgICAgICAgICAmJiAoICh1bnNpZ25lZClfX2ttcF9hZmZpbml0eV9udW1fcGxhY2VzIDwgX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzICkgKSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9udW1fbWFza3MgPSBfX2ttcF9hZmZpbml0eV9udW1fcGxhY2VzOworICAgICAgICB9CisjIGVuZGlmCisKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfbWFza3MgPSAoa21wX2FmZmluX21hc2tfdCopX19rbXBfYWxsb2NhdGUoCisgICAgICAgICAgX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzICogX19rbXBfYWZmaW5fbWFza19zaXplKTsKKworICAgICAgICAvLworICAgICAgICAvLyBTb3J0IHRoZSBhZGRyZXNzMm9zIHRhYmxlIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBzZXR0aW5nIG9mCisgICAgICAgIC8vIF9fa21wX2FmZmluaXR5X2NvbXBhY3QsIHRoZW4gZmlsbCBvdXQgX19rbXBfYWZmaW5pdHlfbWFza3MuCisgICAgICAgIC8vCisgICAgICAgIHFzb3J0KGFkZHJlc3Myb3MsIF9fa21wX2F2YWlsX3Byb2MsIHNpemVvZigqYWRkcmVzczJvcyksCisgICAgICAgICAgX19rbXBfYWZmaW5pdHlfY21wX0FkZHJlc3NfY2hpbGRfbnVtKTsKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICB1bnNpZ25lZCBqOworICAgICAgICAgICAgZm9yIChpID0gMCwgaiA9IDA7IGkgPCBfX2ttcF9hdmFpbF9wcm9jOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoKCEgX19rbXBfYWZmaW5pdHlfZHVwcykgJiYgKCEgYWRkcmVzczJvc1tpXS5maXJzdC5sZWFkZXIpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBvc0lkID0gYWRkcmVzczJvc1tpXS5zZWNvbmQ7CisgICAgICAgICAgICAgICAga21wX2FmZmluX21hc2tfdCAqc3JjID0gS01QX0NQVV9JTkRFWChvc0lkMk1hc2ssIG9zSWQpOworICAgICAgICAgICAgICAgIGttcF9hZmZpbl9tYXNrX3QgKmRlc3QKKyAgICAgICAgICAgICAgICAgID0gS01QX0NQVV9JTkRFWChfX2ttcF9hZmZpbml0eV9tYXNrcywgaik7CisgICAgICAgICAgICAgICAgS01QX0FTU0VSVChLTVBfQ1BVX0lTU0VUKG9zSWQsIHNyYykpOworICAgICAgICAgICAgICAgIEtNUF9DUFVfQ09QWShkZXN0LCBzcmMpOworICAgICAgICAgICAgICAgIGlmICgrK2ogPj0gX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoaiA9PSBfX2ttcF9hZmZpbml0eV9udW1fbWFza3MpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIEtNUF9BU1NFUlQyKDAsICJVbmV4cGVjdGVkIGFmZmluaXR5IHNldHRpbmciKTsKKyAgICB9CisKKyAgICBfX2ttcF9mcmVlKG9zSWQyTWFzayk7CisgICAgbWFjaGluZV9oaWVyYXJjaHkuaW5pdChhZGRyZXNzMm9zLCBfX2ttcF9hdmFpbF9wcm9jKTsKK30KKworCit2b2lkCitfX2ttcF9hZmZpbml0eV9pbml0aWFsaXplKHZvaWQpCit7CisgICAgLy8KKyAgICAvLyBNdWNoIG9mIHRoZSBjb2RlIGFib3ZlIHdhcyB3cml0dGVuIGFzc3VtbWluZyB0aGF0IGlmIGEgbWFjaGluZSB3YXMgbm90CisgICAgLy8gYWZmaW5pdHkgY2FwYWJsZSwgdGhlbiBfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUuICBXZSBub3cKKyAgICAvLyBleHBsaWNpdGx5IHJlcHJlc2VudCB0aGlzIGFzIF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfZGlzYWJsZWQuCisgICAgLy8KKyAgICAvLyBUaGVyZSBhcmUgdG9vIG1hbnkgY2hlY2tzIGZvciBfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUKKyAgICAvLyBpbiB0aGlzIGNvZGUuICBJbnN0ZWFkIG9mIHRyeWluZyB0byBjaGFuZ2UgdGhlbSBhbGwsIGNoZWNrIGlmCisgICAgLy8gX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9kaXNhYmxlZCwgYW5kIGlmIHNvLCBzbGFtIGl0IHdpdGgKKyAgICAvLyBhZmZpbml0eV9ub25lLCBjYWxsIHRoZSByZWFsIGluaXRpYWxpemF0aW9uIHJvdXRpbmUsIHRoZW4gcmVzdG9yZQorICAgIC8vIF9fa21wX2FmZmluaXR5X3R5cGUgdG8gYWZmaW5pdHlfZGlzYWJsZWQuCisgICAgLy8KKyAgICBpbnQgZGlzYWJsZWQgPSAoX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9kaXNhYmxlZCk7CisgICAgaWYgKCEgS01QX0FGRklOSVRZX0NBUEFCTEUoKSkgeworICAgICAgICBLTVBfQVNTRVJUKGRpc2FibGVkKTsKKyAgICB9CisgICAgaWYgKGRpc2FibGVkKSB7CisgICAgICAgIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9ub25lOworICAgIH0KKyAgICBfX2ttcF9hdXhfYWZmaW5pdHlfaW5pdGlhbGl6ZSgpOworICAgIGlmIChkaXNhYmxlZCkgeworICAgICAgICBfX2ttcF9hZmZpbml0eV90eXBlID0gYWZmaW5pdHlfZGlzYWJsZWQ7CisgICAgfQorfQorCisKK3ZvaWQKK19fa21wX2FmZmluaXR5X3VuaW5pdGlhbGl6ZSh2b2lkKQoreworICAgIGlmIChfX2ttcF9hZmZpbml0eV9tYXNrcyAhPSBOVUxMKSB7CisgICAgICAgIF9fa21wX2ZyZWUoX19rbXBfYWZmaW5pdHlfbWFza3MpOworICAgICAgICBfX2ttcF9hZmZpbml0eV9tYXNrcyA9IE5VTEw7CisgICAgfQorICAgIGlmIChmdWxsTWFzayAhPSBOVUxMKSB7CisgICAgICAgIEtNUF9DUFVfRlJFRShmdWxsTWFzayk7CisgICAgICAgIGZ1bGxNYXNrID0gTlVMTDsKKyAgICB9CisgICAgX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzID0gMDsKKyMgaWYgT01QXzQwX0VOQUJMRUQKKyAgICBfX2ttcF9hZmZpbml0eV9udW1fcGxhY2VzID0gMDsKKyMgZW5kaWYKKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfcHJvY2xpc3QgIT0gTlVMTCkgeworICAgICAgICBfX2ttcF9mcmVlKF9fa21wX2FmZmluaXR5X3Byb2NsaXN0KTsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJvY2xpc3QgPSBOVUxMOworICAgIH0KKyAgICBpZiggYWRkcmVzczJvcyAhPSBOVUxMICkgeworICAgICAgICBfX2ttcF9mcmVlKCBhZGRyZXNzMm9zICk7CisgICAgICAgIGFkZHJlc3Myb3MgPSBOVUxMOworICAgIH0KKyAgICBpZiggcHJvY2FyciAhPSBOVUxMICkgeworICAgICAgICBfX2ttcF9mcmVlKCBwcm9jYXJyICk7CisgICAgICAgIHByb2NhcnIgPSBOVUxMOworICAgIH0KK30KKworCit2b2lkCitfX2ttcF9hZmZpbml0eV9zZXRfaW5pdF9tYXNrKGludCBndGlkLCBpbnQgaXNhX3Jvb3QpCit7CisgICAgaWYgKCEgS01QX0FGRklOSVRZX0NBUEFCTEUoKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAga21wX2luZm9fdCAqdGggPSAoa21wX2luZm9fdCAqKVRDUl9TWU5DX1BUUihfX2ttcF90aHJlYWRzW2d0aWRdKTsKKyAgICBpZiAodGgtPnRoLnRoX2FmZmluX21hc2sgPT0gTlVMTCkgeworICAgICAgICBLTVBfQ1BVX0FMTE9DKHRoLT50aC50aF9hZmZpbl9tYXNrKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIEtNUF9DUFVfWkVSTyh0aC0+dGgudGhfYWZmaW5fbWFzayk7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBDb3B5IHRoZSB0aHJlYWQgbWFzayB0byB0aGUga21wX2luZm9fdCBzdHJ1Y3V0dXJlLgorICAgIC8vIElmIF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfbm9uZSwgY29weSB0aGUgImZ1bGwiIG1hc2ssIGkuZS4gb25lCisgICAgLy8gdGhhdCBoYXMgYWxsIG9mIHRoZSBPUyBwcm9jIGlkcyBzZXQsIG9yIGlmIF9fa21wX2FmZmluaXR5X3Jlc3BlY3RfbWFzaworICAgIC8vIGlzIHNldCwgdGhlbiB0aGUgZnVsbCBtYXNrIGlzIHRoZSBzYW1lIGFzIHRoZSBtYXNrIG9mIHRoZSBpbml0aWFsaXphdGlvbgorICAgIC8vIHRocmVhZC4KKyAgICAvLworICAgIGttcF9hZmZpbl9tYXNrX3QgKm1hc2s7CisgICAgaW50IGk7CisKKyMgaWYgT01QXzQwX0VOQUJMRUQKKyAgICBpZiAoX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdID09IHByb2NfYmluZF9pbnRlbCkKKyMgZW5kaWYKKyAgICB7CisgICAgICAgIGlmICgoX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9ub25lKSB8fCAoX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9iYWxhbmNlZCkKKyAgICAgICAgICApIHsKKyMgaWYgS01QX09TX1dJTkRPV1MgJiYgS01QX0FSQ0hfWDg2XzY0CisgICAgICAgICAgICBpZiAoX19rbXBfbnVtX3Byb2NfZ3JvdXBzID4gMSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyMgZW5kaWYKKyAgICAgICAgICAgIEtNUF9BU1NFUlQoZnVsbE1hc2sgIT0gTlVMTCk7CisgICAgICAgICAgICBpID0gS01QX1BMQUNFX0FMTDsKKyAgICAgICAgICAgIG1hc2sgPSBmdWxsTWFzazsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2FmZmluaXR5X251bV9tYXNrcyA+IDAgKTsKKyAgICAgICAgICAgIGkgPSAoZ3RpZCArIF9fa21wX2FmZmluaXR5X29mZnNldCkgJSBfX2ttcF9hZmZpbml0eV9udW1fbWFza3M7CisgICAgICAgICAgICBtYXNrID0gS01QX0NQVV9JTkRFWChfX2ttcF9hZmZpbml0eV9tYXNrcywgaSk7CisgICAgICAgIH0KKyAgICB9CisjIGlmIE9NUF80MF9FTkFCTEVECisgICAgZWxzZSB7CisgICAgICAgIGlmICgoISBpc2Ffcm9vdCkKKyAgICAgICAgICB8fCAoX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdID09IHByb2NfYmluZF9mYWxzZSkpIHsKKyMgIGlmIEtNUF9PU19XSU5ET1dTICYmIEtNUF9BUkNIX1g4Nl82NAorICAgICAgICAgICAgaWYgKF9fa21wX251bV9wcm9jX2dyb3VwcyA+IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisjICBlbmRpZgorICAgICAgICAgICAgS01QX0FTU0VSVChmdWxsTWFzayAhPSBOVUxMKTsKKyAgICAgICAgICAgIGkgPSBLTVBfUExBQ0VfQUxMOworICAgICAgICAgICAgbWFzayA9IGZ1bGxNYXNrOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIGludCBpID0gc29tZSBoYXNoIGZ1bmN0aW9uIG9yIGp1c3QgYSBjb3VudGVyIHRoYXQgZG9lc24ndAorICAgICAgICAgICAgLy8gYWx3YXlzIHN0YXJ0IGF0IDAuICBVc2UgZ3RpZCBmb3Igbm93LgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2FmZmluaXR5X251bV9tYXNrcyA+IDAgKTsKKyAgICAgICAgICAgIGkgPSAoZ3RpZCArIF9fa21wX2FmZmluaXR5X29mZnNldCkgJSBfX2ttcF9hZmZpbml0eV9udW1fbWFza3M7CisgICAgICAgICAgICBtYXNrID0gS01QX0NQVV9JTkRFWChfX2ttcF9hZmZpbml0eV9tYXNrcywgaSk7CisgICAgICAgIH0KKyAgICB9CisjIGVuZGlmCisKKyMgaWYgT01QXzQwX0VOQUJMRUQKKyAgICB0aC0+dGgudGhfY3VycmVudF9wbGFjZSA9IGk7CisgICAgaWYgKGlzYV9yb290KSB7CisgICAgICAgIHRoLT50aC50aF9uZXdfcGxhY2UgPSBpOworICAgICAgICB0aC0+dGgudGhfZmlyc3RfcGxhY2UgPSAwOworICAgICAgICB0aC0+dGgudGhfbGFzdF9wbGFjZSA9IF9fa21wX2FmZmluaXR5X251bV9tYXNrcyAtIDE7CisgICAgfQorCisgICAgaWYgKGkgPT0gS01QX1BMQUNFX0FMTCkgeworICAgICAgICBLQV9UUkFDRSgxMDAsICgiX19rbXBfYWZmaW5pdHlfc2V0X2luaXRfbWFzazogYmluZGluZyBUIyVkIHRvIGFsbCBwbGFjZXNcbiIsCisgICAgICAgICAgZ3RpZCkpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgS0FfVFJBQ0UoMTAwLCAoIl9fa21wX2FmZmluaXR5X3NldF9pbml0X21hc2s6IGJpbmRpbmcgVCMlZCB0byBwbGFjZSAlZFxuIiwKKyAgICAgICAgICBndGlkLCBpKSk7CisgICAgfQorIyBlbHNlCisgICAgaWYgKGkgPT0gLTEpIHsKKyAgICAgICAgS0FfVFJBQ0UoMTAwLCAoIl9fa21wX2FmZmluaXR5X3NldF9pbml0X21hc2s6IGJpbmRpbmcgVCMlZCB0byBmdWxsTWFza1xuIiwKKyAgICAgICAgICBndGlkKSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBLQV9UUkFDRSgxMDAsICgiX19rbXBfYWZmaW5pdHlfc2V0X2luaXRfbWFzazogYmluZGluZyBUIyVkIHRvIG1hc2sgJWRcbiIsCisgICAgICAgICAgZ3RpZCwgaSkpOworICAgIH0KKyMgZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKworICAgIEtNUF9DUFVfQ09QWSh0aC0+dGgudGhfYWZmaW5fbWFzaywgbWFzayk7CisKKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICBjaGFyIGJ1ZltLTVBfQUZGSU5fTUFTS19QUklOVF9MRU5dOworICAgICAgICBfX2ttcF9hZmZpbml0eV9wcmludF9tYXNrKGJ1ZiwgS01QX0FGRklOX01BU0tfUFJJTlRfTEVOLAorICAgICAgICAgIHRoLT50aC50aF9hZmZpbl9tYXNrKTsKKyAgICAgICAgS01QX0lORk9STShCb3VuZFRvT1NQcm9jU2V0LCAiS01QX0FGRklOSVRZIiwgKGttcF9pbnQzMilnZXRwaWQoKSwgZ3RpZCwKKyAgICAgICAgICBidWYpOworICAgIH0KKworIyBpZiBLTVBfT1NfV0lORE9XUworICAgIC8vCisgICAgLy8gT24gV2luZG93cyogT1MsIHRoZSBwcm9jZXNzIGFmZmluaXR5IG1hc2sgbWlnaHQgaGF2ZSBjaGFuZ2VkLgorICAgIC8vIElmIHRoZSB1c2VyIGRpZG4ndCByZXF1ZXN0IGFmZmluaXR5IGFuZCB0aGlzIGNhbGwgZmFpbHMsCisgICAgLy8ganVzdCBjb250aW51ZSBzaWxlbnRseS4gIFNlZSBDUTE3MTM5My4KKyAgICAvLworICAgIGlmICggX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9ub25lICkgeworICAgICAgICBfX2ttcF9zZXRfc3lzdGVtX2FmZmluaXR5KHRoLT50aC50aF9hZmZpbl9tYXNrLCBGQUxTRSk7CisgICAgfQorICAgIGVsc2UKKyMgZW5kaWYKKyAgICBfX2ttcF9zZXRfc3lzdGVtX2FmZmluaXR5KHRoLT50aC50aF9hZmZpbl9tYXNrLCBUUlVFKTsKK30KKworCisjIGlmIE9NUF80MF9FTkFCTEVECisKK3ZvaWQKK19fa21wX2FmZmluaXR5X3NldF9wbGFjZShpbnQgZ3RpZCkKK3sKKyAgICBpbnQgcmV0dmFsOworCisgICAgaWYgKCEgS01QX0FGRklOSVRZX0NBUEFCTEUoKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAga21wX2luZm9fdCAqdGggPSAoa21wX2luZm9fdCAqKVRDUl9TWU5DX1BUUihfX2ttcF90aHJlYWRzW2d0aWRdKTsKKworICAgIEtBX1RSQUNFKDEwMCwgKCJfX2ttcF9hZmZpbml0eV9zZXRfcGxhY2U6IGJpbmRpbmcgVCMlZCB0byBwbGFjZSAlZCAoY3VycmVudCBwbGFjZSA9ICVkKVxuIiwKKyAgICAgIGd0aWQsIHRoLT50aC50aF9uZXdfcGxhY2UsIHRoLT50aC50aF9jdXJyZW50X3BsYWNlKSk7CisKKyAgICAvLworICAgIC8vIENoZWNrIHRoYXQgdGhlIG5ldyBwbGFjZSBpcyB3aXRoaW4gdGhpcyB0aHJlYWQncyBwYXJ0aXRpb24uCisgICAgLy8KKyAgICBLTVBfREVCVUdfQVNTRVJUKHRoLT50aC50aF9hZmZpbl9tYXNrICE9IE5VTEwpOworICAgIEtNUF9BU1NFUlQodGgtPnRoLnRoX25ld19wbGFjZSA+PSAwKTsKKyAgICBLTVBfQVNTRVJUKCh1bnNpZ25lZCl0aC0+dGgudGhfbmV3X3BsYWNlIDw9IF9fa21wX2FmZmluaXR5X251bV9tYXNrcyk7CisgICAgaWYgKHRoLT50aC50aF9maXJzdF9wbGFjZSA8PSB0aC0+dGgudGhfbGFzdF9wbGFjZSkgeworICAgICAgICBLTVBfQVNTRVJUKCh0aC0+dGgudGhfbmV3X3BsYWNlID49IHRoLT50aC50aF9maXJzdF9wbGFjZSkKKyAgICAgICAgICYmICh0aC0+dGgudGhfbmV3X3BsYWNlIDw9IHRoLT50aC50aF9sYXN0X3BsYWNlKSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBLTVBfQVNTRVJUKCh0aC0+dGgudGhfbmV3X3BsYWNlIDw9IHRoLT50aC50aF9maXJzdF9wbGFjZSkKKyAgICAgICAgIHx8ICh0aC0+dGgudGhfbmV3X3BsYWNlID49IHRoLT50aC50aF9sYXN0X3BsYWNlKSk7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBDb3B5IHRoZSB0aHJlYWQgbWFzayB0byB0aGUga21wX2luZm9fdCBzdHJ1Y3V0dXJlLAorICAgIC8vIGFuZCBzZXQgdGhpcyB0aHJlYWQncyBhZmZpbml0eS4KKyAgICAvLworICAgIGttcF9hZmZpbl9tYXNrX3QgKm1hc2sgPSBLTVBfQ1BVX0lOREVYKF9fa21wX2FmZmluaXR5X21hc2tzLAorICAgICAgdGgtPnRoLnRoX25ld19wbGFjZSk7CisgICAgS01QX0NQVV9DT1BZKHRoLT50aC50aF9hZmZpbl9tYXNrLCBtYXNrKTsKKyAgICB0aC0+dGgudGhfY3VycmVudF9wbGFjZSA9IHRoLT50aC50aF9uZXdfcGxhY2U7CisKKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICBjaGFyIGJ1ZltLTVBfQUZGSU5fTUFTS19QUklOVF9MRU5dOworICAgICAgICBfX2ttcF9hZmZpbml0eV9wcmludF9tYXNrKGJ1ZiwgS01QX0FGRklOX01BU0tfUFJJTlRfTEVOLAorICAgICAgICAgIHRoLT50aC50aF9hZmZpbl9tYXNrKTsKKyAgICAgICAgS01QX0lORk9STShCb3VuZFRvT1NQcm9jU2V0LCAiT01QX1BST0NfQklORCIsIChrbXBfaW50MzIpZ2V0cGlkKCksCisgICAgICAgICAgZ3RpZCwgYnVmKTsKKyAgICB9CisgICAgX19rbXBfc2V0X3N5c3RlbV9hZmZpbml0eSh0aC0+dGgudGhfYWZmaW5fbWFzaywgVFJVRSk7Cit9CisKKyMgZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKworCitpbnQKK19fa21wX2F1eF9zZXRfYWZmaW5pdHkodm9pZCAqKm1hc2spCit7CisgICAgaW50IGd0aWQ7CisgICAga21wX2luZm9fdCAqdGg7CisgICAgaW50IHJldHZhbDsKKworICAgIGlmICghIEtNUF9BRkZJTklUWV9DQVBBQkxFKCkpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgICAgS0FfVFJBQ0UoMTAwMCwgO3sKKyAgICAgICAgY2hhciBidWZbS01QX0FGRklOX01BU0tfUFJJTlRfTEVOXTsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJpbnRfbWFzayhidWYsIEtNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTiwKKyAgICAgICAgICAoa21wX2FmZmluX21hc2tfdCAqKSgqbWFzaykpOworICAgICAgICBfX2ttcF9kZWJ1Z19wcmludGYoImttcF9zZXRfYWZmaW5pdHk6IHNldHRpbmcgYWZmaW5pdHkgbWFzayBmb3IgdGhyZWFkICVkID0gJXNcbiIsCisgICAgICAgICAgZ3RpZCwgYnVmKTsKKyAgICB9KTsKKworICAgIGlmIChfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2spIHsKKyAgICAgICAgaWYgKChtYXNrID09IE5VTEwpIHx8ICgqbWFzayA9PSBOVUxMKSkgeworICAgICAgICAgICAgS01QX0ZBVEFMKEFmZmluaXR5SW52YWxpZE1hc2ssICJrbXBfc2V0X2FmZmluaXR5Iik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB1bnNpZ25lZCBwcm9jOworICAgICAgICAgICAgaW50IG51bV9wcm9jcyA9IDA7CisKKyAgICAgICAgICAgIGZvciAocHJvYyA9IDA7IHByb2MgPCBLTVBfQ1BVX1NFVFNJWkU7IHByb2MrKykgeworICAgICAgICAgICAgICAgIGlmICghIEtNUF9DUFVfSVNTRVQocHJvYywgKGttcF9hZmZpbl9tYXNrX3QgKikoKm1hc2spKSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbnVtX3Byb2NzKys7CisgICAgICAgICAgICAgICAgaWYgKCEgS01QX0NQVV9JU1NFVChwcm9jLCBmdWxsTWFzaykpIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX0ZBVEFMKEFmZmluaXR5SW52YWxpZE1hc2ssICJrbXBfc2V0X2FmZmluaXR5Iik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChudW1fcHJvY3MgPT0gMCkgeworICAgICAgICAgICAgICAgIEtNUF9GQVRBTChBZmZpbml0eUludmFsaWRNYXNrLCAia21wX3NldF9hZmZpbml0eSIpOworICAgICAgICAgICAgfQorCisjIGlmIEtNUF9PU19XSU5ET1dTICYmIEtNUF9BUkNIX1g4Nl82NAorICAgICAgICAgICAgaWYgKF9fa21wX2dldF9wcm9jX2dyb3VwKChrbXBfYWZmaW5fbWFza190ICopKCptYXNrKSkgPCAwKSB7CisgICAgICAgICAgICAgICAgS01QX0ZBVEFMKEFmZmluaXR5SW52YWxpZE1hc2ssICJrbXBfc2V0X2FmZmluaXR5Iik7CisgICAgICAgICAgICB9CisjIGVuZGlmIC8qIEtNUF9PU19XSU5ET1dTICYmIEtNUF9BUkNIX1g4Nl82NCAqLworCisgICAgICAgIH0KKyAgICB9CisKKyAgICB0aCA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisgICAgS01QX0RFQlVHX0FTU0VSVCh0aC0+dGgudGhfYWZmaW5fbWFzayAhPSBOVUxMKTsKKyAgICByZXR2YWwgPSBfX2ttcF9zZXRfc3lzdGVtX2FmZmluaXR5KChrbXBfYWZmaW5fbWFza190ICopKCptYXNrKSwgRkFMU0UpOworICAgIGlmIChyZXR2YWwgPT0gMCkgeworICAgICAgICBLTVBfQ1BVX0NPUFkodGgtPnRoLnRoX2FmZmluX21hc2ssIChrbXBfYWZmaW5fbWFza190ICopKCptYXNrKSk7CisgICAgfQorCisjIGlmIE9NUF80MF9FTkFCTEVECisgICAgdGgtPnRoLnRoX2N1cnJlbnRfcGxhY2UgPSBLTVBfUExBQ0VfVU5ERUZJTkVEOworICAgIHRoLT50aC50aF9uZXdfcGxhY2UgPSBLTVBfUExBQ0VfVU5ERUZJTkVEOworICAgIHRoLT50aC50aF9maXJzdF9wbGFjZSA9IDA7CisgICAgdGgtPnRoLnRoX2xhc3RfcGxhY2UgPSBfX2ttcF9hZmZpbml0eV9udW1fbWFza3MgLSAxOworCisgICAgLy8KKyAgICAvLyBUdXJuIG9mZiA0LjAgYWZmaW5pdHkgZm9yIHRoZSBjdXJyZW50IHRyZWFkIGF0IHRoaXMgcGFyYWxsZWwgbGV2ZWwuCisgICAgLy8KKyAgICB0aC0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLnByb2NfYmluZCA9IHByb2NfYmluZF9mYWxzZTsKKyMgZW5kaWYKKworICAgIHJldHVybiByZXR2YWw7Cit9CisKKworaW50CitfX2ttcF9hdXhfZ2V0X2FmZmluaXR5KHZvaWQgKiptYXNrKQoreworICAgIGludCBndGlkOworICAgIGludCByZXR2YWw7CisgICAga21wX2luZm9fdCAqdGg7CisKKyAgICBpZiAoISBLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOworICAgIHRoID0gX19rbXBfdGhyZWFkc1tndGlkXTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKHRoLT50aC50aF9hZmZpbl9tYXNrICE9IE5VTEwpOworCisgICAgS0FfVFJBQ0UoMTAwMCwgO3sKKyAgICAgICAgY2hhciBidWZbS01QX0FGRklOX01BU0tfUFJJTlRfTEVOXTsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJpbnRfbWFzayhidWYsIEtNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTiwKKyAgICAgICAgICB0aC0+dGgudGhfYWZmaW5fbWFzayk7CisgICAgICAgIF9fa21wX3ByaW50Zigia21wX2dldF9hZmZpbml0eTogc3RvcmVkIGFmZmluaXR5IG1hc2sgZm9yIHRocmVhZCAlZCA9ICVzXG4iLCBndGlkLCBidWYpOworICAgIH0pOworCisgICAgaWYgKF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjaykgeworICAgICAgICBpZiAoKG1hc2sgPT0gTlVMTCkgfHwgKCptYXNrID09IE5VTEwpKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoQWZmaW5pdHlJbnZhbGlkTWFzaywgImttcF9nZXRfYWZmaW5pdHkiKTsKKyAgICAgICAgfQorICAgIH0KKworIyBpZiAhS01QX09TX1dJTkRPV1MKKworICAgIHJldHZhbCA9IF9fa21wX2dldF9zeXN0ZW1fYWZmaW5pdHkoKGttcF9hZmZpbl9tYXNrX3QgKikoKm1hc2spLCBGQUxTRSk7CisgICAgS0FfVFJBQ0UoMTAwMCwgO3sKKyAgICAgICAgY2hhciBidWZbS01QX0FGRklOX01BU0tfUFJJTlRfTEVOXTsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJpbnRfbWFzayhidWYsIEtNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTiwKKyAgICAgICAgICAoa21wX2FmZmluX21hc2tfdCAqKSgqbWFzaykpOworICAgICAgICBfX2ttcF9wcmludGYoImttcF9nZXRfYWZmaW5pdHk6IHN5c3RlbSBhZmZpbml0eSBtYXNrIGZvciB0aHJlYWQgJWQgPSAlc1xuIiwgZ3RpZCwgYnVmKTsKKyAgICB9KTsKKyAgICByZXR1cm4gcmV0dmFsOworCisjIGVsc2UKKworICAgIEtNUF9DUFVfQ09QWSgoa21wX2FmZmluX21hc2tfdCAqKSgqbWFzayksIHRoLT50aC50aF9hZmZpbl9tYXNrKTsKKyAgICByZXR1cm4gMDsKKworIyBlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAqLworCit9CisKK2ludAorX19rbXBfYXV4X3NldF9hZmZpbml0eV9tYXNrX3Byb2MoaW50IHByb2MsIHZvaWQgKiptYXNrKQoreworICAgIGludCByZXR2YWw7CisKKyAgICBpZiAoISBLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBLQV9UUkFDRSgxMDAwLCA7eworICAgICAgICBpbnQgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKyAgICAgICAgY2hhciBidWZbS01QX0FGRklOX01BU0tfUFJJTlRfTEVOXTsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJpbnRfbWFzayhidWYsIEtNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTiwKKyAgICAgICAgICAoa21wX2FmZmluX21hc2tfdCAqKSgqbWFzaykpOworICAgICAgICBfX2ttcF9kZWJ1Z19wcmludGYoImttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jOiBzZXR0aW5nIHByb2MgJWQgaW4gYWZmaW5pdHkgbWFzayBmb3IgdGhyZWFkICVkID0gJXNcbiIsCisgICAgICAgICAgcHJvYywgZ3RpZCwgYnVmKTsKKyAgICB9KTsKKworICAgIGlmIChfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2spIHsKKyAgICAgICAgaWYgKChtYXNrID09IE5VTEwpIHx8ICgqbWFzayA9PSBOVUxMKSkgeworICAgICAgICAgICAgS01QX0ZBVEFMKEFmZmluaXR5SW52YWxpZE1hc2ssICJrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYyIpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChwcm9jIDwgMCkgfHwgKCh1bnNpZ25lZClwcm9jID49IEtNUF9DUFVfU0VUU0laRSkpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoISBLTVBfQ1BVX0lTU0VUKHByb2MsIGZ1bGxNYXNrKSkgeworICAgICAgICByZXR1cm4gLTI7CisgICAgfQorCisgICAgS01QX0NQVV9TRVQocHJvYywgKGttcF9hZmZpbl9tYXNrX3QgKikoKm1hc2spKTsKKyAgICByZXR1cm4gMDsKK30KKworCitpbnQKK19fa21wX2F1eF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MoaW50IHByb2MsIHZvaWQgKiptYXNrKQoreworICAgIGludCByZXR2YWw7CisKKyAgICBpZiAoISBLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBLQV9UUkFDRSgxMDAwLCA7eworICAgICAgICBpbnQgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKyAgICAgICAgY2hhciBidWZbS01QX0FGRklOX01BU0tfUFJJTlRfTEVOXTsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJpbnRfbWFzayhidWYsIEtNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTiwKKyAgICAgICAgICAoa21wX2FmZmluX21hc2tfdCAqKSgqbWFzaykpOworICAgICAgICBfX2ttcF9kZWJ1Z19wcmludGYoImttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2M6IHVuc2V0dGluZyBwcm9jICVkIGluIGFmZmluaXR5IG1hc2sgZm9yIHRocmVhZCAlZCA9ICVzXG4iLAorICAgICAgICAgIHByb2MsIGd0aWQsIGJ1Zik7CisgICAgfSk7CisKKyAgICBpZiAoX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrKSB7CisgICAgICAgIGlmICgobWFzayA9PSBOVUxMKSB8fCAoKm1hc2sgPT0gTlVMTCkpIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTChBZmZpbml0eUludmFsaWRNYXNrLCAia21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYyIpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChwcm9jIDwgMCkgfHwgKCh1bnNpZ25lZClwcm9jID49IEtNUF9DUFVfU0VUU0laRSkpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoISBLTVBfQ1BVX0lTU0VUKHByb2MsIGZ1bGxNYXNrKSkgeworICAgICAgICByZXR1cm4gLTI7CisgICAgfQorCisgICAgS01QX0NQVV9DTFIocHJvYywgKGttcF9hZmZpbl9tYXNrX3QgKikoKm1hc2spKTsKKyAgICByZXR1cm4gMDsKK30KKworCitpbnQKK19fa21wX2F1eF9nZXRfYWZmaW5pdHlfbWFza19wcm9jKGludCBwcm9jLCB2b2lkICoqbWFzaykKK3sKKyAgICBpbnQgcmV0dmFsOworCisgICAgaWYgKCEgS01QX0FGRklOSVRZX0NBUEFCTEUoKSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgS0FfVFJBQ0UoMTAwMCwgO3sKKyAgICAgICAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgICAgICAgIGNoYXIgYnVmW0tNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTl07CisgICAgICAgIF9fa21wX2FmZmluaXR5X3ByaW50X21hc2soYnVmLCBLTVBfQUZGSU5fTUFTS19QUklOVF9MRU4sCisgICAgICAgICAgKGttcF9hZmZpbl9tYXNrX3QgKikoKm1hc2spKTsKKyAgICAgICAgX19rbXBfZGVidWdfcHJpbnRmKCJrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYzogZ2V0dGluZyBwcm9jICVkIGluIGFmZmluaXR5IG1hc2sgZm9yIHRocmVhZCAlZCA9ICVzXG4iLAorICAgICAgICAgIHByb2MsIGd0aWQsIGJ1Zik7CisgICAgfSk7CisKKyAgICBpZiAoX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrKSB7CisgICAgICAgIGlmICgobWFzayA9PSBOVUxMKSB8fCAoKm1hc2sgPT0gTlVMTCkpIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTChBZmZpbml0eUludmFsaWRNYXNrLCAia21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgocHJvYyA8IDApIHx8ICgodW5zaWduZWQpcHJvYyA+PSBLTVBfQ1BVX1NFVFNJWkUpKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoISBLTVBfQ1BVX0lTU0VUKHByb2MsIGZ1bGxNYXNrKSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICByZXR1cm4gS01QX0NQVV9JU1NFVChwcm9jLCAoa21wX2FmZmluX21hc2tfdCAqKSgqbWFzaykpOworfQorCisKKy8vIER5bmFtaWMgYWZmaW5pdHkgc2V0dGluZ3MgLSBBZmZpbml0eSBiYWxhbmNlZAordm9pZCBfX2ttcF9iYWxhbmNlZF9hZmZpbml0eSggaW50IHRpZCwgaW50IG50aHJlYWRzICkKK3sKKyAgICBpZiggX19rbXBfYWZmaW5pdHlfdW5pZm9ybV90b3BvbG9neSgpICkgeworICAgICAgICBpbnQgY29yZUlEOworICAgICAgICBpbnQgdGhyZWFkSUQ7CisgICAgICAgIC8vIE51bWJlciBvZiBoeXBlciB0aHJlYWRzIHBlciBjb3JlIGluIEhUIG1hY2hpbmUKKyAgICAgICAgaW50IF9fa21wX250aF9wZXJfY29yZSA9IF9fa21wX2F2YWlsX3Byb2MgLyBfX2ttcF9uY29yZXM7CisgICAgICAgIC8vIE51bWJlciBvZiBjb3JlcworICAgICAgICBpbnQgbmNvcmVzID0gX19rbXBfbmNvcmVzOworICAgICAgICAvLyBIb3cgbWFueSB0aHJlYWRzIHdpbGwgYmUgYm91bmQgdG8gZWFjaCBjb3JlCisgICAgICAgIGludCBjaHVuayA9IG50aHJlYWRzIC8gbmNvcmVzOworICAgICAgICAvLyBIb3cgbWFueSBjb3JlcyB3aWxsIGhhdmUgYW4gYWRkaXRpb25hbCB0aHJlYWQgYm91bmQgdG8gaXQgLSAiYmlnIGNvcmVzIgorICAgICAgICBpbnQgYmlnX2NvcmVzID0gbnRocmVhZHMgJSBuY29yZXM7CisgICAgICAgIC8vIE51bWJlciBvZiB0aHJlYWRzIG9uIHRoZSBiaWcgY29yZXMKKyAgICAgICAgaW50IGJpZ19udGggPSAoIGNodW5rICsgMSApICogYmlnX2NvcmVzOworICAgICAgICBpZiggdGlkIDwgYmlnX250aCApIHsKKyAgICAgICAgICAgIGNvcmVJRCA9IHRpZCAvIChjaHVuayArIDEgKTsKKyAgICAgICAgICAgIHRocmVhZElEID0gKCB0aWQgJSAoY2h1bmsgKyAxICkgKSAlIF9fa21wX250aF9wZXJfY29yZSA7CisgICAgICAgIH0gZWxzZSB7IC8vdGlkID49IGJpZ19udGgKKyAgICAgICAgICAgIGNvcmVJRCA9ICggdGlkIC0gYmlnX2NvcmVzICkgLyBjaHVuazsKKyAgICAgICAgICAgIHRocmVhZElEID0gKCAoIHRpZCAtIGJpZ19jb3JlcyApICUgY2h1bmsgKSAlIF9fa21wX250aF9wZXJfY29yZSA7CisgICAgICAgIH0KKworICAgICAgICBLTVBfREVCVUdfQVNTRVJUMihLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpLAorICAgICAgICAgICJJbGxlZ2FsIHNldCBhZmZpbml0eSBvcGVyYXRpb24gd2hlbiBub3QgY2FwYWJsZSIpOworCisgICAgICAgIGttcF9hZmZpbl9tYXNrX3QgKm1hc2sgPSAoa21wX2FmZmluX21hc2tfdCAqKWFsbG9jYShfX2ttcF9hZmZpbl9tYXNrX3NpemUpOworICAgICAgICBLTVBfQ1BVX1pFUk8obWFzayk7CisKKyAgICAgICAgLy8gR3JhbnVsYXJpdHkgPT0gdGhyZWFkCisgICAgICAgIGlmKCBfX2ttcF9hZmZpbml0eV9ncmFuID09IGFmZmluaXR5X2dyYW5fZmluZSB8fCBfX2ttcF9hZmZpbml0eV9ncmFuID09IGFmZmluaXR5X2dyYW5fdGhyZWFkKSB7CisgICAgICAgICAgICBpbnQgb3NJRCA9IGFkZHJlc3Myb3NbIGNvcmVJRCAqIF9fa21wX250aF9wZXJfY29yZSArIHRocmVhZElEIF0uc2Vjb25kOworICAgICAgICAgICAgS01QX0NQVV9TRVQoIG9zSUQsIG1hc2spOworICAgICAgICB9IGVsc2UgaWYoIF9fa21wX2FmZmluaXR5X2dyYW4gPT0gYWZmaW5pdHlfZ3Jhbl9jb3JlICkgeyAvLyBHcmFudWxhcml0eSA9PSBjb3JlCisgICAgICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IF9fa21wX250aF9wZXJfY29yZTsgaSsrICkgeworICAgICAgICAgICAgICAgIGludCBvc0lEOworICAgICAgICAgICAgICAgIG9zSUQgPSBhZGRyZXNzMm9zWyBjb3JlSUQgKiBfX2ttcF9udGhfcGVyX2NvcmUgKyBpIF0uc2Vjb25kOworICAgICAgICAgICAgICAgIEtNUF9DUFVfU0VUKCBvc0lELCBtYXNrKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICAgICAgY2hhciBidWZbS01QX0FGRklOX01BU0tfUFJJTlRfTEVOXTsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3ByaW50X21hc2soYnVmLCBLTVBfQUZGSU5fTUFTS19QUklOVF9MRU4sIG1hc2spOworICAgICAgICAgICAgS01QX0lORk9STShCb3VuZFRvT1NQcm9jU2V0LCAiS01QX0FGRklOSVRZIiwgKGttcF9pbnQzMilnZXRwaWQoKSwKKyAgICAgICAgICAgICAgdGlkLCBidWYpOworICAgICAgICB9CisgICAgICAgIF9fa21wX3NldF9zeXN0ZW1fYWZmaW5pdHkoIG1hc2ssIFRSVUUgKTsKKyAgICB9IGVsc2UgeyAvLyBOb24tdW5pZm9ybSB0b3BvbG9neQorCisgICAgICAgIGttcF9hZmZpbl9tYXNrX3QgKm1hc2sgPSAoa21wX2FmZmluX21hc2tfdCAqKWFsbG9jYShfX2ttcF9hZmZpbl9tYXNrX3NpemUpOworICAgICAgICBLTVBfQ1BVX1pFUk8obWFzayk7CisKKyAgICAgICAgLy8gTnVtYmVyIG9mIGh5cGVyIHRocmVhZHMgcGVyIGNvcmUgaW4gSFQgbWFjaGluZQorICAgICAgICBpbnQgbnRoX3Blcl9jb3JlID0gX19rbXBfblRocmVhZHNQZXJDb3JlOworICAgICAgICBpbnQgY29yZV9sZXZlbDsKKyAgICAgICAgaWYoIG50aF9wZXJfY29yZSA+IDEgKSB7CisgICAgICAgICAgICBjb3JlX2xldmVsID0gX19rbXBfYWZmX2RlcHRoIC0gMjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvcmVfbGV2ZWwgPSBfX2ttcF9hZmZfZGVwdGggLSAxOworICAgICAgICB9CisKKyAgICAgICAgLy8gTnVtYmVyIG9mIGNvcmVzIC0gbWF4aW11bSB2YWx1ZTsgaXQgZG9lcyBub3QgY291bnQgdHJhaWwgY29yZXMgd2l0aCAwIHByb2Nlc3NvcnMKKyAgICAgICAgaW50IG5jb3JlcyA9IGFkZHJlc3Myb3NbIF9fa21wX2F2YWlsX3Byb2MgLSAxIF0uZmlyc3QubGFiZWxzWyBjb3JlX2xldmVsIF0gKyAxOworCisgICAgICAgIC8vIEZvciBwZXJmb3JtYW5jZSBnYWluIGNvbnNpZGVyIHRoZSBzcGVjaWFsIGNhc2UgbnRocmVhZHMgPT0gX19rbXBfYXZhaWxfcHJvYworICAgICAgICBpZiggbnRocmVhZHMgPT0gX19rbXBfYXZhaWxfcHJvYyApIHsKKyAgICAgICAgICAgIGlmKCBfX2ttcF9hZmZpbml0eV9ncmFuID09IGFmZmluaXR5X2dyYW5fZmluZSB8fCBfX2ttcF9hZmZpbml0eV9ncmFuID09IGFmZmluaXR5X2dyYW5fdGhyZWFkKSB7CisgICAgICAgICAgICAgICAgaW50IG9zSUQgPSBhZGRyZXNzMm9zWyB0aWQgXS5zZWNvbmQ7CisgICAgICAgICAgICAgICAgS01QX0NQVV9TRVQoIG9zSUQsIG1hc2spOworICAgICAgICAgICAgfSBlbHNlIGlmKCBfX2ttcF9hZmZpbml0eV9ncmFuID09IGFmZmluaXR5X2dyYW5fY29yZSApIHsgLy8gR3JhbnVsYXJpdHkgPT0gY29yZQorICAgICAgICAgICAgICAgIGludCBjb3JlSUQgPSBhZGRyZXNzMm9zWyB0aWQgXS5maXJzdC5sYWJlbHNbIGNvcmVfbGV2ZWwgXTsKKyAgICAgICAgICAgICAgICAvLyBXZSdsbCBjb3VudCBmb3VuZCBvc0lEcyBmb3IgdGhlIGN1cnJlbnQgY29yZTsgdGhleSBjYW4gYmUgbm90IG1vcmUgdGhhbiBudGhfcGVyX2NvcmU7CisgICAgICAgICAgICAgICAgLy8gc2luY2UgdGhlIGFkZHJlc3Myb3MgaXMgc29ydGllZCB3ZSBjYW4gYnJlYWsgd2hlbiBjbnQ9PW50aF9wZXJfY29yZQorICAgICAgICAgICAgICAgIGludCBjbnQgPSAwOworICAgICAgICAgICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgX19rbXBfYXZhaWxfcHJvYzsgaSsrICkgeworICAgICAgICAgICAgICAgICAgICBpbnQgb3NJRCA9IGFkZHJlc3Myb3NbIGkgXS5zZWNvbmQ7CisgICAgICAgICAgICAgICAgICAgIGludCBjb3JlID0gYWRkcmVzczJvc1sgaSBdLmZpcnN0LmxhYmVsc1sgY29yZV9sZXZlbCBdOworICAgICAgICAgICAgICAgICAgICBpZiggY29yZSA9PSBjb3JlSUQgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfQ1BVX1NFVCggb3NJRCwgbWFzayk7CisgICAgICAgICAgICAgICAgICAgICAgICBjbnQrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBjbnQgPT0gbnRoX3Blcl9jb3JlICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYoIG50aHJlYWRzIDw9IF9fa21wX25jb3JlcyApIHsKKworICAgICAgICAgICAgaW50IGNvcmUgPSAwOworICAgICAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBuY29yZXM7IGkrKyApIHsKKyAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGlzIGNvcmUgZnJvbSBwcm9jYXJyW10gaXMgaW4gdGhlIG1hc2sKKyAgICAgICAgICAgICAgICBpbnQgaW5fbWFzayA9IDA7CisgICAgICAgICAgICAgICAgZm9yKCBpbnQgaiA9IDA7IGogPCBudGhfcGVyX2NvcmU7IGorKyApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIHByb2NhcnJbIGkgKiBudGhfcGVyX2NvcmUgKyBqIF0gIT0gLSAxICkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5fbWFzayA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiggaW5fbWFzayApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIHRpZCA9PSBjb3JlICkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yKCBpbnQgaiA9IDA7IGogPCBudGhfcGVyX2NvcmU7IGorKyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3NJRCA9IHByb2NhcnJbIGkgKiBudGhfcGVyX2NvcmUgKyBqIF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIG9zSUQgIT0gLTEgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9DUFVfU0VUKCBvc0lELCBtYXNrICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvciBncmFudWxhcml0eT10aHJlYWQgaXQgaXMgZW5vdWdoIHRvIHNldCB0aGUgZmlyc3QgYXZhaWxhYmxlIG9zSUQgZm9yIHRoaXMgY29yZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggX19rbXBfYWZmaW5pdHlfZ3JhbiA9PSBhZmZpbml0eV9ncmFuX2ZpbmUgfHwgX19rbXBfYWZmaW5pdHlfZ3JhbiA9PSBhZmZpbml0eV9ncmFuX3RocmVhZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvcmUrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGVsc2UgeyAvLyBudGhyZWFkcyA+IF9fa21wX25jb3JlcworCisgICAgICAgICAgICAvLyBBcnJheSB0byBzYXZlIHRoZSBudW1iZXIgb2YgcHJvY2Vzc29ycyBhdCBlYWNoIGNvcmUKKyAgICAgICAgICAgIGludCBucHJvY19hdF9jb3JlWyBuY29yZXMgXTsKKyAgICAgICAgICAgIC8vIEFycmF5IHRvIHNhdmUgdGhlIG51bWJlciBvZiBjb3JlcyB3aXRoICJ4IiBhdmFpbGFibGUgcHJvY2Vzc29yczsKKyAgICAgICAgICAgIGludCBuY29yZXNfd2l0aF94X3Byb2NzWyBudGhfcGVyX2NvcmUgKyAxIF07CisgICAgICAgICAgICAvLyBBcnJheSB0byBzYXZlIHRoZSBudW1iZXIgb2YgY29yZXMgd2l0aCAjIHByb2NzIGZyb20geCB0byBudGhfcGVyX2NvcmUKKyAgICAgICAgICAgIGludCBuY29yZXNfd2l0aF94X3RvX21heF9wcm9jc1sgbnRoX3Blcl9jb3JlICsgMSBdOworCisgICAgICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8PSBudGhfcGVyX2NvcmU7IGkrKyApIHsKKyAgICAgICAgICAgICAgICBuY29yZXNfd2l0aF94X3Byb2NzWyBpIF0gPSAwOworICAgICAgICAgICAgICAgIG5jb3Jlc193aXRoX3hfdG9fbWF4X3Byb2NzWyBpIF0gPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IG5jb3JlczsgaSsrICkgeworICAgICAgICAgICAgICAgIGludCBjbnQgPSAwOworICAgICAgICAgICAgICAgIGZvciggaW50IGogPSAwOyBqIDwgbnRoX3Blcl9jb3JlOyBqKysgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKCBwcm9jYXJyWyBpICogbnRoX3Blcl9jb3JlICsgaiBdICE9IC0xICkgeworICAgICAgICAgICAgICAgICAgICAgICAgY250Kys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbnByb2NfYXRfY29yZVsgaSBdID0gY250OworICAgICAgICAgICAgICAgIG5jb3Jlc193aXRoX3hfcHJvY3NbIGNudCBdKys7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciggaW50IGkgPSAwOyBpIDw9IG50aF9wZXJfY29yZTsgaSsrICkgeworICAgICAgICAgICAgICAgIGZvciggaW50IGogPSBpOyBqIDw9IG50aF9wZXJfY29yZTsgaisrICkgeworICAgICAgICAgICAgICAgICAgICBuY29yZXNfd2l0aF94X3RvX21heF9wcm9jc1sgaSBdICs9IG5jb3Jlc193aXRoX3hfcHJvY3NbIGogXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIE1heCBudW1iZXIgb2YgcHJvY2Vzc29ycworICAgICAgICAgICAgaW50IG5wcm9jID0gbnRoX3Blcl9jb3JlICogbmNvcmVzOworICAgICAgICAgICAgLy8gQW4gYXJyYXkgdG8ga2VlcCBudW1iZXIgb2YgdGhyZWFkcyBwZXIgZWFjaCBjb250ZXh0CisgICAgICAgICAgICBpbnQgKiBuZXdhcnIgPSAoIGludCAqIClfX2ttcF9hbGxvY2F0ZSggc2l6ZW9mKCBpbnQgKSAqIG5wcm9jICk7CisgICAgICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IG5wcm9jOyBpKysgKSB7CisgICAgICAgICAgICAgICAgbmV3YXJyWyBpIF0gPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgbnRoID0gbnRocmVhZHM7CisgICAgICAgICAgICBpbnQgZmxhZyA9IDA7CisgICAgICAgICAgICB3aGlsZSggbnRoID4gMCApIHsKKyAgICAgICAgICAgICAgICBmb3IoIGludCBqID0gMTsgaiA8PSBudGhfcGVyX2NvcmU7IGorKyApIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGNudCA9IG5jb3Jlc193aXRoX3hfdG9fbWF4X3Byb2NzWyBqIF07CisgICAgICAgICAgICAgICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgbmNvcmVzOyBpKysgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIHRoZSBjb3JlIHdpdGggMCBwcm9jZXNzb3JzCisgICAgICAgICAgICAgICAgICAgICAgICBpZiggbnByb2NfYXRfY29yZVsgaSBdID09IDAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IoIGludCBrID0gMDsgayA8IG50aF9wZXJfY29yZTsgaysrICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwcm9jYXJyWyBpICogbnRoX3Blcl9jb3JlICsgayBdICE9IC0xICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggbmV3YXJyWyBpICogbnRoX3Blcl9jb3JlICsgayBdID09IDAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdhcnJbIGkgKiBudGhfcGVyX2NvcmUgKyBrIF0gPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY250LS07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudGgtLTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGZsYWcgIT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdhcnJbIGkgKiBudGhfcGVyX2NvcmUgKyBrIF0gKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY250LS07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnRoLS07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggY250ID09IDAgfHwgbnRoID09IDAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYoIG50aCA9PSAwICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmxhZyA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgc3VtID0gMDsKKyAgICAgICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgbnByb2M7IGkrKyApIHsKKyAgICAgICAgICAgICAgICBzdW0gKz0gbmV3YXJyWyBpIF07CisgICAgICAgICAgICAgICAgaWYoIHN1bSA+IHRpZCApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gR3JhbnVsYXJpdHkgPT0gdGhyZWFkCisgICAgICAgICAgICAgICAgICAgIGlmKCBfX2ttcF9hZmZpbml0eV9ncmFuID09IGFmZmluaXR5X2dyYW5fZmluZSB8fCBfX2ttcF9hZmZpbml0eV9ncmFuID09IGFmZmluaXR5X2dyYW5fdGhyZWFkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3NJRCA9IHByb2NhcnJbIGkgXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9DUFVfU0VUKCBvc0lELCBtYXNrKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmKCBfX2ttcF9hZmZpbml0eV9ncmFuID09IGFmZmluaXR5X2dyYW5fY29yZSApIHsgLy8gR3JhbnVsYXJpdHkgPT0gY29yZQorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvcmVJRCA9IGkgLyBudGhfcGVyX2NvcmU7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IoIGludCBpaSA9IDA7IGlpIDwgbnRoX3Blcl9jb3JlOyBpaSsrICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvc0lEID0gcHJvY2FyclsgY29yZUlEICogbnRoX3Blcl9jb3JlICsgaWkgXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggb3NJRCAhPSAtMSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0NQVV9TRVQoIG9zSUQsIG1hc2spOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfX2ttcF9mcmVlKCBuZXdhcnIgKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgICAgICBjaGFyIGJ1ZltLTVBfQUZGSU5fTUFTS19QUklOVF9MRU5dOworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJpbnRfbWFzayhidWYsIEtNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTiwgbWFzayk7CisgICAgICAgICAgICBLTVBfSU5GT1JNKEJvdW5kVG9PU1Byb2NTZXQsICJLTVBfQUZGSU5JVFkiLCAoa21wX2ludDMyKWdldHBpZCgpLAorICAgICAgICAgICAgICB0aWQsIGJ1Zik7CisgICAgICAgIH0KKyAgICAgICAgX19rbXBfc2V0X3N5c3RlbV9hZmZpbml0eSggbWFzaywgVFJVRSApOworICAgIH0KK30KKworI2Vsc2UKKyAgICAvLyBhZmZpbml0eSBub3Qgc3VwcG9ydGVkCisKK2ttcF91aW50MzIgbWFjX3NraXBQZXJMZXZlbFs3XTsKK2ttcF91aW50MzIgbWFjX2RlcHRoOwora21wX3VpbnQ4IG1hY19sZWFmX2tpZHM7Cit2b2lkIF9fa21wX2dldF9oaWVyYXJjaHkoa21wX3VpbnQzMiBucHJvYywga21wX2JzdGF0ZV90ICp0aHJfYmFyKSB7CisgICAgc3RhdGljIGludCBmaXJzdCA9IDE7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGNvbnN0IGttcF91aW50MzIgbWF4TGV2ZWxzID0gNzsKKyAgICAgICAga21wX3VpbnQzMiBudW1QZXJMZXZlbFttYXhMZXZlbHNdOworCisgICAgICAgIGZvciAoa21wX3VpbnQzMiBpPTA7IGk8bWF4TGV2ZWxzOyArK2kpIHsgLy8gaW5pdCBudW1QZXJMZXZlbFsqXSB0byAxIGl0ZW0gcGVyIGxldmVsCisgICAgICAgICAgICBudW1QZXJMZXZlbFtpXSA9IDE7CisgICAgICAgICAgICBtYWNfc2tpcFBlckxldmVsW2ldID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIG1hY19kZXB0aCA9IDI7CisgICAgICAgIG51bVBlckxldmVsWzBdID0gbnByb2M7CisKKyAgICAgICAga21wX3VpbnQzMiBicmFuY2ggPSA0OworICAgICAgICBpZiAobnVtUGVyTGV2ZWxbMF0gPT0gMSkgYnJhbmNoID0gbnByb2MvNDsKKyAgICAgICAgaWYgKGJyYW5jaDw0KSBicmFuY2g9NDsKKyAgICAgICAgZm9yIChrbXBfdWludDMyIGQ9MDsgZDxtYWNfZGVwdGgtMTsgKytkKSB7IC8vIG9wdGltaXplIGhpZXJhcmNoeSB3aWR0aAorICAgICAgICAgICAgd2hpbGUgKG51bVBlckxldmVsW2RdID4gYnJhbmNoIHx8IChkPT0wICYmIG51bVBlckxldmVsW2RdPjQpKSB7IC8vIG1heCA0IG9uIGxldmVsIDAhCisgICAgICAgICAgICAgICAgaWYgKG51bVBlckxldmVsW2RdICYgMSkgbnVtUGVyTGV2ZWxbZF0rKzsKKyAgICAgICAgICAgICAgICBudW1QZXJMZXZlbFtkXSA9IG51bVBlckxldmVsW2RdID4+IDE7CisgICAgICAgICAgICAgICAgaWYgKG51bVBlckxldmVsW2QrMV0gPT0gMSkgbWFjX2RlcHRoKys7CisgICAgICAgICAgICAgICAgbnVtUGVyTGV2ZWxbZCsxXSA9IG51bVBlckxldmVsW2QrMV0gPDwgMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKG51bVBlckxldmVsWzBdID09IDEpIHsKKyAgICAgICAgICAgICAgICBicmFuY2ggPSBicmFuY2ggPj4gMTsKKyAgICAgICAgICAgICAgICBpZiAoYnJhbmNoPDQpIGJyYW5jaCA9IDQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGttcF91aW50MzIgaT0xOyBpPG1hY19kZXB0aDsgKytpKQorICAgICAgICAgICAgbWFjX3NraXBQZXJMZXZlbFtpXSA9IG51bVBlckxldmVsW2ktMV0gKiBtYWNfc2tpcFBlckxldmVsW2ktMV07CisgICAgICAgIG1hY19sZWFmX2tpZHMgPSAoa21wX3VpbnQ4KW51bVBlckxldmVsWzBdLTE7CisgICAgICAgIGZpcnN0PTA7CisgICAgfQorICAgIHRocl9iYXItPmRlcHRoID0gbWFjX2RlcHRoOworICAgIHRocl9iYXItPmJhc2VfbGVhZl9raWRzID0gbWFjX2xlYWZfa2lkczsKKyAgICB0aHJfYmFyLT5za2lwX3Blcl9sZXZlbCA9IG1hY19za2lwUGVyTGV2ZWw7Cit9CisKKyNlbmRpZiAvLyBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfYWxsb2MuYyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9hbGxvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4ZjYyMzYKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfYWxsb2MuYwpAQCAtMCwwICsxLDIwNTAgQEAKKy8qCisgKiBrbXBfYWxsb2MuYyAtLSBwcml2YXRlL3NoYXJlZCBkeWFubWljIG1lbW9yeSBhbGxvY2F0aW9uIGFuZCBtYW5hZ2VtZW50CisgKiAkUmV2aXNpb246IDQzNDUwICQKKyAqICREYXRlOiAyMDE0LTA5LTA5IDEwOjA3OjIyIC0wNTAwIChUdWUsIDA5IFNlcCAyMDE0KSAkCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJrbXBfd3JhcHBlcl9tYWxsb2MuaCIKKyNpbmNsdWRlICJrbXBfaW8uaCIKKworLy8gRGlzYWJsZSBiZ2V0IHdoZW4gaXQgaXMgbm90IHVzZWQKKyNpZiBLTVBfVVNFX0JHRVQKKworLyogVGhyZWFkIHByaXZhdGUgYnVmZmVyIG1hbmFnZW1lbnQgY29kZSAqLworCit0eXBlZGVmIGludCAgICgqYmdldF9jb21wYWN0X3QpKHNpemVfdCwgaW50KTsKK3R5cGVkZWYgdm9pZCAqKCpiZ2V0X2FjcXVpcmVfdCkoc2l6ZV90KTsKK3R5cGVkZWYgdm9pZCAgKCpiZ2V0X3JlbGVhc2VfdCkodm9pZCAqKTsKKworLyogTk9URTogYnVmc2l6ZSBtdXN0IGJlIGEgc2lnbmVkIGRhdGF0eXBlICovCisKKyNpZiBLTVBfT1NfV0lORE9XUworIyBpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfQVJNCisgICB0eXBlZGVmIGttcF9pbnQzMiBidWZzaXplOworIyBlbHNlCisgICB0eXBlZGVmIGttcF9pbnQ2NCBidWZzaXplOworIyBlbmRpZgorI2Vsc2UKKyAgdHlwZWRlZiBzc2l6ZV90IGJ1ZnNpemU7CisjZW5kaWYKKworLyogVGhlIHRocmVlIG1vZGVzIG9mIG9wZXJhdGlvbiBhcmUsIGZpZm8gc2VhcmNoLCBsaWZvIHNlYXJjaCwgYW5kIGJlc3QtZml0ICovCisKK3R5cGVkZWYgZW51bSBiZ2V0X21vZGUgeworICAgIGJnZXRfbW9kZV9maWZvID0gMCwKKyAgICBiZ2V0X21vZGVfbGlmbyA9IDEsCisgICAgYmdldF9tb2RlX2Jlc3QgPSAyCit9IGJnZXRfbW9kZV90OworCisKK3N0YXRpYyB2b2lkICAgIGJwb29sKCBrbXBfaW5mb190ICp0aCwgdm9pZCAqYnVmZmVyLCBidWZzaXplIGxlbik7CitzdGF0aWMgdm9pZCAgICpiZ2V0KCBrbXBfaW5mb190ICp0aCwgYnVmc2l6ZSBzaXplKTsKK3N0YXRpYyB2b2lkICAgKmJnZXR6KCBrbXBfaW5mb190ICp0aCwgYnVmc2l6ZSBzaXplKTsKK3N0YXRpYyB2b2lkICAgKmJnZXRyKCBrbXBfaW5mb190ICp0aCwgdm9pZCAqYnVmZmVyLCBidWZzaXplIG5ld3NpemUpOworc3RhdGljIHZvaWQgICAgYnJlbCgga21wX2luZm9fdCAqdGgsIHZvaWQgKmJ1Zik7CitzdGF0aWMgdm9pZCAgICBiZWN0bCggIGttcF9pbmZvX3QgKnRoLCBiZ2V0X2NvbXBhY3RfdCBjb21wYWN0LCBiZ2V0X2FjcXVpcmVfdCBhY3F1aXJlLCBiZ2V0X3JlbGVhc2VfdCByZWxlYXNlLCBidWZzaXplIHBvb2xfaW5jciApOworCisjaWZkZWYgS01QX0RFQlVHCitzdGF0aWMgdm9pZCAgICBic3RhdHMoIGttcF9pbmZvX3QgKnRoLCBidWZzaXplICpjdXJhbGxvYywgYnVmc2l6ZSAqdG90ZnJlZSwgYnVmc2l6ZSAqbWF4ZnJlZSwgbG9uZyAqbmdldCwgbG9uZyAqbnJlbCk7CitzdGF0aWMgdm9pZCAgICBic3RhdHNlKCBrbXBfaW5mb190ICp0aCwgYnVmc2l6ZSAqcG9vbF9pbmNyLCBsb25nICpucG9vbCwgbG9uZyAqbnBnZXQsIGxvbmcgKm5wcmVsLCBsb25nICpuZGdldCwgbG9uZyAqbmRyZWwpOworc3RhdGljIHZvaWQgICAgYnVmZHVtcCgga21wX2luZm9fdCAqdGgsIHZvaWQgKmJ1Zik7CitzdGF0aWMgdm9pZCAgICBicG9vbGQoIGttcF9pbmZvX3QgKnRoLCB2b2lkICpwb29sLCBpbnQgZHVtcGFsbG9jLCBpbnQgZHVtcGZyZWUpOworc3RhdGljIGludCAgICAgYnBvb2x2KCBrbXBfaW5mb190ICp0aCwgdm9pZCAqcG9vbCk7CisjZW5kaWYKKworLyogQkdFVCBDT05GSUdVUkFUSU9OICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJ1ZmZlciBhbGxvY2F0aW9uIHNpemUgcXVhbnR1bToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsIGJ1ZmZlcnMgYWxsb2NhdGVkIGFyZSBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpcGxlIG9mIHRoaXMgc2l6ZS4gIFRoaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVVTVCBiZSBhIHBvd2VyIG9mIHR3by4gKi8KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPbiBJQS0zMiBhcmNoaXRlY3R1cmUgd2l0aCAgTGludXgqIE9TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWxsb2MoKSBkb2VzIG5vdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnN1cmUgMTYgYnl0ZSBhbGlnbm1uZW50ICovCisKKyNpZiBLTVBfQVJDSF9YODYgfHwgIUtNUF9IQVZFX1FVQUQKKworI2RlZmluZSBTaXplUXVhbnQgICA4CisjZGVmaW5lIEFsaWduVHlwZSAgIGRvdWJsZQorCisjZWxzZQorCisjZGVmaW5lIFNpemVRdWFudCAgIDE2CisjZGVmaW5lIEFsaWduVHlwZSAgIF9RdWFkCisKKyNlbmRpZgorCisjZGVmaW5lIEJ1ZlN0YXRzICAgIDEgICAgICAgICAgICAgICAgIC8qIERlZmluZSB0aGlzIHN5bWJvbCB0byBlbmFibGUgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJzdGF0cygpIGZ1bmN0aW9uIHdoaWNoIGNhbGN1bGF0ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHRvdGFsIGZyZWUgc3BhY2UgaW4gdGhlIGJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb29sLCB0aGUgbGFyZ2VzdCBhdmFpbGFibGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCBhbmQgdGhlIHRvdGFsIHNwYWNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRseSBhbGxvY2F0ZWQuICovCisKKyNpZmRlZiBLTVBfREVCVUcKKworI2RlZmluZSBCdWZEdW1wICAgICAxICAgICAgICAgICAgICAgICAvKiBEZWZpbmUgdGhpcyBzeW1ib2wgdG8gZW5hYmxlIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicG9vbGQoKSBmdW5jdGlvbiB3aGljaCBkdW1wcyB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVycyBpbiBhIGJ1ZmZlciBwb29sLiAqLworCisjZGVmaW5lIEJ1ZlZhbGlkICAgIDEgICAgICAgICAgICAgICAgIC8qIERlZmluZSB0aGlzIHN5bWJvbCB0byBlbmFibGUgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJwb29sdigpIGZ1bmN0aW9uIGZvciB2YWxpZGF0aW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgYnVmZmVyIHBvb2wuICovCisKKyNkZWZpbmUgRHVtcERhdGEgICAgMSAgICAgICAgICAgICAgICAgLyogRGVmaW5lIHRoaXMgc3ltYm9sIHRvIGVuYWJsZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZHVtcCgpIGZ1bmN0aW9uIHdoaWNoIGFsbG93cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdW1waW5nIHRoZSBjb250ZW50cyBvZiBhbiBhbGxvY2F0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgZnJlZSBidWZmZXIuICovCisjaWZkZWYgTk9UX1VTRURfTk9XCisKKyNkZWZpbmUgRnJlZVdpcGUgICAgMSAgICAgICAgICAgICAgICAgLyogV2lwZSBmcmVlIGJ1ZmZlcnMgdG8gYSBndWFyYW50ZWVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4gb2YgZ2FyYmFnZSB0byB0cmlwIHVwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pc2NyZWFudHMgd2hvIGF0dGVtcHQgdG8gdXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXJzIGludG8gcmVsZWFzZWQgYnVmZmVycy4gKi8KKworI2RlZmluZSBCZXN0Rml0ICAgICAxICAgICAgICAgICAgICAgICAvKiBVc2UgYSBiZXN0IGZpdCBhbGdvcml0aG0gd2hlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hpbmcgZm9yIHNwYWNlIGZvciBhbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0aW9uIHJlcXVlc3QuICBUaGlzIHVzZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5IG1vcmUgZWZmaWNpZW50bHksIGJ1dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0aW9uIHdpbGwgYmUgbXVjaCBzbG93ZXIuICovCisjZW5kaWYgLyogTk9UX1VTRURfTk9XICovCisjZW5kaWYgLyogS01QX0RFQlVHICovCisKKworc3RhdGljIGJ1ZnNpemUgYmdldF9iaW5fc2l6ZVsgXSA9IHsKKyAgICAwLAorLy8gICAgMSA8PCA2LCAgICAvKiAuNSBDYWNoZSBsaW5lICovCisgICAgMSA8PCA3LCAgICAvKiAxIENhY2hlIGxpbmUsIG5ldyAqLworICAgIDEgPDwgOCwgICAgLyogMiBDYWNoZSBsaW5lcyAqLworICAgIDEgPDwgOSwgICAgLyogNCBDYWNoZSBsaW5lcywgbmV3ICovCisgICAgMSA8PCAxMCwgICAvKiA4IENhY2hlIGxpbmVzICovCisgICAgMSA8PCAxMSwgICAvKiAxNiBDYWNoZSBsaW5lcywgbmV3ICovCisgICAgMSA8PCAxMiwKKyAgICAxIDw8IDEzLCAgIC8qIG5ldyAqLworICAgIDEgPDwgMTQsCisgICAgMSA8PCAxNSwgICAvKiBuZXcgKi8KKyAgICAxIDw8IDE2LAorICAgIDEgPDwgMTcsCisgICAgMSA8PCAxOCwKKyAgICAxIDw8IDE5LAorICAgIDEgPDwgMjAsICAgIC8qICAxTUIgKi8KKyAgICAxIDw8IDIxLCAgICAvKiAgMk1CICovCisgICAgMSA8PCAyMiwgICAgLyogIDRNQiAqLworICAgIDEgPDwgMjMsICAgIC8qICA4TUIgKi8KKyAgICAxIDw8IDI0LCAgICAvKiAxNk1CICovCisgICAgMSA8PCAyNSwgICAgLyogMzJNQiAqLworfTsKKworI2RlZmluZSBNQVhfQkdFVF9CSU5TICAgKGludCkoc2l6ZW9mKGJnZXRfYmluX3NpemUpIC8gc2l6ZW9mKGJ1ZnNpemUpKQorCitzdHJ1Y3QgYmZoZWFkOworCisvKiAgRGVjbGFyZSB0aGUgaW50ZXJmYWNlLCBpbmNsdWRpbmcgdGhlIHJlcXVlc3RlZCBidWZmZXIgc2l6ZSB0eXBlLAorICAgIGJ1ZnNpemUuICAqLworCisvKiBRdWV1ZSBsaW5rcyAqLworCit0eXBlZGVmIHN0cnVjdCBxbGlua3MgeworICAgIHN0cnVjdCBiZmhlYWQgKmZsaW5rOyAgICAgICAgICAgICAvKiBGb3J3YXJkIGxpbmsgKi8KKyAgICBzdHJ1Y3QgYmZoZWFkICpibGluazsgICAgICAgICAgICAgLyogQmFja3dhcmQgbGluayAqLworfSBxbGlua3NfdDsKKworLyogSGVhZGVyIGluIGFsbG9jYXRlZCBhbmQgZnJlZSBidWZmZXJzICovCisKK3R5cGVkZWYgc3RydWN0IGJoZWFkMiB7CisgICAga21wX2luZm9fdCAqYnRocjsgICAgICAgICAgICAgICAgIC8qIFRoZSB0aHJlYWQgd2hpY2ggb3ducyB0aGUgYnVmZmVyIHBvb2wgKi8KKyAgICBidWZzaXplICAgICBwcmV2ZnJlZTsgICAgICAgICAgICAgLyogUmVsYXRpdmUgbGluayBiYWNrIHRvIHByZXZpb3VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUgYnVmZmVyIGluIG1lbW9yeSBvciAwIGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzIGJ1ZmZlciBpcyBhbGxvY2F0ZWQuICAqLworICAgIGJ1ZnNpemUgICAgIGJzaXplOyAgICAgICAgICAgICAgICAvKiBCdWZmZXIgc2l6ZTogcG9zaXRpdmUgaWYgZnJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVnYXRpdmUgaWYgYWxsb2NhdGVkLiAqLworfSBiaGVhZDJfdDsKKworLyogTWFrZSBzdXJlIHRoZSBiaGVhZCBzdHJ1Y3R1cmUgaXMgYSBtdWx0aXBsZSBvZiBTaXplUXVhbnQgaW4gc2l6ZS4gKi8KKwordHlwZWRlZiB1bmlvbiBiaGVhZCB7CisgICAgS01QX0FMSUdOKCBTaXplUXVhbnQgKQorICAgIEFsaWduVHlwZSAgICAgICAgICAgYl9hbGlnbjsKKyAgICBjaGFyICAgICAgICAgICAgICAgIGJfcGFkWyBzaXplb2YoYmhlYWQyX3QpICsgKFNpemVRdWFudCAtIChzaXplb2YoYmhlYWQyX3QpICUgU2l6ZVF1YW50KSkgXTsKKyAgICBiaGVhZDJfdCAgICAgICAgICAgIGJiOworfSBiaGVhZF90OworI2RlZmluZSBCSChwKSAgICgoYmhlYWRfdCAqKSAocCkpCisKKy8qICBIZWFkZXIgaW4gZGlyZWN0bHkgYWxsb2NhdGVkIGJ1ZmZlcnMgKGJ5IGFjcWZjbikgKi8KKwordHlwZWRlZiBzdHJ1Y3QgYmRoZWFkCit7CisgICAgYnVmc2l6ZSB0c2l6ZTsgICAgICAgICAgICAgICAgICAgIC8qIFRvdGFsIHNpemUsIGluY2x1ZGluZyBvdmVyaGVhZCAqLworICAgIGJoZWFkX3QgYmg7ICAgICAgICAgICAgICAgICAgICAgICAvKiBDb21tb24gaGVhZGVyICovCit9IGJkaGVhZF90OworI2RlZmluZSBCREgocCkgICgoYmRoZWFkX3QgKikgKHApKQorCisvKiBIZWFkZXIgaW4gZnJlZSBidWZmZXJzICovCisKK3R5cGVkZWYgc3RydWN0IGJmaGVhZCB7CisgICAgYmhlYWRfdCAgYmg7ICAgICAgICAgICAgICAgICAgICAgIC8qIENvbW1vbiBhbGxvY2F0ZWQvZnJlZSBoZWFkZXIgKi8KKyAgICBxbGlua3NfdCBxbDsgICAgICAgICAgICAgICAgICAgICAgLyogTGlua3Mgb24gZnJlZSBsaXN0ICovCit9IGJmaGVhZF90OworI2RlZmluZSBCRkgocCkgICgoYmZoZWFkX3QgKikgKHApKQorCit0eXBlZGVmIHN0cnVjdCB0aHJfZGF0YSB7CisgICAgYmZoZWFkX3QgZnJlZWxpc3RbIE1BWF9CR0VUX0JJTlMgXTsKKyNpZiBCdWZTdGF0cworICAgIHNpemVfdCB0b3RhbGxvYzsgICAgICAgICAgICAgICAvKiBUb3RhbCBzcGFjZSBjdXJyZW50bHkgYWxsb2NhdGVkICovCisgICAgbG9uZyBudW1nZXQsIG51bXJlbDsgICAgICAgICAgIC8qIE51bWJlciBvZiBiZ2V0KCkgYW5kIGJyZWwoKSBjYWxscyAqLworICAgIGxvbmcgbnVtcGJsazsgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgcG9vbCBibG9ja3MgKi8KKyAgICBsb25nIG51bXBnZXQsIG51bXByZWw7ICAgICAgICAgLyogTnVtYmVyIG9mIGJsb2NrIGdldHMgYW5kIHJlbHMgKi8KKyAgICBsb25nIG51bWRnZXQsIG51bWRyZWw7ICAgICAgICAgLyogTnVtYmVyIG9mIGRpcmVjdCBnZXRzIGFuZCByZWxzICovCisjZW5kaWYgLyogQnVmU3RhdHMgKi8KKworICAgIC8qIEF1dG9tYXRpYyBleHBhbnNpb24gYmxvY2sgbWFuYWdlbWVudCBmdW5jdGlvbnMgKi8KKyAgICBiZ2V0X2NvbXBhY3RfdCBjb21wZmNuOworICAgIGJnZXRfYWNxdWlyZV90IGFjcWZjbjsKKyAgICBiZ2V0X3JlbGVhc2VfdCByZWxmY247CisKKyAgICBiZ2V0X21vZGVfdCAgICBtb2RlOyAgICAgICAgICAgICAgLyogd2hhdCBhbGxvY2F0aW9uIG1vZGUgdG8gdXNlPyAqLworCisgICAgYnVmc2l6ZSBleHBfaW5jcjsgICAgICAgICAgICAgICAgIC8qIEV4cGFuc2lvbiBibG9jayBzaXplICovCisgICAgYnVmc2l6ZSBwb29sX2xlbjsgICAgICAgICAgICAgICAgIC8qIDA6IG5vIGJwb29sIGNhbGxzIGhhdmUgYmVlbiBtYWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xOiBub3QgYWxsIHBvb2wgYmxvY2tzIGFyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHNhbWUgc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+MDogKGNvbW1vbikgYmxvY2sgc2l6ZSBmb3IgYWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicG9vbCBjYWxscyBtYWRlIHNvIGZhcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGJmaGVhZF90ICogbGFzdF9wb29sOyAgICAgICAgICAgICAvKiBMYXN0IHBvb2wgb3duZWQgYnkgdGhpcyB0aHJlYWQgKGRlbGF5IGRlYWxvY2F0aW9uKSAqLworfSB0aHJfZGF0YV90OworCisvKiAgTWluaW11bSBhbGxvY2F0aW9uIHF1YW50dW06ICovCisKKyNkZWZpbmUgUUxTaXplICAoc2l6ZW9mKHFsaW5rc190KSkKKyNkZWZpbmUgU2l6ZVEgICAoKFNpemVRdWFudCA+IFFMU2l6ZSkgPyBTaXplUXVhbnQgOiBRTFNpemUpCisjZGVmaW5lIE1heFNpemUgKGJ1ZnNpemUpKCB+ICggKCAoYnVmc2l6ZSkoIDEgKSA8PCAoIHNpemVvZiggYnVmc2l6ZSApICogQ0hBUl9CSVQgLSAxICkgKSB8ICggU2l6ZVF1YW50IC0gMSApICkgKQorICAgIC8vIE1heGltdW4gZm9yIHRoZSByZXF1ZXN0ZWQgc2l6ZS4KKworLyogRW5kIHNlbnRpbmVsOiB2YWx1ZSBwbGFjZWQgaW4gYnNpemUgZmllbGQgb2YgZHVtbXkgYmxvY2sgZGVsaW1pdGluZworICAgZW5kIG9mIHBvb2wgYmxvY2suICBUaGUgbW9zdCBuZWdhdGl2ZSBudW1iZXIgd2hpY2ggd2lsbCAgZml0ICBpbiAgYQorICAgYnVmc2l6ZSwgZGVmaW5lZCBpbiBhIHdheSB0aGF0IHRoZSBjb21waWxlciB3aWxsIGFjY2VwdC4gKi8KKworI2RlZmluZSBFU2VudCAgICgoYnVmc2l6ZSkgKC0oKCgoKGJ1ZnNpemUpMSk8PCgoaW50KXNpemVvZihidWZzaXplKSo4LTIpKS0xKSoyKS0yKSkKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIFRocmVhZCBEYXRhIG1hbmFnZW1lbnQgcm91dGluZXMgKi8KKworc3RhdGljIGludAorYmdldF9nZXRfYmluKCBidWZzaXplIHNpemUgKQoreworICAgIC8vIGJpbmFyeSBjaG9wIGJpbnMKKyAgICBpbnQgbG8gPSAwLCBoaSA9IE1BWF9CR0VUX0JJTlMgLSAxOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggc2l6ZSA+IDAgKTsKKworICAgIHdoaWxlICggKGhpIC0gbG8pID4gMSApIHsKKyAgICAgICAgaW50IG1pZCA9IChsbyArIGhpKSA+PiAxOworICAgICAgICBpZiAoc2l6ZSA8IGJnZXRfYmluX3NpemVbIG1pZCBdKQorICAgICAgICAgICAgaGkgPSBtaWQgLSAxOworICAgICAgICBlbHNlCisgICAgICAgICAgICBsbyA9IG1pZDsKKyAgICB9CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCAobG8gPj0gMCkgJiYgKGxvIDwgTUFYX0JHRVRfQklOUykgKTsKKworICAgIHJldHVybiBsbzsKK30KKworc3RhdGljIHZvaWQKK3NldF90aHJfZGF0YSgga21wX2luZm9fdCAqdGggKQoreworICAgIGludCBpOworICAgIHRocl9kYXRhX3QgKmRhdGE7CisKKyAgICBkYXRhID0KKyAgICAgICAgKHRocl9kYXRhX3QgKikoCisgICAgICAgICAgICAoICEgdGgtPnRoLnRoX2xvY2FsLmJnZXRfZGF0YSApID8gX19rbXBfYWxsb2NhdGUoIHNpemVvZiggKmRhdGEgKSApIDogdGgtPnRoLnRoX2xvY2FsLmJnZXRfZGF0YQorICAgICAgICApOworCisgICAgbWVtc2V0KCBkYXRhLCAnXDAnLCBzaXplb2YoICpkYXRhICkgKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfQkdFVF9CSU5TOyArK2kpIHsKKyAgICAgICAgZGF0YS0+ZnJlZWxpc3RbIGkgXS5xbC5mbGluayA9ICYgZGF0YS0+ZnJlZWxpc3RbIGkgXTsKKyAgICAgICAgZGF0YS0+ZnJlZWxpc3RbIGkgXS5xbC5ibGluayA9ICYgZGF0YS0+ZnJlZWxpc3RbIGkgXTsKKyAgICB9CisKKyAgICB0aC0+dGgudGhfbG9jYWwuYmdldF9kYXRhID0gZGF0YTsKKyAgICB0aC0+dGgudGhfbG9jYWwuYmdldF9saXN0ID0gMDsKKyNpZiAhIFVTRV9DTVBfWENIR19GT1JfQkdFVAorI2lmZGVmIFVTRV9RVUVVSU5HX0xPQ0tfRk9SX0JHRVQKKyAgICBfX2ttcF9pbml0X2xvY2soICYgdGgtPnRoLnRoX2xvY2FsLmJnZXRfbG9jayApOworI2Vsc2UKKyAgICBfX2ttcF9pbml0X2Jvb3RzdHJhcF9sb2NrKCAmIHRoLT50aC50aF9sb2NhbC5iZ2V0X2xvY2sgKTsKKyNlbmRpZiAvKiBVU0VfTE9DS19GT1JfQkdFVCAqLworI2VuZGlmIC8qICEgVVNFX0NNUF9YQ0hHX0ZPUl9CR0VUICovCit9CisKK3N0YXRpYyB0aHJfZGF0YV90ICoKK2dldF90aHJfZGF0YSgga21wX2luZm9fdCAqdGggKQoreworICAgIHRocl9kYXRhX3QgKmRhdGE7CisKKyAgICBkYXRhID0gKHRocl9kYXRhX3QgKikgdGgtPnRoLnRoX2xvY2FsLmJnZXRfZGF0YTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIGRhdGEgIT0gMCApOworCisgICAgcmV0dXJuIGRhdGE7Cit9CisKKworI2lmZGVmIEtNUF9ERUJVRworCitzdGF0aWMgdm9pZAorX19rbXBfYmdldF92YWxpZGF0ZV9xdWV1ZSgga21wX2luZm9fdCAqdGggKQoreworICAgIC8qIE5PVEU6IGFzc3VtZSB0aGF0IHRoZSBnbG9iYWxfbG9jayBpcyBoZWxkICovCisKKyAgICB2b2lkICpwID0gKHZvaWQgKikgdGgtPnRoLnRoX2xvY2FsLmJnZXRfbGlzdDsKKworICAgIHdoaWxlIChwICE9IDApIHsKKyAgICAgICAgYmZoZWFkX3QgKmIgPSBCRkgoKChjaGFyICopIHApIC0gc2l6ZW9mKGJoZWFkX3QpKTsKKworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGItPmJoLmJiLmJzaXplICE9IDApOworICAgICAgICBwID0gKHZvaWQgKikgYi0+cWwuZmxpbms7CisgICAgfQorfQorCisjZW5kaWYKKworLyogV2FsayB0aGUgZnJlZSBsaXN0IGFuZCByZWxlYXNlIHRoZSBlbnF1ZXVlZCBidWZmZXJzICovCisKK3N0YXRpYyB2b2lkCitfX2ttcF9iZ2V0X2RlcXVldWUoIGttcF9pbmZvX3QgKnRoICkKK3sKKyAgICB2b2lkICpwID0gVENSX1NZTkNfUFRSKHRoLT50aC50aF9sb2NhbC5iZ2V0X2xpc3QpOworCisgICAgaWYgKHAgIT0gMCkgeworICAgICAgICAjaWYgVVNFX0NNUF9YQ0hHX0ZPUl9CR0VUCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdm9sYXRpbGUgdm9pZCAqb2xkX3ZhbHVlID0gVENSX1NZTkNfUFRSKHRoLT50aC50aF9sb2NhbC5iZ2V0X2xpc3QpOworICAgICAgICAgICAgICAgIHdoaWxlICggISBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUFRSKAorICAgICAgICAgICAgICAgICAgICAmIHRoLT50aC50aF9sb2NhbC5iZ2V0X2xpc3QsIG9sZF92YWx1ZSwgTlVMTCApICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9DUFVfUEFVU0UoKTsKKyAgICAgICAgICAgICAgICAgICAgb2xkX3ZhbHVlID0gVENSX1NZTkNfUFRSKHRoLT50aC50aF9sb2NhbC5iZ2V0X2xpc3QpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwID0gKHZvaWQgKikgb2xkX3ZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAjZWxzZSAvKiAhIFVTRV9DTVBfWENIR19GT1JfQkdFVCAqLworICAgICAgICAgICAgI2lmZGVmIFVTRV9RVUVVSU5HX0xPQ0tfRk9SX0JHRVQKKyAgICAgICAgICAgICAgICBfX2ttcF9hY3F1aXJlX2xvY2soICYgdGgtPnRoLnRoX2xvY2FsLmJnZXRfbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQodGgpICk7CisgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICYgdGgtPnRoLnRoX2xvY2FsLmJnZXRfbG9jayApOworICAgICAgICAgICAgI2VuZGlmIC8qIFVTRV9RVUVVSU5HX0xPQ0tfRk9SX0JHRVQgKi8KKworICAgICAgICAgICAgIHAgPSAodm9pZCAqKSB0aC0+dGgudGhfbG9jYWwuYmdldF9saXN0OworICAgICAgICAgICAgIHRoLT50aC50aF9sb2NhbC5iZ2V0X2xpc3QgPSAwOworCisgICAgICAgICAgICAjaWZkZWYgVVNFX1FVRVVJTkdfTE9DS19GT1JfQkdFVAorICAgICAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfbG9jayggJiB0aC0+dGgudGhfbG9jYWwuYmdldF9sb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCh0aCkgKTsKKyAgICAgICAgICAgICNlbHNlCisgICAgICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJiB0aC0+dGgudGhfbG9jYWwuYmdldF9sb2NrICk7CisgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgI2VuZGlmIC8qIFVTRV9DTVBfWENIR19GT1JfQkdFVCAqLworCisgICAgICAgIC8qIENoZWNrIGFnYWluIHRvIG1ha2Ugc3VyZSB0aGUgbGlzdCBpcyBub3QgZW1wdHkgKi8KKworICAgICAgICB3aGlsZSAocCAhPSAwKSB7CisgICAgICAgICAgICB2b2lkICpidWYgPSBwOworICAgICAgICAgICAgYmZoZWFkX3QgKmIgPSBCRkgoKChjaGFyICopIHApIC0gc2l6ZW9mKGJoZWFkX3QpKTsKKworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggYi0+YmguYmIuYnNpemUgIT0gMCApOworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggKCAoa21wX3VpbnRwdHJfdClUQ1JfUFRSKGItPmJoLmJiLmJ0aHIpICYgfjEgKSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa21wX3VpbnRwdHJfdCl0aCApOyAvLyBjbGVhciBwb3NzaWJsZSBtYXJrCisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBiLT5xbC5ibGluayA9PSAwICk7CisKKyAgICAgICAgICAgIHAgPSAodm9pZCAqKSBiLT5xbC5mbGluazsKKworICAgICAgICAgICAgYnJlbCggdGgsIGJ1ZiApOworICAgICAgICB9CisgICAgfQorfQorCisvKiBDaGFpbiB0b2dldGhlciB0aGUgZnJlZSBidWZmZXJzIGJ5IHVzaW5nIHRoZSB0aHJlYWQgb3duZXIgZmllbGQgKi8KKworc3RhdGljIHZvaWQKK19fa21wX2JnZXRfZW5xdWV1ZSgga21wX2luZm9fdCAqdGgsIHZvaWQgKmJ1ZgorI2lmZGVmIFVTRV9RVUVVSU5HX0xPQ0tfRk9SX0JHRVQKKyAgICAgICAgICAgICAgICAgICAgLCBrbXBfaW50MzIgcmVsX2d0aWQKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgKQoreworICAgIGJmaGVhZF90ICpiID0gQkZIKCgoY2hhciAqKSBidWYpIC0gc2l6ZW9mKGJoZWFkX3QpKTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIGItPmJoLmJiLmJzaXplICE9IDAgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCAoIChrbXBfdWludHB0cl90KVRDUl9QVFIoYi0+YmguYmIuYnRocikgJiB+MSApID09CisgICAgICAgICAgICAgICAgICAgICAgICAoa21wX3VpbnRwdHJfdCl0aCApOyAvLyBjbGVhciBwb3NzaWJsZSBtYXJrCisKKyAgICBiLT5xbC5ibGluayA9IDA7CisKKyAgICBLQ19UUkFDRSggMTAsICggIl9fa21wX2JnZXRfZW5xdWV1ZTogbW92aW5nIGJ1ZmZlciB0byBUIyVkIGxpc3RcbiIsCisgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRoICkgKSApOworCisjaWYgVVNFX0NNUF9YQ0hHX0ZPUl9CR0VUCisgICAgeworICAgICAgICB2b2xhdGlsZSB2b2lkICpvbGRfdmFsdWUgPSBUQ1JfUFRSKHRoLT50aC50aF9sb2NhbC5iZ2V0X2xpc3QpOworICAgICAgICAvKiB0aGUgbmV4dCBwb2ludGVyIG11c3QgYmUgc2V0IGJlZm9yZSBzZXR0aW5nIGJnZXRfbGlzdCB0byBidWYgdG8gYXZvaWQKKyAgICAgICAgICAgZXhwb3NpbmcgYSBicm9rZW4gbGlzdCB0byBvdGhlciB0aHJlYWRzLCBldmVuIGZvciBhbiBpbnN0YW50LiAqLworICAgICAgICBiLT5xbC5mbGluayA9IEJGSCggb2xkX3ZhbHVlICk7CisKKyAgICAgICAgd2hpbGUgKCAhIEtNUF9DT01QQVJFX0FORF9TVE9SRV9QVFIoCisgICAgICAgICAgICAmIHRoLT50aC50aF9sb2NhbC5iZ2V0X2xpc3QsIG9sZF92YWx1ZSwgYnVmICkgKQorICAgICAgICB7CisgICAgICAgICAgICBLTVBfQ1BVX1BBVVNFKCk7CisgICAgICAgICAgICBvbGRfdmFsdWUgPSBUQ1JfUFRSKHRoLT50aC50aF9sb2NhbC5iZ2V0X2xpc3QpOworICAgICAgICAgICAgLyogdGhlIG5leHQgcG9pbnRlciBtdXN0IGJlIHNldCBiZWZvcmUgc2V0dGluZyBiZ2V0X2xpc3QgdG8gYnVmIHRvIGF2b2lkCisgICAgICAgICAgICAgICBleHBvc2luZyBhIGJyb2tlbiBsaXN0IHRvIG90aGVyIHRocmVhZHMsIGV2ZW4gZm9yIGFuIGluc3RhbnQuICovCisgICAgICAgICAgICBiLT5xbC5mbGluayA9IEJGSCggb2xkX3ZhbHVlICk7CisgICAgICAgIH0KKyAgICB9CisjZWxzZSAvKiAhIFVTRV9DTVBfWENIR19GT1JfQkdFVCAqLworIyBpZmRlZiBVU0VfUVVFVUlOR19MT0NLX0ZPUl9CR0VUCisgICAgX19rbXBfYWNxdWlyZV9sb2NrKCAmIHRoLT50aC50aF9sb2NhbC5iZ2V0X2xvY2ssIHJlbF9ndGlkICk7CisjIGVsc2UKKyAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmIHRoLT50aC50aF9sb2NhbC5iZ2V0X2xvY2sgKTsKKyAjIGVuZGlmCisKKyAgICBiLT5xbC5mbGluayA9IEJGSCggdGgtPnRoLnRoX2xvY2FsLmJnZXRfbGlzdCApOworICAgIHRoLT50aC50aF9sb2NhbC5iZ2V0X2xpc3QgPSAodm9pZCAqKSBidWY7CisKKyMgaWZkZWYgVVNFX1FVRVVJTkdfTE9DS19GT1JfQkdFVAorICAgIF9fa21wX3JlbGVhc2VfbG9jayggJiB0aC0+dGgudGhfbG9jYWwuYmdldF9sb2NrLCByZWxfZ3RpZCApOworIyBlbHNlCisgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJiB0aC0+dGgudGhfbG9jYWwuYmdldF9sb2NrICk7CisjIGVuZGlmCisjZW5kaWYgLyogVVNFX0NNUF9YQ0hHX0ZPUl9CR0VUICovCit9CisKKy8qIGluc2VydCBidWZmZXIgYmFjayBvbnRvIGEgbmV3IGZyZWVsaXN0ICovCisKK3N0YXRpYyB2b2lkCitfX2ttcF9iZ2V0X2luc2VydF9pbnRvX2ZyZWVsaXN0KCB0aHJfZGF0YV90ICp0aHIsIGJmaGVhZF90ICpiICkKK3sKKyAgICBpbnQgYmluOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggKChzaXplX3QpYiApICUgU2l6ZVF1YW50ID09IDAgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBiLT5iaC5iYi5ic2l6ZSAlIFNpemVRdWFudCA9PSAwICk7CisKKyAgICBiaW4gPSBiZ2V0X2dldF9iaW4oIGItPmJoLmJiLmJzaXplICk7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKHRoci0+ZnJlZWxpc3RbIGJpbiBdLnFsLmJsaW5rLT5xbC5mbGluayA9PSAmdGhyLT5mcmVlbGlzdFsgYmluIF0pOworICAgIEtNUF9ERUJVR19BU1NFUlQodGhyLT5mcmVlbGlzdFsgYmluIF0ucWwuZmxpbmstPnFsLmJsaW5rID09ICZ0aHItPmZyZWVsaXN0WyBiaW4gXSk7CisKKyAgICBiLT5xbC5mbGluayA9ICZ0aHItPmZyZWVsaXN0WyBiaW4gXTsKKyAgICBiLT5xbC5ibGluayA9IHRoci0+ZnJlZWxpc3RbIGJpbiBdLnFsLmJsaW5rOworCisgICAgdGhyLT5mcmVlbGlzdFsgYmluIF0ucWwuYmxpbmsgPSBiOworICAgIGItPnFsLmJsaW5rLT5xbC5mbGluayA9IGI7Cit9CisKKy8qIHVubGluayB0aGUgYnVmZmVyIGZyb20gdGhlIG9sZCBmcmVlbGlzdCAqLworCitzdGF0aWMgdm9pZAorX19rbXBfYmdldF9yZW1vdmVfZnJvbV9mcmVlbGlzdCggYmZoZWFkX3QgKmIgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoYi0+cWwuYmxpbmstPnFsLmZsaW5rID09IGIpOworICAgIEtNUF9ERUJVR19BU1NFUlQoYi0+cWwuZmxpbmstPnFsLmJsaW5rID09IGIpOworCisgICAgYi0+cWwuYmxpbmstPnFsLmZsaW5rID0gYi0+cWwuZmxpbms7CisgICAgYi0+cWwuZmxpbmstPnFsLmJsaW5rID0gYi0+cWwuYmxpbms7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiAgR0VUIFNUQVRTIC0tIGNoZWNrIGluZm8gb24gZnJlZSBsaXN0ICovCisKK3N0YXRpYyB2b2lkCitiY2hlY2soICBrbXBfaW5mb190ICp0aCwgYnVmc2l6ZSAqbWF4X2ZyZWUsIGJ1ZnNpemUgKnRvdGFsX2ZyZWUgKQoreworICAgIHRocl9kYXRhX3QgKnRociA9IGdldF90aHJfZGF0YSggdGggKTsKKyAgICBpbnQgYmluOworCisgICAgKnRvdGFsX2ZyZWUgPSAqbWF4X2ZyZWUgPSAwOworCisgICAgZm9yIChiaW4gPSAwOyBiaW4gPCBNQVhfQkdFVF9CSU5TOyArK2JpbikgeworICAgICAgICBiZmhlYWRfdCAqYiwgKmJlc3Q7CisKKyAgICAgICAgYmVzdCA9ICZ0aHItPmZyZWVsaXN0WyBiaW4gXTsKKyAgICAgICAgYiA9IGJlc3QtPnFsLmZsaW5rOworCisgICAgICAgIHdoaWxlIChiICE9ICZ0aHItPmZyZWVsaXN0WyBiaW4gXSkgeworICAgICAgICAgICAgKnRvdGFsX2ZyZWUgKz0gKGItPmJoLmJiLmJzaXplIC0gc2l6ZW9mKCBiaGVhZF90ICkpOworICAgICAgICAgICAgaWYgKChiZXN0ID09ICZ0aHItPmZyZWVsaXN0WyBiaW4gXSkgfHwgKGItPmJoLmJiLmJzaXplIDwgYmVzdC0+YmguYmIuYnNpemUpKQorICAgICAgICAgICAgICAgIGJlc3QgPSBiOworCisgICAgICAgICAgICAvKiBMaW5rIHRvIG5leHQgYnVmZmVyICovCisgICAgICAgICAgICBiID0gYi0+cWwuZmxpbms7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKm1heF9mcmVlIDwgYmVzdC0+YmguYmIuYnNpemUpCisgICAgICAgICAgICAqbWF4X2ZyZWUgPSBiZXN0LT5iaC5iYi5ic2l6ZTsKKyAgICB9CisKKyAgICBpZiAoKm1heF9mcmVlID4gKGJ1ZnNpemUpc2l6ZW9mKCBiaGVhZF90ICkpCisgICAgICAgICptYXhfZnJlZSAtPSBzaXplb2YoIGJoZWFkX3QgKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qICBCR0VUICAtLSAgQWxsb2NhdGUgYSBidWZmZXIuICAqLworCitzdGF0aWMgdm9pZCAqCitiZ2V0KCAga21wX2luZm9fdCAqdGgsIGJ1ZnNpemUgcmVxdWVzdGVkX3NpemUgKQoreworICAgIHRocl9kYXRhX3QgKnRociA9IGdldF90aHJfZGF0YSggdGggKTsKKyAgICBidWZzaXplIHNpemUgPSByZXF1ZXN0ZWRfc2l6ZTsKKyAgICBiZmhlYWRfdCAqYjsKKyAgICB2b2lkICpidWY7CisgICAgaW50IGNvbXBhY3RzZXEgPSAwOworICAgIGludCB1c2VfYmxpbmsgPSAwOworLyogRm9yIEJlc3RGaXQgKi8KKyAgICBiZmhlYWRfdCAqYmVzdDsKKworICAgIGlmICggc2l6ZSA8IDAgfHwgc2l6ZSArIHNpemVvZiggYmhlYWRfdCApID4gTWF4U2l6ZSApIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfTsgLy8gaWYKKworICAgIF9fa21wX2JnZXRfZGVxdWV1ZSggdGggKTsgICAgICAgICAvKiBSZWxlYXNlIGFueSBxdWV1ZWQgYnVmZmVycyAqLworCisgICAgaWYgKHNpemUgPCAoYnVmc2l6ZSlTaXplUSkgeyAgICAgIC8qIE5lZWQgYXQgbGVhc3Qgcm9vbSBmb3IgdGhlICovCisgICAgICAgIHNpemUgPSBTaXplUTsgICAgICAgICAgICAgICAgIC8qICAgIHF1ZXVlIGxpbmtzLiAgKi8KKyAgICB9CisgICAgI2lmIGRlZmluZWQoIFNpemVRdWFudCApICYmICggU2l6ZVF1YW50ID4gMSApCisgICAgICAgIHNpemUgPSAoc2l6ZSArIChTaXplUXVhbnQgLSAxKSkgJiAofihTaXplUXVhbnQgLSAxKSk7CisgICAgI2VuZGlmCisKKyAgICBzaXplICs9IHNpemVvZihiaGVhZF90KTsgICAgIC8qIEFkZCBvdmVyaGVhZCBpbiBhbGxvY2F0ZWQgYnVmZmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHNpemUgcmVxdWlyZWQuICovCisgICAgS01QX0RFQlVHX0FTU0VSVCggc2l6ZSA+PSAwICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggc2l6ZSAlIFNpemVRdWFudCA9PSAwICk7CisKKyAgICB1c2VfYmxpbmsgPSAoIHRoci0+bW9kZSA9PSBiZ2V0X21vZGVfbGlmbyApOworCisgICAgLyogSWYgYSBjb21wYWN0IGZ1bmN0aW9uIHdhcyBwcm92aWRlZCBpbiB0aGUgY2FsbCB0byBiZWN0bCgpLCB3cmFwCisgICAgICAgYSBsb29wIGFyb3VuZCB0aGUgYWxsb2NhdGlvbiBwcm9jZXNzICB0byAgYWxsb3cgIGNvbXBhY3Rpb24gIHRvCisgICAgICAgaW50ZXJ2ZW5lIGluIGNhc2Ugd2UgZG9uJ3QgZmluZCBhIHN1aXRhYmxlIGJ1ZmZlciBpbiB0aGUgY2hhaW4uICovCisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGludCBiaW47CisKKyAgICAgICAgZm9yIChiaW4gPSBiZ2V0X2dldF9iaW4oIHNpemUgKTsgYmluIDwgTUFYX0JHRVRfQklOUzsgKytiaW4pIHsKKyAgICAgICAgICAgIC8qIExpbmsgdG8gbmV4dCBidWZmZXIgKi8KKyAgICAgICAgICAgIGIgPSAoIHVzZV9ibGluayA/IHRoci0+ZnJlZWxpc3RbIGJpbiBdLnFsLmJsaW5rIDogdGhyLT5mcmVlbGlzdFsgYmluIF0ucWwuZmxpbmsgKTsKKworICAgICAgICAgICAgaWYgKHRoci0+bW9kZSA9PSBiZ2V0X21vZGVfYmVzdCkgeworICAgICAgICAgICAgICAgIGJlc3QgPSAmdGhyLT5mcmVlbGlzdFsgYmluIF07CisKKyAgICAgICAgICAgICAgICAvKiBTY2FuIHRoZSBmcmVlIGxpc3Qgc2VhcmNoaW5nIGZvciB0aGUgZmlyc3QgYnVmZmVyIGJpZyBlbm91Z2gKKyAgICAgICAgICAgICAgICAgICB0byBob2xkIHRoZSByZXF1ZXN0ZWQgc2l6ZSBidWZmZXIuICovCisKKyAgICAgICAgICAgICAgICB3aGlsZSAoYiAhPSAmdGhyLT5mcmVlbGlzdFsgYmluIF0pIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGItPmJoLmJiLmJzaXplID49IChidWZzaXplKSBzaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGJlc3QgPT0gJnRoci0+ZnJlZWxpc3RbIGJpbiBdKSB8fCAoYi0+YmguYmIuYnNpemUgPCBiZXN0LT5iaC5iYi5ic2l6ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZXN0ID0gYjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8qIExpbmsgdG8gbmV4dCBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgYiA9ICggdXNlX2JsaW5rID8gYi0+cWwuYmxpbmsgOiBiLT5xbC5mbGluayApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBiID0gYmVzdDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgd2hpbGUgKGIgIT0gJnRoci0+ZnJlZWxpc3RbIGJpbiBdKSB7CisgICAgICAgICAgICAgICAgaWYgKChidWZzaXplKSBiLT5iaC5iYi5ic2l6ZSA+PSAoYnVmc2l6ZSkgc2l6ZSkgeworCisgICAgICAgICAgICAgICAgICAgIC8qIEJ1ZmZlciAgaXMgYmlnIGVub3VnaCB0byBzYXRpc2Z5ICB0aGUgcmVxdWVzdC4gIEFsbG9jYXRlIGl0CisgICAgICAgICAgICAgICAgICAgICAgIHRvIHRoZSBjYWxsZXIuICBXZSBtdXN0IGRlY2lkZSB3aGV0aGVyIHRoZSBidWZmZXIgaXMgIGxhcmdlCisgICAgICAgICAgICAgICAgICAgICAgIGVub3VnaCAgdG8gIHNwbGl0ICBpbnRvICB0aGUgcGFydCBnaXZlbiB0byB0aGUgY2FsbGVyIGFuZCBhCisgICAgICAgICAgICAgICAgICAgICAgIGZyZWUgYnVmZmVyIHRoYXQgcmVtYWlucyBvbiB0aGUgZnJlZSBsaXN0LCBvciAgd2hldGhlciAgdGhlCisgICAgICAgICAgICAgICAgICAgICAgIGVudGlyZSAgYnVmZmVyICBzaG91bGQgIGJlICByZW1vdmVkICBmcm9tIHRoZSBmcmVlIGxpc3QgYW5kCisgICAgICAgICAgICAgICAgICAgICAgIGdpdmVuIHRvIHRoZSBjYWxsZXIgaW4gaXRzIGVudGlyZXR5LiAgIFdlICBvbmx5ICBzcGxpdCAgdGhlCisgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciBpZiBlbm91Z2ggcm9vbSByZW1haW5zIGZvciBhIGhlYWRlciBwbHVzIHRoZSBtaW5pbXVtCisgICAgICAgICAgICAgICAgICAgICAgIHF1YW50dW0gb2YgYWxsb2NhdGlvbi4gKi8KKworICAgICAgICAgICAgICAgICAgICBpZiAoKGItPmJoLmJiLmJzaXplIC0gKGJ1ZnNpemUpIHNpemUpID4gKGJ1ZnNpemUpKFNpemVRICsgKHNpemVvZihiaGVhZF90KSkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBiaGVhZF90ICpiYSwgKmJuOworCisgICAgICAgICAgICAgICAgICAgICAgICBiYSA9IEJIKCgoY2hhciAqKSBiKSArIChiLT5iaC5iYi5ic2l6ZSAtIChidWZzaXplKSBzaXplKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBibiA9IEJIKCgoY2hhciAqKSBiYSkgKyBzaXplKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChibi0+YmIucHJldmZyZWUgPT0gYi0+YmguYmIuYnNpemUpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBTdWJ0cmFjdCBzaXplIGZyb20gbGVuZ3RoIG9mIGZyZWUgYmxvY2suICovCisgICAgICAgICAgICAgICAgICAgICAgICBiLT5iaC5iYi5ic2l6ZSAtPSAoYnVmc2l6ZSkgc2l6ZTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogTGluayBhbGxvY2F0ZWQgYnVmZmVyIHRvIHRoZSBwcmV2aW91cyBmcmVlIGJ1ZmZlci4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGJhLT5iYi5wcmV2ZnJlZSA9IGItPmJoLmJiLmJzaXplOworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBQbHVnIG5lZ2F0aXZlIHNpemUgaW50byB1c2VyIGJ1ZmZlci4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGJhLT5iYi5ic2l6ZSA9IC1zaXplOworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBNYXJrIHRoaXMgYnVmZmVyIGFzIG93bmVkIGJ5IHRoaXMgdGhyZWFkLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgVENXX1BUUihiYS0+YmIuYnRociwgdGgpOyAgIC8vIG5vdCBhbiBhbGxvY2F0ZWQgYWRkcmVzcyAoZG8gbm90IG1hcmsgaXQpCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBNYXJrIGJ1ZmZlciBhZnRlciB0aGlzIG9uZSBub3QgcHJlY2VkZWQgYnkgZnJlZSBibG9jay4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGJuLT5iYi5wcmV2ZnJlZSA9IDA7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVubGluayB0aGUgYnVmZmVyIGZyb20gdGhlIG9sZCBmcmVlbGlzdCwgYW5kIHJlaW5zZXJ0IGl0IGludG8gdGhlIG5ldyBmcmVlbGlzdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfYmdldF9yZW1vdmVfZnJvbV9mcmVlbGlzdCggYiApOworICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfYmdldF9pbnNlcnRfaW50b19mcmVlbGlzdCggdGhyLCBiICk7CisjaWYgQnVmU3RhdHMKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoci0+dG90YWxsb2MgKz0gKHNpemVfdCkgc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoci0+bnVtZ2V0Kys7ICAgICAgICAvKiBJbmNyZW1lbnQgbnVtYmVyIG9mIGJnZXQoKSBjYWxscyAqLworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICBidWYgPSAodm9pZCAqKSAoKCgoY2hhciAqKSBiYSkgKyBzaXplb2YoYmhlYWRfdCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoICgoc2l6ZV90KWJ1ZikgJSBTaXplUXVhbnQgPT0gMCApOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJ1ZjsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJoZWFkX3QgKmJhOworCisgICAgICAgICAgICAgICAgICAgICAgICBiYSA9IEJIKCgoY2hhciAqKSBiKSArIGItPmJoLmJiLmJzaXplKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChiYS0+YmIucHJldmZyZWUgPT0gYi0+YmguYmIuYnNpemUpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgYnVmZmVyIGlzbid0IGJpZyBlbm91Z2ggdG8gc3BsaXQuICBHaXZlICB0aGUgIHdob2xlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGViYW5nIHRvIHRoZSBjYWxsZXIgYW5kIHJlbW92ZSBpdCBmcm9tIHRoZSBmcmVlIGxpc3QuICovCisKKyAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfYmdldF9yZW1vdmVfZnJvbV9mcmVlbGlzdCggYiApOworI2lmIEJ1ZlN0YXRzCisgICAgICAgICAgICAgICAgICAgICAgICB0aHItPnRvdGFsbG9jICs9IChzaXplX3QpIGItPmJoLmJiLmJzaXplOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyLT5udW1nZXQrKzsgICAgICAgIC8qIEluY3JlbWVudCBudW1iZXIgb2YgYmdldCgpIGNhbGxzICovCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5lZ2F0ZSBzaXplIHRvIG1hcmsgYnVmZmVyIGFsbG9jYXRlZC4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGItPmJoLmJiLmJzaXplID0gLShiLT5iaC5iYi5ic2l6ZSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1hcmsgdGhpcyBidWZmZXIgYXMgb3duZWQgYnkgdGhpcyB0aHJlYWQuICovCisgICAgICAgICAgICAgICAgICAgICAgICBUQ1dfUFRSKGJhLT5iYi5idGhyLCB0aCk7ICAgLy8gbm90IGFuIGFsbG9jYXRlZCBhZGRyZXNzIChkbyBub3QgbWFyayBpdCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFplcm8gdGhlIGJhY2sgcG9pbnRlciBpbiB0aGUgbmV4dCBidWZmZXIgaW4gbWVtb3J5CisgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgYnVmZmVyIGlzIGFsbG9jYXRlZC4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGJhLT5iYi5wcmV2ZnJlZSA9IDA7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdpdmUgdXNlciBidWZmZXIgc3RhcnRpbmcgYXQgcXVldWUgbGlua3MuICovCisgICAgICAgICAgICAgICAgICAgICAgICBidWYgPSAgKHZvaWQgKikgJihiLT5xbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCAoKHNpemVfdClidWYpICUgU2l6ZVF1YW50ID09IDAgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBidWY7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBMaW5rIHRvIG5leHQgYnVmZmVyICovCisgICAgICAgICAgICAgICAgYiA9ICggdXNlX2JsaW5rID8gYi0+cWwuYmxpbmsgOiBiLT5xbC5mbGluayApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogV2UgZmFpbGVkIHRvIGZpbmQgYSBidWZmZXIuICBJZiB0aGVyZSdzIGEgY29tcGFjdCAgZnVuY3Rpb24KKyAgICAgICAgICAgZGVmaW5lZCwgIG5vdGlmeSAgaXQgIG9mIHRoZSBzaXplIHJlcXVlc3RlZC4gIElmIGl0IHJldHVybnMKKyAgICAgICAgICAgVFJVRSwgdHJ5IHRoZSBhbGxvY2F0aW9uIGFnYWluLiAqLworCisgICAgICAgIGlmICgodGhyLT5jb21wZmNuID09IDApIHx8ICghKCp0aHItPmNvbXBmY24pKHNpemUsICsrY29tcGFjdHNlcSkpKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIE5vIGJ1ZmZlciBhdmFpbGFibGUgd2l0aCByZXF1ZXN0ZWQgc2l6ZSBmcmVlLiAqLworCisgICAgLyogRG9uJ3QgZ2l2ZSB1cCB5ZXQgLS0gbG9vayBpbiB0aGUgcmVzZXJ2ZSBzdXBwbHkuICovCisKKyAgICBpZiAodGhyLT5hY3FmY24gIT0gMCkgeworICAgICAgICBpZiAoc2l6ZSA+IChidWZzaXplKSAodGhyLT5leHBfaW5jciAtIHNpemVvZihiaGVhZF90KSkpIHsKKworICAgICAgICAgICAgLyogUmVxdWVzdCAgaXMgIHRvbyAgbGFyZ2UgIHRvICBmaXQgaW4gYSBzaW5nbGUgZXhwYW5zaW9uCisgICAgICAgICAgICAgICBibG9jay4gIFRyeSB0byBzYXRpc3kgaXQgYnkgYSBkaXJlY3QgYnVmZmVyIGFjcXVpc2l0aW9uLiAqLworCisgICAgICAgICAgICBiZGhlYWRfdCAqYmRoOworCisgICAgICAgICAgICBzaXplICs9IHNpemVvZihiZGhlYWRfdCkgLSBzaXplb2YoYmhlYWRfdCk7CisKKyAgICAgICAgICAgIEtFX1RSQUNFKCAxMCwgKCIlJSUlJSUgTUFMTE9DKCAlZCApXG4iLCAoaW50KSBzaXplICkgKTsKKworICAgICAgICAgICAgLyogcmljaHJ5YW4gKi8KKyAgICAgICAgICAgIGJkaCA9IEJESCgoKnRoci0+YWNxZmNuKSgoYnVmc2l6ZSkgc2l6ZSkpOworICAgICAgICAgICAgaWYgKGJkaCAhPSBOVUxMKSB7CisKKyAgICAgICAgICAgICAgICAvKiAgTWFyayB0aGUgYnVmZmVyIHNwZWNpYWwgYnkgc2V0dGluZyB0aGUgc2l6ZSBmaWVsZAorICAgICAgICAgICAgICAgICAgICBvZiBpdHMgaGVhZGVyIHRvIHplcm8uICAqLworICAgICAgICAgICAgICAgIGJkaC0+YmguYmIuYnNpemUgPSAwOworCisgICAgICAgICAgICAgICAgLyogTWFyayB0aGlzIGJ1ZmZlciBhcyBvd25lZCBieSB0aGlzIHRocmVhZC4gKi8KKyAgICAgICAgICAgICAgICBUQ1dfUFRSKGJkaC0+YmguYmIuYnRociwgdGgpOyAgLy8gZG9uJ3QgbWFyayBidWZmZXIgYXMgYWxsb2NhdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWNhdXNlIGRpcmVjdCBidWZmZXIgbmV2ZXIgZ29lcyB0byBmcmVlIGxpc3QKKyAgICAgICAgICAgICAgICBiZGgtPmJoLmJiLnByZXZmcmVlID0gMDsKKyAgICAgICAgICAgICAgICBiZGgtPnRzaXplID0gc2l6ZTsKKyNpZiBCdWZTdGF0cworICAgICAgICAgICAgICAgIHRoci0+dG90YWxsb2MgKz0gKHNpemVfdCkgc2l6ZTsKKyAgICAgICAgICAgICAgICB0aHItPm51bWdldCsrOyAgICAgICAgLyogSW5jcmVtZW50IG51bWJlciBvZiBiZ2V0KCkgY2FsbHMgKi8KKyAgICAgICAgICAgICAgICB0aHItPm51bWRnZXQrKzsgICAgICAgLyogRGlyZWN0IGJnZXQoKSBjYWxsIGNvdW50ICovCisjZW5kaWYKKyAgICAgICAgICAgICAgICBidWYgPSAgKHZvaWQgKikgKGJkaCArIDEpOworICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoICgoc2l6ZV90KWJ1ZikgJSBTaXplUXVhbnQgPT0gMCApOworICAgICAgICAgICAgICAgIHJldHVybiBidWY7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgLyogIFRyeSB0byBvYnRhaW4gYSBuZXcgZXhwYW5zaW9uIGJsb2NrICovCisKKyAgICAgICAgICAgIHZvaWQgKm5ld3Bvb2w7CisKKyAgICAgICAgICAgIEtFX1RSQUNFKCAxMCwgKCIlJSUlJSUgTUFMTE9DQiggJWQgKVxuIiwgKGludCkgdGhyLT5leHBfaW5jciApICk7CisKKyAgICAgICAgICAgIC8qIHJpY2hyeWFuICovCisgICAgICAgICAgICBuZXdwb29sID0gKCp0aHItPmFjcWZjbikoKGJ1ZnNpemUpIHRoci0+ZXhwX2luY3IpOworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggKChzaXplX3QpbmV3cG9vbCkgJSBTaXplUXVhbnQgPT0gMCApOworICAgICAgICAgICAgaWYgKG5ld3Bvb2wgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGJwb29sKCB0aCwgbmV3cG9vbCwgdGhyLT5leHBfaW5jcik7CisgICAgICAgICAgICAgICAgYnVmID0gIGJnZXQoIHRoLCByZXF1ZXN0ZWRfc2l6ZSk7ICAvKiBUaGlzIGNhbid0LCBJIHNheSwgY2FuJ3QgZ2V0IGludG8gYSBsb29wLiAqLworICAgICAgICAgICAgICAgIHJldHVybiBidWY7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiAgU3RpbGwgbm8gYnVmZmVyIGF2YWlsYWJsZSAqLworCisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8qICBCR0VUWiAgLS0gIEFsbG9jYXRlIGEgYnVmZmVyIGFuZCBjbGVhciBpdHMgY29udGVudHMgdG8gemVyby4gIFdlIGNsZWFyCisgICAgICAgICAgICAgICB0aGUgIGVudGlyZSAgY29udGVudHMgIG9mICB0aGUgYnVmZmVyIHRvIHplcm8sIG5vdCBqdXN0IHRoZQorICAgICAgICAgICAgICAgcmVnaW9uIHJlcXVlc3RlZCBieSB0aGUgY2FsbGVyLiAqLworCitzdGF0aWMgdm9pZCAqCitiZ2V0eiggIGttcF9pbmZvX3QgKnRoLCBidWZzaXplIHNpemUgKQoreworICAgIGNoYXIgKmJ1ZiA9IChjaGFyICopIGJnZXQoIHRoLCBzaXplKTsKKworICAgIGlmIChidWYgIT0gTlVMTCkgeworICAgICAgICBiaGVhZF90ICpiOworICAgICAgICBidWZzaXplIHJzaXplOworCisgICAgICAgIGIgPSBCSChidWYgLSBzaXplb2YoYmhlYWRfdCkpOworICAgICAgICByc2l6ZSA9IC0oYi0+YmIuYnNpemUpOworICAgICAgICBpZiAocnNpemUgPT0gMCkgeworICAgICAgICAgICAgYmRoZWFkX3QgKmJkOworCisgICAgICAgICAgICBiZCA9IEJESChidWYgLSBzaXplb2YoYmRoZWFkX3QpKTsKKyAgICAgICAgICAgIHJzaXplID0gYmQtPnRzaXplIC0gKGJ1ZnNpemUpIHNpemVvZihiZGhlYWRfdCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByc2l6ZSAtPSBzaXplb2YoYmhlYWRfdCk7CisgICAgICAgIH0KKworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHJzaXplID49IHNpemUpOworCisgICAgICAgICh2b2lkKSBtZW1zZXQoYnVmLCAwLCAoYnVmc2l6ZSkgcnNpemUpOworICAgIH0KKyAgICByZXR1cm4gKCh2b2lkICopIGJ1Zik7Cit9CisKKy8qICBCR0VUUiAgLS0gIFJlYWxsb2NhdGUgYSBidWZmZXIuICBUaGlzIGlzIGEgbWluaW1hbCBpbXBsZW1lbnRhdGlvbiwKKyAgICAgICAgICAgICAgIHNpbXBseSBpbiB0ZXJtcyBvZiBicmVsKCkgIGFuZCAgYmdldCgpLiAgIEl0ICBjb3VsZCAgYmUKKyAgICAgICAgICAgICAgIGVuaGFuY2VkIHRvIGFsbG93IHRoZSBidWZmZXIgdG8gZ3JvdyBpbnRvIGFkamFjZW50IGZyZWUKKyAgICAgICAgICAgICAgIGJsb2NrcyBhbmQgdG8gYXZvaWQgbW92aW5nIGRhdGEgdW5uZWNlc3NhcmlseS4gICovCisKK3N0YXRpYyB2b2lkICoKK2JnZXRyKCAga21wX2luZm9fdCAqdGgsIHZvaWQgKmJ1ZiwgYnVmc2l6ZSBzaXplKQoreworICAgIHZvaWQgKm5idWY7CisgICAgYnVmc2l6ZSBvc2l6ZTsgICAgICAgICAgICAgICAgICAgIC8qIE9sZCBzaXplIG9mIGJ1ZmZlciAqLworICAgIGJoZWFkX3QgKmI7CisKKyAgICBuYnVmID0gYmdldCggdGgsIHNpemUgKTsKKyAgICBpZiAoIG5idWYgPT0gTlVMTCApIHsgLyogQWNxdWlyZSBuZXcgYnVmZmVyICovCisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoIGJ1ZiA9PSBOVUxMICkgeworICAgICAgICByZXR1cm4gbmJ1ZjsKKyAgICB9CisgICAgYiA9IEJIKCgoY2hhciAqKSBidWYpIC0gc2l6ZW9mKGJoZWFkX3QpKTsKKyAgICBvc2l6ZSA9IC1iLT5iYi5ic2l6ZTsKKyAgICBpZiAob3NpemUgPT0gMCkgeworICAgICAgICAvKiAgQnVmZmVyIGFjcXVpcmVkIGRpcmVjdGx5IHRocm91Z2ggYWNxZmNuLiAqLworICAgICAgICBiZGhlYWRfdCAqYmQ7CisKKyAgICAgICAgYmQgPSBCREgoKChjaGFyICopIGJ1ZikgLSBzaXplb2YoYmRoZWFkX3QpKTsKKyAgICAgICAgb3NpemUgPSBiZC0+dHNpemUgLSAoYnVmc2l6ZSkgc2l6ZW9mKGJkaGVhZF90KTsKKyAgICB9IGVsc2UgeworICAgICAgICBvc2l6ZSAtPSBzaXplb2YoYmhlYWRfdCk7CisgICAgfTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQob3NpemUgPiAwKTsKKworICAgICh2b2lkKSBtZW1jcHkoKGNoYXIgKikgbmJ1ZiwgKGNoYXIgKikgYnVmLCAvKiBDb3B5IHRoZSBkYXRhICovCisgICAgICAgICAgICAgKHNpemVfdCkgKChzaXplIDwgb3NpemUpID8gc2l6ZSA6IG9zaXplKSk7CisgICAgYnJlbCggdGgsIGJ1ZiApOworCisgICAgcmV0dXJuIG5idWY7Cit9CisKKy8qICBCUkVMICAtLSAgUmVsZWFzZSBhIGJ1ZmZlci4gICovCisKK3N0YXRpYyB2b2lkCiticmVsKCAga21wX2luZm9fdCAqdGgsIHZvaWQgKmJ1ZiApCit7CisgICAgdGhyX2RhdGFfdCAqdGhyID0gZ2V0X3Rocl9kYXRhKCB0aCApOworICAgIGJmaGVhZF90ICpiLCAqYm47CisgICAga21wX2luZm9fdCAqYnRoOworCisgICAgS01QX0RFQlVHX0FTU0VSVChidWYgIT0gTlVMTCk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggKChzaXplX3QpYnVmKSAlIFNpemVRdWFudCA9PSAwICk7CisKKyAgICBiID0gQkZIKCgoY2hhciAqKSBidWYpIC0gc2l6ZW9mKGJoZWFkX3QpKTsKKworICAgIGlmIChiLT5iaC5iYi5ic2l6ZSA9PSAwKSB7ICAgICAgICAvKiBEaXJlY3RseS1hY3F1aXJlZCBidWZmZXI/ICovCisgICAgICAgIGJkaGVhZF90ICpiZGg7CisKKyAgICAgICAgYmRoID0gQkRIKCgoY2hhciAqKSBidWYpIC0gc2l6ZW9mKGJkaGVhZF90KSk7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoYi0+YmguYmIucHJldmZyZWUgPT0gMCk7CisjaWYgQnVmU3RhdHMKKyAgICAgICAgdGhyLT50b3RhbGxvYyAtPSAoc2l6ZV90KSBiZGgtPnRzaXplOworICAgICAgICB0aHItPm51bWRyZWwrKzsgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgZGlyZWN0IHJlbGVhc2VzICovCisgICAgICAgIHRoci0+bnVtcmVsKys7ICAgICAgICAgICAgICAgIC8qIEluY3JlbWVudCBudW1iZXIgb2YgYnJlbCgpIGNhbGxzICovCisjZW5kaWYgLyogQnVmU3RhdHMgKi8KKyNpZmRlZiBGcmVlV2lwZQorICAgICAgICAodm9pZCkgbWVtc2V0KChjaGFyICopIGJ1ZiwgMHg1NSwKKyAgICAgICAgICAgICAgICAgKHNpemVfdCkgKGJkaC0+dHNpemUgLSBzaXplb2YoYmRoZWFkX3QpKSk7CisjZW5kaWYgLyogRnJlZVdpcGUgKi8KKworICAgICAgICBLRV9UUkFDRSggMTAsICgiJSUlJSUlIEZSRUUoICVwIClcbiIsICh2b2lkICopIGJkaCApICk7CisKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGhyLT5yZWxmY24gIT0gMCApOworICAgICAgICAoKnRoci0+cmVsZmNuKSgodm9pZCAqKSBiZGgpOyAgICAgIC8qIFJlbGVhc2UgaXQgZGlyZWN0bHkuICovCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBidGggPSAoa21wX2luZm9fdCAqKSggKGttcF91aW50cHRyX3QpVENSX1BUUihiLT5iaC5iYi5idGhyKSAmIH4xICk7IC8vIGNsZWFyIHBvc3NpYmxlIG1hcmsgYmVmb3JlIGNvbXBhcmlzb24KKyAgICBpZiAoIGJ0aCAhPSB0aCApIHsKKyAgICAgICAgLyogQWRkIHRoaXMgYnVmZmVyIHRvIGJlIHJlbGVhc2VkIGJ5IHRoZSBvd25pbmcgdGhyZWFkIGxhdGVyICovCisgICAgICAgIF9fa21wX2JnZXRfZW5xdWV1ZSggYnRoLCBidWYKKyNpZmRlZiBVU0VfUVVFVUlOR19MT0NLX0ZPUl9CR0VUCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aCApCisjZW5kaWYKKyAgICAgICAgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIEJ1ZmZlciBzaXplIG11c3QgYmUgbmVnYXRpdmUsIGluZGljYXRpbmcgdGhhdCB0aGUgYnVmZmVyIGlzCisgICAgICAgYWxsb2NhdGVkLiAqLworCisgICAgaWYgKGItPmJoLmJiLmJzaXplID49IDApIHsKKyAgICAgICAgYm4gPSBOVUxMOworICAgIH0KKyAgICBLTVBfREVCVUdfQVNTRVJUKGItPmJoLmJiLmJzaXplIDwgMCk7CisKKyAgICAvKiAgQmFjayBwb2ludGVyIGluIG5leHQgYnVmZmVyIG11c3QgYmUgemVybywgaW5kaWNhdGluZyB0aGUKKyAgICAgICAgc2FtZSB0aGluZzogKi8KKworICAgIEtNUF9ERUJVR19BU1NFUlQoQkgoKGNoYXIgKikgYiAtIGItPmJoLmJiLmJzaXplKS0+YmIucHJldmZyZWUgPT0gMCk7CisKKyNpZiBCdWZTdGF0cworICAgIHRoci0+bnVtcmVsKys7ICAgICAgICAgICAgICAgICAgICAvKiBJbmNyZW1lbnQgbnVtYmVyIG9mIGJyZWwoKSBjYWxscyAqLworICAgIHRoci0+dG90YWxsb2MgKz0gKHNpemVfdCkgYi0+YmguYmIuYnNpemU7CisjZW5kaWYKKworICAgIC8qIElmIHRoZSBiYWNrIGxpbmsgaXMgbm9uemVybywgdGhlIHByZXZpb3VzIGJ1ZmZlciBpcyBmcmVlLiAgKi8KKworICAgIGlmIChiLT5iaC5iYi5wcmV2ZnJlZSAhPSAwKSB7CisgICAgICAgIC8qIFRoZSBwcmV2aW91cyBidWZmZXIgaXMgZnJlZS4gIENvbnNvbGlkYXRlIHRoaXMgYnVmZmVyICB3aXRoICBpdAorICAgICAgICAgICBieSAgYWRkaW5nICB0aGUgIGxlbmd0aCAgb2YgIHRoaXMgIGJ1ZmZlciAgdG8gdGhlIHByZXZpb3VzIGZyZWUKKyAgICAgICAgICAgYnVmZmVyLiAgTm90ZSB0aGF0IHdlIHN1YnRyYWN0IHRoZSBzaXplICBpbiAgdGhlICBidWZmZXIgIGJlaW5nCisgICAgICAgICAgIHJlbGVhc2VkLCAgc2luY2UgIGl0J3MgIG5lZ2F0aXZlIHRvIGluZGljYXRlIHRoYXQgdGhlIGJ1ZmZlciBpcworICAgICAgICAgICBhbGxvY2F0ZWQuICovCisKKyAgICAgICAgcmVnaXN0ZXIgYnVmc2l6ZSBzaXplID0gYi0+YmguYmIuYnNpemU7CisKKyAgICAgICAgLyogTWFrZSB0aGUgcHJldmlvdXMgYnVmZmVyIHRoZSBvbmUgd2UncmUgd29ya2luZyBvbi4gKi8KKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVChCSCgoY2hhciAqKSBiIC0gYi0+YmguYmIucHJldmZyZWUpLT5iYi5ic2l6ZSA9PSBiLT5iaC5iYi5wcmV2ZnJlZSk7CisgICAgICAgIGIgPSBCRkgoKChjaGFyICopIGIpIC0gYi0+YmguYmIucHJldmZyZWUpOworICAgICAgICBiLT5iaC5iYi5ic2l6ZSAtPSBzaXplOworCisgICAgICAgIC8qIHVubGluayB0aGUgYnVmZmVyIGZyb20gdGhlIG9sZCBmcmVlbGlzdCAqLworICAgICAgICBfX2ttcF9iZ2V0X3JlbW92ZV9mcm9tX2ZyZWVsaXN0KCBiICk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBUaGUgcHJldmlvdXMgYnVmZmVyIGlzbid0IGFsbG9jYXRlZC4gIE1hcmsgdGhpcyBidWZmZXIKKyAgICAgICAgICAgc2l6ZSBhcyBwb3NpdGl2ZSAoaS5lLiBmcmVlKSBhbmQgZmFsbCB0aHJvdWdodCB0byBwbGFjZQorICAgICAgICAgICB0aGUgYnVmZmVyIG9uIHRoZSBmcmVlIGxpc3QgYXMgYW4gaXNvbGF0ZWQgZnJlZSBibG9jay4gKi8KKworICAgICAgICBiLT5iaC5iYi5ic2l6ZSA9IC1iLT5iaC5iYi5ic2l6ZTsKKyAgICB9CisKKyAgICAvKiBpbnNlcnQgYnVmZmVyIGJhY2sgb250byBhIG5ldyBmcmVlbGlzdCAqLworICAgIF9fa21wX2JnZXRfaW5zZXJ0X2ludG9fZnJlZWxpc3QoIHRociwgYiApOworCisKKyAgICAvKiBOb3cgd2UgbG9vayBhdCB0aGUgbmV4dCBidWZmZXIgaW4gbWVtb3J5LCBsb2NhdGVkIGJ5IGFkdmFuY2luZyBmcm9tCisgICAgICAgdGhlICBzdGFydCAgb2YgIHRoaXMgIGJ1ZmZlciAgYnkgaXRzIHNpemUsIHRvIHNlZSBpZiB0aGF0IGJ1ZmZlciBpcworICAgICAgIGZyZWUuICBJZiBpdCBpcywgd2UgY29tYmluZSAgdGhpcyAgYnVmZmVyICB3aXRoICB0aGUgIG5leHQgIG9uZSAgaW4KKyAgICAgICBtZW1vcnksIGRlY2hhaW5pbmcgdGhlIHNlY29uZCBidWZmZXIgZnJvbSB0aGUgZnJlZSBsaXN0LiAqLworCisgICAgYm4gPSAgQkZIKCgoY2hhciAqKSBiKSArIGItPmJoLmJiLmJzaXplKTsKKyAgICBpZiAoYm4tPmJoLmJiLmJzaXplID4gMCkgeworCisgICAgICAgIC8qIFRoZSBidWZmZXIgaXMgZnJlZS4gIFJlbW92ZSBpdCBmcm9tIHRoZSBmcmVlIGxpc3QgYW5kIGFkZAorICAgICAgICAgICBpdHMgc2l6ZSB0byB0aGF0IG9mIG91ciBidWZmZXIuICovCisKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVChCSCgoY2hhciAqKSBibiArIGJuLT5iaC5iYi5ic2l6ZSktPmJiLnByZXZmcmVlID09IGJuLT5iaC5iYi5ic2l6ZSk7CisKKyAgICAgICAgX19rbXBfYmdldF9yZW1vdmVfZnJvbV9mcmVlbGlzdCggYm4gKTsKKworICAgICAgICBiLT5iaC5iYi5ic2l6ZSArPSBibi0+YmguYmIuYnNpemU7CisKKyAgICAgICAgLyogdW5saW5rIHRoZSBidWZmZXIgZnJvbSB0aGUgb2xkIGZyZWVsaXN0LCBhbmQgcmVpbnNlcnQgaXQgaW50byB0aGUgbmV3IGZyZWVsaXN0ICovCisKKyAgICAgICAgX19rbXBfYmdldF9yZW1vdmVfZnJvbV9mcmVlbGlzdCggYiApOworICAgICAgICBfX2ttcF9iZ2V0X2luc2VydF9pbnRvX2ZyZWVsaXN0KCB0aHIsIGIgKTsKKworICAgICAgICAvKiBGaW5hbGx5LCAgYWR2YW5jZSAgdG8gICB0aGUgIGJ1ZmZlciAgdGhhdCAgIGZvbGxvd3MgIHRoZSAgbmV3bHkKKyAgICAgICAgICAgY29uc29saWRhdGVkIGZyZWUgYmxvY2suICBXZSBtdXN0IHNldCBpdHMgIGJhY2twb2ludGVyICB0byAgdGhlCisgICAgICAgICAgIGhlYWQgIG9mICB0aGUgIGNvbnNvbGlkYXRlZCBmcmVlIGJsb2NrLiAgV2Uga25vdyB0aGUgbmV4dCBibG9jaworICAgICAgICAgICBtdXN0IGJlIGFuIGFsbG9jYXRlZCBibG9jayBiZWNhdXNlIHRoZSBwcm9jZXNzIG9mIHJlY29tYmluYXRpb24KKyAgICAgICAgICAgZ3VhcmFudGVlcyAgdGhhdCAgdHdvICBmcmVlICBibG9ja3Mgd2lsbCBuZXZlciBiZSBjb250aWd1b3VzIGluCisgICAgICAgICAgIG1lbW9yeS4gICovCisKKyAgICAgICAgYm4gPSBCRkgoKChjaGFyICopIGIpICsgYi0+YmguYmIuYnNpemUpOworICAgIH0KKyNpZmRlZiBGcmVlV2lwZQorICAgICh2b2lkKSBtZW1zZXQoKChjaGFyICopIGIpICsgc2l6ZW9mKGJmaGVhZF90KSwgMHg1NSwKKyAgICAgICAgICAgIChzaXplX3QpIChiLT5iaC5iYi5ic2l6ZSAtIHNpemVvZihiZmhlYWRfdCkpKTsKKyNlbmRpZgorICAgIEtNUF9ERUJVR19BU1NFUlQoYm4tPmJoLmJiLmJzaXplIDwgMCk7CisKKyAgICAvKiBUaGUgbmV4dCBidWZmZXIgaXMgYWxsb2NhdGVkLiAgU2V0IHRoZSBiYWNrcG9pbnRlciBpbiBpdCAgdG8gIHBvaW50CisgICAgICAgdG8gdGhpcyBidWZmZXI7IHRoZSBwcmV2aW91cyBmcmVlIGJ1ZmZlciBpbiBtZW1vcnkuICovCisKKyAgICBibi0+YmguYmIucHJldmZyZWUgPSBiLT5iaC5iYi5ic2l6ZTsKKworICAgIC8qICBJZiAgYSAgYmxvY2stcmVsZWFzZSBmdW5jdGlvbiBpcyBkZWZpbmVkLCBhbmQgdGhpcyBmcmVlIGJ1ZmZlcgorICAgICAgICBjb25zdGl0dXRlcyB0aGUgZW50aXJlIGJsb2NrLCByZWxlYXNlIGl0LiAgTm90ZSB0aGF0ICBwb29sX2xlbgorICAgICAgICBpcyAgZGVmaW5lZCAgaW4gIHN1Y2ggYSB3YXkgdGhhdCB0aGUgdGVzdCB3aWxsIGZhaWwgdW5sZXNzIGFsbAorICAgICAgICBwb29sIGJsb2NrcyBhcmUgdGhlIHNhbWUgc2l6ZS4gICovCisKKyAgICBpZiAodGhyLT5yZWxmY24gIT0gMCAmJgorICAgICAgICBiLT5iaC5iYi5ic2l6ZSA9PSAoYnVmc2l6ZSkodGhyLT5wb29sX2xlbiAtIHNpemVvZihiaGVhZF90KSkpCisgICAgeworI2lmIEJ1ZlN0YXRzCisgICAgICAgIGlmICh0aHItPm51bXBibGsgIT0gMSkgeyAgICAgICAgLyogRG8gbm90IHJlbGVhc2UgdGhlIGxhc3QgYnVmZmVyIHVudGlsIGZpbmFsaXphdGlvbiB0aW1lICovCisjZW5kaWYKKworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChiLT5iaC5iYi5wcmV2ZnJlZSA9PSAwKTsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoQkgoKGNoYXIgKikgYiArIGItPmJoLmJiLmJzaXplKS0+YmIuYnNpemUgPT0gRVNlbnQpOworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChCSCgoY2hhciAqKSBiICsgYi0+YmguYmIuYnNpemUpLT5iYi5wcmV2ZnJlZSA9PSBiLT5iaC5iYi5ic2l6ZSk7CisKKyAgICAgICAgICAgIC8qICBVbmxpbmsgdGhlIGJ1ZmZlciBmcm9tIHRoZSBmcmVlIGxpc3QgICovCisgICAgICAgICAgICBfX2ttcF9iZ2V0X3JlbW92ZV9mcm9tX2ZyZWVsaXN0KCBiICk7CisKKyAgICAgICAgICAgIEtFX1RSQUNFKCAxMCwgKCIlJSUlJSUgRlJFRSggJXAgKVxuIiwgKHZvaWQgKikgYiApICk7CisKKyAgICAgICAgICAgICgqdGhyLT5yZWxmY24pKGIpOworI2lmIEJ1ZlN0YXRzCisgICAgICAgICAgICB0aHItPm51bXByZWwrKzsgICAgICAgICAgICAgICAvKiBOciBvZiBleHBhbnNpb24gYmxvY2sgcmVsZWFzZXMgKi8KKyAgICAgICAgICAgIHRoci0+bnVtcGJsay0tOyAgICAgICAgICAgICAgIC8qIFRvdGFsIG51bWJlciBvZiBibG9ja3MgKi8KKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQodGhyLT5udW1wYmxrID09IHRoci0+bnVtcGdldCAtIHRoci0+bnVtcHJlbCk7CisKKyAgICAgICAgICAgIC8qIGF2b2lkIGxlYXZpbmcgc3RhbGUgbGFzdF9wb29sIHBvaW50ZXIgYXJvdW5kIGlmIGl0IGlzIGJlaW5nIGRlYWxsb2NlZCAqLworICAgICAgICAgICAgaWYgKHRoci0+bGFzdF9wb29sID09IGIpIHRoci0+bGFzdF9wb29sID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHRoci0+bGFzdF9wb29sID0gYjsKKyAgICAgICAgfQorI2VuZGlmIC8qIEJ1ZlN0YXRzICovCisgICAgfQorfQorCisvKiAgQkVDVEwgIC0tICBFc3RhYmxpc2ggYXV0b21hdGljIHBvb2wgZXhwYW5zaW9uIGNvbnRyb2wgICovCisKK3N0YXRpYyB2b2lkCitiZWN0bCggIGttcF9pbmZvX3QgKnRoLCBiZ2V0X2NvbXBhY3RfdCBjb21wYWN0LCBiZ2V0X2FjcXVpcmVfdCBhY3F1aXJlLCBiZ2V0X3JlbGVhc2VfdCByZWxlYXNlLCBidWZzaXplIHBvb2xfaW5jcikKK3sKKyAgICB0aHJfZGF0YV90ICp0aHIgPSBnZXRfdGhyX2RhdGEoIHRoICk7CisKKyAgICB0aHItPmNvbXBmY24gPSBjb21wYWN0OworICAgIHRoci0+YWNxZmNuID0gYWNxdWlyZTsKKyAgICB0aHItPnJlbGZjbiA9IHJlbGVhc2U7CisgICAgdGhyLT5leHBfaW5jciA9IHBvb2xfaW5jcjsKK30KKworLyogIEJQT09MICAtLSAgQWRkIGEgcmVnaW9uIG9mIG1lbW9yeSB0byB0aGUgYnVmZmVyIHBvb2wuICAqLworCitzdGF0aWMgdm9pZAorYnBvb2woICBrbXBfaW5mb190ICp0aCwgdm9pZCAqYnVmLCBidWZzaXplIGxlbikKK3sKKy8qICAgIGludCBiaW4gPSAwOyAqLworICAgIHRocl9kYXRhX3QgKnRociA9IGdldF90aHJfZGF0YSggdGggKTsKKyAgICBiZmhlYWRfdCAqYiA9IEJGSChidWYpOworICAgIGJoZWFkX3QgKmJuOworCisgICAgX19rbXBfYmdldF9kZXF1ZXVlKCB0aCApOyAgICAgICAgIC8qIFJlbGVhc2UgYW55IHF1ZXVlZCBidWZmZXJzICovCisKKyNpZmRlZiBTaXplUXVhbnQKKyAgICBsZW4gJj0gfihTaXplUXVhbnQgLSAxKTsKKyNlbmRpZgorICAgIGlmICh0aHItPnBvb2xfbGVuID09IDApIHsKKyAgICAgICAgdGhyLT5wb29sX2xlbiA9IGxlbjsKKyAgICB9IGVsc2UgaWYgKGxlbiAhPSB0aHItPnBvb2xfbGVuKSB7CisgICAgICAgIHRoci0+cG9vbF9sZW4gPSAtMTsKKyAgICB9CisjaWYgQnVmU3RhdHMKKyAgICB0aHItPm51bXBnZXQrKzsgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGJsb2NrIGFjcXVpc2l0aW9ucyAqLworICAgIHRoci0+bnVtcGJsaysrOyAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgYmxvY2tzIHRvdGFsICovCisgICAgS01QX0RFQlVHX0FTU0VSVCh0aHItPm51bXBibGsgPT0gdGhyLT5udW1wZ2V0IC0gdGhyLT5udW1wcmVsKTsKKyNlbmRpZiAvKiBCdWZTdGF0cyAqLworCisgICAgLyogU2luY2UgdGhlIGJsb2NrIGlzIGluaXRpYWxseSBvY2N1cGllZCBieSBhIHNpbmdsZSBmcmVlICBidWZmZXIsCisgICAgICAgaXQgIGhhZCAgYmV0dGVyICBub3QgIGJlICAobXVjaCkgbGFyZ2VyIHRoYW4gdGhlIGxhcmdlc3QgYnVmZmVyCisgICAgICAgd2hvc2Ugc2l6ZSB3ZSBjYW4gc3RvcmUgaW4gYmhlYWQuYmIuYnNpemUuICovCisKKyAgICBLTVBfREVCVUdfQVNTRVJUKGxlbiAtIHNpemVvZihiaGVhZF90KSA8PSAtKChidWZzaXplKSBFU2VudCArIDEpKTsKKworICAgIC8qIENsZWFyICB0aGUgIGJhY2twb2ludGVyIGF0ICB0aGUgc3RhcnQgb2YgdGhlIGJsb2NrIHRvIGluZGljYXRlIHRoYXQKKyAgICAgICB0aGVyZSAgaXMgIG5vICBmcmVlICBibG9jayAgcHJpb3IgIHRvICB0aGlzICAgb25lLiAgICBUaGF0ICAgYmxvY2tzCisgICAgICAgcmVjb21iaW5hdGlvbiB3aGVuIHRoZSBmaXJzdCBibG9jayBpbiBtZW1vcnkgaXMgcmVsZWFzZWQuICovCisKKyAgICBiLT5iaC5iYi5wcmV2ZnJlZSA9IDA7CisKKyAgICAvKiBDcmVhdGUgYSBkdW1teSBhbGxvY2F0ZWQgYnVmZmVyIGF0IHRoZSBlbmQgb2YgdGhlIHBvb2wuICBUaGlzIGR1bW15CisgICAgICAgYnVmZmVyIGlzIHNlZW4gd2hlbiBhIGJ1ZmZlciBhdCB0aGUgZW5kIG9mIHRoZSBwb29sIGlzIHJlbGVhc2VkIGFuZAorICAgICAgIGJsb2NrcyAgcmVjb21iaW5hdGlvbiAgb2YgIHRoZSBsYXN0IGJ1ZmZlciB3aXRoIHRoZSBkdW1teSBidWZmZXIgYXQKKyAgICAgICB0aGUgZW5kLiAgVGhlIGxlbmd0aCBpbiB0aGUgZHVtbXkgYnVmZmVyICBpcyAgc2V0ICB0byAgdGhlICBsYXJnZXN0CisgICAgICAgbmVnYXRpdmUgIG51bWJlciAgdG8gIGRlbm90ZSAgdGhlICBlbmQgIG9mICB0aGUgcG9vbCBmb3IgZGlhZ25vc3RpYworICAgICAgIHJvdXRpbmVzICh0aGlzIHNwZWNpZmljIHZhbHVlIGlzICBub3QgIGNvdW50ZWQgIG9uICBieSAgdGhlICBhY3R1YWwKKyAgICAgICBhbGxvY2F0aW9uIGFuZCByZWxlYXNlIGZ1bmN0aW9ucykuICovCisKKyAgICBsZW4gLT0gc2l6ZW9mKGJoZWFkX3QpOworICAgIGItPmJoLmJiLmJzaXplID0gKGJ1ZnNpemUpIGxlbjsKKyAgICAvKiBTZXQgdGhlIG93bmVyIG9mIHRoaXMgYnVmZmVyICovCisgICAgVENXX1BUUiggYi0+YmguYmIuYnRociwgKGttcF9pbmZvX3QqKSgoa21wX3VpbnRwdHJfdCl0aCB8IDEpICk7IC8vIG1hcmsgdGhlIGJ1ZmZlciBhcyBhbGxvY2F0ZWQgYWRkcmVzcworCisgICAgLyogQ2hhaW4gdGhlIG5ldyBibG9jayB0byB0aGUgZnJlZSBsaXN0LiAqLworICAgIF9fa21wX2JnZXRfaW5zZXJ0X2ludG9fZnJlZWxpc3QoIHRociwgYiApOworCisjaWZkZWYgRnJlZVdpcGUKKyAgICAodm9pZCkgbWVtc2V0KCgoY2hhciAqKSBiKSArIHNpemVvZihiZmhlYWRfdCksIDB4NTUsCisgICAgICAgICAgICAgKHNpemVfdCkgKGxlbiAtIHNpemVvZihiZmhlYWRfdCkpKTsKKyNlbmRpZgorICAgIGJuID0gQkgoKChjaGFyICopIGIpICsgbGVuKTsKKyAgICBibi0+YmIucHJldmZyZWUgPSAoYnVmc2l6ZSkgbGVuOworICAgIC8qIERlZmluaXRpb24gb2YgRVNlbnQgYXNzdW1lcyB0d28ncyBjb21wbGVtZW50ISAqLworICAgIEtNUF9ERUJVR19BU1NFUlQoICh+MCkgPT0gLTEgJiYgKGJuICE9IDApICk7CisKKyAgICBibi0+YmIuYnNpemUgPSBFU2VudDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qICBCRlJFRUQgIC0tICBEdW1wIHRoZSBmcmVlIGxpc3RzIGZvciB0aGlzIHRocmVhZC4gKi8KKworc3RhdGljIHZvaWQKK2JmcmVlZCggIGttcF9pbmZvX3QgKnRoICkKK3sKKyAgICBpbnQgYmluID0gMCwgY291bnQgPSAwOworICAgIGludCBndGlkID0gX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGggKTsKKyAgICB0aHJfZGF0YV90ICp0aHIgPSBnZXRfdGhyX2RhdGEoIHRoICk7CisKKyNpZiBCdWZTdGF0cworICAgIF9fa21wX3ByaW50Zl9ub19sb2NrKCJfX2ttcF9wcmludHBvb2w6IFQjJWQgdG90YWw9JSIgS01QX1VJTlQ2NF9TUEVDICIgZ2V0PSUiIEtNUF9JTlQ2NF9TUEVDICIgcmVsPSUiIFwKKyAgICAgICAgICAgS01QX0lOVDY0X1NQRUMgIiBwYmxrPSUiIEtNUF9JTlQ2NF9TUEVDICIgcGdldD0lIiBLTVBfSU5UNjRfU1BFQyAiIHByZWw9JSIgS01QX0lOVDY0X1NQRUMgXAorICAgICAgICAgICAiIGRnZXQ9JSIgS01QX0lOVDY0X1NQRUMgIiBkcmVsPSUiIEtNUF9JTlQ2NF9TUEVDICJcbiIsCisgICAgICAgICAgIGd0aWQsIChrbXBfdWludDY0KSB0aHItPnRvdGFsbG9jLAorICAgICAgICAgICAoa21wX2ludDY0KSB0aHItPm51bWdldCwgIChrbXBfaW50NjQpIHRoci0+bnVtcmVsLAorICAgICAgICAgICAoa21wX2ludDY0KSB0aHItPm51bXBibGssCisgICAgICAgICAgIChrbXBfaW50NjQpIHRoci0+bnVtcGdldCwgKGttcF9pbnQ2NCkgdGhyLT5udW1wcmVsLAorICAgICAgICAgICAoa21wX2ludDY0KSB0aHItPm51bWRnZXQsIChrbXBfaW50NjQpIHRoci0+bnVtZHJlbCApOworI2VuZGlmCisKKyAgICBmb3IgKGJpbiA9IDA7IGJpbiA8IE1BWF9CR0VUX0JJTlM7ICsrYmluKSB7CisgICAgICAgIGJmaGVhZF90ICpiOworCisgICAgICAgIGZvciAoYiA9IHRoci0+ZnJlZWxpc3RbIGJpbiBdLnFsLmZsaW5rOyBiICE9ICZ0aHItPmZyZWVsaXN0WyBiaW4gXTsgYiA9IGItPnFsLmZsaW5rKSB7CisgICAgICAgICAgICBidWZzaXplIGJzID0gYi0+YmguYmIuYnNpemU7CisKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGItPnFsLmJsaW5rLT5xbC5mbGluayA9PSBiICk7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBiLT5xbC5mbGluay0+cWwuYmxpbmsgPT0gYiApOworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggYnMgPiAwICk7CisKKyAgICAgICAgICAgIGNvdW50ICs9IDE7CisKKyAgICAgICAgICAgIF9fa21wX3ByaW50Zl9ub19sb2NrKCJfX2ttcF9wcmludHBvb2w6IFQjJWQgRnJlZSBibG9jazogMHglcCBzaXplICU2bGQgYnl0ZXMuXG4iLCBndGlkLCBiLCAobG9uZykgYnMgKTsKKyNpZmRlZiBGcmVlV2lwZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNoYXIgKmxlcnIgPSAoKGNoYXIgKikgYikgKyBzaXplb2YoYmZoZWFkX3QpOworICAgICAgICAgICAgICAgIGlmICgoYnMgPiBzaXplb2YoYmZoZWFkX3QpKSAmJiAoKCpsZXJyICE9IDB4NTUpIHx8IChtZW1jbXAobGVyciwgbGVyciArIDEsIChzaXplX3QpIChicyAtIChzaXplb2YoYmZoZWFkX3QpICsgMSkpKSAhPSAwKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRmX25vX2xvY2soICJfX2ttcF9wcmludHBvb2w6IFQjJWQgICAgIChDb250ZW50cyBvZiBhYm92ZSBmcmVlIGJsb2NrIGhhdmUgYmVlbiBvdmVyc3RvcmVkLilcbiIsIGd0aWQgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChjb3VudCA9PSAwKQorICAgICAgICBfX2ttcF9wcmludGZfbm9fbG9jaygiX19rbXBfcHJpbnRwb29sOiBUIyVkIE5vIGZyZWUgYmxvY2tzXG4iLCBndGlkICk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZkZWYgS01QX0RFQlVHCisKKyNpZiBCdWZTdGF0cworCisvKiAgQlNUQVRTICAtLSAgUmV0dXJuIGJ1ZmZlciBhbGxvY2F0aW9uIGZyZWUgc3BhY2Ugc3RhdGlzdGljcy4gICovCisKK3N0YXRpYyB2b2lkCitic3RhdHMoICBrbXBfaW5mb190ICp0aCwgYnVmc2l6ZSAqY3VyYWxsb2MsICBidWZzaXplICp0b3RmcmVlLCAgYnVmc2l6ZSAqbWF4ZnJlZSwgbG9uZyAqbmdldCwgbG9uZyAqbnJlbCkKK3sKKyAgICBpbnQgYmluID0gMDsKKyAgICB0aHJfZGF0YV90ICp0aHIgPSBnZXRfdGhyX2RhdGEoIHRoICk7CisKKyAgICAqbmdldCA9IHRoci0+bnVtZ2V0OworICAgICpucmVsID0gdGhyLT5udW1yZWw7CisgICAgKmN1cmFsbG9jID0gKGJ1ZnNpemUpIHRoci0+dG90YWxsb2M7CisgICAgKnRvdGZyZWUgPSAwOworICAgICptYXhmcmVlID0gLTE7CisKKyAgICBmb3IgKGJpbiA9IDA7IGJpbiA8IE1BWF9CR0VUX0JJTlM7ICsrYmluKSB7CisgICAgICAgIGJmaGVhZF90ICpiID0gdGhyLT5mcmVlbGlzdFsgYmluIF0ucWwuZmxpbms7CisKKyAgICAgICAgd2hpbGUgKGIgIT0gJnRoci0+ZnJlZWxpc3RbIGJpbiBdKSB7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGItPmJoLmJiLmJzaXplID4gMCk7CisgICAgICAgICAgICAqdG90ZnJlZSArPSBiLT5iaC5iYi5ic2l6ZTsKKyAgICAgICAgICAgIGlmIChiLT5iaC5iYi5ic2l6ZSA+ICptYXhmcmVlKSB7CisgICAgICAgICAgICAgICAgKm1heGZyZWUgPSBiLT5iaC5iYi5ic2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGIgPSBiLT5xbC5mbGluazsgICAgICAgICAgICAgIC8qIExpbmsgdG8gbmV4dCBidWZmZXIgKi8KKyAgICAgICAgfQorICAgIH0KK30KKworLyogIEJTVEFUU0UgIC0tICBSZXR1cm4gZXh0ZW5kZWQgc3RhdGlzdGljcyAgKi8KKworc3RhdGljIHZvaWQKK2JzdGF0c2UoICBrbXBfaW5mb190ICp0aCwgYnVmc2l6ZSAqcG9vbF9pbmNyLCBsb25nICpucG9vbCwgbG9uZyAqbnBnZXQsIGxvbmcgKm5wcmVsLCBsb25nICpuZGdldCwgbG9uZyAqbmRyZWwpCit7CisgICAgdGhyX2RhdGFfdCAqdGhyID0gZ2V0X3Rocl9kYXRhKCB0aCApOworCisgICAgKnBvb2xfaW5jciA9ICh0aHItPnBvb2xfbGVuIDwgMCkgPyAtdGhyLT5leHBfaW5jciA6IHRoci0+ZXhwX2luY3I7CisgICAgKm5wb29sID0gdGhyLT5udW1wYmxrOworICAgICpucGdldCA9IHRoci0+bnVtcGdldDsKKyAgICAqbnByZWwgPSB0aHItPm51bXByZWw7CisgICAgKm5kZ2V0ID0gdGhyLT5udW1kZ2V0OworICAgICpuZHJlbCA9IHRoci0+bnVtZHJlbDsKK30KKworI2VuZGlmIC8qIEJ1ZlN0YXRzICovCisKKy8qICBCVUZEVU1QICAtLSAgRHVtcCB0aGUgZGF0YSBpbiBhIGJ1ZmZlci4gIFRoaXMgaXMgY2FsbGVkIHdpdGggdGhlICB1c2VyCisgICAgICAgICAgICAgICAgIGRhdGEgcG9pbnRlciwgYW5kIGJhY2tzIHVwIHRvIHRoZSBidWZmZXIgaGVhZGVyLiAgSXQgd2lsbAorICAgICAgICAgICAgICAgICBkdW1wIGVpdGhlciBhIGZyZWUgYmxvY2sgb3IgYW4gYWxsb2NhdGVkIG9uZS4gICovCisKK3N0YXRpYyB2b2lkCitidWZkdW1wKCAga21wX2luZm9fdCAqdGgsIHZvaWQgKmJ1ZiApCit7CisgICAgYmZoZWFkX3QgKmI7CisgICAgdW5zaWduZWQgY2hhciAqYmR1bXA7CisgICAgYnVmc2l6ZSBiZGxlbjsKKworICAgIGIgPSBCRkgoKChjaGFyICopIGJ1ZikgLSBzaXplb2YoYmhlYWRfdCkpOworICAgIEtNUF9ERUJVR19BU1NFUlQoYi0+YmguYmIuYnNpemUgIT0gMCk7CisgICAgaWYgKGItPmJoLmJiLmJzaXplIDwgMCkgeworICAgICAgICBiZHVtcCA9ICh1bnNpZ25lZCBjaGFyICopIGJ1ZjsKKyAgICAgICAgYmRsZW4gPSAoLWItPmJoLmJiLmJzaXplKSAtIChidWZzaXplKSBzaXplb2YoYmhlYWRfdCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYmR1bXAgPSAodW5zaWduZWQgY2hhciAqKSAoKChjaGFyICopIGIpICsgc2l6ZW9mKGJmaGVhZF90KSk7CisgICAgICAgIGJkbGVuID0gYi0+YmguYmIuYnNpemUgLSAoYnVmc2l6ZSkgc2l6ZW9mKGJmaGVhZF90KTsKKyAgICB9CisKKyAgICB3aGlsZSAoYmRsZW4gPiAwKSB7CisgICAgICAgIGludCBpLCBkdXBlcyA9IDA7CisgICAgICAgIGJ1ZnNpemUgbCA9IGJkbGVuOworICAgICAgICBjaGFyIGJoZXhbNTBdLCBiYXNjaWlbMjBdOworCisgICAgICAgIGlmIChsID4gMTYpIHsKKyAgICAgICAgICAgIGwgPSAxNjsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsOyBpKyspIHsKKyAgICAgICAgICAgICh2b2lkKSBzcHJpbnRmKGJoZXggKyBpICogMywgIiUwMlggIiwgYmR1bXBbaV0pOworICAgICAgICAgICAgaWYgKGJkdW1wW2ldID4gMHgyMCAmJiBiZHVtcFtpXSA8IDB4N0YpCisgICAgICAgICAgICAgICAgYmFzY2lpWyBpIF0gPSBiZHVtcFsgaSBdOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGJhc2NpaVsgaSBdID0gJyAnOworICAgICAgICB9CisgICAgICAgIGJhc2NpaVtpXSA9IDA7CisgICAgICAgICh2b2lkKSBfX2ttcF9wcmludGZfbm9fbG9jaygiJS00OHMgICAlc1xuIiwgYmhleCwgYmFzY2lpKTsKKyAgICAgICAgYmR1bXAgKz0gbDsKKyAgICAgICAgYmRsZW4gLT0gbDsKKyAgICAgICAgd2hpbGUgKChiZGxlbiA+IDE2KSAmJiAobWVtY21wKChjaGFyICopIChiZHVtcCAtIDE2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopIGJkdW1wLCAxNikgPT0gMCkpIHsKKyAgICAgICAgICAgIGR1cGVzKys7CisgICAgICAgICAgICBiZHVtcCArPSAxNjsKKyAgICAgICAgICAgIGJkbGVuIC09IDE2OworICAgICAgICB9CisgICAgICAgIGlmIChkdXBlcyA+IDEpIHsKKyAgICAgICAgICAgICh2b2lkKSBfX2ttcF9wcmludGZfbm9fbG9jaygKKyAgICAgICAgICAgICAgICAiICAgICAoJWQgbGluZXMgWyVkIGJ5dGVzXSBpZGVudGljYWwgdG8gYWJvdmUgbGluZSBza2lwcGVkKVxuIiwKKyAgICAgICAgICAgICAgICBkdXBlcywgZHVwZXMgKiAxNik7CisgICAgICAgIH0gZWxzZSBpZiAoZHVwZXMgPT0gMSkgeworICAgICAgICAgICAgYmR1bXAgLT0gMTY7CisgICAgICAgICAgICBiZGxlbiArPSAxNjsKKyAgICAgICAgfQorICAgIH0KK30KKworLyogIEJQT09MRCAgLS0gIER1bXAgYSBidWZmZXIgcG9vbC4gIFRoZSBidWZmZXIgaGVhZGVycyBhcmUgYWx3YXlzIGxpc3RlZC4KKyAgICAgICAgICAgICAgICBJZiBEVU1QQUxMT0MgaXMgbm9uemVybywgdGhlIGNvbnRlbnRzIG9mIGFsbG9jYXRlZCBidWZmZXJzCisgICAgICAgICAgICAgICAgYXJlICBkdW1wZWQuICAgSWYgIERVTVBGUkVFICBpcyAgbm9uemVybywgIGZyZWUgYmxvY2tzIGFyZQorICAgICAgICAgICAgICAgIGR1bXBlZCBhcyB3ZWxsLiAgSWYgRnJlZVdpcGUgIGNoZWNraW5nICBpcyAgZW5hYmxlZCwgIGZyZWUKKyAgICAgICAgICAgICAgICBibG9ja3MgIHdoaWNoICBoYXZlICBiZWVuIGNsb2JiZXJlZCB3aWxsIGFsd2F5cyBiZSBkdW1wZWQuICovCisKK3N0YXRpYyB2b2lkCiticG9vbGQoICBrbXBfaW5mb190ICp0aCwgdm9pZCAqYnVmLCBpbnQgZHVtcGFsbG9jLCBpbnQgZHVtcGZyZWUpCit7CisgICAgYmZoZWFkX3QgKmIgPSBCRkgoIChjaGFyKilidWYgLSBzaXplb2YoYmhlYWRfdCkpOworCisgICAgd2hpbGUgKGItPmJoLmJiLmJzaXplICE9IEVTZW50KSB7CisgICAgICAgIGJ1ZnNpemUgYnMgPSBiLT5iaC5iYi5ic2l6ZTsKKworICAgICAgICBpZiAoYnMgPCAwKSB7CisgICAgICAgICAgICBicyA9IC1iczsKKyAgICAgICAgICAgICh2b2lkKSBfX2ttcF9wcmludGZfbm9fbG9jaygiQWxsb2NhdGVkIGJ1ZmZlcjogc2l6ZSAlNmxkIGJ5dGVzLlxuIiwgKGxvbmcpIGJzKTsKKyAgICAgICAgICAgIGlmIChkdW1wYWxsb2MpIHsKKyAgICAgICAgICAgICAgICBidWZkdW1wKCB0aCwgKHZvaWQgKikgKCgoY2hhciAqKSBiKSArIHNpemVvZihiaGVhZF90KSkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29uc3QgY2hhciAqbGVyciA9ICIiOworCisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGJzID4gMCk7CisgICAgICAgICAgICBpZiAoKGItPnFsLmJsaW5rLT5xbC5mbGluayAhPSBiKSB8fCAoYi0+cWwuZmxpbmstPnFsLmJsaW5rICE9IGIpKSB7CisgICAgICAgICAgICAgICAgbGVyciA9ICIgIChCYWQgZnJlZSBsaXN0IGxpbmtzKSI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAodm9pZCkgX19rbXBfcHJpbnRmX25vX2xvY2soIkZyZWUgYmxvY2s6ICAgICAgIHNpemUgJTZsZCBieXRlcy4lc1xuIiwKKyAgICAgICAgICAgICAgICAobG9uZykgYnMsIGxlcnIpOworI2lmZGVmIEZyZWVXaXBlCisgICAgICAgICAgICBsZXJyID0gKChjaGFyICopIGIpICsgc2l6ZW9mKGJmaGVhZF90KTsKKyAgICAgICAgICAgIGlmICgoYnMgPiBzaXplb2YoYmZoZWFkX3QpKSAmJiAoKCpsZXJyICE9IDB4NTUpIHx8CisgICAgICAgICAgICAgICAgKG1lbWNtcChsZXJyLCBsZXJyICsgMSwKKyAgICAgICAgICAgICAgICAgIChzaXplX3QpIChicyAtIChzaXplb2YoYmZoZWFkX3QpICsgMSkpKSAhPSAwKSkpIHsKKyAgICAgICAgICAgICAgICAodm9pZCkgX19rbXBfcHJpbnRmX25vX2xvY2soCisgICAgICAgICAgICAgICAgICAgICIoQ29udGVudHMgb2YgYWJvdmUgZnJlZSBibG9jayBoYXZlIGJlZW4gb3ZlcnN0b3JlZC4pXG4iKTsKKyAgICAgICAgICAgICAgICBidWZkdW1wKCB0aCwgKHZvaWQgKikgKCgoY2hhciAqKSBiKSArIHNpemVvZihiaGVhZF90KSkpOworICAgICAgICAgICAgfSBlbHNlCisjZW5kaWYKKyAgICAgICAgICAgIGlmIChkdW1wZnJlZSkgeworICAgICAgICAgICAgICAgIGJ1ZmR1bXAoIHRoLCAodm9pZCAqKSAoKChjaGFyICopIGIpICsgc2l6ZW9mKGJoZWFkX3QpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYiA9IEJGSCgoKGNoYXIgKikgYikgKyBicyk7CisgICAgfQorfQorCisvKiAgQlBPT0xWICAtLSAgVmFsaWRhdGUgYSBidWZmZXIgcG9vbC4gKi8KKworc3RhdGljIGludAorYnBvb2x2KCAga21wX2luZm9fdCAqdGgsIHZvaWQgKmJ1ZiApCit7CisgICAgYmZoZWFkX3QgKmIgPSBCRkgoYnVmKTsKKworICAgIHdoaWxlIChiLT5iaC5iYi5ic2l6ZSAhPSBFU2VudCkgeworICAgICAgICBidWZzaXplIGJzID0gYi0+YmguYmIuYnNpemU7CisKKyAgICAgICAgaWYgKGJzIDwgMCkgeworICAgICAgICAgICAgYnMgPSAtYnM7CisgICAgICAgIH0gZWxzZSB7CisjaWZkZWYgRnJlZVdpcGUKKyAgICAgICAgICAgIGNoYXIgKmxlcnIgPSAiIjsKKyNlbmRpZgorCisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGJzID4gMCk7CisgICAgICAgICAgICBpZiAoYnMgPD0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChiLT5xbC5ibGluay0+cWwuZmxpbmsgIT0gYikgfHwgKGItPnFsLmZsaW5rLT5xbC5ibGluayAhPSBiKSkgeworICAgICAgICAgICAgICAgICh2b2lkKSBfX2ttcF9wcmludGZfbm9fbG9jaygiRnJlZSBibG9jazogc2l6ZSAlNmxkIGJ5dGVzLiAgKEJhZCBmcmVlIGxpc3QgbGlua3MpXG4iLAorICAgICAgICAgICAgICAgICAgICAgKGxvbmcpIGJzKTsKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKDApOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorI2lmZGVmIEZyZWVXaXBlCisgICAgICAgICAgICBsZXJyID0gKChjaGFyICopIGIpICsgc2l6ZW9mKGJmaGVhZF90KTsKKyAgICAgICAgICAgIGlmICgoYnMgPiBzaXplb2YoYmZoZWFkX3QpKSAmJiAoKCpsZXJyICE9IDB4NTUpIHx8CisgICAgICAgICAgICAgICAgKG1lbWNtcChsZXJyLCBsZXJyICsgMSwKKyAgICAgICAgICAgICAgICAgIChzaXplX3QpIChicyAtIChzaXplb2YoYmZoZWFkX3QpICsgMSkpKSAhPSAwKSkpIHsKKyAgICAgICAgICAgICAgICAodm9pZCkgX19rbXBfcHJpbnRmX25vX2xvY2soCisgICAgICAgICAgICAgICAgICAgICIoQ29udGVudHMgb2YgYWJvdmUgZnJlZSBibG9jayBoYXZlIGJlZW4gb3ZlcnN0b3JlZC4pXG4iKTsKKyAgICAgICAgICAgICAgICBidWZkdW1wKCB0aCwgKHZvaWQgKikgKCgoY2hhciAqKSBiKSArIHNpemVvZihiaGVhZF90KSkpOworICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoMCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisjZW5kaWYgLyogRnJlZVdpcGUgKi8KKyAgICAgICAgfQorICAgICAgICBiID0gQkZIKCgoY2hhciAqKSBiKSArIGJzKTsKKyAgICB9CisgICAgcmV0dXJuIDE7Cit9CisKKyNlbmRpZiAvKiBLTVBfREVCVUcgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQKK19fa21wX2luaXRpYWxpemVfYmdldCgga21wX2luZm9fdCAqdGggKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIFNpemVRdWFudCA+PSBzaXplb2YoIHZvaWQgKiApICYmICh0aCAhPSAwKSApOworCisgICAgc2V0X3Rocl9kYXRhKCB0aCApOworCisgICAgYmVjdGwoIHRoLCAoYmdldF9jb21wYWN0X3QpIDAsIChiZ2V0X2FjcXVpcmVfdCkgbWFsbG9jLCAoYmdldF9yZWxlYXNlX3QpIGZyZWUsCisgICAgICAgICAgIChidWZzaXplKSBfX2ttcF9tYWxsb2NfcG9vbF9pbmNyICk7Cit9CisKK3ZvaWQKK19fa21wX2ZpbmFsaXplX2JnZXQoIGttcF9pbmZvX3QgKnRoICkKK3sKKyAgICB0aHJfZGF0YV90ICp0aHI7CisgICAgYmZoZWFkX3QgKmI7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aCAhPSAwICk7CisKKyNpZiBCdWZTdGF0cworICAgIHRociA9ICh0aHJfZGF0YV90ICopIHRoLT50aC50aF9sb2NhbC5iZ2V0X2RhdGE7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGhyICE9IE5VTEwgKTsKKyAgICBiID0gdGhyLT5sYXN0X3Bvb2w7CisKKyAgICAvKiAgSWYgIGEgIGJsb2NrLXJlbGVhc2UgZnVuY3Rpb24gaXMgZGVmaW5lZCwgYW5kIHRoaXMgZnJlZSBidWZmZXIKKyAgICAgICAgY29uc3RpdHV0ZXMgdGhlIGVudGlyZSBibG9jaywgcmVsZWFzZSBpdC4gIE5vdGUgdGhhdCAgcG9vbF9sZW4KKyAgICAgICAgaXMgIGRlZmluZWQgIGluICBzdWNoIGEgd2F5IHRoYXQgdGhlIHRlc3Qgd2lsbCBmYWlsIHVubGVzcyBhbGwKKyAgICAgICAgcG9vbCBibG9ja3MgYXJlIHRoZSBzYW1lIHNpemUuICAqLworCisgICAgLyogRGVhbGxvY2F0ZSB0aGUgbGFzdCBwb29sIGlmIG9uZSBleGlzdHMgYmVjYXVzZSB3ZSBubyBsb25nZXIgZG8gaXQgaW4gYnJlbCgpICovCisgICAgaWYgKHRoci0+cmVsZmNuICE9IDAgJiYgYiAhPSAwICYmIHRoci0+bnVtcGJsayAhPSAwICYmCisgICAgICAgIGItPmJoLmJiLmJzaXplID09IChidWZzaXplKSh0aHItPnBvb2xfbGVuIC0gc2l6ZW9mKGJoZWFkX3QpKSkKKyAgICB7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoYi0+YmguYmIucHJldmZyZWUgPT0gMCk7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoQkgoKGNoYXIgKikgYiArIGItPmJoLmJiLmJzaXplKS0+YmIuYnNpemUgPT0gRVNlbnQpOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKEJIKChjaGFyICopIGIgKyBiLT5iaC5iYi5ic2l6ZSktPmJiLnByZXZmcmVlID09IGItPmJoLmJiLmJzaXplKTsKKworICAgICAgICAvKiAgVW5saW5rIHRoZSBidWZmZXIgZnJvbSB0aGUgZnJlZSBsaXN0ICAqLworICAgICAgICBfX2ttcF9iZ2V0X3JlbW92ZV9mcm9tX2ZyZWVsaXN0KCBiICk7CisKKyAgICAgICAgS0VfVFJBQ0UoIDEwLCAoIiUlJSUlJSBGUkVFKCAlcCApXG4iLCAodm9pZCAqKSBiICkgKTsKKworICAgICAgICAoKnRoci0+cmVsZmNuKShiKTsKKyAgICAgICAgdGhyLT5udW1wcmVsKys7ICAgICAgICAgICAgICAgLyogTnIgb2YgZXhwYW5zaW9uIGJsb2NrIHJlbGVhc2VzICovCisgICAgICAgIHRoci0+bnVtcGJsay0tOyAgICAgICAgICAgICAgIC8qIFRvdGFsIG51bWJlciBvZiBibG9ja3MgKi8KKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCh0aHItPm51bXBibGsgPT0gdGhyLT5udW1wZ2V0IC0gdGhyLT5udW1wcmVsKTsKKyAgICB9CisjZW5kaWYgLyogQnVmU3RhdHMgKi8KKworICAgIC8qIERlYWxsb2NhdGUgYmdldF9kYXRhICovCisgICAgaWYgKCB0aC0+dGgudGhfbG9jYWwuYmdldF9kYXRhICE9IE5VTEwgKSB7CisgICAgICAgIF9fa21wX2ZyZWUoIHRoLT50aC50aF9sb2NhbC5iZ2V0X2RhdGEgKTsKKyAgICAgICAgdGgtPnRoLnRoX2xvY2FsLmJnZXRfZGF0YSA9IE5VTEw7CisgICAgfTsgLy8gaWYKK30KKwordm9pZAora21wY19zZXRfcG9vbHNpemUoIHNpemVfdCBzaXplICkKK3sKKyAgICBiZWN0bCggX19rbXBfZ2V0X3RocmVhZCgpLCAoYmdldF9jb21wYWN0X3QpIDAsIChiZ2V0X2FjcXVpcmVfdCkgbWFsbG9jLAorICAgICAgICAgICAoYmdldF9yZWxlYXNlX3QpIGZyZWUsIChidWZzaXplKSBzaXplICk7Cit9CisKK3NpemVfdAora21wY19nZXRfcG9vbHNpemUoIHZvaWQgKQoreworICAgIHRocl9kYXRhX3QgKnA7CisKKyAgICBwID0gZ2V0X3Rocl9kYXRhKCBfX2ttcF9nZXRfdGhyZWFkKCkgKTsKKworICAgIHJldHVybiBwLT5leHBfaW5jcjsKK30KKwordm9pZAora21wY19zZXRfcG9vbG1vZGUoIGludCBtb2RlICkKK3sKKyAgICB0aHJfZGF0YV90ICpwOworCisgICAgaWYgKG1vZGUgPT0gYmdldF9tb2RlX2ZpZm8gfHwgbW9kZSA9PSBiZ2V0X21vZGVfbGlmbyB8fCBtb2RlID09IGJnZXRfbW9kZV9iZXN0KSB7CisgICAgICAgIHAgPSBnZXRfdGhyX2RhdGEoIF9fa21wX2dldF90aHJlYWQoKSApOworICAgICAgICBwLT5tb2RlID0gKGJnZXRfbW9kZV90KSBtb2RlOworICAgIH0KK30KKworaW50CitrbXBjX2dldF9wb29sbW9kZSggdm9pZCApCit7CisgICAgdGhyX2RhdGFfdCAqcDsKKworICAgIHAgPSBnZXRfdGhyX2RhdGEoIF9fa21wX2dldF90aHJlYWQoKSApOworCisgICAgcmV0dXJuIHAtPm1vZGU7Cit9CisKK3ZvaWQKK2ttcGNfZ2V0X3Bvb2xzdGF0KCBzaXplX3QgKm1heG1lbSwgc2l6ZV90ICphbGxtZW0gKQoreworICAgIGttcF9pbmZvX3QgKnRoID0gX19rbXBfZ2V0X3RocmVhZCgpOworICAgIGJ1ZnNpemUgYSwgYjsKKworICAgIF9fa21wX2JnZXRfZGVxdWV1ZSggdGggKTsgICAgICAgICAvKiBSZWxlYXNlIGFueSBxdWV1ZWQgYnVmZmVycyAqLworCisgICAgYmNoZWNrKCB0aCwgJmEsICZiICk7CisKKyAgICAqbWF4bWVtID0gYTsKKyAgICAqYWxsbWVtID0gYjsKK30KKwordm9pZAora21wY19wb29scHJpbnQoIHZvaWQgKQoreworICAgIGttcF9pbmZvX3QgKnRoID0gX19rbXBfZ2V0X3RocmVhZCgpOworCisgICAgX19rbXBfYmdldF9kZXF1ZXVlKCB0aCApOyAgICAgICAgIC8qIFJlbGVhc2UgYW55IHF1ZXVlZCBidWZmZXJzICovCisKKyAgICBiZnJlZWQoIHRoICk7Cit9CisKKyNlbmRpZiAvLyAjaWYgS01QX1VTRV9CR0VUCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkICoKK2ttcGNfbWFsbG9jKCBzaXplX3Qgc2l6ZSApCit7CisgICAgdm9pZCAqIHB0cjsKKyAgICAgICAgcHRyID0gYmdldCggX19rbXBfZW50cnlfdGhyZWFkKCksIChidWZzaXplKSBzaXplICk7CisKKyAgICByZXR1cm4gcHRyOworfQorCit2b2lkICoKK2ttcGNfY2FsbG9jKCBzaXplX3QgbmVsZW0sIHNpemVfdCBlbHNpemUgKQoreworICAgIHZvaWQgKiBwdHI7CisgICAgICAgIHB0ciA9IGJnZXR6KCBfX2ttcF9lbnRyeV90aHJlYWQoKSwgKGJ1ZnNpemUpIChuZWxlbSAqIGVsc2l6ZSkgKTsKKworICAgIHJldHVybiBwdHI7Cit9CisKK3ZvaWQgKgora21wY19yZWFsbG9jKCB2b2lkICogcHRyLCBzaXplX3Qgc2l6ZSApCit7CisgICAgdm9pZCAqIHJlc3VsdCA9IE5VTEw7CisKKyAgICAgICAgaWYgKCBwdHIgPT0gTlVMTCApIHsKKyAgICAgICAgICAgIC8vIElmIHBvaW50ZXIgaXMgTlVMTCwgcmVhbGxvYyBiZWhhdmVzIGxpa2UgbWFsbG9jLgorICAgICAgICAgICAgcmVzdWx0ID0gYmdldCggX19rbXBfZW50cnlfdGhyZWFkKCksIChidWZzaXplKSBzaXplICk7CisgICAgICAgIH0gZWxzZSBpZiAoIHNpemUgPT0gMCApIHsKKyAgICAgICAgICAgIC8vIElmIHNpemUgaXMgMCwgcmVhbGxvYyBiZWhhdmVzIGxpa2UgZnJlZS4KKyAgICAgICAgICAgIC8vIFRoZSB0aHJlYWQgbXVzdCBiZSByZWdpc3RlcmVkIGJ5IHRoZSBjYWxsIHRvIGttcGNfbWFsbG9jKCkgb3Iga21wY19jYWxsb2MoKSBiZWZvcmUuCisgICAgICAgICAgICAvLyBTbyBpdCBzaG91bGQgYmUgc2FmZSB0byBjYWxsIF9fa21wX2dldF90aHJlYWQoKSwgbm90IF9fa21wX2VudHJ5X3RocmVhZCgpLgorICAgICAgICAgICAgYnJlbCggX19rbXBfZ2V0X3RocmVhZCgpLCBwdHIgKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IGJnZXRyKCBfX2ttcF9lbnRyeV90aHJlYWQoKSwgcHRyLCAoYnVmc2l6ZSkgc2l6ZSApOworICAgICAgICB9OyAvLyBpZgorCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLyogTk9URTogdGhlIGxpYnJhcnkgbXVzdCBoYXZlIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCBieSBhIHByZXZpb3VzIGFsbG9jYXRlICovCisKK3ZvaWQKK2ttcGNfZnJlZSggdm9pZCAqIHB0ciApCit7CisgICAgaWYgKCAhIF9fa21wX2luaXRfc2VyaWFsICkgeworICAgICAgICByZXR1cm47CisgICAgfTsgLy8gaWYKKyAgICBpZiAoIHB0ciAhPSBOVUxMICkgeworICAgICAgICAgICAga21wX2luZm9fdCAqdGggPSBfX2ttcF9nZXRfdGhyZWFkKCk7CisgICAgICAgICAgICBfX2ttcF9iZ2V0X2RlcXVldWUoIHRoICk7ICAgICAgICAgLyogUmVsZWFzZSBhbnkgcXVldWVkIGJ1ZmZlcnMgKi8KKyAgICAgICAgICAgIGJyZWwoIHRoLCBwdHIgKTsKKyAgICB9OworfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkICoKK19fX2ttcF90aHJlYWRfbWFsbG9jKCBrbXBfaW5mb190ICp0aCwgc2l6ZV90IHNpemUgS01QX1NSQ19MT0NfREVDTCApCit7CisgICAgdm9pZCAqIHB0cjsKKyAgICBLRV9UUkFDRSggMzAsICgKKyAgICAgICAgIi0+IF9fa21wX3RocmVhZF9tYWxsb2MoICVwLCAlZCApIGNhbGxlZCBmcm9tICVzOiVkXG4iLAorICAgICAgICB0aCwKKyAgICAgICAgKGludCkgc2l6ZQorICAgICAgICBLTVBfU1JDX0xPQ19QQVJNCisgICAgKSApOworICAgICAgICBwdHIgPSBiZ2V0KCB0aCwgKGJ1ZnNpemUpIHNpemUgKTsKKyAgICBLRV9UUkFDRSggMzAsICggIjwtIF9fa21wX3RocmVhZF9tYWxsb2MoKSByZXR1cm5zICVwXG4iLCBwdHIgKSApOworICAgIHJldHVybiBwdHI7Cit9CisKK3ZvaWQgKgorX19fa21wX3RocmVhZF9jYWxsb2MoIGttcF9pbmZvX3QgKnRoLCBzaXplX3QgbmVsZW0sIHNpemVfdCBlbHNpemUgS01QX1NSQ19MT0NfREVDTCApCit7CisgICAgdm9pZCAqIHB0cjsKKyAgICBLRV9UUkFDRSggMzAsICgKKyAgICAgICAgIi0+IF9fa21wX3RocmVhZF9jYWxsb2MoICVwLCAlZCwgJWQgKSBjYWxsZWQgZnJvbSAlczolZFxuIiwKKyAgICAgICAgdGgsCisgICAgICAgIChpbnQpIG5lbGVtLAorICAgICAgICAoaW50KSBlbHNpemUKKyAgICAgICAgS01QX1NSQ19MT0NfUEFSTQorICAgICkgKTsKKyAgICAgICAgcHRyID0gYmdldHooIHRoLCAoYnVmc2l6ZSkgKG5lbGVtICogZWxzaXplKSApOworICAgIEtFX1RSQUNFKCAzMCwgKCAiPC0gX19rbXBfdGhyZWFkX2NhbGxvYygpIHJldHVybnMgJXBcbiIsIHB0ciApICk7CisgICAgcmV0dXJuIHB0cjsKK30KKwordm9pZCAqCitfX19rbXBfdGhyZWFkX3JlYWxsb2MoIGttcF9pbmZvX3QgKnRoLCB2b2lkICpwdHIsIHNpemVfdCBzaXplIEtNUF9TUkNfTE9DX0RFQ0wgKQoreworICAgIEtFX1RSQUNFKCAzMCwgKAorICAgICAgICAiLT4gX19rbXBfdGhyZWFkX3JlYWxsb2MoICVwLCAlcCwgJWQgKSBjYWxsZWQgZnJvbSAlczolZFxuIiwKKyAgICAgICAgdGgsCisgICAgICAgIHB0ciwKKyAgICAgICAgKGludCkgc2l6ZQorICAgICAgICBLTVBfU1JDX0xPQ19QQVJNCisgICAgKSApOworICAgICAgICBwdHIgPSBiZ2V0ciggdGgsIHB0ciwgKGJ1ZnNpemUpIHNpemUgKTsKKyAgICBLRV9UUkFDRSggMzAsICggIjwtIF9fa21wX3RocmVhZF9yZWFsbG9jKCkgcmV0dXJucyAlcFxuIiwgcHRyICkgKTsKKyAgICByZXR1cm4gcHRyOworfQorCit2b2lkCitfX19rbXBfdGhyZWFkX2ZyZWUoIGttcF9pbmZvX3QgKnRoLCB2b2lkICpwdHIgS01QX1NSQ19MT0NfREVDTCApCit7CisgICAgS0VfVFJBQ0UoIDMwLCAoCisgICAgICAgICItPiBfX2ttcF90aHJlYWRfZnJlZSggJXAsICVwICkgY2FsbGVkIGZyb20gJXM6JWRcbiIsCisgICAgICAgIHRoLAorICAgICAgICBwdHIKKyAgICAgICAgS01QX1NSQ19MT0NfUEFSTQorICAgICkgKTsKKyAgICBpZiAoIHB0ciAhPSBOVUxMICkgeworICAgICAgICAgICAgX19rbXBfYmdldF9kZXF1ZXVlKCB0aCApOyAgICAgICAgIC8qIFJlbGVhc2UgYW55IHF1ZXVlZCBidWZmZXJzICovCisgICAgICAgICAgICBicmVsKCB0aCwgcHRyICk7CisgICAgfQorICAgIEtFX1RSQUNFKCAzMCwgKCAiPC0gX19rbXBfdGhyZWFkX2ZyZWUoKVxuIiApICk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICAgIElmIExFQUtfTUVNT1JZIGlzIGRlZmluZWQsIF9fa21wX2ZyZWUoKSB3aWxsICpub3QqIGZyZWUgbWVtb3J5LiBJdCBjYXVzZXMgbWVtb3J5IGxlYWtzLCBidXQgaXQKKyAgICBtYXkgYmUgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgbWVtb3J5IGNvcnJ1cHRpb25zLCB1c2VkIGZyZWVkIHBvaW50ZXJzLCBldGMuCisqLworLyogI2RlZmluZSBMRUFLX01FTU9SWSAqLworCitzdHJ1Y3Qga21wX21lbV9kZXNjciB7ICAgICAgLy8gTWVtb3J5IGJsb2NrIGRlc2NyaXB0b3IuCisgICAgdm9pZCAqIHB0cl9hbGxvY2F0ZWQ7ICAgLy8gUG9pbnRlciByZXR1cm5lZCBieSBtYWxsb2MoKSwgc3ViamVjdCBmb3IgZnJlZSgpLgorICAgIHNpemVfdCBzaXplX2FsbG9jYXRlZDsgIC8vIFNpemUgb2YgYWxsb2NhdGVkIG1lbW9yeSBibG9jay4KKyAgICB2b2lkICogcHRyX2FsaWduZWQ7ICAgICAvLyBQb2ludGVyIHRvIGFsaWduZWQgbWVtb3J5LCB0byBiZSB1c2VkIGJ5IGNsaWVudCBjb2RlLgorICAgIHNpemVfdCBzaXplX2FsaWduZWQ7ICAgIC8vIFNpemUgb2YgYWxpZ25lZCBtZW1vcnkgYmxvY2suCit9OwordHlwZWRlZiBzdHJ1Y3Qga21wX21lbV9kZXNjciBrbXBfbWVtX2Rlc2NyX3Q7CisKKy8qCisgICAgQWxsb2NhdGUgbWVtb3J5IG9uIHJlcXVlc3RlZCBib3VuZGFyeSwgZmlsbCBhbGxvY2F0ZWQgbWVtb3J5IHdpdGggMHgwMC4KKyAgICBOVUxMIGlzIE5FVkVSIHJldHVybmVkLCBfX2ttcF9hYm9ydCgpIGlzIGNhbGxlZCBpbiBjYXNlIG9mIG1lbW9yeSBhbGxvY2F0aW9uIGVycm9yLgorICAgIE11c3QgdXNlIF9fa21wX2ZyZWUgd2hlbiBmcmVlaW5nIG1lbW9yeSBhbGxvY2F0ZWQgYnkgdGhpcyByb3V0aW5lIQorICovCitzdGF0aWMKK3ZvaWQgKgorX19fa21wX2FsbG9jYXRlX2FsaWduKCBzaXplX3Qgc2l6ZSwgc2l6ZV90IGFsaWdubWVudCBLTVBfU1JDX0xPQ19ERUNMICkKK3sKKyAgICAvKgorICAgICAgICAgICAgX19rbXBfYWxsb2NhdGUoKSBhbGxvY2F0ZXMgKGJ5IGNhbGwgdG8gbWFsbG9jKCkpIGJpZ2dlciBtZW1vcnkgYmxvY2sgdGhhbiByZXF1ZXN0ZWQgdG8KKyAgICAgICAgcmV0dXJuIHByb3Blcmx5IGFsaWduZWQgcG9pbnRlci4gT3JpZ2luYWwgcG9pbnRlciByZXR1cm5lZCBieSBtYWxsb2MoKSBhbmQgc2l6ZSBvZiBhbGxvY2F0ZWQKKyAgICAgICAgYmxvY2sgaXMgc2F2ZWQgaW4gZGVzY3JpcHRvciBqdXN0IGJlZm9yZSB0aGUgYWxpZ25lZCBwb2ludGVyLiBUaGlzIGluZm9ybWF0aW9uIHVzZWQgYnkKKyAgICAgICAgX19rbXBfZnJlZSgpIC0tIGl0IGhhcyB0byBwYXNzIHRvIGZyZWUoKSBvcmlnaW5hbCBwb2ludGVyLCBub3QgYWxpZ25lZCBvbmUuCisKKyAgICAgICAgICAgICstLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSsKKyAgICAgICAgICAgIHwgcGFkZGluZyB8IGRlc2NyaXB0b3IgfCAgICAgICAgICAgYWxpZ25lZCBibG9jayAgICAgICAgICAgfCBwYWRkaW5nIHwKKyAgICAgICAgICAgICstLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSsKKyAgICAgICAgICAgIF4gICAgICAgICAgICAgICAgICAgICAgXgorICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICstIEFsaWduZWQgcG9pbnRlciByZXR1cm5lZCB0byBjYWxsZXIKKyAgICAgICAgICAgICstIFBvaW50ZXIgcmV0dXJuZWQgYnkgbWFsbG9jKCkKKworICAgICAgICBBbGlnbmVkIGJsb2NrIGlzIGZpbGxlZCB3aXRoIHplcm9zLCBwYWRkaW5ncyBhcmUgZmlsbGVkIHdpdGggMHhFRi4KKyAgICAqLworCisgICAga21wX21lbV9kZXNjcl90ICBkZXNjcjsKKyAgICBrbXBfdWludHB0cl90ICAgIGFkZHJfYWxsb2NhdGVkOyAgICAgICAgLy8gQWRkcmVzcyByZXR1cm5lZCBieSBtYWxsb2MoKS4KKyAgICBrbXBfdWludHB0cl90ICAgIGFkZHJfYWxpZ25lZDsgICAgICAgICAgLy8gQWxpZ25lZCBhZGRyZXNzIHRvIHJldHVybiB0byBjYWxsZXIuCisgICAga21wX3VpbnRwdHJfdCAgICBhZGRyX2Rlc2NyOyAgICAgICAgICAgIC8vIEFkZHJlc3Mgb2YgbWVtb3J5IGJsb2NrIGRlc2NyaXB0b3IuCisKKyAgICBLRV9UUkFDRSggMjUsICgKKyAgICAgICAgIi0+IF9fX2ttcF9hbGxvY2F0ZV9hbGlnbiggJWQsICVkICkgY2FsbGVkIGZyb20gJXM6JWRcbiIsCisgICAgICAgIChpbnQpIHNpemUsCisgICAgICAgIChpbnQpIGFsaWdubWVudAorICAgICAgICBLTVBfU1JDX0xPQ19QQVJNCisgICAgKSApOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggYWxpZ25tZW50IDwgMzIgKiAxMDI0ICk7IC8vIEFsaWdubWVudCBzaG91bGQgbm90IGJlIHRvbworICAgIEtNUF9ERUJVR19BU1NFUlQoIHNpemVvZiggdm9pZCAqICkgPD0gc2l6ZW9mKCBrbXBfdWludHB0cl90ICkgKTsKKyAgICAgICAgLy8gTWFrZSBzdXJlIGttcF91aW50cHRyX3QgaXMgZW5vdWdoIHRvIHN0b3JlIGFkZHJlc3Nlcy4KKworICAgIGRlc2NyLnNpemVfYWxpZ25lZCA9IHNpemU7CisgICAgZGVzY3Iuc2l6ZV9hbGxvY2F0ZWQgPSBkZXNjci5zaXplX2FsaWduZWQgKyBzaXplb2YoIGttcF9tZW1fZGVzY3JfdCApICsgYWxpZ25tZW50OworCisgICAgI2lmIEtNUF9ERUJVRworICAgICAgICBkZXNjci5wdHJfYWxsb2NhdGVkID0gX21hbGxvY19zcmNfbG9jKCBkZXNjci5zaXplX2FsbG9jYXRlZCwgX2ZpbGVfLCBfbGluZV8gKTsKKyAgICAjZWxzZQorICAgIGRlc2NyLnB0cl9hbGxvY2F0ZWQgPSBtYWxsb2Nfc3JjX2xvYyggZGVzY3Iuc2l6ZV9hbGxvY2F0ZWQgS01QX1NSQ19MT0NfUEFSTSApOworICAgICNlbmRpZgorICAgIEtFX1RSQUNFKCAxMCwgKAorICAgICAgICAiICAgbWFsbG9jKCAlZCApIHJldHVybmVkICVwXG4iLAorICAgICAgICAoaW50KSBkZXNjci5zaXplX2FsbG9jYXRlZCwKKyAgICAgICAgZGVzY3IucHRyX2FsbG9jYXRlZAorICAgICkgKTsKKyAgICBpZiAoIGRlc2NyLnB0cl9hbGxvY2F0ZWQgPT0gTlVMTCApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBPdXRPZkhlYXBNZW1vcnkgKTsKKyAgICB9OworCisgICAgYWRkcl9hbGxvY2F0ZWQgPSAoa21wX3VpbnRwdHJfdCkgZGVzY3IucHRyX2FsbG9jYXRlZDsKKyAgICBhZGRyX2FsaWduZWQgPQorICAgICAgICAoIGFkZHJfYWxsb2NhdGVkICsgc2l6ZW9mKCBrbXBfbWVtX2Rlc2NyX3QgKSArIGFsaWdubWVudCApCisgICAgICAgICYgfiAoIGFsaWdubWVudCAtIDEgKTsKKyAgICBhZGRyX2Rlc2NyID0gYWRkcl9hbGlnbmVkIC0gc2l6ZW9mKCBrbXBfbWVtX2Rlc2NyX3QgKTsKKworICAgIGRlc2NyLnB0cl9hbGlnbmVkID0gKHZvaWQgKikgYWRkcl9hbGlnbmVkOworCisgICAgS0VfVFJBQ0UoIDI2LCAoCisgICAgICAgICIgICBfX19rbXBfYWxsb2NhdGVfYWxpZ246ICIKKyAgICAgICAgICAgICJwdHJfYWxsb2NhdGVkPSVwLCBzaXplX2FsbG9jYXRlZD0lZCwgIgorICAgICAgICAgICAgInB0cl9hbGlnbmVkPSVwLCBzaXplX2FsaWduZWQ9JWRcbiIsCisgICAgICAgIGRlc2NyLnB0cl9hbGxvY2F0ZWQsCisgICAgICAgIChpbnQpIGRlc2NyLnNpemVfYWxsb2NhdGVkLAorICAgICAgICBkZXNjci5wdHJfYWxpZ25lZCwKKyAgICAgICAgKGludCkgZGVzY3Iuc2l6ZV9hbGlnbmVkCisgICAgKSApOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggYWRkcl9hbGxvY2F0ZWQgPD0gYWRkcl9kZXNjciApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIGFkZHJfZGVzY3IgKyBzaXplb2YoIGttcF9tZW1fZGVzY3JfdCApID09IGFkZHJfYWxpZ25lZCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIGFkZHJfYWxpZ25lZCArIGRlc2NyLnNpemVfYWxpZ25lZCA8PSBhZGRyX2FsbG9jYXRlZCArIGRlc2NyLnNpemVfYWxsb2NhdGVkICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggYWRkcl9hbGlnbmVkICUgYWxpZ25tZW50ID09IDAgKTsKKworICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgbWVtc2V0KCBkZXNjci5wdHJfYWxsb2NhdGVkLCAweEVGLCBkZXNjci5zaXplX2FsbG9jYXRlZCApOworICAgICAgICAgICAgLy8gRmlsbCBhbGxvY2F0ZWQgbWVtb3J5IGJsb2NrIHdpdGggMHhFRi4KKyAgICAjZW5kaWYKKyAgICBtZW1zZXQoIGRlc2NyLnB0cl9hbGlnbmVkLCAweDAwLCBkZXNjci5zaXplX2FsaWduZWQgKTsKKyAgICAgICAgLy8gRmlsbCB0aGUgYWxpZ25lZCBtZW1vcnkgYmxvY2sgKHdoaWNoIGlzIGludGVuZGVkIGZvciB1c2luZyBieSBjYWxsZXIpIHdpdGggMHgwMC4gRG8gbm90CisgICAgICAgIC8vIHB1dCB0aGlzIGZpbGxpbmcgdW5kZXIgS01QX0RFQlVHIGNvbmRpdGlvbiEgTWFueSBjYWxsZXJzIGV4cGVjdCB6ZXJvZWQgbWVtb3J5LiAoUGFkZGluZworICAgICAgICAvLyBieXRlcyByZW1haW4gZmlsbGVkIHdpdGggMHhFRiBpbiBkZWJ1Z2dpbmcgbGlicmFyeS4pCisgICAgKiAoIChrbXBfbWVtX2Rlc2NyX3QgKikgYWRkcl9kZXNjciApID0gZGVzY3I7CisKKyAgICBLTVBfTUIoKTsKKworICAgIEtFX1RSQUNFKCAyNSwgKCAiPC0gX19fa21wX2FsbG9jYXRlX2FsaWduKCkgcmV0dXJucyAlcFxuIiwgZGVzY3IucHRyX2FsaWduZWQgKSApOworICAgIHJldHVybiBkZXNjci5wdHJfYWxpZ25lZDsKKworfSAvLyBmdW5jIF9fX2ttcF9hbGxvY2F0ZV9hbGlnbgorCisKKy8qCisgICAgQWxsb2NhdGUgbWVtb3J5IG9uIGNhY2hlIGxpbmUgYm91bmRhcnksIGZpbGwgYWxsb2NhdGVkIG1lbW9yeSB3aXRoIDB4MDAuCisgICAgRG8gbm90IGNhbGwgdGhpcyBmdW5jIGRpcmVjdGx5ISBVc2UgX19rbXBfYWxsb2NhdGUgbWFjcm8gaW5zdGVhZC4KKyAgICBOVUxMIGlzIE5FVkVSIHJldHVybmVkLCBfX2ttcF9hYm9ydCgpIGlzIGNhbGxlZCBpbiBjYXNlIG9mIG1lbW9yeSBhbGxvY2F0aW9uIGVycm9yLgorICAgIE11c3QgdXNlIF9fa21wX2ZyZWUgd2hlbiBmcmVlaW5nIG1lbW9yeSBhbGxvY2F0ZWQgYnkgdGhpcyByb3V0aW5lIQorICovCit2b2lkICoKK19fX2ttcF9hbGxvY2F0ZSggc2l6ZV90IHNpemUgS01QX1NSQ19MT0NfREVDTCApCit7CisKKyAgICB2b2lkICogcHRyOworICAgIEtFX1RSQUNFKCAyNSwgKCAiLT4gX19rbXBfYWxsb2NhdGUoICVkICkgY2FsbGVkIGZyb20gJXM6JWRcbiIsIChpbnQpIHNpemUgS01QX1NSQ19MT0NfUEFSTSApICk7CisgICAgICAgIHB0ciA9IF9fX2ttcF9hbGxvY2F0ZV9hbGlnbiggc2l6ZSwgX19rbXBfYWxpZ25fYWxsb2MgS01QX1NSQ19MT0NfUEFSTSApOworICAgIEtFX1RSQUNFKCAyNSwgKCAiPC0gX19rbXBfYWxsb2NhdGUoKSByZXR1cm5zICVwXG4iLCBwdHIgKSApOworICAgIHJldHVybiBwdHI7CisKK30gLy8gZnVuYyBfX19rbXBfYWxsb2NhdGUKKworI2lmIChCVUlMRF9NRU1PUlk9PUZJUlNUX1RPVUNIKQordm9pZCAqCitfX2ttcF9mdF9wYWdlX2FsbG9jYXRlKHNpemVfdCBzaXplKQoreworICB2b2lkICphZHIsICphYWRyOworI2lmIEtNUF9PU19MSU5VWAorICAvKiBUT0RPOiBVc2UgdGhpcyBmdW5jdGlvbiB0byBnZXQgcGFnZSBzaXplIGV2ZXJ5d2hlcmUgKi8KKyAgaW50IHBhZ2Vfc2l6ZSA9IGdldHBhZ2VzaXplKCk7CisjZWxzZQorICAvKiBUT0RPOiBGaW5kIHdpbmRvd3MgZnVuY3Rpb24gdG8gZ2V0IHBhZ2Ugc2l6ZSBhbmQgdXNlIGl0IGV2ZXJ5d2hlcmUgKi8KKyAgaW50IHBhZ2Vfc2l6ZSA9IFBBR0VfU0laRTsKKyNlbmRpZiAvKiBLTVBfT1NfTElOVVggKi8KKworICBhZHIgPSAodm9pZCAqKSBfX2ttcF90aHJlYWRfbWFsbG9jKCBfX2ttcF9nZXRfdGhyZWFkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplICsgcGFnZV9zaXplICsgS01QX1BUUl9TS0lQKTsKKyAgaWYgKCBhZHIgPT0gMCApCisgICAgS01QX0ZBVEFMKCBPdXRPZkhlYXBNZW1vcnkgKTsKKworICAvKiBjaGVjayB0byBzZWUgaWYgYWRyIGlzIG9uIGEgcGFnZSBib3VuZGFyeS4gKi8KKyAgaWYgKCAoIChrbXBfdWludHB0cl90KSBhZHIgJiAocGFnZV9zaXplIC0gMSkpID09IDApCisgICAgLyogbm90aGluZyB0byBkbyBpZiBhZHIgaXMgYWxyZWFkeSBvbiBhIHBhZ2UgYm91bmRhcnkuICovCisgICAgYWFkciA9IGFkcjsKKyAgZWxzZQorICAgIC8qIGVsc2Ugc2V0IGFhZHIgdG8gdGhlIGZpcnN0IHBhZ2UgYm91bmRhcnkgaW4gdGhlIGFsbG9jYXRlZCBtZW1vcnkuICovCisgICAgYWFkciA9ICh2b2lkICopICggKCAoa21wX3VpbnRwdHJfdCkgYWRyICsgcGFnZV9zaXplKSAmIH4ocGFnZV9zaXplIC0gMSkgKTsKKworICAvKiB0aGUgZmlyc3QgdG91Y2ggYnkgdGhlIG93bmVyIHRocmVhZC4gKi8KKyAgKigodm9pZCoqKWFhZHIpID0gYWRyOworCisgIC8qIHNraXAgdGhlIG1lbW9yeSBzcGFjZSB1c2VkIGZvciBzdG9yaW5nIGFkciBhYm92ZS4gKi8KKyAgcmV0dXJuICh2b2lkKikoKGNoYXIqKWFhZHIgKyBLTVBfUFRSX1NLSVApOworfQorI2VuZGlmCisKKy8qCisgICAgQWxsb2NhdGUgbWVtb3J5IG9uIHBhZ2UgYm91bmRhcnksIGZpbGwgYWxsb2NhdGVkIG1lbW9yeSB3aXRoIDB4MDAuCisgICAgRG9lcyBub3QgY2FsbCB0aGlzIGZ1bmMgZGlyZWN0bHkhIFVzZSBfX2ttcF9wYWdlX2FsbG9jYXRlIG1hY3JvIGluc3RlYWQuCisgICAgTlVMTCBpcyBORVZFUiByZXR1cm5lZCwgX19rbXBfYWJvcnQoKSBpcyBjYWxsZWQgaW4gY2FzZSBvZiBtZW1vcnkgYWxsb2NhdGlvbiBlcnJvci4KKyAgICBNdXN0IHVzZSBfX2ttcF9mcmVlIHdoZW4gZnJlZWluZyBtZW1vcnkgYWxsb2NhdGVkIGJ5IHRoaXMgcm91dGluZSEKKyAqLwordm9pZCAqCitfX19rbXBfcGFnZV9hbGxvY2F0ZSggc2l6ZV90IHNpemUgS01QX1NSQ19MT0NfREVDTCApCit7CisgICAgaW50ICAgIHBhZ2Vfc2l6ZSA9IDggKiAxMDI0OworICAgIHZvaWQgKiBwdHI7CisKKyAgICBLRV9UUkFDRSggMjUsICgKKyAgICAgICAgIi0+IF9fa21wX3BhZ2VfYWxsb2NhdGUoICVkICkgY2FsbGVkIGZyb20gJXM6JWRcbiIsCisgICAgICAgIChpbnQpIHNpemUKKyAgICAgICAgS01QX1NSQ19MT0NfUEFSTQorICAgICkgKTsKKyAgICAgICAgcHRyID0gX19fa21wX2FsbG9jYXRlX2FsaWduKCBzaXplLCBwYWdlX3NpemUgS01QX1NSQ19MT0NfUEFSTSApOworICAgIEtFX1RSQUNFKCAyNSwgKCAiPC0gX19rbXBfcGFnZV9hbGxvY2F0ZSggJWQgKSByZXR1cm5zICVwXG4iLCAoaW50KSBzaXplLCBwdHIgKSApOworICAgIHJldHVybiBwdHI7Cit9IC8vIF9fX2ttcF9wYWdlX2FsbG9jYXRlCisKKy8qCisgICAgRnJlZSBtZW1vcnkgYWxsb2NhdGVkIGJ5IF9fa21wX2FsbG9jYXRlKCkgYW5kIF9fa21wX3BhZ2VfYWxsb2NhdGUoKS4KKyAgICBJbiBkZWJ1ZyBtb2RlLCBmaWxsIHRoZSBtZW1vcnkgYmxvY2sgd2l0aCAweEVGIGJlZm9yZSBjYWxsIHRvIGZyZWUoKS4KKyovCit2b2lkCitfX19rbXBfZnJlZSggdm9pZCAqIHB0ciBLTVBfU1JDX0xPQ19ERUNMICkKK3sKKworICAgICAgICBrbXBfbWVtX2Rlc2NyX3QgZGVzY3I7CisgICAgICAgIGttcF91aW50cHRyX3QgICBhZGRyX2FsbG9jYXRlZDsgICAgICAgIC8vIEFkZHJlc3MgcmV0dXJuZWQgYnkgbWFsbG9jKCkuCisgICAgICAgIGttcF91aW50cHRyX3QgICBhZGRyX2FsaWduZWQ7ICAgICAgICAgIC8vIEFsaWduZWQgYWRkcmVzcyBwYXNzZWQgYnkgY2FsbGVyLgorCisgICAgICAgIEtFX1RSQUNFKCAyNSwgKCAiLT4gX19rbXBfZnJlZSggJXAgKSBjYWxsZWQgZnJvbSAlczolZFxuIiwgcHRyIEtNUF9TUkNfTE9DX1BBUk0gKSApOworICAgICAgICBLTVBfQVNTRVJUKCBwdHIgIT0gTlVMTCApOworCisgICAgICAgIGRlc2NyID0gKiAoIGttcF9tZW1fZGVzY3JfdCAqKSAoIChrbXBfdWludHB0cl90KSBwdHIgLSBzaXplb2YoIGttcF9tZW1fZGVzY3JfdCApICk7CisKKyAgICAgICAgS0VfVFJBQ0UoIDI2LCAoICIgICBfX2ttcF9mcmVlOiAgICAgIgorICAgICAgICAgICAgICAgICAgICAgICAgInB0cl9hbGxvY2F0ZWQ9JXAsIHNpemVfYWxsb2NhdGVkPSVkLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAicHRyX2FsaWduZWQ9JXAsIHNpemVfYWxpZ25lZD0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyLnB0cl9hbGxvY2F0ZWQsIChpbnQpIGRlc2NyLnNpemVfYWxsb2NhdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3IucHRyX2FsaWduZWQsIChpbnQpIGRlc2NyLnNpemVfYWxpZ25lZCApKTsKKworICAgICAgICBhZGRyX2FsbG9jYXRlZCA9IChrbXBfdWludHB0cl90KSBkZXNjci5wdHJfYWxsb2NhdGVkOworICAgICAgICBhZGRyX2FsaWduZWQgICA9IChrbXBfdWludHB0cl90KSBkZXNjci5wdHJfYWxpZ25lZDsKKworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBhZGRyX2FsaWduZWQgJSBDQUNIRV9MSU5FID09IDAgKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggZGVzY3IucHRyX2FsaWduZWQgPT0gcHRyICk7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGFkZHJfYWxsb2NhdGVkICsgc2l6ZW9mKCBrbXBfbWVtX2Rlc2NyX3QgKSA8PSBhZGRyX2FsaWduZWQgKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggZGVzY3Iuc2l6ZV9hbGlnbmVkIDwgZGVzY3Iuc2l6ZV9hbGxvY2F0ZWQgKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggYWRkcl9hbGlnbmVkICsgZGVzY3Iuc2l6ZV9hbGlnbmVkIDw9IGFkZHJfYWxsb2NhdGVkICsgZGVzY3Iuc2l6ZV9hbGxvY2F0ZWQgKTsKKworICAgICAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgICAgICAgICBtZW1zZXQoIGRlc2NyLnB0cl9hbGxvY2F0ZWQsIDB4RUYsIGRlc2NyLnNpemVfYWxsb2NhdGVkICk7CisgICAgICAgICAgICAgICAgLy8gRmlsbCBtZW1vcnkgYmxvY2sgd2l0aCAweEVGLCBpdCBoZWxwcyBjYXRjaCB1c2luZyBmcmVlZCBtZW1vcnkuCisgICAgICAgICNlbmRpZgorCisgICAgICAgICNpZm5kZWYgTEVBS19NRU1PUlkKKyAgICAgICAgICAgIEtFX1RSQUNFKCAxMCwgKCAiICAgZnJlZSggJXAgKVxuIiwgZGVzY3IucHRyX2FsbG9jYXRlZCApICk7CisgICAgICAgICMgaWZkZWYgS01QX0RFQlVHCisgICAgICAgICAgICBfZnJlZV9zcmNfbG9jKCBkZXNjci5wdHJfYWxsb2NhdGVkLCBfZmlsZV8sIF9saW5lXyApOworICAgICAgICAjIGVsc2UKKyAgICAgICAgICAgIGZyZWVfc3JjX2xvYyggZGVzY3IucHRyX2FsbG9jYXRlZCBLTVBfU1JDX0xPQ19QQVJNICk7CisgICAgICAgICMgZW5kaWYKKyAgICAgICAgI2VuZGlmCisKKyAgICBLTVBfTUIoKTsKKworICAgIEtFX1RSQUNFKCAyNSwgKCAiPC0gX19rbXBfZnJlZSgpIHJldHVybnNcbiIgKSApOworCit9IC8vIGZ1bmMgX19fa21wX2ZyZWUKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmIFVTRV9GQVNUX01FTU9SWSA9PSAzCisvLyBBbGxvY2F0ZSBmYXN0IG1lbW9yeSBieSBmaXJzdCBzY2FubmluZyB0aGUgdGhyZWFkJ3MgZnJlZSBsaXN0cworLy8gSWYgYSBjaHVuayB0aGUgcmlnaHQgc2l6ZSBleGlzdHMsIGdyYWIgaXQgb2ZmIHRoZSBmcmVlIGxpc3QuCisvLyBPdGhlcndpc2UgYWxsb2NhdGUgbm9ybWFsbHkgdXNpbmcga21wX3RocmVhZF9tYWxsb2MuCisKKy8vIEFDOiBIb3cgdG8gY2hvb3NlIHRoZSBsaW1pdD8gSnVzdCBnZXQgMTYgZm9yIG5vdy4uLgorI2RlZmluZSBLTVBfRlJFRV9MSVNUX0xJTUlUIDE2CisKKy8vIEFsd2F5cyB1c2UgMTI4IGJ5dGVzIGZvciBkZXRlcm1pbmluZyBidWNrZXRzIGZvciBjYWNoaW5nIG1lbW9yeSBibG9ja3MKKyNkZWZpbmUgRENBQ0hFX0xJTkUgIDEyOAorCit2b2lkICoKK19fX2ttcF9mYXN0X2FsbG9jYXRlKCBrbXBfaW5mb190ICp0aGlzX3Rociwgc2l6ZV90IHNpemUgS01QX1NSQ19MT0NfREVDTCApCit7CisgICAgdm9pZCAgICAgICAgICAgICogcHRyOworICAgIGludCAgICAgICAgICAgICAgIG51bV9saW5lczsKKyAgICBpbnQgICAgICAgICAgICAgICBpZHg7CisgICAgaW50ICAgICAgICAgICAgICAgaW5kZXg7CisgICAgdm9pZCAgICAgICAgICAgICogYWxsb2NfcHRyOworICAgIHNpemVfdCAgICAgICAgICAgIGFsbG9jX3NpemU7CisgICAga21wX21lbV9kZXNjcl90ICogZGVzY3I7CisKKyAgICBLRV9UUkFDRSggMjUsICggIi0+IF9fa21wX2Zhc3RfYWxsb2NhdGUoIFQjJWQsICVkICkgY2FsbGVkIGZyb20gJXM6JWRcbiIsCisgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKHRoaXNfdGhyKSwgKGludCkgc2l6ZSBLTVBfU1JDX0xPQ19QQVJNICkgKTsKKworICAgIG51bV9saW5lcyA9ICggc2l6ZSArIERDQUNIRV9MSU5FIC0gMSApIC8gRENBQ0hFX0xJTkU7CisgICAgaWR4ID0gbnVtX2xpbmVzIC0gMTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBpZHggPj0gMCApOworICAgIGlmICggaWR4IDwgMiApIHsKKyAgICAgICAgaW5kZXggPSAwOyAgICAgICAvLyBpZHggaXMgWyAwLCAxIF0sIHVzZSBmaXJzdCBmcmVlIGxpc3QKKyAgICAgICAgbnVtX2xpbmVzID0gMjsgICAvLyAxLCAyIGNhY2hlIGxpbmVzIG9yIGxlc3MgdGhhbiBjYWNoZSBsaW5lCisgICAgfSBlbHNlIGlmICggKCBpZHggPj49IDIgKSA9PSAwICkgeworICAgICAgICBpbmRleCA9IDE7ICAgICAgIC8vIGlkeCBpcyBbIDIsIDMgXSwgdXNlIHNlY29uZCBmcmVlIGxpc3QKKyAgICAgICAgbnVtX2xpbmVzID0gNDsgICAvLyAzLCA0IGNhY2hlIGxpbmVzCisgICAgfSBlbHNlIGlmICggKCBpZHggPj49IDIgKSA9PSAwICkgeworICAgICAgICBpbmRleCA9IDI7ICAgICAgIC8vIGlkeCBpcyBbIDQsIDE1IF0sIHVzZSB0aGlyZCBmcmVlIGxpc3QKKyAgICAgICAgbnVtX2xpbmVzID0gMTY7ICAvLyA1LCA2LCAuLi4sIDE2IGNhY2hlIGxpbmVzCisgICAgfSBlbHNlIGlmICggKCBpZHggPj49IDIgKSA9PSAwICkgeworICAgICAgICBpbmRleCA9IDM7ICAgICAgIC8vIGlkeCBpcyBbIDE2LCA2MyBdLCB1c2UgZm91cnRoIGZyZWUgbGlzdAorICAgICAgICBudW1fbGluZXMgPSA2NDsgIC8vIDE3LCAxOCwgLi4uLCA2NCBjYWNoZSBsaW5lcworICAgIH0gZWxzZSB7CisgICAgICAgIGdvdG8gYWxsb2NfY2FsbDsgLy8gNjUgb3IgbW9yZSBjYWNoZSBsaW5lcyAoID4gOEtCICksIGRvbid0IHVzZSBmcmVlIGxpc3RzCisgICAgfQorCisgICAgcHRyID0gdGhpc190aHItPnRoLnRoX2ZyZWVfbGlzdHNbaW5kZXhdLnRoX2ZyZWVfbGlzdF9zZWxmOworICAgIGlmICggcHRyICE9IE5VTEwgKSB7CisgICAgICAgIC8vIHBvcCB0aGUgaGVhZCBvZiBuby1zeW5jIGZyZWUgbGlzdAorICAgICAgICB0aGlzX3Roci0+dGgudGhfZnJlZV9saXN0c1tpbmRleF0udGhfZnJlZV9saXN0X3NlbGYgPSAqKCh2b2lkICoqKXB0cik7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHRoaXNfdGhyID09CisgICAgICAgICAgICAoKGttcF9tZW1fZGVzY3JfdCAqKSggKGttcF91aW50cHRyX3QpcHRyIC0gc2l6ZW9mKGttcF9tZW1fZGVzY3JfdCkgKSktPnB0cl9hbGlnbmVkICk7CisgICAgICAgIGdvdG8gZW5kOworICAgIH07CisgICAgcHRyID0gVENSX1NZTkNfUFRSKCB0aGlzX3Roci0+dGgudGhfZnJlZV9saXN0c1tpbmRleF0udGhfZnJlZV9saXN0X3N5bmMgKTsKKyAgICBpZiAoIHB0ciAhPSBOVUxMICkgeworICAgICAgICAvLyBuby1zeW5jIGZyZWUgbGlzdCBpcyBlbXB0eSwgdXNlIHN5bmMgZnJlZSBsaXN0IChmaWxsZWQgaW4gYnkgb3RoZXIgdGhyZWFkcyBvbmx5KQorICAgICAgICAvLyBwb3AgdGhlIGhlYWQgb2YgdGhlIHN5bmMgZnJlZSBsaXN0LCBwdXNoIE5VTEwgaW5zdGVhZAorICAgICAgICB3aGlsZSAoICEgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1BUUigKKyAgICAgICAgICAgICZ0aGlzX3Roci0+dGgudGhfZnJlZV9saXN0c1tpbmRleF0udGhfZnJlZV9saXN0X3N5bmMsIHB0ciwgTlVMTCApICkKKyAgICAgICAgeworICAgICAgICAgICAgS01QX0NQVV9QQVVTRSgpOworICAgICAgICAgICAgcHRyID0gVENSX1NZTkNfUFRSKCB0aGlzX3Roci0+dGgudGhfZnJlZV9saXN0c1tpbmRleF0udGhfZnJlZV9saXN0X3N5bmMgKTsKKyAgICAgICAgfQorICAgICAgICAvLyBwdXNoIHRoZSByZXN0IG9mIGNoYWluIGludG8gbm8tc3luYyBmcmVlIGxpc3QgKGNhbiBiZSBOVUxMIGlmIHRoZXJlIHdhcyB0aGUgb25seSBibG9jaykKKyAgICAgICAgdGhpc190aHItPnRoLnRoX2ZyZWVfbGlzdHNbaW5kZXhdLnRoX2ZyZWVfbGlzdF9zZWxmID0gKigodm9pZCAqKilwdHIpOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0aGlzX3RociA9PQorICAgICAgICAgICAgKChrbXBfbWVtX2Rlc2NyX3QgKikoIChrbXBfdWludHB0cl90KXB0ciAtIHNpemVvZihrbXBfbWVtX2Rlc2NyX3QpICkpLT5wdHJfYWxpZ25lZCApOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisKKyAgICBhbGxvY19jYWxsOgorICAgIC8vIGhhdmVuJ3QgZm91bmQgYmxvY2sgaW4gdGhlIGZyZWUgbGlzdHMsIHRodXMgYWxsb2NhdGUgaXQKKyAgICBzaXplID0gbnVtX2xpbmVzICogRENBQ0hFX0xJTkU7CisKKyAgICBhbGxvY19zaXplID0gc2l6ZSArIHNpemVvZigga21wX21lbV9kZXNjcl90ICkgKyBEQ0FDSEVfTElORTsKKyAgICBLRV9UUkFDRSggMjUsICggIl9fa21wX2Zhc3RfYWxsb2NhdGU6IFQjJWQgQ2FsbGluZyBfX2ttcF90aHJlYWRfbWFsbG9jIHdpdGggYWxsb2Nfc2l6ZSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aGlzX3RociApLCBhbGxvY19zaXplICkgKTsKKyAgICBhbGxvY19wdHIgPSBiZ2V0KCB0aGlzX3RociwgKGJ1ZnNpemUpIGFsbG9jX3NpemUgKTsKKworICAgIC8vIGFsaWduIHB0ciB0byBEQ0FDSEVfTElORQorICAgIHB0ciA9ICh2b2lkICopKCggKChrbXBfdWludHB0cl90KWFsbG9jX3B0cikgKyBzaXplb2Yoa21wX21lbV9kZXNjcl90KSArIERDQUNIRV9MSU5FICkgJiB+KCBEQ0FDSEVfTElORSAtIDEgKSk7CisgICAgZGVzY3IgPSAoa21wX21lbV9kZXNjcl90ICopKCAoKGttcF91aW50cHRyX3QpcHRyKSAtIHNpemVvZihrbXBfbWVtX2Rlc2NyX3QpICk7CisKKyAgICBkZXNjci0+cHRyX2FsbG9jYXRlZCA9IGFsbG9jX3B0cjsgICAgICAgIC8vIHJlbWVtYmVyIGFsbG9jYXRlZCBwb2ludGVyCisgICAgLy8gd2UgZG9uJ3QgbmVlZCBzaXplX2FsbG9jYXRlZAorICAgIGRlc2NyLT5wdHJfYWxpZ25lZCAgID0gKHZvaWQgKil0aGlzX3RocjsgLy8gcmVtZW1iZXIgYWxsb2NhdGluZyB0aHJlYWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIChpdCBpcyBhbHJlYWR5IHNhdmVkIGluIGJnZXQgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnV0IHdlIG1heSB3YW50IHRvIHVzZSBhbm90aGVyIGFsbG9jYXRvciBpbiBmdXR1cmUpCisgICAgZGVzY3ItPnNpemVfYWxpZ25lZCAgPSBzaXplOworCisgICAgZW5kOgorICAgIEtFX1RSQUNFKCAyNSwgKCAiPC0gX19rbXBfZmFzdF9hbGxvY2F0ZSggVCMlZCApIHJldHVybnMgJXBcbiIsCisgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRoaXNfdGhyICksIHB0ciApICk7CisgICAgcmV0dXJuIHB0cjsKK30gLy8gZnVuYyBfX2ttcF9mYXN0X2FsbG9jYXRlCisKKy8vIEZyZWUgZmFzdCBtZW1vcnkgYW5kIHBsYWNlIGl0IG9uIHRoZSB0aHJlYWQncyBmcmVlIGxpc3QgaWYgaXQgaXMgb2YKKy8vIHRoZSBjb3JyZWN0IHNpemUuCit2b2lkCitfX19rbXBfZmFzdF9mcmVlKCBrbXBfaW5mb190ICp0aGlzX3Rociwgdm9pZCAqIHB0ciBLTVBfU1JDX0xPQ19ERUNMICkKK3sKKyAgICBrbXBfbWVtX2Rlc2NyX3QgKiBkZXNjcjsKKyAgICBrbXBfaW5mb190ICAgICAgKiBhbGxvY190aHI7CisgICAgc2l6ZV90ICAgICAgICAgICAgc2l6ZTsKKyAgICBzaXplX3QgICAgICAgICAgICBpZHg7CisgICAgaW50ICAgICAgICAgICAgICAgaW5kZXg7CisKKyAgICBLRV9UUkFDRSggMjUsICggIi0+IF9fa21wX2Zhc3RfZnJlZSggVCMlZCwgJXAgKSBjYWxsZWQgZnJvbSAlczolZFxuIiwKKyAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQodGhpc190aHIpLCBwdHIgS01QX1NSQ19MT0NfUEFSTSApICk7CisgICAgS01QX0FTU0VSVCggcHRyICE9IE5VTEwgKTsKKworICAgIGRlc2NyID0gKGttcF9tZW1fZGVzY3JfdCAqKSggKChrbXBfdWludHB0cl90KXB0cikgLSBzaXplb2Yoa21wX21lbV9kZXNjcl90KSApOworCisgICAgS0VfVFJBQ0UoMjYsICgiICAgX19rbXBfZmFzdF9mcmVlOiAgICAgc2l6ZV9hbGlnbmVkPSVkXG4iLAorICAgICAgICAgICAgICAgICAgKGludCkgZGVzY3ItPnNpemVfYWxpZ25lZCApICk7CisKKyAgICBzaXplID0gZGVzY3ItPnNpemVfYWxpZ25lZDsgLy8gMiwgNCwgMTYsIDY0LCA2NSwgNjYsIC4uLiBjYWNoZSBsaW5lcworCisgICAgaWR4ID0gRENBQ0hFX0xJTkUgKiAyOyAvLyAyIGNhY2hlIGxpbmVzIGlzIG1pbmltYWwgc2l6ZSBvZiBibG9jaworICAgIGlmICggaWR4ID09IHNpemUgKSB7CisgICAgICAgIGluZGV4ID0gMDsgICAgICAgLy8gMiBjYWNoZSBsaW5lcworICAgIH0gZWxzZSBpZiAoICggaWR4IDw8PSAxICkgPT0gc2l6ZSApIHsKKyAgICAgICAgaW5kZXggPSAxOyAgICAgICAvLyA0IGNhY2hlIGxpbmVzCisgICAgfSBlbHNlIGlmICggKCBpZHggPDw9IDIgKSA9PSBzaXplICkgeworICAgICAgICBpbmRleCA9IDI7ICAgICAgIC8vIDE2IGNhY2hlIGxpbmVzCisgICAgfSBlbHNlIGlmICggKCBpZHggPDw9IDIgKSA9PSBzaXplICkgeworICAgICAgICBpbmRleCA9IDM7ICAgICAgIC8vIDY0IGNhY2hlIGxpbmVzCisgICAgfSBlbHNlIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggc2l6ZSA+IERDQUNIRV9MSU5FICogNjQgKTsKKyAgICAgICAgZ290byBmcmVlX2NhbGw7ICAvLyA2NSBvciBtb3JlIGNhY2hlIGxpbmVzICggPiA4S0IgKQorICAgIH0KKworICAgIGFsbG9jX3RociA9IChrbXBfaW5mb190ICopZGVzY3ItPnB0cl9hbGlnbmVkOyAvLyBnZXQgdGhyZWFkIG93bmluZyB0aGUgYmxvY2sKKyAgICBpZiAoIGFsbG9jX3RociA9PSB0aGlzX3RociApIHsKKyAgICAgICAgLy8gcHVzaCBibG9jayB0byBzZWxmIG5vLXN5bmMgZnJlZSBsaXN0LCBsaW5raW5nIHByZXZpb3VzIGhlYWQgKExJRk8pCisgICAgICAgICooKHZvaWQgKiopcHRyKSA9IHRoaXNfdGhyLT50aC50aF9mcmVlX2xpc3RzW2luZGV4XS50aF9mcmVlX2xpc3Rfc2VsZjsKKyAgICAgICAgdGhpc190aHItPnRoLnRoX2ZyZWVfbGlzdHNbaW5kZXhdLnRoX2ZyZWVfbGlzdF9zZWxmID0gcHRyOworICAgIH0gZWxzZSB7CisgICAgICAgIHZvaWQgKiBoZWFkID0gdGhpc190aHItPnRoLnRoX2ZyZWVfbGlzdHNbaW5kZXhdLnRoX2ZyZWVfbGlzdF9vdGhlcjsKKyAgICAgICAgaWYgKCBoZWFkID09IE5VTEwgKSB7CisgICAgICAgICAgICAvLyBDcmVhdGUgbmV3IGZyZWUgbGlzdAorICAgICAgICAgICAgdGhpc190aHItPnRoLnRoX2ZyZWVfbGlzdHNbaW5kZXhdLnRoX2ZyZWVfbGlzdF9vdGhlciA9IHB0cjsKKyAgICAgICAgICAgICooKHZvaWQgKiopcHRyKSA9IE5VTEw7ICAgICAgICAgICAgIC8vIG1hcmsgdGhlIHRhaWwgb2YgdGhlIGxpc3QKKyAgICAgICAgICAgIGRlc2NyLT5zaXplX2FsbG9jYXRlZCA9IChzaXplX3QpMTsgIC8vIGhlYWQgb2YgdGhlIGxpc3Qga2VlcHMgaXRzIGxlbmd0aAorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gbmVlZCB0byBjaGVjayBleGlzdGVkICJvdGhlciIgbGlzdCdzIG93bmVyIHRocmVhZCBhbmQgc2l6ZSBvZiBxdWV1ZQorICAgICAgICAgICAga21wX21lbV9kZXNjcl90ICogZHNjICA9IChrbXBfbWVtX2Rlc2NyX3QgKikoIChjaGFyKiloZWFkIC0gc2l6ZW9mKGttcF9tZW1fZGVzY3JfdCkgKTsKKyAgICAgICAgICAgIGttcF9pbmZvX3QgICAgICAqIHFfdGggPSAoa21wX2luZm9fdCAqKShkc2MtPnB0cl9hbGlnbmVkKTsgLy8gYWxsb2NhdGluZyB0aHJlYWQsIHNhbWUgZm9yIGFsbCBxdWV1ZSBub2RlcworICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgcV9zeiA9IGRzYy0+c2l6ZV9hbGxvY2F0ZWQgKyAxOyAgICAgICAgICAvLyBuZXcgc2l6ZSBpbiBjYXNlIHdlIGFkZCBjdXJyZW50IHRhc2sKKyAgICAgICAgICAgIGlmICggcV90aCA9PSBhbGxvY190aHIgJiYgcV9zeiA8PSBLTVBfRlJFRV9MSVNUX0xJTUlUICkgeworICAgICAgICAgICAgICAgIC8vIHdlIGNhbiBhZGQgY3VycmVudCB0YXNrIHRvICJvdGhlciIgbGlzdCwgbm8gc3luYyBuZWVkZWQKKyAgICAgICAgICAgICAgICAqKCh2b2lkICoqKXB0cikgPSBoZWFkOworICAgICAgICAgICAgICAgIGRlc2NyLT5zaXplX2FsbG9jYXRlZCA9IHFfc3o7CisgICAgICAgICAgICAgICAgdGhpc190aHItPnRoLnRoX2ZyZWVfbGlzdHNbaW5kZXhdLnRoX2ZyZWVfbGlzdF9vdGhlciA9IHB0cjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gZWl0aGVyIHF1ZXVlIGJsb2NrcyBvd25lciBpcyBjaGFuZ2luZyBvciBzaXplIGxpbWl0IGV4Y2VlZGVkCisgICAgICAgICAgICAgICAgLy8gcmV0dXJuIG9sZCBxdWV1ZSB0byBhbGxvY2F0aW5nIHRocmVhZCAocV90aCkgc3luY2hyb25lb3VzbHksCisgICAgICAgICAgICAgICAgLy8gYW5kIHN0YXJ0IG5ldyBsaXN0IGZvciBhbGxvY190aHIncyB0YXNrcworICAgICAgICAgICAgICAgIHZvaWQgKiBvbGRfcHRyOworICAgICAgICAgICAgICAgIHZvaWQgKiB0YWlsID0gaGVhZDsKKyAgICAgICAgICAgICAgICB2b2lkICogbmV4dCA9ICooKHZvaWQgKiopaGVhZCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKCBuZXh0ICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBxdWV1ZSBzaXplIHNob3VsZCBkZWNyZWFzZSBieSAxIGVhY2ggc3RlcCB0aHJvdWdoIHRoZSBsaXN0CisgICAgICAgICAgICAgICAgICAgICAgICAoKGttcF9tZW1fZGVzY3JfdCopKChjaGFyKiluZXh0IC0gc2l6ZW9mKGttcF9tZW1fZGVzY3JfdCkpKS0+c2l6ZV9hbGxvY2F0ZWQgKyAxID09CisgICAgICAgICAgICAgICAgICAgICAgICAoKGttcF9tZW1fZGVzY3JfdCopKChjaGFyKil0YWlsIC0gc2l6ZW9mKGttcF9tZW1fZGVzY3JfdCkpKS0+c2l6ZV9hbGxvY2F0ZWQgKTsKKyAgICAgICAgICAgICAgICAgICAgdGFpbCA9IG5leHQ7ICAgLy8gcmVtZW1iZXIgdGFpbCBub2RlCisgICAgICAgICAgICAgICAgICAgIG5leHQgPSAqKCh2b2lkICoqKW5leHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBxX3RoICE9IE5VTEwgKTsKKyAgICAgICAgICAgICAgICAvLyBwdXNoIGJsb2NrIHRvIG93bmVyJ3Mgc3luYyBmcmVlIGxpc3QKKyAgICAgICAgICAgICAgICBvbGRfcHRyID0gVENSX1BUUiggcV90aC0+dGgudGhfZnJlZV9saXN0c1tpbmRleF0udGhfZnJlZV9saXN0X3N5bmMgKTsKKyAgICAgICAgICAgICAgICAvKiB0aGUgbmV4dCBwb2ludGVyIG11c3QgYmUgc2V0IGJlZm9yZSBzZXR0aW5nIGZyZWVfbGlzdCB0byBwdHIgdG8gYXZvaWQKKyAgICAgICAgICAgICAgICAgICBleHBvc2luZyBhIGJyb2tlbiBsaXN0IHRvIG90aGVyIHRocmVhZHMsIGV2ZW4gZm9yIGFuIGluc3RhbnQuICovCisgICAgICAgICAgICAgICAgKigodm9pZCAqKil0YWlsKSA9IG9sZF9wdHI7CisKKyAgICAgICAgICAgICAgICB3aGlsZSAoICEgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1BUUigKKyAgICAgICAgICAgICAgICAgICAgJnFfdGgtPnRoLnRoX2ZyZWVfbGlzdHNbaW5kZXhdLnRoX2ZyZWVfbGlzdF9zeW5jLAorICAgICAgICAgICAgICAgICAgICBvbGRfcHRyLAorICAgICAgICAgICAgICAgICAgICBoZWFkICkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX0NQVV9QQVVTRSgpOworICAgICAgICAgICAgICAgICAgICBvbGRfcHRyID0gVENSX1BUUiggcV90aC0+dGgudGhfZnJlZV9saXN0c1tpbmRleF0udGhfZnJlZV9saXN0X3N5bmMgKTsKKyAgICAgICAgICAgICAgICAgICAgKigodm9pZCAqKil0YWlsKSA9IG9sZF9wdHI7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gc3RhcnQgbmV3IGxpc3Qgb2Ygbm90LXNlbHQgdGFza3MKKyAgICAgICAgICAgICAgICB0aGlzX3Roci0+dGgudGhfZnJlZV9saXN0c1tpbmRleF0udGhfZnJlZV9saXN0X290aGVyID0gcHRyOworICAgICAgICAgICAgICAgICooKHZvaWQgKiopcHRyKSA9IE5VTEw7CisgICAgICAgICAgICAgICAgZGVzY3ItPnNpemVfYWxsb2NhdGVkID0gKHNpemVfdCkxOyAgLy8gaGVhZCBvZiBxdWV1ZSBrZWVwcyBpdHMgbGVuZ3RoCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZ290byBlbmQ7CisKKyAgICBmcmVlX2NhbGw6CisgICAgS0VfVFJBQ0UoMjUsICggIl9fa21wX2Zhc3RfZnJlZTogVCMlZCBDYWxsaW5nIF9fa21wX3RocmVhZF9mcmVlIGZvciBzaXplICVkXG4iLAorICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRoaXNfdGhyKSwgc2l6ZSApICk7CisgICAgX19rbXBfYmdldF9kZXF1ZXVlKCB0aGlzX3RociApOyAgICAgICAgIC8qIFJlbGVhc2UgYW55IHF1ZXVlZCBidWZmZXJzICovCisgICAgYnJlbCggdGhpc190aHIsIGRlc2NyLT5wdHJfYWxsb2NhdGVkICk7CisKKyAgICBlbmQ6CisgICAgS0VfVFJBQ0UoIDI1LCAoICI8LSBfX2ttcF9mYXN0X2ZyZWUoKSByZXR1cm5zXG4iICkgKTsKKworfSAvLyBmdW5jIF9fa21wX2Zhc3RfZnJlZQorCisKKy8vIEluaXRpYWxpemUgdGhlIHRocmVhZCBmcmVlIGxpc3RzIHJlbGF0ZWQgdG8gZmFzdCBtZW1vcnkKKy8vIE9ubHkgZG8gdGhpcyB3aGVuIGEgdGhyZWFkIGlzIGluaXRpYWxseSBjcmVhdGVkLgordm9pZAorX19rbXBfaW5pdGlhbGl6ZV9mYXN0X21lbW9yeSgga21wX2luZm9fdCAqdGhpc190aHIgKQoreworICAgIEtFX1RSQUNFKDEwLCAoICJfX2ttcF9pbml0aWFsaXplX2Zhc3RfbWVtb3J5OiBDYWxsZWQgZnJvbSB0aCAlcFxuIiwgdGhpc190aHIgKSApOworCisgICAgbWVtc2V0ICggdGhpc190aHItPnRoLnRoX2ZyZWVfbGlzdHMsIDAsIE5VTV9MSVNUUyAqIHNpemVvZigga21wX2ZyZWVfbGlzdF90ICkgKTsKK30KKworLy8gRnJlZSB0aGUgbWVtb3J5IGluIHRoZSB0aHJlYWQgZnJlZSBsaXN0cyByZWxhdGVkIHRvIGZhc3QgbWVtb3J5CisvLyBPbmx5IGRvIHRoaXMgd2hlbiBhIHRocmVhZCBpcyBiZWluZyByZWFwZWQgKGRlc3Ryb3llZCkuCit2b2lkCitfX2ttcF9mcmVlX2Zhc3RfbWVtb3J5KCBrbXBfaW5mb190ICp0aCApCit7CisgICAgLy8gU3VwcG9zZSB3ZSB1c2UgQkdFVCB1bmRlcmx5aW5nIGFsbG9jYXRvciwgd2FsayB0aHJvdWdoIGl0cyBzdHJ1Y3R1cmVzLi4uCisgICAgaW50ICAgICAgICAgIGJpbjsKKyAgICB0aHJfZGF0YV90ICogdGhyID0gZ2V0X3Rocl9kYXRhKCB0aCApOworICAgIHZvaWQgICAgICAqKiBsc3QgPSBOVUxMOworCisgICAgS0VfVFJBQ0UoNSwgKCAiX19rbXBfZnJlZV9mYXN0X21lbW9yeTogQ2FsbGVkIFQjJWRcbiIsCisgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGggKSApICk7CisKKyAgICBfX2ttcF9iZ2V0X2RlcXVldWUoIHRoICk7ICAgICAgICAgLy8gUmVsZWFzZSBhbnkgcXVldWVkIGJ1ZmZlcnMKKworICAgIC8vIERpZyB0aHJvdWdoIGZyZWUgbGlzdHMgYW5kIGV4dHJhY3QgYWxsIGFsbG9jYXRlZCBibG9ja3MKKyAgICBmb3IgKCBiaW4gPSAwOyBiaW4gPCBNQVhfQkdFVF9CSU5TOyArK2JpbiApIHsKKyAgICAgICAgYmZoZWFkX3QgKiBiID0gdGhyLT5mcmVlbGlzdFsgYmluIF0ucWwuZmxpbms7CisgICAgICAgIHdoaWxlICggYiAhPSAmdGhyLT5mcmVlbGlzdFsgYmluIF0gKSB7CisgICAgICAgICAgICBpZiAoIChrbXBfdWludHB0cl90KWItPmJoLmJiLmJ0aHIgJiAxICkgeyAgIC8vIGlmIHRoZSBidWZmZXIgaXMgYW4gYWxsb2NhdGVkIGFkZHJlc3M/CisgICAgICAgICAgICAgICAgKigodm9pZCoqKWIpID0gbHN0OyAgIC8vIGxpbmsgdGhlIGxpc3QgKG92ZXJyaWRlIGJ0aHIsIGJ1dCBrZWVwIGZsaW5rIHlldCkKKyAgICAgICAgICAgICAgICBsc3QgPSAodm9pZCoqKWI7ICAgICAgLy8gcHVzaCBiIGludG8gbHN0CisgICAgICAgICAgICB9CisgICAgICAgICAgICBiID0gYi0+cWwuZmxpbms7ICAgICAgICAgIC8vIGdldCBuZXh0IGJ1ZmZlcgorICAgICAgICB9CisgICAgfQorICAgIHdoaWxlICggbHN0ICE9IE5VTEwgKSB7CisgICAgICAgIHZvaWQgKiBuZXh0ID0gKmxzdDsKKyAgICAgICAgS0VfVFJBQ0UoMTAsICggIl9fa21wX2ZyZWVfZmFzdF9tZW1vcnk6IGZyZWVpbmcgJXAsIG5leHQ9JXAgdGggJXAgKCVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBsc3QsIG5leHQsIHRoLCBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aCApICkgKTsKKyAgICAgICAgKCp0aHItPnJlbGZjbikobHN0KTsKKyAgICAgICAgI2lmIEJ1ZlN0YXRzCisgICAgICAgICAgICAvLyBjb3VudCBibG9ja3MgdG8gcHJldmVudCBwcm9ibGVtcyBpbiBfX2ttcF9maW5hbGl6ZV9iZ2V0KCkKKyAgICAgICAgICAgIHRoci0+bnVtcHJlbCsrOyAgICAgICAvKiBOciBvZiBleHBhbnNpb24gYmxvY2sgcmVsZWFzZXMgKi8KKyAgICAgICAgICAgIHRoci0+bnVtcGJsay0tOyAgICAgICAvKiBUb3RhbCBudW1iZXIgb2YgYmxvY2tzICovCisgICAgICAgICNlbmRpZgorICAgICAgICBsc3QgPSAodm9pZCoqKW5leHQ7CisgICAgfQorCisgICAgS0VfVFJBQ0UoNSwgKCAiX19rbXBfZnJlZV9mYXN0X21lbW9yeTogRnJlZWQgVCMlZFxuIiwKKyAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRoICkgKSApOworfQorCisjZW5kaWYgLy8gVVNFX0ZBU1RfTUVNT1JZCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfYXRvbWljLmMgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfYXRvbWljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYxM2M2ZAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9hdG9taWMuYwpAQCAtMCwwICsxLDI5MTAgQEAKKy8qCisgKiBrbXBfYXRvbWljLmMgLS0gQVRPTUlDIGltcGxlbWVudGF0aW9uIHJvdXRpbmVzCisgKiAkUmV2aXNpb246IDQzNDIxICQKKyAqICREYXRlOiAyMDE0LTA4LTI4IDA4OjU2OjEwIC0wNTAwIChUaHUsIDI4IEF1ZyAyMDE0KSAkCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJrbXBfYXRvbWljLmgiCisjaW5jbHVkZSAia21wLmgiICAgICAgICAgICAgICAgICAgLy8gVFJVRSwgYXNtIHJvdXRpbmVzIHByb3RvdHlwZXMKKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIHVjaGFyOwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB1c2hvcnQ7CisKKy8qIQorQGRlZmdyb3VwIEFUT01JQ19PUFMgQXRvbWljIE9wZXJhdGlvbnMKK1RoZXNlIGZ1bmN0aW9ucyBhcmUgdXNlZCBmb3IgaW1wbGVtZW50aW5nIHRoZSBtYW55IGRpZmZlcmVudCB2YXJpZXRpZXMgb2YgYXRvbWljIG9wZXJhdGlvbnMuCisKK1RoZSBjb21waWxlciBpcyBhdCBsaWJlcnR5IHRvIGlubGluZSBhdG9taWMgb3BlcmF0aW9ucyB0aGF0IGFyZSBuYXR1cmFsbHkgc3VwcG9ydGVkCitieSB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS4gRm9yIGluc3RhbmNlIG9uIElBLTMyIGFyY2hpdGVjdHVyZSBhbiBhdG9taWMgbGlrZSB0aGlzIGNhbiBiZSBpbmxpbmVkCitAY29kZQorc3RhdGljIGludCBzID0gMDsKKyNwcmFnbWEgb21wIGF0b21pYworICAgIHMrKzsKK0BlbmRjb2RlCit1c2luZyB0aGUgc2luZ2xlIGluc3RydWN0aW9uOiBgbG9jazsgaW5jbCBzYAorCitIb3dldmVyIHRoZSBydW50aW1lIGRvZXMgcHJvdmlkZSBlbnRyeXBvaW50cyBmb3IgdGhlc2Ugb3BlcmF0aW9ucyB0byBzdXBwb3J0IGNvbXBpbGVycyB0aGF0IGNob29zZQorbm90IHRvIGlubGluZSB0aGVtLiAoRm9yIGluc3RhbmNlLCBgX19rbXBjX2F0b21pY19maXhlZDRfYWRkYCBjb3VsZCBiZSB1c2VkIHRvIHBlcmZvcm0gdGhlCitpbmNyZW1lbnQgYWJvdmUuKQorCitUaGUgbmFtZXMgb2YgdGhlIGZ1bmN0aW9ucyBhcmUgZW5jb2RlZCBieSB1c2luZyB0aGUgZGF0YSB0eXBlIG5hbWUgYW5kIHRoZSBvcGVyYXRpb24gbmFtZSwgYXMgaW4gdGhlc2UgdGFibGVzLgorCitEYXRhIFR5cGUgIHwgRGF0YSB0eXBlIGVuY29kaW5nCistLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0KK2ludDhfdCAgICAgfCBgZml4ZWQxYAordWludDhfdCAgICB8IGBmaXhlZDF1YAoraW50MTZfdCAgICB8IGBmaXhlZDJgCit1aW50MTZfdCAgIHwgYGZpeGVkMnVgCitpbnQzMl90ICAgIHwgYGZpeGVkNGAKK3VpbnQzMl90ICAgfCBgZml4ZWQ0dWAKK2ludDMyX3QgICAgfCBgZml4ZWQ4YAordWludDMyX3QgICB8IGBmaXhlZDh1YAorZmxvYXQgICAgICB8IGBmbG9hdDRgCitkb3VibGUgICAgIHwgYGZsb2F0OGAKK2Zsb2F0IDEwICg4MDg3IGVpZ2h0eSBiaXQgZmxvYXQpICB8IGBmbG9hdDEwYAorY29tcGxleDxmbG9hdD4gICB8ICBgY21wbHg0YAorY29tcGxleDxkb3VibGU+ICB8IGBjbXBseDhgCitjb21wbGV4PGZsb2F0MTA+IHwgYGNtcGx4MTBgCis8YnI+CisKK09wZXJhdGlvbiB8IE9wZXJhdGlvbiBlbmNvZGluZworLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tCisrIHwgYWRkCistIHwgc3ViCitcKiB8IG11bAorLyB8IGRpdgorJiB8IGFuZGIKKzw8IHwgc2hsCitcPlw+IHwgc2hyCitcfCB8IG9yYgorXiAgfCB4b3IKKyYmIHwgYW5kbAorXHxcfCB8IG9ybAorbWF4aW11bSB8IG1heAorbWluaW11bSB8IG1pbgorLmVxdi4gICB8IGVxdgorLm5lcXYuICB8IG5lcXYKKworPGJyPgorRm9yIG5vbi1jb21tdXRhdGl2ZSBvcGVyYXRpb25zLCBgX3JldmAgY2FuIGFsc28gYmUgYWRkZWQgZm9yIHRoZSByZXZlcnNlZCBvcGVyYXRpb24uCitGb3IgdGhlIGZ1bmN0aW9ucyB0aGF0IGNhcHR1cmUgdGhlIHJlc3VsdCwgdGhlIHN1ZmZpeCBgX2NwdGAgaXMgYWRkZWQuCisKK1VwZGF0ZSBGdW5jdGlvbnMKKz09PT09PT09PT09PT09PT0KK1RoZSBnZW5lcmFsIGZvcm0gb2YgYW4gYXRvbWljIGZ1bmN0aW9uIHRoYXQganVzdCBwZXJmb3JtcyBhbiB1cGRhdGUgKHdpdGhvdXQgYSBgY2FwdHVyZWApCitAY29kZQordm9pZCBfX2ttcGNfYXRvbWljXzxkYXRhdHlwZT5fPG9wZXJhdGlvbj4oIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFRZUEUgKiBsaHMsIFRZUEUgcmhzICk7CitAZW5kY29kZQorQHBhcmFtIGlkZW50X3QgIGEgcG9pbnRlciB0byBzb3VyY2UgbG9jYXRpb24KK0BwYXJhbSBndGlkICB0aGUgZ2xvYmFsIHRocmVhZCBpZAorQHBhcmFtIGxocyAgIGEgcG9pbnRlciB0byB0aGUgbGVmdCBvcGVyYW5kCitAcGFyYW0gcmhzICAgdGhlIHJpZ2h0IG9wZXJhbmQKKworYGNhcHR1cmVgIGZ1bmN0aW9ucworPT09PT09PT09PT09PT09PT09PQorVGhlIGNhcHR1cmUgZnVuY3Rpb25zIHBlcmZvcm0gYW4gYXRvbWljIHVwZGF0ZSBhbmQgcmV0dXJuIGEgcmVzdWx0LCB3aGljaCBpcyBlaXRoZXIgdGhlIHZhbHVlCitiZWZvcmUgdGhlIGNhcHR1cmUsIG9yIHRoYXQgYWZ0ZXIuIFRoZXkgdGFrZSBhbiBhZGRpdGlvbmFsIGFyZ3VtZW50IHRvIGRldGVybWluZSB3aGljaCByZXN1bHQgaXMgcmV0dXJuZWQuCitUaGVpciBnZW5lcmFsIGZvcm0gaXMgdGhlcmVmb3JlCitAY29kZQorVFlQRSBfX2ttcGNfYXRvbWljXzxkYXRhdHlwZT5fPG9wZXJhdGlvbj5fY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBUWVBFICogbGhzLCBUWVBFIHJocywgaW50IGZsYWcgKTsKK0BlbmRjb2RlCitAcGFyYW0gaWRlbnRfdCAgYSBwb2ludGVyIHRvIHNvdXJjZSBsb2NhdGlvbgorQHBhcmFtIGd0aWQgIHRoZSBnbG9iYWwgdGhyZWFkIGlkCitAcGFyYW0gbGhzICAgYSBwb2ludGVyIHRvIHRoZSBsZWZ0IG9wZXJhbmQKK0BwYXJhbSByaHMgICB0aGUgcmlnaHQgb3BlcmFuZAorQHBhcmFtIGZsYWcgIG9uZSBpZiB0aGUgcmVzdWx0IGlzIHRvIGJlIGNhcHR1cmVkICphZnRlciogdGhlIG9wZXJhdGlvbiwgemVybyBpZiBjYXB0dXJlZCAqYmVmb3JlKi4KKworVGhlIG9uZSBzZXQgb2YgZXhjZXB0aW9ucyB0byB0aGlzIGlzIHRoZSBgY29tcGxleDxmbG9hdD5gIHR5cGUgd2hlcmUgdGhlIHZhbHVlIGlzIG5vdCByZXR1cm5lZCwKK3JhdGhlciBhbiBleHRyYSBhcmd1bWVudCBwb2ludGVyIGlzIHBhc3NlZC4KKworVGhleSBsb29rIGxpa2UKK0Bjb2RlCit2b2lkIF9fa21wY19hdG9taWNfY21wbHg0XzxvcD5fY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MzIgKiBsaHMsIGttcF9jbXBseDMyIHJocywga21wX2NtcGx4MzIgKiBvdXQsIGludCBmbGFnICk7CitAZW5kY29kZQorCitSZWFkIGFuZCBXcml0ZSBPcGVyYXRpb25zCis9PT09PT09PT09PT09PT09PT09PT09PT09CitUaGUgT3Blbk1QPHN1cD4qPC9zdXA+IHN0YW5kYXJkIG5vdyBzdXBwb3J0cyBhdG9taWMgb3BlcmF0aW9ucyB0aGF0IHNpbXBseSBlbnN1cmUgdGhhdCB0aGUKK3ZhbHVlIGlzIHJlYWQgb3Igd3JpdHRlbiBhdG9taWNhbGx5LCB3aXRoIG5vIG1vZGlmaWNhdGlvbgorcGVyZm9ybWVkLiBJbiBtYW55IGNhc2VzIG9uIElBLTMyIGFyY2hpdGVjdHVyZSB0aGVzZSBvcGVyYXRpb25zIGNhbiBiZSBpbmxpbmVkIHNpbmNlCit0aGUgYXJjaGl0ZWN0dXJlIGd1YXJhbnRlZXMgdGhhdCBubyB0ZWFyaW5nIG9jY3VycyBvbiBhbGlnbmVkIG9iamVjdHMKK2FjY2Vzc2VkIHdpdGggYSBzaW5nbGUgbWVtb3J5IG9wZXJhdGlvbiBvZiB1cCB0byA2NCBiaXRzIGluIHNpemUuCisKK1RoZSBnZW5lcmFsIGZvcm0gb2YgdGhlIHJlYWQgb3BlcmF0aW9ucyBpcworQGNvZGUKK1RZUEUgX19rbXBjX2F0b21pY188dHlwZT5fcmQgKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBUWVBFICogbG9jICk7CitAZW5kY29kZQorCitGb3IgdGhlIHdyaXRlIG9wZXJhdGlvbnMgdGhlIGZvcm0gaXMKK0Bjb2RlCit2b2lkIF9fa21wY19hdG9taWNfPHR5cGU+X3dyICggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgVFlQRSAqIGxocywgVFlQRSByaHMgKTsKK0BlbmRjb2RlCisKK0Z1bGwgbGlzdCBvZiBmdW5jdGlvbnMKKz09PT09PT09PT09PT09PT09PT09PT0KK1RoaXMgbGVhZHMgdG8gdGhlIGdlbmVyYXRpb24gb2YgMzc2IGF0b21pYyBmdW5jdGlvbnMsIGFzIGZvbGxvd3MuCisKK0Z1bmN0b25zIGZvciBpbnRlZ2VycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUaGVyZSBhcmUgdmVyc2lvbnMgaGVyZSBmb3IgaW50ZWdlcnMgb2Ygc2l6ZSAxLDIsNCBhbmQgOCBieXRlcyBib3RoIHNpZ25lZCBhbmQgdW5zaWduZWQgKHdoZXJlIHRoYXQgbWF0dGVycykuCitAY29kZQorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2FkZAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2FkZF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9hZGRfZnAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9hbmRiCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfYW5kYl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9hbmRsCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfYW5kbF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9kaXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9kaXZfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfZGl2X2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9kaXZfZmxvYXQ4CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfZGl2X2ZwCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfZGl2X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2VxdgorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2Vxdl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9tYXgKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9tYXhfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfbWluCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfbWluX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX211bAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX211bF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9tdWxfZmxvYXQ4CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfbXVsX2ZwCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfbmVxdgorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX25lcXZfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfb3JiCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfb3JiX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX29ybAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX29ybF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9yZAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3NobAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3NobF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zaGxfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3NobF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zaHIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zaHJfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfc2hyX2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zaHJfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfc3ViCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfc3ViX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3N1Yl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfc3ViX2ZwCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfc3ViX3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3N3cAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3dyCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfeG9yCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfeG9yX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxdV9kaXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfZGl2X2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxdV9kaXZfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQxdV9kaXZfZnAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfZGl2X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQxdV9zaHIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfc2hyX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxdV9zaHJfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQxdV9zaHJfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfYWRkCisgICAgX19rbXBjX2F0b21pY19maXhlZDJfYWRkX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2FkZF9mcAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2FuZGIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hbmRiX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2FuZGwKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hbmRsX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2RpdgorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2Rpdl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9kaXZfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2Rpdl9mbG9hdDgKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9kaXZfZnAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9kaXZfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfZXF2CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfZXF2X2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX21heAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX21heF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9taW4KKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9taW5fY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfbXVsCisgICAgX19rbXBjX2F0b21pY19maXhlZDJfbXVsX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX211bF9mbG9hdDgKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9tdWxfZnAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9uZXF2CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfbmVxdl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9vcmIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9vcmJfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfb3JsCisgICAgX19rbXBjX2F0b21pY19maXhlZDJfb3JsX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3JkCisgICAgX19rbXBjX2F0b21pY19maXhlZDJfc2hsCisgICAgX19rbXBjX2F0b21pY19maXhlZDJfc2hsX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3NobF9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfc2hsX3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3NocgorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3Nocl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaHJfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3Nocl9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zdWIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zdWJfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfc3ViX2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zdWJfZnAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zdWJfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfc3dwCisgICAgX19rbXBjX2F0b21pY19maXhlZDJfd3IKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl94b3IKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl94b3JfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDJ1X2RpdgorICAgIF9fa21wY19hdG9taWNfZml4ZWQydV9kaXZfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDJ1X2Rpdl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDJ1X2Rpdl9mcAorICAgIF9fa21wY19hdG9taWNfZml4ZWQydV9kaXZfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDJ1X3NocgorICAgIF9fa21wY19hdG9taWNfZml4ZWQydV9zaHJfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDJ1X3Nocl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDJ1X3Nocl9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hZGQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hZGRfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfYWRkX2ZwCisgICAgX19rbXBjX2F0b21pY19maXhlZDRfYW5kYgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2FuZGJfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfYW5kbAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2FuZGxfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfZGl2CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfZGl2X2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2Rpdl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfZGl2X2Zsb2F0OAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2Rpdl9mcAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2Rpdl9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9lcXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9lcXZfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfbWF4CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfbWF4X2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X21pbgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X21pbl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9tdWwKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9tdWxfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfbXVsX2Zsb2F0OAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X211bF9mcAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X25lcXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9uZXF2X2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X29yYgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X29yYl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9vcmwKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9vcmxfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfcmQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaGwKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaGxfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfc2hsX2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaGxfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfc2hyCisgICAgX19rbXBjX2F0b21pY19maXhlZDRfc2hyX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3Nocl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfc2hyX3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3N1YgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3N1Yl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zdWJfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3N1Yl9mcAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3N1Yl9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zd3AKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF93cgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3hvcgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3hvcl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfZGl2CisgICAgX19rbXBjX2F0b21pY19maXhlZDR1X2Rpdl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfZGl2X2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfZGl2X2ZwCisgICAgX19rbXBjX2F0b21pY19maXhlZDR1X2Rpdl9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfc2hyCisgICAgX19rbXBjX2F0b21pY19maXhlZDR1X3Nocl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfc2hyX2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfc2hyX3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2FkZAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2FkZF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9hZGRfZnAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9hbmRiCisgICAgX19rbXBjX2F0b21pY19maXhlZDhfYW5kYl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9hbmRsCisgICAgX19rbXBjX2F0b21pY19maXhlZDhfYW5kbF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9kaXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9kaXZfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfZGl2X2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9kaXZfZmxvYXQ4CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfZGl2X2ZwCisgICAgX19rbXBjX2F0b21pY19maXhlZDhfZGl2X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2VxdgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2Vxdl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9tYXgKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9tYXhfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfbWluCisgICAgX19rbXBjX2F0b21pY19maXhlZDhfbWluX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X211bAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X211bF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9tdWxfZmxvYXQ4CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfbXVsX2ZwCisgICAgX19rbXBjX2F0b21pY19maXhlZDhfbmVxdgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X25lcXZfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfb3JiCisgICAgX19rbXBjX2F0b21pY19maXhlZDhfb3JiX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X29ybAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X29ybF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9yZAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3NobAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3NobF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zaGxfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3NobF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zaHIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zaHJfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfc2hyX2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zaHJfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfc3ViCisgICAgX19rbXBjX2F0b21pY19maXhlZDhfc3ViX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3N1Yl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfc3ViX2ZwCisgICAgX19rbXBjX2F0b21pY19maXhlZDhfc3ViX3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3N3cAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3dyCisgICAgX19rbXBjX2F0b21pY19maXhlZDhfeG9yCisgICAgX19rbXBjX2F0b21pY19maXhlZDhfeG9yX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4dV9kaXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfZGl2X2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4dV9kaXZfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4dV9kaXZfZnAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfZGl2X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4dV9zaHIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfc2hyX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4dV9zaHJfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4dV9zaHJfcmV2CitAZW5kY29kZQorCitGdW5jdGlvbnMgZm9yIGZsb2F0aW5nIHBvaW50CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUaGVyZSBhcmUgdmVyc2lvbnMgaGVyZSBmb3IgZmxvYXRpbmcgcG9pbnQgbnVtYmVycyBvZiBzaXplIDQsIDgsIDEwIGFuZCAxNiBieXRlcy4KKyhUZW4gYnl0ZSBmbG9hdHMgYXJlIHVzZWQgYnkgWDg3LCBidXQgYXJlIG5vdyByYXJlKS4KK0Bjb2RlCisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfYWRkCisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfYWRkX2NwdAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X2FkZF9mbG9hdDgKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9hZGRfZnAKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9kaXYKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9kaXZfY3B0CisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfZGl2X2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9kaXZfZmxvYXQ4CisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfZGl2X2ZwCisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfZGl2X3JldgorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X21heAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X21heF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9taW4KKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9taW5fY3B0CisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfbXVsCisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfbXVsX2NwdAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X211bF9mbG9hdDgKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9tdWxfZnAKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9yZAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X3N1YgorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X3N1Yl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9zdWJfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X3N1Yl9mbG9hdDgKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9zdWJfZnAKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9zdWJfcmV2CisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfc3dwCisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfd3IKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9hZGQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9hZGRfY3B0CisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfYWRkX2ZwCisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfZGl2CisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfZGl2X2NwdAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X2Rpdl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfZGl2X2ZwCisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfZGl2X3JldgorICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X21heAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X21heF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9taW4KKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9taW5fY3B0CisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfbXVsCisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfbXVsX2NwdAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X211bF9mcAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X3JkCisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfc3ViCisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfc3ViX2NwdAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X3N1Yl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfc3ViX2ZwCisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfc3ViX3JldgorICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X3N3cAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X3dyCisgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX2FkZAorICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9hZGRfY3B0CisgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX2FkZF9mcAorICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9kaXYKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfZGl2X2NwdAorICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9kaXZfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9kaXZfZnAKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfZGl2X3JldgorICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9tdWwKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfbXVsX2NwdAorICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9tdWxfZnAKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfcmQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfc3ViCisgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX3N1Yl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfc3ViX2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfc3ViX2ZwCisgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX3N1Yl9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfc3dwCisgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX3dyCisgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X2FkZAorICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9hZGRfY3B0CisgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X2RpdgorICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9kaXZfY3B0CisgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X2Rpdl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X2Rpdl9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbWF4CisgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X21heF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbWluCisgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X21pbl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbXVsCisgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X211bF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfcmQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3ViCisgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X3N1Yl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3ViX2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3ViX3JldgorICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9zd3AKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfd3IKK0BlbmRjb2RlCisKK0Z1bmN0aW9ucyBmb3IgQ29tcGxleCB0eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitGdW5jdGlvbnMgZm9yIGNvbXBsZXggdHlwZXMgd2hvc2UgY29tcG9uZW50IGZsb2F0aW5nIHBvaW50IHZhcmlhYmxlcyBhcmUgb2Ygc2l6ZSA0LDgsMTAgb3IgMTYgYnl0ZXMuCitUaGUgbmFtZXMgaGVyZSBhcmUgYmFzZWQgb24gdGhlIHNpemUgb2YgdGhlIGNvbXBvbmVudCBmbG9hdCwgKm5vdCogdGhlIHNpemUgb2YgdGhlIGNvbXBsZXggdHlwZS4gU28KK2BfX2ttcGNfYXRvbWNfY21wbHg4X2FkZGAgaXMgYW4gb3BlcmF0aW9uIG9uIGEgYGNvbXBsZXg8ZG91YmxlPmAgb3IgYGNvbXBsZXgoa2luZD04KWAsICpub3QqIGBjb21wbGV4PGZsb2F0PmAuCisKK0Bjb2RlCisgICAgX19rbXBjX2F0b21pY19jbXBseDRfYWRkCisgICAgX19rbXBjX2F0b21pY19jbXBseDRfYWRkX2NtcGx4OAorICAgIF9fa21wY19hdG9taWNfY21wbHg0X2FkZF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9kaXYKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9kaXZfY21wbHg4CisgICAgX19rbXBjX2F0b21pY19jbXBseDRfZGl2X2NwdAorICAgIF9fa21wY19hdG9taWNfY21wbHg0X2Rpdl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19jbXBseDRfZGl2X3JldgorICAgIF9fa21wY19hdG9taWNfY21wbHg0X211bAorICAgIF9fa21wY19hdG9taWNfY21wbHg0X211bF9jbXBseDgKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9tdWxfY3B0CisgICAgX19rbXBjX2F0b21pY19jbXBseDRfcmQKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9zdWIKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9zdWJfY21wbHg4CisgICAgX19rbXBjX2F0b21pY19jbXBseDRfc3ViX2NwdAorICAgIF9fa21wY19hdG9taWNfY21wbHg0X3N1Yl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19jbXBseDRfc3ViX3JldgorICAgIF9fa21wY19hdG9taWNfY21wbHg0X3N3cAorICAgIF9fa21wY19hdG9taWNfY21wbHg0X3dyCisgICAgX19rbXBjX2F0b21pY19jbXBseDhfYWRkCisgICAgX19rbXBjX2F0b21pY19jbXBseDhfYWRkX2NwdAorICAgIF9fa21wY19hdG9taWNfY21wbHg4X2RpdgorICAgIF9fa21wY19hdG9taWNfY21wbHg4X2Rpdl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4OF9kaXZfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfY21wbHg4X2Rpdl9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4OF9tdWwKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4OF9tdWxfY3B0CisgICAgX19rbXBjX2F0b21pY19jbXBseDhfcmQKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4OF9zdWIKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4OF9zdWJfY3B0CisgICAgX19rbXBjX2F0b21pY19jbXBseDhfc3ViX2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4OF9zdWJfcmV2CisgICAgX19rbXBjX2F0b21pY19jbXBseDhfc3dwCisgICAgX19rbXBjX2F0b21pY19jbXBseDhfd3IKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTBfYWRkCisgICAgX19rbXBjX2F0b21pY19jbXBseDEwX2FkZF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTBfZGl2CisgICAgX19rbXBjX2F0b21pY19jbXBseDEwX2Rpdl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTBfZGl2X2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTBfZGl2X3JldgorICAgIF9fa21wY19hdG9taWNfY21wbHgxMF9tdWwKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTBfbXVsX2NwdAorICAgIF9fa21wY19hdG9taWNfY21wbHgxMF9yZAorICAgIF9fa21wY19hdG9taWNfY21wbHgxMF9zdWIKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTBfc3ViX2NwdAorICAgIF9fa21wY19hdG9taWNfY21wbHgxMF9zdWJfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfY21wbHgxMF9zdWJfcmV2CisgICAgX19rbXBjX2F0b21pY19jbXBseDEwX3N3cAorICAgIF9fa21wY19hdG9taWNfY21wbHgxMF93cgorICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9hZGQKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfYWRkX2NwdAorICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9kaXYKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfZGl2X2NwdAorICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9kaXZfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9kaXZfcmV2CisgICAgX19rbXBjX2F0b21pY19jbXBseDE2X211bAorICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9tdWxfY3B0CisgICAgX19rbXBjX2F0b21pY19jbXBseDE2X3JkCisgICAgX19rbXBjX2F0b21pY19jbXBseDE2X3N1YgorICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9zdWJfY3B0CisgICAgX19rbXBjX2F0b21pY19jbXBseDE2X3N1Yl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19jbXBseDE2X3N3cAorICAgIF9fa21wY19hdG9taWNfY21wbHgxNl93cgorQGVuZGNvZGUKKyovCisKKy8qIQorQGluZ3JvdXAgQVRPTUlDX09QUworQHsKKyovCisKKy8qCisgKiBHbG9iYWwgdmFycworICovCisKKyNpZm5kZWYgS01QX0dPTVBfQ09NUEFUCitpbnQgX19rbXBfYXRvbWljX21vZGUgPSAxOyAgICAgIC8vIEludGVsIHBlcmYKKyNlbHNlCitpbnQgX19rbXBfYXRvbWljX21vZGUgPSAyOyAgICAgIC8vIEdPTVAgY29tcGF0aWJpbGl0eQorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworCitLTVBfQUxJR04oMTI4KQorCitrbXBfYXRvbWljX2xvY2tfdCBfX2ttcF9hdG9taWNfbG9jazsgICAgIC8qIENvbnRyb2wgYWNjZXNzIHRvIGFsbCB1c2VyIGNvZGVkIGF0b21pY3MgaW4gR251IGNvbXBhdCBtb2RlICAgKi8KK2ttcF9hdG9taWNfbG9ja190IF9fa21wX2F0b21pY19sb2NrXzFpOyAgLyogQ29udHJvbCBhY2Nlc3MgdG8gYWxsIHVzZXIgY29kZWQgYXRvbWljcyBmb3IgMS1ieXRlIGZpeGVkIGRhdGEgdHlwZXMgKi8KK2ttcF9hdG9taWNfbG9ja190IF9fa21wX2F0b21pY19sb2NrXzJpOyAgLyogQ29udHJvbCBhY2Nlc3MgdG8gYWxsIHVzZXIgY29kZWQgYXRvbWljcyBmb3IgMi1ieXRlIGZpeGVkIGRhdGEgdHlwZXMgKi8KK2ttcF9hdG9taWNfbG9ja190IF9fa21wX2F0b21pY19sb2NrXzRpOyAgLyogQ29udHJvbCBhY2Nlc3MgdG8gYWxsIHVzZXIgY29kZWQgYXRvbWljcyBmb3IgNC1ieXRlIGZpeGVkIGRhdGEgdHlwZXMgKi8KK2ttcF9hdG9taWNfbG9ja190IF9fa21wX2F0b21pY19sb2NrXzRyOyAgLyogQ29udHJvbCBhY2Nlc3MgdG8gYWxsIHVzZXIgY29kZWQgYXRvbWljcyBmb3Iga21wX3JlYWwzMiBkYXRhIHR5cGUgICAgKi8KK2ttcF9hdG9taWNfbG9ja190IF9fa21wX2F0b21pY19sb2NrXzhpOyAgLyogQ29udHJvbCBhY2Nlc3MgdG8gYWxsIHVzZXIgY29kZWQgYXRvbWljcyBmb3IgOC1ieXRlIGZpeGVkIGRhdGEgdHlwZXMgKi8KK2ttcF9hdG9taWNfbG9ja190IF9fa21wX2F0b21pY19sb2NrXzhyOyAgLyogQ29udHJvbCBhY2Nlc3MgdG8gYWxsIHVzZXIgY29kZWQgYXRvbWljcyBmb3Iga21wX3JlYWw2NCBkYXRhIHR5cGUgICAgKi8KK2ttcF9hdG9taWNfbG9ja190IF9fa21wX2F0b21pY19sb2NrXzhjOyAgLyogQ29udHJvbCBhY2Nlc3MgdG8gYWxsIHVzZXIgY29kZWQgYXRvbWljcyBmb3IgY29tcGxleCBieXRlIGRhdGEgdHlwZSAgKi8KK2ttcF9hdG9taWNfbG9ja190IF9fa21wX2F0b21pY19sb2NrXzEwcjsgLyogQ29udHJvbCBhY2Nlc3MgdG8gYWxsIHVzZXIgY29kZWQgYXRvbWljcyBmb3IgbG9uZyBkb3VibGUgZGF0YSB0eXBlICAgKi8KK2ttcF9hdG9taWNfbG9ja190IF9fa21wX2F0b21pY19sb2NrXzE2cjsgLyogQ29udHJvbCBhY2Nlc3MgdG8gYWxsIHVzZXIgY29kZWQgYXRvbWljcyBmb3IgX1F1YWQgZGF0YSB0eXBlICAgICAgICAgKi8KK2ttcF9hdG9taWNfbG9ja190IF9fa21wX2F0b21pY19sb2NrXzE2YzsgLyogQ29udHJvbCBhY2Nlc3MgdG8gYWxsIHVzZXIgY29kZWQgYXRvbWljcyBmb3IgZG91YmxlIGNvbXBsZXggZGF0YSB0eXBlKi8KK2ttcF9hdG9taWNfbG9ja190IF9fa21wX2F0b21pY19sb2NrXzIwYzsgLyogQ29udHJvbCBhY2Nlc3MgdG8gYWxsIHVzZXIgY29kZWQgYXRvbWljcyBmb3IgbG9uZyBkb3VibGUgY29tcGxleCB0eXBlKi8KK2ttcF9hdG9taWNfbG9ja190IF9fa21wX2F0b21pY19sb2NrXzMyYzsgLyogQ29udHJvbCBhY2Nlc3MgdG8gYWxsIHVzZXIgY29kZWQgYXRvbWljcyBmb3IgX1F1YWQgY29tcGxleCBkYXRhIHR5cGUgKi8KKworCisvKgorICAyMDA3LTAzLTAyOgorICBXaXRob3V0ICJ2b2xhdGlsZSIgc3BlY2lmaWVyIGluIE9QX0NNUFhDSEcgYW5kIE1JTl9NQVhfQ01QWENIRyB3ZSBoYXZlIGEKKyAgYnVnIG9uICpfMzIgYW5kICpfMzJlLiBUaGlzIGlzIGp1c3QgYSB0ZW1wb3Jhcnkgd29ya2Fyb3VuZCBmb3IgdGhlIHByb2JsZW0uCisgIEl0IHNlZW1zIHRoZSByaWdodCBzb2x1dGlvbiBpcyB3cml0aW5nIE9QX0NNUFhDSEcgYW5kIE1JTl9NQVhfQ01QWENIRworICByb3V0aW5lcyBpbiBhc3NlbWJsZXIgbGFuZ3VhZ2UuCisqLworI2RlZmluZSBLTVBfQVRPTUlDX1ZPTEFUSUxFIHZvbGF0aWxlCisKKyNpZiAoIEtNUF9BUkNIX1g4NiApICYmIEtNUF9IQVZFX1FVQUQKKworICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBvcGVyYXRvciArPSggUXVhZF9hNF90ICYgbGhzLCBRdWFkX2E0X3QgJiByaHMgKSB7IGxocy5xICs9IHJocy5xOyB9OworICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBvcGVyYXRvciAtPSggUXVhZF9hNF90ICYgbGhzLCBRdWFkX2E0X3QgJiByaHMgKSB7IGxocy5xIC09IHJocy5xOyB9OworICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBvcGVyYXRvciAqPSggUXVhZF9hNF90ICYgbGhzLCBRdWFkX2E0X3QgJiByaHMgKSB7IGxocy5xICo9IHJocy5xOyB9OworICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBvcGVyYXRvciAvPSggUXVhZF9hNF90ICYgbGhzLCBRdWFkX2E0X3QgJiByaHMgKSB7IGxocy5xIC89IHJocy5xOyB9OworICAgIHN0YXRpYyBpbmxpbmUgYm9vbCBvcGVyYXRvciA8ICggUXVhZF9hNF90ICYgbGhzLCBRdWFkX2E0X3QgJiByaHMgKSB7IHJldHVybiBsaHMucSA8IHJocy5xOyB9CisgICAgc3RhdGljIGlubGluZSBib29sIG9wZXJhdG9yID4gKCBRdWFkX2E0X3QgJiBsaHMsIFF1YWRfYTRfdCAmIHJocyApIHsgcmV0dXJuIGxocy5xID4gcmhzLnE7IH0KKworICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBvcGVyYXRvciArPSggUXVhZF9hMTZfdCAmIGxocywgUXVhZF9hMTZfdCAmIHJocyApIHsgbGhzLnEgKz0gcmhzLnE7IH07CisgICAgc3RhdGljIGlubGluZSB2b2lkIG9wZXJhdG9yIC09KCBRdWFkX2ExNl90ICYgbGhzLCBRdWFkX2ExNl90ICYgcmhzICkgeyBsaHMucSAtPSByaHMucTsgfTsKKyAgICBzdGF0aWMgaW5saW5lIHZvaWQgb3BlcmF0b3IgKj0oIFF1YWRfYTE2X3QgJiBsaHMsIFF1YWRfYTE2X3QgJiByaHMgKSB7IGxocy5xICo9IHJocy5xOyB9OworICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBvcGVyYXRvciAvPSggUXVhZF9hMTZfdCAmIGxocywgUXVhZF9hMTZfdCAmIHJocyApIHsgbGhzLnEgLz0gcmhzLnE7IH07CisgICAgc3RhdGljIGlubGluZSBib29sIG9wZXJhdG9yIDwgKCBRdWFkX2ExNl90ICYgbGhzLCBRdWFkX2ExNl90ICYgcmhzICkgeyByZXR1cm4gbGhzLnEgPCByaHMucTsgfQorICAgIHN0YXRpYyBpbmxpbmUgYm9vbCBvcGVyYXRvciA+ICggUXVhZF9hMTZfdCAmIGxocywgUXVhZF9hMTZfdCAmIHJocyApIHsgcmV0dXJuIGxocy5xID4gcmhzLnE7IH0KKworICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBvcGVyYXRvciArPSgga21wX2NtcGx4MTI4X2E0X3QgJiBsaHMsIGttcF9jbXBseDEyOF9hNF90ICYgcmhzICkgeyBsaHMucSArPSByaHMucTsgfTsKKyAgICBzdGF0aWMgaW5saW5lIHZvaWQgb3BlcmF0b3IgLT0oIGttcF9jbXBseDEyOF9hNF90ICYgbGhzLCBrbXBfY21wbHgxMjhfYTRfdCAmIHJocyApIHsgbGhzLnEgLT0gcmhzLnE7IH07CisgICAgc3RhdGljIGlubGluZSB2b2lkIG9wZXJhdG9yICo9KCBrbXBfY21wbHgxMjhfYTRfdCAmIGxocywga21wX2NtcGx4MTI4X2E0X3QgJiByaHMgKSB7IGxocy5xICo9IHJocy5xOyB9OworICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBvcGVyYXRvciAvPSgga21wX2NtcGx4MTI4X2E0X3QgJiBsaHMsIGttcF9jbXBseDEyOF9hNF90ICYgcmhzICkgeyBsaHMucSAvPSByaHMucTsgfTsKKworICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBvcGVyYXRvciArPSgga21wX2NtcGx4MTI4X2ExNl90ICYgbGhzLCBrbXBfY21wbHgxMjhfYTE2X3QgJiByaHMgKSB7IGxocy5xICs9IHJocy5xOyB9OworICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBvcGVyYXRvciAtPSgga21wX2NtcGx4MTI4X2ExNl90ICYgbGhzLCBrbXBfY21wbHgxMjhfYTE2X3QgJiByaHMgKSB7IGxocy5xIC09IHJocy5xOyB9OworICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBvcGVyYXRvciAqPSgga21wX2NtcGx4MTI4X2ExNl90ICYgbGhzLCBrbXBfY21wbHgxMjhfYTE2X3QgJiByaHMgKSB7IGxocy5xICo9IHJocy5xOyB9OworICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBvcGVyYXRvciAvPSgga21wX2NtcGx4MTI4X2ExNl90ICYgbGhzLCBrbXBfY21wbHgxMjhfYTE2X3QgJiByaHMgKSB7IGxocy5xIC89IHJocy5xOyB9OworCisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBBVE9NSUMgaW1wbGVtZW50YXRpb24gcm91dGluZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIG9uZSByb3V0aW5lIGZvciBlYWNoIG9wZXJhdGlvbiBhbmQgb3BlcmFuZCB0eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8vIEFsbCByb3V0aW5lcyBkZWNsYXJhdGlvbnMgbG9va3MgbGlrZQorLy8gdm9pZCBfX2ttcGNfYXRvbWljX1JUWVBFX09QKCBpZGVudF90KiwgaW50LCBUWVBFICpsaHMsIFRZUEUgcmhzICk7CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2RlZmluZSBLTVBfQ0hFQ0tfR1RJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCBndGlkID09IEtNUF9HVElEX1VOS05PV04gKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gLy8gY2hlY2sgYW5kIGdldCBndGlkIHdoZW4gbmVlZGVkCisKKy8vIEJlZ2lubmluZyBvZiBhIGRlZmluaXRpb24gKHByb3ZpZGVzIG5hbWUsIHBhcmFtZXRlcnMsIGdlYnVnIHRyYWNlKQorLy8gICAgIFRZUEVfSUQgLSBvcGVyYW5kcyB0eXBlIGFuZCBzaXplIChmaXhlZCosIGZpeGVkKnUgZm9yIHNpZ25lZCwgdW5zaWduZWQgZml4ZWQpCisvLyAgICAgT1BfSUQgICAtIG9wZXJhdGlvbiBpZGVudGlmaWVyIChhZGQsIHN1YiwgbXVsLCAuLi4pCisvLyAgICAgVFlQRSAgICAtIG9wZXJhbmRzJyB0eXBlCisjZGVmaW5lIEFUT01JQ19CRUdJTihUWVBFX0lELE9QX0lELFRZUEUsIFJFVF9UWVBFKSBcCitSRVRfVFlQRSBfX2ttcGNfYXRvbWljXyMjVFlQRV9JRCMjXyMjT1BfSUQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFRZUEUgKiBsaHMsIFRZUEUgcmhzICkgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtBX1RSQUNFKDEwMCwoIl9fa21wY19hdG9taWNfIiAjVFlQRV9JRCAiXyIgI09QX0lEICI6IFQjJWRcbiIsIGd0aWQgKSk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTG9jayB2YXJpYWJsZXMgdXNlZCBmb3IgY3JpdGljYWwgc2VjdGlvbnMgZm9yIHZhcmlvdXMgc2l6ZSBvcGVyYW5kcworI2RlZmluZSBBVE9NSUNfTE9DSzAgICBfX2ttcF9hdG9taWNfbG9jayAgICAgICAvLyBhbGwgdHlwZXMsIGZvciBHbnUgY29tcGF0CisjZGVmaW5lIEFUT01JQ19MT0NLMWkgIF9fa21wX2F0b21pY19sb2NrXzFpICAgIC8vIGNoYXIKKyNkZWZpbmUgQVRPTUlDX0xPQ0syaSAgX19rbXBfYXRvbWljX2xvY2tfMmkgICAgLy8gc2hvcnQKKyNkZWZpbmUgQVRPTUlDX0xPQ0s0aSAgX19rbXBfYXRvbWljX2xvY2tfNGkgICAgLy8gbG9uZyBpbnQKKyNkZWZpbmUgQVRPTUlDX0xPQ0s0ciAgX19rbXBfYXRvbWljX2xvY2tfNHIgICAgLy8gZmxvYXQKKyNkZWZpbmUgQVRPTUlDX0xPQ0s4aSAgX19rbXBfYXRvbWljX2xvY2tfOGkgICAgLy8gbG9uZyBsb25nIGludAorI2RlZmluZSBBVE9NSUNfTE9DSzhyICBfX2ttcF9hdG9taWNfbG9ja184ciAgICAvLyBkb3VibGUKKyNkZWZpbmUgQVRPTUlDX0xPQ0s4YyAgX19rbXBfYXRvbWljX2xvY2tfOGMgICAgLy8gZmxvYXQgY29tcGxleAorI2RlZmluZSBBVE9NSUNfTE9DSzEwciBfX2ttcF9hdG9taWNfbG9ja18xMHIgICAvLyBsb25nIGRvdWJsZQorI2RlZmluZSBBVE9NSUNfTE9DSzE2ciBfX2ttcF9hdG9taWNfbG9ja18xNnIgICAvLyBfUXVhZAorI2RlZmluZSBBVE9NSUNfTE9DSzE2YyBfX2ttcF9hdG9taWNfbG9ja18xNmMgICAvLyBkb3VibGUgY29tcGxleAorI2RlZmluZSBBVE9NSUNfTE9DSzIwYyBfX2ttcF9hdG9taWNfbG9ja18yMGMgICAvLyBsb25nIGRvdWJsZSBjb21wbGV4CisjZGVmaW5lIEFUT01JQ19MT0NLMzJjIF9fa21wX2F0b21pY19sb2NrXzMyYyAgIC8vIF9RdWFkIGNvbXBsZXgKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBPcGVyYXRpb24gb24gKmxocywgcmhzIGJvdW5kIGJ5IGNyaXRpY2FsIHNlY3Rpb24KKy8vICAgICBPUCAgICAgLSBvcGVyYXRvciAoaXQncyBzdXBwb3NlZCB0byBjb250YWluIGFuIGFzc2lnbm1lbnQpCisvLyAgICAgTENLX0lEIC0gbG9jayBpZGVudGlmaWVyCisvLyBOb3RlOiBkb24ndCBjaGVjayBndGlkIGFzIGl0IHNob3VsZCBhbHdheXMgYmUgdmFsaWQKKy8vIDEsIDItYnl0ZSAtIGV4cGVjdCB2YWxpZCBwYXJhbWV0ZXIsIG90aGVyIC0gY2hlY2sgYmVmb3JlIHRoaXMgbWFjcm8KKyNkZWZpbmUgT1BfQ1JJVElDQUwoT1AsTENLX0lEKSBcCisgICAgX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jayggJiBBVE9NSUNfTE9DSyMjTENLX0lELCBndGlkICk7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKmxocykgT1AgKHJocyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jayggJiBBVE9NSUNfTE9DSyMjTENLX0lELCBndGlkICk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRm9yIEdOVSBjb21wYXRpYmlsaXR5LCB3ZSBtYXkgbmVlZCB0byB1c2UgYSBjcml0aWNhbCBzZWN0aW9uLAorLy8gZXZlbiB0aG91Z2ggaXQgaXMgbm90IHJlcXVpcmVkIGJ5IHRoZSBJU0EuCisvLworLy8gT24gSUEtMzIgYXJjaGl0ZWN0dXJlLCBhbGwgYXRvbWljIG9wZXJhdGlvbnMgZXhjZXB0IGZvciBmaXhlZCA0IGJ5dGUgYWRkLAorLy8gc3ViLCBhbmQgYml0d2lzZSBsb2dpY2FsIG9wcywgYW5kIDEgJiAyIGJ5dGUgbG9naWNhbCBvcHMgdXNlIGEgY29tbW9uCisvLyBjcml0aWNhbCBzZWN0aW9uLiAgT24gSW50ZWwoUikgNjQsIGFsbCBhdG9taWMgb3BlcmF0aW9ucyBhcmUgZG9uZSB3aXRoIGZldGNoCisvLyBhbmQgYWRkIG9yIGNvbXBhcmUgYW5kIGV4Y2hhbmdlLiAgVGhlcmVmb3JlLCB0aGUgRkxBRyBwYXJhbWV0ZXIgdG8gdGhpcworLy8gbWFjcm8gaXMgZWl0aGVyIEtNUF9BUkNIX1g4NiBvciAwIChvciAxLCBmb3IgSW50ZWwtc3BlY2lmaWMgZXh0ZW5zaW9uIHdoaWNoCisvLyByZXF1aXJlIGEgY3JpdGljYWwgc2VjdGlvbiwgd2hlcmUgd2UgcHJlZGljdCB0aGF0IHRoZXkgd2lsbCBiZSBpbXBsZW1lbnRlZAorLy8gaW4gdGhlIEdudSBjb2RlZ2VuIGJ5IGNhbGxpbmcgR09NUF9hdG9taWNfc3RhcnQoKSAvIEdPTVBfYXRvbWljX2VuZCgpKS4KKy8vCisvLyBXaGVuIHRoZSBPUF9HT01QX0NSSVRJQ0FMIG1hY3JvIGlzIHVzZWQgaW4gYSAqQ1JJVElDQUwqIG1hY3JvIGNvbnN0cnVjdCwKKy8vIHRoZSBGTEFHIHBhcmFtZXRlciBzaG91bGQgYWx3YXlzIGJlIDEuICBJZiB3ZSBrbm93IHRoYXQgd2Ugd2lsbCBiZSB1c2luZworLy8gYSBjcml0aWNhbCBzZWN0aW9uLCB0aGVuIHdlIHdhbnQgdG8gbWFrZSBjZXJ0YWluIHRoYXQgd2UgdXNlIHRoZSBnZW5lcmljCisvLyBsb2NrIF9fa21wX2F0b21pY19sb2NrIHRvIHByb3RlY3QgdGhlIGF0b21pYyB1cGRhdGUsIGFuZCBub3Qgb2Ygb2YgdGhlCisvLyBsb2NrcyB0aGF0IGFyZSBzcGVjaWFsaXplZCBiYXNlZCB1cG9uIHRoZSBzaXplIG9yIHR5cGUgb2YgdGhlIGRhdGEuCisvLworLy8gSWYgRkxBRyBpcyAwLCB0aGVuIHdlIGFyZSByZWx5aW5nIG9uIGRlYWQgY29kZSBlbGltaW5hdGlvbiBieSB0aGUgYnVpbGQKKy8vIGNvbXBpbGVyIHRvIGdldCByaWQgb2YgdGhlIHVzZWxlc3MgYmxvY2sgb2YgY29kZSwgYW5kIHNhdmUgYSBuZWVkbGVzcworLy8gYnJhbmNoIGF0IHJ1bnRpbWUuCisvLworCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisjIGRlZmluZSBPUF9HT01QX0NSSVRJQ0FMKE9QLEZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIChGTEFHKSAmJiAoX19rbXBfYXRvbWljX21vZGUgPT0gMikgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfQ0hFQ0tfR1RJRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE9QX0NSSVRJQ0FMKCBPUCwgMCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKyMgZWxzZQorIyBkZWZpbmUgT1BfR09NUF9DUklUSUNBTChPUCxGTEFHKQorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworCisjaWYgS01QX01JQworIyBkZWZpbmUgS01QX0RPX1BBVVNFIF9tbV9kZWxheV8zMiggMSApCisjZWxzZQorIyBkZWZpbmUgS01QX0RPX1BBVVNFIEtNUF9DUFVfUEFVU0UoKQorI2VuZGlmIC8qIEtNUF9NSUMgKi8KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBPcGVyYXRpb24gb24gKmxocywgcmhzIHVzaW5nICJjb21wYXJlX2FuZF9zdG9yZSIgcm91dGluZQorLy8gICAgIFRZUEUgICAgLSBvcGVyYW5kcycgdHlwZQorLy8gICAgIEJJVFMgICAgLSBzaXplIGluIGJpdHMsIHVzZWQgdG8gZGlzdGluZ3Vpc2ggbG93IGxldmVsIGNhbGxzCisvLyAgICAgT1AgICAgICAtIG9wZXJhdG9yCisjZGVmaW5lIE9QX0NNUFhDSEcoVFlQRSxCSVRTLE9QKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBUWVBFIG9sZF92YWx1ZSwgbmV3X3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG9sZF92YWx1ZSA9ICooVFlQRSB2b2xhdGlsZSAqKWxoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlIE9QIHJoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB3aGlsZSAoICEgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUSMjQklUUyggKGttcF9pbnQjI0JJVFMgKikgbGhzLCBcCisgICAgICAgICAgICAgICAgICAgICAgKlZPTEFUSUxFX0NBU1Qoa21wX2ludCMjQklUUyAqKSAmb2xkX3ZhbHVlLCAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAqVk9MQVRJTEVfQ0FTVChrbXBfaW50IyNCSVRTICopICZuZXdfdmFsdWUgKSApICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgS01QX0RPX1BBVVNFOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgb2xkX3ZhbHVlID0gKihUWVBFIHZvbGF0aWxlICopbGhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgT1AgcmhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworI2lmIFVTRV9DTVBYQ0hHX0ZJWAorLy8gMjAwNy0wNi0yNToKKy8vIHdvcmthcm91bmQgZm9yIEM3ODI4NyAoY29tcGxleChraW5kPTQpIGRhdGEgdHlwZSkKKy8vIGxpbl8zMiwgbGluXzMyZSwgd2luXzMyIGFuZCB3aW5fMzJlIGFyZSBhZmZlY3RlZCAoSSB2ZXJpZmllZCB0aGUgYXNtKQorLy8gQ29tcGlsZXIgaWdub3JlcyB0aGUgdm9sYXRpbGUgcXVhbGlmaWVyIG9mIHRoZSB0ZW1wX3ZhbCBpbiB0aGUgT1BfQ01QWENIRyBtYWNyby4KKy8vIFRoaXMgaXMgYSBwcm9ibGVtIG9mIHRoZSBjb21waWxlci4KKy8vIFJlbGF0ZWQgdHJhY2tlciBpcyBDNzYwMDUsIHRhcmdldGVkIHRvIDExLjAuCisvLyBJIHZlcmlmaWVkIHRoZSBhc20gb2YgdGhlIHdvcmthcm91bmQuCisjZGVmaW5lIE9QX0NNUFhDSEdfV09SS0FST1VORChUWVBFLEJJVFMsT1ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCWNoYXIgYW5vbnltWyAoIHNpemVvZiggVFlQRSApID09IHNpemVvZigga21wX2ludCMjQklUUyApICkgPyAoIDEgKSA6ICggMCApIF0gPSB7IDEgfTsgXAorCXN0cnVjdCBfc3NzIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgVFlQRSAgICAgICAgICAgIGNtcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgIGttcF9pbnQjI0JJVFMgICAqdnZ2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCX07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3RydWN0IF9zc3Mgb2xkX3ZhbHVlLCBuZXdfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBvbGRfdmFsdWUudnZ2ID0gKCBrbXBfaW50IyNCSVRTICogKSZvbGRfdmFsdWUuY21wOyAgICAgICAgICAgICAgICBcCisgICAgICAgIG5ld192YWx1ZS52dnYgPSAoIGttcF9pbnQjI0JJVFMgKiApJm5ld192YWx1ZS5jbXA7ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKm9sZF92YWx1ZS52dnYgPSAqICggdm9sYXRpbGUga21wX2ludCMjQklUUyAqICkgbGhzOyAgICAgICAgICAgICAgXAorICAgICAgICBuZXdfdmFsdWUuY21wID0gb2xkX3ZhbHVlLmNtcCBPUCByaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHdoaWxlICggISBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRIyNCSVRTKCAoa21wX2ludCMjQklUUyAqKSBsaHMsIFwKKyAgICAgICAgICAgICAgICAgICAgICAqVk9MQVRJTEVfQ0FTVChrbXBfaW50IyNCSVRTICopIG9sZF92YWx1ZS52dnYsICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICpWT0xBVElMRV9DQVNUKGttcF9pbnQjI0JJVFMgKikgbmV3X3ZhbHVlLnZ2diApICkgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEtNUF9ET19QQVVTRTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICpvbGRfdmFsdWUudnZ2ID0gKiAoIHZvbGF0aWxlIGttcF9pbnQjI0JJVFMgKiApIGxoczsgICAgICAgICAgXAorCSAgICBuZXdfdmFsdWUuY21wID0gb2xkX3ZhbHVlLmNtcCBPUCByaHM7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKy8vIGVuZCBvZiB0aGUgZmlyc3QgcGFydCBvZiB0aGUgd29ya2Fyb3VuZCBmb3IgQzc4Mjg3CisjZW5kaWYgLy8gVVNFX0NNUFhDSEdfRklYCisKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gWDg2IG9yIFg4Nl82NDogbm8gYWxpZ25tZW50IHByb2JsZW1zID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorI2RlZmluZSBBVE9NSUNfRklYRURfQUREKFRZUEVfSUQsT1BfSUQsVFlQRSxCSVRTLE9QLExDS19JRCxNQVNLLEdPTVBfRkxBRykgXAorQVRPTUlDX0JFR0lOKFRZUEVfSUQsT1BfSUQsVFlQRSx2b2lkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUwoT1AjIz0sR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIE9QIHVzZWQgYXMgYSBzaWduIGZvciBzdWJ0cmFjdGlvbjogKGxocy1yaHMpIC0tPiAobGhzKy1yaHMpICovICAgICAgXAorICAgIEtNUF9URVNUX1RIRU5fQUREIyNCSVRTKCBsaHMsIE9QIHJocyApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBBVE9NSUNfQ01QWENIRyhUWVBFX0lELE9QX0lELFRZUEUsQklUUyxPUCxMQ0tfSUQsTUFTSyxHT01QX0ZMQUcpICAgXAorQVRPTUlDX0JFR0lOKFRZUEVfSUQsT1BfSUQsVFlQRSx2b2lkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUwoT1AjIz0sR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0NNUFhDSEcoVFlQRSxCSVRTLE9QKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorI2lmIFVTRV9DTVBYQ0hHX0ZJWAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gd29ya2Fyb3VuZCBmb3IgQzc4Mjg3IChjb21wbGV4KGtpbmQ9NCkgZGF0YSB0eXBlKQorI2RlZmluZSBBVE9NSUNfQ01QWENIR19XT1JLQVJPVU5EKFRZUEVfSUQsT1BfSUQsVFlQRSxCSVRTLE9QLExDS19JRCxNQVNLLEdPTVBfRkxBRykgICBcCitBVE9NSUNfQkVHSU4oVFlQRV9JRCxPUF9JRCxUWVBFLHZvaWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMKE9QIyM9LEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0NNUFhDSEdfV09SS0FST1VORChUWVBFLEJJVFMsT1ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisvLyBlbmQgb2YgdGhlIHNlY29uZCBwYXJ0IG9mIHRoZSB3b3JrYXJvdW5kIGZvciBDNzgyODcKKyNlbmRpZgorCisjZWxzZQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ29kZSBmb3Igb3RoZXIgYXJjaGl0ZWN0dXJlcyB0aGF0IGRvbid0IGhhbmRsZSB1bmFsaWduZWQgYWNjZXNzZXMuCisjZGVmaW5lIEFUT01JQ19GSVhFRF9BREQoVFlQRV9JRCxPUF9JRCxUWVBFLEJJVFMsT1AsTENLX0lELE1BU0ssR09NUF9GTEFHKSBcCitBVE9NSUNfQkVHSU4oVFlQRV9JRCxPUF9JRCxUWVBFLHZvaWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTChPUCMjPSxHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCAhICggKGttcF91aW50cHRyX3QpIGxocyAmIDB4IyNNQVNLKSApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIC8qIE9QIHVzZWQgYXMgYSBzaWduIGZvciBzdWJ0cmFjdGlvbjogKGxocy1yaHMpIC0tPiAobGhzKy1yaHMpICovICBcCisgICAgICAgIEtNUF9URVNUX1RIRU5fQUREIyNCSVRTKCBsaHMsIE9QIHJocyApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9DSEVDS19HVElEOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE9QX0NSSVRJQ0FMKE9QIyM9LExDS19JRCkgIC8qIHVuYWxpZ25lZCBhZGRyZXNzIC0gdXNlIGNyaXRpY2FsICovICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEFUT01JQ19DTVBYQ0hHKFRZUEVfSUQsT1BfSUQsVFlQRSxCSVRTLE9QLExDS19JRCxNQVNLLEdPTVBfRkxBRykgICBcCitBVE9NSUNfQkVHSU4oVFlQRV9JRCxPUF9JRCxUWVBFLHZvaWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTChPUCMjPSxHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCAhICggKGttcF91aW50cHRyX3QpIGxocyAmIDB4IyNNQVNLKSApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE9QX0NNUFhDSEcoVFlQRSxCSVRTLE9QKSAgICAgLyogYWxpZ25lZCBhZGRyZXNzICovICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9DSEVDS19HVElEOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE9QX0NSSVRJQ0FMKE9QIyM9LExDS19JRCkgIC8qIHVuYWxpZ25lZCBhZGRyZXNzIC0gdXNlIGNyaXRpY2FsICovICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisjaWYgVVNFX0NNUFhDSEdfRklYCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB3b3JrYXJvdW5kIGZvciBDNzgyODcgKGNvbXBsZXgoa2luZD00KSBkYXRhIHR5cGUpCisjZGVmaW5lIEFUT01JQ19DTVBYQ0hHX1dPUktBUk9VTkQoVFlQRV9JRCxPUF9JRCxUWVBFLEJJVFMsT1AsTENLX0lELE1BU0ssR09NUF9GTEFHKSAgIFwKK0FUT01JQ19CRUdJTihUWVBFX0lELE9QX0lELFRZUEUsdm9pZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUwoT1AjIz0sR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCAhICggKGttcF91aW50cHRyX3QpIGxocyAmIDB4IyNNQVNLKSApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgT1BfQ01QWENIRyhUWVBFLEJJVFMsT1ApICAgICAgICAgICAgIC8qIGFsaWduZWQgYWRkcmVzcyAqLyAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9DSEVDS19HVElEOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgT1BfQ1JJVElDQUwoT1AjIz0sTENLX0lEKSAgLyogdW5hbGlnbmVkIGFkZHJlc3MgLSB1c2UgY3JpdGljYWwgKi8gICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisvLyBlbmQgb2YgdGhlIHNlY29uZCBwYXJ0IG9mIHRoZSB3b3JrYXJvdW5kIGZvciBDNzgyODcKKyNlbmRpZiAvLyBVU0VfQ01QWENIR19GSVgKKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisKKy8vIFJvdXRpbmVzIGZvciBBVE9NSUMgNC1ieXRlIG9wZXJhbmRzIGFkZGl0aW9uIGFuZCBzdWJ0cmFjdGlvbgorQVRPTUlDX0ZJWEVEX0FERCggZml4ZWQ0LCBhZGQsIGttcF9pbnQzMiwgIDMyLCArLCA0aSwgMywgMCAgICAgICAgICAgICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X2FkZAorQVRPTUlDX0ZJWEVEX0FERCggZml4ZWQ0LCBzdWIsIGttcF9pbnQzMiwgIDMyLCAtLCA0aSwgMywgMCAgICAgICAgICAgICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X3N1YgorCitBVE9NSUNfQ01QWENIRyggZmxvYXQ0LCAgYWRkLCBrbXBfcmVhbDMyLCAzMiwgKywgIDRyLCAzLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfYWRkCitBVE9NSUNfQ01QWENIRyggZmxvYXQ0LCAgc3ViLCBrbXBfcmVhbDMyLCAzMiwgLSwgIDRyLCAzLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfc3ViCisKKy8vIFJvdXRpbmVzIGZvciBBVE9NSUMgOC1ieXRlIG9wZXJhbmRzIGFkZGl0aW9uIGFuZCBzdWJ0cmFjdGlvbgorQVRPTUlDX0ZJWEVEX0FERCggZml4ZWQ4LCBhZGQsIGttcF9pbnQ2NCwgIDY0LCArLCA4aSwgNywgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X2FkZAorQVRPTUlDX0ZJWEVEX0FERCggZml4ZWQ4LCBzdWIsIGttcF9pbnQ2NCwgIDY0LCAtLCA4aSwgNywgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X3N1YgorCitBVE9NSUNfQ01QWENIRyggZmxvYXQ4LCAgYWRkLCBrbXBfcmVhbDY0LCA2NCwgKywgIDhyLCA3LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDhfYWRkCitBVE9NSUNfQ01QWENIRyggZmxvYXQ4LCAgc3ViLCBrbXBfcmVhbDY0LCA2NCwgLSwgIDhyLCA3LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDhfc3ViCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW50cmllcyBkZWZpbml0aW9uIGZvciBpbnRlZ2VyIG9wZXJhbmRzCisvLyAgICAgVFlQRV9JRCAtIG9wZXJhbmRzIHR5cGUgYW5kIHNpemUgKGZpeGVkNCwgZmxvYXQ0KQorLy8gICAgIE9QX0lEICAgLSBvcGVyYXRpb24gaWRlbnRpZmllciAoYWRkLCBzdWIsIG11bCwgLi4uKQorLy8gICAgIFRZUEUgICAgLSBvcGVyYW5kIHR5cGUKKy8vICAgICBCSVRTICAgIC0gc2l6ZSBpbiBiaXRzLCB1c2VkIHRvIGRpc3Rpbmd1aXNoIGxvdyBsZXZlbCBjYWxscworLy8gICAgIE9QICAgICAgLSBvcGVyYXRvciAodXNlZCBpbiBjcml0aWNhbCBzZWN0aW9uKQorLy8gICAgIExDS19JRCAgLSBsb2NrIGlkZW50aWZpZXIsIHVzZWQgdG8gcG9zc2libHkgZGlzdGluZ3Vpc2ggbG9jayB2YXJpYWJsZQorLy8gICAgIE1BU0sgICAgLSB1c2VkIGZvciBhbGlnbm1lbnQgY2hlY2sKKworLy8gICAgICAgICAgICAgICBUWVBFX0lELE9QX0lELCAgVFlQRSwgICBCSVRTLE9QLExDS19JRCxNQVNLLEdPTVBfRkxBRworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSb3V0aW5lcyBmb3IgQVRPTUlDIGludGVnZXIgb3BlcmFuZHMsIG90aGVyIG9wZXJhdG9ycworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgICAgICAgICAgICAgVFlQRV9JRCxPUF9JRCwgVFlQRSwgICAgICAgICAgT1AsIExDS19JRCwgR09NUF9GTEFHCitBVE9NSUNfQ01QWENIRyggZml4ZWQxLCAgYWRkLCBrbXBfaW50OCwgICAgOCwgKywgIDFpLCAwLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDFfYWRkCitBVE9NSUNfQ01QWENIRyggZml4ZWQxLCBhbmRiLCBrbXBfaW50OCwgICAgOCwgJiwgIDFpLCAwLCAwICAgICAgICAgICAgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDFfYW5kYgorQVRPTUlDX0NNUFhDSEcoIGZpeGVkMSwgIGRpdiwga21wX2ludDgsICAgIDgsIC8sICAxaSwgMCwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX2RpdgorQVRPTUlDX0NNUFhDSEcoIGZpeGVkMXUsIGRpdiwga21wX3VpbnQ4LCAgIDgsIC8sICAxaSwgMCwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxdV9kaXYKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDEsICBtdWwsIGttcF9pbnQ4LCAgICA4LCAqLCAgMWksIDAsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9tdWwKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDEsICBvcmIsIGttcF9pbnQ4LCAgICA4LCB8LCAgMWksIDAsIDAgICAgICAgICAgICApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9vcmIKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDEsICBzaGwsIGttcF9pbnQ4LCAgICA4LCA8PCwgMWksIDAsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zaGwKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDEsICBzaHIsIGttcF9pbnQ4LCAgICA4LCA+PiwgMWksIDAsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zaHIKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDF1LCBzaHIsIGttcF91aW50OCwgICA4LCA+PiwgMWksIDAsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfc2hyCitBVE9NSUNfQ01QWENIRyggZml4ZWQxLCAgc3ViLCBrbXBfaW50OCwgICAgOCwgLSwgIDFpLCAwLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDFfc3ViCitBVE9NSUNfQ01QWENIRyggZml4ZWQxLCAgeG9yLCBrbXBfaW50OCwgICAgOCwgXiwgIDFpLCAwLCAwICAgICAgICAgICAgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDFfeG9yCitBVE9NSUNfQ01QWENIRyggZml4ZWQyLCAgYWRkLCBrbXBfaW50MTYsICAxNiwgKywgIDJpLCAxLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJfYWRkCitBVE9NSUNfQ01QWENIRyggZml4ZWQyLCBhbmRiLCBrbXBfaW50MTYsICAxNiwgJiwgIDJpLCAxLCAwICAgICAgICAgICAgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJfYW5kYgorQVRPTUlDX0NNUFhDSEcoIGZpeGVkMiwgIGRpdiwga21wX2ludDE2LCAgMTYsIC8sICAyaSwgMSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX2RpdgorQVRPTUlDX0NNUFhDSEcoIGZpeGVkMnUsIGRpdiwga21wX3VpbnQxNiwgMTYsIC8sICAyaSwgMSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQydV9kaXYKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDIsICBtdWwsIGttcF9pbnQxNiwgIDE2LCAqLCAgMmksIDEsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9tdWwKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDIsICBvcmIsIGttcF9pbnQxNiwgIDE2LCB8LCAgMmksIDEsIDAgICAgICAgICAgICApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9vcmIKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDIsICBzaGwsIGttcF9pbnQxNiwgIDE2LCA8PCwgMmksIDEsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaGwKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDIsICBzaHIsIGttcF9pbnQxNiwgIDE2LCA+PiwgMmksIDEsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaHIKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDJ1LCBzaHIsIGttcF91aW50MTYsIDE2LCA+PiwgMmksIDEsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfc2hyCitBVE9NSUNfQ01QWENIRyggZml4ZWQyLCAgc3ViLCBrbXBfaW50MTYsICAxNiwgLSwgIDJpLCAxLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJfc3ViCitBVE9NSUNfQ01QWENIRyggZml4ZWQyLCAgeG9yLCBrbXBfaW50MTYsICAxNiwgXiwgIDJpLCAxLCAwICAgICAgICAgICAgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJfeG9yCitBVE9NSUNfQ01QWENIRyggZml4ZWQ0LCBhbmRiLCBrbXBfaW50MzIsICAzMiwgJiwgIDRpLCAzLCAwICAgICAgICAgICAgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfYW5kYgorQVRPTUlDX0NNUFhDSEcoIGZpeGVkNCwgIGRpdiwga21wX2ludDMyLCAgMzIsIC8sICA0aSwgMywgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X2RpdgorQVRPTUlDX0NNUFhDSEcoIGZpeGVkNHUsIGRpdiwga21wX3VpbnQzMiwgMzIsIC8sICA0aSwgMywgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0dV9kaXYKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDQsICBtdWwsIGttcF9pbnQzMiwgIDMyLCAqLCAgNGksIDMsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9tdWwKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDQsICBvcmIsIGttcF9pbnQzMiwgIDMyLCB8LCAgNGksIDMsIDAgICAgICAgICAgICApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9vcmIKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDQsICBzaGwsIGttcF9pbnQzMiwgIDMyLCA8PCwgNGksIDMsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaGwKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDQsICBzaHIsIGttcF9pbnQzMiwgIDMyLCA+PiwgNGksIDMsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaHIKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDR1LCBzaHIsIGttcF91aW50MzIsIDMyLCA+PiwgNGksIDMsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfc2hyCitBVE9NSUNfQ01QWENIRyggZml4ZWQ0LCAgeG9yLCBrbXBfaW50MzIsICAzMiwgXiwgIDRpLCAzLCAwICAgICAgICAgICAgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfeG9yCitBVE9NSUNfQ01QWENIRyggZml4ZWQ4LCBhbmRiLCBrbXBfaW50NjQsICA2NCwgJiwgIDhpLCA3LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfYW5kYgorQVRPTUlDX0NNUFhDSEcoIGZpeGVkOCwgIGRpdiwga21wX2ludDY0LCAgNjQsIC8sICA4aSwgNywgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X2RpdgorQVRPTUlDX0NNUFhDSEcoIGZpeGVkOHUsIGRpdiwga21wX3VpbnQ2NCwgNjQsIC8sICA4aSwgNywgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4dV9kaXYKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDgsICBtdWwsIGttcF9pbnQ2NCwgIDY0LCAqLCAgOGksIDcsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9tdWwKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDgsICBvcmIsIGttcF9pbnQ2NCwgIDY0LCB8LCAgOGksIDcsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9vcmIKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDgsICBzaGwsIGttcF9pbnQ2NCwgIDY0LCA8PCwgOGksIDcsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zaGwKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDgsICBzaHIsIGttcF9pbnQ2NCwgIDY0LCA+PiwgOGksIDcsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zaHIKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDh1LCBzaHIsIGttcF91aW50NjQsIDY0LCA+PiwgOGksIDcsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfc2hyCitBVE9NSUNfQ01QWENIRyggZml4ZWQ4LCAgeG9yLCBrbXBfaW50NjQsICA2NCwgXiwgIDhpLCA3LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfeG9yCitBVE9NSUNfQ01QWENIRyggZmxvYXQ0LCAgZGl2LCBrbXBfcmVhbDMyLCAzMiwgLywgIDRyLCAzLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfZGl2CitBVE9NSUNfQ01QWENIRyggZmxvYXQ0LCAgbXVsLCBrbXBfcmVhbDMyLCAzMiwgKiwgIDRyLCAzLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfbXVsCitBVE9NSUNfQ01QWENIRyggZmxvYXQ4LCAgZGl2LCBrbXBfcmVhbDY0LCA2NCwgLywgIDhyLCA3LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDhfZGl2CitBVE9NSUNfQ01QWENIRyggZmxvYXQ4LCAgbXVsLCBrbXBfcmVhbDY0LCA2NCwgKiwgIDhyLCA3LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDhfbXVsCisvLyAgICAgICAgICAgICAgVFlQRV9JRCxPUF9JRCwgVFlQRSwgICAgICAgICAgT1AsIExDS19JRCwgR09NUF9GTEFHCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBSb3V0aW5lcyBmb3IgQy9DKysgUmVkdWN0aW9uIG9wZXJhdG9ycyAmJiBhbmQgfHwgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE5lZWQgc2VwYXJhdGUgbWFjcm9zIGZvciAmJiwgfHwgYmVjYXVzZSB0aGVyZSBpcyBubyBjb21iaW5lZCBhc3NpZ25tZW50CisvLyAgIFRPRE86IGVsaW1pbmF0ZSBBVE9NSUNfQ1JJVF97TCxFUVZ9IG1hY3JvcyBhcyBub3QgdXNlZAorI2RlZmluZSBBVE9NSUNfQ1JJVF9MKFRZUEVfSUQsT1BfSUQsVFlQRSxPUCxMQ0tfSUQsR09NUF9GTEFHKSAgICAgICAgICAgICBcCitBVE9NSUNfQkVHSU4oVFlQRV9JRCxPUF9JRCxUWVBFLHZvaWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMKCA9ICpsaHMgT1AsIEdPTVBfRkxBRyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0NSSVRJQ0FMKCA9ICpsaHMgT1AsIExDS19JRCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gWDg2IG9yIFg4Nl82NDogbm8gYWxpZ25tZW50IHByb2JsZW1zID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjZGVmaW5lIEFUT01JQ19DTVBYX0woVFlQRV9JRCxPUF9JRCxUWVBFLEJJVFMsT1AsTENLX0lELE1BU0ssR09NUF9GTEFHKSAgIFwKK0FUT01JQ19CRUdJTihUWVBFX0lELE9QX0lELFRZUEUsdm9pZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUwoID0gKmxocyBPUCwgR09NUF9GTEFHICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfQ01QWENIRyhUWVBFLEJJVFMsT1ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2Vsc2UKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ29kZSBmb3Igb3RoZXIgYXJjaGl0ZWN0dXJlcyB0aGF0IGRvbid0IGhhbmRsZSB1bmFsaWduZWQgYWNjZXNzZXMuCisjZGVmaW5lIEFUT01JQ19DTVBYX0woVFlQRV9JRCxPUF9JRCxUWVBFLEJJVFMsT1AsTENLX0lELE1BU0ssR09NUF9GTEFHKSAgIFwKK0FUT01JQ19CRUdJTihUWVBFX0lELE9QX0lELFRZUEUsdm9pZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUwoPSAqbGhzIE9QLEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCAhICggKGttcF91aW50cHRyX3QpIGxocyAmIDB4IyNNQVNLKSApIHsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgT1BfQ01QWENIRyhUWVBFLEJJVFMsT1ApICAgICAgIC8qIGFsaWduZWQgYWRkcmVzcyAqLyAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9DSEVDS19HVElEOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgT1BfQ1JJVElDQUwoPSAqbGhzIE9QLExDS19JRCkgIC8qIHVuYWxpZ25lZCAtIHVzZSBjcml0aWNhbCAqLyAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisjZW5kaWYgLyogS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCAqLworCitBVE9NSUNfQ01QWF9MKCBmaXhlZDEsIGFuZGwsIGNoYXIsICAgICAgIDgsICYmLCAxaSwgMCwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX2FuZGwKK0FUT01JQ19DTVBYX0woIGZpeGVkMSwgIG9ybCwgY2hhciwgICAgICAgOCwgfHwsIDFpLCAwLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDFfb3JsCitBVE9NSUNfQ01QWF9MKCBmaXhlZDIsIGFuZGwsIHNob3J0LCAgICAgMTYsICYmLCAyaSwgMSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX2FuZGwKK0FUT01JQ19DTVBYX0woIGZpeGVkMiwgIG9ybCwgc2hvcnQsICAgICAxNiwgfHwsIDJpLCAxLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJfb3JsCitBVE9NSUNfQ01QWF9MKCBmaXhlZDQsIGFuZGwsIGttcF9pbnQzMiwgMzIsICYmLCA0aSwgMywgMCApICAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X2FuZGwKK0FUT01JQ19DTVBYX0woIGZpeGVkNCwgIG9ybCwga21wX2ludDMyLCAzMiwgfHwsIDRpLCAzLCAwICkgICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfb3JsCitBVE9NSUNfQ01QWF9MKCBmaXhlZDgsIGFuZGwsIGttcF9pbnQ2NCwgNjQsICYmLCA4aSwgNywgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X2FuZGwKK0FUT01JQ19DTVBYX0woIGZpeGVkOCwgIG9ybCwga21wX2ludDY0LCA2NCwgfHwsIDhpLCA3LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfb3JsCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogUm91dGluZXMgZm9yIEZvcnRyYW4gb3BlcmF0b3JzIHRoYXQgbWF0Y2hlZCBubyBvbmUgaW4gQzogICAgICAgICAgICAgICAgICAqLworLyogTUFYLCBNSU4sIC5FUVYuLCAuTkVRVi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogT3BlcmF0b3JzIC5BTkQuLCAuT1IuIGFyZSBjb3ZlcmVkIGJ5IF9fa21wY19hdG9taWNfKl97YW5kbCxvcmx9ICAgICAgICAgICAqLworLyogSW50cmluc2ljcyBJQU5ELCBJT1IsIElFT1IgYXJlIGNvdmVyZWQgYnkgX19rbXBjX2F0b21pY18qX3thbmRiLG9yYix4b3J9ICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNSU4gYW5kIE1BWCBuZWVkIHNlcGFyYXRlIG1hY3JvcworLy8gT1AgLSBvcGVyYXRvciB0byBjaGVjayBpZiB3ZSBuZWVkIGFueSBhY3Rpb25zPworI2RlZmluZSBNSU5fTUFYX0NSSVRTRUNUKE9QLExDS19JRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soICYgQVRPTUlDX0xPQ0sjI0xDS19JRCwgZ3RpZCApOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoICpsaHMgT1AgcmhzICkgeyAgICAgICAgICAgICAgICAgLyogc3RpbGwgbmVlZCBhY3Rpb25zPyAqLyAgICAgICAgIFwKKyAgICAgICAgKmxocyA9IHJoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCAmIEFUT01JQ19MT0NLIyNMQ0tfSUQsIGd0aWQgKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorI2RlZmluZSBHT01QX01JTl9NQVhfQ1JJVFNFQ1QoT1AsRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICgoIEZMQUcgKSAmJiAoIF9fa21wX2F0b21pY19tb2RlID09IDIgKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfQ0hFQ0tfR1RJRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBNSU5fTUFYX0NSSVRTRUNUKCBPUCwgMCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKyNlbHNlCisjZGVmaW5lIEdPTVBfTUlOX01BWF9DUklUU0VDVChPUCxGTEFHKQorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIE1JTl9NQVhfQ01QWENIRyhUWVBFLEJJVFMsT1ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFRZUEUgS01QX0FUT01JQ19WT0xBVElMRSB0ZW1wX3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFRZUEUgb2xkX3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHRlbXBfdmFsID0gKmxoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG9sZF92YWx1ZSA9IHRlbXBfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHdoaWxlICggb2xkX3ZhbHVlIE9QIHJocyAmJiAgICAgICAgICAvKiBzdGlsbCBuZWVkIGFjdGlvbnM/ICovICAgICBcCisgICAgICAgICAgICAhIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EjI0JJVFMoIChrbXBfaW50IyNCSVRTICopIGxocywgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgKlZPTEFUSUxFX0NBU1Qoa21wX2ludCMjQklUUyAqKSAmb2xkX3ZhbHVlLCAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgKlZPTEFUSUxFX0NBU1Qoa21wX2ludCMjQklUUyAqKSAmcmhzICkgKSAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBLTVBfQ1BVX1BBVVNFKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB0ZW1wX3ZhbCA9ICpsaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBvbGRfdmFsdWUgPSB0ZW1wX3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAxLWJ5dGUsIDItYnl0ZSBvcGVyYW5kcyAtIHVzZSBjcml0aWNhbCBzZWN0aW9uCisjZGVmaW5lIE1JTl9NQVhfQ1JJVElDQUwoVFlQRV9JRCxPUF9JRCxUWVBFLE9QLExDS19JRCxHT01QX0ZMQUcpICAgICAgICAgICBcCitBVE9NSUNfQkVHSU4oVFlQRV9JRCxPUF9JRCxUWVBFLHZvaWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCAqbGhzIE9QIHJocyApIHsgICAgIC8qIG5lZWQgYWN0aW9ucz8gKi8gICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEdPTVBfTUlOX01BWF9DUklUU0VDVChPUCxHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1JTl9NQVhfQ1JJVFNFQ1QoT1AsTENLX0lEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFg4NiBvciBYODZfNjQ6IG5vIGFsaWdubWVudCBwcm9ibGVtcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyNkZWZpbmUgTUlOX01BWF9DT01QWENIRyhUWVBFX0lELE9QX0lELFRZUEUsQklUUyxPUCxMQ0tfSUQsTUFTSyxHT01QX0ZMQUcpIFwKK0FUT01JQ19CRUdJTihUWVBFX0lELE9QX0lELFRZUEUsdm9pZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoICpsaHMgT1AgcmhzICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgR09NUF9NSU5fTUFYX0NSSVRTRUNUKE9QLEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTUlOX01BWF9DTVBYQ0hHKFRZUEUsQklUUyxPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2Vsc2UKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENvZGUgZm9yIG90aGVyIGFyY2hpdGVjdHVyZXMgdGhhdCBkb24ndCBoYW5kbGUgdW5hbGlnbmVkIGFjY2Vzc2VzLgorI2RlZmluZSBNSU5fTUFYX0NPTVBYQ0hHKFRZUEVfSUQsT1BfSUQsVFlQRSxCSVRTLE9QLExDS19JRCxNQVNLLEdPTVBfRkxBRykgXAorQVRPTUlDX0JFR0lOKFRZUEVfSUQsT1BfSUQsVFlQRSx2b2lkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICggKmxocyBPUCByaHMgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBHT01QX01JTl9NQVhfQ1JJVFNFQ1QoT1AsR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoICEgKCAoa21wX3VpbnRwdHJfdCkgbGhzICYgMHgjI01BU0spICkgeyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgTUlOX01BWF9DTVBYQ0hHKFRZUEUsQklUUyxPUCkgLyogYWxpZ25lZCBhZGRyZXNzICovICAgICAgICAgICAgXAorICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgS01QX0NIRUNLX0dUSUQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgTUlOX01BWF9DUklUU0VDVChPUCxMQ0tfSUQpICAgLyogdW5hbGlnbmVkIGFkZHJlc3MgKi8gICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKworTUlOX01BWF9DT01QWENIRyggZml4ZWQxLCAgbWF4LCBjaGFyLCAgICAgICAgOCwgPCwgMWksIDAsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX21heAorTUlOX01BWF9DT01QWENIRyggZml4ZWQxLCAgbWluLCBjaGFyLCAgICAgICAgOCwgPiwgMWksIDAsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX21pbgorTUlOX01BWF9DT01QWENIRyggZml4ZWQyLCAgbWF4LCBzaG9ydCwgICAgICAxNiwgPCwgMmksIDEsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX21heAorTUlOX01BWF9DT01QWENIRyggZml4ZWQyLCAgbWluLCBzaG9ydCwgICAgICAxNiwgPiwgMmksIDEsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX21pbgorTUlOX01BWF9DT01QWENIRyggZml4ZWQ0LCAgbWF4LCBrbXBfaW50MzIsICAzMiwgPCwgNGksIDMsIDAgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X21heAorTUlOX01BWF9DT01QWENIRyggZml4ZWQ0LCAgbWluLCBrbXBfaW50MzIsICAzMiwgPiwgNGksIDMsIDAgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X21pbgorTUlOX01BWF9DT01QWENIRyggZml4ZWQ4LCAgbWF4LCBrbXBfaW50NjQsICA2NCwgPCwgOGksIDcsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X21heAorTUlOX01BWF9DT01QWENIRyggZml4ZWQ4LCAgbWluLCBrbXBfaW50NjQsICA2NCwgPiwgOGksIDcsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X21pbgorTUlOX01BWF9DT01QWENIRyggZmxvYXQ0LCAgbWF4LCBrbXBfcmVhbDMyLCAzMiwgPCwgNHIsIDMsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZmxvYXQ0X21heAorTUlOX01BWF9DT01QWENIRyggZmxvYXQ0LCAgbWluLCBrbXBfcmVhbDMyLCAzMiwgPiwgNHIsIDMsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZmxvYXQ0X21pbgorTUlOX01BWF9DT01QWENIRyggZmxvYXQ4LCAgbWF4LCBrbXBfcmVhbDY0LCA2NCwgPCwgOHIsIDcsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZmxvYXQ4X21heAorTUlOX01BWF9DT01QWENIRyggZmxvYXQ4LCAgbWluLCBrbXBfcmVhbDY0LCA2NCwgPiwgOHIsIDcsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZmxvYXQ4X21pbgorI2lmIEtNUF9IQVZFX1FVQUQKK01JTl9NQVhfQ1JJVElDQUwoIGZsb2F0MTYsIG1heCwgICAgIFFVQURfTEVHQUNZLCAgICAgIDwsIDE2ciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbWF4CitNSU5fTUFYX0NSSVRJQ0FMKCBmbG9hdDE2LCBtaW4sICAgICBRVUFEX0xFR0FDWSwgICAgICA+LCAxNnIsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X21pbgorI2lmICggS01QX0FSQ0hfWDg2ICkKKyAgICBNSU5fTUFYX0NSSVRJQ0FMKCBmbG9hdDE2LCBtYXhfYTE2LCBRdWFkX2ExNl90LCAgICAgPCwgMTZyLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9tYXhfYTE2CisgICAgTUlOX01BWF9DUklUSUNBTCggZmxvYXQxNiwgbWluX2ExNiwgUXVhZF9hMTZfdCwgICAgID4sIDE2ciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbWluX2ExNgorI2VuZGlmCisjZW5kaWYKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTmVlZCBzZXBhcmF0ZSBtYWNyb3MgZm9yIC5FUVYuIGJlY2F1c2Ugb2YgdGhlIG5lZWQgb2YgY29tcGxlbWVudCAofikKKy8vIE9QIGlnbm9yZWQgZm9yIGNyaXRpY2FsIHNlY3Rpb25zLCBePX4gdXNlZCBpbnN0ZWFkCisjZGVmaW5lIEFUT01JQ19DUklUX0VRVihUWVBFX0lELE9QX0lELFRZUEUsT1AsTENLX0lELEdPTVBfRkxBRykgICAgICAgICAgIFwKK0FUT01JQ19CRUdJTihUWVBFX0lELE9QX0lELFRZUEUsdm9pZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUwoXj1+LEdPTVBfRkxBRykgIC8qIHNlbmQgYXNzaWdubWVudCAqLyAgICAgICAgICAgICAgICBcCisgICAgT1BfQ1JJVElDQUwoXj1+LExDS19JRCkgICAgLyogc2VuZCBhc3NpZ25tZW50IGFuZCBjb21wbGVtZW50ICovICAgICAgIFwKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBYODYgb3IgWDg2XzY0OiBubyBhbGlnbm1lbnQgcHJvYmxlbXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyNkZWZpbmUgQVRPTUlDX0NNUFhfRVFWKFRZUEVfSUQsT1BfSUQsVFlQRSxCSVRTLE9QLExDS19JRCxNQVNLLEdPTVBfRkxBRykgXAorQVRPTUlDX0JFR0lOKFRZUEVfSUQsT1BfSUQsVFlQRSx2b2lkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTChePX4sR09NUF9GTEFHKSAgLyogc2VuZCBhc3NpZ25tZW50ICovICAgICAgICAgICAgICAgIFwKKyAgICBPUF9DTVBYQ0hHKFRZUEUsQklUUyxPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZWxzZQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDb2RlIGZvciBvdGhlciBhcmNoaXRlY3R1cmVzIHRoYXQgZG9uJ3QgaGFuZGxlIHVuYWxpZ25lZCBhY2Nlc3Nlcy4KKyNkZWZpbmUgQVRPTUlDX0NNUFhfRVFWKFRZUEVfSUQsT1BfSUQsVFlQRSxCSVRTLE9QLExDS19JRCxNQVNLLEdPTVBfRkxBRykgXAorQVRPTUlDX0JFR0lOKFRZUEVfSUQsT1BfSUQsVFlQRSx2b2lkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTChePX4sR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoICEgKCAoa21wX3VpbnRwdHJfdCkgbGhzICYgMHgjI01BU0spICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBPUF9DTVBYQ0hHKFRZUEUsQklUUyxPUCkgICAvKiBhbGlnbmVkIGFkZHJlc3MgKi8gICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0NIRUNLX0dUSUQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBPUF9DUklUSUNBTChePX4sTENLX0lEKSAgICAvKiB1bmFsaWduZWQgYWRkcmVzcyAtIHVzZSBjcml0aWNhbCAqLyBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisKK0FUT01JQ19DTVBYQ0hHKCAgZml4ZWQxLCBuZXF2LCBrbXBfaW50OCwgICA4LCAgIF4sIDFpLCAwLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9uZXF2CitBVE9NSUNfQ01QWENIRyggIGZpeGVkMiwgbmVxdiwga21wX2ludDE2LCAxNiwgICBeLCAyaSwgMSwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDJfbmVxdgorQVRPTUlDX0NNUFhDSEcoICBmaXhlZDQsIG5lcXYsIGttcF9pbnQzMiwgMzIsICAgXiwgNGksIDMsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X25lcXYKK0FUT01JQ19DTVBYQ0hHKCAgZml4ZWQ4LCBuZXF2LCBrbXBfaW50NjQsIDY0LCAgIF4sIDhpLCA3LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9uZXF2CitBVE9NSUNfQ01QWF9FUVYoIGZpeGVkMSwgZXF2LCAga21wX2ludDgsICAgOCwgIF5+LCAxaSwgMCwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDFfZXF2CitBVE9NSUNfQ01QWF9FUVYoIGZpeGVkMiwgZXF2LCAga21wX2ludDE2LCAxNiwgIF5+LCAyaSwgMSwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDJfZXF2CitBVE9NSUNfQ01QWF9FUVYoIGZpeGVkNCwgZXF2LCAga21wX2ludDMyLCAzMiwgIF5+LCA0aSwgMywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDRfZXF2CitBVE9NSUNfQ01QWF9FUVYoIGZpeGVkOCwgZXF2LCAga21wX2ludDY0LCA2NCwgIF5+LCA4aSwgNywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDhfZXF2CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSb3V0aW5lcyBmb3IgRXh0ZW5kZWQgdHlwZXM6IGxvbmcgZG91YmxlLCBfUXVhZCwgY29tcGxleCBmbGF2b3VycyAodXNlIGNyaXRpY2FsIHNlY3Rpb24pCisvLyAgICAgVFlQRV9JRCwgT1BfSUQsIFRZUEUgLSBkZXRhaWxlZCBhYm92ZQorLy8gICAgIE9QICAgICAgLSBvcGVyYXRvcgorLy8gICAgIExDS19JRCAgLSBsb2NrIGlkZW50aWZpZXIsIHVzZWQgdG8gcG9zc2libHkgZGlzdGluZ3Vpc2ggbG9jayB2YXJpYWJsZQorI2RlZmluZSBBVE9NSUNfQ1JJVElDQUwoVFlQRV9JRCxPUF9JRCxUWVBFLE9QLExDS19JRCxHT01QX0ZMQUcpICAgICAgICAgICBcCitBVE9NSUNfQkVHSU4oVFlQRV9JRCxPUF9JRCxUWVBFLHZvaWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMKE9QIyM9LEdPTVBfRkxBRykgIC8qIHNlbmQgYXNzaWdubWVudCAqLyAgICAgICAgICAgICAgXAorICAgIE9QX0NSSVRJQ0FMKE9QIyM9LExDS19JRCkgICAgICAgICAgLyogc2VuZCBhc3NpZ25tZW50ICovICAgICAgICAgICAgICBcCit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8vIHJvdXRpbmVzIGZvciBsb25nIGRvdWJsZSB0eXBlCitBVE9NSUNfQ1JJVElDQUwoIGZsb2F0MTAsIGFkZCwgbG9uZyBkb3VibGUsICAgICArLCAxMHIsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDEwX2FkZAorQVRPTUlDX0NSSVRJQ0FMKCBmbG9hdDEwLCBzdWIsIGxvbmcgZG91YmxlLCAgICAgLSwgMTByLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxMF9zdWIKK0FUT01JQ19DUklUSUNBTCggZmxvYXQxMCwgbXVsLCBsb25nIGRvdWJsZSwgICAgICosIDEwciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfbXVsCitBVE9NSUNfQ1JJVElDQUwoIGZsb2F0MTAsIGRpdiwgbG9uZyBkb3VibGUsICAgICAvLCAxMHIsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDEwX2RpdgorI2lmIEtNUF9IQVZFX1FVQUQKKy8vIHJvdXRpbmVzIGZvciBfUXVhZCB0eXBlCitBVE9NSUNfQ1JJVElDQUwoIGZsb2F0MTYsIGFkZCwgUVVBRF9MRUdBQ1ksICAgICArLCAxNnIsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X2FkZAorQVRPTUlDX0NSSVRJQ0FMKCBmbG9hdDE2LCBzdWIsIFFVQURfTEVHQUNZLCAgICAgLSwgMTZyLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9zdWIKK0FUT01JQ19DUklUSUNBTCggZmxvYXQxNiwgbXVsLCBRVUFEX0xFR0FDWSwgICAgICosIDE2ciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbXVsCitBVE9NSUNfQ1JJVElDQUwoIGZsb2F0MTYsIGRpdiwgUVVBRF9MRUdBQ1ksICAgICAvLCAxNnIsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X2RpdgorI2lmICggS01QX0FSQ0hfWDg2ICkKKyAgICBBVE9NSUNfQ1JJVElDQUwoIGZsb2F0MTYsIGFkZF9hMTYsIFF1YWRfYTE2X3QsICssIDE2ciwgMSApICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfYWRkX2ExNgorICAgIEFUT01JQ19DUklUSUNBTCggZmxvYXQxNiwgc3ViX2ExNiwgUXVhZF9hMTZfdCwgLSwgMTZyLCAxICkgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9zdWJfYTE2CisgICAgQVRPTUlDX0NSSVRJQ0FMKCBmbG9hdDE2LCBtdWxfYTE2LCBRdWFkX2ExNl90LCAqLCAxNnIsIDEgKSAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X211bF9hMTYKKyAgICBBVE9NSUNfQ1JJVElDQUwoIGZsb2F0MTYsIGRpdl9hMTYsIFF1YWRfYTE2X3QsIC8sIDE2ciwgMSApICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2X2ExNgorI2VuZGlmCisjZW5kaWYKKy8vIHJvdXRpbmVzIGZvciBjb21wbGV4IHR5cGVzCisKKyNpZiBVU0VfQ01QWENIR19GSVgKKy8vIHdvcmthcm91bmQgZm9yIEM3ODI4NyAoY29tcGxleChraW5kPTQpIGRhdGEgdHlwZSkKK0FUT01JQ19DTVBYQ0hHX1dPUktBUk9VTkQoIGNtcGx4NCwgYWRkLCBrbXBfY21wbHgzMiwgNjQsICssIDhjLCA3LCAxICkgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4NF9hZGQKK0FUT01JQ19DTVBYQ0hHX1dPUktBUk9VTkQoIGNtcGx4NCwgc3ViLCBrbXBfY21wbHgzMiwgNjQsIC0sIDhjLCA3LCAxICkgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4NF9zdWIKK0FUT01JQ19DTVBYQ0hHX1dPUktBUk9VTkQoIGNtcGx4NCwgbXVsLCBrbXBfY21wbHgzMiwgNjQsICosIDhjLCA3LCAxICkgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4NF9tdWwKK0FUT01JQ19DTVBYQ0hHX1dPUktBUk9VTkQoIGNtcGx4NCwgZGl2LCBrbXBfY21wbHgzMiwgNjQsIC8sIDhjLCA3LCAxICkgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4NF9kaXYKKy8vIGVuZCBvZiB0aGUgd29ya2Fyb3VuZCBmb3IgQzc4Mjg3CisjZWxzZQorQVRPTUlDX0NSSVRJQ0FMKCBjbXBseDQsICBhZGQsIGttcF9jbXBseDMyLCAgICAgKywgIDhjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHg0X2FkZAorQVRPTUlDX0NSSVRJQ0FMKCBjbXBseDQsICBzdWIsIGttcF9jbXBseDMyLCAgICAgLSwgIDhjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHg0X3N1YgorQVRPTUlDX0NSSVRJQ0FMKCBjbXBseDQsICBtdWwsIGttcF9jbXBseDMyLCAgICAgKiwgIDhjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHg0X211bAorQVRPTUlDX0NSSVRJQ0FMKCBjbXBseDQsICBkaXYsIGttcF9jbXBseDMyLCAgICAgLywgIDhjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHg0X2RpdgorI2VuZGlmIC8vIFVTRV9DTVBYQ0hHX0ZJWAorCitBVE9NSUNfQ1JJVElDQUwoIGNtcGx4OCwgIGFkZCwga21wX2NtcGx4NjQsICAgICArLCAxNmMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDhfYWRkCitBVE9NSUNfQ1JJVElDQUwoIGNtcGx4OCwgIHN1Yiwga21wX2NtcGx4NjQsICAgICAtLCAxNmMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDhfc3ViCitBVE9NSUNfQ1JJVElDQUwoIGNtcGx4OCwgIG11bCwga21wX2NtcGx4NjQsICAgICAqLCAxNmMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDhfbXVsCitBVE9NSUNfQ1JJVElDQUwoIGNtcGx4OCwgIGRpdiwga21wX2NtcGx4NjQsICAgICAvLCAxNmMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDhfZGl2CitBVE9NSUNfQ1JJVElDQUwoIGNtcGx4MTAsIGFkZCwga21wX2NtcGx4ODAsICAgICArLCAyMGMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDEwX2FkZAorQVRPTUlDX0NSSVRJQ0FMKCBjbXBseDEwLCBzdWIsIGttcF9jbXBseDgwLCAgICAgLSwgMjBjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxMF9zdWIKK0FUT01JQ19DUklUSUNBTCggY21wbHgxMCwgbXVsLCBrbXBfY21wbHg4MCwgICAgICosIDIwYywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTBfbXVsCitBVE9NSUNfQ1JJVElDQUwoIGNtcGx4MTAsIGRpdiwga21wX2NtcGx4ODAsICAgICAvLCAyMGMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDEwX2RpdgorI2lmIEtNUF9IQVZFX1FVQUQKK0FUT01JQ19DUklUSUNBTCggY21wbHgxNiwgYWRkLCBDUExYMTI4X0xFRywgICAgICssIDMyYywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfYWRkCitBVE9NSUNfQ1JJVElDQUwoIGNtcGx4MTYsIHN1YiwgQ1BMWDEyOF9MRUcsICAgICAtLCAzMmMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X3N1YgorQVRPTUlDX0NSSVRJQ0FMKCBjbXBseDE2LCBtdWwsIENQTFgxMjhfTEVHLCAgICAgKiwgMzJjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9tdWwKK0FUT01JQ19DUklUSUNBTCggY21wbHgxNiwgZGl2LCBDUExYMTI4X0xFRywgICAgIC8sIDMyYywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfZGl2CisjaWYgKCBLTVBfQVJDSF9YODYgKQorICAgIEFUT01JQ19DUklUSUNBTCggY21wbHgxNiwgYWRkX2ExNiwga21wX2NtcGx4MTI4X2ExNl90LCArLCAzMmMsIDEgKSAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9hZGRfYTE2CisgICAgQVRPTUlDX0NSSVRJQ0FMKCBjbXBseDE2LCBzdWJfYTE2LCBrbXBfY21wbHgxMjhfYTE2X3QsIC0sIDMyYywgMSApICAgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X3N1Yl9hMTYKKyAgICBBVE9NSUNfQ1JJVElDQUwoIGNtcGx4MTYsIG11bF9hMTYsIGttcF9jbXBseDEyOF9hMTZfdCwgKiwgMzJjLCAxICkgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfbXVsX2ExNgorICAgIEFUT01JQ19DUklUSUNBTCggY21wbHgxNiwgZGl2X2ExNiwga21wX2NtcGx4MTI4X2ExNl90LCAvLCAzMmMsIDEgKSAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9kaXZfYTE2CisjZW5kaWYKKyNlbmRpZgorCisjaWYgT01QXzQwX0VOQUJMRUQKKworLy8gT3Blbk1QIDQuMDogeCA9IGV4cHIgYmlub3AgeCBmb3Igbm9uLWNvbW11dGF0aXZlIG9wZXJhdGlvbnMuCisvLyBTdXBwb3J0ZWQgb25seSBvbiBJQS0zMiBhcmNoaXRlY3R1cmUgYW5kIEludGVsKFIpIDY0CisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE9wZXJhdGlvbiBvbiAqbGhzLCByaHMgYm91bmQgYnkgY3JpdGljYWwgc2VjdGlvbgorLy8gICAgIE9QICAgICAtIG9wZXJhdG9yIChpdCdzIHN1cHBvc2VkIHRvIGNvbnRhaW4gYW4gYXNzaWdubWVudCkKKy8vICAgICBMQ0tfSUQgLSBsb2NrIGlkZW50aWZpZXIKKy8vIE5vdGU6IGRvbid0IGNoZWNrIGd0aWQgYXMgaXQgc2hvdWxkIGFsd2F5cyBiZSB2YWxpZAorLy8gMSwgMi1ieXRlIC0gZXhwZWN0IHZhbGlkIHBhcmFtZXRlciwgb3RoZXIgLSBjaGVjayBiZWZvcmUgdGhpcyBtYWNybworI2RlZmluZSBPUF9DUklUSUNBTF9SRVYoT1AsTENLX0lEKSBcCisgICAgX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jayggJiBBVE9NSUNfTE9DSyMjTENLX0lELCBndGlkICk7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgqbGhzKSA9IChyaHMpIE9QICgqbGhzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCAmIEFUT01JQ19MT0NLIyNMQ0tfSUQsIGd0aWQgKTsKKworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorI2RlZmluZSBPUF9HT01QX0NSSVRJQ0FMX1JFVihPUCxGTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCAoRkxBRykgJiYgKF9fa21wX2F0b21pY19tb2RlID09IDIpICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0NIRUNLX0dUSUQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBPUF9DUklUSUNBTF9SRVYoIE9QLCAwICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisjZWxzZQorI2RlZmluZSBPUF9HT01QX0NSSVRJQ0FMX1JFVihPUCxGTEFHKQorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworCisKKy8vIEJlZ2lubmluZyBvZiBhIGRlZmluaXRpb24gKHByb3ZpZGVzIG5hbWUsIHBhcmFtZXRlcnMsIGdlYnVnIHRyYWNlKQorLy8gICAgIFRZUEVfSUQgLSBvcGVyYW5kcyB0eXBlIGFuZCBzaXplIChmaXhlZCosIGZpeGVkKnUgZm9yIHNpZ25lZCwgdW5zaWduZWQgZml4ZWQpCisvLyAgICAgT1BfSUQgICAtIG9wZXJhdGlvbiBpZGVudGlmaWVyIChhZGQsIHN1YiwgbXVsLCAuLi4pCisvLyAgICAgVFlQRSAgICAtIG9wZXJhbmRzJyB0eXBlCisjZGVmaW5lIEFUT01JQ19CRUdJTl9SRVYoVFlQRV9JRCxPUF9JRCxUWVBFLCBSRVRfVFlQRSkgXAorUkVUX1RZUEUgX19rbXBjX2F0b21pY18jI1RZUEVfSUQjI18jI09QX0lEIyNfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBUWVBFICogbGhzLCBUWVBFIHJocyApIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLQV9UUkFDRSgxMDAsKCJfX2ttcGNfYXRvbWljXyIgI1RZUEVfSUQgIl8iICNPUF9JRCAiX3JldjogVCMlZFxuIiwgZ3RpZCApKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBPcGVyYXRpb24gb24gKmxocywgcmhzIHVzaW5nICJjb21wYXJlX2FuZF9zdG9yZSIgcm91dGluZQorLy8gICAgIFRZUEUgICAgLSBvcGVyYW5kcycgdHlwZQorLy8gICAgIEJJVFMgICAgLSBzaXplIGluIGJpdHMsIHVzZWQgdG8gZGlzdGluZ3Vpc2ggbG93IGxldmVsIGNhbGxzCisvLyAgICAgT1AgICAgICAtIG9wZXJhdG9yCisvLyBOb3RlOiB0ZW1wX3ZhbCBpbnRyb2R1Y2VkIGluIG9yZGVyIHRvIGZvcmNlIHRoZSBjb21waWxlciB0byByZWFkCisvLyAgICAgICAqbGhzIG9ubHkgb25jZSAody9vIGl0IHRoZSBjb21waWxlciByZWFkcyAqbGhzIHR3aWNlKQorI2RlZmluZSBPUF9DTVBYQ0hHX1JFVihUWVBFLEJJVFMsT1ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgVFlQRSBLTVBfQVRPTUlDX1ZPTEFUSUxFIHRlbXBfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBUWVBFIG9sZF92YWx1ZSwgbmV3X3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHRlbXBfdmFsID0gKmxoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgb2xkX3ZhbHVlID0gdGVtcF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBuZXdfdmFsdWUgPSByaHMgT1Agb2xkX3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHdoaWxlICggISBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRIyNCSVRTKCAoa21wX2ludCMjQklUUyAqKSBsaHMsIFwKKyAgICAgICAgICAgICAgICAgICAgICAqVk9MQVRJTEVfQ0FTVChrbXBfaW50IyNCSVRTICopICZvbGRfdmFsdWUsICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICpWT0xBVElMRV9DQVNUKGttcF9pbnQjI0JJVFMgKikgJm5ld192YWx1ZSApICkgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEtNUF9ET19QQVVTRTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB0ZW1wX3ZhbCA9ICpsaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG9sZF92YWx1ZSA9IHRlbXBfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgbmV3X3ZhbHVlID0gcmhzIE9QIG9sZF92YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgQVRPTUlDX0NNUFhDSEdfUkVWKFRZUEVfSUQsT1BfSUQsVFlQRSxCSVRTLE9QLExDS19JRCxHT01QX0ZMQUcpICAgXAorQVRPTUlDX0JFR0lOX1JFVihUWVBFX0lELE9QX0lELFRZUEUsdm9pZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTF9SRVYoT1AsR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9DTVBYQ0hHX1JFVihUWVBFLEJJVFMsT1ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVudHJpZXMgZGVmaW5pdGlvbiBmb3IgaW50ZWdlciBvcGVyYW5kcworLy8gICAgIFRZUEVfSUQgLSBvcGVyYW5kcyB0eXBlIGFuZCBzaXplIChmaXhlZDQsIGZsb2F0NCkKKy8vICAgICBPUF9JRCAgIC0gb3BlcmF0aW9uIGlkZW50aWZpZXIgKGFkZCwgc3ViLCBtdWwsIC4uLikKKy8vICAgICBUWVBFICAgIC0gb3BlcmFuZCB0eXBlCisvLyAgICAgQklUUyAgICAtIHNpemUgaW4gYml0cywgdXNlZCB0byBkaXN0aW5ndWlzaCBsb3cgbGV2ZWwgY2FsbHMKKy8vICAgICBPUCAgICAgIC0gb3BlcmF0b3IgKHVzZWQgaW4gY3JpdGljYWwgc2VjdGlvbikKKy8vICAgICBMQ0tfSUQgIC0gbG9jayBpZGVudGlmaWVyLCB1c2VkIHRvIHBvc3NpYmx5IGRpc3Rpbmd1aXNoIGxvY2sgdmFyaWFibGUKKworLy8gICAgICAgICAgICAgICBUWVBFX0lELE9QX0lELCAgVFlQRSwgICBCSVRTLE9QLExDS19JRCxHT01QX0ZMQUcKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUm91dGluZXMgZm9yIEFUT01JQyBpbnRlZ2VyIG9wZXJhbmRzLCBvdGhlciBvcGVyYXRvcnMKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gICAgICAgICAgICAgICAgICBUWVBFX0lELE9QX0lELCBUWVBFLCAgICBCSVRTLCBPUCwgTENLX0lELCBHT01QX0ZMQUcKK0FUT01JQ19DTVBYQ0hHX1JFViggZml4ZWQxLCAgZGl2LCBrbXBfaW50OCwgICAgOCwgLywgIDFpLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDFfZGl2X3JldgorQVRPTUlDX0NNUFhDSEdfUkVWKCBmaXhlZDF1LCBkaXYsIGttcF91aW50OCwgICA4LCAvLCAgMWksIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfZGl2X3JldgorQVRPTUlDX0NNUFhDSEdfUkVWKCBmaXhlZDEsICBzaGwsIGttcF9pbnQ4LCAgICA4LCA8PCwgMWksIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zaGxfcmV2CitBVE9NSUNfQ01QWENIR19SRVYoIGZpeGVkMSwgIHNociwga21wX2ludDgsICAgIDgsID4+LCAxaSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX3Nocl9yZXYKK0FUT01JQ19DTVBYQ0hHX1JFViggZml4ZWQxdSwgc2hyLCBrbXBfdWludDgsICAgOCwgPj4sIDFpLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDF1X3Nocl9yZXYKK0FUT01JQ19DTVBYQ0hHX1JFViggZml4ZWQxLCAgc3ViLCBrbXBfaW50OCwgICAgOCwgLSwgIDFpLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDFfc3ViX3JldgorCitBVE9NSUNfQ01QWENIR19SRVYoIGZpeGVkMiwgIGRpdiwga21wX2ludDE2LCAgMTYsIC8sICAyaSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX2Rpdl9yZXYKK0FUT01JQ19DTVBYQ0hHX1JFViggZml4ZWQydSwgZGl2LCBrbXBfdWludDE2LCAxNiwgLywgIDJpLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJ1X2Rpdl9yZXYKK0FUT01JQ19DTVBYQ0hHX1JFViggZml4ZWQyLCAgc2hsLCBrbXBfaW50MTYsICAxNiwgPDwsIDJpLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJfc2hsX3JldgorQVRPTUlDX0NNUFhDSEdfUkVWKCBmaXhlZDIsICBzaHIsIGttcF9pbnQxNiwgIDE2LCA+PiwgMmksIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaHJfcmV2CitBVE9NSUNfQ01QWENIR19SRVYoIGZpeGVkMnUsIHNociwga21wX3VpbnQxNiwgMTYsID4+LCAyaSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQydV9zaHJfcmV2CitBVE9NSUNfQ01QWENIR19SRVYoIGZpeGVkMiwgIHN1Yiwga21wX2ludDE2LCAgMTYsIC0sICAyaSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX3N1Yl9yZXYKKworQVRPTUlDX0NNUFhDSEdfUkVWKCBmaXhlZDQsICBkaXYsIGttcF9pbnQzMiwgIDMyLCAvLCAgNGksIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9kaXZfcmV2CitBVE9NSUNfQ01QWENIR19SRVYoIGZpeGVkNHUsIGRpdiwga21wX3VpbnQzMiwgMzIsIC8sICA0aSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0dV9kaXZfcmV2CitBVE9NSUNfQ01QWENIR19SRVYoIGZpeGVkNCwgIHNobCwga21wX2ludDMyLCAgMzIsIDw8LCA0aSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X3NobF9yZXYKK0FUT01JQ19DTVBYQ0hHX1JFViggZml4ZWQ0LCAgc2hyLCBrbXBfaW50MzIsICAzMiwgPj4sIDRpLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfc2hyX3JldgorQVRPTUlDX0NNUFhDSEdfUkVWKCBmaXhlZDR1LCBzaHIsIGttcF91aW50MzIsIDMyLCA+PiwgNGksIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfc2hyX3JldgorQVRPTUlDX0NNUFhDSEdfUkVWKCBmaXhlZDQsICBzdWIsIGttcF9pbnQzMiwgIDMyLCAtLCAgNGksIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zdWJfcmV2CisKK0FUT01JQ19DTVBYQ0hHX1JFViggZml4ZWQ4LCAgZGl2LCBrbXBfaW50NjQsICA2NCwgLywgIDhpLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfZGl2X3JldgorQVRPTUlDX0NNUFhDSEdfUkVWKCBmaXhlZDh1LCBkaXYsIGttcF91aW50NjQsIDY0LCAvLCAgOGksIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfZGl2X3JldgorQVRPTUlDX0NNUFhDSEdfUkVWKCBmaXhlZDgsICBzaGwsIGttcF9pbnQ2NCwgIDY0LCA8PCwgOGksIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zaGxfcmV2CitBVE9NSUNfQ01QWENIR19SRVYoIGZpeGVkOCwgIHNociwga21wX2ludDY0LCAgNjQsID4+LCA4aSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X3Nocl9yZXYKK0FUT01JQ19DTVBYQ0hHX1JFViggZml4ZWQ4dSwgc2hyLCBrbXBfdWludDY0LCA2NCwgPj4sIDhpLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDh1X3Nocl9yZXYKK0FUT01JQ19DTVBYQ0hHX1JFViggZml4ZWQ4LCAgc3ViLCBrbXBfaW50NjQsICA2NCwgLSwgIDhpLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfc3ViX3JldgorCitBVE9NSUNfQ01QWENIR19SRVYoIGZsb2F0NCwgIGRpdiwga21wX3JlYWwzMiwgMzIsIC8sICA0ciwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZmxvYXQ0X2Rpdl9yZXYKK0FUT01JQ19DTVBYQ0hHX1JFViggZmxvYXQ0LCAgc3ViLCBrbXBfcmVhbDMyLCAzMiwgLSwgIDRyLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfc3ViX3JldgorCitBVE9NSUNfQ01QWENIR19SRVYoIGZsb2F0OCwgIGRpdiwga21wX3JlYWw2NCwgNjQsIC8sICA4ciwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZmxvYXQ4X2Rpdl9yZXYKK0FUT01JQ19DTVBYQ0hHX1JFViggZmxvYXQ4LCAgc3ViLCBrbXBfcmVhbDY0LCA2NCwgLSwgIDhyLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDhfc3ViX3JldgorLy8gICAgICAgICAgICAgICAgICBUWVBFX0lELE9QX0lELCBUWVBFLCAgICAgQklUUyxPUCxMQ0tfSUQsIEdPTVBfRkxBRworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJvdXRpbmVzIGZvciBFeHRlbmRlZCB0eXBlczogbG9uZyBkb3VibGUsIF9RdWFkLCBjb21wbGV4IGZsYXZvdXJzICh1c2UgY3JpdGljYWwgc2VjdGlvbikKKy8vICAgICBUWVBFX0lELCBPUF9JRCwgVFlQRSAtIGRldGFpbGVkIGFib3ZlCisvLyAgICAgT1AgICAgICAtIG9wZXJhdG9yCisvLyAgICAgTENLX0lEICAtIGxvY2sgaWRlbnRpZmllciwgdXNlZCB0byBwb3NzaWJseSBkaXN0aW5ndWlzaCBsb2NrIHZhcmlhYmxlCisjZGVmaW5lIEFUT01JQ19DUklUSUNBTF9SRVYoVFlQRV9JRCxPUF9JRCxUWVBFLE9QLExDS19JRCxHT01QX0ZMQUcpICAgICAgICAgICBcCitBVE9NSUNfQkVHSU5fUkVWKFRZUEVfSUQsT1BfSUQsVFlQRSx2b2lkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTF9SRVYoT1AsR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfQ1JJVElDQUxfUkVWKE9QLExDS19JRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8vIHJvdXRpbmVzIGZvciBsb25nIGRvdWJsZSB0eXBlCitBVE9NSUNfQ1JJVElDQUxfUkVWKCBmbG9hdDEwLCBzdWIsIGxvbmcgZG91YmxlLCAgICAgLSwgMTByLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxMF9zdWJfcmV2CitBVE9NSUNfQ1JJVElDQUxfUkVWKCBmbG9hdDEwLCBkaXYsIGxvbmcgZG91YmxlLCAgICAgLywgMTByLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxMF9kaXZfcmV2CisjaWYgS01QX0hBVkVfUVVBRAorLy8gcm91dGluZXMgZm9yIF9RdWFkIHR5cGUKK0FUT01JQ19DUklUSUNBTF9SRVYoIGZsb2F0MTYsIHN1YiwgUVVBRF9MRUdBQ1ksICAgICAtLCAxNnIsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X3N1Yl9yZXYKK0FUT01JQ19DUklUSUNBTF9SRVYoIGZsb2F0MTYsIGRpdiwgUVVBRF9MRUdBQ1ksICAgICAvLCAxNnIsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X2Rpdl9yZXYKKyNpZiAoIEtNUF9BUkNIX1g4NiApCisgICAgQVRPTUlDX0NSSVRJQ0FMX1JFViggZmxvYXQxNiwgc3ViX2ExNiwgUXVhZF9hMTZfdCwgLSwgMTZyLCAxICkgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9zdWJfYTE2X3JldgorICAgIEFUT01JQ19DUklUSUNBTF9SRVYoIGZsb2F0MTYsIGRpdl9hMTYsIFF1YWRfYTE2X3QsIC8sIDE2ciwgMSApICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2X2ExNl9yZXYKKyNlbmRpZgorI2VuZGlmCisKKy8vIHJvdXRpbmVzIGZvciBjb21wbGV4IHR5cGVzCitBVE9NSUNfQ1JJVElDQUxfUkVWKCBjbXBseDQsICBzdWIsIGttcF9jbXBseDMyLCAgICAgLSwgOGMsICAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHg0X3N1Yl9yZXYKK0FUT01JQ19DUklUSUNBTF9SRVYoIGNtcGx4NCwgIGRpdiwga21wX2NtcGx4MzIsICAgICAvLCA4YywgICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDRfZGl2X3JldgorQVRPTUlDX0NSSVRJQ0FMX1JFViggY21wbHg4LCAgc3ViLCBrbXBfY21wbHg2NCwgICAgIC0sIDE2YywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4OF9zdWJfcmV2CitBVE9NSUNfQ1JJVElDQUxfUkVWKCBjbXBseDgsICBkaXYsIGttcF9jbXBseDY0LCAgICAgLywgMTZjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHg4X2Rpdl9yZXYKK0FUT01JQ19DUklUSUNBTF9SRVYoIGNtcGx4MTAsIHN1Yiwga21wX2NtcGx4ODAsICAgICAtLCAyMGMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDEwX3N1Yl9yZXYKK0FUT01JQ19DUklUSUNBTF9SRVYoIGNtcGx4MTAsIGRpdiwga21wX2NtcGx4ODAsICAgICAvLCAyMGMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDEwX2Rpdl9yZXYKKyNpZiBLTVBfSEFWRV9RVUFECitBVE9NSUNfQ1JJVElDQUxfUkVWKCBjbXBseDE2LCBzdWIsIENQTFgxMjhfTEVHLCAgICAgLSwgMzJjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9zdWJfcmV2CitBVE9NSUNfQ1JJVElDQUxfUkVWKCBjbXBseDE2LCBkaXYsIENQTFgxMjhfTEVHLCAgICAgLywgMzJjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9kaXZfcmV2CisjaWYgKCBLTVBfQVJDSF9YODYgKQorICAgIEFUT01JQ19DUklUSUNBTF9SRVYoIGNtcGx4MTYsIHN1Yl9hMTYsIGttcF9jbXBseDEyOF9hMTZfdCwgLSwgMzJjLCAxICkgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfc3ViX2ExNl9yZXYKKyAgICBBVE9NSUNfQ1JJVElDQUxfUkVWKCBjbXBseDE2LCBkaXZfYTE2LCBrbXBfY21wbHgxMjhfYTE2X3QsIC8sIDMyYywgMSApICAgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X2Rpdl9hMTZfcmV2CisjZW5kaWYKKyNlbmRpZgorCisKKyNlbmRpZiAvL0tNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKy8vIEVuZCBvZiBPcGVuTVAgNC4wOiB4ID0gZXhwciBiaW5vcCB4IGZvciBub24tY29tbXV0YXRpdmUgb3BlcmF0aW9ucy4KKworI2VuZGlmIC8vT01QXzQwX0VOQUJMRUQKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIFJvdXRpbmVzIGZvciBtaXhlZCB0eXBlcyBvZiBMSFMgYW5kIFJIUywgd2hlbiBSSFMgaXMgImxhcmdlciIgICAgICAgICAgICAqLworLyogTm90ZTogaW4gb3JkZXIgdG8gcmVkdWNlIHRoZSB0b3RhbCBudW1iZXIgb2YgdHlwZXMgY29tYmluYXRpb25zICAgICAgICAgICovCisvKiAgICAgICBpdCBpcyBzdXBwb3NlZCB0aGF0IGNvbXBpbGVyIGNvbnZlcnRzIFJIUyB0byBsb25nZXN0IGZsb2F0aW5nIHR5cGUsKi8KKy8qICAgICAgIHRoYXQgaXMgX1F1YWQsIGJlZm9yZSBjYWxsIHRvIGFueSBvZiB0aGVzZSByb3V0aW5lcyAgICAgICAgICAgICAgICAqLworLyogQ29udmVyc2lvbiB0byBfUXVhZCB3aWxsIGJlIGRvbmUgYnkgdGhlIGNvbXBpbGVyIGR1cmluZyBjYWxjdWxhdGlvbiwgICAgICovCisvKiAgICBjb252ZXJzaW9uIGJhY2sgdG8gVFlQRSAtIGJlZm9yZSB0aGUgYXNzaWdubWVudCwgbGlrZTogICAgICAgICAgICAgICAgKi8KKy8qICAgICpsaHMgPSAoVFlQRSkoIChfUXVhZCkoKmxocykgT1AgcmhzICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUGVyZm9ybWFuY2UgcGVuYWx0eSBleHBlY3RlZCBiZWNhdXNlIG9mIFNXIGVtdWxhdGlvbiB1c2UgICAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBBVE9NSUNfQkVHSU5fTUlYKFRZUEVfSUQsVFlQRSxPUF9JRCxSVFlQRV9JRCxSVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit2b2lkIF9fa21wY19hdG9taWNfIyNUWVBFX0lEIyNfIyNPUF9JRCMjXyMjUlRZUEVfSUQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFRZUEUgKiBsaHMsIFJUWVBFIHJocyApIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS0FfVFJBQ0UoMTAwLCgiX19rbXBjX2F0b21pY18iICNUWVBFX0lEICJfIiAjT1BfSUQgIl8iICNSVFlQRV9JRCAiOiBUIyVkXG4iLCBndGlkICkpOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEFUT01JQ19DUklUSUNBTF9GUChUWVBFX0lELFRZUEUsT1BfSUQsT1AsUlRZUEVfSUQsUlRZUEUsTENLX0lELEdPTVBfRkxBRykgICAgICAgICBcCitBVE9NSUNfQkVHSU5fTUlYKFRZUEVfSUQsVFlQRSxPUF9JRCxSVFlQRV9JRCxSVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTChPUCMjPSxHT01QX0ZMQUcpICAvKiBzZW5kIGFzc2lnbm1lbnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfQ1JJVElDQUwoT1AjIz0sTENLX0lEKSAgLyogc2VuZCBhc3NpZ25tZW50ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBYODYgb3IgWDg2XzY0OiBubyBhbGlnbm1lbnQgcHJvYmxlbXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjZGVmaW5lIEFUT01JQ19DTVBYQ0hHX01JWChUWVBFX0lELFRZUEUsT1BfSUQsQklUUyxPUCxSVFlQRV9JRCxSVFlQRSxMQ0tfSUQsTUFTSyxHT01QX0ZMQUcpIFwKK0FUT01JQ19CRUdJTl9NSVgoVFlQRV9JRCxUWVBFLE9QX0lELFJUWVBFX0lELFJUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUwoT1AjIz0sR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfQ01QWENIRyhUWVBFLEJJVFMsT1ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNlbHNlCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENvZGUgZm9yIG90aGVyIGFyY2hpdGVjdHVyZXMgdGhhdCBkb24ndCBoYW5kbGUgdW5hbGlnbmVkIGFjY2Vzc2VzLgorI2RlZmluZSBBVE9NSUNfQ01QWENIR19NSVgoVFlQRV9JRCxUWVBFLE9QX0lELEJJVFMsT1AsUlRZUEVfSUQsUlRZUEUsTENLX0lELE1BU0ssR09NUF9GTEFHKSBcCitBVE9NSUNfQkVHSU5fTUlYKFRZUEVfSUQsVFlQRSxPUF9JRCxSVFlQRV9JRCxSVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMKE9QIyM9LEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICggISAoIChrbXBfdWludHB0cl90KSBsaHMgJiAweCMjTUFTSykgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE9QX0NNUFhDSEcoVFlQRSxCSVRTLE9QKSAgICAgLyogYWxpZ25lZCBhZGRyZXNzICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfQ0hFQ0tfR1RJRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE9QX0NSSVRJQ0FMKE9QIyM9LExDS19JRCkgIC8qIHVuYWxpZ25lZCBhZGRyZXNzIC0gdXNlIGNyaXRpY2FsICovICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKworLy8gUkhTPWZsb2F0OAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmaXhlZDEsIGNoYXIsICAgICAgIG11bCwgIDgsICosIGZsb2F0OCwga21wX3JlYWw2NCwgMWksIDAsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX211bF9mbG9hdDgKK0FUT01JQ19DTVBYQ0hHX01JWCggZml4ZWQxLCBjaGFyLCAgICAgICBkaXYsICA4LCAvLCBmbG9hdDgsIGttcF9yZWFsNjQsIDFpLCAwLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9kaXZfZmxvYXQ4CitBVE9NSUNfQ01QWENIR19NSVgoIGZpeGVkMiwgc2hvcnQsICAgICAgbXVsLCAxNiwgKiwgZmxvYXQ4LCBrbXBfcmVhbDY0LCAyaSwgMSwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDJfbXVsX2Zsb2F0OAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmaXhlZDIsIHNob3J0LCAgICAgIGRpdiwgMTYsIC8sIGZsb2F0OCwga21wX3JlYWw2NCwgMmksIDEsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX2Rpdl9mbG9hdDgKK0FUT01JQ19DTVBYQ0hHX01JWCggZml4ZWQ0LCBrbXBfaW50MzIsICBtdWwsIDMyLCAqLCBmbG9hdDgsIGttcF9yZWFsNjQsIDRpLCAzLCAwICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9tdWxfZmxvYXQ4CitBVE9NSUNfQ01QWENIR19NSVgoIGZpeGVkNCwga21wX2ludDMyLCAgZGl2LCAzMiwgLywgZmxvYXQ4LCBrbXBfcmVhbDY0LCA0aSwgMywgMCApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfZGl2X2Zsb2F0OAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmaXhlZDgsIGttcF9pbnQ2NCwgIG11bCwgNjQsICosIGZsb2F0OCwga21wX3JlYWw2NCwgOGksIDcsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X211bF9mbG9hdDgKK0FUT01JQ19DTVBYQ0hHX01JWCggZml4ZWQ4LCBrbXBfaW50NjQsICBkaXYsIDY0LCAvLCBmbG9hdDgsIGttcF9yZWFsNjQsIDhpLCA3LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9kaXZfZmxvYXQ4CitBVE9NSUNfQ01QWENIR19NSVgoIGZsb2F0NCwga21wX3JlYWwzMiwgYWRkLCAzMiwgKywgZmxvYXQ4LCBrbXBfcmVhbDY0LCA0ciwgMywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfYWRkX2Zsb2F0OAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmbG9hdDQsIGttcF9yZWFsMzIsIHN1YiwgMzIsIC0sIGZsb2F0OCwga21wX3JlYWw2NCwgNHIsIDMsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZmxvYXQ0X3N1Yl9mbG9hdDgKK0FUT01JQ19DTVBYQ0hHX01JWCggZmxvYXQ0LCBrbXBfcmVhbDMyLCBtdWwsIDMyLCAqLCBmbG9hdDgsIGttcF9yZWFsNjQsIDRyLCAzLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9tdWxfZmxvYXQ4CitBVE9NSUNfQ01QWENIR19NSVgoIGZsb2F0NCwga21wX3JlYWwzMiwgZGl2LCAzMiwgLywgZmxvYXQ4LCBrbXBfcmVhbDY0LCA0ciwgMywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfZGl2X2Zsb2F0OAorCisvLyBSSFM9ZmxvYXQxNiAoZGVwcmVjYXRlZCwgdG8gYmUgcmVtb3ZlZCB3aGVuIHdlIGFyZSBzdXJlIHRoZSBjb21waWxlciBkb2VzIG5vdCB1c2UgdGhlbSkKKyNpZiBLTVBfSEFWRV9RVUFECitBVE9NSUNfQ01QWENIR19NSVgoIGZpeGVkMSwgIGNoYXIsICAgICAgIGFkZCwgIDgsICssIGZwLCBfUXVhZCwgMWksIDAsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX2FkZF9mcAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmaXhlZDEsICBjaGFyLCAgICAgICBzdWIsICA4LCAtLCBmcCwgX1F1YWQsIDFpLCAwLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zdWJfZnAKK0FUT01JQ19DTVBYQ0hHX01JWCggZml4ZWQxLCAgY2hhciwgICAgICAgbXVsLCAgOCwgKiwgZnAsIF9RdWFkLCAxaSwgMCwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDFfbXVsX2ZwCitBVE9NSUNfQ01QWENIR19NSVgoIGZpeGVkMSwgIGNoYXIsICAgICAgIGRpdiwgIDgsIC8sIGZwLCBfUXVhZCwgMWksIDAsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX2Rpdl9mcAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmaXhlZDF1LCB1Y2hhciwgICAgICBkaXYsICA4LCAvLCBmcCwgX1F1YWQsIDFpLCAwLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfZGl2X2ZwCisKK0FUT01JQ19DTVBYQ0hHX01JWCggZml4ZWQyLCAgc2hvcnQsICAgICAgYWRkLCAxNiwgKywgZnAsIF9RdWFkLCAyaSwgMSwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDJfYWRkX2ZwCitBVE9NSUNfQ01QWENIR19NSVgoIGZpeGVkMiwgIHNob3J0LCAgICAgIHN1YiwgMTYsIC0sIGZwLCBfUXVhZCwgMmksIDEsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX3N1Yl9mcAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmaXhlZDIsICBzaG9ydCwgICAgICBtdWwsIDE2LCAqLCBmcCwgX1F1YWQsIDJpLCAxLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9tdWxfZnAKK0FUT01JQ19DTVBYQ0hHX01JWCggZml4ZWQyLCAgc2hvcnQsICAgICAgZGl2LCAxNiwgLywgZnAsIF9RdWFkLCAyaSwgMSwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDJfZGl2X2ZwCitBVE9NSUNfQ01QWENIR19NSVgoIGZpeGVkMnUsIHVzaG9ydCwgICAgIGRpdiwgMTYsIC8sIGZwLCBfUXVhZCwgMmksIDEsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQydV9kaXZfZnAKKworQVRPTUlDX0NNUFhDSEdfTUlYKCBmaXhlZDQsICBrbXBfaW50MzIsICBhZGQsIDMyLCArLCBmcCwgX1F1YWQsIDRpLCAzLCAwICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hZGRfZnAKK0FUT01JQ19DTVBYQ0hHX01JWCggZml4ZWQ0LCAga21wX2ludDMyLCAgc3ViLCAzMiwgLSwgZnAsIF9RdWFkLCA0aSwgMywgMCApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfc3ViX2ZwCitBVE9NSUNfQ01QWENIR19NSVgoIGZpeGVkNCwgIGttcF9pbnQzMiwgIG11bCwgMzIsICosIGZwLCBfUXVhZCwgNGksIDMsIDAgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X211bF9mcAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmaXhlZDQsICBrbXBfaW50MzIsICBkaXYsIDMyLCAvLCBmcCwgX1F1YWQsIDRpLCAzLCAwICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9kaXZfZnAKK0FUT01JQ19DTVBYQ0hHX01JWCggZml4ZWQ0dSwga21wX3VpbnQzMiwgZGl2LCAzMiwgLywgZnAsIF9RdWFkLCA0aSwgMywgMCApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19maXhlZDR1X2Rpdl9mcAorCitBVE9NSUNfQ01QWENIR19NSVgoIGZpeGVkOCwgIGttcF9pbnQ2NCwgIGFkZCwgNjQsICssIGZwLCBfUXVhZCwgOGksIDcsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X2FkZF9mcAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmaXhlZDgsICBrbXBfaW50NjQsICBzdWIsIDY0LCAtLCBmcCwgX1F1YWQsIDhpLCA3LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zdWJfZnAKK0FUT01JQ19DTVBYQ0hHX01JWCggZml4ZWQ4LCAga21wX2ludDY0LCAgbXVsLCA2NCwgKiwgZnAsIF9RdWFkLCA4aSwgNywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDhfbXVsX2ZwCitBVE9NSUNfQ01QWENIR19NSVgoIGZpeGVkOCwgIGttcF9pbnQ2NCwgIGRpdiwgNjQsIC8sIGZwLCBfUXVhZCwgOGksIDcsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X2Rpdl9mcAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmaXhlZDh1LCBrbXBfdWludDY0LCBkaXYsIDY0LCAvLCBmcCwgX1F1YWQsIDhpLCA3LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfZGl2X2ZwCisKK0FUT01JQ19DTVBYQ0hHX01JWCggZmxvYXQ0LCAga21wX3JlYWwzMiwgYWRkLCAzMiwgKywgZnAsIF9RdWFkLCA0ciwgMywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfYWRkX2ZwCitBVE9NSUNfQ01QWENIR19NSVgoIGZsb2F0NCwgIGttcF9yZWFsMzIsIHN1YiwgMzIsIC0sIGZwLCBfUXVhZCwgNHIsIDMsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZmxvYXQ0X3N1Yl9mcAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmbG9hdDQsICBrbXBfcmVhbDMyLCBtdWwsIDMyLCAqLCBmcCwgX1F1YWQsIDRyLCAzLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9tdWxfZnAKK0FUT01JQ19DTVBYQ0hHX01JWCggZmxvYXQ0LCAga21wX3JlYWwzMiwgZGl2LCAzMiwgLywgZnAsIF9RdWFkLCA0ciwgMywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfZGl2X2ZwCisKK0FUT01JQ19DTVBYQ0hHX01JWCggZmxvYXQ4LCAga21wX3JlYWw2NCwgYWRkLCA2NCwgKywgZnAsIF9RdWFkLCA4ciwgNywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19mbG9hdDhfYWRkX2ZwCitBVE9NSUNfQ01QWENIR19NSVgoIGZsb2F0OCwgIGttcF9yZWFsNjQsIHN1YiwgNjQsIC0sIGZwLCBfUXVhZCwgOHIsIDcsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZmxvYXQ4X3N1Yl9mcAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmbG9hdDgsICBrbXBfcmVhbDY0LCBtdWwsIDY0LCAqLCBmcCwgX1F1YWQsIDhyLCA3LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF9tdWxfZnAKK0FUT01JQ19DTVBYQ0hHX01JWCggZmxvYXQ4LCAga21wX3JlYWw2NCwgZGl2LCA2NCwgLywgZnAsIF9RdWFkLCA4ciwgNywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19mbG9hdDhfZGl2X2ZwCisKK0FUT01JQ19DUklUSUNBTF9GUCggZmxvYXQxMCwgbG9uZyBkb3VibGUsICAgIGFkZCwgKywgZnAsIF9RdWFkLCAxMHIsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDEwX2FkZF9mcAorQVRPTUlDX0NSSVRJQ0FMX0ZQKCBmbG9hdDEwLCBsb25nIGRvdWJsZSwgICAgc3ViLCAtLCBmcCwgX1F1YWQsIDEwciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfc3ViX2ZwCitBVE9NSUNfQ1JJVElDQUxfRlAoIGZsb2F0MTAsIGxvbmcgZG91YmxlLCAgICBtdWwsICosIGZwLCBfUXVhZCwgMTByLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxMF9tdWxfZnAKK0FUT01JQ19DUklUSUNBTF9GUCggZmxvYXQxMCwgbG9uZyBkb3VibGUsICAgIGRpdiwgLywgZnAsIF9RdWFkLCAxMHIsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDEwX2Rpdl9mcAorI2VuZGlmCisKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFg4NiBvciBYODZfNjQ6IG5vIGFsaWdubWVudCBwcm9ibGVtcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyNpZiBVU0VfQ01QWENIR19GSVgKKy8vIHdvcmthcm91bmQgZm9yIEM3ODI4NyAoY29tcGxleChraW5kPTQpIGRhdGEgdHlwZSkKKyNkZWZpbmUgQVRPTUlDX0NNUFhDSEdfQ01QTFgoVFlQRV9JRCxUWVBFLE9QX0lELEJJVFMsT1AsUlRZUEVfSUQsUlRZUEUsTENLX0lELE1BU0ssR09NUF9GTEFHKSBcCitBVE9NSUNfQkVHSU5fTUlYKFRZUEVfSUQsVFlQRSxPUF9JRCxSVFlQRV9JRCxSVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUwoT1AjIz0sR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9DTVBYQ0hHX1dPUktBUk9VTkQoVFlQRSxCSVRTLE9QKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisvLyBlbmQgb2YgdGhlIHNlY29uZCBwYXJ0IG9mIHRoZSB3b3JrYXJvdW5kIGZvciBDNzgyODcKKyNlbHNlCisjZGVmaW5lIEFUT01JQ19DTVBYQ0hHX0NNUExYKFRZUEVfSUQsVFlQRSxPUF9JRCxCSVRTLE9QLFJUWVBFX0lELFJUWVBFLExDS19JRCxNQVNLLEdPTVBfRkxBRykgXAorQVRPTUlDX0JFR0lOX01JWChUWVBFX0lELFRZUEUsT1BfSUQsUlRZUEVfSUQsUlRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMKE9QIyM9LEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfQ01QWENIRyhUWVBFLEJJVFMsT1ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorI2VuZGlmIC8vIFVTRV9DTVBYQ0hHX0ZJWAorI2Vsc2UKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ29kZSBmb3Igb3RoZXIgYXJjaGl0ZWN0dXJlcyB0aGF0IGRvbid0IGhhbmRsZSB1bmFsaWduZWQgYWNjZXNzZXMuCisjZGVmaW5lIEFUT01JQ19DTVBYQ0hHX0NNUExYKFRZUEVfSUQsVFlQRSxPUF9JRCxCSVRTLE9QLFJUWVBFX0lELFJUWVBFLExDS19JRCxNQVNLLEdPTVBfRkxBRykgXAorQVRPTUlDX0JFR0lOX01JWChUWVBFX0lELFRZUEUsT1BfSUQsUlRZUEVfSUQsUlRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMKE9QIyM9LEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCAhICggKGttcF91aW50cHRyX3QpIGxocyAmIDB4IyNNQVNLKSApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBPUF9DTVBYQ0hHKFRZUEUsQklUUyxPUCkgICAgIC8qIGFsaWduZWQgYWRkcmVzcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9DSEVDS19HVElEOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBPUF9DUklUSUNBTChPUCMjPSxMQ0tfSUQpICAvKiB1bmFsaWduZWQgYWRkcmVzcyAtIHVzZSBjcml0aWNhbCAqLyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisjZW5kaWYgLyogS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCAqLworCitBVE9NSUNfQ01QWENIR19DTVBMWCggY21wbHg0LCBrbXBfY21wbHgzMiwgYWRkLCA2NCwgKywgY21wbHg4LCAga21wX2NtcGx4NjQsICA4YywgNywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19jbXBseDRfYWRkX2NtcGx4OAorQVRPTUlDX0NNUFhDSEdfQ01QTFgoIGNtcGx4NCwga21wX2NtcGx4MzIsIHN1YiwgNjQsIC0sIGNtcGx4OCwgIGttcF9jbXBseDY0LCAgOGMsIDcsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfY21wbHg0X3N1Yl9jbXBseDgKK0FUT01JQ19DTVBYQ0hHX0NNUExYKCBjbXBseDQsIGttcF9jbXBseDMyLCBtdWwsIDY0LCAqLCBjbXBseDgsICBrbXBfY21wbHg2NCwgIDhjLCA3LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2NtcGx4NF9tdWxfY21wbHg4CitBVE9NSUNfQ01QWENIR19DTVBMWCggY21wbHg0LCBrbXBfY21wbHgzMiwgZGl2LCA2NCwgLywgY21wbHg4LCAga21wX2NtcGx4NjQsICA4YywgNywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19jbXBseDRfZGl2X2NtcGx4OAorCisvLyBSRUFELCBXUklURSwgQ0FQVFVSRSBhcmUgc3VwcG9ydGVkIG9ubHkgb24gSUEtMzIgYXJjaGl0ZWN0dXJlIGFuZCBJbnRlbChSKSA2NAorI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEF0b21pYyBSRUFEIHJvdXRpbmVzCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBCZWdpbm5pbmcgb2YgYSBkZWZpbml0aW9uIChwcm92aWRlcyBuYW1lLCBwYXJhbWV0ZXJzLCBnZWJ1ZyB0cmFjZSkKKy8vICAgICBUWVBFX0lEIC0gb3BlcmFuZHMgdHlwZSBhbmQgc2l6ZSAoZml4ZWQqLCBmaXhlZCp1IGZvciBzaWduZWQsIHVuc2lnbmVkIGZpeGVkKQorLy8gICAgIE9QX0lEICAgLSBvcGVyYXRpb24gaWRlbnRpZmllciAoYWRkLCBzdWIsIG11bCwgLi4uKQorLy8gICAgIFRZUEUgICAgLSBvcGVyYW5kcycgdHlwZQorI2RlZmluZSBBVE9NSUNfQkVHSU5fUkVBRChUWVBFX0lELE9QX0lELFRZUEUsIFJFVF9UWVBFKSBcCitSRVRfVFlQRSBfX2ttcGNfYXRvbWljXyMjVFlQRV9JRCMjXyMjT1BfSUQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFRZUEUgKiBsb2MgKSBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS0FfVFJBQ0UoMTAwLCgiX19rbXBjX2F0b21pY18iICNUWVBFX0lEICJfIiAjT1BfSUQgIjogVCMlZFxuIiwgZ3RpZCApKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBPcGVyYXRpb24gb24gKmxocywgcmhzIHVzaW5nICJjb21wYXJlX2FuZF9zdG9yZV9yZXQiIHJvdXRpbmUKKy8vICAgICBUWVBFICAgIC0gb3BlcmFuZHMnIHR5cGUKKy8vICAgICBCSVRTICAgIC0gc2l6ZSBpbiBiaXRzLCB1c2VkIHRvIGRpc3Rpbmd1aXNoIGxvdyBsZXZlbCBjYWxscworLy8gICAgIE9QICAgICAgLSBvcGVyYXRvcgorLy8gTm90ZTogdGVtcF92YWwgaW50cm9kdWNlZCBpbiBvcmRlciB0byBmb3JjZSB0aGUgY29tcGlsZXIgdG8gcmVhZAorLy8gICAgICAgKmxocyBvbmx5IG9uY2UgKHcvbyBpdCB0aGUgY29tcGlsZXIgcmVhZHMgKmxocyB0d2ljZSkKKy8vIFRPRE86IGNoZWNrIGlmIGl0IGlzIHN0aWxsIG5lY2Vzc2FyeQorLy8gUmV0dXJuIG9sZCB2YWx1ZSByZWdhcmRsZXNzIG9mIHRoZSByZXN1bHQgb2YgImNvbXBhcmUgJiBzd2FwIyBvcGVyYXRpb24KKworI2RlZmluZSBPUF9DTVBYQ0hHX1JFQUQoVFlQRSxCSVRTLE9QKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgVFlQRSBLTVBfQVRPTUlDX1ZPTEFUSUxFIHRlbXBfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB1bmlvbiBmX2lfdW5pb24geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBUWVBFIGZfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGttcF9pbnQjI0JJVFMgaV92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHVuaW9uIGZfaV91bmlvbiBvbGRfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdGVtcF92YWwgPSAqbG9jOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBvbGRfdmFsdWUuZl92YWwgPSB0ZW1wX3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG9sZF92YWx1ZS5pX3ZhbCA9IEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRVQjI0JJVFMoIChrbXBfaW50IyNCSVRTICopIGxvYywgXAorICAgICAgICAgICAgICAgICAgICAgICpWT0xBVElMRV9DQVNUKGttcF9pbnQjI0JJVFMgKikgJm9sZF92YWx1ZS5pX3ZhbCwgICBcCisgICAgICAgICAgICAgICAgICAgICAgKlZPTEFUSUxFX0NBU1Qoa21wX2ludCMjQklUUyAqKSAmb2xkX3ZhbHVlLmlfdmFsICk7IFwKKyAgICAgICAgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlLmZfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm4gbmV3X3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBPcGVyYXRpb24gb24gKmxocywgcmhzIGJvdW5kIGJ5IGNyaXRpY2FsIHNlY3Rpb24KKy8vICAgICBPUCAgICAgLSBvcGVyYXRvciAoaXQncyBzdXBwb3NlZCB0byBjb250YWluIGFuIGFzc2lnbm1lbnQpCisvLyAgICAgTENLX0lEIC0gbG9jayBpZGVudGlmaWVyCisvLyBOb3RlOiBkb24ndCBjaGVjayBndGlkIGFzIGl0IHNob3VsZCBhbHdheXMgYmUgdmFsaWQKKy8vIDEsIDItYnl0ZSAtIGV4cGVjdCB2YWxpZCBwYXJhbWV0ZXIsIG90aGVyIC0gY2hlY2sgYmVmb3JlIHRoaXMgbWFjcm8KKyNkZWZpbmUgT1BfQ1JJVElDQUxfUkVBRChPUCxMQ0tfSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soICYgQVRPTUlDX0xPQ0sjI0xDS19JRCwgZ3RpZCApOyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbmV3X3ZhbHVlID0gKCpsb2MpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soICYgQVRPTUlDX0xPQ0sjI0xDS19JRCwgZ3RpZCApOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisjZGVmaW5lIE9QX0dPTVBfQ1JJVElDQUxfUkVBRChPUCxGTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIChGTEFHKSAmJiAoX19rbXBfYXRvbWljX21vZGUgPT0gMikgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfQ0hFQ0tfR1RJRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE9QX0NSSVRJQ0FMX1JFQUQoIE9QLCAwICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIG5ld192YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKyNlbHNlCisjZGVmaW5lIE9QX0dPTVBfQ1JJVElDQUxfUkVBRChPUCxGTEFHKQorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEFUT01JQ19GSVhFRF9SRUFEKFRZUEVfSUQsT1BfSUQsVFlQRSxCSVRTLE9QLEdPTVBfRkxBRykgICAgICAgICAgIFwKK0FUT01JQ19CRUdJTl9SRUFEKFRZUEVfSUQsT1BfSUQsVFlQRSxUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRZUEUgbmV3X3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTF9SRUFEKE9QIyM9LEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBuZXdfdmFsdWUgPSBLTVBfVEVTVF9USEVOX0FERCMjQklUUyggbG9jLCBPUCAwICk7ICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBuZXdfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEFUT01JQ19DTVBYQ0hHX1JFQUQoVFlQRV9JRCxPUF9JRCxUWVBFLEJJVFMsT1AsR09NUF9GTEFHKSAgICAgICAgIFwKK0FUT01JQ19CRUdJTl9SRUFEKFRZUEVfSUQsT1BfSUQsVFlQRSxUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRZUEUgbmV3X3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTF9SRUFEKE9QIyM9LEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9DTVBYQ0hHX1JFQUQoVFlQRSxCSVRTLE9QKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSb3V0aW5lcyBmb3IgRXh0ZW5kZWQgdHlwZXM6IGxvbmcgZG91YmxlLCBfUXVhZCwgY29tcGxleCBmbGF2b3VycyAodXNlIGNyaXRpY2FsIHNlY3Rpb24pCisvLyAgICAgVFlQRV9JRCwgT1BfSUQsIFRZUEUgLSBkZXRhaWxlZCBhYm92ZQorLy8gICAgIE9QICAgICAgLSBvcGVyYXRvcgorLy8gICAgIExDS19JRCAgLSBsb2NrIGlkZW50aWZpZXIsIHVzZWQgdG8gcG9zc2libHkgZGlzdGluZ3Vpc2ggbG9jayB2YXJpYWJsZQorI2RlZmluZSBBVE9NSUNfQ1JJVElDQUxfUkVBRChUWVBFX0lELE9QX0lELFRZUEUsT1AsTENLX0lELEdPTVBfRkxBRykgICAgICBcCitBVE9NSUNfQkVHSU5fUkVBRChUWVBFX0lELE9QX0lELFRZUEUsVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUWVBFIG5ld192YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUxfUkVBRChPUCMjPSxHT01QX0ZMQUcpICAvKiBzZW5kIGFzc2lnbm1lbnQgKi8gICAgICAgICBcCisgICAgT1BfQ1JJVElDQUxfUkVBRChPUCxMQ0tfSUQpICAgICAgICAgIC8qIHNlbmQgYXNzaWdubWVudCAqLyAgICAgICAgICAgIFwKKyAgICByZXR1cm4gbmV3X3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEZpeCBmb3IgY21wbHg0IHJlYWQgKENRMjIwMzYxKSBvbiBXaW5kb3dzKiBPUy4gUmVndWxhciByb3V0aW5lIHdpdGggcmV0dXJuIHZhbHVlIGRvZXNuJ3Qgd29yay4KKy8vIExldCdzIHJldHVybiB0aGUgcmVhZCB2YWx1ZSB0aHJvdWdoIHRoZSBhZGRpdGlvbmFsIHBhcmFtZXRlci4KKworI2lmICggS01QX09TX1dJTkRPV1MgKQorCisjZGVmaW5lIE9QX0NSSVRJQ0FMX1JFQURfV1JLKE9QLExDS19JRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCAmIEFUT01JQ19MT0NLIyNMQ0tfSUQsIGd0aWQgKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgqb3V0KSA9ICgqbG9jKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCAmIEFUT01JQ19MT0NLIyNMQ0tfSUQsIGd0aWQgKTsKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorI2RlZmluZSBPUF9HT01QX0NSSVRJQ0FMX1JFQURfV1JLKE9QLEZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCAoRkxBRykgJiYgKF9fa21wX2F0b21pY19tb2RlID09IDIpICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0NIRUNLX0dUSUQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBPUF9DUklUSUNBTF9SRUFEX1dSSyggT1AsIDAgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorI2Vsc2UKKyNkZWZpbmUgT1BfR09NUF9DUklUSUNBTF9SRUFEX1dSSyhPUCxGTEFHKQorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEFUT01JQ19CRUdJTl9SRUFEX1dSSyhUWVBFX0lELE9QX0lELFRZUEUpIFwKK3ZvaWQgX19rbXBjX2F0b21pY18jI1RZUEVfSUQjI18jI09QX0lEKCBUWVBFICogb3V0LCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBUWVBFICogbG9jICkgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtBX1RSQUNFKDEwMCwoIl9fa21wY19hdG9taWNfIiAjVFlQRV9JRCAiXyIgI09QX0lEICI6IFQjJWRcbiIsIGd0aWQgKSk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBBVE9NSUNfQ1JJVElDQUxfUkVBRF9XUksoVFlQRV9JRCxPUF9JRCxUWVBFLE9QLExDS19JRCxHT01QX0ZMQUcpICAgICAgXAorQVRPTUlDX0JFR0lOX1JFQURfV1JLKFRZUEVfSUQsT1BfSUQsVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUxfUkVBRF9XUksoT1AjIz0sR09NUF9GTEFHKSAgLyogc2VuZCBhc3NpZ25tZW50ICovICAgICAgICAgXAorICAgIE9QX0NSSVRJQ0FMX1JFQURfV1JLKE9QLExDS19JRCkgICAgICAgICAgLyogc2VuZCBhc3NpZ25tZW50ICovICAgICAgICAgICAgXAorfQorCisjZW5kaWYgLy8gS01QX09TX1dJTkRPV1MKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgICAgICAgICAgICAgICAgIFRZUEVfSUQsT1BfSUQsIFRZUEUsICAgICAgT1AsIEdPTVBfRkxBRworQVRPTUlDX0ZJWEVEX1JFQUQoIGZpeGVkNCwgcmQsIGttcF9pbnQzMiwgIDMyLCArLCAwICAgICAgICAgICAgKSAgICAgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X3JkCitBVE9NSUNfRklYRURfUkVBRCggZml4ZWQ4LCByZCwga21wX2ludDY0LCAgNjQsICssIEtNUF9BUkNIX1g4NiApICAgICAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfcmQKK0FUT01JQ19DTVBYQ0hHX1JFQUQoIGZsb2F0NCwgcmQsIGttcF9yZWFsMzIsIDMyLCArLCBLTVBfQVJDSF9YODYgKSAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9yZAorQVRPTUlDX0NNUFhDSEdfUkVBRCggZmxvYXQ4LCByZCwga21wX3JlYWw2NCwgNjQsICssIEtNUF9BUkNIX1g4NiApICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQ4X3JkCisKKy8vICEhISBUT0RPOiBSZW1vdmUgbG9jayBvcGVyYXRpb25zIGZvciAiY2hhciIgc2luY2UgaXQgY2FuJ3QgYmUgbm9uLWF0b21pYworQVRPTUlDX0NNUFhDSEdfUkVBRCggZml4ZWQxLCAgcmQsIGttcF9pbnQ4LCAgICA4LCArLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX3JkCitBVE9NSUNfQ01QWENIR19SRUFEKCBmaXhlZDIsICByZCwga21wX2ludDE2LCAgMTYsICssICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJfcmQKKworQVRPTUlDX0NSSVRJQ0FMX1JFQUQoIGZsb2F0MTAsIHJkLCBsb25nIGRvdWJsZSwgKywgMTByLCAgIDEgKSAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxMF9yZAorI2lmIEtNUF9IQVZFX1FVQUQKK0FUT01JQ19DUklUSUNBTF9SRUFEKCBmbG9hdDE2LCByZCwgUVVBRF9MRUdBQ1ksICssIDE2ciwgICAxICkgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfcmQKKyNlbmRpZiAvLyBLTVBfSEFWRV9RVUFECisKKy8vIEZpeCBmb3IgQ1EyMjAzNjEgb24gV2luZG93cyogT1MKKyNpZiAoIEtNUF9PU19XSU5ET1dTICkKKyAgICBBVE9NSUNfQ1JJVElDQUxfUkVBRF9XUksoIGNtcGx4NCwgIHJkLCBrbXBfY21wbHgzMiwgKywgIDhjLCAxICkgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4NF9yZAorI2Vsc2UKKyAgICBBVE9NSUNfQ1JJVElDQUxfUkVBRCggY21wbHg0LCAgcmQsIGttcF9jbXBseDMyLCArLCAgOGMsIDEgKSAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4NF9yZAorI2VuZGlmCitBVE9NSUNfQ1JJVElDQUxfUkVBRCggY21wbHg4LCAgcmQsIGttcF9jbXBseDY0LCArLCAxNmMsIDEgKSAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDhfcmQKK0FUT01JQ19DUklUSUNBTF9SRUFEKCBjbXBseDEwLCByZCwga21wX2NtcGx4ODAsICssIDIwYywgMSApICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTBfcmQKKyNpZiBLTVBfSEFWRV9RVUFECitBVE9NSUNfQ1JJVElDQUxfUkVBRCggY21wbHgxNiwgcmQsIENQTFgxMjhfTEVHLCArLCAzMmMsIDEgKSAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X3JkCisjaWYgKCBLTVBfQVJDSF9YODYgKQorICAgIEFUT01JQ19DUklUSUNBTF9SRUFEKCBmbG9hdDE2LCBhMTZfcmQsIFF1YWRfYTE2X3QsICssIDE2ciwgMSApICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X2ExNl9yZAorICAgIEFUT01JQ19DUklUSUNBTF9SRUFEKCBjbXBseDE2LCBhMTZfcmQsIGttcF9jbXBseDEyOF9hMTZfdCwgKywgMzJjLCAxICkgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X2ExNl9yZAorI2VuZGlmCisjZW5kaWYKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEF0b21pYyBXUklURSByb3V0aW5lcworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgQVRPTUlDX1hDSEdfV1IoVFlQRV9JRCxPUF9JRCxUWVBFLEJJVFMsT1AsR09NUF9GTEFHKSAgICAgICAgICAgICAgXAorQVRPTUlDX0JFR0lOKFRZUEVfSUQsT1BfSUQsVFlQRSx2b2lkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTChPUCxHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLTVBfWENIR19GSVhFRCMjQklUUyggbGhzLCByaHMgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEFUT01JQ19YQ0hHX0ZMT0FUX1dSKFRZUEVfSUQsT1BfSUQsVFlQRSxCSVRTLE9QLEdPTVBfRkxBRykgICAgICAgIFwKK0FUT01JQ19CRUdJTihUWVBFX0lELE9QX0lELFRZUEUsdm9pZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUwoT1AsR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS01QX1hDSEdfUkVBTCMjQklUUyggbGhzLCByaHMgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE9wZXJhdGlvbiBvbiAqbGhzLCByaHMgdXNpbmcgImNvbXBhcmVfYW5kX3N0b3JlIiByb3V0aW5lCisvLyAgICAgVFlQRSAgICAtIG9wZXJhbmRzJyB0eXBlCisvLyAgICAgQklUUyAgICAtIHNpemUgaW4gYml0cywgdXNlZCB0byBkaXN0aW5ndWlzaCBsb3cgbGV2ZWwgY2FsbHMKKy8vICAgICBPUCAgICAgIC0gb3BlcmF0b3IKKy8vIE5vdGU6IHRlbXBfdmFsIGludHJvZHVjZWQgaW4gb3JkZXIgdG8gZm9yY2UgdGhlIGNvbXBpbGVyIHRvIHJlYWQKKy8vICAgICAgICpsaHMgb25seSBvbmNlICh3L28gaXQgdGhlIGNvbXBpbGVyIHJlYWRzICpsaHMgdHdpY2UpCisjZGVmaW5lIE9QX0NNUFhDSEdfV1IoVFlQRSxCSVRTLE9QKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBUWVBFIEtNUF9BVE9NSUNfVk9MQVRJTEUgdGVtcF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFRZUEUgb2xkX3ZhbHVlLCBuZXdfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdGVtcF92YWwgPSAqbGhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBvbGRfdmFsdWUgPSB0ZW1wX3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG5ld192YWx1ZSA9IHJoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgd2hpbGUgKCAhIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EjI0JJVFMoIChrbXBfaW50IyNCSVRTICopIGxocywgXAorICAgICAgICAgICAgICAgICAgICAgICpWT0xBVElMRV9DQVNUKGttcF9pbnQjI0JJVFMgKikgJm9sZF92YWx1ZSwgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgKlZPTEFUSUxFX0NBU1Qoa21wX2ludCMjQklUUyAqKSAmbmV3X3ZhbHVlICkgKSAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgS01QX0NQVV9QQVVTRSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHRlbXBfdmFsID0gKmxoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgb2xkX3ZhbHVlID0gdGVtcF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBuZXdfdmFsdWUgPSByaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBBVE9NSUNfQ01QWENIR19XUihUWVBFX0lELE9QX0lELFRZUEUsQklUUyxPUCxHT01QX0ZMQUcpICAgICAgICAgICBcCitBVE9NSUNfQkVHSU4oVFlQRV9JRCxPUF9JRCxUWVBFLHZvaWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMKE9QLEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0NNUFhDSEdfV1IoVFlQRSxCSVRTLE9QKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUm91dGluZXMgZm9yIEV4dGVuZGVkIHR5cGVzOiBsb25nIGRvdWJsZSwgX1F1YWQsIGNvbXBsZXggZmxhdm91cnMgKHVzZSBjcml0aWNhbCBzZWN0aW9uKQorLy8gICAgIFRZUEVfSUQsIE9QX0lELCBUWVBFIC0gZGV0YWlsZWQgYWJvdmUKKy8vICAgICBPUCAgICAgIC0gb3BlcmF0b3IKKy8vICAgICBMQ0tfSUQgIC0gbG9jayBpZGVudGlmaWVyLCB1c2VkIHRvIHBvc3NpYmx5IGRpc3Rpbmd1aXNoIGxvY2sgdmFyaWFibGUKKyNkZWZpbmUgQVRPTUlDX0NSSVRJQ0FMX1dSKFRZUEVfSUQsT1BfSUQsVFlQRSxPUCxMQ0tfSUQsR09NUF9GTEFHKSAgICAgICAgXAorQVRPTUlDX0JFR0lOKFRZUEVfSUQsT1BfSUQsVFlQRSx2b2lkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTChPUCxHT01QX0ZMQUcpICAgICAgIC8qIHNlbmQgYXNzaWdubWVudCAqLyAgICAgICAgICAgIFwKKyAgICBPUF9DUklUSUNBTChPUCxMQ0tfSUQpICAgICAgICAgICAgICAgLyogc2VuZCBhc3NpZ25tZW50ICovICAgICAgICAgICAgXAorfQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBVE9NSUNfWENIR19XUiggZml4ZWQxLCAgd3IsIGttcF9pbnQ4LCAgICA4LCA9LCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX3dyCitBVE9NSUNfWENIR19XUiggZml4ZWQyLCAgd3IsIGttcF9pbnQxNiwgIDE2LCA9LCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX3dyCitBVE9NSUNfWENIR19XUiggZml4ZWQ0LCAgd3IsIGttcF9pbnQzMiwgIDMyLCA9LCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X3dyCisjaWYgKCBLTVBfQVJDSF9YODYgKQorICAgIEFUT01JQ19DTVBYQ0hHX1dSKCBmaXhlZDgsICB3ciwga21wX2ludDY0LCAgNjQsID0sICBLTVBfQVJDSF9YODYgKSAgICAgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X3dyCisjZWxzZQorICAgIEFUT01JQ19YQ0hHX1dSKCBmaXhlZDgsICB3ciwga21wX2ludDY0LCAgNjQsID0sICBLTVBfQVJDSF9YODYgKSAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X3dyCisjZW5kaWYKKworQVRPTUlDX1hDSEdfRkxPQVRfV1IoIGZsb2F0NCwgd3IsIGttcF9yZWFsMzIsIDMyLCA9LCBLTVBfQVJDSF9YODYgKSAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQ0X3dyCisjaWYgKCBLTVBfQVJDSF9YODYgKQorICAgIEFUT01JQ19DTVBYQ0hHX1dSKCBmbG9hdDgsICB3ciwga21wX3JlYWw2NCwgIDY0LCA9LCAgS01QX0FSQ0hfWDg2ICkgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQ4X3dyCisjZWxzZQorICAgIEFUT01JQ19YQ0hHX0ZMT0FUX1dSKCBmbG9hdDgsICB3ciwga21wX3JlYWw2NCwgIDY0LCA9LCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZmxvYXQ4X3dyCisjZW5kaWYKKworQVRPTUlDX0NSSVRJQ0FMX1dSKCBmbG9hdDEwLCB3ciwgbG9uZyBkb3VibGUsID0sIDEwciwgICAxICkgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfd3IKKyNpZiBLTVBfSEFWRV9RVUFECitBVE9NSUNfQ1JJVElDQUxfV1IoIGZsb2F0MTYsIHdyLCBRVUFEX0xFR0FDWSwgPSwgMTZyLCAgIDEgKSAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl93cgorI2VuZGlmCitBVE9NSUNfQ1JJVElDQUxfV1IoIGNtcGx4NCwgIHdyLCBrbXBfY21wbHgzMiwgPSwgIDhjLCAgIDEgKSAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHg0X3dyCitBVE9NSUNfQ1JJVElDQUxfV1IoIGNtcGx4OCwgIHdyLCBrbXBfY21wbHg2NCwgPSwgMTZjLCAgIDEgKSAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHg4X3dyCitBVE9NSUNfQ1JJVElDQUxfV1IoIGNtcGx4MTAsIHdyLCBrbXBfY21wbHg4MCwgPSwgMjBjLCAgIDEgKSAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxMF93cgorI2lmIEtNUF9IQVZFX1FVQUQKK0FUT01JQ19DUklUSUNBTF9XUiggY21wbHgxNiwgd3IsIENQTFgxMjhfTEVHLCA9LCAzMmMsICAgMSApICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X3dyCisjaWYgKCBLTVBfQVJDSF9YODYgKQorICAgIEFUT01JQ19DUklUSUNBTF9XUiggZmxvYXQxNiwgYTE2X3dyLCBRdWFkX2ExNl90LCAgICAgICAgID0sIDE2ciwgMSApIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9hMTZfd3IKKyAgICBBVE9NSUNfQ1JJVElDQUxfV1IoIGNtcGx4MTYsIGExNl93ciwga21wX2NtcGx4MTI4X2ExNl90LCA9LCAzMmMsIDEgKSAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfYTE2X3dyCisjZW5kaWYKKyNlbmRpZgorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQXRvbWljIENBUFRVUkUgcm91dGluZXMKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBCZWdpbm5pbmcgb2YgYSBkZWZpbml0aW9uIChwcm92aWRlcyBuYW1lLCBwYXJhbWV0ZXJzLCBnZWJ1ZyB0cmFjZSkKKy8vICAgICBUWVBFX0lEIC0gb3BlcmFuZHMgdHlwZSBhbmQgc2l6ZSAoZml4ZWQqLCBmaXhlZCp1IGZvciBzaWduZWQsIHVuc2lnbmVkIGZpeGVkKQorLy8gICAgIE9QX0lEICAgLSBvcGVyYXRpb24gaWRlbnRpZmllciAoYWRkLCBzdWIsIG11bCwgLi4uKQorLy8gICAgIFRZUEUgICAgLSBvcGVyYW5kcycgdHlwZQorI2RlZmluZSBBVE9NSUNfQkVHSU5fQ1BUKFRZUEVfSUQsT1BfSUQsVFlQRSxSRVRfVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitSRVRfVFlQRSBfX2ttcGNfYXRvbWljXyMjVFlQRV9JRCMjXyMjT1BfSUQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFRZUEUgKiBsaHMsIFRZUEUgcmhzLCBpbnQgZmxhZyApIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLQV9UUkFDRSgxMDAsKCJfX2ttcGNfYXRvbWljXyIgI1RZUEVfSUQgIl8iICNPUF9JRCAiOiBUIyVkXG4iLCBndGlkICkpOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBPcGVyYXRpb24gb24gKmxocywgcmhzIGJvdW5kIGJ5IGNyaXRpY2FsIHNlY3Rpb24KKy8vICAgICBPUCAgICAgLSBvcGVyYXRvciAoaXQncyBzdXBwb3NlZCB0byBjb250YWluIGFuIGFzc2lnbm1lbnQpCisvLyAgICAgTENLX0lEIC0gbG9jayBpZGVudGlmaWVyCisvLyBOb3RlOiBkb24ndCBjaGVjayBndGlkIGFzIGl0IHNob3VsZCBhbHdheXMgYmUgdmFsaWQKKy8vIDEsIDItYnl0ZSAtIGV4cGVjdCB2YWxpZCBwYXJhbWV0ZXIsIG90aGVyIC0gY2hlY2sgYmVmb3JlIHRoaXMgbWFjcm8KKyNkZWZpbmUgT1BfQ1JJVElDQUxfQ1BUKE9QLExDS19JRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soICYgQVRPTUlDX0xPQ0sjI0xDS19JRCwgZ3RpZCApOyAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiggZmxhZyApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoKmxocykgT1AgcmhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG5ld192YWx1ZSA9ICgqbGhzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBuZXdfdmFsdWUgPSAoKmxocyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICgqbGhzKSBPUCByaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jayggJiBBVE9NSUNfTE9DSyMjTENLX0lELCBndGlkICk7ICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gbmV3X3ZhbHVlOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyNkZWZpbmUgT1BfR09NUF9DUklUSUNBTF9DUFQoT1AsRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICggKEZMQUcpICYmIChfX2ttcF9hdG9taWNfbW9kZSA9PSAyKSApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9DSEVDS19HVElEOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgT1BfQ1JJVElDQUxfQ1BUKCBPUCMjPSwgMCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKyNlbHNlCisjZGVmaW5lIE9QX0dPTVBfQ1JJVElDQUxfQ1BUKE9QLEZMQUcpCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gT3BlcmF0aW9uIG9uICpsaHMsIHJocyB1c2luZyAiY29tcGFyZV9hbmRfc3RvcmUiIHJvdXRpbmUKKy8vICAgICBUWVBFICAgIC0gb3BlcmFuZHMnIHR5cGUKKy8vICAgICBCSVRTICAgIC0gc2l6ZSBpbiBiaXRzLCB1c2VkIHRvIGRpc3Rpbmd1aXNoIGxvdyBsZXZlbCBjYWxscworLy8gICAgIE9QICAgICAgLSBvcGVyYXRvcgorLy8gTm90ZTogdGVtcF92YWwgaW50cm9kdWNlZCBpbiBvcmRlciB0byBmb3JjZSB0aGUgY29tcGlsZXIgdG8gcmVhZAorLy8gICAgICAgKmxocyBvbmx5IG9uY2UgKHcvbyBpdCB0aGUgY29tcGlsZXIgcmVhZHMgKmxocyB0d2ljZSkKKyNkZWZpbmUgT1BfQ01QWENIR19DUFQoVFlQRSxCSVRTLE9QKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFRZUEUgS01QX0FUT01JQ19WT0xBVElMRSB0ZW1wX3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgVFlQRSBvbGRfdmFsdWUsIG5ld192YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0ZW1wX3ZhbCA9ICpsaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG9sZF92YWx1ZSA9IHRlbXBfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlIE9QIHJoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB3aGlsZSAoICEgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUSMjQklUUyggKGttcF9pbnQjI0JJVFMgKikgbGhzLCBcCisgICAgICAgICAgICAgICAgICAgICAgKlZPTEFUSUxFX0NBU1Qoa21wX2ludCMjQklUUyAqKSAmb2xkX3ZhbHVlLCAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAqVk9MQVRJTEVfQ0FTVChrbXBfaW50IyNCSVRTICopICZuZXdfdmFsdWUgKSApICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBLTVBfQ1BVX1BBVVNFKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdGVtcF92YWwgPSAqbGhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBvbGRfdmFsdWUgPSB0ZW1wX3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSBPUCByaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmKCBmbGFnICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHJldHVybiBuZXdfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9IGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICByZXR1cm4gb2xkX3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgQVRPTUlDX0NNUFhDSEdfQ1BUKFRZUEVfSUQsT1BfSUQsVFlQRSxCSVRTLE9QLEdPTVBfRkxBRykgICAgICAgICAgIFwKK0FUT01JQ19CRUdJTl9DUFQoVFlQRV9JRCxPUF9JRCxUWVBFLFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUWVBFIG5ld192YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMX0NQVChPUCxHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9DTVBYQ0hHX0NQVChUWVBFLEJJVFMsT1ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBBVE9NSUNfRklYRURfQUREX0NQVChUWVBFX0lELE9QX0lELFRZUEUsQklUUyxPUCxHT01QX0ZMQUcpICAgICAgICAgXAorQVRPTUlDX0JFR0lOX0NQVChUWVBFX0lELE9QX0lELFRZUEUsVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRZUEUgb2xkX3ZhbHVlLCBuZXdfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUxfQ1BUKE9QLEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIE9QIHVzZWQgYXMgYSBzaWduIGZvciBzdWJ0cmFjdGlvbjogKGxocy1yaHMpIC0tPiAobGhzKy1yaHMpICovICAgICAgXAorICAgIG9sZF92YWx1ZSA9IEtNUF9URVNUX1RIRU5fQUREIyNCSVRTKCBsaHMsIE9QIHJocyApOyAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmKCBmbGFnICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm4gb2xkX3ZhbHVlIE9QIHJoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm4gb2xkX3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBVE9NSUNfRklYRURfQUREX0NQVCggZml4ZWQ0LCBhZGRfY3B0LCBrbXBfaW50MzIsICAzMiwgKywgMCAgICAgICAgICAgICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X2FkZF9jcHQKK0FUT01JQ19GSVhFRF9BRERfQ1BUKCBmaXhlZDQsIHN1Yl9jcHQsIGttcF9pbnQzMiwgIDMyLCAtLCAwICAgICAgICAgICAgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfc3ViX2NwdAorQVRPTUlDX0ZJWEVEX0FERF9DUFQoIGZpeGVkOCwgYWRkX2NwdCwga21wX2ludDY0LCAgNjQsICssIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9hZGRfY3B0CitBVE9NSUNfRklYRURfQUREX0NQVCggZml4ZWQ4LCBzdWJfY3B0LCBrbXBfaW50NjQsICA2NCwgLSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X3N1Yl9jcHQKKworQVRPTUlDX0NNUFhDSEdfQ1BUKCBmbG9hdDQsIGFkZF9jcHQsIGttcF9yZWFsMzIsIDMyLCArLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfYWRkX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmbG9hdDQsIHN1Yl9jcHQsIGttcF9yZWFsMzIsIDMyLCAtLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfc3ViX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmbG9hdDgsIGFkZF9jcHQsIGttcF9yZWFsNjQsIDY0LCArLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDhfYWRkX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmbG9hdDgsIHN1Yl9jcHQsIGttcF9yZWFsNjQsIDY0LCAtLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDhfc3ViX2NwdAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVudHJpZXMgZGVmaW5pdGlvbiBmb3IgaW50ZWdlciBvcGVyYW5kcworLy8gICAgIFRZUEVfSUQgLSBvcGVyYW5kcyB0eXBlIGFuZCBzaXplIChmaXhlZDQsIGZsb2F0NCkKKy8vICAgICBPUF9JRCAgIC0gb3BlcmF0aW9uIGlkZW50aWZpZXIgKGFkZCwgc3ViLCBtdWwsIC4uLikKKy8vICAgICBUWVBFICAgIC0gb3BlcmFuZCB0eXBlCisvLyAgICAgQklUUyAgICAtIHNpemUgaW4gYml0cywgdXNlZCB0byBkaXN0aW5ndWlzaCBsb3cgbGV2ZWwgY2FsbHMKKy8vICAgICBPUCAgICAgIC0gb3BlcmF0b3IgKHVzZWQgaW4gY3JpdGljYWwgc2VjdGlvbikKKy8vICAgICAgICAgICAgICAgVFlQRV9JRCxPUF9JRCwgIFRZUEUsICAgQklUUyxPUCxHT01QX0ZMQUcKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUm91dGluZXMgZm9yIEFUT01JQyBpbnRlZ2VyIG9wZXJhbmRzLCBvdGhlciBvcGVyYXRvcnMKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gICAgICAgICAgICAgIFRZUEVfSUQsT1BfSUQsIFRZUEUsICAgICAgICAgIE9QLCAgR09NUF9GTEFHCitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkMSwgIGFkZF9jcHQsIGttcF9pbnQ4LCAgICA4LCArLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX2FkZF9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQxLCBhbmRiX2NwdCwga21wX2ludDgsICAgIDgsICYsICAwICAgICAgICAgICAgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDFfYW5kYl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQxLCAgZGl2X2NwdCwga21wX2ludDgsICAgIDgsIC8sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDFfZGl2X2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDF1LCBkaXZfY3B0LCBrbXBfdWludDgsICAgOCwgLywgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfZGl2X2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDEsICBtdWxfY3B0LCBrbXBfaW50OCwgICAgOCwgKiwgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9tdWxfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkMSwgIG9yYl9jcHQsIGttcF9pbnQ4LCAgICA4LCB8LCAgMCAgICAgICAgICAgICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX29yYl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQxLCAgc2hsX2NwdCwga21wX2ludDgsICAgIDgsIDw8LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDFfc2hsX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDEsICBzaHJfY3B0LCBrbXBfaW50OCwgICAgOCwgPj4sIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zaHJfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkMXUsIHNocl9jcHQsIGttcF91aW50OCwgICA4LCA+PiwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxdV9zaHJfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkMSwgIHN1Yl9jcHQsIGttcF9pbnQ4LCAgICA4LCAtLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX3N1Yl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQxLCAgeG9yX2NwdCwga21wX2ludDgsICAgIDgsIF4sICAwICAgICAgICAgICAgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDFfeG9yX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDIsICBhZGRfY3B0LCBrbXBfaW50MTYsICAxNiwgKywgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hZGRfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkMiwgYW5kYl9jcHQsIGttcF9pbnQxNiwgIDE2LCAmLCAgMCAgICAgICAgICAgICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX2FuZGJfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkMiwgIGRpdl9jcHQsIGttcF9pbnQxNiwgIDE2LCAvLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX2Rpdl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQydSwgZGl2X2NwdCwga21wX3VpbnQxNiwgMTYsIC8sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJ1X2Rpdl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQyLCAgbXVsX2NwdCwga21wX2ludDE2LCAgMTYsICosICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJfbXVsX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDIsICBvcmJfY3B0LCBrbXBfaW50MTYsICAxNiwgfCwgIDAgICAgICAgICAgICApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9vcmJfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkMiwgIHNobF9jcHQsIGttcF9pbnQxNiwgIDE2LCA8PCwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX3NobF9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQyLCAgc2hyX2NwdCwga21wX2ludDE2LCAgMTYsID4+LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJfc2hyX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDJ1LCBzaHJfY3B0LCBrbXBfdWludDE2LCAxNiwgPj4sIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfc2hyX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDIsICBzdWJfY3B0LCBrbXBfaW50MTYsICAxNiwgLSwgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zdWJfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkMiwgIHhvcl9jcHQsIGttcF9pbnQxNiwgIDE2LCBeLCAgMCAgICAgICAgICAgICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX3hvcl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQ0LCBhbmRiX2NwdCwga21wX2ludDMyLCAgMzIsICYsICAwICAgICAgICAgICAgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfYW5kYl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQ0LCAgZGl2X2NwdCwga21wX2ludDMyLCAgMzIsIC8sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfZGl2X2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDR1LCBkaXZfY3B0LCBrbXBfdWludDMyLCAzMiwgLywgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfZGl2X2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDQsICBtdWxfY3B0LCBrbXBfaW50MzIsICAzMiwgKiwgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9tdWxfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkNCwgIG9yYl9jcHQsIGttcF9pbnQzMiwgIDMyLCB8LCAgMCAgICAgICAgICAgICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X29yYl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQ0LCAgc2hsX2NwdCwga21wX2ludDMyLCAgMzIsIDw8LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfc2hsX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDQsICBzaHJfY3B0LCBrbXBfaW50MzIsICAzMiwgPj4sIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaHJfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkNHUsIHNocl9jcHQsIGttcF91aW50MzIsIDMyLCA+PiwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0dV9zaHJfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkNCwgIHhvcl9jcHQsIGttcF9pbnQzMiwgIDMyLCBeLCAgMCAgICAgICAgICAgICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X3hvcl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQ4LCBhbmRiX2NwdCwga21wX2ludDY0LCAgNjQsICYsICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfYW5kYl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQ4LCAgZGl2X2NwdCwga21wX2ludDY0LCAgNjQsIC8sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfZGl2X2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDh1LCBkaXZfY3B0LCBrbXBfdWludDY0LCA2NCwgLywgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfZGl2X2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDgsICBtdWxfY3B0LCBrbXBfaW50NjQsICA2NCwgKiwgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9tdWxfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkOCwgIG9yYl9jcHQsIGttcF9pbnQ2NCwgIDY0LCB8LCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X29yYl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQ4LCAgc2hsX2NwdCwga21wX2ludDY0LCAgNjQsIDw8LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfc2hsX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDgsICBzaHJfY3B0LCBrbXBfaW50NjQsICA2NCwgPj4sIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zaHJfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkOHUsIHNocl9jcHQsIGttcF91aW50NjQsIDY0LCA+PiwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4dV9zaHJfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkOCwgIHhvcl9jcHQsIGttcF9pbnQ2NCwgIDY0LCBeLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X3hvcl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZmxvYXQ0LCAgZGl2X2NwdCwga21wX3JlYWwzMiwgMzIsIC8sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfZGl2X2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmbG9hdDQsICBtdWxfY3B0LCBrbXBfcmVhbDMyLCAzMiwgKiwgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9tdWxfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZsb2F0OCwgIGRpdl9jcHQsIGttcF9yZWFsNjQsIDY0LCAvLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZmxvYXQ4X2Rpdl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZmxvYXQ4LCAgbXVsX2NwdCwga21wX3JlYWw2NCwgNjQsICosICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDhfbXVsX2NwdAorLy8gICAgICAgICAgICAgIFRZUEVfSUQsT1BfSUQsIFRZUEUsICAgICAgICAgIE9QLCAgR09NUF9GTEFHCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUm91dGluZXMgZm9yIEMvQysrIFJlZHVjdGlvbiBvcGVyYXRvcnMgJiYgYW5kIHx8CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gT3BlcmF0aW9uIG9uICpsaHMsIHJocyBib3VuZCBieSBjcml0aWNhbCBzZWN0aW9uCisvLyAgICAgT1AgICAgIC0gb3BlcmF0b3IgKGl0J3Mgc3VwcG9zZWQgdG8gY29udGFpbiBhbiBhc3NpZ25tZW50KQorLy8gICAgIExDS19JRCAtIGxvY2sgaWRlbnRpZmllcgorLy8gTm90ZTogZG9uJ3QgY2hlY2sgZ3RpZCBhcyBpdCBzaG91bGQgYWx3YXlzIGJlIHZhbGlkCisvLyAxLCAyLWJ5dGUgLSBleHBlY3QgdmFsaWQgcGFyYW1ldGVyLCBvdGhlciAtIGNoZWNrIGJlZm9yZSB0aGlzIG1hY3JvCisjZGVmaW5lIE9QX0NSSVRJQ0FMX0xfQ1BUKE9QLExDS19JRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCAmIEFUT01JQ19MT0NLIyNMQ0tfSUQsIGd0aWQgKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmKCBmbGFnICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG5ld192YWx1ZSBPUCByaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBuZXdfdmFsdWUgPSAoKmxocyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCAmIEFUT01JQ19MT0NLIyNMQ0tfSUQsIGd0aWQgKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisjZGVmaW5lIE9QX0dPTVBfQ1JJVElDQUxfTF9DUFQoT1AsRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIChGTEFHKSAmJiAoX19rbXBfYXRvbWljX21vZGUgPT0gMikgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfQ0hFQ0tfR1RJRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE9QX0NSSVRJQ0FMX0xfQ1BUKCBPUCwgMCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIG5ld192YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKyNlbHNlCisjZGVmaW5lIE9QX0dPTVBfQ1JJVElDQUxfTF9DUFQoT1AsRkxBRykKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBOZWVkIHNlcGFyYXRlIG1hY3JvcyBmb3IgJiYsIHx8IGJlY2F1c2UgdGhlcmUgaXMgbm8gY29tYmluZWQgYXNzaWdubWVudAorI2RlZmluZSBBVE9NSUNfQ01QWF9MX0NQVChUWVBFX0lELE9QX0lELFRZUEUsQklUUyxPUCxHT01QX0ZMQUcpICAgICAgICAgICBcCitBVE9NSUNfQkVHSU5fQ1BUKFRZUEVfSUQsT1BfSUQsVFlQRSxUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUWVBFIG5ld192YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUxfTF9DUFQoID0gKmxocyBPUCwgR09NUF9GTEFHICkgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfQ01QWENIR19DUFQoVFlQRSxCSVRTLE9QKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworQVRPTUlDX0NNUFhfTF9DUFQoIGZpeGVkMSwgYW5kbF9jcHQsIGNoYXIsICAgICAgIDgsICYmLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDFfYW5kbF9jcHQKK0FUT01JQ19DTVBYX0xfQ1BUKCBmaXhlZDEsICBvcmxfY3B0LCBjaGFyLCAgICAgICA4LCB8fCwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX29ybF9jcHQKK0FUT01JQ19DTVBYX0xfQ1BUKCBmaXhlZDIsIGFuZGxfY3B0LCBzaG9ydCwgICAgIDE2LCAmJiwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX2FuZGxfY3B0CitBVE9NSUNfQ01QWF9MX0NQVCggZml4ZWQyLCAgb3JsX2NwdCwgc2hvcnQsICAgICAxNiwgfHwsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9vcmxfY3B0CitBVE9NSUNfQ01QWF9MX0NQVCggZml4ZWQ0LCBhbmRsX2NwdCwga21wX2ludDMyLCAzMiwgJiYsIDAgKSAgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hbmRsX2NwdAorQVRPTUlDX0NNUFhfTF9DUFQoIGZpeGVkNCwgIG9ybF9jcHQsIGttcF9pbnQzMiwgMzIsIHx8LCAwICkgICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfb3JsX2NwdAorQVRPTUlDX0NNUFhfTF9DUFQoIGZpeGVkOCwgYW5kbF9jcHQsIGttcF9pbnQ2NCwgNjQsICYmLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfYW5kbF9jcHQKK0FUT01JQ19DTVBYX0xfQ1BUKCBmaXhlZDgsICBvcmxfY3B0LCBrbXBfaW50NjQsIDY0LCB8fCwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X29ybF9jcHQKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSb3V0aW5lcyBmb3IgRm9ydHJhbiBvcGVyYXRvcnMgdGhhdCBtYXRjaGVkIG5vIG9uZSBpbiBDOgorLy8gTUFYLCBNSU4sIC5FUVYuLCAuTkVRVi4KKy8vIE9wZXJhdG9ycyAuQU5ELiwgLk9SLiBhcmUgY292ZXJlZCBieSBfX2ttcGNfYXRvbWljXypfe2FuZGwsb3JsfV9jcHQKKy8vIEludHJpbnNpY3MgSUFORCwgSU9SLCBJRU9SIGFyZSBjb3ZlcmVkIGJ5IF9fa21wY19hdG9taWNfKl97YW5kYixvcmIseG9yfV9jcHQKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTUlOIGFuZCBNQVggbmVlZCBzZXBhcmF0ZSBtYWNyb3MKKy8vIE9QIC0gb3BlcmF0b3IgdG8gY2hlY2sgaWYgd2UgbmVlZCBhbnkgYWN0aW9ucz8KKyNkZWZpbmUgTUlOX01BWF9DUklUU0VDVF9DUFQoT1AsTENLX0lEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCAmIEFUT01JQ19MT0NLIyNMQ0tfSUQsIGd0aWQgKTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCAqbGhzIE9QIHJocyApIHsgICAgICAgICAgICAgICAgIC8qIHN0aWxsIG5lZWQgYWN0aW9ucz8gKi8gICAgICAgICBcCisgICAgICAgIG9sZF92YWx1ZSA9ICpsaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICpsaHMgPSByaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICggZmxhZyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBuZXdfdmFsdWUgPSByaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jayggJiBBVE9NSUNfTE9DSyMjTENLX0lELCBndGlkICk7ICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBuZXdfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisjZGVmaW5lIEdPTVBfTUlOX01BWF9DUklUU0VDVF9DUFQoT1AsRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCggRkxBRyApICYmICggX19rbXBfYXRvbWljX21vZGUgPT0gMiApKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9DSEVDS19HVElEOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1JTl9NQVhfQ1JJVFNFQ1RfQ1BUKCBPUCwgMCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorI2Vsc2UKKyNkZWZpbmUgR09NUF9NSU5fTUFYX0NSSVRTRUNUX0NQVChPUCxGTEFHKQorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIE1JTl9NQVhfQ01QWENIR19DUFQoVFlQRSxCSVRTLE9QKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFRZUEUgS01QX0FUT01JQ19WT0xBVElMRSB0ZW1wX3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIC8qVFlQRSBvbGRfdmFsdWU7ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHRlbXBfdmFsID0gKmxoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG9sZF92YWx1ZSA9IHRlbXBfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHdoaWxlICggb2xkX3ZhbHVlIE9QIHJocyAmJiAgICAgICAgICAvKiBzdGlsbCBuZWVkIGFjdGlvbnM/ICovICAgICBcCisgICAgICAgICAgICAhIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EjI0JJVFMoIChrbXBfaW50IyNCSVRTICopIGxocywgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgKlZPTEFUSUxFX0NBU1Qoa21wX2ludCMjQklUUyAqKSAmb2xkX3ZhbHVlLCAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgKlZPTEFUSUxFX0NBU1Qoa21wX2ludCMjQklUUyAqKSAmcmhzICkgKSAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBLTVBfQ1BVX1BBVVNFKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB0ZW1wX3ZhbCA9ICpsaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBvbGRfdmFsdWUgPSB0ZW1wX3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmKCBmbGFnICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICByZXR1cm4gcmhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICByZXR1cm4gb2xkX3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAxLWJ5dGUsIDItYnl0ZSBvcGVyYW5kcyAtIHVzZSBjcml0aWNhbCBzZWN0aW9uCisjZGVmaW5lIE1JTl9NQVhfQ1JJVElDQUxfQ1BUKFRZUEVfSUQsT1BfSUQsVFlQRSxPUCxMQ0tfSUQsR09NUF9GTEFHKSAgICAgICBcCitBVE9NSUNfQkVHSU5fQ1BUKFRZUEVfSUQsT1BfSUQsVFlQRSxUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVFlQRSBuZXdfdmFsdWUsIG9sZF92YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCAqbGhzIE9QIHJocyApIHsgICAgIC8qIG5lZWQgYWN0aW9ucz8gKi8gICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEdPTVBfTUlOX01BWF9DUklUU0VDVF9DUFQoT1AsR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1JTl9NQVhfQ1JJVFNFQ1RfQ1BUKE9QLExDS19JRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuICpsaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgTUlOX01BWF9DT01QWENIR19DUFQoVFlQRV9JRCxPUF9JRCxUWVBFLEJJVFMsT1AsR09NUF9GTEFHKSAgICAgICAgIFwKK0FUT01JQ19CRUdJTl9DUFQoVFlQRV9JRCxPUF9JRCxUWVBFLFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUWVBFIG5ld192YWx1ZSwgb2xkX3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoICpsaHMgT1AgcmhzICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgR09NUF9NSU5fTUFYX0NSSVRTRUNUX0NQVChPUCxHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTUlOX01BWF9DTVBYQ0hHX0NQVChUWVBFLEJJVFMsT1ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gKmxoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCitNSU5fTUFYX0NPTVBYQ0hHX0NQVCggZml4ZWQxLCAgbWF4X2NwdCwgY2hhciwgICAgICAgIDgsIDwsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX21heF9jcHQKK01JTl9NQVhfQ09NUFhDSEdfQ1BUKCBmaXhlZDEsICBtaW5fY3B0LCBjaGFyLCAgICAgICAgOCwgPiwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDFfbWluX2NwdAorTUlOX01BWF9DT01QWENIR19DUFQoIGZpeGVkMiwgIG1heF9jcHQsIHNob3J0LCAgICAgIDE2LCA8LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9tYXhfY3B0CitNSU5fTUFYX0NPTVBYQ0hHX0NQVCggZml4ZWQyLCAgbWluX2NwdCwgc2hvcnQsICAgICAgMTYsID4sIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX21pbl9jcHQKK01JTl9NQVhfQ09NUFhDSEdfQ1BUKCBmaXhlZDQsICBtYXhfY3B0LCBrbXBfaW50MzIsICAzMiwgPCwgMCApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfbWF4X2NwdAorTUlOX01BWF9DT01QWENIR19DUFQoIGZpeGVkNCwgIG1pbl9jcHQsIGttcF9pbnQzMiwgIDMyLCA+LCAwICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9taW5fY3B0CitNSU5fTUFYX0NPTVBYQ0hHX0NQVCggZml4ZWQ4LCAgbWF4X2NwdCwga21wX2ludDY0LCAgNjQsIDwsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X21heF9jcHQKK01JTl9NQVhfQ09NUFhDSEdfQ1BUKCBmaXhlZDgsICBtaW5fY3B0LCBrbXBfaW50NjQsICA2NCwgPiwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDhfbWluX2NwdAorTUlOX01BWF9DT01QWENIR19DUFQoIGZsb2F0NCwgIG1heF9jcHQsIGttcF9yZWFsMzIsIDMyLCA8LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9tYXhfY3B0CitNSU5fTUFYX0NPTVBYQ0hHX0NQVCggZmxvYXQ0LCAgbWluX2NwdCwga21wX3JlYWwzMiwgMzIsID4sIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZmxvYXQ0X21pbl9jcHQKK01JTl9NQVhfQ09NUFhDSEdfQ1BUKCBmbG9hdDgsICBtYXhfY3B0LCBrbXBfcmVhbDY0LCA2NCwgPCwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19mbG9hdDhfbWF4X2NwdAorTUlOX01BWF9DT01QWENIR19DUFQoIGZsb2F0OCwgIG1pbl9jcHQsIGttcF9yZWFsNjQsIDY0LCA+LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF9taW5fY3B0CisjaWYgS01QX0hBVkVfUVVBRAorTUlOX01BWF9DUklUSUNBTF9DUFQoIGZsb2F0MTYsIG1heF9jcHQsIFFVQURfTEVHQUNZLCAgICA8LCAxNnIsICAgMSApICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbWF4X2NwdAorTUlOX01BWF9DUklUSUNBTF9DUFQoIGZsb2F0MTYsIG1pbl9jcHQsIFFVQURfTEVHQUNZLCAgICA+LCAxNnIsICAgMSApICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbWluX2NwdAorI2lmICggS01QX0FSQ0hfWDg2ICkKKyAgICBNSU5fTUFYX0NSSVRJQ0FMX0NQVCggZmxvYXQxNiwgbWF4X2ExNl9jcHQsIFF1YWRfYTE2X3QsIDwsIDE2ciwgIDEgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X21heF9hMTZfY3B0CisgICAgTUlOX01BWF9DUklUSUNBTF9DUFQoIGZsb2F0MTYsIG1pbl9hMTZfY3B0LCBRdWFkX2ExNl90LCA+LCAxNnIsICAxICkgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9taXhfYTE2X2NwdAorI2VuZGlmCisjZW5kaWYKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisjZGVmaW5lIE9QX0dPTVBfQ1JJVElDQUxfRVFWX0NQVChPUCxGTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIChGTEFHKSAmJiAoX19rbXBfYXRvbWljX21vZGUgPT0gMikgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfQ0hFQ0tfR1RJRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE9QX0NSSVRJQ0FMX0NQVCggT1AsIDAgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisjZWxzZQorI2RlZmluZSBPUF9HT01QX0NSSVRJQ0FMX0VRVl9DUFQoT1AsRkxBRykKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBBVE9NSUNfQ01QWF9FUVZfQ1BUKFRZUEVfSUQsT1BfSUQsVFlQRSxCSVRTLE9QLEdPTVBfRkxBRykgICAgICAgICBcCitBVE9NSUNfQkVHSU5fQ1BUKFRZUEVfSUQsT1BfSUQsVFlQRSxUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUWVBFIG5ld192YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUxfRVFWX0NQVChePX4sR09NUF9GTEFHKSAgLyogc2VuZCBhc3NpZ25tZW50ICovICAgICAgICBcCisgICAgT1BfQ01QWENIR19DUFQoVFlQRSxCSVRTLE9QKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0FUT01JQ19DTVBYQ0hHX0NQVCggIGZpeGVkMSwgbmVxdl9jcHQsIGttcF9pbnQ4LCAgIDgsICAgXiwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDFfbmVxdl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggIGZpeGVkMiwgbmVxdl9jcHQsIGttcF9pbnQxNiwgMTYsICAgXiwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDJfbmVxdl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggIGZpeGVkNCwgbmVxdl9jcHQsIGttcF9pbnQzMiwgMzIsICAgXiwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDRfbmVxdl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggIGZpeGVkOCwgbmVxdl9jcHQsIGttcF9pbnQ2NCwgNjQsICAgXiwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDhfbmVxdl9jcHQKK0FUT01JQ19DTVBYX0VRVl9DUFQoIGZpeGVkMSwgZXF2X2NwdCwgIGttcF9pbnQ4LCAgIDgsICBefiwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDFfZXF2X2NwdAorQVRPTUlDX0NNUFhfRVFWX0NQVCggZml4ZWQyLCBlcXZfY3B0LCAga21wX2ludDE2LCAxNiwgIF5+LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9lcXZfY3B0CitBVE9NSUNfQ01QWF9FUVZfQ1BUKCBmaXhlZDQsIGVxdl9jcHQsICBrbXBfaW50MzIsIDMyLCAgXn4sIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X2Vxdl9jcHQKK0FUT01JQ19DTVBYX0VRVl9DUFQoIGZpeGVkOCwgZXF2X2NwdCwgIGttcF9pbnQ2NCwgNjQsICBefiwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDhfZXF2X2NwdAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJvdXRpbmVzIGZvciBFeHRlbmRlZCB0eXBlczogbG9uZyBkb3VibGUsIF9RdWFkLCBjb21wbGV4IGZsYXZvdXJzICh1c2UgY3JpdGljYWwgc2VjdGlvbikKKy8vICAgICBUWVBFX0lELCBPUF9JRCwgVFlQRSAtIGRldGFpbGVkIGFib3ZlCisvLyAgICAgT1AgICAgICAtIG9wZXJhdG9yCisvLyAgICAgTENLX0lEICAtIGxvY2sgaWRlbnRpZmllciwgdXNlZCB0byBwb3NzaWJseSBkaXN0aW5ndWlzaCBsb2NrIHZhcmlhYmxlCisjZGVmaW5lIEFUT01JQ19DUklUSUNBTF9DUFQoVFlQRV9JRCxPUF9JRCxUWVBFLE9QLExDS19JRCxHT01QX0ZMQUcpIFwKK0FUT01JQ19CRUdJTl9DUFQoVFlQRV9JRCxPUF9JRCxUWVBFLFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRZUEUgbmV3X3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTF9DUFQoT1AsR09NUF9GTEFHKSAgLyogc2VuZCBhc3NpZ25tZW50ICovICAgICAgIFwKKyAgICBPUF9DUklUSUNBTF9DUFQoT1AjIz0sTENLX0lEKSAgICAgICAgICAvKiBzZW5kIGFzc2lnbm1lbnQgKi8gICAgXAorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gV29ya2Fyb3VuZCBmb3IgY21wbHg0LiBSZWd1bGFyIHJvdXRpbmVzIHdpdGggcmV0dXJuIHZhbHVlIGRvbid0IHdvcmsKKy8vIG9uIFdpbl8zMmUuIExldCdzIHJldHVybiBjYXB0dXJlZCB2YWx1ZXMgdGhyb3VnaCB0aGUgYWRkaXRpb25hbCBwYXJhbWV0ZXIuCisjZGVmaW5lIE9QX0NSSVRJQ0FMX0NQVF9XUksoT1AsTENLX0lEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCAmIEFUT01JQ19MT0NLIyNMQ0tfSUQsIGd0aWQgKTsgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYoIGZsYWcgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKCpsaHMpIE9QIHJoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoKm91dCkgPSAoKmxocyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKCpvdXQpID0gKCpsaHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoKmxocykgT1AgcmhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soICYgQVRPTUlDX0xPQ0sjI0xDS19JRCwgZ3RpZCApOyAgICAgICAgICAgICBcCisgICAgcmV0dXJuOworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyNkZWZpbmUgT1BfR09NUF9DUklUSUNBTF9DUFRfV1JLKE9QLEZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICggKEZMQUcpICYmIChfX2ttcF9hdG9taWNfbW9kZSA9PSAyKSApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9DSEVDS19HVElEOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgT1BfQ1JJVElDQUxfQ1BUX1dSSyggT1AjIz0sIDAgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKyNlbHNlCisjZGVmaW5lIE9QX0dPTVBfQ1JJVElDQUxfQ1BUX1dSSyhPUCxGTEFHKQorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgQVRPTUlDX0JFR0lOX1dSSyhUWVBFX0lELE9QX0lELFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordm9pZCBfX2ttcGNfYXRvbWljXyMjVFlQRV9JRCMjXyMjT1BfSUQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFRZUEUgKiBsaHMsIFRZUEUgcmhzLCBUWVBFICogb3V0LCBpbnQgZmxhZyApIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS0FfVFJBQ0UoMTAwLCgiX19rbXBjX2F0b21pY18iICNUWVBFX0lEICJfIiAjT1BfSUQgIjogVCMlZFxuIiwgZ3RpZCApKTsKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIEFUT01JQ19DUklUSUNBTF9DUFRfV1JLKFRZUEVfSUQsT1BfSUQsVFlQRSxPUCxMQ0tfSUQsR09NUF9GTEFHKSAgIFwKK0FUT01JQ19CRUdJTl9XUksoVFlQRV9JRCxPUF9JRCxUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUxfQ1BUX1dSSyhPUCxHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfQ1JJVElDQUxfQ1BUX1dSSyhPUCMjPSxMQ0tfSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKy8vIFRoZSBlbmQgb2Ygd29ya2Fyb3VuZCBmb3IgY21wbHg0CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8vIHJvdXRpbmVzIGZvciBsb25nIGRvdWJsZSB0eXBlCitBVE9NSUNfQ1JJVElDQUxfQ1BUKCBmbG9hdDEwLCBhZGRfY3B0LCBsb25nIGRvdWJsZSwgICAgICssIDEwciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfYWRkX2NwdAorQVRPTUlDX0NSSVRJQ0FMX0NQVCggZmxvYXQxMCwgc3ViX2NwdCwgbG9uZyBkb3VibGUsICAgICAtLCAxMHIsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDEwX3N1Yl9jcHQKK0FUT01JQ19DUklUSUNBTF9DUFQoIGZsb2F0MTAsIG11bF9jcHQsIGxvbmcgZG91YmxlLCAgICAgKiwgMTByLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxMF9tdWxfY3B0CitBVE9NSUNfQ1JJVElDQUxfQ1BUKCBmbG9hdDEwLCBkaXZfY3B0LCBsb25nIGRvdWJsZSwgICAgIC8sIDEwciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfZGl2X2NwdAorI2lmIEtNUF9IQVZFX1FVQUQKKy8vIHJvdXRpbmVzIGZvciBfUXVhZCB0eXBlCitBVE9NSUNfQ1JJVElDQUxfQ1BUKCBmbG9hdDE2LCBhZGRfY3B0LCBRVUFEX0xFR0FDWSwgICAgICssIDE2ciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfYWRkX2NwdAorQVRPTUlDX0NSSVRJQ0FMX0NQVCggZmxvYXQxNiwgc3ViX2NwdCwgUVVBRF9MRUdBQ1ksICAgICAtLCAxNnIsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X3N1Yl9jcHQKK0FUT01JQ19DUklUSUNBTF9DUFQoIGZsb2F0MTYsIG11bF9jcHQsIFFVQURfTEVHQUNZLCAgICAgKiwgMTZyLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9tdWxfY3B0CitBVE9NSUNfQ1JJVElDQUxfQ1BUKCBmbG9hdDE2LCBkaXZfY3B0LCBRVUFEX0xFR0FDWSwgICAgIC8sIDE2ciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2X2NwdAorI2lmICggS01QX0FSQ0hfWDg2ICkKKyAgICBBVE9NSUNfQ1JJVElDQUxfQ1BUKCBmbG9hdDE2LCBhZGRfYTE2X2NwdCwgUXVhZF9hMTZfdCwgKywgMTZyLCAgMSApICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9hZGRfYTE2X2NwdAorICAgIEFUT01JQ19DUklUSUNBTF9DUFQoIGZsb2F0MTYsIHN1Yl9hMTZfY3B0LCBRdWFkX2ExNl90LCAtLCAxNnIsICAxICkgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X3N1Yl9hMTZfY3B0CisgICAgQVRPTUlDX0NSSVRJQ0FMX0NQVCggZmxvYXQxNiwgbXVsX2ExNl9jcHQsIFF1YWRfYTE2X3QsICosIDE2ciwgIDEgKSAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbXVsX2ExNl9jcHQKKyAgICBBVE9NSUNfQ1JJVElDQUxfQ1BUKCBmbG9hdDE2LCBkaXZfYTE2X2NwdCwgUXVhZF9hMTZfdCwgLywgMTZyLCAgMSApICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9kaXZfYTE2X2NwdAorI2VuZGlmCisjZW5kaWYKKworLy8gcm91dGluZXMgZm9yIGNvbXBsZXggdHlwZXMKKworLy8gY21wbHg0IHJvdXRpbmVzIHRvIHJldHVybiB2b2lkCitBVE9NSUNfQ1JJVElDQUxfQ1BUX1dSSyggY21wbHg0LCAgYWRkX2NwdCwga21wX2NtcGx4MzIsICssIDhjLCAgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4NF9hZGRfY3B0CitBVE9NSUNfQ1JJVElDQUxfQ1BUX1dSSyggY21wbHg0LCAgc3ViX2NwdCwga21wX2NtcGx4MzIsIC0sIDhjLCAgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4NF9zdWJfY3B0CitBVE9NSUNfQ1JJVElDQUxfQ1BUX1dSSyggY21wbHg0LCAgbXVsX2NwdCwga21wX2NtcGx4MzIsICosIDhjLCAgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4NF9tdWxfY3B0CitBVE9NSUNfQ1JJVElDQUxfQ1BUX1dSSyggY21wbHg0LCAgZGl2X2NwdCwga21wX2NtcGx4MzIsIC8sIDhjLCAgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4NF9kaXZfY3B0CisKK0FUT01JQ19DUklUSUNBTF9DUFQoIGNtcGx4OCwgIGFkZF9jcHQsIGttcF9jbXBseDY0LCArLCAxNmMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDhfYWRkX2NwdAorQVRPTUlDX0NSSVRJQ0FMX0NQVCggY21wbHg4LCAgc3ViX2NwdCwga21wX2NtcGx4NjQsIC0sIDE2YywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4OF9zdWJfY3B0CitBVE9NSUNfQ1JJVElDQUxfQ1BUKCBjbXBseDgsICBtdWxfY3B0LCBrbXBfY21wbHg2NCwgKiwgMTZjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHg4X211bF9jcHQKK0FUT01JQ19DUklUSUNBTF9DUFQoIGNtcGx4OCwgIGRpdl9jcHQsIGttcF9jbXBseDY0LCAvLCAxNmMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDhfZGl2X2NwdAorQVRPTUlDX0NSSVRJQ0FMX0NQVCggY21wbHgxMCwgYWRkX2NwdCwga21wX2NtcGx4ODAsICssIDIwYywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTBfYWRkX2NwdAorQVRPTUlDX0NSSVRJQ0FMX0NQVCggY21wbHgxMCwgc3ViX2NwdCwga21wX2NtcGx4ODAsIC0sIDIwYywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTBfc3ViX2NwdAorQVRPTUlDX0NSSVRJQ0FMX0NQVCggY21wbHgxMCwgbXVsX2NwdCwga21wX2NtcGx4ODAsICosIDIwYywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTBfbXVsX2NwdAorQVRPTUlDX0NSSVRJQ0FMX0NQVCggY21wbHgxMCwgZGl2X2NwdCwga21wX2NtcGx4ODAsIC8sIDIwYywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTBfZGl2X2NwdAorI2lmIEtNUF9IQVZFX1FVQUQKK0FUT01JQ19DUklUSUNBTF9DUFQoIGNtcGx4MTYsIGFkZF9jcHQsIENQTFgxMjhfTEVHLCArLCAzMmMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X2FkZF9jcHQKK0FUT01JQ19DUklUSUNBTF9DUFQoIGNtcGx4MTYsIHN1Yl9jcHQsIENQTFgxMjhfTEVHLCAtLCAzMmMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X3N1Yl9jcHQKK0FUT01JQ19DUklUSUNBTF9DUFQoIGNtcGx4MTYsIG11bF9jcHQsIENQTFgxMjhfTEVHLCAqLCAzMmMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X211bF9jcHQKK0FUT01JQ19DUklUSUNBTF9DUFQoIGNtcGx4MTYsIGRpdl9jcHQsIENQTFgxMjhfTEVHLCAvLCAzMmMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X2Rpdl9jcHQKKyNpZiAoIEtNUF9BUkNIX1g4NiApCisgICAgQVRPTUlDX0NSSVRJQ0FMX0NQVCggY21wbHgxNiwgYWRkX2ExNl9jcHQsIGttcF9jbXBseDEyOF9hMTZfdCwgKywgMzJjLCAgIDEgKSAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9hZGRfYTE2X2NwdAorICAgIEFUT01JQ19DUklUSUNBTF9DUFQoIGNtcGx4MTYsIHN1Yl9hMTZfY3B0LCBrbXBfY21wbHgxMjhfYTE2X3QsIC0sIDMyYywgICAxICkgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfc3ViX2ExNl9jcHQKKyAgICBBVE9NSUNfQ1JJVElDQUxfQ1BUKCBjbXBseDE2LCBtdWxfYTE2X2NwdCwga21wX2NtcGx4MTI4X2ExNl90LCAqLCAzMmMsICAgMSApICAgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X211bF9hMTZfY3B0CisgICAgQVRPTUlDX0NSSVRJQ0FMX0NQVCggY21wbHgxNiwgZGl2X2ExNl9jcHQsIGttcF9jbXBseDEyOF9hMTZfdCwgLywgMzJjLCAgIDEgKSAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9kaXZfYTE2X2NwdAorI2VuZGlmCisjZW5kaWYKKworI2lmIE9NUF80MF9FTkFCTEVECisKKy8vIE9wZW5NUCA0LjA6IHYgPSB4ID0gZXhwciBiaW5vcCB4OyB7IHYgPSB4OyB4ID0gZXhwciBiaW5vcCB4OyB9IHsgeCA9IGV4cHIgYmlub3AgeDsgdiA9IHg7IH0gIGZvciBub24tY29tbXV0YXRpdmUgb3BlcmF0aW9ucy4KKy8vIFN1cHBvcnRlZCBvbmx5IG9uIElBLTMyIGFyY2hpdGVjdHVyZSBhbmQgSW50ZWwoUikgNjQKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gT3BlcmF0aW9uIG9uICpsaHMsIHJocyBib3VuZCBieSBjcml0aWNhbCBzZWN0aW9uCisvLyAgICAgT1AgICAgIC0gb3BlcmF0b3IgKGl0J3Mgc3VwcG9zZWQgdG8gY29udGFpbiBhbiBhc3NpZ25tZW50KQorLy8gICAgIExDS19JRCAtIGxvY2sgaWRlbnRpZmllcgorLy8gTm90ZTogZG9uJ3QgY2hlY2sgZ3RpZCBhcyBpdCBzaG91bGQgYWx3YXlzIGJlIHZhbGlkCisvLyAxLCAyLWJ5dGUgLSBleHBlY3QgdmFsaWQgcGFyYW1ldGVyLCBvdGhlciAtIGNoZWNrIGJlZm9yZSB0aGlzIG1hY3JvCisjZGVmaW5lIE9QX0NSSVRJQ0FMX0NQVF9SRVYoT1AsTENLX0lEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCAmIEFUT01JQ19MT0NLIyNMQ0tfSUQsIGd0aWQgKTsgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYoIGZsYWcgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgLyp0ZW1wX3ZhbCA9ICgqbGhzKTsqL1wKKyAgICAgICAgKCpsaHMpID0gKHJocykgT1AgKCpsaHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBuZXdfdmFsdWUgPSAoKmxocyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbmV3X3ZhbHVlID0gKCpsaHMpO1wKKyAgICAgICAgKCpsaHMpID0gKHJocykgT1AgKCpsaHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jayggJiBBVE9NSUNfTE9DSyMjTENLX0lELCBndGlkICk7ICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gbmV3X3ZhbHVlOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyNkZWZpbmUgT1BfR09NUF9DUklUSUNBTF9DUFRfUkVWKE9QLEZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICggKEZMQUcpICYmIChfX2ttcF9hdG9taWNfbW9kZSA9PSAyKSApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9DSEVDS19HVElEOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgT1BfQ1JJVElDQUxfQ1BUX1JFViggT1AsIDAgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKyNlbHNlCisjZGVmaW5lIE9QX0dPTVBfQ1JJVElDQUxfQ1BUX1JFVihPUCxGTEFHKQorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE9wZXJhdGlvbiBvbiAqbGhzLCByaHMgdXNpbmcgImNvbXBhcmVfYW5kX3N0b3JlIiByb3V0aW5lCisvLyAgICAgVFlQRSAgICAtIG9wZXJhbmRzJyB0eXBlCisvLyAgICAgQklUUyAgICAtIHNpemUgaW4gYml0cywgdXNlZCB0byBkaXN0aW5ndWlzaCBsb3cgbGV2ZWwgY2FsbHMKKy8vICAgICBPUCAgICAgIC0gb3BlcmF0b3IKKy8vIE5vdGU6IHRlbXBfdmFsIGludHJvZHVjZWQgaW4gb3JkZXIgdG8gZm9yY2UgdGhlIGNvbXBpbGVyIHRvIHJlYWQKKy8vICAgICAgICpsaHMgb25seSBvbmNlICh3L28gaXQgdGhlIGNvbXBpbGVyIHJlYWRzICpsaHMgdHdpY2UpCisjZGVmaW5lIE9QX0NNUFhDSEdfQ1BUX1JFVihUWVBFLEJJVFMsT1ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBUWVBFIEtNUF9BVE9NSUNfVk9MQVRJTEUgdGVtcF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFRZUEUgb2xkX3ZhbHVlLCBuZXdfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdGVtcF92YWwgPSAqbGhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBvbGRfdmFsdWUgPSB0ZW1wX3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG5ld192YWx1ZSA9IHJocyBPUCBvbGRfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgd2hpbGUgKCAhIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EjI0JJVFMoIChrbXBfaW50IyNCSVRTICopIGxocywgXAorICAgICAgICAgICAgICAgICAgICAgICpWT0xBVElMRV9DQVNUKGttcF9pbnQjI0JJVFMgKikgJm9sZF92YWx1ZSwgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgKlZPTEFUSUxFX0NBU1Qoa21wX2ludCMjQklUUyAqKSAmbmV3X3ZhbHVlICkgKSAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgS01QX0NQVV9QQVVTRSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHRlbXBfdmFsID0gKmxoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgb2xkX3ZhbHVlID0gdGVtcF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBuZXdfdmFsdWUgPSByaHMgT1Agb2xkX3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiggZmxhZyApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICByZXR1cm4gbmV3X3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcmV0dXJuIG9sZF92YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEFUT01JQ19DTVBYQ0hHX0NQVF9SRVYoVFlQRV9JRCxPUF9JRCxUWVBFLEJJVFMsT1AsR09NUF9GTEFHKSAgICAgICBcCitBVE9NSUNfQkVHSU5fQ1BUKFRZUEVfSUQsT1BfSUQsVFlQRSxUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVFlQRSBuZXdfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFRZUEUgS01QX0FUT01JQ19WT0xBVElMRSB0ZW1wX3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMX0NQVF9SRVYoT1AsR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9DTVBYQ0hHX0NQVF9SRVYoVFlQRSxCSVRTLE9QKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCitBVE9NSUNfQ01QWENIR19DUFRfUkVWKCBmaXhlZDEsICBkaXZfY3B0X3Jldiwga21wX2ludDgsICAgIDgsIC8sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDFfZGl2X2NwdF9yZXYKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVYoIGZpeGVkMXUsIGRpdl9jcHRfcmV2LCBrbXBfdWludDgsICAgOCwgLywgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfZGl2X2NwdF9yZXYKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVYoIGZpeGVkMSwgIHNobF9jcHRfcmV2LCBrbXBfaW50OCwgICAgOCwgPDwsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zaGxfY3B0X3JldgorQVRPTUlDX0NNUFhDSEdfQ1BUX1JFViggZml4ZWQxLCAgc2hyX2NwdF9yZXYsIGttcF9pbnQ4LCAgICA4LCA+PiwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX3Nocl9jcHRfcmV2CitBVE9NSUNfQ01QWENIR19DUFRfUkVWKCBmaXhlZDF1LCBzaHJfY3B0X3Jldiwga21wX3VpbnQ4LCAgIDgsID4+LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDF1X3Nocl9jcHRfcmV2CitBVE9NSUNfQ01QWENIR19DUFRfUkVWKCBmaXhlZDEsICBzdWJfY3B0X3Jldiwga21wX2ludDgsICAgIDgsIC0sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDFfc3ViX2NwdF9yZXYKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVYoIGZpeGVkMiwgIGRpdl9jcHRfcmV2LCBrbXBfaW50MTYsICAxNiwgLywgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9kaXZfY3B0X3JldgorQVRPTUlDX0NNUFhDSEdfQ1BUX1JFViggZml4ZWQydSwgZGl2X2NwdF9yZXYsIGttcF91aW50MTYsIDE2LCAvLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQydV9kaXZfY3B0X3JldgorQVRPTUlDX0NNUFhDSEdfQ1BUX1JFViggZml4ZWQyLCAgc2hsX2NwdF9yZXYsIGttcF9pbnQxNiwgIDE2LCA8PCwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX3NobF9jcHRfcmV2CitBVE9NSUNfQ01QWENIR19DUFRfUkVWKCBmaXhlZDIsICBzaHJfY3B0X3Jldiwga21wX2ludDE2LCAgMTYsID4+LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJfc2hyX2NwdF9yZXYKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVYoIGZpeGVkMnUsIHNocl9jcHRfcmV2LCBrbXBfdWludDE2LCAxNiwgPj4sIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfc2hyX2NwdF9yZXYKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVYoIGZpeGVkMiwgIHN1Yl9jcHRfcmV2LCBrbXBfaW50MTYsICAxNiwgLSwgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zdWJfY3B0X3JldgorQVRPTUlDX0NNUFhDSEdfQ1BUX1JFViggZml4ZWQ0LCAgZGl2X2NwdF9yZXYsIGttcF9pbnQzMiwgIDMyLCAvLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X2Rpdl9jcHRfcmV2CitBVE9NSUNfQ01QWENIR19DUFRfUkVWKCBmaXhlZDR1LCBkaXZfY3B0X3Jldiwga21wX3VpbnQzMiwgMzIsIC8sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDR1X2Rpdl9jcHRfcmV2CitBVE9NSUNfQ01QWENIR19DUFRfUkVWKCBmaXhlZDQsICBzaGxfY3B0X3Jldiwga21wX2ludDMyLCAgMzIsIDw8LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfc2hsX2NwdF9yZXYKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVYoIGZpeGVkNCwgIHNocl9jcHRfcmV2LCBrbXBfaW50MzIsICAzMiwgPj4sIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaHJfY3B0X3JldgorQVRPTUlDX0NNUFhDSEdfQ1BUX1JFViggZml4ZWQ0dSwgc2hyX2NwdF9yZXYsIGttcF91aW50MzIsIDMyLCA+PiwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0dV9zaHJfY3B0X3JldgorQVRPTUlDX0NNUFhDSEdfQ1BUX1JFViggZml4ZWQ0LCAgc3ViX2NwdF9yZXYsIGttcF9pbnQzMiwgIDMyLCAtLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X3N1Yl9jcHRfcmV2CitBVE9NSUNfQ01QWENIR19DUFRfUkVWKCBmaXhlZDgsICBkaXZfY3B0X3Jldiwga21wX2ludDY0LCAgNjQsIC8sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfZGl2X2NwdF9yZXYKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVYoIGZpeGVkOHUsIGRpdl9jcHRfcmV2LCBrbXBfdWludDY0LCA2NCwgLywgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfZGl2X2NwdF9yZXYKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVYoIGZpeGVkOCwgIHNobF9jcHRfcmV2LCBrbXBfaW50NjQsICA2NCwgPDwsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zaGxfY3B0X3JldgorQVRPTUlDX0NNUFhDSEdfQ1BUX1JFViggZml4ZWQ4LCAgc2hyX2NwdF9yZXYsIGttcF9pbnQ2NCwgIDY0LCA+PiwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X3Nocl9jcHRfcmV2CitBVE9NSUNfQ01QWENIR19DUFRfUkVWKCBmaXhlZDh1LCBzaHJfY3B0X3Jldiwga21wX3VpbnQ2NCwgNjQsID4+LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDh1X3Nocl9jcHRfcmV2CitBVE9NSUNfQ01QWENIR19DUFRfUkVWKCBmaXhlZDgsICBzdWJfY3B0X3Jldiwga21wX2ludDY0LCAgNjQsIC0sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfc3ViX2NwdF9yZXYKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVYoIGZsb2F0NCwgIGRpdl9jcHRfcmV2LCBrbXBfcmVhbDMyLCAzMiwgLywgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9kaXZfY3B0X3JldgorQVRPTUlDX0NNUFhDSEdfQ1BUX1JFViggZmxvYXQ0LCAgc3ViX2NwdF9yZXYsIGttcF9yZWFsMzIsIDMyLCAtLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZmxvYXQ0X3N1Yl9jcHRfcmV2CitBVE9NSUNfQ01QWENIR19DUFRfUkVWKCBmbG9hdDgsICBkaXZfY3B0X3Jldiwga21wX3JlYWw2NCwgNjQsIC8sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDhfZGl2X2NwdF9yZXYKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVYoIGZsb2F0OCwgIHN1Yl9jcHRfcmV2LCBrbXBfcmVhbDY0LCA2NCwgLSwgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF9zdWJfY3B0X3JldgorLy8gICAgICAgICAgICAgIFRZUEVfSUQsT1BfSUQsIFRZUEUsICAgICAgICAgIE9QLCAgR09NUF9GTEFHCisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSb3V0aW5lcyBmb3IgRXh0ZW5kZWQgdHlwZXM6IGxvbmcgZG91YmxlLCBfUXVhZCwgY29tcGxleCBmbGF2b3VycyAodXNlIGNyaXRpY2FsIHNlY3Rpb24pCisvLyAgICAgVFlQRV9JRCwgT1BfSUQsIFRZUEUgLSBkZXRhaWxlZCBhYm92ZQorLy8gICAgIE9QICAgICAgLSBvcGVyYXRvcgorLy8gICAgIExDS19JRCAgLSBsb2NrIGlkZW50aWZpZXIsIHVzZWQgdG8gcG9zc2libHkgZGlzdGluZ3Vpc2ggbG9jayB2YXJpYWJsZQorI2RlZmluZSBBVE9NSUNfQ1JJVElDQUxfQ1BUX1JFVihUWVBFX0lELE9QX0lELFRZUEUsT1AsTENLX0lELEdPTVBfRkxBRykgXAorQVRPTUlDX0JFR0lOX0NQVChUWVBFX0lELE9QX0lELFRZUEUsVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRZUEUgbmV3X3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBUWVBFIEtNUF9BVE9NSUNfVk9MQVRJTEUgdGVtcF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLypwcmludGYoIl9fa21wX2F0b21pY19tb2RlID0gJWRcbiIsIF9fa21wX2F0b21pY19tb2RlKTsqL1wKKyAgICBPUF9HT01QX0NSSVRJQ0FMX0NQVF9SRVYoT1AsR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9DUklUSUNBTF9DUFRfUkVWKE9QLExDS19JRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvLyByb3V0aW5lcyBmb3IgbG9uZyBkb3VibGUgdHlwZQorQVRPTUlDX0NSSVRJQ0FMX0NQVF9SRVYoIGZsb2F0MTAsIHN1Yl9jcHRfcmV2LCBsb25nIGRvdWJsZSwgICAgIC0sIDEwciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfc3ViX2NwdF9yZXYKK0FUT01JQ19DUklUSUNBTF9DUFRfUkVWKCBmbG9hdDEwLCBkaXZfY3B0X3JldiwgbG9uZyBkb3VibGUsICAgICAvLCAxMHIsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDEwX2Rpdl9jcHRfcmV2CisjaWYgS01QX0hBVkVfUVVBRAorLy8gcm91dGluZXMgZm9yIF9RdWFkIHR5cGUKK0FUT01JQ19DUklUSUNBTF9DUFRfUkVWKCBmbG9hdDE2LCBzdWJfY3B0X3JldiwgUVVBRF9MRUdBQ1ksICAgICAtLCAxNnIsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X3N1Yl9jcHRfcmV2CitBVE9NSUNfQ1JJVElDQUxfQ1BUX1JFViggZmxvYXQxNiwgZGl2X2NwdF9yZXYsIFFVQURfTEVHQUNZLCAgICAgLywgMTZyLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9kaXZfY3B0X3JldgorI2lmICggS01QX0FSQ0hfWDg2ICkKKyAgICBBVE9NSUNfQ1JJVElDQUxfQ1BUX1JFViggZmxvYXQxNiwgc3ViX2ExNl9jcHRfcmV2LCBRdWFkX2ExNl90LCAtLCAxNnIsICAxICkgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X3N1Yl9hMTZfY3B0X3JldgorICAgIEFUT01JQ19DUklUSUNBTF9DUFRfUkVWKCBmbG9hdDE2LCBkaXZfYTE2X2NwdF9yZXYsIFF1YWRfYTE2X3QsIC8sIDE2ciwgIDEgKSAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2X2ExNl9jcHRfcmV2CisjZW5kaWYKKyNlbmRpZgorCisvLyByb3V0aW5lcyBmb3IgY29tcGxleCB0eXBlcworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gV29ya2Fyb3VuZCBmb3IgY21wbHg0LiBSZWd1bGFyIHJvdXRpbmVzIHdpdGggcmV0dXJuIHZhbHVlIGRvbid0IHdvcmsKKy8vIG9uIFdpbl8zMmUuIExldCdzIHJldHVybiBjYXB0dXJlZCB2YWx1ZXMgdGhyb3VnaCB0aGUgYWRkaXRpb25hbCBwYXJhbWV0ZXIuCisjZGVmaW5lIE9QX0NSSVRJQ0FMX0NQVF9SRVZfV1JLKE9QLExDS19JRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCAmIEFUT01JQ19MT0NLIyNMQ0tfSUQsIGd0aWQgKTsgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYoIGZsYWcgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKCpsaHMpID0gKHJocykgT1AgKCpsaHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoKm91dCkgPSAoKmxocyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKCpvdXQpID0gKCpsaHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoKmxocykgPSAocmhzKSBPUCAoKmxocyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soICYgQVRPTUlDX0xPQ0sjI0xDS19JRCwgZ3RpZCApOyAgICAgICAgICAgICBcCisgICAgcmV0dXJuOworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyNkZWZpbmUgT1BfR09NUF9DUklUSUNBTF9DUFRfUkVWX1dSSyhPUCxGTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICggKEZMQUcpICYmIChfX2ttcF9hdG9taWNfbW9kZSA9PSAyKSApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9DSEVDS19HVElEOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgT1BfQ1JJVElDQUxfQ1BUX1JFVl9XUksoIE9QLCAwICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKyNlbHNlCisjZGVmaW5lIE9QX0dPTVBfQ1JJVElDQUxfQ1BUX1JFVl9XUksoT1AsRkxBRykKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIEFUT01JQ19DUklUSUNBTF9DUFRfUkVWX1dSSyhUWVBFX0lELE9QX0lELFRZUEUsT1AsTENLX0lELEdPTVBfRkxBRykgICBcCitBVE9NSUNfQkVHSU5fV1JLKFRZUEVfSUQsT1BfSUQsVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTF9DUFRfUkVWX1dSSyhPUCxHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfQ1JJVElDQUxfQ1BUX1JFVl9XUksoT1AsTENLX0lEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisvLyBUaGUgZW5kIG9mIHdvcmthcm91bmQgZm9yIGNtcGx4NAorCisKKy8vICEhISBUT0RPOiBjaGVjayBpZiB3ZSBuZWVkIHRvIHJldHVybiB2b2lkIGZvciBjbXBseDQgcm91dGluZXMKKy8vIGNtcGx4NCByb3V0aW5lcyB0byByZXR1cm4gdm9pZAorQVRPTUlDX0NSSVRJQ0FMX0NQVF9SRVZfV1JLKCBjbXBseDQsICBzdWJfY3B0X3Jldiwga21wX2NtcGx4MzIsIC0sIDhjLCAgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4NF9zdWJfY3B0X3JldgorQVRPTUlDX0NSSVRJQ0FMX0NQVF9SRVZfV1JLKCBjbXBseDQsICBkaXZfY3B0X3Jldiwga21wX2NtcGx4MzIsIC8sIDhjLCAgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4NF9kaXZfY3B0X3JldgorCitBVE9NSUNfQ1JJVElDQUxfQ1BUX1JFViggY21wbHg4LCAgc3ViX2NwdF9yZXYsIGttcF9jbXBseDY0LCAtLCAxNmMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDhfc3ViX2NwdF9yZXYKK0FUT01JQ19DUklUSUNBTF9DUFRfUkVWKCBjbXBseDgsICBkaXZfY3B0X3Jldiwga21wX2NtcGx4NjQsIC8sIDE2YywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4OF9kaXZfY3B0X3JldgorQVRPTUlDX0NSSVRJQ0FMX0NQVF9SRVYoIGNtcGx4MTAsIHN1Yl9jcHRfcmV2LCBrbXBfY21wbHg4MCwgLSwgMjBjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxMF9zdWJfY3B0X3JldgorQVRPTUlDX0NSSVRJQ0FMX0NQVF9SRVYoIGNtcGx4MTAsIGRpdl9jcHRfcmV2LCBrbXBfY21wbHg4MCwgLywgMjBjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxMF9kaXZfY3B0X3JldgorI2lmIEtNUF9IQVZFX1FVQUQKK0FUT01JQ19DUklUSUNBTF9DUFRfUkVWKCBjbXBseDE2LCBzdWJfY3B0X3JldiwgQ1BMWDEyOF9MRUcsIC0sIDMyYywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfc3ViX2NwdF9yZXYKK0FUT01JQ19DUklUSUNBTF9DUFRfUkVWKCBjbXBseDE2LCBkaXZfY3B0X3JldiwgQ1BMWDEyOF9MRUcsIC8sIDMyYywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfZGl2X2NwdF9yZXYKKyNpZiAoIEtNUF9BUkNIX1g4NiApCisgICAgQVRPTUlDX0NSSVRJQ0FMX0NQVF9SRVYoIGNtcGx4MTYsIHN1Yl9hMTZfY3B0X3Jldiwga21wX2NtcGx4MTI4X2ExNl90LCAtLCAzMmMsICAgMSApICAgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X3N1Yl9hMTZfY3B0X3JldgorICAgIEFUT01JQ19DUklUSUNBTF9DUFRfUkVWKCBjbXBseDE2LCBkaXZfYTE2X2NwdF9yZXYsIGttcF9jbXBseDEyOF9hMTZfdCwgLywgMzJjLCAgIDEgKSAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9kaXZfYTE2X2NwdF9yZXYKKyNlbmRpZgorI2VuZGlmCisKKy8vICAgT3Blbk1QIDQuMCBDYXB0dXJlLXdyaXRlIChzd2FwKToge3YgPSB4OyB4ID0gZXhwcjt9CisKKyNkZWZpbmUgQVRPTUlDX0JFR0lOX1NXUChUWVBFX0lELFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK1RZUEUgX19rbXBjX2F0b21pY18jI1RZUEVfSUQjI19zd3AoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFRZUEUgKiBsaHMsIFRZUEUgcmhzICkgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLQV9UUkFDRSgxMDAsKCJfX2ttcGNfYXRvbWljXyIgI1RZUEVfSUQgIl9zd3A6IFQjJWRcbiIsIGd0aWQgKSk7CisKKyNkZWZpbmUgQ1JJVElDQUxfU1dQKExDS19JRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soICYgQVRPTUlDX0xPQ0sjI0xDS19JRCwgZ3RpZCApOyAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBvbGRfdmFsdWUgPSAoKmxocyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgqbGhzKSA9IHJoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCAmIEFUT01JQ19MT0NLIyNMQ0tfSUQsIGd0aWQgKTsgICAgICAgICAgICAgXAorICAgIHJldHVybiBvbGRfdmFsdWU7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorI2RlZmluZSBHT01QX0NSSVRJQ0FMX1NXUChGTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCAoRkxBRykgJiYgKF9fa21wX2F0b21pY19tb2RlID09IDIpICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0NIRUNLX0dUSUQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBDUklUSUNBTF9TV1AoIDAgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorI2Vsc2UKKyNkZWZpbmUgR09NUF9DUklUSUNBTF9TV1AoRkxBRykKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKworCisjZGVmaW5lIEFUT01JQ19YQ0hHX1NXUChUWVBFX0lELFRZUEUsQklUUyxHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgIFwKK0FUT01JQ19CRUdJTl9TV1AoVFlQRV9JRCxUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRZUEUgb2xkX3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgR09NUF9DUklUSUNBTF9TV1AoR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBvbGRfdmFsdWUgPSBLTVBfWENIR19GSVhFRCMjQklUUyggbGhzLCByaHMgKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBvbGRfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgQVRPTUlDX1hDSEdfRkxPQVRfU1dQKFRZUEVfSUQsVFlQRSxCSVRTLEdPTVBfRkxBRykgICAgICAgICAgICAgICAgXAorQVRPTUlDX0JFR0lOX1NXUChUWVBFX0lELFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVFlQRSBvbGRfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBHT01QX0NSSVRJQ0FMX1NXUChHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG9sZF92YWx1ZSA9IEtNUF9YQ0hHX1JFQUwjI0JJVFMoIGxocywgcmhzICk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIG9sZF92YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIENNUFhDSEdfU1dQKFRZUEUsQklUUykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBUWVBFIEtNUF9BVE9NSUNfVk9MQVRJTEUgdGVtcF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFRZUEUgb2xkX3ZhbHVlLCBuZXdfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdGVtcF92YWwgPSAqbGhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBvbGRfdmFsdWUgPSB0ZW1wX3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG5ld192YWx1ZSA9IHJoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgd2hpbGUgKCAhIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EjI0JJVFMoIChrbXBfaW50IyNCSVRTICopIGxocywgXAorICAgICAgICAgICAgICAgICAgICAgICpWT0xBVElMRV9DQVNUKGttcF9pbnQjI0JJVFMgKikgJm9sZF92YWx1ZSwgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgKlZPTEFUSUxFX0NBU1Qoa21wX2ludCMjQklUUyAqKSAmbmV3X3ZhbHVlICkgKSAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgS01QX0NQVV9QQVVTRSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHRlbXBfdmFsID0gKmxoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgb2xkX3ZhbHVlID0gdGVtcF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBuZXdfdmFsdWUgPSByaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm4gb2xkX3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEFUT01JQ19DTVBYQ0hHX1NXUChUWVBFX0lELFRZUEUsQklUUyxHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgIFwKK0FUT01JQ19CRUdJTl9TV1AoVFlQRV9JRCxUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRZUEUgb2xkX3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgR09NUF9DUklUSUNBTF9TV1AoR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBDTVBYQ0hHX1NXUChUWVBFLEJJVFMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCitBVE9NSUNfWENIR19TV1AoIGZpeGVkMSwga21wX2ludDgsICAgIDgsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zd3AKK0FUT01JQ19YQ0hHX1NXUCggZml4ZWQyLCBrbXBfaW50MTYsICAxNiwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX3N3cAorQVRPTUlDX1hDSEdfU1dQKCBmaXhlZDQsIGttcF9pbnQzMiwgIDMyLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfc3dwCisKK0FUT01JQ19YQ0hHX0ZMT0FUX1NXUCggZmxvYXQ0LCBrbXBfcmVhbDMyLCAzMiwgS01QX0FSQ0hfWDg2ICkgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9zd3AKKworI2lmICggS01QX0FSQ0hfWDg2ICkKKyAgICBBVE9NSUNfQ01QWENIR19TV1AoIGZpeGVkOCwga21wX2ludDY0LCA2NCwgS01QX0FSQ0hfWDg2ICkgICAgICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zd3AKKyAgICBBVE9NSUNfQ01QWENIR19TV1AoIGZsb2F0OCwga21wX3JlYWw2NCwgNjQsIEtNUF9BUkNIX1g4NiApICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF9zd3AKKyNlbHNlCisgICAgQVRPTUlDX1hDSEdfU1dQKCAgICAgICBmaXhlZDgsIGttcF9pbnQ2NCwgNjQsIEtNUF9BUkNIX1g4NiApICAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfc3dwCisgICAgQVRPTUlDX1hDSEdfRkxPQVRfU1dQKCBmbG9hdDgsIGttcF9yZWFsNjQsIDY0LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDhfc3dwCisjZW5kaWYKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSb3V0aW5lcyBmb3IgRXh0ZW5kZWQgdHlwZXM6IGxvbmcgZG91YmxlLCBfUXVhZCwgY29tcGxleCBmbGF2b3VycyAodXNlIGNyaXRpY2FsIHNlY3Rpb24pCisjZGVmaW5lIEFUT01JQ19DUklUSUNBTF9TV1AoVFlQRV9JRCxUWVBFLExDS19JRCxHT01QX0ZMQUcpICAgICAgICAgICAgICBcCitBVE9NSUNfQkVHSU5fU1dQKFRZUEVfSUQsVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVFlQRSBvbGRfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgR09NUF9DUklUSUNBTF9TV1AoR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQ1JJVElDQUxfU1dQKExDS19JRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyAhISEgVE9ETzogY2hlY2sgaWYgd2UgbmVlZCB0byByZXR1cm4gdm9pZCBmb3IgY21wbHg0IHJvdXRpbmVzCisvLyBXb3JrYXJvdW5kIGZvciBjbXBseDQuIFJlZ3VsYXIgcm91dGluZXMgd2l0aCByZXR1cm4gdmFsdWUgZG9uJ3Qgd29yaworLy8gb24gV2luXzMyZS4gTGV0J3MgcmV0dXJuIGNhcHR1cmVkIHZhbHVlcyB0aHJvdWdoIHRoZSBhZGRpdGlvbmFsIHBhcmFtZXRlci4KKworI2RlZmluZSBBVE9NSUNfQkVHSU5fU1dQX1dSSyhUWVBFX0lELFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordm9pZCBfX2ttcGNfYXRvbWljXyMjVFlQRV9JRCMjX3N3cCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgVFlQRSAqIGxocywgVFlQRSByaHMsIFRZUEUgKiBvdXQgKSAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtBX1RSQUNFKDEwMCwoIl9fa21wY19hdG9taWNfIiAjVFlQRV9JRCAiX3N3cDogVCMlZFxuIiwgZ3RpZCApKTsKKworCisjZGVmaW5lIENSSVRJQ0FMX1NXUF9XUksoTENLX0lEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCAmIEFUT01JQ19MT0NLIyNMQ0tfSUQsIGd0aWQgKTsgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdG1wID0gKCpsaHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKmxocykgPSAocmhzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgqb3V0KSA9IHRtcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jayggJiBBVE9NSUNfTE9DSyMjTENLX0lELCBndGlkICk7ICAgICAgICAgICAgIFwKKyAgICByZXR1cm47CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisjZGVmaW5lIEdPTVBfQ1JJVElDQUxfU1dQX1dSSyhGTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIChGTEFHKSAmJiAoX19rbXBfYXRvbWljX21vZGUgPT0gMikgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfQ0hFQ0tfR1RJRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIENSSVRJQ0FMX1NXUF9XUksoIDAgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisjZWxzZQorI2RlZmluZSBHT01QX0NSSVRJQ0FMX1NXUF9XUksoRkxBRykKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIEFUT01JQ19DUklUSUNBTF9TV1BfV1JLKFRZUEVfSUQsIFRZUEUsTENLX0lELEdPTVBfRkxBRykgICAgICAgICAgIFwKK0FUT01JQ19CRUdJTl9TV1BfV1JLKFRZUEVfSUQsVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRZUEUgdG1wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgR09NUF9DUklUSUNBTF9TV1BfV1JLKEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBDUklUSUNBTF9TV1BfV1JLKExDS19JRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorLy8gVGhlIGVuZCBvZiB3b3JrYXJvdW5kIGZvciBjbXBseDQKKworCitBVE9NSUNfQ1JJVElDQUxfU1dQKCBmbG9hdDEwLCBsb25nIGRvdWJsZSwgMTByLCAgIDEgKSAgICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDEwX3N3cAorI2lmIEtNUF9IQVZFX1FVQUQKK0FUT01JQ19DUklUSUNBTF9TV1AoIGZsb2F0MTYsIFFVQURfTEVHQUNZLCAxNnIsICAgMSApICAgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3dwCisjZW5kaWYKKy8vIGNtcGx4NCByb3V0aW5lIHRvIHJldHVybiB2b2lkCitBVE9NSUNfQ1JJVElDQUxfU1dQX1dSSyggY21wbHg0LCBrbXBfY21wbHgzMiwgIDhjLCAgIDEgKSAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDRfc3dwCisKKy8vQVRPTUlDX0NSSVRJQ0FMX1NXUCggY21wbHg0LCBrbXBfY21wbHgzMiwgIDhjLCAgIDEgKSAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDRfc3dwCisKKworQVRPTUlDX0NSSVRJQ0FMX1NXUCggY21wbHg4LCAga21wX2NtcGx4NjQsIDE2YywgICAxICkgICAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHg4X3N3cAorQVRPTUlDX0NSSVRJQ0FMX1NXUCggY21wbHgxMCwga21wX2NtcGx4ODAsIDIwYywgICAxICkgICAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxMF9zd3AKKyNpZiBLTVBfSEFWRV9RVUFECitBVE9NSUNfQ1JJVElDQUxfU1dQKCBjbXBseDE2LCBDUExYMTI4X0xFRywgMzJjLCAgIDEgKSAgICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X3N3cAorI2lmICggS01QX0FSQ0hfWDg2ICkKKyAgICBBVE9NSUNfQ1JJVElDQUxfU1dQKCBmbG9hdDE2X2ExNiwgUXVhZF9hMTZfdCwgICAgICAgICAxNnIsIDEgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X2ExNl9zd3AKKyAgICBBVE9NSUNfQ1JJVElDQUxfU1dQKCBjbXBseDE2X2ExNiwga21wX2NtcGx4MTI4X2ExNl90LCAzMmMsIDEgKSAgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X2ExNl9zd3AKKyNlbmRpZgorI2VuZGlmCisKKworLy8gRW5kIG9mIE9wZW5NUCA0LjAgQ2FwdHVyZQorCisjZW5kaWYgLy9PTVBfNDBfRU5BQkxFRAorCisjZW5kaWYgLy9LTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisKKworI3VuZGVmIE9QX0NSSVRJQ0FMCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogR2VuZXJpYyBhdG9taWMgcm91dGluZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZAorX19rbXBjX2F0b21pY18xKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB2b2lkKiBsaHMsIHZvaWQqIHJocywgdm9pZCAoKmYpKCB2b2lkICosIHZvaWQgKiwgdm9pZCAqICkgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7CisKKyAgICBpZiAoCisjaWYgS01QX0FSQ0hfWDg2ICYmIGRlZmluZWQoS01QX0dPTVBfQ09NUEFUKQorICAgICAgICBGQUxTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbXVzdCB1c2UgbG9jayAqLworI2Vsc2UKKyAgICAgICAgVFJVRQorI2VuZGlmCisJKQorICAgIHsKKwlrbXBfaW50OCBvbGRfdmFsdWUsIG5ld192YWx1ZTsKKworCW9sZF92YWx1ZSA9ICooa21wX2ludDggKikgbGhzOworCSgqZikoICZuZXdfdmFsdWUsICZvbGRfdmFsdWUsIHJocyApOworCisJLyogVE9ETzogU2hvdWxkIHRoaXMgYmUgYWNxdWlyZSBvciByZWxlYXNlPyAqLworCXdoaWxlICggISAgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTggKCAoa21wX2ludDggKikgbGhzLAorCQkgICAgCQkqKGttcF9pbnQ4ICopICZvbGRfdmFsdWUsICooa21wX2ludDggKikgJm5ld192YWx1ZSApICkKKwl7CisJICAgIEtNUF9DUFVfUEFVU0UoKTsKKworCSAgICBvbGRfdmFsdWUgPSAqKGttcF9pbnQ4ICopIGxoczsKKwkgICAgKCpmKSggJm5ld192YWx1ZSwgJm9sZF92YWx1ZSwgcmhzICk7CisJfQorCisJcmV0dXJuOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gQWxsIDEtYnl0ZSBkYXRhIGlzIG9mIGludGVnZXIgZGF0YSB0eXBlLgorICAgICAgICAvLworCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisgICAgICAgIGlmICggX19rbXBfYXRvbWljX21vZGUgPT0gMiApIHsKKyAgICAgICAgICAgIF9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2ssIGd0aWQgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisJX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9ja18xaSwgZ3RpZCApOworCisJKCpmKSggbGhzLCBsaHMsIHJocyApOworCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisgICAgICAgIGlmICggX19rbXBfYXRvbWljX21vZGUgPT0gMiApIHsKKyAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2ssIGd0aWQgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisJX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9ja18xaSwgZ3RpZCApOworICAgIH0KK30KKwordm9pZAorX19rbXBjX2F0b21pY18yKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB2b2lkKiBsaHMsIHZvaWQqIHJocywgdm9pZCAoKmYpKCB2b2lkICosIHZvaWQgKiwgdm9pZCAqICkgKQoreworICAgIGlmICgKKyNpZiBLTVBfQVJDSF9YODYgJiYgZGVmaW5lZChLTVBfR09NUF9DT01QQVQpCisgICAgICAgIEZBTFNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtdXN0IHVzZSBsb2NrICovCisjZWxpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisJVFJVRQkJCQkJLyogbm8gYWxpZ25tZW50IHByb2JsZW1zICovCisjZWxzZQorCSEgKCAoa21wX3VpbnRwdHJfdCkgbGhzICYgMHgxKQkJLyogbWFrZSBzdXJlIGFkZHJlc3MgaXMgMi1ieXRlIGFsaWduZWQgKi8KKyNlbmRpZgorCSkKKyAgICB7CisJa21wX2ludDE2IG9sZF92YWx1ZSwgbmV3X3ZhbHVlOworCisJb2xkX3ZhbHVlID0gKihrbXBfaW50MTYgKikgbGhzOworCSgqZikoICZuZXdfdmFsdWUsICZvbGRfdmFsdWUsIHJocyApOworCisJLyogVE9ETzogU2hvdWxkIHRoaXMgYmUgYWNxdWlyZSBvciByZWxlYXNlPyAqLworCXdoaWxlICggISAgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTE2ICggKGttcF9pbnQxNiAqKSBsaHMsCisJCSAgICAJCSooa21wX2ludDE2ICopICZvbGRfdmFsdWUsICooa21wX2ludDE2ICopICZuZXdfdmFsdWUgKSApCisJeworCSAgICBLTVBfQ1BVX1BBVVNFKCk7CisKKwkgICAgb2xkX3ZhbHVlID0gKihrbXBfaW50MTYgKikgbGhzOworCSAgICAoKmYpKCAmbmV3X3ZhbHVlLCAmb2xkX3ZhbHVlLCByaHMgKTsKKwl9CisKKwlyZXR1cm47CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvLworICAgICAgICAvLyBBbGwgMi1ieXRlIGRhdGEgaXMgb2YgaW50ZWdlciBkYXRhIHR5cGUuCisgICAgICAgIC8vCisKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyAgICAgICAgaWYgKCBfX2ttcF9hdG9taWNfbW9kZSA9PSAyICkgeworICAgICAgICAgICAgX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9jaywgZ3RpZCApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKwlfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrXzJpLCBndGlkICk7CisKKwkoKmYpKCBsaHMsIGxocywgcmhzICk7CisKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyAgICAgICAgaWYgKCBfX2ttcF9hdG9taWNfbW9kZSA9PSAyICkgeworICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9jaywgZ3RpZCApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKwlfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrXzJpLCBndGlkICk7CisgICAgfQorfQorCit2b2lkCitfX2ttcGNfYXRvbWljXzQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHZvaWQqIGxocywgdm9pZCogcmhzLCB2b2lkICgqZikoIHZvaWQgKiwgdm9pZCAqLCB2b2lkICogKSApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsKKworICAgIGlmICgKKyAgICAgICAgLy8KKyAgICAgICAgLy8gRklYTUU6IE9uIElBLTMyIGFyY2hpdGVjdHVyZSwgZ2NjIHVzZXMgY21weGNoZyBvbmx5IGZvciA0LWJ5dGUgaW50cy4KKyAgICAgICAgLy8gR29tcCBjb21wYXRpYmlsaXR5IGlzIGJyb2tlbiBpZiB0aGlzIHJvdXRpbmUgaXMgY2FsbGVkIGZvciBmbG9hdHMuCisgICAgICAgIC8vCisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorCVRSVUUJCQkJCS8qIG5vIGFsaWdubWVudCBwcm9ibGVtcyAqLworI2Vsc2UKKwkhICggKGttcF91aW50cHRyX3QpIGxocyAmIDB4MykJCS8qIG1ha2Ugc3VyZSBhZGRyZXNzIGlzIDQtYnl0ZSBhbGlnbmVkICovCisjZW5kaWYKKwkpCisgICAgeworCWttcF9pbnQzMiBvbGRfdmFsdWUsIG5ld192YWx1ZTsKKworCW9sZF92YWx1ZSA9ICooa21wX2ludDMyICopIGxoczsKKwkoKmYpKCAmbmV3X3ZhbHVlLCAmb2xkX3ZhbHVlLCByaHMgKTsKKworCS8qIFRPRE86IFNob3VsZCB0aGlzIGJlIGFjcXVpcmUgb3IgcmVsZWFzZT8gKi8KKwl3aGlsZSAoICEgIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EzMiAoIChrbXBfaW50MzIgKikgbGhzLAorCQkgICAgCQkqKGttcF9pbnQzMiAqKSAmb2xkX3ZhbHVlLCAqKGttcF9pbnQzMiAqKSAmbmV3X3ZhbHVlICkgKQorCXsKKwkgICAgS01QX0NQVV9QQVVTRSgpOworCisJICAgIG9sZF92YWx1ZSA9ICooa21wX2ludDMyICopIGxoczsKKwkgICAgKCpmKSggJm5ld192YWx1ZSwgJm9sZF92YWx1ZSwgcmhzICk7CisJfQorCisJcmV0dXJuOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gVXNlIF9fa21wX2F0b21pY19sb2NrXzRpIGZvciBhbGwgNC1ieXRlIGRhdGEsCisgICAgICAgIC8vIGV2ZW4gaWYgaXQgaXNuJ3Qgb2YgaW50ZWdlciBkYXRhIHR5cGUuCisgICAgICAgIC8vCisKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyAgICAgICAgaWYgKCBfX2ttcF9hdG9taWNfbW9kZSA9PSAyICkgeworICAgICAgICAgICAgX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9jaywgZ3RpZCApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKwlfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrXzRpLCBndGlkICk7CisKKwkoKmYpKCBsaHMsIGxocywgcmhzICk7CisKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyAgICAgICAgaWYgKCBfX2ttcF9hdG9taWNfbW9kZSA9PSAyICkgeworICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9jaywgZ3RpZCApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKwlfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrXzRpLCBndGlkICk7CisgICAgfQorfQorCit2b2lkCitfX2ttcGNfYXRvbWljXzgoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHZvaWQqIGxocywgdm9pZCogcmhzLCB2b2lkICgqZikoIHZvaWQgKiwgdm9pZCAqLCB2b2lkICogKSApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsKKyAgICBpZiAoCisKKyNpZiBLTVBfQVJDSF9YODYgJiYgZGVmaW5lZChLTVBfR09NUF9DT01QQVQpCisgICAgICAgIEZBTFNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtdXN0IHVzZSBsb2NrICovCisjZWxpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisJVFJVRQkJCQkJLyogbm8gYWxpZ25tZW50IHByb2JsZW1zICovCisjZWxzZQorCSEgKCAoa21wX3VpbnRwdHJfdCkgbGhzICYgMHg3KQkJLyogbWFrZSBzdXJlIGFkZHJlc3MgaXMgOC1ieXRlIGFsaWduZWQgKi8KKyNlbmRpZgorCSkKKyAgICB7CisJa21wX2ludDY0IG9sZF92YWx1ZSwgbmV3X3ZhbHVlOworCisJb2xkX3ZhbHVlID0gKihrbXBfaW50NjQgKikgbGhzOworCSgqZikoICZuZXdfdmFsdWUsICZvbGRfdmFsdWUsIHJocyApOworCS8qIFRPRE86IFNob3VsZCB0aGlzIGJlIGFjcXVpcmUgb3IgcmVsZWFzZT8gKi8KKwl3aGlsZSAoICEgIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1E2NCAoIChrbXBfaW50NjQgKikgbGhzLAorCQkJCQkgICAgICAgKihrbXBfaW50NjQgKikgJm9sZF92YWx1ZSwKKwkJCQkJICAgICAgICooa21wX2ludDY0ICopICZuZXdfdmFsdWUgKSApCisJeworCSAgICBLTVBfQ1BVX1BBVVNFKCk7CisKKwkgICAgb2xkX3ZhbHVlID0gKihrbXBfaW50NjQgKikgbGhzOworCSAgICAoKmYpKCAmbmV3X3ZhbHVlLCAmb2xkX3ZhbHVlLCByaHMgKTsKKwl9CisKKwlyZXR1cm47CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gVXNlIF9fa21wX2F0b21pY19sb2NrXzhpIGZvciBhbGwgOC1ieXRlIGRhdGEsCisgICAgICAgIC8vIGV2ZW4gaWYgaXQgaXNuJ3Qgb2YgaW50ZWdlciBkYXRhIHR5cGUuCisgICAgICAgIC8vCisKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyAgICAgICAgaWYgKCBfX2ttcF9hdG9taWNfbW9kZSA9PSAyICkgeworICAgICAgICAgICAgX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9jaywgZ3RpZCApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKwlfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrXzhpLCBndGlkICk7CisKKwkoKmYpKCBsaHMsIGxocywgcmhzICk7CisKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyAgICAgICAgaWYgKCBfX2ttcF9hdG9taWNfbW9kZSA9PSAyICkgeworICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9jaywgZ3RpZCApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKwlfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrXzhpLCBndGlkICk7CisgICAgfQorfQorCit2b2lkCitfX2ttcGNfYXRvbWljXzEwKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB2b2lkKiBsaHMsIHZvaWQqIHJocywgdm9pZCAoKmYpKCB2b2lkICosIHZvaWQgKiwgdm9pZCAqICkgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7CisKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyAgICBpZiAoIF9fa21wX2F0b21pY19tb2RlID09IDIgKSB7CisgICAgICAgIF9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2ssIGd0aWQgKTsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworICAgIF9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2tfMTByLCBndGlkICk7CisKKyAgICAoKmYpKCBsaHMsIGxocywgcmhzICk7CisKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyAgICBpZiAoIF9fa21wX2F0b21pY19tb2RlID09IDIgKSB7CisgICAgICAgIF9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2ssIGd0aWQgKTsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworICAgIF9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2tfMTByLCBndGlkICk7Cit9CisKK3ZvaWQKK19fa21wY19hdG9taWNfMTYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHZvaWQqIGxocywgdm9pZCogcmhzLCB2b2lkICgqZikoIHZvaWQgKiwgdm9pZCAqLCB2b2lkICogKSApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsKKworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorICAgIGlmICggX19rbXBfYXRvbWljX21vZGUgPT0gMiApIHsKKyAgICAgICAgX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9jaywgZ3RpZCApOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisgICAgX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9ja18xNmMsIGd0aWQgKTsKKworICAgICgqZikoIGxocywgbGhzLCByaHMgKTsKKworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorICAgIGlmICggX19rbXBfYXRvbWljX21vZGUgPT0gMiApIHsKKyAgICAgICAgX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9jaywgZ3RpZCApOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisgICAgX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9ja18xNmMsIGd0aWQgKTsKK30KKwordm9pZAorX19rbXBjX2F0b21pY18yMCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdm9pZCogbGhzLCB2b2lkKiByaHMsIHZvaWQgKCpmKSggdm9pZCAqLCB2b2lkICosIHZvaWQgKiApICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOworCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisgICAgaWYgKCBfX2ttcF9hdG9taWNfbW9kZSA9PSAyICkgeworICAgICAgICBfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrLCBndGlkICk7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKyAgICBfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrXzIwYywgZ3RpZCApOworCisgICAgKCpmKSggbGhzLCBsaHMsIHJocyApOworCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisgICAgaWYgKCBfX2ttcF9hdG9taWNfbW9kZSA9PSAyICkgeworICAgICAgICBfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrLCBndGlkICk7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKyAgICBfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrXzIwYywgZ3RpZCApOworfQorCit2b2lkCitfX2ttcGNfYXRvbWljXzMyKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB2b2lkKiBsaHMsIHZvaWQqIHJocywgdm9pZCAoKmYpKCB2b2lkICosIHZvaWQgKiwgdm9pZCAqICkgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7CisKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyAgICBpZiAoIF9fa21wX2F0b21pY19tb2RlID09IDIgKSB7CisgICAgICAgIF9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2ssIGd0aWQgKTsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworICAgIF9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2tfMzJjLCBndGlkICk7CisKKyAgICAoKmYpKCBsaHMsIGxocywgcmhzICk7CisKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyAgICBpZiAoIF9fa21wX2F0b21pY19tb2RlID09IDIgKSB7CisgICAgICAgIF9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2ssIGd0aWQgKTsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworICAgIF9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2tfMzJjLCBndGlkICk7Cit9CisKKy8vIEFDOiBzYW1lIHR3byByb3V0aW5lcyBhcyBHT01QX2F0b21pY19zdGFydC9lbmQsIGJ1dCB3aWxsIGJlIGNhbGxlZCBieSBvdXIgY29tcGlsZXIKKy8vICAgICBkdXBsaWNhdGVkIGluIG9yZGVyIHRvIG5vdCB1c2UgMy1wYXJ0eSBuYW1lcyBpbiBwdXJlIEludGVsIGNvZGUKKy8vIFRPRE86IGNvbnNpZGVyIGFkZGluZyBHVElEIHBhcmFtZXRlciBhZnRlciBjb25zdWx0YXRpb24gd2l0aCBFcm5lc3RvL1hpbm1pbi4KK3ZvaWQKK19fa21wY19hdG9taWNfc3RhcnQodm9pZCkKK3sKKyAgICBpbnQgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcGNfYXRvbWljX3N0YXJ0OiBUIyVkXG4iLCBndGlkKSk7CisgICAgX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jaygmX19rbXBfYXRvbWljX2xvY2ssIGd0aWQpOworfQorCisKK3ZvaWQKK19fa21wY19hdG9taWNfZW5kKHZvaWQpCit7CisgICAgaW50IGd0aWQgPSBfX2ttcF9nZXRfZ3RpZCgpOworICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wY19hdG9taWNfZW5kOiBUIyVkXG4iLCBndGlkKSk7CisgICAgX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jaygmX19rbXBfYXRvbWljX2xvY2ssIGd0aWQpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyohCitAfQorKi8KKworLy8gZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9hdG9taWMuaCBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9hdG9taWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODY3M2RhCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX2F0b21pYy5oCkBAIC0wLDAgKzEsMTAxMyBAQAorLyoKKyAqIGttcF9hdG9taWMuaCAtIEFUT01JQyBoZWFkZXIgZmlsZQorICogJFJldmlzaW9uOiA0MzE5MSAkCisgKiAkRGF0ZTogMjAxNC0wNS0yNyAwNzo0NDoxMSAtMDUwMCAoVHVlLCAyNyBNYXkgMjAxNCkgJAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIEtNUF9BVE9NSUNfSAorI2RlZmluZSBLTVBfQVRPTUlDX0gKKworI2luY2x1ZGUgImttcF9vcy5oIgorI2luY2x1ZGUgImttcF9sb2NrLmgiCisKKy8vIEMrKyBidWlsZCBwb3J0LgorLy8gSW50ZWwgY29tcGlsZXIgZG9lcyBub3Qgc3VwcG9ydCBfQ29tcGxleCBkYXRhdHlwZSBvbiB3aW4uCisvLyBJbnRlbCBjb21waWxlciBzdXBwb3J0cyBfQ29tcGxleCBkYXRhdHlwZSBvbiBsaW4gYW5kIG1hYy4KKy8vIE9uIHRoZSBvdGhlciBzaWRlLCB0aGVyZSBpcyBhIHByb2JsZW0gb2Ygc3RhY2sgYWxpZ25tZW50IG9uIGxpbl8zMiBhbmQgbWFjXzMyCisvLyBpZiB0aGUgcmhzIGlzIGNtcGx4ODAgb3IgY21wbHgxMjggdHlwZWRlZidlZCBkYXRhdHlwZS4KKy8vIFRoZSBkZWNpc2lvbiBpczogdG8gdXNlIGNvbXBpbGVyIHN1cHBvcnRlZCBfQ29tcGxleCB0eXBlIG9uIGxpbiBhbmQgbWFjLAorLy8gICAgICAgICAgICAgICAgICB0byB1c2UgdHlwZWRlZidlZCB0eXBlcyBvbiB3aW4uCisvLyBDb25kaXRpb24gZm9yIFdJTjY0IHdhcyBtb2RpZmllZCBpbiBhbnRpY2lwYXRpb24gb2YgMTAuMSBidWlsZCBjb21waWxlci4KKworI2lmIGRlZmluZWQoIF9fY3BsdXNwbHVzICkgJiYgKCBLTVBfT1NfV0lORE9XUyApCisgICAgLy8gY3JlYXRlIHNob3J0Y3V0cyBmb3IgYzk5IGNvbXBsZXggdHlwZXMKKworICAgICNpZiAoX01TQ19WRVIgPCAxNjAwKSAmJiBkZWZpbmVkKF9ERUJVRykKKyAgICAgICAgLy8gV29ya2Fyb3VuZCBmb3IgdGhlIHByb2JsZW0gb2YgX0RlYnVnSGVhcFRhZyB1bnJlc29sdmVkIGV4dGVybmFsLgorICAgICAgICAvLyBUaGlzIHByb2JsZW0gcHJldmVudGVkIHRvIHVzZSBvdXIgc3RhdGljIGRlYnVnIGxpYnJhcnkgZm9yIEMgdGVzdHMKKyAgICAgICAgLy8gY29tcGlsZWQgd2l0aCAvTURkIG9wdGlvbiAodGhlIGxpYnJhcnkgaXRzZWxmIGJ1aWx0IHdpdGggL01UZCksCisgICAgICAgICN1bmRlZiBfREVCVUcKKyAgICAgICAgI2RlZmluZSBfREVCVUdfVEVNUE9SQVJJTFlfVU5TRVRfCisgICAgI2VuZGlmCisKKyAgICAjaW5jbHVkZSA8Y29tcGxleD4KKworICAgIHRlbXBsYXRlPCB0eXBlbmFtZSB0eXBlX2xocywgdHlwZW5hbWUgdHlwZV9yaHMgPgorICAgIHN0ZDo6Y29tcGxleDwgdHlwZV9saHMgPiBfX2ttcF9saHNfZGl2X3JocygKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OmNvbXBsZXg8IHR5cGVfbGhzID4mIGxocywKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OmNvbXBsZXg8IHR5cGVfcmhzID4mIHJocyApIHsKKyAgICB0eXBlX2xocyBhID0gbGhzLnJlYWwoKTsKKyAgICB0eXBlX2xocyBiID0gbGhzLmltYWcoKTsKKyAgICB0eXBlX3JocyBjID0gcmhzLnJlYWwoKTsKKyAgICB0eXBlX3JocyBkID0gcmhzLmltYWcoKTsKKyAgICB0eXBlX3JocyBkZW4gPSBjKmMgKyBkKmQ7CisgICAgdHlwZV9yaHMgciA9ICggYSpjICsgYipkICk7CisgICAgdHlwZV9yaHMgaSA9ICggYipjIC0gYSpkICk7CisgICAgc3RkOjpjb21wbGV4PCB0eXBlX2xocyA+IHJldCggci9kZW4sIGkvZGVuICk7CisgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICAvLyBjb21wbGV4OAorICAgIHN0cnVjdCBfX2ttcF9jbXBseDY0X3QgOiBzdGQ6OmNvbXBsZXg8IGRvdWJsZSA+IHsKKworICAgIF9fa21wX2NtcGx4NjRfdCgpIDogc3RkOjpjb21wbGV4PCBkb3VibGUgPiAoKSB7fQorCisgICAgX19rbXBfY21wbHg2NF90KCBjb25zdCBzdGQ6OmNvbXBsZXg8IGRvdWJsZSA+JiBjZCApCisgICAgICAgICAgICAgICAgOiBzdGQ6OmNvbXBsZXg8IGRvdWJsZSA+ICggY2QgKSB7fQorCisgICAgdm9pZCBvcGVyYXRvciAvPSAoIGNvbnN0IF9fa21wX2NtcGx4NjRfdCYgcmhzICkgeworICAgICAgICBzdGQ6OmNvbXBsZXg8IGRvdWJsZSA+IGxocyA9ICp0aGlzOworICAgICAgICAqdGhpcyA9IF9fa21wX2xoc19kaXZfcmhzKCBsaHMsIHJocyApOworICAgIH0KKworICAgIF9fa21wX2NtcGx4NjRfdCBvcGVyYXRvciAvICggY29uc3QgX19rbXBfY21wbHg2NF90JiByaHMgKSB7CisgICAgICAgIHN0ZDo6Y29tcGxleDwgZG91YmxlID4gbGhzID0gKnRoaXM7CisgICAgICAgIHJldHVybiBfX2ttcF9saHNfZGl2X3JocyggbGhzLCByaHMgKTsKKyAgICB9CisKKyAgICB9OworICAgIHR5cGVkZWYgc3RydWN0IF9fa21wX2NtcGx4NjRfdCBrbXBfY21wbHg2NDsKKworICAgIC8vIGNvbXBsZXg0CisgICAgc3RydWN0IF9fa21wX2NtcGx4MzJfdCA6IHN0ZDo6Y29tcGxleDwgZmxvYXQgPiB7CisKKyAgICBfX2ttcF9jbXBseDMyX3QoKSA6IHN0ZDo6Y29tcGxleDwgZmxvYXQgPiAoKSB7fQorCisgICAgX19rbXBfY21wbHgzMl90KCBjb25zdCBzdGQ6OmNvbXBsZXg8ZmxvYXQ+JiBjZiApCisgICAgICAgICAgICAgICAgOiBzdGQ6OmNvbXBsZXg8IGZsb2F0ID4gKCBjZiApIHt9CisKKyAgICBfX2ttcF9jbXBseDMyX3Qgb3BlcmF0b3IgKyAoIGNvbnN0IF9fa21wX2NtcGx4MzJfdCYgYiApIHsKKyAgICAgICAgc3RkOjpjb21wbGV4PCBmbG9hdCA+IGxocyA9ICp0aGlzOworICAgICAgICBzdGQ6OmNvbXBsZXg8IGZsb2F0ID4gcmhzID0gYjsKKyAgICAgICAgcmV0dXJuICggbGhzICsgcmhzICk7CisgICAgfQorICAgIF9fa21wX2NtcGx4MzJfdCBvcGVyYXRvciAtICggY29uc3QgX19rbXBfY21wbHgzMl90JiBiICkgeworICAgICAgICBzdGQ6OmNvbXBsZXg8IGZsb2F0ID4gbGhzID0gKnRoaXM7CisgICAgICAgIHN0ZDo6Y29tcGxleDwgZmxvYXQgPiByaHMgPSBiOworICAgICAgICByZXR1cm4gKCBsaHMgLSByaHMgKTsKKyAgICB9CisgICAgX19rbXBfY21wbHgzMl90IG9wZXJhdG9yICogKCBjb25zdCBfX2ttcF9jbXBseDMyX3QmIGIgKSB7CisgICAgICAgIHN0ZDo6Y29tcGxleDwgZmxvYXQgPiBsaHMgPSAqdGhpczsKKyAgICAgICAgc3RkOjpjb21wbGV4PCBmbG9hdCA+IHJocyA9IGI7CisgICAgICAgIHJldHVybiAoIGxocyAqIHJocyApOworICAgIH0KKworICAgIF9fa21wX2NtcGx4MzJfdCBvcGVyYXRvciArICggY29uc3Qga21wX2NtcGx4NjQmIGIgKSB7CisgICAgICAgIGttcF9jbXBseDY0IHQgPSBrbXBfY21wbHg2NCggKnRoaXMgKSArIGI7CisgICAgICAgIHN0ZDo6Y29tcGxleDwgZG91YmxlID4gZCggdCApOworICAgICAgICBzdGQ6OmNvbXBsZXg8IGZsb2F0ID4gZiggZCApOworICAgICAgICBfX2ttcF9jbXBseDMyX3QgciggZiApOworICAgICAgICByZXR1cm4gcjsKKyAgICB9CisgICAgX19rbXBfY21wbHgzMl90IG9wZXJhdG9yIC0gKCBjb25zdCBrbXBfY21wbHg2NCYgYiApIHsKKyAgICAgICAga21wX2NtcGx4NjQgdCA9IGttcF9jbXBseDY0KCAqdGhpcyApIC0gYjsKKyAgICAgICAgc3RkOjpjb21wbGV4PCBkb3VibGUgPiBkKCB0ICk7CisgICAgICAgIHN0ZDo6Y29tcGxleDwgZmxvYXQgPiBmKCBkICk7CisgICAgICAgIF9fa21wX2NtcGx4MzJfdCByKCBmICk7CisgICAgICAgIHJldHVybiByOworICAgIH0KKyAgICBfX2ttcF9jbXBseDMyX3Qgb3BlcmF0b3IgKiAoIGNvbnN0IGttcF9jbXBseDY0JiBiICkgeworICAgICAgICBrbXBfY21wbHg2NCB0ID0ga21wX2NtcGx4NjQoICp0aGlzICkgKiBiOworICAgICAgICBzdGQ6OmNvbXBsZXg8IGRvdWJsZSA+IGQoIHQgKTsKKyAgICAgICAgc3RkOjpjb21wbGV4PCBmbG9hdCA+IGYoIGQgKTsKKyAgICAgICAgX19rbXBfY21wbHgzMl90IHIoIGYgKTsKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfQorCisgICAgdm9pZCBvcGVyYXRvciAvPSAoIGNvbnN0IF9fa21wX2NtcGx4MzJfdCYgcmhzICkgeworICAgICAgICBzdGQ6OmNvbXBsZXg8IGZsb2F0ID4gbGhzID0gKnRoaXM7CisgICAgICAgICp0aGlzID0gX19rbXBfbGhzX2Rpdl9yaHMoIGxocywgcmhzICk7CisgICAgfQorCisgICAgX19rbXBfY21wbHgzMl90IG9wZXJhdG9yIC8gKCBjb25zdCBfX2ttcF9jbXBseDMyX3QmIHJocyApIHsKKyAgICAgICAgc3RkOjpjb21wbGV4PCBmbG9hdCA+IGxocyA9ICp0aGlzOworICAgICAgICByZXR1cm4gX19rbXBfbGhzX2Rpdl9yaHMoIGxocywgcmhzICk7CisgICAgfQorCisgICAgdm9pZCBvcGVyYXRvciAvPSAoIGNvbnN0IGttcF9jbXBseDY0JiByaHMgKSB7CisgICAgICAgIHN0ZDo6Y29tcGxleDwgZmxvYXQgPiBsaHMgPSAqdGhpczsKKyAgICAgICAgKnRoaXMgPSBfX2ttcF9saHNfZGl2X3JocyggbGhzLCByaHMgKTsKKyAgICB9CisKKyAgICBfX2ttcF9jbXBseDMyX3Qgb3BlcmF0b3IgLyAoIGNvbnN0IGttcF9jbXBseDY0JiByaHMgKSB7CisgICAgICAgIHN0ZDo6Y29tcGxleDwgZmxvYXQgPiBsaHMgPSAqdGhpczsKKyAgICAgICAgcmV0dXJuIF9fa21wX2xoc19kaXZfcmhzKCBsaHMsIHJocyApOworICAgIH0KKyAgICB9OworICAgIHR5cGVkZWYgc3RydWN0IF9fa21wX2NtcGx4MzJfdCBrbXBfY21wbHgzMjsKKworICAgIC8vIGNvbXBsZXgxMAorICAgIHN0cnVjdCBLTVBfRE9fQUxJR04oIDE2ICkgIF9fa21wX2NtcGx4ODBfdCA6IHN0ZDo6Y29tcGxleDwgbG9uZyBkb3VibGUgPiB7CisKKyAgICAgICAgICAgIF9fa21wX2NtcGx4ODBfdCgpIDogc3RkOjpjb21wbGV4PCBsb25nIGRvdWJsZSA+ICgpIHt9CisKKyAgICAgICAgICAgIF9fa21wX2NtcGx4ODBfdCggY29uc3Qgc3RkOjpjb21wbGV4PCBsb25nIGRvdWJsZSA+JiBjbGQgKQorICAgICAgICAgICAgICAgIDogc3RkOjpjb21wbGV4PCBsb25nIGRvdWJsZSA+ICggY2xkICkge30KKworICAgICAgICB2b2lkIG9wZXJhdG9yIC89ICggY29uc3QgX19rbXBfY21wbHg4MF90JiByaHMgKSB7CisgICAgICAgIHN0ZDo6Y29tcGxleDwgbG9uZyBkb3VibGUgPiBsaHMgPSAqdGhpczsKKyAgICAgICAgKnRoaXMgPSBfX2ttcF9saHNfZGl2X3JocyggbGhzLCByaHMgKTsKKyAgICAgICAgfQorCisgICAgICAgIF9fa21wX2NtcGx4ODBfdCBvcGVyYXRvciAvICggY29uc3QgX19rbXBfY21wbHg4MF90JiByaHMgKSB7CisgICAgICAgIHN0ZDo6Y29tcGxleDwgbG9uZyBkb3VibGUgPiBsaHMgPSAqdGhpczsKKyAgICAgICAgcmV0dXJuIF9fa21wX2xoc19kaXZfcmhzKCBsaHMsIHJocyApOworICAgICAgICB9CisKKyAgICB9OworICAgIHR5cGVkZWYgS01QX0RPX0FMSUdOKCAxNiApICBzdHJ1Y3QgX19rbXBfY21wbHg4MF90IGttcF9jbXBseDgwOworCisgICAgLy8gY29tcGxleDE2CisgICAgI2lmIEtNUF9IQVZFX1FVQUQKKyAgICBzdHJ1Y3QgX19rbXBfY21wbHgxMjhfdCA6IHN0ZDo6Y29tcGxleDwgX1F1YWQgPiB7CisKKyAgICAgICAgICAgIF9fa21wX2NtcGx4MTI4X3QoKSA6IHN0ZDo6Y29tcGxleDwgX1F1YWQgPiAoKSB7fQorCisgICAgICAgICAgICBfX2ttcF9jbXBseDEyOF90KCBjb25zdCBzdGQ6OmNvbXBsZXg8IF9RdWFkID4mIGNxICkKKyAgICAgICAgICAgICAgICA6IHN0ZDo6Y29tcGxleDwgX1F1YWQgPiAoIGNxICkge30KKworICAgICAgICB2b2lkIG9wZXJhdG9yIC89ICggY29uc3QgX19rbXBfY21wbHgxMjhfdCYgcmhzICkgeworICAgICAgICBzdGQ6OmNvbXBsZXg8IF9RdWFkID4gbGhzID0gKnRoaXM7CisgICAgICAgICp0aGlzID0gX19rbXBfbGhzX2Rpdl9yaHMoIGxocywgcmhzICk7CisgICAgICAgIH0KKworICAgICAgICBfX2ttcF9jbXBseDEyOF90IG9wZXJhdG9yIC8gKCBjb25zdCBfX2ttcF9jbXBseDEyOF90JiByaHMgKSB7CisgICAgICAgIHN0ZDo6Y29tcGxleDwgX1F1YWQgPiBsaHMgPSAqdGhpczsKKyAgICAgICAgcmV0dXJuIF9fa21wX2xoc19kaXZfcmhzKCBsaHMsIHJocyApOworICAgICAgICB9CisKKyAgICB9OworICAgIHR5cGVkZWYgc3RydWN0IF9fa21wX2NtcGx4MTI4X3Qga21wX2NtcGx4MTI4OworICAgICNlbmRpZiAvKiBLTVBfSEFWRV9RVUFEICovCisKKyAgICAjaWZkZWYgX0RFQlVHX1RFTVBPUkFSSUxZX1VOU0VUXworICAgICAgICAjdW5kZWYgX0RFQlVHX1RFTVBPUkFSSUxZX1VOU0VUXworICAgICAgICAvLyBTZXQgaXQgYmFjayBub3cKKyAgICAgICAgI2RlZmluZSBfREVCVUcgMQorICAgICNlbmRpZgorCisjZWxzZQorICAgIC8vIGNyZWF0ZSBzaG9ydGN1dHMgZm9yIGM5OSBjb21wbGV4IHR5cGVzCisgICAgdHlwZWRlZiBmbG9hdCBfQ29tcGxleCAgICAgICBrbXBfY21wbHgzMjsKKyAgICB0eXBlZGVmIGRvdWJsZSBfQ29tcGxleCAgICAgIGttcF9jbXBseDY0OworICAgIHR5cGVkZWYgbG9uZyBkb3VibGUgX0NvbXBsZXgga21wX2NtcGx4ODA7CisgICAgI2lmIEtNUF9IQVZFX1FVQUQKKyAgICB0eXBlZGVmIF9RdWFkIF9Db21wbGV4ICAgICAgIGttcF9jbXBseDEyODsKKyAgICAjZW5kaWYKKyNlbmRpZgorCisvLyBDb21waWxlciAxMi4wIGNoYW5nZWQgYWxpZ25tZW50IG9mIDE2IGFuZCAzMi1ieXRlIGFyZ3VtZW50cyAobGlrZSBfUXVhZAorLy8gYW5kIGttcF9jbXBseDEyOCkgb24gSUEtMzIgYXJjaGl0ZWN0dXJlLiBUaGUgZm9sbG93aW5nIGFsaWduZWQgc3RydWN0dXJlcworLy8gYXJlIGltcGxlbWVudGVkIHRvIHN1cHBvcnQgdGhlIG9sZCBhbGlnbm1lbnQgaW4gMTAuMSwgMTEuMCwgMTEuMSBhbmQgCisvLyBpbnRyb2R1Y2UgdGhlIG5ldyBhbGlnbm1lbnQgaW4gMTIuMC4gU2VlIENRODg0MDUuCisjaWYgS01QX0FSQ0hfWDg2ICYmIEtNUF9IQVZFX1FVQUQKKworICAgIC8vIDQtYnl0ZSBhbGlnbmVkIHN0cnVjdHVyZXMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCisKKyAgICAjcHJhZ21hIHBhY2soIHB1c2gsIDQgKQorCisgICAgCisgICAgc3RydWN0IEtNUF9ET19BTElHTiggNCApIFF1YWRfYTRfdCB7CisgICAgICAgIF9RdWFkIHE7CisKKyAgICAgICAgUXVhZF9hNF90KCAgKSA6IHEoICApIHt9CisgICAgICAgIFF1YWRfYTRfdCggY29uc3QgX1F1YWQgJiBjcSApIDogcSAoIGNxICkge30KKworICAgICAgICBRdWFkX2E0X3Qgb3BlcmF0b3IgKyAoIGNvbnN0IFF1YWRfYTRfdCYgYiApIHsKKyAgICAgICAgX1F1YWQgbGhzID0gKCp0aGlzKS5xOworICAgICAgICBfUXVhZCByaHMgPSBiLnE7CisgICAgICAgIHJldHVybiAoUXVhZF9hNF90KSggbGhzICsgcmhzICk7CisgICAgfQorCisgICAgUXVhZF9hNF90IG9wZXJhdG9yIC0gKCBjb25zdCBRdWFkX2E0X3QmIGIgKSB7CisgICAgICAgIF9RdWFkIGxocyA9ICgqdGhpcykucTsKKyAgICAgICAgX1F1YWQgcmhzID0gYi5xOworICAgICAgICByZXR1cm4gKFF1YWRfYTRfdCkoIGxocyAtIHJocyApOworICAgIH0KKyAgICBRdWFkX2E0X3Qgb3BlcmF0b3IgKiAoIGNvbnN0IFF1YWRfYTRfdCYgYiApIHsKKyAgICAgICAgX1F1YWQgbGhzID0gKCp0aGlzKS5xOworICAgICAgICBfUXVhZCByaHMgPSBiLnE7CisgICAgICAgIHJldHVybiAoUXVhZF9hNF90KSggbGhzICogcmhzICk7CisgICAgfQorCisgICAgUXVhZF9hNF90IG9wZXJhdG9yIC8gKCBjb25zdCBRdWFkX2E0X3QmIGIgKSB7CisgICAgICAgIF9RdWFkIGxocyA9ICgqdGhpcykucTsKKyAgICAgICAgICAgIF9RdWFkIHJocyA9IGIucTsKKyAgICAgICAgcmV0dXJuIChRdWFkX2E0X3QpKCBsaHMgLyByaHMgKTsKKyAgICB9CisKKyAgICB9OworCisgICAgc3RydWN0IEtNUF9ET19BTElHTiggNCApIGttcF9jbXBseDEyOF9hNF90IHsKKyAgICAgICAga21wX2NtcGx4MTI4IHE7CisKKyAgICBrbXBfY21wbHgxMjhfYTRfdCgpIDogcSAoKSB7fQorCisgICAga21wX2NtcGx4MTI4X2E0X3QoIGNvbnN0IGttcF9jbXBseDEyOCAmIGMxMjggKSA6IHEgKCBjMTI4ICkge30KKworICAgICAgICBrbXBfY21wbHgxMjhfYTRfdCBvcGVyYXRvciArICggY29uc3Qga21wX2NtcGx4MTI4X2E0X3QmIGIgKSB7CisgICAgICAgIGttcF9jbXBseDEyOCBsaHMgPSAoKnRoaXMpLnE7CisgICAgICAgIGttcF9jbXBseDEyOCByaHMgPSBiLnE7CisgICAgICAgIHJldHVybiAoa21wX2NtcGx4MTI4X2E0X3QpKCBsaHMgKyByaHMgKTsKKyAgICB9CisgICAgICAgIGttcF9jbXBseDEyOF9hNF90IG9wZXJhdG9yIC0gKCBjb25zdCBrbXBfY21wbHgxMjhfYTRfdCYgYiApIHsKKyAgICAgICAga21wX2NtcGx4MTI4IGxocyA9ICgqdGhpcykucTsKKyAgICAgICAga21wX2NtcGx4MTI4IHJocyA9IGIucTsKKyAgICAgICAgcmV0dXJuIChrbXBfY21wbHgxMjhfYTRfdCkoIGxocyAtIHJocyApOworICAgIH0KKyAgICBrbXBfY21wbHgxMjhfYTRfdCBvcGVyYXRvciAqICggY29uc3Qga21wX2NtcGx4MTI4X2E0X3QmIGIgKSB7CisgICAgICAgIGttcF9jbXBseDEyOCBsaHMgPSAoKnRoaXMpLnE7CisgICAgICAgIGttcF9jbXBseDEyOCByaHMgPSBiLnE7CisgICAgICAgIHJldHVybiAoa21wX2NtcGx4MTI4X2E0X3QpKCBsaHMgKiByaHMgKTsKKyAgICB9CisKKyAgICBrbXBfY21wbHgxMjhfYTRfdCBvcGVyYXRvciAvICggY29uc3Qga21wX2NtcGx4MTI4X2E0X3QmIGIgKSB7CisgICAgICAgIGttcF9jbXBseDEyOCBsaHMgPSAoKnRoaXMpLnE7CisgICAgICAgIGttcF9jbXBseDEyOCByaHMgPSBiLnE7CisgICAgICAgIHJldHVybiAoa21wX2NtcGx4MTI4X2E0X3QpKCBsaHMgLyByaHMgKTsKKyAgICB9CisKKyAgICB9OworCisgICAgI3ByYWdtYSBwYWNrKCBwb3AgKQorCisgICAgLy8gTmV3IDE2LWJ5dGUgYWxpZ25lZCBzdHJ1Y3R1cmVzIGZvciAxMi4wIGNvbXBpbGVyLgorICAgIHN0cnVjdCBLTVBfRE9fQUxJR04oIDE2ICkgUXVhZF9hMTZfdCB7CisgICAgICAgIF9RdWFkIHE7CisKKyAgICAgICAgUXVhZF9hMTZfdCggICkgOiBxKCAgKSB7fQorICAgICAgICBRdWFkX2ExNl90KCBjb25zdCBfUXVhZCAmIGNxICkgOiBxICggY3EgKSB7fQorCisgICAgICAgIFF1YWRfYTE2X3Qgb3BlcmF0b3IgKyAoIGNvbnN0IFF1YWRfYTE2X3QmIGIgKSB7CisgICAgICAgIF9RdWFkIGxocyA9ICgqdGhpcykucTsKKyAgICAgICAgX1F1YWQgcmhzID0gYi5xOworICAgICAgICByZXR1cm4gKFF1YWRfYTE2X3QpKCBsaHMgKyByaHMgKTsKKyAgICB9CisKKyAgICBRdWFkX2ExNl90IG9wZXJhdG9yIC0gKCBjb25zdCBRdWFkX2ExNl90JiBiICkgeworICAgICAgICBfUXVhZCBsaHMgPSAoKnRoaXMpLnE7CisgICAgICAgIF9RdWFkIHJocyA9IGIucTsKKyAgICAgICAgcmV0dXJuIChRdWFkX2ExNl90KSggbGhzIC0gcmhzICk7CisgICAgfQorICAgIFF1YWRfYTE2X3Qgb3BlcmF0b3IgKiAoIGNvbnN0IFF1YWRfYTE2X3QmIGIgKSB7CisgICAgICAgIF9RdWFkIGxocyA9ICgqdGhpcykucTsKKyAgICAgICAgX1F1YWQgcmhzID0gYi5xOworICAgICAgICByZXR1cm4gKFF1YWRfYTE2X3QpKCBsaHMgKiByaHMgKTsKKyAgICB9CisKKyAgICBRdWFkX2ExNl90IG9wZXJhdG9yIC8gKCBjb25zdCBRdWFkX2ExNl90JiBiICkgeworICAgICAgICBfUXVhZCBsaHMgPSAoKnRoaXMpLnE7CisgICAgICAgICAgICBfUXVhZCByaHMgPSBiLnE7CisgICAgICAgIHJldHVybiAoUXVhZF9hMTZfdCkoIGxocyAvIHJocyApOworICAgIH0KKyAgICB9OworCisgICAgc3RydWN0IEtNUF9ET19BTElHTiggMTYgKSBrbXBfY21wbHgxMjhfYTE2X3QgeworICAgICAgICBrbXBfY21wbHgxMjggcTsKKworICAgIGttcF9jbXBseDEyOF9hMTZfdCgpIDogcSAoKSB7fQorCisgICAga21wX2NtcGx4MTI4X2ExNl90KCBjb25zdCBrbXBfY21wbHgxMjggJiBjMTI4ICkgOiBxICggYzEyOCApIHt9CisKKyAgICAgICBrbXBfY21wbHgxMjhfYTE2X3Qgb3BlcmF0b3IgKyAoIGNvbnN0IGttcF9jbXBseDEyOF9hMTZfdCYgYiApIHsKKyAgICAgICAga21wX2NtcGx4MTI4IGxocyA9ICgqdGhpcykucTsKKyAgICAgICAga21wX2NtcGx4MTI4IHJocyA9IGIucTsKKyAgICAgICAgcmV0dXJuIChrbXBfY21wbHgxMjhfYTE2X3QpKCBsaHMgKyByaHMgKTsKKyAgICB9CisgICAgICAga21wX2NtcGx4MTI4X2ExNl90IG9wZXJhdG9yIC0gKCBjb25zdCBrbXBfY21wbHgxMjhfYTE2X3QmIGIgKSB7CisgICAgICAgIGttcF9jbXBseDEyOCBsaHMgPSAoKnRoaXMpLnE7CisgICAgICAgIGttcF9jbXBseDEyOCByaHMgPSBiLnE7CisgICAgICAgIHJldHVybiAoa21wX2NtcGx4MTI4X2ExNl90KSggbGhzIC0gcmhzICk7CisgICAgfQorICAgIGttcF9jbXBseDEyOF9hMTZfdCBvcGVyYXRvciAqICggY29uc3Qga21wX2NtcGx4MTI4X2ExNl90JiBiICkgeworICAgICAgICBrbXBfY21wbHgxMjggbGhzID0gKCp0aGlzKS5xOworICAgICAgICBrbXBfY21wbHgxMjggcmhzID0gYi5xOworICAgICAgICByZXR1cm4gKGttcF9jbXBseDEyOF9hMTZfdCkoIGxocyAqIHJocyApOworICAgIH0KKworICAgIGttcF9jbXBseDEyOF9hMTZfdCBvcGVyYXRvciAvICggY29uc3Qga21wX2NtcGx4MTI4X2ExNl90JiBiICkgeworICAgICAgICBrbXBfY21wbHgxMjggbGhzID0gKCp0aGlzKS5xOworICAgICAgICBrbXBfY21wbHgxMjggcmhzID0gYi5xOworICAgICAgICByZXR1cm4gKGttcF9jbXBseDEyOF9hMTZfdCkoIGxocyAvIHJocyApOworICAgIH0KKyAgICB9OworCisjZW5kaWYKKworI2lmICggS01QX0FSQ0hfWDg2ICkKKyAgICAjZGVmaW5lIFFVQURfTEVHQUNZIFF1YWRfYTRfdAorICAgICNkZWZpbmUgQ1BMWDEyOF9MRUcga21wX2NtcGx4MTI4X2E0X3QKKyNlbHNlCisgICAgI2RlZmluZSBRVUFEX0xFR0FDWSBfUXVhZAorICAgICNkZWZpbmUgQ1BMWDEyOF9MRUcga21wX2NtcGx4MTI4CisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgICAgZXh0ZXJuICJDIiB7CisjZW5kaWYKKworZXh0ZXJuIGludCBfX2ttcF9hdG9taWNfbW9kZTsKKworLy8KKy8vIEF0b21pYyBsb2NrcyBjYW4gZWFzaWx5IGJlY29tZSBjb250ZW5kZWQsIHNvIHdlIHVzZSBxdWV1aW5nIGxvY2tzIGZvciB0aGVtLgorLy8KKwordHlwZWRlZiBrbXBfcXVldWluZ19sb2NrX3Qga21wX2F0b21pY19sb2NrX3Q7CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jaygga21wX2F0b21pY19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIF9fa21wX2FjcXVpcmVfcXVldWluZ19sb2NrKCBsY2ssIGd0aWQgKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fa21wX3Rlc3RfYXRvbWljX2xvY2soIGttcF9hdG9taWNfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICByZXR1cm4gX19rbXBfdGVzdF9xdWV1aW5nX2xvY2soIGxjaywgZ3RpZCApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK19fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soIGttcF9hdG9taWNfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBfX2ttcF9yZWxlYXNlX3F1ZXVpbmdfbG9jayggbGNrLCBndGlkICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19rbXBfaW5pdF9hdG9taWNfbG9jaygga21wX2F0b21pY19sb2NrX3QgKmxjayApCit7CisgICAgX19rbXBfaW5pdF9xdWV1aW5nX2xvY2soIGxjayApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK19fa21wX2Rlc3Ryb3lfYXRvbWljX2xvY2soIGttcF9hdG9taWNfbG9ja190ICpsY2sgKQoreworICAgIF9fa21wX2Rlc3Ryb3lfcXVldWluZ19sb2NrKCBsY2sgKTsKK30KKworLy8gR2xvYmFsIExvY2tzCisKK2V4dGVybiBrbXBfYXRvbWljX2xvY2tfdCBfX2ttcF9hdG9taWNfbG9jazsgICAgLyogQ29udHJvbCBhY2Nlc3MgdG8gYWxsIHVzZXIgY29kZWQgYXRvbWljcyBpbiBHbnUgY29tcGF0IG1vZGUgICAqLworZXh0ZXJuIGttcF9hdG9taWNfbG9ja190IF9fa21wX2F0b21pY19sb2NrXzFpOyAgLyogQ29udHJvbCBhY2Nlc3MgdG8gYWxsIHVzZXIgY29kZWQgYXRvbWljcyBmb3IgMS1ieXRlIGZpeGVkIGRhdGEgdHlwZXMgKi8KK2V4dGVybiBrbXBfYXRvbWljX2xvY2tfdCBfX2ttcF9hdG9taWNfbG9ja18yaTsgIC8qIENvbnRyb2wgYWNjZXNzIHRvIGFsbCB1c2VyIGNvZGVkIGF0b21pY3MgZm9yIDItYnl0ZSBmaXhlZCBkYXRhIHR5cGVzICovCitleHRlcm4ga21wX2F0b21pY19sb2NrX3QgX19rbXBfYXRvbWljX2xvY2tfNGk7ICAvKiBDb250cm9sIGFjY2VzcyB0byBhbGwgdXNlciBjb2RlZCBhdG9taWNzIGZvciA0LWJ5dGUgZml4ZWQgZGF0YSB0eXBlcyAqLworZXh0ZXJuIGttcF9hdG9taWNfbG9ja190IF9fa21wX2F0b21pY19sb2NrXzRyOyAgLyogQ29udHJvbCBhY2Nlc3MgdG8gYWxsIHVzZXIgY29kZWQgYXRvbWljcyBmb3Iga21wX3JlYWwzMiBkYXRhIHR5cGUgICAgKi8KK2V4dGVybiBrbXBfYXRvbWljX2xvY2tfdCBfX2ttcF9hdG9taWNfbG9ja184aTsgIC8qIENvbnRyb2wgYWNjZXNzIHRvIGFsbCB1c2VyIGNvZGVkIGF0b21pY3MgZm9yIDgtYnl0ZSBmaXhlZCBkYXRhIHR5cGVzICovCitleHRlcm4ga21wX2F0b21pY19sb2NrX3QgX19rbXBfYXRvbWljX2xvY2tfOHI7ICAvKiBDb250cm9sIGFjY2VzcyB0byBhbGwgdXNlciBjb2RlZCBhdG9taWNzIGZvciBrbXBfcmVhbDY0IGRhdGEgdHlwZSAgICAqLworZXh0ZXJuIGttcF9hdG9taWNfbG9ja190IF9fa21wX2F0b21pY19sb2NrXzhjOyAgLyogQ29udHJvbCBhY2Nlc3MgdG8gYWxsIHVzZXIgY29kZWQgYXRvbWljcyBmb3IgY29tcGxleCBieXRlIGRhdGEgdHlwZSAgKi8KK2V4dGVybiBrbXBfYXRvbWljX2xvY2tfdCBfX2ttcF9hdG9taWNfbG9ja18xMHI7IC8qIENvbnRyb2wgYWNjZXNzIHRvIGFsbCB1c2VyIGNvZGVkIGF0b21pY3MgZm9yIGxvbmcgZG91YmxlIGRhdGEgdHlwZSAgICovCitleHRlcm4ga21wX2F0b21pY19sb2NrX3QgX19rbXBfYXRvbWljX2xvY2tfMTZyOyAvKiBDb250cm9sIGFjY2VzcyB0byBhbGwgdXNlciBjb2RlZCBhdG9taWNzIGZvciBfUXVhZCBkYXRhIHR5cGUgICAgICAgICAqLworZXh0ZXJuIGttcF9hdG9taWNfbG9ja190IF9fa21wX2F0b21pY19sb2NrXzE2YzsgLyogQ29udHJvbCBhY2Nlc3MgdG8gYWxsIHVzZXIgY29kZWQgYXRvbWljcyBmb3IgZG91YmxlIGNvbXBsZXggZGF0YSB0eXBlKi8KK2V4dGVybiBrbXBfYXRvbWljX2xvY2tfdCBfX2ttcF9hdG9taWNfbG9ja18yMGM7IC8qIENvbnRyb2wgYWNjZXNzIHRvIGFsbCB1c2VyIGNvZGVkIGF0b21pY3MgZm9yIGxvbmcgZG91YmxlIGNvbXBsZXggdHlwZSovCitleHRlcm4ga21wX2F0b21pY19sb2NrX3QgX19rbXBfYXRvbWljX2xvY2tfMzJjOyAvKiBDb250cm9sIGFjY2VzcyB0byBhbGwgdXNlciBjb2RlZCBhdG9taWNzIGZvciBfUXVhZCBjb21wbGV4IGRhdGEgdHlwZSAqLworCisvLworLy8gIEJlbG93IHJvdXRpbmVzIGZvciBhdG9taWMgVVBEQVRFIGFyZSBsaXN0ZWQKKy8vCisKKy8vIDEtYnl0ZQordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMV9hZGQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBjaGFyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMV9hbmRiKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBjaGFyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMV9kaXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBjaGFyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfZGl2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB1bnNpZ25lZCBjaGFyICogbGhzLCB1bnNpZ25lZCBjaGFyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMV9tdWwoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBjaGFyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMV9vcmIoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBjaGFyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zaGwoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBjaGFyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zaHIoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBjaGFyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfc2hyKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB1bnNpZ25lZCBjaGFyICogbGhzLCB1bnNpZ25lZCBjaGFyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zdWIoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBjaGFyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMV94b3IoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBjaGFyIHJocyApOworLy8gMi1ieXRlCit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX2FkZCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBzaG9ydCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJfYW5kYiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIHNob3J0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9kaXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgc2hvcnQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQydV9kaXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHVuc2lnbmVkIHNob3J0ICogbGhzLCB1bnNpZ25lZCBzaG9ydCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJfbXVsKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIHNob3J0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9vcmIoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgc2hvcnQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX3NobCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBzaG9ydCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJfc2hyKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIHNob3J0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfc2hyKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB1bnNpZ25lZCBzaG9ydCAqIGxocywgdW5zaWduZWQgc2hvcnQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX3N1YiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBzaG9ydCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJfeG9yKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIHNob3J0IHJocyApOworLy8gNC1ieXRlIGFkZCAvIHN1YiBmaXhlZAordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hZGQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIGttcF9pbnQzMiByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDRfc3ViKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICogbGhzLCBrbXBfaW50MzIgcmhzICk7CisvLyA0LWJ5dGUgYWRkIC8gc3ViIGZsb2F0Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQ0X2FkZCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsMzIgKiBsaHMsIGttcF9yZWFsMzIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQ0X3N1YiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsMzIgKiBsaHMsIGttcF9yZWFsMzIgcmhzICk7CisvLyA4LWJ5dGUgYWRkIC8gc3ViIGZpeGVkCit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4X2FkZCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqIGxocywga21wX2ludDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zdWIoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIGttcF9pbnQ2NCByaHMgKTsKKy8vIDgtYnl0ZSBhZGQgLyBzdWIgZmxvYXQKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDhfYWRkKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWw2NCAqIGxocywga21wX3JlYWw2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDhfc3ViKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWw2NCAqIGxocywga21wX3JlYWw2NCByaHMgKTsKKy8vIDQtYnl0ZSBmaXhlZAordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hbmRiKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIGttcF9pbnQzMiByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDRfZGl2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICogbGhzLCBrbXBfaW50MzIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0dV9kaXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF91aW50MzIgKiBsaHMsIGttcF91aW50MzIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0X211bCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqIGxocywga21wX2ludDMyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF9vcmIoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIGttcF9pbnQzMiByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDRfc2hsKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICogbGhzLCBrbXBfaW50MzIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0X3NociggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqIGxocywga21wX2ludDMyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfc2hyKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfdWludDMyICogbGhzLCBrbXBfdWludDMyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF94b3IoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIGttcF9pbnQzMiByaHMgKTsKKy8vIDgtYnl0ZSBmaXhlZAordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9hbmRiKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIGttcF9pbnQ2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDhfZGl2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICogbGhzLCBrbXBfaW50NjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4dV9kaXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF91aW50NjQgKiBsaHMsIGttcF91aW50NjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4X211bCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqIGxocywga21wX2ludDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9vcmIoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIGttcF9pbnQ2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDhfc2hsKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICogbGhzLCBrbXBfaW50NjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4X3NociggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqIGxocywga21wX2ludDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfc2hyKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfdWludDY0ICogbGhzLCBrbXBfdWludDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOF94b3IoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIGttcF9pbnQ2NCByaHMgKTsKKy8vIDQtYnl0ZSBmbG9hdAordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0NF9kaXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDMyICogbGhzLCBrbXBfcmVhbDMyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0NF9tdWwoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDMyICogbGhzLCBrbXBfcmVhbDMyIHJocyApOworLy8gOC1ieXRlIGZsb2F0Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQ4X2RpdiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsNjQgKiBsaHMsIGttcF9yZWFsNjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQ4X211bCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsNjQgKiBsaHMsIGttcF9yZWFsNjQgcmhzICk7CisvLyAxLSwgMi0sIDQtLCA4LWJ5dGUgbG9naWNhbCAoJiYsIHx8KQordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMV9hbmRsKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBjaGFyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMV9vcmwoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBjaGFyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hbmRsKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgc2hvcnQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX29ybCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBzaG9ydCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDRfYW5kbCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICogbGhzLCBrbXBfaW50MzIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0X29ybCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqIGxocywga21wX2ludDMyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9hbmRsKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIGttcF9pbnQ2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDhfb3JsKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICogbGhzLCBrbXBfaW50NjQgcmhzICk7CisvLyBNSU4gLyBNQVgKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfbWF4KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfbWluKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJfbWF4KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIHNob3J0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9taW4oICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgc2hvcnQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0X21heCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqIGxocywga21wX2ludDMyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF9taW4oICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIGttcF9pbnQzMiByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDhfbWF4KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICogbGhzLCBrbXBfaW50NjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4X21pbiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqIGxocywga21wX2ludDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0NF9tYXgoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDMyICogbGhzLCBrbXBfcmVhbDMyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0NF9taW4oICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDMyICogbGhzLCBrbXBfcmVhbDMyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0OF9tYXgoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDY0ICogbGhzLCBrbXBfcmVhbDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0OF9taW4oICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDY0ICogbGhzLCBrbXBfcmVhbDY0IHJocyApOworI2lmIEtNUF9IQVZFX1FVQUQKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDE2X21heCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgUVVBRF9MRUdBQ1kgKiBsaHMsIFFVQURfTEVHQUNZIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbWluKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBRVUFEX0xFR0FDWSAqIGxocywgUVVBRF9MRUdBQ1kgcmhzICk7CisjaWYgKCBLTVBfQVJDSF9YODYgKQorICAgIC8vIFJvdXRpbmVzIHdpdGggMTYtYnl0ZSBhcmd1bWVudHMgYWxpZ25lZCB0byAxNi1ieXRlIGJvdW5kYXJ5OyBJQS0zMiBhcmNoaXRlY3R1cmUgb25seQorICAgIHZvaWQgX19rbXBjX2F0b21pY19mbG9hdDE2X21heF9hMTYoIGlkZW50X3QgKiBpZF9yZWYsIGludCBndGlkLCBRdWFkX2ExNl90ICogbGhzLCBRdWFkX2ExNl90IHJocyApOworICAgIHZvaWQgX19rbXBjX2F0b21pY19mbG9hdDE2X21pbl9hMTYoIGlkZW50X3QgKiBpZF9yZWYsIGludCBndGlkLCBRdWFkX2ExNl90ICogbGhzLCBRdWFkX2ExNl90IHJocyApOworI2VuZGlmCisjZW5kaWYKKy8vIC5ORVFWLiAoc2FtZSBhcyB4b3IpCit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQxX25lcXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIGNoYXIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX25lcXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBzaG9ydCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDRfbmVxdiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICogbGhzLCBrbXBfaW50MzIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4X25lcXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqIGxocywga21wX2ludDY0IHJocyApOworLy8gLkVRVi4gKHNhbWUgYXMgfnhvcikKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfZXF2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJfZXF2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIHNob3J0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF9lcXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIGttcF9pbnQzMiByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDhfZXF2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICogbGhzLCBrbXBfaW50NjQgcmhzICk7CisvLyBsb25nIGRvdWJsZSB0eXBlCit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxMF9hZGQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGxvbmcgZG91YmxlICogbGhzLCBsb25nIGRvdWJsZSByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDEwX3N1YiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgbG9uZyBkb3VibGUgKiBsaHMsIGxvbmcgZG91YmxlIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfbXVsKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBsb25nIGRvdWJsZSAqIGxocywgbG9uZyBkb3VibGUgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxMF9kaXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGxvbmcgZG91YmxlICogbGhzLCBsb25nIGRvdWJsZSByaHMgKTsKKy8vIF9RdWFkIHR5cGUKKyNpZiBLTVBfSEFWRV9RVUFECit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxNl9hZGQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFFVQURfTEVHQUNZICogbGhzLCBRVUFEX0xFR0FDWSByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDE2X3N1YiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgUVVBRF9MRUdBQ1kgKiBsaHMsIFFVQURfTEVHQUNZIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbXVsKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBRVUFEX0xFR0FDWSAqIGxocywgUVVBRF9MRUdBQ1kgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxNl9kaXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFFVQURfTEVHQUNZICogbGhzLCBRVUFEX0xFR0FDWSByaHMgKTsKKyNpZiAoIEtNUF9BUkNIX1g4NiApCisgICAgLy8gUm91dGluZXMgd2l0aCAxNi1ieXRlIGFyZ3VtZW50cyBhbGlnbmVkIHRvIDE2LWJ5dGUgYm91bmRhcnkKKyAgICB2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxNl9hZGRfYTE2KCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwgUXVhZF9hMTZfdCAqIGxocywgUXVhZF9hMTZfdCByaHMgKTsKKyAgICB2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxNl9zdWJfYTE2KCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwgUXVhZF9hMTZfdCAqIGxocywgUXVhZF9hMTZfdCByaHMgKTsKKyAgICB2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxNl9tdWxfYTE2KCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwgUXVhZF9hMTZfdCAqIGxocywgUXVhZF9hMTZfdCByaHMgKTsKKyAgICB2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxNl9kaXZfYTE2KCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwgUXVhZF9hMTZfdCAqIGxocywgUXVhZF9hMTZfdCByaHMgKTsKKyNlbmRpZgorI2VuZGlmCisvLyByb3V0aW5lcyBmb3IgY29tcGxleCB0eXBlcwordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4NF9hZGQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgzMiAqIGxocywga21wX2NtcGx4MzIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHg0X3N1YiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDMyICogbGhzLCBrbXBfY21wbHgzMiByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDRfbXVsKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MzIgKiBsaHMsIGttcF9jbXBseDMyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4NF9kaXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgzMiAqIGxocywga21wX2NtcGx4MzIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHg4X2FkZCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDY0ICogbGhzLCBrbXBfY21wbHg2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDhfc3ViKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4NjQgKiBsaHMsIGttcF9jbXBseDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4OF9tdWwoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg2NCAqIGxocywga21wX2NtcGx4NjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHg4X2RpdiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDY0ICogbGhzLCBrbXBfY21wbHg2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDEwX2FkZCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4ODAgKiBsaHMsIGttcF9jbXBseDgwIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4MTBfc3ViKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg4MCAqIGxocywga21wX2NtcGx4ODAgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHgxMF9tdWwoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDgwICogbGhzLCBrbXBfY21wbHg4MCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDEwX2RpdiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4ODAgKiBsaHMsIGttcF9jbXBseDgwIHJocyApOworI2lmIEtNUF9IQVZFX1FVQUQKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDE2X2FkZCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgQ1BMWDEyOF9MRUcgKiBsaHMsIENQTFgxMjhfTEVHIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4MTZfc3ViKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBDUExYMTI4X0xFRyAqIGxocywgQ1BMWDEyOF9MRUcgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHgxNl9tdWwoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIENQTFgxMjhfTEVHICogbGhzLCBDUExYMTI4X0xFRyByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDE2X2RpdiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgQ1BMWDEyOF9MRUcgKiBsaHMsIENQTFgxMjhfTEVHIHJocyApOworI2lmICggS01QX0FSQ0hfWDg2ICkKKyAgICAvLyBSb3V0aW5lcyB3aXRoIDE2LWJ5dGUgYXJndW1lbnRzIGFsaWduZWQgdG8gMTYtYnl0ZSBib3VuZGFyeQorICAgIHZvaWQgX19rbXBjX2F0b21pY19jbXBseDE2X2FkZF9hMTYoIGlkZW50X3QgKiBpZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgxMjhfYTE2X3QgKiBsaHMsIGttcF9jbXBseDEyOF9hMTZfdCByaHMgKTsKKyAgICB2b2lkIF9fa21wY19hdG9taWNfY21wbHgxNl9zdWJfYTE2KCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MTI4X2ExNl90ICogbGhzLCBrbXBfY21wbHgxMjhfYTE2X3QgcmhzICk7CisgICAgdm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4MTZfbXVsX2ExNiggaWRlbnRfdCAqIGlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDEyOF9hMTZfdCAqIGxocywga21wX2NtcGx4MTI4X2ExNl90IHJocyApOworICAgIHZvaWQgX19rbXBjX2F0b21pY19jbXBseDE2X2Rpdl9hMTYoIGlkZW50X3QgKiBpZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgxMjhfYTE2X3QgKiBsaHMsIGttcF9jbXBseDEyOF9hMTZfdCByaHMgKTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorCisvLyBPcGVuTVAgNC4wOiB4ID0gZXhwciBiaW5vcCB4IGZvciBub24tY29tbXV0YXRpdmUgb3BlcmF0aW9ucy4KKy8vIFN1cHBvcnRlZCBvbmx5IG9uIElBLTMyIGFyY2hpdGVjdHVyZSBhbmQgSW50ZWwoUikgNjQKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfc3ViX3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIGNoYXIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQxX2Rpdl9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBjaGFyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfZGl2X3JldiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdW5zaWduZWQgY2hhciAqIGxocywgdW5zaWduZWQgY2hhciByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfc2hsX3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIGNoYXIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQxX3Nocl9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBjaGFyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfc2hyX3JldiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdW5zaWduZWQgY2hhciAqIGxocywgdW5zaWduZWQgY2hhciByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJfc3ViX3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBzaG9ydCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJfZGl2X3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBzaG9ydCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJ1X2Rpdl9yZXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHVuc2lnbmVkIHNob3J0ICogbGhzLCB1bnNpZ25lZCBzaG9ydCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJfc2hsX3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBzaG9ydCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJfc2hyX3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBzaG9ydCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJ1X3Nocl9yZXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHVuc2lnbmVkIHNob3J0ICogbGhzLCB1bnNpZ25lZCBzaG9ydCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDRfc3ViX3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqIGxocywga21wX2ludDMyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF9kaXZfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICogbGhzLCBrbXBfaW50MzIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0dV9kaXZfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfdWludDMyICogbGhzLCBrbXBfdWludDMyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaGxfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICogbGhzLCBrbXBfaW50MzIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0X3Nocl9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIGttcF9pbnQzMiByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDR1X3Nocl9yZXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF91aW50MzIgKiBsaHMsIGttcF91aW50MzIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4X3N1Yl9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIGttcF9pbnQ2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDhfZGl2X3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqIGxocywga21wX2ludDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfZGl2X3JldiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3VpbnQ2NCAqIGxocywga21wX3VpbnQ2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDhfc2hsX3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqIGxocywga21wX2ludDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zaHJfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICogbGhzLCBrbXBfaW50NjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4dV9zaHJfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfdWludDY0ICogbGhzLCBrbXBfdWludDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0NF9zdWJfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgZmxvYXQgKiBsaHMsIGZsb2F0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0NF9kaXZfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgZmxvYXQgKiBsaHMsIGZsb2F0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0OF9zdWJfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgZG91YmxlICogbGhzLCBkb3VibGUgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQ4X2Rpdl9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBkb3VibGUgKiBsaHMsIGRvdWJsZSByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDEwX3N1Yl9yZXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGxvbmcgZG91YmxlICogbGhzLCBsb25nIGRvdWJsZSByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDEwX2Rpdl9yZXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGxvbmcgZG91YmxlICogbGhzLCBsb25nIGRvdWJsZSByaHMgKTsKKyNpZiBLTVBfSEFWRV9RVUFECit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxNl9zdWJfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBRVUFEX0xFR0FDWSAqIGxocywgUVVBRF9MRUdBQ1kgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxNl9kaXZfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBRVUFEX0xFR0FDWSAqIGxocywgUVVBRF9MRUdBQ1kgcmhzICk7CisjZW5kaWYKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDRfc3ViX3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDMyICogbGhzLCBrbXBfY21wbHgzMiByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDRfZGl2X3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDMyICogbGhzLCBrbXBfY21wbHgzMiByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDhfc3ViX3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDY0ICogbGhzLCBrbXBfY21wbHg2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDhfZGl2X3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDY0ICogbGhzLCBrbXBfY21wbHg2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDEwX3N1Yl9yZXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDgwICogbGhzLCBrbXBfY21wbHg4MCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDEwX2Rpdl9yZXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDgwICogbGhzLCBrbXBfY21wbHg4MCByaHMgKTsKKyNpZiBLTVBfSEFWRV9RVUFECit2b2lkIF9fa21wY19hdG9taWNfY21wbHgxNl9zdWJfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBDUExYMTI4X0xFRyAqIGxocywgQ1BMWDEyOF9MRUcgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHgxNl9kaXZfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBDUExYMTI4X0xFRyAqIGxocywgQ1BMWDEyOF9MRUcgcmhzICk7CisjaWYgKCBLTVBfQVJDSF9YODYgKQorICAgIC8vIFJvdXRpbmVzIHdpdGggMTYtYnl0ZSBhcmd1bWVudHMgYWxpZ25lZCB0byAxNi1ieXRlIGJvdW5kYXJ5CisgICAgdm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3ViX2ExNl9yZXYoIGlkZW50X3QgKiBpZF9yZWYsIGludCBndGlkLCBRdWFkX2ExNl90ICogbGhzLCBRdWFkX2ExNl90IHJocyApOworICAgIHZvaWQgX19rbXBjX2F0b21pY19mbG9hdDE2X2Rpdl9hMTZfcmV2KCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwgUXVhZF9hMTZfdCAqIGxocywgUXVhZF9hMTZfdCByaHMgKTsKKyAgICB2b2lkIF9fa21wY19hdG9taWNfY21wbHgxNl9zdWJfYTE2X3JldiggaWRlbnRfdCAqIGlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDEyOF9hMTZfdCAqIGxocywga21wX2NtcGx4MTI4X2ExNl90IHJocyApOworICAgIHZvaWQgX19rbXBjX2F0b21pY19jbXBseDE2X2Rpdl9hMTZfcmV2KCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MTI4X2ExNl90ICogbGhzLCBrbXBfY21wbHgxMjhfYTE2X3QgcmhzICk7CisjZW5kaWYKKyNlbmRpZiAvLyBLTVBfSEFWRV9RVUFECisKKyNlbmRpZiAvL0tNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKworI2VuZGlmIC8vT01QXzQwX0VOQUJMRUQKKworLy8gcm91dGluZXMgZm9yIG1peGVkIHR5cGVzCisKKy8vIFJIUz1mbG9hdDgKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfbXVsX2Zsb2F0OCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywga21wX3JlYWw2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfZGl2X2Zsb2F0OCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywga21wX3JlYWw2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJfbXVsX2Zsb2F0OCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIGttcF9yZWFsNjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX2Rpdl9mbG9hdDgoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBrbXBfcmVhbDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF9tdWxfZmxvYXQ4KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIGttcF9yZWFsNjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0X2Rpdl9mbG9hdDgoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqIGxocywga21wX3JlYWw2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDhfbXVsX2Zsb2F0OCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICogbGhzLCBrbXBfcmVhbDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9kaXZfZmxvYXQ4KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIGttcF9yZWFsNjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQ0X2FkZF9mbG9hdDgoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsMzIgKiBsaHMsIGttcF9yZWFsNjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQ0X3N1Yl9mbG9hdDgoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsMzIgKiBsaHMsIGttcF9yZWFsNjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQ0X211bF9mbG9hdDgoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsMzIgKiBsaHMsIGttcF9yZWFsNjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQ0X2Rpdl9mbG9hdDgoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsMzIgKiBsaHMsIGttcF9yZWFsNjQgcmhzICk7CisKKy8vIFJIUz1mbG9hdDE2IChkZXByZWNhdGVkLCB0byBiZSByZW1vdmVkIHdoZW4gd2UgYXJlIHN1cmUgdGhlIGNvbXBpbGVyIGRvZXMgbm90IHVzZSB0aGVtKQorI2lmIEtNUF9IQVZFX1FVQUQKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfYWRkX2ZwKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgX1F1YWQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQxX3N1Yl9mcCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMV9tdWxfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBfUXVhZCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfZGl2X2ZwKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgX1F1YWQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQxdV9kaXZfZnAoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHVuc2lnbmVkIGNoYXIgKiBsaHMsIF9RdWFkIHJocyApOworCit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX2FkZF9mcCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBfUXVhZCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJfc3ViX2ZwKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9tdWxfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgX1F1YWQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX2Rpdl9mcCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBfUXVhZCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJ1X2Rpdl9mcCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdW5zaWduZWQgc2hvcnQgKiBsaHMsIF9RdWFkIHJocyApOworCit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0X2FkZF9mcCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqIGxocywgX1F1YWQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0X3N1Yl9mcCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqIGxocywgX1F1YWQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0X211bF9mcCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqIGxocywgX1F1YWQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0X2Rpdl9mcCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqIGxocywgX1F1YWQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0dV9kaXZfZnAoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF91aW50MzIgKiBsaHMsIF9RdWFkIHJocyApOworCit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4X2FkZF9mcCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqIGxocywgX1F1YWQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4X3N1Yl9mcCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqIGxocywgX1F1YWQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4X211bF9mcCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqIGxocywgX1F1YWQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4X2Rpdl9mcCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqIGxocywgX1F1YWQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4dV9kaXZfZnAoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF91aW50NjQgKiBsaHMsIF9RdWFkIHJocyApOworCit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQ0X2FkZF9mcCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsMzIgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0NF9zdWJfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDMyICogbGhzLCBfUXVhZCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDRfbXVsX2ZwKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWwzMiAqIGxocywgX1F1YWQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQ0X2Rpdl9mcCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsMzIgKiBsaHMsIF9RdWFkIHJocyApOworCit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQ4X2FkZF9mcCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsNjQgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0OF9zdWJfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDY0ICogbGhzLCBfUXVhZCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDhfbXVsX2ZwKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWw2NCAqIGxocywgX1F1YWQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQ4X2Rpdl9mcCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsNjQgKiBsaHMsIF9RdWFkIHJocyApOworCit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxMF9hZGRfZnAoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGxvbmcgZG91YmxlICogbGhzLCBfUXVhZCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDEwX3N1Yl9mcCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgbG9uZyBkb3VibGUgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfbXVsX2ZwKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBsb25nIGRvdWJsZSAqIGxocywgX1F1YWQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxMF9kaXZfZnAoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGxvbmcgZG91YmxlICogbGhzLCBfUXVhZCByaHMgKTsKKyNlbmRpZiAvLyBLTVBfSEFWRV9RVUFECisKKy8vIFJIUz1jbXBseDgKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDRfYWRkX2NtcGx4OCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MzIgKiBsaHMsIGttcF9jbXBseDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4NF9zdWJfY21wbHg4KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgzMiAqIGxocywga21wX2NtcGx4NjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHg0X211bF9jbXBseDgoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDMyICogbGhzLCBrbXBfY21wbHg2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDRfZGl2X2NtcGx4OCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MzIgKiBsaHMsIGttcF9jbXBseDY0IHJocyApOworCisvLyBnZW5lcmljIGF0b21pYyByb3V0aW5lcwordm9pZCBfX2ttcGNfYXRvbWljXzEoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB2b2lkKiBsaHMsIHZvaWQqIHJocywgdm9pZCAoKmYpKCB2b2lkICosIHZvaWQgKiwgdm9pZCAqICkgKTsKK3ZvaWQgX19rbXBjX2F0b21pY18yKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdm9pZCogbGhzLCB2b2lkKiByaHMsIHZvaWQgKCpmKSggdm9pZCAqLCB2b2lkICosIHZvaWQgKiApICk7Cit2b2lkIF9fa21wY19hdG9taWNfNCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHZvaWQqIGxocywgdm9pZCogcmhzLCB2b2lkICgqZikoIHZvaWQgKiwgdm9pZCAqLCB2b2lkICogKSApOwordm9pZCBfX2ttcGNfYXRvbWljXzgoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB2b2lkKiBsaHMsIHZvaWQqIHJocywgdm9pZCAoKmYpKCB2b2lkICosIHZvaWQgKiwgdm9pZCAqICkgKTsKK3ZvaWQgX19rbXBjX2F0b21pY18xMCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdm9pZCogbGhzLCB2b2lkKiByaHMsIHZvaWQgKCpmKSggdm9pZCAqLCB2b2lkICosIHZvaWQgKiApICk7Cit2b2lkIF9fa21wY19hdG9taWNfMTYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHZvaWQqIGxocywgdm9pZCogcmhzLCB2b2lkICgqZikoIHZvaWQgKiwgdm9pZCAqLCB2b2lkICogKSApOwordm9pZCBfX2ttcGNfYXRvbWljXzIwKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB2b2lkKiBsaHMsIHZvaWQqIHJocywgdm9pZCAoKmYpKCB2b2lkICosIHZvaWQgKiwgdm9pZCAqICkgKTsKK3ZvaWQgX19rbXBjX2F0b21pY18zMiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdm9pZCogbGhzLCB2b2lkKiByaHMsIHZvaWQgKCpmKSggdm9pZCAqLCB2b2lkICosIHZvaWQgKiApICk7CisKKy8vIFJFQUQsIFdSSVRFLCBDQVBUVVJFIGFyZSBzdXBwb3J0ZWQgb25seSBvbiBJQS0zMiBhcmNoaXRlY3R1cmUgYW5kIEludGVsKFIpIDY0CisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorCisvLworLy8gIEJlbG93IHJvdXRpbmVzIGZvciBhdG9taWMgUkVBRCBhcmUgbGlzdGVkCisvLworCitjaGFyICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfcmQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICAgICAgICAqIGxvYyApOworc2hvcnQgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3JkKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgICAgICAgKiBsb2MgKTsKK2ttcF9pbnQzMiAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9yZCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAgICogbG9jICk7CitrbXBfaW50NjQgICAgX19rbXBjX2F0b21pY19maXhlZDhfcmQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgICAqIGxvYyApOwora21wX3JlYWwzMiAgIF9fa21wY19hdG9taWNfZmxvYXQ0X3JkKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWwzMiAgKiBsb2MgKTsKK2ttcF9yZWFsNjQgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9yZCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsNjQgICogbG9jICk7Citsb25nIGRvdWJsZSAgX19rbXBjX2F0b21pY19mbG9hdDEwX3JkKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBsb25nIGRvdWJsZSAqIGxvYyApOworI2lmIEtNUF9IQVZFX1FVQUQKK1FVQURfTEVHQUNZICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfcmQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFFVQURfTEVHQUNZICogbG9jICk7CisjZW5kaWYKKy8vIEZpeCBmb3IgQ1EyMjAzNjE6IGNtcGx4NCBSRUFEIHdpbGwgcmV0dXJuIHZvaWQgb24gV2luZG93cyogT1M7IHJlYWQgdmFsdWUgd2lsbCBiZQorLy8gcmV0dXJuZWQgdGhyb3VnaCBhbiBhZGRpdGlvbmFsIHBhcmFtZXRlcgorI2lmICggS01QX09TX1dJTkRPV1MgKQorICAgIHZvaWQgIF9fa21wY19hdG9taWNfY21wbHg0X3JkKCAga21wX2NtcGx4MzIgKiBvdXQsIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDMyICogbG9jICk7CisjZWxzZQorICAgIGttcF9jbXBseDMyICBfX2ttcGNfYXRvbWljX2NtcGx4NF9yZCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDMyICogbG9jICk7CisjZW5kaWYKK2ttcF9jbXBseDY0ICBfX2ttcGNfYXRvbWljX2NtcGx4OF9yZCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDY0ICogbG9jICk7CitrbXBfY21wbHg4MCAgX19rbXBjX2F0b21pY19jbXBseDEwX3JkKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg4MCAqIGxvYyApOworI2lmIEtNUF9IQVZFX1FVQUQKK0NQTFgxMjhfTEVHICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfcmQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIENQTFgxMjhfTEVHICogbG9jICk7CisjaWYgKCBLTVBfQVJDSF9YODYgKQorICAgIC8vIFJvdXRpbmVzIHdpdGggMTYtYnl0ZSBhcmd1bWVudHMgYWxpZ25lZCB0byAxNi1ieXRlIGJvdW5kYXJ5CisgICAgUXVhZF9hMTZfdCAgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9hMTZfcmQoIGlkZW50X3QgKiBpZF9yZWYsIGludCBndGlkLCBRdWFkX2ExNl90ICAgICAgICAgKiBsb2MgKTsKKyAgICBrbXBfY21wbHgxMjhfYTE2X3QgX19rbXBjX2F0b21pY19jbXBseDE2X2ExNl9yZCggaWRlbnRfdCAqIGlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDEyOF9hMTZfdCAqIGxvYyApOworI2VuZGlmCisjZW5kaWYKKworCisvLworLy8gIEJlbG93IHJvdXRpbmVzIGZvciBhdG9taWMgV1JJVEUgYXJlIGxpc3RlZAorLy8KKwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMV93ciggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgICAgICAgICogbGhzLCBjaGFyICAgICAgICByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJfd3IoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAgICAgICAqIGxocywgc2hvcnQgICAgICAgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0X3dyKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICAgKiBsaHMsIGttcF9pbnQzMiAgIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOF93ciggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAgICogbGhzLCBrbXBfaW50NjQgICByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDRfd3IoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDMyICAqIGxocywga21wX3JlYWwzMiAgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQ4X3dyKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWw2NCAgKiBsaHMsIGttcF9yZWFsNjQgIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfd3IoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGxvbmcgZG91YmxlICogbGhzLCBsb25nIGRvdWJsZSByaHMgKTsKKyNpZiBLTVBfSEFWRV9RVUFECit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxNl93ciggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgUVVBRF9MRUdBQ1kgKiBsaHMsIFFVQURfTEVHQUNZIHJocyApOworI2VuZGlmCit2b2lkIF9fa21wY19hdG9taWNfY21wbHg0X3dyKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MzIgKiBsaHMsIGttcF9jbXBseDMyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4OF93ciggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDY0ICogbGhzLCBrbXBfY21wbHg2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDEwX3dyKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg4MCAqIGxocywga21wX2NtcGx4ODAgcmhzICk7CisjaWYgS01QX0hBVkVfUVVBRAordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4MTZfd3IoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIENQTFgxMjhfTEVHICogbGhzLCBDUExYMTI4X0xFRyByaHMgKTsKKyNpZiAoIEtNUF9BUkNIX1g4NiApCisgICAgLy8gUm91dGluZXMgd2l0aCAxNi1ieXRlIGFyZ3VtZW50cyBhbGlnbmVkIHRvIDE2LWJ5dGUgYm91bmRhcnkKKyAgICB2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxNl9hMTZfd3IoIGlkZW50X3QgKiBpZF9yZWYsIGludCBndGlkLCBRdWFkX2ExNl90ICAgICAgICAgKiBsaHMsIFF1YWRfYTE2X3QgICAgICAgICByaHMgKTsKKyAgICB2b2lkIF9fa21wY19hdG9taWNfY21wbHgxNl9hMTZfd3IoIGlkZW50X3QgKiBpZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgxMjhfYTE2X3QgKiBsaHMsIGttcF9jbXBseDEyOF9hMTZfdCByaHMgKTsKKyNlbmRpZgorI2VuZGlmCisKKy8vCisvLyAgQmVsb3cgcm91dGluZXMgZm9yIGF0b21pYyBDQVBUVVJFIGFyZSBsaXN0ZWQKKy8vCisKKy8vIDEtYnl0ZQorY2hhciBfX2ttcGNfYXRvbWljX2ZpeGVkMV9hZGRfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMsIGludCBmbGFnKTsKK2NoYXIgX19rbXBjX2F0b21pY19maXhlZDFfYW5kYl9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIGNoYXIgcmhzLCBpbnQgZmxhZyk7CitjaGFyIF9fa21wY19hdG9taWNfZml4ZWQxX2Rpdl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBjaGFyIHJocywgaW50IGZsYWcpOwordW5zaWduZWQgY2hhciBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfZGl2X2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdW5zaWduZWQgY2hhciAqIGxocywgdW5zaWduZWQgY2hhciByaHMsIGludCBmbGFnKTsKK2NoYXIgX19rbXBjX2F0b21pY19maXhlZDFfbXVsX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIGNoYXIgcmhzLCBpbnQgZmxhZyk7CitjaGFyIF9fa21wY19hdG9taWNfZml4ZWQxX29yYl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBjaGFyIHJocywgaW50IGZsYWcpOworY2hhciBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zaGxfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMsIGludCBmbGFnKTsKK2NoYXIgX19rbXBjX2F0b21pY19maXhlZDFfc2hyX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIGNoYXIgcmhzLCBpbnQgZmxhZyk7Cit1bnNpZ25lZCBjaGFyIF9fa21wY19hdG9taWNfZml4ZWQxdV9zaHJfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB1bnNpZ25lZCBjaGFyICogbGhzLCB1bnNpZ25lZCBjaGFyIHJocywgaW50IGZsYWcpOworY2hhciBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zdWJfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMsIGludCBmbGFnKTsKK2NoYXIgX19rbXBjX2F0b21pY19maXhlZDFfeG9yX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIGNoYXIgcmhzLCBpbnQgZmxhZyk7CisvLyAyLWJ5dGUKK3Nob3J0IF9fa21wY19hdG9taWNfZml4ZWQyX2FkZF9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgc2hvcnQgcmhzLCBpbnQgZmxhZyk7CitzaG9ydCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hbmRiX2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIHNob3J0IHJocywgaW50IGZsYWcpOworc2hvcnQgX19rbXBjX2F0b21pY19maXhlZDJfZGl2X2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBzaG9ydCByaHMsIGludCBmbGFnKTsKK3Vuc2lnbmVkIHNob3J0IF9fa21wY19hdG9taWNfZml4ZWQydV9kaXZfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB1bnNpZ25lZCBzaG9ydCAqIGxocywgdW5zaWduZWQgc2hvcnQgcmhzLCBpbnQgZmxhZyk7CitzaG9ydCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9tdWxfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIHNob3J0IHJocywgaW50IGZsYWcpOworc2hvcnQgX19rbXBjX2F0b21pY19maXhlZDJfb3JiX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBzaG9ydCByaHMsIGludCBmbGFnKTsKK3Nob3J0IF9fa21wY19hdG9taWNfZml4ZWQyX3NobF9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgc2hvcnQgcmhzLCBpbnQgZmxhZyk7CitzaG9ydCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaHJfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIHNob3J0IHJocywgaW50IGZsYWcpOwordW5zaWduZWQgc2hvcnQgX19rbXBjX2F0b21pY19maXhlZDJ1X3Nocl9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHVuc2lnbmVkIHNob3J0ICogbGhzLCB1bnNpZ25lZCBzaG9ydCByaHMsIGludCBmbGFnKTsKK3Nob3J0IF9fa21wY19hdG9taWNfZml4ZWQyX3N1Yl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgc2hvcnQgcmhzLCBpbnQgZmxhZyk7CitzaG9ydCBfX2ttcGNfYXRvbWljX2ZpeGVkMl94b3JfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIHNob3J0IHJocywgaW50IGZsYWcpOworLy8gNC1ieXRlIGFkZCAvIHN1YiBmaXhlZAora21wX2ludDMyICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hZGRfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICAqIGxocywga21wX2ludDMyIHJocywgaW50IGZsYWcpOwora21wX2ludDMyICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zdWJfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICAqIGxocywga21wX2ludDMyIHJocywgaW50IGZsYWcpOworLy8gNC1ieXRlIGFkZCAvIHN1YiBmbG9hdAora21wX3JlYWwzMiBfX2ttcGNfYXRvbWljX2Zsb2F0NF9hZGRfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWwzMiAqIGxocywga21wX3JlYWwzMiByaHMsIGludCBmbGFnKTsKK2ttcF9yZWFsMzIgX19rbXBjX2F0b21pY19mbG9hdDRfc3ViX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsMzIgKiBsaHMsIGttcF9yZWFsMzIgcmhzLCBpbnQgZmxhZyk7CisvLyA4LWJ5dGUgYWRkIC8gc3ViIGZpeGVkCitrbXBfaW50NjQgIF9fa21wY19hdG9taWNfZml4ZWQ4X2FkZF9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgICogbGhzLCBrbXBfaW50NjQgcmhzLCBpbnQgZmxhZyk7CitrbXBfaW50NjQgIF9fa21wY19hdG9taWNfZml4ZWQ4X3N1Yl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgICogbGhzLCBrbXBfaW50NjQgcmhzLCBpbnQgZmxhZyk7CisvLyA4LWJ5dGUgYWRkIC8gc3ViIGZsb2F0CitrbXBfcmVhbDY0IF9fa21wY19hdG9taWNfZmxvYXQ4X2FkZF9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDY0ICogbGhzLCBrbXBfcmVhbDY0IHJocywgaW50IGZsYWcpOwora21wX3JlYWw2NCBfX2ttcGNfYXRvbWljX2Zsb2F0OF9zdWJfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWw2NCAqIGxocywga21wX3JlYWw2NCByaHMsIGludCBmbGFnKTsKKy8vIDQtYnl0ZSBmaXhlZAora21wX2ludDMyICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hbmRiX2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICAqIGxocywga21wX2ludDMyICByaHMsIGludCBmbGFnKTsKK2ttcF9pbnQzMiAgX19rbXBjX2F0b21pY19maXhlZDRfZGl2X2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAgKiBsaHMsIGttcF9pbnQzMiAgcmhzLCBpbnQgZmxhZyk7CitrbXBfdWludDMyIF9fa21wY19hdG9taWNfZml4ZWQ0dV9kaXZfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfdWludDMyICogbGhzLCBrbXBfdWludDMyIHJocywgaW50IGZsYWcpOwora21wX2ludDMyICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9tdWxfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICAqIGxocywga21wX2ludDMyICByaHMsIGludCBmbGFnKTsKK2ttcF9pbnQzMiAgX19rbXBjX2F0b21pY19maXhlZDRfb3JiX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAgKiBsaHMsIGttcF9pbnQzMiAgcmhzLCBpbnQgZmxhZyk7CitrbXBfaW50MzIgIF9fa21wY19hdG9taWNfZml4ZWQ0X3NobF9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgICogbGhzLCBrbXBfaW50MzIgIHJocywgaW50IGZsYWcpOwora21wX2ludDMyICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaHJfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICAqIGxocywga21wX2ludDMyICByaHMsIGludCBmbGFnKTsKK2ttcF91aW50MzIgX19rbXBjX2F0b21pY19maXhlZDR1X3Nocl9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF91aW50MzIgKiBsaHMsIGttcF91aW50MzIgcmhzLCBpbnQgZmxhZyk7CitrbXBfaW50MzIgIF9fa21wY19hdG9taWNfZml4ZWQ0X3hvcl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgICogbGhzLCBrbXBfaW50MzIgIHJocywgaW50IGZsYWcpOworLy8gOC1ieXRlIGZpeGVkCitrbXBfaW50NjQgIF9fa21wY19hdG9taWNfZml4ZWQ4X2FuZGJfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgICogbGhzLCBrbXBfaW50NjQgIHJocywgaW50IGZsYWcpOwora21wX2ludDY0ICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9kaXZfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICAqIGxocywga21wX2ludDY0ICByaHMsIGludCBmbGFnKTsKK2ttcF91aW50NjQgX19rbXBjX2F0b21pY19maXhlZDh1X2Rpdl9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF91aW50NjQgKiBsaHMsIGttcF91aW50NjQgcmhzLCBpbnQgZmxhZyk7CitrbXBfaW50NjQgIF9fa21wY19hdG9taWNfZml4ZWQ4X211bF9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgICogbGhzLCBrbXBfaW50NjQgIHJocywgaW50IGZsYWcpOwora21wX2ludDY0ICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9vcmJfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICAqIGxocywga21wX2ludDY0ICByaHMsIGludCBmbGFnKTsKK2ttcF9pbnQ2NCAgX19rbXBjX2F0b21pY19maXhlZDhfc2hsX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAgKiBsaHMsIGttcF9pbnQ2NCAgcmhzLCBpbnQgZmxhZyk7CitrbXBfaW50NjQgIF9fa21wY19hdG9taWNfZml4ZWQ4X3Nocl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgICogbGhzLCBrbXBfaW50NjQgIHJocywgaW50IGZsYWcpOwora21wX3VpbnQ2NCBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfc2hyX2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3VpbnQ2NCAqIGxocywga21wX3VpbnQ2NCByaHMsIGludCBmbGFnKTsKK2ttcF9pbnQ2NCAgX19rbXBjX2F0b21pY19maXhlZDhfeG9yX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAgKiBsaHMsIGttcF9pbnQ2NCAgcmhzLCBpbnQgZmxhZyk7CisvLyA0LWJ5dGUgZmxvYXQKK2ttcF9yZWFsMzIgX19rbXBjX2F0b21pY19mbG9hdDRfZGl2X2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsMzIgKiBsaHMsIGttcF9yZWFsMzIgcmhzLCBpbnQgZmxhZyk7CitrbXBfcmVhbDMyIF9fa21wY19hdG9taWNfZmxvYXQ0X211bF9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDMyICogbGhzLCBrbXBfcmVhbDMyIHJocywgaW50IGZsYWcpOworLy8gOC1ieXRlIGZsb2F0CitrbXBfcmVhbDY0IF9fa21wY19hdG9taWNfZmxvYXQ4X2Rpdl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDY0ICogbGhzLCBrbXBfcmVhbDY0IHJocywgaW50IGZsYWcpOwora21wX3JlYWw2NCBfX2ttcGNfYXRvbWljX2Zsb2F0OF9tdWxfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWw2NCAqIGxocywga21wX3JlYWw2NCByaHMsIGludCBmbGFnKTsKKy8vIDEtLCAyLSwgNC0sIDgtYnl0ZSBsb2dpY2FsICgmJiwgfHwpCitjaGFyICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfYW5kbF9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgICAgICAqIGxocywgY2hhciAgICAgIHJocywgaW50IGZsYWcpOworY2hhciAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX29ybF9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICAgICAgKiBsaHMsIGNoYXIgICAgICByaHMsIGludCBmbGFnKTsKK3Nob3J0ICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hbmRsX2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgICAgICogbGhzLCBzaG9ydCAgICAgcmhzLCBpbnQgZmxhZyk7CitzaG9ydCAgICAgX19rbXBjX2F0b21pY19maXhlZDJfb3JsX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICAgICAqIGxocywgc2hvcnQgICAgIHJocywgaW50IGZsYWcpOwora21wX2ludDMyIF9fa21wY19hdG9taWNfZml4ZWQ0X2FuZGxfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIGttcF9pbnQzMiByaHMsIGludCBmbGFnKTsKK2ttcF9pbnQzMiBfX2ttcGNfYXRvbWljX2ZpeGVkNF9vcmxfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICogbGhzLCBrbXBfaW50MzIgcmhzLCBpbnQgZmxhZyk7CitrbXBfaW50NjQgX19rbXBjX2F0b21pY19maXhlZDhfYW5kbF9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqIGxocywga21wX2ludDY0IHJocywgaW50IGZsYWcpOwora21wX2ludDY0IF9fa21wY19hdG9taWNfZml4ZWQ4X29ybF9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIGttcF9pbnQ2NCByaHMsIGludCBmbGFnKTsKKy8vIE1JTiAvIE1BWAorY2hhciAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfbWF4X2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgICAgICAqIGxocywgY2hhciAgICAgIHJocywgaW50IGZsYWcpOworY2hhciAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfbWluX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgICAgICAqIGxocywgY2hhciAgICAgIHJocywgaW50IGZsYWcpOworc2hvcnQgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJfbWF4X2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICAgICAqIGxocywgc2hvcnQgICAgIHJocywgaW50IGZsYWcpOworc2hvcnQgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJfbWluX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICAgICAqIGxocywgc2hvcnQgICAgIHJocywgaW50IGZsYWcpOwora21wX2ludDMyICAgX19rbXBjX2F0b21pY19maXhlZDRfbWF4X2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqIGxocywga21wX2ludDMyIHJocywgaW50IGZsYWcpOwora21wX2ludDMyICAgX19rbXBjX2F0b21pY19maXhlZDRfbWluX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqIGxocywga21wX2ludDMyIHJocywgaW50IGZsYWcpOwora21wX2ludDY0ICAgX19rbXBjX2F0b21pY19maXhlZDhfbWF4X2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqIGxocywga21wX2ludDY0IHJocywgaW50IGZsYWcpOwora21wX2ludDY0ICAgX19rbXBjX2F0b21pY19maXhlZDhfbWluX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqIGxocywga21wX2ludDY0IHJocywgaW50IGZsYWcpOwora21wX3JlYWwzMiAgX19rbXBjX2F0b21pY19mbG9hdDRfbWF4X2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsMzIgKiBsaHMsIGttcF9yZWFsMzIgcmhzLCBpbnQgZmxhZyk7CitrbXBfcmVhbDMyICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9taW5fY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWwzMiAqIGxocywga21wX3JlYWwzMiByaHMsIGludCBmbGFnKTsKK2ttcF9yZWFsNjQgIF9fa21wY19hdG9taWNfZmxvYXQ4X21heF9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDY0ICogbGhzLCBrbXBfcmVhbDY0IHJocywgaW50IGZsYWcpOwora21wX3JlYWw2NCAgX19rbXBjX2F0b21pY19mbG9hdDhfbWluX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsNjQgKiBsaHMsIGttcF9yZWFsNjQgcmhzLCBpbnQgZmxhZyk7CisjaWYgS01QX0hBVkVfUVVBRAorUVVBRF9MRUdBQ1kgX19rbXBjX2F0b21pY19mbG9hdDE2X21heF9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFFVQURfTEVHQUNZICogbGhzLCBRVUFEX0xFR0FDWSByaHMsIGludCBmbGFnKTsKK1FVQURfTEVHQUNZIF9fa21wY19hdG9taWNfZmxvYXQxNl9taW5fY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBRVUFEX0xFR0FDWSAqIGxocywgUVVBRF9MRUdBQ1kgcmhzLCBpbnQgZmxhZyk7CisjZW5kaWYKKy8vIC5ORVFWLiAoc2FtZSBhcyB4b3IpCitjaGFyICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfbmVxdl9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgICAgICAqIGxocywgY2hhciAgICAgIHJocywgaW50IGZsYWcpOworc2hvcnQgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX25lcXZfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAgICAgKiBsaHMsIHNob3J0ICAgICByaHMsIGludCBmbGFnKTsKK2ttcF9pbnQzMiBfX2ttcGNfYXRvbWljX2ZpeGVkNF9uZXF2X2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICogbGhzLCBrbXBfaW50MzIgcmhzLCBpbnQgZmxhZyk7CitrbXBfaW50NjQgX19rbXBjX2F0b21pY19maXhlZDhfbmVxdl9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqIGxocywga21wX2ludDY0IHJocywgaW50IGZsYWcpOworLy8gLkVRVi4gKHNhbWUgYXMgfnhvcikKK2NoYXIgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9lcXZfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAgICAgICogbGhzLCBjaGFyICAgICAgcmhzLCBpbnQgZmxhZyk7CitzaG9ydCAgICAgX19rbXBjX2F0b21pY19maXhlZDJfZXF2X2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICAgICAqIGxocywgc2hvcnQgICAgIHJocywgaW50IGZsYWcpOwora21wX2ludDMyIF9fa21wY19hdG9taWNfZml4ZWQ0X2Vxdl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIGttcF9pbnQzMiByaHMsIGludCBmbGFnKTsKK2ttcF9pbnQ2NCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9lcXZfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICogbGhzLCBrbXBfaW50NjQgcmhzLCBpbnQgZmxhZyk7CisvLyBsb25nIGRvdWJsZSB0eXBlCitsb25nIGRvdWJsZSBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfYWRkX2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgbG9uZyBkb3VibGUgKiBsaHMsIGxvbmcgZG91YmxlIHJocywgaW50IGZsYWcpOworbG9uZyBkb3VibGUgX19rbXBjX2F0b21pY19mbG9hdDEwX3N1Yl9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGxvbmcgZG91YmxlICogbGhzLCBsb25nIGRvdWJsZSByaHMsIGludCBmbGFnKTsKK2xvbmcgZG91YmxlIF9fa21wY19hdG9taWNfZmxvYXQxMF9tdWxfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBsb25nIGRvdWJsZSAqIGxocywgbG9uZyBkb3VibGUgcmhzLCBpbnQgZmxhZyk7Citsb25nIGRvdWJsZSBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfZGl2X2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgbG9uZyBkb3VibGUgKiBsaHMsIGxvbmcgZG91YmxlIHJocywgaW50IGZsYWcpOworI2lmIEtNUF9IQVZFX1FVQUQKKy8vIF9RdWFkIHR5cGUKK1FVQURfTEVHQUNZIF9fa21wY19hdG9taWNfZmxvYXQxNl9hZGRfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBRVUFEX0xFR0FDWSAqIGxocywgUVVBRF9MRUdBQ1kgcmhzLCBpbnQgZmxhZyk7CitRVUFEX0xFR0FDWSBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3ViX2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgUVVBRF9MRUdBQ1kgKiBsaHMsIFFVQURfTEVHQUNZIHJocywgaW50IGZsYWcpOworUVVBRF9MRUdBQ1kgX19rbXBjX2F0b21pY19mbG9hdDE2X211bF9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFFVQURfTEVHQUNZICogbGhzLCBRVUFEX0xFR0FDWSByaHMsIGludCBmbGFnKTsKK1FVQURfTEVHQUNZIF9fa21wY19hdG9taWNfZmxvYXQxNl9kaXZfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBRVUFEX0xFR0FDWSAqIGxocywgUVVBRF9MRUdBQ1kgcmhzLCBpbnQgZmxhZyk7CisjZW5kaWYKKy8vIHJvdXRpbmVzIGZvciBjb21wbGV4IHR5cGVzCisvLyBXb3JrYXJvdW5kIGZvciBjbXBseDQgcm91dGluZXMgLSByZXR1cm4gdm9pZDsgY2FwdHVyZWQgdmFsdWUgaXMgcmV0dXJuZWQgdmlhIHRoZSBhcmd1bWVudAordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4NF9hZGRfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MzIgKiBsaHMsIGttcF9jbXBseDMyIHJocywga21wX2NtcGx4MzIgKiBvdXQsIGludCBmbGFnKTsKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDRfc3ViX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDMyICogbGhzLCBrbXBfY21wbHgzMiByaHMsIGttcF9jbXBseDMyICogb3V0LCBpbnQgZmxhZyk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHg0X211bF9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgzMiAqIGxocywga21wX2NtcGx4MzIgcmhzLCBrbXBfY21wbHgzMiAqIG91dCwgaW50IGZsYWcpOwordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4NF9kaXZfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MzIgKiBsaHMsIGttcF9jbXBseDMyIHJocywga21wX2NtcGx4MzIgKiBvdXQsIGludCBmbGFnKTsKKwora21wX2NtcGx4NjQgX19rbXBjX2F0b21pY19jbXBseDhfYWRkX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDY0ICogbGhzLCBrbXBfY21wbHg2NCByaHMsIGludCBmbGFnKTsKK2ttcF9jbXBseDY0IF9fa21wY19hdG9taWNfY21wbHg4X3N1Yl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg2NCAqIGxocywga21wX2NtcGx4NjQgcmhzLCBpbnQgZmxhZyk7CitrbXBfY21wbHg2NCBfX2ttcGNfYXRvbWljX2NtcGx4OF9tdWxfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4NjQgKiBsaHMsIGttcF9jbXBseDY0IHJocywgaW50IGZsYWcpOwora21wX2NtcGx4NjQgX19rbXBjX2F0b21pY19jbXBseDhfZGl2X2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDY0ICogbGhzLCBrbXBfY21wbHg2NCByaHMsIGludCBmbGFnKTsKK2ttcF9jbXBseDgwIF9fa21wY19hdG9taWNfY21wbHgxMF9hZGRfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg4MCAqIGxocywga21wX2NtcGx4ODAgcmhzLCBpbnQgZmxhZyk7CitrbXBfY21wbHg4MCBfX2ttcGNfYXRvbWljX2NtcGx4MTBfc3ViX2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4ODAgKiBsaHMsIGttcF9jbXBseDgwIHJocywgaW50IGZsYWcpOwora21wX2NtcGx4ODAgX19rbXBjX2F0b21pY19jbXBseDEwX211bF9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDgwICogbGhzLCBrbXBfY21wbHg4MCByaHMsIGludCBmbGFnKTsKK2ttcF9jbXBseDgwIF9fa21wY19hdG9taWNfY21wbHgxMF9kaXZfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg4MCAqIGxocywga21wX2NtcGx4ODAgcmhzLCBpbnQgZmxhZyk7CisjaWYgS01QX0hBVkVfUVVBRAorQ1BMWDEyOF9MRUcgX19rbXBjX2F0b21pY19jbXBseDE2X2FkZF9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIENQTFgxMjhfTEVHICogbGhzLCBDUExYMTI4X0xFRyByaHMsIGludCBmbGFnKTsKK0NQTFgxMjhfTEVHIF9fa21wY19hdG9taWNfY21wbHgxNl9zdWJfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBDUExYMTI4X0xFRyAqIGxocywgQ1BMWDEyOF9MRUcgcmhzLCBpbnQgZmxhZyk7CitDUExYMTI4X0xFRyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfbXVsX2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgQ1BMWDEyOF9MRUcgKiBsaHMsIENQTFgxMjhfTEVHIHJocywgaW50IGZsYWcpOworQ1BMWDEyOF9MRUcgX19rbXBjX2F0b21pY19jbXBseDE2X2Rpdl9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIENQTFgxMjhfTEVHICogbGhzLCBDUExYMTI4X0xFRyByaHMsIGludCBmbGFnKTsKKyNpZiAoIEtNUF9BUkNIX1g4NiApCisgICAgLy8gUm91dGluZXMgd2l0aCAxNi1ieXRlIGFyZ3VtZW50cyBhbGlnbmVkIHRvIDE2LWJ5dGUgYm91bmRhcnkKKyAgICBRdWFkX2ExNl90IF9fa21wY19hdG9taWNfZmxvYXQxNl9hZGRfYTE2X2NwdCggaWRlbnRfdCAqIGlkX3JlZiwgaW50IGd0aWQsIFF1YWRfYTE2X3QgKiBsaHMsIFF1YWRfYTE2X3QgcmhzLCBpbnQgZmxhZyk7CisgICAgUXVhZF9hMTZfdCBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3ViX2ExNl9jcHQoIGlkZW50X3QgKiBpZF9yZWYsIGludCBndGlkLCBRdWFkX2ExNl90ICogbGhzLCBRdWFkX2ExNl90IHJocywgaW50IGZsYWcpOworICAgIFF1YWRfYTE2X3QgX19rbXBjX2F0b21pY19mbG9hdDE2X211bF9hMTZfY3B0KCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwgUXVhZF9hMTZfdCAqIGxocywgUXVhZF9hMTZfdCByaHMsIGludCBmbGFnKTsKKyAgICBRdWFkX2ExNl90IF9fa21wY19hdG9taWNfZmxvYXQxNl9kaXZfYTE2X2NwdCggaWRlbnRfdCAqIGlkX3JlZiwgaW50IGd0aWQsIFF1YWRfYTE2X3QgKiBsaHMsIFF1YWRfYTE2X3QgcmhzLCBpbnQgZmxhZyk7CisgICAgUXVhZF9hMTZfdCBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbWF4X2ExNl9jcHQoIGlkZW50X3QgKiBpZF9yZWYsIGludCBndGlkLCBRdWFkX2ExNl90ICogbGhzLCBRdWFkX2ExNl90IHJocywgaW50IGZsYWcpOworICAgIFF1YWRfYTE2X3QgX19rbXBjX2F0b21pY19mbG9hdDE2X21pbl9hMTZfY3B0KCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwgUXVhZF9hMTZfdCAqIGxocywgUXVhZF9hMTZfdCByaHMsIGludCBmbGFnKTsKKyAgICBrbXBfY21wbHgxMjhfYTE2X3QgX19rbXBjX2F0b21pY19jbXBseDE2X2FkZF9hMTZfY3B0KCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MTI4X2ExNl90ICogbGhzLCBrbXBfY21wbHgxMjhfYTE2X3QgcmhzLCBpbnQgZmxhZyk7CisgICAga21wX2NtcGx4MTI4X2ExNl90IF9fa21wY19hdG9taWNfY21wbHgxNl9zdWJfYTE2X2NwdCggaWRlbnRfdCAqIGlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDEyOF9hMTZfdCAqIGxocywga21wX2NtcGx4MTI4X2ExNl90IHJocywgaW50IGZsYWcpOworICAgIGttcF9jbXBseDEyOF9hMTZfdCBfX2ttcGNfYXRvbWljX2NtcGx4MTZfbXVsX2ExNl9jcHQoIGlkZW50X3QgKiBpZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgxMjhfYTE2X3QgKiBsaHMsIGttcF9jbXBseDEyOF9hMTZfdCByaHMsIGludCBmbGFnKTsKKyAgICBrbXBfY21wbHgxMjhfYTE2X3QgX19rbXBjX2F0b21pY19jbXBseDE2X2Rpdl9hMTZfY3B0KCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MTI4X2ExNl90ICogbGhzLCBrbXBfY21wbHgxMjhfYTE2X3QgcmhzLCBpbnQgZmxhZyk7CisjZW5kaWYKKyNlbmRpZgorCit2b2lkIF9fa21wY19hdG9taWNfc3RhcnQodm9pZCk7Cit2b2lkIF9fa21wY19hdG9taWNfZW5kKHZvaWQpOworCisjaWYgT01QXzQwX0VOQUJMRUQKKworLy8gT3Blbk1QIDQuMDogdiA9IHggPSBleHByIGJpbm9wIHg7IHsgdiA9IHg7IHggPSBleHByIGJpbm9wIHg7IH0geyB4ID0gZXhwciBiaW5vcCB4OyB2ID0geDsgfSAgZm9yIG5vbi1jb21tdXRhdGl2ZSBvcGVyYXRpb25zLgorCitjaGFyCSAgICAgICAJX19rbXBjX2F0b21pY19maXhlZDFfc3ViX2NwdF9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBjaGFyIHJocywgaW50IGZsYWcgKTsKK2NoYXIJCV9fa21wY19hdG9taWNfZml4ZWQxX2Rpdl9jcHRfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMsIGludCBmbGFnICk7Cit1bnNpZ25lZCBjaGFyIAlfX2ttcGNfYXRvbWljX2ZpeGVkMXVfZGl2X2NwdF9yZXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHVuc2lnbmVkIGNoYXIgKiBsaHMsIHVuc2lnbmVkIGNoYXIgcmhzLCBpbnQgZmxhZyApOworY2hhciAJCV9fa21wY19hdG9taWNfZml4ZWQxX3NobF9jcHRfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMgLCBpbnQgZmxhZyk7CitjaGFyCQlfX2ttcGNfYXRvbWljX2ZpeGVkMV9zaHJfY3B0X3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIGNoYXIgcmhzLCBpbnQgZmxhZyApOwordW5zaWduZWQgY2hhciAJX19rbXBjX2F0b21pY19maXhlZDF1X3Nocl9jcHRfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB1bnNpZ25lZCBjaGFyICogbGhzLCB1bnNpZ25lZCBjaGFyIHJocywgaW50IGZsYWcgKTsKK3Nob3J0IAkJX19rbXBjX2F0b21pY19maXhlZDJfc3ViX2NwdF9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgc2hvcnQgcmhzLCBpbnQgZmxhZyApOworc2hvcnQgCQlfX2ttcGNfYXRvbWljX2ZpeGVkMl9kaXZfY3B0X3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBzaG9ydCByaHMsIGludCBmbGFnICk7Cit1bnNpZ25lZCBzaG9ydCAJX19rbXBjX2F0b21pY19maXhlZDJ1X2Rpdl9jcHRfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB1bnNpZ25lZCBzaG9ydCAqIGxocywgdW5zaWduZWQgc2hvcnQgcmhzLCBpbnQgZmxhZyApOworc2hvcnQgCQlfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaGxfY3B0X3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBzaG9ydCByaHMsIGludCBmbGFnICk7CitzaG9ydCAJCV9fa21wY19hdG9taWNfZml4ZWQyX3Nocl9jcHRfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIHNob3J0IHJocywgaW50IGZsYWcgKTsKK3Vuc2lnbmVkIHNob3J0IAlfX2ttcGNfYXRvbWljX2ZpeGVkMnVfc2hyX2NwdF9yZXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHVuc2lnbmVkIHNob3J0ICogbGhzLCB1bnNpZ25lZCBzaG9ydCByaHMsIGludCBmbGFnICk7CitrbXBfaW50MzIgCV9fa21wY19hdG9taWNfZml4ZWQ0X3N1Yl9jcHRfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICAqIGxocywga21wX2ludDMyICByaHMsIGludCBmbGFnICk7CitrbXBfaW50MzIgCV9fa21wY19hdG9taWNfZml4ZWQ0X2Rpdl9jcHRfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICAqIGxocywga21wX2ludDMyICByaHMsIGludCBmbGFnICk7CitrbXBfdWludDMyIAlfX2ttcGNfYXRvbWljX2ZpeGVkNHVfZGl2X2NwdF9yZXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF91aW50MzIgKiBsaHMsIGttcF91aW50MzIgcmhzLCBpbnQgZmxhZyApOwora21wX2ludDMyIAlfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaGxfY3B0X3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAgKiBsaHMsIGttcF9pbnQzMiAgcmhzLCBpbnQgZmxhZyApOwora21wX2ludDMyIAlfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaHJfY3B0X3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAgKiBsaHMsIGttcF9pbnQzMiAgcmhzLCBpbnQgZmxhZyApOwora21wX3VpbnQzMiAJX19rbXBjX2F0b21pY19maXhlZDR1X3Nocl9jcHRfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfdWludDMyICogbGhzLCBrbXBfdWludDMyIHJocywgaW50IGZsYWcgKTsKK2ttcF9pbnQ2NCAJX19rbXBjX2F0b21pY19maXhlZDhfc3ViX2NwdF9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgICogbGhzLCBrbXBfaW50NjQgIHJocywgaW50IGZsYWcgKTsKK2ttcF9pbnQ2NCAJX19rbXBjX2F0b21pY19maXhlZDhfZGl2X2NwdF9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgICogbGhzLCBrbXBfaW50NjQgIHJocywgaW50IGZsYWcgKTsKK2ttcF91aW50NjQgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfZGl2X2NwdF9yZXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF91aW50NjQgKiBsaHMsIGttcF91aW50NjQgcmhzLCBpbnQgZmxhZyApOwora21wX2ludDY0IAlfX2ttcGNfYXRvbWljX2ZpeGVkOF9zaGxfY3B0X3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAgKiBsaHMsIGttcF9pbnQ2NCAgcmhzLCBpbnQgZmxhZyApOwora21wX2ludDY0IAlfX2ttcGNfYXRvbWljX2ZpeGVkOF9zaHJfY3B0X3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAgKiBsaHMsIGttcF9pbnQ2NCAgcmhzLCBpbnQgZmxhZyApOwora21wX3VpbnQ2NCAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4dV9zaHJfY3B0X3JldiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3VpbnQ2NCAqIGxocywga21wX3VpbnQ2NCByaHMsIGludCBmbGFnICk7CitmbG9hdCAJCV9fa21wY19hdG9taWNfZmxvYXQ0X3N1Yl9jcHRfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgZmxvYXQgKiBsaHMsIGZsb2F0IHJocywgaW50IGZsYWcgKTsKK2Zsb2F0IAkJX19rbXBjX2F0b21pY19mbG9hdDRfZGl2X2NwdF9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBmbG9hdCAqIGxocywgZmxvYXQgcmhzLCBpbnQgZmxhZyApOworZG91YmxlIAkJX19rbXBjX2F0b21pY19mbG9hdDhfc3ViX2NwdF9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBkb3VibGUgKiBsaHMsIGRvdWJsZSByaHMsIGludCBmbGFnICk7Citkb3VibGUgCQlfX2ttcGNfYXRvbWljX2Zsb2F0OF9kaXZfY3B0X3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGRvdWJsZSAqIGxocywgZG91YmxlIHJocywgaW50IGZsYWcgKTsKK2xvbmcgZG91YmxlIAlfX2ttcGNfYXRvbWljX2Zsb2F0MTBfc3ViX2NwdF9yZXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGxvbmcgZG91YmxlICogbGhzLCBsb25nIGRvdWJsZSByaHMsIGludCBmbGFnICk7Citsb25nIGRvdWJsZSAJX19rbXBjX2F0b21pY19mbG9hdDEwX2Rpdl9jcHRfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBsb25nIGRvdWJsZSAqIGxocywgbG9uZyBkb3VibGUgcmhzLCBpbnQgZmxhZyApOworI2lmIEtNUF9IQVZFX1FVQUQKK1FVQURfTEVHQUNZCV9fa21wY19hdG9taWNfZmxvYXQxNl9zdWJfY3B0X3JldiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgUVVBRF9MRUdBQ1kgKiBsaHMsIFFVQURfTEVHQUNZIHJocywgaW50IGZsYWcgKTsKK1FVQURfTEVHQUNZCV9fa21wY19hdG9taWNfZmxvYXQxNl9kaXZfY3B0X3JldiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgUVVBRF9MRUdBQ1kgKiBsaHMsIFFVQURfTEVHQUNZIHJocywgaW50IGZsYWcgKTsKKyNlbmRpZgorLy8gV29ya2Fyb3VuZCBmb3IgY21wbHg0IHJvdXRpbmVzIC0gcmV0dXJuIHZvaWQ7IGNhcHR1cmVkIHZhbHVlIGlzIHJldHVybmVkIHZpYSB0aGUgYXJndW1lbnQKK3ZvaWQgICAgIAlfX2ttcGNfYXRvbWljX2NtcGx4NF9zdWJfY3B0X3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDMyICogbGhzLCBrbXBfY21wbHgzMiByaHMsIGttcF9jbXBseDMyICogb3V0LCBpbnQgZmxhZyApOwordm9pZCAJICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9kaXZfY3B0X3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDMyICogbGhzLCBrbXBfY21wbHgzMiByaHMsIGttcF9jbXBseDMyICogb3V0LCBpbnQgZmxhZyApOwora21wX2NtcGx4NjQgCV9fa21wY19hdG9taWNfY21wbHg4X3N1Yl9jcHRfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4NjQgKiBsaHMsIGttcF9jbXBseDY0IHJocywgaW50IGZsYWcgKTsKK2ttcF9jbXBseDY0IAlfX2ttcGNfYXRvbWljX2NtcGx4OF9kaXZfY3B0X3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDY0ICogbGhzLCBrbXBfY21wbHg2NCByaHMsIGludCBmbGFnICk7CitrbXBfY21wbHg4MCAJX19rbXBjX2F0b21pY19jbXBseDEwX3N1Yl9jcHRfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg4MCAqIGxocywga21wX2NtcGx4ODAgcmhzLCBpbnQgZmxhZyApOwora21wX2NtcGx4ODAgCV9fa21wY19hdG9taWNfY21wbHgxMF9kaXZfY3B0X3JldiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4ODAgKiBsaHMsIGttcF9jbXBseDgwIHJocywgaW50IGZsYWcgKTsKKyNpZiBLTVBfSEFWRV9RVUFECitDUExYMTI4X0xFRyAgCV9fa21wY19hdG9taWNfY21wbHgxNl9zdWJfY3B0X3JldiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgQ1BMWDEyOF9MRUcgKiBsaHMsIENQTFgxMjhfTEVHIHJocywgaW50IGZsYWcgKTsKK0NQTFgxMjhfTEVHICAJX19rbXBjX2F0b21pY19jbXBseDE2X2Rpdl9jcHRfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBDUExYMTI4X0xFRyAqIGxocywgQ1BMWDEyOF9MRUcgcmhzLCBpbnQgZmxhZyApOworI2lmICggS01QX0FSQ0hfWDg2ICkKKyAgICBRdWFkX2ExNl90IAkJX19rbXBjX2F0b21pY19mbG9hdDE2X3N1Yl9hMTZfY3B0X3JldiggaWRlbnRfdCAqIGlkX3JlZiwgaW50IGd0aWQsIFF1YWRfYTE2X3QgKiBsaHMsIFF1YWRfYTE2X3QgcmhzLCBpbnQgZmxhZyApOworICAgIFF1YWRfYTE2X3QJCV9fa21wY19hdG9taWNfZmxvYXQxNl9kaXZfYTE2X2NwdF9yZXYoIGlkZW50X3QgKiBpZF9yZWYsIGludCBndGlkLCBRdWFkX2ExNl90ICogbGhzLCBRdWFkX2ExNl90IHJocywgaW50IGZsYWcgKTsKKyAgICBrbXBfY21wbHgxMjhfYTE2X3QgCV9fa21wY19hdG9taWNfY21wbHgxNl9zdWJfYTE2X2NwdF9yZXYoIGlkZW50X3QgKiBpZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgxMjhfYTE2X3QgKiBsaHMsIGttcF9jbXBseDEyOF9hMTZfdCByaHMsIGludCBmbGFnICk7CisgICAga21wX2NtcGx4MTI4X2ExNl90IAlfX2ttcGNfYXRvbWljX2NtcGx4MTZfZGl2X2ExNl9jcHRfcmV2KCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MTI4X2ExNl90ICogbGhzLCBrbXBfY21wbHgxMjhfYTE2X3QgcmhzLCBpbnQgZmxhZyApOworI2VuZGlmCisjZW5kaWYKKworLy8gICBPcGVuTVAgNC4wIENhcHR1cmUtd3JpdGUgKHN3YXApOiB7diA9IHg7IHggPSBleHByO30KK2NoYXIgCQlfX2ttcGNfYXRvbWljX2ZpeGVkMV9zd3AoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICAgICAgICAqIGxocywgY2hhciAgICAgICAgcmhzICk7CitzaG9ydCAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJfc3dwKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgICAgICAgKiBsaHMsIHNob3J0ICAgICAgIHJocyApOwora21wX2ludDMyICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3N3cCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAgICogbGhzLCBrbXBfaW50MzIgICByaHMgKTsKK2ttcF9pbnQ2NCAJX19rbXBjX2F0b21pY19maXhlZDhfc3dwKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICAgKiBsaHMsIGttcF9pbnQ2NCAgIHJocyApOworZmxvYXQgCQlfX2ttcGNfYXRvbWljX2Zsb2F0NF9zd3AoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBmbG9hdCAgICAgICAqIGxocywgZmxvYXQgIHJocyApOworZG91YmxlCQlfX2ttcGNfYXRvbWljX2Zsb2F0OF9zd3AoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBkb3VibGUgICAgICAqIGxocywgZG91YmxlICByaHMgKTsKK2xvbmcgZG91YmxlCV9fa21wY19hdG9taWNfZmxvYXQxMF9zd3AoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGxvbmcgZG91YmxlICogbGhzLCBsb25nIGRvdWJsZSByaHMgKTsKKyNpZiBLTVBfSEFWRV9RVUFECitRVUFEX0xFR0FDWSAgICAJX19rbXBjX2F0b21pY19mbG9hdDE2X3N3cCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgUVVBRF9MRUdBQ1kgKiBsaHMsIFFVQURfTEVHQUNZIHJocyApOworI2VuZGlmCisvLyAhISEgVE9ETzogY2hlY2sgaWYgd2UgbmVlZCBhIHdvcmthcm91bmQgaGVyZQordm9pZCAgICAgICAgCV9fa21wY19hdG9taWNfY21wbHg0X3N3cCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDMyICogbGhzLCBrbXBfY21wbHgzMiByaHMsIGttcF9jbXBseDMyICogb3V0ICk7CisvL2ttcF9jbXBseDMyICAgCV9fa21wY19hdG9taWNfY21wbHg0X3N3cCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDMyICogbGhzLCBrbXBfY21wbHgzMiByaHMgKTsKKwora21wX2NtcGx4NjQgCV9fa21wY19hdG9taWNfY21wbHg4X3N3cCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDY0ICogbGhzLCBrbXBfY21wbHg2NCByaHMgKTsKK2ttcF9jbXBseDgwCV9fa21wY19hdG9taWNfY21wbHgxMF9zd3AoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDgwICogbGhzLCBrbXBfY21wbHg4MCByaHMgKTsKKyNpZiBLTVBfSEFWRV9RVUFECitDUExYMTI4X0xFRyAJX19rbXBjX2F0b21pY19jbXBseDE2X3N3cCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgQ1BMWDEyOF9MRUcgKiBsaHMsIENQTFgxMjhfTEVHIHJocyApOworI2lmICggS01QX0FSQ0hfWDg2ICkKKyAgICBRdWFkX2ExNl90CQlfX2ttcGNfYXRvbWljX2Zsb2F0MTZfYTE2X3N3cCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgUXVhZF9hMTZfdCAqIGxocywgUXVhZF9hMTZfdCByaHMgKTsKKyAgICBrbXBfY21wbHgxMjhfYTE2X3QgCV9fa21wY19hdG9taWNfY21wbHgxNl9hMTZfc3dwKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgxMjhfYTE2X3QgKiBsaHMsIGttcF9jbXBseDEyOF9hMTZfdCByaHMgKTsKKyNlbmRpZgorI2VuZGlmCisKKy8vIEVuZCBvZiBPcGVuTVAgNC4wIGNhcHR1cmUKKworI2VuZGlmIC8vT01QXzQwX0VOQUJMRUQKKworI2VuZGlmIC8vS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgICB9IC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgLyogS01QX0FUT01JQ19IICovCisKKy8vIGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfYmFycmllci5jcHAgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfYmFycmllci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGMxZDBlYwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9iYXJyaWVyLmNwcApAQCAtMCwwICsxLDE2MTAgQEAKKy8qCisgKiBrbXBfYmFycmllci5jcHAKKyAqICRSZXZpc2lvbjogNDM0NzMgJAorICogJERhdGU6IDIwMTQtMDktMjYgMTU6MDI6NTcgLTA1MDAgKEZyaSwgMjYgU2VwIDIwMTQpICQKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgImttcC5oIgorI2luY2x1ZGUgImttcF93YWl0X3JlbGVhc2UuaCIKKyNpbmNsdWRlICJrbXBfc3RhdHMuaCIKKyNpbmNsdWRlICJrbXBfaXR0LmgiCisKKyNpZiBLTVBfTUlDCisjaW5jbHVkZSA8aW1taW50cmluLmg+CisjZGVmaW5lIFVTRV9OR09fU1RPUkVTIDEKKyNlbmRpZiAvLyBLTVBfTUlDCisKKyNpZiBLTVBfTUlDICYmIFVTRV9OR09fU1RPUkVTCisvLyBJQ1YgY29weWluZworI2RlZmluZSBuZ29fbG9hZChzcmMpICAgICAgICAgICAgX19tNTEyZCBWdCA9IF9tbTUxMl9sb2FkX3BkKCh2b2lkICopKHNyYykpCisjZGVmaW5lIG5nb19zdG9yZV9pY3ZzKGRzdCwgc3JjKSBfbW01MTJfc3RvcmVucm5nb19wZCgodm9pZCAqKShkc3QpLCBWdCkKKyNkZWZpbmUgbmdvX3N0b3JlX2dvKGRzdCwgc3JjKSAgIF9tbTUxMl9zdG9yZW5ybmdvX3BkKCh2b2lkICopKGRzdCksIFZ0KQorI2RlZmluZSBuZ29fc3luYygpICAgICAgICAgICAgICAgX19hc21fXyB2b2xhdGlsZSAoImxvY2s7IGFkZGwgJDAsMCglJXJzcCkiIDo6OiAibWVtb3J5IikKKyNlbHNlCisjZGVmaW5lIG5nb19sb2FkKHNyYykgICAgICAgICAgICAoKHZvaWQpMCkKKyNkZWZpbmUgbmdvX3N0b3JlX2ljdnMoZHN0LCBzcmMpIGNvcHlfaWN2cygoZHN0KSwgKHNyYykpCisjZGVmaW5lIG5nb19zdG9yZV9nbyhkc3QsIHNyYykgICBtZW1jcHkoKGRzdCksIChzcmMpLCBDQUNIRV9MSU5FKQorI2RlZmluZSBuZ29fc3luYygpICAgICAgICAgICAgICAgKCh2b2lkKTApCisjZW5kaWYgLyogS01QX01JQyAmJiBVU0VfTkdPX1NUT1JFUyAqLworCit2b2lkIF9fa21wX3ByaW50X3N0cnVjdHVyZSh2b2lkKTsgLy8gRm9yd2FyZCBkZWNsYXJhdGlvbgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEJhcnJpZXIgQWxnb3JpdGhtcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIExpbmVhciBCYXJyaWVyCitzdGF0aWMgdm9pZAorX19rbXBfbGluZWFyX2JhcnJpZXJfZ2F0aGVyKGVudW0gYmFycmllcl90eXBlIGJ0LCBrbXBfaW5mb190ICp0aGlzX3RociwgaW50IGd0aWQsIGludCB0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKnJlZHVjZSkodm9pZCAqLCB2b2lkICopCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcodm9pZCAqIGl0dF9zeW5jX29iaikgKQoreworICAgIEtNUF9USU1FX0JMT0NLKEtNUF9saW5lYXJfZ2F0aGVyKTsKKyAgICByZWdpc3RlciBrbXBfdGVhbV90ICp0ZWFtID0gdGhpc190aHItPnRoLnRoX3RlYW07CisgICAgcmVnaXN0ZXIga21wX2JzdGF0ZV90ICp0aHJfYmFyID0gJiB0aGlzX3Roci0+dGgudGhfYmFyW2J0XS5iYjsKKyAgICByZWdpc3RlciBrbXBfaW5mb190ICoqb3RoZXJfdGhyZWFkcyA9IHRlYW0tPnQudF90aHJlYWRzOworCisgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfbGluZWFyX2JhcnJpZXJfZ2F0aGVyOiBUIyVkKCVkOiVkKSBlbnRlciBmb3IgYmFycmllciB0eXBlICVkXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIGJ0KSk7CisgICAgS01QX0RFQlVHX0FTU0VSVCh0aGlzX3RociA9PSBvdGhlcl90aHJlYWRzW3RoaXNfdGhyLT50aC50aF9pbmZvLmRzLmRzX3RpZF0pOworCisjaWYgVVNFX0lUVF9CVUlMRCAmJiBVU0VfSVRUX05PVElGWQorICAgIC8vIEJhcnJpZXIgaW1iYWxhbmNlIC0gc2F2ZSBhcnJpdmUgdGltZSB0byB0aGUgdGhyZWFkCisgICAgaWYoX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGUgPT0gMiB8fCBfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSA9PSAzKSB7CisgICAgICAgIHRoaXNfdGhyLT50aC50aF9iYXJfYXJyaXZlX3RpbWUgPSB0aGlzX3Roci0+dGgudGhfYmFyX21pbl90aW1lID0gX19pdHRfZ2V0X3RpbWVzdGFtcCgpOworICAgIH0KKyNlbmRpZgorICAgIC8vIFdlIG5vdyBwZXJmb3JtIGEgbGluZWFyIHJlZHVjdGlvbiB0byBzaWduYWwgdGhhdCBhbGwgb2YgdGhlIHRocmVhZHMgaGF2ZSBhcnJpdmVkLgorICAgIGlmICghS01QX01BU1RFUl9USUQodGlkKSkgeworICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9saW5lYXJfYmFycmllcl9nYXRoZXI6IFQjJWQoJWQ6JWQpIHJlbGVhc2luZyBUIyVkKCVkOiVkKSIKKyAgICAgICAgICAgICAgICAgICAgICAiYXJyaXZlZCglcCk6ICV1ID0+ICV1XG4iLCBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwKKyAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGlkKDAsIHRlYW0pLCB0ZWFtLT50LnRfaWQsIDAsICZ0aHJfYmFyLT5iX2Fycml2ZWQsCisgICAgICAgICAgICAgICAgICAgICAgdGhyX2Jhci0+Yl9hcnJpdmVkLCB0aHJfYmFyLT5iX2Fycml2ZWQgKyBLTVBfQkFSUklFUl9TVEFURV9CVU1QKSk7CisgICAgICAgIC8vIE1hcmsgYXJyaXZhbCB0byBtYXN0ZXIgdGhyZWFkCisgICAgICAgIC8qIEFmdGVyIHBlcmZvcm1pbmcgdGhpcyB3cml0ZSwgYSB3b3JrZXIgdGhyZWFkIG1heSBub3QgYXNzdW1lIHRoYXQgdGhlIHRlYW0gaXMgdmFsaWQKKyAgICAgICAgICAgYW55IG1vcmUgLSBpdCBjb3VsZCBiZSBkZWFsbG9jYXRlZCBieSB0aGUgbWFzdGVyIHRocmVhZCBhdCBhbnkgdGltZS4gKi8KKyAgICAgICAga21wX2ZsYWdfNjQgZmxhZygmdGhyX2Jhci0+Yl9hcnJpdmVkLCBvdGhlcl90aHJlYWRzWzBdKTsKKyAgICAgICAgZmxhZy5yZWxlYXNlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVnaXN0ZXIga21wX2JhbGlnbl90ZWFtX3QgKnRlYW1fYmFyID0gJnRlYW0tPnQudF9iYXJbYnRdOworICAgICAgICByZWdpc3RlciBpbnQgbnByb2MgPSB0aGlzX3Roci0+dGgudGhfdGVhbV9ucHJvYzsKKyAgICAgICAgcmVnaXN0ZXIgaW50IGk7CisgICAgICAgIC8vIERvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgc2xlZXAgYml0IGhlcmUgb3IgYXRvbWljIHNpbmNlIHRlYW0gc2V0dGluZworICAgICAgICByZWdpc3RlciBrbXBfdWludCBuZXdfc3RhdGUgPSB0ZWFtX2Jhci0+Yl9hcnJpdmVkICsgS01QX0JBUlJJRVJfU1RBVEVfQlVNUDsKKworICAgICAgICAvLyBDb2xsZWN0IGFsbCB0aGUgd29ya2VyIHRlYW0gbWVtYmVyIHRocmVhZHMuCisgICAgICAgIGZvciAoaT0xOyBpPG5wcm9jOyArK2kpIHsKKyNpZiBLTVBfQ0FDSEVfTUFOQUdFCisgICAgICAgICAgICAvLyBQcmVmZXRjaCBuZXh0IHRocmVhZCdzIGFycml2ZWQgY291bnQKKyAgICAgICAgICAgIGlmIChpKzEgPCBucHJvYykKKyAgICAgICAgICAgICAgICBLTVBfQ0FDSEVfUFJFRkVUQ0goJm90aGVyX3RocmVhZHNbaSsxXS0+dGgudGhfYmFyW2J0XS5iYi5iX2Fycml2ZWQpOworI2VuZGlmIC8qIEtNUF9DQUNIRV9NQU5BR0UgKi8KKyAgICAgICAgICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2xpbmVhcl9iYXJyaWVyX2dhdGhlcjogVCMlZCglZDolZCkgd2FpdCBUIyVkKCVkOiVkKSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJhcnJpdmVkKCVwKSA9PSAldVxuIiwgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RpZChpLCB0ZWFtKSwgdGVhbS0+dC50X2lkLCBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdGhlcl90aHJlYWRzW2ldLT50aC50aF9iYXJbYnRdLmJiLmJfYXJyaXZlZCwgbmV3X3N0YXRlKSk7CisKKyAgICAgICAgICAgIC8vIFdhaXQgZm9yIHdvcmtlciB0aHJlYWQgdG8gYXJyaXZlCisgICAgICAgICAgICBrbXBfZmxhZ182NCBmbGFnKCZvdGhlcl90aHJlYWRzW2ldLT50aC50aF9iYXJbYnRdLmJiLmJfYXJyaXZlZCwgbmV3X3N0YXRlKTsKKyAgICAgICAgICAgIGZsYWcud2FpdCh0aGlzX3RociwgRkFMU0UKKyAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopICk7CisjaWYgVVNFX0lUVF9CVUlMRCAmJiBVU0VfSVRUX05PVElGWQorICAgICAgICAgICAgLy8gQmFycmllciBpbWJhbGFuY2UgLSB3cml0ZSBtaW4gb2YgdGhlIHRocmVhZCB0aW1lIGFuZCB0aGUgb3RoZXIgdGhyZWFkIHRpbWUgdG8gdGhlIHRocmVhZC4KKyAgICAgICAgICAgIGlmIChfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSA9PSAyIHx8IF9fa21wX2Zvcmtqb2luX2ZyYW1lc19tb2RlID09IDMpIHsKKyAgICAgICAgICAgICAgICB0aGlzX3Roci0+dGgudGhfYmFyX21pbl90aW1lID0gS01QX01JTih0aGlzX3Roci0+dGgudGhfYmFyX21pbl90aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyX3RocmVhZHNbaV0tPnRoLnRoX2Jhcl9taW5fdGltZSk7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgIGlmIChyZWR1Y2UpIHsKKyAgICAgICAgICAgICAgICBLQV9UUkFDRSgxMDAsICgiX19rbXBfbGluZWFyX2JhcnJpZXJfZ2F0aGVyOiBUIyVkKCVkOiVkKSArPSBUIyVkKCVkOiVkKVxuIiwgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfaWQsIHRpZCwgX19rbXBfZ3RpZF9mcm9tX3RpZChpLCB0ZWFtKSwgdGVhbS0+dC50X2lkLCBpKSk7CisgICAgICAgICAgICAgICAgKCpyZWR1Y2UpKHRoaXNfdGhyLT50aC50aF9sb2NhbC5yZWR1Y2VfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfbG9jYWwucmVkdWNlX2RhdGEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIERvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgc2xlZXAgYml0IGhlcmUgb3IgYXRvbWljIHNpbmNlIHRlYW0gc2V0dGluZworICAgICAgICB0ZWFtX2Jhci0+Yl9hcnJpdmVkID0gbmV3X3N0YXRlOworICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9saW5lYXJfYmFycmllcl9nYXRoZXI6IFQjJWQoJWQ6JWQpIHNldCB0ZWFtICVkIGFycml2ZWQoJXApID0gJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIHRlYW0tPnQudF9pZCwgJnRlYW1fYmFyLT5iX2Fycml2ZWQsIG5ld19zdGF0ZSkpOworICAgIH0KKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9saW5lYXJfYmFycmllcl9nYXRoZXI6IFQjJWQoJWQ6JWQpIGV4aXQgZm9yIGJhcnJpZXIgdHlwZSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCBidCkpOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfbGluZWFyX2JhcnJpZXJfcmVsZWFzZShlbnVtIGJhcnJpZXJfdHlwZSBidCwga21wX2luZm9fdCAqdGhpc190aHIsIGludCBndGlkLCBpbnQgdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJvcGFnYXRlX2ljdnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcodm9pZCAqaXR0X3N5bmNfb2JqKSApCit7CisgICAgS01QX1RJTUVfQkxPQ0soS01QX2xpbmVhcl9yZWxlYXNlKTsKKyAgICByZWdpc3RlciBrbXBfYnN0YXRlX3QgKnRocl9iYXIgPSAmdGhpc190aHItPnRoLnRoX2JhcltidF0uYmI7CisgICAgcmVnaXN0ZXIga21wX3RlYW1fdCAqdGVhbTsKKworICAgIGlmIChLTVBfTUFTVEVSX1RJRCh0aWQpKSB7CisgICAgICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBpOworICAgICAgICByZWdpc3RlciBrbXBfdWludDMyIG5wcm9jID0gdGhpc190aHItPnRoLnRoX3RlYW1fbnByb2M7CisgICAgICAgIHJlZ2lzdGVyIGttcF9pbmZvX3QgKipvdGhlcl90aHJlYWRzOworCisgICAgICAgIHRlYW0gPSBfX2ttcF90aHJlYWRzW2d0aWRdLT50aC50aF90ZWFtOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHRlYW0gIT0gTlVMTCk7CisgICAgICAgIG90aGVyX3RocmVhZHMgPSB0ZWFtLT50LnRfdGhyZWFkczsKKworICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9saW5lYXJfYmFycmllcl9yZWxlYXNlOiBUIyVkKCVkOiVkKSBtYXN0ZXIgZW50ZXIgZm9yIGJhcnJpZXIgdHlwZSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwgYnQpKTsKKworICAgICAgICBpZiAobnByb2MgPiAxKSB7CisjaWYgS01QX0JBUlJJRVJfSUNWX1BVU0gKKyAgICAgICAgICAgIEtNUF9TVEFSVF9FWFBMSUNJVF9USU1FUihVU0VSX2ljdl9jb3B5KTsKKyAgICAgICAgICAgIGlmIChwcm9wYWdhdGVfaWN2cykgeworICAgICAgICAgICAgICAgIG5nb19sb2FkKCZ0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVswXS50ZF9pY3ZzKTsKKyAgICAgICAgICAgICAgICBmb3IgKGk9MTsgaTxucHJvYzsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX2luaXRfaW1wbGljaXRfdGFzayh0ZWFtLT50LnRfaWRlbnQsIHRlYW0tPnQudF90aHJlYWRzW2ldLCB0ZWFtLCBpLCBGQUxTRSk7CisgICAgICAgICAgICAgICAgICAgIG5nb19zdG9yZV9pY3ZzKCZ0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVtpXS50ZF9pY3ZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbMF0udGRfaWN2cyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG5nb19zeW5jKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBLTVBfU1RPUF9FWFBMSUNJVF9USU1FUihVU0VSX2ljdl9jb3B5KTsKKyNlbmRpZiAvLyBLTVBfQkFSUklFUl9JQ1ZfUFVTSAorCisgICAgICAgICAgICAvLyBOb3csIHJlbGVhc2UgYWxsIG9mIHRoZSB3b3JrZXIgdGhyZWFkcworICAgICAgICAgICAgZm9yIChpPTE7IGk8bnByb2M7ICsraSkgeworI2lmIEtNUF9DQUNIRV9NQU5BR0UKKyAgICAgICAgICAgICAgICAvLyBQcmVmZXRjaCBuZXh0IHRocmVhZCdzIGdvIGZsYWcKKyAgICAgICAgICAgICAgICBpZiAoaSsxIDwgbnByb2MpCisgICAgICAgICAgICAgICAgICAgIEtNUF9DQUNIRV9QUkVGRVRDSCgmb3RoZXJfdGhyZWFkc1tpKzFdLT50aC50aF9iYXJbYnRdLmJiLmJfZ28pOworI2VuZGlmIC8qIEtNUF9DQUNIRV9NQU5BR0UgKi8KKyAgICAgICAgICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9saW5lYXJfYmFycmllcl9yZWxlYXNlOiBUIyVkKCVkOiVkKSByZWxlYXNpbmcgVCMlZCglZDolZCkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdvKCVwKTogJXUgPT4gJXVcbiIsIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfaW5mby5kcy5kc19ndGlkLCB0ZWFtLT50LnRfaWQsIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfYmFyW2J0XS5iYi5iX2dvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfYmFyW2J0XS5iYi5iX2dvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfYmFyW2J0XS5iYi5iX2dvICsgS01QX0JBUlJJRVJfU1RBVEVfQlVNUCkpOworICAgICAgICAgICAgICAgIGttcF9mbGFnXzY0IGZsYWcoJm90aGVyX3RocmVhZHNbaV0tPnRoLnRoX2JhcltidF0uYmIuYl9nbywgb3RoZXJfdGhyZWFkc1tpXSk7CisgICAgICAgICAgICAgICAgZmxhZy5yZWxlYXNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeyAvLyBXYWl0IGZvciB0aGUgTUFTVEVSIHRocmVhZCB0byByZWxlYXNlIHVzCisgICAgICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2xpbmVhcl9iYXJyaWVyX3JlbGVhc2U6IFQjJWQgd2FpdCBnbyglcCkgPT0gJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgJnRocl9iYXItPmJfZ28sIEtNUF9CQVJSSUVSX1NUQVRFX0JVTVApKTsKKyAgICAgICAga21wX2ZsYWdfNjQgZmxhZygmdGhyX2Jhci0+Yl9nbywgS01QX0JBUlJJRVJfU1RBVEVfQlVNUCk7CisgICAgICAgIGZsYWcud2FpdCh0aGlzX3RociwgVFJVRQorICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSApOworI2lmIFVTRV9JVFRfQlVJTEQgJiYgVVNFX0lUVF9OT1RJRlkKKyAgICAgICAgaWYgKChfX2l0dF9zeW5jX2NyZWF0ZV9wdHIgJiYgaXR0X3N5bmNfb2JqID09IE5VTEwpIHx8IEtNUF9JVFRfREVCVUcpIHsKKyAgICAgICAgICAgIC8vIEluIGEgZm9yayBiYXJyaWVyOyBjYW5ub3QgZ2V0IHRoZSBvYmplY3QgcmVsaWFibHkgKG9yIElUVE5PVElGWSBpcyBkaXNhYmxlZCkKKyAgICAgICAgICAgIGl0dF9zeW5jX29iaiA9IF9fa21wX2l0dF9iYXJyaWVyX29iamVjdChndGlkLCBic19mb3Jram9pbl9iYXJyaWVyLCAwLCAtMSk7CisgICAgICAgICAgICAvLyBDYW5jZWwgd2FpdCBvbiBwcmV2aW91cyBwYXJhbGxlbCByZWdpb24uLi4KKyAgICAgICAgICAgIF9fa21wX2l0dF90YXNrX3N0YXJ0aW5nKGl0dF9zeW5jX29iaik7CisKKyAgICAgICAgICAgIGlmIChidCA9PSBic19mb3Jram9pbl9iYXJyaWVyICYmIFRDUl80KF9fa21wX2dsb2JhbC5nLmdfZG9uZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICBpdHRfc3luY19vYmogPSBfX2ttcF9pdHRfYmFycmllcl9vYmplY3QoZ3RpZCwgYnNfZm9ya2pvaW5fYmFycmllcik7CisgICAgICAgICAgICBpZiAoaXR0X3N5bmNfb2JqICE9IE5VTEwpCisgICAgICAgICAgICAgICAgLy8gQ2FsbCBwcmVwYXJlIGFzIGVhcmx5IGFzIHBvc3NpYmxlIGZvciAibmV3IiBiYXJyaWVyCisgICAgICAgICAgICAgICAgX19rbXBfaXR0X3Rhc2tfZmluaXNoZWQoaXR0X3N5bmNfb2JqKTsKKyAgICAgICAgfSBlbHNlCisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAmJiBVU0VfSVRUX05PVElGWSAqLworICAgICAgICAvLyBFYXJseSBleGl0IGZvciByZWFwaW5nIHRocmVhZHMgcmVsZWFzaW5nIGZvcmtqb2luIGJhcnJpZXIKKyAgICAgICAgaWYgKCBidCA9PSBic19mb3Jram9pbl9iYXJyaWVyICYmIFRDUl80KF9fa21wX2dsb2JhbC5nLmdfZG9uZSkgKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAvLyBUaGUgd29ya2VyIHRocmVhZCBtYXkgbm93IGFzc3VtZSB0aGF0IHRoZSB0ZWFtIGlzIHZhbGlkLgorI2lmZGVmIEtNUF9ERUJVRworICAgICAgICB0aWQgPSBfX2ttcF90aWRfZnJvbV9ndGlkKGd0aWQpOworICAgICAgICB0ZWFtID0gX19rbXBfdGhyZWFkc1tndGlkXS0+dGgudGhfdGVhbTsKKyNlbmRpZgorICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHRlYW0gIT0gTlVMTCk7CisgICAgICAgIFRDV180KHRocl9iYXItPmJfZ28sIEtNUF9JTklUX0JBUlJJRVJfU1RBVEUpOworICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9saW5lYXJfYmFycmllcl9yZWxlYXNlOiBUIyVkKCVkOiVkKSBzZXQgZ28oJXApID0gJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsICZ0aHJfYmFyLT5iX2dvLCBLTVBfSU5JVF9CQVJSSUVSX1NUQVRFKSk7CisgICAgICAgIEtNUF9NQigpOyAgLy8gRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLgorICAgIH0KKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9saW5lYXJfYmFycmllcl9yZWxlYXNlOiBUIyVkKCVkOiVkKSBleGl0IGZvciBiYXJyaWVyIHR5cGUgJWRcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwgYnQpKTsKK30KKworLy8gVHJlZSBiYXJyaWVyCitzdGF0aWMgdm9pZAorX19rbXBfdHJlZV9iYXJyaWVyX2dhdGhlcihlbnVtIGJhcnJpZXJfdHlwZSBidCwga21wX2luZm9fdCAqdGhpc190aHIsIGludCBndGlkLCBpbnQgdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICgqcmVkdWNlKSh2b2lkICosIHZvaWQgKikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcodm9pZCAqaXR0X3N5bmNfb2JqKSApCit7CisgICAgS01QX1RJTUVfQkxPQ0soS01QX3RyZWVfZ2F0aGVyKTsKKyAgICByZWdpc3RlciBrbXBfdGVhbV90ICp0ZWFtID0gdGhpc190aHItPnRoLnRoX3RlYW07CisgICAgcmVnaXN0ZXIga21wX2JzdGF0ZV90ICp0aHJfYmFyID0gJnRoaXNfdGhyLT50aC50aF9iYXJbYnRdLmJiOworICAgIHJlZ2lzdGVyIGttcF9pbmZvX3QgKipvdGhlcl90aHJlYWRzID0gdGVhbS0+dC50X3RocmVhZHM7CisgICAgcmVnaXN0ZXIga21wX3VpbnQzMiBucHJvYyA9IHRoaXNfdGhyLT50aC50aF90ZWFtX25wcm9jOworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgYnJhbmNoX2JpdHMgPSBfX2ttcF9iYXJyaWVyX2dhdGhlcl9icmFuY2hfYml0c1tidF07CisgICAgcmVnaXN0ZXIga21wX3VpbnQzMiBicmFuY2hfZmFjdG9yID0gMSA8PCBicmFuY2hfYml0czsKKyAgICByZWdpc3RlciBrbXBfdWludDMyIGNoaWxkOworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgY2hpbGRfdGlkOworICAgIHJlZ2lzdGVyIGttcF91aW50IG5ld19zdGF0ZTsKKworICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX3RyZWVfYmFycmllcl9nYXRoZXI6IFQjJWQoJWQ6JWQpIGVudGVyIGZvciBiYXJyaWVyIHR5cGUgJWRcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwgYnQpKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKHRoaXNfdGhyID09IG90aGVyX3RocmVhZHNbdGhpc190aHItPnRoLnRoX2luZm8uZHMuZHNfdGlkXSk7CisKKyNpZiBVU0VfSVRUX0JVSUxEICYmIFVTRV9JVFRfTk9USUZZCisgICAgLy8gQmFycmllciBpbWJhbGFuY2UgLSBzYXZlIGFycml2ZSB0aW1lIHRvIHRoZSB0aHJlYWQKKyAgICBpZihfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSA9PSAyIHx8IF9fa21wX2Zvcmtqb2luX2ZyYW1lc19tb2RlID09IDMpIHsKKyAgICAgICAgdGhpc190aHItPnRoLnRoX2Jhcl9hcnJpdmVfdGltZSA9IHRoaXNfdGhyLT50aC50aF9iYXJfbWluX3RpbWUgPSBfX2l0dF9nZXRfdGltZXN0YW1wKCk7CisgICAgfQorI2VuZGlmCisgICAgLy8gUGVyZm9ybSB0cmVlIGdhdGhlciB0byB3YWl0IHVudGlsIGFsbCB0aHJlYWRzIGhhdmUgYXJyaXZlZDsgcmVkdWNlIGFueSByZXF1aXJlZCBkYXRhIGFzIHdlIGdvCisgICAgY2hpbGRfdGlkID0gKHRpZCA8PCBicmFuY2hfYml0cykgKyAxOworICAgIGlmIChjaGlsZF90aWQgPCBucHJvYykgeworICAgICAgICAvLyBQYXJlbnQgdGhyZWFkcyB3YWl0IGZvciBhbGwgdGhlaXIgY2hpbGRyZW4gdG8gYXJyaXZlCisgICAgICAgIG5ld19zdGF0ZSA9IHRlYW0tPnQudF9iYXJbYnRdLmJfYXJyaXZlZCArIEtNUF9CQVJSSUVSX1NUQVRFX0JVTVA7CisgICAgICAgIGNoaWxkID0gMTsKKyAgICAgICAgZG8geworICAgICAgICAgICAgcmVnaXN0ZXIga21wX2luZm9fdCAqY2hpbGRfdGhyID0gb3RoZXJfdGhyZWFkc1tjaGlsZF90aWRdOworICAgICAgICAgICAgcmVnaXN0ZXIga21wX2JzdGF0ZV90ICpjaGlsZF9iYXIgPSAmY2hpbGRfdGhyLT50aC50aF9iYXJbYnRdLmJiOworI2lmIEtNUF9DQUNIRV9NQU5BR0UKKyAgICAgICAgICAgIC8vIFByZWZldGNoIG5leHQgdGhyZWFkJ3MgYXJyaXZlZCBjb3VudAorICAgICAgICAgICAgaWYgKGNoaWxkKzEgPD0gYnJhbmNoX2ZhY3RvciAmJiBjaGlsZF90aWQrMSA8IG5wcm9jKQorICAgICAgICAgICAgICAgIEtNUF9DQUNIRV9QUkVGRVRDSCgmb3RoZXJfdGhyZWFkc1tjaGlsZF90aWQrMV0tPnRoLnRoX2JhcltidF0uYmIuYl9hcnJpdmVkKTsKKyNlbmRpZiAvKiBLTVBfQ0FDSEVfTUFOQUdFICovCisgICAgICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF90cmVlX2JhcnJpZXJfZ2F0aGVyOiBUIyVkKCVkOiVkKSB3YWl0IFQjJWQoJWQ6JXUpICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImFycml2ZWQoJXApID09ICV1XG4iLCBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGlkKGNoaWxkX3RpZCwgdGVhbSksIHRlYW0tPnQudF9pZCwgY2hpbGRfdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjaGlsZF9iYXItPmJfYXJyaXZlZCwgbmV3X3N0YXRlKSk7CisgICAgICAgICAgICAvLyBXYWl0IGZvciBjaGlsZCB0byBhcnJpdmUKKyAgICAgICAgICAgIGttcF9mbGFnXzY0IGZsYWcoJmNoaWxkX2Jhci0+Yl9hcnJpdmVkLCBuZXdfc3RhdGUpOworICAgICAgICAgICAgZmxhZy53YWl0KHRoaXNfdGhyLCBGQUxTRQorICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaikgKTsKKyNpZiBVU0VfSVRUX0JVSUxEICYmIFVTRV9JVFRfTk9USUZZCisgICAgICAgICAgICAvLyBCYXJyaWVyIGltYmFsYW5jZSAtIHdyaXRlIG1pbiBvZiB0aGUgdGhyZWFkIHRpbWUgYW5kIGEgY2hpbGQgdGltZSB0byB0aGUgdGhyZWFkLgorICAgICAgICAgICAgaWYgKF9fa21wX2Zvcmtqb2luX2ZyYW1lc19tb2RlID09IDIgfHwgX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGUgPT0gMykgeworICAgICAgICAgICAgICAgIHRoaXNfdGhyLT50aC50aF9iYXJfbWluX3RpbWUgPSBLTVBfTUlOKHRoaXNfdGhyLT50aC50aF9iYXJfbWluX3RpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRfdGhyLT50aC50aF9iYXJfbWluX3RpbWUpOworICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICBpZiAocmVkdWNlKSB7CisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoMTAwLCAoIl9fa21wX3RyZWVfYmFycmllcl9nYXRoZXI6IFQjJWQoJWQ6JWQpICs9IFQjJWQoJWQ6JXUpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCBfX2ttcF9ndGlkX2Zyb21fdGlkKGNoaWxkX3RpZCwgdGVhbSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X2lkLCBjaGlsZF90aWQpKTsKKyAgICAgICAgICAgICAgICAoKnJlZHVjZSkodGhpc190aHItPnRoLnRoX2xvY2FsLnJlZHVjZV9kYXRhLCBjaGlsZF90aHItPnRoLnRoX2xvY2FsLnJlZHVjZV9kYXRhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNoaWxkKys7CisgICAgICAgICAgICBjaGlsZF90aWQrKzsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoY2hpbGQgPD0gYnJhbmNoX2ZhY3RvciAmJiBjaGlsZF90aWQgPCBucHJvYyk7CisgICAgfQorCisgICAgaWYgKCFLTVBfTUFTVEVSX1RJRCh0aWQpKSB7IC8vIFdvcmtlciB0aHJlYWRzCisgICAgICAgIHJlZ2lzdGVyIGttcF9pbnQzMiBwYXJlbnRfdGlkID0gKHRpZCAtIDEpID4+IGJyYW5jaF9iaXRzOworCisgICAgICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX3RyZWVfYmFycmllcl9nYXRoZXI6IFQjJWQoJWQ6JWQpIHJlbGVhc2luZyBUIyVkKCVkOiVkKSAiCisgICAgICAgICAgICAgICAgICAgICAgImFycml2ZWQoJXApOiAldSA9PiAldVxuIiwgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsCisgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RpZChwYXJlbnRfdGlkLCB0ZWFtKSwgdGVhbS0+dC50X2lkLCBwYXJlbnRfdGlkLAorICAgICAgICAgICAgICAgICAgICAgICZ0aHJfYmFyLT5iX2Fycml2ZWQsIHRocl9iYXItPmJfYXJyaXZlZCwKKyAgICAgICAgICAgICAgICAgICAgICB0aHJfYmFyLT5iX2Fycml2ZWQgKyBLTVBfQkFSUklFUl9TVEFURV9CVU1QKSk7CisKKyAgICAgICAgLy8gTWFyayBhcnJpdmFsIHRvIHBhcmVudCB0aHJlYWQKKyAgICAgICAgLyogQWZ0ZXIgcGVyZm9ybWluZyB0aGlzIHdyaXRlLCBhIHdvcmtlciB0aHJlYWQgbWF5IG5vdCBhc3N1bWUgdGhhdCB0aGUgdGVhbSBpcyB2YWxpZAorICAgICAgICAgICBhbnkgbW9yZSAtIGl0IGNvdWxkIGJlIGRlYWxsb2NhdGVkIGJ5IHRoZSBtYXN0ZXIgdGhyZWFkIGF0IGFueSB0aW1lLiAgKi8KKyAgICAgICAga21wX2ZsYWdfNjQgZmxhZygmdGhyX2Jhci0+Yl9hcnJpdmVkLCBvdGhlcl90aHJlYWRzW3BhcmVudF90aWRdKTsKKyAgICAgICAgZmxhZy5yZWxlYXNlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gTmVlZCB0byB1cGRhdGUgdGhlIHRlYW0gYXJyaXZlZCBwb2ludGVyIGlmIHdlIGFyZSB0aGUgbWFzdGVyIHRocmVhZAorICAgICAgICBpZiAobnByb2MgPiAxKSAvLyBOZXcgdmFsdWUgd2FzIGFscmVhZHkgY29tcHV0ZWQgYWJvdmUKKyAgICAgICAgICAgIHRlYW0tPnQudF9iYXJbYnRdLmJfYXJyaXZlZCA9IG5ld19zdGF0ZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdGVhbS0+dC50X2JhcltidF0uYl9hcnJpdmVkICs9IEtNUF9CQVJSSUVSX1NUQVRFX0JVTVA7CisgICAgICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX3RyZWVfYmFycmllcl9nYXRoZXI6IFQjJWQoJWQ6JWQpIHNldCB0ZWFtICVkIGFycml2ZWQoJXApID0gJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIHRlYW0tPnQudF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAmdGVhbS0+dC50X2JhcltidF0uYl9hcnJpdmVkLCB0ZWFtLT50LnRfYmFyW2J0XS5iX2Fycml2ZWQpKTsKKyAgICB9CisgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfdHJlZV9iYXJyaWVyX2dhdGhlcjogVCMlZCglZDolZCkgZXhpdCBmb3IgYmFycmllciB0eXBlICVkXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIGJ0KSk7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF90cmVlX2JhcnJpZXJfcmVsZWFzZShlbnVtIGJhcnJpZXJfdHlwZSBidCwga21wX2luZm9fdCAqdGhpc190aHIsIGludCBndGlkLCBpbnQgdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHByb3BhZ2F0ZV9pY3ZzCisgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyh2b2lkICppdHRfc3luY19vYmopICkKK3sKKyAgICBLTVBfVElNRV9CTE9DSyhLTVBfdHJlZV9yZWxlYXNlKTsKKyAgICByZWdpc3RlciBrbXBfdGVhbV90ICp0ZWFtOworICAgIHJlZ2lzdGVyIGttcF9ic3RhdGVfdCAqdGhyX2JhciA9ICZ0aGlzX3Roci0+dGgudGhfYmFyW2J0XS5iYjsKKyAgICByZWdpc3RlciBrbXBfdWludDMyIG5wcm9jOworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgYnJhbmNoX2JpdHMgPSBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfYnJhbmNoX2JpdHNbYnRdOworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgYnJhbmNoX2ZhY3RvciA9IDEgPDwgYnJhbmNoX2JpdHM7CisgICAgcmVnaXN0ZXIga21wX3VpbnQzMiBjaGlsZDsKKyAgICByZWdpc3RlciBrbXBfdWludDMyIGNoaWxkX3RpZDsKKworICAgIC8vIFBlcmZvcm0gYSB0cmVlIHJlbGVhc2UgZm9yIGFsbCBvZiB0aGUgdGhyZWFkcyB0aGF0IGhhdmUgYmVlbiBnYXRoZXJlZAorICAgIGlmICghS01QX01BU1RFUl9USUQodGlkKSkgeyAvLyBIYW5kbGUgZm9yayBiYXJyaWVyIHdvcmtlcnMgd2hvIGFyZW4ndCBwYXJ0IG9mIGEgdGVhbSB5ZXQKKyAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfdHJlZV9iYXJyaWVyX3JlbGVhc2U6IFQjJWQgd2FpdCBnbyglcCkgPT0gJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgJnRocl9iYXItPmJfZ28sIEtNUF9CQVJSSUVSX1NUQVRFX0JVTVApKTsKKyAgICAgICAgLy8gV2FpdCBmb3IgcGFyZW50IHRocmVhZCB0byByZWxlYXNlIHVzCisgICAgICAgIGttcF9mbGFnXzY0IGZsYWcoJnRocl9iYXItPmJfZ28sIEtNUF9CQVJSSUVSX1NUQVRFX0JVTVApOworICAgICAgICBmbGFnLndhaXQodGhpc190aHIsIFRSVUUKKyAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaikgKTsKKyNpZiBVU0VfSVRUX0JVSUxEICYmIFVTRV9JVFRfTk9USUZZCisgICAgICAgIGlmICgoX19pdHRfc3luY19jcmVhdGVfcHRyICYmIGl0dF9zeW5jX29iaiA9PSBOVUxMKSB8fCBLTVBfSVRUX0RFQlVHKSB7CisgICAgICAgICAgICAvLyBJbiBmb3JrIGJhcnJpZXIgd2hlcmUgd2UgY291bGQgbm90IGdldCB0aGUgb2JqZWN0IHJlbGlhYmx5IChvciBJVFROT1RJRlkgaXMgZGlzYWJsZWQpCisgICAgICAgICAgICBpdHRfc3luY19vYmogPSBfX2ttcF9pdHRfYmFycmllcl9vYmplY3QoZ3RpZCwgYnNfZm9ya2pvaW5fYmFycmllciwgMCwgLTEpOworICAgICAgICAgICAgLy8gQ2FuY2VsIHdhaXQgb24gcHJldmlvdXMgcGFyYWxsZWwgcmVnaW9uLi4uCisgICAgICAgICAgICBfX2ttcF9pdHRfdGFza19zdGFydGluZyhpdHRfc3luY19vYmopOworCisgICAgICAgICAgICBpZiAoYnQgPT0gYnNfZm9ya2pvaW5fYmFycmllciAmJiBUQ1JfNChfX2ttcF9nbG9iYWwuZy5nX2RvbmUpKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgaXR0X3N5bmNfb2JqID0gX19rbXBfaXR0X2JhcnJpZXJfb2JqZWN0KGd0aWQsIGJzX2Zvcmtqb2luX2JhcnJpZXIpOworICAgICAgICAgICAgaWYgKGl0dF9zeW5jX29iaiAhPSBOVUxMKQorICAgICAgICAgICAgICAgIC8vIENhbGwgcHJlcGFyZSBhcyBlYXJseSBhcyBwb3NzaWJsZSBmb3IgIm5ldyIgYmFycmllcgorICAgICAgICAgICAgICAgIF9fa21wX2l0dF90YXNrX2ZpbmlzaGVkKGl0dF9zeW5jX29iaik7CisgICAgICAgIH0gZWxzZQorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgJiYgVVNFX0lUVF9OT1RJRlkgKi8KKyAgICAgICAgLy8gRWFybHkgZXhpdCBmb3IgcmVhcGluZyB0aHJlYWRzIHJlbGVhc2luZyBmb3Jram9pbiBiYXJyaWVyCisgICAgICAgIGlmIChidCA9PSBic19mb3Jram9pbl9iYXJyaWVyICYmIFRDUl80KF9fa21wX2dsb2JhbC5nLmdfZG9uZSkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgLy8gVGhlIHdvcmtlciB0aHJlYWQgbWF5IG5vdyBhc3N1bWUgdGhhdCB0aGUgdGVhbSBpcyB2YWxpZC4KKyAgICAgICAgdGVhbSA9IF9fa21wX3RocmVhZHNbZ3RpZF0tPnRoLnRoX3RlYW07CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQodGVhbSAhPSBOVUxMKTsKKyAgICAgICAgdGlkID0gX19rbXBfdGlkX2Zyb21fZ3RpZChndGlkKTsKKworICAgICAgICBUQ1dfNCh0aHJfYmFyLT5iX2dvLCBLTVBfSU5JVF9CQVJSSUVSX1NUQVRFKTsKKyAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfdHJlZV9iYXJyaWVyX3JlbGVhc2U6IFQjJWQoJWQ6JWQpIHNldCBnbyglcCkgPSAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwgJnRocl9iYXItPmJfZ28sIEtNUF9JTklUX0JBUlJJRVJfU1RBVEUpKTsKKyAgICAgICAgS01QX01CKCk7ICAvLyBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuCisgICAgfSBlbHNlIHsKKyAgICAgICAgdGVhbSA9IF9fa21wX3RocmVhZHNbZ3RpZF0tPnRoLnRoX3RlYW07CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQodGVhbSAhPSBOVUxMKTsKKyAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfdHJlZV9iYXJyaWVyX3JlbGVhc2U6IFQjJWQoJWQ6JWQpIG1hc3RlciBlbnRlciBmb3IgYmFycmllciB0eXBlICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCBidCkpOworICAgIH0KKyAgICBucHJvYyA9IHRoaXNfdGhyLT50aC50aF90ZWFtX25wcm9jOworICAgIGNoaWxkX3RpZCA9ICh0aWQgPDwgYnJhbmNoX2JpdHMpICsgMTsKKworICAgIGlmIChjaGlsZF90aWQgPCBucHJvYykgeworICAgICAgICByZWdpc3RlciBrbXBfaW5mb190ICoqb3RoZXJfdGhyZWFkcyA9IHRlYW0tPnQudF90aHJlYWRzOworICAgICAgICBjaGlsZCA9IDE7CisgICAgICAgIC8vIFBhcmVudCB0aHJlYWRzIHJlbGVhc2UgYWxsIHRoZWlyIGNoaWxkcmVuCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHJlZ2lzdGVyIGttcF9pbmZvX3QgKmNoaWxkX3RociA9IG90aGVyX3RocmVhZHNbY2hpbGRfdGlkXTsKKyAgICAgICAgICAgIHJlZ2lzdGVyIGttcF9ic3RhdGVfdCAqY2hpbGRfYmFyID0gJmNoaWxkX3Roci0+dGgudGhfYmFyW2J0XS5iYjsKKyNpZiBLTVBfQ0FDSEVfTUFOQUdFCisgICAgICAgICAgICAvLyBQcmVmZXRjaCBuZXh0IHRocmVhZCdzIGdvIGNvdW50CisgICAgICAgICAgICBpZiAoY2hpbGQrMSA8PSBicmFuY2hfZmFjdG9yICYmIGNoaWxkX3RpZCsxIDwgbnByb2MpCisgICAgICAgICAgICAgICAgS01QX0NBQ0hFX1BSRUZFVENIKCZvdGhlcl90aHJlYWRzW2NoaWxkX3RpZCsxXS0+dGgudGhfYmFyW2J0XS5iYi5iX2dvKTsKKyNlbmRpZiAvKiBLTVBfQ0FDSEVfTUFOQUdFICovCisKKyNpZiBLTVBfQkFSUklFUl9JQ1ZfUFVTSAorICAgICAgICAgICAgS01QX1NUQVJUX0VYUExJQ0lUX1RJTUVSKFVTRVJfaWN2X2NvcHkpOworICAgICAgICAgICAgaWYgKHByb3BhZ2F0ZV9pY3ZzKSB7CisgICAgICAgICAgICAgICAgX19rbXBfaW5pdF9pbXBsaWNpdF90YXNrKHRlYW0tPnQudF9pZGVudCwgdGVhbS0+dC50X3RocmVhZHNbY2hpbGRfdGlkXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhbSwgY2hpbGRfdGlkLCBGQUxTRSk7CisgICAgICAgICAgICAgICAgY29weV9pY3ZzKCZ0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVtjaGlsZF90aWRdLnRkX2ljdnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVswXS50ZF9pY3ZzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEtNUF9TVE9QX0VYUExJQ0lUX1RJTUVSKFVTRVJfaWN2X2NvcHkpOworI2VuZGlmIC8vIEtNUF9CQVJSSUVSX0lDVl9QVVNICisgICAgICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF90cmVlX2JhcnJpZXJfcmVsZWFzZTogVCMlZCglZDolZCkgcmVsZWFzaW5nIFQjJWQoJWQ6JXUpIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiZ28oJXApOiAldSA9PiAldVxuIiwgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aWQoY2hpbGRfdGlkLCB0ZWFtKSwgdGVhbS0+dC50X2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZF90aWQsICZjaGlsZF9iYXItPmJfZ28sIGNoaWxkX2Jhci0+Yl9nbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRfYmFyLT5iX2dvICsgS01QX0JBUlJJRVJfU1RBVEVfQlVNUCkpOworICAgICAgICAgICAgLy8gUmVsZWFzZSBjaGlsZCBmcm9tIGJhcnJpZXIKKyAgICAgICAgICAgIGttcF9mbGFnXzY0IGZsYWcoJmNoaWxkX2Jhci0+Yl9nbywgY2hpbGRfdGhyKTsKKyAgICAgICAgICAgIGZsYWcucmVsZWFzZSgpOworICAgICAgICAgICAgY2hpbGQrKzsKKyAgICAgICAgICAgIGNoaWxkX3RpZCsrOworICAgICAgICB9CisgICAgICAgIHdoaWxlIChjaGlsZCA8PSBicmFuY2hfZmFjdG9yICYmIGNoaWxkX3RpZCA8IG5wcm9jKTsKKyAgICB9CisgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfdHJlZV9iYXJyaWVyX3JlbGVhc2U6IFQjJWQoJWQ6JWQpIGV4aXQgZm9yIGJhcnJpZXIgdHlwZSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCBidCkpOworfQorCisKKy8vIEh5cGVyIEJhcnJpZXIKK3N0YXRpYyB2b2lkCitfX2ttcF9oeXBlcl9iYXJyaWVyX2dhdGhlcihlbnVtIGJhcnJpZXJfdHlwZSBidCwga21wX2luZm9fdCAqdGhpc190aHIsIGludCBndGlkLCBpbnQgdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKnJlZHVjZSkodm9pZCAqLCB2b2lkICopCisgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyh2b2lkICppdHRfc3luY19vYmopICkKK3sKKyAgICBLTVBfVElNRV9CTE9DSyhLTVBfaHlwZXJfZ2F0aGVyKTsKKyAgICByZWdpc3RlciBrbXBfdGVhbV90ICp0ZWFtID0gdGhpc190aHItPnRoLnRoX3RlYW07CisgICAgcmVnaXN0ZXIga21wX2JzdGF0ZV90ICp0aHJfYmFyID0gJnRoaXNfdGhyLT50aC50aF9iYXJbYnRdLmJiOworICAgIHJlZ2lzdGVyIGttcF9pbmZvX3QgKipvdGhlcl90aHJlYWRzID0gdGVhbS0+dC50X3RocmVhZHM7CisgICAgcmVnaXN0ZXIga21wX3VpbnQgbmV3X3N0YXRlID0gS01QX0JBUlJJRVJfVU5VU0VEX1NUQVRFOworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgbnVtX3RocmVhZHMgPSB0aGlzX3Roci0+dGgudGhfdGVhbV9ucHJvYzsKKyAgICByZWdpc3RlciBrbXBfdWludDMyIGJyYW5jaF9iaXRzID0gX19rbXBfYmFycmllcl9nYXRoZXJfYnJhbmNoX2JpdHNbYnRdOworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgYnJhbmNoX2ZhY3RvciA9IDEgPDwgYnJhbmNoX2JpdHM7CisgICAgcmVnaXN0ZXIga21wX3VpbnQzMiBvZmZzZXQ7CisgICAgcmVnaXN0ZXIga21wX3VpbnQzMiBsZXZlbDsKKworICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2h5cGVyX2JhcnJpZXJfZ2F0aGVyOiBUIyVkKCVkOiVkKSBlbnRlciBmb3IgYmFycmllciB0eXBlICVkXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIGJ0KSk7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKHRoaXNfdGhyID09IG90aGVyX3RocmVhZHNbdGhpc190aHItPnRoLnRoX2luZm8uZHMuZHNfdGlkXSk7CisKKyNpZiBVU0VfSVRUX0JVSUxEICYmIFVTRV9JVFRfTk9USUZZCisgICAgLy8gQmFycmllciBpbWJhbGFuY2UgLSBzYXZlIGFycml2ZSB0aW1lIHRvIHRoZSB0aHJlYWQKKyAgICBpZihfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSA9PSAyIHx8IF9fa21wX2Zvcmtqb2luX2ZyYW1lc19tb2RlID09IDMpIHsKKyAgICAgICAgdGhpc190aHItPnRoLnRoX2Jhcl9hcnJpdmVfdGltZSA9IHRoaXNfdGhyLT50aC50aF9iYXJfbWluX3RpbWUgPSBfX2l0dF9nZXRfdGltZXN0YW1wKCk7CisgICAgfQorI2VuZGlmCisgICAgLyogUGVyZm9ybSBhIGh5cGVyY3ViZS1lbWJlZGRlZCB0cmVlIGdhdGhlciB0byB3YWl0IHVudGlsIGFsbCBvZiB0aGUgdGhyZWFkcyBoYXZlCisgICAgICAgYXJyaXZlZCwgYW5kIHJlZHVjZSBhbnkgcmVxdWlyZWQgZGF0YSBhcyB3ZSBnby4gICovCisgICAga21wX2ZsYWdfNjQgcF9mbGFnKCZ0aHJfYmFyLT5iX2Fycml2ZWQpOworICAgIGZvciAobGV2ZWw9MCwgb2Zmc2V0PTE7IG9mZnNldDxudW1fdGhyZWFkczsgbGV2ZWwrPWJyYW5jaF9iaXRzLCBvZmZzZXQ8PD1icmFuY2hfYml0cykKKyAgICB7CisgICAgICAgIHJlZ2lzdGVyIGttcF91aW50MzIgY2hpbGQ7CisgICAgICAgIHJlZ2lzdGVyIGttcF91aW50MzIgY2hpbGRfdGlkOworCisgICAgICAgIGlmICgoKHRpZCA+PiBsZXZlbCkgJiAoYnJhbmNoX2ZhY3RvciAtIDEpKSAhPSAwKSB7CisgICAgICAgICAgICByZWdpc3RlciBrbXBfaW50MzIgcGFyZW50X3RpZCA9IHRpZCAmIH4oKDEgPDwgKGxldmVsICsgYnJhbmNoX2JpdHMpKSAtMSk7CisKKyAgICAgICAgICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2h5cGVyX2JhcnJpZXJfZ2F0aGVyOiBUIyVkKCVkOiVkKSByZWxlYXNpbmcgVCMlZCglZDolZCkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiYXJyaXZlZCglcCk6ICV1ID0+ICV1XG4iLCBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RpZChwYXJlbnRfdGlkLCB0ZWFtKSwgdGVhbS0+dC50X2lkLCBwYXJlbnRfdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhyX2Jhci0+Yl9hcnJpdmVkLCB0aHJfYmFyLT5iX2Fycml2ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRocl9iYXItPmJfYXJyaXZlZCArIEtNUF9CQVJSSUVSX1NUQVRFX0JVTVApKTsKKyAgICAgICAgICAgIC8vIE1hcmsgYXJyaXZhbCB0byBwYXJlbnQgdGhyZWFkCisgICAgICAgICAgICAvKiBBZnRlciBwZXJmb3JtaW5nIHRoaXMgd3JpdGUgKGluIHRoZSBsYXN0IGl0ZXJhdGlvbiBvZiB0aGUgZW5jbG9zaW5nIGZvciBsb29wKSwKKyAgICAgICAgICAgICAgIGEgd29ya2VyIHRocmVhZCBtYXkgbm90IGFzc3VtZSB0aGF0IHRoZSB0ZWFtIGlzIHZhbGlkIGFueSBtb3JlIC0gaXQgY291bGQgYmUKKyAgICAgICAgICAgICAgIGRlYWxsb2NhdGVkIGJ5IHRoZSBtYXN0ZXIgdGhyZWFkIGF0IGFueSB0aW1lLiAgKi8KKyAgICAgICAgICAgIHBfZmxhZy5zZXRfd2FpdGVyKG90aGVyX3RocmVhZHNbcGFyZW50X3RpZF0pOworCSAgICBwX2ZsYWcucmVsZWFzZSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvLyBQYXJlbnQgdGhyZWFkcyB3YWl0IGZvciBjaGlsZHJlbiB0byBhcnJpdmUKKyAgICAgICAgaWYgKG5ld19zdGF0ZSA9PSBLTVBfQkFSUklFUl9VTlVTRURfU1RBVEUpCisgICAgICAgICAgICBuZXdfc3RhdGUgPSB0ZWFtLT50LnRfYmFyW2J0XS5iX2Fycml2ZWQgKyBLTVBfQkFSUklFUl9TVEFURV9CVU1QOworICAgICAgICBmb3IgKGNoaWxkPTEsIGNoaWxkX3RpZD10aWQrKDEgPDwgbGV2ZWwpOyBjaGlsZDxicmFuY2hfZmFjdG9yICYmIGNoaWxkX3RpZDxudW1fdGhyZWFkczsKKyAgICAgICAgICAgICBjaGlsZCsrLCBjaGlsZF90aWQrPSgxIDw8IGxldmVsKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmVnaXN0ZXIga21wX2luZm9fdCAqY2hpbGRfdGhyID0gb3RoZXJfdGhyZWFkc1tjaGlsZF90aWRdOworICAgICAgICAgICAgcmVnaXN0ZXIga21wX2JzdGF0ZV90ICpjaGlsZF9iYXIgPSAmY2hpbGRfdGhyLT50aC50aF9iYXJbYnRdLmJiOworI2lmIEtNUF9DQUNIRV9NQU5BR0UKKyAgICAgICAgICAgIHJlZ2lzdGVyIGttcF91aW50MzIgbmV4dF9jaGlsZF90aWQgPSBjaGlsZF90aWQgKyAoMSA8PCBsZXZlbCk7CisgICAgICAgICAgICAvLyBQcmVmZXRjaCBuZXh0IHRocmVhZCdzIGFycml2ZWQgY291bnQKKyAgICAgICAgICAgIGlmIChjaGlsZCsxIDwgYnJhbmNoX2ZhY3RvciAmJiBuZXh0X2NoaWxkX3RpZCA8IG51bV90aHJlYWRzKQorICAgICAgICAgICAgICAgIEtNUF9DQUNIRV9QUkVGRVRDSCgmb3RoZXJfdGhyZWFkc1tuZXh0X2NoaWxkX3RpZF0tPnRoLnRoX2JhcltidF0uYmIuYl9hcnJpdmVkKTsKKyNlbmRpZiAvKiBLTVBfQ0FDSEVfTUFOQUdFICovCisgICAgICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9oeXBlcl9iYXJyaWVyX2dhdGhlcjogVCMlZCglZDolZCkgd2FpdCBUIyVkKCVkOiV1KSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJhcnJpdmVkKCVwKSA9PSAldVxuIiwgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aWQoY2hpbGRfdGlkLCB0ZWFtKSwgdGVhbS0+dC50X2lkLCBjaGlsZF90aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjaGlsZF9iYXItPmJfYXJyaXZlZCwgbmV3X3N0YXRlKSk7CisgICAgICAgICAgICAvLyBXYWl0IGZvciBjaGlsZCB0byBhcnJpdmUKKyAgICAgICAgICAgIGttcF9mbGFnXzY0IGNfZmxhZygmY2hpbGRfYmFyLT5iX2Fycml2ZWQsIG5ld19zdGF0ZSk7CisgICAgICAgICAgICBjX2ZsYWcud2FpdCh0aGlzX3RociwgRkFMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaikgKTsKKyNpZiBVU0VfSVRUX0JVSUxEICYmIFVTRV9JVFRfTk9USUZZCisgICAgICAgICAgICAvLyBCYXJyaWVyIGltYmFsYW5jZSAtIHdyaXRlIG1pbiBvZiB0aGUgdGhyZWFkIHRpbWUgYW5kIGEgY2hpbGQgdGltZSB0byB0aGUgdGhyZWFkLgorICAgICAgICAgICAgaWYgKF9fa21wX2Zvcmtqb2luX2ZyYW1lc19tb2RlID09IDIgfHwgX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGUgPT0gMykgeworICAgICAgICAgICAgICAgIHRoaXNfdGhyLT50aC50aF9iYXJfbWluX3RpbWUgPSBLTVBfTUlOKHRoaXNfdGhyLT50aC50aF9iYXJfbWluX3RpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRfdGhyLT50aC50aF9iYXJfbWluX3RpbWUpOworICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICBpZiAocmVkdWNlKSB7CisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoMTAwLCAoIl9fa21wX2h5cGVyX2JhcnJpZXJfZ2F0aGVyOiBUIyVkKCVkOiVkKSArPSBUIyVkKCVkOiV1KVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwgX19rbXBfZ3RpZF9mcm9tX3RpZChjaGlsZF90aWQsIHRlYW0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9pZCwgY2hpbGRfdGlkKSk7CisgICAgICAgICAgICAgICAgKCpyZWR1Y2UpKHRoaXNfdGhyLT50aC50aF9sb2NhbC5yZWR1Y2VfZGF0YSwgY2hpbGRfdGhyLT50aC50aF9sb2NhbC5yZWR1Y2VfZGF0YSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoS01QX01BU1RFUl9USUQodGlkKSkgeworICAgICAgICAvLyBOZWVkIHRvIHVwZGF0ZSB0aGUgdGVhbSBhcnJpdmVkIHBvaW50ZXIgaWYgd2UgYXJlIHRoZSBtYXN0ZXIgdGhyZWFkCisgICAgICAgIGlmIChuZXdfc3RhdGUgPT0gS01QX0JBUlJJRVJfVU5VU0VEX1NUQVRFKQorICAgICAgICAgICAgdGVhbS0+dC50X2JhcltidF0uYl9hcnJpdmVkICs9IEtNUF9CQVJSSUVSX1NUQVRFX0JVTVA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRlYW0tPnQudF9iYXJbYnRdLmJfYXJyaXZlZCA9IG5ld19zdGF0ZTsKKyAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfaHlwZXJfYmFycmllcl9nYXRoZXI6IFQjJWQoJWQ6JWQpIHNldCB0ZWFtICVkIGFycml2ZWQoJXApID0gJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIHRlYW0tPnQudF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAmdGVhbS0+dC50X2JhcltidF0uYl9hcnJpdmVkLCB0ZWFtLT50LnRfYmFyW2J0XS5iX2Fycml2ZWQpKTsKKyAgICB9CisgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfaHlwZXJfYmFycmllcl9nYXRoZXI6IFQjJWQoJWQ6JWQpIGV4aXQgZm9yIGJhcnJpZXIgdHlwZSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCBidCkpOworfQorCisvLyBUaGUgcmV2ZXJzZSB2ZXJzaW9ucyBzZWVtIHRvIGJlYXQgdGhlIGZvcndhcmQgdmVyc2lvbnMgb3ZlcmFsbAorI2RlZmluZSBLTVBfUkVWRVJTRV9IWVBFUl9CQVIKK3N0YXRpYyB2b2lkCitfX2ttcF9oeXBlcl9iYXJyaWVyX3JlbGVhc2UoZW51bSBiYXJyaWVyX3R5cGUgYnQsIGttcF9pbmZvX3QgKnRoaXNfdGhyLCBpbnQgZ3RpZCwgaW50IHRpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJvcGFnYXRlX2ljdnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyh2b2lkICppdHRfc3luY19vYmopICkKK3sKKyAgICBLTVBfVElNRV9CTE9DSyhLTVBfaHlwZXJfcmVsZWFzZSk7CisgICAgcmVnaXN0ZXIga21wX3RlYW1fdCAgICAqdGVhbTsKKyAgICByZWdpc3RlciBrbXBfYnN0YXRlX3QgICp0aHJfYmFyICAgICAgID0gJiB0aGlzX3RociAtPiB0aC50aF9iYXJbIGJ0IF0uYmI7CisgICAgcmVnaXN0ZXIga21wX2luZm9fdCAgICoqb3RoZXJfdGhyZWFkczsKKyAgICByZWdpc3RlciBrbXBfdWludDMyICAgICBudW1fdGhyZWFkczsKKyAgICByZWdpc3RlciBrbXBfdWludDMyICAgICBicmFuY2hfYml0cyAgID0gX19rbXBfYmFycmllcl9yZWxlYXNlX2JyYW5jaF9iaXRzWyBidCBdOworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgICAgIGJyYW5jaF9mYWN0b3IgPSAxIDw8IGJyYW5jaF9iaXRzOworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgICAgIGNoaWxkOworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgICAgIGNoaWxkX3RpZDsKKyAgICByZWdpc3RlciBrbXBfdWludDMyICAgICBvZmZzZXQ7CisgICAgcmVnaXN0ZXIga21wX3VpbnQzMiAgICAgbGV2ZWw7CisKKyAgICAvKiBQZXJmb3JtIGEgaHlwZXJjdWJlLWVtYmVkZGVkIHRyZWUgcmVsZWFzZSBmb3IgYWxsIG9mIHRoZSB0aHJlYWRzIHRoYXQgaGF2ZSBiZWVuIGdhdGhlcmVkLgorICAgICAgIElmIEtNUF9SRVZFUlNFX0hZUEVSX0JBUiBpcyBkZWZpbmVkIChkZWZhdWx0KSB0aGUgdGhyZWFkcyBhcmUgcmVsZWFzZWQgaW4gdGhlIHJldmVyc2UKKyAgICAgICBvcmRlciBvZiB0aGUgY29ycmVzcG9uZGluZyBnYXRoZXIsIG90aGVyd2lzZSB0aHJlYWRzIGFyZSByZWxlYXNlZCBpbiB0aGUgc2FtZSBvcmRlci4gKi8KKyAgICBpZiAoS01QX01BU1RFUl9USUQodGlkKSkgeyAvLyBtYXN0ZXIKKyAgICAgICAgdGVhbSA9IF9fa21wX3RocmVhZHNbZ3RpZF0tPnRoLnRoX3RlYW07CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQodGVhbSAhPSBOVUxMKTsKKyAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfaHlwZXJfYmFycmllcl9yZWxlYXNlOiBUIyVkKCVkOiVkKSBtYXN0ZXIgZW50ZXIgZm9yIGJhcnJpZXIgdHlwZSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwgYnQpKTsKKyNpZiBLTVBfQkFSUklFUl9JQ1ZfUFVTSAorICAgICAgICBpZiAocHJvcGFnYXRlX2ljdnMpIHsgLy8gbWFzdGVyIGFscmVhZHkgaGFzIElDVnMgaW4gZmluYWwgZGVzdGluYXRpb247IGNvcHkKKyAgICAgICAgICAgIGNvcHlfaWN2cygmdGhyX2Jhci0+dGhfZml4ZWRfaWN2cywgJnRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhW3RpZF0udGRfaWN2cyk7CisgICAgICAgIH0KKyNlbmRpZgorICAgIH0KKyAgICBlbHNlICB7IC8vIEhhbmRsZSBmb3JrIGJhcnJpZXIgd29ya2VycyB3aG8gYXJlbid0IHBhcnQgb2YgYSB0ZWFtIHlldAorICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9oeXBlcl9iYXJyaWVyX3JlbGVhc2U6IFQjJWQgd2FpdCBnbyglcCkgPT0gJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgJnRocl9iYXItPmJfZ28sIEtNUF9CQVJSSUVSX1NUQVRFX0JVTVApKTsKKyAgICAgICAgLy8gV2FpdCBmb3IgcGFyZW50IHRocmVhZCB0byByZWxlYXNlIHVzCisgICAgICAgIGttcF9mbGFnXzY0IGZsYWcoJnRocl9iYXItPmJfZ28sIEtNUF9CQVJSSUVSX1NUQVRFX0JVTVApOworICAgICAgICBmbGFnLndhaXQodGhpc190aHIsIFRSVUUKKyAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaikgKTsKKyNpZiBVU0VfSVRUX0JVSUxEICYmIFVTRV9JVFRfTk9USUZZCisgICAgICAgIGlmICgoX19pdHRfc3luY19jcmVhdGVfcHRyICYmIGl0dF9zeW5jX29iaiA9PSBOVUxMKSB8fCBLTVBfSVRUX0RFQlVHKSB7CisgICAgICAgICAgICAvLyBJbiBmb3JrIGJhcnJpZXIgd2hlcmUgd2UgY291bGQgbm90IGdldCB0aGUgb2JqZWN0IHJlbGlhYmx5CisgICAgICAgICAgICBpdHRfc3luY19vYmogPSBfX2ttcF9pdHRfYmFycmllcl9vYmplY3QoZ3RpZCwgYnNfZm9ya2pvaW5fYmFycmllciwgMCwgLTEpOworICAgICAgICAgICAgLy8gQ2FuY2VsIHdhaXQgb24gcHJldmlvdXMgcGFyYWxsZWwgcmVnaW9uLi4uCisgICAgICAgICAgICBfX2ttcF9pdHRfdGFza19zdGFydGluZyhpdHRfc3luY19vYmopOworCisgICAgICAgICAgICBpZiAoYnQgPT0gYnNfZm9ya2pvaW5fYmFycmllciAmJiBUQ1JfNChfX2ttcF9nbG9iYWwuZy5nX2RvbmUpKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgaXR0X3N5bmNfb2JqID0gX19rbXBfaXR0X2JhcnJpZXJfb2JqZWN0KGd0aWQsIGJzX2Zvcmtqb2luX2JhcnJpZXIpOworICAgICAgICAgICAgaWYgKGl0dF9zeW5jX29iaiAhPSBOVUxMKQorICAgICAgICAgICAgICAgIC8vIENhbGwgcHJlcGFyZSBhcyBlYXJseSBhcyBwb3NzaWJsZSBmb3IgIm5ldyIgYmFycmllcgorICAgICAgICAgICAgICAgIF9fa21wX2l0dF90YXNrX2ZpbmlzaGVkKGl0dF9zeW5jX29iaik7CisgICAgICAgIH0gZWxzZQorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgJiYgVVNFX0lUVF9OT1RJRlkgKi8KKyAgICAgICAgLy8gRWFybHkgZXhpdCBmb3IgcmVhcGluZyB0aHJlYWRzIHJlbGVhc2luZyBmb3Jram9pbiBiYXJyaWVyCisgICAgICAgIGlmIChidCA9PSBic19mb3Jram9pbl9iYXJyaWVyICYmIFRDUl80KF9fa21wX2dsb2JhbC5nLmdfZG9uZSkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgLy8gVGhlIHdvcmtlciB0aHJlYWQgbWF5IG5vdyBhc3N1bWUgdGhhdCB0aGUgdGVhbSBpcyB2YWxpZC4KKyAgICAgICAgdGVhbSA9IF9fa21wX3RocmVhZHNbZ3RpZF0tPnRoLnRoX3RlYW07CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQodGVhbSAhPSBOVUxMKTsKKyAgICAgICAgdGlkID0gX19rbXBfdGlkX2Zyb21fZ3RpZChndGlkKTsKKworICAgICAgICBUQ1dfNCh0aHJfYmFyLT5iX2dvLCBLTVBfSU5JVF9CQVJSSUVSX1NUQVRFKTsKKyAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfaHlwZXJfYmFycmllcl9yZWxlYXNlOiBUIyVkKCVkOiVkKSBzZXQgZ28oJXApID0gJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsICZ0aHJfYmFyLT5iX2dvLCBLTVBfSU5JVF9CQVJSSUVSX1NUQVRFKSk7CisgICAgICAgIEtNUF9NQigpOyAgLy8gRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLgorICAgIH0KKyAgICBudW1fdGhyZWFkcyA9IHRoaXNfdGhyLT50aC50aF90ZWFtX25wcm9jOworICAgIG90aGVyX3RocmVhZHMgPSB0ZWFtLT50LnRfdGhyZWFkczsKKworI2lmZGVmIEtNUF9SRVZFUlNFX0hZUEVSX0JBUgorICAgIC8vIENvdW50IHVwIHRvIGNvcnJlY3QgbGV2ZWwgZm9yIHBhcmVudAorICAgIGZvciAobGV2ZWw9MCwgb2Zmc2V0PTE7IG9mZnNldDxudW1fdGhyZWFkcyAmJiAoKCh0aWQ+PmxldmVsKSAmIChicmFuY2hfZmFjdG9yLTEpKSA9PSAwKTsKKyAgICAgICAgIGxldmVsKz1icmFuY2hfYml0cywgb2Zmc2V0PDw9YnJhbmNoX2JpdHMpOworCisgICAgLy8gTm93IGdvIGRvd24gZnJvbSB0aGVyZQorICAgIGZvciAobGV2ZWwtPWJyYW5jaF9iaXRzLCBvZmZzZXQ+Pj1icmFuY2hfYml0czsgb2Zmc2V0ICE9IDA7CisgICAgICAgICBsZXZlbC09YnJhbmNoX2JpdHMsIG9mZnNldD4+PWJyYW5jaF9iaXRzKQorI2Vsc2UKKyAgICAvLyBHbyBkb3duIHRoZSB0cmVlLCBsZXZlbCBieSBsZXZlbAorICAgIGZvciAobGV2ZWw9MCwgb2Zmc2V0PTE7IG9mZnNldDxudW1fdGhyZWFkczsgbGV2ZWwrPWJyYW5jaF9iaXRzLCBvZmZzZXQ8PD1icmFuY2hfYml0cykKKyNlbmRpZiAvLyBLTVBfUkVWRVJTRV9IWVBFUl9CQVIKKyAgICB7CisjaWZkZWYgS01QX1JFVkVSU0VfSFlQRVJfQkFSCisgICAgICAgIC8qIE5vdyBnbyBpbiByZXZlcnNlIG9yZGVyIHRocm91Z2ggdGhlIGNoaWxkcmVuLCBoaWdoZXN0IHRvIGxvd2VzdC4KKyAgICAgICAgICAgSW5pdGlhbCBzZXR0aW5nIG9mIGNoaWxkIGlzIGNvbnNlcnZhdGl2ZSBoZXJlLiAqLworICAgICAgICBjaGlsZCA9IG51bV90aHJlYWRzID4+ICgobGV2ZWw9PTApP2xldmVsOmxldmVsLTEpOworICAgICAgICBmb3IgKGNoaWxkPShjaGlsZDxicmFuY2hfZmFjdG9yLTEpID8gY2hpbGQgOiBicmFuY2hfZmFjdG9yLTEsIGNoaWxkX3RpZD10aWQrKGNoaWxkPDxsZXZlbCk7CisgICAgICAgICAgICAgY2hpbGQ+PTE7IGNoaWxkLS0sIGNoaWxkX3RpZC09KDE8PGxldmVsKSkKKyNlbHNlCisgICAgICAgIGlmICgoKHRpZCA+PiBsZXZlbCkgJiAoYnJhbmNoX2ZhY3RvciAtIDEpKSAhPSAwKQorICAgICAgICAgICAgLy8gTm8gbmVlZCB0byBnbyBsb3dlciB0aGFuIHRoaXMsIHNpbmNlIHRoaXMgaXMgdGhlIGxldmVsIHBhcmVudCB3b3VsZCBiZSBub3RpZmllZAorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCBjaGlsZHJlbiBvbiB0aGlzIGxldmVsIG9mIHRoZSB0cmVlCisgICAgICAgIGZvciAoY2hpbGQ9MSwgY2hpbGRfdGlkPXRpZCsoMTw8bGV2ZWwpOyBjaGlsZDxicmFuY2hfZmFjdG9yICYmIGNoaWxkX3RpZDxudW1fdGhyZWFkczsKKyAgICAgICAgICAgICBjaGlsZCsrLCBjaGlsZF90aWQrPSgxPDxsZXZlbCkpCisjZW5kaWYgLy8gS01QX1JFVkVSU0VfSFlQRVJfQkFSCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjaGlsZF90aWQgPj0gbnVtX3RocmVhZHMpIGNvbnRpbnVlOyAgLy8gQ2hpbGQgZG9lc24ndCBleGlzdCBzbyBrZWVwIGdvaW5nCisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICByZWdpc3RlciBrbXBfaW5mb190ICpjaGlsZF90aHIgPSBvdGhlcl90aHJlYWRzW2NoaWxkX3RpZF07CisgICAgICAgICAgICAgICAgcmVnaXN0ZXIga21wX2JzdGF0ZV90ICpjaGlsZF9iYXIgPSAmY2hpbGRfdGhyLT50aC50aF9iYXJbYnRdLmJiOworI2lmIEtNUF9DQUNIRV9NQU5BR0UKKyAgICAgICAgICAgICAgICByZWdpc3RlciBrbXBfdWludDMyIG5leHRfY2hpbGRfdGlkID0gY2hpbGRfdGlkIC0gKDEgPDwgbGV2ZWwpOworICAgICAgICAgICAgICAgIC8vIFByZWZldGNoIG5leHQgdGhyZWFkJ3MgZ28gY291bnQKKyMgaWZkZWYgS01QX1JFVkVSU0VfSFlQRVJfQkFSCisgICAgICAgICAgICAgICAgaWYgKGNoaWxkLTEgPj0gMSAmJiBuZXh0X2NoaWxkX3RpZCA8IG51bV90aHJlYWRzKQorIyBlbHNlCisgICAgICAgICAgICAgICAgaWYgKGNoaWxkKzEgPCBicmFuY2hfZmFjdG9yICYmIG5leHRfY2hpbGRfdGlkIDwgbnVtX3RocmVhZHMpCisjIGVuZGlmIC8vIEtNUF9SRVZFUlNFX0hZUEVSX0JBUgorICAgICAgICAgICAgICAgICAgICBLTVBfQ0FDSEVfUFJFRkVUQ0goJm90aGVyX3RocmVhZHNbbmV4dF9jaGlsZF90aWRdLT50aC50aF9iYXJbYnRdLmJiLmJfZ28pOworI2VuZGlmIC8qIEtNUF9DQUNIRV9NQU5BR0UgKi8KKworI2lmIEtNUF9CQVJSSUVSX0lDVl9QVVNICisgICAgICAgICAgICAgICAgaWYgKHByb3BhZ2F0ZV9pY3ZzKSAvLyBwdXNoIG15IGZpeGVkIElDVnMgdG8gbXkgY2hpbGQKKyAgICAgICAgICAgICAgICAgICAgY29weV9pY3ZzKCZjaGlsZF9iYXItPnRoX2ZpeGVkX2ljdnMsICZ0aHJfYmFyLT50aF9maXhlZF9pY3ZzKTsKKyNlbmRpZiAvLyBLTVBfQkFSUklFUl9JQ1ZfUFVTSAorCisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfaHlwZXJfYmFycmllcl9yZWxlYXNlOiBUIyVkKCVkOiVkKSByZWxlYXNpbmcgVCMlZCglZDoldSkiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ28oJXApOiAldSA9PiAldVxuIiwgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGlkKGNoaWxkX3RpZCwgdGVhbSksIHRlYW0tPnQudF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkX3RpZCwgJmNoaWxkX2Jhci0+Yl9nbywgY2hpbGRfYmFyLT5iX2dvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRfYmFyLT5iX2dvICsgS01QX0JBUlJJRVJfU1RBVEVfQlVNUCkpOworICAgICAgICAgICAgICAgIC8vIFJlbGVhc2UgY2hpbGQgZnJvbSBiYXJyaWVyCisgICAgICAgICAgICAgICAga21wX2ZsYWdfNjQgZmxhZygmY2hpbGRfYmFyLT5iX2dvLCBjaGlsZF90aHIpOworICAgICAgICAgICAgICAgIGZsYWcucmVsZWFzZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorI2lmIEtNUF9CQVJSSUVSX0lDVl9QVVNICisgICAgaWYgKHByb3BhZ2F0ZV9pY3ZzICYmICFLTVBfTUFTVEVSX1RJRCh0aWQpKSB7IC8vIGNvcHkgSUNWcyBsb2NhbGx5IHRvIGZpbmFsIGRlc3QKKyAgICAgICAgX19rbXBfaW5pdF9pbXBsaWNpdF90YXNrKHRlYW0tPnQudF9pZGVudCwgdGVhbS0+dC50X3RocmVhZHNbdGlkXSwgdGVhbSwgdGlkLCBGQUxTRSk7CisgICAgICAgIGNvcHlfaWN2cygmdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbdGlkXS50ZF9pY3ZzLCAmdGhyX2Jhci0+dGhfZml4ZWRfaWN2cyk7CisgICAgfQorI2VuZGlmCisgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfaHlwZXJfYmFycmllcl9yZWxlYXNlOiBUIyVkKCVkOiVkKSBleGl0IGZvciBiYXJyaWVyIHR5cGUgJWRcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwgYnQpKTsKK30KKworLy8gSGllcmFyY2hpY2FsIEJhcnJpZXIKKworLy8gSW5pdGlhbGl6ZSB0aHJlYWQgYmFycmllciBkYXRhCisvKiBJbml0aWFsaXplcy9yZS1pbml0aWFsaXplcyB0aGUgaGllcmFyY2hpY2FsIGJhcnJpZXIgZGF0YSBzdG9yZWQgb24gYSB0aHJlYWQuICBQZXJmb3JtcyB0aGUKKyAgIG1pbmltdW0gYW1vdW50IG9mIGluaXRpYWxpemF0aW9uIHJlcXVpcmVkIGJhc2VkIG9uIGhvdyB0aGUgdGVhbSBoYXMgY2hhbmdlZC4gIFJldHVybnMgdHJ1ZSBpZgorICAgbGVhZiBjaGlsZHJlbiB3aWxsIHJlcXVpcmUgYm90aCBvbi1jb3JlIGFuZCB0cmFkaXRpb25hbCB3YWtlLXVwIG1lY2hhbmlzbXMuICBGb3IgZXhhbXBsZSwgaWYgdGhlCisgICB0ZWFtIHNpemUgaW5jcmVhc2VzLCB0aHJlYWRzIGFscmVhZHkgaW4gdGhlIHRlYW0gd2lsbCByZXNwb25kIHRvIG9uLWNvcmUgd2FrZXVwIG9uIHRoZWlyIHBhcmVudAorICAgdGhyZWFkLCBidXQgdGhyZWFkcyBuZXdseSBhZGRlZCB0byB0aGUgdGVhbSB3aWxsIG9ubHkgYmUgbGlzdGVuaW5nIG9uIHRoZSB0aGVpciBsb2NhbCBiX2dvLiAqLworc3RhdGljIGJvb2wKK19fa21wX2luaXRfaGllcmFyY2hpY2FsX2JhcnJpZXJfdGhyZWFkKGVudW0gYmFycmllcl90eXBlIGJ0LCBrbXBfYnN0YXRlX3QgKnRocl9iYXIsIGttcF91aW50MzIgbnByb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZ3RpZCwgaW50IHRpZCwga21wX3RlYW1fdCAqdGVhbSkKK3sKKyAgICAvLyBDaGVja3MgdG8gZGV0ZXJtaW5lIGlmIChyZS0paW5pdGlhbGl6YXRpb24gaXMgbmVlZGVkCisgICAgYm9vbCB1bmluaXRpYWxpemVkID0gdGhyX2Jhci0+dGVhbSA9PSBOVUxMOworICAgIGJvb2wgdGVhbV9jaGFuZ2VkID0gdGVhbSAhPSB0aHJfYmFyLT50ZWFtOworICAgIGJvb2wgdGVhbV9zel9jaGFuZ2VkID0gbnByb2MgIT0gdGhyX2Jhci0+bnByb2M7CisgICAgYm9vbCB0aWRfY2hhbmdlZCA9IHRpZCAhPSB0aHJfYmFyLT5vbGRfdGlkOworICAgIGJvb2wgcmV0dmFsID0gZmFsc2U7CisKKyAgICBpZiAodW5pbml0aWFsaXplZCB8fCB0ZWFtX3N6X2NoYW5nZWQpIHsKKyAgICAgICAgX19rbXBfZ2V0X2hpZXJhcmNoeShucHJvYywgdGhyX2Jhcik7CisgICAgfQorCisgICAgaWYgKHVuaW5pdGlhbGl6ZWQgfHwgdGVhbV9zel9jaGFuZ2VkIHx8IHRpZF9jaGFuZ2VkKSB7CisgICAgICAgIHRocl9iYXItPm15X2xldmVsID0gdGhyX2Jhci0+ZGVwdGgtMTsgLy8gZGVmYXVsdCBmb3IgbWFzdGVyCisgICAgICAgIHRocl9iYXItPnBhcmVudF90aWQgPSAtMTsgLy8gZGVmYXVsdCBmb3IgbWFzdGVyCisgICAgICAgIGlmICghS01QX01BU1RFUl9USUQodGlkKSkgeyAvLyBpZiBub3QgbWFzdGVyLCBmaW5kIHBhcmVudCB0aHJlYWQgaW4gaGllcmFyY2h5CisgICAgICAgICAgICBrbXBfdWludDMyIGQ9MDsKKyAgICAgICAgICAgIHdoaWxlIChkPHRocl9iYXItPmRlcHRoKSB7IC8vIGZpbmQgcGFyZW50IGJhc2VkIG9uIGxldmVsIG9mIHRocmVhZCBpbiBoaWVyYXJjaHksIGFuZCBub3RlIGxldmVsCisgICAgICAgICAgICAgICAga21wX3VpbnQzMiByZW07CisgICAgICAgICAgICAgICAgaWYgKGQgPT0gdGhyX2Jhci0+ZGVwdGgtMikgeyAvLyByZWFjaGVkIGxldmVsIHJpZ2h0IGJlbG93IHRoZSBtYXN0ZXIKKyAgICAgICAgICAgICAgICAgICAgdGhyX2Jhci0+cGFyZW50X3RpZCA9IDA7CisgICAgICAgICAgICAgICAgICAgIHRocl9iYXItPm15X2xldmVsID0gZDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKChyZW0gPSB0aWQldGhyX2Jhci0+c2tpcF9wZXJfbGV2ZWxbZCsxXSkgIT0gMCkgeyAvLyBUT0RPOiBjYW4gd2UgbWFrZSB0aGlzIG9wIGZhc3Rlcj8KKyAgICAgICAgICAgICAgICAgICAgLy8gdGhyZWFkIGlzIG5vdCBhIHN1YnRyZWUgcm9vdCBhdCBuZXh0IGxldmVsLCBzbyB0aGlzIGlzIG1heAorICAgICAgICAgICAgICAgICAgICB0aHJfYmFyLT5wYXJlbnRfdGlkID0gdGlkIC0gcmVtOworICAgICAgICAgICAgICAgICAgICB0aHJfYmFyLT5teV9sZXZlbCA9IGQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICArK2Q7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdGhyX2Jhci0+b2Zmc2V0ID0gNy0odGlkLXRocl9iYXItPnBhcmVudF90aWQtMSk7CisgICAgICAgIHRocl9iYXItPm9sZF90aWQgPSB0aWQ7CisgICAgICAgIHRocl9iYXItPndhaXRfZmxhZyA9IEtNUF9CQVJSSUVSX05PVF9XQUlUSU5HOworICAgIH0KKyAgICBpZiAodW5pbml0aWFsaXplZCB8fCB0ZWFtX2NoYW5nZWQgfHwgdGlkX2NoYW5nZWQpIHsKKyAgICAgICAgdGhyX2Jhci0+dGVhbSA9IHRlYW07CisgICAgICAgIHRocl9iYXItPnBhcmVudF9iYXIgPSAmdGVhbS0+dC50X3RocmVhZHNbdGhyX2Jhci0+cGFyZW50X3RpZF0tPnRoLnRoX2JhcltidF0uYmI7CisgICAgICAgIHJldHZhbCA9IHRydWU7CisgICAgfQorICAgIGlmICh1bmluaXRpYWxpemVkIHx8IHRlYW1fc3pfY2hhbmdlZCB8fCB0aWRfY2hhbmdlZCkgeworICAgICAgICB0aHJfYmFyLT5ucHJvYyA9IG5wcm9jOworICAgICAgICB0aHJfYmFyLT5sZWFmX2tpZHMgPSB0aHJfYmFyLT5iYXNlX2xlYWZfa2lkczsKKyAgICAgICAgaWYgKHRocl9iYXItPm15X2xldmVsID09IDApIHRocl9iYXItPmxlYWZfa2lkcz0wOworICAgICAgICBpZiAodGhyX2Jhci0+bGVhZl9raWRzICYmIChrbXBfdWludDMyKXRpZCt0aHJfYmFyLT5sZWFmX2tpZHMrMSA+IG5wcm9jKQorICAgICAgICAgICAgdGhyX2Jhci0+bGVhZl9raWRzID0gbnByb2MgLSB0aWQgLSAxOworICAgICAgICB0aHJfYmFyLT5sZWFmX3N0YXRlID0gMDsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPHRocl9iYXItPmxlYWZfa2lkczsgKytpKSAoKGNoYXIgKikmKHRocl9iYXItPmxlYWZfc3RhdGUpKVs3LWldID0gMTsKKyAgICB9CisgICAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2hpZXJhcmNoaWNhbF9iYXJyaWVyX2dhdGhlcihlbnVtIGJhcnJpZXJfdHlwZSBidCwga21wX2luZm9fdCAqdGhpc190aHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGd0aWQsIGludCB0aWQsIHZvaWQgKCpyZWR1Y2UpICh2b2lkICosIHZvaWQgKikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyh2b2lkICogaXR0X3N5bmNfb2JqKSApCit7CisgICAgS01QX1RJTUVfQkxPQ0soS01QX2hpZXJfZ2F0aGVyKTsKKyAgICByZWdpc3RlciBrbXBfdGVhbV90ICp0ZWFtID0gdGhpc190aHItPnRoLnRoX3RlYW07CisgICAgcmVnaXN0ZXIga21wX2JzdGF0ZV90ICp0aHJfYmFyID0gJiB0aGlzX3Roci0+dGgudGhfYmFyW2J0XS5iYjsKKyAgICByZWdpc3RlciBrbXBfdWludDMyIG5wcm9jID0gdGhpc190aHItPnRoLnRoX3RlYW1fbnByb2M7CisgICAgcmVnaXN0ZXIga21wX2luZm9fdCAqKm90aGVyX3RocmVhZHMgPSB0ZWFtLT50LnRfdGhyZWFkczsKKyAgICByZWdpc3RlciBrbXBfdWludDY0IG5ld19zdGF0ZTsKKworICAgIGlmICh0aGlzX3Roci0+dGgudGhfdGVhbS0+dC50X2xldmVsID09IDEpIHRocl9iYXItPnVzZV9vbmNvcmVfYmFycmllciA9IDE7CisgICAgZWxzZSB0aHJfYmFyLT51c2Vfb25jb3JlX2JhcnJpZXIgPSAwOyAvLyBEbyBub3QgdXNlIG9uY29yZSBiYXJyaWVyIHdoZW4gbmVzdGVkCisKKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9oaWVyYXJjaGljYWxfYmFycmllcl9nYXRoZXI6IFQjJWQoJWQ6JWQpIGVudGVyIGZvciBiYXJyaWVyIHR5cGUgJWRcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwgYnQpKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKHRoaXNfdGhyID09IG90aGVyX3RocmVhZHNbdGhpc190aHItPnRoLnRoX2luZm8uZHMuZHNfdGlkXSk7CisKKyAgICAodm9pZClfX2ttcF9pbml0X2hpZXJhcmNoaWNhbF9iYXJyaWVyX3RocmVhZChidCwgdGhyX2JhciwgbnByb2MsIGd0aWQsIHRpZCwgdGVhbSk7CisKKyAgICBpZiAodGhyX2Jhci0+bXlfbGV2ZWwpIHsgLy8gbm90IGEgbGVhZiAobXlfbGV2ZWw9PTAgbWVhbnMgbGVhZikKKyAgICAgICAgcmVnaXN0ZXIga21wX2ludDMyIGNoaWxkX3RpZDsKKyAgICAgICAgbmV3X3N0YXRlID0gKGttcF91aW50NjQpdGVhbS0+dC50X2JhcltidF0uYl9hcnJpdmVkICsgS01QX0JBUlJJRVJfU1RBVEVfQlVNUDsKKyAgICAgICAgaWYgKF9fa21wX2RmbHRfYmxvY2t0aW1lID09IEtNUF9NQVhfQkxPQ0tUSU1FICYmIHRocl9iYXItPnVzZV9vbmNvcmVfYmFycmllcikgeworICAgICAgICAgICAgaWYgKHRocl9iYXItPmxlYWZfa2lkcykgeyAvLyBGaXJzdCwgd2FpdCBmb3IgbGVhZiBjaGlsZHJlbiB0byBjaGVjay1pbiBvbiBteSBiX2Fycml2ZWQgZmxhZworICAgICAgICAgICAgICAgIGttcF91aW50NjQgbGVhZl9zdGF0ZSA9IEtNUF9NQVNURVJfVElEKHRpZCkgPyB0aHJfYmFyLT5iX2Fycml2ZWQgfCB0aHJfYmFyLT5sZWFmX3N0YXRlIDogKGttcF91aW50NjQpdGVhbS0+dC50X2JhcltidF0uYl9hcnJpdmVkIHwgdGhyX2Jhci0+bGVhZl9zdGF0ZTsKKyAgICAgICAgICAgICAgICBrbXBfZmxhZ182NCBmbGFnKCZ0aHJfYmFyLT5iX2Fycml2ZWQsIGxlYWZfc3RhdGUpOworICAgICAgICAgICAgICAgIGZsYWcud2FpdCh0aGlzX3RociwgRkFMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSApOworICAgICAgICAgICAgICAgIGlmIChyZWR1Y2UpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChjaGlsZF90aWQ9dGlkKzE7IGNoaWxkX3RpZDw9dGlkK3Rocl9iYXItPmxlYWZfa2lkczsgKytjaGlsZF90aWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtBX1RSQUNFKDEwMCwgKCJfX2ttcF9oaWVyYXJjaGljYWxfYmFycmllcl9nYXRoZXI6IFQjJWQoJWQ6JWQpICs9IFQjJWQoJWQ6JWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIF9fa21wX2d0aWRfZnJvbV90aWQoY2hpbGRfdGlkLCB0ZWFtKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9pZCwgY2hpbGRfdGlkKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAoKnJlZHVjZSkodGhpc190aHItPnRoLnRoX2xvY2FsLnJlZHVjZV9kYXRhLCBvdGhlcl90aHJlYWRzW2NoaWxkX3RpZF0tPnRoLnRoX2xvY2FsLnJlZHVjZV9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAodm9pZCkgS01QX1RFU1RfVEhFTl9BTkQ2NCgodm9sYXRpbGUga21wX2ludDY0ICopJnRocl9iYXItPmJfYXJyaXZlZCwgfih0aHJfYmFyLT5sZWFmX3N0YXRlKSk7IC8vIGNsZWFyIGxlYWZfc3RhdGUgYml0cworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gTmV4dCwgd2FpdCBmb3IgaGlnaGVyIGxldmVsIGNoaWxkcmVuIG9uIGVhY2ggY2hpbGQncyBiX2Fycml2ZWQgZmxhZworICAgICAgICAgICAgZm9yIChrbXBfdWludDMyIGQ9MTsgZDx0aHJfYmFyLT5teV9sZXZlbDsgKytkKSB7IC8vIGdhdGhlciBsb3dlc3QgbGV2ZWwgdGhyZWFkcyBmaXJzdCwgYnV0IHNraXAgMAorICAgICAgICAgICAgICAgIGttcF91aW50MzIgbGFzdCA9IHRpZCt0aHJfYmFyLT5za2lwX3Blcl9sZXZlbFtkKzFdLCBza2lwID0gdGhyX2Jhci0+c2tpcF9wZXJfbGV2ZWxbZF07CisgICAgICAgICAgICAgICAgaWYgKGxhc3QgPiBucHJvYykgbGFzdCA9IG5wcm9jOworICAgICAgICAgICAgICAgIGZvciAoY2hpbGRfdGlkPXRpZCtza2lwOyBjaGlsZF90aWQ8KGludClsYXN0OyBjaGlsZF90aWQrPXNraXApIHsKKyAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIga21wX2luZm9fdCAqY2hpbGRfdGhyID0gb3RoZXJfdGhyZWFkc1tjaGlsZF90aWRdOworICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBrbXBfYnN0YXRlX3QgKmNoaWxkX2JhciA9ICZjaGlsZF90aHItPnRoLnRoX2JhcltidF0uYmI7CisgICAgICAgICAgICAgICAgICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2hpZXJhcmNoaWNhbF9iYXJyaWVyX2dhdGhlcjogVCMlZCglZDolZCkgd2FpdCBUIyVkKCVkOiVkKSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFycml2ZWQoJXApID09ICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCBfX2ttcF9ndGlkX2Zyb21fdGlkKGNoaWxkX3RpZCwgdGVhbSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X2lkLCBjaGlsZF90aWQsICZjaGlsZF9iYXItPmJfYXJyaXZlZCwgbmV3X3N0YXRlKSk7CisgICAgICAgICAgICAgICAgICAgIGttcF9mbGFnXzY0IGZsYWcoJmNoaWxkX2Jhci0+Yl9hcnJpdmVkLCBuZXdfc3RhdGUpOworICAgICAgICAgICAgICAgICAgICBmbGFnLndhaXQodGhpc190aHIsIEZBTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopICk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZWR1Y2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtBX1RSQUNFKDEwMCwgKCJfX2ttcF9oaWVyYXJjaGljYWxfYmFycmllcl9nYXRoZXI6IFQjJWQoJWQ6JWQpICs9IFQjJWQoJWQ6JWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIF9fa21wX2d0aWRfZnJvbV90aWQoY2hpbGRfdGlkLCB0ZWFtKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9pZCwgY2hpbGRfdGlkKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAoKnJlZHVjZSkodGhpc190aHItPnRoLnRoX2xvY2FsLnJlZHVjZV9kYXRhLCBjaGlsZF90aHItPnRoLnRoX2xvY2FsLnJlZHVjZV9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsgLy8gQmxvY2t0aW1lIGlzIG5vdCBpbmZpbml0ZQorICAgICAgICAgICAgZm9yIChrbXBfdWludDMyIGQ9MDsgZDx0aHJfYmFyLT5teV9sZXZlbDsgKytkKSB7IC8vIEdhdGhlciBsb3dlc3QgbGV2ZWwgdGhyZWFkcyBmaXJzdAorICAgICAgICAgICAgICAgIGttcF91aW50MzIgbGFzdCA9IHRpZCt0aHJfYmFyLT5za2lwX3Blcl9sZXZlbFtkKzFdLCBza2lwID0gdGhyX2Jhci0+c2tpcF9wZXJfbGV2ZWxbZF07CisgICAgICAgICAgICAgICAgaWYgKGxhc3QgPiBucHJvYykgbGFzdCA9IG5wcm9jOworICAgICAgICAgICAgICAgIGZvciAoY2hpbGRfdGlkPXRpZCtza2lwOyBjaGlsZF90aWQ8KGludClsYXN0OyBjaGlsZF90aWQrPXNraXApIHsKKyAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIga21wX2luZm9fdCAqY2hpbGRfdGhyID0gb3RoZXJfdGhyZWFkc1tjaGlsZF90aWRdOworICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBrbXBfYnN0YXRlX3QgKmNoaWxkX2JhciA9ICZjaGlsZF90aHItPnRoLnRoX2JhcltidF0uYmI7CisgICAgICAgICAgICAgICAgICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2hpZXJhcmNoaWNhbF9iYXJyaWVyX2dhdGhlcjogVCMlZCglZDolZCkgd2FpdCBUIyVkKCVkOiVkKSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFycml2ZWQoJXApID09ICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCBfX2ttcF9ndGlkX2Zyb21fdGlkKGNoaWxkX3RpZCwgdGVhbSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X2lkLCBjaGlsZF90aWQsICZjaGlsZF9iYXItPmJfYXJyaXZlZCwgbmV3X3N0YXRlKSk7CisgICAgICAgICAgICAgICAgICAgIGttcF9mbGFnXzY0IGZsYWcoJmNoaWxkX2Jhci0+Yl9hcnJpdmVkLCBuZXdfc3RhdGUpOworICAgICAgICAgICAgICAgICAgICBmbGFnLndhaXQodGhpc190aHIsIEZBTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopICk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZWR1Y2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtBX1RSQUNFKDEwMCwgKCJfX2ttcF9oaWVyYXJjaGljYWxfYmFycmllcl9nYXRoZXI6IFQjJWQoJWQ6JWQpICs9IFQjJWQoJWQ6JWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIF9fa21wX2d0aWRfZnJvbV90aWQoY2hpbGRfdGlkLCB0ZWFtKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9pZCwgY2hpbGRfdGlkKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAoKnJlZHVjZSkodGhpc190aHItPnRoLnRoX2xvY2FsLnJlZHVjZV9kYXRhLCBjaGlsZF90aHItPnRoLnRoX2xvY2FsLnJlZHVjZV9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBBbGwgc3Vib3JkaW5hdGVzIGFyZSBnYXRoZXJlZDsgbm93IHJlbGVhc2UgcGFyZW50IGlmIG5vdCBtYXN0ZXIgdGhyZWFkCisKKyAgICBpZiAoIUtNUF9NQVNURVJfVElEKHRpZCkpIHsgLy8gd29ya2VyIHRocmVhZHMgcmVsZWFzZSBwYXJlbnQgaW4gaGllcmFyY2h5CisgICAgICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2hpZXJhcmNoaWNhbF9iYXJyaWVyX2dhdGhlcjogVCMlZCglZDolZCkgcmVsZWFzaW5nIFQjJWQoJWQ6JWQpICIKKyAgICAgICAgICAgICAgICAgICAgICAiYXJyaXZlZCglcCk6ICV1ID0+ICV1XG4iLCBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwKKyAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGlkKHRocl9iYXItPnBhcmVudF90aWQsIHRlYW0pLCB0ZWFtLT50LnRfaWQsIHRocl9iYXItPnBhcmVudF90aWQsCisgICAgICAgICAgICAgICAgICAgICAgJnRocl9iYXItPmJfYXJyaXZlZCwgdGhyX2Jhci0+Yl9hcnJpdmVkLCB0aHJfYmFyLT5iX2Fycml2ZWQrS01QX0JBUlJJRVJfU1RBVEVfQlVNUCkpOworICAgICAgICAvKiBNYXJrIGFycml2YWwgdG8gcGFyZW50OiBBZnRlciBwZXJmb3JtaW5nIHRoaXMgd3JpdGUsIGEgd29ya2VyIHRocmVhZCBtYXkgbm90IGFzc3VtZSB0aGF0CisgICAgICAgICAgIHRoZSB0ZWFtIGlzIHZhbGlkIGFueSBtb3JlIC0gaXQgY291bGQgYmUgZGVhbGxvY2F0ZWQgYnkgdGhlIG1hc3RlciB0aHJlYWQgYXQgYW55IHRpbWUuICovCisgICAgICAgIGlmICh0aHJfYmFyLT5teV9sZXZlbCB8fCBfX2ttcF9kZmx0X2Jsb2NrdGltZSAhPSBLTVBfTUFYX0JMT0NLVElNRQorICAgICAgICAgICAgfHwgIXRocl9iYXItPnVzZV9vbmNvcmVfYmFycmllcikgeyAvLyBQYXJlbnQgaXMgd2FpdGluZyBvbiBteSBiX2Fycml2ZWQgZmxhZzsgcmVsZWFzZSBpdAorICAgICAgICAgICAga21wX2ZsYWdfNjQgZmxhZygmdGhyX2Jhci0+Yl9hcnJpdmVkLCBvdGhlcl90aHJlYWRzW3Rocl9iYXItPnBhcmVudF90aWRdKTsKKyAgICAgICAgICAgIGZsYWcucmVsZWFzZSgpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeyAvLyBMZWFmIGRvZXMgc3BlY2lhbCByZWxlYXNlIG9uIHRoZSAib2Zmc2V0IiBiaXRzIG9mIHBhcmVudCdzIGJfYXJyaXZlZCBmbGFnCisgICAgICAgICAgICB0aHJfYmFyLT5iX2Fycml2ZWQgPSAoa21wX3VpbnQ2NCl0ZWFtLT50LnRfYmFyW2J0XS5iX2Fycml2ZWQgKyBLTVBfQkFSUklFUl9TVEFURV9CVU1QOworICAgICAgICAgICAga21wX2ZsYWdfb25jb3JlIGZsYWcoJnRocl9iYXItPnBhcmVudF9iYXItPmJfYXJyaXZlZCwgdGhyX2Jhci0+b2Zmc2V0KTsKKyAgICAgICAgICAgIGZsYWcuc2V0X3dhaXRlcihvdGhlcl90aHJlYWRzW3Rocl9iYXItPnBhcmVudF90aWRdKTsKKyAgICAgICAgICAgIGZsYWcucmVsZWFzZSgpOworICAgICAgICB9CisgICAgfSBlbHNlIHsgLy8gTWFzdGVyIHRocmVhZCBuZWVkcyB0byB1cGRhdGUgdGhlIHRlYW0ncyBiX2Fycml2ZWQgdmFsdWUKKyAgICAgICAgdGVhbS0+dC50X2JhcltidF0uYl9hcnJpdmVkID0gKGttcF91aW50MzIpbmV3X3N0YXRlOworICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9oaWVyYXJjaGljYWxfYmFycmllcl9nYXRoZXI6IFQjJWQoJWQ6JWQpIHNldCB0ZWFtICVkIGFycml2ZWQoJXApID0gJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIHRlYW0tPnQudF9pZCwgJnRlYW0tPnQudF9iYXJbYnRdLmJfYXJyaXZlZCwgdGVhbS0+dC50X2JhcltidF0uYl9hcnJpdmVkKSk7CisgICAgfQorICAgIC8vIElmIG5lc3RlZCwgYnV0IG91dGVyIGxldmVsIGlzIHRvcC1sZXZlbCwgcmVzdW1lIHVzZSBvZiBvbmNvcmUgb3B0aW1pemF0aW9uCisgICAgaWYgKHRoaXNfdGhyLT50aC50aF90ZWFtLT50LnRfbGV2ZWwgPD0yKSB0aHJfYmFyLT51c2Vfb25jb3JlX2JhcnJpZXIgPSAxOworICAgIGVsc2UgdGhyX2Jhci0+dXNlX29uY29yZV9iYXJyaWVyID0gMDsKKyAgICAvLyBJcyB0aGUgdGVhbSBhY2Nlc3MgYmVsb3cgdW5zYWZlIG9yIGp1c3QgdGVjaG5pY2FsbHkgaW52YWxpZD8KKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9oaWVyYXJjaGljYWxfYmFycmllcl9nYXRoZXI6IFQjJWQoJWQ6JWQpIGV4aXQgZm9yIGJhcnJpZXIgdHlwZSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCBidCkpOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfaGllcmFyY2hpY2FsX2JhcnJpZXJfcmVsZWFzZShlbnVtIGJhcnJpZXJfdHlwZSBidCwga21wX2luZm9fdCAqdGhpc190aHIsIGludCBndGlkLCBpbnQgdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJvcGFnYXRlX2ljdnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcodm9pZCAqIGl0dF9zeW5jX29iaikgKQoreworICAgIEtNUF9USU1FX0JMT0NLKEtNUF9oaWVyX3JlbGVhc2UpOworICAgIHJlZ2lzdGVyIGttcF90ZWFtX3QgKnRlYW07CisgICAgcmVnaXN0ZXIga21wX2JzdGF0ZV90ICp0aHJfYmFyID0gJnRoaXNfdGhyLT50aC50aF9iYXJbYnRdLmJiOworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgbnByb2M7CisgICAgYm9vbCB0ZWFtX2NoYW5nZSA9IGZhbHNlOyAvLyBpbmRpY2F0ZXMgb24tY29yZSBiYXJyaWVyIHNob3VsZG4ndCBiZSB1c2VkCisKKyAgICBpZiAoS01QX01BU1RFUl9USUQodGlkKSkgeworICAgICAgICB0ZWFtID0gX19rbXBfdGhyZWFkc1tndGlkXS0+dGgudGhfdGVhbTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCh0ZWFtICE9IE5VTEwpOworICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9oaWVyYXJjaGljYWxfYmFycmllcl9yZWxlYXNlOiBUIyVkKCVkOiVkKSBtYXN0ZXIgZW50ZXJlZCBiYXJyaWVyIHR5cGUgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIGJ0KSk7CisgICAgfQorICAgIGVsc2UgeyAvLyBXb3JrZXIgdGhyZWFkcworICAgICAgICAvLyBXYWl0IGZvciBwYXJlbnQgdGhyZWFkIHRvIHJlbGVhc2UgbWUKKyAgICAgICAgaWYgKCF0aHJfYmFyLT51c2Vfb25jb3JlX2JhcnJpZXIgfHwgX19rbXBfZGZsdF9ibG9ja3RpbWUgIT0gS01QX01BWF9CTE9DS1RJTUUKKyAgICAgICAgICAgIHx8IHRocl9iYXItPm15X2xldmVsICE9IDAgfHwgdGhyX2Jhci0+dGVhbSA9PSBOVUxMKSB7CisgICAgICAgICAgICAvLyBVc2UgdHJhZGl0aW9uYWwgbWV0aG9kIG9mIHdhaXRpbmcgb24gbXkgb3duIGJfZ28gZmxhZworICAgICAgICAgICAgdGhyX2Jhci0+d2FpdF9mbGFnID0gS01QX0JBUlJJRVJfT1dOX0ZMQUc7CisgICAgICAgICAgICBrbXBfZmxhZ182NCBmbGFnKCZ0aHJfYmFyLT5iX2dvLCBLTVBfQkFSUklFUl9TVEFURV9CVU1QKTsKKyAgICAgICAgICAgIGZsYWcud2FpdCh0aGlzX3RociwgVFJVRQorICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaikgKTsKKyAgICAgICAgICAgIFRDV184KHRocl9iYXItPmJfZ28sIEtNUF9JTklUX0JBUlJJRVJfU1RBVEUpOyAvLyBSZXNldCBteSBiX2dvIGZsYWcgZm9yIG5leHQgdGltZQorICAgICAgICB9CisgICAgICAgIGVsc2UgeyAvLyBUaHJlYWQgYmFycmllciBkYXRhIGlzIGluaXRpYWxpemVkLCB0aGlzIGlzIGEgbGVhZiwgYmxvY2t0aW1lIGlzIGluZmluaXRlLCBub3QgbmVzdGVkCisgICAgICAgICAgICAvLyBXYWl0IG9uIG15ICJvZmZzZXQiIGJpdHMgb24gcGFyZW50J3MgYl9nbyBmbGFnCisgICAgICAgICAgICB0aHJfYmFyLT53YWl0X2ZsYWcgPSBLTVBfQkFSUklFUl9QQVJFTlRfRkxBRzsKKyAgICAgICAgICAgIGttcF9mbGFnX29uY29yZSBmbGFnKCZ0aHJfYmFyLT5wYXJlbnRfYmFyLT5iX2dvLCBLTVBfQkFSUklFUl9TVEFURV9CVU1QLCB0aHJfYmFyLT5vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidCwgdGhpc190aHIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaikgKTsKKyAgICAgICAgICAgIGZsYWcud2FpdCh0aGlzX3RociwgVFJVRQorICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaikgKTsKKyAgICAgICAgICAgIGlmICh0aHJfYmFyLT53YWl0X2ZsYWcgPT0gS01QX0JBUlJJRVJfU1dJVENISU5HKSB7IC8vIFRocmVhZCB3YXMgc3dpdGNoZWQgdG8gb3duIGJfZ28KKyAgICAgICAgICAgICAgICBUQ1dfOCh0aHJfYmFyLT5iX2dvLCBLTVBfSU5JVF9CQVJSSUVSX1NUQVRFKTsgLy8gUmVzZXQgbXkgYl9nbyBmbGFnIGZvciBuZXh0IHRpbWUKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeyAvLyBSZXNldCBteSBiaXRzIG9uIHBhcmVudCdzIGJfZ28gZmxhZworICAgICAgICAgICAgICAgICgoY2hhciopJih0aHJfYmFyLT5wYXJlbnRfYmFyLT5iX2dvKSlbdGhyX2Jhci0+b2Zmc2V0XSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdGhyX2Jhci0+d2FpdF9mbGFnID0gS01QX0JBUlJJRVJfTk9UX1dBSVRJTkc7CisgICAgICAgIC8vIEVhcmx5IGV4aXQgZm9yIHJlYXBpbmcgdGhyZWFkcyByZWxlYXNpbmcgZm9ya2pvaW4gYmFycmllcgorICAgICAgICBpZiAoYnQgPT0gYnNfZm9ya2pvaW5fYmFycmllciAmJiBUQ1JfNChfX2ttcF9nbG9iYWwuZy5nX2RvbmUpKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAvLyBUaGUgd29ya2VyIHRocmVhZCBtYXkgbm93IGFzc3VtZSB0aGF0IHRoZSB0ZWFtIGlzIHZhbGlkLgorICAgICAgICB0ZWFtID0gX19rbXBfdGhyZWFkc1tndGlkXS0+dGgudGhfdGVhbTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCh0ZWFtICE9IE5VTEwpOworICAgICAgICB0aWQgPSBfX2ttcF90aWRfZnJvbV9ndGlkKGd0aWQpOworCisgICAgICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2hpZXJhcmNoaWNhbF9iYXJyaWVyX3JlbGVhc2U6IFQjJWQoJWQ6JWQpIHNldCBnbyglcCkgPSAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwgJnRocl9iYXItPmJfZ28sIEtNUF9JTklUX0JBUlJJRVJfU1RBVEUpKTsKKyAgICAgICAgS01QX01CKCk7ICAvLyBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuCisgICAgfQorCisgICAgaWYgKHRoaXNfdGhyLT50aC50aF90ZWFtLT50LnRfbGV2ZWwgPD0gMSkgdGhyX2Jhci0+dXNlX29uY29yZV9iYXJyaWVyID0gMTsKKyAgICBlbHNlIHRocl9iYXItPnVzZV9vbmNvcmVfYmFycmllciA9IDA7CisgICAgbnByb2MgPSB0aGlzX3Roci0+dGgudGhfdGVhbV9ucHJvYzsKKworICAgIC8vIElmIHRoZSB0ZWFtIHNpemUgaGFzIGluY3JlYXNlZCwgd2Ugc3RpbGwgY29tbXVuaWNhdGUgd2l0aCBvbGQgbGVhdmVzIHZpYSBvbmNvcmUgYmFycmllci4KKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgb2xkX2xlYWZfa2lkcyA9IHRocl9iYXItPmxlYWZfa2lkczsKKyAgICBrbXBfdWludDY0IG9sZF9sZWFmX3N0YXRlID0gdGhyX2Jhci0+bGVhZl9zdGF0ZTsKKyAgICB0ZWFtX2NoYW5nZSA9IF9fa21wX2luaXRfaGllcmFyY2hpY2FsX2JhcnJpZXJfdGhyZWFkKGJ0LCB0aHJfYmFyLCBucHJvYywgZ3RpZCwgdGlkLCB0ZWFtKTsKKyAgICAvLyBCdXQgaWYgdGhlIGVudGlyZSB0ZWFtIGNoYW5nZXMsIHdlIHdvbid0IHVzZSBvbmNvcmUgYmFycmllciBhdCBhbGwKKyAgICBpZiAodGVhbV9jaGFuZ2UpIG9sZF9sZWFmX2tpZHMgPSAwOworCisjaWYgS01QX0JBUlJJRVJfSUNWX1BVU0gKKyAgICBpZiAocHJvcGFnYXRlX2ljdnMpIHsKKyAgICAgICAgaWYgKEtNUF9NQVNURVJfVElEKHRpZCkpIHsgLy8gbWFzdGVyIGFscmVhZHkgaGFzIGNvcHkgaW4gZmluYWwgZGVzdGluYXRpb247IGNvcHkKKyAgICAgICAgICAgIGNvcHlfaWN2cygmdGhyX2Jhci0+dGhfZml4ZWRfaWN2cywgJnRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhW3RpZF0udGRfaWN2cyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoX19rbXBfZGZsdF9ibG9ja3RpbWUgPT0gS01QX01BWF9CTE9DS1RJTUUgJiYgdGhyX2Jhci0+dXNlX29uY29yZV9iYXJyaWVyKSB7IC8vIG9wdGltaXphdGlvbiBmb3IgaW5mIGJsb2NrdGltZQorICAgICAgICAgICAgaWYgKCF0aHJfYmFyLT5teV9sZXZlbCkgLy8gSSdtIGEgbGVhZiBpbiB0aGUgaGllcmFyY2h5IChteV9sZXZlbD09MCkKKyAgICAgICAgICAgICAgICAvLyBsZWF2ZXMgKG9uLWNvcmUgY2hpbGRyZW4pIHB1bGwgcGFyZW50J3MgZml4ZWQgSUNWcyBkaXJlY3RseSB0byBsb2NhbCBJQ1Ygc3RvcmUKKyAgICAgICAgICAgICAgICBjb3B5X2ljdnMoJnRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhW3RpZF0udGRfaWN2cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRocl9iYXItPnBhcmVudF9iYXItPnRoX2ZpeGVkX2ljdnMpOworICAgICAgICAgICAgLy8gbm9uLWxlYXZlcyB3aWxsIGdldCBJQ1ZzIHBpZ2d5YmFja2VkIHdpdGggYl9nbyB2aWEgTkdPIHN0b3JlCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7IC8vIGJsb2NrdGltZSBpcyBub3QgaW5maW5pdGU7IHB1bGwgSUNWcyBmcm9tIHBhcmVudCdzIGZpeGVkIElDVnMKKyAgICAgICAgICAgIGlmICh0aHJfYmFyLT5teV9sZXZlbCkgLy8gbm90IGEgbGVhZjsgY29weSBJQ1ZzIHRvIG15IGZpeGVkIElDVnMgY2hpbGQgY2FuIGFjY2VzcworICAgICAgICAgICAgICAgIGNvcHlfaWN2cygmdGhyX2Jhci0+dGhfZml4ZWRfaWN2cywgJnRocl9iYXItPnBhcmVudF9iYXItPnRoX2ZpeGVkX2ljdnMpOworICAgICAgICAgICAgZWxzZSAvLyBsZWF2ZXMgY29weSBwYXJlbnQncyBmaXhlZCBJQ1ZzIGRpcmVjdGx5IHRvIGxvY2FsIElDViBzdG9yZQorICAgICAgICAgICAgICAgIGNvcHlfaWN2cygmdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbdGlkXS50ZF9pY3ZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhyX2Jhci0+cGFyZW50X2Jhci0+dGhfZml4ZWRfaWN2cyk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLy8gS01QX0JBUlJJRVJfSUNWX1BVU0gKKworICAgIC8vIE5vdywgcmVsZWFzZSBteSBjaGlsZHJlbgorICAgIGlmICh0aHJfYmFyLT5teV9sZXZlbCkgeyAvLyBub3QgYSBsZWFmCisgICAgICAgIHJlZ2lzdGVyIGttcF9pbnQzMiBjaGlsZF90aWQ7CisgICAgICAgIGttcF91aW50MzIgbGFzdDsKKyAgICAgICAgaWYgKF9fa21wX2RmbHRfYmxvY2t0aW1lID09IEtNUF9NQVhfQkxPQ0tUSU1FICYmIHRocl9iYXItPnVzZV9vbmNvcmVfYmFycmllcikgeworICAgICAgICAgICAgaWYgKEtNUF9NQVNURVJfVElEKHRpZCkpIHsgLy8gZG8gYSBmbGF0IHJlbGVhc2UKKyAgICAgICAgICAgICAgICAvLyBTZXQgbG9jYWwgYl9nbyB0byBidW1wIGNoaWxkcmVuIHZpYSBOR08gc3RvcmUgb2YgdGhlIGNhY2hlIGxpbmUgY29udGFpbmluZyBJVkNzIGFuZCBiX2dvLgorICAgICAgICAgICAgICAgIHRocl9iYXItPmJfZ28gPSBLTVBfQkFSUklFUl9TVEFURV9CVU1QOworICAgICAgICAgICAgICAgIC8vIFVzZSBuZ28gc3RvcmVzIGlmIGF2YWlsYWJsZTsgYl9nbyBwaWdneWJhY2tzIGluIHRoZSBsYXN0IDggYnl0ZXMgb2YgdGhlIGNhY2hlIGxpbmUKKyAgICAgICAgICAgICAgICBuZ29fbG9hZCgmdGhyX2Jhci0+dGhfZml4ZWRfaWN2cyk7CisgICAgICAgICAgICAgICAgLy8gVGhpcyBsb29wcyBvdmVyIGFsbCB0aGUgdGhyZWFkcyBza2lwcGluZyBvbmx5IHRoZSBsZWFmIG5vZGVzIGluIHRoZSBoaWVyYXJjaHkKKyAgICAgICAgICAgICAgICBmb3IgKGNoaWxkX3RpZD10aHJfYmFyLT5za2lwX3Blcl9sZXZlbFsxXTsgY2hpbGRfdGlkPChpbnQpbnByb2M7IGNoaWxkX3RpZCs9dGhyX2Jhci0+c2tpcF9wZXJfbGV2ZWxbMV0pIHsKKyAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIga21wX2JzdGF0ZV90ICpjaGlsZF9iYXIgPSAmdGVhbS0+dC50X3RocmVhZHNbY2hpbGRfdGlkXS0+dGgudGhfYmFyW2J0XS5iYjsKKyAgICAgICAgICAgICAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfaGllcmFyY2hpY2FsX2JhcnJpZXJfcmVsZWFzZTogVCMlZCglZDolZCkgcmVsZWFzaW5nIFQjJWQoJWQ6JWQpIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZ28oJXApOiAldSA9PiAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwgX19rbXBfZ3RpZF9mcm9tX3RpZChjaGlsZF90aWQsIHRlYW0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9pZCwgY2hpbGRfdGlkLCAmY2hpbGRfYmFyLT5iX2dvLCBjaGlsZF9iYXItPmJfZ28sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRfYmFyLT5iX2dvICsgS01QX0JBUlJJRVJfU1RBVEVfQlVNUCkpOworICAgICAgICAgICAgICAgICAgICAvLyBVc2UgbmdvIHN0b3JlIChpZiBhdmFpbGFibGUpIHRvIGJvdGggc3RvcmUgSUNWcyBhbmQgcmVsZWFzZSBjaGlsZCB2aWEgY2hpbGQncyBiX2dvCisgICAgICAgICAgICAgICAgICAgIG5nb19zdG9yZV9nbygmY2hpbGRfYmFyLT50aF9maXhlZF9pY3ZzLCAmdGhyX2Jhci0+dGhfZml4ZWRfaWN2cyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG5nb19zeW5jKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBUQ1dfOCh0aHJfYmFyLT5iX2dvLCBLTVBfSU5JVF9CQVJSSUVSX1NUQVRFKTsgLy8gUmVzZXQgbXkgYl9nbyBmbGFnIGZvciBuZXh0IHRpbWUKKyAgICAgICAgICAgIC8vIE5vdywgcmVsZWFzZSBsZWFmIGNoaWxkcmVuCisgICAgICAgICAgICBpZiAodGhyX2Jhci0+bGVhZl9raWRzKSB7IC8vIGlmIHRoZXJlIGFyZSBhbnkKKyAgICAgICAgICAgICAgICAvLyBXZSB0ZXN0IHRlYW1fY2hhbmdlIG9uIHRoZSBvZmYtY2hhbmNlIHRoYXQgdGhlIGxldmVsIDEgdGVhbSBjaGFuZ2VkLgorICAgICAgICAgICAgICAgIGlmICh0ZWFtX2NoYW5nZSB8fCBvbGRfbGVhZl9raWRzIDwgdGhyX2Jhci0+bGVhZl9raWRzKSB7IC8vIHNvbWUgb2xkIGxlYWZfa2lkcywgc29tZSBuZXcKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9sZF9sZWFmX2tpZHMpIHsgLy8gcmVsZWFzZSBvbGQgbGVhZiBraWRzCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJfYmFyLT5iX2dvIHw9IG9sZF9sZWFmX3N0YXRlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIFJlbGVhc2UgbmV3IGxlYWYga2lkcworICAgICAgICAgICAgICAgICAgICBsYXN0ID0gdGlkK3Rocl9iYXItPnNraXBfcGVyX2xldmVsWzFdOworICAgICAgICAgICAgICAgICAgICBpZiAobGFzdCA+IG5wcm9jKSBsYXN0ID0gbnByb2M7CisgICAgICAgICAgICAgICAgICAgIGZvciAoY2hpbGRfdGlkPXRpZCsxK29sZF9sZWFmX2tpZHM7IGNoaWxkX3RpZDwoaW50KWxhc3Q7ICsrY2hpbGRfdGlkKSB7IC8vIHNraXBfcGVyX2xldmVsWzBdPTEKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGttcF9pbmZvX3QgICAqY2hpbGRfdGhyID0gdGVhbS0+dC50X3RocmVhZHNbY2hpbGRfdGlkXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGttcF9ic3RhdGVfdCAqY2hpbGRfYmFyID0gJmNoaWxkX3Roci0+dGgudGhfYmFyW2J0XS5iYjsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2hpZXJhcmNoaWNhbF9iYXJyaWVyX3JlbGVhc2U6IFQjJWQoJWQ6JWQpIHJlbGVhc2luZyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBUIyVkKCVkOiVkKSBnbyglcCk6ICV1ID0+ICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwgX19rbXBfZ3RpZF9mcm9tX3RpZChjaGlsZF90aWQsIHRlYW0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfaWQsIGNoaWxkX3RpZCwgJmNoaWxkX2Jhci0+Yl9nbywgY2hpbGRfYmFyLT5iX2dvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZF9iYXItPmJfZ28gKyBLTVBfQkFSUklFUl9TVEFURV9CVU1QKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZWxlYXNlIGNoaWxkIHVzaW5nIGNoaWxkJ3MgYl9nbyBmbGFnCisgICAgICAgICAgICAgICAgICAgICAgICBrbXBfZmxhZ182NCBmbGFnKCZjaGlsZF9iYXItPmJfZ28sIGNoaWxkX3Rocik7CisgICAgICAgICAgICAgICAgICAgICAgICBmbGFnLnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsgLy8gUmVsZWFzZSBhbGwgY2hpbGRyZW4gYXQgb25jZSB3aXRoIGxlYWZfc3RhdGUgYml0cyBvbiBteSBvd24gYl9nbyBmbGFnCisgICAgICAgICAgICAgICAgICAgIHRocl9iYXItPmJfZ28gfD0gdGhyX2Jhci0+bGVhZl9zdGF0ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7IC8vIEJsb2NrdGltZSBpcyBub3QgaW5maW5pdGU7IGRvIGEgc2ltcGxlIGhpZXJhcmNoaWNhbCByZWxlYXNlCisgICAgICAgICAgICBmb3IgKGludCBkPXRocl9iYXItPm15X2xldmVsLTE7IGQ+PTA7IC0tZCkgeyAvLyBSZWxlYXNlIGhpZ2hlc3QgbGV2ZWwgdGhyZWFkcyBmaXJzdAorICAgICAgICAgICAgICAgIGxhc3QgPSB0aWQrdGhyX2Jhci0+c2tpcF9wZXJfbGV2ZWxbZCsxXTsKKyAgICAgICAgICAgICAgICBrbXBfdWludDMyIHNraXAgPSB0aHJfYmFyLT5za2lwX3Blcl9sZXZlbFtkXTsKKyAgICAgICAgICAgICAgICBpZiAobGFzdCA+IG5wcm9jKSBsYXN0ID0gbnByb2M7CisgICAgICAgICAgICAgICAgZm9yIChjaGlsZF90aWQ9dGlkK3NraXA7IGNoaWxkX3RpZDwoaW50KWxhc3Q7IGNoaWxkX3RpZCs9c2tpcCkgeworICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBrbXBfaW5mb190ICAgKmNoaWxkX3RociA9IHRlYW0tPnQudF90aHJlYWRzW2NoaWxkX3RpZF07CisgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGttcF9ic3RhdGVfdCAqY2hpbGRfYmFyID0gJmNoaWxkX3Roci0+dGgudGhfYmFyW2J0XS5iYjsKKyAgICAgICAgICAgICAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfaGllcmFyY2hpY2FsX2JhcnJpZXJfcmVsZWFzZTogVCMlZCglZDolZCkgcmVsZWFzaW5nIFQjJWQoJWQ6JWQpIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZ28oJXApOiAldSA9PiAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwgX19rbXBfZ3RpZF9mcm9tX3RpZChjaGlsZF90aWQsIHRlYW0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9pZCwgY2hpbGRfdGlkLCAmY2hpbGRfYmFyLT5iX2dvLCBjaGlsZF9iYXItPmJfZ28sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRfYmFyLT5iX2dvICsgS01QX0JBUlJJRVJfU1RBVEVfQlVNUCkpOworICAgICAgICAgICAgICAgICAgICAvLyBSZWxlYXNlIGNoaWxkIHVzaW5nIGNoaWxkJ3MgYl9nbyBmbGFnCisgICAgICAgICAgICAgICAgICAgIGttcF9mbGFnXzY0IGZsYWcoJmNoaWxkX2Jhci0+Yl9nbywgY2hpbGRfdGhyKTsKKyAgICAgICAgICAgICAgICAgICAgZmxhZy5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisjaWYgS01QX0JBUlJJRVJfSUNWX1BVU0gKKyAgICAgICAgaWYgKHByb3BhZ2F0ZV9pY3ZzICYmICFLTVBfTUFTVEVSX1RJRCh0aWQpKSAvLyBub24tbGVhdmVzIGNvcHkgSUNWcyBmcm9tIGZpeGVkIElDVnMgdG8gbG9jYWwgZGVzdAorICAgICAgICAgICAgY29weV9pY3ZzKCZ0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVt0aWRdLnRkX2ljdnMsICZ0aHJfYmFyLT50aF9maXhlZF9pY3ZzKTsKKyNlbmRpZiAvLyBLTVBfQkFSUklFUl9JQ1ZfUFVTSAorICAgIH0KKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9oaWVyYXJjaGljYWxfYmFycmllcl9yZWxlYXNlOiBUIyVkKCVkOiVkKSBleGl0IGZvciBiYXJyaWVyIHR5cGUgJWRcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwgYnQpKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFbmQgb2YgQmFycmllciBBbGdvcml0aG1zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gSW50ZXJuYWwgZnVuY3Rpb24gdG8gZG8gYSBiYXJyaWVyLgorLyogSWYgaXNfc3BsaXQgaXMgdHJ1ZSwgZG8gYSBzcGxpdCBiYXJyaWVyLCBvdGhlcndpc2UsIGRvIGEgcGxhaW4gYmFycmllcgorICAgSWYgcmVkdWNlIGlzIG5vbi1OVUxMLCBkbyBhIHNwbGl0IHJlZHVjdGlvbiBiYXJyaWVyLCBvdGhlcndpc2UsIGRvIGEgc3BsaXQgYmFycmllcgorICAgUmV0dXJucyAwIGlmIG1hc3RlciB0aHJlYWQsIDEgaWYgd29ya2VyIHRocmVhZC4gICovCitpbnQKK19fa21wX2JhcnJpZXIoZW51bSBiYXJyaWVyX3R5cGUgYnQsIGludCBndGlkLCBpbnQgaXNfc3BsaXQsIHNpemVfdCByZWR1Y2Vfc2l6ZSwKKyAgICAgICAgICAgICAgdm9pZCAqcmVkdWNlX2RhdGEsIHZvaWQgKCpyZWR1Y2UpKHZvaWQgKiwgdm9pZCAqKSkKK3sKKyAgICBLTVBfVElNRV9CTE9DSyhLTVBfYmFycmllcik7CisgICAgcmVnaXN0ZXIgaW50IHRpZCA9IF9fa21wX3RpZF9mcm9tX2d0aWQoZ3RpZCk7CisgICAgcmVnaXN0ZXIga21wX2luZm9fdCAqdGhpc190aHIgPSBfX2ttcF90aHJlYWRzW2d0aWRdOworICAgIHJlZ2lzdGVyIGttcF90ZWFtX3QgKnRlYW0gPSB0aGlzX3Roci0+dGgudGhfdGVhbTsKKyAgICByZWdpc3RlciBpbnQgc3RhdHVzID0gMDsKKyAgICBpZGVudF90ICpsb2MgPSBfX2ttcF90aHJlYWRzW2d0aWRdLT50aC50aF9pZGVudDsKKworICAgIEtBX1RSQUNFKDE1LCAoIl9fa21wX2JhcnJpZXI6IFQjJWQoJWQ6JWQpIGhhcyBhcnJpdmVkXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgX19rbXBfdGVhbV9mcm9tX2d0aWQoZ3RpZCktPnQudF9pZCwgX19rbXBfdGlkX2Zyb21fZ3RpZChndGlkKSkpOworCisgICAgaWYgKCEgdGVhbS0+dC50X3NlcmlhbGl6ZWQpIHsKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgIC8vIFRoaXMgdmFsdWUgd2lsbCBiZSB1c2VkIGluIGl0dCBub3RpZnkgZXZlbnRzIGJlbG93LgorICAgICAgICB2b2lkICppdHRfc3luY19vYmogPSBOVUxMOworIyBpZiBVU0VfSVRUX05PVElGWQorICAgICAgICBpZiAoX19pdHRfc3luY19jcmVhdGVfcHRyIHx8IEtNUF9JVFRfREVCVUcpCisgICAgICAgICAgICBpdHRfc3luY19vYmogPSBfX2ttcF9pdHRfYmFycmllcl9vYmplY3QoZ3RpZCwgYnQsIDEpOworIyBlbmRpZgorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICAgICAgaWYgKF9fa21wX3Rhc2tpbmdfbW9kZSA9PSB0c2ttX2V4dHJhX2JhcnJpZXIpIHsKKyAgICAgICAgICAgIF9fa21wX3Rhc2tpbmdfYmFycmllcih0ZWFtLCB0aGlzX3RociwgZ3RpZCk7CisgICAgICAgICAgICBLQV9UUkFDRSgxNSwgKCJfX2ttcF9iYXJyaWVyOiBUIyVkKCVkOiVkKSBwYXN0IHRhc2tpbmcgYmFycmllclxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgX19rbXBfdGVhbV9mcm9tX2d0aWQoZ3RpZCktPnQudF9pZCwgX19rbXBfdGlkX2Zyb21fZ3RpZChndGlkKSkpOworICAgICAgICB9CisKKyAgICAgICAgLyogQ29weSB0aGUgYmxvY2t0aW1lIGluZm8gdG8gdGhlIHRocmVhZCwgd2hlcmUgX19rbXBfd2FpdF90ZW1wbGF0ZSgpIGNhbiBhY2Nlc3MgaXQgd2hlbgorICAgICAgICAgICB0aGUgdGVhbSBzdHJ1Y3QgaXMgbm90IGd1YXJhbnRlZWQgdG8gZXhpc3QuICovCisgICAgICAgIC8vIFNlZSBub3RlIGFib3V0IHRoZSBjb3JyZXNwb25kaW5nIGNvZGUgaW4gX19rbXBfam9pbl9iYXJyaWVyKCkgYmVpbmcgcGVyZm9ybWFuY2UtY3JpdGljYWwuCisgICAgICAgIGlmIChfX2ttcF9kZmx0X2Jsb2NrdGltZSAhPSBLTVBfTUFYX0JMT0NLVElNRSkgeworICAgICAgICAgICAgdGhpc190aHItPnRoLnRoX3RlYW1fYnRfaW50ZXJ2YWxzID0gdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbdGlkXS50ZF9pY3ZzLmJ0X2ludGVydmFsczsKKyAgICAgICAgICAgIHRoaXNfdGhyLT50aC50aF90ZWFtX2J0X3NldCA9IHRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhW3RpZF0udGRfaWN2cy5idF9zZXQ7CisgICAgICAgIH0KKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgaWYgKF9faXR0X3N5bmNfY3JlYXRlX3B0ciB8fCBLTVBfSVRUX0RFQlVHKQorICAgICAgICAgICAgX19rbXBfaXR0X2JhcnJpZXJfc3RhcnRpbmcoZ3RpZCwgaXR0X3N5bmNfb2JqKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICAgICAgaWYgKHJlZHVjZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAvL0tNUF9ERUJVR19BU1NFUlQoIGlzX3NwbGl0ID09IFRSVUUgKTsgIC8vICNDNjk5NTYKKyAgICAgICAgICAgIHRoaXNfdGhyLT50aC50aF9sb2NhbC5yZWR1Y2VfZGF0YSA9IHJlZHVjZV9kYXRhOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoX19rbXBfYmFycmllcl9nYXRoZXJfcGF0dGVybltidF0pIHsKKyAgICAgICAgY2FzZSBicF9oeXBlcl9iYXI6IHsKKyAgICAgICAgICAgIEtNUF9BU1NFUlQoX19rbXBfYmFycmllcl9nYXRoZXJfYnJhbmNoX2JpdHNbYnRdKTsgLy8gZG9uJ3Qgc2V0IGJyYW5jaCBiaXRzIHRvIDA7IHVzZSBsaW5lYXIKKyAgICAgICAgICAgIF9fa21wX2h5cGVyX2JhcnJpZXJfZ2F0aGVyKGJ0LCB0aGlzX3RociwgZ3RpZCwgdGlkLCByZWR1Y2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaikgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgYnBfaGllcmFyY2hpY2FsX2JhcjogeworICAgICAgICAgICAgX19rbXBfaGllcmFyY2hpY2FsX2JhcnJpZXJfZ2F0aGVyKGJ0LCB0aGlzX3RociwgZ3RpZCwgdGlkLCByZWR1Y2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgYnBfdHJlZV9iYXI6IHsKKyAgICAgICAgICAgIEtNUF9BU1NFUlQoX19rbXBfYmFycmllcl9nYXRoZXJfYnJhbmNoX2JpdHNbYnRdKTsgLy8gZG9uJ3Qgc2V0IGJyYW5jaCBiaXRzIHRvIDA7IHVzZSBsaW5lYXIKKyAgICAgICAgICAgIF9fa21wX3RyZWVfYmFycmllcl9nYXRoZXIoYnQsIHRoaXNfdGhyLCBndGlkLCB0aWQsIHJlZHVjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgICBfX2ttcF9saW5lYXJfYmFycmllcl9nYXRoZXIoYnQsIHRoaXNfdGhyLCBndGlkLCB0aWQsIHJlZHVjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaikgKTsKKyAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgS01QX01CKCk7CisKKyAgICAgICAgaWYgKEtNUF9NQVNURVJfVElEKHRpZCkpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IDA7CisgICAgICAgICAgICBpZiAoX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMpIHsKKyAgICAgICAgICAgICAgICBfX2ttcF90YXNrX3RlYW1fd2FpdCh0aGlzX3RociwgdGVhbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaikgKTsKKyAgICAgICAgICAgICAgICBfX2ttcF90YXNrX3RlYW1fc2V0dXAodGhpc190aHIsIHRlYW0pOworICAgICAgICAgICAgfQorCisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgICAgICAvKiBUT0RPOiBJbiBjYXNlIG9mIHNwbGl0IHJlZHVjdGlvbiBiYXJyaWVyLCBtYXN0ZXIgdGhyZWFkIG1heSBzZW5kIGFjcXVpcmVkIGV2ZW50IGVhcmx5LAorICAgICAgICAgICAgICAgYmVmb3JlIHRoZSBmaW5hbCBzdW1tYXRpb24gaW50byB0aGUgc2hhcmVkIHZhcmlhYmxlIGlzIGRvbmUgKGZpbmFsIHN1bW1hdGlvbiBjYW4gYmUgYQorICAgICAgICAgICAgICAgbG9uZyBvcGVyYXRpb24gZm9yIGFycmF5IHJlZHVjdGlvbnMpLiAgKi8KKyAgICAgICAgICAgIGlmIChfX2l0dF9zeW5jX2NyZWF0ZV9wdHIgfHwgS01QX0lUVF9ERUJVRykKKyAgICAgICAgICAgICAgICBfX2ttcF9pdHRfYmFycmllcl9taWRkbGUoZ3RpZCwgaXR0X3N5bmNfb2JqKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisjaWYgVVNFX0lUVF9CVUlMRCAmJiBVU0VfSVRUX05PVElGWQorICAgICAgICAgICAgLy8gQmFycmllciAtIHJlcG9ydCBmcmFtZSBlbmQKKyAgICAgICAgICAgIGlmIChfX2l0dF9mcmFtZV9zdWJtaXRfdjNfcHRyICYmIF9fa21wX2Zvcmtqb2luX2ZyYW1lc19tb2RlKSB7CisgICAgICAgICAgICAgICAga21wX3VpbnQ2NCBjdXJfdGltZSA9IF9faXR0X2dldF90aW1lc3RhbXAoKTsKKyAgICAgICAgICAgICAgICBrbXBfaW5mb190ICoqb3RoZXJfdGhyZWFkcyA9IHRoaXNfdGhyLT50aC50aF90ZWFtLT50LnRfdGhyZWFkczsKKyAgICAgICAgICAgICAgICBpbnQgbnByb2MgPSB0aGlzX3Roci0+dGgudGhfdGVhbV9ucHJvYzsKKyAgICAgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgICAgICAvLyBJbml0aWFsaXplIHdpdGggbWFzdGVyJ3Mgd2FpdCB0aW1lCisgICAgICAgICAgICAgICAga21wX3VpbnQ2NCBkZWx0YSA9IGN1cl90aW1lIC0gdGhpc190aHItPnRoLnRoX2Jhcl9hcnJpdmVfdGltZTsKKyAgICAgICAgICAgICAgICBzd2l0Y2goX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgIF9fa21wX2l0dF9mcmFtZV9zdWJtaXQoZ3RpZCwgdGhpc190aHItPnRoLnRoX2ZyYW1lX3RpbWUsIGN1cl90aW1lLCAwLCBsb2MsIG5wcm9jKTsKKyAgICAgICAgICAgICAgICAgICAgdGhpc190aHItPnRoLnRoX2ZyYW1lX3RpbWUgPSBjdXJfdGltZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICBfX2ttcF9pdHRfZnJhbWVfc3VibWl0KGd0aWQsIHRoaXNfdGhyLT50aC50aF9iYXJfbWluX3RpbWUsIGN1cl90aW1lLCAxLCBsb2MsIG5wcm9jKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICBpZiggX19pdHRfbWV0YWRhdGFfYWRkX3B0ciApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaT0xOyBpPG5wcm9jOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YSArPSAoIGN1cl90aW1lIC0gb3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfYmFyX2Fycml2ZV90aW1lICk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9pdHRfbWV0YWRhdGFfaW1iYWxhbmNlKGd0aWQsIHRoaXNfdGhyLT50aC50aF9mcmFtZV90aW1lLCBjdXJfdGltZSwgZGVsdGEsIChrbXBfdWludDY0KSggcmVkdWNlICE9IE5VTEwpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBfX2ttcF9pdHRfZnJhbWVfc3VibWl0KGd0aWQsIHRoaXNfdGhyLT50aC50aF9mcmFtZV90aW1lLCBjdXJfdGltZSwgMCwgbG9jLCBucHJvYyk7CisgICAgICAgICAgICAgICAgICAgIHRoaXNfdGhyLT50aC50aF9mcmFtZV90aW1lID0gY3VyX3RpbWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGF0dXMgPSAxOworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgICAgIGlmIChfX2l0dF9zeW5jX2NyZWF0ZV9wdHIgfHwgS01QX0lUVF9ERUJVRykKKyAgICAgICAgICAgICAgICBfX2ttcF9pdHRfYmFycmllcl9taWRkbGUoZ3RpZCwgaXR0X3N5bmNfb2JqKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0YXR1cyA9PSAxIHx8ICEgaXNfc3BsaXQpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoX19rbXBfYmFycmllcl9yZWxlYXNlX3BhdHRlcm5bYnRdKSB7CisgICAgICAgICAgICBjYXNlIGJwX2h5cGVyX2JhcjogeworICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQoX19rbXBfYmFycmllcl9yZWxlYXNlX2JyYW5jaF9iaXRzW2J0XSk7CisgICAgICAgICAgICAgICAgX19rbXBfaHlwZXJfYmFycmllcl9yZWxlYXNlKGJ0LCB0aGlzX3RociwgZ3RpZCwgdGlkLCBGQUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopICk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIGJwX2hpZXJhcmNoaWNhbF9iYXI6IHsKKyAgICAgICAgICAgICAgICBfX2ttcF9oaWVyYXJjaGljYWxfYmFycmllcl9yZWxlYXNlKGJ0LCB0aGlzX3RociwgZ3RpZCwgdGlkLCBGQUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBicF90cmVlX2JhcjogeworICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQoX19rbXBfYmFycmllcl9yZWxlYXNlX2JyYW5jaF9iaXRzW2J0XSk7CisgICAgICAgICAgICAgICAgX19rbXBfdHJlZV9iYXJyaWVyX3JlbGVhc2UoYnQsIHRoaXNfdGhyLCBndGlkLCB0aWQsIEZBTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgICAgIF9fa21wX2xpbmVhcl9iYXJyaWVyX3JlbGVhc2UoYnQsIHRoaXNfdGhyLCBndGlkLCB0aWQsIEZBTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMpIHsKKyAgICAgICAgICAgICAgICBfX2ttcF90YXNrX3RlYW1fc3luYyh0aGlzX3RociwgdGVhbSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgLyogR0VIOiBUT0RPOiBNb3ZlIHRoaXMgdW5kZXIgaWYtY29uZGl0aW9uIGFib3ZlIGFuZCBhbHNvIGluY2x1ZGUgaW4KKyAgICAgICAgICAgX19rbXBfZW5kX3NwbGl0X2JhcnJpZXIoKS4gVGhpcyB3aWxsIG1vcmUgYWNjdXJhdGVseSByZXByZXNlbnQgdGhlIGFjdHVhbCByZWxlYXNlIHRpbWUKKyAgICAgICAgICAgb2YgdGhlIHRocmVhZHMgZm9yIHNwbGl0IGJhcnJpZXJzLiAgKi8KKyAgICAgICAgaWYgKF9faXR0X3N5bmNfY3JlYXRlX3B0ciB8fCBLTVBfSVRUX0RFQlVHKQorICAgICAgICAgICAgX19rbXBfaXR0X2JhcnJpZXJfZmluaXNoZWQoZ3RpZCwgaXR0X3N5bmNfb2JqKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAgfSBlbHNlIHsgLy8gVGVhbSBpcyBzZXJpYWxpemVkLgorICAgICAgICBzdGF0dXMgPSAwOworICAgICAgICBpZiAoX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMpIHsKKyAgICAgICAgICAgIC8vIFRoZSB0YXNrIHRlYW0gc2hvdWxkIGJlIE5VTEwgZm9yIHNlcmlhbGl6ZWQgY29kZSAodGFza3Mgd2lsbCBiZSBleGVjdXRlZCBpbW1lZGlhdGVseSkKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQodGVhbS0+dC50X3Rhc2tfdGVhbSA9PSBOVUxMKTsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQodGhpc190aHItPnRoLnRoX3Rhc2tfdGVhbSA9PSBOVUxMKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBLQV9UUkFDRSgxNSwgKCJfX2ttcF9iYXJyaWVyOiBUIyVkKCVkOiVkKSBpcyBsZWF2aW5nIHdpdGggcmV0dXJuIHZhbHVlICVkXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgX19rbXBfdGVhbV9mcm9tX2d0aWQoZ3RpZCktPnQudF9pZCwgX19rbXBfdGlkX2Zyb21fZ3RpZChndGlkKSwgc3RhdHVzKSk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworCit2b2lkCitfX2ttcF9lbmRfc3BsaXRfYmFycmllcihlbnVtIGJhcnJpZXJfdHlwZSBidCwgaW50IGd0aWQpCit7CisgICAgS01QX1RJTUVfQkxPQ0soS01QX2VuZF9zcGxpdF9iYXJyaWVyKTsKKyAgICBpbnQgdGlkID0gX19rbXBfdGlkX2Zyb21fZ3RpZChndGlkKTsKKyAgICBrbXBfaW5mb190ICp0aGlzX3RociA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisgICAga21wX3RlYW1fdCAqdGVhbSA9IHRoaXNfdGhyLT50aC50aF90ZWFtOworCisgICAgaWYgKCF0ZWFtLT50LnRfc2VyaWFsaXplZCkgeworICAgICAgICBpZiAoS01QX01BU1RFUl9HVElEKGd0aWQpKSB7CisgICAgICAgICAgICBzd2l0Y2ggKF9fa21wX2JhcnJpZXJfcmVsZWFzZV9wYXR0ZXJuW2J0XSkgeworICAgICAgICAgICAgY2FzZSBicF9oeXBlcl9iYXI6IHsKKyAgICAgICAgICAgICAgICBLTVBfQVNTRVJUKF9fa21wX2JhcnJpZXJfcmVsZWFzZV9icmFuY2hfYml0c1tidF0pOworICAgICAgICAgICAgICAgIF9fa21wX2h5cGVyX2JhcnJpZXJfcmVsZWFzZShidCwgdGhpc190aHIsIGd0aWQsIHRpZCwgRkFMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoTlVMTCkgKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgYnBfaGllcmFyY2hpY2FsX2JhcjogeworICAgICAgICAgICAgICAgIF9fa21wX2hpZXJhcmNoaWNhbF9iYXJyaWVyX3JlbGVhc2UoYnQsIHRoaXNfdGhyLCBndGlkLCB0aWQsIEZBTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhOVUxMKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIGJwX3RyZWVfYmFyOiB7CisgICAgICAgICAgICAgICAgS01QX0FTU0VSVChfX2ttcF9iYXJyaWVyX3JlbGVhc2VfYnJhbmNoX2JpdHNbYnRdKTsKKyAgICAgICAgICAgICAgICBfX2ttcF90cmVlX2JhcnJpZXJfcmVsZWFzZShidCwgdGhpc190aHIsIGd0aWQsIHRpZCwgRkFMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhOVUxMKSApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgICAgIF9fa21wX2xpbmVhcl9iYXJyaWVyX3JlbGVhc2UoYnQsIHRoaXNfdGhyLCBndGlkLCB0aWQsIEZBTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhOVUxMKSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjKSB7CisgICAgICAgICAgICAgICAgX19rbXBfdGFza190ZWFtX3N5bmModGhpc190aHIsIHRlYW0pOworICAgICAgICAgICAgfSAvLyBpZgorICAgICAgICB9CisgICAgfQorfQorCisKK3ZvaWQKK19fa21wX2pvaW5fYmFycmllcihpbnQgZ3RpZCkKK3sKKyAgICBLTVBfVElNRV9CTE9DSyhLTVBfam9pbl9iYXJyaWVyKTsKKyAgICByZWdpc3RlciBrbXBfaW5mb190ICp0aGlzX3RociA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisgICAgcmVnaXN0ZXIga21wX3RlYW1fdCAqdGVhbTsKKyAgICByZWdpc3RlciBrbXBfdWludCBucHJvYzsKKyAgICBrbXBfaW5mb190ICptYXN0ZXJfdGhyZWFkOworICAgIGludCB0aWQ7CisjaWZkZWYgS01QX0RFQlVHCisgICAgaW50IHRlYW1faWQ7CisjZW5kaWYgLyogS01QX0RFQlVHICovCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIHZvaWQgKml0dF9zeW5jX29iaiA9IE5VTEw7CisjIGlmIFVTRV9JVFRfTk9USUZZCisgICAgaWYgKF9faXR0X3N5bmNfY3JlYXRlX3B0ciB8fCBLTVBfSVRUX0RFQlVHKSAvLyBEb24ndCBjYWxsIHJvdXRpbmUgd2l0aG91dCBuZWVkCisgICAgICAgIC8vIEdldCBvYmplY3QgY3JlYXRlZCBhdCBmb3JrX2JhcnJpZXIKKyAgICAgICAgaXR0X3N5bmNfb2JqID0gX19rbXBfaXR0X2JhcnJpZXJfb2JqZWN0KGd0aWQsIGJzX2Zvcmtqb2luX2JhcnJpZXIpOworIyBlbmRpZgorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICBLTVBfTUIoKTsKKworICAgIC8vIEdldCBjdXJyZW50IGluZm8KKyAgICB0ZWFtID0gdGhpc190aHItPnRoLnRoX3RlYW07CisgICAgbnByb2MgPSB0aGlzX3Roci0+dGgudGhfdGVhbV9ucHJvYzsKKyAgICBLTVBfREVCVUdfQVNTRVJUKChpbnQpbnByb2MgPT0gdGVhbS0+dC50X25wcm9jKTsKKyAgICB0aWQgPSBfX2ttcF90aWRfZnJvbV9ndGlkKGd0aWQpOworI2lmZGVmIEtNUF9ERUJVRworICAgIHRlYW1faWQgPSB0ZWFtLT50LnRfaWQ7CisjZW5kaWYgLyogS01QX0RFQlVHICovCisgICAgbWFzdGVyX3RocmVhZCA9IHRoaXNfdGhyLT50aC50aF90ZWFtX21hc3RlcjsKKyNpZmRlZiBLTVBfREVCVUcKKyAgICBpZiAobWFzdGVyX3RocmVhZCAhPSB0ZWFtLT50LnRfdGhyZWFkc1swXSkgeworICAgICAgICBfX2ttcF9wcmludF9zdHJ1Y3R1cmUoKTsKKyAgICB9CisjZW5kaWYgLyogS01QX0RFQlVHICovCisgICAgS01QX0RFQlVHX0FTU0VSVChtYXN0ZXJfdGhyZWFkID09IHRlYW0tPnQudF90aHJlYWRzWzBdKTsKKyAgICBLTVBfTUIoKTsKKworICAgIC8vIFZlcmlmeSBzdGF0ZQorICAgIEtNUF9ERUJVR19BU1NFUlQoX19rbXBfdGhyZWFkcyAmJiBfX2ttcF90aHJlYWRzW2d0aWRdKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKFRDUl9QVFIodGhpc190aHItPnRoLnRoX3RlYW0pKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKFRDUl9QVFIodGhpc190aHItPnRoLnRoX3Jvb3QpKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKHRoaXNfdGhyID09IHRlYW0tPnQudF90aHJlYWRzW3RpZF0pOworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wX2pvaW5fYmFycmllcjogVCMlZCglZDolZCkgYXJyaXZlZCBhdCBqb2luIGJhcnJpZXJcbiIsIGd0aWQsIHRlYW1faWQsIHRpZCkpOworCisgICAgaWYgKF9fa21wX3Rhc2tpbmdfbW9kZSA9PSB0c2ttX2V4dHJhX2JhcnJpZXIpIHsKKyAgICAgICAgX19rbXBfdGFza2luZ19iYXJyaWVyKHRlYW0sIHRoaXNfdGhyLCBndGlkKTsKKyAgICAgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBfam9pbl9iYXJyaWVyOiBUIyVkKCVkOiVkKSBwYXN0IHRha2luZyBiYXJyaWVyXG4iLCBndGlkLCB0ZWFtX2lkLCB0aWQpKTsKKyAgICB9CisjIGlmZGVmIEtNUF9ERUJVRworICAgIGlmIChfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYykgeworICAgICAgICBLQV9UUkFDRSgyMCwgKCAiX19rbXBfam9pbl9iYXJyaWVyOiBUIyVkLCBvbGQgdGVhbSA9ICVkLCBvbGQgdGFza190ZWFtID0gJXAsIHRoX3Rhc2tfdGVhbSA9ICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKHRoaXNfdGhyKSwgdGVhbV9pZCwgdGVhbS0+dC50X3Rhc2tfdGVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgdGhpc190aHItPnRoLnRoX3Rhc2tfdGVhbSkpOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHRoaXNfdGhyLT50aC50aF90YXNrX3RlYW0gPT0gdGVhbS0+dC50X3Rhc2tfdGVhbSk7CisgICAgfQorIyBlbmRpZiAvKiBLTVBfREVCVUcgKi8KKworICAgIC8qIENvcHkgdGhlIGJsb2NrdGltZSBpbmZvIHRvIHRoZSB0aHJlYWQsIHdoZXJlIF9fa21wX3dhaXRfdGVtcGxhdGUoKSBjYW4gYWNjZXNzIGl0IHdoZW4gdGhlCisgICAgICAgdGVhbSBzdHJ1Y3QgaXMgbm90IGd1YXJhbnRlZWQgdG8gZXhpc3QuIERvaW5nIHRoZXNlIGxvYWRzIGNhdXNlcyBhIGNhY2hlIG1pc3Mgc2xvd3MKKyAgICAgICBkb3duIEVQQ0MgcGFyYWxsZWwgYnkgMnguIEFzIGEgd29ya2Fyb3VuZCwgd2UgZG8gbm90IHBlcmZvcm0gdGhlIGNvcHkgaWYgYmxvY2t0aW1lPWluZmluaXRlLAorICAgICAgIHNpbmNlIHRoZSB2YWx1ZXMgYXJlIG5vdCB1c2VkIGJ5IF9fa21wX3dhaXRfdGVtcGxhdGUoKSBpbiB0aGF0IGNhc2UuICovCisgICAgaWYgKF9fa21wX2RmbHRfYmxvY2t0aW1lICE9IEtNUF9NQVhfQkxPQ0tUSU1FKSB7CisgICAgICAgIHRoaXNfdGhyLT50aC50aF90ZWFtX2J0X2ludGVydmFscyA9IHRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhW3RpZF0udGRfaWN2cy5idF9pbnRlcnZhbHM7CisgICAgICAgIHRoaXNfdGhyLT50aC50aF90ZWFtX2J0X3NldCA9IHRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhW3RpZF0udGRfaWN2cy5idF9zZXQ7CisgICAgfQorCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIGlmIChfX2l0dF9zeW5jX2NyZWF0ZV9wdHIgfHwgS01QX0lUVF9ERUJVRykKKyAgICAgICAgX19rbXBfaXR0X2JhcnJpZXJfc3RhcnRpbmcoZ3RpZCwgaXR0X3N5bmNfb2JqKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICBzd2l0Y2ggKF9fa21wX2JhcnJpZXJfZ2F0aGVyX3BhdHRlcm5bYnNfZm9ya2pvaW5fYmFycmllcl0pIHsKKyAgICBjYXNlIGJwX2h5cGVyX2JhcjogeworICAgICAgICBLTVBfQVNTRVJUKF9fa21wX2JhcnJpZXJfZ2F0aGVyX2JyYW5jaF9iaXRzW2JzX2Zvcmtqb2luX2JhcnJpZXJdKTsKKyAgICAgICAgX19rbXBfaHlwZXJfYmFycmllcl9nYXRoZXIoYnNfZm9ya2pvaW5fYmFycmllciwgdGhpc190aHIsIGd0aWQsIHRpZCwgTlVMTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopICk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIGJwX2hpZXJhcmNoaWNhbF9iYXI6IHsKKyAgICAgICAgX19rbXBfaGllcmFyY2hpY2FsX2JhcnJpZXJfZ2F0aGVyKGJzX2Zvcmtqb2luX2JhcnJpZXIsIHRoaXNfdGhyLCBndGlkLCB0aWQsIE5VTEwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaikgKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgYnBfdHJlZV9iYXI6IHsKKyAgICAgICAgS01QX0FTU0VSVChfX2ttcF9iYXJyaWVyX2dhdGhlcl9icmFuY2hfYml0c1tic19mb3Jram9pbl9iYXJyaWVyXSk7CisgICAgICAgIF9fa21wX3RyZWVfYmFycmllcl9nYXRoZXIoYnNfZm9ya2pvaW5fYmFycmllciwgdGhpc190aHIsIGd0aWQsIHRpZCwgTlVMTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaikgKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgX19rbXBfbGluZWFyX2JhcnJpZXJfZ2F0aGVyKGJzX2Zvcmtqb2luX2JhcnJpZXIsIHRoaXNfdGhyLCBndGlkLCB0aWQsIE5VTEwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaikgKTsKKyAgICB9CisgICAgfQorCisgICAgLyogRnJvbSB0aGlzIHBvaW50IG9uLCB0aGUgdGVhbSBkYXRhIHN0cnVjdHVyZSBtYXkgYmUgZGVhbGxvY2F0ZWQgYXQgYW55IHRpbWUgYnkgdGhlCisgICAgICAgbWFzdGVyIHRocmVhZCAtIGl0IGlzIHVuc2FmZSB0byByZWZlcmVuY2UgaXQgaW4gYW55IG9mIHRoZSB3b3JrZXIgdGhyZWFkcy4gQW55IHBlci10ZWFtCisgICAgICAgZGF0YSBpdGVtcyB0aGF0IG5lZWQgdG8gYmUgcmVmZXJlbmNlZCBiZWZvcmUgdGhlIGVuZCBvZiB0aGUgYmFycmllciBzaG91bGQgYmUgbW92ZWQgdG8KKyAgICAgICB0aGUga21wX3Rhc2tfdGVhbV90IHN0cnVjdHMuICAqLworICAgIGlmIChLTVBfTUFTVEVSX1RJRCh0aWQpKSB7CisgICAgICAgIGlmIChfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYykgeworICAgICAgICAgICAgLy8gTWFzdGVyIHNob3VsZG4ndCBjYWxsIGRlY3JlYXNlX2xvYWQoKS4gICAgICAgICAvLyBUT0RPOiBlbmFibGUgbWFzdGVyIHRocmVhZHMuCisgICAgICAgICAgICAvLyBNYXN0ZXIgc2hvdWxkIGhhdmUgdGhfbWF5X2RlY3JlYXNlX2xvYWQgPT0gMC4gIC8vIFRPRE86IGVuYWJsZSBtYXN0ZXIgdGhyZWFkcy4KKyAgICAgICAgICAgIF9fa21wX3Rhc2tfdGVhbV93YWl0KHRoaXNfdGhyLCB0ZWFtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopICk7CisgICAgICAgIH0KKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgIGlmIChfX2l0dF9zeW5jX2NyZWF0ZV9wdHIgfHwgS01QX0lUVF9ERUJVRykKKyAgICAgICAgICAgIF9fa21wX2l0dF9iYXJyaWVyX21pZGRsZShndGlkLCBpdHRfc3luY19vYmopOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworIyBpZiBVU0VfSVRUX0JVSUxEICYmIFVTRV9JVFRfTk9USUZZCisgICAgICAgIC8vIEpvaW4gYmFycmllciAtIHJlcG9ydCBmcmFtZSBlbmQKKyAgICAgICAgaWYgKF9faXR0X2ZyYW1lX3N1Ym1pdF92M19wdHIgJiYgX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGUpIHsKKyAgICAgICAgICAgIGttcF91aW50NjQgY3VyX3RpbWUgPSBfX2l0dF9nZXRfdGltZXN0YW1wKCk7CisgICAgICAgICAgICBpZGVudF90ICogbG9jID0gdGVhbS0+dC50X2lkZW50OworICAgICAgICAgICAga21wX2luZm9fdCAqKm90aGVyX3RocmVhZHMgPSB0aGlzX3Roci0+dGgudGhfdGVhbS0+dC50X3RocmVhZHM7CisgICAgICAgICAgICBpbnQgbnByb2MgPSB0aGlzX3Roci0+dGgudGhfdGVhbV9ucHJvYzsKKyAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSB3aXRoIG1hc3RlcidzIHdhaXQgdGltZQorICAgICAgICAgICAga21wX3VpbnQ2NCBkZWx0YSA9IGN1cl90aW1lIC0gdGhpc190aHItPnRoLnRoX2Jhcl9hcnJpdmVfdGltZTsKKyAgICAgICAgICAgIHN3aXRjaChfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSkgeworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgIF9fa21wX2l0dF9mcmFtZV9zdWJtaXQoZ3RpZCwgdGhpc190aHItPnRoLnRoX2ZyYW1lX3RpbWUsIGN1cl90aW1lLCAwLCBsb2MsIG5wcm9jKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICBfX2ttcF9pdHRfZnJhbWVfc3VibWl0KGd0aWQsIHRoaXNfdGhyLT50aC50aF9iYXJfbWluX3RpbWUsIGN1cl90aW1lLCAxLCBsb2MsIG5wcm9jKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICBpZiggX19pdHRfbWV0YWRhdGFfYWRkX3B0ciApIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpPTE7IGk8bnByb2M7ICsraSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGEgKz0gKCBjdXJfdGltZSAtIG90aGVyX3RocmVhZHNbaV0tPnRoLnRoX2Jhcl9hcnJpdmVfdGltZSApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIF9fa21wX2l0dF9tZXRhZGF0YV9pbWJhbGFuY2UoZ3RpZCwgdGhpc190aHItPnRoLnRoX2ZyYW1lX3RpbWUsIGN1cl90aW1lLCBkZWx0YSwgMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIF9fa21wX2l0dF9mcmFtZV9zdWJtaXQoZ3RpZCwgdGhpc190aHItPnRoLnRoX2ZyYW1lX3RpbWUsIGN1cl90aW1lLCAwLCBsb2MsIG5wcm9jKTsKKyAgICAgICAgICAgICAgICB0aGlzX3Roci0+dGgudGhfZnJhbWVfdGltZSA9IGN1cl90aW1lOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisjIGVuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICB9CisjaWYgVVNFX0lUVF9CVUlMRAorICAgIGVsc2UgeworICAgICAgICBpZiAoX19pdHRfc3luY19jcmVhdGVfcHRyIHx8IEtNUF9JVFRfREVCVUcpCisgICAgICAgICAgICBfX2ttcF9pdHRfYmFycmllcl9taWRkbGUoZ3RpZCwgaXR0X3N5bmNfb2JqKTsKKyAgICB9CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisjaWYgS01QX0RFQlVHCisgICAgaWYgKEtNUF9NQVNURVJfVElEKHRpZCkpIHsKKyAgICAgICAgS0FfVFJBQ0UoMTUsICgiX19rbXBfam9pbl9iYXJyaWVyOiBUIyVkKCVkOiVkKSBzYXlzIGFsbCAlZCB0ZWFtIHRocmVhZHMgYXJyaXZlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtX2lkLCB0aWQsIG5wcm9jKSk7CisgICAgfQorI2VuZGlmIC8qIEtNUF9ERUJVRyAqLworCisgICAgLy8gVE9ETyBub3csIG1hcmsgd29ya2VyIHRocmVhZHMgYXMgZG9uZSBzbyB0aGV5IG1heSBiZSBkaXNiYW5kZWQKKyAgICBLTVBfTUIoKTsgLy8gRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLgorICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wX2pvaW5fYmFycmllcjogVCMlZCglZDolZCkgbGVhdmluZ1xuIiwgZ3RpZCwgdGVhbV9pZCwgdGlkKSk7Cit9CisKKworLy8gVE9ETyByZWxlYXNlIHdvcmtlciB0aHJlYWRzJyBmb3JrIGJhcnJpZXJzIGFzIHdlIGFyZSByZWFkeSBpbnN0ZWFkIG9mIGFsbCBhdCBvbmNlCit2b2lkCitfX2ttcF9mb3JrX2JhcnJpZXIoaW50IGd0aWQsIGludCB0aWQpCit7CisgICAgS01QX1RJTUVfQkxPQ0soS01QX2ZvcmtfYmFycmllcik7CisgICAga21wX2luZm9fdCAqdGhpc190aHIgPSBfX2ttcF90aHJlYWRzW2d0aWRdOworICAgIGttcF90ZWFtX3QgKnRlYW0gPSAodGlkID09IDApID8gdGhpc190aHItPnRoLnRoX3RlYW0gOiBOVUxMOworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICB2b2lkICogaXR0X3N5bmNfb2JqID0gTlVMTDsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcF9mb3JrX2JhcnJpZXI6IFQjJWQoJWQ6JWQpIGhhcyBhcnJpdmVkXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgKHRlYW0gIT0gTlVMTCkgPyB0ZWFtLT50LnRfaWQgOiAtMSwgdGlkKSk7CisKKyAgICAvLyB0aF90ZWFtIHBvaW50ZXIgb25seSB2YWxpZCBmb3IgbWFzdGVyIHRocmVhZCBoZXJlCisgICAgaWYgKEtNUF9NQVNURVJfVElEKHRpZCkpIHsKKyNpZiBVU0VfSVRUX0JVSUxEICYmIFVTRV9JVFRfTk9USUZZCisgICAgICAgIGlmIChfX2l0dF9zeW5jX2NyZWF0ZV9wdHIgfHwgS01QX0lUVF9ERUJVRykgeworICAgICAgICAgICAgLy8gQ3JlYXRlIGl0dCBiYXJyaWVyIG9iamVjdAorICAgICAgICAgICAgaXR0X3N5bmNfb2JqICA9IF9fa21wX2l0dF9iYXJyaWVyX29iamVjdChndGlkLCBic19mb3Jram9pbl9iYXJyaWVyLCAxKTsKKyAgICAgICAgICAgIF9fa21wX2l0dF9iYXJyaWVyX21pZGRsZShndGlkLCBpdHRfc3luY19vYmopOyAgLy8gQ2FsbCBhY3F1aXJlZC9yZWxlYXNpbmcKKyAgICAgICAgfQorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgJiYgVVNFX0lUVF9OT1RJRlkgKi8KKworI2lmZGVmIEtNUF9ERUJVRworICAgICAgICByZWdpc3RlciBrbXBfaW5mb190ICoqb3RoZXJfdGhyZWFkcyA9IHRlYW0tPnQudF90aHJlYWRzOworICAgICAgICByZWdpc3RlciBpbnQgaTsKKworICAgICAgICAvLyBWZXJpZnkgc3RhdGUKKyAgICAgICAgS01QX01CKCk7CisKKyAgICAgICAgZm9yKGk9MTsgaTx0ZWFtLT50LnRfbnByb2M7ICsraSkgeworICAgICAgICAgICAgS0FfVFJBQ0UoNTAwLCAoIl9fa21wX2ZvcmtfYmFycmllcjogVCMlZCglZDowKSBjaGVja2luZyBUIyVkKCVkOiVkKSBmb3JrIGdvID09ICV1LlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgb3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfaW5mby5kcy5kc19ndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X2lkLCBvdGhlcl90aHJlYWRzW2ldLT50aC50aF9pbmZvLmRzLmRzX3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyX3RocmVhZHNbaV0tPnRoLnRoX2Jhcltic19mb3Jram9pbl9iYXJyaWVyXS5iYi5iX2dvKSk7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKChUQ1JfNChvdGhlcl90aHJlYWRzW2ldLT50aC50aF9iYXJbYnNfZm9ya2pvaW5fYmFycmllcl0uYmIuYl9nbykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgfihLTVBfQkFSUklFUl9TTEVFUF9TVEFURSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IEtNUF9JTklUX0JBUlJJRVJfU1RBVEUpOworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChvdGhlcl90aHJlYWRzW2ldLT50aC50aF90ZWFtID09IHRlYW0pOworICAgICAgICB9CisjZW5kaWYKKworICAgICAgICBpZiAoX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMpIHsKKyAgICAgICAgICAgIF9fa21wX3Rhc2tfdGVhbV9zZXR1cCh0aGlzX3RociwgdGVhbSk7CisgICAgICAgIH0KKworICAgICAgICAvKiBUaGUgbWFzdGVyIHRocmVhZCBtYXkgaGF2ZSBjaGFuZ2VkIGl0cyBibG9ja3RpbWUgYmV0d2VlbiB0aGUgam9pbiBiYXJyaWVyIGFuZCB0aGUKKyAgICAgICAgICAgZm9yayBiYXJyaWVyLiBDb3B5IHRoZSBibG9ja3RpbWUgaW5mbyB0byB0aGUgdGhyZWFkLCB3aGVyZSBfX2ttcF93YWl0X3RlbXBsYXRlKCkgY2FuCisgICAgICAgICAgIGFjY2VzcyBpdCB3aGVuIHRoZSB0ZWFtIHN0cnVjdCBpcyBub3QgZ3VhcmFudGVlZCB0byBleGlzdC4gKi8KKyAgICAgICAgLy8gU2VlIG5vdGUgYWJvdXQgdGhlIGNvcnJlc3BvbmRpbmcgY29kZSBpbiBfX2ttcF9qb2luX2JhcnJpZXIoKSBiZWluZyBwZXJmb3JtYW5jZS1jcml0aWNhbAorICAgICAgICBpZiAoX19rbXBfZGZsdF9ibG9ja3RpbWUgIT0gS01QX01BWF9CTE9DS1RJTUUpIHsKKyAgICAgICAgICAgIHRoaXNfdGhyLT50aC50aF90ZWFtX2J0X2ludGVydmFscyA9IHRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhW3RpZF0udGRfaWN2cy5idF9pbnRlcnZhbHM7CisgICAgICAgICAgICB0aGlzX3Roci0+dGgudGhfdGVhbV9idF9zZXQgPSB0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVt0aWRdLnRkX2ljdnMuYnRfc2V0OworICAgICAgICB9CisgICAgfSAvLyBtYXN0ZXIKKworICAgIHN3aXRjaCAoX19rbXBfYmFycmllcl9yZWxlYXNlX3BhdHRlcm5bYnNfZm9ya2pvaW5fYmFycmllcl0pIHsKKyAgICBjYXNlIGJwX2h5cGVyX2JhcjogeworICAgICAgICBLTVBfQVNTRVJUKF9fa21wX2JhcnJpZXJfcmVsZWFzZV9icmFuY2hfYml0c1tic19mb3Jram9pbl9iYXJyaWVyXSk7CisgICAgICAgIF9fa21wX2h5cGVyX2JhcnJpZXJfcmVsZWFzZShic19mb3Jram9pbl9iYXJyaWVyLCB0aGlzX3RociwgZ3RpZCwgdGlkLCBUUlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopICk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIGJwX2hpZXJhcmNoaWNhbF9iYXI6IHsKKyAgICAgICAgX19rbXBfaGllcmFyY2hpY2FsX2JhcnJpZXJfcmVsZWFzZShic19mb3Jram9pbl9iYXJyaWVyLCB0aGlzX3RociwgZ3RpZCwgdGlkLCBUUlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSApOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBicF90cmVlX2JhcjogeworICAgICAgICBLTVBfQVNTRVJUKF9fa21wX2JhcnJpZXJfcmVsZWFzZV9icmFuY2hfYml0c1tic19mb3Jram9pbl9iYXJyaWVyXSk7CisgICAgICAgIF9fa21wX3RyZWVfYmFycmllcl9yZWxlYXNlKGJzX2Zvcmtqb2luX2JhcnJpZXIsIHRoaXNfdGhyLCBndGlkLCB0aWQsIFRSVUUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSApOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDogeworICAgICAgICBfX2ttcF9saW5lYXJfYmFycmllcl9yZWxlYXNlKGJzX2Zvcmtqb2luX2JhcnJpZXIsIHRoaXNfdGhyLCBndGlkLCB0aWQsIFRSVUUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopICk7CisgICAgfQorICAgIH0KKworICAgIC8vIEVhcmx5IGV4aXQgZm9yIHJlYXBpbmcgdGhyZWFkcyByZWxlYXNpbmcgZm9ya2pvaW4gYmFycmllcgorICAgIGlmIChUQ1JfNChfX2ttcF9nbG9iYWwuZy5nX2RvbmUpKSB7CisgICAgICAgIGlmICh0aGlzX3Roci0+dGgudGhfdGFza190ZWFtICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChLTVBfTUFTVEVSX1RJRCh0aWQpKSB7CisgICAgICAgICAgICAgICAgVENXX1BUUih0aGlzX3Roci0+dGgudGhfdGFza190ZWFtLCBOVUxMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIF9fa21wX3VucmVmX3Rhc2tfdGVhbSh0aGlzX3Roci0+dGgudGhfdGFza190ZWFtLCB0aGlzX3Rocik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworI2lmIFVTRV9JVFRfQlVJTEQgJiYgVVNFX0lUVF9OT1RJRlkKKyAgICAgICAgaWYgKF9faXR0X3N5bmNfY3JlYXRlX3B0ciB8fCBLTVBfSVRUX0RFQlVHKSB7CisgICAgICAgICAgICBpZiAoIUtNUF9NQVNURVJfVElEKHRpZCkpIHsKKyAgICAgICAgICAgICAgICBpdHRfc3luY19vYmogPSBfX2ttcF9pdHRfYmFycmllcl9vYmplY3QoZ3RpZCwgYnNfZm9ya2pvaW5fYmFycmllcik7CisgICAgICAgICAgICAgICAgaWYgKGl0dF9zeW5jX29iaikKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfaXR0X2JhcnJpZXJfZmluaXNoZWQoZ3RpZCwgaXR0X3N5bmNfb2JqKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgJiYgVVNFX0lUVF9OT1RJRlkgKi8KKyAgICAgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBfZm9ya19iYXJyaWVyOiBUIyVkIGlzIGxlYXZpbmcgZWFybHlcbiIsIGd0aWQpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIFdlIGNhbiBub3cgYXNzdW1lIHRoYXQgYSB2YWxpZCB0ZWFtIHN0cnVjdHVyZSBoYXMgYmVlbiBhbGxvY2F0ZWQgYnkgdGhlIG1hc3RlciBhbmQKKyAgICAgICBwcm9wYWdhdGVkIHRvIGFsbCB3b3JrZXIgdGhyZWFkcy4gVGhlIGN1cnJlbnQgdGhyZWFkLCBob3dldmVyLCBtYXkgbm90IGJlIHBhcnQgb2YgdGhlCisgICAgICAgdGVhbSwgc28gd2UgY2FuJ3QgYmxpbmRseSBhc3N1bWUgdGhhdCB0aGUgdGVhbSBwb2ludGVyIGlzIG5vbi1udWxsLiAgKi8KKyAgICB0ZWFtID0gKGttcF90ZWFtX3QgKilUQ1JfUFRSKHRoaXNfdGhyLT50aC50aF90ZWFtKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKHRlYW0gIT0gTlVMTCk7CisgICAgdGlkID0gX19rbXBfdGlkX2Zyb21fZ3RpZChndGlkKTsKKworCisjaWYgS01QX0JBUlJJRVJfSUNWX1BVTEwKKyAgICAvKiBNYXN0ZXIgdGhyZWFkJ3MgY29weSBvZiB0aGUgSUNWcyB3YXMgc2V0IHVwIG9uIHRoZSBpbXBsaWNpdCB0YXNrZGF0YSBpbgorICAgICAgIF9fa21wX3JlaW5pdGlhbGl6ZV90ZWFtLiBfX2ttcF9mb3JrX2NhbGwoKSBhc3N1bWVzIHRoZSBtYXN0ZXIgdGhyZWFkJ3MgaW1wbGljaXQgdGFzayBoYXMKKyAgICAgICB0aGlzIGRhdGEgYmVmb3JlIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLiBXZSBjYW5ub3QgbW9kaWZ5IF9fa21wX2ZvcmtfY2FsbCgpIHRvIGxvb2sgYXQKKyAgICAgICB0aGUgZml4ZWQgSUNWcyBpbiB0aGUgbWFzdGVyJ3MgdGhyZWFkIHN0cnVjdCwgYmVjYXVzZSBpdCBpcyBub3QgYWx3YXlzIHRoZSBjYXNlIHRoYXQgdGhlCisgICAgICAgdGhyZWFkcyBhcnJheXMgaGF2ZSBiZWVuIGFsbG9jYXRlZCB3aGVuIF9fa21wX2ZvcmtfY2FsbCgpIGlzIGV4ZWN1dGVkLiAqLworICAgIEtNUF9TVEFSVF9FWFBMSUNJVF9USU1FUihVU0VSX2ljdl9jb3B5KTsKKyAgICBpZiAoIUtNUF9NQVNURVJfVElEKHRpZCkpIHsgIC8vIG1hc3RlciB0aHJlYWQgYWxyZWFkeSBoYXMgSUNWcworICAgICAgICAvLyBDb3B5IHRoZSBpbml0aWFsIElDVnMgZnJvbSB0aGUgbWFzdGVyJ3MgdGhyZWFkIHN0cnVjdCB0byB0aGUgaW1wbGljaXQgdGFzayBmb3IgdGhpcyB0aWQuCisgICAgICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wX2ZvcmtfYmFycmllcjogVCMlZCglZCkgaXMgUFVMTGluZyBJQ1ZzXG4iLCBndGlkLCB0aWQpKTsKKyAgICAgICAgX19rbXBfaW5pdF9pbXBsaWNpdF90YXNrKHRlYW0tPnQudF9pZGVudCwgdGVhbS0+dC50X3RocmVhZHNbdGlkXSwgdGVhbSwgdGlkLCBGQUxTRSk7CisgICAgICAgIGNvcHlfaWN2cygmdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbdGlkXS50ZF9pY3ZzLAorICAgICAgICAgICAgICAgICAgJnRlYW0tPnQudF90aHJlYWRzWzBdLT50aC50aF9iYXJbYnNfZm9ya2pvaW5fYmFycmllcl0uYmIudGhfZml4ZWRfaWN2cyk7CisgICAgfQorICAgIEtNUF9TVE9QX0VYUExJQ0lUX1RJTUVSKFVTRVJfaWN2X2NvcHkpOworI2VuZGlmIC8vIEtNUF9CQVJSSUVSX0lDVl9QVUxMCisKKyAgICBpZiAoX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMpIHsKKyAgICAgICAgX19rbXBfdGFza190ZWFtX3N5bmModGhpc190aHIsIHRlYW0pOworICAgIH0KKworI2lmIE9NUF80MF9FTkFCTEVEICYmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICBrbXBfcHJvY19iaW5kX3QgcHJvY19iaW5kID0gdGVhbS0+dC50X3Byb2NfYmluZDsKKyAgICBpZiAocHJvY19iaW5kID09IHByb2NfYmluZF9pbnRlbCkgeworI2VuZGlmCisjaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgICAgICAvLyBDYWxsIGR5bmFtaWMgYWZmaW5pdHkgc2V0dGluZ3MKKyAgICAgICAgaWYoX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9iYWxhbmNlZCAmJiB0ZWFtLT50LnRfc2l6ZV9jaGFuZ2VkKSB7CisgICAgICAgICAgICBfX2ttcF9iYWxhbmNlZF9hZmZpbml0eSh0aWQsIHRlYW0tPnQudF9ucHJvYyk7CisgICAgICAgIH0KKyNlbmRpZiAvLyBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisjaWYgT01QXzQwX0VOQUJMRUQgJiYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgIH0KKyAgICBlbHNlIGlmICgocHJvY19iaW5kICE9IHByb2NfYmluZF9mYWxzZSkKKyAgICAgICAgICAgICAmJiAocHJvY19iaW5kICE9IHByb2NfYmluZF9kaXNhYmxlZCkpIHsKKyAgICAgICAgaWYgKHRoaXNfdGhyLT50aC50aF9uZXdfcGxhY2UgPT0gdGhpc190aHItPnRoLnRoX2N1cnJlbnRfcGxhY2UpIHsKKyAgICAgICAgICAgIEtBX1RSQUNFKDEwMCwgKCJfX2ttcF9mb3JrX2JhcnJpZXI6IFQjJWQgYWxyZWFkeSBpbiBjb3JyZWN0IHBsYWNlICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCh0aGlzX3RociksIHRoaXNfdGhyLT50aC50aF9jdXJyZW50X3BsYWNlKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9zZXRfcGxhY2UoZ3RpZCk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworI2lmIFVTRV9JVFRfQlVJTEQgJiYgVVNFX0lUVF9OT1RJRlkKKyAgICBpZiAoX19pdHRfc3luY19jcmVhdGVfcHRyIHx8IEtNUF9JVFRfREVCVUcpIHsKKyAgICAgICAgaWYgKCFLTVBfTUFTVEVSX1RJRCh0aWQpKSB7CisgICAgICAgICAgICAvLyBHZXQgY29ycmVjdCBiYXJyaWVyIG9iamVjdAorICAgICAgICAgICAgaXR0X3N5bmNfb2JqID0gX19rbXBfaXR0X2JhcnJpZXJfb2JqZWN0KGd0aWQsIGJzX2Zvcmtqb2luX2JhcnJpZXIpOworICAgICAgICAgICAgX19rbXBfaXR0X2JhcnJpZXJfZmluaXNoZWQoZ3RpZCwgaXR0X3N5bmNfb2JqKTsgIC8vIFdvcmtlcnMgY2FsbCBhY3F1aXJlZAorICAgICAgICB9IC8vIChwcmVwYXJlIGNhbGxlZCBpbnNpZGUgYmFycmllcl9yZWxlYXNlKQorICAgIH0KKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICYmIFVTRV9JVFRfTk9USUZZICovCisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBfZm9ya19iYXJyaWVyOiBUIyVkKCVkOiVkKSBpcyBsZWF2aW5nXG4iLCBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCkpOworfQorCisKK3ZvaWQKK19fa21wX3NldHVwX2ljdl9jb3B5KGttcF90ZWFtX3QgKnRlYW0sIGludCBuZXdfbnByb2MsIGttcF9pbnRlcm5hbF9jb250cm9sX3QgKm5ld19pY3ZzLCBpZGVudF90ICpsb2MgKQoreworICAgIEtNUF9USU1FX0JMT0NLKEtNUF9zZXR1cF9pY3ZfY29weSk7CisgICAgaW50IGY7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKHRlYW0gJiYgbmV3X25wcm9jICYmIG5ld19pY3ZzKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCghVENSXzQoX19rbXBfaW5pdF9wYXJhbGxlbCkpIHx8IG5ld19pY3ZzLT5ucHJvYyk7CisKKyAgICAvKiBNYXN0ZXIgdGhyZWFkJ3MgY29weSBvZiB0aGUgSUNWcyB3YXMgc2V0IHVwIG9uIHRoZSBpbXBsaWNpdCB0YXNrZGF0YSBpbgorICAgICAgIF9fa21wX3JlaW5pdGlhbGl6ZV90ZWFtLiBfX2ttcF9mb3JrX2NhbGwoKSBhc3N1bWVzIHRoZSBtYXN0ZXIgdGhyZWFkJ3MgaW1wbGljaXQgdGFzayBoYXMKKyAgICAgICB0aGlzIGRhdGEgYmVmb3JlIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLiAqLworI2lmIEtNUF9CQVJSSUVSX0lDVl9QVUxMCisgICAgLyogQ29weSBJQ1ZzIHRvIG1hc3RlcidzIHRocmVhZCBzdHJ1Y3R1cmUgaW50byB0aF9maXhlZF9pY3ZzICh3aGljaCByZW1haW5zIHVudG91Y2hlZCksIHdoZXJlCisgICAgICAgYWxsIG9mIHRoZSB3b3JrZXIgdGhyZWFkcyBjYW4gYWNjZXNzIHRoZW0gYW5kIG1ha2UgdGhlaXIgb3duIGNvcGllcyBhZnRlciB0aGUgYmFycmllci4gKi8KKyAgICBLTVBfREVCVUdfQVNTRVJUKHRlYW0tPnQudF90aHJlYWRzWzBdKTsgIC8vIFRoZSB0aHJlYWRzIGFycmF5cyBzaG91bGQgYmUgYWxsb2NhdGVkIGF0IHRoaXMgcG9pbnQKKyAgICBjb3B5X2ljdnMoJnRlYW0tPnQudF90aHJlYWRzWzBdLT50aC50aF9iYXJbYnNfZm9ya2pvaW5fYmFycmllcl0uYmIudGhfZml4ZWRfaWN2cywgbmV3X2ljdnMpOworICAgIEtGX1RSQUNFKDEwLCAoIl9fa21wX3NldHVwX2ljdl9jb3B5OiBQVUxMOiBUIyVkIHRoaXNfdGhyZWFkPSVwIHRlYW09JXBcbiIsCisgICAgICAgICAgICAgICAgICAwLCB0ZWFtLT50LnRfdGhyZWFkc1swXSwgdGVhbSkpOworI2VsaWYgS01QX0JBUlJJRVJfSUNWX1BVU0gKKyAgICAvLyBUaGUgSUNWcyB3aWxsIGJlIHByb3BhZ2F0ZWQgaW4gdGhlIGZvcmsgYmFycmllciwgc28gbm90aGluZyBuZWVkcyB0byBiZSBkb25lIGhlcmUuCisgICAgS0ZfVFJBQ0UoMTAsICgiX19rbXBfc2V0dXBfaWN2X2NvcHk6IFBVU0g6IFQjJWQgdGhpc190aHJlYWQ9JXAgdGVhbT0lcFxuIiwKKyAgICAgICAgICAgICAgICAgIDAsIHRlYW0tPnQudF90aHJlYWRzWzBdLCB0ZWFtKSk7CisjZWxzZQorICAgIC8vIENvcHkgdGhlIElDVnMgdG8gZWFjaCBvZiB0aGUgbm9uLW1hc3RlciB0aHJlYWRzLiAgVGhpcyB0YWtlcyBPKG50aHJlYWRzKSB0aW1lLgorICAgIG5nb19sb2FkKG5ld19pY3ZzKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKHRlYW0tPnQudF90aHJlYWRzWzBdKTsgIC8vIFRoZSB0aHJlYWRzIGFycmF5cyBzaG91bGQgYmUgYWxsb2NhdGVkIGF0IHRoaXMgcG9pbnQKKyAgICBmb3IgKGY9MTsgZjxuZXdfbnByb2M7ICsrZikgeyAvLyBTa2lwIHRoZSBtYXN0ZXIgdGhyZWFkCisgICAgICAgIC8vIFRPRE86IEdFSCAtIHBhc3MgaW4gYmV0dGVyIHNvdXJjZSBsb2NhdGlvbiBpbmZvIHNpbmNlIHVzdWFsbHkgTlVMTCBoZXJlCisgICAgICAgIEtGX1RSQUNFKDEwLCAoIl9fa21wX3NldHVwX2ljdl9jb3B5OiBMSU5FQVI6IFQjJWQgdGhpc190aHJlYWQ9JXAgdGVhbT0lcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBmLCB0ZWFtLT50LnRfdGhyZWFkc1tmXSwgdGVhbSkpOworICAgICAgICBfX2ttcF9pbml0X2ltcGxpY2l0X3Rhc2sobG9jLCB0ZWFtLT50LnRfdGhyZWFkc1tmXSwgdGVhbSwgZiwgRkFMU0UpOworICAgICAgICBuZ29fc3RvcmVfaWN2cygmdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbZl0udGRfaWN2cywgbmV3X2ljdnMpOworICAgICAgICBLRl9UUkFDRSgxMCwgKCJfX2ttcF9zZXR1cF9pY3ZfY29weTogTElORUFSOiBUIyVkIHRoaXNfdGhyZWFkPSVwIHRlYW09JXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZiwgdGVhbS0+dC50X3RocmVhZHNbZl0sIHRlYW0pKTsKKyAgICB9CisgICAgbmdvX3N5bmMoKTsKKyNlbmRpZiAvLyBLTVBfQkFSUklFUl9JQ1ZfUFVMTAorfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX2NhbmNlbC5jcHAgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfY2FuY2VsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWE3NmQyCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX2NhbmNlbC5jcHAKQEAgLTAsMCArMSwyODIgQEAKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAia21wLmgiCisjaW5jbHVkZSAia21wX2kxOG4uaCIKKyNpbmNsdWRlICJrbXBfaW8uaCIKKyNpbmNsdWRlICJrbXBfc3RyLmgiCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorCisvKiEKK0Bpbmdyb3VwIENBTkNFTExBVElPTgorQHBhcmFtIGxvY19yZWYgbG9jYXRpb24gb2YgdGhlIG9yaWdpbmFsIHRhc2sgZGlyZWN0aXZlCitAcGFyYW0gZ3RpZCBHbG9iYWwgdGhyZWFkIElEIG9mIGVuY291bnRlcmluZyB0aHJlYWQKK0BwYXJhbSBjbmNsX2tpbmQgQ2FuY2VsbGF0aW9uIGtpbmQgKHBhcmFsbGVsLCBmb3IsIHNlY3Rpb25zLCB0YXNrZ3JvdXApCisKK0ByZXR1cm4gcmV0dXJucyB0cnVlIGlmIHRoZSBjYW5jZWxsYXRpb24gcmVxdWVzdCBoYXMgYmVlbiBhY3RpdmF0ZWQgYW5kIHRoZSBleGVjdXRpb24gdGhyZWFkCituZWVkcyB0byBwcm9jZWVkIHRvIHRoZSBlbmQgb2YgdGhlIGNhbmNlbGVkIHJlZ2lvbi4KKworUmVxdWVzdCBjYW5jZWxsYXRpb24gb2YgdGhlIGJpbmRpbmcgT3Blbk1QIHJlZ2lvbi4KKyovCitrbXBfaW50MzIgX19rbXBjX2NhbmNlbChpZGVudF90KiBsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwga21wX2ludDMyIGNuY2xfa2luZCkgeworICAgIGttcF9pbmZvX3QgKnRoaXNfdGhyID0gX19rbXBfdGhyZWFkcyBbIGd0aWQgXTsKKyAgICAKKyAgICBLQ19UUkFDRSggMTAsICgiX19rbXBjX2NhbmNlbDogVCMlZCByZXF1ZXN0ICVkIE9NUF9DQU5DRUxMQVRJT049JWRcbiIsIGd0aWQsIGNuY2xfa2luZCwgX19rbXBfb21wX2NhbmNlbGxhdGlvbikgKTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoY25jbF9raW5kICE9IGNhbmNlbF9ub3JlcSk7CisgICAgS01QX0RFQlVHX0FTU0VSVChjbmNsX2tpbmQgPT0gY2FuY2VsX3BhcmFsbGVsIHx8IGNuY2xfa2luZCA9PSBjYW5jZWxfbG9vcCB8fCAKKyAgICAgICAgICAgICAgICAgICAgIGNuY2xfa2luZCA9PSBjYW5jZWxfc2VjdGlvbnMgfHwgY25jbF9raW5kID09IGNhbmNlbF90YXNrZ3JvdXApOyAKKyAgICBLTVBfREVCVUdfQVNTRVJUKF9fa21wX2dldF9ndGlkKCkgPT0gZ3RpZCk7CisKKyAgICBpZiAoX19rbXBfb21wX2NhbmNlbGxhdGlvbikgeworICAgICAgICBzd2l0Y2ggKGNuY2xfa2luZCkgeworICAgICAgICBjYXNlIGNhbmNlbF9wYXJhbGxlbDoKKyAgICAgICAgY2FzZSBjYW5jZWxfbG9vcDoKKyAgICAgICAgY2FzZSBjYW5jZWxfc2VjdGlvbnM6CisgICAgICAgICAgICAvLyBjYW5jZWxsYXRpb24gcmVxdWVzdHMgZm9yIHBhcmFsbGVsIGFuZCB3b3Jrc2hhcmluZyBjb25zdHJ1Y3RzCisgICAgICAgICAgICAvLyBhcmUgaGFuZGxlZCB0aHJvdWdoIHRoZSB0ZWFtIHN0cnVjdHVyZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGttcF90ZWFtX3QgKnRoaXNfdGVhbSA9IHRoaXNfdGhyLT50aC50aF90ZWFtOworICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQodGhpc190ZWFtKTsKKyAgICAgICAgICAgICAgICBrbXBfaW50MzIgb2xkID0gS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFVDMyKCYodGhpc190ZWFtLT50LnRfY2FuY2VsX3JlcXVlc3QpLCBjYW5jZWxfbm9yZXEsIGNuY2xfa2luZCk7CisgICAgICAgICAgICAgICAgaWYgKG9sZCA9PSBjYW5jZWxfbm9yZXEgfHwgb2xkID09IGNuY2xfa2luZCkgeworICAgICAgICAgICAgICAgICAgICAvL3ByaW50ZigiX19rbXBjX2NhbmNlbDogdGhpc190ZWFtLT50LnRfY2FuY2VsX3JlcXVlc3Q9JWQgQCAlcFxuIiwgCisgICAgICAgICAgICAgICAgICAgIC8vICAgICAgIHRoaXNfdGVhbS0+dC50X2NhbmNlbF9yZXF1ZXN0LCAmKHRoaXNfdGVhbS0+dC50X2NhbmNlbF9yZXF1ZXN0KSk7CisgICAgICAgICAgICAgICAgICAgIC8vIHdlIGRvIG5vdCBoYXZlIGEgY2FuY2VsbGF0aW9uIHJlcXVlc3QgaW4gdGhpcyB0ZWFtIG9yIHdlIGRvIGhhdmUgb25lCisgICAgICAgICAgICAgICAgICAgIC8vIHRoYXQgbWF0Y2hlcyB0aGUgY3VycmVudCByZXF1ZXN0IC0+IGNhbmNlbAorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiB0cnVlICovOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgY2FzZSBjYW5jZWxfdGFza2dyb3VwOgorICAgICAgICAgICAgLy8gY2FuY2VsbGF0aW9uIHJlcXVlc3RzIGZvciBwYXJhbGxlbCBhbmQgd29ya3NoYXJpbmcgY29uc3RydWN0cworICAgICAgICAgICAgLy8gYXJlIGhhbmRsZWQgdGhyb3VnaCB0aGUgdGFza2dyb3VwIHN0cnVjdHVyZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGttcF90YXNrZGF0YV90KiAgdGFzazsgCisgICAgICAgICAgICAgICAga21wX3Rhc2tncm91cF90KiB0YXNrZ3JvdXA7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgdGFzayA9IHRoaXNfdGhyLT50aC50aF9jdXJyZW50X3Rhc2s7CisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGFzayApOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHRhc2tncm91cCA9IHRhc2stPnRkX3Rhc2tncm91cDsKKyAgICAgICAgICAgICAgICBpZiAodGFza2dyb3VwKSB7CisgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBvbGQgPSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVUMzIoJih0YXNrZ3JvdXAtPmNhbmNlbF9yZXF1ZXN0KSwgY2FuY2VsX25vcmVxLCBjbmNsX2tpbmQpOworICAgICAgICAgICAgICAgICAgICBpZiAob2xkID09IGNhbmNlbF9ub3JlcSB8fCBvbGQgPT0gY25jbF9raW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBkbyBub3QgaGF2ZSBhIGNhbmNlbGxhdGlvbiByZXF1ZXN0IGluIHRoaXMgdGFza2dyb3VwIG9yIHdlIGRvIGhhdmUgb25lCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGF0IG1hdGNoZXMgdGhlIGN1cnJlbnQgcmVxdWVzdCAtPiBjYW5jZWwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIHRydWUgKi87CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHdoYXQgbmVlZHMgdG8gaGFwcGVuIGhlcmU/CisgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzcGVjaWZpY2F0aW9uIGRpc2FsbG93cyBjYW5jZWxsYXRpb24gdy9vIHRhc2tncm91cHMKKyAgICAgICAgICAgICAgICAgICAgLy8gc28gd2UgbWlnaHQgZG8gYW55dGhpbmcgaGVyZSwgbGV0J3MgYWJvcnQgZm9yIG5vdworICAgICAgICAgICAgICAgICAgICBLTVBfQVNTRVJUKCAwIC8qIGZhbHNlICovKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEtNUF9BU1NFUlQgKDAgLyogZmFsc2UgKi8pOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gSUNWIE9NUF9DQU5DRUxMQVRJT049ZmFsc2UsIHNvIHdlIGlnbm9yZWQgdGhpcyBjYW5jZWwgcmVxdWVzdAorICAgIEtNUF9ERUJVR19BU1NFUlQoIV9fa21wX29tcF9jYW5jZWxsYXRpb24pOworICAgIHJldHVybiAwIC8qIGZhbHNlICovOworfQorCisvKiEKK0Bpbmdyb3VwIENBTkNFTExBVElPTgorQHBhcmFtIGxvY19yZWYgbG9jYXRpb24gb2YgdGhlIG9yaWdpbmFsIHRhc2sgZGlyZWN0aXZlCitAcGFyYW0gZ3RpZCBHbG9iYWwgdGhyZWFkIElEIG9mIGVuY291bnRlcmluZyB0aHJlYWQKK0BwYXJhbSBjbmNsX2tpbmQgQ2FuY2VsbGF0aW9uIGtpbmQgKHBhcmFsbGVsLCBmb3IsIHNlY3Rpb25zLCB0YXNrZ3JvdXApCisKK0ByZXR1cm4gcmV0dXJucyB0cnVlIGlmIGEgbWF0Y2hpbmcgY2FuY2VsbGF0aW9uIHJlcXVlc3QgaGFzIGJlZW4gZmxhZ2dlZCBpbiB0aGUgUlRMIGFuZCB0aGUgCitlbmNvdW50ZXJpbmcgdGhyZWFkIGhhcyB0byBjYW5jZWwuLgorCitDYW5jZWxsYXRpb24gcG9pbnQgZm9yIHRoZSBlbmNvdW50ZXJpbmcgdGhyZWFkLgorKi8KK2ttcF9pbnQzMiBfX2ttcGNfY2FuY2VsbGF0aW9ucG9pbnQoaWRlbnRfdCogbG9jX3JlZiwga21wX2ludDMyIGd0aWQsIGttcF9pbnQzMiBjbmNsX2tpbmQpIHsKKyAgICBrbXBfaW5mb190ICp0aGlzX3RociA9IF9fa21wX3RocmVhZHMgWyBndGlkIF07CisKKyAgICBLQ19UUkFDRSggMTAsICgiX19rbXBjX2NhbmNlbGxhdGlvbnBvaW50OiBUIyVkIHJlcXVlc3QgJWQgT01QX0NBTkNFTExBVElPTj0lZFxuIiwgZ3RpZCwgY25jbF9raW5kLCBfX2ttcF9vbXBfY2FuY2VsbGF0aW9uKSApOworCisgICAgS01QX0RFQlVHX0FTU0VSVChjbmNsX2tpbmQgIT0gY2FuY2VsX25vcmVxKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKGNuY2xfa2luZCA9PSBjYW5jZWxfcGFyYWxsZWwgfHwgY25jbF9raW5kID09IGNhbmNlbF9sb29wIHx8IAorICAgICAgICAgICAgICAgICAgICAgY25jbF9raW5kID09IGNhbmNlbF9zZWN0aW9ucyB8fCBjbmNsX2tpbmQgPT0gY2FuY2VsX3Rhc2tncm91cCk7IAorICAgIEtNUF9ERUJVR19BU1NFUlQoX19rbXBfZ2V0X2d0aWQoKSA9PSBndGlkKTsKKworICAgIGlmIChfX2ttcF9vbXBfY2FuY2VsbGF0aW9uKSB7CisgICAgICAgIHN3aXRjaCAoY25jbF9raW5kKSB7CisgICAgICAgIGNhc2UgY2FuY2VsX3BhcmFsbGVsOgorICAgICAgICBjYXNlIGNhbmNlbF9sb29wOgorICAgICAgICBjYXNlIGNhbmNlbF9zZWN0aW9uczoKKyAgICAgICAgICAgIC8vIGNhbmNlbGxhdGlvbiByZXF1ZXN0cyBmb3IgcGFyYWxsZWwgYW5kIHdvcmtzaGFyaW5nIGNvbnN0cnVjdHMKKyAgICAgICAgICAgIC8vIGFyZSBoYW5kbGVkIHRocm91Z2ggdGhlIHRlYW0gc3RydWN0dXJlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAga21wX3RlYW1fdCAqdGhpc190ZWFtID0gdGhpc190aHItPnRoLnRoX3RlYW07CisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCh0aGlzX3RlYW0pOworICAgICAgICAgICAgICAgIGlmICh0aGlzX3RlYW0tPnQudF9jYW5jZWxfcmVxdWVzdCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoY25jbF9raW5kID09IHRoaXNfdGVhbS0+dC50X2NhbmNlbF9yZXF1ZXN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcmVxdWVzdCBpbiB0aGUgdGVhbSBzdHJ1Y3R1cmUgbWF0Y2hlcyB0aGUgdHlwZSBvZgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FuY2VsbGF0aW9uIHBvaW50IHNvIHdlIGNhbiBjYW5jZWwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIHRydWUgKi87CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgS01QX0FTU0VSVCggMCAvKiBmYWxzZSAqLyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyB3ZSBkbyBub3QgaGF2ZSBhIGNhbmNlbGxhdGlvbiByZXF1ZXN0IHBlbmRpbmcsIHNvIHdlIGp1c3QKKyAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIHRoaXMgY2FuY2VsbGF0aW9uIHBvaW50CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgY2FzZSBjYW5jZWxfdGFza2dyb3VwOgorICAgICAgICAgICAgLy8gY2FuY2VsbGF0aW9uIHJlcXVlc3RzIGZvciBwYXJhbGxlbCBhbmQgd29ya3NoYXJpbmcgY29uc3RydWN0cworICAgICAgICAgICAgLy8gYXJlIGhhbmRsZWQgdGhyb3VnaCB0aGUgdGFza2dyb3VwIHN0cnVjdHVyZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGttcF90YXNrZGF0YV90KiAgdGFzazsgCisgICAgICAgICAgICAgICAga21wX3Rhc2tncm91cF90KiB0YXNrZ3JvdXA7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgdGFzayA9IHRoaXNfdGhyLT50aC50aF9jdXJyZW50X3Rhc2s7CisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGFzayApOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHRhc2tncm91cCA9IHRhc2stPnRkX3Rhc2tncm91cDsKKyAgICAgICAgICAgICAgICBpZiAodGFza2dyb3VwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHJldHVybiB0aGUgY3VycmVudCBzdGF0dXMgb2YgY2FuY2VsbGF0aW9uIGZvciB0aGUgCisgICAgICAgICAgICAgICAgICAgIC8vIHRhc2tncm91cAorICAgICAgICAgICAgICAgICAgICByZXR1cm4gISF0YXNrZ3JvdXAtPmNhbmNlbF9yZXF1ZXN0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaWYgYSBjYW5jZWxsYXRpb24gcG9pbnQgaXMgZW5jb3VudGVyZWQgYnkgYSB0YXNrCisgICAgICAgICAgICAgICAgICAgIC8vIHRoYXQgZG9lcyBub3QgYmVsb25nIHRvIGEgdGFza2dyb3VwLCBpdCBpcyBPSworICAgICAgICAgICAgICAgICAgICAvLyB0byBpZ25vcmUgaXQKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDAgLyogZmFsc2UgKi87CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgS01QX0FTU0VSVCAoMCAvKiBmYWxzZSAqLyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBJQ1YgT01QX0NBTkNFTExBVElPTj1mYWxzZSwgc28gd2UgaWdub3JlIHRoZSBjYW5jZWxsYXRpb24gcG9pbnQKKyAgICBLTVBfREVCVUdfQVNTRVJUKCFfX2ttcF9vbXBfY2FuY2VsbGF0aW9uKTsKKyAgICByZXR1cm4gMCAvKiBmYWxzZSAqLzsKK30KKworLyohCitAaW5ncm91cCBDQU5DRUxMQVRJT04KK0BwYXJhbSBsb2NfcmVmIGxvY2F0aW9uIG9mIHRoZSBvcmlnaW5hbCB0YXNrIGRpcmVjdGl2ZQorQHBhcmFtIGd0aWQgR2xvYmFsIHRocmVhZCBJRCBvZiBlbmNvdW50ZXJpbmcgdGhyZWFkCisKK0ByZXR1cm4gcmV0dXJucyB0cnVlIGlmIGEgbWF0Y2hpbmcgY2FuY2VsbGF0aW9uIHJlcXVlc3QgaGFzIGJlZW4gZmxhZ2dlZCBpbiB0aGUgUlRMIGFuZCB0aGUgCitlbmNvdW50ZXJpbmcgdGhyZWFkIGhhcyB0byBjYW5jZWwuLgorCitCYXJyaWVyIHdpdGggY2FuY2VsbGF0aW9uIHBvaW50IHRvIHNlbmQgdGhyZWFkcyBmcm9tIHRoZSBiYXJyaWVyIHRvIHRoZQorZW5kIG9mIHRoZSBwYXJhbGxlbCByZWdpb24uICBOZWVkcyBhIHNwZWNpYWwgY29kZSBwYXR0ZXJuIGFzIGRvY3VtZW50ZWQgCitpbiB0aGUgZGVzaWduIGRvY3VtZW50IGZvciB0aGUgY2FuY2VsbGF0aW9uIGZlYXR1cmUuCisqLwora21wX2ludDMyCitfX2ttcGNfY2FuY2VsX2JhcnJpZXIoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCkgeworICAgIGludCByZXQgPSAwIC8qIGZhbHNlICovOworICAgIGttcF9pbmZvX3QgKnRoaXNfdGhyID0gX19rbXBfdGhyZWFkcyBbIGd0aWQgXTsKKyAgICBrbXBfdGVhbV90ICp0aGlzX3RlYW0gPSB0aGlzX3Roci0+dGgudGhfdGVhbTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoX19rbXBfZ2V0X2d0aWQoKSA9PSBndGlkKTsKKworICAgIC8vIGNhbGwgaW50byB0aGUgc3RhbmRhcmQgYmFycmllcgorICAgIF9fa21wY19iYXJyaWVyKGxvYywgZ3RpZCk7CisKKyAgICAvLyBpZiBjYW5jZWxsYXRpb24gaXMgYWN0aXZlLCBjaGVjayBjYW5jZWxsYXRpb24gZmxhZworICAgIGlmIChfX2ttcF9vbXBfY2FuY2VsbGF0aW9uKSB7CisgICAgICAgIC8vIGRlcGVuZGluZyBvbiB3aGljaCBjb25zdHJ1Y3QgdG8gY2FuY2VsLCBjaGVjayB0aGUgZmxhZyBhbmQKKyAgICAgICAgLy8gcmVzZXQgdGhlIGZsYWcKKyAgICAgICAgc3dpdGNoICh0aGlzX3RlYW0tPnQudF9jYW5jZWxfcmVxdWVzdCkgeworICAgICAgICBjYXNlIGNhbmNlbF9wYXJhbGxlbDoKKyAgICAgICAgICAgIHJldCA9IDE7CisgICAgICAgICAgICAvLyBlbnN1cmUgdGhhdCB0aHJlYWRzIGhhdmUgY2hlY2tlZCB0aGUgZmxhZywgd2hlbgorICAgICAgICAgICAgLy8gbGVhdmluZyB0aGUgYWJvdmUgYmFycmllcgorICAgICAgICAgICAgX19rbXBjX2JhcnJpZXIobG9jLCBndGlkKTsKKyAgICAgICAgICAgIHRoaXNfdGVhbS0+dC50X2NhbmNlbF9yZXF1ZXN0ID0gY2FuY2VsX25vcmVxOworICAgICAgICAgICAgLy8gdGhlIG5leHQgYmFycmllciBpcyB0aGUgZm9yay9qb2luIGJhcnJpZXIsIHdoaWNoCisgICAgICAgICAgICAvLyBzeW5jaHJvbml6ZXMgdGhlIHRocmVhZHMgbGVhdmluZyBoZXJlICAgICAgICAKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNhbmNlbF9sb29wOgorICAgICAgICBjYXNlIGNhbmNlbF9zZWN0aW9uczoKKyAgICAgICAgICAgIHJldCA9IDE7CisgICAgICAgICAgICAvLyBlbnN1cmUgdGhhdCB0aHJlYWRzIGhhdmUgY2hlY2tlZCB0aGUgZmxhZywgd2hlbgorICAgICAgICAgICAgLy8gbGVhdmluZyB0aGUgYWJvdmUgYmFycmllcgorICAgICAgICAgICAgX19rbXBjX2JhcnJpZXIobG9jLCBndGlkKTsKKyAgICAgICAgICAgIHRoaXNfdGVhbS0+dC50X2NhbmNlbF9yZXF1ZXN0ID0gY2FuY2VsX25vcmVxOworICAgICAgICAgICAgLy8gc3luY2hyb25pemUgdGhlIHRocmVhZHMgYWdhaW4gdG8gbWFrZSBzdXJlIHdlCisgICAgICAgICAgICAvLyBkbyBub3QgaGF2ZSBhbnkgcnVuLWF3YXkgdGhyZWFkcyB0aGF0IGNhdXNlIGEgcmFjZQorICAgICAgICAgICAgLy8gb24gdGhlIGNhbmNlbGxhdGlvbiBmbGFnCisgICAgICAgICAgICBfX2ttcGNfYmFycmllcihsb2MsIGd0aWQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY2FuY2VsX3Rhc2tncm91cDoKKyAgICAgICAgICAgIC8vIHRoaXMgY2FzZSBzaG91bGQgbm90IG9jY3VyCisgICAgICAgICAgICBLTVBfQVNTRVJUICgwIC8qIGZhbHNlICovICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjYW5jZWxfbm9yZXE6CisgICAgICAgICAgICAvLyBkbyBub3RoaW5nCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEtNUF9BU1NFUlQgKCAwIC8qIGZhbHNlICovKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICByZXR1cm4gcmV0OworfQorCisvKiEKK0Bpbmdyb3VwIENBTkNFTExBVElPTgorQHBhcmFtIGxvY19yZWYgbG9jYXRpb24gb2YgdGhlIG9yaWdpbmFsIHRhc2sgZGlyZWN0aXZlCitAcGFyYW0gZ3RpZCBHbG9iYWwgdGhyZWFkIElEIG9mIGVuY291bnRlcmluZyB0aHJlYWQKKworQHJldHVybiByZXR1cm5zIHRydWUgaWYgYSBtYXRjaGluZyBjYW5jZWxsYXRpb24gcmVxdWVzdCBoYXMgYmVlbiBmbGFnZ2VkIGluIHRoZSBSVEwgYW5kIHRoZSAKK2VuY291bnRlcmluZyB0aHJlYWQgaGFzIHRvIGNhbmNlbC4uCisKK1F1ZXJ5IGZ1bmN0aW9uIHRvIHF1ZXJ5IHRoZSBjdXJyZW50IHN0YXR1cyBvZiBjYW5jZWxsYXRpb24gcmVxdWVzdHMuCitDYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQgdGhlIGZvbGxvd2luZyBwYXR0ZXJuOgorIAoraWYgKGttcF9nZXRfY2FuY2VsbGF0aW9uX3N0YXR1cyhrbXBfY2FuY2VsX3BhcmFsbGVsKSkgeworICAgIHBlcmZvcm1fY2xlYW51cCgpOworICAgICNwcmFnbWEgb21wIGNhbmNlbGxhdGlvbiBwb2ludCBwYXJhbGxlbCAgICAgIAorfQorKi8KK2ludCBfX2ttcF9nZXRfY2FuY2VsbGF0aW9uX3N0YXR1cyhpbnQgY2FuY2VsX2tpbmQpIHsKKyAgICBpZiAoX19rbXBfb21wX2NhbmNlbGxhdGlvbikgeworICAgICAgICBrbXBfaW5mb190ICp0aGlzX3RociA9IF9fa21wX2VudHJ5X3RocmVhZCgpOworICAgICAgICAKKyAgICAgICAgc3dpdGNoIChjYW5jZWxfa2luZCkgeworICAgICAgICBjYXNlIGNhbmNlbF9wYXJhbGxlbDoKKyAgICAgICAgY2FzZSBjYW5jZWxfbG9vcDoKKyAgICAgICAgY2FzZSBjYW5jZWxfc2VjdGlvbnM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAga21wX3RlYW1fdCAqdGhpc190ZWFtID0gdGhpc190aHItPnRoLnRoX3RlYW07CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNfdGVhbS0+dC50X2NhbmNlbF9yZXF1ZXN0ID09IGNhbmNlbF9raW5kOworICAgICAgICAgICAgfQorICAgICAgICBjYXNlIGNhbmNlbF90YXNrZ3JvdXA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAga21wX3Rhc2tkYXRhX3QqICB0YXNrOyAKKyAgICAgICAgICAgICAgICBrbXBfdGFza2dyb3VwX3QqIHRhc2tncm91cDsKKyAgICAgICAgICAgICAgICB0YXNrID0gdGhpc190aHItPnRoLnRoX2N1cnJlbnRfdGFzazsKKyAgICAgICAgICAgICAgICB0YXNrZ3JvdXAgPSB0YXNrLT50ZF90YXNrZ3JvdXA7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRhc2tncm91cCAmJiB0YXNrZ3JvdXAtPmNhbmNlbF9yZXF1ZXN0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDAgLyogZmFsc2UgKi87Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX2NzdXBwb3J0LmMgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfY3N1cHBvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDM5MGM2Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX2NzdXBwb3J0LmMKQEAgLTAsMCArMSwyMTczIEBACisvKgorICoga21wX2NzdXBwb3J0LmMgLS0ga2Zyb250IGxpbmthZ2Ugc3VwcG9ydCBmb3IgT3Blbk1QLgorICogJFJldmlzaW9uOiA0MzQ3MyAkCisgKiAkRGF0ZTogMjAxNC0wOS0yNiAxNTowMjo1NyAtMDUwMCAoRnJpLCAyNiBTZXAgMjAxNCkgJAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAib21wLmgiICAgICAgICAvKiBleHRlcm4gIkMiIGRlY2xhcmF0aW9ucyBvZiB1c2VyLXZpc2libGUgcm91dGluZXMgKi8KKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJrbXBfaTE4bi5oIgorI2luY2x1ZGUgImttcF9pdHQuaCIKKyNpbmNsdWRlICJrbXBfZXJyb3IuaCIKKyNpbmNsdWRlICJrbXBfc3RhdHMuaCIKKworI2RlZmluZSBNQVhfTUVTU0FHRSA1MTIKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogIGZsYWdzIHdpbGwgYmUgdXNlZCBpbiBmdXR1cmUsIGUuZy4sIHRvIGltcGxlbWVudCAqLworLyogIG9wZW5tcF9zdHJpY3QgbGlicmFyeSByZXN0cmljdGlvbnMgICAgICAgICAgICAgICAqLworCisvKiEKKyAqIEBpbmdyb3VwIFNUQVJUVVBfU0hVVERPV04KKyAqIEBwYXJhbSBsb2MgICBpbiAgIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbgorICogQHBhcmFtIGZsYWdzIGluICAgZm9yIGZ1dHVyZSB1c2UgKGN1cnJlbnRseSBpZ25vcmVkKQorICoKKyAqIEluaXRpYWxpemUgdGhlIHJ1bnRpbWUgbGlicmFyeS4gVGhpcyBjYWxsIGlzIG9wdGlvbmFsOyBpZiBpdCBpcyBub3QgbWFkZSB0aGVuCisgKiBpdCB3aWxsIGJlIGltcGxpY2l0bHkgY2FsbGVkIGJ5IGF0dGVtcHRzIHRvIHVzZSBvdGhlciBsaWJyYXJ5IGZ1bmN0aW9ucy4KKyAqCisgKi8KK3ZvaWQKK19fa21wY19iZWdpbihpZGVudF90ICpsb2MsIGttcF9pbnQzMiBmbGFncykKK3sKKyAgICAvLyBCeSBkZWZhdWx0IF9fa21wX2lnbm9yZV9tcHBiZWcoKSByZXR1cm5zIFRSVUUuCisgICAgaWYgKF9fa21wX2lnbm9yZV9tcHBiZWcoKSA9PSBGQUxTRSkgeworICAgICAgICBfX2ttcF9pbnRlcm5hbF9iZWdpbigpOworCisgICAgICAgIEtDX1RSQUNFKCAxMCwgKCJfX2ttcGNfYmVnaW46IGNhbGxlZFxuIiApICk7CisgICAgfQorfQorCisvKiEKKyAqIEBpbmdyb3VwIFNUQVJUVVBfU0hVVERPV04KKyAqIEBwYXJhbSBsb2Mgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uCisgKgorICogU2h1dGRvd24gdGhlIHJ1bnRpbWUgbGlicmFyeS4gVGhpcyBpcyBhbHNvIG9wdGlvbmFsLCBhbmQgZXZlbiBpZiBjYWxsZWQgd2lsbCBub3QKKyAqIGRvIGFueXRoaW5nIHVubGVzcyB0aGUgYEtNUF9JR05PUkVfTVBQRU5EYCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBzZXQgdG8gemVyby4KKyAgKi8KK3ZvaWQKK19fa21wY19lbmQoaWRlbnRfdCAqbG9jKQoreworICAgIC8vIEJ5IGRlZmF1bHQsIF9fa21wX2lnbm9yZV9tcHBlbmQoKSByZXR1cm5zIFRSVUUgd2hpY2ggbWFrZXMgX19rbXBjX2VuZCgpIGNhbGwgbm8tb3AuCisgICAgLy8gSG93ZXZlciwgdGhpcyBjYW4gYmUgb3ZlcnJpZGRlbiB3aXRoIEtNUF9JR05PUkVfTVBQRU5EIGVudmlyb25tZW50IHZhcmlhYmxlLgorICAgIC8vIElmIEtNUF9JR05PUkVfTVBQRU5EIGlzIDAsIF9fa21wX2lnbm9yZV9tcHBlbmQoKSByZXR1cm5zIEZBTFNFIGFuZCBfX2ttcGNfZW5kKCkKKyAgICAvLyB3aWxsIHVucmVnaXN0ZXIgdGhpcyByb290IChpdCBjYW4gY2F1c2UgbGlicmFyeSBzaHV0IGRvd24pLgorICAgIGlmIChfX2ttcF9pZ25vcmVfbXBwZW5kKCkgPT0gRkFMU0UpIHsKKyAgICAgICAgS0NfVFJBQ0UoIDEwLCAoIl9fa21wY19lbmQ6IGNhbGxlZFxuIiApICk7CisgICAgICAgIEtBX1RSQUNFKCAzMCwgKCJfX2ttcGNfZW5kXG4iICkpOworCisgICAgICAgIF9fa21wX2ludGVybmFsX2VuZF90aHJlYWQoIC0xICk7CisgICAgfQorfQorCisvKiEKK0Bpbmdyb3VwIFRIUkVBRF9TVEFURVMKK0BwYXJhbSBsb2MgU291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uLgorQHJldHVybiBUaGUgZ2xvYmFsIHRocmVhZCBpbmRleCBvZiB0aGUgYWN0aXZlIHRocmVhZC4KKworVGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIGluIGFueSBjb250ZXh0LgorCitJZiB0aGUgcnVudGltZSBoYXMgb255IGJlZW4gZW50ZXJlZCBhdCB0aGUgb3V0ZXJtb3N0IGxldmVsIGZyb20gYQorc2luZ2xlIChuZWNlc3NhcmlseSBub24tT3Blbk1QPHN1cD4qPC9zdXA+KSB0aHJlYWQsIHRoZW4gdGhlIHRocmVhZCBudW1iZXIgaXMgdGhhdAord2hpY2ggd291bGQgYmUgcmV0dXJuZWQgYnkgQHJlZiBvbXBfZ2V0X3RocmVhZF9udW0oKSBpbiB0aGUgb3V0ZXJtb3N0CithY3RpdmUgcGFyYWxsZWwgY29uc3RydWN0LiAoT3IgemVybyBpZiB0aGVyZSBpcyBubyBhY3RpdmUgcGFyYWxsZWwKK2NvbnN0cnVjdCwgc2luY2UgdGhlIG1hc3RlciB0aHJlYWQgaXMgbmVjZXNzYXJpbHkgdGhyZWFkIHplcm8pLgorCitJZiBtdWx0aXBsZSBub24tT3Blbk1QIHRocmVhZHMgYWxsIGVudGVyIGFuIE9wZW5NUCBjb25zdHJ1Y3QgdGhlbiB0aGlzCit3aWxsIGJlIGEgdW5pcXVlIHRocmVhZCBpZGVudGlmaWVyIGFtb25nIGFsbCB0aGUgdGhyZWFkcyBjcmVhdGVkIGJ5Cit0aGUgT3Blbk1QIHJ1bnRpbWUgKGJ1dCB0aGUgdmFsdWUgY2Fubm90ZSBiZSBkZWZpbmVkIGluIHRlcm1zIG9mCitPcGVuTVAgdGhyZWFkIGlkcyByZXR1cm5lZCBieSBvbXBfZ2V0X3RocmVhZF9udW0oKSkuCisKKyovCitrbXBfaW50MzIKK19fa21wY19nbG9iYWxfdGhyZWFkX251bShpZGVudF90ICpsb2MpCit7CisgICAga21wX2ludDMyIGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisKKyAgICBLQ19UUkFDRSggMTAsICgiX19rbXBjX2dsb2JhbF90aHJlYWRfbnVtOiBUIyVkXG4iLCBndGlkICkgKTsKKworICAgIHJldHVybiBndGlkOworfQorCisvKiEKK0Bpbmdyb3VwIFRIUkVBRF9TVEFURVMKK0BwYXJhbSBsb2MgU291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uLgorQHJldHVybiBUaGUgbnVtYmVyIG9mIHRocmVhZHMgdW5kZXIgY29udHJvbCBvZiB0aGUgT3Blbk1QPHN1cD4qPC9zdXA+IHJ1bnRpbWUKKworVGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIGluIGFueSBjb250ZXh0LgorSXQgcmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIHRocmVhZHMgdW5kZXIgdGhlIGNvbnRyb2wgb2YgdGhlIE9wZW5NUCBydW50aW1lLiBUaGF0IGlzCitub3QgYSBudW1iZXIgdGhhdCBjYW4gYmUgZGV0ZXJtaW5lZCBieSBhbnkgT3Blbk1QIHN0YW5kYXJkIGNhbGxzLCBzaW5jZSB0aGUgbGlicmFyeSBtYXkgYmUKK2NhbGxlZCBmcm9tIG1vcmUgdGhhbiBvbmUgbm9uLU9wZW5NUCB0aHJlYWQsIGFuZCB0aGlzIHJlZmxlY3RzIHRoZSB0b3RhbCBvdmVyIGFsbCBzdWNoIGNhbGxzLgorU2ltaWxhcmx5IHRoZSBydW50aW1lIG1haW50YWlucyB1bmRlcmx5aW5nIHRocmVhZHMgZXZlbiB3aGVuIHRoZXkgYXJlIG5vdCBhY3RpdmUgKHNpbmNlIHRoZSBjb3N0CitvZiBjcmVhdGluZyBhbmQgZGVzdHJveWluZyBPUyB0aHJlYWRzIGlzIGhpZ2gpLCB0aGlzIGNhbGwgY291bnRzIGFsbCBzdWNoIHRocmVhZHMgZXZlbiBpZiB0aGV5IGFyZSBub3QKK3dhaXRpbmcgZm9yIHdvcmsuCisqLwora21wX2ludDMyCitfX2ttcGNfZ2xvYmFsX251bV90aHJlYWRzKGlkZW50X3QgKmxvYykKK3sKKyAgICBLQ19UUkFDRSggMTAsICgiX19rbXBjX2dsb2JhbF9udW1fdGhyZWFkczogbnVtX3RocmVhZHMgPSAlZFxuIiwgX19rbXBfbnRoICkgKTsKKworICAgIHJldHVybiBUQ1JfNChfX2ttcF9udGgpOworfQorCisvKiEKK0Bpbmdyb3VwIFRIUkVBRF9TVEFURVMKK0BwYXJhbSBsb2MgU291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uLgorQHJldHVybiBUaGUgdGhyZWFkIG51bWJlciBvZiB0aGUgY2FsbGluZyB0aHJlYWQgaW4gdGhlIGlubmVybW9zdCBhY3RpdmUgcGFyYWxsZWwgY29uc3RydWN0LgorCisqLwora21wX2ludDMyCitfX2ttcGNfYm91bmRfdGhyZWFkX251bShpZGVudF90ICpsb2MpCit7CisgICAgS0NfVFJBQ0UoIDEwLCAoIl9fa21wY19ib3VuZF90aHJlYWRfbnVtOiBjYWxsZWRcbiIgKSApOworICAgIHJldHVybiBfX2ttcF90aWRfZnJvbV9ndGlkKCBfX2ttcF9lbnRyeV9ndGlkKCkgKTsKK30KKworLyohCitAaW5ncm91cCBUSFJFQURfU1RBVEVTCitAcGFyYW0gbG9jIFNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbi4KK0ByZXR1cm4gVGhlIG51bWJlciBvZiB0aHJlYWRzIGluIHRoZSBpbm5lcm1vc3QgYWN0aXZlIHBhcmFsbGVsIGNvbnN0cnVjdC4KKyovCitrbXBfaW50MzIKK19fa21wY19ib3VuZF9udW1fdGhyZWFkcyhpZGVudF90ICpsb2MpCit7CisgICAgS0NfVFJBQ0UoIDEwLCAoIl9fa21wY19ib3VuZF9udW1fdGhyZWFkczogY2FsbGVkXG4iICkgKTsKKworICAgIHJldHVybiBfX2ttcF9lbnRyeV90aHJlYWQoKSAtPiB0aC50aF90ZWFtIC0+IHQudF9ucHJvYzsKK30KKworLyohCisgKiBAaW5ncm91cCBERVBSRUNBVEVECisgKiBAcGFyYW0gbG9jIGxvY2F0aW9uIGRlc2NyaXB0aW9uCisgKgorICogVGhpcyBmdW5jdGlvbiBuZWVkIG5vdCBiZSBjYWxsZWQuIEl0IGFsd2F5cyByZXR1cm5zIFRSVUUuCisgKi8KK2ttcF9pbnQzMgorX19rbXBjX29rX3RvX2ZvcmsoaWRlbnRfdCAqbG9jKQoreworI2lmbmRlZiBLTVBfREVCVUcKKworICAgIHJldHVybiBUUlVFOworCisjZWxzZQorCisgICAgY29uc3QgY2hhciAqc2VtaTI7CisgICAgY29uc3QgY2hhciAqc2VtaTM7CisgICAgaW50IGxpbmVfbm87CisKKyAgICBpZiAoX19rbXBfcGFyX3JhbmdlID09IDApIHsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAgIHNlbWkyID0gbG9jLT5wc291cmNlOworICAgIGlmIChzZW1pMiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgICBzZW1pMiA9IHN0cmNocihzZW1pMiwgJzsnKTsKKyAgICBpZiAoc2VtaTIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgICAgc2VtaTIgPSBzdHJjaHIoc2VtaTIgKyAxLCAnOycpOworICAgIGlmIChzZW1pMiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgICBpZiAoX19rbXBfcGFyX3JhbmdlX2ZpbGVuYW1lWzBdKSB7CisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBzZW1pMiAtIDE7CisgICAgICAgIHdoaWxlICgobmFtZSA+IGxvYy0+cHNvdXJjZSkgJiYgKCpuYW1lICE9ICcvJykgJiYgKCpuYW1lICE9ICc7JykpIHsKKyAgICAgICAgICAgIG5hbWUtLTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKCpuYW1lID09ICcvJykgfHwgKCpuYW1lID09ICc7JykpIHsKKyAgICAgICAgICAgIG5hbWUrKzsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RybmNtcChfX2ttcF9wYXJfcmFuZ2VfZmlsZW5hbWUsIG5hbWUsIHNlbWkyIC0gbmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBfX2ttcF9wYXJfcmFuZ2UgPCAwOworICAgICAgICB9CisgICAgfQorICAgIHNlbWkzID0gc3RyY2hyKHNlbWkyICsgMSwgJzsnKTsKKyAgICBpZiAoX19rbXBfcGFyX3JhbmdlX3JvdXRpbmVbMF0pIHsKKyAgICAgICAgaWYgKChzZW1pMyAhPSBOVUxMKSAmJiAoc2VtaTMgPiBzZW1pMikKKyAgICAgICAgICAmJiAoc3RybmNtcChfX2ttcF9wYXJfcmFuZ2Vfcm91dGluZSwgc2VtaTIgKyAxLCBzZW1pMyAtIHNlbWkyIC0gMSkpKSB7CisgICAgICAgICAgICByZXR1cm4gX19rbXBfcGFyX3JhbmdlIDwgMDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoc3NjYW5mKHNlbWkzICsgMSwgIiVkIiwgJmxpbmVfbm8pID09IDEpIHsKKyAgICAgICAgaWYgKChsaW5lX25vID49IF9fa21wX3Bhcl9yYW5nZV9sYikgJiYgKGxpbmVfbm8gPD0gX19rbXBfcGFyX3JhbmdlX3ViKSkgeworICAgICAgICAgICAgcmV0dXJuIF9fa21wX3Bhcl9yYW5nZSA+IDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9fa21wX3Bhcl9yYW5nZSA8IDA7CisgICAgfQorICAgIHJldHVybiBUUlVFOworCisjZW5kaWYgLyogS01QX0RFQlVHICovCisKK30KKworLyohCitAaW5ncm91cCBUSFJFQURfU1RBVEVTCitAcGFyYW0gbG9jIFNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbi4KK0ByZXR1cm4gMSBpZiB0aGlzIHRocmVhZCBpcyBleGVjdXRpbmcgaW5zaWRlIGFuIGFjdGl2ZSBwYXJhbGxlbCByZWdpb24sIHplcm8gaWYgbm90LgorKi8KK2ttcF9pbnQzMgorX19rbXBjX2luX3BhcmFsbGVsKCBpZGVudF90ICpsb2MgKQoreworICAgIHJldHVybiBfX2ttcF9lbnRyeV90aHJlYWQoKSAtPiB0aC50aF9yb290IC0+IHIucl9hY3RpdmU7Cit9CisKKy8qIQorQGluZ3JvdXAgUEFSQUxMRUwKK0BwYXJhbSBsb2Mgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uCitAcGFyYW0gZ2xvYmFsX3RpZCBnbG9iYWwgdGhyZWFkIG51bWJlcgorQHBhcmFtIG51bV90aHJlYWRzIG51bWJlciBvZiB0aHJlYWRzIHJlcXVlc3RlZCBmb3IgdGhpcyBwYXJhbGxlbCBjb25zdHJ1Y3QKKworU2V0IHRoZSBudW1iZXIgb2YgdGhyZWFkcyB0byBiZSB1c2VkIGJ5IHRoZSBuZXh0IGZvcmsgc3Bhd25lZCBieSB0aGlzIHRocmVhZC4KK1RoaXMgY2FsbCBpcyBvbmx5IHJlcXVpcmVkIGlmIHRoZSBwYXJhbGxlbCBjb25zdHJ1Y3QgaGFzIGEgYG51bV90aHJlYWRzYCBjbGF1c2UuCisqLwordm9pZAorX19rbXBjX3B1c2hfbnVtX3RocmVhZHMoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wX2ludDMyIG51bV90aHJlYWRzICkKK3sKKyAgICBLQV9UUkFDRSggMjAsICgiX19rbXBjX3B1c2hfbnVtX3RocmVhZHM6IGVudGVyIFQjJWQgbnVtX3RocmVhZHM9JWRcbiIsCisgICAgICBnbG9iYWxfdGlkLCBudW1fdGhyZWFkcyApICk7CisKKyAgICBfX2ttcF9wdXNoX251bV90aHJlYWRzKCBsb2MsIGdsb2JhbF90aWQsIG51bV90aHJlYWRzICk7Cit9CisKK3ZvaWQKK19fa21wY19wb3BfbnVtX3RocmVhZHMoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCApCit7CisgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wY19wb3BfbnVtX3RocmVhZHM6IGVudGVyXG4iICkgKTsKKworICAgIC8qIHRoZSBudW1fdGhyZWFkcyBhcmUgYXV0b21hdGljYWxseSBwb3BwZWQgKi8KK30KKworCisjaWYgT01QXzQwX0VOQUJMRUQKKwordm9pZAorX19rbXBjX3B1c2hfcHJvY19iaW5kKGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQsIGttcF9pbnQzMiBwcm9jX2JpbmQgKQoreworICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcGNfcHVzaF9wcm9jX2JpbmQ6IGVudGVyIFQjJWQgcHJvY19iaW5kPSVkXG4iLAorICAgICAgZ2xvYmFsX3RpZCwgcHJvY19iaW5kICkgKTsKKworICAgIF9fa21wX3B1c2hfcHJvY19iaW5kKCBsb2MsIGdsb2JhbF90aWQsIChrbXBfcHJvY19iaW5kX3QpcHJvY19iaW5kICk7Cit9CisKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworCisKKy8qIQorQGluZ3JvdXAgUEFSQUxMRUwKK0BwYXJhbSBsb2MgIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbgorQHBhcmFtIGFyZ2MgIHRvdGFsIG51bWJlciBvZiBhcmd1bWVudHMgaW4gdGhlIGVsbGlwc2lzCitAcGFyYW0gbWljcm90YXNrICBwb2ludGVyIHRvIGNhbGxiYWNrIHJvdXRpbmUgY29uc2lzdGluZyBvZiBvdXRsaW5lZCBwYXJhbGxlbCBjb25zdHJ1Y3QKK0BwYXJhbSAuLi4gIHBvaW50ZXJzIHRvIHNoYXJlZCB2YXJpYWJsZXMgdGhhdCBhcmVuJ3QgZ2xvYmFsCisKK0RvIHRoZSBhY3R1YWwgZm9yayBhbmQgY2FsbCB0aGUgbWljcm90YXNrIGluIHRoZSByZWxldmFudCBudW1iZXIgb2YgdGhyZWFkcy4KKyovCit2b2lkCitfX2ttcGNfZm9ya19jYWxsKGlkZW50X3QgKmxvYywga21wX2ludDMyIGFyZ2MsIGttcGNfbWljcm8gbWljcm90YXNrLCAuLi4pCit7CisgIEtNUF9TVE9QX0VYUExJQ0lUX1RJTUVSKE9NUF9zZXJpYWwpOworICBLTVBfQ09VTlRfQkxPQ0soT01QX1BBUkFMTEVMKTsKKyAgaW50ICAgICAgICAgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKyAgLy8gbWF5YmUgdG8gc2F2ZSB0aHJfc3RhdGUgaXMgZW5vdWdoIGhlcmUKKyAgeworICAgIHZhX2xpc3QgICAgIGFwOworICAgIHZhX3N0YXJ0KCAgIGFwLCBtaWNyb3Rhc2sgKTsKKworI2lmIElOQ0xVREVfU1NDX01BUktTCisgICAgU1NDX01BUktfRk9SS0lORygpOworI2VuZGlmCisgICAgX19rbXBfZm9ya19jYWxsKCBsb2MsIGd0aWQsIGZvcmtfY29udGV4dF9pbnRlbCwKKyAgICAgICAgICAgIGFyZ2MsCisgICAgICAgICAgICBWT0xBVElMRV9DQVNUKG1pY3JvdGFza190KSBtaWNyb3Rhc2ssCisgICAgICAgICAgICBWT0xBVElMRV9DQVNUKGxhdW5jaF90KSAgICBfX2ttcF9pbnZva2VfdGFza19mdW5jLAorLyogVE9ETzogcmV2ZXJ0IHdvcmthcm91bmQgZm9yIEludGVsKFIpIDY0IHRyYWNrZXIgIzk2ICovCisjaWYgKEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0gfHwgS01QX0FSQ0hfQUFSQ0g2NCkgJiYgS01QX09TX0xJTlVYCisgICAgICAgICAgICAmYXAKKyNlbHNlCisgICAgICAgICAgICBhcAorI2VuZGlmCisgICAgICAgICAgICApOworI2lmIElOQ0xVREVfU1NDX01BUktTCisgICAgU1NDX01BUktfSk9JTklORygpOworI2VuZGlmCisgICAgX19rbXBfam9pbl9jYWxsKCBsb2MsIGd0aWQgKTsKKworICAgIHZhX2VuZCggYXAgKTsKKyAgfQorICBLTVBfU1RBUlRfRVhQTElDSVRfVElNRVIoT01QX3NlcmlhbCk7Cit9CisKKyNpZiBPTVBfNDBfRU5BQkxFRAorLyohCitAaW5ncm91cCBQQVJBTExFTAorQHBhcmFtIGxvYyBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24KK0BwYXJhbSBnbG9iYWxfdGlkIGdsb2JhbCB0aHJlYWQgbnVtYmVyCitAcGFyYW0gbnVtX3RlYW1zIG51bWJlciBvZiB0ZWFtcyByZXF1ZXN0ZWQgZm9yIHRoZSB0ZWFtcyBjb25zdHJ1Y3QKKworU2V0IHRoZSBudW1iZXIgb2YgdGVhbXMgdG8gYmUgdXNlZCBieSB0aGUgdGVhbXMgY29uc3RydWN0LgorVGhpcyBjYWxsIGlzIG9ubHkgcmVxdWlyZWQgaWYgdGhlIHRlYW1zIGNvbnN0cnVjdCBoYXMgYSBgbnVtX3RlYW1zYCBjbGF1c2UKK29yIGEgYHRocmVhZF9saW1pdGAgY2xhdXNlIChvciBib3RoKS4KKyovCit2b2lkCitfX2ttcGNfcHVzaF9udW1fdGVhbXMoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wX2ludDMyIG51bV90ZWFtcywga21wX2ludDMyIG51bV90aHJlYWRzICkKK3sKKyAgICBLQV9UUkFDRSggMjAsICgiX19rbXBjX3B1c2hfbnVtX3RlYW1zOiBlbnRlciBUIyVkIG51bV90ZWFtcz0lZCBudW1fdGhyZWFkcz0lZFxuIiwKKyAgICAgIGdsb2JhbF90aWQsIG51bV90ZWFtcywgbnVtX3RocmVhZHMgKSApOworCisgICAgX19rbXBfcHVzaF9udW1fdGVhbXMoIGxvYywgZ2xvYmFsX3RpZCwgbnVtX3RlYW1zLCBudW1fdGhyZWFkcyApOworfQorCisvKiEKK0Bpbmdyb3VwIFBBUkFMTEVMCitAcGFyYW0gbG9jICBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24KK0BwYXJhbSBhcmdjICB0b3RhbCBudW1iZXIgb2YgYXJndW1lbnRzIGluIHRoZSBlbGxpcHNpcworQHBhcmFtIG1pY3JvdGFzayAgcG9pbnRlciB0byBjYWxsYmFjayByb3V0aW5lIGNvbnNpc3Rpbmcgb2Ygb3V0bGluZWQgdGVhbXMgY29uc3RydWN0CitAcGFyYW0gLi4uICBwb2ludGVycyB0byBzaGFyZWQgdmFyaWFibGVzIHRoYXQgYXJlbid0IGdsb2JhbAorCitEbyB0aGUgYWN0dWFsIGZvcmsgYW5kIGNhbGwgdGhlIG1pY3JvdGFzayBpbiB0aGUgcmVsZXZhbnQgbnVtYmVyIG9mIHRocmVhZHMuCisqLwordm9pZAorX19rbXBjX2ZvcmtfdGVhbXMoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgYXJnYywga21wY19taWNybyBtaWNyb3Rhc2ssIC4uLikKK3sKKyAgICBpbnQgICAgICAgICBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOworICAgIGttcF9pbmZvX3QgKnRoaXNfdGhyID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworICAgIHZhX2xpc3QgICAgIGFwOworICAgIHZhX3N0YXJ0KCAgIGFwLCBtaWNyb3Rhc2sgKTsKKworICAgIC8vIHJlbWVtYmVyIHRlYW1zIGVudHJ5IHBvaW50IGFuZCBuZXN0aW5nIGxldmVsCisgICAgdGhpc190aHItPnRoLnRoX3RlYW1zX21pY3JvdGFzayA9IG1pY3JvdGFzazsKKyAgICB0aGlzX3Roci0+dGgudGhfdGVhbXNfbGV2ZWwgPSB0aGlzX3Roci0+dGgudGhfdGVhbS0+dC50X2xldmVsOyAvLyBBQzogY2FuIGJlID4wIG9uIGhvc3QKKworICAgIC8vIGNoZWNrIGlmIF9fa21wY19wdXNoX251bV90ZWFtcyBjYWxsZWQsIHNldCBkZWZhdWx0IG51bWJlciBvZiB0ZWFtcyBvdGhlcndpc2UKKyAgICBpZiAoIHRoaXNfdGhyLT50aC50aF90ZWFtc19zaXplLm50ZWFtcyA9PSAwICkgeworICAgICAgICBfX2ttcF9wdXNoX251bV90ZWFtcyggbG9jLCBndGlkLCAwLCAwICk7CisgICAgfQorICAgIEtNUF9ERUJVR19BU1NFUlQodGhpc190aHItPnRoLnRoX3NldF9ucHJvYyA+PSAxKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKHRoaXNfdGhyLT50aC50aF90ZWFtc19zaXplLm50ZWFtcyA+PSAxKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKHRoaXNfdGhyLT50aC50aF90ZWFtc19zaXplLm50aCA+PSAxKTsKKworICAgIF9fa21wX2ZvcmtfY2FsbCggbG9jLCBndGlkLCBmb3JrX2NvbnRleHRfaW50ZWwsCisgICAgICAgICAgICBhcmdjLAorICAgICAgICAgICAgVk9MQVRJTEVfQ0FTVChtaWNyb3Rhc2tfdCkgX19rbXBfdGVhbXNfbWFzdGVyLAorICAgICAgICAgICAgVk9MQVRJTEVfQ0FTVChsYXVuY2hfdCkgICAgX19rbXBfaW52b2tlX3RlYW1zX21hc3RlciwKKyNpZiAoS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSB8fCBLTVBfQVJDSF9BQVJDSDY0KSAmJiBLTVBfT1NfTElOVVgKKyAgICAgICAgICAgICZhcAorI2Vsc2UKKyAgICAgICAgICAgIGFwCisjZW5kaWYKKyAgICAgICAgICAgICk7CisgICAgX19rbXBfam9pbl9jYWxsKCBsb2MsIGd0aWQgKTsKKyAgICB0aGlzX3Roci0+dGgudGhfdGVhbXNfbWljcm90YXNrID0gTlVMTDsKKyAgICB0aGlzX3Roci0+dGgudGhfdGVhbXNfbGV2ZWwgPSAwOworICAgICooa21wX2ludDY0KikoJnRoaXNfdGhyLT50aC50aF90ZWFtc19zaXplKSA9IDBMOworICAgIHZhX2VuZCggYXAgKTsKK30KKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworCisKKy8vCisvLyBJIGRvbid0IHRoaW5rIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGV2ZXIgaGF2ZSBiZWVuIGV4cG9ydGVkLgorLy8gVGhlIF9fa21wY18gcHJlZml4IHdhcyBtaXNhcHBsaWVkLiAgSSdtIGZhaXJseSBjZXJ0YWluIHRoYXQgbm8gZ2VuZXJhdGVkCisvLyBvcGVubXAgY29kZSBldmVyIGNhbGxlZCBpdCwgYnV0IGl0J3MgYmVlbiBleHBvcnRlZCBmcm9tIHRoZSBSVEwgZm9yIHNvCisvLyBsb25nIHRoYXQgSSdtIGFmcmFpZCB0byByZW1vdmUgdGhlIGRlZmluaXRpb24uCisvLworaW50CitfX2ttcGNfaW52b2tlX3Rhc2tfZnVuYyggaW50IGd0aWQgKQoreworICAgIHJldHVybiBfX2ttcF9pbnZva2VfdGFza19mdW5jKCBndGlkICk7Cit9CisKKy8qIQorQGluZ3JvdXAgUEFSQUxMRUwKK0BwYXJhbSBsb2MgIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbgorQHBhcmFtIGdsb2JhbF90aWQgIGdsb2JhbCB0aHJlYWQgbnVtYmVyCisKK0VudGVyIGEgc2VyaWFsaXplZCBwYXJhbGxlbCBjb25zdHJ1Y3QuIFRoaXMgaW50ZXJmYWNlIGlzIHVzZWQgdG8gaGFuZGxlIGEKK2NvbmRpdGlvbmFsIHBhcmFsbGVsIHJlZ2lvbiwgbGlrZSB0aGlzLAorQGNvZGUKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGlmIChjb25kaXRpb24pCitAZW5kY29kZQord2hlbiB0aGUgY29uZGl0aW9uIGlzIGZhbHNlLgorKi8KK3ZvaWQKK19fa21wY19zZXJpYWxpemVkX3BhcmFsbGVsKGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQpCit7CisgICAgX19rbXBfc2VyaWFsaXplZF9wYXJhbGxlbChsb2MsIGdsb2JhbF90aWQpOyAvKiBUaGUgaW1wbGVtZW50YXRpb24gaXMgbm93IGluIGttcF9ydW50aW1lLmMgc28gdGhhdCBpdCBjYW4gc2hhcmUgc3RhdGljIGZ1bmN0aW9ucyB3aXRoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBrbXBfZm9ya19jYWxsIHNpbmNlIHRoZSB0YXNrcyB0byBiZSBkb25lIGFyZSBzaW1pbGFyIGluIGVhY2ggY2FzZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworfQorCisvKiEKK0Bpbmdyb3VwIFBBUkFMTEVMCitAcGFyYW0gbG9jICBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24KK0BwYXJhbSBnbG9iYWxfdGlkICBnbG9iYWwgdGhyZWFkIG51bWJlcgorCitMZWF2ZSBhIHNlcmlhbGl6ZWQgcGFyYWxsZWwgY29uc3RydWN0LgorKi8KK3ZvaWQKK19fa21wY19lbmRfc2VyaWFsaXplZF9wYXJhbGxlbChpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkKQoreworICAgIGttcF9pbnRlcm5hbF9jb250cm9sX3QgKnRvcDsKKyAgICBrbXBfaW5mb190ICp0aGlzX3RocjsKKyAgICBrbXBfdGVhbV90ICpzZXJpYWxfdGVhbTsKKworICAgIEtDX1RSQUNFKCAxMCwgKCJfX2ttcGNfZW5kX3NlcmlhbGl6ZWRfcGFyYWxsZWw6IGNhbGxlZCBieSBUIyVkXG4iLCBnbG9iYWxfdGlkICkgKTsKKworICAgIC8qIHNraXAgYWxsIHRoaXMgY29kZSBmb3IgYXV0b3BhciBzZXJpYWxpemVkIGxvb3BzIHNpbmNlIGl0IHJlc3VsdHMgaW4KKyAgICAgICB1bmFjY2VwdGFibGUgb3ZlcmhlYWQgKi8KKyAgICBpZiggbG9jICE9IE5VTEwgJiYgKGxvYy0+ZmxhZ3MgJiBLTVBfSURFTlRfQVVUT1BBUiApICkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gTm90IGF1dG9wYXIgY29kZQorICAgIGlmKCAhIFRDUl80KCBfX2ttcF9pbml0X3BhcmFsbGVsICkgKQorICAgICAgICBfX2ttcF9wYXJhbGxlbF9pbml0aWFsaXplKCk7CisKKyAgICB0aGlzX3RociAgICA9IF9fa21wX3RocmVhZHNbIGdsb2JhbF90aWQgXTsKKyAgICBzZXJpYWxfdGVhbSA9IHRoaXNfdGhyLT50aC50aF9zZXJpYWxfdGVhbTsKKworICAgIEtNUF9NQigpOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHNlcmlhbF90ZWFtICk7CisgICAgS01QX0FTU0VSVCggICAgICAgc2VyaWFsX3RlYW0gLT4gdC50X3NlcmlhbGl6ZWQgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aGlzX3RociAtPiB0aC50aF90ZWFtID09IHNlcmlhbF90ZWFtICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggc2VyaWFsX3RlYW0gIT0gdGhpc190aHItPnRoLnRoX3Jvb3QtPnIucl9yb290X3RlYW0gKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBzZXJpYWxfdGVhbSAtPiB0LnRfdGhyZWFkcyApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHNlcmlhbF90ZWFtIC0+IHQudF90aHJlYWRzWzBdID09IHRoaXNfdGhyICk7CisKKyAgICAvKiBJZiBuZWNlc3NhcnksIHBvcCB0aGUgaW50ZXJuYWwgY29udHJvbCBzdGFjayB2YWx1ZXMgYW5kIHJlcGxhY2UgdGhlIHRlYW0gdmFsdWVzICovCisgICAgdG9wID0gc2VyaWFsX3RlYW0gLT4gdC50X2NvbnRyb2xfc3RhY2tfdG9wOworICAgIGlmICggdG9wICYmIHRvcCAtPiBzZXJpYWxfbmVzdGluZ19sZXZlbCA9PSBzZXJpYWxfdGVhbSAtPiB0LnRfc2VyaWFsaXplZCApIHsKKyAgICAgICAgY29weV9pY3ZzKCAmc2VyaWFsX3RlYW0gLT4gdC50X3RocmVhZHNbMF0gLT4gdGgudGhfY3VycmVudF90YXNrIC0+IHRkX2ljdnMsIHRvcCApOworICAgICAgICBzZXJpYWxfdGVhbSAtPiB0LnRfY29udHJvbF9zdGFja190b3AgPSB0b3AgLT4gbmV4dDsKKyAgICAgICAgX19rbXBfZnJlZSh0b3ApOworICAgIH0KKworICAgIC8vaWYoIHNlcmlhbF90ZWFtIC0+IHQudF9zZXJpYWxpemVkID4gMSApCisgICAgc2VyaWFsX3RlYW0gLT4gdC50X2xldmVsLS07CisKKyAgICAvKiBwb3AgZGlzcGF0Y2ggYnVmZmVycyBzdGFjayAqLworICAgIEtNUF9ERUJVR19BU1NFUlQoc2VyaWFsX3RlYW0tPnQudF9kaXNwYXRjaC0+dGhfZGlzcF9idWZmZXIpOworICAgIHsKKyAgICAgICAgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3QgKiBkaXNwX2J1ZmZlciA9IHNlcmlhbF90ZWFtLT50LnRfZGlzcGF0Y2gtPnRoX2Rpc3BfYnVmZmVyOworICAgICAgICBzZXJpYWxfdGVhbS0+dC50X2Rpc3BhdGNoLT50aF9kaXNwX2J1ZmZlciA9CisgICAgICAgICAgICBzZXJpYWxfdGVhbS0+dC50X2Rpc3BhdGNoLT50aF9kaXNwX2J1ZmZlci0+bmV4dDsKKyAgICAgICAgX19rbXBfZnJlZSggZGlzcF9idWZmZXIgKTsKKyAgICB9CisKKyAgICAtLSBzZXJpYWxfdGVhbSAtPiB0LnRfc2VyaWFsaXplZDsKKyAgICBpZiAoIHNlcmlhbF90ZWFtIC0+IHQudF9zZXJpYWxpemVkID09IDAgKSB7CisKKyAgICAgICAgLyogcmV0dXJuIHRvIHRoZSBwYXJhbGxlbCBzZWN0aW9uICovCisKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisgICAgICAgIGlmICggX19rbXBfaW5oZXJpdF9mcF9jb250cm9sICYmIHNlcmlhbF90ZWFtLT50LnRfZnBfY29udHJvbF9zYXZlZCApIHsKKyAgICAgICAgICAgIF9fa21wX2NsZWFyX3g4N19mcHVfc3RhdHVzX3dvcmQoKTsKKyAgICAgICAgICAgIF9fa21wX2xvYWRfeDg3X2ZwdV9jb250cm9sX3dvcmQoICZzZXJpYWxfdGVhbS0+dC50X3g4N19mcHVfY29udHJvbF93b3JkICk7CisgICAgICAgICAgICBfX2ttcF9sb2FkX214Y3NyKCAmc2VyaWFsX3RlYW0tPnQudF9teGNzciApOworICAgICAgICB9CisjZW5kaWYgLyogS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCAqLworCisgICAgICAgIHRoaXNfdGhyIC0+IHRoLnRoX3RlYW0gICAgICAgICAgID0gc2VyaWFsX3RlYW0gLT4gdC50X3BhcmVudDsKKyAgICAgICAgdGhpc190aHIgLT4gdGgudGhfaW5mby5kcy5kc190aWQgPSBzZXJpYWxfdGVhbSAtPiB0LnRfbWFzdGVyX3RpZDsKKworICAgICAgICAvKiByZXN0b3JlIHZhbHVlcyBjYWNoZWQgaW4gdGhlIHRocmVhZCAqLworICAgICAgICB0aGlzX3RociAtPiB0aC50aF90ZWFtX25wcm9jICAgICA9IHNlcmlhbF90ZWFtIC0+IHQudF9wYXJlbnQgLT4gdC50X25wcm9jOyAgICAgICAgICAvKiAgSlBIICovCisgICAgICAgIHRoaXNfdGhyIC0+IHRoLnRoX3RlYW1fbWFzdGVyICAgID0gc2VyaWFsX3RlYW0gLT4gdC50X3BhcmVudCAtPiB0LnRfdGhyZWFkc1swXTsgICAgIC8qIEpQSCAqLworICAgICAgICB0aGlzX3RociAtPiB0aC50aF90ZWFtX3NlcmlhbGl6ZWQgPSB0aGlzX3RociAtPiB0aC50aF90ZWFtIC0+IHQudF9zZXJpYWxpemVkOworCisgICAgICAgIC8qIFRPRE8gdGhlIGJlbG93IHNob3VsZG4ndCBuZWVkIHRvIGJlIGFkanVzdGVkIGZvciBzZXJpYWxpemVkIHRlYW1zICovCisgICAgICAgIHRoaXNfdGhyIC0+IHRoLnRoX2Rpc3BhdGNoICAgICAgID0gJiB0aGlzX3RociAtPiB0aC50aF90ZWFtIC0+CisgICAgICAgICAgICB0LnRfZGlzcGF0Y2hbIHNlcmlhbF90ZWFtIC0+IHQudF9tYXN0ZXJfdGlkIF07CisKKyAgICAgICAgX19rbXBfcG9wX2N1cnJlbnRfdGFza19mcm9tX3RocmVhZCggdGhpc190aHIgKTsKKworICAgICAgICBLTVBfQVNTRVJUKCB0aGlzX3RociAtPiB0aC50aF9jdXJyZW50X3Rhc2sgLT4gdGRfZmxhZ3MuZXhlY3V0aW5nID09IDAgKTsKKyAgICAgICAgdGhpc190aHIgLT4gdGgudGhfY3VycmVudF90YXNrIC0+IHRkX2ZsYWdzLmV4ZWN1dGluZyA9IDE7CisKKyAgICAgICAgaWYgKCBfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYyApIHsKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBDb3B5IHRoZSB0YXNrIHRlYW0gZnJvbSB0aGUgbmV3IGNoaWxkIC8gb2xkIHBhcmVudCB0ZWFtCisgICAgICAgICAgICAvLyB0byB0aGUgdGhyZWFkLiAgSWYgbm9uLU5VTEwsIGNvcHkgdGhlIHN0YXRlIGZsYWcgYWxzby4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBpZiAoICggdGhpc190aHIgLT4gdGgudGhfdGFza190ZWFtID0gdGhpc190aHIgLT4gdGgudGhfdGVhbSAtPiB0LnRfdGFza190ZWFtICkgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICB0aGlzX3RociAtPiB0aC50aF90YXNrX3N0YXRlID0gdGhpc190aHIgLT4gdGgudGhfdGFza190ZWFtIC0+IHR0LnR0X3N0YXRlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgS0FfVFJBQ0UoIDIwLCAoICJfX2ttcGNfZW5kX3NlcmlhbGl6ZWRfcGFyYWxsZWw6IFQjJWQgcmVzdG9yaW5nIHRhc2tfdGVhbSAlcCAvIHRlYW0gJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsX3RpZCwgdGhpc190aHIgLT4gdGgudGhfdGFza190ZWFtLCB0aGlzX3RociAtPiB0aC50aF90ZWFtICkgKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmICggX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMgKSB7CisgICAgICAgICAgICBLQV9UUkFDRSggMjAsICggIl9fa21wY19lbmRfc2VyaWFsaXplZF9wYXJhbGxlbDogVCMlZCBkZWNyZWFzaW5nIG5lc3RpbmcgZGVwdGggb2Ygc2VyaWFsIHRlYW0gJXAgdG8gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsX3RpZCwgc2VyaWFsX3RlYW0sIHNlcmlhbF90ZWFtIC0+IHQudF9zZXJpYWxpemVkICkgKTsKKyAgICAgICAgfQorICAgIH0KKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBrbXBfdWludDY0IGN1cl90aW1lID0gMDsKKyNpZiAgVVNFX0lUVF9OT1RJRlkKKyAgICBpZiggX19pdHRfZ2V0X3RpbWVzdGFtcF9wdHIgKSB7CisgICAgICAgIGN1cl90aW1lID0gX19pdHRfZ2V0X3RpbWVzdGFtcCgpOworICAgIH0KKyNlbmRpZiAvKiBVU0VfSVRUX05PVElGWSAqLworICAgIC8vIFJlcG9ydCB0aGUgYmFycmllcgorICAgIGlmKCAoIF9fa21wX2Zvcmtqb2luX2ZyYW1lc19tb2RlID09IDEgfHwgX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGUgPT0gMyApICYmIF9faXR0X2ZyYW1lX3N1Ym1pdF92M19wdHIgKSB7CisgICAgICAgIGlmKCB0aGlzX3Roci0+dGgudGhfdGVhbS0+dC50X2xldmVsID09IDAgKSB7CisgICAgICAgICAgICBfX2ttcF9pdHRfZnJhbWVfc3VibWl0KCBnbG9iYWxfdGlkLCB0aGlzX3Roci0+dGgudGhfZnJhbWVfdGltZV9zZXJpYWxpemVkLCBjdXJfdGltZSwgMCwgbG9jLCB0aGlzX3Roci0+dGgudGhfdGVhbV9ucHJvYywgMCApOworICAgICAgICB9CisgICAgfQorICAgIC8vIE1hcmsgdGhlIGVuZCBvZiB0aGUgInBhcmFsbGVsIiByZWdpb24gZm9yIFZUdW5lLiBPbmx5IHVzZSBvbmUgb2YgZnJhbWUgbm90aWZpY2F0aW9uIHNjaGVtZSBhdCB0aGUgbW9tZW50LgorICAgIGlmICggKCBfX2l0dF9mcmFtZV9lbmRfdjNfcHRyICYmIF9fa21wX2Zvcmtqb2luX2ZyYW1lcyAmJiAhIF9fa21wX2Zvcmtqb2luX2ZyYW1lc19tb2RlICkgfHwgS01QX0lUVF9ERUJVRyApCisgICAgeworICAgICAgICB0aGlzX3Roci0+dGgudGhfaWRlbnQgPSBsb2M7CisgICAgICAgIF9fa21wX2l0dF9yZWdpb25fam9pbmVkKCBnbG9iYWxfdGlkLCAxICk7CisgICAgfQorICAgIGlmICggKCBfX2l0dF9mcmFtZV9zdWJtaXRfdjNfcHRyICYmIF9fa21wX2Zvcmtqb2luX2ZyYW1lc19tb2RlID09IDMgKSB8fCBLTVBfSVRUX0RFQlVHICkKKyAgICB7CisgICAgICAgIHRoaXNfdGhyLT50aC50aF9pZGVudCA9IGxvYzsKKyAgICAgICAgLy8gU2luY2UgYmFycmllciBmcmFtZSBmb3Igc2VyaWFsaXplZCByZWdpb24gaXMgZXF1YWwgdG8gdGhlIHJlZ2lvbiB3ZSB1c2UgdGhlIHNhbWUgYmVnaW4gdGltZXN0YW1wIGFzIGZvciB0aGUgYmFycmllci4KKyAgICAgICAgX19rbXBfaXR0X2ZyYW1lX3N1Ym1pdCggZ2xvYmFsX3RpZCwgc2VyaWFsX3RlYW0tPnQudF9yZWdpb25fdGltZSwgY3VyX3RpbWUsIDAsIGxvYywgdGhpc190aHItPnRoLnRoX3RlYW1fbnByb2MsIDIgKTsKKyAgICB9CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKQorICAgICAgICBfX2ttcF9wb3BfcGFyYWxsZWwoIGdsb2JhbF90aWQsIE5VTEwgKTsKK30KKworLyohCitAaW5ncm91cCBTWU5DSFJPTklaQVRJT04KK0BwYXJhbSBsb2MgIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbi4KK0BwYXJhbSAuLi4gIHBvaW50ZXJzIHRvIHRoZSB2YXJpYWJsZXMgdG8gYmUgc3luY2hyb25pemVkLgorCitFeGVjdXRlIDx0dD5mbHVzaDwvdHQ+LiBUaGUgcG9pbnRlcnMgdG8gdGhlIHZhcmlhYmxlcyB0byBiZSBmbHVzaGVkCituZWVkIG5vdCBhY3R1YWxseSBiZSBwYXNzZWQsIChpbmRlZWQgdW5sZXNzIHRoaXMgaXMgYSB6ZXJvIHRlcm1pbmF0ZWQKK2xpc3QgdGhleSBjYW4ndCBiZSBzaW5jZSB0aGVyZSdzIG5vIGNvdW50IGhlcmUgc28gd2UgZG9uJ3Qga25vdyBob3cKK21hbnkgdGhlcmUgYXJlISkuICBUaGlzIGlzIGltcGxlbWVudGVkIGFzIGEgZnVsbCBtZW1vcnkgZmVuY2UuIChUaG91Z2gKK2RlcGVuZGluZyBvbiB0aGUgbWVtb3J5IG9yZGVyaW5nIGNvbnZlbnRpb24gb2JleWVkIGJ5IHRoZSBjb21waWxlcgorZXZlbiB0aGF0IG1heSBub3QgYmUgbmVjZXNzYXJ5KS4KKyovCit2b2lkCitfX2ttcGNfZmx1c2goaWRlbnRfdCAqbG9jLCAuLi4pCit7CisgICAgS0NfVFJBQ0UoIDEwLCAoIl9fa21wY19mbHVzaDogY2FsbGVkXG4iICkgKTsKKworICAgIC8qIG5lZWQgZXhwbGljaXQgX19tZigpIGhlcmUgc2luY2UgdXNlIHZvbGF0aWxlIGluc3RlYWQgaW4gbGlicmFyeSAqLworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgI2lmICggS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCApCisgICAgICAgICNpZiBLTVBfTUlDCisgICAgICAgICAgICAvLyBmZW5jZS1zdHlsZSBpbnN0cnVjdGlvbnMgZG8gbm90IGV4aXN0LCBidXQgbG9jazsgeGFkZGwgJDAsKCVyc3ApIGNhbiBiZSB1c2VkLgorICAgICAgICAgICAgLy8gV2Ugc2hvdWxkbid0IG5lZWQgaXQsIHRob3VnaCwgc2luY2UgdGhlIEFCSSBydWxlcyByZXF1aXJlIHRoYXQKKyAgICAgICAgICAgIC8vICogSWYgdGhlIGNvbXBpbGVyIGdlbmVyYXRlcyBOR08gc3RvcmVzIGl0IGFsc28gZ2VuZXJhdGVzIHRoZSBmZW5jZQorICAgICAgICAgICAgLy8gKiBJZiB1c2VycyBoYW5kLWNvZGUgTkdPIHN0b3JlcyB0aGV5IHNob3VsZCBpbnNlcnQgdGhlIGZlbmNlCisgICAgICAgICAgICAvLyB0aGVyZWZvcmUgbm8gaW5jb21wbGV0ZSB1bm9yZGVyZWQgc3RvcmVzIHNob3VsZCBiZSB2aXNpYmxlLgorICAgICAgICAjZWxzZQorICAgICAgICAgICAgLy8gQzc0NDA0CisgICAgICAgICAgICAvLyBUaGlzIGlzIHRvIGFkZHJlc3Mgbm9uLXRlbXBvcmFsIHN0b3JlIGluc3RydWN0aW9ucyAoc2ZlbmNlIG5lZWRlZCkuCisgICAgICAgICAgICAvLyBUaGUgY2xmbHVzaCBpbnN0cnVjdGlvbiBpcyBhZGRyZXNzZWQgZWl0aGVyIChtZmVuY2UgbmVlZGVkKS4KKyAgICAgICAgICAgIC8vIFByb2JhYmx5IHRoZSBub24tdGVtcG9yYWwgbG9hZCBtb252dGRxYSBpbnN0cnVjdGlvbiBzaG91bGQgYWxzbyBiZSBhZGRyZXNzZWQuCisgICAgICAgICAgICAvLyBtZmVuY2UgaXMgYSBTU0UyIGluc3RydWN0aW9uLiBEbyBub3QgZXhlY3V0ZSBpdCBpZiBDUFUgaXMgbm90IFNTRTIuCisgICAgICAgICAgICBpZiAoICEgX19rbXBfY3B1aW5mby5pbml0aWFsaXplZCApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9xdWVyeV9jcHVpZCggJiBfX2ttcF9jcHVpbmZvICk7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgaWYgKCAhIF9fa21wX2NwdWluZm8uc3NlMiApIHsKKyAgICAgICAgICAgICAgICAvLyBDUFUgY2Fubm90IGV4ZWN1dGUgU1NFMiBpbnN0cnVjdGlvbnMuCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICNpZiBLTVBfQ09NUElMRVJfSUNDIHx8IEtNUF9DT01QSUxFUl9NU1ZDCisgICAgICAgICAgICAgICAgX21tX21mZW5jZSgpOworICAgICAgICAgICAgICAgICNlbHNlCisgICAgICAgICAgICAgICAgX19zeW5jX3N5bmNocm9uaXplKCk7CisgICAgICAgICAgICAgICAgI2VuZGlmIC8vIEtNUF9DT01QSUxFUl9JQ0MKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICNlbmRpZiAvLyBLTVBfTUlDCisgICAgI2VsaWYgKEtNUF9BUkNIX0FSTSB8fCBLTVBfQVJDSF9BQVJDSDY0KQorICAgICAgICAvLyBOb3RoaW5nIHRvIHNlZSBoZXJlIG1vdmUgYWxvbmcKKyAgICAjZWxpZiBLTVBfQVJDSF9QUEM2NAorICAgICAgICAvLyBOb3RoaW5nIG5lZWRlZCBoZXJlICh3ZSBoYXZlIGEgcmVhbCBNQiBhYm92ZSkuCisgICAgICAgICNpZiBLTVBfT1NfQ05LCisgICAgICAgIC8vIFRoZSBmbHVzaGluZyB0aHJlYWQgbmVlZHMgdG8geWllbGQgaGVyZTsgdGhpcyBwcmV2ZW50cyBhCisgICAgICAgLy8gYnVzeS13YWl0aW5nIHRocmVhZCBmcm9tIHNhdHVyYXRpbmcgdGhlIHBpcGVsaW5lLiBmbHVzaCBpcworICAgICAgICAgIC8vIG9mdGVuIHVzZWQgaW4gbG9vcHMgbGlrZSB0aGlzOgorICAgICAgICAgICAvLyB3aGlsZSAoIWZsYWcpIHsKKyAgICAgICAgICAgLy8gICAjcHJhZ21hIG9tcCBmbHVzaChmbGFnKQorICAgICAgICAgICAvLyB9CisgICAgICAgLy8gYW5kIGFkZGluZyB0aGUgeWllbGQgaGVyZSBpcyBnb29kIGZvciBhdCBsZWFzdCBhIDEweCBzcGVlZHVwCisgICAgICAgICAgLy8gd2hlbiBydW5uaW5nID4yIHRocmVhZHMgcGVyIGNvcmUgKG9uIHRoZSBOQVMgTFUgYmVuY2htYXJrKS4KKyAgICAgICAgICAgIF9fa21wX3lpZWxkKFRSVUUpOworICAgICAgICAjZW5kaWYKKyAgICAjZWxzZQorICAgICAgICAjZXJyb3IgVW5rbm93biBvciB1bnN1cHBvcnRlZCBhcmNoaXRlY3R1cmUKKyAgICAjZW5kaWYKKworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiEKK0Bpbmdyb3VwIFNZTkNIUk9OSVpBVElPTgorQHBhcmFtIGxvYyBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24KK0BwYXJhbSBnbG9iYWxfdGlkIHRocmVhZCBpZC4KKworRXhlY3V0ZSBhIGJhcnJpZXIuCisqLwordm9pZAorX19rbXBjX2JhcnJpZXIoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCkKK3sKKyAgICBLTVBfQ09VTlRfQkxPQ0soT01QX0JBUlJJRVIpOworICAgIEtNUF9USU1FX0JMT0NLKE9NUF9iYXJyaWVyKTsKKyAgICBpbnQgZXhwbGljaXRfYmFycmllcl9mbGFnOworICAgIEtDX1RSQUNFKCAxMCwgKCJfX2ttcGNfYmFycmllcjogY2FsbGVkIFQjJWRcbiIsIGdsb2JhbF90aWQgKSApOworCisgICAgaWYgKCEgVENSXzQoX19rbXBfaW5pdF9wYXJhbGxlbCkpCisgICAgICAgIF9fa21wX3BhcmFsbGVsX2luaXRpYWxpemUoKTsKKworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBpZiAoIGxvYyA9PSAwICkgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoIENvbnN0cnVjdElkZW50SW52YWxpZCApOyAvLyA/Pz8gV2hhdCBkb2VzIGl0IG1lYW4gZm9yIHRoZSB1c2VyPworICAgICAgICB9OyAvLyBpZgorCisgICAgICAgIF9fa21wX2NoZWNrX2JhcnJpZXIoIGdsb2JhbF90aWQsIGN0X2JhcnJpZXIsIGxvYyApOworICAgIH0KKworICAgIF9fa21wX3RocmVhZHNbIGdsb2JhbF90aWQgXS0+dGgudGhfaWRlbnQgPSBsb2M7CisgICAgLy8gVE9ETzogZXhwbGljaXQgYmFycmllcl93YWl0X2lkOgorICAgIC8vICAgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiAnYmFycmllcicgZGlyZWN0aXZlIGlzIHByZXNlbnQgb3IKKyAgICAvLyAgIGltcGxpY2l0IGJhcnJpZXIgYXQgdGhlIGVuZCBvZiBhIHdvcmtzaGFyaW5nIGNvbnN0cnVjdC4KKyAgICAvLyAxKSBiZXR0ZXIgdG8gYWRkIGEgcGVyLXRocmVhZCBiYXJyaWVyIGNvdW50ZXIgdG8gYSB0aHJlYWQgZGF0YSBzdHJ1Y3R1cmUKKyAgICAvLyAyKSBzZXQgdG8gMCB3aGVuIGEgbmV3IHRlYW0gaXMgY3JlYXRlZAorICAgIC8vIDQpIG5vIHN5bmMgaXMgcmVxdWlyZWQKKworICAgIF9fa21wX2JhcnJpZXIoIGJzX3BsYWluX2JhcnJpZXIsIGdsb2JhbF90aWQsIEZBTFNFLCAwLCBOVUxMLCBOVUxMICk7Cit9CisKKy8qIFRoZSBCQVJSSUVSIGZvciBhIE1BU1RFUiBzZWN0aW9uIGlzIGFsd2F5cyBleHBsaWNpdCAgICovCisvKiEKK0Bpbmdyb3VwIFdPUktfU0hBUklORworQHBhcmFtIGxvYyAgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uLgorQHBhcmFtIGdsb2JhbF90aWQgIGdsb2JhbCB0aHJlYWQgbnVtYmVyIC4KK0ByZXR1cm4gMSBpZiB0aGlzIHRocmVhZCBzaG91bGQgZXhlY3V0ZSB0aGUgPHR0Pm1hc3RlcjwvdHQ+IGJsb2NrLCAwIG90aGVyd2lzZS4KKyovCitrbXBfaW50MzIKK19fa21wY19tYXN0ZXIoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCkKK3sKKyAgICBLTVBfQ09VTlRfQkxPQ0soT01QX01BU1RFUik7CisgICAgaW50IHN0YXR1cyA9IDA7CisKKyAgICBLQ19UUkFDRSggMTAsICgiX19rbXBjX21hc3RlcjogY2FsbGVkIFQjJWRcbiIsIGdsb2JhbF90aWQgKSApOworCisgICAgaWYoICEgVENSXzQoIF9fa21wX2luaXRfcGFyYWxsZWwgKSApCisgICAgICAgIF9fa21wX3BhcmFsbGVsX2luaXRpYWxpemUoKTsKKworICAgIGlmKCBLTVBfTUFTVEVSX0dUSUQoIGdsb2JhbF90aWQgKSkKKyAgICAgICAgc3RhdHVzID0gMTsKKworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBpZiAoc3RhdHVzKQorICAgICAgICAgICAgX19rbXBfcHVzaF9zeW5jKCBnbG9iYWxfdGlkLCBjdF9tYXN0ZXIsIGxvYywgTlVMTCApOworICAgICAgICBlbHNlCisgICAgICAgICAgICBfX2ttcF9jaGVja19zeW5jKCBnbG9iYWxfdGlkLCBjdF9tYXN0ZXIsIGxvYywgTlVMTCApOworICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qIQorQGluZ3JvdXAgV09SS19TSEFSSU5HCitAcGFyYW0gbG9jICBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24uCitAcGFyYW0gZ2xvYmFsX3RpZCAgZ2xvYmFsIHRocmVhZCBudW1iZXIgLgorCitNYXJrIHRoZSBlbmQgb2YgYSA8dHQ+bWFzdGVyPC90dD4gcmVnaW9uLiBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBieSB0aGUgdGhyZWFkCit0aGF0IGV4ZWN1dGVzIHRoZSA8dHQ+bWFzdGVyPC90dD4gcmVnaW9uLgorKi8KK3ZvaWQKK19fa21wY19lbmRfbWFzdGVyKGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQpCit7CisgICAgS0NfVFJBQ0UoIDEwLCAoIl9fa21wY19lbmRfbWFzdGVyOiBjYWxsZWQgVCMlZFxuIiwgZ2xvYmFsX3RpZCApICk7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBLTVBfTUFTVEVSX0dUSUQoIGdsb2JhbF90aWQgKSk7CisKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgaWYoIGdsb2JhbF90aWQgPCAwICkKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBUaHJlYWRJZGVudEludmFsaWQgKTsKKworICAgICAgICBpZiggS01QX01BU1RFUl9HVElEKCBnbG9iYWxfdGlkICkpCisgICAgICAgICAgICBfX2ttcF9wb3Bfc3luYyggZ2xvYmFsX3RpZCwgY3RfbWFzdGVyLCBsb2MgKTsKKyAgICB9Cit9CisKKy8qIQorQGluZ3JvdXAgV09SS19TSEFSSU5HCitAcGFyYW0gbG9jICBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24uCitAcGFyYW0gZ3RpZCAgZ2xvYmFsIHRocmVhZCBudW1iZXIuCisKK1N0YXJ0IGV4ZWN1dGlvbiBvZiBhbiA8dHQ+b3JkZXJlZDwvdHQ+IGNvbnN0cnVjdC4KKyovCit2b2lkCitfX2ttcGNfb3JkZXJlZCggaWRlbnRfdCAqIGxvYywga21wX2ludDMyIGd0aWQgKQoreworICAgIGludCBjaWQgPSAwOworICAgIGttcF9pbmZvX3QgKnRoOworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7CisKKyAgICBLQ19UUkFDRSggMTAsICgiX19rbXBjX29yZGVyZWQ6IGNhbGxlZCBUIyVkXG4iLCBndGlkICkpOworCisgICAgaWYgKCEgVENSXzQoX19rbXBfaW5pdF9wYXJhbGxlbCkpCisgICAgICAgIF9fa21wX3BhcmFsbGVsX2luaXRpYWxpemUoKTsKKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfb3JkZXJlZF9wcmVwKCBndGlkICk7CisgICAgLy8gVE9ETzogb3JkZXJlZF93YWl0X2lkCisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgICAgdGggPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisKKyAgICBpZiAoIHRoIC0+IHRoLnRoX2Rpc3BhdGNoIC0+IHRoX2Rlb19mY24gIT0gMCApCisgICAgICAgICgqdGgtPnRoLnRoX2Rpc3BhdGNoLT50aF9kZW9fZmNuKSggJiBndGlkLCAmIGNpZCwgbG9jICk7CisgICAgZWxzZQorICAgICAgICBfX2ttcF9wYXJhbGxlbF9kZW8oICYgZ3RpZCwgJiBjaWQsIGxvYyApOworCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9vcmRlcmVkX3N0YXJ0KCBndGlkICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworfQorCisvKiEKK0Bpbmdyb3VwIFdPUktfU0hBUklORworQHBhcmFtIGxvYyAgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uLgorQHBhcmFtIGd0aWQgIGdsb2JhbCB0aHJlYWQgbnVtYmVyLgorCitFbmQgZXhlY3V0aW9uIG9mIGFuIDx0dD5vcmRlcmVkPC90dD4gY29uc3RydWN0LgorKi8KK3ZvaWQKK19fa21wY19lbmRfb3JkZXJlZCggaWRlbnRfdCAqIGxvYywga21wX2ludDMyIGd0aWQgKQoreworICAgIGludCBjaWQgPSAwOworICAgIGttcF9pbmZvX3QgKnRoOworCisgICAgS0NfVFJBQ0UoIDEwLCAoIl9fa21wY19lbmRfb3JkZXJlZDogY2FsbGVkIFQjJWRcbiIsIGd0aWQgKSApOworCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9vcmRlcmVkX2VuZCggZ3RpZCApOworICAgIC8vIFRPRE86IG9yZGVyZWRfd2FpdF9pZAorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgIHRoID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworCisgICAgaWYgKCB0aCAtPiB0aC50aF9kaXNwYXRjaCAtPiB0aF9keG9fZmNuICE9IDAgKQorICAgICAgICAoKnRoLT50aC50aF9kaXNwYXRjaC0+dGhfZHhvX2ZjbikoICYgZ3RpZCwgJiBjaWQsIGxvYyApOworICAgIGVsc2UKKyAgICAgICAgX19rbXBfcGFyYWxsZWxfZHhvKCAmIGd0aWQsICYgY2lkLCBsb2MgKTsKK30KKworc3RhdGljIGttcF91c2VyX2xvY2tfcAorX19rbXBfZ2V0X2NyaXRpY2FsX3NlY3Rpb25fcHRyKCBrbXBfY3JpdGljYWxfbmFtZSAqIGNyaXQsIGlkZW50X3QgY29uc3QgKiBsb2MsIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBrbXBfdXNlcl9sb2NrX3AgKmxja19wcCA9IChrbXBfdXNlcl9sb2NrX3AgKiljcml0OworCisgICAgLy8KKyAgICAvLyBCZWNhdXNlIG9mIHRoZSBkb3VibGUtY2hlY2ssIHRoZSBmb2xsb3dpbmcgbG9hZAorICAgIC8vIGRvZXNuJ3QgbmVlZCB0byBiZSB2b2xhdGlsZS4KKyAgICAvLworICAgIGttcF91c2VyX2xvY2tfcCBsY2sgPSAoa21wX3VzZXJfbG9ja19wKVRDUl9QVFIoICpsY2tfcHAgKTsKKworICAgIGlmICggbGNrID09IE5VTEwgKSB7CisgICAgICAgIHZvaWQgKiBpZHg7CisKKyAgICAgICAgLy8gQWxsb2NhdGUgJiBpbml0aWFsaXplIHRoZSBsb2NrLgorICAgICAgICAvLyBSZW1lbWJlciBhbGxvY2F0ZWQgbG9ja3MgaW4gdGFibGUgaW4gb3JkZXIgdG8gZnJlZSB0aGVtIGluIF9fa21wX2NsZWFudXAoKQorICAgICAgICBsY2sgPSBfX2ttcF91c2VyX2xvY2tfYWxsb2NhdGUoICZpZHgsIGd0aWQsIGttcF9sZl9jcml0aWNhbF9zZWN0aW9uICk7CisgICAgICAgIF9fa21wX2luaXRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzKCBsY2sgKTsKKyAgICAgICAgX19rbXBfc2V0X3VzZXJfbG9ja19sb2NhdGlvbiggbGNrLCBsb2MgKTsKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgIF9fa21wX2l0dF9jcml0aWNhbF9jcmVhdGluZyggbGNrICk7CisgICAgICAgICAgICAvLyBfX2ttcF9pdHRfY3JpdGljYWxfY3JlYXRpbmcoKSBzaG91bGQgYmUgY2FsbGVkICpiZWZvcmUqIHRoZSBmaXJzdCB1c2FnZSBvZiB1bmRlcmx5aW5nCisgICAgICAgICAgICAvLyBsb2NrLiBJdCBpcyB0aGUgb25seSBwbGFjZSB3aGVyZSB3ZSBjYW4gZ3VhcmFudGVlIGl0LiBUaGVyZSBhcmUgY2hhbmNlcyB0aGUgbG9jayB3aWxsCisgICAgICAgICAgICAvLyBkZXN0cm95ZWQgd2l0aCBubyB1c2FnZSwgYnV0IGl0IGlzIG5vdCBhIHByb2JsZW0sIGJlY2F1c2UgdGhpcyBpcyBub3QgcmVhbCBldmVudCBzZWVuCisgICAgICAgICAgICAvLyBieSB1c2VyIGJ1dCByYXRoZXIgc2V0dGluZyBuYW1lIGZvciBvYmplY3QgKGxvY2spLiBTZWUgbW9yZSBkZXRhaWxzIGluIGttcF9pdHQuaC4KKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gVXNlIGEgY21weGNoZyBpbnN0cnVjdGlvbiB0byBzbGFtIHRoZSBzdGFydCBvZiB0aGUgY3JpdGljYWwKKyAgICAgICAgLy8gc2VjdGlvbiB3aXRoIHRoZSBsb2NrIHBvaW50ZXIuICBJZiBhbm90aGVyIHRocmVhZCBiZWF0IHVzCisgICAgICAgIC8vIHRvIGl0LCBkZWFsbG9jYXRlIHRoZSBsb2NrLCBhbmQgdXNlIHRoZSBsb2NrIHRoYXQgdGhlIG90aGVyCisgICAgICAgIC8vIHRocmVhZCBhbGxvY2F0ZWQuCisgICAgICAgIC8vCisgICAgICAgIGludCBzdGF0dXMgPSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUFRSKCBsY2tfcHAsIDAsIGxjayApOworCisgICAgICAgIGlmICggc3RhdHVzID09IDAgKSB7CisgICAgICAgICAgICAvLyBEZWFsbG9jYXRlIHRoZSBsb2NrIGFuZCByZWxvYWQgdGhlIHZhbHVlLgorI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgICAgIF9fa21wX2l0dF9jcml0aWNhbF9kZXN0cm95ZWQoIGxjayApOworICAgICAgICAgICAgICAgIC8vIExldCBJVFQga25vdyB0aGUgbG9jayBpcyBkZXN0cm95ZWQgYW5kIHRoZSBzYW1lIG1lbW9yeSBsb2NhdGlvbiBtYXkgYmUgcmV1c2VkIGZvcgorICAgICAgICAgICAgICAgIC8vIGFub3RoZXIgcHVycG9zZS4KKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAgICAgICAgICBfX2ttcF9kZXN0cm95X3VzZXJfbG9ja193aXRoX2NoZWNrcyggbGNrICk7CisgICAgICAgICAgICBfX2ttcF91c2VyX2xvY2tfZnJlZSggJmlkeCwgZ3RpZCwgbGNrICk7CisgICAgICAgICAgICBsY2sgPSAoa21wX3VzZXJfbG9ja19wKVRDUl9QVFIoICpsY2tfcHAgKTsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGxjayAhPSBOVUxMICk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGxjazsKK30KKworLyohCitAaW5ncm91cCBXT1JLX1NIQVJJTkcKK0BwYXJhbSBsb2MgIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbi4KK0BwYXJhbSBnbG9iYWxfdGlkICBnbG9iYWwgdGhyZWFkIG51bWJlciAuCitAcGFyYW0gY3JpdCBpZGVudGl0eSBvZiB0aGUgY3JpdGljYWwgc2VjdGlvbi4gVGhpcyBjb3VsZCBiZSBhIHBvaW50ZXIgdG8gYSBsb2NrIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3JpdGljYWwgc2VjdGlvbiwgb3IKK3NvbWUgb3RoZXIgc3VpdGFibHkgdW5pcXVlIHZhbHVlLgorCitFbnRlciBjb2RlIHByb3RlY3RlZCBieSBhIGBjcml0aWNhbGAgY29uc3RydWN0LgorVGhpcyBmdW5jdGlvbiBibG9ja3MgdW50aWwgdGhlIGV4ZWN1dGluZyB0aHJlYWQgY2FuIGVudGVyIHRoZSBjcml0aWNhbCBzZWN0aW9uLgorKi8KK3ZvaWQKK19fa21wY19jcml0aWNhbCggaWRlbnRfdCAqIGxvYywga21wX2ludDMyIGdsb2JhbF90aWQsIGttcF9jcml0aWNhbF9uYW1lICogY3JpdCApIHsKKyAgICBLTVBfQ09VTlRfQkxPQ0soT01QX0NSSVRJQ0FMKTsKKworICAgIGttcF91c2VyX2xvY2tfcCBsY2s7CisKKyAgICBLQ19UUkFDRSggMTAsICgiX19rbXBjX2NyaXRpY2FsOiBjYWxsZWQgVCMlZFxuIiwgZ2xvYmFsX3RpZCApICk7CisKKyAgICAvL1RPRE86IGFkZCBUSFJfT1ZIRF9TVEFURQorCisgICAgS01QX0NIRUNLX1VTRVJfTE9DS19JTklUKCk7CisKKyAgICBpZiAoICggX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfdGFzICkKKyAgICAgICYmICggc2l6ZW9mKCBsY2stPnRhcy5say5wb2xsICkgPD0gT01QX0NSSVRJQ0FMX1NJWkUgKSApIHsKKyAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCljcml0OworICAgIH0KKyNpZiBLTVBfT1NfTElOVVggJiYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNIHx8IEtNUF9BUkNIX0FBUkNINjQpCisgICAgZWxzZSBpZiAoICggX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfZnV0ZXggKQorICAgICAgJiYgKCBzaXplb2YoIGxjay0+ZnV0ZXgubGsucG9sbCApIDw9IE9NUF9DUklUSUNBTF9TSVpFICkgKSB7CisgICAgICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApY3JpdDsKKyAgICB9CisjZW5kaWYKKyAgICBlbHNlIHsgLy8gdGlja2V0LCBxdWV1aW5nIG9yIGRyZHBhCisgICAgICAgIGxjayA9IF9fa21wX2dldF9jcml0aWNhbF9zZWN0aW9uX3B0ciggY3JpdCwgbG9jLCBnbG9iYWxfdGlkICk7CisgICAgfQorCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKQorICAgICAgICBfX2ttcF9wdXNoX3N5bmMoIGdsb2JhbF90aWQsIGN0X2NyaXRpY2FsLCBsb2MsIGxjayApOworCisgICAgLyogc2luY2UgdGhlIGNyaXRpY2FsIGRpcmVjdGl2ZSBiaW5kcyB0byBhbGwgdGhyZWFkcywgbm90IGp1c3QKKyAgICAgKiB0aGUgY3VycmVudCB0ZWFtIHdlIGhhdmUgdG8gY2hlY2sgdGhpcyBldmVuIGlmIHdlIGFyZSBpbiBhCisgICAgICogc2VyaWFsaXplZCB0ZWFtICovCisgICAgLyogYWxzbywgZXZlbiBpZiB3ZSBhcmUgdGhlIHViZXIgdGhyZWFkLCB3ZSBzdGlsbCBoYXZlIHRvIGNvbmR1Y3QgdGhlIGxvY2ssCisgICAgICogYXMgd2UgaGF2ZSB0byBjb250ZW5kIHdpdGggc2libGluZyB0aHJlYWRzICovCisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X2NyaXRpY2FsX2FjcXVpcmluZyggbGNrICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworICAgIC8vIFZhbHVlIG9mICdjcml0JyBzaG91bGQgYmUgZ29vZCBmb3IgdXNpbmcgYXMgYSBjcml0aWNhbF9pZCBvZiB0aGUgY3JpdGljYWwgc2VjdGlvbiBkaXJlY3RpdmUuCisKKyAgICBfX2ttcF9hY3F1aXJlX3VzZXJfbG9ja193aXRoX2NoZWNrcyggbGNrLCBnbG9iYWxfdGlkICk7CisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X2NyaXRpY2FsX2FjcXVpcmVkKCBsY2sgKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICBLQV9UUkFDRSggMTUsICgiX19rbXBjX2NyaXRpY2FsOiBkb25lIFQjJWRcbiIsIGdsb2JhbF90aWQgKSk7Cit9IC8vIF9fa21wY19jcml0aWNhbAorCisvKiEKK0Bpbmdyb3VwIFdPUktfU0hBUklORworQHBhcmFtIGxvYyAgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uLgorQHBhcmFtIGdsb2JhbF90aWQgIGdsb2JhbCB0aHJlYWQgbnVtYmVyIC4KK0BwYXJhbSBjcml0IGlkZW50aXR5IG9mIHRoZSBjcml0aWNhbCBzZWN0aW9uLiBUaGlzIGNvdWxkIGJlIGEgcG9pbnRlciB0byBhIGxvY2sgYXNzb2NpYXRlZCB3aXRoIHRoZSBjcml0aWNhbCBzZWN0aW9uLCBvcgorc29tZSBvdGhlciBzdWl0YWJseSB1bmlxdWUgdmFsdWUuCisKK0xlYXZlIGEgY3JpdGljYWwgc2VjdGlvbiwgcmVsZWFzaW5nIGFueSBsb2NrIHRoYXQgd2FzIGhlbGQgZHVyaW5nIGl0cyBleGVjdXRpb24uCisqLwordm9pZAorX19rbXBjX2VuZF9jcml0aWNhbChpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBfY3JpdGljYWxfbmFtZSAqY3JpdCkKK3sKKyAgICBrbXBfdXNlcl9sb2NrX3AgbGNrOworCisgICAgS0NfVFJBQ0UoIDEwLCAoIl9fa21wY19lbmRfY3JpdGljYWw6IGNhbGxlZCBUIyVkXG4iLCBnbG9iYWxfdGlkICkpOworCisgICAgaWYgKCAoIF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX3RhcyApCisgICAgICAmJiAoIHNpemVvZiggbGNrLT50YXMubGsucG9sbCApIDw9IE9NUF9DUklUSUNBTF9TSVpFICkgKSB7CisgICAgICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApY3JpdDsKKyAgICB9CisjaWYgS01QX09TX0xJTlVYICYmIChLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSB8fCBLTVBfQVJDSF9BQVJDSDY0KQorICAgIGVsc2UgaWYgKCAoIF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX2Z1dGV4ICkKKyAgICAgICYmICggc2l6ZW9mKCBsY2stPmZ1dGV4LmxrLnBvbGwgKSA8PSBPTVBfQ1JJVElDQUxfU0laRSApICkgeworICAgICAgICBsY2sgPSAoa21wX3VzZXJfbG9ja19wKWNyaXQ7CisgICAgfQorI2VuZGlmCisgICAgZWxzZSB7IC8vIHRpY2tldCwgcXVldWluZyBvciBkcmRwYQorICAgICAgICBsY2sgPSAoa21wX3VzZXJfbG9ja19wKSBUQ1JfUFRSKCooKGttcF91c2VyX2xvY2tfcCAqKWNyaXQpKTsKKyAgICB9CisKKyAgICBLTVBfQVNTRVJUKGxjayAhPSBOVUxMKTsKKworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkKKyAgICAgICAgX19rbXBfcG9wX3N5bmMoIGdsb2JhbF90aWQsIGN0X2NyaXRpY2FsLCBsb2MgKTsKKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfY3JpdGljYWxfcmVsZWFzaW5nKCBsY2sgKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAgLy8gVmFsdWUgb2YgJ2NyaXQnIHNob3VsZCBiZSBnb29kIGZvciB1c2luZyBhcyBhIGNyaXRpY2FsX2lkIG9mIHRoZSBjcml0aWNhbCBzZWN0aW9uIGRpcmVjdGl2ZS4KKworICAgIF9fa21wX3JlbGVhc2VfdXNlcl9sb2NrX3dpdGhfY2hlY2tzKCBsY2ssIGdsb2JhbF90aWQgKTsKKworICAgIEtBX1RSQUNFKCAxNSwgKCJfX2ttcGNfZW5kX2NyaXRpY2FsOiBkb25lIFQjJWRcbiIsIGdsb2JhbF90aWQgKSk7Cit9CisKKy8qIQorQGluZ3JvdXAgU1lOQ0hST05JWkFUSU9OCitAcGFyYW0gbG9jIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbgorQHBhcmFtIGdsb2JhbF90aWQgdGhyZWFkIGlkLgorQHJldHVybiBvbmUgaWYgdGhlIHRocmVhZCBzaG91bGQgZXhlY3V0ZSB0aGUgbWFzdGVyIGJsb2NrLCB6ZXJvIG90aGVyd2lzZQorCitTdGFydCBleGVjdXRpb24gb2YgYSBjb21iaW5lZCBiYXJyaWVyIGFuZCBtYXN0ZXIuIFRoZSBiYXJyaWVyIGlzIGV4ZWN1dGVkIGluc2lkZSB0aGlzIGZ1bmN0aW9uLgorKi8KK2ttcF9pbnQzMgorX19rbXBjX2JhcnJpZXJfbWFzdGVyKGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQpCit7CisgICAgaW50IHN0YXR1czsKKworICAgIEtDX1RSQUNFKCAxMCwgKCJfX2ttcGNfYmFycmllcl9tYXN0ZXI6IGNhbGxlZCBUIyVkXG4iLCBnbG9iYWxfdGlkICkgKTsKKworICAgIGlmICghIFRDUl80KF9fa21wX2luaXRfcGFyYWxsZWwpKQorICAgICAgICBfX2ttcF9wYXJhbGxlbF9pbml0aWFsaXplKCk7CisKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApCisgICAgICAgIF9fa21wX2NoZWNrX2JhcnJpZXIoIGdsb2JhbF90aWQsIGN0X2JhcnJpZXIsIGxvYyApOworCisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICBfX2ttcF90aHJlYWRzW2dsb2JhbF90aWRdLT50aC50aF9pZGVudCA9IGxvYzsKKyNlbmRpZgorICAgIHN0YXR1cyA9IF9fa21wX2JhcnJpZXIoIGJzX3BsYWluX2JhcnJpZXIsIGdsb2JhbF90aWQsIFRSVUUsIDAsIE5VTEwsIE5VTEwgKTsKKworICAgIHJldHVybiAoc3RhdHVzICE9IDApID8gMCA6IDE7Cit9CisKKy8qIQorQGluZ3JvdXAgU1lOQ0hST05JWkFUSU9OCitAcGFyYW0gbG9jIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbgorQHBhcmFtIGdsb2JhbF90aWQgdGhyZWFkIGlkLgorCitDb21wbGV0ZSB0aGUgZXhlY3V0aW9uIG9mIGEgY29tYmluZWQgYmFycmllciBhbmQgbWFzdGVyLiBUaGlzIGZ1bmN0aW9uIHNob3VsZAorb25seSBiZSBjYWxsZWQgYXQgdGhlIGNvbXBsZXRpb24gb2YgdGhlIDx0dD5tYXN0ZXI8L3R0PiBjb2RlLiBPdGhlciB0aHJlYWRzIHdpbGwKK3N0aWxsIGJlIHdhaXRpbmcgYXQgdGhlIGJhcnJpZXIgYW5kIHRoaXMgY2FsbCByZWxlYXNlcyB0aGVtLgorKi8KK3ZvaWQKK19fa21wY19lbmRfYmFycmllcl9tYXN0ZXIoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCkKK3sKKyAgICBLQ19UUkFDRSggMTAsICgiX19rbXBjX2VuZF9iYXJyaWVyX21hc3RlcjogY2FsbGVkIFQjJWRcbiIsIGdsb2JhbF90aWQgKSk7CisKKyAgICBfX2ttcF9lbmRfc3BsaXRfYmFycmllciAoIGJzX3BsYWluX2JhcnJpZXIsIGdsb2JhbF90aWQgKTsKK30KKworLyohCitAaW5ncm91cCBTWU5DSFJPTklaQVRJT04KK0BwYXJhbSBsb2Mgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uCitAcGFyYW0gZ2xvYmFsX3RpZCB0aHJlYWQgaWQuCitAcmV0dXJuIG9uZSBpZiB0aGUgdGhyZWFkIHNob3VsZCBleGVjdXRlIHRoZSBtYXN0ZXIgYmxvY2ssIHplcm8gb3RoZXJ3aXNlCisKK1N0YXJ0IGV4ZWN1dGlvbiBvZiBhIGNvbWJpbmVkIGJhcnJpZXIgYW5kIG1hc3Rlcihub3dhaXQpIGNvbnN0cnVjdC4KK1RoZSBiYXJyaWVyIGlzIGV4ZWN1dGVkIGluc2lkZSB0aGlzIGZ1bmN0aW9uLgorVGhlcmUgaXMgbm8gZXF1aXZhbGVudCAiZW5kIiBmdW5jdGlvbiwgc2luY2UgdGhlCisqLwora21wX2ludDMyCitfX2ttcGNfYmFycmllcl9tYXN0ZXJfbm93YWl0KCBpZGVudF90ICogbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCApCit7CisgICAga21wX2ludDMyIHJldDsKKworICAgIEtDX1RSQUNFKCAxMCwgKCJfX2ttcGNfYmFycmllcl9tYXN0ZXJfbm93YWl0OiBjYWxsZWQgVCMlZFxuIiwgZ2xvYmFsX3RpZCApKTsKKworICAgIGlmICghIFRDUl80KF9fa21wX2luaXRfcGFyYWxsZWwpKQorICAgICAgICBfX2ttcF9wYXJhbGxlbF9pbml0aWFsaXplKCk7CisKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgaWYgKCBsb2MgPT0gMCApIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBDb25zdHJ1Y3RJZGVudEludmFsaWQgKTsgLy8gPz8/IFdoYXQgZG9lcyBpdCBtZWFuIGZvciB0aGUgdXNlcj8KKyAgICAgICAgfQorICAgICAgICBfX2ttcF9jaGVja19iYXJyaWVyKCBnbG9iYWxfdGlkLCBjdF9iYXJyaWVyLCBsb2MgKTsKKyAgICB9CisKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIF9fa21wX3RocmVhZHNbZ2xvYmFsX3RpZF0tPnRoLnRoX2lkZW50ID0gbG9jOworI2VuZGlmCisgICAgX19rbXBfYmFycmllciggYnNfcGxhaW5fYmFycmllciwgZ2xvYmFsX3RpZCwgRkFMU0UsIDAsIE5VTEwsIE5VTEwgKTsKKworICAgIHJldCA9IF9fa21wY19tYXN0ZXIgKGxvYywgZ2xvYmFsX3RpZCk7CisKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgLyogIHRoZXJlJ3Mgbm8gX19rbXBjX2VuZF9tYXN0ZXIgY2FsbGVkOyBzbyB0aGUgKHN0YXRzKSAqLworICAgICAgICAvKiAgYWN0aW9ucyBvZiBfX2ttcGNfZW5kX21hc3RlciBhcmUgZG9uZSBoZXJlICAgICAgICAgICovCisKKyAgICAgICAgaWYgKCBnbG9iYWxfdGlkIDwgMCApIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBUaHJlYWRJZGVudEludmFsaWQgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmV0KSB7CisgICAgICAgICAgICAvKiBvbmx5IG9uZSB0aHJlYWQgc2hvdWxkIGRvIHRoZSBwb3Agc2luY2Ugb25seSAqLworICAgICAgICAgICAgLyogb25lIGRpZCB0aGUgcHVzaCAoc2VlIF9fa21wY19tYXN0ZXIoKSkgICAgICAgKi8KKworICAgICAgICAgICAgX19rbXBfcG9wX3N5bmMoIGdsb2JhbF90aWQsIGN0X21hc3RlciwgbG9jICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gKHJldCk7Cit9CisKKy8qIFRoZSBCQVJSSUVSIGZvciBhIFNJTkdMRSBwcm9jZXNzIHNlY3Rpb24gaXMgYWx3YXlzIGV4cGxpY2l0ICAgKi8KKy8qIQorQGluZ3JvdXAgV09SS19TSEFSSU5HCitAcGFyYW0gbG9jICBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24KK0BwYXJhbSBnbG9iYWxfdGlkICBnbG9iYWwgdGhyZWFkIG51bWJlcgorQHJldHVybiBPbmUgaWYgdGhpcyB0aHJlYWQgc2hvdWxkIGV4ZWN1dGUgdGhlIHNpbmdsZSBjb25zdHJ1Y3QsIHplcm8gb3RoZXJ3aXNlLgorCitUZXN0IHdoZXRoZXIgdG8gZXhlY3V0ZSBhIDx0dD5zaW5nbGU8L3R0PiBjb25zdHJ1Y3QuCitUaGVyZSBhcmUgbm8gaW1wbGljaXQgYmFycmllcnMgaW4gdGhlIHR3byAic2luZ2xlIiBjYWxscywgcmF0aGVyIHRoZSBjb21waWxlciBzaG91bGQKK2ludHJvZHVjZSBhbiBleHBsaWNpdCBiYXJyaWVyIGlmIGl0IGlzIHJlcXVpcmVkLgorKi8KKwora21wX2ludDMyCitfX2ttcGNfc2luZ2xlKGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQpCit7CisgICAgS01QX0NPVU5UX0JMT0NLKE9NUF9TSU5HTEUpOworICAgIGttcF9pbnQzMiByYyA9IF9fa21wX2VudGVyX3NpbmdsZSggZ2xvYmFsX3RpZCwgbG9jLCBUUlVFICk7CisgICAgcmV0dXJuIHJjOworfQorCisvKiEKK0Bpbmdyb3VwIFdPUktfU0hBUklORworQHBhcmFtIGxvYyAgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uCitAcGFyYW0gZ2xvYmFsX3RpZCAgZ2xvYmFsIHRocmVhZCBudW1iZXIKKworTWFyayB0aGUgZW5kIG9mIGEgPHR0PnNpbmdsZTwvdHQ+IGNvbnN0cnVjdC4gIFRoaXMgZnVuY3Rpb24gc2hvdWxkCitvbmx5IGJlIGNhbGxlZCBieSB0aGUgdGhyZWFkIHRoYXQgZXhlY3V0ZWQgdGhlIGJsb2NrIG9mIGNvZGUgcHJvdGVjdGVkCitieSB0aGUgYHNpbmdsZWAgY29uc3RydWN0LgorKi8KK3ZvaWQKK19fa21wY19lbmRfc2luZ2xlKGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQpCit7CisgICAgX19rbXBfZXhpdF9zaW5nbGUoIGdsb2JhbF90aWQgKTsKK30KKworLyohCitAaW5ncm91cCBXT1JLX1NIQVJJTkcKK0BwYXJhbSBsb2MgU291cmNlIGxvY2F0aW9uCitAcGFyYW0gZ2xvYmFsX3RpZCBHbG9iYWwgdGhyZWFkIGlkCisKK01hcmsgdGhlIGVuZCBvZiBhIHN0YXRpY2FsbHkgc2NoZWR1bGVkIGxvb3AuCisqLwordm9pZAorX19rbXBjX2Zvcl9zdGF0aWNfZmluaSggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCApCit7CisgICAgS0VfVFJBQ0UoIDEwLCAoIl9fa21wY19mb3Jfc3RhdGljX2ZpbmkgY2FsbGVkIFQjJWRcbiIsIGdsb2JhbF90aWQpKTsKKworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkKKyAgICAgX19rbXBfcG9wX3dvcmtzaGFyZSggZ2xvYmFsX3RpZCwgY3RfcGRvLCBsb2MgKTsKK30KKworLyoKKyAqIFVzZXIgcm91dGluZXMgd2hpY2ggdGFrZSBDLXN0eWxlIGFyZ3VtZW50cyAoY2FsbCBieSB2YWx1ZSkKKyAqIGRpZmZlcmVudCBmcm9tIHRoZSBGb3J0cmFuIGVxdWl2YWxlbnQgcm91dGluZXMKKyAqLworCit2b2lkCitvbXBjX3NldF9udW1fdGhyZWFkcyggaW50IGFyZyApCit7CisvLyAhISEhISBUT0RPOiBjaGVjayB0aGUgcGVyLXRhc2sgYmluZGluZworICAgIF9fa21wX3NldF9udW1fdGhyZWFkcyggYXJnLCBfX2ttcF9lbnRyeV9ndGlkKCkgKTsKK30KKwordm9pZAorb21wY19zZXRfZHluYW1pYyggaW50IGZsYWcgKQoreworICAgIGttcF9pbmZvX3QgKnRocmVhZDsKKworICAgIC8qIEZvciB0aGUgdGhyZWFkLXByaXZhdGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGludGVybmFsIGNvbnRyb2xzICovCisgICAgdGhyZWFkID0gX19rbXBfZW50cnlfdGhyZWFkKCk7CisKKyAgICBfX2ttcF9zYXZlX2ludGVybmFsX2NvbnRyb2xzKCB0aHJlYWQgKTsKKworICAgIHNldF9fZHluYW1pYyggdGhyZWFkLCBmbGFnID8gVFJVRSA6IEZBTFNFICk7Cit9CisKK3ZvaWQKK29tcGNfc2V0X25lc3RlZCggaW50IGZsYWcgKQoreworICAgIGttcF9pbmZvX3QgKnRocmVhZDsKKworICAgIC8qIEZvciB0aGUgdGhyZWFkLXByaXZhdGUgaW50ZXJuYWwgY29udHJvbHMgaW1wbGVtZW50YXRpb24gKi8KKyAgICB0aHJlYWQgPSBfX2ttcF9lbnRyeV90aHJlYWQoKTsKKworICAgIF9fa21wX3NhdmVfaW50ZXJuYWxfY29udHJvbHMoIHRocmVhZCApOworCisgICAgc2V0X19uZXN0ZWQoIHRocmVhZCwgZmxhZyA/IFRSVUUgOiBGQUxTRSApOworfQorCit2b2lkCitvbXBjX3NldF9tYXhfYWN0aXZlX2xldmVscyggaW50IG1heF9hY3RpdmVfbGV2ZWxzICkKK3sKKyAgICAvKiBUTyBETyAqLworICAgIC8qIHdlIHdhbnQgcGVyLXRhc2sgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBpbnRlcm5hbCBjb250cm9sICovCisKKyAgICAvKiBGb3IgdGhlIHBlci10aHJlYWQgaW50ZXJuYWwgY29udHJvbHMgaW1wbGVtZW50YXRpb24gKi8KKyAgICBfX2ttcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMoIF9fa21wX2VudHJ5X2d0aWQoKSwgbWF4X2FjdGl2ZV9sZXZlbHMgKTsKK30KKwordm9pZAorb21wY19zZXRfc2NoZWR1bGUoIG9tcF9zY2hlZF90IGtpbmQsIGludCBtb2RpZmllciApCit7CisvLyAhISEhISBUT0RPOiBjaGVjayB0aGUgcGVyLXRhc2sgYmluZGluZworICAgIF9fa21wX3NldF9zY2hlZHVsZSggX19rbXBfZW50cnlfZ3RpZCgpLCAoIGttcF9zY2hlZF90ICkga2luZCwgbW9kaWZpZXIgKTsKK30KKworaW50CitvbXBjX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtKCBpbnQgbGV2ZWwgKQoreworICAgIHJldHVybiBfX2ttcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bSggX19rbXBfZW50cnlfZ3RpZCgpLCBsZXZlbCApOworfQorCitpbnQKK29tcGNfZ2V0X3RlYW1fc2l6ZSggaW50IGxldmVsICkKK3sKKyAgICByZXR1cm4gX19rbXBfZ2V0X3RlYW1fc2l6ZSggX19rbXBfZW50cnlfZ3RpZCgpLCBsZXZlbCApOworfQorCit2b2lkCitrbXBjX3NldF9zdGFja3NpemUoIGludCBhcmcgKQoreworICAgIC8vIF9fa21wX2F1eF9zZXRfc3RhY2tzaXplIGluaXRpYWxpemVzIHRoZSBsaWJyYXJ5IGlmIG5lZWRlZAorICAgIF9fa21wX2F1eF9zZXRfc3RhY2tzaXplKCBhcmcgKTsKK30KKwordm9pZAora21wY19zZXRfc3RhY2tzaXplX3MoIHNpemVfdCBhcmcgKQoreworICAgIC8vIF9fa21wX2F1eF9zZXRfc3RhY2tzaXplIGluaXRpYWxpemVzIHRoZSBsaWJyYXJ5IGlmIG5lZWRlZAorICAgIF9fa21wX2F1eF9zZXRfc3RhY2tzaXplKCBhcmcgKTsKK30KKwordm9pZAora21wY19zZXRfYmxvY2t0aW1lKCBpbnQgYXJnICkKK3sKKyAgICBpbnQgZ3RpZCwgdGlkOworICAgIGttcF9pbmZvX3QgKnRocmVhZDsKKworICAgIGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgICAgdGlkID0gX19rbXBfdGlkX2Zyb21fZ3RpZChndGlkKTsKKyAgICB0aHJlYWQgPSBfX2ttcF90aHJlYWRfZnJvbV9ndGlkKGd0aWQpOworCisgICAgX19rbXBfYXV4X3NldF9ibG9ja3RpbWUoIGFyZywgdGhyZWFkLCB0aWQgKTsKK30KKwordm9pZAora21wY19zZXRfbGlicmFyeSggaW50IGFyZyApCit7CisgICAgLy8gX19rbXBfdXNlcl9zZXRfbGlicmFyeSBpbml0aWFsaXplcyB0aGUgbGlicmFyeSBpZiBuZWVkZWQKKyAgICBfX2ttcF91c2VyX3NldF9saWJyYXJ5KCAoZW51bSBsaWJyYXJ5X3R5cGUpYXJnICk7Cit9CisKK3ZvaWQKK2ttcGNfc2V0X2RlZmF1bHRzKCBjaGFyIGNvbnN0ICogc3RyICkKK3sKKyAgICAvLyBfX2ttcF9hdXhfc2V0X2RlZmF1bHRzIGluaXRpYWxpemVzIHRoZSBsaWJyYXJ5IGlmIG5lZWRlZAorICAgIF9fa21wX2F1eF9zZXRfZGVmYXVsdHMoIHN0ciwgc3RybGVuKCBzdHIgKSApOworfQorCitpbnQKK2ttcGNfc2V0X2FmZmluaXR5X21hc2tfcHJvYyggaW50IHByb2MsIHZvaWQgKiptYXNrICkKK3sKKyNpZiBkZWZpbmVkKEtNUF9TVFVCKSB8fCAhS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgIHJldHVybiAtMTsKKyNlbHNlCisgICAgaWYgKCAhIFRDUl80KF9fa21wX2luaXRfbWlkZGxlKSApIHsKKyAgICAgICAgX19rbXBfbWlkZGxlX2luaXRpYWxpemUoKTsKKyAgICB9CisgICAgcmV0dXJuIF9fa21wX2F1eF9zZXRfYWZmaW5pdHlfbWFza19wcm9jKCBwcm9jLCBtYXNrICk7CisjZW5kaWYKK30KKworaW50CitrbXBjX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYyggaW50IHByb2MsIHZvaWQgKiptYXNrICkKK3sKKyNpZiBkZWZpbmVkKEtNUF9TVFVCKSB8fCAhS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgIHJldHVybiAtMTsKKyNlbHNlCisgICAgaWYgKCAhIFRDUl80KF9fa21wX2luaXRfbWlkZGxlKSApIHsKKyAgICAgICAgX19rbXBfbWlkZGxlX2luaXRpYWxpemUoKTsKKyAgICB9CisgICAgcmV0dXJuIF9fa21wX2F1eF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MoIHByb2MsIG1hc2sgKTsKKyNlbmRpZgorfQorCitpbnQKK2ttcGNfZ2V0X2FmZmluaXR5X21hc2tfcHJvYyggaW50IHByb2MsIHZvaWQgKiptYXNrICkKK3sKKyNpZiBkZWZpbmVkKEtNUF9TVFVCKSB8fCAhS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgIHJldHVybiAtMTsKKyNlbHNlCisgICAgaWYgKCAhIFRDUl80KF9fa21wX2luaXRfbWlkZGxlKSApIHsKKyAgICAgICAgX19rbXBfbWlkZGxlX2luaXRpYWxpemUoKTsKKyAgICB9CisgICAgcmV0dXJuIF9fa21wX2F1eF9nZXRfYWZmaW5pdHlfbWFza19wcm9jKCBwcm9jLCBtYXNrICk7CisjZW5kaWYKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyohCitAaW5ncm91cCBUSFJFQURQUklWQVRFCitAcGFyYW0gbG9jICAgICAgIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbgorQHBhcmFtIGd0aWQgICAgICBnbG9iYWwgdGhyZWFkIG51bWJlcgorQHBhcmFtIGNweV9zaXplICBzaXplIG9mIHRoZSBjcHlfZGF0YSBidWZmZXIKK0BwYXJhbSBjcHlfZGF0YSAgcG9pbnRlciB0byBkYXRhIHRvIGJlIGNvcGllZAorQHBhcmFtIGNweV9mdW5jICBoZWxwZXIgZnVuY3Rpb24gdG8gY2FsbCBmb3IgY29weWluZyBkYXRhCitAcGFyYW0gZGlkaXQgICAgIGZsYWcgdmFyaWFibGU6IDE9c2luZ2xlIHRocmVhZDsgMD1ub3Qgc2luZ2xlIHRocmVhZAorCitfX2ttcGNfY29weXByaXZhdGUgaW1wbGVtZW50cyB0aGUgaW50ZXJmYWNlIGZvciB0aGUgcHJpdmF0ZSBkYXRhIGJyb2FkY2FzdCBuZWVkZWQgZm9yCit0aGUgY29weXByaXZhdGUgY2xhdXNlIGFzc29jaWF0ZWQgd2l0aCBhIHNpbmdsZSByZWdpb24gaW4gYW4gT3Blbk1QPHN1cD4qPC9zdXA+IHByb2dyYW0gKGJvdGggQyBhbmQgRm9ydHJhbikuCitBbGwgdGhyZWFkcyBwYXJ0aWNpcGF0aW5nIGluIHRoZSBwYXJhbGxlbCByZWdpb24gY2FsbCB0aGlzIHJvdXRpbmUuCitPbmUgb2YgdGhlIHRocmVhZHMgKGNhbGxlZCB0aGUgc2luZ2xlIHRocmVhZCkgc2hvdWxkIGhhdmUgdGhlIDx0dD5kaWRpdDwvdHQ+IHZhcmlhYmxlIHNldCB0byAxCithbmQgYWxsIG90aGVyIHRocmVhZHMgc2hvdWxkIGhhdmUgdGhhdCB2YXJpYWJsZSBzZXQgdG8gMC4KK0FsbCB0aHJlYWRzIHBhc3MgYSBwb2ludGVyIHRvIGEgZGF0YSBidWZmZXIgKGNweV9kYXRhKSB0aGF0IHRoZXkgaGF2ZSBidWlsdC4KKworVGhlIE9wZW5NUCBzcGVjaWZpY2F0aW9uIGZvcmJpZHMgdGhlIHVzZSBvZiBub3dhaXQgb24gdGhlIHNpbmdsZSByZWdpb24gd2hlbiBhIGNvcHlwcml2YXRlCitjbGF1c2UgaXMgcHJlc2VudC4gSG93ZXZlciwgQHJlZiBfX2ttcGNfY29weXByaXZhdGUgaW1wbGVtZW50cyBhIGJhcnJpZXIgaW50ZXJuYWxseSB0byBhdm9pZAorcmFjZSBjb25kaXRpb25zLCBzbyB0aGUgY29kZSBnZW5lcmF0aW9uIGZvciB0aGUgc2luZ2xlIHJlZ2lvbiBzaG91bGQgYXZvaWQgZ2VuZXJhdGluZyBhIGJhcnJpZXIKK2FmdGVyIHRoZSBjYWxsIHRvIEByZWYgX19rbXBjX2NvcHlwcml2YXRlLgorCitUaGUgPHR0Pmd0aWQ8L3R0PiBwYXJhbWV0ZXIgaXMgdGhlIGdsb2JhbCB0aHJlYWQgaWQgZm9yIHRoZSBjdXJyZW50IHRocmVhZC4KK1RoZSA8dHQ+bG9jPC90dD4gcGFyYW1ldGVyIGlzIGEgcG9pbnRlciB0byBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24uCisKK0ludGVybmFsIGltcGxlbWVudGF0aW9uOiBUaGUgc2luZ2xlIHRocmVhZCB3aWxsIGZpcnN0IGNvcHkgaXRzIGRlc2NyaXB0b3IgYWRkcmVzcyAoY3B5X2RhdGEpCit0byBhIHRlYW0tcHJpdmF0ZSBsb2NhdGlvbiwgdGhlbiB0aGUgb3RoZXIgdGhyZWFkcyB3aWxsIGVhY2ggY2FsbCB0aGUgZnVuY3Rpb24gcG9pbnRlZCB0byBieQordGhlIHBhcmFtZXRlciBjcHlfZnVuYywgd2hpY2ggY2FycmllcyBvdXQgdGhlIGNvcHkgYnkgY29weWluZyB0aGUgZGF0YSB1c2luZyB0aGUgY3B5X2RhdGEgYnVmZmVyLgorCitUaGUgY3B5X2Z1bmMgcm91dGluZSB1c2VkIGZvciB0aGUgY29weSBhbmQgdGhlIGNvbnRlbnRzIG9mIHRoZSBkYXRhIGFyZWEgZGVmaW5lZCBieSBjcHlfZGF0YQorYW5kIGNweV9zaXplIG1heSBiZSBidWlsdCBpbiBhbnkgZmFzaGlvbiB0aGF0IHdpbGwgYWxsb3cgdGhlIGNvcHkgdG8gYmUgZG9uZS4gRm9yIGluc3RhbmNlLAordGhlIGNweV9kYXRhIGJ1ZmZlciBjYW4gaG9sZCB0aGUgYWN0dWFsIGRhdGEgdG8gYmUgY29waWVkIG9yIGl0IG1heSBob2xkIGEgbGlzdCBvZiBwb2ludGVycwordG8gdGhlIGRhdGEuIFRoZSBjcHlfZnVuYyByb3V0aW5lIG11c3QgaW50ZXJwcmV0IHRoZSBjcHlfZGF0YSBidWZmZXIgYXBwcm9wcmlhdGVseS4KKworVGhlIGludGVyZmFjZSB0byBjcHlfZnVuYyBpcyBhcyBmb2xsb3dzOgorQGNvZGUKK3ZvaWQgY3B5X2Z1bmMoIHZvaWQgKmRlc3RpbmF0aW9uLCB2b2lkICpzb3VyY2UgKQorQGVuZGNvZGUKK3doZXJlIHZvaWQgKmRlc3RpbmF0aW9uIGlzIHRoZSBjcHlfZGF0YSBwb2ludGVyIGZvciB0aGUgdGhyZWFkIGJlaW5nIGNvcGllZCB0bworYW5kIHZvaWQgKnNvdXJjZSBpcyB0aGUgY3B5X2RhdGEgcG9pbnRlciBmb3IgdGhlIHRocmVhZCBiZWluZyBjb3BpZWQgZnJvbS4KKyovCit2b2lkCitfX2ttcGNfY29weXByaXZhdGUoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIHNpemVfdCBjcHlfc2l6ZSwgdm9pZCAqY3B5X2RhdGEsIHZvaWQoKmNweV9mdW5jKSh2b2lkKix2b2lkKiksIGttcF9pbnQzMiBkaWRpdCApCit7CisgICAgdm9pZCAqKmRhdGFfcHRyOworCisgICAgS0NfVFJBQ0UoIDEwLCAoIl9fa21wY19jb3B5cHJpdmF0ZTogY2FsbGVkIFQjJWRcbiIsIGd0aWQgKSk7CisKKyAgICBLTVBfTUIoKTsKKworICAgIGRhdGFfcHRyID0gJiBfX2ttcF90ZWFtX2Zyb21fZ3RpZCggZ3RpZCApLT50LnRfY29weXByaXZfZGF0YTsKKworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBpZiAoIGxvYyA9PSAwICkgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoIENvbnN0cnVjdElkZW50SW52YWxpZCApOworICAgICAgICB9CisgICAgfQorCisgICAgLyogVG9EbzogT3B0aW1pemUgdGhlIGZvbGxvd2luZyB0d28gYmFycmllcnMgaW50byBzb21lIGtpbmQgb2Ygc3BsaXQgYmFycmllciAqLworCisgICAgaWYgKGRpZGl0KSAqZGF0YV9wdHIgPSBjcHlfZGF0YTsKKworICAgIC8qIFRoaXMgYmFycmllciBpcyBub3QgYSBiYXJyaWVyIHJlZ2lvbiBib3VuZGFyeSAqLworI2lmIFVTRV9JVFRfTk9USUZZCisgICAgX19rbXBfdGhyZWFkc1tndGlkXS0+dGgudGhfaWRlbnQgPSBsb2M7CisjZW5kaWYKKyAgICBfX2ttcF9iYXJyaWVyKCBic19wbGFpbl9iYXJyaWVyLCBndGlkLCBGQUxTRSAsIDAsIE5VTEwsIE5VTEwgKTsKKworICAgIGlmICghIGRpZGl0KSAoKmNweV9mdW5jKSggY3B5X2RhdGEsICpkYXRhX3B0ciApOworCisgICAgLyogQ29uc2lkZXIgbmV4dCBiYXJyaWVyIHRoZSB1c2VyLXZpc2libGUgYmFycmllciBmb3IgYmFycmllciByZWdpb24gYm91bmRhcmllcyAqLworICAgIC8qIE5lc3RpbmcgY2hlY2tzIGFyZSBhbHJlYWR5IGhhbmRsZWQgYnkgdGhlIHNpbmdsZSBjb25zdHJ1Y3QgY2hlY2tzICovCisKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIF9fa21wX3RocmVhZHNbZ3RpZF0tPnRoLnRoX2lkZW50ID0gbG9jOyAvLyBUT0RPOiBjaGVjayBpZiBpdCBpcyBuZWVkZWQgKGUuZy4gdGFza3MgY2FuIG92ZXJ3cml0ZSB0aGUgbG9jYXRpb24pCisjZW5kaWYKKyAgICBfX2ttcF9iYXJyaWVyKCBic19wbGFpbl9iYXJyaWVyLCBndGlkLCBGQUxTRSAsIDAsIE5VTEwsIE5VTEwgKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBJTklUX0xPQ0sgICAgICAgICAgICAgICAgIF9fa21wX2luaXRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzCisjZGVmaW5lIElOSVRfTkVTVEVEX0xPQ0sgICAgICAgICAgX19rbXBfaW5pdF9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzCisjZGVmaW5lIEFDUVVJUkVfTE9DSyAgICAgICAgICAgICAgX19rbXBfYWNxdWlyZV91c2VyX2xvY2tfd2l0aF9jaGVja3MKKyNkZWZpbmUgQUNRVUlSRV9MT0NLX1RJTUVEICAgICAgICBfX2ttcF9hY3F1aXJlX3VzZXJfbG9ja193aXRoX2NoZWNrc190aW1lZAorI2RlZmluZSBBQ1FVSVJFX05FU1RFRF9MT0NLICAgICAgIF9fa21wX2FjcXVpcmVfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrcworI2RlZmluZSBBQ1FVSVJFX05FU1RFRF9MT0NLX1RJTUVEIF9fa21wX2FjcXVpcmVfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc190aW1lZAorI2RlZmluZSBSRUxFQVNFX0xPQ0sgICAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfdXNlcl9sb2NrX3dpdGhfY2hlY2tzCisjZGVmaW5lIFJFTEVBU0VfTkVTVEVEX0xPQ0sgICAgICAgX19rbXBfcmVsZWFzZV9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzCisjZGVmaW5lIFRFU1RfTE9DSyAgICAgICAgICAgICAgICAgX19rbXBfdGVzdF91c2VyX2xvY2tfd2l0aF9jaGVja3MKKyNkZWZpbmUgVEVTVF9ORVNURURfTE9DSyAgICAgICAgICBfX2ttcF90ZXN0X25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3MKKyNkZWZpbmUgREVTVFJPWV9MT0NLICAgICAgICAgICAgICBfX2ttcF9kZXN0cm95X3VzZXJfbG9ja193aXRoX2NoZWNrcworI2RlZmluZSBERVNUUk9ZX05FU1RFRF9MT0NLICAgICAgIF9fa21wX2Rlc3Ryb3lfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrcworCisKKy8qCisgKiBUT0RPOiBNYWtlIGNoZWNrIGFib3J0IG1lc3NhZ2VzIHVzZSBsb2NhdGlvbiBpbmZvICYgcGFzcyBpdAorICogaW50byB3aXRoX2NoZWNrcyByb3V0aW5lcworICovCisKKy8qIGluaXRpYWxpemUgdGhlIGxvY2sgKi8KK3ZvaWQKK19fa21wY19pbml0X2xvY2soIGlkZW50X3QgKiBsb2MsIGttcF9pbnQzMiBndGlkLCAgdm9pZCAqKiB1c2VyX2xvY2sgKSB7CisgICAgc3RhdGljIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF9pbml0X2xvY2siOworICAgIGttcF91c2VyX2xvY2tfcCBsY2s7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsKKworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBpZiAoIHVzZXJfbG9jayA9PSBOVUxMICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBLTVBfQ0hFQ0tfVVNFUl9MT0NLX0lOSVQoKTsKKworICAgIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa190YXMgKQorICAgICAgJiYgKCBzaXplb2YoIGxjay0+dGFzLmxrLnBvbGwgKSA8PSBPTVBfTE9DS19UX1NJWkUgKSApIHsKKyAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2s7CisgICAgfQorI2lmIEtNUF9PU19MSU5VWCAmJiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0gfHwgS01QX0FSQ0hfQUFSQ0g2NCkKKyAgICBlbHNlIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa19mdXRleCApCisgICAgICAmJiAoIHNpemVvZiggbGNrLT5mdXRleC5say5wb2xsICkgPD0gT01QX0xPQ0tfVF9TSVpFICkgKSB7CisgICAgICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrOworICAgIH0KKyNlbmRpZgorICAgIGVsc2UgeworICAgICAgICBsY2sgPSBfX2ttcF91c2VyX2xvY2tfYWxsb2NhdGUoIHVzZXJfbG9jaywgZ3RpZCwgMCApOworICAgIH0KKyAgICBJTklUX0xPQ0soIGxjayApOworICAgIF9fa21wX3NldF91c2VyX2xvY2tfbG9jYXRpb24oIGxjaywgbG9jICk7CisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X2xvY2tfY3JlYXRpbmcoIGxjayApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KK30gLy8gX19rbXBjX2luaXRfbG9jaworCisvKiBpbml0aWFsaXplIHRoZSBsb2NrICovCit2b2lkCitfX2ttcGNfaW5pdF9uZXN0X2xvY2soIGlkZW50X3QgKiBsb2MsIGttcF9pbnQzMiBndGlkLCB2b2lkICoqIHVzZXJfbG9jayApIHsKKyAgICBzdGF0aWMgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX2luaXRfbmVzdF9sb2NrIjsKKyAgICBrbXBfdXNlcl9sb2NrX3AgbGNrOworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7CisKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgaWYgKCB1c2VyX2xvY2sgPT0gTlVMTCApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgICAgICB9CisgICAgfQorCisgICAgS01QX0NIRUNLX1VTRVJfTE9DS19JTklUKCk7CisKKyAgICBpZiAoICggX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfdGFzICkgJiYgKCBzaXplb2YoIGxjay0+dGFzLmxrLnBvbGwgKQorICAgICAgKyBzaXplb2YoIGxjay0+dGFzLmxrLmRlcHRoX2xvY2tlZCApIDw9IE9NUF9ORVNUX0xPQ0tfVF9TSVpFICkgKSB7CisgICAgICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrOworICAgIH0KKyNpZiBLTVBfT1NfTElOVVggJiYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNIHx8IEtNUF9BUkNIX0FBUkNINjQpCisgICAgZWxzZSBpZiAoICggX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfZnV0ZXggKQorICAgICAmJiAoIHNpemVvZiggbGNrLT5mdXRleC5say5wb2xsICkgKyBzaXplb2YoIGxjay0+ZnV0ZXgubGsuZGVwdGhfbG9ja2VkICkKKyAgICAgPD0gT01QX05FU1RfTE9DS19UX1NJWkUgKSApIHsKKyAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2s7CisgICAgfQorI2VuZGlmCisgICAgZWxzZSB7CisgICAgICAgIGxjayA9IF9fa21wX3VzZXJfbG9ja19hbGxvY2F0ZSggdXNlcl9sb2NrLCBndGlkLCAwICk7CisgICAgfQorCisgICAgSU5JVF9ORVNURURfTE9DSyggbGNrICk7CisgICAgX19rbXBfc2V0X3VzZXJfbG9ja19sb2NhdGlvbiggbGNrLCBsb2MgKTsKKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfbG9ja19jcmVhdGluZyggbGNrICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworfSAvLyBfX2ttcGNfaW5pdF9uZXN0X2xvY2sKKwordm9pZAorX19rbXBjX2Rlc3Ryb3lfbG9jayggaWRlbnRfdCAqIGxvYywga21wX2ludDMyIGd0aWQsIHZvaWQgKiogdXNlcl9sb2NrICkgeworCisgICAga21wX3VzZXJfbG9ja19wIGxjazsKKworICAgIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa190YXMgKQorICAgICAgJiYgKCBzaXplb2YoIGxjay0+dGFzLmxrLnBvbGwgKSA8PSBPTVBfTE9DS19UX1NJWkUgKSApIHsKKyAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2s7CisgICAgfQorI2lmIEtNUF9PU19MSU5VWCAmJiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0gfHwgS01QX0FSQ0hfQUFSQ0g2NCkKKyAgICBlbHNlIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa19mdXRleCApCisgICAgICAmJiAoIHNpemVvZiggbGNrLT5mdXRleC5say5wb2xsICkgPD0gT01QX0xPQ0tfVF9TSVpFICkgKSB7CisgICAgICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrOworICAgIH0KKyNlbmRpZgorICAgIGVsc2UgeworICAgICAgICBsY2sgPSBfX2ttcF9sb29rdXBfdXNlcl9sb2NrKCB1c2VyX2xvY2ssICJvbXBfZGVzdHJveV9sb2NrIiApOworICAgIH0KKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfbG9ja19kZXN0cm95ZWQoIGxjayApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICBERVNUUk9ZX0xPQ0soIGxjayApOworCisgICAgaWYgKCAoIF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX3RhcyApCisgICAgICAmJiAoIHNpemVvZiggbGNrLT50YXMubGsucG9sbCApIDw9IE9NUF9MT0NLX1RfU0laRSApICkgeworICAgICAgICA7CisgICAgfQorI2lmIEtNUF9PU19MSU5VWCAmJiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0gfHwgS01QX0FSQ0hfQUFSQ0g2NCkKKyAgICBlbHNlIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa19mdXRleCApCisgICAgICAmJiAoIHNpemVvZiggbGNrLT5mdXRleC5say5wb2xsICkgPD0gT01QX0xPQ0tfVF9TSVpFICkgKSB7CisgICAgICAgIDsKKyAgICB9CisjZW5kaWYKKyAgICBlbHNlIHsKKyAgICAgICAgX19rbXBfdXNlcl9sb2NrX2ZyZWUoIHVzZXJfbG9jaywgZ3RpZCwgbGNrICk7CisgICAgfQorfSAvLyBfX2ttcGNfZGVzdHJveV9sb2NrCisKKy8qIGRlc3Ryb3kgdGhlIGxvY2sgKi8KK3ZvaWQKK19fa21wY19kZXN0cm95X25lc3RfbG9jayggaWRlbnRfdCAqIGxvYywga21wX2ludDMyIGd0aWQsIHZvaWQgKiogdXNlcl9sb2NrICkgeworCisgICAga21wX3VzZXJfbG9ja19wIGxjazsKKworICAgIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa190YXMgKSAmJiAoIHNpemVvZiggbGNrLT50YXMubGsucG9sbCApCisgICAgICArIHNpemVvZiggbGNrLT50YXMubGsuZGVwdGhfbG9ja2VkICkgPD0gT01QX05FU1RfTE9DS19UX1NJWkUgKSApIHsKKyAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2s7CisgICAgfQorI2lmIEtNUF9PU19MSU5VWCAmJiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0gfHwgS01QX0FSQ0hfQUFSQ0g2NCkKKyAgICBlbHNlIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa19mdXRleCApCisgICAgICYmICggc2l6ZW9mKCBsY2stPmZ1dGV4LmxrLnBvbGwgKSArIHNpemVvZiggbGNrLT5mdXRleC5say5kZXB0aF9sb2NrZWQgKQorICAgICA8PSBPTVBfTkVTVF9MT0NLX1RfU0laRSApICkgeworICAgICAgICBsY2sgPSAoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jazsKKyAgICB9CisjZW5kaWYKKyAgICBlbHNlIHsKKyAgICAgICAgbGNrID0gX19rbXBfbG9va3VwX3VzZXJfbG9jayggdXNlcl9sb2NrLCAib21wX2Rlc3Ryb3lfbmVzdF9sb2NrIiApOworICAgIH0KKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfbG9ja19kZXN0cm95ZWQoIGxjayApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgIERFU1RST1lfTkVTVEVEX0xPQ0soIGxjayApOworCisgICAgaWYgKCAoIF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX3RhcyApICYmICggc2l6ZW9mKCBsY2stPnRhcy5say5wb2xsICkKKyAgICAgKyBzaXplb2YoIGxjay0+dGFzLmxrLmRlcHRoX2xvY2tlZCApIDw9IE9NUF9ORVNUX0xPQ0tfVF9TSVpFICkgKSB7CisgICAgICAgIDsKKyAgICB9CisjaWYgS01QX09TX0xJTlVYICYmIChLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSB8fCBLTVBfQVJDSF9BQVJDSDY0KQorICAgIGVsc2UgaWYgKCAoIF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX2Z1dGV4ICkKKyAgICAgJiYgKCBzaXplb2YoIGxjay0+ZnV0ZXgubGsucG9sbCApICsgc2l6ZW9mKCBsY2stPmZ1dGV4LmxrLmRlcHRoX2xvY2tlZCApCisgICAgIDw9IE9NUF9ORVNUX0xPQ0tfVF9TSVpFICkgKSB7CisgICAgICAgIDsKKyAgICB9CisjZW5kaWYKKyAgICBlbHNlIHsKKyAgICAgICAgX19rbXBfdXNlcl9sb2NrX2ZyZWUoIHVzZXJfbG9jaywgZ3RpZCwgbGNrICk7CisgICAgfQorfSAvLyBfX2ttcGNfZGVzdHJveV9uZXN0X2xvY2sKKwordm9pZAorX19rbXBjX3NldF9sb2NrKCBpZGVudF90ICogbG9jLCBrbXBfaW50MzIgZ3RpZCwgdm9pZCAqKiB1c2VyX2xvY2sgKSB7CisgICAgS01QX0NPVU5UX0JMT0NLKE9NUF9zZXRfbG9jayk7CisgICAga21wX3VzZXJfbG9ja19wIGxjazsKKworICAgIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa190YXMgKQorICAgICAgJiYgKCBzaXplb2YoIGxjay0+dGFzLmxrLnBvbGwgKSA8PSBPTVBfTE9DS19UX1NJWkUgKSApIHsKKyAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2s7CisgICAgfQorI2lmIEtNUF9PU19MSU5VWCAmJiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0gfHwgS01QX0FSQ0hfQUFSQ0g2NCkKKyAgICBlbHNlIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa19mdXRleCApCisgICAgICAmJiAoIHNpemVvZiggbGNrLT5mdXRleC5say5wb2xsICkgPD0gT01QX0xPQ0tfVF9TSVpFICkgKSB7CisgICAgICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrOworICAgIH0KKyNlbmRpZgorICAgIGVsc2UgeworICAgICAgICBsY2sgPSBfX2ttcF9sb29rdXBfdXNlcl9sb2NrKCB1c2VyX2xvY2ssICJvbXBfc2V0X2xvY2siICk7CisgICAgfQorCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9sb2NrX2FjcXVpcmluZyggbGNrICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgICAgQUNRVUlSRV9MT0NLKCBsY2ssIGd0aWQgKTsKKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfbG9ja19hY3F1aXJlZCggbGNrICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworfQorCisKK3ZvaWQKK19fa21wY19zZXRfbmVzdF9sb2NrKCBpZGVudF90ICogbG9jLCBrbXBfaW50MzIgZ3RpZCwgdm9pZCAqKiB1c2VyX2xvY2sgKSB7CisgICAga21wX3VzZXJfbG9ja19wIGxjazsKKworICAgIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa190YXMgKSAmJiAoIHNpemVvZiggbGNrLT50YXMubGsucG9sbCApCisgICAgICArIHNpemVvZiggbGNrLT50YXMubGsuZGVwdGhfbG9ja2VkICkgPD0gT01QX05FU1RfTE9DS19UX1NJWkUgKSApIHsKKyAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2s7CisgICAgfQorI2lmIEtNUF9PU19MSU5VWCAmJiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0gfHwgS01QX0FSQ0hfQUFSQ0g2NCkKKyAgICBlbHNlIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa19mdXRleCApCisgICAgICYmICggc2l6ZW9mKCBsY2stPmZ1dGV4LmxrLnBvbGwgKSArIHNpemVvZiggbGNrLT5mdXRleC5say5kZXB0aF9sb2NrZWQgKQorICAgICA8PSBPTVBfTkVTVF9MT0NLX1RfU0laRSApICkgeworICAgICAgICBsY2sgPSAoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jazsKKyAgICB9CisjZW5kaWYKKyAgICBlbHNlIHsKKyAgICAgICAgbGNrID0gX19rbXBfbG9va3VwX3VzZXJfbG9jayggdXNlcl9sb2NrLCAib21wX3NldF9uZXN0X2xvY2siICk7CisgICAgfQorCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9sb2NrX2FjcXVpcmluZyggbGNrICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgICAgQUNRVUlSRV9ORVNURURfTE9DSyggbGNrLCBndGlkICk7CisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X2xvY2tfYWNxdWlyZWQoIGxjayApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KK30KKwordm9pZAorX19rbXBjX3Vuc2V0X2xvY2soIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIHZvaWQgKip1c2VyX2xvY2sgKQoreworICAgIGttcF91c2VyX2xvY2tfcCBsY2s7CisKKyAgICAvKiBDYW4ndCB1c2Ugc2VyaWFsIGludGVydmFsIHNpbmNlIG5vdCBibG9jayBzdHJ1Y3R1cmVkICovCisgICAgLyogcmVsZWFzZSB0aGUgbG9jayAqLworCisgICAgaWYgKCAoIF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX3RhcyApCisgICAgICAmJiAoIHNpemVvZiggbGNrLT50YXMubGsucG9sbCApIDw9IE9NUF9MT0NLX1RfU0laRSApICkgeworI2lmIEtNUF9PU19MSU5VWCAmJiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0gfHwgS01QX0FSQ0hfQUFSQ0g2NCkKKyAgICAgICAgLy8gImZhc3QiIHBhdGggaW1wbGVtZW50ZWQgdG8gZml4IGN1c3RvbWVyIHBlcmZvcm1hbmNlIGlzc3VlCisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICBfX2ttcF9pdHRfbG9ja19yZWxlYXNpbmcoIChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworICAgICAgICBUQ1dfNCgoKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2spLT50YXMubGsucG9sbCwgMCk7CisgICAgICAgIEtNUF9NQigpOworICAgICAgICByZXR1cm47CisjZWxzZQorICAgICAgICBsY2sgPSAoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jazsKKyNlbmRpZgorICAgIH0KKyNpZiBLTVBfT1NfTElOVVggJiYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNIHx8IEtNUF9BUkNIX0FBUkNINjQpCisgICAgZWxzZSBpZiAoICggX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfZnV0ZXggKQorICAgICAgJiYgKCBzaXplb2YoIGxjay0+ZnV0ZXgubGsucG9sbCApIDw9IE9NUF9MT0NLX1RfU0laRSApICkgeworICAgICAgICBsY2sgPSAoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jazsKKyAgICB9CisjZW5kaWYKKyAgICBlbHNlIHsKKyAgICAgICAgbGNrID0gX19rbXBfbG9va3VwX3VzZXJfbG9jayggdXNlcl9sb2NrLCAib21wX3Vuc2V0X2xvY2siICk7CisgICAgfQorCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9sb2NrX3JlbGVhc2luZyggbGNrICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgICAgUkVMRUFTRV9MT0NLKCBsY2ssIGd0aWQgKTsKK30KKworLyogcmVsZWFzZSB0aGUgbG9jayAqLwordm9pZAorX19rbXBjX3Vuc2V0X25lc3RfbG9jayggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwgdm9pZCAqKnVzZXJfbG9jayApCit7CisgICAga21wX3VzZXJfbG9ja19wIGxjazsKKworICAgIC8qIENhbid0IHVzZSBzZXJpYWwgaW50ZXJ2YWwgc2luY2Ugbm90IGJsb2NrIHN0cnVjdHVyZWQgKi8KKworICAgIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa190YXMgKSAmJiAoIHNpemVvZiggbGNrLT50YXMubGsucG9sbCApCisgICAgICArIHNpemVvZiggbGNrLT50YXMubGsuZGVwdGhfbG9ja2VkICkgPD0gT01QX05FU1RfTE9DS19UX1NJWkUgKSApIHsKKyNpZiBLTVBfT1NfTElOVVggJiYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNIHx8IEtNUF9BUkNIX0FBUkNINjQpCisgICAgICAgIC8vICJmYXN0IiBwYXRoIGltcGxlbWVudGVkIHRvIGZpeCBjdXN0b21lciBwZXJmb3JtYW5jZSBpc3N1ZQorICAgICAgICBrbXBfdGFzX2xvY2tfdCAqdGwgPSAoa21wX3Rhc19sb2NrX3QqKXVzZXJfbG9jazsKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgIF9fa21wX2l0dF9sb2NrX3JlbGVhc2luZyggKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2sgKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAgICAgIGlmICggLS0odGwtPmxrLmRlcHRoX2xvY2tlZCkgPT0gMCApIHsKKyAgICAgICAgICAgIFRDV180KHRsLT5say5wb2xsLCAwKTsKKyAgICAgICAgfQorICAgICAgICBLTVBfTUIoKTsKKyAgICAgICAgcmV0dXJuOworI2Vsc2UKKyAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2s7CisjZW5kaWYKKyAgICB9CisjaWYgS01QX09TX0xJTlVYICYmIChLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSB8fCBLTVBfQVJDSF9BQVJDSDY0KQorICAgIGVsc2UgaWYgKCAoIF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX2Z1dGV4ICkKKyAgICAgJiYgKCBzaXplb2YoIGxjay0+ZnV0ZXgubGsucG9sbCApICsgc2l6ZW9mKCBsY2stPmZ1dGV4LmxrLmRlcHRoX2xvY2tlZCApCisgICAgIDw9IE9NUF9ORVNUX0xPQ0tfVF9TSVpFICkgKSB7CisgICAgICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrOworICAgIH0KKyNlbmRpZgorICAgIGVsc2UgeworICAgICAgICBsY2sgPSBfX2ttcF9sb29rdXBfdXNlcl9sb2NrKCB1c2VyX2xvY2ssICJvbXBfdW5zZXRfbmVzdF9sb2NrIiApOworICAgIH0KKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfbG9ja19yZWxlYXNpbmcoIGxjayApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgIFJFTEVBU0VfTkVTVEVEX0xPQ0soIGxjaywgZ3RpZCApOworfQorCisvKiB0cnkgdG8gYWNxdWlyZSB0aGUgbG9jayAqLworaW50CitfX2ttcGNfdGVzdF9sb2NrKCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCB2b2lkICoqdXNlcl9sb2NrICkKK3sKKyAgICBLTVBfQ09VTlRfQkxPQ0soT01QX3Rlc3RfbG9jayk7CisgICAgS01QX1RJTUVfQkxPQ0soT01QX3Rlc3RfbG9jayk7CisgICAga21wX3VzZXJfbG9ja19wIGxjazsKKyAgICBpbnQgICAgICAgICAgcmM7CisKKyAgICBpZiAoICggX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfdGFzICkKKyAgICAgICYmICggc2l6ZW9mKCBsY2stPnRhcy5say5wb2xsICkgPD0gT01QX0xPQ0tfVF9TSVpFICkgKSB7CisgICAgICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrOworICAgIH0KKyNpZiBLTVBfT1NfTElOVVggJiYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNIHx8IEtNUF9BUkNIX0FBUkNINjQpCisgICAgZWxzZSBpZiAoICggX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfZnV0ZXggKQorICAgICAgJiYgKCBzaXplb2YoIGxjay0+ZnV0ZXgubGsucG9sbCApIDw9IE9NUF9MT0NLX1RfU0laRSApICkgeworICAgICAgICBsY2sgPSAoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jazsKKyAgICB9CisjZW5kaWYKKyAgICBlbHNlIHsKKyAgICAgICAgbGNrID0gX19rbXBfbG9va3VwX3VzZXJfbG9jayggdXNlcl9sb2NrLCAib21wX3Rlc3RfbG9jayIgKTsKKyAgICB9CisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X2xvY2tfYWNxdWlyaW5nKCBsY2sgKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICByYyA9IFRFU1RfTE9DSyggbGNrLCBndGlkICk7CisjaWYgVVNFX0lUVF9CVUlMRAorICAgIGlmICggcmMgKSB7CisgICAgICAgIF9fa21wX2l0dF9sb2NrX2FjcXVpcmVkKCBsY2sgKTsKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9pdHRfbG9ja19jYW5jZWxsZWQoIGxjayApOworICAgIH0KKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAgcmV0dXJuICggcmMgPyBGVE5fVFJVRSA6IEZUTl9GQUxTRSApOworCisgICAgLyogQ2FuJ3QgdXNlIHNlcmlhbCBpbnRlcnZhbCBzaW5jZSBub3QgYmxvY2sgc3RydWN0dXJlZCAqLworfQorCisvKiB0cnkgdG8gYWNxdWlyZSB0aGUgbG9jayAqLworaW50CitfX2ttcGNfdGVzdF9uZXN0X2xvY2soIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIHZvaWQgKip1c2VyX2xvY2sgKQoreworICAgIGttcF91c2VyX2xvY2tfcCBsY2s7CisgICAgaW50ICAgICAgICAgIHJjOworCisgICAgaWYgKCAoIF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX3RhcyApICYmICggc2l6ZW9mKCBsY2stPnRhcy5say5wb2xsICkKKyAgICAgICsgc2l6ZW9mKCBsY2stPnRhcy5say5kZXB0aF9sb2NrZWQgKSA8PSBPTVBfTkVTVF9MT0NLX1RfU0laRSApICkgeworICAgICAgICBsY2sgPSAoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jazsKKyAgICB9CisjaWYgS01QX09TX0xJTlVYICYmIChLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSB8fCBLTVBfQVJDSF9BQVJDSDY0KQorICAgIGVsc2UgaWYgKCAoIF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX2Z1dGV4ICkKKyAgICAgJiYgKCBzaXplb2YoIGxjay0+ZnV0ZXgubGsucG9sbCApICsgc2l6ZW9mKCBsY2stPmZ1dGV4LmxrLmRlcHRoX2xvY2tlZCApCisgICAgIDw9IE9NUF9ORVNUX0xPQ0tfVF9TSVpFICkgKSB7CisgICAgICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrOworICAgIH0KKyNlbmRpZgorICAgIGVsc2UgeworICAgICAgICBsY2sgPSBfX2ttcF9sb29rdXBfdXNlcl9sb2NrKCB1c2VyX2xvY2ssICJvbXBfdGVzdF9uZXN0X2xvY2siICk7CisgICAgfQorCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9sb2NrX2FjcXVpcmluZyggbGNrICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgICAgcmMgPSBURVNUX05FU1RFRF9MT0NLKCBsY2ssIGd0aWQgKTsKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgaWYgKCByYyApIHsKKyAgICAgICAgX19rbXBfaXR0X2xvY2tfYWNxdWlyZWQoIGxjayApOworICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX2l0dF9sb2NrX2NhbmNlbGxlZCggbGNrICk7CisgICAgfQorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICByZXR1cm4gcmM7CisKKyAgICAvKiBDYW4ndCB1c2Ugc2VyaWFsIGludGVydmFsIHNpbmNlIG5vdCBibG9jayBzdHJ1Y3R1cmVkICovCit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBJbnRlcmZhY2UgdG8gZmFzdCBzY2FsYWJsZSByZWR1Y2UgbWV0aG9kcyByb3V0aW5lcworICovCisKKy8vIGtlZXAgdGhlIHNlbGVjdGVkIG1ldGhvZCBpbiBhIHRocmVhZCBsb2NhbCBzdHJ1Y3R1cmUgZm9yIGNyb3NzLWZ1bmN0aW9uIHVzYWdlOiB3aWxsIGJlIHVzZWQgaW4gX19rbXBjX2VuZF9yZWR1Y2UqIGZ1bmN0aW9uczsKKy8vIGFub3RoZXIgc29sdXRpb246IHRvIHJlLWRldGVybWluZSB0aGUgbWV0aG9kIG9uZSBtb3JlIHRpbWUgaW4gX19rbXBjX2VuZF9yZWR1Y2UqIGZ1bmN0aW9ucyAobmV3IHByb3RvdHlwZSByZXF1aXJlZCB0aGVuKQorLy8gQVQ6IHdoaWNoIHNvbHV0aW9uIGlzIGJldHRlcj8KKyNkZWZpbmUgX19LTVBfU0VUX1JFRFVDVElPTl9NRVRIT0QoZ3RpZCxybWV0aG9kKSBcCisgICAgICAgICAgICAgICAgICAgKCAoIF9fa21wX3RocmVhZHNbICggZ3RpZCApIF0gLT4gdGgudGhfbG9jYWwucGFja2VkX3JlZHVjdGlvbl9tZXRob2QgKSA9ICggcm1ldGhvZCApICkKKworI2RlZmluZSBfX0tNUF9HRVRfUkVEVUNUSU9OX01FVEhPRChndGlkKSBcCisgICAgICAgICAgICAgICAgICAgKCBfX2ttcF90aHJlYWRzWyAoIGd0aWQgKSBdIC0+IHRoLnRoX2xvY2FsLnBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kICkKKworLy8gZGVzY3JpcHRpb24gb2YgdGhlIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kIHZhcmlhYmxlOiBsb29rIGF0IHRoZSBtYWNyb3MgaW4ga21wLmgKKworCisvLyB1c2VkIGluIGEgY3JpdGljYWwgc2VjdGlvbiByZWR1Y2UgYmxvY2sKK3N0YXRpYyBfX2ZvcmNlaW5saW5lIHZvaWQKK19fa21wX2VudGVyX2NyaXRpY2FsX3NlY3Rpb25fcmVkdWNlX2Jsb2NrKCBpZGVudF90ICogbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wX2NyaXRpY2FsX25hbWUgKiBjcml0ICkgeworCisgICAgLy8gdGhpcyBsb2NrIHdhcyB2aXNpYmxlIHRvIGEgY3VzdG9tZXIgYW5kIHRvIHRoZSB0aHJlYWQgcHJvZmlsZXIgYXMgYSBzZXJpYWwgb3ZlcmhlYWQgc3BhbgorICAgIC8vICAgICAgICAgICAgKGFsdGhvdWdoIGl0J3MgdXNlZCBmb3IgYW4gaW50ZXJuYWwgcHVycG9zZSBvbmx5KQorICAgIC8vICAgICAgICAgICAgd2h5IHdhcyBpdCB2aXNpYmxlIGluIHByZXZpb3VzIGltcGxlbWVudGF0aW9uPworICAgIC8vICAgICAgICAgICAgc2hvdWxkIHdlIGtlZXAgaXQgdmlzaWJsZSBpbiBuZXcgcmVkdWNlIGJsb2NrPworICAgIGttcF91c2VyX2xvY2tfcCBsY2s7CisKKyAgICAvLyBXZSBrbm93IHRoYXQgdGhlIGZhc3QgcmVkdWN0aW9uIGNvZGUgaXMgb25seSBlbWl0dGVkIGJ5IEludGVsIGNvbXBpbGVycworICAgIC8vIHdpdGggMzIgYnl0ZSBjcml0aWNhbCBzZWN0aW9ucy4gSWYgdGhlcmUgaXNuJ3QgZW5vdWdoIHNwYWNlLCB0aGVuIHdlCisgICAgLy8gaGF2ZSB0byB1c2UgYSBwb2ludGVyLgorICAgIGlmICggX19rbXBfYmFzZV91c2VyX2xvY2tfc2l6ZSA8PSBJTlRFTF9DUklUSUNBTF9TSVpFICkgeworICAgICAgICBsY2sgPSAoa21wX3VzZXJfbG9ja19wKWNyaXQ7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBsY2sgPSBfX2ttcF9nZXRfY3JpdGljYWxfc2VjdGlvbl9wdHIoIGNyaXQsIGxvYywgZ2xvYmFsX3RpZCApOworICAgIH0KKyAgICBLTVBfREVCVUdfQVNTRVJUKCBsY2sgIT0gTlVMTCApOworCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKQorICAgICAgICBfX2ttcF9wdXNoX3N5bmMoIGdsb2JhbF90aWQsIGN0X2NyaXRpY2FsLCBsb2MsIGxjayApOworCisgICAgX19rbXBfYWNxdWlyZV91c2VyX2xvY2tfd2l0aF9jaGVja3MoIGxjaywgZ2xvYmFsX3RpZCApOworfQorCisvLyB1c2VkIGluIGEgY3JpdGljYWwgc2VjdGlvbiByZWR1Y2UgYmxvY2sKK3N0YXRpYyBfX2ZvcmNlaW5saW5lIHZvaWQKK19fa21wX2VuZF9jcml0aWNhbF9zZWN0aW9uX3JlZHVjZV9ibG9jayggaWRlbnRfdCAqIGxvYywga21wX2ludDMyIGdsb2JhbF90aWQsIGttcF9jcml0aWNhbF9uYW1lICogY3JpdCApIHsKKworICAgIGttcF91c2VyX2xvY2tfcCBsY2s7CisKKyAgICAvLyBXZSBrbm93IHRoYXQgdGhlIGZhc3QgcmVkdWN0aW9uIGNvZGUgaXMgb25seSBlbWl0dGVkIGJ5IEludGVsIGNvbXBpbGVycyB3aXRoIDMyIGJ5dGUgY3JpdGljYWwKKyAgICAvLyBzZWN0aW9ucy4gSWYgdGhlcmUgaXNuJ3QgZW5vdWdoIHNwYWNlLCB0aGVuIHdlIGhhdmUgdG8gdXNlIGEgcG9pbnRlci4KKyAgICBpZiAoIF9fa21wX2Jhc2VfdXNlcl9sb2NrX3NpemUgPiAzMiApIHsKKyAgICAgICAgbGNrID0gKiggKGttcF91c2VyX2xvY2tfcCAqKSBjcml0ICk7CisgICAgICAgIEtNUF9BU1NFUlQoIGxjayAhPSBOVUxMICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCkgY3JpdDsKKyAgICB9CisKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApCisgICAgICAgIF9fa21wX3BvcF9zeW5jKCBnbG9iYWxfdGlkLCBjdF9jcml0aWNhbCwgbG9jICk7CisKKyAgICBfX2ttcF9yZWxlYXNlX3VzZXJfbG9ja193aXRoX2NoZWNrcyggbGNrLCBnbG9iYWxfdGlkICk7CisKK30gLy8gX19rbXBfZW5kX2NyaXRpY2FsX3NlY3Rpb25fcmVkdWNlX2Jsb2NrCisKKworLyogMi5hLmkuIFJlZHVjZSBCbG9jayB3aXRob3V0IGEgdGVybWluYXRpbmcgYmFycmllciAqLworLyohCitAaW5ncm91cCBTWU5DSFJPTklaQVRJT04KK0BwYXJhbSBsb2Mgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uCitAcGFyYW0gZ2xvYmFsX3RpZCBnbG9iYWwgdGhyZWFkIG51bWJlcgorQHBhcmFtIG51bV92YXJzIG51bWJlciBvZiBpdGVtcyAodmFyaWFibGVzKSB0byBiZSByZWR1Y2VkCitAcGFyYW0gcmVkdWNlX3NpemUgc2l6ZSBvZiBkYXRhIGluIGJ5dGVzIHRvIGJlIHJlZHVjZWQKK0BwYXJhbSByZWR1Y2VfZGF0YSBwb2ludGVyIHRvIGRhdGEgdG8gYmUgcmVkdWNlZAorQHBhcmFtIHJlZHVjZV9mdW5jIGNhbGxiYWNrIGZ1bmN0aW9uIHByb3ZpZGluZyByZWR1Y3Rpb24gb3BlcmF0aW9uIG9uIHR3byBvcGVyYW5kcyBhbmQgcmV0dXJuaW5nIHJlc3VsdCBvZiByZWR1Y3Rpb24gaW4gbGhzX2RhdGEKK0BwYXJhbSBsY2sgcG9pbnRlciB0byB0aGUgdW5pcXVlIGxvY2sgZGF0YSBzdHJ1Y3R1cmUKK0ByZXN1bHQgMSBmb3IgdGhlIG1hc3RlciB0aHJlYWQsIDAgZm9yIGFsbCBvdGhlciB0ZWFtIHRocmVhZHMsIDIgZm9yIGFsbCB0ZWFtIHRocmVhZHMgaWYgYXRvbWljIHJlZHVjdGlvbiBuZWVkZWQKKworVGhlIG5vd2FpdCB2ZXJzaW9uIGlzIHVzZWQgZm9yIGEgcmVkdWNlIGNsYXVzZSB3aXRoIHRoZSBub3dhaXQgYXJndW1lbnQuCisqLwora21wX2ludDMyCitfX2ttcGNfcmVkdWNlX25vd2FpdCgKKyAgICBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLAorICAgIGttcF9pbnQzMiBudW1fdmFycywgc2l6ZV90IHJlZHVjZV9zaXplLCB2b2lkICpyZWR1Y2VfZGF0YSwgdm9pZCAoKnJlZHVjZV9mdW5jKSh2b2lkICpsaHNfZGF0YSwgdm9pZCAqcmhzX2RhdGEpLAorICAgIGttcF9jcml0aWNhbF9uYW1lICpsY2sgKSB7CisKKyAgICBLTVBfQ09VTlRfQkxPQ0soUkVEVUNFX25vd2FpdCk7CisgICAgaW50IHJldHZhbDsKKyAgICBQQUNLRURfUkVEVUNUSU9OX01FVEhPRF9UIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kOworI2lmIE9NUF80MF9FTkFCTEVECisgICAga21wX3RlYW1fdCAqdGVhbTsKKyAgICBrbXBfaW5mb190ICp0aDsKKyAgICBpbnQgdGVhbXNfc3dhcHBlZCA9IDAsIHRhc2tfc3RhdGU7CisjZW5kaWYKKyAgICBLQV9UUkFDRSggMTAsICggIl9fa21wY19yZWR1Y2Vfbm93YWl0KCkgZW50ZXI6IGNhbGxlZCBUIyVkXG4iLCBnbG9iYWxfdGlkICkgKTsKKworICAgIC8vIHdoeSBkbyB3ZSBuZWVkIHRoaXMgaW5pdGlhbGl6YXRpb24gaGVyZSBhdCBhbGw/CisgICAgLy8gUmVkdWN0aW9uIGNsYXVzZSBjYW4gbm90IGJlIHVzZWQgYXMgYSBzdGFuZC1hbG9uZSBkaXJlY3RpdmUuCisKKyAgICAvLyBkbyBub3QgY2FsbCBfX2ttcF9zZXJpYWxfaW5pdGlhbGl6ZSgpLCBpdCB3aWxsIGJlIGNhbGxlZCBieSBfX2ttcF9wYXJhbGxlbF9pbml0aWFsaXplKCkgaWYgbmVlZGVkCisgICAgLy8gcG9zc2libGUgZGV0ZWN0aW9uIG9mIGZhbHNlLXBvc2l0aXZlIHJhY2UgYnkgdGhlIHRocmVhZGNoZWNrZXIgPz8/CisgICAgaWYoICEgVENSXzQoIF9fa21wX2luaXRfcGFyYWxsZWwgKSApCisgICAgICAgIF9fa21wX3BhcmFsbGVsX2luaXRpYWxpemUoKTsKKworICAgIC8vIGNoZWNrIGNvcnJlY3RuZXNzIG9mIHJlZHVjZSBibG9jayBuZXN0aW5nCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKQorICAgICAgICBfX2ttcF9wdXNoX3N5bmMoIGdsb2JhbF90aWQsIGN0X3JlZHVjZSwgbG9jLCBOVUxMICk7CisKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIHRoID0gX19rbXBfdGhyZWFkX2Zyb21fZ3RpZChnbG9iYWxfdGlkKTsKKyAgICBpZiggdGgtPnRoLnRoX3RlYW1zX21pY3JvdGFzayApIHsgICAvLyBBQzogY2hlY2sgaWYgd2UgYXJlIGluc2lkZSB0aGUgdGVhbXMgY29uc3RydWN0PworICAgICAgICB0ZWFtID0gdGgtPnRoLnRoX3RlYW07CisgICAgICAgIGlmKCB0ZWFtLT50LnRfbGV2ZWwgPT0gdGgtPnRoLnRoX3RlYW1zX2xldmVsICkgeworICAgICAgICAgICAgLy8gdGhpcyBpcyByZWR1Y3Rpb24gYXQgdGVhbXMgY29uc3RydWN0CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCF0aC0+dGgudGhfaW5mby5kcy5kc190aWQpOyAgLy8gQUM6IGNoZWNrIHRoYXQgdGlkID09IDAKKyAgICAgICAgICAgIC8vIExldCdzIHN3YXAgdGVhbXMgdGVtcG9yYXJpbHkgZm9yIHRoZSByZWR1Y3Rpb24gYmFycmllcgorICAgICAgICAgICAgdGVhbXNfc3dhcHBlZCA9IDE7CisgICAgICAgICAgICB0aC0+dGgudGhfaW5mby5kcy5kc190aWQgPSB0ZWFtLT50LnRfbWFzdGVyX3RpZDsKKyAgICAgICAgICAgIHRoLT50aC50aF90ZWFtID0gdGVhbS0+dC50X3BhcmVudDsKKyAgICAgICAgICAgIHRoLT50aC50aF90YXNrX3RlYW0gPSB0aC0+dGgudGhfdGVhbS0+dC50X3Rhc2tfdGVhbTsKKyAgICAgICAgICAgIHRoLT50aC50aF90ZWFtX25wcm9jID0gdGgtPnRoLnRoX3RlYW0tPnQudF9ucHJvYzsKKyAgICAgICAgICAgIHRhc2tfc3RhdGUgPSB0aC0+dGgudGhfdGFza19zdGF0ZTsKKyAgICAgICAgICAgIGlmKCB0aC0+dGgudGhfdGFza190ZWFtICkKKyAgICAgICAgICAgICAgICB0aC0+dGgudGhfdGFza19zdGF0ZSA9IHRoLT50aC50aF90YXNrX3RlYW0tPnR0LnR0X3N0YXRlOworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8vIE9NUF80MF9FTkFCTEVECisKKyAgICAvLyBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCB2YWx1ZSB3aWxsIGJlIHJldXNlZCBieSBfX2ttcF9lbmRfcmVkdWNlKiBmdW5jdGlvbiwgdGhlIHZhbHVlIHNob3VsZCBiZSBrZXB0IGluIGEgdmFyaWFibGUKKyAgICAvLyB0aGUgdmFyaWFibGUgc2hvdWxkIGJlIGVpdGhlciBhIGNvbnN0cnVjdC1zcGVjaWZpYyBvciB0aHJlYWQtc3BlY2lmaWMgcHJvcGVydHksIG5vdCBhIHRlYW0gc3BlY2lmaWMgcHJvcGVydHkKKyAgICAvLyAgICAgKGEgdGhyZWFkIGNhbiByZWFjaCB0aGUgbmV4dCByZWR1Y2UgYmxvY2sgb24gdGhlIG5leHQgY29uc3RydWN0LCByZWR1Y2UgbWV0aG9kIG1heSBkaWZmZXIgb24gdGhlIG5leHQgY29uc3RydWN0KQorICAgIC8vIGFuIGlkZW50X3QgImxvYyIgcGFyYW1ldGVyIGNvdWxkIGJlIHVzZWQgYXMgYSBjb25zdHJ1Y3Qtc3BlY2lmaWMgcHJvcGVydHkgKHdoYXQgaWYgbG9jID09IDA/KQorICAgIC8vICAgICAoaWYgYm90aCBjb25zdHJ1Y3Qtc3BlY2lmaWMgYW5kIHRlYW0tc3BlY2lmaWMgdmFyaWFibGVzIHdlcmUgc2hhcmVkLCB0aGVuIHVubmVzcyBleHRyYSBzeW5jcyBzaG91bGQgYmUgbmVlZGVkKQorICAgIC8vIGEgdGhyZWFkLXNwZWNpZmljIHZhcmlhYmxlIGlzIGJldHRlciByZWdhcmRpbmcgdHdvIGlzc3VlcyBhYm92ZSAobmV4dCBjb25zdHJ1Y3QgYW5kIGV4dHJhIHN5bmNzKQorICAgIC8vIGEgdGhyZWFkLXNwZWNpZmljICJ0aF9sb2NhbC5yZWR1Y3Rpb25fbWV0aG9kIiB2YXJpYWJsZSBpcyB1c2VkIGN1cnJlbnRseQorICAgIC8vIGVhY2ggdGhyZWFkIGV4ZWN1dGVzICdkZXRlcm1pbmUnIGFuZCAnc2V0JyBsaW5lcyAobm8gbmVlZCB0byBleGVjdXRlIGJ5IG9uZSB0aHJlYWQsIHRvIGF2b2lkIHVubmVzcyBleHRyYSBzeW5jcykKKworICAgIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kID0gX19rbXBfZGV0ZXJtaW5lX3JlZHVjdGlvbl9tZXRob2QoIGxvYywgZ2xvYmFsX3RpZCwgbnVtX3ZhcnMsIHJlZHVjZV9zaXplLCByZWR1Y2VfZGF0YSwgcmVkdWNlX2Z1bmMsIGxjayApOworICAgIF9fS01QX1NFVF9SRURVQ1RJT05fTUVUSE9EKCBnbG9iYWxfdGlkLCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCApOworCisgICAgaWYoIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kID09IGNyaXRpY2FsX3JlZHVjZV9ibG9jayApIHsKKworICAgICAgICBfX2ttcF9lbnRlcl9jcml0aWNhbF9zZWN0aW9uX3JlZHVjZV9ibG9jayggbG9jLCBnbG9iYWxfdGlkLCBsY2sgKTsKKyAgICAgICAgcmV0dmFsID0gMTsKKworICAgIH0gZWxzZSBpZiggcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgPT0gZW1wdHlfcmVkdWNlX2Jsb2NrICkgeworCisgICAgICAgIC8vIHVzYWdlOiBpZiB0ZWFtIHNpemUgPT0gMSwgbm8gc3luY2hyb25pemF0aW9uIGlzIHJlcXVpcmVkICggSW50ZWwgcGxhdGZvcm1zIG9ubHkgKQorICAgICAgICByZXR2YWwgPSAxOworCisgICAgfSBlbHNlIGlmKCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCA9PSBhdG9taWNfcmVkdWNlX2Jsb2NrICkgeworCisgICAgICAgIHJldHZhbCA9IDI7CisKKyAgICAgICAgLy8gYWxsIHRocmVhZHMgc2hvdWxkIGRvIHRoaXMgcG9wIGhlcmUgKGJlY2F1c2UgX19rbXBjX2VuZF9yZWR1Y2Vfbm93YWl0KCkgd29uJ3QgYmUgY2FsbGVkIGJ5IHRoZSBjb2RlIGdlbikKKyAgICAgICAgLy8gICAgIChpdCdzIG5vdCBxdWl0ZSBnb29kLCBiZWNhdXNlIHRoZSBjaGVja2luZyBibG9jayBoYXMgYmVlbiBjbG9zZWQgYnkgdGhpcyAncG9wJywKKyAgICAgICAgLy8gICAgICBidXQgYXRvbWljIG9wZXJhdGlvbiBoYXMgbm90IGJlZW4gZXhlY3V0ZWQgeWV0LCB3aWxsIGJlIGV4ZWN1dGVkIHNsaWdodGx5IGxhdGVyLCBsaXRlcmFsbHkgb24gbmV4dCBpbnN0cnVjdGlvbikKKyAgICAgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKQorICAgICAgICAgICAgX19rbXBfcG9wX3N5bmMoIGdsb2JhbF90aWQsIGN0X3JlZHVjZSwgbG9jICk7CisKKyAgICB9IGVsc2UgaWYoIFRFU1RfUkVEVUNUSU9OX01FVEhPRCggcGFja2VkX3JlZHVjdGlvbl9tZXRob2QsIHRyZWVfcmVkdWNlX2Jsb2NrICkgKSB7CisKKyAgICAgICAgLy9BVDogcGVyZm9ybWFuY2UgaXNzdWU6IGEgcmVhbCBiYXJyaWVyIGhlcmUKKyAgICAgICAgLy9BVDogICAgIChpZiBtYXN0ZXIgZ29lcyBzbG93LCBvdGhlciB0aHJlYWRzIGFyZSBibG9ja2VkIGhlcmUgd2FpdGluZyBmb3IgdGhlIG1hc3RlciB0byBjb21lIGFuZCByZWxlYXNlIHRoZW0pCisgICAgICAgIC8vQVQ6ICAgICAoaXQncyBub3Qgd2hhdCBhIGN1c3RvbWVyIG1pZ2h0IGV4cGVjdCBzcGVjaWZ5aW5nIE5PV0FJVCBjbGF1c2UpCisgICAgICAgIC8vQVQ6ICAgICAoc3BlY2lmeWluZyBOT1dBSVQgd29uJ3QgcmVzdWx0IGluIGltcHJvdmVtZW50IG9mIHBlcmZvcm1hbmNlLCBpdCdsbCBiZSBjb25mdXNpbmcgdG8gYSBjdXN0b21lcikKKyAgICAgICAgLy9BVDogYW5vdGhlciBpbXBsZW1lbnRhdGlvbiBvZiAqYmFycmllcl9nYXRoZXIqbm93YWl0KCkgKG9yIHNvbWUgb3RoZXIgZGVzaWduKSBtaWdodCBnbyBmYXN0ZXIKKyAgICAgICAgLy8gICAgICAgIGFuZCBiZSBtb3JlIGluIGxpbmUgd2l0aCBzZW5zZSBvZiBOT1dBSVQKKyAgICAgICAgLy9BVDogVE8gRE86IGRvIGVwY2MgdGVzdCBhbmQgY29tcGFyZSB0aW1lcworCisgICAgICAgIC8vIHRoaXMgYmFycmllciBzaG91bGQgYmUgaW52aXNpYmxlIHRvIGEgY3VzdG9tZXIgYW5kIHRvIHRoZSB0aHJlYWQgcHJvZmlsZXIKKyAgICAgICAgLy8gICAgICAgICAgICAgIChpdCdzIG5laXRoZXIgYSB0ZXJtaW5hdGluZyBiYXJyaWVyIG5vciBjdXN0b21lcidzIGNvZGUsIGl0J3MgdXNlZCBmb3IgYW4gaW50ZXJuYWwgcHVycG9zZSkKKyNpZiBVU0VfSVRUX05PVElGWQorICAgICAgICBfX2ttcF90aHJlYWRzW2dsb2JhbF90aWRdLT50aC50aF9pZGVudCA9IGxvYzsKKyNlbmRpZgorICAgICAgICByZXR2YWwgPSBfX2ttcF9iYXJyaWVyKCBVTlBBQ0tfUkVEVUNUSU9OX0JBUlJJRVIoIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kICksIGdsb2JhbF90aWQsIEZBTFNFLCByZWR1Y2Vfc2l6ZSwgcmVkdWNlX2RhdGEsIHJlZHVjZV9mdW5jICk7CisgICAgICAgIHJldHZhbCA9ICggcmV0dmFsICE9IDAgKSA/ICggMCApIDogKCAxICk7CisKKyAgICAgICAgLy8gYWxsIG90aGVyIHdvcmtlcnMgZXhjZXB0IG1hc3RlciBzaG91bGQgZG8gdGhpcyBwb3AgaGVyZQorICAgICAgICAvLyAgICAgKCBub25lIG9mIG90aGVyIHdvcmtlcnMgd2lsbCBnZXQgdG8gX19rbXBjX2VuZF9yZWR1Y2Vfbm93YWl0KCkgKQorICAgICAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgICAgIGlmKCByZXR2YWwgPT0gMCApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9wb3Bfc3luYyggZ2xvYmFsX3RpZCwgY3RfcmVkdWNlLCBsb2MgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfSBlbHNlIHsKKworICAgICAgICAvLyBzaG91bGQgbmV2ZXIgcmVhY2ggdGhpcyBibG9jaworICAgICAgICBLTVBfQVNTRVJUKCAwICk7IC8vICJ1bmV4cGVjdGVkIG1ldGhvZCIKKworICAgIH0KKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIGlmKCB0ZWFtc19zd2FwcGVkICkgeworICAgICAgICAvLyBSZXN0b3JlIHRocmVhZCBzdHJ1Y3R1cmUKKyAgICAgICAgdGgtPnRoLnRoX2luZm8uZHMuZHNfdGlkID0gMDsKKyAgICAgICAgdGgtPnRoLnRoX3RlYW0gPSB0ZWFtOworICAgICAgICB0aC0+dGgudGhfdGFza190ZWFtID0gdGVhbS0+dC50X3Rhc2tfdGVhbTsKKyAgICAgICAgdGgtPnRoLnRoX3RlYW1fbnByb2MgPSB0ZWFtLT50LnRfbnByb2M7CisgICAgICAgIHRoLT50aC50aF90YXNrX3N0YXRlID0gdGFza19zdGF0ZTsKKyAgICB9CisjZW5kaWYKKyAgICBLQV9UUkFDRSggMTAsICggIl9fa21wY19yZWR1Y2Vfbm93YWl0KCkgZXhpdDogY2FsbGVkIFQjJWQ6IG1ldGhvZCAlMDh4LCByZXR1cm5zICUwOHhcbiIsIGdsb2JhbF90aWQsIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kLCByZXR2YWwgKSApOworCisgICAgcmV0dXJuIHJldHZhbDsKK30KKworLyohCitAaW5ncm91cCBTWU5DSFJPTklaQVRJT04KK0BwYXJhbSBsb2Mgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uCitAcGFyYW0gZ2xvYmFsX3RpZCBnbG9iYWwgdGhyZWFkIGlkLgorQHBhcmFtIGxjayBwb2ludGVyIHRvIHRoZSB1bmlxdWUgbG9jayBkYXRhIHN0cnVjdHVyZQorCitGaW5pc2ggdGhlIGV4ZWN1dGlvbiBvZiBhIHJlZHVjZSBub3dhaXQuCisqLwordm9pZAorX19rbXBjX2VuZF9yZWR1Y2Vfbm93YWl0KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBfY3JpdGljYWxfbmFtZSAqbGNrICkgeworCisgICAgUEFDS0VEX1JFRFVDVElPTl9NRVRIT0RfVCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZDsKKworICAgIEtBX1RSQUNFKCAxMCwgKCAiX19rbXBjX2VuZF9yZWR1Y2Vfbm93YWl0KCkgZW50ZXI6IGNhbGxlZCBUIyVkXG4iLCBnbG9iYWxfdGlkICkgKTsKKworICAgIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kID0gX19LTVBfR0VUX1JFRFVDVElPTl9NRVRIT0QoIGdsb2JhbF90aWQgKTsKKworICAgIGlmKCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCA9PSBjcml0aWNhbF9yZWR1Y2VfYmxvY2sgKSB7CisKKyAgICAgICAgX19rbXBfZW5kX2NyaXRpY2FsX3NlY3Rpb25fcmVkdWNlX2Jsb2NrKCBsb2MsIGdsb2JhbF90aWQsIGxjayApOworCisgICAgfSBlbHNlIGlmKCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCA9PSBlbXB0eV9yZWR1Y2VfYmxvY2sgKSB7CisKKyAgICAgICAgLy8gdXNhZ2U6IGlmIHRlYW0gc2l6ZSA9PSAxLCBubyBzeW5jaHJvbml6YXRpb24gaXMgcmVxdWlyZWQgKCBvbiBJbnRlbCBwbGF0Zm9ybXMgb25seSApCisKKyAgICB9IGVsc2UgaWYoIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kID09IGF0b21pY19yZWR1Y2VfYmxvY2sgKSB7CisKKyAgICAgICAgLy8gbmVpdGhlciBtYXN0ZXIgbm9yIG90aGVyIHdvcmtlcnMgc2hvdWxkIGdldCBoZXJlCisgICAgICAgIC8vICAgICAoY29kZSBnZW4gZG9lcyBub3QgZ2VuZXJhdGUgdGhpcyBjYWxsIGluIGNhc2UgMjogYXRvbWljIHJlZHVjZSBibG9jaykKKyAgICAgICAgLy8gYWN0dWFsbHkgaXQncyBiZXR0ZXIgdG8gcmVtb3ZlIHRoaXMgZWxzZWlmIGF0IGFsbDsKKyAgICAgICAgLy8gYWZ0ZXIgcmVtb3ZhbCB0aGlzIHZhbHVlIHdpbGwgY2hlY2tlZCBieSB0aGUgJ2Vsc2UnIGFuZCB3aWxsIGFzc2VydAorCisgICAgfSBlbHNlIGlmKCBURVNUX1JFRFVDVElPTl9NRVRIT0QoIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kLCB0cmVlX3JlZHVjZV9ibG9jayApICkgeworCisgICAgICAgIC8vIG9ubHkgbWFzdGVyIGdldHMgaGVyZQorCisgICAgfSBlbHNlIHsKKworICAgICAgICAvLyBzaG91bGQgbmV2ZXIgcmVhY2ggdGhpcyBibG9jaworICAgICAgICBLTVBfQVNTRVJUKCAwICk7IC8vICJ1bmV4cGVjdGVkIG1ldGhvZCIKKworICAgIH0KKworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkKKyAgICAgICAgX19rbXBfcG9wX3N5bmMoIGdsb2JhbF90aWQsIGN0X3JlZHVjZSwgbG9jICk7CisKKyAgICBLQV9UUkFDRSggMTAsICggIl9fa21wY19lbmRfcmVkdWNlX25vd2FpdCgpIGV4aXQ6IGNhbGxlZCBUIyVkOiBtZXRob2QgJTA4eFxuIiwgZ2xvYmFsX3RpZCwgcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgKSApOworCisgICAgcmV0dXJuOworfQorCisvKiAyLmEuaWkuIFJlZHVjZSBCbG9jayB3aXRoIGEgdGVybWluYXRpbmcgYmFycmllciAqLworCisvKiEKK0Bpbmdyb3VwIFNZTkNIUk9OSVpBVElPTgorQHBhcmFtIGxvYyBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24KK0BwYXJhbSBnbG9iYWxfdGlkIGdsb2JhbCB0aHJlYWQgbnVtYmVyCitAcGFyYW0gbnVtX3ZhcnMgbnVtYmVyIG9mIGl0ZW1zICh2YXJpYWJsZXMpIHRvIGJlIHJlZHVjZWQKK0BwYXJhbSByZWR1Y2Vfc2l6ZSBzaXplIG9mIGRhdGEgaW4gYnl0ZXMgdG8gYmUgcmVkdWNlZAorQHBhcmFtIHJlZHVjZV9kYXRhIHBvaW50ZXIgdG8gZGF0YSB0byBiZSByZWR1Y2VkCitAcGFyYW0gcmVkdWNlX2Z1bmMgY2FsbGJhY2sgZnVuY3Rpb24gcHJvdmlkaW5nIHJlZHVjdGlvbiBvcGVyYXRpb24gb24gdHdvIG9wZXJhbmRzIGFuZCByZXR1cm5pbmcgcmVzdWx0IG9mIHJlZHVjdGlvbiBpbiBsaHNfZGF0YQorQHBhcmFtIGxjayBwb2ludGVyIHRvIHRoZSB1bmlxdWUgbG9jayBkYXRhIHN0cnVjdHVyZQorQHJlc3VsdCAxIGZvciB0aGUgbWFzdGVyIHRocmVhZCwgMCBmb3IgYWxsIG90aGVyIHRlYW0gdGhyZWFkcywgMiBmb3IgYWxsIHRlYW0gdGhyZWFkcyBpZiBhdG9taWMgcmVkdWN0aW9uIG5lZWRlZAorCitBIGJsb2NraW5nIHJlZHVjZSB0aGF0IGluY2x1ZGVzIGFuIGltcGxpY2l0IGJhcnJpZXIuCisqLwora21wX2ludDMyCitfX2ttcGNfcmVkdWNlKAorICAgIGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQsCisgICAga21wX2ludDMyIG51bV92YXJzLCBzaXplX3QgcmVkdWNlX3NpemUsIHZvaWQgKnJlZHVjZV9kYXRhLAorICAgIHZvaWQgKCpyZWR1Y2VfZnVuYykodm9pZCAqbGhzX2RhdGEsIHZvaWQgKnJoc19kYXRhKSwKKyAgICBrbXBfY3JpdGljYWxfbmFtZSAqbGNrICkKK3sKKyAgICBLTVBfQ09VTlRfQkxPQ0soUkVEVUNFX3dhaXQpOworICAgIGludCByZXR2YWw7CisgICAgUEFDS0VEX1JFRFVDVElPTl9NRVRIT0RfVCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZDsKKworICAgIEtBX1RSQUNFKCAxMCwgKCAiX19rbXBjX3JlZHVjZSgpIGVudGVyOiBjYWxsZWQgVCMlZFxuIiwgZ2xvYmFsX3RpZCApICk7CisKKyAgICAvLyB3aHkgZG8gd2UgbmVlZCB0aGlzIGluaXRpYWxpemF0aW9uIGhlcmUgYXQgYWxsPworICAgIC8vIFJlZHVjdGlvbiBjbGF1c2UgY2FuIG5vdCBiZSBhIHN0YW5kLWFsb25lIGRpcmVjdGl2ZS4KKworICAgIC8vIGRvIG5vdCBjYWxsIF9fa21wX3NlcmlhbF9pbml0aWFsaXplKCksIGl0IHdpbGwgYmUgY2FsbGVkIGJ5IF9fa21wX3BhcmFsbGVsX2luaXRpYWxpemUoKSBpZiBuZWVkZWQKKyAgICAvLyBwb3NzaWJsZSBkZXRlY3Rpb24gb2YgZmFsc2UtcG9zaXRpdmUgcmFjZSBieSB0aGUgdGhyZWFkY2hlY2tlciA/Pz8KKyAgICBpZiggISBUQ1JfNCggX19rbXBfaW5pdF9wYXJhbGxlbCApICkKKyAgICAgICAgX19rbXBfcGFyYWxsZWxfaW5pdGlhbGl6ZSgpOworCisgICAgLy8gY2hlY2sgY29ycmVjdG5lc3Mgb2YgcmVkdWNlIGJsb2NrIG5lc3RpbmcKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApCisgICAgICAgIF9fa21wX3B1c2hfc3luYyggZ2xvYmFsX3RpZCwgY3RfcmVkdWNlLCBsb2MsIE5VTEwgKTsKKworICAgIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kID0gX19rbXBfZGV0ZXJtaW5lX3JlZHVjdGlvbl9tZXRob2QoIGxvYywgZ2xvYmFsX3RpZCwgbnVtX3ZhcnMsIHJlZHVjZV9zaXplLCByZWR1Y2VfZGF0YSwgcmVkdWNlX2Z1bmMsIGxjayApOworICAgIF9fS01QX1NFVF9SRURVQ1RJT05fTUVUSE9EKCBnbG9iYWxfdGlkLCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCApOworCisgICAgaWYoIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kID09IGNyaXRpY2FsX3JlZHVjZV9ibG9jayApIHsKKworICAgICAgICBfX2ttcF9lbnRlcl9jcml0aWNhbF9zZWN0aW9uX3JlZHVjZV9ibG9jayggbG9jLCBnbG9iYWxfdGlkLCBsY2sgKTsKKyAgICAgICAgcmV0dmFsID0gMTsKKworICAgIH0gZWxzZSBpZiggcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgPT0gZW1wdHlfcmVkdWNlX2Jsb2NrICkgeworCisgICAgICAgIC8vIHVzYWdlOiBpZiB0ZWFtIHNpemUgPT0gMSwgbm8gc3luY2hyb25pemF0aW9uIGlzIHJlcXVpcmVkICggSW50ZWwgcGxhdGZvcm1zIG9ubHkgKQorICAgICAgICByZXR2YWwgPSAxOworCisgICAgfSBlbHNlIGlmKCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCA9PSBhdG9taWNfcmVkdWNlX2Jsb2NrICkgeworCisgICAgICAgIHJldHZhbCA9IDI7CisKKyAgICB9IGVsc2UgaWYoIFRFU1RfUkVEVUNUSU9OX01FVEhPRCggcGFja2VkX3JlZHVjdGlvbl9tZXRob2QsIHRyZWVfcmVkdWNlX2Jsb2NrICkgKSB7CisKKyAgICAgICAgLy9jYXNlIHRyZWVfcmVkdWNlX2Jsb2NrOgorICAgICAgICAvLyB0aGlzIGJhcnJpZXIgc2hvdWxkIGJlIHZpc2libGUgdG8gYSBjdXN0b21lciBhbmQgdG8gdGhlIHRocmVhZCBwcm9maWxlcgorICAgICAgICAvLyAgICAgICAgICAgICAgKGl0J3MgYSB0ZXJtaW5hdGluZyBiYXJyaWVyIG9uIGNvbnN0cnVjdHMgaWYgTk9XQUlUIG5vdCBzcGVjaWZpZWQpCisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICAgICAgX19rbXBfdGhyZWFkc1tnbG9iYWxfdGlkXS0+dGgudGhfaWRlbnQgPSBsb2M7IC8vIG5lZWRlZCBmb3IgY29ycmVjdCBub3RpZmljYXRpb24gb2YgZnJhbWVzCisjZW5kaWYKKyAgICAgICAgcmV0dmFsID0gX19rbXBfYmFycmllciggVU5QQUNLX1JFRFVDVElPTl9CQVJSSUVSKCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCApLCBnbG9iYWxfdGlkLCBUUlVFLCByZWR1Y2Vfc2l6ZSwgcmVkdWNlX2RhdGEsIHJlZHVjZV9mdW5jICk7CisgICAgICAgIHJldHZhbCA9ICggcmV0dmFsICE9IDAgKSA/ICggMCApIDogKCAxICk7CisKKyAgICAgICAgLy8gYWxsIG90aGVyIHdvcmtlcnMgZXhjZXB0IG1hc3RlciBzaG91bGQgZG8gdGhpcyBwb3AgaGVyZQorICAgICAgICAvLyAgICAgKCBub25lIG9mIG90aGVyIHdvcmtlcnMgZXhjZXB0IG1hc3RlciB3aWxsIGVudGVyIF9fa21wY19lbmRfcmVkdWNlKCkgKQorICAgICAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgICAgIGlmKCByZXR2YWwgPT0gMCApIHsgLy8gMDogYWxsIG90aGVyIHdvcmtlcnM7IDE6IG1hc3RlcgorICAgICAgICAgICAgICAgIF9fa21wX3BvcF9zeW5jKCBnbG9iYWxfdGlkLCBjdF9yZWR1Y2UsIGxvYyApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9IGVsc2UgeworCisgICAgICAgIC8vIHNob3VsZCBuZXZlciByZWFjaCB0aGlzIGJsb2NrCisgICAgICAgIEtNUF9BU1NFUlQoIDAgKTsgLy8gInVuZXhwZWN0ZWQgbWV0aG9kIgorCisgICAgfQorCisgICAgS0FfVFJBQ0UoIDEwLCAoICJfX2ttcGNfcmVkdWNlKCkgZXhpdDogY2FsbGVkIFQjJWQ6IG1ldGhvZCAlMDh4LCByZXR1cm5zICUwOHhcbiIsIGdsb2JhbF90aWQsIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kLCByZXR2YWwgKSApOworCisgICAgcmV0dXJuIHJldHZhbDsKK30KKworLyohCitAaW5ncm91cCBTWU5DSFJPTklaQVRJT04KK0BwYXJhbSBsb2Mgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uCitAcGFyYW0gZ2xvYmFsX3RpZCBnbG9iYWwgdGhyZWFkIGlkLgorQHBhcmFtIGxjayBwb2ludGVyIHRvIHRoZSB1bmlxdWUgbG9jayBkYXRhIHN0cnVjdHVyZQorCitGaW5pc2ggdGhlIGV4ZWN1dGlvbiBvZiBhIGJsb2NraW5nIHJlZHVjZS4KK1RoZSA8dHQ+bGNrPC90dD4gcG9pbnRlciBtdXN0IGJlIHRoZSBzYW1lIGFzIHRoYXQgdXNlZCBpbiB0aGUgY29ycmVzcG9uZGluZyBzdGFydCBmdW5jdGlvbi4KKyovCit2b2lkCitfX2ttcGNfZW5kX3JlZHVjZSggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wX2NyaXRpY2FsX25hbWUgKmxjayApIHsKKworICAgIFBBQ0tFRF9SRURVQ1RJT05fTUVUSE9EX1QgcGFja2VkX3JlZHVjdGlvbl9tZXRob2Q7CisKKyAgICBLQV9UUkFDRSggMTAsICggIl9fa21wY19lbmRfcmVkdWNlKCkgZW50ZXI6IGNhbGxlZCBUIyVkXG4iLCBnbG9iYWxfdGlkICkgKTsKKworICAgIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kID0gX19LTVBfR0VUX1JFRFVDVElPTl9NRVRIT0QoIGdsb2JhbF90aWQgKTsKKworICAgIC8vIHRoaXMgYmFycmllciBzaG91bGQgYmUgdmlzaWJsZSB0byBhIGN1c3RvbWVyIGFuZCB0byB0aGUgdGhyZWFkIHByb2ZpbGVyCisgICAgLy8gICAgICAgICAgICAgIChpdCdzIGEgdGVybWluYXRpbmcgYmFycmllciBvbiBjb25zdHJ1Y3RzIGlmIE5PV0FJVCBub3Qgc3BlY2lmaWVkKQorCisgICAgaWYoIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kID09IGNyaXRpY2FsX3JlZHVjZV9ibG9jayApIHsKKworICAgICAgICBfX2ttcF9lbmRfY3JpdGljYWxfc2VjdGlvbl9yZWR1Y2VfYmxvY2soIGxvYywgZ2xvYmFsX3RpZCwgbGNrICk7CisKKyAgICAgICAgLy8gVE9ETzogaW1wbGljaXQgYmFycmllcjogc2hvdWxkIGJlIGV4cG9zZWQKKyNpZiBVU0VfSVRUX05PVElGWQorICAgICAgICBfX2ttcF90aHJlYWRzW2dsb2JhbF90aWRdLT50aC50aF9pZGVudCA9IGxvYzsKKyNlbmRpZgorICAgICAgICBfX2ttcF9iYXJyaWVyKCBic19wbGFpbl9iYXJyaWVyLCBnbG9iYWxfdGlkLCBGQUxTRSwgMCwgTlVMTCwgTlVMTCApOworCisgICAgfSBlbHNlIGlmKCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCA9PSBlbXB0eV9yZWR1Y2VfYmxvY2sgKSB7CisKKyAgICAgICAgLy8gdXNhZ2U6IGlmIHRlYW0gc2l6ZSA9PSAxLCBubyBzeW5jaHJvbml6YXRpb24gaXMgcmVxdWlyZWQgKCBJbnRlbCBwbGF0Zm9ybXMgb25seSApCisKKyAgICAgICAgLy8gVE9ETzogaW1wbGljaXQgYmFycmllcjogc2hvdWxkIGJlIGV4cG9zZWQKKyNpZiBVU0VfSVRUX05PVElGWQorICAgICAgICBfX2ttcF90aHJlYWRzW2dsb2JhbF90aWRdLT50aC50aF9pZGVudCA9IGxvYzsKKyNlbmRpZgorICAgICAgICBfX2ttcF9iYXJyaWVyKCBic19wbGFpbl9iYXJyaWVyLCBnbG9iYWxfdGlkLCBGQUxTRSwgMCwgTlVMTCwgTlVMTCApOworCisgICAgfSBlbHNlIGlmKCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCA9PSBhdG9taWNfcmVkdWNlX2Jsb2NrICkgeworCisgICAgICAgIC8vIFRPRE86IGltcGxpY2l0IGJhcnJpZXI6IHNob3VsZCBiZSBleHBvc2VkCisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICAgICAgX19rbXBfdGhyZWFkc1tnbG9iYWxfdGlkXS0+dGgudGhfaWRlbnQgPSBsb2M7CisjZW5kaWYKKyAgICAgICAgX19rbXBfYmFycmllciggYnNfcGxhaW5fYmFycmllciwgZ2xvYmFsX3RpZCwgRkFMU0UsIDAsIE5VTEwsIE5VTEwgKTsKKworICAgIH0gZWxzZSBpZiggVEVTVF9SRURVQ1RJT05fTUVUSE9EKCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCwgdHJlZV9yZWR1Y2VfYmxvY2sgKSApIHsKKworICAgICAgICAvLyBvbmx5IG1hc3RlciBleGVjdXRlcyBoZXJlIChtYXN0ZXIgcmVsZWFzZXMgYWxsIG90aGVyIHdvcmtlcnMpCisgICAgICAgIF9fa21wX2VuZF9zcGxpdF9iYXJyaWVyKCBVTlBBQ0tfUkVEVUNUSU9OX0JBUlJJRVIoIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kICksIGdsb2JhbF90aWQgKTsKKworICAgIH0gZWxzZSB7CisKKyAgICAgICAgLy8gc2hvdWxkIG5ldmVyIHJlYWNoIHRoaXMgYmxvY2sKKyAgICAgICAgS01QX0FTU0VSVCggMCApOyAvLyAidW5leHBlY3RlZCBtZXRob2QiCisKKyAgICB9CisKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApCisgICAgICAgIF9fa21wX3BvcF9zeW5jKCBnbG9iYWxfdGlkLCBjdF9yZWR1Y2UsIGxvYyApOworCisgICAgS0FfVFJBQ0UoIDEwLCAoICJfX2ttcGNfZW5kX3JlZHVjZSgpIGV4aXQ6IGNhbGxlZCBUIyVkOiBtZXRob2QgJTA4eFxuIiwgZ2xvYmFsX3RpZCwgcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgKSApOworCisgICAgcmV0dXJuOworfQorCisjdW5kZWYgX19LTVBfR0VUX1JFRFVDVElPTl9NRVRIT0QKKyN1bmRlZiBfX0tNUF9TRVRfUkVEVUNUSU9OX01FVEhPRAorCisvKi0tIGVuZCBvZiBpbnRlcmZhY2UgdG8gZmFzdCBzY2FsYWJsZSByZWR1Y2Ugcm91dGluZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwora21wX3VpbnQ2NAorX19rbXBjX2dldF90YXNraWQoKSB7CisKKyAgICBrbXBfaW50MzIgICAgZ3RpZDsKKyAgICBrbXBfaW5mb190ICogdGhyZWFkOworCisgICAgZ3RpZCA9IF9fa21wX2dldF9ndGlkKCk7CisgICAgaWYgKCBndGlkIDwgMCApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfTsgLy8gaWYKKyAgICB0aHJlYWQgPSBfX2ttcF90aHJlYWRfZnJvbV9ndGlkKCBndGlkICk7CisgICAgcmV0dXJuIHRocmVhZC0+dGgudGhfY3VycmVudF90YXNrLT50ZF90YXNrX2lkOworCit9IC8vIF9fa21wY19nZXRfdGFza2lkCisKKwora21wX3VpbnQ2NAorX19rbXBjX2dldF9wYXJlbnRfdGFza2lkKCkgeworCisgICAga21wX2ludDMyICAgICAgICBndGlkOworICAgIGttcF9pbmZvX3QgKiAgICAgdGhyZWFkOworICAgIGttcF90YXNrZGF0YV90ICogcGFyZW50X3Rhc2s7CisKKyAgICBndGlkID0gX19rbXBfZ2V0X2d0aWQoKTsKKyAgICBpZiAoIGd0aWQgPCAwICkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9OyAvLyBpZgorICAgIHRocmVhZCAgICAgID0gX19rbXBfdGhyZWFkX2Zyb21fZ3RpZCggZ3RpZCApOworICAgIHBhcmVudF90YXNrID0gdGhyZWFkLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX3BhcmVudDsKKyAgICByZXR1cm4gKCBwYXJlbnRfdGFzayA9PSBOVUxMID8gMCA6IHBhcmVudF90YXNrLT50ZF90YXNrX2lkICk7CisKK30gLy8gX19rbXBjX2dldF9wYXJlbnRfdGFza2lkCisKK3ZvaWQgX19rbXBjX3BsYWNlX3RocmVhZHMoaW50IG5DLCBpbnQgblQsIGludCBuTykKK3sKKyNpZiBLTVBfTUlDCisgICAgaWYgKCAhIF9fa21wX2luaXRfc2VyaWFsICkgeworICAgICAgICBfX2ttcF9zZXJpYWxfaW5pdGlhbGl6ZSgpOworICAgIH0KKyAgICBfX2ttcF9wbGFjZV9udW1fY29yZXMgPSBuQzsKKyAgICBfX2ttcF9wbGFjZV9udW1fdGhyZWFkc19wZXJfY29yZSA9IG5UOworICAgIF9fa21wX3BsYWNlX2NvcmVfb2Zmc2V0ID0gbk87CisjZW5kaWYKK30KKworLy8gZW5kIG9mIGZpbGUgLy8KKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX2RlYnVnLmMgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfZGVidWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDA0OWQxCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX2RlYnVnLmMKQEAgLTAsMCArMSwxNDQgQEAKKy8qCisgKiBrbXBfZGVidWcuYyAtLSBkZWJ1ZyB1dGlsaXRpZXMgZm9yIHRoZSBHdWlkZSBsaWJyYXJ5CisgKiAkUmV2aXNpb246IDQyOTUxICQKKyAqICREYXRlOiAyMDE0LTAxLTIxIDE0OjQxOjQxIC0wNjAwIChUdWUsIDIxIEphbiAyMDE0KSAkCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJrbXBfZGVidWcuaCIgLyogcmVhbGx5IG5lY2Vzc2FyeT8gKi8KKyNpbmNsdWRlICJrbXBfaTE4bi5oIgorI2luY2x1ZGUgImttcF9pby5oIgorCisjaWZkZWYgS01QX0RFQlVHCit2b2lkCitfX2ttcF9kZWJ1Z19wcmludGZfc3Rkb3V0KCBjaGFyIGNvbnN0ICogZm9ybWF0LCAuLi4gKQoreworICAgIHZhX2xpc3QgYXA7CisgICAgdmFfc3RhcnQoIGFwLCBmb3JtYXQgKTsKKworICAgIF9fa21wX3ZwcmludGYoIGttcF9vdXQsIGZvcm1hdCwgYXAgKTsKKworICAgIHZhX2VuZChhcCk7Cit9CisjZW5kaWYKKwordm9pZAorX19rbXBfZGVidWdfcHJpbnRmKCBjaGFyIGNvbnN0ICogZm9ybWF0LCAuLi4gKQoreworICAgIHZhX2xpc3QgYXA7CisgICAgdmFfc3RhcnQoIGFwLCBmb3JtYXQgKTsKKworICAgIF9fa21wX3ZwcmludGYoIGttcF9lcnIsIGZvcm1hdCwgYXAgKTsKKworICAgIHZhX2VuZCggYXAgKTsKK30KKworI2lmZGVmIEtNUF9VU0VfQVNTRVJUCisgICAgaW50CisgICAgX19rbXBfZGVidWdfYXNzZXJ0KAorICAgICAgICBjaGFyIGNvbnN0ICogIG1zZywKKyAgICAgICAgY2hhciBjb25zdCAqICBmaWxlLAorICAgICAgICBpbnQgICAgICAgICAgIGxpbmUKKyAgICApIHsKKworICAgICAgICBpZiAoIGZpbGUgPT0gTlVMTCApIHsKKyAgICAgICAgICAgIGZpbGUgPSBLTVBfSTE4Tl9TVFIoIFVua25vd25GaWxlICk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBSZW1vdmUgZGlyZWN0b3JpZXMgZnJvbSBwYXRoLCBsZWF2ZSBvbmx5IGZpbGUgbmFtZS4gRmlsZSBuYW1lIGlzIGVub3VnaCwgdGhlcmUgaXMgbm8gbmVlZAorICAgICAgICAgICAgLy8gaW4gYm90aGVyaW5nIGRldmVsb3BlcnMgYW5kIGN1c3RvbWVycyB3aXRoIGZ1bGwgcGF0aHMuCisgICAgICAgICAgICBjaGFyIGNvbnN0ICogc2xhc2ggPSBzdHJyY2hyKCBmaWxlLCAnLycgKTsKKyAgICAgICAgICAgIGlmICggc2xhc2ggIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICBmaWxlID0gc2xhc2ggKyAxOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgfTsgLy8gaWYKKworICAgICAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgICAgICAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmIF9fa21wX3N0ZGlvX2xvY2sgKTsKKyAgICAgICAgICAgIF9fa21wX2RlYnVnX3ByaW50ZiggIkFzc2VydGlvbiBmYWlsdXJlIGF0ICVzKCVkKTogJXMuXG4iLCBmaWxlLCBsaW5lLCBtc2cgKTsKKyAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICYgX19rbXBfc3RkaW9fbG9jayApOworICAgICAgICAgICAgI2lmZGVmIFVTRV9BU1NFUlRfQlJFQUsKKyAgICAgICAgICAgICAgICAjaWYgS01QX09TX1dJTkRPV1MKKyAgICAgICAgICAgICAgICAgICAgRGVidWdCcmVhaygpOworICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgI2VuZGlmIC8vIFVTRV9BU1NFUlRfQlJFQUsKKyAgICAgICAgICAgICNpZmRlZiBVU0VfQVNTRVJUX1NUQUxMCisgICAgICAgICAgICAgICAgLyogICAgX19rbXBfaW5maW5pdGVfbG9vcCgpOyAqLworICAgICAgICAgICAgICAgIGZvcig7Oyk7CisgICAgICAgICAgICAjZW5kaWYgLy8gVVNFX0FTU0VSVF9TVEFMTAorICAgICAgICAgICAgI2lmZGVmIFVTRV9BU1NFUlRfU0VHCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgdm9sYXRpbGUgKiBaRVJPID0gKGludCopIDA7CisgICAgICAgICAgICAgICAgICAgICsrICgqWkVSTyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgI2VuZGlmIC8vIFVTRV9BU1NFUlRfU0VHCisgICAgICAgICNlbmRpZgorCisgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgIEtNUF9NU0coIEFzc2VydGlvbkZhaWx1cmUsIGZpbGUsIGxpbmUgKSwKKyAgICAgICAgICAgIEtNUF9ITlQoIFN1Ym1pdEJ1Z1JlcG9ydCApLAorICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgKTsKKworICAgICAgICByZXR1cm4gMDsKKworICAgIH0gLy8gX19rbXBfZGVidWdfYXNzZXJ0CisKKyNlbmRpZiAvLyBLTVBfVVNFX0FTU0VSVAorCisvKiBEdW1wIGRlYnVnZ2luZyBidWZmZXIgdG8gc3RkZXJyICovCit2b2lkCitfX2ttcF9kdW1wX2RlYnVnX2J1ZmZlciggdm9pZCApCit7CisgICAgaWYgKCBfX2ttcF9kZWJ1Z19idWZmZXIgIT0gTlVMTCApIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGludCBkYyA9IF9fa21wX2RlYnVnX2NvdW50OworICAgICAgICBjaGFyICpkYiA9ICYgX19rbXBfZGVidWdfYnVmZmVyWyAoZGMgJSBfX2ttcF9kZWJ1Z19idWZfbGluZXMpICogX19rbXBfZGVidWdfYnVmX2NoYXJzIF07CisgICAgICAgIGNoYXIgKmRiX2VuZCA9ICYgX19rbXBfZGVidWdfYnVmZmVyWyBfX2ttcF9kZWJ1Z19idWZfbGluZXMgKiBfX2ttcF9kZWJ1Z19idWZfY2hhcnMgXTsKKyAgICAgICAgY2hhciAqZGIyOworCisgICAgICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICYgX19rbXBfc3RkaW9fbG9jayApOworICAgICAgICBfX2ttcF9wcmludGZfbm9fbG9jayggIlxuU3RhcnQgZHVtcCBvZiBkZWJ1Z2dpbmcgYnVmZmVyIChlbnRyeT0lZCk6XG4iLAorICAgICAgICAgICAgICAgICBkYyAlIF9fa21wX2RlYnVnX2J1Zl9saW5lcyApOworCisgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgX19rbXBfZGVidWdfYnVmX2xpbmVzOyBpKysgKSB7CisKKyAgICAgICAgICAgIGlmICggKmRiICE9ICdcMCcgKSB7CisgICAgICAgICAgICAgICAgLyogRml4IHVwIHdoZXJlIG5vIGNhcnJpYWdlIHJldHVybiBiZWZvcmUgc3RyaW5nIHRlcm1pbmF0aW9uIGNoYXIgKi8KKyAgICAgICAgICAgICAgICBmb3IgKCBkYjIgPSBkYiArIDE7IGRiMiA8IGRiICsgX19rbXBfZGVidWdfYnVmX2NoYXJzIC0gMTsgZGIyICsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICggKmRiMiA9PSAnXDAnICkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAqKGRiMi0xKSAhPSAnXG4nICkgeyAqZGIyID0gJ1xuJzsgKihkYjIrMSkgPSAnXDAnOyB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiBIYW5kbGUgY2FzZSBhdCBlbmQgYnkgc2hvcnRlbmluZyB0aGUgcHJpbnRlZCBtZXNzYWdlIGJ5IG9uZSBjaGFyIGlmIG5lY2Vzc2FyeSAqLworICAgICAgICAgICAgICAgIGlmICggZGIyID09IGRiICsgX19rbXBfZGVidWdfYnVmX2NoYXJzIC0gMSAmJgorICAgICAgICAgICAgICAgICAgICAgKmRiMiA9PSAnXDAnICYmICooZGIyLTEpICE9ICdcbicgKSB7CisgICAgICAgICAgICAgICAgICAgICooZGIyLTEpID0gJ1xuJzsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludGZfbm9fbG9jayggIiU0ZDogJS4qcyIsIGksIF9fa21wX2RlYnVnX2J1Zl9jaGFycywgZGIgKTsKKyAgICAgICAgICAgICAgICAqZGIgPSAnXDAnOyAvKiBvbmx5IGxldCBpdCBwcmludCBvbmNlISAqLworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkYiArPSBfX2ttcF9kZWJ1Z19idWZfY2hhcnM7CisgICAgICAgICAgICBpZiAoIGRiID49IGRiX2VuZCApCisgICAgICAgICAgICAgICAgZGIgPSBfX2ttcF9kZWJ1Z19idWZmZXI7CisgICAgICAgIH0KKworICAgICAgICBfX2ttcF9wcmludGZfbm9fbG9jayggIkVuZCBkdW1wIG9mIGRlYnVnZ2luZyBidWZmZXIgKGVudHJ5PSVkKS5cblxuIiwKKyAgICAgICAgICAgICAgICAgKCBkYytpLTEgKSAlIF9fa21wX2RlYnVnX2J1Zl9saW5lcyApOworICAgICAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmIF9fa21wX3N0ZGlvX2xvY2sgKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfZGVidWcuaCBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9kZWJ1Zy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0Mjg4YmYKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfZGVidWcuaApAQCAtMCwwICsxLDEyOSBAQAorLyoKKyAqIGttcF9kZWJ1Zy5oIC0tIGRlYnVnIC8gYXNzZXJ0aW9uIGNvZGUgZm9yIEFzc3VyZSBsaWJyYXJ5CisgKiAkUmV2aXNpb246IDQyOTUxICQKKyAqICREYXRlOiAyMDE0LTAxLTIxIDE0OjQxOjQxIC0wNjAwIChUdWUsIDIxIEphbiAyMDE0KSAkCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgS01QX0RFQlVHX0gKKyNkZWZpbmUgS01QX0RFQlVHX0gKKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgICBleHRlcm4gIkMiIHsKKyNlbmRpZiAvLyBfX2NwbHVzcGx1cworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBCdWlsZC10aW1lIGFzc2VydGlvbi4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLyoKKyAgICBCdWlsZC10aW1lIGFzc2VydGlvbiBjYW4gZG8gY29tcGlsZS10aW1lIGNoZWNraW5nIG9mIGRhdGEgc3RydWN0dXJlIHNpemVzLCBldGMuIFRoaXMgd29ya3MgYnkKKyAgICBkZWNsYXJpbmcgYSBuZWdhdGl2ZS1sZW5ndGggYXJyYXkgaWYgdGhlIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIGZhbHNlLiAgSW4gdGhhdAorICAgIGNhc2UsIHRoZSBjb21waWxlciBpc3N1ZXMgYSBzeW50YXggZXJyb3IgYW5kIHN0b3BzIHRoZSBjb21waWxhdGlvbi4gSWYgdGhlIGV4cHJlc3Npb24gaXMKKyAgICB0cnVlLCB3ZSBnZXQgYW4gZXh0cmFuZW91cyBzdGF0aWMgc2luZ2xlIGNoYXJhY3RlciBhcnJheSBpbiB0aGUgc2NvcGUgb2YgdGhlIG1hY3JvLgorCisgICAgVXNhZ2U6CisKKyAgICAgICAgS01QX0JVSUxEX0FTU0VSVCggc2l6ZW9mKCBzb21lX3QgKSA8PSAzMiApOworICAgICAgICBLTVBfQlVJTERfQVNTRVJUKCBvZmZzZXRvZiggc29tZV90LCBmaWVsZCApICUgOCA9PSAwICk7CisKKyAgICBEbyBub3QgdXNlIF9LTVBfQlVJTERfQVNTRVJUIGFuZCBfX0tNUF9CVUlMRF9BU1NFUlQgZGlyZWN0bHksIGl0IGlzIHdvcmtpbmcgZ3V0cy4KKyovCisKKyNkZWZpbmUgX19LTVBfQlVJTERfQVNTRVJUKCBleHByLCBzdWZmaXggKSAgc3RhdGljIGNoYXIgX19rbXBfYnVpbGRfY2hlY2tfIyNzdWZmaXhbIChleHByKSA/IDEgOiAtMSBdCisjZGVmaW5lIF9LTVBfQlVJTERfQVNTRVJUKCBleHByLCBzdWZmaXggKSAgIF9fS01QX0JVSUxEX0FTU0VSVCggKGV4cHIpLCBzdWZmaXggKQorI2RlZmluZSBLTVBfQlVJTERfQVNTRVJUKCBleHByICkgICAgICAgICAgICBfS01QX0JVSUxEX0FTU0VSVCggKGV4cHIpLCBfX0xJTkVfXyApCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJ1bi10aW1lIGFzc2VydGlvbnMuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2V4dGVybiB2b2lkIF9fa21wX2R1bXBfZGVidWdfYnVmZmVyKCB2b2lkICk7CisKKyNpZmRlZiBLTVBfVVNFX0FTU0VSVAorICAgIGV4dGVybiBpbnQgX19rbXBfZGVidWdfYXNzZXJ0KCBjaGFyIGNvbnN0ICogZXhwciwgY2hhciBjb25zdCAqIGZpbGUsIGludCBsaW5lICk7CisgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAjZGVmaW5lIEtNUF9BU1NFUlQoIGNvbmQgKSAgICAgICAgICAgICAoIChjb25kKSA/IDAgOiBfX2ttcF9kZWJ1Z19hc3NlcnQoICNjb25kLCBfX0ZJTEVfXywgX19MSU5FX18gKSApCisgICAgICAgICNkZWZpbmUgS01QX0FTU0VSVDIoIGNvbmQsIG1zZyApICAgICAgICggKGNvbmQpID8gMCA6IF9fa21wX2RlYnVnX2Fzc2VydCggKG1zZyksIF9fRklMRV9fLCBfX0xJTkVfXyApICkKKyAgICAgICAgI2RlZmluZSBLTVBfREVCVUdfQVNTRVJUKCBjb25kICkgICAgICAgS01QX0FTU0VSVCggY29uZCApCisgICAgICAgICNkZWZpbmUgS01QX0RFQlVHX0FTU0VSVDIoIGNvbmQsIG1zZyApIEtNUF9BU1NFUlQyKCBjb25kLCBtc2cgKQorICAgICNlbHNlCisgICAgICAgIC8vIERvIG5vdCBleHBvc2UgY29uZGl0aW9uIGluIHJlbGVhc2UgYnVpbGQuIFVzZSAiYXNzZXJ0aW9uIGZhaWx1cmUiLgorICAgICAgICAjZGVmaW5lIEtNUF9BU1NFUlQoIGNvbmQgKSAgICAgICAgICAgICAoIChjb25kKSA/IDAgOiBfX2ttcF9kZWJ1Z19hc3NlcnQoICJhc3NlcnRpb24gZmFpbHVyZSIsIF9fRklMRV9fLCBfX0xJTkVfXyApICkKKyAgICAgICAgI2RlZmluZSBLTVBfQVNTRVJUMiggY29uZCwgbXNnICkgICAgICAgS01QX0FTU0VSVCggY29uZCApCisgICAgICAgICNkZWZpbmUgS01QX0RFQlVHX0FTU0VSVCggY29uZCApICAgICAgIDAKKyAgICAgICAgI2RlZmluZSBLTVBfREVCVUdfQVNTRVJUMiggY29uZCwgbXNnICkgMAorICAgICNlbmRpZiAvLyBLTVBfREVCVUcKKyNlbHNlCisgICAgI2RlZmluZSBLTVBfQVNTRVJUKCBjb25kICkgICAgICAgICAgICAgMAorICAgICNkZWZpbmUgS01QX0FTU0VSVDIoIGNvbmQsIG1zZyApICAgICAgIDAKKyAgICAjZGVmaW5lIEtNUF9ERUJVR19BU1NFUlQoIGNvbmQgKSAgICAgICAwCisgICAgI2RlZmluZSBLTVBfREVCVUdfQVNTRVJUMiggY29uZCwgbXNnICkgMAorI2VuZGlmIC8vIEtNUF9VU0VfQVNTRVJUCisKKyNpZmRlZiBLTVBfREVCVUcKKyAgICBleHRlcm4gdm9pZCBfX2ttcF9kZWJ1Z19wcmludGZfc3Rkb3V0KCBjaGFyIGNvbnN0ICogZm9ybWF0LCAuLi4gKTsKKyNlbmRpZgorZXh0ZXJuIHZvaWQgX19rbXBfZGVidWdfcHJpbnRmKCBjaGFyIGNvbnN0ICogZm9ybWF0LCAuLi4gKTsKKworI2lmZGVmIEtNUF9ERUJVRworCisgICAgZXh0ZXJuIGludCBrbXBfYV9kZWJ1ZzsKKyAgICBleHRlcm4gaW50IGttcF9iX2RlYnVnOworICAgIGV4dGVybiBpbnQga21wX2NfZGVidWc7CisgICAgZXh0ZXJuIGludCBrbXBfZF9kZWJ1ZzsKKyAgICBleHRlcm4gaW50IGttcF9lX2RlYnVnOworICAgIGV4dGVybiBpbnQga21wX2ZfZGVidWc7CisgICAgZXh0ZXJuIGludCBrbXBfZGlhZzsKKworICAgICNkZWZpbmUgS0FfVFJBQ0UoZCx4KSAgICAgaWYgKGttcF9hX2RlYnVnID49IGQpIHsgX19rbXBfZGVidWdfcHJpbnRmIHggOyB9CisgICAgI2RlZmluZSBLQl9UUkFDRShkLHgpICAgICBpZiAoa21wX2JfZGVidWcgPj0gZCkgeyBfX2ttcF9kZWJ1Z19wcmludGYgeCA7IH0KKyAgICAjZGVmaW5lIEtDX1RSQUNFKGQseCkgICAgIGlmIChrbXBfY19kZWJ1ZyA+PSBkKSB7IF9fa21wX2RlYnVnX3ByaW50ZiB4IDsgfQorICAgICNkZWZpbmUgS0RfVFJBQ0UoZCx4KSAgICAgaWYgKGttcF9kX2RlYnVnID49IGQpIHsgX19rbXBfZGVidWdfcHJpbnRmIHggOyB9CisgICAgI2RlZmluZSBLRV9UUkFDRShkLHgpICAgICBpZiAoa21wX2VfZGVidWcgPj0gZCkgeyBfX2ttcF9kZWJ1Z19wcmludGYgeCA7IH0KKyAgICAjZGVmaW5lIEtGX1RSQUNFKGQseCkgICAgIGlmIChrbXBfZl9kZWJ1ZyA+PSBkKSB7IF9fa21wX2RlYnVnX3ByaW50ZiB4IDsgfQorICAgICNkZWZpbmUgS19ESUFHKGQseCkgICAgICAge2lmIChrbXBfZGlhZyA9PSBkKSB7IF9fa21wX2RlYnVnX3ByaW50Zl9zdGRvdXQgeCA7IH0gfQorCisgICAgI2RlZmluZSBLQV9EVU1QKGQseCkgICAgIGlmIChrbXBfYV9kZWJ1ZyA+PSBkKSB7IGludCBrczsgX19rbXBfZGlzYWJsZSgma3MpOyAoeCkgOyBfX2ttcF9lbmFibGUoa3MpOyB9CisgICAgI2RlZmluZSBLQl9EVU1QKGQseCkgICAgIGlmIChrbXBfYl9kZWJ1ZyA+PSBkKSB7IGludCBrczsgX19rbXBfZGlzYWJsZSgma3MpOyAoeCkgOyBfX2ttcF9lbmFibGUoa3MpOyB9CisgICAgI2RlZmluZSBLQ19EVU1QKGQseCkgICAgIGlmIChrbXBfY19kZWJ1ZyA+PSBkKSB7IGludCBrczsgX19rbXBfZGlzYWJsZSgma3MpOyAoeCkgOyBfX2ttcF9lbmFibGUoa3MpOyB9CisgICAgI2RlZmluZSBLRF9EVU1QKGQseCkgICAgIGlmIChrbXBfZF9kZWJ1ZyA+PSBkKSB7IGludCBrczsgX19rbXBfZGlzYWJsZSgma3MpOyAoeCkgOyBfX2ttcF9lbmFibGUoa3MpOyB9CisgICAgI2RlZmluZSBLRV9EVU1QKGQseCkgICAgIGlmIChrbXBfZV9kZWJ1ZyA+PSBkKSB7IGludCBrczsgX19rbXBfZGlzYWJsZSgma3MpOyAoeCkgOyBfX2ttcF9lbmFibGUoa3MpOyB9CisgICAgI2RlZmluZSBLRl9EVU1QKGQseCkgICAgIGlmIChrbXBfZl9kZWJ1ZyA+PSBkKSB7IGludCBrczsgX19rbXBfZGlzYWJsZSgma3MpOyAoeCkgOyBfX2ttcF9lbmFibGUoa3MpOyB9CisKKyNlbHNlCisKKyAgICAjZGVmaW5lIEtBX1RSQUNFKGQseCkgICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyAgICAjZGVmaW5lIEtCX1RSQUNFKGQseCkgICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyAgICAjZGVmaW5lIEtDX1RSQUNFKGQseCkgICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyAgICAjZGVmaW5lIEtEX1RSQUNFKGQseCkgICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyAgICAjZGVmaW5lIEtFX1RSQUNFKGQseCkgICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyAgICAjZGVmaW5lIEtGX1RSQUNFKGQseCkgICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyAgICAjZGVmaW5lIEtfRElBRyhkLHgpICAgICAgIHt9Lyogbm90aGluZyB0byBkbyAqLworCisgICAgI2RlZmluZSBLQV9EVU1QKGQseCkgICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyAgICAjZGVmaW5lIEtCX0RVTVAoZCx4KSAgICAgLyogbm90aGluZyB0byBkbyAqLworICAgICNkZWZpbmUgS0NfRFVNUChkLHgpICAgICAvKiBub3RoaW5nIHRvIGRvICovCisgICAgI2RlZmluZSBLRF9EVU1QKGQseCkgICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyAgICAjZGVmaW5lIEtFX0RVTVAoZCx4KSAgICAgLyogbm90aGluZyB0byBkbyAqLworICAgICNkZWZpbmUgS0ZfRFVNUChkLHgpICAgICAvKiBub3RoaW5nIHRvIGRvICovCisKKyNlbmRpZiAvLyBLTVBfREVCVUcKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgICAgfSAvLyBleHRlcm4gIkMiCisjZW5kaWYgLy8gX19jcGx1c3BsdXMKKworI2VuZGlmIC8qIEtNUF9ERUJVR19IICovCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfZGlzcGF0Y2guY3BwIGIvZmluYWwvcnVudGltZS9zcmMva21wX2Rpc3BhdGNoLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzU4ZjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX2Rpc3BhdGNoLmNwcApAQCAtMCwwICsxLDI2MTYgQEAKKy8qCisgKiBrbXBfZGlzcGF0Y2guY3BwOiBkeW5hbWljIHNjaGVkdWxpbmcgLSBpdGVyYXRpb24gaW5pdGlhbGl6YXRpb24gYW5kIGRpc3BhdGNoLgorICogJFJldmlzaW9uOiA0MzQ1NyAkCisgKiAkRGF0ZTogMjAxNC0wOS0xNyAwMzo1NzoyMiAtMDUwMCAoV2VkLCAxNyBTZXAgMjAxNCkgJAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisvKgorICogRHluYW1pYyBzY2hlZHVsaW5nIGluaXRpYWxpemF0aW9uIGFuZCBkaXNwYXRjaC4KKyAqCisgKiBOT1RFOiBfX2ttcF9udGggaXMgYSBjb25zdGFudCBpbnNpZGUgb2YgYW55IGRpc3BhdGNoIGxvb3AsIGhvd2V2ZXIKKyAqICAgICAgIGl0IG1heSBjaGFuZ2UgdmFsdWVzIGJldHdlZW4gcGFyYWxsZWwgcmVnaW9ucy4gIF9fa21wX21heF9udGgKKyAqICAgICAgIGlzIHRoZSBsYXJnZXN0IHZhbHVlIF9fa21wX250aCBtYXkgdGFrZSwgMSBpcyB0aGUgc21hbGxlc3QuCisgKgorICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJrbXBfaTE4bi5oIgorI2luY2x1ZGUgImttcF9pdHQuaCIKKyNpbmNsdWRlICJrbXBfc3RyLmgiCisjaW5jbHVkZSAia21wX2Vycm9yLmgiCisjaW5jbHVkZSAia21wX3N0YXRzLmgiCisjaWYgS01QX09TX1dJTkRPV1MgJiYgS01QX0FSQ0hfWDg2CisgICAgI2luY2x1ZGUgPGZsb2F0Lmg+CisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLy8gdGVtcGxhdGUgZm9yIHR5cGUgbGltaXRzCit0ZW1wbGF0ZTwgdHlwZW5hbWUgVCA+CitzdHJ1Y3QgaV9tYXhtaW4geworICAgIHN0YXRpYyBjb25zdCBUIG14OworICAgIHN0YXRpYyBjb25zdCBUIG1uOworfTsKK3RlbXBsYXRlPD4KK3N0cnVjdCBpX21heG1pbjwgaW50ID4geworICAgIHN0YXRpYyBjb25zdCBpbnQgbXggPSAweDdmZmZmZmZmOworICAgIHN0YXRpYyBjb25zdCBpbnQgbW4gPSAweDgwMDAwMDAwOworfTsKK3RlbXBsYXRlPD4KK3N0cnVjdCBpX21heG1pbjwgdW5zaWduZWQgaW50ID4geworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXggPSAweGZmZmZmZmZmOworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbW4gPSAweDAwMDAwMDAwOworfTsKK3RlbXBsYXRlPD4KK3N0cnVjdCBpX21heG1pbjwgbG9uZyBsb25nID4geworICAgIHN0YXRpYyBjb25zdCBsb25nIGxvbmcgbXggPSAweDdmZmZmZmZmZmZmZmZmZmZMTDsKKyAgICBzdGF0aWMgY29uc3QgbG9uZyBsb25nIG1uID0gMHg4MDAwMDAwMDAwMDAwMDAwTEw7Cit9OwordGVtcGxhdGU8Pgorc3RydWN0IGlfbWF4bWluPCB1bnNpZ25lZCBsb25nIGxvbmcgPiB7CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBteCA9IDB4ZmZmZmZmZmZmZmZmZmZmZkxMOworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgbW4gPSAweDAwMDAwMDAwMDAwMDAwMDBMTDsKK307CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmZGVmIEtNUF9TVEFUSUNfU1RFQUxfRU5BQkxFRAorCisgICAgLy8gcmVwbGFjZXMgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvezMyLDY0fSBzdHJ1Y3R1cmVzIGFuZCBkaXNwYXRjaF9wcml2YXRlX2luZm97MzIsNjR9X3QgdHlwZXMKKyAgICB0ZW1wbGF0ZTwgdHlwZW5hbWUgVCA+CisgICAgc3RydWN0IGRpc3BhdGNoX3ByaXZhdGVfaW5mb1hYX3RlbXBsYXRlIHsKKyAgICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdDwgVCA+Ojp1bnNpZ25lZF90ICBVVDsKKyAgICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdDwgVCA+OjpzaWduZWRfdCAgICBTVDsKKyAgICAgICAgVVQgY291bnQ7ICAgICAgICAgICAgICAgIC8vIHVuc2lnbmVkCisgICAgICAgIFQgIHViOworICAgICAgICAvKiBBZGRpbmcgS01QX0FMSUdOX0NBQ0hFIGhlcmUgZG9lc24ndCBoZWxwIC8gY2FuIGh1cnQgcGVyZm9ybWFuY2UgKi8KKyAgICAgICAgVCAgbGI7CisgICAgICAgIFNUIHN0OyAgICAgICAgICAgICAgICAgICAvLyBzaWduZWQKKyAgICAgICAgVVQgdGM7ICAgICAgICAgICAgICAgICAgIC8vIHVuc2lnbmVkCisgICAgICAgIFQgIHN0YXRpY19zdGVhbF9jb3VudGVyOyAvLyBmb3Igc3RhdGljX3N0ZWFsIG9ubHk7IG1heWJlIGJldHRlciB0byBwdXQgYWZ0ZXIgdWIKKworICAgICAgICAvKiBwYXJtWzEtNF0gYXJlIHVzZWQgaW4gZGlmZmVyZW50IHdheXMgYnkgZGlmZmVyZW50IHNjaGVkdWxpbmcgYWxnb3JpdGhtcyAqLworCisgICAgICAgIC8vIEtNUF9BTElHTiggMzIgKSBlbnN1cmVzICggaWYgdGhlIEtNUF9BTElHTiBtYWNybyBpcyB0dXJuZWQgb24gKQorICAgICAgICAvLyAgICBhKSBwYXJtMyBpcyBwcm9wZXJseSBhbGlnbmVkIGFuZAorICAgICAgICAvLyAgICBiKSBhbGwgcGFybTEtNCBhcmUgaW4gdGhlIHNhbWUgY2FjaGUgbGluZS4KKyAgICAgICAgLy8gQmVjYXVzZSBvZiBwYXJtMS00IGFyZSB1c2VkIHRvZ2V0aGVyLCBwZXJmb3JtYW5jZSBzZWVtcyB0byBiZSBiZXR0ZXIKKyAgICAgICAgLy8gaWYgdGhleSBhcmUgaW4gdGhlIHNhbWUgbGluZSAobm90IG1lYXN1cmVkIHRob3VnaCkuCisKKyAgICAgICAgc3RydWN0IEtNUF9BTElHTiggMzIgKSB7IC8vIGNvbXBpbGVyIGRvZXMgbm90IGFjY2VwdCBzaXplb2YoVCkqNAorICAgICAgICAgICAgVCAgcGFybTE7CisgICAgICAgICAgICBUICBwYXJtMjsKKyAgICAgICAgICAgIFQgIHBhcm0zOworICAgICAgICAgICAgVCAgcGFybTQ7CisgICAgICAgIH07CisKKyAgICAgICAgVVQgb3JkZXJlZF9sb3dlcjsgLy8gdW5zaWduZWQKKyAgICAgICAgVVQgb3JkZXJlZF91cHBlcjsgLy8gdW5zaWduZWQKKyAgICAgICAgI2lmIEtNUF9PU19XSU5ET1dTCisgICAgICAgIFQgIGxhc3RfdXBwZXI7CisgICAgICAgICNlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAqLworICAgIH07CisKKyNlbHNlIC8qIEtNUF9TVEFUSUNfU1RFQUxfRU5BQkxFRCAqLworCisgICAgLy8gcmVwbGFjZXMgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvezMyLDY0fSBzdHJ1Y3R1cmVzIGFuZCBkaXNwYXRjaF9wcml2YXRlX2luZm97MzIsNjR9X3QgdHlwZXMKKyAgICB0ZW1wbGF0ZTwgdHlwZW5hbWUgVCA+CisgICAgc3RydWN0IGRpc3BhdGNoX3ByaXZhdGVfaW5mb1hYX3RlbXBsYXRlIHsKKyAgICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdDwgVCA+Ojp1bnNpZ25lZF90ICBVVDsKKyAgICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdDwgVCA+OjpzaWduZWRfdCAgICBTVDsKKyAgICAgICAgVCAgbGI7CisgICAgICAgIFQgIHViOworICAgICAgICBTVCBzdDsgICAgICAgICAgICAvLyBzaWduZWQKKyAgICAgICAgVVQgdGM7ICAgICAgICAgICAgLy8gdW5zaWduZWQKKworICAgICAgICBUICBwYXJtMTsKKyAgICAgICAgVCAgcGFybTI7CisgICAgICAgIFQgIHBhcm0zOworICAgICAgICBUICBwYXJtNDsKKworICAgICAgICBVVCBjb3VudDsgICAgICAgICAvLyB1bnNpZ25lZAorCisgICAgICAgIFVUIG9yZGVyZWRfbG93ZXI7IC8vIHVuc2lnbmVkCisgICAgICAgIFVUIG9yZGVyZWRfdXBwZXI7IC8vIHVuc2lnbmVkCisgICAgICAgICNpZiBLTVBfT1NfV0lORE9XUworCVQgIGxhc3RfdXBwZXI7CisgICAgICAgICNlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAqLworICAgIH07CisKKyNlbmRpZiAvKiBLTVBfU1RBVElDX1NURUFMX0VOQUJMRUQgKi8KKworLy8gcmVwbGFjZXMgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvIHN0cnVjdHVyZSBhbmQgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3QgdHlwZQordGVtcGxhdGU8IHR5cGVuYW1lIFQgPgorc3RydWN0IEtNUF9BTElHTl9DQUNIRSBkaXNwYXRjaF9wcml2YXRlX2luZm9fdGVtcGxhdGUgeworICAgIC8vIGR1cGxpY2F0ZSBhbGlnbm1lbnQgaGVyZSwgb3RoZXJ3aXNlIHNpemUgb2Ygc3RydWN0dXJlIGlzIG5vdCBjb3JyZWN0IGluIG91ciBjb21waWxlcgorICAgIHVuaW9uIEtNUF9BTElHTl9DQUNIRSBwcml2YXRlX2luZm9fdG1wbCB7CisgICAgICAgIGRpc3BhdGNoX3ByaXZhdGVfaW5mb1hYX3RlbXBsYXRlPCBUID4gcDsKKyAgICAgICAgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvNjRfdCAgICAgICAgICAgICBwNjQ7CisgICAgfSB1OworICAgIGVudW0gc2NoZWRfdHlwZSBzY2hlZHVsZTsgIC8qIHNjaGVkdWxpbmcgYWxnb3JpdGhtICovCisgICAga21wX3VpbnQzMiAgICAgIG9yZGVyZWQ7ICAgLyogb3JkZXJlZCBjbGF1c2Ugc3BlY2lmaWVkICovCisgICAga21wX3VpbnQzMiAgICAgIG9yZGVyZWRfYnVtcGVkOworICAgIGttcF9pbnQzMiAgIG9yZGVyZWRfZHVtbXlbS01QX01BWF9PUkRFUkVELTNdOyAvLyB0byByZXRhaW4gdGhlIHN0cnVjdHVyZSBzaXplIGFmdGVyIG1ha2luZyBvcmRlcgorICAgIGRpc3BhdGNoX3ByaXZhdGVfaW5mbyAqIG5leHQ7IC8qIHN0YWNrIG9mIGJ1ZmZlcnMgZm9yIG5lc3Qgb2Ygc2VyaWFsIHJlZ2lvbnMgKi8KKyAgICBrbXBfdWludDMyICAgICAgbm9tZXJnZTsgICAvKiBkb24ndCBtZXJnZSBpdGVycyBpZiBzZXJpYWxpemVkICovCisgICAga21wX3VpbnQzMiAgICAgIHR5cGVfc2l6ZTsKKyAgICBlbnVtIGNvbnNfdHlwZSAgcHVzaGVkX3dzOworfTsKKworCisvLyByZXBsYWNlcyBkaXNwYXRjaF9zaGFyZWRfaW5mb3szMiw2NH0gc3RydWN0dXJlcyBhbmQgZGlzcGF0Y2hfc2hhcmVkX2luZm97MzIsNjR9X3QgdHlwZXMKK3RlbXBsYXRlPCB0eXBlbmFtZSBVVCA+CitzdHJ1Y3QgZGlzcGF0Y2hfc2hhcmVkX2luZm9YWF90ZW1wbGF0ZSB7CisgICAgLyogY2h1bmsgaW5kZXggdW5kZXIgZHluYW1pYywgbnVtYmVyIG9mIGlkbGUgdGhyZWFkcyB1bmRlciBzdGF0aWMtc3RlYWw7CisgICAgICAgaXRlcmF0aW9uIGluZGV4IG90aGVyd2lzZSAqLworICAgIHZvbGF0aWxlIFVUICAgICBpdGVyYXRpb247CisgICAgdm9sYXRpbGUgVVQgICAgIG51bV9kb25lOworICAgIHZvbGF0aWxlIFVUICAgICBvcmRlcmVkX2l0ZXJhdGlvbjsKKyAgICBVVCAgIG9yZGVyZWRfZHVtbXlbS01QX01BWF9PUkRFUkVELTFdOyAvLyB0byByZXRhaW4gdGhlIHN0cnVjdHVyZSBzaXplIG1ha2luZyBvcmRlcmVkX2l0ZXJhdGlvbiBzY2FsYXIKK307CisKKy8vIHJlcGxhY2VzIGRpc3BhdGNoX3NoYXJlZF9pbmZvIHN0cnVjdHVyZSBhbmQgZGlzcGF0Y2hfc2hhcmVkX2luZm9fdCB0eXBlCit0ZW1wbGF0ZTwgdHlwZW5hbWUgVVQgPgorc3RydWN0IGRpc3BhdGNoX3NoYXJlZF9pbmZvX3RlbXBsYXRlIHsKKyAgICAvLyB3ZSBuZWVkIHVuaW9uIGhlcmUgdG8ga2VlcCB0aGUgc3RydWN0dXJlIHNpemUKKyAgICB1bmlvbiBzaGFyZWRfaW5mb190bXBsIHsKKyAgICAgICAgZGlzcGF0Y2hfc2hhcmVkX2luZm9YWF90ZW1wbGF0ZTwgVVQgPiAgczsKKyAgICAgICAgZGlzcGF0Y2hfc2hhcmVkX2luZm82NF90ICAgICAgICAgICAgICAgczY0OworICAgIH0gdTsKKyAgICB2b2xhdGlsZSBrbXBfdWludDMyICAgICBidWZmZXJfaW5kZXg7Cit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjdW5kZWYgVVNFX1RFU1RfTE9DS1MKKworLy8gdGVzdF90aGVuX2FkZCB0ZW1wbGF0ZSAoZ2VuZXJhbCB0ZW1wbGF0ZSBzaG91bGQgTk9UIGJlIHVzZWQpCit0ZW1wbGF0ZTwgdHlwZW5hbWUgVCA+CitzdGF0aWMgX19mb3JjZWlubGluZSBUCit0ZXN0X3RoZW5fYWRkKCB2b2xhdGlsZSBUICpwLCBUIGQgKSB7IEtNUF9BU1NFUlQoMCk7IH07CisKK3RlbXBsYXRlPD4KK19fZm9yY2VpbmxpbmUga21wX2ludDMyCit0ZXN0X3RoZW5fYWRkPCBrbXBfaW50MzIgPiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgZCApCit7CisgICAga21wX2ludDMyIHI7CisgICAgciA9IEtNUF9URVNUX1RIRU5fQUREMzIoIHAsIGQgKTsKKyAgICByZXR1cm4gcjsKK30KKwordGVtcGxhdGU8PgorX19mb3JjZWlubGluZSBrbXBfaW50NjQKK3Rlc3RfdGhlbl9hZGQ8IGttcF9pbnQ2NCA+KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCBkICkKK3sKKyAgICBrbXBfaW50NjQgcjsKKyAgICByID0gS01QX1RFU1RfVEhFTl9BREQ2NCggcCwgZCApOworICAgIHJldHVybiByOworfQorCisvLyB0ZXN0X3RoZW5faW5jX2FjcSB0ZW1wbGF0ZSAoZ2VuZXJhbCB0ZW1wbGF0ZSBzaG91bGQgTk9UIGJlIHVzZWQpCit0ZW1wbGF0ZTwgdHlwZW5hbWUgVCA+CitzdGF0aWMgX19mb3JjZWlubGluZSBUCit0ZXN0X3RoZW5faW5jX2FjcSggdm9sYXRpbGUgVCAqcCApIHsgS01QX0FTU0VSVCgwKTsgfTsKKwordGVtcGxhdGU8PgorX19mb3JjZWlubGluZSBrbXBfaW50MzIKK3Rlc3RfdGhlbl9pbmNfYWNxPCBrbXBfaW50MzIgPiggdm9sYXRpbGUga21wX2ludDMyICpwICkKK3sKKyAgICBrbXBfaW50MzIgcjsKKyAgICByID0gS01QX1RFU1RfVEhFTl9JTkNfQUNRMzIoIHAgKTsKKyAgICByZXR1cm4gcjsKK30KKwordGVtcGxhdGU8PgorX19mb3JjZWlubGluZSBrbXBfaW50NjQKK3Rlc3RfdGhlbl9pbmNfYWNxPCBrbXBfaW50NjQgPiggdm9sYXRpbGUga21wX2ludDY0ICpwICkKK3sKKyAgICBrbXBfaW50NjQgcjsKKyAgICByID0gS01QX1RFU1RfVEhFTl9JTkNfQUNRNjQoIHAgKTsKKyAgICByZXR1cm4gcjsKK30KKworLy8gdGVzdF90aGVuX2luYyB0ZW1wbGF0ZSAoZ2VuZXJhbCB0ZW1wbGF0ZSBzaG91bGQgTk9UIGJlIHVzZWQpCit0ZW1wbGF0ZTwgdHlwZW5hbWUgVCA+CitzdGF0aWMgX19mb3JjZWlubGluZSBUCit0ZXN0X3RoZW5faW5jKCB2b2xhdGlsZSBUICpwICkgeyBLTVBfQVNTRVJUKDApOyB9OworCit0ZW1wbGF0ZTw+CitfX2ZvcmNlaW5saW5lIGttcF9pbnQzMgordGVzdF90aGVuX2luYzwga21wX2ludDMyID4oIHZvbGF0aWxlIGttcF9pbnQzMiAqcCApCit7CisgICAga21wX2ludDMyIHI7CisgICAgciA9IEtNUF9URVNUX1RIRU5fSU5DMzIoIHAgKTsKKyAgICByZXR1cm4gcjsKK30KKwordGVtcGxhdGU8PgorX19mb3JjZWlubGluZSBrbXBfaW50NjQKK3Rlc3RfdGhlbl9pbmM8IGttcF9pbnQ2NCA+KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAgKQoreworICAgIGttcF9pbnQ2NCByOworICAgIHIgPSBLTVBfVEVTVF9USEVOX0lOQzY0KCBwICk7CisgICAgcmV0dXJuIHI7Cit9CisKKy8vIGNvbXBhcmVfYW5kX3N3YXAgdGVtcGxhdGUgKGdlbmVyYWwgdGVtcGxhdGUgc2hvdWxkIE5PVCBiZSB1c2VkKQordGVtcGxhdGU8IHR5cGVuYW1lIFQgPgorc3RhdGljIF9fZm9yY2VpbmxpbmUga21wX2ludDMyCitjb21wYXJlX2FuZF9zd2FwKCB2b2xhdGlsZSBUICpwLCBUIGMsIFQgcyApIHsgS01QX0FTU0VSVCgwKTsgfTsKKwordGVtcGxhdGU8PgorX19mb3JjZWlubGluZSBrbXBfaW50MzIKK2NvbXBhcmVfYW5kX3N3YXA8IGttcF9pbnQzMiA+KCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiBjLCBrbXBfaW50MzIgcyApCit7CisgICAgcmV0dXJuIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRUwzMiggcCwgYywgcyApOworfQorCit0ZW1wbGF0ZTw+CitfX2ZvcmNlaW5saW5lIGttcF9pbnQzMgorY29tcGFyZV9hbmRfc3dhcDwga21wX2ludDY0ID4oIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IGMsIGttcF9pbnQ2NCBzICkKK3sKKyAgICByZXR1cm4gS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFTDY0KCBwLCBjLCBzICk7Cit9CisKKy8qCisgICAgU3BpbiB3YWl0IGxvb3AgdGhhdCBmaXJzdCBkb2VzIHBhdXNlLCB0aGVuIHlpZWxkLgorICAgIFdhaXRzIHVudGlsIGZ1bmN0aW9uIHJldHVybnMgbm9uLXplcm8gd2hlbiBjYWxsZWQgd2l0aCAqc3Bpbm5lciBhbmQgY2hlY2suCisgICAgRG9lcyBOT1QgcHV0IHRocmVhZHMgdG8gc2xlZXAuCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIEFyZ3VtZW50czoKKyAgICAgICAgb2JqIC0tIGlzIGhpZ2hlci1sZXZlbCBzeW5jaHJvbml6YXRpb24gb2JqZWN0IHRvIHJlcG9ydCB0byBpdHRub3RpZnkuIEl0IGlzIHVzZWQgdG8gcmVwb3J0CisgICAgICAgICAgICBsb2NrcyBjb25zaXN0ZW50bHkuIEZvciBleGFtcGxlLCBpZiBsb2NrIGlzIGFjcXVpcmVkIGltbWVkaWF0ZWx5LCBpdHMgYWRkcmVzcyBpcworICAgICAgICAgICAgcmVwb3J0ZWQgdG8gaXR0bm90aWZ5IHZpYSBLTVBfRlNZTkNfQUNRVUlSRUQoKS4gSG93ZXZlciwgaXQgbG9jayBjYW5ub3QgYmUgYWNxdWlyZWQKKyAgICAgICAgICAgIGltbWVkaWF0ZWx5IGFuZCBsb2NrIHJvdXRpbmUgY2FsbHMgdG8gS01QX1dBSVRfWUlFTEQoKSwgdGhlIGxhdGVyIHNob3VsZCByZXBvcnQgdGhlIHNhbWUKKyAgICAgICAgICAgIGFkZHJlc3MsIG5vdCBhbiBhZGRyZXNzIG9mIGxvdy1sZXZlbCBzcGlubmVyLgorI2VuZGlmIC8vIFVTRV9JVFRfQlVJTEQKKyovCit0ZW1wbGF0ZTwgdHlwZW5hbWUgVVQgPgorLy8gVG9EbzogbWFrZSBpbmxpbmUgZnVuY3Rpb24gKG1vdmUgdG8gaGVhZGVyIGZpbGUgZm9yIGljbCkKK3N0YXRpYyBVVCAgLy8gdW5zaWduZWQgNC0gb3IgOC1ieXRlIHR5cGUKK19fa21wX3dhaXRfeWllbGQoIHZvbGF0aWxlIFVUICogc3Bpbm5lciwKKyAgICAgICAgICAgICAgICAgIFVUICAgICAgICAgICAgY2hlY2tlciwKKyAgICAgICAgICAgICAgICAgIGttcF91aW50MzIgKCogcHJlZCkoIFVULCBVVCApCisgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyh2b2lkICAgICAgICAqIG9iaikgICAgLy8gSGlnaGVyLWxldmVsIHN5bmNocm9uaXphdGlvbiBvYmplY3QsIG9yIE5VTEwuCisgICAgICAgICAgICAgICAgICApCit7CisgICAgLy8gbm90ZTogd2UgbWF5IG5vdCBiZWxvbmcgdG8gYSB0ZWFtIGF0IHRoaXMgcG9pbnQKKyAgICByZWdpc3RlciB2b2xhdGlsZSBVVCAgICAgICAgICogc3BpbiAgICAgICAgICA9IHNwaW5uZXI7CisgICAgcmVnaXN0ZXIgICAgICAgICAgVVQgICAgICAgICAgIGNoZWNrICAgICAgICAgPSBjaGVja2VyOworICAgIHJlZ2lzdGVyICAgICAgICAgIGttcF91aW50MzIgICBzcGluczsKKyAgICByZWdpc3RlciAgICAgICAgICBrbXBfdWludDMyICgqZikgKCBVVCwgVVQgKSA9IHByZWQ7CisgICAgcmVnaXN0ZXIgICAgICAgICAgVVQgICAgICAgICAgIHI7CisKKyAgICBLTVBfRlNZTkNfU1BJTl9JTklUKCBvYmosICh2b2lkKikgc3BpbiApOworICAgIEtNUF9JTklUX1lJRUxEKCBzcGlucyApOworICAgIC8vIG1haW4gd2FpdCBzcGluIGxvb3AKKyAgICB3aGlsZSghZihyID0gKnNwaW4sIGNoZWNrKSkKKyAgICB7CisgICAgICAgIEtNUF9GU1lOQ19TUElOX1BSRVBBUkUoIG9iaiApOworICAgICAgICAvKiBHRUggLSByZW1vdmUgdGhpcyBzaW5jZSBpdCB3YXMgYWNjaWRlbnRhbGx5IGludHJvZHVjZWQgd2hlbiBrbXBfd2FpdCB3YXMgc3BsaXQuCisgICAgICAgICAgIEl0IGNhdXNlcyBwcm9ibGVtcyB3aXRoIGluZmluaXRlIHJlY3Vyc2lvbiBiZWNhdXNlIG9mIGV4aXQgbG9jayAqLworICAgICAgICAvKiBpZiAoIFRDUl80KF9fa21wX2dsb2JhbC5nLmdfZG9uZSkgJiYgX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCkKKyAgICAgICAgICAgIF9fa21wX2Fib3J0X3RocmVhZCgpOyAqLworCisgICAgICAgIC8vIGlmIHdlIGFyZSBvdmVyc3Vic2NyaWJlZCwKKyAgICAgICAgLy8gb3IgaGF2ZSB3YWl0ZWQgYSBiaXQgKGFuZCBLTVBfTElCUkFSWT10aHJvdWdocHV0LCB0aGVuIHlpZWxkCisgICAgICAgIC8vIHBhdXNlIGlzIGluIHRoZSBmb2xsb3dpbmcgY29kZQorICAgICAgICBLTVBfWUlFTEQoIFRDUl80KF9fa21wX250aCkgPiBfX2ttcF9hdmFpbF9wcm9jICk7CisgICAgICAgIEtNUF9ZSUVMRF9TUElOKCBzcGlucyApOworICAgIH0KKyAgICBLTVBfRlNZTkNfU1BJTl9BQ1FVSVJFRCggb2JqICk7CisgICAgcmV0dXJuIHI7Cit9CisKK3RlbXBsYXRlPCB0eXBlbmFtZSBVVCA+CitzdGF0aWMga21wX3VpbnQzMiBfX2ttcF9lcSggVVQgdmFsdWUsIFVUIGNoZWNrZXIpIHsKKyAgICByZXR1cm4gdmFsdWUgPT0gY2hlY2tlcjsKK30KKwordGVtcGxhdGU8IHR5cGVuYW1lIFVUID4KK3N0YXRpYyBrbXBfdWludDMyIF9fa21wX25lcSggVVQgdmFsdWUsIFVUIGNoZWNrZXIpIHsKKyAgICByZXR1cm4gdmFsdWUgIT0gY2hlY2tlcjsKK30KKwordGVtcGxhdGU8IHR5cGVuYW1lIFVUID4KK3N0YXRpYyBrbXBfdWludDMyIF9fa21wX2x0KCBVVCB2YWx1ZSwgVVQgY2hlY2tlcikgeworICAgIHJldHVybiB2YWx1ZSA8IGNoZWNrZXI7Cit9CisKK3RlbXBsYXRlPCB0eXBlbmFtZSBVVCA+CitzdGF0aWMga21wX3VpbnQzMiBfX2ttcF9nZSggVVQgdmFsdWUsIFVUIGNoZWNrZXIpIHsKKyAgICByZXR1cm4gdmFsdWUgPj0gY2hlY2tlcjsKK30KKwordGVtcGxhdGU8IHR5cGVuYW1lIFVUID4KK3N0YXRpYyBrbXBfdWludDMyIF9fa21wX2xlKCBVVCB2YWx1ZSwgVVQgY2hlY2tlcikgeworICAgIHJldHVybiB2YWx1ZSA8PSBjaGVja2VyOworfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkCitfX2ttcF9kaXNwYXRjaF9kZW9fZXJyb3IoIGludCAqZ3RpZF9yZWYsIGludCAqY2lkX3JlZiwgaWRlbnRfdCAqbG9jX3JlZiApCit7CisgICAga21wX2luZm9fdCAqdGg7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBndGlkX3JlZiApOworCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIHRoID0gX19rbXBfdGhyZWFkc1sqZ3RpZF9yZWZdOworICAgICAgICBpZiAoIHRoIC0+IHRoLnRoX3Jvb3QgLT4gci5yX2FjdGl2ZQorICAgICAgICAgICYmICggdGggLT4gdGgudGhfZGlzcGF0Y2ggLT4gdGhfZGlzcGF0Y2hfcHJfY3VycmVudCAtPiBwdXNoZWRfd3MgIT0gY3Rfbm9uZSApICkgeworICAgICAgICAgICAgX19rbXBfcHVzaF9zeW5jKCAqZ3RpZF9yZWYsIGN0X29yZGVyZWRfaW5fcGRvLCBsb2NfcmVmLCBOVUxMICk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3RlbXBsYXRlPCB0eXBlbmFtZSBVVCA+CitzdGF0aWMgdm9pZAorX19rbXBfZGlzcGF0Y2hfZGVvKCBpbnQgKmd0aWRfcmVmLCBpbnQgKmNpZF9yZWYsIGlkZW50X3QgKmxvY19yZWYgKQoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3Q8IFVUID46OnNpZ25lZF90ICAgIFNUOworICAgIGRpc3BhdGNoX3ByaXZhdGVfaW5mb190ZW1wbGF0ZTwgVVQgPiAqIHByOworCisgICAgaW50IGd0aWQgPSAqZ3RpZF9yZWY7CisvLyAgICBpbnQgIGNpZCA9ICpjaWRfcmVmOworICAgIGttcF9pbmZvX3QgKnRoID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRoIC0+IHRoLnRoX2Rpc3BhdGNoICk7CisKKyAgICBLRF9UUkFDRSgxMDAsICgiX19rbXBfZGlzcGF0Y2hfZGVvOiBUIyVkIGNhbGxlZFxuIiwgZ3RpZCApICk7CisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIHByID0gcmVpbnRlcnByZXRfY2FzdDwgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3RlbXBsYXRlPCBVVCA+KiA+CisgICAgICAgICAgICAoIHRoIC0+IHRoLnRoX2Rpc3BhdGNoIC0+IHRoX2Rpc3BhdGNoX3ByX2N1cnJlbnQgKTsKKyAgICAgICAgaWYgKCBwciAtPiBwdXNoZWRfd3MgIT0gY3Rfbm9uZSApIHsKKyAgICAgICAgICAgIF9fa21wX3B1c2hfc3luYyggZ3RpZCwgY3Rfb3JkZXJlZF9pbl9wZG8sIGxvY19yZWYsIE5VTEwgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICggISB0aCAtPiB0aC50aF90ZWFtIC0+IHQudF9zZXJpYWxpemVkICkgeworICAgICAgICBkaXNwYXRjaF9zaGFyZWRfaW5mb190ZW1wbGF0ZTwgVVQgPiAgKiBzaCA9IHJlaW50ZXJwcmV0X2Nhc3Q8IGRpc3BhdGNoX3NoYXJlZF9pbmZvX3RlbXBsYXRlPCBVVCA+KiA+CisgICAgICAgICAgICAoIHRoIC0+IHRoLnRoX2Rpc3BhdGNoIC0+IHRoX2Rpc3BhdGNoX3NoX2N1cnJlbnQgKTsKKyAgICAgICAgVVQgIGxvd2VyOworCisgICAgICAgIGlmICggISBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgICAgICAgICAgcHIgPSByZWludGVycHJldF9jYXN0PCBkaXNwYXRjaF9wcml2YXRlX2luZm9fdGVtcGxhdGU8IFVUID4qID4KKyAgICAgICAgICAgICAgICAgICAgKCB0aCAtPiB0aC50aF9kaXNwYXRjaCAtPiB0aF9kaXNwYXRjaF9wcl9jdXJyZW50ICk7CisgICAgICAgIH0KKyAgICAgICAgbG93ZXIgPSBwci0+dS5wLm9yZGVyZWRfbG93ZXI7CisKKyAgICAgICAgI2lmICEgZGVmaW5lZCggS01QX0dPTVBfQ09NUEFUICkKKyAgICAgICAgICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICAgICAgICAgIGlmICggcHItPm9yZGVyZWRfYnVtcGVkICkgeworICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY29uc19oZWFkZXIgKnAgPSBfX2ttcF90aHJlYWRzWyBndGlkIF0tPnRoLnRoX2NvbnM7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX2Vycm9yX2NvbnN0cnVjdDIoCisgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaTE4bl9tc2dfQ25zTXVsdGlwbGVOZXN0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgY3Rfb3JkZXJlZF9pbl9wZG8sIGxvY19yZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAmIHAtPnN0YWNrX2RhdGFbIHAtPndfdG9wIF0KKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICNlbmRpZiAvKiAhZGVmaW5lZChLTVBfR09NUF9DT01QQVQpICovCisKKyAgICAgICAgS01QX01CKCk7CisgICAgICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgY2hhciAqIGJ1ZmY7CisgICAgICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KAorICAgICAgICAgICAgICAgICJfX2ttcF9kaXNwYXRjaF9kZW86IFQjJSVkIGJlZm9yZSB3YWl0OiBvcmRlcmVkX2l0ZXI6JSUlcyBsb3dlcjolJSVzXG4iLAorICAgICAgICAgICAgICAgIHRyYWl0c190PCBVVCA+OjpzcGVjLCB0cmFpdHNfdDwgVVQgPjo6c3BlYyApOworICAgICAgICAgICAgS0RfVFJBQ0UoMTAwMCwgKCBidWZmLCBndGlkLCBzaC0+dS5zLm9yZGVyZWRfaXRlcmF0aW9uLCBsb3dlciApICk7CisgICAgICAgICAgICBfX2ttcF9zdHJfZnJlZSggJmJ1ZmYgKTsKKyAgICAgICAgfQorICAgICAgICAjZW5kaWYKKworICAgICAgICBfX2ttcF93YWl0X3lpZWxkPCBVVCA+KCAmc2gtPnUucy5vcmRlcmVkX2l0ZXJhdGlvbiwgbG93ZXIsIF9fa21wX2dlPCBVVCA+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKCBOVUxMICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgS01QX01CKCk7ICAvKiBpcyB0aGlzIG5lY2Vzc2FyeT8gKi8KKyAgICAgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBjaGFyICogYnVmZjsKKyAgICAgICAgICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgICAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoCisgICAgICAgICAgICAgICAgIl9fa21wX2Rpc3BhdGNoX2RlbzogVCMlJWQgYWZ0ZXIgd2FpdDogb3JkZXJlZF9pdGVyOiUlJXMgbG93ZXI6JSUlc1xuIiwKKyAgICAgICAgICAgICAgICB0cmFpdHNfdDwgVVQgPjo6c3BlYywgdHJhaXRzX3Q8IFVUID46OnNwZWMgKTsKKyAgICAgICAgICAgIEtEX1RSQUNFKDEwMDAsICggYnVmZiwgZ3RpZCwgc2gtPnUucy5vcmRlcmVkX2l0ZXJhdGlvbiwgbG93ZXIgKSApOworICAgICAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgICAgIH0KKyAgICAgICAgI2VuZGlmCisgICAgfQorICAgIEtEX1RSQUNFKDEwMCwgKCJfX2ttcF9kaXNwYXRjaF9kZW86IFQjJWQgcmV0dXJuZWRcbiIsIGd0aWQgKSApOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfZGlzcGF0Y2hfZHhvX2Vycm9yKCBpbnQgKmd0aWRfcmVmLCBpbnQgKmNpZF9yZWYsIGlkZW50X3QgKmxvY19yZWYgKQoreworICAgIGttcF9pbmZvX3QgKnRoOworCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIHRoID0gX19rbXBfdGhyZWFkc1sqZ3RpZF9yZWZdOworICAgICAgICBpZiAoIHRoIC0+IHRoLnRoX2Rpc3BhdGNoIC0+IHRoX2Rpc3BhdGNoX3ByX2N1cnJlbnQgLT4gcHVzaGVkX3dzICE9IGN0X25vbmUgKSB7CisgICAgICAgICAgICBfX2ttcF9wb3Bfc3luYyggKmd0aWRfcmVmLCBjdF9vcmRlcmVkX2luX3BkbywgbG9jX3JlZiApOworICAgICAgICB9CisgICAgfQorfQorCit0ZW1wbGF0ZTwgdHlwZW5hbWUgVVQgPgorc3RhdGljIHZvaWQKK19fa21wX2Rpc3BhdGNoX2R4byggaW50ICpndGlkX3JlZiwgaW50ICpjaWRfcmVmLCBpZGVudF90ICpsb2NfcmVmICkKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190PCBVVCA+OjpzaWduZWRfdCAgICBTVDsKKyAgICBkaXNwYXRjaF9wcml2YXRlX2luZm9fdGVtcGxhdGU8IFVUID4gKiBwcjsKKworICAgIGludCBndGlkID0gKmd0aWRfcmVmOworLy8gICAgaW50ICBjaWQgPSAqY2lkX3JlZjsKKyAgICBrbXBfaW5mb190ICp0aCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aCAtPiB0aC50aF9kaXNwYXRjaCApOworCisgICAgS0RfVFJBQ0UoMTAwLCAoIl9fa21wX2Rpc3BhdGNoX2R4bzogVCMlZCBjYWxsZWRcbiIsIGd0aWQgKSApOworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBwciA9IHJlaW50ZXJwcmV0X2Nhc3Q8IGRpc3BhdGNoX3ByaXZhdGVfaW5mb190ZW1wbGF0ZTwgVVQgPiogPgorICAgICAgICAgICAgKCB0aCAtPiB0aC50aF9kaXNwYXRjaCAtPiB0aF9kaXNwYXRjaF9wcl9jdXJyZW50ICk7CisgICAgICAgIGlmICggcHIgLT4gcHVzaGVkX3dzICE9IGN0X25vbmUgKSB7CisgICAgICAgICAgICBfX2ttcF9wb3Bfc3luYyggZ3RpZCwgY3Rfb3JkZXJlZF9pbl9wZG8sIGxvY19yZWYgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICggISB0aCAtPiB0aC50aF90ZWFtIC0+IHQudF9zZXJpYWxpemVkICkgeworICAgICAgICBkaXNwYXRjaF9zaGFyZWRfaW5mb190ZW1wbGF0ZTwgVVQgPiAgKiBzaCA9IHJlaW50ZXJwcmV0X2Nhc3Q8IGRpc3BhdGNoX3NoYXJlZF9pbmZvX3RlbXBsYXRlPCBVVCA+KiA+CisgICAgICAgICAgICAoIHRoIC0+IHRoLnRoX2Rpc3BhdGNoIC0+IHRoX2Rpc3BhdGNoX3NoX2N1cnJlbnQgKTsKKworICAgICAgICBpZiAoICEgX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICAgICAgcHIgPSByZWludGVycHJldF9jYXN0PCBkaXNwYXRjaF9wcml2YXRlX2luZm9fdGVtcGxhdGU8IFVUID4qID4KKyAgICAgICAgICAgICAgICAoIHRoIC0+IHRoLnRoX2Rpc3BhdGNoIC0+IHRoX2Rpc3BhdGNoX3ByX2N1cnJlbnQgKTsKKyAgICAgICAgfQorCisgICAgICAgIEtNUF9GU1lOQ19SRUxFQVNJTkcoICYgc2gtPnUucy5vcmRlcmVkX2l0ZXJhdGlvbiApOworICAgICAgICAjaWYgISBkZWZpbmVkKCBLTVBfR09NUF9DT01QQVQgKQorICAgICAgICAgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgICAgICAgICAgaWYgKCBwci0+b3JkZXJlZF9idW1wZWQgIT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgc3RydWN0IGNvbnNfaGVhZGVyICpwID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdLT50aC50aF9jb25zOworICAgICAgICAgICAgICAgICAgICAvKiBIb3cgdG8gdGVzdCBpdD8gLSBPTSAqLworICAgICAgICAgICAgICAgICAgICBfX2ttcF9lcnJvcl9jb25zdHJ1Y3QyKAorICAgICAgICAgICAgICAgICAgICAgICAga21wX2kxOG5fbXNnX0Nuc011bHRpcGxlTmVzdGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIGN0X29yZGVyZWRfaW5fcGRvLCBsb2NfcmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgJiBwLT5zdGFja19kYXRhWyBwLT53X3RvcCBdCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAjZW5kaWYgLyogIWRlZmluZWQoS01QX0dPTVBfQ09NUEFUKSAqLworCisgICAgICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgICAgIHByLT5vcmRlcmVkX2J1bXBlZCArPSAxOworCisgICAgICAgIEtEX1RSQUNFKDEwMDAsICgiX19rbXBfZGlzcGF0Y2hfZHhvOiBUIyVkIGJ1bXBpbmcgb3JkZXJlZCBvcmRlcmVkX2J1bXBlZD0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHByLT5vcmRlcmVkX2J1bXBlZCApICk7CisKKyAgICAgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICAgICAgLyogVE9ETyB1c2UgZ2VuZXJhbCByZWxlYXNlIHByb2NlZHVyZT8gKi8KKyAgICAgICAgdGVzdF90aGVuX2luYzwgU1QgPiggKHZvbGF0aWxlIFNUICopICYgc2gtPnUucy5vcmRlcmVkX2l0ZXJhdGlvbiApOworCisgICAgICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworICAgIH0KKyAgICBLRF9UUkFDRSgxMDAsICgiX19rbXBfZGlzcGF0Y2hfZHhvOiBUIyVkIHJldHVybmVkXG4iLCBndGlkICkgKTsKK30KKworLyogQ29tcHV0ZXMgYW5kIHJldHVybnMgeCB0byB0aGUgcG93ZXIgb2YgeSwgd2hlcmUgeSBtdXN0IGEgbm9uLW5lZ2F0aXZlIGludGVnZXIgKi8KK3RlbXBsYXRlPCB0eXBlbmFtZSBVVCA+CitzdGF0aWMgX19mb3JjZWlubGluZSBsb25nIGRvdWJsZQorX19rbXBfcG93KGxvbmcgZG91YmxlIHgsIFVUIHkpIHsKKyAgICBsb25nIGRvdWJsZSBzPTEuMEw7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKHggPiAwLjAgJiYgeCA8IDEuMCk7CisgICAgLy9LTVBfREVCVUdfQVNTRVJUKHkgPj0gMCk7IC8vIHkgaXMgdW5zaWduZWQKKyAgICB3aGlsZSh5KSB7CisgICAgICAgIGlmICggeSAmIDEgKQorICAgICAgICAgICAgcyAqPSB4OworICAgICAgICB4ICo9IHg7CisgICAgICAgIHkgPj49IDE7CisgICAgfQorICAgIHJldHVybiBzOworfQorCisvKiBDb21wdXRlcyBhbmQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHVuYXNzaWduZWQgaXRlcmF0aW9ucyBhZnRlciBpZHggY2h1bmtzIGhhdmUgYmVlbiBhc3NpZ25lZAorICAgKHRoZSB0b3RhbCBudW1iZXIgb2YgdW5hc3NpZ25lZCBpdGVyYXRpb25zIGluIGNodW5rcyB3aXRoIGluZGV4IGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBpZHgpLgorICAgX19mb3JjZWlubGluZSBzZWVtcyB0byBiZSBicm9rZW4gc28gdGhhdCBpZiB3ZSBfX2ZvcmNlaW5saW5lIHRoaXMgZnVuY3Rpb24sIHRoZSBiZWhhdmlvciBpcyB3cm9uZworICAgKG9uZSBvZiB0aGUgdW5pdCB0ZXN0cywgc2NoX2d1aWRlZF9hbmFseXRpY2FsX2Jhc2ljLmNwcCwgZmFpbHMpCisqLwordGVtcGxhdGU8IHR5cGVuYW1lIFQgPgorc3RhdGljIF9faW5saW5lIHR5cGVuYW1lIHRyYWl0c190PCBUID46OnVuc2lnbmVkX3QKK19fa21wX2Rpc3BhdGNoX2d1aWRlZF9yZW1haW5pbmcoCisgICAgVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YywKKyAgICB0eXBlbmFtZSB0cmFpdHNfdDwgVCA+OjpmbG9hdGluZ190IGJhc2UsCisgICAgdHlwZW5hbWUgdHJhaXRzX3Q8IFQgPjo6dW5zaWduZWRfdCBpZHgKKykgeworICAgIC8qIE5vdGU6IE9uIFdpbmRvd3MqIE9TIG9uIElBLTMyIGFyY2hpdGVjdHVyZSBhbmQgSW50ZWwoUikgNjQsIGF0CisgICAgICAgbGVhc3QgZm9yIElDTCA4LjEsIGxvbmcgZG91YmxlIGFyaXRobWV0aWMgbWF5IG5vdCByZWFsbHkgaGF2ZQorICAgICAgIGxvbmcgZG91YmxlIHByZWNpc2lvbiwgZXZlbiB3aXRoIC9RbG9uZ19kb3VibGUuICBDdXJyZW50bHksIHdlCisgICAgICAgd29ya2Fyb3VuZCB0aGF0IGluIHRoZSBjYWxsZXIgY29kZSwgYnkgbWFuaXB1bGF0aW5nIHRoZSBGUENXIGZvcgorICAgICAgIFdpbmRvd3MqIE9TIG9uIElBLTMyIGFyY2hpdGVjdHVyZS4gIFRoZSBsYWNrIG9mIHByZWNpc2lvbiBpcyBub3QKKyAgICAgICBleHBlY3RlZCB0byBiZSBhIGNvcnJlY3RuZXNzIGlzc3VlLCB0aG91Z2guCisgICAgKi8KKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190PCBUID46OnVuc2lnbmVkX3QgIFVUOworCisgICAgbG9uZyBkb3VibGUgeCA9IHRjICogX19rbXBfcG93PCBVVCA+KGJhc2UsIGlkeCk7CisgICAgVVQgciA9IChVVCkgeDsKKyAgICBpZiAoIHggPT0gciApCisgICAgICAgIHJldHVybiByOworICAgIHJldHVybiByICsgMTsKK30KKworLy8gUGFyYW1ldGVycyBvZiB0aGUgZ3VpZGVkLWl0ZXJhdGl2ZSBhbGdvcml0aG06CisvLyAgIHAyID0gbiAqIG5wcm9jICogKCBjaHVuayArIDEgKSAgLy8gcG9pbnQgb2Ygc3dpdGNoaW5nIHRvIGR5bmFtaWMKKy8vICAgcDMgPSAxIC8gKCBuICogbnByb2MgKSAgICAgICAgICAvLyByZW1haW5pbmcgaXRlcmF0aW9ucyBtdWx0aXBsaWVyCisvLyBieSBkZWZhdWx0IG4gPSAyLiBGb3IgZXhhbXBsZSB3aXRoIG4gPSAzIHRoZSBjaHVua3MgZGlzdHJpYnV0aW9uIHdpbGwgYmUgbW9yZSBmbGF0LgorLy8gV2l0aCBuID0gMSBmaXJzdCBjaHVuayBpcyB0aGUgc2FtZSBhcyBmb3Igc3RhdGljIHNjaGVkdWxlLCBlLmcuIHRyaXAgLyBucHJvYy4KK3N0YXRpYyBpbnQgZ3VpZGVkX2ludF9wYXJhbSA9IDI7CitzdGF0aWMgZG91YmxlIGd1aWRlZF9mbHRfcGFyYW0gPSAwLjU7Ly8gPSAxLjAgLyBndWlkZWRfaW50X3BhcmFtOworCisvLyBVVCAtIHVuc2lnbmVkIGZsYXZvciBvZiBULCBTVCAtIHNpZ25lZCBmbGF2b3Igb2YgVCwKKy8vIERCTCAtIGRvdWJsZSBpZiBzaXplb2YoVCk9PTQsIG9yIGxvbmcgZG91YmxlIGlmIHNpemVvZihUKT09OAordGVtcGxhdGU8IHR5cGVuYW1lIFQgPgorc3RhdGljIHZvaWQKK19fa21wX2Rpc3BhdGNoX2luaXQoCisgICAgaWRlbnRfdCAgICAgICAgICAgICAgICAgICAgICAgICogbG9jLAorICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsCisgICAgZW51bSBzY2hlZF90eXBlICAgICAgICAgICAgICAgICAgc2NoZWR1bGUsCisgICAgVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGIsCisgICAgVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWIsCisgICAgdHlwZW5hbWUgdHJhaXRzX3Q8IFQgPjo6c2lnbmVkX3Qgc3QsCisgICAgdHlwZW5hbWUgdHJhaXRzX3Q8IFQgPjo6c2lnbmVkX3QgY2h1bmssCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaF93cworKSB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdDwgVCA+Ojp1bnNpZ25lZF90ICBVVDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190PCBUID46OnNpZ25lZF90ICAgIFNUOworICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3Q8IFQgPjo6ZmxvYXRpbmdfdCAgREJMOworICAgIHN0YXRpYyBjb25zdCBpbnQgX19fa21wX3NpemVfdHlwZSA9IHNpemVvZiggVVQgKTsKKworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlOworICAgIFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGM7CisgICAga21wX2luZm9fdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aDsKKyAgICBrbXBfdGVhbV90ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYW07CisgICAga21wX3VpbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteV9idWZmZXJfaW5kZXg7CisgICAgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3RlbXBsYXRlPCBUID4gICAgICAgICAgKiBwcjsKKyAgICBkaXNwYXRjaF9zaGFyZWRfaW5mb190ZW1wbGF0ZTwgVVQgPiB2b2xhdGlsZSAqIHNoOworCisgICAgS01QX0JVSUxEX0FTU0VSVCggc2l6ZW9mKCBkaXNwYXRjaF9wcml2YXRlX2luZm9fdGVtcGxhdGU8IFQgPiApID09IHNpemVvZiggZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvICkgKTsKKyAgICBLTVBfQlVJTERfQVNTRVJUKCBzaXplb2YoIGRpc3BhdGNoX3NoYXJlZF9pbmZvX3RlbXBsYXRlPCBVVCA+ICkgPT0gc2l6ZW9mKCBkaXNwYXRjaF9zaGFyZWRfaW5mbyApICk7CisKKyAgICBpZiAoICEgVENSXzQoIF9fa21wX2luaXRfcGFyYWxsZWwgKSApCisgICAgICAgIF9fa21wX3BhcmFsbGVsX2luaXRpYWxpemUoKTsKKworI2lmIElOQ0xVREVfU1NDX01BUktTCisgICAgU1NDX01BUktfRElTUEFUQ0hfSU5JVCgpOworI2VuZGlmCisgICAgI2lmZGVmIEtNUF9ERUJVRworICAgIHsKKyAgICAgICAgY29uc3QgY2hhciAqIGJ1ZmY7CisgICAgICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgKKyAgICAgICAgICAgICJfX2ttcF9kaXNwYXRjaF9pbml0OiBUIyUlZCBjYWxsZWQ6IHNjaGVkdWxlOiUlZCBjaHVuazolJSVzIGxiOiUlJXMgdWI6JSUlcyBzdDolJSVzXG4iLAorICAgICAgICAgICAgdHJhaXRzX3Q8IFNUID46OnNwZWMsIHRyYWl0c190PCBUID46OnNwZWMsIHRyYWl0c190PCBUID46OnNwZWMsIHRyYWl0c190PCBTVCA+OjpzcGVjICk7CisgICAgICAgIEtEX1RSQUNFKDEwLCAoIGJ1ZmYsIGd0aWQsIHNjaGVkdWxlLCBjaHVuaywgbGIsIHViLCBzdCApICk7CisgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgIH0KKyAgICAjZW5kaWYKKyAgICAvKiBzZXR1cCBkYXRhICovCisgICAgdGggICAgID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworICAgIHRlYW0gICA9IHRoIC0+IHRoLnRoX3RlYW07CisgICAgYWN0aXZlID0gISB0ZWFtIC0+IHQudF9zZXJpYWxpemVkOworICAgIHRoLT50aC50aF9pZGVudCA9IGxvYzsKKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBrbXBfdWludDY0IGN1cl9jaHVuayA9IGNodW5rOworI2VuZGlmCisgICAgaWYgKCAhIGFjdGl2ZSApIHsKKyAgICAgICAgcHIgPSByZWludGVycHJldF9jYXN0PCBkaXNwYXRjaF9wcml2YXRlX2luZm9fdGVtcGxhdGU8IFQgPiogPgorICAgICAgICAgICAgKCB0aCAtPiB0aC50aF9kaXNwYXRjaCAtPiB0aF9kaXNwX2J1ZmZlciApOyAvKiB0b3Agb2YgdGhlIHN0YWNrICovCisgICAgfSBlbHNlIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGgtPnRoLnRoX2Rpc3BhdGNoID09CisgICAgICAgICAgICAgICAgJnRoLT50aC50aF90ZWFtLT50LnRfZGlzcGF0Y2hbdGgtPnRoLnRoX2luZm8uZHMuZHNfdGlkXSApOworCisgICAgICAgIG15X2J1ZmZlcl9pbmRleCA9IHRoLT50aC50aF9kaXNwYXRjaC0+dGhfZGlzcF9pbmRleCArKzsKKworICAgICAgICAvKiBXaGF0IGhhcHBlbnMgd2hlbiBudW1iZXIgb2YgdGhyZWFkcyBjaGFuZ2VzLCBuZWVkIHRvIHJlc2l6ZSBidWZmZXI/ICovCisgICAgICAgIHByID0gcmVpbnRlcnByZXRfY2FzdDwgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3RlbXBsYXRlPCBUID4gICogPgorICAgICAgICAgICAgKCAmdGggLT4gdGgudGhfZGlzcGF0Y2ggLT4gdGhfZGlzcF9idWZmZXJbIG15X2J1ZmZlcl9pbmRleCAlIEtNUF9NQVhfRElTUF9CVUYgXSApOworICAgICAgICBzaCA9IHJlaW50ZXJwcmV0X2Nhc3Q8IGRpc3BhdGNoX3NoYXJlZF9pbmZvX3RlbXBsYXRlPCBVVCA+IHZvbGF0aWxlICogPgorICAgICAgICAgICAgKCAmdGVhbSAtPiB0LnRfZGlzcF9idWZmZXJbIG15X2J1ZmZlcl9pbmRleCAlIEtNUF9NQVhfRElTUF9CVUYgXSApOworICAgIH0KKworICAgIC8qIFBpY2sgdXAgdGhlIG5vbWVyZ2Uvb3JkZXJlZCBiaXRzIGZyb20gdGhlIHNjaGVkdWxpbmcgdHlwZSAqLworICAgIGlmICggKHNjaGVkdWxlID49IGttcF9ubV9sb3dlcikgJiYgKHNjaGVkdWxlIDwga21wX25tX3VwcGVyKSApIHsKKyAgICAgICAgcHItPm5vbWVyZ2UgPSBUUlVFOworICAgICAgICBzY2hlZHVsZSA9IChlbnVtIHNjaGVkX3R5cGUpKCgoaW50KXNjaGVkdWxlKSAtIChrbXBfbm1fbG93ZXIgLSBrbXBfc2NoX2xvd2VyKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHItPm5vbWVyZ2UgPSBGQUxTRTsKKyAgICB9CisgICAgcHItPnR5cGVfc2l6ZSA9IF9fX2ttcF9zaXplX3R5cGU7IC8vIHJlbWVtYmVyIHRoZSBzaXplIG9mIHZhcmlhYmxlcworICAgIGlmICgga21wX29yZF9sb3dlciAmIHNjaGVkdWxlICkgeworICAgICAgICBwci0+b3JkZXJlZCA9IFRSVUU7CisgICAgICAgIHNjaGVkdWxlID0gKGVudW0gc2NoZWRfdHlwZSkoKChpbnQpc2NoZWR1bGUpIC0gKGttcF9vcmRfbG93ZXIgLSBrbXBfc2NoX2xvd2VyKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHItPm9yZGVyZWQgPSBGQUxTRTsKKyAgICB9CisgICAgaWYgKCBzY2hlZHVsZSA9PSBrbXBfc2NoX3N0YXRpYyApIHsKKyAgICAgICAgc2NoZWR1bGUgPSBfX2ttcF9zdGF0aWM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCBzY2hlZHVsZSA9PSBrbXBfc2NoX3J1bnRpbWUgKSB7CisgICAgICAgICAgICAvLyBVc2UgdGhlIHNjaGVkdWxpbmcgc3BlY2lmaWVkIGJ5IE9NUF9TQ0hFRFVMRSAob3IgX19rbXBfc2NoX2RlZmF1bHQgaWYgbm90IHNwZWNpZmllZCkKKyAgICAgICAgICAgIHNjaGVkdWxlID0gdGVhbSAtPiB0LnRfc2NoZWQucl9zY2hlZF90eXBlOworICAgICAgICAgICAgLy8gRGV0YWlsIHRoZSBzY2hlZHVsZSBpZiBuZWVkZWQgKGdsb2JhbCBjb250cm9scyBhcmUgZGlmZmVyZW50aWF0ZWQgYXBwcm9wcmlhdGVseSkKKyAgICAgICAgICAgIGlmICggc2NoZWR1bGUgPT0ga21wX3NjaF9ndWlkZWRfY2h1bmtlZCApIHsKKyAgICAgICAgICAgICAgICBzY2hlZHVsZSA9IF9fa21wX2d1aWRlZDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIHNjaGVkdWxlID09IGttcF9zY2hfc3RhdGljICkgeworICAgICAgICAgICAgICAgIHNjaGVkdWxlID0gX19rbXBfc3RhdGljOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gVXNlIHRoZSBjaHVuayBzaXplIHNwZWNpZmllZCBieSBPTVBfU0NIRURVTEUgKG9yIGRlZmF1bHQgaWYgbm90IHNwZWNpZmllZCkKKyAgICAgICAgICAgIGNodW5rID0gdGVhbSAtPiB0LnRfc2NoZWQuY2h1bms7CisKKyAgICAgICAgICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogYnVmZjsKKyAgICAgICAgICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgIl9fa21wX2Rpc3BhdGNoX2luaXQ6IFQjJSVkIG5ldzogc2NoZWR1bGU6JSVkIGNodW5rOiUlJXNcbiIsCisgICAgICAgICAgICAgICAgICAgIHRyYWl0c190PCBTVCA+OjpzcGVjICk7CisgICAgICAgICAgICAgICAgS0RfVFJBQ0UoMTAsICggYnVmZiwgZ3RpZCwgc2NoZWR1bGUsIGNodW5rICkgKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfZnJlZSggJmJ1ZmYgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICNlbmRpZgorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCBzY2hlZHVsZSA9PSBrbXBfc2NoX2d1aWRlZF9jaHVua2VkICkgeworICAgICAgICAgICAgICAgIHNjaGVkdWxlID0gX19rbXBfZ3VpZGVkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBjaHVuayA8PSAwICkgeworICAgICAgICAgICAgICAgIGNodW5rID0gS01QX0RFRkFVTFRfQ0hVTks7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIHNjaGVkdWxlID09IGttcF9zY2hfYXV0byApIHsKKyAgICAgICAgICAgIC8vIG1hcHBpbmcgYW5kIGRpZmZlcmVudGlhdGlvbjogaW4gdGhlIF9fa21wX2RvX3NlcmlhbF9pbml0aWFsaXplKCkKKyAgICAgICAgICAgIHNjaGVkdWxlID0gX19rbXBfYXV0bzsKKyAgICAgICAgICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogYnVmZjsKKyAgICAgICAgICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgIl9fa21wX2Rpc3BhdGNoX2luaXQ6IGttcF9zY2hfYXV0bzogVCMlJWQgbmV3OiBzY2hlZHVsZTolJWQgY2h1bms6JSUlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3Q8IFNUID46OnNwZWMgKTsKKyAgICAgICAgICAgICAgICBLRF9UUkFDRSgxMCwgKCBidWZmLCBndGlkLCBzY2hlZHVsZSwgY2h1bmsgKSApOworICAgICAgICAgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgI2VuZGlmCisgICAgICAgIH0KKworICAgICAgICAvKiBndWlkZWQgYW5hbHl0aWNhbCBub3Qgc2FmZSBmb3IgdG9vIG1hbnkgdGhyZWFkcyAqLworICAgICAgICBpZiAoIHRlYW0tPnQudF9ucHJvYyA+IDE8PDIwICYmIHNjaGVkdWxlID09IGttcF9zY2hfZ3VpZGVkX2FuYWx5dGljYWxfY2h1bmtlZCApIHsKKyAgICAgICAgICAgIHNjaGVkdWxlID0ga21wX3NjaF9ndWlkZWRfaXRlcmF0aXZlX2NodW5rZWQ7CisgICAgICAgICAgICBLTVBfV0FSTklORyggRGlzcGF0Y2hNYW55VGhyZWFkcyApOworICAgICAgICB9CisgICAgICAgIHByLT51LnAucGFybTEgPSBjaHVuazsKKyAgICB9CisgICAgS01QX0FTU0VSVDIoIChrbXBfc2NoX2xvd2VyIDwgc2NoZWR1bGUgJiYgc2NoZWR1bGUgPCBrbXBfc2NoX3VwcGVyKSwKKyAgICAgICAgICAgICAgICAidW5rbm93biBzY2hlZHVsaW5nIHR5cGUiICk7CisKKyAgICBwci0+dS5wLmNvdW50ID0gMDsKKworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBpZiAoIHN0ID09IDAgKSB7CisgICAgICAgICAgICBfX2ttcF9lcnJvcl9jb25zdHJ1Y3QoCisgICAgICAgICAgICAgICAga21wX2kxOG5fbXNnX0Nuc0xvb3BJbmNyWmVyb1Byb2hpYml0ZWQsCisgICAgICAgICAgICAgICAgKCBwci0+b3JkZXJlZCA/IGN0X3Bkb19vcmRlcmVkIDogY3RfcGRvICksIGxvYworICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHRjID0gKCB1YiAtIGxiICsgc3QgKTsKKyAgICBpZiAoIHN0ICE9IDEgKSB7CisgICAgICAgIGlmICggc3QgPCAwICkgeworICAgICAgICAgICAgaWYgKCBsYiA8IHViICkgeworICAgICAgICAgICAgICAgIHRjID0gMDsgICAgICAgICAgICAvLyB6ZXJvLXRyaXAKKyAgICAgICAgICAgIH0gZWxzZSB7ICAgLy8gbGIgPj0gdWIKKyAgICAgICAgICAgICAgICB0YyA9IChTVCl0YyAvIHN0OyAgLy8gY29udmVydCB0byBzaWduZWQgZGl2aXNpb24KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsgICAgICAgLy8gc3QgPiAwCisgICAgICAgICAgICBpZiAoIHViIDwgbGIgKSB7CisgICAgICAgICAgICAgICAgdGMgPSAwOyAgICAgICAgICAgIC8vIHplcm8tdHJpcAorICAgICAgICAgICAgfSBlbHNlIHsgICAvLyBsYiA+PSB1YgorICAgICAgICAgICAgICAgIHRjIC89IHN0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIGlmICggdWIgPCBsYiApIHsgICAgICAgIC8vIHN0ID09IDEKKyAgICAgICAgdGMgPSAwOyAgICAgICAgICAgICAgICAgICAgLy8gemVyby10cmlwCisgICAgfQorCisgICAgcHItPnUucC5sYiA9IGxiOworICAgIHByLT51LnAudWIgPSB1YjsKKyAgICBwci0+dS5wLnN0ID0gc3Q7CisgICAgcHItPnUucC50YyA9IHRjOworCisgICAgI2lmIEtNUF9PU19XSU5ET1dTCisgICAgcHItPnUucC5sYXN0X3VwcGVyID0gdWIgKyBzdDsKKyAgICAjZW5kaWYgLyogS01QX09TX1dJTkRPV1MgKi8KKworICAgIC8qIE5PVEU6IG9ubHkgdGhlIGFjdGl2ZSBwYXJhbGxlbCByZWdpb24ocykgaGFzIGFjdGl2ZSBvcmRlcmVkIHNlY3Rpb25zICovCisKKyAgICBpZiAoIGFjdGl2ZSApIHsKKyAgICAgICAgaWYgKCBwci0+b3JkZXJlZCA9PSAwICkgeworICAgICAgICAgICAgdGggLT4gdGgudGhfZGlzcGF0Y2ggLT4gdGhfZGVvX2ZjbiA9IF9fa21wX2Rpc3BhdGNoX2Rlb19lcnJvcjsKKyAgICAgICAgICAgIHRoIC0+IHRoLnRoX2Rpc3BhdGNoIC0+IHRoX2R4b19mY24gPSBfX2ttcF9kaXNwYXRjaF9keG9fZXJyb3I7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwci0+b3JkZXJlZF9idW1wZWQgPSAwOworCisgICAgICAgICAgICBwci0+dS5wLm9yZGVyZWRfbG93ZXIgPSAxOworICAgICAgICAgICAgcHItPnUucC5vcmRlcmVkX3VwcGVyID0gMDsKKworICAgICAgICAgICAgdGggLT4gdGgudGhfZGlzcGF0Y2ggLT4gdGhfZGVvX2ZjbiA9IF9fa21wX2Rpc3BhdGNoX2RlbzwgVVQgPjsKKyAgICAgICAgICAgIHRoIC0+IHRoLnRoX2Rpc3BhdGNoIC0+IHRoX2R4b19mY24gPSBfX2ttcF9kaXNwYXRjaF9keG88IFVUID47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgZW51bSBjb25zX3R5cGUgd3MgPSBwci0+b3JkZXJlZCA/IGN0X3Bkb19vcmRlcmVkIDogY3RfcGRvOworICAgICAgICBpZiAoIHB1c2hfd3MgKSB7CisgICAgICAgICAgICBfX2ttcF9wdXNoX3dvcmtzaGFyZSggZ3RpZCwgd3MsIGxvYyApOworICAgICAgICAgICAgcHItPnB1c2hlZF93cyA9IHdzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgX19rbXBfY2hlY2tfd29ya3NoYXJlKCBndGlkLCB3cywgbG9jICk7CisgICAgICAgICAgICBwci0+cHVzaGVkX3dzID0gY3Rfbm9uZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN3aXRjaCAoIHNjaGVkdWxlICkgeworICAgICNpZiAgKCBLTVBfU1RBVElDX1NURUFMX0VOQUJMRUQgJiYgS01QX0FSQ0hfWDg2XzY0ICkKKyAgICBjYXNlIGttcF9zY2hfc3RhdGljX3N0ZWFsOgorICAgICAgICB7CisgICAgICAgICAgICBUIG5wcm9jID0gdGVhbS0+dC50X25wcm9jOworICAgICAgICAgICAgVCBudGMsIGluaXQ7CisKKyAgICAgICAgICAgIEtEX1RSQUNFKDEwMCwgKCJfX2ttcF9kaXNwYXRjaF9pbml0OiBUIyVkIGttcF9zY2hfc3RhdGljX3N0ZWFsIGNhc2VcbiIsIGd0aWQgKSApOworCisgICAgICAgICAgICBudGMgPSAodGMgJSBjaHVuayA/IDEgOiAwKSArIHRjIC8gY2h1bms7CisgICAgICAgICAgICBpZiAoIG5wcm9jID4gMSAmJiBudGMgPj0gbnByb2MgKSB7CisgICAgICAgICAgICAgICAgVCBpZCA9IF9fa21wX3RpZF9mcm9tX2d0aWQoZ3RpZCk7CisgICAgICAgICAgICAgICAgVCBzbWFsbF9jaHVuaywgZXh0cmFzOworCisgICAgICAgICAgICAgICAgc21hbGxfY2h1bmsgPSBudGMgLyBucHJvYzsKKyAgICAgICAgICAgICAgICBleHRyYXMgPSBudGMgJSBucHJvYzsKKworICAgICAgICAgICAgICAgIGluaXQgPSBpZCAqIHNtYWxsX2NodW5rICsgKCBpZCA8IGV4dHJhcyA/IGlkIDogZXh0cmFzICk7CisgICAgICAgICAgICAgICAgcHItPnUucC5jb3VudCA9IGluaXQ7CisgICAgICAgICAgICAgICAgcHItPnUucC51YiA9IGluaXQgKyBzbWFsbF9jaHVuayArICggaWQgPCBleHRyYXMgPyAxIDogMCApOworCisgICAgICAgICAgICAgICAgcHItPnUucC5wYXJtMiA9IGxiOworICAgICAgICAgICAgICAgIC8vcHItPnBmaWVsZHMucGFybTMgPSAwOyAvLyBpdCdzIG5vdCB1c2VkIGluIHN0YXRpY19zdGVhbAorICAgICAgICAgICAgICAgIHByLT51LnAucGFybTQgPSBpZDsKKyAgICAgICAgICAgICAgICBwci0+dS5wLnN0ID0gc3Q7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEtEX1RSQUNFKDEwMCwgKCJfX2ttcF9kaXNwYXRjaF9pbml0OiBUIyVkIGZhbGxpbmctdGhyb3VnaCB0byBrbXBfc2NoX3N0YXRpY19iYWxhbmNlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkICkgKTsKKyAgICAgICAgICAgICAgICBzY2hlZHVsZSA9IGttcF9zY2hfc3RhdGljX2JhbGFuY2VkOworICAgICAgICAgICAgICAgIC8qIHRvbyBmZXcgaXRlcmF0aW9uczogZmFsbC10aHJvdWdoIHRvIGttcF9zY2hfc3RhdGljX2JhbGFuY2VkICovCisgICAgICAgICAgICB9IC8vIGlmCisgICAgICAgICAgICAvKiBGQUxMLVRIUk9VR0ggdG8gc3RhdGljIGJhbGFuY2VkICovCisgICAgICAgIH0gLy8gY2FzZQorICAgICNlbmRpZgorICAgIGNhc2Uga21wX3NjaF9zdGF0aWNfYmFsYW5jZWQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIFQgbnByb2MgPSB0ZWFtLT50LnRfbnByb2M7CisgICAgICAgICAgICBUIGluaXQsIGxpbWl0OworCisgICAgICAgICAgICBLRF9UUkFDRSgxMDAsICgiX19rbXBfZGlzcGF0Y2hfaW5pdDogVCMlZCBrbXBfc2NoX3N0YXRpY19iYWxhbmNlZCBjYXNlXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQgKSApOworCisgICAgICAgICAgICBpZiAoIG5wcm9jID4gMSApIHsKKyAgICAgICAgICAgICAgICBUIGlkID0gX19rbXBfdGlkX2Zyb21fZ3RpZChndGlkKTsKKworICAgICAgICAgICAgICAgIGlmICggdGMgPCBucHJvYyApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBpZCA8IHRjICkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5pdCA9IGlkOworICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQgPSBpZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByLT51LnAucGFybTEgPSAoaWQgPT0gdGMgLSAxKTsgIC8qIHBhcm0xIHN0b3JlcyAqcGxhc3RpdGVyICovCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwci0+dS5wLmNvdW50ID0gMTsgIC8qIG1lYW5zIG5vIG1vcmUgY2h1bmtzIHRvIGV4ZWN1dGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHByLT51LnAucGFybTEgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgVCBzbWFsbF9jaHVuayA9IHRjIC8gbnByb2M7CisgICAgICAgICAgICAgICAgICAgIFQgZXh0cmFzID0gdGMgJSBucHJvYzsKKyAgICAgICAgICAgICAgICAgICAgaW5pdCA9IGlkICogc21hbGxfY2h1bmsgKyAoaWQgPCBleHRyYXMgPyBpZCA6IGV4dHJhcyk7CisgICAgICAgICAgICAgICAgICAgIGxpbWl0ID0gaW5pdCArIHNtYWxsX2NodW5rIC0gKGlkIDwgZXh0cmFzID8gMCA6IDEpOworICAgICAgICAgICAgICAgICAgICBwci0+dS5wLnBhcm0xID0gKGlkID09IG5wcm9jIC0gMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoIHRjID4gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgaW5pdCA9IDA7CisgICAgICAgICAgICAgICAgICAgIGxpbWl0ID0gdGMgLSAxOworICAgICAgICAgICAgICAgICAgICBwci0+dS5wLnBhcm0xID0gVFJVRTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyB6ZXJvIHRyaXAgY291bnQKKyAgICAgICAgICAgICAgICAgICAgcHItPnUucC5jb3VudCA9IDE7ICAvKiBtZWFucyBubyBtb3JlIGNodW5rcyB0byBleGVjdXRlICovCisgICAgICAgICAgICAgICAgICAgIHByLT51LnAucGFybTEgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgICAgIC8vIENhbGN1bGF0ZSBjaHVuayBmb3IgbWV0YWRhdGEgcmVwb3J0CisgICAgICAgICAgICBpZiggIF9faXR0X21ldGFkYXRhX2FkZF9wdHIgICYmIF9fa21wX2Zvcmtqb2luX2ZyYW1lc19tb2RlID09IDMgKSB7CisgICAgICAgICAgICAgICAgY3VyX2NodW5rID0gbGltaXQgLSBpbml0ICsgMTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgaWYgKCBzdCA9PSAxICkgeworICAgICAgICAgICAgICAgIHByLT51LnAubGIgPSBsYiArIGluaXQ7CisgICAgICAgICAgICAgICAgcHItPnUucC51YiA9IGxiICsgbGltaXQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFQgdWJfdG1wID0gbGIgKyBsaW1pdCAqIHN0OyAgIC8vIGNhbGN1bGF0ZWQgdXBwZXIgYm91bmQsICJ1YiIgaXMgdXNlci1kZWZpbmVkIHVwcGVyIGJvdW5kCisgICAgICAgICAgICAgICAgcHItPnUucC5sYiA9IGxiICsgaW5pdCAqIHN0OworICAgICAgICAgICAgICAgIC8vIGFkanVzdCB1cHBlciBib3VuZCB0byAidWIiIGlmIG5lZWRlZCwgc28gdGhhdCBNUyBsYXN0cHJpdmF0ZSB3aWxsIG1hdGNoIGl0IGV4YWN0bHkKKyAgICAgICAgICAgICAgICBpZiAoIHN0ID4gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgcHItPnUucC51YiA9ICggdWJfdG1wICsgc3QgPiB1YiA/IHViIDogdWJfdG1wICk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcHItPnUucC51YiA9ICggdWJfdG1wICsgc3QgPCB1YiA/IHViIDogdWJfdG1wICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBwci0+b3JkZXJlZCApIHsKKyAgICAgICAgICAgICAgICBwci0+dS5wLm9yZGVyZWRfbG93ZXIgPSBpbml0OworICAgICAgICAgICAgICAgIHByLT51LnAub3JkZXJlZF91cHBlciA9IGxpbWl0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gLy8gY2FzZQorICAgIGNhc2Uga21wX3NjaF9ndWlkZWRfaXRlcmF0aXZlX2NodW5rZWQgOgorICAgICAgICB7CisgICAgICAgICAgICBUIG5wcm9jID0gdGVhbS0+dC50X25wcm9jOworICAgICAgICAgICAgS0RfVFJBQ0UoMTAwLCgiX19rbXBfZGlzcGF0Y2hfaW5pdDogVCMlZCBrbXBfc2NoX2d1aWRlZF9pdGVyYXRpdmVfY2h1bmtlZCBjYXNlXG4iLGd0aWQpKTsKKworICAgICAgICAgICAgaWYgKCBucHJvYyA+IDEgKSB7CisgICAgICAgICAgICAgICAgaWYgKCAoMkwgKiBjaHVuayArIDEgKSAqIG5wcm9jID49IHRjICkgeworICAgICAgICAgICAgICAgICAgICAvKiBjaHVuayBzaXplIHRvbyBsYXJnZSwgc3dpdGNoIHRvIGR5bmFtaWMgKi8KKyAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGUgPSBrbXBfc2NoX2R5bmFtaWNfY2h1bmtlZDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyB3aGVuIHJlbWFpbmluZyBpdGVycyBiZWNvbWUgbGVzcyB0aGFuIHBhcm0yIC0gc3dpdGNoIHRvIGR5bmFtaWMKKyAgICAgICAgICAgICAgICAgICAgcHItPnUucC5wYXJtMiA9IGd1aWRlZF9pbnRfcGFyYW0gKiBucHJvYyAqICggY2h1bmsgKyAxICk7CisgICAgICAgICAgICAgICAgICAgICooZG91YmxlKikmcHItPnUucC5wYXJtMyA9IGd1aWRlZF9mbHRfcGFyYW0gLyBucHJvYzsgICAvLyBtYXkgb2NjdXB5IHBhcm0zIGFuZCBwYXJtNAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgS0RfVFJBQ0UoMTAwLCgiX19rbXBfZGlzcGF0Y2hfaW5pdDogVCMlZCBmYWxsaW5nLXRocm91Z2ggdG8ga21wX3NjaF9zdGF0aWNfZ3JlZWR5XG4iLGd0aWQpKTsKKyAgICAgICAgICAgICAgICBzY2hlZHVsZSA9IGttcF9zY2hfc3RhdGljX2dyZWVkeTsKKyAgICAgICAgICAgICAgICAvKiB0ZWFtLT50LnRfbnByb2MgPT0gMTogZmFsbC10aHJvdWdoIHRvIGttcF9zY2hfc3RhdGljX2dyZWVkeSAqLworICAgICAgICAgICAgICAgIEtEX1RSQUNFKDEwMCwoIl9fa21wX2Rpc3BhdGNoX2luaXQ6IFQjJWQga21wX3NjaF9zdGF0aWNfZ3JlZWR5IGNhc2VcbiIsZ3RpZCkpOworICAgICAgICAgICAgICAgIHByLT51LnAucGFybTEgPSB0YzsKKyAgICAgICAgICAgIH0gLy8gaWYKKyAgICAgICAgfSAvLyBjYXNlCisgICAgICAgIGJyZWFrOworICAgIGNhc2Uga21wX3NjaF9ndWlkZWRfYW5hbHl0aWNhbF9jaHVua2VkOgorICAgICAgICB7CisgICAgICAgICAgICBUIG5wcm9jID0gdGVhbS0+dC50X25wcm9jOworICAgICAgICAgICAgS0RfVFJBQ0UoMTAwLCAoIl9fa21wX2Rpc3BhdGNoX2luaXQ6IFQjJWQga21wX3NjaF9ndWlkZWRfYW5hbHl0aWNhbF9jaHVua2VkIGNhc2VcbiIsIGd0aWQpKTsKKworICAgICAgICAgICAgaWYgKCBucHJvYyA+IDEgKSB7CisgICAgICAgICAgICAgICAgaWYgKCAoMkwgKiBjaHVuayArIDEgKSAqIG5wcm9jID49IHRjICkgeworICAgICAgICAgICAgICAgICAgICAvKiBjaHVuayBzaXplIHRvbyBsYXJnZSwgc3dpdGNoIHRvIGR5bmFtaWMgKi8KKyAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGUgPSBrbXBfc2NoX2R5bmFtaWNfY2h1bmtlZDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvKiBjb21tb25seSB1c2VkIHRlcm06ICgyIG5wcm9jIC0gMSkvKDIgbnByb2MpICovCisgICAgICAgICAgICAgICAgICAgIERCTCB4OworCisgICAgICAgICAgICAgICAgICAgICNpZiBLTVBfT1NfV0lORE9XUyAmJiBLTVBfQVJDSF9YODYKKyAgICAgICAgICAgICAgICAgICAgLyogTGludXgqIE9TIGFscmVhZHkgaGFzIDY0LWJpdCBjb21wdXRhdGlvbiBieSBkZWZhdWx0IGZvcgorCQkgICAgICAgbG9uZyBkb3VibGUsIGFuZCBvbiBXaW5kb3dzKiBPUyBvbiBJbnRlbChSKSA2NCwKKwkJICAgICAgIC9RbG9uZ19kb3VibGUgZG9lc24ndCB3b3JrLiAgT24gV2luZG93cyogT1MKKwkJICAgICAgIG9uIElBLTMyIGFyY2hpdGVjdHVyZSwgd2UgbmVlZCB0byBzZXQgcHJlY2lzaW9uIHRvCisJCSAgICAgICA2NC1iaXQgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCA1My1iaXQuIEV2ZW4gdGhvdWdoIGxvbmcKKwkJICAgICAgIGRvdWJsZSBkb2Vzbid0IHdvcmsgb24gV2luZG93cyogT1Mgb24gSW50ZWwoUikgNjQsIHRoZQorCQkgICAgICAgcmVzdWx0aW5nIGxhY2sgb2YgcHJlY2lzaW9uIGlzIG5vdCBleHBlY3RlZCB0byBpbXBhY3QKKwkJICAgICAgIHRoZSBjb3JyZWN0bmVzcyBvZiB0aGUgYWxnb3JpdGhtLCBidXQgdGhpcyBoYXMgbm90IGJlZW4KKwkJICAgICAgIG1hdGhlbWF0aWNhbGx5IHByb3Zlbi4KKyAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgLy8gc2F2ZSBvcmlnaW5hbCBGUENXIGFuZCBzZXQgcHJlY2lzaW9uIHRvIDY0LWJpdCwgYXMKKyAgICAgICAgICAgICAgICAgICAgLy8gV2luZG93cyogT1Mgb24gSUEtMzIgYXJjaGl0ZWN0dXJlIGRlZmF1bHRzIHRvIDUzLWJpdAorICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgb2xkRnBjdyA9IF9jb250cm9sODcoMCwwKTsKKyAgICAgICAgICAgICAgICAgICAgX2NvbnRyb2w4NyhfUENfNjQsX01DV19QQyk7IC8vIDAsMHgzMDAwMAorICAgICAgICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgLyogdmFsdWUgdXNlZCBmb3IgY29tcGFyaXNvbiBpbiBzb2x2ZXIgZm9yIGNyb3NzLW92ZXIgcG9pbnQgKi8KKyAgICAgICAgICAgICAgICAgICAgbG9uZyBkb3VibGUgdGFyZ2V0ID0gKChsb25nIGRvdWJsZSljaHVuayAqIDIgKyAxKSAqIG5wcm9jIC8gdGM7CisKKyAgICAgICAgICAgICAgICAgICAgLyogY3Jvc3NvdmVyIHBvaW50LS1jaHVuayBpbmRleGVzIGVxdWFsIHRvIG9yIGdyZWF0ZXIgdGhhbgorCQkgICAgICAgdGhpcyBwb2ludCBzd2l0Y2ggdG8gZHluYW1pYy1zdHlsZSBzY2hlZHVsaW5nICovCisgICAgICAgICAgICAgICAgICAgIFVUICAgY3Jvc3M7CisKKyAgICAgICAgICAgICAgICAgICAgLyogY29tbW9ubHkgdXNlZCB0ZXJtOiAoMiBucHJvYyAtIDEpLygyIG5wcm9jKSAqLworICAgICAgICAgICAgICAgICAgICB4ID0gKGxvbmcgZG91YmxlKTEuMCAtIChsb25nIGRvdWJsZSkwLjUgLyBucHJvYzsKKworICAgICAgICAgICAgICAgICAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgICAgICAgICAgICAgICAgIHsgLy8gdGVzdCBuYXR1cmFsIGFsaWdubWVudAorICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IF90ZXN0X2EgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgYTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlvbiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgYjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJMICBkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgICAgICB9IHQ7CisgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbmF0dXJhbF9hbGlnbm1lbnQgPSAocHRyZGlmZl90KSZ0LmIgLSAocHRyZGlmZl90KSZ0IC0gKHB0cmRpZmZfdCkxOworICAgICAgICAgICAgICAgICAgICAgICAgLy9fX2ttcF93YXJuKCAiICVsbHggJWxseCAlbGxkIiwgKGxvbmcgbG9uZykmdC5kLCAobG9uZyBsb25nKSZ0LCAobG9uZyBsb25nKW5hdHVyYWxfYWxpZ25tZW50ICk7CisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCAoICggKHB0cmRpZmZfdCkmcHItPnUucC5wYXJtMyApICYgKCBuYXR1cmFsX2FsaWdubWVudCApICkgPT0gMCApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICNlbmRpZiAvLyBLTVBfREVCVUcKKworICAgICAgICAgICAgICAgICAgICAvKiBzYXZlIHRoZSB0ZXJtIGluIHRocmVhZCBwcml2YXRlIGRpc3BhdGNoIHN0cnVjdHVyZSAqLworICAgICAgICAgICAgICAgICAgICAqKERCTCopJnByLT51LnAucGFybTMgPSB4OworCisgICAgICAgICAgICAgICAgICAgIC8qIHNvbHZlIGZvciB0aGUgY3Jvc3NvdmVyIHBvaW50IHRvIHRoZSBuZWFyZXN0IGludGVnZXIgaSBmb3Igd2hpY2ggQ19pIDw9IGNodW5rICovCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVUICAgICAgICAgIGxlZnQsIHJpZ2h0LCBtaWQ7CisgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGRvdWJsZSBwOworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBlc3RpbWF0ZSBpbml0aWFsIHVwcGVyIGFuZCBsb3dlciBib3VuZCAqLworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBkb2Vzbid0IG1hdHRlciB3aGF0IHZhbHVlIHJpZ2h0IGlzIGFzIGxvbmcgYXMgaXQgaXMgcG9zaXRpdmUsIGJ1dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgYWZmZWN0cyBwZXJmb3JtYW5jZSBvZiB0aGUgc29sdmVyCisgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQgPSAyMjk7CisgICAgICAgICAgICAgICAgICAgICAgICBwID0gX19rbXBfcG93PCBVVCA+KHgscmlnaHQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwID4gdGFyZ2V0ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRveworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwICo9IHA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0IDw8PSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUocD50YXJnZXQgJiYgcmlnaHQgPCAoMTw8MjcpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gcmlnaHQgPj4gMTsgLyogbG93ZXIgYm91bmQgaXMgcHJldmlvdXMgKGZhaWxlZCkgZXN0aW1hdGUgb2YgdXBwZXIgYm91bmQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJpc2VjdGlvbiByb290LWZpbmRpbmcgbWV0aG9kICovCisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIGxlZnQgKyAxIDwgcmlnaHQgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlkID0gKGxlZnQgKyByaWdodCkgLyAyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggX19rbXBfcG93PCBVVCA+KHgsbWlkKSA+IHRhcmdldCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCA9IG1pZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodCA9IG1pZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IC8vIHdoaWxlCisgICAgICAgICAgICAgICAgICAgICAgICBjcm9zcyA9IHJpZ2h0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8qIGFzc2VydCBzYW5pdHkgb2YgY29tcHV0ZWQgY3Jvc3NvdmVyIHBvaW50ICovCisgICAgICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQoY3Jvc3MgJiYgX19rbXBfcG93PCBVVCA+KHgsIGNyb3NzIC0gMSkgPiB0YXJnZXQgJiYgX19rbXBfcG93PCBVVCA+KHgsIGNyb3NzKSA8PSB0YXJnZXQpOworCisgICAgICAgICAgICAgICAgICAgIC8qIHNhdmUgdGhlIGNyb3Nzb3ZlciBwb2ludCBpbiB0aHJlYWQgcHJpdmF0ZSBkaXNwYXRjaCBzdHJ1Y3R1cmUgKi8KKyAgICAgICAgICAgICAgICAgICAgcHItPnUucC5wYXJtMiA9IGNyb3NzOworCisgICAgICAgICAgICAgICAgICAgIC8vIEM3NTgwMworICAgICAgICAgICAgICAgICAgICAjaWYgKCAoIEtNUF9PU19MSU5VWCB8fCBLTVBfT1NfV0lORE9XUyApICYmIEtNUF9BUkNIX1g4NiApICYmICggISBkZWZpbmVkKCBLTVBfSTggKSApCisgICAgICAgICAgICAgICAgICAgICAgICAjZGVmaW5lIEdVSURFRF9BTkFMWVRJQ0FMX1dPUktBUk9VTkQgKCooIERCTCAqICkmcHItPnUucC5wYXJtMykKKyAgICAgICAgICAgICAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICNkZWZpbmUgR1VJREVEX0FOQUxZVElDQUxfV09SS0FST1VORCAoeCkKKyAgICAgICAgICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIC8qIGR5bmFtaWMtc3R5bGUgc2NoZWR1bGluZyBvZmZzZXQgKi8KKyAgICAgICAgICAgICAgICAgICAgcHItPnUucC5jb3VudCA9IHRjIC0gX19rbXBfZGlzcGF0Y2hfZ3VpZGVkX3JlbWFpbmluZyh0YywgR1VJREVEX0FOQUxZVElDQUxfV09SS0FST1VORCwgY3Jvc3MpIC0gY3Jvc3MgKiBjaHVuazsKKyAgICAgICAgICAgICAgICAgICAgI2lmIEtNUF9PU19XSU5ET1dTICYmIEtNUF9BUkNIX1g4NgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzdG9yZSBGUENXCisgICAgICAgICAgICAgICAgICAgICAgICBfY29udHJvbDg3KG9sZEZwY3csX01DV19QQyk7CisgICAgICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgIH0gLy8gaWYKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgS0RfVFJBQ0UoMTAwLCAoIl9fa21wX2Rpc3BhdGNoX2luaXQ6IFQjJWQgZmFsbGluZy10aHJvdWdoIHRvIGttcF9zY2hfc3RhdGljX2dyZWVkeVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkICkgKTsKKyAgICAgICAgICAgICAgICBzY2hlZHVsZSA9IGttcF9zY2hfc3RhdGljX2dyZWVkeTsKKyAgICAgICAgICAgICAgICAvKiB0ZWFtLT50LnRfbnByb2MgPT0gMTogZmFsbC10aHJvdWdoIHRvIGttcF9zY2hfc3RhdGljX2dyZWVkeSAqLworICAgICAgICAgICAgICAgIHByLT51LnAucGFybTEgPSB0YzsKKyAgICAgICAgICAgIH0gLy8gaWYKKyAgICAgICAgfSAvLyBjYXNlCisgICAgICAgIGJyZWFrOworICAgIGNhc2Uga21wX3NjaF9zdGF0aWNfZ3JlZWR5OgorICAgICAgICBLRF9UUkFDRSgxMDAsKCJfX2ttcF9kaXNwYXRjaF9pbml0OiBUIyVkIGttcF9zY2hfc3RhdGljX2dyZWVkeSBjYXNlXG4iLGd0aWQpKTsKKyAgICAgICAgICAgIHByLT51LnAucGFybTEgPSAoIHRlYW0gLT4gdC50X25wcm9jID4gMSApID8KKyAgICAgICAgICAgICAgICAoIHRjICsgdGVhbS0+dC50X25wcm9jIC0gMSApIC8gdGVhbS0+dC50X25wcm9jIDoKKyAgICAgICAgICAgICAgICB0YzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBrbXBfc2NoX3N0YXRpY19jaHVua2VkIDoKKyAgICBjYXNlIGttcF9zY2hfZHluYW1pY19jaHVua2VkIDoKKyAgICAgICAgS0RfVFJBQ0UoMTAwLCgiX19rbXBfZGlzcGF0Y2hfaW5pdDogVCMlZCBrbXBfc2NoX3N0YXRpY19jaHVua2VkL2ttcF9zY2hfZHluYW1pY19jaHVua2VkIGNhc2VzXG4iLCBndGlkKSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Uga21wX3NjaF90cmFwZXpvaWRhbCA6CisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFRTUzogdHJhcGV6b2lkIHNlbGYtc2NoZWR1bGluZywgbWluaW11bSBjaHVua19zaXplID0gcGFybTEgKi8KKworICAgICAgICAgICAgVCBwYXJtMSwgcGFybTIsIHBhcm0zLCBwYXJtNDsKKyAgICAgICAgICAgIEtEX1RSQUNFKDEwMCwgKCJfX2ttcF9kaXNwYXRjaF9pbml0OiBUIyVkIGttcF9zY2hfdHJhcGV6b2lkYWwgY2FzZVxuIiwgZ3RpZCApICk7CisKKyAgICAgICAgICAgIHBhcm0xID0gY2h1bms7CisKKyAgICAgICAgICAgIC8qIEYgOiBzaXplIG9mIHRoZSBmaXJzdCBjeWNsZSAqLworICAgICAgICAgICAgcGFybTIgPSAoIHRjIC8gKDIgKiB0ZWFtLT50LnRfbnByb2MpICk7CisKKyAgICAgICAgICAgIGlmICggcGFybTIgPCAxICkgeworICAgICAgICAgICAgICAgIHBhcm0yID0gMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogTCA6IHNpemUgb2YgdGhlIGxhc3QgY3ljbGUuICBNYWtlIHN1cmUgdGhlIGxhc3QgY3ljbGUKKyAgICAgICAgICAgICAqICAgICBpcyBub3QgbGFyZ2VyIHRoYW4gdGhlIGZpcnN0IGN5Y2xlLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoIHBhcm0xIDwgMSApIHsKKyAgICAgICAgICAgICAgICBwYXJtMSA9IDE7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCBwYXJtMSA+IHBhcm0yICkgeworICAgICAgICAgICAgICAgIHBhcm0xID0gcGFybTI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIE4gOiBudW1iZXIgb2YgY3ljbGVzICovCisgICAgICAgICAgICBwYXJtMyA9ICggcGFybTIgKyBwYXJtMSApOworICAgICAgICAgICAgcGFybTMgPSAoIDIgKiB0YyArIHBhcm0zIC0gMSkgLyBwYXJtMzsKKworICAgICAgICAgICAgaWYgKCBwYXJtMyA8IDIgKSB7CisgICAgICAgICAgICAgICAgcGFybTMgPSAyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBzaWdtYSA6IGRlY3JlYXNpbmcgaW5jciBvZiB0aGUgdHJhcGV6b2lkICovCisgICAgICAgICAgICBwYXJtNCA9ICggcGFybTMgLSAxICk7CisgICAgICAgICAgICBwYXJtNCA9ICggcGFybTIgLSBwYXJtMSApIC8gcGFybTQ7CisKKyAgICAgICAgICAgIC8vIHBvaW50bGVzcyBjaGVjaywgYmVjYXVzZSBwYXJtNCA+PSAwIGFsd2F5cworICAgICAgICAgICAgLy9pZiAoIHBhcm00IDwgMCApIHsKKyAgICAgICAgICAgIC8vICAgIHBhcm00ID0gMDsKKyAgICAgICAgICAgIC8vfQorCisgICAgICAgICAgICBwci0+dS5wLnBhcm0xID0gcGFybTE7CisgICAgICAgICAgICBwci0+dS5wLnBhcm0yID0gcGFybTI7CisgICAgICAgICAgICBwci0+dS5wLnBhcm0zID0gcGFybTM7CisgICAgICAgICAgICBwci0+dS5wLnBhcm00ID0gcGFybTQ7CisgICAgICAgIH0gLy8gY2FzZQorICAgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2V2ZXJpdHkKKyAgICAgICAgICAgICAgICBLTVBfTVNHKCBVbmtub3duU2NoZWRUeXBlRGV0ZWN0ZWQgKSwgLy8gUHJpbWFyeSBtZXNzYWdlCisgICAgICAgICAgICAgICAgS01QX0hOVCggR2V0TmV3ZXJMaWJyYXJ5ICksICAgICAgICAgIC8vIEhpbnQKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbCAgICAgICAgICAgICAgICAgICAgICAgLy8gVmFyaWFkaWMgYXJndW1lbnQgbGlzdCB0ZXJtaW5hdG9yCisgICAgICAgICAgICApOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0gLy8gc3dpdGNoCisgICAgcHItPnNjaGVkdWxlID0gc2NoZWR1bGU7CisgICAgaWYgKCBhY3RpdmUgKSB7CisgICAgICAgIC8qIFRoZSBuYW1lIG9mIHRoaXMgYnVmZmVyIHNob3VsZCBiZSBteV9idWZmZXJfaW5kZXggd2hlbiBpdCdzIGZyZWUgdG8gdXNlIGl0ICovCisKKyAgICAgICAgS0RfVFJBQ0UoMTAwLCAoIl9fa21wX2Rpc3BhdGNoX2luaXQ6IFQjJWQgYmVmb3JlIHdhaXQ6IG15X2J1ZmZlcl9pbmRleDolZCBzaC0+YnVmZmVyX2luZGV4OiVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgbXlfYnVmZmVyX2luZGV4LCBzaC0+YnVmZmVyX2luZGV4KSApOworICAgICAgICBfX2ttcF93YWl0X3lpZWxkPCBrbXBfdWludDMyID4oICYgc2gtPmJ1ZmZlcl9pbmRleCwgbXlfYnVmZmVyX2luZGV4LCBfX2ttcF9lcTwga21wX3VpbnQzMiA+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoIE5VTEwgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAvLyBOb3RlOiBLTVBfV0FJVF9ZSUVMRCgpIGNhbm5vdCBiZSB1c2VkIHRoZXJlOiBidWZmZXIgaW5kZXggYW5kIG15X2J1ZmZlcl9pbmRleCBhcmUKKyAgICAgICAgICAgIC8vICphbHdheXMqIDMyLWJpdCBpbnRlZ2Vycy4KKyAgICAgICAgS01QX01CKCk7ICAvKiBpcyB0aGlzIG5lY2Vzc2FyeT8gKi8KKyAgICAgICAgS0RfVFJBQ0UoMTAwLCAoIl9fa21wX2Rpc3BhdGNoX2luaXQ6IFQjJWQgYWZ0ZXIgd2FpdDogbXlfYnVmZmVyX2luZGV4OiVkIHNoLT5idWZmZXJfaW5kZXg6JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCBteV9idWZmZXJfaW5kZXgsIHNoLT5idWZmZXJfaW5kZXgpICk7CisKKyAgICAgICAgdGggLT4gdGgudGhfZGlzcGF0Y2ggLT4gdGhfZGlzcGF0Y2hfcHJfY3VycmVudCA9IChkaXNwYXRjaF9wcml2YXRlX2luZm9fdCopIHByOworICAgICAgICB0aCAtPiB0aC50aF9kaXNwYXRjaCAtPiB0aF9kaXNwYXRjaF9zaF9jdXJyZW50ID0gKGRpc3BhdGNoX3NoYXJlZF9pbmZvX3QqKSAgc2g7CisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICBpZiAoIHByLT5vcmRlcmVkICkgeworICAgICAgICAgICAgX19rbXBfaXR0X29yZGVyZWRfaW5pdCggZ3RpZCApOworICAgICAgICB9OyAvLyBpZgorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICB9OyAvLyBpZgorCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIC8vIFJlcG9ydCBsb29wIG1ldGFkYXRhCisgICAgaWYoIF9faXR0X21ldGFkYXRhX2FkZF9wdHIgICYmIF9fa21wX2Zvcmtqb2luX2ZyYW1lc19tb2RlID09IDMgKSB7CisgICAgICAgIGttcF91aW50MzIgdGlkICA9IF9fa21wX3RpZF9mcm9tX2d0aWQoIGd0aWQgKTsKKyAgICAgICAgaWYgKEtNUF9NQVNURVJfVElEKHRpZCkpIHsKKyAgICAgICAgICAgIGttcF91aW50NjQgc2NoZWR0eXBlID0gMDsKKworICAgICAgICAgICAgc3dpdGNoICggc2NoZWR1bGUgKSB7CisgICAgICAgICAgICBjYXNlIGttcF9zY2hfc3RhdGljX2NodW5rZWQ6CisgICAgICAgICAgICBjYXNlIGttcF9zY2hfc3RhdGljX2JhbGFuY2VkOi8vIENodW5rIGlzIGNhbGN1bGF0ZWQgaW4gdGhlIHN3aXRjaCBhYm92ZQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBrbXBfc2NoX3N0YXRpY19ncmVlZHk6CisgICAgICAgICAgICAgICAgY3VyX2NodW5rID0gcHItPnUucC5wYXJtMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2Uga21wX3NjaF9keW5hbWljX2NodW5rZWQ6CisgICAgICAgICAgICAgICAgc2NoZWR0eXBlID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2Uga21wX3NjaF9ndWlkZWRfaXRlcmF0aXZlX2NodW5rZWQ6CisgICAgICAgICAgICBjYXNlIGttcF9zY2hfZ3VpZGVkX2FuYWx5dGljYWxfY2h1bmtlZDoKKyAgICAgICAgICAgICAgICBzY2hlZHR5cGUgPSAyOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKy8vICAgICAgICAgICAgU2hvdWxkIHdlIHB1dCB0aGlzIGNhc2UgdW5kZXIgInN0YXRpYyI/CisvLyAgICAgICAgICAgIGNhc2Uga21wX3NjaF9zdGF0aWNfc3RlYWw6CisgICAgICAgICAgICAgICAgc2NoZWR0eXBlID0gMzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9fa21wX2l0dF9tZXRhZGF0YV9sb29wKGxvYywgc2NoZWR0eXBlLCB0YywgY3VyX2NodW5rKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgeworICAgICAgICBjb25zdCBjaGFyICogYnVmZjsKKyAgICAgICAgLy8gY3JlYXRlIGZvcm1hdCBzcGVjaWZpZXJzIGJlZm9yZSB0aGUgZGVidWcgb3V0cHV0CisgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KAorICAgICAgICAgICAgIl9fa21wX2Rpc3BhdGNoX2luaXQ6IFQjJSVkIHJldHVybmluZzogc2NoZWR1bGU6JSVkIG9yZGVyZWQ6JSUlcyBsYjolJSVzIHViOiUlJXMiIFwKKyAgICAgICAgICAgICIgc3Q6JSUlcyB0YzolJSVzIGNvdW50OiUlJXNcblx0b3JkZXJlZF9sb3dlcjolJSVzIG9yZGVyZWRfdXBwZXI6JSUlcyIgXAorICAgICAgICAgICAgIiBwYXJtMTolJSVzIHBhcm0yOiUlJXMgcGFybTM6JSUlcyBwYXJtNDolJSVzXG4iLAorICAgICAgICAgICAgdHJhaXRzX3Q8IFVUID46OnNwZWMsIHRyYWl0c190PCBUID46OnNwZWMsIHRyYWl0c190PCBUID46OnNwZWMsCisgICAgICAgICAgICB0cmFpdHNfdDwgU1QgPjo6c3BlYywgdHJhaXRzX3Q8IFVUID46OnNwZWMsIHRyYWl0c190PCBVVCA+OjpzcGVjLAorICAgICAgICAgICAgdHJhaXRzX3Q8IFVUID46OnNwZWMsIHRyYWl0c190PCBVVCA+OjpzcGVjLCB0cmFpdHNfdDwgVCA+OjpzcGVjLAorICAgICAgICAgICAgdHJhaXRzX3Q8IFQgPjo6c3BlYywgdHJhaXRzX3Q8IFQgPjo6c3BlYywgdHJhaXRzX3Q8IFQgPjo6c3BlYyApOworICAgICAgICBLRF9UUkFDRSgxMCwgKCBidWZmLAorICAgICAgICAgICAgZ3RpZCwgcHItPnNjaGVkdWxlLCBwci0+b3JkZXJlZCwgcHItPnUucC5sYiwgcHItPnUucC51YiwKKyAgICAgICAgICAgIHByLT51LnAuc3QsIHByLT51LnAudGMsIHByLT51LnAuY291bnQsCisgICAgICAgICAgICBwci0+dS5wLm9yZGVyZWRfbG93ZXIsIHByLT51LnAub3JkZXJlZF91cHBlciwgcHItPnUucC5wYXJtMSwKKyAgICAgICAgICAgIHByLT51LnAucGFybTIsIHByLT51LnAucGFybTMsIHByLT51LnAucGFybTQgKSApOworICAgICAgICBfX2ttcF9zdHJfZnJlZSggJmJ1ZmYgKTsKKyAgICB9CisgICAgI2VuZGlmCisgICAgI2lmICggS01QX1NUQVRJQ19TVEVBTF9FTkFCTEVEICkKKyAgICBpZiAoIF9fX2ttcF9zaXplX3R5cGUgPCA4ICkgeworICAgICAgLy8gSXQgY2Fubm90IGJlIGd1YXJhbnRlZWQgdGhhdCBhZnRlciBleGVjdXRpb24gb2YgYSBsb29wIHdpdGggc29tZSBvdGhlciBzY2hlZHVsZSBraW5kCisgICAgICAvLyBhbGwgdGhlIHBhcm0zIHZhcmlhYmxlcyB3aWxsIGNvbnRhaW4gdGhlIHNhbWUgdmFsdWUuCisgICAgICAvLyBFdmVuIGlmIGFsbCBwYXJtMyB3aWxsIGJlIHRoZSBzYW1lLCBpdCBzdGlsbCBleGlzdHMgYSBiYWQgY2FzZSBsaWtlIHVzaW5nIDAgYW5kIDEKKyAgICAgIC8vIHJhdGhlciB0aGFuIHByb2dyYW0gbGlmZS10aW1lIGluY3JlbWVudC4KKyAgICAgIC8vIFNvIHRoZSBkZWRpY2F0ZWQgdmFyaWFibGUgaXMgcmVxdWlyZWQuIFRoZSAnc3RhdGljX3N0ZWFsX2NvdW50ZXInIGlzIHVzZWQuCisgICAgICBpZiggc2NoZWR1bGUgPT0ga21wX3NjaF9zdGF0aWNfc3RlYWwgKSB7CisgICAgICAgIC8vIE90aGVyIHRocmVhZHMgd2lsbCBpbnNwZWN0IHRoaXMgdmFyaWFibGUgd2hlbiBzZWFyY2hpbmcgZm9yIGEgdmljdGltLgorICAgICAgICAvLyBUaGlzIGlzIGEgZmxhZyBzaG93aW5nIHRoYXQgb3RoZXIgdGhyZWFkcyBtYXkgc3RlYWwgZnJvbSB0aGlzIHRocmVhZCBzaW5jZSB0aGVuLgorICAgICAgICB2b2xhdGlsZSBUICogcCA9ICZwci0+dS5wLnN0YXRpY19zdGVhbF9jb3VudGVyOworICAgICAgICAqcCA9ICpwICsgMTsKKyAgICAgIH0KKyAgICB9CisgICAgI2VuZGlmIC8vICggS01QX1NUQVRJQ19TVEVBTF9FTkFCTEVEICYmIFVTRV9TVEVBTElORyApCit9CisKKy8qCisgKiBGb3Igb3JkZXJlZCBsb29wcywgZWl0aGVyIF9fa21wX2Rpc3BhdGNoX2ZpbmlzaCgpIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIKKyAqIGV2ZXJ5IGl0ZXJhdGlvbiwgb3IgX19rbXBfZGlzcGF0Y2hfZmluaXNoX2NodW5rKCkgc2hvdWxkIGJlIGNhbGxlZCBhZnRlcgorICogZXZlcnkgY2h1bmsgb2YgaXRlcmF0aW9ucy4gIElmIHRoZSBvcmRlcmVkIHNlY3Rpb24ocykgd2VyZSBub3QgZXhlY3V0ZWQKKyAqIGZvciB0aGlzIGl0ZXJhdGlvbiAob3IgZXZlcnkgaXRlcmF0aW9uIGluIHRoaXMgY2h1bmspLCB3ZSBuZWVkIHRvIHNldCB0aGUKKyAqIG9yZGVyZWQgaXRlcmF0aW9uIGNvdW50ZXJzIHNvIHRoYXQgdGhlIG5leHQgdGhyZWFkIGNhbiBwcm9jZWVkLgorICovCit0ZW1wbGF0ZTwgdHlwZW5hbWUgVVQgPgorc3RhdGljIHZvaWQKK19fa21wX2Rpc3BhdGNoX2ZpbmlzaCggaW50IGd0aWQsIGlkZW50X3QgKmxvYyApCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdDwgVVQgPjo6c2lnbmVkX3QgU1Q7CisgICAga21wX2luZm9fdCAqdGggPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisKKyAgICBLRF9UUkFDRSgxMDAsICgiX19rbXBfZGlzcGF0Y2hfZmluaXNoOiBUIyVkIGNhbGxlZFxuIiwgZ3RpZCApICk7CisgICAgaWYgKCAhIHRoIC0+IHRoLnRoX3RlYW0gLT4gdC50X3NlcmlhbGl6ZWQgKSB7CisKKyAgICAgICAgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3RlbXBsYXRlPCBVVCA+ICogcHIgPQorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDwgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3RlbXBsYXRlPCBVVCA+KiA+CisgICAgICAgICAgICAoIHRoLT50aC50aF9kaXNwYXRjaC0+dGhfZGlzcGF0Y2hfcHJfY3VycmVudCApOworICAgICAgICBkaXNwYXRjaF9zaGFyZWRfaW5mb190ZW1wbGF0ZTwgVVQgPiB2b2xhdGlsZSAqIHNoID0KKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8IGRpc3BhdGNoX3NoYXJlZF9pbmZvX3RlbXBsYXRlPCBVVCA+dm9sYXRpbGUqID4KKyAgICAgICAgICAgICggdGgtPnRoLnRoX2Rpc3BhdGNoLT50aF9kaXNwYXRjaF9zaF9jdXJyZW50ICk7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHByICk7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHNoICk7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHRoLT50aC50aF9kaXNwYXRjaCA9PQorICAgICAgICAgICAgICAgICAmdGgtPnRoLnRoX3RlYW0tPnQudF9kaXNwYXRjaFt0aC0+dGgudGhfaW5mby5kcy5kc190aWRdICk7CisKKyAgICAgICAgaWYgKCBwci0+b3JkZXJlZF9idW1wZWQgKSB7CisgICAgICAgICAgICBLRF9UUkFDRSgxMDAwLCAoIl9fa21wX2Rpc3BhdGNoX2ZpbmlzaDogVCMlZCByZXNldHRpbmcgb3JkZXJlZF9idW1wZWQgdG8gemVyb1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkICkgKTsKKyAgICAgICAgICAgIHByLT5vcmRlcmVkX2J1bXBlZCA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBVVCBsb3dlciA9IHByLT51LnAub3JkZXJlZF9sb3dlcjsKKworICAgICAgICAgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmOworICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgICAgICAgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAiX19rbXBfZGlzcGF0Y2hfZmluaXNoOiBUIyUlZCBiZWZvcmUgd2FpdDogb3JkZXJlZF9pdGVyYXRpb246JSUlcyBsb3dlcjolJSVzXG4iLAorICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdDwgVVQgPjo6c3BlYywgdHJhaXRzX3Q8IFVUID46OnNwZWMgKTsKKyAgICAgICAgICAgICAgICBLRF9UUkFDRSgxMDAwLCAoIGJ1ZmYsIGd0aWQsIHNoLT51LnMub3JkZXJlZF9pdGVyYXRpb24sIGxvd2VyICkgKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfZnJlZSggJmJ1ZmYgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICNlbmRpZgorCisgICAgICAgICAgICBfX2ttcF93YWl0X3lpZWxkPCBVVCA+KCZzaC0+dS5zLm9yZGVyZWRfaXRlcmF0aW9uLCBsb3dlciwgX19rbXBfZ2U8IFVUID4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIEtNUF9NQigpOyAgLyogaXMgdGhpcyBuZWNlc3Nhcnk/ICovCisgICAgICAgICAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIGJ1ZmY7CisgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGZvcm1hdCBzcGVjaWZpZXJzIGJlZm9yZSB0aGUgZGVidWcgb3V0cHV0CisgICAgICAgICAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICJfX2ttcF9kaXNwYXRjaF9maW5pc2g6IFQjJSVkIGFmdGVyIHdhaXQ6IG9yZGVyZWRfaXRlcmF0aW9uOiUlJXMgbG93ZXI6JSUlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3Q8IFVUID46OnNwZWMsIHRyYWl0c190PCBVVCA+OjpzcGVjICk7CisgICAgICAgICAgICAgICAgS0RfVFJBQ0UoMTAwMCwgKCBidWZmLCBndGlkLCBzaC0+dS5zLm9yZGVyZWRfaXRlcmF0aW9uLCBsb3dlciApICk7CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAjZW5kaWYKKworICAgICAgICAgICAgdGVzdF90aGVuX2luYzwgU1QgPiggKHZvbGF0aWxlIFNUICopICYgc2gtPnUucy5vcmRlcmVkX2l0ZXJhdGlvbiApOworICAgICAgICB9IC8vIGlmCisgICAgfSAvLyBpZgorICAgIEtEX1RSQUNFKDEwMCwgKCJfX2ttcF9kaXNwYXRjaF9maW5pc2g6IFQjJWQgcmV0dXJuZWRcbiIsIGd0aWQgKSApOworfQorCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisKK3RlbXBsYXRlPCB0eXBlbmFtZSBVVCA+CitzdGF0aWMgdm9pZAorX19rbXBfZGlzcGF0Y2hfZmluaXNoX2NodW5rKCBpbnQgZ3RpZCwgaWRlbnRfdCAqbG9jICkKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190PCBVVCA+OjpzaWduZWRfdCBTVDsKKyAgICBrbXBfaW5mb190ICp0aCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKworICAgIEtEX1RSQUNFKDEwMCwgKCJfX2ttcF9kaXNwYXRjaF9maW5pc2hfY2h1bms6IFQjJWQgY2FsbGVkXG4iLCBndGlkICkgKTsKKyAgICBpZiAoICEgdGggLT4gdGgudGhfdGVhbSAtPiB0LnRfc2VyaWFsaXplZCApIHsKKy8vICAgICAgICBpbnQgY2lkOworICAgICAgICBkaXNwYXRjaF9wcml2YXRlX2luZm9fdGVtcGxhdGU8IFVUID4gKiBwciA9CisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PCBkaXNwYXRjaF9wcml2YXRlX2luZm9fdGVtcGxhdGU8IFVUID4qID4KKyAgICAgICAgICAgICggdGgtPnRoLnRoX2Rpc3BhdGNoLT50aF9kaXNwYXRjaF9wcl9jdXJyZW50ICk7CisgICAgICAgIGRpc3BhdGNoX3NoYXJlZF9pbmZvX3RlbXBsYXRlPCBVVCA+IHZvbGF0aWxlICogc2ggPQorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDwgZGlzcGF0Y2hfc2hhcmVkX2luZm9fdGVtcGxhdGU8IFVUID52b2xhdGlsZSogPgorICAgICAgICAgICAgKCB0aC0+dGgudGhfZGlzcGF0Y2gtPnRoX2Rpc3BhdGNoX3NoX2N1cnJlbnQgKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggcHIgKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggc2ggKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGgtPnRoLnRoX2Rpc3BhdGNoID09CisgICAgICAgICAgICAgICAgICZ0aC0+dGgudGhfdGVhbS0+dC50X2Rpc3BhdGNoW3RoLT50aC50aF9pbmZvLmRzLmRzX3RpZF0gKTsKKworLy8gICAgICAgIGZvciAoY2lkID0gMDsgY2lkIDwgS01QX01BWF9PUkRFUkVEOyArK2NpZCkgeworICAgICAgICAgICAgVVQgbG93ZXIgPSBwci0+dS5wLm9yZGVyZWRfbG93ZXI7CisgICAgICAgICAgICBVVCB1cHBlciA9IHByLT51LnAub3JkZXJlZF91cHBlcjsKKyAgICAgICAgICAgIFVUIGluYyA9IHVwcGVyIC0gbG93ZXIgKyAxOworCisgICAgICAgICAgICBpZiAoIHByLT5vcmRlcmVkX2J1bXBlZCA9PSBpbmMgKSB7CisgICAgICAgICAgICAgICAgS0RfVFJBQ0UoMTAwMCwgKCJfX2ttcF9kaXNwYXRjaF9maW5pc2g6IFQjJWQgcmVzZXR0aW5nIG9yZGVyZWRfYnVtcGVkIHRvIHplcm9cbiIsCisgICAgICAgICAgICAgICAgICBndGlkICkgKTsKKyAgICAgICAgICAgICAgICBwci0+b3JkZXJlZF9idW1wZWQgPSAwOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbmMgLT0gcHItPm9yZGVyZWRfYnVtcGVkOworCisgICAgICAgICAgICAgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIGJ1ZmY7CisgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgICAgICAgICAgICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICJfX2ttcF9kaXNwYXRjaF9maW5pc2hfY2h1bms6IFQjJSVkIGJlZm9yZSB3YWl0OiAiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICJvcmRlcmVkX2l0ZXJhdGlvbjolJSVzIGxvd2VyOiUlJXMgdXBwZXI6JSUlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYWl0c190PCBVVCA+OjpzcGVjLCB0cmFpdHNfdDwgVVQgPjo6c3BlYywgdHJhaXRzX3Q8IFVUID46OnNwZWMgKTsKKyAgICAgICAgICAgICAgICAgICAgS0RfVFJBQ0UoMTAwMCwgKCBidWZmLCBndGlkLCBzaC0+dS5zLm9yZGVyZWRfaXRlcmF0aW9uLCBsb3dlciwgdXBwZXIgKSApOworICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdHJfZnJlZSggJmJ1ZmYgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgI2VuZGlmCisKKyAgICAgICAgICAgICAgICBfX2ttcF93YWl0X3lpZWxkPCBVVCA+KCZzaC0+dS5zLm9yZGVyZWRfaXRlcmF0aW9uLCBsb3dlciwgX19rbXBfZ2U8IFVUID4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworCisgICAgICAgICAgICAgICAgS01QX01CKCk7ICAvKiBpcyB0aGlzIG5lY2Vzc2FyeT8gKi8KKyAgICAgICAgICAgICAgICBLRF9UUkFDRSgxMDAwLCAoIl9fa21wX2Rpc3BhdGNoX2ZpbmlzaF9jaHVuazogVCMlZCByZXNldHRpbmcgb3JkZXJlZF9idW1wZWQgdG8gemVyb1xuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQgKSApOworICAgICAgICAgICAgICAgIHByLT5vcmRlcmVkX2J1bXBlZCA9IDA7CisvLyEhISEhIFRPRE8gY2hlY2sgaWYgdGhlIGluYyBzaG91bGQgYmUgdW5zaWduZWQsIG9yIHNpZ25lZD8/PworICAgICAgICAgICAgICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmOworICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgICAgICAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAiX19rbXBfZGlzcGF0Y2hfZmluaXNoX2NodW5rOiBUIyUlZCBhZnRlciB3YWl0OiAiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICJvcmRlcmVkX2l0ZXJhdGlvbjolJSVzIGluYzolJSVzIGxvd2VyOiUlJXMgdXBwZXI6JSUlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYWl0c190PCBVVCA+OjpzcGVjLCB0cmFpdHNfdDwgVVQgPjo6c3BlYywgdHJhaXRzX3Q8IFVUID46OnNwZWMsIHRyYWl0c190PCBVVCA+OjpzcGVjICk7CisgICAgICAgICAgICAgICAgICAgIEtEX1RSQUNFKDEwMDAsICggYnVmZiwgZ3RpZCwgc2gtPnUucy5vcmRlcmVkX2l0ZXJhdGlvbiwgaW5jLCBsb3dlciwgdXBwZXIgKSApOworICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdHJfZnJlZSggJmJ1ZmYgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgI2VuZGlmCisKKyAgICAgICAgICAgICAgICB0ZXN0X3RoZW5fYWRkPCBTVCA+KCAodm9sYXRpbGUgU1QgKikgJiBzaC0+dS5zLm9yZGVyZWRfaXRlcmF0aW9uLCBpbmMpOworICAgICAgICAgICAgfQorLy8gICAgICAgIH0KKyAgICB9CisgICAgS0RfVFJBQ0UoMTAwLCAoIl9fa21wX2Rpc3BhdGNoX2ZpbmlzaF9jaHVuazogVCMlZCByZXR1cm5lZFxuIiwgZ3RpZCApICk7Cit9CisKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKwordGVtcGxhdGU8IHR5cGVuYW1lIFQgPgorc3RhdGljIGludAorX19rbXBfZGlzcGF0Y2hfbmV4dCgKKyAgICBpZGVudF90ICpsb2MsIGludCBndGlkLCBrbXBfaW50MzIgKnBfbGFzdCwgVCAqcF9sYiwgVCAqcF91YiwgdHlwZW5hbWUgdHJhaXRzX3Q8IFQgPjo6c2lnbmVkX3QgKnBfc3QKKykgeworCisgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdDwgVCA+Ojp1bnNpZ25lZF90ICBVVDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190PCBUID46OnNpZ25lZF90ICAgIFNUOworICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3Q8IFQgPjo6ZmxvYXRpbmdfdCAgREJMOworICAgIHN0YXRpYyBjb25zdCBpbnQgX19fa21wX3NpemVfdHlwZSA9IHNpemVvZiggVVQgKTsKKworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworICAgIGRpc3BhdGNoX3ByaXZhdGVfaW5mb190ZW1wbGF0ZTwgVCA+ICogcHI7CisgICAga21wX2luZm9fdCAgICAgICAgICAgICAgICAgICAgICAgICAgKiB0aCAgID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworICAgIGttcF90ZWFtX3QgICAgICAgICAgICAgICAgICAgICAgICAgICogdGVhbSA9IHRoIC0+IHRoLnRoX3RlYW07CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBwX2xhc3QgJiYgcF9sYiAmJiBwX3ViICYmIHBfc3QgKTsgLy8gQUM6IHRoZXNlIGNhbm5vdCBiZSBOVUxMCisgICAgI2lmZGVmIEtNUF9ERUJVRworICAgIHsKKyAgICAgICAgY29uc3QgY2hhciAqIGJ1ZmY7CisgICAgICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgKKyAgICAgICAgICAgICJfX2ttcF9kaXNwYXRjaF9uZXh0OiBUIyUlZCBjYWxsZWQgcF9sYjolJSVzIHBfdWI6JSUlcyBwX3N0OiUlJXMgcF9sYXN0OiAlJXBcbiIsCisgICAgICAgICAgICB0cmFpdHNfdDwgVCA+OjpzcGVjLCB0cmFpdHNfdDwgVCA+OjpzcGVjLCB0cmFpdHNfdDwgU1QgPjo6c3BlYyApOworICAgICAgICBLRF9UUkFDRSgxMDAwLCAoIGJ1ZmYsIGd0aWQsICpwX2xiLCAqcF91YiwgcF9zdCA/ICpwX3N0IDogMCwgcF9sYXN0ICkgKTsKKyAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgfQorICAgICNlbmRpZgorCisgICAgaWYgKCB0ZWFtIC0+IHQudF9zZXJpYWxpemVkICkgeworICAgICAgICAvKiBOT1RFOiBzZXJpYWxpemUgdGhpcyBkaXNwYXRjaCBiZWNhc2Ugd2UgYXJlIG5vdCBhdCB0aGUgYWN0aXZlIGxldmVsICovCisgICAgICAgIHByID0gcmVpbnRlcnByZXRfY2FzdDwgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3RlbXBsYXRlPCBUID4qID4KKyAgICAgICAgICAgICggdGggLT4gdGgudGhfZGlzcGF0Y2ggLT4gdGhfZGlzcF9idWZmZXIgKTsgLyogdG9wIG9mIHRoZSBzdGFjayAqLworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBwciApOworCisgICAgICAgIGlmICggKHN0YXR1cyA9IChwci0+dS5wLnRjICE9IDApKSA9PSAwICkgeworICAgICAgICAgICAgKnBfbGIgPSAwOworICAgICAgICAgICAgKnBfdWIgPSAwOworLy8gICAgICAgICAgICBpZiAoIHBfbGFzdCAhPSBOVUxMICkKKy8vICAgICAgICAgICAgICAgICpwX2xhc3QgPSAwOworICAgICAgICAgICAgaWYgKCBwX3N0ICE9IE5VTEwgKQorICAgICAgICAgICAgICAgICpwX3N0ID0gMDsKKyAgICAgICAgICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICAgICAgICAgIGlmICggcHItPnB1c2hlZF93cyAhPSBjdF9ub25lICkgeworICAgICAgICAgICAgICAgICAgICBwci0+cHVzaGVkX3dzID0gX19rbXBfcG9wX3dvcmtzaGFyZSggZ3RpZCwgcHItPnB1c2hlZF93cywgbG9jICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKCBwci0+bm9tZXJnZSApIHsKKyAgICAgICAgICAgIGttcF9pbnQzMiBsYXN0OworICAgICAgICAgICAgVCAgICAgICAgIHN0YXJ0OworICAgICAgICAgICAgVVQgICAgICAgIGxpbWl0LCB0cmlwLCBpbml0OworICAgICAgICAgICAgU1QgICAgICAgIGluY3I7CisgICAgICAgICAgICBUICAgICAgICAgY2h1bmsgPSBwci0+dS5wLnBhcm0xOworCisgICAgICAgICAgICBLRF9UUkFDRSgxMDAsICgiX19rbXBfZGlzcGF0Y2hfbmV4dDogVCMlZCBrbXBfc2NoX2R5bmFtaWNfY2h1bmtlZCBjYXNlXG4iLCBndGlkICkgKTsKKworICAgICAgICAgICAgaW5pdCA9IGNodW5rICogcHItPnUucC5jb3VudCsrOworICAgICAgICAgICAgdHJpcCA9IHByLT51LnAudGMgLSAxOworCisgICAgICAgICAgICBpZiAoIChzdGF0dXMgPSAoaW5pdCA8PSB0cmlwKSkgPT0gMCApIHsKKyAgICAgICAgICAgICAgICAqcF9sYiA9IDA7CisgICAgICAgICAgICAgICAgKnBfdWIgPSAwOworLy8gICAgICAgICAgICAgICAgaWYgKCBwX2xhc3QgIT0gTlVMTCApCisvLyAgICAgICAgICAgICAgICAgICAgKnBfbGFzdCA9IDA7CisgICAgICAgICAgICAgICAgaWYgKCBwX3N0ICE9IE5VTEwgKQorICAgICAgICAgICAgICAgICAgICAqcF9zdCA9IDA7CisgICAgICAgICAgICAgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICggcHItPnB1c2hlZF93cyAhPSBjdF9ub25lICkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHItPnB1c2hlZF93cyA9IF9fa21wX3BvcF93b3Jrc2hhcmUoIGd0aWQsIHByLT5wdXNoZWRfd3MsIGxvYyApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdGFydCA9IHByLT51LnAubGI7CisgICAgICAgICAgICAgICAgbGltaXQgPSBjaHVuayArIGluaXQgLSAxOworICAgICAgICAgICAgICAgIGluY3IgID0gcHItPnUucC5zdDsKKworICAgICAgICAgICAgICAgIGlmICggKGxhc3QgPSAobGltaXQgPj0gdHJpcCkpICE9IDAgKSB7CisgICAgICAgICAgICAgICAgICAgIGxpbWl0ID0gdHJpcDsKKyAgICAgICAgICAgICAgICAgICAgI2lmIEtNUF9PU19XSU5ET1dTCisgICAgICAgICAgICAgICAgICAgIHByLT51LnAubGFzdF91cHBlciA9IHByLT51LnAudWI7CisgICAgICAgICAgICAgICAgICAgICNlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIHBfbGFzdCAhPSBOVUxMICkKKyAgICAgICAgICAgICAgICAgICAgKnBfbGFzdCA9IGxhc3Q7CisgICAgICAgICAgICAgICAgaWYgKCBwX3N0ICE9IE5VTEwgKQorICAgICAgICAgICAgICAgICAgICAqcF9zdCA9IGluY3I7CisgICAgICAgICAgICAgICAgaWYgKCBpbmNyID09IDEgKSB7CisgICAgICAgICAgICAgICAgICAgICpwX2xiID0gc3RhcnQgKyBpbml0OworICAgICAgICAgICAgICAgICAgICAqcF91YiA9IHN0YXJ0ICsgbGltaXQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgKnBfbGIgPSBzdGFydCArIGluaXQgKiBpbmNyOworICAgICAgICAgICAgICAgICAgICAqcF91YiA9IHN0YXJ0ICsgbGltaXQgKiBpbmNyOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICggcHItPm9yZGVyZWQgKSB7CisgICAgICAgICAgICAgICAgICAgIHByLT51LnAub3JkZXJlZF9sb3dlciA9IGluaXQ7CisgICAgICAgICAgICAgICAgICAgIHByLT51LnAub3JkZXJlZF91cHBlciA9IGxpbWl0OworICAgICAgICAgICAgICAgICAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGZvcm1hdCBzcGVjaWZpZXJzIGJlZm9yZSB0aGUgZGVidWcgb3V0cHV0CisgICAgICAgICAgICAgICAgICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX19rbXBfZGlzcGF0Y2hfbmV4dDogVCMlJWQgb3JkZXJlZF9sb3dlcjolJSVzIG9yZGVyZWRfdXBwZXI6JSUlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdDwgVVQgPjo6c3BlYywgdHJhaXRzX3Q8IFVUID46OnNwZWMgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtEX1RSQUNFKDEwMDAsICggYnVmZiwgZ3RpZCwgcHItPnUucC5vcmRlcmVkX2xvd2VyLCBwci0+dS5wLm9yZGVyZWRfdXBwZXIgKSApOworICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAgICAgfSAvLyBpZgorICAgICAgICAgICAgfSAvLyBpZgorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHItPnUucC50YyA9IDA7CisgICAgICAgICAgICAqcF9sYiA9IHByLT51LnAubGI7CisgICAgICAgICAgICAqcF91YiA9IHByLT51LnAudWI7CisgICAgICAgICAgICAjaWYgS01QX09TX1dJTkRPV1MKKyAgICAgICAgICAgIHByLT51LnAubGFzdF91cHBlciA9ICpwX3ViOworICAgICAgICAgICAgI2VuZGlmIC8qIEtNUF9PU19XSU5ET1dTICovCisgICAgICAgICAgICBpZiAoIHBfbGFzdCAhPSBOVUxMICkKKyAgICAgICAgICAgICAgICAqcF9sYXN0ID0gVFJVRTsKKyAgICAgICAgICAgIGlmICggcF9zdCAhPSBOVUxMICkKKyAgICAgICAgICAgICAgICAqcF9zdCA9IHByLT51LnAuc3Q7CisgICAgICAgIH0gLy8gaWYKKyAgICAgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBjaGFyICogYnVmZjsKKyAgICAgICAgICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgICAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoCisgICAgICAgICAgICAgICAgIl9fa21wX2Rpc3BhdGNoX25leHQ6IFQjJSVkIHNlcmlhbGl6ZWQgY2FzZTogcF9sYjolJSVzICIgXAorICAgICAgICAgICAgICAgICJwX3ViOiUlJXMgcF9zdDolJSVzIHBfbGFzdDolJXAgJSVkICByZXR1cm5pbmc6JSVkXG4iLAorICAgICAgICAgICAgICAgIHRyYWl0c190PCBUID46OnNwZWMsIHRyYWl0c190PCBUID46OnNwZWMsIHRyYWl0c190PCBTVCA+OjpzcGVjICk7CisgICAgICAgICAgICBLRF9UUkFDRSgxMCwgKCBidWZmLCBndGlkLCAqcF9sYiwgKnBfdWIsICpwX3N0LCBwX2xhc3QsICpwX2xhc3QsIHN0YXR1cykgKTsKKyAgICAgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgICAgICB9CisgICAgICAgICNlbmRpZgorI2lmIElOQ0xVREVfU1NDX01BUktTCisgICAgICAgIFNTQ19NQVJLX0RJU1BBVENIX05FWFQoKTsKKyNlbmRpZgorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0gZWxzZSB7CisgICAgICAgIGttcF9pbnQzMiBsYXN0ID0gMDsKKyAgICAgICAgZGlzcGF0Y2hfc2hhcmVkX2luZm9fdGVtcGxhdGU8IFVUID4gKnNoOworICAgICAgICBUICAgICAgICAgc3RhcnQ7CisgICAgICAgIFNUICAgICAgICBpbmNyOworICAgICAgICBVVCAgICAgICAgbGltaXQsIHRyaXAsIGluaXQ7CisKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGgtPnRoLnRoX2Rpc3BhdGNoID09CisgICAgICAgICAgICAgICAgJnRoLT50aC50aF90ZWFtLT50LnRfZGlzcGF0Y2hbdGgtPnRoLnRoX2luZm8uZHMuZHNfdGlkXSApOworCisgICAgICAgIHByID0gcmVpbnRlcnByZXRfY2FzdDwgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3RlbXBsYXRlPCBUID4qID4KKyAgICAgICAgICAgICggdGgtPnRoLnRoX2Rpc3BhdGNoLT50aF9kaXNwYXRjaF9wcl9jdXJyZW50ICk7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHByICk7CisgICAgICAgIHNoID0gcmVpbnRlcnByZXRfY2FzdDwgZGlzcGF0Y2hfc2hhcmVkX2luZm9fdGVtcGxhdGU8IFVUID4qID4KKyAgICAgICAgICAgICggdGgtPnRoLnRoX2Rpc3BhdGNoLT50aF9kaXNwYXRjaF9zaF9jdXJyZW50ICk7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHNoICk7CisKKyAgICAgICAgaWYgKCBwci0+dS5wLnRjID09IDAgKSB7CisgICAgICAgICAgICAvLyB6ZXJvIHRyaXAgY291bnQKKyAgICAgICAgICAgIHN0YXR1cyA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzd2l0Y2ggKHByLT5zY2hlZHVsZSkgeworICAgICAgICAgICAgI2lmICggS01QX1NUQVRJQ19TVEVBTF9FTkFCTEVEICYmIEtNUF9BUkNIX1g4Nl82NCApCisgICAgICAgICAgICBjYXNlIGttcF9zY2hfc3RhdGljX3N0ZWFsOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVCBjaHVuayA9IHByLT51LnAucGFybTE7CisKKyAgICAgICAgICAgICAgICAgICAgS0RfVFJBQ0UoMTAwLCAoIl9fa21wX2Rpc3BhdGNoX25leHQ6IFQjJWQga21wX3NjaF9zdGF0aWNfc3RlYWwgY2FzZVxuIiwgZ3RpZCkgKTsKKworICAgICAgICAgICAgICAgICAgICB0cmlwID0gcHItPnUucC50YyAtIDE7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBfX19rbXBfc2l6ZV90eXBlID4gNCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIE90aGVyIHRocmVhZHMgZG8gbm90IGxvb2sgaW50byB0aGUgZGF0YSBvZiB0aGlzIHRocmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICBzbyBpdCdzIG5vdCBuZWNlc3NhcnkgdG8gbWFrZSB2b2xhdGlsZSBjYXN0aW5nLgorICAgICAgICAgICAgICAgICAgICAgICAgaW5pdCAgID0gKCBwci0+dS5wLmNvdW50ICkrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9ICggaW5pdCA8IChVVClwci0+dS5wLnViICk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0eXBlZGVmIHVuaW9uIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVVCBjb3VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCAgdWI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQ2NCBiOworICAgICAgICAgICAgICAgICAgICAgICAgfSB1bmlvbl9pNDsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFsbCBvcGVyYXRpb25zIG9uICdjb3VudCcgb3IgJ3ViJyBtdXN0IGJlIGNvbWJpbmVkIGF0b21pY2FsbHkgdG9nZXRoZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVhbGluZyBpbXBsZW1lbnRlZCBvbmx5IGZvciA0LWJ5dGUgaW5kZXhlcworICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaW9uX2k0IHZvbGQsIHZuZXc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sZC5iID0gKiggdm9sYXRpbGUga21wX2ludDY0ICogKSgmcHItPnUucC5jb3VudCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm5ldyA9IHZvbGQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm5ldy5wLmNvdW50Kys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUoICEgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTY0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggdm9sYXRpbGUga21wX2ludDY0KiApJnByLT51LnAuY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlZPTEFUSUxFX0NBU1Qoa21wX2ludDY0ICopJnZvbGQuYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqVk9MQVRJTEVfQ0FTVChrbXBfaW50NjQgKikmdm5ldy5iICkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9DUFVfUEFVU0UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sZC5iID0gKiggdm9sYXRpbGUga21wX2ludDY0ICogKSgmcHItPnUucC5jb3VudCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZuZXcgPSB2b2xkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2bmV3LnAuY291bnQrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm5ldyA9IHZvbGQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdCAgID0gdm5ldy5wLmNvdW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9ICggaW5pdCA8IChVVCl2bmV3LnAudWIgKSA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAhc3RhdHVzICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbmZvX3QgICAqKm90aGVyX3RocmVhZHMgPSB0ZWFtLT50LnRfdGhyZWFkczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgd2hpbGVfbGltaXQgPSAxMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgd2hpbGVfaW5kZXggPSAwOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogYWxnb3JpdGhtIG9mIHNlYXJjaGluZyBmb3IgYSB2aWN0aW0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaG91bGQgYmUgY2xlYW5lZCB1cCBhbmQgbWVhc3VyZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoICggIXN0YXR1cyApICYmICggd2hpbGVfbGltaXQgIT0gKyt3aGlsZV9pbmRleCApICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlvbl9pNCAgdm9sZCwgdm5ldzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIHJlbWFpbmluZzsgLy8ga21wX2ludDMyIGJlY2F1c2UgS01QX0k0IG9ubHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCAgICAgICAgIHZpY3RpbUlkeCAgICA9IHByLT51LnAucGFybTQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgICAgICAgICBvbGRWaWN0aW1JZHggPSB2aWN0aW1JZHg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoX3ByaXZhdGVfaW5mb190ZW1wbGF0ZTwgVCA+ICogdmljdGltOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAhdmljdGltSWR4ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpY3RpbUlkeCA9IHRlYW0tPnQudF9ucHJvYyAtIDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tdmljdGltSWR4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmljdGltID0gcmVpbnRlcnByZXRfY2FzdDwgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3RlbXBsYXRlPCBUID4qID4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIG90aGVyX3RocmVhZHNbdmljdGltSWR4XS0+dGgudGhfZGlzcGF0Y2gtPnRoX2Rpc3BhdGNoX3ByX2N1cnJlbnQgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoICh2aWN0aW0gPT0gTlVMTCB8fCB2aWN0aW0gPT0gcHIpICYmIG9sZFZpY3RpbUlkeCAhPSB2aWN0aW1JZHggKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogdGhpbmsgYWJvdXQgYSBwcm9wZXIgcGxhY2Ugb2YgdGhpcyB0ZXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKCAhdmljdGltICkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAoKiggdm9sYXRpbGUgVCAqICkmdmljdGltLT51LnAuc3RhdGljX3N0ZWFsX2NvdW50ZXIpICE9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCooIHZvbGF0aWxlIFQgKiApJnByLT51LnAuc3RhdGljX3N0ZWFsX2NvdW50ZXIpICkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBkZWxheSB3b3VsZCBiZSBuaWNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB2aWN0aW0gaXMgbm90IHJlYWR5IHlldCB0byBwYXJ0aWNpcGF0ZSBpbiBzdGVhbGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGUgdmljdGltIGlzIHN0aWxsIGluIGttcF9pbml0X2Rpc3BhdGNoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBvbGRWaWN0aW1JZHggPT0gdmljdGltSWR4ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHItPnUucC5wYXJtNCA9IHZpY3RpbUlkeDsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSggMSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbGQuYiA9ICooIHZvbGF0aWxlIGttcF9pbnQ2NCAqICkoICZ2aWN0aW0tPnUucC5jb3VudCApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm5ldyA9IHZvbGQ7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoICh2bmV3LnAudWIgLSAxKSAqIChVVCljaHVuayA8PSB0cmlwICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHZuZXcucC5jb3VudCA+PSAoVVQpdm5ldy5wLnViIHx8IChyZW1haW5pbmcgPSB2bmV3LnAudWIgLSB2bmV3LnAuY291bnQpIDwgNCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZuZXcucC51YiAtPSAocmVtYWluaW5nID4+IDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCgodm5ldy5wLnViIC0gMSkgKiAoVVQpY2h1bmsgPD0gdHJpcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjcHJhZ21hIHdhcm5pbmcoIHB1c2ggKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlzYWJsZSB3YXJuaW5nIG9uIHBvaW50bGVzcyBjb21wYXJpc29uIG9mIHVuc2lnbmVkIHdpdGggMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3ByYWdtYSB3YXJuaW5nKCBkaXNhYmxlOiAxODYgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQodm5ldy5wLnViID49IDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3ByYWdtYSB3YXJuaW5nKCBwb3AgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogU2hvdWxkIHRoaXMgYmUgYWNxdWlyZSBvciByZWxlYXNlPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRNjQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggdm9sYXRpbGUga21wX2ludDY0ICogKSZ2aWN0aW0tPnUucC5jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlZPTEFUSUxFX0NBU1Qoa21wX2ludDY0ICopJnZvbGQuYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlZPTEFUSUxFX0NBU1Qoa21wX2ludDY0ICopJnZuZXcuYiApICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGVfaW5kZXggPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdyB1cGRhdGUgb3duIGNvdW50IGFuZCB1YgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNpZiBLTVBfQVJDSF9YODYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVhbGluZyBleGVjdXRlZCBvbiBub24tS01QX0FSQ0hfWDg2IG9ubHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXRvbWljIDY0LWJpdCB3cml0ZSBvbiBpYTMyIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVuYXZhaWxhYmxlLCBzbyB3ZSBkbyB0aGlzIGluIHN0ZXBzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgVGhpcyBjb2RlIGlzIG5vdCB0ZXN0ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXQgPSB2b2xkLnAuY291bnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByLT51LnAudWIgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwci0+dS5wLmNvdW50ID0gaW5pdCArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByLT51LnAudWIgPSB2bmV3LnAuY291bnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdCA9IHZuZXcucC51YjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sZC5wLmNvdW50ID0gaW5pdCArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGlzIGl0IHNhZmUgYW5kIGVub3VnaD8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiggdm9sYXRpbGUga21wX2ludDY0ICogKSgmcHItPnUucC5jb3VudCkgPSB2b2xkLmI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2VuZGlmIC8vIEtNUF9BUkNIX1g4NgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAvLyBpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfQ1BVX1BBVVNFKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gLy8gd2hpbGUgKDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAvLyB3aGlsZQorICAgICAgICAgICAgICAgICAgICAgICAgfSAvLyBpZgorICAgICAgICAgICAgICAgICAgICB9IC8vIGlmCisgICAgICAgICAgICAgICAgICAgIGlmICggIXN0YXR1cyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpwX2xiID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICpwX3ViID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcF9zdCAhPSBOVUxMICkgKnBfc3QgPSAwOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBwci0+dS5wLnBhcm0yOworICAgICAgICAgICAgICAgICAgICAgICAgaW5pdCAqPSBjaHVuazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0ID0gY2h1bmsgKyBpbml0IC0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluY3IgID0gcHItPnUucC5zdDsKKworICAgICAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChpbml0IDw9IHRyaXApOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAobGFzdCA9IChsaW1pdCA+PSB0cmlwKSkgIT0gMCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQgPSB0cmlwOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwX3N0ICE9IE5VTEwgKSAqcF9zdCA9IGluY3I7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggaW5jciA9PSAxICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwX2xiID0gc3RhcnQgKyBpbml0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwX3ViID0gc3RhcnQgKyBsaW1pdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBfbGIgPSBzdGFydCArIGluaXQgKiBpbmNyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwX3ViID0gc3RhcnQgKyBsaW1pdCAqIGluY3I7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcHItPm9yZGVyZWQgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHItPnUucC5vcmRlcmVkX2xvd2VyID0gaW5pdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwci0+dS5wLm9yZGVyZWRfdXBwZXIgPSBsaW1pdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogYnVmZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGZvcm1hdCBzcGVjaWZpZXJzIGJlZm9yZSB0aGUgZGVidWcgb3V0cHV0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9fa21wX2Rpc3BhdGNoX25leHQ6IFQjJSVkIG9yZGVyZWRfbG93ZXI6JSUlcyBvcmRlcmVkX3VwcGVyOiUlJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdDwgVVQgPjo6c3BlYywgdHJhaXRzX3Q8IFVUID46OnNwZWMgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS0RfVFJBQ0UoMTAwMCwgKCBidWZmLCBndGlkLCBwci0+dS5wLm9yZGVyZWRfbG93ZXIsIHByLT51LnAub3JkZXJlZF91cHBlciApICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gLy8gaWYKKyAgICAgICAgICAgICAgICAgICAgfSAvLyBpZgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9IC8vIGNhc2UKKyAgICAgICAgICAgICNlbmRpZiAvLyAoIEtNUF9TVEFUSUNfU1RFQUxfRU5BQkxFRCAmJiBLTVBfQVJDSF9YODZfNjQgKQorICAgICAgICAgICAgY2FzZSBrbXBfc2NoX3N0YXRpY19iYWxhbmNlZDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEtEX1RSQUNFKDEwMCwgKCJfX2ttcF9kaXNwYXRjaF9uZXh0OiBUIyVkIGttcF9zY2hfc3RhdGljX2JhbGFuY2VkIGNhc2VcbiIsIGd0aWQpICk7CisgICAgICAgICAgICAgICAgICAgIGlmICggKHN0YXR1cyA9ICFwci0+dS5wLmNvdW50KSAhPSAwICkgeyAgLyogY2hlY2sgaWYgdGhyZWFkIGhhcyBhbnkgaXRlcmF0aW9uIHRvIGRvICovCisgICAgICAgICAgICAgICAgICAgICAgICBwci0+dS5wLmNvdW50ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpwX2xiID0gcHItPnUucC5sYjsKKyAgICAgICAgICAgICAgICAgICAgICAgICpwX3ViID0gcHItPnUucC51YjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgPSBwci0+dS5wLnBhcm0xOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwX3N0ICE9IE5VTEwgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwX3N0ID0gcHItPnUucC5zdDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsgIC8qIG5vIGl0ZXJhdGlvbnMgdG8gZG8gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHByLT51LnAubGIgPSBwci0+dS5wLnViICsgcHItPnUucC5zdDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoIHByLT5vcmRlcmVkICkgeworICAgICAgICAgICAgICAgICAgICAgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX19rbXBfZGlzcGF0Y2hfbmV4dDogVCMlJWQgb3JkZXJlZF9sb3dlcjolJSVzIG9yZGVyZWRfdXBwZXI6JSUlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3Q8IFVUID46OnNwZWMsIHRyYWl0c190PCBVVCA+OjpzcGVjICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgS0RfVFJBQ0UoMTAwMCwgKCBidWZmLCBndGlkLCBwci0+dS5wLm9yZGVyZWRfbG93ZXIsIHByLT51LnAub3JkZXJlZF91cHBlciApICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgfSAvLyBpZgorICAgICAgICAgICAgICAgIH0gLy8gY2FzZQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBrbXBfc2NoX3N0YXRpY19ncmVlZHk6ICAvKiBvcmlnaW5hbCBjb2RlIGZvciBrbXBfc2NoX3N0YXRpY19ncmVlZHkgd2FzIG1lcmdlZCBoZXJlICovCisgICAgICAgICAgICBjYXNlIGttcF9zY2hfc3RhdGljX2NodW5rZWQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBUIHBhcm0xOworCisgICAgICAgICAgICAgICAgICAgIEtEX1RSQUNFKDEwMCwgKCJfX2ttcF9kaXNwYXRjaF9uZXh0OiBUIyVkIGttcF9zY2hfc3RhdGljX1thZmZpbml0eXxjaHVua2VkXSBjYXNlXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkICkgKTsKKyAgICAgICAgICAgICAgICAgICAgcGFybTEgPSBwci0+dS5wLnBhcm0xOworCisgICAgICAgICAgICAgICAgICAgIHRyaXAgID0gcHItPnUucC50YyAtIDE7CisgICAgICAgICAgICAgICAgICAgIGluaXQgID0gcGFybTEgKiAocHItPnUucC5jb3VudCArIF9fa21wX3RpZF9mcm9tX2d0aWQoZ3RpZCkpOworCisgICAgICAgICAgICAgICAgICAgIGlmICggKHN0YXR1cyA9IChpbml0IDw9IHRyaXApKSAhPSAwICkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBwci0+dS5wLmxiOworICAgICAgICAgICAgICAgICAgICAgICAgaW5jciAgPSBwci0+dS5wLnN0OworICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQgPSBwYXJtMSArIGluaXQgLSAxOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChsYXN0ID0gKGxpbWl0ID49IHRyaXApKSAhPSAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdCA9IHRyaXA7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcF9zdCAhPSBOVUxMICkgKnBfc3QgPSBpbmNyOworCisgICAgICAgICAgICAgICAgICAgICAgICBwci0+dS5wLmNvdW50ICs9IHRlYW0tPnQudF9ucHJvYzsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBpbmNyID09IDEgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBfbGIgPSBzdGFydCArIGluaXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBfdWIgPSBzdGFydCArIGxpbWl0OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBfbGIgPSBzdGFydCArIGluaXQgKiBpbmNyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwX3ViID0gc3RhcnQgKyBsaW1pdCAqIGluY3I7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcHItPm9yZGVyZWQgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHItPnUucC5vcmRlcmVkX2xvd2VyID0gaW5pdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwci0+dS5wLm9yZGVyZWRfdXBwZXIgPSBsaW1pdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogYnVmZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGZvcm1hdCBzcGVjaWZpZXJzIGJlZm9yZSB0aGUgZGVidWcgb3V0cHV0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9fa21wX2Rpc3BhdGNoX25leHQ6IFQjJSVkIG9yZGVyZWRfbG93ZXI6JSUlcyBvcmRlcmVkX3VwcGVyOiUlJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdDwgVVQgPjo6c3BlYywgdHJhaXRzX3Q8IFVUID46OnNwZWMgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS0RfVFJBQ0UoMTAwMCwgKCBidWZmLCBndGlkLCBwci0+dS5wLm9yZGVyZWRfbG93ZXIsIHByLT51LnAub3JkZXJlZF91cHBlciApICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gLy8gaWYKKyAgICAgICAgICAgICAgICAgICAgfSAvLyBpZgorICAgICAgICAgICAgICAgIH0gLy8gY2FzZQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIGttcF9zY2hfZHluYW1pY19jaHVua2VkOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVCBjaHVuayA9IHByLT51LnAucGFybTE7CisKKyAgICAgICAgICAgICAgICAgICAgS0RfVFJBQ0UoMTAwLCAoIl9fa21wX2Rpc3BhdGNoX25leHQ6IFQjJWQga21wX3NjaF9keW5hbWljX2NodW5rZWQgY2FzZVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCApICk7CisKKyAgICAgICAgICAgICAgICAgICAgaW5pdCA9IGNodW5rICogdGVzdF90aGVuX2luY19hY3E8IFNUID4oKHZvbGF0aWxlIFNUICopICYgc2gtPnUucy5pdGVyYXRpb24gKTsKKyAgICAgICAgICAgICAgICAgICAgdHJpcCA9IHByLT51LnAudGMgLSAxOworCisgICAgICAgICAgICAgICAgICAgIGlmICggKHN0YXR1cyA9IChpbml0IDw9IHRyaXApKSA9PSAwICkgeworICAgICAgICAgICAgICAgICAgICAgICAgKnBfbGIgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgKnBfdWIgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwX3N0ICE9IE5VTEwgKSAqcF9zdCA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IHByLT51LnAubGI7CisgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdCA9IGNodW5rICsgaW5pdCAtIDE7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmNyICA9IHByLT51LnAuc3Q7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKGxhc3QgPSAobGltaXQgPj0gdHJpcCkpICE9IDAgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0ID0gdHJpcDsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwX3N0ICE9IE5VTEwgKSAqcF9zdCA9IGluY3I7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggaW5jciA9PSAxICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwX2xiID0gc3RhcnQgKyBpbml0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwX3ViID0gc3RhcnQgKyBsaW1pdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBfbGIgPSBzdGFydCArIGluaXQgKiBpbmNyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwX3ViID0gc3RhcnQgKyBsaW1pdCAqIGluY3I7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcHItPm9yZGVyZWQgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHItPnUucC5vcmRlcmVkX2xvd2VyID0gaW5pdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwci0+dS5wLm9yZGVyZWRfdXBwZXIgPSBsaW1pdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogYnVmZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGZvcm1hdCBzcGVjaWZpZXJzIGJlZm9yZSB0aGUgZGVidWcgb3V0cHV0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9fa21wX2Rpc3BhdGNoX25leHQ6IFQjJSVkIG9yZGVyZWRfbG93ZXI6JSUlcyBvcmRlcmVkX3VwcGVyOiUlJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdDwgVVQgPjo6c3BlYywgdHJhaXRzX3Q8IFVUID46OnNwZWMgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS0RfVFJBQ0UoMTAwMCwgKCBidWZmLCBndGlkLCBwci0+dS5wLm9yZGVyZWRfbG93ZXIsIHByLT51LnAub3JkZXJlZF91cHBlciApICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gLy8gaWYKKyAgICAgICAgICAgICAgICAgICAgfSAvLyBpZgorICAgICAgICAgICAgICAgIH0gLy8gY2FzZQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIGttcF9zY2hfZ3VpZGVkX2l0ZXJhdGl2ZV9jaHVua2VkOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVCAgY2h1bmtzcGVjID0gcHItPnUucC5wYXJtMTsKKyAgICAgICAgICAgICAgICAgICAgS0RfVFJBQ0UoMTAwLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJfX2ttcF9kaXNwYXRjaF9uZXh0OiBUIyVkIGttcF9zY2hfZ3VpZGVkX2NodW5rZWQgaXRlcmF0aXZlIGNhc2VcbiIsZ3RpZCkpOworICAgICAgICAgICAgICAgICAgICB0cmlwICA9IHByLT51LnAudGM7CisgICAgICAgICAgICAgICAgICAgIC8vIFN0YXJ0IGF0b21pYyBwYXJ0IG9mIGNhbGN1bGF0aW9ucworICAgICAgICAgICAgICAgICAgICB3aGlsZSgxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTVCAgcmVtYWluaW5nOyAgICAgICAgICAgICAvLyBzaWduZWQsIGJlY2F1c2UgY2FuIGJlIDwgMAorICAgICAgICAgICAgICAgICAgICAgICAgaW5pdCA9IHNoLT51LnMuaXRlcmF0aW9uOyAgLy8gc2hhcmVkIHZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICByZW1haW5pbmcgPSB0cmlwIC0gaW5pdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcmVtYWluaW5nIDw9IDAgKSB7ICAgIC8vIEFDOiBuZWVkIHRvIGNvbXBhcmUgd2l0aCAwIGZpcnN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90aGluZyB0byBkbywgZG9uJ3QgdHJ5IGF0b21pYyBvcAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChUKXJlbWFpbmluZyA8IHByLT51LnAucGFybTIgKSB7IC8vIGNvbXBhcmUgd2l0aCBLKm5wcm9jKihjaHVuaysxKSwgSz0yIGJ5IGRlZmF1bHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2UgZHluYW1pYy1zdHlsZSBzaGNlZHVsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF0b21pY2FsbHkgaW5yZW1lbnQgaXRlcmF0aW9ucywgZ2V0IG9sZCB2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXQgPSB0ZXN0X3RoZW5fYWRkPFNUPiggKFNUKikmc2gtPnUucy5pdGVyYXRpb24sIChTVCljaHVua3NwZWMgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1haW5pbmcgPSB0cmlwIC0gaW5pdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVtYWluaW5nIDw9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gMDsgICAgLy8gYWxsIGl0ZXJhdGlvbnMgZ290IGJ5IG90aGVyIHRocmVhZHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnb3Qgc29tZSBpdGVyYXRpb25zIHRvIHdvcmsgb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoVClyZW1haW5pbmcgPiBjaHVua3NwZWMgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdCA9IGluaXQgKyBjaHVua3NwZWMgLSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdCA9IDE7ICAgLy8gdGhlIGxhc3QgY2h1bmsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0ID0gaW5pdCArIHJlbWFpbmluZyAtIDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gLy8gaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IC8vIGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9IC8vIGlmCisgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdCA9IGluaXQgKyAoVVQpKCByZW1haW5pbmcgKiAqKGRvdWJsZSopJnByLT51LnAucGFybTMgKTsgLy8gZGl2aWRlIGJ5IEsqbnByb2MKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggY29tcGFyZV9hbmRfc3dhcDxTVD4oIChTVCopJnNoLT51LnMuaXRlcmF0aW9uLCAoU1QpaW5pdCwgKFNUKWxpbWl0ICkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ0FTIHdhcyBzdWNjZXNzZnVsLCBjaHVuayBvYnRhaW5lZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS1saW1pdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gLy8gaWYKKyAgICAgICAgICAgICAgICAgICAgfSAvLyB3aGlsZQorICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXR1cyAhPSAwICkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBwci0+dS5wLmxiOworICAgICAgICAgICAgICAgICAgICAgICAgaW5jciA9IHByLT51LnAuc3Q7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHBfc3QgIT0gTlVMTCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBfc3QgPSBpbmNyOworICAgICAgICAgICAgICAgICAgICAgICAgKnBfbGIgPSBzdGFydCArIGluaXQgKiBpbmNyOworICAgICAgICAgICAgICAgICAgICAgICAgKnBfdWIgPSBzdGFydCArIGxpbWl0ICogaW5jcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcHItPm9yZGVyZWQgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHItPnUucC5vcmRlcmVkX2xvd2VyID0gaW5pdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwci0+dS5wLm9yZGVyZWRfdXBwZXIgPSBsaW1pdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogYnVmZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGZvcm1hdCBzcGVjaWZpZXJzIGJlZm9yZSB0aGUgZGVidWcgb3V0cHV0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9fa21wX2Rpc3BhdGNoX25leHQ6IFQjJSVkIG9yZGVyZWRfbG93ZXI6JSUlcyBvcmRlcmVkX3VwcGVyOiUlJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdDwgVVQgPjo6c3BlYywgdHJhaXRzX3Q8IFVUID46OnNwZWMgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS0RfVFJBQ0UoMTAwMCwgKCBidWZmLCBndGlkLCBwci0+dS5wLm9yZGVyZWRfbG93ZXIsIHByLT51LnAub3JkZXJlZF91cHBlciApICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gLy8gaWYKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpwX2xiID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICpwX3ViID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcF9zdCAhPSBOVUxMICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcF9zdCA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0gLy8gaWYKKyAgICAgICAgICAgICAgICB9IC8vIGNhc2UKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBrbXBfc2NoX2d1aWRlZF9hbmFseXRpY2FsX2NodW5rZWQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBUICAgY2h1bmtzcGVjID0gcHItPnUucC5wYXJtMTsKKyAgICAgICAgICAgICAgICAgICAgVVQgY2h1bmtJZHg7CisgICAgI2lmIEtNUF9PU19XSU5ET1dTICYmIEtNUF9BUkNIX1g4NgorICAgICAgICAgICAgICAgICAgICAvKiBmb3Igc3RvcmluZyBvcmlnaW5hbCBGUENXIHZhbHVlIGZvciBXaW5kb3dzKiBPUyBvbgorCQkgICAgICAgSUEtMzIgYXJjaGl0ZWN0dXJlIDgtYnl0ZSB2ZXJzaW9uICovCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBvbGRGcGN3OworICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZnBjd1NldCA9IDA7CisgICAgI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIEtEX1RSQUNFKDEwMCwgKCJfX2ttcF9kaXNwYXRjaF9uZXh0OiBUIyVkIGttcF9zY2hfZ3VpZGVkX2NodW5rZWQgYW5hbHl0aWNhbCBjYXNlXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkICkgKTsKKworICAgICAgICAgICAgICAgICAgICB0cmlwICA9IHByLT51LnAudGM7CisKKyAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCh0ZWFtLT50LnRfbnByb2MgPiAxKTsKKyAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCgoMlVMICogY2h1bmtzcGVjICsgMSkgKiAoVVQpdGVhbS0+dC50X25wcm9jIDwgdHJpcCk7CisKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUoMSkgeyAvKiB0aGlzIHdoaWxlIGxvb3AgaXMgYSBzYWZlZ3VhcmQgYWdhaW5zdCB1bmV4cGVjdGVkIHplcm8gY2h1bmsgc2l6ZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rSWR4ID0gdGVzdF90aGVuX2luY19hY3E8IFNUID4oKHZvbGF0aWxlIFNUICopICYgc2gtPnUucy5pdGVyYXRpb24gKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggY2h1bmtJZHggPj0gKFVUKXByLT51LnAucGFybTIgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS10cmlwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVzZSBkeW5hbWljLXN0eWxlIHNjaGVkdWxpbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0ID0gY2h1bmtJZHggKiBjaHVua3NwZWMgKyBwci0+dS5wLmNvdW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5lZWQgdG8gdmVyaWZ5IGluaXQgPiAwIGluIGNhc2Ugb2Ygb3ZlcmZsb3cgaW4gdGhlIGFib3ZlIGNhbGN1bGF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3RhdHVzID0gKGluaXQgPiAwICYmIGluaXQgPD0gdHJpcCkpICE9IDAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0ID0gaW5pdCArIGNodW5rc3BlYyAtMTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChsYXN0ID0gKGxpbWl0ID49IHRyaXApKSAhPSAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0ID0gdHJpcDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVzZSBleHBvbmVudGlhbC1zdHlsZSBzY2hlZHVsaW5nICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhlIGZvbGxvd2luZyBjaGVjayBpcyB0byB3b3JrYXJvdW5kIHRoZSBsYWNrIG9mIGxvbmcgZG91YmxlIHByZWNpc2lvbiBvbiBXaW5kb3dzKiBPUy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGNoZWNrIHdvcmtzIGFyb3VuZCB0aGUgcG9zc2libGUgZWZmZWN0IHRoYXQgaW5pdCAhPSAwIGZvciBjaHVua0lkeCA9PSAwLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICNpZiBLTVBfT1NfV0lORE9XUyAmJiBLTVBfQVJDSF9YODYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJZiB3ZSBoYXZlbid0IGFscmVhZHkgZG9uZSBzbywgc2F2ZSBvcmlnaW5hbAorCQkJICAgICAgIEZQQ1cgYW5kIHNldCBwcmVjaXNpb24gdG8gNjQtYml0LCBhcyBXaW5kb3dzKiBPUworCQkJICAgICAgIG9uIElBLTMyIGFyY2hpdGVjdHVyZSBkZWZhdWx0cyB0byA1My1iaXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICFmcGN3U2V0ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRGcGN3ID0gX2NvbnRyb2w4NygwLDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udHJvbDg3KF9QQ182NCxfTUNXX1BDKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnBjd1NldCA9IDB4MzAwMDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggY2h1bmtJZHggKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXQgPSBfX2ttcF9kaXNwYXRjaF9ndWlkZWRfcmVtYWluaW5nPCBUID4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpcCwgKiggREJMICogKSZwci0+dS5wLnBhcm0zLCBjaHVua0lkeCApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGluaXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0ID0gdHJpcCAtIGluaXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0ID0gdHJpcCAtIF9fa21wX2Rpc3BhdGNoX2d1aWRlZF9yZW1haW5pbmc8IFQgPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpcCwgKiggREJMICogKSZwci0+dS5wLnBhcm0zLCBjaHVua0lkeCArIDEgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfQVNTRVJUKGluaXQgPD0gbGltaXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggaW5pdCA8IGxpbWl0ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGxpbWl0IDw9IHRyaXApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLWxpbWl0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IC8vIGlmCisgICAgICAgICAgICAgICAgICAgICAgICB9IC8vIGlmCisgICAgICAgICAgICAgICAgICAgIH0gLy8gd2hpbGUgKDEpCisgICAgI2lmIEtNUF9PU19XSU5ET1dTICYmIEtNUF9BUkNIX1g4NgorICAgICAgICAgICAgICAgICAgICAvKiByZXN0b3JlIEZQQ1cgaWYgbmVjZXNzYXJ5CisgICAgICAgICAgICAgICAgICAgICAgIEFDOiBjaGVjayBmcGN3U2V0IGZsYWcgZmlyc3QgYmVjYXVzZSBvbGRGcGN3IGNhbiBiZSB1bmluaXRpYWxpemVkIGhlcmUKKyAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKCBmcGN3U2V0ICYmICggb2xkRnBjdyAmIGZwY3dTZXQgKSApCisgICAgICAgICAgICAgICAgICAgICAgICBfY29udHJvbDg3KG9sZEZwY3csX01DV19QQyk7CisgICAgI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdHVzICE9IDAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IHByLT51LnAubGI7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmNyID0gcHItPnUucC5zdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcF9zdCAhPSBOVUxMICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcF9zdCA9IGluY3I7CisgICAgICAgICAgICAgICAgICAgICAgICAqcF9sYiA9IHN0YXJ0ICsgaW5pdCAqIGluY3I7CisgICAgICAgICAgICAgICAgICAgICAgICAqcF91YiA9IHN0YXJ0ICsgbGltaXQgKiBpbmNyOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwci0+b3JkZXJlZCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwci0+dS5wLm9yZGVyZWRfbG93ZXIgPSBpbml0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByLT51LnAub3JkZXJlZF91cHBlciA9IGxpbWl0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX19rbXBfZGlzcGF0Y2hfbmV4dDogVCMlJWQgb3JkZXJlZF9sb3dlcjolJSVzIG9yZGVyZWRfdXBwZXI6JSUlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWl0c190PCBVVCA+OjpzcGVjLCB0cmFpdHNfdDwgVVQgPjo6c3BlYyApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLRF9UUkFDRSgxMDAwLCAoIGJ1ZmYsIGd0aWQsIHByLT51LnAub3JkZXJlZF9sb3dlciwgcHItPnUucC5vcmRlcmVkX3VwcGVyICkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgKnBfbGIgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgKnBfdWIgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwX3N0ICE9IE5VTEwgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwX3N0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gLy8gY2FzZQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIGttcF9zY2hfdHJhcGV6b2lkYWw6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBVVCAgIGluZGV4OworICAgICAgICAgICAgICAgICAgICBUICAgIHBhcm0yID0gcHItPnUucC5wYXJtMjsKKyAgICAgICAgICAgICAgICAgICAgVCAgICBwYXJtMyA9IHByLT51LnAucGFybTM7CisgICAgICAgICAgICAgICAgICAgIFQgICAgcGFybTQgPSBwci0+dS5wLnBhcm00OworICAgICAgICAgICAgICAgICAgICBLRF9UUkFDRSgxMDAsICgiX19rbXBfZGlzcGF0Y2hfbmV4dDogVCMlZCBrbXBfc2NoX3RyYXBlem9pZGFsIGNhc2VcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQgKSApOworCisgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gdGVzdF90aGVuX2luYzwgU1QgPiggKHZvbGF0aWxlIFNUICopICYgc2gtPnUucy5pdGVyYXRpb24gKTsKKworICAgICAgICAgICAgICAgICAgICBpbml0ID0gKCBpbmRleCAqICggKDIqcGFybTIpIC0gKGluZGV4LTEpKnBhcm00ICkgKSAvIDI7CisgICAgICAgICAgICAgICAgICAgIHRyaXAgPSBwci0+dS5wLnRjIC0gMTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIChzdGF0dXMgPSAoKFQpaW5kZXggPCBwYXJtMyAmJiBpbml0IDw9IHRyaXApKSA9PSAwICkgeworICAgICAgICAgICAgICAgICAgICAgICAgKnBfbGIgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgKnBfdWIgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwX3N0ICE9IE5VTEwgKSAqcF9zdCA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IHByLT51LnAubGI7CisgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdCA9ICggKGluZGV4KzEpICogKCAyKnBhcm0yIC0gaW5kZXgqcGFybTQgKSApIC8gMiAtIDE7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmNyICA9IHByLT51LnAuc3Q7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKGxhc3QgPSAobGltaXQgPj0gdHJpcCkpICE9IDAgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0ID0gdHJpcDsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwX3N0ICE9IE5VTEwgKSAqcF9zdCA9IGluY3I7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggaW5jciA9PSAxICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwX2xiID0gc3RhcnQgKyBpbml0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwX3ViID0gc3RhcnQgKyBsaW1pdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBfbGIgPSBzdGFydCArIGluaXQgKiBpbmNyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwX3ViID0gc3RhcnQgKyBsaW1pdCAqIGluY3I7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcHItPm9yZGVyZWQgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHItPnUucC5vcmRlcmVkX2xvd2VyID0gaW5pdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwci0+dS5wLm9yZGVyZWRfdXBwZXIgPSBsaW1pdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogYnVmZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGZvcm1hdCBzcGVjaWZpZXJzIGJlZm9yZSB0aGUgZGVidWcgb3V0cHV0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9fa21wX2Rpc3BhdGNoX25leHQ6IFQjJSVkIG9yZGVyZWRfbG93ZXI6JSUlcyBvcmRlcmVkX3VwcGVyOiUlJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdDwgVVQgPjo6c3BlYywgdHJhaXRzX3Q8IFVUID46OnNwZWMgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS0RfVFJBQ0UoMTAwMCwgKCBidWZmLCBndGlkLCBwci0+dS5wLm9yZGVyZWRfbG93ZXIsIHByLT51LnAub3JkZXJlZF91cHBlciApICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gLy8gaWYKKyAgICAgICAgICAgICAgICAgICAgfSAvLyBpZgorICAgICAgICAgICAgICAgIH0gLy8gY2FzZQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IDA7IC8vIHRvIGF2b2lkIGNvbXBsYWludHMgb24gdW5pbml0aWFsaXplZCB2YXJpYWJsZSB1c2UKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgICAgICAgICAga21wX21zX2ZhdGFsLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldmVyaXR5CisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBVbmtub3duU2NoZWRUeXBlRGV0ZWN0ZWQgKSwgLy8gUHJpbWFyeSBtZXNzYWdlCisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfSE5UKCBHZXROZXdlckxpYnJhcnkgKSwgICAgICAgICAgLy8gSGludAorICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwgICAgICAgICAgICAgICAgICAgICAgIC8vIFZhcmlhZGljIGFyZ3VtZW50IGxpc3QgdGVybWluYXRvcgorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gLy8gc3dpdGNoCisgICAgICAgIH0gLy8gaWYgdGMgPT0gMDsKKworICAgICAgICBpZiAoIHN0YXR1cyA9PSAwICkgeworICAgICAgICAgICAgVVQgICBudW1fZG9uZTsKKworICAgICAgICAgICAgbnVtX2RvbmUgPSB0ZXN0X3RoZW5faW5jPCBTVCA+KCAodm9sYXRpbGUgU1QgKikgJiBzaC0+dS5zLm51bV9kb25lICk7CisgICAgICAgICAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIGJ1ZmY7CisgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGZvcm1hdCBzcGVjaWZpZXJzIGJlZm9yZSB0aGUgZGVidWcgb3V0cHV0CisgICAgICAgICAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICJfX2ttcF9kaXNwYXRjaF9uZXh0OiBUIyUlZCBpbmNyZW1lbnQgbnVtX2RvbmU6JSUlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3Q8IFVUID46OnNwZWMgKTsKKyAgICAgICAgICAgICAgICBLRF9UUkFDRSgxMDAsICggYnVmZiwgZ3RpZCwgc2gtPnUucy5udW1fZG9uZSApICk7CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAjZW5kaWYKKworICAgICAgICAgICAgaWYgKCAoU1QpbnVtX2RvbmUgPT0gdGVhbS0+dC50X25wcm9jLTEgKSB7CisgICAgICAgICAgICAgICAgLyogTk9URTogcmVsZWFzZSB0aGlzIGJ1ZmZlciB0byBiZSByZXVzZWQgKi8KKworICAgICAgICAgICAgICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgICAgICAgICAgICAgc2gtPnUucy5udW1fZG9uZSA9IDA7CisgICAgICAgICAgICAgICAgc2gtPnUucy5pdGVyYXRpb24gPSAwOworCisgICAgICAgICAgICAgICAgLyogVE9ETyByZXBsYWNlIHdpdGggZ2VuZXJhbCByZWxlYXNlIHByb2NlZHVyZT8gKi8KKyAgICAgICAgICAgICAgICBpZiAoIHByLT5vcmRlcmVkICkgeworICAgICAgICAgICAgICAgICAgICBzaC0+dS5zLm9yZGVyZWRfaXRlcmF0aW9uID0gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgICAgICAgICAgICAgIHNoIC0+IGJ1ZmZlcl9pbmRleCArPSBLTVBfTUFYX0RJU1BfQlVGOworICAgICAgICAgICAgICAgIEtEX1RSQUNFKDEwMCwgKCJfX2ttcF9kaXNwYXRjaF9uZXh0OiBUIyVkIGNoYW5nZSBidWZmZXJfaW5kZXg6JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHNoLT5idWZmZXJfaW5kZXgpICk7CisKKyAgICAgICAgICAgICAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgICAgICAgICAgfSAvLyBpZgorICAgICAgICAgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgICAgICAgICAgaWYgKCBwci0+cHVzaGVkX3dzICE9IGN0X25vbmUgKSB7CisgICAgICAgICAgICAgICAgICAgIHByLT5wdXNoZWRfd3MgPSBfX2ttcF9wb3Bfd29ya3NoYXJlKCBndGlkLCBwci0+cHVzaGVkX3dzLCBsb2MgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRoIC0+IHRoLnRoX2Rpc3BhdGNoIC0+IHRoX2Rlb19mY24gPSBOVUxMOworICAgICAgICAgICAgdGggLT4gdGgudGhfZGlzcGF0Y2ggLT4gdGhfZHhvX2ZjbiA9IE5VTEw7CisgICAgICAgICAgICB0aCAtPiB0aC50aF9kaXNwYXRjaCAtPiB0aF9kaXNwYXRjaF9zaF9jdXJyZW50ID0gTlVMTDsKKyAgICAgICAgICAgIHRoIC0+IHRoLnRoX2Rpc3BhdGNoIC0+IHRoX2Rpc3BhdGNoX3ByX2N1cnJlbnQgPSBOVUxMOworICAgICAgICB9IC8vIGlmIChzdGF0dXMgPT0gMCkKKyNpZiBLTVBfT1NfV0lORE9XUworICAgICAgICBlbHNlIGlmICggbGFzdCApIHsKKyAgICAgICAgICAgIHByLT51LnAubGFzdF91cHBlciA9IHByLT51LnAudWI7CisgICAgICAgIH0KKyNlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAqLworICAgICAgICBpZiAoIHBfbGFzdCAhPSBOVUxMICYmIHN0YXR1cyAhPSAwICkKKyAgICAgICAgICAgICpwX2xhc3QgPSBsYXN0OworICAgIH0gLy8gaWYKKworICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICB7CisgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmOworICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoCisgICAgICAgICAgICAiX19rbXBfZGlzcGF0Y2hfbmV4dDogVCMlJWQgbm9ybWFsIGNhc2U6ICIgXAorICAgICAgICAgICAgInBfbGI6JSUlcyBwX3ViOiUlJXMgcF9zdDolJSVzIHBfbGFzdDolJXAgIHJldHVybmluZzolJWRcbiIsCisgICAgICAgICAgICB0cmFpdHNfdDwgVCA+OjpzcGVjLCB0cmFpdHNfdDwgVCA+OjpzcGVjLCB0cmFpdHNfdDwgU1QgPjo6c3BlYyApOworICAgICAgICBLRF9UUkFDRSgxMCwgKCBidWZmLCBndGlkLCAqcF9sYiwgKnBfdWIsIHBfc3QgPyAqcF9zdCA6IDAsIHBfbGFzdCwgc3RhdHVzICkgKTsKKyAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgfQorICAgICNlbmRpZgorI2lmIElOQ0xVREVfU1NDX01BUktTCisgICAgU1NDX01BUktfRElTUEFUQ0hfTkVYVCgpOworI2VuZGlmCisgICAgcmV0dXJuIHN0YXR1czsKK30KKwordGVtcGxhdGU8IHR5cGVuYW1lIFQgPgorc3RhdGljIHZvaWQKK19fa21wX2Rpc3RfZ2V0X2JvdW5kcygKKyAgICBpZGVudF90ICAgICAgICAgICAgICAgICAgICAgICAgICAqbG9jLAorICAgIGttcF9pbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLAorICAgIGttcF9pbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICpwbGFzdGl0ZXIsCisgICAgVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBsb3dlciwKKyAgICBUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHVwcGVyLAorICAgIHR5cGVuYW1lIHRyYWl0c190PCBUID46OnNpZ25lZF90ICBpbmNyCispIHsKKyAgICBLTVBfQ09VTlRfQkxPQ0soT01QX0RJU1RSX0ZPUl9keW5hbWljKTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190PCBUID46OnVuc2lnbmVkX3QgIFVUOworICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3Q8IFQgPjo6c2lnbmVkX3QgICAgU1Q7CisgICAgcmVnaXN0ZXIga21wX3VpbnQzMiAgdGVhbV9pZDsKKyAgICByZWdpc3RlciBrbXBfdWludDMyICBudGVhbXM7CisgICAgcmVnaXN0ZXIgVVQgICAgICAgICAgdHJpcF9jb3VudDsKKyAgICByZWdpc3RlciBrbXBfdGVhbV90ICp0ZWFtOworICAgIGttcF9pbmZvX3QgKiB0aDsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIHBsYXN0aXRlciAmJiBwbG93ZXIgJiYgcHVwcGVyICk7CisgICAgS0VfVFJBQ0UoIDEwLCAoIl9fa21wY19kaXN0X2dldF9ib3VuZHMgY2FsbGVkICglZClcbiIsIGd0aWQpKTsKKyAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgeworICAgICAgICBjb25zdCBjaGFyICogYnVmZjsKKyAgICAgICAgLy8gY3JlYXRlIGZvcm1hdCBzcGVjaWZpZXJzIGJlZm9yZSB0aGUgZGVidWcgb3V0cHV0CisgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KCAiX19rbXBjX2Rpc3RfZ2V0X2JvdW5kczogVCMlJWQgbGl0ZXI9JSVkICJcCisgICAgICAgICAgICAiaXRlcj0oJSUlcywgJSUlcywgJSUlcykgc2lnbmVkPzwlcz5cbiIsCisgICAgICAgICAgICB0cmFpdHNfdDwgVCA+OjpzcGVjLCB0cmFpdHNfdDwgVCA+OjpzcGVjLCB0cmFpdHNfdDwgU1QgPjo6c3BlYywKKyAgICAgICAgICAgIHRyYWl0c190PCBUID46OnNwZWMgKTsKKyAgICAgICAgS0RfVFJBQ0UoMTAwLCAoIGJ1ZmYsIGd0aWQsICpwbGFzdGl0ZXIsICpwbG93ZXIsICpwdXBwZXIsIGluY3IgKSApOworICAgICAgICBfX2ttcF9zdHJfZnJlZSggJmJ1ZmYgKTsKKyAgICB9CisgICAgI2VuZGlmCisKKyAgICBpZiggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBpZiggaW5jciA9PSAwICkgeworICAgICAgICAgICAgX19rbXBfZXJyb3JfY29uc3RydWN0KCBrbXBfaTE4bl9tc2dfQ25zTG9vcEluY3JaZXJvUHJvaGliaXRlZCwgY3RfcGRvLCBsb2MgKTsKKyAgICAgICAgfQorICAgICAgICBpZiggaW5jciA+IDAgPyAoKnB1cHBlciA8ICpwbG93ZXIpIDogKCpwbG93ZXIgPCAqcHVwcGVyKSApIHsKKyAgICAgICAgICAgIC8vIFRoZSBsb29wIGlzIGlsbGVnYWwuCisgICAgICAgICAgICAvLyBTb21lIHplcm8tdHJpcCBsb29wcyBtYWludGFpbmVkIGJ5IGNvbXBpbGVyLCBlLmcuOgorICAgICAgICAgICAgLy8gICBmb3IoaT0xMDtpPDA7KytpKSAvLyBsb3dlciA+PSB1cHBlciAtIHJ1bi10aW1lIGNoZWNrCisgICAgICAgICAgICAvLyAgIGZvcihpPTA7aT4xMDstLWkpIC8vIGxvd2VyIDw9IHVwcGVyIC0gcnVuLXRpbWUgY2hlY2sKKyAgICAgICAgICAgIC8vICAgZm9yKGk9MDtpPjEwOysraSkgLy8gaW5jciA+IDAgICAgICAgLSBjb21waWxlLXRpbWUgY2hlY2sKKyAgICAgICAgICAgIC8vICAgZm9yKGk9MTA7aTwwOy0taSkgLy8gaW5jciA8IDAgICAgICAgLSBjb21waWxlLXRpbWUgY2hlY2sKKyAgICAgICAgICAgIC8vIENvbXBpbGVyIGRvZXMgbm90IGNoZWNrIHRoZSBmb2xsb3dpbmcgaWxsZWdhbCBsb29wczoKKyAgICAgICAgICAgIC8vICAgZm9yKGk9MDtpPDEwO2krPWluY3IpIC8vIHdoZXJlIGluY3I8MAorICAgICAgICAgICAgLy8gICBmb3IoaT0xMDtpPjA7aS09aW5jcikgLy8gd2hlcmUgaW5jcjwwCisgICAgICAgICAgICBfX2ttcF9lcnJvcl9jb25zdHJ1Y3QoIGttcF9pMThuX21zZ19DbnNMb29wSW5jcklsbGVnYWwsIGN0X3BkbywgbG9jICk7CisgICAgICAgIH0KKyAgICB9CisgICAgdGggPSBfX2ttcF90aHJlYWRzW2d0aWRdOworICAgIEtNUF9ERUJVR19BU1NFUlQodGgtPnRoLnRoX3RlYW1zX21pY3JvdGFzayk7ICAgLy8gd2UgYXJlIGluIHRoZSB0ZWFtcyBjb25zdHJ1Y3QKKyAgICB0ZWFtID0gdGgtPnRoLnRoX3RlYW07CisgICAgI2lmIE9NUF80MF9FTkFCTEVECisgICAgbnRlYW1zID0gdGgtPnRoLnRoX3RlYW1zX3NpemUubnRlYW1zOworICAgICNlbmRpZgorICAgIHRlYW1faWQgPSB0ZWFtLT50LnRfbWFzdGVyX3RpZDsKKyAgICBLTVBfREVCVUdfQVNTRVJUKG50ZWFtcyA9PSB0ZWFtLT50LnRfcGFyZW50LT50LnRfbnByb2MpOworCisgICAgLy8gY29tcHV0ZSBnbG9iYWwgdHJpcCBjb3VudAorICAgIGlmKCBpbmNyID09IDEgKSB7CisgICAgICAgIHRyaXBfY291bnQgPSAqcHVwcGVyIC0gKnBsb3dlciArIDE7CisgICAgfSBlbHNlIGlmKGluY3IgPT0gLTEpIHsKKyAgICAgICAgdHJpcF9jb3VudCA9ICpwbG93ZXIgLSAqcHVwcGVyICsgMTsKKyAgICB9IGVsc2UgeworICAgICAgICB0cmlwX2NvdW50ID0gKFNUKSgqcHVwcGVyIC0gKnBsb3dlcikgLyBpbmNyICsgMTsgLy8gY2FzdCB0byBzaWduZWQgdG8gY292ZXIgaW5jcjwwIGNhc2UKKyAgICB9CisgICAgaWYoIHRyaXBfY291bnQgPD0gbnRlYW1zICkgeworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKAorICAgICAgICAgICAgX19rbXBfc3RhdGljID09IGttcF9zY2hfc3RhdGljX2dyZWVkeSB8fCBcCisgICAgICAgICAgICBfX2ttcF9zdGF0aWMgPT0ga21wX3NjaF9zdGF0aWNfYmFsYW5jZWQKKyAgICAgICAgKTsgLy8gVW5rbm93biBzdGF0aWMgc2NoZWR1bGluZyB0eXBlLgorICAgICAgICAvLyBvbmx5IHNvbWUgdGVhbXMgZ2V0IHNpbmdsZSBpdGVyYXRpb24sIG90aGVycyBnZXQgbm90aGluZworICAgICAgICBpZiggdGVhbV9pZCA8IHRyaXBfY291bnQgKSB7CisgICAgICAgICAgICAqcHVwcGVyID0gKnBsb3dlciA9ICpwbG93ZXIgKyB0ZWFtX2lkICogaW5jcjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICpwbG93ZXIgPSAqcHVwcGVyICsgaW5jcjsgLy8gemVyby10cmlwIGxvb3AKKyAgICAgICAgfQorICAgICAgICBpZiggcGxhc3RpdGVyICE9IE5VTEwgKQorICAgICAgICAgICAgKnBsYXN0aXRlciA9ICggdGVhbV9pZCA9PSB0cmlwX2NvdW50IC0gMSApOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmKCBfX2ttcF9zdGF0aWMgPT0ga21wX3NjaF9zdGF0aWNfYmFsYW5jZWQgKSB7CisgICAgICAgICAgICByZWdpc3RlciBVVCBjaHVuayA9IHRyaXBfY291bnQgLyBudGVhbXM7CisgICAgICAgICAgICByZWdpc3RlciBVVCBleHRyYXMgPSB0cmlwX2NvdW50ICUgbnRlYW1zOworICAgICAgICAgICAgKnBsb3dlciArPSBpbmNyICogKCB0ZWFtX2lkICogY2h1bmsgKyAoIHRlYW1faWQgPCBleHRyYXMgPyB0ZWFtX2lkIDogZXh0cmFzICkgKTsKKyAgICAgICAgICAgICpwdXBwZXIgPSAqcGxvd2VyICsgY2h1bmsgKiBpbmNyIC0gKCB0ZWFtX2lkIDwgZXh0cmFzID8gMCA6IGluY3IgKTsKKyAgICAgICAgICAgIGlmKCBwbGFzdGl0ZXIgIT0gTlVMTCApCisgICAgICAgICAgICAgICAgKnBsYXN0aXRlciA9ICggdGVhbV9pZCA9PSBudGVhbXMgLSAxICk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZWdpc3RlciBUIGNodW5rX2luY19jb3VudCA9CisgICAgICAgICAgICAgICAgKCB0cmlwX2NvdW50IC8gbnRlYW1zICsgKCAoIHRyaXBfY291bnQgJSBudGVhbXMgKSA/IDEgOiAwKSApICogaW5jcjsKKyAgICAgICAgICAgIHJlZ2lzdGVyIFQgdXBwZXIgPSAqcHVwcGVyOworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfc3RhdGljID09IGttcF9zY2hfc3RhdGljX2dyZWVkeSApOworICAgICAgICAgICAgICAgIC8vIFVua25vd24gc3RhdGljIHNjaGVkdWxpbmcgdHlwZS4KKyAgICAgICAgICAgICpwbG93ZXIgKz0gdGVhbV9pZCAqIGNodW5rX2luY19jb3VudDsKKyAgICAgICAgICAgICpwdXBwZXIgPSAqcGxvd2VyICsgY2h1bmtfaW5jX2NvdW50IC0gaW5jcjsKKyAgICAgICAgICAgIC8vIENoZWNrL2NvcnJlY3QgYm91bmRzIGlmIG5lZWRlZAorICAgICAgICAgICAgaWYoIGluY3IgPiAwICkgeworICAgICAgICAgICAgICAgIGlmKCAqcHVwcGVyIDwgKnBsb3dlciApCisgICAgICAgICAgICAgICAgICAgICpwdXBwZXIgPSBpX21heG1pbjwgVCA+OjpteDsKKyAgICAgICAgICAgICAgICBpZiggcGxhc3RpdGVyICE9IE5VTEwgKQorICAgICAgICAgICAgICAgICAgICAqcGxhc3RpdGVyID0gKnBsb3dlciA8PSB1cHBlciAmJiAqcHVwcGVyID4gdXBwZXIgLSBpbmNyOworICAgICAgICAgICAgICAgIGlmKCAqcHVwcGVyID4gdXBwZXIgKQorICAgICAgICAgICAgICAgICAgICAqcHVwcGVyID0gdXBwZXI7IC8vIHRyYWNrZXIgQzczMjU4CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmKCAqcHVwcGVyID4gKnBsb3dlciApCisgICAgICAgICAgICAgICAgICAgICpwdXBwZXIgPSBpX21heG1pbjwgVCA+OjptbjsKKyAgICAgICAgICAgICAgICBpZiggcGxhc3RpdGVyICE9IE5VTEwgKQorICAgICAgICAgICAgICAgICAgICAqcGxhc3RpdGVyID0gKnBsb3dlciA+PSB1cHBlciAmJiAqcHVwcGVyIDwgdXBwZXIgLSBpbmNyOworICAgICAgICAgICAgICAgIGlmKCAqcHVwcGVyIDwgdXBwZXIgKQorICAgICAgICAgICAgICAgICAgICAqcHVwcGVyID0gdXBwZXI7IC8vIHRyYWNrZXIgQzczMjU4CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIERpc3BhdGNoIHJvdXRpbmVzCisvLyAgICBUcmFuc2ZlciBjYWxsIHRvIHRlbXBsYXRlPCB0eXBlIFQgPgorLy8gICAgX19rbXBfZGlzcGF0Y2hfaW5pdCggaWRlbnRfdCAqbG9jLCBpbnQgZ3RpZCwgZW51bSBzY2hlZF90eXBlIHNjaGVkdWxlLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgVCBsYiwgVCB1YiwgU1Qgc3QsIFNUIGNodW5rICkKK2V4dGVybiAiQyIgeworCisvKiEKK0Bpbmdyb3VwIFdPUktfU0hBUklORworQHsKK0BwYXJhbSBsb2MgU291cmNlIGxvY2F0aW9uCitAcGFyYW0gZ3RpZCBHbG9iYWwgdGhyZWFkIGlkCitAcGFyYW0gc2NoZWR1bGUgU2NoZWR1bGUgdHlwZQorQHBhcmFtIGxiICBMb3dlciBib3VuZAorQHBhcmFtIHViICBVcHBlciBib3VuZAorQHBhcmFtIHN0ICBTdGVwIChvciBpbmNyZW1lbnQgaWYgeW91IHByZWZlcikKK0BwYXJhbSBjaHVuayBUaGUgY2h1bmsgc2l6ZSB0byBibG9jayB3aXRoCisKK1RoaXMgZnVuY3Rpb24gcHJlcGFyZXMgdGhlIHJ1bnRpbWUgdG8gc3RhcnQgYSBkeW5hbWljYWxseSBzY2hlZHVsZWQgZm9yIGxvb3AsIHNhdmluZyB0aGUgbG9vcCBhcmd1bWVudHMuCitUaGVzZSBmdW5jdGlvbnMgYXJlIGFsbCBpZGVudGljYWwgYXBhcnQgZnJvbSB0aGUgdHlwZXMgb2YgdGhlIGFyZ3VtZW50cy4KKyovCisKK3ZvaWQKK19fa21wY19kaXNwYXRjaF9pbml0XzQoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIGVudW0gc2NoZWRfdHlwZSBzY2hlZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBsYiwga21wX2ludDMyIHViLCBrbXBfaW50MzIgc3QsIGttcF9pbnQzMiBjaHVuayApCit7CisgICAgS01QX0NPVU5UX0JMT0NLKE9NUF9GT1JfZHluYW1pYyk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsKKyAgICBfX2ttcF9kaXNwYXRjaF9pbml0PCBrbXBfaW50MzIgPiggbG9jLCBndGlkLCBzY2hlZHVsZSwgbGIsIHViLCBzdCwgY2h1bmssIHRydWUgKTsKK30KKy8qIQorU2VlIEByZWYgX19rbXBjX2Rpc3BhdGNoX2luaXRfNAorKi8KK3ZvaWQKK19fa21wY19kaXNwYXRjaF9pbml0XzR1KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCBlbnVtIHNjaGVkX3R5cGUgc2NoZWR1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICBrbXBfdWludDMyIGxiLCBrbXBfdWludDMyIHViLCBrbXBfaW50MzIgc3QsIGttcF9pbnQzMiBjaHVuayApCit7CisgICAgS01QX0NPVU5UX0JMT0NLKE9NUF9GT1JfZHluYW1pYyk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsKKyAgICBfX2ttcF9kaXNwYXRjaF9pbml0PCBrbXBfdWludDMyID4oIGxvYywgZ3RpZCwgc2NoZWR1bGUsIGxiLCB1Yiwgc3QsIGNodW5rLCB0cnVlICk7Cit9CisKKy8qIQorU2VlIEByZWYgX19rbXBjX2Rpc3BhdGNoX2luaXRfNAorKi8KK3ZvaWQKK19fa21wY19kaXNwYXRjaF9pbml0XzgoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIGVudW0gc2NoZWRfdHlwZSBzY2hlZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQ2NCBsYiwga21wX2ludDY0IHViLAorICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDY0IHN0LCBrbXBfaW50NjQgY2h1bmsgKQoreworICAgIEtNUF9DT1VOVF9CTE9DSyhPTVBfRk9SX2R5bmFtaWMpOworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7CisgICAgX19rbXBfZGlzcGF0Y2hfaW5pdDwga21wX2ludDY0ID4oIGxvYywgZ3RpZCwgc2NoZWR1bGUsIGxiLCB1Yiwgc3QsIGNodW5rLCB0cnVlICk7Cit9CisKKy8qIQorU2VlIEByZWYgX19rbXBjX2Rpc3BhdGNoX2luaXRfNAorKi8KK3ZvaWQKK19fa21wY19kaXNwYXRjaF9pbml0Xzh1KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCBlbnVtIHNjaGVkX3R5cGUgc2NoZWR1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAga21wX3VpbnQ2NCBsYiwga21wX3VpbnQ2NCB1YiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50NjQgc3QsIGttcF9pbnQ2NCBjaHVuayApCit7CisgICAgS01QX0NPVU5UX0JMT0NLKE9NUF9GT1JfZHluYW1pYyk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsKKyAgICBfX2ttcF9kaXNwYXRjaF9pbml0PCBrbXBfdWludDY0ID4oIGxvYywgZ3RpZCwgc2NoZWR1bGUsIGxiLCB1Yiwgc3QsIGNodW5rLCB0cnVlICk7Cit9CisKKy8qIQorU2VlIEByZWYgX19rbXBjX2Rpc3BhdGNoX2luaXRfNAorCitEaWZmZXJlbmNlIGZyb20gX19rbXBjX2Rpc3BhdGNoX2luaXQgc2V0IG9mIGZ1bmN0aW9ucyBpcyB0aGVzZSBmdW5jdGlvbnMKK2FyZSBjYWxsZWQgZm9yIGNvbXBvc2l0ZSBkaXN0cmlidXRlIHBhcmFsbGVsIGZvciBjb25zdHJ1Y3QuIFRodXMgYmVmb3JlCityZWd1bGFyIGl0ZXJhdGlvbnMgZGlzcGF0Y2hpbmcgd2UgbmVlZCB0byBjYWxjIHBlci10ZWFtIGl0ZXJhdGlvbiBzcGFjZS4KKworVGhlc2UgZnVuY3Rpb25zIGFyZSBhbGwgaWRlbnRpY2FsIGFwYXJ0IGZyb20gdGhlIHR5cGVzIG9mIHRoZSBhcmd1bWVudHMuCisqLwordm9pZAorX19rbXBjX2Rpc3RfZGlzcGF0Y2hfaW5pdF80KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCBlbnVtIHNjaGVkX3R5cGUgc2NoZWR1bGUsCisgICAga21wX2ludDMyICpwX2xhc3QsIGttcF9pbnQzMiBsYiwga21wX2ludDMyIHViLCBrbXBfaW50MzIgc3QsIGttcF9pbnQzMiBjaHVuayApCit7CisgICAgS01QX0NPVU5UX0JMT0NLKE9NUF9GT1JfZHluYW1pYyk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsKKyAgICBfX2ttcF9kaXN0X2dldF9ib3VuZHM8IGttcF9pbnQzMiA+KCBsb2MsIGd0aWQsIHBfbGFzdCwgJmxiLCAmdWIsIHN0ICk7CisgICAgX19rbXBfZGlzcGF0Y2hfaW5pdDwga21wX2ludDMyID4oIGxvYywgZ3RpZCwgc2NoZWR1bGUsIGxiLCB1Yiwgc3QsIGNodW5rLCB0cnVlICk7Cit9CisKK3ZvaWQKK19fa21wY19kaXN0X2Rpc3BhdGNoX2luaXRfNHUoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIGVudW0gc2NoZWRfdHlwZSBzY2hlZHVsZSwKKyAgICBrbXBfaW50MzIgKnBfbGFzdCwga21wX3VpbnQzMiBsYiwga21wX3VpbnQzMiB1Yiwga21wX2ludDMyIHN0LCBrbXBfaW50MzIgY2h1bmsgKQoreworICAgIEtNUF9DT1VOVF9CTE9DSyhPTVBfRk9SX2R5bmFtaWMpOworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7CisgICAgX19rbXBfZGlzdF9nZXRfYm91bmRzPCBrbXBfdWludDMyID4oIGxvYywgZ3RpZCwgcF9sYXN0LCAmbGIsICZ1Yiwgc3QgKTsKKyAgICBfX2ttcF9kaXNwYXRjaF9pbml0PCBrbXBfdWludDMyID4oIGxvYywgZ3RpZCwgc2NoZWR1bGUsIGxiLCB1Yiwgc3QsIGNodW5rLCB0cnVlICk7Cit9CisKK3ZvaWQKK19fa21wY19kaXN0X2Rpc3BhdGNoX2luaXRfOCggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwgZW51bSBzY2hlZF90eXBlIHNjaGVkdWxlLAorICAgIGttcF9pbnQzMiAqcF9sYXN0LCBrbXBfaW50NjQgbGIsIGttcF9pbnQ2NCB1Yiwga21wX2ludDY0IHN0LCBrbXBfaW50NjQgY2h1bmsgKQoreworICAgIEtNUF9DT1VOVF9CTE9DSyhPTVBfRk9SX2R5bmFtaWMpOworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7CisgICAgX19rbXBfZGlzdF9nZXRfYm91bmRzPCBrbXBfaW50NjQgPiggbG9jLCBndGlkLCBwX2xhc3QsICZsYiwgJnViLCBzdCApOworICAgIF9fa21wX2Rpc3BhdGNoX2luaXQ8IGttcF9pbnQ2NCA+KCBsb2MsIGd0aWQsIHNjaGVkdWxlLCBsYiwgdWIsIHN0LCBjaHVuaywgdHJ1ZSApOworfQorCit2b2lkCitfX2ttcGNfZGlzdF9kaXNwYXRjaF9pbml0Xzh1KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCBlbnVtIHNjaGVkX3R5cGUgc2NoZWR1bGUsCisgICAga21wX2ludDMyICpwX2xhc3QsIGttcF91aW50NjQgbGIsIGttcF91aW50NjQgdWIsIGttcF9pbnQ2NCBzdCwga21wX2ludDY0IGNodW5rICkKK3sKKyAgICBLTVBfQ09VTlRfQkxPQ0soT01QX0ZPUl9keW5hbWljKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOworICAgIF9fa21wX2Rpc3RfZ2V0X2JvdW5kczwga21wX3VpbnQ2NCA+KCBsb2MsIGd0aWQsIHBfbGFzdCwgJmxiLCAmdWIsIHN0ICk7CisgICAgX19rbXBfZGlzcGF0Y2hfaW5pdDwga21wX3VpbnQ2NCA+KCBsb2MsIGd0aWQsIHNjaGVkdWxlLCBsYiwgdWIsIHN0LCBjaHVuaywgdHJ1ZSApOworfQorCisvKiEKK0BwYXJhbSBsb2MgU291cmNlIGNvZGUgbG9jYXRpb24KK0BwYXJhbSBndGlkIEdsb2JhbCB0aHJlYWQgaWQKK0BwYXJhbSBwX2xhc3QgUG9pbnRlciB0byBhIGZsYWcgc2V0IHRvIG9uZSBpZiB0aGlzIGlzIHRoZSBsYXN0IGNodW5rIG9yIHplcm8gb3RoZXJ3aXNlCitAcGFyYW0gcF9sYiAgIFBvaW50ZXIgdG8gdGhlIGxvd2VyIGJvdW5kIGZvciB0aGUgbmV4dCBjaHVuayBvZiB3b3JrCitAcGFyYW0gcF91YiAgIFBvaW50ZXIgdG8gdGhlIHVwcGVyIGJvdW5kIGZvciB0aGUgbmV4dCBjaHVuayBvZiB3b3JrCitAcGFyYW0gcF9zdCAgIFBvaW50ZXIgdG8gdGhlIHN0cmlkZSBmb3IgdGhlIG5leHQgY2h1bmsgb2Ygd29yaworQHJldHVybiBvbmUgaWYgdGhlcmUgaXMgd29yayB0byBiZSBkb25lLCB6ZXJvIG90aGVyd2lzZQorCitHZXQgdGhlIG5leHQgZHluYW1pY2FsbHkgYWxsb2NhdGVkIGNodW5rIG9mIHdvcmsgZm9yIHRoaXMgdGhyZWFkLgorSWYgdGhlcmUgaXMgbm8gbW9yZSB3b3JrLCB0aGVuIHRoZSBsYix1YiBhbmQgc3RyaWRlIG5lZWQgbm90IGJlIG1vZGlmaWVkLgorKi8KK2ludAorX19rbXBjX2Rpc3BhdGNoX25leHRfNCggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwga21wX2ludDMyICpwX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgKnBfbGIsIGttcF9pbnQzMiAqcF91Yiwga21wX2ludDMyICpwX3N0ICkKK3sKKyAgICByZXR1cm4gX19rbXBfZGlzcGF0Y2hfbmV4dDwga21wX2ludDMyID4oIGxvYywgZ3RpZCwgcF9sYXN0LCBwX2xiLCBwX3ViLCBwX3N0ICk7Cit9CisKKy8qIQorU2VlIEByZWYgX19rbXBjX2Rpc3BhdGNoX25leHRfNAorKi8KK2ludAorX19rbXBjX2Rpc3BhdGNoX25leHRfNHUoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIGttcF9pbnQzMiAqcF9sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAga21wX3VpbnQzMiAqcF9sYiwga21wX3VpbnQzMiAqcF91Yiwga21wX2ludDMyICpwX3N0ICkKK3sKKyAgICByZXR1cm4gX19rbXBfZGlzcGF0Y2hfbmV4dDwga21wX3VpbnQzMiA+KCBsb2MsIGd0aWQsIHBfbGFzdCwgcF9sYiwgcF91YiwgcF9zdCApOworfQorCisvKiEKK1NlZSBAcmVmIF9fa21wY19kaXNwYXRjaF9uZXh0XzQKKyovCitpbnQKK19fa21wY19kaXNwYXRjaF9uZXh0XzgoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIGttcF9pbnQzMiAqcF9sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDY0ICpwX2xiLCBrbXBfaW50NjQgKnBfdWIsIGttcF9pbnQ2NCAqcF9zdCApCit7CisgICAgcmV0dXJuIF9fa21wX2Rpc3BhdGNoX25leHQ8IGttcF9pbnQ2NCA+KCBsb2MsIGd0aWQsIHBfbGFzdCwgcF9sYiwgcF91YiwgcF9zdCApOworfQorCisvKiEKK1NlZSBAcmVmIF9fa21wY19kaXNwYXRjaF9uZXh0XzQKKyovCitpbnQKK19fa21wY19kaXNwYXRjaF9uZXh0Xzh1KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCBrbXBfaW50MzIgKnBfbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGttcF91aW50NjQgKnBfbGIsIGttcF91aW50NjQgKnBfdWIsIGttcF9pbnQ2NCAqcF9zdCApCit7CisgICAgcmV0dXJuIF9fa21wX2Rpc3BhdGNoX25leHQ8IGttcF91aW50NjQgPiggbG9jLCBndGlkLCBwX2xhc3QsIHBfbGIsIHBfdWIsIHBfc3QgKTsKK30KKworLyohCitAcGFyYW0gbG9jIFNvdXJjZSBjb2RlIGxvY2F0aW9uCitAcGFyYW0gZ3RpZCBHbG9iYWwgdGhyZWFkIGlkCisKK01hcmsgdGhlIGVuZCBvZiBhIGR5bmFtaWMgbG9vcC4KKyovCit2b2lkCitfX2ttcGNfZGlzcGF0Y2hfZmluaV80KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBfX2ttcF9kaXNwYXRjaF9maW5pc2g8IGttcF91aW50MzIgPiggZ3RpZCwgbG9jICk7Cit9CisKKy8qIQorU2VlIEByZWYgX19rbXBjX2Rpc3BhdGNoX2ZpbmlfNAorKi8KK3ZvaWQKK19fa21wY19kaXNwYXRjaF9maW5pXzgoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQgKQoreworICAgIF9fa21wX2Rpc3BhdGNoX2ZpbmlzaDwga21wX3VpbnQ2NCA+KCBndGlkLCBsb2MgKTsKK30KKworLyohCitTZWUgQHJlZiBfX2ttcGNfZGlzcGF0Y2hfZmluaV80CisqLwordm9pZAorX19rbXBjX2Rpc3BhdGNoX2ZpbmlfNHUoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQgKQoreworICAgIF9fa21wX2Rpc3BhdGNoX2ZpbmlzaDwga21wX3VpbnQzMiA+KCBndGlkLCBsb2MgKTsKK30KKworLyohCitTZWUgQHJlZiBfX2ttcGNfZGlzcGF0Y2hfZmluaV80CisqLwordm9pZAorX19rbXBjX2Rpc3BhdGNoX2ZpbmlfOHUoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQgKQoreworICAgIF9fa21wX2Rpc3BhdGNoX2ZpbmlzaDwga21wX3VpbnQ2NCA+KCBndGlkLCBsb2MgKTsKK30KKy8qISBAfSAqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvL05vbi10ZW1wbGF0ZSByb3V0aW5lcyBmcm9tIGttcF9kaXNwYXRjaC5jIHVzZWQgaW4gb3RoZXIgc291cmNlcworCitrbXBfdWludDMyIF9fa21wX2VxXzQoIGttcF91aW50MzIgdmFsdWUsIGttcF91aW50MzIgY2hlY2tlcikgeworICAgIHJldHVybiB2YWx1ZSA9PSBjaGVja2VyOworfQorCitrbXBfdWludDMyIF9fa21wX25lcV80KCBrbXBfdWludDMyIHZhbHVlLCBrbXBfdWludDMyIGNoZWNrZXIpIHsKKyAgICByZXR1cm4gdmFsdWUgIT0gY2hlY2tlcjsKK30KKwora21wX3VpbnQzMiBfX2ttcF9sdF80KCBrbXBfdWludDMyIHZhbHVlLCBrbXBfdWludDMyIGNoZWNrZXIpIHsKKyAgICByZXR1cm4gdmFsdWUgPCBjaGVja2VyOworfQorCitrbXBfdWludDMyIF9fa21wX2dlXzQoIGttcF91aW50MzIgdmFsdWUsIGttcF91aW50MzIgY2hlY2tlcikgeworICAgIHJldHVybiB2YWx1ZSA+PSBjaGVja2VyOworfQorCitrbXBfdWludDMyIF9fa21wX2xlXzQoIGttcF91aW50MzIgdmFsdWUsIGttcF91aW50MzIgY2hlY2tlcikgeworICAgIHJldHVybiB2YWx1ZSA8PSBjaGVja2VyOworfQora21wX3VpbnQzMiBfX2ttcF9lcV84KCBrbXBfdWludDY0IHZhbHVlLCBrbXBfdWludDY0IGNoZWNrZXIpIHsKKyAgICByZXR1cm4gdmFsdWUgPT0gY2hlY2tlcjsKK30KKwora21wX3VpbnQzMiBfX2ttcF9uZXFfOCgga21wX3VpbnQ2NCB2YWx1ZSwga21wX3VpbnQ2NCBjaGVja2VyKSB7CisgICAgcmV0dXJuIHZhbHVlICE9IGNoZWNrZXI7Cit9CisKK2ttcF91aW50MzIgX19rbXBfbHRfOCgga21wX3VpbnQ2NCB2YWx1ZSwga21wX3VpbnQ2NCBjaGVja2VyKSB7CisgICAgcmV0dXJuIHZhbHVlIDwgY2hlY2tlcjsKK30KKwora21wX3VpbnQzMiBfX2ttcF9nZV84KCBrbXBfdWludDY0IHZhbHVlLCBrbXBfdWludDY0IGNoZWNrZXIpIHsKKyAgICByZXR1cm4gdmFsdWUgPj0gY2hlY2tlcjsKK30KKwora21wX3VpbnQzMiBfX2ttcF9sZV84KCBrbXBfdWludDY0IHZhbHVlLCBrbXBfdWludDY0IGNoZWNrZXIpIHsKKyAgICByZXR1cm4gdmFsdWUgPD0gY2hlY2tlcjsKK30KKwora21wX3VpbnQzMgorX19rbXBfd2FpdF95aWVsZF80KHZvbGF0aWxlIGttcF91aW50MzIgKiBzcGlubmVyLAorICAgICAgICAgICAgICAgICAgIGttcF91aW50MzIgICAgICAgICAgICBjaGVja2VyLAorICAgICAgICAgICAgICAgICAgIGttcF91aW50MzIgKCogcHJlZCkoIGttcF91aW50MzIsIGttcF91aW50MzIgKQorICAgICAgICAgICAgICAgICAgICwgdm9pZCAgICAgICAgKiBvYmogICAgLy8gSGlnaGVyLWxldmVsIHN5bmNocm9uaXphdGlvbiBvYmplY3QsIG9yIE5VTEwuCisgICAgICAgICAgICAgICAgICAgKQoreworICAgIC8vIG5vdGU6IHdlIG1heSBub3QgYmVsb25nIHRvIGEgdGVhbSBhdCB0aGlzIHBvaW50CisgICAgcmVnaXN0ZXIgdm9sYXRpbGUga21wX3VpbnQzMiAgICAgICAgICogc3BpbiAgICAgICAgICA9IHNwaW5uZXI7CisgICAgcmVnaXN0ZXIgICAgICAgICAga21wX3VpbnQzMiAgICAgICAgICAgY2hlY2sgICAgICAgICA9IGNoZWNrZXI7CisgICAgcmVnaXN0ZXIgICAgICAgICAga21wX3VpbnQzMiAgIHNwaW5zOworICAgIHJlZ2lzdGVyICAgICAgICAgIGttcF91aW50MzIgKCpmKSAoIGttcF91aW50MzIsIGttcF91aW50MzIgKSA9IHByZWQ7CisgICAgcmVnaXN0ZXIgICAgICAgICAga21wX3VpbnQzMiAgICAgICAgICAgcjsKKworICAgIEtNUF9GU1lOQ19TUElOX0lOSVQoIG9iaiwgKHZvaWQqKSBzcGluICk7CisgICAgS01QX0lOSVRfWUlFTEQoIHNwaW5zICk7CisgICAgLy8gbWFpbiB3YWl0IHNwaW4gbG9vcAorICAgIHdoaWxlKCFmKHIgPSBUQ1JfNCgqc3BpbiksIGNoZWNrKSkgeworICAgICAgICBLTVBfRlNZTkNfU1BJTl9QUkVQQVJFKCBvYmogKTsKKyAgICAgICAgLyogR0VIIC0gcmVtb3ZlIHRoaXMgc2luY2UgaXQgd2FzIGFjY2lkZW50YWxseSBpbnRyb2R1Y2VkIHdoZW4ga21wX3dhaXQgd2FzIHNwbGl0LgorICAgICAgICAgICBJdCBjYXVzZXMgcHJvYmxlbXMgd2l0aCBpbmZpbml0ZSByZWN1cnNpb24gYmVjYXVzZSBvZiBleGl0IGxvY2sgKi8KKyAgICAgICAgLyogaWYgKCBUQ1JfNChfX2ttcF9nbG9iYWwuZy5nX2RvbmUpICYmIF9fa21wX2dsb2JhbC5nLmdfYWJvcnQpCisgICAgICAgICAgICBfX2ttcF9hYm9ydF90aHJlYWQoKTsgKi8KKworICAgICAgICAvKiBpZiB3ZSBoYXZlIHdhaXRlZCBhIGJpdCwgb3IgYXJlIG92ZXJzdWJzY3JpYmVkLCB5aWVsZCAqLworICAgICAgICAvKiBwYXVzZSBpcyBpbiB0aGUgZm9sbG93aW5nIGNvZGUgKi8KKyAgICAgICAgS01QX1lJRUxEKCBUQ1JfNChfX2ttcF9udGgpID4gX19rbXBfYXZhaWxfcHJvYyApOworICAgICAgICBLTVBfWUlFTERfU1BJTiggc3BpbnMgKTsKKyAgICB9CisgICAgS01QX0ZTWU5DX1NQSU5fQUNRVUlSRUQoIG9iaiApOworICAgIHJldHVybiByOworfQorCitrbXBfdWludDY0CitfX2ttcF93YWl0X3lpZWxkXzgoIHZvbGF0aWxlIGttcF91aW50NjQgKiBzcGlubmVyLAorICAgICAgICAgICAgICAgICAgICBrbXBfdWludDY0ICAgICAgICAgICAgY2hlY2tlciwKKyAgICAgICAgICAgICAgICAgICAga21wX3VpbnQzMiAoKiBwcmVkKSgga21wX3VpbnQ2NCwga21wX3VpbnQ2NCApCisgICAgICAgICAgICAgICAgICAgICwgdm9pZCAgICAgICAgKiBvYmogICAgLy8gSGlnaGVyLWxldmVsIHN5bmNocm9uaXphdGlvbiBvYmplY3QsIG9yIE5VTEwuCisgICAgICAgICAgICAgICAgICAgICkKK3sKKyAgICAvLyBub3RlOiB3ZSBtYXkgbm90IGJlbG9uZyB0byBhIHRlYW0gYXQgdGhpcyBwb2ludAorICAgIHJlZ2lzdGVyIHZvbGF0aWxlIGttcF91aW50NjQgICAgICAgICAqIHNwaW4gICAgICAgICAgPSBzcGlubmVyOworICAgIHJlZ2lzdGVyICAgICAgICAgIGttcF91aW50NjQgICAgICAgICAgIGNoZWNrICAgICAgICAgPSBjaGVja2VyOworICAgIHJlZ2lzdGVyICAgICAgICAgIGttcF91aW50MzIgICBzcGluczsKKyAgICByZWdpc3RlciAgICAgICAgICBrbXBfdWludDMyICgqZikgKCBrbXBfdWludDY0LCBrbXBfdWludDY0ICkgPSBwcmVkOworICAgIHJlZ2lzdGVyICAgICAgICAgIGttcF91aW50NjQgICAgICAgICAgIHI7CisKKyAgICBLTVBfRlNZTkNfU1BJTl9JTklUKCBvYmosICh2b2lkKikgc3BpbiApOworICAgIEtNUF9JTklUX1lJRUxEKCBzcGlucyApOworICAgIC8vIG1haW4gd2FpdCBzcGluIGxvb3AKKyAgICB3aGlsZSghZihyID0gKnNwaW4sIGNoZWNrKSkKKyAgICB7CisgICAgICAgIEtNUF9GU1lOQ19TUElOX1BSRVBBUkUoIG9iaiApOworICAgICAgICAvKiBHRUggLSByZW1vdmUgdGhpcyBzaW5jZSBpdCB3YXMgYWNjaWRlbnRhbGx5IGludHJvZHVjZWQgd2hlbiBrbXBfd2FpdCB3YXMgc3BsaXQuCisgICAgICAgICAgIEl0IGNhdXNlcyBwcm9ibGVtcyB3aXRoIGluZmluaXRlIHJlY3Vyc2lvbiBiZWNhdXNlIG9mIGV4aXQgbG9jayAqLworICAgICAgICAvKiBpZiAoIFRDUl80KF9fa21wX2dsb2JhbC5nLmdfZG9uZSkgJiYgX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCkKKyAgICAgICAgICAgIF9fa21wX2Fib3J0X3RocmVhZCgpOyAqLworCisgICAgICAgIC8vIGlmIHdlIGFyZSBvdmVyc3Vic2NyaWJlZCwKKyAgICAgICAgLy8gb3IgaGF2ZSB3YWl0ZWQgYSBiaXQgKGFuZCBLTVBfTElCQVJSWT10aHJvdWdocHV0LCB0aGVuIHlpZWxkCisgICAgICAgIC8vIHBhdXNlIGlzIGluIHRoZSBmb2xsb3dpbmcgY29kZQorICAgICAgICBLTVBfWUlFTEQoIFRDUl80KF9fa21wX250aCkgPiBfX2ttcF9hdmFpbF9wcm9jICk7CisgICAgICAgIEtNUF9ZSUVMRF9TUElOKCBzcGlucyApOworICAgIH0KKyAgICBLTVBfRlNZTkNfU1BJTl9BQ1FVSVJFRCggb2JqICk7CisgICAgcmV0dXJuIHI7Cit9CisKK30gLy8gZXh0ZXJuICJDIgorCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisKK3ZvaWQKK19fa21wX2F1eF9kaXNwYXRjaF9pbml0XzQoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIGVudW0gc2NoZWRfdHlwZSBzY2hlZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBsYiwga21wX2ludDMyIHViLCBrbXBfaW50MzIgc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgY2h1bmssIGludCBwdXNoX3dzICkKK3sKKyAgICBfX2ttcF9kaXNwYXRjaF9pbml0PCBrbXBfaW50MzIgPiggbG9jLCBndGlkLCBzY2hlZHVsZSwgbGIsIHViLCBzdCwgY2h1bmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2hfd3MgKTsKK30KKwordm9pZAorX19rbXBfYXV4X2Rpc3BhdGNoX2luaXRfNHUoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIGVudW0gc2NoZWRfdHlwZSBzY2hlZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfdWludDMyIGxiLCBrbXBfdWludDMyIHViLCBrbXBfaW50MzIgc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIGNodW5rLCBpbnQgcHVzaF93cyApCit7CisgICAgX19rbXBfZGlzcGF0Y2hfaW5pdDwga21wX3VpbnQzMiA+KCBsb2MsIGd0aWQsIHNjaGVkdWxlLCBsYiwgdWIsIHN0LCBjaHVuaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2hfd3MgKTsKK30KKwordm9pZAorX19rbXBfYXV4X2Rpc3BhdGNoX2luaXRfOCggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwgZW51bSBzY2hlZF90eXBlIHNjaGVkdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDY0IGxiLCBrbXBfaW50NjQgdWIsIGttcF9pbnQ2NCBzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQ2NCBjaHVuaywgaW50IHB1c2hfd3MgKQoreworICAgIF9fa21wX2Rpc3BhdGNoX2luaXQ8IGttcF9pbnQ2NCA+KCBsb2MsIGd0aWQsIHNjaGVkdWxlLCBsYiwgdWIsIHN0LCBjaHVuaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaF93cyApOworfQorCit2b2lkCitfX2ttcF9hdXhfZGlzcGF0Y2hfaW5pdF84dSggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwgZW51bSBzY2hlZF90eXBlIHNjaGVkdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF91aW50NjQgbGIsIGttcF91aW50NjQgdWIsIGttcF9pbnQ2NCBzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50NjQgY2h1bmssIGludCBwdXNoX3dzICkKK3sKKyAgICBfX2ttcF9kaXNwYXRjaF9pbml0PCBrbXBfdWludDY0ID4oIGxvYywgZ3RpZCwgc2NoZWR1bGUsIGxiLCB1Yiwgc3QsIGNodW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaF93cyApOworfQorCit2b2lkCitfX2ttcF9hdXhfZGlzcGF0Y2hfZmluaV9jaHVua180KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBfX2ttcF9kaXNwYXRjaF9maW5pc2hfY2h1bms8IGttcF91aW50MzIgPiggZ3RpZCwgbG9jICk7Cit9CisKK3ZvaWQKK19fa21wX2F1eF9kaXNwYXRjaF9maW5pX2NodW5rXzgoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQgKQoreworICAgIF9fa21wX2Rpc3BhdGNoX2ZpbmlzaF9jaHVuazwga21wX3VpbnQ2NCA+KCBndGlkLCBsb2MgKTsKK30KKwordm9pZAorX19rbXBfYXV4X2Rpc3BhdGNoX2ZpbmlfY2h1bmtfNHUoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQgKQoreworICAgIF9fa21wX2Rpc3BhdGNoX2ZpbmlzaF9jaHVuazwga21wX3VpbnQzMiA+KCBndGlkLCBsb2MgKTsKK30KKwordm9pZAorX19rbXBfYXV4X2Rpc3BhdGNoX2ZpbmlfY2h1bmtfOHUoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQgKQoreworICAgIF9fa21wX2Rpc3BhdGNoX2ZpbmlzaF9jaHVuazwga21wX3VpbnQ2NCA+KCBndGlkLCBsb2MgKTsKK30KKworI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfZW52aXJvbm1lbnQuYyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9lbnZpcm9ubWVudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkNjljZTcKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfZW52aXJvbm1lbnQuYwpAQCAtMCwwICsxLDU5OSBAQAorLyoKKyAqIGttcF9lbnZpcm9ubWVudC5jIC0tIEhhbmRsZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgT1MtaW5kZXBlbmRlbnRseS4KKyAqICRSZXZpc2lvbjogNDMwODQgJAorICogJERhdGU6IDIwMTQtMDQtMTUgMDk6MTU6MTQgLTA1MDAgKFR1ZSwgMTUgQXByIDIwMTQpICQKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworLyoKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBXZSB1c2UgR2V0RW52aXJvbm1lbnRWYXJpYWJsZSBmb3IgV2luZG93cyogT1MgaW5zdGVhZCBvZiBnZXRlbnYgYmVjYXVzZSB0aGUgYWN0IG9mCisgICAgbG9hZGluZyBhIERMTCBvbiBXaW5kb3dzKiBPUyBtYWtlcyBhbnkgdXNlci1zZXQgZW52aXJvbm1lbnQgdmFyaWFibGVzIChpLmUuIHdpdGggcHV0ZW52KCkpCisgICAgdW5hdmFpbGFibGUuICBnZXRlbnYoKSBhcHBhcmVudGx5IGdldHMgYSBjbGVhbiBjb3B5IG9mIHRoZSBlbnYgdmFyaWFibGVzIGFzIHRoZXkgZXhpc3RlZAorICAgIGF0IHRoZSBzdGFydCBvZiB0aGUgcnVuLgorICAgIEpIIDEyLzIzLzIwMDIKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBPbiBXaW5kb3dzKiBPUywgdGhlcmUgYXJlIHR3byBlbnZpcm9ubWVudHMgKGF0IGxlYXN0LCBzZWUgYmVsb3cpOgorCisgICAgICAgIDEuIEVudmlyb25tZW50IG1haW50YWluZWQgYnkgV2luZG93cyogT1Mgb24gSUEtMzIgYXJjaGl0ZWN0dXJlLiAKKwkgICBBY2Nlc3NpYmxlIHRocm91Z2ggR2V0RW52aXJvbm1lbnRWYXJpYWJsZSgpLAorICAgICAgICAgICBTZXRFbnZpcm9ubWVudFZhcmlhYmxlKCksIGFuZCBHZXRFbnZpcm9ubWVudFN0cmluZ3MoKS4KKworICAgICAgICAyLiBFbnZpcm9ubWVudCBtYWludGFpbmVkIGJ5IEMgUlRMLiBBY2Nlc3NpYmxlIHRocm91Z2ggZ2V0ZW52KCksIHB1dGVudigpLgorCisgICAgcHV0ZW52KCkgZnVuY3Rpb24gdXBkYXRlcyBib3RoIEMgYW5kIFdpbmRvd3MqIE9TIG9uIElBLTMyIGFyY2hpdGVjdHVyZS4gZ2V0ZW52KCkgZnVuY3Rpb24gCisgICAgc2VhcmNoIGZvciB2YXJpYWJsZXMgaW4gQyBSVEwgZW52aXJvbm1lbnQgb25seS4gV2luZG93cyogT1Mgb24gSUEtMzIgYXJjaGl0ZWN0dXJlIGZ1bmN0aW9ucyB3b3JrICpvbmx5KiAKKyAgICB3aXRoIFdpbmRvd3MqIE9TIG9uIElBLTMyIGFyY2hpdGVjdHVyZS4KKworICAgIFdpbmRvd3MqIE9TIG9uIElBLTMyIGFyY2hpdGVjdHVyZSBtYWludGFpbmVkIGJ5IE9TLCBzbyB0aGVyZSBpcyBhbHdheXMgb25seSBvbmUgV2luZG93cyogT1Mgb24gCisgICAgSUEtMzIgYXJjaGl0ZWN0dXJlIHBlciBwcm9jZXNzLiBDaGFuZ2VzIGluIFdpbmRvd3MqIE9TIG9uIElBLTMyIGFyY2hpdGVjdHVyZSBhcmUgcHJvY2Vzcy12aXNpYmxlLgorCisgICAgQyBlbnZpcm9ubWVudCBtYWludGFpbmVkIGJ5IEMgUlRMLiBNdWx0aXBsZSBjb3BpZXMgb2YgQyBSVEwgbWF5IGJlIHByZXNlbnQgaW4gdGhlIHByb2Nlc3MsIGFuZAorICAgIGVhY2ggQyBSVEwgbWFpbnRhaW5zIGl0cyBvd24gZW52aXJvbm1lbnQuIDotKAorCisgICAgVGh1cywgcHJvcGVyIHdheSB0byB3b3JrIHdpdGggZW52aXJvbm1lbnQgb24gV2luZG93cyogT1MgaXM6CisKKyAgICAgICAgMS4gU2V0IHZhcmlhYmxlcyB3aXRoIHB1dGVudigpIGZ1bmN0aW9uIC0tIGJvdGggQyBhbmQgV2luZG93cyogT1Mgb24KKwkgICBJQS0zMiBhcmNoaXRlY3R1cmUgYXJlIGJlaW5nIHVwZGF0ZWQuIFdpbmRvd3MqIE9TIG9uIAorCSAgIElBLTMyIGFyY2hpdGVjdHVyZSBtYXkgYmUgY29uc2lkZXJlZCBhcyBwcmltYXJ5IHRhcmdldCwKKwkgICB3aGlsZSB1cGRhdGluZyBDIFJUTCBlbnZpcm9ubWVudCBpcyBhIGZyZWUgYm9udXMuCisKKyAgICAgICAgMi4gR2V0IHZhcmlhYmxlcyB3aXRoIEdldEVudmlyb25tZW50VmFyaWFibGUoKSAtLSBnZXRlbnYoKSBkb2VzIG5vdCAKKwkgICBzZWFyY2ggV2luZG93cyogT1Mgb24gSUEtMzIgYXJjaGl0ZWN0dXJlLCBhbmQgY2FuIG5vdCBzZWUgdmFyaWFibGVzCisJICAgc2V0IHdpdGggU2V0RW52aXJvbm1lbnRWYXJpYWJsZSgpLgorCisgICAgMjAwNy0wNC0wNSAtLSBsZXYKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpbmNsdWRlICJrbXBfZW52aXJvbm1lbnQuaCIKKworI2luY2x1ZGUgImttcF9vcy5oIiAgICAvLyBLTVBfT1NfKi4KKyNpbmNsdWRlICJrbXAuaCIgICAgICAgLy8KKyNpbmNsdWRlICJrbXBfc3RyLmgiICAgLy8gX19rbXBfc3RyXyooKS4KKyNpbmNsdWRlICJrbXBfaTE4bi5oIgorCisjaWYgS01QX09TX1VOSVgKKyAgICAjaW5jbHVkZSA8c3RkbGliLmg+ICAgIC8vIGdldGVudiwgc2V0ZW52LCB1bnNldGVudi4KKyAgICAjaW5jbHVkZSA8c3RyaW5nLmg+ICAgIC8vIHN0cmxlbiwgc3RyY3B5LgorICAgICNpZiBLTVBfT1NfTElOVVggfHwgS01QX09TX0ZSRUVCU0QKKyAgICAgICAgZXh0ZXJuIGNoYXIgKiAqIGVudmlyb247CisgICAgI2VsaWYgS01QX09TX0RBUldJTgorICAgICAgICAjaW5jbHVkZSA8Y3J0X2V4dGVybnMuaD4KKyAgICAgICAgI2RlZmluZSBlbnZpcm9uICgqX05TR2V0RW52aXJvbigpKQorICAgICNlbHNlCisgICAgICAgICNlcnJvciBVbmtub3duIG9yIHVuc3VwcG9ydGVkIE9TLgorICAgICNlbmRpZgorI2VsaWYgS01QX09TX1dJTkRPV1MKKyAgICAjaW5jbHVkZSA8d2luZG93cy5oPiAgIC8vIEdldEVudmlyb25tZW50VmFyaWFibGUsIFNldEVudmlyb25tZW50VmFyaWFibGUsIEdldExhc3RFcnJvci4KKyNlbHNlCisgICAgI2Vycm9yIFVua25vd24gb3IgdW5zdXBwb3J0ZWQgT1MuCisjZW5kaWYKKworCisvLyBUT0RPOiBFbGltaW5hdGUgZGlyZWN0IG1lbW9yeSBhbGxvY2F0aW9ucywgdXNlIHN0cmluZyBvcGVyYXRpb25zIGluc3RlYWQuCisKK3N0YXRpYyBpbmxpbmUKK3ZvaWQgKgorYWxsb2NhdGUoCisgICAgc2l6ZV90IHNpemUKKykgeworICAgIHZvaWQgKiBwdHIgPSBLTVBfSU5URVJOQUxfTUFMTE9DKCBzaXplICk7CisgICAgaWYgKCBwdHIgPT0gTlVMTCApIHsKKwlLTVBfRkFUQUwoIE1lbW9yeUFsbG9jRmFpbGVkICk7CisgICAgfTsgLy8gaWYKKyAgICByZXR1cm4gcHRyOworfSAvLyBhbGxvY2F0ZQorCisKK2NoYXIgKgorX19rbXBfZW52X2dldCggY2hhciBjb25zdCAqIG5hbWUgKSB7CisKKyAgICBjaGFyICogcmVzdWx0ID0gTlVMTDsKKworICAgICNpZiBLTVBfT1NfVU5JWAorICAgICAgICBjaGFyIGNvbnN0ICogdmFsdWUgPSBnZXRlbnYoIG5hbWUgKTsKKyAgICAgICAgaWYgKCB2YWx1ZSAhPSBOVUxMICkgeworICAgICAgICAgICAgc2l6ZV90IGxlbiA9IHN0cmxlbiggdmFsdWUgKSArIDE7CisgICAgICAgICAgICByZXN1bHQgPSAoY2hhciAqKSBLTVBfSU5URVJOQUxfTUFMTE9DKCBsZW4gKTsKKyAgICAgICAgICAgIGlmICggcmVzdWx0ID09IE5VTEwgKSB7CisJCUtNUF9GQVRBTCggTWVtb3J5QWxsb2NGYWlsZWQgKTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICBzdHJuY3B5KCByZXN1bHQsIHZhbHVlLCBsZW4gKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAjZWxpZiBLTVBfT1NfV0lORE9XUworICAgICAgICAvKgorICAgICAgICAgICAgV2UgdXNlIEdldEVudmlyb25tZW50VmFyaWFibGUgZm9yIFdpbmRvd3MqIE9TIGluc3RlYWQgb2YgZ2V0ZW52IGJlY2F1c2UgdGhlIGFjdCBvZgorICAgICAgICAgICAgbG9hZGluZyBhIERMTCBvbiBXaW5kb3dzKiBPUyBtYWtlcyBhbnkgdXNlci1zZXQgZW52aXJvbm1lbnQgdmFyaWFibGVzIChpLmUuIHdpdGggcHV0ZW52KCkpCisgICAgICAgICAgICB1bmF2YWlsYWJsZS4gIGdldGVudigpIGFwcGFyZW50bHkgZ2V0cyBhIGNsZWFuIGNvcHkgb2YgdGhlIGVudiB2YXJpYWJsZXMgYXMgdGhleSBleGlzdGVkCisgICAgICAgICAgICBhdCB0aGUgc3RhcnQgb2YgdGhlIHJ1bi4KKyAgICAgICAgICAgIEpIIDEyLzIzLzIwMDIKKyAgICAgICAgKi8KKyAgICAgICAgRFdPUkQgcmM7CisgICAgICAgIHJjID0gR2V0RW52aXJvbm1lbnRWYXJpYWJsZSggbmFtZSwgTlVMTCwgMCApOworICAgICAgICBpZiAoICEgcmMgKSB7CisgICAgICAgICAgICBEV09SRCBlcnJvciA9IEdldExhc3RFcnJvcigpOworICAgICAgICAgICAgaWYgKCBlcnJvciAhPSBFUlJPUl9FTlZWQVJfTk9UX0ZPVU5EICkgeworICAgICAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50R2V0RW52VmFyLCBuYW1lICksCisgICAgICAgICAgICAgICAgICAgIEtNUF9FUlIoIGVycm9yICksCisgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICAvLyBWYXJpYWJsZSBpcyBub3QgZm91bmQsIGl0J3Mgb2ssIGp1c3QgY29udGludWUuCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBEV09SRCBsZW4gPSByYzsKKyAgICAgICAgICAgIHJlc3VsdCA9IChjaGFyICopIEtNUF9JTlRFUk5BTF9NQUxMT0MoIGxlbiApOworICAgICAgICAgICAgaWYgKCByZXN1bHQgPT0gTlVMTCApIHsKKwkJS01QX0ZBVEFMKCBNZW1vcnlBbGxvY0ZhaWxlZCApOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgIHJjID0gR2V0RW52aXJvbm1lbnRWYXJpYWJsZSggbmFtZSwgcmVzdWx0LCBsZW4gKTsKKyAgICAgICAgICAgIGlmICggISByYyApIHsKKyAgICAgICAgICAgICAgICAvLyBHZXRFbnZpcm9ubWVudFZhcmlhYmxlKCkgbWF5IHJldHVybiAwIGlmIHZhcmlhYmxlIGlzIGVtcHR5LgorICAgICAgICAgICAgICAgIC8vIEluIHN1Y2ggYSBjYXNlIEdldExhc3RFcnJvcigpIHJldHVybnMgRVJST1JfU1VDQ0VTUy4KKyAgICAgICAgICAgICAgICBEV09SRCBlcnJvciA9IEdldExhc3RFcnJvcigpOworICAgICAgICAgICAgICAgIGlmICggZXJyb3IgIT0gRVJST1JfU1VDQ0VTUyApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVW5leHBlY3RlZCBlcnJvci4gVGhlIHZhcmlhYmxlIHNob3VsZCBiZSBpbiB0aGUgZW52aXJvbm1lbnQsCisgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBidWZmZXIgc2hvdWxkIGJlIGxhcmdlIGVub3VnaC4KKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgICAgICAgICAgICAgS01QX01TRyggQ2FudEdldEVudlZhciwgbmFtZSApLAorICAgICAgICAgICAgICAgICAgICAgICAgS01QX0VSUiggZXJyb3IgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgICAgIEtNUF9JTlRFUk5BTF9GUkVFKCAodm9pZCAqKSByZXN1bHQgKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gTlVMTDsKKyAgICAgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgfTsgLy8gaWYKKyAgICAjZWxzZQorICAgICAgICAjZXJyb3IgVW5rbm93biBvciB1bnN1cHBvcnRlZCBPUy4KKyAgICAjZW5kaWYKKworICAgIHJldHVybiByZXN1bHQ7CisKK30gLy8gZnVuYyBfX2ttcF9lbnZfZ2V0CisKKworLy8gVE9ETzogRmluZCBhbmQgcmVwbGFjZSBhbGwgcmVndWxhciBmcmVlKCkgd2l0aCBfX2ttcF9lbnZfZnJlZSgpLgorCit2b2lkCitfX2ttcF9lbnZfZnJlZSggY2hhciBjb25zdCAqICogdmFsdWUgKSB7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB2YWx1ZSAhPSBOVUxMICk7CisgICAgS01QX0lOVEVSTkFMX0ZSRUUoICh2b2lkICopICogdmFsdWUgKTsKKyAgICAqIHZhbHVlID0gTlVMTDsKKworfSAvLyBmdW5jIF9fa21wX2Vudl9mcmVlCisKKworCitpbnQKK19fa21wX2Vudl9leGlzdHMoIGNoYXIgY29uc3QgKiBuYW1lICkgeworCisgICAgI2lmIEtNUF9PU19VTklYCisgICAgICAgIGNoYXIgY29uc3QgKiB2YWx1ZSA9IGdldGVudiggbmFtZSApOworICAgICAgICByZXR1cm4gKCAoIHZhbHVlID09IE5VTEwgKSA/ICggMCApIDogKCAxICkgKTsKKyAgICAjZWxpZiBLTVBfT1NfV0lORE9XUworICAgICAgICBEV09SRCByYzsKKyAgICAgICAgcmMgPSBHZXRFbnZpcm9ubWVudFZhcmlhYmxlKCBuYW1lLCBOVUxMLCAwICk7CisgICAgICAgIGlmICggcmMgPT0gMCApIHsKKyAgICAgICAgICAgIERXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgICAgICBpZiAoIGVycm9yICE9IEVSUk9SX0VOVlZBUl9OT1RfRk9VTkQgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coIENhbnRHZXRFbnZWYXIsIG5hbWUgKSwKKyAgICAgICAgICAgICAgICAgICAgS01QX0VSUiggZXJyb3IgKSwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9OyAvLyBpZgorICAgICAgICByZXR1cm4gMTsKKyAgICAjZWxzZQorICAgICAgICAjZXJyb3IgVW5rbm93biBvciB1bnN1cHBvcnRlZCBPUy4KKyAgICAjZW5kaWYKKworfSAvLyBmdW5jIF9fa21wX2Vudl9leGlzdHMKKworCisKK3ZvaWQKK19fa21wX2Vudl9zZXQoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIGludCBvdmVyd3JpdGUgKSB7CisKKyAgICAjaWYgS01QX09TX1VOSVgKKyAgICAgICAgaW50IHJjID0gc2V0ZW52KCBuYW1lLCB2YWx1ZSwgb3ZlcndyaXRlICk7CisgICAgICAgIGlmICggcmMgIT0gMCApIHsKKyAgICAgICAgICAgIC8vIERlYWQgY29kZS4gSSB0cmllZCB0byBwdXQgdG9vIG1hbnkgdmFyaWFibGVzIGludG8gTGludXgqIE9TCisgICAgICAgICAgICAvLyBlbnZpcm9ubWVudCBvbiBJQS0zMiBhcmNoaXRlY3R1cmUuIFdoZW4gYXBwbGljYXRpb24gY29uc3VtZXMKKyAgICAgICAgICAgIC8vIG1vcmUgdGhhbiB+Mi41IEdCIG9mIG1lbW9yeSwgZW50aXJlIHN5c3RlbSBmZWVscyBiYWQuIFNvbWV0aW1lcworICAgICAgICAgICAgLy8gYXBwbGljYXRpb24gaXMga2lsbGVkIChieSBPUz8pLCBzb21ldGltZXMgc3lzdGVtIHN0b3BzIAorICAgICAgICAgICAgLy8gcmVzcG9uZGluZy4uLiBCdXQgdGhpcyBlcnJvciBtZXNzYWdlIG5ldmVyIGFwcGVhcnMuIC0tbG4KKyAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgS01QX01TRyggQ2FudFNldEVudlZhciwgbmFtZSApLAorICAgICAgICAgICAgICAgIEtNUF9ITlQoIE5vdEVub3VnaE1lbW9yeSApLAorICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICApOworICAgICAgICB9OyAvLyBpZgorICAgICNlbGlmIEtNUF9PU19XSU5ET1dTCisgICAgICAgIEJPT0wgcmM7CisgICAgICAgIGlmICggISBvdmVyd3JpdGUgKSB7CisgICAgICAgICAgICByYyA9IEdldEVudmlyb25tZW50VmFyaWFibGUoIG5hbWUsIE5VTEwsIDAgKTsKKyAgICAgICAgICAgIGlmICggcmMgKSB7CisgICAgICAgICAgICAgICAgLy8gVmFyaWFibGUgZXhpc3RzLCBkbyBub3Qgb3ZlcndyaXRlLgorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICBEV09SRCBlcnJvciA9IEdldExhc3RFcnJvcigpOworICAgICAgICAgICAgaWYgKCBlcnJvciAhPSBFUlJPUl9FTlZWQVJfTk9UX0ZPVU5EICkgeworICAgICAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50R2V0RW52VmFyLCBuYW1lICksCisgICAgICAgICAgICAgICAgICAgIEtNUF9FUlIoIGVycm9yICksCisgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgIH07IC8vIGlmCisgICAgICAgIHJjID0gU2V0RW52aXJvbm1lbnRWYXJpYWJsZSggbmFtZSwgdmFsdWUgKTsKKyAgICAgICAgaWYgKCAhIHJjICkgeworICAgICAgICAgICAgRFdPUkQgZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgS01QX01TRyggQ2FudFNldEVudlZhciwgbmFtZSApLAorICAgICAgICAgICAgICAgIEtNUF9FUlIoIGVycm9yICksCisgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICk7CisgICAgICAgIH07IC8vIGlmCisgICAgI2Vsc2UKKyAgICAgICAgI2Vycm9yIFVua25vd24gb3IgdW5zdXBwb3J0ZWQgT1MuCisgICAgI2VuZGlmCisKK30gLy8gZnVuYyBfX2ttcF9lbnZfc2V0CisKKworCit2b2lkCitfX2ttcF9lbnZfdW5zZXQoIGNoYXIgY29uc3QgKiBuYW1lICkgeworCisgICAgI2lmIEtNUF9PU19VTklYCisgICAgICAgIHVuc2V0ZW52KCBuYW1lICk7CisgICAgI2VsaWYgS01QX09TX1dJTkRPV1MKKyAgICAgICAgQk9PTCByYyA9IFNldEVudmlyb25tZW50VmFyaWFibGUoIG5hbWUsIE5VTEwgKTsKKyAgICAgICAgaWYgKCAhIHJjICkgeworICAgICAgICAgICAgRFdPUkQgZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgS01QX01TRyggQ2FudFNldEVudlZhciwgbmFtZSApLAorICAgICAgICAgICAgICAgIEtNUF9FUlIoIGVycm9yICksCisgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICk7CisgICAgICAgIH07IC8vIGlmCisgICAgI2Vsc2UKKyAgICAgICAgI2Vycm9yIFVua25vd24gb3IgdW5zdXBwb3J0ZWQgT1MuCisgICAgI2VuZGlmCisKK30gLy8gZnVuYyBfX2ttcF9lbnZfdW5zZXQKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvKgorICAgIEludGVsIE9wZW5NUCBSVEwgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGVudmlyb25tZW50OiBqdXN0IGEgc3RyaW5nIG9mIGNoYXJhY3RlcnMsIHZhcmlhYmxlcworICAgIGFyZSBzZXBhcmF0ZWQgd2l0aCB2ZXJ0aWNhbCBiYXJzLCBlLiBnLjoKKworICAgICAgICAiS01QX1dBUk5JTkdTPTB8S01QX0FGRklOSVRZPWNvbXBhY3R8IgorCisgICAgRW1wdHkgdmFyaWFibGVzIGFyZSBhbGxvd2VkIGFuZCBpZ25vcmVkOgorCisgICAgICAgICJ8fEtNUF9XQVJOSU5HUz0xfHwiCisKKyovCisKK3N0YXRpYwordm9pZAorX19fa21wX2Vudl9ibGtfcGFyc2Vfc3RyaW5nKAorICAgIGttcF9lbnZfYmxrX3QgKiBibG9jaywgICAvLyBNOiBFbnYgYmxvY2sgdG8gZmlsbC4KKyAgICBjaGFyIGNvbnN0ICogICAgZW52ICAgICAgLy8gSTogU3RyaW5nIHRvIHBhcnNlLgorKSB7CisKKyAgICBjaGFyIGNvbnN0IGNocl9kZWxpbWl0ZXIgICA9ICd8JzsKKyAgICBjaGFyIGNvbnN0IHN0cl9kZWxpbWl0ZXJbXSA9IHsgY2hyX2RlbGltaXRlciwgMCB9OworCisgICAgY2hhciAqICAgICAgICAgIGJ1bGsgICAgICAgPSBOVUxMOworICAgIGttcF9lbnZfdmFyX3QgKiB2YXJzICAgICAgID0gTlVMTDsKKyAgICBpbnQgICAgICAgICAgICAgY291bnQgICAgICA9IDA7ICAvLyBOdW1iZXIgb2YgdXNlZCBlbGVtZW50cyBpbiB2YXJzIGFycmF5LgorICAgIGludCAgICAgICAgICAgICBkZWxpbWl0ZXJzID0gMDsgIC8vIE51bWJlciBvZiBkZWxpbWl0ZXJzIGluIGlucHV0IHN0cmluZy4KKworICAgIC8vIENvcHkgb3JpZ2luYWwgc3RyaW5nLCB3ZSB3aWxsIG1vZGlmeSB0aGUgY29weS4KKyAgICBidWxrID0gX19rbXBfc3RyX2Zvcm1hdCggIiVzIiwgZW52ICk7CisKKyAgICAvLyBMb29wIHRocnUgYWxsIHRoZSB2YXJzIGluIGVudmlyb25tZW50IGJsb2NrLiBDb3VudCBkZWxpbWl0ZXJzIChtYXhpbXVtIG51bWJlciBvZiB2YXJpYWJsZXMKKyAgICAvLyBpcyBudW1iZXIgb2YgZGVsaW1pdGVycyBwbHVzIG9uZSkuCisgICAgeworICAgICAgICBjaGFyIGNvbnN0ICogcHRyID0gYnVsazsKKyAgICAgICAgZm9yICggOyA7ICkgeworICAgICAgICAgICAgcHRyID0gc3RyY2hyKCBwdHIsIGNocl9kZWxpbWl0ZXIgKTsKKyAgICAgICAgICAgIGlmICggcHRyID09IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgKysgZGVsaW1pdGVyczsKKyAgICAgICAgICAgIHB0ciArPSAxOworICAgICAgICB9OyAvLyBmb3JldmVyCisgICAgfQorCisgICAgLy8gQWxsb2NhdGUgdmFycyBhcnJheS4KKyAgICB2YXJzID0gKGttcF9lbnZfdmFyX3QgKikgYWxsb2NhdGUoICggZGVsaW1pdGVycyArIDEgKSAqIHNpemVvZigga21wX2Vudl92YXJfdCApICk7CisKKyAgICAvLyBMb29wIHRocnUgYWxsIHRoZSB2YXJpYWJsZXMuCisgICAgeworICAgICAgICBjaGFyICogdmFyOyAgICAgLy8gUG9pbnRlciB0byB2YXJpYWJsZSAoYm90aCBuYW1lIGFuZCB2YWx1ZSkuCisgICAgICAgIGNoYXIgKiBuYW1lOyAgICAvLyBQb2ludGVyIHRvIG5hbWUgb2YgdmFyaWFibGUuCisgICAgICAgIGNoYXIgKiB2YWx1ZTsgICAvLyBQb2ludGVyIHRvIHZhbHVlLgorICAgICAgICBjaGFyICogYnVmOyAgICAgLy8gQnVmZmVyIGZvciBfX2ttcF9zdHJfdG9rZW4oKSBmdW5jdGlvbi4KKyAgICAgICAgdmFyID0gX19rbXBfc3RyX3Rva2VuKCBidWxrLCBzdHJfZGVsaW1pdGVyLCAmIGJ1ZiApOyAgICAgIC8vIEdldCB0aGUgZmlyc3QgdmFyLgorICAgICAgICB3aGlsZSAoIHZhciAhPSBOVUxMICkgeworICAgICAgICAgICAgLy8gU2F2ZSBmb3VuZCB2YXJpYWJsZSBpbiB2YXJzIGFycmF5LgorICAgICAgICAgICAgX19rbXBfc3RyX3NwbGl0KCB2YXIsICc9JywgJiBuYW1lLCAmIHZhbHVlICk7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBjb3VudCA8IGRlbGltaXRlcnMgKyAxICk7CisgICAgICAgICAgICB2YXJzWyBjb3VudCBdLm5hbWUgID0gbmFtZTsKKyAgICAgICAgICAgIHZhcnNbIGNvdW50IF0udmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgICAgICsrIGNvdW50OworICAgICAgICAgICAgLy8gR2V0IHRoZSBuZXh0IHZhci4KKyAgICAgICAgICAgIHZhciA9IF9fa21wX3N0cl90b2tlbiggTlVMTCwgc3RyX2RlbGltaXRlciwgJiBidWYgKTsKKyAgICAgICAgfTsgLy8gd2hpbGUKKyAgICB9CisKKyAgICAvLyBGaWxsIG91dCByZXN1bHQuCisgICAgYmxvY2stPmJ1bGsgID0gYnVsazsKKyAgICBibG9jay0+dmFycyAgPSB2YXJzOworICAgIGJsb2NrLT5jb3VudCA9IGNvdW50OworCit9OyAvLyBfX19rbXBfZW52X2Jsa19wYXJzZV9zdHJpbmcKKworCisKKy8qCisgICAgV2luZG93cyogT1MgKGFjdHVhbGx5LCBET1MpIGVudmlyb25tZW50IGJsb2NrIGlzIGEgcGllY2Ugb2YgbWVtb3J5IHdpdGggZW52aXJvbm1lbnQgdmFyaWFibGVzLiBFYWNoCisgICAgdmFyaWFibGUgaXMgdGVybWluYXRlZCB3aXRoIHplcm8gYnl0ZSwgZW50aXJlIGJsb2NrIGlzIHRlcm1pbmF0ZWQgd2l0aCBvbmUgZXh0cmEgemVybyBieXRlLCBzbworICAgIHdlIGhhdmUgdHdvIHplcm8gYnl0ZXMgYXQgdGhlIGVuZCBvZiBlbnZpcm9ubWVudCBibG9jaywgZS4gZy46CisKKyAgICAgICAgIkhPTUU9QzpcXHVzZXJzXFxsZXZceDAwT1M9V2luZG93c19OVFx4MDBceDAwIgorCisgICAgSXQgaXMgbm90IGNsZWFyIGhvdyBlbXB0eSBlbnZpcm9ubWVudCBpcyByZXByZXNlbnRlZC4gIlx4MDBceDAwIj8KKyovCisKK3N0YXRpYwordm9pZAorX19fa21wX2Vudl9ibGtfcGFyc2Vfd2luZG93cygKKyAgICBrbXBfZW52X2Jsa190ICogYmxvY2ssICAgLy8gTTogRW52IGJsb2NrIHRvIGZpbGwuCisgICAgY2hhciBjb25zdCAqICAgIGVudiAgICAgIC8vIEk6IFBvaW50ZXIgdG8gV2luZG93cyogT1MgKERPUykgZW52aXJvbm1lbnQgYmxvY2suCispIHsKKworICAgIGNoYXIgKiAgICAgICAgICBidWxrICA9IE5VTEw7CisgICAga21wX2Vudl92YXJfdCAqIHZhcnMgID0gTlVMTDsKKyAgICBpbnQgICAgICAgICAgICAgY291bnQgPSAwOyAgICAgLy8gTnVtYmVyIG9mIHVzZWQgZWxlbWVudHMgaW4gdmFycyBhcnJheS4KKyAgICBpbnQgICAgICAgICAgICAgc2l6ZSAgPSAwOyAgICAgLy8gU2l6ZSBvZiBidWxrLgorCisgICAgY2hhciAqIG5hbWU7ICAgIC8vIFBvaW50ZXIgdG8gbmFtZSBvZiB2YXJpYWJsZS4KKyAgICBjaGFyICogdmFsdWU7ICAgLy8gUG9pbnRlciB0byB2YWx1ZS4KKworICAgIGlmICggZW52ICE9IE5VTEwgKSB7CisKKyAgICAgICAgLy8gTG9vcCB0aHJ1IGFsbCB0aGUgdmFycyBpbiBlbnZpcm9ubWVudCBibG9jay4gQ291bnQgdmFyaWFibGVzLCBmaW5kIHNpemUgb2YgYmxvY2suCisgICAgICAgIHsKKyAgICAgICAgICAgIGNoYXIgY29uc3QgKiB2YXI7ICAgICAvLyBQb2ludGVyIHRvIGJlZ2lubmluZyBvZiB2YXIuCisgICAgICAgICAgICBpbnQgICAgICAgICAgbGVuOyAgICAgLy8gTGVuZ3RoIG9mIHZhcmlhYmxlLgorICAgICAgICAgICAgY291bnQgPSAwOworICAgICAgICAgICAgdmFyID0gZW52OyAgICAgICAgICAgIC8vIFRoZSBmaXJzdCB2YXJpYWJsZSBzdGFydHMgYW5kIGJlZ2lubmluZyBvZiBlbnZpcm9ubWVudCBibG9jay4KKyAgICAgICAgICAgIGxlbiA9IHN0cmxlbiggdmFyICk7CisgICAgICAgICAgICB3aGlsZSAoIGxlbiAhPSAwICkgeworICAgICAgICAgICAgICAgICsrIGNvdW50OworICAgICAgICAgICAgICAgIHNpemUgPSBzaXplICsgbGVuICsgMTsKKyAgICAgICAgICAgICAgICB2YXIgPSB2YXIgKyBsZW4gKyAxOyAvLyBNb3ZlIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbmV4dCB2YXJpYWJsZS4KKyAgICAgICAgICAgICAgICBsZW4gPSBzdHJsZW4oIHZhciApOworICAgICAgICAgICAgfTsgLy8gd2hpbGUKKyAgICAgICAgICAgIHNpemUgPSBzaXplICsgMTsgICAgICAgICAvLyBUb3RhbCBzaXplIG9mIGVudiBibG9jaywgaW5jbHVkaW5nIHRlcm1pbmF0aW5nIHplcm8gYnl0ZS4KKyAgICAgICAgfQorCisgICAgICAgIC8vIENvcHkgb3JpZ2luYWwgYmxvY2sgdG8gYnVsaywgd2Ugd2lsbCBtb2RpZnkgYnVsaywgbm90IG9yaWdpbmFsIGJsb2NrLgorICAgICAgICBidWxrID0gKGNoYXIgKikgYWxsb2NhdGUoIHNpemUgKTsKKyAgICAgICAgbWVtY3B5KCBidWxrLCBlbnYsIHNpemUgKTsKKyAgICAgICAgLy8gQWxsb2NhdGUgdmFycyBhcnJheS4KKyAgICAgICAgdmFycyA9IChrbXBfZW52X3Zhcl90ICopIGFsbG9jYXRlKCBjb3VudCAqIHNpemVvZigga21wX2Vudl92YXJfdCApICk7CisKKyAgICAgICAgLy8gTG9vcCB0aHJ1IGFsbCB0aGUgdmFycywgbm93IGluIGJ1bGsuCisgICAgICAgIHsKKyAgICAgICAgICAgIGNoYXIgKiB2YXI7ICAgICAvLyBQb2ludGVyIHRvIGJlZ2lubmluZyBvZiB2YXIuCisgICAgICAgICAgICBpbnQgICAgbGVuOyAgICAgLy8gTGVuZ3RoIG9mIHZhcmlhYmxlLgorICAgICAgICAgICAgY291bnQgPSAwOworICAgICAgICAgICAgdmFyID0gYnVsazsKKyAgICAgICAgICAgIGxlbiA9IHN0cmxlbiggdmFyICk7CisgICAgICAgICAgICB3aGlsZSAoIGxlbiAhPSAwICkgeworICAgICAgICAgICAgICAgIC8vIFNhdmUgdmFyaWFibGUgaW4gdmFycyBhcnJheS4KKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfc3BsaXQoIHZhciwgJz0nLCAmIG5hbWUsICYgdmFsdWUgKTsKKyAgICAgICAgICAgICAgICB2YXJzWyBjb3VudCBdLm5hbWUgID0gbmFtZTsKKyAgICAgICAgICAgICAgICB2YXJzWyBjb3VudCBdLnZhbHVlID0gdmFsdWU7CisgICAgICAgICAgICAgICAgKysgY291bnQ7CisgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBuZXh0IHZhci4KKyAgICAgICAgICAgICAgICB2YXIgPSB2YXIgKyBsZW4gKyAxOworICAgICAgICAgICAgICAgIGxlbiA9IHN0cmxlbiggdmFyICk7CisgICAgICAgICAgICB9OyAvLyB3aGlsZQorICAgICAgICB9CisKKyAgICB9OyAvLyBpZgorCisgICAgLy8gRmlsbCBvdXQgcmVzdWx0LgorICAgIGJsb2NrLT5idWxrICA9IGJ1bGs7CisgICAgYmxvY2stPnZhcnMgID0gdmFyczsKKyAgICBibG9jay0+Y291bnQgPSBjb3VudDsKKworfTsgLy8gX19fa21wX2Vudl9ibGtfcGFyc2Vfd2luZG93cworCisKKworLyoKKyAgICBVbml4IGVudmlyb25tZW50IGJsb2NrIGlzIGEgYXJyYXkgb2YgcG9pbnRlcnMgdG8gdmFyaWFibGVzLCBsYXN0IHBvaW50ZXIgaW4gYXJyYXkgaXMgTlVMTDoKKworICAgICAgICB7ICJIT01FPS9ob21lL2xldiIsICJURVJNPXh0ZXJtIiwgTlVMTCB9CisqLworCitzdGF0aWMKK3ZvaWQKK19fX2ttcF9lbnZfYmxrX3BhcnNlX3VuaXgoCisgICAga21wX2Vudl9ibGtfdCAqIGJsb2NrLCAgIC8vIE06IEVudiBibG9jayB0byBmaWxsLgorICAgIGNoYXIgKiAqICAgICAgICBlbnYgICAgICAvLyBJOiBVbml4IGVudmlyb25tZW50IHRvIHBhcnNlLgorKSB7CisKKyAgICBjaGFyICogICAgICAgICAgYnVsayAgPSBOVUxMOworICAgIGttcF9lbnZfdmFyX3QgKiB2YXJzICA9IE5VTEw7CisgICAgaW50ICAgICAgICAgICAgIGNvdW50ID0gMDsKKyAgICBpbnQgICAgICAgICAgICAgc2l6ZSAgPSAwOyAgICAvLyBTaXplIG9mIGJ1bGsuCisKKyAgICAvLyBDb3VudCBudW1iZXIgb2YgdmFyaWFibGVzIGFuZCBsZW5ndGggb2YgcmVxdWlyZWQgYnVsay4KKyAgICB7CisgICAgICAgIGNvdW50ID0gMDsKKyAgICAgICAgc2l6ZSAgPSAwOworICAgICAgICB3aGlsZSAoIGVudlsgY291bnQgXSAhPSBOVUxMICkgeworICAgICAgICAgICAgc2l6ZSArPSBzdHJsZW4oIGVudlsgY291bnQgXSApICsgMTsKKyAgICAgICAgICAgICsrIGNvdW50OworICAgICAgICB9OyAvLyB3aGlsZQorICAgIH0KKworICAgIC8vIEFsbG9jYXRlIG1lbW9yeS4KKyAgICBidWxrID0gKGNoYXIgKikgYWxsb2NhdGUoIHNpemUgKTsKKyAgICB2YXJzID0gKGttcF9lbnZfdmFyX3QgKikgYWxsb2NhdGUoIGNvdW50ICogc2l6ZW9mKCBrbXBfZW52X3Zhcl90ICkgKTsKKworICAgIC8vIExvb3AgdGhydSBhbGwgdGhlIHZhcnMuCisgICAgeworICAgICAgICBjaGFyICogdmFyOyAgICAgLy8gUG9pbnRlciB0byBiZWdpbm5pbmcgb2YgdmFyLgorICAgICAgICBjaGFyICogbmFtZTsgICAgLy8gUG9pbnRlciB0byBuYW1lIG9mIHZhcmlhYmxlLgorICAgICAgICBjaGFyICogdmFsdWU7ICAgLy8gUG9pbnRlciB0byB2YWx1ZS4KKyAgICAgICAgaW50ICAgIGxlbjsgICAgIC8vIExlbmd0aCBvZiB2YXJpYWJsZS4KKyAgICAgICAgaW50ICAgIGk7CisgICAgICAgIHZhciA9IGJ1bGs7CisgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgY291bnQ7ICsrIGkgKSB7CisgICAgICAgICAgICAvLyBDb3B5IHZhcmlhYmxlIHRvIGJ1bGsuCisgICAgICAgICAgICBsZW4gPSBzdHJsZW4oIGVudlsgaSBdICk7CisgICAgICAgICAgICBtZW1jcHkoIHZhciwgZW52WyBpIF0sIGxlbiArIDEgKTsKKyAgICAgICAgICAgIC8vIFNhdmUgZm91bmQgdmFyaWFibGUgaW4gdmFycyBhcnJheS4KKyAgICAgICAgICAgIF9fa21wX3N0cl9zcGxpdCggdmFyLCAnPScsICYgbmFtZSwgJiB2YWx1ZSApOworICAgICAgICAgICAgdmFyc1sgaSBdLm5hbWUgID0gbmFtZTsKKyAgICAgICAgICAgIHZhcnNbIGkgXS52YWx1ZSA9IHZhbHVlOworICAgICAgICAgICAgLy8gTW92ZSBwb2ludGVyLgorICAgICAgICAgICAgdmFyICs9IGxlbiArIDE7CisgICAgICAgIH07IC8vIGZvcgorICAgIH0KKworICAgIC8vIEZpbGwgb3V0IHJlc3VsdC4KKyAgICBibG9jay0+YnVsayAgPSBidWxrOworICAgIGJsb2NrLT52YXJzICA9IHZhcnM7CisgICAgYmxvY2stPmNvdW50ID0gY291bnQ7CisKK307IC8vIF9fX2ttcF9lbnZfYmxrX3BhcnNlX3VuaXgKKworCisKK3ZvaWQKK19fa21wX2Vudl9ibGtfaW5pdCgKKyAgICBrbXBfZW52X2Jsa190ICogYmxvY2ssICAvLyBNOiBCbG9jayB0byBpbml0aWFsaXplLgorICAgIGNoYXIgY29uc3QgKiAgICBidWxrICAgIC8vIEk6IEluaXRpYWxpemF0aW9uIHN0cmluZywgb3IgTlVMTC4KKykgeworCisgICAgaWYgKCBidWxrICE9IE5VTEwgKSB7CisgICAgICAgIF9fX2ttcF9lbnZfYmxrX3BhcnNlX3N0cmluZyggYmxvY2ssIGJ1bGsgKTsKKyAgICB9IGVsc2UgeworICAgICAgICAjaWYgS01QX09TX1VOSVgKKyAgICAgICAgICAgIF9fX2ttcF9lbnZfYmxrX3BhcnNlX3VuaXgoIGJsb2NrLCBlbnZpcm9uICk7CisgICAgICAgICNlbGlmIEtNUF9PU19XSU5ET1dTCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2hhciAqIG1lbSA9IEdldEVudmlyb25tZW50U3RyaW5ncygpOworICAgICAgICAgICAgICAgIGlmICggbWVtID09IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgICAgIERXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coIENhbnRHZXRFbnZpcm9ubWVudCApLAorICAgICAgICAgICAgICAgICAgICAgICAgS01QX0VSUiggZXJyb3IgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgICAgICBfX19rbXBfZW52X2Jsa19wYXJzZV93aW5kb3dzKCBibG9jaywgbWVtICk7CisgICAgICAgICAgICAgICAgRnJlZUVudmlyb25tZW50U3RyaW5ncyggbWVtICk7CisgICAgICAgICAgICB9CisgICAgICAgICNlbHNlCisgICAgICAgICAgICAjZXJyb3IgVW5rbm93biBvciB1bnN1cHBvcnRlZCBPUy4KKyAgICAgICAgI2VuZGlmCisgICAgfTsgLy8gaWYKKworfSAvLyBfX2ttcF9lbnZfYmxrX2luaXQKKworCisKK3N0YXRpYworaW50CitfX19rbXBfZW52X3Zhcl9jbXAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29tcGFyaXNvbiBmdW5jdGlvbiBmb3IgcXNvcnQoKS4KKyAgICBrbXBfZW52X3Zhcl90IGNvbnN0ICogbGhzLAorICAgIGttcF9lbnZfdmFyX3QgY29uc3QgKiByaHMKKykgeworICAgIHJldHVybiBzdHJjbXAoIGxocy0+bmFtZSwgcmhzLT5uYW1lICk7Cit9CisKK3ZvaWQKK19fa21wX2Vudl9ibGtfc29ydCgKKyAgICBrbXBfZW52X2Jsa190ICogYmxvY2sgIC8vIE06IEJsb2NrIG9mIGVudmlyb25tZW50IHZhcmlhYmxlcyB0byBzb3J0LgorKSB7CisKKyAgICBxc29ydCgKKyAgICAgICAgKHZvaWQgKikgYmxvY2stPnZhcnMsCisgICAgICAgIGJsb2NrLT5jb3VudCwKKyAgICAgICAgc2l6ZW9mKCBrbXBfZW52X3Zhcl90ICksCisgICAgICAgICggaW50ICggKiApKCB2b2lkIGNvbnN0ICosIHZvaWQgY29uc3QgKiApICkgJiBfX19rbXBfZW52X3Zhcl9jbXAKKyAgICApOworCit9IC8vIF9fa21wX2Vudl9ibG9ja19zb3J0CisKKworCit2b2lkCitfX2ttcF9lbnZfYmxrX2ZyZWUoCisgICAga21wX2Vudl9ibGtfdCAqIGJsb2NrICAvLyBNOiBCbG9jayBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gZnJlZS4KKykgeworCisgICAgS01QX0lOVEVSTkFMX0ZSRUUoICh2b2lkICopIGJsb2NrLT52YXJzICk7CisgICAgS01QX0lOVEVSTkFMX0ZSRUUoICh2b2lkICopIGJsb2NrLT5idWxrICk7CisKKyAgICBibG9jay0+Y291bnQgPSAwOworICAgIGJsb2NrLT52YXJzICA9IE5VTEw7CisgICAgYmxvY2stPmJ1bGsgID0gTlVMTDsKKworfSAvLyBfX2ttcF9lbnZfYmxrX2ZyZWUKKworCisKK2NoYXIgY29uc3QgKiAgICAgICAgICAgICAgIC8vIFI6IFZhbHVlIG9mIHZhcmlhYmxlIG9yIE5VTEwgaWYgdmFyaWFibGUgZG9lcyBub3QgZXhpc3QuCitfX2ttcF9lbnZfYmxrX3ZhcigKKyAgICBrbXBfZW52X2Jsa190ICogYmxvY2ssIC8vIEk6IEJsb2NrIG9mIGVudmlyb25tZW50IHZhcmlhYmxlcy4KKyAgICBjaGFyIGNvbnN0ICogICAgbmFtZSAgIC8vIEk6IE5hbWUgb2YgdmFyaWFibGUgdG8gZmluZC4KKykgeworCisgICAgaW50IGk7CisgICAgZm9yICggaSA9IDA7IGkgPCBibG9jay0+Y291bnQ7ICsrIGkgKSB7CisgICAgICAgIGlmICggc3RyY21wKCBibG9jay0+dmFyc1sgaSBdLm5hbWUsIG5hbWUgKSA9PSAwICkgeworICAgICAgICAgICAgcmV0dXJuIGJsb2NrLT52YXJzWyBpIF0udmFsdWU7CisgICAgICAgIH07IC8vIGlmCisgICAgfTsgLy8gZm9yCisgICAgcmV0dXJuIE5VTEw7CisKK30gLy8gX19rbXBfZW52X2Jsb2NrX3ZhcgorCisKKy8vIGVuZCBvZiBmaWxlIC8vCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfZW52aXJvbm1lbnQuaCBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9lbnZpcm9ubWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2NTUyNzcKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfZW52aXJvbm1lbnQuaApAQCAtMCwwICsxLDgzIEBACisvKgorICoga21wX2Vudmlyb25tZW50LmggLS0gSGFuZGxlIGVudmlyb25tZW50IHZhcm9pYWJsZXMgT1MtaW5kZXBlbmRlbnRseS4KKyAqICRSZXZpc2lvbjogNDI5NTEgJAorICogJERhdGU6IDIwMTQtMDEtMjEgMTQ6NDE6NDEgLTA2MDAgKFR1ZSwgMjEgSmFuIDIwMTQpICQKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBLTVBfRU5WSVJPTk1FTlRfSAorI2RlZmluZSBLTVBfRU5WSVJPTk1FTlRfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8vIFJldHVybiBhIGNvcHkgb2YgdGhlIHZhbHVlIG9mIGVudmlyb25tZW50IHZhcmlhYmxlIG9yIE5VTEwgaWYgdGhlIHZhcmlhYmxlIGRvZXMgbm90IGV4aXN0LgorLy8gKk5vdGUqOiBSZXR1cm5lZCBwb2ludGVkICptdXN0KiBiZSBmcmVlZCBhZnRlciB1c2Ugd2l0aCBfX2ttcF9lbnZfZnJlZSgpLgorY2hhciAqIF9fa21wX2Vudl9nZXQoIGNoYXIgY29uc3QgKiBuYW1lICk7Cit2b2lkICAgX19rbXBfZW52X2ZyZWUoIGNoYXIgY29uc3QgKiAqIHZhbHVlICk7CisKKy8vIFJldHVybiAxIGlmIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBleGlzdHMgb3IgMCBpZiBkb2VzIG5vdCBleGlzdC4KK2ludCBfX2ttcF9lbnZfZXhpc3RzKCBjaGFyIGNvbnN0ICogbmFtZSApOworCisvLyBTZXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlLgordm9pZCBfX2ttcF9lbnZfc2V0KCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCBpbnQgb3ZlcndyaXRlICk7CisKKy8vIFVuc2V0IChyZW1vdmUpIGVudmlyb25tZW50IHZhcmlhYmxlLgordm9pZCBfX2ttcF9lbnZfdW5zZXQoIGNoYXIgY29uc3QgKiBuYW1lICk7CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIFdvcmtpbmcgd2l0aCBlbnZpcm9ubWVudCBibG9ja3MuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8qCisgICAga21wX2Vudl9ibGtfdCBpcyByZWFkLW9ubHkgY29sbGVjdGlvbiBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgKG9yIGVudmlyb25tZW50LWxpa2UpLiBVc2FnZToKKworICAgICAgICBrbXBfZW52X2Jsa190IGJsb2NrOworICAgICAgICBfX2ttcF9lbnZfYmxrX2luaXQoICYgYmxvY2ssIE5VTEwgKTsgLy8gSW5pdGlhbGl6ZSBibG9jayBmcm9tIHByb2Nlc3MgZW52aXJvbm1lbnQuCisgICAgICAgIC8vIG9yCisgICAgICAgIF9fa21wX2Vudl9ibGtfaW5pdCggJiBibG9jaywgIktNUF9XQVJOSU5HPTF8S01QX0FGRklOSVRZPW5vbmUiICk7IC8vIGZyb20gc3RyaW5nLgorICAgICAgICBfX2ttcF9lbnZfYmxrX3NvcnQoICYgYmxvY2sgKTsgLy8gT3B0aW9uYWxseSwgc29ydCBsaXN0LgorICAgICAgICBmb3IgKCBpID0gMDsgaSA8IGJsb2NrLmNvdW50OyArKyBpICkgeworICAgICAgICAgICAgLy8gUHJvY2VzcyBibG9jay52YXJzWyBpIF0ubmFtZSBhbmQgYmxvY2sudmFyc1sgaSBdLnZhbHVlLi4uCisgICAgICAgIH07IC8vIGZvciBpCisgICAgICAgIF9fa21wX2Vudl9ibG9ja19mcmVlKCAmIGJsb2NrICk7CisqLworCitzdHJ1Y3QgX19rbXBfZW52X3ZhciB7CisgICAgY2hhciBjb25zdCAqIG5hbWU7CisgICAgY2hhciBjb25zdCAqIHZhbHVlOworfTsKK3R5cGVkZWYgc3RydWN0IF9fa21wX2Vudl92YXIga21wX2Vudl92YXJfdDsKKworc3RydWN0IF9fa21wX2Vudl9ibGsgeworICAgIGNoYXIgY29uc3QgKiAgICAgICAgICBidWxrOworICAgIGttcF9lbnZfdmFyX3QgY29uc3QgKiB2YXJzOworICAgIGludCAgICAgICAgICAgICAgICAgICBjb3VudDsKK307Cit0eXBlZGVmIHN0cnVjdCBfX2ttcF9lbnZfYmxrIGttcF9lbnZfYmxrX3Q7CisKK3ZvaWQgICAgICAgICBfX2ttcF9lbnZfYmxrX2luaXQoIGttcF9lbnZfYmxrX3QgKiBibG9jaywgY2hhciBjb25zdCAqIGJ1bGsgKTsKK3ZvaWQgICAgICAgICBfX2ttcF9lbnZfYmxrX2ZyZWUoIGttcF9lbnZfYmxrX3QgKiBibG9jayApOwordm9pZCAgICAgICAgIF9fa21wX2Vudl9ibGtfc29ydCgga21wX2Vudl9ibGtfdCAqIGJsb2NrICk7CitjaGFyIGNvbnN0ICogX19rbXBfZW52X2Jsa192YXIoICBrbXBfZW52X2Jsa190ICogYmxvY2ssIGNoYXIgY29uc3QgKiBuYW1lICk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvLyBLTVBfRU5WSVJPTk1FTlRfSAorCisvLyBlbmQgb2YgZmlsZSAvLworCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfZXJyb3IuYyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9lcnJvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiNjliMmUKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfZXJyb3IuYwpAQCAtMCwwICsxLDUyNiBAQAorLyogCisgKiBrbXBfZXJyb3IuYyAtLSBLUFRTIGZ1bmN0aW9ucyBmb3IgZXJyb3IgY2hlY2tpbmcgYXQgcnVudGltZQorICogJFJldmlzaW9uOiA0Mjk1MSAkCisgKiAkRGF0ZTogMjAxNC0wMS0yMSAxNDo0MTo0MSAtMDYwMCAoVHVlLCAyMSBKYW4gMjAxNCkgJAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAia21wLmgiCisjaW5jbHVkZSAia21wX2kxOG4uaCIKKyNpbmNsdWRlICJrbXBfc3RyLmgiCisjaW5jbHVkZSAia21wX2Vycm9yLmgiCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgTUlOX1NUQUNLICAgICAgIDEwMAorCitzdGF0aWMgY2hhciBjb25zdCAqIGNvbnNfdGV4dF9mb3J0W10gPSB7CisgICAgIihub25lKSIsCisgICAgIlBBUkFMTEVMIiwKKyAgICAid29yay1zaGFyaW5nIiwgICAgICAgICAgICAgLyogdGhpcyBpcyBub3QgY2FsbGVkIERPIGJlY2F1c2Ugb2YgbG93ZXJpbmcgb2YgU0VDVElPTlMgYW5kIFdPUktTSEFSRSBkaXJlY3RpdmVzICovCisgICAgIk9SREVSRUQgd29yay1zaGFyaW5nIiwgICAgIC8qIHRoaXMgaXMgbm90IGNhbGxlZCBETyBPUkRFUkVEIGJlY2F1c2Ugb2YgbG93ZXJpbmcgb2YgU0VDVElPTlMgZGlyZWN0aXZlcyAqLworICAgICJTRUNUSU9OUyIsCisgICAgIndvcmstc2hhcmluZyIsICAgICAgICAgICAgIC8qIHRoaXMgaXMgbm90IGNhbGxlZCBTSU5HTEUgYmVjYXVzZSBvZiBsb3dlcmluZyBvZiBTRUNUSU9OUyBhbmQgV09SS1NIQVJFIGRpcmVjdGl2ZXMgKi8KKyAgICAiVEFTS1EiLAorICAgICJUQVNLUSIsCisgICAgIlRBU0tRIE9SREVSRUQiLAorICAgICJDUklUSUNBTCIsCisgICAgIk9SREVSRUQiLCAgICAgICAgICAgICAgICAgIC8qIGluIFBBUkFMTEVMICovCisgICAgIk9SREVSRUQiLCAgICAgICAgICAgICAgICAgIC8qIGluIFBETyAqLworICAgICJPUkRFUkVEIiwgICAgICAgICAgICAgICAgICAvKiBpbiBUQVNLUSAqLworICAgICJNQVNURVIiLAorICAgICJSRURVQ0UiLAorICAgICJCQVJSSUVSIgorfTsKKworc3RhdGljIGNoYXIgY29uc3QgKiBjb25zX3RleHRfY1tdID0geworICAgICIobm9uZSkiLAorICAgICJcInBhcmFsbGVsXCIiLAorICAgICJ3b3JrLXNoYXJpbmciLCAgICAgICAgICAgICAvKiB0aGlzIGlzIG5vdCBjYWxsZWQgImZvciIgYmVjYXVzZSBvZiBsb3dlcmluZyBvZiAic2VjdGlvbnMiIHByYWdtYXMgKi8KKyAgICAiXCJvcmRlcmVkXCIgd29yay1zaGFyaW5nIiwgLyogdGhpcyBpcyBub3QgY2FsbGVkICJmb3Igb3JkZXJlZCIgYmVjYXVzZSBvZiBsb3dlcmluZyBvZiAic2VjdGlvbnMiIHByYWdtYXMgKi8KKyAgICAiXCJzZWN0aW9uc1wiIiwKKyAgICAid29yay1zaGFyaW5nIiwgICAgICAgICAgICAgLyogdGhpcyBpcyBub3QgY2FsbGVkICJzaW5nbGUiIGJlY2F1c2Ugb2YgbG93ZXJpbmcgb2YgInNlY3Rpb25zIiBwcmFnbWFzICovCisgICAgIlwidGFza3FcIiIsCisgICAgIlwidGFza3FcIiIsCisgICAgIlwidGFza3Egb3JkZXJlZFwiIiwKKyAgICAiXCJjcml0aWNhbFwiIiwKKyAgICAiXCJvcmRlcmVkXCIiLCAgICAgICAgICAgICAgLyogaW4gUEFSQUxMRUwgKi8KKyAgICAiXCJvcmRlcmVkXCIiLCAgICAgICAgICAgICAgLyogaW4gUERPICovCisgICAgIlwib3JkZXJlZFwiIiwgICAgICAgICAgICAgIC8qIGluIFRBU0tRICovCisgICAgIlwibWFzdGVyXCIiLAorICAgICJcInJlZHVjZVwiIiwKKyAgICAiXCJiYXJyaWVyXCIiCit9OworCisjZGVmaW5lIGdldF9zcmMoIGlkZW50ICkgICAoIChpZGVudCkgPT0gTlVMTCA/IE5VTEwgOiAoaWRlbnQpLT5wc291cmNlICkKKworI2RlZmluZSBQVVNIX01TRyggY3QsIGlkZW50ICkgXAorICAgICJcdHB1c2hpbmcgb24gc3RhY2s6ICVzICglcylcbiIsIGNvbnNfdGV4dF9jWyAoY3QpIF0sIGdldF9zcmMoIChpZGVudCkgKQorI2RlZmluZSBQT1BfTVNHKCBwICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJcdHBvcHBpbmcgb2ZmIHN0YWNrOiAlcyAoJXMpXG4iLCAgICAgICAgICAgICAgICAgXAorICAgIGNvbnNfdGV4dF9jWyAocCktPnN0YWNrX2RhdGFbIHRvcyBdLnR5cGUgXSwgICAgICAgXAorICAgIGdldF9zcmMoIChwKS0+c3RhY2tfZGF0YVsgdG9zIF0uaWRlbnQgKQorCitzdGF0aWMgaW50IGNvbnN0IGNvbnNfdGV4dF9mb3J0X251bSA9IHNpemVvZiggY29uc190ZXh0X2ZvcnQgKSAvIHNpemVvZiggY2hhciBjb25zdCAqICk7CitzdGF0aWMgaW50IGNvbnN0IGNvbnNfdGV4dF9jX251bSAgICA9IHNpemVvZiggY29uc190ZXh0X2MgICAgKSAvIHNpemVvZiggY2hhciBjb25zdCAqICk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tIFNUQVJUIE9GIFNUQVRJQyBMT0NBTCBST1VUSU5FUyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQKK19fa21wX2NoZWNrX251bGxfZnVuYyggdm9pZCApCit7CisgICAgLyogbm90aGluZyB0byBkbyAqLworfQorCitzdGF0aWMgdm9pZAorX19rbXBfZXhwYW5kX2NvbnNfc3RhY2soIGludCBndGlkLCBzdHJ1Y3QgY29uc19oZWFkZXIgKnAgKQoreworICAgIGludCAgICBpOworICAgIHN0cnVjdCBjb25zX2RhdGEgKmQ7CisKKyAgICAvKiBUT0RPIGZvciBtb25pdG9yIHBlcmhhcHM/ICovCisgICAgaWYgKGd0aWQgPCAwKQorICAgICAgICBfX2ttcF9jaGVja19udWxsX2Z1bmMoKTsKKworICAgIEtFX1RSQUNFKCAxMCwgKCJleHBhbmQgY29uc19zdGFjayAoJWQgJWQpXG4iLCBndGlkLCBfX2ttcF9nZXRfZ3RpZCgpICkgKTsKKworICAgIGQgPSBwLT5zdGFja19kYXRhOworCisgICAgcC0+c3RhY2tfc2l6ZSA9IChwLT5zdGFja19zaXplICogMikgKyAxMDA7CisKKyAgICAvKiBUT0RPIGZyZWUgdGhlIG9sZCBkYXRhICovCisgICAgcC0+c3RhY2tfZGF0YSA9IChzdHJ1Y3QgY29uc19kYXRhICopIF9fa21wX2FsbG9jYXRlKCBzaXplb2YoIHN0cnVjdCBjb25zX2RhdGEgKSAqIChwLT5zdGFja19zaXplKzEpICk7CisKKyAgICBmb3IgKGkgPSBwLT5zdGFja190b3A7IGkgPj0gMDsgLS1pKQorICAgICAgICBwLT5zdGFja19kYXRhW2ldID0gZFtpXTsKKworICAgIC8qIE5PVEU6IHdlIGRvIG5vdCBmcmVlIHRoZSBvbGQgc3RhY2tfZGF0YSAqLworfQorCisvLyBOT1RFOiBGdW5jdGlvbiByZXR1cm5zIGFsbG9jYXRlZCBtZW1vcnksIGNhbGxlciBtdXN0IGZyZWUgaXQhCitzdGF0aWMgY2hhciBjb25zdCAqCitfX2ttcF9wcmFnbWEoCisgICAgZW51bSBjb25zX3R5cGUgICBjdCwKKyAgICBpZGVudF90IGNvbnN0ICogIGlkZW50CispIHsKKyAgICBjaGFyIGNvbnN0ICogY29ucyA9IE5VTEw7ICAvLyBDb25zdHJ1Y3QgbmFtZS4KKyAgICBjaGFyICogZmlsZSA9IE5VTEw7ICAvLyBGaWxlIG5hbWUuCisgICAgY2hhciAqIGZ1bmMgPSBOVUxMOyAgLy8gRnVuY3Rpb24gKHJvdXRpbmUpIG5hbWUuCisgICAgY2hhciAqIGxpbmUgPSBOVUxMOyAgLy8gTGluZSBudW1iZXIuCisgICAga21wX3N0cl9idWZfdCBidWZmZXI7CisgICAga21wX21zZ190ICAgICBwcmdtOworICAgIF9fa21wX3N0cl9idWZfaW5pdCggJiBidWZmZXIgKTsKKyAgICBpZiAoIDAgPCBjdCAmJiBjdCA8PSBjb25zX3RleHRfY19udW0gKSB7OworICAgICAgICBjb25zID0gY29uc190ZXh0X2NbIGN0IF07CisgICAgfSBlbHNlIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggMCApOworICAgIH07CisgICAgaWYgKCBpZGVudCAhPSBOVUxMICYmIGlkZW50LT5wc291cmNlICE9IE5VTEwgKSB7CisgICAgICAgIGNoYXIgKiB0YWlsID0gTlVMTDsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBidWZmZXIsICIlcyIsIGlkZW50LT5wc291cmNlICk7IC8vIENvcHkgc291cmNlIHRvIGJ1ZmZlci4KKyAgICAgICAgLy8gU3BsaXQgc3RyaW5nIGluIGJ1ZmZlciB0byBmaWxlLCBmdW5jLCBhbmQgbGluZS4KKyAgICAgICAgdGFpbCA9IGJ1ZmZlci5zdHI7CisgICAgICAgIF9fa21wX3N0cl9zcGxpdCggdGFpbCwgJzsnLCBOVUxMLCAgICYgdGFpbCApOworICAgICAgICBfX2ttcF9zdHJfc3BsaXQoIHRhaWwsICc7JywgJiBmaWxlLCAmIHRhaWwgKTsKKyAgICAgICAgX19rbXBfc3RyX3NwbGl0KCB0YWlsLCAnOycsICYgZnVuYywgJiB0YWlsICk7CisgICAgICAgIF9fa21wX3N0cl9zcGxpdCggdGFpbCwgJzsnLCAmIGxpbmUsICYgdGFpbCApOworICAgIH07IC8vIGlmCisgICAgcHJnbSA9IF9fa21wX21zZ19mb3JtYXQoIGttcF9pMThuX2ZtdF9QcmFnbWEsIGNvbnMsIGZpbGUsIGZ1bmMsIGxpbmUgKTsKKyAgICBfX2ttcF9zdHJfYnVmX2ZyZWUoICYgYnVmZmVyICk7CisgICAgcmV0dXJuIHByZ20uc3RyOworfSAvLyBfX2ttcF9wcmFnbWEKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLSBFTkQgT0YgU1RBVElDIExPQ0FMIFJPVVRJTkVTIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisKK3ZvaWQKK19fa21wX2Vycm9yX2NvbnN0cnVjdCgKKyAgICBrbXBfaTE4bl9pZF90ICAgIGlkLCAgICAgLy8gTWVzc2FnZSBpZGVudGlmaWVyLgorICAgIGVudW0gY29uc190eXBlICAgY3QsICAgICAvLyBDb25zdHJ1Y3QgdHlwZS4KKyAgICBpZGVudF90IGNvbnN0ICogIGlkZW50ICAgLy8gQ29uc3RydWN0IGlkZW50LgorKSB7CisgICAgY2hhciBjb25zdCAqIGNvbnN0cnVjdCA9IF9fa21wX3ByYWdtYSggY3QsIGlkZW50ICk7CisgICAgX19rbXBfbXNnKCBrbXBfbXNfZmF0YWwsIF9fa21wX21zZ19mb3JtYXQoIGlkLCBjb25zdHJ1Y3QgKSwgX19rbXBfbXNnX251bGwgKTsKKyAgICBLTVBfSU5URVJOQUxfRlJFRSggKHZvaWQgKikgY29uc3RydWN0ICk7Cit9CisKK3ZvaWQKK19fa21wX2Vycm9yX2NvbnN0cnVjdDIoCisgICAga21wX2kxOG5faWRfdCAgICAgICAgICAgIGlkLCAgICAgLy8gTWVzc2FnZSBpZGVudGlmaWVyLgorICAgIGVudW0gY29uc190eXBlICAgICAgICAgICBjdCwgICAgIC8vIEZpcnN0IGNvbnN0cnVjdCB0eXBlLgorICAgIGlkZW50X3QgY29uc3QgKiAgICAgICAgICBpZGVudCwgIC8vIEZpcnN0IGNvbnN0cnVjdCBpZGVudC4KKyAgICBzdHJ1Y3QgY29uc19kYXRhIGNvbnN0ICogY29ucyAgICAvLyBTZWNvbmQgY29uc3RydWN0LgorKSB7CisgICAgY2hhciBjb25zdCAqIGNvbnN0cnVjdDEgPSBfX2ttcF9wcmFnbWEoIGN0LCBpZGVudCApOworICAgIGNoYXIgY29uc3QgKiBjb25zdHJ1Y3QyID0gX19rbXBfcHJhZ21hKCBjb25zLT50eXBlLCBjb25zLT5pZGVudCApOworICAgIF9fa21wX21zZygga21wX21zX2ZhdGFsLCBfX2ttcF9tc2dfZm9ybWF0KCBpZCwgY29uc3RydWN0MSwgY29uc3RydWN0MiApLCBfX2ttcF9tc2dfbnVsbCApOworICAgIEtNUF9JTlRFUk5BTF9GUkVFKCAodm9pZCAqKSBjb25zdHJ1Y3QxICk7CisgICAgS01QX0lOVEVSTkFMX0ZSRUUoICh2b2lkICopIGNvbnN0cnVjdDIgKTsKK30KKworCitzdHJ1Y3QgY29uc19oZWFkZXIgKgorX19rbXBfYWxsb2NhdGVfY29uc19zdGFjayggaW50IGd0aWQgKQoreworICAgIHN0cnVjdCBjb25zX2hlYWRlciAqcDsKKworICAgIC8qIFRPRE8gZm9yIG1vbml0b3IgcGVyaGFwcz8gKi8KKyAgICBpZiAoIGd0aWQgPCAwICkgeworICAgICAgICBfX2ttcF9jaGVja19udWxsX2Z1bmMoKTsKKyAgICB9OyAvLyBpZgorICAgIEtFX1RSQUNFKCAxMCwgKCJhbGxvY2F0ZSBjb25zX3N0YWNrICglZClcbiIsIGd0aWQgKSApOworICAgIHAgPSAoc3RydWN0IGNvbnNfaGVhZGVyICopIF9fa21wX2FsbG9jYXRlKCBzaXplb2YoIHN0cnVjdCBjb25zX2hlYWRlciApICk7CisgICAgcC0+cF90b3AgPSBwLT53X3RvcCA9IHAtPnNfdG9wID0gMDsKKyAgICBwLT5zdGFja19kYXRhID0gKHN0cnVjdCBjb25zX2RhdGEgKikgX19rbXBfYWxsb2NhdGUoIHNpemVvZiggc3RydWN0IGNvbnNfZGF0YSApICogKE1JTl9TVEFDSysxKSApOworICAgIHAtPnN0YWNrX3NpemUgPSBNSU5fU1RBQ0s7CisgICAgcC0+c3RhY2tfdG9wICA9IDA7CisgICAgcC0+c3RhY2tfZGF0YVsgMCBdLnR5cGUgPSBjdF9ub25lOworICAgIHAtPnN0YWNrX2RhdGFbIDAgXS5wcmV2ID0gMDsKKyAgICBwLT5zdGFja19kYXRhWyAwIF0uaWRlbnQgPSBOVUxMOworICAgIHJldHVybiBwOworfQorCit2b2lkCitfX2ttcF9mcmVlX2NvbnNfc3RhY2soIHZvaWQgKiBwdHIgKSB7CisgICAgc3RydWN0IGNvbnNfaGVhZGVyICogcCA9IChzdHJ1Y3QgY29uc19oZWFkZXIgKikgcHRyOworICAgIGlmICggcCAhPSBOVUxMICkgeworICAgICAgICBpZiAoIHAtPnN0YWNrX2RhdGEgIT0gTlVMTCApIHsKKyAgICAgICAgICAgIF9fa21wX2ZyZWUoIHAtPnN0YWNrX2RhdGEgKTsKKyAgICAgICAgICAgIHAtPnN0YWNrX2RhdGEgPSBOVUxMOworICAgICAgICB9OyAvLyBpZgorICAgICAgICBfX2ttcF9mcmVlKCBwICk7CisgICAgfTsgLy8gaWYKK30KKworCitzdGF0aWMgdm9pZAorZHVtcF9jb25zX3N0YWNrKCBpbnQgZ3RpZCwgc3RydWN0IGNvbnNfaGVhZGVyICogcCApIHsKKyAgICBpbnQgaTsKKyAgICBpbnQgdG9zID0gcC0+c3RhY2tfdG9wOworICAgIGttcF9zdHJfYnVmX3QgYnVmZmVyOworICAgIF9fa21wX3N0cl9idWZfaW5pdCggJiBidWZmZXIgKTsKKyAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmIGJ1ZmZlciwgIistKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy1cbiIgKTsKKyAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmIGJ1ZmZlciwgIkJlZ2luIGNvbnN0cnVjdCBzdGFjayB3aXRoICVkIGl0ZW1zIGZvciB0aHJlYWQgJWRcbiIsIHRvcywgZ3RpZCApOworICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICYgYnVmZmVyLCAiICAgICBzdGFja190b3A9JWQgeyBQPSVkLCBXPSVkLCBTPSVkIH1cbiIsIHRvcywgcC0+cF90b3AsIHAtPndfdG9wLCBwLT5zX3RvcCApOworICAgIGZvciAoIGkgPSB0b3M7IGkgPiAwOyBpLS0gKSB7CisgICAgICAgIHN0cnVjdCBjb25zX2RhdGEgKiBjID0gJiAoIHAtPnN0YWNrX2RhdGFbIGkgXSApOworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmIGJ1ZmZlciwgIiAgICAgICAgc3RhY2tfZGF0YVslMmRdID0geyAlcyAoJXMpICVkICVwIH1cbiIsIGksIGNvbnNfdGV4dF9jWyBjLT50eXBlIF0sIGdldF9zcmMoIGMtPmlkZW50ICksIGMtPnByZXYsIGMtPm5hbWUgKTsKKyAgICB9OyAvLyBmb3IgaQorICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICYgYnVmZmVyLCAiRW5kIGNvbnN0cnVjdCBzdGFjayBmb3IgdGhyZWFkICVkXG4iLCBndGlkICk7CisgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBidWZmZXIsICIrLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstXG4iICk7CisgICAgX19rbXBfZGVidWdfcHJpbnRmKCAiJXMiLCBidWZmZXIuc3RyICk7CisgICAgX19rbXBfc3RyX2J1Zl9mcmVlKCAmIGJ1ZmZlciApOworfQorCit2b2lkCitfX2ttcF9wdXNoX3BhcmFsbGVsKCBpbnQgZ3RpZCwgaWRlbnRfdCBjb25zdCAqIGlkZW50ICkKK3sKKyAgICBpbnQgdG9zOworICAgIHN0cnVjdCBjb25zX2hlYWRlciAqcCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXS0+dGgudGhfY29uczsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX3RocmVhZHNbIGd0aWQgXS0+IHRoLnRoX2NvbnMgKTsKKyAgICBLRV9UUkFDRSggMTAsICgiX19rbXBfcHVzaF9wYXJhbGxlbCAoJWQgJWQpXG4iLCBndGlkLCBfX2ttcF9nZXRfZ3RpZCgpICkgKTsKKyAgICBLRV9UUkFDRSggMTAwLCAoIFBVU0hfTVNHKCBjdF9wYXJhbGxlbCwgaWRlbnQgKSApICk7CisgICAgaWYgKCBwLT5zdGFja190b3AgPj0gcC0+c3RhY2tfc2l6ZSApIHsKKyAgICAgICAgX19rbXBfZXhwYW5kX2NvbnNfc3RhY2soIGd0aWQsIHAgKTsKKyAgICB9OyAvLyBpZgorICAgIHRvcyA9ICsrcC0+c3RhY2tfdG9wOworICAgIHAtPnN0YWNrX2RhdGFbIHRvcyBdLnR5cGUgPSBjdF9wYXJhbGxlbDsKKyAgICBwLT5zdGFja19kYXRhWyB0b3MgXS5wcmV2ID0gcC0+cF90b3A7CisgICAgcC0+c3RhY2tfZGF0YVsgdG9zIF0uaWRlbnQgPSBpZGVudDsKKyAgICBwLT5zdGFja19kYXRhWyB0b3MgXS5uYW1lID0gTlVMTDsKKyAgICBwLT5wX3RvcCA9IHRvczsKKyAgICBLRV9EVU1QKCAxMDAwLCBkdW1wX2NvbnNfc3RhY2soIGd0aWQsIHAgKSApOworfQorCit2b2lkCitfX2ttcF9jaGVja193b3Jrc2hhcmUoIGludCBndGlkLCBlbnVtIGNvbnNfdHlwZSBjdCwgaWRlbnRfdCBjb25zdCAqIGlkZW50ICkKK3sKKyAgICBzdHJ1Y3QgY29uc19oZWFkZXIgKnAgPSBfX2ttcF90aHJlYWRzWyBndGlkIF0tPnRoLnRoX2NvbnM7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF90aHJlYWRzWyBndGlkIF0tPiB0aC50aF9jb25zICk7CisgICAgS0VfVFJBQ0UoIDEwLCAoIl9fa21wX2NoZWNrX3dvcmtzaGFyZSAoJWQgJWQpXG4iLCBndGlkLCBfX2ttcF9nZXRfZ3RpZCgpICkgKTsKKworCisgICAgaWYgKCBwLT5zdGFja190b3AgPj0gcC0+c3RhY2tfc2l6ZSApIHsKKyAgICAgICAgX19rbXBfZXhwYW5kX2NvbnNfc3RhY2soIGd0aWQsIHAgKTsKKyAgICB9OyAvLyBpZgorICAgIGlmICggcC0+d190b3AgPiBwLT5wX3RvcCAmJgorICAgICAgICAhKElTX0NPTlNfVFlQRV9UQVNLUShwLT5zdGFja19kYXRhWyBwLT53X3RvcCBdLnR5cGUpICYmIElTX0NPTlNfVFlQRV9UQVNLUShjdCkpKSB7CisgICAgICAgIC8vIFdlIGFyZSBhbHJlYWR5IGluIGEgV09SS1NIQVJFIGNvbnN0cnVjdCBmb3IgdGhpcyBQQVJBTExFTCByZWdpb24uCisgICAgICAgIF9fa21wX2Vycm9yX2NvbnN0cnVjdDIoIGttcF9pMThuX21zZ19DbnNJbnZhbGlkTmVzdGluZywgY3QsIGlkZW50LCAmIHAtPnN0YWNrX2RhdGFbIHAtPndfdG9wIF0gKTsKKyAgICB9OyAvLyBpZgorICAgIGlmICggcC0+c190b3AgPiBwLT5wX3RvcCApIHsKKyAgICAgICAgLy8gV2UgYXJlIGFscmVhZHkgaW4gYSBTWU5DIGNvbnN0cnVjdCBmb3IgdGhpcyBQQVJBTExFTCByZWdpb24uCisgICAgICAgIF9fa21wX2Vycm9yX2NvbnN0cnVjdDIoIGttcF9pMThuX21zZ19DbnNJbnZhbGlkTmVzdGluZywgY3QsIGlkZW50LCAmIHAtPnN0YWNrX2RhdGFbIHAtPnNfdG9wIF0gKTsKKyAgICB9OyAvLyBpZgorfQorCit2b2lkCitfX2ttcF9wdXNoX3dvcmtzaGFyZSggaW50IGd0aWQsIGVudW0gY29uc190eXBlIGN0LCBpZGVudF90IGNvbnN0ICogaWRlbnQgKQoreworICAgIGludCAgICAgICAgIHRvczsKKyAgICBzdHJ1Y3QgY29uc19oZWFkZXIgKnAgPSBfX2ttcF90aHJlYWRzWyBndGlkIF0tPnRoLnRoX2NvbnM7CisgICAgS0VfVFJBQ0UoIDEwLCAoIl9fa21wX3B1c2hfd29ya3NoYXJlICglZCAlZClcbiIsIGd0aWQsIF9fa21wX2dldF9ndGlkKCkgKSApOworICAgIF9fa21wX2NoZWNrX3dvcmtzaGFyZSggZ3RpZCwgY3QsIGlkZW50ICk7CisgICAgS0VfVFJBQ0UoIDEwMCwgKCBQVVNIX01TRyggY3QsIGlkZW50ICkgKSApOworICAgIHRvcyA9ICsrcC0+c3RhY2tfdG9wOworICAgIHAtPnN0YWNrX2RhdGFbIHRvcyBdLnR5cGUgPSBjdDsKKyAgICBwLT5zdGFja19kYXRhWyB0b3MgXS5wcmV2ID0gcC0+d190b3A7CisgICAgcC0+c3RhY2tfZGF0YVsgdG9zIF0uaWRlbnQgPSBpZGVudDsKKyAgICBwLT5zdGFja19kYXRhWyB0b3MgXS5uYW1lID0gTlVMTDsKKyAgICBwLT53X3RvcCA9IHRvczsKKyAgICBLRV9EVU1QKCAxMDAwLCBkdW1wX2NvbnNfc3RhY2soIGd0aWQsIHAgKSApOworfQorCit2b2lkCitfX2ttcF9jaGVja19zeW5jKCBpbnQgZ3RpZCwgZW51bSBjb25zX3R5cGUgY3QsIGlkZW50X3QgY29uc3QgKiBpZGVudCwga21wX3VzZXJfbG9ja19wIGxjayApCit7CisgICAgc3RydWN0IGNvbnNfaGVhZGVyICpwID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdLT50aC50aF9jb25zOworCisgICAgS0VfVFJBQ0UoIDEwLCAoIl9fa21wX2NoZWNrX3N5bmMgKGd0aWQ9JWQpXG4iLCBfX2ttcF9nZXRfZ3RpZCgpICkgKTsKKworICAgIGlmIChwLT5zdGFja190b3AgPj0gcC0+c3RhY2tfc2l6ZSkKKyAgICAgICBfX2ttcF9leHBhbmRfY29uc19zdGFjayggZ3RpZCwgcCApOworCisgICAgaWYgKGN0ID09IGN0X29yZGVyZWRfaW5fcGFyYWxsZWwgfHwgY3QgPT0gY3Rfb3JkZXJlZF9pbl9wZG8gfHwgY3QgPT0gY3Rfb3JkZXJlZF9pbl90YXNrcSApIHsKKyAgICAgICAgaWYgKHAtPndfdG9wIDw9IHAtPnBfdG9wKSB7CisgICAgICAgICAgICAvKiB3ZSBhcmUgbm90IGluIGEgd29ya3NoYXJpbmcgY29uc3RydWN0ICovCisgICAgICAgICAgICAjaWZkZWYgQlVJTERfUEFSQUxMRUxfT1JERVJFRAorICAgICAgICAgICAgICAgIC8qIGRvIG5vdCByZXBvcnQgZXJyb3IgbWVzc2FnZXMgZm9yIFBBUkFMTEVMIE9SREVSRUQgKi8KKyAgICAgICAgICAgICAgICBLTVBfQVNTRVJUKCBjdCA9PSBjdF9vcmRlcmVkX2luX3BhcmFsbGVsICk7CisgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgICAgIF9fa21wX2Vycm9yX2NvbnN0cnVjdCgga21wX2kxOG5fbXNnX0Nuc0JvdW5kVG9Xb3Jrc2hhcmluZywgY3QsIGlkZW50ICk7CisgICAgICAgICAgICAjZW5kaWYgLyogQlVJTERfUEFSQUxMRUxfT1JERVJFRCAqLworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogaW5zaWRlIGEgV09SS1NIQVJJTkcgY29uc3RydWN0IGZvciB0aGlzIFBBUkFMTEVMIHJlZ2lvbiAqLworICAgICAgICAgICAgaWYgKCFJU19DT05TX1RZUEVfT1JERVJFRChwLT5zdGFja19kYXRhWyBwLT53X3RvcCBdLnR5cGUpKSB7CisgICAgICAgICAgICAgICAgaWYgKHAtPnN0YWNrX2RhdGFbIHAtPndfdG9wIF0udHlwZSA9PSBjdF90YXNrcSkgeworICAgICAgICAgICAgICAgICAgICBfX2ttcF9lcnJvcl9jb25zdHJ1Y3QyKAorICAgICAgICAgICAgICAgICAgICAgICAga21wX2kxOG5fbXNnX0Nuc05vdEluVGFza0NvbnN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGN0LCBpZGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICYgcC0+c3RhY2tfZGF0YVsgcC0+d190b3AgXQorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX2Vycm9yX2NvbnN0cnVjdDIoCisgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaTE4bl9tc2dfQ25zTm9PcmRlcmVkQ2xhdXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgY3QsIGlkZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgJiBwLT5zdGFja19kYXRhWyBwLT53X3RvcCBdCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHAtPnNfdG9wID4gcC0+cF90b3AgJiYgcC0+c190b3AgPiBwLT53X3RvcCkgeworICAgICAgICAgICAgLyogaW5zaWRlIGEgc3luYyBjb25zdHJ1Y3Qgd2hpY2ggaXMgaW5zaWRlIGEgd29ya3NoYXJpbmcgY29uc3RydWN0ICovCisgICAgICAgICAgICBpbnQgaW5kZXggPSBwLT5zX3RvcDsKKyAgICAgICAgICAgIGVudW0gY29uc190eXBlIHN0YWNrX3R5cGU7CisKKyAgICAgICAgICAgIHN0YWNrX3R5cGUgPSBwLT5zdGFja19kYXRhWyBpbmRleCBdLnR5cGU7CisKKyAgICAgICAgICAgIGlmIChzdGFja190eXBlID09IGN0X2NyaXRpY2FsIHx8CisgICAgICAgICAgICAgICAgKCAoIHN0YWNrX3R5cGUgPT0gY3Rfb3JkZXJlZF9pbl9wYXJhbGxlbCB8fAorICAgICAgICAgICAgICAgICAgICBzdGFja190eXBlID09IGN0X29yZGVyZWRfaW5fcGRvICAgICAgfHwKKyAgICAgICAgICAgICAgICAgICAgc3RhY2tfdHlwZSA9PSBjdF9vcmRlcmVkX2luX3Rhc2txICApICYmICAgICAvKiBDIGRvZXNuJ3QgYWxsb3cgbmFtZWQgb3JkZXJlZDsgb3JkZXJlZCBpbiBvcmRlcmVkIGdldHMgZXJyb3IgKi8KKyAgICAgICAgICAgICAgICAgcC0+c3RhY2tfZGF0YVsgaW5kZXggXS5pZGVudCAhPSBOVUxMICYmCisgICAgICAgICAgICAgICAgIChwLT5zdGFja19kYXRhWyBpbmRleCBdLmlkZW50LT5mbGFncyAmIEtNUF9JREVOVF9LTVBDICkpKSB7CisgICAgICAgICAgICAgICAgLyogd2UgYXJlIGluIE9SREVSRUQgd2hpY2ggaXMgaW5zaWRlIGFuIE9SREVSRUQgb3IgQ1JJVElDQUwgY29uc3RydWN0ICovCisgICAgICAgICAgICAgICAgX19rbXBfZXJyb3JfY29uc3RydWN0MigKKyAgICAgICAgICAgICAgICAgICAga21wX2kxOG5fbXNnX0Nuc0ludmFsaWROZXN0aW5nLAorICAgICAgICAgICAgICAgICAgICBjdCwgaWRlbnQsCisgICAgICAgICAgICAgICAgICAgICYgcC0+c3RhY2tfZGF0YVsgaW5kZXggXQorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKCBjdCA9PSBjdF9jcml0aWNhbCApIHsKKyAgICAgICAgaWYgKCBsY2sgIT0gTlVMTCAmJiBfX2ttcF9nZXRfdXNlcl9sb2NrX293bmVyKCBsY2sgKSA9PSBndGlkICkgeyAgICAvKiB0aGlzIHNhbWUgdGhyZWFkIGFscmVhZHkgaGFzIGxvY2sgZm9yIHRoaXMgY3JpdGljYWwgc2VjdGlvbiAqLworICAgICAgICAgICAgaW50IGluZGV4ID0gcC0+c190b3A7CisgICAgICAgICAgICBzdHJ1Y3QgY29uc19kYXRhIGNvbnMgPSB7IE5VTEwsIGN0X2NyaXRpY2FsLCAwLCBOVUxMIH07CisgICAgICAgICAgICAvKiB3YWxrIHVwIGNvbnN0cnVjdCBzdGFjayBhbmQgdHJ5IHRvIGZpbmQgY3JpdGljYWwgd2l0aCBtYXRjaGluZyBuYW1lICovCisgICAgICAgICAgICB3aGlsZSAoIGluZGV4ICE9IDAgJiYgcC0+c3RhY2tfZGF0YVsgaW5kZXggXS5uYW1lICE9IGxjayApIHsKKyAgICAgICAgICAgICAgICBpbmRleCA9IHAtPnN0YWNrX2RhdGFbIGluZGV4IF0ucHJldjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggaW5kZXggIT0gMCApIHsKKyAgICAgICAgICAgICAgICAvKiBmb3VuZCBtYXRjaCBvbiB0aGUgc3RhY2sgKG1heSBub3QgYWx3YXlzIGJlY2F1c2Ugb2YgaW50ZXJsZWF2ZWQgY3JpdGljYWwgZm9yIEZvcnRyYW4pICovCisgICAgICAgICAgICAgICAgY29ucyA9IHAtPnN0YWNrX2RhdGFbIGluZGV4IF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiB3ZSBhcmUgaW4gQ1JJVElDQUwgd2hpY2ggaXMgaW5zaWRlIGEgQ1JJVElDQUwgY29uc3RydWN0IG9mIHRoZSBzYW1lIG5hbWUgKi8KKyAgICAgICAgICAgIF9fa21wX2Vycm9yX2NvbnN0cnVjdDIoIGttcF9pMThuX21zZ19DbnNOZXN0aW5nU2FtZU5hbWUsIGN0LCBpZGVudCwgJiBjb25zICk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKCBjdCA9PSBjdF9tYXN0ZXIgfHwgY3QgPT0gY3RfcmVkdWNlICkgeworICAgICAgICBpZiAocC0+d190b3AgPiBwLT5wX3RvcCkgeworICAgICAgICAgICAgLyogaW5zaWRlIGEgV09SS1NIQVJJTkcgY29uc3RydWN0IGZvciB0aGlzIFBBUkFMTEVMIHJlZ2lvbiAqLworICAgICAgICAgICBfX2ttcF9lcnJvcl9jb25zdHJ1Y3QyKAorICAgICAgICAgICAgICAga21wX2kxOG5fbXNnX0Nuc0ludmFsaWROZXN0aW5nLAorICAgICAgICAgICAgICAgY3QsIGlkZW50LAorICAgICAgICAgICAgICAgJiBwLT5zdGFja19kYXRhWyBwLT53X3RvcCBdCisgICAgICAgICAgICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGN0ID09IGN0X3JlZHVjZSAmJiBwLT5zX3RvcCA+IHAtPnBfdG9wKSB7CisgICAgICAgICAgICAvKiBpbnNpZGUgYSBhbm90aGVyIFNZTkMgY29uc3RydWN0IGZvciB0aGlzIFBBUkFMTEVMIHJlZ2lvbiAqLworICAgICAgICAgICAgX19rbXBfZXJyb3JfY29uc3RydWN0MigKKyAgICAgICAgICAgICAgICBrbXBfaTE4bl9tc2dfQ25zSW52YWxpZE5lc3RpbmcsCisgICAgICAgICAgICAgICAgY3QsIGlkZW50LAorICAgICAgICAgICAgICAgICYgcC0+c3RhY2tfZGF0YVsgcC0+c190b3AgXQorICAgICAgICAgICAgKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICB9OyAvLyBpZgorfQorCit2b2lkCitfX2ttcF9wdXNoX3N5bmMoIGludCBndGlkLCBlbnVtIGNvbnNfdHlwZSBjdCwgaWRlbnRfdCBjb25zdCAqIGlkZW50LCBrbXBfdXNlcl9sb2NrX3AgbGNrICkKK3sKKyAgICBpbnQgICAgICAgICB0b3M7CisgICAgc3RydWN0IGNvbnNfaGVhZGVyICpwID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdLT50aC50aF9jb25zOworCisgICAgS01QX0FTU0VSVCggZ3RpZCA9PSBfX2ttcF9nZXRfZ3RpZCgpICk7CisgICAgS0VfVFJBQ0UoIDEwLCAoIl9fa21wX3B1c2hfc3luYyAoZ3RpZD0lZClcbiIsIGd0aWQgKSApOworICAgIF9fa21wX2NoZWNrX3N5bmMoIGd0aWQsIGN0LCBpZGVudCwgbGNrICk7CisgICAgS0VfVFJBQ0UoIDEwMCwgKCBQVVNIX01TRyggY3QsIGlkZW50ICkgKSApOworICAgIHRvcyA9ICsrIHAtPnN0YWNrX3RvcDsKKyAgICBwLT5zdGFja19kYXRhWyB0b3MgXS50eXBlICA9IGN0OworICAgIHAtPnN0YWNrX2RhdGFbIHRvcyBdLnByZXYgID0gcC0+c190b3A7CisgICAgcC0+c3RhY2tfZGF0YVsgdG9zIF0uaWRlbnQgPSBpZGVudDsKKyAgICBwLT5zdGFja19kYXRhWyB0b3MgXS5uYW1lICA9IGxjazsKKyAgICBwLT5zX3RvcCA9IHRvczsKKyAgICBLRV9EVU1QKCAxMDAwLCBkdW1wX2NvbnNfc3RhY2soIGd0aWQsIHAgKSApOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZAorX19rbXBfcG9wX3BhcmFsbGVsKCBpbnQgZ3RpZCwgaWRlbnRfdCBjb25zdCAqIGlkZW50ICkKK3sKKyAgICBpbnQgdG9zOworICAgIHN0cnVjdCBjb25zX2hlYWRlciAqcCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXS0+dGgudGhfY29uczsKKyAgICB0b3MgPSBwLT5zdGFja190b3A7CisgICAgS0VfVFJBQ0UoIDEwLCAoIl9fa21wX3BvcF9wYXJhbGxlbCAoJWQgJWQpXG4iLCBndGlkLCBfX2ttcF9nZXRfZ3RpZCgpICkgKTsKKyAgICBpZiAoIHRvcyA9PSAwIHx8IHAtPnBfdG9wID09IDAgKSB7CisgICAgICAgIF9fa21wX2Vycm9yX2NvbnN0cnVjdCgga21wX2kxOG5fbXNnX0Nuc0RldGVjdGVkRW5kLCBjdF9wYXJhbGxlbCwgaWRlbnQgKTsKKyAgICB9CisgICAgaWYgKCB0b3MgIT0gcC0+cF90b3AgfHwgcC0+c3RhY2tfZGF0YVsgdG9zIF0udHlwZSAhPSBjdF9wYXJhbGxlbCApIHsKKyAgICAgICAgX19rbXBfZXJyb3JfY29uc3RydWN0MigKKyAgICAgICAgICAgIGttcF9pMThuX21zZ19DbnNFeHBlY3RlZEVuZCwKKyAgICAgICAgICAgIGN0X3BhcmFsbGVsLCBpZGVudCwKKyAgICAgICAgICAgICYgcC0+c3RhY2tfZGF0YVsgdG9zIF0KKyAgICAgICAgKTsKKyAgICB9CisgICAgS0VfVFJBQ0UoIDEwMCwgKCBQT1BfTVNHKCBwICkgKSApOworICAgIHAtPnBfdG9wID0gcC0+c3RhY2tfZGF0YVsgdG9zIF0ucHJldjsKKyAgICBwLT5zdGFja19kYXRhWyB0b3MgXS50eXBlID0gY3Rfbm9uZTsKKyAgICBwLT5zdGFja19kYXRhWyB0b3MgXS5pZGVudCA9IE5VTEw7CisgICAgcC0+c3RhY2tfdG9wID0gdG9zIC0gMTsKKyAgICBLRV9EVU1QKCAxMDAwLCBkdW1wX2NvbnNfc3RhY2soIGd0aWQsIHAgKSApOworfQorCitlbnVtIGNvbnNfdHlwZQorX19rbXBfcG9wX3dvcmtzaGFyZSggaW50IGd0aWQsIGVudW0gY29uc190eXBlIGN0LCBpZGVudF90IGNvbnN0ICogaWRlbnQgKQoreworICAgIGludCB0b3M7CisgICAgc3RydWN0IGNvbnNfaGVhZGVyICpwID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdLT50aC50aF9jb25zOworCisgICAgdG9zID0gcC0+c3RhY2tfdG9wOworICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcF9wb3Bfd29ya3NoYXJlICglZCAlZClcbiIsIGd0aWQsIF9fa21wX2dldF9ndGlkKCkgKSApOworICAgIGlmICggdG9zID09IDAgfHwgcC0+d190b3AgPT0gMCApIHsKKyAgICAgICAgX19rbXBfZXJyb3JfY29uc3RydWN0KCBrbXBfaTE4bl9tc2dfQ25zRGV0ZWN0ZWRFbmQsIGN0LCBpZGVudCApOworICAgIH0KKworICAgIGlmICggdG9zICE9IHAtPndfdG9wIHx8CisgICAgICAgICAoIHAtPnN0YWNrX2RhdGFbIHRvcyBdLnR5cGUgIT0gY3QgJiYKKyAgICAgICAgICAvKiBiZWxvdyBhcmUgdHdvIGV4Y2VwdGlvbnMgdG8gdGhlIHJ1bGUgdGhhdCBjb25zdHJ1Y3QgdHlwZXMgbXVzdCBtYXRjaCAqLworICAgICAgICAgICEgKCBwLT5zdGFja19kYXRhWyB0b3MgXS50eXBlID09IGN0X3Bkb19vcmRlcmVkICYmIGN0ID09IGN0X3BkbyApICYmCisgICAgICAgICAgISAoIHAtPnN0YWNrX2RhdGFbIHRvcyBdLnR5cGUgPT0gY3RfdGFza19vcmRlcmVkICYmIGN0ID09IGN0X3Rhc2sgKQorICAgICAgICAgKQorICAgICAgICkgeworICAgICAgICBfX2ttcF9jaGVja19udWxsX2Z1bmMoKTsKKyAgICAgICAgX19rbXBfZXJyb3JfY29uc3RydWN0MigKKyAgICAgICAgICAgIGttcF9pMThuX21zZ19DbnNFeHBlY3RlZEVuZCwKKyAgICAgICAgICAgIGN0LCBpZGVudCwKKyAgICAgICAgICAgICYgcC0+c3RhY2tfZGF0YVsgdG9zIF0KKyAgICAgICAgKTsKKyAgICB9CisgICAgS0VfVFJBQ0UoIDEwMCwgKCBQT1BfTVNHKCBwICkgKSApOworICAgIHAtPndfdG9wID0gcC0+c3RhY2tfZGF0YVsgdG9zIF0ucHJldjsKKyAgICBwLT5zdGFja19kYXRhWyB0b3MgXS50eXBlID0gY3Rfbm9uZTsKKyAgICBwLT5zdGFja19kYXRhWyB0b3MgXS5pZGVudCA9IE5VTEw7CisgICAgcC0+c3RhY2tfdG9wID0gdG9zIC0gMTsKKyAgICBLRV9EVU1QKCAxMDAwLCBkdW1wX2NvbnNfc3RhY2soIGd0aWQsIHAgKSApOworICAgIHJldHVybiBwLT5zdGFja19kYXRhWyBwLT53X3RvcCBdLnR5cGU7Cit9CisKK3ZvaWQKK19fa21wX3BvcF9zeW5jKCBpbnQgZ3RpZCwgZW51bSBjb25zX3R5cGUgY3QsIGlkZW50X3QgY29uc3QgKiBpZGVudCApCit7CisgICAgaW50IHRvczsKKyAgICBzdHJ1Y3QgY29uc19oZWFkZXIgKnAgPSBfX2ttcF90aHJlYWRzWyBndGlkIF0tPnRoLnRoX2NvbnM7CisgICAgdG9zID0gcC0+c3RhY2tfdG9wOworICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcF9wb3Bfc3luYyAoJWQgJWQpXG4iLCBndGlkLCBfX2ttcF9nZXRfZ3RpZCgpICkgKTsKKyAgICBpZiAoIHRvcyA9PSAwIHx8IHAtPnNfdG9wID09IDAgKSB7CisgICAgICAgIF9fa21wX2Vycm9yX2NvbnN0cnVjdCgga21wX2kxOG5fbXNnX0Nuc0RldGVjdGVkRW5kLCBjdCwgaWRlbnQgKTsKKyAgICB9OworICAgIGlmICggdG9zICE9IHAtPnNfdG9wIHx8IHAtPnN0YWNrX2RhdGFbIHRvcyBdLnR5cGUgIT0gY3QgKSB7CisgICAgICAgIF9fa21wX2NoZWNrX251bGxfZnVuYygpOworICAgICAgICBfX2ttcF9lcnJvcl9jb25zdHJ1Y3QyKAorICAgICAgICAgICAga21wX2kxOG5fbXNnX0Nuc0V4cGVjdGVkRW5kLAorICAgICAgICAgICAgY3QsIGlkZW50LAorICAgICAgICAgICAgJiBwLT5zdGFja19kYXRhWyB0b3MgXQorICAgICAgICApOworICAgIH07CisgICAgaWYgKCBndGlkIDwgMCApIHsKKyAgICAgICAgX19rbXBfY2hlY2tfbnVsbF9mdW5jKCk7CisgICAgfTsKKyAgICBLRV9UUkFDRSggMTAwLCAoIFBPUF9NU0coIHAgKSApICk7CisgICAgcC0+c190b3AgPSBwLT5zdGFja19kYXRhWyB0b3MgXS5wcmV2OworICAgIHAtPnN0YWNrX2RhdGFbIHRvcyBdLnR5cGUgPSBjdF9ub25lOworICAgIHAtPnN0YWNrX2RhdGFbIHRvcyBdLmlkZW50ID0gTlVMTDsKKyAgICBwLT5zdGFja190b3AgPSB0b3MgLSAxOworICAgIEtFX0RVTVAoIDEwMDAsIGR1bXBfY29uc19zdGFjayggZ3RpZCwgcCApICk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkCitfX2ttcF9jaGVja19iYXJyaWVyKCBpbnQgZ3RpZCwgZW51bSBjb25zX3R5cGUgY3QsIGlkZW50X3QgY29uc3QgKiBpZGVudCApCit7CisgICAgc3RydWN0IGNvbnNfaGVhZGVyICpwID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdLT50aC50aF9jb25zOworICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcF9jaGVja19iYXJyaWVyIChsb2M6ICVwLCBndGlkOiAlZCAlZClcbiIsIGlkZW50LCBndGlkLCBfX2ttcF9nZXRfZ3RpZCgpICkgKTsKKyAgICBpZiAoIGlkZW50ICE9IDAgKSB7CisgICAgICAgIF9fa21wX2NoZWNrX251bGxfZnVuYygpOworICAgIH0KKyAgICBpZiAoIHAtPndfdG9wID4gcC0+cF90b3AgKSB7CisgICAgICAgIC8qIHdlIGFyZSBhbHJlYWR5IGluIGEgV09SS1NIQVJJTkcgY29uc3RydWN0IGZvciB0aGlzIFBBUkFMTEVMIHJlZ2lvbiAqLworICAgICAgICBfX2ttcF9lcnJvcl9jb25zdHJ1Y3QyKAorICAgICAgICAgICAga21wX2kxOG5fbXNnX0Nuc0ludmFsaWROZXN0aW5nLAorICAgICAgICAgICAgY3QsIGlkZW50LAorICAgICAgICAgICAgJiBwLT5zdGFja19kYXRhWyBwLT53X3RvcCBdCisgICAgICAgICk7CisgICAgfQorICAgIGlmIChwLT5zX3RvcCA+IHAtPnBfdG9wKSB7CisgICAgICAgIC8qIHdlIGFyZSBhbHJlYWR5IGluIGEgU1lOQyBjb25zdHJ1Y3QgZm9yIHRoaXMgUEFSQUxMRUwgcmVnaW9uICovCisgICAgICAgIF9fa21wX2Vycm9yX2NvbnN0cnVjdDIoCisgICAgICAgICAgICBrbXBfaTE4bl9tc2dfQ25zSW52YWxpZE5lc3RpbmcsCisgICAgICAgICAgICBjdCwgaWRlbnQsCisgICAgICAgICAgICAmIHAtPnN0YWNrX2RhdGFbIHAtPnNfdG9wIF0KKyAgICAgICAgKTsKKyAgICB9Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfZXJyb3IuaCBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9lcnJvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5ODE3YzgKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfZXJyb3IuaApAQCAtMCwwICsxLDUxIEBACisvKgorICoga21wX2Vycm9yLmggLS0gUFRTIGZ1bmN0aW9ucyBmb3IgZXJyb3IgY2hlY2tpbmcgYXQgcnVudGltZS4KKyAqICRSZXZpc2lvbjogNDI5NTEgJAorICogJERhdGU6IDIwMTQtMDEtMjEgMTQ6NDE6NDEgLTA2MDAgKFR1ZSwgMjEgSmFuIDIwMTQpICQKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBLTVBfRVJST1JfSAorI2RlZmluZSBLTVBfRVJST1JfSAorCisjaW5jbHVkZSAia21wX2kxOG4uaCIKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgICBleHRlcm4gIkMiIHsKKyNlbmRpZgorCit2b2lkIF9fa21wX2Vycm9yX2NvbnN0cnVjdCggIGttcF9pMThuX2lkX3QgaWQsIGVudW0gY29uc190eXBlIGN0LCBpZGVudF90IGNvbnN0ICogaWRlbnQgKTsKK3ZvaWQgX19rbXBfZXJyb3JfY29uc3RydWN0Migga21wX2kxOG5faWRfdCBpZCwgZW51bSBjb25zX3R5cGUgY3QsIGlkZW50X3QgY29uc3QgKiBpZGVudCwgc3RydWN0IGNvbnNfZGF0YSBjb25zdCAqIGNvbnMgKTsKKworc3RydWN0IGNvbnNfaGVhZGVyICogX19rbXBfYWxsb2NhdGVfY29uc19zdGFjayggaW50IGd0aWQgKTsKK3ZvaWQgICAgICAgICAgICAgICAgIF9fa21wX2ZyZWVfY29uc19zdGFjayggdm9pZCAqIHB0ciApOworCit2b2lkIF9fa21wX3B1c2hfcGFyYWxsZWwoIGludCBndGlkLCBpZGVudF90IGNvbnN0ICogaWRlbnQgKTsKK3ZvaWQgX19rbXBfcHVzaF93b3Jrc2hhcmUoIGludCBndGlkLCBlbnVtIGNvbnNfdHlwZSBjdCwgaWRlbnRfdCBjb25zdCAqIGlkZW50ICk7Cit2b2lkIF9fa21wX3B1c2hfc3luYyggaW50IGd0aWQsIGVudW0gY29uc190eXBlIGN0LCBpZGVudF90IGNvbnN0ICogaWRlbnQsIGttcF91c2VyX2xvY2tfcCBuYW1lICk7CisKK3ZvaWQgX19rbXBfY2hlY2tfd29ya3NoYXJlKCBpbnQgZ3RpZCwgZW51bSBjb25zX3R5cGUgY3QsIGlkZW50X3QgY29uc3QgKiBpZGVudCApOwordm9pZCBfX2ttcF9jaGVja19zeW5jKCBpbnQgZ3RpZCwgZW51bSBjb25zX3R5cGUgY3QsIGlkZW50X3QgY29uc3QgKiBpZGVudCwga21wX3VzZXJfbG9ja19wIG5hbWUgKTsKKwordm9pZCBfX2ttcF9wb3BfcGFyYWxsZWwoIGludCBndGlkLCBpZGVudF90IGNvbnN0ICogaWRlbnQgKTsKK2VudW0gY29uc190eXBlIF9fa21wX3BvcF93b3Jrc2hhcmUoIGludCBndGlkLCBlbnVtIGNvbnNfdHlwZSBjdCwgaWRlbnRfdCBjb25zdCAqIGlkZW50ICk7Cit2b2lkIF9fa21wX3BvcF9zeW5jKCBpbnQgZ3RpZCwgZW51bSBjb25zX3R5cGUgY3QsIGlkZW50X3QgY29uc3QgKiBpZGVudCApOwordm9pZCBfX2ttcF9jaGVja19iYXJyaWVyKCBpbnQgZ3RpZCwgZW51bSBjb25zX3R5cGUgY3QsIGlkZW50X3QgY29uc3QgKiBpZGVudCApOworCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgICB9IC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgLy8gS01QX0VSUk9SX0gKKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX2Z0bl9jZGVjbC5jIGIvZmluYWwvcnVudGltZS9zcmMva21wX2Z0bl9jZGVjbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1MDNlNmIKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfZnRuX2NkZWNsLmMKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIGttcF9mdG5fY2RlY2wuYyAtLSBGb3J0cmFuIF9fY2RlY2wgbGlua2FnZSBzdXBwb3J0IGZvciBPcGVuTVAuCisgKiAkUmV2aXNpb246IDQyOTUxICQKKyAqICREYXRlOiAyMDE0LTAxLTIxIDE0OjQxOjQxIC0wNjAwIChUdWUsIDIxIEphbiAyMDE0KSAkCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJrbXAuaCIKKworI2lmIEtNUF9PU19XSU5ET1dTCisjICAgaWYgZGVmaW5lZCAgS01QX1dJTl9DREVDTCB8fCAgIWRlZmluZWQgR1VJREVETExfRVhQT1JUUworIyAgICAgICBkZWZpbmUgS01QX0ZUTl9FTlRSSUVTICAgICAgS01QX0ZUTl9VUFBFUgorIyAgIGVuZGlmCisjZWxpZiBLTVBfT1NfVU5JWAorIyAgIGRlZmluZSBLTVBfRlROX0VOVFJJRVMgIEtNUF9GVE5fUExBSU4KKyNlbmRpZgorCisvLyBOb3RlOiBUaGlzIHN0cmluZyBpcyBub3QgcHJpbnRlZCB3aGVuIEtNUF9WRVJTSU9OPTEuCitjaGFyIGNvbnN0IF9fa21wX3ZlcnNpb25fZnRuY2RlY2xbXSA9IEtNUF9WRVJTSU9OX1BSRUZJWCAiRm9ydHJhbiBfX2NkZWNsIE9NUCBzdXBwb3J0OiAiCisjaWZkZWYgS01QX0ZUTl9FTlRSSUVTCisgICAgInllcyI7CisjICAgZGVmaW5lIEZUTl9TVERDQUxMIAkvKiBubyBzdGRjYWxsICovCisjICAgaW5jbHVkZSAia21wX2Z0bl9vcy5oIgorIyAgIGluY2x1ZGUgImttcF9mdG5fZW50cnkuaCIKKyNlbHNlCisgICAgIm5vIjsKKyNlbmRpZiAvKiBLTVBfRlROX0VOVFJJRVMgKi8KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9mdG5fZW50cnkuaCBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9mdG5fZW50cnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjYzYTY1Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX2Z0bl9lbnRyeS5oCkBAIC0wLDAgKzEsMTE5NyBAQAorLyoKKyAqIGttcF9mdG5fZW50cnkuaCAtLSBGb3J0cmFuIGVudHJ5IGxpbmthZ2Ugc3VwcG9ydCBmb3IgT3Blbk1QLgorICogJFJldmlzaW9uOiA0MzQzNSAkCisgKiAkRGF0ZTogMjAxNC0wOS0wNCAxNToxNjowOCAtMDUwMCAoVGh1LCAwNCBTZXAgMjAxNCkgJAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIEZUTl9TVERDQUxMCisjIGVycm9yIFRoZSBzdXBwb3J0IGZpbGUga21wX2Z0bl9lbnRyeS5oIHNob3VsZCBub3QgYmUgY29tcGlsZWQgYnkgaXRzZWxmLgorI2VuZGlmCisKKyNpZmRlZiBLTVBfU1RVQgorICAgICNpbmNsdWRlICJrbXBfc3R1Yi5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJrbXBfaTE4bi5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgICBleHRlcm4gIkMiIHsKKyNlbmRpZiAvLyBfX2NwbHVzcGx1cworCisvKgorICogRm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgR251L01TIE9wZW4gTVAgY29kZWdlbiwgb21wX3NldF9udW1fdGhyZWFkcygpLAorICogb21wX3NldF9uZXN0ZWQoKSwgYW5kIG9tcF9zZXRfZHluYW1pYygpIFtpbiBsb3dlcmNhc2Ugb24gTVMsIGFuZCB3L28KKyAqIGEgdHJhaWxpbmcgdW5kZXJzY29yZSBvbiBMaW51eCogT1NdIHRha2UgY2FsbCBieSB2YWx1ZSBpbnRlZ2VyIGFyZ3VtZW50cy4KKyAqICsgb21wX3NldF9tYXhfYWN0aXZlX2xldmVscygpCisgKiArIG9tcF9zZXRfc2NoZWR1bGUoKQorICoKKyAqIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggOS4xIGFuZCBwcmV2aW91cyBJbnRlbCBjb21waWxlciwgdGhlc2UKKyAqIGVudHJ5IHBvaW50cyB0YWtlIGNhbGwgYnkgcmVmZXJlbmNlIGludGVnZXIgYXJndW1lbnRzLgorICovCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisjIGlmIChLTVBfRlROX0VOVFJJRVMgPT0gS01QX0ZUTl9QTEFJTikgfHwgKEtNUF9GVE5fRU5UUklFUyA9PSBLTVBfRlROX1VQUEVSKQorIyAgZGVmaW5lIFBBU1NfQVJHU19CWV9WQUxVRSAxCisjIGVuZGlmCisjZW5kaWYKKyNpZiBLTVBfT1NfV0lORE9XUworIyBpZiAoS01QX0ZUTl9FTlRSSUVTID09IEtNUF9GVE5fUExBSU4pIHx8IChLTVBfRlROX0VOVFJJRVMgPT0gS01QX0ZUTl9BUFBFTkQpCisjICBkZWZpbmUgUEFTU19BUkdTX0JZX1ZBTFVFIDEKKyMgZW5kaWYKKyNlbmRpZgorCisvLyBUaGlzIG1hY3JvIGhlbHBzIHRvIHJlZHVjZSBjb2RlIGR1cGxpY2F0aW9uLgorI2lmZGVmIFBBU1NfQVJHU19CWV9WQUxVRQorICAgICNkZWZpbmUgS01QX0RFUkVGCisjZWxzZQorICAgICNkZWZpbmUgS01QX0RFUkVGICoKKyNlbmRpZgorCit2b2lkICBGVE5fU1REQ0FMTAorRlROX1NFVF9TVEFDS1NJWkUoIGludCBLTVBfREVSRUYgYXJnICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgX19rbXBzX3NldF9zdGFja3NpemUoIEtNUF9ERVJFRiBhcmcgKTsKKyAgICAjZWxzZQorICAgICAgICAvLyBfX2ttcF9hdXhfc2V0X3N0YWNrc2l6ZSBpbml0aWFsaXplcyB0aGUgbGlicmFyeSBpZiBuZWVkZWQKKyAgICAgICAgX19rbXBfYXV4X3NldF9zdGFja3NpemUoIChzaXplX3QpIEtNUF9ERVJFRiBhcmcgKTsKKyAgICAjZW5kaWYKK30KKwordm9pZCAgRlROX1NURENBTEwKK0ZUTl9TRVRfU1RBQ0tTSVpFX1MoIHNpemVfdCBLTVBfREVSRUYgYXJnICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgX19rbXBzX3NldF9zdGFja3NpemUoIEtNUF9ERVJFRiBhcmcgKTsKKyAgICAjZWxzZQorICAgICAgICAvLyBfX2ttcF9hdXhfc2V0X3N0YWNrc2l6ZSBpbml0aWFsaXplcyB0aGUgbGlicmFyeSBpZiBuZWVkZWQKKyAgICAgICAgX19rbXBfYXV4X3NldF9zdGFja3NpemUoIEtNUF9ERVJFRiBhcmcgKTsKKyAgICAjZW5kaWYKK30KKworaW50IEZUTl9TVERDQUxMCitGVE5fR0VUX1NUQUNLU0laRSggdm9pZCApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIHJldHVybiBfX2ttcHNfZ2V0X3N0YWNrc2l6ZSgpOworICAgICNlbHNlCisgICAgICAgIGlmICggISBfX2ttcF9pbml0X3NlcmlhbCApIHsKKyAgICAgICAgICAgIF9fa21wX3NlcmlhbF9pbml0aWFsaXplKCk7CisgICAgICAgIH07CisgICAgICAgIHJldHVybiAoaW50KV9fa21wX3N0a3NpemU7CisgICAgI2VuZGlmCit9CisKK3NpemVfdCBGVE5fU1REQ0FMTAorRlROX0dFVF9TVEFDS1NJWkVfUyggdm9pZCApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIHJldHVybiBfX2ttcHNfZ2V0X3N0YWNrc2l6ZSgpOworICAgICNlbHNlCisgICAgICAgIGlmICggISBfX2ttcF9pbml0X3NlcmlhbCApIHsKKyAgICAgICAgICAgIF9fa21wX3NlcmlhbF9pbml0aWFsaXplKCk7CisgICAgICAgIH07CisgICAgICAgIHJldHVybiBfX2ttcF9zdGtzaXplOworICAgICNlbmRpZgorfQorCit2b2lkIEZUTl9TVERDQUxMCitGVE5fU0VUX0JMT0NLVElNRSggaW50IEtNUF9ERVJFRiBhcmcgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICBfX2ttcHNfc2V0X2Jsb2NrdGltZSggS01QX0RFUkVGIGFyZyApOworICAgICNlbHNlCisJaW50IGd0aWQsIHRpZDsKKwlrbXBfaW5mb190ICp0aHJlYWQ7CisKKwlndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOworCXRpZCA9IF9fa21wX3RpZF9mcm9tX2d0aWQoZ3RpZCk7CisJdGhyZWFkID0gX19rbXBfdGhyZWFkX2Zyb21fZ3RpZChndGlkKTsKKworICAgICAgICBfX2ttcF9hdXhfc2V0X2Jsb2NrdGltZSggS01QX0RFUkVGIGFyZywgdGhyZWFkLCB0aWQgKTsKKyAgICAjZW5kaWYKK30KKworaW50IEZUTl9TVERDQUxMCitGVE5fR0VUX0JMT0NLVElNRSggdm9pZCApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIHJldHVybiBfX2ttcHNfZ2V0X2Jsb2NrdGltZSgpOworICAgICNlbHNlCisJaW50IGd0aWQsIHRpZDsKKwlrbXBfaW5mb190ICp0aHJlYWQ7CisgICAgICAgIGttcF90ZWFtX3AgKnRlYW07CisKKwlndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOworCXRpZCA9IF9fa21wX3RpZF9mcm9tX2d0aWQoZ3RpZCk7CisJdGhyZWFkID0gX19rbXBfdGhyZWFkX2Zyb21fZ3RpZChndGlkKTsKKyAgICAgICAgdGVhbSA9IF9fa21wX3RocmVhZHNbIGd0aWQgXSAtPiB0aC50aF90ZWFtOworCisgICAgICAgIC8qIFRoZXNlIG11c3QgbWF0Y2ggdGhlIHNldHRpbmdzIHVzZWQgaW4gX19rbXBfd2FpdF9zbGVlcCgpICovCisgICAgICAgIGlmICggX19rbXBfZGZsdF9ibG9ja3RpbWUgPT0gS01QX01BWF9CTE9DS1RJTUUgKSB7CisJICAgIEtGX1RSQUNFKDEwLCAoICJrbXBfZ2V0X2Jsb2NrdGltZTogVCMlZCglZDolZCksIGJsb2NrdGltZT0lZFxuIiwKKwkJCSAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIEtNUF9NQVhfQkxPQ0tUSU1FKSApOworICAgICAgICAgICAgcmV0dXJuIEtNUF9NQVhfQkxPQ0tUSU1FOworICAgICAgICB9CisjaWZkZWYgS01QX0FESlVTVF9CTE9DS1RJTUUKKyAgICAgICAgZWxzZSBpZiAoIF9fa21wX3plcm9fYnQgJiYgIWdldF9fYnRfc2V0KCB0ZWFtLCB0aWQgKSApIHsKKwkgICAgS0ZfVFJBQ0UoMTAsICggImttcF9nZXRfYmxvY2t0aW1lOiBUIyVkKCVkOiVkKSwgYmxvY2t0aW1lPSVkXG4iLAorCQkJICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwgMCkgKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisjZW5kaWYgLyogS01QX0FESlVTVF9CTE9DS1RJTUUgKi8KKyAgICAgICAgZWxzZSB7CisJICAgIEtGX1RSQUNFKDEwLCAoICJrbXBfZ2V0X2Jsb2NrdGltZTogVCMlZCglZDolZCksIGJsb2NrdGltZT0lZFxuIiwKKyAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIGdldF9fYmxvY2t0aW1lKCB0ZWFtLCB0aWQgKSApICk7CisgICAgICAgICAgICByZXR1cm4gZ2V0X19ibG9ja3RpbWUoIHRlYW0sIHRpZCApOworICAgICAgICB9OworICAgICNlbmRpZgorfQorCit2b2lkIEZUTl9TVERDQUxMCitGVE5fU0VUX0xJQlJBUllfU0VSSUFMKCB2b2lkICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgX19rbXBzX3NldF9saWJyYXJ5KCBsaWJyYXJ5X3NlcmlhbCApOworICAgICNlbHNlCisgICAgICAgIC8vIF9fa21wX3VzZXJfc2V0X2xpYnJhcnkgaW5pdGlhbGl6ZXMgdGhlIGxpYnJhcnkgaWYgbmVlZGVkCisgICAgICAgIF9fa21wX3VzZXJfc2V0X2xpYnJhcnkoIGxpYnJhcnlfc2VyaWFsICk7CisgICAgI2VuZGlmCit9CisKK3ZvaWQgRlROX1NURENBTEwKK0ZUTl9TRVRfTElCUkFSWV9UVVJOQVJPVU5EKCB2b2lkICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgX19rbXBzX3NldF9saWJyYXJ5KCBsaWJyYXJ5X3R1cm5hcm91bmQgKTsKKyAgICAjZWxzZQorICAgICAgICAvLyBfX2ttcF91c2VyX3NldF9saWJyYXJ5IGluaXRpYWxpemVzIHRoZSBsaWJyYXJ5IGlmIG5lZWRlZAorICAgICAgICBfX2ttcF91c2VyX3NldF9saWJyYXJ5KCBsaWJyYXJ5X3R1cm5hcm91bmQgKTsKKyAgICAjZW5kaWYKK30KKwordm9pZCBGVE5fU1REQ0FMTAorRlROX1NFVF9MSUJSQVJZX1RIUk9VR0hQVVQoIHZvaWQgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICBfX2ttcHNfc2V0X2xpYnJhcnkoIGxpYnJhcnlfdGhyb3VnaHB1dCApOworICAgICNlbHNlCisgICAgICAgIC8vIF9fa21wX3VzZXJfc2V0X2xpYnJhcnkgaW5pdGlhbGl6ZXMgdGhlIGxpYnJhcnkgaWYgbmVlZGVkCisgICAgICAgIF9fa21wX3VzZXJfc2V0X2xpYnJhcnkoIGxpYnJhcnlfdGhyb3VnaHB1dCApOworICAgICNlbmRpZgorfQorCit2b2lkIEZUTl9TVERDQUxMCitGVE5fU0VUX0xJQlJBUlkoIGludCBLTVBfREVSRUYgYXJnICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgX19rbXBzX3NldF9saWJyYXJ5KCBLTVBfREVSRUYgYXJnICk7CisgICAgI2Vsc2UKKyAgICAgICAgZW51bSBsaWJyYXJ5X3R5cGUgbGliOworICAgICAgICBsaWIgPSAoZW51bSBsaWJyYXJ5X3R5cGUpIEtNUF9ERVJFRiBhcmc7CisgICAgICAgIC8vIF9fa21wX3VzZXJfc2V0X2xpYnJhcnkgaW5pdGlhbGl6ZXMgdGhlIGxpYnJhcnkgaWYgbmVlZGVkCisgICAgICAgIF9fa21wX3VzZXJfc2V0X2xpYnJhcnkoIGxpYiApOworICAgICNlbmRpZgorfQorCitpbnQgRlROX1NURENBTEwKK0ZUTl9HRVRfTElCUkFSWSAodm9pZCkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgcmV0dXJuIF9fa21wc19nZXRfbGlicmFyeSgpOworICAgICNlbHNlCisgICAgICAgIGlmICggISBfX2ttcF9pbml0X3NlcmlhbCApIHsKKyAgICAgICAgICAgIF9fa21wX3NlcmlhbF9pbml0aWFsaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICgoaW50KSBfX2ttcF9saWJyYXJ5KTsKKyAgICAjZW5kaWYKK30KKworaW50IEZUTl9TVERDQUxMCitGVE5fU0VUX0FGRklOSVRZKCB2b2lkICoqbWFzayApCit7CisgICAgI2lmIGRlZmluZWQoS01QX1NUVUIpIHx8ICFLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgICAgIHJldHVybiAtMTsKKyAgICAjZWxzZQorICAgICAgICBpZiAoICEgVENSXzQoX19rbXBfaW5pdF9taWRkbGUpICkgeworICAgICAgICAgICAgX19rbXBfbWlkZGxlX2luaXRpYWxpemUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX19rbXBfYXV4X3NldF9hZmZpbml0eSggbWFzayApOworICAgICNlbmRpZgorfQorCitpbnQgRlROX1NURENBTEwKK0ZUTl9HRVRfQUZGSU5JVFkoIHZvaWQgKiptYXNrICkKK3sKKyAgICAjaWYgZGVmaW5lZChLTVBfU1RVQikgfHwgIUtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICAgICAgcmV0dXJuIC0xOworICAgICNlbHNlCisgICAgICAgIGlmICggISBUQ1JfNChfX2ttcF9pbml0X21pZGRsZSkgKSB7CisgICAgICAgICAgICBfX2ttcF9taWRkbGVfaW5pdGlhbGl6ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBfX2ttcF9hdXhfZ2V0X2FmZmluaXR5KCBtYXNrICk7CisgICAgI2VuZGlmCit9CisKK2ludCBGVE5fU1REQ0FMTAorRlROX0dFVF9BRkZJTklUWV9NQVhfUFJPQyggdm9pZCApCit7CisgICAgI2lmIGRlZmluZWQoS01QX1NUVUIpIHx8ICFLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgICAgIHJldHVybiAwOworICAgICNlbHNlCisgICAgICAgIC8vCisgICAgICAgIC8vIFdlIHJlYWxseSBvbmx5IE5FRUQgc2VyaWFsIGluaXRpYWxpemF0aW9uIGhlcmUuCisgICAgICAgIC8vCisgICAgICAgIGlmICggISBUQ1JfNChfX2ttcF9pbml0X21pZGRsZSkgKSB7CisgICAgICAgICAgICBfX2ttcF9taWRkbGVfaW5pdGlhbGl6ZSgpOworICAgICAgICB9CisgICAgICAgIGlmICggISAoIEtNUF9BRkZJTklUWV9DQVBBQkxFKCkgKSApIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAjaWYgS01QX09TX1dJTkRPV1MgJiYgS01QX0FSQ0hfWDg2XzY0CisgICAgICAgIGlmICggX19rbXBfbnVtX3Byb2NfZ3JvdXBzIDw9IDEgKSB7CisgICAgICAgICAgICByZXR1cm4gKGludClLTVBfQ1BVX1NFVFNJWkU7CisgICAgICAgIH0KKyAgICAjZW5kaWYgLyogS01QX09TX1dJTkRPV1MgJiYgS01QX0FSQ0hfWDg2XzY0ICovCisgICAgICAgIHJldHVybiBfX2ttcF94cHJvYzsKKyAgICAjZW5kaWYKK30KKwordm9pZCBGVE5fU1REQ0FMTAorRlROX0NSRUFURV9BRkZJTklUWV9NQVNLKCB2b2lkICoqbWFzayApCit7CisgICAgI2lmIGRlZmluZWQoS01QX1NUVUIpIHx8ICFLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgICAgICptYXNrID0gTlVMTDsKKyAgICAjZWxzZQorICAgICAgICAvLworICAgICAgICAvLyBXZSByZWFsbHkgb25seSBORUVEIHNlcmlhbCBpbml0aWFsaXphdGlvbiBoZXJlLgorICAgICAgICAvLworICAgICAgICBpZiAoICEgVENSXzQoX19rbXBfaW5pdF9taWRkbGUpICkgeworICAgICAgICAgICAgX19rbXBfbWlkZGxlX2luaXRpYWxpemUoKTsKKyAgICAgICAgfQorICAgICAgICAqbWFzayA9IGttcGNfbWFsbG9jKCBfX2ttcF9hZmZpbl9tYXNrX3NpemUgKTsKKyAgICAgICAgS01QX0NQVV9aRVJPKCAoa21wX2FmZmluX21hc2tfdCAqKSgqbWFzaykgKTsKKyAgICAjZW5kaWYKK30KKwordm9pZCBGVE5fU1REQ0FMTAorRlROX0RFU1RST1lfQUZGSU5JVFlfTUFTSyggdm9pZCAqKm1hc2sgKQoreworICAgICNpZiBkZWZpbmVkKEtNUF9TVFVCKSB8fCAhS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgICAgICAvLyBOb3RoaW5nCisgICAgI2Vsc2UKKyAgICAgICAgLy8KKyAgICAgICAgLy8gV2UgcmVhbGx5IG9ubHkgTkVFRCBzZXJpYWwgaW5pdGlhbGl6YXRpb24gaGVyZS4KKyAgICAgICAgLy8KKyAgICAgICAgaWYgKCAhIFRDUl80KF9fa21wX2luaXRfbWlkZGxlKSApIHsKKyAgICAgICAgICAgIF9fa21wX21pZGRsZV9pbml0aWFsaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgICAgICBpZiAoICptYXNrID09IE5VTEwgKSB7CisJICAgICAgICBLTVBfRkFUQUwoIEFmZmluaXR5SW52YWxpZE1hc2ssICJrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrIiApOworCSAgICB9CisgICAgICAgIH0KKyAgICAgICAga21wY19mcmVlKCAqbWFzayApOworICAgICAgICAqbWFzayA9IE5VTEw7CisgICAgI2VuZGlmCit9CisKK2ludCBGVE5fU1REQ0FMTAorRlROX1NFVF9BRkZJTklUWV9NQVNLX1BST0MoIGludCBLTVBfREVSRUYgcHJvYywgdm9pZCAqKm1hc2sgKQoreworICAgICNpZiBkZWZpbmVkKEtNUF9TVFVCKSB8fCAhS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgICAgICByZXR1cm4gLTE7CisgICAgI2Vsc2UKKyAgICAgICAgaWYgKCAhIFRDUl80KF9fa21wX2luaXRfbWlkZGxlKSApIHsKKyAgICAgICAgICAgIF9fa21wX21pZGRsZV9pbml0aWFsaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9fa21wX2F1eF9zZXRfYWZmaW5pdHlfbWFza19wcm9jKCBLTVBfREVSRUYgcHJvYywgbWFzayApOworICAgICNlbmRpZgorfQorCitpbnQgRlROX1NURENBTEwKK0ZUTl9VTlNFVF9BRkZJTklUWV9NQVNLX1BST0MoIGludCBLTVBfREVSRUYgcHJvYywgdm9pZCAqKm1hc2sgKQoreworICAgICNpZiBkZWZpbmVkKEtNUF9TVFVCKSB8fCAhS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgICAgICByZXR1cm4gLTE7CisgICAgI2Vsc2UKKyAgICAgICAgaWYgKCAhIFRDUl80KF9fa21wX2luaXRfbWlkZGxlKSApIHsKKyAgICAgICAgICAgIF9fa21wX21pZGRsZV9pbml0aWFsaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9fa21wX2F1eF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MoIEtNUF9ERVJFRiBwcm9jLCBtYXNrICk7CisgICAgI2VuZGlmCit9CisKK2ludCBGVE5fU1REQ0FMTAorRlROX0dFVF9BRkZJTklUWV9NQVNLX1BST0MoIGludCBLTVBfREVSRUYgcHJvYywgdm9pZCAqKm1hc2sgKQoreworICAgICNpZiBkZWZpbmVkKEtNUF9TVFVCKSB8fCAhS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgICAgICByZXR1cm4gLTE7CisgICAgI2Vsc2UKKyAgICAgICAgaWYgKCAhIFRDUl80KF9fa21wX2luaXRfbWlkZGxlKSApIHsKKyAgICAgICAgICAgIF9fa21wX21pZGRsZV9pbml0aWFsaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9fa21wX2F1eF9nZXRfYWZmaW5pdHlfbWFza19wcm9jKCBLTVBfREVSRUYgcHJvYywgbWFzayApOworICAgICNlbmRpZgorfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBzZXRzIHRoZSByZXF1ZXN0ZWQgbnVtYmVyIG9mIHRocmVhZHMgZm9yIHRoZSBuZXh0IHBhcmFsbGVsIHJlZ2lvbiAqLworCit2b2lkIEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9TRVRfTlVNX1RIUkVBRFMpKCBpbnQgS01QX0RFUkVGIGFyZyApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIC8vIE5vdGhpbmcuCisgICAgI2Vsc2UKKyAgICAgICAgX19rbXBfc2V0X251bV90aHJlYWRzKCBLTVBfREVSRUYgYXJnLCBfX2ttcF9lbnRyeV9ndGlkKCkgKTsKKyAgICAjZW5kaWYKK30KKworCisvKiByZXR1cm5zIHRoZSBudW1iZXIgb2YgdGhyZWFkcyBpbiBjdXJyZW50IHRlYW0gKi8KK2ludCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fR0VUX05VTV9USFJFQURTKSggdm9pZCApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIHJldHVybiAxOworICAgICNlbHNlCisgICAgICAgIC8vIF9fa21wY19ib3VuZF9udW1fdGhyZWFkcyBpbml0aWFsaXplcyB0aGUgbGlicmFyeSBpZiBuZWVkZWQKKyAgICAgICAgcmV0dXJuIF9fa21wY19ib3VuZF9udW1fdGhyZWFkcyhOVUxMKTsKKyAgICAjZW5kaWYKK30KKworaW50IEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9HRVRfTUFYX1RIUkVBRFMpKCB2b2lkICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgcmV0dXJuIDE7CisgICAgI2Vsc2UKKyAgICAgICAgaW50ICAgICAgICAgZ3RpZDsKKyAgICAgICAga21wX2luZm9fdCAqdGhyZWFkOworICAgICAgICBpZiAoICEgVENSXzQoX19rbXBfaW5pdF9taWRkbGUpICkgeworICAgICAgICAgICAgX19rbXBfbWlkZGxlX2luaXRpYWxpemUoKTsKKyAgICAgICAgfQorICAgICAgICBndGlkICAgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgICAgICAgIHRocmVhZCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKyAgICAgICAgLy9yZXR1cm4gdGhyZWFkIC0+IHRoLnRoX3RlYW0gLT4gdC50X2N1cnJlbnRfdGFza1sgdGhyZWFkLT50aC50aF9pbmZvLmRzLmRzX3RpZCBdIC0+IGljdnMubnByb2M7CisJcmV0dXJuIHRocmVhZCAtPiB0aC50aF9jdXJyZW50X3Rhc2sgLT4gdGRfaWN2cy5ucHJvYzsKKyAgICAjZW5kaWYKK30KKworaW50IEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9HRVRfVEhSRUFEX05VTSkoIHZvaWQgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICByZXR1cm4gMDsKKyAgICAjZWxzZQorICAgICAgICBpbnQgZ3RpZDsKKworICAgICAgICAjaWYgS01QX09TX0RBUldJTiB8fCBLTVBfT1NfRlJFRUJTRAorICAgICAgICAgICAgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKyAgICAgICAgI2VsaWYgS01QX09TX1dJTkRPV1MKKyAgICAgICAgICAgIGlmICghX19rbXBfaW5pdF9wYXJhbGxlbCB8fAorICAgICAgICAgICAgICAgIChndGlkID0gKGludCkoKGttcF9pbnRwdHJfdClUbHNHZXRWYWx1ZSggX19rbXBfZ3RpZF90aHJlYWRwcml2YXRlX2tleSApKSkgPT0gMCkgeworICAgICAgICAgICAgICAgIC8vIEVpdGhlciBsaWJyYXJ5IGlzbid0IGluaXRpYWxpemVkIG9yIHRocmVhZCBpcyBub3QgcmVnaXN0ZXJlZAorICAgICAgICAgICAgICAgIC8vIDAgaXMgdGhlIGNvcnJlY3QgVElEIGluIHRoaXMgY2FzZQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLS1ndGlkOyAvLyBXZSBrZWVwIChndGlkKzEpIGluIFRMUworICAgICAgICAjZWxpZiBLTVBfT1NfTElOVVgKKyAgICAgICAgICAgICNpZmRlZiBLTVBfVERBVEFfR1RJRAorICAgICAgICAgICAgaWYgKCBfX2ttcF9ndGlkX21vZGUgPj0gMyApIHsKKyAgICAgICAgICAgICAgICBpZiAoKGd0aWQgPSBfX2ttcF9ndGlkKSA9PSBLTVBfR1RJRF9ETkUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgIGlmICghX19rbXBfaW5pdF9wYXJhbGxlbCB8fAorICAgICAgICAgICAgICAgICAgICAoZ3RpZCA9IChrbXBfaW50cHRyX3QpKHB0aHJlYWRfZ2V0c3BlY2lmaWMoIF9fa21wX2d0aWRfdGhyZWFkcHJpdmF0ZV9rZXkgKSkpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC0tZ3RpZDsKKyAgICAgICAgICAgICNpZmRlZiBLTVBfVERBVEFfR1RJRAorICAgICAgICAgICAgfQorICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICNlbHNlCisgICAgICAgICAgICAjZXJyb3IgVW5rbm93biBvciB1bnN1cHBvcnRlZCBPUworICAgICAgICAjZW5kaWYKKworICAgICAgICByZXR1cm4gX19rbXBfdGlkX2Zyb21fZ3RpZCggZ3RpZCApOworICAgICNlbmRpZgorfQorCitpbnQgRlROX1NURENBTEwKK0ZUTl9HRVRfTlVNX0tOT1dOX1RIUkVBRFMoIHZvaWQgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICByZXR1cm4gMTsKKyAgICAjZWxzZQorICAgICAgICBpZiAoICEgX19rbXBfaW5pdF9zZXJpYWwgKSB7CisgICAgICAgICAgICBfX2ttcF9zZXJpYWxfaW5pdGlhbGl6ZSgpOworICAgICAgICB9CisgICAgICAgIC8qIE5PVEU6IHRoaXMgaXMgbm90IHN5bmNyb25pemVkLCBzbyBpdCBjYW4gY2hhbmdlIGF0IGFueSBtb21lbnQgKi8KKyAgICAgICAgLyogTk9URTogdGhpcyBudW1iZXIgYWxzbyBpbmNsdWRlcyB0aHJlYWRzIHByZWFsbG9jYXRlZCBpbiBob3QtdGVhbXMgKi8KKyAgICAgICAgcmV0dXJuIFRDUl80KF9fa21wX250aCk7CisgICAgI2VuZGlmCit9CisKK2ludCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fR0VUX05VTV9QUk9DUykoIHZvaWQgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICByZXR1cm4gMTsKKyAgICAjZWxzZQorICAgICAgICBpZiAoICEgVENSXzQoX19rbXBfaW5pdF9taWRkbGUpICkgeworICAgICAgICAgICAgX19rbXBfbWlkZGxlX2luaXRpYWxpemUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX19rbXBfYXZhaWxfcHJvYzsKKyAgICAjZW5kaWYKK30KKwordm9pZCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fU0VUX05FU1RFRCkoIGludCBLTVBfREVSRUYgZmxhZyApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIF9fa21wc19zZXRfbmVzdGVkKCBLTVBfREVSRUYgZmxhZyApOworICAgICNlbHNlCisgICAgICAgIGttcF9pbmZvX3QgKnRocmVhZDsKKyAgICAgICAgLyogRm9yIHRoZSB0aHJlYWQtcHJpdmF0ZSBpbnRlcm5hbCBjb250cm9scyBpbXBsZW1lbnRhdGlvbiAqLworICAgICAgICB0aHJlYWQgPSBfX2ttcF9lbnRyeV90aHJlYWQoKTsKKyAgICAgICAgX19rbXBfc2F2ZV9pbnRlcm5hbF9jb250cm9scyggdGhyZWFkICk7CisgICAgICAgIHNldF9fbmVzdGVkKCB0aHJlYWQsICggKEtNUF9ERVJFRiBmbGFnKSA/IFRSVUUgOiBGQUxTRSApICk7CisgICAgI2VuZGlmCit9CisKKworaW50IEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9HRVRfTkVTVEVEKSggdm9pZCApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIHJldHVybiBfX2ttcHNfZ2V0X25lc3RlZCgpOworICAgICNlbHNlCisgICAgICAgIGttcF9pbmZvX3QgKnRocmVhZDsKKyAgICAgICAgdGhyZWFkID0gX19rbXBfZW50cnlfdGhyZWFkKCk7CisgICAgICAgIHJldHVybiBnZXRfX25lc3RlZCggdGhyZWFkICk7CisgICAgI2VuZGlmCit9CisKK3ZvaWQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX1NFVF9EWU5BTUlDKSggaW50IEtNUF9ERVJFRiBmbGFnICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgX19rbXBzX3NldF9keW5hbWljKCBLTVBfREVSRUYgZmxhZyA/IFRSVUUgOiBGQUxTRSApOworICAgICNlbHNlCisgICAgICAgIGttcF9pbmZvX3QgKnRocmVhZDsKKyAgICAgICAgLyogRm9yIHRoZSB0aHJlYWQtcHJpdmF0ZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgaW50ZXJuYWwgY29udHJvbHMgKi8KKyAgICAgICAgdGhyZWFkID0gX19rbXBfZW50cnlfdGhyZWFkKCk7CisgICAgICAgIC8vICEhISBXaGF0IGlmIGZvcmVpZ24gdGhyZWFkIGNhbGxzIGl0PworICAgICAgICBfX2ttcF9zYXZlX2ludGVybmFsX2NvbnRyb2xzKCB0aHJlYWQgKTsKKyAgICAgICAgc2V0X19keW5hbWljKCB0aHJlYWQsIEtNUF9ERVJFRiBmbGFnID8gVFJVRSA6IEZBTFNFICk7CisgICAgI2VuZGlmCit9CisKKworaW50IEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9HRVRfRFlOQU1JQykoIHZvaWQgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICByZXR1cm4gX19rbXBzX2dldF9keW5hbWljKCk7CisgICAgI2Vsc2UKKyAgICAgICAga21wX2luZm9fdCAqdGhyZWFkOworICAgICAgICB0aHJlYWQgPSBfX2ttcF9lbnRyeV90aHJlYWQoKTsKKyAgICAgICAgcmV0dXJuIGdldF9fZHluYW1pYyggdGhyZWFkICk7CisgICAgI2VuZGlmCit9CisKK2ludCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fSU5fUEFSQUxMRUwpKCB2b2lkICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgcmV0dXJuIDA7CisgICAgI2Vsc2UKKyAgICAgICAga21wX2luZm9fdCAqdGggPSBfX2ttcF9lbnRyeV90aHJlYWQoKTsKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICBpZiAoIHRoLT50aC50aF90ZWFtc19taWNyb3Rhc2sgKSB7CisgICAgICAgICAgICAvLyBBQzogcl9pbl9wYXJhbGxlbCBkb2VzIG5vdCB3b3JrIGluc2lkZSB0ZWFtcyBjb25zdHJ1Y3QKKyAgICAgICAgICAgIC8vICAgICB3aGVyZSByZWFsIHBhcmFsbGVsIGlzIGluYWN0aXZlLCBidXQgYWxsIHRocmVhZHMgaGF2ZSBzYW1lIHJvb3QsCisgICAgICAgICAgICAvLyAgICAgc28gc2V0dGluZyBpdCBpbiBvbmUgdGVhbSBhZmZlY3RzIG90aGVyIHRlYW1zLgorICAgICAgICAgICAgLy8gICAgIFRoZSBzb2x1dGlvbiBpcyB0byB1c2UgcGVyLXRlYW0gbmVzdGluZyBsZXZlbAorICAgICAgICAgICAgcmV0dXJuICggdGgtPnRoLnRoX3RlYW0tPnQudF9hY3RpdmVfbGV2ZWwgPyAxIDogMCApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworICAgICAgICAgICAgcmV0dXJuICggdGgtPnRoLnRoX3Jvb3QtPnIucl9pbl9wYXJhbGxlbCA/IEZUTl9UUlVFIDogRlROX0ZBTFNFICk7CisgICAgI2VuZGlmCit9CisKK3ZvaWQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX1NFVF9TQ0hFRFVMRSkoIGttcF9zY2hlZF90IEtNUF9ERVJFRiBraW5kLCBpbnQgS01QX0RFUkVGIG1vZGlmaWVyICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgX19rbXBzX3NldF9zY2hlZHVsZSggS01QX0RFUkVGIGtpbmQsIEtNUF9ERVJFRiBtb2RpZmllciApOworICAgICNlbHNlCisJLyogIFRPIERPICAqLworICAgICAgICAvKiBGb3IgdGhlIHBlci10YXNrIGltcGxlbWVudGF0aW9uIG9mIHRoZSBpbnRlcm5hbCBjb250cm9scyAqLworICAgICAgICBfX2ttcF9zZXRfc2NoZWR1bGUoIF9fa21wX2VudHJ5X2d0aWQoKSwgS01QX0RFUkVGIGtpbmQsIEtNUF9ERVJFRiBtb2RpZmllciApOworICAgICNlbmRpZgorfQorCit2b2lkIEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9HRVRfU0NIRURVTEUpKCBrbXBfc2NoZWRfdCAqIGtpbmQsIGludCAqIG1vZGlmaWVyICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgX19rbXBzX2dldF9zY2hlZHVsZSgga2luZCwgbW9kaWZpZXIgKTsKKyAgICAjZWxzZQorCS8qICBUTyBETyAgKi8KKwkvKiBGb3IgdGhlIHBlci10YXNrIGltcGxlbWVudGF0aW9uIG9mIHRoZSBpbnRlcm5hbCBjb250cm9scyAqLworICAgICAgICBfX2ttcF9nZXRfc2NoZWR1bGUoIF9fa21wX2VudHJ5X2d0aWQoKSwga2luZCwgbW9kaWZpZXIgKTsKKyAgICAjZW5kaWYKK30KKwordm9pZCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fU0VUX01BWF9BQ1RJVkVfTEVWRUxTKSggaW50IEtNUF9ERVJFRiBhcmcgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorCS8vIE5vdGhpbmcuCisgICAgI2Vsc2UKKwkvKiAgVE8gRE8gICovCisgICAgICAgIC8qIFdlIHdhbnQgcGVyLXRhc2sgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBpbnRlcm5hbCBjb250cm9sICovCisgICAgICAgIF9fa21wX3NldF9tYXhfYWN0aXZlX2xldmVscyggX19rbXBfZW50cnlfZ3RpZCgpLCBLTVBfREVSRUYgYXJnICk7CisgICAgI2VuZGlmCit9CisKK2ludCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fR0VUX01BWF9BQ1RJVkVfTEVWRUxTKSggdm9pZCApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisJcmV0dXJuIDA7CisgICAgI2Vsc2UKKwkvKiAgVE8gRE8gICovCisJLyogV2Ugd2FudCBwZXItdGFzayBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGludGVybmFsIGNvbnRyb2wgKi8KKwlyZXR1cm4gX19rbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzKCBfX2ttcF9lbnRyeV9ndGlkKCkgKTsKKyAgICAjZW5kaWYKK30KKworaW50IEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9HRVRfQUNUSVZFX0xFVkVMKSggdm9pZCApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisJcmV0dXJuIDA7IC8vIHJldHVybnMgMCBpZiBpdCBpcyBjYWxsZWQgZnJvbSB0aGUgc2VxdWVudGlhbCBwYXJ0IG9mIHRoZSBwcm9ncmFtCisgICAgI2Vsc2UKKwkvKiAgVE8gRE8gICovCisJLyogRm9yIHRoZSBwZXItdGFzayBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgaW50ZXJuYWwgY29udHJvbHMgKi8KKyAgICAgICAgcmV0dXJuIF9fa21wX2VudHJ5X3RocmVhZCgpIC0+IHRoLnRoX3RlYW0gLT4gdC50X2FjdGl2ZV9sZXZlbDsKKyAgICAjZW5kaWYKK30KKworaW50IEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9HRVRfTEVWRUwpKCB2b2lkICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKwlyZXR1cm4gMDsgLy8gcmV0dXJucyAwIGlmIGl0IGlzIGNhbGxlZCBmcm9tIHRoZSBzZXF1ZW50aWFsIHBhcnQgb2YgdGhlIHByb2dyYW0KKyAgICAjZWxzZQorCS8qICBUTyBETyAgKi8KKwkvKiBGb3IgdGhlIHBlci10YXNrIGltcGxlbWVudGF0aW9uIG9mIHRoZSBpbnRlcm5hbCBjb250cm9scyAqLworICAgICAgICByZXR1cm4gX19rbXBfZW50cnlfdGhyZWFkKCkgLT4gdGgudGhfdGVhbSAtPiB0LnRfbGV2ZWw7CisgICAgI2VuZGlmCit9CisKK2ludCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fR0VUX0FOQ0VTVE9SX1RIUkVBRF9OVU0pKCBpbnQgS01QX0RFUkVGIGxldmVsICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKwlyZXR1cm4gKCBLTVBfREVSRUYgbGV2ZWwgKSA/ICggLTEgKSA6ICggMCApOworICAgICNlbHNlCisJcmV0dXJuIF9fa21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtKCBfX2ttcF9lbnRyeV9ndGlkKCksIEtNUF9ERVJFRiBsZXZlbCApOworICAgICNlbmRpZgorfQorCitpbnQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX0dFVF9URUFNX1NJWkUpKCBpbnQgS01QX0RFUkVGIGxldmVsICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgcmV0dXJuICggS01QX0RFUkVGIGxldmVsICkgPyAoIC0xICkgOiAoIDEgKTsKKyAgICAjZWxzZQorICAgICAgICByZXR1cm4gX19rbXBfZ2V0X3RlYW1fc2l6ZSggX19rbXBfZW50cnlfZ3RpZCgpLCBLTVBfREVSRUYgbGV2ZWwgKTsKKyAgICAjZW5kaWYKK30KKworaW50IEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9HRVRfVEhSRUFEX0xJTUlUKSggdm9pZCApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisJcmV0dXJuIDE7ICAgLy8gVE8gRE86IGNsYXJpZnkgd2hldGhlciBpdCByZXR1cm5zIDEgb3IgMD8KKyAgICAjZWxzZQorICAgICAgICBpZiAoICEgX19rbXBfaW5pdF9zZXJpYWwgKSB7CisgICAgICAgICAgICBfX2ttcF9zZXJpYWxfaW5pdGlhbGl6ZSgpOworICAgICAgICB9OworICAgICAgICAvKiBnbG9iYWwgSUNWICovCisJcmV0dXJuIF9fa21wX21heF9udGg7CisgICAgI2VuZGlmCit9CisKK2ludCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fSU5fRklOQUwpKCB2b2lkICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKwlyZXR1cm4gMDsgICAvLyBUTyBETzogY2xhcmlmeSB3aGV0aGVyIGl0IHJldHVybnMgMSBvciAwPworICAgICNlbHNlCisgICAgICAgIGlmICggISBUQ1JfNChfX2ttcF9pbml0X3BhcmFsbGVsKSApIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisJcmV0dXJuIF9fa21wX2VudHJ5X3RocmVhZCgpIC0+IHRoLnRoX2N1cnJlbnRfdGFzayAtPiB0ZF9mbGFncy5maW5hbDsKKyAgICAjZW5kaWYKK30KKworI2lmIE9NUF80MF9FTkFCTEVECisKKwora21wX3Byb2NfYmluZF90IEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9HRVRfUFJPQ19CSU5EKSggdm9pZCApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIHJldHVybiBfX2ttcHNfZ2V0X3Byb2NfYmluZCgpOworICAgICNlbHNlCisgICAgICAgIHJldHVybiBnZXRfX3Byb2NfYmluZCggX19rbXBfZW50cnlfdGhyZWFkKCkgKTsKKyAgICAjZW5kaWYKK30KKworaW50IEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9HRVRfTlVNX1RFQU1TKSggdm9pZCApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIHJldHVybiAxOworICAgICNlbHNlCisgICAgICAgIGttcF9pbmZvX3QgKnRociA9IF9fa21wX2VudHJ5X3RocmVhZCgpOworICAgICAgICBpZiAoIHRoci0+dGgudGhfdGVhbXNfbWljcm90YXNrICkgeworICAgICAgICAgICAga21wX3RlYW1fdCAqdGVhbSA9IHRoci0+dGgudGhfdGVhbTsKKyAgICAgICAgICAgIGludCB0bGV2ZWwgPSB0aHItPnRoLnRoX3RlYW1zX2xldmVsOworICAgICAgICAgICAgaW50IGlpID0gdGVhbS0+dC50X2xldmVsOyAgICAgICAgICAgIC8vIHRoZSBsZXZlbCBvZiB0aGUgdGVhbXMgY29uc3RydWN0CisgICAgICAgICAgICBpbnQgZGQgPSB0ZWFtIC0+IHQudF9zZXJpYWxpemVkOworICAgICAgICAgICAgaW50IGxldmVsID0gdGxldmVsICsgMTsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGlpID49IHRsZXZlbCApOworICAgICAgICAgICAgd2hpbGUoIGlpID4gbGV2ZWwgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciggZGQgPSB0ZWFtIC0+IHQudF9zZXJpYWxpemVkOyAoIGRkID4gMCApICYmICggaWkgPiBsZXZlbCApOyBkZC0tLCBpaS0tICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKCB0ZWFtIC0+IHQudF9zZXJpYWxpemVkICYmICggIWRkICkgKSB7CisgICAgICAgICAgICAgICAgICAgIHRlYW0gPSB0ZWFtLT50LnRfcGFyZW50OworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYoIGlpID4gbGV2ZWwgKSB7CisgICAgICAgICAgICAgICAgICAgIHRlYW0gPSB0ZWFtLT50LnRfcGFyZW50OworICAgICAgICAgICAgICAgICAgICBpaS0tOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggZGQgPiAxICkgeworICAgICAgICAgICAgICAgIHJldHVybiAxOyAgLy8gdGVhbXMgcmVnaW9uIGlzIHNlcmlhbGl6ZWQgKCAxIHRlYW0gb2YgMSB0aHJlYWQgKS4KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRlYW0tPnQudF9wYXJlbnQtPnQudF9ucHJvYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgI2VuZGlmCit9CisKK2ludCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fR0VUX1RFQU1fTlVNKSggdm9pZCApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIHJldHVybiAwOworICAgICNlbHNlCisgICAgICAgIGttcF9pbmZvX3QgKnRociA9IF9fa21wX2VudHJ5X3RocmVhZCgpOworICAgICAgICBpZiAoIHRoci0+dGgudGhfdGVhbXNfbWljcm90YXNrICkgeworICAgICAgICAgICAga21wX3RlYW1fdCAqdGVhbSA9IHRoci0+dGgudGhfdGVhbTsKKyAgICAgICAgICAgIGludCB0bGV2ZWwgPSB0aHItPnRoLnRoX3RlYW1zX2xldmVsOyAvLyB0aGUgbGV2ZWwgb2YgdGhlIHRlYW1zIGNvbnN0cnVjdAorICAgICAgICAgICAgaW50IGlpID0gdGVhbS0+dC50X2xldmVsOworICAgICAgICAgICAgaW50IGRkID0gdGVhbSAtPiB0LnRfc2VyaWFsaXplZDsKKyAgICAgICAgICAgIGludCBsZXZlbCA9IHRsZXZlbCArIDE7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBpaSA+PSB0bGV2ZWwgKTsKKyAgICAgICAgICAgIHdoaWxlKCBpaSA+IGxldmVsICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IoIGRkID0gdGVhbSAtPiB0LnRfc2VyaWFsaXplZDsgKCBkZCA+IDAgKSAmJiAoIGlpID4gbGV2ZWwgKTsgZGQtLSwgaWktLSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiggdGVhbSAtPiB0LnRfc2VyaWFsaXplZCAmJiAoICFkZCApICkgeworICAgICAgICAgICAgICAgICAgICB0ZWFtID0gdGVhbS0+dC50X3BhcmVudDsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKCBpaSA+IGxldmVsICkgeworICAgICAgICAgICAgICAgICAgICB0ZWFtID0gdGVhbS0+dC50X3BhcmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWktLTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIGRkID4gMSApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsgIC8vIHRlYW1zIHJlZ2lvbiBpcyBzZXJpYWxpemVkICggMSB0ZWFtIG9mIDEgdGhyZWFkICkuCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiB0ZWFtLT50LnRfbWFzdGVyX3RpZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgI2VuZGlmCit9CisKKyNpZiBLTVBfTUlDIHx8IEtNUF9PU19EQVJXSU4KKworc3RhdGljIGludCBfX2ttcF9kZWZhdWx0X2RldmljZSA9IDA7CisKK2ludCBGVE5fU1REQ0FMTAorRlROX0dFVF9ERUZBVUxUX0RFVklDRSggdm9pZCApCit7CisgICAgcmV0dXJuIF9fa21wX2RlZmF1bHRfZGV2aWNlOworfQorCit2b2lkIEZUTl9TVERDQUxMCitGVE5fU0VUX0RFRkFVTFRfREVWSUNFKCBpbnQgS01QX0RFUkVGIGFyZyApCit7CisgICAgX19rbXBfZGVmYXVsdF9kZXZpY2UgPSBLTVBfREVSRUYgYXJnOworfQorCitpbnQgRlROX1NURENBTEwKK0ZUTl9HRVRfTlVNX0RFVklDRVMoIHZvaWQgKQoreworICAgIHJldHVybiAwOworfQorCisjZW5kaWYgLy8gS01QX01JQyB8fCBLTVBfT1NfREFSV0lOCisKKyNlbmRpZiAvLyBPTVBfNDBfRU5BQkxFRAorCisjaWZkZWYgS01QX1NUVUIKK3R5cGVkZWYgZW51bSB7IFVOSU5JVCA9IC0xLCBVTkxPQ0tFRCwgTE9DS0VEIH0ga21wX3N0dWJfbG9ja190OworI2VuZGlmIC8qIEtNUF9TVFVCICovCisKKy8qIGluaXRpYWxpemUgdGhlIGxvY2sgKi8KK3ZvaWQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX0lOSVRfTE9DSykoIHZvaWQgKip1c2VyX2xvY2sgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICAqKChrbXBfc3R1Yl9sb2NrX3QgKil1c2VyX2xvY2spID0gVU5MT0NLRUQ7CisgICAgI2Vsc2UKKyAgICAgICAgX19rbXBjX2luaXRfbG9jayggTlVMTCwgX19rbXBfZW50cnlfZ3RpZCgpLCB1c2VyX2xvY2sgKTsKKyAgICAjZW5kaWYKK30KKworLyogaW5pdGlhbGl6ZSB0aGUgbG9jayAqLwordm9pZCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fSU5JVF9ORVNUX0xPQ0spKCB2b2lkICoqdXNlcl9sb2NrICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgKigoa21wX3N0dWJfbG9ja190ICopdXNlcl9sb2NrKSA9IFVOTE9DS0VEOworICAgICNlbHNlCisgICAgICAgIF9fa21wY19pbml0X25lc3RfbG9jayggTlVMTCwgX19rbXBfZW50cnlfZ3RpZCgpLCB1c2VyX2xvY2sgKTsKKyAgICAjZW5kaWYKK30KKwordm9pZCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fREVTVFJPWV9MT0NLKSggdm9pZCAqKnVzZXJfbG9jayApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgICooKGttcF9zdHViX2xvY2tfdCAqKXVzZXJfbG9jaykgPSBVTklOSVQ7CisgICAgI2Vsc2UKKyAgICAgICAgX19rbXBjX2Rlc3Ryb3lfbG9jayggTlVMTCwgX19rbXBfZW50cnlfZ3RpZCgpLCB1c2VyX2xvY2sgKTsKKyAgICAjZW5kaWYKK30KKwordm9pZCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fREVTVFJPWV9ORVNUX0xPQ0spKCB2b2lkICoqdXNlcl9sb2NrICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgKigoa21wX3N0dWJfbG9ja190ICopdXNlcl9sb2NrKSA9IFVOSU5JVDsKKyAgICAjZWxzZQorICAgICAgICBfX2ttcGNfZGVzdHJveV9uZXN0X2xvY2soIE5VTEwsIF9fa21wX2VudHJ5X2d0aWQoKSwgdXNlcl9sb2NrICk7CisgICAgI2VuZGlmCit9CisKK3ZvaWQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX1NFVF9MT0NLKSggdm9pZCAqKnVzZXJfbG9jayApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIGlmICggKigoa21wX3N0dWJfbG9ja190ICopdXNlcl9sb2NrKSA9PSBVTklOSVQgKSB7CisgICAgICAgICAgICAvLyBUT0RPOiBJc3N1ZSBhbiBlcnJvci4KKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgaWYgKCAqKChrbXBfc3R1Yl9sb2NrX3QgKil1c2VyX2xvY2spICE9IFVOTE9DS0VEICkgeworICAgICAgICAgICAgLy8gVE9ETzogSXNzdWUgYW4gZXJyb3IuCisgICAgICAgIH07IC8vIGlmCisgICAgICAgICooKGttcF9zdHViX2xvY2tfdCAqKXVzZXJfbG9jaykgPSBMT0NLRUQ7CisgICAgI2Vsc2UKKyAgICAgICAgX19rbXBjX3NldF9sb2NrKCBOVUxMLCBfX2ttcF9lbnRyeV9ndGlkKCksIHVzZXJfbG9jayApOworICAgICNlbmRpZgorfQorCit2b2lkIEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9TRVRfTkVTVF9MT0NLKSggdm9pZCAqKnVzZXJfbG9jayApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIGlmICggKigoa21wX3N0dWJfbG9ja190ICopdXNlcl9sb2NrKSA9PSBVTklOSVQgKSB7CisgICAgICAgICAgICAvLyBUT0RPOiBJc3N1ZSBhbiBlcnJvci4KKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgKCooKGludCAqKXVzZXJfbG9jaykpKys7CisgICAgI2Vsc2UKKyAgICAgICAgX19rbXBjX3NldF9uZXN0X2xvY2soIE5VTEwsIF9fa21wX2VudHJ5X2d0aWQoKSwgdXNlcl9sb2NrICk7CisgICAgI2VuZGlmCit9CisKK3ZvaWQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX1VOU0VUX0xPQ0spKCB2b2lkICoqdXNlcl9sb2NrICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgaWYgKCAqKChrbXBfc3R1Yl9sb2NrX3QgKil1c2VyX2xvY2spID09IFVOSU5JVCApIHsKKyAgICAgICAgICAgIC8vIFRPRE86IElzc3VlIGFuIGVycm9yLgorICAgICAgICB9OyAvLyBpZgorICAgICAgICBpZiAoICooKGttcF9zdHViX2xvY2tfdCAqKXVzZXJfbG9jaykgPT0gVU5MT0NLRUQgKSB7CisgICAgICAgICAgICAvLyBUT0RPOiBJc3N1ZSBhbiBlcnJvci4KKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgKigoa21wX3N0dWJfbG9ja190ICopdXNlcl9sb2NrKSA9IFVOTE9DS0VEOworICAgICNlbHNlCisgICAgICAgIF9fa21wY191bnNldF9sb2NrKCBOVUxMLCBfX2ttcF9lbnRyeV9ndGlkKCksIHVzZXJfbG9jayApOworICAgICNlbmRpZgorfQorCit2b2lkIEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9VTlNFVF9ORVNUX0xPQ0spKCB2b2lkICoqdXNlcl9sb2NrICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgaWYgKCAqKChrbXBfc3R1Yl9sb2NrX3QgKil1c2VyX2xvY2spID09IFVOSU5JVCApIHsKKyAgICAgICAgICAgIC8vIFRPRE86IElzc3VlIGFuIGVycm9yLgorICAgICAgICB9OyAvLyBpZgorICAgICAgICBpZiAoICooKGttcF9zdHViX2xvY2tfdCAqKXVzZXJfbG9jaykgPT0gVU5MT0NLRUQgKSB7CisgICAgICAgICAgICAvLyBUT0RPOiBJc3N1ZSBhbiBlcnJvci4KKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgKCooKGludCAqKXVzZXJfbG9jaykpLS07CisgICAgI2Vsc2UKKyAgICAgICAgX19rbXBjX3Vuc2V0X25lc3RfbG9jayggTlVMTCwgX19rbXBfZW50cnlfZ3RpZCgpLCB1c2VyX2xvY2sgKTsKKyAgICAjZW5kaWYKK30KKworaW50IEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9URVNUX0xPQ0spKCB2b2lkICoqdXNlcl9sb2NrICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgaWYgKCAqKChrbXBfc3R1Yl9sb2NrX3QgKil1c2VyX2xvY2spID09IFVOSU5JVCApIHsKKyAgICAgICAgICAgIC8vIFRPRE86IElzc3VlIGFuIGVycm9yLgorICAgICAgICB9OyAvLyBpZgorICAgICAgICBpZiAoICooKGttcF9zdHViX2xvY2tfdCAqKXVzZXJfbG9jaykgPT0gTE9DS0VEICkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH07IC8vIGlmCisgICAgICAgICooKGttcF9zdHViX2xvY2tfdCAqKXVzZXJfbG9jaykgPSBMT0NLRUQ7CisgICAgICAgIHJldHVybiAxOworICAgICNlbHNlCisgICAgICAgIHJldHVybiBfX2ttcGNfdGVzdF9sb2NrKCBOVUxMLCBfX2ttcF9lbnRyeV9ndGlkKCksIHVzZXJfbG9jayApOworICAgICNlbmRpZgorfQorCitpbnQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX1RFU1RfTkVTVF9MT0NLKSggdm9pZCAqKnVzZXJfbG9jayApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIGlmICggKigoa21wX3N0dWJfbG9ja190ICopdXNlcl9sb2NrKSA9PSBVTklOSVQgKSB7CisgICAgICAgICAgICAvLyBUT0RPOiBJc3N1ZSBhbiBlcnJvci4KKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgcmV0dXJuICsrKCooKGludCAqKXVzZXJfbG9jaykpOworICAgICNlbHNlCisgICAgICAgIHJldHVybiBfX2ttcGNfdGVzdF9uZXN0X2xvY2soIE5VTEwsIF9fa21wX2VudHJ5X2d0aWQoKSwgdXNlcl9sb2NrICk7CisgICAgI2VuZGlmCit9CisKK2RvdWJsZSBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fR0VUX1dUSU1FKSggdm9pZCApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIHJldHVybiBfX2ttcHNfZ2V0X3d0aW1lKCk7CisgICAgI2Vsc2UKKyAgICAgICAgZG91YmxlIGRhdGE7CisgICAgICAgICNpZiAhIEtNUF9PU19MSU5VWAorICAgICAgICAvLyBXZSBkb24ndCBuZWVkIGxpYnJhcnkgaW5pdGlhbGl6YXRpb24gdG8gZ2V0IHRoZSB0aW1lIG9uIExpbnV4KiBPUy4KKyAgICAgICAgLy8gVGhlIHJvdXRpbmUgY2FuIGJlIHVzZWQgdG8gbWVhc3VyZSBsaWJyYXJ5IGluaXRpYWxpemF0aW9uIHRpbWUgb24gTGludXgqIE9TIG5vdy4KKyAgICAgICAgaWYgKCAhIF9fa21wX2luaXRfc2VyaWFsICkgeworICAgICAgICAgICAgX19rbXBfc2VyaWFsX2luaXRpYWxpemUoKTsKKyAgICAgICAgfTsKKyAgICAgICAgI2VuZGlmCisgICAgICAgIF9fa21wX2VsYXBzZWQoICYgZGF0YSApOworICAgICAgICByZXR1cm4gZGF0YTsKKyAgICAjZW5kaWYKK30KKworZG91YmxlIEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9HRVRfV1RJQ0spKCB2b2lkICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgcmV0dXJuIF9fa21wc19nZXRfd3RpY2soKTsKKyAgICAjZWxzZQorICAgICAgICBkb3VibGUgZGF0YTsKKyAgICAgICAgaWYgKCAhIF9fa21wX2luaXRfc2VyaWFsICkgeworICAgICAgICAgICAgX19rbXBfc2VyaWFsX2luaXRpYWxpemUoKTsKKyAgICAgICAgfTsKKyAgICAgICAgX19rbXBfZWxhcHNlZF90aWNrKCAmIGRhdGEgKTsKKyAgICAgICAgcmV0dXJuIGRhdGE7CisgICAgI2VuZGlmCit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkICogRlROX1NURENBTEwKK0ZUTl9NQUxMT0MoIHNpemVfdCBLTVBfREVSRUYgc2l6ZSApCit7CisgICAgLy8ga21wY19tYWxsb2MgaW5pdGlhbGl6ZXMgdGhlIGxpYnJhcnkgaWYgbmVlZGVkCisgICAgcmV0dXJuIGttcGNfbWFsbG9jKCBLTVBfREVSRUYgc2l6ZSApOworfQorCit2b2lkICogRlROX1NURENBTEwKK0ZUTl9DQUxMT0MoIHNpemVfdCBLTVBfREVSRUYgbmVsZW0sIHNpemVfdCBLTVBfREVSRUYgZWxzaXplICkKK3sKKyAgICAvLyBrbXBjX2NhbGxvYyBpbml0aWFsaXplcyB0aGUgbGlicmFyeSBpZiBuZWVkZWQKKyAgICByZXR1cm4ga21wY19jYWxsb2MoIEtNUF9ERVJFRiBuZWxlbSwgS01QX0RFUkVGIGVsc2l6ZSApOworfQorCit2b2lkICogRlROX1NURENBTEwKK0ZUTl9SRUFMTE9DKCB2b2lkICogS01QX0RFUkVGIHB0ciwgc2l6ZV90IEtNUF9ERVJFRiBzaXplICkKK3sKKyAgICAvLyBrbXBjX3JlYWxsb2MgaW5pdGlhbGl6ZXMgdGhlIGxpYnJhcnkgaWYgbmVlZGVkCisgICAgcmV0dXJuIGttcGNfcmVhbGxvYyggS01QX0RFUkVGIHB0ciwgS01QX0RFUkVGIHNpemUgKTsKK30KKwordm9pZCBGVE5fU1REQ0FMTAorRlROX0ZSRUUoIHZvaWQgKiBLTVBfREVSRUYgcHRyICkKK3sKKyAgICAvLyBkb2VzIG5vdGhpbmcgaWYgdGhlIGxpYnJhcnkgaXMgbm90IGluaXRpYWxpemVkCisgICAga21wY19mcmVlKCBLTVBfREVSRUYgcHRyICk7Cit9CisKK3ZvaWQgRlROX1NURENBTEwKK0ZUTl9TRVRfV0FSTklOR1NfT04oIHZvaWQgKQoreworICAgICNpZm5kZWYgS01QX1NUVUIKKyAgICAgICAgX19rbXBfZ2VuZXJhdGVfd2FybmluZ3MgPSBrbXBfd2FybmluZ3NfZXhwbGljaXQ7CisgICAgI2VuZGlmCit9CisKK3ZvaWQgRlROX1NURENBTEwKK0ZUTl9TRVRfV0FSTklOR1NfT0ZGKCB2b2lkICkKK3sKKyAgICAjaWZuZGVmIEtNUF9TVFVCCisgICAgICAgIF9fa21wX2dlbmVyYXRlX3dhcm5pbmdzID0gRkFMU0U7CisgICAgI2VuZGlmCit9CisKK3ZvaWQgRlROX1NURENBTEwKK0ZUTl9TRVRfREVGQVVMVFMoIGNoYXIgY29uc3QgKiBzdHIKKyAgICAjaWZuZGVmIFBBU1NfQVJHU19CWV9WQUxVRQorICAgICAgICAsIGludCBsZW4KKyAgICAjZW5kaWYKKykKK3sKKyAgICAjaWZuZGVmIEtNUF9TVFVCCisgICAgICAgICNpZmRlZiBQQVNTX0FSR1NfQllfVkFMVUUKKyAgICAgICAgICAgIGludCBsZW4gPSAoaW50KXN0cmxlbiggc3RyICk7CisgICAgICAgICNlbmRpZgorICAgICAgICBfX2ttcF9hdXhfc2V0X2RlZmF1bHRzKCBzdHIsIGxlbiApOworICAgICNlbmRpZgorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCisjaWYgT01QXzQwX0VOQUJMRUQKKy8qIHJldHVybnMgdGhlIHN0YXR1cyBvZiBjYW5jZWxsYXRpb24gKi8KK2ludCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fR0VUX0NBTkNFTExBVElPTikodm9pZCkgeworI2lmZGVmIEtNUF9TVFVCCisgICAgcmV0dXJuIDAgLyogZmFsc2UgKi87CisjZWxzZQorICAgIC8vIGluaXRpYWxpemUgdGhlIGxpYnJhcnkgaWYgbmVlZGVkCisgICAgaWYgKCAhIF9fa21wX2luaXRfc2VyaWFsICkgeworICAgICAgICBfX2ttcF9zZXJpYWxfaW5pdGlhbGl6ZSgpOworICAgIH0KKyAgICByZXR1cm4gX19rbXBfb21wX2NhbmNlbGxhdGlvbjsKKyNlbmRpZgorfQorCitpbnQgRlROX1NURENBTEwKK0ZUTl9HRVRfQ0FOQ0VMTEFUSU9OX1NUQVRVUyhpbnQgY2FuY2VsX2tpbmQpIHsKKyNpZmRlZiBLTVBfU1RVQgorICAgIHJldHVybiAwIC8qIGZhbHNlICovOworI2Vsc2UKKyAgICByZXR1cm4gX19rbXBfZ2V0X2NhbmNlbGxhdGlvbl9zdGF0dXMoY2FuY2VsX2tpbmQpOworI2VuZGlmCit9CisKKyNlbmRpZiAvLyBPTVBfNDBfRU5BQkxFRAorCisvLyBHQ0MgY29tcGF0aWJpbGl0eSAodmVyc2lvbmVkIHN5bWJvbHMpCisjaWZkZWYgS01QX1VTRV9WRVJTSU9OX1NZTUJPTFMKKworLyoKKyAgICBUaGVzZSBmb2xsb3dpbmcgc2VjdGlvbnMgY3JlYXRlIGZ1bmN0aW9uIGFsaWFzZXMgKGR1bW15IHN5bWJvbHMpIGZvciB0aGUgb21wXyogcm91dGluZXMuCisgICAgVGhlc2UgYWxpYXNlcyB3aWxsIHRoZW4gYmUgdmVyc2lvbmVkIGFjY29yZGluZyB0byBob3cgbGliZ29tcCBgYHZlcnNpb25zJycgaXRzCisgICAgc3ltYm9scyAoT01QXzEuMCwgT01QXzIuMCwgT01QXzMuMCwgLi4uKSB3aGlsZSBhbHNvIHJldGFpbmluZyB0aGUKKyAgICBkZWZhdWx0IHZlcnNpb24gd2hpY2ggbGliaW9tcDUgdXNlczogVkVSU0lPTiAoZGVmaW5lZCBpbiBleHBvcnRzX3NvLnR4dCkKKyAgICBJZiB5b3Ugd2FudCB0byBzZWUgdGhlIHZlcnNpb25lZCBzeW1ib2xzIGZvciBsaWJnb21wLnNvLjEgdGhlbiBqdXN0IHR5cGU6CisKKyAgICBvYmpkdW1wIC1UIC9wYXRoL3RvL2xpYmdvbXAuc28uMSB8IGdyZXAgb21wXworCisgICAgRXhhbXBsZToKKyAgICBTdGVwIDEpICBDcmVhdGUgX19rbXBfYXBpX29tcF9zZXRfbnVtX3RocmVhZHNfMTBfYWxpYXMKKyAgICAgICAgICAgICB3aGljaCBpcyBhbGlhcyBvZiBfX2ttcF9hcGlfb21wX3NldF9udW1fdGhyZWFkcworICAgIFN0ZXAgMikgIFNldCBfX2ttcF9hcGlfb21wX3NldF9udW1fdGhyZWFkc18xMF9hbGlhcyB0byB2ZXJzaW9uOiBvbXBfc2V0X251bV90aHJlYWRzQE9NUF8xLjAKKyAgICBTdGVwIDJCKSBTZXQgX19rbXBfYXBpX29tcF9zZXRfbnVtX3RocmVhZHMgdG8gZGVmYXVsdCB2ZXJzaW9uIDogb21wX3NldF9udW1fdGhyZWFkc0BAVkVSU0lPTgorKi8KKworLy8gT01QXzEuMCBhbGlhc2VzCit4YWxpYXNpZnkoRlROX1NFVF9OVU1fVEhSRUFEUywgICAxMCk7Cit4YWxpYXNpZnkoRlROX0dFVF9OVU1fVEhSRUFEUywgICAxMCk7Cit4YWxpYXNpZnkoRlROX0dFVF9NQVhfVEhSRUFEUywgICAxMCk7Cit4YWxpYXNpZnkoRlROX0dFVF9USFJFQURfTlVNLCAgICAxMCk7Cit4YWxpYXNpZnkoRlROX0dFVF9OVU1fUFJPQ1MsICAgICAxMCk7Cit4YWxpYXNpZnkoRlROX0lOX1BBUkFMTEVMLCAgICAgICAxMCk7Cit4YWxpYXNpZnkoRlROX1NFVF9EWU5BTUlDLCAgICAgICAxMCk7Cit4YWxpYXNpZnkoRlROX0dFVF9EWU5BTUlDLCAgICAgICAxMCk7Cit4YWxpYXNpZnkoRlROX1NFVF9ORVNURUQsICAgICAgICAxMCk7Cit4YWxpYXNpZnkoRlROX0dFVF9ORVNURUQsICAgICAgICAxMCk7Cit4YWxpYXNpZnkoRlROX0lOSVRfTE9DSywgICAgICAgICAxMCk7Cit4YWxpYXNpZnkoRlROX0lOSVRfTkVTVF9MT0NLLCAgICAxMCk7Cit4YWxpYXNpZnkoRlROX0RFU1RST1lfTE9DSywgICAgICAxMCk7Cit4YWxpYXNpZnkoRlROX0RFU1RST1lfTkVTVF9MT0NLLCAxMCk7Cit4YWxpYXNpZnkoRlROX1NFVF9MT0NLLCAgICAgICAgICAxMCk7Cit4YWxpYXNpZnkoRlROX1NFVF9ORVNUX0xPQ0ssICAgICAxMCk7Cit4YWxpYXNpZnkoRlROX1VOU0VUX0xPQ0ssICAgICAgICAxMCk7Cit4YWxpYXNpZnkoRlROX1VOU0VUX05FU1RfTE9DSywgICAxMCk7Cit4YWxpYXNpZnkoRlROX1RFU1RfTE9DSywgICAgICAgICAxMCk7Cit4YWxpYXNpZnkoRlROX1RFU1RfTkVTVF9MT0NLLCAgICAxMCk7CisKKy8vIE9NUF8yLjAgYWxpYXNlcworeGFsaWFzaWZ5KEZUTl9HRVRfV1RJQ0ssIDIwKTsKK3hhbGlhc2lmeShGVE5fR0VUX1dUSU1FLCAyMCk7CisKKy8vIE9NUF8zLjAgYWxpYXNlcworeGFsaWFzaWZ5KEZUTl9TRVRfU0NIRURVTEUsICAgICAgICAgICAgMzApOworeGFsaWFzaWZ5KEZUTl9HRVRfU0NIRURVTEUsICAgICAgICAgICAgMzApOworeGFsaWFzaWZ5KEZUTl9HRVRfVEhSRUFEX0xJTUlULCAgICAgICAgMzApOworeGFsaWFzaWZ5KEZUTl9TRVRfTUFYX0FDVElWRV9MRVZFTFMsICAgMzApOworeGFsaWFzaWZ5KEZUTl9HRVRfTUFYX0FDVElWRV9MRVZFTFMsICAgMzApOworeGFsaWFzaWZ5KEZUTl9HRVRfTEVWRUwsICAgICAgICAgICAgICAgMzApOworeGFsaWFzaWZ5KEZUTl9HRVRfQU5DRVNUT1JfVEhSRUFEX05VTSwgMzApOworeGFsaWFzaWZ5KEZUTl9HRVRfVEVBTV9TSVpFLCAgICAgICAgICAgMzApOworeGFsaWFzaWZ5KEZUTl9HRVRfQUNUSVZFX0xFVkVMLCAgICAgICAgMzApOworeGFsaWFzaWZ5KEZUTl9JTklUX0xPQ0ssICAgICAgICAgICAgICAgMzApOworeGFsaWFzaWZ5KEZUTl9JTklUX05FU1RfTE9DSywgICAgICAgICAgMzApOworeGFsaWFzaWZ5KEZUTl9ERVNUUk9ZX0xPQ0ssICAgICAgICAgICAgMzApOworeGFsaWFzaWZ5KEZUTl9ERVNUUk9ZX05FU1RfTE9DSywgICAgICAgMzApOworeGFsaWFzaWZ5KEZUTl9TRVRfTE9DSywgICAgICAgICAgICAgICAgMzApOworeGFsaWFzaWZ5KEZUTl9TRVRfTkVTVF9MT0NLLCAgICAgICAgICAgMzApOworeGFsaWFzaWZ5KEZUTl9VTlNFVF9MT0NLLCAgICAgICAgICAgICAgMzApOworeGFsaWFzaWZ5KEZUTl9VTlNFVF9ORVNUX0xPQ0ssICAgICAgICAgMzApOworeGFsaWFzaWZ5KEZUTl9URVNUX0xPQ0ssICAgICAgICAgICAgICAgMzApOworeGFsaWFzaWZ5KEZUTl9URVNUX05FU1RfTE9DSywgICAgICAgICAgMzApOworCisvLyBPTVBfMy4xIGFsaWFzZXMKK3hhbGlhc2lmeShGVE5fSU5fRklOQUwsIDMxKTsKKworI2lmIE9NUF80MF9FTkFCTEVECisvLyBPTVBfNC4wIGFsaWFzZXMKK3hhbGlhc2lmeShGVE5fR0VUX1BST0NfQklORCwgNDApOworeGFsaWFzaWZ5KEZUTl9HRVRfTlVNX1RFQU1TLCA0MCk7Cit4YWxpYXNpZnkoRlROX0dFVF9URUFNX05VTSwgNDApOworeGFsaWFzaWZ5KEZUTl9HRVRfQ0FOQ0VMTEFUSU9OLCA0MCk7CisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKworI2lmIE9NUF80MV9FTkFCTEVECisvLyBPTVBfNC4xIGFsaWFzZXMKKyNlbmRpZgorCisjaWYgT01QXzUwX0VOQUJMRUQKKy8vIE9NUF81LjAgYWxpYXNlcworI2VuZGlmCisKKy8vIE9NUF8xLjAgdmVyc2lvbmVkIHN5bWJvbHMKK3h2ZXJzaW9uaWZ5KEZUTl9TRVRfTlVNX1RIUkVBRFMsICAgMTAsICJPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShGVE5fR0VUX05VTV9USFJFQURTLCAgIDEwLCAiT01QXzEuMCIpOworeHZlcnNpb25pZnkoRlROX0dFVF9NQVhfVEhSRUFEUywgICAxMCwgIk9NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9HRVRfVEhSRUFEX05VTSwgICAgMTAsICJPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShGVE5fR0VUX05VTV9QUk9DUywgICAgIDEwLCAiT01QXzEuMCIpOworeHZlcnNpb25pZnkoRlROX0lOX1BBUkFMTEVMLCAgICAgICAxMCwgIk9NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9TRVRfRFlOQU1JQywgICAgICAgMTAsICJPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShGVE5fR0VUX0RZTkFNSUMsICAgICAgIDEwLCAiT01QXzEuMCIpOworeHZlcnNpb25pZnkoRlROX1NFVF9ORVNURUQsICAgICAgICAxMCwgIk9NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9HRVRfTkVTVEVELCAgICAgICAgMTAsICJPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShGVE5fSU5JVF9MT0NLLCAgICAgICAgIDEwLCAiT01QXzEuMCIpOworeHZlcnNpb25pZnkoRlROX0lOSVRfTkVTVF9MT0NLLCAgICAxMCwgIk9NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9ERVNUUk9ZX0xPQ0ssICAgICAgMTAsICJPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShGVE5fREVTVFJPWV9ORVNUX0xPQ0ssIDEwLCAiT01QXzEuMCIpOworeHZlcnNpb25pZnkoRlROX1NFVF9MT0NLLCAgICAgICAgICAxMCwgIk9NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9TRVRfTkVTVF9MT0NLLCAgICAgMTAsICJPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShGVE5fVU5TRVRfTE9DSywgICAgICAgIDEwLCAiT01QXzEuMCIpOworeHZlcnNpb25pZnkoRlROX1VOU0VUX05FU1RfTE9DSywgICAxMCwgIk9NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9URVNUX0xPQ0ssICAgICAgICAgMTAsICJPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShGVE5fVEVTVF9ORVNUX0xPQ0ssICAgIDEwLCAiT01QXzEuMCIpOworCisvLyBPTVBfMi4wIHZlcnNpb25lZCBzeW1ib2xzCit4dmVyc2lvbmlmeShGVE5fR0VUX1dUSUNLLCAgICAgICAgIDIwLCAiT01QXzIuMCIpOworeHZlcnNpb25pZnkoRlROX0dFVF9XVElNRSwgICAgICAgICAyMCwgIk9NUF8yLjAiKTsKKworLy8gT01QXzMuMCB2ZXJzaW9uZWQgc3ltYm9scworeHZlcnNpb25pZnkoRlROX1NFVF9TQ0hFRFVMRSwgICAgICAzMCwgIk9NUF8zLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9HRVRfU0NIRURVTEUsICAgICAgMzAsICJPTVBfMy4wIik7Cit4dmVyc2lvbmlmeShGVE5fR0VUX1RIUkVBRF9MSU1JVCwgICAgICAgIDMwLCAiT01QXzMuMCIpOworeHZlcnNpb25pZnkoRlROX1NFVF9NQVhfQUNUSVZFX0xFVkVMUywgICAzMCwgIk9NUF8zLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9HRVRfTUFYX0FDVElWRV9MRVZFTFMsICAgMzAsICJPTVBfMy4wIik7Cit4dmVyc2lvbmlmeShGVE5fR0VUX0FOQ0VTVE9SX1RIUkVBRF9OVU0sIDMwLCAiT01QXzMuMCIpOworeHZlcnNpb25pZnkoRlROX0dFVF9MRVZFTCwgICAgICAgICAgICAgICAzMCwgIk9NUF8zLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9HRVRfVEVBTV9TSVpFLCAgICAgMzAsICJPTVBfMy4wIik7Cit4dmVyc2lvbmlmeShGVE5fR0VUX0FDVElWRV9MRVZFTCwgIDMwLCAiT01QXzMuMCIpOworCisvLyB0aGUgbG9jayByb3V0aW5lcyBoYXZlIGEgMS4wIGFuZCAzLjAgdmVyc2lvbgoreHZlcnNpb25pZnkoRlROX0lOSVRfTE9DSywgICAgICAgICAzMCwgIk9NUF8zLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9JTklUX05FU1RfTE9DSywgICAgMzAsICJPTVBfMy4wIik7Cit4dmVyc2lvbmlmeShGVE5fREVTVFJPWV9MT0NLLCAgICAgIDMwLCAiT01QXzMuMCIpOworeHZlcnNpb25pZnkoRlROX0RFU1RST1lfTkVTVF9MT0NLLCAzMCwgIk9NUF8zLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9TRVRfTE9DSywgICAgICAgICAgMzAsICJPTVBfMy4wIik7Cit4dmVyc2lvbmlmeShGVE5fU0VUX05FU1RfTE9DSywgICAgIDMwLCAiT01QXzMuMCIpOworeHZlcnNpb25pZnkoRlROX1VOU0VUX0xPQ0ssICAgICAgICAzMCwgIk9NUF8zLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9VTlNFVF9ORVNUX0xPQ0ssICAgMzAsICJPTVBfMy4wIik7Cit4dmVyc2lvbmlmeShGVE5fVEVTVF9MT0NLLCAgICAgICAgIDMwLCAiT01QXzMuMCIpOworeHZlcnNpb25pZnkoRlROX1RFU1RfTkVTVF9MT0NLLCAgICAzMCwgIk9NUF8zLjAiKTsKKworLy8gT01QXzMuMSB2ZXJzaW9uZWQgc3ltYm9sCit4dmVyc2lvbmlmeShGVE5fSU5fRklOQUwsICAgICAgICAgIDMxLCAiT01QXzMuMSIpOworCisjaWYgT01QXzQwX0VOQUJMRUQKKy8vIE9NUF80LjAgdmVyc2lvbmVkIHN5bWJvbHMKK3h2ZXJzaW9uaWZ5KEZUTl9HRVRfUFJPQ19CSU5ELCAgICAgNDAsICJPTVBfNC4wIik7Cit4dmVyc2lvbmlmeShGVE5fR0VUX05VTV9URUFNUywgICAgIDQwLCAiT01QXzQuMCIpOworeHZlcnNpb25pZnkoRlROX0dFVF9URUFNX05VTSwgICAgICA0MCwgIk9NUF80LjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9HRVRfQ0FOQ0VMTEFUSU9OLCAgNDAsICJPTVBfNC4wIik7CisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKworI2lmIE9NUF80MV9FTkFCTEVECisvLyBPTVBfNC4xIHZlcnNpb25lZCBzeW1ib2xzCisjZW5kaWYKKworI2lmIE9NUF81MF9FTkFCTEVECisvLyBPTVBfNS4wIHZlcnNpb25lZCBzeW1ib2xzCisjZW5kaWYKKworI2VuZGlmIC8vIEtNUF9VU0VfVkVSU0lPTl9TWU1CT0xTCisKKyNpZmRlZiBfX2NwbHVzcGx1cworICAgIH0gLy9leHRlcm4gIkMiCisjZW5kaWYgLy8gX19jcGx1c3BsdXMKKworLy8gZW5kIG9mIGZpbGUgLy8KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9mdG5fZXh0cmEuYyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9mdG5fZXh0cmEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2UwYWE1Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX2Z0bl9leHRyYS5jCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBrbXBfZnRuX2V4dHJhLmMgLS0gRm9ydHJhbiAnZXh0cmEnIGxpbmthZ2Ugc3VwcG9ydCBmb3IgT3Blbk1QLgorICogJFJldmlzaW9uOiA0Mjk1MSAkCisgKiAkRGF0ZTogMjAxNC0wMS0yMSAxNDo0MTo0MSAtMDYwMCAoVHVlLCAyMSBKYW4gMjAxNCkgJAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAia21wLmgiCisKKyNpZiBLTVBfT1NfV0lORE9XUworIyAgIGRlZmluZSBLTVBfRlROX0VOVFJJRVMgS01QX0ZUTl9QTEFJTgorI2VsaWYgS01QX09TX1VOSVgKKyMgICBkZWZpbmUgS01QX0ZUTl9FTlRSSUVTIEtNUF9GVE5fQVBQRU5ECisjZW5kaWYKKworLy8gTm90ZTogVGhpcyBzdHJpbmcgaXMgbm90IHByaW50ZWQgd2hlbiBLTVBfVkVSU0lPTj0xLgorY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX2Z0bmV4dHJhW10gPSBLTVBfVkVSU0lPTl9QUkVGSVggIkZvcnRyYW4gXCJleHRyYVwiIE9NUCBzdXBwb3J0OiAiCisjaWZkZWYgS01QX0ZUTl9FTlRSSUVTCisgICAgInllcyI7CisjICAgZGVmaW5lIEZUTl9TVERDQUxMIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyMgICBpbmNsdWRlICJrbXBfZnRuX29zLmgiCisjICAgaW5jbHVkZSAia21wX2Z0bl9lbnRyeS5oIgorI2Vsc2UKKyAgICAibm8iOworI2VuZGlmIC8qIEtNUF9GVE5fRU5UUklFUyAqLwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX2Z0bl9vcy5oIGIvZmluYWwvcnVudGltZS9zcmMva21wX2Z0bl9vcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiZTZhZTgKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfZnRuX29zLmgKQEAgLTAsMCArMSw1MTQgQEAKKy8qCisgKiBrbXBfZnRuX29zLmggLS0gS1BUUyBGb3J0cmFuIGRlZmluZXMgaGVhZGVyIGZpbGUuCisgKiAkUmV2aXNpb246IDQzMzU0ICQKKyAqICREYXRlOiAyMDE0LTA3LTIyIDE3OjE1OjAyIC0wNTAwIChUdWUsIDIyIEp1bCAyMDE0KSAkCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgS01QX0ZUTl9PU19ICisjZGVmaW5lIEtNUF9GVE5fT1NfSAorCisvLyBLTVBfRk5UX0VOVFJJRVMgbWF5IGJlIG9uZSBvZjogS01QX0ZUTl9QTEFJTiwgS01QX0ZUTl9VUFBFUiwgS01QX0ZUTl9BUFBFTkQsIEtNUF9GVE5fVUFQUEVORC4KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFeHRlcm5hbCBkZWZpbml0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmIEtNUF9GVE5fRU5UUklFUyA9PSBLTVBfRlROX1BMQUlOCisKKyAgICAjZGVmaW5lIEZUTl9TRVRfU1RBQ0tTSVpFICAgICAgICAgICAgICAgICAgICBrbXBfc2V0X3N0YWNrc2l6ZQorICAgICNkZWZpbmUgRlROX1NFVF9TVEFDS1NJWkVfUyAgICAgICAgICAgICAgICAgIGttcF9zZXRfc3RhY2tzaXplX3MKKyAgICAjZGVmaW5lIEZUTl9HRVRfU1RBQ0tTSVpFICAgICAgICAgICAgICAgICAgICBrbXBfZ2V0X3N0YWNrc2l6ZQorICAgICNkZWZpbmUgRlROX0dFVF9TVEFDS1NJWkVfUyAgICAgICAgICAgICAgICAgIGttcF9nZXRfc3RhY2tzaXplX3MKKyAgICAjZGVmaW5lIEZUTl9TRVRfQkxPQ0tUSU1FICAgICAgICAgICAgICAgICAgICBrbXBfc2V0X2Jsb2NrdGltZQorICAgICNkZWZpbmUgRlROX0dFVF9CTE9DS1RJTUUgICAgICAgICAgICAgICAgICAgIGttcF9nZXRfYmxvY2t0aW1lCisgICAgI2RlZmluZSBGVE5fU0VUX0xJQlJBUllfU0VSSUFMICAgICAgICAgICAgICAga21wX3NldF9saWJyYXJ5X3NlcmlhbAorICAgICNkZWZpbmUgRlROX1NFVF9MSUJSQVJZX1RVUk5BUk9VTkQgICAgICAgICAgIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCisgICAgI2RlZmluZSBGVE5fU0VUX0xJQlJBUllfVEhST1VHSFBVVCAgICAgICAgICAga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKyAgICAjZGVmaW5lIEZUTl9TRVRfTElCUkFSWSAgICAgICAgICAgICAgICAgICAgICBrbXBfc2V0X2xpYnJhcnkKKyAgICAjZGVmaW5lIEZUTl9HRVRfTElCUkFSWSAgICAgICAgICAgICAgICAgICAgICBrbXBfZ2V0X2xpYnJhcnkKKyAgICAjZGVmaW5lIEZUTl9TRVRfREVGQVVMVFMgICAgICAgICAgICAgICAgICAgICBrbXBfc2V0X2RlZmF1bHRzCisgICAgI2RlZmluZSBGVE5fU0VUX0FGRklOSVRZICAgICAgICAgICAgICAgICAgICAga21wX3NldF9hZmZpbml0eQorICAgICNkZWZpbmUgRlROX0dFVF9BRkZJTklUWSAgICAgICAgICAgICAgICAgICAgIGttcF9nZXRfYWZmaW5pdHkKKyAgICAjZGVmaW5lIEZUTl9HRVRfQUZGSU5JVFlfTUFYX1BST0MgICAgICAgICAgICBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCisgICAgI2RlZmluZSBGVE5fQ1JFQVRFX0FGRklOSVRZX01BU0sgICAgICAgICAgICAga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrCisgICAgI2RlZmluZSBGVE5fREVTVFJPWV9BRkZJTklUWV9NQVNLICAgICAgICAgICAga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzaworICAgICNkZWZpbmUgRlROX1NFVF9BRkZJTklUWV9NQVNLX1BST0MgICAgICAgICAgIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgI2RlZmluZSBGVE5fVU5TRVRfQUZGSU5JVFlfTUFTS19QUk9DICAgICAgICAga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICNkZWZpbmUgRlROX0dFVF9BRkZJTklUWV9NQVNLX1BST0MgICAgICAgICAgIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCisKKyAgICAjZGVmaW5lIEZUTl9NQUxMT0MgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfbWFsbG9jCisgICAgI2RlZmluZSBGVE5fQ0FMTE9DICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2NhbGxvYworICAgICNkZWZpbmUgRlROX1JFQUxMT0MgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9yZWFsbG9jCisgICAgI2RlZmluZSBGVE5fRlJFRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ZyZWUKKworICAgICNkZWZpbmUgRlROX0dFVF9OVU1fS05PV05fVEhSRUFEUyAgICAgICAgICAgIGttcF9nZXRfbnVtX2tub3duX3RocmVhZHMKKworICAgICNkZWZpbmUgRlROX1NFVF9OVU1fVEhSRUFEUyAgICAgICAgICAgICAgICAgIG9tcF9zZXRfbnVtX3RocmVhZHMKKyAgICAjZGVmaW5lIEZUTl9HRVRfTlVNX1RIUkVBRFMgICAgICAgICAgICAgICAgICBvbXBfZ2V0X251bV90aHJlYWRzCisgICAgI2RlZmluZSBGVE5fR0VUX01BWF9USFJFQURTICAgICAgICAgICAgICAgICAgb21wX2dldF9tYXhfdGhyZWFkcworICAgICNkZWZpbmUgRlROX0dFVF9USFJFQURfTlVNICAgICAgICAgICAgICAgICAgIG9tcF9nZXRfdGhyZWFkX251bQorICAgICNkZWZpbmUgRlROX0dFVF9OVU1fUFJPQ1MgICAgICAgICAgICAgICAgICAgIG9tcF9nZXRfbnVtX3Byb2NzCisgICAgI2RlZmluZSBGVE5fU0VUX0RZTkFNSUMgICAgICAgICAgICAgICAgICAgICAgb21wX3NldF9keW5hbWljCisgICAgI2RlZmluZSBGVE5fR0VUX0RZTkFNSUMgICAgICAgICAgICAgICAgICAgICAgb21wX2dldF9keW5hbWljCisgICAgI2RlZmluZSBGVE5fU0VUX05FU1RFRCAgICAgICAgICAgICAgICAgICAgICAgb21wX3NldF9uZXN0ZWQKKyAgICAjZGVmaW5lIEZUTl9HRVRfTkVTVEVEICAgICAgICAgICAgICAgICAgICAgICBvbXBfZ2V0X25lc3RlZAorICAgICNkZWZpbmUgRlROX0lOX1BBUkFMTEVMICAgICAgICAgICAgICAgICAgICAgIG9tcF9pbl9wYXJhbGxlbAorICAgICNkZWZpbmUgRlROX0dFVF9USFJFQURfTElNSVQgICAgICAgICAgICAgICAgIG9tcF9nZXRfdGhyZWFkX2xpbWl0CisgICAgI2RlZmluZSBGVE5fU0VUX1NDSEVEVUxFICAgICAgICAgICAgICAgICAgICAgb21wX3NldF9zY2hlZHVsZQorICAgICNkZWZpbmUgRlROX0dFVF9TQ0hFRFVMRSAgICAgICAgICAgICAgICAgICAgIG9tcF9nZXRfc2NoZWR1bGUKKyAgICAjZGVmaW5lIEZUTl9TRVRfTUFYX0FDVElWRV9MRVZFTFMgICAgICAgICAgICBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzCisgICAgI2RlZmluZSBGVE5fR0VUX01BWF9BQ1RJVkVfTEVWRUxTICAgICAgICAgICAgb21wX2dldF9tYXhfYWN0aXZlX2xldmVscworICAgICNkZWZpbmUgRlROX0dFVF9BQ1RJVkVfTEVWRUwgICAgICAgICAgICAgICAgIG9tcF9nZXRfYWN0aXZlX2xldmVsCisgICAgI2RlZmluZSBGVE5fR0VUX0xFVkVMICAgICAgICAgICAgICAgICAgICAgICAgb21wX2dldF9sZXZlbAorICAgICNkZWZpbmUgRlROX0dFVF9BTkNFU1RPUl9USFJFQURfTlVNICAgICAgICAgIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorICAgICNkZWZpbmUgRlROX0dFVF9URUFNX1NJWkUgICAgICAgICAgICAgICAgICAgIG9tcF9nZXRfdGVhbV9zaXplCisgICAgI2RlZmluZSBGVE5fSU5fRklOQUwgICAgICAgICAgICAgICAgICAgICAgICAgb21wX2luX2ZpbmFsCisvLyAgI2RlZmluZSBGVE5fU0VUX1BST0NfQklORCAgICAgICAgICAgICAgICAgICAgb21wX3NldF9wcm9jX2JpbmQKKyAgICAjZGVmaW5lIEZUTl9HRVRfUFJPQ19CSU5EICAgICAgICAgICAgICAgICAgICBvbXBfZ2V0X3Byb2NfYmluZAorLy8gICNkZWZpbmUgRlROX0NVUlJfUFJPQ19CSU5EICAgICAgICAgICAgICAgICAgIG9tcF9jdXJyX3Byb2NfYmluZAorI2lmIE9NUF80MF9FTkFCTEVECisgICAgI2RlZmluZSBGVE5fR0VUX05VTV9URUFNUyAgICAgICAgICAgICAgICAgICAgb21wX2dldF9udW1fdGVhbXMKKyAgICAjZGVmaW5lIEZUTl9HRVRfVEVBTV9OVU0gICAgICAgICAgICAgICAgICAgICBvbXBfZ2V0X3RlYW1fbnVtCisjZW5kaWYKKyAgICAjZGVmaW5lIEZUTl9JTklUX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICBvbXBfaW5pdF9sb2NrCisgICAgI2RlZmluZSBGVE5fREVTVFJPWV9MT0NLICAgICAgICAgICAgICAgICAgICAgb21wX2Rlc3Ryb3lfbG9jaworICAgICNkZWZpbmUgRlROX1NFVF9MT0NLICAgICAgICAgICAgICAgICAgICAgICAgIG9tcF9zZXRfbG9jaworICAgICNkZWZpbmUgRlROX1VOU0VUX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgIG9tcF91bnNldF9sb2NrCisgICAgI2RlZmluZSBGVE5fVEVTVF9MT0NLICAgICAgICAgICAgICAgICAgICAgICAgb21wX3Rlc3RfbG9jaworICAgICNkZWZpbmUgRlROX0lOSVRfTkVTVF9MT0NLICAgICAgICAgICAgICAgICAgIG9tcF9pbml0X25lc3RfbG9jaworICAgICNkZWZpbmUgRlROX0RFU1RST1lfTkVTVF9MT0NLICAgICAgICAgICAgICAgIG9tcF9kZXN0cm95X25lc3RfbG9jaworICAgICNkZWZpbmUgRlROX1NFVF9ORVNUX0xPQ0sgICAgICAgICAgICAgICAgICAgIG9tcF9zZXRfbmVzdF9sb2NrCisgICAgI2RlZmluZSBGVE5fVU5TRVRfTkVTVF9MT0NLICAgICAgICAgICAgICAgICAgb21wX3Vuc2V0X25lc3RfbG9jaworICAgICNkZWZpbmUgRlROX1RFU1RfTkVTVF9MT0NLICAgICAgICAgICAgICAgICAgIG9tcF90ZXN0X25lc3RfbG9jaworCisgICAgI2RlZmluZSBGVE5fU0VUX1dBUk5JTkdTX09OICAgICAgICAgICAgICAgICAga21wX3NldF93YXJuaW5nc19vbgorICAgICNkZWZpbmUgRlROX1NFVF9XQVJOSU5HU19PRkYgICAgICAgICAgICAgICAgIGttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKyAgICAjZGVmaW5lIEZUTl9HRVRfV1RJTUUgICAgICAgICAgICAgICAgICAgICAgICBvbXBfZ2V0X3d0aW1lCisgICAgI2RlZmluZSBGVE5fR0VUX1dUSUNLICAgICAgICAgICAgICAgICAgICAgICAgb21wX2dldF93dGljaworCisjaWYgT01QXzQwX0VOQUJMRUQKKyNpZiBLTVBfTUlDIHx8IEtNUF9PU19EQVJXSU4KKyAgICAjZGVmaW5lIEZUTl9HRVRfREVGQVVMVF9ERVZJQ0UgICAgICAgICAgICAgICBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlCisgICAgI2RlZmluZSBGVE5fU0VUX0RFRkFVTFRfREVWSUNFICAgICAgICAgICAgICAgb21wX3NldF9kZWZhdWx0X2RldmljZQorICAgICNkZWZpbmUgRlROX0dFVF9OVU1fREVWSUNFUyAgICAgICAgICAgICAgICAgIG9tcF9nZXRfbnVtX2RldmljZXMKKyNlbmRpZgorI2VuZGlmCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICNkZWZpbmUgRlROX0dFVF9DQU5DRUxMQVRJT04gICAgICAgICAgICAgICAgIG9tcF9nZXRfY2FuY2VsbGF0aW9uCisgICAgI2RlZmluZSBGVE5fR0VUX0NBTkNFTExBVElPTl9TVEFUVVMgICAgICAgICAga21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzCisjZW5kaWYKKworI2VuZGlmIC8qIEtNUF9GVE5fUExBSU4gKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiBLTVBfRlROX0VOVFJJRVMgPT0gS01QX0ZUTl9BUFBFTkQKKworICAgICNkZWZpbmUgRlROX1NFVF9TVEFDS1NJWkUgICAgICAgICAgICAgICAgICAgIGttcF9zZXRfc3RhY2tzaXplXworICAgICNkZWZpbmUgRlROX1NFVF9TVEFDS1NJWkVfUyAgICAgICAgICAgICAgICAgIGttcF9zZXRfc3RhY2tzaXplX3NfCisgICAgI2RlZmluZSBGVE5fR0VUX1NUQUNLU0laRSAgICAgICAgICAgICAgICAgICAga21wX2dldF9zdGFja3NpemVfCisgICAgI2RlZmluZSBGVE5fR0VUX1NUQUNLU0laRV9TICAgICAgICAgICAgICAgICAga21wX2dldF9zdGFja3NpemVfc18KKyAgICAjZGVmaW5lIEZUTl9TRVRfQkxPQ0tUSU1FICAgICAgICAgICAgICAgICAgICBrbXBfc2V0X2Jsb2NrdGltZV8KKyAgICAjZGVmaW5lIEZUTl9HRVRfQkxPQ0tUSU1FICAgICAgICAgICAgICAgICAgICBrbXBfZ2V0X2Jsb2NrdGltZV8KKyAgICAjZGVmaW5lIEZUTl9TRVRfTElCUkFSWV9TRVJJQUwgICAgICAgICAgICAgICBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsXworICAgICNkZWZpbmUgRlROX1NFVF9MSUJSQVJZX1RVUk5BUk9VTkQgICAgICAgICAgIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kXworICAgICNkZWZpbmUgRlROX1NFVF9MSUJSQVJZX1RIUk9VR0hQVVQgICAgICAgICAgIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0XworICAgICNkZWZpbmUgRlROX1NFVF9MSUJSQVJZICAgICAgICAgICAgICAgICAgICAgIGttcF9zZXRfbGlicmFyeV8KKyAgICAjZGVmaW5lIEZUTl9HRVRfTElCUkFSWSAgICAgICAgICAgICAgICAgICAgICBrbXBfZ2V0X2xpYnJhcnlfCisgICAgI2RlZmluZSBGVE5fU0VUX0RFRkFVTFRTICAgICAgICAgICAgICAgICAgICAga21wX3NldF9kZWZhdWx0c18KKyAgICAjZGVmaW5lIEZUTl9TRVRfQUZGSU5JVFkgICAgICAgICAgICAgICAgICAgICBrbXBfc2V0X2FmZmluaXR5XworICAgICNkZWZpbmUgRlROX0dFVF9BRkZJTklUWSAgICAgICAgICAgICAgICAgICAgIGttcF9nZXRfYWZmaW5pdHlfCisgICAgI2RlZmluZSBGVE5fR0VUX0FGRklOSVRZX01BWF9QUk9DICAgICAgICAgICAga21wX2dldF9hZmZpbml0eV9tYXhfcHJvY18KKyAgICAjZGVmaW5lIEZUTl9DUkVBVEVfQUZGSU5JVFlfTUFTSyAgICAgICAgICAgICBrbXBfY3JlYXRlX2FmZmluaXR5X21hc2tfCisgICAgI2RlZmluZSBGVE5fREVTVFJPWV9BRkZJTklUWV9NQVNLICAgICAgICAgICAga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFza18KKyAgICAjZGVmaW5lIEZUTl9TRVRfQUZGSU5JVFlfTUFTS19QUk9DICAgICAgICAgICBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvY18KKyAgICAjZGVmaW5lIEZUTl9VTlNFVF9BRkZJTklUWV9NQVNLX1BST0MgICAgICAgICBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jXworICAgICNkZWZpbmUgRlROX0dFVF9BRkZJTklUWV9NQVNLX1BST0MgICAgICAgICAgIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jXworCisgICAgI2RlZmluZSBGVE5fTUFMTE9DICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX21hbGxvY18KKyAgICAjZGVmaW5lIEZUTl9DQUxMT0MgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfY2FsbG9jXworICAgICNkZWZpbmUgRlROX1JFQUxMT0MgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9yZWFsbG9jXworICAgICNkZWZpbmUgRlROX0ZSRUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9mcmVlXworCisgICAgI2RlZmluZSBGVE5fR0VUX05VTV9LTk9XTl9USFJFQURTICAgICAgICAgICAga21wX2dldF9udW1fa25vd25fdGhyZWFkc18KKworICAgICNkZWZpbmUgRlROX1NFVF9OVU1fVEhSRUFEUyAgICAgICAgICAgICAgICAgIG9tcF9zZXRfbnVtX3RocmVhZHNfCisgICAgI2RlZmluZSBGVE5fR0VUX05VTV9USFJFQURTICAgICAgICAgICAgICAgICAgb21wX2dldF9udW1fdGhyZWFkc18KKyAgICAjZGVmaW5lIEZUTl9HRVRfTUFYX1RIUkVBRFMgICAgICAgICAgICAgICAgICBvbXBfZ2V0X21heF90aHJlYWRzXworICAgICNkZWZpbmUgRlROX0dFVF9USFJFQURfTlVNICAgICAgICAgICAgICAgICAgIG9tcF9nZXRfdGhyZWFkX251bV8KKyAgICAjZGVmaW5lIEZUTl9HRVRfTlVNX1BST0NTICAgICAgICAgICAgICAgICAgICBvbXBfZ2V0X251bV9wcm9jc18KKyAgICAjZGVmaW5lIEZUTl9TRVRfRFlOQU1JQyAgICAgICAgICAgICAgICAgICAgICBvbXBfc2V0X2R5bmFtaWNfCisgICAgI2RlZmluZSBGVE5fR0VUX0RZTkFNSUMgICAgICAgICAgICAgICAgICAgICAgb21wX2dldF9keW5hbWljXworICAgICNkZWZpbmUgRlROX1NFVF9ORVNURUQgICAgICAgICAgICAgICAgICAgICAgIG9tcF9zZXRfbmVzdGVkXworICAgICNkZWZpbmUgRlROX0dFVF9ORVNURUQgICAgICAgICAgICAgICAgICAgICAgIG9tcF9nZXRfbmVzdGVkXworICAgICNkZWZpbmUgRlROX0lOX1BBUkFMTEVMICAgICAgICAgICAgICAgICAgICAgIG9tcF9pbl9wYXJhbGxlbF8KKyAgICAjZGVmaW5lIEZUTl9HRVRfVEhSRUFEX0xJTUlUICAgICAgICAgICAgICAgICBvbXBfZ2V0X3RocmVhZF9saW1pdF8KKyAgICAjZGVmaW5lIEZUTl9TRVRfU0NIRURVTEUgICAgICAgICAgICAgICAgICAgICBvbXBfc2V0X3NjaGVkdWxlXworICAgICNkZWZpbmUgRlROX0dFVF9TQ0hFRFVMRSAgICAgICAgICAgICAgICAgICAgIG9tcF9nZXRfc2NoZWR1bGVfCisgICAgI2RlZmluZSBGVE5fU0VUX01BWF9BQ1RJVkVfTEVWRUxTICAgICAgICAgICAgb21wX3NldF9tYXhfYWN0aXZlX2xldmVsc18KKyAgICAjZGVmaW5lIEZUTl9HRVRfTUFYX0FDVElWRV9MRVZFTFMgICAgICAgICAgICBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzXworICAgICNkZWZpbmUgRlROX0dFVF9BQ1RJVkVfTEVWRUwgICAgICAgICAgICAgICAgIG9tcF9nZXRfYWN0aXZlX2xldmVsXworICAgICNkZWZpbmUgRlROX0dFVF9MRVZFTCAgICAgICAgICAgICAgICAgICAgICAgIG9tcF9nZXRfbGV2ZWxfCisgICAgI2RlZmluZSBGVE5fR0VUX0FOQ0VTVE9SX1RIUkVBRF9OVU0gICAgICAgICAgb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtXworICAgICNkZWZpbmUgRlROX0dFVF9URUFNX1NJWkUgICAgICAgICAgICAgICAgICAgIG9tcF9nZXRfdGVhbV9zaXplXworICAgICNkZWZpbmUgRlROX0lOX0ZJTkFMICAgICAgICAgICAgICAgICAgICAgICAgIG9tcF9pbl9maW5hbF8KKy8vICAjZGVmaW5lIEZUTl9TRVRfUFJPQ19CSU5EICAgICAgICAgICAgICAgICAgICBvbXBfc2V0X3Byb2NfYmluZF8KKyAgICAjZGVmaW5lIEZUTl9HRVRfUFJPQ19CSU5EICAgICAgICAgICAgICAgICAgICBvbXBfZ2V0X3Byb2NfYmluZF8KKy8vICAjZGVmaW5lIEZUTl9DVVJSX1BST0NfQklORCAgICAgICAgICAgICAgICAgICBvbXBfY3Vycl9wcm9jX2JpbmRfCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAjZGVmaW5lIEZUTl9HRVRfTlVNX1RFQU1TICAgICAgICAgICAgICAgICAgICBvbXBfZ2V0X251bV90ZWFtc18KKyAgICAjZGVmaW5lIEZUTl9HRVRfVEVBTV9OVU0gICAgICAgICAgICAgICAgICAgICBvbXBfZ2V0X3RlYW1fbnVtXworI2VuZGlmCisgICAgI2RlZmluZSBGVE5fSU5JVF9MT0NLICAgICAgICAgICAgICAgICAgICAgICAgb21wX2luaXRfbG9ja18KKyAgICAjZGVmaW5lIEZUTl9ERVNUUk9ZX0xPQ0sgICAgICAgICAgICAgICAgICAgICBvbXBfZGVzdHJveV9sb2NrXworICAgICNkZWZpbmUgRlROX1NFVF9MT0NLICAgICAgICAgICAgICAgICAgICAgICAgIG9tcF9zZXRfbG9ja18KKyAgICAjZGVmaW5lIEZUTl9VTlNFVF9MT0NLICAgICAgICAgICAgICAgICAgICAgICBvbXBfdW5zZXRfbG9ja18KKyAgICAjZGVmaW5lIEZUTl9URVNUX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICBvbXBfdGVzdF9sb2NrXworICAgICNkZWZpbmUgRlROX0lOSVRfTkVTVF9MT0NLICAgICAgICAgICAgICAgICAgIG9tcF9pbml0X25lc3RfbG9ja18KKyAgICAjZGVmaW5lIEZUTl9ERVNUUk9ZX05FU1RfTE9DSyAgICAgICAgICAgICAgICBvbXBfZGVzdHJveV9uZXN0X2xvY2tfCisgICAgI2RlZmluZSBGVE5fU0VUX05FU1RfTE9DSyAgICAgICAgICAgICAgICAgICAgb21wX3NldF9uZXN0X2xvY2tfCisgICAgI2RlZmluZSBGVE5fVU5TRVRfTkVTVF9MT0NLICAgICAgICAgICAgICAgICAgb21wX3Vuc2V0X25lc3RfbG9ja18KKyAgICAjZGVmaW5lIEZUTl9URVNUX05FU1RfTE9DSyAgICAgICAgICAgICAgICAgICBvbXBfdGVzdF9uZXN0X2xvY2tfCisKKyAgICAjZGVmaW5lIEZUTl9TRVRfV0FSTklOR1NfT04gICAgICAgICAgICAgICAgICBrbXBfc2V0X3dhcm5pbmdzX29uXworICAgICNkZWZpbmUgRlROX1NFVF9XQVJOSU5HU19PRkYgICAgICAgICAgICAgICAgIGttcF9zZXRfd2FybmluZ3Nfb2ZmXworCisgICAgI2RlZmluZSBGVE5fR0VUX1dUSU1FICAgICAgICAgICAgICAgICAgICAgICAgb21wX2dldF93dGltZV8KKyAgICAjZGVmaW5lIEZUTl9HRVRfV1RJQ0sgICAgICAgICAgICAgICAgICAgICAgICBvbXBfZ2V0X3d0aWNrXworCisjaWYgT01QXzQwX0VOQUJMRUQKKyNpZiBLTVBfTUlDIHx8IEtNUF9PU19EQVJXSU4KKyAgICAjZGVmaW5lIEZUTl9HRVRfREVGQVVMVF9ERVZJQ0UgICAgICAgICAgICAgICBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlXworICAgICNkZWZpbmUgRlROX1NFVF9ERUZBVUxUX0RFVklDRSAgICAgICAgICAgICAgIG9tcF9zZXRfZGVmYXVsdF9kZXZpY2VfCisgICAgI2RlZmluZSBGVE5fR0VUX05VTV9ERVZJQ0VTICAgICAgICAgICAgICAgICAgb21wX2dldF9udW1fZGV2aWNlc18KKyNlbmRpZgorI2VuZGlmCisKKworI2lmIE9NUF80MF9FTkFCTEVECisgICAgI2RlZmluZSBGVE5fR0VUX0NBTkNFTExBVElPTiAgICAgICAgICAgICAgICAgb21wX2dldF9jYW5jZWxsYXRpb25fCisgICAgI2RlZmluZSBGVE5fR0VUX0NBTkNFTExBVElPTl9TVEFUVVMgICAgICAgICAga21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzXworI2VuZGlmCisKKyNlbmRpZiAvKiBLTVBfRlROX0FQUEVORCAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmIEtNUF9GVE5fRU5UUklFUyA9PSBLTVBfRlROX1VQUEVSCisKKyAgICAjZGVmaW5lIEZUTl9TRVRfU1RBQ0tTSVpFICAgICAgICAgICAgICAgICAgICBLTVBfU0VUX1NUQUNLU0laRQorICAgICNkZWZpbmUgRlROX1NFVF9TVEFDS1NJWkVfUyAgICAgICAgICAgICAgICAgIEtNUF9TRVRfU1RBQ0tTSVpFX1MKKyAgICAjZGVmaW5lIEZUTl9HRVRfU1RBQ0tTSVpFICAgICAgICAgICAgICAgICAgICBLTVBfR0VUX1NUQUNLU0laRQorICAgICNkZWZpbmUgRlROX0dFVF9TVEFDS1NJWkVfUyAgICAgICAgICAgICAgICAgIEtNUF9HRVRfU1RBQ0tTSVpFX1MKKyAgICAjZGVmaW5lIEZUTl9TRVRfQkxPQ0tUSU1FICAgICAgICAgICAgICAgICAgICBLTVBfU0VUX0JMT0NLVElNRQorICAgICNkZWZpbmUgRlROX0dFVF9CTE9DS1RJTUUgICAgICAgICAgICAgICAgICAgIEtNUF9HRVRfQkxPQ0tUSU1FCisgICAgI2RlZmluZSBGVE5fU0VUX0xJQlJBUllfU0VSSUFMICAgICAgICAgICAgICAgS01QX1NFVF9MSUJSQVJZX1NFUklBTAorICAgICNkZWZpbmUgRlROX1NFVF9MSUJSQVJZX1RVUk5BUk9VTkQgICAgICAgICAgIEtNUF9TRVRfTElCUkFSWV9UVVJOQVJPVU5ECisgICAgI2RlZmluZSBGVE5fU0VUX0xJQlJBUllfVEhST1VHSFBVVCAgICAgICAgICAgS01QX1NFVF9MSUJSQVJZX1RIUk9VR0hQVVQKKyAgICAjZGVmaW5lIEZUTl9TRVRfTElCUkFSWSAgICAgICAgICAgICAgICAgICAgICBLTVBfU0VUX0xJQlJBUlkKKyAgICAjZGVmaW5lIEZUTl9HRVRfTElCUkFSWSAgICAgICAgICAgICAgICAgICAgICBLTVBfR0VUX0xJQlJBUlkKKyAgICAjZGVmaW5lIEZUTl9TRVRfREVGQVVMVFMgICAgICAgICAgICAgICAgICAgICBLTVBfU0VUX0RFRkFVTFRTCisgICAgI2RlZmluZSBGVE5fU0VUX0FGRklOSVRZICAgICAgICAgICAgICAgICAgICAgS01QX1NFVF9BRkZJTklUWQorICAgICNkZWZpbmUgRlROX0dFVF9BRkZJTklUWSAgICAgICAgICAgICAgICAgICAgIEtNUF9HRVRfQUZGSU5JVFkKKyAgICAjZGVmaW5lIEZUTl9HRVRfQUZGSU5JVFlfTUFYX1BST0MgICAgICAgICAgICBLTVBfR0VUX0FGRklOSVRZX01BWF9QUk9DCisgICAgI2RlZmluZSBGVE5fQ1JFQVRFX0FGRklOSVRZX01BU0sgICAgICAgICAgICAgS01QX0NSRUFURV9BRkZJTklUWV9NQVNLCisgICAgI2RlZmluZSBGVE5fREVTVFJPWV9BRkZJTklUWV9NQVNLICAgICAgICAgICAgS01QX0RFU1RST1lfQUZGSU5JVFlfTUFTSworICAgICNkZWZpbmUgRlROX1NFVF9BRkZJTklUWV9NQVNLX1BST0MgICAgICAgICAgIEtNUF9TRVRfQUZGSU5JVFlfTUFTS19QUk9DCisgICAgI2RlZmluZSBGVE5fVU5TRVRfQUZGSU5JVFlfTUFTS19QUk9DICAgICAgICAgS01QX1VOU0VUX0FGRklOSVRZX01BU0tfUFJPQworICAgICNkZWZpbmUgRlROX0dFVF9BRkZJTklUWV9NQVNLX1BST0MgICAgICAgICAgIEtNUF9HRVRfQUZGSU5JVFlfTUFTS19QUk9DCisKKyAgICAjZGVmaW5lIEZUTl9NQUxMT0MgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfTUFMTE9DCisgICAgI2RlZmluZSBGVE5fQ0FMTE9DICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0NBTExPQworICAgICNkZWZpbmUgRlROX1JFQUxMT0MgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9SRUFMTE9DCisgICAgI2RlZmluZSBGVE5fRlJFRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0ZSRUUKKworICAgICNkZWZpbmUgRlROX0dFVF9OVU1fS05PV05fVEhSRUFEUyAgICAgICAgICAgIEtNUF9HRVRfTlVNX0tOT1dOX1RIUkVBRFMKKworICAgICNkZWZpbmUgRlROX1NFVF9OVU1fVEhSRUFEUyAgICAgICAgICAgICAgICAgIE9NUF9TRVRfTlVNX1RIUkVBRFMKKyAgICAjZGVmaW5lIEZUTl9HRVRfTlVNX1RIUkVBRFMgICAgICAgICAgICAgICAgICBPTVBfR0VUX05VTV9USFJFQURTCisgICAgI2RlZmluZSBGVE5fR0VUX01BWF9USFJFQURTICAgICAgICAgICAgICAgICAgT01QX0dFVF9NQVhfVEhSRUFEUworICAgICNkZWZpbmUgRlROX0dFVF9USFJFQURfTlVNICAgICAgICAgICAgICAgICAgIE9NUF9HRVRfVEhSRUFEX05VTQorICAgICNkZWZpbmUgRlROX0dFVF9OVU1fUFJPQ1MgICAgICAgICAgICAgICAgICAgIE9NUF9HRVRfTlVNX1BST0NTCisgICAgI2RlZmluZSBGVE5fU0VUX0RZTkFNSUMgICAgICAgICAgICAgICAgICAgICAgT01QX1NFVF9EWU5BTUlDCisgICAgI2RlZmluZSBGVE5fR0VUX0RZTkFNSUMgICAgICAgICAgICAgICAgICAgICAgT01QX0dFVF9EWU5BTUlDCisgICAgI2RlZmluZSBGVE5fU0VUX05FU1RFRCAgICAgICAgICAgICAgICAgICAgICAgT01QX1NFVF9ORVNURUQKKyAgICAjZGVmaW5lIEZUTl9HRVRfTkVTVEVEICAgICAgICAgICAgICAgICAgICAgICBPTVBfR0VUX05FU1RFRAorICAgICNkZWZpbmUgRlROX0lOX1BBUkFMTEVMICAgICAgICAgICAgICAgICAgICAgIE9NUF9JTl9QQVJBTExFTAorICAgICNkZWZpbmUgRlROX0dFVF9USFJFQURfTElNSVQgICAgICAgICAgICAgICAgIE9NUF9HRVRfVEhSRUFEX0xJTUlUCisgICAgI2RlZmluZSBGVE5fU0VUX1NDSEVEVUxFICAgICAgICAgICAgICAgICAgICAgT01QX1NFVF9TQ0hFRFVMRQorICAgICNkZWZpbmUgRlROX0dFVF9TQ0hFRFVMRSAgICAgICAgICAgICAgICAgICAgIE9NUF9HRVRfU0NIRURVTEUKKyAgICAjZGVmaW5lIEZUTl9TRVRfTUFYX0FDVElWRV9MRVZFTFMgICAgICAgICAgICBPTVBfU0VUX01BWF9BQ1RJVkVfTEVWRUxTCisgICAgI2RlZmluZSBGVE5fR0VUX01BWF9BQ1RJVkVfTEVWRUxTICAgICAgICAgICAgT01QX0dFVF9NQVhfQUNUSVZFX0xFVkVMUworICAgICNkZWZpbmUgRlROX0dFVF9BQ1RJVkVfTEVWRUwgICAgICAgICAgICAgICAgIE9NUF9HRVRfQUNUSVZFX0xFVkVMCisgICAgI2RlZmluZSBGVE5fR0VUX0xFVkVMICAgICAgICAgICAgICAgICAgICAgICAgT01QX0dFVF9MRVZFTAorICAgICNkZWZpbmUgRlROX0dFVF9BTkNFU1RPUl9USFJFQURfTlVNICAgICAgICAgIE9NUF9HRVRfQU5DRVNUT1JfVEhSRUFEX05VTQorICAgICNkZWZpbmUgRlROX0dFVF9URUFNX1NJWkUgICAgICAgICAgICAgICAgICAgIE9NUF9HRVRfVEVBTV9TSVpFCisgICAgI2RlZmluZSBGVE5fSU5fRklOQUwgICAgICAgICAgICAgICAgICAgICAgICAgT01QX0lOX0ZJTkFMCisvLyAgI2RlZmluZSBGVE5fU0VUX1BST0NfQklORCAgICAgICAgICAgICAgICAgICAgT01QX1NFVF9QUk9DX0JJTkQKKyAgICAjZGVmaW5lIEZUTl9HRVRfUFJPQ19CSU5EICAgICAgICAgICAgICAgICAgICBPTVBfR0VUX1BST0NfQklORAorLy8gICNkZWZpbmUgRlROX0NVUlJfUFJPQ19CSU5EICAgICAgICAgICAgICAgICAgIE9NUF9DVVJSX1BST0NfQklORAorI2lmIE9NUF80MF9FTkFCTEVECisgICAgI2RlZmluZSBGVE5fR0VUX05VTV9URUFNUyAgICAgICAgICAgICAgICAgICAgT01QX0dFVF9OVU1fVEVBTVMKKyAgICAjZGVmaW5lIEZUTl9HRVRfVEVBTV9OVU0gICAgICAgICAgICAgICAgICAgICBPTVBfR0VUX1RFQU1fTlVNCisjZW5kaWYKKyAgICAjZGVmaW5lIEZUTl9JTklUX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICBPTVBfSU5JVF9MT0NLCisgICAgI2RlZmluZSBGVE5fREVTVFJPWV9MT0NLICAgICAgICAgICAgICAgICAgICAgT01QX0RFU1RST1lfTE9DSworICAgICNkZWZpbmUgRlROX1NFVF9MT0NLICAgICAgICAgICAgICAgICAgICAgICAgIE9NUF9TRVRfTE9DSworICAgICNkZWZpbmUgRlROX1VOU0VUX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgIE9NUF9VTlNFVF9MT0NLCisgICAgI2RlZmluZSBGVE5fVEVTVF9MT0NLICAgICAgICAgICAgICAgICAgICAgICAgT01QX1RFU1RfTE9DSworICAgICNkZWZpbmUgRlROX0lOSVRfTkVTVF9MT0NLICAgICAgICAgICAgICAgICAgIE9NUF9JTklUX05FU1RfTE9DSworICAgICNkZWZpbmUgRlROX0RFU1RST1lfTkVTVF9MT0NLICAgICAgICAgICAgICAgIE9NUF9ERVNUUk9ZX05FU1RfTE9DSworICAgICNkZWZpbmUgRlROX1NFVF9ORVNUX0xPQ0sgICAgICAgICAgICAgICAgICAgIE9NUF9TRVRfTkVTVF9MT0NLCisgICAgI2RlZmluZSBGVE5fVU5TRVRfTkVTVF9MT0NLICAgICAgICAgICAgICAgICAgT01QX1VOU0VUX05FU1RfTE9DSworICAgICNkZWZpbmUgRlROX1RFU1RfTkVTVF9MT0NLICAgICAgICAgICAgICAgICAgIE9NUF9URVNUX05FU1RfTE9DSworCisgICAgI2RlZmluZSBGVE5fU0VUX1dBUk5JTkdTX09OICAgICAgICAgICAgICAgICAgS01QX1NFVF9XQVJOSU5HU19PTgorICAgICNkZWZpbmUgRlROX1NFVF9XQVJOSU5HU19PRkYgICAgICAgICAgICAgICAgIEtNUF9TRVRfV0FSTklOR1NfT0ZGCisKKyAgICAjZGVmaW5lIEZUTl9HRVRfV1RJTUUgICAgICAgICAgICAgICAgICAgICAgICBPTVBfR0VUX1dUSU1FCisgICAgI2RlZmluZSBGVE5fR0VUX1dUSUNLICAgICAgICAgICAgICAgICAgICAgICAgT01QX0dFVF9XVElDSworCisjaWYgT01QXzQwX0VOQUJMRUQKKyNpZiBLTVBfTUlDIHx8IEtNUF9PU19EQVJXSU4KKyAgICAjZGVmaW5lIEZUTl9HRVRfREVGQVVMVF9ERVZJQ0UgICAgICAgICAgICAgICBPTVBfR0VUX0RFRkFVTFRfREVWSUNFCisgICAgI2RlZmluZSBGVE5fU0VUX0RFRkFVTFRfREVWSUNFICAgICAgICAgICAgICAgT01QX1NFVF9ERUZBVUxUX0RFVklDRQorICAgICNkZWZpbmUgRlROX0dFVF9OVU1fREVWSUNFUyAgICAgICAgICAgICAgICAgIE9NUF9HRVRfTlVNX0RFVklDRVMKKyNlbmRpZgorI2VuZGlmCisKKworI2lmIE9NUF80MF9FTkFCTEVECisgICAgI2RlZmluZSBGVE5fR0VUX0NBTkNFTExBVElPTiAgICAgICAgICAgICAgICAgT01QX0dFVF9DQU5DRUxMQVRJT04KKyAgICAjZGVmaW5lIEZUTl9HRVRfQ0FOQ0VMTEFUSU9OX1NUQVRVUyAgICAgICAgICBLTVBfR0VUX0NBTkNFTExBVElPTl9TVEFUVVMKKyNlbmRpZgorCisjZW5kaWYgLyogS01QX0ZUTl9VUFBFUiAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmIEtNUF9GVE5fRU5UUklFUyA9PSBLTVBfRlROX1VBUFBFTkQKKworICAgICNkZWZpbmUgRlROX1NFVF9TVEFDS1NJWkUgICAgICAgICAgICAgICAgICAgIEtNUF9TRVRfU1RBQ0tTSVpFXworICAgICNkZWZpbmUgRlROX1NFVF9TVEFDS1NJWkVfUyAgICAgICAgICAgICAgICAgIEtNUF9TRVRfU1RBQ0tTSVpFX1NfCisgICAgI2RlZmluZSBGVE5fR0VUX1NUQUNLU0laRSAgICAgICAgICAgICAgICAgICAgS01QX0dFVF9TVEFDS1NJWkVfCisgICAgI2RlZmluZSBGVE5fR0VUX1NUQUNLU0laRV9TICAgICAgICAgICAgICAgICAgS01QX0dFVF9TVEFDS1NJWkVfU18KKyAgICAjZGVmaW5lIEZUTl9TRVRfQkxPQ0tUSU1FICAgICAgICAgICAgICAgICAgICBLTVBfU0VUX0JMT0NLVElNRV8KKyAgICAjZGVmaW5lIEZUTl9HRVRfQkxPQ0tUSU1FICAgICAgICAgICAgICAgICAgICBLTVBfR0VUX0JMT0NLVElNRV8KKyAgICAjZGVmaW5lIEZUTl9TRVRfTElCUkFSWV9TRVJJQUwgICAgICAgICAgICAgICBLTVBfU0VUX0xJQlJBUllfU0VSSUFMXworICAgICNkZWZpbmUgRlROX1NFVF9MSUJSQVJZX1RVUk5BUk9VTkQgICAgICAgICAgIEtNUF9TRVRfTElCUkFSWV9UVVJOQVJPVU5EXworICAgICNkZWZpbmUgRlROX1NFVF9MSUJSQVJZX1RIUk9VR0hQVVQgICAgICAgICAgIEtNUF9TRVRfTElCUkFSWV9USFJPVUdIUFVUXworICAgICNkZWZpbmUgRlROX1NFVF9MSUJSQVJZICAgICAgICAgICAgICAgICAgICAgIEtNUF9TRVRfTElCUkFSWV8KKyAgICAjZGVmaW5lIEZUTl9HRVRfTElCUkFSWSAgICAgICAgICAgICAgICAgICAgICBLTVBfR0VUX0xJQlJBUllfCisgICAgI2RlZmluZSBGVE5fU0VUX0RFRkFVTFRTICAgICAgICAgICAgICAgICAgICAgS01QX1NFVF9ERUZBVUxUU18KKyAgICAjZGVmaW5lIEZUTl9TRVRfQUZGSU5JVFkgICAgICAgICAgICAgICAgICAgICBLTVBfU0VUX0FGRklOSVRZXworICAgICNkZWZpbmUgRlROX0dFVF9BRkZJTklUWSAgICAgICAgICAgICAgICAgICAgIEtNUF9HRVRfQUZGSU5JVFlfCisgICAgI2RlZmluZSBGVE5fR0VUX0FGRklOSVRZX01BWF9QUk9DICAgICAgICAgICAgS01QX0dFVF9BRkZJTklUWV9NQVhfUFJPQ18KKyAgICAjZGVmaW5lIEZUTl9DUkVBVEVfQUZGSU5JVFlfTUFTSyAgICAgICAgICAgICBLTVBfQ1JFQVRFX0FGRklOSVRZX01BU0tfCisgICAgI2RlZmluZSBGVE5fREVTVFJPWV9BRkZJTklUWV9NQVNLICAgICAgICAgICAgS01QX0RFU1RST1lfQUZGSU5JVFlfTUFTS18KKyAgICAjZGVmaW5lIEZUTl9TRVRfQUZGSU5JVFlfTUFTS19QUk9DICAgICAgICAgICBLTVBfU0VUX0FGRklOSVRZX01BU0tfUFJPQ18KKyAgICAjZGVmaW5lIEZUTl9VTlNFVF9BRkZJTklUWV9NQVNLX1BST0MgICAgICAgICBLTVBfVU5TRVRfQUZGSU5JVFlfTUFTS19QUk9DXworICAgICNkZWZpbmUgRlROX0dFVF9BRkZJTklUWV9NQVNLX1BST0MgICAgICAgICAgIEtNUF9HRVRfQUZGSU5JVFlfTUFTS19QUk9DXworCisgICAgI2RlZmluZSBGVE5fTUFMTE9DICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX01BTExPQ18KKyAgICAjZGVmaW5lIEZUTl9DQUxMT0MgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfQ0FMTE9DXworICAgICNkZWZpbmUgRlROX1JFQUxMT0MgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9SRUFMTE9DXworICAgICNkZWZpbmUgRlROX0ZSRUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9GUkVFXworCisgICAgI2RlZmluZSBGVE5fR0VUX05VTV9LTk9XTl9USFJFQURTICAgICAgICAgICAgS01QX0dFVF9OVU1fS05PV05fVEhSRUFEU18KKworICAgICNkZWZpbmUgRlROX1NFVF9OVU1fVEhSRUFEUyAgICAgICAgICAgICAgICAgIE9NUF9TRVRfTlVNX1RIUkVBRFNfCisgICAgI2RlZmluZSBGVE5fR0VUX05VTV9USFJFQURTICAgICAgICAgICAgICAgICAgT01QX0dFVF9OVU1fVEhSRUFEU18KKyAgICAjZGVmaW5lIEZUTl9HRVRfTUFYX1RIUkVBRFMgICAgICAgICAgICAgICAgICBPTVBfR0VUX01BWF9USFJFQURTXworICAgICNkZWZpbmUgRlROX0dFVF9USFJFQURfTlVNICAgICAgICAgICAgICAgICAgIE9NUF9HRVRfVEhSRUFEX05VTV8KKyAgICAjZGVmaW5lIEZUTl9HRVRfTlVNX1BST0NTICAgICAgICAgICAgICAgICAgICBPTVBfR0VUX05VTV9QUk9DU18KKyAgICAjZGVmaW5lIEZUTl9TRVRfRFlOQU1JQyAgICAgICAgICAgICAgICAgICAgICBPTVBfU0VUX0RZTkFNSUNfCisgICAgI2RlZmluZSBGVE5fR0VUX0RZTkFNSUMgICAgICAgICAgICAgICAgICAgICAgT01QX0dFVF9EWU5BTUlDXworICAgICNkZWZpbmUgRlROX1NFVF9ORVNURUQgICAgICAgICAgICAgICAgICAgICAgIE9NUF9TRVRfTkVTVEVEXworICAgICNkZWZpbmUgRlROX0dFVF9ORVNURUQgICAgICAgICAgICAgICAgICAgICAgIE9NUF9HRVRfTkVTVEVEXworICAgICNkZWZpbmUgRlROX0lOX1BBUkFMTEVMICAgICAgICAgICAgICAgICAgICAgIE9NUF9JTl9QQVJBTExFTF8KKyAgICAjZGVmaW5lIEZUTl9HRVRfVEhSRUFEX0xJTUlUICAgICAgICAgICAgICAgICBPTVBfR0VUX1RIUkVBRF9MSU1JVF8KKyAgICAjZGVmaW5lIEZUTl9TRVRfU0NIRURVTEUgICAgICAgICAgICAgICAgICAgICBPTVBfU0VUX1NDSEVEVUxFXworICAgICNkZWZpbmUgRlROX0dFVF9TQ0hFRFVMRSAgICAgICAgICAgICAgICAgICAgIE9NUF9HRVRfU0NIRURVTEVfCisgICAgI2RlZmluZSBGVE5fU0VUX01BWF9BQ1RJVkVfTEVWRUxTICAgICAgICAgICAgT01QX1NFVF9NQVhfQUNUSVZFX0xFVkVMU18KKyAgICAjZGVmaW5lIEZUTl9HRVRfTUFYX0FDVElWRV9MRVZFTFMgICAgICAgICAgICBPTVBfR0VUX01BWF9BQ1RJVkVfTEVWRUxTXworICAgICNkZWZpbmUgRlROX0dFVF9BQ1RJVkVfTEVWRUwgICAgICAgICAgICAgICAgIE9NUF9HRVRfQUNUSVZFX0xFVkVMXworICAgICNkZWZpbmUgRlROX0dFVF9MRVZFTCAgICAgICAgICAgICAgICAgICAgICAgIE9NUF9HRVRfTEVWRUxfCisgICAgI2RlZmluZSBGVE5fR0VUX0FOQ0VTVE9SX1RIUkVBRF9OVU0gICAgICAgICAgT01QX0dFVF9BTkNFU1RPUl9USFJFQURfTlVNXworICAgICNkZWZpbmUgRlROX0dFVF9URUFNX1NJWkUgICAgICAgICAgICAgICAgICAgIE9NUF9HRVRfVEVBTV9TSVpFXworICAgICNkZWZpbmUgRlROX0lOX0ZJTkFMICAgICAgICAgICAgICAgICAgICAgICAgIE9NUF9JTl9GSU5BTF8KKy8vICAjZGVmaW5lIEZUTl9TRVRfUFJPQ19CSU5EICAgICAgICAgICAgICAgICAgICBPTVBfU0VUX1BST0NfQklORF8KKyAgICAjZGVmaW5lIEZUTl9HRVRfUFJPQ19CSU5EICAgICAgICAgICAgICAgICAgICBPTVBfR0VUX1BST0NfQklORF8KKy8vICAjZGVmaW5lIEZUTl9DVVJSX1BST0NfQklORCAgICAgICAgICAgICAgICAgICBPTVBfQ1VSUl9QUk9DX0JJTkRfCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAjZGVmaW5lIEZUTl9HRVRfTlVNX1RFQU1TICAgICAgICAgICAgICAgICAgICBPTVBfR0VUX05VTV9URUFNU18KKyAgICAjZGVmaW5lIEZUTl9HRVRfVEVBTV9OVU0gICAgICAgICAgICAgICAgICAgICBPTVBfR0VUX1RFQU1fTlVNXworI2VuZGlmCisgICAgI2RlZmluZSBGVE5fSU5JVF9MT0NLICAgICAgICAgICAgICAgICAgICAgICAgT01QX0lOSVRfTE9DS18KKyAgICAjZGVmaW5lIEZUTl9ERVNUUk9ZX0xPQ0sgICAgICAgICAgICAgICAgICAgICBPTVBfREVTVFJPWV9MT0NLXworICAgICNkZWZpbmUgRlROX1NFVF9MT0NLICAgICAgICAgICAgICAgICAgICAgICAgIE9NUF9TRVRfTE9DS18KKyAgICAjZGVmaW5lIEZUTl9VTlNFVF9MT0NLICAgICAgICAgICAgICAgICAgICAgICBPTVBfVU5TRVRfTE9DS18KKyAgICAjZGVmaW5lIEZUTl9URVNUX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICBPTVBfVEVTVF9MT0NLXworICAgICNkZWZpbmUgRlROX0lOSVRfTkVTVF9MT0NLICAgICAgICAgICAgICAgICAgIE9NUF9JTklUX05FU1RfTE9DS18KKyAgICAjZGVmaW5lIEZUTl9ERVNUUk9ZX05FU1RfTE9DSyAgICAgICAgICAgICAgICBPTVBfREVTVFJPWV9ORVNUX0xPQ0tfCisgICAgI2RlZmluZSBGVE5fU0VUX05FU1RfTE9DSyAgICAgICAgICAgICAgICAgICAgT01QX1NFVF9ORVNUX0xPQ0tfCisgICAgI2RlZmluZSBGVE5fVU5TRVRfTkVTVF9MT0NLICAgICAgICAgICAgICAgICAgT01QX1VOU0VUX05FU1RfTE9DS18KKyAgICAjZGVmaW5lIEZUTl9URVNUX05FU1RfTE9DSyAgICAgICAgICAgICAgICAgICBPTVBfVEVTVF9ORVNUX0xPQ0tfCisKKyAgICAjZGVmaW5lIEZUTl9TRVRfV0FSTklOR1NfT04gICAgICAgICAgICAgICAgICBLTVBfU0VUX1dBUk5JTkdTX09OXworICAgICNkZWZpbmUgRlROX1NFVF9XQVJOSU5HU19PRkYgICAgICAgICAgICAgICAgIEtNUF9TRVRfV0FSTklOR1NfT0ZGXworCisgICAgI2RlZmluZSBGVE5fR0VUX1dUSU1FICAgICAgICAgICAgICAgICAgICAgICAgT01QX0dFVF9XVElNRV8KKyAgICAjZGVmaW5lIEZUTl9HRVRfV1RJQ0sgICAgICAgICAgICAgICAgICAgICAgICBPTVBfR0VUX1dUSUNLXworCisjaWYgT01QXzQwX0VOQUJMRUQKKyNpZiBLTVBfTUlDIHx8IEtNUF9PU19EQVJXSU4KKyAgICAjZGVmaW5lIEZUTl9HRVRfREVGQVVMVF9ERVZJQ0UgICAgICAgICAgICAgICBPTVBfR0VUX0RFRkFVTFRfREVWSUNFXworICAgICNkZWZpbmUgRlROX1NFVF9ERUZBVUxUX0RFVklDRSAgICAgICAgICAgICAgIE9NUF9TRVRfREVGQVVMVF9ERVZJQ0VfCisgICAgI2RlZmluZSBGVE5fR0VUX05VTV9ERVZJQ0VTICAgICAgICAgICAgICAgICAgT01QX0dFVF9OVU1fREVWSUNFU18KKyNlbmRpZgorI2VuZGlmCisKKworI2lmIE9NUF80MF9FTkFCTEVECisgICAgI2RlZmluZSBGVE5fR0VUX0NBTkNFTExBVElPTiAgICAgICAgICAgICAgICAgT01QX0dFVF9DQU5DRUxMQVRJT05fCisgICAgI2RlZmluZSBGVE5fR0VUX0NBTkNFTExBVElPTl9TVEFUVVMgICAgICAgICAgS01QX0dFVF9DQU5DRUxMQVRJT05fU1RBVFVTXworI2VuZGlmCisKKyNlbmRpZiAvKiBLTVBfRlROX1VBUFBFTkQgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHT01QIEFQSSBOQU1FUyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8vIEFsbCBHT01QXzEuMCBzeW1ib2xzCisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0FUT01JQ19FTkQgICAgICAgICAgICAgICAgICAgR09NUF9hdG9taWNfZW5kCisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0FUT01JQ19TVEFSVCAgICAgICAgICAgICAgICAgR09NUF9hdG9taWNfc3RhcnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfQkFSUklFUiAgICAgICAgICAgICAgICAgICAgICBHT01QX2JhcnJpZXIKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfQ1JJVElDQUxfRU5EICAgICAgICAgICAgICAgICBHT01QX2NyaXRpY2FsX2VuZAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9DUklUSUNBTF9OQU1FX0VORCAgICAgICAgICAgIEdPTVBfY3JpdGljYWxfbmFtZV9lbmQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfQ1JJVElDQUxfTkFNRV9TVEFSVCAgICAgICAgICBHT01QX2NyaXRpY2FsX25hbWVfc3RhcnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfQ1JJVElDQUxfU1RBUlQgICAgICAgICAgICAgICBHT01QX2NyaXRpY2FsX3N0YXJ0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfRFlOQU1JQ19ORVhUICAgICAgICAgICAgR09NUF9sb29wX2R5bmFtaWNfbmV4dAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX0RZTkFNSUNfU1RBUlQgICAgICAgICAgIEdPTVBfbG9vcF9keW5hbWljX3N0YXJ0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfRU5EICAgICAgICAgICAgICAgICAgICAgR09NUF9sb29wX2VuZAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX0VORF9OT1dBSVQgICAgICAgICAgICAgIEdPTVBfbG9vcF9lbmRfbm93YWl0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfR1VJREVEX05FWFQgICAgICAgICAgICAgR09NUF9sb29wX2d1aWRlZF9uZXh0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfR1VJREVEX1NUQVJUICAgICAgICAgICAgR09NUF9sb29wX2d1aWRlZF9zdGFydAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfRFlOQU1JQ19ORVhUICAgIEdPTVBfbG9vcF9vcmRlcmVkX2R5bmFtaWNfbmV4dAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfRFlOQU1JQ19TVEFSVCAgIEdPTVBfbG9vcF9vcmRlcmVkX2R5bmFtaWNfc3RhcnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX0dVSURFRF9ORVhUICAgICBHT01QX2xvb3Bfb3JkZXJlZF9ndWlkZWRfbmV4dAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfR1VJREVEX1NUQVJUICAgIEdPTVBfbG9vcF9vcmRlcmVkX2d1aWRlZF9zdGFydAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfUlVOVElNRV9ORVhUICAgIEdPTVBfbG9vcF9vcmRlcmVkX3J1bnRpbWVfbmV4dAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfUlVOVElNRV9TVEFSVCAgIEdPTVBfbG9vcF9vcmRlcmVkX3J1bnRpbWVfc3RhcnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX1NUQVRJQ19ORVhUICAgICBHT01QX2xvb3Bfb3JkZXJlZF9zdGF0aWNfbmV4dAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfU1RBVElDX1NUQVJUICAgIEdPTVBfbG9vcF9vcmRlcmVkX3N0YXRpY19zdGFydAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX1JVTlRJTUVfTkVYVCAgICAgICAgICAgIEdPTVBfbG9vcF9ydW50aW1lX25leHQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9SVU5USU1FX1NUQVJUICAgICAgICAgICBHT01QX2xvb3BfcnVudGltZV9zdGFydAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX1NUQVRJQ19ORVhUICAgICAgICAgICAgIEdPTVBfbG9vcF9zdGF0aWNfbmV4dAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX1NUQVRJQ19TVEFSVCAgICAgICAgICAgIEdPTVBfbG9vcF9zdGF0aWNfc3RhcnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfT1JERVJFRF9FTkQgICAgICAgICAgICAgICAgICBHT01QX29yZGVyZWRfZW5kCisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX09SREVSRURfU1RBUlQgICAgICAgICAgICAgICAgR09NUF9vcmRlcmVkX3N0YXJ0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0VORCAgICAgICAgICAgICAgICAgR09NUF9wYXJhbGxlbF9lbmQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfTE9PUF9EWU5BTUlDX1NUQVJUICBHT01QX3BhcmFsbGVsX2xvb3BfZHluYW1pY19zdGFydAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX0dVSURFRF9TVEFSVCAgIEdPTVBfcGFyYWxsZWxfbG9vcF9ndWlkZWRfc3RhcnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfTE9PUF9SVU5USU1FX1NUQVJUICBHT01QX3BhcmFsbGVsX2xvb3BfcnVudGltZV9zdGFydAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX1NUQVRJQ19TVEFSVCAgIEdPTVBfcGFyYWxsZWxfbG9vcF9zdGF0aWNfc3RhcnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfU0VDVElPTlNfU1RBUlQgICAgICBHT01QX3BhcmFsbGVsX3NlY3Rpb25zX3N0YXJ0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX1NUQVJUICAgICAgICAgICAgICAgR09NUF9wYXJhbGxlbF9zdGFydAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9TRUNUSU9OU19FTkQgICAgICAgICAgICAgICAgIEdPTVBfc2VjdGlvbnNfZW5kCisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1NFQ1RJT05TX0VORF9OT1dBSVQgICAgICAgICAgR09NUF9zZWN0aW9uc19lbmRfbm93YWl0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1NFQ1RJT05TX05FWFQgICAgICAgICAgICAgICAgR09NUF9zZWN0aW9uc19uZXh0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1NFQ1RJT05TX1NUQVJUICAgICAgICAgICAgICAgR09NUF9zZWN0aW9uc19zdGFydAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9TSU5HTEVfQ09QWV9FTkQgICAgICAgICAgICAgIEdPTVBfc2luZ2xlX2NvcHlfZW5kCisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1NJTkdMRV9DT1BZX1NUQVJUICAgICAgICAgICAgR09NUF9zaW5nbGVfY29weV9zdGFydAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9TSU5HTEVfU1RBUlQgICAgICAgICAgICAgICAgIEdPTVBfc2luZ2xlX3N0YXJ0CisKKy8vIEFsbCBHT01QXzIuMCBzeW1ib2xzCisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1RBU0sgICAgICAgICAgICAgICAgICAgICAgICAgICBHT01QX3Rhc2sKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfVEFTS1dBSVQgICAgICAgICAgICAgICAgICAgICAgIEdPTVBfdGFza3dhaXQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfRFlOQU1JQ19ORVhUICAgICAgICAgIEdPTVBfbG9vcF91bGxfZHluYW1pY19uZXh0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX0RZTkFNSUNfU1RBUlQgICAgICAgICBHT01QX2xvb3BfdWxsX2R5bmFtaWNfc3RhcnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfR1VJREVEX05FWFQgICAgICAgICAgIEdPTVBfbG9vcF91bGxfZ3VpZGVkX25leHQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfR1VJREVEX1NUQVJUICAgICAgICAgIEdPTVBfbG9vcF91bGxfZ3VpZGVkX3N0YXJ0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfRFlOQU1JQ19ORVhUICBHT01QX2xvb3BfdWxsX29yZGVyZWRfZHluYW1pY19uZXh0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfRFlOQU1JQ19TVEFSVCBHT01QX2xvb3BfdWxsX29yZGVyZWRfZHluYW1pY19zdGFydAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX0dVSURFRF9ORVhUICAgR09NUF9sb29wX3VsbF9vcmRlcmVkX2d1aWRlZF9uZXh0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfR1VJREVEX1NUQVJUICBHT01QX2xvb3BfdWxsX29yZGVyZWRfZ3VpZGVkX3N0YXJ0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfUlVOVElNRV9ORVhUICBHT01QX2xvb3BfdWxsX29yZGVyZWRfcnVudGltZV9uZXh0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfUlVOVElNRV9TVEFSVCBHT01QX2xvb3BfdWxsX29yZGVyZWRfcnVudGltZV9zdGFydAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX1NUQVRJQ19ORVhUICAgR09NUF9sb29wX3VsbF9vcmRlcmVkX3N0YXRpY19uZXh0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfU1RBVElDX1NUQVJUICBHT01QX2xvb3BfdWxsX29yZGVyZWRfc3RhdGljX3N0YXJ0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX1JVTlRJTUVfTkVYVCAgICAgICAgICBHT01QX2xvb3BfdWxsX3J1bnRpbWVfbmV4dAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9SVU5USU1FX1NUQVJUICAgICAgICAgR09NUF9sb29wX3VsbF9ydW50aW1lX3N0YXJ0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX1NUQVRJQ19ORVhUICAgICAgICAgICBHT01QX2xvb3BfdWxsX3N0YXRpY19uZXh0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX1NUQVRJQ19TVEFSVCAgICAgICAgICBHT01QX2xvb3BfdWxsX3N0YXRpY19zdGFydAorCisvLyBBbGwgR09NUF8zLjAgc3ltYm9scworI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9UQVNLWUlFTEQgICAgICAgICAgICAgICAgICAgICAgR09NUF90YXNreWllbGQKKworLy8gQWxsIEdPTVBfNC4wIHN5bWJvbHMgCisvLyBUT0RPOiBBcyBvZiAyMDEzLTEwLTE0LCBub25lIG9mIHRoZSBHT01QXzQuMCBmdW5jdGlvbnMgYXJlIGltcGxlbWVudGVkIGluIGxpYmlvbXA1CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0JBUlJJRVJfQ0FOQ0VMICAgICAgICAgICAgICAgICBHT01QX2JhcnJpZXJfY2FuY2VsCisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0NBTkNFTCAgICAgICAgICAgICAgICAgICAgICAgICBHT01QX2NhbmNlbAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9DQU5DRUxMQVRJT05fUE9JTlQgICAgICAgICAgICAgR09NUF9jYW5jZWxsYXRpb25fcG9pbnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9FTkRfQ0FOQ0VMICAgICAgICAgICAgICAgIEdPTVBfbG9vcF9lbmRfY2FuY2VsCisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0xPT1BfRFlOQU1JQyAgICAgICAgICBHT01QX3BhcmFsbGVsX2xvb3BfZHluYW1pYworI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX0dVSURFRCAgICAgICAgICAgR09NUF9wYXJhbGxlbF9sb29wX2d1aWRlZAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX1JVTlRJTUUgICAgICAgICAgR09NUF9wYXJhbGxlbF9sb29wX3J1bnRpbWUKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfTE9PUF9TVEFUSUMgICAgICAgICAgIEdPTVBfcGFyYWxsZWxfbG9vcF9zdGF0aWMKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfU0VDVElPTlMgICAgICAgICAgICAgIEdPTVBfcGFyYWxsZWxfc2VjdGlvbnMKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUwgICAgICAgICAgICAgICAgICAgICAgIEdPTVBfcGFyYWxsZWwKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfU0VDVElPTlNfRU5EX0NBTkNFTCAgICAgICAgICAgIEdPTVBfc2VjdGlvbnNfZW5kX2NhbmNlbAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9UQVNLR1JPVVBfU1RBUlQgICAgICAgICAgICAgICAgR09NUF90YXNrZ3JvdXBfc3RhcnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfVEFTS0dST1VQX0VORCAgICAgICAgICAgICAgICAgIEdPTVBfdGFza2dyb3VwX2VuZAorLyogVGFyZ2V0IGZ1bmN0aW9ucyBzaG91bGQgYmUgdGFrZW4gY2FyZSBvZiBieSBsaWJvZmZsb2FkICovCisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1RBUkdFVCAgICAgICAgICAgICAgICAgICAgICAgICBHT01QX3RhcmdldAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9UQVJHRVRfREFUQSAgICAgICAgICAgICAgICAgICAgR09NUF90YXJnZXRfZGF0YQorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9UQVJHRVRfRU5EX0RBVEEgICAgICAgICAgICAgICAgR09NUF90YXJnZXRfZW5kX2RhdGEKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfVEFSR0VUX1VQREFURSAgICAgICAgICAgICAgICAgIEdPTVBfdGFyZ2V0X3VwZGF0ZQorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9URUFNUyAgICAgICAgICAgICAgICAgICAgICAgICAgR09NUF90ZWFtcworCisjaWZkZWYgS01QX1VTRV9WRVJTSU9OX1NZTUJPTFMKKyAgICAjZGVmaW5lIHhzdHIoeCkgc3RyKHgpCisgICAgI2RlZmluZSBzdHIoeCkgI3gKKworICAgIC8vIElmIExpbnV4LCB4ZXhwYW5kIHByZXBlbmRzIF9fa21wX2FwaV8gdG8gdGhlIHJlYWwgQVBJIG5hbWUKKyAgICAjZGVmaW5lIHhleHBhbmQoYXBpX25hbWUpIGV4cGFuZChhcGlfbmFtZSkKKyAgICAjZGVmaW5lIGV4cGFuZChhcGlfbmFtZSkgX19rbXBfYXBpXyMjYXBpX25hbWUKKworICAgICNkZWZpbmUgeGFsaWFzaWZ5KGFwaV9uYW1lLHZlcikgYWxpYXNpZnkoYXBpX25hbWUsdmVyKQorICAgICNkZWZpbmUgYWxpYXNpZnkoYXBpX25hbWUsdmVyKSBfX3R5cGVvZl9fKF9fa21wX2FwaV8jI2FwaV9uYW1lKSBfX2ttcF9hcGlfIyNhcGlfbmFtZSMjXyMjdmVyIyNfYWxpYXMgX19hdHRyaWJ1dGVfXygoYWxpYXMoeHN0cihfX2ttcF9hcGlfIyNhcGlfbmFtZSkpKSkKKworICAgICNkZWZpbmUgeHZlcnNpb25pZnkoYXBpX25hbWUsIHZlcnNpb25fbnVtLCB2ZXJzaW9uX3N0cikgdmVyc2lvbmlmeShhcGlfbmFtZSwgdmVyc2lvbl9udW0sIHZlcnNpb25fc3RyLCAiVkVSU0lPTiIpCisgICAgI2RlZmluZSB2ZXJzaW9uaWZ5KGFwaV9uYW1lLCB2ZXJzaW9uX251bSwgdmVyc2lvbl9zdHIsIGRlZmF1bHRfdmVyKSBcCisgICAgX19hc21fXygiLnN5bXZlciAiIHhzdHIoX19rbXBfYXBpXyMjYXBpX25hbWUjI18jI3ZlcnNpb25fbnVtIyNfYWxpYXMpICIsIiB4c3RyKGFwaV9uYW1lKSAiQCIgdmVyc2lvbl9zdHIgIlxuXHQiKTsgXAorICAgIF9fYXNtX18oIi5zeW12ZXIgIiB4c3RyKF9fa21wX2FwaV8jI2FwaV9uYW1lKSAiLCIgeHN0cihhcGlfbmFtZSkgIkBAIiBkZWZhdWx0X3ZlciAiXG5cdCIpCisKKyNlbHNlIC8vIEtNUF9VU0VfVkVSU0lPTl9TWU1CT0xTCisgICAgI2RlZmluZSB4c3RyKHgpIC8qIE5vdGhpbmcgKi8KKyAgICAjZGVmaW5lIHN0cih4KSAgLyogTm90aGluZyAqLworCisgICAgLy8gaWYgV2luZG93cyBvciBNYWMsIHhleHBhbmQgZG9lcyBubyBuYW1lIHRyYW5zZm9ybWF0aW9uCisgICAgI2RlZmluZSB4ZXhwYW5kKGFwaV9uYW1lKSBleHBhbmQoYXBpX25hbWUpCisgICAgI2RlZmluZSBleHBhbmQoYXBpX25hbWUpIGFwaV9uYW1lCisKKyAgICAjZGVmaW5lIHhhbGlhc2lmeShhcGlfbmFtZSx2ZXIpIC8qIE5vdGhpbmcgKi8KKyAgICAjZGVmaW5lIGFsaWFzaWZ5KGFwaV9uYW1lLHZlcikgIC8qIE5vdGhpbmcgKi8KKworICAgICNkZWZpbmUgeHZlcnNpb25pZnkoYXBpX25hbWUsIHZlcnNpb25fbnVtLCB2ZXJzaW9uX3N0cikgLyogTm90aGluZyAqLworICAgICNkZWZpbmUgdmVyc2lvbmlmeShhcGlfbmFtZSwgdmVyc2lvbl9udW0sIHZlcnNpb25fc3RyLCBkZWZhdWx0X3ZlcikgLyogTm90aGluZyAqLworCisjZW5kaWYgLy8gS01QX1VTRV9WRVJTSU9OX1NZTUJPTFMKKworI2VuZGlmIC8qIEtNUF9GVE5fT1NfSCAqLworCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfZnRuX3N0ZGNhbGwuYyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9mdG5fc3RkY2FsbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3YzA3NDgKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfZnRuX3N0ZGNhbGwuYwpAQCAtMCwwICsxLDM3IEBACisvKgorICoga21wX2Z0bl9zdGRjYWxsLmMgLS0gRm9ydHJhbiBfX3N0ZGNhbGwgbGlua2FnZSBzdXBwb3J0IGZvciBPcGVuTVAuCisgKiAkUmV2aXNpb246IDQyOTUxICQKKyAqICREYXRlOiAyMDE0LTAxLTIxIDE0OjQxOjQxIC0wNjAwIChUdWUsIDIxIEphbiAyMDE0KSAkCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJrbXAuaCIKKworLy8gTm90ZTogVGhpcyBzdHJpbmcgaXMgbm90IHByaW50ZWQgd2hlbiBLTVBfVkVSU0lPTj0xLgorY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX2Z0bnN0ZGNhbGxbXSA9IEtNUF9WRVJTSU9OX1BSRUZJWCAiRm9ydHJhbiBfX3N0ZGNhbGwgT01QIHN1cHBvcnQ6ICIKKyNpZmRlZiBVU0VfRlROX1NURENBTEwKKyAgICAieWVzIjsKKyNlbHNlCisgICAgIm5vIjsKKyNlbmRpZgorCisjaWZkZWYgVVNFX0ZUTl9TVERDQUxMCisKKyNkZWZpbmUgRlROX1NURENBTEwgCUtNUF9TVERDQUxMCisjZGVmaW5lIEtNUF9GVE5fRU5UUklFUwlVU0VfRlROX1NURENBTEwKKworI2luY2x1ZGUgImttcF9mdG5fb3MuaCIKKyNpbmNsdWRlICJrbXBfZnRuX2VudHJ5LmgiCisKKyNlbmRpZiAvKiBVU0VfRlROX1NURENBTEwgKi8KKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX2dsb2JhbC5jIGIvZmluYWwvcnVudGltZS9zcmMva21wX2dsb2JhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmMTg4ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfZ2xvYmFsLmMKQEAgLTAsMCArMSw0NzIgQEAKKy8qCisgKiBrbXBfZ2xvYmFsLmMgLS0gS1BUUyBnbG9iYWwgdmFyaWFibGVzIGZvciBydW50aW1lIHN1cHBvcnQgbGlicmFyeQorICogJFJldmlzaW9uOiA0MzQ3MyAkCisgKiAkRGF0ZTogMjAxNC0wOS0yNiAxNTowMjo1NyAtMDUwMCAoRnJpLCAyNiBTZXAgMjAxNCkgJAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAia21wLmgiCisKKyNpZmRlZiBLTVBfU0VUVkVSU0lPTgorY2hhciBfX2ttcF9zZXR2ZXJzaW9uX3N0cmluZ1tdID0gVkVSU0lPTl9TVFJJTkc7CisjZW5kaWYKKwora21wX2tleV90IF9fa21wX2d0aWRfdGhyZWFkcHJpdmF0ZV9rZXk7CisKK2ttcF9jcHVpbmZvX3QgICBfX2ttcF9jcHVpbmZvID0geyAwIH07IC8vIE5vdCBpbml0aWFsaXplZAorCisjaWYgS01QX1NUQVRTX0VOQUJMRUQKKyNpbmNsdWRlICJrbXBfc3RhdHMuaCIKKy8vIGxvY2sgZm9yIG1vZGlmeWluZyB0aGUgZ2xvYmFsIF9fa21wX3N0YXRzX2xpc3QKK2ttcF90YXNfbG9ja190IF9fa21wX3N0YXRzX2xvY2sgPSBLTVBfVEFTX0xPQ0tfSU5JVElBTElaRVIoX19rbXBfc3RhdHNfbG9jayk7CisKKy8vIGdsb2JhbCBsaXN0IG9mIHBlciB0aHJlYWQgc3RhdHMsIHRoZSBoZWFkIGlzIGEgc2VudGluZWwgbm9kZSB3aGljaCBhY2N1bXVsYXRlcyBhbGwgc3RhdHMgcHJvZHVjZWQgYmVmb3JlIF9fa21wX2NyZWF0ZV93b3JrZXIgaXMgY2FsbGVkLgora21wX3N0YXRzX2xpc3QgX19rbXBfc3RhdHNfbGlzdDsKKworLy8gdGhyZWFkIGxvY2FsIHBvaW50ZXIgdG8gc3RhdHMgbm9kZSB3aXRoaW4gbGlzdAorX190aHJlYWQga21wX3N0YXRzX2xpc3QqIF9fa21wX3N0YXRzX3RocmVhZF9wdHIgPSAmX19rbXBfc3RhdHNfbGlzdDsKKworLy8gZ2l2ZXMgcmVmZXJlbmNlIHRpY2sgZm9yIGFsbCBldmVudHMgKGNvbnNpZGVyZWQgdGhlIDAgdGljaykKK3RzY190aWNrX2NvdW50IF9fa21wX3N0YXRzX3N0YXJ0X3RpbWU7CisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIElOSVRJQUxJWkFUSU9OIFZBUklBQkxFUyAqLworLyogdGhleSBhcmUgc3luY3Jvbml6ZWQgdG8gd3JpdGUgZHVyaW5nIGluaXQsIGJ1dCByZWFkIGFueXRpbWUgKi8KK3ZvbGF0aWxlIGludCAgICAgICAgX19rbXBfaW5pdF9zZXJpYWwgICAgID0gRkFMU0U7Cit2b2xhdGlsZSBpbnQgICAgICAgIF9fa21wX2luaXRfZ3RpZCAgICAgICA9IEZBTFNFOwordm9sYXRpbGUgaW50ICAgICAgICBfX2ttcF9pbml0X2NvbW1vbiAgICAgPSBGQUxTRTsKK3ZvbGF0aWxlIGludCAgICAgICAgX19rbXBfaW5pdF9taWRkbGUgICAgID0gRkFMU0U7Cit2b2xhdGlsZSBpbnQgICAgICAgIF9fa21wX2luaXRfcGFyYWxsZWwgICA9IEZBTFNFOwordm9sYXRpbGUgaW50ICAgICAgICBfX2ttcF9pbml0X21vbml0b3IgICAgPSAwOyAgLyogMSAtIGxhdW5jaGVkLCAyIC0gYWN0dWFsbHkgc3RhcnRlZCAoV2luZG93cyogT1Mgb25seSkgKi8KK3ZvbGF0aWxlIGludCAgICAgICAgX19rbXBfaW5pdF91c2VyX2xvY2tzID0gRkFMU0U7CisKKy8qIGxpc3Qgb2YgYWRkcmVzcyBvZiBhbGxvY2F0ZWQgY2FjaGVzIGZvciBjb21tb25zICovCitrbXBfY2FjaGVkX2FkZHJfdCAgKl9fa21wX3RocmVhZHByaXZfY2FjaGVfbGlzdCA9IE5VTEw7CisKK2ludCAgICAgICAgICAgICAgICAgX19rbXBfaW5pdF9jb3VudGVyICA9IDA7CitpbnQgICAgICAgICAgICAgICAgIF9fa21wX3Jvb3RfY291bnRlciAgPSAwOworaW50ICAgICAgICAgICAgICAgICBfX2ttcF92ZXJzaW9uICAgICAgID0gMDsKKwordm9sYXRpbGUga21wX3VpbnQzMiBfX2ttcF90ZWFtX2NvdW50ZXIgID0gMDsKK3ZvbGF0aWxlIGttcF91aW50MzIgX19rbXBfdGFza19jb3VudGVyICA9IDA7CisKK3Vuc2lnbmVkIGludCBfX2ttcF9pbml0X3dhaXQgPSBLTVBfREVGQVVMVF9JTklUX1dBSVQ7ICAgLyogaW5pdGlhbCBudW1iZXIgb2Ygc3Bpbi10ZXN0cyAgICovCit1bnNpZ25lZCBpbnQgX19rbXBfbmV4dF93YWl0ID0gS01QX0RFRkFVTFRfTkVYVF9XQUlUOyAgIC8qIHN1c2VxdWVudCBudW1iZXIgb2Ygc3Bpbi10ZXN0cyAqLworCitzaXplX3QgICAgICBfX2ttcF9zdGtzaXplICAgICAgICAgPSBLTVBfREVGQVVMVF9TVEtTSVpFOworc2l6ZV90ICAgICAgX19rbXBfbW9uaXRvcl9zdGtzaXplID0gMDsgIC8vIGF1dG8gYWRqdXN0CitzaXplX3QgICAgICBfX2ttcF9zdGtvZmZzZXQgICAgICAgPSBLTVBfREVGQVVMVF9TVEtPRkZTRVQ7CitpbnQgICAgICAgICBfX2ttcF9zdGtwYWRkaW5nICAgICAgPSBLTVBfTUlOX1NUS1BBRERJTkc7CisKK3NpemVfdCAgICBfX2ttcF9tYWxsb2NfcG9vbF9pbmNyICA9IEtNUF9ERUZBVUxUX01BTExPQ19QT09MX0lOQ1I7CisKKy8qIEJhcnJpZXIgbWV0aG9kIGRlZmF1bHRzLCBzZXR0aW5ncywgYW5kIHN0cmluZ3MgKi8KKy8qIGJyYW5jaCBmYWN0b3IgPSAyXmJyYW5jaF9iaXRzIChvbmx5IHJlbGV2YW50IGZvciB0cmVlIGFuZCBoeXBlciBiYXJyaWVyIHR5cGVzKSAqLworI2lmIEtNUF9BUkNIX1g4Nl82NAora21wX3VpbnQzMiBfX2ttcF9iYXJyaWVyX2dhdGhlcl9iYl9kZmx0ICAgICAgPSAyOyAgLyogYnJhbmNoX2ZhY3RvciA9IDQgKi8gLyogaHlwZXIyOiBDNzg5ODAgKi8KK2ttcF91aW50MzIgX19rbXBfYmFycmllcl9yZWxlYXNlX2JiX2RmbHQgICAgID0gMjsgIC8qIGJyYW5jaF9mYWN0b3IgPSA0ICovIC8qIGh5cGVyMjogQzc4OTgwICovCisjZWxzZQora21wX3VpbnQzMiBfX2ttcF9iYXJyaWVyX2dhdGhlcl9iYl9kZmx0ICAgICAgPSAyOyAgLyogYnJhbmNoX2ZhY3RvciA9IDQgKi8gLyogY29tbXVuaWNhdGlvbiBpbiBjb3JlIGZvciBNSUMgKi8KK2ttcF91aW50MzIgX19rbXBfYmFycmllcl9yZWxlYXNlX2JiX2RmbHQgICAgID0gMjsgIC8qIGJyYW5jaF9mYWN0b3IgPSA0ICovIC8qIGNvbW11bmljYXRpb24gaW4gY29yZSBmb3IgTUlDICovCisjZW5kaWYgLy8gS01QX0FSQ0hfWDg2XzY0CisjaWYgS01QX0FSQ0hfWDg2XzY0CitrbXBfYmFyX3BhdF9lIF9fa21wX2JhcnJpZXJfZ2F0aGVyX3BhdF9kZmx0ICA9IGJwX2h5cGVyX2JhcjsgIC8qIGh5cGVyMjogQzc4OTgwICovCitrbXBfYmFyX3BhdF9lIF9fa21wX2JhcnJpZXJfcmVsZWFzZV9wYXRfZGZsdCA9IGJwX2h5cGVyX2JhcjsgIC8qIGh5cGVyMjogQzc4OTgwICovCisjZWxzZQora21wX2Jhcl9wYXRfZSBfX2ttcF9iYXJyaWVyX2dhdGhlcl9wYXRfZGZsdCAgPSBicF9saW5lYXJfYmFyOwora21wX2Jhcl9wYXRfZSBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfcGF0X2RmbHQgPSBicF9saW5lYXJfYmFyOworI2VuZGlmCitrbXBfdWludDMyIF9fa21wX2JhcnJpZXJfZ2F0aGVyX2JyYW5jaF9iaXRzICBbIGJzX2xhc3RfYmFycmllciBdID0geyAwIH07CitrbXBfdWludDMyIF9fa21wX2JhcnJpZXJfcmVsZWFzZV9icmFuY2hfYml0cyBbIGJzX2xhc3RfYmFycmllciBdID0geyAwIH07CitrbXBfYmFyX3BhdF9lIF9fa21wX2JhcnJpZXJfZ2F0aGVyX3BhdHRlcm4gICBbIGJzX2xhc3RfYmFycmllciBdID0geyBicF9saW5lYXJfYmFyIH07CitrbXBfYmFyX3BhdF9lIF9fa21wX2JhcnJpZXJfcmVsZWFzZV9wYXR0ZXJuICBbIGJzX2xhc3RfYmFycmllciBdID0geyBicF9saW5lYXJfYmFyIH07CitjaGFyIGNvbnN0ICpfX2ttcF9iYXJyaWVyX2JyYW5jaF9iaXRfZW52X25hbWUgWyBic19sYXN0X2JhcnJpZXIgXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAiS01QX1BMQUlOX0JBUlJJRVIiLCAiS01QX0ZPUktKT0lOX0JBUlJJRVIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNpZiBLTVBfRkFTVF9SRURVQ1RJT05fQkFSUklFUgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAiS01QX1JFRFVDVElPTl9CQVJSSUVSIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZW5kaWYgLy8gS01QX0ZBU1RfUkVEVUNUSU9OX0JBUlJJRVIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworY2hhciBjb25zdCAqX19rbXBfYmFycmllcl9wYXR0ZXJuX2Vudl9uYW1lICAgIFsgYnNfbGFzdF9iYXJyaWVyIF0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgIktNUF9QTEFJTl9CQVJSSUVSX1BBVFRFUk4iLCAiS01QX0ZPUktKT0lOX0JBUlJJRVJfUEFUVEVSTiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2lmIEtNUF9GQVNUX1JFRFVDVElPTl9CQVJSSUVSCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICJLTVBfUkVEVUNUSU9OX0JBUlJJRVJfUEFUVEVSTiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2VuZGlmIC8vIEtNUF9GQVNUX1JFRFVDVElPTl9CQVJSSUVSCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKK2NoYXIgY29uc3QgKl9fa21wX2JhcnJpZXJfdHlwZV9uYW1lICAgICAgICAgICBbIGJzX2xhc3RfYmFycmllciBdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ICJwbGFpbiIsICJmb3Jram9pbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2lmIEtNUF9GQVNUX1JFRFVDVElPTl9CQVJSSUVSCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICJyZWR1Y3Rpb24iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNlbmRpZiAvLyBLTVBfRkFTVF9SRURVQ1RJT05fQkFSUklFUgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CitjaGFyIGNvbnN0ICpfX2ttcF9iYXJyaWVyX3BhdHRlcm5fbmFtZSBbIGJwX2xhc3RfYmFyIF0gPSB7ICJsaW5lYXIiLCAidHJlZSIsICJoeXBlciIsICJoaWVyYXJjaGljYWwiIH07CisKKworaW50ICAgICAgIF9fa21wX2FsbFRocmVhZHNTcGVjaWZpZWQgPSAwOworc2l6ZV90ICAgIF9fa21wX2FsaWduX2FsbG9jID0gQ0FDSEVfTElORTsKKworCitpbnQgICAgIF9fa21wX2dlbmVyYXRlX3dhcm5pbmdzID0ga21wX3dhcm5pbmdzX2xvdzsKK2ludCAgICAgICAgICBfX2ttcF9yZXNlcnZlX3dhcm4gPSAwOworaW50ICAgICAgICAgICAgICAgICBfX2ttcF94cHJvYyA9IDA7CitpbnQgICAgICAgICAgICBfX2ttcF9hdmFpbF9wcm9jID0gMDsKK3NpemVfdCAgICBfX2ttcF9zeXNfbWluX3N0a3NpemUgPSBLTVBfTUlOX1NUS1NJWkU7CitpbnQgICAgICAgICAgIF9fa21wX3N5c19tYXhfbnRoID0gS01QX01BWF9OVEg7CitpbnQgICAgICAgICAgICAgICBfX2ttcF9tYXhfbnRoID0gMDsKK2ludCAgICAgIF9fa21wX3RocmVhZHNfY2FwYWNpdHkgPSAwOworaW50ICAgICAgICAgX19rbXBfZGZsdF90ZWFtX250aCA9IDA7CitpbnQgICAgICBfX2ttcF9kZmx0X3RlYW1fbnRoX3ViID0gMDsKK2ludCAgICAgICAgICAgX19rbXBfdHBfY2FwYWNpdHkgPSAwOworaW50ICAgICAgICAgICAgIF9fa21wX3RwX2NhY2hlZCA9IDA7CitpbnQgICAgICAgICAgIF9fa21wX2RmbHRfbmVzdGVkID0gRkFMU0U7CitpbnQgX19rbXBfZGZsdF9tYXhfYWN0aXZlX2xldmVscyA9IEtNUF9NQVhfQUNUSVZFX0xFVkVMU19MSU1JVDsgLyogbWF4X2FjdGl2ZV9sZXZlbHMgbGltaXQgKi8KKyNpZiBLTVBfTkVTVEVEX0hPVF9URUFNUworaW50IF9fa21wX2hvdF90ZWFtc19tb2RlICAgICAgICAgPSAwOyAvKiAwIC0gZnJlZSBleHRyYSB0aHJlYWRzIHdoZW4gcmVkdWNlZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxIC0ga2VlcCBleHRyYSB0aHJlYWRzIHdoZW4gcmVkdWNlZCAqLworaW50IF9fa21wX2hvdF90ZWFtc19tYXhfbGV2ZWwgICAgPSAxOyAvKiBuZXN0aW5nIGxldmVsIG9mIGhvdCB0ZWFtcyAqLworI2VuZGlmCitlbnVtIGxpYnJhcnlfdHlwZSBfX2ttcF9saWJyYXJ5ID0gbGlicmFyeV9ub25lOworZW51bSBzY2hlZF90eXBlICAgICBfX2ttcF9zY2hlZCA9IGttcF9zY2hfZGVmYXVsdDsgIC8qIHNjaGVkdWxpbmcgbWV0aG9kIGZvciBydW50aW1lIHNjaGVkdWxpbmcgKi8KK2VudW0gc2NoZWRfdHlwZSAgICBfX2ttcF9zdGF0aWMgPSBrbXBfc2NoX3N0YXRpY19ncmVlZHk7IC8qIGRlZmF1bHQgc3RhdGljIHNjaGVkdWxpbmcgbWV0aG9kICovCitlbnVtIHNjaGVkX3R5cGUgICAgX19rbXBfZ3VpZGVkID0ga21wX3NjaF9ndWlkZWRfaXRlcmF0aXZlX2NodW5rZWQ7IC8qIGRlZmF1bHQgZ3VpZGVkIHNjaGVkdWxpbmcgbWV0aG9kICovCitlbnVtIHNjaGVkX3R5cGUgICAgICBfX2ttcF9hdXRvID0ga21wX3NjaF9ndWlkZWRfYW5hbHl0aWNhbF9jaHVua2VkOyAvKiBkZWZhdWx0IGF1dG8gc2NoZWR1bGluZyBtZXRob2QgKi8KK2ludCAgICAgICAgX19rbXBfZGZsdF9ibG9ja3RpbWUgPSBLTVBfREVGQVVMVF9CTE9DS1RJTUU7CitpbnQgICAgICAgX19rbXBfbW9uaXRvcl93YWtldXBzID0gS01QX01JTl9NT05JVE9SX1dBS0VVUFM7CitpbnQgICAgICAgICAgX19rbXBfYnRfaW50ZXJ2YWxzID0gS01QX0lOVEVSVkFMU19GUk9NX0JMT0NLVElNRSggS01QX0RFRkFVTFRfQkxPQ0tUSU1FLCBLTVBfTUlOX01PTklUT1JfV0FLRVVQUyApOworI2lmZGVmIEtNUF9BREpVU1RfQkxPQ0tUSU1FCitpbnQgICAgICAgICAgICAgICBfX2ttcF96ZXJvX2J0ID0gRkFMU0U7CisjZW5kaWYgLyogS01QX0FESlVTVF9CTE9DS1RJTUUgKi8KK2ludCAgICAgICAgICAgIF9fa21wX2h0X2NhcGFibGUgPSBGQUxTRTsKK2ludCAgICAgICAgICAgIF9fa21wX2h0X2VuYWJsZWQgPSBGQUxTRTsKK2ludCAgICAgICAgX19rbXBfaHRfbG9nX3Blcl9waHkgPSAxOworaW50ICAgICAgICAgICAgICAgIF9fa21wX25jb3JlcyA9IDA7CitpbnQgICAgICAgICAgICAgICAgIF9fa21wX2NodW5rID0gMDsKK2ludCAgICAgICAgICAgX19rbXBfYWJvcnRfZGVsYXkgPSAwOworI2lmIEtNUF9PU19MSU5VWCAmJiBkZWZpbmVkKEtNUF9UREFUQV9HVElEKQoraW50ICAgICAgICAgICAgIF9fa21wX2d0aWRfbW9kZSA9IDM7IC8qIHVzZSBfX2RlY2xzcGVjKHRocmVhZCkgVExTIHRvIHN0b3JlIGd0aWQgKi8KK2ludCAgICAgIF9fa21wX2FkanVzdF9ndGlkX21vZGUgPSBGQUxTRTsKKyNlbGlmIEtNUF9PU19XSU5ET1dTCitpbnQgICAgICAgICAgICAgX19rbXBfZ3RpZF9tb2RlID0gMjsgLyogdXNlIFRMUyBmdW5jdGlvbnMgdG8gc3RvcmUgZ3RpZCAqLworaW50ICAgICAgX19rbXBfYWRqdXN0X2d0aWRfbW9kZSA9IEZBTFNFOworI2Vsc2UKK2ludCAgICAgICAgICAgICBfX2ttcF9ndGlkX21vZGUgPSAwOyAvKiBzZWxlY3QgbWV0aG9kIHRvIGdldCBndGlkIGJhc2VkIG9uICN0aHJlYWRzICovCitpbnQgICAgICBfX2ttcF9hZGp1c3RfZ3RpZF9tb2RlID0gVFJVRTsKKyNlbmRpZiAvKiBLTVBfT1NfTElOVVggJiYgZGVmaW5lZChLTVBfVERBVEFfR1RJRCkgKi8KKyNpZmRlZiBLTVBfVERBVEFfR1RJRAorI2lmIEtNUF9PU19XSU5ET1dTCitfX2RlY2xzcGVjKHRocmVhZCkgaW50IF9fa21wX2d0aWQgPSBLTVBfR1RJRF9ETkU7CisjZWxzZQorX190aHJlYWQgaW50IF9fa21wX2d0aWQgPSBLTVBfR1RJRF9ETkU7CisjZW5kaWYgLyogS01QX09TX1dJTkRPV1MgLSB3b3JrYXJvdW5kIGJlY2F1c2UgSW50ZWwoUikgTWFueSBJbnRlZ3JhdGVkIENvcmUgY29tcGlsZXIgMjAxMTAzMTYgZG9lc24ndCBhY2NlcHQgX19kZWNsc3BlYyAqLworI2VuZGlmIC8qIEtNUF9UREFUQV9HVElEICovCitpbnQgICAgICAgICAgX19rbXBfdGxzX2d0aWRfbWluID0gSU5UX01BWDsKK2ludCAgICAgICAgICAgIF9fa21wX2ZvcmVpZ25fdHAgPSBUUlVFOworI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKK2ludCAgICBfX2ttcF9pbmhlcml0X2ZwX2NvbnRyb2wgPSBUUlVFOwora21wX2ludDE2ICBfX2ttcF9pbml0X3g4N19mcHVfY29udHJvbF93b3JkID0gMDsKK2ttcF91aW50MzIgICAgIF9fa21wX2luaXRfbXhjc3IgPSAwOworI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKworI2lmZGVmIFVTRV9MT0FEX0JBTEFOQ0UKK2RvdWJsZSAgX19rbXBfbG9hZF9iYWxhbmNlX2ludGVydmFsICAgPSAxLjA7CisjZW5kaWYgLyogVVNFX0xPQURfQkFMQU5DRSAqLworCitrbXBfbmVzdGVkX250aHJlYWRzX3QgX19rbXBfbmVzdGVkX250aCAgPSB7IE5VTEwsIDAsIDAgfTsKKworI2lmIEtNUF9VU0VfQURBUFRJVkVfTE9DS1MKKwora21wX2FkYXB0aXZlX2JhY2tvZmZfcGFyYW1zX3QgX19rbXBfYWRhcHRpdmVfYmFja29mZl9wYXJhbXMgPSB7IDEsIDEwMjQgfTsgLy8gVE9ETzogdHVuZSBpdCEKKworI2lmIEtNUF9ERUJVR19BREFQVElWRV9MT0NLUworY2hhciAqIF9fa21wX3NwZWN1bGF0aXZlX3N0YXRzZmlsZSA9ICItIjsKKyNlbmRpZgorCisjZW5kaWYgLy8gS01QX1VTRV9BREFQVElWRV9MT0NLUworCisjaWYgT01QXzQwX0VOQUJMRUQKK2ludCBfX2ttcF9kaXNwbGF5X2VudiAgICAgICAgICAgPSBGQUxTRTsKK2ludCBfX2ttcF9kaXNwbGF5X2Vudl92ZXJib3NlICAgPSBGQUxTRTsKK2ludCBfX2ttcF9vbXBfY2FuY2VsbGF0aW9uICAgICAgPSBGQUxTRTsKKyNlbmRpZgorCisvKiBtYXAgT01QIDMuMCBzY2hlZHVsZSB0eXBlcyB3aXRoIG91ciBpbnRlcm5hbCBzY2hlZHVsZSB0eXBlcyAqLworZW51bSBzY2hlZF90eXBlIF9fa21wX3NjaF9tYXBbIGttcF9zY2hlZF91cHBlciAtIGttcF9zY2hlZF9sb3dlcl9leHQgKyBrbXBfc2NoZWRfdXBwZXJfc3RkIC0ga21wX3NjaGVkX2xvd2VyIC0gMiBdID0geworICAgIGttcF9zY2hfc3RhdGljX2NodW5rZWQsICAgICAvLyA9PT4ga21wX3NjaGVkX3N0YXRpYyAgICAgICAgICAgID0gMQorICAgIGttcF9zY2hfZHluYW1pY19jaHVua2VkLCAgICAvLyA9PT4ga21wX3NjaGVkX2R5bmFtaWMgICAgICAgICAgID0gMgorICAgIGttcF9zY2hfZ3VpZGVkX2NodW5rZWQsICAgICAvLyA9PT4ga21wX3NjaGVkX2d1aWRlZCAgICAgICAgICAgID0gMworICAgIGttcF9zY2hfYXV0bywgICAgICAgICAgICAgICAvLyA9PT4ga21wX3NjaGVkX2F1dG8gICAgICAgICAgICAgID0gNAorICAgIGttcF9zY2hfdHJhcGV6b2lkYWwgICAgICAgICAvLyA9PT4ga21wX3NjaGVkX3RyYXBlem9pZGFsICAgICAgID0gMTAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpbGwgbGlrZWx5IG5vdCB1c2VkLCBpbnRyb2R1Y2VkIGhlcmUganVzdCB0byBkZWJ1ZyB0aGUgY29kZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZiBwdWJsaWMgaW50ZWwgZXh0ZW5zaW9uIHNjaGVkdWxlcworfTsKKworI2lmIEtNUF9PU19MSU5VWAorZW51bSBjbG9ja19mdW5jdGlvbl90eXBlIF9fa21wX2Nsb2NrX2Z1bmN0aW9uOworaW50IF9fa21wX2Nsb2NrX2Z1bmN0aW9uX3BhcmFtOworI2VuZGlmIC8qIEtNUF9PU19MSU5VWCAqLworCisjaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorCisjIGlmIEtNUF9PU19XSU5ET1dTICYmIEtNUF9BUkNIX1g4Nl82NAorCitpbnQgX19rbXBfbnVtX3Byb2NfZ3JvdXBzID0gMTsKKwora21wX0dldEFjdGl2ZVByb2Nlc3NvckNvdW50X3QgX19rbXBfR2V0QWN0aXZlUHJvY2Vzc29yQ291bnQgPSBOVUxMOwora21wX0dldEFjdGl2ZVByb2Nlc3Nvckdyb3VwQ291bnRfdCBfX2ttcF9HZXRBY3RpdmVQcm9jZXNzb3JHcm91cENvdW50ID0gTlVMTDsKK2ttcF9HZXRUaHJlYWRHcm91cEFmZmluaXR5X3QgX19rbXBfR2V0VGhyZWFkR3JvdXBBZmZpbml0eSA9IE5VTEw7CitrbXBfU2V0VGhyZWFkR3JvdXBBZmZpbml0eV90IF9fa21wX1NldFRocmVhZEdyb3VwQWZmaW5pdHkgPSBOVUxMOworCisjIGVuZGlmIC8qIEtNUF9PU19XSU5ET1dTICYmIEtNUF9BUkNIX1g4Nl82NCAqLworCitzaXplX3QgICBfX2ttcF9hZmZpbl9tYXNrX3NpemUgPSAwOworZW51bSBhZmZpbml0eV90eXBlIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9kZWZhdWx0OworZW51bSBhZmZpbml0eV9ncmFuIF9fa21wX2FmZmluaXR5X2dyYW4gPSBhZmZpbml0eV9ncmFuX2RlZmF1bHQ7CitpbnQgX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMgID0gLTE7CitpbnQgX19rbXBfYWZmaW5pdHlfZHVwcyA9IFRSVUU7CitlbnVtIGFmZmluaXR5X3RvcF9tZXRob2QgX19rbXBfYWZmaW5pdHlfdG9wX21ldGhvZCA9IGFmZmluaXR5X3RvcF9tZXRob2RfZGVmYXVsdDsKK2ludCAgICAgIF9fa21wX2FmZmluaXR5X2NvbXBhY3QgICAgICA9IDA7CitpbnQgICAgICBfX2ttcF9hZmZpbml0eV9vZmZzZXQgICAgICAgPSAwOworaW50ICAgICAgX19rbXBfYWZmaW5pdHlfdmVyYm9zZSAgICAgID0gRkFMU0U7CitpbnQgICAgICBfX2ttcF9hZmZpbml0eV93YXJuaW5ncyAgICAgPSBUUlVFOworaW50ICAgICAgX19rbXBfYWZmaW5pdHlfcmVzcGVjdF9tYXNrID0gYWZmaW5pdHlfcmVzcGVjdF9tYXNrX2RlZmF1bHQ7CitjaGFyICogICBfX2ttcF9hZmZpbml0eV9wcm9jbGlzdCAgICAgPSBOVUxMOwora21wX2FmZmluX21hc2tfdCAqX19rbXBfYWZmaW5pdHlfbWFza3MgPSBOVUxMOwordW5zaWduZWQgX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzICAgID0gMDsKKworY2hhciBjb25zdCAqICBfX2ttcF9jcHVpbmZvX2ZpbGUgICAgID0gTlVMTDsKKworI2VuZGlmIC8qIEtNUF9BRkZJTklUWV9TVVBQT1JURUQgKi8KKworI2lmIE9NUF80MF9FTkFCTEVECitrbXBfbmVzdGVkX3Byb2NfYmluZF90IF9fa21wX25lc3RlZF9wcm9jX2JpbmQgPSB7IE5VTEwsIDAsIDAgfTsKK2ludCBfX2ttcF9hZmZpbml0eV9udW1fcGxhY2VzID0gMDsKKyNlbmRpZgorCisjaWYgS01QX01JQwordW5zaWduZWQgaW50IF9fa21wX3BsYWNlX251bV9jb3JlcyA9IDA7Cit1bnNpZ25lZCBpbnQgX19rbXBfcGxhY2VfbnVtX3RocmVhZHNfcGVyX2NvcmUgPSAwOwordW5zaWduZWQgaW50IF9fa21wX3BsYWNlX2NvcmVfb2Zmc2V0ID0gMDsKKyNlbmRpZgorCitrbXBfdGFza2luZ19tb2RlX3QgX19rbXBfdGFza2luZ19tb2RlID0gdHNrbV90YXNrX3RlYW1zOworCisvKiBUaGlzIGNoZWNrIGVuc3VyZXMgdGhhdCB0aGUgY29tcGlsZXIgaXMgcGFzc2luZyB0aGUgY29ycmVjdCBkYXRhIHR5cGUKKyAqIGZvciB0aGUgZmxhZ3MgZm9ybWFsIHBhcmFtZXRlciBvZiB0aGUgZnVuY3Rpb24ga21wY19vbXBfdGFza19hbGxvYygpLgorICogSWYgdGhlIHR5cGUgaXMgbm90IGEgNC1ieXRlIHR5cGUsIHRoZW4gZ2l2ZSBhbiBlcnJvciBtZXNzYWdlIGFib3V0CisgKiBhIG5vbi1wb3NpdGl2ZSBsZW5ndGggYXJyYXkgcG9pbnRpbmcgaGVyZS4gIElmIHRoYXQgaGFwcGVucywgdGhlCisgKiBrbXBfdGFza2luZ19mbGFnc190IHN0cnVjdHVyZSBtdXN0IGJlIHJlZGVmaW5lZCB0byBoYXZlIGV4YWN0bHkgMzIgYml0cy4KKyAqLworS01QX0JVSUxEX0FTU0VSVCggc2l6ZW9mKGttcF90YXNraW5nX2ZsYWdzX3QpID09IDQgKTsKKwora21wX2ludDMyIF9fa21wX3Rhc2tfc3RlYWxpbmdfY29uc3RyYWludCA9IDE7ICAgLyogQ29uc3RyYWluIHRhc2sgc3RlYWxpbmcgYnkgZGVmYXVsdCAqLworCisjaWZkZWYgREVCVUdfU1VTUEVORAoraW50ICAgICAgICAgX19rbXBfc3VzcGVuZF9jb3VudCA9IDA7CisjZW5kaWYKKworaW50ICAgICBfX2ttcF9zZXR0aW5ncyA9IEZBTFNFOworaW50ICAgICBfX2ttcF9kdXBsaWNhdGVfbGlicmFyeV9vayA9IDA7CisjaWYgVVNFX0lUVF9CVUlMRAoraW50ICAgICBfX2ttcF9mb3Jram9pbl9mcmFtZXMgPSAxOworaW50ICAgICBfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSA9IDA7CisjZW5kaWYKK1BBQ0tFRF9SRURVQ1RJT05fTUVUSE9EX1QgX19rbXBfZm9yY2VfcmVkdWN0aW9uX21ldGhvZCA9IHJlZHVjdGlvbl9tZXRob2Rfbm90X2RlZmluZWQ7CitpbnQgICAgIF9fa21wX2RldGVybV9yZWQgPSBGQUxTRTsKKworI2lmZGVmIEtNUF9ERUJVRworaW50ICAgICBrbXBfYV9kZWJ1ZyA9IDA7CitpbnQgICAgIGttcF9iX2RlYnVnID0gMDsKK2ludCAgICAga21wX2NfZGVidWcgPSAwOworaW50ICAgICBrbXBfZF9kZWJ1ZyA9IDA7CitpbnQgICAgIGttcF9lX2RlYnVnID0gMDsKK2ludCAgICAga21wX2ZfZGVidWcgPSAwOworaW50ICAgICBrbXBfZGlhZyAgICA9IDA7CisjZW5kaWYKKworLyogRm9yIGRlYnVnIGluZm9ybWF0aW9uIGxvZ2dpbmcgdXNpbmcgcm90YXRpbmcgYnVmZmVyICovCitpbnQgICAgIF9fa21wX2RlYnVnX2J1ZiA9IEZBTFNFOyAgICAgICAgLyogVFJVRSBtZWFucyB1c2UgYnVmZmVyLCBGQUxTRSBtZWFucyBwcmludCB0byBzdGRlcnIgKi8KK2ludCAgICAgX19rbXBfZGVidWdfYnVmX2xpbmVzID0gS01QX0RFQlVHX0JVRl9MSU5FU19JTklUOyAvKiBMaW5lcyBvZiBkZWJ1ZyBzdG9yZWQgaW4gYnVmZmVyICovCitpbnQgICAgIF9fa21wX2RlYnVnX2J1Zl9jaGFycyA9IEtNUF9ERUJVR19CVUZfQ0hBUlNfSU5JVDsgLyogQ2hhcmFjdGVycyBhbGxvd2VkIHBlciBsaW5lIGluIGJ1ZmZlciAqLworaW50ICAgICBfX2ttcF9kZWJ1Z19idWZfYXRvbWljID0gRkFMU0U7IC8qIFRSVUUgbWVhbnMgdXNlIGF0b21pYyB1cGRhdGUgb2YgYnVmZmVyIGVudHJ5IHBvaW50ZXIgKi8KKworY2hhciAgICpfX2ttcF9kZWJ1Z19idWZmZXIgPSBOVUxMOyAgICAgIC8qIERlYnVnIGJ1ZmZlciBpdHNlbGYgKi8KK2ludCAgICAgX19rbXBfZGVidWdfY291bnQgPSAwOyAgICAgICAgICAvKiBDb3VudGVyIGZvciBudW1iZXIgb2YgbGluZXMgcHJpbnRlZCBpbiBidWZmZXIgc28gZmFyICovCitpbnQgICAgIF9fa21wX2RlYnVnX2J1Zl93YXJuX2NoYXJzID0gMDsgLyogS2VlcCB0cmFjayBvZiBjaGFyIGluY3JlYXNlIHJlY29tbWVuZGVkIGluIHdhcm5pbmdzICovCisvKiBlbmQgcm90YXRpbmcgZGVidWcgYnVmZmVyICovCisKKyNpZmRlZiBLTVBfREVCVUcKK2ludCAgICAgX19rbXBfcGFyX3JhbmdlOyAgICAgICAgICAgLyogKzEgPT4gb25seSBnbyBwYXIgZm9yIGNvbnN0cnVjdHMgaW4gcmFuZ2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAtMSA9PiBvbmx5IGdvIHBhciBmb3IgY29uc3RydWN0cyBvdXRzaWRlIHJhbmdlICovCitjaGFyICAgIF9fa21wX3Bhcl9yYW5nZV9yb3V0aW5lW0tNUF9QQVJfUkFOR0VfUk9VVElORV9MRU5dID0geyAnXDAnIH07CitjaGFyICAgIF9fa21wX3Bhcl9yYW5nZV9maWxlbmFtZVtLTVBfUEFSX1JBTkdFX0ZJTEVOQU1FX0xFTl0gPSB7ICdcMCcgfTsKK2ludCAgICAgX19rbXBfcGFyX3JhbmdlX2xiID0gMDsKK2ludCAgICAgX19rbXBfcGFyX3JhbmdlX3ViID0gSU5UX01BWDsKKyNlbmRpZiAvKiBLTVBfREVCVUcgKi8KKworLyogRm9yIHByaW50aW5nIG91dCBkeW5hbWljIHN0b3JhZ2UgbWFwIGZvciB0aHJlYWRzIGFuZCB0ZWFtcyAqLworaW50ICAgICBfX2ttcF9zdG9yYWdlX21hcCA9IEZBTFNFOyAgICAgICAgIC8qIFRydWUgbWVhbnMgcHJpbnQgc3RvcmFnZSBtYXAgZm9yIHRocmVhZHMgYW5kIHRlYW1zICovCitpbnQgICAgIF9fa21wX3N0b3JhZ2VfbWFwX3ZlcmJvc2UgPSBGQUxTRTsgLyogVHJ1ZSBtZWFucyBzdG9yYWdlIG1hcCBpbmNsdWRlcyBwbGFjZW1lbnQgaW5mbyAqLworaW50ICAgICBfX2ttcF9zdG9yYWdlX21hcF92ZXJib3NlX3NwZWNpZmllZCA9IEZBTFNFOworLyogSW5pdGlhbGl6ZSB0aGUgbGlicmFyeSBkYXRhIHN0cnVjdHVyZXMgd2hlbiB3ZSBmb3JrIGEgY2hpbGQgcHJvY2VzcywgZGVmYXVsdHMgdG8gVFJVRSAqLworaW50ICAgICBfX2ttcF9uZWVkX3JlZ2lzdGVyX2F0Zm9yayA9IFRSVUU7IC8qIEF0IGluaXRpYWxpemF0aW9uLCBjYWxsIHB0aHJlYWRfYXRmb3JrIHRvIGluc3RhbGwgZm9yayBoYW5kbGVyICovCitpbnQgICAgIF9fa21wX25lZWRfcmVnaXN0ZXJfYXRmb3JrX3NwZWNpZmllZCA9IFRSVUU7CisKKworaW50ICAgICAgICBfX2ttcF9lbnZfY2h1bmsgICAgICAgPSBGQUxTRTsgIC8qIEtNUF9DSFVOSyBzcGVjaWZpZWQ/ICAgICAqLworaW50ICAgICAgICBfX2ttcF9lbnZfc3Rrc2l6ZSAgICAgPSBGQUxTRTsgIC8qIEtNUF9TVEFDS1NJWkUgc3BlY2lmaWVkPyAqLworaW50ICAgICAgICBfX2ttcF9lbnZfb21wX3N0a3NpemUgPSBGQUxTRTsgIC8qIE9NUF9TVEFDS1NJWkUgc3BlY2lmaWVkPyAqLworaW50ICAgICAgICBfX2ttcF9lbnZfYWxsX3RocmVhZHMgICAgID0gRkFMU0U7LyogS01QX0FMTF9USFJFQURTIG9yIEtNUF9NQVhfVEhSRUFEUyBzcGVjaWZpZWQ/ICovCitpbnQgICAgICAgIF9fa21wX2Vudl9vbXBfYWxsX3RocmVhZHMgPSBGQUxTRTsvKiBPTVBfVEhSRUFEX0xJTUlUIHNwZWNpZmllZD8gKi8KK2ludCAgICAgICAgX19rbXBfZW52X2Jsb2NrdGltZSAgID0gRkFMU0U7ICAvKiBLTVBfQkxPQ0tUSU1FIHNwZWNpZmllZD8gKi8KK2ludCAgICAgICAgX19rbXBfZW52X2NoZWNrcyAgICAgID0gRkFMU0U7ICAvKiBLTVBfQ0hFQ0tTIHNwZWNpZmllZD8gICAgKi8KK2ludCAgICAgICAgX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICA9IEZBTFNFOyAgLyogS01QX0NPTlNJU1RFTkNZX0NIRUNLIHNwZWNpZmllZD8gKi8KKwora21wX3VpbnQzMiBfX2ttcF95aWVsZF9pbml0ID0gS01QX0lOSVRfV0FJVDsKK2ttcF91aW50MzIgX19rbXBfeWllbGRfbmV4dCA9IEtNUF9ORVhUX1dBSVQ7CitrbXBfdWludDMyIF9fa21wX3lpZWxkaW5nX29uID0gMTsKKyNpZiBLTVBfT1NfQ05LCitrbXBfdWludDMyIF9fa21wX3lpZWxkX2N5Y2xlID0gMDsKKyNlbHNlCitrbXBfdWludDMyIF9fa21wX3lpZWxkX2N5Y2xlID0gMTsgICAgIC8qIFlpZWxkLWN5Y2xlIGlzIG9uIGJ5IGRlZmF1bHQgKi8KKyNlbmRpZgora21wX2ludDMyICBfX2ttcF95aWVsZF9vbl9jb3VudCA9IDEwOyAvKiBCeSBkZWZhdWx0LCB5aWVsZGluZyBpcyBvbiBmb3IgMTAgbW9uaXRvciBwZXJpb2RzLiAqLwora21wX2ludDMyICBfX2ttcF95aWVsZF9vZmZfY291bnQgPSAxOyAvKiBCeSBkZWZhdWx0LCB5aWVsZGluZyBpcyBvZmYgZm9yIDEgbW9uaXRvciBwZXJpb2RzLiAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIFNUQVRFIG1vc3RseSBzeW5jcm9uaXplZCB3aXRoIGdsb2JhbCBsb2NrICovCisvKiBkYXRhIHdyaXR0ZW4gdG8gcmFyZWx5IGJ5IG1hc3RlcnMsIHJlYWQgb2Z0ZW4gYnkgd29ya2VycyAqLworLyoKKyAqIFNIQUxMIFdFIEVESVQgVEhFIENPTU1FTlQgQkVMT1cgSU4gU09NRSBXQVk/CisgKiBUT0RPOiAgTm9uZSBvZiB0aGlzIGdsb2JhbCBwYWRkaW5nIHN0dWZmIHdvcmtzIGNvbnNpc3RlbnRseSBiZWNhdXNlCisgKiB0aGUgb3JkZXIgb2YgZGVjbGFyYXRpb24gaXMgbm90IG5lY2Vzc2FyaWx5IGNvcnJlbGF0ZWQgdG8gc3RvcmFnZSBvcmRlci4KKyAqIFRvIGZpeCB0aGlzLCBhbGwgdGhlIGltcG9ydGFudCBnbG9iYWxzIG11c3QgYmUgcHV0IGluIGEgYmlnIHN0cnVjdHVyZQorICogaW5zdGVhZC4KKyAqLworS01QX0FMSUdOX0NBQ0hFCisgICAgICAgICBrbXBfaW5mb190ICoqX19rbXBfdGhyZWFkcyAgICAgPSBOVUxMOworICAgICAgICAga21wX3Jvb3RfdCAqKl9fa21wX3Jvb3QgICAgICAgID0gTlVMTDsKKworLyogZGF0YSByZWFkL3dyaXR0ZW4gdG8gb2Z0ZW4gYnkgbWFzdGVycyAqLworS01QX0FMSUdOX0NBQ0hFCit2b2xhdGlsZSBpbnQgICAgICAgICAgX19rbXBfbnRoICAgICAgICAgICAgICAgICAgICA9IDA7Cit2b2xhdGlsZSBpbnQgICAgICAgICAgX19rbXBfYWxsX250aCAgICAgICAgICAgICAgICA9IDA7CitpbnQgICAgICAgICAgICAgICAgICAgX19rbXBfdGhyZWFkX3Bvb2xfbnRoICAgICAgICA9IDA7Cit2b2xhdGlsZSBrbXBfaW5mb190ICAqX19rbXBfdGhyZWFkX3Bvb2wgICAgICAgICAgICA9IE5VTEw7Cit2b2xhdGlsZSBrbXBfdGVhbV90ICAqX19rbXBfdGVhbV9wb29sICAgICAgICAgICAgICA9IE5VTEw7CisKK0tNUF9BTElHTl9DQUNIRQordm9sYXRpbGUgaW50ICAgICAgICAgIF9fa21wX3RocmVhZF9wb29sX2FjdGl2ZV9udGggPSAwOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBHTE9CQUwvUk9PVCBTVEFURSAqLworS01QX0FMSUdOX0NBQ0hFCitrbXBfZ2xvYmFsX3QgX19rbXBfZ2xvYmFsID0ge3sgMCB9fTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIEdMT0JBTCBTWU5DSFJPTklaQVRJT04gTE9DS1MgKi8KKy8qIFRPRE8gdmVyaWZ5IHRoZSBuZWVkIGZvciB0aGVzZSBsb2NrcyBhbmQgaWYgdGhleSBuZWVkIHRvIGJlIGdsb2JhbCAqLworCisjaWYgS01QX1VTRV9JTlRFUk5PREVfQUxJR05NRU5UCisvKiBNdWx0aW5vZGUgc3lzdGVtcyBoYXZlIGxhcmdlciBjYWNoZSBsaW5lIGdyYW51bGFyaXR5IHdoaWNoIGNhbiBjYXVzZQorICogZmFsc2Ugc2hhcmluZyBpZiB0aGUgYWxpZ25tZW50IGlzIG5vdCBsYXJnZSBlbm91Z2ggZm9yIHRoZXNlIGxvY2tzICovCitLTVBfQUxJR05fQ0FDSEVfSU5URVJOT0RFCisKK2ttcF9ib290c3RyYXBfbG9ja190IF9fa21wX2luaXR6X2xvY2sgICA9IEtNUF9CT09UU1RSQVBfTE9DS19JTklUSUFMSVpFUiggX19rbXBfaW5pdHpfbG9jayAgICk7IC8qIENvbnRyb2wgaW5pdGlhbGl6YXRpb25zICovCitLTVBfQUxJR05fQ0FDSEVfSU5URVJOT0RFCitrbXBfYm9vdHN0cmFwX2xvY2tfdCBfX2ttcF9mb3Jram9pbl9sb2NrOyAvKiBjb250cm9sIGZvcmsvam9pbiBhY2Nlc3MgKi8KK0tNUF9BTElHTl9DQUNIRV9JTlRFUk5PREUKK2ttcF9ib290c3RyYXBfbG9ja190IF9fa21wX2V4aXRfbG9jazsgICAvKiBleGl0KCkgaXMgbm90IGFsd2F5cyB0aHJlYWQtc2FmZSAqLworS01QX0FMSUdOX0NBQ0hFX0lOVEVSTk9ERQora21wX2Jvb3RzdHJhcF9sb2NrX3QgX19rbXBfbW9uaXRvcl9sb2NrOyAvKiBjb250cm9sIG1vbml0b3IgdGhyZWFkIGNyZWF0aW9uICovCitLTVBfQUxJR05fQ0FDSEVfSU5URVJOT0RFCitrbXBfYm9vdHN0cmFwX2xvY2tfdCBfX2ttcF90cF9jYWNoZWRfbG9jazsgLyogdXNlZCBmb3IgdGhlIGhhY2sgdG8gYWxsb3cgdGhyZWFkcHJpdmF0ZSBjYWNoZSBhbmQgX19rbXBfdGhyZWFkcyBleHBhbnNpb24gdG8gY28tZXhpc3QgKi8KKworS01QX0FMSUdOX0NBQ0hFX0lOVEVSTk9ERQora21wX2xvY2tfdCBfX2ttcF9nbG9iYWxfbG9jazsgICAgICAgICAgIC8qIENvbnRyb2wgT1MvZ2xvYmFsIGFjY2VzcyAqLworS01QX0FMSUdOX0NBQ0hFX0lOVEVSTk9ERQora21wX3F1ZXVpbmdfbG9ja190IF9fa21wX2Rpc3BhdGNoX2xvY2s7ICAgICAgICAgLyogQ29udHJvbCBkaXNwYXRjaCBhY2Nlc3MgICovCitLTVBfQUxJR05fQ0FDSEVfSU5URVJOT0RFCitrbXBfbG9ja190IF9fa21wX2RlYnVnX2xvY2s7ICAgICAgICAgICAgLyogQ29udHJvbCBJL08gYWNjZXNzIGZvciBLTVBfREVCVUcgKi8KKyNlbHNlCitLTVBfQUxJR05fQ0FDSEUKKwora21wX2Jvb3RzdHJhcF9sb2NrX3QgX19rbXBfaW5pdHpfbG9jayAgID0gS01QX0JPT1RTVFJBUF9MT0NLX0lOSVRJQUxJWkVSKCBfX2ttcF9pbml0el9sb2NrICAgKTsgLyogQ29udHJvbCBpbml0aWFsaXphdGlvbnMgKi8KK2ttcF9ib290c3RyYXBfbG9ja190IF9fa21wX2Zvcmtqb2luX2xvY2s7IC8qIGNvbnRyb2wgZm9yay9qb2luIGFjY2VzcyAqLwora21wX2Jvb3RzdHJhcF9sb2NrX3QgX19rbXBfZXhpdF9sb2NrOyAgIC8qIGV4aXQoKSBpcyBub3QgYWx3YXlzIHRocmVhZC1zYWZlICovCitrbXBfYm9vdHN0cmFwX2xvY2tfdCBfX2ttcF9tb25pdG9yX2xvY2s7IC8qIGNvbnRyb2wgbW9uaXRvciB0aHJlYWQgY3JlYXRpb24gKi8KK2ttcF9ib290c3RyYXBfbG9ja190IF9fa21wX3RwX2NhY2hlZF9sb2NrOyAvKiB1c2VkIGZvciB0aGUgaGFjayB0byBhbGxvdyB0aHJlYWRwcml2YXRlIGNhY2hlIGFuZCBfX2ttcF90aHJlYWRzIGV4cGFuc2lvbiB0byBjby1leGlzdCAqLworCitLTVBfQUxJR04oMTI4KQora21wX2xvY2tfdCBfX2ttcF9nbG9iYWxfbG9jazsgICAgICAgICAgIC8qIENvbnRyb2wgT1MvZ2xvYmFsIGFjY2VzcyAqLworS01QX0FMSUdOKDEyOCkKK2ttcF9xdWV1aW5nX2xvY2tfdCBfX2ttcF9kaXNwYXRjaF9sb2NrOyAgICAgICAgIC8qIENvbnRyb2wgZGlzcGF0Y2ggYWNjZXNzICAqLworS01QX0FMSUdOKDEyOCkKK2ttcF9sb2NrX3QgX19rbXBfZGVidWdfbG9jazsgICAgICAgICAgICAvKiBDb250cm9sIEkvTyBhY2Nlc3MgZm9yIEtNUF9ERUJVRyAqLworI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiBLTVBfSEFORExFX1NJR05BTFMKKyAgICAvKgorICAgICAgICBTaWduYWwgaGFuZGxpbmcgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCwgYmVjYXVzZSBpdCBjb25mdXNlcyB1c2VyczogSW4gY2FzZSBvZiBzaWdzZWd2CisgICAgICAgIChvciBvdGhlciB0cm91YmxlKSBpbiB1c2VyIGNvZGUgc2lnbmFsIGhhbmRsZXIgY2F0Y2hlcyB0aGUgc2lnbmFsLCB3aGljaCB0aGVuICJhcHBlYXJzIiBpbgorICAgICAgICB0aGUgbW9uaXRvciB0aHJlYWQgKHdoZW4gdGhlIG1vbml0b3IgZXhlY3V0ZXMgcmFpc2UoKSBmdW5jdGlvbikuIFVzZXJzIHNlZSBzaWduYWwgaW4gdGhlCisgICAgICAgIG1vbml0b3IgdGhyZWFkIGFuZCBibGFtZSBPcGVuTVAgUlRMLgorCisgICAgICAgIEdyYW50IHNhaWQgc2lnbmFsIGhhbmRsaW5nIHJlcXVpcmVkIG9uIHNvbWUgb2xkZXIgT1NlcyAoSXJpeD8pIHN1cHBvcnRlZCBieSBLQUksIGJlY2F1c2UKKyAgICAgICAgYmFkIGFwcGxpY2F0aW9ucyBodW5nIGJ1dCBub3QgYWJvcnRlZC4gQ3VycmVudGx5IGl0IGlzIG5vdCBhIHByb2JsZW0gZm9yIExpbnV4KiBPUywgT1MgWCogYW5kCisgICAgICAgIFdpbmRvd3MqIE9TLgorCisgICAgICAgIEdyYW50OiBGb3VuZCBuZXcgaGFuZ3MgZm9yIEVMNCwgRUw1LCBhbmQgYSBGZWRvcmEgQ29yZSBtYWNoaW5lLiAgU28gSSdtIHB1dHRpbmcKKyAgICAgICAgdGhlIGRlZmF1bHQgYmFjayBmb3Igbm93IHRvIHNlZSBpZiB0aGF0IGZpeGVzIGhhbmdzIG9uIHRob3NlIG1hY2hpbmVzLgorCisgICAgICAgIDIwMTAtMDQwMTMgTGV2OiBJdCB3YXMgYSBidWcgaW4gRm9ydHJhbiBSVEwuIEZvcnRyYW4gUlRMIHByaW50cyBhIGtpbmQgb2Ygc3RhY2sgYmFja3RyYWNlCisgICAgICAgIHdoZW4gcHJvZ3JhbSBpcyBhYm9ydGluZywgYnV0IHRoZSBjb2RlIGlzIG5vdCBzaWduYWwtc2FmZS4gV2hlbiBtdWx0aXBsZSBzaWduYWxzIHJhaXNlZCBhdAorICAgICAgICB0aGUgc2FtZSB0aW1lICh3aGljaCBvY2N1cnMgaW4gZHluYW1pYyBuZWdhdGl2ZSB0ZXN0cyBiZWNhdXNlIGFsbCB0aGUgd29ya2VyIHRocmVhZHMgZGV0ZWN0cworICAgICAgICB0aGUgc2FtZSBlcnJvciksIEZvcnRyYW4gUlRMIG1heSBoYW5nLiBUaGUgYnVnIGZpbmFsbHkgZml4ZWQgaW4gRm9ydHJhbiBSVEwgbGlicmFyeSBwcm92aWRlZAorICAgICAgICBieSBTdGV2ZSBSLiwgYW5kIHdpbGwgYmUgYXZhaWxhYmxlIHNvb24uCisgICAgKi8KKyAgICBpbnQgX19rbXBfaGFuZGxlX3NpZ25hbHMgPSBGQUxTRTsKKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2lmZGVmIEJVSUxEX1RWCitrbXBfa2V5X3QgX19rbXBfdHZfa2V5ID0gMDsKKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZkZWYgREVCVUdfU1VTUEVORAoraW50CitnZXRfc3VzcGVuZF9jb3VudF8oIHZvaWQgKSB7CisgICAgaW50IGNvdW50ID0gX19rbXBfc3VzcGVuZF9jb3VudDsKKyAgICBfX2ttcF9zdXNwZW5kX2NvdW50ID0gMDsKKyAgICByZXR1cm4gY291bnQ7Cit9Cit2b2lkCitzZXRfc3VzcGVuZF9jb3VudF8oIGludCAqIHZhbHVlICkgeworICAgIF9fa21wX3N1c3BlbmRfY291bnQgPSAqdmFsdWU7Cit9CisjZW5kaWYKKworLy8gU3ltYm9scyBmb3IgTVMgbXV0dWFsIGRldGVjdGlvbi4KK2ludCBfWW91X211c3RfbGlua193aXRoX2V4YWN0bHlfb25lX09wZW5NUF9saWJyYXJ5ID0gMTsKK2ludCBfWW91X211c3RfbGlua193aXRoX0ludGVsX09wZW5NUF9saWJyYXJ5ICAgICAgID0gMTsKKyNpZiBLTVBfT1NfV0lORE9XUyAmJiAoIEtNUF9WRVJTSU9OX01BSk9SID4gNCApCisgICAgaW50IF9Zb3VfbXVzdF9saW5rX3dpdGhfTWljcm9zb2Z0X09wZW5NUF9saWJyYXJ5ID0gMTsKKyNlbmRpZgorCisvLyBlbmQgb2YgZmlsZSAvLwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX2dzdXBwb3J0LmMgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfZ3N1cHBvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGRmOGY3Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX2dzdXBwb3J0LmMKQEAgLTAsMCArMSwxMzA0IEBACisvKgorICoga21wX2dzdXBwb3J0LmMKKyAqICRSZXZpc2lvbjogNDM0NzMgJAorICogJERhdGU6IDIwMTQtMDktMjYgMTU6MDI6NTcgLTA1MDAgKEZyaSwgMjYgU2VwIDIwMTQpICQKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmIGRlZmluZWQoX194ODZfNjQpIHx8IGRlZmluZWQgKF9fcG93ZXJwYzY0X18pIHx8IGRlZmluZWQoX19hYXJjaDY0X18pCisjIGRlZmluZSBLTVBfSTgKKyNlbmRpZgorI2luY2x1ZGUgImttcC5oIgorI2luY2x1ZGUgImttcF9hdG9taWMuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgICAgZXh0ZXJuICJDIiB7CisjZW5kaWYgLy8gX19jcGx1c3BsdXMKKworI2RlZmluZSBNS0xPQyhsb2Mscm91dGluZSkgXAorICAgIHN0YXRpYyBpZGVudF90IChsb2MpID0gezAsIEtNUF9JREVOVF9LTVBDLCAwLCAwLCAiO3Vua25vd247dW5rbm93bjswOzA7OyIgfTsKKworI2luY2x1ZGUgImttcF9mdG5fb3MuaCIKKwordm9pZAoreGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9CQVJSSUVSKSh2b2lkKQoreworICAgIGludCBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOworICAgIE1LTE9DKGxvYywgIkdPTVBfYmFycmllciIpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfYmFycmllcjogVCMlZFxuIiwgZ3RpZCkpOworICAgIF9fa21wY19iYXJyaWVyKCZsb2MsIGd0aWQpOworfQorCisKKy8vCisvLyBNdXR1YWwgZXhjbHVzaW9uCisvLworCisvLworLy8gVGhlIHN5bWJvbCB0aGF0IGljYy9pZm9ydCBnZW5lcmF0ZXMgZm9yIHVubmFtZWQgZm9yIHVubmFtZWQgY3JpdGljYWwKKy8vIHNlY3Rpb25zIC0gLmdvbXBfY3JpdGljYWxfdXNlcl8gLSBpcyBkZWZpbmVkIHVzaW5nIC5jb21tIGluIGFueSBvYmplY3RzCisvLyByZWZlcmVuY2UgaXQuICBXZSBjYW4ndCByZWZlcmVuY2UgaXQgZGlyZWN0bHkgaGVyZSBpbiBDIGNvZGUsIGFzIHRoZQorLy8gc3ltYm9sIGNvbnRhaW5zIGEgIi4iLgorLy8KKy8vIFRoZSBSVEwgY29udGFpbnMgYW4gYXNzZW1ibHkgbGFuZ3VhZ2UgZGVmaW5pdGlvbiBvZiAuZ29tcF9jcml0aWNhbF91c2VyXworLy8gd2l0aCBhbm90aGVyIHN5bWJvbCBfX2ttcF91bm5hbWVkX2NyaXRpY2FsX2FkZHIgaW5pdGlhbGl6ZWQgd2l0aCBpdCdzCisvLyBhZGRyZXNzLgorLy8KK2V4dGVybiBrbXBfY3JpdGljYWxfbmFtZSAqX19rbXBfdW5uYW1lZF9jcml0aWNhbF9hZGRyOworCisKK3ZvaWQKK3hleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfQ1JJVElDQUxfU1RBUlQpKHZvaWQpCit7CisgICAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgICAgTUtMT0MobG9jLCAiR09NUF9jcml0aWNhbF9zdGFydCIpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfY3JpdGljYWxfc3RhcnQ6IFQjJWRcbiIsIGd0aWQpKTsKKyAgICBfX2ttcGNfY3JpdGljYWwoJmxvYywgZ3RpZCwgX19rbXBfdW5uYW1lZF9jcml0aWNhbF9hZGRyKTsKK30KKworCit2b2lkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0NSSVRJQ0FMX0VORCkodm9pZCkKK3sKKyAgICBpbnQgZ3RpZCA9IF9fa21wX2dldF9ndGlkKCk7CisgICAgTUtMT0MobG9jLCAiR09NUF9jcml0aWNhbF9lbmQiKTsKKyAgICBLQV9UUkFDRSgyMCwgKCJHT01QX2NyaXRpY2FsX2VuZDogVCMlZFxuIiwgZ3RpZCkpOworICAgIF9fa21wY19lbmRfY3JpdGljYWwoJmxvYywgZ3RpZCwgX19rbXBfdW5uYW1lZF9jcml0aWNhbF9hZGRyKTsKK30KKworCit2b2lkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0NSSVRJQ0FMX05BTUVfU1RBUlQpKHZvaWQgKipwcHRyKQoreworICAgIGludCBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOworICAgIE1LTE9DKGxvYywgIkdPTVBfY3JpdGljYWxfbmFtZV9zdGFydCIpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfY3JpdGljYWxfbmFtZV9zdGFydDogVCMlZFxuIiwgZ3RpZCkpOworICAgIF9fa21wY19jcml0aWNhbCgmbG9jLCBndGlkLCAoa21wX2NyaXRpY2FsX25hbWUgKilwcHRyKTsKK30KKworCit2b2lkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0NSSVRJQ0FMX05BTUVfRU5EKSh2b2lkICoqcHB0cikKK3sKKyAgICBpbnQgZ3RpZCA9IF9fa21wX2dldF9ndGlkKCk7CisgICAgTUtMT0MobG9jLCAiR09NUF9jcml0aWNhbF9uYW1lX2VuZCIpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfY3JpdGljYWxfbmFtZV9lbmQ6IFQjJWRcbiIsIGd0aWQpKTsKKyAgICBfX2ttcGNfZW5kX2NyaXRpY2FsKCZsb2MsIGd0aWQsIChrbXBfY3JpdGljYWxfbmFtZSAqKXBwdHIpOworfQorCisKKy8vCisvLyBUaGUgR251IGNvZGVnZW4gdHJpZXMgdG8gdXNlIGxvY2tlZCBvcGVyYXRpb25zIHRvIHBlcmZvcm0gYXRvbWljIHVwZGF0ZXMKKy8vIGlubGluZS4gIElmIGl0IGNhbid0LCB0aGVuIGl0IGNhbGxzIEdPTVBfYXRvbWljX3N0YXJ0KCkgYmVmb3JlIHBlcmZvcm1pbmcKKy8vIHRoZSB1cGRhdGUgYW5kIEdPTVBfYXRvbWljX2VuZCgpIGFmdGVyd2FyZCwgcmVnYXJkbGVzcyBvZiB0aGUgZGF0YSB0eXBlLgorLy8KKwordm9pZAoreGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9BVE9NSUNfU1RBUlQpKHZvaWQpCit7CisgICAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF9hdG9taWNfc3RhcnQ6IFQjJWRcbiIsIGd0aWQpKTsKKyAgICBfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCZfX2ttcF9hdG9taWNfbG9jaywgZ3RpZCk7Cit9CisKKwordm9pZAoreGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9BVE9NSUNfRU5EKSh2b2lkKQoreworICAgIGludCBndGlkID0gX19rbXBfZ2V0X2d0aWQoKTsKKyAgICBLQV9UUkFDRSgyMCwgKCJHT01QX2F0b21pY19zdGFydDogVCMlZFxuIiwgZ3RpZCkpOworICAgIF9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soJl9fa21wX2F0b21pY19sb2NrLCBndGlkKTsKK30KKworCitpbnQKK3hleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfU0lOR0xFX1NUQVJUKSh2b2lkKQoreworICAgIGludCBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOworICAgIE1LTE9DKGxvYywgIkdPTVBfc2luZ2xlX3N0YXJ0Iik7CisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF9zaW5nbGVfc3RhcnQ6IFQjJWRcbiIsIGd0aWQpKTsKKworICAgIGlmICghIFRDUl80KF9fa21wX2luaXRfcGFyYWxsZWwpKQorICAgICAgICBfX2ttcF9wYXJhbGxlbF9pbml0aWFsaXplKCk7CisKKyAgICAvLworICAgIC8vIDNyZCBwYXJhbWV0ZXIgPT0gRkFMU0UgcHJldmVudHMga21wX2VudGVyX3NpbmdsZSBmcm9tIHB1c2hpbmcgYQorICAgIC8vIHdvcmtzaGFyZSB3aGVuIFVTRV9DSEVDS1MgaXMgZGVmaW5lZC4gIFdlIG5lZWQgdG8gYXZvaWQgdGhlIHB1c2gsCisgICAgLy8gYXMgdGhlcmUgaXMgbm8gY29ycmVzcG9uZGluZyBHT01QX3NpbmdsZV9lbmQoKSBjYWxsLgorICAgIC8vCisgICAgcmV0dXJuIF9fa21wX2VudGVyX3NpbmdsZShndGlkLCAmbG9jLCBGQUxTRSk7Cit9CisKKwordm9pZCAqCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX1NJTkdMRV9DT1BZX1NUQVJUKSh2b2lkKQoreworICAgIHZvaWQgKnJldHZhbDsKKyAgICBpbnQgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKyAgICBNS0xPQyhsb2MsICJHT01QX3NpbmdsZV9jb3B5X3N0YXJ0Iik7CisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF9zaW5nbGVfY29weV9zdGFydDogVCMlZFxuIiwgZ3RpZCkpOworCisgICAgaWYgKCEgVENSXzQoX19rbXBfaW5pdF9wYXJhbGxlbCkpCisgICAgICAgIF9fa21wX3BhcmFsbGVsX2luaXRpYWxpemUoKTsKKworICAgIC8vCisgICAgLy8gSWYgdGhpcyBpcyB0aGUgZmlyc3QgdGhyZWFkIHRvIGVudGVyLCByZXR1cm4gTlVMTC4gIFRoZSBnZW5lcmF0ZWQKKyAgICAvLyBjb2RlIHdpbGwgdGhlbiBjYWxsIEdPTVBfc2luZ2xlX2NvcHlfZW5kKCkgZm9yIHRoaXMgdGhyZWFkIG9ubHksCisgICAgLy8gd2l0aCB0aGUgY29weXByaXZhdGUgZGF0YSBwb2ludGVyIGFzIGFuIGFyZ3VtZW50LgorICAgIC8vCisgICAgaWYgKF9fa21wX2VudGVyX3NpbmdsZShndGlkLCAmbG9jLCBGQUxTRSkpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgLy8KKyAgICAvLyBXYWl0IGZvciB0aGUgZmlyc3QgdGhyZWFkIHRvIHNldCB0aGUgY29weXByaXZhdGUgZGF0YSBwb2ludGVyLAorICAgIC8vIGFuZCBmb3IgYWxsIG90aGVyIHRocmVhZHMgdG8gcmVhY2ggdGhpcyBwb2ludC4KKyAgICAvLworICAgIF9fa21wX2JhcnJpZXIoYnNfcGxhaW5fYmFycmllciwgZ3RpZCwgRkFMU0UsIDAsIE5VTEwsIE5VTEwpOworCisgICAgLy8KKyAgICAvLyBSZXRyaWV2ZSB0aGUgdmFsdWUgb2YgdGhlIGNvcHlwcml2YXRlIGRhdGEgcG9pbnQsIGFuZCB3YWl0IGZvciBhbGwKKyAgICAvLyB0aHJlYWRzIHRvIGRvIGxpa2V3aXNlLCB0aGVuIHJldHVybi4KKyAgICAvLworICAgIHJldHZhbCA9IF9fa21wX3RlYW1fZnJvbV9ndGlkKGd0aWQpLT50LnRfY29weXByaXZfZGF0YTsKKyAgICBfX2ttcF9iYXJyaWVyKGJzX3BsYWluX2JhcnJpZXIsIGd0aWQsIEZBTFNFLCAwLCBOVUxMLCBOVUxMKTsKKyAgICByZXR1cm4gcmV0dmFsOworfQorCisKK3ZvaWQKK3hleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfU0lOR0xFX0NPUFlfRU5EKSh2b2lkICpkYXRhKQoreworICAgIGludCBndGlkID0gX19rbXBfZ2V0X2d0aWQoKTsKKyAgICBNS0xPQyhsb2MsICJHT01QX3NpbmdsZV9jb3B5X2VuZCIpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfc2luZ2xlX2NvcHlfZW5kOiBUIyVkXG4iLCBndGlkKSk7CisKKyAgICAvLworICAgIC8vIFNldCB0aGUgY29weXByaXZhdGUgZGF0YSBwb2ludGVyIGZvIHRoZSB0ZWFtLCB0aGVuIGhpdCB0aGUgYmFycmllcgorICAgIC8vIHNvIHRoYXQgdGhlIG90aGVyIHRocmVhZHMgd2lsbCBjb250aW51ZSBvbiBhbmQgcmVhZCBpdC4gIEhpdCBhbm90aGVyCisgICAgLy8gYmFycmllciBiZWZvcmUgY29udGludWluZywgc28gdGhhdCB0aGUga25vdyB0aGF0IHRoZSBjb3B5cHJpdmF0ZQorICAgIC8vIGRhdGEgcG9pbnRlciBoYXMgYmVlbiBwcm9wYWdhdGVkIHRvIGFsbCB0aHJlYWRzIGJlZm9yZSB0cnlpbmcgdG8KKyAgICAvLyByZXVzZSB0aGUgdF9jb3B5cHJpdl9kYXRhIGZpZWxkLgorICAgIC8vCisgICAgX19rbXBfdGVhbV9mcm9tX2d0aWQoZ3RpZCktPnQudF9jb3B5cHJpdl9kYXRhID0gZGF0YTsKKyAgICBfX2ttcF9iYXJyaWVyKGJzX3BsYWluX2JhcnJpZXIsIGd0aWQsIEZBTFNFLCAwLCBOVUxMLCBOVUxMKTsKKyAgICBfX2ttcF9iYXJyaWVyKGJzX3BsYWluX2JhcnJpZXIsIGd0aWQsIEZBTFNFLCAwLCBOVUxMLCBOVUxMKTsKK30KKworCit2b2lkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX09SREVSRURfU1RBUlQpKHZvaWQpCit7CisgICAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgICAgTUtMT0MobG9jLCAiR09NUF9vcmRlcmVkX3N0YXJ0Iik7CisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF9vcmRlcmVkX3N0YXJ0OiBUIyVkXG4iLCBndGlkKSk7CisgICAgX19rbXBjX29yZGVyZWQoJmxvYywgZ3RpZCk7Cit9CisKKwordm9pZAoreGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9PUkRFUkVEX0VORCkodm9pZCkKK3sKKyAgICBpbnQgZ3RpZCA9IF9fa21wX2dldF9ndGlkKCk7CisgICAgTUtMT0MobG9jLCAiR09NUF9vcmRlcmVkX2VuZCIpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfb3JkZXJlZF9zdGFydDogVCMlZFxuIiwgZ3RpZCkpOworICAgIF9fa21wY19lbmRfb3JkZXJlZCgmbG9jLCBndGlkKTsKK30KKworCisvLworLy8gRGlzcGF0Y2ggbWFjcm8gZGVmcworLy8KKy8vIFRoZXkgY29tZSBpbiB0d28gZmxhdm9yczogNjQtYml0IHVuc2lnbmVkLCBhbmQgZWl0aGVyIDMyLWJpdCBzaWduZWQKKy8vIChJQS0zMiBhcmNoaXRlY3R1cmUpIG9yIDY0LWJpdCBzaWduZWQgKEludGVsKFIpIDY0KS4KKy8vCisKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfQVJNCisjIGRlZmluZSBLTVBfRElTUEFUQ0hfSU5JVCAgICAgICAgICAgICAgX19rbXBfYXV4X2Rpc3BhdGNoX2luaXRfNAorIyBkZWZpbmUgS01QX0RJU1BBVENIX0ZJTklfQ0hVTksgICAgICAgIF9fa21wX2F1eF9kaXNwYXRjaF9maW5pX2NodW5rXzQKKyMgZGVmaW5lIEtNUF9ESVNQQVRDSF9ORVhUICAgICAgICAgICAgICBfX2ttcGNfZGlzcGF0Y2hfbmV4dF80CisjZWxzZQorIyBkZWZpbmUgS01QX0RJU1BBVENIX0lOSVQgICAgICAgICAgICAgIF9fa21wX2F1eF9kaXNwYXRjaF9pbml0XzgKKyMgZGVmaW5lIEtNUF9ESVNQQVRDSF9GSU5JX0NIVU5LICAgICAgICBfX2ttcF9hdXhfZGlzcGF0Y2hfZmluaV9jaHVua184CisjIGRlZmluZSBLTVBfRElTUEFUQ0hfTkVYVCAgICAgICAgICAgICAgX19rbXBjX2Rpc3BhdGNoX25leHRfOAorI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiAqLworCisjIGRlZmluZSBLTVBfRElTUEFUQ0hfSU5JVF9VTEwgICAgICAgICAgX19rbXBfYXV4X2Rpc3BhdGNoX2luaXRfOHUKKyMgZGVmaW5lIEtNUF9ESVNQQVRDSF9GSU5JX0NIVU5LX1VMTCAgICBfX2ttcF9hdXhfZGlzcGF0Y2hfZmluaV9jaHVua184dQorIyBkZWZpbmUgS01QX0RJU1BBVENIX05FWFRfVUxMICAgICAgICAgIF9fa21wY19kaXNwYXRjaF9uZXh0Xzh1CisKKworLy8KKy8vIFRoZSBwYXJhbGxlbCBjb250cnVjdAorLy8KKworI2lmbmRlZiBLTVBfREVCVUcKK3N0YXRpYworI2VuZGlmIC8qIEtNUF9ERUJVRyAqLwordm9pZAorX19rbXBfR09NUF9taWNyb3Rhc2tfd3JhcHBlcihpbnQgKmd0aWQsIGludCAqbnByLCB2b2lkICgqdGFzaykodm9pZCAqKSwKKyAgdm9pZCAqZGF0YSkKK3sKKyAgICB0YXNrKGRhdGEpOworfQorCisKKyNpZm5kZWYgS01QX0RFQlVHCitzdGF0aWMKKyNlbmRpZiAvKiBLTVBfREVCVUcgKi8KK3ZvaWQKK19fa21wX0dPTVBfcGFyYWxsZWxfbWljcm90YXNrX3dyYXBwZXIoaW50ICpndGlkLCBpbnQgKm5wciwKKyAgdm9pZCAoKnRhc2spKHZvaWQgKiksIHZvaWQgKmRhdGEsIHVuc2lnbmVkIG51bV90aHJlYWRzLCBpZGVudF90ICpsb2MsCisgIGVudW0gc2NoZWRfdHlwZSBzY2hlZHVsZSwgbG9uZyBzdGFydCwgbG9uZyBlbmQsIGxvbmcgaW5jciwgbG9uZyBjaHVua19zaXplKQoreworICAgIC8vCisgICAgLy8gSW50aWFsaXplIHRoZSBsb29wIHdvcmtzaGFyaW5nIGNvbnN0cnVjdC4KKyAgICAvLworICAgIEtNUF9ESVNQQVRDSF9JTklUKGxvYywgKmd0aWQsIHNjaGVkdWxlLCBzdGFydCwgZW5kLCBpbmNyLCBjaHVua19zaXplLAorICAgICAgc2NoZWR1bGUgIT0ga21wX3NjaF9zdGF0aWMpOworCisgICAgLy8KKyAgICAvLyBOb3cgaW52b2tlIHRoZSBtaWNyb3Rhc2suCisgICAgLy8KKyAgICB0YXNrKGRhdGEpOworfQorCisKKyNpZm5kZWYgS01QX0RFQlVHCitzdGF0aWMKKyNlbmRpZiAvKiBLTVBfREVCVUcgKi8KK3ZvaWQKK19fa21wX0dPTVBfZm9ya19jYWxsKGlkZW50X3QgKmxvYywgaW50IGd0aWQsIG1pY3JvdGFza190IHdyYXBwZXIsIGludCBhcmdjLC4uLikKK3sKKyAgICBpbnQgcmM7CisKKyAgICB2YV9saXN0IGFwOworICAgIHZhX3N0YXJ0KGFwLCBhcmdjKTsKKworICAgIHJjID0gX19rbXBfZm9ya19jYWxsKGxvYywgZ3RpZCwgZm9ya19jb250ZXh0X2dudSwgYXJnYywgd3JhcHBlciwgX19rbXBfaW52b2tlX3Rhc2tfZnVuYywKKyNpZiAoS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSB8fCBLTVBfQVJDSF9BQVJDSDY0KSAmJiBLTVBfT1NfTElOVVgKKyAgICAgICZhcAorI2Vsc2UKKyAgICAgIGFwCisjZW5kaWYKKyAgICAgICk7CisKKyAgICB2YV9lbmQoYXApOworCisgICAgaWYgKHJjKSB7CisgICAgICAgIGttcF9pbmZvX3QgKnRociA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisgICAgICAgIF9fa21wX3J1bl9iZWZvcmVfaW52b2tlZF90YXNrKGd0aWQsIF9fa21wX3RpZF9mcm9tX2d0aWQoZ3RpZCksIHRociwKKyAgICAgICAgICB0aHItPnRoLnRoX3RlYW0pOworICAgIH0KK30KKworCit2b2lkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX1NUQVJUKSh2b2lkICgqdGFzaykodm9pZCAqKSwgdm9pZCAqZGF0YSwgdW5zaWduZWQgbnVtX3RocmVhZHMpCit7CisgICAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgICAgTUtMT0MobG9jLCAiR09NUF9wYXJhbGxlbF9zdGFydCIpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfcGFyYWxsZWxfc3RhcnQ6IFQjJWRcbiIsIGd0aWQpKTsKKworICAgIGlmIChfX2ttcGNfb2tfdG9fZm9yaygmbG9jKSAmJiAobnVtX3RocmVhZHMgIT0gMSkpIHsKKyAgICAgICAgaWYgKG51bV90aHJlYWRzICE9IDApIHsKKyAgICAgICAgICAgIF9fa21wX3B1c2hfbnVtX3RocmVhZHMoJmxvYywgZ3RpZCwgbnVtX3RocmVhZHMpOworICAgICAgICB9CisgICAgICAgIF9fa21wX0dPTVBfZm9ya19jYWxsKCZsb2MsIGd0aWQsCisgICAgICAgICAgKG1pY3JvdGFza190KV9fa21wX0dPTVBfbWljcm90YXNrX3dyYXBwZXIsIDIsIHRhc2ssIGRhdGEpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgX19rbXBjX3NlcmlhbGl6ZWRfcGFyYWxsZWwoJmxvYywgZ3RpZCk7CisgICAgfQorfQorCisKK3ZvaWQKK3hleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfRU5EKSh2b2lkKQoreworICAgIGludCBndGlkID0gX19rbXBfZ2V0X2d0aWQoKTsKKyAgICBNS0xPQyhsb2MsICJHT01QX3BhcmFsbGVsX2VuZCIpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfcGFyYWxsZWxfZW5kOiBUIyVkXG4iLCBndGlkKSk7CisKKyAgICBpZiAoISBfX2ttcF90aHJlYWRzW2d0aWRdLT50aC50aF90ZWFtLT50LnRfc2VyaWFsaXplZCkgeworICAgICAgICBrbXBfaW5mb190ICp0aHIgPSBfX2ttcF90aHJlYWRzW2d0aWRdOworICAgICAgICBfX2ttcF9ydW5fYWZ0ZXJfaW52b2tlZF90YXNrKGd0aWQsIF9fa21wX3RpZF9mcm9tX2d0aWQoZ3RpZCksIHRociwKKyAgICAgICAgICB0aHItPnRoLnRoX3RlYW0pOworICAgICAgICBfX2ttcF9qb2luX2NhbGwoJmxvYywgZ3RpZCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBfX2ttcGNfZW5kX3NlcmlhbGl6ZWRfcGFyYWxsZWwoJmxvYywgZ3RpZCk7CisgICAgfQorfQorCisKKy8vCisvLyBMb29wIHdvcmtzaGFyaW5nIGNvbnN0cnVjdHMKKy8vCisKKy8vCisvLyBUaGUgR251IGNvZGVnZW4gcGFzc2VzIGluIGFuIGV4Y2x1c2l2ZSB1cHBlciBib3VuZCBmb3IgdGhlIG92ZXJhbGwgcmFuZ2UsCisvLyBidXQgdGhlIGxpYmd1aWRlIGRpc3BhdGNoIGNvZGUgZXhwZWN0cyBhbiBpbmNsdXNpdmUgdXBwZXIgYm91bmQsIGhlbmNlIHRoZQorLy8gImVuZCAtIGluY3IiIDV0aCBhcmd1bWVudCB0byBLTVBfRElTUEFUQ0hfSU5JVCAoYW5kIHRoZSAiIHViIC0gc3RyIiAxMXRoCisvLyBhcmd1bWVudCB0byBfX2ttcF9HT01QX2ZvcmtfY2FsbCkuCisvLworLy8gQ29udmVyc2VseSwgS01QX0RJU1BBVENIX05FWFQgcmV0dXJucyBhbmQgaW5jbHVzaXZlIHVwcGVyIGJvdW5kIGluICpwX3ViLAorLy8gYnV0IHRoZSBHbnUgY29kZWdlbiBleHBlY3RzIGFuIGV4Y2x1c2lkZSB1cHBlciBib3VuZCwgc28gdGhlIGFkanVzdG1lbnQKKy8vICIqcF91YiArPSBzdHJpZGUiIGNvbXBlbnN0YXRlcyBmb3IgdGhlIGRpc2NyZXBhbmN5LgorLy8KKy8vIENvcnJlY3Rpb246IHRoZSBnbnUgY29kZWdlbiBhbHdheXMgYWRqdXN0cyB0aGUgdXBwZXIgYm91bmQgYnkgKy0xLCBub3QgdGhlCisvLyBzdHJpZGUgdmFsdWUuICBXZSBhZGp1c3QgdGhlIGRpc3BhdGNoIHBhcmFtZXRlcnMgYWNjb3JkaW5nbHkgKGJ5ICstMSksIGJ1dAorLy8gd2Ugc3RpbGwgYWRqdXN0IHBfdWIgYnkgdGhlIGFjdHVhbCBzdHJpZGUgdmFsdWUuCisvLworLy8gVGhlICJydW50aW1lIiB2ZXJzaW9ucyBkbyBub3QgdGFrZSBhIGNodW5rX3N6IHBhcmFtZXRlci4KKy8vCisvLyBUaGUgcHJvZmlsZSBsaWIgY2Fubm90IHN1cHBvcnQgY29uc3RydWN0IGNoZWNraW5nIG9mIHVub3JkZXJlZCBsb29wcyB0aGF0CisvLyBhcmUgcHJlZGV0ZXJtaW5lZCBieSB0aGUgY29tcGlsZXIgdG8gYmUgc3RhdGljYWxseSBzY2hlZHVsZWQsIGFzIHRoZSBnY2MKKy8vIGNvZGVnZW4gd2lsbCBub3QgYWx3YXlzIGVtaXQgY2FsbHMgdG8gR09NUF9sb29wX3N0YXRpY19uZXh0KCkgdG8gZ2V0IHRoZQorLy8gbmV4dCBpdGVyYXRpb24uICBJbnN0ZWFkLCBpdCBlbWl0cyBpbmxpbmUgY29kZSB0byBjYWxsIG9tcF9nZXRfdGhyZWFkX251bSgpCisvLyBudW0gYW5kIGNhbGN1bGF0ZSB0aGUgaXRlcmF0aW9uIHNwYWNlIHVzaW5nIHRoZSByZXN1bHQuICBJdCBkb2Vzbid0IGRvIHRoaXMKKy8vIHdpdGggb3JkZXJlZCBzdGF0aWMgbG9vcCwgc28gdGhleSBjYW4gYmUgY2hlY2tlZC4KKy8vCisKKyNkZWZpbmUgTE9PUF9TVEFSVChmdW5jLHNjaGVkdWxlKSBcCisgICAgaW50IGZ1bmMgKGxvbmcgbGIsIGxvbmcgdWIsIGxvbmcgc3RyLCBsb25nIGNodW5rX3N6LCBsb25nICpwX2xiLCAgICAgICAgIFwKKyAgICAgIGxvbmcgKnBfdWIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBzdGF0dXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbG9uZyBzdHJpZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1LTE9DKGxvYywgI2Z1bmMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS0FfVFJBQ0UoMjAsICggI2Z1bmMgIjogVCMlZCwgbGIgMHglbHgsIHViIDB4JWx4LCBzdHIgMHglbHgsIGNodW5rX3N6IDB4JWx4XG4iLCAgXAorICAgICAgICAgIGd0aWQsIGxiLCB1Yiwgc3RyLCBjaHVua19zeiApKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKChzdHIgPiAwKSA/IChsYiA8IHViKSA6IChsYiA+IHViKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgS01QX0RJU1BBVENIX0lOSVQoJmxvYywgZ3RpZCwgKHNjaGVkdWxlKSwgbGIsICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIChzdHIgPiAwKSA/ICh1YiAtIDEpIDogKHViICsgMSksIHN0ciwgY2h1bmtfc3osICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgKHNjaGVkdWxlKSAhPSBrbXBfc2NoX3N0YXRpYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgc3RhdHVzID0gS01QX0RJU1BBVENIX05FWFQoJmxvYywgZ3RpZCwgTlVMTCwgKGttcF9pbnQgKilwX2xiLCAgICBcCisgICAgICAgICAgICAgIChrbXBfaW50ICopcF91YiwgKGttcF9pbnQgKikmc3RyaWRlKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmIChzdGF0dXMpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoc3RyaWRlID09IHN0cik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKnBfdWIgKz0gKHN0ciA+IDApID8gMSA6IC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHN0YXR1cyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS0FfVFJBQ0UoMjAsICggI2Z1bmMgIiBleGl0OiBUIyVkLCAqcF9sYiAweCVseCwgKnBfdWIgMHglbHgsIHJldHVybmluZyAlZFxuIiwgXAorICAgICAgICAgIGd0aWQsICpwX2xiLCAqcF91Yiwgc3RhdHVzKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiBzdGF0dXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKworI2RlZmluZSBMT09QX1JVTlRJTUVfU1RBUlQoZnVuYyxzY2hlZHVsZSkgXAorICAgIGludCBmdW5jIChsb25nIGxiLCBsb25nIHViLCBsb25nIHN0ciwgbG9uZyAqcF9sYiwgbG9uZyAqcF91YikgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IHN0YXR1czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBsb25nIHN0cmlkZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGxvbmcgY2h1bmtfc3ogPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBNS0xPQyhsb2MsICNmdW5jKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtBX1RSQUNFKDIwLCAoICNmdW5jICI6IFQjJWQsIGxiIDB4JWx4LCB1YiAweCVseCwgc3RyIDB4JWx4LCBjaHVua19zeiAlZFxuIiwgIFwKKyAgICAgICAgICBndGlkLCBsYiwgdWIsIHN0ciwgY2h1bmtfc3ogKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICgoc3RyID4gMCkgPyAobGIgPCB1YikgOiAobGIgPiB1YikpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEtNUF9ESVNQQVRDSF9JTklUKCZsb2MsIGd0aWQsIChzY2hlZHVsZSksIGxiLCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAoc3RyID4gMCkgPyAodWIgLSAxKSA6ICh1YiArIDEpLCBzdHIsIGNodW5rX3N6LCBUUlVFKTsgICAgICAgICBcCisgICAgICAgICAgICBzdGF0dXMgPSBLTVBfRElTUEFUQ0hfTkVYVCgmbG9jLCBndGlkLCBOVUxMLCAoa21wX2ludCAqKXBfbGIsICAgIFwKKyAgICAgICAgICAgICAgKGttcF9pbnQgKilwX3ViLCAoa21wX2ludCAqKSZzdHJpZGUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKHN0YXR1cykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChzdHJpZGUgPT0gc3RyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAqcF91YiArPSAoc3RyID4gMCkgPyAxIDogLTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgc3RhdHVzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLQV9UUkFDRSgyMCwgKCAjZnVuYyAiIGV4aXQ6IFQjJWQsICpwX2xiIDB4JWx4LCAqcF91YiAweCVseCwgcmV0dXJuaW5nICVkXG4iLCBcCisgICAgICAgICAgZ3RpZCwgKnBfbGIsICpwX3ViLCBzdGF0dXMpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIHN0YXR1czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworCisjZGVmaW5lIExPT1BfTkVYVChmdW5jLGZpbmlfY29kZSkgXAorICAgIGludCBmdW5jKGxvbmcgKnBfbGIsIGxvbmcgKnBfdWIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IHN0YXR1czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBsb25nIHN0cmlkZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBndGlkID0gX19rbXBfZ2V0X2d0aWQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTUtMT0MobG9jLCAjZnVuYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLQV9UUkFDRSgyMCwgKCAjZnVuYyAiOiBUIyVkXG4iLCBndGlkKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZmluaV9jb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzdGF0dXMgPSBLTVBfRElTUEFUQ0hfTkVYVCgmbG9jLCBndGlkLCBOVUxMLCAoa21wX2ludCAqKXBfbGIsICAgICAgICBcCisgICAgICAgICAgKGttcF9pbnQgKilwX3ViLCAoa21wX2ludCAqKSZzdHJpZGUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKHN0YXR1cykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKnBfdWIgKz0gKHN0cmlkZSA+IDApID8gMSA6IC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLQV9UUkFDRSgyMCwgKCAjZnVuYyAiIGV4aXQ6IFQjJWQsICpwX2xiIDB4JWx4LCAqcF91YiAweCVseCwgc3RyaWRlIDB4JWx4LCAiICBcCisgICAgICAgICAgInJldHVybmluZyAlZFxuIiwgZ3RpZCwgKnBfbGIsICpwX3ViLCBzdHJpZGUsIHN0YXR1cykpOyAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIHN0YXR1czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworCitMT09QX1NUQVJUKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9TVEFUSUNfU1RBUlQpLCBrbXBfc2NoX3N0YXRpYykKK0xPT1BfTkVYVCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfU1RBVElDX05FWFQpLCB7fSkKK0xPT1BfU1RBUlQoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX0RZTkFNSUNfU1RBUlQpLCBrbXBfc2NoX2R5bmFtaWNfY2h1bmtlZCkKK0xPT1BfTkVYVCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfRFlOQU1JQ19ORVhUKSwge30pCitMT09QX1NUQVJUKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9HVUlERURfU1RBUlQpLCBrbXBfc2NoX2d1aWRlZF9jaHVua2VkKQorTE9PUF9ORVhUKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9HVUlERURfTkVYVCksIHt9KQorTE9PUF9SVU5USU1FX1NUQVJUKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9SVU5USU1FX1NUQVJUKSwga21wX3NjaF9ydW50aW1lKQorTE9PUF9ORVhUKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9SVU5USU1FX05FWFQpLCB7fSkKKworTE9PUF9TVEFSVCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfT1JERVJFRF9TVEFUSUNfU1RBUlQpLCBrbXBfb3JkX3N0YXRpYykKK0xPT1BfTkVYVCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfT1JERVJFRF9TVEFUSUNfTkVYVCksIFwKKyAgICB7IEtNUF9ESVNQQVRDSF9GSU5JX0NIVU5LKCZsb2MsIGd0aWQpOyB9KQorTE9PUF9TVEFSVCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfT1JERVJFRF9EWU5BTUlDX1NUQVJUKSwga21wX29yZF9keW5hbWljX2NodW5rZWQpCitMT09QX05FWFQoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfRFlOQU1JQ19ORVhUKSwgXAorICAgIHsgS01QX0RJU1BBVENIX0ZJTklfQ0hVTksoJmxvYywgZ3RpZCk7IH0pCitMT09QX1NUQVJUKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX0dVSURFRF9TVEFSVCksIGttcF9vcmRfZ3VpZGVkX2NodW5rZWQpCitMT09QX05FWFQoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfR1VJREVEX05FWFQpLCBcCisgICAgeyBLTVBfRElTUEFUQ0hfRklOSV9DSFVOSygmbG9jLCBndGlkKTsgfSkKK0xPT1BfUlVOVElNRV9TVEFSVCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfT1JERVJFRF9SVU5USU1FX1NUQVJUKSwga21wX29yZF9ydW50aW1lKQorTE9PUF9ORVhUKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX1JVTlRJTUVfTkVYVCksIFwKKyAgICB7IEtNUF9ESVNQQVRDSF9GSU5JX0NIVU5LKCZsb2MsIGd0aWQpOyB9KQorCisKK3ZvaWQKK3hleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9FTkQpKHZvaWQpCit7CisgICAgaW50IGd0aWQgPSBfX2ttcF9nZXRfZ3RpZCgpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfbG9vcF9lbmQ6IFQjJWRcbiIsIGd0aWQpKQorCisgICAgX19rbXBfYmFycmllcihic19wbGFpbl9iYXJyaWVyLCBndGlkLCBGQUxTRSwgMCwgTlVMTCwgTlVMTCk7CisKKyAgICBLQV9UUkFDRSgyMCwgKCJHT01QX2xvb3BfZW5kIGV4aXQ6IFQjJWRcbiIsIGd0aWQpKQorfQorCisKK3ZvaWQKK3hleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9FTkRfTk9XQUlUKSh2b2lkKQoreworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfbG9vcF9lbmRfbm93YWl0OiBUIyVkXG4iLCBfX2ttcF9nZXRfZ3RpZCgpKSkKK30KKworCisvLworLy8gVW5zaWduZWQgbG9uZyBsb25nIGxvb3Agd29ya3NoYXJpbmcgY29uc3RydWN0cworLy8KKy8vIFRoZXNlIGFyZSBuZXcgd2l0aCBnY2MgNC40CisvLworCisjZGVmaW5lIExPT1BfU1RBUlRfVUxMKGZ1bmMsc2NoZWR1bGUpIFwKKyAgICBpbnQgZnVuYyAoaW50IHVwLCB1bnNpZ25lZCBsb25nIGxvbmcgbGIsIHVuc2lnbmVkIGxvbmcgbG9uZyB1YiwgICAgICAgICAgXAorICAgICAgdW5zaWduZWQgbG9uZyBsb25nIHN0ciwgdW5zaWduZWQgbG9uZyBsb25nIGNodW5rX3N6LCAgICAgICAgICAgICAgICAgICBcCisgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgKnBfbGIsIHVuc2lnbmVkIGxvbmcgbG9uZyAqcF91YikgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgc3RhdHVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGxvbmcgbG9uZyBzdHIyID0gdXAgPyAoKGxvbmcgbG9uZylzdHIpIDogLSgobG9uZyBsb25nKXN0cik7ICAgICAgICAgIFwKKyAgICAgICAgbG9uZyBsb25nIHN0cmlkZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1LTE9DKGxvYywgI2Z1bmMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLQV9UUkFDRSgyMCwgKCAjZnVuYyAiOiBUIyVkLCB1cCAlZCwgbGIgMHglbGx4LCB1YiAweCVsbHgsIHN0ciAweCVsbHgsIGNodW5rX3N6IDB4JWxseFxuIiwgXAorICAgICAgICAgIGd0aWQsIHVwLCBsYiwgdWIsIHN0ciwgY2h1bmtfc3ogKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKChzdHIgPiAwKSA/IChsYiA8IHViKSA6IChsYiA+IHViKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgS01QX0RJU1BBVENIX0lOSVRfVUxMKCZsb2MsIGd0aWQsIChzY2hlZHVsZSksIGxiLCAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIChzdHIyID4gMCkgPyAodWIgLSAxKSA6ICh1YiArIDEpLCBzdHIyLCBjaHVua19zeiwgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgKHNjaGVkdWxlKSAhPSBrbXBfc2NoX3N0YXRpYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgc3RhdHVzID0gS01QX0RJU1BBVENIX05FWFRfVUxMKCZsb2MsIGd0aWQsIE5VTEwsICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIChrbXBfdWludDY0ICopcF9sYiwgKGttcF91aW50NjQgKilwX3ViLCAoa21wX2ludDY0ICopJnN0cmlkZSk7IFwKKyAgICAgICAgICAgIGlmIChzdGF0dXMpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoc3RyaWRlID09IHN0cjIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKnBfdWIgKz0gKHN0ciA+IDApID8gMSA6IC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHN0YXR1cyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS0FfVFJBQ0UoMjAsICggI2Z1bmMgIiBleGl0OiBUIyVkLCAqcF9sYiAweCVsbHgsICpwX3ViIDB4JWxseCwgcmV0dXJuaW5nICVkXG4iLCBcCisgICAgICAgICAgZ3RpZCwgKnBfbGIsICpwX3ViLCBzdGF0dXMpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIHN0YXR1czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworCisjZGVmaW5lIExPT1BfUlVOVElNRV9TVEFSVF9VTEwoZnVuYyxzY2hlZHVsZSkgXAorICAgIGludCBmdW5jIChpbnQgdXAsIHVuc2lnbmVkIGxvbmcgbG9uZyBsYiwgdW5zaWduZWQgbG9uZyBsb25nIHViLCAgICAgICAgICBcCisgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgc3RyLCB1bnNpZ25lZCBsb25nIGxvbmcgKnBfbGIsICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyAqcF91YikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBzdGF0dXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbG9uZyBsb25nIHN0cjIgPSB1cCA/ICgobG9uZyBsb25nKXN0cikgOiAtKChsb25nIGxvbmcpc3RyKTsgICAgICAgICAgXAorICAgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgc3RyaWRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBjaHVua19zeiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBNS0xPQyhsb2MsICNmdW5jKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS0FfVFJBQ0UoMjAsICggI2Z1bmMgIjogVCMlZCwgdXAgJWQsIGxiIDB4JWxseCwgdWIgMHglbGx4LCBzdHIgMHglbGx4LCBjaHVua19zeiAweCVsbHhcbiIsIFwKKyAgICAgICAgICBndGlkLCB1cCwgbGIsIHViLCBzdHIsIGNodW5rX3N6ICkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICgoc3RyID4gMCkgPyAobGIgPCB1YikgOiAobGIgPiB1YikpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEtNUF9ESVNQQVRDSF9JTklUX1VMTCgmbG9jLCBndGlkLCAoc2NoZWR1bGUpLCBsYiwgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAoc3RyMiA+IDApID8gKHViIC0gMSkgOiAodWIgKyAxKSwgc3RyMiwgY2h1bmtfc3osIFRSVUUpOyAgICAgICBcCisgICAgICAgICAgICBzdGF0dXMgPSBLTVBfRElTUEFUQ0hfTkVYVF9VTEwoJmxvYywgZ3RpZCwgTlVMTCwgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgKGttcF91aW50NjQgKilwX2xiLCAoa21wX3VpbnQ2NCAqKXBfdWIsIChrbXBfaW50NjQgKikmc3RyaWRlKTsgXAorICAgICAgICAgICAgaWYgKHN0YXR1cykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCgobG9uZyBsb25nKXN0cmlkZSA9PSBzdHIyKTsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAqcF91YiArPSAoc3RyID4gMCkgPyAxIDogLTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgc3RhdHVzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLQV9UUkFDRSgyMCwgKCAjZnVuYyAiIGV4aXQ6IFQjJWQsICpwX2xiIDB4JWxseCwgKnBfdWIgMHglbGx4LCByZXR1cm5pbmcgJWRcbiIsIFwKKyAgICAgICAgICBndGlkLCAqcF9sYiwgKnBfdWIsIHN0YXR1cykpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm4gc3RhdHVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisKKyNkZWZpbmUgTE9PUF9ORVhUX1VMTChmdW5jLGZpbmlfY29kZSkgXAorICAgIGludCBmdW5jKHVuc2lnbmVkIGxvbmcgbG9uZyAqcF9sYiwgdW5zaWduZWQgbG9uZyBsb25nICpwX3ViKSAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IHN0YXR1czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBsb25nIGxvbmcgc3RyaWRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBndGlkID0gX19rbXBfZ2V0X2d0aWQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTUtMT0MobG9jLCAjZnVuYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLQV9UUkFDRSgyMCwgKCAjZnVuYyAiOiBUIyVkXG4iLCBndGlkKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZmluaV9jb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzdGF0dXMgPSBLTVBfRElTUEFUQ0hfTkVYVF9VTEwoJmxvYywgZ3RpZCwgTlVMTCwgKGttcF91aW50NjQgKilwX2xiLCBcCisgICAgICAgICAgKGttcF91aW50NjQgKilwX3ViLCAoa21wX2ludDY0ICopJnN0cmlkZSk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKHN0YXR1cykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKnBfdWIgKz0gKHN0cmlkZSA+IDApID8gMSA6IC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLQV9UUkFDRSgyMCwgKCAjZnVuYyAiIGV4aXQ6IFQjJWQsICpwX2xiIDB4JWxseCwgKnBfdWIgMHglbGx4LCBzdHJpZGUgMHglbGx4LCAiIFwKKyAgICAgICAgICAicmV0dXJuaW5nICVkXG4iLCBndGlkLCAqcF9sYiwgKnBfdWIsIHN0cmlkZSwgc3RhdHVzKSk7ICAgICAgICAgICAgXAorICAgICAgICByZXR1cm4gc3RhdHVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisKK0xPT1BfU1RBUlRfVUxMKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfU1RBVElDX1NUQVJUKSwga21wX3NjaF9zdGF0aWMpCitMT09QX05FWFRfVUxMKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfU1RBVElDX05FWFQpLCB7fSkKK0xPT1BfU1RBUlRfVUxMKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfRFlOQU1JQ19TVEFSVCksIGttcF9zY2hfZHluYW1pY19jaHVua2VkKQorTE9PUF9ORVhUX1VMTCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX0RZTkFNSUNfTkVYVCksIHt9KQorTE9PUF9TVEFSVF9VTEwoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9HVUlERURfU1RBUlQpLCBrbXBfc2NoX2d1aWRlZF9jaHVua2VkKQorTE9PUF9ORVhUX1VMTCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX0dVSURFRF9ORVhUKSwge30pCitMT09QX1JVTlRJTUVfU1RBUlRfVUxMKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfUlVOVElNRV9TVEFSVCksIGttcF9zY2hfcnVudGltZSkKK0xPT1BfTkVYVF9VTEwoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9SVU5USU1FX05FWFQpLCB7fSkKKworTE9PUF9TVEFSVF9VTEwoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX1NUQVRJQ19TVEFSVCksIGttcF9vcmRfc3RhdGljKQorTE9PUF9ORVhUX1VMTCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfU1RBVElDX05FWFQpLCBcCisgICAgeyBLTVBfRElTUEFUQ0hfRklOSV9DSFVOS19VTEwoJmxvYywgZ3RpZCk7IH0pCitMT09QX1NUQVJUX1VMTCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfRFlOQU1JQ19TVEFSVCksIGttcF9vcmRfZHluYW1pY19jaHVua2VkKQorTE9PUF9ORVhUX1VMTCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfRFlOQU1JQ19ORVhUKSwgXAorICAgIHsgS01QX0RJU1BBVENIX0ZJTklfQ0hVTktfVUxMKCZsb2MsIGd0aWQpOyB9KQorTE9PUF9TVEFSVF9VTEwoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX0dVSURFRF9TVEFSVCksIGttcF9vcmRfZ3VpZGVkX2NodW5rZWQpCitMT09QX05FWFRfVUxMKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfT1JERVJFRF9HVUlERURfTkVYVCksIFwKKyAgICB7IEtNUF9ESVNQQVRDSF9GSU5JX0NIVU5LX1VMTCgmbG9jLCBndGlkKTsgfSkKK0xPT1BfUlVOVElNRV9TVEFSVF9VTEwoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX1JVTlRJTUVfU1RBUlQpLCBrbXBfb3JkX3J1bnRpbWUpCitMT09QX05FWFRfVUxMKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfT1JERVJFRF9SVU5USU1FX05FWFQpLCBcCisgICAgeyBLTVBfRElTUEFUQ0hfRklOSV9DSFVOS19VTEwoJmxvYywgZ3RpZCk7IH0pCisKKworLy8KKy8vIENvbWJpbmVkIHBhcmFsbGVsIC8gbG9vcCB3b3Jrc2hhcmluZyBjb25zdHJ1Y3RzCisvLworLy8gVGhlcmUgYXJlIG5vIHVsbCB2ZXJzaW9ucyAoeWV0KS4KKy8vCisKKyNkZWZpbmUgUEFSQUxMRUxfTE9PUF9TVEFSVChmdW5jLCBzY2hlZHVsZSkgXAorICAgIHZvaWQgZnVuYyAodm9pZCAoKnRhc2spICh2b2lkICopLCB2b2lkICpkYXRhLCB1bnNpZ25lZCBudW1fdGhyZWFkcywgICAgICBcCisgICAgICBsb25nIGxiLCBsb25nIHViLCBsb25nIHN0ciwgbG9uZyBjaHVua19zeikgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBsYXN0ID0gRkFMU0U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTUtMT0MobG9jLCAjZnVuYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLQV9UUkFDRSgyMCwgKCAjZnVuYyAiOiBUIyVkLCBsYiAweCVseCwgdWIgMHglbHgsIHN0ciAweCVseCwgY2h1bmtfc3ogMHglbHhcbiIsICAgICAgICBcCisgICAgICAgICAgZ3RpZCwgbGIsIHViLCBzdHIsIGNodW5rX3N6ICkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoX19rbXBjX29rX3RvX2ZvcmsoJmxvYykgJiYgKG51bV90aHJlYWRzICE9IDEpKSB7ICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAobnVtX3RocmVhZHMgIT0gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBfX2ttcF9wdXNoX251bV90aHJlYWRzKCZsb2MsIGd0aWQsIG51bV90aHJlYWRzKTsgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBfX2ttcF9HT01QX2ZvcmtfY2FsbCgmbG9jLCBndGlkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgKG1pY3JvdGFza190KV9fa21wX0dPTVBfcGFyYWxsZWxfbWljcm90YXNrX3dyYXBwZXIsIDksICAgICAgICAgXAorICAgICAgICAgICAgICB0YXNrLCBkYXRhLCBudW1fdGhyZWFkcywgJmxvYywgKHNjaGVkdWxlKSwgbGIsICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIChzdHIgPiAwKSA/ICh1YiAtIDEpIDogKHViICsgMSksIHN0ciwgY2h1bmtfc3opOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBfX2ttcGNfc2VyaWFsaXplZF9wYXJhbGxlbCgmbG9jLCBndGlkKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9ESVNQQVRDSF9JTklUKCZsb2MsIGd0aWQsIChzY2hlZHVsZSksIGxiLCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoc3RyID4gMCkgPyAodWIgLSAxKSA6ICh1YiArIDEpLCBzdHIsIGNodW5rX3N6LCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChzY2hlZHVsZSkgIT0ga21wX3NjaF9zdGF0aWMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS0FfVFJBQ0UoMjAsICggI2Z1bmMgIiBleGl0OiBUIyVkXG4iLCBndGlkKSk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworCitQQVJBTExFTF9MT09QX1NUQVJUKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfTE9PUF9TVEFUSUNfU1RBUlQpLCBrbXBfc2NoX3N0YXRpYykKK1BBUkFMTEVMX0xPT1BfU1RBUlQoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX0RZTkFNSUNfU1RBUlQpLCBrbXBfc2NoX2R5bmFtaWNfY2h1bmtlZCkKK1BBUkFMTEVMX0xPT1BfU1RBUlQoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX0dVSURFRF9TVEFSVCksIGttcF9zY2hfZ3VpZGVkX2NodW5rZWQpCitQQVJBTExFTF9MT09QX1NUQVJUKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfTE9PUF9SVU5USU1FX1NUQVJUKSwga21wX3NjaF9ydW50aW1lKQorCisKKy8vCisvLyBUYXNraW5nIGNvbnN0cnVjdHMKKy8vCisKK3ZvaWQKK3hleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfVEFTSykodm9pZCAoKmZ1bmMpKHZvaWQgKiksIHZvaWQgKmRhdGEsIHZvaWQgKCpjb3B5X2Z1bmMpKHZvaWQgKiwgdm9pZCAqKSwKKyAgbG9uZyBhcmdfc2l6ZSwgbG9uZyBhcmdfYWxpZ24sIGludCBpZl9jb25kLCB1bnNpZ25lZCBnb21wX2ZsYWdzKQoreworICAgIE1LTE9DKGxvYywgIkdPTVBfdGFzayIpOworICAgIGludCBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOworICAgIGttcF9pbnQzMiBmbGFncyA9IDA7CisgICAga21wX3Rhc2tpbmdfZmxhZ3NfdCAqaW5wdXRfZmxhZ3MgPSAoa21wX3Rhc2tpbmdfZmxhZ3NfdCAqKSAmIGZsYWdzOworCisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF90YXNrOiBUIyVkXG4iLCBndGlkKSk7CisKKyAgICAvLyBUaGUgbG93LW9yZGVyIGJpdCBpcyB0aGUgInRpZWQiIGZsYWcKKyAgICBpZiAoZ29tcF9mbGFncyAmIDEpIHsKKyAgICAgICAgaW5wdXRfZmxhZ3MtPnRpZWRuZXNzID0gMTsKKyAgICB9CisgICAgaW5wdXRfZmxhZ3MtPm5hdGl2ZSA9IDE7CisgICAgLy8gX19rbXBfdGFza19hbGxvYygpIHNldHMgdXAgYWxsIG90aGVyIGZsYWdzCisKKyAgICBpZiAoISBpZl9jb25kKSB7CisgICAgICAgIGFyZ19zaXplID0gMDsKKyAgICB9CisKKyAgICBrbXBfdGFza190ICp0YXNrID0gX19rbXBfdGFza19hbGxvYygmbG9jLCBndGlkLCBpbnB1dF9mbGFncywKKyAgICAgIHNpemVvZihrbXBfdGFza190KSwgYXJnX3NpemUgPyBhcmdfc2l6ZSArIGFyZ19hbGlnbiAtIDEgOiAwLAorICAgICAgKGttcF9yb3V0aW5lX2VudHJ5X3QpZnVuYyk7CisKKyAgICBpZiAoYXJnX3NpemUgPiAwKSB7CisgICAgICAgIGlmIChhcmdfYWxpZ24gPiAwKSB7CisgICAgICAgICAgICB0YXNrLT5zaGFyZWRzID0gKHZvaWQgKikoKCgoc2l6ZV90KXRhc2stPnNoYXJlZHMpCisgICAgICAgICAgICAgICsgYXJnX2FsaWduIC0gMSkgLyBhcmdfYWxpZ24gKiBhcmdfYWxpZ24pOworICAgICAgICB9CisgICAgICAgIC8vZWxzZSBlcnJvcj8/CisKKyAgICAgICAgaWYgKGNvcHlfZnVuYykgeworICAgICAgICAgICAgKCpjb3B5X2Z1bmMpKHRhc2stPnNoYXJlZHMsIGRhdGEpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgbWVtY3B5KHRhc2stPnNoYXJlZHMsIGRhdGEsIGFyZ19zaXplKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChpZl9jb25kKSB7CisgICAgICAgIF9fa21wY19vbXBfdGFzaygmbG9jLCBndGlkLCB0YXNrKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIF9fa21wY19vbXBfdGFza19iZWdpbl9pZjAoJmxvYywgZ3RpZCwgdGFzayk7CisgICAgICAgIGZ1bmMoZGF0YSk7CisgICAgICAgIF9fa21wY19vbXBfdGFza19jb21wbGV0ZV9pZjAoJmxvYywgZ3RpZCwgdGFzayk7CisgICAgfQorCisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF90YXNrIGV4aXQ6IFQjJWRcbiIsIGd0aWQpKTsKK30KKworCit2b2lkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX1RBU0tXQUlUKSh2b2lkKQoreworICAgIE1LTE9DKGxvYywgIkdPTVBfdGFza3dhaXQiKTsKKyAgICBpbnQgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfdGFza3dhaXQ6IFQjJWRcbiIsIGd0aWQpKTsKKworICAgIF9fa21wY19vbXBfdGFza3dhaXQoJmxvYywgZ3RpZCk7CisKKyAgICBLQV9UUkFDRSgyMCwgKCJHT01QX3Rhc2t3YWl0IGV4aXQ6IFQjJWRcbiIsIGd0aWQpKTsKK30KKworCisvLworLy8gU2VjdGlvbnMgd29ya3NoYXJpbmcgY29uc3RydWN0cworLy8KKworLy8KKy8vIEZvciB0aGUgc2VjdGlvbnMgY29uc3RydWN0LCB3ZSBpbml0aWFsaXplIGEgZHluYW1pY2FsbHkgc2NoZWR1bGVkIGxvb3AKKy8vIHdvcmtzaGFyaW5nIGNvbnN0cnVjdCB3aXRoIGxiIDEgYW5kIHN0cmlkZSAxLCBhbmQgdXNlIHRoZSBpdGVyYXRpb24gIydzCisvLyB0aGF0IGl0cyByZXR1cm5zIGFzIHNlY3Rpb25zIGlkcy4KKy8vCisvLyBUaGVyZSBhcmUgbm8gc3BlY2lhbCBlbnRyeSBwb2ludHMgZm9yIG9yZGVyZWQgc2VjdGlvbnMsIHNvIHdlIGFsd2F5cyB1c2UKKy8vIHRoZSBkeW5hbWljYWxseSBzY2hlZHVsZWQgd29ya3NoYXJlLCBldmVuIGlmIHRoZSBzZWN0aW9ucyBhcmVuJ3Qgb3JkZXJlZC4KKy8vCisKK3Vuc2lnbmVkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX1NFQ1RJT05TX1NUQVJUKSh1bnNpZ25lZCBjb3VudCkKK3sKKyAgICBpbnQgc3RhdHVzOworICAgIGttcF9pbnQgbGIsIHViLCBzdHJpZGU7CisgICAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgICAgTUtMT0MobG9jLCAiR09NUF9zZWN0aW9uc19zdGFydCIpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfc2VjdGlvbnNfc3RhcnQ6IFQjJWRcbiIsIGd0aWQpKTsKKworICAgIEtNUF9ESVNQQVRDSF9JTklUKCZsb2MsIGd0aWQsIGttcF9ubV9keW5hbWljX2NodW5rZWQsIDEsIGNvdW50LCAxLCAxLCBUUlVFKTsKKworICAgIHN0YXR1cyA9IEtNUF9ESVNQQVRDSF9ORVhUKCZsb2MsIGd0aWQsIE5VTEwsICZsYiwgJnViLCAmc3RyaWRlKTsKKyAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoc3RyaWRlID09IDEpOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGxiID4gMCk7CisgICAgICAgIEtNUF9BU1NFUlQobGIgPT0gdWIpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgbGIgPSAwOworICAgIH0KKworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfc2VjdGlvbnNfc3RhcnQgZXhpdDogVCMlZCByZXR1cm5pbmcgJXVcbiIsIGd0aWQsCisgICAgICAodW5zaWduZWQpbGIpKTsKKyAgICByZXR1cm4gKHVuc2lnbmVkKWxiOworfQorCisKK3Vuc2lnbmVkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX1NFQ1RJT05TX05FWFQpKHZvaWQpCit7CisgICAgaW50IHN0YXR1czsKKyAgICBrbXBfaW50IGxiLCB1Yiwgc3RyaWRlOworICAgIGludCBndGlkID0gX19rbXBfZ2V0X2d0aWQoKTsKKyAgICBNS0xPQyhsb2MsICJHT01QX3NlY3Rpb25zX25leHQiKTsKKyAgICBLQV9UUkFDRSgyMCwgKCJHT01QX3NlY3Rpb25zX25leHQ6IFQjJWRcbiIsIGd0aWQpKTsKKworICAgIHN0YXR1cyA9IEtNUF9ESVNQQVRDSF9ORVhUKCZsb2MsIGd0aWQsIE5VTEwsICZsYiwgJnViLCAmc3RyaWRlKTsKKyAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoc3RyaWRlID09IDEpOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGxiID4gMCk7CisgICAgICAgIEtNUF9BU1NFUlQobGIgPT0gdWIpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgbGIgPSAwOworICAgIH0KKworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfc2VjdGlvbnNfbmV4dCBleGl0OiBUIyVkIHJldHVybmluZyAldVxuIiwgZ3RpZCwKKyAgICAgICh1bnNpZ25lZClsYikpOworICAgIHJldHVybiAodW5zaWduZWQpbGI7Cit9CisKKwordm9pZAoreGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9TRUNUSU9OU19TVEFSVCkodm9pZCAoKnRhc2spICh2b2lkICopLCB2b2lkICpkYXRhLAorICB1bnNpZ25lZCBudW1fdGhyZWFkcywgdW5zaWduZWQgY291bnQpCit7CisgICAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgICAgaW50IGxhc3QgPSBGQUxTRTsKKyAgICBNS0xPQyhsb2MsICJHT01QX3BhcmFsbGVsX3NlY3Rpb25zX3N0YXJ0Iik7CisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF9wYXJhbGxlbF9zZWN0aW9uc19zdGFydDogVCMlZFxuIiwgZ3RpZCkpOworCisgICAgaWYgKF9fa21wY19va190b19mb3JrKCZsb2MpICYmIChudW1fdGhyZWFkcyAhPSAxKSkgeworICAgICAgICBpZiAobnVtX3RocmVhZHMgIT0gMCkgeworICAgICAgICAgICAgX19rbXBfcHVzaF9udW1fdGhyZWFkcygmbG9jLCBndGlkLCBudW1fdGhyZWFkcyk7CisgICAgICAgIH0KKyAgICAgICAgX19rbXBfR09NUF9mb3JrX2NhbGwoJmxvYywgZ3RpZCwKKyAgICAgICAgICAobWljcm90YXNrX3QpX19rbXBfR09NUF9wYXJhbGxlbF9taWNyb3Rhc2tfd3JhcHBlciwgOSwgdGFzaywgZGF0YSwKKyAgICAgICAgICBudW1fdGhyZWFkcywgJmxvYywga21wX25tX2R5bmFtaWNfY2h1bmtlZCwgKGttcF9pbnQpMSwKKyAgICAgICAgICAoa21wX2ludCljb3VudCwgKGttcF9pbnQpMSwgKGttcF9pbnQpMSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBfX2ttcGNfc2VyaWFsaXplZF9wYXJhbGxlbCgmbG9jLCBndGlkKTsKKyAgICB9CisKKyAgICBLTVBfRElTUEFUQ0hfSU5JVCgmbG9jLCBndGlkLCBrbXBfbm1fZHluYW1pY19jaHVua2VkLCAxLCBjb3VudCwgMSwgMSwgVFJVRSk7CisKKyAgICBLQV9UUkFDRSgyMCwgKCJHT01QX3BhcmFsbGVsX3NlY3Rpb25zX3N0YXJ0IGV4aXQ6IFQjJWRcbiIsIGd0aWQpKTsKK30KKworCit2b2lkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX1NFQ1RJT05TX0VORCkodm9pZCkKK3sKKyAgICBpbnQgZ3RpZCA9IF9fa21wX2dldF9ndGlkKCk7CisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF9zZWN0aW9uc19lbmQ6IFQjJWRcbiIsIGd0aWQpKQorCisgICAgX19rbXBfYmFycmllcihic19wbGFpbl9iYXJyaWVyLCBndGlkLCBGQUxTRSwgMCwgTlVMTCwgTlVMTCk7CisKKyAgICBLQV9UUkFDRSgyMCwgKCJHT01QX3NlY3Rpb25zX2VuZCBleGl0OiBUIyVkXG4iLCBndGlkKSkKK30KKworCit2b2lkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX1NFQ1RJT05TX0VORF9OT1dBSVQpKHZvaWQpCit7CisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF9zZWN0aW9uc19lbmRfbm93YWl0OiBUIyVkXG4iLCBfX2ttcF9nZXRfZ3RpZCgpKSkKK30KKworLy8gbGliZ29tcCBoYXMgYW4gZW1wdHkgZnVuY3Rpb24gZm9yIEdPTVBfdGFza3lpZWxkIGFzIG9mIDIwMTMtMTAtMTAKK3ZvaWQKK3hleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfVEFTS1lJRUxEKSh2b2lkKQoreworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfdGFza3lpZWxkOiBUIyVkXG4iLCBfX2ttcF9nZXRfZ3RpZCgpKSkKKyAgICByZXR1cm47Cit9CisKKyNpZiBPTVBfNDBfRU5BQkxFRCAvLyB0aGVzZSBhcmUgbmV3IEdPTVBfNC4wIGVudHJ5IHBvaW50cworCit2b2lkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMKSh2b2lkICgqdGFzaykodm9pZCAqKSwgdm9pZCAqZGF0YSwgdW5zaWduZWQgbnVtX3RocmVhZHMsIHVuc2lnbmVkIGludCBmbGFncykKK3sKKyAgICBpbnQgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKyAgICBNS0xPQyhsb2MsICJHT01QX3BhcmFsbGVsIik7CisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF9wYXJhbGxlbDogVCMlZFxuIiwgZ3RpZCkpOworCisgICAgaWYgKF9fa21wY19va190b19mb3JrKCZsb2MpICYmIChudW1fdGhyZWFkcyAhPSAxKSkgeworICAgICAgICBpZiAobnVtX3RocmVhZHMgIT0gMCkgeworICAgICAgICAgICAgX19rbXBfcHVzaF9udW1fdGhyZWFkcygmbG9jLCBndGlkLCBudW1fdGhyZWFkcyk7CisgICAgICAgIH0KKyAgICAgICAgaWYoZmxhZ3MgIT0gMCkgeworICAgICAgICAgICAgX19rbXBfcHVzaF9wcm9jX2JpbmQoJmxvYywgZ3RpZCwgKGttcF9wcm9jX2JpbmRfdClmbGFncyk7CisgICAgICAgIH0KKyAgICAgICAgX19rbXBfR09NUF9mb3JrX2NhbGwoJmxvYywgZ3RpZCwKKyAgICAgICAgICAobWljcm90YXNrX3QpX19rbXBfR09NUF9taWNyb3Rhc2tfd3JhcHBlciwgMiwgdGFzaywgZGF0YSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBfX2ttcGNfc2VyaWFsaXplZF9wYXJhbGxlbCgmbG9jLCBndGlkKTsKKyAgICB9CisgICAgdGFzayhkYXRhKTsKKyAgICB4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0VORCkoKTsKK30KKwordm9pZAoreGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9TRUNUSU9OUykodm9pZCAoKnRhc2spICh2b2lkICopLCB2b2lkICpkYXRhLAorICB1bnNpZ25lZCBudW1fdGhyZWFkcywgdW5zaWduZWQgY291bnQsIHVuc2lnbmVkIGZsYWdzKQoreworICAgIGludCBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOworICAgIGludCBsYXN0ID0gRkFMU0U7CisgICAgTUtMT0MobG9jLCAiR09NUF9wYXJhbGxlbF9zZWN0aW9ucyIpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfcGFyYWxsZWxfc2VjdGlvbnM6IFQjJWRcbiIsIGd0aWQpKTsKKworICAgIGlmIChfX2ttcGNfb2tfdG9fZm9yaygmbG9jKSAmJiAobnVtX3RocmVhZHMgIT0gMSkpIHsKKyAgICAgICAgaWYgKG51bV90aHJlYWRzICE9IDApIHsKKyAgICAgICAgICAgIF9fa21wX3B1c2hfbnVtX3RocmVhZHMoJmxvYywgZ3RpZCwgbnVtX3RocmVhZHMpOworICAgICAgICB9CisgICAgICAgIGlmKGZsYWdzICE9IDApIHsKKyAgICAgICAgICAgIF9fa21wX3B1c2hfcHJvY19iaW5kKCZsb2MsIGd0aWQsIChrbXBfcHJvY19iaW5kX3QpZmxhZ3MpOworICAgICAgICB9CisgICAgICAgIF9fa21wX0dPTVBfZm9ya19jYWxsKCZsb2MsIGd0aWQsCisgICAgICAgICAgKG1pY3JvdGFza190KV9fa21wX0dPTVBfcGFyYWxsZWxfbWljcm90YXNrX3dyYXBwZXIsIDksIHRhc2ssIGRhdGEsCisgICAgICAgICAgbnVtX3RocmVhZHMsICZsb2MsIGttcF9ubV9keW5hbWljX2NodW5rZWQsIChrbXBfaW50KTEsCisgICAgICAgICAgKGttcF9pbnQpY291bnQsIChrbXBfaW50KTEsIChrbXBfaW50KTEpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgX19rbXBjX3NlcmlhbGl6ZWRfcGFyYWxsZWwoJmxvYywgZ3RpZCk7CisgICAgfQorCisgICAgS01QX0RJU1BBVENIX0lOSVQoJmxvYywgZ3RpZCwga21wX25tX2R5bmFtaWNfY2h1bmtlZCwgMSwgY291bnQsIDEsIDEsIFRSVUUpOworCisgICAgdGFzayhkYXRhKTsKKyAgICB4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0VORCkoKTsKKyAgICBLQV9UUkFDRSgyMCwgKCJHT01QX3BhcmFsbGVsX3NlY3Rpb25zIGV4aXQ6IFQjJWRcbiIsIGd0aWQpKTsKK30KKworI2RlZmluZSBQQVJBTExFTF9MT09QKGZ1bmMsIHNjaGVkdWxlKSBcCisgICAgdm9pZCBmdW5jICh2b2lkICgqdGFzaykgKHZvaWQgKiksIHZvaWQgKmRhdGEsIHVuc2lnbmVkIG51bV90aHJlYWRzLCAgICAgIFwKKyAgICAgIGxvbmcgbGIsIGxvbmcgdWIsIGxvbmcgc3RyLCBsb25nIGNodW5rX3N6LCB1bnNpZ25lZCBmbGFncykgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IGxhc3QgPSBGQUxTRTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBNS0xPQyhsb2MsICNmdW5jKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtBX1RSQUNFKDIwLCAoICNmdW5jICI6IFQjJWQsIGxiIDB4JWx4LCB1YiAweCVseCwgc3RyIDB4JWx4LCBjaHVua19zeiAweCVseFxuIiwgICAgICAgIFwKKyAgICAgICAgICBndGlkLCBsYiwgdWIsIHN0ciwgY2h1bmtfc3ogKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChfX2ttcGNfb2tfdG9fZm9yaygmbG9jKSAmJiAobnVtX3RocmVhZHMgIT0gMSkpIHsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmIChudW1fdGhyZWFkcyAhPSAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIF9fa21wX3B1c2hfbnVtX3RocmVhZHMoJmxvYywgZ3RpZCwgbnVtX3RocmVhZHMpOyAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmIChmbGFncyAhPSAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIF9fa21wX3B1c2hfcHJvY19iaW5kKCZsb2MsIGd0aWQsIChrbXBfcHJvY19iaW5kX3QpZmxhZ3MpOyAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIF9fa21wX0dPTVBfZm9ya19jYWxsKCZsb2MsIGd0aWQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAobWljcm90YXNrX3QpX19rbXBfR09NUF9wYXJhbGxlbF9taWNyb3Rhc2tfd3JhcHBlciwgOSwgICAgICAgICBcCisgICAgICAgICAgICAgIHRhc2ssIGRhdGEsIG51bV90aHJlYWRzLCAmbG9jLCAoc2NoZWR1bGUpLCBsYiwgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgKHN0ciA+IDApID8gKHViIC0gMSkgOiAodWIgKyAxKSwgc3RyLCBjaHVua19zeik7ICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIF9fa21wY19zZXJpYWxpemVkX3BhcmFsbGVsKCZsb2MsIGd0aWQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0RJU1BBVENIX0lOSVQoJmxvYywgZ3RpZCwgKHNjaGVkdWxlKSwgbGIsICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChzdHIgPiAwKSA/ICh1YiAtIDEpIDogKHViICsgMSksIHN0ciwgY2h1bmtfc3osICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKHNjaGVkdWxlKSAhPSBrbXBfc2NoX3N0YXRpYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdGFzayhkYXRhKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0VORCkoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS0FfVFJBQ0UoMjAsICggI2Z1bmMgIiBleGl0OiBUIyVkXG4iLCBndGlkKSk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworUEFSQUxMRUxfTE9PUCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0xPT1BfU1RBVElDKSwga21wX3NjaF9zdGF0aWMpCitQQVJBTExFTF9MT09QKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfTE9PUF9EWU5BTUlDKSwga21wX3NjaF9keW5hbWljX2NodW5rZWQpCitQQVJBTExFTF9MT09QKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfTE9PUF9HVUlERUQpLCBrbXBfc2NoX2d1aWRlZF9jaHVua2VkKQorUEFSQUxMRUxfTE9PUCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0xPT1BfUlVOVElNRSksIGttcF9zY2hfcnVudGltZSkKKworCit2b2lkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX1RBU0tHUk9VUF9TVEFSVCkodm9pZCkKK3sKKyAgICBpbnQgZ3RpZCA9IF9fa21wX2dldF9ndGlkKCk7CisgICAgTUtMT0MobG9jLCAiR09NUF90YXNrZ3JvdXBfc3RhcnQiKTsKKyAgICBLQV9UUkFDRSgyMCwgKCJHT01QX3Rhc2tncm91cF9zdGFydDogVCMlZFxuIiwgZ3RpZCkpOworCisgICAgX19rbXBjX3Rhc2tncm91cCgmbG9jLCBndGlkKTsKKworICAgIHJldHVybjsKK30KKwordm9pZAoreGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9UQVNLR1JPVVBfRU5EKSh2b2lkKQoreworICAgIGludCBndGlkID0gX19rbXBfZ2V0X2d0aWQoKTsKKyAgICBNS0xPQyhsb2MsICJHT01QX3Rhc2tncm91cF9lbmQiKTsKKyAgICBLQV9UUkFDRSgyMCwgKCJHT01QX3Rhc2tncm91cF9lbmQ6IFQjJWRcbiIsIGd0aWQpKTsKKworICAgIF9fa21wY19lbmRfdGFza2dyb3VwKCZsb2MsIGd0aWQpOworCisgICAgcmV0dXJuOworfQorCisjaWZuZGVmIEtNUF9ERUJVRworc3RhdGljCisjZW5kaWYgLyogS01QX0RFQlVHICovCitrbXBfaW50MzIgX19rbXBfZ29tcF90b19pb21wX2NhbmNlbGxhdGlvbl9raW5kKGludCBnb21wX2tpbmQpIHsKKyAgICBrbXBfaW50MzIgY25jbF9raW5kID0gMDsKKyAgICBzd2l0Y2goZ29tcF9raW5kKSB7CisgICAgICBjYXNlIDE6CisgICAgICAgIGNuY2xfa2luZCA9IGNhbmNlbF9wYXJhbGxlbDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDI6CisgICAgICAgIGNuY2xfa2luZCA9IGNhbmNlbF9sb29wOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNDoKKyAgICAgICAgY25jbF9raW5kID0gY2FuY2VsX3NlY3Rpb25zOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgODoKKyAgICAgICAgY25jbF9raW5kID0gY2FuY2VsX3Rhc2tncm91cDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBjbmNsX2tpbmQ7Cit9CisKK2Jvb2wKK3hleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfQ0FOQ0VMTEFUSU9OX1BPSU5UKShpbnQgd2hpY2gpCit7CisgICAgaWYoX19rbXBfb21wX2NhbmNlbGxhdGlvbikgeworICAgICAgICBLTVBfRkFUQUwoTm9Hb21wQ2FuY2VsbGF0aW9uKTsKKyAgICB9CisgICAgaW50IGd0aWQgPSBfX2ttcF9nZXRfZ3RpZCgpOworICAgIE1LTE9DKGxvYywgIkdPTVBfY2FuY2VsbGF0aW9uX3BvaW50Iik7CisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF9jYW5jZWxsYXRpb25fcG9pbnQ6IFQjJWRcbiIsIGd0aWQpKTsKKworICAgIGttcF9pbnQzMiBjbmNsX2tpbmQgPSBfX2ttcF9nb21wX3RvX2lvbXBfY2FuY2VsbGF0aW9uX2tpbmQod2hpY2gpOworCisgICAgcmV0dXJuIF9fa21wY19jYW5jZWxsYXRpb25wb2ludCgmbG9jLCBndGlkLCBjbmNsX2tpbmQpOworfQorCitib29sCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0JBUlJJRVJfQ0FOQ0VMKSh2b2lkKQoreworICAgIGlmKF9fa21wX29tcF9jYW5jZWxsYXRpb24pIHsKKyAgICAgICAgS01QX0ZBVEFMKE5vR29tcENhbmNlbGxhdGlvbik7CisgICAgfQorICAgIEtNUF9GQVRBTChOb0dvbXBDYW5jZWxsYXRpb24pOworICAgIGludCBndGlkID0gX19rbXBfZ2V0X2d0aWQoKTsKKyAgICBNS0xPQyhsb2MsICJHT01QX2JhcnJpZXJfY2FuY2VsIik7CisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF9iYXJyaWVyX2NhbmNlbDogVCMlZFxuIiwgZ3RpZCkpOworCisgICAgcmV0dXJuIF9fa21wY19jYW5jZWxfYmFycmllcigmbG9jLCBndGlkKTsKK30KKworYm9vbAoreGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9DQU5DRUwpKGludCB3aGljaCwgYm9vbCBkb19jYW5jZWwpCit7CisgICAgaWYoX19rbXBfb21wX2NhbmNlbGxhdGlvbikgeworICAgICAgICBLTVBfRkFUQUwoTm9Hb21wQ2FuY2VsbGF0aW9uKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgaW50IGd0aWQgPSBfX2ttcF9nZXRfZ3RpZCgpOworICAgIE1LTE9DKGxvYywgIkdPTVBfY2FuY2VsIik7CisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF9jYW5jZWw6IFQjJWRcbiIsIGd0aWQpKTsKKworICAgIGttcF9pbnQzMiBjbmNsX2tpbmQgPSBfX2ttcF9nb21wX3RvX2lvbXBfY2FuY2VsbGF0aW9uX2tpbmQod2hpY2gpOworCisgICAgaWYoZG9fY2FuY2VsID09IEZBTFNFKSB7CisgICAgICAgIHJldHVybiB4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0NBTkNFTExBVElPTl9QT0lOVCkod2hpY2gpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBfX2ttcGNfY2FuY2VsKCZsb2MsIGd0aWQsIGNuY2xfa2luZCk7CisgICAgfQorfQorCitib29sCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX1NFQ1RJT05TX0VORF9DQU5DRUwpKHZvaWQpCit7CisgICAgaWYoX19rbXBfb21wX2NhbmNlbGxhdGlvbikgeworICAgICAgICBLTVBfRkFUQUwoTm9Hb21wQ2FuY2VsbGF0aW9uKTsKKyAgICB9CisgICAgaW50IGd0aWQgPSBfX2ttcF9nZXRfZ3RpZCgpOworICAgIE1LTE9DKGxvYywgIkdPTVBfc2VjdGlvbnNfZW5kX2NhbmNlbCIpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfc2VjdGlvbnNfZW5kX2NhbmNlbDogVCMlZFxuIiwgZ3RpZCkpOworCisgICAgcmV0dXJuIF9fa21wY19jYW5jZWxfYmFycmllcigmbG9jLCBndGlkKTsKK30KKworYm9vbAoreGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX0VORF9DQU5DRUwpKHZvaWQpCit7CisgICAgaWYoX19rbXBfb21wX2NhbmNlbGxhdGlvbikgeworICAgICAgICBLTVBfRkFUQUwoTm9Hb21wQ2FuY2VsbGF0aW9uKTsKKyAgICB9CisgICAgaW50IGd0aWQgPSBfX2ttcF9nZXRfZ3RpZCgpOworICAgIE1LTE9DKGxvYywgIkdPTVBfbG9vcF9lbmRfY2FuY2VsIik7CisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF9sb29wX2VuZF9jYW5jZWw6IFQjJWRcbiIsIGd0aWQpKTsKKworICAgIHJldHVybiBfX2ttcGNfY2FuY2VsX2JhcnJpZXIoJmxvYywgZ3RpZCk7Cit9CisKKy8vIEFsbCB0YXJnZXQgZnVuY3Rpb25zIGFyZSBlbXB0eSBhcyBvZiAyMDE0LTA1LTI5Cit2b2lkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX1RBUkdFVCkoaW50IGRldmljZSwgdm9pZCAoKmZuKSAodm9pZCAqKSwgY29uc3Qgdm9pZCAqb3Blbm1wX3RhcmdldCwKKyAgICAgICAgICAgICBzaXplX3QgbWFwbnVtLCB2b2lkICoqaG9zdGFkZHJzLCBzaXplX3QgKnNpemVzLCB1bnNpZ25lZCBjaGFyICpraW5kcykKK3sKKyAgICByZXR1cm47Cit9CisKK3ZvaWQKK3hleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfVEFSR0VUX0RBVEEpKGludCBkZXZpY2UsIGNvbnN0IHZvaWQgKm9wZW5tcF90YXJnZXQsIHNpemVfdCBtYXBudW0sCisgICAgICAgICAgICAgICAgICB2b2lkICoqaG9zdGFkZHJzLCBzaXplX3QgKnNpemVzLCB1bnNpZ25lZCBjaGFyICpraW5kcykKK3sKKyAgICByZXR1cm47Cit9CisKK3ZvaWQKK3hleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfVEFSR0VUX0VORF9EQVRBKSh2b2lkKQoreworICAgIHJldHVybjsKK30KKwordm9pZAoreGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9UQVJHRVRfVVBEQVRFKShpbnQgZGV2aWNlLCBjb25zdCB2b2lkICpvcGVubXBfdGFyZ2V0LCBzaXplX3QgbWFwbnVtLAorICAgICAgICAgICAgICAgICAgICB2b2lkICoqaG9zdGFkZHJzLCBzaXplX3QgKnNpemVzLCB1bnNpZ25lZCBjaGFyICpraW5kcykKK3sKKyAgICByZXR1cm47Cit9CisKK3ZvaWQKK3hleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfVEVBTVMpKHVuc2lnbmVkIGludCBudW1fdGVhbXMsIHVuc2lnbmVkIGludCB0aHJlYWRfbGltaXQpCit7CisgICAgcmV0dXJuOworfQorI2VuZGlmIC8vIE9NUF80MF9FTkFCTEVECisKKworLyoKKyAgICBUaGUgZm9sbG93aW5nIHNlY3Rpb25zIG9mIGNvZGUgY3JlYXRlIGFsaWFzZXMgZm9yIHRoZSBHT01QXyogZnVuY3Rpb25zLAorICAgIHRoZW4gY3JlYXRlIHZlcnNpb25lZCBzeW1ib2xzIHVzaW5nIHRoZSBhc3NlbWJsZXIgZGlyZWN0aXZlIC5zeW12ZXIuCisgICAgVGhpcyBpcyBvbmx5IHBlcnRpbmVudCBmb3IgRUxGIC5zbyBsaWJyYXJ5CisgICAgeGFsaWFzaWZ5IGFuZCB4dmVyc2lvbmlmeSBhcmUgZGVmaW5lZCBpbiBrbXBfZnRuX29zLmgKKyovCisKKyNpZmRlZiBLTVBfVVNFX1ZFUlNJT05fU1lNQk9MUworCisvLyBHT01QXzEuMCBhbGlhc2VzCit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfQVRPTUlDX0VORCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0FUT01JQ19TVEFSVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0JBUlJJRVIsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9DUklUSUNBTF9FTkQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9DUklUSUNBTF9OQU1FX0VORCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0NSSVRJQ0FMX05BTUVfU1RBUlQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9DUklUSUNBTF9TVEFSVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfRFlOQU1JQ19ORVhULCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9EWU5BTUlDX1NUQVJULCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9FTkQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX0VORF9OT1dBSVQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX0dVSURFRF9ORVhULCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9HVUlERURfU1RBUlQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfRFlOQU1JQ19ORVhULCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX0RZTkFNSUNfU1RBUlQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfR1VJREVEX05FWFQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfR1VJREVEX1NUQVJULCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX1JVTlRJTUVfTkVYVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfT1JERVJFRF9SVU5USU1FX1NUQVJULCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX1NUQVRJQ19ORVhULCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX1NUQVRJQ19TVEFSVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfUlVOVElNRV9ORVhULCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9SVU5USU1FX1NUQVJULCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9TVEFUSUNfTkVYVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfU1RBVElDX1NUQVJULCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfT1JERVJFRF9FTkQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9PUkRFUkVEX1NUQVJULCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfRU5ELCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfTE9PUF9EWU5BTUlDX1NUQVJULCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfTE9PUF9HVUlERURfU1RBUlQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX1JVTlRJTUVfU1RBUlQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX1NUQVRJQ19TVEFSVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX1NFQ1RJT05TX1NUQVJULCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfU1RBUlQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9TRUNUSU9OU19FTkQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9TRUNUSU9OU19FTkRfTk9XQUlULCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfU0VDVElPTlNfTkVYVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX1NFQ1RJT05TX1NUQVJULCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfU0lOR0xFX0NPUFlfRU5ELCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfU0lOR0xFX0NPUFlfU1RBUlQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9TSU5HTEVfU1RBUlQsIDEwKTsKKworLy8gR09NUF8yLjAgYWxpYXNlcworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX1RBU0ssIDIwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9UQVNLV0FJVCwgMjApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX0RZTkFNSUNfTkVYVCwgMjApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX0RZTkFNSUNfU1RBUlQsIDIwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9HVUlERURfTkVYVCwgMjApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX0dVSURFRF9TVEFSVCwgMjApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfRFlOQU1JQ19ORVhULCAyMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfT1JERVJFRF9EWU5BTUlDX1NUQVJULCAyMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfT1JERVJFRF9HVUlERURfTkVYVCwgMjApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfR1VJREVEX1NUQVJULCAyMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfT1JERVJFRF9SVU5USU1FX05FWFQsIDIwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX1JVTlRJTUVfU1RBUlQsIDIwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX1NUQVRJQ19ORVhULCAyMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfT1JERVJFRF9TVEFUSUNfU1RBUlQsIDIwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9SVU5USU1FX05FWFQsIDIwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9SVU5USU1FX1NUQVJULCAyMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfU1RBVElDX05FWFQsIDIwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9TVEFUSUNfU1RBUlQsIDIwKTsKKworLy8gR09NUF8zLjAgYWxpYXNlcworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX1RBU0tZSUVMRCwgMzApOworCisvLyBHT01QXzQuMCBhbGlhc2VzCisvLyBUaGUgR09NUF9wYXJhbGxlbCogZW50cnkgcG9pbnRzIGJlbG93IGFyZW4ndCBPcGVuTVAgNC4wIHJlbGF0ZWQuCisjaWYgT01QXzQwX0VOQUJMRUQKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTCwgNDApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX1NFQ1RJT05TLCA0MCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfTE9PUF9EWU5BTUlDLCA0MCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfTE9PUF9HVUlERUQsIDQwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX1JVTlRJTUUsIDQwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX1NUQVRJQywgNDApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX1RBU0tHUk9VUF9TVEFSVCwgNDApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX1RBU0tHUk9VUF9FTkQsIDQwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9CQVJSSUVSX0NBTkNFTCwgNDApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0NBTkNFTCwgNDApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0NBTkNFTExBVElPTl9QT0lOVCwgNDApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfRU5EX0NBTkNFTCwgNDApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX1NFQ1RJT05TX0VORF9DQU5DRUwsIDQwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9UQVJHRVQsIDQwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9UQVJHRVRfREFUQSwgNDApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX1RBUkdFVF9FTkRfREFUQSwgNDApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX1RBUkdFVF9VUERBVEUsIDQwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9URUFNUywgNDApOworI2VuZGlmCisKKy8vIEdPTVBfMS4wIHZlcnNpb25lZCBzeW1ib2xzCit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9BVE9NSUNfRU5ELCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9BVE9NSUNfU1RBUlQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0JBUlJJRVIsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0NSSVRJQ0FMX0VORCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfQ1JJVElDQUxfTkFNRV9FTkQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0NSSVRJQ0FMX05BTUVfU1RBUlQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0NSSVRJQ0FMX1NUQVJULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX0RZTkFNSUNfTkVYVCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9EWU5BTUlDX1NUQVJULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX0VORCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9FTkRfTk9XQUlULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX0dVSURFRF9ORVhULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX0dVSURFRF9TVEFSVCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX0RZTkFNSUNfTkVYVCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX0RZTkFNSUNfU1RBUlQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfT1JERVJFRF9HVUlERURfTkVYVCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX0dVSURFRF9TVEFSVCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX1JVTlRJTUVfTkVYVCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX1JVTlRJTUVfU1RBUlQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfT1JERVJFRF9TVEFUSUNfTkVYVCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX1NUQVRJQ19TVEFSVCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9SVU5USU1FX05FWFQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfUlVOVElNRV9TVEFSVCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9TVEFUSUNfTkVYVCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9TVEFUSUNfU1RBUlQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX09SREVSRURfRU5ELCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9PUkRFUkVEX1NUQVJULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9FTkQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0xPT1BfRFlOQU1JQ19TVEFSVCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfTE9PUF9HVUlERURfU1RBUlQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0xPT1BfUlVOVElNRV9TVEFSVCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfTE9PUF9TVEFUSUNfU1RBUlQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX1NFQ1RJT05TX1NUQVJULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9TVEFSVCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfU0VDVElPTlNfRU5ELCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9TRUNUSU9OU19FTkRfTk9XQUlULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9TRUNUSU9OU19ORVhULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9TRUNUSU9OU19TVEFSVCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfU0lOR0xFX0NPUFlfRU5ELCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9TSU5HTEVfQ09QWV9TVEFSVCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfU0lOR0xFX1NUQVJULCAxMCwgIkdPTVBfMS4wIik7CisKKy8vIEdPTVBfMi4wIHZlcnNpb25lZCBzeW1ib2xzCit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9UQVNLLCAyMCwgIkdPTVBfMi4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9UQVNLV0FJVCwgMjAsICJHT01QXzIuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfRFlOQU1JQ19ORVhULCAyMCwgIkdPTVBfMi4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9EWU5BTUlDX1NUQVJULCAyMCwgIkdPTVBfMi4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9HVUlERURfTkVYVCwgMjAsICJHT01QXzIuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfR1VJREVEX1NUQVJULCAyMCwgIkdPTVBfMi4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX0RZTkFNSUNfTkVYVCwgMjAsICJHT01QXzIuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfT1JERVJFRF9EWU5BTUlDX1NUQVJULCAyMCwgIkdPTVBfMi4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX0dVSURFRF9ORVhULCAyMCwgIkdPTVBfMi4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX0dVSURFRF9TVEFSVCwgMjAsICJHT01QXzIuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfT1JERVJFRF9SVU5USU1FX05FWFQsIDIwLCAiR09NUF8yLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfUlVOVElNRV9TVEFSVCwgMjAsICJHT01QXzIuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfT1JERVJFRF9TVEFUSUNfTkVYVCwgMjAsICJHT01QXzIuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfT1JERVJFRF9TVEFUSUNfU1RBUlQsIDIwLCAiR09NUF8yLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX1JVTlRJTUVfTkVYVCwgMjAsICJHT01QXzIuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfUlVOVElNRV9TVEFSVCwgMjAsICJHT01QXzIuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfU1RBVElDX05FWFQsIDIwLCAiR09NUF8yLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX1NUQVRJQ19TVEFSVCwgMjAsICJHT01QXzIuMCIpOworCisvLyBHT01QXzMuMCB2ZXJzaW9uZWQgc3ltYm9scworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfVEFTS1lJRUxELCAzMCwgIkdPTVBfMy4wIik7CisKKy8vIEdPTVBfNC4wIHZlcnNpb25lZCBzeW1ib2xzCisjaWYgT01QXzQwX0VOQUJMRUQKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMLCA0MCwgIkdPTVBfNC4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9TRUNUSU9OUywgNDAsICJHT01QXzQuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfTE9PUF9EWU5BTUlDLCA0MCwgIkdPTVBfNC4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX0dVSURFRCwgNDAsICJHT01QXzQuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfTE9PUF9SVU5USU1FLCA0MCwgIkdPTVBfNC4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX1NUQVRJQywgNDAsICJHT01QXzQuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfVEFTS0dST1VQX1NUQVJULCA0MCwgIkdPTVBfNC4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9UQVNLR1JPVVBfRU5ELCA0MCwgIkdPTVBfNC4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9CQVJSSUVSX0NBTkNFTCwgNDAsICJHT01QXzQuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfQ0FOQ0VMLCA0MCwgIkdPTVBfNC4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9DQU5DRUxMQVRJT05fUE9JTlQsIDQwLCAiR09NUF80LjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfRU5EX0NBTkNFTCwgNDAsICJHT01QXzQuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfU0VDVElPTlNfRU5EX0NBTkNFTCwgNDAsICJHT01QXzQuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfVEFSR0VULCA0MCwgIkdPTVBfNC4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9UQVJHRVRfREFUQSwgNDAsICJHT01QXzQuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfVEFSR0VUX0VORF9EQVRBLCA0MCwgIkdPTVBfNC4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9UQVJHRVRfVVBEQVRFLCA0MCwgIkdPTVBfNC4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9URUFNUywgNDAsICJHT01QXzQuMCIpOworI2VuZGlmCisKKyNlbmRpZiAvLyBLTVBfVVNFX1ZFUlNJT05fU1lNQk9MUworCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgICB9IC8vZXh0ZXJuICJDIgorI2VuZGlmIC8vIF9fY3BsdXNwbHVzCisKKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX2kxOG4uYyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9pMThuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI2ZDVlNwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9pMThuLmMKQEAgLTAsMCArMSw5NzYgQEAKKy8qCisgKiBrbXBfaTE4bi5jCisgKiAkUmV2aXNpb246IDQzMDg0ICQKKyAqICREYXRlOiAyMDE0LTA0LTE1IDA5OjE1OjE0IC0wNTAwIChUdWUsIDE1IEFwciAyMDE0KSAkCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKworI2luY2x1ZGUgImttcF9pMThuLmgiCisKKyNpbmNsdWRlICJrbXBfb3MuaCIKKyNpbmNsdWRlICJrbXBfZGVidWcuaCIKKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJrbXBfbG9jay5oIgorI2luY2x1ZGUgImttcF9pby5oIiAgICAgICAgICAvLyBfX2ttcF9wcmludGYuCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bG9jYWxlLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKyNpbmNsdWRlICJrbXBfaTE4bl9kZWZhdWx0LmluYyIKKyNpbmNsdWRlICJrbXBfc3RyLmgiCisjaW5jbHVkZSAia21wX2Vudmlyb25tZW50LmgiCisKKyN1bmRlZiBLTVBfSTE4Tl9PSworCisjZGVmaW5lIGdldF9zZWN0aW9uKCBpZCApICAoIChpZCkgPj4gMTYgKQorI2RlZmluZSBnZXRfbnVtYmVyKCBpZCApICAgKCAoaWQpICYgMHhGRkZGICkKKwora21wX21zZ190ICAgICAgICAgICBfX2ttcF9tc2dfZW1wdHkgPSB7IGttcF9tdF9kdW1teSwgMCwgIiIsIDAgIH07CitrbXBfbXNnX3QgICAgICAgICAgIF9fa21wX21zZ19udWxsICA9IHsga21wX210X2R1bW15LCAwLCBOVUxMLCAwIH07CitzdGF0aWMgY2hhciBjb25zdCAqIG5vX21lc3NhZ2VfYXZhaWxhYmxlID0gIihObyBtZXNzYWdlIGF2YWlsYWJsZSkiOworCitlbnVtIGttcF9pMThuX2NhdF9zdGF0dXMgeworICAgIEtNUF9JMThOX0NMT1NFRCwgICAgLy8gTm90IHlldCBvcGVuZWQgb3IgY2xvc2VkLgorICAgIEtNUF9JMThOX09QRU5FRCwgICAgLy8gT3BlbmVkIHN1Y2Nlc3NmdWxseSwgcmVhZHkgdG8gdXNlLgorICAgIEtNUF9JMThOX0FCU0VOVCAgICAgLy8gT3BlbmluZyBmYWlsZWQsIG1lc3NhZ2UgY2F0YWxvZyBzaG91bGQgbm90IGJlIHVzZWQuCit9OyAvLyBlbnVtIGttcF9pMThuX2NhdF9zdGF0dXMKK3R5cGVkZWYgZW51bSBrbXBfaTE4bl9jYXRfc3RhdHVzICBrbXBfaTE4bl9jYXRfc3RhdHVzX3Q7CitzdGF0aWMgdm9sYXRpbGUga21wX2kxOG5fY2F0X3N0YXR1c190ICBzdGF0dXMgPSBLTVBfSTE4Tl9DTE9TRUQ7CisKKy8qCisgICAgTWVzc2FnZSBjYXRhbG9nIGlzIG9wZW5lZCBhdCBmaXJzdCB1c2FnZSwgc28gd2UgaGF2ZSB0byBzeW5jaHJvbml6ZSBvcGVuaW5nIHRvIGF2b2lkIHJhY2UgYW5kCisgICAgbXVsdGlwbGUgb3BlbmluZ3MuCisKKyAgICBDbG9zaW5nIGRvZXMgbm90IHJlcXVpcmUgc3luY2hyb25pemF0aW9uLCBiZWNhdXNlIGNhdGFsb2cgaXMgY2xvc2VkIHZlcnkgbGF0ZSBhdCBsaWJyYXJ5CisgICAgc2h1dHRpbmcgZG93biwgd2hlbiBubyBvdGhlciB0aHJlYWRzIGFyZSBhbGl2ZS4KKyovCisKK3N0YXRpYyB2b2lkIF9fa21wX2kxOG5fZG9fY2F0b3BlbigpOworc3RhdGljIGttcF9ib290c3RyYXBfbG9ja190ICBsb2NrID0gS01QX0JPT1RTVFJBUF9MT0NLX0lOSVRJQUxJWkVSKCBsb2NrICk7CisgICAgLy8gYGxvY2snIHZhcmlhYmxlIG1heSBiZSBwbGFjZWQgaW50byBfX2ttcF9pMThuX2NhdG9wZW4gZnVuY3Rpb24gYmVjYXVzZSBpdCBpcyB1c2VkIG9ubHkgYnkKKyAgICAvLyB0aGF0IGZ1bmN0aW9uLiBCdXQgd2UgYWZyYWlkIGEgKGJ1Z2d5KSBjb21waWxlciBtYXkgdHJlYXQgaXQgd3JvbmdseS4gU28gd2UgcHV0IGl0IG91dHNpZGUgb2YKKyAgICAvLyBmdW5jdGlvbiBqdXN0IGluIGNhc2UuCisKK3ZvaWQKK19fa21wX2kxOG5fY2F0b3BlbigKKykgeworICAgIGlmICggc3RhdHVzID09IEtNUF9JMThOX0NMT1NFRCApIHsKKyAgICAgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJiBsb2NrICk7CisgICAgICAgIGlmICggc3RhdHVzID09IEtNUF9JMThOX0NMT1NFRCApIHsKKyAgICAgICAgICAgIF9fa21wX2kxOG5fZG9fY2F0b3BlbigpOworICAgICAgICB9OyAvLyBpZgorICAgICAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmIGxvY2sgKTsKKyAgICB9OyAvLyBpZgorfSAvLyBmdW5jIF9fa21wX2kxOG5fY2F0b3BlbgorCisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgTGludXgqIE9TIGFuZCBPUyBYKiBwYXJ0LgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKworI2lmIEtNUF9PU19VTklYCisjZGVmaW5lIEtNUF9JMThOX09LCisKKyNpbmNsdWRlIDxubF90eXBlcy5oPgorCisjZGVmaW5lIEtNUF9JMThOX05VTExDQVQgKChubF9jYXRkKSggLTEgKSkKK3N0YXRpYyBubF9jYXRkICAgICAgIGNhdCAgPSBLTVBfSTE4Tl9OVUxMQ0FUOyAgICAvLyAhISEgU2hhbGwgaXQgYmUgdm9sYXRpbGU/CitzdGF0aWMgY2hhciBjb25zdCAqICBuYW1lID0gKCBLTVBfVkVSU0lPTl9NQUpPUiA9PSA0ID8gImxpYmd1aWRlLmNhdCIgOiAibGliaW9tcDUuY2F0IiApOworCisvKgorICAgIFVzZWZ1bCBsaW5rczoKKyAgICAgICAgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDAwMDk1Mzk5L2Jhc2VkZWZzL3hiZF9jaGFwMDguaHRtbCN0YWdfMDhfMDIKKyAgICAgICAgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDAwMDk1Mzk5L2Z1bmN0aW9ucy9jYXRvcGVuLmh0bWwKKyAgICAgICAgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDAwMDk1Mzk5L2Z1bmN0aW9ucy9zZXRsb2NhbGUuaHRtbAorKi8KKwordm9pZAorX19rbXBfaTE4bl9kb19jYXRvcGVuKAorKSB7CisgICAgaW50ICAgIGVuZ2xpc2ggPSAwOworICAgIGNoYXIgKiBsYW5nICAgID0gX19rbXBfZW52X2dldCggIkxBTkciICk7CisgICAgLy8gVE9ETzogV2hhdCBhYm91dCBMQ19BTEwgb3IgTENfTUVTU0FHRVM/CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBzdGF0dXMgPT0gS01QX0kxOE5fQ0xPU0VEICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggY2F0ICAgID09IEtNUF9JMThOX05VTExDQVQgKTsKKworICAgIGVuZ2xpc2ggPQorCWxhbmcgPT0gTlVMTCAgICAgICAgICAgICAgICAgICAgICAgfHwgIC8vIEluIGFsbCB0aGVzZSBjYXNlcyBFbmdsaXNoIGxhbmd1YWdlIGlzIHVzZWQuCisJc3RyY21wKCBsYW5nLCAiIiApICAgICAgICAgICAgPT0gMCB8fAorICAgICAgICBzdHJjbXAoIGxhbmcsICIgIiApICAgICAgICAgICA9PSAwIHx8CisgICAgICAgICAgICAgIC8vIFdvcmthcm91bmQgZm9yIEZvcnRyYW4gUlRMIGJ1ZyBEUEQyMDAxMzc4NzMgIkZvcnRyYW4gcnVudGltZSByZXNldHMgTEFORyBlbnYgdmFyCisgICAgICAgICAgICAgIC8vIHRvIHNwYWNlIGlmIGl0IGlzIG5vdCBzZXQiLgorCXN0cmNtcCggbGFuZywgIkMiICkgICAgICAgICAgID09IDAgfHwKKwlzdHJjbXAoIGxhbmcsICJQT1NJWCIgKSAgICAgICA9PSAwOworCisgICAgaWYgKCAhIGVuZ2xpc2ggKSB7ICAvLyBFbmdsaXNoIGxhbmd1YWdlIGlzIG5vdCB5ZXQgZGV0ZWN0ZWQsIGxldCB1cyBjb250aW51ZS4KKyAgICAgICAgLy8gRm9ybWF0IG9mIExBTkcgaXM6IFtsYW5ndWFnZVtfdGVycml0b3J5XVsuY29kZXNldF1bQG1vZGlmaWVyXV0KKyAgICAgICAgLy8gU3RyaXAgYWxsIHBhcnRzIGV4Y2VwdCBsYW5ndWFnZS4KKyAgICAgICAgY2hhciAqIHRhaWwgPSBOVUxMOworICAgICAgICBfX2ttcF9zdHJfc3BsaXQoIGxhbmcsICdAJywgJiBsYW5nLCAmIHRhaWwgKTsKKyAgICAgICAgX19rbXBfc3RyX3NwbGl0KCBsYW5nLCAnLicsICYgbGFuZywgJiB0YWlsICk7CisgICAgICAgIF9fa21wX3N0cl9zcGxpdCggbGFuZywgJ18nLCAmIGxhbmcsICYgdGFpbCApOworICAgICAgICBlbmdsaXNoID0gKCBzdHJjbXAoIGxhbmcsICJlbiIgKSA9PSAwICk7CisgICAgfTsgLy8gaWYKKworICAgIEtNUF9JTlRFUk5BTF9GUkVFKCBsYW5nICk7CisKKyAgICAvLyBEbyBub3QgdHJ5IHRvIG9wZW4gRW5nbGlzaCBjYXRhbG9nIGJlY2F1c2UgaW50ZXJuYWwgbWVzc2FnZXMgYXJlCisgICAgLy8gZXhhY3QgY29weSBvZiBtZXNzYWdlcyBpbiBFbmdsaXNoIGNhdGFsb2cuCisgICAgaWYgKCBlbmdsaXNoICkgeworCXN0YXR1cyA9IEtNUF9JMThOX0FCU0VOVDsgIC8vIG1hcmsgY2F0YWxvZyBhcyBhYnNlbnQgc28gaXQgd2lsbCBub3QgYmUgcmUtb3BlbmVkLgorCXJldHVybjsKKyAgICB9CisKKyAgICBjYXQgPSBjYXRvcGVuKCBuYW1lLCAwICk7CisgICAgLy8gVE9ETzogV2h5IGRvIHdlIHBhc3MgMCBpbiBmbGFncz8KKyAgICBzdGF0dXMgPSAoIGNhdCA9PSBLTVBfSTE4Tl9OVUxMQ0FUID8gS01QX0kxOE5fQUJTRU5UIDogS01QX0kxOE5fT1BFTkVEICk7CisKKyAgICBpZiAoIHN0YXR1cyA9PSBLTVBfSTE4Tl9BQlNFTlQgKSB7CisgICAgICBpZiAoX19rbXBfZ2VuZXJhdGVfd2FybmluZ3MgPiBrbXBfd2FybmluZ3NfbG93KSB7IC8vIEFDOiBvbmx5IGlzc3VlIHdhcm5pbmcgaW4gY2FzZSBleHBsaWNpdGx5IGFza2VkIHRvCisgICAgICAgIGludCAgICBlcnJvciAgID0gZXJybm87IC8vIFNhdmUgZXJybm8gaW1tZWRpYXRlbGx5LgorCWNoYXIgKiBubHNwYXRoID0gX19rbXBfZW52X2dldCggIk5MU1BBVEgiICk7CisgICAgICAgIGNoYXIgKiBsYW5nICAgID0gX19rbXBfZW52X2dldCggIkxBTkciICk7CisKKwkvLyBJbmZpbml0ZSByZWN1cnNpb24gd2lsbCBub3Qgb2NjdXIgLS0gc3RhdHVzIGlzIEtNUF9JMThOX0FCU0VOVCBub3csIHNvCisJLy8gX19rbXBfaTE4bl9jYXRnZXRzKCkgd2lsbCBub3QgdHJ5IHRvIG9wZW4gY2F0YWxvZywgYnV0IHdpbGwgcmV0dXJuIGRlZmF1bHQgbWVzc2FnZS4KKwlfX2ttcF9tc2coCisJICAgIGttcF9tc193YXJuaW5nLAorCSAgICBLTVBfTVNHKCBDYW50T3Blbk1lc3NhZ2VDYXRhbG9nLCBuYW1lICksCisJICAgIEtNUF9FUlIoIGVycm9yICksCisJICAgIEtNUF9ITlQoIENoZWNrRW52VmFyLCAiTkxTUEFUSCIsIG5sc3BhdGggKSwKKyAgICAgICAgICAgIEtNUF9ITlQoIENoZWNrRW52VmFyLCAiTEFORyIsIGxhbmcgKSwKKwkgICAgX19rbXBfbXNnX251bGwKKwkpOworCUtNUF9JTkZPUk0oIFdpbGxVc2VEZWZhdWx0TWVzc2FnZXMgKTsKKyAgICAgICAgS01QX0lOVEVSTkFMX0ZSRUUoIG5sc3BhdGggKTsKKyAgICAgICAgS01QX0lOVEVSTkFMX0ZSRUUoIGxhbmcgKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeyAvLyBzdGF0dXMgPT0gS01QX0kxOE5fT1BFTkVECisKKyAgICAgICAgaW50IHNlY3Rpb24gPSBnZXRfc2VjdGlvbigga21wX2kxOG5fcHJwX1ZlcnNpb24gKTsKKyAgICAgICAgaW50IG51bWJlciAgPSBnZXRfbnVtYmVyKCBrbXBfaTE4bl9wcnBfVmVyc2lvbiApOworICAgICAgICBjaGFyIGNvbnN0ICogZXhwZWN0ZWQgPSBfX2ttcF9pMThuX2RlZmF1bHRfdGFibGUuc2VjdFsgc2VjdGlvbiBdLnN0clsgbnVtYmVyIF07CisgICAgICAgICAgICAvLyBFeHBlY3RlZCB2ZXJzaW9uIG9mIHRoZSBjYXRhbG9nLgorICAgICAgICBrbXBfc3RyX2J1Zl90IHZlcnNpb247ICAgLy8gQWN0dWFsIHZlcnNpb24gb2YgdGhlIGNhdGFsb2cuCisgICAgICAgIF9fa21wX3N0cl9idWZfaW5pdCggJiB2ZXJzaW9uICk7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICYgdmVyc2lvbiwgIiVzIiwgY2F0Z2V0cyggY2F0LCBzZWN0aW9uLCBudW1iZXIsIE5VTEwgKSApOworCisgICAgICAgICAgICAvLyBTdHJpbmcgcmV0dXJuZWQgYnkgY2F0Z2V0cyBpcyBpbnZhbGlkIGFmdGVyIGNsb3NpbmcgdGhlIGNhdGFsb2csIHNvIGNvcHkgaXQuCisgICAgICAgIGlmICggc3RyY21wKCB2ZXJzaW9uLnN0ciwgZXhwZWN0ZWQgKSAhPSAwICkgeworICAgICAgICAgICAgX19rbXBfaTE4bl9jYXRjbG9zZSgpOyAgICAgLy8gQ2xvc2UgYmFkIGNhdGFsb2cuCisgICAgICAgICAgICBzdGF0dXMgPSBLTVBfSTE4Tl9BQlNFTlQ7ICAvLyBBbmQgbWFyayBpdCBhcyBhYnNlbnQuCisgICAgICAgICAgICBpZiAoX19rbXBfZ2VuZXJhdGVfd2FybmluZ3MgPiBrbXBfd2FybmluZ3NfbG93KSB7IC8vIEFDOiBvbmx5IGlzc3VlIHdhcm5pbmcgaW4gY2FzZSBleHBsaWNpdGx5IGFza2VkIHRvCisgICAgICAgICAgICAgICAgLy8gQW5kIG5vdyBwcmludCBhIHdhcm5pbmcgdXNpbmcgZGVmYXVsdCBtZXNzYWdlcy4KKyAgICAgICAgICAgICAgICBjaGFyIGNvbnN0ICogbmFtZSAgICA9ICJOTFNQQVRIIjsKKyAgICAgICAgICAgICAgICBjaGFyIGNvbnN0ICogbmxzcGF0aCA9IF9fa21wX2Vudl9nZXQoIG5hbWUgKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgIGttcF9tc193YXJuaW5nLAorICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBXcm9uZ01lc3NhZ2VDYXRhbG9nLCBuYW1lLCB2ZXJzaW9uLnN0ciwgZXhwZWN0ZWQgKSwKKyAgICAgICAgICAgICAgICAgICAgS01QX0hOVCggQ2hlY2tFbnZWYXIsIG5hbWUsIG5sc3BhdGggKSwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oIFdpbGxVc2VEZWZhdWx0TWVzc2FnZXMgKTsKKyAgICAgICAgICAgICAgICBLTVBfSU5URVJOQUxfRlJFRSggKHZvaWQgKikgbmxzcGF0aCApOworICAgICAgICAgICAgfSAvLyBfX2ttcF9nZW5lcmF0ZV93YXJuaW5ncworICAgICAgICB9OyAvLyBpZgorICAgICAgICBfX2ttcF9zdHJfYnVmX2ZyZWUoICYgdmVyc2lvbiApOworCisgICAgfTsgLy8gaWYKKworfSAvLyBmdW5jIF9fa21wX2kxOG5fZG9fY2F0b3BlbgorCisKK3ZvaWQKK19fa21wX2kxOG5fY2F0Y2xvc2UoCispIHsKKyAgICBpZiAoIHN0YXR1cyA9PSBLTVBfSTE4Tl9PUEVORUQgKSB7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGNhdCAhPSBLTVBfSTE4Tl9OVUxMQ0FUICk7CisgICAgICAgIGNhdGNsb3NlKCBjYXQgKTsKKyAgICAgICAgY2F0ID0gS01QX0kxOE5fTlVMTENBVDsKKyAgICB9OyAvLyBpZgorICAgIHN0YXR1cyA9IEtNUF9JMThOX0NMT1NFRDsKK30gLy8gZnVuYyBfX2ttcF9pMThuX2NhdGNsb3NlCisKKworY2hhciBjb25zdCAqCitfX2ttcF9pMThuX2NhdGdldHMoCisgICAga21wX2kxOG5faWRfdCAgaWQKKykgeworCisgICAgaW50IHNlY3Rpb24gPSBnZXRfc2VjdGlvbiggaWQgKTsKKyAgICBpbnQgbnVtYmVyICA9IGdldF9udW1iZXIoIGlkICk7CisgICAgY2hhciBjb25zdCAqIG1lc3NhZ2UgPSBOVUxMOworCisgICAgaWYgKCAxIDw9IHNlY3Rpb24gJiYgc2VjdGlvbiA8PSBfX2ttcF9pMThuX2RlZmF1bHRfdGFibGUuc2l6ZSApIHsKKyAgICAgICAgaWYgKCAxIDw9IG51bWJlciAmJiBudW1iZXIgPD0gX19rbXBfaTE4bl9kZWZhdWx0X3RhYmxlLnNlY3RbIHNlY3Rpb24gXS5zaXplICkgeworICAgICAgICAgICAgaWYgKCBzdGF0dXMgPT0gS01QX0kxOE5fQ0xPU0VEICkgeworICAgICAgICAgICAgICAgIF9fa21wX2kxOG5fY2F0b3BlbigpOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgIGlmICggc3RhdHVzID09IEtNUF9JMThOX09QRU5FRCApIHsKKyAgICAgICAgICAgICAgICBtZXNzYWdlID0KKyAgICAgICAgICAgICAgICAgICAgY2F0Z2V0cygKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb24sIG51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2kxOG5fZGVmYXVsdF90YWJsZS5zZWN0WyBzZWN0aW9uIF0uc3RyWyBudW1iZXIgXQorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgIGlmICggbWVzc2FnZSA9PSBOVUxMICkgeworICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBfX2ttcF9pMThuX2RlZmF1bHRfdGFibGUuc2VjdFsgc2VjdGlvbiBdLnN0clsgbnVtYmVyIF07CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICB9OyAvLyBpZgorICAgIH07IC8vIGlmCisgICAgaWYgKCBtZXNzYWdlID09IE5VTEwgKSB7CisgICAgICAgIG1lc3NhZ2UgPSBub19tZXNzYWdlX2F2YWlsYWJsZTsKKyAgICB9OyAvLyBpZgorICAgIHJldHVybiBtZXNzYWdlOworCit9IC8vIGZ1bmMgX19rbXBfaTE4bl9jYXRnZXRzCisKKworI2VuZGlmIC8vIEtNUF9PU19VTklYCisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgV2luZG93cyogT1MgcGFydC4KKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisKKyNpZiBLTVBfT1NfV0lORE9XUworI2RlZmluZSBLTVBfSTE4Tl9PSworCisjaW5jbHVkZSAia21wX2Vudmlyb25tZW50LmgiCisjaW5jbHVkZSA8d2luZG93cy5oPgorCisjZGVmaW5lIEtNUF9JMThOX05VTExDQVQgIE5VTEwKK3N0YXRpYyBITU9EVUxFICAgICAgIGNhdCAgPSBLTVBfSTE4Tl9OVUxMQ0FUOyAgICAvLyAhISEgU2hhbGwgaXQgYmUgdm9sYXRpbGU/CitzdGF0aWMgY2hhciBjb25zdCAqICBuYW1lID0gKCBLTVBfVkVSU0lPTl9NQUpPUiA9PSA0ID8gImxpYmd1aWRlNDB1aS5kbGwiIDogImxpYmlvbXA1dWkuZGxsIiApOworCitzdGF0aWMga21wX2kxOG5fdGFibGVfdCAgdGFibGUgICAgICAgICAgICAgPSB7IDAsIE5VTEwgfTsKKyAgICAvLyBNZXNzYWdlcyBmb3JtYXR0ZWQgYnkgRm9ybWF0TWVzc2FnZSgpIHNob3VsZCBiZSBmcmVlZCwgYnV0IGNhdGdldHMoKSBpbnRlcmZhY2UgYXNzdW1lcworICAgIC8vIHVzZXIgd2lsbCBub3QgZnJlZSBtZXNzYWdlcy4gU28gd2UgY2FjaGUgYWxsIHRoZSByZXRyaWV2ZWQgbWVzc2FnZXMgaW4gdGhlIHRhYmxlLCB3aGljaAorICAgIC8vIGFyZSBmcmVlZCBhdCBjYXRjbG9zZSgpLgorc3RhdGljIFVJTlQgY29uc3QgICAgICAgIGRlZmF1bHRfY29kZV9wYWdlID0gQ1BfT0VNQ1A7CitzdGF0aWMgVUlOVCAgICAgICAgICAgICAgY29kZV9wYWdlICAgICAgICAgPSBkZWZhdWx0X2NvZGVfcGFnZTsKKworc3RhdGljIGNoYXIgY29uc3QgKiBfX19jYXRnZXRzKCBrbXBfaTE4bl9pZF90ICBpZCApOworc3RhdGljIFVJTlQgICAgICAgICBnZXRfY29kZV9wYWdlKCk7CitzdGF0aWMgdm9pZCAgICAgICAgIGttcF9pMThuX3RhYmxlX2ZyZWUoIGttcF9pMThuX3RhYmxlX3QgKiB0YWJsZSApOworCisKK3N0YXRpYyBVSU5UCitnZXRfY29kZV9wYWdlKAorKSB7CisKKyAgICBVSU5UIGNwID0gZGVmYXVsdF9jb2RlX3BhZ2U7CisgICAgY2hhciBjb25zdCAqIHZhbHVlID0gX19rbXBfZW52X2dldCggIktNUF9DT0RFUEFHRSIgKTsKKyAgICBpZiAoIHZhbHVlICE9IE5VTEwgKSB7CisgICAgICAgIGlmICggX3N0cmljbXAoIHZhbHVlLCAiQU5TSSIgKSA9PSAwICkgeworICAgICAgICAgICAgY3AgPSBDUF9BQ1A7CisgICAgICAgIH0gZWxzZSBpZiAoIF9zdHJpY21wKCB2YWx1ZSwgIk9FTSIgKSA9PSAwICkgeworICAgICAgICAgICAgY3AgPSBDUF9PRU1DUDsKKyAgICAgICAgfSBlbHNlIGlmICggX3N0cmljbXAoIHZhbHVlLCAiVVRGLTgiICkgPT0gMCB8fCBfc3RyaWNtcCggdmFsdWUsICJVVEY4IiApID09IDAgKSB7CisgICAgICAgICAgICBjcCA9IENQX1VURjg7CisgICAgICAgIH0gZWxzZSBpZiAoIF9zdHJpY21wKCB2YWx1ZSwgIlVURi03IiApID09IDAgfHwgX3N0cmljbXAoIHZhbHVlLCAiVVRGNyIgKSA9PSAwICkgeworICAgICAgICAgICAgY3AgPSBDUF9VVEY3OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gISEhIFRPRE86IElzc3VlIGEgd2FybmluZz8KKyAgICAgICAgfTsgLy8gaWYKKyAgICB9OyAvLyBpZgorICAgIEtNUF9JTlRFUk5BTF9GUkVFKCAodm9pZCAqKSB2YWx1ZSApOworICAgIHJldHVybiBjcDsKKworfSAvLyBmdW5jIGdldF9jb2RlX3BhZ2UKKworCitzdGF0aWMgdm9pZAora21wX2kxOG5fdGFibGVfZnJlZSgKKyAgICBrbXBfaTE4bl90YWJsZV90ICogdGFibGUKKykgeworICAgIGludCBzOworICAgIGludCBtOworICAgIGZvciAoIHMgPSAwOyBzIDwgdGFibGUtPnNpemU7ICsrIHMgKSB7CisgICAgICAgIGZvciAoIG0gPSAwOyBtIDwgdGFibGUtPnNlY3RbIHMgXS5zaXplOyArKyBtICkgeworICAgICAgICAgICAgLy8gRnJlZSBtZXNzYWdlLgorICAgICAgICAgICAgS01QX0lOVEVSTkFMX0ZSRUUoICh2b2lkICopIHRhYmxlLT5zZWN0WyBzIF0uc3RyWyBtIF0gKTsKKyAgICAgICAgICAgIHRhYmxlLT5zZWN0WyBzIF0uc3RyWyBtIF0gPSBOVUxMOworICAgICAgICB9OyAvLyBmb3IgbQorICAgICAgICB0YWJsZS0+c2VjdFsgcyBdLnNpemUgPSAwOworICAgICAgICAvLyBGcmVlIHNlY3Rpb24gaXRzZWxmLgorICAgICAgICBLTVBfSU5URVJOQUxfRlJFRSAoICh2b2lkICopIHRhYmxlLT5zZWN0WyBzIF0uc3RyICk7CisgICAgICAgIHRhYmxlLT5zZWN0WyBzIF0uc3RyID0gTlVMTDsKKyAgICB9OyAvLyBmb3IgcworICAgIHRhYmxlLT5zaXplID0gMDsKKyAgICBLTVBfSU5URVJOQUxfRlJFRSggKHZvaWQgKikgdGFibGUtPnNlY3QgKTsKKyAgICB0YWJsZS0+c2VjdCA9IE5VTEw7Cit9IC8vIGttcF9pOG5fdGFibGVfZnJlZQorCisKK3ZvaWQKK19fa21wX2kxOG5fZG9fY2F0b3BlbigKKykgeworCisgICAgTENJRCAgICAgICAgICBsb2NhbGVfaWQgPSBHZXRUaHJlYWRMb2NhbGUoKTsKKyAgICBXT1JEIAkgIGxhbmdfaWQgPSBMQU5HSURGUk9NTENJRCggbG9jYWxlX2lkICk7CisgICAgV09SRCAgICAgICAgICBwcmltYXJ5X2xhbmdfaWQgPSBQUklNQVJZTEFOR0lEKCBsYW5nX2lkICk7CisgICAga21wX3N0cl9idWZfdCBwYXRoOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggc3RhdHVzID09IEtNUF9JMThOX0NMT1NFRCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIGNhdCAgICA9PSBLTVBfSTE4Tl9OVUxMQ0FUICk7CisKKyAgICBfX2ttcF9zdHJfYnVmX2luaXQoICYgcGF0aCApOworCisgICAgLy8gRG8gbm90IHRyeSB0byBvcGVuIEVuZ2xpc2ggY2F0YWxvZyBiZWNhdXNlIGludGVybmFsIG1lc3NhZ2VzIGFyZQorICAgIC8vIGV4YWN0IGNvcHkgb2YgbWVzc2FnZXMgaW4gRW5nbGlzaCBjYXRhbG9nLgorICAgIGlmICggcHJpbWFyeV9sYW5nX2lkID09IExBTkdfRU5HTElTSCApIHsKKwlzdGF0dXMgPSBLTVBfSTE4Tl9BQlNFTlQ7ICAvLyBtYXJrIGNhdGFsb2cgYXMgYWJzZW50IHNvIGl0IHdpbGwgbm90IGJlIHJlLW9wZW5lZC4KKwlnb3RvIGVuZDsKKyAgICB9OyAvLyBpZgorCisgICAgLy8gQ29uc3RydWN0IHJlc291cmNlIERMTCBuYW1lLgorICAgIC8qCisgICAgICAgIFNpbXBsZQorICAgICAgICAgICAgTG9hZExpYnJhcnkoIG5hbWUgKQorICAgICAgICBpcyBub3Qgc3VpdGFibGUgZHVlIHRvIHNlY3VyaXR5IGlzc3VlIChzZWUKKyAgICAgICAgaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3RlY2huZXQvc2VjdXJpdHkvYWR2aXNvcnkvMjI2OTYzNy5tc3B4KS4gV2UgaGF2ZSB0byBzcGVjaWZ5IGZ1bGwKKyAgICAgICAgcGF0aCB0byB0aGUgbWVzc2FnZSBjYXRhbG9nLgorICAgICovCisgICAgeworCisgICAgICAgIC8vIEdldCBoYW5kbGUgb2Ygb3VyIERMTCBmaXJzdC4KKyAgICAgICAgSE1PRFVMRSBoYW5kbGU7CisgICAgICAgIEJPT0wgYnJjID0KKyAgICAgICAgICAgIEdldE1vZHVsZUhhbmRsZUV4KAorICAgICAgICAgICAgICAgIEdFVF9NT0RVTEVfSEFORExFX0VYX0ZMQUdfRlJPTV9BRERSRVNTIHwgR0VUX01PRFVMRV9IQU5ETEVfRVhfRkxBR19VTkNIQU5HRURfUkVGQ09VTlQsCisgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDwgTFBDU1RSID4oICYgX19rbXBfaTE4bl9kb19jYXRvcGVuICksCisgICAgICAgICAgICAgICAgJiBoYW5kbGUKKyAgICAgICAgICAgICk7CisgICAgICAgIGlmICggISBicmMgKSB7ICAgIC8vIEVycm9yIG9jY3VycmVkLgorICAgICAgICAgICAgc3RhdHVzID0gS01QX0kxOE5fQUJTRU5UOyAgLy8gbWFyayBjYXRhbG9nIGFzIGFic2VudCBzbyBpdCB3aWxsIG5vdCBiZSByZS1vcGVuZWQuCisgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgIC8vIFRPRE86IEVuYWJsZSBtdWx0aXBsZSBtZXNzYWdlcyAoS01QX01TRykgdG8gYmUgcGFzc2VkIHRvIF9fa21wX21zZzsgYW5kIHByaW50CisgICAgICAgICAgICAvLyBhIHByb3BlciB3YXJuaW5nLgorICAgICAgICB9OyAvLyBpZgorCisgICAgICAgIC8vIE5vdyBnZXQgcGF0aCB0byB0aGUgb3VyIERMTC4KKyAgICAgICAgZm9yICggOyA7ICkgeworICAgICAgICAgICAgRFdPUkQgZHJjID0gR2V0TW9kdWxlRmlsZU5hbWUoIGhhbmRsZSwgcGF0aC5zdHIsIHBhdGguc2l6ZSApOworICAgICAgICAgICAgaWYgKCBkcmMgPT0gMCApIHsgICAgLy8gRXJyb3Igb2NjdXJyZWQuCisgICAgICAgICAgICAgICAgc3RhdHVzID0gS01QX0kxOE5fQUJTRU5UOworICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgIGlmICggZHJjIDwgcGF0aC5zaXplICkgeworICAgICAgICAgICAgICAgIHBhdGgudXNlZCA9IGRyYzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3Jlc2VydmUoICYgcGF0aCwgcGF0aC5zaXplICogMiApOworICAgICAgICB9OyAvLyBmb3JldmVyCisKKyAgICAgICAgLy8gTm93IGNvbnN0cnVjdCB0aGUgbmFtZSBvZiBtZXNzYWdlIGNhdGFsb2cuCisgICAgICAgIGttcF9zdHJfZm5hbWUgZm5hbWU7CisgICAgICAgIF9fa21wX3N0cl9mbmFtZV9pbml0KCAmIGZuYW1lLCBwYXRoLnN0ciApOworICAgICAgICBfX2ttcF9zdHJfYnVmX2NsZWFyKCAmIHBhdGggKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBwYXRoLCAiJXMlbHUvJXMiLCBmbmFtZS5kaXIsICh1bnNpZ25lZCBsb25nKSggbG9jYWxlX2lkICksIG5hbWUgKTsKKyAgICAgICAgX19rbXBfc3RyX2ZuYW1lX2ZyZWUoICYgZm5hbWUgKTsKKworICAgIH0KKworICAgIC8vIEZvciBzZWN1cml0eSByZWFzb25zLCB1c2UgTG9hZExpYnJhcnlFeCgpIGFuZCBsb2FkIG1lc3NhZ2UgY2F0YWxvZyBhcyBhIGRhdGEgZmlsZS4KKyAgICBjYXQgPSBMb2FkTGlicmFyeUV4KCBwYXRoLnN0ciwgTlVMTCwgTE9BRF9MSUJSQVJZX0FTX0RBVEFGSUxFICk7CisgICAgc3RhdHVzID0gKCBjYXQgPT0gS01QX0kxOE5fTlVMTENBVCA/IEtNUF9JMThOX0FCU0VOVCA6IEtNUF9JMThOX09QRU5FRCApOworCisgICAgaWYgKCBzdGF0dXMgPT0gS01QX0kxOE5fQUJTRU5UICkgeworICAgICAgaWYgKF9fa21wX2dlbmVyYXRlX3dhcm5pbmdzID4ga21wX3dhcm5pbmdzX2xvdykgeyAvLyBBQzogb25seSBpc3N1ZSB3YXJuaW5nIGluIGNhc2UgZXhwbGljaXRseSBhc2tlZCB0bworCURXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisJLy8gSW5maW5pdGUgcmVjdXJzaW9uIHdpbGwgbm90IG9jY3VyIC0tIHN0YXR1cyBpcyBLTVBfSTE4Tl9BQlNFTlQgbm93LCBzbworCS8vIF9fa21wX2kxOG5fY2F0Z2V0cygpIHdpbGwgbm90IHRyeSB0byBvcGVuIGNhdGFsb2cgYnV0IHdpbGwgcmV0dXJuIGRlZmF1bHQgbWVzc2FnZS4KKyAgICAgICAgLyoKKyAgICAgICAgIElmIG1lc3NhZ2UgY2F0YWxvZyBmb3IgYW5vdGhlciBhcmNoaXRlY3R1cmUgZm91bmQgKGUuZy4gT3Blbk1QIFJUTAorCSBmb3IgSUEtMzIgYXJjaGl0ZWN0dXJlIG9wZW5zIGxpYmlvbXA1dWkuZGxsIGZvciBJbnRlbChSKSA2NCkKKwkgV2luZG93cyogT1MgcmV0dXJucyBlcnJvciAxOTMgKEVSUk9SX0JBRF9FWEVfRk9STUFUKS4gSG93ZXZlciwKKyAgICAgICAgIEZvcm1hdE1lc3NhZ2UgZmFpbHMgdG8gcmV0dXJuIGEgbWVzc2FnZSBmb3IgdGhpcyBlcnJvciwgc28gdXNlcgorCSB3aWxsIHNlZToKKworICAgICAgICAgT01QOiBXYXJuaW5nICMyOiBDYW5ub3Qgb3BlbiBtZXNzYWdlIGNhdGFsb2cgIjEwNDFcbGliaW9tcDV1aS5kbGwiOgorICAgICAgICAgT01QOiBTeXN0ZW0gZXJyb3IgIzE5MzogKE5vIHN5c3RlbSBlcnJvciBtZXNzYWdlIGF2YWlsYWJsZSkKKyAgICAgICAgIE9NUDogSW5mbyAjMzogRGVmYXVsdCBtZXNzYWdlcyB3aWxsIGJlIHVzZWQuCisKKyAgICAgICAgIElzc3VlIGEgaGludCBpbiB0aGlzIGNhc2UgdG8gbGV0IGNhdXNlIG9mIHRyb3VibGUgbW9yZSB1bmRlcnN0YW5kYWJsZS4KKyAgICAgICAgKi8KKwlfX2ttcF9tc2coCisJICAgIGttcF9tc193YXJuaW5nLAorCSAgICBLTVBfTVNHKCBDYW50T3Blbk1lc3NhZ2VDYXRhbG9nLCBwYXRoLnN0ciApLAorCSAgICBLTVBfU1lTRVJSQ09ERSggZXJyb3IgKSwKKyAgICAgICAgICAgICggZXJyb3IgPT0gRVJST1JfQkFEX0VYRV9GT1JNQVQgPyBLTVBfSE5UKCBCYWRFeGVGb3JtYXQsIHBhdGguc3RyLCBLTVBfQVJDSF9TVFIgKSA6IF9fa21wX21zZ19udWxsICksCisJICAgIF9fa21wX21zZ19udWxsCisJKTsKKwlLTVBfSU5GT1JNKCBXaWxsVXNlRGVmYXVsdE1lc3NhZ2VzICk7CisgICAgICB9CisgICAgfSBlbHNlIHsgLy8gc3RhdHVzID09IEtNUF9JMThOX09QRU5FRAorCisgICAgICAgIGludCBzZWN0aW9uID0gZ2V0X3NlY3Rpb24oIGttcF9pMThuX3BycF9WZXJzaW9uICk7CisgICAgICAgIGludCBudW1iZXIgID0gZ2V0X251bWJlcigga21wX2kxOG5fcHJwX1ZlcnNpb24gKTsKKyAgICAgICAgY2hhciBjb25zdCAqIGV4cGVjdGVkID0gX19rbXBfaTE4bl9kZWZhdWx0X3RhYmxlLnNlY3RbIHNlY3Rpb24gXS5zdHJbIG51bWJlciBdOworICAgICAgICBrbXBfc3RyX2J1Zl90IHZlcnNpb247ICAgLy8gQWN0dWFsIHZlcnNpb24gb2YgdGhlIGNhdGFsb2cuCisgICAgICAgIF9fa21wX3N0cl9idWZfaW5pdCggJiB2ZXJzaW9uICk7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICYgdmVyc2lvbiwgIiVzIiwgX19fY2F0Z2V0cygga21wX2kxOG5fcHJwX1ZlcnNpb24gKSApOworICAgICAgICAgICAgLy8gU3RyaW5nIHJldHVybmVkIGJ5IGNhdGdldHMgaXMgaW52YWxpZCBhZnRlciBjbG9zaW5nIHRoZSBjYXRhbG9nLCBzbyBjb3B5IGl0LgorICAgICAgICBpZiAoIHN0cmNtcCggdmVyc2lvbi5zdHIsIGV4cGVjdGVkICkgIT0gMCApIHsKKyAgICAgICAgICAgIC8vIENsb3NlIGJhZCBjYXRhbG9nLgorICAgICAgICAgICAgX19rbXBfaTE4bl9jYXRjbG9zZSgpOworICAgICAgICAgICAgc3RhdHVzID0gS01QX0kxOE5fQUJTRU5UOyAgLy8gQW5kIG1hcmsgaXQgYXMgYWJzZW50LgorICAgICAgICAgICAgaWYgKF9fa21wX2dlbmVyYXRlX3dhcm5pbmdzID4ga21wX3dhcm5pbmdzX2xvdykgeworICAgICAgICAgICAgICAgIC8vIEFuZCBub3cgcHJpbnQgYSB3YXJuaW5nIHVzaW5nIGRlZmF1bHQgbWVzc2FnZXMuCisgICAgICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgICAgICBrbXBfbXNfd2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgS01QX01TRyggV3JvbmdNZXNzYWdlQ2F0YWxvZywgcGF0aC5zdHIsIHZlcnNpb24uc3RyLCBleHBlY3RlZCApLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgS01QX0lORk9STSggV2lsbFVzZURlZmF1bHRNZXNzYWdlcyApOworICAgICAgICAgICAgfSAvLyBfX2ttcF9nZW5lcmF0ZV93YXJuaW5ncworICAgICAgICB9OyAvLyBpZgorICAgICAgICBfX2ttcF9zdHJfYnVmX2ZyZWUoICYgdmVyc2lvbiApOworCisgICAgfTsgLy8gaWYKKyAgICBjb2RlX3BhZ2UgPSBnZXRfY29kZV9wYWdlKCk7CisKKyAgICBlbmQ6CisgICAgICAgIF9fa21wX3N0cl9idWZfZnJlZSggJiBwYXRoICk7CisgICAgICAgIHJldHVybjsKKworfSAvLyBmdW5jIF9fa21wX2kxOG5fZG9fY2F0b3BlbgorCisKK3ZvaWQKK19fa21wX2kxOG5fY2F0Y2xvc2UoCispIHsKKyAgICBpZiAoIHN0YXR1cyA9PSBLTVBfSTE4Tl9PUEVORUQgKSB7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGNhdCAhPSBLTVBfSTE4Tl9OVUxMQ0FUICk7CisgICAgICAgIGttcF9pMThuX3RhYmxlX2ZyZWUoICYgdGFibGUgKTsKKyAgICAgICAgRnJlZUxpYnJhcnkoIGNhdCApOworICAgICAgICBjYXQgPSBLTVBfSTE4Tl9OVUxMQ0FUOworICAgIH07IC8vIGlmCisgICAgY29kZV9wYWdlID0gZGVmYXVsdF9jb2RlX3BhZ2U7CisgICAgc3RhdHVzID0gS01QX0kxOE5fQ0xPU0VEOworfSAvLyBmdW5jIF9fa21wX2kxOG5fY2F0Y2xvc2UKKworLyoKKyAgICBXZSB1c2UgRm9ybWF0TWVzc2FnZSgpIHRvIGdldCBzdHJpbmdzIGZyb20gY2F0YWxvZywgZ2V0IHN5c3RlbSBlcnJvciBtZXNzYWdlcywgZXRjLgorICAgIEZvcm1hdE1lc3NhZ2UoKSB0ZW5kcyB0byByZXR1cm4gV2luZG93cyogT1Mtc3R5bGUgZW5kLW9mLWxpbmVzLCAiXHJcbiIuIFdoZW4gc3RyaW5nIGlzIHByaW50ZWQsCisgICAgcHJpbnRmKCkgYWxzbyByZXBsYWNlcyBhbGwgdGhlIG9jY3VycmVuY2VzIG9mICJcbiIgd2l0aCAiXHJcbiIgKGFnYWluISksIHNvIHNlcXVlbmNlcyBsaWtlCisgICAgIlxyXHJcclxuIiBhcHBlYXIgaW4gb3V0cHV0LiBJdCBpcyBub3QgdG9vIGdvb2QuCisKKyAgICBBZGRpdGlvbmFsIG1lc3MgY29tZXMgZnJvbSBtZXNzYWdlIGNhdGFsb2c6IE91ciBjYXRhbG9nIHNvdXJjZSBlbl9VUy5tYyBmaWxlIChnZW5lcmF0ZWQgYnkKKyAgICBtZXNzYWdlLWNvbnZlcnRlci5wbCkgY29udGFpbnMgb25seSAiXG4iIGNoYXJhY3RlcnMsIGJ1dCBlbl9VU19tc2dfMTAzMy5iaW4gZmlsZSAocHJvZHVjZWQgYnkKKyAgICBtYy5leGUpIG1heSBjb250YWluICJcclxuIiBvciBqdXN0ICJcbiIuIFRoaXMgbWVzcyBnb2VzIGZyb20gZW5fVVNfbXNnXzEwMzMuYmluIGZpbGUgdG8KKyAgICBtZXNzYWdlIGNhdGFsb2csIGxpYmlvbXA1dWkuZGxsLiBGb3IgZXhhbXBsZSwgbWVzc2FnZQorCisgICAgICAgIEVycm9yCisKKyAgICAodGhlcmUgaXMgIlxuIiBhdCB0aGUgZW5kKSBpcyBjb21waWxlZCBieSBtYy5leGUgdG8gIkVycm9yXHJcbiIsIHdoaWxlCisKKyAgICAgICAgT01QOiBFcnJvciAlMSFkITogJTIhcyFcbgorCisgICAgKHRoZXJlIGlzICJcbiIgYXQgdGhlIGVuZCBhcyB3ZWxsKSBpcyBjb21waWxlZCB0byAiT01QOiBFcnJvciAlMSFkITogJTIhcyFcclxuXG4iLgorCisgICAgVGh1cywgc3RyaXBwaW5nIGFsbCAiXHIiIG5vcm1hbGl6ZXMgc3RyaW5nIGFuZCByZXR1cm5zIGl0IHRvIGNhbm9uaWNhbCBmb3JtLCBzbyBwcmludGYoKSB3aWxsCisgICAgcHJvZHVjZSBjb3JyZWN0IGVuZC1vZi1saW5lIHNlcXVlbmNlcy4KKworICAgIF9fX3N0cmlwX2NycygpIHNlcnZlcyBmb3IgdGhpcyBwdXJwb3NlOiBpdCByZW1vdmVzIGFsbCB0aGUgb2NjdXJyZW5jZXMgb2YgIlxyIiBpbi1wbGFjZSBhbmQKKyAgICByZXR1cm5zIG5ldyBsZW5ndGggb2Ygc3RyaW5nLgorKi8KK3N0YXRpYworaW50CitfX19zdHJpcF9jcnMoCisgICAgY2hhciAqIHN0cgorKSB7CisgICAgaW50IGluICA9IDA7ICAvLyBJbnB1dCBjaGFyYWN0ZXIgaW5kZXguCisgICAgaW50IG91dCA9IDA7ICAvLyBPdXRwdXQgY2hhcmFjdGVyIGluZGV4LgorICAgIGZvciAoIDsgOyApIHsKKyAgICAgICAgaWYgKCBzdHJbIGluIF0gIT0gJ1xyJyApIHsKKyAgICAgICAgICAgIHN0clsgb3V0IF0gPSBzdHJbIGluIF07CisgICAgICAgICAgICArKyBvdXQ7CisgICAgICAgIH07IC8vIGlmCisgICAgICAgIGlmICggc3RyWyBpbiBdID09IDAgKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgKysgaW47CisgICAgfTsgLy8gZm9yZXZlcgorICAgIHJldHVybiBvdXQgLSAxOworfSAvLyBmdW5jIF9fc3RyaXBfY3JzCisKKworc3RhdGljCitjaGFyIGNvbnN0ICoKK19fX2NhdGdldHMoCisgICAga21wX2kxOG5faWRfdCAgaWQKKykgeworCisgICAgY2hhciAqICAgIHJlc3VsdCA9IE5VTEw7CisgICAgUFZPSUQgICAgIGFkZHIgICA9IE5VTEw7CisgICAgd2NoYXJfdCAqIHdtc2cgICA9IE5VTEw7CisgICAgRFdPUkQgICAgIHdsZW4gICA9IDA7CisgICAgY2hhciAqICAgIG1zZyAgICA9IE5VTEw7CisgICAgaW50ICAgICAgIGxlbiAgICA9IDA7CisgICAgaW50ICAgICAgIHJjOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggY2F0ICE9IEtNUF9JMThOX05VTExDQVQgKTsKKyAgICB3bGVuID0gICAgLy8gd2xlbiBkb2VzICpub3QqIGluY2x1ZGUgdGVybWluYXRpbmcgbnVsbC4KKyAgICAgICAgRm9ybWF0TWVzc2FnZVcoCisgICAgICAgICAgICBGT1JNQVRfTUVTU0FHRV9BTExPQ0FURV9CVUZGRVIgfCBGT1JNQVRfTUVTU0FHRV9GUk9NX0hNT0RVTEUgfAorICAgICAgICAgICAgICAgIEZPUk1BVF9NRVNTQUdFX0lHTk9SRV9JTlNFUlRTLAorICAgICAgICAgICAgY2F0LAorICAgICAgICAgICAgaWQsCisgICAgICAgICAgICAwLCAgICAgICAgICAgICAvLyBMYW5nSWQKKyAgICAgICAgICAgIChMUFdTVFIpICYgYWRkciwKKyAgICAgICAgICAgIDAsICAgICAgICAgICAgIC8vIFNpemUgaW4gZWxlbWVudHMsIG5vdCBpbiBieXRlcy4KKyAgICAgICAgICAgIE5VTEwKKyAgICAgICAgKTsKKyAgICBpZiAoIHdsZW4gPD0gMCApIHsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfTsgLy8gaWYKKyAgICB3bXNnID0gKHdjaGFyX3QgKikgYWRkcjsgIC8vIFdhcm5pbmc6IHdtc2cgbWF5IGJlIG5vdCBudWwtdGVybWluYXRlZCEKKworICAgIC8vIENhbGN1bGF0ZSBsZW5ndGggb2YgbXVsdGlieXRlIG1lc3NhZ2UuCisgICAgbGVuID0gICAgIC8vIFNpbmNlIHdsZW4gZG9lcyBub3QgaW5jbHVkZSB0ZXJtaW5hdGluZyBudWxsLCBsZW4gZG9lcyBub3QgaW5jbHVkZSBpdCBhbHNvLgorICAgICAgICBXaWRlQ2hhclRvTXVsdGlCeXRlKAorICAgICAgICAgICAgY29kZV9wYWdlLAorICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgLy8gRmxhZ3MuCisgICAgICAgICAgICB3bXNnLCB3bGVuLCAgICAgICAvLyBXaWRlIGJ1ZmZlciBhbmQgc2l6ZS4KKyAgICAgICAgICAgIE5VTEwsIDAsICAgICAgICAgIC8vIEJ1ZmZlciBhbmQgc2l6ZS4KKyAgICAgICAgICAgIE5VTEwsIE5VTEwgICAgICAgIC8vIERlZmF1bHQgY2hhciBhbmQgdXNlZCBkZWZhdWx0IGNoYXIuCisgICAgICAgICk7CisgICAgaWYgKCBsZW4gPD0gMCApIHsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfTsgLy8gaWYKKworICAgIC8vIEFsbG9jYXRlIG1lbW9yeS4KKyAgICBtc2cgPSAoY2hhciAqKSBLTVBfSU5URVJOQUxfTUFMTE9DKCBsZW4gKyAxICk7CisKKyAgICAvLyBDb252ZXJ0IHdpZGUgbWVzc2FnZSB0byBtdWx0aWJ5dGUgb25lLgorICAgIHJjID0KKyAgICAgICAgV2lkZUNoYXJUb011bHRpQnl0ZSgKKyAgICAgICAgICAgIGNvZGVfcGFnZSwKKyAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgIC8vIEZsYWdzLgorICAgICAgICAgICAgd21zZywgd2xlbiwgICAgICAgLy8gV2lkZSBidWZmZXIgYW5kIHNpemUuCisgICAgICAgICAgICBtc2csIGxlbiwgICAgICAgICAvLyBCdWZmZXIgYW5kIHNpemUuCisgICAgICAgICAgICBOVUxMLCBOVUxMICAgICAgICAvLyBEZWZhdWx0IGNoYXIgYW5kIHVzZWQgZGVmYXVsdCBjaGFyLgorICAgICAgICApOworICAgIGlmICggcmMgPD0gMCB8fCByYyA+IGxlbiApIHsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfTsgLy8gaWYKKyAgICBLTVBfREVCVUdfQVNTRVJUKCByYyA9PSBsZW4gKTsKKyAgICBsZW4gPSByYzsKKyAgICBtc2dbIGxlbiBdID0gMDsgICAgICAgICAgIC8vIFB1dCB0ZXJtaW5hdGluZyBudWxsIHRvIHRoZSBlbmQuCisKKyAgICAvLyBTdHJpcHBpbmcgYWxsICJcciIgYmVmb3JlIHN0cmlwcGluZyBsYXN0IGVuZC1vZi1saW5lIHNpbXBsaWZpZXMgdGhlIHRhc2suCisgICAgbGVuID0gX19fc3RyaXBfY3JzKCBtc2cgKTsKKworICAgIC8vIEV2ZXJ5IG1lc3NhZ2UgaW4gY2F0YWxvZyBpcyB0ZXJtaW5hdGVkIHdpdGggIlxuIi4gU3RyaXAgaXQuCisgICAgaWYgKCBsZW4gPj0gMSAmJiBtc2dbIGxlbiAtIDEgXSA9PSAnXG4nICkgeworICAgICAgICAtLSBsZW47CisgICAgICAgIG1zZ1sgbGVuIF0gPSAwOworICAgIH07IC8vIGlmCisKKyAgICAvLyBFdmVyeXRoaW5nIGxvb2tzIG9rLgorICAgIHJlc3VsdCA9IG1zZzsKKyAgICBtc2cgICAgPSBOVUxMOworCisgICAgZW5kOgorCisgICAgaWYgKCBtc2cgIT0gTlVMTCApIHsKKyAgICAgICAgS01QX0lOVEVSTkFMX0ZSRUUoIG1zZyApOworICAgIH07IC8vIGlmCisgICAgaWYgKCB3bXNnICE9IE5VTEwgKSB7CisgICAgICAgIExvY2FsRnJlZSggd21zZyApOworICAgIH07IC8vIGlmCisKKyAgICByZXR1cm4gcmVzdWx0OworCit9IC8vIF9fX2NhdGdldHMKKworCitjaGFyIGNvbnN0ICoKK19fa21wX2kxOG5fY2F0Z2V0cygKKyAgICBrbXBfaTE4bl9pZF90ICBpZAorKSB7CisKKyAgICBpbnQgc2VjdGlvbiA9IGdldF9zZWN0aW9uKCBpZCApOworICAgIGludCBudW1iZXIgID0gZ2V0X251bWJlciggaWQgKTsKKyAgICBjaGFyIGNvbnN0ICogbWVzc2FnZSA9IE5VTEw7CisKKyAgICBpZiAoIDEgPD0gc2VjdGlvbiAmJiBzZWN0aW9uIDw9IF9fa21wX2kxOG5fZGVmYXVsdF90YWJsZS5zaXplICkgeworICAgICAgICBpZiAoIDEgPD0gbnVtYmVyICYmIG51bWJlciA8PSBfX2ttcF9pMThuX2RlZmF1bHRfdGFibGUuc2VjdFsgc2VjdGlvbiBdLnNpemUgKSB7CisgICAgICAgICAgICBpZiAoIHN0YXR1cyA9PSBLTVBfSTE4Tl9DTE9TRUQgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfaTE4bl9jYXRvcGVuKCk7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgaWYgKCBjYXQgIT0gS01QX0kxOE5fTlVMTENBVCApIHsKKyAgICAgICAgICAgICAgICBpZiAoIHRhYmxlLnNpemUgPT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgdGFibGUuc2VjdCA9IChrbXBfaTE4bl9zZWN0aW9uX3QgKikKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9JTlRFUk5BTF9DQUxMT0MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCBfX2ttcF9pMThuX2RlZmF1bHRfdGFibGUuc2l6ZSArIDIgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoIGttcF9pMThuX3NlY3Rpb25fdCApCisgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAgICB0YWJsZS5zaXplID0gX19rbXBfaTE4bl9kZWZhdWx0X3RhYmxlLnNpemU7CisgICAgICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgICAgICBpZiAoIHRhYmxlLnNlY3RbIHNlY3Rpb24gXS5zaXplID09IDAgKSB7CisgICAgICAgICAgICAgICAgICAgIHRhYmxlLnNlY3RbIHNlY3Rpb24gXS5zdHIgPSAoY29uc3QgY2hhciAqKikKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9JTlRFUk5BTF9DQUxMT0MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfaTE4bl9kZWZhdWx0X3RhYmxlLnNlY3RbIHNlY3Rpb24gXS5zaXplICsgMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoIGNoYXIgY29uc3QgKiApCisgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAgICB0YWJsZS5zZWN0WyBzZWN0aW9uIF0uc2l6ZSA9IF9fa21wX2kxOG5fZGVmYXVsdF90YWJsZS5zZWN0WyBzZWN0aW9uIF0uc2l6ZTsKKyAgICAgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgICAgIGlmICggdGFibGUuc2VjdFsgc2VjdGlvbiBdLnN0clsgbnVtYmVyIF0gPT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICAgICAgdGFibGUuc2VjdFsgc2VjdGlvbiBdLnN0clsgbnVtYmVyIF0gPSBfX19jYXRnZXRzKCBpZCApOworICAgICAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICAgICAgbWVzc2FnZSA9IHRhYmxlLnNlY3RbIHNlY3Rpb24gXS5zdHJbIG51bWJlciBdOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgIGlmICggbWVzc2FnZSA9PSBOVUxMICkgeworICAgICAgICAgICAgICAgIC8vIENhdGFsb2cgaXMgbm90IG9wZW5lZCBvciBtZXNzYWdlIGlzIG5vdCBmb3VuZCwgcmV0dXJuIGRlZmF1bHQgbWVzc2FnZS4KKyAgICAgICAgICAgICAgICBtZXNzYWdlID0gX19rbXBfaTE4bl9kZWZhdWx0X3RhYmxlLnNlY3RbIHNlY3Rpb24gXS5zdHJbIG51bWJlciBdOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgfTsgLy8gaWYKKyAgICB9OyAvLyBpZgorICAgIGlmICggbWVzc2FnZSA9PSBOVUxMICkgeworICAgICAgICBtZXNzYWdlID0gbm9fbWVzc2FnZV9hdmFpbGFibGU7CisgICAgfTsgLy8gaWYKKyAgICByZXR1cm4gbWVzc2FnZTsKKworfSAvLyBmdW5jIF9fa21wX2kxOG5fY2F0Z2V0cworCisKKyNlbmRpZiAvLyBLTVBfT1NfV0lORE9XUworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZm5kZWYgS01QX0kxOE5fT0sKKyAgICAjZXJyb3IgSTE4biBzdXBwb3J0IGlzIG5vdCBpbXBsZW1lbnRlZCBmb3IgdGhpcyBPUy4KKyNlbmRpZiAvLyBLTVBfSTE4Tl9PSworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQKK19fa21wX2kxOG5fZHVtcF9jYXRhbG9nKAorICAgIGttcF9zdHJfYnVmX3QgKiBidWZmZXIKKykgeworCisgICAgc3RydWN0IGttcF9pMThuX2lkX3JhbmdlX3QgeworICAgICAgICBrbXBfaTE4bl9pZF90ICBmaXJzdDsKKyAgICAgICAga21wX2kxOG5faWRfdCAgbGFzdDsKKyAgICB9OyAvLyBzdHJ1Y3Qga21wX2kxOG5faWRfcmFuZ2VfdAorCisgICAgc3RhdGljIHN0cnVjdCBrbXBfaTE4bl9pZF9yYW5nZV90IHJhbmdlc1tdID0geworICAgICAgICB7IGttcF9pMThuX3BycF9maXJzdCwga21wX2kxOG5fcHJwX2xhc3QgfSwKKyAgICAgICAgeyBrbXBfaTE4bl9zdHJfZmlyc3QsIGttcF9pMThuX3N0cl9sYXN0IH0sCisgICAgICAgIHsga21wX2kxOG5fZm10X2ZpcnN0LCBrbXBfaTE4bl9mbXRfbGFzdCB9LAorICAgICAgICB7IGttcF9pMThuX21zZ19maXJzdCwga21wX2kxOG5fbXNnX2xhc3QgfSwKKyAgICAgICAgeyBrbXBfaTE4bl9obnRfZmlyc3QsIGttcF9pMThuX2hudF9sYXN0IH0KKyAgICB9OyAvLyByYW5nZXMKKworICAgIGludCAgICAgICAgICAgbnVtX29mX3JhbmdlcyA9IHNpemVvZiggcmFuZ2VzICkgLyBzaXplb2YoIHN0cnVjdCBrbXBfaTE4bl9pZF9yYW5nZV90ICk7CisgICAgaW50ICAgICAgICAgICByYW5nZTsKKyAgICBrbXBfaTE4bl9pZF90IGlkOworCisgICAgZm9yICggcmFuZ2UgPSAwOyByYW5nZSA8IG51bV9vZl9yYW5nZXM7ICsrIHJhbmdlICkgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIqKiogU2V0ICMlZCAqKipcbiIsIHJhbmdlICsgMSApOworICAgICAgICBmb3IgKCBpZCA9IChrbXBfaTE4bl9pZF90KSggcmFuZ2VzWyByYW5nZSBdLmZpcnN0ICsgMSApOworICAgICAgICAgICAgICBpZCA8IHJhbmdlc1sgcmFuZ2UgXS5sYXN0OworICAgICAgICAgICAgICBpZCA9IChrbXBfaTE4bl9pZF90KSggaWQgKyAxICkgKSB7CisgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJWQ6IDw8JXM+PlxuIiwgaWQsIF9fa21wX2kxOG5fY2F0Z2V0cyggaWQgKSApOworICAgICAgICB9OyAvLyBmb3IgaWQKKyAgICB9OyAvLyBmb3IgcmFuZ2UKKworICAgIF9fa21wX3ByaW50ZiggIiVzIiwgYnVmZmVyLT5zdHIgKTsKKworfSAvLyBfX2ttcF9pMThuX2R1bXBfY2F0YWxvZworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ttcF9tc2dfdAorX19rbXBfbXNnX2Zvcm1hdCgKKyAgICBrbXBfaTE4bl9pZF90IGlkLAorICAgIC4uLgorKSB7CisKKyAgICBrbXBfbXNnX3QgICAgICBtc2c7CisgICAgdmFfbGlzdCAgICAgICAgYXJnczsKKyAgICBrbXBfc3RyX2J1Zl90ICBidWZmZXI7CisgICAgX19rbXBfc3RyX2J1Zl9pbml0KCAmIGJ1ZmZlciApOworCisgICAgdmFfc3RhcnQoIGFyZ3MsIGlkICk7CisgICAgI2lmIEtNUF9PU19VTklYCisgICAgICAgIC8vIE9uIExpbnV4KiBPUyBhbmQgT1MgWCosIHByaW50ZigpIGZhbWlseSBmdW5jdGlvbnMgcHJvY2VzcyBwYXJhbWV0ZXIgbnVtYmVycywgZm9yIGV4YW1wbGU6CisgICAgICAgIC8vICIlMiRzICUxJHMiLgorICAgICAgICBfX2ttcF9zdHJfYnVmX3ZwcmludCggJiBidWZmZXIsIF9fa21wX2kxOG5fY2F0Z2V0cyggaWQgKSwgYXJncyApOworICAgICNlbGlmIEtNUF9PU19XSU5ET1dTCisgICAgICAgIC8vIE9uIFdpbm9kd3MsIHByaW50ZigpIGZhbWlseSBmdW5jdGlvbnMgZG9lcyBub3QgcmVjb2duaXplIEdOVSBzdHlsZSBwYXJhbWV0ZXIgbnVtYmVycywKKyAgICAgICAgLy8gc28gd2UgaGF2ZSB0byB1c2UgRm9ybWF0TWVzc2FnZSgpIGluc3RlYWQuIEl0IHJlY29nbml6ZXMgcGFyYW1ldGVyIG51bWJlcnMsIGUuIGcuOgorICAgICAgICAvLyAiJTIhcyEgIiUxIXMhIi4KKyAgICAgICAgeworICAgICAgICAgICAgTFBUU1RSIHN0ciA9IE5VTEw7CisgICAgICAgICAgICBpbnQgICAgbGVuOworICAgICAgICAgICAgRm9ybWF0TWVzc2FnZSgKKyAgICAgICAgICAgICAgICBGT1JNQVRfTUVTU0FHRV9GUk9NX1NUUklORyB8IEZPUk1BVF9NRVNTQUdFX0FMTE9DQVRFX0JVRkZFUiwKKyAgICAgICAgICAgICAgICBfX2ttcF9pMThuX2NhdGdldHMoIGlkICksCisgICAgICAgICAgICAgICAgMCwgMCwKKyAgICAgICAgICAgICAgICAoTFBUU1RSKSggJiBzdHIgKSwKKyAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICYgYXJncworICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIGxlbiA9IF9fX3N0cmlwX2Nycyggc3RyICk7CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX2NhdCggJiBidWZmZXIsIHN0ciwgbGVuICk7CisgICAgICAgICAgICBMb2NhbEZyZWUoIHN0ciApOworICAgICAgICB9CisgICAgI2Vsc2UKKyAgICAgICAgI2Vycm9yCisgICAgI2VuZGlmCisgICAgdmFfZW5kKCBhcmdzICk7CisgICAgX19rbXBfc3RyX2J1Zl9kZXRhY2goICYgYnVmZmVyICk7CisKKyAgICBtc2cudHlwZSA9IChrbXBfbXNnX3R5cGVfdCkoIGlkID4+IDE2ICk7CisgICAgbXNnLm51bSAgPSBpZCAmIDB4RkZGRjsKKyAgICBtc2cuc3RyICA9IGJ1ZmZlci5zdHI7CisgICAgbXNnLmxlbiAgPSBidWZmZXIudXNlZDsKKworICAgIHJldHVybiBtc2c7CisKK30gLy8gX19rbXBfbXNnX2Zvcm1hdAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYworY2hhciAqCitzeXNfZXJyb3IoCisgICAgaW50IGVycgorKSB7CisKKyAgICBjaGFyICogbWVzc2FnZSA9IE5VTEw7CisKKyAgICAjaWYgS01QX09TX1dJTkRPV1MKKworICAgICAgICBMUFZPSUQgIGJ1ZmZlciA9IE5VTEw7CisgICAgICAgIGludCAgICAgbGVuOworICAgICAgICBEV09SRCAgIHJjOworICAgICAgICByYyA9CisgICAgICAgICAgICBGb3JtYXRNZXNzYWdlKAorICAgICAgICAgICAgICAgIEZPUk1BVF9NRVNTQUdFX0FMTE9DQVRFX0JVRkZFUiB8IEZPUk1BVF9NRVNTQUdFX0ZST01fU1lTVEVNLAorICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgZXJyLAorICAgICAgICAgICAgICAgIE1BS0VMQU5HSUQoIExBTkdfTkVVVFJBTCwgU1VCTEFOR19ERUZBVUxUICksIC8vIERlZmF1bHQgbGFuZ3VhZ2UuCisgICAgICAgICAgICAgICAgKExQVFNUUikgJiBidWZmZXIsCisgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICBOVUxMCisgICAgICAgICAgICApOworICAgICAgICBpZiAoIHJjID4gMCApIHsKKyAgICAgICAgICAgIC8vIE1lc3NhZ2UgZm9ybWF0dGVkLiBDb3B5IGl0IChzbyB3ZSBjYW4gZnJlZSBpdCBsYXRlciB3aXRoIG5vcm1hbCBmcmVlKCkuCisgICAgICAgICAgICBtZXNzYWdlID0gX19rbXBfc3RyX2Zvcm1hdCggIiVzIiwgKGNoYXIgKikgYnVmZmVyICk7CisgICAgICAgICAgICBsZW4gPSBfX19zdHJpcF9jcnMoIG1lc3NhZ2UgKTsgLy8gRGVsZXRlIGNhcnJpYWdlIHJldHVybnMgaWYgYW55LgorICAgICAgICAgICAgLy8gU3RyaXAgdHJhaWxpbmcgbmV3bGluZXMuCisgICAgICAgICAgICB3aGlsZSAoIGxlbiA+IDAgJiYgbWVzc2FnZVsgbGVuIC0gMSBdID09ICdcbicgKSB7CisgICAgICAgICAgICAgICAgLS0gbGVuOworICAgICAgICAgICAgfTsgLy8gd2hpbGUKKyAgICAgICAgICAgIG1lc3NhZ2VbIGxlbiBdID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIEZvcm1hdE1lc3NhZ2UoKSBmYWlsZWQgdG8gZm9ybWF0IHN5c3RlbSBlcnJvciBtZXNzYWdlLiBHZXRMYXN0RXJyb3IoKSB3b3VsZCBnaXZlIHVzCisgICAgICAgICAgICAvLyBlcnJvciBjb2RlLCB3aGljaCB3ZSB3b3VsZCBjb252ZXJ0IHRvIG1lc3NhZ2UuLi4gdGhpcyBpdCBkYW5nZXJvdXMgcmVjdXJzaW9uLCB3aGljaAorICAgICAgICAgICAgLy8gY2Fubm90IGNsYXJpZnkgb3JpZ2luYWwgZXJyb3IsIHNvIHdlIHdpbGwgbm90IGV2ZW4gc3RhcnQgaXQuCisgICAgICAgIH07IC8vIGlmCisgICAgICAgIGlmICggYnVmZmVyICE9IE5VTEwgKSB7CisgICAgICAgICAgICBMb2NhbEZyZWUoIGJ1ZmZlciApOworICAgICAgICB9OyAvLyBpZgorCisgICAgI2Vsc2UgLy8gTm9uLVdpbmRvd3MqIE9TOiBMaW51eCogT1Mgb3IgT1MgWCoKKworICAgICAgICAvKgorICAgICAgICAgICAgVGhlcmUgYXJlIDIgaW5jb21wYXRpYmxlIHZlcnNpb25zIG9mIHN0cmVycm9yX3I6CisKKyAgICAgICAgICAgICAgICBjaGFyICogc3RyZXJyb3JfciggaW50LCBjaGFyICosIHNpemVfdCApOyAgLy8gR05VIHZlcnNpb24KKyAgICAgICAgICAgICAgICBpbnQgICAgc3RyZXJyb3JfciggaW50LCBjaGFyICosIHNpemVfdCApOyAgLy8gWFNJIHZlcnNpb24KKyAgICAgICAgKi8KKworICAgICAgICAjaWYgS01QX09TX0xJTlVYCisKKyAgICAgICAgICAgIC8vIEdOVSB2ZXJzaW9uIG9mIHN0cmVycm9yX3IuCisKKyAgICAgICAgICAgIGNoYXIgICBidWZmZXJbIDIwNDggXTsKKyAgICAgICAgICAgIGNoYXIgKiBjb25zdCBlcnJfbXNnID0gc3RyZXJyb3JfciggZXJyLCBidWZmZXIsIHNpemVvZiggYnVmZmVyICkgKTsKKyAgICAgICAgICAgICAgICAvLyBEbyBub3QgZWxpbWluYXRlIHRoaXMgYXNzaWdubWVudCB0byB0ZW1wb3JhcnkgdmFyaWFibGUsIG90aGVyd2lzZSBjb21waWxlciB3b3VsZAorICAgICAgICAgICAgICAgIC8vIG5vdCBpc3N1ZSB3YXJuaW5nIGlmIHN0cmVycm9yX3IoKSByZXR1cm5zIGBpbnQnIGluc3RlYWQgb2YgZXhwZWN0ZWQgYGNoYXIgKicuCisgICAgICAgICAgICBtZXNzYWdlID0gX19rbXBfc3RyX2Zvcm1hdCggIiVzIiwgZXJyX21zZyApOworCisgICAgICAgICNlbHNlIC8vIE9TIFgqLCBGcmVlQlNEKiBldGMuCisKKyAgICAgICAgICAgIC8vIFhTSSB2ZXJzaW9uIG9mIHN0cmVycm9yX3IuCisKKyAgICAgICAgICAgIGludCAgICBzaXplICAgPSAyMDQ4OworICAgICAgICAgICAgLy8gVE9ETzogQWRkIGNoZWNraW5nIHJlc3VsdCBvZiBtYWxsb2MoKS4KKyAgICAgICAgICAgIGNoYXIgKiBidWZmZXIgPSAoY2hhciAqKSBLTVBfSU5URVJOQUxfTUFMTE9DKCBzaXplICk7CisgICAgICAgICAgICBpbnQgICAgcmM7CisgICAgICAgICAgICByYyA9IHN0cmVycm9yX3IoIGVyciwgYnVmZmVyLCBzaXplICk7CisgICAgICAgICAgICBpZiAoIHJjID09IC0xICkgeworICAgICAgICAgICAgICAgIHJjID0gZXJybm87ICAgICAgICAgICAgLy8gWFNJIHZlcnNpb24gc2V0cyBlcnJuby4KKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICB3aGlsZSAoIHJjID09IEVSQU5HRSApIHsgICAvLyBFUkFOR0UgbWVhbnMgdGhlIGJ1ZmZlciBpcyB0b28gc21hbGwuCisgICAgICAgICAgICAgICAgS01QX0lOVEVSTkFMX0ZSRUUoIGJ1ZmZlciApOworICAgICAgICAgICAgICAgIHNpemUgKj0gMjsKKyAgICAgICAgICAgICAgICBidWZmZXIgPSAoY2hhciAqKSBLTVBfSU5URVJOQUxfTUFMTE9DKCBzaXplICk7CisgICAgICAgICAgICAgICAgcmMgPSBzdHJlcnJvcl9yKCBlcnIsIGJ1ZmZlciwgc2l6ZSApOworICAgICAgICAgICAgICAgIGlmICggcmMgPT0gLTEgKSB7CisgICAgICAgICAgICAgICAgICAgIHJjID0gZXJybm87ICAgICAgICAvLyBYU0kgdmVyc2lvbiBzZXRzIGVycm5vLgorICAgICAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICB9OyAvLyB3aGlsZQorICAgICAgICAgICAgaWYgKCByYyA9PSAwICkgeworICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBidWZmZXI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIEJ1ZmZlciBpcyB1bnVzZWQuIEZyZWUgaXQuCisgICAgICAgICAgICAgICAgS01QX0lOVEVSTkFMX0ZSRUUoIGJ1ZmZlciApOworICAgICAgICAgICAgfTsgLy8gaWYKKworICAgICAgICAjZW5kaWYKKworICAgICNlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAqLworCisgICAgaWYgKCBtZXNzYWdlID09IE5VTEwgKSB7CisgICAgICAgIC8vIFRPRE86IEkxOG4gdGhpcyBtZXNzYWdlLgorICAgICAgICBtZXNzYWdlID0gX19rbXBfc3RyX2Zvcm1hdCggIiVzIiwgIihObyBzeXN0ZW0gZXJyb3IgbWVzc2FnZSBhdmFpbGFibGUpIiApOworICAgIH07IC8vIGlmCisgICAgcmV0dXJuIG1lc3NhZ2U7CisKK30gLy8gc3lzX2Vycm9yCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwora21wX21zZ190CitfX2ttcF9tc2dfZXJyb3JfY29kZSgKKyAgICBpbnQgIGNvZGUKKykgeworCisgICAga21wX21zZ190ICAgICAgbXNnOworICAgIG1zZy50eXBlID0ga21wX210X3N5c2VycjsKKyAgICBtc2cubnVtICA9IGNvZGU7CisgICAgbXNnLnN0ciAgPSBzeXNfZXJyb3IoIGNvZGUgKTsKKyAgICBtc2cubGVuICA9IHN0cmxlbiggbXNnLnN0ciApOworICAgIHJldHVybiBtc2c7CisKK30gLy8gX19rbXBfbXNnX2Vycm9yX2NvZGUKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitrbXBfbXNnX3QKK19fa21wX21zZ19lcnJvcl9tZXNnKAorICAgIGNoYXIgY29uc3QgKiBtZXNnCispIHsKKworICAgIGttcF9tc2dfdCAgICAgIG1zZzsKKyAgICBtc2cudHlwZSA9IGttcF9tdF9zeXNlcnI7CisgICAgbXNnLm51bSAgPSAwOworICAgIG1zZy5zdHIgID0gX19rbXBfc3RyX2Zvcm1hdCggIiVzIiwgbWVzZyApOworICAgIG1zZy5sZW4gID0gc3RybGVuKCBtc2cuc3RyICk7CisgICAgcmV0dXJuIG1zZzsKKworfSAvLyBfX2ttcF9tc2dfZXJyb3JfbWVzZworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQKK19fa21wX21zZygKKyAgICBrbXBfbXNnX3NldmVyaXR5X3QgIHNldmVyaXR5LAorICAgIGttcF9tc2dfdCAgICAgICAgICAgbWVzc2FnZSwKKyAgICAuLi4KKykgeworCisgICAgdmFfbGlzdCAgICAgICAgYXJnczsKKyAgICBrbXBfaTE4bl9pZF90ICBmb3JtYXQ7ICAgICAgLy8gZm9ybWF0IGlkZW50aWZpZXIKKyAgICBrbXBfbXNnX3QgICAgICBmbXNnOyAgICAgICAgLy8gZm9ybWF0dGVkIG1lc3NhZ2UKKyAgICBrbXBfc3RyX2J1Zl90ICBidWZmZXI7CisKKyAgICBpZiAoIHNldmVyaXR5ICE9IGttcF9tc19mYXRhbCAmJiBfX2ttcF9nZW5lcmF0ZV93YXJuaW5ncyA9PSBrbXBfd2FybmluZ3Nfb2ZmICkKKyAgICAgICAgcmV0dXJuOyAvLyBubyByZWFzb24gdG8gZm9ybSBhIHN0cmluZyBpbiBvcmRlciB0byBub3QgcHJpbnQgaXQKKworICAgIF9fa21wX3N0cl9idWZfaW5pdCggJiBidWZmZXIgKTsKKworICAgIC8vIEZvcm1hdCB0aGUgcHJpbWFyeSBtZXNzYWdlLgorICAgIHN3aXRjaCAoIHNldmVyaXR5ICkgeworICAgICAgICBjYXNlIGttcF9tc19pbmZvcm0gOiB7CisgICAgICAgICAgICBmb3JtYXQgPSBrbXBfaTE4bl9mbXRfSW5mbzsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBrbXBfbXNfd2FybmluZyA6IHsKKyAgICAgICAgICAgIGZvcm1hdCA9IGttcF9pMThuX2ZtdF9XYXJuaW5nOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIGttcF9tc19mYXRhbCA6IHsKKyAgICAgICAgICAgIGZvcm1hdCA9IGttcF9pMThuX2ZtdF9GYXRhbDsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgZGVmYXVsdCA6IHsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIDAgKTsKKyAgICAgICAgfTsKKyAgICB9OyAvLyBzd2l0Y2gKKyAgICBmbXNnID0gX19rbXBfbXNnX2Zvcm1hdCggZm9ybWF0LCBtZXNzYWdlLm51bSwgbWVzc2FnZS5zdHIgKTsKKyAgICBLTVBfSU5URVJOQUxfRlJFRSggKHZvaWQgKikgbWVzc2FnZS5zdHIgKTsKKyAgICBfX2ttcF9zdHJfYnVmX2NhdCggJiBidWZmZXIsIGZtc2cuc3RyLCBmbXNnLmxlbiApOworICAgIEtNUF9JTlRFUk5BTF9GUkVFKCAodm9pZCAqKSBmbXNnLnN0ciApOworCisgICAgLy8gRm9ybWF0IG90aGVyIG1lc3NhZ2VzLgorICAgIHZhX3N0YXJ0KCBhcmdzLCBtZXNzYWdlICk7CisgICAgZm9yICggOyA7ICkgeworICAgICAgICBtZXNzYWdlID0gdmFfYXJnKCBhcmdzLCBrbXBfbXNnX3QgKTsKKyAgICAgICAgaWYgKCBtZXNzYWdlLnR5cGUgPT0ga21wX210X2R1bW15ICYmIG1lc3NhZ2Uuc3RyID09IE5VTEwgKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgaWYgKCBtZXNzYWdlLnR5cGUgPT0ga21wX210X2R1bW15ICYmIG1lc3NhZ2Uuc3RyID09IF9fa21wX21zZ19lbXB0eS5zdHIgKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgc3dpdGNoICggbWVzc2FnZS50eXBlICkgeworICAgICAgICAgICAgY2FzZSBrbXBfbXRfaGludCA6IHsKKyAgICAgICAgICAgICAgICBmb3JtYXQgPSBrbXBfaTE4bl9mbXRfSGludDsKKyAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICBjYXNlIGttcF9tdF9zeXNlcnIgOiB7CisgICAgICAgICAgICAgICAgZm9ybWF0ID0ga21wX2kxOG5fZm10X1N5c0VycjsKKyAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0IDogeworICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIDAgKTsKKyAgICAgICAgICAgIH07CisgICAgICAgIH07IC8vIHN3aXRjaAorICAgICAgICBmbXNnID0gX19rbXBfbXNnX2Zvcm1hdCggZm9ybWF0LCBtZXNzYWdlLm51bSwgbWVzc2FnZS5zdHIgKTsKKyAgICAgICAgS01QX0lOVEVSTkFMX0ZSRUUoICh2b2lkICopIG1lc3NhZ2Uuc3RyICk7CisgICAgICAgIF9fa21wX3N0cl9idWZfY2F0KCAmIGJ1ZmZlciwgZm1zZy5zdHIsIGZtc2cubGVuICk7CisgICAgICAgIEtNUF9JTlRFUk5BTF9GUkVFKCAodm9pZCAqKSBmbXNnLnN0ciApOworICAgIH07IC8vIGZvcmV2ZXIKKyAgICB2YV9lbmQoIGFyZ3MgKTsKKworICAgIC8vIFByaW50IGZvcm1hdHRlZCBtZXNzYWdlcy4KKyAgICAvLyBUaGlzIGxvY2sgcHJldmVudHMgbXVsdGlwbGUgZmF0YWwgZXJyb3JzIG9uIHRoZSBzYW1lIHByb2JsZW0uCisgICAgLy8gX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJiBsb2NrICk7ICAgIC8vIEdFSCAtIFRoaXMgbG9jayBjYXVzaW5nIHRlc3RzIHRvIGhhbmcgb24gT1MgWCouCisgICAgX19rbXBfcHJpbnRmKCAiJXMiLCBidWZmZXIuc3RyICk7CisgICAgX19rbXBfc3RyX2J1Zl9mcmVlKCAmIGJ1ZmZlciApOworCisgICAgaWYgKCBzZXZlcml0eSA9PSBrbXBfbXNfZmF0YWwgKSB7CisgICAgICAgICNpZiBLTVBfT1NfV0lORE9XUworICAgICAgICBfX2ttcF90aHJlYWRfc2xlZXAoIDUwMCApOyAgIC8qIERlbGF5IHRvIGdpdmUgbWVzc2FnZSBhIGNoYW5jZSB0byBhcHBlYXIgYmVmb3JlIHJlYXBpbmcgKi8KKyAgICAgICAgI2VuZGlmCisgICAgICAgIF9fa21wX2Fib3J0X3Byb2Nlc3MoKTsKKyAgICB9OyAvLyBpZgorCisgICAgLy8gX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJiBsb2NrICk7ICAvLyBHRUggLSB0aGlzIGxvY2sgY2F1c2luZyB0ZXN0cyB0byBoYW5nIG9uIE9TIFgqLgorCit9IC8vIF9fa21wX21zZworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIGVuZCBvZiBmaWxlIC8vCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfaTE4bi5oIGIvZmluYWwvcnVudGltZS9zcmMva21wX2kxOG4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWI0NjRlCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX2kxOG4uaApAQCAtMCwwICsxLDE5NSBAQAorLyoKKyAqIGttcF9pMThuLmgKKyAqICRSZXZpc2lvbjogNDI5NTEgJAorICogJERhdGU6IDIwMTQtMDEtMjEgMTQ6NDE6NDEgLTA2MDAgKFR1ZSwgMjEgSmFuIDIwMTQpICQKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBLTVBfSTE4Tl9ICisjZGVmaW5lIEtNUF9JMThOX0gKKworI2luY2x1ZGUgImttcF9zdHIuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgICAgZXh0ZXJuICJDIiB7CisjZW5kaWYgLy8gX19jcGx1c3BsdXMKKworLyoKKyAgICBrbXBfaTE4bl9pZC5pbmMgZGVmaW5lcyBrbXBfaTE4bl9pZF90IHR5cGUuIEl0IGlzIGFuIGVudW1lcmF0aW9uIHdpdGggaWRlbnRpZmllcnMgb2YgYWxsIHRoZQorICAgIG1lc3NhZ2VzIGluIHRoZSBjYXRhbG9nLiBUaGVyZSBpcyBvbmUgc3BlY2lhbCBpZGVudGlmaWVyOiBrbXBfaTE4bl9udWxsLCB3aGljaCBkZW5vdGVzIGFic2VuY2UKKyAgICBvZiBtZXNzYWdlLgorKi8KKyNpbmNsdWRlICJrbXBfaTE4bl9pZC5pbmMiIC8vIEdlbmVyYXRlZCBmaWxlLiBEbyBub3QgZWRpdCBpdCBtYW51YWxseS4KKworLyoKKyAgICBMb3ctbGV2ZWwgZnVuY3Rpb25zIGhhbmRsaW5nIG1lc3NhZ2UgY2F0YWxvZy4gX19rbXBfaTE4bl9vcGVuKCkgb3BlbnMgbWVzc2FnZSBjYXRhbG9nLAorICAgIF9fa21wX2kxOG5fY2xvc2VzKCkgaXQuIEV4cGxpY2l0IG9wZW5pbmcgaXMgbm90IHJlcXVpcmVkOiBpZiBtZXNzYWdlIGNhdGFsb2cgaXMgbm90IHlldCBvcGVuLAorICAgIF9fa21wX2kxOG5fY2F0Z2V0cygpIHdpbGwgb3BlbiBpdCBpbXBsaWNpdGx5LiBIb3dldmVyLCBjYXRhbG9nIHNob3VsZCBiZSBleHBsaWNpdGx5IGNsb3NlZCwKKyAgICBvdGhlcndpc2UgcmVzb3VyY2VzIChtYW1vcnksIGhhbmRsZXMpIG1heSBsZWFrLgorCisgICAgX19rbXBfaTE4bl9jYXRnZXRzKCkgcmV0dXJucyByZWFkLW9ubHkgc3RyaW5nLiBJdCBzaG91bGQgbm90IGJlIGZyZWVkLgorCisgICAgS01QX0kxOE5fU1RSIG1hY3JvIHNpbXBsaWZpZXMgYWNjZXMgdG8gc3RyaW5ncyBpbiBtZXNzYWdlIGNhdGFsb2cgYSBiaXQuIEZvbGxvd2luZyB0d28gbGluZXMgYXJlCisgICAgZXF1aXZhbGVudDoKKworICAgICAgICBfX2ttcF9pMThuX2NhdGdldHMoIGttcF9pMThuX3N0cl9XYXJuaW5nICkKKyAgICAgICAgS01QX0kxOE5fU1RSKCBXYXJuaW5nICkKKyovCisKK3ZvaWQgICAgICAgICAgICBfX2ttcF9pMThuX2NhdG9wZW4oKTsKK3ZvaWQgICAgICAgICAgICBfX2ttcF9pMThuX2NhdGNsb3NlKCk7CitjaGFyIGNvbnN0ICogICAgX19rbXBfaTE4bl9jYXRnZXRzKCBrbXBfaTE4bl9pZF90IGlkICk7CisKKyNkZWZpbmUgS01QX0kxOE5fU1RSKCBpZCApICAgIF9fa21wX2kxOG5fY2F0Z2V0cygga21wX2kxOG5fc3RyXyAjIyBpZCApCisKKworLyoKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEhpZ2gtbGV2ZWwgaW50ZXJmYWNlIGZvciBwcmludGluZyBzdHJpbmdzIHRhcmdldGVkIHRvIHRoZSB1c2VyLgorCisgICAgQWxsIHRoZSBzdHJpbmdzIGFyZSBkaXZpZGVkIGludG8gMyB0eXBlczoKKworICAgICAgICAqIG1lc3NhZ2VzLAorICAgICAgICAqIGhpbnRzLAorICAgICAgICAqIHN5c3RlbSBlcnJvcnMuCisKKyAgICBUaGVyZSBhcmUgMyBraW5kIG9mIG1lc3NhZ2Ugc2V2ZXJpdGllczoKKworICAgICAgICAqIGluZm9ybWF0aW9uYWwgbWVzc2FnZXMsCisgICAgICAgICogd2FybmluZ3MgKG5vbi1mYXRhbCBlcnJvcnMpLAorICAgICAgICAqIGZhdGFsIGVycm9ycy4KKworICAgIEZvciBleGFtcGxlOgorCisgICAgICAgIE9NUDogV2FybmluZyAjMjogQ2Fubm90IG9wZW4gbWVzc2FnZSBjYXRhbG9nICJsaWJndWlkZS5jYXQiOiAgICgxKQorICAgICAgICBPTVA6IFN5c3RlbSBlcnJvciAjMjogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeSAgICAgICAgICAgICAgICAoMikKKyAgICAgICAgT01QOiBIaW50OiBQbGVhc2UgY2hlY2sgTkxTUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZS4gICAgICAgICAgKDMpCisgICAgICAgIE9NUDogSW5mbyAjMzogRGVmYXVsdCBtZXNzYWdlcyB3aWxsIGJlIHVzZWQuICAgICAgICAgICAgICAgICAgICg0KQorCisgICAgd2hlcmUKKworICAgICAgICAoMSkgaXMgYSBtZXNzYWdlIG9mIHdhcm5pbmcgc2V2ZXJpdHksCisgICAgICAgICgyKSBpcyBhIHN5c3RlbSBlcnJvciBjYXVzZWQgdGhlIHByZXZpb3Mgd2FybmluZywKKyAgICAgICAgKDMpIGlzIGEgaGludCBmb3IgdGhlIHVzZXIgaG93IHRvIGZpeCB0aGUgcHJvYmxlbSwKKyAgICAgICAgKDQpIGlzIGEgbWVzc2FnZSBvZiBpbmZvcm1hdGlvbmFsIHNldmVyaXR5LgorCisgICBVc2FnZSBpbiBjb21wbGV4IGNhc2VzIChtZXNzYWdlIGlzIGFjY29tcGFuaWVkIHdpdGggaGludHMgYW5kIHN5c3RlbSBlcnJvcnMpOgorCisgICAgICAgaW50IGVycm9yID0gZXJybm87ICAgLy8gV2UgbmVlZCBzYXZlIGVycm5vIGltbWVkaWF0ZWx5LCBiZWNhdXNlIGl0IG1heSBiZSBjaGFuZ2VkLgorICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAga21wX21zX3dhcm5pbmcsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldmVyaXR5CisgICAgICAgICAgIEtNUF9NU0coIENhbnRPcGVuTWVzc2FnZUNhdGFsb2csIG5hbWUgKSwgICAvLyBQcmltYXJ5IG1lc3NhZ2UKKyAgICAgICAgICAgS01QX0VSUiggZXJyb3IgKSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN5c3RlbSBlcnJvcgorICAgICAgICAgICBLTVBfSE5UKCBDaGVja05MU1BBVEggKSwgICAgICAgICAgICAgICAgICAgLy8gSGludAorICAgICAgICAgICBfX2ttcF9tc2dfbnVsbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVmFyaWFkaWMgYXJndW1lbnQgbGlzdCBmaW5pc2hlcgorICAgICAgICk7CisKKyAgICBVc2FnZSBpbiBzaW1wbGUgY2FzZXMgKGp1c3QgYSBtZXNzYWdlLCBubyBzeXN0ZW0gZXJyb3JzIG9yIGhpbnRzKToKKworICAgICAgICBLTVBfSU5GT1JNKCBXaWxsVXNlRGVmYXVsdE1lc3NhZ2VzICk7CisgICAgICAgIEtNUF9XQVJOSU5HKCBDYW50T3Blbk1lc3NhZ2VDYXRhbG9nLCBuYW1lICk7CisgICAgICAgIEtNUF9GQVRBTCggU3RhY2tPdmVybGFwICk7CisgICAgICAgIEtNUF9TWVNGQUlMKCAicHRocmVhZF9jcmVhdGUiLCBzdGF0dXMgKTsKKyAgICAgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX2NyZWF0ZSIsIHN0YXR1cyApOworICAgICAgICBLTVBfQ0hFQ0tfU1lTRkFJTF9FUlJOTyggImdldHRpbWVvZmRheSIsIHN0YXR1cyApOworCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCitlbnVtIGttcF9tc2dfdHlwZSB7CisgICAga21wX210X2R1bW15ICA9ICAwLCAvLyBTcGVjaWFsIHR5cGUgZm9yIGludGVybmFsIHB1cnBvc2VzLgorICAgIGttcF9tdF9tZXNnICAgPSAgNCwgLy8gUHJpbWFyeSBPcGVuTVAgbWVzc2FnZSwgY291bGQgYmUgaW5mb3JtYXRpb24sIHdhcm5pbmcsIG9yIGZhdGFsLgorICAgIGttcF9tdF9oaW50ICAgPSAgNSwgLy8gSGludCB0byB0aGUgdXNlci4KKyAgICBrbXBfbXRfc3lzZXJyID0gLTEgIC8vIFN5c3RlbSBlcnJvciBtZXNzYWdlLgorfTsgLy8gZW51bSBrbXBfbXNnX3R5cGUKK3R5cGVkZWYgZW51bSBrbXBfbXNnX3R5cGUgIGttcF9tc2dfdHlwZV90OworCitzdHJ1Y3Qga21wX21zZyB7CisgICAga21wX21zZ190eXBlX3QgIHR5cGU7CisgICAgaW50ICAgICAgICAgICAgIG51bTsKKyAgICBjaGFyIGNvbnN0ICogICAgc3RyOworICAgIGludCAgICAgICAgICAgICBsZW47Cit9OyAvLyBzdHJ1Y3Qga21wX21lc3NhZ2UKK3R5cGVkZWYgc3RydWN0IGttcF9tc2cgIGttcF9tc2dfdDsKKworLy8gVHdvIHNwZWNpYWwgbWVzc2FnZXMuCitleHRlcm4ga21wX21zZ190IF9fa21wX21zZ19lbXB0eTsgIC8vIENhbiBiZSB1c2VkIGluIHBsYWNlIHdoZXJlIG1lc3NhZ2UgaXMgcmVxdWlyZWQgc3ludGFjdGljYWxseS4KK2V4dGVybiBrbXBfbXNnX3QgX19rbXBfbXNnX251bGw7ICAgLy8gRGVub3RlcyB0aGUgZW5kIG9mIHZhcmlhZGljIGxpc3Qgb2YgYXJndW1lbnRzLgorCisvLyBIZWxwZXIgZnVuY3Rpb25zLiBDcmVhdGVzIG1lc3NhZ2VzIGVpdGhlciBmcm9tIG1lc3NhZ2UgY2F0YWxvZyBvciBmcm9tIHN5c3RlbS4gTm90ZTogdGhlc2UKKy8vIGZ1bmN0aW9ucyBhbGxvY2F0ZSBtZW1vcnkuIFlvdSBzaG91bGQgcGFzcyBjcmVhdGVkIG1lc3NhZ2VzIHRvIF9fa21wX21zZygpIGZ1bmN0aW9uLCBpdCB3aWxsCisvLyBwcmludCBtZXNzYWdlcyBhbmQgZGVzdHJveSB0aGVtLgora21wX21zZ190ICBfX2ttcF9tc2dfZm9ybWF0KCBrbXBfaTE4bl9pZF90IGlkLCAuLi4gKTsKK2ttcF9tc2dfdCAgX19rbXBfbXNnX2Vycm9yX2NvZGUoIGludCBjb2RlICk7CitrbXBfbXNnX3QgIF9fa21wX21zZ19lcnJvcl9tZXNnKCBjaGFyIGNvbnN0ICogbWVzZyApOworCisvLyBIZWxwZXIgbWFjcm9zIHRvIG1ha2UgY2FsbHMgc2hvcnRlci4KKyNkZWZpbmUgS01QX01TRyggLi4uICApICAgX19rbXBfbXNnX2Zvcm1hdCgga21wX2kxOG5fbXNnXyAjIyBfX1ZBX0FSR1NfXyApCisjZGVmaW5lIEtNUF9ITlQoIC4uLiAgKSAgIF9fa21wX21zZ19mb3JtYXQoIGttcF9pMThuX2hudF8gIyMgX19WQV9BUkdTX18gKQorI2RlZmluZSBLTVBfU1lTRVJSQ09ERSggY29kZSApICBfX2ttcF9tc2dfZXJyb3JfY29kZSggY29kZSApCisjZGVmaW5lIEtNUF9TWVNFUlJNRVNHKCBtZXNnICkgIF9fa21wX21zZ19lcnJvcl9tZXNnKCBtZXNnICkKKyNkZWZpbmUgS01QX0VSUiBLTVBfU1lTRVJSQ09ERQorCisvLyBNZXNzYWdlIHNldmVyaXR5LgorZW51bSBrbXBfbXNnX3NldmVyaXR5IHsKKyAgICBrbXBfbXNfaW5mb3JtLCAgICAgIC8vIEp1c3QgaW5mb3JtYXRpb24gZm9yIHRoZSB1c2VyLgorICAgIGttcF9tc193YXJuaW5nLCAgICAgLy8gTm9uLWZhdGFsIGVycm9yLCBleGVjdXRpb24gY29udGludWVzLgorICAgIGttcF9tc19mYXRhbCAgICAgICAgLy8gRmF0YWwgZXJyb3IsIHByb2dyYW0gYWJvcnRzLgorfTsgLy8gZW51bSBrbXBfbXNnX3NldmVyaXR5Cit0eXBlZGVmIGVudW0ga21wX21zZ19zZXZlcml0eSAga21wX21zZ19zZXZlcml0eV90OworCisvLyBQcmltYXJ5IGZ1bmN0aW9uIGZvciBwcmludGluZyBtZXNzYWdlcyBmb3IgdGhlIHVzZXIuIFRoZSBmaXJzdCBtZXNzYWdlIGlzIG1hbmRhdG9yeS4gQW55IG51bWJlcgorLy8gb2Ygc3lzdGVtIGVycm9ycyBhbmQgaGludHMgbWF5IGJlIHNwZWNpZmllZC4gQXJndW1lbnQgbGlzdCBtdXN0IGJlIGZpbmlzaGVkIHdpdGggX19rbXBfbXNnX251bGwuCit2b2lkICAgIF9fa21wX21zZygga21wX21zZ19zZXZlcml0eV90IHNldmVyaXR5LCBrbXBfbXNnX3QgbWVzc2FnZSwgLi4uICk7CisKKy8vIEhlbHBlciBtYWNyb3MgdG8gbWFrZSBjYWxscyBzaG9ydGVyIGluIHNpbXBsZSBjYXNlcy4KKyNkZWZpbmUgS01QX0lORk9STSggLi4uICApIF9fa21wX21zZygga21wX21zX2luZm9ybSwgIEtNUF9NU0coIF9fVkFfQVJHU19fICksIF9fa21wX21zZ19udWxsICkKKyNkZWZpbmUgS01QX1dBUk5JTkcoIC4uLiApIF9fa21wX21zZygga21wX21zX3dhcm5pbmcsIEtNUF9NU0coIF9fVkFfQVJHU19fICksIF9fa21wX21zZ19udWxsICkKKyNkZWZpbmUgS01QX0ZBVEFMKCAgIC4uLiApIF9fa21wX21zZygga21wX21zX2ZhdGFsLCAgIEtNUF9NU0coIF9fVkFfQVJHU19fICksIF9fa21wX21zZ19udWxsICkKKyNkZWZpbmUgS01QX1NZU0ZBSUwoIGZ1bmMsIGVycm9yICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2ttcF9tc2coICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAga21wX21zX2ZhdGFsLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX01TRyggRnVuY3Rpb25FcnJvciwgZnVuYyApLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX1NZU0VSUkNPREUoIGVycm9yICksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgX19rbXBfbXNnX251bGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICApCisKKy8vIENoZWNrIGVycm9yLCBpZiBub3QgemVybywgZ2VuZXJhdGUgZmF0YWwgZXJyb3IgbWVzc2FnZS4KKyNkZWZpbmUgS01QX0NIRUNLX1NZU0ZBSUwoIGZ1bmMsIGVycm9yICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKCBlcnJvciApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEtNUF9TWVNGQUlMKCBmdW5jLCBlcnJvciApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKy8vIENoZWNrIHN0YXR1cywgaWYgbm90IHplcm8sIGdlbmVyYXRlIGZhdGFsIGVycm9yIG1lc3NhZ2UgdXNpbmcgZXJybm8uCisjZGVmaW5lIEtNUF9DSEVDS19TWVNGQUlMX0VSUk5PKCBmdW5jLCBzdGF0dXMgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICggc3RhdHVzICE9IDAgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpbnQgZXJyb3IgPSBlcnJubzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBLTVBfU1lTRkFJTCggZnVuYywgZXJyb3IgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisjaWZkZWYgS01QX0RFQlVHCisgICAgdm9pZCBfX2ttcF9pMThuX2R1bXBfY2F0YWxvZygga21wX3N0cl9idWZfdCAqIGJ1ZmZlciApOworI2VuZGlmIC8vIEtNUF9ERUJVRworCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgICB9OyAvLyBleHRlcm4gIkMiCisjZW5kaWYgLy8gX19jcGx1c3BsdXMKKworI2VuZGlmIC8vIEtNUF9JMThOX0gKKworLy8gZW5kIG9mIGZpbGUgLy8KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9pbXBvcnQuYyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9pbXBvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWU4MjExCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX2ltcG9ydC5jCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBrbXBfaW1wb3J0LmMKKyAqICRSZXZpc2lvbjogNDI5NTEgJAorICogJERhdGU6IDIwMTQtMDEtMjEgMTQ6NDE6NDEgLTA2MDAgKFR1ZSwgMjEgSmFuIDIwMTQpICQKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworLyoKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBPYmplY3QgZ2VuZXJhdGVkIGZyb20gdGhpcyBzb3VyY2UgZmlsZSBpcyBsaW5rZWQgdG8gV2luZG93cyogT1MgRExMIGltcG9ydCBsaWJyYXJ5IChsaWJpb21wNW1kLmxpYikKKyAgICBvbmx5ISBJdCBpcyBub3QgYSBwYXJ0IG9mIHJlZ3VsYXIgc3RhdGljIG9yIGR5bmFtaWMgT3Blbk1QIFJUTC4gQW55IGNvZGUgdGhhdCBqdXN0IG5lZWRzIHRvIGdvCisgICAgaW4gdGhlIGxpYmlvbXA1bWQubGliIChidXQgbm90IGluIGxpYmlvbXA1bXQubGliIGFuZCBsaWJpb21wNW1kLmRsbCkgc2hvdWxkIGJlIHBsYWNlZCBpbiB0aGlzCisgICAgZmlsZS4KKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoKKyAgICBUaGVzZSBzeW1ib2xzIGFyZSByZXF1aXJlZCBmb3IgbXV0dWFsIGV4Y2x1c2lvbiB3aXRoIE1pY3Jvc29mdCBPcGVuTVAgUlRMIChhbmQgY29tcGF0aWJpbGl0eQorICAgIHdpdGggTVMgQ29tcGlsZXIpLgorKi8KKworaW50IF9Zb3VfbXVzdF9saW5rX3dpdGhfZXhhY3RseV9vbmVfT3Blbk1QX2xpYnJhcnkgPSAxOworaW50IF9Zb3VfbXVzdF9saW5rX3dpdGhfSW50ZWxfT3Blbk1QX2xpYnJhcnkgICAgICAgPSAxOworaW50IF9Zb3VfbXVzdF9saW5rX3dpdGhfTWljcm9zb2Z0X09wZW5NUF9saWJyYXJ5ID0gMTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworLy8gZW5kIG9mIGZpbGUgLy8KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9pby5jIGIvZmluYWwvcnVudGltZS9zcmMva21wX2lvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM5NjYzNAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9pby5jCkBAIC0wLDAgKzEsMjUwIEBACisvKgorICoga21wX2lvLmMgLS0gUlRMIElPCisgKiAkUmV2aXNpb246IDQzMjM2ICQKKyAqICREYXRlOiAyMDE0LTA2LTA0IDE2OjQyOjM1IC0wNTAwIChXZWQsIDA0IEp1biAyMDE0KSAkCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2lmbmRlZiBfX0FCU09GVF9XSU4KKyMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImttcF9vcy5oIgorI2luY2x1ZGUgImttcF9sb2NrLmgiCisjaW5jbHVkZSAia21wX3N0ci5oIgorI2luY2x1ZGUgImttcF9pby5oIgorI2luY2x1ZGUgImttcC5oIiAvLyBLTVBfR1RJRF9ETkUsIF9fa21wX2RlYnVnX2J1ZiwgZXRjCisKKyNpZiBLTVBfT1NfV0lORE9XUworIyBwcmFnbWEgd2FybmluZyggcHVzaCApCisjIHByYWdtYSB3YXJuaW5nKCBkaXNhYmxlOiAyNzEgMzEwICkKKyMgaW5jbHVkZSA8d2luZG93cy5oPgorIyBwcmFnbWEgd2FybmluZyggcG9wICkKKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitrbXBfYm9vdHN0cmFwX2xvY2tfdCBfX2ttcF9zdGRpb19sb2NrICAgPSBLTVBfQk9PVFNUUkFQX0xPQ0tfSU5JVElBTElaRVIoIF9fa21wX3N0ZGlvX2xvY2sgICApOyAvKiBDb250cm9sIHN0ZGlvIGZ1bmN0aW9ucyAqLwora21wX2Jvb3RzdHJhcF9sb2NrX3QgX19rbXBfY29uc29sZV9sb2NrID0gS01QX0JPT1RTVFJBUF9MT0NLX0lOSVRJQUxJWkVSKCBfX2ttcF9jb25zb2xlX2xvY2sgKTsgLyogQ29udHJvbCBjb25zb2xlIGluaXRpYWxpemF0aW9uICovCisKKyNpZiBLTVBfT1NfV0lORE9XUworCisgICAgIyBpZmRlZiBLTVBfREVCVUcgCisgICAgLyogX19rbXBfc3Rkb3V0IGlzIHVzZWQgb25seSBmb3IgZGV2IGJ1aWxkICovCisgICAgc3RhdGljIEhBTkRMRSAgICBfX2ttcF9zdGRvdXQgPSBOVUxMOworICAgICMgZW5kaWYKKyAgICBzdGF0aWMgSEFORExFICAgICAgICBfX2ttcF9zdGRlcnIgPSBOVUxMOworICAgIHN0YXRpYyBpbnQgICAgICAgICAgIF9fa21wX2NvbnNvbGVfZXhpc3RzID0gRkFMU0U7CisgICAgc3RhdGljIGttcF9zdHJfYnVmX3QgX19rbXBfY29uc29sZV9idWY7CisKKyAgICBzdGF0aWMgaW50CisgICAgaXNfY29uc29sZSggdm9pZCApCisgICAgeworICAgICAgICBjaGFyIGJ1ZmZlclsgMTI4IF07CisgICAgICAgIERXT1JEIHJjICA9IDA7CisgICAgICAgIERXT1JEIGVyciA9IDA7CisgICAgICAgIC8vIFRyeSB0byBnZXQgY29uc29sZSB0aXRsZS4KKyAgICAgICAgU2V0TGFzdEVycm9yKCAwICk7CisgICAgICAgICAgICAvLyBHZXRDb25zb2xlVGl0bGUgZG9lcyBub3QgcmVzZXQgbGFzdCBlcnJvciBpbiBjYXNlIG9mIHN1Y2Nlc3Mgb3Igc2hvcnQgYnVmZmVyLAorICAgICAgICAgICAgLy8gc28gd2UgbmVlZCB0byBjbGVhciBpdCBleHBsaWNpdGx5LgorICAgICAgICByYyA9IEdldENvbnNvbGVUaXRsZSggYnVmZmVyLCBzaXplb2YoIGJ1ZmZlciApICk7CisgICAgICAgIGlmICggcmMgPT0gMCApIHsKKyAgICAgICAgICAgIC8vIHJjID09IDAgbWVhbnMgZ2V0dGluZyBjb25zb2xlIHRpdGxlIGZhaWxlZC4gTGV0IHVzIGZpbmQgb3V0IHdoeS4KKyAgICAgICAgICAgIGVyciA9IEdldExhc3RFcnJvcigpOworICAgICAgICAgICAgLy8gZXJyID09IDAgbWVhbnMgYnVmZmVyIHRvbyBzaG9ydCAod2Ugc3VwcG9zZSBjb25zb2xlIGV4aXN0cykuCisgICAgICAgICAgICAvLyBJbiBXaW5kb3cgYXBwbGljYXRpb25zIHdlIHVzdWFsbHkgaGF2ZSBlcnIgPT0gNiAoaW52YWxpZCBoYW5kbGUpLgorICAgICAgICB9OyAvLyBpZgorICAgICAgICByZXR1cm4gcmMgPiAwIHx8IGVyciA9PSAwOworICAgIH0KKworICAgIHZvaWQKKyAgICBfX2ttcF9jbG9zZV9jb25zb2xlKCB2b2lkICkKKyAgICB7CisgICAgICAgIC8qIHdhaXQgdW50aWwgdXNlciBwcmVzc2VzIHJldHVybiBiZWZvcmUgY2xvc2luZyB3aW5kb3cgKi8KKyAgICAgICAgLyogVE9ETyBvbmx5IGNsb3NlIGlmIGEgd2luZG93IHdhcyBvcGVuZWQgKi8KKyAgICAgICAgaWYoIF9fa21wX2NvbnNvbGVfZXhpc3RzICkgeworICAgICAgICAgICAgI2lmZGVmIEtNUF9ERUJVRyAKKyAgICAgICAgICAgIC8qIHN0YW5kYXJkIG91dCBpcyB1c2VkIG9ubHkgaW4gZGV2IGJ1aWxkICovCisgICAgICAgICAgICBfX2ttcF9zdGRvdXQgPSBOVUxMOworICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICBfX2ttcF9zdGRlcnIgPSBOVUxMOworICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9mcmVlKCAmX19rbXBfY29uc29sZV9idWYgKTsKKyAgICAgICAgICAgIF9fa21wX2NvbnNvbGVfZXhpc3RzID0gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBGb3Igd2luZG93cywgY2FsbCB0aGlzIGJlZm9yZSBzdGRvdXQsIHN0ZGVyciwgb3Igc3RkaW4gYXJlIHVzZWQuCisgICAgICogSXQgb3BlbnMgYSBjb25zb2xlIHdpbmRvdyBhbmQgc3RhcnRzIHByb2Nlc3NpbmcgKi8KKyAgICBzdGF0aWMgdm9pZAorICAgIF9fa21wX3JlZGlyZWN0X291dHB1dCggdm9pZCApCisgICAgeworICAgICAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfY29uc29sZV9sb2NrICk7CisKKyAgICAgICAgaWYoICEgX19rbXBfY29uc29sZV9leGlzdHMgKSB7CisgICAgICAgICAgICAjaWZkZWYgS01QX0RFQlVHIAorICAgICAgICAgICAgLyogc3RhbmRhcmQgb3V0IGlzIHVzZWQgb25seSBpbiBkZXYgYnVpbGQgKi8KKyAgICAgICAgICAgIEhBTkRMRSBobzsKKyAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgSEFORExFIGhlOworCisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX2luaXQoICZfX2ttcF9jb25zb2xlX2J1ZiApOworCisgICAgICAgICAgICBBbGxvY0NvbnNvbGUoKTsKKyAgICAgICAgICAgIC8vIFdlIGRvIG5vdCBjaGVjayB0aGUgcmVzdWx0IG9mIEFsbG9jQ29uc29sZSBiZWNhdXNlCisgICAgICAgICAgICAvLyAgMS4gdGhlIGNhbGwgaXMgaGFybWxlc3MKKyAgICAgICAgICAgIC8vICAyLiBpdCBpcyBub3QgY2xlYXIgaG93IHRvIGNvbW11bmljYXRlIGZhaWx1ZQorICAgICAgICAgICAgLy8gIDMuIHdlIHdpbGwgZGV0ZWN0IGZhaWx1cmUgbGF0ZXIgd2hlbiB3ZSBnZXQgaGFuZGxlKHMpCisKKyAgICAgICAgICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgICAgICAgICBobyA9IEdldFN0ZEhhbmRsZSggU1REX09VVFBVVF9IQU5ETEUgKTsKKyAgICAgICAgICAgICAgICBpZiAoIGhvID09IElOVkFMSURfSEFORExFX1ZBTFVFIHx8IGhvID09IE5VTEwgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgRFdPUkQgIGVyciA9IEdldExhc3RFcnJvcigpOworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBvdXRwdXQgZXJyb3Igc29tZWhvdyAobWF5YmUgbWVzc2FnZSBib3gpCisgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0ZG91dCA9IE5VTEw7CisKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0ZG91dCA9IGhvOyAvLyB0ZW1wb3JhcnkgY29kZSwgbmVlZCBuZXcgZ2xvYmFsIGZvciBobworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICBoZSA9IEdldFN0ZEhhbmRsZSggU1REX0VSUk9SX0hBTkRMRSApOworICAgICAgICAgICAgaWYgKCBoZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSB8fCBoZSA9PSBOVUxMICkgeworCisgICAgICAgICAgICAgICAgRFdPUkQgIGVyciA9IEdldExhc3RFcnJvcigpOworICAgICAgICAgICAgICAgIC8vIFRPRE86IG91dHB1dCBlcnJvciBzb21laG93IChtYXliZSBtZXNzYWdlIGJveCkKKyAgICAgICAgICAgICAgICBfX2ttcF9zdGRlcnIgPSBOVUxMOworCisgICAgICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAgICAgX19rbXBfc3RkZXJyID0gaGU7IC8vIHRlbXBvcmFyeSBjb2RlLCBuZWVkIG5ldyBnbG9iYWwKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9fa21wX2NvbnNvbGVfZXhpc3RzID0gVFJVRTsKKyAgICAgICAgfQorICAgICAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfY29uc29sZV9sb2NrICk7CisgICAgfQorCisjZWxzZQorICAgICNkZWZpbmUgICAgICAgX19rbXBfc3RkZXJyICAgICAoc3RkZXJyKQorI2VuZGlmIC8qIEtNUF9PU19XSU5ET1dTICovCisKK3ZvaWQKK19fa21wX3ZwcmludGYoIGVudW0ga21wX2lvIF9fa21wX2lvLCBjaGFyIGNvbnN0ICogZm9ybWF0LCB2YV9saXN0IGFwICkKK3sKKyAgICAjaWYgS01QX09TX1dJTkRPV1MKKyAgICAgICAgaWYoICFfX2ttcF9jb25zb2xlX2V4aXN0cyApIHsKKyAgICAgICAgICAgIF9fa21wX3JlZGlyZWN0X291dHB1dCgpOworICAgICAgICB9CisgICAgICAgICAgICBpZiggISBfX2ttcF9zdGRlcnIgJiYgX19rbXBfaW8gPT0ga21wX2VyciApIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgICAgICAgICBpZiggISBfX2ttcF9zdGRvdXQgJiYgX19rbXBfaW8gPT0ga21wX291dCApIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICNlbmRpZgorICAgICNlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAqLworCisgICAgaWYgKCBfX2ttcF9kZWJ1Z19idWYgJiYgX19rbXBfZGVidWdfYnVmZmVyICE9IE5VTEwgKSB7CisKKyAgICAgICAgaW50IGRjID0gKCBfX2ttcF9kZWJ1Z19idWZfYXRvbWljID8KKyAgICAgICAgICAgICAgICAgICBLTVBfVEVTVF9USEVOX0lOQzMyKCAmIF9fa21wX2RlYnVnX2NvdW50KSA6IF9fa21wX2RlYnVnX2NvdW50KysgKQorICAgICAgICAgICAgICAgICAgICUgX19rbXBfZGVidWdfYnVmX2xpbmVzOworICAgICAgICBjaGFyICpkYiA9ICYgX19rbXBfZGVidWdfYnVmZmVyWyBkYyAqIF9fa21wX2RlYnVnX2J1Zl9jaGFycyBdOworICAgICAgICBpbnQgY2hhcnMgPSAwOworCisgICAgICAgICNpZmRlZiBLTVBfREVCVUdfUElEUworICAgICAgICAgICAgY2hhcnMgPSBzcHJpbnRmKCBkYiwgInBpZD0lZDogIiwgKGttcF9pbnQzMilnZXRwaWQoKSApOworICAgICAgICAjZW5kaWYKKyAgICAgICAgY2hhcnMgKz0gdnNwcmludGYoIGRiLCBmb3JtYXQsIGFwICk7CisKKyAgICAgICAgaWYgKCBjaGFycyArIDEgPiBfX2ttcF9kZWJ1Z19idWZfY2hhcnMgKSB7CisgICAgICAgICAgICBpZiAoIGNoYXJzICsgMSA+IF9fa21wX2RlYnVnX2J1Zl93YXJuX2NoYXJzICkgeworICAgICAgICAgICAgICAgICNpZiBLTVBfT1NfV0lORE9XUworICAgICAgICAgICAgICAgICAgICBEV09SRCBjb3VudDsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJl9fa21wX2NvbnNvbGVfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIk9NUCB3YXJuaW5nOiBEZWJ1Z2dpbmcgYnVmZmVyIG92ZXJmbG93OyBpbmNyZWFzZSBLTVBfREVCVUdfQlVGX0NIQVJTIHRvICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnMgKyAxICk7CisgICAgICAgICAgICAgICAgICAgIFdyaXRlRmlsZSggX19rbXBfc3RkZXJyLCBfX2ttcF9jb25zb2xlX2J1Zi5zdHIsIF9fa21wX2NvbnNvbGVfYnVmLnVzZWQsICZjb3VudCwgTlVMTCApOworICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX2NsZWFyKCAmX19rbXBfY29uc29sZV9idWYgKTsKKyAgICAgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKCBfX2ttcF9zdGRlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIk9NUCB3YXJuaW5nOiBEZWJ1Z2dpbmcgYnVmZmVyIG92ZXJmbG93OyBpbmNyZWFzZSBLTVBfREVCVUdfQlVGX0NIQVJTIHRvICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzICsgMSApOworICAgICAgICAgICAgICAgICAgICBmZmx1c2goIF9fa21wX3N0ZGVyciApOworICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgIF9fa21wX2RlYnVnX2J1Zl93YXJuX2NoYXJzID0gY2hhcnMgKyAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogdGVybWluYXRlIHN0cmluZyBpZiBvdmVyZmxvdyBvY2N1cnJlZCAqLworICAgICAgICAgICAgZGJbIF9fa21wX2RlYnVnX2J1Zl9jaGFycyAtIDIgXSA9ICdcbic7CisgICAgICAgICAgICBkYlsgX19rbXBfZGVidWdfYnVmX2NoYXJzIC0gMSBdID0gJ1wwJzsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgICNpZiBLTVBfT1NfV0lORE9XUworICAgICAgICAgICAgRFdPUkQgY291bnQ7CisgICAgICAgICAgICAjaWZkZWYgS01QX0RFQlVHX1BJRFMKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmX19rbXBfY29uc29sZV9idWYsICJwaWQ9JWQ6ICIsCisgICAgICAgICAgICAgICAgICAoa21wX2ludDMyKWdldHBpZCgpICk7CisgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfdnByaW50KCAmX19rbXBfY29uc29sZV9idWYsIGZvcm1hdCwgYXAgKTsKKyAgICAgICAgICAgIFdyaXRlRmlsZSgKKyAgICAgICAgICAgICAgICBfX2ttcF9zdGRlcnIsCisgICAgICAgICAgICAgICAgX19rbXBfY29uc29sZV9idWYuc3RyLAorICAgICAgICAgICAgICAgIF9fa21wX2NvbnNvbGVfYnVmLnVzZWQsCisgICAgICAgICAgICAgICAgJmNvdW50LAorICAgICAgICAgICAgICAgIE5VTEwKKyAgICAgICAgICAgICk7CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX2NsZWFyKCAmX19rbXBfY29uc29sZV9idWYgKTsKKyAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgICNpZmRlZiBLTVBfREVCVUdfUElEUworICAgICAgICAgICAgICAgIGZwcmludGYoIF9fa21wX3N0ZGVyciwgInBpZD0lZDogIiwgKGttcF9pbnQzMilnZXRwaWQoKSApOworICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICB2ZnByaW50ZiggX19rbXBfc3RkZXJyLCBmb3JtYXQsIGFwICk7CisgICAgICAgICAgICBmZmx1c2goIF9fa21wX3N0ZGVyciApOworICAgICAgICAjZW5kaWYKKyAgICB9Cit9CisKK3ZvaWQKK19fa21wX3ByaW50ZiggY2hhciBjb25zdCAqIGZvcm1hdCwgLi4uICkKK3sKKyAgICB2YV9saXN0IGFwOworICAgIHZhX3N0YXJ0KCBhcCwgZm9ybWF0ICk7CisKKyAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmIF9fa21wX3N0ZGlvX2xvY2sgKTsKKyAgICBfX2ttcF92cHJpbnRmKCBrbXBfZXJyLCBmb3JtYXQsIGFwICk7CisgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJiBfX2ttcF9zdGRpb19sb2NrICk7CisKKyAgICB2YV9lbmQoIGFwICk7Cit9CisKK3ZvaWQKK19fa21wX3ByaW50Zl9ub19sb2NrKCBjaGFyIGNvbnN0ICogZm9ybWF0LCAuLi4gKQoreworICAgIHZhX2xpc3QgYXA7CisgICAgdmFfc3RhcnQoIGFwLCBmb3JtYXQgKTsKKworICAgIF9fa21wX3ZwcmludGYoIGttcF9lcnIsIGZvcm1hdCwgYXAgKTsKKworICAgIHZhX2VuZCggYXAgKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9pby5oIGIvZmluYWwvcnVudGltZS9zcmMva21wX2lvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZkYjRkYQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9pby5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBrbXBfaW8uaCAtLSBSVEwgSU8gaGVhZGVyIGZpbGUuCisgKiAkUmV2aXNpb246IDQyOTUxICQKKyAqICREYXRlOiAyMDE0LTAxLTIxIDE0OjQxOjQxIC0wNjAwIChUdWUsIDIxIEphbiAyMDE0KSAkCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgS01QX0lPX0gKKyNkZWZpbmUgS01QX0lPX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitlbnVtIGttcF9pbyB7CisgICAga21wX291dCA9IDAsCisgICAga21wX2VycgorfTsKKworZXh0ZXJuIGttcF9ib290c3RyYXBfbG9ja190IF9fa21wX3N0ZGlvX2xvY2s7ICAgICAvKiBDb250cm9sIHN0ZGlvIGZ1bmN0aW9ucyAqLworZXh0ZXJuIGttcF9ib290c3RyYXBfbG9ja190IF9fa21wX2NvbnNvbGVfbG9jazsgICAvKiBDb250cm9sIGNvbnNvbGUgaW5pdGlhbGl6YXRpb24gKi8KKworZXh0ZXJuIHZvaWQgX19rbXBfdnByaW50ZiggZW51bSBrbXBfaW8gX19rbXBfaW8sIGNoYXIgY29uc3QgKiBmb3JtYXQsIHZhX2xpc3QgYXAgKTsKK2V4dGVybiB2b2lkIF9fa21wX3ByaW50ZiggY2hhciBjb25zdCAqIGZvcm1hdCwgLi4uICk7CitleHRlcm4gdm9pZCBfX2ttcF9wcmludGZfbm9fbG9jayggY2hhciBjb25zdCAqIGZvcm1hdCwgLi4uICk7CitleHRlcm4gdm9pZCBfX2ttcF9jbG9zZV9jb25zb2xlKCB2b2lkICk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBLTVBfSU9fSCAqLworCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfaXR0LmMgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfaXR0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZmOTdmOAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9pdHQuYwpAQCAtMCwwICsxLDE0NCBAQAorI2lmIFVTRV9JVFRfQlVJTEQKKy8qCisgKiBrbXBfaXR0LmMgLS0gSVRUIE5vdGlmeSBpbnRlcmZhY2UuCisgKiAkUmV2aXNpb246IDQzNDU3ICQKKyAqICREYXRlOiAyMDE0LTA5LTE3IDAzOjU3OjIyIC0wNTAwIChXZWQsIDE3IFNlcCAyMDE0KSAkCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJrbXBfaXR0LmgiCisKKyNpZiBLTVBfREVCVUcKKyAgICAjaW5jbHVkZSAia21wX2l0dC5pbmwiCisjZW5kaWYKKworCisjaWYgVVNFX0lUVF9OT1RJRlkKKworICAgIGttcF9pbnQzMiBfX2ttcF9iYXJyaWVyX2RvbWFpbl9jb3VudDsKKyAgICBrbXBfaW50MzIgX19rbXBfcmVnaW9uX2RvbWFpbl9jb3VudDsKKyAgICBfX2l0dF9kb21haW4qIF9fa21wX2l0dF9iYXJyaWVyX2RvbWFpbnNbS01QX01BWF9GUkFNRV9ET01BSU5TXTsKKyAgICBfX2l0dF9kb21haW4qIF9fa21wX2l0dF9yZWdpb25fZG9tYWluc1tLTVBfTUFYX0ZSQU1FX0RPTUFJTlNdOworICAgIF9faXR0X2RvbWFpbiogX19rbXBfaXR0X2ltYmFsYW5jZV9kb21haW5zW0tNUF9NQVhfRlJBTUVfRE9NQUlOU107CisgICAga21wX2ludDMyIF9fa21wX2l0dF9yZWdpb25fdGVhbV9zaXplW0tNUF9NQVhfRlJBTUVfRE9NQUlOU107CisgICAgX19pdHRfZG9tYWluICogbWV0YWRhdGFfZG9tYWluID0gTlVMTDsKKworICAgICNpbmNsdWRlICJrbXBfdmVyc2lvbi5oIgorICAgICNpbmNsdWRlICJrbXBfaTE4bi5oIgorICAgICNpbmNsdWRlICJrbXBfc3RyLmgiCisKKyAgICBLTVBfQlVJTERfQVNTRVJUKCBzaXplb2YoIGttcF9pdHRfbWFya190ICkgPT0gc2l6ZW9mKCBfX2l0dF9tYXJrX3R5cGUgKSApOworCisgICAgLyoKKyAgICAgICAgUHJldmlvdXNseSB1c2VkIHdhcm5pbmdzOgorCisgICAgICAgIEtNUF9XQVJOSU5HKCBJdHRBbGxOb3RpZkRpc2FibGVkICk7CisgICAgICAgIEtNUF9XQVJOSU5HKCBJdHRPYmpOb3RpZkRpc2FibGVkICk7CisgICAgICAgIEtNUF9XQVJOSU5HKCBJdHRNYXJrTm90aWZEaXNhYmxlZCApOworICAgICAgICBLTVBfV0FSTklORyggSXR0VW5sb2FkTGliRmFpbGVkLCBsaWJpdHRub3RpZnkgKTsKKyAgICAqLworCisKKyAgICBrbXBfaW50MzIgX19rbXBfaXR0X3ByZXBhcmVfZGVsYXkgPSAwOworICAgIGttcF9ib290c3RyYXBfbG9ja190IF9fa21wX2l0dF9kZWJ1Z19sb2NrID0gS01QX0JPT1RTVFJBUF9MT0NLX0lOSVRJQUxJWkVSKCBfX2ttcF9pdHRfZGVidWdfbG9jayApOworCisjZW5kaWYgLy8gVVNFX0lUVF9OT1RJRlkKKwordm9pZCBfX2ttcF9pdHRfaW5pdGlhbGl6ZSgpIHsKKworICAgIC8vIElUVE5vdGlmeSBsaWJyYXJ5IGlzIGxvYWRlZCBhbmQgaW5pdGlhbGl6ZWQgYXQgZmlyc3QgY2FsbCB0byBhbnkgaXR0bm90aWZ5IGZ1bmN0aW9uLAorICAgIC8vIHNvIHdlIGRvIG5vdCBuZWVkIHRvIGV4cGxpY2l0bHkgbG9hZCBpdCBhbnkgbW9yZS4KKyAgICAvLyBKdXNyIHJlcG9ydCBPTVAgUlRMIHZlcnNpb24gdG8gSVRUTm90aWZ5LgorCisgICAgI2lmIFVTRV9JVFRfTk9USUZZCisgICAgICAgIC8vIFJlcG9ydCBPcGVuTVAgUlRMIHZlcnNpb24uCisgICAgICAgIGttcF9zdHJfYnVmX3QgICAgICAgYnVmOworICAgICAgICBfX2l0dF9tYXJrX3R5cGUgICAgIHZlcnNpb247CisgICAgICAgIF9fa21wX3N0cl9idWZfaW5pdCggJiBidWYgKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCgKKyAgICAgICAgICAgICYgYnVmLAorICAgICAgICAgICAgIk9NUCBSVEwgVmVyc2lvbiAlZC4lZC4lZCIsCisgICAgICAgICAgICBfX2ttcF92ZXJzaW9uX21ham9yLAorICAgICAgICAgICAgX19rbXBfdmVyc2lvbl9taW5vciwKKyAgICAgICAgICAgIF9fa21wX3ZlcnNpb25fYnVpbGQKKyAgICAgICAgKTsKKyAgICAgICAgaWYgKCBfX2l0dF9hcGlfdmVyc2lvbl9wdHIgIT0gTlVMTCApIHsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICYgYnVmLCAiOiVzIiwgX19pdHRfYXBpX3ZlcnNpb24oKSApOworICAgICAgICB9OyAvLyBpZgorICAgICAgICB2ZXJzaW9uID0gX19pdHRfbWFya19jcmVhdGUoIGJ1Zi5zdHIgKTsKKyAgICAgICAgX19pdHRfbWFyayggdmVyc2lvbiwgTlVMTCApOworICAgICAgICBfX2ttcF9zdHJfYnVmX2ZyZWUoICYgYnVmICk7CisgICAgI2VuZGlmCisKK30gLy8gX19rbXBfaXR0X2luaXRpYWxpemUKKworCit2b2lkIF9fa21wX2l0dF9kZXN0cm95KCkgeworICAgICNpZiBVU0VfSVRUX05PVElGWQorICAgICAgICBfX2ttcF9pdHRfZmluaV9pdHRsaWIoKTsKKyAgICAjZW5kaWYKK30gLy8gX19rbXBfaXR0X2Rlc3Ryb3kKKworCitleHRlcm4gIkMiCit2b2lkCitfX2l0dF9lcnJvcl9oYW5kbGVyKAorICAgIF9faXR0X2Vycm9yX2NvZGUgZXJyLAorICAgIHZhX2xpc3QgYXJncworKSB7CisKKyAgICBzd2l0Y2ggKCBlcnIgKSB7CisgICAgICAgIGNhc2UgX19pdHRfZXJyb3Jfbm9fbW9kdWxlIDogeworICAgICAgICAgICAgY2hhciBjb25zdCAqIGxpYnJhcnkgPSB2YV9hcmcoIGFyZ3MsIGNoYXIgY29uc3QgKiApOworICAgICAgICAgICAgI2lmIEtNUF9PU19XSU5ET1dTCisgICAgICAgICAgICAgICAgaW50IHN5c19lcnIgPSB2YV9hcmcoIGFyZ3MsIGludCApOworICAgICAgICAgICAgICAgIF9fa21wX21zZygga21wX21zX3dhcm5pbmcsIEtNUF9NU0coIEl0dExvYWRMaWJGYWlsZWQsIGxpYnJhcnkgKSwgS01QX1NZU0VSUkNPREUoIHN5c19lcnIgKSwgX19rbXBfbXNnX251bGwgKTsKKyAgICAgICAgICAgICNlbHNlCisgICAgICAgICAgICAgICAgY2hhciBjb25zdCAqIHN5c19lcnIgPSB2YV9hcmcoIGFyZ3MsIGNoYXIgY29uc3QgKiApOworICAgICAgICAgICAgICAgIF9fa21wX21zZygga21wX21zX3dhcm5pbmcsIEtNUF9NU0coIEl0dExvYWRMaWJGYWlsZWQsIGxpYnJhcnkgKSwgS01QX1NZU0VSUk1FU0coIHN5c19lcnIgKSwgX19rbXBfbXNnX251bGwgKTsKKyAgICAgICAgICAgICNlbmRpZgorICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIF9faXR0X2Vycm9yX25vX3N5bWJvbCA6IHsKKyAgICAgICAgICAgIGNoYXIgY29uc3QgKiBsaWJyYXJ5ID0gdmFfYXJnKCBhcmdzLCBjaGFyIGNvbnN0ICogKTsKKyAgICAgICAgICAgIGNoYXIgY29uc3QgKiBzeW1ib2wgID0gdmFfYXJnKCBhcmdzLCBjaGFyIGNvbnN0ICogKTsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBJdHRMb29rdXBGYWlsZWQsIHN5bWJvbCwgbGlicmFyeSApOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIF9faXR0X2Vycm9yX3Vua25vd25fZ3JvdXAgOiB7CisgICAgICAgICAgICBjaGFyIGNvbnN0ICogdmFyICAgPSB2YV9hcmcoIGFyZ3MsIGNoYXIgY29uc3QgKiApOworICAgICAgICAgICAgY2hhciBjb25zdCAqIGdyb3VwID0gdmFfYXJnKCBhcmdzLCBjaGFyIGNvbnN0ICogKTsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBJdHRVbmtub3duR3JvdXAsIHZhciwgZ3JvdXAgKTsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBfX2l0dF9lcnJvcl9lbnZfdG9vX2xvbmcgOiB7CisgICAgICAgICAgICBjaGFyIGNvbnN0ICogdmFyICAgICA9IHZhX2FyZyggYXJncywgY2hhciBjb25zdCAqICk7CisgICAgICAgICAgICBzaXplX3QgICAgICAgYWN0X2xlbiA9IHZhX2FyZyggYXJncywgc2l6ZV90ICk7CisgICAgICAgICAgICBzaXplX3QgICAgICAgbWF4X2xlbiA9IHZhX2FyZyggYXJncywgc2l6ZV90ICk7CisgICAgICAgICAgICBLTVBfV0FSTklORyggSXR0RW52VmFyVG9vTG9uZywgdmFyLCAodW5zaWduZWQgbG9uZykgYWN0X2xlbiwgKHVuc2lnbmVkIGxvbmcpIG1heF9sZW4gKTsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBfX2l0dF9lcnJvcl9jYW50X3JlYWRfZW52IDogeworICAgICAgICAgICAgY2hhciBjb25zdCAqIHZhciAgICAgPSB2YV9hcmcoIGFyZ3MsIGNoYXIgY29uc3QgKiApOworICAgICAgICAgICAgaW50ICAgICAgICAgIHN5c19lcnIgPSB2YV9hcmcoIGFyZ3MsIGludCApOworICAgICAgICAgICAgX19rbXBfbXNnKCBrbXBfbXNfd2FybmluZywgS01QX01TRyggQ2FudEdldEVudlZhciwgdmFyICksIEtNUF9FUlIoIHN5c19lcnIgKSwgX19rbXBfbXNnX251bGwgKTsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBfX2l0dF9lcnJvcl9zeXN0ZW0gOiB7CisgICAgICAgICAgICBjaGFyIGNvbnN0ICogZnVuYyAgICA9IHZhX2FyZyggYXJncywgY2hhciBjb25zdCAqICk7CisgICAgICAgICAgICBpbnQgICAgICAgICAgc3lzX2VyciA9IHZhX2FyZyggYXJncywgaW50ICk7CisgICAgICAgICAgICBfX2ttcF9tc2coIGttcF9tc193YXJuaW5nLCBLTVBfTVNHKCBJdHRGdW5jdGlvbkVycm9yLCBmdW5jICksIEtNUF9TWVNFUlJDT0RFKCBzeXNfZXJyICksIF9fa21wX21zZ19udWxsICk7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGRlZmF1bHQgOiB7CisgICAgICAgICAgICBLTVBfV0FSTklORyggSXR0VW5rbm93bkVycm9yLCBlcnIgKTsKKyAgICAgICAgfTsKKyAgICB9OyAvLyBzd2l0Y2gKKworfSAvLyBfX2l0dF9lcnJvcl9oYW5kbGVyCisKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfaXR0LmggYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfaXR0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVkZGJjNgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9pdHQuaApAQCAtMCwwICsxLDMwMyBAQAorI2lmIFVTRV9JVFRfQlVJTEQKKy8qCisgKiBrbXBfaXR0LmggLS0gSVRUIE5vdGlmeSBpbnRlcmZhY2UuCisgKiAkUmV2aXNpb246IDQzNDU3ICQKKyAqICREYXRlOiAyMDE0LTA5LTE3IDAzOjU3OjIyIC0wNTAwIChXZWQsIDE3IFNlcCAyMDE0KSAkCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgS01QX0lUVF9ICisjZGVmaW5lIEtNUF9JVFRfSAorCisjaW5jbHVkZSAia21wX2xvY2suaCIKKworI2RlZmluZSBJTlRFTF9JVFROT1RJRllfQVBJX1BSSVZBVEUKKyNpbmNsdWRlICJpdHRub3RpZnkuaCIKKyNpbmNsdWRlICJsZWdhY3kvaXR0bm90aWZ5LmgiCisKKyNpZiBLTVBfREVCVUcKKyAgICAjZGVmaW5lIF9fa21wX2lubGluZSAgICAgICAgICAgLy8gVHVybiBvZmYgaW5saW5pbmcgaW4gZGVidWcgbW9kZS4KKyNlbHNlCisgICAgI2RlZmluZSBfX2ttcF9pbmxpbmUgc3RhdGljIGlubGluZQorI2VuZGlmCisKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIGV4dGVybiBrbXBfaW50MzIgIF9fa21wX2l0dF9wcmVwYXJlX2RlbGF5OworIyBpZmRlZiBfX2NwbHVzcGx1cworICAgIGV4dGVybiAiQyIgdm9pZCBfX2ttcF9pdHRfZmluaV9pdHRsaWIodm9pZCk7CisjIGVsc2UKKyAgICBleHRlcm4gdm9pZCBfX2ttcF9pdHRfZmluaV9pdHRsaWIodm9pZCk7CisjIGVuZGlmCisjZW5kaWYKKworLy8gU2ltcGxpZnkgdGhlIGhhbmRsaW5nIG9mIGFuIGFyZ3VtZW50IHRoYXQgaXMgb25seSByZXF1aXJlZCB3aGVuIFVTRV9JVFRfQlVJTEQgaXMgZW5hYmxlZC4KKyNkZWZpbmUgVVNFX0lUVF9CVUlMRF9BUkcoeCkgLHgKKwordm9pZCBfX2ttcF9pdHRfaW5pdGlhbGl6ZSgpOwordm9pZCBfX2ttcF9pdHRfZGVzdHJveSgpOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBOZXcgc3R1ZmYgZm9yIHJlcG9ydGluZyBoaWdoLWxldmVsIGNvbnN0cnVjdHMuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIE5vdGUgdGhlIG5hbWluZyBjb252ZW50aW9uOgorLy8gICAgIF9fa21wX2l0dF94eHhpbmcoKSBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSBhY3Rpb24sIHdoaWxlCisvLyAgICAgX19rbXBfaXR0X3h4eGVkKCkgIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgYWN0aW9uLgorCisvLyAtLS0gUGFyYWxsZWwgcmVnaW9uIHJlcG9ydGluZyAtLS0KK19fa21wX2lubGluZSB2b2lkIF9fa21wX2l0dF9yZWdpb25fZm9ya2luZyggIGludCBndGlkLCBpbnQgdGVhbV9zaXplLCBpbnQgYmFycmllcnMsIGludCBzZXJpYWxpemVkID0gMCApOyAvLyBNYXN0ZXIgb25seSwgYmVmb3JlIGZvcmtpbmcgdGhyZWFkcy4KK19fa21wX2lubGluZSB2b2lkIF9fa21wX2l0dF9yZWdpb25fam9pbmVkKCAgIGludCBndGlkLCBpbnQgc2VyaWFsaXplZCA9IDAgKTsgLy8gTWFzdGVyIG9ubHksIGFmdGVyIGpvaW5pbmcgdGhyZWFkcy4KKyAgICAvLyAoKikgTm90ZTogQSB0aHJlYWQgbWF5IGV4ZWN1dGUgdGFza3MgYWZ0ZXIgdGhpcyBwb2ludCwgdGhvdWdoLgorCisvLyAtLS0gRnJhbWUgcmVwb3J0aW5nIC0tLQorLy8gcmVnaW9uID0gMCAtIG5vIHJlZ2lvbnMsIHJlZ2lvbiA9IDEgLSBwYXJhbGxlbCwgcmVnaW9uID0gMiAtIHNlcmlhbGl6ZWQgcGFyYWxsZWwKK19fa21wX2lubGluZSB2b2lkIF9fa21wX2l0dF9mcmFtZV9zdWJtaXQoIGludCBndGlkLCBfX2l0dF90aW1lc3RhbXAgYmVnaW4sIF9faXR0X3RpbWVzdGFtcCBlbmQsIGludCBpbWJhbGFuY2UsIGlkZW50X3QgKmxvYywgaW50IHRlYW1fc2l6ZSwgaW50IHJlZ2lvbiA9IDAgKTsKKworLy8gLS0tIE1ldGFkYXRhIHJlcG9ydGluZyAtLS0KKy8vIGJlZ2luL2VuZCAtIGJlZ2luL2VuZCB0aW1lc3RhbXBzIG9mIGEgYmFycmllciBmcmFtZSwgaW1iYWxhbmNlIC0gYWdncmVnYXRlZCB3YWl0IHRpbWUgdmFsdWUsIHJlZHVjdGlvbiAtaWYgdGhpcyBpcyBhIHJlZHVjdGlvbiBiYXJyaWVyCitfX2ttcF9pbmxpbmUgdm9pZCBfX2ttcF9pdHRfbWV0YWRhdGFfaW1iYWxhbmNlKCBpbnQgZ3RpZCwga21wX3VpbnQ2NCBiZWdpbiwga21wX3VpbnQ2NCBlbmQsIGttcF91aW50NjQgaW1iYWxhbmNlLCBrbXBfdWludDY0IHJlZHVjdGlvbiApOworLy8gc2NoZWRfdHlwZTogMCAtIHN0YXRpYywgMSAtIGR5bmFtaWMsIDIgLSBndWlkZWQsIDMgLSBjdXN0b20gKGFsbCBvdGhlcnMpOyBpdGVyYXRpb25zIC0gbG9vcCB0cmlwIGNvdW50LCBjaHVuayAtIGNodW5rIHNpemUKK19fa21wX2lubGluZSB2b2lkIF9fa21wX2l0dF9tZXRhZGF0YV9sb29wKCBpZGVudF90ICogbG9jLCBrbXBfdWludDY0IHNjaGVkX3R5cGUsIGttcF91aW50NjQgaXRlcmF0aW9ucywga21wX3VpbnQ2NCBjaHVuayApOworX19rbXBfaW5saW5lIHZvaWQgX19rbXBfaXR0X21ldGFkYXRhX3NpbmdsZSgpOworCisvLyAtLS0gQmFycmllciByZXBvcnRpbmcgLS0tCitfX2ttcF9pbmxpbmUgdm9pZCAqIF9fa21wX2l0dF9iYXJyaWVyX29iamVjdCggaW50IGd0aWQsIGludCBidCwgaW50IHNldF9uYW1lID0gMCwgaW50IGRlbHRhID0gMCApOworX19rbXBfaW5saW5lIHZvaWQgICBfX2ttcF9pdHRfYmFycmllcl9zdGFydGluZyggaW50IGd0aWQsIHZvaWQgKiBvYmplY3QgKTsKK19fa21wX2lubGluZSB2b2lkICAgX19rbXBfaXR0X2JhcnJpZXJfbWlkZGxlKCAgIGludCBndGlkLCB2b2lkICogb2JqZWN0ICk7CitfX2ttcF9pbmxpbmUgdm9pZCAgIF9fa21wX2l0dF9iYXJyaWVyX2ZpbmlzaGVkKCBpbnQgZ3RpZCwgdm9pZCAqIG9iamVjdCApOworCisvLyAtLS0gVGFza3dhaXQgcmVwb3J0aW5nIC0tLQorX19rbXBfaW5saW5lIHZvaWQgKiBfX2ttcF9pdHRfdGFza3dhaXRfb2JqZWN0KCBpbnQgZ3RpZCApOworX19rbXBfaW5saW5lIHZvaWQgICBfX2ttcF9pdHRfdGFza3dhaXRfc3RhcnRpbmcoIGludCBndGlkLCB2b2lkICogb2JqZWN0ICk7CitfX2ttcF9pbmxpbmUgdm9pZCAgIF9fa21wX2l0dF90YXNrd2FpdF9maW5pc2hlZCggICBpbnQgZ3RpZCwgdm9pZCAqIG9iamVjdCApOworCisvLyAtLS0gVGFzayByZXBvcnRpbmcgLS0tCitfX2ttcF9pbmxpbmUgdm9pZCAgIF9fa21wX2l0dF90YXNrX3N0YXJ0aW5nKCB2b2lkICogb2JqZWN0ICk7CitfX2ttcF9pbmxpbmUgdm9pZCAgIF9fa21wX2l0dF90YXNrX2ZpbmlzaGVkKCB2b2lkICogb2JqZWN0ICk7CisKKy8vIC0tLSBMb2NrIHJlcG9ydGluZyAtLS0KK19fa21wX2lubGluZSB2b2lkICAgX19rbXBfaXR0X2xvY2tfY3JlYXRpbmcoICBrbXBfdXNlcl9sb2NrX3AgbG9jayApOworX19rbXBfaW5saW5lIHZvaWQgICBfX2ttcF9pdHRfbG9ja19hY3F1aXJpbmcoIGttcF91c2VyX2xvY2tfcCBsb2NrICk7CitfX2ttcF9pbmxpbmUgdm9pZCAgIF9fa21wX2l0dF9sb2NrX2FjcXVpcmVkKCAga21wX3VzZXJfbG9ja19wIGxvY2sgKTsKK19fa21wX2lubGluZSB2b2lkICAgX19rbXBfaXR0X2xvY2tfcmVsZWFzaW5nKCBrbXBfdXNlcl9sb2NrX3AgbG9jayApOworX19rbXBfaW5saW5lIHZvaWQgICBfX2ttcF9pdHRfbG9ja19jYW5jZWxsZWQoIGttcF91c2VyX2xvY2tfcCBsb2NrICk7CitfX2ttcF9pbmxpbmUgdm9pZCAgIF9fa21wX2l0dF9sb2NrX2Rlc3Ryb3llZCgga21wX3VzZXJfbG9ja19wIGxvY2sgKTsKKworLy8gLS0tIENyaXRpY2FsIHJlcG9ydGluZyAtLS0KK19fa21wX2lubGluZSB2b2lkICAgX19rbXBfaXR0X2NyaXRpY2FsX2NyZWF0aW5nKCAga21wX3VzZXJfbG9ja19wIGxvY2sgKTsKK19fa21wX2lubGluZSB2b2lkICAgX19rbXBfaXR0X2NyaXRpY2FsX2FjcXVpcmluZygga21wX3VzZXJfbG9ja19wIGxvY2sgKTsKK19fa21wX2lubGluZSB2b2lkICAgX19rbXBfaXR0X2NyaXRpY2FsX2FjcXVpcmVkKCAga21wX3VzZXJfbG9ja19wIGxvY2sgKTsKK19fa21wX2lubGluZSB2b2lkICAgX19rbXBfaXR0X2NyaXRpY2FsX3JlbGVhc2luZygga21wX3VzZXJfbG9ja19wIGxvY2sgKTsKK19fa21wX2lubGluZSB2b2lkICAgX19rbXBfaXR0X2NyaXRpY2FsX2Rlc3Ryb3llZCgga21wX3VzZXJfbG9ja19wIGxvY2sgKTsKKworLy8gLS0tIFNpbmdsZSByZXBvcnRpbmcgLS0tCitfX2ttcF9pbmxpbmUgdm9pZCAgIF9fa21wX2l0dF9zaW5nbGVfc3RhcnQoIGludCBndGlkICk7CitfX2ttcF9pbmxpbmUgdm9pZCAgIF9fa21wX2l0dF9zaW5nbGVfZW5kKCAgIGludCBndGlkICk7CisKKy8vIC0tLSBPcmRlcmVkIHJlcG9ydGluZyAtLS0KK19fa21wX2lubGluZSB2b2lkICAgX19rbXBfaXR0X29yZGVyZWRfaW5pdCggIGludCBndGlkICk7CitfX2ttcF9pbmxpbmUgdm9pZCAgIF9fa21wX2l0dF9vcmRlcmVkX3ByZXAoICBpbnQgZ3RpZCApOworX19rbXBfaW5saW5lIHZvaWQgICBfX2ttcF9pdHRfb3JkZXJlZF9zdGFydCggaW50IGd0aWQgKTsKK19fa21wX2lubGluZSB2b2lkICAgX19rbXBfaXR0X29yZGVyZWRfZW5kKCAgIGludCBndGlkICk7CisKKy8vIC0tLSBUaHJlYWRzIHJlcG9ydGluZyAtLS0KK19fa21wX2lubGluZSB2b2lkICBfX2ttcF9pdHRfdGhyZWFkX2lnbm9yZSgpOworX19rbXBfaW5saW5lIHZvaWQgIF9fa21wX2l0dF90aHJlYWRfbmFtZSggaW50IGd0aWQgKTsKKworLy8gLS0tIFN5c3RlbSBvYmplY3RzIC0tLQorX19rbXBfaW5saW5lIHZvaWQgICBfX2ttcF9pdHRfc3lzdGVtX29iamVjdF9jcmVhdGVkKCB2b2lkICogb2JqZWN0LCBjaGFyIGNvbnN0ICogbmFtZSApOworCisvLyAtLS0gU3RhY2sgc3RpdGNoaW5nIC0tLQorX19rbXBfaW5saW5lIF9faXR0X2NhbGxlciBfX2ttcF9pdHRfc3RhY2tfY2FsbGVyX2NyZWF0ZSh2b2lkKTsKK19fa21wX2lubGluZSB2b2lkIF9fa21wX2l0dF9zdGFja19jYWxsZXJfZGVzdHJveShfX2l0dF9jYWxsZXIpOworX19rbXBfaW5saW5lIHZvaWQgX19rbXBfaXR0X3N0YWNrX2NhbGxlZV9lbnRlcihfX2l0dF9jYWxsZXIpOworX19rbXBfaW5saW5lIHZvaWQgX19rbXBfaXR0X3N0YWNrX2NhbGxlZV9sZWF2ZShfX2l0dF9jYWxsZXIpOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBPbGQgc3R1ZmYgZm9yIHJlcG9ydGluZyBsb3ctbGV2ZWwgaW50ZXJuYWwgc3luY2hyb25pemF0aW9uLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWYgVVNFX0lUVF9OT1RJRlkKKworICAgIC8qCisgICAgICogU3VwcG9ydCBmb3IgU1NDIG1hcmtzLCB3aGljaCBhcmUgdXNlZCBieSBTREUKKyAgICAgKiBodHRwOi8vc29mdHdhcmUuaW50ZWwuY29tL2VuLXVzL2FydGljbGVzL2ludGVsLXNvZnR3YXJlLWRldmVsb3BtZW50LWVtdWxhdG9yCisgICAgICogdG8gbWFyayBwb2ludHMgaW4gaW5zdHJ1Y3Rpb24gdHJhY2VzIHRoYXQgcmVwcmVzZW50IHNwaW4tbG9vcHMgYW5kIGFyZQorICAgICAqIHRoZXJlZm9yZSB1bmludGVyZXN0aW5nIHdoZW4gY29sbGVjdGluZyB0cmFjZXMgZm9yIGFyY2hpdGVjdHVyZSBzaW11bGF0aW9uLgorICAgICAqLworICAgICNpZm5kZWYgSU5DTFVERV9TU0NfTUFSS1MKKyAgICAjIGRlZmluZSBJTkNMVURFX1NTQ19NQVJLUyAoS01QX09TX0xJTlVYICYmIEtNUF9BUkNIX1g4Nl82NCkKKyAgICAjZW5kaWYKKworICAgIC8qIExpbnV4IDY0IG9ubHkgZm9yIG5vdyAqLworICAgICNpZiAoSU5DTFVERV9TU0NfTUFSS1MgJiYgS01QX09TX0xJTlVYICYmIEtNUF9BUkNIX1g4Nl82NCkKKyAgICAvLyBQb3J0YWJsZSAoYXQgbGVhc3QgZm9yIGdjYyBhbmQgaWNjKSBjb2RlIHRvIGluc2VydCB0aGUgbmVjZXNzYXJ5IGluc3RydWN0aW9ucworICAgIC8vIHRvIHNldCAlZWJ4IGFuZCBleGVjdXRlIHRoZSB1bmxpa2VseSBuby1vcC4KKyAgICAgICNpZiBkZWZpbmVkKCBfX0lOVEVMX0NPTVBJTEVSICkKKyAgICAgICMgZGVmaW5lIElOU0VSVF9TU0NfTUFSSyh0YWcpIF9fU1NDX01BUksodGFnKQorICAgICAgI2Vsc2UKKyAgICAgICMgZGVmaW5lIElOU0VSVF9TU0NfTUFSSyh0YWcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3ZsICUwLCAlJWVieDsgLmJ5dGUgMHg2NCwgMHg2NywgMHg5MCAiIDo6ImkiKHRhZyk6IiVlYngiKQorICAgICAgI2VuZGlmCisgICAgI2Vsc2UKKyAgICAjIGRlZmluZSBJTlNFUlRfU1NDX01BUksodGFnKSAoKHZvaWQpMCkKKyAgICAjZW5kaWYKKworICAgIC8qIE1hcmtlcnMgZm9yIHRoZSBzdGFydCBhbmQgZW5kIG9mIHJlZ2lvbnMgdGhhdCByZXByZXNlbnQgcG9sbGluZyBhbmQKKyAgICAgKiBhcmUgdGhlcmVmb3JlIHVuaW50ZXJlc3RpbmcgdG8gYXJjaGl0ZWN0dXJhbCBzaW11bGF0aW9ucyAweDQzNzYgYW5kCisgICAgICogMHg0Mzc3IGFyZSBhcmJpdHJhcnkgbnVtYmVycyB0aGF0IHNob3VsZCBiZSB1bmlxdWUgaW4gdGhlIHNwYWNlIG9mCisgICAgICogU1NDIHRhZ3MsIGJ1dCB0aGVyZSBpcyBubyBjZW50cmFsIGlzc3VpbmcgYXV0aG9yaXR5IHJhdGhlcgorICAgICAqIHJhbmRvbW5lc3MgaXMgZXhwZWN0ZWQgdG8gd29yay4KKyAgICAgKi8KKyAgICAjZGVmaW5lIFNTQ19NQVJLX1NQSU5fU1RBUlQoKSBJTlNFUlRfU1NDX01BUksoMHg0Mzc2KQorICAgICNkZWZpbmUgU1NDX01BUktfU1BJTl9FTkQoKSAgIElOU0VSVF9TU0NfTUFSSygweDQzNzcpCisKKyAgICAvLyBNYXJrZXJzIGZvciBhcmNoaXRlY3R1cmUgc2ltdWxhdGlvbi4KKyAgICAvLyBGT1JLSU5HICAgICAgOiBCZWZvcmUgdGhlIG1hc3RlciB0aHJlYWQgZm9ya3MuCisgICAgLy8gSk9JTklORyAgICAgIDogQXQgdGhlIHN0YXJ0IG9mIHRoZSBqb2luLgorICAgIC8vIElOVk9LSU5HICAgICA6IEJlZm9yZSB0aGUgdGhyZWFkcyBpbnZva2UgbWljcm90YXNrcy4KKyAgICAvLyBESVNQQVRDSF9JTklUOiBBdCB0aGUgc3RhcnQgb2YgZHluYW1pY2FsbHkgc2NoZWR1bGVkIGxvb3AuCisgICAgLy8gRElTUEFUQ0hfTkVYVDogQWZ0ZXIgY2xhbWluZyBuZXh0IGl0ZXJhdGlvbiBvZiBkeW5hbWljYWxseSBzY2hlZHVsZWQgbG9vcC4KKyAgICAjZGVmaW5lIFNTQ19NQVJLX0ZPUktJTkcoKSAgICAgICAgICBJTlNFUlRfU1NDX01BUksoMHhkNjkzKQorICAgICNkZWZpbmUgU1NDX01BUktfSk9JTklORygpICAgICAgICAgIElOU0VSVF9TU0NfTUFSSygweGQ2OTQpCisgICAgI2RlZmluZSBTU0NfTUFSS19JTlZPS0lORygpICAgICAgICAgSU5TRVJUX1NTQ19NQVJLKDB4ZDY5NSkKKyAgICAjZGVmaW5lIFNTQ19NQVJLX0RJU1BBVENIX0lOSVQoKSAgICBJTlNFUlRfU1NDX01BUksoMHhkNjk2KQorICAgICNkZWZpbmUgU1NDX01BUktfRElTUEFUQ0hfTkVYVCgpICAgIElOU0VSVF9TU0NfTUFSSygweGQ2OTcpCisKKyAgICAvLyBUaGUgb2JqZWN0IGlzIGFuIGFkZHJlc3MgdGhhdCBhc3NvY2lhdGVzIGEgc3BlY2lmaWMgc2V0IG9mIHRoZSBwcmVwYXJlLCBhY3F1aXJlLCByZWxlYXNlLAorICAgIC8vIGFuZCBjYW5jZWwgb3BlcmF0aW9ucy4KKworICAgIC8qIFN5bmMgcHJlcGFyZSBpbmRpY2F0ZXMgYSB0aHJlYWQgaXMgZ29pbmcgdG8gc3RhcnQgd2FpdGluZyBmb3IgYW5vdGhlciB0aHJlYWQKKyAgICAgICB0byBzZW5kIGEgcmVsZWFzZSBldmVudC4gIFRoaXMgb3BlcmF0aW9uIHNob3VsZCBiZSBkb25lIGp1c3QgYmVmb3JlIHRoZSB0aHJlYWQKKyAgICAgICBiZWdpbnMgY2hlY2tpbmcgZm9yIHRoZSBleGlzdGVuY2Ugb2YgdGhlIHJlbGVhc2UgZXZlbnQgKi8KKworICAgIC8qIFN5bmMgY2FuY2VsIGluZGljYXRlcyBhIHRocmVhZCBpcyBjYW5jZWxsaW5nIGEgd2FpdCBvbiBhbm90aGVyIHRocmVhZCBhbmMKKyAgICAgICBjb250aW51aW5nIGV4ZWN1dGlvbiB3aXRob3V0IHdhaXRpbmcgZm9yIHRoZSBvdGhlciB0aHJlYWQgdG8gcmVsZWFzZSBpdCAqLworCisgICAgLyogU3luYyBhY3F1aXJlZCBpbmRpY2F0ZXMgYSB0aHJlYWQgaGFzIHJlY2VpdmVkIGEgcmVsZWFzZSBldmVudCBmcm9tIGFub3RoZXIKKyAgICAgICB0aHJlYWQgYW5kIGhhcyBzdG9wcGVkIHdhaXRpbmcuICBUaGlzIG9wZXJhdGlvbiBtdXN0IG9jY3VyIG9ubHkgYWZ0ZXIgdGhlIHJlbGVhc2UKKyAgICAgICBldmVudCBpcyByZWNlaXZlZC4gKi8KKworICAgIC8qIFN5bmMgcmVsZWFzZSBpbmRpY2F0ZXMgYSB0aHJlYWQgaXMgZ29pbmcgdG8gc2VuZCBhIHJlbGVhc2UgZXZlbnQgdG8gYW5vdGhlciB0aHJlYWQKKyAgICAgICBzbyBpdCB3aWxsIHN0b3Agd2FpdGluZyBhbmQgY29udGludWUgZXhlY3V0aW9uLiBUaGlzIG9wZXJhdGlvbiBtdXN0IGp1c3QgaGFwcGVuIGJlZm9yZQorICAgICAgIHRoZSByZWxlYXNlIGV2ZW50LiAqLworCisgICAgI2RlZmluZSBLTVBfRlNZTkNfUFJFUEFSRSggICBvYmogKSAgX19pdHRfZnN5bmNfcHJlcGFyZSggICAodm9pZCAqKSggb2JqICkgKQorICAgICNkZWZpbmUgS01QX0ZTWU5DX0NBTkNFTCggICAgb2JqICkgIF9faXR0X2ZzeW5jX2NhbmNlbCggICAgKHZvaWQgKikoIG9iaiApICkKKyAgICAjZGVmaW5lIEtNUF9GU1lOQ19BQ1FVSVJFRCggIG9iaiApICBfX2l0dF9mc3luY19hY3F1aXJlZCggICh2b2lkICopKCBvYmogKSApCisgICAgI2RlZmluZSBLTVBfRlNZTkNfUkVMRUFTSU5HKCBvYmogKSAgX19pdHRfZnN5bmNfcmVsZWFzaW5nKCAodm9pZCAqKSggb2JqICkgKQorCisgICAgLyoKKyAgICAgICAgSW4gY2FzZSBvZiB3YWl0aW5nIGluIGEgc3BpbiBsb29wLCBJVFQgd2FudHMgS01QX0ZTWU5DX1BSRVBBUkUoKSB0byBiZSBjYWxsZWQgd2l0aCBhIGRlbGF5CisgICAgICAgIChhbmQgbm90IGNhbGxlZCBhdCBhbGwgaWYgd2FpdGluZyB0aW1lIGlzIHNtYWxsKS4gU28sIGluIHNwaW4gbG9vcHMsIGRvIG5vdCB1c2UKKyAgICAgICAgS01QX0ZTWU5DX1BSRVBBUkUoKSwgYnV0IHVzZSBLTVBfRlNZTkNfU1BJTl9JTklUKCkgKGJlZm9yZSBzcGluIGxvb3ApLAorICAgICAgICBLTVBfRlNZTkNfU1BJTl9QUkVQQVJFKCkgKHdoaXRoaW4gdGhlIHNwaW4gbG9vcCksIGFuZCBLTVBfRlNZTkNfU1BJTl9BQ1FVSVJFRCgpLgorICAgICAgICBTZWUgS01QX1dBSVRfWUlFTEQoKSBmb3IgZXhhbXBsZS4KKyAgICAqLworCisgICAgI3VuZGVmICBLTVBfRlNZTkNfU1BJTl9JTklUCisgICAgI2RlZmluZSBLTVBfRlNZTkNfU1BJTl9JTklUKCBvYmosIHNwaW4gKSAgICBcCisgICAgICAgIGludCBzeW5jX2l0ZXJzID0gMDsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICggX19pdHRfZnN5bmNfcHJlcGFyZV9wdHIgKSB7ICAgICAgICBcCisgICAgICAgICAgICBpZiAoIG9iaiA9PSBOVUxMICkgeyAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgb2JqID0gc3BpbjsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9IC8qIGlmICovICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gLyogaWYgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFNTQ19NQVJLX1NQSU5fU1RBUlQoKQorCisgICAgI3VuZGVmICBLTVBfRlNZTkNfU1BJTl9QUkVQQVJFCisgICAgI2RlZmluZSBLTVBfRlNZTkNfU1BJTl9QUkVQQVJFKCBvYmogKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICggX19pdHRfZnN5bmNfcHJlcGFyZV9wdHIgJiYgc3luY19pdGVycyA8IF9fa21wX2l0dF9wcmVwYXJlX2RlbGF5ICkgeyBcCisgICAgICAgICAgICArKyBzeW5jX2l0ZXJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoIHN5bmNfaXRlcnMgPj0gX19rbXBfaXR0X3ByZXBhcmVfZGVsYXkgKSB7ICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgS01QX0ZTWU5DX1BSRVBBUkUoICh2b2lkKikgb2JqICk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9IC8qIGlmICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gLyogaWYgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIH0gd2hpbGUgKDApCisgICAgI3VuZGVmICBLTVBfRlNZTkNfU1BJTl9BQ1FVSVJFRAorICAgICNkZWZpbmUgS01QX0ZTWU5DX1NQSU5fQUNRVUlSRUQoIG9iaiApIGRvIHsgICAgICAgICBcCisgICAgICAgIFNTQ19NQVJLX1NQSU5fRU5EKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKCBzeW5jX2l0ZXJzID49IF9fa21wX2l0dF9wcmVwYXJlX2RlbGF5ICkgeyAgXAorICAgICAgICAgICAgS01QX0ZTWU5DX0FDUVVJUkVEKCAodm9pZCopIG9iaiApOyAgICAgICAgICBcCisgICAgICAgIH0gLyogaWYgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgfSB3aGlsZSAoMCkKKworICAgIC8qIElUVCB3aWxsIG5vdCByZXBvcnQgb2JqZWN0cyBjcmVhdGVkIHdpdGhpbiBLTVBfSVRUX0lHTk9SRSgpLCBlLiBnLjoKKyAgICAgICAgICAgS01QX0lUVF9JR05PUkUoCisgICAgICAgICAgICAgICBwdHIgPSBtYWxsb2MoIHNpemUgKTsKKyAgICAgICAgICAgKTsKKyAgICAqLworICAgICNkZWZpbmUgS01QX0lUVF9JR05PUkUoIHN0YXRlbWVudCApIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgX19pdHRfc3RhdGVfdCBfX2l0dF9zdGF0ZV87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKCBfX2l0dF9zdGF0ZV9nZXRfcHRyICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIF9faXR0X3N0YXRlXyA9IF9faXR0X3N0YXRlX2dldCgpOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIF9faXR0X29ial9tb2RlX3NldCggX19pdHRfb2JqX3Byb3BfaWdub3JlLCBfX2l0dF9vYmpfc3RhdGVfc2V0ICk7IFwKKyAgICAgICAgICAgIH0gIC8qIGlmICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHsgc3RhdGVtZW50IH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmICggX19pdHRfc3RhdGVfZ2V0X3B0ciApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBfX2l0dF9zdGF0ZV9zZXQoIF9faXR0X3N0YXRlXyApOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gIC8qIGlmICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKQorCisgICAgY29uc3QgaW50IEtNUF9NQVhfRlJBTUVfRE9NQUlOUyA9IDUxMjsgLy8gTWF4aW11bSBudW1iZXIgb2YgZnJhbWUgZG9tYWlucyB0byB1c2UgKG1hcHMgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkaWZmZXJlbnQgT3Blbk1QIHJlZ2lvbnMgaW4gdGhlIHVzZXIgc291cmNlIGNvZGUpLgorICAgIGV4dGVybiBrbXBfaW50MzIgX19rbXBfYmFycmllcl9kb21haW5fY291bnQ7CisgICAgZXh0ZXJuIGttcF9pbnQzMiBfX2ttcF9yZWdpb25fZG9tYWluX2NvdW50OworICAgIGV4dGVybiBfX2l0dF9kb21haW4qIF9fa21wX2l0dF9iYXJyaWVyX2RvbWFpbnNbS01QX01BWF9GUkFNRV9ET01BSU5TXTsKKyAgICBleHRlcm4gX19pdHRfZG9tYWluKiBfX2ttcF9pdHRfcmVnaW9uX2RvbWFpbnNbS01QX01BWF9GUkFNRV9ET01BSU5TXTsKKyAgICBleHRlcm4gX19pdHRfZG9tYWluKiBfX2ttcF9pdHRfaW1iYWxhbmNlX2RvbWFpbnNbS01QX01BWF9GUkFNRV9ET01BSU5TXTsKKyAgICBleHRlcm4ga21wX2ludDMyIF9fa21wX2l0dF9yZWdpb25fdGVhbV9zaXplW0tNUF9NQVhfRlJBTUVfRE9NQUlOU107CisgICAgZXh0ZXJuIF9faXR0X2RvbWFpbiAqIG1ldGFkYXRhX2RvbWFpbjsKKworI2Vsc2UKKworLy8gTnVsbCBkZWZpbml0aW9ucyBvZiB0aGUgc3luY2hyb25pemF0aW9uIHRyYWNpbmcgZnVuY3Rpb25zLgorIyBkZWZpbmUgS01QX0ZTWU5DX1BSRVBBUkUoICAgb2JqICkgICAgICAgICgodm9pZCkwKQorIyBkZWZpbmUgS01QX0ZTWU5DX0NBTkNFTCggICAgb2JqICkgICAgICAgICgodm9pZCkwKQorIyBkZWZpbmUgS01QX0ZTWU5DX0FDUVVJUkVEKCAgb2JqICkgICAgICAgICgodm9pZCkwKQorIyBkZWZpbmUgS01QX0ZTWU5DX1JFTEVBU0lORyggb2JqICkgICAgICAgICgodm9pZCkwKQorCisjIGRlZmluZSBLTVBfRlNZTkNfU1BJTl9JTklUKCBvYmosIHNwaW4gKSAgKCh2b2lkKTApCisjIGRlZmluZSBLTVBfRlNZTkNfU1BJTl9QUkVQQVJFKCAgb2JqICkgICAgKCh2b2lkKTApCisjIGRlZmluZSBLTVBfRlNZTkNfU1BJTl9BQ1FVSVJFRCggb2JqICkgICAgKCh2b2lkKTApCisKKyMgZGVmaW5lIEtNUF9JVFRfSUdOT1JFKHN0bXQgKSBkbyB7IHN0bXQgfSB3aGlsZSAoMCkKKworI2VuZGlmIC8vIFVTRV9JVFRfTk9USUZZCisKKyNpZiAhIEtNUF9ERUJVRworICAgIC8vIEluIHJlbGVhc2UgbW9kZSBpbmNsdWRlIGRlZmluaXRpb25zIG9mIGlubGluZSBmdW5jdGlvbnMuCisgICAgI2luY2x1ZGUgImttcF9pdHQuaW5sIgorI2VuZGlmCisKKyNlbmRpZiAvLyBLTVBfSVRUX0gKKworI2Vsc2UgIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworLy8gTnVsbCBkZWZpbml0aW9ucyBvZiB0aGUgc3luY2hyb25pemF0aW9uIHRyYWNpbmcgZnVuY3Rpb25zLgorLy8gSWYgVVNFX0lUVF9CVUxJRCBpcyBub3QgZW5hYmxlZCwgVVNFX0lUVF9OT1RJRlkgY2Fubm90IGJlIGVpdGhlci4KKy8vIEJ5IGRlZmluaW5nIHRoZXNlIHdlIGF2b2lkIHVucGxlYXNhbnQgaWZkZWYgdGVzdHMgaW4gbWFueSBwbGFjZXMuCisjIGRlZmluZSBLTVBfRlNZTkNfUFJFUEFSRSggICBvYmogKSAgICAgICAgKCh2b2lkKTApCisjIGRlZmluZSBLTVBfRlNZTkNfQ0FOQ0VMKCAgICBvYmogKSAgICAgICAgKCh2b2lkKTApCisjIGRlZmluZSBLTVBfRlNZTkNfQUNRVUlSRUQoICBvYmogKSAgICAgICAgKCh2b2lkKTApCisjIGRlZmluZSBLTVBfRlNZTkNfUkVMRUFTSU5HKCBvYmogKSAgICAgICAgKCh2b2lkKTApCisKKyMgZGVmaW5lIEtNUF9GU1lOQ19TUElOX0lOSVQoIG9iaiwgc3BpbiApICAoKHZvaWQpMCkKKyMgZGVmaW5lIEtNUF9GU1lOQ19TUElOX1BSRVBBUkUoICBvYmogKSAgICAoKHZvaWQpMCkKKyMgZGVmaW5lIEtNUF9GU1lOQ19TUElOX0FDUVVJUkVEKCBvYmogKSAgICAoKHZvaWQpMCkKKworIyBkZWZpbmUgS01QX0lUVF9JR05PUkUoc3RtdCApIGRvIHsgc3RtdCB9IHdoaWxlICgwKQorCisjIGRlZmluZSBVU0VfSVRUX0JVSUxEX0FSRyh4KQorCisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX2l0dC5pbmwgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfaXR0LmlubApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGFhZmNjCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX2l0dC5pbmwKQEAgLTAsMCArMSwxMDUxIEBACisjaWYgVVNFX0lUVF9CVUlMRAorLyoKKyAqIGttcF9pdHQuaW5sIC0tIElubGluZSBmdW5jdGlvbnMgb2YgSVRUIE5vdGlmeS4KKyAqICRSZXZpc2lvbjogNDM0NTcgJAorICogJERhdGU6IDIwMTQtMDktMTcgMDM6NTc6MjIgLTA1MDAgKFdlZCwgMTcgU2VwIDIwMTQpICQKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworLy8gSW5saW5lIGZ1bmN0aW9uIGRlZmluaXRpb25zLiBUaGlzIGZpbGUgc2hvdWxkIGJlIGluY2x1ZGVkIGludG8ga21wX2l0dC5oIGZpbGUgZm9yIHByb2RpY3Rpb24KKy8vIGJ1aWxkICh0byBsZXQgY29tcGxpbGVyIGlubGluZSBmdW5jdGlvbnMpIG9yIGludG8ga21wX2l0dC5jIGZpbGUgZm9yIGRlYnVnIGJ1aWxkICh0byByZWR1Y2UKKy8vIHRoZSBudW1iZXIgb2YgZmlsZXMgdG8gcmVjb21waWxlIGFuZCBzYXZlIGJ1aWxkIHRpbWUpLgorCisKKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJrbXBfc3RyLmgiCisKKyNpZiBLTVBfSVRUX0RFQlVHCisgICAgZXh0ZXJuIGttcF9ib290c3RyYXBfbG9ja190IF9fa21wX2l0dF9kZWJ1Z19sb2NrOworICAgICNkZWZpbmUgS01QX0lUVF9ERUJVR19MT0NLKCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmIF9fa21wX2l0dF9kZWJ1Z19sb2NrICk7ICAgICAgXAorICAgIH0KKyAgICAjZGVmaW5lIEtNUF9JVFRfREVCVUdfUFJJTlQoIC4uLiApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiIyUwMmQ6ICIsIF9fa21wX2dldF9ndGlkKCkgKTsgICAgICAgICAgICAgIFwKKyAgICAgICAgZnByaW50Ziggc3RkZXJyLCBfX1ZBX0FSR1NfXyApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZmZsdXNoKCBzdGRlcnIgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJiBfX2ttcF9pdHRfZGVidWdfbG9jayApOyAgICAgIFwKKyAgICB9CisjZWxzZQorICAgICNkZWZpbmUgS01QX0lUVF9ERUJVR19MT0NLKCkKKyAgICAjZGVmaW5lIEtNUF9JVFRfREVCVUdfUFJJTlQoIC4uLiApCisjZW5kaWYgLy8gS01QX0lUVF9ERUJVRworCisvLyBFbnN1cmUgdGhhdCB0aGUgZnVuY3Rpb25zIGFyZSBzdGF0aWMgaWYgdGhleSdyZSBzdXBwb3NlZCB0byBiZQorLy8gYmVpbmcgaW5saW5lZC4gT3RoZXJ3aXNlIHRoZXkgY2Fubm90IGJlIHVzZWQgaW4gbW9yZSB0aGFuIG9uZSBmaWxlLAorLy8gc2luY2UgdGhlcmUgd2lsbCBiZSBtdWx0aXBsZSBkZWZpbml0aW9ucy4KKyNpZiBLTVBfREVCVUcKKyMgZGVmaW5lIExJTktBR0UKKyNlbHNlCisjIGRlZmluZSBMSU5LQUdFIHN0YXRpYyBpbmxpbmUKKyNlbmRpZgorCisvLyBaQ0EgaW50ZXJmYWNlIHVzZWQgYnkgSW50ZWwoUikgSW5zcGVjdG9yLiBJbnRlbChSKSBQYXJhbGxlbCBBbXBsaWZpZXIgdXNlcyB0aGlzCisvLyBBUEkgdG8gc3VwcG9ydCB1c2VyLWRlZmluZWQgc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXMsIGJ1dCBkb2VzIG5vdCB1c2UgWkNBOworLy8gaXQgd291bGQgYmUgc2FmZSB0byB0dXJuIHRoaXMgb2ZmIHVudGlsIHdpZGVyIHN1cHBvcnQgYmVjb21lcyBhdmFpbGFibGUuCisjaWYgVVNFX0lUVF9aQ0EKKyNpZmRlZiBfX0lOVEVMX0NPTVBJTEVSCisjICAgaWYgX19JTlRFTF9DT01QSUxFUiA+PSAxMjAwCisjICAgICAgIHVuZGVmIF9faXR0X3N5bmNfYWNxdWlyZWQKKyMgICAgICAgdW5kZWYgX19pdHRfc3luY19yZWxlYXNpbmcKKyMgICAgICAgZGVmaW5lIF9faXR0X3N5bmNfYWNxdWlyZWQoYWRkcikgICAgX19ub3RpZnlfemNfaW50cmluc2ljKChjaGFyICopInN5bmNfYWNxdWlyZWQiLCBhZGRyKQorIyAgICAgICBkZWZpbmUgX19pdHRfc3luY19yZWxlYXNpbmcoYWRkcikgICBfX25vdGlmeV9pbnRyaW5zaWMoKGNoYXIgKikic3luY19yZWxlYXNpbmciLCBhZGRyKQorIyAgIGVuZGlmCisjZW5kaWYKKyNlbmRpZgorCitzdGF0aWMga21wX2Jvb3RzdHJhcF9sb2NrX3QgIG1ldGFkYXRhX2xvY2sgPSBLTVBfQk9PVFNUUkFQX0xPQ0tfSU5JVElBTElaRVIoIG1ldGFkYXRhX2xvY2sgKTsKKworLyoKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBQYXJhbGxlbCByZWdpb24gcmVwb3J0aW5nLgorCisgICAgICAgICogX19rbXBfaXR0X3JlZ2lvbl9mb3JraW5nIHNob3VsZCBiZSBjYWxsZWQgYnkgbWFzdGVyIHRocmVhZCBvZiBhIHRlYW0uIEV4YWN0IG1vbWVudCBvZgorICAgICAgICAgIGNhbGwgZG9lcyBub3QgbWF0dGVyLCBidXQgaXQgc2hvdWxkIGJlIGNvbXBsZXRlZCBiZWZvcmUgYW55IHRocmVhZCBvZiB0aGlzIHRlYW0gY2FsbHMKKyAgICAgICAgICBfX2ttcF9pdHRfcmVnaW9uX3N0YXJ0aW5nLgorICAgICAgICAqIF9fa21wX2l0dF9yZWdpb25fc3RhcnRpbmcgc2hvdWxkIGJlIGNhbGxlZCBieSBlYWNoIHRocmVhZCBvZiBhIHRlYW0ganVzdCBiZWZvcmUgZW50ZXJpbmcKKyAgICAgICAgICBwYXJhbGxlbCByZWdpb24gYm9keS4KKyAgICAgICAgKiBfX2ttcF9pdHRfcmVnaW9uX2ZpbmlzaGVkIHNob3VsZCBiZSBjYWxsZWQgYnkgZWFjaCB0aHJlYWQgb2YgYSB0ZWFtIHJpZ2h0IGFmdGVyIHJldHVybmluZworICAgICAgICAgIGZyb20gcGFyYWxsZWwgcmVnaW9uIGJvZHkuCisgICAgICAgICogX19rbXBfaXR0X3JlZ2lvbl9qb2luZWQgc2hvdWxkIGJlIGNhbGxlZCBieSBtYXN0ZXIgdGhyZWFkIG9mIGEgdGVhbSwgYWZ0ZXIgYWxsIHRocmVhZHMKKyAgICAgICAgICBjYWxsZWQgX19rbXBfaXR0X3JlZ2lvbl9maW5pc2hlZC4KKworICAgIE5vdGU6IFRocmVhZCB3YWl0aW5nIGF0IGpvaW4gYmFycmllciAoYWZ0ZXIgX19rbXBfaXR0X3JlZ2lvbl9maW5pc2hlZCkgY2FuIGV4ZWN1dGUgc29tZSBtb3JlCisgICAgdXNlciBjb2RlIC0tIHN1Y2ggYSB0aHJlYWQgY2FuIGV4ZWN1dGUgdGFza3MuCisKKyAgICBOb3RlOiBUaGUgb3ZlcmhlYWQgb2YgbG9nZ2luZyByZWdpb25fc3RhcnRpbmcgYW5kIHJlZ2lvbl9maW5pc2hlZCBpbiBlYWNoIHRocmVhZCBpcyB0b28gbGFyZ2UsCisgICAgc28gdGhlc2UgY2FsbHMgYXJlIG5vdCB1c2VkLgorCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0xJTktBR0Ugdm9pZAorX19rbXBfaXR0X3JlZ2lvbl9mb3JraW5nKCBpbnQgZ3RpZCwgaW50IHRlYW1fc2l6ZSwgaW50IGJhcnJpZXJzLCBpbnQgc2VyaWFsaXplZCApIHsKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIGttcF90ZWFtX3QgKiAgICAgIHRlYW0gPSBfX2ttcF90ZWFtX2Zyb21fZ3RpZCggZ3RpZCApOworICAgIGlmICh0ZWFtLT50LnRfYWN0aXZlX2xldmVsICsgc2VyaWFsaXplZCA+IDEpCisgICAgeworICAgICAgICAvLyBUaGUgZnJhbWUgbm90aWZpY2F0aW9ucyBhcmUgb25seSBzdXBwb3J0ZWQgZm9yIHRoZSBvdXRlcm1vc3QgdGVhbXMuCisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWRlbnRfdCAqICAgICAgICAgbG9jICA9IF9fa21wX3RocmVhZF9mcm9tX2d0aWQoIGd0aWQgKS0+dGgudGhfaWRlbnQ7CisgICAgaWYgKGxvYykgeworICAgICAgICAvLyBVc2UgdGhlIHJlc2VydmVkXzIgZmllbGQgdG8gc3RvcmUgdGhlIGluZGV4IHRvIHRoZSByZWdpb24gZG9tYWluLgorICAgICAgICAvLyBBc3N1bWUgdGhhdCByZXNlcnZlZF8yIGNvbnRhaW5zIHplcm8gaW5pdGlhbGx5LiAgU2luY2UgemVybyBpcyBzcGVjaWFsCisgICAgICAgIC8vIHZhbHVlIGhlcmUsIHN0b3JlIHRoZSBpbmRleCBpbnRvIGRvbWFpbiBhcnJheSBpbmNyZWFzZWQgYnkgMS4KKyAgICAgICAgaWYgKGxvYy0+cmVzZXJ2ZWRfMiA9PSAwKSB7CisgICAgICAgICAgICBpZiAoX19rbXBfcmVnaW9uX2RvbWFpbl9jb3VudCA8IEtNUF9NQVhfRlJBTUVfRE9NQUlOUykgeworICAgICAgICAgICAgICAgIGludCBmcm0gPSBLTVBfVEVTVF9USEVOX0lOQzMyKCAmIF9fa21wX3JlZ2lvbl9kb21haW5fY291bnQgKTsgLy8gZ2V0ICJvbGQiIHZhbHVlCisgICAgICAgICAgICAgICAgaWYgKGZybSA+PSBLTVBfTUFYX0ZSQU1FX0RPTUFJTlMpIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX1RFU1RfVEhFTl9ERUMzMiggJiBfX2ttcF9yZWdpb25fZG9tYWluX2NvdW50ICk7ICAgICAgIC8vIHJldmVydCB0aGUgY291bnQKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgICAvLyBsb2MtPnJlc2VydmVkXzIgaXMgc3RpbGwgMAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvL2lmICghS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTMyKCAmbG9jLT5yZXNlcnZlZF8yLCAwLCBmcm0gKyAxICkpIHsKKyAgICAgICAgICAgICAgICAvLyAgICBmcm0gPSBsb2MtPnJlc2VydmVkXzIgLSAxOyAgIC8vIGdldCB2YWx1ZSBzYXZlZCBieSBvdGhlciB0aHJlYWQgZm9yIHNhbWUgbG9jCisgICAgICAgICAgICAgICAgLy99IC8vIEFDOiB0aGlzIGJsb2NrIGlzIHRvIHJlcGxhY2UgbmV4dCB1bnN5bmNocm9uaXplZCBsaW5lCisKKyAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHNhdmUgaW5kZXhlcyBmb3IgYm90aCByZWdpb24gYW5kIGJhcnJpZXIgZnJhbWVzLiBXZSdsbCB1c2UgbG9jLT5yZXNlcnZlZF8yCisgICAgICAgICAgICAgICAgLy8gZmllbGQgYnV0IHB1dCByZWdpb24gaW5kZXggdG8gdGhlIGxvdyB0d28gYnl0ZXMgYW5kIGJhcnJpZXIgaW5kZXhlcyB0byB0aGUgaGlnaAorICAgICAgICAgICAgICAgIC8vIHR3byBieXRlcy4gSXQgaXMgT0sgYmVjYXVzZSBLTVBfTUFYX0ZSQU1FX0RPTUFJTlMgPSA1MTIuCisgICAgICAgICAgICAgICAgbG9jLT5yZXNlcnZlZF8yIHw9IChmcm0gKyAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzYXZlICJuZXciIHZhbHVlCisKKyAgICAgICAgICAgICAgICAvLyBUcmFuc2Zvcm0gY29tcGlsZXItZ2VuZXJhdGVkIHJlZ2lvbiBsb2NhdGlvbiBpbnRvIHRoZSBmb3JtYXQKKyAgICAgICAgICAgICAgICAvLyB0aGF0IHRoZSB0b29scyBtb3JlIG9yIGxlc3Mgc3RhbmRhcmRpemVkIG9uOgorICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8ZnVuYz4kb21wJHBhcmFsbGVsQFtmaWxlOl08bGluZT5bOjxjb2w+XSIKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogYnVmZiA9IE5VTEw7CisgICAgICAgICAgICAgICAga21wX3N0cl9sb2NfdCBzdHJfbG9jID0gX19rbXBfc3RyX2xvY19pbml0KCBsb2MtPnBzb3VyY2UsIDEgKTsKKyAgICAgICAgICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgiJXMkb21wJHBhcmFsbGVsOiVkQCVzOiVkOiVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfbG9jLmZ1bmMsIHRlYW1fc2l6ZSwgc3RyX2xvYy5maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9sb2MubGluZSwgc3RyX2xvYy5jb2wpOworCisgICAgICAgICAgICAgICAgX19pdHRfc3VwcHJlc3NfcHVzaChfX2l0dF9zdXBwcmVzc19tZW1vcnlfZXJyb3JzKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9pdHRfcmVnaW9uX2RvbWFpbnNbIGZybSBdID0gX19pdHRfZG9tYWluX2NyZWF0ZSggYnVmZiApOworICAgICAgICAgICAgICAgIF9faXR0X3N1cHByZXNzX3BvcCgpOworCisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgICAgICAgICAgICAgaWYoIGJhcnJpZXJzICkgeworICAgICAgICAgICAgICAgICAgICBpZiAoX19rbXBfYmFycmllcl9kb21haW5fY291bnQgPCBLTVBfTUFYX0ZSQU1FX0RPTUFJTlMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcm0gPSBLTVBfVEVTVF9USEVOX0lOQzMyKCAmIF9fa21wX2JhcnJpZXJfZG9tYWluX2NvdW50ICk7IC8vIGdldCAib2xkIiB2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZybSA+PSBLTVBfTUFYX0ZSQU1FX0RPTUFJTlMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfVEVTVF9USEVOX0RFQzMyKCAmIF9fa21wX2JhcnJpZXJfZG9tYWluX2NvdW50ICk7ICAgICAgIC8vIHJldmVydCB0aGUgY291bnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47ICAgICAgICAgICAgICAgICAgICAgIC8vIGxvYy0+cmVzZXJ2ZWRfMiBpcyBzdGlsbCAwCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogYnVmZiA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgiJXMkb21wJGJhcnJpZXJAJXM6JWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2xvYy5mdW5jLCBzdHJfbG9jLmZpbGUsIHN0cl9sb2MuY29sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9faXR0X3N1cHByZXNzX3B1c2goX19pdHRfc3VwcHJlc3NfbWVtb3J5X2Vycm9ycyk7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9pdHRfYmFycmllcl9kb21haW5zWyBmcm0gXSA9IF9faXR0X2RvbWFpbl9jcmVhdGUoIGJ1ZmYgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9faXR0X3N1cHByZXNzX3BvcCgpOworICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBTYXZlIHRoZSBiYXJyaWVyIGZyYW1lIGluZGV4IHRvIHRoZSBoaWdoIHR3byBieXRlcy4KKyAgICAgICAgICAgICAgICAgICAgICAgIGxvYy0+cmVzZXJ2ZWRfMiB8PSAoZnJtICsgMSkgPDwgMTY7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2xvY19mcmVlKCAmc3RyX2xvYyApOworICAgICAgICAgICAgICAgIF9faXR0X2ZyYW1lX2JlZ2luX3YzKF9fa21wX2l0dF9yZWdpb25fZG9tYWluc1sgZnJtIF0sIE5VTEwpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeyAvLyBSZWdpb24gZG9tYWluIGV4aXN0cyBmb3IgdGhpcyBsb2NhdGlvbgorICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGVhbSBzaXplIHdhcyBjaGFuZ2VkLiBUaGVuIGNyZWF0ZSBuZXcgcmVnaW9uIGRvbWFpbiBmb3IgdGhpcyBsb2NhdGlvbgorICAgICAgICAgICAgaW50IGZybSA9IChsb2MtPnJlc2VydmVkXzIgJiAweDAwMDBGRkZGKSAtIDE7CisgICAgICAgICAgICBpZiggX19rbXBfaXR0X3JlZ2lvbl90ZWFtX3NpemVbZnJtXSAhPSB0ZWFtX3NpemUgKSB7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIGJ1ZmYgPSBOVUxMOworICAgICAgICAgICAgICAgIGttcF9zdHJfbG9jX3Qgc3RyX2xvYyA9IF9fa21wX3N0cl9sb2NfaW5pdCggbG9jLT5wc291cmNlLCAxICk7CisgICAgICAgICAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoIiVzJG9tcCRwYXJhbGxlbDolZEAlczolZDolZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2xvYy5mdW5jLCB0ZWFtX3NpemUsIHN0cl9sb2MuZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfbG9jLmxpbmUsIHN0cl9sb2MuY29sKTsKKworICAgICAgICAgICAgICAgIF9faXR0X3N1cHByZXNzX3B1c2goX19pdHRfc3VwcHJlc3NfbWVtb3J5X2Vycm9ycyk7CisgICAgICAgICAgICAgICAgX19rbXBfaXR0X3JlZ2lvbl9kb21haW5zWyBmcm0gXSA9IF9faXR0X2RvbWFpbl9jcmVhdGUoIGJ1ZmYgKTsKKyAgICAgICAgICAgICAgICBfX2l0dF9zdXBwcmVzc19wb3AoKTsKKworICAgICAgICAgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgICAgICAgICAgICAgIF9fa21wX3N0cl9sb2NfZnJlZSggJnN0cl9sb2MgKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9pdHRfcmVnaW9uX3RlYW1fc2l6ZVtmcm1dID0gdGVhbV9zaXplOworICAgICAgICAgICAgICAgIF9faXR0X2ZyYW1lX2JlZ2luX3YzKF9fa21wX2l0dF9yZWdpb25fZG9tYWluc1tmcm1dLCBOVUxMKTsKKyAgICAgICAgICAgIH0gZWxzZSB7IC8vIFRlYW0gc2l6ZSB3YXMgbm90IGNoYW5nZWQuIFVzZSBleGlzdGluZyBkb21haW4uCisgICAgICAgICAgICAgICAgX19pdHRfZnJhbWVfYmVnaW5fdjMoX19rbXBfaXR0X3JlZ2lvbl9kb21haW5zW2ZybV0sIE5VTEwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEtNUF9JVFRfREVCVUdfTE9DSygpOworICAgICAgICBLTVBfSVRUX0RFQlVHX1BSSU5UKCAiW2ZybSBiZWddIGd0aWQ9JWQsIGlkeD0leCwgc2VyaWFsaXplZDolZCwgbG9jOiVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIGxvYy0+cmVzZXJ2ZWRfMiwgc2VyaWFsaXplZCwgbG9jICk7CisgICAgfQorI2VuZGlmCit9IC8vIF9fa21wX2l0dF9yZWdpb25fZm9ya2luZworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0xJTktBR0Ugdm9pZAorX19rbXBfaXR0X2ZyYW1lX3N1Ym1pdCggaW50IGd0aWQsIF9faXR0X3RpbWVzdGFtcCBiZWdpbiwgX19pdHRfdGltZXN0YW1wIGVuZCwgaW50IGltYmFsYW5jZSwgaWRlbnRfdCAqIGxvYywgaW50IHRlYW1fc2l6ZSwgaW50IHJlZ2lvbiApIHsKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIGlmKCByZWdpb24gKSB7CisgICAgICAgIGttcF90ZWFtX3QgKiAgICAgIHRlYW0gPSBfX2ttcF90ZWFtX2Zyb21fZ3RpZCggZ3RpZCApOworICAgICAgICBpbnQgc2VyaWFsaXplZCA9ICggcmVnaW9uID09IDIgPyAxIDogMCApOworICAgICAgICBpZiAodGVhbS0+dC50X2FjdGl2ZV9sZXZlbCArIHNlcmlhbGl6ZWQgPiAxKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBUaGUgZnJhbWUgbm90aWZpY2F0aW9ucyBhcmUgb25seSBzdXBwb3J0ZWQgZm9yIHRoZSBvdXRlcm1vc3QgdGVhbXMuCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgIC8vQ2hlY2sgcmVnaW9uIGRvbWFpbiBoYXMgbm90IGJlZW4gY3JlYXRlZCBiZWZvcmUuIEl0J3MgaW5kZXggaXMgc2F2ZWQgaW4gdGhlIGxvdyB0d28gYnl0ZXMuCisgICAgICAgICBpZiAoKGxvYy0+cmVzZXJ2ZWRfMiAmIDB4MDAwMEZGRkYpID09IDApIHsKKyAgICAgICAgICAgICBpZiAoX19rbXBfcmVnaW9uX2RvbWFpbl9jb3VudCA8IEtNUF9NQVhfRlJBTUVfRE9NQUlOUykgeworICAgICAgICAgICAgICAgICBpbnQgZnJtID0gS01QX1RFU1RfVEhFTl9JTkMzMiggJiBfX2ttcF9yZWdpb25fZG9tYWluX2NvdW50ICk7IC8vIGdldCAib2xkIiB2YWx1ZQorICAgICAgICAgICAgICAgICBpZiAoZnJtID49IEtNUF9NQVhfRlJBTUVfRE9NQUlOUykgeworICAgICAgICAgICAgICAgICAgICAgS01QX1RFU1RfVEhFTl9ERUMzMiggJiBfX2ttcF9yZWdpb25fZG9tYWluX2NvdW50ICk7ICAgICAgIC8vIHJldmVydCB0aGUgY291bnQKKyAgICAgICAgICAgICAgICAgICAgIHJldHVybjsgICAgICAgICAgICAgICAgICAgICAgLy8gbG9jLT5yZXNlcnZlZF8yIGlzIHN0aWxsIDAKKyAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gc2F2ZSBpbmRleGVzIGZvciBib3RoIHJlZ2lvbiBhbmQgYmFycmllciBmcmFtZXMuIFdlJ2xsIHVzZSBsb2MtPnJlc2VydmVkXzIKKyAgICAgICAgICAgICAgICAgLy8gZmllbGQgYnV0IHB1dCByZWdpb24gaW5kZXggdG8gdGhlIGxvdyB0d28gYnl0ZXMgYW5kIGJhcnJpZXIgaW5kZXhlcyB0byB0aGUgaGlnaAorICAgICAgICAgICAgICAgICAvLyB0d28gYnl0ZXMuIEl0IGlzIE9LIGJlY2F1c2UgS01QX01BWF9GUkFNRV9ET01BSU5TID0gNTEyLgorICAgICAgICAgICAgICAgICBsb2MtPnJlc2VydmVkXzIgfD0gKGZybSArIDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNhdmUgIm5ldyIgdmFsdWUKKworICAgICAgICAgICAgICAgICAvLyBUcmFuc2Zvcm0gY29tcGlsZXItZ2VuZXJhdGVkIHJlZ2lvbiBsb2NhdGlvbiBpbnRvIHRoZSBmb3JtYXQKKyAgICAgICAgICAgICAgICAgLy8gdGhhdCB0aGUgdG9vbHMgbW9yZSBvciBsZXNzIHN0YW5kYXJkaXplZCBvbjoKKyAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxmdW5jPiRvbXAkcGFyYWxsZWw6dGVhbV9zaXplQFtmaWxlOl08bGluZT5bOjxjb2w+XSIKKyAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIGJ1ZmYgPSBOVUxMOworICAgICAgICAgICAgICAgICBrbXBfc3RyX2xvY190IHN0cl9sb2MgPSBfX2ttcF9zdHJfbG9jX2luaXQoIGxvYy0+cHNvdXJjZSwgMSApOworICAgICAgICAgICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgiJXMkb21wJHBhcmFsbGVsOiVkQCVzOiVkOiVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2xvYy5mdW5jLCB0ZWFtX3NpemUsIHN0cl9sb2MuZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2xvYy5saW5lLCBzdHJfbG9jLmNvbCk7CisKKyAgICAgICAgICAgICAgICAgX19pdHRfc3VwcHJlc3NfcHVzaChfX2l0dF9zdXBwcmVzc19tZW1vcnlfZXJyb3JzKTsKKyAgICAgICAgICAgICAgICAgX19rbXBfaXR0X3JlZ2lvbl9kb21haW5zWyBmcm0gXSA9IF9faXR0X2RvbWFpbl9jcmVhdGUoIGJ1ZmYgKTsKKyAgICAgICAgICAgICAgICAgX19pdHRfc3VwcHJlc3NfcG9wKCk7CisKKyAgICAgICAgICAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgICAgICAgICAgICAgIF9fa21wX3N0cl9sb2NfZnJlZSggJnN0cl9sb2MgKTsKKyAgICAgICAgICAgICAgICAgX19rbXBfaXR0X3JlZ2lvbl90ZWFtX3NpemVbZnJtXSA9IHRlYW1fc2l6ZTsKKyAgICAgICAgICAgICAgICAgX19pdHRfZnJhbWVfc3VibWl0X3YzKF9fa21wX2l0dF9yZWdpb25fZG9tYWluc1sgZnJtIF0sIE5VTEwsIGJlZ2luLCBlbmQgKTsKKyAgICAgICAgICAgICB9CisgICAgICAgICB9IGVsc2UgeyAvLyBSZWdpb24gZG9tYWluIGV4aXN0cyBmb3IgdGhpcyBsb2NhdGlvbgorICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRlYW0gc2l6ZSB3YXMgY2hhbmdlZC4gVGhlbiBjcmVhdGUgbmV3IHJlZ2lvbiBkb21haW4gZm9yIHRoaXMgbG9jYXRpb24KKyAgICAgICAgICAgICBpbnQgZnJtID0gKGxvYy0+cmVzZXJ2ZWRfMiAmIDB4MDAwMEZGRkYpIC0gMTsKKyAgICAgICAgICAgICBpZiggX19rbXBfaXR0X3JlZ2lvbl90ZWFtX3NpemVbZnJtXSAhPSB0ZWFtX3NpemUgKSB7CisgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmID0gTlVMTDsKKyAgICAgICAgICAgICAgICAga21wX3N0cl9sb2NfdCBzdHJfbG9jID0gX19rbXBfc3RyX2xvY19pbml0KCBsb2MtPnBzb3VyY2UsIDEgKTsKKyAgICAgICAgICAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoIiVzJG9tcCRwYXJhbGxlbDolZEAlczolZDolZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9sb2MuZnVuYywgdGVhbV9zaXplLCBzdHJfbG9jLmZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9sb2MubGluZSwgc3RyX2xvYy5jb2wpOworCisgICAgICAgICAgICAgICAgIF9faXR0X3N1cHByZXNzX3B1c2goX19pdHRfc3VwcHJlc3NfbWVtb3J5X2Vycm9ycyk7CisgICAgICAgICAgICAgICAgIF9fa21wX2l0dF9yZWdpb25fZG9tYWluc1sgZnJtIF0gPSBfX2l0dF9kb21haW5fY3JlYXRlKCBidWZmICk7CisgICAgICAgICAgICAgICAgIF9faXR0X3N1cHByZXNzX3BvcCgpOworCisgICAgICAgICAgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgICAgICAgICAgICAgICBfX2ttcF9zdHJfbG9jX2ZyZWUoICZzdHJfbG9jICk7CisgICAgICAgICAgICAgICAgIF9fa21wX2l0dF9yZWdpb25fdGVhbV9zaXplW2ZybV0gPSB0ZWFtX3NpemU7CisgICAgICAgICAgICAgICAgIF9faXR0X2ZyYW1lX3N1Ym1pdF92MyhfX2ttcF9pdHRfcmVnaW9uX2RvbWFpbnNbIGZybSBdLCBOVUxMLCBiZWdpbiwgZW5kICk7CisgICAgICAgICAgICAgfSBlbHNlIHsgLy8gVGVhbSBzaXplIHdhcyBub3QgY2hhbmdlZC4gVXNlIGV4aXN0aW5nIGRvbWFpbi4KKyAgICAgICAgICAgICAgICAgX19pdHRfZnJhbWVfc3VibWl0X3YzKF9fa21wX2l0dF9yZWdpb25fZG9tYWluc1sgZnJtIF0sIE5VTEwsIGJlZ2luLCBlbmQgKTsKKyAgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICAgICBLTVBfSVRUX0RFQlVHX0xPQ0soKTsKKyAgICAgICAgIEtNUF9JVFRfREVCVUdfUFJJTlQoICJbcmVnIHN1Yl0gZ3RpZD0lZCwgaWR4PSV4LCByZWdpb246JWQsIGxvYzolcCwgYmVnOiVsbHUsIGVuZDolbGx1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCBsb2MtPnJlc2VydmVkXzIsIHJlZ2lvbiwgbG9jLCBiZWdpbiwgZW5kICk7CisgICAgICAgICByZXR1cm47CisgICAgfSBlbHNlIHsgLy8gY2FsbGVkIGZvciBiYXJyaWVyIHJlcG9ydGluZworICAgICAgICBpZiAobG9jKSB7CisgICAgICAgICAgICBpZiAoKGxvYy0+cmVzZXJ2ZWRfMiAmIDB4RkZGRjAwMDApID09IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoX19rbXBfYmFycmllcl9kb21haW5fY291bnQgPCBLTVBfTUFYX0ZSQU1FX0RPTUFJTlMpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGZybSA9IEtNUF9URVNUX1RIRU5fSU5DMzIoICYgX19rbXBfYmFycmllcl9kb21haW5fY291bnQgKTsgLy8gZ2V0ICJvbGQiIHZhbHVlCisgICAgICAgICAgICAgICAgICAgIGlmIChmcm0gPj0gS01QX01BWF9GUkFNRV9ET01BSU5TKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfVEVTVF9USEVOX0RFQzMyKCAmIF9fa21wX2JhcnJpZXJfZG9tYWluX2NvdW50ICk7ICAgICAgIC8vIHJldmVydCB0aGUgY291bnQKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsgICAgICAgICAgICAgICAgICAgICAgLy8gbG9jLT5yZXNlcnZlZF8yIGlzIHN0aWxsIDAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBTYXZlIHRoZSBiYXJyaWVyIGZyYW1lIGluZGV4IHRvIHRoZSBoaWdoIHR3byBieXRlcy4KKyAgICAgICAgICAgICAgICAgICAgbG9jLT5yZXNlcnZlZF8yIHw9IChmcm0gKyAxKSA8PCAxNjsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNhdmUgIm5ldyIgdmFsdWUKKworICAgICAgICAgICAgICAgICAgICAvLyBUcmFuc2Zvcm0gY29tcGlsZXItZ2VuZXJhdGVkIHJlZ2lvbiBsb2NhdGlvbiBpbnRvIHRoZSBmb3JtYXQKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCB0aGUgdG9vbHMgbW9yZSBvciBsZXNzIHN0YW5kYXJkaXplZCBvbjoKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxmdW5jPiRvbXAkZnJhbWVAW2ZpbGU6XTxsaW5lPls6PGNvbD5dIgorICAgICAgICAgICAgICAgICAgICBrbXBfc3RyX2xvY190IHN0cl9sb2MgPSBfX2ttcF9zdHJfbG9jX2luaXQoIGxvYy0+cHNvdXJjZSwgMSApOworICAgICAgICAgICAgICAgICAgICBpZiggaW1iYWxhbmNlICkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIGJ1ZmZfaW1iID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZfaW1iID0gX19rbXBfc3RyX2Zvcm1hdCgiJXMkb21wJGJhcnJpZXItaW1iYWxhbmNlOiVkQCVzOiVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9sb2MuZnVuYywgdGVhbV9zaXplLCBzdHJfbG9jLmZpbGUsIHN0cl9sb2MuY29sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9faXR0X3N1cHByZXNzX3B1c2goX19pdHRfc3VwcHJlc3NfbWVtb3J5X2Vycm9ycyk7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9pdHRfaW1iYWxhbmNlX2RvbWFpbnNbIGZybSBdID0gX19pdHRfZG9tYWluX2NyZWF0ZSggYnVmZl9pbWIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9faXR0X3N1cHByZXNzX3BvcCgpOworICAgICAgICAgICAgICAgICAgICAgICAgX19pdHRfZnJhbWVfc3VibWl0X3YzKF9fa21wX2l0dF9pbWJhbGFuY2VfZG9tYWluc1sgZnJtIF0sIE5VTEwsIGJlZ2luLCBlbmQgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZl9pbWIgKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KCIlcyRvbXAkYmFycmllckAlczolZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfbG9jLmZ1bmMsIHN0cl9sb2MuZmlsZSwgc3RyX2xvYy5jb2wpOworICAgICAgICAgICAgICAgICAgICAgICAgX19pdHRfc3VwcHJlc3NfcHVzaChfX2l0dF9zdXBwcmVzc19tZW1vcnlfZXJyb3JzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2l0dF9iYXJyaWVyX2RvbWFpbnNbIGZybSBdID0gX19pdHRfZG9tYWluX2NyZWF0ZSggYnVmZiApOworICAgICAgICAgICAgICAgICAgICAgICAgX19pdHRfc3VwcHJlc3NfcG9wKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2l0dF9mcmFtZV9zdWJtaXRfdjMoX19rbXBfaXR0X2JhcnJpZXJfZG9tYWluc1sgZnJtIF0sIE5VTEwsIGJlZ2luLCBlbmQgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0cl9sb2NfZnJlZSggJnN0cl9sb2MgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeyAvLyBpZiBpdCBpcyBub3QgMCB0aGVuIGl0IHNob3VsZCBiZSA8PSBLTVBfTUFYX0ZSQU1FX0RPTUFJTlMKKyAgICAgICAgICAgICAgICBpZiggaW1iYWxhbmNlICkgeworICAgICAgICAgICAgICAgICAgICBfX2l0dF9mcmFtZV9zdWJtaXRfdjMoX19rbXBfaXR0X2ltYmFsYW5jZV9kb21haW5zWyAobG9jLT5yZXNlcnZlZF8yID4+IDE2KSAtIDEgXSwgTlVMTCwgYmVnaW4sIGVuZCApOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIF9faXR0X2ZyYW1lX3N1Ym1pdF92MyhfX2ttcF9pdHRfYmFycmllcl9kb21haW5zWyhsb2MtPnJlc2VydmVkXzIgPj4gMTYpIC0gMV0sIE5VTEwsIGJlZ2luLCBlbmQgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBLTVBfSVRUX0RFQlVHX0xPQ0soKTsKKyAgICAgICAgICAgIEtNUF9JVFRfREVCVUdfUFJJTlQoICJbZnJtIHN1Yl0gZ3RpZD0lZCwgaWR4PSV4LCBsb2M6JXAsIGJlZzolbGx1LCBlbmQ6JWxsdVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgbG9jLT5yZXNlcnZlZF8yLCBsb2MsIGJlZ2luLCBlbmQgKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorfSAvLyBfX2ttcF9pdHRfZnJhbWVfc3VibWl0CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTElOS0FHRSB2b2lkCitfX2ttcF9pdHRfbWV0YWRhdGFfaW1iYWxhbmNlKCBpbnQgZ3RpZCwga21wX3VpbnQ2NCBiZWdpbiwga21wX3VpbnQ2NCBlbmQsIGttcF91aW50NjQgaW1iYWxhbmNlLCBrbXBfdWludDY0IHJlZHVjdGlvbiApIHsKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIGlmKCBtZXRhZGF0YV9kb21haW4gPT0gTlVMTCkgeworICAgICAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmIG1ldGFkYXRhX2xvY2sgKTsKKyAgICAgICAgaWYoIG1ldGFkYXRhX2RvbWFpbiA9PSBOVUxMKSB7CisgICAgICAgICAgICBfX2l0dF9zdXBwcmVzc19wdXNoKF9faXR0X3N1cHByZXNzX21lbW9yeV9lcnJvcnMpOworICAgICAgICAgICAgbWV0YWRhdGFfZG9tYWluID0gX19pdHRfZG9tYWluX2NyZWF0ZSggIk9NUCBNZXRhZGF0YSIgKTsKKyAgICAgICAgICAgIF9faXR0X3N1cHByZXNzX3BvcCgpOworICAgICAgICB9CisgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICYgbWV0YWRhdGFfbG9jayApOworICAgIH0KKworICAgIF9faXR0X3N0cmluZ19oYW5kbGUgKiBzdHJpbmdfaGFuZGxlID0gX19pdHRfc3RyaW5nX2hhbmRsZV9jcmVhdGUoICJvbXBfbWV0YWRhdGFfaW1iYWxhbmNlIik7CisKKyAgICBrbXBfdWludDY0IGltYmFsYW5jZV9kYXRhWyA0IF07CisgICAgaW1iYWxhbmNlX2RhdGFbIDAgXSA9IGJlZ2luOworICAgIGltYmFsYW5jZV9kYXRhWyAxIF0gPSBlbmQ7CisgICAgaW1iYWxhbmNlX2RhdGFbIDIgXSA9IGltYmFsYW5jZTsKKyAgICBpbWJhbGFuY2VfZGF0YVsgMyBdID0gcmVkdWN0aW9uOworCisgICAgX19pdHRfbWV0YWRhdGFfYWRkKG1ldGFkYXRhX2RvbWFpbiwgX19pdHRfbnVsbCwgc3RyaW5nX2hhbmRsZSwgX19pdHRfbWV0YWRhdGFfdTY0LCA0LCBpbWJhbGFuY2VfZGF0YSk7CisjZW5kaWYKK30gLy8gX19rbXBfaXR0X21ldGFkYXRhX2ltYmFsYW5jZQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0xJTktBR0Ugdm9pZAorX19rbXBfaXR0X21ldGFkYXRhX2xvb3AoIGlkZW50X3QgKiBsb2MsIGttcF91aW50NjQgc2NoZWRfdHlwZSwga21wX3VpbnQ2NCBpdGVyYXRpb25zLCBrbXBfdWludDY0IGNodW5rICkgeworI2lmIFVTRV9JVFRfTk9USUZZCisgICAgaWYoIG1ldGFkYXRhX2RvbWFpbiA9PSBOVUxMKSB7CisgICAgICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICYgbWV0YWRhdGFfbG9jayApOworICAgICAgICBpZiggbWV0YWRhdGFfZG9tYWluID09IE5VTEwpIHsKKyAgICAgICAgICAgIF9faXR0X3N1cHByZXNzX3B1c2goX19pdHRfc3VwcHJlc3NfbWVtb3J5X2Vycm9ycyk7CisgICAgICAgICAgICBtZXRhZGF0YV9kb21haW4gPSBfX2l0dF9kb21haW5fY3JlYXRlKCAiT01QIE1ldGFkYXRhIiApOworICAgICAgICAgICAgX19pdHRfc3VwcHJlc3NfcG9wKCk7CisgICAgICAgIH0KKyAgICAgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJiBtZXRhZGF0YV9sb2NrICk7CisgICAgfQorCisgICAgX19pdHRfc3RyaW5nX2hhbmRsZSAqIHN0cmluZ19oYW5kbGUgPSBfX2l0dF9zdHJpbmdfaGFuZGxlX2NyZWF0ZSggIm9tcF9tZXRhZGF0YV9sb29wIik7CisgICAga21wX3N0cl9sb2NfdCBzdHJfbG9jID0gX19rbXBfc3RyX2xvY19pbml0KCBsb2MtPnBzb3VyY2UsIDEgKTsKKworICAgIGttcF91aW50NjQgbG9vcF9kYXRhWyA1IF07CisgICAgbG9vcF9kYXRhWyAwIF0gPSBzdHJfbG9jLmxpbmU7CisgICAgbG9vcF9kYXRhWyAxIF0gPSBzdHJfbG9jLmNvbDsKKyAgICBsb29wX2RhdGFbIDIgXSA9IHNjaGVkX3R5cGU7CisgICAgbG9vcF9kYXRhWyAzIF0gPSBpdGVyYXRpb25zOworICAgIGxvb3BfZGF0YVsgNCBdID0gY2h1bms7CisKKyAgICBfX2ttcF9zdHJfbG9jX2ZyZWUoICZzdHJfbG9jICk7CisKKyAgICBfX2l0dF9tZXRhZGF0YV9hZGQobWV0YWRhdGFfZG9tYWluLCBfX2l0dF9udWxsLCBzdHJpbmdfaGFuZGxlLCBfX2l0dF9tZXRhZGF0YV91NjQsIDUsIGxvb3BfZGF0YSk7CisjZW5kaWYKK30gLy8gX19rbXBfaXR0X21ldGFkYXRhX2xvb3AKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitMSU5LQUdFIHZvaWQKK19fa21wX2l0dF9tZXRhZGF0YV9zaW5nbGUoICkgeworI2lmIFVTRV9JVFRfTk9USUZZCisgICAgaWYoIG1ldGFkYXRhX2RvbWFpbiA9PSBOVUxMKSB7CisgICAgICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICYgbWV0YWRhdGFfbG9jayApOworICAgICAgICBpZiggbWV0YWRhdGFfZG9tYWluID09IE5VTEwpIHsKKyAgICAgICAgICAgIF9faXR0X3N1cHByZXNzX3B1c2goX19pdHRfc3VwcHJlc3NfbWVtb3J5X2Vycm9ycyk7CisgICAgICAgICAgICBtZXRhZGF0YV9kb21haW4gPSBfX2l0dF9kb21haW5fY3JlYXRlKCAiT01QIE1ldGFkYXRhIiApOworICAgICAgICAgICAgX19pdHRfc3VwcHJlc3NfcG9wKCk7CisgICAgICAgIH0KKyAgICAgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJiBtZXRhZGF0YV9sb2NrICk7CisgICAgfQorCisgICAgX19pdHRfc3RyaW5nX2hhbmRsZSAqIHN0cmluZ19oYW5kbGUgPSBfX2l0dF9zdHJpbmdfaGFuZGxlX2NyZWF0ZSggIm9tcF9tZXRhZGF0YV9zaW5nbGUiKTsKKworICAgIF9faXR0X21ldGFkYXRhX2FkZChtZXRhZGF0YV9kb21haW4sIF9faXR0X251bGwsIHN0cmluZ19oYW5kbGUsIF9faXR0X21ldGFkYXRhX3U2NCwgMCwgTlVMTCk7CisjZW5kaWYKK30gLy8gX19rbXBfaXR0X21ldGFkYXRhX3NpbmdsZQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0xJTktBR0Ugdm9pZAorX19rbXBfaXR0X3JlZ2lvbl9zdGFydGluZyggaW50IGd0aWQgKSB7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyNlbmRpZgorfSAvLyBfX2ttcF9pdHRfcmVnaW9uX3N0YXJ0aW5nCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTElOS0FHRSB2b2lkCitfX2ttcF9pdHRfcmVnaW9uX2ZpbmlzaGVkKCBpbnQgZ3RpZCApIHsKKyNpZiBVU0VfSVRUX05PVElGWQorI2VuZGlmCit9IC8vIF9fa21wX2l0dF9yZWdpb25fZmluaXNoZWQKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitMSU5LQUdFIHZvaWQKK19fa21wX2l0dF9yZWdpb25fam9pbmVkKCBpbnQgZ3RpZCwgaW50IHNlcmlhbGl6ZWQgKSB7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICBrbXBfdGVhbV90ICogICAgICB0ZWFtID0gX19rbXBfdGVhbV9mcm9tX2d0aWQoIGd0aWQgKTsKKyAgICBpZiAodGVhbS0+dC50X2FjdGl2ZV9sZXZlbCArIHNlcmlhbGl6ZWQgPiAxKQorICAgIHsKKyAgICAgICAgLy8gVGhlIGZyYW1lIG5vdGlmaWNhdGlvbnMgYXJlIG9ubHkgc3VwcG9ydGVkIGZvciB0aGUgb3V0ZXJtb3N0IHRlYW1zLgorICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlkZW50X3QgKiAgICAgICAgIGxvYyAgPSBfX2ttcF90aHJlYWRfZnJvbV9ndGlkKCBndGlkICktPnRoLnRoX2lkZW50OworICAgIGlmIChsb2MgJiYgbG9jLT5yZXNlcnZlZF8yKQorICAgIHsKKyAgICAgICAgaW50IGZybSA9IChsb2MtPnJlc2VydmVkXzIgJiAweDAwMDBGRkZGKSAtIDE7CisgICAgICAgIGlmKGZybSA8IEtNUF9NQVhfRlJBTUVfRE9NQUlOUykgeworICAgICAgICAgICAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgICAgICAgICAgICBfX2l0dF9mcmFtZV9lbmRfdjMoX19rbXBfaXR0X3JlZ2lvbl9kb21haW5zW2ZybV0sIE5VTEwpOworICAgICAgICAgICAgS01QX0lUVF9ERUJVR19QUklOVCggIltmcm0gZW5kXSBndGlkPSVkLCBpZHg9JXgsIHNlcmlhbGl6ZWQ6JWQsIGxvYzolcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCBsb2MtPnJlc2VydmVkXzIsIHNlcmlhbGl6ZWQsIGxvYyApOworICAgICAgICB9CisgICAgfQorI2VuZGlmCit9IC8vIF9fa21wX2l0dF9yZWdpb25fam9pbmVkCisKKy8qCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQmFycmllcnMgcmVwb3J0aW5nLgorCisgICAgQSBiYXJyaWVyIGNvbnNpc3RzIG9mIHR3byBwaGFzZXM6CisKKyAgICAgICAgMS4gR2F0aGVyIC0tIG1hc3RlciB3YWl0cyBmb3IgYXJyaXZpbmcgb2YgYWxsIHRoZSB3b3JrZXIgdGhyZWFkczsgZWFjaCB3b3JrZXIgdGhyZWFkCisgICAgICAgICAgIHJlZ2lzdGVycyBhcnJpdmFsIGFuZCBnb2VzIGZ1cnRoZXIuCisgICAgICAgIDIuIFJlbGVhc2UgLS0gZWFjaCB3b3JrZXIgdGhyZWFkcyB3YWl0cyB1bnRpbCBtYXN0ZXIgbGV0cyBpdCBnbzsgbWFzdGVyIGxldHMgd29ya2VyIHRocmVhZHMKKyAgICAgICAgICAgZ28uCisKKyAgICBGdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJ5IGVhY2ggdGhyZWFkOgorCisgICAgICAgICogX19rbXBfaXR0X2JhcnJpZXJfc3RhcnRpbmcoKSAtLSBiZWZvcmUgYXJyaXZpbmcgdG8gdGhlIGdhdGhlciBwaGFzZS4KKyAgICAgICAgKiBfX2ttcF9pdHRfYmFycmllcl9taWRkbGUoKSAgIC0tIGJldHdlZW4gZ2F0aGVyIGFuZCByZWxlYXNlIHBoYXNlcy4KKyAgICAgICAgKiBfX2ttcF9pdHRfYmFycmllcl9maW5pc2hlZCgpIC0tIGFmdGVyIHJlbGVhc2UgcGhhc2UuCisKKyAgICBOb3RlOiBDYWxsIF9fa21wX2l0dF9iYXJyaWVyX29iamVjdCgpIGJlZm9yZSBjYWxsIHRvIF9fa21wX2l0dF9iYXJyaWVyX3N0YXJ0aW5nKCkgYW5kIHNhdmUKKyAgICByZXN1bHQgaW4gbG9jYWwgdmFyaWFibGUuIF9fa21wX2l0dF9iYXJyaWVyX29iamVjdCgpLCBiZWluZyBjYWxsZWQgdG9vIGxhdGUgKGUuIGcuIGFmdGVyIGdhdGhlcgorICAgIHBoYXNlKSB3b3VsZCByZXR1cm4gaXR0IHN5bmMgb2JqZWN0IGZvciB0aGUgbmV4dCBiYXJyaWVyIQorCisgICAgSVRUIG5lZWQgYW4gYWRkcmVzcyAodm9pZCAqKSB0byBiZSBzcGVjaWZpZWQgYXMgYSBzeW5jIG9iamVjdC4gT3Blbk1QIFJUTCBkb2VzIG5vdCBoYXZlCisgICAgYmFycmllciBvYmplY3Qgb3IgYmFycmllciBkYXRhIHN0cnVjdHVyZS4gQmFycmllciBpcyBqdXN0IGEgY291bnRlciBpbiB0ZWFtIGFuZCB0aHJlYWQKKyAgICBzdHJ1Y3R1cmVzLiBXZSBjb3VsZCB1c2UgYW4gYWRkcmVzcyBvZiB0ZWFtIHN0cnVjdHVyZSBhcyBhbiBiYXJyaWVyIHN5bmMgb2JqZWN0LCBidXQgSVRUIHdhbnRzCisgICAgZGlmZmVyZW50IG9iamVjdHMgZm9yIGRpZmZlcmVudCBiYXJyaWVycyAoZXZlbiB3aGl0aGluIHRoZSBzYW1lIHRlYW0pLiBTbyBsZXQgdXMgdXNlCisgICAgdGVhbSBhZGRyZXNzIGFzIGJhcnJpZXIgc3luYyBvYmplY3QgZm9yIHRoZSBmaXJzdCBiYXJyaWVyLCB0aGVuIGluY3JlYXNlIGl0IGJ5IG9uZSBmb3IgdGhlIG5leHQKKyAgICBiYXJyaWVyLCBhbmQgc28gb24gKGJ1dCB3cmFwIGl0IG5vdCB0byB1c2UgYWRkcmVzc2VzIG91dHNpZGUgb2YgdGVhbSBzdHJ1Y3R1cmUpLgorCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCit2b2lkICoKK19fa21wX2l0dF9iYXJyaWVyX29iamVjdCgKKyAgICBpbnQgIGd0aWQsCisgICAgaW50ICBidCwKKyAgICBpbnQgIHNldF9uYW1lLAorICAgIGludCAgZGVsdGEgICAgLy8gMCAoY3VycmVudCBiYXJyaWVyKSBpcyBkZWZhdWx0IHZhbHVlOyBzcGVjaWZ5IC0xIHRvIGdldCBwcmV2aW91cyBiYXJyaWVyLgorKSB7CisgICAgdm9pZCAqIG9iamVjdCA9IE5VTEw7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICBrbXBfaW5mb190ICogICAgdGhyICA9IF9fa21wX3RocmVhZF9mcm9tX2d0aWQoIGd0aWQgKTsKKyAgICBrbXBfdGVhbV90ICogICAgdGVhbSA9IHRoci0+dGgudGhfdGVhbTsKKworICAgIC8vIE5PVEU6CisgICAgLy8gSWYgdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIF9fa21wX2ZvcmtfYmFycmllciwgdGVhbSBwb2ludGVyIGNhbiBiZSBOVUxMLiBUaGlzICJpZiIKKyAgICAvLyBoZWxwcyB0byBhdm9pZCBjcmFzaC4gSG93ZXZlciwgdGhpcyBpcyBub3QgY29tcGxldGUgc29sdXRpb24sIGFuZCByZXBvcnRpbmcgZm9yay9qb2luCisgICAgLy8gYmFycmllcnMgdG8gSVRUIHNob3VsZCBiZSByZXZpc2l0ZWQuCisKKyAgICBpZiAoIHRlYW0gIT0gTlVMTCApIHsKKworICAgICAgICAvLyBNYXN0ZXIgdGhyZWFkIGluY3JlYXNlcyBiX2Fycml2ZWQgYnkgS01QX0JBUlJJRVJfU1RBVEVfQlVNUCBlYWNoIHRpbWUuIERpdmlkZSBiX2Fycml2ZWQKKyAgICAgICAgLy8gYnkgS01QX0JBUlJJRVJfU1RBVEVfQlVNUCB0byBnZXQgcGxhaW4gYmFycmllciBjb3VudGVyLgorICAgICAgICBrbXBfdWludCBjb3VudGVyID0gdGVhbS0+dC50X2JhclsgYnQgXS5iX2Fycml2ZWQgLyBLTVBfQkFSUklFUl9TVEFURV9CVU1QICsgZGVsdGE7CisgICAgICAgIC8vIE5vdyBmb3JtIHRoZSBiYXJyaWVyIGlkLiBFbmNvZGUgYmFycmllciB0eXBlIChidCkgaW4gYmFycmllciBpZCB0b28sIHNvIGJhcnJpZXJzIG9mCisgICAgICAgIC8vIGRpZmZlcmVudCB0eXBlcyBkbyBub3QgaGF2ZSB0aGUgc2FtZSBpZHMuCisgICAgICAgIEtNUF9CVUlMRF9BU1NFUlQoIHNpemVvZigga21wX3RlYW1fdCApID49IGJzX2xhc3RfYmFycmllciApOworICAgICAgICAgICAgLy8gVGhpcyBjb25kaXRvbiBpcyBhIG11c3QgKHdlIHdvdWxkIGhhdmUgemVybyBkaXZpZGUgb3RoZXJ3aXNlKS4KKyAgICAgICAgS01QX0JVSUxEX0FTU0VSVCggc2l6ZW9mKCBrbXBfdGVhbV90ICkgPj0gMiAqIGJzX2xhc3RfYmFycmllciApOworICAgICAgICAgICAgLy8gTW9yZSBzdHJvbmcgY29uZGl0aW9uOiBtYWtlIHN1cmUgd2UgaGF2ZSByb29tIGF0IGxlYXN0IGZvciBmb3IgdHdvIGRpZmZlcnRlbnQgaWRzCisgICAgICAgICAgICAvLyAoZm9yIGVhY2ggYmFycmllciB0eXBlKS4KKyAgICAgICAgb2JqZWN0ID0KKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8IHZvaWQgKiA+KAorICAgICAgICAgICAgICAgIGttcF91aW50cHRyX3QoIHRlYW0gKQorICAgICAgICAgICAgICAgICAgICArIGNvdW50ZXIgJSAoIHNpemVvZigga21wX3RlYW1fdCApIC8gYnNfbGFzdF9iYXJyaWVyICkgKiBic19sYXN0X2JhcnJpZXIKKyAgICAgICAgICAgICAgICAgICAgKyBidAorICAgICAgICAgICAgKTsKKyAgICAgICAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgICAgICAgIEtNUF9JVFRfREVCVUdfUFJJTlQoICJbYmFyIG9ial0gdHlwZT0lZCwgY291bnRlcj0lZCwgb2JqZWN0PSVwXG4iLCBidCwgY291bnRlciwgb2JqZWN0ICk7CisKKyAgICAgICAgaWYgKCBzZXRfbmFtZSApIHsKKyAgICAgICAgICAgIGlkZW50X3QgY29uc3QgKiBsb2MgID0gTlVMTDsKKyAgICAgICAgICAgIGNoYXIgY29uc3QgKiAgICBzcmMgID0gTlVMTDsKKyAgICAgICAgICAgIGNoYXIgY29uc3QgKiAgICB0eXBlID0gIk9NUCBCYXJyaWVyIjsKKyAgICAgICAgICAgIHN3aXRjaCAoIGJ0ICkgeworICAgICAgICAgICAgICAgIGNhc2UgYnNfcGxhaW5fYmFycmllciA6IHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRm9yIHBsYWluIGJhcnJpZXIgY29tcGlsZXIgY2FsbHMgX19rbXBjX2JhcnJpZXIoKSBmdW5jdGlvbiwgd2hpY2ggc2F2ZXMKKyAgICAgICAgICAgICAgICAgICAgLy8gbG9jYXRpb24gaW4gdGhyLT50aC50aF9pZGVudC4KKyAgICAgICAgICAgICAgICAgICAgbG9jID0gdGhyLT50aC50aF9pZGVudDsKKyAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBiYXJyaWVyIHR5cGUgZnJvbSBmbGFncyBwcm92aWRlZCBieSBjb21waWxlci4KKyAgICAgICAgICAgICAgICAgICAga21wX2ludDMyICAgZXhwbCA9IDA7CisgICAgICAgICAgICAgICAgICAgIGttcF91aW50MzIgIGltcGwgPSAwOworICAgICAgICAgICAgICAgICAgICBpZiAoIGxvYyAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3JjICA9IGxvYy0+cHNvdXJjZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cGwgPSAoIGxvYy0+ZmxhZ3MgJiBLTVBfSURFTlRfQkFSUklFUl9FWFBMICkgIT0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGltcGwgPSAoIGxvYy0+ZmxhZ3MgJiBLTVBfSURFTlRfQkFSUklFUl9JTVBMICkgIT0gMDsKKyAgICAgICAgICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBpbXBsICkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICggbG9jLT5mbGFncyAmIEtNUF9JREVOVF9CQVJSSUVSX0lNUExfTUFTSyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEtNUF9JREVOVF9CQVJSSUVSX0lNUExfRk9SIDogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gIk9NUCBGb3IgQmFycmllciI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEtNUF9JREVOVF9CQVJSSUVSX0lNUExfU0VDVElPTlMgOiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSAiT01QIFNlY3Rpb25zIEJhcnJpZXIiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBLTVBfSURFTlRfQkFSUklFUl9JTVBMX1NJTkdMRSA6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJPTVAgU2luZ2xlIEJhcnJpZXIiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBLTVBfSURFTlRfQkFSUklFUl9JTVBMX1dPUktTSEFSRSA6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJPTVAgV29ya3NoYXJlIEJhcnJpZXIiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCA6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJPTVAgSW1wbGljaXQgQmFycmllciI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIDAgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgICAgICAgfTsgLyogc3dpdGNoICovCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIGV4cGwgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gIk9NUCBFeHBsaWNpdCBCYXJyaWVyIjsKKyAgICAgICAgICAgICAgICAgICAgfTsgLyogaWYgKi8KKyAgICAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgYnNfZm9ya2pvaW5fYmFycmllciA6IHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSW4gY2FzZSBvZiBmb3JrL2pvaW4gYmFycmllciB3ZSBjYW4gcmVhZCB0aHItPnRoLnRoX2lkZW50LCBiZWNhdXNlIGl0CisgICAgICAgICAgICAgICAgICAgIC8vIGNvbnRhaW5zIGxvY2F0aW9uIG9mIGxhc3QgcGFzc2VkIGNvbnN0cnVjdCAod2hpbGUgam9pbiBiYXJyaWVyIGlzIG5vdAorICAgICAgICAgICAgICAgICAgICAvLyBzdWNoIG9uZSkuIFVzZSB0aF9pZGVudCBvZiBtYXN0ZXIgdGhyZWFkIGluc3RlYWQgLS0gX19rbXBfam9pbl9jYWxsKCkKKyAgICAgICAgICAgICAgICAgICAgLy8gY2FsbGVkIGJ5IHRoZSBtYXN0ZXIgdGhyZWFkIHNhdmVzIGxvY2F0aW9uLgorICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICAvLyBBQzogY2Fubm90IHJlYWQgZnJvbSBtYXN0ZXIgYmVjYXVzZSBfX2ttcF9qb2luX2NhbGwgbWF5IGJlIG5vdCBjYWxsZWQKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgeWV0LCBzbyB3ZSByZWFkIHRoZSBsb2NhdGlvbiBmcm9tIHRlYW0uIFRoaXMgaXMgdGhlIHNhbWUgbG9jYXRpb24uCisgICAgICAgICAgICAgICAgICAgIC8vICAgIEFuZCB0ZWFtIGlzIHZhbGlkIGF0IHRoZSBlbnRlciB0byBqb2luIGJhcnJpZXIgd2hlcmUgdGhpcyBoYXBwZW5zLgorICAgICAgICAgICAgICAgICAgICBsb2MgID0gdGVhbS0+dC50X2lkZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIGxvYyAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3JjICA9IGxvYy0+cHNvdXJjZTsKKyAgICAgICAgICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJPTVAgSm9pbiBCYXJyaWVyIjsKKyAgICAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgfTsgLy8gc3dpdGNoCisgICAgICAgICAgICBLTVBfSVRUX0RFQlVHX0xPQ0soKTsKKyAgICAgICAgICAgIF9faXR0X3N5bmNfY3JlYXRlKCBvYmplY3QsIHR5cGUsIHNyYywgX19pdHRfYXR0cl9iYXJyaWVyICk7CisgICAgICAgICAgICBLTVBfSVRUX0RFQlVHX1BSSU5UKCAiW2JhciBzdGFdIHNjcmUoICVwLCBcIiVzXCIsIFwiJXNcIiwgX19pdHRfYXR0cl9iYXJyaWVyIClcbiIsIG9iamVjdCwgdHlwZSwgc3JjICk7CisgICAgICAgIH07IC8vIGlmCisKKyAgICB9OyAvLyBpZgorI2VuZGlmCisgICAgcmV0dXJuIG9iamVjdDsKK30gLy8gX19rbXBfaXR0X2JhcnJpZXJfb2JqZWN0CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZAorX19rbXBfaXR0X2JhcnJpZXJfc3RhcnRpbmcoIGludCBndGlkLCB2b2lkICogb2JqZWN0ICkgeworI2lmIFVTRV9JVFRfTk9USUZZCisgICAgaWYgKCAhS01QX01BU1RFUl9HVElEKCBndGlkICkgKSB7CisgICAgICAgIEtNUF9JVFRfREVCVUdfTE9DSygpOworICAgICAgICBfX2l0dF9zeW5jX3JlbGVhc2luZyggb2JqZWN0ICk7CisgICAgICAgIEtNUF9JVFRfREVCVUdfUFJJTlQoICJbYmFyIHN0YV0gc3JlbCggJXAgKVxuIiwgb2JqZWN0ICk7CisgICAgfTsgLy8gaWYKKyAgICBLTVBfSVRUX0RFQlVHX0xPQ0soKTsKKyAgICBfX2l0dF9zeW5jX3ByZXBhcmUoIG9iamVjdCApOworICAgIEtNUF9JVFRfREVCVUdfUFJJTlQoICJbYmFyIHN0YV0gc3ByZSggJXAgKVxuIiwgb2JqZWN0ICk7CisjZW5kaWYKK30gLy8gX19rbXBfaXR0X2JhcnJpZXJfc3RhcnRpbmcKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkCitfX2ttcF9pdHRfYmFycmllcl9taWRkbGUoIGludCBndGlkLCB2b2lkICogb2JqZWN0ICkgeworI2lmIFVTRV9JVFRfTk9USUZZCisgICAgaWYgKCBLTVBfTUFTVEVSX0dUSUQoIGd0aWQgKSApIHsKKyAgICAgICAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgICAgICAgIF9faXR0X3N5bmNfYWNxdWlyZWQoIG9iamVjdCApOworICAgICAgICBLTVBfSVRUX0RFQlVHX1BSSU5UKCAiW2JhciBtaWRdIHNhY3EoICVwIClcbiIsIG9iamVjdCApOworICAgICAgICBLTVBfSVRUX0RFQlVHX0xPQ0soKTsKKyAgICAgICAgX19pdHRfc3luY19yZWxlYXNpbmcoIG9iamVjdCApOworICAgICAgICBLTVBfSVRUX0RFQlVHX1BSSU5UKCAiW2JhciBtaWRdIHNyZWwoICVwIClcbiIsIG9iamVjdCApOworICAgIH0gZWxzZSB7CisgICAgfTsgLy8gaWYKKyNlbmRpZgorfSAvLyBfX2ttcF9pdHRfYmFycmllcl9taWRkbGUKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkCitfX2ttcF9pdHRfYmFycmllcl9maW5pc2hlZCggaW50IGd0aWQsIHZvaWQgKiBvYmplY3QgKSB7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICBpZiAoIEtNUF9NQVNURVJfR1RJRCggZ3RpZCApICkgeworICAgIH0gZWxzZSB7CisgICAgICAgIEtNUF9JVFRfREVCVUdfTE9DSygpOworICAgICAgICBfX2l0dF9zeW5jX2FjcXVpcmVkKCBvYmplY3QgKTsKKyAgICAgICAgS01QX0lUVF9ERUJVR19QUklOVCggIltiYXIgZW5kXSBzYWNxKCAlcCApXG4iLCBvYmplY3QgKTsKKyAgICB9OyAvLyBpZgorI2VuZGlmCit9IC8vIF9fa21wX2l0dF9iYXJyaWVyX2ZpbmlzaGVkCisKKy8qCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgVGFza3dhaXQgcmVwb3J0aW5nLgorCisgICAgSVRUIG5lZWQgYW4gYWRkcmVzcyAodm9pZCAqKSB0byBiZSBzcGVjaWZpZWQgYXMgYSBzeW5jIG9iamVjdC4gT3Blbk1QIFJUTCBkb2VzIG5vdCBoYXZlIHRhc2t3YWl0CisgICAgc3RydWN0dXJlLCBzbyB3ZSBuZWVkIHRvIGNvbnN0cnVjdCBzb21ldGhpbmcuCisKKyovCisKK3ZvaWQgKgorX19rbXBfaXR0X3Rhc2t3YWl0X29iamVjdCggaW50IGd0aWQgKSB7CisgICAgdm9pZCAqIG9iamVjdCA9IE5VTEw7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICBpZiAoIF9faXR0X3N5bmNfY3JlYXRlX3B0ciApIHsKKyAgICAgICAga21wX2luZm9fdCAqICAgICB0aHJlYWQgICA9IF9fa21wX3RocmVhZF9mcm9tX2d0aWQoIGd0aWQgKTsKKyAgICAgICAga21wX3Rhc2tkYXRhX3QgKiB0YXNrZGF0YSA9IHRocmVhZCAtPiB0aC50aF9jdXJyZW50X3Rhc2s7CisgICAgICAgIG9iamVjdCA9CisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PCB2b2lkICogPigKKyAgICAgICAgICAgICAgICBrbXBfdWludHB0cl90KCB0YXNrZGF0YSApICsgdGFza2RhdGEtPnRkX3Rhc2t3YWl0X2NvdW50ZXIgJSBzaXplb2YoIGttcF90YXNrZGF0YV90ICkKKyAgICAgICAgICAgICk7CisgICAgfTsgLy8gaWYKKyNlbmRpZgorICAgIHJldHVybiBvYmplY3Q7Cit9IC8vIF9fa21wX2l0dF90YXNrd2FpdF9vYmplY3QKKwordm9pZAorX19rbXBfaXR0X3Rhc2t3YWl0X3N0YXJ0aW5nKAorICAgIGludCAgICAgZ3RpZCwKKyAgICB2b2lkICogIG9iamVjdAorKSB7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICBrbXBfaW5mb190ICogICAgIHRocmVhZCAgID0gX19rbXBfdGhyZWFkX2Zyb21fZ3RpZCggZ3RpZCApOworICAgIGttcF90YXNrZGF0YV90ICogdGFza2RhdGEgPSB0aHJlYWQgLT4gdGgudGhfY3VycmVudF90YXNrOworICAgIGlkZW50X3QgY29uc3QgKiAgbG9jICAgICAgPSB0YXNrZGF0YS0+dGRfdGFza3dhaXRfaWRlbnQ7CisgICAgY2hhciBjb25zdCAqICAgICBzcmMgICAgICA9ICggbG9jID09IE5VTEw/IE5VTEwgOiBsb2MtPnBzb3VyY2UgKTsKKyAgICBLTVBfSVRUX0RFQlVHX0xPQ0soKTsKKyAgICBfX2l0dF9zeW5jX2NyZWF0ZSggb2JqZWN0LCAiT01QIFRhc2t3YWl0Iiwgc3JjLCAwICk7CisgICAgS01QX0lUVF9ERUJVR19QUklOVCggIlt0d2Egc3RhXSBzY3JlKCAlcCwgXCJPTVAgVGFza3dhaXRcIiwgXCIlc1wiLCAwIClcbiIsIG9iamVjdCwgc3JjICk7CisgICAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgICAgX19pdHRfc3luY19wcmVwYXJlKCBvYmplY3QgKTsKKyAgICBLTVBfSVRUX0RFQlVHX1BSSU5UKCAiW3R3YSBzdGFdIHNwcmUoICVwIClcbiIsIG9iamVjdCApOworI2VuZGlmCit9IC8vIF9fa21wX2l0dF90YXNrd2FpdF9zdGFydGluZworCit2b2lkCitfX2ttcF9pdHRfdGFza3dhaXRfZmluaXNoZWQoCisgICAgaW50ICAgICBndGlkLAorICAgIHZvaWQgKiAgb2JqZWN0CispIHsKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIEtNUF9JVFRfREVCVUdfTE9DSygpOworICAgIF9faXR0X3N5bmNfYWNxdWlyZWQoIG9iamVjdCApOworICAgIEtNUF9JVFRfREVCVUdfUFJJTlQoICJbdHdhIGVuZF0gc2FjcSggJXAgKVxuIiwgb2JqZWN0ICk7CisgICAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgICAgX19pdHRfc3luY19kZXN0cm95KCBvYmplY3QgKTsKKyAgICBLTVBfSVRUX0RFQlVHX1BSSU5UKCAiW3R3YSBlbmRdIHNkZXMoICVwIClcbiIsIG9iamVjdCApOworI2VuZGlmCit9IC8vIF9fa21wX2l0dF90YXNrd2FpdF9maW5pc2hlZAorCisvKgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFRhc2sgcmVwb3J0aW5nLgorCisgICAgT25seSB0aG9zZSB0YXNrcyBhcmUgcmVwb3J0ZWQgd2hpY2ggYXJlIGV4ZWN1dGVkIGJ5IGEgdGhyZWFkIHNwaW5uaW5nIGF0IGJhcnJpZXIgKG9yIHRhc2t3YWl0KS4KKyAgICBTeW5jaCBvYmplY3QgcGFzc2VkIHRvIHRoZSBmdW5jdGlvbiBtdXN0IGJlIGJhcnJpZXIgb2YgdGFza3dhaXQgdGhlIHRocmVhZHMgd2FpdGluZyBhdC4KKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKK3ZvaWQKK19fa21wX2l0dF90YXNrX3N0YXJ0aW5nKAorICAgIHZvaWQgKiBvYmplY3QgICAgIC8vIElUVCBzeW5jIG9iamVjdDogYmFycmllciBvciB0YXNrd2FpdC4KKykgeworI2lmIFVTRV9JVFRfTk9USUZZCisgICAgaWYgKCBvYmplY3QgIT0gTlVMTCApIHsKKyAgICAgICAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgICAgICAgIF9faXR0X3N5bmNfY2FuY2VsKCBvYmplY3QgKTsKKyAgICAgICAgS01QX0lUVF9ERUJVR19QUklOVCggIlt0c2sgc3RhXSBzY2FuKCAlcCApXG4iLCBvYmplY3QgKTsKKyAgICB9OyAvLyBpZgorI2VuZGlmCit9IC8vIF9fa21wX2l0dF90YXNrX3N0YXJ0aW5nCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZAorX19rbXBfaXR0X3Rhc2tfZmluaXNoZWQoCisgICAgdm9pZCAqIG9iamVjdCAgICAgLy8gSVRUIHN5bmMgb2JqZWN0OiBiYXJyaWVyIG9yIHRhc2t3YWl0LgorKSB7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICBLTVBfSVRUX0RFQlVHX0xPQ0soKTsKKyAgICBfX2l0dF9zeW5jX3ByZXBhcmUoIG9iamVjdCApOworICAgIEtNUF9JVFRfREVCVUdfUFJJTlQoICJbdHNrIGVuZF0gc3ByZSggJXAgKVxuIiwgb2JqZWN0ICk7CisjZW5kaWYKK30gLy8gX19rbXBfaXR0X3Rhc2tfZmluaXNoZWQKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvKgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIExvY2sgcmVwb3J0aW5nLgorCisgICAgICAgICogX19rbXBfaXR0X2xvY2tfY3JlYXRpbmcoIGxvY2sgKSBzaG91bGQgYmUgY2FsbGVkICpiZWZvcmUqIHRoZSBmaXJzdCBsb2NrIG9wZXJhdGlvbgorICAgICAgICAgIChzZXQvdW5zZXQpLiBJdCBpcyBub3QgYSByZWFsIGV2ZW50IHNob3duIHRvIHRoZSB1c2VyIGJ1dCBqdXN0IHNldHRpbmcgYSBuYW1lIGZvcgorICAgICAgICAgIHN5bmNocm9uaXphdGlvbiBvYmplY3QuIGBsb2NrJyBpcyBhbiBhZGRyZXNzIG9mIHN5bmMgb2JqZWN0LCB0aGUgc2FtZSBhZGRyZXNzIHNob3VsZCBiZQorICAgICAgICAgIHVzZWQgaW4gYWxsIHN1YnNlcXVlbnQgY2FsbHMuCisKKyAgICAgICAgKiBfX2ttcF9pdHRfbG9ja19hY3F1aXJpbmcoKSBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSBzZXR0aW5nIHRoZSBsb2NrLgorCisgICAgICAgICogX19rbXBfaXR0X2xvY2tfYWNxdWlyZWQoKSBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIHNldHRpbmcgdGhlIGxvY2suCisKKyAgICAgICAgKiBfX2ttcF9pdHRfbG9ja19yZWFsZWFzaW5nKCkgc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUgdW5zZXR0aW5nIHRoZSBsb2NrLgorCisgICAgICAgICogX19rbXBfaXR0X2xvY2tfY2FuY2VsbGVkKCkgc2hvdWxkIGJlIGNhbGxlZCBhZnRlciB0aHJlYWQgY2FuY2VsbGVkIHdhaXRpbmcgZm9yIHRoZSBsb2NrLgorCisgICAgICAgICogX19rbXBfaXR0X2xvY2tfZGVzdHJveWVkKCBsb2NrICkgc2hvdWxkIGJlIGNhbGxlZCBhZnRlciB0aGUgbGFzdCBsb2NrIG9wZXJhdGlvbi4gQWZ0ZXIKKyAgICAgICAgICBfX2ttcF9pdHRfbG9ja19kZXN0cm95ZWQoKSBhbGwgdGhlIHJlZmVyZW5jZXMgdG8gdGhlIHNhbWUgYWRkcmVzcyB3aWxsIGJlIGNvbnNpZGVyZWQKKyAgICAgICAgICBhcyBhbm90aGVyIHN5bmMgb2JqZWN0LCBub3QgcmVsYXRlZCB3aXRoIHRoZSBvcmlnaW5hbCBvbmUuCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIEludGVybmFsIGd1dHMgLS0gY29tbW9uIGNvZGUgZm9yIGxvY2tzIGFuZCBjcml0aWNhbCBzZWN0aW9ucywgZG8gbm90IGNhbGwgZGlyZWN0bHkuCitfX2ttcF9pbmxpbmUKK3ZvaWQKK19fX2ttcF9pdHRfbG9ja19pbml0KCBrbXBfdXNlcl9sb2NrX3AgbG9jaywgY2hhciBjb25zdCAqIHR5cGUgKSB7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICBpZiAoIF9faXR0X3N5bmNfY3JlYXRlX3B0ciApIHsKKyAgICAgICAgaWRlbnRfdCBjb25zdCAqIGxvYyA9IE5VTEw7CisgICAgICAgIGlmICggX19rbXBfZ2V0X3VzZXJfbG9ja19sb2NhdGlvbl8gIT0gTlVMTCApCisgICAgICAgICAgICBsb2MgPSBfX2ttcF9nZXRfdXNlcl9sb2NrX2xvY2F0aW9uXyggKGxvY2spICk7CisgICAgICAgIGNoYXIgY29uc3QgKiAgICBzcmMgPSAoIGxvYyA9PSBOVUxMID8gTlVMTCA6IGxvYy0+cHNvdXJjZSApOworICAgICAgICBLTVBfSVRUX0RFQlVHX0xPQ0soKTsKKyAgICAgICAgX19pdHRfc3luY19jcmVhdGUoIGxvY2ssIHR5cGUsIHNyYywgMCApOworICAgICAgICBLTVBfSVRUX0RFQlVHX1BSSU5UKCAiW2xjayBpbmldIHNjcmUoICVwLCBcIiVzXCIsIFwiJXNcIiwgMCApXG4iLCBsb2NrLCB0eXBlLCBzcmMgKTsKKyAgICB9OyAvLyBpZgorI2VuZGlmCit9IC8vIF9fX2ttcF9pdHRfbG9ja19pbml0CisKKy8vIEludGVybmFsIGd1dHMgLS0gY29tbW9uIGNvZGUgZm9yIGxvY2tzIGFuZCBjcml0aWNhbCBzZWN0aW9ucywgZG8gbm90IGNhbGwgZGlyZWN0bHkuCitfX2ttcF9pbmxpbmUKK3ZvaWQKK19fX2ttcF9pdHRfbG9ja19maW5pKCBrbXBfdXNlcl9sb2NrX3AgbG9jaywgY2hhciBjb25zdCAqIHR5cGUgKSB7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICBLTVBfSVRUX0RFQlVHX0xPQ0soKTsKKyAgICBfX2l0dF9zeW5jX2Rlc3Ryb3koIGxvY2sgKTsKKyAgICBLTVBfSVRUX0RFQlVHX1BSSU5UKCAiW2xjayBkc3RdIHNkZXMoICVwIClcbiIsIGxvY2sgKTsKKyNlbmRpZgorfSAvLyBfX19rbXBfaXR0X2xvY2tfZmluaQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZAorX19rbXBfaXR0X2xvY2tfY3JlYXRpbmcoIGttcF91c2VyX2xvY2tfcCBsb2NrICkgeworICAgIF9fX2ttcF9pdHRfbG9ja19pbml0KCBsb2NrLCAiT01QIExvY2siICk7Cit9IC8vIF9fa21wX2l0dF9sb2NrX2NyZWF0aW5nCisKK3ZvaWQKK19fa21wX2l0dF9sb2NrX2FjcXVpcmluZygga21wX3VzZXJfbG9ja19wIGxvY2sgKSB7CisgICAgX19pdHRfc3luY19wcmVwYXJlKCBsb2NrICk7Cit9IC8vIF9fa21wX2l0dF9sb2NrX2FjcXVpcmluZworCit2b2lkCitfX2ttcF9pdHRfbG9ja19hY3F1aXJlZCgga21wX3VzZXJfbG9ja19wIGxvY2sgKSB7CisgICAgX19pdHRfc3luY19hY3F1aXJlZCggbG9jayApOworfSAvLyBfX2ttcF9pdHRfbG9ja19hY3F1aXJlZAorCit2b2lkCitfX2ttcF9pdHRfbG9ja19yZWxlYXNpbmcoIGttcF91c2VyX2xvY2tfcCBsb2NrICkgeworICAgIF9faXR0X3N5bmNfcmVsZWFzaW5nKCBsb2NrICk7Cit9IC8vIF9fa21wX2l0dF9sb2NrX3JlbGVhc2luZworCit2b2lkCitfX2ttcF9pdHRfbG9ja19jYW5jZWxsZWQoIGttcF91c2VyX2xvY2tfcCBsb2NrICkgeworICAgIF9faXR0X3N5bmNfY2FuY2VsKCBsb2NrICk7Cit9IC8vIF9fa21wX2l0dF9sb2NrX2NhbmNlbGxlZAorCit2b2lkCitfX2ttcF9pdHRfbG9ja19kZXN0cm95ZWQoIGttcF91c2VyX2xvY2tfcCBsb2NrICkgeworICAgIF9fX2ttcF9pdHRfbG9ja19maW5pKCBsb2NrLCAiT01QIExvY2siICk7Cit9IC8vIF9fa21wX2l0dF9sb2NrX2Rlc3Ryb3llZAorCisvKgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIENyaXRpY2FsIHJlcG9ydGluZy4KKworICAgIENyaXRpY2FsIHNlY3Rpb25zIGFyZSB0cmVhdGVkIGV4YWN0bHkgYXMgbG9ja3MgKGJ1dCBoYXZlIGRpZmZlcmVudCBvYmplY3QgdHlwZSkuCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCit2b2lkCitfX2ttcF9pdHRfY3JpdGljYWxfY3JlYXRpbmcoIGttcF91c2VyX2xvY2tfcCBsb2NrICkgeworICAgIF9fX2ttcF9pdHRfbG9ja19pbml0KCBsb2NrLCAiT01QIENyaXRpY2FsIiApOworfSAvLyBfX2ttcF9pdHRfY3JpdGljYWxfY3JlYXRpbmcKKwordm9pZAorX19rbXBfaXR0X2NyaXRpY2FsX2FjcXVpcmluZygga21wX3VzZXJfbG9ja19wIGxvY2sgKSB7CisgICAgX19pdHRfc3luY19wcmVwYXJlKCBsb2NrICk7Cit9IC8vIF9fa21wX2l0dF9jcml0aWNhbF9hY3F1aXJpbmcKKwordm9pZAorX19rbXBfaXR0X2NyaXRpY2FsX2FjcXVpcmVkKCBrbXBfdXNlcl9sb2NrX3AgbG9jayApIHsKKyAgICBfX2l0dF9zeW5jX2FjcXVpcmVkKCBsb2NrICk7Cit9IC8vIF9fa21wX2l0dF9jcml0aWNhbF9hY3F1aXJlZAorCit2b2lkCitfX2ttcF9pdHRfY3JpdGljYWxfcmVsZWFzaW5nKCBrbXBfdXNlcl9sb2NrX3AgbG9jayApIHsKKyAgICBfX2l0dF9zeW5jX3JlbGVhc2luZyggbG9jayApOworfSAvLyBfX2ttcF9pdHRfY3JpdGljYWxfcmVsZWFzaW5nCisKK3ZvaWQKK19fa21wX2l0dF9jcml0aWNhbF9kZXN0cm95ZWQoIGttcF91c2VyX2xvY2tfcCBsb2NrICkgeworICAgIF9fX2ttcF9pdHRfbG9ja19maW5pKCBsb2NrLCAiT01QIENyaXRpY2FsIiApOworfSAvLyBfX2ttcF9pdHRfY3JpdGljYWxfZGVzdHJveWVkCisKKy8qCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2luZ2xlIHJlcG9ydGluZy4KKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKK3ZvaWQKK19fa21wX2l0dF9zaW5nbGVfc3RhcnQoIGludCBndGlkICkgeworI2lmIFVTRV9JVFRfTk9USUZZCisgICAgaWYgKCBfX2l0dF9tYXJrX2NyZWF0ZV9wdHIgfHwgS01QX0lUVF9ERUJVRyApIHsKKyAgICAgICAga21wX2luZm9fdCAqICAgdGhyID0gX19rbXBfdGhyZWFkX2Zyb21fZ3RpZCggKGd0aWQpICk7CisgICAgICAgIGlkZW50X3QgKiAgICAgIGxvYyA9IHRoci0+dGgudGhfaWRlbnQ7CisgICAgICAgIGNoYXIgY29uc3QgKiAgIHNyYyA9ICggbG9jID09IE5VTEwgPyBOVUxMIDogbG9jLT5wc291cmNlICk7CisgICAgICAgIGttcF9zdHJfYnVmX3QgIG5hbWU7CisgICAgICAgIF9fa21wX3N0cl9idWZfaW5pdCggJiBuYW1lICk7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICYgbmFtZSwgIk9NUCBTaW5nbGUtJXMiLCBzcmMgKTsKKyAgICAgICAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgICAgICAgIHRoci0+dGgudGhfaXR0X21hcmtfc2luZ2xlID0gX19pdHRfbWFya19jcmVhdGUoIG5hbWUuc3RyICk7CisgICAgICAgIEtNUF9JVFRfREVCVUdfUFJJTlQoICJbc2luIHN0YV0gbWNyZSggXCIlc1wiKSAtPiAlZFxuIiwgbmFtZS5zdHIsIHRoci0+dGgudGhfaXR0X21hcmtfc2luZ2xlICk7CisgICAgICAgIF9fa21wX3N0cl9idWZfZnJlZSggJiBuYW1lICk7CisgICAgICAgIEtNUF9JVFRfREVCVUdfTE9DSygpOworICAgICAgICBfX2l0dF9tYXJrKCB0aHItPnRoLnRoX2l0dF9tYXJrX3NpbmdsZSwgTlVMTCApOworICAgICAgICBLTVBfSVRUX0RFQlVHX1BSSU5UKCAiW3NpbiBzdGFdIG1hcmsoICVkLCBOVUxMIClcbiIsIHRoci0+dGgudGhfaXR0X21hcmtfc2luZ2xlICk7CisgICAgfTsgLy8gaWYKKyNlbmRpZgorfSAvLyBfX2ttcF9pdHRfc2luZ2xlX3N0YXJ0CisKK3ZvaWQKK19fa21wX2l0dF9zaW5nbGVfZW5kKCBpbnQgZ3RpZCApIHsKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIF9faXR0X21hcmtfdHlwZSAgbWFyayA9IF9fa21wX3RocmVhZF9mcm9tX2d0aWQoIGd0aWQgKS0+dGgudGhfaXR0X21hcmtfc2luZ2xlOworICAgIEtNUF9JVFRfREVCVUdfTE9DSygpOworICAgIF9faXR0X21hcmtfb2ZmKCBtYXJrICk7CisgICAgS01QX0lUVF9ERUJVR19QUklOVCggIltzaW4gZW5kXSBtb2ZmKCAlZCApXG4iLCBtYXJrICk7CisjZW5kaWYKK30gLy8gX19rbXBfaXR0X3NpbmdsZV9lbmQKKworLyoKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBPcmRlcmVkIHJlcG9ydGluZy4KKworICAgIF9fa21wX2l0dF9vcmRlcmVkX2luaXQgaXMgY2FsbGVkIGJ5IGVhY2ggdGhyZWFkICpiZWZvcmUqIGZpcnN0IHVzaW5nIHN5bmMKKyAgICBvYmplY3QuIElUVCB0ZWFtIHdvdWxkIGxpa2UgaXQgdG8gYmUgY2FsbGVkIG9uY2UsIGJ1dCBpdCByZXF1aXJlcyBleHRyYSBzeW5jaHJvbml6YXRpb24uCisKKyAgICBfX2ttcF9pdHRfb3JkZXJlZF9wcmVwIGlzIGNhbGxlZCB3aGVuIHRocmVhZCBpcyBnb2luZyB0byBlbnRlciBvcmRlcmVkIHNlY3Rpb24KKyAgICAoYmVmb3JlIHN5bmNocm9uaXphdGlvbikuCisKKyAgICBfX2ttcF9pdHRfb3JkZXJlZF9zdGFydCBpcyBjYWxsZWQganVzdCBiZWZvcmUgZW50ZXJpbmcgdXNlciBjb2RlIChhZnRlcgorICAgIHN5bmNocm9uaXphdGlvbikuCisKKyAgICBfX2ttcF9pdHRfb3JkZXJlZF9lbmQgaXMgY2FsbGVkIGFmdGVyIHJldHVybmluZyBmcm9tIHVzZXIgY29kZS4KKworICAgIFN5bmMgb2JqZWN0IGlzIHRoLT50aC50aF9kaXNwYXRjaC0+dGhfZGlzcGF0Y2hfc2hfY3VycmVudC4KKworICAgIEV2ZW50cyBhcmUgbm90IGdlbmVyYXRlZCBpbiBjYXNlIG9mIHNlcmlhbGl6ZWQgdGVhbS4KKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKK3ZvaWQKK19fa21wX2l0dF9vcmRlcmVkX2luaXQoIGludCBndGlkICkgeworI2lmIFVTRV9JVFRfTk9USUZZCisgICAgaWYgKCBfX2l0dF9zeW5jX2NyZWF0ZV9wdHIgKSB7CisgICAgICAgIGttcF9pbmZvX3QgKiAgIHRociAgID0gX19rbXBfdGhyZWFkX2Zyb21fZ3RpZCggZ3RpZCApOworICAgICAgICBpZGVudF90IGNvbnN0ICogbG9jICA9IHRoci0+dGgudGhfaWRlbnQ7CisgICAgICAgIGNoYXIgY29uc3QgKiAgICBzcmMgID0gKCBsb2MgPT0gTlVMTCA/IE5VTEwgOiBsb2MtPnBzb3VyY2UgKTsKKyAgICAgICAgX19pdHRfc3luY19jcmVhdGUoCisgICAgICAgICAgICB0aHItPnRoLnRoX2Rpc3BhdGNoLT50aF9kaXNwYXRjaF9zaF9jdXJyZW50LCAiT01QIE9yZGVyZWQiLCBzcmMsIDAKKyAgICAgICAgKTsKKyAgICB9OyAvLyBpZgorI2VuZGlmCit9IC8vIF9fa21wX2l0dF9vcmRlcmVkX2luaXQKKwordm9pZAorX19rbXBfaXR0X29yZGVyZWRfcHJlcCggaW50IGd0aWQgKSB7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICBpZiAoIF9faXR0X3N5bmNfY3JlYXRlX3B0ciApIHsKKyAgICAgICAga21wX3RlYW1fdCAqIHQgPSBfX2ttcF90ZWFtX2Zyb21fZ3RpZCggZ3RpZCApOworICAgICAgICBpZiAoICEgdC0+dC50X3NlcmlhbGl6ZWQgKSB7CisgICAgICAgICAgICBrbXBfaW5mb190ICogdGggPSBfX2ttcF90aHJlYWRfZnJvbV9ndGlkKCBndGlkICk7CisgICAgICAgICAgICBfX2l0dF9zeW5jX3ByZXBhcmUoIHRoLT50aC50aF9kaXNwYXRjaC0+dGhfZGlzcGF0Y2hfc2hfY3VycmVudCApOworICAgICAgICB9OyAvLyBpZgorICAgIH07IC8vIGlmCisjZW5kaWYKK30gLy8gX19rbXBfaXR0X29yZGVyZWRfcHJlcAorCit2b2lkCitfX2ttcF9pdHRfb3JkZXJlZF9zdGFydCggaW50IGd0aWQgKSB7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICBpZiAoIF9faXR0X3N5bmNfY3JlYXRlX3B0ciApIHsKKyAgICAgICAga21wX3RlYW1fdCAqIHQgPSBfX2ttcF90ZWFtX2Zyb21fZ3RpZCggZ3RpZCApOworICAgICAgICBpZiAoICEgdC0+dC50X3NlcmlhbGl6ZWQgKSB7CisgICAgICAgICAgICBrbXBfaW5mb190ICogdGggPSBfX2ttcF90aHJlYWRfZnJvbV9ndGlkKCBndGlkICk7CisgICAgICAgICAgICBfX2l0dF9zeW5jX2FjcXVpcmVkKCB0aC0+dGgudGhfZGlzcGF0Y2gtPnRoX2Rpc3BhdGNoX3NoX2N1cnJlbnQgKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICB9OyAvLyBpZgorI2VuZGlmCit9IC8vIF9fa21wX2l0dF9vcmRlcmVkX3N0YXJ0CisKK3ZvaWQKK19fa21wX2l0dF9vcmRlcmVkX2VuZCggaW50IGd0aWQgKSB7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICBpZiAoIF9faXR0X3N5bmNfY3JlYXRlX3B0ciApIHsKKyAgICAgICAga21wX3RlYW1fdCAqIHQgPSBfX2ttcF90ZWFtX2Zyb21fZ3RpZCggZ3RpZCApOworICAgICAgICBpZiAoICEgdC0+dC50X3NlcmlhbGl6ZWQgKSB7CisgICAgICAgICAgICBrbXBfaW5mb190ICogdGggPSBfX2ttcF90aHJlYWRfZnJvbV9ndGlkKCBndGlkICk7CisgICAgICAgICAgICBfX2l0dF9zeW5jX3JlbGVhc2luZyggdGgtPnRoLnRoX2Rpc3BhdGNoLT50aF9kaXNwYXRjaF9zaF9jdXJyZW50ICk7CisgICAgICAgIH07IC8vIGlmCisgICAgfTsgLy8gaWYKKyNlbmRpZgorfSAvLyBfX2ttcF9pdHRfb3JkZXJlZF9lbmQKKworCisvKgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFRocmVhZHMgcmVwb3J0aW5nLgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKwordm9pZAorX19rbXBfaXR0X3RocmVhZF9pZ25vcmUoKSB7CisgICAgX19pdHRfdGhyX2lnbm9yZSgpOworfSAvLyBfX2ttcF9pdHRfdGhyZWFkX2lnbm9yZQorCit2b2lkCitfX2ttcF9pdHRfdGhyZWFkX25hbWUoIGludCBndGlkICkgeworI2lmIFVTRV9JVFRfTk9USUZZCisgICAgaWYgKCBfX2l0dF90aHJfbmFtZV9zZXRfcHRyICkgeworICAgICAgICBrbXBfc3RyX2J1Zl90IG5hbWU7CisgICAgICAgIF9fa21wX3N0cl9idWZfaW5pdCggJiBuYW1lICk7CisgICAgICAgIGlmKCBLTVBfTUFTVEVSX0dUSUQoZ3RpZCkgKSB7CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmIG5hbWUsICJPTVAgTWFzdGVyIFRocmVhZCAjJWQiLCBndGlkICk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmIG5hbWUsICJPTVAgV29ya2VyIFRocmVhZCAjJWQiLCBndGlkICk7CisgICAgICAgIH0KKyAgICAgICAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgICAgICAgIF9faXR0X3Rocl9uYW1lX3NldCggbmFtZS5zdHIsIG5hbWUudXNlZCApOworICAgICAgICBLTVBfSVRUX0RFQlVHX1BSSU5UKCAiW3RociBuYW1dIG5hbWUoIFwiJXNcIilcbiIsIG5hbWUuc3RyICk7CisgICAgICAgIF9fa21wX3N0cl9idWZfZnJlZSggJiBuYW1lICk7CisgICAgfTsgLy8gaWYKKyNlbmRpZgorfSAvLyBfX2ttcF9pdHRfdGhyZWFkX25hbWUKKworCisvKgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU3lzdGVtIG9iamVjdCByZXBvcnRpbmcuCisKKyAgICBJVFQgY2F0Y2hlcyBvcGVyYXRpb25zIHdpdGggc3lzdGVtIHN5bmMgb2JqZWN0cyAobGlrZSBXaW5kb3dzKiBPUyBvbiBJQS0zMgorICAgIGFyY2hpdGVjdHVyZSBBUEkgY3JpdGljYWwgc2VjdGlvbnMgYW5kIGV2ZW50cykuIFdlIG9ubHkgbmVlZCB0byBzcGVjaWZ5CisgICAgbmFtZSAoIk9NUCBTY2hlZHVsZXIiKSBmb3IgdGhlIG9iamVjdCB0byBsZXQgSVRUIGtub3cgaXQgaXMgYW4gb2JqZWN0IHVzZWQKKyAgICBieSBPcGVuTVAgUlRMIGZvciBpbnRlcm5hbCBwdXJwb3Nlcy4KKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKwordm9pZAorX19rbXBfaXR0X3N5c3RlbV9vYmplY3RfY3JlYXRlZCggdm9pZCAqIG9iamVjdCwgY2hhciBjb25zdCAqIG5hbWUgKSB7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICBLTVBfSVRUX0RFQlVHX0xPQ0soKTsKKyAgICBfX2l0dF9zeW5jX2NyZWF0ZSggb2JqZWN0LCAiT01QIFNjaGVkdWxlciIsIG5hbWUsIDAgKTsKKyAgIEtNUF9JVFRfREVCVUdfUFJJTlQoICJbc3lzIG9ial0gc2NyZSggJXAsIFwiT01QIFNjaGVkdWxlclwiLCBcIiVzXCIsIDAgKVxuIiwgb2JqZWN0LCBuYW1lICk7CisjZW5kaWYKK30gLy8gX19rbXBfaXR0X3N5c3RlbV9vYmplY3RfY3JlYXRlZAorCisKKy8qCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU3RhY2sgc3RpdGNoaW5nIGFwaS4KKworICAgIE1hc3RlciBjYWxscyAiY3JlYXRlIiBhbmQgcHV0IHRoZSBzdGl0Y2hpbmcgaWQgaW50byB0ZWFtIHN0cnVjdHVyZS4KKyAgICBXb3JrZXJzIHJlYWQgdGhlIHN0aXRjaGluZyBpZCBhbmQgY2FsbCAiZW50ZXIiIC8gImxlYXZlIiBhcGkuCisgICAgTWFzdGVyIGNhbGxzICJkZXN0cm95IiBhdCB0aGUgZW5kIG9mIHRoZSBwYXJhbGxlbCByZWdpb24uCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCitfX2l0dF9jYWxsZXIKK19fa21wX2l0dF9zdGFja19jYWxsZXJfY3JlYXRlKCkKK3sKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIGlmICggIV9faXR0X3N0YWNrX2NhbGxlcl9jcmVhdGVfcHRyICkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgICAgX19pdHRfY2FsbGVyIGlkID0gX19pdHRfc3RhY2tfY2FsbGVyX2NyZWF0ZSgpOworICAgIEtNUF9JVFRfREVCVUdfUFJJTlQoICJbc3RrIGNyZV0gJXBcbiIsIGlkICk7CisgICAgcmV0dXJuIGlkOworI2VuZGlmCisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQKK19fa21wX2l0dF9zdGFja19jYWxsZXJfZGVzdHJveSggX19pdHRfY2FsbGVyIGlkICkKK3sKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIGlmICggX19pdHRfc3RhY2tfY2FsbGVyX2Rlc3Ryb3lfcHRyICkgeworICAgICAgICBLTVBfSVRUX0RFQlVHX0xPQ0soKTsKKyAgICAgICAgX19pdHRfc3RhY2tfY2FsbGVyX2Rlc3Ryb3koIGlkICk7CisgICAgICAgIEtNUF9JVFRfREVCVUdfUFJJTlQoICJbc3RrIGRlc10gJXBcbiIsIGlkICk7CisgICAgfQorI2VuZGlmCit9CisKK3ZvaWQKK19fa21wX2l0dF9zdGFja19jYWxsZWVfZW50ZXIoIF9faXR0X2NhbGxlciBpZCApCit7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICBpZiAoIF9faXR0X3N0YWNrX2NhbGxlZV9lbnRlcl9wdHIgKSB7CisgICAgICAgIEtNUF9JVFRfREVCVUdfTE9DSygpOworICAgICAgICBfX2l0dF9zdGFja19jYWxsZWVfZW50ZXIoIGlkICk7CisgICAgICAgIEtNUF9JVFRfREVCVUdfUFJJTlQoICJbc3RrIGVudF0gJXBcbiIsIGlkICk7CisgICAgfQorI2VuZGlmCit9CisKK3ZvaWQKK19fa21wX2l0dF9zdGFja19jYWxsZWVfbGVhdmUoIF9faXR0X2NhbGxlciBpZCApCit7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICBpZiAoIF9faXR0X3N0YWNrX2NhbGxlZV9sZWF2ZV9wdHIgKSB7CisgICAgICAgIEtNUF9JVFRfREVCVUdfTE9DSygpOworICAgICAgICBfX2l0dF9zdGFja19jYWxsZWVfbGVhdmUoIGlkICk7CisgICAgICAgIEtNUF9JVFRfREVCVUdfUFJJTlQoICJbc3RrIGxlYV0gJXBcbiIsIGlkICk7CisgICAgfQorI2VuZGlmCit9CisKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfbG9jay5jcHAgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfbG9jay5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRiOTMzNgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9sb2NrLmNwcApAQCAtMCwwICsxLDM1NDMgQEAKKy8qCisgKiBrbXBfbG9jay5jcHAgLS0gbG9jay1yZWxhdGVkIGZ1bmN0aW9ucworICogJFJldmlzaW9uOiA0MzM4OSAkCisgKiAkRGF0ZTogMjAxNC0wOC0xMSAxMDo1NDowMSAtMDUwMCAoTW9uLCAxMSBBdWcgMjAxNCkgJAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJrbXBfaXR0LmgiCisjaW5jbHVkZSAia21wX2kxOG4uaCIKKyNpbmNsdWRlICJrbXBfbG9jay5oIgorI2luY2x1ZGUgImttcF9pby5oIgorCisjaWYgS01QX09TX0xJTlVYICYmIChLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSB8fCBLTVBfQVJDSF9BQVJDSDY0KQorIyBpbmNsdWRlIDx1bmlzdGQuaD4KKyMgaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KKy8vIFdlIHNob3VsZCByZWFsbHkgaW5jbHVkZSA8ZnV0ZXguaD4sIGJ1dCB0aGF0IGNhdXNlcyBjb21wYXRpYmlsaXR5IHByb2JsZW1zIG9uIGRpZmZlcmVudAorLy8gTGludXgqIE9TIGRpc3RyaWJ1dGlvbnMgdGhhdCBlaXRoZXIgcmVxdWlyZSB0aGF0IHlvdSBpbmNsdWRlIChvciBicmVhayB3aGVuIHlvdSB0cnkgdG8gaW5jbHVkZSkKKy8vIDxwY2kvdHlwZXMuaD4uCisvLyBTaW5jZSBhbGwgd2UgbmVlZCBpcyB0aGUgdHdvIG1hY3JvcyBiZWxvdyAod2hpY2ggYXJlIHBhcnQgb2YgdGhlIGtlcm5lbCBBQkksIHNvIGNhbid0IGNoYW5nZSkKKy8vIHdlIGp1c3QgZGVmaW5lIHRoZSBjb25zdGFudHMgaGVyZSBhbmQgZG9uJ3QgaW5jbHVkZSA8ZnV0ZXguaD4KKyMgaWZuZGVmIEZVVEVYX1dBSVQKKyMgIGRlZmluZSBGVVRFWF9XQUlUICAgIDAKKyMgZW5kaWYKKyMgaWZuZGVmIEZVVEVYX1dBS0UKKyMgIGRlZmluZSBGVVRFWF9XQUtFICAgIDEKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBJbXBsZW1lbnQgc3BpbiBsb2NrcyBmb3IgaW50ZXJuYWwgbGlicmFyeSB1c2UuICAgICAgICAgICAgICovCisvKiBUaGUgYWxnb3JpdGhtIGltcGxlbWVudGVkIGlzIExhbXBvcnQncyBiYWtlcnkgbG9jayBbMTk3NF0uICovCisKK3ZvaWQKK19fa21wX3ZhbGlkYXRlX2xvY2tzKCB2b2lkICkKK3sKKyAgICBpbnQgaTsKKyAgICBrbXBfdWludDMyICB4LCB5OworCisgICAgLyogQ2hlY2sgdG8gbWFrZSBzdXJlIHVuc2lnbmVkIGFyaXRobWV0aWMgZG9lcyB3cmFwcyBwcm9wZXJseSAqLworICAgIHggPSB+KChrbXBfdWludDMyKSAwKSAtIDI7CisgICAgeSA9IHggLSAyOworCisgICAgZm9yIChpID0gMDsgaSA8IDg7ICsraSwgKyt4LCArK3kpIHsKKyAgICAgICAga21wX3VpbnQzMiB6ID0gKHggLSB5KTsKKyAgICAgICAgS01QX0FTU0VSVCggeiA9PSAyICk7CisgICAgfQorCisgICAgS01QX0FTU0VSVCggb2Zmc2V0b2YoIGttcF9iYXNlX3F1ZXVpbmdfbG9jaywgdGFpbF9pZCApICUgOCA9PSAwICk7Cit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiB0ZXN0IGFuZCBzZXQgbG9ja3MgKi8KKworLy8KKy8vIEZvciB0aGUgbm9uLW5lc3RlZCBsb2Nrcywgd2UgY2FuIG9ubHkgYXNzdW1lIHRoYXQgdGhlIGZpcnN0IDQgYnl0ZXMgd2VyZQorLy8gYWxsb2NhdGVkLCBzaW5jZSBnY2Mgb25seSBhbGxvY2F0ZXMgNCBieXRlcyBmb3Igb21wX2xvY2tfdCwgYW5kIHRoZSBJbnRlbAorLy8gY29tcGlsZXIgb25seSBhbGxvY2F0ZXMgYSA0IGJ5dGUgcG9pbnRlciBvbiBJQS0zMiBhcmNoaXRlY3R1cmUuICBPbgorLy8gV2luZG93cyogT1Mgb24gSW50ZWwoUikgNjQsIHdlIGNhbiBhc3N1bWUgdGhhdCBhbGwgOCBieXRlcyB3ZXJlIGFsbG9jYXRlZC4KKy8vCisvLyBnY2MgcmVzZXJ2ZXMgPj0gOCBieXRlcyBmb3IgbmVzdGVkIGxvY2tzLCBzbyB3ZSBjYW4gYXNzdW1lIHRoYXQgdGhlCisvLyBlbnRpcmUgOCBieXRlcyB3ZXJlIGFsbG9jYXRlZCBmb3IgbmVzdGVkIGxvY2tzIG9uIGFsbCA2NC1iaXQgcGxhdGZvcm1zLgorLy8KKworc3RhdGljIGttcF9pbnQzMgorX19rbXBfZ2V0X3Rhc19sb2NrX293bmVyKCBrbXBfdGFzX2xvY2tfdCAqbGNrICkKK3sKKyAgICByZXR1cm4gVENSXzQoIGxjay0+bGsucG9sbCApIC0gMTsKK30KKworc3RhdGljIGlubGluZSBib29sCitfX2ttcF9pc190YXNfbG9ja19uZXN0YWJsZSgga21wX3Rhc19sb2NrX3QgKmxjayApCit7CisgICAgcmV0dXJuIGxjay0+bGsuZGVwdGhfbG9ja2VkICE9IC0xOworfQorCitfX2ZvcmNlaW5saW5lIHN0YXRpYyB2b2lkCitfX2ttcF9hY3F1aXJlX3Rhc19sb2NrX3RpbWVkX3RlbXBsYXRlKCBrbXBfdGFzX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgS01QX01CKCk7CisKKyNpZmRlZiBVU0VfTE9DS19QUk9GSUxFCisgICAga21wX3VpbnQzMiBjdXJyID0gVENSXzQoIGxjay0+bGsucG9sbCApOworICAgIGlmICggKCBjdXJyICE9IDAgKSAmJiAoIGN1cnIgIT0gZ3RpZCArIDEgKSApCisgICAgICAgIF9fa21wX3ByaW50ZiggIkxPQ0sgQ09OVEVOVElPTjogJXBcbiIsIGxjayApOworICAgIC8qIGVsc2UgX19rbXBfcHJpbnRmKCAiLiIgKTsqLworI2VuZGlmIC8qIFVTRV9MT0NLX1BST0ZJTEUgKi8KKworICAgIGlmICggKCBsY2stPmxrLnBvbGwgPT0gMCApCisgICAgICAmJiBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRMzIoICYgKCBsY2stPmxrLnBvbGwgKSwgMCwgZ3RpZCArIDEgKSApIHsKKyAgICAgICAgS01QX0ZTWU5DX0FDUVVJUkVEKGxjayk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBrbXBfdWludDMyIHNwaW5zOworICAgIEtNUF9GU1lOQ19QUkVQQVJFKCBsY2sgKTsKKyAgICBLTVBfSU5JVF9ZSUVMRCggc3BpbnMgKTsKKyAgICBpZiAoIFRDUl80KCBfX2ttcF9udGggKSA+ICggX19rbXBfYXZhaWxfcHJvYyA/IF9fa21wX2F2YWlsX3Byb2MgOgorICAgICAgX19rbXBfeHByb2MgKSApIHsKKyAgICAgICAgS01QX1lJRUxEKCBUUlVFICk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBLTVBfWUlFTERfU1BJTiggc3BpbnMgKTsKKyAgICB9CisKKyAgICB3aGlsZSAoICggbGNrLT5say5wb2xsICE9IDAgKSB8fAorICAgICAgKCAhIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EzMiggJiAoIGxjay0+bGsucG9sbCApLCAwLCBndGlkICsgMSApICkgKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIEZJWE1FIC0gdXNlIGV4cG9uZW50aWFsIGJhY2tvZmYgaGVyZQorICAgICAgICAvLworICAgICAgICBpZiAoIFRDUl80KCBfX2ttcF9udGggKSA+ICggX19rbXBfYXZhaWxfcHJvYyA/IF9fa21wX2F2YWlsX3Byb2MgOgorICAgICAgICAgIF9fa21wX3hwcm9jICkgKSB7CisgICAgICAgICAgICBLTVBfWUlFTEQoIFRSVUUgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIEtNUF9ZSUVMRF9TUElOKCBzcGlucyApOworICAgICAgICB9CisgICAgfQorICAgIEtNUF9GU1lOQ19BQ1FVSVJFRCggbGNrICk7Cit9CisKK3ZvaWQKK19fa21wX2FjcXVpcmVfdGFzX2xvY2soIGttcF90YXNfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBfX2ttcF9hY3F1aXJlX3Rhc19sb2NrX3RpbWVkX3RlbXBsYXRlKCBsY2ssIGd0aWQgKTsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2FjcXVpcmVfdGFzX2xvY2tfd2l0aF9jaGVja3MoIGttcF90YXNfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfc2V0X2xvY2siOworICAgIGlmICggKCBzaXplb2YgKCBrbXBfdGFzX2xvY2tfdCApIDw9IE9NUF9MT0NLX1RfU0laRSApCisgICAgICAmJiBfX2ttcF9pc190YXNfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja05lc3RhYmxlVXNlZEFzU2ltcGxlLCBmdW5jICk7CisgICAgfQorICAgIGlmICggKCBndGlkID49IDAgKSAmJiAoIF9fa21wX2dldF90YXNfbG9ja19vd25lciggbGNrICkgPT0gZ3RpZCApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tJc0FscmVhZHlPd25lZCwgZnVuYyApOworICAgIH0KKyAgICBfX2ttcF9hY3F1aXJlX3Rhc19sb2NrKCBsY2ssIGd0aWQgKTsKK30KKworaW50CitfX2ttcF90ZXN0X3Rhc19sb2NrKCBrbXBfdGFzX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgaWYgKCAoIGxjay0+bGsucG9sbCA9PSAwICkKKyAgICAgICYmIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EzMiggJiAoIGxjay0+bGsucG9sbCApLCAwLCBndGlkICsgMSApICkgeworICAgICAgICBLTVBfRlNZTkNfQUNRVUlSRUQoIGxjayApOworICAgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgICAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgaW50CitfX2ttcF90ZXN0X3Rhc19sb2NrX3dpdGhfY2hlY2tzKCBrbXBfdGFzX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3Rlc3RfbG9jayI7CisgICAgaWYgKCAoIHNpemVvZiAoIGttcF90YXNfbG9ja190ICkgPD0gT01QX0xPQ0tfVF9TSVpFICkKKyAgICAgICYmIF9fa21wX2lzX3Rhc19sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrTmVzdGFibGVVc2VkQXNTaW1wbGUsIGZ1bmMgKTsKKyAgICB9CisgICAgcmV0dXJuIF9fa21wX3Rlc3RfdGFzX2xvY2soIGxjaywgZ3RpZCApOworfQorCit2b2lkCitfX2ttcF9yZWxlYXNlX3Rhc19sb2NrKCBrbXBfdGFzX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICBLTVBfRlNZTkNfUkVMRUFTSU5HKGxjayk7CisgICAgS01QX1NUX1JFTDMyKCAmKGxjay0+bGsucG9sbCksIDAgKTsKKworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgS01QX1lJRUxEKCBUQ1JfNCggX19rbXBfbnRoICkgPiAoIF9fa21wX2F2YWlsX3Byb2MgPyBfX2ttcF9hdmFpbF9wcm9jIDoKKyAgICAgIF9fa21wX3hwcm9jICkgKTsKK30KKworc3RhdGljIHZvaWQKK19fa21wX3JlbGVhc2VfdGFzX2xvY2tfd2l0aF9jaGVja3MoIGttcF90YXNfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfdW5zZXRfbG9jayI7CisgICAgS01QX01CKCk7ICAvKiBpbiBjYXNlIGFub3RoZXIgcHJvY2Vzc29yIGluaXRpYWxpemVkIGxvY2sgKi8KKyAgICBpZiAoICggc2l6ZW9mICgga21wX3Rhc19sb2NrX3QgKSA8PSBPTVBfTE9DS19UX1NJWkUgKQorICAgICAgJiYgX19rbXBfaXNfdGFzX2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tOZXN0YWJsZVVzZWRBc1NpbXBsZSwgZnVuYyApOworICAgIH0KKyAgICBpZiAoIF9fa21wX2dldF90YXNfbG9ja19vd25lciggbGNrICkgPT0gLTEgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1Vuc2V0dGluZ0ZyZWUsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCAoIGd0aWQgPj0gMCApICYmICggX19rbXBfZ2V0X3Rhc19sb2NrX293bmVyKCBsY2sgKSA+PSAwICkKKyAgICAgICYmICggX19rbXBfZ2V0X3Rhc19sb2NrX293bmVyKCBsY2sgKSAhPSBndGlkICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1Vuc2V0dGluZ1NldEJ5QW5vdGhlciwgZnVuYyApOworICAgIH0KKyAgICBfX2ttcF9yZWxlYXNlX3Rhc19sb2NrKCBsY2ssIGd0aWQgKTsKK30KKwordm9pZAorX19rbXBfaW5pdF90YXNfbG9jaygga21wX3Rhc19sb2NrX3QgKiBsY2sgKQoreworICAgIFRDV180KCBsY2stPmxrLnBvbGwsIDAgKTsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2luaXRfdGFzX2xvY2tfd2l0aF9jaGVja3MoIGttcF90YXNfbG9ja190ICogbGNrICkKK3sKKyAgICBfX2ttcF9pbml0X3Rhc19sb2NrKCBsY2sgKTsKK30KKwordm9pZAorX19rbXBfZGVzdHJveV90YXNfbG9jaygga21wX3Rhc19sb2NrX3QgKmxjayApCit7CisgICAgbGNrLT5say5wb2xsID0gMDsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2Rlc3Ryb3lfdGFzX2xvY2tfd2l0aF9jaGVja3MoIGttcF90YXNfbG9ja190ICpsY2sgKQoreworICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF9kZXN0cm95X2xvY2siOworICAgIGlmICggKCBzaXplb2YgKCBrbXBfdGFzX2xvY2tfdCApIDw9IE9NUF9MT0NLX1RfU0laRSApCisgICAgICAmJiBfX2ttcF9pc190YXNfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja05lc3RhYmxlVXNlZEFzU2ltcGxlLCBmdW5jICk7CisgICAgfQorICAgIGlmICggX19rbXBfZ2V0X3Rhc19sb2NrX293bmVyKCBsY2sgKSAhPSAtMSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrU3RpbGxPd25lZCwgZnVuYyApOworICAgIH0KKyAgICBfX2ttcF9kZXN0cm95X3Rhc19sb2NrKCBsY2sgKTsKK30KKworCisvLworLy8gbmVzdGVkIHRlc3QgYW5kIHNldCBsb2NrcworLy8KKwordm9pZAorX19rbXBfYWNxdWlyZV9uZXN0ZWRfdGFzX2xvY2soIGttcF90YXNfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBndGlkID49IDAgKTsKKworICAgIGlmICggX19rbXBfZ2V0X3Rhc19sb2NrX293bmVyKCBsY2sgKSA9PSBndGlkICkgeworICAgICAgICBsY2stPmxrLmRlcHRoX2xvY2tlZCArPSAxOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgX19rbXBfYWNxdWlyZV90YXNfbG9ja190aW1lZF90ZW1wbGF0ZSggbGNrLCBndGlkICk7CisgICAgICAgIGxjay0+bGsuZGVwdGhfbG9ja2VkID0gMTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9hY3F1aXJlX25lc3RlZF90YXNfbG9ja193aXRoX2NoZWNrcygga21wX3Rhc19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF9zZXRfbmVzdF9sb2NrIjsKKyAgICBpZiAoICEgX19rbXBfaXNfdGFzX2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tTaW1wbGVVc2VkQXNOZXN0YWJsZSwgZnVuYyApOworICAgIH0KKyAgICBfX2ttcF9hY3F1aXJlX25lc3RlZF90YXNfbG9jayggbGNrLCBndGlkICk7Cit9CisKK2ludAorX19rbXBfdGVzdF9uZXN0ZWRfdGFzX2xvY2soIGttcF90YXNfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBpbnQgcmV0dmFsOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggZ3RpZCA+PSAwICk7CisKKyAgICBpZiAoIF9fa21wX2dldF90YXNfbG9ja19vd25lciggbGNrICkgPT0gZ3RpZCApIHsKKyAgICAgICAgcmV0dmFsID0gKytsY2stPmxrLmRlcHRoX2xvY2tlZDsKKyAgICB9CisgICAgZWxzZSBpZiAoICFfX2ttcF90ZXN0X3Rhc19sb2NrKCBsY2ssIGd0aWQgKSApIHsKKyAgICAgICAgcmV0dmFsID0gMDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIEtNUF9NQigpOworICAgICAgICByZXR2YWwgPSBsY2stPmxrLmRlcHRoX2xvY2tlZCA9IDE7CisgICAgfQorICAgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQKK19fa21wX3Rlc3RfbmVzdGVkX3Rhc19sb2NrX3dpdGhfY2hlY2tzKCBrbXBfdGFzX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3Rlc3RfbmVzdF9sb2NrIjsKKyAgICBpZiAoICEgX19rbXBfaXNfdGFzX2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tTaW1wbGVVc2VkQXNOZXN0YWJsZSwgZnVuYyApOworICAgIH0KKyAgICByZXR1cm4gX19rbXBfdGVzdF9uZXN0ZWRfdGFzX2xvY2soIGxjaywgZ3RpZCApOworfQorCit2b2lkCitfX2ttcF9yZWxlYXNlX25lc3RlZF90YXNfbG9jaygga21wX3Rhc19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIGd0aWQgPj0gMCApOworCisgICAgS01QX01CKCk7CisgICAgaWYgKCAtLShsY2stPmxrLmRlcHRoX2xvY2tlZCkgPT0gMCApIHsKKyAgICAgICAgX19rbXBfcmVsZWFzZV90YXNfbG9jayggbGNrLCBndGlkICk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorX19rbXBfcmVsZWFzZV9uZXN0ZWRfdGFzX2xvY2tfd2l0aF9jaGVja3MoIGttcF90YXNfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfdW5zZXRfbmVzdF9sb2NrIjsKKyAgICBLTVBfTUIoKTsgIC8qIGluIGNhc2UgYW5vdGhlciBwcm9jZXNzb3IgaW5pdGlhbGl6ZWQgbG9jayAqLworICAgIGlmICggISBfX2ttcF9pc190YXNfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1NpbXBsZVVzZWRBc05lc3RhYmxlLCBmdW5jICk7CisgICAgfQorICAgIGlmICggX19rbXBfZ2V0X3Rhc19sb2NrX293bmVyKCBsY2sgKSA9PSAtMSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrVW5zZXR0aW5nRnJlZSwgZnVuYyApOworICAgIH0KKyAgICBpZiAoIF9fa21wX2dldF90YXNfbG9ja19vd25lciggbGNrICkgIT0gZ3RpZCApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrVW5zZXR0aW5nU2V0QnlBbm90aGVyLCBmdW5jICk7CisgICAgfQorICAgIF9fa21wX3JlbGVhc2VfbmVzdGVkX3Rhc19sb2NrKCBsY2ssIGd0aWQgKTsKK30KKwordm9pZAorX19rbXBfaW5pdF9uZXN0ZWRfdGFzX2xvY2soIGttcF90YXNfbG9ja190ICogbGNrICkKK3sKKyAgICBfX2ttcF9pbml0X3Rhc19sb2NrKCBsY2sgKTsKKyAgICBsY2stPmxrLmRlcHRoX2xvY2tlZCA9IDA7IC8vID49IDAgZm9yIG5lc3RhYmxlIGxvY2tzLCAtMSBmb3Igc2ltcGxlIGxvY2tzCit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9pbml0X25lc3RlZF90YXNfbG9ja193aXRoX2NoZWNrcygga21wX3Rhc19sb2NrX3QgKiBsY2sgKQoreworICAgIF9fa21wX2luaXRfbmVzdGVkX3Rhc19sb2NrKCBsY2sgKTsKK30KKwordm9pZAorX19rbXBfZGVzdHJveV9uZXN0ZWRfdGFzX2xvY2soIGttcF90YXNfbG9ja190ICpsY2sgKQoreworICAgIF9fa21wX2Rlc3Ryb3lfdGFzX2xvY2soIGxjayApOworICAgIGxjay0+bGsuZGVwdGhfbG9ja2VkID0gMDsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2Rlc3Ryb3lfbmVzdGVkX3Rhc19sb2NrX3dpdGhfY2hlY2tzKCBrbXBfdGFzX2xvY2tfdCAqbGNrICkKK3sKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfZGVzdHJveV9uZXN0X2xvY2siOworICAgIGlmICggISBfX2ttcF9pc190YXNfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1NpbXBsZVVzZWRBc05lc3RhYmxlLCBmdW5jICk7CisgICAgfQorICAgIGlmICggX19rbXBfZ2V0X3Rhc19sb2NrX293bmVyKCBsY2sgKSAhPSAtMSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrU3RpbGxPd25lZCwgZnVuYyApOworICAgIH0KKyAgICBfX2ttcF9kZXN0cm95X25lc3RlZF90YXNfbG9jayggbGNrICk7Cit9CisKKworI2lmIEtNUF9PU19MSU5VWCAmJiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0gfHwgS01QX0FSQ0hfQUFSQ0g2NCkKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBmdXRleCBsb2NrcyAqLworCisvLyBmdXRleCBsb2NrcyBhcmUgcmVhbGx5IGp1c3QgdGVzdCBhbmQgc2V0IGxvY2tzLCB3aXRoIGEgZGlmZmVyZW50IG1ldGhvZAorLy8gb2YgaGFuZGxpbmcgY29udGVudGlvbi4gIFRoZXkgdGFrZSB0aGUgc2FtZSBhbW91bnQgb2Ygc3BhY2UgYXMgdGVzdCBhbmQKKy8vIHNldCBsb2NrcywgYW5kIGFyZSBhbGxvY2F0ZWQgdGhlIHNhbWUgd2F5IChpLmUuIHVzZSB0aGUgYXJlYSBhbGxvY2F0ZWQgYnkKKy8vIHRoZSBjb21waWxlciBmb3Igbm9uLW5lc3RlZCBsb2NrcyAvIGFsbG9jYXRlIG5lc3RlZCBsb2NrcyBvbiB0aGUgaGVhcCkuCisKK3N0YXRpYyBrbXBfaW50MzIKK19fa21wX2dldF9mdXRleF9sb2NrX293bmVyKCBrbXBfZnV0ZXhfbG9ja190ICpsY2sgKQoreworICAgIHJldHVybiAoIFRDUl80KCBsY2stPmxrLnBvbGwgKSA+PiAxICkgLSAxOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wKK19fa21wX2lzX2Z1dGV4X2xvY2tfbmVzdGFibGUoIGttcF9mdXRleF9sb2NrX3QgKmxjayApCit7CisgICAgcmV0dXJuIGxjay0+bGsuZGVwdGhfbG9ja2VkICE9IC0xOworfQorCitfX2ZvcmNlaW5saW5lIHN0YXRpYyB2b2lkCitfX2ttcF9hY3F1aXJlX2Z1dGV4X2xvY2tfdGltZWRfdGVtcGxhdGUoIGttcF9mdXRleF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGttcF9pbnQzMiBndGlkX2NvZGUgPSAoIGd0aWQgKyAxICkgPDwgMTsKKworICAgIEtNUF9NQigpOworCisjaWZkZWYgVVNFX0xPQ0tfUFJPRklMRQorICAgIGttcF91aW50MzIgY3VyciA9IFRDUl80KCBsY2stPmxrLnBvbGwgKTsKKyAgICBpZiAoICggY3VyciAhPSAwICkgJiYgKCBjdXJyICE9IGd0aWRfY29kZSApICkKKyAgICAgICAgX19rbXBfcHJpbnRmKCAiTE9DSyBDT05URU5USU9OOiAlcFxuIiwgbGNrICk7CisgICAgLyogZWxzZSBfX2ttcF9wcmludGYoICIuIiApOyovCisjZW5kaWYgLyogVVNFX0xPQ0tfUFJPRklMRSAqLworCisgICAgS01QX0ZTWU5DX1BSRVBBUkUoIGxjayApOworICAgIEtBX1RSQUNFKCAxMDAwLCAoIl9fa21wX2FjcXVpcmVfZnV0ZXhfbG9jazogbGNrOiVwKDB4JXgpLCBUIyVkIGVudGVyaW5nXG4iLAorICAgICAgbGNrLCBsY2stPmxrLnBvbGwsIGd0aWQgKSApOworCisgICAga21wX2ludDMyIHBvbGxfdmFsOworICAgIHdoaWxlICggKCBwb2xsX3ZhbCA9IEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRVQzMiggJiAoIGxjay0+bGsucG9sbCApLCAwLAorICAgICAgZ3RpZF9jb2RlICkgKSAhPSAwICkgeworICAgICAgICBrbXBfaW50MzIgY29uZCA9IHBvbGxfdmFsICYgMTsKKyAgICAgICAgS0FfVFJBQ0UoIDEwMDAsICgiX19rbXBfYWNxdWlyZV9mdXRleF9sb2NrOiBsY2s6JXAsIFQjJWQgcG9sbF92YWwgPSAweCV4IGNvbmQgPSAweCV4XG4iLAorICAgICAgICAgICBsY2ssIGd0aWQsIHBvbGxfdmFsLCBjb25kICkgKTsKKworICAgICAgICAvLworICAgICAgICAvLyBOT1RFOiBpZiB5b3UgdHJ5IHRvIHVzZSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbiBmb3IgdGhpcyBicmFuY2gKKyAgICAgICAgLy8KKyAgICAgICAgLy8gaWYgKCBwb2xsX3ZhbCAmIDEgPT0gMCApCisgICAgICAgIC8vCisgICAgICAgIC8vIFRoZW4gdGhlIDEyLjAgY29tcGlsZXIgaGFzIGEgYnVnIHdoZXJlIHRoZSBmb2xsb3dpbmcgYmxvY2sgd2lsbAorICAgICAgICAvLyBhbHdheXMgYmUgc2tpcHBlZCwgcmVnYXJkbGVzcyBvZiB0aGUgdmFsdWUgb2YgdGhlIExTQiBvZiBwb2xsX3ZhbC4KKyAgICAgICAgLy8KKyAgICAgICAgaWYgKCAhIGNvbmQgKSB7CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gVHJ5IHRvIHNldCB0aGUgbHNiIGluIHRoZSBwb2xsIHRvIGluZGljYXRlIHRvIHRoZSBvd25lcgorICAgICAgICAgICAgLy8gdGhyZWFkIHRoYXQgdGhleSBuZWVkIHRvIHdha2UgdGhpcyB0aHJlYWQgdXAuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgaWYgKCAhIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRUwzMiggJiAoIGxjay0+bGsucG9sbCApLAorICAgICAgICAgICAgICBwb2xsX3ZhbCwgcG9sbF92YWwgfCAxICkgKSB7CisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoIDEwMDAsICgiX19rbXBfYWNxdWlyZV9mdXRleF9sb2NrOiBsY2s6JXAoMHgleCksIFQjJWQgY2FuJ3Qgc2V0IGJpdCAwXG4iLAorICAgICAgICAgICAgICAgICAgbGNrLCBsY2stPmxrLnBvbGwsIGd0aWQgKSApOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcG9sbF92YWwgfD0gMTsKKworICAgICAgICAgICAgS0FfVFJBQ0UoIDEwMDAsICgiX19rbXBfYWNxdWlyZV9mdXRleF9sb2NrOiBsY2s6JXAoMHgleCksIFQjJWQgYml0IDAgc2V0XG4iLAorICAgICAgICAgICAgICBsY2ssIGxjay0+bGsucG9sbCwgZ3RpZCApICk7CisgICAgICAgIH0KKworICAgICAgICBLQV9UUkFDRSggMTAwMCwgKCJfX2ttcF9hY3F1aXJlX2Z1dGV4X2xvY2s6IGxjazolcCwgVCMlZCBiZWZvcmUgZnV0ZXhfd2FpdCgweCV4KVxuIiwKKyAgICAgICAgICAgbGNrLCBndGlkLCBwb2xsX3ZhbCApICk7CisKKyAgICAgICAga21wX2ludDMyIHJjOworICAgICAgICBpZiAoICggcmMgPSBzeXNjYWxsKCBfX05SX2Z1dGV4LCAmICggbGNrLT5say5wb2xsICksIEZVVEVYX1dBSVQsCisgICAgICAgICAgcG9sbF92YWwsIE5VTEwsIE5VTEwsIDAgKSApICE9IDAgKSB7CisgICAgICAgICAgICBLQV9UUkFDRSggMTAwMCwgKCJfX2ttcF9hY3F1aXJlX2Z1dGV4X2xvY2s6IGxjazolcCwgVCMlZCBmdXRleF93YWl0KDB4JXgpIGZhaWxlZCAocmM9JWQgZXJybm89JWQpXG4iLAorICAgICAgICAgICAgICAgbGNrLCBndGlkLCBwb2xsX3ZhbCwgcmMsIGVycm5vICkgKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgS0FfVFJBQ0UoIDEwMDAsICgiX19rbXBfYWNxdWlyZV9mdXRleF9sb2NrOiBsY2s6JXAsIFQjJWQgYWZ0ZXIgZnV0ZXhfd2FpdCgweCV4KVxuIiwKKyAgICAgICAgICAgbGNrLCBndGlkLCBwb2xsX3ZhbCApICk7CisgICAgICAgIC8vCisgICAgICAgIC8vIFRoaXMgdGhyZWFkIGhhcyBub3cgZG9uZSBhIHN1Y2Nlc3NmdWwgZnV0ZXggd2FpdCBjYWxsIGFuZCB3YXMKKyAgICAgICAgLy8gZW50ZXJlZCBvbiB0aGUgT1MgZnV0ZXggcXVldWUuICBXZSBtdXN0IG5vdyBwZXJmb3JtIGEgZnV0ZXgKKyAgICAgICAgLy8gd2FrZSBjYWxsIHdoZW4gcmVsZWFzaW5nIHRoZSBsb2NrLCBhcyB3ZSBoYXZlIG5vIGlkZWEgaG93IG1hbnkKKyAgICAgICAgLy8gb3RoZXIgdGhyZWFkcyBhcmUgaW4gdGhlIHF1ZXVlLgorICAgICAgICAvLworICAgICAgICBndGlkX2NvZGUgfD0gMTsKKyAgICB9CisKKyAgICBLTVBfRlNZTkNfQUNRVUlSRUQoIGxjayApOworICAgIEtBX1RSQUNFKCAxMDAwLCAoIl9fa21wX2FjcXVpcmVfZnV0ZXhfbG9jazogbGNrOiVwKDB4JXgpLCBUIyVkIGV4aXRpbmdcbiIsCisgICAgICBsY2ssIGxjay0+bGsucG9sbCwgZ3RpZCApICk7Cit9CisKK3ZvaWQKK19fa21wX2FjcXVpcmVfZnV0ZXhfbG9jaygga21wX2Z1dGV4X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgX19rbXBfYWNxdWlyZV9mdXRleF9sb2NrX3RpbWVkX3RlbXBsYXRlKCBsY2ssIGd0aWQgKTsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2FjcXVpcmVfZnV0ZXhfbG9ja193aXRoX2NoZWNrcygga21wX2Z1dGV4X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3NldF9sb2NrIjsKKyAgICBpZiAoICggc2l6ZW9mICgga21wX2Z1dGV4X2xvY2tfdCApIDw9IE9NUF9MT0NLX1RfU0laRSApCisgICAgICAmJiBfX2ttcF9pc19mdXRleF9sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrTmVzdGFibGVVc2VkQXNTaW1wbGUsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCAoIGd0aWQgPj0gMCApICYmICggX19rbXBfZ2V0X2Z1dGV4X2xvY2tfb3duZXIoIGxjayApID09IGd0aWQgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNBbHJlYWR5T3duZWQsIGZ1bmMgKTsKKyAgICB9CisgICAgX19rbXBfYWNxdWlyZV9mdXRleF9sb2NrKCBsY2ssIGd0aWQgKTsKK30KKworaW50CitfX2ttcF90ZXN0X2Z1dGV4X2xvY2soIGttcF9mdXRleF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGlmICggS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTMyKCAmICggbGNrLT5say5wb2xsICksIDAsICggZ3RpZCArIDEgKSA8PCAxICkgKSB7CisgICAgICAgIEtNUF9GU1lOQ19BQ1FVSVJFRCggbGNrICk7CisgICAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBpbnQKK19fa21wX3Rlc3RfZnV0ZXhfbG9ja193aXRoX2NoZWNrcygga21wX2Z1dGV4X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3Rlc3RfbG9jayI7CisgICAgaWYgKCAoIHNpemVvZiAoIGttcF9mdXRleF9sb2NrX3QgKSA8PSBPTVBfTE9DS19UX1NJWkUgKQorICAgICAgJiYgX19rbXBfaXNfZnV0ZXhfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja05lc3RhYmxlVXNlZEFzU2ltcGxlLCBmdW5jICk7CisgICAgfQorICAgIHJldHVybiBfX2ttcF90ZXN0X2Z1dGV4X2xvY2soIGxjaywgZ3RpZCApOworfQorCit2b2lkCitfX2ttcF9yZWxlYXNlX2Z1dGV4X2xvY2soIGttcF9mdXRleF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgS0FfVFJBQ0UoIDEwMDAsICgiX19rbXBfcmVsZWFzZV9mdXRleF9sb2NrOiBsY2s6JXAoMHgleCksIFQjJWQgZW50ZXJpbmdcbiIsCisgICAgICBsY2ssIGxjay0+bGsucG9sbCwgZ3RpZCApICk7CisKKyAgICBLTVBfRlNZTkNfUkVMRUFTSU5HKGxjayk7CisKKyAgICBrbXBfaW50MzIgcG9sbF92YWwgPSBLTVBfWENIR19GSVhFRDMyKCAmICggbGNrLT5say5wb2xsICksIDAgKTsKKworICAgIEtBX1RSQUNFKCAxMDAwLCAoIl9fa21wX3JlbGVhc2VfZnV0ZXhfbG9jazogbGNrOiVwLCBUIyVkIHJlbGVhc2VkIHBvbGxfdmFsID0gMHgleFxuIiwKKyAgICAgICBsY2ssIGd0aWQsIHBvbGxfdmFsICkgKTsKKworICAgIGlmICggcG9sbF92YWwgJiAxICkgeworICAgICAgICBLQV9UUkFDRSggMTAwMCwgKCJfX2ttcF9yZWxlYXNlX2Z1dGV4X2xvY2s6IGxjazolcCwgVCMlZCBmdXRleF93YWtlIDEgdGhyZWFkXG4iLAorICAgICAgICAgICBsY2ssIGd0aWQgKSApOworICAgICAgICBzeXNjYWxsKCBfX05SX2Z1dGV4LCAmICggbGNrLT5say5wb2xsICksIEZVVEVYX1dBS0UsIDEsIE5VTEwsIE5VTEwsIDAgKTsKKyAgICB9CisKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgIEtBX1RSQUNFKCAxMDAwLCAoIl9fa21wX3JlbGVhc2VfZnV0ZXhfbG9jazogbGNrOiVwKDB4JXgpLCBUIyVkIGV4aXRpbmdcbiIsCisgICAgICBsY2ssIGxjay0+bGsucG9sbCwgZ3RpZCApICk7CisKKyAgICBLTVBfWUlFTEQoIFRDUl80KCBfX2ttcF9udGggKSA+ICggX19rbXBfYXZhaWxfcHJvYyA/IF9fa21wX2F2YWlsX3Byb2MgOgorICAgICAgX19rbXBfeHByb2MgKSApOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfcmVsZWFzZV9mdXRleF9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfZnV0ZXhfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfdW5zZXRfbG9jayI7CisgICAgS01QX01CKCk7ICAvKiBpbiBjYXNlIGFub3RoZXIgcHJvY2Vzc29yIGluaXRpYWxpemVkIGxvY2sgKi8KKyAgICBpZiAoICggc2l6ZW9mICgga21wX2Z1dGV4X2xvY2tfdCApIDw9IE9NUF9MT0NLX1RfU0laRSApCisgICAgICAmJiBfX2ttcF9pc19mdXRleF9sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrTmVzdGFibGVVc2VkQXNTaW1wbGUsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9nZXRfZnV0ZXhfbG9ja19vd25lciggbGNrICkgPT0gLTEgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1Vuc2V0dGluZ0ZyZWUsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCAoIGd0aWQgPj0gMCApICYmICggX19rbXBfZ2V0X2Z1dGV4X2xvY2tfb3duZXIoIGxjayApID49IDAgKQorICAgICAgJiYgKCBfX2ttcF9nZXRfZnV0ZXhfbG9ja19vd25lciggbGNrICkgIT0gZ3RpZCApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tVbnNldHRpbmdTZXRCeUFub3RoZXIsIGZ1bmMgKTsKKyAgICB9CisgICAgX19rbXBfcmVsZWFzZV9mdXRleF9sb2NrKCBsY2ssIGd0aWQgKTsKK30KKwordm9pZAorX19rbXBfaW5pdF9mdXRleF9sb2NrKCBrbXBfZnV0ZXhfbG9ja190ICogbGNrICkKK3sKKyAgICBUQ1dfNCggbGNrLT5say5wb2xsLCAwICk7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9pbml0X2Z1dGV4X2xvY2tfd2l0aF9jaGVja3MoIGttcF9mdXRleF9sb2NrX3QgKiBsY2sgKQoreworICAgIF9fa21wX2luaXRfZnV0ZXhfbG9jayggbGNrICk7Cit9CisKK3ZvaWQKK19fa21wX2Rlc3Ryb3lfZnV0ZXhfbG9jaygga21wX2Z1dGV4X2xvY2tfdCAqbGNrICkKK3sKKyAgICBsY2stPmxrLnBvbGwgPSAwOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfZGVzdHJveV9mdXRleF9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfZnV0ZXhfbG9ja190ICpsY2sgKQoreworICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF9kZXN0cm95X2xvY2siOworICAgIGlmICggKCBzaXplb2YgKCBrbXBfZnV0ZXhfbG9ja190ICkgPD0gT01QX0xPQ0tfVF9TSVpFICkKKyAgICAgICYmIF9fa21wX2lzX2Z1dGV4X2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tOZXN0YWJsZVVzZWRBc1NpbXBsZSwgZnVuYyApOworICAgIH0KKyAgICBpZiAoIF9fa21wX2dldF9mdXRleF9sb2NrX293bmVyKCBsY2sgKSAhPSAtMSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrU3RpbGxPd25lZCwgZnVuYyApOworICAgIH0KKyAgICBfX2ttcF9kZXN0cm95X2Z1dGV4X2xvY2soIGxjayApOworfQorCisKKy8vCisvLyBuZXN0ZWQgZnV0ZXggbG9ja3MKKy8vCisKK3ZvaWQKK19fa21wX2FjcXVpcmVfbmVzdGVkX2Z1dGV4X2xvY2soIGttcF9mdXRleF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIGd0aWQgPj0gMCApOworCisgICAgaWYgKCBfX2ttcF9nZXRfZnV0ZXhfbG9ja19vd25lciggbGNrICkgPT0gZ3RpZCApIHsKKyAgICAgICAgbGNrLT5say5kZXB0aF9sb2NrZWQgKz0gMTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIF9fa21wX2FjcXVpcmVfZnV0ZXhfbG9ja190aW1lZF90ZW1wbGF0ZSggbGNrLCBndGlkICk7CisgICAgICAgIGxjay0+bGsuZGVwdGhfbG9ja2VkID0gMTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9hY3F1aXJlX25lc3RlZF9mdXRleF9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfZnV0ZXhfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfc2V0X25lc3RfbG9jayI7CisgICAgaWYgKCAhIF9fa21wX2lzX2Z1dGV4X2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tTaW1wbGVVc2VkQXNOZXN0YWJsZSwgZnVuYyApOworICAgIH0KKyAgICBfX2ttcF9hY3F1aXJlX25lc3RlZF9mdXRleF9sb2NrKCBsY2ssIGd0aWQgKTsKK30KKworaW50CitfX2ttcF90ZXN0X25lc3RlZF9mdXRleF9sb2NrKCBrbXBfZnV0ZXhfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBpbnQgcmV0dmFsOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggZ3RpZCA+PSAwICk7CisKKyAgICBpZiAoIF9fa21wX2dldF9mdXRleF9sb2NrX293bmVyKCBsY2sgKSA9PSBndGlkICkgeworICAgICAgICByZXR2YWwgPSArK2xjay0+bGsuZGVwdGhfbG9ja2VkOworICAgIH0KKyAgICBlbHNlIGlmICggIV9fa21wX3Rlc3RfZnV0ZXhfbG9jayggbGNrLCBndGlkICkgKSB7CisgICAgICAgIHJldHZhbCA9IDA7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBLTVBfTUIoKTsKKyAgICAgICAgcmV0dmFsID0gbGNrLT5say5kZXB0aF9sb2NrZWQgPSAxOworICAgIH0KKyAgICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50CitfX2ttcF90ZXN0X25lc3RlZF9mdXRleF9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfZnV0ZXhfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfdGVzdF9uZXN0X2xvY2siOworICAgIGlmICggISBfX2ttcF9pc19mdXRleF9sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrU2ltcGxlVXNlZEFzTmVzdGFibGUsIGZ1bmMgKTsKKyAgICB9CisgICAgcmV0dXJuIF9fa21wX3Rlc3RfbmVzdGVkX2Z1dGV4X2xvY2soIGxjaywgZ3RpZCApOworfQorCit2b2lkCitfX2ttcF9yZWxlYXNlX25lc3RlZF9mdXRleF9sb2NrKCBrbXBfZnV0ZXhfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBndGlkID49IDAgKTsKKworICAgIEtNUF9NQigpOworICAgIGlmICggLS0obGNrLT5say5kZXB0aF9sb2NrZWQpID09IDAgKSB7CisgICAgICAgIF9fa21wX3JlbGVhc2VfZnV0ZXhfbG9jayggbGNrLCBndGlkICk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorX19rbXBfcmVsZWFzZV9uZXN0ZWRfZnV0ZXhfbG9ja193aXRoX2NoZWNrcygga21wX2Z1dGV4X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3Vuc2V0X25lc3RfbG9jayI7CisgICAgS01QX01CKCk7ICAvKiBpbiBjYXNlIGFub3RoZXIgcHJvY2Vzc29yIGluaXRpYWxpemVkIGxvY2sgKi8KKyAgICBpZiAoICEgX19rbXBfaXNfZnV0ZXhfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1NpbXBsZVVzZWRBc05lc3RhYmxlLCBmdW5jICk7CisgICAgfQorICAgIGlmICggX19rbXBfZ2V0X2Z1dGV4X2xvY2tfb3duZXIoIGxjayApID09IC0xICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tVbnNldHRpbmdGcmVlLCBmdW5jICk7CisgICAgfQorICAgIGlmICggX19rbXBfZ2V0X2Z1dGV4X2xvY2tfb3duZXIoIGxjayApICE9IGd0aWQgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1Vuc2V0dGluZ1NldEJ5QW5vdGhlciwgZnVuYyApOworICAgIH0KKyAgICBfX2ttcF9yZWxlYXNlX25lc3RlZF9mdXRleF9sb2NrKCBsY2ssIGd0aWQgKTsKK30KKwordm9pZAorX19rbXBfaW5pdF9uZXN0ZWRfZnV0ZXhfbG9jaygga21wX2Z1dGV4X2xvY2tfdCAqIGxjayApCit7CisgICAgX19rbXBfaW5pdF9mdXRleF9sb2NrKCBsY2sgKTsKKyAgICBsY2stPmxrLmRlcHRoX2xvY2tlZCA9IDA7IC8vID49IDAgZm9yIG5lc3RhYmxlIGxvY2tzLCAtMSBmb3Igc2ltcGxlIGxvY2tzCit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9pbml0X25lc3RlZF9mdXRleF9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfZnV0ZXhfbG9ja190ICogbGNrICkKK3sKKyAgICBfX2ttcF9pbml0X25lc3RlZF9mdXRleF9sb2NrKCBsY2sgKTsKK30KKwordm9pZAorX19rbXBfZGVzdHJveV9uZXN0ZWRfZnV0ZXhfbG9jaygga21wX2Z1dGV4X2xvY2tfdCAqbGNrICkKK3sKKyAgICBfX2ttcF9kZXN0cm95X2Z1dGV4X2xvY2soIGxjayApOworICAgIGxjay0+bGsuZGVwdGhfbG9ja2VkID0gMDsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2Rlc3Ryb3lfbmVzdGVkX2Z1dGV4X2xvY2tfd2l0aF9jaGVja3MoIGttcF9mdXRleF9sb2NrX3QgKmxjayApCit7CisgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX2Rlc3Ryb3lfbmVzdF9sb2NrIjsKKyAgICBpZiAoICEgX19rbXBfaXNfZnV0ZXhfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1NpbXBsZVVzZWRBc05lc3RhYmxlLCBmdW5jICk7CisgICAgfQorICAgIGlmICggX19rbXBfZ2V0X2Z1dGV4X2xvY2tfb3duZXIoIGxjayApICE9IC0xICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tTdGlsbE93bmVkLCBmdW5jICk7CisgICAgfQorICAgIF9fa21wX2Rlc3Ryb3lfbmVzdGVkX2Z1dGV4X2xvY2soIGxjayApOworfQorCisjZW5kaWYgLy8gS01QX09TX0xJTlVYICYmIChLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSkKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIHRpY2tldCAoYmFrZXJ5KSBsb2NrcyAqLworCitzdGF0aWMga21wX2ludDMyCitfX2ttcF9nZXRfdGlja2V0X2xvY2tfb3duZXIoIGttcF90aWNrZXRfbG9ja190ICpsY2sgKQoreworICAgIHJldHVybiBUQ1JfNCggbGNrLT5say5vd25lcl9pZCApIC0gMTsKK30KKworc3RhdGljIGlubGluZSBib29sCitfX2ttcF9pc190aWNrZXRfbG9ja19uZXN0YWJsZSgga21wX3RpY2tldF9sb2NrX3QgKmxjayApCit7CisgICAgcmV0dXJuIGxjay0+bGsuZGVwdGhfbG9ja2VkICE9IC0xOworfQorCitzdGF0aWMga21wX3VpbnQzMgorX19rbXBfYmFrZXJ5X2NoZWNrKGttcF91aW50IHZhbHVlLCBrbXBfdWludCBjaGVja2VyKQoreworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgcGF1c2U7CisKKyAgICBpZiAodmFsdWUgPT0gY2hlY2tlcikgeworICAgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgICAgZm9yIChwYXVzZSA9IGNoZWNrZXIgLSB2YWx1ZTsgcGF1c2UgIT0gMDsgLS1wYXVzZSk7CisgICAgcmV0dXJuIEZBTFNFOworfQorCitfX2ZvcmNlaW5saW5lIHN0YXRpYyB2b2lkCitfX2ttcF9hY3F1aXJlX3RpY2tldF9sb2NrX3RpbWVkX3RlbXBsYXRlKCBrbXBfdGlja2V0X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAga21wX3VpbnQzMiBteV90aWNrZXQ7CisgICAgS01QX01CKCk7CisKKyAgICBteV90aWNrZXQgPSBLTVBfVEVTVF9USEVOX0lOQzMyKCAoa21wX2ludDMyICopICZsY2stPmxrLm5leHRfdGlja2V0ICk7CisKKyNpZmRlZiBVU0VfTE9DS19QUk9GSUxFCisgICAgaWYgKCBUQ1JfNCggbGNrLT5say5ub3dfc2VydmluZyApICE9IG15X3RpY2tldCApCisgICAgICAgIF9fa21wX3ByaW50ZiggIkxPQ0sgQ09OVEVOVElPTjogJXBcbiIsIGxjayApOworICAgIC8qIGVsc2UgX19rbXBfcHJpbnRmKCAiLiIgKTsqLworI2VuZGlmIC8qIFVTRV9MT0NLX1BST0ZJTEUgKi8KKworICAgIGlmICggVENSXzQoIGxjay0+bGsubm93X3NlcnZpbmcgKSA9PSBteV90aWNrZXQgKSB7CisgICAgICAgIEtNUF9GU1lOQ19BQ1FVSVJFRChsY2spOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEtNUF9XQUlUX1lJRUxEKCAmbGNrLT5say5ub3dfc2VydmluZywgbXlfdGlja2V0LCBfX2ttcF9iYWtlcnlfY2hlY2ssIGxjayApOworICAgIEtNUF9GU1lOQ19BQ1FVSVJFRChsY2spOworfQorCit2b2lkCitfX2ttcF9hY3F1aXJlX3RpY2tldF9sb2NrKCBrbXBfdGlja2V0X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgX19rbXBfYWNxdWlyZV90aWNrZXRfbG9ja190aW1lZF90ZW1wbGF0ZSggbGNrLCBndGlkICk7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9hY3F1aXJlX3RpY2tldF9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfdGlja2V0X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3NldF9sb2NrIjsKKyAgICBpZiAoIGxjay0+bGsuaW5pdGlhbGl6ZWQgIT0gbGNrICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9pc190aWNrZXRfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja05lc3RhYmxlVXNlZEFzU2ltcGxlLCBmdW5jICk7CisgICAgfQorICAgIGlmICggKCBndGlkID49IDAgKSAmJiAoIF9fa21wX2dldF90aWNrZXRfbG9ja19vd25lciggbGNrICkgPT0gZ3RpZCApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tJc0FscmVhZHlPd25lZCwgZnVuYyApOworICAgIH0KKworICAgIF9fa21wX2FjcXVpcmVfdGlja2V0X2xvY2soIGxjaywgZ3RpZCApOworCisgICAgbGNrLT5say5vd25lcl9pZCA9IGd0aWQgKyAxOworfQorCitpbnQKK19fa21wX3Rlc3RfdGlja2V0X2xvY2soIGttcF90aWNrZXRfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBrbXBfdWludDMyIG15X3RpY2tldCA9IFRDUl80KCBsY2stPmxrLm5leHRfdGlja2V0ICk7CisgICAgaWYgKCBUQ1JfNCggbGNrLT5say5ub3dfc2VydmluZyApID09IG15X3RpY2tldCApIHsKKyAgICAgICAga21wX3VpbnQzMiBuZXh0X3RpY2tldCA9IG15X3RpY2tldCArIDE7CisgICAgICAgIGlmICggS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTMyKCAoa21wX2ludDMyICopICZsY2stPmxrLm5leHRfdGlja2V0LAorICAgICAgICAgIG15X3RpY2tldCwgbmV4dF90aWNrZXQgKSApIHsKKyAgICAgICAgICAgIEtNUF9GU1lOQ19BQ1FVSVJFRCggbGNrICk7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBpbnQKK19fa21wX3Rlc3RfdGlja2V0X2xvY2tfd2l0aF9jaGVja3MoIGttcF90aWNrZXRfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfdGVzdF9sb2NrIjsKKyAgICBpZiAoIGxjay0+bGsuaW5pdGlhbGl6ZWQgIT0gbGNrICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9pc190aWNrZXRfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja05lc3RhYmxlVXNlZEFzU2ltcGxlLCBmdW5jICk7CisgICAgfQorCisgICAgaW50IHJldHZhbCA9IF9fa21wX3Rlc3RfdGlja2V0X2xvY2soIGxjaywgZ3RpZCApOworCisgICAgaWYgKCByZXR2YWwgKSB7CisgICAgICAgIGxjay0+bGsub3duZXJfaWQgPSBndGlkICsgMTsKKyAgICB9CisgICAgcmV0dXJuIHJldHZhbDsKK30KKwordm9pZAorX19rbXBfcmVsZWFzZV90aWNrZXRfbG9jaygga21wX3RpY2tldF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGttcF91aW50MzIgIGRpc3RhbmNlOworCisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICBLTVBfRlNZTkNfUkVMRUFTSU5HKGxjayk7CisgICAgZGlzdGFuY2UgPSAoIFRDUl80KCBsY2stPmxrLm5leHRfdGlja2V0ICkgLSBUQ1JfNCggbGNrLT5say5ub3dfc2VydmluZyApICk7CisKKyAgICBLTVBfU1RfUkVMMzIoICYobGNrLT5say5ub3dfc2VydmluZyksIGxjay0+bGsubm93X3NlcnZpbmcgKyAxICk7CisKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgIEtNUF9ZSUVMRCggZGlzdGFuY2UKKyAgICAgID4gKGttcF91aW50MzIpIChfX2ttcF9hdmFpbF9wcm9jID8gX19rbXBfYXZhaWxfcHJvYyA6IF9fa21wX3hwcm9jKSApOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfcmVsZWFzZV90aWNrZXRfbG9ja193aXRoX2NoZWNrcygga21wX3RpY2tldF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF91bnNldF9sb2NrIjsKKyAgICBLTVBfTUIoKTsgIC8qIGluIGNhc2UgYW5vdGhlciBwcm9jZXNzb3IgaW5pdGlhbGl6ZWQgbG9jayAqLworICAgIGlmICggbGNrLT5say5pbml0aWFsaXplZCAhPSBsY2sgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgIH0KKyAgICBpZiAoIF9fa21wX2lzX3RpY2tldF9sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrTmVzdGFibGVVc2VkQXNTaW1wbGUsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9nZXRfdGlja2V0X2xvY2tfb3duZXIoIGxjayApID09IC0xICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tVbnNldHRpbmdGcmVlLCBmdW5jICk7CisgICAgfQorICAgIGlmICggKCBndGlkID49IDAgKSAmJiAoIF9fa21wX2dldF90aWNrZXRfbG9ja19vd25lciggbGNrICkgPj0gMCApCisgICAgICAmJiAoIF9fa21wX2dldF90aWNrZXRfbG9ja19vd25lciggbGNrICkgIT0gZ3RpZCApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tVbnNldHRpbmdTZXRCeUFub3RoZXIsIGZ1bmMgKTsKKyAgICB9CisgICAgbGNrLT5say5vd25lcl9pZCA9IDA7CisgICAgX19rbXBfcmVsZWFzZV90aWNrZXRfbG9jayggbGNrLCBndGlkICk7Cit9CisKK3ZvaWQKK19fa21wX2luaXRfdGlja2V0X2xvY2soIGttcF90aWNrZXRfbG9ja190ICogbGNrICkKK3sKKyAgICBsY2stPmxrLmxvY2F0aW9uID0gTlVMTDsKKyAgICBUQ1dfNCggbGNrLT5say5uZXh0X3RpY2tldCwgMCApOworICAgIFRDV180KCBsY2stPmxrLm5vd19zZXJ2aW5nLCAwICk7CisgICAgbGNrLT5say5vd25lcl9pZCA9IDA7ICAgICAgLy8gbm8gdGhyZWFkIG93bnMgdGhlIGxvY2suCisgICAgbGNrLT5say5kZXB0aF9sb2NrZWQgPSAtMTsgLy8gLTEgPT4gbm90IGEgbmVzdGVkIGxvY2suCisgICAgbGNrLT5say5pbml0aWFsaXplZCA9IChrbXBfdGlja2V0X2xvY2sgKilsY2s7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9pbml0X3RpY2tldF9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfdGlja2V0X2xvY2tfdCAqIGxjayApCit7CisgICAgX19rbXBfaW5pdF90aWNrZXRfbG9jayggbGNrICk7Cit9CisKK3ZvaWQKK19fa21wX2Rlc3Ryb3lfdGlja2V0X2xvY2soIGttcF90aWNrZXRfbG9ja190ICpsY2sgKQoreworICAgIGxjay0+bGsuaW5pdGlhbGl6ZWQgPSBOVUxMOworICAgIGxjay0+bGsubG9jYXRpb24gICAgPSBOVUxMOworICAgIGxjay0+bGsubmV4dF90aWNrZXQgPSAwOworICAgIGxjay0+bGsubm93X3NlcnZpbmcgPSAwOworICAgIGxjay0+bGsub3duZXJfaWQgPSAwOworICAgIGxjay0+bGsuZGVwdGhfbG9ja2VkID0gLTE7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9kZXN0cm95X3RpY2tldF9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfdGlja2V0X2xvY2tfdCAqbGNrICkKK3sKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfZGVzdHJveV9sb2NrIjsKKyAgICBpZiAoIGxjay0+bGsuaW5pdGlhbGl6ZWQgIT0gbGNrICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9pc190aWNrZXRfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja05lc3RhYmxlVXNlZEFzU2ltcGxlLCBmdW5jICk7CisgICAgfQorICAgIGlmICggX19rbXBfZ2V0X3RpY2tldF9sb2NrX293bmVyKCBsY2sgKSAhPSAtMSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrU3RpbGxPd25lZCwgZnVuYyApOworICAgIH0KKyAgICBfX2ttcF9kZXN0cm95X3RpY2tldF9sb2NrKCBsY2sgKTsKK30KKworCisvLworLy8gbmVzdGVkIHRpY2tldCBsb2NrcworLy8KKwordm9pZAorX19rbXBfYWNxdWlyZV9uZXN0ZWRfdGlja2V0X2xvY2soIGttcF90aWNrZXRfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBndGlkID49IDAgKTsKKworICAgIGlmICggX19rbXBfZ2V0X3RpY2tldF9sb2NrX293bmVyKCBsY2sgKSA9PSBndGlkICkgeworICAgICAgICBsY2stPmxrLmRlcHRoX2xvY2tlZCArPSAxOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgX19rbXBfYWNxdWlyZV90aWNrZXRfbG9ja190aW1lZF90ZW1wbGF0ZSggbGNrLCBndGlkICk7CisgICAgICAgIEtNUF9NQigpOworICAgICAgICBsY2stPmxrLmRlcHRoX2xvY2tlZCA9IDE7CisgICAgICAgIEtNUF9NQigpOworICAgICAgICBsY2stPmxrLm93bmVyX2lkID0gZ3RpZCArIDE7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorX19rbXBfYWNxdWlyZV9uZXN0ZWRfdGlja2V0X2xvY2tfd2l0aF9jaGVja3MoIGttcF90aWNrZXRfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfc2V0X25lc3RfbG9jayI7CisgICAgaWYgKCBsY2stPmxrLmluaXRpYWxpemVkICE9IGxjayApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jICk7CisgICAgfQorICAgIGlmICggISBfX2ttcF9pc190aWNrZXRfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1NpbXBsZVVzZWRBc05lc3RhYmxlLCBmdW5jICk7CisgICAgfQorICAgIF9fa21wX2FjcXVpcmVfbmVzdGVkX3RpY2tldF9sb2NrKCBsY2ssIGd0aWQgKTsKK30KKworaW50CitfX2ttcF90ZXN0X25lc3RlZF90aWNrZXRfbG9jaygga21wX3RpY2tldF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGludCByZXR2YWw7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBndGlkID49IDAgKTsKKworICAgIGlmICggX19rbXBfZ2V0X3RpY2tldF9sb2NrX293bmVyKCBsY2sgKSA9PSBndGlkICkgeworICAgICAgICByZXR2YWwgPSArK2xjay0+bGsuZGVwdGhfbG9ja2VkOworICAgIH0KKyAgICBlbHNlIGlmICggIV9fa21wX3Rlc3RfdGlja2V0X2xvY2soIGxjaywgZ3RpZCApICkgeworICAgICAgICByZXR2YWwgPSAwOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgS01QX01CKCk7CisgICAgICAgIHJldHZhbCA9IGxjay0+bGsuZGVwdGhfbG9ja2VkID0gMTsKKyAgICAgICAgS01QX01CKCk7CisgICAgICAgIGxjay0+bGsub3duZXJfaWQgPSBndGlkICsgMTsKKyAgICB9CisgICAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludAorX19rbXBfdGVzdF9uZXN0ZWRfdGlja2V0X2xvY2tfd2l0aF9jaGVja3MoIGttcF90aWNrZXRfbG9ja190ICpsY2ssCisgIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfdGVzdF9uZXN0X2xvY2siOworICAgIGlmICggbGNrLT5say5pbml0aWFsaXplZCAhPSBsY2sgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgIH0KKyAgICBpZiAoICEgX19rbXBfaXNfdGlja2V0X2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tTaW1wbGVVc2VkQXNOZXN0YWJsZSwgZnVuYyApOworICAgIH0KKyAgICByZXR1cm4gX19rbXBfdGVzdF9uZXN0ZWRfdGlja2V0X2xvY2soIGxjaywgZ3RpZCApOworfQorCit2b2lkCitfX2ttcF9yZWxlYXNlX25lc3RlZF90aWNrZXRfbG9jaygga21wX3RpY2tldF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIGd0aWQgPj0gMCApOworCisgICAgS01QX01CKCk7CisgICAgaWYgKCAtLShsY2stPmxrLmRlcHRoX2xvY2tlZCkgPT0gMCApIHsKKyAgICAgICAgS01QX01CKCk7CisgICAgICAgIGxjay0+bGsub3duZXJfaWQgPSAwOworICAgICAgICBfX2ttcF9yZWxlYXNlX3RpY2tldF9sb2NrKCBsY2ssIGd0aWQgKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9yZWxlYXNlX25lc3RlZF90aWNrZXRfbG9ja193aXRoX2NoZWNrcygga21wX3RpY2tldF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF91bnNldF9uZXN0X2xvY2siOworICAgIEtNUF9NQigpOyAgLyogaW4gY2FzZSBhbm90aGVyIHByb2Nlc3NvciBpbml0aWFsaXplZCBsb2NrICovCisgICAgaWYgKCBsY2stPmxrLmluaXRpYWxpemVkICE9IGxjayApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jICk7CisgICAgfQorICAgIGlmICggISBfX2ttcF9pc190aWNrZXRfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1NpbXBsZVVzZWRBc05lc3RhYmxlLCBmdW5jICk7CisgICAgfQorICAgIGlmICggX19rbXBfZ2V0X3RpY2tldF9sb2NrX293bmVyKCBsY2sgKSA9PSAtMSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrVW5zZXR0aW5nRnJlZSwgZnVuYyApOworICAgIH0KKyAgICBpZiAoIF9fa21wX2dldF90aWNrZXRfbG9ja19vd25lciggbGNrICkgIT0gZ3RpZCApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrVW5zZXR0aW5nU2V0QnlBbm90aGVyLCBmdW5jICk7CisgICAgfQorICAgIF9fa21wX3JlbGVhc2VfbmVzdGVkX3RpY2tldF9sb2NrKCBsY2ssIGd0aWQgKTsKK30KKwordm9pZAorX19rbXBfaW5pdF9uZXN0ZWRfdGlja2V0X2xvY2soIGttcF90aWNrZXRfbG9ja190ICogbGNrICkKK3sKKyAgICBfX2ttcF9pbml0X3RpY2tldF9sb2NrKCBsY2sgKTsKKyAgICBsY2stPmxrLmRlcHRoX2xvY2tlZCA9IDA7IC8vID49IDAgZm9yIG5lc3RhYmxlIGxvY2tzLCAtMSBmb3Igc2ltcGxlIGxvY2tzCit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9pbml0X25lc3RlZF90aWNrZXRfbG9ja193aXRoX2NoZWNrcygga21wX3RpY2tldF9sb2NrX3QgKiBsY2sgKQoreworICAgIF9fa21wX2luaXRfbmVzdGVkX3RpY2tldF9sb2NrKCBsY2sgKTsKK30KKwordm9pZAorX19rbXBfZGVzdHJveV9uZXN0ZWRfdGlja2V0X2xvY2soIGttcF90aWNrZXRfbG9ja190ICpsY2sgKQoreworICAgIF9fa21wX2Rlc3Ryb3lfdGlja2V0X2xvY2soIGxjayApOworICAgIGxjay0+bGsuZGVwdGhfbG9ja2VkID0gMDsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2Rlc3Ryb3lfbmVzdGVkX3RpY2tldF9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfdGlja2V0X2xvY2tfdCAqbGNrICkKK3sKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfZGVzdHJveV9uZXN0X2xvY2siOworICAgIGlmICggbGNrLT5say5pbml0aWFsaXplZCAhPSBsY2sgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgIH0KKyAgICBpZiAoICEgX19rbXBfaXNfdGlja2V0X2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tTaW1wbGVVc2VkQXNOZXN0YWJsZSwgZnVuYyApOworICAgIH0KKyAgICBpZiAoIF9fa21wX2dldF90aWNrZXRfbG9ja19vd25lciggbGNrICkgIT0gLTEgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1N0aWxsT3duZWQsIGZ1bmMgKTsKKyAgICB9CisgICAgX19rbXBfZGVzdHJveV9uZXN0ZWRfdGlja2V0X2xvY2soIGxjayApOworfQorCisKKy8vCisvLyBhY2Nlc3MgZnVuY3Rpb25zIHRvIGZpZWxkcyB3aGljaCBkb24ndCBleGlzdCBmb3IgYWxsIGxvY2sga2luZHMuCisvLworCitzdGF0aWMgaW50CitfX2ttcF9pc190aWNrZXRfbG9ja19pbml0aWFsaXplZCgga21wX3RpY2tldF9sb2NrX3QgKmxjayApCit7CisgICAgcmV0dXJuIGxjayA9PSBsY2stPmxrLmluaXRpYWxpemVkOworfQorCitzdGF0aWMgY29uc3QgaWRlbnRfdCAqCitfX2ttcF9nZXRfdGlja2V0X2xvY2tfbG9jYXRpb24oIGttcF90aWNrZXRfbG9ja190ICpsY2sgKQoreworICAgIHJldHVybiBsY2stPmxrLmxvY2F0aW9uOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfc2V0X3RpY2tldF9sb2NrX2xvY2F0aW9uKCBrbXBfdGlja2V0X2xvY2tfdCAqbGNrLCBjb25zdCBpZGVudF90ICpsb2MgKQoreworICAgIGxjay0+bGsubG9jYXRpb24gPSBsb2M7Cit9CisKK3N0YXRpYyBrbXBfbG9ja19mbGFnc190CitfX2ttcF9nZXRfdGlja2V0X2xvY2tfZmxhZ3MoIGttcF90aWNrZXRfbG9ja190ICpsY2sgKQoreworICAgIHJldHVybiBsY2stPmxrLmZsYWdzOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfc2V0X3RpY2tldF9sb2NrX2ZsYWdzKCBrbXBfdGlja2V0X2xvY2tfdCAqbGNrLCBrbXBfbG9ja19mbGFnc190IGZsYWdzICkKK3sKKyAgICBsY2stPmxrLmZsYWdzID0gZmxhZ3M7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogcXVldWluZyBsb2NrcyAqLworCisvKgorICogRmlyc3QgdGhlIHN0YXRlcworICogKGhlYWQsdGFpbCkgPSAgMCwgMCAgbWVhbnMgbG9jayBpcyB1bmhlbGQsIG5vYm9keSBvbiBxdWV1ZQorICogICBVSU5UX01BWCBvciAtMSwgMCAgbWVhbnMgbG9jayBpcyBoZWxkLCBub2JvZHkgb24gcXVldWUKKyAqICAgICAgICAgICAgICAgIGgsIGggIG1lYW5zIGxvY2sgaXMgaGVsZCBvciBhYm91dCB0byB0cmFuc2l0aW9uLCAxIGVsZW1lbnQgb24gcXVldWUKKyAqICAgICAgICAgICAgICAgIGgsIHQgIGggPD4gdCwgbWVhbnMgbG9jayBpcyBoZWxkIG9yIGFib3V0IHRvIHRyYW5zaXRpb24sID4xIGVsZW1lbnRzIG9uIHF1ZXVlCisgKgorICogTm93IHRoZSB0cmFuc2l0aW9ucworICogICAgQWNxdWlyZSgwLDApICA9IC0xICwwCisgKiAgICBSZWxlYXNlKDAsMCkgID0gRXJyb3IKKyAqICAgIEFjcXVpcmUoLTEsMCkgPSAgaCAsaCAgICBoID4gMAorICogICAgUmVsZWFzZSgtMSwwKSA9ICAwICwwCisgKiAgICBBY3F1aXJlKGgsaCkgID0gIGggLHQgICAgaCA+IDAsIHQgPiAwLCBoIDw+IHQKKyAqICAgIFJlbGVhc2UoaCxoKSAgPSAtMSAsMCAgICBoID4gMAorICogICAgQWNxdWlyZShoLHQpICA9ICBoICx0JyAgIGggPiAwLCB0ID4gMCwgdCcgPiAwLCBoIDw+IHQsIGggPD4gdCcsIHQgPD4gdCcKKyAqICAgIFJlbGVhc2UoaCx0KSAgPSAgaCcsdCAgICBoID4gMCwgdCA+IDAsIGggPD4gdCwgaCA8PiBoJywgaCcgbWF5YmUgPSB0CisgKgorICogQW5kIHBpY3RvcmlhbGx5CisgKgorICoKKyAqICAgICAgICAgICstLS0tLSsKKyAqICAgICAgICAgIHwgMCwgMHwtLS0tLS0tIHJlbGVhc2UgLS0tLS0tLT4gRXJyb3IKKyAqICAgICAgICAgICstLS0tLSsKKyAqICAgICAgICAgICAgfCAgXgorICogICAgIGFjcXVpcmV8ICB8cmVsZWFzZQorICogICAgICAgICAgICB8ICB8CisgKiAgICAgICAgICAgIHwgIHwKKyAqICAgICAgICAgICAgdiAgfAorICogICAgICAgICAgKy0tLS0tKworICogICAgICAgICAgfC0xLCAwfAorICogICAgICAgICAgKy0tLS0tKworICogICAgICAgICAgICB8ICBeCisgKiAgICAgYWNxdWlyZXwgIHxyZWxlYXNlCisgKiAgICAgICAgICAgIHwgIHwKKyAqICAgICAgICAgICAgfCAgfAorICogICAgICAgICAgICB2ICB8CisgKiAgICAgICAgICArLS0tLS0rCisgKiAgICAgICAgICB8IGgsIGh8CisgKiAgICAgICAgICArLS0tLS0rCisgKiAgICAgICAgICAgIHwgIF4KKyAqICAgICBhY3F1aXJlfCAgfHJlbGVhc2UKKyAqICAgICAgICAgICAgfCAgfAorICogICAgICAgICAgICB8ICB8CisgKiAgICAgICAgICAgIHYgIHwKKyAqICAgICAgICAgICstLS0tLSsKKyAqICAgICAgICAgIHwgaCwgdHwtLS0tLSBhY3F1aXJlLCByZWxlYXNlIGxvb3BiYWNrIC0tLSsKKyAqICAgICAgICAgICstLS0tLSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgICAgICAgICAgICAgXiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqCisgKi8KKworI2lmZGVmIERFQlVHX1FVRVVJTkdfTE9DS1MKKworLyogU3R1ZmYgZm9yIGNpcmN1bGFyIHRyYWNlIGJ1ZmZlciAqLworI2RlZmluZSBUUkFDRV9CVUZfRUxFCTEwMjQKK3N0YXRpYyBjaGFyIHRyYWNlc1tUUkFDRV9CVUZfRUxFXVsxMjhdID0geyAwIH0KK3N0YXRpYyBpbnQgdGMgPSAwOworI2RlZmluZSBUUkFDRV9MT0NLKFgsWSkgICAgICAgICAgc3ByaW50ZiggdHJhY2VzW3RjKysgJSBUUkFDRV9CVUZfRUxFXSwgInQlZCBhdCAlc1xuIiwgWCwgWSApOworI2RlZmluZSBUUkFDRV9MT0NLX1QoWCxZLFopICAgICAgc3ByaW50ZiggdHJhY2VzW3RjKysgJSBUUkFDRV9CVUZfRUxFXSwgInQlZCBhdCAlcyVkXG4iLCBYLFksWiApOworI2RlZmluZSBUUkFDRV9MT0NLX0hUKFgsWSxaLFEpICAgc3ByaW50ZiggdHJhY2VzW3RjKysgJSBUUkFDRV9CVUZfRUxFXSwgInQlZCBhdCAlcyAlZCwlZFxuIiwgWCwgWSwgWiwgUSApOworCitzdGF0aWMgdm9pZAorX19rbXBfZHVtcF9xdWV1aW5nX2xvY2soIGttcF9pbmZvX3QgKnRoaXNfdGhyLCBrbXBfaW50MzIgZ3RpZCwKKyAga21wX3F1ZXVpbmdfbG9ja190ICpsY2ssIGttcF9pbnQzMiBoZWFkX2lkLCBrbXBfaW50MzIgdGFpbF9pZCApCit7CisgICAga21wX2ludDMyIHQsIGk7CisKKyAgICBfX2ttcF9wcmludGZfbm9fbG9jayggIlxuX19rbXBfZHVtcF9xdWV1aW5nX2xvY2s6IFRSQUNFIEJFR0lOUyBIRVJFISBcbiIgKTsKKworICAgIGkgPSB0YyAlIFRSQUNFX0JVRl9FTEU7CisgICAgX19rbXBfcHJpbnRmX25vX2xvY2soICIlc1xuIiwgdHJhY2VzW2ldICk7CisgICAgaSA9IChpKzEpICUgVFJBQ0VfQlVGX0VMRTsKKyAgICB3aGlsZSAoIGkgIT0gKHRjICUgVFJBQ0VfQlVGX0VMRSkgKSB7CisgICAgICAgIF9fa21wX3ByaW50Zl9ub19sb2NrKCAiJXMiLCB0cmFjZXNbaV0gKTsKKyAgICAgICAgaSA9IChpKzEpICUgVFJBQ0VfQlVGX0VMRTsKKyAgICB9CisgICAgX19rbXBfcHJpbnRmX25vX2xvY2soICJcbiIgKTsKKworICAgIF9fa21wX3ByaW50Zl9ub19sb2NrKAorICAgICAgICAgICAgICJcbl9fa21wX2R1bXBfcXVldWluZ19sb2NrOiBndGlkKzE6JWQsIHNwaW5faGVyZTolZCwgbmV4dF93YWl0OiVkLCBoZWFkX2lkOiVkLCB0YWlsX2lkOiVkXG4iLAorICAgICAgICAgICAgIGd0aWQrMSwgdGhpc190aHItPnRoLnRoX3NwaW5faGVyZSwgdGhpc190aHItPnRoLnRoX25leHRfd2FpdGluZywKKyAgICAgICAgICAgICBoZWFkX2lkLCB0YWlsX2lkICk7CisKKyAgICBfX2ttcF9wcmludGZfbm9fbG9jayggIlx0XHRoZWFkOiAlZCAiLCBsY2stPmxrLmhlYWRfaWQgKTsKKworICAgIGlmICggbGNrLT5say5oZWFkX2lkID49IDEgKSB7CisgICAgICAgIHQgPSBfX2ttcF90aHJlYWRzW2xjay0+bGsuaGVhZF9pZC0xXS0+dGgudGhfbmV4dF93YWl0aW5nOworICAgICAgICB3aGlsZSAodCA+IDApIHsKKyAgICAgICAgICAgIF9fa21wX3ByaW50Zl9ub19sb2NrKCAiLT4gJWQgIiwgdCApOworICAgICAgICAgICAgdCA9IF9fa21wX3RocmVhZHNbdC0xXS0+dGgudGhfbmV4dF93YWl0aW5nOworICAgICAgICB9CisgICAgfQorICAgIF9fa21wX3ByaW50Zl9ub19sb2NrKCAiOyAgdGFpbDogJWQgIiwgbGNrLT5say50YWlsX2lkICk7CisgICAgX19rbXBfcHJpbnRmX25vX2xvY2soICJcblxuIiApOworfQorCisjZW5kaWYgLyogREVCVUdfUVVFVUlOR19MT0NLUyAqLworCitzdGF0aWMga21wX2ludDMyCitfX2ttcF9nZXRfcXVldWluZ19sb2NrX293bmVyKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjayApCit7CisgICAgcmV0dXJuIFRDUl80KCBsY2stPmxrLm93bmVyX2lkICkgLSAxOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wKK19fa21wX2lzX3F1ZXVpbmdfbG9ja19uZXN0YWJsZSgga21wX3F1ZXVpbmdfbG9ja190ICpsY2sgKQoreworICAgIHJldHVybiBsY2stPmxrLmRlcHRoX2xvY2tlZCAhPSAtMTsKK30KKworLyogQWNxdWlyZSBhIGxvY2sgdXNpbmcgYSB0aGUgcXVldWluZyBsb2NrIGltcGxlbWVudGF0aW9uICovCit0ZW1wbGF0ZSA8Ym9vbCB0YWtlVGltZT4KKy8qIFtUTFddIFRoZSB1bnVzZWQgdGVtcGxhdGUgYWJvdmUgaXMgbGVmdCBiZWhpbmQgYmVjYXVzZSBvZiB3aGF0IEJFQiBiZWxpZXZlcyBpcyBhCisgICBwb3RlbnRpYWwgY29tcGlsZXIgcHJvYmxlbSB3aXRoIF9fZm9yY2VpbmxpbmUuICovCitfX2ZvcmNlaW5saW5lIHN0YXRpYyB2b2lkCitfX2ttcF9hY3F1aXJlX3F1ZXVpbmdfbG9ja190aW1lZF90ZW1wbGF0ZSgga21wX3F1ZXVpbmdfbG9ja190ICpsY2ssCisgIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICByZWdpc3RlciBrbXBfaW5mb190ICp0aGlzX3RociAgICA9IF9fa21wX3RocmVhZF9mcm9tX2d0aWQoIGd0aWQgKTsKKyAgICB2b2xhdGlsZSBrbXBfaW50MzIgICpoZWFkX2lkX3AgICA9ICYgbGNrLT5say5oZWFkX2lkOworICAgIHZvbGF0aWxlIGttcF9pbnQzMiAgKnRhaWxfaWRfcCAgID0gJiBsY2stPmxrLnRhaWxfaWQ7CisgICAgdm9sYXRpbGUga21wX3VpbnQzMiAqc3Bpbl9oZXJlX3A7CisgICAga21wX2ludDMyIG5lZWRfbWYgPSAxOworCisgICAgS0FfVFJBQ0UoIDEwMDAsICgiX19rbXBfYWNxdWlyZV9xdWV1aW5nX2xvY2s6IGxjazolcCwgVCMlZCBlbnRlcmluZ1xuIiwgbGNrLCBndGlkICkpOworCisgICAgS01QX0ZTWU5DX1BSRVBBUkUoIGxjayApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRoaXNfdGhyICE9IE5VTEwgKTsKKyAgICBzcGluX2hlcmVfcCA9ICYgdGhpc190aHItPnRoLnRoX3NwaW5faGVyZTsKKworI2lmZGVmIERFQlVHX1FVRVVJTkdfTE9DS1MKKyAgICBUUkFDRV9MT0NLKCBndGlkKzEsICJhY3EgZW50IiApOworICAgIGlmICggKnNwaW5faGVyZV9wICkKKyAgICAgICAgX19rbXBfZHVtcF9xdWV1aW5nX2xvY2soIHRoaXNfdGhyLCBndGlkLCBsY2ssICpoZWFkX2lkX3AsICp0YWlsX2lkX3AgKTsKKyAgICBpZiAoIHRoaXNfdGhyLT50aC50aF9uZXh0X3dhaXRpbmcgIT0gMCApCisgICAgICAgIF9fa21wX2R1bXBfcXVldWluZ19sb2NrKCB0aGlzX3RociwgZ3RpZCwgbGNrLCAqaGVhZF9pZF9wLCAqdGFpbF9pZF9wICk7CisjZW5kaWYKKyAgICBLTVBfREVCVUdfQVNTRVJUKCAhKnNwaW5faGVyZV9wICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGhpc190aHItPnRoLnRoX25leHRfd2FpdGluZyA9PSAwICk7CisKKworICAgIC8qIFRoZSBmb2xsb3dpbmcgc3QucmVsIHRvIHNwaW5faGVyZV9wIG5lZWRzIHRvIHByZWNlZGUgdGhlIGNtcHhjaGcuYWNxIHRvIGhlYWRfaWRfcAorICAgICAgIHRoYXQgbWF5IGZvbGxvdywgbm90IGp1c3QgaW4gZXhlY3V0aW9uIG9yZGVyLCBidXQgYWxzbyBpbiB2aXNpYmlsaXR5IG9yZGVyLiAgVGhpcyB3YXksCisgICAgICAgd2hlbiBhIHJlbGVhc2luZyB0aHJlYWQgb2JzZXJ2ZXMgdGhlIGNoYW5nZXMgdG8gdGhlIHF1ZXVlIGJ5IHRoaXMgdGhyZWFkLCBpdCBjYW4KKyAgICAgICByaWdodGx5IGFzc3VtZSB0aGF0IHNwaW5faGVyZV9wIGhhcyBhbHJlYWR5IGJlZW4gc2V0IHRvIFRSVUUsIHNvIHRoYXQgd2hlbiBpdCBzZXRzCisgICAgICAgc3Bpbl9oZXJlX3AgdG8gRkFMU0UsIGl0IGlzIG5vdCBwcmVtYXR1cmUuICBJZiB0aGUgcmVsZWFzaW5nIHRocmVhZCBzZXRzIHNwaW5faGVyZV9wCisgICAgICAgdG8gRkFMU0UgYmVmb3JlIHRoaXMgdGhyZWFkIHNldHMgaXQgdG8gVFJVRSwgdGhpcyB0aHJlYWQgd2lsbCBoYW5nLgorICAgICovCisgICAgKnNwaW5faGVyZV9wID0gVFJVRTsgIC8qIGJlZm9yZSBlbnF1ZXVpbmcgdG8gcHJldmVudCByYWNlICovCisKKyAgICB3aGlsZSggMSApIHsKKyAgICAgICAga21wX2ludDMyIGVucXVldWVkOworICAgICAgICBrbXBfaW50MzIgaGVhZDsKKyAgICAgICAga21wX2ludDMyIHRhaWw7CisKKyAgICAgICAgaGVhZCA9ICpoZWFkX2lkX3A7CisKKyAgICAgICAgc3dpdGNoICggaGVhZCApIHsKKworICAgICAgICAgICAgY2FzZSAtMToKKyAgICAgICAgICAgIHsKKyNpZmRlZiBERUJVR19RVUVVSU5HX0xPQ0tTCisgICAgICAgICAgICAgICAgdGFpbCA9ICp0YWlsX2lkX3A7CisgICAgICAgICAgICAgICAgVFJBQ0VfTE9DS19IVCggZ3RpZCsxLCAiYWNxIHJlYWQ6ICIsIGhlYWQsIHRhaWwgKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIHRhaWwgPSAwOyAgLyogdG8gbWFrZSBzdXJlIG5leHQgbGluayBhc3luY2hyb25vdXNseSByZWFkIGlzIG5vdCBzZXQgYWNjaWRlbnRhbGx5OworICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBhc3NpZ25tZW50IHByZXZlbnRzIHVzIGZyb20gZW50ZXJpbmcgdGhlIGlmICggdCA+IDAgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uIGluIHRoZSBlbnF1ZXVlZCBjYXNlIGJlbG93LCB3aGljaCBpcyBub3QgbmVjZXNzYXJ5IGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBzdGF0ZSB0cmFuc2l0aW9uICovCisKKyAgICAgICAgICAgICAgICBuZWVkX21mID0gMDsKKyAgICAgICAgICAgICAgICAvKiB0cnkgKC0xLDApLT4odGlkLHRpZCkgKi8KKyAgICAgICAgICAgICAgICBlbnF1ZXVlZCA9IEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1E2NCggKHZvbGF0aWxlIGttcF9pbnQ2NCAqKSB0YWlsX2lkX3AsCisgICAgICAgICAgICAgICAgICBLTVBfUEFDS182NCggLTEsIDAgKSwKKyAgICAgICAgICAgICAgICAgIEtNUF9QQUNLXzY0KCBndGlkKzEsIGd0aWQrMSApICk7CisjaWZkZWYgREVCVUdfUVVFVUlOR19MT0NLUworICAgICAgICAgICAgICAgICAgaWYgKCBlbnF1ZXVlZCApIFRSQUNFX0xPQ0soIGd0aWQrMSwgImFjcSBlbnE6ICgtMSwwKS0+KHRpZCx0aWQpIiApOworI2VuZGlmCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0YWlsID0gKnRhaWxfaWRfcDsKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0YWlsICE9IGd0aWQgKyAxICk7CisKKyNpZmRlZiBERUJVR19RVUVVSU5HX0xPQ0tTCisgICAgICAgICAgICAgICAgVFJBQ0VfTE9DS19IVCggZ3RpZCsxLCAiYWNxIHJlYWQ6ICIsIGhlYWQsIHRhaWwgKTsKKyNlbmRpZgorCisgICAgICAgICAgICAgICAgaWYgKCB0YWlsID09IDAgKSB7CisgICAgICAgICAgICAgICAgICAgIGVucXVldWVkID0gRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBuZWVkX21mID0gMDsKKyAgICAgICAgICAgICAgICAgICAgLyogdHJ5IChoLHQpIG9yIChoLGgpLT4oaCx0aWQpICovCisgICAgICAgICAgICAgICAgICAgIGVucXVldWVkID0gS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTMyKCB0YWlsX2lkX3AsIHRhaWwsIGd0aWQrMSApOworCisjaWZkZWYgREVCVUdfUVVFVUlOR19MT0NLUworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBlbnF1ZXVlZCApIFRSQUNFX0xPQ0soIGd0aWQrMSwgImFjcSBlbnE6IChoLHQpLT4oaCx0aWQpIiApOworI2VuZGlmCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMDogLyogZW1wdHkgcXVldWUgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBrbXBfaW50MzIgZ3JhYmJlZF9sb2NrOworCisjaWZkZWYgREVCVUdfUVVFVUlOR19MT0NLUworICAgICAgICAgICAgICAgIHRhaWwgPSAqdGFpbF9pZF9wOworICAgICAgICAgICAgICAgIFRSQUNFX0xPQ0tfSFQoIGd0aWQrMSwgImFjcSByZWFkOiAiLCBoZWFkLCB0YWlsICk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAvKiB0cnkgKDAsMCktPigtMSwwKSAqLworCisgICAgICAgICAgICAgICAgLyogb25seSBsZWdhbCB0cmFuc2l0aW9uIG91dCBvZiBoZWFkID0gMCBpcyBoZWFkID0gLTEgd2l0aCBubyBjaGFuZ2UgdG8gdGFpbCAqLworICAgICAgICAgICAgICAgIGdyYWJiZWRfbG9jayA9IEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EzMiggaGVhZF9pZF9wLCAwLCAtMSApOworCisgICAgICAgICAgICAgICAgaWYgKCBncmFiYmVkX2xvY2sgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgKnNwaW5faGVyZV9wID0gRkFMU0U7CisKKyAgICAgICAgICAgICAgICAgICAgS0FfVFJBQ0UoIDEwMDAsICgiX19rbXBfYWNxdWlyZV9xdWV1aW5nX2xvY2s6IGxjazolcCwgVCMlZCBleGl0aW5nOiBubyBxdWV1aW5nXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGNrLCBndGlkICkpOworI2lmZGVmIERFQlVHX1FVRVVJTkdfTE9DS1MKKyAgICAgICAgICAgICAgICAgICAgVFJBQ0VfTE9DS19IVCggZ3RpZCsxLCAiYWNxIGV4aXQ6ICIsIGhlYWQsIDAgKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICBLTVBfRlNZTkNfQUNRVUlSRUQoIGxjayApOworICAgICAgICAgICAgICAgICAgICByZXR1cm47IC8qIGxvY2sgaG9sZGVyIGNhbm5vdCBiZSBvbiBxdWV1ZSAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbnF1ZXVlZCA9IEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIGVucXVldWVkICkgeworICAgICAgICAgICAgaWYgKCB0YWlsID4gMCApIHsKKyAgICAgICAgICAgICAgICBrbXBfaW5mb190ICp0YWlsX3RociA9IF9fa21wX3RocmVhZF9mcm9tX2d0aWQoIHRhaWwgLSAxICk7CisgICAgICAgICAgICAgICAgS01QX0FTU0VSVCggdGFpbF90aHIgIT0gTlVMTCApOworICAgICAgICAgICAgICAgIHRhaWxfdGhyLT50aC50aF9uZXh0X3dhaXRpbmcgPSBndGlkKzE7CisgICAgICAgICAgICAgICAgLyogY29ycmVzcG9uZGluZyB3YWl0IGZvciB0aGlzIHdyaXRlIGluIHJlbGVhc2UgY29kZSAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgS0FfVFJBQ0UoIDEwMDAsICgiX19rbXBfYWNxdWlyZV9xdWV1aW5nX2xvY2s6IGxjazolcCwgVCMlZCB3YWl0aW5nIGZvciBsb2NrXG4iLCBsY2ssIGd0aWQgKSk7CisKKworICAgICAgICAgICAgLyogVG9EbzogTWF5IHdhbnQgdG8gY29uc2lkZXIgdXNpbmcgX19rbXBfd2FpdF9zbGVlcCAgb3Igc29tZXRoaW5nIHRoYXQgc2xlZXBzIGZvcgorICAgICAgICAgICAgICogICAgICAgdGhyb3VnaHB1dCBvbmx5IGhlcmUuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIEtNUF9NQigpOworICAgICAgICAgICAgS01QX1dBSVRfWUlFTEQoc3Bpbl9oZXJlX3AsIEZBTFNFLCBLTVBfRVEsIGxjayk7CisKKyNpZmRlZiBERUJVR19RVUVVSU5HX0xPQ0tTCisgICAgICAgICAgICBUUkFDRV9MT0NLKCBndGlkKzEsICJhY3Egc3BpbiIgKTsKKworICAgICAgICAgICAgaWYgKCB0aGlzX3Roci0+dGgudGhfbmV4dF93YWl0aW5nICE9IDAgKQorICAgICAgICAgICAgICAgIF9fa21wX2R1bXBfcXVldWluZ19sb2NrKCB0aGlzX3RociwgZ3RpZCwgbGNrLCAqaGVhZF9pZF9wLCAqdGFpbF9pZF9wICk7CisjZW5kaWYKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHRoaXNfdGhyLT50aC50aF9uZXh0X3dhaXRpbmcgPT0gMCApOworICAgICAgICAgICAgS0FfVFJBQ0UoIDEwMDAsICgiX19rbXBfYWNxdWlyZV9xdWV1aW5nX2xvY2s6IGxjazolcCwgVCMlZCBleGl0aW5nOiBhZnRlciB3YWl0aW5nIG9uIHF1ZXVlXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGxjaywgZ3RpZCApKTsKKworI2lmZGVmIERFQlVHX1FVRVVJTkdfTE9DS1MKKyAgICAgICAgICAgIFRSQUNFX0xPQ0soIGd0aWQrMSwgImFjcSBleGl0IDIiICk7CisjZW5kaWYKKyAgICAgICAgICAgIC8qIGdvdCBsb2NrLCB3ZSB3ZXJlIGRlcXVldWVkIGJ5IHRoZSB0aHJlYWQgdGhhdCByZWxlYXNlZCBsb2NrICovCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvKiBZaWVsZCBpZiBudW1iZXIgb2YgdGhyZWFkcyA+IG51bWJlciBvZiBsb2dpY2FsIHByb2Nlc3NvcnMgKi8KKyAgICAgICAgLyogVG9EbzogTm90IHN1cmUgd2h5IHRoaXMgc2hvdWxkIG9ubHkgYmUgaW4gb3ZlcnN1YnNjcmlwdGlvbiBjYXNlLAorICAgICAgICAgICBtYXliZSBzaG91bGQgYmUgdHJhZGl0aW9uYWwgWUlFTERfSU5JVC9ZSUVMRF9XSEVOIGxvb3AgKi8KKyAgICAgICAgS01QX1lJRUxEKCBUQ1JfNCggX19rbXBfbnRoICkgPiAoX19rbXBfYXZhaWxfcHJvYyA/IF9fa21wX2F2YWlsX3Byb2MgOgorICAgICAgICAgIF9fa21wX3hwcm9jICkgKTsKKyNpZmRlZiBERUJVR19RVUVVSU5HX0xPQ0tTCisgICAgICAgIFRSQUNFX0xPQ0soIGd0aWQrMSwgImFjcSByZXRyeSIgKTsKKyNlbmRpZgorCisgICAgfQorICAgIEtNUF9BU1NFUlQyKCAwLCAic2hvdWxkIG5vdCBnZXQgaGVyZSIgKTsKK30KKwordm9pZAorX19rbXBfYWNxdWlyZV9xdWV1aW5nX2xvY2soIGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggZ3RpZCA+PSAwICk7CisKKyAgICBfX2ttcF9hY3F1aXJlX3F1ZXVpbmdfbG9ja190aW1lZF90ZW1wbGF0ZTxmYWxzZT4oIGxjaywgZ3RpZCApOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfYWNxdWlyZV9xdWV1aW5nX2xvY2tfd2l0aF9jaGVja3MoIGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrLAorICBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3NldF9sb2NrIjsKKyAgICBpZiAoIGxjay0+bGsuaW5pdGlhbGl6ZWQgIT0gbGNrICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9pc19xdWV1aW5nX2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tOZXN0YWJsZVVzZWRBc1NpbXBsZSwgZnVuYyApOworICAgIH0KKyAgICBpZiAoIF9fa21wX2dldF9xdWV1aW5nX2xvY2tfb3duZXIoIGxjayApID09IGd0aWQgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzQWxyZWFkeU93bmVkLCBmdW5jICk7CisgICAgfQorCisgICAgX19rbXBfYWNxdWlyZV9xdWV1aW5nX2xvY2soIGxjaywgZ3RpZCApOworCisgICAgbGNrLT5say5vd25lcl9pZCA9IGd0aWQgKyAxOworfQorCitpbnQKK19fa21wX3Rlc3RfcXVldWluZ19sb2NrKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIHZvbGF0aWxlIGttcF9pbnQzMiAqaGVhZF9pZF9wICA9ICYgbGNrLT5say5oZWFkX2lkOworICAgIGttcF9pbnQzMiBoZWFkOworI2lmZGVmIEtNUF9ERUJVRworICAgIGttcF9pbmZvX3QgKnRoaXNfdGhyOworI2VuZGlmCisKKyAgICBLQV9UUkFDRSggMTAwMCwgKCJfX2ttcF90ZXN0X3F1ZXVpbmdfbG9jazogVCMlZCBlbnRlcmluZ1xuIiwgZ3RpZCApKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBndGlkID49IDAgKTsKKyNpZmRlZiBLTVBfREVCVUcKKyAgICB0aGlzX3RociA9IF9fa21wX3RocmVhZF9mcm9tX2d0aWQoIGd0aWQgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aGlzX3RociAhPSBOVUxMICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggIXRoaXNfdGhyLT50aC50aF9zcGluX2hlcmUgKTsKKyNlbmRpZgorCisgICAgaGVhZCA9ICpoZWFkX2lkX3A7CisKKyAgICBpZiAoIGhlYWQgPT0gMCApIHsgLyogbm9ib2R5IG9uIHF1ZXVlLCBub2JvZHkgaG9sZGluZyAqLworCisgICAgICAgIC8qIHRyeSAoMCwwKS0+KC0xLDApICovCisKKyAgICAgICAgaWYgKCBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRMzIoIGhlYWRfaWRfcCwgMCwgLTEgKSApIHsKKyAgICAgICAgICAgIEtBX1RSQUNFKCAxMDAwLCAoIl9fa21wX3Rlc3RfcXVldWluZ19sb2NrOiBUIyVkIGV4aXRpbmc6IGhvbGRpbmcgbG9ja1xuIiwgZ3RpZCApKTsKKyAgICAgICAgICAgIEtNUF9GU1lOQ19BQ1FVSVJFRChsY2spOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBLQV9UUkFDRSggMTAwMCwgKCJfX2ttcF90ZXN0X3F1ZXVpbmdfbG9jazogVCMlZCBleGl0aW5nOiB3aXRob3V0IGxvY2tcbiIsIGd0aWQgKSk7CisgICAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgaW50CitfX2ttcF90ZXN0X3F1ZXVpbmdfbG9ja193aXRoX2NoZWNrcygga21wX3F1ZXVpbmdfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfdGVzdF9sb2NrIjsKKyAgICBpZiAoIGxjay0+bGsuaW5pdGlhbGl6ZWQgIT0gbGNrICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9pc19xdWV1aW5nX2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tOZXN0YWJsZVVzZWRBc1NpbXBsZSwgZnVuYyApOworICAgIH0KKworICAgIGludCByZXR2YWwgPSBfX2ttcF90ZXN0X3F1ZXVpbmdfbG9jayggbGNrLCBndGlkICk7CisKKyAgICBpZiAoIHJldHZhbCApIHsKKyAgICAgICAgbGNrLT5say5vd25lcl9pZCA9IGd0aWQgKyAxOworICAgIH0KKyAgICByZXR1cm4gcmV0dmFsOworfQorCit2b2lkCitfX2ttcF9yZWxlYXNlX3F1ZXVpbmdfbG9jaygga21wX3F1ZXVpbmdfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICByZWdpc3RlciBrbXBfaW5mb190ICp0aGlzX3RocjsKKyAgICB2b2xhdGlsZSBrbXBfaW50MzIgKmhlYWRfaWRfcCA9ICYgbGNrLT5say5oZWFkX2lkOworICAgIHZvbGF0aWxlIGttcF9pbnQzMiAqdGFpbF9pZF9wID0gJiBsY2stPmxrLnRhaWxfaWQ7CisKKyAgICBLQV9UUkFDRSggMTAwMCwgKCJfX2ttcF9yZWxlYXNlX3F1ZXVpbmdfbG9jazogbGNrOiVwLCBUIyVkIGVudGVyaW5nXG4iLCBsY2ssIGd0aWQgKSk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggZ3RpZCA+PSAwICk7CisgICAgdGhpc190aHIgICAgPSBfX2ttcF90aHJlYWRfZnJvbV9ndGlkKCBndGlkICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGhpc190aHIgIT0gTlVMTCApOworI2lmZGVmIERFQlVHX1FVRVVJTkdfTE9DS1MKKyAgICBUUkFDRV9MT0NLKCBndGlkKzEsICJyZWwgZW50IiApOworCisgICAgaWYgKCB0aGlzX3Roci0+dGgudGhfc3Bpbl9oZXJlICkKKyAgICAgICAgX19rbXBfZHVtcF9xdWV1aW5nX2xvY2soIHRoaXNfdGhyLCBndGlkLCBsY2ssICpoZWFkX2lkX3AsICp0YWlsX2lkX3AgKTsKKyAgICBpZiAoIHRoaXNfdGhyLT50aC50aF9uZXh0X3dhaXRpbmcgIT0gMCApCisgICAgICAgIF9fa21wX2R1bXBfcXVldWluZ19sb2NrKCB0aGlzX3RociwgZ3RpZCwgbGNrLCAqaGVhZF9pZF9wLCAqdGFpbF9pZF9wICk7CisjZW5kaWYKKyAgICBLTVBfREVCVUdfQVNTRVJUKCAhdGhpc190aHItPnRoLnRoX3NwaW5faGVyZSApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRoaXNfdGhyLT50aC50aF9uZXh0X3dhaXRpbmcgPT0gMCApOworCisgICAgS01QX0ZTWU5DX1JFTEVBU0lORyhsY2spOworCisgICAgd2hpbGUoIDEgKSB7CisgICAgICAgIGttcF9pbnQzMiBkZXF1ZXVlZDsKKyAgICAgICAga21wX2ludDMyIGhlYWQ7CisgICAgICAgIGttcF9pbnQzMiB0YWlsOworCisgICAgICAgIGhlYWQgPSAqaGVhZF9pZF9wOworCisjaWZkZWYgREVCVUdfUVVFVUlOR19MT0NLUworICAgICAgICB0YWlsID0gKnRhaWxfaWRfcDsKKyAgICAgICAgVFJBQ0VfTE9DS19IVCggZ3RpZCsxLCAicmVsIHJlYWQ6ICIsIGhlYWQsIHRhaWwgKTsKKyAgICAgICAgaWYgKCBoZWFkID09IDAgKSBfX2ttcF9kdW1wX3F1ZXVpbmdfbG9jayggdGhpc190aHIsIGd0aWQsIGxjaywgaGVhZCwgdGFpbCApOworI2VuZGlmCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGhlYWQgIT0gMCApOyAvKiBob2xkaW5nIHRoZSBsb2NrLCBoZWFkIG11c3QgYmUgLTEgb3IgcXVldWUgaGVhZCAqLworCisgICAgICAgIGlmICggaGVhZCA9PSAtMSApIHsgLyogbm9ib2R5IG9uIHF1ZXVlICovCisKKyAgICAgICAgICAgIC8qIHRyeSAoLTEsMCktPigwLDApICovCisgICAgICAgICAgICBpZiAoIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRUwzMiggaGVhZF9pZF9wLCAtMSwgMCApICkgeworICAgICAgICAgICAgICAgIEtBX1RSQUNFKCAxMDAwLCAoIl9fa21wX3JlbGVhc2VfcXVldWluZ19sb2NrOiBsY2s6JXAsIFQjJWQgZXhpdGluZzogcXVldWUgZW1wdHlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxjaywgZ3RpZCApKTsKKyNpZmRlZiBERUJVR19RVUVVSU5HX0xPQ0tTCisgICAgICAgICAgICAgICAgVFJBQ0VfTE9DS19IVCggZ3RpZCsxLCAicmVsIGV4aXQ6ICIsIDAsIDAgKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlcXVldWVkID0gRkFMU0U7CisKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKworICAgICAgICAgICAgdGFpbCA9ICp0YWlsX2lkX3A7CisgICAgICAgICAgICBpZiAoIGhlYWQgPT0gdGFpbCApIHsgIC8qIG9ubHkgb25lIHRocmVhZCBvbiB0aGUgcXVldWUgKi8KKworI2lmZGVmIERFQlVHX1FVRVVJTkdfTE9DS1MKKyAgICAgICAgICAgICAgICBpZiAoIGhlYWQgPD0gMCApIF9fa21wX2R1bXBfcXVldWluZ19sb2NrKCB0aGlzX3RociwgZ3RpZCwgbGNrLCBoZWFkLCB0YWlsICk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBoZWFkID4gMCApOworCisgICAgICAgICAgICAgICAgLyogdHJ5IChoLGgpLT4oLTEsMCkgKi8KKyAgICAgICAgICAgICAgICBkZXF1ZXVlZCA9IEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRUw2NCggKGttcF9pbnQ2NCAqKSB0YWlsX2lkX3AsCisgICAgICAgICAgICAgICAgICBLTVBfUEFDS182NCggaGVhZCwgaGVhZCApLCBLTVBfUEFDS182NCggLTEsIDAgKSApOworI2lmZGVmIERFQlVHX1FVRVVJTkdfTE9DS1MKKyAgICAgICAgICAgICAgICBUUkFDRV9MT0NLKCBndGlkKzEsICJyZWwgZGVxOiAoaCxoKS0+KC0xLDApIiApOworI2VuZGlmCisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHZvbGF0aWxlIGttcF9pbnQzMiAqd2FpdGluZ19pZF9wOworICAgICAgICAgICAgICAgIGttcF9pbmZvX3QgICAgICAgICAqaGVhZF90aHIgPSBfX2ttcF90aHJlYWRfZnJvbV9ndGlkKCBoZWFkIC0gMSApOworICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGhlYWRfdGhyICE9IE5VTEwgKTsKKyAgICAgICAgICAgICAgICB3YWl0aW5nX2lkX3AgPSAmIGhlYWRfdGhyLT50aC50aF9uZXh0X3dhaXRpbmc7CisKKyAgICAgICAgICAgICAgICAvKiBEb2VzIHRoaXMgcmVxdWlyZSBzeW5jaHJvbm91cyByZWFkcz8gKi8KKyNpZmRlZiBERUJVR19RVUVVSU5HX0xPQ0tTCisgICAgICAgICAgICAgICAgaWYgKCBoZWFkIDw9IDAgfHwgdGFpbCA8PSAwICkgX19rbXBfZHVtcF9xdWV1aW5nX2xvY2soIHRoaXNfdGhyLCBndGlkLCBsY2ssIGhlYWQsIHRhaWwgKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGhlYWQgPiAwICYmIHRhaWwgPiAwICk7CisKKyAgICAgICAgICAgICAgICAvKiB0cnkgKGgsdCktPihoJyx0KSBvciAodCx0KSAqLworCisgICAgICAgICAgICAgICAgS01QX01CKCk7CisgICAgICAgICAgICAgICAgLyogbWFrZSBzdXJlIGVucXVldWluZyB0aHJlYWQgaGFzIHRpbWUgdG8gdXBkYXRlIG5leHQgd2FpdGluZyB0aHJlYWQgZmllbGQgKi8KKyAgICAgICAgICAgICAgICAqaGVhZF9pZF9wID0gKGttcF9pbnQzMikgS01QX1dBSVRfWUlFTEQoKHZvbGF0aWxlIGttcF91aW50Kikgd2FpdGluZ19pZF9wLCAwLCBLTVBfTkVRLCBOVUxMKTsKKyNpZmRlZiBERUJVR19RVUVVSU5HX0xPQ0tTCisgICAgICAgICAgICAgICAgVFJBQ0VfTE9DSyggZ3RpZCsxLCAicmVsIGRlcTogKGgsdCktPihoJyx0KSIgKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIGRlcXVldWVkID0gVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICggZGVxdWV1ZWQgKSB7CisgICAgICAgICAgICBrbXBfaW5mb190ICpoZWFkX3RociA9IF9fa21wX3RocmVhZF9mcm9tX2d0aWQoIGhlYWQgLSAxICk7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBoZWFkX3RociAhPSBOVUxMICk7CisKKyAgICAgICAgICAgIC8qIERvZXMgdGhpcyByZXF1aXJlIHN5bmNocm9ub3VzIHJlYWRzPyAqLworI2lmZGVmIERFQlVHX1FVRVVJTkdfTE9DS1MKKyAgICAgICAgICAgIGlmICggaGVhZCA8PSAwIHx8IHRhaWwgPD0gMCApIF9fa21wX2R1bXBfcXVldWluZ19sb2NrKCB0aGlzX3RociwgZ3RpZCwgbGNrLCBoZWFkLCB0YWlsICk7CisjZW5kaWYKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGhlYWQgPiAwICYmIHRhaWwgPiAwICk7CisKKyAgICAgICAgICAgIC8qIEZvciBjbGVhbiBjb2RlIG9ubHkuCisgICAgICAgICAgICAgKiBUaHJlYWQgbm90IHJlbGVhc2VkIHVudGlsIG5leHQgc3RhdGVtZW50IHByZXZlbnRzIHJhY2Ugd2l0aCBhY3F1aXJlIGNvZGUuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGhlYWRfdGhyLT50aC50aF9uZXh0X3dhaXRpbmcgPSAwOworI2lmZGVmIERFQlVHX1FVRVVJTkdfTE9DS1MKKyAgICAgICAgICAgIFRSQUNFX0xPQ0tfVCggZ3RpZCsxLCAicmVsIG53PTAgZm9yIHQ9IiwgaGVhZCApOworI2VuZGlmCisKKyAgICAgICAgICAgIEtNUF9NQigpOworICAgICAgICAgICAgLyogcmVzZXQgc3BpbiB2YWx1ZSAqLworICAgICAgICAgICAgaGVhZF90aHItPnRoLnRoX3NwaW5faGVyZSA9IEZBTFNFOworCisgICAgICAgICAgICBLQV9UUkFDRSggMTAwMCwgKCJfX2ttcF9yZWxlYXNlX3F1ZXVpbmdfbG9jazogbGNrOiVwLCBUIyVkIGV4aXRpbmc6IGFmdGVyIGRlcXVldWluZ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICBsY2ssIGd0aWQgKSk7CisjaWZkZWYgREVCVUdfUVVFVUlOR19MT0NLUworICAgICAgICAgICAgVFJBQ0VfTE9DSyggZ3RpZCsxLCAicmVsIGV4aXQgMiIgKTsKKyNlbmRpZgorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8qIEtNUF9DUFVfUEFVU0UoICk7ICBkb24ndCB3YW50IHRvIG1ha2UgcmVsZWFzaW5nIHRocmVhZCBob2xkIHVwIGFjcXVpcmluZyB0aHJlYWRzICovCisKKyNpZmRlZiBERUJVR19RVUVVSU5HX0xPQ0tTCisgICAgICAgIFRSQUNFX0xPQ0soIGd0aWQrMSwgInJlbCByZXRyeSIgKTsKKyNlbmRpZgorCisgICAgfSAvKiB3aGlsZSAqLworICAgIEtNUF9BU1NFUlQyKCAwLCAic2hvdWxkIG5vdCBnZXQgaGVyZSIgKTsKK30KKworc3RhdGljIHZvaWQKK19fa21wX3JlbGVhc2VfcXVldWluZ19sb2NrX3dpdGhfY2hlY2tzKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjaywKKyAga21wX2ludDMyIGd0aWQgKQoreworICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF91bnNldF9sb2NrIjsKKyAgICBLTVBfTUIoKTsgIC8qIGluIGNhc2UgYW5vdGhlciBwcm9jZXNzb3IgaW5pdGlhbGl6ZWQgbG9jayAqLworICAgIGlmICggbGNrLT5say5pbml0aWFsaXplZCAhPSBsY2sgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgIH0KKyAgICBpZiAoIF9fa21wX2lzX3F1ZXVpbmdfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja05lc3RhYmxlVXNlZEFzU2ltcGxlLCBmdW5jICk7CisgICAgfQorICAgIGlmICggX19rbXBfZ2V0X3F1ZXVpbmdfbG9ja19vd25lciggbGNrICkgPT0gLTEgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1Vuc2V0dGluZ0ZyZWUsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9nZXRfcXVldWluZ19sb2NrX293bmVyKCBsY2sgKSAhPSBndGlkICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tVbnNldHRpbmdTZXRCeUFub3RoZXIsIGZ1bmMgKTsKKyAgICB9CisgICAgbGNrLT5say5vd25lcl9pZCA9IDA7CisgICAgX19rbXBfcmVsZWFzZV9xdWV1aW5nX2xvY2soIGxjaywgZ3RpZCApOworfQorCit2b2lkCitfX2ttcF9pbml0X3F1ZXVpbmdfbG9jaygga21wX3F1ZXVpbmdfbG9ja190ICpsY2sgKQoreworICAgIGxjay0+bGsubG9jYXRpb24gPSBOVUxMOworICAgIGxjay0+bGsuaGVhZF9pZCA9IDA7CisgICAgbGNrLT5say50YWlsX2lkID0gMDsKKyAgICBsY2stPmxrLm5leHRfdGlja2V0ID0gMDsKKyAgICBsY2stPmxrLm5vd19zZXJ2aW5nID0gMDsKKyAgICBsY2stPmxrLm93bmVyX2lkID0gMDsgICAgICAvLyBubyB0aHJlYWQgb3ducyB0aGUgbG9jay4KKyAgICBsY2stPmxrLmRlcHRoX2xvY2tlZCA9IC0xOyAvLyA+PSAwIGZvciBuZXN0YWJsZSBsb2NrcywgLTEgZm9yIHNpbXBsZSBsb2Nrcy4KKyAgICBsY2stPmxrLmluaXRpYWxpemVkID0gbGNrOworCisgICAgS0FfVFJBQ0UoMTAwMCwgKCJfX2ttcF9pbml0X3F1ZXVpbmdfbG9jazogbG9jayAlcCBpbml0aWFsaXplZFxuIiwgbGNrKSk7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9pbml0X3F1ZXVpbmdfbG9ja193aXRoX2NoZWNrcygga21wX3F1ZXVpbmdfbG9ja190ICogbGNrICkKK3sKKyAgICBfX2ttcF9pbml0X3F1ZXVpbmdfbG9jayggbGNrICk7Cit9CisKK3ZvaWQKK19fa21wX2Rlc3Ryb3lfcXVldWluZ19sb2NrKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjayApCit7CisgICAgbGNrLT5say5pbml0aWFsaXplZCA9IE5VTEw7CisgICAgbGNrLT5say5sb2NhdGlvbiA9IE5VTEw7CisgICAgbGNrLT5say5oZWFkX2lkID0gMDsKKyAgICBsY2stPmxrLnRhaWxfaWQgPSAwOworICAgIGxjay0+bGsubmV4dF90aWNrZXQgPSAwOworICAgIGxjay0+bGsubm93X3NlcnZpbmcgPSAwOworICAgIGxjay0+bGsub3duZXJfaWQgPSAwOworICAgIGxjay0+bGsuZGVwdGhfbG9ja2VkID0gLTE7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9kZXN0cm95X3F1ZXVpbmdfbG9ja193aXRoX2NoZWNrcygga21wX3F1ZXVpbmdfbG9ja190ICpsY2sgKQoreworICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF9kZXN0cm95X2xvY2siOworICAgIGlmICggbGNrLT5say5pbml0aWFsaXplZCAhPSBsY2sgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgIH0KKyAgICBpZiAoIF9fa21wX2lzX3F1ZXVpbmdfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja05lc3RhYmxlVXNlZEFzU2ltcGxlLCBmdW5jICk7CisgICAgfQorICAgIGlmICggX19rbXBfZ2V0X3F1ZXVpbmdfbG9ja19vd25lciggbGNrICkgIT0gLTEgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1N0aWxsT3duZWQsIGZ1bmMgKTsKKyAgICB9CisgICAgX19rbXBfZGVzdHJveV9xdWV1aW5nX2xvY2soIGxjayApOworfQorCisKKy8vCisvLyBuZXN0ZWQgcXVldWluZyBsb2NrcworLy8KKwordm9pZAorX19rbXBfYWNxdWlyZV9uZXN0ZWRfcXVldWluZ19sb2NrKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIGd0aWQgPj0gMCApOworCisgICAgaWYgKCBfX2ttcF9nZXRfcXVldWluZ19sb2NrX293bmVyKCBsY2sgKSA9PSBndGlkICkgeworICAgICAgICBsY2stPmxrLmRlcHRoX2xvY2tlZCArPSAxOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgX19rbXBfYWNxdWlyZV9xdWV1aW5nX2xvY2tfdGltZWRfdGVtcGxhdGU8ZmFsc2U+KCBsY2ssIGd0aWQgKTsKKyAgICAgICAgS01QX01CKCk7CisgICAgICAgIGxjay0+bGsuZGVwdGhfbG9ja2VkID0gMTsKKyAgICAgICAgS01QX01CKCk7CisgICAgICAgIGxjay0+bGsub3duZXJfaWQgPSBndGlkICsgMTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9hY3F1aXJlX25lc3RlZF9xdWV1aW5nX2xvY2tfd2l0aF9jaGVja3MoIGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3NldF9uZXN0X2xvY2siOworICAgIGlmICggbGNrLT5say5pbml0aWFsaXplZCAhPSBsY2sgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgIH0KKyAgICBpZiAoICEgX19rbXBfaXNfcXVldWluZ19sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrU2ltcGxlVXNlZEFzTmVzdGFibGUsIGZ1bmMgKTsKKyAgICB9CisgICAgX19rbXBfYWNxdWlyZV9uZXN0ZWRfcXVldWluZ19sb2NrKCBsY2ssIGd0aWQgKTsKK30KKworaW50CitfX2ttcF90ZXN0X25lc3RlZF9xdWV1aW5nX2xvY2soIGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgaW50IHJldHZhbDsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIGd0aWQgPj0gMCApOworCisgICAgaWYgKCBfX2ttcF9nZXRfcXVldWluZ19sb2NrX293bmVyKCBsY2sgKSA9PSBndGlkICkgeworICAgICAgICByZXR2YWwgPSArK2xjay0+bGsuZGVwdGhfbG9ja2VkOworICAgIH0KKyAgICBlbHNlIGlmICggIV9fa21wX3Rlc3RfcXVldWluZ19sb2NrKCBsY2ssIGd0aWQgKSApIHsKKyAgICAgICAgcmV0dmFsID0gMDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIEtNUF9NQigpOworICAgICAgICByZXR2YWwgPSBsY2stPmxrLmRlcHRoX2xvY2tlZCA9IDE7CisgICAgICAgIEtNUF9NQigpOworICAgICAgICBsY2stPmxrLm93bmVyX2lkID0gZ3RpZCArIDE7CisgICAgfQorICAgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQKK19fa21wX3Rlc3RfbmVzdGVkX3F1ZXVpbmdfbG9ja193aXRoX2NoZWNrcygga21wX3F1ZXVpbmdfbG9ja190ICpsY2ssCisgIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfdGVzdF9uZXN0X2xvY2siOworICAgIGlmICggbGNrLT5say5pbml0aWFsaXplZCAhPSBsY2sgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgIH0KKyAgICBpZiAoICEgX19rbXBfaXNfcXVldWluZ19sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrU2ltcGxlVXNlZEFzTmVzdGFibGUsIGZ1bmMgKTsKKyAgICB9CisgICAgcmV0dXJuIF9fa21wX3Rlc3RfbmVzdGVkX3F1ZXVpbmdfbG9jayggbGNrLCBndGlkICk7Cit9CisKK3ZvaWQKK19fa21wX3JlbGVhc2VfbmVzdGVkX3F1ZXVpbmdfbG9jaygga21wX3F1ZXVpbmdfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBndGlkID49IDAgKTsKKworICAgIEtNUF9NQigpOworICAgIGlmICggLS0obGNrLT5say5kZXB0aF9sb2NrZWQpID09IDAgKSB7CisgICAgICAgIEtNUF9NQigpOworICAgICAgICBsY2stPmxrLm93bmVyX2lkID0gMDsKKyAgICAgICAgX19rbXBfcmVsZWFzZV9xdWV1aW5nX2xvY2soIGxjaywgZ3RpZCApOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK19fa21wX3JlbGVhc2VfbmVzdGVkX3F1ZXVpbmdfbG9ja193aXRoX2NoZWNrcygga21wX3F1ZXVpbmdfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfdW5zZXRfbmVzdF9sb2NrIjsKKyAgICBLTVBfTUIoKTsgIC8qIGluIGNhc2UgYW5vdGhlciBwcm9jZXNzb3IgaW5pdGlhbGl6ZWQgbG9jayAqLworICAgIGlmICggbGNrLT5say5pbml0aWFsaXplZCAhPSBsY2sgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgIH0KKyAgICBpZiAoICEgX19rbXBfaXNfcXVldWluZ19sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrU2ltcGxlVXNlZEFzTmVzdGFibGUsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9nZXRfcXVldWluZ19sb2NrX293bmVyKCBsY2sgKSA9PSAtMSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrVW5zZXR0aW5nRnJlZSwgZnVuYyApOworICAgIH0KKyAgICBpZiAoIF9fa21wX2dldF9xdWV1aW5nX2xvY2tfb3duZXIoIGxjayApICE9IGd0aWQgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1Vuc2V0dGluZ1NldEJ5QW5vdGhlciwgZnVuYyApOworICAgIH0KKyAgICBfX2ttcF9yZWxlYXNlX25lc3RlZF9xdWV1aW5nX2xvY2soIGxjaywgZ3RpZCApOworfQorCit2b2lkCitfX2ttcF9pbml0X25lc3RlZF9xdWV1aW5nX2xvY2soIGttcF9xdWV1aW5nX2xvY2tfdCAqIGxjayApCit7CisgICAgX19rbXBfaW5pdF9xdWV1aW5nX2xvY2soIGxjayApOworICAgIGxjay0+bGsuZGVwdGhfbG9ja2VkID0gMDsgLy8gPj0gMCBmb3IgbmVzdGFibGUgbG9ja3MsIC0xIGZvciBzaW1wbGUgbG9ja3MKK30KKworc3RhdGljIHZvaWQKK19fa21wX2luaXRfbmVzdGVkX3F1ZXVpbmdfbG9ja193aXRoX2NoZWNrcygga21wX3F1ZXVpbmdfbG9ja190ICogbGNrICkKK3sKKyAgICBfX2ttcF9pbml0X25lc3RlZF9xdWV1aW5nX2xvY2soIGxjayApOworfQorCit2b2lkCitfX2ttcF9kZXN0cm95X25lc3RlZF9xdWV1aW5nX2xvY2soIGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrICkKK3sKKyAgICBfX2ttcF9kZXN0cm95X3F1ZXVpbmdfbG9jayggbGNrICk7CisgICAgbGNrLT5say5kZXB0aF9sb2NrZWQgPSAwOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfZGVzdHJveV9uZXN0ZWRfcXVldWluZ19sb2NrX3dpdGhfY2hlY2tzKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjayApCit7CisgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX2Rlc3Ryb3lfbmVzdF9sb2NrIjsKKyAgICBpZiAoIGxjay0+bGsuaW5pdGlhbGl6ZWQgIT0gbGNrICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCAhIF9fa21wX2lzX3F1ZXVpbmdfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1NpbXBsZVVzZWRBc05lc3RhYmxlLCBmdW5jICk7CisgICAgfQorICAgIGlmICggX19rbXBfZ2V0X3F1ZXVpbmdfbG9ja19vd25lciggbGNrICkgIT0gLTEgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1N0aWxsT3duZWQsIGZ1bmMgKTsKKyAgICB9CisgICAgX19rbXBfZGVzdHJveV9uZXN0ZWRfcXVldWluZ19sb2NrKCBsY2sgKTsKK30KKworCisvLworLy8gYWNjZXNzIGZ1bmN0aW9ucyB0byBmaWVsZHMgd2hpY2ggZG9uJ3QgZXhpc3QgZm9yIGFsbCBsb2NrIGtpbmRzLgorLy8KKworc3RhdGljIGludAorX19rbXBfaXNfcXVldWluZ19sb2NrX2luaXRpYWxpemVkKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjayApCit7CisgICAgcmV0dXJuIGxjayA9PSBsY2stPmxrLmluaXRpYWxpemVkOworfQorCitzdGF0aWMgY29uc3QgaWRlbnRfdCAqCitfX2ttcF9nZXRfcXVldWluZ19sb2NrX2xvY2F0aW9uKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjayApCit7CisgICAgcmV0dXJuIGxjay0+bGsubG9jYXRpb247Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9zZXRfcXVldWluZ19sb2NrX2xvY2F0aW9uKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjaywgY29uc3QgaWRlbnRfdCAqbG9jICkKK3sKKyAgICBsY2stPmxrLmxvY2F0aW9uID0gbG9jOworfQorCitzdGF0aWMga21wX2xvY2tfZmxhZ3NfdAorX19rbXBfZ2V0X3F1ZXVpbmdfbG9ja19mbGFncygga21wX3F1ZXVpbmdfbG9ja190ICpsY2sgKQoreworICAgIHJldHVybiBsY2stPmxrLmZsYWdzOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfc2V0X3F1ZXVpbmdfbG9ja19mbGFncygga21wX3F1ZXVpbmdfbG9ja190ICpsY2ssIGttcF9sb2NrX2ZsYWdzX3QgZmxhZ3MgKQoreworICAgIGxjay0+bGsuZmxhZ3MgPSBmbGFnczsKK30KKworI2lmIEtNUF9VU0VfQURBUFRJVkVfTE9DS1MKKworLyoKKyAgICBSVE0gQWRhcHRpdmUgbG9ja3MKKyovCisKKy8vIFRPRE86IFVzZSB0aGUgaGVhZGVyIGZvciBpbnRyaW5zaWNzIGJlbG93IHdpdGggdGhlIGNvbXBpbGVyIDEzLjAKKy8vI2luY2x1ZGUgPGltbWludHJpbi5oPgorCisvLyBWYWx1ZXMgZnJvbSB0aGUgc3RhdHVzIHJlZ2lzdGVyIGFmdGVyIGZhaWxlZCBzcGVjdWxhdGlvbi4KKyNkZWZpbmUgX1hCRUdJTl9TVEFSVEVEICAgICAgICAgICh+MHUpCisjZGVmaW5lIF9YQUJPUlRfRVhQTElDSVQgICAgICAgICAoMSA8PCAwKQorI2RlZmluZSBfWEFCT1JUX1JFVFJZICAgICAgICAgICAgKDEgPDwgMSkKKyNkZWZpbmUgX1hBQk9SVF9DT05GTElDVCAgICAgICAgICgxIDw8IDIpCisjZGVmaW5lIF9YQUJPUlRfQ0FQQUNJVFkgICAgICAgICAoMSA8PCAzKQorI2RlZmluZSBfWEFCT1JUX0RFQlVHICAgICAgICAgICAgKDEgPDwgNCkKKyNkZWZpbmUgX1hBQk9SVF9ORVNURUQgICAgICAgICAgICgxIDw8IDUpCisjZGVmaW5lIF9YQUJPUlRfQ09ERSh4KSAgICAgICAgICAoKHVuc2lnbmVkIGNoYXIpKCgoeCkgPj4gMjQpICYgMHhGRikpCisKKy8vIEFib3J0cyBmb3Igd2hpY2ggaXQncyB3b3J0aCB0cnlpbmcgYWdhaW4gaW1tZWRpYXRlbHkKKyNkZWZpbmUgU09GVF9BQk9SVF9NQVNLICAoX1hBQk9SVF9SRVRSWSB8IF9YQUJPUlRfQ09ORkxJQ1QgfCBfWEFCT1JUX0VYUExJQ0lUKQorCisjZGVmaW5lIFNUUklOR0laRV9JTlRFUk5BTChhcmcpICNhcmcKKyNkZWZpbmUgU1RSSU5HSVpFKGFyZykgU1RSSU5HSVpFX0lOVEVSTkFMKGFyZykKKworLy8gQWNjZXNzIHRvIFJUTSBpbnN0cnVjdGlvbnMKKworLyoKKyAgQSB2ZXJzaW9uIG9mIFhCZWdpbiB3aGljaCByZXR1cm5zIC0xIG9uIHNwZWN1bGF0aW9uLCBhbmQgdGhlIHZhbHVlIG9mIEVBWCBvbiBhbiBhYm9ydC4KKyAgVGhpcyBpcyB0aGUgc2FtZSBkZWZpbml0aW9uIGFzIHRoZSBjb21waWxlciBpbnRyaW5zaWMgdGhhdCB3aWxsIGJlIHN1cHBvcnRlZCBhdCBzb21lIHBvaW50LgorKi8KK3N0YXRpYyBfX2lubGluZSBpbnQgX3hiZWdpbigpCit7CisgICAgaW50IHJlcyA9IC0xOworCisjaWYgS01QX09TX1dJTkRPV1MKKyNpZiBLTVBfQVJDSF9YODZfNjQKKyAgICBfYXNtIHsKKyAgICAgICAgX2VtaXQgMHhDNworICAgICAgICBfZW1pdCAweEY4CisgICAgICAgIF9lbWl0IDIKKyAgICAgICAgX2VtaXQgMAorICAgICAgICBfZW1pdCAwCisgICAgICAgIF9lbWl0IDAKKyAgICAgICAgam1wICAgTDIKKyAgICAgICAgbW92ICAgcmVzLCBlYXgKKyAgICBMMjoKKyAgICB9CisjZWxzZSAvKiBJQTMyICovCisgICAgX2FzbSB7CisgICAgICAgIF9lbWl0IDB4QzcKKyAgICAgICAgX2VtaXQgMHhGOAorICAgICAgICBfZW1pdCAyCisgICAgICAgIF9lbWl0IDAKKyAgICAgICAgX2VtaXQgMAorICAgICAgICBfZW1pdCAwCisgICAgICAgIGptcCAgIEwyCisgICAgICAgIG1vdiAgIHJlcywgZWF4CisgICAgTDI6CisgICAgfQorI2VuZGlmIC8vIEtNUF9BUkNIX1g4Nl82NAorI2Vsc2UKKyAgICAvKiBOb3RlIHRoYXQgJWVheCBtdXN0IGJlIG5vdGVkIGFzIGtpbGxlZCAoY2xvYmJlcmVkKSwgYmVjYXVzZQorICAgICAqIHRoZSBYU1IgaXMgcmV0dXJuZWQgaW4gJWVheCglcmF4KSBvbiBhYm9ydC4gIE90aGVyIHJlZ2lzdGVyCisgICAgICogdmFsdWVzIGFyZSByZXN0b3JlZCwgc28gZG9uJ3QgbmVlZCB0byBiZSBraWxsZWQuCisgICAgICoKKyAgICAgKiBXZSBtdXN0IGFsc28gbWFyayAncmVzJyBhcyBhbiBpbnB1dCBhbmQgYW4gb3V0cHV0LCBzaW5jZSBvdGhlcndpc2UKKyAgICAgKiAncmVzPS0xJyBtYXkgYmUgZHJvcHBlZCBhcyBiZWluZyBkZWFkLCB3aGVyZWFzIHdlIGRvIG5lZWQgdGhlCisgICAgICogYXNzaWdubWVudCBvbiB0aGUgc3VjY2Vzc2Z1bCAoaS5lLiwgbm9uLWFib3J0KSBwYXRoLgorICAgICAqLworICAgIF9fYXNtX18gdm9sYXRpbGUgKCIxOiAuYnl0ZSAgMHhDNzsgLmJ5dGUgMHhGODtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAiICAgLmxvbmcgIDFmLTFiLTZcbiIKKyAgICAgICAgICAgICAgICAgICAgICAiICAgIGptcCAgIDJmXG4iCisgICAgICAgICAgICAgICAgICAgICAgIjE6ICBtb3ZsICAlJWVheCwlMFxuIgorICAgICAgICAgICAgICAgICAgICAgICIyOiIKKyAgICAgICAgICAgICAgICAgICAgICA6IityIihyZXMpOjoibWVtb3J5IiwiJWVheCIpOworI2VuZGlmIC8vIEtNUF9PU19XSU5ET1dTCisgICAgcmV0dXJuIHJlczsKK30KKworLyoKKyAgVHJhbnNhY3Rpb24gZW5kCisqLworc3RhdGljIF9faW5saW5lIHZvaWQgX3hlbmQoKQoreworI2lmIEtNUF9PU19XSU5ET1dTCisgICAgX19hc20gIHsKKyAgICAgICAgX2VtaXQgMHgwZgorICAgICAgICBfZW1pdCAweDAxCisgICAgICAgIF9lbWl0IDB4ZDUKKyAgICB9CisjZWxzZQorICAgIF9fYXNtX18gdm9sYXRpbGUgKCIuYnl0ZSAweDBmOyAuYnl0ZSAweDAxOyAuYnl0ZSAweGQ1IiA6OjoibWVtb3J5Iik7CisjZW5kaWYKK30KKworLyoKKyAgVGhpcyBpcyBhIG1hY3JvLCB0aGUgYXJndW1lbnQgbXVzdCBiZSBhIHNpbmdsZSBieXRlIGNvbnN0YW50IHdoaWNoCisgIGNhbiBiZSBldmFsdWF0ZWQgYnkgdGhlIGlubGluZSBhc3NlbWJsZXIsIHNpbmNlIGl0IGlzIGVtaXR0ZWQgYXMgYQorICBieXRlIGludG8gdGhlIGFzc2VtYmx5IGNvZGUuCisqLworI2lmIEtNUF9PU19XSU5ET1dTCisjZGVmaW5lIF94YWJvcnQoQVJHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX2FzbSBfZW1pdCAweGM2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX2FzbSBfZW1pdCAweGY4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX2FzbSBfZW1pdCBBUkcKKyNlbHNlCisjZGVmaW5lIF94YWJvcnQoQVJHKSBcCisgICAgX19hc21fXyB2b2xhdGlsZSAoIi5ieXRlIDB4QzY7IC5ieXRlIDB4Rjg7IC5ieXRlICIgU1RSSU5HSVpFKEFSRykgOjo6Im1lbW9yeSIpOworI2VuZGlmCisKKy8vCisvLyAgICBTdGF0aXN0aWNzIGlzIGNvbGxlY3RlZCBmb3IgdGVzdGluZyBwdXJwb3NlCisvLworI2lmIEtNUF9ERUJVR19BREFQVElWRV9MT0NLUworCisvLyBXZSBhY2N1bXVsYXRlIHNwZWN1bGF0aXZlIGxvY2sgc3RhdGlzdGljcyB3aGVuIHRoZSBsb2NrIGlzIGRlc3Ryb3llZC4KKy8vIFdlIGtlZXAgbG9ja3MgdGhhdCBoYXZlbid0IGJlZW4gZGVzdHJveWVkIGluIHRoZSBsaXZlTG9ja3MgbGlzdAorLy8gc28gdGhhdCB3ZSBjYW4gZ3JhYiB0aGVpciBzdGF0aXN0aWNzIHRvby4KK3N0YXRpYyBrbXBfYWRhcHRpdmVfbG9ja19zdGF0aXN0aWNzX3QgZGVzdHJveWVkU3RhdHM7CisKKy8vIFRvIGhvbGQgdGhlIGxpc3Qgb2YgbGl2ZSBsb2Nrcy4KK3N0YXRpYyBrbXBfYWRhcHRpdmVfbG9ja19pbmZvX3QgbGl2ZUxvY2tzOworCisvLyBBIGxvY2sgc28gd2UgY2FuIHNhZmVseSB1cGRhdGUgdGhlIGxpc3Qgb2YgbG9ja3MuCitzdGF0aWMga21wX2Jvb3RzdHJhcF9sb2NrX3QgY2hhaW5fbG9jazsKKworLy8gSW5pdGlhbGl6ZSB0aGUgbGlzdCBvZiBzdGF0cy4KK3ZvaWQKK19fa21wX2luaXRfc3BlY3VsYXRpdmVfc3RhdHMoKQoreworICAgIGttcF9hZGFwdGl2ZV9sb2NrX2luZm9fdCAqbGNrID0gJmxpdmVMb2NrczsKKworICAgIG1lbXNldCggKCB2b2lkICogKSAmICggbGNrLT5zdGF0cyApLCAwLCBzaXplb2YoIGxjay0+c3RhdHMgKSApOworICAgIGxjay0+c3RhdHMubmV4dCA9IGxjazsKKyAgICBsY2stPnN0YXRzLnByZXYgPSBsY2s7CisKKyAgICBLTVBfQVNTRVJUKCBsY2stPnN0YXRzLm5leHQtPnN0YXRzLnByZXYgPT0gbGNrICk7CisgICAgS01QX0FTU0VSVCggbGNrLT5zdGF0cy5wcmV2LT5zdGF0cy5uZXh0ID09IGxjayApOworCisgICAgX19rbXBfaW5pdF9ib290c3RyYXBfbG9jayggJmNoYWluX2xvY2sgKTsKKworfQorCisvLyBJbnNlcnQgdGhlIGxvY2sgaW50byB0aGUgY2lyY3VsYXIgbGlzdAorc3RhdGljIHZvaWQKK19fa21wX3JlbWVtYmVyX2xvY2soIGttcF9hZGFwdGl2ZV9sb2NrX2luZm9fdCAqIGxjayApCit7CisgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJmNoYWluX2xvY2sgKTsKKworICAgIGxjay0+c3RhdHMubmV4dCA9IGxpdmVMb2Nrcy5zdGF0cy5uZXh0OworICAgIGxjay0+c3RhdHMucHJldiA9ICZsaXZlTG9ja3M7CisKKyAgICBsaXZlTG9ja3Muc3RhdHMubmV4dCA9IGxjazsKKyAgICBsY2stPnN0YXRzLm5leHQtPnN0YXRzLnByZXYgID0gbGNrOworCisgICAgS01QX0FTU0VSVCggbGNrLT5zdGF0cy5uZXh0LT5zdGF0cy5wcmV2ID09IGxjayApOworICAgIEtNUF9BU1NFUlQoIGxjay0+c3RhdHMucHJldi0+c3RhdHMubmV4dCA9PSBsY2sgKTsKKworICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICZjaGFpbl9sb2NrICk7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9mb3JnZXRfbG9jaygga21wX2FkYXB0aXZlX2xvY2tfaW5mb190ICogbGNrICkKK3sKKyAgICBLTVBfQVNTRVJUKCBsY2stPnN0YXRzLm5leHQtPnN0YXRzLnByZXYgPT0gbGNrICk7CisgICAgS01QX0FTU0VSVCggbGNrLT5zdGF0cy5wcmV2LT5zdGF0cy5uZXh0ID09IGxjayApOworCisgICAga21wX2FkYXB0aXZlX2xvY2tfaW5mb190ICogbiA9IGxjay0+c3RhdHMubmV4dDsKKyAgICBrbXBfYWRhcHRpdmVfbG9ja19pbmZvX3QgKiBwID0gbGNrLT5zdGF0cy5wcmV2OworCisgICAgbi0+c3RhdHMucHJldiA9IHA7CisgICAgcC0+c3RhdHMubmV4dCA9IG47Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF96ZXJvX3NwZWN1bGF0aXZlX3N0YXRzKCBrbXBfYWRhcHRpdmVfbG9ja19pbmZvX3QgKiBsY2sgKQoreworICAgIG1lbXNldCggKCB2b2lkICogKSZsY2stPnN0YXRzLCAwLCBzaXplb2YoIGxjay0+c3RhdHMgKSApOworICAgIF9fa21wX3JlbWVtYmVyX2xvY2soIGxjayApOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfYWRkX3N0YXRzKCBrbXBfYWRhcHRpdmVfbG9ja19zdGF0aXN0aWNzX3QgKiB0LCBrbXBfYWRhcHRpdmVfbG9ja19pbmZvX3QgKiBsY2sgKQoreworICAgIGttcF9hZGFwdGl2ZV9sb2NrX3N0YXRpc3RpY3NfdCB2b2xhdGlsZSAqcyA9ICZsY2stPnN0YXRzOworCisgICAgdC0+bm9uU3BlY3VsYXRpdmVBY3F1aXJlQXR0ZW1wdHMgKz0gbGNrLT5hY3F1aXJlX2F0dGVtcHRzOworICAgIHQtPnN1Y2Nlc3NmdWxTcGVjdWxhdGlvbnMgKz0gcy0+c3VjY2Vzc2Z1bFNwZWN1bGF0aW9uczsKKyAgICB0LT5oYXJkRmFpbGVkU3BlY3VsYXRpb25zICs9IHMtPmhhcmRGYWlsZWRTcGVjdWxhdGlvbnM7CisgICAgdC0+c29mdEZhaWxlZFNwZWN1bGF0aW9ucyArPSBzLT5zb2Z0RmFpbGVkU3BlY3VsYXRpb25zOworICAgIHQtPm5vblNwZWN1bGF0aXZlQWNxdWlyZXMgKz0gcy0+bm9uU3BlY3VsYXRpdmVBY3F1aXJlczsKKyAgICB0LT5sZW1taW5nWWllbGRzICAgICAgICAgICs9IHMtPmxlbW1pbmdZaWVsZHM7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9hY2N1bXVsYXRlX3NwZWN1bGF0aXZlX3N0YXRzKCBrbXBfYWRhcHRpdmVfbG9ja19pbmZvX3QgKiBsY2spCit7CisgICAga21wX2FkYXB0aXZlX2xvY2tfc3RhdGlzdGljc190ICp0ID0gJmRlc3Ryb3llZFN0YXRzOworCisgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJmNoYWluX2xvY2sgKTsKKworICAgIF9fa21wX2FkZF9zdGF0cyggJmRlc3Ryb3llZFN0YXRzLCBsY2sgKTsKKyAgICBfX2ttcF9mb3JnZXRfbG9jayggbGNrICk7CisKKyAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmY2hhaW5fbG9jayApOworfQorCitzdGF0aWMgZmxvYXQKK3BlcmNlbnQgKGttcF91aW50MzIgY291bnQsIGttcF91aW50MzIgdG90YWwpCit7CisgICAgcmV0dXJuICh0b3RhbCA9PSAwKSA/IDAuMDogKDEwMC4wICogY291bnQpL3RvdGFsOworfQorCitzdGF0aWMKK0ZJTEUgKiBfX2ttcF9vcGVuX3N0YXRzX2ZpbGUoKQoreworICAgIGlmIChzdHJjbXAgKF9fa21wX3NwZWN1bGF0aXZlX3N0YXRzZmlsZSwgIi0iKSA9PSAwKQorICAgICAgICByZXR1cm4gc3Rkb3V0OworCisgICAgc2l6ZV90IGJ1ZmZMZW4gPSBzdHJsZW4oIF9fa21wX3NwZWN1bGF0aXZlX3N0YXRzZmlsZSApICsgMjA7CisgICAgY2hhciBidWZmZXJbYnVmZkxlbl07CisgICAgc25wcmludGYgKCZidWZmZXJbMF0sIGJ1ZmZMZW4sIF9fa21wX3NwZWN1bGF0aXZlX3N0YXRzZmlsZSwKKyAgICAgIChrbXBfaW50MzIpZ2V0cGlkKCkpOworICAgIEZJTEUgKiByZXN1bHQgPSBmb3BlbigmYnVmZmVyWzBdLCAidyIpOworCisgICAgLy8gTWF5YmUgd2Ugc2hvdWxkIGlzc3VlIGEgd2FybmluZyBoZXJlLi4uCisgICAgcmV0dXJuIHJlc3VsdCA/IHJlc3VsdCA6IHN0ZG91dDsKK30KKwordm9pZAorX19rbXBfcHJpbnRfc3BlY3VsYXRpdmVfc3RhdHMoKQoreworICAgIGlmIChfX2ttcF91c2VyX2xvY2tfa2luZCAhPSBsa19hZGFwdGl2ZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgRklMRSAqIHN0YXRzRmlsZSA9IF9fa21wX29wZW5fc3RhdHNfZmlsZSgpOworCisgICAga21wX2FkYXB0aXZlX2xvY2tfc3RhdGlzdGljc190IHRvdGFsID0gZGVzdHJveWVkU3RhdHM7CisgICAga21wX2FkYXB0aXZlX2xvY2tfaW5mb190ICpsY2s7CisKKyAgICBmb3IgKGxjayA9IGxpdmVMb2Nrcy5zdGF0cy5uZXh0OyBsY2sgIT0gJmxpdmVMb2NrczsgbGNrID0gbGNrLT5zdGF0cy5uZXh0KSB7CisgICAgICAgIF9fa21wX2FkZF9zdGF0cyggJnRvdGFsLCBsY2sgKTsKKyAgICB9CisgICAga21wX2FkYXB0aXZlX2xvY2tfc3RhdGlzdGljc190ICp0ID0gJnRvdGFsOworICAgIGttcF91aW50MzIgdG90YWxTZWN0aW9ucyAgICAgPSB0LT5ub25TcGVjdWxhdGl2ZUFjcXVpcmVzICsgdC0+c3VjY2Vzc2Z1bFNwZWN1bGF0aW9uczsKKyAgICBrbXBfdWludDMyIHRvdGFsU3BlY3VsYXRpb25zID0gdC0+c3VjY2Vzc2Z1bFNwZWN1bGF0aW9ucyArIHQtPmhhcmRGYWlsZWRTcGVjdWxhdGlvbnMgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LT5zb2Z0RmFpbGVkU3BlY3VsYXRpb25zOworCisgICAgZnByaW50ZiAoIHN0YXRzRmlsZSwgIlNwZWN1bGF0aXZlIGxvY2sgc3RhdGlzdGljcyAoYWxsIGFwcHJveGltYXRlISlcbiIpOworICAgIGZwcmludGYgKCBzdGF0c0ZpbGUsICIgTG9jayBwYXJhbWV0ZXJzOiBcbiIKKyAgICAgICAgICAgICAiICAgbWF4X3NvZnRfcmV0cmllcyAgICAgICAgICAgICAgIDogJTEwZFxuIgorICAgICAgICAgICAgICIgICBtYXhfYmFkbmVzcyAgICAgICAgICAgICAgICAgICAgOiAlMTBkXG4iLAorICAgICAgICAgICAgIF9fa21wX2FkYXB0aXZlX2JhY2tvZmZfcGFyYW1zLm1heF9zb2Z0X3JldHJpZXMsCisgICAgICAgICAgICAgX19rbXBfYWRhcHRpdmVfYmFja29mZl9wYXJhbXMubWF4X2JhZG5lc3MpOworICAgIGZwcmludGYoIHN0YXRzRmlsZSwgIiBOb24tc3BlY3VsYXRpdmUgYWNxdWlyZSBhdHRlbXB0cyA6ICUxMGRcbiIsIHQtPm5vblNwZWN1bGF0aXZlQWNxdWlyZUF0dGVtcHRzICk7CisgICAgZnByaW50Ziggc3RhdHNGaWxlLCAiIFRvdGFsIGNyaXRpY2FsIHNlY3Rpb25zICAgICAgICAgIDogJTEwZFxuIiwgdG90YWxTZWN0aW9ucyApOworICAgIGZwcmludGYoIHN0YXRzRmlsZSwgIiBTdWNjZXNzZnVsIHNwZWN1bGF0aW9ucyAgICAgICAgICA6ICUxMGQgKCU1LjFmJSUpXG4iLAorICAgICAgICAgICAgIHQtPnN1Y2Nlc3NmdWxTcGVjdWxhdGlvbnMsIHBlcmNlbnQoIHQtPnN1Y2Nlc3NmdWxTcGVjdWxhdGlvbnMsIHRvdGFsU2VjdGlvbnMgKSApOworICAgIGZwcmludGYoIHN0YXRzRmlsZSwgIiBOb24tc3BlY3VsYXRpdmUgYWNxdWlyZXMgICAgICAgICA6ICUxMGQgKCU1LjFmJSUpXG4iLAorICAgICAgICAgICAgIHQtPm5vblNwZWN1bGF0aXZlQWNxdWlyZXMsIHBlcmNlbnQoIHQtPm5vblNwZWN1bGF0aXZlQWNxdWlyZXMsIHRvdGFsU2VjdGlvbnMgKSApOworICAgIGZwcmludGYoIHN0YXRzRmlsZSwgIiBMZW1taW5nIHlpZWxkcyAgICAgICAgICAgICAgICAgICA6ICUxMGRcblxuIiwgdC0+bGVtbWluZ1lpZWxkcyApOworCisgICAgZnByaW50Ziggc3RhdHNGaWxlLCAiIFNwZWN1bGF0aXZlIGFjcXVpcmUgYXR0ZW1wdHMgICAgIDogJTEwZFxuIiwgdG90YWxTcGVjdWxhdGlvbnMgKTsKKyAgICBmcHJpbnRmKCBzdGF0c0ZpbGUsICIgU3VjY2Vzc2VzICAgICAgICAgICAgICAgICAgICAgICAgOiAlMTBkICglNS4xZiUlKVxuIiwKKyAgICAgICAgICAgICB0LT5zdWNjZXNzZnVsU3BlY3VsYXRpb25zLCBwZXJjZW50KCB0LT5zdWNjZXNzZnVsU3BlY3VsYXRpb25zLCB0b3RhbFNwZWN1bGF0aW9ucyApICk7CisgICAgZnByaW50Ziggc3RhdHNGaWxlLCAiIFNvZnQgZmFpbHVyZXMgICAgICAgICAgICAgICAgICAgIDogJTEwZCAoJTUuMWYlJSlcbiIsCisgICAgICAgICAgICAgdC0+c29mdEZhaWxlZFNwZWN1bGF0aW9ucywgcGVyY2VudCggdC0+c29mdEZhaWxlZFNwZWN1bGF0aW9ucywgdG90YWxTcGVjdWxhdGlvbnMgKSApOworICAgIGZwcmludGYoIHN0YXRzRmlsZSwgIiBIYXJkIGZhaWx1cmVzICAgICAgICAgICAgICAgICAgICA6ICUxMGQgKCU1LjFmJSUpXG4iLAorICAgICAgICAgICAgIHQtPmhhcmRGYWlsZWRTcGVjdWxhdGlvbnMsIHBlcmNlbnQoIHQtPmhhcmRGYWlsZWRTcGVjdWxhdGlvbnMsIHRvdGFsU3BlY3VsYXRpb25zICkgKTsKKworICAgIGlmIChzdGF0c0ZpbGUgIT0gc3Rkb3V0KQorICAgICAgICBmY2xvc2UoIHN0YXRzRmlsZSApOworfQorCisjIGRlZmluZSBLTVBfSU5DX1NUQVQobGNrLHN0YXQpICggbGNrLT5say5hZGFwdGl2ZS5zdGF0cy5zdGF0KysgKQorI2Vsc2UKKyMgZGVmaW5lIEtNUF9JTkNfU1RBVChsY2ssc3RhdCkKKworI2VuZGlmIC8vIEtNUF9ERUJVR19BREFQVElWRV9MT0NLUworCitzdGF0aWMgaW5saW5lIGJvb2wKK19fa21wX2lzX3VubG9ja2VkX3F1ZXVpbmdfbG9jaygga21wX3F1ZXVpbmdfbG9ja190ICpsY2sgKQoreworICAgIC8vIEl0IGlzIGVub3VnaCB0byBjaGVjayB0aGF0IHRoZSBoZWFkX2lkIGlzIHplcm8uCisgICAgLy8gV2UgZG9uJ3QgYWxzbyBuZWVkIHRvIGNoZWNrIHRoZSB0YWlsLgorICAgIGJvb2wgcmVzID0gbGNrLT5say5oZWFkX2lkID09IDA7CisKKyAgICAvLyBXZSBuZWVkIGEgZmVuY2UgaGVyZSwgc2luY2Ugd2UgbXVzdCBlbnN1cmUgdGhhdCBubyBtZW1vcnkgb3BlcmF0aW9ucworICAgIC8vIGZyb20gbGF0ZXIgaW4gdGhpcyB0aHJlYWQgZmxvYXQgYWJvdmUgdGhhdCByZWFkLgorI2lmIEtNUF9DT01QSUxFUl9JQ0MKKyAgICBfbW1fbWZlbmNlKCk7CisjZWxzZQorICAgIF9fc3luY19zeW5jaHJvbml6ZSgpOworI2VuZGlmCisKKyAgICByZXR1cm4gcmVzOworfQorCisvLyBGdW5jdGlvbnMgZm9yIG1hbmlwdWxhdGluZyB0aGUgYmFkbmVzcworc3RhdGljIF9faW5saW5lIHZvaWQKK19fa21wX3VwZGF0ZV9iYWRuZXNzX2FmdGVyX3N1Y2Nlc3MoIGttcF9hZGFwdGl2ZV9sb2NrX3QgKmxjayApCit7CisgICAgLy8gUmVzZXQgdGhlIGJhZG5lc3MgdG8gemVybyBzbyB3ZSBlYWdlcmx5IHRyeSB0byBzcGVjdWxhdGUgYWdhaW4KKyAgICBsY2stPmxrLmFkYXB0aXZlLmJhZG5lc3MgPSAwOworICAgIEtNUF9JTkNfU1RBVChsY2ssc3VjY2Vzc2Z1bFNwZWN1bGF0aW9ucyk7Cit9CisKKy8vIENyZWF0ZSBhIGJpdCBtYXNrIHdpdGggb25lIG1vcmUgc2V0IGJpdC4KK3N0YXRpYyBfX2lubGluZSB2b2lkCitfX2ttcF9zdGVwX2JhZG5lc3MoIGttcF9hZGFwdGl2ZV9sb2NrX3QgKmxjayApCit7CisgICAga21wX3VpbnQzMiBuZXdCYWRuZXNzID0gKCBsY2stPmxrLmFkYXB0aXZlLmJhZG5lc3MgPDwgMSApIHwgMTsKKyAgICBpZiAoIG5ld0JhZG5lc3MgPiBsY2stPmxrLmFkYXB0aXZlLm1heF9iYWRuZXNzKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgeworICAgICAgICBsY2stPmxrLmFkYXB0aXZlLmJhZG5lc3MgPSBuZXdCYWRuZXNzOworICAgIH0KK30KKworLy8gQ2hlY2sgd2hldGhlciBzcGVjdWxhdGlvbiBzaG91bGQgYmUgYXR0ZW1wdGVkLgorc3RhdGljIF9faW5saW5lIGludAorX19rbXBfc2hvdWxkX3NwZWN1bGF0ZSgga21wX2FkYXB0aXZlX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAga21wX3VpbnQzMiBiYWRuZXNzID0gbGNrLT5say5hZGFwdGl2ZS5iYWRuZXNzOworICAgIGttcF91aW50MzIgYXR0ZW1wdHM9IGxjay0+bGsuYWRhcHRpdmUuYWNxdWlyZV9hdHRlbXB0czsKKyAgICBpbnQgcmVzID0gKGF0dGVtcHRzICYgYmFkbmVzcykgPT0gMDsKKyAgICByZXR1cm4gcmVzOworfQorCisvLyBBdHRlbXB0IHRvIGFjcXVpcmUgb25seSB0aGUgc3BlY3VsYXRpdmUgbG9jay4KKy8vIERvZXMgbm90IGJhY2sgb2ZmIHRvIHRoZSBub24tc3BlY3VsYXRpdmUgbG9jay4KKy8vCitzdGF0aWMgaW50CitfX2ttcF90ZXN0X2FkYXB0aXZlX2xvY2tfb25seSgga21wX2FkYXB0aXZlX2xvY2tfdCAqIGxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGludCByZXRyaWVzID0gbGNrLT5say5hZGFwdGl2ZS5tYXhfc29mdF9yZXRyaWVzOworCisgICAgLy8gV2UgZG9uJ3QgZXhwbGljaXRseSBjb3VudCB0aGUgc3RhcnQgb2Ygc3BlY3VsYXRpb24sIHJhdGhlciB3ZSByZWNvcmQKKyAgICAvLyB0aGUgcmVzdWx0cyAoc3VjY2VzcywgaGFyZCBmYWlsLCBzb2Z0IGZhaWwpLiBUaGUgc3VtIG9mIGFsbCBvZiB0aG9zZQorICAgIC8vIGlzIHRoZSB0b3RhbCBudW1iZXIgb2YgdGltZXMgd2Ugc3RhcnRlZCBzcGVjdWxhdGlvbiBzaW5jZSBhbGwKKyAgICAvLyBzcGVjdWxhdGlvbnMgbXVzdCBlbmQgb25lIG9mIHRob3NlIHdheXMuCisgICAgZG8KKyAgICB7CisgICAgICAgIGttcF91aW50MzIgc3RhdHVzID0gX3hiZWdpbigpOworICAgICAgICAvLyBTd2l0Y2ggdGhpcyBpbiB0byBkaXNhYmxlIGFjdHVhbCBzcGVjdWxhdGlvbiBidXQgZXhlcmNpc2UKKyAgICAgICAgLy8gYXQgbGVhc3Qgc29tZSBvZiB0aGUgcmVzdCBvZiB0aGUgY29kZS4gVXNlZnVsIGZvciBkZWJ1Z2dpbmcuLi4KKyAgICAgICAgLy8ga21wX3VpbnQzMiBzdGF0dXMgPSBfWEFCT1JUX05FU1RFRDsKKworICAgICAgICBpZiAoc3RhdHVzID09IF9YQkVHSU5fU1RBUlRFRCApCisgICAgICAgIHsgLyogV2UgaGF2ZSBzdWNjZXNzZnVsbHkgc3RhcnRlZCBzcGVjdWxhdGlvbgorICAgICAgICAgICAqIENoZWNrIHRoYXQgbm8tb25lIGFjcXVpcmVkIHRoZSBsb2NrIGZvciByZWFsIGJldHdlZW4gd2hlbiB3ZSBsYXN0IGxvb2tlZAorICAgICAgICAgICAqIGFuZCBub3cuIFRoaXMgYWxzbyBnZXRzIHRoZSBsb2NrIGNhY2hlIGxpbmUgaW50byBvdXIgcmVhZC1zZXQsCisgICAgICAgICAgICogd2hpY2ggd2UgbmVlZCBzbyB0aGF0IHdlJ2xsIGFib3J0IGlmIGFueW9uZSBsYXRlciBjbGFpbXMgaXQgZm9yIHJlYWwuCisgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoISBfX2ttcF9pc191bmxvY2tlZF9xdWV1aW5nX2xvY2soIEdFVF9RTEtfUFRSKGxjaykgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gTG9jayBpcyBub3cgdmlzaWJseSBhY3F1aXJlZCwgc28gc29tZW9uZSBiZWF0IHVzIHRvIGl0LgorICAgICAgICAgICAgICAgIC8vIEFib3J0IHRoZSB0cmFuc2FjdGlvbiBzbyB3ZSdsbCByZXN0YXJ0IGZyb20gX3hiZWdpbiB3aXRoIHRoZQorICAgICAgICAgICAgICAgIC8vIGZhaWx1cmUgc3RhdHVzLgorICAgICAgICAgICAgICAgIF94YWJvcnQoMHgwMSkKKyAgICAgICAgICAgICAgICBLTVBfQVNTRVJUMiggMCwgInNob3VsZCBub3QgZ2V0IGhlcmUiICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gMTsgICAvLyBMb2NrIGhhcyBiZWVuIGFjcXVpcmVkIChzcGVjdWxhdGl2ZWx5KQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gV2UgaGF2ZSBhYm9ydGVkLCB1cGRhdGUgdGhlIHN0YXRpc3RpY3MKKyAgICAgICAgICAgIGlmICggc3RhdHVzICYgU09GVF9BQk9SVF9NQVNLKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEtNUF9JTkNfU1RBVChsY2ssc29mdEZhaWxlZFNwZWN1bGF0aW9ucyk7CisgICAgICAgICAgICAgICAgLy8gYW5kIGxvb3Agcm91bmQgdG8gcmV0cnkuCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgS01QX0lOQ19TVEFUKGxjayxoYXJkRmFpbGVkU3BlY3VsYXRpb25zKTsKKyAgICAgICAgICAgICAgICAvLyBHaXZlIHVwIGlmIHdlIGhhZCBhIGhhcmQgZmFpbHVyZS4KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gIHdoaWxlKCByZXRyaWVzLS0gKTsgLy8gTG9vcCB3aGlsZSB3ZSBoYXZlIHJldHJpZXMsIGFuZCBkaWRuJ3QgZmFpbCBoYXJkLgorCisgICAgLy8gRWl0aGVyIHdlIGhhZCBhIGhhcmQgZmFpbHVyZSBvciB3ZSBkaWRuJ3Qgc3VjY2VlZCBzb2Z0bHkgYWZ0ZXIKKyAgICAvLyB0aGUgZnVsbCBzZXQgb2YgYXR0ZW1wdHMsIHNvIGJhY2sgb2ZmIHRoZSBiYWRuZXNzLgorICAgIF9fa21wX3N0ZXBfYmFkbmVzcyggbGNrICk7CisgICAgcmV0dXJuIDA7Cit9CisKKy8vIEF0dGVtcHQgdG8gYWNxdWlyZSB0aGUgc3BlY3VsYXRpdmUgbG9jaywgb3IgYmFjayBvZmYgdG8gdGhlIG5vbi1zcGVjdWxhdGl2ZSBvbmUKKy8vIGlmIHRoZSBzcGVjdWxhdGl2ZSBsb2NrIGNhbm5vdCBiZSBhY3F1aXJlZC4KKy8vIFdlIGNhbiBzdWNjZWVkIHNwZWN1bGF0aXZlbHksIG5vbi1zcGVjdWxhdGl2ZWx5LCBvciBmYWlsLgorc3RhdGljIGludAorX19rbXBfdGVzdF9hZGFwdGl2ZV9sb2NrKCBrbXBfYWRhcHRpdmVfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICAvLyBGaXJzdCB0cnkgdG8gYWNxdWlyZSB0aGUgbG9jayBzcGVjdWxhdGl2ZWx5CisgICAgaWYgKCBfX2ttcF9zaG91bGRfc3BlY3VsYXRlKCBsY2ssIGd0aWQgKSAmJiBfX2ttcF90ZXN0X2FkYXB0aXZlX2xvY2tfb25seSggbGNrLCBndGlkICkgKQorICAgICAgICByZXR1cm4gMTsKKworICAgIC8vIFNwZWN1bGF0aXZlIGFjcXVpc2l0aW9uIGZhaWxlZCwgc28gdHJ5IHRvIGFjcXVpcmUgaXQgbm9uLXNwZWN1bGF0aXZlbHkuCisgICAgLy8gQ291bnQgdGhlIG5vbi1zcGVjdWxhdGl2ZSBhY3F1aXJlIGF0dGVtcHQKKyAgICBsY2stPmxrLmFkYXB0aXZlLmFjcXVpcmVfYXR0ZW1wdHMrKzsKKworICAgIC8vIFVzZSBiYXNlLCBub24tc3BlY3VsYXRpdmUgbG9jay4KKyAgICBpZiAoIF9fa21wX3Rlc3RfcXVldWluZ19sb2NrKCBHRVRfUUxLX1BUUihsY2spLCBndGlkICkgKQorICAgIHsKKyAgICAgICAgS01QX0lOQ19TVEFUKGxjayxub25TcGVjdWxhdGl2ZUFjcXVpcmVzKTsKKyAgICAgICAgcmV0dXJuIDE7ICAgICAgIC8vIExvY2sgaXMgYWNxdWlyZWQgKG5vbi1zcGVjdWxhdGl2ZWx5KQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gMDsgICAgICAgLy8gRmFpbGVkIHRvIGFjcXVpcmUgdGhlIGxvY2ssIGl0J3MgYWxyZWFkeSB2aXNpYmx5IGxvY2tlZC4KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQKK19fa21wX3Rlc3RfYWRhcHRpdmVfbG9ja193aXRoX2NoZWNrcygga21wX2FkYXB0aXZlX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3Rlc3RfbG9jayI7CisgICAgaWYgKCBsY2stPmxrLnFsay5pbml0aWFsaXplZCAhPSBHRVRfUUxLX1BUUihsY2spICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICB9CisKKyAgICBpbnQgcmV0dmFsID0gX19rbXBfdGVzdF9hZGFwdGl2ZV9sb2NrKCBsY2ssIGd0aWQgKTsKKworICAgIGlmICggcmV0dmFsICkgeworICAgICAgICBsY2stPmxrLnFsay5vd25lcl9pZCA9IGd0aWQgKyAxOworICAgIH0KKyAgICByZXR1cm4gcmV0dmFsOworfQorCisvLyBCbG9jayB1bnRpbCB3ZSBjYW4gYWNxdWlyZSBhIHNwZWN1bGF0aXZlLCBhZGFwdGl2ZSBsb2NrLgorLy8gV2UgY2hlY2sgd2hldGhlciB3ZSBzaG91bGQgYmUgdHJ5aW5nIHRvIHNwZWN1bGF0ZS4KKy8vIElmIHdlIHNob3VsZCBiZSwgd2UgY2hlY2sgdGhlIHJlYWwgbG9jayB0byBzZWUgaWYgaXQgaXMgZnJlZSwKKy8vIGFuZCwgaWYgbm90LCBwYXVzZSB3aXRob3V0IGF0dGVtcHRpbmcgdG8gYWNxdWlyZSBpdCB1bnRpbCBpdCBpcy4KKy8vIFRoZW4gd2UgdHJ5IHRoZSBzcGVjdWxhdGl2ZSBhY3F1aXJlLgorLy8gVGhpcyBtZWFucyB0aGF0IGFsdGhvdWdoIHdlIHN1ZmZlciBmcm9tIGxlbW1pbmdzIGEgbGl0dGxlICgKKy8vIGJlY2F1c2UgYWxsIHdlIGNhbid0IGFjcXVpcmUgdGhlIGxvY2sgc3BlY3VsYXRpdmVseSB1bnRpbAorLy8gdGhlIHF1ZXVlIG9mIHRocmVhZHMgd2FpdGluZyBoYXMgY2xlYXJlZCksIHdlIGRvbid0IGdldCBpbnRvIGEKKy8vIHN0YXRlIHdoZXJlIHdlIGNhbiBuZXZlciBhY3F1aXJlIHRoZSBsb2NrIHNwZWN1bGF0aXZlbHkgKGJlY2F1c2Ugd2UKKy8vIGZvcmNlIHRoZSBxdWV1ZSB0byBjbGVhciBieSBwcmV2ZW50aW5nIG5ldyBhcnJpdmFscyBmcm9tIGVudGVyaW5nIHRoZQorLy8gcXVldWUpLgorLy8gVGhpcyBkb2VzIG1lYW4gdGhhdCB3aGVuIHdlJ3JlIHRyeWluZyB0byBicmVhayBsZW1taW5ncywgdGhlIGxvY2sKKy8vIGlzIG5vIGxvbmdlciBmYWlyLiBIb3dldmVyIE9wZW5NUCBtYWtlcyBubyBndWFyYW50ZWUgdGhhdCBpdHMKKy8vIGxvY2tzIGFyZSBmYWlyLCBzbyB0aGlzIGlzbid0IGEgcmVhbCBwcm9ibGVtLgorc3RhdGljIHZvaWQKK19fa21wX2FjcXVpcmVfYWRhcHRpdmVfbG9jaygga21wX2FkYXB0aXZlX2xvY2tfdCAqIGxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGlmICggX19rbXBfc2hvdWxkX3NwZWN1bGF0ZSggbGNrLCBndGlkICkgKQorICAgIHsKKyAgICAgICAgaWYgKCBfX2ttcF9pc191bmxvY2tlZF9xdWV1aW5nX2xvY2soIEdFVF9RTEtfUFRSKGxjaykgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggX19rbXBfdGVzdF9hZGFwdGl2ZV9sb2NrX29ubHkoIGxjayAsIGd0aWQgKSApCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgLy8gV2UgdHJpZWQgc3BlY3VsYXRpb24gYW5kIGZhaWxlZCwgc28gZ2l2ZSB1cC4KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFdlIGNhbid0IHRyeSBzcGVjdWxhdGlvbiB1bnRpbCB0aGUgbG9jayBpcyBmcmVlLCBzbyB3ZQorICAgICAgICAgICAgLy8gcGF1c2UgaGVyZSAod2l0aG91dCBzdXNwZW5kaW5nIG9uIHRoZSBxdWV1ZWluZyBsb2NrLAorICAgICAgICAgICAgLy8gdG8gYWxsb3cgaXQgdG8gZHJhaW4sIHRoZW4gdHJ5IGFnYWluLgorICAgICAgICAgICAgLy8gQWxsIG90aGVyIHRocmVhZHMgd2lsbCBhbHNvIHNlZSB0aGUgc2FtZSByZXN1bHQgZm9yCisgICAgICAgICAgICAvLyBzaG91bGRTcGVjdWxhdGUsIHNvIHdpbGwgYmUgZG9pbmcgdGhlIHNhbWUgaWYgdGhleQorICAgICAgICAgICAgLy8gdHJ5IHRvIGNsYWltIHRoZSBsb2NrIGZyb20gbm93IG9uLgorICAgICAgICAgICAgd2hpbGUgKCAhIF9fa21wX2lzX3VubG9ja2VkX3F1ZXVpbmdfbG9jayggR0VUX1FMS19QVFIobGNrKSApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBLTVBfSU5DX1NUQVQobGNrLGxlbW1pbmdZaWVsZHMpOworICAgICAgICAgICAgICAgIF9fa21wX3lpZWxkIChUUlVFKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBfX2ttcF90ZXN0X2FkYXB0aXZlX2xvY2tfb25seSggbGNrLCBndGlkICkgKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFNwZWN1bGF0aXZlIGFjcXVpc2l0aW9uIGZhaWxlZCwgc28gYWNxdWlyZSBpdCBub24tc3BlY3VsYXRpdmVseS4KKyAgICAvLyBDb3VudCB0aGUgbm9uLXNwZWN1bGF0aXZlIGFjcXVpcmUgYXR0ZW1wdAorICAgIGxjay0+bGsuYWRhcHRpdmUuYWNxdWlyZV9hdHRlbXB0cysrOworCisgICAgX19rbXBfYWNxdWlyZV9xdWV1aW5nX2xvY2tfdGltZWRfdGVtcGxhdGU8RkFMU0U+KCBHRVRfUUxLX1BUUihsY2spLCBndGlkICk7CisgICAgLy8gV2UgaGF2ZSBhY3F1aXJlZCB0aGUgYmFzZSBsb2NrLCBzbyBjb3VudCB0aGF0LgorICAgIEtNUF9JTkNfU1RBVChsY2ssbm9uU3BlY3VsYXRpdmVBY3F1aXJlcyApOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfYWNxdWlyZV9hZGFwdGl2ZV9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfYWRhcHRpdmVfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfc2V0X2xvY2siOworICAgIGlmICggbGNrLT5say5xbGsuaW5pdGlhbGl6ZWQgIT0gR0VUX1FMS19QVFIobGNrKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jICk7CisgICAgfQorICAgIGlmICggX19rbXBfZ2V0X3F1ZXVpbmdfbG9ja19vd25lciggR0VUX1FMS19QVFIobGNrKSApID09IGd0aWQgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzQWxyZWFkeU93bmVkLCBmdW5jICk7CisgICAgfQorCisgICAgX19rbXBfYWNxdWlyZV9hZGFwdGl2ZV9sb2NrKCBsY2ssIGd0aWQgKTsKKworICAgIGxjay0+bGsucWxrLm93bmVyX2lkID0gZ3RpZCArIDE7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9yZWxlYXNlX2FkYXB0aXZlX2xvY2soIGttcF9hZGFwdGl2ZV9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGlmICggX19rbXBfaXNfdW5sb2NrZWRfcXVldWluZ19sb2NrKCBHRVRfUUxLX1BUUihsY2spICkgKQorICAgIHsgICAvLyBJZiB0aGUgbG9jayBkb2Vzbid0IGxvb2sgY2xhaW1lZCB3ZSBtdXN0IGJlIHNwZWN1bGF0aW5nLgorICAgICAgICAvLyAoT3IgdGhlIHVzZXIncyBjb2RlIGlzIGJ1Z2d5IGFuZCB0aGV5J3JlIHJlbGVhc2luZyB3aXRob3V0IGxvY2tpbmc7CisgICAgICAgIC8vIGlmIHdlIGhhZCBYVEVTVCB3ZSdkIGJlIGFibGUgdG8gY2hlY2sgdGhhdCBjYXNlLi4uKQorICAgICAgICBfeGVuZCgpOyAgICAgICAgLy8gRXhpdCBzcGVjdWxhdGlvbgorICAgICAgICBfX2ttcF91cGRhdGVfYmFkbmVzc19hZnRlcl9zdWNjZXNzKCBsY2sgKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsgICAvLyBTaW5jZSB0aGUgbG9jayAqaXMqIHZpc2libHkgbG9ja2VkIHdlJ3JlIG5vdCBzcGVjdWxhdGluZywKKyAgICAgICAgLy8gc28gc2hvdWxkIHVzZSB0aGUgdW5kZXJseWluZyBsb2NrJ3MgcmVsZWFzZSBzY2hlbWUuCisgICAgICAgIF9fa21wX3JlbGVhc2VfcXVldWluZ19sb2NrKCBHRVRfUUxLX1BUUihsY2spLCBndGlkICk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorX19rbXBfcmVsZWFzZV9hZGFwdGl2ZV9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfYWRhcHRpdmVfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfdW5zZXRfbG9jayI7CisgICAgS01QX01CKCk7ICAvKiBpbiBjYXNlIGFub3RoZXIgcHJvY2Vzc29yIGluaXRpYWxpemVkIGxvY2sgKi8KKyAgICBpZiAoIGxjay0+bGsucWxrLmluaXRpYWxpemVkICE9IEdFVF9RTEtfUFRSKGxjaykgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgIH0KKyAgICBpZiAoIF9fa21wX2dldF9xdWV1aW5nX2xvY2tfb3duZXIoIEdFVF9RTEtfUFRSKGxjaykgKSA9PSAtMSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrVW5zZXR0aW5nRnJlZSwgZnVuYyApOworICAgIH0KKyAgICBpZiAoIF9fa21wX2dldF9xdWV1aW5nX2xvY2tfb3duZXIoIEdFVF9RTEtfUFRSKGxjaykgKSAhPSBndGlkICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tVbnNldHRpbmdTZXRCeUFub3RoZXIsIGZ1bmMgKTsKKyAgICB9CisgICAgbGNrLT5say5xbGsub3duZXJfaWQgPSAwOworICAgIF9fa21wX3JlbGVhc2VfYWRhcHRpdmVfbG9jayggbGNrLCBndGlkICk7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9pbml0X2FkYXB0aXZlX2xvY2soIGttcF9hZGFwdGl2ZV9sb2NrX3QgKmxjayApCit7CisgICAgX19rbXBfaW5pdF9xdWV1aW5nX2xvY2soIEdFVF9RTEtfUFRSKGxjaykgKTsKKyAgICBsY2stPmxrLmFkYXB0aXZlLmJhZG5lc3MgPSAwOworICAgIGxjay0+bGsuYWRhcHRpdmUuYWNxdWlyZV9hdHRlbXB0cyA9IDA7IC8vbm9uU3BlY3VsYXRpdmVBY3F1aXJlQXR0ZW1wdHMgPSAwOworICAgIGxjay0+bGsuYWRhcHRpdmUubWF4X3NvZnRfcmV0cmllcyA9IF9fa21wX2FkYXB0aXZlX2JhY2tvZmZfcGFyYW1zLm1heF9zb2Z0X3JldHJpZXM7CisgICAgbGNrLT5say5hZGFwdGl2ZS5tYXhfYmFkbmVzcyAgICAgID0gX19rbXBfYWRhcHRpdmVfYmFja29mZl9wYXJhbXMubWF4X2JhZG5lc3M7CisjaWYgS01QX0RFQlVHX0FEQVBUSVZFX0xPQ0tTCisgICAgX19rbXBfemVyb19zcGVjdWxhdGl2ZV9zdGF0cyggJmxjay0+bGsuYWRhcHRpdmUgKTsKKyNlbmRpZgorICAgIEtBX1RSQUNFKDEwMDAsICgiX19rbXBfaW5pdF9hZGFwdGl2ZV9sb2NrOiBsb2NrICVwIGluaXRpYWxpemVkXG4iLCBsY2spKTsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2luaXRfYWRhcHRpdmVfbG9ja193aXRoX2NoZWNrcygga21wX2FkYXB0aXZlX2xvY2tfdCAqIGxjayApCit7CisgICAgX19rbXBfaW5pdF9hZGFwdGl2ZV9sb2NrKCBsY2sgKTsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2Rlc3Ryb3lfYWRhcHRpdmVfbG9jaygga21wX2FkYXB0aXZlX2xvY2tfdCAqbGNrICkKK3sKKyNpZiBLTVBfREVCVUdfQURBUFRJVkVfTE9DS1MKKyAgICBfX2ttcF9hY2N1bXVsYXRlX3NwZWN1bGF0aXZlX3N0YXRzKCAmbGNrLT5say5hZGFwdGl2ZSApOworI2VuZGlmCisgICAgX19rbXBfZGVzdHJveV9xdWV1aW5nX2xvY2sgKEdFVF9RTEtfUFRSKGxjaykpOworICAgIC8vIE5vdGhpbmcgbmVlZGVkIGZvciB0aGUgc3BlY3VsYXRpdmUgcGFydC4KK30KKworc3RhdGljIHZvaWQKK19fa21wX2Rlc3Ryb3lfYWRhcHRpdmVfbG9ja193aXRoX2NoZWNrcygga21wX2FkYXB0aXZlX2xvY2tfdCAqbGNrICkKK3sKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfZGVzdHJveV9sb2NrIjsKKyAgICBpZiAoIGxjay0+bGsucWxrLmluaXRpYWxpemVkICE9IEdFVF9RTEtfUFRSKGxjaykgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgIH0KKyAgICBpZiAoIF9fa21wX2dldF9xdWV1aW5nX2xvY2tfb3duZXIoIEdFVF9RTEtfUFRSKGxjaykgKSAhPSAtMSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrU3RpbGxPd25lZCwgZnVuYyApOworICAgIH0KKyAgICBfX2ttcF9kZXN0cm95X2FkYXB0aXZlX2xvY2soIGxjayApOworfQorCisKKyNlbmRpZiAvLyBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBEUkRQQSB0aWNrZXQgbG9ja3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIkRSRFBBIiBtZWFucyBEeW5hbWljYWxseSBSZWNvbmZpZ3VyYWJsZSBEaXN0cmlidXRlZCBQb2xsaW5nIEFyZWEgKi8KKworc3RhdGljIGttcF9pbnQzMgorX19rbXBfZ2V0X2RyZHBhX2xvY2tfb3duZXIoIGttcF9kcmRwYV9sb2NrX3QgKmxjayApCit7CisgICAgcmV0dXJuIFRDUl80KCBsY2stPmxrLm93bmVyX2lkICkgLSAxOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wKK19fa21wX2lzX2RyZHBhX2xvY2tfbmVzdGFibGUoIGttcF9kcmRwYV9sb2NrX3QgKmxjayApCit7CisgICAgcmV0dXJuIGxjay0+bGsuZGVwdGhfbG9ja2VkICE9IC0xOworfQorCitfX2ZvcmNlaW5saW5lIHN0YXRpYyB2b2lkCitfX2ttcF9hY3F1aXJlX2RyZHBhX2xvY2tfdGltZWRfdGVtcGxhdGUoIGttcF9kcmRwYV9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGttcF91aW50NjQgdGlja2V0ID0gS01QX1RFU1RfVEhFTl9JTkM2NCgoa21wX2ludDY0ICopJmxjay0+bGsubmV4dF90aWNrZXQpOworICAgIGttcF91aW50NjQgbWFzayA9IFRDUl84KGxjay0+bGsubWFzayk7ICAgICAgICAgICAgICAvLyB2b2xhdGlsZSBsb2FkCisgICAgdm9sYXRpbGUgc3RydWN0IGttcF9iYXNlX2RyZHBhX2xvY2s6OmttcF9sb2NrX3BvbGwgKnBvbGxzCisgICAgICA9ICh2b2xhdGlsZSBzdHJ1Y3Qga21wX2Jhc2VfZHJkcGFfbG9jazo6a21wX2xvY2tfcG9sbCAqKQorICAgICAgVENSX1BUUihsY2stPmxrLnBvbGxzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB2b2xhdGlsZSBsb2FkCisKKyNpZmRlZiBVU0VfTE9DS19QUk9GSUxFCisgICAgaWYgKFRDUl84KHBvbGxzW3RpY2tldCAmIG1hc2tdLnBvbGwpICE9IHRpY2tldCkKKyAgICAgICAgX19rbXBfcHJpbnRmKCJMT0NLIENPTlRFTlRJT046ICVwXG4iLCBsY2spOworICAgIC8qIGVsc2UgX19rbXBfcHJpbnRmKCAiLiIgKTsqLworI2VuZGlmIC8qIFVTRV9MT0NLX1BST0ZJTEUgKi8KKworICAgIC8vCisgICAgLy8gTm93IHNwaW4td2FpdCwgYnV0IHJlbG9hZCB0aGUgcG9sbHMgcG9pbnRlciBhbmQgbWFzaywgaW4gY2FzZSB0aGUKKyAgICAvLyBwb2xsaW5nIGFyZWEgaGFzIGJlZW4gcmVjb25maWd1cmVkLiAgVW5sZXNzIGl0IGlzIHJlY29uZmlndXJlZCwgdGhlCisgICAgLy8gcmVsb2FkcyBzdGF5IGluIEwxIGNhY2hlIGFuZCBhcmUgY2hlYXAuCisgICAgLy8KKyAgICAvLyBLZWVwIHRoaXMgY29kZSBpbiBzeW5jIHdpdGggS01QX1dBSVRfWUlFTEQsIGluIGttcF9kaXNwYXRjaC5jICEhIQorICAgIC8vCisgICAgLy8gVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gb2YgS01QX1dBSVRfWUlFTEQgZG9lc24ndCBhbGxvdyBmb3IgbWFzaworICAgIC8vIGFuZCBwb2xsIHRvIGJlIHJlLXJlYWQgZXZlcnkgc3BpbiBpdGVyYXRpb24uCisgICAgLy8KKyAgICBrbXBfdWludDMyIHNwaW5zOworCisgICAgS01QX0ZTWU5DX1BSRVBBUkUobGNrKTsKKyAgICBLTVBfSU5JVF9ZSUVMRChzcGlucyk7CisgICAgd2hpbGUgKFRDUl84KHBvbGxzW3RpY2tldCAmIG1hc2tdKS5wb2xsIDwgdGlja2V0KSB7IC8vIHZvbGF0aWxlIGxvYWQKKyAgICAgICAgLy8gSWYgd2UgYXJlIG92ZXJzdWJzY3JpYmVkLAorICAgICAgICAvLyBvciBoYXZlIHdhaXRlZCBhIGJpdCAoYW5kIEtNUF9MSUJSQVJZPXR1cm5hcm91bmQpLCB0aGVuIHlpZWxkLgorICAgICAgICAvLyBDUFUgUGF1c2UgaXMgaW4gdGhlIG1hY3JvcyBmb3IgeWllbGQuCisgICAgICAgIC8vCisgICAgICAgIEtNUF9ZSUVMRChUQ1JfNChfX2ttcF9udGgpCisgICAgICAgICAgPiAoX19rbXBfYXZhaWxfcHJvYyA/IF9fa21wX2F2YWlsX3Byb2MgOiBfX2ttcF94cHJvYykpOworICAgICAgICBLTVBfWUlFTERfU1BJTihzcGlucyk7CisKKyAgICAgICAgLy8gUmUtcmVhZCB0aGUgbWFzayBhbmQgdGhlIHBvbGwgcG9pbnRlciBmcm9tIHRoZSBsb2NrIHN0cnVjdHVyZS4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gTWFrZSBjZXJ0YWluIHRoYXQgIm1hc2siIGlzIHJlYWQgYmVmb3JlICJwb2xscyIgISEhCisgICAgICAgIC8vCisgICAgICAgIC8vIElmIGFub3RoZXIgdGhyZWFkIHBpY2tzIHJlY29uZmlndXJlcyB0aGUgcG9sbGluZyBhcmVhIGFuZCB1cGRhdGVzCisgICAgICAgIC8vIHRoZWlyIHZhbHVlcywgYW5kIHdlIGdldCB0aGUgbmV3IHZhbHVlIG9mIG1hc2sgYW5kIHRoZSBvbGQgcG9sbHMKKyAgICAgICAgLy8gcG9pbnRlciwgd2UgY291bGQgYWNjZXNzIG1lbW9yeSBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgb2xkIHBvbGxpbmcKKyAgICAgICAgLy8gYXJlYS4KKyAgICAgICAgLy8KKyAgICAgICAgbWFzayA9IFRDUl84KGxjay0+bGsubWFzayk7ICAgICAgICAgICAgICAgICAgICAgLy8gdm9sYXRpbGUgbG9hZAorICAgICAgICBwb2xscyA9ICh2b2xhdGlsZSBzdHJ1Y3Qga21wX2Jhc2VfZHJkcGFfbG9jazo6a21wX2xvY2tfcG9sbCAqKQorICAgICAgICAgIFRDUl9QVFIobGNrLT5say5wb2xscyk7ICAgICAgICAgICAgICAgICAgICAgICAvLyB2b2xhdGlsZSBsb2FkCisgICAgfQorCisgICAgLy8KKyAgICAvLyBDcml0aWNhbCBzZWN0aW9uIHN0YXJ0cyBoZXJlCisgICAgLy8KKyAgICBLTVBfRlNZTkNfQUNRVUlSRUQobGNrKTsKKyAgICBLQV9UUkFDRSgxMDAwLCAoIl9fa21wX2FjcXVpcmVfZHJkcGFfbG9jazogdGlja2V0ICMlbGxkIGFjcXVpcmVkIGxvY2sgJXBcbiIsCisgICAgICB0aWNrZXQsIGxjaykpOworICAgIGxjay0+bGsubm93X3NlcnZpbmcgPSB0aWNrZXQ7ICAgICAgICAgICAgICAgICAgICAgICAvLyBub24tdm9sYXRpbGUgc3RvcmUKKworICAgIC8vCisgICAgLy8gRGVhbGxvY2F0ZSBhIGdhcmJhZ2UgcG9sbGluZyBhcmVhIGlmIHdlIGtub3cgdGhhdCB3ZSBhcmUgdGhlIGxhc3QKKyAgICAvLyB0aHJlYWQgdGhhdCBjb3VsZCBwb3NzaWJseSBhY2Nlc3MgaXQuCisgICAgLy8KKyAgICAvLyBUaGUgPj0gY2hlY2sgaXMgaW4gY2FzZSBfX2ttcF90ZXN0X2RyZHBhX2xvY2soKSBhbGxvY2F0ZWQgdGhlIGNsZWFudXAKKyAgICAvLyB0aWNrZXQuCisgICAgLy8KKyAgICBpZiAoKGxjay0+bGsub2xkX3BvbGxzICE9IE5VTEwpICYmICh0aWNrZXQgPj0gbGNrLT5say5jbGVhbnVwX3RpY2tldCkpIHsKKyAgICAgICAgX19rbXBfZnJlZSgodm9pZCAqKWxjay0+bGsub2xkX3BvbGxzKTsKKyAgICAgICAgbGNrLT5say5vbGRfcG9sbHMgPSBOVUxMOworICAgICAgICBsY2stPmxrLmNsZWFudXBfdGlja2V0ID0gMDsKKyAgICB9CisKKyAgICAvLworICAgIC8vIENoZWNrIHRvIHNlZSBpZiB3ZSBzaG91bGQgcmVjb25maWd1cmUgdGhlIHBvbGxpbmcgYXJlYS4KKyAgICAvLyBJZiB0aGVyZSBpcyBzdGlsbCBhIGdhcmJhZ2UgcG9sbGluZyBhcmVhIHRvIGJlIGRlYWxsb2NhdGVkIGZyb20gYQorICAgIC8vIHByZXZpb3VzIHJlY29uZmlndXJhdGlvbiwgbGV0IGEgbGF0ZXIgdGhyZWFkIHJlY29uZmlndXJlIGl0LgorICAgIC8vCisgICAgaWYgKGxjay0+bGsub2xkX3BvbGxzID09IE5VTEwpIHsKKyAgICAgICAgYm9vbCByZWNvbmZpZ3VyZSA9IGZhbHNlOworICAgICAgICB2b2xhdGlsZSBzdHJ1Y3Qga21wX2Jhc2VfZHJkcGFfbG9jazo6a21wX2xvY2tfcG9sbCAqb2xkX3BvbGxzID0gcG9sbHM7CisgICAgICAgIGttcF91aW50MzIgbnVtX3BvbGxzID0gVENSXzQobGNrLT5say5udW1fcG9sbHMpOworCisgICAgICAgIGlmIChUQ1JfNChfX2ttcF9udGgpCisgICAgICAgICAgPiAoX19rbXBfYXZhaWxfcHJvYyA/IF9fa21wX2F2YWlsX3Byb2MgOiBfX2ttcF94cHJvYykpIHsKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBXZSBhcmUgaW4gb3ZlcnN1YnNjcmlwdGlvbiBtb2RlLiAgQ29udHJhY3QgdGhlIHBvbGxpbmcgYXJlYQorICAgICAgICAgICAgLy8gZG93biB0byBhIHNpbmdsZSBsb2NhdGlvbiwgaWYgdGhhdCBoYXNuJ3QgYmVlbiBkb25lIGFscmVhZHkuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgaWYgKG51bV9wb2xscyA+IDEpIHsKKyAgICAgICAgICAgICAgICByZWNvbmZpZ3VyZSA9IHRydWU7CisgICAgICAgICAgICAgICAgbnVtX3BvbGxzID0gVENSXzQobGNrLT5say5udW1fcG9sbHMpOworICAgICAgICAgICAgICAgIG1hc2sgPSAwOworICAgICAgICAgICAgICAgIG51bV9wb2xscyA9IDE7CisgICAgICAgICAgICAgICAgcG9sbHMgPSAodm9sYXRpbGUgc3RydWN0IGttcF9iYXNlX2RyZHBhX2xvY2s6OmttcF9sb2NrX3BvbGwgKikKKyAgICAgICAgICAgICAgICAgIF9fa21wX2FsbG9jYXRlKG51bV9wb2xscyAqIHNpemVvZigqcG9sbHMpKTsKKyAgICAgICAgICAgICAgICBwb2xsc1swXS5wb2xsID0gdGlja2V0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFdlIGFyZSBpbiB1bmRlci9mdWxseSBzdWJzY3JpYmVkIG1vZGUuICBDaGVjayB0aGUgbnVtYmVyIG9mCisgICAgICAgICAgICAvLyB0aHJlYWRzIHdhaXRpbmcgb24gdGhlIGxvY2suICBUaGUgc2l6ZSBvZiB0aGUgcG9sbGluZyBhcmVhCisgICAgICAgICAgICAvLyBzaG91bGQgYmUgYXQgbGVhc3QgdGhlIG51bWJlciBvZiB0aHJlYWRzIHdhaXRpbmcuCisgICAgICAgICAgICAvLworICAgICAgICAgICAga21wX3VpbnQ2NCBudW1fd2FpdGluZyA9IFRDUl84KGxjay0+bGsubmV4dF90aWNrZXQpIC0gdGlja2V0IC0gMTsKKyAgICAgICAgICAgIGlmIChudW1fd2FpdGluZyA+IG51bV9wb2xscykgeworICAgICAgICAgICAgICAgIGttcF91aW50MzIgb2xkX251bV9wb2xscyA9IG51bV9wb2xsczsKKyAgICAgICAgICAgICAgICByZWNvbmZpZ3VyZSA9IHRydWU7CisgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICBtYXNrID0gKG1hc2sgPDwgMSkgfCAxOworICAgICAgICAgICAgICAgICAgICBudW1fcG9sbHMgKj0gMjsKKyAgICAgICAgICAgICAgICB9IHdoaWxlIChudW1fcG9sbHMgPD0gbnVtX3dhaXRpbmcpOworCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyBBbGxvY2F0ZSB0aGUgbmV3IHBvbGxpbmcgYXJlYSwgYW5kIGNvcHkgdGhlIHJlbGV2YW50IHBvcnRpb24KKyAgICAgICAgICAgICAgICAvLyBvZiB0aGUgb2xkIHBvbGxpbmcgYXJlYSB0byB0aGUgbmV3IGFyZWEuICBfX2ttcF9hbGxvY2F0ZSgpCisgICAgICAgICAgICAgICAgLy8gemVyb2VzIHRoZSBtZW1vcnkgaXQgYWxsb2NhdGVzLCBhbmQgbW9zdCBvZiB0aGUgb2xkIGFyZWEgaXMKKyAgICAgICAgICAgICAgICAvLyBqdXN0IHplcm8gcGFkZGluZywgc28gd2Ugb25seSBjb3B5IHRoZSByZWxlYXNlIGNvdW50ZXJzLgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgcG9sbHMgPSAodm9sYXRpbGUgc3RydWN0IGttcF9iYXNlX2RyZHBhX2xvY2s6OmttcF9sb2NrX3BvbGwgKikKKyAgICAgICAgICAgICAgICAgIF9fa21wX2FsbG9jYXRlKG51bV9wb2xscyAqIHNpemVvZigqcG9sbHMpKTsKKyAgICAgICAgICAgICAgICBrbXBfdWludDMyIGk7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG9sZF9udW1fcG9sbHM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBwb2xsc1tpXS5wb2xsID0gb2xkX3BvbGxzW2ldLnBvbGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHJlY29uZmlndXJlKSB7CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gTm93IHdyaXRlIHRoZSB1cGRhdGVkIGZpZWxkcyBiYWNrIHRvIHRoZSBsb2NrIHN0cnVjdHVyZS4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBNYWtlIGNlcnRhaW4gdGhhdCAicG9sbHMiIGlzIHdyaXR0ZW4gYmVmb3JlICJtYXNrIiAhISEKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBJZiBhbm90aGVyIHRocmVhZCBwaWNrcyB1cCB0aGUgbmV3IHZhbHVlIG9mIG1hc2sgYW5kIHRoZSBvbGQKKyAgICAgICAgICAgIC8vIHBvbGxzIHBvaW50ZXIgLCBpdCBjb3VsZCBhY2Nlc3MgbWVtb3J5IGJleW9uZCB0aGUgZW5kIG9mIHRoZQorICAgICAgICAgICAgLy8gb2xkIHBvbGxpbmcgYXJlYS4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBPbiB4ODYsIHdlIG5lZWQgbWVtb3J5IGZlbmNlcy4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBLQV9UUkFDRSgxMDAwLCAoIl9fa21wX2FjcXVpcmVfZHJkcGFfbG9jazogdGlja2V0ICMlbGxkIHJlY29uZmlndXJpbmcgbG9jayAlcCB0byAlZCBwb2xsc1xuIiwKKyAgICAgICAgICAgICAgdGlja2V0LCBsY2ssIG51bV9wb2xscykpOworCisgICAgICAgICAgICBsY2stPmxrLm9sZF9wb2xscyA9IG9sZF9wb2xsczsgICAgICAgICAgICAgIC8vIG5vbi12b2xhdGlsZSBzdG9yZQorICAgICAgICAgICAgbGNrLT5say5wb2xscyA9IHBvbGxzOyAgICAgICAgICAgICAgICAgICAgICAvLyB2b2xhdGlsZSBzdG9yZQorCisgICAgICAgICAgICBLTVBfTUIoKTsKKworICAgICAgICAgICAgbGNrLT5say5udW1fcG9sbHMgPSBudW1fcG9sbHM7ICAgICAgICAgICAgICAvLyBub24tdm9sYXRpbGUgc3RvcmUKKyAgICAgICAgICAgIGxjay0+bGsubWFzayA9IG1hc2s7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gdm9sYXRpbGUgc3RvcmUKKworICAgICAgICAgICAgS01QX01CKCk7CisKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBPbmx5IGFmdGVyIHRoZSBuZXcgcG9sbGluZyBhcmVhIGFuZCBtYXNrIGhhdmUgYmVlbiBmbHVzaGVkCisgICAgICAgICAgICAvLyB0byBtYWluIG1lbW9yeSBjYW4gd2UgdXBkYXRlIHRoZSBjbGVhbnVwIHRpY2tldCBmaWVsZC4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyB2b2xhdGlsZSBsb2FkIC8gbm9uLXZvbGF0aWxlIHN0b3JlCisgICAgICAgICAgICAvLworICAgICAgICAgICAgbGNrLT5say5jbGVhbnVwX3RpY2tldCA9IFRDUl84KGxjay0+bGsubmV4dF90aWNrZXQpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkCitfX2ttcF9hY3F1aXJlX2RyZHBhX2xvY2soIGttcF9kcmRwYV9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIF9fa21wX2FjcXVpcmVfZHJkcGFfbG9ja190aW1lZF90ZW1wbGF0ZSggbGNrLCBndGlkICk7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9hY3F1aXJlX2RyZHBhX2xvY2tfd2l0aF9jaGVja3MoIGttcF9kcmRwYV9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF9zZXRfbG9jayI7CisgICAgaWYgKCBsY2stPmxrLmluaXRpYWxpemVkICE9IGxjayApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jICk7CisgICAgfQorICAgIGlmICggX19rbXBfaXNfZHJkcGFfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja05lc3RhYmxlVXNlZEFzU2ltcGxlLCBmdW5jICk7CisgICAgfQorICAgIGlmICggKCBndGlkID49IDAgKSAmJiAoIF9fa21wX2dldF9kcmRwYV9sb2NrX293bmVyKCBsY2sgKSA9PSBndGlkICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzQWxyZWFkeU93bmVkLCBmdW5jICk7CisgICAgfQorCisgICAgX19rbXBfYWNxdWlyZV9kcmRwYV9sb2NrKCBsY2ssIGd0aWQgKTsKKworICAgIGxjay0+bGsub3duZXJfaWQgPSBndGlkICsgMTsKK30KKworaW50CitfX2ttcF90ZXN0X2RyZHBhX2xvY2soIGttcF9kcmRwYV9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIC8vCisgICAgLy8gRmlyc3QgZ2V0IGEgdGlja2V0LCB0aGVuIHJlYWQgdGhlIHBvbGxzIHBvaW50ZXIgYW5kIHRoZSBtYXNrLgorICAgIC8vIFRoZSBwb2xscyBwb2ludGVyIG11c3QgYmUgcmVhZCBiZWZvcmUgdGhlIG1hc2shISEgKFNlZSBhYm92ZSkKKyAgICAvLworICAgIGttcF91aW50NjQgdGlja2V0ID0gVENSXzgobGNrLT5say5uZXh0X3RpY2tldCk7ICAgICAvLyB2b2xhdGlsZSBsb2FkCisgICAgdm9sYXRpbGUgc3RydWN0IGttcF9iYXNlX2RyZHBhX2xvY2s6OmttcF9sb2NrX3BvbGwgKnBvbGxzCisgICAgICA9ICh2b2xhdGlsZSBzdHJ1Y3Qga21wX2Jhc2VfZHJkcGFfbG9jazo6a21wX2xvY2tfcG9sbCAqKQorICAgICAgVENSX1BUUihsY2stPmxrLnBvbGxzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB2b2xhdGlsZSBsb2FkCisgICAga21wX3VpbnQ2NCBtYXNrID0gVENSXzgobGNrLT5say5tYXNrKTsgICAgICAgICAgICAgIC8vIHZvbGF0aWxlIGxvYWQKKyAgICBpZiAoVENSXzgocG9sbHNbdGlja2V0ICYgbWFza10ucG9sbCkgPT0gdGlja2V0KSB7CisgICAgICAgIGttcF91aW50NjQgbmV4dF90aWNrZXQgPSB0aWNrZXQgKyAxOworICAgICAgICBpZiAoS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTY0KChrbXBfaW50NjQgKikmbGNrLT5say5uZXh0X3RpY2tldCwKKyAgICAgICAgICB0aWNrZXQsIG5leHRfdGlja2V0KSkgeworICAgICAgICAgICAgS01QX0ZTWU5DX0FDUVVJUkVEKGxjayk7CisgICAgICAgICAgICBLQV9UUkFDRSgxMDAwLCAoIl9fa21wX3Rlc3RfZHJkcGFfbG9jazogdGlja2V0ICMlbGxkIGFjcXVpcmVkIGxvY2sgJXBcbiIsCisgICAgICAgICAgICAgICB0aWNrZXQsIGxjaykpOworICAgICAgICAgICAgbGNrLT5say5ub3dfc2VydmluZyA9IHRpY2tldDsgICAgICAgICAgICAgICAvLyBub24tdm9sYXRpbGUgc3RvcmUKKworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFNpbmNlIG5vIHRocmVhZHMgYXJlIHdhaXRpbmcsIHRoZXJlIGlzIG5vIHBvc3NpYmlsaXR5IHRoYXQKKyAgICAgICAgICAgIC8vIHdlIHdvdWxkIHdhbnQgdG8gcmVjb25maWd1cmUgdGhlIHBvbGxpbmcgYXJlYS4gIFdlIG1pZ2h0CisgICAgICAgICAgICAvLyBoYXZlIHRoZSBjbGVhbnVwIHRpY2tldCB2YWx1ZSAod2hpY2ggc2F5cyB0aGF0IGl0IGlzIG5vdworICAgICAgICAgICAgLy8gc2FmZSB0byBkZWFsbG9jYXRlIG9sZF9wb2xscyksIGJ1dCB3ZSdsbCBsZXQgYSBsYXRlciB0aHJlYWQKKyAgICAgICAgICAgIC8vIHdoaWNoIGNhbGxzIF9fa21wX2FjcXVpcmVfbG9jayBkbyB0aGF0IC0gdGhpcyByb3V0aW5lCisgICAgICAgICAgICAvLyBpc24ndCBzdXBwb3NlZCB0byBibG9jaywgYW5kIHdlIHdvdWxkIHJpc2sgYmxvY2tzIGlmIHdlCisgICAgICAgICAgICAvLyBjYWxsZWQgX19rbXBfZnJlZSgpIHRvIGRvIHRoZSBkZWFsbG9jYXRpb24uCisgICAgICAgICAgICAvLworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgaW50CitfX2ttcF90ZXN0X2RyZHBhX2xvY2tfd2l0aF9jaGVja3MoIGttcF9kcmRwYV9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF90ZXN0X2xvY2siOworICAgIGlmICggbGNrLT5say5pbml0aWFsaXplZCAhPSBsY2sgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgIH0KKyAgICBpZiAoIF9fa21wX2lzX2RyZHBhX2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tOZXN0YWJsZVVzZWRBc1NpbXBsZSwgZnVuYyApOworICAgIH0KKworICAgIGludCByZXR2YWwgPSBfX2ttcF90ZXN0X2RyZHBhX2xvY2soIGxjaywgZ3RpZCApOworCisgICAgaWYgKCByZXR2YWwgKSB7CisgICAgICAgIGxjay0+bGsub3duZXJfaWQgPSBndGlkICsgMTsKKyAgICB9CisgICAgcmV0dXJuIHJldHZhbDsKK30KKwordm9pZAorX19rbXBfcmVsZWFzZV9kcmRwYV9sb2NrKCBrbXBfZHJkcGFfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICAvLworICAgIC8vIFJlYWQgdGhlIHRpY2tldCB2YWx1ZSBmcm9tIHRoZSBsb2NrIGRhdGEgc3RydWN0LCB0aGVuIHRoZSBwb2xscworICAgIC8vIHBvaW50ZXIgYW5kIHRoZSBtYXNrLiAgVGhlIHBvbGxzIHBvaW50ZXIgbXVzdCBiZSByZWFkIGJlZm9yZSB0aGUKKyAgICAvLyBtYXNrISEhIChTZWUgYWJvdmUpCisgICAgLy8KKyAgICBrbXBfdWludDY0IHRpY2tldCA9IGxjay0+bGsubm93X3NlcnZpbmcgKyAxOyAgICAgICAgLy8gbm9uLXZvbGF0aWxlIGxvYWQKKyAgICB2b2xhdGlsZSBzdHJ1Y3Qga21wX2Jhc2VfZHJkcGFfbG9jazo6a21wX2xvY2tfcG9sbCAqcG9sbHMKKyAgICAgID0gKHZvbGF0aWxlIHN0cnVjdCBrbXBfYmFzZV9kcmRwYV9sb2NrOjprbXBfbG9ja19wb2xsICopCisgICAgICBUQ1JfUFRSKGxjay0+bGsucG9sbHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZvbGF0aWxlIGxvYWQKKyAgICBrbXBfdWludDY0IG1hc2sgPSBUQ1JfOChsY2stPmxrLm1hc2spOyAgICAgICAgICAgICAgLy8gdm9sYXRpbGUgbG9hZAorICAgIEtBX1RSQUNFKDEwMDAsICgiX19rbXBfcmVsZWFzZV9kcmRwYV9sb2NrOiB0aWNrZXQgIyVsbGQgcmVsZWFzZWQgbG9jayAlcFxuIiwKKyAgICAgICB0aWNrZXQgLSAxLCBsY2spKTsKKyAgICBLTVBfRlNZTkNfUkVMRUFTSU5HKGxjayk7CisgICAgS01QX1NUX1JFTDY0KCYocG9sbHNbdGlja2V0ICYgbWFza10ucG9sbCksIHRpY2tldCk7IC8vIHZvbGF0aWxlIHN0b3JlCit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9yZWxlYXNlX2RyZHBhX2xvY2tfd2l0aF9jaGVja3MoIGttcF9kcmRwYV9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF91bnNldF9sb2NrIjsKKyAgICBLTVBfTUIoKTsgIC8qIGluIGNhc2UgYW5vdGhlciBwcm9jZXNzb3IgaW5pdGlhbGl6ZWQgbG9jayAqLworICAgIGlmICggbGNrLT5say5pbml0aWFsaXplZCAhPSBsY2sgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgIH0KKyAgICBpZiAoIF9fa21wX2lzX2RyZHBhX2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tOZXN0YWJsZVVzZWRBc1NpbXBsZSwgZnVuYyApOworICAgIH0KKyAgICBpZiAoIF9fa21wX2dldF9kcmRwYV9sb2NrX293bmVyKCBsY2sgKSA9PSAtMSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrVW5zZXR0aW5nRnJlZSwgZnVuYyApOworICAgIH0KKyAgICBpZiAoICggZ3RpZCA+PSAwICkgJiYgKCBfX2ttcF9nZXRfZHJkcGFfbG9ja19vd25lciggbGNrICkgPj0gMCApCisgICAgICAmJiAoIF9fa21wX2dldF9kcmRwYV9sb2NrX293bmVyKCBsY2sgKSAhPSBndGlkICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1Vuc2V0dGluZ1NldEJ5QW5vdGhlciwgZnVuYyApOworICAgIH0KKyAgICBsY2stPmxrLm93bmVyX2lkID0gMDsKKyAgICBfX2ttcF9yZWxlYXNlX2RyZHBhX2xvY2soIGxjaywgZ3RpZCApOworfQorCit2b2lkCitfX2ttcF9pbml0X2RyZHBhX2xvY2soIGttcF9kcmRwYV9sb2NrX3QgKmxjayApCit7CisgICAgbGNrLT5say5sb2NhdGlvbiA9IE5VTEw7CisgICAgbGNrLT5say5tYXNrID0gMDsKKyAgICBsY2stPmxrLm51bV9wb2xscyA9IDE7CisgICAgbGNrLT5say5wb2xscyA9ICh2b2xhdGlsZSBzdHJ1Y3Qga21wX2Jhc2VfZHJkcGFfbG9jazo6a21wX2xvY2tfcG9sbCAqKQorICAgICAgX19rbXBfYWxsb2NhdGUobGNrLT5say5udW1fcG9sbHMgKiBzaXplb2YoKihsY2stPmxrLnBvbGxzKSkpOworICAgIGxjay0+bGsuY2xlYW51cF90aWNrZXQgPSAwOworICAgIGxjay0+bGsub2xkX3BvbGxzID0gTlVMTDsKKyAgICBsY2stPmxrLm5leHRfdGlja2V0ID0gMDsKKyAgICBsY2stPmxrLm5vd19zZXJ2aW5nID0gMDsKKyAgICBsY2stPmxrLm93bmVyX2lkID0gMDsgICAgICAvLyBubyB0aHJlYWQgb3ducyB0aGUgbG9jay4KKyAgICBsY2stPmxrLmRlcHRoX2xvY2tlZCA9IC0xOyAvLyA+PSAwIGZvciBuZXN0YWJsZSBsb2NrcywgLTEgZm9yIHNpbXBsZSBsb2Nrcy4KKyAgICBsY2stPmxrLmluaXRpYWxpemVkID0gbGNrOworCisgICAgS0FfVFJBQ0UoMTAwMCwgKCJfX2ttcF9pbml0X2RyZHBhX2xvY2s6IGxvY2sgJXAgaW5pdGlhbGl6ZWRcbiIsIGxjaykpOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfaW5pdF9kcmRwYV9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfZHJkcGFfbG9ja190ICogbGNrICkKK3sKKyAgICBfX2ttcF9pbml0X2RyZHBhX2xvY2soIGxjayApOworfQorCit2b2lkCitfX2ttcF9kZXN0cm95X2RyZHBhX2xvY2soIGttcF9kcmRwYV9sb2NrX3QgKmxjayApCit7CisgICAgbGNrLT5say5pbml0aWFsaXplZCA9IE5VTEw7CisgICAgbGNrLT5say5sb2NhdGlvbiAgICA9IE5VTEw7CisgICAgaWYgKGxjay0+bGsucG9sbHMgIT0gTlVMTCkgeworICAgICAgICBfX2ttcF9mcmVlKCh2b2lkICopbGNrLT5say5wb2xscyk7CisgICAgICAgIGxjay0+bGsucG9sbHMgPSBOVUxMOworICAgIH0KKyAgICBpZiAobGNrLT5say5vbGRfcG9sbHMgIT0gTlVMTCkgeworICAgICAgICBfX2ttcF9mcmVlKCh2b2lkICopbGNrLT5say5vbGRfcG9sbHMpOworICAgICAgICBsY2stPmxrLm9sZF9wb2xscyA9IE5VTEw7CisgICAgfQorICAgIGxjay0+bGsubWFzayA9IDA7CisgICAgbGNrLT5say5udW1fcG9sbHMgPSAwOworICAgIGxjay0+bGsuY2xlYW51cF90aWNrZXQgPSAwOworICAgIGxjay0+bGsubmV4dF90aWNrZXQgPSAwOworICAgIGxjay0+bGsubm93X3NlcnZpbmcgPSAwOworICAgIGxjay0+bGsub3duZXJfaWQgPSAwOworICAgIGxjay0+bGsuZGVwdGhfbG9ja2VkID0gLTE7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9kZXN0cm95X2RyZHBhX2xvY2tfd2l0aF9jaGVja3MoIGttcF9kcmRwYV9sb2NrX3QgKmxjayApCit7CisgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX2Rlc3Ryb3lfbG9jayI7CisgICAgaWYgKCBsY2stPmxrLmluaXRpYWxpemVkICE9IGxjayApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jICk7CisgICAgfQorICAgIGlmICggX19rbXBfaXNfZHJkcGFfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja05lc3RhYmxlVXNlZEFzU2ltcGxlLCBmdW5jICk7CisgICAgfQorICAgIGlmICggX19rbXBfZ2V0X2RyZHBhX2xvY2tfb3duZXIoIGxjayApICE9IC0xICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tTdGlsbE93bmVkLCBmdW5jICk7CisgICAgfQorICAgIF9fa21wX2Rlc3Ryb3lfZHJkcGFfbG9jayggbGNrICk7Cit9CisKKworLy8KKy8vIG5lc3RlZCBkcmRwYSB0aWNrZXQgbG9ja3MKKy8vCisKK3ZvaWQKK19fa21wX2FjcXVpcmVfbmVzdGVkX2RyZHBhX2xvY2soIGttcF9kcmRwYV9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIGd0aWQgPj0gMCApOworCisgICAgaWYgKCBfX2ttcF9nZXRfZHJkcGFfbG9ja19vd25lciggbGNrICkgPT0gZ3RpZCApIHsKKyAgICAgICAgbGNrLT5say5kZXB0aF9sb2NrZWQgKz0gMTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIF9fa21wX2FjcXVpcmVfZHJkcGFfbG9ja190aW1lZF90ZW1wbGF0ZSggbGNrLCBndGlkICk7CisgICAgICAgIEtNUF9NQigpOworICAgICAgICBsY2stPmxrLmRlcHRoX2xvY2tlZCA9IDE7CisgICAgICAgIEtNUF9NQigpOworICAgICAgICBsY2stPmxrLm93bmVyX2lkID0gZ3RpZCArIDE7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorX19rbXBfYWNxdWlyZV9uZXN0ZWRfZHJkcGFfbG9ja193aXRoX2NoZWNrcygga21wX2RyZHBhX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3NldF9uZXN0X2xvY2siOworICAgIGlmICggbGNrLT5say5pbml0aWFsaXplZCAhPSBsY2sgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgIH0KKyAgICBpZiAoICEgX19rbXBfaXNfZHJkcGFfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1NpbXBsZVVzZWRBc05lc3RhYmxlLCBmdW5jICk7CisgICAgfQorICAgIF9fa21wX2FjcXVpcmVfbmVzdGVkX2RyZHBhX2xvY2soIGxjaywgZ3RpZCApOworfQorCitpbnQKK19fa21wX3Rlc3RfbmVzdGVkX2RyZHBhX2xvY2soIGttcF9kcmRwYV9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGludCByZXR2YWw7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBndGlkID49IDAgKTsKKworICAgIGlmICggX19rbXBfZ2V0X2RyZHBhX2xvY2tfb3duZXIoIGxjayApID09IGd0aWQgKSB7CisgICAgICAgIHJldHZhbCA9ICsrbGNrLT5say5kZXB0aF9sb2NrZWQ7CisgICAgfQorICAgIGVsc2UgaWYgKCAhX19rbXBfdGVzdF9kcmRwYV9sb2NrKCBsY2ssIGd0aWQgKSApIHsKKyAgICAgICAgcmV0dmFsID0gMDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIEtNUF9NQigpOworICAgICAgICByZXR2YWwgPSBsY2stPmxrLmRlcHRoX2xvY2tlZCA9IDE7CisgICAgICAgIEtNUF9NQigpOworICAgICAgICBsY2stPmxrLm93bmVyX2lkID0gZ3RpZCArIDE7CisgICAgfQorICAgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQKK19fa21wX3Rlc3RfbmVzdGVkX2RyZHBhX2xvY2tfd2l0aF9jaGVja3MoIGttcF9kcmRwYV9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF90ZXN0X25lc3RfbG9jayI7CisgICAgaWYgKCBsY2stPmxrLmluaXRpYWxpemVkICE9IGxjayApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jICk7CisgICAgfQorICAgIGlmICggISBfX2ttcF9pc19kcmRwYV9sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrU2ltcGxlVXNlZEFzTmVzdGFibGUsIGZ1bmMgKTsKKyAgICB9CisgICAgcmV0dXJuIF9fa21wX3Rlc3RfbmVzdGVkX2RyZHBhX2xvY2soIGxjaywgZ3RpZCApOworfQorCit2b2lkCitfX2ttcF9yZWxlYXNlX25lc3RlZF9kcmRwYV9sb2NrKCBrbXBfZHJkcGFfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBndGlkID49IDAgKTsKKworICAgIEtNUF9NQigpOworICAgIGlmICggLS0obGNrLT5say5kZXB0aF9sb2NrZWQpID09IDAgKSB7CisgICAgICAgIEtNUF9NQigpOworICAgICAgICBsY2stPmxrLm93bmVyX2lkID0gMDsKKyAgICAgICAgX19rbXBfcmVsZWFzZV9kcmRwYV9sb2NrKCBsY2ssIGd0aWQgKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9yZWxlYXNlX25lc3RlZF9kcmRwYV9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfZHJkcGFfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfdW5zZXRfbmVzdF9sb2NrIjsKKyAgICBLTVBfTUIoKTsgIC8qIGluIGNhc2UgYW5vdGhlciBwcm9jZXNzb3IgaW5pdGlhbGl6ZWQgbG9jayAqLworICAgIGlmICggbGNrLT5say5pbml0aWFsaXplZCAhPSBsY2sgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgIH0KKyAgICBpZiAoICEgX19rbXBfaXNfZHJkcGFfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1NpbXBsZVVzZWRBc05lc3RhYmxlLCBmdW5jICk7CisgICAgfQorICAgIGlmICggX19rbXBfZ2V0X2RyZHBhX2xvY2tfb3duZXIoIGxjayApID09IC0xICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tVbnNldHRpbmdGcmVlLCBmdW5jICk7CisgICAgfQorICAgIGlmICggX19rbXBfZ2V0X2RyZHBhX2xvY2tfb3duZXIoIGxjayApICE9IGd0aWQgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1Vuc2V0dGluZ1NldEJ5QW5vdGhlciwgZnVuYyApOworICAgIH0KKyAgICBfX2ttcF9yZWxlYXNlX25lc3RlZF9kcmRwYV9sb2NrKCBsY2ssIGd0aWQgKTsKK30KKwordm9pZAorX19rbXBfaW5pdF9uZXN0ZWRfZHJkcGFfbG9jaygga21wX2RyZHBhX2xvY2tfdCAqIGxjayApCit7CisgICAgX19rbXBfaW5pdF9kcmRwYV9sb2NrKCBsY2sgKTsKKyAgICBsY2stPmxrLmRlcHRoX2xvY2tlZCA9IDA7IC8vID49IDAgZm9yIG5lc3RhYmxlIGxvY2tzLCAtMSBmb3Igc2ltcGxlIGxvY2tzCit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9pbml0X25lc3RlZF9kcmRwYV9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfZHJkcGFfbG9ja190ICogbGNrICkKK3sKKyAgICBfX2ttcF9pbml0X25lc3RlZF9kcmRwYV9sb2NrKCBsY2sgKTsKK30KKwordm9pZAorX19rbXBfZGVzdHJveV9uZXN0ZWRfZHJkcGFfbG9jaygga21wX2RyZHBhX2xvY2tfdCAqbGNrICkKK3sKKyAgICBfX2ttcF9kZXN0cm95X2RyZHBhX2xvY2soIGxjayApOworICAgIGxjay0+bGsuZGVwdGhfbG9ja2VkID0gMDsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2Rlc3Ryb3lfbmVzdGVkX2RyZHBhX2xvY2tfd2l0aF9jaGVja3MoIGttcF9kcmRwYV9sb2NrX3QgKmxjayApCit7CisgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX2Rlc3Ryb3lfbmVzdF9sb2NrIjsKKyAgICBpZiAoIGxjay0+bGsuaW5pdGlhbGl6ZWQgIT0gbGNrICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCAhIF9fa21wX2lzX2RyZHBhX2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tTaW1wbGVVc2VkQXNOZXN0YWJsZSwgZnVuYyApOworICAgIH0KKyAgICBpZiAoIF9fa21wX2dldF9kcmRwYV9sb2NrX293bmVyKCBsY2sgKSAhPSAtMSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrU3RpbGxPd25lZCwgZnVuYyApOworICAgIH0KKyAgICBfX2ttcF9kZXN0cm95X25lc3RlZF9kcmRwYV9sb2NrKCBsY2sgKTsKK30KKworCisvLworLy8gYWNjZXNzIGZ1bmN0aW9ucyB0byBmaWVsZHMgd2hpY2ggZG9uJ3QgZXhpc3QgZm9yIGFsbCBsb2NrIGtpbmRzLgorLy8KKworc3RhdGljIGludAorX19rbXBfaXNfZHJkcGFfbG9ja19pbml0aWFsaXplZCgga21wX2RyZHBhX2xvY2tfdCAqbGNrICkKK3sKKyAgICByZXR1cm4gbGNrID09IGxjay0+bGsuaW5pdGlhbGl6ZWQ7Cit9CisKK3N0YXRpYyBjb25zdCBpZGVudF90ICoKK19fa21wX2dldF9kcmRwYV9sb2NrX2xvY2F0aW9uKCBrbXBfZHJkcGFfbG9ja190ICpsY2sgKQoreworICAgIHJldHVybiBsY2stPmxrLmxvY2F0aW9uOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfc2V0X2RyZHBhX2xvY2tfbG9jYXRpb24oIGttcF9kcmRwYV9sb2NrX3QgKmxjaywgY29uc3QgaWRlbnRfdCAqbG9jICkKK3sKKyAgICBsY2stPmxrLmxvY2F0aW9uID0gbG9jOworfQorCitzdGF0aWMga21wX2xvY2tfZmxhZ3NfdAorX19rbXBfZ2V0X2RyZHBhX2xvY2tfZmxhZ3MoIGttcF9kcmRwYV9sb2NrX3QgKmxjayApCit7CisgICAgcmV0dXJuIGxjay0+bGsuZmxhZ3M7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9zZXRfZHJkcGFfbG9ja19mbGFncygga21wX2RyZHBhX2xvY2tfdCAqbGNrLCBrbXBfbG9ja19mbGFnc190IGZsYWdzICkKK3sKKyAgICBsY2stPmxrLmZsYWdzID0gZmxhZ3M7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogdXNlciBsb2NrcworICoKKyAqIFRoZXkgYXJlIGltcGxlbWVudGVkIGFzIGEgdGFibGUgb2YgZnVuY3Rpb24gcG9pbnRlcnMgd2hpY2ggYXJlIHNldCB0byB0aGUKKyAqIGxvY2sgZnVuY3Rpb25zIG9mIHRoZSBhcHByb3ByaWF0ZSBraW5kLCBvbmNlIHRoYXQgaGFzIGJlZW4gZGV0ZXJtaW5lZC4KKyAqLworCitlbnVtIGttcF9sb2NrX2tpbmQgX19rbXBfdXNlcl9sb2NrX2tpbmQgPSBsa19kZWZhdWx0OworCitzaXplX3QgX19rbXBfYmFzZV91c2VyX2xvY2tfc2l6ZSA9IDA7CitzaXplX3QgX19rbXBfdXNlcl9sb2NrX3NpemUgPSAwOworCitrbXBfaW50MzIgKCAqX19rbXBfZ2V0X3VzZXJfbG9ja19vd25lcl8gKSgga21wX3VzZXJfbG9ja19wIGxjayApID0gTlVMTDsKK3ZvaWQgKCAqX19rbXBfYWNxdWlyZV91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGttcF91c2VyX2xvY2tfcCBsY2ssIGttcF9pbnQzMiBndGlkICkgPSBOVUxMOworCitpbnQgKCAqX19rbXBfdGVzdF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGttcF91c2VyX2xvY2tfcCBsY2ssIGttcF9pbnQzMiBndGlkICkgPSBOVUxMOwordm9pZCAoICpfX2ttcF9yZWxlYXNlX3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSgga21wX3VzZXJfbG9ja19wIGxjaywga21wX2ludDMyIGd0aWQgKSA9IE5VTEw7Cit2b2lkICggKl9fa21wX2luaXRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyApKCBrbXBfdXNlcl9sb2NrX3AgbGNrICkgPSBOVUxMOwordm9pZCAoICpfX2ttcF9kZXN0cm95X3VzZXJfbG9ja18gKSgga21wX3VzZXJfbG9ja19wIGxjayApID0gTlVMTDsKK3ZvaWQgKCAqX19rbXBfZGVzdHJveV91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGttcF91c2VyX2xvY2tfcCBsY2sgKSA9IE5VTEw7Cit2b2lkICggKl9fa21wX2FjcXVpcmVfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSgga21wX3VzZXJfbG9ja19wIGxjaywga21wX2ludDMyIGd0aWQgKSA9IE5VTEw7CisKK2ludCAoICpfX2ttcF90ZXN0X25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGttcF91c2VyX2xvY2tfcCBsY2ssIGttcF9pbnQzMiBndGlkICkgPSBOVUxMOwordm9pZCAoICpfX2ttcF9yZWxlYXNlX25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGttcF91c2VyX2xvY2tfcCBsY2ssIGttcF9pbnQzMiBndGlkICkgPSBOVUxMOwordm9pZCAoICpfX2ttcF9pbml0X25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGttcF91c2VyX2xvY2tfcCBsY2sgKSA9IE5VTEw7Cit2b2lkICggKl9fa21wX2Rlc3Ryb3lfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSgga21wX3VzZXJfbG9ja19wIGxjayApID0gTlVMTDsKKworaW50ICggKl9fa21wX2lzX3VzZXJfbG9ja19pbml0aWFsaXplZF8gKSgga21wX3VzZXJfbG9ja19wIGxjayApID0gTlVMTDsKK2NvbnN0IGlkZW50X3QgKiAoICpfX2ttcF9nZXRfdXNlcl9sb2NrX2xvY2F0aW9uXyApKCBrbXBfdXNlcl9sb2NrX3AgbGNrICkgPSBOVUxMOwordm9pZCAoICpfX2ttcF9zZXRfdXNlcl9sb2NrX2xvY2F0aW9uXyApKCBrbXBfdXNlcl9sb2NrX3AgbGNrLCBjb25zdCBpZGVudF90ICpsb2MgKSA9IE5VTEw7CitrbXBfbG9ja19mbGFnc190ICggKl9fa21wX2dldF91c2VyX2xvY2tfZmxhZ3NfICkoIGttcF91c2VyX2xvY2tfcCBsY2sgKSA9IE5VTEw7Cit2b2lkICggKl9fa21wX3NldF91c2VyX2xvY2tfZmxhZ3NfICkoIGttcF91c2VyX2xvY2tfcCBsY2ssIGttcF9sb2NrX2ZsYWdzX3QgZmxhZ3MgKSA9IE5VTEw7CisKK3ZvaWQgX19rbXBfc2V0X3VzZXJfbG9ja192cHRycygga21wX2xvY2tfa2luZF90IHVzZXJfbG9ja19raW5kICkKK3sKKyAgICBzd2l0Y2ggKCB1c2VyX2xvY2tfa2luZCApIHsKKyAgICAgICAgY2FzZSBsa19kZWZhdWx0OgorICAgICAgICBkZWZhdWx0OgorICAgICAgICBLTVBfQVNTRVJUKCAwICk7CisKKyAgICAgICAgY2FzZSBsa190YXM6IHsKKyAgICAgICAgICAgIF9fa21wX2Jhc2VfdXNlcl9sb2NrX3NpemUgPSBzaXplb2YoIGttcF9iYXNlX3Rhc19sb2NrX3QgKTsKKyAgICAgICAgICAgIF9fa21wX3VzZXJfbG9ja19zaXplID0gc2l6ZW9mKCBrbXBfdGFzX2xvY2tfdCApOworCisgICAgICAgICAgICBfX2ttcF9nZXRfdXNlcl9sb2NrX293bmVyXyA9CisgICAgICAgICAgICAgICgga21wX2ludDMyICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApCisgICAgICAgICAgICAgICggJl9fa21wX2dldF90YXNfbG9ja19vd25lciApOworCisgICAgICAgICAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgICAgICAgICBLTVBfQklORF9VU0VSX0xPQ0tfV0lUSF9DSEVDS1ModGFzKTsKKyAgICAgICAgICAgICAgICBLTVBfQklORF9ORVNURURfVVNFUl9MT0NLX1dJVEhfQ0hFQ0tTKHRhcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBLTVBfQklORF9VU0VSX0xPQ0sodGFzKTsKKyAgICAgICAgICAgICAgICBLTVBfQklORF9ORVNURURfVVNFUl9MT0NLKHRhcyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIF9fa21wX2Rlc3Ryb3lfdXNlcl9sb2NrXyA9CisgICAgICAgICAgICAgICggdm9pZCAoICogKSgga21wX3VzZXJfbG9ja19wICkgKQorICAgICAgICAgICAgICAoICZfX2ttcF9kZXN0cm95X3Rhc19sb2NrICk7CisKKyAgICAgICAgICAgICBfX2ttcF9pc191c2VyX2xvY2tfaW5pdGlhbGl6ZWRfID0KKyAgICAgICAgICAgICAgICggaW50ICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApIE5VTEw7CisKKyAgICAgICAgICAgICBfX2ttcF9nZXRfdXNlcl9sb2NrX2xvY2F0aW9uXyA9CisgICAgICAgICAgICAgICAoIGNvbnN0IGlkZW50X3QgKiAoICogKSgga21wX3VzZXJfbG9ja19wICkgKSBOVUxMOworCisgICAgICAgICAgICAgX19rbXBfc2V0X3VzZXJfbG9ja19sb2NhdGlvbl8gPQorICAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AsIGNvbnN0IGlkZW50X3QgKiApICkgTlVMTDsKKworICAgICAgICAgICAgIF9fa21wX2dldF91c2VyX2xvY2tfZmxhZ3NfID0KKyAgICAgICAgICAgICAgICgga21wX2xvY2tfZmxhZ3NfdCAoICogKSgga21wX3VzZXJfbG9ja19wICkgKSBOVUxMOworCisgICAgICAgICAgICAgX19rbXBfc2V0X3VzZXJfbG9ja19mbGFnc18gPQorICAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AsIGttcF9sb2NrX2ZsYWdzX3QgKSApIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyNpZiBLTVBfT1NfTElOVVggJiYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNKQorCisgICAgICAgIGNhc2UgbGtfZnV0ZXg6IHsKKyAgICAgICAgICAgIF9fa21wX2Jhc2VfdXNlcl9sb2NrX3NpemUgPSBzaXplb2YoIGttcF9iYXNlX2Z1dGV4X2xvY2tfdCApOworICAgICAgICAgICAgX19rbXBfdXNlcl9sb2NrX3NpemUgPSBzaXplb2YoIGttcF9mdXRleF9sb2NrX3QgKTsKKworICAgICAgICAgICAgX19rbXBfZ2V0X3VzZXJfbG9ja19vd25lcl8gPQorICAgICAgICAgICAgICAoIGttcF9pbnQzMiAoICogKSgga21wX3VzZXJfbG9ja19wICkgKQorICAgICAgICAgICAgICAoICZfX2ttcF9nZXRfZnV0ZXhfbG9ja19vd25lciApOworCisgICAgICAgICAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgICAgICAgICBLTVBfQklORF9VU0VSX0xPQ0tfV0lUSF9DSEVDS1MoZnV0ZXgpOworICAgICAgICAgICAgICAgIEtNUF9CSU5EX05FU1RFRF9VU0VSX0xPQ0tfV0lUSF9DSEVDS1MoZnV0ZXgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgS01QX0JJTkRfVVNFUl9MT0NLKGZ1dGV4KTsKKyAgICAgICAgICAgICAgICBLTVBfQklORF9ORVNURURfVVNFUl9MT0NLKGZ1dGV4KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgX19rbXBfZGVzdHJveV91c2VyX2xvY2tfID0KKyAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApCisgICAgICAgICAgICAgICggJl9fa21wX2Rlc3Ryb3lfZnV0ZXhfbG9jayApOworCisgICAgICAgICAgICAgX19rbXBfaXNfdXNlcl9sb2NrX2luaXRpYWxpemVkXyA9CisgICAgICAgICAgICAgICAoIGludCAoICogKSgga21wX3VzZXJfbG9ja19wICkgKSBOVUxMOworCisgICAgICAgICAgICAgX19rbXBfZ2V0X3VzZXJfbG9ja19sb2NhdGlvbl8gPQorICAgICAgICAgICAgICAgKCBjb25zdCBpZGVudF90ICogKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkgTlVMTDsKKworICAgICAgICAgICAgIF9fa21wX3NldF91c2VyX2xvY2tfbG9jYXRpb25fID0KKyAgICAgICAgICAgICAgICggdm9pZCAoICogKSgga21wX3VzZXJfbG9ja19wLCBjb25zdCBpZGVudF90ICogKSApIE5VTEw7CisKKyAgICAgICAgICAgICBfX2ttcF9nZXRfdXNlcl9sb2NrX2ZsYWdzXyA9CisgICAgICAgICAgICAgICAoIGttcF9sb2NrX2ZsYWdzX3QgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkgTlVMTDsKKworICAgICAgICAgICAgIF9fa21wX3NldF91c2VyX2xvY2tfZmxhZ3NfID0KKyAgICAgICAgICAgICAgICggdm9pZCAoICogKSgga21wX3VzZXJfbG9ja19wLCBrbXBfbG9ja19mbGFnc190ICkgKSBOVUxMOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisjZW5kaWYgLy8gS01QX09TX0xJTlVYICYmIChLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSkKKworICAgICAgICBjYXNlIGxrX3RpY2tldDogeworICAgICAgICAgICAgX19rbXBfYmFzZV91c2VyX2xvY2tfc2l6ZSA9IHNpemVvZigga21wX2Jhc2VfdGlja2V0X2xvY2tfdCApOworICAgICAgICAgICAgX19rbXBfdXNlcl9sb2NrX3NpemUgPSBzaXplb2YoIGttcF90aWNrZXRfbG9ja190ICk7CisKKyAgICAgICAgICAgIF9fa21wX2dldF91c2VyX2xvY2tfb3duZXJfID0KKyAgICAgICAgICAgICAgKCBrbXBfaW50MzIgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfZ2V0X3RpY2tldF9sb2NrX293bmVyICk7CisKKyAgICAgICAgICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICAgICAgICAgIEtNUF9CSU5EX1VTRVJfTE9DS19XSVRIX0NIRUNLUyh0aWNrZXQpOworICAgICAgICAgICAgICAgIEtNUF9CSU5EX05FU1RFRF9VU0VSX0xPQ0tfV0lUSF9DSEVDS1ModGlja2V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIEtNUF9CSU5EX1VTRVJfTE9DSyh0aWNrZXQpOworICAgICAgICAgICAgICAgIEtNUF9CSU5EX05FU1RFRF9VU0VSX0xPQ0sodGlja2V0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgX19rbXBfZGVzdHJveV91c2VyX2xvY2tfID0KKyAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApCisgICAgICAgICAgICAgICggJl9fa21wX2Rlc3Ryb3lfdGlja2V0X2xvY2sgKTsKKworICAgICAgICAgICAgIF9fa21wX2lzX3VzZXJfbG9ja19pbml0aWFsaXplZF8gPQorICAgICAgICAgICAgICAgKCBpbnQgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgICggJl9fa21wX2lzX3RpY2tldF9sb2NrX2luaXRpYWxpemVkICk7CisKKyAgICAgICAgICAgICBfX2ttcF9nZXRfdXNlcl9sb2NrX2xvY2F0aW9uXyA9CisgICAgICAgICAgICAgICAoIGNvbnN0IGlkZW50X3QgKiAoICogKSgga21wX3VzZXJfbG9ja19wICkgKQorICAgICAgICAgICAgICAgKCAmX19rbXBfZ2V0X3RpY2tldF9sb2NrX2xvY2F0aW9uICk7CisKKyAgICAgICAgICAgICBfX2ttcF9zZXRfdXNlcl9sb2NrX2xvY2F0aW9uXyA9CisgICAgICAgICAgICAgICAoIHZvaWQgKCAqICkoIGttcF91c2VyX2xvY2tfcCwgY29uc3QgaWRlbnRfdCAqICkgKQorICAgICAgICAgICAgICAgKCAmX19rbXBfc2V0X3RpY2tldF9sb2NrX2xvY2F0aW9uICk7CisKKyAgICAgICAgICAgICBfX2ttcF9nZXRfdXNlcl9sb2NrX2ZsYWdzXyA9CisgICAgICAgICAgICAgICAoIGttcF9sb2NrX2ZsYWdzX3QgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgICggJl9fa21wX2dldF90aWNrZXRfbG9ja19mbGFncyApOworCisgICAgICAgICAgICAgX19rbXBfc2V0X3VzZXJfbG9ja19mbGFnc18gPQorICAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AsIGttcF9sb2NrX2ZsYWdzX3QgKSApCisgICAgICAgICAgICAgICAoICZfX2ttcF9zZXRfdGlja2V0X2xvY2tfZmxhZ3MgKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGxrX3F1ZXVpbmc6IHsKKyAgICAgICAgICAgIF9fa21wX2Jhc2VfdXNlcl9sb2NrX3NpemUgPSBzaXplb2YoIGttcF9iYXNlX3F1ZXVpbmdfbG9ja190ICk7CisgICAgICAgICAgICBfX2ttcF91c2VyX2xvY2tfc2l6ZSA9IHNpemVvZigga21wX3F1ZXVpbmdfbG9ja190ICk7CisKKyAgICAgICAgICAgIF9fa21wX2dldF91c2VyX2xvY2tfb3duZXJfID0KKyAgICAgICAgICAgICAgKCBrbXBfaW50MzIgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfZ2V0X3F1ZXVpbmdfbG9ja19vd25lciApOworCisgICAgICAgICAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgICAgICAgICBLTVBfQklORF9VU0VSX0xPQ0tfV0lUSF9DSEVDS1MocXVldWluZyk7CisgICAgICAgICAgICAgICAgS01QX0JJTkRfTkVTVEVEX1VTRVJfTE9DS19XSVRIX0NIRUNLUyhxdWV1aW5nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIEtNUF9CSU5EX1VTRVJfTE9DSyhxdWV1aW5nKTsKKyAgICAgICAgICAgICAgICBLTVBfQklORF9ORVNURURfVVNFUl9MT0NLKHF1ZXVpbmcpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfX2ttcF9kZXN0cm95X3VzZXJfbG9ja18gPQorICAgICAgICAgICAgICAoIHZvaWQgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfZGVzdHJveV9xdWV1aW5nX2xvY2sgKTsKKworICAgICAgICAgICAgIF9fa21wX2lzX3VzZXJfbG9ja19pbml0aWFsaXplZF8gPQorICAgICAgICAgICAgICAgKCBpbnQgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgICggJl9fa21wX2lzX3F1ZXVpbmdfbG9ja19pbml0aWFsaXplZCApOworCisgICAgICAgICAgICAgX19rbXBfZ2V0X3VzZXJfbG9ja19sb2NhdGlvbl8gPQorICAgICAgICAgICAgICAgKCBjb25zdCBpZGVudF90ICogKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgICggJl9fa21wX2dldF9xdWV1aW5nX2xvY2tfbG9jYXRpb24gKTsKKworICAgICAgICAgICAgIF9fa21wX3NldF91c2VyX2xvY2tfbG9jYXRpb25fID0KKyAgICAgICAgICAgICAgICggdm9pZCAoICogKSgga21wX3VzZXJfbG9ja19wLCBjb25zdCBpZGVudF90ICogKSApCisgICAgICAgICAgICAgICAoICZfX2ttcF9zZXRfcXVldWluZ19sb2NrX2xvY2F0aW9uICk7CisKKyAgICAgICAgICAgICBfX2ttcF9nZXRfdXNlcl9sb2NrX2ZsYWdzXyA9CisgICAgICAgICAgICAgICAoIGttcF9sb2NrX2ZsYWdzX3QgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgICggJl9fa21wX2dldF9xdWV1aW5nX2xvY2tfZmxhZ3MgKTsKKworICAgICAgICAgICAgIF9fa21wX3NldF91c2VyX2xvY2tfZmxhZ3NfID0KKyAgICAgICAgICAgICAgICggdm9pZCAoICogKSgga21wX3VzZXJfbG9ja19wLCBrbXBfbG9ja19mbGFnc190ICkgKQorICAgICAgICAgICAgICAgKCAmX19rbXBfc2V0X3F1ZXVpbmdfbG9ja19mbGFncyApOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisjaWYgS01QX1VTRV9BREFQVElWRV9MT0NLUworICAgICAgICBjYXNlIGxrX2FkYXB0aXZlOiB7CisgICAgICAgICAgICBfX2ttcF9iYXNlX3VzZXJfbG9ja19zaXplID0gc2l6ZW9mKCBrbXBfYmFzZV9hZGFwdGl2ZV9sb2NrX3QgKTsKKyAgICAgICAgICAgIF9fa21wX3VzZXJfbG9ja19zaXplID0gc2l6ZW9mKCBrbXBfYWRhcHRpdmVfbG9ja190ICk7CisKKyAgICAgICAgICAgIF9fa21wX2dldF91c2VyX2xvY2tfb3duZXJfID0KKyAgICAgICAgICAgICAgKCBrbXBfaW50MzIgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfZ2V0X3F1ZXVpbmdfbG9ja19vd25lciApOworCisgICAgICAgICAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgICAgICAgICBLTVBfQklORF9VU0VSX0xPQ0tfV0lUSF9DSEVDS1MoYWRhcHRpdmUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgS01QX0JJTkRfVVNFUl9MT0NLKGFkYXB0aXZlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgX19rbXBfZGVzdHJveV91c2VyX2xvY2tfID0KKyAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApCisgICAgICAgICAgICAgICggJl9fa21wX2Rlc3Ryb3lfYWRhcHRpdmVfbG9jayApOworCisgICAgICAgICAgICBfX2ttcF9pc191c2VyX2xvY2tfaW5pdGlhbGl6ZWRfID0KKyAgICAgICAgICAgICAgKCBpbnQgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfaXNfcXVldWluZ19sb2NrX2luaXRpYWxpemVkICk7CisKKyAgICAgICAgICAgIF9fa21wX2dldF91c2VyX2xvY2tfbG9jYXRpb25fID0KKyAgICAgICAgICAgICAgKCBjb25zdCBpZGVudF90ICogKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfZ2V0X3F1ZXVpbmdfbG9ja19sb2NhdGlvbiApOworCisgICAgICAgICAgICBfX2ttcF9zZXRfdXNlcl9sb2NrX2xvY2F0aW9uXyA9CisgICAgICAgICAgICAgICggdm9pZCAoICogKSgga21wX3VzZXJfbG9ja19wLCBjb25zdCBpZGVudF90ICogKSApCisgICAgICAgICAgICAgICggJl9fa21wX3NldF9xdWV1aW5nX2xvY2tfbG9jYXRpb24gKTsKKworICAgICAgICAgICAgX19rbXBfZ2V0X3VzZXJfbG9ja19mbGFnc18gPQorICAgICAgICAgICAgICAoIGttcF9sb2NrX2ZsYWdzX3QgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfZ2V0X3F1ZXVpbmdfbG9ja19mbGFncyApOworCisgICAgICAgICAgICBfX2ttcF9zZXRfdXNlcl9sb2NrX2ZsYWdzXyA9CisgICAgICAgICAgICAgICggdm9pZCAoICogKSgga21wX3VzZXJfbG9ja19wLCBrbXBfbG9ja19mbGFnc190ICkgKQorICAgICAgICAgICAgICAoICZfX2ttcF9zZXRfcXVldWluZ19sb2NrX2ZsYWdzICk7CisKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyNlbmRpZiAvLyBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisKKyAgICAgICAgY2FzZSBsa19kcmRwYTogeworICAgICAgICAgICAgX19rbXBfYmFzZV91c2VyX2xvY2tfc2l6ZSA9IHNpemVvZigga21wX2Jhc2VfZHJkcGFfbG9ja190ICk7CisgICAgICAgICAgICBfX2ttcF91c2VyX2xvY2tfc2l6ZSA9IHNpemVvZigga21wX2RyZHBhX2xvY2tfdCApOworCisgICAgICAgICAgICBfX2ttcF9nZXRfdXNlcl9sb2NrX293bmVyXyA9CisgICAgICAgICAgICAgICgga21wX2ludDMyICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApCisgICAgICAgICAgICAgICggJl9fa21wX2dldF9kcmRwYV9sb2NrX293bmVyICk7CisKKyAgICAgICAgICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICAgICAgICAgIEtNUF9CSU5EX1VTRVJfTE9DS19XSVRIX0NIRUNLUyhkcmRwYSk7CisgICAgICAgICAgICAgICAgS01QX0JJTkRfTkVTVEVEX1VTRVJfTE9DS19XSVRIX0NIRUNLUyhkcmRwYSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBLTVBfQklORF9VU0VSX0xPQ0soZHJkcGEpOworICAgICAgICAgICAgICAgIEtNUF9CSU5EX05FU1RFRF9VU0VSX0xPQ0soZHJkcGEpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfX2ttcF9kZXN0cm95X3VzZXJfbG9ja18gPQorICAgICAgICAgICAgICAoIHZvaWQgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfZGVzdHJveV9kcmRwYV9sb2NrICk7CisKKyAgICAgICAgICAgICBfX2ttcF9pc191c2VyX2xvY2tfaW5pdGlhbGl6ZWRfID0KKyAgICAgICAgICAgICAgICggaW50ICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApCisgICAgICAgICAgICAgICAoICZfX2ttcF9pc19kcmRwYV9sb2NrX2luaXRpYWxpemVkICk7CisKKyAgICAgICAgICAgICBfX2ttcF9nZXRfdXNlcl9sb2NrX2xvY2F0aW9uXyA9CisgICAgICAgICAgICAgICAoIGNvbnN0IGlkZW50X3QgKiAoICogKSgga21wX3VzZXJfbG9ja19wICkgKQorICAgICAgICAgICAgICAgKCAmX19rbXBfZ2V0X2RyZHBhX2xvY2tfbG9jYXRpb24gKTsKKworICAgICAgICAgICAgIF9fa21wX3NldF91c2VyX2xvY2tfbG9jYXRpb25fID0KKyAgICAgICAgICAgICAgICggdm9pZCAoICogKSgga21wX3VzZXJfbG9ja19wLCBjb25zdCBpZGVudF90ICogKSApCisgICAgICAgICAgICAgICAoICZfX2ttcF9zZXRfZHJkcGFfbG9ja19sb2NhdGlvbiApOworCisgICAgICAgICAgICAgX19rbXBfZ2V0X3VzZXJfbG9ja19mbGFnc18gPQorICAgICAgICAgICAgICAgKCBrbXBfbG9ja19mbGFnc190ICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApCisgICAgICAgICAgICAgICAoICZfX2ttcF9nZXRfZHJkcGFfbG9ja19mbGFncyApOworCisgICAgICAgICAgICAgX19rbXBfc2V0X3VzZXJfbG9ja19mbGFnc18gPQorICAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AsIGttcF9sb2NrX2ZsYWdzX3QgKSApCisgICAgICAgICAgICAgICAoICZfX2ttcF9zZXRfZHJkcGFfbG9ja19mbGFncyApOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBVc2VyIGxvY2sgdGFibGUgJiBsb2NrIGFsbG9jYXRpb24KKwora21wX2xvY2tfdGFibGVfdCBfX2ttcF91c2VyX2xvY2tfdGFibGUgPSB7IDEsIDAsIE5VTEwgfTsKK2ttcF91c2VyX2xvY2tfcCBfX2ttcF9sb2NrX3Bvb2wgPSBOVUxMOworCisvLyBMb2NrIGJsb2NrLWFsbG9jYXRpb24gc3VwcG9ydC4KK2ttcF9ibG9ja19vZl9sb2NrcyogX19rbXBfbG9ja19ibG9ja3MgPSBOVUxMOworaW50IF9fa21wX251bV9sb2Nrc19pbl9ibG9jayA9IDE7ICAgICAgICAgICAgIC8vIEZJWE1FIC0gdHVuZSB0aGlzIHZhbHVlCisKK3N0YXRpYyBrbXBfbG9ja19pbmRleF90CitfX2ttcF9sb2NrX3RhYmxlX2luc2VydCgga21wX3VzZXJfbG9ja19wIGxjayApCit7CisgICAgLy8gQXNzdW1lIHRoYXQga21wX2dsb2JhbF9sb2NrIGlzIGhlbGQgdXBvbiBlbnRyeS9leGl0LgorICAgIGttcF9sb2NrX2luZGV4X3QgaW5kZXg7CisgICAgaWYgKCBfX2ttcF91c2VyX2xvY2tfdGFibGUudXNlZCA+PSBfX2ttcF91c2VyX2xvY2tfdGFibGUuYWxsb2NhdGVkICkgeworICAgICAgICBrbXBfbG9ja19pbmRleF90IHNpemU7CisgICAgICAgIGttcF91c2VyX2xvY2tfcCAqdGFibGU7CisgICAgICAgIGttcF9sb2NrX2luZGV4X3QgaTsKKyAgICAgICAgLy8gUmVhbGxvY2F0ZSBsb2NrIHRhYmxlLgorICAgICAgICBpZiAoIF9fa21wX3VzZXJfbG9ja190YWJsZS5hbGxvY2F0ZWQgPT0gMCApIHsKKyAgICAgICAgICAgIHNpemUgPSAxMDI0OworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgc2l6ZSA9IF9fa21wX3VzZXJfbG9ja190YWJsZS5hbGxvY2F0ZWQgKiAyOworICAgICAgICB9CisgICAgICAgIHRhYmxlID0gKGttcF91c2VyX2xvY2tfcCAqKV9fa21wX2FsbG9jYXRlKCBzaXplb2YoIGttcF91c2VyX2xvY2tfcCApICogc2l6ZSApOworICAgICAgICBtZW1jcHkoIHRhYmxlICsgMSwgX19rbXBfdXNlcl9sb2NrX3RhYmxlLnRhYmxlICsgMSwgc2l6ZW9mKCBrbXBfdXNlcl9sb2NrX3AgKSAqICggX19rbXBfdXNlcl9sb2NrX3RhYmxlLnVzZWQgLSAxICkgKTsKKyAgICAgICAgdGFibGVbIDAgXSA9IChrbXBfdXNlcl9sb2NrX3ApX19rbXBfdXNlcl9sb2NrX3RhYmxlLnRhYmxlOworICAgICAgICAgICAgLy8gV2UgY2Fubm90IGZyZWUgdGhlIHByZXZpb3MgdGFibGUgbm93LCBzaW5zZSBpdCBtYXkgYmUgaW4gdXNlIGJ5IG90aGVyCisgICAgICAgICAgICAvLyB0aHJlYWRzLiBTbyBzYXZlIHRoZSBwb2ludGVyIHRvIHRoZSBwcmV2aW91cyB0YWJsZSBpbiBpbiB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUKKyAgICAgICAgICAgIC8vIG5ldyB0YWJsZS4gQWxsIHRoZSB0YWJsZXMgd2lsbCBiZSBvcmdhbml6ZWQgaW50byBhIGxpc3QsIGFuZCBjb3VsZCBiZSBmcmVlZCB3aGVuCisgICAgICAgICAgICAvLyBsaWJyYXJ5IHNodXR0aW5nIGRvd24uCisgICAgICAgIF9fa21wX3VzZXJfbG9ja190YWJsZS50YWJsZSA9IHRhYmxlOworICAgICAgICBfX2ttcF91c2VyX2xvY2tfdGFibGUuYWxsb2NhdGVkID0gc2l6ZTsKKyAgICB9CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfdXNlcl9sb2NrX3RhYmxlLnVzZWQgPCBfX2ttcF91c2VyX2xvY2tfdGFibGUuYWxsb2NhdGVkICk7CisgICAgaW5kZXggPSBfX2ttcF91c2VyX2xvY2tfdGFibGUudXNlZDsKKyAgICBfX2ttcF91c2VyX2xvY2tfdGFibGUudGFibGVbIGluZGV4IF0gPSBsY2s7CisgICAgKysgX19rbXBfdXNlcl9sb2NrX3RhYmxlLnVzZWQ7CisgICAgcmV0dXJuIGluZGV4OworfQorCitzdGF0aWMga21wX3VzZXJfbG9ja19wCitfX2ttcF9sb2NrX2Jsb2NrX2FsbG9jYXRlKCkKK3sKKyAgICAvLyBBc3N1bWUgdGhhdCBrbXBfZ2xvYmFsX2xvY2sgaXMgaGVsZCB1cG9uIGVudHJ5L2V4aXQuCisgICAgc3RhdGljIGludCBsYXN0X2luZGV4ID0gMDsKKyAgICBpZiAoICggbGFzdF9pbmRleCA+PSBfX2ttcF9udW1fbG9ja3NfaW5fYmxvY2sgKQorICAgICAgfHwgKCBfX2ttcF9sb2NrX2Jsb2NrcyA9PSBOVUxMICkgKSB7CisgICAgICAgIC8vIFJlc3RhcnQgdGhlIGluZGV4LgorICAgICAgICBsYXN0X2luZGV4ID0gMDsKKyAgICAgICAgLy8gTmVlZCB0byBhbGxvY2F0ZSBhIG5ldyBibG9jay4KKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfdXNlcl9sb2NrX3NpemUgPiAwICk7CisgICAgICAgIHNpemVfdCBzcGFjZV9mb3JfbG9ja3MgPSBfX2ttcF91c2VyX2xvY2tfc2l6ZSAqIF9fa21wX251bV9sb2Nrc19pbl9ibG9jazsKKyAgICAgICAgY2hhciogYnVmZmVyID0gKGNoYXIqKV9fa21wX2FsbG9jYXRlKCBzcGFjZV9mb3JfbG9ja3MgKyBzaXplb2YoIGttcF9ibG9ja19vZl9sb2NrcyApICk7CisgICAgICAgIC8vIFNldCB1cCB0aGUgbmV3IGJsb2NrLgorICAgICAgICBrbXBfYmxvY2tfb2ZfbG9ja3MgKm5ld19ibG9jayA9IChrbXBfYmxvY2tfb2ZfbG9ja3MgKikoJiBidWZmZXJbc3BhY2VfZm9yX2xvY2tzXSk7CisgICAgICAgIG5ld19ibG9jay0+bmV4dF9ibG9jayA9IF9fa21wX2xvY2tfYmxvY2tzOworICAgICAgICBuZXdfYmxvY2stPmxvY2tzID0gKHZvaWQgKilidWZmZXI7CisgICAgICAgIC8vIFB1Ymxpc2ggdGhlIG5ldyBibG9jay4KKyAgICAgICAgS01QX01CKCk7CisgICAgICAgIF9fa21wX2xvY2tfYmxvY2tzID0gbmV3X2Jsb2NrOworICAgIH0KKyAgICBrbXBfdXNlcl9sb2NrX3AgcmV0ID0gKGttcF91c2VyX2xvY2tfcCkoJiAoICggKGNoYXIgKikoIF9fa21wX2xvY2tfYmxvY2tzLT5sb2NrcyApICkKKyAgICAgIFsgbGFzdF9pbmRleCAqIF9fa21wX3VzZXJfbG9ja19zaXplIF0gKSApOworICAgIGxhc3RfaW5kZXgrKzsKKyAgICByZXR1cm4gcmV0OworfQorCisvLworLy8gR2V0IG1lbW9yeSBmb3IgYSBsb2NrLiBJdCBtYXkgYmUgZnJlc2hseSBhbGxvY2F0ZWQgbWVtb3J5IG9yIHJldXNlZCBtZW1vcnkKKy8vIGZyb20gbG9jayBwb29sLgorLy8KK2ttcF91c2VyX2xvY2tfcAorX19rbXBfdXNlcl9sb2NrX2FsbG9jYXRlKCB2b2lkICoqdXNlcl9sb2NrLCBrbXBfaW50MzIgZ3RpZCwKKyAga21wX2xvY2tfZmxhZ3NfdCBmbGFncyApCit7CisgICAga21wX3VzZXJfbG9ja19wIGxjazsKKyAgICBrbXBfbG9ja19pbmRleF90IGluZGV4OworICAgIEtNUF9ERUJVR19BU1NFUlQoIHVzZXJfbG9jayApOworCisgICAgX19rbXBfYWNxdWlyZV9sb2NrKCAmX19rbXBfZ2xvYmFsX2xvY2ssIGd0aWQgKTsKKworICAgIGlmICggX19rbXBfbG9ja19wb29sID09IE5VTEwgKSB7CisgICAgICAgIC8vIExvY2sgcG9vbCBpcyBlbXB0eS4gQWxsb2NhdGUgbmV3IG1lbW9yeS4KKyAgICAgICAgaWYgKCBfX2ttcF9udW1fbG9ja3NfaW5fYmxvY2sgPD0gMSApIHsgLy8gVHVuZSB0aGlzIGN1dG9mZiBwb2ludC4KKyAgICAgICAgICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApIF9fa21wX2FsbG9jYXRlKCBfX2ttcF91c2VyX2xvY2tfc2l6ZSApOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgbGNrID0gX19rbXBfbG9ja19ibG9ja19hbGxvY2F0ZSgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gSW5zZXJ0IGxvY2sgaW4gdGhlIHRhYmxlIHNvIHRoYXQgaXQgY2FuIGJlIGZyZWVkIGluIF9fa21wX2NsZWFudXAsCisgICAgICAgIC8vIGFuZCBkZWJ1Z2dlciBoYXMgaW5mbyBvbiBhbGwgYWxsb2NhdGVkIGxvY2tzLgorICAgICAgICBpbmRleCA9IF9fa21wX2xvY2tfdGFibGVfaW5zZXJ0KCBsY2sgKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8vIFBpY2sgdXAgbG9jayBmcm9tIHBvb2wuCisgICAgICAgIGxjayA9IF9fa21wX2xvY2tfcG9vbDsKKyAgICAgICAgaW5kZXggPSBfX2ttcF9sb2NrX3Bvb2wtPnBvb2wuaW5kZXg7CisgICAgICAgIF9fa21wX2xvY2tfcG9vbCA9IF9fa21wX2xvY2tfcG9vbC0+cG9vbC5uZXh0OworICAgIH0KKworICAgIC8vCisgICAgLy8gV2UgY291bGQgcG90ZW50aWFsbHkgZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIG5lc3RlZCBhbmQgcmVndWxhciBsb2NrcworICAgIC8vIGhlcmUsIGFuZCBkbyB0aGUgbG9jayB0YWJsZSBsb29rdXAgZm9yIHJlZ3VsYXIgbG9ja3Mgb25seS4KKyAgICAvLworICAgIGlmICggT01QX0xPQ0tfVF9TSVpFIDwgc2l6ZW9mKHZvaWQgKikgKSB7CisgICAgICAgICogKCAoa21wX2xvY2tfaW5kZXhfdCAqKSB1c2VyX2xvY2sgKSA9IGluZGV4OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgKiAoIChrbXBfdXNlcl9sb2NrX3AgKikgdXNlcl9sb2NrICkgPSBsY2s7CisgICAgfQorCisgICAgLy8gbWFyayB0aGUgbG9jayBpZiBpdCBpcyBjcml0aWNhbCBzZWN0aW9uIGxvY2suCisgICAgX19rbXBfc2V0X3VzZXJfbG9ja19mbGFncyggbGNrLCBmbGFncyApOworCisgICAgX19rbXBfcmVsZWFzZV9sb2NrKCAmIF9fa21wX2dsb2JhbF9sb2NrLCBndGlkICk7IC8vIEFDOiBUT0RPOiBtb3ZlIHRoaXMgbGluZSB1cHBlcgorCisgICAgcmV0dXJuIGxjazsKK30KKworLy8gUHV0IGxvY2sncyBtZW1vcnkgdG8gcG9vbCBmb3IgcmV1c2luZy4KK3ZvaWQKK19fa21wX3VzZXJfbG9ja19mcmVlKCB2b2lkICoqdXNlcl9sb2NrLCBrbXBfaW50MzIgZ3RpZCwga21wX3VzZXJfbG9ja19wIGxjayApCit7CisgICAga21wX2xvY2tfcG9vbF90ICogbG9ja19wb29sOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggdXNlcl9sb2NrICE9IE5VTEwgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBsY2sgIT0gTlVMTCApOworCisgICAgX19rbXBfYWNxdWlyZV9sb2NrKCAmIF9fa21wX2dsb2JhbF9sb2NrLCBndGlkICk7CisKKyAgICBsY2stPnBvb2wubmV4dCA9IF9fa21wX2xvY2tfcG9vbDsKKyAgICBfX2ttcF9sb2NrX3Bvb2wgPSBsY2s7CisgICAgaWYgKCBPTVBfTE9DS19UX1NJWkUgPCBzaXplb2Yodm9pZCAqKSApIHsKKyAgICAgICAga21wX2xvY2tfaW5kZXhfdCBpbmRleCA9ICogKCAoa21wX2xvY2tfaW5kZXhfdCAqKSB1c2VyX2xvY2sgKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggMCA8IGluZGV4ICYmIGluZGV4IDw9IF9fa21wX3VzZXJfbG9ja190YWJsZS51c2VkICk7CisgICAgICAgIGxjay0+cG9vbC5pbmRleCA9IGluZGV4OworICAgIH0KKworICAgIF9fa21wX3JlbGVhc2VfbG9jayggJiBfX2ttcF9nbG9iYWxfbG9jaywgZ3RpZCApOworfQorCitrbXBfdXNlcl9sb2NrX3AKK19fa21wX2xvb2t1cF91c2VyX2xvY2soIHZvaWQgKip1c2VyX2xvY2ssIGNoYXIgY29uc3QgKmZ1bmMgKQoreworICAgIGttcF91c2VyX2xvY2tfcCBsY2sgPSBOVUxMOworCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIGlmICggdXNlcl9sb2NrID09IE5VTEwgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICggT01QX0xPQ0tfVF9TSVpFIDwgc2l6ZW9mKHZvaWQgKikgKSB7CisgICAgICAgIGttcF9sb2NrX2luZGV4X3QgaW5kZXggPSAqKCAoa21wX2xvY2tfaW5kZXhfdCAqKXVzZXJfbG9jayApOworICAgICAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgICAgIGlmICggISAoIDAgPCBpbmRleCAmJiBpbmRleCA8IF9fa21wX3VzZXJfbG9ja190YWJsZS51c2VkICkgKSB7CisgICAgICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggMCA8IGluZGV4ICYmIGluZGV4IDwgX19rbXBfdXNlcl9sb2NrX3RhYmxlLnVzZWQgKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfdXNlcl9sb2NrX3NpemUgPiAwICk7CisgICAgICAgIGxjayA9IF9fa21wX3VzZXJfbG9ja190YWJsZS50YWJsZVtpbmRleF07CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBsY2sgPSAqKCAoa21wX3VzZXJfbG9ja19wICopdXNlcl9sb2NrICk7CisgICAgfQorCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIGlmICggbGNrID09IE5VTEwgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBsY2s7Cit9CisKK3ZvaWQKK19fa21wX2NsZWFudXBfdXNlcl9sb2Nrcyggdm9pZCApCit7CisgICAgLy8KKyAgICAvLyBSZXNldCBsb2NrIHBvb2wuIERvIG5vdCB3b3JyeSBhYm91dCBsb2NrIGluIHRoZSBwb29sIC0tIHdlIHdpbGwgZnJlZQorICAgIC8vIHRoZW0gd2hlbiBpdGVyYXRpbmcgdGhyb3VnaCBsb2NrIHRhYmxlIChpdCBpbmNsdWRlcyBhbGwgdGhlIGxvY2tzLAorICAgIC8vIGRlYWQgb3IgYWxpdmUpLgorICAgIC8vCisgICAgX19rbXBfbG9ja19wb29sID0gTlVMTDsKKworI2RlZmluZSBJU19DUklUSUNBTChsY2spIFwKKyAgICAgICAgKCAoIF9fa21wX2dldF91c2VyX2xvY2tfZmxhZ3NfICE9IE5VTEwgKSAmJiBcCisgICAgICAgICggKCAqX19rbXBfZ2V0X3VzZXJfbG9ja19mbGFnc18gKSggbGNrICkgJiBrbXBfbGZfY3JpdGljYWxfc2VjdGlvbiApICkKKworICAgIC8vCisgICAgLy8gTG9vcCB0aHJvdWdoIGxvY2sgdGFibGUsIGZyZWUgYWxsIGxvY2tzLgorICAgIC8vCisgICAgLy8gRG8gbm90IGZyZWUgaXRlbSBbMF0sIGl0IGlzIHJlc2VydmVkIGZvciBsb2NrIHRhYmxlcyBsaXN0LgorICAgIC8vCisgICAgLy8gRklYTUUgLSB3ZSBhcmUgaXRlcmF0aW5nIHRocm91Z2ggYSBsaXN0IG9mIChwb2ludGVycyB0bykgb2JqZWN0cyBvZgorICAgIC8vIHR5cGUgdW5pb24ga21wX3VzZXJfbG9jaywgYnV0IHdlIGhhdmUgbm8gd2F5IG9mIGtub3dpbmcgd2hldGhlciB0aGUKKyAgICAvLyBiYXNlIHR5cGUgaXMgY3VycmVudGx5ICJwb29sIiBvciB3aGF0ZXZlciB0aGUgZ2xvYmFsIHVzZXIgbG9jayB0eXBlCisgICAgLy8gaXMuCisgICAgLy8KKyAgICAvLyBXZSBhcmUgcmVseWluZyBvbiB0aGUgZmFjdCB0aGF0IGZvciBhbGwgb2YgdGhlIHVzZXIgbG9jayB0eXBlcworICAgIC8vIChleGNlcHQgInRhcyIpLCB0aGUgZmlyc3QgZmllbGQgaW4gdGhlIGxvY2sgc3RydWN0IGlzIHRoZSAiaW5pdGlhbGl6ZWQiCisgICAgLy8gZmllbGQsIHdoaWNoIGlzIHNldCB0byB0aGUgYWRkcmVzcyBvZiB0aGUgbG9jayBvYmplY3QgaXRzZWxmIHdoZW4KKyAgICAvLyB0aGUgbG9jayBpcyBpbml0aWFsaXplZC4gIFdoZW4gdGhlIHVuaW9uIGlzIG9mIHR5cGUgInBvb2wiLCB0aGUKKyAgICAvLyBmaXJzdCBmaWVsZCBpcyBhIHBvaW50ZXIgdG8gdGhlIG5leHQgb2JqZWN0IGluIHRoZSBmcmVlIGxpc3QsIHdoaWNoCisgICAgLy8gd2lsbCBub3QgYmUgdGhlIHNhbWUgYWRkcmVzcyBhcyB0aGUgb2JqZWN0IGl0c2VsZi4KKyAgICAvLworICAgIC8vIFRoaXMgbWVhbnMgdGhhdCB0aGUgY2hlY2sgKCAqX19rbXBfaXNfdXNlcl9sb2NrX2luaXRpYWxpemVkXyApKCBsY2sgKQorICAgIC8vIHdpbGwgZmFpbCBmb3IgInBvb2wiIG9iamVjdHMgb24gdGhlIGZyZWUgbGlzdC4gIFRoaXMgbXVzdCBoYXBwZW4gYXMKKyAgICAvLyB0aGUgImxvY2F0aW9uIiBmaWVsZCBvZiByZWFsIHVzZXIgbG9ja3Mgb3ZlcmxhcHMgdGhlICJpbmRleCIgZmllbGQKKyAgICAvLyBvZiAicG9vbCIgb2JqZWN0cy4KKyAgICAvLworICAgIC8vIEl0IHdvdWxkIGJlIGJldHRlciB0byBydW4gdGhyb3VnaCB0aGUgZnJlZSBsaXN0LCBhbmQgcmVtb3ZlIGFsbCAicG9vbCIKKyAgICAvLyBvYmplY3RzIGZyb20gdGhlIGxvY2sgdGFibGUgYmVmb3JlIGV4ZWN1dGluZyB0aGlzIGxvb3AuICBIb3dldmVyLAorICAgIC8vICJwb29sIiBvYmplY3RzIGRvIG5vdCBhbHdheXMgaGF2ZSB0aGVpciBpbmRleCBmaWVsZCBzZXQgKG9ubHkgb24KKyAgICAvLyBsaW5fMzJlKSwgYW5kIEkgZG9uJ3Qgd2FudCB0byBzZWFyY2ggdGhlIGxvY2sgdGFibGUgZm9yIHRoZSBhZGRyZXNzCisgICAgLy8gb2YgZXZlcnkgInBvb2wiIG9iamVjdCBvbiB0aGUgZnJlZSBsaXN0LgorICAgIC8vCisgICAgd2hpbGUgKCBfX2ttcF91c2VyX2xvY2tfdGFibGUudXNlZCA+IDEgKSB7CisgICAgICAgIGNvbnN0IGlkZW50ICpsb2M7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gcmVkdWNlIF9fa21wX3VzZXJfbG9ja190YWJsZS51c2VkIGJlZm9yZSBmcmVlaW5nIHRoZSBsb2NrLAorICAgICAgICAvLyBzbyB0aGF0IHN0YXRlIG9mIGxvY2tzIGlzIGNvbnNpc3RlbnQKKyAgICAgICAgLy8KKyAgICAgICAga21wX3VzZXJfbG9ja19wIGxjayA9IF9fa21wX3VzZXJfbG9ja190YWJsZS50YWJsZVsKKyAgICAgICAgICAtLV9fa21wX3VzZXJfbG9ja190YWJsZS51c2VkIF07CisKKyAgICAgICAgaWYgKCAoIF9fa21wX2lzX3VzZXJfbG9ja19pbml0aWFsaXplZF8gIT0gTlVMTCApICYmCisgICAgICAgICAgKCAqX19rbXBfaXNfdXNlcl9sb2NrX2luaXRpYWxpemVkXyApKCBsY2sgKSApIHsKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBJc3N1ZSBhIHdhcm5pbmcgaWY6IEtNUF9DT05TSVNURU5DWV9DSEVDSyBBTkQgbG9jayBpcworICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZWQgQU5EIGl0IGlzIE5PVCBhIGNyaXRpY2FsIHNlY3Rpb24gKHVzZXIgaXMgbm90CisgICAgICAgICAgICAvLyByZXNwb25zaWJsZSBmb3IgZGVzdHJveWluZyBjcml0aWNhbHMpIEFORCB3ZSBrbm93IHNvdXJjZQorICAgICAgICAgICAgLy8gbG9jYXRpb24gdG8gcmVwb3J0LgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICYmICggISBJU19DUklUSUNBTCggbGNrICkgKSAmJgorICAgICAgICAgICAgICAoICggbG9jID0gX19rbXBfZ2V0X3VzZXJfbG9ja19sb2NhdGlvbiggbGNrICkgKSAhPSBOVUxMICkgJiYKKyAgICAgICAgICAgICAgKCBsb2MtPnBzb3VyY2UgIT0gTlVMTCApICkgeworICAgICAgICAgICAgICAgIGttcF9zdHJfbG9jX3Qgc3RyX2xvYyA9IF9fa21wX3N0cl9sb2NfaW5pdCggbG9jLT5wc291cmNlLCAwICk7CisgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoIENuc0xvY2tOb3REZXN0cm95ZWQsIHN0cl9sb2MuZmlsZSwgc3RyX2xvYy5mdW5jLAorICAgICAgICAgICAgICAgICAgc3RyX2xvYy5saW5lLCBzdHJfbG9jLmNvbCApOworICAgICAgICAgICAgICAgIF9fa21wX3N0cl9sb2NfZnJlZSggJnN0cl9sb2MpOworICAgICAgICAgICAgfQorCisjaWZkZWYgS01QX0RFQlVHCisgICAgICAgICAgICBpZiAoIElTX0NSSVRJQ0FMKCBsY2sgKSApIHsKKyAgICAgICAgICAgICAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfY2xlYW51cF91c2VyX2xvY2tzOiBmcmVlIGNyaXRpY2FsIHNlY3Rpb24gbG9jayAlcCAoJXApXG4iLCBsY2ssICoodm9pZCoqKWxjayApICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfY2xlYW51cF91c2VyX2xvY2tzOiBmcmVlIGxvY2sgJXAgKCVwKVxuIiwgbGNrLCAqKHZvaWQqKilsY2sgKSApOworICAgICAgICAgICAgfQorI2VuZGlmIC8vIEtNUF9ERUJVRworCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gQ2xlYW51cCBpbnRlcm5hbCBsb2NrIGR5bmFtaWMgcmVzb3VyY2VzCisgICAgICAgICAgICAvLyAoZm9yIGRyZHBhIGxvY2tzIHBhcnRpY3VsYXJseSkuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgX19rbXBfZGVzdHJveV91c2VyX2xvY2soIGxjayApOworICAgICAgICB9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gRnJlZSB0aGUgbG9jayBpZiBibG9jayBhbGxvY2F0aW9uIG9mIGxvY2tzIGlzIG5vdCB1c2VkLgorICAgICAgICAvLworICAgICAgICBpZiAoIF9fa21wX2xvY2tfYmxvY2tzID09IE5VTEwgKSB7CisgICAgICAgICAgICBfX2ttcF9mcmVlKCBsY2sgKTsKKyAgICAgICAgfQorICAgIH0KKworI3VuZGVmIElTX0NSSVRJQ0FMCisKKyAgICAvLworICAgIC8vIGRlbGV0ZSBsb2NrIHRhYmxlKHMpLgorICAgIC8vCisgICAga21wX3VzZXJfbG9ja19wICp0YWJsZV9wdHIgPSBfX2ttcF91c2VyX2xvY2tfdGFibGUudGFibGU7CisgICAgX19rbXBfdXNlcl9sb2NrX3RhYmxlLnRhYmxlID0gTlVMTDsKKyAgICBfX2ttcF91c2VyX2xvY2tfdGFibGUuYWxsb2NhdGVkID0gMDsKKworICAgIHdoaWxlICggdGFibGVfcHRyICE9IE5VTEwgKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIEluIHRoZSBmaXJzdCBlbGVtZW50IHdlIHNhdmVkIHRoZSBwb2ludGVyIHRvIHRoZSBwcmV2aW91cworICAgICAgICAvLyAoc21hbGxlcikgbG9jayB0YWJsZS4KKyAgICAgICAgLy8KKyAgICAgICAga21wX3VzZXJfbG9ja19wICpuZXh0ID0gKGttcF91c2VyX2xvY2tfcCAqKSggdGFibGVfcHRyWyAwIF0gKTsKKyAgICAgICAgX19rbXBfZnJlZSggdGFibGVfcHRyICk7CisgICAgICAgIHRhYmxlX3B0ciA9IG5leHQ7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBGcmVlIGJ1ZmZlcnMgYWxsb2NhdGVkIGZvciBibG9ja3Mgb2YgbG9ja3MuCisgICAgLy8KKyAgICBrbXBfYmxvY2tfb2ZfbG9ja3NfdCAqYmxvY2tfcHRyID0gX19rbXBfbG9ja19ibG9ja3M7CisgICAgX19rbXBfbG9ja19ibG9ja3MgPSBOVUxMOworCisgICAgd2hpbGUgKCBibG9ja19wdHIgIT0gTlVMTCApIHsKKyAgICAgICAga21wX2Jsb2NrX29mX2xvY2tzX3QgKm5leHQgPSBibG9ja19wdHItPm5leHRfYmxvY2s7CisgICAgICAgIF9fa21wX2ZyZWUoIGJsb2NrX3B0ci0+bG9ja3MgKTsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gKmJsb2NrX3B0ciBpdHNlbGYgd2FzIGFsbG9jYXRlZCBhdCB0aGUgZW5kIG9mIHRoZSBsb2NrcyB2ZWN0b3IuCisgICAgICAgIC8vCisJYmxvY2tfcHRyID0gbmV4dDsKKyAgICB9CisKKyAgICBUQ1dfNChfX2ttcF9pbml0X3VzZXJfbG9ja3MsIEZBTFNFKTsKK30KKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX2xvY2suaCBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9sb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM3ZmU3ZAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9sb2NrLmgKQEAgLTAsMCArMSwxMDI4IEBACisvKgorICoga21wX2xvY2suaCAtLSBsb2NrIGhlYWRlciBmaWxlCisgKiAkUmV2aXNpb246IDQzNDczICQKKyAqICREYXRlOiAyMDE0LTA5LTI2IDE1OjAyOjU3IC0wNTAwIChGcmksIDI2IFNlcCAyMDE0KSAkCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgS01QX0xPQ0tfSAorI2RlZmluZSBLTVBfTE9DS19ICisKKyNpbmNsdWRlIDxsaW1pdHMuaD4gICAgLy8gQ0hBUl9CSVQKKyNpbmNsdWRlIDxzdGRkZWYuaD4gICAgLy8gb2Zmc2V0b2YKKworI2luY2x1ZGUgImttcF9vcy5oIgorI2luY2x1ZGUgImttcF9kZWJ1Zy5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8vIF9fY3BsdXNwbHVzCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEhhdmUgdG8gY29weSB0aGVzZSBkZWZpbml0aW9ucyBmcm9tIGttcC5oIGJlY2F1c2Uga21wLmggY2Fubm90IGJlIGluY2x1ZGVkCisvLyBkdWUgdG8gY2lyY3VsYXIgZGVwZW5kZW5jaWVzLiAgV2lsbCB1bmRlZiB0aGVzZSBhdCBlbmQgb2YgZmlsZS4KKworI2RlZmluZSBLTVBfUEFEKHR5cGUsIHN6KSAgICAgKHNpemVvZih0eXBlKSArIChzeiAtICgoc2l6ZW9mKHR5cGUpIC0gMSkgJSAoc3opKSAtIDEpKQorI2RlZmluZSBLTVBfR1RJRF9ETkUgKC0yKQorCisvLyBGb3J3YXJkIGRlY2xhcmF0aW9uIG9mIGlkZW50IGFuZCBpZGVudF90CisKK3N0cnVjdCBpZGVudDsKK3R5cGVkZWYgc3RydWN0IGlkZW50IGlkZW50X3Q7CisKKy8vIEVuZCBvZiBjb3BpZWQgY29kZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8KKy8vIFdlIG5lZWQgdG8ga25vdyB0aGUgc2l6ZSBvZiB0aGUgYXJlYSB3ZSBjYW4gYXNzdW1lIHRoYXQgdGhlIGNvbXBpbGVyKHMpCisvLyBhbGxvY2F0ZWQgZm9yIG9iZWN0cyBvZiB0eXBlIG9tcF9sb2NrX3QgYW5kIG9tcF9uZXN0X2xvY2tfdC4gIFRoZSBJbnRlbAorLy8gY29tcGlsZXIgYWx3YXlzIGFsbG9jYXRlcyBhIHBvaW50ZXItc2l6ZWQgYXJlYSwgYXMgZG9lcyB2aXN1YWwgc3R1ZGlvLgorLy8KKy8vIGdjYyBob3dldmVyLCBvbmx5IGFsbG9jYXRlcyA0IGJ5dGVzIGZvciByZWd1bGFyIGxvY2tzLCBldmVuIG9uIDY0LWJpdAorLy8gaW50ZWwgYXJjaHMuICBJdCBhbGxvY2F0ZXMgYXQgbGVhc3QgOCBieXRlcyBmb3IgbmVzdGVkIGxvY2sgKG1vcmUgb24KKy8vIHJlY2VudCB2ZXJzaW9ucyksIGJ1dCB3ZSBhcmUgYm91bmRlZCBieSB0aGUgcG9pbnRlci1zaXplZCBjaHVua3MgdGhhdAorLy8gdGhlIEludGVsIGNvbXBpbGVyIGFsbG9jYXRlcy4KKy8vCisKKyNpZiBLTVBfT1NfTElOVVggJiYgZGVmaW5lZChLTVBfR09NUF9DT01QQVQpCisjIGRlZmluZSBPTVBfTE9DS19UX1NJWkUgICAgICAgIHNpemVvZihpbnQpCisjIGRlZmluZSBPTVBfTkVTVF9MT0NLX1RfU0laRSAgIHNpemVvZih2b2lkICopCisjZWxzZQorIyBkZWZpbmUgT01QX0xPQ0tfVF9TSVpFICAgICAgICBzaXplb2Yodm9pZCAqKQorIyBkZWZpbmUgT01QX05FU1RfTE9DS19UX1NJWkUgICBzaXplb2Yodm9pZCAqKQorI2VuZGlmCisKKy8vCisvLyBUaGUgSW50ZWwgY29tcGlsZXIgYWxsb2NhdGVzIGEgMzItYnl0ZSBjaHVuayBmb3IgYSBjcml0aWNhbCBzZWN0aW9uLgorLy8gQm90aCBnY2MgYW5kIHZpc3VhbCBzdHVkaW8gb25seSBhbGxvY2F0ZSBlbm91Z2ggc3BhY2UgZm9yIGEgcG9pbnRlci4KKy8vIFNvbWV0aW1lcyB3ZSBrbm93IHRoYXQgdGhlIHNwYWNlIHdhcyBhbGxvY2F0ZWQgYnkgdGhlIEludGVsIGNvbXBpbGVyLgorLy8KKyNkZWZpbmUgT01QX0NSSVRJQ0FMX1NJWkUgICAgICAgc2l6ZW9mKHZvaWQgKikKKyNkZWZpbmUgSU5URUxfQ1JJVElDQUxfU0laRSAgICAgMzIKKworLy8KKy8vIGxvY2sgZmxhZ3MKKy8vCit0eXBlZGVmIGttcF91aW50MzIga21wX2xvY2tfZmxhZ3NfdDsKKworI2RlZmluZSBrbXBfbGZfY3JpdGljYWxfc2VjdGlvbiAxCisKKy8vCisvLyBXaGVuIGEgbG9jayB0YWJsZSBpcyB1c2VkLCB0aGUgaW5kaWNlcyBhcmUgb2Yga21wX2xvY2tfaW5kZXhfdAorLy8KK3R5cGVkZWYga21wX3VpbnQzMiBrbXBfbG9ja19pbmRleF90OworCisvLworLy8gV2hlbiBtZW1vcnkgYWxsb2NhdGVkIGZvciBsb2NrcyBhcmUgb24gdGhlIGxvY2sgcG9vbCAoZnJlZSBsaXN0KSwKKy8vIGl0IGlzIHRyZWF0ZWQgYXMgc3RydWN0cyBvZiB0aGlzIHR5cGUuCisvLworc3RydWN0IGttcF9sb2NrX3Bvb2wgeworICAgIHVuaW9uIGttcF91c2VyX2xvY2sgKm5leHQ7CisgICAga21wX2xvY2tfaW5kZXhfdCBpbmRleDsKK307CisKK3R5cGVkZWYgc3RydWN0IGttcF9sb2NrX3Bvb2wga21wX2xvY2tfcG9vbF90OworCisKK2V4dGVybiB2b2lkIF9fa21wX3ZhbGlkYXRlX2xvY2tzKCB2b2lkICk7CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICBUaGVyZSBhcmUgNSBsb2NrIGltcGxlbWVudGF0aW9uczoKKy8vCisvLyAgICAgICAxLiBUZXN0IGFuZCBzZXQgbG9ja3MuCisvLyAgICAgICAyLiBmdXRleCBsb2NrcyAoTGludXgqIE9TIG9uIHg4NiBhbmQgSW50ZWwoUikgTWFueSBJbnRlZ3JhdGVkIENvcmUgYXJjaGl0ZWN0dXJlKQorLy8gICAgICAgMy4gVGlja2V0IChMYW1wb3J0IGJha2VyeSkgbG9ja3MuCisvLyAgICAgICA0LiBRdWV1aW5nIGxvY2tzICh3aXRoIHNlcGFyYXRlIHNwaW4gZmllbGRzKS4KKy8vICAgICAgIDUuIERSUEEgKER5bmFtaWNhbGx5IFJlY29uZmlndXJhYmxlIERpc3RyaWJ1dGVkIFBvbGxpbmcgQXJlYSkgbG9ja3MKKy8vCisvLyAgIGFuZCAzIGxvY2sgcHVycG9zZXM6CisvLworLy8gICAgICAgMS4gQm9vdHN0cmFwIGxvY2tzIC0tIFVzZWQgZm9yIGEgZmV3IGxvY2tzIGF2YWlsYWJsZSBhdCBsaWJyYXJ5IHN0YXJ0dXAtc2h1dGRvd24gdGltZS4KKy8vICAgICAgICAgIFRoZXNlIGRvIG5vdCByZXF1aXJlIG5vbi1uZWdhdGl2ZSBnbG9iYWwgdGhyZWFkIElEJ3MuCisvLyAgICAgICAyLiBJbnRlcm5hbCBSVEwgbG9ja3MgLS0gVXNlZCBldmVyeXdoZXJlIGVsc2UgaW4gdGhlIFJUTAorLy8gICAgICAgMy4gVXNlciBsb2NrcyAoaW5jbHVkZXMgY3JpdGljYWwgc2VjdGlvbnMpCisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIExvY2sgaW1wbGVtZW50YXRpb25zLgorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRlc3QgYW5kIHNldCBsb2Nrcy4KKy8vCisvLyBOb24tbmVzdGVkIHRlc3QgYW5kIHNldCBsb2NrcyBkaWZmZXIgZnJvbSB0aGUgb3RoZXIgbG9jayBraW5kcyAoZXhjZXB0CisvLyBmdXRleCkgaW4gdGhhdCB3ZSB1c2UgdGhlIG1lbW9yeSBhbGxvY2F0ZWQgYnkgdGhlIGNvbXBpbGVyIGZvciB0aGUgbG9jaywKKy8vIHJhdGhlciB0aGFuIGEgcG9pbnRlciB0byBpdC4KKy8vCisvLyBPbiBsaW4zMiwgbGluXzMyZSwgYW5kIHdpbl8zMiwgdGhlIHNwYWNlIGFsbG9jYXRlZCBtYXkgYmUgYXMgc21hbGwgYXMgNAorLy8gYnl0ZXMsIHNvIHdlIGhhdmUgdG8gdXNlIGEgbG9jayB0YWJsZSBmb3IgbmVzdGVkIGxvY2tzLCBhbmQgYXZvaWQgYWNjZXNzaW5nCisvLyB0aGUgZGVwdGhfbG9ja2VkIGZpZWxkIGZvciBub24tbmVzdGVkIGxvY2tzLgorLy8KKy8vIEluZm9ybWF0aW9uIG5vcm1hbGx5IGF2YWlsYWJsZSB0byB0aGUgdG9vbHMsIHN1Y2ggYXMgbG9jayBsb2NhdGlvbiwKKy8vIGxvY2sgdXNhZ2UgKG5vcm1hbCBsb2NrIHZzLiBjcml0aWNhbCBzZWN0aW9uKSwgZXRjLiBpcyBub3QgYXZhaWxhYmxlIHdpdGgKKy8vIHRlc3QgYW5kIHNldCBsb2Nrcy4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RydWN0IGttcF9iYXNlX3Rhc19sb2NrIHsKKyAgICB2b2xhdGlsZSBrbXBfaW50MzIgcG9sbDsgICAgICAgICAvLyAwID0+IHVubG9ja2VkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9ja2VkOiAoZ3RpZCsxKSBvZiBvd25pbmcgdGhyZWFkCisgICAga21wX2ludDMyICAgICAgICAgIGRlcHRoX2xvY2tlZDsgLy8gZGVwdGggbG9ja2VkLCBmb3IgbmVzdGVkIGxvY2tzIG9ubHkKK307CisKK3R5cGVkZWYgc3RydWN0IGttcF9iYXNlX3Rhc19sb2NrIGttcF9iYXNlX3Rhc19sb2NrX3Q7CisKK3VuaW9uIGttcF90YXNfbG9jayB7CisgICAga21wX2Jhc2VfdGFzX2xvY2tfdCBsazsKKyAgICBrbXBfbG9ja19wb29sX3QgcG9vbDsgICAvLyBtYWtlIGNlcnRhaW4gc3RydWN0IGlzIGxhcmdlIGVub3VnaAorICAgIGRvdWJsZSBsa19hbGlnbjsgICAgICAgIC8vIHVzZSB3b3JzdCBjYXNlIGFsaWdubWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIGNhY2hlIGxpbmUgcGFkZGluZworfTsKKwordHlwZWRlZiB1bmlvbiBrbXBfdGFzX2xvY2sga21wX3Rhc19sb2NrX3Q7CisKKy8vCisvLyBTdGF0aWMgaW5pdGlhbGl6ZXIgZm9yIHRlc3QgYW5kIHNldCBsb2NrIHZhcmlhYmxlcy4gVXNhZ2U6CisvLyAgICBrbXBfdGFzX2xvY2tfdCB4bG9jayA9IEtNUF9UQVNfTE9DS19JTklUSUFMSVpFUiggeGxvY2sgKTsKKy8vCisjZGVmaW5lIEtNUF9UQVNfTE9DS19JTklUSUFMSVpFUiggbG9jayApIHsgeyAwLCAwIH0gfQorCitleHRlcm4gdm9pZCBfX2ttcF9hY3F1aXJlX3Rhc19sb2NrKCBrbXBfdGFzX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIGludCBfX2ttcF90ZXN0X3Rhc19sb2NrKCBrbXBfdGFzX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIHZvaWQgX19rbXBfcmVsZWFzZV90YXNfbG9jaygga21wX3Rhc19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX2luaXRfdGFzX2xvY2soIGttcF90YXNfbG9ja190ICpsY2sgKTsKK2V4dGVybiB2b2lkIF9fa21wX2Rlc3Ryb3lfdGFzX2xvY2soIGttcF90YXNfbG9ja190ICpsY2sgKTsKKworZXh0ZXJuIHZvaWQgX19rbXBfYWNxdWlyZV9uZXN0ZWRfdGFzX2xvY2soIGttcF90YXNfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gaW50IF9fa21wX3Rlc3RfbmVzdGVkX3Rhc19sb2NrKCBrbXBfdGFzX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIHZvaWQgX19rbXBfcmVsZWFzZV9uZXN0ZWRfdGFzX2xvY2soIGttcF90YXNfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gdm9pZCBfX2ttcF9pbml0X25lc3RlZF90YXNfbG9jaygga21wX3Rhc19sb2NrX3QgKmxjayApOworZXh0ZXJuIHZvaWQgX19rbXBfZGVzdHJveV9uZXN0ZWRfdGFzX2xvY2soIGttcF90YXNfbG9ja190ICpsY2sgKTsKKworCisjaWYgS01QX09TX0xJTlVYICYmIChLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSB8fCBLTVBfQVJDSF9BQVJDSDY0KQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBmdXRleCBsb2Nrcy4gIGZ1dGV4IGxvY2tzIGFyZSBvbmx5IGF2YWlsYWJsZSBvbiBMaW51eCogT1MuCisvLworLy8gTGlrZSBub24tbmVzdGVkIHRlc3QgYW5kIHNldCBsb2NrLCBub24tbmVzdGVkIGZ1dGV4IGxvY2tzIHVzZSB0aGUgbWVtb3J5CisvLyBhbGxvY2F0ZWQgYnkgdGhlIGNvbXBpbGVyIGZvciB0aGUgbG9jaywgcmF0aGVyIHRoYW4gYSBwb2ludGVyIHRvIGl0LgorLy8KKy8vIEluZm9ybWF0aW9uIG5vcm1hbGx5IGF2YWlsYWJsZSB0byB0aGUgdG9vbHMsIHN1Y2ggYXMgbG9jayBsb2NhdGlvbiwKKy8vIGxvY2sgdXNhZ2UgKG5vcm1hbCBsb2NrIHZzLiBjcml0aWNhbCBzZWN0aW9uKSwgZXRjLiBpcyBub3QgYXZhaWxhYmxlIHdpdGgKKy8vIHRlc3QgYW5kIHNldCBsb2Nrcy4gIFdpdGggbm9uLW5lc3RlZCBmdXRleCBsb2NrcywgdGhlIGxvY2sgb3duZXIgaXMgbm90CisvLyBldmVuIGF2YWlsYWJsZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RydWN0IGttcF9iYXNlX2Z1dGV4X2xvY2sgeworICAgIHZvbGF0aWxlIGttcF9pbnQzMiBwb2xsOyAgICAgICAgIC8vIDAgPT4gdW5sb2NrZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAyKihndGlkKzEpIG9mIG93bmluZyB0aHJlYWQsIDAgaWYgdW5sb2NrZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2NrZWQ6IChndGlkKzEpIG9mIG93bmluZyB0aHJlYWQKKyAgICBrbXBfaW50MzIgICAgICAgICAgZGVwdGhfbG9ja2VkOyAvLyBkZXB0aCBsb2NrZWQsIGZvciBuZXN0ZWQgbG9ja3Mgb25seQorfTsKKwordHlwZWRlZiBzdHJ1Y3Qga21wX2Jhc2VfZnV0ZXhfbG9jayBrbXBfYmFzZV9mdXRleF9sb2NrX3Q7CisKK3VuaW9uIGttcF9mdXRleF9sb2NrIHsKKyAgICBrbXBfYmFzZV9mdXRleF9sb2NrX3QgbGs7CisgICAga21wX2xvY2tfcG9vbF90IHBvb2w7ICAgLy8gbWFrZSBjZXJ0YWluIHN0cnVjdCBpcyBsYXJnZSBlbm91Z2gKKyAgICBkb3VibGUgbGtfYWxpZ247ICAgICAgICAvLyB1c2Ugd29yc3QgY2FzZSBhbGlnbm1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBubyBjYWNoZSBsaW5lIHBhZGRpbmcKK307CisKK3R5cGVkZWYgdW5pb24ga21wX2Z1dGV4X2xvY2sga21wX2Z1dGV4X2xvY2tfdDsKKworLy8KKy8vIFN0YXRpYyBpbml0aWFsaXplciBmb3IgZnV0ZXggbG9jayB2YXJpYWJsZXMuIFVzYWdlOgorLy8gICAga21wX2Z1dGV4X2xvY2tfdCB4bG9jayA9IEtNUF9GVVRFWF9MT0NLX0lOSVRJQUxJWkVSKCB4bG9jayApOworLy8KKyNkZWZpbmUgS01QX0ZVVEVYX0xPQ0tfSU5JVElBTElaRVIoIGxvY2sgKSB7IHsgMCwgMCB9IH0KKworZXh0ZXJuIHZvaWQgX19rbXBfYWNxdWlyZV9mdXRleF9sb2NrKCBrbXBfZnV0ZXhfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gaW50IF9fa21wX3Rlc3RfZnV0ZXhfbG9jaygga21wX2Z1dGV4X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIHZvaWQgX19rbXBfcmVsZWFzZV9mdXRleF9sb2NrKCBrbXBfZnV0ZXhfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gdm9pZCBfX2ttcF9pbml0X2Z1dGV4X2xvY2soIGttcF9mdXRleF9sb2NrX3QgKmxjayApOworZXh0ZXJuIHZvaWQgX19rbXBfZGVzdHJveV9mdXRleF9sb2NrKCBrbXBfZnV0ZXhfbG9ja190ICpsY2sgKTsKKworZXh0ZXJuIHZvaWQgX19rbXBfYWNxdWlyZV9uZXN0ZWRfZnV0ZXhfbG9jaygga21wX2Z1dGV4X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIGludCBfX2ttcF90ZXN0X25lc3RlZF9mdXRleF9sb2NrKCBrbXBfZnV0ZXhfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gdm9pZCBfX2ttcF9yZWxlYXNlX25lc3RlZF9mdXRleF9sb2NrKCBrbXBfZnV0ZXhfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gdm9pZCBfX2ttcF9pbml0X25lc3RlZF9mdXRleF9sb2NrKCBrbXBfZnV0ZXhfbG9ja190ICpsY2sgKTsKK2V4dGVybiB2b2lkIF9fa21wX2Rlc3Ryb3lfbmVzdGVkX2Z1dGV4X2xvY2soIGttcF9mdXRleF9sb2NrX3QgKmxjayApOworCisjZW5kaWYgLy8gS01QX09TX0xJTlVYICYmIChLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSB8fCBLTVBfQVJDSF9BQVJDSDY0KQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRpY2tldCBsb2Nrcy4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RydWN0IGttcF9iYXNlX3RpY2tldF9sb2NrIHsKKyAgICAvLyBgaW5pdGlhbGl6ZWQnIG11c3QgYmUgdGhlIGZpcnN0IGVudHJ5IGluIHRoZSBsb2NrIGRhdGEgc3RydWN0dXJlIQorICAgIHZvbGF0aWxlIHVuaW9uIGttcF90aWNrZXRfbG9jayAqIGluaXRpYWxpemVkOyAgLy8gcG9pbnRzIHRvIHRoZSBsb2NrIHVuaW9uIGlmIGluIGluaXRpYWxpemVkIHN0YXRlCisgICAgaWRlbnRfdCBjb25zdCAqICAgICBsb2NhdGlvbjsgICAgIC8vIFNvdXJjZSBjb2RlIGxvY2F0aW9uIG9mIG9tcF9pbml0X2xvY2soKS4KKyAgICB2b2xhdGlsZSBrbXBfdWludDMyIG5leHRfdGlja2V0OyAgLy8gdGlja2V0IG51bWJlciB0byBnaXZlIHRvIG5leHQgdGhyZWFkIHdoaWNoIGFjcXVpcmVzCisgICAgdm9sYXRpbGUga21wX3VpbnQzMiBub3dfc2VydmluZzsgIC8vIHRpY2tldCBudW1iZXIgZm9yIHRocmVhZCB3aGljaCBob2xkcyB0aGUgbG9jaworICAgIHZvbGF0aWxlIGttcF9pbnQzMiAgb3duZXJfaWQ7ICAgICAvLyAoZ3RpZCsxKSBvZiBvd25pbmcgdGhyZWFkLCAwIGlmIHVubG9ja2VkCisgICAga21wX2ludDMyICAgICAgICAgICBkZXB0aF9sb2NrZWQ7IC8vIGRlcHRoIGxvY2tlZCwgZm9yIG5lc3RlZCBsb2NrcyBvbmx5CisgICAga21wX2xvY2tfZmxhZ3NfdCAgICBmbGFnczsgICAgICAgIC8vIGxvY2sgc3BlY2lmaWNzLCBlLmcuIGNyaXRpY2FsIHNlY3Rpb24gbG9jaworfTsKKwordHlwZWRlZiBzdHJ1Y3Qga21wX2Jhc2VfdGlja2V0X2xvY2sga21wX2Jhc2VfdGlja2V0X2xvY2tfdDsKKwordW5pb24gS01QX0FMSUdOX0NBQ0hFIGttcF90aWNrZXRfbG9jayB7CisgICAga21wX2Jhc2VfdGlja2V0X2xvY2tfdCBsazsgICAgICAgLy8gVGhpcyBmaWVsZCBtdXN0IGJlIGZpcnN0IHRvIGFsbG93IHN0YXRpYyBpbml0aWFsaXppbmcuCisgICAga21wX2xvY2tfcG9vbF90IHBvb2w7CisgICAgZG91YmxlICAgICAgICAgICAgICAgICBsa19hbGlnbjsgLy8gdXNlIHdvcnN0IGNhc2UgYWxpZ25tZW50CisgICAgY2hhciAgICAgICAgICAgICAgICAgICBsa19wYWRbIEtNUF9QQUQoIGttcF9iYXNlX3RpY2tldF9sb2NrX3QsIENBQ0hFX0xJTkUgKSBdOworfTsKKwordHlwZWRlZiB1bmlvbiBrbXBfdGlja2V0X2xvY2sga21wX3RpY2tldF9sb2NrX3Q7CisKKy8vCisvLyBTdGF0aWMgaW5pdGlhbGl6ZXIgZm9yIHNpbXBsZSB0aWNrZXQgbG9jayB2YXJpYWJsZXMuIFVzYWdlOgorLy8gICAga21wX3RpY2tldF9sb2NrX3QgeGxvY2sgPSBLTVBfVElDS0VUX0xPQ0tfSU5JVElBTElaRVIoIHhsb2NrICk7CisvLyBOb3RlIHRoZSBtYWNybyBhcmd1bWVudC4gSXQgaXMgaW1wb3J0YW50IHRvIG1ha2UgdmFyIHByb3Blcmx5IGluaXRpYWxpemVkLgorLy8KKyNkZWZpbmUgS01QX1RJQ0tFVF9MT0NLX0lOSVRJQUxJWkVSKCBsb2NrICkgeyB7IChrbXBfdGlja2V0X2xvY2tfdCAqKSAmIChsb2NrKSwgTlVMTCwgMCwgMCwgMCwgLTEgfSB9CisKK2V4dGVybiB2b2lkIF9fa21wX2FjcXVpcmVfdGlja2V0X2xvY2soIGttcF90aWNrZXRfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gaW50IF9fa21wX3Rlc3RfdGlja2V0X2xvY2soIGttcF90aWNrZXRfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gaW50IF9fa21wX3Rlc3RfdGlja2V0X2xvY2tfd2l0aF9jaGVrcygga21wX3RpY2tldF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX3JlbGVhc2VfdGlja2V0X2xvY2soIGttcF90aWNrZXRfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gdm9pZCBfX2ttcF9pbml0X3RpY2tldF9sb2NrKCBrbXBfdGlja2V0X2xvY2tfdCAqbGNrICk7CitleHRlcm4gdm9pZCBfX2ttcF9kZXN0cm95X3RpY2tldF9sb2NrKCBrbXBfdGlja2V0X2xvY2tfdCAqbGNrICk7CisKK2V4dGVybiB2b2lkIF9fa21wX2FjcXVpcmVfbmVzdGVkX3RpY2tldF9sb2NrKCBrbXBfdGlja2V0X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIGludCBfX2ttcF90ZXN0X25lc3RlZF90aWNrZXRfbG9jaygga21wX3RpY2tldF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX3JlbGVhc2VfbmVzdGVkX3RpY2tldF9sb2NrKCBrbXBfdGlja2V0X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIHZvaWQgX19rbXBfaW5pdF9uZXN0ZWRfdGlja2V0X2xvY2soIGttcF90aWNrZXRfbG9ja190ICpsY2sgKTsKK2V4dGVybiB2b2lkIF9fa21wX2Rlc3Ryb3lfbmVzdGVkX3RpY2tldF9sb2NrKCBrbXBfdGlja2V0X2xvY2tfdCAqbGNrICk7CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUXVldWluZyBsb2Nrcy4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmIEtNUF9VU0VfQURBUFRJVkVfTE9DS1MKKworc3RydWN0IGttcF9hZGFwdGl2ZV9sb2NrX2luZm87CisKK3R5cGVkZWYgc3RydWN0IGttcF9hZGFwdGl2ZV9sb2NrX2luZm8ga21wX2FkYXB0aXZlX2xvY2tfaW5mb190OworCisjaWYgS01QX0RFQlVHX0FEQVBUSVZFX0xPQ0tTCisKK3N0cnVjdCBrbXBfYWRhcHRpdmVfbG9ja19zdGF0aXN0aWNzIHsKKyAgICAvKiBTbyB3ZSBjYW4gZ2V0IHN0YXRzIGZyb20gbG9ja3MgdGhhdCBoYXZlbid0IGJlZW4gZGVzdHJveWVkLiAqLworICAgIGttcF9hZGFwdGl2ZV9sb2NrX2luZm9fdCAqIG5leHQ7CisgICAga21wX2FkYXB0aXZlX2xvY2tfaW5mb190ICogcHJldjsKKworICAgIC8qIE90aGVyIHN0YXRpc3RpY3MgKi8KKyAgICBrbXBfdWludDMyIHN1Y2Nlc3NmdWxTcGVjdWxhdGlvbnM7CisgICAga21wX3VpbnQzMiBoYXJkRmFpbGVkU3BlY3VsYXRpb25zOworICAgIGttcF91aW50MzIgc29mdEZhaWxlZFNwZWN1bGF0aW9uczsKKyAgICBrbXBfdWludDMyIG5vblNwZWN1bGF0aXZlQWNxdWlyZXM7CisgICAga21wX3VpbnQzMiBub25TcGVjdWxhdGl2ZUFjcXVpcmVBdHRlbXB0czsKKyAgICBrbXBfdWludDMyIGxlbW1pbmdZaWVsZHM7Cit9OworCit0eXBlZGVmIHN0cnVjdCBrbXBfYWRhcHRpdmVfbG9ja19zdGF0aXN0aWNzIGttcF9hZGFwdGl2ZV9sb2NrX3N0YXRpc3RpY3NfdDsKKworZXh0ZXJuIHZvaWQgX19rbXBfcHJpbnRfc3BlY3VsYXRpdmVfc3RhdHMoKTsKK2V4dGVybiB2b2lkIF9fa21wX2luaXRfc3BlY3VsYXRpdmVfc3RhdHMoKTsKKworI2VuZGlmIC8vIEtNUF9ERUJVR19BREFQVElWRV9MT0NLUworCitzdHJ1Y3Qga21wX2FkYXB0aXZlX2xvY2tfaW5mbworeworICAgIC8qIFZhbHVlcyB1c2VkIGZvciBhZGFwdGl2aXR5LgorICAgICAqIEFsdGhvdWdoIHRoZXNlIGFyZSBhY2Nlc3NlZCBmcm9tIG11bHRpcGxlIHRocmVhZHMgd2UgZG9uJ3QgYWNjZXNzIHRoZW0gYXRvbWljYWxseSwKKyAgICAgKiBiZWNhdXNlIGlmIHdlIG1pc3MgdXBkYXRlcyBpdCBwcm9iYWJseSBkb2Vzbid0IG1hdHRlciBtdWNoLiAoSXQganVzdCBhZmZlY3RzIG91cgorICAgICAqIGRlY2lzaW9uIGFib3V0IHdoZXRoZXIgdG8gdHJ5IHNwZWN1bGF0aW9uIG9uIHRoZSBsb2NrKS4KKyAgICAgKi8KKyAgICBrbXBfdWludDMyIHZvbGF0aWxlIGJhZG5lc3M7CisgICAga21wX3VpbnQzMiB2b2xhdGlsZSBhY3F1aXJlX2F0dGVtcHRzOworICAgIC8qIFBhcmFtZXRlcnMgb2YgdGhlIGxvY2suICovCisgICAga21wX3VpbnQzMiBtYXhfYmFkbmVzczsKKyAgICBrbXBfdWludDMyIG1heF9zb2Z0X3JldHJpZXM7CisKKyNpZiBLTVBfREVCVUdfQURBUFRJVkVfTE9DS1MKKyAgICBrbXBfYWRhcHRpdmVfbG9ja19zdGF0aXN0aWNzX3Qgdm9sYXRpbGUgc3RhdHM7CisjZW5kaWYKK307CisKKyNlbmRpZiAvLyBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisKKworc3RydWN0IGttcF9iYXNlX3F1ZXVpbmdfbG9jayB7CisKKyAgICAvLyAgYGluaXRpYWxpemVkJyBtdXN0IGJlIHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgbG9jayBkYXRhIHN0cnVjdHVyZSEKKyAgICB2b2xhdGlsZSB1bmlvbiBrbXBfcXVldWluZ19sb2NrICppbml0aWFsaXplZDsgLy8gUG9pbnRzIHRvIHRoZSBsb2NrIHVuaW9uIGlmIGluIGluaXRpYWxpemVkIHN0YXRlLgorCisgICAgaWRlbnRfdCBjb25zdCAqICAgICBsb2NhdGlvbjsgICAgIC8vIFNvdXJjZSBjb2RlIGxvY2F0aW9uIG9mIG9tcF9pbml0X2xvY2soKS4KKworICAgIEtNUF9BTElHTiggOCApICAgICAgICAgICAgICAgICAgICAvLyB0YWlsX2lkICBtdXN0IGJlIDgtYnl0ZSBhbGlnbmVkIQorCisgICAgdm9sYXRpbGUga21wX2ludDMyICB0YWlsX2lkOyAgICAgIC8vIChndGlkKzEpIG9mIHRocmVhZCBhdCB0YWlsIG9mIHdhaXQgcXVldWUsIDAgaWYgZW1wdHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTXVzdCBiZSBubyBwYWRkaW5nIGhlcmUgc2luY2UgaGVhZC90YWlsIHVzZWQgaW4gOC1ieXRlIENBUworICAgIHZvbGF0aWxlIGttcF9pbnQzMiAgaGVhZF9pZDsgICAgICAvLyAoZ3RpZCsxKSBvZiB0aHJlYWQgYXQgaGVhZCBvZiB3YWl0IHF1ZXVlLCAwIGlmIGVtcHR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERlY2wgb3JkZXIgYXNzdW1lcyBsaXR0bGUgZW5kaWFuCisgICAgLy8gYmFrZXJ5LXN0eWxlIGxvY2sKKyAgICB2b2xhdGlsZSBrbXBfdWludDMyIG5leHRfdGlja2V0OyAgLy8gdGlja2V0IG51bWJlciB0byBnaXZlIHRvIG5leHQgdGhyZWFkIHdoaWNoIGFjcXVpcmVzCisgICAgdm9sYXRpbGUga21wX3VpbnQzMiBub3dfc2VydmluZzsgIC8vIHRpY2tldCBudW1iZXIgZm9yIHRocmVhZCB3aGljaCBob2xkcyB0aGUgbG9jaworICAgIHZvbGF0aWxlIGttcF9pbnQzMiAgb3duZXJfaWQ7ICAgICAvLyAoZ3RpZCsxKSBvZiBvd25pbmcgdGhyZWFkLCAwIGlmIHVubG9ja2VkCisgICAga21wX2ludDMyICAgICAgICAgICBkZXB0aF9sb2NrZWQ7IC8vIGRlcHRoIGxvY2tlZCwgZm9yIG5lc3RlZCBsb2NrcyBvbmx5CisKKyAgICBrbXBfbG9ja19mbGFnc190ICAgIGZsYWdzOyAgICAgICAgLy8gbG9jayBzcGVjaWZpY3MsIGUuZy4gY3JpdGljYWwgc2VjdGlvbiBsb2NrCit9OworCit0eXBlZGVmIHN0cnVjdCBrbXBfYmFzZV9xdWV1aW5nX2xvY2sga21wX2Jhc2VfcXVldWluZ19sb2NrX3Q7CisKK0tNUF9CVUlMRF9BU1NFUlQoIG9mZnNldG9mKCBrbXBfYmFzZV9xdWV1aW5nX2xvY2tfdCwgdGFpbF9pZCApICUgOCA9PSAwICk7CisKK3VuaW9uIEtNUF9BTElHTl9DQUNIRSBrbXBfcXVldWluZ19sb2NrIHsKKyAgICBrbXBfYmFzZV9xdWV1aW5nX2xvY2tfdCBsazsgICAgICAgLy8gVGhpcyBmaWVsZCBtdXN0IGJlIGZpcnN0IHRvIGFsbG93IHN0YXRpYyBpbml0aWFsaXppbmcuCisgICAga21wX2xvY2tfcG9vbF90IHBvb2w7CisgICAgZG91YmxlICAgICAgICAgICAgICAgICAgIGxrX2FsaWduOyAvLyB1c2Ugd29yc3QgY2FzZSBhbGlnbm1lbnQKKyAgICBjaGFyICAgICAgICAgICAgICAgICAgICAgbGtfcGFkWyBLTVBfUEFEKCBrbXBfYmFzZV9xdWV1aW5nX2xvY2tfdCwgQ0FDSEVfTElORSApIF07Cit9OworCit0eXBlZGVmIHVuaW9uIGttcF9xdWV1aW5nX2xvY2sga21wX3F1ZXVpbmdfbG9ja190OworCitleHRlcm4gdm9pZCBfX2ttcF9hY3F1aXJlX3F1ZXVpbmdfbG9jaygga21wX3F1ZXVpbmdfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gaW50IF9fa21wX3Rlc3RfcXVldWluZ19sb2NrKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX3JlbGVhc2VfcXVldWluZ19sb2NrKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX2luaXRfcXVldWluZ19sb2NrKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjayApOworZXh0ZXJuIHZvaWQgX19rbXBfZGVzdHJveV9xdWV1aW5nX2xvY2soIGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrICk7CisKK2V4dGVybiB2b2lkIF9fa21wX2FjcXVpcmVfbmVzdGVkX3F1ZXVpbmdfbG9jaygga21wX3F1ZXVpbmdfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gaW50IF9fa21wX3Rlc3RfbmVzdGVkX3F1ZXVpbmdfbG9jaygga21wX3F1ZXVpbmdfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gdm9pZCBfX2ttcF9yZWxlYXNlX25lc3RlZF9xdWV1aW5nX2xvY2soIGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIHZvaWQgX19rbXBfaW5pdF9uZXN0ZWRfcXVldWluZ19sb2NrKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjayApOworZXh0ZXJuIHZvaWQgX19rbXBfZGVzdHJveV9uZXN0ZWRfcXVldWluZ19sb2NrKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjayApOworCisjaWYgS01QX1VTRV9BREFQVElWRV9MT0NLUworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBBZGFwdGl2ZSBsb2Nrcy4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0cnVjdCBrbXBfYmFzZV9hZGFwdGl2ZV9sb2NrIHsKKyAgICBrbXBfYmFzZV9xdWV1aW5nX2xvY2sgcWxrOworICAgIEtNUF9BTElHTihDQUNIRV9MSU5FKQorICAgIGttcF9hZGFwdGl2ZV9sb2NrX2luZm9fdCBhZGFwdGl2ZTsgICAgIC8vIEluZm9ybWF0aW9uIGZvciB0aGUgc3BlY3VsYXRpdmUgYWRhcHRpdmUgbG9jaworfTsKKwordHlwZWRlZiBzdHJ1Y3Qga21wX2Jhc2VfYWRhcHRpdmVfbG9jayBrbXBfYmFzZV9hZGFwdGl2ZV9sb2NrX3Q7CisKK3VuaW9uIEtNUF9BTElHTl9DQUNIRSBrbXBfYWRhcHRpdmVfbG9jayB7CisgICAga21wX2Jhc2VfYWRhcHRpdmVfbG9ja190IGxrOworICAgIGttcF9sb2NrX3Bvb2xfdCBwb29sOworICAgIGRvdWJsZSBsa19hbGlnbjsKKyAgICBjaGFyIGxrX3BhZFsgS01QX1BBRChrbXBfYmFzZV9hZGFwdGl2ZV9sb2NrX3QsIENBQ0hFX0xJTkUpIF07Cit9OwordHlwZWRlZiB1bmlvbiBrbXBfYWRhcHRpdmVfbG9jayBrbXBfYWRhcHRpdmVfbG9ja190OworCisjIGRlZmluZSBHRVRfUUxLX1BUUihsKSAoKGttcF9xdWV1aW5nX2xvY2tfdCAqKSAmIChsKS0+bGsucWxrKQorCisjZW5kaWYgLy8gS01QX1VTRV9BREFQVElWRV9MT0NLUworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBEUkRQQSB0aWNrZXQgbG9ja3MuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0cnVjdCBrbXBfYmFzZV9kcmRwYV9sb2NrIHsKKyAgICAvLworICAgIC8vIEFsbCBvZiB0aGUgZmllbGRzIG9uIHRoZSBmaXJzdCBjYWNoZSBsaW5lIGFyZSBvbmx5IHdyaXR0ZW4gd2hlbgorICAgIC8vIGluaXRpYWxpemluZyBvciByZWNvbmZpZ3VyaW5nIHRoZSBsb2NrLiAgVGhlc2UgYXJlIHJlbGF0aXZlbHkgcmFyZQorICAgIC8vIG9wZXJhdGlvbnMsIHNvIGRhdGEgZnJvbSB0aGUgZmlyc3QgY2FjaGUgbGluZSB3aWxsIHVzdWFsbHkgc3RheQorICAgIC8vIHJlc2lkZW50IGluIHRoZSBjYWNoZSBvZiBlYWNoIHRocmVhZCB0cnlpbmcgdG8gYWNxdWlyZSB0aGUgbG9jay4KKyAgICAvLworICAgIC8vIGluaXRpYWxpemVkIG11c3QgYmUgdGhlIGZpcnN0IGVudHJ5IGluIHRoZSBsb2NrIGRhdGEgc3RydWN0dXJlIQorICAgIC8vCisgICAgS01QX0FMSUdOX0NBQ0hFCisKKyAgICB2b2xhdGlsZSB1bmlvbiBrbXBfZHJkcGFfbG9jayAqIGluaXRpYWxpemVkOyAgICAvLyBwb2ludHMgdG8gdGhlIGxvY2sgdW5pb24gaWYgaW4gaW5pdGlhbGl6ZWQgc3RhdGUKKyAgICBpZGVudF90IGNvbnN0ICogICAgICAgICAgICAgICAgIGxvY2F0aW9uOyAgICAgICAvLyBTb3VyY2UgY29kZSBsb2NhdGlvbiBvZiBvbXBfaW5pdF9sb2NrKCkuCisgICAgdm9sYXRpbGUgc3RydWN0IGttcF9sb2NrX3BvbGwgeworICAgICAgICBrbXBfdWludDY0IHBvbGw7CisgICAgfSAqIHZvbGF0aWxlIHBvbGxzOworICAgIHZvbGF0aWxlIGttcF91aW50NjQgICAgICAgICAgICAgbWFzazsgICAgICAgICAgIC8vIGlzIDIqKm51bV9wb2xscy0xIGZvciBtb2Qgb3AKKyAgICBrbXBfdWludDY0ICAgICAgICAgICAgICAgICAgICAgIGNsZWFudXBfdGlja2V0OyAvLyB0aHJlYWQgd2l0aCBjbGVhbnVwIHRpY2tldAorICAgIHZvbGF0aWxlIHN0cnVjdCBrbXBfbG9ja19wb2xsICogb2xkX3BvbGxzOyAgICAgIC8vIHdpbGwgZGVhbGxvY2F0ZSBvbGRfcG9sbHMKKyAgICBrbXBfdWludDMyICAgICAgICAgICAgICAgICAgICAgIG51bV9wb2xsczsgICAgICAvLyBtdXN0IGJlIHBvd2VyIG9mIDIKKworICAgIC8vCisgICAgLy8gbmV4dF90aWNrZXQgaXQgbmVlZHMgdG8gZXhpc3QgaW4gYSBzZXBhcmF0ZSBjYWNoZSBsaW5lLCBhcyBpdCBpcworICAgIC8vIGludmFsaWRhdGVkIGV2ZXJ5IHRpbWUgYSB0aHJlYWQgdGFrZXMgYSBuZXcgdGlja2V0LgorICAgIC8vCisgICAgS01QX0FMSUdOX0NBQ0hFCisKKyAgICB2b2xhdGlsZSBrbXBfdWludDY0ICAgICAgICAgICAgIG5leHRfdGlja2V0OworCisgICAgLy8KKyAgICAvLyBub3dfc2VydmluZyBpcyB1c2VkIHRvIHN0b3JlIG91ciB0aWNrZXQgdmFsdWUgd2hpbGUgd2UgaG9sZCB0aGUgbG9jay4KKyAgICAvLyBJdCBoYXMgYSBzbGlnaHRseSBkaWZmZXJlbnQgbWVhbmluZyBpbiB0aGUgRFJEUEEgdGlja2V0IGxvY2tzICh3aGVyZQorICAgIC8vIGl0IGlzIHdyaXR0ZW4gYnkgdGhlIGFjcXVpcmluZyB0aHJlYWQpIHRoYW4gaXQgZG9lcyBpbiB0aGUgc2ltcGxlCisgICAgLy8gdGlja2V0IGxvY2tzICh3aGVyZSBpdCBpcyB3cml0dGVuIGJ5IHRoZSByZWxlYXNpbmcgdGhyZWFkKS4KKyAgICAvLworICAgIC8vIFNpbmNlIG5vd19zZXJ2aW5nIGlzIG9ubHkgcmVhZCBhbiB3cml0dGVuIGluIHRoZSBjcml0aWNhbCBzZWN0aW9uLAorICAgIC8vIGl0IGlzIG5vbi12b2xhdGlsZSwgYnV0IGl0IG5lZWRzIHRvIGV4aXN0IG9uIGEgc2VwYXJhdGUgY2FjaGUgbGluZSwKKyAgICAvLyBhcyBpdCBpcyBpbnZhbGlkYXRlZCBhdCBldmVyeSBsb2NrIGFjcXVpcmUuCisgICAgLy8KKyAgICAvLyBMaWtld2lzZSwgdGhlIHZhcnMgdXNlZCBmb3IgbmVzdGVkIGxvY2tzIChvd25lcl9pZCBhbmQgZGVwdGhfbG9ja2VkKQorICAgIC8vIGFyZSBvbmx5IHdyaXR0ZW4gYnkgdGhlIHRocmVhZCBvd25pbmcgdGhlIGxvY2ssIHNvIHRoZXkgYXJlIHB1dCBpbgorICAgIC8vIHRoaXMgY2FjaGUgbGluZS4gIG93bmVyX2lkIGlzIHJlYWQgYnkgb3RoZXIgdGhyZWFkcywgc28gaXQgbXVzdCBiZQorICAgIC8vIGRlY2xhcmVkIHZvbGF0aWxlLgorICAgIC8vCisgICAgS01QX0FMSUdOX0NBQ0hFCisKKyAgICBrbXBfdWludDY0ICAgICAgICAgICAgICAgICAgICAgIG5vd19zZXJ2aW5nOyAgICAvLyBkb2Vzbid0IGhhdmUgdG8gYmUgdm9sYXRpbGUKKyAgICB2b2xhdGlsZSBrbXBfdWludDMyICAgICAgICAgICAgIG93bmVyX2lkOyAgICAgICAvLyAoZ3RpZCsxKSBvZiBvd25pbmcgdGhyZWFkLCAwIGlmIHVubG9ja2VkCisgICAga21wX2ludDMyICAgICAgICAgICAgICAgICAgICAgICBkZXB0aF9sb2NrZWQ7ICAgLy8gZGVwdGggbG9ja2VkCisgICAga21wX2xvY2tfZmxhZ3NfdCAgICAgICAgICAgICAgICBmbGFnczsgICAgICAgICAgLy8gbG9jayBzcGVjaWZpY3MsIGUuZy4gY3JpdGljYWwgc2VjdGlvbiBsb2NrCit9OworCit0eXBlZGVmIHN0cnVjdCBrbXBfYmFzZV9kcmRwYV9sb2NrIGttcF9iYXNlX2RyZHBhX2xvY2tfdDsKKwordW5pb24gS01QX0FMSUdOX0NBQ0hFIGttcF9kcmRwYV9sb2NrIHsKKyAgICBrbXBfYmFzZV9kcmRwYV9sb2NrX3QgbGs7ICAgICAgIC8vIFRoaXMgZmllbGQgbXVzdCBiZSBmaXJzdCB0byBhbGxvdyBzdGF0aWMgaW5pdGlhbGl6aW5nLiAqLworICAgIGttcF9sb2NrX3Bvb2xfdCBwb29sOworICAgIGRvdWJsZSAgICAgICAgICAgICAgICBsa19hbGlnbjsgLy8gdXNlIHdvcnN0IGNhc2UgYWxpZ25tZW50CisgICAgY2hhciAgICAgICAgICAgICAgICAgIGxrX3BhZFsgS01QX1BBRCgga21wX2Jhc2VfZHJkcGFfbG9ja190LCBDQUNIRV9MSU5FICkgXTsKK307CisKK3R5cGVkZWYgdW5pb24ga21wX2RyZHBhX2xvY2sga21wX2RyZHBhX2xvY2tfdDsKKworZXh0ZXJuIHZvaWQgX19rbXBfYWNxdWlyZV9kcmRwYV9sb2NrKCBrbXBfZHJkcGFfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gaW50IF9fa21wX3Rlc3RfZHJkcGFfbG9jaygga21wX2RyZHBhX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIHZvaWQgX19rbXBfcmVsZWFzZV9kcmRwYV9sb2NrKCBrbXBfZHJkcGFfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gdm9pZCBfX2ttcF9pbml0X2RyZHBhX2xvY2soIGttcF9kcmRwYV9sb2NrX3QgKmxjayApOworZXh0ZXJuIHZvaWQgX19rbXBfZGVzdHJveV9kcmRwYV9sb2NrKCBrbXBfZHJkcGFfbG9ja190ICpsY2sgKTsKKworZXh0ZXJuIHZvaWQgX19rbXBfYWNxdWlyZV9uZXN0ZWRfZHJkcGFfbG9jaygga21wX2RyZHBhX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIGludCBfX2ttcF90ZXN0X25lc3RlZF9kcmRwYV9sb2NrKCBrbXBfZHJkcGFfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gdm9pZCBfX2ttcF9yZWxlYXNlX25lc3RlZF9kcmRwYV9sb2NrKCBrbXBfZHJkcGFfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gdm9pZCBfX2ttcF9pbml0X25lc3RlZF9kcmRwYV9sb2NrKCBrbXBfZHJkcGFfbG9ja190ICpsY2sgKTsKK2V4dGVybiB2b2lkIF9fa21wX2Rlc3Ryb3lfbmVzdGVkX2RyZHBhX2xvY2soIGttcF9kcmRwYV9sb2NrX3QgKmxjayApOworCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIExvY2sgcHVycG9zZXMuCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQm9vdHN0cmFwIGxvY2tzLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBCb290c3RyYXAgbG9ja3MgLS0gdmVyeSBmZXcgbG9ja3MgdXNlZCBhdCBsaWJyYXJ5IGluaXRpYWxpemF0aW9uIHRpbWUuCisvLyBCb290c3RyYXAgbG9ja3MgYXJlIGN1cnJlbnRseSBpbXBsZW1lbnRlZCBhcyB0aWNrZXQgbG9ja3MuCisvLyBUaGV5IGNvdWxkIGFsc28gYmUgaW1wbGVtZW50ZWQgYXMgdGVzdCBhbmQgc2V0IGxvY2ssIGJ1dCBjYW5ub3QgYmUKKy8vIGltcGxlbWVudGVkIHdpdGggb3RoZXIgbG9jayBraW5kcyBhcyB0aGV5IHJlcXVpcmUgZ3RpZHMgd2hpY2ggYXJlIG5vdAorLy8gYXZhaWxhYmxlIGF0IGluaXRpYWxpemF0aW9uIHRpbWUuCisKK3R5cGVkZWYga21wX3RpY2tldF9sb2NrX3Qga21wX2Jvb3RzdHJhcF9sb2NrX3Q7CisKKyNkZWZpbmUgS01QX0JPT1RTVFJBUF9MT0NLX0lOSVRJQUxJWkVSKCBsb2NrICkgS01QX1RJQ0tFVF9MT0NLX0lOSVRJQUxJWkVSKCAobG9jaykgKQorCitzdGF0aWMgaW5saW5lIHZvaWQKK19fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soIGttcF9ib290c3RyYXBfbG9ja190ICpsY2sgKQoreworICAgIF9fa21wX2FjcXVpcmVfdGlja2V0X2xvY2soIGxjaywgS01QX0dUSURfRE5FICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2ttcF90ZXN0X2Jvb3RzdHJhcF9sb2NrKCBrbXBfYm9vdHN0cmFwX2xvY2tfdCAqbGNrICkKK3sKKyAgICByZXR1cm4gX19rbXBfdGVzdF90aWNrZXRfbG9jayggbGNrLCBLTVBfR1RJRF9ETkUgKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCBrbXBfYm9vdHN0cmFwX2xvY2tfdCAqbGNrICkKK3sKKyAgICBfX2ttcF9yZWxlYXNlX3RpY2tldF9sb2NrKCBsY2ssIEtNUF9HVElEX0RORSApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK19fa21wX2luaXRfYm9vdHN0cmFwX2xvY2soIGttcF9ib290c3RyYXBfbG9ja190ICpsY2sgKQoreworICAgIF9fa21wX2luaXRfdGlja2V0X2xvY2soIGxjayApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK19fa21wX2Rlc3Ryb3lfYm9vdHN0cmFwX2xvY2soIGttcF9ib290c3RyYXBfbG9ja190ICpsY2sgKQoreworICAgIF9fa21wX2Rlc3Ryb3lfdGlja2V0X2xvY2soIGxjayApOworfQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEludGVybmFsIFJUTCBsb2Nrcy4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8KKy8vIEludGVybmFsIFJUTCBsb2NrcyBhcmUgYWxzbyBpbXBsZW1lbnRlZCBhcyB0aWNrZXQgbG9ja3MsIGZvciBub3cuCisvLworLy8gRklYTUUgLSBXZSBzaG91bGQgZ28gdGhyb3VnaCBhbmQgZmlndXJlIG91dCB3aGljaCBsb2NrIGtpbmQgd29ya3MgYmVzdCBmb3IKKy8vIGVhY2ggaW50ZXJuYWwgbG9jaywgYW5kIHVzZSB0aGUgdHlwZSBkZWNsYXJhdGlvbiBhbmQgZnVuY3Rpb24gY2FsbHMgZm9yCisvLyB0aGF0IGV4cGxpY2l0IGxvY2sga2luZCAoYW5kIGdldCByaWQgb2YgdGhpcyBzZWN0aW9uKS4KKy8vCisKK3R5cGVkZWYga21wX3RpY2tldF9sb2NrX3Qga21wX2xvY2tfdDsKKworc3RhdGljIGlubGluZSB2b2lkCitfX2ttcF9hY3F1aXJlX2xvY2soIGttcF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIF9fa21wX2FjcXVpcmVfdGlja2V0X2xvY2soIGxjaywgZ3RpZCApOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19rbXBfdGVzdF9sb2NrKCBrbXBfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICByZXR1cm4gX19rbXBfdGVzdF90aWNrZXRfbG9jayggbGNrLCBndGlkICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19rbXBfcmVsZWFzZV9sb2NrKCBrbXBfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBfX2ttcF9yZWxlYXNlX3RpY2tldF9sb2NrKCBsY2ssIGd0aWQgKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitfX2ttcF9pbml0X2xvY2soIGttcF9sb2NrX3QgKmxjayApCit7CisgICAgX19rbXBfaW5pdF90aWNrZXRfbG9jayggbGNrICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19rbXBfZGVzdHJveV9sb2NrKCBrbXBfbG9ja190ICpsY2sgKQoreworICAgIF9fa21wX2Rlc3Ryb3lfdGlja2V0X2xvY2soIGxjayApOworfQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFVzZXIgbG9ja3MuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vCisvLyBEbyBub3QgYWxsb2NhdGUgb2JqZWN0cyBvZiB0eXBlIHVuaW9uIGttcF91c2VyX2xvY2shISEKKy8vIFRoaXMgd2lsbCB3YXN0ZSBzcGFjZSB1bmxlc3MgX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfZHJkcGEuCisvLyBJbnN0ZWFkLCBjaGVjayB0aGUgdmFsdWUgb2YgX19rbXBfdXNlcl9sb2NrX2tpbmQgYW5kIGFsbG9jYXRlIG9iamVjdHMgb2YKKy8vIHRoZSB0eXBlIG9mIHRoZSBhcHByb3ByaWF0ZSB1bmlvbiBtZW1iZXIsIGFuZCBjYXN0IHRoZWlyIGFkZHJlc3NlcyB0bworLy8ga21wX3VzZXJfbG9ja19wLgorLy8KKworZW51bSBrbXBfbG9ja19raW5kIHsKKyAgICBsa19kZWZhdWx0ID0gMCwKKyAgICBsa190YXMsCisjaWYgS01QX09TX0xJTlVYICYmIChLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSB8fCBLTVBfQVJDSF9BQVJDSDY0KQorICAgIGxrX2Z1dGV4LAorI2VuZGlmCisgICAgbGtfdGlja2V0LAorICAgIGxrX3F1ZXVpbmcsCisgICAgbGtfZHJkcGEsCisjaWYgS01QX1VTRV9BREFQVElWRV9MT0NLUworICAgIGxrX2FkYXB0aXZlCisjZW5kaWYgLy8gS01QX1VTRV9BREFQVElWRV9MT0NLUworfTsKKwordHlwZWRlZiBlbnVtIGttcF9sb2NrX2tpbmQga21wX2xvY2tfa2luZF90OworCitleHRlcm4ga21wX2xvY2tfa2luZF90IF9fa21wX3VzZXJfbG9ja19raW5kOworCit1bmlvbiBrbXBfdXNlcl9sb2NrIHsKKyAgICBrbXBfdGFzX2xvY2tfdCAgICAgdGFzOworI2lmIEtNUF9PU19MSU5VWCAmJiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0gfHwgS01QX0FSQ0hfQUFSQ0g2NCkKKyAgICBrbXBfZnV0ZXhfbG9ja190ICAgZnV0ZXg7CisjZW5kaWYKKyAgICBrbXBfdGlja2V0X2xvY2tfdCAgdGlja2V0OworICAgIGttcF9xdWV1aW5nX2xvY2tfdCBxdWV1aW5nOworICAgIGttcF9kcmRwYV9sb2NrX3QgICBkcmRwYTsKKyNpZiBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisgICAga21wX2FkYXB0aXZlX2xvY2tfdCAgICAgYWRhcHRpdmU7CisjZW5kaWYgLy8gS01QX1VTRV9BREFQVElWRV9MT0NLUworICAgIGttcF9sb2NrX3Bvb2xfdCAgICBwb29sOworfTsKKwordHlwZWRlZiB1bmlvbiBrbXBfdXNlcl9sb2NrICprbXBfdXNlcl9sb2NrX3A7CisKK2V4dGVybiBzaXplX3QgX19rbXBfYmFzZV91c2VyX2xvY2tfc2l6ZTsKK2V4dGVybiBzaXplX3QgX19rbXBfdXNlcl9sb2NrX3NpemU7CisKK2V4dGVybiBrbXBfaW50MzIgKCAqX19rbXBfZ2V0X3VzZXJfbG9ja19vd25lcl8gKSgga21wX3VzZXJfbG9ja19wIGxjayApOworCitzdGF0aWMgaW5saW5lIGttcF9pbnQzMgorX19rbXBfZ2V0X3VzZXJfbG9ja19vd25lcigga21wX3VzZXJfbG9ja19wIGxjayApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfZ2V0X3VzZXJfbG9ja19vd25lcl8gIT0gTlVMTCApOworICAgIHJldHVybiAoICpfX2ttcF9nZXRfdXNlcl9sb2NrX293bmVyXyApKCBsY2sgKTsKK30KKworZXh0ZXJuIHZvaWQgKCAqX19rbXBfYWNxdWlyZV91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGttcF91c2VyX2xvY2tfcCBsY2ssIGttcF9pbnQzMiBndGlkICk7CisKKyNpZiBLTVBfT1NfTElOVVggJiYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNIHx8IEtNUF9BUkNIX0FBUkNINjQpCisKKyNkZWZpbmUgX19rbXBfYWNxdWlyZV91c2VyX2xvY2tfd2l0aF9jaGVja3MobGNrLGd0aWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfdGFzKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF9zZXRfbG9jayI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmICggKCBzaXplb2YgKCBrbXBfdGFzX2xvY2tfdCApIDw9IE9NUF9MT0NLX1RfU0laRSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAmJiBsY2stPnRhcy5say5kZXB0aF9sb2NrZWQgIT0gLTEgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tOZXN0YWJsZVVzZWRBc1NpbXBsZSwgZnVuYyApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmICggKCBndGlkID49IDAgKSAmJiAoIGxjay0+dGFzLmxrLnBvbGwgLSAxID09IGd0aWQgKSApIHsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tJc0FscmVhZHlPd25lZCwgZnVuYyApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKCAoIGxjay0+dGFzLmxrLnBvbGwgIT0gMCApIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoICEgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTMyKCAmKGxjay0+dGFzLmxrLnBvbGwpLCAwLCBndGlkICsgMSApICkgICkgeyAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGttcF91aW50MzIgc3BpbnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEtNUF9GU1lOQ19QUkVQQVJFKCBsY2sgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEtNUF9JTklUX1lJRUxEKCBzcGlucyApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmICggVENSXzQoX19rbXBfbnRoKSA+IChfX2ttcF9hdmFpbF9wcm9jID8gX19rbXBfYXZhaWxfcHJvYyA6IF9fa21wX3hwcm9jKSApIHsgICAgIFwKKyAgICAgICAgICAgICAgICBLTVBfWUlFTEQoIFRSVUUgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBLTVBfWUlFTERfU1BJTiggc3BpbnMgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHdoaWxlICggKCBsY2stPnRhcy5say5wb2xsICE9IDAgKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgKCAhIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EzMiggJihsY2stPnRhcy5say5wb2xsKSwgMCwgZ3RpZCArIDEgKSApICApICB7ICAgICAgIFwKKyAgICAgICAgICAgICAgICBpZiAoIFRDUl80KF9fa21wX250aCkgPiAoX19rbXBfYXZhaWxfcHJvYyA/IF9fa21wX2F2YWlsX3Byb2MgOiBfX2ttcF94cHJvYykgKSB7IFwKKyAgICAgICAgICAgICAgICAgICAgS01QX1lJRUxEKCBUUlVFICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgS01QX1lJRUxEX1NQSU4oIHNwaW5zICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0ZTWU5DX0FDUVVJUkVEKCBsY2sgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfYWNxdWlyZV91c2VyX2xvY2tfd2l0aF9jaGVja3NfICE9IE5VTEwgKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKCAqX19rbXBfYWNxdWlyZV91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGxjaywgZ3RpZCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQKK19fa21wX2FjcXVpcmVfdXNlcl9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfdXNlcl9sb2NrX3AgbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfYWNxdWlyZV91c2VyX2xvY2tfd2l0aF9jaGVja3NfICE9IE5VTEwgKTsKKyAgICAoICpfX2ttcF9hY3F1aXJlX3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSggbGNrLCBndGlkICk7Cit9CisjZW5kaWYKKworZXh0ZXJuIGludCAoICpfX2ttcF90ZXN0X3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSgga21wX3VzZXJfbG9ja19wIGxjaywga21wX2ludDMyIGd0aWQgKTsKKworI2lmIEtNUF9PU19MSU5VWCAmJiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0gfHwgS01QX0FSQ0hfQUFSQ0g2NCkKKworI2luY2x1ZGUgImttcF9pMThuLmgiICAgICAgICAgICAgICAgICAgICAgICAvKiBBQzogS01QX0ZBVEFMIGRlZmluaXRpb24gKi8KK2V4dGVybiBpbnQgX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrOyAgICAgLyogQUM6IGNvcHkgZnJvbSBrbXAuaCBoZXJlICovCitzdGF0aWMgaW5saW5lIGludAorX19rbXBfdGVzdF91c2VyX2xvY2tfd2l0aF9jaGVja3MoIGttcF91c2VyX2xvY2tfcCBsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBpZiAoIF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX3RhcyApIHsKKyAgICAgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgICAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfdGVzdF9sb2NrIjsKKyAgICAgICAgICAgIGlmICggKCBzaXplb2YgKCBrbXBfdGFzX2xvY2tfdCApIDw9IE9NUF9MT0NLX1RfU0laRSApCisgICAgICAgICAgICAgICAgJiYgbGNrLT50YXMubGsuZGVwdGhfbG9ja2VkICE9IC0xICkgeworICAgICAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja05lc3RhYmxlVXNlZEFzU2ltcGxlLCBmdW5jICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICggKCBsY2stPnRhcy5say5wb2xsID09IDAgKSAmJgorICAgICAgICAgIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EzMiggJihsY2stPnRhcy5say5wb2xsKSwgMCwgZ3RpZCArIDEgKSApOworICAgIH0gZWxzZSB7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX3Rlc3RfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyAhPSBOVUxMICk7CisgICAgICAgIHJldHVybiAoICpfX2ttcF90ZXN0X3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSggbGNrLCBndGlkICk7CisgICAgfQorfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50CitfX2ttcF90ZXN0X3VzZXJfbG9ja193aXRoX2NoZWNrcygga21wX3VzZXJfbG9ja19wIGxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX3Rlc3RfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyAhPSBOVUxMICk7CisgICAgcmV0dXJuICggKl9fa21wX3Rlc3RfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyApKCBsY2ssIGd0aWQgKTsKK30KKyNlbmRpZgorCitleHRlcm4gdm9pZCAoICpfX2ttcF9yZWxlYXNlX3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSgga21wX3VzZXJfbG9ja19wIGxjaywga21wX2ludDMyIGd0aWQgKTsKKworc3RhdGljIGlubGluZSB2b2lkCitfX2ttcF9yZWxlYXNlX3VzZXJfbG9ja193aXRoX2NoZWNrcygga21wX3VzZXJfbG9ja19wIGxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX3JlbGVhc2VfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyAhPSBOVUxMICk7CisgICAgKCAqX19rbXBfcmVsZWFzZV91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkgKCBsY2ssIGd0aWQgKTsKK30KKworZXh0ZXJuIHZvaWQgKCAqX19rbXBfaW5pdF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGttcF91c2VyX2xvY2tfcCBsY2sgKTsKKworc3RhdGljIGlubGluZSB2b2lkCitfX2ttcF9pbml0X3VzZXJfbG9ja193aXRoX2NoZWNrcygga21wX3VzZXJfbG9ja19wIGxjayApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICE9IE5VTEwgKTsKKyAgICAoICpfX2ttcF9pbml0X3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSggbGNrICk7Cit9CisKKy8vCisvLyBXZSBuZWVkIGEgbm9uLWNoZWNraW5nIHZlcnNpb24gb2YgZGVzdHJveSBsb2NrIGZvciB3aGVuIHRoZSBSVEwgaXMKKy8vIGRvaW5nIHRoZSBjbGVhbnVwIGFzIGl0IGNhbid0IGFsd2F5cyB0ZWxsIGlmIHRoZSBsb2NrIGlzIG5lc3RlZCBvciBub3QuCisvLworZXh0ZXJuIHZvaWQgKCAqX19rbXBfZGVzdHJveV91c2VyX2xvY2tfICkoIGttcF91c2VyX2xvY2tfcCBsY2sgKTsKKworc3RhdGljIGlubGluZSB2b2lkCitfX2ttcF9kZXN0cm95X3VzZXJfbG9jaygga21wX3VzZXJfbG9ja19wIGxjayApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfZGVzdHJveV91c2VyX2xvY2tfICE9IE5VTEwgKTsKKyAgICAoICpfX2ttcF9kZXN0cm95X3VzZXJfbG9ja18gKSggbGNrICk7Cit9CisKK2V4dGVybiB2b2lkICggKl9fa21wX2Rlc3Ryb3lfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyApKCBrbXBfdXNlcl9sb2NrX3AgbGNrICk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19rbXBfZGVzdHJveV91c2VyX2xvY2tfd2l0aF9jaGVja3MoIGttcF91c2VyX2xvY2tfcCBsY2sgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2Rlc3Ryb3lfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyAhPSBOVUxMICk7CisgICAgKCAqX19rbXBfZGVzdHJveV91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGxjayApOworfQorCitleHRlcm4gdm9pZCAoICpfX2ttcF9hY3F1aXJlX25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGttcF91c2VyX2xvY2tfcCBsY2ssIGttcF9pbnQzMiBndGlkICk7CisKKyNpZiBLTVBfT1NfTElOVVggJiYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQpCisKKyNkZWZpbmUgX19rbXBfYWNxdWlyZV9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzKGxjayxndGlkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX3RhcykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF9zZXRfbmVzdF9sb2NrIjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoICggc2l6ZW9mICgga21wX3Rhc19sb2NrX3QgKSA8PSBPTVBfTkVTVF9MT0NLX1RfU0laRSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICYmIGxjay0+dGFzLmxrLmRlcHRoX2xvY2tlZCA9PSAtMSApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tTaW1wbGVVc2VkQXNOZXN0YWJsZSwgZnVuYyApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKCBsY2stPnRhcy5say5wb2xsIC0gMSA9PSBndGlkICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBsY2stPnRhcy5say5kZXB0aF9sb2NrZWQgKz0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmICggKCBsY2stPnRhcy5say5wb2xsICE9IDAgKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICggISBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRMzIoICYobGNrLT50YXMubGsucG9sbCksIDAsIGd0aWQgKyAxICkgKSAgKSB7ICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGttcF91aW50MzIgc3BpbnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBLTVBfRlNZTkNfUFJFUEFSRSggbGNrICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgS01QX0lOSVRfWUlFTEQoIHNwaW5zICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGlmICggVENSXzQoX19rbXBfbnRoKSA+IChfX2ttcF9hdmFpbF9wcm9jID8gX19rbXBfYXZhaWxfcHJvYyA6IF9fa21wX3hwcm9jKSApIHsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgS01QX1lJRUxEKCBUUlVFICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBLTVBfWUlFTERfU1BJTiggc3BpbnMgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgd2hpbGUgKCAoIGxjay0+dGFzLmxrLnBvbGwgIT0gMCApIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgKCAhIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EzMiggJihsY2stPnRhcy5say5wb2xsKSwgMCwgZ3RpZCArIDEgKSApICApIHsgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBUQ1JfNChfX2ttcF9udGgpID4gKF9fa21wX2F2YWlsX3Byb2MgPyBfX2ttcF9hdmFpbF9wcm9jIDogX19rbXBfeHByb2MpICkgeyBcCisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfWUlFTEQoIFRSVUUgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9ZSUVMRF9TUElOKCBzcGlucyApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBsY2stPnRhcy5say5kZXB0aF9sb2NrZWQgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0ZTWU5DX0FDUVVJUkVEKCBsY2sgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9hY3F1aXJlX25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICE9IE5VTEwgKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKCAqX19rbXBfYWNxdWlyZV9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyApKCBsY2ssIGd0aWQgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkCitfX2ttcF9hY3F1aXJlX25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3MoIGttcF91c2VyX2xvY2tfcCBsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9hY3F1aXJlX25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICE9IE5VTEwgKTsKKyAgICAoICpfX2ttcF9hY3F1aXJlX25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGxjaywgZ3RpZCApOworfQorI2VuZGlmCisKK2V4dGVybiBpbnQgKCAqX19rbXBfdGVzdF9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyApKCBrbXBfdXNlcl9sb2NrX3AgbGNrLCBrbXBfaW50MzIgZ3RpZCApOworCisjaWYgS01QX09TX0xJTlVYICYmIChLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0KQorc3RhdGljIGlubGluZSBpbnQKK19fa21wX3Rlc3RfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrcygga21wX3VzZXJfbG9ja19wIGxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGlmICggX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfdGFzICkgeworICAgICAgICBpbnQgcmV0dmFsOworICAgICAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF90ZXN0X25lc3RfbG9jayI7CisgICAgICAgICAgICBpZiAoICggc2l6ZW9mICgga21wX3Rhc19sb2NrX3QgKSA8PSBPTVBfTkVTVF9MT0NLX1RfU0laRSApCisgICAgICAgICAgICAgICAgJiYgbGNrLT50YXMubGsuZGVwdGhfbG9ja2VkID09IC0xICkgeworICAgICAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja1NpbXBsZVVzZWRBc05lc3RhYmxlLCBmdW5jICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggZ3RpZCA+PSAwICk7CisgICAgICAgIGlmICggbGNrLT50YXMubGsucG9sbCAtIDEgPT0gZ3RpZCApIHsgICAvKiBfX2ttcF9nZXRfdGFzX2xvY2tfb3duZXIoIGxjayApID09IGd0aWQgKi8KKyAgICAgICAgICAgIHJldHVybiArK2xjay0+dGFzLmxrLmRlcHRoX2xvY2tlZDsgIC8qIHNhbWUgb3duZXIsIGRlcHRoIGluY3JlYXNlZCAqLworICAgICAgICB9CisgICAgICAgIHJldHZhbCA9ICggKCBsY2stPnRhcy5say5wb2xsID09IDAgKSAmJgorICAgICAgICAgIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EzMiggJihsY2stPnRhcy5say5wb2xsKSwgMCwgZ3RpZCArIDEgKSApOworICAgICAgICBpZiAoIHJldHZhbCApIHsKKyAgICAgICAgICAgIEtNUF9NQigpOworICAgICAgICAgICAgbGNrLT50YXMubGsuZGVwdGhfbG9ja2VkID0gMTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0dmFsOworICAgIH0gZWxzZSB7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX3Rlc3RfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gIT0gTlVMTCApOworICAgICAgICByZXR1cm4gKCAqX19rbXBfdGVzdF9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyApKCBsY2ssIGd0aWQgKTsKKyAgICB9Cit9CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQKK19fa21wX3Rlc3RfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrcygga21wX3VzZXJfbG9ja19wIGxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX3Rlc3RfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gIT0gTlVMTCApOworICAgIHJldHVybiAoICpfX2ttcF90ZXN0X25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGxjaywgZ3RpZCApOworfQorI2VuZGlmCisKK2V4dGVybiB2b2lkICggKl9fa21wX3JlbGVhc2VfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSgga21wX3VzZXJfbG9ja19wIGxjaywga21wX2ludDMyIGd0aWQgKTsKKworc3RhdGljIGlubGluZSB2b2lkCitfX2ttcF9yZWxlYXNlX25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3MoIGttcF91c2VyX2xvY2tfcCBsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9yZWxlYXNlX25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICE9IE5VTEwgKTsKKyAgICAoICpfX2ttcF9yZWxlYXNlX25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGxjaywgZ3RpZCApOworfQorCitleHRlcm4gdm9pZCAoICpfX2ttcF9pbml0X25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGttcF91c2VyX2xvY2tfcCBsY2sgKTsKKworc3RhdGljIGlubGluZSB2b2lkIF9fa21wX2luaXRfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrcygga21wX3VzZXJfbG9ja19wIGxjayApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyAhPSBOVUxMICk7CisgICAgKCAqX19rbXBfaW5pdF9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyApKCBsY2sgKTsKK30KKworZXh0ZXJuIHZvaWQgKCAqX19rbXBfZGVzdHJveV9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyApKCBrbXBfdXNlcl9sb2NrX3AgbGNrICk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19rbXBfZGVzdHJveV9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfdXNlcl9sb2NrX3AgbGNrICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9kZXN0cm95X25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICE9IE5VTEwgKTsKKyAgICAoICpfX2ttcF9kZXN0cm95X25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGxjayApOworfQorCisvLworLy8gdXNlciBsb2NrIGZ1bmN0aW9ucyB3aGljaCBkbyBub3QgbmVjZXNzYXJpbHkgZXhpc3QgZm9yIGFsbCBsb2NrIGtpbmRzLgorLy8KKy8vIFRoZSAic2V0IiBmdW5jdGlvbnMgdXN1YWxseSBoYXZlIHdyYXBwZXIgcm91dGluZXMgdGhhdCBjaGVjayBmb3IgYSBOVUxMIHNldAorLy8gZnVuY3Rpb24gcG9pbnRlciBhbmQgY2FsbCBpdCBpZiBub24tTlVMTC4KKy8vCisvLyBJbiBzb21lIGNhc2VzLCBpdCBtYWtlcyBzZW5zZSB0byBoYXZlIGEgImdldCIgd3JhcHBlciBmdW5jdGlvbiBjaGVjayBmb3IgYQorLy8gTlVMTCBnZXQgZnVuY3Rpb24gcG9pbnRlciBhbmQgcmV0dXJuIE5VTEwgLyBpbnZhbGlkIHZhbHVlIC8gZXJyb3IgY29kZSBpZgorLy8gdGhlIGZ1bmN0aW9uIHBvaW50ZXIgaXMgTlVMTC4KKy8vCisvLyBJbiBvdGhlciBjYXNlcywgdGhlIGNhbGxpbmcgY29kZSByZWFsbHkgc2hvdWxkIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBhbgorLy8gdW5pbXBsZW1lbnRlZCBmdW5jdGlvbiBhbmQgb25lIHRoYXQgaXMgaW1wbGVtZW50ZWQgYnV0IHJldHVybmluZyBOVUxMIC8KKy8vIGludmFsaWVkIHZhbHVlLiAgSWYgdGhpcyBpcyB0aGUgY2FzZSwgbm8gZ2V0IGZ1bmN0aW9uIHdyYXBwZXIgZXhpc3RzLgorLy8KKworZXh0ZXJuIGludCAoICpfX2ttcF9pc191c2VyX2xvY2tfaW5pdGlhbGl6ZWRfICkoIGttcF91c2VyX2xvY2tfcCBsY2sgKTsKKworLy8gbm8gc2V0IGZ1bmN0aW9uOyBmaWVsZHMgc2V0IGR1cmluaW5nIGxvY2FsIGFsbG9jYXRpb24KKworZXh0ZXJuIGNvbnN0IGlkZW50X3QgKiAoICpfX2ttcF9nZXRfdXNlcl9sb2NrX2xvY2F0aW9uXyApKCBrbXBfdXNlcl9sb2NrX3AgbGNrICk7CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgaWRlbnRfdCAqCitfX2ttcF9nZXRfdXNlcl9sb2NrX2xvY2F0aW9uKCBrbXBfdXNlcl9sb2NrX3AgbGNrICkKK3sKKyAgICBpZiAoIF9fa21wX2dldF91c2VyX2xvY2tfbG9jYXRpb25fICAhPSBOVUxMICkgeworICAgICAgICByZXR1cm4gKCAqX19rbXBfZ2V0X3VzZXJfbG9ja19sb2NhdGlvbl8gKSggbGNrICk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9Cit9CisKK2V4dGVybiB2b2lkICggKl9fa21wX3NldF91c2VyX2xvY2tfbG9jYXRpb25fICkoIGttcF91c2VyX2xvY2tfcCBsY2ssIGNvbnN0IGlkZW50X3QgKmxvYyApOworCitzdGF0aWMgaW5saW5lIHZvaWQKK19fa21wX3NldF91c2VyX2xvY2tfbG9jYXRpb24oIGttcF91c2VyX2xvY2tfcCBsY2ssIGNvbnN0IGlkZW50X3QgKmxvYyApCit7CisgICAgaWYgKCBfX2ttcF9zZXRfdXNlcl9sb2NrX2xvY2F0aW9uXyAgIT0gTlVMTCApIHsKKyAgICAgICAgKCAqX19rbXBfc2V0X3VzZXJfbG9ja19sb2NhdGlvbl8gKSggbGNrLCBsb2MgKTsKKyAgICB9Cit9CisKK2V4dGVybiBrbXBfbG9ja19mbGFnc190ICggKl9fa21wX2dldF91c2VyX2xvY2tfZmxhZ3NfICkoIGttcF91c2VyX2xvY2tfcCBsY2sgKTsKKworZXh0ZXJuIHZvaWQgKCAqX19rbXBfc2V0X3VzZXJfbG9ja19mbGFnc18gKSgga21wX3VzZXJfbG9ja19wIGxjaywga21wX2xvY2tfZmxhZ3NfdCBmbGFncyApOworCitzdGF0aWMgaW5saW5lIHZvaWQKK19fa21wX3NldF91c2VyX2xvY2tfZmxhZ3MoIGttcF91c2VyX2xvY2tfcCBsY2ssIGttcF9sb2NrX2ZsYWdzX3QgZmxhZ3MgKQoreworICAgIGlmICggX19rbXBfc2V0X3VzZXJfbG9ja19mbGFnc18gICE9IE5VTEwgKSB7CisgICAgICAgICggKl9fa21wX3NldF91c2VyX2xvY2tfZmxhZ3NfICkoIGxjaywgZmxhZ3MgKTsKKyAgICB9Cit9CisKKy8vCisvLyBUaGUgZnVjdGlvbiB3aGljaCBzZXRzIHVwIGFsbCBvZiB0aGUgdnRibCBwb2ludGVycyBmb3Iga21wX3VzZXJfbG9ja190LgorLy8KK2V4dGVybiB2b2lkIF9fa21wX3NldF91c2VyX2xvY2tfdnB0cnMoIGttcF9sb2NrX2tpbmRfdCB1c2VyX2xvY2tfa2luZCApOworCisvLworLy8gTWFjcm9zIGZvciBiaW5kaW5nIHVzZXIgbG9jayBmdW5jdGlvbnMuCisvLworI2RlZmluZSBLTVBfQklORF9VU0VSX0xPQ0tfVEVNUExBVEUobmVzdCwga2luZCwgc3VmZml4KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fa21wX2FjcXVpcmUjI25lc3QjI3VzZXJfbG9ja193aXRoX2NoZWNrc18gPSAoIHZvaWQgKCopKCBrbXBfdXNlcl9sb2NrX3AsIGttcF9pbnQzMiApICkgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9hY3F1aXJlIyNuZXN0IyNraW5kIyNfIyNzdWZmaXg7ICAgICAgICAgXAorICAgIF9fa21wX3JlbGVhc2UjI25lc3QjI3VzZXJfbG9ja193aXRoX2NoZWNrc18gPSAoIHZvaWQgKCopKCBrbXBfdXNlcl9sb2NrX3AsIGttcF9pbnQzMiApICkgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9yZWxlYXNlIyNuZXN0IyNraW5kIyNfIyNzdWZmaXg7ICAgICAgICAgXAorICAgIF9fa21wX3Rlc3QjI25lc3QjI3VzZXJfbG9ja193aXRoX2NoZWNrc18gICAgPSAoIGludCAoKikoIGttcF91c2VyX2xvY2tfcCwga21wX2ludDMyICkgKSAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF90ZXN0IyNuZXN0IyNraW5kIyNfIyNzdWZmaXg7ICAgICAgICAgICAgXAorICAgIF9fa21wX2luaXQjI25lc3QjI3VzZXJfbG9ja193aXRoX2NoZWNrc18gICAgPSAoIHZvaWQgKCopKCBrbXBfdXNlcl9sb2NrX3AgKSApICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9pbml0IyNuZXN0IyNraW5kIyNfIyNzdWZmaXg7ICAgICAgICAgICAgXAorICAgIF9fa21wX2Rlc3Ryb3kjI25lc3QjI3VzZXJfbG9ja193aXRoX2NoZWNrc18gPSAoIHZvaWQgKCopKCBrbXBfdXNlcl9sb2NrX3AgKSApICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9kZXN0cm95IyNuZXN0IyNraW5kIyNfIyNzdWZmaXg7ICAgICAgICAgXAorfQorCisjZGVmaW5lIEtNUF9CSU5EX1VTRVJfTE9DSyhraW5kKSAgICAgICAgICAgICAgICAgICAgS01QX0JJTkRfVVNFUl9MT0NLX1RFTVBMQVRFKF8sIGtpbmQsIGxvY2spCisjZGVmaW5lIEtNUF9CSU5EX1VTRVJfTE9DS19XSVRIX0NIRUNLUyhraW5kKSAgICAgICAgS01QX0JJTkRfVVNFUl9MT0NLX1RFTVBMQVRFKF8sIGtpbmQsIGxvY2tfd2l0aF9jaGVja3MpCisjZGVmaW5lIEtNUF9CSU5EX05FU1RFRF9VU0VSX0xPQ0soa2luZCkgICAgICAgICAgICAgS01QX0JJTkRfVVNFUl9MT0NLX1RFTVBMQVRFKF9uZXN0ZWRfLCBraW5kLCBsb2NrKQorI2RlZmluZSBLTVBfQklORF9ORVNURURfVVNFUl9MT0NLX1dJVEhfQ0hFQ0tTKGtpbmQpIEtNUF9CSU5EX1VTRVJfTE9DS19URU1QTEFURShfbmVzdGVkXywga2luZCwgbG9ja193aXRoX2NoZWNrcykKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVXNlciBsb2NrIHRhYmxlICYgbG9jayBhbGxvY2F0aW9uCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8qCisgICAgT24gNjQtYml0IExpbnV4KiBPUyAoYW5kIE9TIFgqKSBHTlUgY29tcGlsZXIgYWxsb2NhdGVzIG9ubHkgNCBieXRlbXMgbWVtb3J5IGZvciBsb2NrIHZhcmlhYmxlLCB3aGljaAorICAgIGlzIG5vdCBlbm91Z2ggdG8gc3RvcmUgYSBwb2ludGVyLCBzbyB3ZSBoYXZlIHRvIHVzZSBsb2NrIGluZGV4ZXMgaW5zdGVhZCBvZiBwb2ludGVycyBhbmQKKyAgICBtYWludGFpbiBsb2NrIHRhYmxlIHRvIG1hcCBpbmRleGVzIHRvIHBvaW50ZXJzLgorCisKKyAgICBOb3RlOiBUaGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgdGFibGUgaXMgbm90IGEgcG9pbnRlciB0byBsb2NrISBJdCBpcyBhIHBvaW50ZXIgdG8gcHJldmlvdXNseQorICAgIGFsbG9jYXRlZCB0YWJsZSAob3IgTlVMTCBpZiBpdCBpcyB0aGUgZmlyc3QgdGFibGUpLgorCisgICAgVXNhZ2U6CisKKyAgICAgICAgaWYgKCBPTVBfTE9DS19UX1NJWkUgPCBzaXplb2YoIDxsb2NrPiApICkgeyAvLyBvciBPTVBfTkVTVF9MT0NLX1RfU0laRQorICAgICAgICAgICAgTG9jayB0YWJsZSBpcyBmdWxseSB1dGlsaXplZC4gVXNlciBsb2NrcyBhcmUgaW5kZXhlcywgc28gdGFibGUgaXMKKyAgICAgICAgICAgIHVzZWQgb24gdXNlciBsb2NrIG9wZXJhdGlvbi4KKyAgICAgICAgICAgIE5vdGU6IGl0IG1heSBiZSB0aGUgY2FzZSAobGluXzMyKSB0aGF0IHdlIGRvbid0IG5lZWQgdG8gdXNlIGEgbG9jaworICAgICAgICAgICAgdGFibGUgZm9yIHJlZ3VsYXIgbG9ja3MsIGJ1dCBkbyBuZWVkIHRoZSB0YWJsZSBmb3IgbmVzdGVkIGxvY2tzLgorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgTG9jayB0YWJsZSBpbml0aWFsaXplZCBidXQgbm90IGFjdHVhbGx5IHVzZWQuCisgICAgICAgIH0KKyovCisKK3N0cnVjdCBrbXBfbG9ja190YWJsZSB7CisgICAga21wX2xvY2tfaW5kZXhfdCAgdXNlZDsgICAgICAvLyBOdW1iZXIgb2YgdXNlZCBlbGVtZW50cworICAgIGttcF9sb2NrX2luZGV4X3QgIGFsbG9jYXRlZDsgLy8gTnVtYmVyIG9mIGFsbG9jYXRlZCBlbGVtZW50cworICAgIGttcF91c2VyX2xvY2tfcCAqIHRhYmxlOyAgICAgLy8gTG9jayB0YWJsZS4KK307CisKK3R5cGVkZWYgc3RydWN0IGttcF9sb2NrX3RhYmxlIGttcF9sb2NrX3RhYmxlX3Q7CisKK2V4dGVybiBrbXBfbG9ja190YWJsZV90IF9fa21wX3VzZXJfbG9ja190YWJsZTsKK2V4dGVybiBrbXBfdXNlcl9sb2NrX3AgX19rbXBfbG9ja19wb29sOworCitzdHJ1Y3Qga21wX2Jsb2NrX29mX2xvY2tzIHsKKyAgICBzdHJ1Y3Qga21wX2Jsb2NrX29mX2xvY2tzICogbmV4dF9ibG9jazsKKyAgICB2b2lkICogICAgICAgICAgICAgICAgICAgICAgbG9ja3M7Cit9OworCit0eXBlZGVmIHN0cnVjdCBrbXBfYmxvY2tfb2ZfbG9ja3Mga21wX2Jsb2NrX29mX2xvY2tzX3Q7CisKK2V4dGVybiBrbXBfYmxvY2tfb2ZfbG9ja3NfdCAqX19rbXBfbG9ja19ibG9ja3M7CitleHRlcm4gaW50IF9fa21wX251bV9sb2Nrc19pbl9ibG9jazsKKworZXh0ZXJuIGttcF91c2VyX2xvY2tfcCBfX2ttcF91c2VyX2xvY2tfYWxsb2NhdGUoIHZvaWQgKip1c2VyX2xvY2ssIGttcF9pbnQzMiBndGlkLCBrbXBfbG9ja19mbGFnc190IGZsYWdzICk7CitleHRlcm4gdm9pZCBfX2ttcF91c2VyX2xvY2tfZnJlZSggdm9pZCAqKnVzZXJfbG9jaywga21wX2ludDMyIGd0aWQsIGttcF91c2VyX2xvY2tfcCBsY2sgKTsKK2V4dGVybiBrbXBfdXNlcl9sb2NrX3AgX19rbXBfbG9va3VwX3VzZXJfbG9jayggdm9pZCAqKnVzZXJfbG9jaywgY2hhciBjb25zdCAqZnVuYyApOworZXh0ZXJuIHZvaWQgX19rbXBfY2xlYW51cF91c2VyX2xvY2tzKCk7CisKKyNkZWZpbmUgS01QX0NIRUNLX1VTRVJfTE9DS19JTklUKCkgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKCAhIFRDUl80KCBfX2ttcF9pbml0X3VzZXJfbG9ja3MgKSApIHsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9pbml0el9sb2NrICk7ICAgICAgXAorICAgICAgICAgICAgICAgIGlmICggISBUQ1JfNCggX19rbXBfaW5pdF91c2VyX2xvY2tzICkgKSB7ICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBUQ1dfNCggX19rbXBfaW5pdF91c2VyX2xvY2tzLCBUUlVFICk7ICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9pbml0el9sb2NrICk7ICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9CisKKyN1bmRlZiBLTVBfUEFECisjdW5kZWYgS01QX0dUSURfRE5FCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvLyBleHRlcm4gIkMiCisjZW5kaWYgLy8gX19jcGx1c3BsdXMKKworI2VuZGlmIC8qIEtNUF9MT0NLX0ggKi8KKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX29tcC5oIGIvZmluYWwvcnVudGltZS9zcmMva21wX29tcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2NjM3MzkKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfb21wLmgKQEAgLTAsMCArMSwyMDIgQEAKKy8qCisgKiBrbXBfb21wLmggLS0gT3Blbk1QIGRlZmluaXRpb24gZm9yIGttcF9vbXBfc3RydWN0X2luZm9fdC4KKyAqICAgICAgICAgICAgICBUaGlzIGlzIGZvciBpbmZvcm1hdGlvbiBhYm91dCBydW50aW1lIGxpYnJhcnkgc3RydWN0dXJlcy4KKyAqICRSZXZpc2lvbjogNDI5NTEgJAorICogJERhdGU6IDIwMTQtMDEtMjEgMTQ6NDE6NDEgLTA2MDAgKFR1ZSwgMjEgSmFuIDIwMTQpICQKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworLyogVEhJUyBGSUxFIFNIT1VMRCBOT1QgQkUgTU9ESUZJRUQgSU4gSURCIElOVEVSRkFDRSBMSUJSQVJZIENPREUKKyAqIEl0IHNob3VsZCBpbnN0ZWFkIGJlIG1vZGlmaWVkIGluIHRoZSBPcGVuTVAgcnVudGltZSBhbmQgY29waWVkCisgKiB0byB0aGUgaW50ZXJmYWNlIGxpYnJhcnkgY29kZS4gIFRoaXMgd2F5IHdlIGNhbiBtaW5pbWl6ZSB0aGUKKyAqIHByb2JsZW1zIHRoYXQgdGhpcyBpcyBzdXJlIHRvIGNhdXNlIGhhdmluZyB0d28gY29waWVzIG9mIHRoZQorICogc2FtZSBmaWxlLgorICoKKyAqIGZpbGVzIGxpdmUgaW4gbGlib21wIGFuZCBsaWJvbXBfZGIvc3JjL2luY2x1ZGUKKyAqLworCisvKiBDSEFOR0UgVEhJUyBXSEVOIFNUUlVDVFVSRVMgQkVMT1cgQ0hBTkdFCisgKiBCZWZvcmUgd2UgcmVsZWFzZSB0aGlzIHRvIGEgY3VzdG9tZXIsIHBsZWFzZSBkb24ndCBjaGFuZ2UgdGhpcyB2YWx1ZS4gIEFmdGVyIGl0IGlzIHJlbGVhc2VkIGFuZAorICogc3RhYmxlLCB0aGVuIGFueSBuZXcgdXBkYXRlcyB0byB0aGUgc3RydWN0dXJlcyBvciBkYXRhIHN0cnVjdHVyZSB0cmF2ZXJzYWwgYWxnb3JpdGhtcyBuZWVkIHRvCisgKiBjaGFuZ2UgdGhpcyB2YWx1ZS4KKyAqLworI2RlZmluZSBLTVBfT01QX1ZFUlNJT04gOAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAga21wX2ludDMyICBvZmZzZXQ7CisgICAga21wX2ludDMyICBzaXplOworfSBvZmZzZXRfYW5kX3NpemVfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGttcF91aW50NjQgICAgYWRkcjsKKyAgICBrbXBfaW50MzIgICAgIHNpemU7CisgICAga21wX2ludDMyICAgICBwYWRkaW5nOworfSBhZGRyX2FuZF9zaXplX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBrbXBfdWludDY0ICAgZmxhZ3M7ICAgICAgICAgLy8gRmxhZ3MgZm9yIGZ1dHVyZSBleHRlbnNpb25zLgorICAgIGttcF91aW50NjQgICBmaWxlOyAgICAgICAgICAvLyBQb2ludGVyIHRvIG5hbWUgb2Ygc291cmNlIGZpbGUgd2hlcmUgdGhlIHBhcmFsbGVsIHJlZ2lvbiBpcy4KKyAgICBrbXBfdWludDY0ICAgZnVuYzsgICAgICAgICAgLy8gUG9pbnRlciB0byBuYW1lIG9mIHJvdXRpbmUgd2hlcmUgdGhlIHBhcmFsbGVsIHJlZ2lvbiBpcy4KKyAgICBrbXBfaW50MzIgICAgYmVnaW47ICAgICAgICAgLy8gQmVnaW5uaW5nIG9mIHNvdXJjZSBsaW5lIHJhbmdlLgorICAgIGttcF9pbnQzMiAgICBlbmQ7ICAgICAgICAgICAvLyBFbmQgb2Ygc291cmNlIGxpbmUgcmFuZ2UuCisgICAga21wX2ludDMyICAgIG51bV90aHJlYWRzOyAgIC8vIFNwZWNpZmllZCBudW1iZXIgb2YgdGhyZWFkcy4KK30ga21wX29tcF9udGhyX2l0ZW1fdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGttcF9pbnQzMiAgICAgbnVtOyAgICAgICAgICAvLyBOdW1iZXIgb2YgaXRlbXMgaW4gdGhlIGFycnJheS4KKyAgICBrbXBfdWludDY0ICAgIGFycmF5OyAgICAgICAgLy8gQWRkcmVzcyBvZiBhcnJheSBvZiBrbXBfb21wX251bV90aHJlYWRzX2l0ZW1fdC4KK30ga21wX29tcF9udGhyX2luZm9fdDsKKworCisvKiBUaGlzIHN0cnVjdHVyZSBpcyBrbm93biB0byB0aGUgaWRiIGludGVyZmFjZSBsaWJyYXJ5ICovCit0eXBlZGVmIHN0cnVjdCB7CisKKyAgICAvKiBDaGFuZ2UgdGhpcyBvbmx5IGlmIHlvdSBtYWtlIGEgZnVuZGFtZW50YWwgZGF0YSBzdHJ1Y3R1cmUgY2hhbmdlIGhlcmUgKi8KKyAgICBrbXBfaW50MzIgICAgICAgICAgbGliX3ZlcnNpb247CisKKyAgICAvKiBzYW5pdHkgY2hlY2suICBPbmx5IHNob3VsZCBiZSBjaGVja2VkIGlmIHZlcnNpb25zIGFyZSBpZGVudGljYWwKKyAgICAgKiBUaGlzIGlzIGFsc28gdXNlZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB0byBnZXQgdGhlIHJ1bnRpbWUKKyAgICAgKiBzdHJ1Y3R1cmUgc2l6ZSBpZiBpdCB0aGUgcnVudGltZSBpcyBvbGRlciB0aGFuIHRoZSBpbnRlcmZhY2UgKi8KKyAgICBrbXBfaW50MzIgICAgICAgICAgc2l6ZW9mX3RoaXNfc3RydWN0dXJlOworCisgICAgLyogT3Blbk1QIFJUTCB2ZXJzaW9uIGluZm8uICovCisgICAgYWRkcl9hbmRfc2l6ZV90ICAgIG1ham9yOworICAgIGFkZHJfYW5kX3NpemVfdCAgICBtaW5vcjsKKyAgICBhZGRyX2FuZF9zaXplX3QgICAgYnVpbGQ7CisgICAgYWRkcl9hbmRfc2l6ZV90ICAgIGJhbm5lcjsKKworICAgIC8qIFZhcmlvdXMgZ2xvYmFscy4gKi8KKyAgICBhZGRyX2FuZF9zaXplX3QgIHRocmVhZHM7ICAgICAgICAgICAgLy8gUG9pbnRlciB0byBfX2ttcF90aHJlYWRzLgorICAgIGFkZHJfYW5kX3NpemVfdCAgcm9vdHM7ICAgICAgICAgICAgICAvLyBQb2ludGVyIHRvIF9fa21wX3Jvb3QuCisgICAgYWRkcl9hbmRfc2l6ZV90ICBjYXBhY2l0eTsgICAgICAgICAgIC8vIFBvaW50ZXIgdG8gX19rbXBfdGhyZWFkc19jYXBhY2l0eS4KKyAgICBhZGRyX2FuZF9zaXplX3QgIG1vbml0b3I7ICAgICAgICAgICAgLy8gUG9pbnRlciB0byBfX2ttcF9tb25pdG9yLgorICAgIGFkZHJfYW5kX3NpemVfdCAgbG9ja190YWJsZTsgICAgICAgICAvLyBQb2ludGVyIHRvIF9fa21wX2xvY2tfdGFibGUuCisgICAgYWRkcl9hbmRfc2l6ZV90ICBmdW5jX21pY3JvdGFzazsKKyAgICBhZGRyX2FuZF9zaXplX3QgIGZ1bmNfZm9yazsKKyAgICBhZGRyX2FuZF9zaXplX3QgIHRlYW1fY291bnRlcjsKKyAgICBhZGRyX2FuZF9zaXplX3QgIHRhc2tfY291bnRlcjsKKyAgICBhZGRyX2FuZF9zaXplX3QgIG50aHJfaW5mbzsKKyAgICBrbXBfaW50MzIgICAgICAgIGFkZHJlc3Nfd2lkdGg7CisgICAga21wX2ludDMyICAgICAgICBpbmRleGVkX2xvY2tzOworICAgIGttcF9pbnQzMiAgICAgICAgbGFzdF9iYXJyaWVyOworICAgIGttcF9pbnQzMiAgICAgICAgZGVxdWVfc2l6ZTsKKworICAgIC8qIHRocmVhZCBzdHJ1Y3R1cmUgaW5mb3JtYXRpb24uICovCisgICAga21wX2ludDMyICAgICAgICAgIHRoX3NpemVvZl9zdHJ1Y3Q7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRoX2luZm87ICAgICAgICAgIC8vIGRlc2NyaXB0b3IgZm9yIHRocmVhZAorICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0aF90ZWFtOyAgICAgICAgICAvLyB0ZWFtIGZvciB0aGlzIHRocmVhZAorICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0aF9yb290OyAgICAgICAgICAvLyByb290IGZvciB0aGlzIHRocmVhZAorICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0aF9zZXJpYWxfdGVhbTsgICAvLyBzZXJpYWwgdGVhbSB1bmRlciB0aGlzIHRocmVhZAorICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0aF9pZGVudDsgICAgICAgICAvLyBsb2NhdGlvbiBmb3IgdGhpcyB0aHJlYWQgKGlmIGF2YWlsYWJsZSkKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdGhfc3Bpbl9oZXJlOyAgICAgLy8gaXMgdGhyZWFkIHdhaXRpbmcgZm9yIGxvY2sgKGlmIGF2YWlsYWJsZSkKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdGhfbmV4dF93YWl0aW5nOyAgLy8gbmV4dCB0aHJlYWQgd2FpdGluZyBmb3IgbG9jayAoaWYgYXZhaWxhYmxlKQorICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0aF90YXNrX3RlYW07CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRoX2N1cnJlbnRfdGFzazsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdGhfdGFza19zdGF0ZTsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdGhfYmFyOworICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0aF9iX3dvcmtlcl9hcnJpdmVkOworCisgICAgLyoga21wX2Rlc2Mgc3RydWN0dXJlIChmb3IgaW5mbyBmaWVsZCBhYm92ZSkgKi8KKyAgICBrbXBfaW50MzIgICAgICAgICAgZHNfc2l6ZW9mX3N0cnVjdDsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgZHNfdGlkOyAgICAgICAgICAgLy8gdGVhbSB0aHJlYWQgaWQKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgZHNfZ3RpZDsgICAgICAgICAgLy8gZ2xvYmFsIHRocmVhZCBpZAorICAgIG9mZnNldF9hbmRfc2l6ZV90ICBkc190aHJlYWQ7ICAgICAgICAvLyBuYXRpdmUgdGhyZWFkIGlkCisKKyAgICAvKiB0ZWFtIHN0cnVjdHVyZSBpbmZvcm1hdGlvbiAqLworICAgIGttcF9pbnQzMiAgICAgICAgICB0X3NpemVvZl9zdHJ1Y3Q7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRfbWFzdGVyX3RpZDsgICAgIC8vIHRpZCBvZiBtYXN0ZXIgaW4gcGFyZW50IHRlYW0KKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdF9pZGVudDsgICAgICAgICAgLy8gbG9jYXRpb24gb2YgcGFyYWxsZWwgcmVnaW9uCisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRfcGFyZW50OyAgICAgICAgIC8vIHBhcmVudCB0ZWFtCisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRfbnByb2M7ICAgICAgICAgIC8vICMgdGVhbSB0aHJlYWRzCisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRfdGhyZWFkczsgICAgICAgIC8vIGFycmF5IG9mIHRocmVhZHMKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdF9zZXJpYWxpemVkOyAgICAgLy8gIyBsZXZlbHMgb2Ygc2VyaWFsaXplZCB0ZWFtcworICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0X2lkOyAgICAgICAgICAgICAvLyB1bmlxdWUgdGVhbSBpZAorICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0X3BrZm47CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRfdGFza190ZWFtOworICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0X2ltcGxpY2l0X3Rhc2s7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRfYmFyOworICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0X2JfbWFzdGVyX2Fycml2ZWQ7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRfYl90ZWFtX2Fycml2ZWQ7CisKKyAgICAvKiByb290IHN0cnVjdHVyZSBpbmZvcm1hdGlvbiAqLworICAgIGttcF9pbnQzMiAgICAgICAgICByX3NpemVvZl9zdHJ1Y3Q7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHJfcm9vdF90ZWFtOyAgICAgIC8vIHRlYW0gYXQgcm9vdAorICAgIG9mZnNldF9hbmRfc2l6ZV90ICByX2hvdF90ZWFtOyAgICAgICAvLyBob3QgdGVhbSBmb3IgdGhpcyByb290CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHJfdWJlcl90aHJlYWQ7ICAgIC8vIHJvb3QgdGhyZWFkCisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHJfcm9vdF9pZDsgICAgICAgIC8vIHVuaXF1ZSByb290IGlkIChpZiBhdmFpbGFibGUpCisKKyAgICAvKiBpZGVudCBzdHJ1Y3R1cmUgaW5mb3JtYXRpb24gKi8KKyAgICBrbXBfaW50MzIgICAgICAgICAgaWRfc2l6ZW9mX3N0cnVjdDsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgaWRfcHNvdXJjZTsgICAgICAgLyogYWRkcmVzcyBvZiBzdHJpbmcgIjtmaWxlO2Z1bmM7bGluZTE7bGluZTI7OyIuICovCisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIGlkX2ZsYWdzOworCisgICAgLyogbG9jayBzdHJ1Y3R1cmUgaW5mb3JtYXRpb24gKi8KKyAgICBrbXBfaW50MzIgICAgICAgICAgbGtfc2l6ZW9mX3N0cnVjdDsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgbGtfaW5pdGlhbGl6ZWQ7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIGxrX2xvY2F0aW9uOworICAgIG9mZnNldF9hbmRfc2l6ZV90ICBsa190YWlsX2lkOworICAgIG9mZnNldF9hbmRfc2l6ZV90ICBsa19oZWFkX2lkOworICAgIG9mZnNldF9hbmRfc2l6ZV90ICBsa19uZXh0X3RpY2tldDsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgbGtfbm93X3NlcnZpbmc7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIGxrX293bmVyX2lkOworICAgIG9mZnNldF9hbmRfc2l6ZV90ICBsa19kZXB0aF9sb2NrZWQ7CisKKyAgICAvKiBsb2NrX3RhYmxlX3QgKi8KKyAgICBrbXBfaW50MzIgICAgICAgICAgbHRfc2l6ZV9vZl9zdHJ1Y3Q7ICAgIC8qIFNpemUgYW5kIGxheW91dCBvZiBrbXBfbG9ja190YWJsZV90LiAqLworICAgIG9mZnNldF9hbmRfc2l6ZV90ICBsdF91c2VkOworICAgIG9mZnNldF9hbmRfc2l6ZV90ICBsdF9hbGxvY2F0ZWQ7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIGx0X3RhYmxlOworCisgICAgLyogdGFza190ZWFtX3QgKi8KKyAgICBrbXBfaW50MzIgICAgICAgICAgdHRfc2l6ZW9mX3N0cnVjdDsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdHRfdGhyZWFkc19kYXRhOworICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0dF9mb3VuZF90YXNrczsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdHRfbnByb2M7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHR0X3VuZmluaXNoZWRfdGhyZWFkczsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdHRfYWN0aXZlOworICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0dF9zdGF0ZTsKKworICAgIC8qIGttcF90YXNrZGF0YV90ICovCisgICAga21wX2ludDMyICAgICAgICAgIHRkX3NpemVvZl9zdHJ1Y3Q7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRkX3Rhc2tfaWQ7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRkX2ZsYWdzOworICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0ZF90ZWFtOworICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0ZF9wYXJlbnQ7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRkX2lkZW50OworICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0ZF9hbGxvY2F0ZWRfY2hpbGRfdGFza3M7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRkX2luY29tcGxldGVfY2hpbGRfdGFza3M7CisKKyAgICAvKiBrbXBfdGhyZWFkX2RhdGFfdCAqLworICAgIGttcF9pbnQzMiAgICAgICAgICBoZF9zaXplb2Zfc3RydWN0OworICAgIG9mZnNldF9hbmRfc2l6ZV90ICBoZF9kZXF1ZTsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgaGRfZGVxdWVfaGVhZDsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgaGRfZGVxdWVfdGFpbDsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgaGRfZGVxdWVfbnRhc2tzOworICAgIG9mZnNldF9hbmRfc2l6ZV90ICBoZF9kZXF1ZV9sYXN0X3N0b2xlbjsKKworICAgIC8vIFRoZSBsYXN0IGZpZWxkIG9mIHN0YWJsZSB2ZXJzaW9uLgorICAgIGttcF91aW50NjQgICAgICAgICBsYXN0X2ZpZWxkOworICAgIC8vIEV4dGVuc2lvbnMuIAorICAgIC8vIFdoZW4gS01QX09NUF9WRVJTSU9OIGlzIGJ1bXBlZCwgbW92ZSB0aGVzZSBmaWVsZHMgdXAgdG8gYXBwcm9wcmlhdGUgbG9jYXRpb24sCisgICAgLy8gdG8gbGV0IGxhc3RfZmllbGQgYmUgYWN0dWFsbHkgbGFzdC4KKyAgICBhZGRyX2FuZF9zaXplX3QgICAgb3Blbm1wX3ZlcnNpb247CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRkX3Rhc2t3YWl0X2lkZW50OworICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0ZF90YXNrd2FpdF9jb3VudGVyOworICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0ZF90YXNrd2FpdF90aHJlYWQ7CisKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgbGtfbG9ja19mbGFnczsKKworfSBrbXBfb21wX3N0cnVjdF9pbmZvX3Q7CisKKworLyogZW5kIG9mIGZpbGUgKi8KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9vcy5oIGIvZmluYWwvcnVudGltZS9zcmMva21wX29zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM5ZDM2MgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9vcy5oCkBAIC0wLDAgKzEsODE3IEBACisvKgorICoga21wX29zLmggLS0gS1BUUyBydW50aW1lIGhlYWRlciBmaWxlLgorICogJFJldmlzaW9uOiA0MzQ3MyAkCisgKiAkRGF0ZTogMjAxNC0wOS0yNiAxNTowMjo1NyAtMDUwMCAoRnJpLCAyNiBTZXAgMjAxNCkgJAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIEtNUF9PU19ICisjZGVmaW5lIEtNUF9PU19ICisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2RlZmluZSBLTVBfRlROX1BMQUlOICAgMQorI2RlZmluZSBLTVBfRlROX0FQUEVORCAgMgorI2RlZmluZSBLTVBfRlROX1VQUEVSICAgMworLyoKKyNkZWZpbmUgS01QX0ZUTl9QUkVQRU5EIDQKKyNkZWZpbmUgS01QX0ZUTl9VQVBQRU5EIDUKKyovCisKKyNkZWZpbmUgS01QX1BUUl9TS0lQICAgIChzaXplb2Yodm9pZCopKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb21waWxlciB2YXJpYXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIEtNUF9PRkYJCQkJMAorI2RlZmluZSBLTVBfT04JCQkJMQorCisjZGVmaW5lIEtNUF9NRU1fQ09OU19WT0xBVElMRQkJMAorI2RlZmluZSBLTVBfTUVNX0NPTlNfRkVOQ0UJCTEKKworI2lmbmRlZiBLTVBfTUVNX0NPTlNfTU9ERUwKKyMgZGVmaW5lIEtNUF9NRU1fQ09OU19NT0RFTAkgS01QX01FTV9DT05TX1ZPTEFUSUxFCisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb21waWxlciByZWNvZ25pdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIEtNUF9DT01QSUxFUl9JQ0MgMAorI2RlZmluZSBLTVBfQ09NUElMRVJfR0NDIDAKKyNkZWZpbmUgS01QX0NPTVBJTEVSX0NMQU5HIDAKKyNkZWZpbmUgS01QX0NPTVBJTEVSX01TVkMgMAorCisjaWYgZGVmaW5lZCggX19JTlRFTF9DT01QSUxFUiApCisjIHVuZGVmIEtNUF9DT01QSUxFUl9JQ0MKKyMgZGVmaW5lIEtNUF9DT01QSUxFUl9JQ0MgMQorI2VsaWYgZGVmaW5lZCggX19jbGFuZ19fICkKKyMgdW5kZWYgS01QX0NPTVBJTEVSX0NMQU5HCisjIGRlZmluZSBLTVBfQ09NUElMRVJfQ0xBTkcgMQorI2VsaWYgZGVmaW5lZCggX19HTlVDX18gKQorIyB1bmRlZiBLTVBfQ09NUElMRVJfR0NDCisjIGRlZmluZSBLTVBfQ09NUElMRVJfR0NDIDEKKyNlbGlmIGRlZmluZWQoIF9NU0NfVkVSICkKKyMgdW5kZWYgS01QX0NPTVBJTEVSX01TVkMKKyMgZGVmaW5lIEtNUF9DT01QSUxFUl9NU1ZDIDEKKyNlbHNlCisjIGVycm9yIFVua25vd24gY29tcGlsZXIKKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE9wZXJhdGluZyBzeXN0ZW0gcmVjb2duaXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIEtNUF9PU19MSU5VWCAgICAwCisjZGVmaW5lIEtNUF9PU19GUkVFQlNEICAwCisjZGVmaW5lIEtNUF9PU19EQVJXSU4gICAwCisjZGVmaW5lIEtNUF9PU19XSU5ET1dTICAwCisjZGVmaW5lIEtNUF9PU19DTksgICAgICAwCisjZGVmaW5lIEtNUF9PU19VTklYICAgICAwICAvKiBkaXNqdW5jdGlvbiBvZiBLTVBfT1NfTElOVVgsIEtNUF9PU19EQVJXSU4gZXRjLiAqLworCisjZGVmaW5lIEtNUF9BUkNIX1g4NiAgICAgICAgMAorI2RlZmluZSBLTVBfQVJDSF9YODZfNjQgICAgIDAKKyNkZWZpbmUgS01QX0FSQ0hfUFBDNjQgICAgICAwCisjZGVmaW5lIEtNUF9BUkNIX0FBUkNINjQgICAgMAorCisjaWZkZWYgX1dJTjMyCisjIHVuZGVmIEtNUF9PU19XSU5ET1dTCisjIGRlZmluZSBLTVBfT1NfV0lORE9XUyAxCisjZW5kaWYKKworI2lmICggZGVmaW5lZCBfX0FQUExFX18gJiYgZGVmaW5lZCBfX01BQ0hfXyApCisjIHVuZGVmIEtNUF9PU19EQVJXSU4KKyMgZGVmaW5lIEtNUF9PU19EQVJXSU4gMQorI2VuZGlmCisKKy8vIGluIHNvbWUgcHBjNjQgbGludXggaW5zdGFsbGF0aW9ucywgb25seSB0aGUgc2Vjb25kIGNvbmRpdGlvbiBpcyBtZXQKKyNpZiAoIGRlZmluZWQgX19saW51eCApCisjIHVuZGVmIEtNUF9PU19MSU5VWAorIyBkZWZpbmUgS01QX09TX0xJTlVYIDEKKyNlbGlmICggZGVmaW5lZCBfX2xpbnV4X18pCisjIHVuZGVmIEtNUF9PU19MSU5VWAorIyBkZWZpbmUgS01QX09TX0xJTlVYIDEKKyNlbHNlCisjZW5kaWYKKworI2lmICggZGVmaW5lZCBfX0ZyZWVCU0RfXyApCisjIHVuZGVmIEtNUF9PU19GUkVFQlNECisjIGRlZmluZSBLTVBfT1NfRlJFRUJTRCAxCisjZW5kaWYKKworI2lmICggZGVmaW5lZCBfX2JncV9fICkKKyMgdW5kZWYgS01QX09TX0NOSworIyBkZWZpbmUgS01QX09TX0NOSyAxCisjZW5kaWYKKworI2lmICgxICE9IEtNUF9PU19MSU5VWCArIEtNUF9PU19GUkVFQlNEICsgS01QX09TX0RBUldJTiArIEtNUF9PU19XSU5ET1dTKQorIyBlcnJvciBVbmtub3duIE9TCisjZW5kaWYKKworI2lmIEtNUF9PU19MSU5VWCB8fCBLTVBfT1NfRlJFRUJTRCB8fCBLTVBfT1NfREFSV0lOCisjIHVuZGVmIEtNUF9PU19VTklYCisjIGRlZmluZSBLTVBfT1NfVU5JWCAxCisjZW5kaWYKKworI2lmIChLTVBfT1NfTElOVVggfHwgS01QX09TX1dJTkRPV1MpICYmICFLTVBfT1NfQ05LICYmICFLTVBfQVJDSF9QUEM2NAorIyBkZWZpbmUgS01QX0FGRklOSVRZX1NVUFBPUlRFRCAxCisjZWxzZQorIyBkZWZpbmUgS01QX0FGRklOSVRZX1NVUFBPUlRFRCAwCisjZW5kaWYKKworI2lmIEtNUF9PU19XSU5ET1dTCisjIGlmIGRlZmluZWQgX01fQU1ENjQKKyMgIHVuZGVmIEtNUF9BUkNIX1g4Nl82NAorIyAgZGVmaW5lIEtNUF9BUkNIX1g4Nl82NCAxCisjIGVsc2UKKyMgIHVuZGVmIEtNUF9BUkNIX1g4NgorIyAgZGVmaW5lIEtNUF9BUkNIX1g4NiAxCisjIGVuZGlmCisjZW5kaWYKKworI2lmIEtNUF9PU19VTklYCisjIGlmIGRlZmluZWQgX194ODZfNjQKKyMgIHVuZGVmIEtNUF9BUkNIX1g4Nl82NAorIyAgZGVmaW5lIEtNUF9BUkNIX1g4Nl82NCAxCisjIGVsaWYgZGVmaW5lZCBfX2kzODYKKyMgIHVuZGVmIEtNUF9BUkNIX1g4NgorIyAgZGVmaW5lIEtNUF9BUkNIX1g4NiAxCisjIGVsaWYgZGVmaW5lZCBfX3Bvd2VycGM2NF9fCisjICB1bmRlZiBLTVBfQVJDSF9QUEM2NAorIyAgZGVmaW5lIEtNUF9BUkNIX1BQQzY0IDEKKyMgZWxpZiBkZWZpbmVkIF9fYWFyY2g2NF9fICAgICAgICAgICAKKyMgIHVuZGVmIEtNUF9BUkNIX0FBUkNINjQgICAgICAgICAgCisjICBkZWZpbmUgS01QX0FSQ0hfQUFSQ0g2NCAxICAKKyMgZW5kaWYgICAgICAgIAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fQVJNX0FSQ0hfN19fKSAgIHx8IGRlZmluZWQoX19BUk1fQVJDSF83Ul9fKSAgfHwgXAorICAgIGRlZmluZWQoX19BUk1fQVJDSF83QV9fKQorIyBkZWZpbmUgS01QX0FSQ0hfQVJNVjcgMQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEtNUF9BUkNIX0FSTVY3KSAgIHx8IGRlZmluZWQoX19BUk1fQVJDSF82X18pICAgfHwgXAorICAgIGRlZmluZWQoX19BUk1fQVJDSF82Sl9fKSAgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzZLX18pICB8fCBcCisgICAgZGVmaW5lZChfX0FSTV9BUkNIXzZaX18pICB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfNlQyX18pIHx8IFwKKyAgICBkZWZpbmVkKF9fQVJNX0FSQ0hfNlpLX18pCisjIGRlZmluZSBLTVBfQVJDSF9BUk1WNiAxCisjZW5kaWYKKworI2lmIGRlZmluZWQoS01QX0FSQ0hfQVJNVjYpICAgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzVUX18pICB8fCBcCisgICAgZGVmaW5lZChfX0FSTV9BUkNIXzVFX18pICB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfNVRFX18pIHx8IFwKKyAgICBkZWZpbmVkKF9fQVJNX0FSQ0hfNVRFSl9fKQorIyBkZWZpbmUgS01QX0FSQ0hfQVJNVjUgMQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEtNUF9BUkNIX0FSTVY1KSAgIHx8IGRlZmluZWQoX19BUk1fQVJDSF80X18pICAgfHwgXAorICAgIGRlZmluZWQoX19BUk1fQVJDSF80VF9fKQorIyBkZWZpbmUgS01QX0FSQ0hfQVJNVjQgMQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEtNUF9BUkNIX0FSTVY0KSAgIHx8IGRlZmluZWQoX19BUk1fQVJDSF8zX18pICAgfHwgXAorICAgIGRlZmluZWQoX19BUk1fQVJDSF8zTV9fKQorIyBkZWZpbmUgS01QX0FSQ0hfQVJNVjMgMQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEtNUF9BUkNIX0FSTVYzKSAgIHx8IGRlZmluZWQoX19BUk1fQVJDSF8yX18pCisjIGRlZmluZSBLTVBfQVJDSF9BUk1WMiAxCisjZW5kaWYKKworI2lmIGRlZmluZWQoS01QX0FSQ0hfQVJNVjIpCisjIGRlZmluZSBLTVBfQVJDSF9BUk0gMQorI2VuZGlmCisKKy8vIFRPRE86IEZpeG1lIC0gVGhpcyBpcyBjbGV2ZXIsIGJ1dCByZWFsbHkgZnVnbHkgCisjaWYgKDEgIT0gS01QX0FSQ0hfWDg2ICsgS01QX0FSQ0hfWDg2XzY0ICsgS01QX0FSQ0hfQVJNICsgS01QX0FSQ0hfUFBDNjQgKyBLTVBfQVJDSF9BQVJDSDY0KQorIyBlcnJvciBVbmtub3duIG9yIHVuc3VwcG9ydGVkIGFyY2hpdGVjdHVyZQorI2VuZGlmCisKKy8qIENoZWNrIGZvciBxdWFkLXByZWNpc2lvbiBleHRlbnNpb24uICovCisjZGVmaW5lIEtNUF9IQVZFX1FVQUQgMAorI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKyMgaWYgS01QX0NPTVBJTEVSX0lDQworICAgLyogX1F1YWQgaXMgYWxyZWFkeSBkZWZpbmVkIGZvciBpY2MgKi8KKyMgIHVuZGVmICBLTVBfSEFWRV9RVUFECisjICBkZWZpbmUgS01QX0hBVkVfUVVBRCAxCisjIGVsaWYgS01QX0NPTVBJTEVSX0NMQU5HCisgICAvKiBDbGFuZyBkb2Vzbid0IHN1cHBvcnQgYSBzb2Z0d2FyZS1pbXBsZW1lbnRlZAorICAgICAgMTI4LWJpdCBleHRlbmRlZCBwcmVjaXNpb24gdHlwZSB5ZXQgKi8KKyAgIHR5cGVkZWYgbG9uZyBkb3VibGUgX1F1YWQ7CisjIGVsaWYgS01QX0NPTVBJTEVSX0dDQworICAgdHlwZWRlZiBfX2Zsb2F0MTI4IF9RdWFkOworIyAgdW5kZWYgIEtNUF9IQVZFX1FVQUQKKyMgIGRlZmluZSBLTVBfSEFWRV9RVUFEIDEKKyMgZWxpZiBLTVBfQ09NUElMRVJfTVNWQworICAgdHlwZWRlZiBsb25nIGRvdWJsZSBfUXVhZDsKKyMgZW5kaWYKKyNlbHNlCisjIGlmIF9fTERCTF9NQVhfRVhQX18gPj0gMTYzODQgJiYgS01QX0NPTVBJTEVSX0dDQworICAgdHlwZWRlZiBsb25nIGRvdWJsZSBfUXVhZDsKKyMgIHVuZGVmICBLTVBfSEFWRV9RVUFECisjICBkZWZpbmUgS01QX0hBVkVfUVVBRCAxCisjIGVuZGlmCisjZW5kaWYgLyogS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCAqLworCisjaWYgS01QX09TX1dJTkRPV1MKKyAgdHlwZWRlZiBjaGFyICAgICAgICAgICAgICBrbXBfaW50ODsKKyAgdHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgICBrbXBfdWludDg7CisgIHR5cGVkZWYgc2hvcnQgICAgICAgICAgICAga21wX2ludDE2OworICB0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICAgIGttcF91aW50MTY7CisgIHR5cGVkZWYgaW50ICAgICAgICAgICAgICAga21wX2ludDMyOworICB0eXBlZGVmIHVuc2lnbmVkIGludCAgICAgIGttcF91aW50MzI7CisjIGRlZmluZSBLTVBfSU5UMzJfU1BFQyAgICAgImQiCisjIGRlZmluZSBLTVBfVUlOVDMyX1NQRUMgICAgInUiCisjIGlmbmRlZiBLTVBfU1RSVUNUNjQKKyAgIHR5cGVkZWYgX19pbnQ2NCAJCWttcF9pbnQ2NDsKKyAgIHR5cGVkZWYgdW5zaWduZWQgX19pbnQ2NCAJa21wX3VpbnQ2NDsKKyAgICNkZWZpbmUgS01QX0lOVDY0X1NQRUMgCSJJNjRkIgorICAgI2RlZmluZSBLTVBfVUlOVDY0X1NQRUMJIkk2NHUiCisjIGVsc2UKKyAgIHN0cnVjdCBrbXBfc3RydWN0NjQgeworICAgIGttcF9pbnQzMiAgIGEsYjsKKyAgIH07CisgICB0eXBlZGVmIHN0cnVjdCBrbXBfc3RydWN0NjQga21wX2ludDY0OworICAgdHlwZWRlZiBzdHJ1Y3Qga21wX3N0cnVjdDY0IGttcF91aW50NjQ7CisgICAvKiBOb3Qgc3VyZSB3aGF0IHRvIHVzZSBmb3IgS01QX1tVXUlOVDY0X1NQRUMgaGVyZSAqLworIyBlbmRpZgorIyBpZiBLTVBfQVJDSF9YODZfNjQKKyMgIGRlZmluZSBLTVBfSU5UUFRSIDEKKyAgIHR5cGVkZWYgX19pbnQ2NCAgICAgICAgIAlrbXBfaW50cHRyX3Q7CisgICB0eXBlZGVmIHVuc2lnbmVkIF9faW50NjQJa21wX3VpbnRwdHJfdDsKKyMgIGRlZmluZSBLTVBfSU5UUFRSX1NQRUMgIAkiSTY0ZCIKKyMgIGRlZmluZSBLTVBfVUlOVFBUUl9TUEVDIAkiSTY0dSIKKyMgZW5kaWYKKyNlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAqLworCisjaWYgS01QX09TX1VOSVgKKyAgdHlwZWRlZiBjaGFyICAgICAgICAgICAgICAga21wX2ludDg7CisgIHR5cGVkZWYgdW5zaWduZWQgY2hhciAgICAgIGttcF91aW50ODsKKyAgdHlwZWRlZiBzaG9ydCAgICAgICAgICAgICAga21wX2ludDE2OworICB0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICAgICBrbXBfdWludDE2OworICB0eXBlZGVmIGludCAgICAgICAgICAgICAgICBrbXBfaW50MzI7CisgIHR5cGVkZWYgdW5zaWduZWQgaW50ICAgICAgIGttcF91aW50MzI7CisgIHR5cGVkZWYgbG9uZyBsb25nICAgICAgICAgIGttcF9pbnQ2NDsKKyAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcga21wX3VpbnQ2NDsKKyMgZGVmaW5lIEtNUF9JTlQzMl9TUEVDICAgICAgImQiCisjIGRlZmluZSBLTVBfVUlOVDMyX1NQRUMgICAgICJ1IgorIyBkZWZpbmUgS01QX0lOVDY0X1NQRUMJICAgICAibGxkIgorIyBkZWZpbmUgS01QX1VJTlQ2NF9TUEVDICAgICAibGx1IgorI2VuZGlmIC8qIEtNUF9PU19VTklYICovCisKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfQVJNCisjIGRlZmluZSBLTVBfU0laRV9UX1NQRUMgS01QX1VJTlQzMl9TUEVDCisjZWxpZiBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfUFBDNjQgfHwgS01QX0FSQ0hfQUFSQ0g2NAorIyBkZWZpbmUgS01QX1NJWkVfVF9TUEVDIEtNUF9VSU5UNjRfU1BFQworI2Vsc2UKKyMgZXJyb3IgIkNhbid0IGRldGVybWluZSBzaXplX3QgcHJpbnRmIGZvcm1hdCBzcGVjaWZpZXIuIgorI2VuZGlmCisKKyNpZiBLTVBfQVJDSF9YODYKKyMgZGVmaW5lIEtNUF9TSVpFX1RfTUFYICgweEZGRkZGRkZGKQorI2Vsc2UKKyMgZGVmaW5lIEtNUF9TSVpFX1RfTUFYICgweEZGRkZGRkZGRkZGRkZGRkYpCisjZW5kaWYKKwordHlwZWRlZiBzaXplX3QgIGttcF9zaXplX3Q7Cit0eXBlZGVmIGZsb2F0ICAga21wX3JlYWwzMjsKK3R5cGVkZWYgZG91YmxlICBrbXBfcmVhbDY0OworCisjaWZuZGVmIEtNUF9JTlRQVFIKKyMgZGVmaW5lIEtNUF9JTlRQVFIgMQorICB0eXBlZGVmIGxvbmcgICAgICAgICAgICAga21wX2ludHB0cl90OworICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgICAga21wX3VpbnRwdHJfdDsKKyMgZGVmaW5lIEtNUF9JTlRQVFJfU1BFQyAgICJsZCIKKyMgZGVmaW5lIEtNUF9VSU5UUFRSX1NQRUMgICJsdSIKKyNlbmRpZgorCisjaWZkZWYgS01QX0k4CisgIHR5cGVkZWYga21wX2ludDY0ICAgICAga21wX2ludDsKKyAgdHlwZWRlZiBrbXBfdWludDY0ICAgICBrbXBfdWludDsKKyMgZGVmaW5lICBLTVBfSU5UX1NQRUMJIEtNUF9JTlQ2NF9TUEVDCisjIGRlZmluZSAgS01QX1VJTlRfU1BFQwkgS01QX1VJTlQ2NF9TUEVDCisjIGRlZmluZSAgS01QX0lOVF9NQVggICAgKChrbXBfaW50NjQpMHg3RkZGRkZGRkZGRkZGRkZGTEwpCisjIGRlZmluZSAgS01QX0lOVF9NSU4gICAgKChrbXBfaW50NjQpMHg4MDAwMDAwMDAwMDAwMDAwTEwpCisjZWxzZQorICB0eXBlZGVmIGttcF9pbnQzMiAgICAgIGttcF9pbnQ7CisgIHR5cGVkZWYga21wX3VpbnQzMiAgICAga21wX3VpbnQ7CisjIGRlZmluZSAgS01QX0lOVF9TUEVDCSBLTVBfSU5UMzJfU1BFQworIyBkZWZpbmUgIEtNUF9VSU5UX1NQRUMJIEtNUF9VSU5UMzJfU1BFQworIyBkZWZpbmUgIEtNUF9JTlRfTUFYICAgICgoa21wX2ludDMyKTB4N0ZGRkZGRkYpCisjIGRlZmluZSAgS01QX0lOVF9NSU4gICAgKChrbXBfaW50MzIpMHg4MDAwMDAwMCkKKyNlbmRpZiAvKiBLTVBfSTggKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gdGVtcGxhdGUgZm9yIGRlYnVnIHByaW50cyBzcGVjaWZpY2F0aW9uICggZCwgdSwgbGxkLCBsbHUgKSwgYW5kIHRvIG9idGFpbgorICAgIC8vIHNpZ25lZC91bnNpZ25lZCBmbGF2b3JzIG9mIGEgdHlwZQorICAgIHRlbXBsYXRlPCB0eXBlbmFtZSBUID4KKyAgICBzdHJ1Y3QgdHJhaXRzX3QgeworICAgICAgICB0eXBlZGVmIFQgICAgICAgICAgIHNpZ25lZF90OworICAgICAgICB0eXBlZGVmIFQgICAgICAgICAgIHVuc2lnbmVkX3Q7CisgICAgICAgIHR5cGVkZWYgVCAgICAgICAgICAgZmxvYXRpbmdfdDsKKyAgICAgICAgc3RhdGljIGNoYXIgY29uc3QgKiBzcGVjOworICAgIH07CisgICAgLy8gaW50CisgICAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCB0cmFpdHNfdDwgc2lnbmVkIGludCA+IHsKKyAgICAgICAgdHlwZWRlZiBzaWduZWQgaW50ICAgIHNpZ25lZF90OworICAgICAgICB0eXBlZGVmIHVuc2lnbmVkIGludCAgdW5zaWduZWRfdDsKKyAgICAgICAgdHlwZWRlZiBkb3VibGUgICAgICAgIGZsb2F0aW5nX3Q7CisgICAgICAgIHN0YXRpYyBjaGFyIGNvbnN0ICogICBzcGVjOworICAgIH07CisgICAgLy8gdW5zaWduZWQgaW50CisgICAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCB0cmFpdHNfdDwgdW5zaWduZWQgaW50ID4geworICAgICAgICB0eXBlZGVmIHNpZ25lZCBpbnQgICAgc2lnbmVkX3Q7CisgICAgICAgIHR5cGVkZWYgdW5zaWduZWQgaW50ICB1bnNpZ25lZF90OworICAgICAgICB0eXBlZGVmIGRvdWJsZSAgICAgICAgZmxvYXRpbmdfdDsKKyAgICAgICAgc3RhdGljIGNoYXIgY29uc3QgKiAgIHNwZWM7CisgICAgfTsKKyAgICAvLyBsb25nIGxvbmcKKyAgICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IHRyYWl0c190PCBzaWduZWQgbG9uZyBsb25nID4geworICAgICAgICB0eXBlZGVmIHNpZ25lZCBsb25nIGxvbmcgICAgc2lnbmVkX3Q7CisgICAgICAgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nICB1bnNpZ25lZF90OworICAgICAgICB0eXBlZGVmIGxvbmcgZG91YmxlICAgICAgICAgZmxvYXRpbmdfdDsKKyAgICAgICAgc3RhdGljIGNoYXIgY29uc3QgKiAgICAgICAgIHNwZWM7CisgICAgfTsKKyAgICAvLyB1bnNpZ25lZCBsb25nIGxvbmcKKyAgICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IHRyYWl0c190PCB1bnNpZ25lZCBsb25nIGxvbmcgPiB7CisgICAgICAgIHR5cGVkZWYgc2lnbmVkIGxvbmcgbG9uZyAgICBzaWduZWRfdDsKKyAgICAgICAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgIHVuc2lnbmVkX3Q7CisgICAgICAgIHR5cGVkZWYgbG9uZyBkb3VibGUgICAgICAgICBmbG9hdGluZ190OworICAgICAgICBzdGF0aWMgY2hhciBjb25zdCAqICAgICAgICAgc3BlYzsKKyAgICB9OworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2VuZGlmIC8vIF9fY3BsdXNwbHVzCisKKyNkZWZpbmUgS01QX0VYUE9SVAlleHRlcm4JLyogZXhwb3J0IGRlY2xhcmF0aW9uIGluIGd1aWRlIGxpYnJhcmllcyAqLworCisjaWYgX19HTlVDX18gPT0gNAorICAgICNkZWZpbmUgX19mb3JjZWlubGluZSBfX2lubGluZQorI2VuZGlmCisKKyNkZWZpbmUgUEFHRV9TSVpFICAgICAgICAgICAgICAgICAgICAgICAoMHg0MDAwKQorI2RlZmluZSBQQUdFX0FMSUdORUQoX2FkZHIpICAgICAoICEgKChzaXplX3QpIF9hZGRyICYgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplX3QpKFBBR0VfU0laRSAtIDEpKSkKKyNkZWZpbmUgQUxJR05fVE9fUEFHRSh4KSAgICh2b2lkICopKCgoc2l6ZV90KSh4KSkgJiB+KChzaXplX3QpKFBBR0VfU0laRSAtIDEpKSkKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTdXBwb3J0IGZvciBjYWNoZSBhbGlnbm1lbnQsIHBhZGRpbmcsIGV0Yy4gLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8vIF9fY3BsdXNwbHVzCisKKyNkZWZpbmUgSU5URVJOT0RFX0NBQ0hFX0xJTkUgNDA5NiAvKiBmb3IgbXVsdGktbm9kZSBzeXN0ZW1zICovCisKKy8qIERlZmluZSB0aGUgZGVmYXVsdCBzaXplIG9mIHRoZSBjYWNoZSBsaW5lICovCisjaWZuZGVmIENBQ0hFX0xJTkUKKyAgICAjZGVmaW5lIENBQ0hFX0xJTkUgICAgICAgICAgICAgICAgICAxMjggICAgICAgICAvKiBjYWNoZSBsaW5lIHNpemUgaW4gYnl0ZXMgKi8KKyNlbHNlCisgICAgI2lmICggQ0FDSEVfTElORSA8IDY0ICkgJiYgISBkZWZpbmVkKCBLTVBfT1NfREFSV0lOICkKKyAgICAgICAgLy8gMjAwNi0wMi0xMzogVGhpcyBwcm9kdWNlcyB0b28gbWFueSB3YXJuaW5ncyBvbiBPUyBYKi4gRGlzYWJsZSBpdCBmb3IgYSB3aGlsZS4uLgorICAgICAgICAjd2FybmluZyBDQUNIRV9MSU5FIGlzIHRvbyBzbWFsbC4KKyAgICAjZW5kaWYKKyNlbmRpZiAvKiBDQUNIRV9MSU5FICovCisKKyNkZWZpbmUgS01QX0NBQ0hFX1BSRUZFVENIKEFERFIpIAkvKiBub3RoaW5nICovCisKKy8qIFRlbXBvcmFyeSBub3RlOiBpZiBwZXJmb3JtYW5jZSB0ZXN0aW5nIG9mIHRoaXMgcGFzc2VzLCB3ZSBjYW4gcmVtb3ZlCisgICBhbGwgcmVmZXJlbmNlcyB0byBLTVBfRE9fQUxJR04gYW5kIHJlcGxhY2Ugd2l0aCBLTVBfQUxJR04uICAqLworI2lmIEtNUF9PU19VTklYICYmIGRlZmluZWQoX19HTlVDX18pCisjIGRlZmluZSBLTVBfRE9fQUxJR04oYnl0ZXMpICBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKGJ5dGVzKSkpCisjIGRlZmluZSBLTVBfQUxJR05fQ0FDSEUgICAgICBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKENBQ0hFX0xJTkUpKSkKKyMgZGVmaW5lIEtNUF9BTElHTl9DQUNIRV9JTlRFUk5PREUgX19hdHRyaWJ1dGVfXygoYWxpZ25lZChJTlRFUk5PREVfQ0FDSEVfTElORSkpKQorIyBkZWZpbmUgS01QX0FMSUdOKGJ5dGVzKSAgICAgX19hdHRyaWJ1dGVfXygoYWxpZ25lZChieXRlcykpKQorI2Vsc2UKKyMgZGVmaW5lIEtNUF9ET19BTElHTihieXRlcykgIF9fZGVjbHNwZWMoIGFsaWduKGJ5dGVzKSApCisjIGRlZmluZSBLTVBfQUxJR05fQ0FDSEUgICAgICBfX2RlY2xzcGVjKCBhbGlnbihDQUNIRV9MSU5FKSApCisjIGRlZmluZSBLTVBfQUxJR05fQ0FDSEVfSU5URVJOT0RFICAgICAgX19kZWNsc3BlYyggYWxpZ24oSU5URVJOT0RFX0NBQ0hFX0xJTkUpICkKKyMgZGVmaW5lIEtNUF9BTElHTihieXRlcykgICAgIF9fZGVjbHNwZWMoIGFsaWduKGJ5dGVzKSApCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19NSUNfXykgfHwgZGVmaW5lZChfX01JQzJfXykKKyAgICAjZGVmaW5lIEtNUF9NSUMgIDEKKy8vIEludGVsKFIpIENvbXBvc2VyIFhFICgxMy4wKSBkZWZpbmVzIGJvdGggX19NSUNfXyBhbmQgX19NSUMyX18gIQorIyBpZiBfX01JQzJfXyB8fCBfX0tOQ19fCisgICAgI2RlZmluZSBLTVBfTUlDMSAwCisgICAgI2RlZmluZSBLTVBfTUlDMiAxCisjIGVsc2UKKyAgICAjZGVmaW5lIEtNUF9NSUMxIDEKKyAgICAjZGVmaW5lIEtNUF9NSUMyIDAKKyMgZW5kaWYKKyNlbHNlCisgICAgI2RlZmluZSBLTVBfTUlDICAwCisgICAgI2RlZmluZSBLTVBfTUlDMSAwCisgICAgI2RlZmluZSBLTVBfTUlDMiAwCisjZW5kaWYKKworLyogR2VuZXJhbCBwdXJwb3NlIGZlbmNlIHR5cGVzIGZvciBtZW1vcnkgb3BlcmF0aW9ucyAqLworZW51bSBrbXBfbWVtX2ZlbmNlX3R5cGUgeworICAgIGttcF9ub19mZW5jZSwgICAgICAgICAvKiBObyBtZW1vcnkgZmVuY2UgKi8KKyAgICBrbXBfYWNxdWlyZV9mZW5jZSwgICAgLyogQWNxdWlyZSAocmVhZCkgbWVtb3J5IGZlbmNlICovCisgICAga21wX3JlbGVhc2VfZmVuY2UsICAgIC8qIFJlbGVhc2UgKHdyaXRlKSBtZW1vcnkgZmVuY2UgKi8KKyAgICBrbXBfZnVsbF9mZW5jZSAgICAgICAgLyogRnVsbCAocmVhZCt3cml0ZSkgbWVtb3J5IGZlbmNlICovCit9OworCisKKy8vCisvLyBTeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlcworLy8KKworI2lmIEtNUF9BU01fSU5UUklOUyAmJiBLTVBfT1NfV0lORE9XUworCisjaW5jbHVkZSA8V2luZG93cy5oPgorCisjcHJhZ21hIGludHJpbnNpYyhJbnRlcmxvY2tlZEV4Y2hhbmdlQWRkKQorI3ByYWdtYSBpbnRyaW5zaWMoSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2UpCisjcHJhZ21hIGludHJpbnNpYyhJbnRlcmxvY2tlZEV4Y2hhbmdlKQorI3ByYWdtYSBpbnRyaW5zaWMoSW50ZXJsb2NrZWRFeGNoYW5nZTY0KQorCisvLworLy8gVXNpbmcgSW50ZXJsb2NrZWRJbmNyZW1lbnQgLyBJbnRlcmxvY2tlZERlY3JlbWVudCBjYXVzZXMgYSBsaWJyYXJ5IGxvYWRpbmcKKy8vIG9yZGVyaW5nIHByb2JsZW0sIHNvIHdlIHVzZSBJbnRlcmxvY2tlZEV4Y2hhbmdlQWRkIGluc3RlYWQuCisvLworIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9JTkMzMihwKSAgICAgICAgICAgICAgICAgSW50ZXJsb2NrZWRFeGNoYW5nZUFkZCggKHZvbGF0aWxlIGxvbmcgKikocCksIDEgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9JTkNfQUNRMzIocCkgICAgICAgICAgICAgSW50ZXJsb2NrZWRFeGNoYW5nZUFkZCggKHZvbGF0aWxlIGxvbmcgKikocCksIDEgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9BREQ0XzMyKHApICAgICAgICAgICAgICAgSW50ZXJsb2NrZWRFeGNoYW5nZUFkZCggKHZvbGF0aWxlIGxvbmcgKikocCksIDQgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9BREQ0X0FDUTMyKHApICAgICAgICAgICAgSW50ZXJsb2NrZWRFeGNoYW5nZUFkZCggKHZvbGF0aWxlIGxvbmcgKikocCksIDQgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9ERUMzMihwKSAgICAgICAgICAgICAgICAgSW50ZXJsb2NrZWRFeGNoYW5nZUFkZCggKHZvbGF0aWxlIGxvbmcgKikocCksIC0xICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fREVDX0FDUTMyKHApICAgICAgICAgICAgIEludGVybG9ja2VkRXhjaGFuZ2VBZGQoICh2b2xhdGlsZSBsb25nICopKHApLCAtMSApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0FERDMyKHAsIHYpICAgICAgICAgICAgICBJbnRlcmxvY2tlZEV4Y2hhbmdlQWRkKCAodm9sYXRpbGUgbG9uZyAqKShwKSwgKHYpICkKKworIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFVDMyKHAsIGN2LCBzdikgSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2UoICh2b2xhdGlsZSBsb25nICopKHApLChsb25nKShzdiksKGxvbmcpKGN2KSApCisKKyMgZGVmaW5lIEtNUF9YQ0hHX0ZJWEVEMzIocCwgdikgICAgICAgICAgICAgICAgIEludGVybG9ja2VkRXhjaGFuZ2UoICh2b2xhdGlsZSBsb25nICopKHApLCAobG9uZykodikgKQorIyBkZWZpbmUgS01QX1hDSEdfRklYRUQ2NChwLCB2KSAgICAgICAgICAgICAgICAgSW50ZXJsb2NrZWRFeGNoYW5nZTY0KCAodm9sYXRpbGUga21wX2ludDY0ICopKHApLCAoa21wX2ludDY0KSh2KSApCisKK2lubGluZSBrbXBfcmVhbDMyIEtNUF9YQ0hHX1JFQUwzMiggdm9sYXRpbGUga21wX3JlYWwzMiAqcCwga21wX3JlYWwzMiB2KQoreworICAgIGttcF9pbnQzMiB0bXAgPSBJbnRlcmxvY2tlZEV4Y2hhbmdlKCAodm9sYXRpbGUgbG9uZyAqKXAsICoobG9uZyAqKSZ2KTsKKyAgICByZXR1cm4gKihrbXBfcmVhbDMyKikmdG1wOworfQorCisvLworLy8gUm91dGluZXMgdGhhdCB3ZSBzdGlsbCBuZWVkIHRvIGltcGxlbWVudCBpbiBhc3NlbWJseS4KKy8vCitleHRlcm4ga21wX2ludDMyIF9fa21wX3Rlc3RfdGhlbl9hZGQzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgdiApOworZXh0ZXJuIGttcF9pbnQzMiBfX2ttcF90ZXN0X3RoZW5fb3IzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgdiApOworZXh0ZXJuIGttcF9pbnQzMiBfX2ttcF90ZXN0X3RoZW5fYW5kMzIoIHZvbGF0aWxlIGttcF9pbnQzMiAqcCwga21wX2ludDMyIHYgKTsKK2V4dGVybiBrbXBfaW50NjQgX19rbXBfdGVzdF90aGVuX2FkZDY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCB2ICk7CitleHRlcm4ga21wX2ludDY0IF9fa21wX3Rlc3RfdGhlbl9vcjY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCB2ICk7CitleHRlcm4ga21wX2ludDY0IF9fa21wX3Rlc3RfdGhlbl9hbmQ2NCggdm9sYXRpbGUga21wX2ludDY0ICpwLCBrbXBfaW50NjQgdiApOworCitleHRlcm4ga21wX2ludDggX19rbXBfY29tcGFyZV9hbmRfc3RvcmU4KCB2b2xhdGlsZSBrbXBfaW50OCAqcCwga21wX2ludDggY3YsIGttcF9pbnQ4IHN2ICk7CitleHRlcm4ga21wX2ludDE2IF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMTYoIHZvbGF0aWxlIGttcF9pbnQxNiAqcCwga21wX2ludDE2IGN2LCBrbXBfaW50MTYgc3YgKTsKK2V4dGVybiBrbXBfaW50MzIgX19rbXBfY29tcGFyZV9hbmRfc3RvcmUzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgY3YsIGttcF9pbnQzMiBzdiApOworZXh0ZXJuIGttcF9pbnQzMiBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCBjdiwga21wX2ludDY0IHN2ICk7CitleHRlcm4ga21wX2ludDggIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDgoICB2b2xhdGlsZSBrbXBfaW50OCAgKnAsIGttcF9pbnQ4ICBjdiwga21wX2ludDggIHN2ICk7CitleHRlcm4ga21wX2ludDE2IF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDE2KCB2b2xhdGlsZSBrbXBfaW50MTYgKnAsIGttcF9pbnQxNiBjdiwga21wX2ludDE2IHN2ICk7CitleHRlcm4ga21wX2ludDMyIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiBjdiwga21wX2ludDMyIHN2ICk7CitleHRlcm4ga21wX2ludDY0IF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCBjdiwga21wX2ludDY0IHN2ICk7CisKK2V4dGVybiBrbXBfaW50OCAgX19rbXBfeGNoZ19maXhlZDgoIHZvbGF0aWxlIGttcF9pbnQ4ICAqcCwga21wX2ludDggIHYgKTsKK2V4dGVybiBrbXBfaW50MTYgX19rbXBfeGNoZ19maXhlZDE2KCB2b2xhdGlsZSBrbXBfaW50MTYgKnAsIGttcF9pbnQxNiB2ICk7CitleHRlcm4ga21wX2ludDMyIF9fa21wX3hjaGdfZml4ZWQzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgdiApOworZXh0ZXJuIGttcF9pbnQ2NCBfX2ttcF94Y2hnX2ZpeGVkNjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IHYgKTsKK2V4dGVybiBrbXBfcmVhbDMyIF9fa21wX3hjaGdfcmVhbDMyKCB2b2xhdGlsZSBrbXBfcmVhbDMyICpwLCBrbXBfcmVhbDMyIHYgKTsKK2V4dGVybiBrbXBfcmVhbDY0IF9fa21wX3hjaGdfcmVhbDY0KCB2b2xhdGlsZSBrbXBfcmVhbDY0ICpwLCBrbXBfcmVhbDY0IHYgKTsKKworLy8jIGRlZmluZSBLTVBfVEVTVF9USEVOX0lOQzMyKHApICAgICAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYWRkMzIoIChwKSwgMSApCisvLyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fSU5DX0FDUTMyKHApICAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9hZGQzMiggKHApLCAxICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fSU5DNjQocCkgICAgICAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9hZGQ2NCggKHApLCAxTEwgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9JTkNfQUNRNjQocCkgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX2FkZDY0KCAocCksIDFMTCApCisvLyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fQURENF8zMihwKSAgICAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9hZGQzMiggKHApLCA0ICkKKy8vIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9BREQ0X0FDUTMyKHApICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX2FkZDMyKCAocCksIDQgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9BREQ0XzY0KHApICAgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX2FkZDY0KCAocCksIDRMTCApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0FERDRfQUNRNjQocCkgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYWRkNjQoIChwKSwgNExMICkKKy8vIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9ERUMzMihwKSAgICAgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX2FkZDMyKCAocCksIC0xICkKKy8vIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9ERUNfQUNRMzIocCkgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX2FkZDMyKCAocCksIC0xICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fREVDNjQocCkgICAgICAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9hZGQ2NCggKHApLCAtMUxMICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fREVDX0FDUTY0KHApICAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9hZGQ2NCggKHApLCAtMUxMICkKKy8vIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9BREQzMihwLCB2KSAgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX2FkZDMyKCAocCksICh2KSApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0FERDY0KHAsIHYpICAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYWRkNjQoIChwKSwgKHYpICkKKworIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9PUjMyKHAsIHYpICAgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX29yMzIoIChwKSwgKHYpICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fQU5EMzIocCwgdikgICAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9hbmQzMiggKHApLCAodikgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9PUjY0KHAsIHYpICAgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX29yNjQoIChwKSwgKHYpICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fQU5ENjQocCwgdikgICAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9hbmQ2NCggKHApLCAodikgKQorCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNROChwLCBjdiwgc3YpICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTgoIChwKSwgKGN2KSwgKHN2KSApCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVMOChwLCBjdiwgc3YpICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTgoIChwKSwgKGN2KSwgKHN2KSApCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRMTYocCwgY3YsIHN2KSBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTE2KCAocCksIChjdiksIChzdikgKQorIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFTDE2KHAsIGN2LCBzdikgX19rbXBfY29tcGFyZV9hbmRfc3RvcmUxNiggKHApLCAoY3YpLCAoc3YpICkKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EzMihwLCBjdiwgc3YpIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMzIoIChwKSwgKGN2KSwgKHN2KSApCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVMMzIocCwgY3YsIHN2KSBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTMyKCAocCksIChjdiksIChzdikgKQorIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTY0KHAsIGN2LCBzdikgX19rbXBfY29tcGFyZV9hbmRfc3RvcmU2NCggKHApLCAoY3YpLCAoc3YpICkKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRUw2NChwLCBjdiwgc3YpIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQoIChwKSwgKGN2KSwgKHN2KSApCisKKyMgaWYgS01QX0FSQ0hfWDg2CisjICBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1BUUihwLCBjdiwgc3YpICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTMyKCAodm9sYXRpbGUga21wX2ludDMyKikocCksIChrbXBfaW50MzIpKGN2KSwgKGttcF9pbnQzMikoc3YpICkKKyMgZWxzZSAvKiA2NCBiaXQgcG9pbnRlcnMgKi8KKyMgIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUFRSKHAsIGN2LCBzdikgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQoICh2b2xhdGlsZSBrbXBfaW50NjQqKShwKSwgKGttcF9pbnQ2NCkoY3YpLCAoa21wX2ludDY0KShzdikgKQorIyBlbmRpZiAvKiBLTVBfQVJDSF9YODYgKi8KKworIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFVDgocCwgY3YsIHN2KSAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0OCggKHApLCAoY3YpLCAoc3YpICkKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRVQxNihwLCBjdiwgc3YpIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDE2KCAocCksIChjdiksIChzdikgKQorLy8jIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVUMzIocCwgY3YsIHN2KSBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQzMiggKHApLCAoY3YpLCAoc3YpICkKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRVQ2NChwLCBjdiwgc3YpIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDY0KCAocCksIChjdiksIChzdikgKQorCisjIGRlZmluZSBLTVBfWENIR19GSVhFRDgocCwgdikgICAgICAgICAgICAgICAgICBfX2ttcF94Y2hnX2ZpeGVkOCggKHApLCAodikgKTsKKyMgZGVmaW5lIEtNUF9YQ0hHX0ZJWEVEMTYocCwgdikgICAgICAgICAgICAgICAgIF9fa21wX3hjaGdfZml4ZWQxNiggKHApLCAodikgKTsKKy8vIyBkZWZpbmUgS01QX1hDSEdfRklYRUQzMihwLCB2KSAgICAgICAgICAgICAgICAgX19rbXBfeGNoZ19maXhlZDMyKCAocCksICh2KSApOworLy8jIGRlZmluZSBLTVBfWENIR19GSVhFRDY0KHAsIHYpICAgICAgICAgICAgICAgICBfX2ttcF94Y2hnX2ZpeGVkNjQoIChwKSwgKHYpICk7CisvLyMgZGVmaW5lIEtNUF9YQ0hHX1JFQUwzMihwLCB2KSAgICAgICAgICAgICAgICAgIF9fa21wX3hjaGdfcmVhbDMyKCAocCksICh2KSApOworIyBkZWZpbmUgS01QX1hDSEdfUkVBTDY0KHAsIHYpICAgICAgICAgICAgICAgICAgX19rbXBfeGNoZ19yZWFsNjQoIChwKSwgKHYpICk7CisKKworI2VsaWYgKEtNUF9BU01fSU5UUklOUyAmJiBLTVBfT1NfVU5JWCkgfHwgIShLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0KQorCisvKiBjYXN0IHAgdG8gY29ycmVjdCB0eXBlIHNvIHRoYXQgcHJvcGVyIGludHJpbnNpYyB3aWxsIGJlIHVzZWQgKi8KKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fSU5DMzIocCkgICAgICAgICAgICAgICAgIF9fc3luY19mZXRjaF9hbmRfYWRkKCAoa21wX2ludDMyICopKHApLCAxICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fSU5DX0FDUTMyKHApICAgICAgICAgICAgIF9fc3luY19mZXRjaF9hbmRfYWRkKCAoa21wX2ludDMyICopKHApLCAxICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fSU5DNjQocCkgICAgICAgICAgICAgICAgIF9fc3luY19mZXRjaF9hbmRfYWRkKCAoa21wX2ludDY0ICopKHApLCAxTEwgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9JTkNfQUNRNjQocCkgICAgICAgICAgICAgX19zeW5jX2ZldGNoX2FuZF9hZGQoIChrbXBfaW50NjQgKikocCksIDFMTCApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0FERDRfMzIocCkgICAgICAgICAgICAgICBfX3N5bmNfZmV0Y2hfYW5kX2FkZCggKGttcF9pbnQzMiAqKShwKSwgNCApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0FERDRfQUNRMzIocCkgICAgICAgICAgICBfX3N5bmNfZmV0Y2hfYW5kX2FkZCggKGttcF9pbnQzMiAqKShwKSwgNCApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0FERDRfNjQocCkgICAgICAgICAgICAgICBfX3N5bmNfZmV0Y2hfYW5kX2FkZCggKGttcF9pbnQ2NCAqKShwKSwgNExMICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fQURENF9BQ1E2NChwKSAgICAgICAgICAgIF9fc3luY19mZXRjaF9hbmRfYWRkKCAoa21wX2ludDY0ICopKHApLCA0TEwgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9ERUMzMihwKSAgICAgICAgICAgICAgICAgX19zeW5jX2ZldGNoX2FuZF9zdWIoIChrbXBfaW50MzIgKikocCksIDEgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9ERUNfQUNRMzIocCkgICAgICAgICAgICAgX19zeW5jX2ZldGNoX2FuZF9zdWIoIChrbXBfaW50MzIgKikocCksIDEgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9ERUM2NChwKSAgICAgICAgICAgICAgICAgX19zeW5jX2ZldGNoX2FuZF9zdWIoIChrbXBfaW50NjQgKikocCksIDFMTCApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0RFQ19BQ1E2NChwKSAgICAgICAgICAgICBfX3N5bmNfZmV0Y2hfYW5kX3N1YiggKGttcF9pbnQ2NCAqKShwKSwgMUxMICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fQUREMzIocCwgdikgICAgICAgICAgICAgIF9fc3luY19mZXRjaF9hbmRfYWRkKCAoa21wX2ludDMyICopKHApLCAodikgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9BREQ2NChwLCB2KSAgICAgICAgICAgICAgX19zeW5jX2ZldGNoX2FuZF9hZGQoIChrbXBfaW50NjQgKikocCksICh2KSApCisKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fT1IzMihwLCB2KSAgICAgICAgICAgICAgIF9fc3luY19mZXRjaF9hbmRfb3IoIChrbXBfaW50MzIgKikocCksICh2KSApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0FORDMyKHAsIHYpICAgICAgICAgICAgICBfX3N5bmNfZmV0Y2hfYW5kX2FuZCggKGttcF9pbnQzMiAqKShwKSwgKHYpICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fT1I2NChwLCB2KSAgICAgICAgICAgICAgIF9fc3luY19mZXRjaF9hbmRfb3IoIChrbXBfaW50NjQgKikocCksICh2KSApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0FORDY0KHAsIHYpICAgICAgICAgICAgICBfX3N5bmNfZmV0Y2hfYW5kX2FuZCggKGttcF9pbnQ2NCAqKShwKSwgKHYpICkKKworIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTgocCwgY3YsIHN2KSAgX19zeW5jX2Jvb2xfY29tcGFyZV9hbmRfc3dhcCggKHZvbGF0aWxlIGttcF91aW50OCAqKShwKSwoa21wX3VpbnQ4KShjdiksKGttcF91aW50OCkoc3YpICkKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRUw4KHAsIGN2LCBzdikgIF9fc3luY19ib29sX2NvbXBhcmVfYW5kX3N3YXAoICh2b2xhdGlsZSBrbXBfdWludDggKikocCksKGttcF91aW50OCkoY3YpLChrbXBfdWludDgpKHN2KSApCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRMTYocCwgY3YsIHN2KSBfX3N5bmNfYm9vbF9jb21wYXJlX2FuZF9zd2FwKCAodm9sYXRpbGUga21wX3VpbnQxNiAqKShwKSwoa21wX3VpbnQxNikoY3YpLChrbXBfdWludDE2KShzdikgKQorIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFTDE2KHAsIGN2LCBzdikgX19zeW5jX2Jvb2xfY29tcGFyZV9hbmRfc3dhcCggKHZvbGF0aWxlIGttcF91aW50MTYgKikocCksKGttcF91aW50MTYpKGN2KSwoa21wX3VpbnQxNikoc3YpICkKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EzMihwLCBjdiwgc3YpIF9fc3luY19ib29sX2NvbXBhcmVfYW5kX3N3YXAoICh2b2xhdGlsZSBrbXBfdWludDMyICopKHApLChrbXBfdWludDMyKShjdiksKGttcF91aW50MzIpKHN2KSApCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVMMzIocCwgY3YsIHN2KSBfX3N5bmNfYm9vbF9jb21wYXJlX2FuZF9zd2FwKCAodm9sYXRpbGUga21wX3VpbnQzMiAqKShwKSwoa21wX3VpbnQzMikoY3YpLChrbXBfdWludDMyKShzdikgKQorIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTY0KHAsIGN2LCBzdikgX19zeW5jX2Jvb2xfY29tcGFyZV9hbmRfc3dhcCggKHZvbGF0aWxlIGttcF91aW50NjQgKikocCksKGttcF91aW50NjQpKGN2KSwoa21wX3VpbnQ2NCkoc3YpICkKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRUw2NChwLCBjdiwgc3YpIF9fc3luY19ib29sX2NvbXBhcmVfYW5kX3N3YXAoICh2b2xhdGlsZSBrbXBfdWludDY0ICopKHApLChrbXBfdWludDY0KShjdiksKGttcF91aW50NjQpKHN2KSApCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUFRSKHAsIGN2LCBzdikgICBfX3N5bmNfYm9vbF9jb21wYXJlX2FuZF9zd2FwKCAodm9sYXRpbGUgdm9pZCAqKikocCksKHZvaWQgKikoY3YpLCh2b2lkICopKHN2KSApCisKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRVQ4KHAsIGN2LCBzdikgIF9fc3luY192YWxfY29tcGFyZV9hbmRfc3dhcCggKHZvbGF0aWxlIGttcF91aW50OCAqKShwKSwoa21wX3VpbnQ4KShjdiksKGttcF91aW50OCkoc3YpICkKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRVQxNihwLCBjdiwgc3YpIF9fc3luY192YWxfY29tcGFyZV9hbmRfc3dhcCggKHZvbGF0aWxlIGttcF91aW50MTYgKikocCksKGttcF91aW50MTYpKGN2KSwoa21wX3VpbnQxNikoc3YpICkKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRVQzMihwLCBjdiwgc3YpIF9fc3luY192YWxfY29tcGFyZV9hbmRfc3dhcCggKHZvbGF0aWxlIGttcF91aW50MzIgKikocCksKGttcF91aW50MzIpKGN2KSwoa21wX3VpbnQzMikoc3YpICkKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRVQ2NChwLCBjdiwgc3YpIF9fc3luY192YWxfY29tcGFyZV9hbmRfc3dhcCggKHZvbGF0aWxlIGttcF91aW50NjQgKikocCksKGttcF91aW50NjQpKGN2KSwoa21wX3VpbnQ2NCkoc3YpICkKKworI2RlZmluZSBLTVBfWENIR19GSVhFRDgocCwgdikgICAgICAgICAgICAgICAgICAgX19zeW5jX2xvY2tfdGVzdF9hbmRfc2V0KCAodm9sYXRpbGUga21wX3VpbnQ4ICopKHApLCAoa21wX3VpbnQ4KSh2KSApCisjZGVmaW5lIEtNUF9YQ0hHX0ZJWEVEMTYocCwgdikgICAgICAgICAgICAgICAgICBfX3N5bmNfbG9ja190ZXN0X2FuZF9zZXQoICh2b2xhdGlsZSBrbXBfdWludDE2ICopKHApLCAoa21wX3VpbnQxNikodikgKQorI2RlZmluZSBLTVBfWENIR19GSVhFRDMyKHAsIHYpICAgICAgICAgICAgICAgICAgX19zeW5jX2xvY2tfdGVzdF9hbmRfc2V0KCAodm9sYXRpbGUga21wX3VpbnQzMiAqKShwKSwgKGttcF91aW50MzIpKHYpICkKKyNkZWZpbmUgS01QX1hDSEdfRklYRUQ2NChwLCB2KSAgICAgICAgICAgICAgICAgIF9fc3luY19sb2NrX3Rlc3RfYW5kX3NldCggKHZvbGF0aWxlIGttcF91aW50NjQgKikocCksIChrbXBfdWludDY0KSh2KSApCisKK2lubGluZSBrbXBfcmVhbDMyIEtNUF9YQ0hHX1JFQUwzMiggdm9sYXRpbGUga21wX3JlYWwzMiAqcCwga21wX3JlYWwzMiB2KQoreworICAgIGttcF9pbnQzMiB0bXAgPSBfX3N5bmNfbG9ja190ZXN0X2FuZF9zZXQoIChrbXBfaW50MzIqKXAsICooa21wX2ludDMyKikmdik7CisgICAgcmV0dXJuICooa21wX3JlYWwzMiopJnRtcDsKK30KKworaW5saW5lIGttcF9yZWFsNjQgS01QX1hDSEdfUkVBTDY0KCB2b2xhdGlsZSBrbXBfcmVhbDY0ICpwLCBrbXBfcmVhbDY0IHYpCit7CisgICAga21wX2ludDY0IHRtcCA9IF9fc3luY19sb2NrX3Rlc3RfYW5kX3NldCggKGttcF9pbnQ2NCopcCwgKihrbXBfaW50NjQqKSZ2KTsKKyAgICByZXR1cm4gKihrbXBfcmVhbDY0KikmdG1wOworfQorCisjZWxzZQorCitleHRlcm4ga21wX2ludDMyIF9fa21wX3Rlc3RfdGhlbl9hZGQzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgdiApOworZXh0ZXJuIGttcF9pbnQzMiBfX2ttcF90ZXN0X3RoZW5fb3IzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgdiApOworZXh0ZXJuIGttcF9pbnQzMiBfX2ttcF90ZXN0X3RoZW5fYW5kMzIoIHZvbGF0aWxlIGttcF9pbnQzMiAqcCwga21wX2ludDMyIHYgKTsKK2V4dGVybiBrbXBfaW50NjQgX19rbXBfdGVzdF90aGVuX2FkZDY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCB2ICk7CitleHRlcm4ga21wX2ludDY0IF9fa21wX3Rlc3RfdGhlbl9vcjY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCB2ICk7CitleHRlcm4ga21wX2ludDY0IF9fa21wX3Rlc3RfdGhlbl9hbmQ2NCggdm9sYXRpbGUga21wX2ludDY0ICpwLCBrbXBfaW50NjQgdiApOworCitleHRlcm4ga21wX2ludDggX19rbXBfY29tcGFyZV9hbmRfc3RvcmU4KCB2b2xhdGlsZSBrbXBfaW50OCAqcCwga21wX2ludDggY3YsIGttcF9pbnQ4IHN2ICk7CitleHRlcm4ga21wX2ludDE2IF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMTYoIHZvbGF0aWxlIGttcF9pbnQxNiAqcCwga21wX2ludDE2IGN2LCBrbXBfaW50MTYgc3YgKTsKK2V4dGVybiBrbXBfaW50MzIgX19rbXBfY29tcGFyZV9hbmRfc3RvcmUzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgY3YsIGttcF9pbnQzMiBzdiApOworZXh0ZXJuIGttcF9pbnQzMiBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCBjdiwga21wX2ludDY0IHN2ICk7CitleHRlcm4ga21wX2ludDggIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDgoICB2b2xhdGlsZSBrbXBfaW50OCAgKnAsIGttcF9pbnQ4ICBjdiwga21wX2ludDggIHN2ICk7CitleHRlcm4ga21wX2ludDE2IF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDE2KCB2b2xhdGlsZSBrbXBfaW50MTYgKnAsIGttcF9pbnQxNiBjdiwga21wX2ludDE2IHN2ICk7CitleHRlcm4ga21wX2ludDMyIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiBjdiwga21wX2ludDMyIHN2ICk7CitleHRlcm4ga21wX2ludDY0IF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCBjdiwga21wX2ludDY0IHN2ICk7CisKK2V4dGVybiBrbXBfaW50OCAgX19rbXBfeGNoZ19maXhlZDgoIHZvbGF0aWxlIGttcF9pbnQ4ICAqcCwga21wX2ludDggIHYgKTsKK2V4dGVybiBrbXBfaW50MTYgX19rbXBfeGNoZ19maXhlZDE2KCB2b2xhdGlsZSBrbXBfaW50MTYgKnAsIGttcF9pbnQxNiB2ICk7CitleHRlcm4ga21wX2ludDMyIF9fa21wX3hjaGdfZml4ZWQzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgdiApOworZXh0ZXJuIGttcF9pbnQ2NCBfX2ttcF94Y2hnX2ZpeGVkNjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IHYgKTsKK2V4dGVybiBrbXBfcmVhbDMyIF9fa21wX3hjaGdfcmVhbDMyKCB2b2xhdGlsZSBrbXBfcmVhbDMyICpwLCBrbXBfcmVhbDMyIHYgKTsKK2V4dGVybiBrbXBfcmVhbDY0IF9fa21wX3hjaGdfcmVhbDY0KCB2b2xhdGlsZSBrbXBfcmVhbDY0ICpwLCBrbXBfcmVhbDY0IHYgKTsKKworIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9JTkMzMihwKSAgICAgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX2FkZDMyKCAocCksIDEgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9JTkNfQUNRMzIocCkgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX2FkZDMyKCAocCksIDEgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9JTkM2NChwKSAgICAgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX2FkZDY0KCAocCksIDFMTCApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0lOQ19BQ1E2NChwKSAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYWRkNjQoIChwKSwgMUxMICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fQURENF8zMihwKSAgICAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9hZGQzMiggKHApLCA0ICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fQURENF9BQ1EzMihwKSAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9hZGQzMiggKHApLCA0ICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fQURENF82NChwKSAgICAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9hZGQ2NCggKHApLCA0TEwgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9BREQ0X0FDUTY0KHApICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX2FkZDY0KCAocCksIDRMTCApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0RFQzMyKHApICAgICAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYWRkMzIoIChwKSwgLTEgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9ERUNfQUNRMzIocCkgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX2FkZDMyKCAocCksIC0xICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fREVDNjQocCkgICAgICAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9hZGQ2NCggKHApLCAtMUxMICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fREVDX0FDUTY0KHApICAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9hZGQ2NCggKHApLCAtMUxMICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fQUREMzIocCwgdikgICAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9hZGQzMiggKHApLCAodikgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9BREQ2NChwLCB2KSAgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX2FkZDY0KCAocCksICh2KSApCisKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fT1IzMihwLCB2KSAgICAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9vcjMyKCAocCksICh2KSApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0FORDMyKHAsIHYpICAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYW5kMzIoIChwKSwgKHYpICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fT1I2NChwLCB2KSAgICAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9vcjY0KCAocCksICh2KSApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0FORDY0KHAsIHYpICAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYW5kNjQoIChwKSwgKHYpICkKKworIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTgocCwgY3YsIHN2KSAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmU4KCAocCksIChjdiksIChzdikgKQorIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFTDgocCwgY3YsIHN2KSAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmU4KCAocCksIChjdiksIChzdikgKQorIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTE2KHAsIGN2LCBzdikgX19rbXBfY29tcGFyZV9hbmRfc3RvcmUxNiggKHApLCAoY3YpLCAoc3YpICkKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRUwxNihwLCBjdiwgc3YpIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMTYoIChwKSwgKGN2KSwgKHN2KSApCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRMzIocCwgY3YsIHN2KSBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTMyKCAocCksIChjdiksIChzdikgKQorIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFTDMyKHAsIGN2LCBzdikgX19rbXBfY29tcGFyZV9hbmRfc3RvcmUzMiggKHApLCAoY3YpLCAoc3YpICkKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1E2NChwLCBjdiwgc3YpIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQoIChwKSwgKGN2KSwgKHN2KSApCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVMNjQocCwgY3YsIHN2KSBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTY0KCAocCksIChjdiksIChzdikgKQorCisjIGlmIEtNUF9BUkNIX1g4NgorIyAgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9QVFIocCwgY3YsIHN2KSAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmUzMiggKHZvbGF0aWxlIGttcF9pbnQzMiopKHApLCAoa21wX2ludDMyKShjdiksIChrbXBfaW50MzIpKHN2KSApCisjIGVsc2UgLyogNjQgYml0IHBvaW50ZXJzICovCisjICBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1BUUihwLCBjdiwgc3YpICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTY0KCAodm9sYXRpbGUga21wX2ludDY0KikocCksIChrbXBfaW50NjQpKGN2KSwgKGttcF9pbnQ2NCkoc3YpICkKKyMgZW5kaWYgLyogS01QX0FSQ0hfWDg2ICovCisKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRVQ4KHAsIGN2LCBzdikgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDgoIChwKSwgKGN2KSwgKHN2KSApCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVUMTYocCwgY3YsIHN2KSBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQxNiggKHApLCAoY3YpLCAoc3YpICkKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRVQzMihwLCBjdiwgc3YpIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDMyKCAocCksIChjdiksIChzdikgKQorIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFVDY0KHAsIGN2LCBzdikgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0NjQoIChwKSwgKGN2KSwgKHN2KSApCisKKyMgZGVmaW5lIEtNUF9YQ0hHX0ZJWEVEOChwLCB2KSAgICAgICAgICAgICAgICAgIF9fa21wX3hjaGdfZml4ZWQ4KCAocCksICh2KSApOworIyBkZWZpbmUgS01QX1hDSEdfRklYRUQxNihwLCB2KSAgICAgICAgICAgICAgICAgX19rbXBfeGNoZ19maXhlZDE2KCAocCksICh2KSApOworIyBkZWZpbmUgS01QX1hDSEdfRklYRUQzMihwLCB2KSAgICAgICAgICAgICAgICAgX19rbXBfeGNoZ19maXhlZDMyKCAocCksICh2KSApOworIyBkZWZpbmUgS01QX1hDSEdfRklYRUQ2NChwLCB2KSAgICAgICAgICAgICAgICAgX19rbXBfeGNoZ19maXhlZDY0KCAocCksICh2KSApOworIyBkZWZpbmUgS01QX1hDSEdfUkVBTDMyKHAsIHYpICAgICAgICAgICAgICAgICAgX19rbXBfeGNoZ19yZWFsMzIoIChwKSwgKHYpICk7CisjIGRlZmluZSBLTVBfWENIR19SRUFMNjQocCwgdikgICAgICAgICAgICAgICAgICBfX2ttcF94Y2hnX3JlYWw2NCggKHApLCAodikgKTsKKworI2VuZGlmIC8qIEtNUF9BU01fSU5UUklOUyAqLworCisKKy8qIC0tLS0tLS0tLS0tLS0gcmVsYXhlZCBjb25zaXN0ZW5jeSBtZW1vcnkgbW9kZWwgc3R1ZmYgLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiBLTVBfT1NfV0lORE9XUworIyBpZmRlZiBfX0FCU09GVF9XSU4KKyMgICBkZWZpbmUgS01QX01CKCkgICAgIGFzbSAoIm5vcCIpCisjICAgZGVmaW5lIEtNUF9JTUIoKSAgICBhc20gKCJub3AiKQorIyBlbHNlCisjICAgZGVmaW5lIEtNUF9NQigpICAgICAvKiBfYXNteyBub3AgfSAqLworIyAgIGRlZmluZSBLTVBfSU1CKCkgICAgLyogX2FzbXsgbm9wIH0gKi8KKyMgZW5kaWYKKyNlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAqLworCisjaWYgS01QX0FSQ0hfUFBDNjQKKyMgZGVmaW5lIEtNUF9NQigpICAgICAgIF9fc3luY19zeW5jaHJvbml6ZSgpCisjZW5kaWYKKworI2lmbmRlZiBLTVBfTUIKKyMgZGVmaW5lIEtNUF9NQigpICAgICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyNlbmRpZgorCisjaWZuZGVmIEtNUF9JTUIKKyMgZGVmaW5lIEtNUF9JTUIoKSAgICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyNlbmRpZgorCisjaWZuZGVmIEtNUF9TVF9SRUwzMgorIyBkZWZpbmUgS01QX1NUX1JFTDMyKEEsRCkgICAgICAoICooQSkgPSAoRCkgKQorI2VuZGlmCisKKyNpZm5kZWYgS01QX1NUX1JFTDY0CisjIGRlZmluZSBLTVBfU1RfUkVMNjQoQSxEKSAgICAgICggKihBKSA9IChEKSApCisjZW5kaWYKKworI2lmbmRlZiBLTVBfTERfQUNRMzIKKyMgZGVmaW5lIEtNUF9MRF9BQ1EzMihBKSAgICAgICAgKCAqKEEpICkKKyNlbmRpZgorCisjaWZuZGVmIEtNUF9MRF9BQ1E2NAorIyBkZWZpbmUgS01QX0xEX0FDUTY0KEEpICAgICAgICAoICooQSkgKQorI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLy8KKy8vIEZJWE1FIC0gbWF5YmUgdGhpcyBzaG91bGQgdGhpcyBiZQorLy8KKy8vICNkZWZpbmUgVENSXzQoYSkgICAgKCoodm9sYXRpbGUga21wX2ludDMyICopKCZhKSkKKy8vICNkZWZpbmUgVENXXzQoYSxiKSAgKGEpID0gKCoodm9sYXRpbGUga21wX2ludDMyICopJihiKSkKKy8vCisvLyAjZGVmaW5lIFRDUl84KGEpICAgICgqKHZvbGF0aWxlIGttcF9pbnQ2NCAqKShhKSkKKy8vICNkZWZpbmUgVENXXzgoYSxiKSAgKGEpID0gKCoodm9sYXRpbGUga21wX2ludDY0ICopKCZiKSkKKy8vCisvLyBJJ20gZmFpcmx5IGNlcnRhaW4gdGhpcyBpcyB0aGUgY29ycmVjdCB0aGluZyB0byBkbywgYnV0IEknbSBhZnJhaWQKKy8vIG9mIHBlcmZvcm1hbmNlIHJlZ3Jlc3Npb25zLgorLy8KKworI2RlZmluZSBUQ1JfNChhKSAgICAgICAgICAgIChhKQorI2RlZmluZSBUQ1dfNChhLGIpICAgICAgICAgIChhKSA9IChiKQorI2RlZmluZSBUQ1JfOChhKSAgICAgICAgICAgIChhKQorI2RlZmluZSBUQ1dfOChhLGIpICAgICAgICAgIChhKSA9IChiKQorI2RlZmluZSBUQ1JfU1lOQ180KGEpICAgICAgIChhKQorI2RlZmluZSBUQ1dfU1lOQ180KGEsYikgICAgIChhKSA9IChiKQorI2RlZmluZSBUQ1hfU1lOQ180KGEsYixjKSAgIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRUwzMigodm9sYXRpbGUga21wX2ludDMyICopKHZvbGF0aWxlIHZvaWQgKikmKGEpLCAoa21wX2ludDMyKShiKSwgKGttcF9pbnQzMikoYykpCisjZGVmaW5lIFRDUl9TWU5DXzgoYSkgICAgICAgKGEpCisjZGVmaW5lIFRDV19TWU5DXzgoYSxiKSAgICAgKGEpID0gKGIpCisjZGVmaW5lIFRDWF9TWU5DXzgoYSxiLGMpICAgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFTDY0KCh2b2xhdGlsZSBrbXBfaW50NjQgKikodm9sYXRpbGUgdm9pZCAqKSYoYSksIChrbXBfaW50NjQpKGIpLCAoa21wX2ludDY0KShjKSkKKworI2lmIEtNUF9BUkNIX1g4NgorLy8gV2hhdCBhYm91dCBBUk0/CisgICAgI2RlZmluZSBUQ1JfUFRSKGEpICAgICAgICAgICgodm9pZCAqKVRDUl80KGEpKQorICAgICNkZWZpbmUgVENXX1BUUihhLGIpICAgICAgICBUQ1dfNCgoYSksKGIpKQorICAgICNkZWZpbmUgVENSX1NZTkNfUFRSKGEpICAgICAoKHZvaWQgKilUQ1JfU1lOQ180KGEpKQorICAgICNkZWZpbmUgVENXX1NZTkNfUFRSKGEsYikgICBUQ1dfU1lOQ180KChhKSwoYikpCisgICAgI2RlZmluZSBUQ1hfU1lOQ19QVFIoYSxiLGMpICgodm9pZCAqKVRDWF9TWU5DXzQoKGEpLChiKSwoYykpKQorCisjZWxzZSAvKiA2NCBiaXQgcG9pbnRlcnMgKi8KKworICAgICNkZWZpbmUgVENSX1BUUihhKSAgICAgICAgICAoKHZvaWQgKilUQ1JfOChhKSkKKyAgICAjZGVmaW5lIFRDV19QVFIoYSxiKSAgICAgICAgVENXXzgoKGEpLChiKSkKKyAgICAjZGVmaW5lIFRDUl9TWU5DX1BUUihhKSAgICAgKCh2b2lkICopVENSX1NZTkNfOChhKSkKKyAgICAjZGVmaW5lIFRDV19TWU5DX1BUUihhLGIpICAgVENXX1NZTkNfOCgoYSksKGIpKQorICAgICNkZWZpbmUgVENYX1NZTkNfUFRSKGEsYixjKSAoKHZvaWQgKilUQ1hfU1lOQ184KChhKSwoYiksKGMpKSkKKworI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiAqLworCisvKgorICogSWYgdGhlc2UgRlROX3tUUlVFLEZBTFNFfSB2YWx1ZXMgY2hhbmdlLCBtYXkgbmVlZCB0bworICogY2hhbmdlIHNldmVyYWwgcGxhY2VzIHdoZXJlIHRoZXkgYXJlIHVzZWQgdG8gY2hlY2sgdGhhdAorICogbGFuZ3VhZ2UgaXMgRm9ydHJhbiwgbm90IEMuCisgKi8KKworI2lmbmRlZiBGVE5fVFJVRQorIyBkZWZpbmUgRlROX1RSVUUgICAgICAgVFJVRQorI2VuZGlmCisKKyNpZm5kZWYgRlROX0ZBTFNFCisjIGRlZmluZSBGVE5fRkFMU0UgICAgICBGQUxTRQorI2VuZGlmCisKK3R5cGVkZWYgdm9pZCAgICAoKm1pY3JvdGFza190KSggaW50ICpndGlkLCBpbnQgKm5wciwgLi4uICk7CisKKyNpZmRlZiBVU0VfVk9MQVRJTEVfQ0FTVAorIyBkZWZpbmUgVk9MQVRJTEVfQ0FTVCh4KSAgICAgICAgKHZvbGF0aWxlIHgpCisjZWxzZQorIyBkZWZpbmUgVk9MQVRJTEVfQ0FTVCh4KSAgICAgICAgKHgpCisjZW5kaWYKKworI2lmZGVmIEtNUF9JOAorIyBkZWZpbmUgS01QX1dBSVRfWUlFTEQgICAgICAgICAgIF9fa21wX3dhaXRfeWllbGRfOAorIyBkZWZpbmUgS01QX0VRICAgICAgICAgICAgICAgICAgIF9fa21wX2VxXzgKKyMgZGVmaW5lIEtNUF9ORVEgICAgICAgICAgICAgICAgICBfX2ttcF9uZXFfOAorIyBkZWZpbmUgS01QX0xUICAgICAgICAgICAgICAgICAgIF9fa21wX2x0XzgKKyMgZGVmaW5lIEtNUF9HRSAgICAgICAgICAgICAgICAgICBfX2ttcF9nZV84CisjIGRlZmluZSBLTVBfTEUgICAgICAgICAgICAgICAgICAgX19rbXBfbGVfOAorI2Vsc2UKKyMgZGVmaW5lIEtNUF9XQUlUX1lJRUxEICAgICAgICAgICBfX2ttcF93YWl0X3lpZWxkXzQKKyMgZGVmaW5lIEtNUF9FUSAgICAgICAgICAgICAgICAgICBfX2ttcF9lcV80CisjIGRlZmluZSBLTVBfTkVRICAgICAgICAgICAgICAgICAgX19rbXBfbmVxXzQKKyMgZGVmaW5lIEtNUF9MVCAgICAgICAgICAgICAgICAgICBfX2ttcF9sdF80CisjIGRlZmluZSBLTVBfR0UgICAgICAgICAgICAgICAgICAgX19rbXBfZ2VfNAorIyBkZWZpbmUgS01QX0xFICAgICAgICAgICAgICAgICAgIF9fa21wX2xlXzQKKyNlbmRpZiAvKiBLTVBfSTggKi8KKworLyogV29ya2Fyb3VuZCBmb3IgSW50ZWwoUikgNjQgY29kZSBnZW4gYnVnIHdoZW4gdGFraW5nIGFkZHJlc3Mgb2Ygc3RhdGljIGFycmF5IChJbnRlbChSKSA2NCBUcmFja2VyICMxMzgpICovCisjaWYgKEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9QUEM2NCkgJiYgS01QX09TX0xJTlVYCisjIGRlZmluZSBTVEFUSUNfRUZJMl9XT1JLQVJPVU5ECisjZWxzZQorIyBkZWZpbmUgU1RBVElDX0VGSTJfV09SS0FST1VORCBzdGF0aWMKKyNlbmRpZgorCisvLyBTdXBwb3J0IG9mIEJHRVQgdXNhZ2UKKyNpZm5kZWYgS01QX1VTRV9CR0VUCisjZGVmaW5lIEtNUF9VU0VfQkdFVCAxCisjZW5kaWYKKworCisvLyBTd2l0Y2hlcyBmb3IgT1NTIGJ1aWxkcworI2lmbmRlZiBVU0VfU1lTRlNfSU5GTworIyBkZWZpbmUgVVNFX1NZU0ZTX0lORk8gIDAKKyNlbmRpZgorI2lmbmRlZiBVU0VfQ01QWENIR19GSVgKKyMgZGVmaW5lIFVTRV9DTVBYQ0hHX0ZJWCAxCisjZW5kaWYKKworLy8gV2FybmluZyBsZXZlbHMKK2VudW0ga21wX3dhcm5pbmdzX2xldmVsIHsKKyAgICBrbXBfd2FybmluZ3Nfb2ZmID0gMCwJCS8qIE5vIHdhcm5pbmdzICovCisgICAga21wX3dhcm5pbmdzX2xvdywJCQkvKiBNaW5pbWFsIHdhcm5pbmdzIChkZWZhdWx0KSAqLworICAgIGttcF93YXJuaW5nc19leHBsaWNpdCA9IDYsCQkvKiBFeHBsaWNpdGx5IHNldCB0byBPTiAtIG1vcmUgd2FybmluZ3MgKi8KKyAgICBrbXBfd2FybmluZ3NfdmVyYm9zZQkJLyogcmVzZXJ2ZWQgKi8KK307CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvLyBleHRlcm4gIkMiCisjZW5kaWYgLy8gX19jcGx1c3BsdXMKKworI2VuZGlmIC8qIEtNUF9PU19IICovCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfcnVudGltZS5jIGIvZmluYWwvcnVudGltZS9zcmMva21wX3J1bnRpbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzEwNmFhCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX3J1bnRpbWUuYwpAQCAtMCwwICsxLDcwNDIgQEAKKy8qCisgKiBrbXBfcnVudGltZS5jIC0tIEtQVFMgcnVudGltZSBzdXBwb3J0IGxpYnJhcnkKKyAqICRSZXZpc2lvbjogNDM0NzMgJAorICogJERhdGU6IDIwMTQtMDktMjYgMTU6MDI6NTcgLTA1MDAgKEZyaSwgMjYgU2VwIDIwMTQpICQKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgImttcC5oIgorI2luY2x1ZGUgImttcF9hdG9taWMuaCIKKyNpbmNsdWRlICJrbXBfd3JhcHBlcl9nZXRwaWQuaCIKKyNpbmNsdWRlICJrbXBfZW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlICJrbXBfaXR0LmgiCisjaW5jbHVkZSAia21wX3N0ci5oIgorI2luY2x1ZGUgImttcF9zZXR0aW5ncy5oIgorI2luY2x1ZGUgImttcF9pMThuLmgiCisjaW5jbHVkZSAia21wX2lvLmgiCisjaW5jbHVkZSAia21wX2Vycm9yLmgiCisjaW5jbHVkZSAia21wX3N0YXRzLmgiCisjaW5jbHVkZSAia21wX3dhaXRfcmVsZWFzZS5oIgorCisvKiB0aGVzZSBhcmUgdGVtcG9yYXJ5IGlzc3VlcyB0byBiZSBkZWFsdCB3aXRoICovCisjZGVmaW5lIEtNUF9VU0VfUFJDVEwgMAorI2RlZmluZSBLTVBfVVNFX1BPT0xFRF9BTExPQyAwCisKKyNpZiBLTVBfT1NfV0lORE9XUworI2luY2x1ZGUgPHByb2Nlc3MuaD4KKyNlbmRpZgorCisKKyNpZiBkZWZpbmVkKEtNUF9HT01QX0NPTVBBVCkKK2NoYXIgY29uc3QgX19rbXBfdmVyc2lvbl9hbHRfY29tcFtdID0gS01QX1ZFUlNJT05fUFJFRklYICJhbHRlcm5hdGl2ZSBjb21waWxlciBzdXBwb3J0OiB5ZXMiOworI2VuZGlmIC8qIGRlZmluZWQoS01QX0dPTVBfQ09NUEFUKSAqLworCitjaGFyIGNvbnN0IF9fa21wX3ZlcnNpb25fb21wX2FwaVtdID0gS01QX1ZFUlNJT05fUFJFRklYICJBUEkgdmVyc2lvbjogIgorI2lmIE9NUF80MF9FTkFCTEVECisgICAgIjQuMCAoMjAxMzA3KSI7CisjZWxzZQorICAgICIzLjEgKDIwMTEwNykiOworI2VuZGlmCisKKyNpZmRlZiBLTVBfREVCVUcKK2NoYXIgY29uc3QgX19rbXBfdmVyc2lvbl9sb2NrW10gPSBLTVBfVkVSU0lPTl9QUkVGSVggImxvY2sgdHlwZTogcnVuIHRpbWUgc2VsZWN0YWJsZSI7CisjZW5kaWYgLyogS01QX0RFQlVHICovCisKKworI2RlZmluZSBLTVBfTUlOKCB4LCB5ICkgKCAoeCkgPCAoeSkgPyAoeCkgOiAoeSkgKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitrbXBfaW5mb190IF9fa21wX21vbml0b3I7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb25zICovCisKK3ZvaWQgX19rbXBfY2xlYW51cCggdm9pZCApOworCitzdGF0aWMgdm9pZCBfX2ttcF9pbml0aWFsaXplX2luZm8oIGttcF9pbmZvX3QgKiwga21wX3RlYW1fdCAqLCBpbnQgdGlkLCBpbnQgZ3RpZCApOworc3RhdGljIHZvaWQgX19rbXBfaW5pdGlhbGl6ZV90ZWFtKCBrbXBfdGVhbV90ICogdGVhbSwgaW50IG5ld19ucHJvYywga21wX2ludGVybmFsX2NvbnRyb2xfdCAqIG5ld19pY3ZzLCBpZGVudF90ICogbG9jICk7CitzdGF0aWMgdm9pZCBfX2ttcF9wYXJ0aXRpb25fcGxhY2VzKCBrbXBfdGVhbV90ICp0ZWFtICk7CitzdGF0aWMgdm9pZCBfX2ttcF9kb19zZXJpYWxfaW5pdGlhbGl6ZSggdm9pZCApOwordm9pZCBfX2ttcF9mb3JrX2JhcnJpZXIoIGludCBndGlkLCBpbnQgdGlkICk7Cit2b2lkIF9fa21wX2pvaW5fYmFycmllciggaW50IGd0aWQgKTsKK3ZvaWQgX19rbXBfc2V0dXBfaWN2X2NvcHkoIGttcF90ZWFtX3QgKnRlYW0sIGludCBuZXdfbnByb2MsIGttcF9pbnRlcm5hbF9jb250cm9sX3QgKiBuZXdfaWN2cywgaWRlbnRfdCAqbG9jICk7CisKKworI2lmZGVmIFVTRV9MT0FEX0JBTEFOQ0UKK3N0YXRpYyBpbnQgX19rbXBfbG9hZF9iYWxhbmNlX25wcm9jKCBrbXBfcm9vdF90ICogcm9vdCwgaW50IHNldF9ucHJvYyApOworI2VuZGlmCisKK3N0YXRpYyBpbnQgX19rbXBfZXhwYW5kX3RocmVhZHMoaW50IG5XaXNoLCBpbnQgbk5lZWQpOworc3RhdGljIGludCBfX2ttcF91bnJlZ2lzdGVyX3Jvb3Rfb3RoZXJfdGhyZWFkKCBpbnQgZ3RpZCApOworc3RhdGljIHZvaWQgX19rbXBfdW5yZWdpc3Rlcl9saWJyYXJ5KCB2b2lkICk7IC8vIGNhbGxlZCBieSBfX2ttcF9pbnRlcm5hbF9lbmQoKQorc3RhdGljIHZvaWQgX19rbXBfcmVhcF90aHJlYWQoIGttcF9pbmZvX3QgKiB0aHJlYWQsIGludCBpc19yb290ICk7CitzdGF0aWMga21wX2luZm9fdCAqX19rbXBfdGhyZWFkX3Bvb2xfaW5zZXJ0X3B0ID0gTlVMTDsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogQ2FsY3VsYXRlIHRoZSBpZGVudGlmaWVyIG9mIHRoZSBjdXJyZW50IHRocmVhZCAqLworLyogZmFzdCAoYW5kIHNvbWV3aGF0IHBvcnRhYmxlKSB3YXkgdG8gZ2V0IHVuaXF1ZSAqLworLyogaWRlbnRpZmllciBvZiBleGVjdXRpbmcgdGhyZWFkLiAgICAgICAgICAgICAgICAqLworLyogcmV0dXJucyBLTVBfR1RJRF9ETkUgaWYgd2UgaGF2ZW4ndCBiZWVuIGFzc2lnbmVkIGEgZ3RpZCAgICovCisKK2ludAorX19rbXBfZ2V0X2dsb2JhbF90aHJlYWRfaWQoICkKK3sKKyAgICBpbnQgaTsKKyAgICBrbXBfaW5mb190ICAgKipvdGhlcl90aHJlYWRzOworICAgIHNpemVfdCAgICAgICAgIHN0YWNrX2RhdGE7CisgICAgY2hhciAgICAgICAgICAqc3RhY2tfYWRkcjsKKyAgICBzaXplX3QgICAgICAgICBzdGFja19zaXplOworICAgIGNoYXIgICAgICAgICAgKnN0YWNrX2Jhc2U7CisKKyAgICBLQV9UUkFDRSggMTAwMCwgKCAiKioqIF9fa21wX2dldF9nbG9iYWxfdGhyZWFkX2lkOiBlbnRlcmluZywgbnByb2M9JWQgIGFsbF9ucHJvYz0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9udGgsIF9fa21wX2FsbF9udGggKSk7CisKKyAgICAvKiBKUEggLSB0byBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgX19rbXBjX2VuZCgwKSBpcyBjYWxsZWQgaW1tZWRpYXRlbHkgcHJpb3IgdG8gYQorICAgICAgICAgICAgIHBhcmFsbGVsIHJlZ2lvbiwgbWFkZSBpdCByZXR1cm4gS01QX0dUSURfRE5FIHRvIGZvcmNlIHNlcmlhbF9pbml0aWFsaXplIGJ5CisgICAgICAgICAgICAgY2FsbGVyLiAgSGFkIHRvIGhhbmRsZSBLTVBfR1RJRF9ETkUgYXQgYWxsIGNhbGwtc2l0ZXMsIG9yIGVsc2UgZ3VhcmFudGVlCisgICAgICAgICAgICAgX19rbXBfaW5pdF9ndGlkIGZvciB0aGlzIHRvIHdvcmsuICAqLworCisgICAgaWYgKCAhVENSXzQoX19rbXBfaW5pdF9ndGlkKSApIHJldHVybiBLTVBfR1RJRF9ETkU7CisKKyNpZmRlZiBLTVBfVERBVEFfR1RJRAorICAgIGlmICggVENSXzQoX19rbXBfZ3RpZF9tb2RlKSA+PSAzKSB7CisgICAgICAgIEtBX1RSQUNFKCAxMDAwLCAoICIqKiogX19rbXBfZ2V0X2dsb2JhbF90aHJlYWRfaWQ6IHVzaW5nIFREQVRBXG4iICkpOworICAgICAgICByZXR1cm4gX19rbXBfZ3RpZDsKKyAgICB9CisjZW5kaWYKKyAgICBpZiAoIFRDUl80KF9fa21wX2d0aWRfbW9kZSkgPj0gMikgeworICAgICAgICBLQV9UUkFDRSggMTAwMCwgKCAiKioqIF9fa21wX2dldF9nbG9iYWxfdGhyZWFkX2lkOiB1c2luZyBrZXllZCBUTFNcbiIgKSk7CisgICAgICAgIHJldHVybiBfX2ttcF9ndGlkX2dldF9zcGVjaWZpYygpOworICAgIH0KKyAgICBLQV9UUkFDRSggMTAwMCwgKCAiKioqIF9fa21wX2dldF9nbG9iYWxfdGhyZWFkX2lkOiB1c2luZyBpbnRlcm5hbCBhbGcuXG4iICkpOworCisgICAgc3RhY2tfYWRkciAgICA9IChjaGFyKikgJiBzdGFja19kYXRhOworICAgIG90aGVyX3RocmVhZHMgPSBfX2ttcF90aHJlYWRzOworCisgICAgLyoKKyAgICAgICAgQVRUOiBUaGUgY29kZSBiZWxvdyBpcyBhIHNvdXJjZSBvZiBwb3RlbnRpYWwgYnVncyBkdWUgdG8gdW5zeW5jaHJvbml6ZWQgYWNjZXNzIHRvCisgICAgICAgIF9fa21wX3RocmVhZHMgYXJyYXkuIEZvciBleGFtcGxlOgorICAgICAgICAgICAgMS4gQ3VycmVudCB0aHJlYWQgbG9hZHMgb3RoZXJfdGhyZWFkc1tpXSB0byB0aHIgYW5kIGNoZWNrcyBpdCwgaXQgaXMgbm9uLU5VTEwuCisgICAgICAgICAgICAyLiBDdXJyZW50IHRocmVhZCBpcyBzdXNwZW5kZWQgYnkgT1MuCisgICAgICAgICAgICAzLiBBbm90aGVyIHRocmVhZCB1bnJlZ2lzdGVycyBhbmQgZmluaXNoZXMgKGRlYnVnIHZlcnNpb25zIG9mIGZyZWUoKSBtYXkgZmlsbCBtZW1vcnkKKyAgICAgICAgICAgICAgIHdpdGggc29tZXRoaW5nIGxpa2UgMHhFRikuCisgICAgICAgICAgICA0LiBDdXJyZW50IHRocmVhZCBpcyByZXN1bWVkLgorICAgICAgICAgICAgNS4gQ3VycmVudCB0aHJlYWQgcmVhZHMganVuayBmcm9tICp0aHIuCisgICAgICAgIFRPRE86IEZpeCBpdC4KKyAgICAgICAgLS1sbgorICAgICovCisKKyAgICBmb3IoIGkgPSAwIDsgaSA8IF9fa21wX3RocmVhZHNfY2FwYWNpdHkgOyBpKysgKSB7CisKKyAgICAgICAga21wX2luZm9fdCAqdGhyID0gKGttcF9pbmZvX3QgKilUQ1JfU1lOQ19QVFIob3RoZXJfdGhyZWFkc1tpXSk7CisgICAgICAgIGlmKCAhdGhyICkgY29udGludWU7CisKKyAgICAgICAgc3RhY2tfc2l6ZSA9ICAoc2l6ZV90KVRDUl9QVFIodGhyLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrc2l6ZSk7CisgICAgICAgIHN0YWNrX2Jhc2UgPSAgKGNoYXIgKilUQ1JfUFRSKHRoci0+dGgudGhfaW5mby5kcy5kc19zdGFja2Jhc2UpOworCisgICAgICAgIC8qIHN0YWNrIGdyb3dzIGRvd24gLS0gc2VhcmNoIHRocm91Z2ggYWxsIG9mIHRoZSBhY3RpdmUgdGhyZWFkcyAqLworCisgICAgICAgIGlmKCBzdGFja19hZGRyIDw9IHN0YWNrX2Jhc2UgKSB7CisgICAgICAgICAgICBzaXplX3Qgc3RhY2tfZGlmZiA9IHN0YWNrX2Jhc2UgLSBzdGFja19hZGRyOworCisgICAgICAgICAgICBpZiggc3RhY2tfZGlmZiA8PSBzdGFja19zaXplICkgeworICAgICAgICAgICAgICAgIC8qIFRoZSBvbmx5IHdheSB3ZSBjYW4gYmUgY2xvc2VyIHRoYW4gdGhlIGFsbG9jYXRlZCAqLworICAgICAgICAgICAgICAgIC8qIHN0YWNrIHNpemUgaXMgaWYgd2UgYXJlIHJ1bm5pbmcgb24gdGhpcyB0aHJlYWQuICovCisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfZ3RpZF9nZXRfc3BlY2lmaWMoKSA9PSBpICk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBnZXQgc3BlY2lmaWMgdG8gdHJ5IGFuZCBkZXRlcm1pbmUgb3VyIGd0aWQgKi8KKyAgICBLQV9UUkFDRSggMTAwMCwgKCAiKioqIF9fa21wX2dldF9nbG9iYWxfdGhyZWFkX2lkOiBpbnRlcm5hbCBhbGcuIGZhaWxlZCB0byBmaW5kICIKKyAgICAgICAgICAgICAgICAgICAgICAidGhyZWFkLCB1c2luZyBUTFNcbiIgKSk7CisgICAgaSA9IF9fa21wX2d0aWRfZ2V0X3NwZWNpZmljKCk7CisKKyAgICAvKmZwcmludGYoIHN0ZGVyciwgIj09PSAlZFxuIiwgaSApOyAgKi8gLyogR1JPTyAqLworCisgICAgLyogaWYgd2UgaGF2bid0IGJlZW4gYXNzaWduZWQgYSBndGlkLCB0aGVuIHJldHVybiBjb2RlICovCisgICAgaWYoIGk8MCApIHJldHVybiBpOworCisgICAgLyogZHluYW1pY2FsbHkgdXBkYXRlZCBzdGFjayB3aW5kb3cgZm9yIHViZXIgdGhyZWFkcyB0byBhdm9pZCBnZXRfc3BlY2lmaWMgY2FsbCAqLworICAgIGlmKCAhIFRDUl80KG90aGVyX3RocmVhZHNbaV0tPnRoLnRoX2luZm8uZHMuZHNfc3RhY2tncm93KSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBTdGFja092ZXJmbG93LCBpICk7CisgICAgfQorCisgICAgc3RhY2tfYmFzZSA9IChjaGFyICopIG90aGVyX3RocmVhZHNbaV0tPnRoLnRoX2luZm8uZHMuZHNfc3RhY2tiYXNlOworICAgIGlmKCBzdGFja19hZGRyID4gc3RhY2tfYmFzZSApIHsKKyAgICAgICAgVENXX1BUUihvdGhlcl90aHJlYWRzW2ldLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrYmFzZSwgc3RhY2tfYWRkcik7CisgICAgICAgIFRDV19QVFIob3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfaW5mby5kcy5kc19zdGFja3NpemUsCisgICAgICAgICAgb3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfaW5mby5kcy5kc19zdGFja3NpemUgKyBzdGFja19hZGRyIC0gc3RhY2tfYmFzZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgVENXX1BUUihvdGhlcl90aHJlYWRzW2ldLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrc2l6ZSwgc3RhY2tfYmFzZSAtIHN0YWNrX2FkZHIpOworICAgIH0KKworICAgIC8qIFJlcHJpbnQgc3RhY2sgYm91bmRzIGZvciB1YmVybWFzdGVyIHNpbmNlIHRoZXkgaGF2ZSBiZWVuIHJlZmluZWQgKi8KKyAgICBpZiAoIF9fa21wX3N0b3JhZ2VfbWFwICkgeworICAgICAgICBjaGFyICpzdGFja19lbmQgPSAoY2hhciAqKSBvdGhlcl90aHJlYWRzW2ldLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrYmFzZTsKKyAgICAgICAgY2hhciAqc3RhY2tfYmVnID0gc3RhY2tfZW5kIC0gb3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfaW5mby5kcy5kc19zdGFja3NpemU7CisgICAgICAgIF9fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoIGksIHN0YWNrX2JlZywgc3RhY2tfZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcl90aHJlYWRzW2ldLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoXyVkIHN0YWNrIChyZWZpbmVtZW50KSIsIGkgKTsKKyAgICB9CisgICAgcmV0dXJuIGk7Cit9CisKK2ludAorX19rbXBfZ2V0X2dsb2JhbF90aHJlYWRfaWRfcmVnKCApCit7CisgICAgaW50IGd0aWQ7CisKKyAgICBpZiAoICFfX2ttcF9pbml0X3NlcmlhbCApIHsKKyAgICAgICAgZ3RpZCA9IEtNUF9HVElEX0RORTsKKyAgICB9IGVsc2UKKyNpZmRlZiBLTVBfVERBVEFfR1RJRAorICAgIGlmICggVENSXzQoX19rbXBfZ3RpZF9tb2RlKSA+PSAzICkgeworICAgICAgICBLQV9UUkFDRSggMTAwMCwgKCAiKioqIF9fa21wX2dldF9nbG9iYWxfdGhyZWFkX2lkX3JlZzogdXNpbmcgVERBVEFcbiIgKSk7CisgICAgICAgIGd0aWQgPSBfX2ttcF9ndGlkOworICAgIH0gZWxzZQorI2VuZGlmCisgICAgaWYgKCBUQ1JfNChfX2ttcF9ndGlkX21vZGUpID49IDIgKSB7CisgICAgICAgIEtBX1RSQUNFKCAxMDAwLCAoICIqKiogX19rbXBfZ2V0X2dsb2JhbF90aHJlYWRfaWRfcmVnOiB1c2luZyBrZXllZCBUTFNcbiIgKSk7CisgICAgICAgIGd0aWQgPSBfX2ttcF9ndGlkX2dldF9zcGVjaWZpYygpOworICAgIH0gZWxzZSB7CisgICAgICAgIEtBX1RSQUNFKCAxMDAwLCAoICIqKiogX19rbXBfZ2V0X2dsb2JhbF90aHJlYWRfaWRfcmVnOiB1c2luZyBpbnRlcm5hbCBhbGcuXG4iICkpOworICAgICAgICBndGlkID0gX19rbXBfZ2V0X2dsb2JhbF90aHJlYWRfaWQoKTsKKyAgICB9CisKKyAgICAvKiB3ZSBtdXN0IGJlIGEgbmV3IHViZXIgbWFzdGVyIHNpYmxpbmcgdGhyZWFkICovCisgICAgaWYoIGd0aWQgPT0gS01QX0dUSURfRE5FICkgeworICAgICAgICBLQV9UUkFDRSggMTAsICggIl9fa21wX2dldF9nbG9iYWxfdGhyZWFkX2lkX3JlZzogRW5jb3VudGVyZWQgbmV3IHJvb3QgdGhyZWFkLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAiUmVnaXN0ZXJpbmcgYSBuZXcgZ3RpZC5cbiIgKSk7CisgICAgICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9pbml0el9sb2NrICk7CisgICAgICAgIGlmKCAhX19rbXBfaW5pdF9zZXJpYWwgKSB7CisgICAgICAgICAgICBfX2ttcF9kb19zZXJpYWxfaW5pdGlhbGl6ZSgpOworICAgICAgICAgICAgZ3RpZCA9IF9fa21wX2d0aWRfZ2V0X3NwZWNpZmljKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBndGlkID0gX19rbXBfcmVnaXN0ZXJfcm9vdChGQUxTRSk7CisgICAgICAgIH0KKyAgICAgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJl9fa21wX2luaXR6X2xvY2sgKTsKKyAgICAgICAgLypfX2ttcF9wcmludGYoICIrKysgJWRcbiIsIGd0aWQgKTsgKi8gLyogR1JPTyAqLworICAgIH0KKworICAgIEtNUF9ERUJVR19BU1NFUlQoIGd0aWQgPj0wICk7CisKKyAgICByZXR1cm4gZ3RpZDsKK30KKworLyogY2FsbGVyIG11c3QgaG9sZCBmb3Jram9pbl9sb2NrICovCit2b2lkCitfX2ttcF9jaGVja19zdGFja19vdmVybGFwKCBrbXBfaW5mb190ICp0aCApCit7CisgICAgaW50IGY7CisgICAgY2hhciAqc3RhY2tfYmVnID0gTlVMTDsKKyAgICBjaGFyICpzdGFja19lbmQgPSBOVUxMOworICAgIGludCBndGlkOworCisgICAgS0FfVFJBQ0UoMTAsKCJfX2ttcF9jaGVja19zdGFja19vdmVybGFwOiBjYWxsZWRcbiIpKTsKKyAgICBpZiAoIF9fa21wX3N0b3JhZ2VfbWFwICkgeworICAgICAgICBzdGFja19lbmQgPSAoY2hhciAqKSB0aC0+dGgudGhfaW5mby5kcy5kc19zdGFja2Jhc2U7CisgICAgICAgIHN0YWNrX2JlZyA9IHN0YWNrX2VuZCAtIHRoLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrc2l6ZTsKKworICAgICAgICBndGlkID0gX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGggKTsKKworICAgICAgICBpZiAoZ3RpZCA9PSBLTVBfR1RJRF9NT05JVE9SKSB7CisgICAgICAgICAgICBfX2ttcF9wcmludF9zdG9yYWdlX21hcF9ndGlkKCBndGlkLCBzdGFja19iZWcsIHN0YWNrX2VuZCwgdGgtPnRoLnRoX2luZm8uZHMuZHNfc3RhY2tzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aF8lcyBzdGFjayAoJXMpIiwgIm1vbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCB0aC0+dGgudGhfaW5mby5kcy5kc19zdGFja2dyb3cgKSA/ICJpbml0aWFsIiA6ICJhY3R1YWwiICk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBfX2ttcF9wcmludF9zdG9yYWdlX21hcF9ndGlkKCBndGlkLCBzdGFja19iZWcsIHN0YWNrX2VuZCwgdGgtPnRoLnRoX2luZm8uZHMuZHNfc3RhY2tzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aF8lZCBzdGFjayAoJXMpIiwgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIHRoLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrZ3JvdyApID8gImluaXRpYWwiIDogImFjdHVhbCIgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIE5vIHBvaW50IGluIGNoZWNraW5nIHViZXJtYXN0ZXIgdGhyZWFkcyBzaW5jZSB0aGV5IHVzZSByZWZpbmVtZW50IGFuZCBjYW5ub3Qgb3ZlcmxhcCAqLworICAgIGlmICggX19rbXBfZW52X2NoZWNrcyA9PSBUUlVFICYmICFLTVBfVUJFUl9HVElEKGd0aWQgPSBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aCApKSkKKyAgICB7CisgICAgICAgIEtBX1RSQUNFKDEwLCgiX19rbXBfY2hlY2tfc3RhY2tfb3ZlcmxhcDogcGVyZm9ybWluZyBleHRlbnNpdmUgY2hlY2tpbmdcbiIpKTsKKyAgICAgICAgaWYgKCBzdGFja19iZWcgPT0gTlVMTCApIHsKKyAgICAgICAgICAgIHN0YWNrX2VuZCA9IChjaGFyICopIHRoLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrYmFzZTsKKyAgICAgICAgICAgIHN0YWNrX2JlZyA9IHN0YWNrX2VuZCAtIHRoLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrc2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciggZj0wIDsgZiA8IF9fa21wX3RocmVhZHNfY2FwYWNpdHkgOyBmKysgKSB7CisgICAgICAgICAgICBrbXBfaW5mb190ICpmX3RoID0gKGttcF9pbmZvX3QgKilUQ1JfU1lOQ19QVFIoX19rbXBfdGhyZWFkc1tmXSk7CisKKyAgICAgICAgICAgIGlmKCBmX3RoICYmIGZfdGggIT0gdGggKSB7CisgICAgICAgICAgICAgICAgY2hhciAqb3RoZXJfc3RhY2tfZW5kID0gKGNoYXIgKilUQ1JfUFRSKGZfdGgtPnRoLnRoX2luZm8uZHMuZHNfc3RhY2tiYXNlKTsKKyAgICAgICAgICAgICAgICBjaGFyICpvdGhlcl9zdGFja19iZWcgPSBvdGhlcl9zdGFja19lbmQgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplX3QpVENSX1BUUihmX3RoLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrc2l6ZSk7CisgICAgICAgICAgICAgICAgaWYoKHN0YWNrX2JlZyA+IG90aGVyX3N0YWNrX2JlZyAmJiBzdGFja19iZWcgPCBvdGhlcl9zdGFja19lbmQpIHx8CisgICAgICAgICAgICAgICAgICAgKHN0YWNrX2VuZCA+IG90aGVyX3N0YWNrX2JlZyAmJiBzdGFja19lbmQgPCBvdGhlcl9zdGFja19lbmQpKSB7CisKKyAgICAgICAgICAgICAgICAgICAgLyogUHJpbnQgdGhlIG90aGVyIHN0YWNrIHZhbHVlcyBiZWZvcmUgdGhlIGFib3J0ICovCisgICAgICAgICAgICAgICAgICAgIGlmICggX19rbXBfc3RvcmFnZV9tYXAgKQorICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCggLTEsIG90aGVyX3N0YWNrX2JlZywgb3RoZXJfc3RhY2tfZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplX3QpVENSX1BUUihmX3RoLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrc2l6ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoXyVkIHN0YWNrIChvdmVybGFwcGVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggZl90aCApICk7CisKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnKCBrbXBfbXNfZmF0YWwsIEtNUF9NU0coIFN0YWNrT3ZlcmxhcCApLCBLTVBfSE5UKCBDaGFuZ2VTdGFja0xpbWl0ICksIF9fa21wX21zZ19udWxsICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIEtBX1RSQUNFKDEwLCgiX19rbXBfY2hlY2tfc3RhY2tfb3ZlcmxhcDogcmV0dXJuaW5nXG4iKSk7Cit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkCitfX2ttcF9pbmZpbml0ZV9sb29wKCB2b2lkICkKK3sKKyAgICBzdGF0aWMgaW50IGRvbmUgPSBGQUxTRTsKKworICAgIHdoaWxlICghIGRvbmUpIHsKKyAgICAgICAgS01QX1lJRUxEKCAxICk7CisgICAgfQorfQorCisjZGVmaW5lIE1BWF9NRVNTQUdFICAgICA1MTIKKwordm9pZAorX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCggaW50IGd0aWQsIHZvaWQgKnAxLCB2b2lkICpwMiwgc2l6ZV90IHNpemUsIGNoYXIgY29uc3QgKmZvcm1hdCwgLi4uKSB7CisgICAgY2hhciBidWZmZXJbTUFYX01FU1NBR0VdOworICAgIGludCBub2RlOworICAgIHZhX2xpc3QgYXA7CisKKyAgICB2YV9zdGFydCggYXAsIGZvcm1hdCk7CisgICAgc3ByaW50ZiggYnVmZmVyLCAiT01QIHN0b3JhZ2UgbWFwOiAlcCAlcCU4bHUgJXNcbiIsIHAxLCBwMiwgKHVuc2lnbmVkIGxvbmcpIHNpemUsIGZvcm1hdCApOworICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICYgX19rbXBfc3RkaW9fbG9jayApOworICAgIF9fa21wX3ZwcmludGYoIGttcF9lcnIsIGJ1ZmZlciwgYXAgKTsKKyNpZiBLTVBfUFJJTlRfREFUQV9QTEFDRU1FTlQKKyAgICBpZihndGlkID49IDApIHsKKyAgICAgICAgaWYocDEgPD0gcDIgJiYgKGNoYXIqKXAyIC0gKGNoYXIqKXAxID09IHNpemUpIHsKKyAgICAgICAgICAgIGlmKCBfX2ttcF9zdG9yYWdlX21hcF92ZXJib3NlICkgeworICAgICAgICAgICAgICAgIG5vZGUgPSBfX2ttcF9nZXRfaG9zdF9ub2RlKHAxKTsKKyAgICAgICAgICAgICAgICBpZihub2RlIDwgMCkgIC8qIGRvZXNuJ3Qgd29yaywgc28gZG9uJ3QgdHJ5IHRoaXMgbmV4dCB0aW1lICovCisgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0b3JhZ2VfbWFwX3ZlcmJvc2UgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhciAqbGFzdDsKKyAgICAgICAgICAgICAgICAgICAgaW50IGxhc3ROb2RlOworICAgICAgICAgICAgICAgICAgICBpbnQgbG9jYWxQcm9jID0gX19rbXBfZ2V0X2NwdV9mcm9tX2d0aWQoZ3RpZCk7CisKKyAgICAgICAgICAgICAgICAgICAgcDEgPSAodm9pZCAqKSggKHNpemVfdClwMSAmIH4oKHNpemVfdClQQUdFX1NJWkUgLSAxKSApOworICAgICAgICAgICAgICAgICAgICBwMiA9ICh2b2lkICopKCAoKHNpemVfdCkgcDIgLSAxKSAmIH4oKHNpemVfdClQQUdFX1NJWkUgLSAxKSApOworICAgICAgICAgICAgICAgICAgICBpZihsb2NhbFByb2MgPj0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3ByaW50Zl9ub19sb2NrKCIgIEdUSUQgJWQgbG9jYWxOb2RlICVkXG4iLCBndGlkLCBsb2NhbFByb2M+PjEpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9wcmludGZfbm9fbG9jaygiICBHVElEICVkXG4iLCBndGlkKTsKKyMgaWYgS01QX1VTRV9QUkNUTAorLyogVGhlIG1vcmUgZWxhYm9yYXRlIGZvcm1hdCBpcyBkaXNhYmxlZCBmb3Igbm93IGJlY2F1c2Ugb2YgdGhlIHByY3RsIGhhbmdpbmcgYnVnLiAqLworICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICBsYXN0ID0gcDE7CisgICAgICAgICAgICAgICAgICAgICAgICBsYXN0Tm9kZSA9IG5vZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGlzIGxvb3AgY29sbGF0ZXMgYWRqYWNlbnQgcGFnZXMgd2l0aCB0aGUgc2FtZSBob3N0IG5vZGUuICovCisgICAgICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIqKXAxICs9IFBBR0VfU0laRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUocDEgPD0gcDIgJiYgKG5vZGUgPSBfX2ttcF9nZXRfaG9zdF9ub2RlKHAxKSkgPT0gbGFzdE5vZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRmX25vX2xvY2soIiAgICAlcC0lcCBtZW1Ob2RlICVkXG4iLCBsYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIqKXAxIC0gMSwgbGFzdE5vZGUpOworICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKHAxIDw9IHAyKTsKKyMgZWxzZQorICAgICAgICAgICAgICAgICAgICBfX2ttcF9wcmludGZfbm9fbG9jaygiICAgICVwLSVwIG1lbU5vZGUgJWRcbiIsIHAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciopcDEgKyAoUEFHRV9TSVpFIC0gMSksIF9fa21wX2dldF9ob3N0X25vZGUocDEpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYocDEgPCBwMikgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3ByaW50Zl9ub19sb2NrKCIgICAgJXAtJXAgbWVtTm9kZSAlZFxuIiwgcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciopcDIgKyAoUEFHRV9TSVpFIC0gMSksIF9fa21wX2dldF9ob3N0X25vZGUocDIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorIyBlbmRpZgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBfX2ttcF9wcmludGZfbm9fbG9jaygiICAlc1xuIiwgS01QX0kxOE5fU1RSKCBTdG9yYWdlTWFwV2FybmluZyApICk7CisgICAgfQorI2VuZGlmIC8qIEtNUF9QUklOVF9EQVRBX1BMQUNFTUVOVCAqLworICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICYgX19rbXBfc3RkaW9fbG9jayApOworfQorCit2b2lkCitfX2ttcF93YXJuKCBjaGFyIGNvbnN0ICogZm9ybWF0LCAuLi4gKQoreworICAgIGNoYXIgYnVmZmVyW01BWF9NRVNTQUdFXTsKKyAgICB2YV9saXN0IGFwOworCisgICAgaWYgKCBfX2ttcF9nZW5lcmF0ZV93YXJuaW5ncyA9PSBrbXBfd2FybmluZ3Nfb2ZmICkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgdmFfc3RhcnQoIGFwLCBmb3JtYXQgKTsKKworICAgIHNucHJpbnRmKCBidWZmZXIsIHNpemVvZihidWZmZXIpICwgIk9NUCB3YXJuaW5nOiAlc1xuIiwgZm9ybWF0ICk7CisgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJiBfX2ttcF9zdGRpb19sb2NrICk7CisgICAgX19rbXBfdnByaW50Zigga21wX2VyciwgYnVmZmVyLCBhcCApOworICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICYgX19rbXBfc3RkaW9fbG9jayApOworCisgICAgdmFfZW5kKCBhcCApOworfQorCit2b2lkCitfX2ttcF9hYm9ydF9wcm9jZXNzKCkKK3sKKworICAgIC8vIExhdGVyIHRocmVhZHMgbWF5IHN0YWxsIGhlcmUsIGJ1dCB0aGF0J3Mgb2sgYmVjYXVzZSBhYm9ydCgpIHdpbGwga2lsbCB0aGVtLgorICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICYgX19rbXBfZXhpdF9sb2NrICk7CisKKyAgICBpZiAoIF9fa21wX2RlYnVnX2J1ZiApIHsKKyAgICAgICAgX19rbXBfZHVtcF9kZWJ1Z19idWZmZXIoKTsKKyAgICB9OyAvLyBpZgorCisgICAgaWYgKCBLTVBfT1NfV0lORE9XUyApIHsKKyAgICAgICAgLy8gTGV0IG90aGVyIHRocmVhZHMga25vdyBvZiBhYm5vcm1hbCB0ZXJtaW5hdGlvbiBhbmQgcHJldmVudCBkZWFkbG9jaworICAgICAgICAvLyBpZiBhYm9ydCBoYXBwZW5lZCBkdXJpbmcgbGlicmFyeSBpbml0aWFsaXphdGlvbiBvciBzaHV0ZG93bgorICAgICAgICBfX2ttcF9nbG9iYWwuZy5nX2Fib3J0ID0gU0lHQUJSVDsKKworICAgICAgICAvKgorICAgICAgICAgICAgT24gV2luZG93cyogT1MgYnkgZGVmYXVsdCBhYm9ydCgpIGNhdXNlcyBwb3AtdXAgZXJyb3IgYm94LCB3aGljaCBzdGFsbHMgbmlnaHRseSB0ZXN0aW5nLgorICAgICAgICAgICAgVW5mb3J0dW5hdGVseSwgd2UgY2Fubm90IHJlbGlhYmx5IHN1cHByZXNzIHBvcC11cCBlcnJvciBib3hlcy4gX3NldF9hYm9ydF9iZWhhdmlvcigpCisgICAgICAgICAgICB3b3JrcyB3ZWxsLCBidXQgdGhpcyBmdW5jdGlvbiBpcyBub3QgYXZhaWxhYmxlIGluIFZTNyAodGhpcyBpcyBub3QgcHJvYmxlbSBmb3IgRExMLCBidXQKKyAgICAgICAgICAgIGl0IGlzIGEgcHJvYmxlbSBmb3Igc3RhdGljIE9wZW5NUCBSVEwpLiBTZXRFcnJvck1vZGUgKGFuZCBzbywgdGltZWxpbWl0IHV0aWxpdHkpIGRvZXMKKyAgICAgICAgICAgIG5vdCBoZWxwLCBhdCBsZWFzdCBpbiBzb21lIHZlcnNpb25zIG9mIE1TIEMgUlRMLgorCisgICAgICAgICAgICBJdCBzZWVtcyBmb2xsb3dpbmcgc2VxdWVuY2UgaXMgdGhlIG9ubHkgd2F5IHRvIHNpbXVsYXRlIGFib3J0KCkgYW5kIGF2b2lkIHBvcC11cCBlcnJvcgorICAgICAgICAgICAgYm94LgorICAgICAgICAqLworICAgICAgICByYWlzZSggU0lHQUJSVCApOworICAgICAgICBfZXhpdCggMyApOyAgICAvLyBKdXN0IGluIGNhc2UsIGlmIHNpZ25hbCBpZ25vcmVkLCBleGl0IGFueXdheS4KKyAgICB9IGVsc2UgeworICAgICAgICBhYm9ydCgpOworICAgIH07IC8vIGlmCisKKyAgICBfX2ttcF9pbmZpbml0ZV9sb29wKCk7CisgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJiBfX2ttcF9leGl0X2xvY2sgKTsKKworfSAvLyBfX2ttcF9hYm9ydF9wcm9jZXNzCisKK3ZvaWQKK19fa21wX2Fib3J0X3RocmVhZCggdm9pZCApCit7CisgICAgLy8gVE9ETzogRWxpbWluYXRlIGdfYWJvcnQgZ2xvYmFsIHZhcmlhYmxlIGFuZCB0aGlzIGZ1bmN0aW9uLgorICAgIC8vIEluIGNhc2Ugb2YgYWJvcnQganVzdCBjYWxsIGFib3J0KCksIGl0IHdpbGwga2lsbCBhbGwgdGhlIHRocmVhZHMuCisgICAgX19rbXBfaW5maW5pdGVfbG9vcCgpOworfSAvLyBfX2ttcF9hYm9ydF90aHJlYWQKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBQcmludCBvdXQgdGhlIHN0b3JhZ2UgbWFwIGZvciB0aGUgbWFqb3Iga21wX2luZm9fdCB0aHJlYWQgZGF0YSBzdHJ1Y3R1cmVzCisgKiB0aGF0IGFyZSBhbGxvY2F0ZWQgdG9nZXRoZXIuCisgKi8KKworc3RhdGljIHZvaWQKK19fa21wX3ByaW50X3RocmVhZF9zdG9yYWdlX21hcCgga21wX2luZm9fdCAqdGhyLCBpbnQgZ3RpZCApCit7CisgICAgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCggZ3RpZCwgdGhyLCB0aHIgKyAxLCBzaXplb2Yoa21wX2luZm9fdCksICJ0aF8lZCIsIGd0aWQgKTsKKworICAgIF9fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoIGd0aWQsICZ0aHItPnRoLnRoX2luZm8sICZ0aHItPnRoLnRoX3RlYW0sIHNpemVvZihrbXBfZGVzY190KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoXyVkLnRoX2luZm8iLCBndGlkICk7CisKKyAgICBfX2ttcF9wcmludF9zdG9yYWdlX21hcF9ndGlkKCBndGlkLCAmdGhyLT50aC50aF9sb2NhbCwgJnRoci0+dGgudGhfcHJpX2hlYWQsIHNpemVvZihrbXBfbG9jYWxfdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aF8lZC50aF9sb2NhbCIsIGd0aWQgKTsKKworICAgIF9fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoIGd0aWQsICZ0aHItPnRoLnRoX2JhclswXSwgJnRoci0+dGgudGhfYmFyW2JzX2xhc3RfYmFycmllcl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihrbXBfYmFsaWduX3QpICogYnNfbGFzdF9iYXJyaWVyLCAidGhfJWQudGhfYmFyIiwgZ3RpZCApOworCisgICAgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCggZ3RpZCwgJnRoci0+dGgudGhfYmFyW2JzX3BsYWluX2JhcnJpZXJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhyLT50aC50aF9iYXJbYnNfcGxhaW5fYmFycmllcisxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGttcF9iYWxpZ25fdCksICJ0aF8lZC50aF9iYXJbcGxhaW5dIiwgZ3RpZCk7CisKKyAgICBfX2ttcF9wcmludF9zdG9yYWdlX21hcF9ndGlkKCBndGlkLCAmdGhyLT50aC50aF9iYXJbYnNfZm9ya2pvaW5fYmFycmllcl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aHItPnRoLnRoX2Jhcltic19mb3Jram9pbl9iYXJyaWVyKzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoa21wX2JhbGlnbl90KSwgInRoXyVkLnRoX2Jhcltmb3Jram9pbl0iLCBndGlkKTsKKworICAgICNpZiBLTVBfRkFTVF9SRURVQ1RJT05fQkFSUklFUgorICAgICAgICBfX2ttcF9wcmludF9zdG9yYWdlX21hcF9ndGlkKCBndGlkLCAmdGhyLT50aC50aF9iYXJbYnNfcmVkdWN0aW9uX2JhcnJpZXJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhyLT50aC50aF9iYXJbYnNfcmVkdWN0aW9uX2JhcnJpZXIrMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihrbXBfYmFsaWduX3QpLCAidGhfJWQudGhfYmFyW3JlZHVjdGlvbl0iLCBndGlkKTsKKyAgICAjZW5kaWYgLy8gS01QX0ZBU1RfUkVEVUNUSU9OX0JBUlJJRVIKK30KKworLyoKKyAqIFByaW50IG91dCB0aGUgc3RvcmFnZSBtYXAgZm9yIHRoZSBtYWpvciBrbXBfdGVhbV90IHRlYW0gZGF0YSBzdHJ1Y3R1cmVzCisgKiB0aGF0IGFyZSBhbGxvY2F0ZWQgdG9nZXRoZXIuCisgKi8KKworc3RhdGljIHZvaWQKK19fa21wX3ByaW50X3RlYW1fc3RvcmFnZV9tYXAoIGNvbnN0IGNoYXIgKmhlYWRlciwga21wX3RlYW1fdCAqdGVhbSwgaW50IHRlYW1faWQsIGludCBudW1fdGhyICkKK3sKKyAgICBpbnQgbnVtX2Rpc3BfYnVmZiA9IHRlYW0tPnQudF9tYXhfbnByb2MgPiAxID8gS01QX01BWF9ESVNQX0JVRiA6IDI7CisgICAgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCggLTEsIHRlYW0sIHRlYW0gKyAxLCBzaXplb2Yoa21wX3RlYW1fdCksICIlc18lZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlciwgdGVhbV9pZCApOworCisgICAgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCggLTEsICZ0ZWFtLT50LnRfYmFyWzBdLCAmdGVhbS0+dC50X2Jhcltic19sYXN0X2JhcnJpZXJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoa21wX2JhbGlnbl90ZWFtX3QpICogYnNfbGFzdF9iYXJyaWVyLCAiJXNfJWQudF9iYXIiLCBoZWFkZXIsIHRlYW1faWQgKTsKKworCisgICAgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCggLTEsICZ0ZWFtLT50LnRfYmFyW2JzX3BsYWluX2JhcnJpZXJdLCAmdGVhbS0+dC50X2Jhcltic19wbGFpbl9iYXJyaWVyKzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoa21wX2JhbGlnbl90ZWFtX3QpLCAiJXNfJWQudF9iYXJbcGxhaW5dIiwgaGVhZGVyLCB0ZWFtX2lkICk7CisKKyAgICBfX2ttcF9wcmludF9zdG9yYWdlX21hcF9ndGlkKCAtMSwgJnRlYW0tPnQudF9iYXJbYnNfZm9ya2pvaW5fYmFycmllcl0sICZ0ZWFtLT50LnRfYmFyW2JzX2Zvcmtqb2luX2JhcnJpZXIrMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihrbXBfYmFsaWduX3RlYW1fdCksICIlc18lZC50X2Jhcltmb3Jram9pbl0iLCBoZWFkZXIsIHRlYW1faWQgKTsKKworICAgICNpZiBLTVBfRkFTVF9SRURVQ1RJT05fQkFSUklFUgorICAgICAgICBfX2ttcF9wcmludF9zdG9yYWdlX21hcF9ndGlkKCAtMSwgJnRlYW0tPnQudF9iYXJbYnNfcmVkdWN0aW9uX2JhcnJpZXJdLCAmdGVhbS0+dC50X2Jhcltic19yZWR1Y3Rpb25fYmFycmllcisxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGttcF9iYWxpZ25fdGVhbV90KSwgIiVzXyVkLnRfYmFyW3JlZHVjdGlvbl0iLCBoZWFkZXIsIHRlYW1faWQgKTsKKyAgICAjZW5kaWYgLy8gS01QX0ZBU1RfUkVEVUNUSU9OX0JBUlJJRVIKKworICAgIF9fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoIC0xLCAmdGVhbS0+dC50X2Rpc3BhdGNoWzBdLCAmdGVhbS0+dC50X2Rpc3BhdGNoW251bV90aHJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoa21wX2Rpc3BfdCkgKiBudW1fdGhyLCAiJXNfJWQudF9kaXNwYXRjaCIsIGhlYWRlciwgdGVhbV9pZCApOworCisgICAgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCggLTEsICZ0ZWFtLT50LnRfdGhyZWFkc1swXSwgJnRlYW0tPnQudF90aHJlYWRzW251bV90aHJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoa21wX2luZm9fdCAqKSAqIG51bV90aHIsICIlc18lZC50X3RocmVhZHMiLCBoZWFkZXIsIHRlYW1faWQgKTsKKworICAgIF9fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoIC0xLCAmdGVhbS0+dC50X2Rpc3BfYnVmZmVyWzBdLCAmdGVhbS0+dC50X2Rpc3BfYnVmZmVyW251bV9kaXNwX2J1ZmZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZGlzcGF0Y2hfc2hhcmVkX2luZm9fdCkgKiBudW1fZGlzcF9idWZmLCAiJXNfJWQudF9kaXNwX2J1ZmZlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlciwgdGVhbV9pZCApOworCisgICAgLyoKKyAgICBfX2ttcF9wcmludF9zdG9yYWdlX21hcF9ndGlkKCAtMSwgJnRlYW0tPnQudF9zZXRfbnByb2NbMF0sICZ0ZWFtLT50LnRfc2V0X25wcm9jW251bV90aHJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoaW50KSAqIG51bV90aHIsICIlc18lZC50X3NldF9ucHJvYyIsIGhlYWRlciwgdGVhbV9pZCApOworCisgICAgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCggLTEsICZ0ZWFtLT50LnRfc2V0X2R5bmFtaWNbMF0sICZ0ZWFtLT50LnRfc2V0X2R5bmFtaWNbbnVtX3Rocl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihpbnQpICogbnVtX3RociwgIiVzXyVkLnRfc2V0X2R5bmFtaWMiLCBoZWFkZXIsIHRlYW1faWQgKTsKKworICAgIF9fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoIC0xLCAmdGVhbS0+dC50X3NldF9uZXN0ZWRbMF0sICZ0ZWFtLT50LnRfc2V0X25lc3RlZFtudW1fdGhyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGludCkgKiBudW1fdGhyLCAiJXNfJWQudF9zZXRfbmVzdGVkIiwgaGVhZGVyLCB0ZWFtX2lkICk7CisKKyAgICBfX2ttcF9wcmludF9zdG9yYWdlX21hcF9ndGlkKCAtMSwgJnRlYW0tPnQudF9zZXRfYmxvY2t0aW1lWzBdLCAmdGVhbS0+dC50X3NldF9ibG9ja3RpbWVbbnVtX3Rocl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihpbnQpICogbnVtX3RociwgIiVzXyVkLnRfc2V0X25wcm9jIiwgaGVhZGVyLCB0ZWFtX2lkICk7CisKKyAgICBfX2ttcF9wcmludF9zdG9yYWdlX21hcF9ndGlkKCAtMSwgJnRlYW0tPnQudF9zZXRfYnRfaW50ZXJ2YWxzWzBdLCAmdGVhbS0+dC50X3NldF9idF9pbnRlcnZhbHNbbnVtX3Rocl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihpbnQpICogbnVtX3RociwgIiVzXyVkLnRfc2V0X2R5bmFtaWMiLCBoZWFkZXIsIHRlYW1faWQgKTsKKworICAgIF9fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoIC0xLCAmdGVhbS0+dC50X3NldF9idF9zZXRbMF0sICZ0ZWFtLT50LnRfc2V0X2J0X3NldFtudW1fdGhyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGludCkgKiBudW1fdGhyLCAiJXNfJWQudF9zZXRfbmVzdGVkIiwgaGVhZGVyLCB0ZWFtX2lkICk7CisKKyAgICAvL19fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoIC0xLCAmdGVhbS0+dC50X3NldF9tYXhfYWN0aXZlX2xldmVsc1swXSwgJnRlYW0tPnQudF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHNbbnVtX3Rocl0sCisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoaW50KSAqIG51bV90aHIsICIlc18lZC50X3NldF9tYXhfYWN0aXZlX2xldmVscyIsIGhlYWRlciwgdGVhbV9pZCApOworCisgICAgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCggLTEsICZ0ZWFtLT50LnRfc2V0X3NjaGVkWzBdLCAmdGVhbS0+dC50X3NldF9zY2hlZFtudW1fdGhyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGttcF9yX3NjaGVkX3QpICogbnVtX3RociwgIiVzXyVkLnRfc2V0X3NjaGVkIiwgaGVhZGVyLCB0ZWFtX2lkICk7CisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBfX2ttcF9wcmludF9zdG9yYWdlX21hcF9ndGlkKCAtMSwgJnRlYW0tPnQudF9zZXRfcHJvY19iaW5kWzBdLCAmdGVhbS0+dC50X3NldF9wcm9jX2JpbmRbbnVtX3Rocl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihrbXBfcHJvY19iaW5kX3QpICogbnVtX3RociwgIiVzXyVkLnRfc2V0X3Byb2NfYmluZCIsIGhlYWRlciwgdGVhbV9pZCApOworI2VuZGlmCisgICAgKi8KKworICAgIF9fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoIC0xLCAmdGVhbS0+dC50X3Rhc2txLCAmdGVhbS0+dC50X2NvcHlwcml2X2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihrbXBfdGFza3FfdCksICIlc18lZC50X3Rhc2txIiwgaGVhZGVyLCB0ZWFtX2lkICk7Cit9CisKK3N0YXRpYyB2b2lkIF9fa21wX2luaXRfYWxsb2NhdG9yKCkge30KK3N0YXRpYyB2b2lkIF9fa21wX2ZpbmlfYWxsb2NhdG9yKCkge30KK3N0YXRpYyB2b2lkIF9fa21wX2ZpbmlfYWxsb2NhdG9yX3RocmVhZCgpIHt9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZkZWYgR1VJREVETExfRVhQT1JUUworIyBpZiBLTVBfT1NfV0lORE9XUworCisKK3N0YXRpYyB2b2lkCitfX2ttcF9yZXNldF9sb2NrKCBrbXBfYm9vdHN0cmFwX2xvY2tfdCogbGNrICkgeworICAgIC8vIFRPRE86IENoYW5nZSB0byBfX2ttcF9icmVha19ib290c3RyYXBfbG9jaygpLgorICAgIF9fa21wX2luaXRfYm9vdHN0cmFwX2xvY2soIGxjayApOyAvLyBtYWtlIHRoZSBsb2NrIHJlbGVhc2VkCit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9yZXNldF9sb2Nrc19vbl9wcm9jZXNzX2RldGFjaCggaW50IGd0aWRfcmVxICkgeworICAgIGludCBpOworICAgIGludCB0aHJlYWRfY291bnQ7CisKKyAgICAvLyBQUk9DRVNTX0RFVEFDSCBpcyBleHBlY3RlZCB0byBiZSBjYWxsZWQgYnkgYSB0aHJlYWQKKyAgICAvLyB0aGF0IGV4ZWN1dGVzIFByb2Nlc3NFeGl0KCkgb3IgRnJlZUxpYnJhcnkoKS4KKyAgICAvLyBPUyB0ZXJtaW5hdGVzIG90aGVyIHRocmVhZHMgKGV4Y2VwdCB0aGUgb25lIGNhbGxpbmcgUHJvY2Vzc0V4aXQgb3IgRnJlZUxpYnJhcnkpLgorICAgIC8vIFNvLCBpdCBtaWdodCBiZSBzYWZlIHRvIGFjY2VzcyB0aGUgX19rbXBfdGhyZWFkc1tdIHdpdGhvdXQgdGFraW5nIHRoZSBmb3Jram9pbl9sb2NrLgorICAgIC8vIEhvd2V2ZXIsIGluIGZhY3QsIHNvbWUgdGhyZWFkcyBjYW4gYmUgc3RpbGwgYWxpdmUgaGVyZSwgYWx0aG91Z2ggYmVpbmcgYWJvdXQgdG8gYmUgdGVybWluYXRlZC4KKyAgICAvLyBUaGUgdGhyZWFkcyBpbiB0aGUgYXJyYXkgd2l0aCBkc190aHJlYWQ9PTAgYXJlIG1vc3Qgc3VzcGljaW91cy4KKyAgICAvLyBBY3R1YWxseSwgaXQgY2FuIGJlIG5vdCBzYWZlIHRvIGFjY2VzcyB0aGUgX19rbXBfdGhyZWFkc1tdLgorCisgICAgLy8gVE9ETzogZG9lcyBpdCBtYWtlIHNlbnNlIHRvIGNoZWNrIF9fa21wX3Jvb3RzW10gPworCisgICAgLy8gTGV0J3MgY2hlY2sgdGhhdCB0aGVyZSBhcmUgbm8gb3RoZXIgYWxpdmUgdGhyZWFkcyByZWdpc3RlcmVkIHdpdGggdGhlIE9NUCBsaWIuCisgICAgd2hpbGUoIDEgKSB7CisgICAgICAgIHRocmVhZF9jb3VudCA9IDA7CisgICAgICAgIGZvciggaSA9IDA7IGkgPCBfX2ttcF90aHJlYWRzX2NhcGFjaXR5OyArK2kgKSB7CisgICAgICAgICAgICBpZiggIV9fa21wX3RocmVhZHMgKSBjb250aW51ZTsKKyAgICAgICAgICAgIGttcF9pbmZvX3QqIHRoID0gX19rbXBfdGhyZWFkc1sgaSBdOworICAgICAgICAgICAgaWYoIHRoID09IE5VTEwgKSBjb250aW51ZTsKKyAgICAgICAgICAgIGludCBndGlkID0gdGgtPnRoLnRoX2luZm8uZHMuZHNfZ3RpZDsKKyAgICAgICAgICAgIGlmKCBndGlkID09IGd0aWRfcmVxICkgY29udGludWU7CisgICAgICAgICAgICBpZiggZ3RpZCA8IDAgKSBjb250aW51ZTsKKyAgICAgICAgICAgIERXT1JEIGV4aXRfdmFsOworICAgICAgICAgICAgaW50IGFsaXZlID0gX19rbXBfaXNfdGhyZWFkX2FsaXZlKCB0aCwgJmV4aXRfdmFsICk7CisgICAgICAgICAgICBpZiggYWxpdmUgKSB7CisgICAgICAgICAgICArK3RocmVhZF9jb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiggdGhyZWFkX2NvdW50ID09IDAgKSBicmVhazsgLy8gc3VjY2VzcworICAgIH0KKworICAgIC8vIEFzc3VtZSB0aGF0IEknbSBhbG9uZS4KKworICAgIC8vIE5vdyBpdCBtaWdodCBiZSBwcm9iYWJseSBzYWZlIHRvIGNoZWNrIGFuZCByZXNldCBsb2Nrcy4KKyAgICAvLyBfX2ttcF9mb3Jram9pbl9sb2NrIGFuZCBfX2ttcF9zdGRpb19sb2NrIGFyZSBleHBlY3RlZCB0byBiZSByZXNldC4KKyAgICBfX2ttcF9yZXNldF9sb2NrKCAmX19rbXBfZm9ya2pvaW5fbG9jayApOworICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICBfX2ttcF9yZXNldF9sb2NrKCAmX19rbXBfc3RkaW9fbG9jayApOworICAgICNlbmRpZiAvLyBLTVBfREVCVUcKKworCit9CisKK0JPT0wgV0lOQVBJCitEbGxNYWluKCBISU5TVEFOQ0UgaEluc3RETEwsIERXT1JEIGZkd1JlYXNvbiwgTFBWT0lEIGxwUmVzZXJ2ZWQgKSB7CisgICAgLy9fX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfaW5pdHpfbG9jayApOworCisgICAgc3dpdGNoKCBmZHdSZWFzb24gKSB7CisKKyAgICAgICAgY2FzZSBETExfUFJPQ0VTU19BVFRBQ0g6CisgICAgICAgICAgICBLQV9UUkFDRSggMTAsICgiRGxsTWFpbjogUFJPQ0VTU19BVFRBQ0hcbiIgKSk7CisKKyAgICAgICAgICAgIHJldHVybiBUUlVFOworCisgICAgICAgIGNhc2UgRExMX1BST0NFU1NfREVUQUNIOgorICAgICAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIkRsbE1haW46IFBST0NFU1NfREVUQUNIIFQjJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2dldF9zcGVjaWZpYygpICkpOworCisgICAgICAgICAgICBpZiggbHBSZXNlcnZlZCAhPSBOVUxMICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBscFJlc2VydmVkIGlzIHVzZWQgZm9yIHRlbGxpbmcgdGhlIGRpZmZlcmVuY2U6CisgICAgICAgICAgICAgICAgLy8gIGxwUmVzZXJ2ZWQgPT0gTlVMTCB3aGVuIEZyZWVMaWJyYXJ5KCkgd2FzIGNhbGxlZCwKKyAgICAgICAgICAgICAgICAvLyAgbHBSZXNlcnZlZCAhPSBOVUxMIHdoZW4gdGhlIHByb2Nlc3MgdGVybWluYXRlcy4KKyAgICAgICAgICAgICAgICAvLyBXaGVuIEZyZWVMaWJyYXJ5KCkgaXMgY2FsbGVkLCB3b3JrZXIgdGhyZWFkcyByZW1haW4gYWxpdmUuCisgICAgICAgICAgICAgICAgLy8gU28gdGhleSB3aWxsIHJlbGVhc2UgdGhlIGZvcmtqb2luIGxvY2sgYnkgdGhlbXNlbHZlcy4KKyAgICAgICAgICAgICAgICAvLyBXaGVuIHRoZSBwcm9jZXNzIHRlcm1pbmF0ZXMsIHdvcmtlciB0aHJlYWRzIGRpc2FwcGVhciB0cmlnZ2VyaW5nCisgICAgICAgICAgICAgICAgLy8gdGhlIHByb2JsZW0gb2YgdW5yZWxlYXNlZCBmb3Jram9pbiBsb2NrIGFzIGRlc2NyaWJlZCBiZWxvdy4KKworICAgICAgICAgICAgICAgIC8vIEEgd29ya2VyIHRocmVhZCBjYW4gdGFrZSB0aGUgZm9ya2pvaW4gbG9jaworICAgICAgICAgICAgICAgIC8vIGluIF9fa21wX3N1c3BlbmRfdGVtcGxhdGUoKS0+X19rbXBfcm1sX2RlY3JlYXNlX2xvYWRfYmVmb3JlX3NsZWVwKCkuCisgICAgICAgICAgICAgICAgLy8gVGhlIHByb2JsZW0gY29tZXMgdXAgaWYgdGhhdCB3b3JrZXIgdGhyZWFkIGJlY29tZXMgZGVhZAorICAgICAgICAgICAgICAgIC8vIGJlZm9yZSBpdCByZWxlYXNlcyB0aGUgZm9ya2pvaW4gbG9jay4KKyAgICAgICAgICAgICAgICAvLyBUaGUgZm9ya2pvaW4gbG9jayByZW1haW5zIHRha2VuLCB3aGlsZSB0aGUgdGhyZWFkCisgICAgICAgICAgICAgICAgLy8gZXhlY3V0aW5nIERsbE1haW4oKS0+UFJPQ0VTU19ERVRBQ0gtPl9fa21wX2ludGVybmFsX2VuZF9saWJyYXJ5KCkgYmVsb3cKKyAgICAgICAgICAgICAgICAvLyB3aWxsIHRyeSB0byB0YWtlIHRoZSBmb3Jram9pbiBsb2NrIGFuZCB3aWxsIGFsd2F5cyBmYWlsLAorICAgICAgICAgICAgICAgIC8vIHNvIHRoYXQgdGhlIGFwcGxpY2F0aW9uIHdpbGwgbmV2ZXIgZmluaXNoIFtub3JtYWxseV0uCisgICAgICAgICAgICAgICAgLy8gVGhpcyBzY2VuYXJpbyBpcyBwb3NzaWJsZSBpZiBfX2ttcGNfZW5kKCkgaGFzIG5vdCBiZWVuIGV4ZWN1dGVkLgorICAgICAgICAgICAgICAgIC8vIEl0IGxvb2tzIGxpa2UgaXQncyBub3QgYSBjb3JuZXIgY2FzZSwgYnV0IGNvbW1vbiBjYXNlczoKKyAgICAgICAgICAgICAgICAvLyAtIHRoZSBtYWluIGZ1bmN0aW9uIHdhcyBjb21waWxlZCBieSBhbiBhbHRlcm5hdGl2ZSBjb21waWxlcjsKKyAgICAgICAgICAgICAgICAvLyAtIHRoZSBtYWluIGZ1bmN0aW9uIHdhcyBjb21waWxlZCBieSBpY2wgYnV0IHdpdGhvdXQgL1FvcGVubXAgKGFwcGxpY2F0aW9uIHdpdGggcGx1Z2lucyk7CisgICAgICAgICAgICAgICAgLy8gLSBhcHBsaWNhdGlvbiB0ZXJtaW5hdGVzIGJ5IGNhbGxpbmcgQyBleGl0KCksIEZvcnRyYW4gQ0FMTCBFWElUKCkgb3IgRm9ydHJhbiBTVE9QLgorICAgICAgICAgICAgICAgIC8vIC0gYWxpdmUgZm9yZWlnbiB0aHJlYWQgcHJldmVudGVkIF9fa21wY19lbmQgZnJvbSBkb2luZyBjbGVhbnVwLgorCisgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIGhhY2sgdG8gd29yayBhcm91bmQgdGhlIHByb2JsZW0uCisgICAgICAgICAgICAgICAgLy8gVE9ETzogISEhIHRvIGZpZ3VyZSBvdXQgc29tZXRoaW5nIGJldHRlci4KKyAgICAgICAgICAgICAgICBfX2ttcF9yZXNldF9sb2Nrc19vbl9wcm9jZXNzX2RldGFjaCggX19rbXBfZ3RpZF9nZXRfc3BlY2lmaWMoKSApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfX2ttcF9pbnRlcm5hbF9lbmRfbGlicmFyeSggX19rbXBfZ3RpZF9nZXRfc3BlY2lmaWMoKSApOworCisgICAgICAgICAgICByZXR1cm4gVFJVRTsKKworICAgICAgICBjYXNlIERMTF9USFJFQURfQVRUQUNIOgorICAgICAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIkRsbE1haW46IFRIUkVBRF9BVFRBQ0hcbiIgKSk7CisKKyAgICAgICAgICAgIC8qIGlmIHdlIHdhbnRlZCB0byByZWdpc3RlciBuZXcgc2libGluZ3MgYWxsIHRoZSB0aW1lIGhlcmUgY2FsbAorICAgICAgICAgICAgICogX19rbXBfZ2V0X2d0aWQoKTsgKi8KKyAgICAgICAgICAgIHJldHVybiBUUlVFOworCisgICAgICAgIGNhc2UgRExMX1RIUkVBRF9ERVRBQ0g6CisgICAgICAgICAgICBLQV9UUkFDRSggMTAsICgiRGxsTWFpbjogVEhSRUFEX0RFVEFDSCBUIyVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9nZXRfc3BlY2lmaWMoKSApKTsKKworICAgICAgICAgICAgX19rbXBfaW50ZXJuYWxfZW5kX3RocmVhZCggX19rbXBfZ3RpZF9nZXRfc3BlY2lmaWMoKSApOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKyMgZW5kaWYgLyogS01QX09TX1dJTkRPV1MgKi8KKyNlbmRpZiAvKiBHVUlERURMTF9FWFBPUlRTICovCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIENoYW5nZSB0aGUgbGlicmFyeSB0eXBlIHRvICJzdGF0dXMiIGFuZCByZXR1cm4gdGhlIG9sZCB0eXBlICovCisvKiBjYWxsZWQgZnJvbSB3aXRoaW4gaW5pdGlhbGl6YXRpb24gcm91dGluZXMgd2hlcmUgX19rbXBfaW5pdHpfbG9jayBpcyBoZWxkICovCitpbnQKK19fa21wX2NoYW5nZV9saWJyYXJ5KCBpbnQgc3RhdHVzICkKK3sKKyAgICBpbnQgb2xkX3N0YXR1czsKKworICAgIG9sZF9zdGF0dXMgPSBfX2ttcF95aWVsZF9pbml0ICYgMTsgIC8vIGNoZWNrIHdoZXRoZXIgS01QX0xJQlJBUlk9dGhyb3VnaHB1dCAoZXZlbiBpbml0IGNvdW50KQorCisgICAgaWYgKHN0YXR1cykgeworICAgICAgICBfX2ttcF95aWVsZF9pbml0IHw9IDE7ICAvLyB0aHJvdWdocHV0ID0+IHR1cm5hcm91bmQgKG9kZCBpbml0IGNvdW50KQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgX19rbXBfeWllbGRfaW5pdCAmPSB+MTsgLy8gdHVybmFyb3VuZCA9PiB0aHJvdWdocHV0IChldmVuIGluaXQgY291bnQpCisgICAgfQorCisgICAgcmV0dXJuIG9sZF9zdGF0dXM7ICAvLyByZXR1cm4gcHJldmlvdXMgc2V0dGluZyBvZiB3aGV0aGVyIEtNUF9MSUJSQVJZPXRocm91Z2hwdXQKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogX19rbXBfcGFyYWxsZWxfZGVvIC0tCisgKiBXYWl0IHVudGlsIGl0J3Mgb3VyIHR1cm4uCisgKi8KK3ZvaWQKK19fa21wX3BhcmFsbGVsX2RlbyggaW50ICpndGlkX3JlZiwgaW50ICpjaWRfcmVmLCBpZGVudF90ICpsb2NfcmVmICkKK3sKKyAgICBpbnQgZ3RpZCA9ICpndGlkX3JlZjsKKyNpZmRlZiBCVUlMRF9QQVJBTExFTF9PUkRFUkVECisgICAga21wX3RlYW1fdCAqdGVhbSA9IF9fa21wX3RlYW1fZnJvbV9ndGlkKCBndGlkICk7CisjZW5kaWYgLyogQlVJTERfUEFSQUxMRUxfT1JERVJFRCAqLworCisgICAgaWYoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgaWYoIF9fa21wX3RocmVhZHNbZ3RpZF0tPnRoLnRoX3Jvb3QtPnIucl9hY3RpdmUgKQorICAgICAgICAgICAgX19rbXBfcHVzaF9zeW5jKCBndGlkLCBjdF9vcmRlcmVkX2luX3BhcmFsbGVsLCBsb2NfcmVmLCBOVUxMICk7CisgICAgfQorI2lmZGVmIEJVSUxEX1BBUkFMTEVMX09SREVSRUQKKyAgICBpZiggIXRlYW0tPnQudF9zZXJpYWxpemVkICkgeworICAgICAgICBrbXBfdWludDMyICBzcGluczsKKworICAgICAgICBLTVBfTUIoKTsKKyAgICAgICAgS01QX1dBSVRfWUlFTEQoJnRlYW0tPnQudF9vcmRlcmVkLmR0LnRfdmFsdWUsIF9fa21wX3RpZF9mcm9tX2d0aWQoIGd0aWQgKSwgS01QX0VRLCBOVUxMKTsKKyAgICAgICAgS01QX01CKCk7CisgICAgfQorI2VuZGlmIC8qIEJVSUxEX1BBUkFMTEVMX09SREVSRUQgKi8KK30KKworLyogX19rbXBfcGFyYWxsZWxfZHhvIC0tCisgKiBTaWduYWwgdGhlIG5leHQgdGFzay4KKyAqLworCit2b2lkCitfX2ttcF9wYXJhbGxlbF9keG8oIGludCAqZ3RpZF9yZWYsIGludCAqY2lkX3JlZiwgaWRlbnRfdCAqbG9jX3JlZiApCit7CisgICAgaW50IGd0aWQgPSAqZ3RpZF9yZWY7CisjaWZkZWYgQlVJTERfUEFSQUxMRUxfT1JERVJFRAorICAgIGludCB0aWQgPSAgX19rbXBfdGlkX2Zyb21fZ3RpZCggZ3RpZCApOworICAgIGttcF90ZWFtX3QgKnRlYW0gPSBfX2ttcF90ZWFtX2Zyb21fZ3RpZCggZ3RpZCApOworI2VuZGlmIC8qIEJVSUxEX1BBUkFMTEVMX09SREVSRUQgKi8KKworICAgIGlmKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIGlmKCBfX2ttcF90aHJlYWRzW2d0aWRdLT50aC50aF9yb290LT5yLnJfYWN0aXZlICkKKyAgICAgICAgICAgIF9fa21wX3BvcF9zeW5jKCBndGlkLCBjdF9vcmRlcmVkX2luX3BhcmFsbGVsLCBsb2NfcmVmICk7CisgICAgfQorI2lmZGVmIEJVSUxEX1BBUkFMTEVMX09SREVSRUQKKyAgICBpZiAoICEgdGVhbS0+dC50X3NlcmlhbGl6ZWQgKSB7CisgICAgICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgICAgIC8qIHVzZSB0aGUgdGlkIG9mIHRoZSBuZXh0IHRocmVhZCBpbiB0aGlzIHRlYW0gKi8KKyAgICAgICAgLyogVE9ETyByZXBsZWFjZSB3aXRoIGdlbmVyYWwgcmVsZWFzZSBwcm9jZWR1cmUgKi8KKyAgICAgICAgdGVhbS0+dC50X29yZGVyZWQuZHQudF92YWx1ZSA9ICgodGlkICsgMSkgJSB0ZWFtLT50LnRfbnByb2MgKTsKKworICAgICAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKyAgICB9CisjZW5kaWYgLyogQlVJTERfUEFSQUxMRUxfT1JERVJFRCAqLworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBUaGUgQkFSUklFUiBmb3IgYSBTSU5HTEUgcHJvY2VzcyBzZWN0aW9uIGlzIGFsd2F5cyBleHBsaWNpdCAgICovCisKK2ludAorX19rbXBfZW50ZXJfc2luZ2xlKCBpbnQgZ3RpZCwgaWRlbnRfdCAqaWRfcmVmLCBpbnQgcHVzaF93cyApCit7CisgICAgaW50IHN0YXR1czsKKyAgICBrbXBfaW5mb190ICp0aDsKKyAgICBrbXBfdGVhbV90ICp0ZWFtOworCisgICAgaWYoICEgVENSXzQoX19rbXBfaW5pdF9wYXJhbGxlbCkgKQorICAgICAgICBfX2ttcF9wYXJhbGxlbF9pbml0aWFsaXplKCk7CisKKyAgICB0aCAgID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworICAgIHRlYW0gPSB0aC0+dGgudGhfdGVhbTsKKyAgICBzdGF0dXMgPSAwOworCisgICAgdGgtPnRoLnRoX2lkZW50ID0gaWRfcmVmOworCisgICAgaWYgKCB0ZWFtLT50LnRfc2VyaWFsaXplZCApIHsKKyAgICAgICAgc3RhdHVzID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgICBrbXBfaW50MzIgb2xkX3RoaXMgPSB0aC0+dGgudGhfbG9jYWwudGhpc19jb25zdHJ1Y3Q7CisKKyAgICAgICAgKyt0aC0+dGgudGhfbG9jYWwudGhpc19jb25zdHJ1Y3Q7CisgICAgICAgIC8qIHRyeSB0byBzZXQgdGVhbSBjb3VudCB0byB0aHJlYWQgY291bnQtLXN1Y2Nlc3MgbWVhbnMgdGhyZWFkIGdvdCB0aGUKKyAgICAgICAgICAgc2luZ2xlIGJsb2NrCisgICAgICAgICovCisgICAgICAgIC8qIFRPRE86IFNob3VsZCB0aGlzIGJlIGFjcXVpcmUgb3IgcmVsZWFzZT8gKi8KKyAgICAgICAgc3RhdHVzID0gS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTMyKCZ0ZWFtLT50LnRfY29uc3RydWN0LCBvbGRfdGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoLT50aC50aF9sb2NhbC50aGlzX2NvbnN0cnVjdCk7CisgICAgfQorCisgICAgaWYoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgaWYgKHN0YXR1cyAmJiBwdXNoX3dzKSB7CisgICAgICAgICAgICBfX2ttcF9wdXNoX3dvcmtzaGFyZSggZ3RpZCwgY3RfcHNpbmdsZSwgaWRfcmVmICk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBfX2ttcF9jaGVja193b3Jrc2hhcmUoIGd0aWQsIGN0X3BzaW5nbGUsIGlkX3JlZiApOworICAgICAgICB9CisgICAgfQorI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBpZiAoIHN0YXR1cyApIHsKKyAgICAgICAgX19rbXBfaXR0X3NpbmdsZV9zdGFydCggZ3RpZCApOworICAgIH0KKyAgICBpZiggX19pdHRfbWV0YWRhdGFfYWRkX3B0ciAmJiBfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSA9PSAzICkgeworICAgICAgICBfX2ttcF9pdHRfbWV0YWRhdGFfc2luZ2xlKCk7CisgICAgfQorCisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3ZvaWQKK19fa21wX2V4aXRfc2luZ2xlKCBpbnQgZ3RpZCApCit7CisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9zaW5nbGVfZW5kKCBndGlkICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworICAgIGlmKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKQorICAgICAgICBfX2ttcF9wb3Bfd29ya3NoYXJlKCBndGlkLCBjdF9wc2luZ2xlLCBOVUxMICk7Cit9CisKKworLyoKKyAqIGRldGVybWluZSBpZiB3ZSBjYW4gZ28gcGFyYWxsZWwgb3IgbXVzdCB1c2UgYSBzZXJpYWxpemVkIHBhcmFsbGVsIHJlZ2lvbiBhbmQKKyAqIGhvdyBtYW55IHRocmVhZHMgd2UgY2FuIHVzZQorICogc2V0X25wcm9jIGlzIHRoZSBudW1iZXIgb2YgdGhyZWFkcyByZXF1ZXN0ZWQgZm9yIHRoZSB0ZWFtCisgKiByZXR1cm5zIDAgaWYgd2Ugc2hvdWxkIHNlcmlhbGl6ZSBvciBvbmx5IHVzZSBvbmUgdGhyZWFkLAorICogb3RoZXJ3aXNlIHRoZSBudW1iZXIgb2YgdGhyZWFkcyB0byB1c2UKKyAqIFRoZSBmb3Jram9pbiBsb2NrIGlzIGhlbGQgYnkgdGhlIGNhbGxlci4KKyAqLworc3RhdGljIGludAorX19rbXBfcmVzZXJ2ZV90aHJlYWRzKCBrbXBfcm9vdF90ICpyb290LCBrbXBfdGVhbV90ICpwYXJlbnRfdGVhbSwKKyAgIGludCBtYXN0ZXJfdGlkLCBpbnQgc2V0X250aHJlYWRzCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgLCBpbnQgZW50ZXJfdGVhbXMKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworKQoreworICAgIGludCBjYXBhY2l0eTsKKyAgICBpbnQgbmV3X250aHJlYWRzOworICAgIGludCB1c2Vfcm1sX3RvX2FkanVzdF9udGg7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCByb290ICYmIHBhcmVudF90ZWFtICk7CisKKyAgICAvLworICAgIC8vIEluaXRpYWwgY2hlY2sgdG8gc2VlIGlmIHdlIHNob3VsZCB1c2UgYSBzZXJpYWxpemVkIHRlYW0uCisgICAgLy8KKyAgICBpZiAoIHNldF9udGhyZWFkcyA9PSAxICkgeworICAgICAgICBLQ19UUkFDRSggMTAsICggIl9fa21wX3Jlc2VydmVfdGhyZWFkczogVCMlZCByZXNlcnZpbmcgMSB0aHJlYWQ7IHJlcXVlc3RlZCAlZCB0aHJlYWRzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ2V0X2d0aWQoKSwgc2V0X250aHJlYWRzICkpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYgKCAoICFnZXRfX25lc3RlZF8yKHBhcmVudF90ZWFtLG1hc3Rlcl90aWQpICYmIChyb290LT5yLnJfaW5fcGFyYWxsZWwKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICYmICFlbnRlcl90ZWFtcworI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisgICAgICAgKSApIHx8ICggX19rbXBfbGlicmFyeSA9PSBsaWJyYXJ5X3NlcmlhbCApICkgeworICAgICAgICBLQ19UUkFDRSggMTAsICggIl9fa21wX3Jlc2VydmVfdGhyZWFkczogVCMlZCBzZXJpYWxpemluZyB0ZWFtOyByZXF1ZXN0ZWQgJWQgdGhyZWFkc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2dldF9ndGlkKCksIHNldF9udGhyZWFkcyApKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBJZiBkeW4tdmFyIGlzIHNldCwgZHluYW1pY2FsbHkgYWRqdXN0IHRoZSBudW1iZXIgb2YgZGVzaXJlZCB0aHJlYWRzLAorICAgIC8vIGFjY29yZGluZyB0byB0aGUgbWV0aG9kIHNwZWNpZmllZCBieSBkeW5hbWljX21vZGUuCisgICAgLy8KKyAgICBuZXdfbnRocmVhZHMgPSBzZXRfbnRocmVhZHM7CisgICAgdXNlX3JtbF90b19hZGp1c3RfbnRoID0gRkFMU0U7CisgICAgaWYgKCAhIGdldF9fZHluYW1pY18yKCBwYXJlbnRfdGVhbSwgbWFzdGVyX3RpZCApICkgeworICAgICAgICA7CisgICAgfQorI2lmZGVmIFVTRV9MT0FEX0JBTEFOQ0UKKyAgICBlbHNlIGlmICggX19rbXBfZ2xvYmFsLmcuZ19keW5hbWljX21vZGUgPT0gZHluYW1pY19sb2FkX2JhbGFuY2UgKSB7CisgICAgICAgIG5ld19udGhyZWFkcyA9IF9fa21wX2xvYWRfYmFsYW5jZV9ucHJvYyggcm9vdCwgc2V0X250aHJlYWRzICk7CisgICAgICAgIGlmICggbmV3X250aHJlYWRzID09IDEgKSB7CisgICAgICAgICAgICBLQ19UUkFDRSggMTAsICggIl9fa21wX3Jlc2VydmVfdGhyZWFkczogVCMlZCBsb2FkIGJhbGFuY2UgcmVkdWNlZCByZXNlcnZhdGlvbiB0byAxIHRocmVhZFxuIiwKKyAgICAgICAgICAgICAgbWFzdGVyX3RpZCApKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIGlmICggbmV3X250aHJlYWRzIDwgc2V0X250aHJlYWRzICkgeworICAgICAgICAgICAgS0NfVFJBQ0UoIDEwLCAoICJfX2ttcF9yZXNlcnZlX3RocmVhZHM6IFQjJWQgbG9hZCBiYWxhbmNlIHJlZHVjZWQgcmVzZXJ2YXRpb24gdG8gJWQgdGhyZWFkc1xuIiwKKyAgICAgICAgICAgICAgbWFzdGVyX3RpZCwgbmV3X250aHJlYWRzICkpOworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8qIFVTRV9MT0FEX0JBTEFOQ0UgKi8KKyAgICBlbHNlIGlmICggX19rbXBfZ2xvYmFsLmcuZ19keW5hbWljX21vZGUgPT0gZHluYW1pY190aHJlYWRfbGltaXQgKSB7CisgICAgICAgIG5ld19udGhyZWFkcyA9IF9fa21wX2F2YWlsX3Byb2MgLSBfX2ttcF9udGggKyAocm9vdC0+ci5yX2FjdGl2ZSA/IDEKKyAgICAgICAgICA6IHJvb3QtPnIucl9ob3RfdGVhbS0+dC50X25wcm9jKTsKKyAgICAgICAgaWYgKCBuZXdfbnRocmVhZHMgPD0gMSApIHsKKyAgICAgICAgICAgIEtDX1RSQUNFKCAxMCwgKCAiX19rbXBfcmVzZXJ2ZV90aHJlYWRzOiBUIyVkIHRocmVhZCBsaW1pdCByZWR1Y2VkIHJlc2VydmF0aW9uIHRvIDEgdGhyZWFkXG4iLAorICAgICAgICAgICAgICBtYXN0ZXJfdGlkICkpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBuZXdfbnRocmVhZHMgPCBzZXRfbnRocmVhZHMgKSB7CisgICAgICAgICAgICBLQ19UUkFDRSggMTAsICggIl9fa21wX3Jlc2VydmVfdGhyZWFkczogVCMlZCB0aHJlYWQgbGltaXQgcmVkdWNlZCByZXNlcnZhdGlvbiB0byAlZCB0aHJlYWRzXG4iLAorICAgICAgICAgICAgICBtYXN0ZXJfdGlkLCBuZXdfbnRocmVhZHMgKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBuZXdfbnRocmVhZHMgPSBzZXRfbnRocmVhZHM7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoIF9fa21wX2dsb2JhbC5nLmdfZHluYW1pY19tb2RlID09IGR5bmFtaWNfcmFuZG9tICkgeworICAgICAgICBpZiAoIHNldF9udGhyZWFkcyA+IDIgKSB7CisgICAgICAgICAgICBuZXdfbnRocmVhZHMgPSBfX2ttcF9nZXRfcmFuZG9tKCBwYXJlbnRfdGVhbS0+dC50X3RocmVhZHNbbWFzdGVyX3RpZF0gKTsKKyAgICAgICAgICAgIG5ld19udGhyZWFkcyA9ICggbmV3X250aHJlYWRzICUgc2V0X250aHJlYWRzICkgKyAxOworICAgICAgICAgICAgaWYgKCBuZXdfbnRocmVhZHMgPT0gMSApIHsKKyAgICAgICAgICAgICAgICBLQ19UUkFDRSggMTAsICggIl9fa21wX3Jlc2VydmVfdGhyZWFkczogVCMlZCBkeW5hbWljIHJhbmRvbSByZWR1Y2VkIHJlc2VydmF0aW9uIHRvIDEgdGhyZWFkXG4iLAorICAgICAgICAgICAgICAgICAgbWFzdGVyX3RpZCApKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggbmV3X250aHJlYWRzIDwgc2V0X250aHJlYWRzICkgeworICAgICAgICAgICAgICAgIEtDX1RSQUNFKCAxMCwgKCAiX19rbXBfcmVzZXJ2ZV90aHJlYWRzOiBUIyVkIGR5bmFtaWMgcmFuZG9tIHJlZHVjZWQgcmVzZXJ2YXRpb24gdG8gJWQgdGhyZWFkc1xuIiwKKyAgICAgICAgICAgICAgICAgIG1hc3Rlcl90aWQsIG5ld19udGhyZWFkcyApKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgS01QX0FTU0VSVCggMCApOworICAgIH0KKworICAgIC8vCisgICAgLy8gUmVzcGVjdCBLTVBfQUxMX1RIUkVBRFMsIEtNUF9NQVhfVEhSRUFEUywgT01QX1RIUkVBRF9MSU1JVC4KKyAgICAvLworICAgIGlmICggX19rbXBfbnRoICsgbmV3X250aHJlYWRzIC0gKCByb290LT5yLnJfYWN0aXZlID8gMSA6CisgICAgICByb290LT5yLnJfaG90X3RlYW0tPnQudF9ucHJvYyApID4gX19rbXBfbWF4X250aCApIHsKKyAgICAgICAgaW50IHRsX250aHJlYWRzID0gX19rbXBfbWF4X250aCAtIF9fa21wX250aCArICggcm9vdC0+ci5yX2FjdGl2ZSA/IDEgOgorICAgICAgICAgIHJvb3QtPnIucl9ob3RfdGVhbS0+dC50X25wcm9jICk7CisgICAgICAgIGlmICggdGxfbnRocmVhZHMgPD0gMCApIHsKKyAgICAgICAgICAgIHRsX250aHJlYWRzID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIElmIGR5bi12YXIgaXMgZmFsc2UsIGVtaXQgYSAxLXRpbWUgd2FybmluZy4KKyAgICAgICAgLy8KKyAgICAgICAgaWYgKCAhIGdldF9fZHluYW1pY18yKCBwYXJlbnRfdGVhbSwgbWFzdGVyX3RpZCApCisgICAgICAgICAgJiYgKCAhIF9fa21wX3Jlc2VydmVfd2FybiApICkgeworICAgICAgICAgICAgX19rbXBfcmVzZXJ2ZV93YXJuID0gMTsKKyAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICBrbXBfbXNfd2FybmluZywKKyAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50Rm9ybVRoclRlYW0sIHNldF9udGhyZWFkcywgdGxfbnRocmVhZHMgKSwKKyAgICAgICAgICAgICAgICBLTVBfSE5UKCBVbnNldF9BTExfVEhSRUFEUyApLAorICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICApOworICAgICAgICB9CisgICAgICAgIGlmICggdGxfbnRocmVhZHMgPT0gMSApIHsKKyAgICAgICAgICAgIEtDX1RSQUNFKCAxMCwgKCAiX19rbXBfcmVzZXJ2ZV90aHJlYWRzOiBUIyVkIEtNUF9BTExfVEhSRUFEUyByZWR1Y2VkIHJlc2VydmF0aW9uIHRvIDEgdGhyZWFkXG4iLAorICAgICAgICAgICAgICBtYXN0ZXJfdGlkICkpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgS0NfVFJBQ0UoIDEwLCAoICJfX2ttcF9yZXNlcnZlX3RocmVhZHM6IFQjJWQgS01QX0FMTF9USFJFQURTIHJlZHVjZWQgcmVzZXJ2YXRpb24gdG8gJWQgdGhyZWFkc1xuIiwKKyAgICAgICAgICBtYXN0ZXJfdGlkLCB0bF9udGhyZWFkcyApKTsKKyAgICAgICAgbmV3X250aHJlYWRzID0gdGxfbnRocmVhZHM7CisgICAgfQorCisKKyAgICAvLworICAgIC8vIENoZWNrIGlmIHRoZSB0aHJlYWRzIGFycmF5IGlzIGxhcmdlIGVub3VnaCwgb3IgbmVlZHMgZXhwYW5kaW5nLgorICAgIC8vCisgICAgLy8gU2VlIGNvbW1lbnQgaW4gX19rbXBfcmVnaXN0ZXJfcm9vdCgpIGFib3V0IHRoZSBhZGp1c3RtZW50IGlmCisgICAgLy8gX19rbXBfdGhyZWFkc1swXSA9PSBOVUxMLgorICAgIC8vCisgICAgY2FwYWNpdHkgPSBfX2ttcF90aHJlYWRzX2NhcGFjaXR5OworICAgIGlmICggVENSX1BUUihfX2ttcF90aHJlYWRzWzBdKSA9PSBOVUxMICkgeworICAgICAgICAtLWNhcGFjaXR5OworICAgIH0KKyAgICBpZiAoIF9fa21wX250aCArIG5ld19udGhyZWFkcyAtICggcm9vdC0+ci5yX2FjdGl2ZSA/IDEgOgorICAgICAgcm9vdC0+ci5yX2hvdF90ZWFtLT50LnRfbnByb2MgKSA+IGNhcGFjaXR5ICkgeworICAgICAgICAvLworICAgICAgICAvLyBFeHBhbmQgdGhlIHRocmVhZHMgYXJyYXkuCisgICAgICAgIC8vCisgICAgICAgIGludCBzbG90c1JlcXVpcmVkID0gX19rbXBfbnRoICsgbmV3X250aHJlYWRzIC0gKCByb290LT5yLnJfYWN0aXZlID8gMSA6CisgICAgICAgICAgcm9vdC0+ci5yX2hvdF90ZWFtLT50LnRfbnByb2MgKSAtIGNhcGFjaXR5OworICAgICAgICBpbnQgc2xvdHNBZGRlZCA9IF9fa21wX2V4cGFuZF90aHJlYWRzKHNsb3RzUmVxdWlyZWQsIHNsb3RzUmVxdWlyZWQpOworICAgICAgICBpZiAoIHNsb3RzQWRkZWQgPCBzbG90c1JlcXVpcmVkICkgeworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFRoZSB0aHJlYWRzIGFycmF5IHdhcyBub3QgZXhwYW5kZWQgZW5vdWdoLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIG5ld19udGhyZWFkcyAtPSAoIHNsb3RzUmVxdWlyZWQgLSBzbG90c0FkZGVkICk7CisgICAgICAgICAgICBLTVBfQVNTRVJUKCBuZXdfbnRocmVhZHMgPj0gMSApOworCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gSWYgZHluLXZhciBpcyBmYWxzZSwgZW1pdCBhIDEtdGltZSB3YXJuaW5nLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGlmICggISBnZXRfX2R5bmFtaWNfMiggcGFyZW50X3RlYW0sIG1hc3Rlcl90aWQgKQorICAgICAgICAgICAgICAmJiAoICEgX19rbXBfcmVzZXJ2ZV93YXJuICkgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfcmVzZXJ2ZV93YXJuID0gMTsKKyAgICAgICAgICAgICAgICBpZiAoIF9fa21wX3RwX2NhY2hlZCApIHsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgICAgICAgICAga21wX21zX3dhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50Rm9ybVRoclRlYW0sIHNldF9udGhyZWFkcywgbmV3X250aHJlYWRzICksCisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfSE5UKCBTZXRfQUxMX1RIUkVBRFBSSVZBVEUsIF9fa21wX3RwX2NhcGFjaXR5ICksCisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfSE5UKCBQb3NzaWJsZVN5c3RlbUxpbWl0T25UaHJlYWRzICksCisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgICAgICAgICAga21wX21zX3dhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50Rm9ybVRoclRlYW0sIHNldF9udGhyZWFkcywgbmV3X250aHJlYWRzICksCisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfSE5UKCBTeXN0ZW1MaW1pdE9uVGhyZWFkcyApLAorICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIG5ld19udGhyZWFkcyA9PSAxICkgeworICAgICAgICBLQ19UUkFDRSggMTAsICggIl9fa21wX3Jlc2VydmVfdGhyZWFkczogVCMlZCBzZXJpYWxpemluZyB0ZWFtIGFmdGVyIHJlY2xhaW1pbmcgZGVhZCByb290cyBhbmQgcmVjaGVja2luZzsgcmVxdWVzdGVkICVkIHRocmVhZHNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9nZXRfZ3RpZCgpLCBzZXRfbnRocmVhZHMgKSApOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBLQ19UUkFDRSggMTAsICggIl9fa21wX3Jlc2VydmVfdGhyZWFkczogVCMlZCBhbGxvY2F0aW5nICVkIHRocmVhZHM7IHJlcXVlc3RlZCAlZCB0aHJlYWRzXG4iLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9nZXRfZ3RpZCgpLCBuZXdfbnRocmVhZHMsIHNldF9udGhyZWFkcyApKTsKKyAgICByZXR1cm4gbmV3X250aHJlYWRzOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBhbGxvY2F0ZSB0aHJlYWRzIGZyb20gdGhlIHRocmVhZCBwb29sIGFuZCBhc3NpZ24gdGhlbSB0byB0aGUgbmV3IHRlYW0gKi8KKy8qIHdlIGFyZSBhc3N1cmVkIHRoYXQgdGhlcmUgYXJlIGVub3VnaCB0aHJlYWRzIGF2YWlsYWJsZSwgYmVjYXVzZSB3ZQorICogY2hlY2tlZCBvbiB0aGF0IGVhcmxpZXIgd2l0aGluIGNyaXRpY2FsIHNlY3Rpb24gZm9ya2pvaW4gKi8KKworc3RhdGljIHZvaWQKK19fa21wX2ZvcmtfdGVhbV90aHJlYWRzKCBrbXBfcm9vdF90ICpyb290LCBrbXBfdGVhbV90ICp0ZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbmZvX3QgKm1hc3Rlcl90aCwgaW50IG1hc3Rlcl9ndGlkICkKK3sKKyAgICBpbnQgICAgICAgICBpOworICAgIGludCB1c2VfaG90X3RlYW07CisKKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfZm9ya190ZWFtX3RocmVhZHM6IG5ld19ucHJvY3MgPSAlZFxuIiwgdGVhbS0+dC50X25wcm9jICkgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBtYXN0ZXJfZ3RpZCA9PSBfX2ttcF9nZXRfZ3RpZCgpICk7CisgICAgS01QX01CKCk7CisKKyAgICAvKiBmaXJzdCwgbGV0J3Mgc2V0dXAgdGhlIG1hc3RlciB0aHJlYWQgKi8KKyAgICBtYXN0ZXJfdGgtPnRoLnRoX2luZm8uZHMuZHNfdGlkICA9IDA7CisgICAgbWFzdGVyX3RoLT50aC50aF90ZWFtICAgICAgICAgICAgPSB0ZWFtOworICAgIG1hc3Rlcl90aC0+dGgudGhfdGVhbV9ucHJvYyAgICAgID0gdGVhbS0+dC50X25wcm9jOworICAgIG1hc3Rlcl90aC0+dGgudGhfdGVhbV9tYXN0ZXIgICAgID0gbWFzdGVyX3RoOworICAgIG1hc3Rlcl90aC0+dGgudGhfdGVhbV9zZXJpYWxpemVkID0gRkFMU0U7CisgICAgbWFzdGVyX3RoLT50aC50aF9kaXNwYXRjaCAgICAgICAgPSAmIHRlYW0tPnQudF9kaXNwYXRjaFsgMCBdOworCisgICAgLyogbWFrZSBzdXJlIHdlIGFyZSBub3QgdGhlIG9wdGltaXplZCBob3QgdGVhbSAqLworI2lmIEtNUF9ORVNURURfSE9UX1RFQU1TCisgICAgdXNlX2hvdF90ZWFtID0gMDsKKyAgICBrbXBfaG90X3RlYW1fcHRyX3QgKmhvdF90ZWFtcyA9IG1hc3Rlcl90aC0+dGgudGhfaG90X3RlYW1zOworICAgIGlmKCBob3RfdGVhbXMgKSB7ICAvLyBob3QgdGVhbXMgYXJyYXkgaXMgbm90IGFsbG9jYXRlZCBpZiBLTVBfSE9UX1RFQU1TX01BWF9MRVZFTD0wCisgICAgICAgIGludCBsZXZlbCA9IHRlYW0tPnQudF9hY3RpdmVfbGV2ZWwgLSAxOyAgICAvLyBpbmRleCBpbiBhcnJheSBvZiBob3QgdGVhbXMKKyAgICAgICAgaWYoIG1hc3Rlcl90aC0+dGgudGhfdGVhbXNfbWljcm90YXNrICkgeyAgICAvLyBhcmUgd2UgaW5zaWRlIHRoZSB0ZWFtcz8KKyAgICAgICAgICAgIGlmKCBtYXN0ZXJfdGgtPnRoLnRoX3RlYW1zX3NpemUubnRlYW1zID4gMSApIHsKKyAgICAgICAgICAgICAgICArK2xldmVsOyAvLyBsZXZlbCB3YXMgbm90IGluY3JlYXNlZCBpbiB0ZWFtcyBjb25zdHJ1Y3QgZm9yIHRlYW1fb2ZfbWFzdGVycworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoIHRlYW0tPnQudF9wa2ZuICE9IChtaWNyb3Rhc2tfdClfX2ttcF90ZWFtc19tYXN0ZXIgJiYKKyAgICAgICAgICAgICAgICBtYXN0ZXJfdGgtPnRoLnRoX3RlYW1zX2xldmVsID09IHRlYW0tPnQudF9sZXZlbCApIHsKKyAgICAgICAgICAgICAgICArK2xldmVsOyAvLyBsZXZlbCB3YXMgbm90IGluY3JlYXNlZCBpbiB0ZWFtcyBjb25zdHJ1Y3QgZm9yIHRlYW1fb2Zfd29ya2VycyBiZWZvcmUgdGhlIHBhcmFsbGVsCisgICAgICAgICAgICB9ICAgICAgICAgICAgLy8gdGVhbS0+dC50X2xldmVsIHdpbGwgYmUgaW5jcmVhc2VkIGluc2lkZSBwYXJhbGxlbAorICAgICAgICB9CisgICAgICAgIGlmKCBsZXZlbCA8IF9fa21wX2hvdF90ZWFtc19tYXhfbGV2ZWwgKSB7CisgICAgICAgICAgICBpZiggaG90X3RlYW1zW2xldmVsXS5ob3RfdGVhbSApIHsKKyAgICAgICAgICAgICAgICAvLyBob3QgdGVhbSBoYXMgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBmb3IgZ2l2ZW4gbGV2ZWwKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGhvdF90ZWFtc1tsZXZlbF0uaG90X3RlYW0gPT0gdGVhbSk7CisgICAgICAgICAgICAgICAgdXNlX2hvdF90ZWFtID0gMTsgLy8gdGhlIHRlYW0gaXMgcmVhZHkgdG8gdXNlCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHVzZV9ob3RfdGVhbSA9IDA7IC8vIEFDOiB0aHJlYWRzIGFyZSBub3QgYWxsb2NhdGVkIHlldAorICAgICAgICAgICAgICAgIGhvdF90ZWFtc1tsZXZlbF0uaG90X3RlYW0gPSB0ZWFtOyAvLyByZW1lbWJlciBuZXcgaG90IHRlYW0KKyAgICAgICAgICAgICAgICBob3RfdGVhbXNbbGV2ZWxdLmhvdF90ZWFtX250aCA9IHRlYW0tPnQudF9ucHJvYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHVzZV9ob3RfdGVhbSA9IDA7CisgICAgICAgIH0KKyAgICB9CisjZWxzZQorICAgIHVzZV9ob3RfdGVhbSA9IHRlYW0gPT0gcm9vdC0+ci5yX2hvdF90ZWFtOworI2VuZGlmCisgICAgaWYgKCAhdXNlX2hvdF90ZWFtICkgeworCisgICAgICAgIC8qIGluc3RhbGwgdGhlIG1hc3RlciB0aHJlYWQgKi8KKyAgICAgICAgdGVhbS0+dC50X3RocmVhZHNbIDAgXSAgICA9IG1hc3Rlcl90aDsKKyAgICAgICAgX19rbXBfaW5pdGlhbGl6ZV9pbmZvKCBtYXN0ZXJfdGgsIHRlYW0sIDAsIG1hc3Rlcl9ndGlkICk7CisKKyAgICAgICAgLyogbm93LCBpbnN0YWxsIHRoZSB3b3JrZXIgdGhyZWFkcyAqLworICAgICAgICBmb3IgKCBpPTEgOyAgaSA8IHRlYW0tPnQudF9ucHJvYyA7IGkrKyApIHsKKworICAgICAgICAgICAgLyogZm9yayBvciByZWFsbG9jYXRlIGEgbmV3IHRocmVhZCBhbmQgaW5zdGFsbCBpdCBpbiB0ZWFtICovCisgICAgICAgICAgICBrbXBfaW5mb190ICp0aHIgPSBfX2ttcF9hbGxvY2F0ZV90aHJlYWQoIHJvb3QsIHRlYW0sIGkgKTsKKyAgICAgICAgICAgIHRlYW0tPnQudF90aHJlYWRzWyBpIF0gPSB0aHI7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0aHIgKTsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHRoci0+dGgudGhfdGVhbSA9PSB0ZWFtICk7CisgICAgICAgICAgICAvKiBhbGlnbiB0ZWFtIGFuZCB0aHJlYWQgYXJyaXZlZCBzdGF0ZXMgKi8KKyAgICAgICAgICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9mb3JrX3RlYW1fdGhyZWFkczogVCMlZCglZDolZCkgaW5pdCBhcnJpdmVkIFQjJWQoJWQ6JWQpIGpvaW4gPSV1LCBwbGFpbj0ldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGlkKCAwLCB0ZWFtICksIHRlYW0tPnQudF9pZCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGlkKCBpLCB0ZWFtICksIHRlYW0tPnQudF9pZCwgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfYmFyWyBic19mb3Jram9pbl9iYXJyaWVyIF0uYl9hcnJpdmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9iYXJbIGJzX3BsYWluX2JhcnJpZXIgXS5iX2Fycml2ZWQgKSApOworI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgICB0aHItPnRoLnRoX3RlYW1zX21pY3JvdGFzayA9IG1hc3Rlcl90aC0+dGgudGhfdGVhbXNfbWljcm90YXNrOworICAgICAgICAgICAgdGhyLT50aC50aF90ZWFtc19sZXZlbCAgICAgPSBtYXN0ZXJfdGgtPnRoLnRoX3RlYW1zX2xldmVsOworICAgICAgICAgICAgdGhyLT50aC50aF90ZWFtc19zaXplICAgICAgPSBtYXN0ZXJfdGgtPnRoLnRoX3RlYW1zX3NpemU7CisjZW5kaWYKKyAgICAgICAgICAgIHsgLy8gSW5pdGlhbGl6ZSB0aHJlYWRzJyBiYXJyaWVyIGRhdGEuCisgICAgICAgICAgICAgICAgaW50IGI7CisgICAgICAgICAgICAgICAga21wX2JhbGlnbl90ICogYmFsaWduID0gdGVhbS0+dC50X3RocmVhZHNbIGkgXS0+dGgudGhfYmFyOworICAgICAgICAgICAgICAgIGZvciAoIGIgPSAwOyBiIDwgYnNfbGFzdF9iYXJyaWVyOyArKyBiICkgeworICAgICAgICAgICAgICAgICAgICBiYWxpZ25bIGIgXS5iYi5iX2Fycml2ZWQgICAgICAgID0gdGVhbS0+dC50X2JhclsgYiBdLmJfYXJyaXZlZDsKKyAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChiYWxpZ25bYl0uYmIud2FpdF9mbGFnICE9IEtNUF9CQVJSSUVSX1BBUkVOVF9GTEFHKTsKKyAgICAgICAgICAgICAgICB9OyAvLyBmb3IgYgorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyNpZiBPTVBfNDBfRU5BQkxFRCAmJiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgICAgIF9fa21wX3BhcnRpdGlvbl9wbGFjZXMoIHRlYW0gKTsKKyNlbmRpZgorCisgICAgfQorCisgICAgS01QX01CKCk7Cit9CisKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisvLworLy8gUHJvcGFnYXRlIGFueSBjaGFuZ2VzIHRvIHRoZSBmbG9hdGluZyBwb2ludCBjb250cm9sIHJlZ2lzdGVycyBvdXQgdG8gdGhlIHRlYW0KKy8vIFdlIHRyeSB0byBhdm9pZCB1bm5lY2Vzc2FyeSB3cml0ZXMgdG8gdGhlIHJlbGV2YW50IGNhY2hlIGxpbmUgaW4gdGhlIHRlYW0gc3RydWN0dXJlLAorLy8gc28gd2UgZG9uJ3QgbWFrZSBjaGFuZ2VzIHVubGVzcyB0aGV5IGFyZSBuZWVkZWQuCisvLworaW5saW5lIHN0YXRpYyB2b2lkCitwcm9wYWdhdGVGUENvbnRyb2woa21wX3RlYW1fdCAqIHRlYW0pCit7CisgICAgaWYgKCBfX2ttcF9pbmhlcml0X2ZwX2NvbnRyb2wgKSB7CisgICAgICAgIGttcF9pbnQxNiB4ODdfZnB1X2NvbnRyb2xfd29yZDsKKyAgICAgICAga21wX3VpbnQzMiBteGNzcjsKKworICAgICAgICAvLyBHZXQgbWFzdGVyIHZhbHVlcyBvZiBGUFUgY29udHJvbCBmbGFncyAoYm90aCBYODcgYW5kIHZlY3RvcikKKyAgICAgICAgX19rbXBfc3RvcmVfeDg3X2ZwdV9jb250cm9sX3dvcmQoICZ4ODdfZnB1X2NvbnRyb2xfd29yZCApOworICAgICAgICBfX2ttcF9zdG9yZV9teGNzciggJm14Y3NyICk7CisgICAgICAgIG14Y3NyICY9IEtNUF9YODZfTVhDU1JfTUFTSzsKKworICAgICAgICAvLyBUaGVyZSBpcyBubyBwb2ludCBsb29raW5nIGF0IHRfZnBfY29udHJvbF9zYXZlZCBoZXJlLgorICAgICAgICAvLyBJZiBpdCBpcyBUUlVFLCB3ZSBzdGlsbCBoYXZlIHRvIHVwZGF0ZSB0aGUgdmFsdWVzIGlmIHRoZXkgYXJlIGRpZmZlcmVudCBmcm9tIHRob3NlIHdlIG5vdyBoYXZlLgorICAgICAgICAvLyBJZiBpdCBpcyBGQUxTRSB3ZSBkaWRuJ3Qgc2F2ZSBhbnl0aGluZyB5ZXQsIGJ1dCBvdXIgb2JqZWN0aXZlIGlzIHRoZSBzYW1lLiBXZSBoYXZlIHRvIGVuc3VyZQorICAgICAgICAvLyB0aGF0IHRoZSB2YWx1ZXMgaW4gdGhlIHRlYW0gYXJlIHRoZSBzYW1lIGFzIHRob3NlIHdlIGhhdmUuCisgICAgICAgIC8vIFNvLCB0aGlzIGNvZGUgYWNoaWV2ZXMgd2hhdCB3ZSBuZWVkIHdoZXRoZXIgb3Igbm90IHRfZnBfY29udHJvbF9zYXZlZCBpcyB0cnVlLgorICAgICAgICAvLyBCeSBjaGVja2luZyB3aGV0aGVyIHRoZSB2YWx1ZSBuZWVkcyB1cGRhdGluZyB3ZSBhdm9pZCB1bm5lY2Vzc2FyeSB3cml0ZXMgdGhhdCB3b3VsZCBwdXQgdGhlCisgICAgICAgIC8vIGNhY2hlLWxpbmUgaW50byBhIHdyaXR0ZW4gc3RhdGUsIGNhdXNpbmcgYWxsIHRocmVhZHMgaW4gdGhlIHRlYW0gdG8gaGF2ZSB0byByZWFkIGl0IGFnYWluLgorICAgICAgICBpZiAoIHRlYW0tPnQudF94ODdfZnB1X2NvbnRyb2xfd29yZCAhPSB4ODdfZnB1X2NvbnRyb2xfd29yZCApIHsKKyAgICAgICAgICAgIHRlYW0tPnQudF94ODdfZnB1X2NvbnRyb2xfd29yZCA9IHg4N19mcHVfY29udHJvbF93b3JkOworICAgICAgICB9CisgICAgICAgIGlmICggdGVhbS0+dC50X214Y3NyICE9IG14Y3NyICkgeworICAgICAgICAgICAgdGVhbS0+dC50X214Y3NyID0gbXhjc3I7CisgICAgICAgIH0KKyAgICAgICAgLy8gQWx0aG91Z2ggd2UgZG9uJ3QgdXNlIHRoaXMgdmFsdWUsIG90aGVyIGNvZGUgaW4gdGhlIHJ1bnRpbWUgd2FudHMgdG8ga25vdyB3aGV0aGVyIGl0IHNob3VsZCByZXN0b3JlIHRoZW0uCisgICAgICAgIC8vIFNvIHdlIG11c3QgZW5zdXJlIGl0IGlzIGNvcnJlY3QuCisgICAgICAgIGlmICghdGVhbS0+dC50X2ZwX2NvbnRyb2xfc2F2ZWQpIHsKKyAgICAgICAgICAgIHRlYW0tPnQudF9mcF9jb250cm9sX3NhdmVkID0gVFJVRTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLy8gU2ltaWxhcmx5IGhlcmUuIERvbid0IHdyaXRlIHRvIHRoaXMgY2FjaGUtbGluZSBpbiB0aGUgdGVhbSBzdHJ1Y3R1cmUgdW5sZXNzIHdlIGhhdmUgdG8uCisgICAgICAgIGlmICh0ZWFtLT50LnRfZnBfY29udHJvbF9zYXZlZCkKKyAgICAgICAgICAgIHRlYW0tPnQudF9mcF9jb250cm9sX3NhdmVkID0gRkFMU0U7CisgICAgfQorfQorCisvLyBEbyB0aGUgb3Bwb3NpdGUsIHNldHRpbmcgdGhlIGhhcmR3YXJlIHJlZ2lzdGVycyB0byB0aGUgdXBkYXRlZCB2YWx1ZXMgZnJvbSB0aGUgdGVhbS4KK2lubGluZSBzdGF0aWMgdm9pZAordXBkYXRlSFdGUENvbnRyb2woa21wX3RlYW1fdCAqIHRlYW0pCit7CisgICAgaWYgKCBfX2ttcF9pbmhlcml0X2ZwX2NvbnRyb2wgJiYgdGVhbS0+dC50X2ZwX2NvbnRyb2xfc2F2ZWQgKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIE9ubHkgcmVzZXQgdGhlIGZwIGNvbnRyb2wgcmVncyBpZiB0aGV5IGhhdmUgYmVlbiBjaGFuZ2VkIGluIHRoZSB0ZWFtLgorICAgICAgICAvLyB0aGUgcGFyYWxsZWwgcmVnaW9uIHRoYXQgd2UgYXJlIGV4aXRpbmcuCisgICAgICAgIC8vCisgICAgICAgIGttcF9pbnQxNiB4ODdfZnB1X2NvbnRyb2xfd29yZDsKKyAgICAgICAga21wX3VpbnQzMiBteGNzcjsKKyAgICAgICAgX19rbXBfc3RvcmVfeDg3X2ZwdV9jb250cm9sX3dvcmQoICZ4ODdfZnB1X2NvbnRyb2xfd29yZCApOworICAgICAgICBfX2ttcF9zdG9yZV9teGNzciggJm14Y3NyICk7CisgICAgICAgIG14Y3NyICY9IEtNUF9YODZfTVhDU1JfTUFTSzsKKworICAgICAgICBpZiAoIHRlYW0tPnQudF94ODdfZnB1X2NvbnRyb2xfd29yZCAhPSB4ODdfZnB1X2NvbnRyb2xfd29yZCApIHsKKyAgICAgICAgICAgIF9fa21wX2NsZWFyX3g4N19mcHVfc3RhdHVzX3dvcmQoKTsKKyAgICAgICAgICAgIF9fa21wX2xvYWRfeDg3X2ZwdV9jb250cm9sX3dvcmQoICZ0ZWFtLT50LnRfeDg3X2ZwdV9jb250cm9sX3dvcmQgKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggdGVhbS0+dC50X214Y3NyICE9IG14Y3NyICkgeworICAgICAgICAgICAgX19rbXBfbG9hZF9teGNzciggJnRlYW0tPnQudF9teGNzciApOworICAgICAgICB9CisgICAgfQorfQorI2Vsc2UKKyMgZGVmaW5lIHByb3BhZ2F0ZUZQQ29udHJvbCh4KSAoKHZvaWQpMCkKKyMgZGVmaW5lIHVwZGF0ZUhXRlBDb250cm9sKHgpICAoKHZvaWQpMCkKKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisKK3N0YXRpYyB2b2lkCitfX2ttcF9hbGxvY19hcmd2X2VudHJpZXMoIGludCBhcmdjLCBrbXBfdGVhbV90ICp0ZWFtLCBpbnQgcmVhbGxvYyApOyAvLyBmb3J3YXJkIGRlY2xhcmF0aW9uCisKKy8qCisgKiBSdW4gYSBwYXJhbGxlbCByZWdpb24gdGhhdCBoYXMgYmVlbiBzZXJpYWxpemVkLCBzbyBydW5zIG9ubHkgaW4gYSB0ZWFtIG9mIHRoZSBzaW5nbGUgbWFzdGVyIHRocmVhZC4KKyAqLwordm9pZAorX19rbXBfc2VyaWFsaXplZF9wYXJhbGxlbChpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkKQoreworICAgIGttcF9pbmZvX3QgKnRoaXNfdGhyOworICAgIGttcF90ZWFtX3QgKnNlcmlhbF90ZWFtOworCisgICAgS0NfVFJBQ0UoIDEwLCAoIl9fa21wY19zZXJpYWxpemVkX3BhcmFsbGVsOiBjYWxsZWQgYnkgVCMlZFxuIiwgZ2xvYmFsX3RpZCApICk7CisKKyAgICAvKiBTa2lwIGFsbCB0aGlzIGNvZGUgZm9yIGF1dG9wYXIgc2VyaWFsaXplZCBsb29wcyBzaW5jZSBpdCByZXN1bHRzIGluCisgICAgICAgdW5hY2NlcHRhYmxlIG92ZXJoZWFkICovCisgICAgaWYoIGxvYyAhPSBOVUxMICYmIChsb2MtPmZsYWdzICYgS01QX0lERU5UX0FVVE9QQVIgKSApCisgICAgICAgIHJldHVybjsKKworICAgIGlmKCAhIFRDUl80KCBfX2ttcF9pbml0X3BhcmFsbGVsICkgKQorICAgICAgICBfX2ttcF9wYXJhbGxlbF9pbml0aWFsaXplKCk7CisKKyAgICB0aGlzX3RociAgICAgPSBfX2ttcF90aHJlYWRzWyBnbG9iYWxfdGlkIF07CisgICAgc2VyaWFsX3RlYW0gID0gdGhpc190aHItPnRoLnRoX3NlcmlhbF90ZWFtOworCisgICAgLyogdXRpbGl6ZSB0aGUgc2VyaWFsaXplZCB0ZWFtIGhlbGQgYnkgdGhpcyB0aHJlYWQgKi8KKyAgICBLTVBfREVCVUdfQVNTRVJUKCBzZXJpYWxfdGVhbSApOworICAgIEtNUF9NQigpOworCisgICAgaWYgKCBfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYyApIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGhpc190aHItPnRoLnRoX3Rhc2tfdGVhbSA9PSB0aGlzX3Roci0+dGgudGhfdGVhbS0+dC50X3Rhc2tfdGVhbSApOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBzZXJpYWxfdGVhbS0+dC50X3Rhc2tfdGVhbSA9PSBOVUxMICk7CisgICAgICAgIEtBX1RSQUNFKCAyMCwgKCAiX19rbXBjX3NlcmlhbGl6ZWRfcGFyYWxsZWw6IFQjJWQgcHVzaGluZyB0YXNrX3RlYW0gJXAgLyB0ZWFtICVwLCBuZXcgdGFza190ZWFtID0gTlVMTFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbF90aWQsIHRoaXNfdGhyLT50aC50aF90YXNrX3RlYW0sIHRoaXNfdGhyLT50aC50aF90ZWFtICkgKTsKKyAgICAgICAgdGhpc190aHItPnRoLnRoX3Rhc2tfdGVhbSA9IE5VTEw7CisgICAgfQorCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBrbXBfcHJvY19iaW5kX3QgcHJvY19iaW5kID0gdGhpc190aHItPnRoLnRoX3NldF9wcm9jX2JpbmQ7CisgICAgaWYgKCB0aGlzX3Roci0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLnByb2NfYmluZCA9PSBwcm9jX2JpbmRfZmFsc2UgKSB7CisgICAgICAgIHByb2NfYmluZCA9IHByb2NfYmluZF9mYWxzZTsKKyAgICB9CisgICAgZWxzZSBpZiAoIHByb2NfYmluZCA9PSBwcm9jX2JpbmRfZGVmYXVsdCApIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gTm8gcHJvY19iaW5kIGNsYXVzZSB3YXMgc3BlY2lmaWVkLCBzbyB1c2UgdGhlIGN1cnJlbnQgdmFsdWUKKyAgICAgICAgLy8gb2YgcHJvYy1iaW5kLXZhciBmb3IgdGhpcyBwYXJhbGxlbCByZWdpb24uCisgICAgICAgIC8vCisgICAgICAgIHByb2NfYmluZCA9IHRoaXNfdGhyLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMucHJvY19iaW5kOworICAgIH0KKyAgICAvLworICAgIC8vIFJlc2V0IGZvciBuZXh0IHBhcmFsbGVsIHJlZ2lvbgorICAgIC8vCisgICAgdGhpc190aHItPnRoLnRoX3NldF9wcm9jX2JpbmQgPSBwcm9jX2JpbmRfZGVmYXVsdDsKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworCisgICAgaWYoIHRoaXNfdGhyLT50aC50aF90ZWFtICE9IHNlcmlhbF90ZWFtICkgeworICAgICAgICAvLyBOZXN0ZWQgbGV2ZWwgd2lsbCBiZSBhbiBpbmRleCBpbiB0aGUgbmVzdGVkIG50aHJlYWRzIGFycmF5CisgICAgICAgIGludCBsZXZlbCA9IHRoaXNfdGhyLT50aC50aF90ZWFtLT50LnRfbGV2ZWw7CisKKyAgICAgICAgaWYoIHNlcmlhbF90ZWFtLT50LnRfc2VyaWFsaXplZCApIHsKKyAgICAgICAgICAgIC8qIHRoaXMgc2VyaWFsIHRlYW0gd2FzIGFscmVhZHkgdXNlZAorICAgICAgICAgICAgICogVE9ETyBpbmNyZWFzZSBwZXJmb3JtYW5jZSBieSBtYWtpbmcgdGhpcyBsb2NrcyBtb3JlIHNwZWNpZmljICovCisgICAgICAgICAgICBrbXBfdGVhbV90ICpuZXdfdGVhbTsKKyAgICAgICAgICAgIGludCB0aWQgPSB0aGlzX3Roci0+dGgudGhfaW5mby5kcy5kc190aWQ7CisKKyAgICAgICAgICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9mb3Jram9pbl9sb2NrICk7CisKKyAgICAgICAgICAgIG5ld190ZWFtID0gX19rbXBfYWxsb2NhdGVfdGVhbSh0aGlzX3Roci0+dGgudGhfcm9vdCwgMSwgMSwKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2NfYmluZCwKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgdGhpc190aHItPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIFVTRV9ORVNURURfSE9UX0FSRyhOVUxMKSApOworICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJl9fa21wX2Zvcmtqb2luX2xvY2sgKTsKKyAgICAgICAgICAgIEtNUF9BU1NFUlQoIG5ld190ZWFtICk7CisKKyAgICAgICAgICAgIC8qIHNldHVwIG5ldyBzZXJpYWxpemVkIHRlYW0gYW5kIGluc3RhbGwgaXQgKi8KKyAgICAgICAgICAgIG5ld190ZWFtLT50LnRfdGhyZWFkc1swXSA9IHRoaXNfdGhyOworICAgICAgICAgICAgbmV3X3RlYW0tPnQudF9wYXJlbnQgPSB0aGlzX3Roci0+dGgudGhfdGVhbTsKKyAgICAgICAgICAgIHNlcmlhbF90ZWFtID0gbmV3X3RlYW07CisgICAgICAgICAgICB0aGlzX3Roci0+dGgudGhfc2VyaWFsX3RlYW0gPSBzZXJpYWxfdGVhbTsKKworICAgICAgICAgICAgS0ZfVFJBQ0UoIDEwLCAoICJfX2ttcGNfc2VyaWFsaXplZF9wYXJhbGxlbDogVCMlZCBhbGxvY2F0ZWQgbmV3IHNlcmlhbCB0ZWFtICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbF90aWQsIHNlcmlhbF90ZWFtICkgKTsKKworCisgICAgICAgICAgICAvKiBUT0RPIHRoZSBhYm92ZSBicmVha3MgdGhlIHJlcXVpcmVtZW50IHRoYXQgaWYgd2UgcnVuIG91dCBvZgorICAgICAgICAgICAgICogcmVzb3VyY2VzLCB0aGVuIHdlIGNhbiBzdGlsbCBndWFyYW50ZWUgdGhhdCBzZXJpYWxpemVkIHRlYW1zCisgICAgICAgICAgICAgKiBhcmUgb2ssIHNpbmNlIHdlIG1heSBuZWVkIHRvIGFsbG9jYXRlIGEgbmV3IG9uZSAqLworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgS0ZfVFJBQ0UoIDEwLCAoICJfX2ttcGNfc2VyaWFsaXplZF9wYXJhbGxlbDogVCMlZCByZXVzaW5nIGNhY2hlZCBzZXJpYWwgdGVhbSAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxfdGlkLCBzZXJpYWxfdGVhbSApICk7CisgICAgICAgIH0KKworICAgICAgICAvKiB3ZSBoYXZlIHRvIGluaXRpYWxpemUgdGhpcyBzZXJpYWwgdGVhbSAqLworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBzZXJpYWxfdGVhbS0+dC50X3RocmVhZHMgKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggc2VyaWFsX3RlYW0tPnQudF90aHJlYWRzWzBdID09IHRoaXNfdGhyICk7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHRoaXNfdGhyLT50aC50aF90ZWFtICE9IHNlcmlhbF90ZWFtICk7CisgICAgICAgIHNlcmlhbF90ZWFtLT50LnRfaWRlbnQgICAgICAgICA9IGxvYzsKKyAgICAgICAgc2VyaWFsX3RlYW0tPnQudF9zZXJpYWxpemVkICAgID0gMTsKKyAgICAgICAgc2VyaWFsX3RlYW0tPnQudF9ucHJvYyAgICAgICAgID0gMTsKKyAgICAgICAgc2VyaWFsX3RlYW0tPnQudF9wYXJlbnQgICAgICAgID0gdGhpc190aHItPnRoLnRoX3RlYW07CisgICAgICAgIHNlcmlhbF90ZWFtLT50LnRfc2NoZWQgICAgICAgICA9IHRoaXNfdGhyLT50aC50aF90ZWFtLT50LnRfc2NoZWQ7CisgICAgICAgIHRoaXNfdGhyLT50aC50aF90ZWFtICAgICAgICAgICA9IHNlcmlhbF90ZWFtOworICAgICAgICBzZXJpYWxfdGVhbS0+dC50X21hc3Rlcl90aWQgICAgPSB0aGlzX3Roci0+dGgudGhfaW5mby5kcy5kc190aWQ7CisKKyAgICAgICAgS0ZfVFJBQ0UoIDEwLCAoICJfX2ttcGNfc2VyaWFsaXplZF9wYXJhbGxlbDogVCNkIGN1cnRhc2s9JXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxfdGlkLCB0aGlzX3Roci0+dGgudGhfY3VycmVudF90YXNrICkgKTsKKyAgICAgICAgS01QX0FTU0VSVCggdGhpc190aHItPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfZmxhZ3MuZXhlY3V0aW5nID09IDEgKTsKKyAgICAgICAgdGhpc190aHItPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfZmxhZ3MuZXhlY3V0aW5nID0gMDsKKworICAgICAgICBfX2ttcF9wdXNoX2N1cnJlbnRfdGFza190b190aHJlYWQoIHRoaXNfdGhyLCBzZXJpYWxfdGVhbSwgMCApOworCisgICAgICAgIC8qIFRPRE86IEdFSDogZG8gdGhlIElDVnMgd29yayBmb3IgbmVzdGVkIHNlcmlhbGl6ZWQgdGVhbXM/ICBEb24ndCB3ZSBuZWVkIGFuIGltcGxpY2l0IHRhc2sgZm9yCisgICAgICAgICAgIGVhY2ggc2VyaWFsaXplZCB0YXNrIHJlcHJlc2VudGVkIGJ5IHRlYW0tPnQudF9zZXJpYWxpemVkPyAqLworICAgICAgICBjb3B5X2ljdnMoCisgICAgICAgICAgICAgICAgICAmIHRoaXNfdGhyLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMsCisgICAgICAgICAgICAgICAgICAmIHRoaXNfdGhyLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX3BhcmVudC0+dGRfaWN2cyApOworCisgICAgICAgIC8vIFRocmVhZCB2YWx1ZSBleGlzdHMgaW4gdGhlIG5lc3RlZCBudGhyZWFkcyBhcnJheSBmb3IgdGhlIG5leHQgbmVzdGVkIGxldmVsCisgICAgICAgIGlmICggX19rbXBfbmVzdGVkX250aC51c2VkICYmICggbGV2ZWwgKyAxIDwgX19rbXBfbmVzdGVkX250aC51c2VkICkgKSB7CisgICAgICAgICAgICB0aGlzX3Roci0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLm5wcm9jID0gX19rbXBfbmVzdGVkX250aC5udGhbIGxldmVsICsgMSBdOworICAgICAgICB9CisKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICBpZiAoIF9fa21wX25lc3RlZF9wcm9jX2JpbmQudXNlZCAmJiAoIGxldmVsICsgMSA8IF9fa21wX25lc3RlZF9wcm9jX2JpbmQudXNlZCApICkgeworICAgICAgICAgICAgdGhpc190aHItPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5wcm9jX2JpbmQKKyAgICAgICAgICAgICAgICA9IF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1sgbGV2ZWwgKyAxIF07CisgICAgICAgIH0KKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworCisgICAgICAgIHRoaXNfdGhyLT50aC50aF9pbmZvLmRzLmRzX3RpZCA9IDA7CisKKyAgICAgICAgLyogc2V0IHRocmVhZCBjYWNoZSB2YWx1ZXMgKi8KKyAgICAgICAgdGhpc190aHItPnRoLnRoX3RlYW1fbnByb2MgICAgID0gMTsKKyAgICAgICAgdGhpc190aHItPnRoLnRoX3RlYW1fbWFzdGVyICAgID0gdGhpc190aHI7CisgICAgICAgIHRoaXNfdGhyLT50aC50aF90ZWFtX3NlcmlhbGl6ZWQgPSAxOworCisgICAgICAgIHNlcmlhbF90ZWFtLT50LnRfbGV2ZWwgICAgICAgID0gc2VyaWFsX3RlYW0tPnQudF9wYXJlbnQtPnQudF9sZXZlbCArIDE7CisgICAgICAgIHNlcmlhbF90ZWFtLT50LnRfYWN0aXZlX2xldmVsID0gc2VyaWFsX3RlYW0tPnQudF9wYXJlbnQtPnQudF9hY3RpdmVfbGV2ZWw7CisKKyAgICAgICAgcHJvcGFnYXRlRlBDb250cm9sIChzZXJpYWxfdGVhbSk7CisKKyAgICAgICAgLyogY2hlY2sgaWYgd2UgbmVlZCB0byBhbGxvY2F0ZSBkaXNwYXRjaCBidWZmZXJzIHN0YWNrICovCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoc2VyaWFsX3RlYW0tPnQudF9kaXNwYXRjaCk7CisgICAgICAgIGlmICggIXNlcmlhbF90ZWFtLT50LnRfZGlzcGF0Y2gtPnRoX2Rpc3BfYnVmZmVyICkgeworICAgICAgICAgICAgc2VyaWFsX3RlYW0tPnQudF9kaXNwYXRjaC0+dGhfZGlzcF9idWZmZXIgPSAoZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3QgKikKKyAgICAgICAgICAgICAgICBfX2ttcF9hbGxvY2F0ZSggc2l6ZW9mKCBkaXNwYXRjaF9wcml2YXRlX2luZm9fdCApICk7CisgICAgICAgIH0KKyAgICAgICAgdGhpc190aHItPnRoLnRoX2Rpc3BhdGNoID0gc2VyaWFsX3RlYW0tPnQudF9kaXNwYXRjaDsKKworICAgICAgICBLTVBfTUIoKTsKKworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIHRoaXMgc2VyaWFsaXplZCB0ZWFtIGlzIGFscmVhZHkgYmVpbmcgdXNlZCwKKyAgICAgICAgICogdGhhdCdzIGZpbmUsIGp1c3QgYWRkIGFub3RoZXIgbmVzdGVkIGxldmVsICovCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHRoaXNfdGhyLT50aC50aF90ZWFtID09IHNlcmlhbF90ZWFtICk7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHNlcmlhbF90ZWFtLT50LnRfdGhyZWFkcyApOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBzZXJpYWxfdGVhbS0+dC50X3RocmVhZHNbMF0gPT0gdGhpc190aHIgKTsKKyAgICAgICAgKysgc2VyaWFsX3RlYW0tPnQudF9zZXJpYWxpemVkOworICAgICAgICB0aGlzX3Roci0+dGgudGhfdGVhbV9zZXJpYWxpemVkID0gc2VyaWFsX3RlYW0tPnQudF9zZXJpYWxpemVkOworCisgICAgICAgIC8vIE5lc3RlZCBsZXZlbCB3aWxsIGJlIGFuIGluZGV4IGluIHRoZSBuZXN0ZWQgbnRocmVhZHMgYXJyYXkKKyAgICAgICAgaW50IGxldmVsID0gdGhpc190aHItPnRoLnRoX3RlYW0tPnQudF9sZXZlbDsKKyAgICAgICAgLy8gVGhyZWFkIHZhbHVlIGV4aXN0cyBpbiB0aGUgbmVzdGVkIG50aHJlYWRzIGFycmF5IGZvciB0aGUgbmV4dCBuZXN0ZWQgbGV2ZWwKKyAgICAgICAgaWYgKCBfX2ttcF9uZXN0ZWRfbnRoLnVzZWQgJiYgKCBsZXZlbCArIDEgPCBfX2ttcF9uZXN0ZWRfbnRoLnVzZWQgKSApIHsKKyAgICAgICAgICAgIHRoaXNfdGhyLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMubnByb2MgPSBfX2ttcF9uZXN0ZWRfbnRoLm50aFsgbGV2ZWwgKyAxIF07CisgICAgICAgIH0KKyAgICAgICAgc2VyaWFsX3RlYW0tPnQudF9sZXZlbCsrOworICAgICAgICBLRl9UUkFDRSggMTAsICggIl9fa21wY19zZXJpYWxpemVkX3BhcmFsbGVsOiBUIyVkIGluY3JlYXNpbmcgbmVzdGluZyBsZXZlbCBvZiBzZXJpYWwgdGVhbSAlcCB0byAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbF90aWQsIHNlcmlhbF90ZWFtLCBzZXJpYWxfdGVhbS0+dC50X2xldmVsICkgKTsKKworICAgICAgICAvKiBhbGxvY2F0ZS9wdXNoIGRpc3BhdGNoIGJ1ZmZlcnMgc3RhY2sgKi8KKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVChzZXJpYWxfdGVhbS0+dC50X2Rpc3BhdGNoKTsKKyAgICAgICAgeworICAgICAgICAgICAgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3QgKiBkaXNwX2J1ZmZlciA9IChkaXNwYXRjaF9wcml2YXRlX2luZm9fdCAqKQorICAgICAgICAgICAgICAgIF9fa21wX2FsbG9jYXRlKCBzaXplb2YoIGRpc3BhdGNoX3ByaXZhdGVfaW5mb190ICkgKTsKKyAgICAgICAgICAgIGRpc3BfYnVmZmVyLT5uZXh0ID0gc2VyaWFsX3RlYW0tPnQudF9kaXNwYXRjaC0+dGhfZGlzcF9idWZmZXI7CisgICAgICAgICAgICBzZXJpYWxfdGVhbS0+dC50X2Rpc3BhdGNoLT50aF9kaXNwX2J1ZmZlciA9IGRpc3BfYnVmZmVyOworICAgICAgICB9CisgICAgICAgIHRoaXNfdGhyLT50aC50aF9kaXNwYXRjaCA9IHNlcmlhbF90ZWFtLT50LnRfZGlzcGF0Y2g7CisKKyAgICAgICAgS01QX01CKCk7CisgICAgfQorCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKQorICAgICAgICBfX2ttcF9wdXNoX3BhcmFsbGVsKCBnbG9iYWxfdGlkLCBOVUxMICk7CisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgLy8gTWFyayB0aGUgc3RhcnQgb2YgdGhlICJwYXJhbGxlbCIgcmVnaW9uIGZvciBWVHVuZS4gT25seSB1c2Ugb25lIG9mIGZyYW1lIG5vdGlmaWNhdGlvbiBzY2hlbWUgYXQgdGhlIG1vbWVudAorICAgIGlmICggKCBfX2l0dF9mcmFtZV9iZWdpbl92M19wdHIgJiYgX19rbXBfZm9ya2pvaW5fZnJhbWVzICYmICEgX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGUgKSB8fCBLTVBfSVRUX0RFQlVHICkKKyAgICB7CisgICAgICAgIHRoaXNfdGhyLT50aC50aF9pZGVudCA9IGxvYzsKKyAgICAgICAgLy8gMCAtIG5vIGJhcnJpZXJzOyAxIC0gc2VyaWFsaXplZCBwYXJhbGxlbAorICAgICAgICBfX2ttcF9pdHRfcmVnaW9uX2ZvcmtpbmcoIGdsb2JhbF90aWQsIHRoaXNfdGhyLT50aC50aF90ZWFtX25wcm9jLCAwLCAxICk7CisgICAgfQorICAgIC8vIFNhdmUgdGhlIHN0YXJ0IG9mIHRoZSAicGFyYWxsZWwiIHJlZ2lvbiBmb3IgVlR1bmUuIFRoaXMgaXMgdGhlIGpvaW4gYmFycmllciBiZWdpbiBhdCB0aGUgc2FtZSB0aW1lLgorICAgIGlmKCAoICggX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGUgPT0gMSB8fCBfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSA9PSAzICkgJiYKKyAgICAgICAgICBfX2l0dF9mcmFtZV9zdWJtaXRfdjNfcHRyICYmIF9faXR0X2dldF90aW1lc3RhbXBfcHRyICkgfHwgS01QX0lUVF9ERUJVRyApCisgICAgeworICAgICAgICB0aGlzX3Roci0+dGgudGhfaWRlbnQgPSBsb2M7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICAgICAgaWYoIHRoaXNfdGhyLT50aC50aF90ZWFtLT50LnRfbGV2ZWwgPT0gMSApIHsKKyAgICAgICAgICAgIHNlcmlhbF90ZWFtLT50LnRfcmVnaW9uX3RpbWUgPSB0aGlzX3Roci0+dGgudGhfZnJhbWVfdGltZV9zZXJpYWxpemVkID0gX19pdHRfZ2V0X3RpbWVzdGFtcCgpOworICAgICAgICB9CisjZW5kaWYKKyAgICB9CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworfQorCisvKiBtb3N0IG9mIHRoZSB3b3JrIGZvciBhIGZvcmsgKi8KKy8qIHJldHVybiB0cnVlIGlmIHdlIHJlYWxseSB3ZW50IHBhcmFsbGVsLCBmYWxzZSBpZiBzZXJpYWxpemVkICovCitpbnQKK19fa21wX2ZvcmtfY2FsbCgKKyAgICBpZGVudF90ICAgKiBsb2MsCisgICAgaW50ICAgICAgICAgZ3RpZCwKKyAgICBlbnVtIGZvcmtfY29udGV4dF9lICBjYWxsX2NvbnRleHQsIC8vIEludGVsLCBHTlUsIC4uLgorICAgIGttcF9pbnQzMiAgIGFyZ2MsCisgICAgbWljcm90YXNrX3QgbWljcm90YXNrLAorICAgIGxhdW5jaF90ICAgIGludm9rZXIsCisvKiBUT0RPOiByZXZlcnQgd29ya2Fyb3VuZCBmb3IgSW50ZWwoUikgNjQgdHJhY2tlciAjOTYgKi8KKyNpZiAoS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSB8fCBLTVBfQVJDSF9BQVJDSDY0KSAmJiBLTVBfT1NfTElOVVgKKyAgICB2YV9saXN0ICAgKiBhcAorI2Vsc2UKKyAgICB2YV9saXN0ICAgICBhcAorI2VuZGlmCisgICAgKQoreworICAgIHZvaWQgICAgICAgICAgKiphcmd2OworICAgIGludCAgICAgICAgICAgICBpOworICAgIGludCAgICAgICAgICAgICBtYXN0ZXJfdGlkOworICAgIGludCAgICAgICAgICAgICBtYXN0ZXJfdGhpc19jb25zOworICAgIGttcF90ZWFtX3QgICAgICp0ZWFtOworICAgIGttcF90ZWFtX3QgICAgICpwYXJlbnRfdGVhbTsKKyAgICBrbXBfaW5mb190ICAgICAqbWFzdGVyX3RoOworICAgIGttcF9yb290X3QgICAgICpyb290OworICAgIGludCAgICAgICAgICAgICBudGhyZWFkczsKKyAgICBpbnQgICAgICAgICAgICAgbWFzdGVyX2FjdGl2ZTsKKyAgICBpbnQgICAgICAgICAgICAgbWFzdGVyX3NldF9udW10aHJlYWRzOworICAgIGludCAgICAgICAgICAgICBsZXZlbDsKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIGludCAgICAgICAgICAgICBhY3RpdmVfbGV2ZWw7CisgICAgaW50ICAgICAgICAgICAgIHRlYW1zX2xldmVsOworI2VuZGlmCisjaWYgS01QX05FU1RFRF9IT1RfVEVBTVMKKyAgICBrbXBfaG90X3RlYW1fcHRyX3QgKipwX2hvdF90ZWFtczsKKyNlbmRpZgorICAgIHsgLy8gS01QX1RJTUVfQkxPQ0sKKyAgICBLTVBfVElNRV9CTE9DSyhLTVBfZm9ya19jYWxsKTsKKworICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9mb3JrX2NhbGw6IGVudGVyIFQjJWRcbiIsIGd0aWQgKSk7CisgICAgaWYgKCBfX2ttcF9zdGtwYWRkaW5nID4gMCAmJiAgX19rbXBfcm9vdFtndGlkXSAhPSBOVUxMICkgeworICAgICAgICAvKiBTb21lIHN5c3RlbXMgcHJlZmVyIHRoZSBzdGFjayBmb3IgdGhlIHJvb3QgdGhyZWFkKHMpIHRvIHN0YXJ0IHdpdGggKi8KKyAgICAgICAgLyogc29tZSBnYXAgZnJvbSB0aGUgcGFyZW50IHN0YWNrIHRvIHByZXZlbnQgZmFsc2Ugc2hhcmluZy4gKi8KKyAgICAgICAgdm9pZCAqZHVtbXkgPSBhbGxvY2EoX19rbXBfc3RrcGFkZGluZyk7CisgICAgICAgIC8qIFRoZXNlIDIgbGluZXMgYmVsb3cgYXJlIHNvIHRoaXMgZG9lcyBub3QgZ2V0IG9wdGltaXplZCBvdXQgKi8KKyAgICAgICAgaWYgKCBfX2ttcF9zdGtwYWRkaW5nID4gS01QX01BWF9TVEtQQURESU5HICkKKyAgICAgICAgICAgIF9fa21wX3N0a3BhZGRpbmcgKz0gKHNob3J0KSgoa21wX2ludDY0KWR1bW15KTsKKyAgICB9CisKKyAgICAvKiBpbml0aWFsaXplIGlmIG5lZWRlZCAqLworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7IC8vIEFDOiBwb3RlbnRpYWxseSB1bnNhZmUsIG5vdCBpbiBzeW5jIHdpdGggc2h1dGRvd24KKyAgICBpZiggISBUQ1JfNChfX2ttcF9pbml0X3BhcmFsbGVsKSApCisgICAgICAgIF9fa21wX3BhcmFsbGVsX2luaXRpYWxpemUoKTsKKworICAgIC8qIHNldHVwIGN1cnJlbnQgZGF0YSAqLworICAgIG1hc3Rlcl90aCAgICAgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07IC8vIEFDOiBwb3RlbnRpYWxseSB1bnNhZmUsIG5vdCBpbiBzeW5jIHdpdGggc2h1dGRvd24KKyAgICBwYXJlbnRfdGVhbSAgID0gbWFzdGVyX3RoLT50aC50aF90ZWFtOworICAgIG1hc3Rlcl90aWQgICAgPSBtYXN0ZXJfdGgtPnRoLnRoX2luZm8uZHMuZHNfdGlkOworICAgIG1hc3Rlcl90aGlzX2NvbnMgPSBtYXN0ZXJfdGgtPnRoLnRoX2xvY2FsLnRoaXNfY29uc3RydWN0OworICAgIHJvb3QgICAgICAgICAgPSBtYXN0ZXJfdGgtPnRoLnRoX3Jvb3Q7CisgICAgbWFzdGVyX2FjdGl2ZSA9IHJvb3QtPnIucl9hY3RpdmU7CisgICAgbWFzdGVyX3NldF9udW10aHJlYWRzID0gbWFzdGVyX3RoLT50aC50aF9zZXRfbnByb2M7CisgICAgLy8gTmVzdGVkIGxldmVsIHdpbGwgYmUgYW4gaW5kZXggaW4gdGhlIG5lc3RlZCBudGhyZWFkcyBhcnJheQorICAgIGxldmVsICAgICAgICAgPSBwYXJlbnRfdGVhbS0+dC50X2xldmVsOworI2lmIE9NUF80MF9FTkFCTEVECisgICAgYWN0aXZlX2xldmVsICA9IHBhcmVudF90ZWFtLT50LnRfYWN0aXZlX2xldmVsOyAvLyBpcyB1c2VkIHRvIGxhdW5jaCBub24tc2VyaWFsIHRlYW1zIGV2ZW4gaWYgbmVzdGVkIGlzIG5vdCBhbGxvd2VkCisgICAgdGVhbXNfbGV2ZWwgICAgPSBtYXN0ZXJfdGgtPnRoLnRoX3RlYW1zX2xldmVsOyAvLyBuZWVkZWQgdG8gY2hlY2sgbmVzdGluZyBpbnNpZGUgdGhlIHRlYW1zCisjZW5kaWYKKyNpZiBLTVBfTkVTVEVEX0hPVF9URUFNUworICAgIHBfaG90X3RlYW1zICAgPSAmbWFzdGVyX3RoLT50aC50aF9ob3RfdGVhbXM7CisgICAgaWYoICpwX2hvdF90ZWFtcyA9PSBOVUxMICYmIF9fa21wX2hvdF90ZWFtc19tYXhfbGV2ZWwgPiAwICkgeworICAgICAgICAqcF9ob3RfdGVhbXMgPSAoa21wX2hvdF90ZWFtX3B0cl90KilfX2ttcF9hbGxvY2F0ZSgKKyAgICAgICAgICAgICAgICBzaXplb2Yoa21wX2hvdF90ZWFtX3B0cl90KSAqIF9fa21wX2hvdF90ZWFtc19tYXhfbGV2ZWwpOworICAgICAgICAoKnBfaG90X3RlYW1zKVswXS5ob3RfdGVhbSA9IHJvb3QtPnIucl9ob3RfdGVhbTsKKyAgICAgICAgKCpwX2hvdF90ZWFtcylbMF0uaG90X3RlYW1fbnRoID0gMTsgLy8gaXQgaXMgZWl0aGVyIGFjdHVhbCBvciBub3QgbmVlZGVkICh3aGVuIGFjdGl2ZV9sZXZlbCA+IDApCisgICAgfQorI2VuZGlmCisKKworICAgIG1hc3Rlcl90aC0+dGgudGhfaWRlbnQgPSBsb2M7CisKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIGlmICggbWFzdGVyX3RoLT50aC50aF90ZWFtc19taWNyb3Rhc2sgJiYKKyAgICAgICAgIGFwICYmIG1pY3JvdGFzayAhPSAobWljcm90YXNrX3QpX19rbXBfdGVhbXNfbWFzdGVyICYmIGxldmVsID09IHRlYW1zX2xldmVsICkgeworICAgICAgICAvLyBBQzogVGhpcyBpcyBzdGFydCBvZiBwYXJhbGxlbCB0aGF0IGlzIG5lc3RlZCBpbnNpZGUgdGVhbXMgY29uc3RydWN0LgorICAgICAgICAvLyAgICAgVGhlIHRlYW0gaXMgYWN0dWFsIChob3QpLCBhbGwgd29ya2VycyBhcmUgcmVhZHkgYXQgdGhlIGZvcmsgYmFycmllci4KKyAgICAgICAgLy8gICAgIE5vIGxvY2sgbmVlZGVkIHRvIGluaXRpYWxpemUgdGhlIHRlYW0gYSBiaXQsIHRoZW4gZnJlZSB3b3JrZXJzLgorICAgICAgICBwYXJlbnRfdGVhbS0+dC50X2lkZW50ID0gbG9jOworICAgICAgICBwYXJlbnRfdGVhbS0+dC50X2FyZ2MgID0gYXJnYzsKKyAgICAgICAgYXJndiA9ICh2b2lkKiopcGFyZW50X3RlYW0tPnQudF9hcmd2OworICAgICAgICBmb3IoIGk9YXJnYy0xOyBpID49IDA7IC0taSApCisvKiBUT0RPOiByZXZlcnQgd29ya2Fyb3VuZCBmb3IgSW50ZWwoUikgNjQgdHJhY2tlciAjOTYgKi8KKyNpZiAoS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSB8fCBLTVBfQVJDSF9BQVJDSDY0KSAmJiBLTVBfT1NfTElOVVgKKyAgICAgICAgICAgICphcmd2KysgPSB2YV9hcmcoICphcCwgdm9pZCAqICk7CisjZWxzZQorICAgICAgICAgICAgKmFyZ3YrKyA9IHZhX2FyZyggYXAsIHZvaWQgKiApOworI2VuZGlmCisgICAgICAgIC8qIEluY3JlbWVudCBvdXIgbmVzdGVkIGRlcHRoIGxldmVscywgYnV0IG5vdCBpbmNyZWFzZSB0aGUgc2VyaWFsaXphdGlvbiAqLworICAgICAgICBpZiAoIHBhcmVudF90ZWFtID09IG1hc3Rlcl90aC0+dGgudGhfc2VyaWFsX3RlYW0gKSB7CisgICAgICAgICAgICAvLyBBQzogd2UgYXJlIGluIHNlcmlhbGl6ZWQgcGFyYWxsZWwKKyAgICAgICAgICAgIF9fa21wY19zZXJpYWxpemVkX3BhcmFsbGVsKGxvYywgZ3RpZCk7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBwYXJlbnRfdGVhbS0+dC50X3NlcmlhbGl6ZWQgPiAxICk7CisgICAgICAgICAgICBwYXJlbnRfdGVhbS0+dC50X3NlcmlhbGl6ZWQtLTsgLy8gQUM6IG5lZWQgdGhpcyBpbiBvcmRlciBlbnF1aXJ5IGZ1bmN0aW9ucworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICB3b3JrIGNvcnJlY3RseSwgd2lsbCByZXN0b3JlIGF0IGpvaW4gdGltZQorICAgICAgICAgICAgS01QX1RJTUVfQkxPQ0soT01QX3dvcmspOworICAgICAgICAgICAgX19rbXBfaW52b2tlX21pY3JvdGFzayggbWljcm90YXNrLCBndGlkLCAwLCBhcmdjLCBwYXJlbnRfdGVhbS0+dC50X2FyZ3YgKTsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICB9CisgICAgICAgIHBhcmVudF90ZWFtLT50LnRfcGtmbiAgPSBtaWNyb3Rhc2s7CisgICAgICAgIHBhcmVudF90ZWFtLT50LnRfaW52b2tlID0gaW52b2tlcjsKKyAgICAgICAgS01QX1RFU1RfVEhFTl9JTkMzMiggKGttcF9pbnQzMiopICZyb290LT5yLnJfaW5fcGFyYWxsZWwgKTsKKyAgICAgICAgcGFyZW50X3RlYW0tPnQudF9hY3RpdmVfbGV2ZWwgKys7CisgICAgICAgIHBhcmVudF90ZWFtLT50LnRfbGV2ZWwgKys7CisKKyAgICAgICAgLyogQ2hhbmdlIG51bWJlciBvZiB0aHJlYWRzIGluIHRoZSB0ZWFtIGlmIHJlcXVlc3RlZCAqLworICAgICAgICBpZiAoIG1hc3Rlcl9zZXRfbnVtdGhyZWFkcyApIHsgICAvLyBUaGUgcGFyYWxsZWwgaGFzIG51bV90aHJlYWRzIGNsYXVzZQorICAgICAgICAgICAgaWYgKCBtYXN0ZXJfc2V0X251bXRocmVhZHMgPCBtYXN0ZXJfdGgtPnRoLnRoX3RlYW1zX3NpemUubnRoICkgeworICAgICAgICAgICAgICAgIC8vIEFDOiBvbmx5IGNhbiByZWR1Y2UgdGhlIG51bWJlciBvZiB0aHJlYWRzIGR5bmFtaWNhbGx5LCBjYW5ub3QgaW5jcmVhc2UKKyAgICAgICAgICAgICAgICBrbXBfaW5mb190ICoqb3RoZXJfdGhyZWFkcyA9IHBhcmVudF90ZWFtLT50LnRfdGhyZWFkczsKKyAgICAgICAgICAgICAgICBwYXJlbnRfdGVhbS0+dC50X25wcm9jID0gbWFzdGVyX3NldF9udW10aHJlYWRzOworICAgICAgICAgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgbWFzdGVyX3NldF9udW10aHJlYWRzOyArK2kgKSB7CisgICAgICAgICAgICAgICAgICAgIG90aGVyX3RocmVhZHNbaV0tPnRoLnRoX3RlYW1fbnByb2MgPSBtYXN0ZXJfc2V0X251bXRocmVhZHM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIEtlZXAgZXh0cmEgdGhyZWFkcyBob3QgaW4gdGhlIHRlYW0gZm9yIHBvc3NpYmxlIG5leHQgcGFyYWxsZWxzCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXN0ZXJfdGgtPnRoLnRoX3NldF9ucHJvYyA9IDA7CisgICAgICAgIH0KKworCisgICAgICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBfZm9ya19jYWxsOiBiZWZvcmUgaW50ZXJuYWwgZm9yazogcm9vdD0lcCwgdGVhbT0lcCwgbWFzdGVyX3RoPSVwLCBndGlkPSVkXG4iLCByb290LCBwYXJlbnRfdGVhbSwgbWFzdGVyX3RoLCBndGlkICkgKTsKKyAgICAgICAgX19rbXBfaW50ZXJuYWxfZm9yayggbG9jLCBndGlkLCBwYXJlbnRfdGVhbSApOworICAgICAgICBLRl9UUkFDRSggMTAsICggIl9fa21wX2ZvcmtfY2FsbDogYWZ0ZXIgaW50ZXJuYWwgZm9yazogcm9vdD0lcCwgdGVhbT0lcCwgbWFzdGVyX3RoPSVwLCBndGlkPSVkXG4iLCByb290LCBwYXJlbnRfdGVhbSwgbWFzdGVyX3RoLCBndGlkICkgKTsKKworICAgICAgICAvKiBJbnZva2UgbWljcm90YXNrIGZvciBNQVNURVIgdGhyZWFkICovCisgICAgICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9mb3JrX2NhbGw6IFQjJWQoJWQ6MCkgaW52b2tlIG1pY3JvdGFzayA9ICVwXG4iLAorICAgICAgICAgICAgICAgICAgICBndGlkLCBwYXJlbnRfdGVhbS0+dC50X2lkLCBwYXJlbnRfdGVhbS0+dC50X3BrZm4gKSApOworCisgICAgICAgIHsKKyAgICAgICAgICAgIEtNUF9USU1FX0JMT0NLKE9NUF93b3JrKTsKKyAgICAgICAgICAgIGlmICghIHBhcmVudF90ZWFtLT50LnRfaW52b2tlKCBndGlkICkpIHsKKyAgICAgICAgICAgICAgICBLTVBfQVNTRVJUMiggMCwgImNhbm5vdCBpbnZva2UgbWljcm90YXNrIGZvciBNQVNURVIgdGhyZWFkIiApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9mb3JrX2NhbGw6IFQjJWQoJWQ6MCkgZG9uZSBtaWNyb3Rhc2sgPSAlcFxuIiwKKyAgICAgICAgICAgIGd0aWQsIHBhcmVudF90ZWFtLT50LnRfaWQsIHBhcmVudF90ZWFtLT50LnRfcGtmbiApICk7CisgICAgICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9mb3JrX2NhbGw6IHBhcmFsbGVsIGV4aXQgVCMlZFxuIiwgZ3RpZCApKTsKKworICAgICAgICByZXR1cm4gVFJVRTsKKyAgICB9IC8vIFBhcmFsbGVsIGNsb3NlbHkgbmVzdGVkIGluIHRlYW1zIGNvbnN0cnVjdAorI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisKKyNpZiBLTVBfREVCVUcKKyAgICBpZiAoIF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjICkgeworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBtYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfdGVhbSA9PSBwYXJlbnRfdGVhbS0+dC50X3Rhc2tfdGVhbSApOworICAgIH0KKyNlbmRpZgorCisgICAgLyogZGV0ZXJtaW5lIGhvdyBtYW55IG5ldyB0aHJlYWRzIHdlIGNhbiB1c2UgKi8KKyAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfZm9ya2pvaW5fbG9jayApOworCisgICAgaWYgKCBwYXJlbnRfdGVhbS0+dC50X2FjdGl2ZV9sZXZlbCA+PSBtYXN0ZXJfdGgtPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5tYXhfYWN0aXZlX2xldmVscyApIHsKKyAgICAgICAgbnRocmVhZHMgPSAxOworICAgIH0gZWxzZSB7CisgICAgICAgIG50aHJlYWRzID0gbWFzdGVyX3NldF9udW10aHJlYWRzID8KKyAgICAgICAgICAgIG1hc3Rlcl9zZXRfbnVtdGhyZWFkcyA6IGdldF9fbnByb2NfMiggcGFyZW50X3RlYW0sIG1hc3Rlcl90aWQgKTsgLy8gVE9ETzogZ2V0IG5wcm9jIGRpcmVjdGx5IGZyb20gY3VycmVudCB0YXNrCisgICAgICAgIG50aHJlYWRzID0gX19rbXBfcmVzZXJ2ZV90aHJlYWRzKHJvb3QsIHBhcmVudF90ZWFtLCBtYXN0ZXJfdGlkLCBudGhyZWFkcworI2lmIE9NUF80MF9FTkFCTEVECisvKiBBQzogSWYgd2UgZXhlY3V0ZSB0ZWFtcyBmcm9tIHBhcmFsbGVsIHJlZ2lvbiAob24gaG9zdCksIHRoZW4gdGVhbXMgc2hvdWxkIGJlIGNyZWF0ZWQKKyAgIGJ1dCBlYWNoIGNhbiBvbmx5IGhhdmUgMSB0aHJlYWQgaWYgbmVzdGluZyBpcyBkaXNhYmxlZC4gSWYgdGVhbXMgY2FsbGVkIGZyb20gc2VyaWFsIHJlZ2lvbiwKKyAgIHRoZW4gdGVhbXMgYW5kIHRoZWlyIHRocmVhZHMgc2hvdWxkIGJlIGNyZWF0ZWQgcmVnYXJkbGVzcyBvZiB0aGUgbmVzdGluZyBzZXR0aW5nLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICgoYXA9PU5VTEwgJiYgYWN0aXZlX2xldmVsPT0wKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXAgJiYgdGVhbXNfbGV2ZWw+MCAmJiB0ZWFtc19sZXZlbD09bGV2ZWwpKQorI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgfQorICAgIEtNUF9ERUJVR19BU1NFUlQoIG50aHJlYWRzID4gMCApOworCisgICAgLyogSWYgd2UgdGVtcG9yYXJpbHkgY2hhbmdlZCB0aGUgc2V0IG51bWJlciBvZiB0aHJlYWRzIHRoZW4gcmVzdG9yZSBpdCBub3cgKi8KKyAgICBtYXN0ZXJfdGgtPnRoLnRoX3NldF9ucHJvYyA9IDA7CisKKworICAgIC8qIGNyZWF0ZSBhIHNlcmlhbGl6ZWQgcGFyYWxsZWwgcmVnaW9uPyAqLworICAgIGlmICggbnRocmVhZHMgPT0gMSApIHsKKyAgICAgICAgLyogam9zaCB0b2RvOiBoeXBvdGhldGljYWwgcXVlc3Rpb246IHdoYXQgZG8gd2UgZG8gZm9yIE9TIFgqPyAqLworI2lmIEtNUF9PU19MSU5VWCAmJiAoIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNIHx8IEtNUF9BUkNIX0FBUkNINjQpCisgICAgICAgIHZvaWQgKiAgIGFyZ3NbIGFyZ2MgXTsKKyNlbHNlCisgICAgICAgIHZvaWQgKiAqIGFyZ3MgPSAodm9pZCoqKSBhbGxvY2EoIGFyZ2MgKiBzaXplb2YoIHZvaWQgKiApICk7CisjZW5kaWYgLyogS01QX09TX0xJTlVYICYmICggS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0gfHwgS01QX0FSQ0hfQUFSQ0g2NCkgKi8KKworICAgICAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfZm9ya2pvaW5fbG9jayApOworICAgICAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfZm9ya19jYWxsOiBUIyVkIHNlcmlhbGl6aW5nIHBhcmFsbGVsIHJlZ2lvblxuIiwgZ3RpZCApKTsKKworICAgICAgICBfX2ttcGNfc2VyaWFsaXplZF9wYXJhbGxlbChsb2MsIGd0aWQpOworCisgICAgICAgIGlmICggY2FsbF9jb250ZXh0ID09IGZvcmtfY29udGV4dF9pbnRlbCApIHsKKyAgICAgICAgICAgIC8qIFRPRE8gdGhpcyBzdWNrcywgdXNlIHRoZSBjb21waWxlciBpdHNlbGYgdG8gcGFzcyBhcmdzISA6KSAqLworICAgICAgICAgICAgbWFzdGVyX3RoLT50aC50aF9zZXJpYWxfdGVhbS0+dC50X2lkZW50ID0gbG9jOworI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgICBpZiAoICFhcCApIHsKKyAgICAgICAgICAgICAgICAvLyByZXZlcnQgY2hhbmdlIG1hZGUgaW4gX19rbXBjX3NlcmlhbGl6ZWRfcGFyYWxsZWwoKQorICAgICAgICAgICAgICAgIG1hc3Rlcl90aC0+dGgudGhfc2VyaWFsX3RlYW0tPnQudF9sZXZlbC0tOworICAgICAgICAgICAgICAgIC8vIEdldCBhcmdzIGZyb20gcGFyZW50IHRlYW0gZm9yIHRlYW1zIGNvbnN0cnVjdAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX1RJTUVfQkxPQ0soT01QX3dvcmspOworICAgICAgICAgICAgICAgICAgICBfX2ttcF9pbnZva2VfbWljcm90YXNrKCBtaWNyb3Rhc2ssIGd0aWQsIDAsIGFyZ2MsIHBhcmVudF90ZWFtLT50LnRfYXJndiApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIG1pY3JvdGFzayA9PSAobWljcm90YXNrX3QpX19rbXBfdGVhbXNfbWFzdGVyICkgeworICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIG1hc3Rlcl90aC0+dGgudGhfdGVhbSA9PSBtYXN0ZXJfdGgtPnRoLnRoX3NlcmlhbF90ZWFtICk7CisgICAgICAgICAgICAgICAgdGVhbSA9IG1hc3Rlcl90aC0+dGgudGhfdGVhbTsKKyAgICAgICAgICAgICAgICAvL3RlYW0tPnQudF9wa2ZuID0gbWljcm90YXNrOworICAgICAgICAgICAgICAgIHRlYW0tPnQudF9pbnZva2UgPSBpbnZva2VyOworICAgICAgICAgICAgICAgIF9fa21wX2FsbG9jX2FyZ3ZfZW50cmllcyggYXJnYywgdGVhbSwgVFJVRSApOworICAgICAgICAgICAgICAgIHRlYW0tPnQudF9hcmdjID0gYXJnYzsKKyAgICAgICAgICAgICAgICBhcmd2ID0gKHZvaWQqKikgdGVhbS0+dC50X2FyZ3Y7CisgICAgICAgICAgICAgICAgaWYgKCBhcCApIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yKCBpPWFyZ2MtMTsgaSA+PSAwOyAtLWkgKQorLy8gVE9ETzogcmV2ZXJ0IHdvcmthcm91bmQgZm9yIEludGVsKFIpIDY0IHRyYWNrZXIgIzk2CisjIGlmIChLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNIHx8IEtNUF9BUkNIX0FBUkNINjQpICYmIEtNUF9PU19MSU5VWAorICAgICAgICAgICAgICAgICAgICAgICAgKmFyZ3YrKyA9IHZhX2FyZyggKmFwLCB2b2lkICogKTsKKyMgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgKmFyZ3YrKyA9IHZhX2FyZyggYXAsIHZvaWQgKiApOworIyBlbmRpZgorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZvciggaT0wOyBpIDwgYXJnYzsgKytpICkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdldCBhcmdzIGZyb20gcGFyZW50IHRlYW0gZm9yIHRlYW1zIGNvbnN0cnVjdAorICAgICAgICAgICAgICAgICAgICAgICAgYXJndltpXSA9IHBhcmVudF90ZWFtLT50LnRfYXJndltpXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gQUM6IHJldmVydCBjaGFuZ2UgbWFkZSBpbiBfX2ttcGNfc2VyaWFsaXplZF9wYXJhbGxlbCgpCisgICAgICAgICAgICAgICAgLy8gICAgIGJlY2F1c2UgaW5pdGlhbCBjb2RlIGluIHRlYW1zIHNob3VsZCBoYXZlIGxldmVsPTAKKyAgICAgICAgICAgICAgICB0ZWFtLT50LnRfbGV2ZWwtLTsKKyAgICAgICAgICAgICAgICAvLyBBQzogY2FsbCBzcGVjaWFsIGludm9rZXIgZm9yIG91dGVyICJwYXJhbGxlbCIgb2YgdGhlIHRlYW1zIGNvbnN0cnVjdAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX1RJTUVfQkxPQ0soT01QX3dvcmspOworICAgICAgICAgICAgICAgICAgICBpbnZva2VyKGd0aWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKyAgICAgICAgICAgICAgICBhcmd2ID0gYXJnczsKKyAgICAgICAgICAgICAgICBmb3IoIGk9YXJnYy0xOyBpID49IDA7IC0taSApCisvLyBUT0RPOiByZXZlcnQgd29ya2Fyb3VuZCBmb3IgSW50ZWwoUikgNjQgdHJhY2tlciAjOTYKKyNpZiAoS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSB8fCBLTVBfQVJDSF9BQVJDSDY0KSAmJiBLTVBfT1NfTElOVVgKKyAgICAgICAgICAgICAgICAgICAgKmFyZ3YrKyA9IHZhX2FyZyggKmFwLCB2b2lkICogKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgICphcmd2KysgPSB2YV9hcmcoIGFwLCB2b2lkICogKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIEtNUF9NQigpOworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX1RJTUVfQkxPQ0soT01QX3dvcmspOworICAgICAgICAgICAgICAgICAgICBfX2ttcF9pbnZva2VfbWljcm90YXNrKCBtaWNyb3Rhc2ssIGd0aWQsIDAsIGFyZ2MsIGFyZ3MgKTsKKyAgICAgICAgICAgICAgICB9CisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCBjYWxsX2NvbnRleHQgPT0gZm9ya19jb250ZXh0X2dudSApIHsKKyAgICAgICAgICAgIC8vIHdlIHdlcmUgY2FsbGVkIGZyb20gR05VIG5hdGl2ZSBjb2RlCisgICAgICAgICAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfZm9ya19jYWxsOiBUIyVkIHNlcmlhbCBleGl0XG4iLCBndGlkICkpOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgS01QX0FTU0VSVDIoIGNhbGxfY29udGV4dCA8IGZvcmtfY29udGV4dF9sYXN0LCAiX19rbXBfZm9ya19jYWxsOiB1bmtub3duIGZvcmtfY29udGV4dCBwYXJhbWV0ZXIiICk7CisgICAgICAgIH0KKworCisgICAgICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9mb3JrX2NhbGw6IFQjJWQgc2VyaWFsIGV4aXRcbiIsIGd0aWQgKSk7CisgICAgICAgIEtNUF9NQigpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgLy8gR0VIOiBvbmx5IG1vZGlmeSB0aGUgZXhlY3V0aW5nIGZsYWcgaW4gdGhlIGNhc2Ugd2hlbiBub3Qgc2VyaWFsaXplZAorICAgIC8vICAgICAgc2VyaWFsaXplZCBjYXNlIGlzIGhhbmRsZWQgaW4ga21wY19zZXJpYWxpemVkX3BhcmFsbGVsCisgICAgS0ZfVFJBQ0UoIDEwLCAoICJfX2ttcF9mb3JrX2NhbGw6IHBhcmVudF90ZWFtX2FjbGV2ZWw9JWQsIG1hc3Rlcl90aD0lcCwgY3VydGFzaz0lcCwgY3VydGFza19tYXhfYWNsZXZlbD0lZFxuIiwKKyAgICAgICAgICAgICAgICAgIHBhcmVudF90ZWFtLT50LnRfYWN0aXZlX2xldmVsLCBtYXN0ZXJfdGgsIG1hc3Rlcl90aC0+dGgudGhfY3VycmVudF90YXNrLAorICAgICAgICAgICAgICAgICAgbWFzdGVyX3RoLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMubWF4X2FjdGl2ZV9sZXZlbHMgKSApOworICAgIC8vIFRPRE86IEdFSCAtIGNhbm5vdCBkbyB0aGlzIGFzc2VydGlvbiBiZWNhdXNlIHJvb3QgdGhyZWFkIG5vdCBzZXQgdXAgYXMgZXhlY3V0aW5nCisgICAgLy8gS01QX0FTU0VSVCggbWFzdGVyX3RoLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ZsYWdzLmV4ZWN1dGluZyA9PSAxICk7CisgICAgbWFzdGVyX3RoLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ZsYWdzLmV4ZWN1dGluZyA9IDA7CisKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIGlmICggIW1hc3Rlcl90aC0+dGgudGhfdGVhbXNfbWljcm90YXNrIHx8IGxldmVsID4gdGVhbXNfbGV2ZWwgKQorI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisgICAgeworICAgICAgICAvKiBJbmNyZW1lbnQgb3VyIG5lc3RlZCBkZXB0aCBsZXZlbCAqLworICAgICAgICBLTVBfVEVTVF9USEVOX0lOQzMyKCAoa21wX2ludDMyKikgJnJvb3QtPnIucl9pbl9wYXJhbGxlbCApOworICAgIH0KKworICAgIC8vIFNlZSBpZiB3ZSBuZWVkIHRvIG1ha2UgYSBjb3B5IG9mIHRoZSBJQ1ZzLgorICAgIGludCBudGhyZWFkc19pY3YgPSBtYXN0ZXJfdGgtPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5ucHJvYzsKKyAgICBpZiAoKGxldmVsKzEgPCBfX2ttcF9uZXN0ZWRfbnRoLnVzZWQpICYmIChfX2ttcF9uZXN0ZWRfbnRoLm50aFtsZXZlbCsxXSAhPSBudGhyZWFkc19pY3YpKSB7CisgICAgICAgIG50aHJlYWRzX2ljdiA9IF9fa21wX25lc3RlZF9udGgubnRoW2xldmVsKzFdOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgbnRocmVhZHNfaWN2ID0gMDsgIC8vIGRvbid0IHVwZGF0ZQorICAgIH0KKworI2lmIE9NUF80MF9FTkFCTEVECisgICAgLy8gRmlndXJlIG91dCB0aGUgcHJvY19iaW5kX3BvbGljeSBmb3IgdGhlIG5ldyB0ZWFtLgorICAgIGttcF9wcm9jX2JpbmRfdCBwcm9jX2JpbmQgPSBtYXN0ZXJfdGgtPnRoLnRoX3NldF9wcm9jX2JpbmQ7CisgICAga21wX3Byb2NfYmluZF90IHByb2NfYmluZF9pY3YgPSBwcm9jX2JpbmRfZGVmYXVsdDsgLy8gcHJvY19iaW5kX2RlZmF1bHQgbWVhbnMgZG9uJ3QgdXBkYXRlCisgICAgaWYgKCBtYXN0ZXJfdGgtPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5wcm9jX2JpbmQgPT0gcHJvY19iaW5kX2ZhbHNlICkgeworICAgICAgICBwcm9jX2JpbmQgPSBwcm9jX2JpbmRfZmFsc2U7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAocHJvY19iaW5kID09IHByb2NfYmluZF9kZWZhdWx0KSB7CisgICAgICAgICAgICAvLyBObyBwcm9jX2JpbmQgY2xhdXNlIHNwZWNpZmllZDsgdXNlIGN1cnJlbnQgcHJvYy1iaW5kLXZhciBmb3IgdGhpcyBwYXJhbGxlbCByZWdpb24KKyAgICAgICAgICAgIHByb2NfYmluZCA9IG1hc3Rlcl90aC0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLnByb2NfYmluZDsKKyAgICAgICAgfQorICAgICAgICAvKiBlbHNlOiBUaGUgcHJvY19iaW5kIHBvbGljeSB3YXMgc3BlY2lmaWVkIGV4cGxpY2l0bHkgb24gcGFyYWxsZWwgY2xhdXNlLiBUaGlzCisgICAgICAgICAgIG92ZXJyaWRlcyBwcm9jLWJpbmQtdmFyIGZvciB0aGlzIHBhcmFsbGVsIHJlZ2lvbiwgYnV0IGRvZXMgbm90IGNoYW5nZSBwcm9jLWJpbmQtdmFyLiAqLworICAgICAgICAvLyBGaWd1cmUgdGhlIHZhbHVlIG9mIHByb2MtYmluZC12YXIgZm9yIHRoZSBjaGlsZCB0aHJlYWRzLgorICAgICAgICBpZiAoKGxldmVsKzEgPCBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLnVzZWQpCisgICAgICAgICAgICAmJiAoX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzW2xldmVsKzFdICE9IG1hc3Rlcl90aC0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLnByb2NfYmluZCkpIHsKKyAgICAgICAgICAgIHByb2NfYmluZF9pY3YgPSBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbbGV2ZWwrMV07CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBSZXNldCBmb3IgbmV4dCBwYXJhbGxlbCByZWdpb24KKyAgICBtYXN0ZXJfdGgtPnRoLnRoX3NldF9wcm9jX2JpbmQgPSBwcm9jX2JpbmRfZGVmYXVsdDsKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworCisgICAgaWYgKChudGhyZWFkc19pY3YgPiAwKQorI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgIHx8IChwcm9jX2JpbmRfaWN2ICE9IHByb2NfYmluZF9kZWZhdWx0KQorI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisgICAgICAgICkgeworICAgICAgICBrbXBfaW50ZXJuYWxfY29udHJvbF90IG5ld19pY3ZzOworICAgICAgICBjb3B5X2ljdnMoJm5ld19pY3ZzLCAmbWFzdGVyX3RoLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMpOworICAgICAgICBuZXdfaWN2cy5uZXh0ID0gTlVMTDsKKyAgICAgICAgaWYgKG50aHJlYWRzX2ljdiA+IDApIHsKKyAgICAgICAgICAgIG5ld19pY3ZzLm5wcm9jID0gbnRocmVhZHNfaWN2OworICAgICAgICB9CisKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICBpZiAocHJvY19iaW5kX2ljdiAhPSBwcm9jX2JpbmRfZGVmYXVsdCkgeworICAgICAgICAgICAgbmV3X2ljdnMucHJvY19iaW5kID0gcHJvY19iaW5kX2ljdjsKKyAgICAgICAgfQorI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisKKyAgICAgICAgLyogYWxsb2NhdGUgYSBuZXcgcGFyYWxsZWwgdGVhbSAqLworICAgICAgICBLRl9UUkFDRSggMTAsICggIl9fa21wX2ZvcmtfY2FsbDogYmVmb3JlIF9fa21wX2FsbG9jYXRlX3RlYW1cbiIgKSApOworICAgICAgICB0ZWFtID0gX19rbXBfYWxsb2NhdGVfdGVhbShyb290LCBudGhyZWFkcywgbnRocmVhZHMsCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY19iaW5kLAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdfaWN2cywgYXJnYyBVU0VfTkVTVEVEX0hPVF9BUkcobWFzdGVyX3RoKSApOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIGFsbG9jYXRlIGEgbmV3IHBhcmFsbGVsIHRlYW0gKi8KKyAgICAgICAgS0ZfVFJBQ0UoIDEwLCAoICJfX2ttcF9mb3JrX2NhbGw6IGJlZm9yZSBfX2ttcF9hbGxvY2F0ZV90ZWFtXG4iICkgKTsKKyAgICAgICAgdGVhbSA9IF9fa21wX2FsbG9jYXRlX3RlYW0ocm9vdCwgbnRocmVhZHMsIG50aHJlYWRzLAorI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2NfYmluZCwKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWFzdGVyX3RoLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMsIGFyZ2MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX05FU1RFRF9IT1RfQVJHKG1hc3Rlcl90aCkgKTsKKyAgICB9CisgICAgS0ZfVFJBQ0UoIDEwLCAoICJfX2ttcF9mb3JrX2NhbGw6IGFmdGVyIF9fa21wX2FsbG9jYXRlX3RlYW0gLSB0ZWFtID0gJXBcbiIsIHRlYW0gKSApOworCisgICAgLyogc2V0dXAgdGhlIG5ldyB0ZWFtICovCisgICAgdGVhbS0+dC50X21hc3Rlcl90aWQgPSBtYXN0ZXJfdGlkOworICAgIHRlYW0tPnQudF9tYXN0ZXJfdGhpc19jb25zID0gbWFzdGVyX3RoaXNfY29uczsKKyAgICB0ZWFtLT50LnRfaWRlbnQgICAgICA9IGxvYzsKKyAgICB0ZWFtLT50LnRfcGFyZW50ICAgICA9IHBhcmVudF90ZWFtOworICAgIFRDV19TWU5DX1BUUih0ZWFtLT50LnRfcGtmbiwgbWljcm90YXNrKTsKKyAgICB0ZWFtLT50LnRfaW52b2tlICAgICA9IGludm9rZXI7ICAvKiBUT0RPIG1vdmUgdGhpcyB0byByb290LCBtYXliZSAqLworICAgIC8vIFRPRE86IHBhcmVudF90ZWFtLT50LnRfbGV2ZWwgPT0gSU5UX01BWCA/Pz8KKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIGlmICggIW1hc3Rlcl90aC0+dGgudGhfdGVhbXNfbWljcm90YXNrIHx8IGxldmVsID4gdGVhbXNfbGV2ZWwgKSB7CisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKyAgICAgICAgdGVhbS0+dC50X2xldmVsICAgICAgICA9IHBhcmVudF90ZWFtLT50LnRfbGV2ZWwgKyAxOworICAgICAgICB0ZWFtLT50LnRfYWN0aXZlX2xldmVsID0gcGFyZW50X3RlYW0tPnQudF9hY3RpdmVfbGV2ZWwgKyAxOworI2lmIE9NUF80MF9FTkFCTEVECisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gQUM6IERvIG5vdCBpbmNyZWFzZSBwYXJhbGxlbCBsZXZlbCBhdCBzdGFydCBvZiB0aGUgdGVhbXMgY29uc3RydWN0CisgICAgICAgIHRlYW0tPnQudF9sZXZlbCAgICAgICAgPSBwYXJlbnRfdGVhbS0+dC50X2xldmVsOworICAgICAgICB0ZWFtLT50LnRfYWN0aXZlX2xldmVsID0gcGFyZW50X3RlYW0tPnQudF9hY3RpdmVfbGV2ZWw7CisgICAgfQorI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisgICAgdGVhbS0+dC50X3NjaGVkICAgICAgPSBnZXRfX3NjaGVkXzIocGFyZW50X3RlYW0sIG1hc3Rlcl90aWQpOyAvLyBzZXQgbWFzdGVyJ3Mgc2NoZWR1bGUgYXMgbmV3IHJ1bi10aW1lIHNjaGVkdWxlCisKKyAgICAvLyBVcGRhdGUgdGhlIGZsb2F0aW5nIHBvaW50IHJvdW5kaW5nIGluIHRoZSB0ZWFtIGlmIHJlcXVpcmVkLgorICAgIHByb3BhZ2F0ZUZQQ29udHJvbCh0ZWFtKTsKKworICAgIGlmICggX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMgKSB7CisgICAgICAgIC8vIFNldCBtYXN0ZXIncyB0YXNrIHRlYW0gdG8gdGVhbSdzIHRhc2sgdGVhbS4gVW5sZXNzIHRoaXMgaXMgaG90IHRlYW0sIGl0IHNob3VsZCBiZSBOVUxMLgorICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBtYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfdGVhbSA9PSBwYXJlbnRfdGVhbS0+dC50X3Rhc2tfdGVhbSApOworICAgICAgICBLQV9UUkFDRSggMjAsICggIl9fa21wX2ZvcmtfY2FsbDogTWFzdGVyIFQjJWQgcHVzaGluZyB0YXNrX3RlYW0gJXAgLyB0ZWFtICVwLCBuZXcgdGFza190ZWFtICVwIC8gdGVhbSAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCBtYXN0ZXJfdGggKSwgbWFzdGVyX3RoLT50aC50aF90YXNrX3RlYW0sCisgICAgICAgICAgICAgICAgICAgICAgcGFyZW50X3RlYW0sIHRlYW0tPnQudF90YXNrX3RlYW0sIHRlYW0gKSApOworICAgICAgICBtYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfdGVhbSA9IHRlYW0tPnQudF90YXNrX3RlYW07CisjaWYgIUtNUF9ORVNURURfSE9UX1RFQU1TCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoKG1hc3Rlcl90aC0+dGgudGhfdGFza190ZWFtID09IE5VTEwpIHx8ICh0ZWFtID09IHJvb3QtPnIucl9ob3RfdGVhbSkpOworI2VuZGlmCisgICAgfQorCisgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2ZvcmtfY2FsbDogVCMlZCglZDolZCktPiglZDowKSBjcmVhdGVkIGEgdGVhbSBvZiAlZCB0aHJlYWRzXG4iLAorICAgICAgICAgICAgICAgIGd0aWQsIHBhcmVudF90ZWFtLT50LnRfaWQsIHRlYW0tPnQudF9tYXN0ZXJfdGlkLCB0ZWFtLT50LnRfaWQsIHRlYW0tPnQudF9ucHJvYyApKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0ZWFtICE9IHJvb3QtPnIucl9ob3RfdGVhbSB8fAorICAgICAgICAgICAgICAgICAgICAgICggdGVhbS0+dC50X21hc3Rlcl90aWQgPT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKCB0ZWFtLT50LnRfcGFyZW50ID09IHJvb3QtPnIucl9yb290X3RlYW0gfHwgdGVhbS0+dC50X3BhcmVudC0+dC50X3NlcmlhbGl6ZWQgKSApKTsKKyAgICBLTVBfTUIoKTsKKworICAgIC8qIG5vdywgc2V0dXAgdGhlIGFyZ3VtZW50cyAqLworICAgIGFyZ3YgPSAodm9pZCoqKXRlYW0tPnQudF9hcmd2OworI2lmIE9NUF80MF9FTkFCTEVECisgICAgaWYgKCBhcCApIHsKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworICAgICAgICBmb3IgKCBpPWFyZ2MtMTsgaSA+PSAwOyAtLWkgKQorLy8gVE9ETzogcmV2ZXJ0IHdvcmthcm91bmQgZm9yIEludGVsKFIpIDY0IHRyYWNrZXIgIzk2CisjaWYgKEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0gfHwgS01QX0FSQ0hfQUFSQ0g2NCkgJiYgS01QX09TX0xJTlVYCisgICAgICAgICAgICAqYXJndisrID0gdmFfYXJnKCAqYXAsIHZvaWQgKiApOworI2Vsc2UKKyAgICAgICAgICAgICphcmd2KysgPSB2YV9hcmcoIGFwLCB2b2lkICogKTsKKyNlbmRpZgorI2lmIE9NUF80MF9FTkFCTEVECisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yICggaT0wOyBpIDwgYXJnYzsgKytpICkKKyAgICAgICAgICAgIC8vIEdldCBhcmdzIGZyb20gcGFyZW50IHRlYW0gZm9yIHRlYW1zIGNvbnN0cnVjdAorICAgICAgICAgICAgYXJndltpXSA9IHRlYW0tPnQudF9wYXJlbnQtPnQudF9hcmd2W2ldOworICAgIH0KKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworCisgICAgLyogbm93IGFjdHVhbGx5IGZvcmsgdGhlIHRocmVhZHMgKi8KKyAgICB0ZWFtLT50LnRfbWFzdGVyX2FjdGl2ZSA9IG1hc3Rlcl9hY3RpdmU7CisgICAgaWYgKCFyb290LT5yLnJfYWN0aXZlKSAvLyBPbmx5IGRvIGFzc2lnbm1lbnQgaWYgaXQgcHJldmVudHMgY2FjaGUgcGluZy1wb25nCisgICAgICAgIHJvb3QtPnIucl9hY3RpdmUgPSBUUlVFOworCisgICAgX19rbXBfZm9ya190ZWFtX3RocmVhZHMoIHJvb3QsIHRlYW0sIG1hc3Rlcl90aCwgZ3RpZCApOworICAgIF9fa21wX3NldHVwX2ljdl9jb3B5KCB0ZWFtLCBudGhyZWFkcywgJm1hc3Rlcl90aC0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLCBsb2MgKTsKKworCisgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJl9fa21wX2Zvcmtqb2luX2xvY2sgKTsKKworCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIC8vIE1hcmsgc3RhcnQgb2YgInBhcmFsbGVsIiByZWdpb24gZm9yIFZUdW5lLiBPbmx5IHVzZSBvbmUgb2YgZnJhbWUgbm90aWZpY2F0aW9uIHNjaGVtZSBhdCB0aGUgbW9tZW50LgorICAgIGlmICgoX19pdHRfZnJhbWVfYmVnaW5fdjNfcHRyICYmIF9fa21wX2Zvcmtqb2luX2ZyYW1lcyAmJiAhX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGUpIHx8IEtNUF9JVFRfREVCVUcpCisjIGlmIE9NUF80MF9FTkFCTEVECisgICAgICAgIGlmICghbWFzdGVyX3RoLT50aC50aF90ZWFtc19taWNyb3Rhc2sgfHwgbWljcm90YXNrID09IChtaWNyb3Rhc2tfdClfX2ttcF90ZWFtc19tYXN0ZXIpCisgICAgICAgICAgICAvLyBFaXRoZXIgbm90IGluIHRlYW1zIG9yIHRoZSBvdXRlciBmb3JrIG9mIHRoZSB0ZWFtcyBjb25zdHJ1Y3QKKyMgZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKyAgICAgICAgeworICAgICAgICAgICAgX19rbXBfaXR0X3JlZ2lvbl9mb3JraW5nKGd0aWQsIHRlYW0tPnQudF9ucHJvYywgMCk7CisgICAgICAgIH0KKyAgICBrbXBfdWludDY0IHRtcF90aW1lID0gMDsKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIGlmICggX19pdHRfZ2V0X3RpbWVzdGFtcF9wdHIgKQorICAgICAgICB0bXBfdGltZSA9IF9faXR0X2dldF90aW1lc3RhbXAoKTsKKyNlbmRpZgorICAgIGlmICgoX19pdHRfZnJhbWVfc3VibWl0X3YzX3B0ciAmJiBfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZT09Myl8fCBLTVBfSVRUX0RFQlVHKQorIyBpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICBpZiAoIW1hc3Rlcl90aC0+dGgudGhfdGVhbXNfbWljcm90YXNrIHx8IG1pY3JvdGFzayA9PSAobWljcm90YXNrX3QpX19rbXBfdGVhbXNfbWFzdGVyKQorICAgICAgICAgICAgLy8gRWl0aGVyIG5vdCBpbiB0ZWFtcyBvciB0aGUgb3V0ZXIgZm9yayBvZiB0aGUgdGVhbXMgY29uc3RydWN0CisjIGVuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisgICAgICAgICAgICB0ZWFtLT50LnRfcmVnaW9uX3RpbWUgPSB0bXBfdGltZTsKKworICAgIC8vIEludGVybmFsIGZvcmsgLSByZXBvcnQgZnJhbWUgYmVnaW4KKyAgICBpZiAoKF9fa21wX2Zvcmtqb2luX2ZyYW1lc19tb2RlID09IDEgfHwgX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGUgPT0gMykgJiYgX19pdHRfZnJhbWVfc3VibWl0X3YzX3B0ciApIHsKKyAgICAgICAgaWYgKCEodGVhbS0+dC50X2FjdGl2ZV9sZXZlbCA+IDEpKSB7CisgICAgICAgICAgICBtYXN0ZXJfdGgtPnRoLnRoX2ZyYW1lX3RpbWUgID0gdG1wX3RpbWU7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgICAgLyogbm93IGdvIG9uIGFuZCBkbyB0aGUgd29yayAqLworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRlYW0gPT0gX19rbXBfdGhyZWFkc1tndGlkXS0+dGgudGhfdGVhbSApOworICAgIEtNUF9NQigpOworICAgIEtGX1RSQUNFKDEwLCAoIl9fa21wX2ludGVybmFsX2ZvcmsgOiByb290PSVwLCB0ZWFtPSVwLCBtYXN0ZXJfdGg9JXAsIGd0aWQ9JWRcbiIsCisgICAgICAgICAgICAgICAgICByb290LCB0ZWFtLCBtYXN0ZXJfdGgsIGd0aWQpKTsKKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBpZiAoIF9faXR0X3N0YWNrX2NhbGxlcl9jcmVhdGVfcHRyICkgeworICAgICAgICB0ZWFtLT50LnRfc3RhY2tfaWQgPSBfX2ttcF9pdHRfc3RhY2tfY2FsbGVyX2NyZWF0ZSgpOyAvLyBjcmVhdGUgbmV3IHN0YWNrIHN0aXRjaGluZyBpZCBiZWZvcmUgZW50ZXJpbmcgZm9yayBiYXJyaWVyCisgICAgfQorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworI2lmIE9NUF80MF9FTkFCTEVECisgICAgaWYgKCBhcCApICAgLy8gQUM6IHNraXAgX19rbXBfaW50ZXJuYWxfZm9yayBhdCB0ZWFtcyBjb25zdHJ1Y3QsIGxldCBvbmx5IG1hc3RlciB0aHJlYWRzIGV4ZWN1dGUKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworICAgIHsKKyAgICAgICAgX19rbXBfaW50ZXJuYWxfZm9yayggbG9jLCBndGlkLCB0ZWFtICk7CisgICAgICAgIEtGX1RSQUNFKDEwLCAoIl9fa21wX2ludGVybmFsX2ZvcmsgOiBhZnRlciA6IHJvb3Q9JXAsIHRlYW09JXAsIG1hc3Rlcl90aD0lcCwgZ3RpZD0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICByb290LCB0ZWFtLCBtYXN0ZXJfdGgsIGd0aWQpKTsKKyAgICB9CisKKyAgICBpZiAoY2FsbF9jb250ZXh0ID09IGZvcmtfY29udGV4dF9nbnUpIHsKKyAgICAgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2ZvcmtfY2FsbDogcGFyYWxsZWwgZXhpdCBUIyVkXG4iLCBndGlkICkpOworICAgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgICAvKiBJbnZva2UgbWljcm90YXNrIGZvciBNQVNURVIgdGhyZWFkICovCisgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2ZvcmtfY2FsbDogVCMlZCglZDowKSBpbnZva2UgbWljcm90YXNrID0gJXBcbiIsCisgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0ZWFtLT50LnRfcGtmbiApICk7CisgICAgfSAgLy8gRU5EIG9mIHRpbWVyIEtNUF9mb3JrX2NhbGwgYmxvY2sKKworICAgIHsKKyAgICAgICAgLy9LTVBfVElNRV9CTE9DSyhPTVBfd29yayk7CisgICAgICAgIEtNUF9USU1FX0JMT0NLKFVTRVJfbWFzdGVyX2ludm9rZSk7CisgICAgICAgIGlmICghIHRlYW0tPnQudF9pbnZva2UoIGd0aWQgKSkgeworICAgICAgICAgICAgS01QX0FTU0VSVDIoIDAsICJjYW5ub3QgaW52b2tlIG1pY3JvdGFzayBmb3IgTUFTVEVSIHRocmVhZCIgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfZm9ya19jYWxsOiBUIyVkKCVkOjApIGRvbmUgbWljcm90YXNrID0gJXBcbiIsCisgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGVhbS0+dC50X3BrZm4gKSApOworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2ZvcmtfY2FsbDogcGFyYWxsZWwgZXhpdCBUIyVkXG4iLCBndGlkICkpOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKK3ZvaWQKK19fa21wX2pvaW5fY2FsbChpZGVudF90ICpsb2MsIGludCBndGlkCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgICAgICAgICwgaW50IGV4aXRfdGVhbXMKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworKQoreworICAgIEtNUF9USU1FX0JMT0NLKEtNUF9qb2luX2NhbGwpOworICAgIGttcF90ZWFtX3QgICAgICp0ZWFtOworICAgIGttcF90ZWFtX3QgICAgICpwYXJlbnRfdGVhbTsKKyAgICBrbXBfaW5mb190ICAgICAqbWFzdGVyX3RoOworICAgIGttcF9yb290X3QgICAgICpyb290OworICAgIGludCAgICAgICAgICAgICBtYXN0ZXJfYWN0aXZlOworICAgIGludCAgICAgICAgICAgICBpOworCisgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2pvaW5fY2FsbDogZW50ZXIgVCMlZFxuIiwgZ3RpZCApKTsKKworICAgIC8qIHNldHVwIGN1cnJlbnQgZGF0YSAqLworICAgIG1hc3Rlcl90aCAgICAgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisgICAgcm9vdCAgICAgICAgICA9IG1hc3Rlcl90aC0+dGgudGhfcm9vdDsKKyAgICB0ZWFtICAgICAgICAgID0gbWFzdGVyX3RoLT50aC50aF90ZWFtOworICAgIHBhcmVudF90ZWFtICAgPSB0ZWFtLT50LnRfcGFyZW50OworCisgICAgbWFzdGVyX3RoLT50aC50aF9pZGVudCA9IGxvYzsKKworI2lmIEtNUF9ERUJVRworICAgIGlmICggX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMgKSB7CisgICAgICAgIEtBX1RSQUNFKCAyMCwgKCAiX19rbXBfam9pbl9jYWxsOiBUIyVkLCBvbGQgdGVhbSA9ICVwIG9sZCB0YXNrX3RlYW0gPSAlcCwgdGhfdGFza190ZWFtID0gJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggbWFzdGVyX3RoICksIHRlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X3Rhc2tfdGVhbSwgbWFzdGVyX3RoLT50aC50aF90YXNrX3RlYW0pICk7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIG1hc3Rlcl90aC0+dGgudGhfdGFza190ZWFtID09IHRlYW0tPnQudF90YXNrX3RlYW0gKTsKKyAgICB9CisjZW5kaWYKKworICAgIGlmKCB0ZWFtLT50LnRfc2VyaWFsaXplZCApIHsKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICBpZiAoIG1hc3Rlcl90aC0+dGgudGhfdGVhbXNfbWljcm90YXNrICkgeworICAgICAgICAgICAgLy8gV2UgYXJlIGluIHRlYW1zIGNvbnN0cnVjdAorICAgICAgICAgICAgaW50IGxldmVsID0gdGVhbS0+dC50X2xldmVsOworICAgICAgICAgICAgaW50IHRsZXZlbCA9IG1hc3Rlcl90aC0+dGgudGhfdGVhbXNfbGV2ZWw7CisgICAgICAgICAgICBpZiAoIGxldmVsID09IHRsZXZlbCApIHsKKyAgICAgICAgICAgICAgICAvLyBBQzogd2UgaGF2ZW4ndCBpbmNyZW1lbnRlZCBpdCBlYXJsaWVyIGF0IHN0YXJ0IG9mIHRlYW1zIGNvbnN0cnVjdCwKKyAgICAgICAgICAgICAgICAvLyAgICAgc28gZG8gaXQgaGVyZSAtIGF0IHRoZSBlbmQgb2YgdGVhbXMgY29uc3RydWN0CisgICAgICAgICAgICAgICAgdGVhbS0+dC50X2xldmVsKys7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCBsZXZlbCA9PSB0bGV2ZWwgKyAxICkgeworICAgICAgICAgICAgICAgIC8vIEFDOiB3ZSBhcmUgZXhpdGluZyBwYXJhbGxlbCBpbnNpZGUgdGVhbXMsIG5lZWQgdG8gaW5jcmVtZW50IHNlcmlhbGl6YXRpb24KKyAgICAgICAgICAgICAgICAvLyAgICAgaW4gb3JkZXIgdG8gcmVzdG9yZSBpdCBpbiB0aGUgbmV4dCBjYWxsIHRvIF9fa21wY19lbmRfc2VyaWFsaXplZF9wYXJhbGxlbAorICAgICAgICAgICAgICAgIHRlYW0tPnQudF9zZXJpYWxpemVkKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworICAgICAgICBfX2ttcGNfZW5kX3NlcmlhbGl6ZWRfcGFyYWxsZWwoIGxvYywgZ3RpZCApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbWFzdGVyX2FjdGl2ZSA9IHRlYW0tPnQudF9tYXN0ZXJfYWN0aXZlOworCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBpZiAoIWV4aXRfdGVhbXMpCisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKyAgICB7CisgICAgICAgIC8vIEFDOiBObyBiYXJyaWVyIGZvciBpbnRlcm5hbCB0ZWFtcyBhdCBleGl0IGZyb20gdGVhbXMgY29uc3RydWN0LgorICAgICAgICAvLyAgICAgQnV0IHRoZXJlIGlzIGJhcnJpZXIgZm9yIGV4dGVybmFsIHRlYW0gKGxlYWd1ZSkuCisgICAgICAgIF9fa21wX2ludGVybmFsX2pvaW4oIGxvYywgZ3RpZCwgdGVhbSApOworICAgIH0KKyAgICBLTVBfTUIoKTsKKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBpZiAoIF9faXR0X3N0YWNrX2NhbGxlcl9jcmVhdGVfcHRyICkgeworICAgICAgICBfX2ttcF9pdHRfc3RhY2tfY2FsbGVyX2Rlc3Ryb3koIChfX2l0dF9jYWxsZXIpdGVhbS0+dC50X3N0YWNrX2lkICk7IC8vIGRlc3Ryb3kgdGhlIHN0YWNrIHN0aXRjaGluZyBpZCBhZnRlciBqb2luIGJhcnJpZXIKKyAgICB9CisKKyAgICAvLyBNYXJrIGVuZCBvZiAicGFyYWxsZWwiIHJlZ2lvbiBmb3IgVlR1bmUuIE9ubHkgdXNlIG9uZSBvZiBmcmFtZSBub3RpZmljYXRpb24gc2NoZW1lIGF0IHRoZSBtb21lbnQuCisgICAgaWYgKCAoIF9faXR0X2ZyYW1lX2VuZF92M19wdHIgJiYgX19rbXBfZm9ya2pvaW5fZnJhbWVzICYmICEgX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGUgKSB8fCBLTVBfSVRUX0RFQlVHICkKKyMgaWYgT01QXzQwX0VOQUJMRUQKKyAgICBpZiAoICFtYXN0ZXJfdGgtPnRoLnRoX3RlYW1zX21pY3JvdGFzayAvKiBub3QgaW4gdGVhbXMgKi8gfHwKKyAgICAgICAgICggIWV4aXRfdGVhbXMgJiYgdGVhbS0+dC50X2xldmVsID09IG1hc3Rlcl90aC0+dGgudGhfdGVhbXNfbGV2ZWwgKSApCisgICAgICAgIC8vIEVpdGhlciBub3QgaW4gdGVhbXMgb3IgZXhpdGluZyB0ZWFtcyByZWdpb24KKyAgICAgICAgLy8gKHRlYW1zIGlzIGEgZnJhbWUgYW5kIG5vIG90aGVyIGZyYW1lcyBpbnNpZGUgdGhlIHRlYW1zKQorIyBlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworICAgIHsKKyAgICAgICAgbWFzdGVyX3RoLT50aC50aF9pZGVudCA9IGxvYzsKKyAgICAgICAgX19rbXBfaXR0X3JlZ2lvbl9qb2luZWQoIGd0aWQgKTsKKyAgICB9CisgICAgaWYgKCAoIF9faXR0X2ZyYW1lX3N1Ym1pdF92M19wdHIgJiYgX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGUgPT0gMyApIHx8IEtNUF9JVFRfREVCVUcgKQorIyBpZiBPTVBfNDBfRU5BQkxFRAorICAgIGlmICggIW1hc3Rlcl90aC0+dGgudGhfdGVhbXNfbWljcm90YXNrIC8qIG5vdCBpbiB0ZWFtcyAqLyB8fAorICAgICAgICAgKCAhZXhpdF90ZWFtcyAmJiB0ZWFtLT50LnRfbGV2ZWwgPT0gbWFzdGVyX3RoLT50aC50aF90ZWFtc19sZXZlbCApICkKKyAgICAgICAgLy8gRWl0aGVyIG5vdCBpbiB0ZWFtcyBvciBleGl0aW5nIHRlYW1zIHJlZ2lvbgorICAgICAgICAvLyAodGVhbXMgaXMgYSBmcmFtZSBhbmQgbm8gb3RoZXIgZnJhbWVzIGluc2lkZSB0aGUgdGVhbXMpCisjIGVuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisgICAgeworICAgICAgICBtYXN0ZXJfdGgtPnRoLnRoX2lkZW50ID0gbG9jOworICAgICAgICBfX2ttcF9pdHRfZnJhbWVfc3VibWl0KCBndGlkLCB0ZWFtLT50LnRfcmVnaW9uX3RpbWUsIG1hc3Rlcl90aC0+dGgudGhfZnJhbWVfdGltZSwgMCwgbG9jLCBtYXN0ZXJfdGgtPnRoLnRoX3RlYW1fbnByb2MsIDEgKTsKKyAgICB9CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBpZiAoIG1hc3Rlcl90aC0+dGgudGhfdGVhbXNfbWljcm90YXNrICYmCisgICAgICAgICAhZXhpdF90ZWFtcyAmJgorICAgICAgICAgdGVhbS0+dC50X3BrZm4gIT0gKG1pY3JvdGFza190KV9fa21wX3RlYW1zX21hc3RlciAmJgorICAgICAgICAgdGVhbS0+dC50X2xldmVsID09IG1hc3Rlcl90aC0+dGgudGhfdGVhbXNfbGV2ZWwgKyAxICkgeworICAgICAgICAvLyBBQzogV2UgbmVlZCB0byBsZWF2ZSB0aGUgdGVhbSBzdHJ1Y3R1cmUgaW50YWN0IGF0IHRoZSBlbmQKKyAgICAgICAgLy8gICAgIG9mIHBhcmFsbGVsIGluc2lkZSB0aGUgdGVhbXMgY29uc3RydWN0LCBzbyB0aGF0IGF0IHRoZSBuZXh0CisgICAgICAgIC8vICAgICBwYXJhbGxlbCBzYW1lIChob3QpIHRlYW0gd29ya3MsIG9ubHkgYWRqdXN0IG5lc3RpbmcgbGV2ZWxzCisKKyAgICAgICAgLyogRGVjcmVtZW50IG91ciBuZXN0ZWQgZGVwdGggbGV2ZWwgKi8KKyAgICAgICAgdGVhbS0+dC50X2xldmVsIC0tOworICAgICAgICB0ZWFtLT50LnRfYWN0aXZlX2xldmVsIC0tOworICAgICAgICBLTVBfVEVTVF9USEVOX0RFQzMyKCAoa21wX2ludDMyKikgJnJvb3QtPnIucl9pbl9wYXJhbGxlbCApOworCisgICAgICAgIC8qIFJlc3RvcmUgbnVtYmVyIG9mIHRocmVhZHMgaW4gdGhlIHRlYW0gaWYgbmVlZGVkICovCisgICAgICAgIGlmICggbWFzdGVyX3RoLT50aC50aF90ZWFtX25wcm9jIDwgbWFzdGVyX3RoLT50aC50aF90ZWFtc19zaXplLm50aCApIHsKKyAgICAgICAgICAgIGludCBvbGRfbnVtID0gbWFzdGVyX3RoLT50aC50aF90ZWFtX25wcm9jOworICAgICAgICAgICAgaW50IG5ld19udW0gPSBtYXN0ZXJfdGgtPnRoLnRoX3RlYW1zX3NpemUubnRoOworICAgICAgICAgICAga21wX2luZm9fdCAqKm90aGVyX3RocmVhZHMgPSB0ZWFtLT50LnRfdGhyZWFkczsKKyAgICAgICAgICAgIHRlYW0tPnQudF9ucHJvYyA9IG5ld19udW07CisgICAgICAgICAgICBmb3IgKCBpID0gMDsgaSA8IG9sZF9udW07ICsraSApIHsKKyAgICAgICAgICAgICAgICBvdGhlcl90aHJlYWRzW2ldLT50aC50aF90ZWFtX25wcm9jID0gbmV3X251bTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEFkanVzdCBzdGF0ZXMgb2Ygbm9uLXVzZWQgdGhyZWFkcyBvZiB0aGUgdGVhbQorICAgICAgICAgICAgZm9yICggaSA9IG9sZF9udW07IGkgPCBuZXdfbnVtOyArK2kgKSB7CisgICAgICAgICAgICAgICAgLy8gUmUtaW5pdGlhbGl6ZSB0aHJlYWQncyBiYXJyaWVyIGRhdGEuCisgICAgICAgICAgICAgICAgaW50IGI7CisgICAgICAgICAgICAgICAga21wX2JhbGlnbl90ICogYmFsaWduID0gb3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfYmFyOworICAgICAgICAgICAgICAgIGZvciAoIGIgPSAwOyBiIDwgYnNfbGFzdF9iYXJyaWVyOyArKyBiICkgeworICAgICAgICAgICAgICAgICAgICBiYWxpZ25bIGIgXS5iYi5iX2Fycml2ZWQgICAgICAgID0gdGVhbS0+dC50X2JhclsgYiBdLmJfYXJyaXZlZDsKKyAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChiYWxpZ25bIGIgXS5iYi53YWl0X2ZsYWcgIT0gS01QX0JBUlJJRVJfUEFSRU5UX0ZMQUcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBTeW5jaHJvbml6ZSB0aHJlYWQncyB0YXNrIHN0YXRlCisgICAgICAgICAgICAgICAgb3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfdGFza19zdGF0ZSA9IG1hc3Rlcl90aC0+dGgudGhfdGFza19zdGF0ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisKKyAgICAvKiBkbyBjbGVhbnVwIGFuZCByZXN0b3JlIHRoZSBwYXJlbnQgdGVhbSAqLworICAgIG1hc3Rlcl90aC0+dGgudGhfaW5mbyAuZHMuZHNfdGlkID0gdGVhbS0+dC50X21hc3Rlcl90aWQ7CisgICAgbWFzdGVyX3RoLT50aC50aF9sb2NhbC50aGlzX2NvbnN0cnVjdCA9IHRlYW0tPnQudF9tYXN0ZXJfdGhpc19jb25zOworCisgICAgbWFzdGVyX3RoLT50aC50aF9kaXNwYXRjaCA9CisgICAgICAgICAgICAgICAgJiBwYXJlbnRfdGVhbS0+dC50X2Rpc3BhdGNoWyB0ZWFtLT50LnRfbWFzdGVyX3RpZCBdOworCisgICAgLyogamM6IFRoZSBmb2xsb3dpbmcgbG9jayBoYXMgaW5zdHJ1Y3Rpb25zIHdpdGggUkVMIGFuZCBBQ1Egc2VtYW50aWNzLAorICAgICAgIHNlcGFyYXRpbmcgdGhlIHBhcmFsbGVsIHVzZXIgY29kZSBjYWxsZWQgaW4gdGhpcyBwYXJhbGxlbCByZWdpb24KKyAgICAgICBmcm9tIHRoZSBzZXJpYWwgdXNlciBjb2RlIGNhbGxlZCBhZnRlciB0aGlzIGZ1bmN0aW9uIHJldHVybnMuCisgICAgKi8KKyAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfZm9ya2pvaW5fbG9jayApOworCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBpZiAoICFtYXN0ZXJfdGgtPnRoLnRoX3RlYW1zX21pY3JvdGFzayB8fCB0ZWFtLT50LnRfbGV2ZWwgPiBtYXN0ZXJfdGgtPnRoLnRoX3RlYW1zX2xldmVsICkKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworICAgIHsKKyAgICAgICAgLyogRGVjcmVtZW50IG91ciBuZXN0ZWQgZGVwdGggbGV2ZWwgKi8KKyAgICAgICAgS01QX1RFU1RfVEhFTl9ERUMzMiggKGttcF9pbnQzMiopICZyb290LT5yLnJfaW5fcGFyYWxsZWwgKTsKKyAgICB9CisgICAgS01QX0RFQlVHX0FTU0VSVCggcm9vdC0+ci5yX2luX3BhcmFsbGVsID49IDAgKTsKKworICAgIEtGX1RSQUNFKCAxMCwgKCJfX2ttcF9qb2luX2NhbGwxOiBUIyVkLCB0aGlzX3RocmVhZD0lcCB0ZWFtPSVwXG4iLAorICAgICAgICAgICAgICAgICAgIDAsIG1hc3Rlcl90aCwgdGVhbSApICk7CisgICAgX19rbXBfcG9wX2N1cnJlbnRfdGFza19mcm9tX3RocmVhZCggbWFzdGVyX3RoICk7CisKKyNpZiBPTVBfNDBfRU5BQkxFRCAmJiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgLy8KKyAgICAvLyBSZXN0b3JlIG1hc3RlciB0aHJlYWQncyBwYXJ0aXRpb24uCisgICAgLy8KKyAgICBtYXN0ZXJfdGgtPnRoLnRoX2ZpcnN0X3BsYWNlID0gdGVhbS0+dC50X2ZpcnN0X3BsYWNlOworICAgIG1hc3Rlcl90aC0+dGgudGhfbGFzdF9wbGFjZSA9IHRlYW0tPnQudF9sYXN0X3BsYWNlOworI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisKKyAgICB1cGRhdGVIV0ZQQ29udHJvbCAodGVhbSk7CisKKyAgICBpZiAoIHJvb3QtPnIucl9hY3RpdmUgIT0gbWFzdGVyX2FjdGl2ZSApCisgICAgICAgIHJvb3QtPnIucl9hY3RpdmUgPSBtYXN0ZXJfYWN0aXZlOworCisgICAgX19rbXBfZnJlZV90ZWFtKCByb290LCB0ZWFtIFVTRV9ORVNURURfSE9UX0FSRyhtYXN0ZXJfdGgpICk7IC8vIHRoaXMgd2lsbCBmcmVlIHdvcmtlciB0aHJlYWRzCisKKyAgICAvKiB0aGlzIHJhY2Ugd2FzIGZ1biB0byBmaW5kLiAgbWFrZSBzdXJlIHRoZSBmb2xsb3dpbmcgaXMgaW4gdGhlIGNyaXRpY2FsCisgICAgICogcmVnaW9uIG90aGVyd2lzZSBhc3NlcnRpb25zIG1heSBmYWlsIG9jY2FzaW91bmFsbHkgc2luY2UgdGhlIG9sZCB0ZWFtCisgICAgICogbWF5IGJlIHJlYWxsb2NhdGVkIGFuZCB0aGUgaGllcmFyY2h5IGFwcGVhcnMgaW5jb25zaXN0ZW50LiAgaXQgaXMKKyAgICAgKiBhY3R1YWxseSBzYWZlIHRvIHJ1biBhbmQgd29uJ3QgY2F1c2UgYW55IGJ1Z3MsIGJ1dCB3aWxsIGNhdXNlIHRob29zZQorICAgICAqIGFzc2VydGlvbiBmYWlsdXJlcy4gIGl0J3Mgb25seSBvbmUgZGVyZWYmYXNzaWduIHNvIG1pZ2h0IGFzIHdlbGwgcHV0IHRoaXMKKyAgICAgKiBpbiB0aGUgY3JpdGljYWwgcmVnaW9uICovCisgICAgbWFzdGVyX3RoLT50aC50aF90ZWFtICAgICAgICA9ICAgcGFyZW50X3RlYW07CisgICAgbWFzdGVyX3RoLT50aC50aF90ZWFtX25wcm9jICA9ICAgcGFyZW50X3RlYW0tPnQudF9ucHJvYzsKKyAgICBtYXN0ZXJfdGgtPnRoLnRoX3RlYW1fbWFzdGVyID0gICBwYXJlbnRfdGVhbS0+dC50X3RocmVhZHNbMF07CisgICAgbWFzdGVyX3RoLT50aC50aF90ZWFtX3NlcmlhbGl6ZWQgPSBwYXJlbnRfdGVhbS0+dC50X3NlcmlhbGl6ZWQ7CisKKyAgICAvKiByZXN0b3JlIHNlcmlhbGl6ZWQgdGVhbSwgaWYgbmVlZCBiZSAqLworICAgIGlmKCBwYXJlbnRfdGVhbS0+dC50X3NlcmlhbGl6ZWQgJiYKKyAgICAgICAgcGFyZW50X3RlYW0gIT0gbWFzdGVyX3RoLT50aC50aF9zZXJpYWxfdGVhbSAmJgorICAgICAgICBwYXJlbnRfdGVhbSAhPSByb290LT5yLnJfcm9vdF90ZWFtICkgeworICAgICAgICAgICAgX19rbXBfZnJlZV90ZWFtKCByb290LCBtYXN0ZXJfdGgtPnRoLnRoX3NlcmlhbF90ZWFtIFVTRV9ORVNURURfSE9UX0FSRyhOVUxMKSApOworICAgICAgICAgICAgbWFzdGVyX3RoLT50aC50aF9zZXJpYWxfdGVhbSA9IHBhcmVudF90ZWFtOworICAgIH0KKworICAgIGlmICggX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMgKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIENvcHkgdGhlIHRhc2sgdGVhbSBmcm9tIHRoZSBuZXcgY2hpbGQgLyBvbGQgcGFyZW50IHRlYW0KKyAgICAgICAgLy8gdG8gdGhlIHRocmVhZC4gIElmIG5vbi1OVUxMLCBjb3B5IHRoZSBzdGF0ZSBmbGFnIGFsc28uCisgICAgICAgIC8vCisgICAgICAgIGlmICggKCBtYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfdGVhbSA9IHBhcmVudF90ZWFtLT50LnRfdGFza190ZWFtICkgIT0gTlVMTCApIHsKKyAgICAgICAgICAgIG1hc3Rlcl90aC0+dGgudGhfdGFza19zdGF0ZSA9IG1hc3Rlcl90aC0+dGgudGhfdGFza190ZWFtLT50dC50dF9zdGF0ZTsKKyAgICAgICAgfQorICAgICAgICBLQV9UUkFDRSggMjAsICggIl9fa21wX2pvaW5fY2FsbDogTWFzdGVyIFQjJWQgcmVzdG9yaW5nIHRhc2tfdGVhbSAlcCAvIHRlYW0gJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCBtYXN0ZXJfdGggKSwgbWFzdGVyX3RoLT50aC50aF90YXNrX3RlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRfdGVhbSApICk7CisgICAgfQorCisgICAgIC8vIFRPRE86IEdFSCAtIGNhbm5vdCBkbyB0aGlzIGFzc2VydGlvbiBiZWNhdXNlIHJvb3QgdGhyZWFkIG5vdCBzZXQgdXAgYXMgZXhlY3V0aW5nCisgICAgIC8vIEtNUF9BU1NFUlQoIG1hc3Rlcl90aC0+dGgudGhfY3VycmVudF90YXNrLT50ZF9mbGFncy5leGVjdXRpbmcgPT0gMCApOworICAgICBtYXN0ZXJfdGgtPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfZmxhZ3MuZXhlY3V0aW5nID0gMTsKKworICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9mb3Jram9pbl9sb2NrICk7CisKKyAgICBLTVBfTUIoKTsKKyAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfam9pbl9jYWxsOiBleGl0IFQjJWRcbiIsIGd0aWQgKSk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIENoZWNrIHdoZXRoZXIgd2Ugc2hvdWxkIHB1c2ggYW4gaW50ZXJuYWwgY29udHJvbCByZWNvcmQgb250byB0aGUKKyAgIHNlcmlhbCB0ZWFtIHN0YWNrLiAgSWYgc28sIGRvIGl0LiAgKi8KK3ZvaWQKK19fa21wX3NhdmVfaW50ZXJuYWxfY29udHJvbHMgKCBrbXBfaW5mb190ICogdGhyZWFkICkKK3sKKworICAgIGlmICggdGhyZWFkLT50aC50aF90ZWFtICE9IHRocmVhZC0+dGgudGhfc2VyaWFsX3RlYW0gKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKHRocmVhZC0+dGgudGhfdGVhbS0+dC50X3NlcmlhbGl6ZWQgPiAxKSB7CisgICAgICAgIGludCBwdXNoID0gMDsKKworICAgICAgICBpZiAodGhyZWFkLT50aC50aF90ZWFtLT50LnRfY29udHJvbF9zdGFja190b3AgPT0gTlVMTCkgeworICAgICAgICAgICAgcHVzaCA9IDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIHRocmVhZC0+dGgudGhfdGVhbS0+dC50X2NvbnRyb2xfc3RhY2tfdG9wLT5zZXJpYWxfbmVzdGluZ19sZXZlbCAhPQorICAgICAgICAgICAgICAgICB0aHJlYWQtPnRoLnRoX3RlYW0tPnQudF9zZXJpYWxpemVkICkgeworICAgICAgICAgICAgICAgIHB1c2ggPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChwdXNoKSB7ICAvKiBwdXNoIGEgcmVjb3JkIG9uIHRoZSBzZXJpYWwgdGVhbSdzIHN0YWNrICovCisgICAgICAgICAgICBrbXBfaW50ZXJuYWxfY29udHJvbF90ICogY29udHJvbCA9IChrbXBfaW50ZXJuYWxfY29udHJvbF90ICopIF9fa21wX2FsbG9jYXRlKHNpemVvZihrbXBfaW50ZXJuYWxfY29udHJvbF90KSk7CisKKyAgICAgICAgICAgIGNvcHlfaWN2cyggY29udHJvbCwgJiB0aHJlYWQtPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cyApOworCisgICAgICAgICAgICBjb250cm9sLT5zZXJpYWxfbmVzdGluZ19sZXZlbCA9IHRocmVhZC0+dGgudGhfdGVhbS0+dC50X3NlcmlhbGl6ZWQ7CisKKyAgICAgICAgICAgIGNvbnRyb2wtPm5leHQgPSB0aHJlYWQtPnRoLnRoX3RlYW0tPnQudF9jb250cm9sX3N0YWNrX3RvcDsKKyAgICAgICAgICAgIHRocmVhZC0+dGgudGhfdGVhbS0+dC50X2NvbnRyb2xfc3RhY2tfdG9wID0gY29udHJvbDsKKyAgICAgICAgfQorICAgIH0KK30KKworLyogQ2hhbmdlcyBzZXRfbnByb2MgKi8KK3ZvaWQKK19fa21wX3NldF9udW1fdGhyZWFkcyggaW50IG5ld19udGgsIGludCBndGlkICkKK3sKKyAgICBrbXBfaW5mb190ICp0aHJlYWQ7CisgICAga21wX3Jvb3RfdCAqcm9vdDsKKworICAgIEtGX1RSQUNFKCAxMCwgKCJfX2ttcF9zZXRfbnVtX3RocmVhZHM6IG5ldyBfX2ttcF9udGggPSAlZFxuIiwgbmV3X250aCApKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOworCisgICAgaWYgKG5ld19udGggPCAxKQorICAgICAgICBuZXdfbnRoID0gMTsKKyAgICBlbHNlIGlmIChuZXdfbnRoID4gX19rbXBfbWF4X250aCkKKyAgICAgICAgbmV3X250aCA9IF9fa21wX21heF9udGg7CisKKyAgICB0aHJlYWQgPSBfX2ttcF90aHJlYWRzW2d0aWRdOworCisgICAgX19rbXBfc2F2ZV9pbnRlcm5hbF9jb250cm9scyggdGhyZWFkICk7CisKKyAgICBzZXRfX25wcm9jKCB0aHJlYWQsIG5ld19udGggKTsKKworICAgIC8vCisgICAgLy8gSWYgdGhpcyBvbXBfc2V0X251bV90aHJlYWRzKCkgY2FsbCB3aWxsIGNhdXNlIHRoZSBob3QgdGVhbSBzaXplIHRvIGJlCisgICAgLy8gcmVkdWNlZCAoaW4gdGhlIGFic2VuY2Ugb2YgYSBudW1fdGhyZWFkcyBjbGF1c2UpLCB0aGVuIHJlZHVjZSBpdCBub3csCisgICAgLy8gcmF0aGVyIHRoYW4gd2FpdGluZyBmb3IgdGhlIG5leHQgcGFyYWxsZWwgcmVnaW9uLgorICAgIC8vCisgICAgcm9vdCA9IHRocmVhZC0+dGgudGhfcm9vdDsKKyAgICBpZiAoIF9fa21wX2luaXRfcGFyYWxsZWwgJiYgKCAhIHJvb3QtPnIucl9hY3RpdmUgKQorICAgICAgJiYgKCByb290LT5yLnJfaG90X3RlYW0tPnQudF9ucHJvYyA+IG5ld19udGggKQorI2lmIEtNUF9ORVNURURfSE9UX1RFQU1TCisgICAgICAmJiBfX2ttcF9ob3RfdGVhbXNfbWF4X2xldmVsICYmICFfX2ttcF9ob3RfdGVhbXNfbW9kZQorI2VuZGlmCisgICAgKSB7CisgICAgICAgIGttcF90ZWFtX3QgKmhvdF90ZWFtID0gcm9vdC0+ci5yX2hvdF90ZWFtOworICAgICAgICBpbnQgZjsKKworICAgICAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfZm9ya2pvaW5fbG9jayApOworCisKKyAgICAgICAgaWYgKCBfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYyApIHsKKyAgICAgICAgICAgIGttcF90YXNrX3RlYW1fdCAqdGFza190ZWFtID0gaG90X3RlYW0tPnQudF90YXNrX3RlYW07CisgICAgICAgICAgICBpZiAoICggdGFza190ZWFtICE9IE5VTEwgKSAmJiBUQ1JfU1lOQ180KHRhc2tfdGVhbS0+dHQudHRfYWN0aXZlKSApIHsKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIFNpZ25hbCB0aGUgd29ya2VyIHRocmVhZHMgKGVzcC4gdGhlIGV4dHJhIG9uZXMpIHRvIHN0b3AKKyAgICAgICAgICAgICAgICAvLyBsb29raW5nIGZvciB0YXNrcyB3aGlsZSBzcGluIHdhaXRpbmcuICBUaGUgdGFzayB0ZWFtcworICAgICAgICAgICAgICAgIC8vIGFyZSByZWZlcmVuY2UgY291bnRlZCBhbmQgd2lsbCBiZSBkZWFsbG9jYXRlZCBieSB0aGUKKyAgICAgICAgICAgICAgICAvLyBsYXN0IHdvcmtlciB0aHJlYWQuCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBob3RfdGVhbS0+dC50X25wcm9jID4gMSApOworICAgICAgICAgICAgICAgIFRDV19TWU5DXzQoIHRhc2tfdGVhbS0+dHQudHRfYWN0aXZlLCBGQUxTRSApOworICAgICAgICAgICAgICAgIEtNUF9NQigpOworCisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoIDIwLCAoICJfX2ttcF9zZXRfbnVtX3RocmVhZHM6IHNldHRpbmcgdGFza190ZWFtICVwIHRvIE5VTExcbiIsCisgICAgICAgICAgICAgICAgICAmaG90X3RlYW0tPnQudF90YXNrX3RlYW0gKSApOworICAgICAgICAgICAgICAgICAgaG90X3RlYW0tPnQudF90YXNrX3RlYW0gPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGFza190ZWFtID09IE5VTEwgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIFJlbGVhc2UgdGhlIGV4dHJhIHRocmVhZHMgd2UgZG9uJ3QgbmVlZCBhbnkgbW9yZS4KKyAgICAgICAgLy8KKyAgICAgICAgZm9yICggZiA9IG5ld19udGg7ICBmIDwgaG90X3RlYW0tPnQudF9ucHJvYzsgZisrICkgeworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggaG90X3RlYW0tPnQudF90aHJlYWRzW2ZdICE9IE5VTEwgKTsKKyAgICAgICAgICAgIF9fa21wX2ZyZWVfdGhyZWFkKCBob3RfdGVhbS0+dC50X3RocmVhZHNbZl0gKTsKKyAgICAgICAgICAgIGhvdF90ZWFtLT50LnRfdGhyZWFkc1tmXSA9ICBOVUxMOworICAgICAgICB9CisgICAgICAgIGhvdF90ZWFtLT50LnRfbnByb2MgPSBuZXdfbnRoOworI2lmIEtNUF9ORVNURURfSE9UX1RFQU1TCisgICAgICAgIGlmKCB0aHJlYWQtPnRoLnRoX2hvdF90ZWFtcyApIHsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGhvdF90ZWFtID09IHRocmVhZC0+dGgudGhfaG90X3RlYW1zWzBdLmhvdF90ZWFtICk7CisgICAgICAgICAgICB0aHJlYWQtPnRoLnRoX2hvdF90ZWFtc1swXS5ob3RfdGVhbV9udGggPSBuZXdfbnRoOworICAgICAgICB9CisjZW5kaWYKKworCisgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9mb3Jram9pbl9sb2NrICk7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gVXBkYXRlIHRoZSB0X25wcm9jIGZpZWxkIGluIHRoZSB0aHJlYWRzIHRoYXQgYXJlIHN0aWxsIGFjdGl2ZS4KKyAgICAgICAgLy8KKyAgICAgICAgZm9yKCBmPTAgOyBmIDwgbmV3X250aDsgZisrICkgeworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggaG90X3RlYW0tPnQudF90aHJlYWRzW2ZdICE9IE5VTEwgKTsKKyAgICAgICAgICAgIGhvdF90ZWFtLT50LnRfdGhyZWFkc1tmXS0+dGgudGhfdGVhbV9ucHJvYyA9IG5ld19udGg7CisgICAgICAgIH0KKyAgICAgICAgLy8gU3BlY2lhbCBmbGFnIGluIGNhc2Ugb21wX3NldF9udW1fdGhyZWFkcygpIGNhbGwKKyAgICAgICAgaG90X3RlYW0tPnQudF9zaXplX2NoYW5nZWQgPSAtMTsKKyAgICB9CisKK30KKworLyogQ2hhbmdlcyBtYXhfYWN0aXZlX2xldmVscyAqLwordm9pZAorX19rbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzKCBpbnQgZ3RpZCwgaW50IG1heF9hY3RpdmVfbGV2ZWxzICkKK3sKKyAgICBrbXBfaW5mb190ICp0aHJlYWQ7CisKKyAgICBLRl9UUkFDRSggMTAsICggIl9fa21wX3NldF9tYXhfYWN0aXZlX2xldmVsczogbmV3IG1heF9hY3RpdmVfbGV2ZWxzIGZvciB0aHJlYWQgJWQgPSAoJWQpXG4iLCBndGlkLCBtYXhfYWN0aXZlX2xldmVscyApICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsKKworICAgIC8vIHZhbGlkYXRlIG1heF9hY3RpdmVfbGV2ZWxzCisgICAgaWYoIG1heF9hY3RpdmVfbGV2ZWxzIDwgMCApIHsKKyAgICAgICAgS01QX1dBUk5JTkcoIEFjdGl2ZUxldmVsc05lZ2F0aXZlLCBtYXhfYWN0aXZlX2xldmVscyApOworICAgICAgICAvLyBXZSBpZ25vcmUgdGhpcyBjYWxsIGlmIHRoZSB1c2VyIGhhcyBzcGVjaWZpZWQgYSBuZWdhdGl2ZSB2YWx1ZS4KKyAgICAgICAgLy8gVGhlIGN1cnJlbnQgc2V0dGluZyB3b24ndCBiZSBjaGFuZ2VkLiBUaGUgbGFzdCB2YWxpZCBzZXR0aW5nIHdpbGwgYmUgdXNlZC4KKyAgICAgICAgLy8gQSB3YXJuaW5nIHdpbGwgYmUgaXNzdWVkIChpZiB3YXJuaW5ncyBhcmUgYWxsb3dlZCBhcyBjb250cm9sbGVkIGJ5IHRoZSBLTVBfV0FSTklOR1MgZW52IHZhcikuCisgICAgICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzOiB0aGUgY2FsbCBpcyBpZ25vcmVkOiBuZXcgbWF4X2FjdGl2ZV9sZXZlbHMgZm9yIHRocmVhZCAlZCA9ICglZClcbiIsIGd0aWQsIG1heF9hY3RpdmVfbGV2ZWxzICkgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiggbWF4X2FjdGl2ZV9sZXZlbHMgPD0gS01QX01BWF9BQ1RJVkVfTEVWRUxTX0xJTUlUICkgeworICAgICAgICAvLyBpdCdzIE9LLCB0aGUgbWF4X2FjdGl2ZV9sZXZlbHMgaXMgd2l0aGluIHRoZSB2YWxpZCByYW5nZTogWyAwOyBLTVBfTUFYX0FDVElWRV9MRVZFTFNfTElNSVQgXQorICAgICAgICAvLyBXZSBhbGxvdyBhIHplcm8gdmFsdWUuIChpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIGJlaGF2aW9yKQorICAgIH0gZWxzZSB7CisgICAgICAgIEtNUF9XQVJOSU5HKCBBY3RpdmVMZXZlbHNFeGNlZWRMaW1pdCwgbWF4X2FjdGl2ZV9sZXZlbHMsIEtNUF9NQVhfQUNUSVZFX0xFVkVMU19MSU1JVCAgKTsKKyAgICAgICAgbWF4X2FjdGl2ZV9sZXZlbHMgPSBLTVBfTUFYX0FDVElWRV9MRVZFTFNfTElNSVQ7CisgICAgICAgIC8vIEN1cnJlbnQgdXBwZXIgbGltaXQgaXMgTUFYX0lOVC4gKGltcGxlbWVudGF0aW9uIGRlZmluZWQgYmVoYXZpb3IpCisgICAgICAgIC8vIElmIHRoZSBpbnB1dCBleGNlZWRzIHRoZSB1cHBlciBsaW1pdCwgd2UgY29ycmVjdCB0aGUgaW5wdXQgdG8gYmUgdGhlIHVwcGVyIGxpbWl0LiAoaW1wbGVtZW50YXRpb24gZGVmaW5lZCBiZWhhdmlvcikKKyAgICAgICAgLy8gQWN0dWFsbHksIHRoZSBmbG93IHNob3VsZCBuZXZlciBnZXQgaGVyZSB1bnRpbCB3ZSB1c2UgTUFYX0lOVCBsaW1pdC4KKyAgICB9CisgICAgS0ZfVFJBQ0UoIDEwLCAoICJfX2ttcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHM6IGFmdGVyIHZhbGlkYXRpb246IG5ldyBtYXhfYWN0aXZlX2xldmVscyBmb3IgdGhyZWFkICVkID0gKCVkKVxuIiwgZ3RpZCwgbWF4X2FjdGl2ZV9sZXZlbHMgKSApOworCisgICAgdGhyZWFkID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworCisgICAgX19rbXBfc2F2ZV9pbnRlcm5hbF9jb250cm9scyggdGhyZWFkICk7CisKKyAgICBzZXRfX21heF9hY3RpdmVfbGV2ZWxzKCB0aHJlYWQsIG1heF9hY3RpdmVfbGV2ZWxzICk7CisKK30KKworLyogR2V0cyBtYXhfYWN0aXZlX2xldmVscyAqLworaW50CitfX2ttcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMoIGludCBndGlkICkKK3sKKyAgICBrbXBfaW5mb190ICp0aHJlYWQ7CisKKyAgICBLRl9UUkFDRSggMTAsICggIl9fa21wX2dldF9tYXhfYWN0aXZlX2xldmVsczogdGhyZWFkICVkXG4iLCBndGlkICkgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOworCisgICAgdGhyZWFkID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRocmVhZC0+dGgudGhfY3VycmVudF90YXNrICk7CisgICAgS0ZfVFJBQ0UoIDEwLCAoICJfX2ttcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHM6IHRocmVhZCAlZCwgY3VydGFzaz0lcCwgY3VydGFza19tYXhhY2xldmVsPSVkXG4iLAorICAgICAgICBndGlkLCB0aHJlYWQtPnRoLnRoX2N1cnJlbnRfdGFzaywgdGhyZWFkLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMubWF4X2FjdGl2ZV9sZXZlbHMgKSApOworICAgIHJldHVybiB0aHJlYWQtPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5tYXhfYWN0aXZlX2xldmVsczsKK30KKworLyogQ2hhbmdlcyBkZWZfc2NoZWRfdmFyIElDViB2YWx1ZXMgKHJ1bi10aW1lIHNjaGVkdWxlIGtpbmQgYW5kIGNodW5rKSAqLwordm9pZAorX19rbXBfc2V0X3NjaGVkdWxlKCBpbnQgZ3RpZCwga21wX3NjaGVkX3Qga2luZCwgaW50IGNodW5rICkKK3sKKyAgICBrbXBfaW5mb190ICp0aHJlYWQ7CisvLyAgICBrbXBfdGVhbV90ICp0ZWFtOworCisgICAgS0ZfVFJBQ0UoIDEwLCAoIl9fa21wX3NldF9zY2hlZHVsZTogbmV3IHNjaGVkdWxlIGZvciB0aHJlYWQgJWQgPSAoJWQsICVkKVxuIiwgZ3RpZCwgKGludClraW5kLCBjaHVuayApKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOworCisgICAgLy8gQ2hlY2sgaWYgdGhlIGtpbmQgcGFyYW1ldGVyIGlzIHZhbGlkLCBjb3JyZWN0IGlmIG5lZWRlZC4KKyAgICAvLyBWYWxpZCBwYXJhbWV0ZXJzIHNob3VsZCBmaXQgaW4gb25lIG9mIHR3byBpbnRlcnZhbHMgLSBzdGFuZGFyZCBvciBleHRlbmRlZDoKKyAgICAvLyAgICAgICA8bG93ZXI+LCA8dmFsaWQ+LCA8dXBwZXJfc3RkPiwgPGxvd2VyX2V4dD4sIDx2YWxpZD4sIDx1cHBlcj4KKyAgICAvLyAyMDA4LTAxLTI1OiAwLCAgMSAtIDQsICAgICAgIDUsICAgICAgICAgMTAwLCAgICAgMTAxIC0gMTAyLCAxMDMKKyAgICBpZiAoIGtpbmQgPD0ga21wX3NjaGVkX2xvd2VyIHx8IGtpbmQgPj0ga21wX3NjaGVkX3VwcGVyIHx8CisgICAgICAgKCBraW5kIDw9IGttcF9zY2hlZF9sb3dlcl9leHQgJiYga2luZCA+PSBrbXBfc2NoZWRfdXBwZXJfc3RkICkgKQorICAgIHsKKyAgICAgICAgLy8gVE9ETzogSGludCBuZWVkcyBhdHRlbnRpb24gaW4gY2FzZSB3ZSBjaGFuZ2UgdGhlIGRlZmF1bHQgc2NoZWR1bGUuCisgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgIGttcF9tc193YXJuaW5nLAorICAgICAgICAgICAgS01QX01TRyggU2NoZWR1bGVLaW5kT3V0T2ZSYW5nZSwga2luZCApLAorICAgICAgICAgICAgS01QX0hOVCggRGVmYXVsdFNjaGVkdWxlS2luZFVzZWQsICJzdGF0aWMsIG5vIGNodW5rIiApLAorICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgKTsKKyAgICAgICAga2luZCA9IGttcF9zY2hlZF9kZWZhdWx0OworICAgICAgICBjaHVuayA9IDA7ICAgICAgICAgLy8gaWdub3JlIGNodW5rIHZhbHVlIGluIGNhc2Ugb2YgYmFkIGtpbmQKKyAgICB9CisKKyAgICB0aHJlYWQgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisKKyAgICBfX2ttcF9zYXZlX2ludGVybmFsX2NvbnRyb2xzKCB0aHJlYWQgKTsKKworICAgIGlmICgga2luZCA8IGttcF9zY2hlZF91cHBlcl9zdGQgKSB7CisgICAgICAgIGlmICgga2luZCA9PSBrbXBfc2NoZWRfc3RhdGljICYmIGNodW5rIDwgS01QX0RFRkFVTFRfQ0hVTksgKSB7CisgICAgICAgICAgICAvLyBkaWZmZXIgc3RhdGljIGNodW5rZWQgdnMuIHVuY2h1bmtlZDoKKyAgICAgICAgICAgIC8vIGNodW5rIHNob3VsZCBiZSBpbnZhbGlkIHRvIGluZGljYXRlIHVuY2h1bmtlZCBzY2hlZHVsZSAod2hpY2ggaXMgdGhlIGRlZmF1bHQpCisgICAgICAgICAgICB0aHJlYWQtPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5zY2hlZC5yX3NjaGVkX3R5cGUgPSBrbXBfc2NoX3N0YXRpYzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocmVhZC0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLnNjaGVkLnJfc2NoZWRfdHlwZSA9IF9fa21wX3NjaF9tYXBbIGtpbmQgLSBrbXBfc2NoZWRfbG93ZXIgLSAxIF07CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvLyAgICBfX2ttcF9zY2hfbWFwWyBraW5kIC0ga21wX3NjaGVkX2xvd2VyX2V4dCArIGttcF9zY2hlZF91cHBlcl9zdGQgLSBrbXBfc2NoZWRfbG93ZXIgLSAyIF07CisgICAgICAgIHRocmVhZC0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLnNjaGVkLnJfc2NoZWRfdHlwZSA9CisgICAgICAgICAgICBfX2ttcF9zY2hfbWFwWyBraW5kIC0ga21wX3NjaGVkX2xvd2VyX2V4dCArIGttcF9zY2hlZF91cHBlcl9zdGQgLSBrbXBfc2NoZWRfbG93ZXIgLSAyIF07CisgICAgfQorICAgIGlmICgga2luZCA9PSBrbXBfc2NoZWRfYXV0byApIHsKKyAgICAgICAgLy8gaWdub3JlIHBhcmFtZXRlciBjaHVuayBmb3Igc2NoZWR1bGUgYXV0bworICAgICAgICB0aHJlYWQtPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5zY2hlZC5jaHVuayA9IEtNUF9ERUZBVUxUX0NIVU5LOworICAgIH0gZWxzZSB7CisgICAgICAgIHRocmVhZC0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLnNjaGVkLmNodW5rID0gY2h1bms7CisgICAgfQorfQorCisvKiBHZXRzIGRlZl9zY2hlZF92YXIgSUNWIHZhbHVlcyAqLwordm9pZAorX19rbXBfZ2V0X3NjaGVkdWxlKCBpbnQgZ3RpZCwga21wX3NjaGVkX3QgKiBraW5kLCBpbnQgKiBjaHVuayApCit7CisgICAga21wX2luZm9fdCAgICAgKnRocmVhZDsKKyAgICBlbnVtIHNjaGVkX3R5cGUgdGhfdHlwZTsKKyAgICBpbnQgICAgICAgICAgICAgaTsKKworICAgIEtGX1RSQUNFKCAxMCwgKCJfX2ttcF9nZXRfc2NoZWR1bGU6IHRocmVhZCAlZFxuIiwgZ3RpZCApKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOworCisgICAgdGhyZWFkID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworCisgICAgLy90aF90eXBlID0gdGhyZWFkLT50aC50aF90ZWFtLT50LnRfc2V0X3NjaGVkWyB0aHJlYWQtPnRoLnRoX2luZm8uZHMuZHNfdGlkIF0ucl9zY2hlZF90eXBlOworICAgIHRoX3R5cGUgPSB0aHJlYWQtPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5zY2hlZC5yX3NjaGVkX3R5cGU7CisKKyAgICBzd2l0Y2ggKCB0aF90eXBlICkgeworICAgIGNhc2Uga21wX3NjaF9zdGF0aWM6CisgICAgY2FzZSBrbXBfc2NoX3N0YXRpY19ncmVlZHk6CisgICAgY2FzZSBrbXBfc2NoX3N0YXRpY19iYWxhbmNlZDoKKyAgICAgICAgKmtpbmQgPSBrbXBfc2NoZWRfc3RhdGljOworICAgICAgICAqY2h1bmsgPSAwOyAgIC8vIGNodW5rIHdhcyBub3Qgc2V0LCB0cnkgdG8gc2hvdyB0aGlzIGZhY3QgdmlhIHplcm8gdmFsdWUKKyAgICAgICAgcmV0dXJuOworICAgIGNhc2Uga21wX3NjaF9zdGF0aWNfY2h1bmtlZDoKKyAgICAgICAgKmtpbmQgPSBrbXBfc2NoZWRfc3RhdGljOworICAgICAgICBicmVhazsKKyAgICBjYXNlIGttcF9zY2hfZHluYW1pY19jaHVua2VkOgorICAgICAgICAqa2luZCA9IGttcF9zY2hlZF9keW5hbWljOworICAgICAgICBicmVhazsKKyAgICBjYXNlIGttcF9zY2hfZ3VpZGVkX2NodW5rZWQ6CisgICAgY2FzZSBrbXBfc2NoX2d1aWRlZF9pdGVyYXRpdmVfY2h1bmtlZDoKKyAgICBjYXNlIGttcF9zY2hfZ3VpZGVkX2FuYWx5dGljYWxfY2h1bmtlZDoKKyAgICAgICAgKmtpbmQgPSBrbXBfc2NoZWRfZ3VpZGVkOworICAgICAgICBicmVhazsKKyAgICBjYXNlIGttcF9zY2hfYXV0bzoKKyAgICAgICAgKmtpbmQgPSBrbXBfc2NoZWRfYXV0bzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBrbXBfc2NoX3RyYXBlem9pZGFsOgorICAgICAgICAqa2luZCA9IGttcF9zY2hlZF90cmFwZXpvaWRhbDsKKyAgICAgICAgYnJlYWs7CisvKgorICAgIGNhc2Uga21wX3NjaF9zdGF0aWNfc3RlYWw6CisgICAgICAgICpraW5kID0ga21wX3NjaGVkX3N0YXRpY19zdGVhbDsKKyAgICAgICAgYnJlYWs7CisqLworICAgIGRlZmF1bHQ6CisgICAgICAgIEtNUF9GQVRBTCggVW5rbm93blNjaGVkdWxpbmdUeXBlLCB0aF90eXBlICk7CisgICAgfQorCisgICAgLy8qY2h1bmsgPSB0aHJlYWQtPnRoLnRoX3RlYW0tPnQudF9zZXRfc2NoZWRbIHRocmVhZC0+dGgudGhfaW5mby5kcy5kc190aWQgXS5jaHVuazsKKyAgICAqY2h1bmsgPSB0aHJlYWQtPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5zY2hlZC5jaHVuazsKK30KKworaW50CitfX2ttcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bSggaW50IGd0aWQsIGludCBsZXZlbCApIHsKKworICAgIGludCBpaSwgZGQ7CisgICAga21wX3RlYW1fdCAqdGVhbTsKKyAgICBrbXBfaW5mb190ICp0aHI7CisKKyAgICBLRl9UUkFDRSggMTAsICgiX19rbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW06IHRocmVhZCAlZCAlZFxuIiwgZ3RpZCwgbGV2ZWwgKSk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsKKworICAgIC8vIHZhbGlkYXRlIGxldmVsCisgICAgaWYoIGxldmVsID09IDAgKSByZXR1cm4gMDsKKyAgICBpZiggbGV2ZWwgPCAwICkgcmV0dXJuIC0xOworICAgIHRociA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKyAgICB0ZWFtID0gdGhyLT50aC50aF90ZWFtOworICAgIGlpID0gdGVhbS0+dC50X2xldmVsOworICAgIGlmKCBsZXZlbCA+IGlpICkgcmV0dXJuIC0xOworCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBpZiggdGhyLT50aC50aF90ZWFtc19taWNyb3Rhc2sgKSB7CisgICAgICAgIC8vIEFDOiB3ZSBhcmUgaW4gdGVhbXMgcmVnaW9uIHdoZXJlIG11bHRpcGxlIG5lc3RlZCB0ZWFtcyBoYXZlIHNhbWUgbGV2ZWwKKyAgICAgICAgaW50IHRsZXZlbCA9IHRoci0+dGgudGhfdGVhbXNfbGV2ZWw7IC8vIHRoZSBsZXZlbCBvZiB0aGUgdGVhbXMgY29uc3RydWN0CisgICAgICAgIGlmKCBsZXZlbCA8PSB0bGV2ZWwgKSB7IC8vIG90aGVyd2lzZSB1c3VhbCBhbGdvcml0aG0gd29ya3MgKHdpbGwgbm90IHRvdWNoIHRoZSB0ZWFtcykKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGlpID49IHRsZXZlbCApOworICAgICAgICAgICAgLy8gQUM6IEFzIHdlIG5lZWQgdG8gcGFzcyBieSB0aGUgdGVhbXMgbGVhZ3VlLCB3ZSBuZWVkIHRvIGFydGlmaWNpYWxseSBpbmNyZWFzZSBpaQorICAgICAgICAgICAgaWYgKCBpaSA9PSB0bGV2ZWwgKSB7CisgICAgICAgICAgICAgICAgaWkgKz0gMjsgLy8gdGhyZWUgdGVhbXMgaGF2ZSBzYW1lIGxldmVsCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlpICsrOyAgIC8vIHR3byB0ZWFtcyBoYXZlIHNhbWUgbGV2ZWwKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgaWYoIGlpID09IGxldmVsICkgcmV0dXJuIF9fa21wX3RpZF9mcm9tX2d0aWQoIGd0aWQgKTsKKworICAgIGRkID0gdGVhbS0+dC50X3NlcmlhbGl6ZWQ7CisgICAgbGV2ZWwrKzsKKyAgICB3aGlsZSggaWkgPiBsZXZlbCApCisgICAgeworICAgICAgICBmb3IoIGRkID0gdGVhbS0+dC50X3NlcmlhbGl6ZWQ7ICggZGQgPiAwICkgJiYgKCBpaSA+IGxldmVsICk7IGRkLS0sIGlpLS0gKQorICAgICAgICB7CisgICAgICAgIH0KKyAgICAgICAgaWYoICggdGVhbS0+dC50X3NlcmlhbGl6ZWQgKSAmJiAoICFkZCApICkgeworICAgICAgICAgICAgdGVhbSA9IHRlYW0tPnQudF9wYXJlbnQ7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiggaWkgPiBsZXZlbCApIHsKKyAgICAgICAgICAgIHRlYW0gPSB0ZWFtLT50LnRfcGFyZW50OworICAgICAgICAgICAgZGQgPSB0ZWFtLT50LnRfc2VyaWFsaXplZDsKKyAgICAgICAgICAgIGlpLS07CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gKCBkZCA+IDEgKSA/ICggMCApIDogKCB0ZWFtLT50LnRfbWFzdGVyX3RpZCApOworfQorCitpbnQKK19fa21wX2dldF90ZWFtX3NpemUoIGludCBndGlkLCBpbnQgbGV2ZWwgKSB7CisKKyAgICBpbnQgaWksIGRkOworICAgIGttcF90ZWFtX3QgKnRlYW07CisgICAga21wX2luZm9fdCAqdGhyOworCisgICAgS0ZfVFJBQ0UoIDEwLCAoIl9fa21wX2dldF90ZWFtX3NpemU6IHRocmVhZCAlZCAlZFxuIiwgZ3RpZCwgbGV2ZWwgKSk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsKKworICAgIC8vIHZhbGlkYXRlIGxldmVsCisgICAgaWYoIGxldmVsID09IDAgKSByZXR1cm4gMTsKKyAgICBpZiggbGV2ZWwgPCAwICkgcmV0dXJuIC0xOworICAgIHRociA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKyAgICB0ZWFtID0gdGhyLT50aC50aF90ZWFtOworICAgIGlpID0gdGVhbS0+dC50X2xldmVsOworICAgIGlmKCBsZXZlbCA+IGlpICkgcmV0dXJuIC0xOworCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBpZiggdGhyLT50aC50aF90ZWFtc19taWNyb3Rhc2sgKSB7CisgICAgICAgIC8vIEFDOiB3ZSBhcmUgaW4gdGVhbXMgcmVnaW9uIHdoZXJlIG11bHRpcGxlIG5lc3RlZCB0ZWFtcyBoYXZlIHNhbWUgbGV2ZWwKKyAgICAgICAgaW50IHRsZXZlbCA9IHRoci0+dGgudGhfdGVhbXNfbGV2ZWw7IC8vIHRoZSBsZXZlbCBvZiB0aGUgdGVhbXMgY29uc3RydWN0CisgICAgICAgIGlmKCBsZXZlbCA8PSB0bGV2ZWwgKSB7IC8vIG90aGVyd2lzZSB1c3VhbCBhbGdvcml0aG0gd29ya3MgKHdpbGwgbm90IHRvdWNoIHRoZSB0ZWFtcykKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGlpID49IHRsZXZlbCApOworICAgICAgICAgICAgLy8gQUM6IEFzIHdlIG5lZWQgdG8gcGFzcyBieSB0aGUgdGVhbXMgbGVhZ3VlLCB3ZSBuZWVkIHRvIGFydGlmaWNpYWxseSBpbmNyZWFzZSBpaQorICAgICAgICAgICAgaWYgKCBpaSA9PSB0bGV2ZWwgKSB7CisgICAgICAgICAgICAgICAgaWkgKz0gMjsgLy8gdGhyZWUgdGVhbXMgaGF2ZSBzYW1lIGxldmVsCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlpICsrOyAgIC8vIHR3byB0ZWFtcyBoYXZlIHNhbWUgbGV2ZWwKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgd2hpbGUoIGlpID4gbGV2ZWwgKQorICAgIHsKKyAgICAgICAgZm9yKCBkZCA9IHRlYW0tPnQudF9zZXJpYWxpemVkOyAoIGRkID4gMCApICYmICggaWkgPiBsZXZlbCApOyBkZC0tLCBpaS0tICkKKyAgICAgICAgeworICAgICAgICB9CisgICAgICAgIGlmKCB0ZWFtLT50LnRfc2VyaWFsaXplZCAmJiAoICFkZCApICkgeworICAgICAgICAgICAgdGVhbSA9IHRlYW0tPnQudF9wYXJlbnQ7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiggaWkgPiBsZXZlbCApIHsKKyAgICAgICAgICAgIHRlYW0gPSB0ZWFtLT50LnRfcGFyZW50OworICAgICAgICAgICAgaWktLTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0ZWFtLT50LnRfbnByb2M7Cit9CisKK2ttcF9yX3NjaGVkX3QKK19fa21wX2dldF9zY2hlZHVsZV9nbG9iYWwoKSB7CisvLyBUaGlzIHJvdXRpbmUgY3JlYXRlZCBiZWNhdXNlIHBhaXJzIChfX2ttcF9zY2hlZCwgX19rbXBfY2h1bmspIGFuZCAoX19rbXBfc3RhdGljLCBfX2ttcF9ndWlkZWQpCisvLyBtYXkgYmUgY2hhbmdlZCBieSBrbXBfc2V0X2RlZmF1bHRzIGluZGVwZW5kZW50bHkuIFNvIG9uZSBjYW4gZ2V0IHRoZSB1cGRhdGVkIHNjaGVkdWxlIGhlcmUuCisKKyAgICBrbXBfcl9zY2hlZF90IHJfc2NoZWQ7CisKKyAgICAvLyBjcmVhdGUgc2NoZWR1bGUgZnJvbSA0IGdsb2JhbHM6IF9fa21wX3NjaGVkLCBfX2ttcF9jaHVuaywgX19rbXBfc3RhdGljLCBfX2ttcF9ndWlkZWQKKyAgICAvLyBfX2ttcF9zY2hlZCBzaG91bGQga2VlcCBvcmlnaW5hbCB2YWx1ZSwgc28gdGhhdCB1c2VyIGNhbiBzZXQgS01QX1NDSEVEVUxFIG11bHRpcGxlIHRpbWVzLAorICAgIC8vIGFuZCB0aHVzIGhhdmUgZGlmZmVyZW50IHJ1bi10aW1lIHNjaGVkdWxlcyBpbiBkaWZmZXJlbnQgcm9vdHMgKGV2ZW4gaW4gT01QIDIuNSkKKyAgICBpZiAoIF9fa21wX3NjaGVkID09IGttcF9zY2hfc3RhdGljICkgeworICAgICAgICByX3NjaGVkLnJfc2NoZWRfdHlwZSA9IF9fa21wX3N0YXRpYzsgLy8gcmVwbGFjZSBTVEFUSUMgd2l0aCBtb3JlIGRldGFpbGVkIHNjaGVkdWxlIChiYWxhbmNlZCBvciBncmVlZHkpCisgICAgfSBlbHNlIGlmICggX19rbXBfc2NoZWQgPT0ga21wX3NjaF9ndWlkZWRfY2h1bmtlZCApIHsKKyAgICAgICAgcl9zY2hlZC5yX3NjaGVkX3R5cGUgPSBfX2ttcF9ndWlkZWQ7IC8vIHJlcGxhY2UgR1VJREVEIHdpdGggbW9yZSBkZXRhaWxlZCBzY2hlZHVsZSAoaXRlcmF0aXZlIG9yIGFuYWx5dGljYWwpCisgICAgfSBlbHNlIHsKKyAgICAgICAgcl9zY2hlZC5yX3NjaGVkX3R5cGUgPSBfX2ttcF9zY2hlZDsgIC8vIChTVEFUSUNfQ0hVTktFRCksIG9yIChEWU5BTUlDX0NIVU5LRUQpLCBvciBvdGhlcgorICAgIH0KKworICAgIGlmICggX19rbXBfY2h1bmsgPCBLTVBfREVGQVVMVF9DSFVOSyApIHsgLy8gX19rbXBfY2h1bmsgbWF5IGJlIHdyb25nIGhlcmUgKGlmIGl0IHdhcyBub3QgZXZlciBzZXQpCisgICAgICAgIHJfc2NoZWQuY2h1bmsgPSBLTVBfREVGQVVMVF9DSFVOSzsKKyAgICB9IGVsc2UgeworICAgICAgICByX3NjaGVkLmNodW5rID0gX19rbXBfY2h1bms7CisgICAgfQorCisgICAgcmV0dXJuIHJfc2NoZWQ7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKworLyoKKyAqIEFsbG9jYXRlIChyZWFsbG9jID09IEZBTFNFKSAqIG9yIHJlYWxsb2NhdGUgKHJlYWxsb2MgPT0gVFJVRSkKKyAqIGF0IGxlYXN0IGFyZ2MgbnVtYmVyIG9mICp0X2FyZ3YgZW50cmllcyBmb3IgdGhlIHJlcXVlc3RlZCB0ZWFtLgorICovCitzdGF0aWMgdm9pZAorX19rbXBfYWxsb2NfYXJndl9lbnRyaWVzKCBpbnQgYXJnYywga21wX3RlYW1fdCAqdGVhbSwgaW50IHJlYWxsb2MgKQoreworCisgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbSApOworICAgIGlmKCAhcmVhbGxvYyB8fCBhcmdjID4gdGVhbS0+dC50X21heF9hcmdjICkgeworCisgICAgICAgIEtBX1RSQUNFKCAxMDAsICggIl9fa21wX2FsbG9jX2FyZ3ZfZW50cmllczogdGVhbSAlZDogbmVlZGVkIGVudHJpZXM9JWQsIGN1cnJlbnQgZW50cmllcz0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfaWQsIGFyZ2MsICggcmVhbGxvYyApID8gdGVhbS0+dC50X21heF9hcmdjIDogMCApKTsKKyAgICAgICAgLyogaWYgcHJldmlvdXNseSBhbGxvY2F0ZWQgaGVhcCBzcGFjZSBmb3IgYXJncywgZnJlZSB0aGVtICovCisgICAgICAgIGlmICggcmVhbGxvYyAmJiB0ZWFtLT50LnRfYXJndiAhPSAmdGVhbS0+dC50X2lubGluZV9hcmd2WzBdICkKKyAgICAgICAgICAgIF9fa21wX2ZyZWUoICh2b2lkICopIHRlYW0tPnQudF9hcmd2ICk7CisKKyAgICAgICAgaWYgKCBhcmdjIDw9IEtNUF9JTkxJTkVfQVJHVl9FTlRSSUVTICkgeworICAgICAgICAgICAgLyogdXNlIHVudXNlZCBzcGFjZSBpbiB0aGUgY2FjaGUgbGluZSBmb3IgYXJndW1lbnRzICovCisgICAgICAgICAgICB0ZWFtLT50LnRfbWF4X2FyZ2MgPSBLTVBfSU5MSU5FX0FSR1ZfRU5UUklFUzsKKyAgICAgICAgICAgIEtBX1RSQUNFKCAxMDAsICggIl9fa21wX2FsbG9jX2FyZ3ZfZW50cmllczogdGVhbSAlZDogaW5saW5lIGFsbG9jYXRlICVkIGFyZ3YgZW50cmllc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X2lkLCB0ZWFtLT50LnRfbWF4X2FyZ2MgKSk7CisgICAgICAgICAgICB0ZWFtLT50LnRfYXJndiA9ICZ0ZWFtLT50LnRfaW5saW5lX2FyZ3ZbMF07CisgICAgICAgICAgICBpZiAoIF9fa21wX3N0b3JhZ2VfbWFwICkgeworICAgICAgICAgICAgICAgIF9fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoIC0xLCAmdGVhbS0+dC50X2lubGluZV9hcmd2WzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGVhbS0+dC50X2lubGluZV9hcmd2W0tNUF9JTkxJTkVfQVJHVl9FTlRSSUVTXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNpemVvZih2b2lkICopICogS01QX0lOTElORV9BUkdWX0VOVFJJRVMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGVhbV8lZC50X2lubGluZV9hcmd2IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X2lkICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBhbGxvY2F0ZSBzcGFjZSBmb3IgYXJndW1lbnRzIGluIHRoZSBoZWFwICovCisgICAgICAgICAgICB0ZWFtLT50LnRfbWF4X2FyZ2MgPSAoIGFyZ2MgPD0gKEtNUF9NSU5fTUFMTE9DX0FSR1ZfRU5UUklFUyA+PiAxICkpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfTUlOX01BTExPQ19BUkdWX0VOVFJJRVMgOiAyICogYXJnYzsKKyAgICAgICAgICAgIEtBX1RSQUNFKCAxMDAsICggIl9fa21wX2FsbG9jX2FyZ3ZfZW50cmllczogdGVhbSAlZDogZHluYW1pYyBhbGxvY2F0ZSAlZCBhcmd2IGVudHJpZXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9pZCwgdGVhbS0+dC50X21heF9hcmdjICkpOworICAgICAgICAgICAgdGVhbS0+dC50X2FyZ3YgICAgID0gKHZvaWQqKikgX19rbXBfcGFnZV9hbGxvY2F0ZSggc2l6ZW9mKHZvaWQqKSAqIHRlYW0tPnQudF9tYXhfYXJnYyApOworICAgICAgICAgICAgaWYgKCBfX2ttcF9zdG9yYWdlX21hcCApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludF9zdG9yYWdlX21hcF9ndGlkKCAtMSwgJnRlYW0tPnQudF9hcmd2WzBdLCAmdGVhbS0+dC50X2FyZ3ZbdGVhbS0+dC50X21heF9hcmdjXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHZvaWQgKikgKiB0ZWFtLT50LnRfbWF4X2FyZ2MsICJ0ZWFtXyVkLnRfYXJndiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9pZCApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorX19rbXBfYWxsb2NhdGVfdGVhbV9hcnJheXMoa21wX3RlYW1fdCAqdGVhbSwgaW50IG1heF9udGgpCit7CisgICAgaW50IGk7CisgICAgaW50IG51bV9kaXNwX2J1ZmYgPSBtYXhfbnRoID4gMSA/IEtNUF9NQVhfRElTUF9CVUYgOiAyOworI2lmIEtNUF9VU0VfUE9PTEVEX0FMTE9DCisgICAgLy8gQUM6IFRPRE86IGZpeCBidWcgaGVyZTogc2l6ZSBvZiB0X2Rpc3BfYnVmZmVyIHNob3VsZCBub3QgYmUgbXVsdGlwbGllZCBieSBtYXhfbnRoIQorICAgIGNoYXIgKnB0ciA9IF9fa21wX2FsbG9jYXRlKG1heF9udGggKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICggc2l6ZW9mKGttcF9pbmZvX3QqKSArIHNpemVvZihkaXNwYXRjaF9zaGFyZWRfaW5mb190KSpudW1fZGlzcF9idWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNpemVvZihrbXBfZGlzcF90KSArIHNpemVvZihpbnQpKjYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLysgc2l6ZW9mKGludCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNpemVvZihrbXBfcl9zY2hlZF90KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2l6ZW9mKGttcF90YXNrZGF0YV90KSApICk7CisKKyAgICB0ZWFtLT50LnRfdGhyZWFkcyAgICAgICAgICA9IChrbXBfaW5mb190KiopIHB0cjsgcHRyICs9IHNpemVvZihrbXBfaW5mb190KikgKiBtYXhfbnRoOworICAgIHRlYW0tPnQudF9kaXNwX2J1ZmZlciAgICAgID0gKGRpc3BhdGNoX3NoYXJlZF9pbmZvX3QqKSBwdHI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ciArPSBzaXplb2YoZGlzcGF0Y2hfc2hhcmVkX2luZm9fdCkgKiBudW1fZGlzcF9idWZmOworICAgIHRlYW0tPnQudF9kaXNwYXRjaCAgICAgICAgID0gKGttcF9kaXNwX3QqKSBwdHI7IHB0ciArPSBzaXplb2Yoa21wX2Rpc3BfdCkgKiBtYXhfbnRoOworICAgIHRlYW0tPnQudF9zZXRfbnByb2MgICAgICAgID0gKGludCopIHB0cjsgcHRyICs9IHNpemVvZihpbnQpICogbWF4X250aDsKKyAgICB0ZWFtLT50LnRfc2V0X2R5bmFtaWMgICAgICA9IChpbnQqKSBwdHI7IHB0ciArPSBzaXplb2YoaW50KSAqIG1heF9udGg7CisgICAgdGVhbS0+dC50X3NldF9uZXN0ZWQgICAgICAgPSAoaW50KikgcHRyOyBwdHIgKz0gc2l6ZW9mKGludCkgKiBtYXhfbnRoOworICAgIHRlYW0tPnQudF9zZXRfYmxvY2t0aW1lICAgID0gKGludCopIHB0cjsgcHRyICs9IHNpemVvZihpbnQpICogbWF4X250aDsKKyAgICB0ZWFtLT50LnRfc2V0X2J0X2ludGVydmFscyA9IChpbnQqKSBwdHI7IHB0ciArPSBzaXplb2YoaW50KSAqIG1heF9udGg7CisgICAgdGVhbS0+dC50X3NldF9idF9zZXQgICAgICAgPSAoaW50KikgcHRyOworICAgIHB0ciArPSBzaXplb2YoaW50KSAqIG1heF9udGg7CisgICAgLy90ZWFtLT50LnRfc2V0X21heF9hY3RpdmVfbGV2ZWxzID0gKGludCopIHB0cjsgcHRyICs9IHNpemVvZihpbnQpICogbWF4X250aDsKKyAgICB0ZWFtLT50LnRfc2V0X3NjaGVkICAgICAgICA9IChrbXBfcl9zY2hlZF90KikgcHRyOworICAgIHB0ciArPSBzaXplb2Yoa21wX3Jfc2NoZWRfdCkgKiBtYXhfbnRoOworICAgIHRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhID0gKGttcF90YXNrZGF0YV90KikgcHRyOworICAgIHB0ciArPSBzaXplb2Yoa21wX3Rhc2tkYXRhX3QpICogbWF4X250aDsKKyNlbHNlCisKKyAgICB0ZWFtLT50LnRfdGhyZWFkcyA9IChrbXBfaW5mb190KiopIF9fa21wX2FsbG9jYXRlKCBzaXplb2Yoa21wX2luZm9fdCopICogbWF4X250aCApOworICAgIHRlYW0tPnQudF9kaXNwX2J1ZmZlciA9IChkaXNwYXRjaF9zaGFyZWRfaW5mb190KikKKyAgICAgICAgX19rbXBfYWxsb2NhdGUoIHNpemVvZihkaXNwYXRjaF9zaGFyZWRfaW5mb190KSAqIG51bV9kaXNwX2J1ZmYgKTsKKyAgICB0ZWFtLT50LnRfZGlzcGF0Y2ggPSAoa21wX2Rpc3BfdCopIF9fa21wX2FsbG9jYXRlKCBzaXplb2Yoa21wX2Rpc3BfdCkgKiBtYXhfbnRoICk7CisgICAgLy90ZWFtLT50LnRfc2V0X21heF9hY3RpdmVfbGV2ZWxzID0gKGludCopIF9fa21wX2FsbG9jYXRlKCBzaXplb2YoaW50KSAqIG1heF9udGggKTsKKyAgICAvL3RlYW0tPnQudF9zZXRfc2NoZWQgPSAoa21wX3Jfc2NoZWRfdCopIF9fa21wX2FsbG9jYXRlKCBzaXplb2Yoa21wX3Jfc2NoZWRfdCkgKiBtYXhfbnRoICk7CisgICAgdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGEgPSAoa21wX3Rhc2tkYXRhX3QqKSBfX2ttcF9hbGxvY2F0ZSggc2l6ZW9mKGttcF90YXNrZGF0YV90KSAqIG1heF9udGggKTsKKyNlbmRpZgorICAgIHRlYW0tPnQudF9tYXhfbnByb2MgPSBtYXhfbnRoOworCisgICAgLyogc2V0dXAgZGlzcGF0Y2ggYnVmZmVycyAqLworICAgIGZvcihpID0gMCA7IGkgPCBudW1fZGlzcF9idWZmOyArK2kpCisgICAgICAgIHRlYW0tPnQudF9kaXNwX2J1ZmZlcltpXS5idWZmZXJfaW5kZXggPSBpOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfZnJlZV90ZWFtX2FycmF5cyhrbXBfdGVhbV90ICp0ZWFtKSB7CisgICAgLyogTm90ZTogdGhpcyBkb2VzIG5vdCBmcmVlIHRoZSB0aHJlYWRzIGluIHRfdGhyZWFkcyAoX19rbXBfZnJlZV90aHJlYWRzKSAqLworICAgIGludCBpOworICAgIGZvciAoIGkgPSAwOyBpIDwgdGVhbS0+dC50X21heF9ucHJvYzsgKysgaSApIHsKKyAgICAgICAgaWYgKCB0ZWFtLT50LnRfZGlzcGF0Y2hbIGkgXS50aF9kaXNwX2J1ZmZlciAhPSBOVUxMICkgeworICAgICAgICAgICAgX19rbXBfZnJlZSggdGVhbS0+dC50X2Rpc3BhdGNoWyBpIF0udGhfZGlzcF9idWZmZXIgKTsKKyAgICAgICAgICAgIHRlYW0tPnQudF9kaXNwYXRjaFsgaSBdLnRoX2Rpc3BfYnVmZmVyID0gTlVMTDsKKyAgICAgICAgfTsgLy8gaWYKKyAgICB9OyAvLyBmb3IKKyAgICBfX2ttcF9mcmVlKHRlYW0tPnQudF90aHJlYWRzKTsKKyAgICAjaWYgIUtNUF9VU0VfUE9PTEVEX0FMTE9DCisgICAgICAgIF9fa21wX2ZyZWUodGVhbS0+dC50X2Rpc3BfYnVmZmVyKTsKKyAgICAgICAgX19rbXBfZnJlZSh0ZWFtLT50LnRfZGlzcGF0Y2gpOworICAgICAgICAvL19fa21wX2ZyZWUodGVhbS0+dC50X3NldF9tYXhfYWN0aXZlX2xldmVscyk7CisgICAgICAgIC8vX19rbXBfZnJlZSh0ZWFtLT50LnRfc2V0X3NjaGVkKTsKKyAgICAgICAgX19rbXBfZnJlZSh0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YSk7CisgICAgI2VuZGlmCisgICAgdGVhbS0+dC50X3RocmVhZHMgICAgID0gTlVMTDsKKyAgICB0ZWFtLT50LnRfZGlzcF9idWZmZXIgPSBOVUxMOworICAgIHRlYW0tPnQudF9kaXNwYXRjaCAgICA9IE5VTEw7CisgICAgLy90ZWFtLT50LnRfc2V0X3NjaGVkICAgPSAwOworICAgIC8vdGVhbS0+dC50X3NldF9tYXhfYWN0aXZlX2xldmVscyA9IDA7CisgICAgdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGEgPSAwOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfcmVhbGxvY2F0ZV90ZWFtX2FycmF5cyhrbXBfdGVhbV90ICp0ZWFtLCBpbnQgbWF4X250aCkgeworICAgIGttcF9pbmZvX3QgKipvbGRUaHJlYWRzID0gdGVhbS0+dC50X3RocmVhZHM7CisKKyAgICAjaWYgIUtNUF9VU0VfUE9PTEVEX0FMTE9DCisgICAgICAgIF9fa21wX2ZyZWUodGVhbS0+dC50X2Rpc3BfYnVmZmVyKTsKKyAgICAgICAgX19rbXBfZnJlZSh0ZWFtLT50LnRfZGlzcGF0Y2gpOworICAgICAgICAvL19fa21wX2ZyZWUodGVhbS0+dC50X3NldF9tYXhfYWN0aXZlX2xldmVscyk7CisgICAgICAgIC8vX19rbXBfZnJlZSh0ZWFtLT50LnRfc2V0X3NjaGVkKTsKKyAgICAgICAgX19rbXBfZnJlZSh0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YSk7CisgICAgI2VuZGlmCisgICAgX19rbXBfYWxsb2NhdGVfdGVhbV9hcnJheXModGVhbSwgbWF4X250aCk7CisKKyAgICBtZW1jcHkodGVhbS0+dC50X3RocmVhZHMsIG9sZFRocmVhZHMsIHRlYW0tPnQudF9ucHJvYyAqIHNpemVvZiAoa21wX2luZm9fdCopKTsKKworICAgIF9fa21wX2ZyZWUob2xkVGhyZWFkcyk7Cit9CisKK3N0YXRpYyBrbXBfaW50ZXJuYWxfY29udHJvbF90CitfX2ttcF9nZXRfZ2xvYmFsX2ljdnMoIHZvaWQgKSB7CisKKyAgICBrbXBfcl9zY2hlZF90IHJfc2NoZWQgPSBfX2ttcF9nZXRfc2NoZWR1bGVfZ2xvYmFsKCk7IC8vIGdldCBjdXJyZW50IHN0YXRlIG9mIHNjaGVkdWxpbmcgZ2xvYmFscworCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLnVzZWQgPiAwICk7CisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKworICAgIGttcF9pbnRlcm5hbF9jb250cm9sX3QgZ19pY3ZzID0geworICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9pbnQgc2VyaWFsX25lc3RpbmdfbGV2ZWw7IC8vY29ycmVzcG9uZHMgdG8gdGhlIHZhbHVlIG9mIHRoZSB0aF90ZWFtX3NlcmlhbGl6ZWQgZmllbGQKKyAgICAgIChrbXBfaW50OClfX2ttcF9kZmx0X25lc3RlZCwgICAgICAgICAgICAvL2ludCBuZXN0ZWQ7ICAgICAgICAgICAgICAgLy9pbnRlcm5hbCBjb250cm9sIGZvciBuZXN0ZWQgcGFyYWxsZWxpc20gKHBlciB0aHJlYWQpCisgICAgICAoa21wX2ludDgpX19rbXBfZ2xvYmFsLmcuZ19keW5hbWljLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaW50ZXJuYWwgY29udHJvbCBmb3IgZHluYW1pYyBhZGp1c3RtZW50IG9mIHRocmVhZHMgKHBlciB0aHJlYWQpCisgICAgICAoa21wX2ludDgpX19rbXBfZW52X2Jsb2NrdGltZSwgICAgICAgICAgLy9pbnQgYnRfc2V0OyAgICAgICAgICAgICAgIC8vaW50ZXJuYWwgY29udHJvbCBmb3Igd2hldGhlciBibG9ja3RpbWUgaXMgZXhwbGljaXRseSBzZXQKKyAgICAgIF9fa21wX2RmbHRfYmxvY2t0aW1lLCAgICAgICAgIC8vaW50IGJsb2NrdGltZTsgICAgICAgICAgICAvL2ludGVybmFsIGNvbnRyb2wgZm9yIGJsb2NrdGltZQorICAgICAgX19rbXBfYnRfaW50ZXJ2YWxzLCAgICAgICAgICAgLy9pbnQgYnRfaW50ZXJ2YWxzOyAgICAgICAgIC8vaW50ZXJuYWwgY29udHJvbCBmb3IgYmxvY2t0aW1lIGludGVydmFscworICAgICAgX19rbXBfZGZsdF90ZWFtX250aCwgICAgICAgICAgLy9pbnQgbnByb2M7ICAgICAgICAgICAgICAgIC8vaW50ZXJuYWwgY29udHJvbCBmb3IgIyBvZiB0aHJlYWRzIGZvciBuZXh0IHBhcmFsbGVsIHJlZ2lvbiAocGVyIHRocmVhZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICh1c2UgYSBtYXggdWIgb24gdmFsdWUgaWYgX19rbXBfcGFyYWxsZWxfaW5pdGlhbGl6ZSBub3QgY2FsbGVkIHlldCkKKyAgICAgIF9fa21wX2RmbHRfbWF4X2FjdGl2ZV9sZXZlbHMsIC8vaW50IG1heF9hY3RpdmVfbGV2ZWxzOyAgICAvL2ludGVybmFsIGNvbnRyb2wgZm9yIG1heF9hY3RpdmVfbGV2ZWxzCisgICAgICByX3NjaGVkLCAgICAgICAgICAgICAgICAgICAgICAvL2ttcF9yX3NjaGVkX3Qgc2NoZWQ7ICAgICAgLy9pbnRlcm5hbCBjb250cm9sIGZvciBydW50aW1lIHNjaGVkdWxlIHtzY2hlZCxjaHVua30gcGFpcgorI2lmIE9NUF80MF9FTkFCTEVECisgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0sCisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKyAgICAgIE5VTEwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vc3RydWN0IGttcF9pbnRlcm5hbF9jb250cm9sICpuZXh0OworICAgIH07CisKKyAgICByZXR1cm4gZ19pY3ZzOworfQorCitzdGF0aWMga21wX2ludGVybmFsX2NvbnRyb2xfdAorX19rbXBfZ2V0X3hfZ2xvYmFsX2ljdnMoIGNvbnN0IGttcF90ZWFtX3QgKnRlYW0gKSB7CisKKyAgICBrbXBfaW50ZXJuYWxfY29udHJvbF90IGd4X2ljdnM7CisgICAgZ3hfaWN2cy5zZXJpYWxfbmVzdGluZ19sZXZlbCA9IDA7IC8vIHByb2JhYmx5ID10ZWFtLT50LnRfc2VyaWFsIGxpa2UgaW4gc2F2ZV9pbnRlcl9jb250cm9scworICAgIGNvcHlfaWN2cyggJiBneF9pY3ZzLCAmIHRlYW0tPnQudF90aHJlYWRzWzBdLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMgKTsKKyAgICBneF9pY3ZzLm5leHQgPSBOVUxMOworCisgICAgcmV0dXJuIGd4X2ljdnM7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9pbml0aWFsaXplX3Jvb3QoIGttcF9yb290X3QgKnJvb3QgKQoreworICAgIGludCAgICAgICAgICAgZjsKKyAgICBrbXBfdGVhbV90ICAgKnJvb3RfdGVhbTsKKyAgICBrbXBfdGVhbV90ICAgKmhvdF90ZWFtOworICAgIHNpemVfdCAgICAgICAgZGlzcF9zaXplLCBkaXNwYXRjaF9zaXplLCBiYXJfc2l6ZTsKKyAgICBpbnQgICAgICAgICAgIGhvdF90ZWFtX21heF9udGg7CisgICAga21wX3Jfc2NoZWRfdCByX3NjaGVkID0gX19rbXBfZ2V0X3NjaGVkdWxlX2dsb2JhbCgpOyAvLyBnZXQgY3VycmVudCBzdGF0ZSBvZiBzY2hlZHVsaW5nIGdsb2JhbHMKKyAgICBrbXBfaW50ZXJuYWxfY29udHJvbF90IHJfaWN2cyA9IF9fa21wX2dldF9nbG9iYWxfaWN2cygpOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHJvb3QgKTsKKyAgICBLTVBfQVNTRVJUKCAhIHJvb3QtPnIucl9iZWdpbiApOworCisgICAgLyogc2V0dXAgdGhlIHJvb3Qgc3RhdGUgc3RydWN0dXJlICovCisgICAgX19rbXBfaW5pdF9sb2NrKCAmcm9vdC0+ci5yX2JlZ2luX2xvY2sgKTsKKyAgICByb290LT5yLnJfYmVnaW4gICAgICAgID0gRkFMU0U7CisgICAgcm9vdC0+ci5yX2FjdGl2ZSAgICAgICA9IEZBTFNFOworICAgIHJvb3QtPnIucl9pbl9wYXJhbGxlbCAgPSAwOworICAgIHJvb3QtPnIucl9ibG9ja3RpbWUgICAgPSBfX2ttcF9kZmx0X2Jsb2NrdGltZTsKKyAgICByb290LT5yLnJfbmVzdGVkICAgICAgID0gX19rbXBfZGZsdF9uZXN0ZWQ7CisKKyAgICAvKiBzZXR1cCB0aGUgcm9vdCB0ZWFtIGZvciB0aGlzIHRhc2sgKi8KKyAgICAvKiBhbGxvY2F0ZSB0aGUgcm9vdCB0ZWFtIHN0cnVjdHVyZSAqLworICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBfaW5pdGlhbGl6ZV9yb290OiBiZWZvcmUgcm9vdF90ZWFtXG4iICkgKTsKKyAgICByb290X3RlYW0gPQorICAgICAgICBfX2ttcF9hbGxvY2F0ZV90ZWFtKAorICAgICAgICAgICAgcm9vdCwKKyAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV3X25wcm9jCisgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1heF9ucHJvYworI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0sCisjZW5kaWYKKyAgICAgICAgICAgICZyX2ljdnMsCisgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFyZ2MKKyAgICAgICAgICAgIFVTRV9ORVNURURfSE9UX0FSRyhOVUxMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFzdGVyIHRocmVhZCBpcyB1bmtub3duCisgICAgICAgICk7CisKKyAgICBLRl9UUkFDRSggMTAsICggIl9fa21wX2luaXRpYWxpemVfcm9vdDogYWZ0ZXIgcm9vdF90ZWFtID0gJXBcbiIsIHJvb3RfdGVhbSApICk7CisKKyAgICByb290LT5yLnJfcm9vdF90ZWFtID0gcm9vdF90ZWFtOworICAgIHJvb3RfdGVhbS0+dC50X2NvbnRyb2xfc3RhY2tfdG9wID0gTlVMTDsKKworICAgIC8qIGluaXRpYWxpemUgcm9vdCB0ZWFtICovCisgICAgcm9vdF90ZWFtLT50LnRfdGhyZWFkc1swXSA9IE5VTEw7CisgICAgcm9vdF90ZWFtLT50LnRfbnByb2MgICAgICA9IDE7CisgICAgcm9vdF90ZWFtLT50LnRfc2VyaWFsaXplZCA9IDE7CisgICAgLy8gVE9ETz8/Pzogcm9vdF90ZWFtLT50LnRfbWF4X2FjdGl2ZV9sZXZlbHMgPSBfX2ttcF9kZmx0X21heF9hY3RpdmVfbGV2ZWxzOworICAgIHJvb3RfdGVhbS0+dC50X3NjaGVkLnJfc2NoZWRfdHlwZSA9IHJfc2NoZWQucl9zY2hlZF90eXBlOworICAgIHJvb3RfdGVhbS0+dC50X3NjaGVkLmNodW5rICAgICAgICA9IHJfc2NoZWQuY2h1bms7CisgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2luaXRpYWxpemVfcm9vdDogaW5pdCByb290IHRlYW0gJWQgYXJyaXZlZDogam9pbj0ldSwgcGxhaW49JXVcbiIsCisgICAgICAgICAgICAgICAgICAgIHJvb3RfdGVhbS0+dC50X2lkLCBLTVBfSU5JVF9CQVJSSUVSX1NUQVRFLCBLTVBfSU5JVF9CQVJSSUVSX1NUQVRFICkpOworCisgICAgLyogc2V0dXAgdGhlICBob3QgdGVhbSBmb3IgdGhpcyB0YXNrICovCisgICAgLyogYWxsb2NhdGUgdGhlIGhvdCB0ZWFtIHN0cnVjdHVyZSAqLworICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBfaW5pdGlhbGl6ZV9yb290OiBiZWZvcmUgaG90X3RlYW1cbiIgKSApOworICAgIGhvdF90ZWFtID0KKyAgICAgICAgX19rbXBfYWxsb2NhdGVfdGVhbSgKKyAgICAgICAgICAgIHJvb3QsCisgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5ld19ucHJvYworICAgICAgICAgICAgX19rbXBfZGZsdF90ZWFtX250aF91YiAqIDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXhfbnByb2MKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdLAorI2VuZGlmCisgICAgICAgICAgICAmcl9pY3ZzLAorICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcmdjCisgICAgICAgICAgICBVU0VfTkVTVEVEX0hPVF9BUkcoTlVMTCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1hc3RlciB0aHJlYWQgaXMgdW5rbm93bgorICAgICAgICApOworICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBfaW5pdGlhbGl6ZV9yb290OiBhZnRlciBob3RfdGVhbSA9ICVwXG4iLCBob3RfdGVhbSApICk7CisKKyAgICByb290LT5yLnJfaG90X3RlYW0gPSBob3RfdGVhbTsKKyAgICByb290X3RlYW0tPnQudF9jb250cm9sX3N0YWNrX3RvcCA9IE5VTEw7CisKKyAgICAvKiBmaXJzdC10aW1lIGluaXRpYWxpemF0aW9uICovCisgICAgaG90X3RlYW0tPnQudF9wYXJlbnQgPSByb290X3RlYW07CisKKyAgICAvKiBpbml0aWFsaXplIGhvdCB0ZWFtICovCisgICAgaG90X3RlYW1fbWF4X250aCA9IGhvdF90ZWFtLT50LnRfbWF4X25wcm9jOworICAgIGZvciAoIGYgPSAwOyBmIDwgaG90X3RlYW1fbWF4X250aDsgKysgZiApIHsKKyAgICAgICAgaG90X3RlYW0tPnQudF90aHJlYWRzWyBmIF0gPSBOVUxMOworICAgIH07IC8vIGZvcgorICAgIGhvdF90ZWFtLT50LnRfbnByb2MgPSAxOworICAgIC8vIFRPRE8/Pz86IGhvdF90ZWFtLT50LnRfbWF4X2FjdGl2ZV9sZXZlbHMgPSBfX2ttcF9kZmx0X21heF9hY3RpdmVfbGV2ZWxzOworICAgIGhvdF90ZWFtLT50LnRfc2NoZWQucl9zY2hlZF90eXBlID0gcl9zY2hlZC5yX3NjaGVkX3R5cGU7CisgICAgaG90X3RlYW0tPnQudF9zY2hlZC5jaHVuayAgICAgICAgPSByX3NjaGVkLmNodW5rOworICAgIGhvdF90ZWFtLT50LnRfc2l6ZV9jaGFuZ2VkID0gMDsKKworfQorCisjaWZkZWYgS01QX0RFQlVHCisKKwordHlwZWRlZiBzdHJ1Y3Qga21wX3RlYW1fbGlzdF9pdGVtIHsKKyAgICBrbXBfdGVhbV9wIGNvbnN0ICogICAgICAgICAgIGVudHJ5OworICAgIHN0cnVjdCBrbXBfdGVhbV9saXN0X2l0ZW0gKiAgbmV4dDsKK30ga21wX3RlYW1fbGlzdF9pdGVtX3Q7Cit0eXBlZGVmIGttcF90ZWFtX2xpc3RfaXRlbV90ICoga21wX3RlYW1fbGlzdF90OworCisKK3N0YXRpYyB2b2lkCitfX2ttcF9wcmludF9zdHJ1Y3R1cmVfdGVhbV9hY2N1bSggICAgLy8gQWRkIHRlYW0gdG8gbGlzdCBvZiB0ZWFtcy4KKyAgICBrbXBfdGVhbV9saXN0X3QgICAgIGxpc3QsICAgICAgICAvLyBMaXN0IG9mIHRlYW1zLgorICAgIGttcF90ZWFtX3AgY29uc3QgKiAgdGVhbSAgICAgICAgIC8vIFRlYW0gdG8gYWRkLgorKSB7CisKKyAgICAvLyBMaXN0IG11c3QgdGVybWluYXRlIHdpdGggaXRlbSB3aGVyZSBib3RoIGVudHJ5IGFuZCBuZXh0IGFyZSBOVUxMLgorICAgIC8vIFRlYW0gaXMgYWRkZWQgdG8gdGhlIGxpc3Qgb25seSBvbmNlLgorICAgIC8vIExpc3QgaXMgc29ydGVkIGluIGFzY2VuZGluZyBvcmRlciBieSB0ZWFtIGlkLgorICAgIC8vIFRlYW0gaWQgaXMgKm5vdCogYSBrZXkuCisKKyAgICBrbXBfdGVhbV9saXN0X3QgbDsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIGxpc3QgIT0gTlVMTCApOworICAgIGlmICggdGVhbSA9PSBOVUxMICkgeworICAgICAgICByZXR1cm47CisgICAgfTsgLy8gaWYKKworICAgIF9fa21wX3ByaW50X3N0cnVjdHVyZV90ZWFtX2FjY3VtKCBsaXN0LCB0ZWFtLT50LnRfcGFyZW50ICk7CisgICAgX19rbXBfcHJpbnRfc3RydWN0dXJlX3RlYW1fYWNjdW0oIGxpc3QsIHRlYW0tPnQudF9uZXh0X3Bvb2wgKTsKKworICAgIC8vIFNlYXJjaCBsaXN0IGZvciB0aGUgdGVhbS4KKyAgICBsID0gbGlzdDsKKyAgICB3aGlsZSAoIGwtPm5leHQgIT0gTlVMTCAmJiBsLT5lbnRyeSAhPSB0ZWFtICkgeworICAgICAgICBsID0gbC0+bmV4dDsKKyAgICB9OyAvLyB3aGlsZQorICAgIGlmICggbC0+bmV4dCAhPSBOVUxMICkgeworICAgICAgICByZXR1cm47ICAvLyBUZWFtIGhhcyBiZWVuIGFkZGVkIGJlZm9yZSwgZXhpdC4KKyAgICB9OyAvLyBpZgorCisgICAgLy8gVGVhbSBpcyBub3QgZm91bmQuIFNlYXJjaCBsaXN0IGFnYWluIGZvciBpbnNlcnRpb24gcG9pbnQuCisgICAgbCA9IGxpc3Q7CisgICAgd2hpbGUgKCBsLT5uZXh0ICE9IE5VTEwgJiYgbC0+ZW50cnktPnQudF9pZCA8PSB0ZWFtLT50LnRfaWQgKSB7CisgICAgICAgIGwgPSBsLT5uZXh0OworICAgIH07IC8vIHdoaWxlCisKKyAgICAvLyBJbnNlcnQgdGVhbS4KKyAgICB7CisgICAgICAgIGttcF90ZWFtX2xpc3RfaXRlbV90ICogaXRlbSA9CisgICAgICAgICAgICAoa21wX3RlYW1fbGlzdF9pdGVtX3QgKilLTVBfSU5URVJOQUxfTUFMTE9DKCBzaXplb2YoICBrbXBfdGVhbV9saXN0X2l0ZW1fdCApICk7CisgICAgICAgICogaXRlbSA9ICogbDsKKyAgICAgICAgbC0+ZW50cnkgPSB0ZWFtOworICAgICAgICBsLT5uZXh0ICA9IGl0ZW07CisgICAgfQorCit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9wcmludF9zdHJ1Y3R1cmVfdGVhbSgKKyAgICBjaGFyIGNvbnN0ICogICAgICAgdGl0bGUsCisgICAga21wX3RlYW1fcCBjb25zdCAqIHRlYW0KKworKSB7CisgICAgX19rbXBfcHJpbnRmKCAiJXMiLCB0aXRsZSApOworICAgIGlmICggdGVhbSAhPSBOVUxMICkgeworICAgICAgICBfX2ttcF9wcmludGYoICIlMnggJXBcbiIsIHRlYW0tPnQudF9pZCwgdGVhbSApOworICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX3ByaW50ZiggIiAtIChuaWwpXG4iICk7CisgICAgfTsgLy8gaWYKK30KKworc3RhdGljIHZvaWQKK19fa21wX3ByaW50X3N0cnVjdHVyZV90aHJlYWQoCisgICAgY2hhciBjb25zdCAqICAgICAgIHRpdGxlLAorICAgIGttcF9pbmZvX3AgY29uc3QgKiB0aHJlYWQKKworKSB7CisgICAgX19rbXBfcHJpbnRmKCAiJXMiLCB0aXRsZSApOworICAgIGlmICggdGhyZWFkICE9IE5VTEwgKSB7CisgICAgICAgIF9fa21wX3ByaW50ZiggIiUyZCAlcFxuIiwgdGhyZWFkLT50aC50aF9pbmZvLmRzLmRzX2d0aWQsIHRocmVhZCApOworICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX3ByaW50ZiggIiAtIChuaWwpXG4iICk7CisgICAgfTsgLy8gaWYKK30KKwordm9pZAorX19rbXBfcHJpbnRfc3RydWN0dXJlKAorICAgIHZvaWQKKykgeworCisgICAga21wX3RlYW1fbGlzdF90IGxpc3Q7CisKKyAgICAvLyBJbml0aWFsaXplIGxpc3Qgb2YgdGVhbXMuCisgICAgbGlzdCA9IChrbXBfdGVhbV9saXN0X2l0ZW1fdCAqKUtNUF9JTlRFUk5BTF9NQUxMT0MoIHNpemVvZigga21wX3RlYW1fbGlzdF9pdGVtX3QgKSApOworICAgIGxpc3QtPmVudHJ5ID0gTlVMTDsKKyAgICBsaXN0LT5uZXh0ICA9IE5VTEw7CisKKyAgICBfX2ttcF9wcmludGYoICJcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuR2xvYmFsIFRocmVhZCBUYWJsZVxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iICk7CisgICAgeworICAgICAgICBpbnQgZ3RpZDsKKyAgICAgICAgZm9yICggZ3RpZCA9IDA7IGd0aWQgPCBfX2ttcF90aHJlYWRzX2NhcGFjaXR5OyArKyBndGlkICkgeworICAgICAgICAgICAgX19rbXBfcHJpbnRmKCAiJTJkIiwgZ3RpZCApOworICAgICAgICAgICAgaWYgKCBfX2ttcF90aHJlYWRzICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRmKCAiICVwIiwgX19rbXBfdGhyZWFkc1sgZ3RpZCBdICk7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgaWYgKCBfX2ttcF9yb290ICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRmKCAiICVwIiwgX19rbXBfcm9vdFsgZ3RpZCBdICk7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgX19rbXBfcHJpbnRmKCAiXG4iICk7CisgICAgICAgIH07IC8vIGZvciBndGlkCisgICAgfQorCisgICAgLy8gUHJpbnQgb3V0IF9fa21wX3RocmVhZHMgYXJyYXkuCisgICAgX19rbXBfcHJpbnRmKCAiXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblRocmVhZHNcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIiApOworICAgIGlmICggX19rbXBfdGhyZWFkcyAhPSBOVUxMICkgeworICAgICAgICBpbnQgZ3RpZDsKKyAgICAgICAgZm9yICggZ3RpZCA9IDA7IGd0aWQgPCBfX2ttcF90aHJlYWRzX2NhcGFjaXR5OyArKyBndGlkICkgeworICAgICAgICAgICAga21wX2luZm9fdCBjb25zdCAqIHRocmVhZCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKyAgICAgICAgICAgIGlmICggdGhyZWFkICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRmKCAiR1RJRCAlMmQgJXA6XG4iLCBndGlkLCB0aHJlYWQgKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludGYoICAgICAgICAgICAgICAgICAiICAgIE91ciBSb290OiAgICAgICAgJXBcbiIsIHRocmVhZC0+dGgudGhfcm9vdCApOworICAgICAgICAgICAgICAgIF9fa21wX3ByaW50X3N0cnVjdHVyZV90ZWFtKCAgICIgICAgT3VyIFRlYW06ICAgICAiLCAgICAgICAgdGhyZWFkLT50aC50aF90ZWFtICk7CisgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRfc3RydWN0dXJlX3RlYW0oICAgIiAgICBTZXJpYWwgVGVhbTogICIsICAgICAgICB0aHJlYWQtPnRoLnRoX3NlcmlhbF90ZWFtICk7CisgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRmKCAgICAgICAgICAgICAgICAgIiAgICBUaHJlYWRzOiAgICAgICUyZFxuIiwgICB0aHJlYWQtPnRoLnRoX3RlYW1fbnByb2MgKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludF9zdHJ1Y3R1cmVfdGhyZWFkKCAiICAgIE1hc3RlcjogICAgICAgIiwgICAgICAgIHRocmVhZC0+dGgudGhfdGVhbV9tYXN0ZXIgKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludGYoICAgICAgICAgICAgICAgICAiICAgIFNlcmlhbGl6ZWQ/OiAgJTJkXG4iLCAgIHRocmVhZC0+dGgudGhfdGVhbV9zZXJpYWxpemVkICk7CisgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRmKCAgICAgICAgICAgICAgICAgIiAgICBTZXQgTlByb2M6ICAgICUyZFxuIiwgICB0aHJlYWQtPnRoLnRoX3NldF9ucHJvYyApOworI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRmKCAgICAgICAgICAgICAgICAgIiAgICBTZXQgUHJvYyBCaW5kOiAlMmRcbiIsICB0aHJlYWQtPnRoLnRoX3NldF9wcm9jX2JpbmQgKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIF9fa21wX3ByaW50X3N0cnVjdHVyZV90aHJlYWQoICIgICAgTmV4dCBpbiBwb29sOiAiLCAgICAgICAgdGhyZWFkLT50aC50aF9uZXh0X3Bvb2wgKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludGYoICJcbiIgKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludF9zdHJ1Y3R1cmVfdGVhbV9hY2N1bSggbGlzdCwgdGhyZWFkLT50aC50aF90ZWFtICk7CisgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRfc3RydWN0dXJlX3RlYW1fYWNjdW0oIGxpc3QsIHRocmVhZC0+dGgudGhfc2VyaWFsX3RlYW0gKTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgIH07IC8vIGZvciBndGlkCisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfcHJpbnRmKCAiVGhyZWFkcyBhcnJheSBpcyBub3QgYWxsb2NhdGVkLlxuIiApOworICAgIH07IC8vIGlmCisKKyAgICAvLyBQcmludCBvdXQgX19rbXBfcm9vdCBhcnJheS4KKyAgICBfX2ttcF9wcmludGYoICJcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuVWJlcnNcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIiApOworICAgIGlmICggX19rbXBfcm9vdCAhPSBOVUxMICkgeworICAgICAgICBpbnQgZ3RpZDsKKyAgICAgICAgZm9yICggZ3RpZCA9IDA7IGd0aWQgPCBfX2ttcF90aHJlYWRzX2NhcGFjaXR5OyArKyBndGlkICkgeworICAgICAgICAgICAga21wX3Jvb3RfdCBjb25zdCAqIHJvb3QgPSBfX2ttcF9yb290WyBndGlkIF07CisgICAgICAgICAgICBpZiAoIHJvb3QgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludGYoICJHVElEICUyZCAlcDpcbiIsIGd0aWQsIHJvb3QgKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludF9zdHJ1Y3R1cmVfdGVhbSggICAiICAgIFJvb3QgVGVhbTogICAgIiwgICAgICByb290LT5yLnJfcm9vdF90ZWFtICk7CisgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRfc3RydWN0dXJlX3RlYW0oICAgIiAgICBIb3QgVGVhbTogICAgICIsICAgICAgcm9vdC0+ci5yX2hvdF90ZWFtICk7CisgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRfc3RydWN0dXJlX3RocmVhZCggIiAgICBVYmVyIFRocmVhZDogICIsICAgICAgcm9vdC0+ci5yX3ViZXJfdGhyZWFkICk7CisgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRmKCAgICAgICAgICAgICAgICAgIiAgICBBY3RpdmU/OiAgICAgICUyZFxuIiwgcm9vdC0+ci5yX2FjdGl2ZSApOworICAgICAgICAgICAgICAgIF9fa21wX3ByaW50ZiggICAgICAgICAgICAgICAgICIgICAgTmVzdGVkPzogICAgICAlMmRcbiIsIHJvb3QtPnIucl9uZXN0ZWQgKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludGYoICAgICAgICAgICAgICAgICAiICAgIEluIFBhcmFsbGVsOiAgJTJkXG4iLCByb290LT5yLnJfaW5fcGFyYWxsZWwgKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludGYoICJcbiIgKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludF9zdHJ1Y3R1cmVfdGVhbV9hY2N1bSggbGlzdCwgcm9vdC0+ci5yX3Jvb3RfdGVhbSApOworICAgICAgICAgICAgICAgIF9fa21wX3ByaW50X3N0cnVjdHVyZV90ZWFtX2FjY3VtKCBsaXN0LCByb290LT5yLnJfaG90X3RlYW0gKTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgIH07IC8vIGZvciBndGlkCisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfcHJpbnRmKCAiVWJlcnMgYXJyYXkgaXMgbm90IGFsbG9jYXRlZC5cbiIgKTsKKyAgICB9OyAvLyBpZgorCisgICAgX19rbXBfcHJpbnRmKCAiXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblRlYW1zXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIgKTsKKyAgICB3aGlsZSAoIGxpc3QtPm5leHQgIT0gTlVMTCApIHsKKyAgICAgICAga21wX3RlYW1fcCBjb25zdCAqIHRlYW0gPSBsaXN0LT5lbnRyeTsKKyAgICAgICAgaW50IGk7CisgICAgICAgIF9fa21wX3ByaW50ZiggIlRlYW0gJTJ4ICVwOlxuIiwgdGVhbS0+dC50X2lkLCB0ZWFtICk7CisgICAgICAgIF9fa21wX3ByaW50X3N0cnVjdHVyZV90ZWFtKCAiICAgIFBhcmVudCBUZWFtOiAgICAgICIsICAgICAgdGVhbS0+dC50X3BhcmVudCApOworICAgICAgICBfX2ttcF9wcmludGYoICAgICAgICAgICAgICAgIiAgICBNYXN0ZXIgVElEOiAgICAgICAlMmRcbiIsIHRlYW0tPnQudF9tYXN0ZXJfdGlkICk7CisgICAgICAgIF9fa21wX3ByaW50ZiggICAgICAgICAgICAgICAiICAgIE1heCB0aHJlYWRzOiAgICAgICUyZFxuIiwgdGVhbS0+dC50X21heF9ucHJvYyApOworICAgICAgICBfX2ttcF9wcmludGYoICAgICAgICAgICAgICAgIiAgICBMZXZlbHMgb2Ygc2VyaWFsOiAlMmRcbiIsIHRlYW0tPnQudF9zZXJpYWxpemVkICk7CisgICAgICAgIF9fa21wX3ByaW50ZiggICAgICAgICAgICAgICAiICAgIE51bWJlciB0aHJlYWRzOiAgICUyZFxuIiwgdGVhbS0+dC50X25wcm9jICk7CisgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgdGVhbS0+dC50X25wcm9jOyArKyBpICkgeworICAgICAgICAgICAgX19rbXBfcHJpbnRmKCAgICAgICAgICAgIiAgICBUaHJlYWQgJTJkOiAgICAgICIsIGkgKTsKKyAgICAgICAgICAgIF9fa21wX3ByaW50X3N0cnVjdHVyZV90aHJlYWQoICIiLCB0ZWFtLT50LnRfdGhyZWFkc1sgaSBdICk7CisgICAgICAgIH07IC8vIGZvciBpCisgICAgICAgIF9fa21wX3ByaW50X3N0cnVjdHVyZV90ZWFtKCAiICAgIE5leHQgaW4gcG9vbDogICAgICIsICAgICAgdGVhbS0+dC50X25leHRfcG9vbCApOworICAgICAgICBfX2ttcF9wcmludGYoICJcbiIgKTsKKyAgICAgICAgbGlzdCA9IGxpc3QtPm5leHQ7CisgICAgfTsgLy8gd2hpbGUKKworICAgIC8vIFByaW50IG91dCBfX2ttcF90aHJlYWRfcG9vbCBhbmQgX19rbXBfdGVhbV9wb29sLgorICAgIF9fa21wX3ByaW50ZiggIlxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5Qb29sc1xuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iICk7CisgICAgX19rbXBfcHJpbnRfc3RydWN0dXJlX3RocmVhZCggICAiVGhyZWFkIHBvb2w6ICAgICAgICAgICIsIChrbXBfaW5mb190ICopX19rbXBfdGhyZWFkX3Bvb2wgKTsKKyAgICBfX2ttcF9wcmludF9zdHJ1Y3R1cmVfdGVhbSggICAgICJUZWFtIHBvb2w6ICAgICAgICAgICAgIiwgKGttcF90ZWFtX3QgKilfX2ttcF90ZWFtX3Bvb2wgKTsKKyAgICBfX2ttcF9wcmludGYoICJcbiIgKTsKKworICAgIC8vIEZyZWUgdGVhbSBsaXN0LgorICAgIHdoaWxlICggbGlzdCAhPSBOVUxMICkgeworICAgICAgICBrbXBfdGVhbV9saXN0X2l0ZW1fdCAqIGl0ZW0gPSBsaXN0OworICAgICAgICBsaXN0ID0gbGlzdC0+bmV4dDsKKyAgICAgICAgS01QX0lOVEVSTkFMX0ZSRUUoIGl0ZW0gKTsKKyAgICB9OyAvLyB3aGlsZQorCit9CisKKyNlbmRpZgorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgU3R1ZmYgZm9yIHBlci10aHJlYWQgZmFzdCByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgorLy8gIFRhYmxlIG9mIHByaW1lcworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgX19rbXBfcHJpbWVzW10gPSB7CisgIDB4OWUzNzc5YjEsIDB4ZmZlNmNjNTksIDB4MjEwOWY2ZGQsIDB4NDM5NzdhYjUsCisgIDB4YmE1NzAzZjUsIDB4YjQ5NWE4NzcsIDB4ZTE2MjY3NDEsIDB4Nzk2OTVlNmIsCisgIDB4YmM5OGMwOWYsIDB4ZDViZWUyYjMsIDB4Mjg3NDg4ZjksIDB4M2FmMTgyMzEsCisgIDB4OTY3N2NkNGQsIDB4YmUzYTY5MjksIDB4YWRjNmE4NzcsIDB4ZGNmMDY3NGIsCisgIDB4YmU0ZDZmZTksIDB4NWYxNWUyMDEsIDB4OTlhZmMzZmQsIDB4ZjNmMTY4MDEsCisgIDB4ZTIyMmNmZmYsIDB4MjRiYTVmZGIsIDB4MDYyMDQ1MmQsIDB4NzlmMTQ5ZTMsCisgIDB4YzhiOTNmNDksIDB4OTcyNzAyY2QsIDB4YjA3ZGQ4MjcsIDB4NmM5N2Q1ZWQsCisgIDB4MDg1YTNkNjEsIDB4NDZlYjVlYTcsIDB4M2Q5OTEwZWQsIDB4MmU2ODdiNWIsCisgIDB4Mjk2MDkyMjcsIDB4NmViMDgxZjEsIDB4MDk1NGM0ZTEsIDB4OWQxMTRkYjksCisgIDB4NTQyYWNmYTksIDB4YjNlNmJkN2IsIDB4MDc0MmQ5MTcsIDB4ZTlmM2ZmYTcsCisgIDB4NTQ1ODFlZGIsIDB4ZjI0ODBmNDUsIDB4MGJiOTI4OGYsIDB4ZWYxYWZmYzcsCisgIDB4ODVmYTBjYTcsIDB4M2NjYzE0ZGIsIDB4ZTZiYWYzNGIsIDB4MzQzMzc3ZjcsCisgIDB4NWNhMTkwMzEsIDB4ZTZkOTI5M2IsIDB4ZjBhOWYzOTEsIDB4NWQyZTk4MGIsCisgIDB4ZmM0MTEwNzMsIDB4YzM3NDkzNjMsIDB4Yjg5MmQ4MjksIDB4MzU0OTM2NmIsCisgIDB4NjI5NzUwYWQsIDB4Yjk4Mjk0ZTUsIDB4ODkyZDk0ODMsIDB4YzIzNWJhZjMsCisgIDB4M2QyNDAyYTMsIDB4NmJkZWYzYzksIDB4YmVjMzMzY2QsIDB4NDBjOTUyMGYKK307CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgX19rbXBfZ2V0X3JhbmRvbTogR2V0IGEgcmFuZG9tIG51bWJlciB1c2luZyBhIGxpbmVhciBjb25ncnVlbnRpYWwgbWV0aG9kLgorCit1bnNpZ25lZCBzaG9ydAorX19rbXBfZ2V0X3JhbmRvbSgga21wX2luZm9fdCAqIHRocmVhZCApCit7CisgIHVuc2lnbmVkIHggPSB0aHJlYWQtPnRoLnRoX3g7CisgIHVuc2lnbmVkIHNob3J0IHIgPSB4Pj4xNjsKKworICB0aHJlYWQtPnRoLnRoX3ggPSB4KnRocmVhZC0+dGgudGhfYSsxOworCisgIEtBX1RSQUNFKDMwLCAoIl9fa21wX2dldF9yYW5kb206IFRIUkVBRDogJWQsIFJFVFVSTjogJXVcbiIsCisgICAgICAgICB0aHJlYWQtPnRoLnRoX2luZm8uZHMuZHNfdGlkLCByKSApOworCisgIHJldHVybiByOworfQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBfaW5pdF9yYW5kb206IEluaXRpYWxpemUgYSByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgorCit2b2lkCitfX2ttcF9pbml0X3JhbmRvbSgga21wX2luZm9fdCAqIHRocmVhZCApCit7CisgIHVuc2lnbmVkIHNlZWQgPSB0aHJlYWQtPnRoLnRoX2luZm8uZHMuZHNfdGlkOworCisgIHRocmVhZC0+dGgudGhfYSA9IF9fa21wX3ByaW1lc1tzZWVkJShzaXplb2YoX19rbXBfcHJpbWVzKS9zaXplb2YoX19rbXBfcHJpbWVzWzBdKSldOworICB0aHJlYWQtPnRoLnRoX3ggPSAoc2VlZCsxKSp0aHJlYWQtPnRoLnRoX2ErMTsKKyAgS0FfVFJBQ0UoMzAsICgiX19rbXBfaW5pdF9yYW5kb206IFRIUkVBRDogJXU7IEE6ICV1XG4iLCBzZWVkLCB0aHJlYWQtPnRoLnRoX2EpICk7Cit9CisKKworI2lmIEtNUF9PU19XSU5ET1dTCisvKiByZWNsYWltIGFycmF5IGVudHJpZXMgZm9yIHJvb3QgdGhyZWFkcyB0aGF0IGFyZSBhbHJlYWR5IGRlYWQsIHJldHVybnMgbnVtYmVyIHJlY2xhaW1lZCAqLworc3RhdGljIGludAorX19rbXBfcmVjbGFpbV9kZWFkX3Jvb3RzKHZvaWQpIHsKKyAgICBpbnQgaSwgciA9IDA7CisKKyAgICBmb3IoaSA9IDA7IGkgPCBfX2ttcF90aHJlYWRzX2NhcGFjaXR5OyArK2kpIHsKKyAgICAgICAgaWYoIEtNUF9VQkVSX0dUSUQoIGkgKSAmJgorICAgICAgICAgICFfX2ttcF9zdGlsbF9ydW5uaW5nKChrbXBfaW5mb190ICopVENSX1NZTkNfUFRSKF9fa21wX3RocmVhZHNbaV0pKSAmJgorICAgICAgICAgICFfX2ttcF9yb290W2ldLT5yLnJfYWN0aXZlICkgeyAvLyBBQzogcmVjbGFpbSBvbmx5IHJvb3RzIGRpZWQgaW4gbm9uLWFjdGl2ZSBzdGF0ZQorICAgICAgICAgICAgciArPSBfX2ttcF91bnJlZ2lzdGVyX3Jvb3Rfb3RoZXJfdGhyZWFkKGkpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByOworfQorI2VuZGlmCisKKy8qCisgICBUaGlzIGZ1bmN0aW9uIGF0dGVtcHRzIHRvIGNyZWF0ZSBmcmVlIGVudHJpZXMgaW4gX19rbXBfdGhyZWFkcyBhbmQgX19rbXBfcm9vdCwgYW5kIHJldHVybnMgdGhlIG51bWJlciBvZgorICAgZnJlZSBlbnRyaWVzIGdlbmVyYXRlZC4KKworICAgRm9yIFdpbmRvd3MqIE9TIHN0YXRpYyBsaWJyYXJ5LCB0aGUgZmlyc3QgbWVjaGFuaXNtIHVzZWQgaXMgdG8gcmVjbGFpbSBhcnJheSBlbnRyaWVzIGZvciByb290IHRocmVhZHMgdGhhdCBhcmUKKyAgIGFscmVhZHkgZGVhZC4KKworICAgT24gYWxsIHBsYXRmb3JtcywgZXhwYW5zaW9uIGlzIGF0dGVtcHRlZCBvbiB0aGUgYXJyYXlzIF9fa21wX3RocmVhZHNfIGFuZCBfX2ttcF9yb290LCB3aXRoIGFwcHJvcHJpYXRlCisgICB1cGRhdGUgdG8gX19rbXBfdGhyZWFkc19jYXBhY2l0eS4gIEFycmF5IGNhcGFjaXR5IGlzIGluY3JlYXNlZCBieSBkb3VibGluZyB3aXRoIGNsaXBwaW5nIHRvCisgICAgX19rbXBfdHBfY2FwYWNpdHksIGlmIHRocmVhZHByaXZhdGUgY2FjaGUgYXJyYXkgaGFzIGJlZW4gY3JlYXRlZC4KKyAgIFN5bmNocm9uaXphdGlvbiB3aXRoIF9fa21wY190aHJlYWRwcml2YXRlX2NhY2hlZCBpcyBkb25lIHVzaW5nIF9fa21wX3RwX2NhY2hlZF9sb2NrLgorCisgICBBZnRlciBhbnkgZGVhZCByb290IHJlY2xhbWF0aW9uLCBpZiB0aGUgY2xpcHBpbmcgdmFsdWUgYWxsb3dzIGFycmF5IGV4cGFuc2lvbiB0byByZXN1bHQgaW4gdGhlIGdlbmVyYXRpb24KKyAgIG9mIGEgdG90YWwgb2Ygbldpc2ggZnJlZSBzbG90cywgdGhlIGZ1bmN0aW9uIGRvZXMgdGhhdCBleHBhbnNpb24uICBJZiBub3QsIGJ1dCB0aGUgY2xpcHBpbmcgdmFsdWUgYWxsb3dzCisgICBhcnJheSBleHBhbnNpb24gdG8gcmVzdWx0IGluIHRoZSBnZW5lcmF0aW9uIG9mIGEgdG90YWwgb2Ygbk5lZWQgZnJlZSBzbG90cywgdGhlIGZ1bmN0aW9uIGRvZXMgdGhhdCBleHBhbnNpb24uCisgICBPdGhlcndpc2UsIG5vdGhpbmcgaXMgZG9uZSBiZXlvbmQgdGhlIHBvc3NpYmxlIGluaXRpYWwgcm9vdCB0aHJlYWQgcmVjbGFtYXRpb24uICBIb3dldmVyLCBpZiBuTmVlZCBpcyB6ZXJvLAorICAgYSBiZXN0LWVmZm9ydCBhdHRlbXB0IGlzIG1hZGUgdG8gZnVsZmlsIG5XaXNoIGFzIGZhciBhcyBwb3NzaWJsZSwgaS5lLiB0aGUgZnVuY3Rpb24gd2lsbCBhdHRlbXB0IHRvIGNyZWF0ZQorICAgYXMgbWFueSBmcmVlIHNsb3RzIGFzIHBvc3NpYmxlIHVwIHRvIG5XaXNoLgorCisgICBJZiBhbnkgYXJndW1lbnQgaXMgbmVnYXRpdmUsIHRoZSBiZWhhdmlvciBpcyB1bmRlZmluZWQuCisqLworc3RhdGljIGludAorX19rbXBfZXhwYW5kX3RocmVhZHMoaW50IG5XaXNoLCBpbnQgbk5lZWQpIHsKKyAgICBpbnQgYWRkZWQgPSAwOworICAgIGludCBvbGRfdHBfY2FjaGVkOworICAgIGludCBfX2ttcF9hY3R1YWxfbWF4X250aDsKKworICAgIGlmKG5OZWVkID4gbldpc2gpIC8qIG5vcm1hbGl6ZSB0aGUgYXJndW1lbnRzICovCisgICAgICAgIG5XaXNoID0gbk5lZWQ7CisjaWYgS01QX09TX1dJTkRPV1MgJiYgIWRlZmluZWQgR1VJREVETExfRVhQT1JUUworLyogb25seSBmb3IgV2luZG93cyBzdGF0aWMgbGlicmFyeSAqLworICAgIC8qIHJlY2xhaW0gYXJyYXkgZW50cmllcyBmb3Igcm9vdCB0aHJlYWRzIHRoYXQgYXJlIGFscmVhZHkgZGVhZCAqLworICAgIGFkZGVkID0gX19rbXBfcmVjbGFpbV9kZWFkX3Jvb3RzKCk7CisKKyAgICBpZihuTmVlZCkgeworICAgICAgICBuTmVlZCAtPSBhZGRlZDsKKyAgICAgICAgaWYobk5lZWQgPCAwKQorICAgICAgICAgICAgbk5lZWQgPSAwOworICAgIH0KKyAgICBpZihuV2lzaCkgeworICAgICAgICBuV2lzaCAtPSBhZGRlZDsKKyAgICAgICAgaWYobldpc2ggPCAwKQorICAgICAgICAgICAgbldpc2ggPSAwOworICAgIH0KKyNlbmRpZgorICAgIGlmKG5XaXNoIDw9IDApCisgICAgICAgIHJldHVybiBhZGRlZDsKKworICAgIHdoaWxlKDEpIHsKKyAgICAgICAgaW50IG5UYXJnZXQ7CisgICAgICAgIGludCBtaW5pbXVtUmVxdWlyZWRDYXBhY2l0eTsKKyAgICAgICAgaW50IG5ld0NhcGFjaXR5OworICAgICAgICBrbXBfaW5mb190ICoqbmV3VGhyZWFkczsKKyAgICAgICAga21wX3Jvb3RfdCAqKm5ld1Jvb3Q7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gTm90ZSB0aGF0IF9fa21wX3RocmVhZHNfY2FwYWNpdHkgaXMgbm90IGJvdW5kZWQgYnkgX19rbXBfbWF4X250aC4KKyAgICAgICAgLy8gSWYgX19rbXBfbWF4X250aCBpcyBzZXQgdG8gc29tZSB2YWx1ZSBsZXNzIHRoYW4gX19rbXBfc3lzX21heF9udGgKKyAgICAgICAgLy8gYnkgdGhlIHVzZXIgdmlhIE9NUF9USFJFQURfTElNSVQsIHRoZW4gX19rbXBfdGhyZWFkc19jYXBhY2l0eSBtYXkKKyAgICAgICAgLy8gYmVjb21lID4gX19rbXBfbWF4X250aCBpbiBvbmUgb2YgdHdvIHdheXM6CisgICAgICAgIC8vCisgICAgICAgIC8vIDEpIFRoZSBpbml0aWFsaXphdGlvbiB0aHJlYWQgKGd0aWQgPSAwKSBleGl0cy4gIF9fa21wX3RocmVhZHNbMF0KKyAgICAgICAgLy8gICAgbWF5IG5vdCBiZSByZXN1c2VkIGJ5IGFub3RoZXIgdGhyZWFkLCBzbyB3ZSBtYXkgbmVlZCB0byBpbmNyZWFzZQorICAgICAgICAvLyAgICBfX2ttcF90aHJlYWRzX2NhcGFjaXR5IHRvIF9fa21wX21heF90aHJlYWRzICsgMS4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gMikgTmV3IGZvcmVpZ24gcm9vdChzKSBhcmUgZW5jb3VudGVyZWQuICBXZSBhbHdheXMgcmVnaXN0ZXIgbmV3CisgICAgICAgIC8vICAgIGZvcmVpZ24gcm9vdHMuICBUaGlzIG1heSBjYXVzZSBhIHNtYWxsZXIgIyBvZiB0aHJlYWRzIHRvIGJlCisgICAgICAgIC8vICAgIGFsbG9jYXRlZCBhdCBzdWJzZXF1ZW50IHBhcmFsbGVsIHJlZ2lvbnMsIGJ1dCB0aGUgd29ya2VyIHRocmVhZHMKKyAgICAgICAgLy8gICAgaGFuZyBhcm91bmQgKGFuZCBldmVudHVhbGx5IGdvIHRvIHNsZWVwKSBhbmQgbmVlZCBzbG90cyBpbiB0aGUKKyAgICAgICAgLy8gICAgX19rbXBfdGhyZWFkc1tdIGFycmF5LgorICAgICAgICAvLworICAgICAgICAvLyBBbnl3YXksIHRoYXQgaXMgdGhlIHJlYXNvbiBmb3IgbW92aW5nIHRoZSBjaGVjayB0byBzZWUgaWYKKyAgICAgICAgLy8gX19rbXBfbWF4X3RocmVhZHMgd2FzIGV4Y2VlZGVkIGludG8gX19rbXBfcmVzZWVydmVfdGhyZWFkcygpCisgICAgICAgIC8vIGluc3RlYWQgb2YgaGF2aW5nIGl0IHBlcmZvcm1lZCBoZXJlLiAtQkIKKyAgICAgICAgLy8KKyAgICAgICAgb2xkX3RwX2NhY2hlZCA9IF9fa21wX3RwX2NhY2hlZDsKKyAgICAgICAgX19rbXBfYWN0dWFsX21heF9udGggPSBvbGRfdHBfY2FjaGVkID8gX19rbXBfdHBfY2FwYWNpdHkgOiBfX2ttcF9zeXNfbWF4X250aDsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF9hY3R1YWxfbWF4X250aCA+PSBfX2ttcF90aHJlYWRzX2NhcGFjaXR5KTsKKworICAgICAgICAvKiBjb21wdXRlIGV4cGFuc2lvbiBoZWFkcm9vbSB0byBjaGVjayBpZiB3ZSBjYW4gZXhwYW5kIGFuZCB3aGV0aGVyIHRvIGFpbSBmb3Igbldpc2ggb3Igbk5lZWQgKi8KKyAgICAgICAgblRhcmdldCA9IG5XaXNoOworICAgICAgICBpZihfX2ttcF9hY3R1YWxfbWF4X250aCAtIF9fa21wX3RocmVhZHNfY2FwYWNpdHkgPCBuVGFyZ2V0KSB7CisgICAgICAgICAgICAvKiBjYW4ndCBmdWxmaWwgbldpc2gsIHNvIHRyeSBuTmVlZCAqLworICAgICAgICAgICAgaWYobk5lZWQpIHsKKyAgICAgICAgICAgICAgICBuVGFyZ2V0ID0gbk5lZWQ7CisgICAgICAgICAgICAgICAgaWYoX19rbXBfYWN0dWFsX21heF9udGggLSBfX2ttcF90aHJlYWRzX2NhcGFjaXR5IDwgblRhcmdldCkgeworICAgICAgICAgICAgICAgICAgICAvKiBwb3NzaWJsZSBleHBhbnNpb24gdG9vIHNtYWxsIC0tIGdpdmUgdXAgKi8KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBiZXN0LWVmZm9ydCAqLworICAgICAgICAgICAgICAgIG5UYXJnZXQgPSBfX2ttcF9hY3R1YWxfbWF4X250aCAtIF9fa21wX3RocmVhZHNfY2FwYWNpdHk7CisgICAgICAgICAgICAgICAgaWYoIW5UYXJnZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogY2FuIGV4cGFuZCBhdCBhbGwgLS0gZ2l2ZSB1cCAqLworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbWluaW11bVJlcXVpcmVkQ2FwYWNpdHkgPSBfX2ttcF90aHJlYWRzX2NhcGFjaXR5ICsgblRhcmdldDsKKworICAgICAgICBuZXdDYXBhY2l0eSA9IF9fa21wX3RocmVhZHNfY2FwYWNpdHk7CisgICAgICAgIGRveworICAgICAgICAgICAgbmV3Q2FwYWNpdHkgPQorICAgICAgICAgICAgICAgIG5ld0NhcGFjaXR5IDw9IChfX2ttcF9hY3R1YWxfbWF4X250aCA+PiAxKSA/CisgICAgICAgICAgICAgICAgKG5ld0NhcGFjaXR5IDw8IDEpIDoKKyAgICAgICAgICAgICAgICBfX2ttcF9hY3R1YWxfbWF4X250aDsKKyAgICAgICAgfSB3aGlsZShuZXdDYXBhY2l0eSA8IG1pbmltdW1SZXF1aXJlZENhcGFjaXR5KTsKKyAgICAgICAgbmV3VGhyZWFkcyA9IChrbXBfaW5mb190KiopIF9fa21wX2FsbG9jYXRlKChzaXplb2Yoa21wX2luZm9fdCopICsgc2l6ZW9mKGttcF9yb290X3QqKSkgKiBuZXdDYXBhY2l0eSArIENBQ0hFX0xJTkUpOworICAgICAgICBuZXdSb290ID0gKGttcF9yb290X3QqKikgKChjaGFyKiluZXdUaHJlYWRzICsgc2l6ZW9mKGttcF9pbmZvX3QqKSAqIG5ld0NhcGFjaXR5ICk7CisgICAgICAgIG1lbWNweShuZXdUaHJlYWRzLCBfX2ttcF90aHJlYWRzLCBfX2ttcF90aHJlYWRzX2NhcGFjaXR5ICogc2l6ZW9mKGttcF9pbmZvX3QqKSk7CisgICAgICAgIG1lbWNweShuZXdSb290LCBfX2ttcF9yb290LCBfX2ttcF90aHJlYWRzX2NhcGFjaXR5ICogc2l6ZW9mKGttcF9yb290X3QqKSk7CisgICAgICAgIG1lbXNldChuZXdUaHJlYWRzICsgX19rbXBfdGhyZWFkc19jYXBhY2l0eSwgMCwKKyAgICAgICAgICAgICAgIChuZXdDYXBhY2l0eSAtIF9fa21wX3RocmVhZHNfY2FwYWNpdHkpICogc2l6ZW9mKGttcF9pbmZvX3QqKSk7CisgICAgICAgIG1lbXNldChuZXdSb290ICsgX19rbXBfdGhyZWFkc19jYXBhY2l0eSwgMCwKKyAgICAgICAgICAgICAgIChuZXdDYXBhY2l0eSAtIF9fa21wX3RocmVhZHNfY2FwYWNpdHkpICogc2l6ZW9mKGttcF9yb290X3QqKSk7CisKKyAgICAgICAgaWYoIW9sZF90cF9jYWNoZWQgJiYgX19rbXBfdHBfY2FjaGVkICYmIG5ld0NhcGFjaXR5ID4gX19rbXBfdHBfY2FwYWNpdHkpIHsKKyAgICAgICAgICAgIC8qIF9fa21wX3RwX2NhY2hlZCBoYXMgY2hhbmdlZCwgaS5lLiBfX2ttcGNfdGhyZWFkcHJpdmF0ZV9jYWNoZWQgaGFzIGFsbG9jYXRlZCBhIHRocmVhZHByaXZhdGUgY2FjaGUKKyAgICAgICAgICAgICAgIHdoaWxlIHdlIHdlcmUgYWxsb2NhdGluZyB0aGUgZXhwYW5kZWQgYXJyYXksIGFuZCBvdXIgbmV3IGNhcGFjaXR5IGlzIGxhcmdlciB0aGFuIHRoZSB0aHJlYWRwcml2YXRlCisgICAgICAgICAgICAgICBjYWNoZSBjYXBhY2l0eSwgc28gd2Ugc2hvdWxkIGRlYWxsb2NhdGUgdGhlIGV4cGFuZGVkIGFycmF5cyBhbmQgdHJ5IGFnYWluLiAgVGhpcyBpcyB0aGUgZmlyc3QgY2hlY2sKKyAgICAgICAgICAgICAgIG9mIGEgZG91YmxlLWNoZWNrIHBhaXIuCisgICAgICAgICAgICAqLworICAgICAgICAgICAgX19rbXBfZnJlZShuZXdUaHJlYWRzKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOyAvKiBzdGFydCBvdmVyIGFuZCB0cnkgYWdhaW4gKi8KKyAgICAgICAgfQorICAgICAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCZfX2ttcF90cF9jYWNoZWRfbG9jayk7CisgICAgICAgIGlmKCFvbGRfdHBfY2FjaGVkICYmIF9fa21wX3RwX2NhY2hlZCAmJiBuZXdDYXBhY2l0eSA+IF9fa21wX3RwX2NhcGFjaXR5KSB7CisgICAgICAgICAgICAvKiBTYW1lIGNoZWNrIGFzIGFib3ZlLCBidXQgdGhpcyB0aW1lIHdpdGggdGhlIGxvY2sgc28gd2UgY2FuIGJlIHN1cmUgaWYgd2UgY2FuIHN1Y2NlZWQuICovCisgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCZfX2ttcF90cF9jYWNoZWRfbG9jayk7CisgICAgICAgICAgICBfX2ttcF9mcmVlKG5ld1RocmVhZHMpOworICAgICAgICAgICAgY29udGludWU7IC8qIHN0YXJ0IG92ZXIgYW5kIHRyeSBhZ2FpbiAqLworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogc3VjY2VzcyAqLworICAgICAgICAgICAgLy8gX19rbXBfZnJlZSggX19rbXBfdGhyZWFkcyApOyAvLyBBVFQ6IEl0IGxlYWRzIHRvIGNyYXNoLiBOZWVkIHRvIGJlIGludmVzdGlnYXRlZC4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAqKGttcF9pbmZvX3QqKnZvbGF0aWxlKikmX19rbXBfdGhyZWFkcyA9IG5ld1RocmVhZHM7CisgICAgICAgICAgICAqKGttcF9yb290X3QqKnZvbGF0aWxlKikmX19rbXBfcm9vdCA9IG5ld1Jvb3Q7CisgICAgICAgICAgICBhZGRlZCArPSBuZXdDYXBhY2l0eSAtIF9fa21wX3RocmVhZHNfY2FwYWNpdHk7CisgICAgICAgICAgICAqKHZvbGF0aWxlIGludCopJl9fa21wX3RocmVhZHNfY2FwYWNpdHkgPSBuZXdDYXBhY2l0eTsKKyAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soJl9fa21wX3RwX2NhY2hlZF9sb2NrKTsKKyAgICAgICAgICAgIGJyZWFrOyAvKiBzdWNjZWVkZWQsIHNvIHdlIGNhbiBleGl0IHRoZSBsb29wICovCisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGFkZGVkOworfQorCisvKiByZWdpc3RlciB0aGUgY3VycmVudCB0aHJlYWQgYXMgYSByb290IHRocmVhZCBhbmQgb2J0YWluIG91ciBndGlkICovCisvKiB3ZSBtdXN0IGhhdmUgdGhlIF9fa21wX2luaXR6X2xvY2sgaGVsZCBhdCB0aGlzIHBvaW50ICovCisvKiBBcmd1bWVudCBUUlVFIG9ubHkgaWYgYXJlIHRoZSB0aHJlYWQgdGhhdCBjYWxscyBmcm9tIF9fa21wX2RvX3NlcmlhbF9pbml0aWFsaXplKCkgKi8KK2ludAorX19rbXBfcmVnaXN0ZXJfcm9vdCggaW50IGluaXRpYWxfdGhyZWFkICkKK3sKKyAgICBrbXBfaW5mb190ICpyb290X3RocmVhZDsKKyAgICBrbXBfcm9vdF90ICpyb290OworICAgIGludCAgICAgICAgIGd0aWQ7CisgICAgaW50ICAgICAgICAgY2FwYWNpdHk7CisgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJl9fa21wX2Zvcmtqb2luX2xvY2sgKTsKKyAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfcmVnaXN0ZXJfcm9vdDogZW50ZXJlZFxuIikpOworICAgIEtNUF9NQigpOworCisKKyAgICAvKgorICAgICAgICAyMDA3LTAzLTAyOgorCisgICAgICAgIElmIGluaXRpYWwgdGhyZWFkIGRpZCBub3QgaW52b2tlIE9wZW5NUCBSVEwgeWV0LCBhbmQgdGhpcyB0aHJlYWQgaXMgbm90IGFuIGluaXRpYWwgb25lLAorICAgICAgICAiX19rbXBfYWxsX250aCA+PSBfX2ttcF90aHJlYWRzX2NhcGFjaXR5IiBjb25kaXRpb24gZG9lcyBub3Qgd29yayBhcyBleHBlY3RlZCAtLSBpdCBtYXkKKyAgICAgICAgcmV0dXJuIGZhbHNlICh0aGF0IG1lYW5zIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBlbXB0eSBzbG90IGluIF9fa21wX3RocmVhZHMgYXJyYXkpLCBidXQgaXQKKyAgICAgICAgaXMgcG9zc2libGUgdGhlIG9ubHkgZnJlZSBzbG90IGlzICMwLCB3aGljaCBpcyByZXNlcnZlZCBmb3IgaW5pdGlhbCB0aHJlYWQgYW5kIHNvIGNhbm5vdCBiZQorICAgICAgICB1c2VkIGZvciB0aGlzIG9uZS4gRm9sbG93aW5nIGNvZGUgd29ya2Fyb3VuZHMgdGhpcyBidWcuCisKKyAgICAgICAgSG93ZXZlciwgcmlnaHQgc29sdXRpb24gc2VlbXMgdG8gYmUgbm90IHJlc2VydmluZyBzbG90ICMwIGZvciBpbml0aWFsIHRocmVhZCBiZWNhdXNlOgorICAgICAgICAgICAgKDEpIHRoZXJlIGlzIG5vIG1hZ2ljIGluIHNsb3QgIzAsCisgICAgICAgICAgICAoMikgd2UgY2Fubm90IGRldGVjdCBpbml0aWFsIHRocmVhZCByZWxpYWJseSAodGhlIGZpcnN0IHRocmVhZCB3aGljaCBkb2VzIHNlcmlhbAorICAgICAgICAgICAgICAgIGluaXRpYWxpemF0aW9uIG1heSBiZSBub3QgYSByZWFsIGluaXRpYWwgdGhyZWFkKS4KKyAgICAqLworICAgIGNhcGFjaXR5ID0gX19rbXBfdGhyZWFkc19jYXBhY2l0eTsKKyAgICBpZiAoICEgaW5pdGlhbF90aHJlYWQgJiYgVENSX1BUUihfX2ttcF90aHJlYWRzWzBdKSA9PSBOVUxMICkgeworICAgICAgICAtLSBjYXBhY2l0eTsKKyAgICB9OyAvLyBpZgorCisgICAgLyogc2VlIGlmIHRoZXJlIGFyZSB0b28gbWFueSB0aHJlYWRzICovCisgICAgaWYgKCBfX2ttcF9hbGxfbnRoID49IGNhcGFjaXR5ICYmICFfX2ttcF9leHBhbmRfdGhyZWFkcyggMSwgMSApICkgeworICAgICAgICBpZiAoIF9fa21wX3RwX2NhY2hlZCApIHsKKyAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgS01QX01TRyggQ2FudFJlZ2lzdGVyTmV3VGhyZWFkICksCisgICAgICAgICAgICAgICAgS01QX0hOVCggU2V0X0FMTF9USFJFQURQUklWQVRFLCBfX2ttcF90cF9jYXBhY2l0eSApLAorICAgICAgICAgICAgICAgIEtNUF9ITlQoIFBvc3NpYmxlU3lzdGVtTGltaXRPblRocmVhZHMgKSwKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgS01QX01TRyggQ2FudFJlZ2lzdGVyTmV3VGhyZWFkICksCisgICAgICAgICAgICAgICAgS01QX0hOVCggU3lzdGVtTGltaXRPblRocmVhZHMgKSwKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgIH07IC8vIGlmCisKKyAgICAvKiBmaW5kIGFuIGF2YWlsYWJsZSB0aHJlYWQgc2xvdCAqLworICAgIC8qIERvbid0IHJlYXNzaWduIHRoZSB6ZXJvIHNsb3Qgc2luY2Ugd2UgbmVlZCB0aGF0IHRvIG9ubHkgYmUgdXNlZCBieSBpbml0aWFsCisgICAgICAgdGhyZWFkICovCisgICAgZm9yKCBndGlkPShpbml0aWFsX3RocmVhZCA/IDAgOiAxKSA7IFRDUl9QVFIoX19rbXBfdGhyZWFkc1tndGlkXSkgIT0gTlVMTCA7IGd0aWQrKyApCisgICAgICAgIDsKKyAgICBLQV9UUkFDRSggMSwgKCJfX2ttcF9yZWdpc3Rlcl9yb290OiBmb3VuZCBzbG90IGluIHRocmVhZHMgYXJyYXk6IFQjJWRcbiIsIGd0aWQgKSk7CisgICAgS01QX0FTU0VSVCggZ3RpZCA8IF9fa21wX3RocmVhZHNfY2FwYWNpdHkgKTsKKworICAgIC8qIHVwZGF0ZSBnbG9iYWwgYWNjb3VudGluZyAqLworICAgIF9fa21wX2FsbF9udGggKys7CisgICAgVENXXzQoX19rbXBfbnRoLCBfX2ttcF9udGggKyAxKTsKKworICAgIC8vCisgICAgLy8gaWYgX19rbXBfYWRqdXN0X2d0aWRfbW9kZSBpcyBzZXQsIHRoZW4gd2UgdXNlIG1ldGhvZCAjMSAoc3Agc2VhcmNoKQorICAgIC8vIGZvciBsb3cgbnVtYmVycyBvZiBwcm9jcywgYW5kIG1ldGhvZCAjMiAoa2V5ZWQgQVBJIGNhbGwpIGZvciBoaWdoZXIKKyAgICAvLyBudW1iZXJzIG9mIHByb2NzLgorICAgIC8vCisgICAgaWYgKCBfX2ttcF9hZGp1c3RfZ3RpZF9tb2RlICkgeworICAgICAgICBpZiAoIF9fa21wX2FsbF9udGggPj0gX19rbXBfdGxzX2d0aWRfbWluICkgeworICAgICAgICAgICAgaWYgKCBUQ1JfNChfX2ttcF9ndGlkX21vZGUpICE9IDIpIHsKKyAgICAgICAgICAgICAgICBUQ1dfNChfX2ttcF9ndGlkX21vZGUsIDIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKFRDUl80KF9fa21wX2d0aWRfbW9kZSkgIT0gMSApIHsKKyAgICAgICAgICAgICAgICBUQ1dfNChfX2ttcF9ndGlkX21vZGUsIDEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisjaWZkZWYgS01QX0FESlVTVF9CTE9DS1RJTUUKKyAgICAvKiBBZGp1c3QgYmxvY2t0aW1lIHRvIHplcm8gaWYgbmVjZXNzYXJ5ICAgICAgICAgICAgKi8KKyAgICAvKiBNaWRkbGUgaW5pdGlhbGl6YXRpb24gbWlnaHQgbm90IGhhdmUgb2NjdXJyZWQgeWV0ICovCisgICAgaWYgKCAhX19rbXBfZW52X2Jsb2NrdGltZSAmJiAoIF9fa21wX2F2YWlsX3Byb2MgPiAwICkgKSB7CisgICAgICAgIGlmICggX19rbXBfbnRoID4gX19rbXBfYXZhaWxfcHJvYyApIHsKKyAgICAgICAgICAgIF9fa21wX3plcm9fYnQgPSBUUlVFOworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8qIEtNUF9BREpVU1RfQkxPQ0tUSU1FICovCisKKyAgICAvKiBzZXR1cCB0aGlzIG5ldyBoaWVyYXJjaHkgKi8KKyAgICBpZiggISAoIHJvb3QgPSBfX2ttcF9yb290W2d0aWRdICkpIHsKKyAgICAgICAgcm9vdCA9IF9fa21wX3Jvb3RbZ3RpZF0gPSAoa21wX3Jvb3RfdCopIF9fa21wX2FsbG9jYXRlKCBzaXplb2Yoa21wX3Jvb3RfdCkgKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggISByb290LT5yLnJfcm9vdF90ZWFtICk7CisgICAgfQorCisgICAgX19rbXBfaW5pdGlhbGl6ZV9yb290KCByb290ICk7CisKKyAgICAvKiBzZXR1cCBuZXcgcm9vdCB0aHJlYWQgc3RydWN0dXJlICovCisgICAgaWYoIHJvb3QtPnIucl91YmVyX3RocmVhZCApIHsKKyAgICAgICAgcm9vdF90aHJlYWQgPSByb290LT5yLnJfdWJlcl90aHJlYWQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcm9vdF90aHJlYWQgPSAoa21wX2luZm9fdCopIF9fa21wX2FsbG9jYXRlKCBzaXplb2Yoa21wX2luZm9fdCkgKTsKKyAgICAgICAgaWYgKCBfX2ttcF9zdG9yYWdlX21hcCApIHsKKyAgICAgICAgICAgIF9fa21wX3ByaW50X3RocmVhZF9zdG9yYWdlX21hcCggcm9vdF90aHJlYWQsIGd0aWQgKTsKKyAgICAgICAgfQorICAgICAgICByb290X3RocmVhZC0+dGgudGhfaW5mbyAuZHMuZHNfZ3RpZCA9IGd0aWQ7CisgICAgICAgIHJvb3RfdGhyZWFkLT50aC50aF9yb290ID0gIHJvb3Q7CisgICAgICAgIGlmKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgICAgICByb290X3RocmVhZC0+dGgudGhfY29ucyA9IF9fa21wX2FsbG9jYXRlX2NvbnNfc3RhY2soIGd0aWQgKTsKKyAgICAgICAgfQorICAgICAgICAjaWYgVVNFX0ZBU1RfTUVNT1JZCisgICAgICAgICAgICBfX2ttcF9pbml0aWFsaXplX2Zhc3RfbWVtb3J5KCByb290X3RocmVhZCApOworICAgICAgICAjZW5kaWYgLyogVVNFX0ZBU1RfTUVNT1JZICovCisKKyAgICAgICAgI2lmIEtNUF9VU0VfQkdFVAorICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggcm9vdF90aHJlYWQtPnRoLnRoX2xvY2FsLmJnZXRfZGF0YSA9PSBOVUxMICk7CisgICAgICAgICAgICBfX2ttcF9pbml0aWFsaXplX2JnZXQoIHJvb3RfdGhyZWFkICk7CisgICAgICAgICNlbmRpZgorICAgICAgICBfX2ttcF9pbml0X3JhbmRvbSggcm9vdF90aHJlYWQgKTsgIC8vIEluaXRpYWxpemUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IKKyAgICB9CisKKyAgICAvKiBzZXR1cCB0aGUgc2VyaWFsIHRlYW0gaGVsZCBpbiByZXNlcnZlIGJ5IHRoZSByb290IHRocmVhZCAqLworICAgIGlmKCAhIHJvb3RfdGhyZWFkLT50aC50aF9zZXJpYWxfdGVhbSApIHsKKyAgICAgICAga21wX2ludGVybmFsX2NvbnRyb2xfdCByX2ljdnMgPSBfX2ttcF9nZXRfZ2xvYmFsX2ljdnMoKTsKKyAgICAgICAgS0ZfVFJBQ0UoIDEwLCAoICJfX2ttcF9yZWdpc3Rlcl9yb290OiBiZWZvcmUgc2VyaWFsX3RlYW1cbiIgKSApOworICAgICAgICByb290X3RocmVhZC0+dGgudGhfc2VyaWFsX3RlYW0gPSBfX2ttcF9hbGxvY2F0ZV90ZWFtKCByb290LCAxLCAxLAorI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgcHJvY19iaW5kX2RlZmF1bHQsCisjZW5kaWYKKyAgICAgICAgICAmcl9pY3ZzLAorICAgICAgICAgIDAgVVNFX05FU1RFRF9IT1RfQVJHKE5VTEwpICk7CisgICAgfQorICAgIEtNUF9BU1NFUlQoIHJvb3RfdGhyZWFkLT50aC50aF9zZXJpYWxfdGVhbSApOworICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBfcmVnaXN0ZXJfcm9vdDogYWZ0ZXIgc2VyaWFsX3RlYW0gPSAlcFxuIiwKKyAgICAgIHJvb3RfdGhyZWFkLT50aC50aF9zZXJpYWxfdGVhbSApICk7CisKKyAgICAvKiBkcm9wIHJvb3RfdGhyZWFkIGludG8gcGxhY2UgKi8KKyAgICBUQ1dfU1lOQ19QVFIoX19rbXBfdGhyZWFkc1tndGlkXSwgcm9vdF90aHJlYWQpOworCisgICAgcm9vdC0+ci5yX3Jvb3RfdGVhbS0+dC50X3RocmVhZHNbMF0gPSByb290X3RocmVhZDsKKyAgICByb290LT5yLnJfaG90X3RlYW0gLT50LnRfdGhyZWFkc1swXSA9IHJvb3RfdGhyZWFkOworICAgIHJvb3RfdGhyZWFkLT50aC50aF9zZXJpYWxfdGVhbS0+dC50X3RocmVhZHNbMF0gPSByb290X3RocmVhZDsKKyAgICByb290X3RocmVhZC0+dGgudGhfc2VyaWFsX3RlYW0tPnQudF9zZXJpYWxpemVkID0gMDsgLy8gQUM6IHRoZSB0ZWFtIGNyZWF0ZWQgaW4gcmVzZXJ2ZSwgbm90IGZvciBleGVjdXRpb24gKGl0IGlzIHVudXNlZCBmb3Igbm93KS4KKyAgICByb290LT5yLnJfdWJlcl90aHJlYWQgPSByb290X3RocmVhZDsKKworICAgIC8qIGluaXRpYWxpemUgdGhlIHRocmVhZCwgZ2V0IGl0IHJlYWR5IHRvIGdvICovCisgICAgX19rbXBfaW5pdGlhbGl6ZV9pbmZvKCByb290X3RocmVhZCwgcm9vdC0+ci5yX3Jvb3RfdGVhbSwgMCwgZ3RpZCApOworCisgICAgLyogcHJlcGFyZSB0aGUgbWFzdGVyIHRocmVhZCBmb3IgZ2V0X2d0aWQoKSAqLworICAgIF9fa21wX2d0aWRfc2V0X3NwZWNpZmljKCBndGlkICk7CisKKyAgICBfX2ttcF9pdHRfdGhyZWFkX25hbWUoIGd0aWQgKTsKKworICAgICNpZmRlZiBLTVBfVERBVEFfR1RJRAorICAgICAgICBfX2ttcF9ndGlkID0gZ3RpZDsKKyAgICAjZW5kaWYKKyAgICBfX2ttcF9jcmVhdGVfd29ya2VyKCBndGlkLCByb290X3RocmVhZCwgX19rbXBfc3Rrc2l6ZSApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2d0aWRfZ2V0X3NwZWNpZmljKCkgPT0gZ3RpZCApOworICAgIFRDV180KF9fa21wX2luaXRfZ3RpZCwgVFJVRSk7CisKKyAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfcmVnaXN0ZXJfcm9vdDogVCMlZCBpbml0IFQjJWQoJWQ6JWQpIGFycml2ZWQ6IGpvaW49JXUsIHBsYWluPSV1XG4iLAorICAgICAgICAgICAgICAgICAgICBndGlkLCBfX2ttcF9ndGlkX2Zyb21fdGlkKCAwLCByb290LT5yLnJfaG90X3RlYW0gKSwKKyAgICAgICAgICAgICAgICAgICAgcm9vdC0+ci5yX2hvdF90ZWFtLT50LnRfaWQsIDAsIEtNUF9JTklUX0JBUlJJRVJfU1RBVEUsCisgICAgICAgICAgICAgICAgICAgIEtNUF9JTklUX0JBUlJJRVJfU1RBVEUgKSApOworICAgIHsgLy8gSW5pdGlhbGl6ZSBiYXJyaWVyIGRhdGEuCisgICAgICAgIGludCBiOworICAgICAgICBmb3IgKCBiID0gMDsgYiA8IGJzX2xhc3RfYmFycmllcjsgKysgYiApIHsKKyAgICAgICAgICAgIHJvb3RfdGhyZWFkLT50aC50aF9iYXJbIGIgXS5iYi5iX2Fycml2ZWQgICAgICAgID0gS01QX0lOSVRfQkFSUklFUl9TVEFURTsKKyAgICAgICAgfTsgLy8gZm9yCisgICAgfQorICAgIEtNUF9ERUJVR19BU1NFUlQoIHJvb3QtPnIucl9ob3RfdGVhbS0+dC50X2JhclsgYnNfZm9ya2pvaW5fYmFycmllciBdLmJfYXJyaXZlZCA9PSBLTVBfSU5JVF9CQVJSSUVSX1NUQVRFICk7CisKKworI2lmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICBpZiAoIFRDUl80KF9fa21wX2luaXRfbWlkZGxlKSApIHsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfc2V0X2luaXRfbWFzayggZ3RpZCwgVFJVRSApOworICAgIH0KKyNlbmRpZiAvKiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVEICovCisKKyAgICBfX2ttcF9yb290X2NvdW50ZXIgKys7CisKKyAgICBLTVBfTUIoKTsKKyAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfZm9ya2pvaW5fbG9jayApOworCisgICAgcmV0dXJuIGd0aWQ7Cit9CisKKyNpZiBLTVBfTkVTVEVEX0hPVF9URUFNUworc3RhdGljIGludAorX19rbXBfZnJlZV9ob3RfdGVhbXMoIGttcF9yb290X3QgKnJvb3QsIGttcF9pbmZvX3QgKnRociwgaW50IGxldmVsLCBjb25zdCBpbnQgbWF4X2xldmVsICkKK3sKKyAgICBpbnQgaSwgbiwgbnRoOworICAgIGttcF9ob3RfdGVhbV9wdHJfdCAqaG90X3RlYW1zID0gdGhyLT50aC50aF9ob3RfdGVhbXM7CisgICAgaWYoICFob3RfdGVhbXMgfHwgIWhvdF90ZWFtc1tsZXZlbF0uaG90X3RlYW0gKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBLTVBfREVCVUdfQVNTRVJUKCBsZXZlbCA8IG1heF9sZXZlbCApOworICAgIGttcF90ZWFtX3QgKnRlYW0gPSBob3RfdGVhbXNbbGV2ZWxdLmhvdF90ZWFtOworICAgIG50aCA9IGhvdF90ZWFtc1tsZXZlbF0uaG90X3RlYW1fbnRoOworICAgIG4gPSBudGggLSAxOyAgICAgICAgICAgICAgICAgICAvLyBtYXN0ZXIgaXMgbm90IGZyZWVkCisgICAgaWYoIGxldmVsIDwgbWF4X2xldmVsIC0gMSApIHsKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IG50aDsgKytpICkgeworICAgICAgICAgICAga21wX2luZm9fdCAqdGggPSB0ZWFtLT50LnRfdGhyZWFkc1tpXTsKKyAgICAgICAgICAgIG4gKz0gX19rbXBfZnJlZV9ob3RfdGVhbXMoIHJvb3QsIHRoLCBsZXZlbCArIDEsIG1heF9sZXZlbCApOworICAgICAgICAgICAgaWYoIGkgPiAwICYmIHRoLT50aC50aF9ob3RfdGVhbXMgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfZnJlZSggdGgtPnRoLnRoX2hvdF90ZWFtcyApOworICAgICAgICAgICAgICAgIHRoLT50aC50aF9ob3RfdGVhbXMgPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIF9fa21wX2ZyZWVfdGVhbSggcm9vdCwgdGVhbSwgTlVMTCApOworICAgIHJldHVybiBuOworfQorI2VuZGlmCisKKy8qIFJlc2V0cyBhIHJvb3QgdGhyZWFkIGFuZCBjbGVhciBpdHMgcm9vdCBhbmQgaG90IHRlYW1zLgorICAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIF9fa21wX3RocmVhZHMgZW50cmllcyBkaXJlY3RseSBhbmQgaW5kaXJlY3RseSBmcmVlZC4KKyovCitzdGF0aWMgaW50CitfX2ttcF9yZXNldF9yb290KGludCBndGlkLCBrbXBfcm9vdF90ICpyb290KQoreworICAgIGttcF90ZWFtX3QgKiByb290X3RlYW0gPSByb290LT5yLnJfcm9vdF90ZWFtOworICAgIGttcF90ZWFtX3QgKiBob3RfdGVhbSAgPSByb290LT5yLnJfaG90X3RlYW07CisgICAgaW50ICAgICAgICAgIG4gICAgICAgICA9IGhvdF90ZWFtLT50LnRfbnByb2M7CisgICAgaW50IGk7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCAhIHJvb3QtPnIucl9hY3RpdmUgKTsKKworICAgIHJvb3QtPnIucl9yb290X3RlYW0gPSBOVUxMOworICAgIHJvb3QtPnIucl9ob3RfdGVhbSAgPSBOVUxMOworICAgICAgICAvLyBfX2ttcF9mcmVlX3RlYW0oKSBkb2VzIG5vdCBmcmVlIGhvdCB0ZWFtcywgc28gd2UgaGF2ZSB0byBjbGVhciByX2hvdF90ZWFtIGJlZm9yZSBjYWxsCisgICAgICAgIC8vIHRvIF9fa21wX2ZyZWVfdGVhbSgpLgorICAgIF9fa21wX2ZyZWVfdGVhbSggcm9vdCwgcm9vdF90ZWFtIFVTRV9ORVNURURfSE9UX0FSRyhOVUxMKSApOworI2lmIEtNUF9ORVNURURfSE9UX1RFQU1TCisgICAgaWYoIF9fa21wX2hvdF90ZWFtc19tYXhfbGV2ZWwgPiAxICkgeyAgLy8gbmVlZCB0byBmcmVlIG5lc3RlZCBob3QgdGVhbXMgYW5kIHRoZWlyIHRocmVhZHMgaWYgYW55CisgICAgICAgIGZvciggaSA9IDA7IGkgPCBob3RfdGVhbS0+dC50X25wcm9jOyArK2kgKSB7CisgICAgICAgICAgICBrbXBfaW5mb190ICp0aCA9IGhvdF90ZWFtLT50LnRfdGhyZWFkc1tpXTsKKyAgICAgICAgICAgIG4gKz0gX19rbXBfZnJlZV9ob3RfdGVhbXMoIHJvb3QsIHRoLCAxLCBfX2ttcF9ob3RfdGVhbXNfbWF4X2xldmVsICk7CisgICAgICAgICAgICBpZiggdGgtPnRoLnRoX2hvdF90ZWFtcyApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9mcmVlKCB0aC0+dGgudGhfaG90X3RlYW1zICk7CisgICAgICAgICAgICAgICAgdGgtPnRoLnRoX2hvdF90ZWFtcyA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKyAgICBfX2ttcF9mcmVlX3RlYW0oIHJvb3QsIGhvdF90ZWFtIFVTRV9ORVNURURfSE9UX0FSRyhOVUxMKSApOworCisgICAgLy8KKyAgICAvLyBCZWZvcmUgd2UgY2FuIHJlYXAgdGhlIHRocmVhZCwgd2UgbmVlZCB0byBtYWtlIGNlcnRhaW4gdGhhdCBhbGwKKyAgICAvLyBvdGhlciB0aHJlYWRzIGluIHRoZSB0ZWFtcyB0aGF0IGhhZCB0aGlzIHJvb3QgYXMgYW5jZXN0b3IgaGF2ZSBzdG9wcGVkIHRyeWluZyB0byBzdGVhbCB0YXNrcy4KKyAgICAvLworICAgIGlmICggX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMgKSB7CisgICAgICAgIF9fa21wX3dhaXRfdG9fdW5yZWZfdGFza190ZWFtcygpOworICAgIH0KKworICAgICNpZiBLTVBfT1NfV0lORE9XUworICAgICAgICAvKiBDbG9zZSBIYW5kbGUgb2Ygcm9vdCBkdXBsaWNhdGVkIGluIF9fa21wX2NyZWF0ZV93b3JrZXIgKHRyICM2MjkxOSkgKi8KKyAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX3Jlc2V0X3Jvb3Q6IGZyZWUgaGFuZGxlLCB0aCA9ICVwLCBoYW5kbGUgPSAlIiBLTVBfVUlOVFBUUl9TUEVDICJcbiIsCisgICAgICAgICAgICAoTFBWT0lEKSYocm9vdC0+ci5yX3ViZXJfdGhyZWFkLT50aCksCisgICAgICAgICAgICByb290LT5yLnJfdWJlcl90aHJlYWQtPnRoLnRoX2luZm8uZHMuZHNfdGhyZWFkICkgKTsKKyAgICAgICAgX19rbXBfZnJlZV9oYW5kbGUoIHJvb3QtPnIucl91YmVyX3RocmVhZC0+dGgudGhfaW5mby5kcy5kc190aHJlYWQgKTsKKyAgICAjZW5kaWYgLyogS01QX09TX1dJTkRPV1MgKi8KKworICAgIFRDV180KF9fa21wX250aCwgX19rbXBfbnRoIC0gMSk7IC8vIF9fa21wX3JlYXBfdGhyZWFkIHdpbGwgZGVjcmVtZW50IF9fa21wX2FsbF9udGguCisgICAgX19rbXBfcmVhcF90aHJlYWQoIHJvb3QtPnIucl91YmVyX3RocmVhZCwgMSApOworCisgICAgICAgIC8vIFdlIGNhbm90IHB1dCByb290IHRocmVhZCB0byBfX2ttcF90aHJlYWRfcG9vbCwgc28gd2UgaGF2ZSB0byByZWFwIGl0IGlzdGVhZCBvZiBmcmVlaW5nLgorICAgIHJvb3QtPnIucl91YmVyX3RocmVhZCA9IE5VTEw7CisgICAgLyogbWFyayByb290IGFzIG5vIGxvbmdlciBpbiB1c2UgKi8KKyAgICByb290LT5yLnJfYmVnaW4gPSBGQUxTRTsKKworICAgIHJldHVybiBuOworfQorCit2b2lkCitfX2ttcF91bnJlZ2lzdGVyX3Jvb3RfY3VycmVudF90aHJlYWQoIGludCBndGlkICkKK3sKKyAgICBLQV9UUkFDRSggMSwgKCJfX2ttcF91bnJlZ2lzdGVyX3Jvb3RfY3VycmVudF90aHJlYWQ6IGVudGVyIFQjJWRcbiIsIGd0aWQgKSk7CisgICAgLyogdGhpcyBsb2NrIHNob3VsZCBiZSBvaywgc2luY2UgdW5yZWdpc3Rlcl9yb290X2N1cnJlbnRfdGhyZWFkIGlzIG5ldmVyIGNhbGxlZCBkdXJpbmcKKyAgICAgKiBhbmQgYWJvcnQsIG9ubHkgZHVyaW5nIGEgbm9ybWFsIGNsb3NlLiAgZnVydGhlcm1vcmUsIGlmIHlvdSBoYXZlIHRoZQorICAgICAqIGZvcmtqb2luIGxvY2ssIHlvdSBzaG91bGQgbmV2ZXIgdHJ5IHRvIGdldCB0aGUgaW5pdHogbG9jayAqLworCisgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJl9fa21wX2Zvcmtqb2luX2xvY2sgKTsKKyAgICBpZiggVENSXzQoX19rbXBfZ2xvYmFsLmcuZ19kb25lKSB8fCAhX19rbXBfaW5pdF9zZXJpYWwgKSB7CisgICAgICAgIEtDX1RSQUNFKCAxMCwgKCJfX2ttcF91bnJlZ2lzdGVyX3Jvb3RfY3VycmVudF90aHJlYWQ6IGFscmVhZHkgZmluaXNoZWQsIGV4aXRpbmcgVCMlZFxuIiwgZ3RpZCApKTsKKyAgICAgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJl9fa21wX2Zvcmtqb2luX2xvY2sgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBrbXBfcm9vdF90ICpyb290ID0gX19rbXBfcm9vdFtndGlkXTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX3RocmVhZHMgJiYgX19rbXBfdGhyZWFkc1tndGlkXSApOworICAgIEtNUF9BU1NFUlQoIEtNUF9VQkVSX0dUSUQoIGd0aWQgKSk7CisgICAgS01QX0FTU0VSVCggcm9vdCA9PSBfX2ttcF90aHJlYWRzW2d0aWRdLT50aC50aF9yb290ICk7CisgICAgS01QX0FTU0VSVCggcm9vdC0+ci5yX2FjdGl2ZSA9PSBGQUxTRSApOworCisKKyAgICBLTVBfTUIoKTsKKworICAgIF9fa21wX3Jlc2V0X3Jvb3QoZ3RpZCwgcm9vdCk7CisKKyAgICAvKiBmcmVlIHVwIHRoaXMgdGhyZWFkIHNsb3QgKi8KKyAgICBfX2ttcF9ndGlkX3NldF9zcGVjaWZpYyggS01QX0dUSURfRE5FICk7CisjaWZkZWYgS01QX1REQVRBX0dUSUQKKyAgICBfX2ttcF9ndGlkID0gS01QX0dUSURfRE5FOworI2VuZGlmCisKKyAgICBLTVBfTUIoKTsKKyAgICBLQ19UUkFDRSggMTAsICgiX19rbXBfdW5yZWdpc3Rlcl9yb290X2N1cnJlbnRfdGhyZWFkOiBUIyVkIHVucmVnaXN0ZXJlZFxuIiwgZ3RpZCApKTsKKworICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9mb3Jram9pbl9sb2NrICk7Cit9CisKKy8qIF9fa21wX2Zvcmtqb2luX2xvY2sgbXVzdCBiZSBhbHJlYWR5IGhlbGQKKyAgIFVucmVnaXN0ZXJzIGEgcm9vdCB0aHJlYWQgdGhhdCBpcyBub3QgdGhlIGN1cnJlbnQgdGhyZWFkLiAgUmV0dXJucyB0aGUgbnVtYmVyIG9mCisgICBfX2ttcF90aHJlYWRzIGVudHJpZXMgZnJlZWQgYXMgYSByZXN1bHQuCisgKi8KK3N0YXRpYyBpbnQKK19fa21wX3VucmVnaXN0ZXJfcm9vdF9vdGhlcl90aHJlYWQoIGludCBndGlkICkKK3sKKyAgICBrbXBfcm9vdF90ICpyb290ID0gX19rbXBfcm9vdFtndGlkXTsKKyAgICBpbnQgcjsKKworICAgIEtBX1RSQUNFKCAxLCAoIl9fa21wX3VucmVnaXN0ZXJfcm9vdF9vdGhlcl90aHJlYWQ6IGVudGVyIFQjJWRcbiIsIGd0aWQgKSk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfdGhyZWFkcyAmJiBfX2ttcF90aHJlYWRzW2d0aWRdICk7CisgICAgS01QX0FTU0VSVCggS01QX1VCRVJfR1RJRCggZ3RpZCApKTsKKyAgICBLTVBfQVNTRVJUKCByb290ID09IF9fa21wX3RocmVhZHNbZ3RpZF0tPnRoLnRoX3Jvb3QgKTsKKyAgICBLTVBfQVNTRVJUKCByb290LT5yLnJfYWN0aXZlID09IEZBTFNFICk7CisKKyAgICByID0gX19rbXBfcmVzZXRfcm9vdChndGlkLCByb290KTsKKyAgICBLQ19UUkFDRSggMTAsICgiX19rbXBfdW5yZWdpc3Rlcl9yb290X290aGVyX3RocmVhZDogVCMlZCB1bnJlZ2lzdGVyZWRcbiIsIGd0aWQgKSk7CisgICAgcmV0dXJuIHI7Cit9CisKKyNpZiBLTVBfREVCVUcKK3ZvaWQgX19rbXBfdGFza19pbmZvKCkgeworCisgICAga21wX2ludDMyIGd0aWQgICAgICAgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgICAga21wX2ludDMyIHRpZCAgICAgICAgPSBfX2ttcF90aWRfZnJvbV9ndGlkKCBndGlkICk7CisgICAga21wX2luZm9fdCAqdGhpc190aHIgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisgICAga21wX3RlYW1fdCAqc3RlYW0gICAgPSB0aGlzX3Roci0+dGgudGhfc2VyaWFsX3RlYW07CisgICAga21wX3RlYW1fdCAqdGVhbSAgICAgPSB0aGlzX3Roci0+dGgudGhfdGVhbTsKKworICAgIF9fa21wX3ByaW50ZiggIl9fa21wX3Rhc2tfaW5mbzogZ3RpZD0lZCB0aWQ9JWQgdF90aHJlYWQ9JXAgdGVhbT0lcCBjdXJ0YXNrPSVwIHB0YXNrPSVwXG4iLAorICAgICAgICBndGlkLCB0aWQsIHRoaXNfdGhyLCB0ZWFtLCB0aGlzX3Roci0+dGgudGhfY3VycmVudF90YXNrLCB0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVt0aWRdLnRkX3BhcmVudCApOworfQorI2VuZGlmIC8vIEtNUF9ERUJVRworCisvKiBUT0RPIG9wdGltaXplIHdpdGggb25lIGJpZyBtZW1jbHIsIHRha2Ugb3V0IHdoYXQgaXNuJ3QgbmVlZGVkLAorICogc3BsaXQgcmVzcG9uc2lsaXR5IHRvIHdvcmtlcnMgYXMgbXVjaCBhcyBwb3NzaWJsZSwgYW5kIGRlbGF5CisgKiBpbml0aWFsaXphdGlvbiBvZiBmZWF0dXJlcyBhcyBtdWNoIGFzIHBvc3NpYmxlICAqLworc3RhdGljIHZvaWQKK19fa21wX2luaXRpYWxpemVfaW5mbygga21wX2luZm9fdCAqdGhpc190aHIsIGttcF90ZWFtX3QgKnRlYW0sIGludCB0aWQsIGludCBndGlkICkKK3sKKyAgICAvKiB0aGlzX3Roci0+dGgudGhfaW5mby5kcy5kc19ndGlkIGlzIHNldHVwIGluIGttcF9hbGxvY2F0ZV90aHJlYWQvY3JlYXRlX3dvcmtlcgorICAgICAqIHRoaXNfdGhyLT50aC50aF9zZXJpYWxfdGVhbSBpcyBzZXR1cCBpbiBfX2ttcF9hbGxvY2F0ZV90aHJlYWQgKi8KKyAgICBrbXBfaW5mb190ICptYXN0ZXIgPSB0ZWFtLT50LnRfdGhyZWFkc1swXTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aGlzX3RociAhPSBOVUxMICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGhpc190aHItPnRoLnRoX3NlcmlhbF90ZWFtICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbSApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRlYW0tPnQudF90aHJlYWRzICApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRlYW0tPnQudF9kaXNwYXRjaCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIG1hc3RlciApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIG1hc3Rlci0+dGgudGhfcm9vdCApOworCisgICAgS01QX01CKCk7CisKKyAgICBUQ1dfU1lOQ19QVFIodGhpc190aHItPnRoLnRoX3RlYW0sIHRlYW0pOworCisgICAgdGhpc190aHItPnRoLnRoX2luZm8uZHMuZHNfdGlkICA9IHRpZDsKKyAgICB0aGlzX3Roci0+dGgudGhfc2V0X25wcm9jICAgICAgID0gMDsKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIHRoaXNfdGhyLT50aC50aF9zZXRfcHJvY19iaW5kICAgPSBwcm9jX2JpbmRfZGVmYXVsdDsKKyMgaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgIHRoaXNfdGhyLT50aC50aF9uZXdfcGxhY2UgICAgICAgPSB0aGlzX3Roci0+dGgudGhfY3VycmVudF9wbGFjZTsKKyMgZW5kaWYKKyNlbmRpZgorICAgIHRoaXNfdGhyLT50aC50aF9yb290ICAgICAgICAgICAgPSBtYXN0ZXItPnRoLnRoX3Jvb3Q7CisKKyAgICAvKiBzZXR1cCB0aGUgdGhyZWFkJ3MgY2FjaGUgb2YgdGhlIHRlYW0gc3RydWN0dXJlICovCisgICAgdGhpc190aHItPnRoLnRoX3RlYW1fbnByb2MgICAgICA9IHRlYW0tPnQudF9ucHJvYzsKKyAgICB0aGlzX3Roci0+dGgudGhfdGVhbV9tYXN0ZXIgICAgID0gbWFzdGVyOworICAgIHRoaXNfdGhyLT50aC50aF90ZWFtX3NlcmlhbGl6ZWQgPSB0ZWFtLT50LnRfc2VyaWFsaXplZDsKKyAgICBUQ1dfUFRSKHRoaXNfdGhyLT50aC50aF9zbGVlcF9sb2MsIE5VTEwpOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGEgKTsKKyAgICB0aGlzX3Roci0+dGgudGhfdGFza19zdGF0ZSA9IDA7CisKKyAgICBLRl9UUkFDRSggMTAsICggIl9fa21wX2luaXRpYWxpemVfaW5mbzE6IFQjJWQ6JWQgdGhpc190aHJlYWQ9JXAgY3VydGFzaz0lcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgdGlkLCBndGlkLCB0aGlzX3RociwgdGhpc190aHItPnRoLnRoX2N1cnJlbnRfdGFzayApICk7CisKKyAgICBfX2ttcF9pbml0X2ltcGxpY2l0X3Rhc2soIHRoaXNfdGhyLT50aC50aF90ZWFtX21hc3Rlci0+dGgudGhfaWRlbnQsIHRoaXNfdGhyLCB0ZWFtLCB0aWQsIFRSVUUgKTsKKworICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBfaW5pdGlhbGl6ZV9pbmZvMjogVCMlZDolZCB0aGlzX3RocmVhZD0lcCBjdXJ0YXNrPSVwXG4iLAorICAgICAgICAgICAgICAgICAgICB0aWQsIGd0aWQsIHRoaXNfdGhyLCB0aGlzX3Roci0+dGgudGhfY3VycmVudF90YXNrICkgKTsKKyAgICAvLyBUT0RPOiBJbml0aWFsaXplIElDVnMgZnJvbSBwYXJlbnQ7IEdFSCAtIGlzbid0IHRoYXQgYWxyZWFkeSBkb25lIGluIF9fa21wX2luaXRpYWxpemVfdGVhbSgpPworCisgICAgLyogVE9ETyBubyB3b3Jrc2hhcmluZyBpbiBzcGVjdWxhdGl2ZSB0aHJlYWRzICovCisgICAgdGhpc190aHItPnRoLnRoX2Rpc3BhdGNoICAgICAgPSAmdGVhbS0+dC50X2Rpc3BhdGNoWyB0aWQgXTsKKworICAgIHRoaXNfdGhyLT50aC50aF9sb2NhbC50aGlzX2NvbnN0cnVjdCA9IDA7CisKKyNpZmRlZiBCVUlMRF9UVgorICAgIHRoaXNfdGhyLT50aC50aF9sb2NhbC50dl9kYXRhID0gMDsKKyNlbmRpZgorCisgICAgaWYgKCAhIHRoaXNfdGhyLT50aC50aF9wcmlfY29tbW9uICkgeworICAgICAgICB0aGlzX3Roci0+dGgudGhfcHJpX2NvbW1vbiA9IChzdHJ1Y3QgY29tbW9uX3RhYmxlICopIF9fa21wX2FsbG9jYXRlKCBzaXplb2Yoc3RydWN0IGNvbW1vbl90YWJsZSkgKTsKKyAgICAgICAgaWYgKCBfX2ttcF9zdG9yYWdlX21hcCApIHsKKyAgICAgICAgICAgIF9fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoCisgICAgICAgICAgICAgICAgZ3RpZCwgdGhpc190aHItPnRoLnRoX3ByaV9jb21tb24sIHRoaXNfdGhyLT50aC50aF9wcmlfY29tbW9uICsgMSwKKyAgICAgICAgICAgICAgICBzaXplb2YoIHN0cnVjdCBjb21tb25fdGFibGUgKSwgInRoXyVkLnRoX3ByaV9jb21tb25cbiIsIGd0aWQKKyAgICAgICAgICAgICk7CisgICAgICAgIH07IC8vIGlmCisgICAgICAgIHRoaXNfdGhyLT50aC50aF9wcmlfaGVhZCA9IE5VTEw7CisgICAgfTsgLy8gaWYKKworICAgIC8qIEluaXRpYWxpemUgZHluYW1pYyBkaXNwYXRjaCAqLworICAgIHsKKyAgICAgICAgdm9sYXRpbGUga21wX2Rpc3BfdCAqZGlzcGF0Y2ggPSB0aGlzX3Roci0+dGgudGhfZGlzcGF0Y2g7CisgICAgICAgIC8qCisgICAgICAgICAqIFVzZSB0ZWFtIG1heF9ucHJvYyBzaW5jZSB0aGlzIHdpbGwgbmV2ZXIgY2hhbmdlIGZvciB0aGUgdGVhbS4KKyAgICAgICAgICovCisgICAgICAgIHNpemVfdCBkaXNwX3NpemUgPSBzaXplb2YoIGRpc3BhdGNoX3ByaXZhdGVfaW5mb190ICkgKgorICAgICAgICAgICAgKCB0ZWFtLT50LnRfbWF4X25wcm9jID09IDEgPyAxIDogS01QX01BWF9ESVNQX0JVRiApOworICAgICAgICBLRF9UUkFDRSggMTAsICgiX19rbXBfaW5pdGlhbGl6ZV9pbmZvOiBUIyVkIG1heF9ucHJvYzogJWRcbiIsIGd0aWQsIHRlYW0tPnQudF9tYXhfbnByb2MgKSApOworICAgICAgICBLTVBfQVNTRVJUKCBkaXNwYXRjaCApOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0ZWFtLT50LnRfZGlzcGF0Y2ggKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggZGlzcGF0Y2ggPT0gJnRlYW0tPnQudF9kaXNwYXRjaFsgdGlkIF0gKTsKKworICAgICAgICBkaXNwYXRjaC0+dGhfZGlzcF9pbmRleCA9IDA7CisKKyAgICAgICAgaWYoICEgZGlzcGF0Y2gtPnRoX2Rpc3BfYnVmZmVyICkgIHsKKyAgICAgICAgICAgIGRpc3BhdGNoLT50aF9kaXNwX2J1ZmZlciA9IChkaXNwYXRjaF9wcml2YXRlX2luZm9fdCAqKSBfX2ttcF9hbGxvY2F0ZSggZGlzcF9zaXplICk7CisKKyAgICAgICAgICAgIGlmICggX19rbXBfc3RvcmFnZV9tYXAgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCggZ3RpZCwgJmRpc3BhdGNoLT50aF9kaXNwX2J1ZmZlclsgMCBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGlzcGF0Y2gtPnRoX2Rpc3BfYnVmZmVyWyB0ZWFtLT50LnRfbWF4X25wcm9jID09IDEgPyAxIDogS01QX01BWF9ESVNQX0JVRiBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwX3NpemUsICJ0aF8lZC50aF9kaXNwYXRjaC50aF9kaXNwX2J1ZmZlciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIodGVhbV8lZC50X2Rpc3BhdGNoWyVkXS50aF9kaXNwX2J1ZmZlcikiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIGd0aWQgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1lbXNldCggJiBkaXNwYXRjaC0+dGhfZGlzcF9idWZmZXJbMF0sICdcMCcsIGRpc3Bfc2l6ZSApOworICAgICAgICB9CisKKyAgICAgICAgZGlzcGF0Y2gtPnRoX2Rpc3BhdGNoX3ByX2N1cnJlbnQgPSAwOworICAgICAgICBkaXNwYXRjaC0+dGhfZGlzcGF0Y2hfc2hfY3VycmVudCA9IDA7CisKKyAgICAgICAgZGlzcGF0Y2gtPnRoX2Rlb19mY24gPSAwOyAgICAgICAgICAgICAvKiBPUkRFUkVEICAgICAqLworICAgICAgICBkaXNwYXRjaC0+dGhfZHhvX2ZjbiA9IDA7ICAgICAgICAgICAgIC8qIEVORCBPUkRFUkVEICovCisgICAgfQorCisgICAgdGhpc190aHItPnRoLnRoX25leHRfcG9vbCA9IE5VTEw7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCAhdGhpc190aHItPnRoLnRoX3NwaW5faGVyZSApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRoaXNfdGhyLT50aC50aF9uZXh0X3dhaXRpbmcgPT0gMCApOworCisgICAgS01QX01CKCk7Cit9CisKKworLyogYWxsb2NhdGUgYSBuZXcgdGhyZWFkIGZvciB0aGUgcmVxdWVzdGluZyB0ZWFtLiAgdGhpcyBpcyBvbmx5IGNhbGxlZCBmcm9tIHdpdGhpbiBhCisgKiBmb3Jram9pbiBjcml0aWNhbCBzZWN0aW9uLiAgd2Ugd2lsbCBmaXJzdCB0cnkgdG8gZ2V0IGFuIGF2YWlsYWJsZSB0aHJlYWQgZnJvbSB0aGUKKyAqIHRocmVhZCBwb29sLiAgaWYgbm9uZSBpcyBhdmFpbGFibGUsIHdlIHdpbGwgZm9yayBhIG5ldyBvbmUgYXNzdW1pbmcgd2UgYXJlIGFibGUKKyAqIHRvIGNyZWF0ZSBhIG5ldyBvbmUuICB0aGlzIHNob3VsZCBiZSBhc3N1cmVkLCBhcyB0aGUgY2FsbGVyIHNob3VsZCBjaGVjayBvbiB0aGlzCisgKiBmaXJzdC4KKyAqLwora21wX2luZm9fdCAqCitfX2ttcF9hbGxvY2F0ZV90aHJlYWQoIGttcF9yb290X3QgKnJvb3QsIGttcF90ZWFtX3QgKnRlYW0sIGludCBuZXdfdGlkICkKK3sKKyAgICBrbXBfdGVhbV90ICAqc2VyaWFsX3RlYW07CisgICAga21wX2luZm9fdCAgKm5ld190aHI7CisgICAgaW50ICAgICAgICAgIG5ld19ndGlkOworCisgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2FsbG9jYXRlX3RocmVhZDogVCMlZFxuIiwgX19rbXBfZ2V0X2d0aWQoKSApKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCByb290ICYmIHRlYW0gKTsKKyNpZiAhS01QX05FU1RFRF9IT1RfVEVBTVMKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBLTVBfTUFTVEVSX0dUSUQoIF9fa21wX2dldF9ndGlkKCkgKSk7CisjZW5kaWYKKyAgICBLTVBfTUIoKTsKKworICAgIC8qIGZpcnN0LCB0cnkgdG8gZ2V0IG9uZSBmcm9tIHRoZSB0aHJlYWQgcG9vbCAqLworICAgIGlmICggX19rbXBfdGhyZWFkX3Bvb2wgKSB7CisKKyAgICAgICAgbmV3X3RociA9IChrbXBfaW5mb190KilfX2ttcF90aHJlYWRfcG9vbDsKKyAgICAgICAgX19rbXBfdGhyZWFkX3Bvb2wgPSAodm9sYXRpbGUga21wX2luZm9fdCAqKSBuZXdfdGhyLT50aC50aF9uZXh0X3Bvb2w7CisgICAgICAgIGlmICggbmV3X3RociA9PSBfX2ttcF90aHJlYWRfcG9vbF9pbnNlcnRfcHQgKSB7CisgICAgICAgICAgICBfX2ttcF90aHJlYWRfcG9vbF9pbnNlcnRfcHQgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIFRDV180KG5ld190aHItPnRoLnRoX2luX3Bvb2wsIEZBTFNFKTsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gRG9uJ3QgdG91Y2ggdGhfYWN0aXZlX2luX3Bvb2wgb3IgdGhfYWN0aXZlLgorICAgICAgICAvLyBUaGUgd29ya2VyIHRocmVhZCBhZGp1c3RzIHRob3NlIGZsYWdzIGFzIGl0IHNsZWVwcy9hd2FrZW5zLgorICAgICAgICAvLworCisgICAgICAgIF9fa21wX3RocmVhZF9wb29sX250aC0tOworCisgICAgICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9hbGxvY2F0ZV90aHJlYWQ6IFQjJWQgdXNpbmcgdGhyZWFkIFQjJWRcbiIsCisgICAgICAgICAgICAgICAgICAgIF9fa21wX2dldF9ndGlkKCksIG5ld190aHItPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCApKTsKKyAgICAgICAgS01QX0FTU0VSVCggICAgICAgISBuZXdfdGhyLT50aC50aF90ZWFtICk7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX250aCA8IF9fa21wX3RocmVhZHNfY2FwYWNpdHkgKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfdGhyZWFkX3Bvb2xfbnRoID49IDAgKTsKKworICAgICAgICAvKiBzZXR1cCB0aGUgdGhyZWFkIHN0cnVjdHVyZSAqLworICAgICAgICBfX2ttcF9pbml0aWFsaXplX2luZm8oIG5ld190aHIsIHRlYW0sIG5ld190aWQsIG5ld190aHItPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCApOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBuZXdfdGhyLT50aC50aF9zZXJpYWxfdGVhbSApOworCisgICAgICAgIFRDV180KF9fa21wX250aCwgX19rbXBfbnRoICsgMSk7CisKKyNpZmRlZiBLTVBfQURKVVNUX0JMT0NLVElNRQorICAgICAgICAvKiBBZGp1c3QgYmxvY2t0aW1lIGJhY2sgdG8gemVybyBpZiBuZWNlc3NhciAgICAgIHkgKi8KKyAgICAgICAgLyogTWlkZGxlIGluaXRpYWxpemF0aW9uIG1pZ2h0IG5vdCBoYXZlIG9jY3VycmVkIHlldCAqLworICAgICAgICBpZiAoICFfX2ttcF9lbnZfYmxvY2t0aW1lICYmICggX19rbXBfYXZhaWxfcHJvYyA+IDAgKSApIHsKKyAgICAgICAgICAgIGlmICggX19rbXBfbnRoID4gX19rbXBfYXZhaWxfcHJvYyApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF96ZXJvX2J0ID0gVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmIC8qIEtNUF9BREpVU1RfQkxPQ0tUSU1FICovCisKKyNpZiBLTVBfREVCVUcKKyAgICAgICAgLy8gSWYgdGhyZWFkIGVudGVyZWQgcG9vbCB2aWEgX19rbXBfZnJlZV90aHJlYWQsIHdhaXRfZmxhZyBzaG91bGQgIT0gS01QX0JBUlJJRVJfUEFSRU5UX0ZMQUcuCisgICAgICAgIGludCBiOworICAgICAgICBrbXBfYmFsaWduX3QgKiBiYWxpZ24gPSBuZXdfdGhyLT50aC50aF9iYXI7CisgICAgICAgIGZvciggYiA9IDA7IGIgPCBic19sYXN0X2JhcnJpZXI7ICsrIGIgKQorICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChiYWxpZ25bYl0uYmIud2FpdF9mbGFnICE9IEtNUF9CQVJSSUVSX1BBUkVOVF9GTEFHKTsKKyNlbmRpZgorCisgICAgICAgIEtGX1RSQUNFKCAxMCwgKCJfX2ttcF9hbGxvY2F0ZV90aHJlYWQ6IFQjJWQgdXNpbmcgdGhyZWFkICVwIFQjJWRcbiIsCisgICAgICAgICAgICAgICAgICAgIF9fa21wX2dldF9ndGlkKCksIG5ld190aHIsIG5ld190aHItPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCApKTsKKworICAgICAgICBLTVBfTUIoKTsKKyAgICAgICAgcmV0dXJuIG5ld190aHI7CisgICAgfQorCisKKyAgICAvKiBubywgd2VsbCBmb3JrIGEgbmV3IG9uZSAqLworICAgIEtNUF9BU1NFUlQoIF9fa21wX250aCAgICA9PSBfX2ttcF9hbGxfbnRoICk7CisgICAgS01QX0FTU0VSVCggX19rbXBfYWxsX250aCA8IF9fa21wX3RocmVhZHNfY2FwYWNpdHkgKTsKKworICAgIC8vCisgICAgLy8gSWYgdGhpcyBpcyB0aGUgZmlyc3Qgd29ya2VyIHRocmVhZCB0aGUgUlRMIGlzIGNyZWF0aW5nLCB0aGVuIGFsc28KKyAgICAvLyBsYXVuY2ggdGhlIG1vbml0b3IgdGhyZWFkLiAgV2UgdHJ5IHRvIGRvIHRoaXMgYXMgZWFybHkgYXMgcG9zc2libGUuCisgICAgLy8KKyAgICBpZiAoICEgVENSXzQoIF9fa21wX2luaXRfbW9uaXRvciApICkgeworICAgICAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmIF9fa21wX21vbml0b3JfbG9jayApOworICAgICAgICBpZiAoICEgVENSXzQoIF9fa21wX2luaXRfbW9uaXRvciApICkgeworICAgICAgICAgICAgS0ZfVFJBQ0UoIDEwLCAoICJiZWZvcmUgX19rbXBfY3JlYXRlX21vbml0b3JcbiIgKSApOworICAgICAgICAgICAgVENXXzQoIF9fa21wX2luaXRfbW9uaXRvciwgMSApOworICAgICAgICAgICAgX19rbXBfY3JlYXRlX21vbml0b3IoICYgX19rbXBfbW9uaXRvciApOworICAgICAgICAgICAgS0ZfVFJBQ0UoIDEwLCAoICJhZnRlciBfX2ttcF9jcmVhdGVfbW9uaXRvclxuIiApICk7CisgICAgICAgICAgICAjaWYgS01QX09TX1dJTkRPV1MKKyAgICAgICAgICAgICAgICAvLyBBQzogd2FpdCB1bnRpbCBtb25pdG9yIGhhcyBzdGFydGVkLiBUaGlzIGlzIGEgZml4IGZvciBDUTIzMjgwOC4KKyAgICAgICAgICAgICAgICAvLyAgICAgVGhlIHJlYXNvbiBpcyB0aGF0IGlmIHRoZSBsaWJyYXJ5IGlzIGxvYWRlZC91bmxvYWRlZCBpbiBhIGxvb3Agd2l0aCBzbWFsbCAocGFyYWxsZWwpCisgICAgICAgICAgICAgICAgLy8gICAgIHdvcmsgaW4gYmV0d2VlbiwgdGhlbiB0aGVyZSBpcyBoaWdoIHByb2JhYmlsaXR5IHRoYXQgbW9uaXRvciB0aHJlYWQgc3RhcnRlZCBhZnRlcgorICAgICAgICAgICAgICAgIC8vICAgICB0aGUgbGlicmFyeSBzaHV0ZG93bi4gQXQgc2h1dGRvd24gaXQgaXMgdG9vIGxhdGUgdG8gY29wZSB3aXRoIHRoZSBwcm9ibGVtLCBiZWNhdXNlCisgICAgICAgICAgICAgICAgLy8gICAgIHdoZW4gdGhlIG1hc3RlciBpcyBpbiBEbGxNYWluIChwcm9jZXNzIGRldGFjaCkgdGhlIG1vbml0b3IgaGFzIG5vIGNoYW5jZXMgdG8gc3RhcnQKKyAgICAgICAgICAgICAgICAvLyAgICAgKGl0IGlzIGJsb2NrZWQpLCBhbmQgbWFzdGVyIGhhcyBubyBtZWFucyB0byBpbmZvcm0gdGhlIG1vbml0b3IgdGhhdCB0aGUgbGlicmFyeSBoYXMgZ29uZSwKKyAgICAgICAgICAgICAgICAvLyAgICAgYmVjYXVzZSBhbGwgdGhlIG1lbW9yeSB3aGljaCB0aGUgbW9uaXRvciBjYW4gYWNjZXNzIGlzIGdvaW5nIHRvIGJlIHJlbGVhc2VkL3Jlc2V0LgorICAgICAgICAgICAgICAgIHdoaWxlICggVENSXzQoX19rbXBfaW5pdF9tb25pdG9yKSA8IDIgKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9ZSUVMRCggVFJVRSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBLRl9UUkFDRSggMTAsICggImFmdGVyIG1vbml0b3IgdGhyZWFkIGhhcyBzdGFydGVkXG4iICkgKTsKKyAgICAgICAgICAgICNlbmRpZgorICAgICAgICB9CisgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICYgX19rbXBfbW9uaXRvcl9sb2NrICk7CisgICAgfQorCisgICAgS01QX01CKCk7CisgICAgZm9yKCBuZXdfZ3RpZD0xIDsgVENSX1BUUihfX2ttcF90aHJlYWRzW25ld19ndGlkXSkgIT0gTlVMTDsgKytuZXdfZ3RpZCApIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggbmV3X2d0aWQgPCBfX2ttcF90aHJlYWRzX2NhcGFjaXR5ICk7CisgICAgfQorCisgICAgLyogYWxsb2NhdGUgc3BhY2UgZm9yIGl0LiAqLworICAgIG5ld190aHIgPSAoa21wX2luZm9fdCopIF9fa21wX2FsbG9jYXRlKCBzaXplb2Yoa21wX2luZm9fdCkgKTsKKworICAgIFRDV19TWU5DX1BUUihfX2ttcF90aHJlYWRzW25ld19ndGlkXSwgbmV3X3Rocik7CisKKyAgICBpZiAoIF9fa21wX3N0b3JhZ2VfbWFwICkgeworICAgICAgICBfX2ttcF9wcmludF90aHJlYWRfc3RvcmFnZV9tYXAoIG5ld190aHIsIG5ld19ndGlkICk7CisgICAgfQorCisgICAgLyogYWRkIHRoZSByZXNlcnZlIHNlcmlhbGl6ZWQgdGVhbSwgaW5pdGlhbGl6ZWQgZnJvbSB0aGUgdGVhbSdzIG1hc3RlciB0aHJlYWQgKi8KKyAgICB7CisgICAga21wX2ludGVybmFsX2NvbnRyb2xfdCByX2ljdnMgPSBfX2ttcF9nZXRfeF9nbG9iYWxfaWN2cyggdGVhbSApOworICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBfYWxsb2NhdGVfdGhyZWFkOiBiZWZvcmUgdGhfc2VyaWFsL3NlcmlhbF90ZWFtXG4iICkgKTsKKyAgICBuZXdfdGhyLT50aC50aF9zZXJpYWxfdGVhbSA9IHNlcmlhbF90ZWFtID0KKyAgICAgICAgKGttcF90ZWFtX3QqKSBfX2ttcF9hbGxvY2F0ZV90ZWFtKCByb290LCAxLCAxLAorI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY19iaW5kX2RlZmF1bHQsCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcl9pY3ZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgVVNFX05FU1RFRF9IT1RfQVJHKE5VTEwpICk7CisgICAgfQorICAgIEtNUF9BU1NFUlQgKCBzZXJpYWxfdGVhbSApOworICAgIHNlcmlhbF90ZWFtLT50LnRfc2VyaWFsaXplZCA9IDA7ICAgLy8gQUM6IHRoZSB0ZWFtIGNyZWF0ZWQgaW4gcmVzZXJ2ZSwgbm90IGZvciBleGVjdXRpb24gKGl0IGlzIHVudXNlZCBmb3Igbm93KS4KKyAgICBzZXJpYWxfdGVhbS0+dC50X3RocmVhZHNbMF0gPSBuZXdfdGhyOworICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBfYWxsb2NhdGVfdGhyZWFkOiBhZnRlciB0aF9zZXJpYWwvc2VyaWFsX3RlYW0gOiBuZXdfdGhyPSVwXG4iLAorICAgICAgbmV3X3RociApICk7CisKKyAgICAvKiBzZXR1cCB0aGUgdGhyZWFkIHN0cnVjdHVyZXMgKi8KKyAgICBfX2ttcF9pbml0aWFsaXplX2luZm8oIG5ld190aHIsIHRlYW0sIG5ld190aWQsIG5ld19ndGlkICk7CisKKyAgICAjaWYgVVNFX0ZBU1RfTUVNT1JZCisgICAgICAgIF9fa21wX2luaXRpYWxpemVfZmFzdF9tZW1vcnkoIG5ld190aHIgKTsKKyAgICAjZW5kaWYgLyogVVNFX0ZBU1RfTUVNT1JZICovCisKKyAgICAjaWYgS01QX1VTRV9CR0VUCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIG5ld190aHItPnRoLnRoX2xvY2FsLmJnZXRfZGF0YSA9PSBOVUxMICk7CisgICAgICAgIF9fa21wX2luaXRpYWxpemVfYmdldCggbmV3X3RociApOworICAgICNlbmRpZgorCisgICAgX19rbXBfaW5pdF9yYW5kb20oIG5ld190aHIgKTsgIC8vIEluaXRpYWxpemUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IKKworICAgIC8qIEluaXRpYWxpemUgdGhlc2Ugb25seSBvbmNlIHdoZW4gdGhyZWFkIGlzIGdyYWJiZWQgZm9yIGEgdGVhbSBhbGxvY2F0aW9uICovCisgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2FsbG9jYXRlX3RocmVhZDogVCMlZCBpbml0IGdvIGZvcms9JXUsIHBsYWluPSV1XG4iLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9nZXRfZ3RpZCgpLCBLTVBfSU5JVF9CQVJSSUVSX1NUQVRFLCBLTVBfSU5JVF9CQVJSSUVSX1NUQVRFICkpOworCisgICAgaW50IGI7CisgICAga21wX2JhbGlnbl90ICogYmFsaWduID0gbmV3X3Roci0+dGgudGhfYmFyOworICAgIGZvcihiPTA7IGI8YnNfbGFzdF9iYXJyaWVyOyArK2IpIHsKKyAgICAgICAgYmFsaWduW2JdLmJiLmJfZ28gPSBLTVBfSU5JVF9CQVJSSUVSX1NUQVRFOworICAgICAgICBiYWxpZ25bYl0uYmIudGVhbSA9IE5VTEw7CisgICAgICAgIGJhbGlnbltiXS5iYi53YWl0X2ZsYWcgPSBLTVBfQkFSUklFUl9OT1RfV0FJVElORzsKKyAgICAgICAgYmFsaWduW2JdLmJiLnVzZV9vbmNvcmVfYmFycmllciA9IDA7CisgICAgfQorCisgICAgbmV3X3Roci0+dGgudGhfc3Bpbl9oZXJlID0gRkFMU0U7CisgICAgbmV3X3Roci0+dGgudGhfbmV4dF93YWl0aW5nID0gMDsKKworI2lmIE9NUF80MF9FTkFCTEVEICYmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICBuZXdfdGhyLT50aC50aF9jdXJyZW50X3BsYWNlID0gS01QX1BMQUNFX1VOREVGSU5FRDsKKyAgICBuZXdfdGhyLT50aC50aF9uZXdfcGxhY2UgPSBLTVBfUExBQ0VfVU5ERUZJTkVEOworICAgIG5ld190aHItPnRoLnRoX2ZpcnN0X3BsYWNlID0gS01QX1BMQUNFX1VOREVGSU5FRDsKKyAgICBuZXdfdGhyLT50aC50aF9sYXN0X3BsYWNlID0gS01QX1BMQUNFX1VOREVGSU5FRDsKKyNlbmRpZgorCisgICAgVENXXzQobmV3X3Roci0+dGgudGhfaW5fcG9vbCwgRkFMU0UpOworICAgIG5ld190aHItPnRoLnRoX2FjdGl2ZV9pbl9wb29sID0gRkFMU0U7CisgICAgVENXXzQobmV3X3Roci0+dGgudGhfYWN0aXZlLCBUUlVFKTsKKworICAgIC8qIGFkanVzdCB0aGUgZ2xvYmFsIGNvdW50ZXJzICovCisgICAgX19rbXBfYWxsX250aCArKzsKKyAgICBfX2ttcF9udGggKys7CisKKyAgICAvLworICAgIC8vIGlmIF9fa21wX2FkanVzdF9ndGlkX21vZGUgaXMgc2V0LCB0aGVuIHdlIHVzZSBtZXRob2QgIzEgKHNwIHNlYXJjaCkKKyAgICAvLyBmb3IgbG93IG51bWJlcnMgb2YgcHJvY3MsIGFuZCBtZXRob2QgIzIgKGtleWVkIEFQSSBjYWxsKSBmb3IgaGlnaGVyCisgICAgLy8gbnVtYmVycyBvZiBwcm9jcy4KKyAgICAvLworICAgIGlmICggX19rbXBfYWRqdXN0X2d0aWRfbW9kZSApIHsKKyAgICAgICAgaWYgKCBfX2ttcF9hbGxfbnRoID49IF9fa21wX3Rsc19ndGlkX21pbiApIHsKKyAgICAgICAgICAgIGlmICggVENSXzQoX19rbXBfZ3RpZF9tb2RlKSAhPSAyKSB7CisgICAgICAgICAgICAgICAgVENXXzQoX19rbXBfZ3RpZF9tb2RlLCAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmIChUQ1JfNChfX2ttcF9ndGlkX21vZGUpICE9IDEgKSB7CisgICAgICAgICAgICAgICAgVENXXzQoX19rbXBfZ3RpZF9tb2RlLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworI2lmZGVmIEtNUF9BREpVU1RfQkxPQ0tUSU1FCisgICAgLyogQWRqdXN0IGJsb2NrdGltZSBiYWNrIHRvIHplcm8gaWYgbmVjZXNzYXJ5ICAgICAgICovCisgICAgLyogTWlkZGxlIGluaXRpYWxpemF0aW9uIG1pZ2h0IG5vdCBoYXZlIG9jY3VycmVkIHlldCAqLworICAgIGlmICggIV9fa21wX2Vudl9ibG9ja3RpbWUgJiYgKCBfX2ttcF9hdmFpbF9wcm9jID4gMCApICkgeworICAgICAgICBpZiAoIF9fa21wX250aCA+IF9fa21wX2F2YWlsX3Byb2MgKSB7CisgICAgICAgICAgICBfX2ttcF96ZXJvX2J0ID0gVFJVRTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiBLTVBfQURKVVNUX0JMT0NLVElNRSAqLworCisgICAgLyogYWN0dWFsbHkgZm9yayBpdCBhbmQgY3JlYXRlIHRoZSBuZXcgd29ya2VyIHRocmVhZCAqLworICAgIEtGX1RSQUNFKCAxMCwgKCJfX2ttcF9hbGxvY2F0ZV90aHJlYWQ6IGJlZm9yZSBfX2ttcF9jcmVhdGVfd29ya2VyOiAlcFxuIiwgbmV3X3RociApKTsKKyAgICBfX2ttcF9jcmVhdGVfd29ya2VyKCBuZXdfZ3RpZCwgbmV3X3RociwgX19rbXBfc3Rrc2l6ZSApOworICAgIEtGX1RSQUNFKCAxMCwgKCJfX2ttcF9hbGxvY2F0ZV90aHJlYWQ6IGFmdGVyIF9fa21wX2NyZWF0ZV93b3JrZXI6ICVwXG4iLCBuZXdfdGhyICkpOworCisKKyAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfYWxsb2NhdGVfdGhyZWFkOiBUIyVkIGZvcmtlZCBUIyVkXG4iLCBfX2ttcF9nZXRfZ3RpZCgpLCBuZXdfZ3RpZCApKTsKKyAgICBLTVBfTUIoKTsKKyAgICByZXR1cm4gbmV3X3RocjsKK30KKworLyoKKyAqIHJlaW5pdGlhbGl6ZSB0ZWFtIGZvciByZXVzZS4KKyAqCisgKiBUaGUgaG90IHRlYW0gY29kZSBjYWxscyB0aGlzIGNhc2UgYXQgZXZlcnkgZm9yayBiYXJyaWVyLCBzbyBFUENDIGJhcnJpZXIKKyAqIHRlc3QgYXJlIGV4dHJlbWVseSBzZW5zaXRpdmUgdG8gY2hhbmdlcyBpbiBpdCwgZXNwLiB3cml0ZXMgdG8gdGhlIHRlYW0KKyAqIHN0cnVjdCwgd2hpY2ggY2F1c2UgYSBjYWNoZSBpbnZhbGlkYXRpb24gaW4gYWxsIHRocmVhZHMuCisgKgorICogSUYgWU9VIFRPVUNIIFRISVMgUk9VVElORSwgUlVOIEVQQ0MgQyBTWU5DQkVOQ0ggT04gQSBCSUctSVJPTiBNQUNISU5FISEhCisgKi8KK3N0YXRpYyB2b2lkCitfX2ttcF9yZWluaXRpYWxpemVfdGVhbSgga21wX3RlYW1fdCAqdGVhbSwga21wX2ludGVybmFsX2NvbnRyb2xfdCAqbmV3X2ljdnMsIGlkZW50X3QgKmxvYyApIHsKKyAgICBLRl9UUkFDRSggMTAsICggIl9fa21wX3JlaW5pdGlhbGl6ZV90ZWFtOiBlbnRlciB0aGlzX3RocmVhZD0lcCB0ZWFtPSVwXG4iLAorICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfdGhyZWFkc1swXSwgdGVhbSApICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbSAmJiBuZXdfaWN2cyk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggKCAhIFRDUl80KF9fa21wX2luaXRfcGFyYWxsZWwpICkgfHwgbmV3X2ljdnMtPm5wcm9jICk7CisgICAgdGVhbS0+dC50X2lkZW50ID0gbG9jOworCisgICAgdGVhbS0+dC50X2lkID0gS01QX0dFTl9URUFNX0lEKCk7CisKKyAgICAvLyBDb3B5IElDVnMgdG8gdGhlIG1hc3RlciB0aHJlYWQncyBpbXBsaWNpdCB0YXNrZGF0YQorICAgIF9fa21wX2luaXRfaW1wbGljaXRfdGFzayggbG9jLCB0ZWFtLT50LnRfdGhyZWFkc1swXSwgdGVhbSwgMCwgRkFMU0UgKTsKKyAgICBjb3B5X2ljdnMoJnRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhWzBdLnRkX2ljdnMsIG5ld19pY3ZzKTsKKworICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBfcmVpbml0aWFsaXplX3RlYW06IGV4aXQgdGhpc190aHJlYWQ9JXAgdGVhbT0lcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X3RocmVhZHNbMF0sIHRlYW0gKSApOworfQorCisKKy8qIGluaXRpYWxpemUgdGhlIHRlYW0gZGF0YSBzdHJ1Y3R1cmUKKyAqIHRoaXMgYXNzdW1lcyB0aGUgdF90aHJlYWRzIGFuZCB0X21heF9ucHJvYyBhcmUgYWxyZWFkeSBzZXQKKyAqIGFsc28sIHdlIGRvbid0IHRvdWNoIHRoZSBhcmd1bWVudHMgKi8KK3N0YXRpYyB2b2lkCitfX2ttcF9pbml0aWFsaXplX3RlYW0oCisgICAga21wX3RlYW1fdCAqIHRlYW0sCisgICAgaW50ICAgICAgICAgIG5ld19ucHJvYywKKyAgICBrbXBfaW50ZXJuYWxfY29udHJvbF90ICogbmV3X2ljdnMsCisgICAgaWRlbnRfdCAqICAgICAgICAgICAgICAgIGxvYworKSB7CisgICAgS0ZfVFJBQ0UoIDEwLCAoICJfX2ttcF9pbml0aWFsaXplX3RlYW06IGVudGVyOiB0ZWFtPSVwXG4iLCB0ZWFtICkgKTsKKworICAgIC8qIHZlcmlmeSAqLworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRlYW0gKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBuZXdfbnByb2MgPD0gdGVhbS0+dC50X21heF9ucHJvYyApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRlYW0tPnQudF90aHJlYWRzICk7CisgICAgS01QX01CKCk7CisKKyAgICB0ZWFtLT50LnRfbWFzdGVyX3RpZCAgPSAwOyAgICAvKiBub3QgbmVlZGVkICovCisgICAgLyogdGVhbS0+dC50X21hc3Rlcl9iYXI7ICAgICAgICBub3QgbmVlZGVkICovCisgICAgdGVhbS0+dC50X3NlcmlhbGl6ZWQgID0gbmV3X25wcm9jID4gMSA/IDAgOiAxOworICAgIHRlYW0tPnQudF9ucHJvYyAgICAgICA9IG5ld19ucHJvYzsKKworICAgIC8qIHRlYW0tPnQudF9wYXJlbnQgICAgID0gTlVMTDsgVE9ETyBub3QgbmVlZGVkICYgd291bGQgbWVzcyB1cCBob3QgdGVhbSAqLworICAgIHRlYW0tPnQudF9uZXh0X3Bvb2wgICA9IE5VTEw7CisgICAgLyogbWVtc2V0KCB0ZWFtLT50LnRfdGhyZWFkcywgMCwgc2l6ZW9mKGttcF9pbmZvX3QqKSpuZXdfbnByb2MgKTsgd291bGQgbWVzcyB1cCBob3QgdGVhbSAqLworCisgICAgVENXX1NZTkNfUFRSKHRlYW0tPnQudF9wa2ZuLCBOVUxMKTsgLyogbm90IG5lZWRlZCAqLworICAgIHRlYW0tPnQudF9pbnZva2UgICAgICA9IE5VTEw7IC8qIG5vdCBuZWVkZWQgKi8KKworICAgIC8vIFRPRE8/Pz86IHRlYW0tPnQudF9tYXhfYWN0aXZlX2xldmVscyAgICAgICA9IG5ld19tYXhfYWN0aXZlX2xldmVsczsKKyAgICB0ZWFtLT50LnRfc2NoZWQgICAgICAgPSBuZXdfaWN2cy0+c2NoZWQ7CisKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisgICAgdGVhbS0+dC50X2ZwX2NvbnRyb2xfc2F2ZWQgPSBGQUxTRTsgLyogbm90IG5lZWRlZCAqLworICAgIHRlYW0tPnQudF94ODdfZnB1X2NvbnRyb2xfd29yZCA9IDA7IC8qIG5vdCBuZWVkZWQgKi8KKyAgICB0ZWFtLT50LnRfbXhjc3IgPSAwOyAgICAgICAgICAgICAgICAvKiBub3QgbmVlZGVkICovCisjZW5kaWYgLyogS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCAqLworCisgICAgdGVhbS0+dC50X2NvbnN0cnVjdCAgID0gMDsKKyAgICBfX2ttcF9pbml0X2xvY2soICYgdGVhbS0+dC50X3NpbmdsZV9sb2NrICk7CisKKyAgICB0ZWFtLT50LnRfb3JkZXJlZCAuZHQudF92YWx1ZSA9IDA7CisgICAgdGVhbS0+dC50X21hc3Rlcl9hY3RpdmUgPSBGQUxTRTsKKworICAgIG1lbXNldCggJiB0ZWFtLT50LnRfdGFza3EsICdcMCcsIHNpemVvZigga21wX3Rhc2txX3QgKSk7CisKKyNpZmRlZiBLTVBfREVCVUcKKyAgICB0ZWFtLT50LnRfY29weXByaXZfZGF0YSA9IE5VTEw7ICAvKiBub3QgbmVjZXNzYXJ5LCBidXQgbmljZSBmb3IgZGVidWdnaW5nICovCisjZW5kaWYKKyAgICB0ZWFtLT50LnRfY29weWluX2NvdW50ZXIgPSAwOyAgICAvKiBmb3IgYmFycmllci1mcmVlIGNvcHlpbiBpbXBsZW1lbnRhdGlvbiAqLworCisgICAgdGVhbS0+dC50X2NvbnRyb2xfc3RhY2tfdG9wID0gTlVMTDsKKworICAgIF9fa21wX3JlaW5pdGlhbGl6ZV90ZWFtKCB0ZWFtLCBuZXdfaWN2cywgbG9jICk7CisKKyAgICBLTVBfTUIoKTsKKyAgICBLRl9UUkFDRSggMTAsICggIl9fa21wX2luaXRpYWxpemVfdGVhbTogZXhpdDogdGVhbT0lcFxuIiwgdGVhbSApICk7Cit9CisKKyNpZiBLTVBfT1NfTElOVVggJiYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorLyogU2V0cyBmdWxsIG1hc2sgZm9yIHRocmVhZCBhbmQgcmV0dXJucyBvbGQgbWFzaywgbm8gY2hhbmdlcyB0byBzdHJ1Y3R1cmVzLiAqLworc3RhdGljIHZvaWQKK19fa21wX3NldF90aHJlYWRfYWZmaW5pdHlfbWFza19mdWxsX3RtcCgga21wX2FmZmluX21hc2tfdCAqb2xkX21hc2sgKQoreworICAgIGlmICggS01QX0FGRklOSVRZX0NBUEFCTEUoKSApIHsKKyAgICAgICAgaW50IHN0YXR1czsKKyAgICAgICAgaWYgKCBvbGRfbWFzayAhPSBOVUxMICkgeworICAgICAgICAgICAgc3RhdHVzID0gX19rbXBfZ2V0X3N5c3RlbV9hZmZpbml0eSggb2xkX21hc2ssIFRSVUUgKTsKKyAgICAgICAgICAgIGludCBlcnJvciA9IGVycm5vOworICAgICAgICAgICAgaWYgKCBzdGF0dXMgIT0gMCApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgICAgICAgICAgS01QX01TRyggQ2hhbmdlVGhyZWFkQWZmTWFza0Vycm9yICksCisgICAgICAgICAgICAgICAgICAgIEtNUF9FUlIoIGVycm9yICksCisgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBfX2ttcF9zZXRfc3lzdGVtX2FmZmluaXR5KCBfX2ttcF9hZmZpbml0eV9nZXRfZnVsbE1hc2soKSwgVFJVRSApOworICAgIH0KK30KKyNlbmRpZgorCisjaWYgT01QXzQwX0VOQUJMRUQgJiYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorCisvLworLy8gX19rbXBfcGFydGl0aW9uX3BsYWNlcygpIGlzIHRoZSBoZWFydCBvZiB0aGUgT3Blbk1QIDQuMCBhZmZpbml0eSBtZWNoYW5pc20uCisvLyBJdCBjYWxjdWxhdHMgdGhlIHdvcmtlciArIG1hc3RlciB0aHJlYWQncyBwYXJ0aXRpb24gYmFzZWQgdXBvbiB0aGUgcGFyZW50CisvLyB0aHJlYWQncyBwYXJ0aXRpb24sIGFuZCBiaW5kcyBlYWNoIHdvcmtlciB0byBhIHRocmVhZCBpbiB0aGVpciBwYXJ0aXRpb24uCisvLyBUaGUgbWFzdGVyIHRocmVhZCdzIHBhcnRpdGlvbiBzaG91bGQgYWxyZWFkeSBpbmNsdWRlIGl0cyBjdXJyZW50IGJpbmRpbmcuCisvLworc3RhdGljIHZvaWQKK19fa21wX3BhcnRpdGlvbl9wbGFjZXMoIGttcF90ZWFtX3QgKnRlYW0gKQoreworICAgIC8vCisgICAgLy8gQ29weSB0aGUgbWFzdGVyIHRocmVhZCdzIHBsYWNlIHBhcnRpb24gdG8gdGhlIHRlYW0gc3RydWN0CisgICAgLy8KKyAgICBrbXBfaW5mb190ICptYXN0ZXJfdGggPSB0ZWFtLT50LnRfdGhyZWFkc1swXTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBtYXN0ZXJfdGggIT0gTlVMTCApOworICAgIGttcF9wcm9jX2JpbmRfdCBwcm9jX2JpbmQgPSB0ZWFtLT50LnRfcHJvY19iaW5kOworICAgIGludCBmaXJzdF9wbGFjZSA9IG1hc3Rlcl90aC0+dGgudGhfZmlyc3RfcGxhY2U7CisgICAgaW50IGxhc3RfcGxhY2UgPSBtYXN0ZXJfdGgtPnRoLnRoX2xhc3RfcGxhY2U7CisgICAgaW50IG1hc3RlcnNfcGxhY2UgPSBtYXN0ZXJfdGgtPnRoLnRoX2N1cnJlbnRfcGxhY2U7CisgICAgdGVhbS0+dC50X2ZpcnN0X3BsYWNlID0gZmlyc3RfcGxhY2U7CisgICAgdGVhbS0+dC50X2xhc3RfcGxhY2UgPSBsYXN0X3BsYWNlOworCisgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX3BhcnRpdGlvbl9wbGFjZXM6IGVudGVyOiBwcm9jX2JpbmQgPSAlZCBUIyVkKCVkOjApIGJvdW5kIHRvIHBsYWNlICVkIHBhcnRpdGlvbiA9IFslZCwlZF1cbiIsCisgICAgICAgcHJvY19iaW5kLCBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0ZWFtLT50LnRfdGhyZWFkc1swXSApLCB0ZWFtLT50LnRfaWQsCisgICAgICAgbWFzdGVyc19wbGFjZSwgZmlyc3RfcGxhY2UsIGxhc3RfcGxhY2UgKSApOworCisgICAgc3dpdGNoICggcHJvY19iaW5kICkgeworCisgICAgICAgIGNhc2UgcHJvY19iaW5kX2RlZmF1bHQ6CisgICAgICAgIC8vCisgICAgICAgIC8vIHNlcmlhbCB0ZWFtcyBtaWdodCBoYXZlIHRoZSBwcm9jX2JpbmQgcG9saWN5IHNldCB0bworICAgICAgICAvLyBwcm9jX2JpbmRfZGVmYXVsdC4gIEl0IGRvZXNuJ3QgbWF0dGVyLCBhcyB3ZSBkb24ndAorICAgICAgICAvLyByZWJpbmQgdGhlIG1hc3RlciB0aHJlYWQgZm9yIGFueSBwcm9jX2JpbmQgcG9saWN5LgorICAgICAgICAvLworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0ZWFtLT50LnRfbnByb2MgPT0gMSApOworICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIHByb2NfYmluZF9tYXN0ZXI6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBmOworICAgICAgICAgICAgaW50IG5fdGggPSB0ZWFtLT50LnRfbnByb2M7CisgICAgICAgICAgICBmb3IgKCBmID0gMTsgZiA8IG5fdGg7IGYrKyApIHsKKyAgICAgICAgICAgICAgICBrbXBfaW5mb190ICp0aCA9IHRlYW0tPnQudF90aHJlYWRzW2ZdOworICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHRoICE9IE5VTEwgKTsKKyAgICAgICAgICAgICAgICB0aC0+dGgudGhfZmlyc3RfcGxhY2UgPSBmaXJzdF9wbGFjZTsKKyAgICAgICAgICAgICAgICB0aC0+dGgudGhfbGFzdF9wbGFjZSA9IGxhc3RfcGxhY2U7CisgICAgICAgICAgICAgICAgdGgtPnRoLnRoX25ld19wbGFjZSA9IG1hc3RlcnNfcGxhY2U7CisKKyAgICAgICAgICAgICAgICBLQV9UUkFDRSggMTAwLCAoIl9fa21wX3BhcnRpdGlvbl9wbGFjZXM6IG1hc3RlcjogVCMlZCglZDolZCkgcGxhY2UgJWQgcGFydGl0aW9uID0gWyVkLCVkXVxuIiwKKyAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRlYW0tPnQudF90aHJlYWRzW2ZdICksCisgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfaWQsIGYsIG1hc3RlcnNfcGxhY2UsIGZpcnN0X3BsYWNlLCBsYXN0X3BsYWNlICkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIHByb2NfYmluZF9jbG9zZToKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGY7CisgICAgICAgICAgICBpbnQgbl90aCA9IHRlYW0tPnQudF9ucHJvYzsKKyAgICAgICAgICAgIGludCBuX3BsYWNlczsKKyAgICAgICAgICAgIGlmICggZmlyc3RfcGxhY2UgPD0gbGFzdF9wbGFjZSApIHsKKyAgICAgICAgICAgICAgICBuX3BsYWNlcyA9IGxhc3RfcGxhY2UgLSBmaXJzdF9wbGFjZSArIDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBuX3BsYWNlcyA9IF9fa21wX2FmZmluaXR5X251bV9tYXNrcyAtIGZpcnN0X3BsYWNlICsgbGFzdF9wbGFjZSArIDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIG5fdGggPD0gbl9wbGFjZXMgKSB7CisgICAgICAgICAgICAgICAgaW50IHBsYWNlID0gbWFzdGVyc19wbGFjZTsKKyAgICAgICAgICAgICAgICBmb3IgKCBmID0gMTsgZiA8IG5fdGg7IGYrKyApIHsKKyAgICAgICAgICAgICAgICAgICAga21wX2luZm9fdCAqdGggPSB0ZWFtLT50LnRfdGhyZWFkc1tmXTsKKyAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGggIT0gTlVMTCApOworCisgICAgICAgICAgICAgICAgICAgIGlmICggcGxhY2UgPT0gbGFzdF9wbGFjZSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlID0gZmlyc3RfcGxhY2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHBsYWNlID09IChpbnQpKF9fa21wX2FmZmluaXR5X251bV9tYXNrcyAtIDEpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2UgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2UrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0aC0+dGgudGhfZmlyc3RfcGxhY2UgPSBmaXJzdF9wbGFjZTsKKyAgICAgICAgICAgICAgICAgICAgdGgtPnRoLnRoX2xhc3RfcGxhY2UgPSBsYXN0X3BsYWNlOworICAgICAgICAgICAgICAgICAgICB0aC0+dGgudGhfbmV3X3BsYWNlID0gcGxhY2U7CisKKyAgICAgICAgICAgICAgICAgICAgS0FfVFJBQ0UoIDEwMCwgKCJfX2ttcF9wYXJ0aXRpb25fcGxhY2VzOiBjbG9zZTogVCMlZCglZDolZCkgcGxhY2UgJWQgcGFydGl0aW9uID0gWyVkLCVkXVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGVhbS0+dC50X3RocmVhZHNbZl0gKSwKKyAgICAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X2lkLCBmLCBwbGFjZSwgZmlyc3RfcGxhY2UsIGxhc3RfcGxhY2UgKSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGludCBTLCByZW0sIGdhcCwgc19jb3VudDsKKyAgICAgICAgICAgICAgICBTID0gbl90aCAvIG5fcGxhY2VzOworICAgICAgICAgICAgICAgIHNfY291bnQgPSAwOworICAgICAgICAgICAgICAgIHJlbSA9IG5fdGggLSAoIFMgKiBuX3BsYWNlcyApOworICAgICAgICAgICAgICAgIGdhcCA9IHJlbSA+IDAgPyBuX3BsYWNlcy9yZW0gOiBuX3BsYWNlczsKKyAgICAgICAgICAgICAgICBpbnQgcGxhY2UgPSBtYXN0ZXJzX3BsYWNlOworICAgICAgICAgICAgICAgIGludCBnYXBfY3QgPSBnYXA7CisgICAgICAgICAgICAgICAgZm9yICggZiA9IDA7IGYgPCBuX3RoOyBmKysgKSB7CisgICAgICAgICAgICAgICAgICAgIGttcF9pbmZvX3QgKnRoID0gdGVhbS0+dC50X3RocmVhZHNbZl07CisgICAgICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHRoICE9IE5VTEwgKTsKKworICAgICAgICAgICAgICAgICAgICB0aC0+dGgudGhfZmlyc3RfcGxhY2UgPSBmaXJzdF9wbGFjZTsKKyAgICAgICAgICAgICAgICAgICAgdGgtPnRoLnRoX2xhc3RfcGxhY2UgPSBsYXN0X3BsYWNlOworICAgICAgICAgICAgICAgICAgICB0aC0+dGgudGhfbmV3X3BsYWNlID0gcGxhY2U7CisgICAgICAgICAgICAgICAgICAgIHNfY291bnQrKzsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIChzX2NvdW50ID09IFMpICYmIHJlbSAmJiAoZ2FwX2N0ID09IGdhcCkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3RoaW5nLCBhZGQgYW4gZXh0cmEgdGhyZWFkIHRvIHBsYWNlIG9uIG5leHQgaXRlcmF0aW9uCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzX2NvdW50ID09IFMrMSkgJiYgcmVtICYmIChnYXBfY3QgPT0gZ2FwKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGFkZGVkIGFuIGV4dHJhIHRocmVhZCB0byB0aGlzIHBsYWNlOyBtb3ZlIHRvIG5leHQgcGxhY2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcGxhY2UgPT0gbGFzdF9wbGFjZSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZSA9IGZpcnN0X3BsYWNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHBsYWNlID09IChpbnQpKF9fa21wX2FmZmluaXR5X251bV9tYXNrcyAtIDEpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlKys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBzX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdhcF9jdCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICByZW0tLTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzX2NvdW50ID09IFMpIHsgLy8gcGxhY2UgZnVsbDsgZG9uJ3QgYWRkIGV4dHJhCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHBsYWNlID09IGxhc3RfcGxhY2UgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2UgPSBmaXJzdF9wbGFjZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBwbGFjZSA9PSAoaW50KShfX2ttcF9hZmZpbml0eV9udW1fbWFza3MgLSAxKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZSsrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZ2FwX2N0Kys7CisgICAgICAgICAgICAgICAgICAgICAgICBzX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIEtBX1RSQUNFKCAxMDAsICgiX19rbXBfcGFydGl0aW9uX3BsYWNlczogY2xvc2U6IFQjJWQoJWQ6JWQpIHBsYWNlICVkIHBhcnRpdGlvbiA9IFslZCwlZF1cbiIsCisgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGVhbS0+dC50X3RocmVhZHNbZl0gKSwKKyAgICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfaWQsIGYsIHRoLT50aC50aF9uZXdfcGxhY2UsIGZpcnN0X3BsYWNlLAorICAgICAgICAgICAgICAgICAgICAgIGxhc3RfcGxhY2UgKSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBwbGFjZSA9PSBtYXN0ZXJzX3BsYWNlICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBwcm9jX2JpbmRfc3ByZWFkOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQgZjsKKyAgICAgICAgICAgIGludCBuX3RoID0gdGVhbS0+dC50X25wcm9jOworICAgICAgICAgICAgaW50IG5fcGxhY2VzOworICAgICAgICAgICAgaWYgKCBmaXJzdF9wbGFjZSA8PSBsYXN0X3BsYWNlICkgeworICAgICAgICAgICAgICAgIG5fcGxhY2VzID0gbGFzdF9wbGFjZSAtIGZpcnN0X3BsYWNlICsgMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIG5fcGxhY2VzID0gX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzIC0gZmlyc3RfcGxhY2UgKyBsYXN0X3BsYWNlICsgMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggbl90aCA8PSBuX3BsYWNlcyApIHsKKyAgICAgICAgICAgICAgICBpbnQgcGxhY2UgPSBtYXN0ZXJzX3BsYWNlOworICAgICAgICAgICAgICAgIGludCBTID0gbl9wbGFjZXMvbl90aDsKKyAgICAgICAgICAgICAgICBpbnQgc19jb3VudCwgcmVtLCBnYXAsIGdhcF9jdDsKKyAgICAgICAgICAgICAgICByZW0gPSBuX3BsYWNlcyAtIG5fdGgqUzsKKyAgICAgICAgICAgICAgICBnYXAgPSByZW0gPyBuX3RoL3JlbSA6IDE7CisgICAgICAgICAgICAgICAgZ2FwX2N0ID0gZ2FwOworICAgICAgICAgICAgICAgIGZvciAoIGYgPSAwOyBmIDwgbl90aDsgZisrICkgeworICAgICAgICAgICAgICAgICAgICBrbXBfaW5mb190ICp0aCA9IHRlYW0tPnQudF90aHJlYWRzW2ZdOworICAgICAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0aCAhPSBOVUxMICk7CisKKyAgICAgICAgICAgICAgICAgICAgdGgtPnRoLnRoX2ZpcnN0X3BsYWNlID0gcGxhY2U7CisgICAgICAgICAgICAgICAgICAgIHRoLT50aC50aF9uZXdfcGxhY2UgPSBwbGFjZTsKKyAgICAgICAgICAgICAgICAgICAgc19jb3VudCA9IDE7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChzX2NvdW50IDwgUykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwbGFjZSA9PSBsYXN0X3BsYWNlICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlID0gZmlyc3RfcGxhY2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggcGxhY2UgPT0gKGludCkoX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzIC0gMSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2UgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2UrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHNfY291bnQrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAocmVtICYmIChnYXBfY3QgPT0gZ2FwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwbGFjZSA9PSBsYXN0X3BsYWNlICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlID0gZmlyc3RfcGxhY2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggcGxhY2UgPT0gKGludCkoX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzIC0gMSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2UgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2UrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbS0tOworICAgICAgICAgICAgICAgICAgICAgICAgZ2FwX2N0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0aC0+dGgudGhfbGFzdF9wbGFjZSA9IHBsYWNlOworICAgICAgICAgICAgICAgICAgICBnYXBfY3QrKzsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIHBsYWNlID09IGxhc3RfcGxhY2UgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZSA9IGZpcnN0X3BsYWNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBwbGFjZSA9PSAoaW50KShfX2ttcF9hZmZpbml0eV9udW1fbWFza3MgLSAxKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlKys7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBLQV9UUkFDRSggMTAwLCAoIl9fa21wX3BhcnRpdGlvbl9wbGFjZXM6IHNwcmVhZDogVCMlZCglZDolZCkgcGxhY2UgJWQgcGFydGl0aW9uID0gWyVkLCVkXVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0ZWFtLT50LnRfdGhyZWFkc1tmXSApLAorICAgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9pZCwgZiwgdGgtPnRoLnRoX25ld19wbGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICB0aC0+dGgudGhfZmlyc3RfcGxhY2UsIHRoLT50aC50aF9sYXN0X3BsYWNlICkgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggcGxhY2UgPT0gbWFzdGVyc19wbGFjZSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgaW50IFMsIHJlbSwgZ2FwLCBzX2NvdW50OworICAgICAgICAgICAgICAgIFMgPSBuX3RoIC8gbl9wbGFjZXM7CisgICAgICAgICAgICAgICAgc19jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgcmVtID0gbl90aCAtICggUyAqIG5fcGxhY2VzICk7CisgICAgICAgICAgICAgICAgZ2FwID0gcmVtID4gMCA/IG5fcGxhY2VzL3JlbSA6IG5fcGxhY2VzOworICAgICAgICAgICAgICAgIGludCBwbGFjZSA9IG1hc3RlcnNfcGxhY2U7CisgICAgICAgICAgICAgICAgaW50IGdhcF9jdCA9IGdhcDsKKyAgICAgICAgICAgICAgICBmb3IgKCBmID0gMDsgZiA8IG5fdGg7IGYrKyApIHsKKyAgICAgICAgICAgICAgICAgICAga21wX2luZm9fdCAqdGggPSB0ZWFtLT50LnRfdGhyZWFkc1tmXTsKKyAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGggIT0gTlVMTCApOworCisgICAgICAgICAgICAgICAgICAgIHRoLT50aC50aF9maXJzdF9wbGFjZSA9IHBsYWNlOworICAgICAgICAgICAgICAgICAgICB0aC0+dGgudGhfbGFzdF9wbGFjZSA9IHBsYWNlOworICAgICAgICAgICAgICAgICAgICB0aC0+dGgudGhfbmV3X3BsYWNlID0gcGxhY2U7CisgICAgICAgICAgICAgICAgICAgIHNfY291bnQrKzsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIChzX2NvdW50ID09IFMpICYmIHJlbSAmJiAoZ2FwX2N0ID09IGdhcCkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3RoaW5nLCBhZGQgYW4gZXh0cmEgdGhyZWFkIHRvIHBsYWNlIG9uIG5leHQgaXRlcmF0aW9uCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzX2NvdW50ID09IFMrMSkgJiYgcmVtICYmIChnYXBfY3QgPT0gZ2FwKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGFkZGVkIGFuIGV4dHJhIHRocmVhZCB0byB0aGlzIHBsYWNlOyBtb3ZlIG9uIHRvIG5leHQgcGxhY2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcGxhY2UgPT0gbGFzdF9wbGFjZSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZSA9IGZpcnN0X3BsYWNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHBsYWNlID09IChpbnQpKF9fa21wX2FmZmluaXR5X251bV9tYXNrcyAtIDEpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlKys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBzX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdhcF9jdCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICByZW0tLTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzX2NvdW50ID09IFMpIHsgLy8gcGxhY2UgaXMgZnVsbDsgZG9uJ3QgYWRkIGV4dHJhIHRocmVhZAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwbGFjZSA9PSBsYXN0X3BsYWNlICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlID0gZmlyc3RfcGxhY2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggcGxhY2UgPT0gKGludCkoX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzIC0gMSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2UgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2UrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGdhcF9jdCsrOworICAgICAgICAgICAgICAgICAgICAgICAgc19jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBLQV9UUkFDRSggMTAwLCAoIl9fa21wX3BhcnRpdGlvbl9wbGFjZXM6IHNwcmVhZDogVCMlZCglZDolZCkgcGxhY2UgJWQgcGFydGl0aW9uID0gWyVkLCVkXVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGVhbS0+dC50X3RocmVhZHNbZl0gKSwKKyAgICAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X2lkLCBmLCB0aC0+dGgudGhfbmV3X3BsYWNlLAorICAgICAgICAgICAgICAgICAgICAgICB0aC0+dGgudGhfZmlyc3RfcGxhY2UsIHRoLT50aC50aF9sYXN0X3BsYWNlKSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBwbGFjZSA9PSBtYXN0ZXJzX3BsYWNlICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX3BhcnRpdGlvbl9wbGFjZXM6IGV4aXQgVCMlZFxuIiwgdGVhbS0+dC50X2lkICkgKTsKK30KKworI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICYmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQgKi8KKworLyogYWxsb2NhdGUgYSBuZXcgdGVhbSBkYXRhIHN0cnVjdHVyZSB0byB1c2UuICB0YWtlIG9uZSBvZmYgb2YgdGhlIGZyZWUgcG9vbCBpZiBhdmFpbGFibGUgKi8KK2ttcF90ZWFtX3QgKgorX19rbXBfYWxsb2NhdGVfdGVhbSgga21wX3Jvb3RfdCAqcm9vdCwgaW50IG5ld19ucHJvYywgaW50IG1heF9ucHJvYywKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIGttcF9wcm9jX2JpbmRfdCBuZXdfcHJvY19iaW5kLAorI2VuZGlmCisgICAga21wX2ludGVybmFsX2NvbnRyb2xfdCAqbmV3X2ljdnMsCisgICAgaW50IGFyZ2MgVVNFX05FU1RFRF9IT1RfQVJHKGttcF9pbmZvX3QgKm1hc3RlcikgKQoreworICAgIEtNUF9USU1FX0JMT0NLKEtNUF9hbGxvY2F0ZV90ZWFtKTsKKyAgICBpbnQgZjsKKyAgICBrbXBfdGVhbV90ICp0ZWFtOworICAgIGNoYXIgKnB0cjsKKyAgICBzaXplX3Qgc2l6ZTsKKyAgICBpbnQgdXNlX2hvdF90ZWFtID0gISByb290LT5yLnJfYWN0aXZlOworCisgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2FsbG9jYXRlX3RlYW06IGNhbGxlZFxuIikpOworICAgIEtNUF9ERUJVR19BU1NFUlQoIG5ld19ucHJvYyA+PTEgJiYgYXJnYyA+PTAgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBtYXhfbnByb2MgPj0gbmV3X25wcm9jICk7CisgICAgS01QX01CKCk7CisKKyNpZiBLTVBfTkVTVEVEX0hPVF9URUFNUworICAgIGludCBsZXZlbDsKKyAgICBrbXBfaG90X3RlYW1fcHRyX3QgKmhvdF90ZWFtczsKKyAgICBpZiggbWFzdGVyICkgeworICAgICAgICB0ZWFtID0gbWFzdGVyLT50aC50aF90ZWFtOworICAgICAgICBsZXZlbCA9IHRlYW0tPnQudF9hY3RpdmVfbGV2ZWw7CisgICAgICAgIGlmKCBtYXN0ZXItPnRoLnRoX3RlYW1zX21pY3JvdGFzayApIHsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gdGVhbXMgY29uc3RydWN0PworICAgICAgICAgICAgaWYoIG1hc3Rlci0+dGgudGhfdGVhbXNfc2l6ZS5udGVhbXMgPiAxICYmICggICAgICAgICAgICAgLy8gI3RlYW1zID4gMQorICAgICAgICAgICAgICAgIHRlYW0tPnQudF9wa2ZuID09IChtaWNyb3Rhc2tfdClfX2ttcF90ZWFtc19tYXN0ZXIgfHwgLy8gaW5uZXIgZm9yayBvZiB0aGUgdGVhbXMKKyAgICAgICAgICAgICAgICBtYXN0ZXItPnRoLnRoX3RlYW1zX2xldmVsIDwgdGVhbS0+dC50X2xldmVsICkgKSB7ICAgIC8vIG9yIG5lc3RlZCBwYXJhbGxlbCBpbnNpZGUgdGhlIHRlYW1zCisgICAgICAgICAgICAgICAgKytsZXZlbDsgLy8gbm90IGluY3JlbWVudCBpZiAjdGVhbXM9PTEsIG9yIGZvciBvdXRlciBmb3JrIG9mIHRoZSB0ZWFtczsgaW5jcmVtZW50IG90aGVyd2lzZQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGhvdF90ZWFtcyA9IG1hc3Rlci0+dGgudGhfaG90X3RlYW1zOworICAgICAgICBpZiggbGV2ZWwgPCBfX2ttcF9ob3RfdGVhbXNfbWF4X2xldmVsICYmIGhvdF90ZWFtcyAmJiBob3RfdGVhbXNbbGV2ZWxdLmhvdF90ZWFtICkKKyAgICAgICAgeyAgIC8vIGhvdCB0ZWFtIGhhcyBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGZvciBnaXZlbiBsZXZlbAorICAgICAgICAgICAgdXNlX2hvdF90ZWFtID0gMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHVzZV9ob3RfdGVhbSA9IDA7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKyAgICAvLyBPcHRpbWl6YXRpb24gdG8gdXNlIGEgImhvdCIgdGVhbQorICAgIGlmKCB1c2VfaG90X3RlYW0gJiYgbmV3X25wcm9jID4gMSApIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggbmV3X25wcm9jID09IG1heF9ucHJvYyApOworI2lmIEtNUF9ORVNURURfSE9UX1RFQU1TCisgICAgICAgIHRlYW0gPSBob3RfdGVhbXNbbGV2ZWxdLmhvdF90ZWFtOworI2Vsc2UKKyAgICAgICAgdGVhbSA9ICByb290LT5yLnJfaG90X3RlYW07CisjZW5kaWYKKyNpZiBLTVBfREVCVUcKKyAgICAgICAgaWYgKCBfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYyApIHsKKyAgICAgICAgICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9hbGxvY2F0ZV90ZWFtOiBob3QgdGVhbSB0YXNrX3RlYW0gPSAlcCBiZWZvcmUgcmVpbml0XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X3Rhc2tfdGVhbSApKTsKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgLy8gSGFzIHRoZSBudW1iZXIgb2YgdGhyZWFkcyBjaGFuZ2VkPworICAgICAgICAvKiBMZXQncyBhc3N1bWUgdGhlIG1vc3QgY29tbW9uIGNhc2UgaXMgdGhhdCB0aGUgbnVtYmVyIG9mIHRocmVhZHMgaXMgdW5jaGFuZ2VkLCBhbmQKKyAgICAgICAgICAgcHV0IHRoYXQgY2FzZSBmaXJzdC4gKi8KKyAgICAgICAgaWYgKHRlYW0tPnQudF9ucHJvYyA9PSBuZXdfbnByb2MpIHsgLy8gQ2hlY2sgY2hhbmdlcyBpbiBudW1iZXIgb2YgdGhyZWFkcworICAgICAgICAgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2FsbG9jYXRlX3RlYW06IHJldXNpbmcgaG90IHRlYW1cbiIgKSk7CisgICAgICAgICAgICAvLyBUaGlzIGNhc2UgY2FuIG1lYW4gdGhhdCBvbXBfc2V0X251bV90aHJlYWRzKCkgd2FzIGNhbGxlZCBhbmQgdGhlIGhvdCB0ZWFtIHNpemUKKyAgICAgICAgICAgIC8vIHdhcyBhbHJlYWR5IHJlZHVjZWQsIHNvIHdlIGNoZWNrIHRoZSBzcGVjaWFsIGZsYWcKKyAgICAgICAgICAgIGlmICggdGVhbS0+dC50X3NpemVfY2hhbmdlZCA9PSAtMSApIHsKKyAgICAgICAgICAgICAgICB0ZWFtLT50LnRfc2l6ZV9jaGFuZ2VkID0gMTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGVhbS0+dC50X3NpemVfY2hhbmdlZCA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFRPRE8/Pz86IHRlYW0tPnQudF9tYXhfYWN0aXZlX2xldmVscyA9IG5ld19tYXhfYWN0aXZlX2xldmVsczsKKyAgICAgICAgICAgIHRlYW0tPnQudF9zY2hlZCA9ICBuZXdfaWN2cy0+c2NoZWQ7CisKKyAgICAgICAgICAgIF9fa21wX3JlaW5pdGlhbGl6ZV90ZWFtKCB0ZWFtLCBuZXdfaWN2cywgcm9vdC0+ci5yX3ViZXJfdGhyZWFkLT50aC50aF9pZGVudCApOworCisgICAgICAgICAgICBLRl9UUkFDRSggMTAsICgiX19rbXBfYWxsb2NhdGVfdGVhbTI6IFQjJWQsIHRoaXNfdGhyZWFkPSVwIHRlYW09JXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCB0ZWFtLT50LnRfdGhyZWFkc1swXSwgdGVhbSApICk7CisgICAgICAgICAgICBfX2ttcF9wdXNoX2N1cnJlbnRfdGFza190b190aHJlYWQoIHRlYW0tPnQudF90aHJlYWRzWyAwIF0sIHRlYW0sIDAgKTsKKworI2lmIE9NUF80MF9FTkFCTEVECisjIGlmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICAgICAgICAgIGlmICggdGVhbS0+dC50X3Byb2NfYmluZCA9PSBuZXdfcHJvY19iaW5kICkgeworICAgICAgICAgICAgICAgIEtBX1RSQUNFKCAyMDAsICgiX19rbXBfYWxsb2NhdGVfdGVhbTogcmV1c2luZyBob3QgdGVhbSAjJWQgYmluZGluZ3M6IHByb2NfYmluZCA9ICVkLCBwYXJ0aXRpb24gPSBbJWQsJWRdXG4iLAorICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X2lkLCBuZXdfcHJvY19iaW5kLCB0ZWFtLT50LnRfZmlyc3RfcGxhY2UsCisgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfbGFzdF9wbGFjZSApICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICB0ZWFtLT50LnRfcHJvY19iaW5kID0gbmV3X3Byb2NfYmluZDsKKyAgICAgICAgICAgICAgICBfX2ttcF9wYXJ0aXRpb25fcGxhY2VzKCB0ZWFtICk7CisgICAgICAgICAgICB9CisjIGVsc2UKKyAgICAgICAgICAgIGlmICggdGVhbS0+dC50X3Byb2NfYmluZCAhPSBuZXdfcHJvY19iaW5kICkgeworICAgICAgICAgICAgICAgIHRlYW0tPnQudF9wcm9jX2JpbmQgPSBuZXdfcHJvY19iaW5kOworICAgICAgICAgICAgfQorIyBlbmRpZiAvKiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVEICovCisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKCB0ZWFtLT50LnRfbnByb2MgPiBuZXdfbnByb2MgKSB7CisgICAgICAgICAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfYWxsb2NhdGVfdGVhbTogZGVjcmVhc2luZyBob3QgdGVhbSB0aHJlYWQgY291bnQgdG8gJWRcbiIsIG5ld19ucHJvYyApKTsKKworICAgICAgICAgICAgdGVhbS0+dC50X3NpemVfY2hhbmdlZCA9IDE7CisgICAgICAgICAgICBpZiAoIF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjICkgeworICAgICAgICAgICAgICAgIGttcF90YXNrX3RlYW1fdCAqdGFza190ZWFtID0gdGVhbS0+dC50X3Rhc2tfdGVhbTsKKyAgICAgICAgICAgICAgICBpZiAoICggdGFza190ZWFtICE9IE5VTEwgKSAmJiBUQ1JfU1lOQ180KHRhc2tfdGVhbS0+dHQudHRfYWN0aXZlKSApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgLy8gU2lnbmFsIHRoZSB3b3JrZXIgdGhyZWFkcyAoZXNwLiB0aGUgZXh0cmEgb25lcykgdG8gc3RvcAorICAgICAgICAgICAgICAgICAgICAvLyBsb29raW5nIGZvciB0YXNrcyB3aGlsZSBzcGluIHdhaXRpbmcuICBUaGUgdGFzayB0ZWFtcworICAgICAgICAgICAgICAgICAgICAvLyBhcmUgcmVmZXJlbmNlIGNvdW50ZWQgYW5kIHdpbGwgYmUgZGVhbGxvY2F0ZWQgYnkgdGhlCisgICAgICAgICAgICAgICAgICAgIC8vIGxhc3Qgd29ya2VyIHRocmVhZC4KKyAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbS0+dC50X25wcm9jID4gMSApOworICAgICAgICAgICAgICAgICAgICBUQ1dfU1lOQ180KCB0YXNrX3RlYW0tPnR0LnR0X2FjdGl2ZSwgRkFMU0UgKTsKKyAgICAgICAgICAgICAgICAgICAgS01QX01CKCk7CisKKyAgICAgICAgICAgICAgICAgICAgS0FfVFJBQ0UoIDIwLCAoICJfX2ttcF9hbGxvY2F0ZV90ZWFtOiBzZXR0aW5nIHRhc2tfdGVhbSAlcCB0byBOVUxMXG4iLAorICAgICAgICAgICAgICAgICAgICAgICZ0ZWFtLT50LnRfdGFza190ZWFtICkgKTsKKyAgICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfdGFza190ZWFtID0gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tfdGVhbSA9PSBOVUxMICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorI2lmIEtNUF9ORVNURURfSE9UX1RFQU1TCisgICAgICAgICAgICBpZiggX19rbXBfaG90X3RlYW1zX21vZGUgPT0gMCApIHsKKyAgICAgICAgICAgICAgICAvLyBBQzogc2F2ZWQgbnVtYmVyIG9mIHRocmVhZHMgc2hvdWxkIGNvcnJlc3BvbmQgdG8gdGVhbSdzIHZhbHVlIGluIHRoaXMgbW9kZSwKKyAgICAgICAgICAgICAgICAvLyBjYW4gYmUgYmlnZ2VyIGluIG1vZGUgMSwgd2hlbiBob3QgdGVhbSBoYXMgc29tZSB0aHJlYWRzIGluIHJlc2VydmUKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGhvdF90ZWFtc1tsZXZlbF0uaG90X3RlYW1fbnRoID09IHRlYW0tPnQudF9ucHJvYyk7CisgICAgICAgICAgICAgICAgaG90X3RlYW1zW2xldmVsXS5ob3RfdGVhbV9udGggPSBuZXdfbnByb2M7CisjZW5kaWYgLy8gS01QX05FU1RFRF9IT1RfVEVBTVMKKyAgICAgICAgICAgICAgICAvKiByZWxlYXNlIHRoZSBleHRyYSB0aHJlYWRzIHdlIGRvbid0IG5lZWQgYW55IG1vcmUgKi8KKyAgICAgICAgICAgICAgICBmb3IoIGYgPSBuZXdfbnByb2MgIDsgIGYgPCB0ZWFtLT50LnRfbnByb2MgIDsgIGYrKyApIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbS0+dC50X3RocmVhZHNbIGYgXSApOworICAgICAgICAgICAgICAgICAgICBfX2ttcF9mcmVlX3RocmVhZCggdGVhbS0+dC50X3RocmVhZHNbIGYgXSApOworICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfdGhyZWFkc1sgZiBdID0gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisjaWYgS01QX05FU1RFRF9IT1RfVEVBTVMKKyAgICAgICAgICAgIH0gLy8gKF9fa21wX2hvdF90ZWFtc19tb2RlID09IDApCisjZW5kaWYgLy8gS01QX05FU1RFRF9IT1RfVEVBTVMKKyAgICAgICAgICAgIHRlYW0tPnQudF9ucHJvYyA9ICBuZXdfbnByb2M7CisgICAgICAgICAgICAvLyBUT0RPPz8/OiB0ZWFtLT50LnRfbWF4X2FjdGl2ZV9sZXZlbHMgPSBuZXdfbWF4X2FjdGl2ZV9sZXZlbHM7CisgICAgICAgICAgICB0ZWFtLT50LnRfc2NoZWQgPSAgbmV3X2ljdnMtPnNjaGVkOworICAgICAgICAgICAgX19rbXBfcmVpbml0aWFsaXplX3RlYW0oIHRlYW0sIG5ld19pY3ZzLCByb290LT5yLnJfdWJlcl90aHJlYWQtPnRoLnRoX2lkZW50ICk7CisKKyAgICAgICAgICAgIGlmICggX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMgKSB7CisgICAgICAgICAgICAgICAga21wX3Rhc2tfdGVhbV90ICp0YXNrX3RlYW0gPSB0ZWFtLT50LnRfdGFza190ZWFtOworICAgICAgICAgICAgICAgIGlmICggdGFza190ZWFtICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoICEgVENSXzQodGFza190ZWFtLT50dC50dF9mb3VuZF90YXNrcykgKTsKKyAgICAgICAgICAgICAgICAgICAgdGFza190ZWFtLT50dC50dF9ucHJvYyA9IG5ld19ucHJvYzsKKyAgICAgICAgICAgICAgICAgICAgdGFza190ZWFtLT50dC50dF91bmZpbmlzaGVkX3RocmVhZHMgPSBuZXdfbnByb2M7CisgICAgICAgICAgICAgICAgICAgIHRhc2tfdGVhbS0+dHQudHRfcmVmX2N0ID0gbmV3X25wcm9jIC0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIHVwZGF0ZSB0aGUgcmVtYWluaW5nIHRocmVhZHMgKi8KKyAgICAgICAgICAgIGZvcihmID0gMDsgZiA8IG5ld19ucHJvYzsgKytmKSB7CisgICAgICAgICAgICAgICAgdGVhbS0+dC50X3RocmVhZHNbZl0tPnRoLnRoX3RlYW1fbnByb2MgPSBuZXdfbnByb2M7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHJlc3RvcmUgdGhlIGN1cnJlbnQgdGFzayBzdGF0ZSBvZiB0aGUgbWFzdGVyIHRocmVhZDogc2hvdWxkIGJlIHRoZSBpbXBsaWNpdCB0YXNrCisgICAgICAgICAgICBLRl9UUkFDRSggMTAsICgiX19rbXBfYWxsb2NhdGVfdGVhbTogVCMlZCwgdGhpc190aHJlYWQ9JXAgdGVhbT0lcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgMCwgdGVhbS0+dC50X3RocmVhZHNbMF0sIHRlYW0gKSApOworCisgICAgICAgICAgICBfX2ttcF9wdXNoX2N1cnJlbnRfdGFza190b190aHJlYWQoIHRlYW0tPnQudF90aHJlYWRzWyAwIF0sIHRlYW0sIDAgKTsKKworI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAgICAgZm9yICggZiA9IDA7IGYgPCB0ZWFtLT50LnRfbnByb2M7IGYrKyApIHsKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0ZWFtLT50LnRfdGhyZWFkc1tmXSAmJgorICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfdGhyZWFkc1tmXS0+dGgudGhfdGVhbV9ucHJvYyA9PSB0ZWFtLT50LnRfbnByb2MgKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgICAgIHRlYW0tPnQudF9wcm9jX2JpbmQgPSBuZXdfcHJvY19iaW5kOworIyBpZiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgICAgICAgICBfX2ttcF9wYXJ0aXRpb25fcGxhY2VzKCB0ZWFtICk7CisjIGVuZGlmCisjZW5kaWYKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsgLy8gdGVhbS0+dC50X25wcm9jIDwgbmV3X25wcm9jCisjaWYgS01QX09TX0xJTlVYICYmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICAgICAgICAgIGttcF9hZmZpbl9tYXNrX3QgKm9sZF9tYXNrOworICAgICAgICAgICAgaWYgKCBLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpICkgeworICAgICAgICAgICAgICAgIEtNUF9DUFVfQUxMT0Mob2xkX21hc2spOworICAgICAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9hbGxvY2F0ZV90ZWFtOiBpbmNyZWFzaW5nIGhvdCB0ZWFtIHRocmVhZCBjb3VudCB0byAlZFxuIiwgbmV3X25wcm9jICkpOworCisgICAgICAgICAgICB0ZWFtLT50LnRfc2l6ZV9jaGFuZ2VkID0gMTsKKworCisjaWYgS01QX05FU1RFRF9IT1RfVEVBTVMKKyAgICAgICAgICAgIGludCBhdmFpbF90aHJlYWRzID0gaG90X3RlYW1zW2xldmVsXS5ob3RfdGVhbV9udGg7CisgICAgICAgICAgICBpZiggbmV3X25wcm9jIDwgYXZhaWxfdGhyZWFkcyApCisgICAgICAgICAgICAgICAgYXZhaWxfdGhyZWFkcyA9IG5ld19ucHJvYzsKKyAgICAgICAgICAgIGttcF9pbmZvX3QgKipvdGhlcl90aHJlYWRzID0gdGVhbS0+dC50X3RocmVhZHM7CisgICAgICAgICAgICBmb3IgKCBmID0gdGVhbS0+dC50X25wcm9jOyBmIDwgYXZhaWxfdGhyZWFkczsgKytmICkgeworICAgICAgICAgICAgICAgIC8vIEFkanVzdCBiYXJyaWVyIGRhdGEgb2YgcmVzZXJ2ZWQgdGhyZWFkcyAoaWYgYW55KSBvZiB0aGUgdGVhbQorICAgICAgICAgICAgICAgIC8vIE90aGVyIGRhdGEgd2lsbCBiZSBzZXQgaW4gX19rbXBfaW5pdGlhbGl6ZV9pbmZvKCkgYmVsb3cuCisgICAgICAgICAgICAgICAgaW50IGI7CisgICAgICAgICAgICAgICAga21wX2JhbGlnbl90ICogYmFsaWduID0gb3RoZXJfdGhyZWFkc1tmXS0+dGgudGhfYmFyOworICAgICAgICAgICAgICAgIGZvciAoIGIgPSAwOyBiIDwgYnNfbGFzdF9iYXJyaWVyOyArKyBiICkgeworICAgICAgICAgICAgICAgICAgICBiYWxpZ25bYl0uYmIuYl9hcnJpdmVkID0gdGVhbS0+dC50X2JhcltiXS5iX2Fycml2ZWQ7CisgICAgICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoYmFsaWduW2JdLmJiLndhaXRfZmxhZyAhPSBLTVBfQkFSUklFUl9QQVJFTlRfRkxBRyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoIGhvdF90ZWFtc1tsZXZlbF0uaG90X3RlYW1fbnRoID49IG5ld19ucHJvYyApIHsKKyAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIGFsbCBuZWVkZWQgdGhyZWFkcyBpbiByZXNlcnZlLCBubyBuZWVkIHRvIGFsbG9jYXRlIGFueQorICAgICAgICAgICAgICAgIC8vIHRoaXMgb25seSBwb3NzaWJsZSBpbiBtb2RlIDEsIGNhbm5vdCBoYXZlIHJlc2VydmVkIHRocmVhZHMgaW4gbW9kZSAwCisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF9ob3RfdGVhbXNfbW9kZSA9PSAxKTsKKyAgICAgICAgICAgICAgICB0ZWFtLT50LnRfbnByb2MgPSBuZXdfbnByb2M7ICAgICAgICAgICAgICAgICAgICAgLy8ganVzdCBnZXQgcmVzZXJ2ZWQgdGhyZWFkcyBpbnZvbHZlZAorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyB3ZSBtYXkgaGF2ZSBzb21lIHRocmVhZHMgaW4gcmVzZXJ2ZSwgYnV0IG5vdCBlbm91Z2gKKyAgICAgICAgICAgICAgICB0ZWFtLT50LnRfbnByb2MgPSBob3RfdGVhbXNbbGV2ZWxdLmhvdF90ZWFtX250aDsgLy8gZ2V0IHJlc2VydmVkIHRocmVhZHMgaW52b2x2ZWQgaWYgYW55CisgICAgICAgICAgICAgICAgaG90X3RlYW1zW2xldmVsXS5ob3RfdGVhbV9udGggPSBuZXdfbnByb2M7ICAgICAgIC8vIGFkanVzdCBob3QgdGVhbSBtYXggc2l6ZQorI2VuZGlmIC8vIEtNUF9ORVNURURfSE9UX1RFQU1TCisgICAgICAgICAgICBpZih0ZWFtLT50LnRfbWF4X25wcm9jIDwgbmV3X25wcm9jKSB7CisgICAgICAgICAgICAgICAgLyogcmVhbGxvY2F0ZSBsYXJnZXIgYXJyYXlzICovCisgICAgICAgICAgICAgICAgX19rbXBfcmVhbGxvY2F0ZV90ZWFtX2FycmF5cyh0ZWFtLCBuZXdfbnByb2MpOworICAgICAgICAgICAgICAgIF9fa21wX3JlaW5pdGlhbGl6ZV90ZWFtKCB0ZWFtLCBuZXdfaWN2cywgTlVMTCApOworICAgICAgICAgICAgfQorCisjaWYgS01QX09TX0xJTlVYICYmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICAgICAgICAgIC8qIFRlbXBvcmFyaWx5IHNldCBmdWxsIG1hc2sgZm9yIG1hc3RlciB0aHJlYWQgYmVmb3JlCisgICAgICAgICAgICAgICBjcmVhdGlvbiBvZiB3b3JrZXJzLiBUaGUgcmVhc29uIGlzIHRoYXQgd29ya2VycyBpbmhlcml0CisgICAgICAgICAgICAgICB0aGUgYWZmaW5pdHkgZnJvbSBtYXN0ZXIsIHNvIGlmIGEgbG90IG9mIHdvcmtlcnMgYXJlCisgICAgICAgICAgICAgICBjcmVhdGVkIG9uIHRoZSBzaW5nbGUgY29yZSBxdWlja2x5LCB0aGV5IGRvbid0IGdldAorICAgICAgICAgICAgICAgYSBjaGFuY2UgdG8gc2V0IHRoZWlyIG93biBhZmZpbml0eSBmb3IgYSBsb25nIHRpbWUuCisgICAgICAgICAgICAqLworICAgICAgICAgICAgX19rbXBfc2V0X3RocmVhZF9hZmZpbml0eV9tYXNrX2Z1bGxfdG1wKCBvbGRfbWFzayApOworI2VuZGlmCisKKyAgICAgICAgICAgIC8qIGFsbG9jYXRlIG5ldyB0aHJlYWRzIGZvciB0aGUgaG90IHRlYW0gKi8KKyAgICAgICAgICAgIGZvciggZiA9IHRlYW0tPnQudF9ucHJvYyAgOyAgZiA8IG5ld19ucHJvYyAgOyAgZisrICkgeworICAgICAgICAgICAgICAgIGttcF9pbmZvX3QgKiBuZXdfd29ya2VyID0gX19rbXBfYWxsb2NhdGVfdGhyZWFkKCByb290LCB0ZWFtLCBmICk7CisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggbmV3X3dvcmtlciApOworICAgICAgICAgICAgICAgIHRlYW0tPnQudF90aHJlYWRzWyBmIF0gPSBuZXdfd29ya2VyOworICAgICAgICAgICAgICAgIG5ld193b3JrZXItPnRoLnRoX3RlYW1fbnByb2MgPSB0ZWFtLT50LnRfbnByb2M7CisKKyAgICAgICAgICAgICAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfYWxsb2NhdGVfdGVhbTogdGVhbSAlZCBpbml0IFQjJWQgYXJyaXZlZDogam9pbj0ldSwgcGxhaW49JXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9pZCwgX19rbXBfZ3RpZF9mcm9tX3RpZCggZiwgdGVhbSApLCB0ZWFtLT50LnRfaWQsIGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9iYXJbYnNfZm9ya2pvaW5fYmFycmllcl0uYl9hcnJpdmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfYmFyW2JzX3BsYWluX2JhcnJpZXJdLmJfYXJyaXZlZCApICk7CisKKyAgICAgICAgICAgICAgICB7IC8vIEluaXRpYWxpemUgYmFycmllciBkYXRhIGZvciBuZXcgdGhyZWFkcy4KKyAgICAgICAgICAgICAgICAgICAgaW50IGI7CisgICAgICAgICAgICAgICAgICAgIGttcF9iYWxpZ25fdCAqIGJhbGlnbiA9IG5ld193b3JrZXItPnRoLnRoX2JhcjsKKyAgICAgICAgICAgICAgICAgICAgZm9yKCBiID0gMDsgYiA8IGJzX2xhc3RfYmFycmllcjsgKysgYiApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhbGlnblsgYiBdLmJiLmJfYXJyaXZlZCAgICAgICAgPSB0ZWFtLT50LnRfYmFyWyBiIF0uYl9hcnJpdmVkOworICAgICAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChiYWxpZ25bYl0uYmIud2FpdF9mbGFnICE9IEtNUF9CQVJSSUVSX1BBUkVOVF9GTEFHKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworI2lmIEtNUF9PU19MSU5VWCAmJiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgICAgICAgICBpZiAoIEtNUF9BRkZJTklUWV9DQVBBQkxFKCkgKSB7CisgICAgICAgICAgICAgICAgLyogUmVzdG9yZSBpbml0aWFsIG1hc3RlciB0aHJlYWQncyBhZmZpbml0eSBtYXNrICovCisgICAgICAgICAgICAgICAgX19rbXBfc2V0X3N5c3RlbV9hZmZpbml0eSggb2xkX21hc2ssIFRSVUUgKTsKKyAgICAgICAgICAgICAgICBLTVBfQ1BVX0ZSRUUob2xkX21hc2spOworICAgICAgICAgICAgfQorI2VuZGlmCisjaWYgS01QX05FU1RFRF9IT1RfVEVBTVMKKyAgICAgICAgICAgIH0gLy8gZW5kIG9mIGNoZWNrIG9mIHRfbnByb2MgdnMuIG5ld19ucHJvYyB2cy4gaG90X3RlYW1fbnRoCisjZW5kaWYgLy8gS01QX05FU1RFRF9IT1RfVEVBTVMKKyAgICAgICAgICAgIC8qIG1ha2Ugc3VyZSBldmVyeW9uZSBpcyBzeW5jcm9uaXplZCAqLworICAgICAgICAgICAgX19rbXBfaW5pdGlhbGl6ZV90ZWFtKCB0ZWFtLCBuZXdfbnByb2MsIG5ld19pY3ZzLCByb290LT5yLnJfdWJlcl90aHJlYWQtPnRoLnRoX2lkZW50ICk7CisKKyAgICAgICAgICAgIGlmICggX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMgKSB7CisgICAgICAgICAgICAgICAga21wX3Rhc2tfdGVhbV90ICp0YXNrX3RlYW0gPSB0ZWFtLT50LnRfdGFza190ZWFtOworICAgICAgICAgICAgICAgIGlmICggdGFza190ZWFtICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoICEgVENSXzQodGFza190ZWFtLT50dC50dF9mb3VuZF90YXNrcykgKTsKKyAgICAgICAgICAgICAgICAgICAgdGFza190ZWFtLT50dC50dF9ucHJvYyA9IG5ld19ucHJvYzsKKyAgICAgICAgICAgICAgICAgICAgdGFza190ZWFtLT50dC50dF91bmZpbmlzaGVkX3RocmVhZHMgPSBuZXdfbnByb2M7CisgICAgICAgICAgICAgICAgICAgIHRhc2tfdGVhbS0+dHQudHRfcmVmX2N0ID0gbmV3X25wcm9jIC0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIHJlaW5pdGlhbGl6ZSB0aGUgb2xkIHRocmVhZHMgKi8KKyAgICAgICAgICAgIGZvciggZiA9IDAgIDsgIGYgPCB0ZWFtLT50LnRfbnByb2MgIDsgIGYrKyApCisgICAgICAgICAgICAgICAgX19rbXBfaW5pdGlhbGl6ZV9pbmZvKCB0ZWFtLT50LnRfdGhyZWFkc1sgZiBdLCB0ZWFtLCBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RpZCggZiwgdGVhbSApICk7CisjaWZkZWYgS01QX0RFQlVHCisgICAgICAgICAgICBmb3IgKCBmID0gMDsgZiA8IHRlYW0tPnQudF9ucHJvYzsgKysgZiApIHsKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0ZWFtLT50LnRfdGhyZWFkc1tmXSAmJgorICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfdGhyZWFkc1tmXS0+dGgudGhfdGVhbV9ucHJvYyA9PSB0ZWFtLT50LnRfbnByb2MgKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgICAgIHRlYW0tPnQudF9wcm9jX2JpbmQgPSBuZXdfcHJvY19iaW5kOworIyBpZiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgICAgICAgICBfX2ttcF9wYXJ0aXRpb25fcGxhY2VzKCB0ZWFtICk7CisjIGVuZGlmCisjZW5kaWYKKyAgICAgICAgfSAvLyBDaGVjayBjaGFuZ2VzIGluIG51bWJlciBvZiB0aHJlYWRzCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICBrbXBfaW5mb190ICptYXN0ZXIgPSB0ZWFtLT50LnRfdGhyZWFkc1swXTsKKyAgICAgICAgaWYoIG1hc3Rlci0+dGgudGhfdGVhbXNfbWljcm90YXNrICkgeworICAgICAgICAgICAgZm9yKCBmID0gMTsgZiA8IG5ld19ucHJvYzsgKytmICkgeworICAgICAgICAgICAgICAgIC8vIHByb3BhZ2F0ZSB0ZWFtcyBjb25zdHJ1Y3Qgc3BlY2lmaWMgaW5mbyB0byB3b3JrZXJzCisgICAgICAgICAgICAgICAga21wX2luZm9fdCAqdGhyID0gdGVhbS0+dC50X3RocmVhZHNbZl07CisgICAgICAgICAgICAgICAgdGhyLT50aC50aF90ZWFtc19taWNyb3Rhc2sgPSBtYXN0ZXItPnRoLnRoX3RlYW1zX21pY3JvdGFzazsKKyAgICAgICAgICAgICAgICB0aHItPnRoLnRoX3RlYW1zX2xldmVsICAgICA9IG1hc3Rlci0+dGgudGhfdGVhbXNfbGV2ZWw7CisgICAgICAgICAgICAgICAgdGhyLT50aC50aF90ZWFtc19zaXplICAgICAgPSBtYXN0ZXItPnRoLnRoX3RlYW1zX3NpemU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworI2lmIEtNUF9ORVNURURfSE9UX1RFQU1TCisgICAgICAgIGlmKCBsZXZlbCApIHsKKyAgICAgICAgICAgIC8vIFN5bmMgdGFzayAoVE9ETzogYW5kIGJhcnJpZXI/KSBzdGF0ZSBmb3IgbmVzdGVkIGhvdCB0ZWFtcywgbm90IG5lZWRlZCBmb3Igb3V0ZXJtb3N0IGhvdCB0ZWFtLgorICAgICAgICAgICAgZm9yKCBmID0gMTsgZiA8IG5ld19ucHJvYzsgKytmICkgeworICAgICAgICAgICAgICAgIGttcF9pbmZvX3QgKnRociA9IHRlYW0tPnQudF90aHJlYWRzW2ZdOworICAgICAgICAgICAgICAgIHRoci0+dGgudGhfdGFza19zdGF0ZSA9IG1hc3Rlci0+dGgudGhfdGFza19zdGF0ZTsKKyAgICAgICAgICAgICAgICBpbnQgYjsKKyAgICAgICAgICAgICAgICBrbXBfYmFsaWduX3QgKiBiYWxpZ24gPSB0aHItPnRoLnRoX2JhcjsKKyAgICAgICAgICAgICAgICBmb3IoIGIgPSAwOyBiIDwgYnNfbGFzdF9iYXJyaWVyOyArKyBiICkgeworICAgICAgICAgICAgICAgICAgICBiYWxpZ25bIGIgXS5iYi5iX2Fycml2ZWQgICAgICAgID0gdGVhbS0+dC50X2JhclsgYiBdLmJfYXJyaXZlZDsKKyAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChiYWxpZ25bYl0uYmIud2FpdF9mbGFnICE9IEtNUF9CQVJSSUVSX1BBUkVOVF9GTEFHKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZiAvLyBLTVBfTkVTVEVEX0hPVF9URUFNUworCisgICAgICAgIC8qIHJlYWxsb2NhdGUgc3BhY2UgZm9yIGFyZ3VtZW50cyBpZiBuZWNlc3NhcnkgKi8KKyAgICAgICAgX19rbXBfYWxsb2NfYXJndl9lbnRyaWVzKCBhcmdjLCB0ZWFtLCBUUlVFICk7CisgICAgICAgIHRlYW0tPnQudF9hcmdjICAgICA9IGFyZ2M7CisgICAgICAgIC8vCisgICAgICAgIC8vIFRoZSBob3QgdGVhbSByZS11c2VzIHRoZSBwcmV2aW91cyB0YXNrIHRlYW0sCisgICAgICAgIC8vIGlmIHVudG91Y2hlZCBkdXJpbmcgdGhlIHByZXZpb3VzIHJlbGVhc2UtPmdhdGhlciBwaGFzZS4KKyAgICAgICAgLy8KKworICAgICAgICBLRl9UUkFDRSggMTAsICggIiBob3RfdGVhbSA9ICVwXG4iLCB0ZWFtICkgKTsKKworI2lmIEtNUF9ERUJVRworICAgICAgICBpZiAoIF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjICkgeworICAgICAgICAgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2FsbG9jYXRlX3RlYW06IGhvdCB0ZWFtIHRhc2tfdGVhbSA9ICVwIGFmdGVyIHJlaW5pdFxuIiwKKyAgICAgICAgICAgICAgdGVhbS0+dC50X3Rhc2tfdGVhbSApKTsKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgS01QX01CKCk7CisKKyAgICAgICAgcmV0dXJuIHRlYW07CisgICAgfQorCisgICAgLyogbmV4dCwgbGV0J3MgdHJ5IHRvIHRha2Ugb25lIGZyb20gdGhlIHRlYW0gcG9vbCAqLworICAgIEtNUF9NQigpOworICAgIGZvciggdGVhbSA9IChrbXBfdGVhbV90KikgX19rbXBfdGVhbV9wb29sIDsgKHRlYW0pIDsgKQorICAgIHsKKyAgICAgICAgLyogVE9ETzogY29uc2lkZXIgcmVzaXppbmcgdW5kZXJzaXplZCB0ZWFtcyBpbnN0ZWFkIG9mIHJlYXBpbmcgdGhlbSwgbm93IHRoYXQgd2UgaGF2ZSBhIHJlc2l6aW5nIG1lY2hhbmlzbSAqLworICAgICAgICBpZiAoIHRlYW0tPnQudF9tYXhfbnByb2MgPj0gbWF4X25wcm9jICkgeworICAgICAgICAgICAgLyogdGFrZSB0aGlzIHRlYW0gZnJvbSB0aGUgdGVhbSBwb29sICovCisgICAgICAgICAgICBfX2ttcF90ZWFtX3Bvb2wgPSB0ZWFtLT50LnRfbmV4dF9wb29sOworCisgICAgICAgICAgICAvKiBzZXR1cCB0aGUgdGVhbSBmb3IgZnJlc2ggdXNlICovCisgICAgICAgICAgICBfX2ttcF9pbml0aWFsaXplX3RlYW0oIHRlYW0sIG5ld19ucHJvYywgbmV3X2ljdnMsIE5VTEwgKTsKKworICAgICAgICAgICAgS0FfVFJBQ0UoIDIwLCAoICJfX2ttcF9hbGxvY2F0ZV90ZWFtOiBzZXR0aW5nIHRhc2tfdGVhbSAlcCB0byBOVUxMXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZWFtLT50LnRfdGFza190ZWFtICkgKTsKKyAgICAgICAgICAgIHRlYW0tPnQudF90YXNrX3RlYW0gPSBOVUxMOworCisgICAgICAgICAgICAvKiByZWFsbG9jYXRlIHNwYWNlIGZvciBhcmd1bWVudHMgaWYgbmVjZXNzYXJ5ICovCisgICAgICAgICAgICBfX2ttcF9hbGxvY19hcmd2X2VudHJpZXMoIGFyZ2MsIHRlYW0sIFRSVUUgKTsKKyAgICAgICAgICAgIHRlYW0tPnQudF9hcmdjICAgICA9IGFyZ2M7CisKKyAgICAgICAgICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9hbGxvY2F0ZV90ZWFtOiB0ZWFtICVkIGluaXQgYXJyaXZlZDogam9pbj0ldSwgcGxhaW49JXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X2lkLCBLTVBfSU5JVF9CQVJSSUVSX1NUQVRFLCBLTVBfSU5JVF9CQVJSSUVSX1NUQVRFICkpOworICAgICAgICAgICAgeyAvLyBJbml0aWFsaXplIGJhcnJpZXIgZGF0YS4KKyAgICAgICAgICAgICAgICBpbnQgYjsKKyAgICAgICAgICAgICAgICBmb3IgKCBiID0gMDsgYiA8IGJzX2xhc3RfYmFycmllcjsgKysgYikgeworICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfYmFyWyBiIF0uYl9hcnJpdmVkICAgICAgICA9IEtNUF9JTklUX0JBUlJJRVJfU1RBVEU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgICAgIHRlYW0tPnQudF9wcm9jX2JpbmQgPSBuZXdfcHJvY19iaW5kOworI2VuZGlmCisKKyAgICAgICAgICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9hbGxvY2F0ZV90ZWFtOiB1c2luZyB0ZWFtIGZyb20gcG9vbCAlZC5cbiIsIHRlYW0tPnQudF9pZCApKTsKKyAgICAgICAgICAgIEtNUF9NQigpOworCisgICAgICAgICAgICByZXR1cm4gdGVhbTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHJlYXAgdGVhbSBpZiBpdCBpcyB0b28gc21hbGwsIHRoZW4gbG9vcCBiYWNrIGFuZCBjaGVjayB0aGUgbmV4dCBvbmUgKi8KKyAgICAgICAgLyogbm90IHN1cmUgaWYgdGhpcyBpcyB3aXNlLCBidXQsIHdpbGwgYmUgcmVkb25lIGR1cmluZyB0aGUgaG90LXRlYW1zIHJld3JpdGUuICovCisgICAgICAgIC8qIFRPRE86IFVzZSB0ZWNobmlxdWUgdG8gZmluZCB0aGUgcmlnaHQgc2l6ZSBob3QtdGVhbSwgZG9uJ3QgcmVhcCB0aGVtICovCisgICAgICAgIHRlYW0gPSAgX19rbXBfcmVhcF90ZWFtKCB0ZWFtICk7CisgICAgICAgIF9fa21wX3RlYW1fcG9vbCA9IHRlYW07CisgICAgfQorCisgICAgLyogbm90aGluZyBhdmFpbGFibGUgaW4gdGhlIHBvb2wsIG5vIG1hdHRlciwgbWFrZSBhIG5ldyB0ZWFtISAqLworICAgIEtNUF9NQigpOworICAgIHRlYW0gPSAoa21wX3RlYW1fdCopIF9fa21wX2FsbG9jYXRlKCBzaXplb2YoIGttcF90ZWFtX3QgKSApOworCisgICAgLyogYW5kIHNldCBpdCB1cCAqLworICAgIHRlYW0tPnQudF9tYXhfbnByb2MgICA9IG1heF9ucHJvYzsKKyAgICAvKiBOT1RFIHdlbGwsIGZvciBzb21lIHJlYXNvbiBhbGxvY2F0aW5nIG9uZSBiaWcgYnVmZmVyIGFuZCBkaXZpZGluZyBpdAorICAgICAqIHVwIHNlZW1zIHRvIHJlYWxseSBodXJ0IHBlcmZvcm1hbmNlIGEgbG90IG9uIHRoZSBQNCwgc28sIGxldCdzIG5vdCB1c2UKKyAgICAgKiB0aGlzLi4uICovCisgICAgX19rbXBfYWxsb2NhdGVfdGVhbV9hcnJheXMoIHRlYW0sIG1heF9ucHJvYyApOworCisgICAgS0FfVFJBQ0UoIDIwLCAoICJfX2ttcF9hbGxvY2F0ZV90ZWFtOiBtYWtpbmcgYSBuZXcgdGVhbVxuIiApICk7CisgICAgX19rbXBfaW5pdGlhbGl6ZV90ZWFtKCB0ZWFtLCBuZXdfbnByb2MsIG5ld19pY3ZzLCBOVUxMICk7CisKKyAgICBLQV9UUkFDRSggMjAsICggIl9fa21wX2FsbG9jYXRlX3RlYW06IHNldHRpbmcgdGFza190ZWFtICVwIHRvIE5VTExcbiIsCisgICAgICAgICAgICAgICAgICAgICZ0ZWFtLT50LnRfdGFza190ZWFtICkgKTsKKyAgICB0ZWFtLT50LnRfdGFza190ZWFtID0gTlVMTDsgICAgLy8gdG8gYmUgcmVtb3ZlZCwgYXMgX19rbXBfYWxsb2NhdGUgemVyb2VzIG1lbW9yeSwgbm8gbmVlZCB0byBkdXBsaWNhdGUKKworICAgIGlmICggX19rbXBfc3RvcmFnZV9tYXAgKSB7CisgICAgICAgIF9fa21wX3ByaW50X3RlYW1fc3RvcmFnZV9tYXAoICJ0ZWFtIiwgdGVhbSwgdGVhbS0+dC50X2lkLCBuZXdfbnByb2MgKTsKKyAgICB9CisKKyAgICAvKiBhbGxvY2F0ZSBzcGFjZSBmb3IgYXJndW1lbnRzICovCisgICAgX19rbXBfYWxsb2NfYXJndl9lbnRyaWVzKCBhcmdjLCB0ZWFtLCBGQUxTRSApOworICAgIHRlYW0tPnQudF9hcmdjICAgICAgICA9IGFyZ2M7CisKKyAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfYWxsb2NhdGVfdGVhbTogdGVhbSAlZCBpbml0IGFycml2ZWQ6IGpvaW49JXUsIHBsYWluPSV1XG4iLAorICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfaWQsIEtNUF9JTklUX0JBUlJJRVJfU1RBVEUsIEtNUF9JTklUX0JBUlJJRVJfU1RBVEUgKSk7CisgICAgeyAvLyBJbml0aWFsaXplIGJhcnJpZXIgZGF0YS4KKyAgICAgICAgaW50IGI7CisgICAgICAgIGZvciAoIGIgPSAwOyBiIDwgYnNfbGFzdF9iYXJyaWVyOyArKyBiICkgeworICAgICAgICAgICAgdGVhbS0+dC50X2JhclsgYiBdLmJfYXJyaXZlZCAgICAgICAgPSBLTVBfSU5JVF9CQVJSSUVSX1NUQVRFOworICAgICAgICB9CisgICAgfQorCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICB0ZWFtLT50LnRfcHJvY19iaW5kID0gbmV3X3Byb2NfYmluZDsKKyNlbmRpZgorCisgICAgS01QX01CKCk7CisKKyAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfYWxsb2NhdGVfdGVhbTogZG9uZSBjcmVhdGluZyBhIG5ldyB0ZWFtICVkLlxuIiwgdGVhbS0+dC50X2lkICkpOworCisgICAgcmV0dXJuIHRlYW07Cit9CisKKy8qIFRPRE8gaW1wbGVtZW50IGhvdC10ZWFtcyBhdCBhbGwgbGV2ZWxzICovCisvKiBUT0RPIGltcGxlbWVudCBsYXp5IHRocmVhZCByZWxlYXNlIG9uIGRlbWFuZCAoZGlzYmFuZCByZXF1ZXN0KSAqLworCisvKiBmcmVlIHRoZSB0ZWFtLiAgcmV0dXJuIGl0IHRvIHRoZSB0ZWFtIHBvb2wuICByZWxlYXNlIGFsbCB0aGUgdGhyZWFkcworICogYXNzb2NpYXRlZCB3aXRoIGl0ICovCit2b2lkCitfX2ttcF9mcmVlX3RlYW0oIGttcF9yb290X3QgKnJvb3QsIGttcF90ZWFtX3QgKnRlYW0gIFVTRV9ORVNURURfSE9UX0FSRyhrbXBfaW5mb190ICptYXN0ZXIpICkKK3sKKyAgICBpbnQgZjsKKyAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfZnJlZV90ZWFtOiBUIyVkIGZyZWVpbmcgdGVhbSAlZFxuIiwgX19rbXBfZ2V0X2d0aWQoKSwgdGVhbS0+dC50X2lkICkpOworCisgICAgLyogdmVyaWZ5IHN0YXRlICovCisgICAgS01QX0RFQlVHX0FTU0VSVCggcm9vdCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRlYW0gKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0ZWFtLT50LnRfbnByb2MgPD0gdGVhbS0+dC50X21heF9ucHJvYyApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRlYW0tPnQudF90aHJlYWRzICk7CisKKyAgICBpbnQgdXNlX2hvdF90ZWFtID0gdGVhbSA9PSByb290LT5yLnJfaG90X3RlYW07CisjaWYgS01QX05FU1RFRF9IT1RfVEVBTVMKKyAgICBpbnQgbGV2ZWw7CisgICAga21wX2hvdF90ZWFtX3B0cl90ICpob3RfdGVhbXM7CisgICAgaWYoIG1hc3RlciApIHsKKyAgICAgICAgbGV2ZWwgPSB0ZWFtLT50LnRfYWN0aXZlX2xldmVsIC0gMTsKKyAgICAgICAgaWYoIG1hc3Rlci0+dGgudGhfdGVhbXNfbWljcm90YXNrICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiB0ZWFtcyBjb25zdHJ1Y3Q/CisgICAgICAgICAgICBpZiggbWFzdGVyLT50aC50aF90ZWFtc19zaXplLm50ZWFtcyA+IDEgKSB7CisgICAgICAgICAgICAgICArK2xldmVsOyAvLyBsZXZlbCB3YXMgbm90IGluY3JlYXNlZCBpbiB0ZWFtcyBjb25zdHJ1Y3QgZm9yIHRlYW1fb2ZfbWFzdGVycworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoIHRlYW0tPnQudF9wa2ZuICE9IChtaWNyb3Rhc2tfdClfX2ttcF90ZWFtc19tYXN0ZXIgJiYKKyAgICAgICAgICAgICAgICBtYXN0ZXItPnRoLnRoX3RlYW1zX2xldmVsID09IHRlYW0tPnQudF9sZXZlbCApIHsKKyAgICAgICAgICAgICAgICArK2xldmVsOyAvLyBsZXZlbCB3YXMgbm90IGluY3JlYXNlZCBpbiB0ZWFtcyBjb25zdHJ1Y3QgZm9yIHRlYW1fb2Zfd29ya2VycyBiZWZvcmUgdGhlIHBhcmFsbGVsCisgICAgICAgICAgICB9ICAgICAgICAgICAgLy8gdGVhbS0+dC50X2xldmVsIHdpbGwgYmUgaW5jcmVhc2VkIGluc2lkZSBwYXJhbGxlbAorICAgICAgICB9CisgICAgICAgIGhvdF90ZWFtcyA9IG1hc3Rlci0+dGgudGhfaG90X3RlYW1zOworICAgICAgICBpZiggbGV2ZWwgPCBfX2ttcF9ob3RfdGVhbXNfbWF4X2xldmVsICkgeworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbSA9PSBob3RfdGVhbXNbbGV2ZWxdLmhvdF90ZWFtICk7CisgICAgICAgICAgICB1c2VfaG90X3RlYW0gPSAxOworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8vIEtNUF9ORVNURURfSE9UX1RFQU1TCisKKyAgICAvKiB0ZWFtIGlzIGRvbmUgd29ya2luZyAqLworICAgIFRDV19TWU5DX1BUUih0ZWFtLT50LnRfcGtmbiwgTlVMTCk7IC8vIEltcG9ydGFudCBmb3IgRGVidWdnaW5nIFN1cHBvcnQgTGlicmFyeS4KKyAgICB0ZWFtLT50LnRfY29weWluX2NvdW50ZXIgPSAwOyAvLyBpbml0IGNvdW50ZXIgZm9yIHBvc3NpYmxlIHJldXNlCisgICAgLy8gRG8gbm90IHJlc2V0IHBvaW50ZXIgdG8gcGFyZW50IHRlYW0gdG8gTlVMTCBmb3IgaG90IHRlYW1zLgorCisgICAgLyogaWYgd2UgYXJlIG5vbi1ob3QgdGVhbSwgcmVsZWFzZSBvdXIgdGhyZWFkcyAqLworICAgIGlmKCAhIHVzZV9ob3RfdGVhbSApIHsKKworICAgICAgICBpZiAoIF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjICkgeworICAgICAgICAgICAga21wX3Rhc2tfdGVhbV90ICp0YXNrX3RlYW0gPSB0ZWFtLT50LnRfdGFza190ZWFtOworICAgICAgICAgICAgaWYgKCB0YXNrX3RlYW0gIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIFNpZ25hbCB0aGUgd29ya2VyIHRocmVhZHMgdG8gc3RvcCBsb29raW5nIGZvciB0YXNrcyB3aGlsZQorICAgICAgICAgICAgICAgIC8vIHNwaW4gd2FpdGluZy4gIFRoZSB0YXNrIHRlYW1zIGFyZSByZWZlcmVuY2UgY291bnRlZCBhbmQgd2lsbAorICAgICAgICAgICAgICAgIC8vIGJlIGRlYWxsb2NhdGVkIGJ5IHRoZSBsYXN0IHdvcmtlciB0aHJlYWQgdmlhIHRoZSB0aHJlYWQncworICAgICAgICAgICAgICAgIC8vIHBvaW50ZXIgdG8gdGhlIHRhc2sgdGVhbS4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIEtBX1RSQUNFKCAyMCwgKCAiX19rbXBfZnJlZV90ZWFtOiBkZWFjdGl2YXRpbmcgdGFza190ZWFtICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrX3RlYW0gKSApOworICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHRlYW0tPnQudF9ucHJvYyA+IDEgKTsKKyAgICAgICAgICAgICAgICBUQ1dfU1lOQ180KCB0YXNrX3RlYW0tPnR0LnR0X2FjdGl2ZSwgRkFMU0UgKTsKKyAgICAgICAgICAgICAgICBLTVBfTUIoKTsKKyAgICAgICAgICAgICAgICB0ZWFtLT50LnRfdGFza190ZWFtID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlc2V0IHBvaW50ZXIgdG8gcGFyZW50IHRlYW0gb25seSBmb3Igbm9uLWhvdCB0ZWFtcy4KKyAgICAgICAgdGVhbS0+dC50X3BhcmVudCA9IE5VTEw7CisKKworICAgICAgICAvKiBmcmVlIHRoZSB3b3JrZXIgdGhyZWFkcyAqLworICAgICAgICBmb3IgKCBmID0gMTsgZiA8IHRlYW0tPnQudF9ucHJvYzsgKysgZiApIHsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHRlYW0tPnQudF90aHJlYWRzWyBmIF0gKTsKKyAgICAgICAgICAgIF9fa21wX2ZyZWVfdGhyZWFkKCB0ZWFtLT50LnRfdGhyZWFkc1sgZiBdICk7CisgICAgICAgICAgICB0ZWFtLT50LnRfdGhyZWFkc1sgZiBdID0gTlVMTDsKKyAgICAgICAgfQorCisKKyAgICAgICAgLyogcHV0IHRoZSB0ZWFtIGJhY2sgaW4gdGhlIHRlYW0gcG9vbCAqLworICAgICAgICAvKiBUT0RPIGxpbWl0IHNpemUgb2YgdGVhbSBwb29sLCBjYWxsIHJlYXBfdGVhbSBpZiBwb29sIHRvbyBsYXJnZSAqLworICAgICAgICB0ZWFtLT50LnRfbmV4dF9wb29sICA9IChrbXBfdGVhbV90KikgX19rbXBfdGVhbV9wb29sOworICAgICAgICBfX2ttcF90ZWFtX3Bvb2wgICAgICAgID0gKHZvbGF0aWxlIGttcF90ZWFtX3QqKSB0ZWFtOworICAgIH0KKworICAgIEtNUF9NQigpOworfQorCisKKy8qIHJlYXAgdGhlIHRlYW0uICBkZXN0cm95IGl0LCByZWNsYWltIGFsbCBpdHMgcmVzb3VyY2VzIGFuZCBmcmVlIGl0cyBtZW1vcnkgKi8KK2ttcF90ZWFtX3QgKgorX19rbXBfcmVhcF90ZWFtKCBrbXBfdGVhbV90ICp0ZWFtICkKK3sKKyAgICBrbXBfdGVhbV90ICpuZXh0X3Bvb2wgPSB0ZWFtLT50LnRfbmV4dF9wb29sOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbSApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRlYW0tPnQudF9kaXNwYXRjaCAgICApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRlYW0tPnQudF9kaXNwX2J1ZmZlciApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRlYW0tPnQudF90aHJlYWRzICAgICApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRlYW0tPnQudF9hcmd2ICAgICAgICApOworCisgICAgLyogVE9ETyBjbGVhbiB0aGUgdGhyZWFkcyB0aGF0IGFyZSBhIHBhcnQgb2YgdGhpcz8gKi8KKworICAgIC8qIGZyZWUgc3R1ZmYgKi8KKworICAgIF9fa21wX2ZyZWVfdGVhbV9hcnJheXMoIHRlYW0gKTsKKyAgICBpZiAoIHRlYW0tPnQudF9hcmd2ICE9ICZ0ZWFtLT50LnRfaW5saW5lX2FyZ3ZbMF0gKQorICAgICAgICBfX2ttcF9mcmVlKCAodm9pZCopIHRlYW0tPnQudF9hcmd2ICk7CisgICAgX19rbXBfZnJlZSggdGVhbSApOworCisgICAgS01QX01CKCk7CisgICAgcmV0dXJuIG5leHRfcG9vbDsKK30KKworLy8KKy8vIEZyZWUgdGhlIHRocmVhZC4gIERvbid0IHJlYXAgaXQsIGp1c3QgcGxhY2UgaXQgb24gdGhlIHBvb2wgb2YgYXZhaWxhYmxlCisvLyB0aHJlYWRzLgorLy8KKy8vIENoYW5nZXMgZm9yIFF1YWQgaXNzdWUgNTI3ODQ1OiBXZSBuZWVkIGEgcHJlZGljdGFibGUgT01QIHRpZCA8LT4gZ3RpZAorLy8gYmluZGluZyBmb3IgdGhlIGFmZmluaXR5IG1lY2hhbmlzbSB0byBiZSB1c2VmdWwuCisvLworLy8gTm93LCB3ZSBhbHdheXMga2VlcCB0aGUgZnJlZSBsaXN0IChfX2ttcF90aHJlYWRfcG9vbCkgc29ydGVkIGJ5IGd0aWQuCisvLyBIb3dldmVyLCB3ZSB3YW50IHRvIGF2b2lkIGEgcG90ZW50aWFsIHBlcmZvcm1hbmNlIHByb2JsZW0gYnkgYWx3YXlzCisvLyBzY2FubmluZyB0aHJvdWdoIHRoZSBsaXN0IHRvIGZpbmQgdGhlIGNvcnJlY3QgcG9pbnQgYXQgd2hpY2ggdG8gaW5zZXJ0CisvLyB0aGUgdGhyZWFkIChwb3RlbnRpYWwgTioqMiBiZWhhdmlvcikuICBUbyBkbyB0aGlzIHdlIGtlZXAgdHJhY2sgb2YgdGhlCisvLyBsYXN0IHBsYWNlIGEgdGhyZWFkIHN0cnVjdCB3YXMgaW5zZXJ0ZWQgKF9fa21wX3RocmVhZF9wb29sX2luc2VydF9wdCkuCisvLyBXaXRoIHNpbmdsZS1sZXZlbCBwYXJhbGxlbGlzbSwgdGhyZWFkcyB3aWxsIGFsd2F5cyBiZSBhZGRlZCB0byB0aGUgdGFpbAorLy8gb2YgdGhlIGxpc3QsIGtlcHQgdHJhY2sgb2YgYnkgX19rbXBfdGhyZWFkX3Bvb2xfaW5zZXJ0X3B0LiAgV2l0aCBuZXN0ZWQKKy8vIHBhcmFsbGVsaXNtLCBhbGwgYmV0cyBhcmUgb2ZmIGFuZCB3ZSBtYXkgbmVlZCB0byBzY2FuIHRocm91Z2ggdGhlIGVudGlyZQorLy8gZnJlZSBsaXN0LgorLy8KKy8vIFRoaXMgY2hhbmdlIGFsc28gaGFzIGEgcG90ZW50aWFsbHkgbGFyZ2UgcGVyZm9ybWFuY2UgYmVuZWZpdCwgZm9yIHNvbWUKKy8vIGFwcGxpY2F0aW9ucy4gIFByZXZpb3VzbHksIGFzIHRocmVhZHMgd2VyZSBmcmVlZCBmcm9tIHRoZSBob3QgdGVhbSwgdGhleQorLy8gd291bGQgYmUgcGxhY2VkIGJhY2sgb24gdGhlIGZyZWUgbGlzdCBpbiBpbnZlcnNlIG9yZGVyLiAgSWYgdGhlIGhvdCB0ZWFtCisvLyBncmV3IGJhY2sgdG8gaXQncyBvcmlnaW5hbCBzaXplLCB0aGVuIHRoZSBmcmVlZCB0aHJlYWQgd291bGQgYmUgcGxhY2VkCisvLyBiYWNrIG9uIHRoZSBob3QgdGVhbSBpbiByZXZlcnNlIG9yZGVyLiAgVGhpcyBjb3VsZCBjYXVzZSBiYWQgY2FjaGUKKy8vIGxvY2FsaXR5IHByb2JsZW1zIG9uIHByb2dyYW1zIHdoZXJlIHRoZSBzaXplIG9mIHRoZSBob3QgdGVhbSByZWd1bGFybHkKKy8vIGdyZXcgYW5kIHNocnVuay4KKy8vCisvLyBOb3csIGZvciBzaW5nbGUtbGV2ZWwgcGFyYWxsZWxpc20sIHRoZSBPTVAgdGlkIGlzIGFsd2F5ID09IGd0aWQuCisvLwordm9pZAorX19rbXBfZnJlZV90aHJlYWQoIGttcF9pbmZvX3QgKnRoaXNfdGggKQoreworICAgIGludCBndGlkOworICAgIGttcF9pbmZvX3QgKipzY2FuOworCisgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2ZyZWVfdGhyZWFkOiBUIyVkIHB1dHRpbmcgVCMlZCBiYWNrIG9uIGZyZWUgcG9vbC5cbiIsCisgICAgICAgICAgICAgICAgX19rbXBfZ2V0X2d0aWQoKSwgdGhpc190aC0+dGgudGhfaW5mby5kcy5kc19ndGlkICkpOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggdGhpc190aCApOworCisgICAgLy8gV2hlbiBtb3ZpbmcgdGhyZWFkIHRvIHBvb2wsIHN3aXRjaCB0aHJlYWQgdG8gd2FpdCBvbiBvd24gYl9nbyBmbGFnLCBhbmQgdW5pbml0aWFsaXplZCAoTlVMTCB0ZWFtKS4KKyAgICBpbnQgYjsKKyAgICBrbXBfYmFsaWduX3QgKmJhbGlnbiA9IHRoaXNfdGgtPnRoLnRoX2JhcjsKKyAgICBmb3IgKGI9MDsgYjxic19sYXN0X2JhcnJpZXI7ICsrYikgeworICAgICAgICBpZiAoYmFsaWduW2JdLmJiLndhaXRfZmxhZyA9PSBLTVBfQkFSUklFUl9QQVJFTlRfRkxBRykKKyAgICAgICAgICAgIGJhbGlnbltiXS5iYi53YWl0X2ZsYWcgPSBLTVBfQkFSUklFUl9TV0lUQ0hfVE9fT1dOX0ZMQUc7CisgICAgICAgIGJhbGlnbltiXS5iYi50ZWFtID0gTlVMTDsKKyAgICB9CisKKworICAgIC8qIHB1dCB0aHJlYWQgYmFjayBvbiB0aGUgZnJlZSBwb29sICovCisgICAgVENXX1BUUih0aGlzX3RoLT50aC50aF90ZWFtLCBOVUxMKTsKKyAgICBUQ1dfUFRSKHRoaXNfdGgtPnRoLnRoX3Jvb3QsIE5VTEwpOworICAgIFRDV19QVFIodGhpc190aC0+dGgudGhfZGlzcGF0Y2gsIE5VTEwpOyAgICAgICAgICAgICAgIC8qIE5PVCBORUVERUQgKi8KKworICAgIC8vCisgICAgLy8gSWYgdGhlIF9fa21wX3RocmVhZF9wb29sX2luc2VydF9wdCBpcyBhbHJlYWR5IHBhc3QgdGhlIG5ldyBpbnNlcnQKKyAgICAvLyBwb2ludCwgdGhlbiB3ZSBuZWVkIHRvIHJlLXNjYW4gdGhlIGVudGlyZSBsaXN0LgorICAgIC8vCisgICAgZ3RpZCA9IHRoaXNfdGgtPnRoLnRoX2luZm8uZHMuZHNfZ3RpZDsKKyAgICBpZiAoIF9fa21wX3RocmVhZF9wb29sX2luc2VydF9wdCAhPSBOVUxMICkgeworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF90aHJlYWRfcG9vbCAhPSBOVUxMICk7CisgICAgICAgIGlmICggX19rbXBfdGhyZWFkX3Bvb2xfaW5zZXJ0X3B0LT50aC50aF9pbmZvLmRzLmRzX2d0aWQgPiBndGlkICkgeworICAgICAgICAgICAgIF9fa21wX3RocmVhZF9wb29sX2luc2VydF9wdCA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLworICAgIC8vIFNjYW4gZG93biB0aGUgbGlzdCB0byBmaW5kIHRoZSBwbGFjZSB0byBpbnNlcnQgdGhlIHRocmVhZC4KKyAgICAvLyBzY2FuIGlzIHRoZSBhZGRyZXNzIG9mIGEgbGluayBpbiB0aGUgbGlzdCwgcG9zc2libHkgdGhlIGFkZHJlc3Mgb2YKKyAgICAvLyBfX2ttcF90aHJlYWRfcG9vbCBpdHNlbGYuCisgICAgLy8KKyAgICAvLyBJbiB0aGUgYWJzZW5jZSBvZiBuZXN0ZWQgcGFyYWxsaXNtLCB0aGUgZm9yIGxvb3Agd2lsbCBoYXZlIDAgaXRlcmF0aW9ucy4KKyAgICAvLworICAgIGlmICggX19rbXBfdGhyZWFkX3Bvb2xfaW5zZXJ0X3B0ICE9IE5VTEwgKSB7CisgICAgICAgIHNjYW4gPSAmKCBfX2ttcF90aHJlYWRfcG9vbF9pbnNlcnRfcHQtPnRoLnRoX25leHRfcG9vbCApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgc2NhbiA9IChrbXBfaW5mb190ICoqKSZfX2ttcF90aHJlYWRfcG9vbDsKKyAgICB9CisgICAgZm9yICg7ICggKnNjYW4gIT0gTlVMTCApICYmICggKCpzY2FuKS0+dGgudGhfaW5mby5kcy5kc19ndGlkIDwgZ3RpZCApOworICAgICAgc2NhbiA9ICYoICgqc2NhbiktPnRoLnRoX25leHRfcG9vbCApICk7CisKKyAgICAvLworICAgIC8vIEluc2VydCB0aGUgbmV3IGVsZW1lbnQgb24gdGhlIGxpc3QsIGFuZCBzZXQgX19rbXBfdGhyZWFkX3Bvb2xfaW5zZXJ0X3B0CisgICAgLy8gdG8gaXRzIGFkZHJlc3MuCisgICAgLy8KKyAgICBUQ1dfUFRSKHRoaXNfdGgtPnRoLnRoX25leHRfcG9vbCwgKnNjYW4pOworICAgIF9fa21wX3RocmVhZF9wb29sX2luc2VydF9wdCA9ICpzY2FuID0gdGhpc190aDsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCAoIHRoaXNfdGgtPnRoLnRoX25leHRfcG9vbCA9PSBOVUxMICkKKyAgICAgIHx8ICggdGhpc190aC0+dGgudGhfaW5mby5kcy5kc19ndGlkCisgICAgICA8IHRoaXNfdGgtPnRoLnRoX25leHRfcG9vbC0+dGgudGhfaW5mby5kcy5kc19ndGlkICkgKTsKKyAgICBUQ1dfNCh0aGlzX3RoLT50aC50aF9pbl9wb29sLCBUUlVFKTsKKyAgICBfX2ttcF90aHJlYWRfcG9vbF9udGgrKzsKKworICAgIFRDV180KF9fa21wX250aCwgX19rbXBfbnRoIC0gMSk7CisKKyNpZmRlZiBLTVBfQURKVVNUX0JMT0NLVElNRQorICAgIC8qIEFkanVzdCBibG9ja3RpbWUgYmFjayB0byB1c2VyIHNldHRpbmcgb3IgZGVmYXVsdCBpZiBuZWNlc3NhcnkgKi8KKyAgICAvKiBNaWRkbGUgaW5pdGlhbGl6YXRpb24gbWlnaHQgbmV2ZXIgaGF2ZSBvY2N1cnJlZCAgICAgICAgICAgICAgICAqLworICAgIGlmICggIV9fa21wX2Vudl9ibG9ja3RpbWUgJiYgKCBfX2ttcF9hdmFpbF9wcm9jID4gMCApICkgeworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9hdmFpbF9wcm9jID4gMCApOworICAgICAgICBpZiAoIF9fa21wX250aCA8PSBfX2ttcF9hdmFpbF9wcm9jICkgeworICAgICAgICAgICAgX19rbXBfemVyb19idCA9IEZBTFNFOworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8qIEtNUF9BREpVU1RfQkxPQ0tUSU1FICovCisKKyAgICBLTVBfTUIoKTsKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZCAqCitfX2ttcF9sYXVuY2hfdGhyZWFkKCBrbXBfaW5mb190ICp0aGlzX3RociApCit7CisgICAgaW50ICAgICAgICAgICAgICAgICAgIGd0aWQgPSB0aGlzX3Roci0+dGgudGhfaW5mby5kcy5kc19ndGlkOworLyogICAgdm9pZCAgICAgICAgICAgICAgICAgKnN0YWNrX2RhdGE7Ki8KKyAgICBrbXBfdGVhbV90ICooKnZvbGF0aWxlIHB0ZWFtKTsKKworICAgIEtNUF9NQigpOworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9sYXVuY2hfdGhyZWFkOiBUIyVkIHN0YXJ0XG4iLCBndGlkICkgKTsKKworICAgIGlmKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIHRoaXNfdGhyLT50aC50aF9jb25zID0gX19rbXBfYWxsb2NhdGVfY29uc19zdGFjayggZ3RpZCApOyAgLy8gQVRUOiBNZW1vcnkgbGVhaz8KKyAgICB9CisKKyAgICAvKiBUaGlzIGlzIHRoZSBwbGFjZSB3aGVyZSB0aHJlYWRzIHdhaXQgZm9yIHdvcmsgKi8KKyAgICB3aGlsZSggISBUQ1JfNChfX2ttcF9nbG9iYWwuZy5nX2RvbmUpICkgeworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0aGlzX3RociA9PSBfX2ttcF90aHJlYWRzWyBndGlkIF0gKTsKKyAgICAgICAgS01QX01CKCk7CisKKyAgICAgICAgLyogd2FpdCBmb3Igd29yayB0byBkbyAqLworICAgICAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfbGF1bmNoX3RocmVhZDogVCMlZCB3YWl0aW5nIGZvciB3b3JrXG4iLCBndGlkICkpOworCisgICAgICAgIC8qIE5vIHRpZCB5ZXQgc2luY2Ugbm90IHBhcnQgb2YgYSB0ZWFtICovCisgICAgICAgIF9fa21wX2ZvcmtfYmFycmllciggZ3RpZCwgS01QX0dUSURfRE5FICk7CisKKyAgICAgICAgcHRlYW0gPSAoa21wX3RlYW1fdCAqKCopKSgmIHRoaXNfdGhyLT50aC50aF90ZWFtKTsKKworICAgICAgICAvKiBoYXZlIHdlIGJlZW4gYWxsb2NhdGVkPyAqLworICAgICAgICBpZiAoIFRDUl9TWU5DX1BUUigqcHRlYW0pICYmICFUQ1JfNChfX2ttcF9nbG9iYWwuZy5nX2RvbmUpICkgeworICAgICAgICAgICAgLyogd2Ugd2VyZSBqdXN0IHdva2VuIHVwLCBzbyBydW4gb3VyIG5ldyB0YXNrICovCisgICAgICAgICAgICBpZiAoIFRDUl9TWU5DX1BUUigoKnB0ZWFtKS0+dC50X3BrZm4pICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgaW50IHJjOworICAgICAgICAgICAgICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2xhdW5jaF90aHJlYWQ6IFQjJWQoJWQ6JWQpIGludm9rZSBtaWNyb3Rhc2sgPSAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsICgqcHRlYW0pLT50LnRfaWQsIF9fa21wX3RpZF9mcm9tX2d0aWQoZ3RpZCksICgqcHRlYW0pLT50LnRfcGtmbikpOworCisgICAgICAgICAgICAgICAgdXBkYXRlSFdGUENvbnRyb2wgKCpwdGVhbSk7CisKKyAgICAgICAgICAgICAgICBLTVBfU1RPUF9FWFBMSUNJVF9USU1FUihVU0VSX2xhdW5jaF90aHJlYWRfbG9vcCk7CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBLTVBfVElNRV9CTE9DSyhVU0VSX3dvcmtlcl9pbnZva2UpOworICAgICAgICAgICAgICAgICAgICByYyA9ICgqcHRlYW0pLT50LnRfaW52b2tlKCBndGlkICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEtNUF9TVEFSVF9FWFBMSUNJVF9USU1FUihVU0VSX2xhdW5jaF90aHJlYWRfbG9vcCk7CisgICAgICAgICAgICAgICAgS01QX0FTU0VSVCggcmMgKTsKKworICAgICAgICAgICAgICAgIEtNUF9NQigpOworICAgICAgICAgICAgICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2xhdW5jaF90aHJlYWQ6IFQjJWQoJWQ6JWQpIGRvbmUgbWljcm90YXNrID0gJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCAoKnB0ZWFtKS0+dC50X2lkLCBfX2ttcF90aWRfZnJvbV9ndGlkKGd0aWQpLCAoKnB0ZWFtKS0+dC50X3BrZm4pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIGpvaW4gYmFycmllciBhZnRlciBwYXJhbGxlbCByZWdpb24gKi8KKyAgICAgICAgICAgIF9fa21wX2pvaW5fYmFycmllciggZ3RpZCApOworICAgICAgICB9CisgICAgfQorICAgIFRDUl9TWU5DX1BUUigoaW50cHRyX3QpX19rbXBfZ2xvYmFsLmcuZ19kb25lKTsKKworICAgIGlmICggVENSX1BUUiggdGhpc190aHItPnRoLnRoX3Rhc2tfdGVhbSApICE9IE5VTEwgKSB7CisgICAgICAgIF9fa21wX3VucmVmX3Rhc2tfdGVhbSggdGhpc190aHItPnRoLnRoX3Rhc2tfdGVhbSwgdGhpc190aHIgKTsKKyAgICB9CisgICAgLyogcnVuIHRoZSBkZXN0cnVjdG9ycyBmb3IgdGhlIHRocmVhZHByaXZhdGUgZGF0YSBmb3IgdGhpcyB0aHJlYWQgKi8KKyAgICBfX2ttcF9jb21tb25fZGVzdHJveV9ndGlkKCBndGlkICk7CisKKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfbGF1bmNoX3RocmVhZDogVCMlZCBkb25lXG4iLCBndGlkICkgKTsKKyAgICBLTVBfTUIoKTsKKyAgICByZXR1cm4gdGhpc190aHI7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQKK19fa21wX2ludGVybmFsX2VuZF9kZXN0KCB2b2lkICpzcGVjaWZpY19ndGlkICkKK3sKKyAgICAjaWYgS01QX0NPTVBJTEVSX0lDQworICAgICAgICAjcHJhZ21hIHdhcm5pbmcoIHB1c2ggKQorICAgICAgICAjcHJhZ21hIHdhcm5pbmcoIGRpc2FibGU6ICA4MTAgKSAvLyBjb252ZXJzaW9uIGZyb20gInZvaWQgKiIgdG8gImludCIgbWF5IGxvc2Ugc2lnbmlmaWNhbnQgYml0cworICAgICNlbmRpZgorICAgIC8vIE1ha2Ugc3VyZSBubyBzaWduaWZpY2FudCBiaXRzIGFyZSBsb3N0CisgICAgaW50IGd0aWQgPSAoa21wX2ludHB0cl90KXNwZWNpZmljX2d0aWQgLSAxOworICAgICNpZiBLTVBfQ09NUElMRVJfSUNDCisgICAgICAgICNwcmFnbWEgd2FybmluZyggcG9wICkKKyAgICAjZW5kaWYKKworICAgIEtBX1RSQUNFKCAzMCwgKCJfX2ttcF9pbnRlcm5hbF9lbmRfZGVzdDogVCMlZFxuIiwgZ3RpZCkpOworICAgIC8qIE5PVEU6IHRoZSBndGlkIGlzIHN0b3JlZCBhcyBnaXRkKzEgaW4gdGhlIHRocmVhZC1sb2NhbC1zdG9yYWdlCisgICAgICogdGhpcyBpcyBiZWNhdXNlIDAgaXMgcmVzZXJ2ZWQgZm9yIHRoZSBub3RoaW5nLXN0b3JlZCBjYXNlICovCisKKyAgICAvKiBqb3NoOiBPbmUgcmVhc29uIGZvciBzZXR0aW5nIHRoZSBndGlkIHNwZWNpZmljIGRhdGEgZXZlbiB3aGVuIGl0IGlzIGJlaW5nCisgICAgICAgZGVzdHJveWVkIGJ5IHB0aHJlYWQgaXMgdG8gYWxsb3cgZ3RpZCBsb29rdXAgdGhyb3VnaCB0aHJlYWQgc3BlY2lmaWMgZGF0YQorICAgICAgIChfX2ttcF9ndGlkX2dldF9zcGVjaWZpYykuICBTb21lIG9mIHRoZSBjb2RlLCBlc3BlY2lhbGx5IHN0YXQgY29kZSwKKyAgICAgICB0aGF0IGdldHMgZXhlY3V0ZWQgaW4gdGhlIGNhbGwgdG8gX19rbXBfaW50ZXJuYWxfZW5kX3RocmVhZCwgYWN0dWFsbHkKKyAgICAgICBnZXRzIHRoZSBndGlkIHRocm91Z2ggdGhlIHRocmVhZCBzcGVjaWZpYyBkYXRhLiAgU2V0dGluZyBpdCBoZXJlIHNlZW1zCisgICAgICAgcmF0aGVyIGluZWxlZ2FudCBhbmQgcGVyaGFwcyB3cm9uZywgYnV0IGFsbG93cyBfX2ttcF9pbnRlcm5hbF9lbmRfdGhyZWFkCisgICAgICAgdG8gcnVuIHNtb290aGx5LgorICAgICAgIHRvZG86IGdldCByaWQgb2YgdGhpcyBhZnRlciB3ZSByZW1vdmUgdGhlIGRlcGVuZGVuY2Ugb24KKyAgICAgICBfX2ttcF9ndGlkX2dldF9zcGVjaWZpYworICAgICovCisgICAgaWYoZ3RpZCA+PSAwICYmIEtNUF9VQkVSX0dUSUQoZ3RpZCkpCisgICAgICAgIF9fa21wX2d0aWRfc2V0X3NwZWNpZmljKCBndGlkICk7CisgICAgI2lmZGVmIEtNUF9UREFUQV9HVElECisgICAgICAgIF9fa21wX2d0aWQgPSBndGlkOworICAgICNlbmRpZgorICAgIF9fa21wX2ludGVybmFsX2VuZF90aHJlYWQoIGd0aWQgKTsKK30KKworI2lmIEtNUF9PU19VTklYICYmIEdVSURFRExMX0VYUE9SVFMKKworLy8gMjAwOS0wOS0wOCAobGV2KTogSXQgbG9va3MgdGhlIGRlc3RydWN0b3IgZG9lcyBub3Qgd29yay4gSW4gc2ltcGxlIHRlc3QgY2FzZXMgZGVzdHJ1Y3RvcnMgd29yaworLy8gcGVyZmVjdGx5LCBidXQgaW4gcmVhbCBsaWJpb21wNS5zbyBJIGhhdmUgbm8gZXZpZGVuY2UgaXQgaXMgZXZlciBjYWxsZWQuIEhvd2V2ZXIsIC1maW5pIGxpbmtlcgorLy8gb3B0aW9uIGluIG1ha2VmaWxlLm1rIHdvcmtzIGZpbmUuCisKK19fYXR0cmlidXRlX18oKCBkZXN0cnVjdG9yICkpCit2b2lkCitfX2ttcF9pbnRlcm5hbF9lbmRfZHRvciggdm9pZCApCit7CisgICAgX19rbXBfaW50ZXJuYWxfZW5kX2F0ZXhpdCgpOworfQorCit2b2lkCitfX2ttcF9pbnRlcm5hbF9lbmRfZmluaSggdm9pZCApCit7CisgICAgX19rbXBfaW50ZXJuYWxfZW5kX2F0ZXhpdCgpOworfQorCisjZW5kaWYKKworLyogW1dpbmRvd3NdIGpvc2g6IHdoZW4gdGhlIGF0ZXhpdCBoYW5kbGVyIGlzIGNhbGxlZCwgdGhlcmUgbWF5IHN0aWxsIGJlIG1vcmUgdGhhbiBvbmUgdGhyZWFkIGFsaXZlICovCit2b2lkCitfX2ttcF9pbnRlcm5hbF9lbmRfYXRleGl0KCB2b2lkICkKK3sKKyAgICBLQV9UUkFDRSggMzAsICggIl9fa21wX2ludGVybmFsX2VuZF9hdGV4aXRcbiIgKSApOworICAgIC8qIFtXaW5kb3dzXQorICAgICAgIGpvc2g6IGlkZWFsbHksIHdlIHdhbnQgdG8gY29tcGxldGVseSBzaHV0ZG93biB0aGUgbGlicmFyeSBpbiB0aGlzIGF0ZXhpdCBoYW5kbGVyLCBidXQKKyAgICAgICBzdGF0IGNvZGUgdGhhdCBkZXBlbmRzIG9uIHRocmVhZCBzcGVjaWZpYyBkYXRhIGZvciBndGlkIGZhaWxzIGJlY2F1c2UgdGhhdCBkYXRhIGJlY29tZXMKKyAgICAgICB1bmF2YWlsYWJsZSBhdCBzb21lIHBvaW50IGR1cmluZyB0aGUgc2h1dGRvd24sIHNvIHdlIGNhbGwgX19rbXBfaW50ZXJuYWxfZW5kX3RocmVhZAorICAgICAgIGluc3RlYWQuICBXZSBzaG91bGQgZXZlbnR1YWxseSByZW1vdmUgdGhlIGRlcGVuZGVuY3kgb24gX19rbXBfZ2V0X3NwZWNpZmljX2d0aWQgaW4gdGhlCisgICAgICAgc3RhdCBjb2RlIGFuZCB1c2UgX19rbXBfaW50ZXJuYWxfZW5kX2xpYnJhcnkgdG8gY2xlYW5seSBzaHV0ZG93biB0aGUgbGlicmFyeS4KKworLy8gVE9ETzogQ2FuIHNvbWUgb2YgdGhpcyBjb21tZW50IGFib3V0IEdWUyBiZSByZW1vdmVkPworICAgICAgIEkgc3VzcGVjdCB0aGF0IHRoZSBvZmZlbmRpbmcgc3RhdCBjb2RlIGlzIGV4ZWN1dGVkIHdoZW4gdGhlIGNhbGxpbmcgdGhyZWFkIHRyaWVzIHRvCisgICAgICAgY2xlYW4gdXAgYSBkZWFkIHJvb3QgdGhyZWFkJ3MgZGF0YSBzdHJ1Y3R1cmVzLCByZXN1bHRpbmcgaW4gR1ZTIGNvZGUgdHJ5aW5nIHRvIGNsb3NlCisgICAgICAgdGhlIEdWUyBzdHJ1Y3R1cmVzIGZvciB0aGF0IHRocmVhZCwgYnV0IHNpbmNlIHRoZSBzdGF0IGNvZGUgdXNlcworICAgICAgIF9fa21wX2dldF9zcGVjaWZpY19ndGlkIHRvIGdldCB0aGUgZ3RpZCB3aXRoIHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhlIGNhbGxpbmcgdGhyZWFkIGlzCisgICAgICAgY2xlYW5pbmcgdXAgaXRzZWxmIGluc3RlYWQgb2YgYW5vdGhlciB0aHJlYWQsIGl0IGdldHMgY29uZnVzZWQuICBUaGlzIGhhcHBlbnMgYmVjYXVzZQorICAgICAgIGFsbG93aW5nIGEgdGhyZWFkIHRvIHVucmVnaXN0ZXIgYW5kIGNsZWFudXAgYW5vdGhlciB0aHJlYWQgaXMgYSByZWNlbnQgbW9kaWZpY2F0aW9uIGZvcgorICAgICAgIGFkZHJlc3NpbmcgYW4gaXNzdWUgd2l0aCBNYXhvbiBDaW5lbWE0RC4gIEJhc2VkIG9uIHRoZSBjdXJyZW50IGRlc2lnbiAoMjAwNTA3MjIpLCBhCisgICAgICAgdGhyZWFkIG1heSBlbmQgdXAgdHJ5aW5nIHRvIHVucmVnaXN0ZXIgYW5vdGhlciB0aHJlYWQgb25seSBpZiB0aHJlYWQgZGVhdGggZG9lcyBub3QKKyAgICAgICB0cmlnZ2VyIHRoZSBjYWxsaW5nIG9mIF9fa21wX2ludGVybmFsX2VuZF90aHJlYWQuICBGb3IgTGludXgqIE9TLCB0aGVyZSBpcyB0aGUgdGhyZWFkCisgICAgICAgc3BlY2lmaWMgZGF0YSBkZXN0cnVjdG9yIGZ1bmN0aW9uIHRvIGRldGVjdCB0aHJlYWQgZGVhdGguICBGb3IgV2luZG93cyBkeW5hbWljLCB0aGVyZQorICAgICAgIGlzIERsbE1haW4oVEhSRUFEX0RFVEFDSCkuICBGb3IgV2luZG93cyBzdGF0aWMsIHRoZXJlIGlzIG5vdGhpbmcuICBUaHVzLCB0aGUKKyAgICAgICB3b3JrYXJvdW5kIGlzIGFwcGxpY2FibGUgb25seSBmb3IgV2luZG93cyBzdGF0aWMgc3RhdCBsaWJyYXJ5LgorICAgICovCisgICAgX19rbXBfaW50ZXJuYWxfZW5kX2xpYnJhcnkoIC0xICk7CisgICAgI2lmIEtNUF9PU19XSU5ET1dTCisgICAgICAgIF9fa21wX2Nsb3NlX2NvbnNvbGUoKTsKKyAgICAjZW5kaWYKK30KKworc3RhdGljIHZvaWQKK19fa21wX3JlYXBfdGhyZWFkKAorICAgIGttcF9pbmZvX3QgKiB0aHJlYWQsCisgICAgaW50IGlzX3Jvb3QKKykgeworCisgICAgLy8gSXQgaXMgYXNzdW1lZCBfX2ttcF9mb3Jram9pbl9sb2NrIGlzIGFjcXVpcmVkLgorCisgICAgaW50IGd0aWQ7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aHJlYWQgIT0gTlVMTCApOworCisgICAgZ3RpZCA9IHRocmVhZC0+dGgudGhfaW5mby5kcy5kc19ndGlkOworCisgICAgaWYgKCAhIGlzX3Jvb3QgKSB7CisKKyAgICAgICAgaWYgKCBfX2ttcF9kZmx0X2Jsb2NrdGltZSAhPSBLTVBfTUFYX0JMT0NLVElNRSApIHsKKyAgICAgICAgICAgIC8qIEFzc3VtZSB0aGUgdGhyZWFkcyBhcmUgYXQgdGhlIGZvcmsgYmFycmllciBoZXJlICovCisgICAgICAgICAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfcmVhcF90aHJlYWQ6IHJlbGVhc2luZyBUIyVkIGZyb20gZm9yayBiYXJyaWVyIGZvciByZWFwXG4iLCBndGlkICkgKTsKKyAgICAgICAgICAgIC8qIE5lZWQgcmVsZWFzZSBmZW5jZSBoZXJlIHRvIHByZXZlbnQgc2VnIGZhdWx0cyBmb3IgdHJlZSBmb3Jram9pbiBiYXJyaWVyIChHRUgpICovCisgICAgICAgICAgICBrbXBfZmxhZ182NCBmbGFnKCZ0aHJlYWQtPnRoLnRoX2JhclsgYnNfZm9ya2pvaW5fYmFycmllciBdLmJiLmJfZ28sIHRocmVhZCk7CisgICAgICAgICAgICBfX2ttcF9yZWxlYXNlXzY0KCZmbGFnKTsKKyAgICAgICAgfTsgLy8gaWYKKworCisgICAgICAgIC8vIFRlcm1pbmF0ZSBPUyB0aHJlYWQuCisgICAgICAgIF9fa21wX3JlYXBfd29ya2VyKCB0aHJlYWQgKTsKKworICAgICAgICAvLworICAgICAgICAvLyBUaGUgdGhyZWFkIHdhcyBraWxsZWQgYXN5bmNocm9ub3VzbHkuICBJZiBpdCB3YXMgYWN0aXZlbHkKKyAgICAgICAgLy8gc3Bpbm5pbmcgaW4gdGhlIGluIHRoZSB0aHJlYWQgcG9vbCwgZGVjcmVtZW50IHRoZSBnbG9iYWwgY291bnQuCisgICAgICAgIC8vCisgICAgICAgIC8vIFRoZXJlIGlzIGEgc21hbGwgdGltaW5nIGhvbGUgaGVyZSAtIGlmIHRoZSB3b3JrZXIgdGhyZWFkIHdhcworICAgICAgICAvLyBqdXN0IHdha2luZyB1cCBhZnRlciBzbGVlcGluZyBpbiB0aGUgcG9vbCwgaGFkIHJlc2V0IGl0J3MKKyAgICAgICAgLy8gdGhfYWN0aXZlX2luX3Bvb2wgZmxhZyBidXQgbm90IGRlY3JlbWVudGVkIHRoZSBnbG9iYWwgY291bnRlcgorICAgICAgICAvLyBfX2ttcF90aHJlYWRfcG9vbF9hY3RpdmVfbnRoIHlldCwgdGhlbiB0aGUgZ2xvYmFsIGNvdW50ZXIKKyAgICAgICAgLy8gbWlnaHQgbm90IGdldCB1cGRhdGVkLgorICAgICAgICAvLworICAgICAgICAvLyBDdXJyZW50bHksIHRoaXMgY2FuIG9ubHkgaGFwcGVuIGFzIHRoZSBsaWJyYXJ5IGlzIHVubG9hZGVkLAorICAgICAgICAvLyBzbyB0aGVyZSBhcmUgbm8gaGFybWZ1bCBzaWRlIGVmZmVjdHMuCisgICAgICAgIC8vCisgICAgICAgIGlmICggdGhyZWFkLT50aC50aF9hY3RpdmVfaW5fcG9vbCApIHsKKyAgICAgICAgICAgIHRocmVhZC0+dGgudGhfYWN0aXZlX2luX3Bvb2wgPSBGQUxTRTsKKyAgICAgICAgICAgIEtNUF9URVNUX1RIRU5fREVDMzIoCisgICAgICAgICAgICAgIChrbXBfaW50MzIgKikgJl9fa21wX3RocmVhZF9wb29sX2FjdGl2ZV9udGggKTsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIFRDUl80KF9fa21wX3RocmVhZF9wb29sX2FjdGl2ZV9udGgpID49IDAgKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIERlY3JlbWVudCAjIG9mIFt3b3JrZXJdIHRocmVhZHMgaW4gdGhlIHBvb2wuCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX3RocmVhZF9wb29sX250aCA+IDAgKTsKKyAgICAgICAgLS1fX2ttcF90aHJlYWRfcG9vbF9udGg7CisgICAgfTsgLy8gaWYKKworICAgIC8vIEZyZWUgdGhlIGZhc3QgbWVtb3J5IGZvciB0YXNraW5nCisgICAgI2lmIFVTRV9GQVNUX01FTU9SWQorICAgICAgICBfX2ttcF9mcmVlX2Zhc3RfbWVtb3J5KCB0aHJlYWQgKTsKKyAgICAjZW5kaWYgLyogVVNFX0ZBU1RfTUVNT1JZICovCisKKyAgICBfX2ttcF9zdXNwZW5kX3VuaW5pdGlhbGl6ZV90aHJlYWQoIHRocmVhZCApOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfdGhyZWFkc1sgZ3RpZCBdID09IHRocmVhZCApOworICAgIFRDV19TWU5DX1BUUihfX2ttcF90aHJlYWRzW2d0aWRdLCBOVUxMKTsKKworICAgIC0tIF9fa21wX2FsbF9udGg7CisgICAgLy8gX19rbXBfbnRoIHdhcyBkZWNyZW1lbnRlZCB3aGVuIHRocmVhZCBpcyBhZGRlZCB0byB0aGUgcG9vbC4KKworI2lmZGVmIEtNUF9BREpVU1RfQkxPQ0tUSU1FCisgICAgLyogQWRqdXN0IGJsb2NrdGltZSBiYWNrIHRvIHVzZXIgc2V0dGluZyBvciBkZWZhdWx0IGlmIG5lY2Vzc2FyeSAqLworICAgIC8qIE1pZGRsZSBpbml0aWFsaXphdGlvbiBtaWdodCBuZXZlciBoYXZlIG9jY3VycmVkICAgICAgICAgICAgICAgICovCisgICAgaWYgKCAhX19rbXBfZW52X2Jsb2NrdGltZSAmJiAoIF9fa21wX2F2YWlsX3Byb2MgPiAwICkgKSB7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2F2YWlsX3Byb2MgPiAwICk7CisgICAgICAgIGlmICggX19rbXBfbnRoIDw9IF9fa21wX2F2YWlsX3Byb2MgKSB7CisgICAgICAgICAgICBfX2ttcF96ZXJvX2J0ID0gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogS01QX0FESlVTVF9CTE9DS1RJTUUgKi8KKworICAgIC8qIGZyZWUgdGhlIG1lbW9yeSBiZWluZyB1c2VkICovCisgICAgaWYoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgaWYgKCB0aHJlYWQtPnRoLnRoX2NvbnMgKSB7CisgICAgICAgICAgICBfX2ttcF9mcmVlX2NvbnNfc3RhY2soIHRocmVhZC0+dGgudGhfY29ucyApOworICAgICAgICAgICAgdGhyZWFkLT50aC50aF9jb25zID0gTlVMTDsKKyAgICAgICAgfTsgLy8gaWYKKyAgICB9CisKKyAgICBpZiAoIHRocmVhZC0+dGgudGhfcHJpX2NvbW1vbiAhPSBOVUxMICkgeworICAgICAgICBfX2ttcF9mcmVlKCB0aHJlYWQtPnRoLnRoX3ByaV9jb21tb24gKTsKKyAgICAgICAgdGhyZWFkLT50aC50aF9wcmlfY29tbW9uID0gTlVMTDsKKyAgICB9OyAvLyBpZgorCisgICAgI2lmIEtNUF9VU0VfQkdFVAorICAgICAgICBpZiAoIHRocmVhZC0+dGgudGhfbG9jYWwuYmdldF9kYXRhICE9IE5VTEwgKSB7CisgICAgICAgICAgICBfX2ttcF9maW5hbGl6ZV9iZ2V0KCB0aHJlYWQgKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAjZW5kaWYKKworI2lmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICBpZiAoIHRocmVhZC0+dGgudGhfYWZmaW5fbWFzayAhPSBOVUxMICkgeworICAgICAgICBLTVBfQ1BVX0ZSRUUoIHRocmVhZC0+dGgudGhfYWZmaW5fbWFzayApOworICAgICAgICB0aHJlYWQtPnRoLnRoX2FmZmluX21hc2sgPSBOVUxMOworICAgIH07IC8vIGlmCisjZW5kaWYgLyogS01QX0FGRklOSVRZX1NVUFBPUlRFRCAqLworCisgICAgX19rbXBfcmVhcF90ZWFtKCB0aHJlYWQtPnRoLnRoX3NlcmlhbF90ZWFtICk7CisgICAgdGhyZWFkLT50aC50aF9zZXJpYWxfdGVhbSA9IE5VTEw7CisgICAgX19rbXBfZnJlZSggdGhyZWFkICk7CisKKyAgICBLTVBfTUIoKTsKKworfSAvLyBfX2ttcF9yZWFwX3RocmVhZAorCitzdGF0aWMgdm9pZAorX19rbXBfaW50ZXJuYWxfZW5kKHZvaWQpCit7CisgICAgaW50IGk7CisKKyAgICAvKiBGaXJzdCwgdW5yZWdpc3RlciB0aGUgbGlicmFyeSAqLworICAgIF9fa21wX3VucmVnaXN0ZXJfbGlicmFyeSgpOworCisgICAgI2lmIEtNUF9PU19XSU5ET1dTCisgICAgICAgIC8qIEluIFdpbiBzdGF0aWMgbGlicmFyeSwgd2UgY2FuJ3QgdGVsbCB3aGVuIGEgcm9vdCBhY3R1YWxseSBkaWVzLCBzbyB3ZQorICAgICAgICAgICByZWNsYWltIHRoZSBkYXRhIHN0cnVjdHVyZXMgZm9yIGFueSByb290IHRocmVhZHMgdGhhdCBoYXZlIGRpZWQgYnV0IG5vdAorICAgICAgICAgICB1bnJlZ2lzdGVyZWQgdGhlbXNlbHZlcywgaW4gb3JkZXIgdG8gc2h1dCBkb3duIGNsZWFubHkuCisgICAgICAgICAgIEluIFdpbiBkeW5hbWljIGxpYnJhcnkgd2UgYWxzbyBjYW4ndCB0ZWxsIHdoZW4gYSB0aHJlYWQgZGllcy4KKyAgICAgICAgKi8KKyAgICAgICAgX19rbXBfcmVjbGFpbV9kZWFkX3Jvb3RzKCk7IC8vIEFDOiBtb3ZlZCBoZXJlIHRvIGFsd2F5cyBjbGVhbiByZXNvdXJjZXMgb2YgZGVhZCByb290cworICAgICNlbmRpZgorCisgICAgZm9yKCBpPTAgOyBpPF9fa21wX3RocmVhZHNfY2FwYWNpdHkgOyBpKysgKQorICAgICAgICBpZiggX19rbXBfcm9vdFtpXSApCisgICAgICAgICAgICBpZiggX19rbXBfcm9vdFtpXS0+ci5yX2FjdGl2ZSApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisgICAgVENXX1NZTkNfNChfX2ttcF9nbG9iYWwuZy5nX2RvbmUsIFRSVUUpOworCisgICAgaWYgKCBpIDwgX19rbXBfdGhyZWFkc19jYXBhY2l0eSApIHsKKyAgICAgICAgLy8gMjAwOS0wOS0wOCAobGV2KTogT3RoZXIgYWxpdmUgcm9vdHMgZm91bmQuIFdoeSBkbyB3ZSBraWxsIHRoZSBtb25pdG9yPz8KKyAgICAgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gTmVlZCB0byBjaGVjayB0aGF0IG1vbml0b3Igd2FzIGluaXRpYWxpemVkIGJlZm9yZSByZWFwaW5nIGl0LgorICAgICAgICAvLyBJZiB3ZSBhcmUgY2FsbGVkIGZvcm0gX19rbXBfYXRmb3JrX2NoaWxkICh3aGljaCBzZXRzCisgICAgICAgIC8vIF9fa21wX2luaXRfcGFyYWxsZWwgPSAwKSwgdGhlbiBfX2ttcF9tb25pdG9yIHdpbGwgYXBwZWFyIHRvCisgICAgICAgIC8vIGNvbnRhaW4gdmFsaWQgZGF0YSwgYnV0IGl0IGlzIG9ubHkgdmFsaWQgaW4gdGhlIHBhcmVudCBwcm9jZXNzLAorICAgICAgICAvLyBub3QgdGhlIGNoaWxkLgorICAgICAgICAvLworICAgICAgICAvLyBPbmUgb2YgdGhlIHBvc3NpYmxlIGZpeGVzIGZvciBDUTEzODQzNCAvIENRMTQwMTI2CisgICAgICAgIC8vICh1c2VkIGluIDIwMDkxMTAzX2RyZWFtd29ya3MgcGF0Y2gpCisgICAgICAgIC8vCisgICAgICAgIC8vIE5ldyBiZWhhdmlvciAoMjAxMDA4KTogaW5zdGVhZCBvZiBrZXlpbmcgb2ZmIG9mIHRoZSBmbGFnCisgICAgICAgIC8vIF9fa21wX2luaXRfcGFyYWxsZWwsIHRoZSBtb25pdG9yIHRocmVhZCBjcmVhdGlvbiBpcyBrZXllZCBvZmYKKyAgICAgICAgLy8gb2YgdGhlIG5ldyBmbGFnIF9fa21wX2luaXRfbW9uaXRvci4KKyAgICAgICAgLy8KKyAgICAgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJiBfX2ttcF9tb25pdG9yX2xvY2sgKTsKKyAgICAgICAgaWYgKCBUQ1JfNCggX19rbXBfaW5pdF9tb25pdG9yICkgKSB7CisgICAgICAgICAgICBfX2ttcF9yZWFwX21vbml0b3IoICYgX19rbXBfbW9uaXRvciApOworICAgICAgICAgICAgVENXXzQoIF9fa21wX2luaXRfbW9uaXRvciwgMCApOworICAgICAgICB9CisgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICYgX19rbXBfbW9uaXRvcl9sb2NrICk7CisgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9pbnRlcm5hbF9lbmQ6IG1vbml0b3IgcmVhcGVkXG4iICkgKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBUT0RPIG1vdmUgdGhpcyB0byBjbGVhbnVwIGNvZGUgKi8KKyAgICAgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAgICAgLyogbWFrZSBzdXJlIHRoYXQgZXZlcnl0aGluZyBoYXMgcHJvcGVybHkgZW5kZWQgKi8KKyAgICAgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgX19rbXBfdGhyZWFkc19jYXBhY2l0eTsgaSsrICkgeworICAgICAgICAgICAgICAgIGlmKCBfX2ttcF9yb290W2ldICkgeworLy8gICAgICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQoICEgS01QX1VCRVJfR1RJRCggaSApICk7ICAgICAgICAgLy8gQUM6IHRoZXJlIGNhbiBiZSB1YmVyIHRocmVhZHMgYWxpdmUgaGVyZQorICAgICAgICAgICAgICAgICAgICBLTVBfQVNTRVJUKCAhIF9fa21wX3Jvb3RbaV0tPnIucl9hY3RpdmUgKTsgIC8vIFRPRE86IGNhbiB0aGV5IGJlIGFjdGl2ZT8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICNlbmRpZgorCisgICAgICAgIEtNUF9NQigpOworCisgICAgICAgIC8vIFJlYXAgdGhlIHdvcmtlciB0aHJlYWRzLgorICAgICAgICAvLyBUaGlzIGlzIHZhbGlkIGZvciBub3csIGJ1dCBiZSBjYXJlZnVsIGlmIHRocmVhZHMgYXJlIHJlYXBlZCBzb29uZXIuCisgICAgICAgIHdoaWxlICggX19rbXBfdGhyZWFkX3Bvb2wgIT0gTlVMTCApIHsgICAgLy8gTG9vcCB0aHJ1IGFsbCB0aGUgdGhyZWFkIGluIHRoZSBwb29sLgorICAgICAgICAgICAgLy8gR2V0IHRoZSBuZXh0IHRocmVhZCBmcm9tIHRoZSBwb29sLgorICAgICAgICAgICAga21wX2luZm9fdCAqIHRocmVhZCA9IChrbXBfaW5mb190ICopIF9fa21wX3RocmVhZF9wb29sOworICAgICAgICAgICAgX19rbXBfdGhyZWFkX3Bvb2wgPSB0aHJlYWQtPnRoLnRoX25leHRfcG9vbDsKKyAgICAgICAgICAgIC8vIFJlYXAgaXQuCisgICAgICAgICAgICB0aHJlYWQtPnRoLnRoX25leHRfcG9vbCA9IE5VTEw7CisgICAgICAgICAgICB0aHJlYWQtPnRoLnRoX2luX3Bvb2wgPSBGQUxTRTsKKyAgICAgICAgICAgIF9fa21wX3JlYXBfdGhyZWFkKCB0aHJlYWQsIDAgKTsKKyAgICAgICAgfTsgLy8gd2hpbGUKKyAgICAgICAgX19rbXBfdGhyZWFkX3Bvb2xfaW5zZXJ0X3B0ID0gTlVMTDsKKworICAgICAgICAvLyBSZWFwIHRlYW1zLgorICAgICAgICB3aGlsZSAoIF9fa21wX3RlYW1fcG9vbCAhPSBOVUxMICkgeyAgICAgLy8gTG9vcCB0aHJ1IGFsbCB0aGUgdGVhbXMgaW4gdGhlIHBvb2wuCisgICAgICAgICAgICAvLyBHZXQgdGhlIG5leHQgdGVhbSBmcm9tIHRoZSBwb29sLgorICAgICAgICAgICAga21wX3RlYW1fdCAqIHRlYW0gPSAoa21wX3RlYW1fdCAqKSBfX2ttcF90ZWFtX3Bvb2w7CisgICAgICAgICAgICBfX2ttcF90ZWFtX3Bvb2wgPSB0ZWFtLT50LnRfbmV4dF9wb29sOworICAgICAgICAgICAgLy8gUmVhcCBpdC4KKyAgICAgICAgICAgIHRlYW0tPnQudF9uZXh0X3Bvb2wgPSBOVUxMOworICAgICAgICAgICAgX19rbXBfcmVhcF90ZWFtKCB0ZWFtICk7CisgICAgICAgIH07IC8vIHdoaWxlCisKKyAgICAgICAgX19rbXBfcmVhcF90YXNrX3RlYW1zKCApOworCisgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgX19rbXBfdGhyZWFkc19jYXBhY2l0eTsgKysgaSApIHsKKyAgICAgICAgICAgIC8vIFRCRDogQWRkIHNvbWUgY2hlY2tpbmcuLi4KKyAgICAgICAgICAgIC8vIFNvbWV0aGluZyBsaWtlIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX3RocmVhZFsgaSBdID09IE5VTEwgKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIE1ha2Ugc3VyZSBhbGwgdGhyZWFkcHJpdmF0ZSBkZXN0cnVjdG9ycyBnZXQgcnVuIGJ5IGpvaW5pbmcgd2l0aCBhbGwgd29ya2VyCisgICAgICAgICAgIHRocmVhZHMgYmVmb3JlIHJlc2V0dGluZyB0aGlzIGZsYWcgKi8KKyAgICAgICAgVENXX1NZTkNfNChfX2ttcF9pbml0X2NvbW1vbiwgRkFMU0UpOworCisgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9pbnRlcm5hbF9lbmQ6IGFsbCB3b3JrZXJzIHJlYXBlZFxuIiApICk7CisgICAgICAgIEtNUF9NQigpOworCisgICAgICAgIC8vCisgICAgICAgIC8vIFNlZSBub3RlIGFib3ZlOiBPbmUgb2YgdGhlIHBvc3NpYmxlIGZpeGVzIGZvciBDUTEzODQzNCAvIENRMTQwMTI2CisgICAgICAgIC8vCisgICAgICAgIC8vIEZJWE1FOiBwdXNoIGJvdGggY29kZSBmcmFnbWVudHMgZG93biBhbmQgQ1NFIHRoZW0/CisgICAgICAgIC8vIHB1c2ggdGhlbSBpbnRvIF9fa21wX2NsZWFudXAoKSA/CisgICAgICAgIC8vCisgICAgICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICYgX19rbXBfbW9uaXRvcl9sb2NrICk7CisgICAgICAgIGlmICggVENSXzQoIF9fa21wX2luaXRfbW9uaXRvciApICkgeworICAgICAgICAgICAgX19rbXBfcmVhcF9tb25pdG9yKCAmIF9fa21wX21vbml0b3IgKTsKKyAgICAgICAgICAgIFRDV180KCBfX2ttcF9pbml0X21vbml0b3IsIDAgKTsKKyAgICAgICAgfQorICAgICAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmIF9fa21wX21vbml0b3JfbG9jayApOworICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfaW50ZXJuYWxfZW5kOiBtb25pdG9yIHJlYXBlZFxuIiApICk7CisKKyAgICB9IC8qIGVsc2UgIV9fa21wX2dsb2JhbC50X2FjdGl2ZSAqLworICAgIFRDV180KF9fa21wX2luaXRfZ3RpZCwgRkFMU0UpOworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisKKyAgICBfX2ttcF9jbGVhbnVwKCk7Cit9CisKK3ZvaWQKK19fa21wX2ludGVybmFsX2VuZF9saWJyYXJ5KCBpbnQgZ3RpZF9yZXEgKQoreworICAgIGludCBpOworCisgICAgLyogaWYgd2UgaGF2ZSBhbHJlYWR5IGNsZWFuZWQgdXAsIGRvbid0IHRyeSBhZ2FpbiwgaXQgd291bGRuJ3QgYmUgcHJldHR5ICovCisgICAgLyogdGhpcyBzaG91bGRuJ3QgYmUgYSByYWNlIGNvbmRpdGlvbiBiZWNhdXNlIF9fa21wX2ludGVybmFsX2VuZCgpIGlzIHRoZQorICAgICAqIG9ubHkgcGxhY2UgdG8gY2xlYXIgX19rbXBfc2VyaWFsX2luaXQgKi8KKyAgICAvKiB3ZSdsbCBjaGVjayB0aGlzIGxhdGVyIHRvbywgYWZ0ZXIgd2UgZ2V0IHRoZSBsb2NrICovCisgICAgLy8gMjAwOS0wOS0wNjogV2UgZG8gbm90IHNldCBnX2Fib3J0IHdpdGhvdXQgc2V0dGluZyBnX2RvbmUuIFRoaXMgY2hlY2sgbG9va3MgcmVkdW5kYWFudCwKKyAgICAvLyBiZWNhdXNlIHRoZSBuZXh0IGNoZWNrIHdpbGwgd29yayBpbiBhbnkgY2FzZS4KKyAgICBpZiggX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCApIHsKKyAgICAgICAgS0FfVFJBQ0UoIDExLCAoIl9fa21wX2ludGVybmFsX2VuZF9saWJyYXJ5OiBhYm9ydCwgZXhpdGluZ1xuIiApKTsKKyAgICAgICAgLyogVE9ETyBhYm9ydD8gKi8KKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiggVENSXzQoX19rbXBfZ2xvYmFsLmcuZ19kb25lKSB8fCAhX19rbXBfaW5pdF9zZXJpYWwgKSB7CisgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9pbnRlcm5hbF9lbmRfbGlicmFyeTogYWxyZWFkeSBmaW5pc2hlZFxuIiApKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworCisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICAvKiBmaW5kIG91dCB3aG8gd2UgYXJlIGFuZCB3aGF0IHdlIHNob3VsZCBkbyAqLworICAgIHsKKyAgICAgICAgaW50IGd0aWQgPSAoZ3RpZF9yZXE+PTApID8gZ3RpZF9yZXEgOiBfX2ttcF9ndGlkX2dldF9zcGVjaWZpYygpOworICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfaW50ZXJuYWxfZW5kX2xpYnJhcnk6IGVudGVyIFQjJWQgICglZClcbiIsIGd0aWQsIGd0aWRfcmVxICkpOworICAgICAgICBpZiggZ3RpZCA9PSBLTVBfR1RJRF9TSFVURE9XTiApIHsKKyAgICAgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9pbnRlcm5hbF9lbmRfbGlicmFyeTogIV9fa21wX2luaXRfcnVudGltZSwgc3lzdGVtIGFscmVhZHkgc2h1dGRvd25cbiIgKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSBpZiggZ3RpZCA9PSBLTVBfR1RJRF9NT05JVE9SICkgeworICAgICAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2ludGVybmFsX2VuZF9saWJyYXJ5OiBtb25pdG9yIHRocmVhZCwgZ3RpZCBub3QgcmVnaXN0ZXJlZCwgb3Igc3lzdGVtIHNodXRkb3duXG4iICkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgaWYoIGd0aWQgPT0gS01QX0dUSURfRE5FICkgeworICAgICAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2ludGVybmFsX2VuZF9saWJyYXJ5OiBndGlkIG5vdCByZWdpc3RlcmVkIG9yIHN5c3RlbSBzaHV0ZG93blxuIiApKTsKKyAgICAgICAgICAgIC8qIHdlIGRvbid0IGtub3cgd2hvIHdlIGFyZSwgYnV0IHdlIG1heSBzdGlsbCBzaHV0ZG93biB0aGUgbGlicmFyeSAqLworICAgICAgICB9IGVsc2UgaWYoIEtNUF9VQkVSX0dUSUQoIGd0aWQgKSkgeworICAgICAgICAgICAgLyogdW5yZWdpc3RlciBvdXJzZWx2ZXMgYXMgYW4gdWJlciB0aHJlYWQuICBndGlkIGlzIG5vIGxvbmdlciB2YWxpZCAqLworICAgICAgICAgICAgaWYoIF9fa21wX3Jvb3RbZ3RpZF0tPnIucl9hY3RpdmUgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCA9IC0xOworICAgICAgICAgICAgICAgIFRDV19TWU5DXzQoX19rbXBfZ2xvYmFsLmcuZ19kb25lLCBUUlVFKTsKKyAgICAgICAgICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfaW50ZXJuYWxfZW5kX2xpYnJhcnk6IHJvb3Qgc3RpbGwgYWN0aXZlLCBhYm9ydCBUIyVkXG4iLCBndGlkICkpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2ludGVybmFsX2VuZF9saWJyYXJ5OiB1bnJlZ2lzdGVyaW5nIHNpYmxpbmcgVCMlZFxuIiwgZ3RpZCApKTsKKyAgICAgICAgICAgICAgICBfX2ttcF91bnJlZ2lzdGVyX3Jvb3RfY3VycmVudF90aHJlYWQoIGd0aWQgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIHdvcmtlciB0aHJlYWRzIG1heSBjYWxsIHRoaXMgZnVuY3Rpb24gdGhyb3VnaCB0aGUgYXRleGl0IGhhbmRsZXIsIGlmIHRoZXkgY2FsbCBleGl0KCkgKi8KKyAgICAgICAgICAgIC8qIEZvciBub3csIHNraXAgdGhlIHVzdWFsIHN1YnNlcXVlbnQgcHJvY2Vzc2luZyBhbmQganVzdCBkdW1wIHRoZSBkZWJ1ZyBidWZmZXIuCisgICAgICAgICAgICAgICBUT0RPOiBkbyBhIHRob3JvdWdoIHNodXRkb3duIGluc3RlYWQKKyAgICAgICAgICAgICovCisgICAgICAgICAgICAjaWZkZWYgRFVNUF9ERUJVR19PTl9FWElUCisgICAgICAgICAgICAgICAgaWYgKCBfX2ttcF9kZWJ1Z19idWYgKQorICAgICAgICAgICAgICAgICAgICBfX2ttcF9kdW1wX2RlYnVnX2J1ZmZlciggKTsKKyAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIC8qIHN5bmNocm9uaXplIHRoZSB0ZXJtaW5hdGlvbiBwcm9jZXNzICovCisgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJl9fa21wX2luaXR6X2xvY2sgKTsKKworICAgIC8qIGhhdmUgd2UgYWxyZWFkeSBmaW5pc2hlZCAqLworICAgIGlmKCBfX2ttcF9nbG9iYWwuZy5nX2Fib3J0ICkgeworICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfaW50ZXJuYWxfZW5kX2xpYnJhcnk6IGFib3J0LCBleGl0aW5nXG4iICkpOworICAgICAgICAvKiBUT0RPIGFib3J0PyAqLworICAgICAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfaW5pdHpfbG9jayApOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmKCBUQ1JfNChfX2ttcF9nbG9iYWwuZy5nX2RvbmUpIHx8ICFfX2ttcF9pbml0X3NlcmlhbCApIHsKKyAgICAgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJl9fa21wX2luaXR6X2xvY2sgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIFdlIG5lZWQgdGhpcyBsb2NrIHRvIGVuZm9yY2UgbXV0ZXggYmV0d2VlbiB0aGlzIHJlYWRpbmcgb2YKKyAgICAgICBfX2ttcF90aHJlYWRzX2NhcGFjaXR5IGFuZCB0aGUgd3JpdGluZyBieSBfX2ttcF9yZWdpc3Rlcl9yb290LgorICAgICAgIEFsdGVybmF0aXZlbHksIHdlIGNhbiB1c2UgYSBjb3VudGVyIG9mIHJvb3RzIHRoYXQgaXMKKyAgICAgICBhdG9taWNhbGx5IHVwZGF0ZWQgYnkgX19rbXBfZ2V0X2dsb2JhbF90aHJlYWRfaWRfcmVnLAorICAgICAgIF9fa21wX2RvX3NlcmlhbF9pbml0aWFsaXplIGFuZCBfX2ttcF9pbnRlcm5hbF9lbmRfKi4KKyAgICAqLworICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9mb3Jram9pbl9sb2NrICk7CisKKyAgICAvKiBub3cgd2UgY2FuIHNhZmVseSBjb25kdWN0IHRoZSBhY3R1YWwgdGVybWluYXRpb24gKi8KKyAgICBfX2ttcF9pbnRlcm5hbF9lbmQoKTsKKworICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9mb3Jram9pbl9sb2NrICk7CisgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJl9fa21wX2luaXR6X2xvY2sgKTsKKworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9pbnRlcm5hbF9lbmRfbGlicmFyeTogZXhpdFxuIiApICk7CisKKyAgICAjaWZkZWYgRFVNUF9ERUJVR19PTl9FWElUCisgICAgICAgIGlmICggX19rbXBfZGVidWdfYnVmICkKKyAgICAgICAgICAgIF9fa21wX2R1bXBfZGVidWdfYnVmZmVyKCk7CisgICAgI2VuZGlmCisKKyAgICAjaWYgS01QX09TX1dJTkRPV1MKKyAgICAgICAgX19rbXBfY2xvc2VfY29uc29sZSgpOworICAgICNlbmRpZgorCisgICAgX19rbXBfZmluaV9hbGxvY2F0b3IoKTsKKworfSAvLyBfX2ttcF9pbnRlcm5hbF9lbmRfbGlicmFyeQorCit2b2lkCitfX2ttcF9pbnRlcm5hbF9lbmRfdGhyZWFkKCBpbnQgZ3RpZF9yZXEgKQoreworICAgIGludCBpOworCisgICAgLyogaWYgd2UgaGF2ZSBhbHJlYWR5IGNsZWFuZWQgdXAsIGRvbid0IHRyeSBhZ2FpbiwgaXQgd291bGRuJ3QgYmUgcHJldHR5ICovCisgICAgLyogdGhpcyBzaG91bGRuJ3QgYmUgYSByYWNlIGNvbmRpdGlvbiBiZWNhdXNlIF9fa21wX2ludGVybmFsX2VuZCgpIGlzIHRoZQorICAgICAqIG9ubHkgcGxhY2UgdG8gY2xlYXIgX19rbXBfc2VyaWFsX2luaXQgKi8KKyAgICAvKiB3ZSdsbCBjaGVjayB0aGlzIGxhdGVyIHRvbywgYWZ0ZXIgd2UgZ2V0IHRoZSBsb2NrICovCisgICAgLy8gMjAwOS0wOS0wNjogV2UgZG8gbm90IHNldCBnX2Fib3J0IHdpdGhvdXQgc2V0dGluZyBnX2RvbmUuIFRoaXMgY2hlY2sgbG9va3MgcmVkdW5kYW50LAorICAgIC8vIGJlY2F1c2UgdGhlIG5leHQgY2hlY2sgd2lsbCB3b3JrIGluIGFueSBjYXNlLgorICAgIGlmKCBfX2ttcF9nbG9iYWwuZy5nX2Fib3J0ICkgeworICAgICAgICBLQV9UUkFDRSggMTEsICgiX19rbXBfaW50ZXJuYWxfZW5kX3RocmVhZDogYWJvcnQsIGV4aXRpbmdcbiIgKSk7CisgICAgICAgIC8qIFRPRE8gYWJvcnQ/ICovCisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYoIFRDUl80KF9fa21wX2dsb2JhbC5nLmdfZG9uZSkgfHwgIV9fa21wX2luaXRfc2VyaWFsICkgeworICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfaW50ZXJuYWxfZW5kX3RocmVhZDogYWxyZWFkeSBmaW5pc2hlZFxuIiApKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgLyogZmluZCBvdXQgd2hvIHdlIGFyZSBhbmQgd2hhdCB3ZSBzaG91bGQgZG8gKi8KKyAgICB7CisgICAgICAgIGludCBndGlkID0gKGd0aWRfcmVxPj0wKSA/IGd0aWRfcmVxIDogX19rbXBfZ3RpZF9nZXRfc3BlY2lmaWMoKTsKKyAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2ludGVybmFsX2VuZF90aHJlYWQ6IGVudGVyIFQjJWQgICglZClcbiIsIGd0aWQsIGd0aWRfcmVxICkpOworICAgICAgICBpZiggZ3RpZCA9PSBLTVBfR1RJRF9TSFVURE9XTiApIHsKKyAgICAgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9pbnRlcm5hbF9lbmRfdGhyZWFkOiAhX19rbXBfaW5pdF9ydW50aW1lLCBzeXN0ZW0gYWxyZWFkeSBzaHV0ZG93blxuIiApKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIGlmKCBndGlkID09IEtNUF9HVElEX01PTklUT1IgKSB7CisgICAgICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfaW50ZXJuYWxfZW5kX3RocmVhZDogbW9uaXRvciB0aHJlYWQsIGd0aWQgbm90IHJlZ2lzdGVyZWQsIG9yIHN5c3RlbSBzaHV0ZG93blxuIiApKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIGlmKCBndGlkID09IEtNUF9HVElEX0RORSApIHsKKyAgICAgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9pbnRlcm5hbF9lbmRfdGhyZWFkOiBndGlkIG5vdCByZWdpc3RlcmVkIG9yIHN5c3RlbSBzaHV0ZG93blxuIiApKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIC8qIHdlIGRvbid0IGtub3cgd2hvIHdlIGFyZSAqLworICAgICAgICB9IGVsc2UgaWYoIEtNUF9VQkVSX0dUSUQoIGd0aWQgKSkgeworICAgICAgICAvKiB1bnJlZ2lzdGVyIG91cnNlbHZlcyBhcyBhbiB1YmVyIHRocmVhZC4gIGd0aWQgaXMgbm8gbG9uZ2VyIHZhbGlkICovCisgICAgICAgICAgICBpZiggX19rbXBfcm9vdFtndGlkXS0+ci5yX2FjdGl2ZSApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9nbG9iYWwuZy5nX2Fib3J0ID0gLTE7CisgICAgICAgICAgICAgICAgVENXX1NZTkNfNChfX2ttcF9nbG9iYWwuZy5nX2RvbmUsIFRSVUUpOworICAgICAgICAgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9pbnRlcm5hbF9lbmRfdGhyZWFkOiByb290IHN0aWxsIGFjdGl2ZSwgYWJvcnQgVCMlZFxuIiwgZ3RpZCApKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9pbnRlcm5hbF9lbmRfdGhyZWFkOiB1bnJlZ2lzdGVyaW5nIHNpYmxpbmcgVCMlZFxuIiwgZ3RpZCApKTsKKyAgICAgICAgICAgICAgICBfX2ttcF91bnJlZ2lzdGVyX3Jvb3RfY3VycmVudF90aHJlYWQoIGd0aWQgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIGp1c3QgYSB3b3JrZXIgdGhyZWFkLCBsZXQncyBsZWF2ZSAqLworICAgICAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2ludGVybmFsX2VuZF90aHJlYWQ6IHdvcmtlciB0aHJlYWQgVCMlZFxuIiwgZ3RpZCApKTsKKworICAgICAgICAgICAgaWYgKCBndGlkID49IDAgKSB7CisgICAgICAgICAgICAgICAga21wX2luZm9fdCAqdGhpc190aHIgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisgICAgICAgICAgICAgICAgaWYgKFRDUl9QVFIodGhpc190aHItPnRoLnRoX3Rhc2tfdGVhbSkgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBfX2ttcF91bnJlZl90YXNrX3RlYW0odGhpc190aHItPnRoLnRoX3Rhc2tfdGVhbSwgdGhpc190aHIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2ludGVybmFsX2VuZF90aHJlYWQ6IHdvcmtlciB0aHJlYWQgZG9uZSwgZXhpdGluZyBUIyVkXG4iLCBndGlkICkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgICNpZiBkZWZpbmVkIEdVSURFRExMX0VYUE9SVFMKKyAgICAvLyBBQzogbGV0cyBub3Qgc2h1dGRvd24gdGhlIExpbnV4KiBPUyBkeW5hbWljIGxpYnJhcnkgYXQgdGhlIGV4aXQgb2YgdWJlciB0aHJlYWQsCisgICAgLy8gICAgIGJlY2F1c2Ugd2Ugd2lsbCBiZXR0ZXIgc2h1dGRvd24gbGF0ZXIgaW4gdGhlIGxpYnJhcnkgZGVzdHJ1Y3Rvci4KKyAgICAvLyAgICAgVGhlIHJlYXNvbiBvZiB0aGlzIGNoYW5nZSBpcyBwZXJmb3JtYW5jZSBwcm9ibGVtIHdoZW4gbm9uLW9wZW5tcCB0aHJlYWQKKyAgICAvLyAgICAgaW4gYSBsb29wIGZvcmtzIGFuZCBqb2lucyBtYW55IG9wZW5tcCB0aHJlYWRzLiBXZSBjYW4gc2F2ZSBhIGxvdCBvZiB0aW1lCisgICAgLy8gICAgIGtlZXBpbmcgd29ya2VyIHRocmVhZHMgYWxpdmUgdW50aWwgdGhlIHByb2dyYW0gc2h1dGRvd24uCisgICAgLy8gT006IFJlbW92ZWQgTGludXgqIE9TIHJlc3RyaWN0aW9uIHRvIGZpeCB0aGUgY3Jhc2ggb24gT1MgWCogKERQRDIwMDIzOTk2NikgYW5kCisgICAgLy8gICAgIFdpbmRvd3MoRFBEMjAwMjg3NDQzKSB0aGF0IG9jY3VycyB3aGVuIHVzaW5nIGNyaXRpY2FsIHNlY3Rpb25zIGZyb20gZm9yZWlnbiB0aHJlYWRzLgorICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfaW50ZXJuYWxfZW5kX3RocmVhZDogZXhpdGluZyBUIyVkXG4iLCBndGlkX3JlcSkgKTsKKyAgICAgICAgcmV0dXJuOworICAgICNlbmRpZgorICAgIC8qIHN5bmNocm9uaXplIHRoZSB0ZXJtaW5hdGlvbiBwcm9jZXNzICovCisgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJl9fa21wX2luaXR6X2xvY2sgKTsKKworICAgIC8qIGhhdmUgd2UgYWxyZWFkeSBmaW5pc2hlZCAqLworICAgIGlmKCBfX2ttcF9nbG9iYWwuZy5nX2Fib3J0ICkgeworICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfaW50ZXJuYWxfZW5kX3RocmVhZDogYWJvcnQsIGV4aXRpbmdcbiIgKSk7CisgICAgICAgIC8qIFRPRE8gYWJvcnQ/ICovCisgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9pbml0el9sb2NrICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYoIFRDUl80KF9fa21wX2dsb2JhbC5nLmdfZG9uZSkgfHwgIV9fa21wX2luaXRfc2VyaWFsICkgeworICAgICAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfaW5pdHpfbG9jayApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogV2UgbmVlZCB0aGlzIGxvY2sgdG8gZW5mb3JjZSBtdXRleCBiZXR3ZWVuIHRoaXMgcmVhZGluZyBvZgorICAgICAgIF9fa21wX3RocmVhZHNfY2FwYWNpdHkgYW5kIHRoZSB3cml0aW5nIGJ5IF9fa21wX3JlZ2lzdGVyX3Jvb3QuCisgICAgICAgQWx0ZXJuYXRpdmVseSwgd2UgY2FuIHVzZSBhIGNvdW50ZXIgb2Ygcm9vdHMgdGhhdCBpcworICAgICAgIGF0b21pY2FsbHkgdXBkYXRlZCBieSBfX2ttcF9nZXRfZ2xvYmFsX3RocmVhZF9pZF9yZWcsCisgICAgICAgX19rbXBfZG9fc2VyaWFsX2luaXRpYWxpemUgYW5kIF9fa21wX2ludGVybmFsX2VuZF8qLgorICAgICovCisKKyAgICAvKiBzaG91bGQgd2UgZmluaXNoIHRoZSBydW4tdGltZT8gIGFyZSBhbGwgc2libGluZ3MgZG9uZT8gKi8KKyAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfZm9ya2pvaW5fbG9jayApOworCisgICAgZm9yICggaSA9IDA7IGkgPCBfX2ttcF90aHJlYWRzX2NhcGFjaXR5OyArKyBpICkgeworICAgICAgICBpZiAoIEtNUF9VQkVSX0dUSUQoIGkgKSApIHsKKyAgICAgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9pbnRlcm5hbF9lbmRfdGhyZWFkOiByZW1haW5pbmcgc2libGluZyB0YXNrOiBndGlkPT0lZFxuIiwgaSApKTsKKyAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9mb3Jram9pbl9sb2NrICk7CisgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfaW5pdHpfbG9jayApOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9OworICAgIH0KKworICAgIC8qIG5vdyB3ZSBjYW4gc2FmZWx5IGNvbmR1Y3QgdGhlIGFjdHVhbCB0ZXJtaW5hdGlvbiAqLworCisgICAgX19rbXBfaW50ZXJuYWxfZW5kKCk7CisKKyAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfZm9ya2pvaW5fbG9jayApOworICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9pbml0el9sb2NrICk7CisKKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfaW50ZXJuYWxfZW5kX3RocmVhZDogZXhpdCBUIyVkXG4iLCBndGlkX3JlcSApICk7CisKKyAgICAjaWZkZWYgRFVNUF9ERUJVR19PTl9FWElUCisgICAgICAgIGlmICggX19rbXBfZGVidWdfYnVmICkKKyAgICAgICAgICAgIF9fa21wX2R1bXBfZGVidWdfYnVmZmVyKCk7CisgICAgI2VuZGlmCit9IC8vIF9fa21wX2ludGVybmFsX2VuZF90aHJlYWQKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTGlicmFyeSByZWdpc3RyYXRpb24gc3R1ZmYuCisKK3N0YXRpYyBsb25nICAgX19rbXBfcmVnaXN0cmF0aW9uX2ZsYWcgPSAwOworICAgIC8vIFJhbmRvbSB2YWx1ZSB1c2VkIHRvIGluZGljYXRlIGxpYnJhcnkgaW5pdGlhbGl6YXRpb24uCitzdGF0aWMgY2hhciAqIF9fa21wX3JlZ2lzdHJhdGlvbl9zdHIgID0gTlVMTDsKKyAgICAvLyBWYWx1ZSB0byBiZSBzYXZlZCBpbiBlbnYgdmFyIF9fS01QX1JFR0lTVEVSRURfTElCXzxwaWQ+LgorCisKK3N0YXRpYyBpbmxpbmUKK2NoYXIgKgorX19rbXBfcmVnX3N0YXR1c19uYW1lKCkgeworICAgIC8qCisgICAgICAgIE9uIFJIRUwgM3U1IGlmIGxpbmtlZCBzdGF0aWNhbGx5LCBnZXRwaWQoKSByZXR1cm5zIGRpZmZlcmVudCB2YWx1ZXMgaW4gZWFjaCB0aHJlYWQuCisgICAgICAgIElmIHJlZ2lzdHJhdGlvbiBhbmQgdW5yZWdpc3RyYXRpb24gZ28gaW4gZGlmZmVyZW50IHRocmVhZHMgKG9tcF9taXNjX290aGVyX3Jvb3RfZXhpdC5jcHAgdGVzdCBjYXNlKSwKKyAgICAgICAgdGhlIG5hbWUgb2YgcmVnaXN0ZXJlZF9saWJfZW52IGVudiB2YXIgY2FuIG5vdCBiZSBmb3VuZCwgYmVjYXVzZSB0aGUgbmFtZSB3aWxsIGNvbnRhaW4gZGlmZmVyZW50IHBpZC4KKyAgICAqLworICAgIHJldHVybiBfX2ttcF9zdHJfZm9ybWF0KCAiX19LTVBfUkVHSVNURVJFRF9MSUJfJWQiLCAoaW50KSBnZXRwaWQoKSApOworfSAvLyBfX2ttcF9yZWdfc3RhdHVzX2dldAorCisKK3ZvaWQKK19fa21wX3JlZ2lzdGVyX2xpYnJhcnlfc3RhcnR1cCgKKyAgICB2b2lkCispIHsKKworICAgIGNoYXIgKiBuYW1lICAgPSBfX2ttcF9yZWdfc3RhdHVzX25hbWUoKTsgIC8vIE5hbWUgb2YgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlLgorICAgIGludCAgICBkb25lICAgPSAwOworICAgIHVuaW9uIHsKKyAgICAgICAgZG91YmxlIGR0aW1lOworICAgICAgICBsb25nICAgbHRpbWU7CisgICAgfSB0aW1lOworICAgICNpZiBLTVBfT1NfV0lORE9XUworICAgICAgICBfX2ttcF9pbml0aWFsaXplX3N5c3RlbV90aWNrKCk7CisgICAgI2VuZGlmCisgICAgX19rbXBfcmVhZF9zeXN0ZW1fdGltZSggJiB0aW1lLmR0aW1lICk7CisgICAgX19rbXBfcmVnaXN0cmF0aW9uX2ZsYWcgPSAweENBRkUwMDAwTCB8ICggdGltZS5sdGltZSAmIDB4MDAwMEZGRkZMICk7CisgICAgX19rbXBfcmVnaXN0cmF0aW9uX3N0ciA9CisgICAgICAgIF9fa21wX3N0cl9mb3JtYXQoCisgICAgICAgICAgICAiJXAtJWx4LSVzIiwKKyAgICAgICAgICAgICYgX19rbXBfcmVnaXN0cmF0aW9uX2ZsYWcsCisgICAgICAgICAgICBfX2ttcF9yZWdpc3RyYXRpb25fZmxhZywKKyAgICAgICAgICAgIEtNUF9MSUJSQVJZX0ZJTEUKKyAgICAgICAgKTsKKworICAgIEtBX1RSQUNFKCA1MCwgKCAiX19rbXBfcmVnaXN0ZXJfbGlicmFyeV9zdGFydHVwOiAlcz1cIiVzXCJcbiIsIG5hbWUsIF9fa21wX3JlZ2lzdHJhdGlvbl9zdHIgKSApOworCisgICAgd2hpbGUgKCAhIGRvbmUgKSB7CisKKyAgICAgICAgY2hhciAqIHZhbHVlICA9IE5VTEw7IC8vIEFjdHVhbCB2YWx1ZSBvZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUuCisKKyAgICAgICAgLy8gU2V0IGVudmlyb25tZW50IHZhcmlhYmxlLCBidXQgZG8gbm90IG92ZXJ3cml0ZSBpZiBpdCBpcyBleGlzdC4KKyAgICAgICAgX19rbXBfZW52X3NldCggbmFtZSwgX19rbXBfcmVnaXN0cmF0aW9uX3N0ciwgMCApOworICAgICAgICAvLyBDaGVjayB0aGUgdmFyaWFibGUgaXMgd3JpdHRlbi4KKyAgICAgICAgdmFsdWUgPSBfX2ttcF9lbnZfZ2V0KCBuYW1lICk7CisgICAgICAgIGlmICggdmFsdWUgIT0gTlVMTCAmJiBzdHJjbXAoIHZhbHVlLCBfX2ttcF9yZWdpc3RyYXRpb25fc3RyICkgPT0gMCApIHsKKworICAgICAgICAgICAgZG9uZSA9IDE7ICAgIC8vIE9rLCBlbnZpcm9ubWVudCB2YXJpYWJsZSBzZXQgc3VjY2Vzc2Z1bGx5LCBleGl0IHRoZSBsb29wLgorCisgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgIC8vIE9vcHMuIFdyaXRlIGZhaWxlZC4gQW5vdGhlciBjb3B5IG9mIE9wZW5NUCBSVEwgaXMgaW4gbWVtb3J5LgorICAgICAgICAgICAgLy8gQ2hlY2sgd2hldGhlciBpdCBhbGl2ZSBvciBkZWFkLgorICAgICAgICAgICAgaW50ICAgIG5laWdoYm9yID0gMDsgLy8gMCAtLSB1bmtub3duIHN0YXR1cywgMSAtLSBhbGl2ZSwgMiAtLSBkZWFkLgorICAgICAgICAgICAgY2hhciAqIHRhaWwgICAgICAgICAgPSB2YWx1ZTsKKyAgICAgICAgICAgIGNoYXIgKiBmbGFnX2FkZHJfc3RyID0gTlVMTDsKKyAgICAgICAgICAgIGNoYXIgKiBmbGFnX3ZhbF9zdHIgID0gTlVMTDsKKyAgICAgICAgICAgIGNoYXIgY29uc3QgKiBmaWxlX25hbWUgICAgID0gTlVMTDsKKyAgICAgICAgICAgIF9fa21wX3N0cl9zcGxpdCggdGFpbCwgJy0nLCAmIGZsYWdfYWRkcl9zdHIsICYgdGFpbCApOworICAgICAgICAgICAgX19rbXBfc3RyX3NwbGl0KCB0YWlsLCAnLScsICYgZmxhZ192YWxfc3RyLCAgJiB0YWlsICk7CisgICAgICAgICAgICBmaWxlX25hbWUgPSB0YWlsOworICAgICAgICAgICAgaWYgKCB0YWlsICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgbG9uZyAqIGZsYWdfYWRkciA9IDA7CisgICAgICAgICAgICAgICAgbG9uZyAgIGZsYWdfdmFsICA9IDA7CisgICAgICAgICAgICAgICAgc3NjYW5mKCBmbGFnX2FkZHJfc3RyLCAiJXAiLCAgJiBmbGFnX2FkZHIgKTsKKyAgICAgICAgICAgICAgICBzc2NhbmYoIGZsYWdfdmFsX3N0ciwgICIlbHgiLCAmIGZsYWdfdmFsICApOworICAgICAgICAgICAgICAgIGlmICggZmxhZ19hZGRyICE9IDAgJiYgZmxhZ192YWwgIT0gMCAmJiBzdHJjbXAoIGZpbGVfbmFtZSwgIiIgKSAhPSAwICkgeworICAgICAgICAgICAgICAgICAgICAvLyBGaXJzdCwgY2hlY2sgd2hldGhlciBlbnZpcm9ubWVudC1lbmNvZGVkIGFkZHJlc3MgaXMgbWFwcGVkIGludG8gYWRkciBzcGFjZS4KKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgc28sIGRlcmVmZXJlbmNlIGl0IHRvIHNlZSBpZiBpdCBzdGlsbCBoYXMgdGhlIHJpZ2h0IHZhbHVlLgorCisgICAgICAgICAgICAgICAgICAgIGlmICggX19rbXBfaXNfYWRkcmVzc19tYXBwZWQoIGZsYWdfYWRkciApICYmICogZmxhZ19hZGRyID09IGZsYWdfdmFsICkgeworICAgICAgICAgICAgICAgICAgICAgICAgbmVpZ2hib3IgPSAxOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgbm90LCB0aGVuIHdlIGtub3cgdGhlIG90aGVyIGNvcHkgb2YgdGhlIGxpYnJhcnkgaXMgbm8gbG9uZ2VyIHJ1bm5pbmcuCisgICAgICAgICAgICAgICAgICAgICAgICBuZWlnaGJvciA9IDI7CisgICAgICAgICAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICBzd2l0Y2ggKCBuZWlnaGJvciApIHsKKyAgICAgICAgICAgICAgICBjYXNlIDAgOiAgICAgIC8vIENhbm5vdCBwYXJzZSBlbnZpcm9ubWVudCB2YXJpYWJsZSAtLSBuZWlnaGJvciBzdGF0dXMgdW5rbm93bi4KKyAgICAgICAgICAgICAgICAgICAgLy8gQXNzdW1lIGl0IGlzIHRoZSBpbmNvbXBhdGlibGUgZm9ybWF0IG9mIGZ1dHVyZSB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LgorICAgICAgICAgICAgICAgICAgICAvLyBBc3N1bWUgdGhlIG90aGVyIGxpYnJhcnkgaXMgYWxpdmUuCisgICAgICAgICAgICAgICAgICAgIC8vIFdBUk4oIC4uLiApOyAvLyBUT0RPOiBJc3N1ZSBhIHdhcm5pbmcuCisgICAgICAgICAgICAgICAgICAgIGZpbGVfbmFtZSA9ICJ1bmtub3duIGxpYnJhcnkiOworICAgICAgICAgICAgICAgICAgICAvLyBBdHRlbnRpb24hIEZhbGxpbmcgdG8gdGhlIG5leHQgY2FzZS4gVGhhdCdzIGludGVudGlvbmFsLgorICAgICAgICAgICAgICAgIGNhc2UgMSA6IHsgICAgLy8gTmVpZ2hib3IgaXMgYWxpdmUuCisgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGl0IGlzIGFsbG93ZWQuCisgICAgICAgICAgICAgICAgICAgIGNoYXIgKiBkdXBsaWNhdGVfb2sgPSBfX2ttcF9lbnZfZ2V0KCAiS01QX0RVUExJQ0FURV9MSUJfT0siICk7CisgICAgICAgICAgICAgICAgICAgIGlmICggISBfX2ttcF9zdHJfbWF0Y2hfdHJ1ZSggZHVwbGljYXRlX29rICkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGF0J3Mgbm90IGFsbG93ZWQuIElzc3VlIGZhdGFsIGVycm9yLgorICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBEdXBsaWNhdGVMaWJyYXJ5LCBLTVBfTElCUkFSWV9GSUxFLCBmaWxlX25hbWUgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfSE5UKCBEdXBsaWNhdGVMaWJyYXJ5ICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICAgICAgICAgIEtNUF9JTlRFUk5BTF9GUkVFKCBkdXBsaWNhdGVfb2sgKTsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfZHVwbGljYXRlX2xpYnJhcnlfb2sgPSAxOworICAgICAgICAgICAgICAgICAgICBkb25lID0gMTsgICAgLy8gRXhpdCB0aGUgbG9vcC4KKyAgICAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMiA6IHsgICAgLy8gTmVpZ2hib3IgaXMgZGVhZC4KKyAgICAgICAgICAgICAgICAgICAgLy8gQ2xlYXIgdGhlIHZhcmlhYmxlIGFuZCB0cnkgdG8gcmVnaXN0ZXIgbGlicmFyeSBhZ2Fpbi4KKyAgICAgICAgICAgICAgICAgICAgX19rbXBfZW52X3Vuc2V0KCBuYW1lICk7CisgICAgICAgICAgICAgICAgfSAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdCA6IHsKKyAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggMCApOworICAgICAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICB9OyAvLyBzd2l0Y2gKKworICAgICAgICB9OyAvLyBpZgorICAgICAgICBLTVBfSU5URVJOQUxfRlJFRSggKHZvaWQgKikgdmFsdWUgKTsKKworICAgIH07IC8vIHdoaWxlCisgICAgS01QX0lOVEVSTkFMX0ZSRUUoICh2b2lkICopIG5hbWUgKTsKKworfSAvLyBmdW5jIF9fa21wX3JlZ2lzdGVyX2xpYnJhcnlfc3RhcnR1cAorCisKK3ZvaWQKK19fa21wX3VucmVnaXN0ZXJfbGlicmFyeSggdm9pZCApIHsKKworICAgIGNoYXIgKiBuYW1lICA9IF9fa21wX3JlZ19zdGF0dXNfbmFtZSgpOworICAgIGNoYXIgKiB2YWx1ZSA9IF9fa21wX2Vudl9nZXQoIG5hbWUgKTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX3JlZ2lzdHJhdGlvbl9mbGFnICE9IDAgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9yZWdpc3RyYXRpb25fc3RyICAhPSBOVUxMICk7CisgICAgaWYgKCB2YWx1ZSAhPSBOVUxMICYmIHN0cmNtcCggdmFsdWUsIF9fa21wX3JlZ2lzdHJhdGlvbl9zdHIgKSA9PSAwICkgeworICAgICAgICAvLyBPaywgdGhpcyBpcyBvdXIgdmFyaWFibGUuIERlbGV0ZSBpdC4KKyAgICAgICAgX19rbXBfZW52X3Vuc2V0KCBuYW1lICk7CisgICAgfTsgLy8gaWYKKworICAgIEtNUF9JTlRFUk5BTF9GUkVFKCBfX2ttcF9yZWdpc3RyYXRpb25fc3RyICk7CisgICAgS01QX0lOVEVSTkFMX0ZSRUUoIHZhbHVlICk7CisgICAgS01QX0lOVEVSTkFMX0ZSRUUoIG5hbWUgKTsKKworICAgIF9fa21wX3JlZ2lzdHJhdGlvbl9mbGFnID0gMDsKKyAgICBfX2ttcF9yZWdpc3RyYXRpb25fc3RyICA9IE5VTEw7CisKK30gLy8gX19rbXBfdW5yZWdpc3Rlcl9saWJyYXJ5CisKKworLy8gRW5kIG9mIExpYnJhcnkgcmVnaXN0cmF0aW9uIHN0dWZmLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfZG9fc2VyaWFsX2luaXRpYWxpemUoIHZvaWQgKQoreworICAgIGludCBpLCBndGlkOworICAgIGludCBzaXplOworCisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2RvX3NlcmlhbF9pbml0aWFsaXplOiBlbnRlclxuIiApICk7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBzaXplb2YoIGttcF9pbnQzMiApID09IDQgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBzaXplb2YoIGttcF91aW50MzIgKSA9PSA0ICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggc2l6ZW9mKCBrbXBfaW50NjQgKSA9PSA4ICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggc2l6ZW9mKCBrbXBfdWludDY0ICkgPT0gOCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHNpemVvZigga21wX2ludHB0cl90ICkgPT0gc2l6ZW9mKCB2b2lkICogKSApOworCisgICAgX19rbXBfdmFsaWRhdGVfbG9ja3MoKTsKKworICAgIC8qIEluaXRpYWxpemUgaW50ZXJuYWwgbWVtb3J5IGFsbG9jYXRvciAqLworICAgIF9fa21wX2luaXRfYWxsb2NhdG9yKCk7CisKKyAgICAvKiBSZWdpc3RlciB0aGUgbGlicmFyeSBzdGFydHVwIHZpYSBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZQorICAgICAgIGFuZCBjaGVjayB0byBzZWUgd2hldGhlciBhbm90aGVyIGNvcHkgb2YgdGhlIGxpYnJhcnkgaXMgYWxyZWFkeQorICAgICAgIHJlZ2lzdGVyZWQuICovCisKKyAgICBfX2ttcF9yZWdpc3Rlcl9saWJyYXJ5X3N0YXJ0dXAoICk7CisKKyAgICAvKiBUT0RPIHJlaW5pdGlhbGl6YXRpb24gb2YgbGlicmFyeSAqLworICAgIGlmKCBUQ1JfNChfX2ttcF9nbG9iYWwuZy5nX2RvbmUpICkgeworICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9kb19zZXJpYWxfaW5pdGlhbGl6ZTogcmVpbml0aWFsaXphdGlvbiBvZiBsaWJyYXJ5XG4iICkgKTsKKyAgICB9CisKKyAgICBfX2ttcF9nbG9iYWwuZy5nX2Fib3J0ID0gMDsKKyAgICBUQ1dfU1lOQ180KF9fa21wX2dsb2JhbC5nLmdfZG9uZSwgRkFMU0UpOworCisgICAgLyogaW5pdGlhbGl6ZSB0aGUgbG9ja3MgKi8KKyNpZiBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisjaWYgS01QX0RFQlVHX0FEQVBUSVZFX0xPQ0tTCisgICAgX19rbXBfaW5pdF9zcGVjdWxhdGl2ZV9zdGF0cygpOworI2VuZGlmCisjZW5kaWYKKyAgICBfX2ttcF9pbml0X2xvY2soICYgX19rbXBfZ2xvYmFsX2xvY2sgICAgICk7CisgICAgX19rbXBfaW5pdF9xdWV1aW5nX2xvY2soICYgX19rbXBfZGlzcGF0Y2hfbG9jayApOworICAgIF9fa21wX2luaXRfbG9jayggJiBfX2ttcF9kZWJ1Z19sb2NrICAgICAgKTsKKyAgICBfX2ttcF9pbml0X2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrICAgICApOworICAgIF9fa21wX2luaXRfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2tfMWkgICk7CisgICAgX19rbXBfaW5pdF9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9ja18yaSAgKTsKKyAgICBfX2ttcF9pbml0X2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrXzRpICApOworICAgIF9fa21wX2luaXRfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2tfNHIgICk7CisgICAgX19rbXBfaW5pdF9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9ja184aSAgKTsKKyAgICBfX2ttcF9pbml0X2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrXzhyICApOworICAgIF9fa21wX2luaXRfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2tfOGMgICk7CisgICAgX19rbXBfaW5pdF9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9ja18xMHIgKTsKKyAgICBfX2ttcF9pbml0X2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrXzE2ciApOworICAgIF9fa21wX2luaXRfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2tfMTZjICk7CisgICAgX19rbXBfaW5pdF9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9ja18yMGMgKTsKKyAgICBfX2ttcF9pbml0X2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrXzMyYyApOworICAgIF9fa21wX2luaXRfYm9vdHN0cmFwX2xvY2soICYgX19rbXBfZm9ya2pvaW5fbG9jayAgKTsKKyAgICBfX2ttcF9pbml0X2Jvb3RzdHJhcF9sb2NrKCAmIF9fa21wX2V4aXRfbG9jayAgICAgICk7CisgICAgX19rbXBfaW5pdF9ib290c3RyYXBfbG9jayggJiBfX2ttcF9tb25pdG9yX2xvY2sgICApOworICAgIF9fa21wX2luaXRfYm9vdHN0cmFwX2xvY2soICYgX19rbXBfdHBfY2FjaGVkX2xvY2sgKTsKKworICAgIC8qIGNvbmR1Y3QgaW5pdGlhbGl6YXRpb24gYW5kIGluaXRpYWwgc2V0dXAgb2YgY29uZmlndXJhdGlvbiAqLworCisgICAgX19rbXBfcnVudGltZV9pbml0aWFsaXplKCk7CisKKyAgICAvLyBTb21lIGdsb2JhbCB2YXJpYWJsZSBpbml0aWFsaXphdGlvbiBtb3ZlZCBoZXJlIGZyb20ga21wX2Vudl9pbml0aWFsaXplKCkKKyNpZmRlZiBLTVBfREVCVUcKKyAgICBrbXBfZGlhZyA9IDA7CisjZW5kaWYKKyAgICBfX2ttcF9hYm9ydF9kZWxheSA9IDA7CisKKyAgICAvLyBGcm9tIF9fa21wX2luaXRfZGZsdF90ZWFtX250aCgpCisgICAgLyogYXNzdW1lIHRoZSBlbnRpcmUgbWFjaGluZSB3aWxsIGJlIHVzZWQgKi8KKyAgICBfX2ttcF9kZmx0X3RlYW1fbnRoX3ViID0gX19rbXBfeHByb2M7CisgICAgaWYoIF9fa21wX2RmbHRfdGVhbV9udGhfdWIgPCBLTVBfTUlOX05USCApIHsKKyAgICAgICAgX19rbXBfZGZsdF90ZWFtX250aF91YiA9IEtNUF9NSU5fTlRIOworICAgIH0KKyAgICBpZiggX19rbXBfZGZsdF90ZWFtX250aF91YiA+IF9fa21wX3N5c19tYXhfbnRoICkgeworICAgICAgICBfX2ttcF9kZmx0X3RlYW1fbnRoX3ViID0gX19rbXBfc3lzX21heF9udGg7CisgICAgfQorICAgIF9fa21wX21heF9udGggPSBfX2ttcF9zeXNfbWF4X250aDsKKworICAgIC8vIFRocmVlIHZhcnMgYmVsb3cgbW92ZWQgaGVyZSBmcm9tIF9fa21wX2Vudl9pbml0aWFsaXplKCkgIktNUF9CTE9DS1RJTUUiIHBhcnQKKyAgICBfX2ttcF9kZmx0X2Jsb2NrdGltZSA9IEtNUF9ERUZBVUxUX0JMT0NLVElNRTsKKyAgICBfX2ttcF9tb25pdG9yX3dha2V1cHMgPSBLTVBfV0FLRVVQU19GUk9NX0JMT0NLVElNRSggX19rbXBfZGZsdF9ibG9ja3RpbWUsIF9fa21wX21vbml0b3Jfd2FrZXVwcyApOworICAgIF9fa21wX2J0X2ludGVydmFscyA9IEtNUF9JTlRFUlZBTFNfRlJPTV9CTE9DS1RJTUUoIF9fa21wX2RmbHRfYmxvY2t0aW1lLCBfX2ttcF9tb25pdG9yX3dha2V1cHMgKTsKKyAgICAvLyBGcm9tICJLTVBfTElCUkFSWSIgcGFydCBvZiBfX2ttcF9lbnZfaW5pdGlhbGl6ZSgpCisgICAgX19rbXBfbGlicmFyeSA9IGxpYnJhcnlfdGhyb3VnaHB1dDsKKyAgICAvLyBGcm9tIEtNUF9TQ0hFRFVMRSBpbml0aWFsaXphdGlvbgorICAgIF9fa21wX3N0YXRpYyA9IGttcF9zY2hfc3RhdGljX2JhbGFuY2VkOworICAgIC8vIEFDOiBkbyBub3QgdXNlIGFuYWx5dGljYWwgaGVyZSwgYmVjYXVzZSBpdCBpcyBub24tbW9ub3Rvbm91cworICAgIC8vX19rbXBfZ3VpZGVkID0ga21wX3NjaF9ndWlkZWRfaXRlcmF0aXZlX2NodW5rZWQ7CisgICAgLy9fX2ttcF9hdXRvID0ga21wX3NjaF9ndWlkZWRfYW5hbHl0aWNhbF9jaHVua2VkOyAvLyBBQzogaXQgaXMgdGhlIGRlZmF1bHQsIG5vIG5lZWQgdG8gcmVwZWF0ZSBhc3NpZ25tZW50CisgICAgLy8gQmFycmllciBpbml0aWFsaXphdGlvbi4gTW92ZWQgaGVyZSBmcm9tIF9fa21wX2Vudl9pbml0aWFsaXplKCkgQmFycmllciBicmFuY2ggYml0IGNvbnRyb2wgYW5kIGJhcnJpZXIgbWV0aG9kCisgICAgLy8gY29udHJvbCBwYXJ0cworICAgICNpZiBLTVBfRkFTVF9SRURVQ1RJT05fQkFSUklFUgorICAgICAgICAjZGVmaW5lIGttcF9yZWR1Y3Rpb25fYmFycmllcl9nYXRoZXJfYmIgKChpbnQpMSkKKyAgICAgICAgI2RlZmluZSBrbXBfcmVkdWN0aW9uX2JhcnJpZXJfcmVsZWFzZV9iYiAoKGludCkxKQorICAgICAgICAjZGVmaW5lIGttcF9yZWR1Y3Rpb25fYmFycmllcl9nYXRoZXJfcGF0IGJwX2h5cGVyX2JhcgorICAgICAgICAjZGVmaW5lIGttcF9yZWR1Y3Rpb25fYmFycmllcl9yZWxlYXNlX3BhdCBicF9oeXBlcl9iYXIKKyAgICAjZW5kaWYgLy8gS01QX0ZBU1RfUkVEVUNUSU9OX0JBUlJJRVIKKyAgICBmb3IgKCBpPWJzX3BsYWluX2JhcnJpZXI7IGk8YnNfbGFzdF9iYXJyaWVyOyBpKysgKSB7CisgICAgICAgIF9fa21wX2JhcnJpZXJfZ2F0aGVyX2JyYW5jaF9iaXRzIFsgaSBdID0gX19rbXBfYmFycmllcl9nYXRoZXJfYmJfZGZsdDsKKyAgICAgICAgX19rbXBfYmFycmllcl9yZWxlYXNlX2JyYW5jaF9iaXRzWyBpIF0gPSBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfYmJfZGZsdDsKKyAgICAgICAgX19rbXBfYmFycmllcl9nYXRoZXJfcGF0dGVybiBbIGkgXSA9IF9fa21wX2JhcnJpZXJfZ2F0aGVyX3BhdF9kZmx0OworICAgICAgICBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfcGF0dGVyblsgaSBdID0gX19rbXBfYmFycmllcl9yZWxlYXNlX3BhdF9kZmx0OworICAgICAgICAjaWYgS01QX0ZBU1RfUkVEVUNUSU9OX0JBUlJJRVIKKyAgICAgICAgaWYoIGkgPT0gYnNfcmVkdWN0aW9uX2JhcnJpZXIgKSB7IC8vIHRlc3RlZCBhbmQgY29uZmlybWVkIG9uIEFMVElYIG9ubHkgKCBsaW5fNjQgKTogaHlwZXIsMQorICAgICAgICAgICAgX19rbXBfYmFycmllcl9nYXRoZXJfYnJhbmNoX2JpdHMgWyBpIF0gPSBrbXBfcmVkdWN0aW9uX2JhcnJpZXJfZ2F0aGVyX2JiOworICAgICAgICAgICAgX19rbXBfYmFycmllcl9yZWxlYXNlX2JyYW5jaF9iaXRzWyBpIF0gPSBrbXBfcmVkdWN0aW9uX2JhcnJpZXJfcmVsZWFzZV9iYjsKKyAgICAgICAgICAgIF9fa21wX2JhcnJpZXJfZ2F0aGVyX3BhdHRlcm4gWyBpIF0gPSBrbXBfcmVkdWN0aW9uX2JhcnJpZXJfZ2F0aGVyX3BhdDsKKyAgICAgICAgICAgIF9fa21wX2JhcnJpZXJfcmVsZWFzZV9wYXR0ZXJuWyBpIF0gPSBrbXBfcmVkdWN0aW9uX2JhcnJpZXJfcmVsZWFzZV9wYXQ7CisgICAgICAgIH0KKyAgICAgICAgI2VuZGlmIC8vIEtNUF9GQVNUX1JFRFVDVElPTl9CQVJSSUVSCisgICAgfQorICAgICNpZiBLTVBfRkFTVF9SRURVQ1RJT05fQkFSUklFUgorICAgICAgICAjdW5kZWYga21wX3JlZHVjdGlvbl9iYXJyaWVyX3JlbGVhc2VfcGF0CisgICAgICAgICN1bmRlZiBrbXBfcmVkdWN0aW9uX2JhcnJpZXJfZ2F0aGVyX3BhdAorICAgICAgICAjdW5kZWYga21wX3JlZHVjdGlvbl9iYXJyaWVyX3JlbGVhc2VfYmIKKyAgICAgICAgI3VuZGVmIGttcF9yZWR1Y3Rpb25fYmFycmllcl9nYXRoZXJfYmIKKyAgICAjZW5kaWYgLy8gS01QX0ZBU1RfUkVEVUNUSU9OX0JBUlJJRVIKKyAgICAjaWYgS01QX01JQworICAgIC8vIEFDOiBwbGFuZT0zLDIsIGZvcmtqb2luPTIsMSBhcmUgb3B0aW1hbCBmb3IgMjQwIHRocmVhZHMgb24gS05DCisgICAgX19rbXBfYmFycmllcl9nYXRoZXJfYnJhbmNoX2JpdHMgWyBic19wbGFpbl9iYXJyaWVyIF0gPSAzOyAgLy8gcGxhbmUgZ2F0aGVyCisgICAgX19rbXBfYmFycmllcl9yZWxlYXNlX2JyYW5jaF9iaXRzWyBic19mb3Jram9pbl9iYXJyaWVyIF0gPSAxOyAgLy8gZm9ya2pvaW4gcmVsZWFzZQorICAgIF9fa21wX2JhcnJpZXJfZ2F0aGVyX3BhdHRlcm4gWyBic19mb3Jram9pbl9iYXJyaWVyIF0gPSBicF9oaWVyYXJjaGljYWxfYmFyOworICAgIF9fa21wX2JhcnJpZXJfcmVsZWFzZV9wYXR0ZXJuWyBic19mb3Jram9pbl9iYXJyaWVyIF0gPSBicF9oaWVyYXJjaGljYWxfYmFyOworI2lmIEtNUF9GQVNUX1JFRFVDVElPTl9CQVJSSUVSCisgICAgX19rbXBfYmFycmllcl9nYXRoZXJfcGF0dGVybiBbIGJzX3JlZHVjdGlvbl9iYXJyaWVyIF0gPSBicF9oaWVyYXJjaGljYWxfYmFyOworICAgIF9fa21wX2JhcnJpZXJfcmVsZWFzZV9wYXR0ZXJuWyBic19yZWR1Y3Rpb25fYmFycmllciBdID0gYnBfaGllcmFyY2hpY2FsX2JhcjsKKyNlbmRpZgorICAgICNlbmRpZgorCisgICAgLy8gRnJvbSBLTVBfQ0hFQ0tTIGluaXRpYWxpemF0aW9uCisjaWZkZWYgS01QX0RFQlVHCisgICAgX19rbXBfZW52X2NoZWNrcyA9IFRSVUU7ICAgLyogZGV2ZWxvcG1lbnQgdmVyc2lvbnMgaGF2ZSB0aGUgZXh0cmEgY2hlY2tzICovCisjZWxzZQorICAgIF9fa21wX2Vudl9jaGVja3MgPSBGQUxTRTsgIC8qIHBvcnQgdmVyc2lvbnMgZG8gbm90IGhhdmUgdGhlIGV4dHJhIGNoZWNrcyAqLworI2VuZGlmCisKKyAgICAvLyBGcm9tICJLTVBfRk9SRUlHTl9USFJFQURTX1RIUkVBRFBSSVZBVEUiIGluaXRpYWxpemF0aW9uCisgICAgX19rbXBfZm9yZWlnbl90cCA9IFRSVUU7CisKKyAgICBfX2ttcF9nbG9iYWwuZy5nX2R5bmFtaWMgPSBGQUxTRTsKKyAgICBfX2ttcF9nbG9iYWwuZy5nX2R5bmFtaWNfbW9kZSA9IGR5bmFtaWNfZGVmYXVsdDsKKworICAgIF9fa21wX2Vudl9pbml0aWFsaXplKCBOVUxMICk7CisKKyAgICAvLyBQcmludCBhbGwgbWVzc2FnZXMgaW4gbWVzc2FnZSBjYXRhbG9nIGZvciB0ZXN0aW5nIHB1cnBvc2VzLgorICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgY2hhciBjb25zdCAqIHZhbCA9IF9fa21wX2Vudl9nZXQoICJLTVBfRFVNUF9DQVRBTE9HIiApOworICAgICAgICBpZiAoIF9fa21wX3N0cl9tYXRjaF90cnVlKCB2YWwgKSApIHsKKyAgICAgICAgICAgIGttcF9zdHJfYnVmX3QgYnVmZmVyOworICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9pbml0KCAmIGJ1ZmZlciApOworICAgICAgICAgICAgX19rbXBfaTE4bl9kdW1wX2NhdGFsb2coICYgYnVmZmVyICk7CisgICAgICAgICAgICBfX2ttcF9wcmludGYoICIlcyIsIGJ1ZmZlci5zdHIgKTsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfZnJlZSggJiBidWZmZXIgKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgX19rbXBfZW52X2ZyZWUoICYgdmFsICk7CisgICAgI2VuZGlmCisKKyAgICBfX2ttcF90aHJlYWRzX2NhcGFjaXR5ID0gX19rbXBfaW5pdGlhbF90aHJlYWRzX2NhcGFjaXR5KCBfX2ttcF9kZmx0X3RlYW1fbnRoX3ViICk7CisgICAgLy8gTW92ZWQgaGVyZSBmcm9tIF9fa21wX2Vudl9pbml0aWFsaXplKCkgIktNUF9BTExfVEhSRUFEUFJJVkFURSIgcGFydAorICAgIF9fa21wX3RwX2NhcGFjaXR5ID0gX19rbXBfZGVmYXVsdF90cF9jYXBhY2l0eShfX2ttcF9kZmx0X3RlYW1fbnRoX3ViLCBfX2ttcF9tYXhfbnRoLCBfX2ttcF9hbGxUaHJlYWRzU3BlY2lmaWVkKTsKKworCisgICAgLy8gSWYgdGhlIGxpYnJhcnkgaXMgc2h1dCBkb3duIHByb3Blcmx5LCBib3RoIHBvb2xzIG11c3QgYmUgTlVMTC4gSnVzdCBpbiBjYXNlLCBzZXQgdGhlbQorICAgIC8vIHRvIE5VTEwgLS0gc29tZSBtZW1vcnkgbWF5IGxlYWssIGJ1dCBzdWJzZXF1ZW50IGNvZGUgd2lsbCB3b3JrIGV2ZW4gaWYgcG9vbHMgYXJlIG5vdCBmcmVlZC4KKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF90aHJlYWRfcG9vbCA9PSBOVUxMICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfdGhyZWFkX3Bvb2xfaW5zZXJ0X3B0ID09IE5VTEwgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF90ZWFtX3Bvb2wgICA9PSBOVUxMICk7CisgICAgX19rbXBfdGhyZWFkX3Bvb2wgPSBOVUxMOworICAgIF9fa21wX3RocmVhZF9wb29sX2luc2VydF9wdCA9IE5VTEw7CisgICAgX19rbXBfdGVhbV9wb29sICAgPSBOVUxMOworCisgICAgLyogQWxsb2NhdGUgYWxsIG9mIHRoZSB2YXJpYWJsZSBzaXplZCByZWNvcmRzICovCisgICAgLyogTk9URTogX19rbXBfdGhyZWFkc19jYXBhY2l0eSBlbnRyaWVzIGFyZSBhbGxvY2F0ZWQsIGJ1dCB0aGUgYXJyYXlzIGFyZSBleHBhbmRhYmxlICovCisgICAgLyogU2luY2UgYWxsb2NhdGlvbiBpcyBjYWNoZS1hbGlnbmVkLCBqdXN0IGFkZCBleHRyYSBwYWRkaW5nIGF0IHRoZSBlbmQgKi8KKyAgICBzaXplID0gKHNpemVvZihrbXBfaW5mb190KikgKyBzaXplb2Yoa21wX3Jvb3RfdCopKSpfX2ttcF90aHJlYWRzX2NhcGFjaXR5ICsgQ0FDSEVfTElORTsKKyAgICBfX2ttcF90aHJlYWRzID0gKGttcF9pbmZvX3QqKikgX19rbXBfYWxsb2NhdGUoIHNpemUgKTsKKyAgICBfX2ttcF9yb290ICAgID0gKGttcF9yb290X3QqKikgKChjaGFyKilfX2ttcF90aHJlYWRzICsgc2l6ZW9mKGttcF9pbmZvX3QqKSAqIF9fa21wX3RocmVhZHNfY2FwYWNpdHkgKTsKKworICAgIC8qIGluaXQgdGhyZWFkIGNvdW50cyAqLworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2FsbF9udGggPT0gMCApOyAvLyBBc3NlcnRzIGZhaWwgaWYgdGhlIGxpYnJhcnkgaXMgcmVpbml0aWFsaXppbmcgYW5kCisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfbnRoID09IDAgKTsgICAgIC8vIHNvbWV0aGluZyB3YXMgd3JvbmcgaW4gdGVybWluYXRpb24uCisgICAgX19rbXBfYWxsX250aCA9IDA7CisgICAgX19rbXBfbnRoICAgICA9IDA7CisKKyAgICAvKiBzZXR1cCB0aGUgdWJlciBtYXN0ZXIgdGhyZWFkIGFuZCBoaWVyYXJjaHkgKi8KKyAgICBndGlkID0gX19rbXBfcmVnaXN0ZXJfcm9vdCggVFJVRSApOworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9kb19zZXJpYWxfaW5pdGlhbGl6ZSAgVCMlZFxuIiwgZ3RpZCApKTsKKyAgICBLTVBfQVNTRVJUKCBLTVBfVUJFUl9HVElEKCBndGlkICkgKTsKKyAgICBLTVBfQVNTRVJUKCBLTVBfSU5JVElBTF9HVElEKCBndGlkICkgKTsKKworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgX19rbXBfY29tbW9uX2luaXRpYWxpemUoKTsKKworICAgICNpZiBLTVBfT1NfVU5JWAorICAgICAgICAvKiBpbnZva2UgdGhlIGNoaWxkIGZvcmsgaGFuZGxlciAqLworICAgICAgICBfX2ttcF9yZWdpc3Rlcl9hdGZvcmsoKTsKKyAgICAjZW5kaWYKKworICAgICNpZiAhIGRlZmluZWQgR1VJREVETExfRVhQT1JUUworICAgICAgICB7CisgICAgICAgICAgICAvKiBJbnZva2UgdGhlIGV4aXQgaGFuZGxlciB3aGVuIHRoZSBwcm9ncmFtIGZpbmlzaGVzLCBvbmx5IGZvciBzdGF0aWMgbGlicmFyeS4KKyAgICAgICAgICAgICAgIEZvciBkeW5hbWljIGxpYnJhcnksIHdlIGFscmVhZHkgaGF2ZSBfZmluaSBhbmQgRGxsTWFpbi4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaW50IHJjID0gYXRleGl0KCBfX2ttcF9pbnRlcm5hbF9lbmRfYXRleGl0ICk7CisgICAgICAgICAgICBpZiAoIHJjICE9IDAgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfbXNnKCBrbXBfbXNfZmF0YWwsIEtNUF9NU0coIEZ1bmN0aW9uRXJyb3IsICJhdGV4aXQoKSIgKSwgS01QX0VSUiggcmMgKSwgX19rbXBfbXNnX251bGwgKTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgIH0KKyAgICAjZW5kaWYKKworICAgICNpZiBLTVBfSEFORExFX1NJR05BTFMKKyAgICAgICAgI2lmIEtNUF9PU19VTklYCisgICAgICAgICAgICAvKiBOT1RFOiBtYWtlIHN1cmUgdGhhdCB0aGlzIGlzIGNhbGxlZCBiZWZvcmUgdGhlIHVzZXIgaW5zdGFsbHMKKyAgICAgICAgICAgICAqICAgICAgICAgIHRoZWlyIG93biBzaWduYWwgaGFuZGxlcnMgc28gdGhhdCB0aGUgdXNlciBoYW5kbGVycworICAgICAgICAgICAgICogICAgICAgICAgYXJlIGNhbGxlZCBmaXJzdC4gIHRoaXMgd2F5IHRoZXkgY2FuIHJldHVybiBmYWxzZSwKKyAgICAgICAgICAgICAqICAgICAgICAgIG5vdCBjYWxsIG91ciBoYW5kbGVyLCBhdm9pZCB0ZXJtaW5hdGluZyB0aGUgbGlicmFyeSwKKyAgICAgICAgICAgICAqICAgICAgICAgIGFuZCBjb250aW51ZSBleGVjdXRpb24gd2hlcmUgdGhleSBsZWZ0IG9mZi4gKi8KKyAgICAgICAgICAgIF9fa21wX2luc3RhbGxfc2lnbmFscyggRkFMU0UgKTsKKyAgICAgICAgI2VuZGlmIC8qIEtNUF9PU19VTklYICovCisgICAgICAgICNpZiBLTVBfT1NfV0lORE9XUworICAgICAgICAgICAgX19rbXBfaW5zdGFsbF9zaWduYWxzKCBUUlVFICk7CisgICAgICAgICNlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAqLworICAgICNlbmRpZgorCisgICAgLyogd2UgaGF2ZSBmaW5pc2hlZCB0aGUgc2VyaWFsIGluaXRpYWxpemF0aW9uICovCisgICAgX19rbXBfaW5pdF9jb3VudGVyICsrOworCisgICAgX19rbXBfaW5pdF9zZXJpYWwgPSBUUlVFOworCisgICAgaWYgKF9fa21wX3NldHRpbmdzKSB7CisgICAgICAgIF9fa21wX2Vudl9wcmludCgpOworICAgIH0KKworI2lmIE9NUF80MF9FTkFCTEVECisgICAgaWYgKF9fa21wX2Rpc3BsYXlfZW52IHx8IF9fa21wX2Rpc3BsYXlfZW52X3ZlcmJvc2UpIHsKKyAgICAgICAgX19rbXBfZW52X3ByaW50XzIoKTsKKyAgICB9CisjZW5kaWYgLy8gT01QXzQwX0VOQUJMRUQKKworICAgIEtNUF9NQigpOworCisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2RvX3NlcmlhbF9pbml0aWFsaXplOiBleGl0XG4iICkgKTsKK30KKwordm9pZAorX19rbXBfc2VyaWFsX2luaXRpYWxpemUoIHZvaWQgKQoreworICAgIGlmICggX19rbXBfaW5pdF9zZXJpYWwgKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJl9fa21wX2luaXR6X2xvY2sgKTsKKyAgICBpZiAoIF9fa21wX2luaXRfc2VyaWFsICkgeworICAgICAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfaW5pdHpfbG9jayApOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIF9fa21wX2RvX3NlcmlhbF9pbml0aWFsaXplKCk7CisgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJl9fa21wX2luaXR6X2xvY2sgKTsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2RvX21pZGRsZV9pbml0aWFsaXplKCB2b2lkICkKK3sKKyAgICBpbnQgaSwgajsKKyAgICBpbnQgcHJldl9kZmx0X3RlYW1fbnRoOworCisgICAgaWYoICFfX2ttcF9pbml0X3NlcmlhbCApIHsKKyAgICAgICAgX19rbXBfZG9fc2VyaWFsX2luaXRpYWxpemUoKTsKKyAgICB9CisKKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfbWlkZGxlX2luaXRpYWxpemU6IGVudGVyXG4iICkgKTsKKworICAgIC8vCisgICAgLy8gU2F2ZSB0aGUgcHJldmlvdXMgdmFsdWUgZm9yIHRoZSBfX2ttcF9kZmx0X3RlYW1fbnRoIHNvIHRoYXQKKyAgICAvLyB3ZSBjYW4gYXZvaWQgc29tZSByZWluaXRpYWxpemF0aW9uIGlmIGl0IGhhc24ndCBjaGFuZ2VkLgorICAgIC8vCisgICAgcHJldl9kZmx0X3RlYW1fbnRoID0gX19rbXBfZGZsdF90ZWFtX250aDsKKworI2lmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICAvLworICAgIC8vIF9fa21wX2FmZmluaXR5X2luaXRpYWxpemUoKSB3aWxsIHRyeSB0byBzZXQgX19rbXBfbmNvcmVzIHRvIHRoZQorICAgIC8vIG51bWJlciBvZiBjb3JlcyBvbiB0aGUgbWFjaGluZS4KKyAgICAvLworICAgIF9fa21wX2FmZmluaXR5X2luaXRpYWxpemUoKTsKKworICAgIC8vCisgICAgLy8gUnVuIHRocm91Z2ggdGhlIF9fa21wX3RocmVhZHMgYXJyYXkgYW5kIHNldCB0aGUgYWZmaW5pdHkgbWFzaworICAgIC8vIGZvciBlYWNoIHJvb3QgdGhyZWFkIHRoYXQgaXMgY3VycmVudGx5IHJlZ2lzdGVyZWQgd2l0aCB0aGUgUlRMLgorICAgIC8vCisgICAgZm9yICggaSA9IDA7IGkgPCBfX2ttcF90aHJlYWRzX2NhcGFjaXR5OyBpKysgKSB7CisgICAgICAgIGlmICggVENSX1BUUiggX19rbXBfdGhyZWFkc1sgaSBdICkgIT0gTlVMTCApIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3NldF9pbml0X21hc2soIGksIFRSVUUgKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVEICovCisKKyAgICBLTVBfQVNTRVJUKCBfX2ttcF94cHJvYyA+IDAgKTsKKyAgICBpZiAoIF9fa21wX2F2YWlsX3Byb2MgPT0gMCApIHsKKyAgICAgICAgX19rbXBfYXZhaWxfcHJvYyA9IF9fa21wX3hwcm9jOworICAgIH0KKworICAgIC8vIElmIHRoZXJlIHdlcmUgZW1wdHkgcGxhY2VzIGluIG51bV90aHJlYWRzIGxpc3QgKE9NUF9OVU1fVEhSRUFEUz0sLDIsMyksIGNvcnJlY3QgdGhlbSBub3cKKyAgICBqID0gMDsKKyAgICB3aGlsZSAoIF9fa21wX25lc3RlZF9udGgudXNlZCAmJiAhIF9fa21wX25lc3RlZF9udGgubnRoWyBqIF0gKSB7CisgICAgICAgIF9fa21wX25lc3RlZF9udGgubnRoWyBqIF0gPSBfX2ttcF9kZmx0X3RlYW1fbnRoID0gX19rbXBfZGZsdF90ZWFtX250aF91YiA9IF9fa21wX2F2YWlsX3Byb2M7CisgICAgICAgIGorKzsKKyAgICB9CisKKyAgICBpZiAoIF9fa21wX2RmbHRfdGVhbV9udGggPT0gMCApIHsKKyNpZmRlZiBLTVBfREZMVF9OVEhfQ09SRVMKKyAgICAgICAgLy8KKyAgICAgICAgLy8gRGVmYXVsdCAjdGhyZWFkcyA9ICNjb3JlcworICAgICAgICAvLworICAgICAgICBfX2ttcF9kZmx0X3RlYW1fbnRoID0gX19rbXBfbmNvcmVzOworICAgICAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfbWlkZGxlX2luaXRpYWxpemU6IHNldHRpbmcgX19rbXBfZGZsdF90ZWFtX250aCA9IF9fa21wX25jb3JlcyAoJWQpXG4iLAorICAgICAgICAgIF9fa21wX2RmbHRfdGVhbV9udGggKSApOworI2Vsc2UKKyAgICAgICAgLy8KKyAgICAgICAgLy8gRGVmYXVsdCAjdGhyZWFkcyA9ICNhdmFpbGFibGUgT1MgcHJvY3MKKyAgICAgICAgLy8KKyAgICAgICAgX19rbXBfZGZsdF90ZWFtX250aCA9IF9fa21wX2F2YWlsX3Byb2M7CisgICAgICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9taWRkbGVfaW5pdGlhbGl6ZTogc2V0dGluZyBfX2ttcF9kZmx0X3RlYW1fbnRoID0gX19rbXBfYXZhaWxfcHJvYyglZClcbiIsCisgICAgICAgICAgX19rbXBfZGZsdF90ZWFtX250aCApICk7CisjZW5kaWYgLyogS01QX0RGTFRfTlRIX0NPUkVTICovCisgICAgfQorCisgICAgaWYgKCBfX2ttcF9kZmx0X3RlYW1fbnRoIDwgS01QX01JTl9OVEggKSB7CisgICAgICAgIF9fa21wX2RmbHRfdGVhbV9udGggPSBLTVBfTUlOX05USDsKKyAgICB9CisgICAgaWYoIF9fa21wX2RmbHRfdGVhbV9udGggPiBfX2ttcF9zeXNfbWF4X250aCApIHsKKyAgICAgICAgX19rbXBfZGZsdF90ZWFtX250aCA9IF9fa21wX3N5c19tYXhfbnRoOworICAgIH0KKworICAgIC8vCisgICAgLy8gVGhlcmUncyBubyBoYXJtIGluIGNvbnRpbnVpbmcgaWYgdGhlIGZvbGxvd2luZyBjaGVjayBmYWlscywKKyAgICAvLyBidXQgaXQgaW5kaWNhdGVzIGFuIGVycm9yIGluIHRoZSBwcmV2aW91cyBsb2dpYy4KKyAgICAvLworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2RmbHRfdGVhbV9udGggPD0gX19rbXBfZGZsdF90ZWFtX250aF91YiApOworCisgICAgaWYgKCBfX2ttcF9kZmx0X3RlYW1fbnRoICE9IHByZXZfZGZsdF90ZWFtX250aCApIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gUnVuIHRocm91Z2ggdGhlIF9fa21wX3RocmVhZHMgYXJyYXkgYW5kIHNldCB0aGUgbnVtIHRocmVhZHMgaWN2CisgICAgICAgIC8vIGZvciBlYWNoIHJvb3QgdGhyZWFkIHRoYXQgaXMgY3VycmVudGx5IHJlZ2lzdGVyZWQgd2l0aCB0aGUgUlRMCisgICAgICAgIC8vICh3aGljaCBoYXMgbm90IGFscmVhZHkgZXhwbGljaXRseSBzZXQgaXRzIG50aHJlYWRzLXZhciB3aXRoIGEKKyAgICAgICAgLy8gY2FsbCB0byBvbXBfc2V0X251bV90aHJlYWRzKCkpLgorICAgICAgICAvLworICAgICAgICBmb3IgKCBpID0gMDsgaSA8IF9fa21wX3RocmVhZHNfY2FwYWNpdHk7IGkrKyApIHsKKyAgICAgICAgICAgIGttcF9pbmZvX3QgKnRocmVhZCA9IF9fa21wX3RocmVhZHNbIGkgXTsKKyAgICAgICAgICAgIGlmICggdGhyZWFkID09IE5VTEwgKSBjb250aW51ZTsKKyAgICAgICAgICAgIGlmICggdGhyZWFkLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMubnByb2MgIT0gMCApIGNvbnRpbnVlOworCisgICAgICAgICAgICBzZXRfX25wcm9jKCBfX2ttcF90aHJlYWRzWyBpIF0sIF9fa21wX2RmbHRfdGVhbV9udGggKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfbWlkZGxlX2luaXRpYWxpemU6IGZpbmFsIHZhbHVlIGZvciBfX2ttcF9kZmx0X3RlYW1fbnRoID0gJWRcbiIsCisgICAgICBfX2ttcF9kZmx0X3RlYW1fbnRoKSApOworCisjaWZkZWYgS01QX0FESlVTVF9CTE9DS1RJTUUKKyAgICAvKiBBZGp1c3QgYmxvY2t0aW1lIHRvIHplcm8gaWYgbmVjZXNzYXJ5ICovCisgICAgLyogbm93IHRoYXQgX19rbXBfYXZhaWxfcHJvYyBpcyBzZXQgICAgICAqLworICAgIGlmICggIV9fa21wX2Vudl9ibG9ja3RpbWUgJiYgKCBfX2ttcF9hdmFpbF9wcm9jID4gMCApICkgeworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9hdmFpbF9wcm9jID4gMCApOworICAgICAgICBpZiAoIF9fa21wX250aCA+IF9fa21wX2F2YWlsX3Byb2MgKSB7CisgICAgICAgICAgICBfX2ttcF96ZXJvX2J0ID0gVFJVRTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiBLTVBfQURKVVNUX0JMT0NLVElNRSAqLworCisgICAgLyogd2UgaGF2ZSBmaW5pc2hlZCBtaWRkbGUgaW5pdGlhbGl6YXRpb24gKi8KKyAgICBUQ1dfU1lOQ180KF9fa21wX2luaXRfbWlkZGxlLCBUUlVFKTsKKworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9kb19taWRkbGVfaW5pdGlhbGl6ZTogZXhpdFxuIiApICk7Cit9CisKK3ZvaWQKK19fa21wX21pZGRsZV9pbml0aWFsaXplKCB2b2lkICkKK3sKKyAgICBpZiAoIF9fa21wX2luaXRfbWlkZGxlICkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9pbml0el9sb2NrICk7CisgICAgaWYgKCBfX2ttcF9pbml0X21pZGRsZSApIHsKKyAgICAgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJl9fa21wX2luaXR6X2xvY2sgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBfX2ttcF9kb19taWRkbGVfaW5pdGlhbGl6ZSgpOworICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9pbml0el9sb2NrICk7Cit9CisKK3ZvaWQKK19fa21wX3BhcmFsbGVsX2luaXRpYWxpemUoIHZvaWQgKQoreworICAgIGludCBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOyAgICAgIC8vIHRoaXMgbWlnaHQgYmUgYSBuZXcgcm9vdAorCisgICAgLyogc3luY3Jvbml6ZSBwYXJhbGxlbCBpbml0aWFsaXphdGlvbiAoZm9yIHNpYmxpbmcpICovCisgICAgaWYoIFRDUl80KF9fa21wX2luaXRfcGFyYWxsZWwpICkgcmV0dXJuOworICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9pbml0el9sb2NrICk7CisgICAgaWYoIFRDUl80KF9fa21wX2luaXRfcGFyYWxsZWwpICkgeyBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfaW5pdHpfbG9jayApOyByZXR1cm47IH0KKworICAgIC8qIFRPRE8gcmVpbml0aWFsaXphdGlvbiBhZnRlciB3ZSBoYXZlIGFscmVhZHkgc2h1dCBkb3duICovCisgICAgaWYoIFRDUl80KF9fa21wX2dsb2JhbC5nLmdfZG9uZSkgKSB7CisgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9wYXJhbGxlbF9pbml0aWFsaXplOiBhdHRlbXB0IHRvIGluaXQgd2hpbGUgc2h1dHRpbmcgZG93blxuIiApICk7CisgICAgICAgIF9fa21wX2luZmluaXRlX2xvb3AoKTsKKyAgICB9CisKKyAgICAvKiBqYzogVGhlIGxvY2sgX19rbXBfaW5pdHpfbG9jayBpcyBhbHJlYWR5IGhlbGQsIHNvIGNhbGxpbmcgX19rbXBfc2VyaWFsX2luaXRpYWxpemUKKyAgICAgICAgICAgd291bGQgY2F1c2UgYSBkZWFkbG9jay4gIFNvIHdlIGNhbGwgX19rbXBfZG9fc2VyaWFsX2luaXRpYWxpemUgZGlyZWN0bHkuCisgICAgKi8KKyAgICBpZiggIV9fa21wX2luaXRfbWlkZGxlICkgeworICAgICAgICBfX2ttcF9kb19taWRkbGVfaW5pdGlhbGl6ZSgpOworICAgIH0KKworICAgIC8qIGJlZ2luIGluaXRpYWxpemF0aW9uICovCisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX3BhcmFsbGVsX2luaXRpYWxpemU6IGVudGVyXG4iICkgKTsKKyAgICBLTVBfQVNTRVJUKCBLTVBfVUJFUl9HVElEKCBndGlkICkgKTsKKworI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKyAgICAvLworICAgIC8vIFNhdmUgdGhlIEZQIGNvbnRyb2wgcmVncy4KKyAgICAvLyBXb3JrZXIgdGhyZWFkcyB3aWxsIHNldCB0aGVpcnMgdG8gdGhlc2UgdmFsdWVzIGF0IHRocmVhZCBzdGFydHVwLgorICAgIC8vCisgICAgX19rbXBfc3RvcmVfeDg3X2ZwdV9jb250cm9sX3dvcmQoICZfX2ttcF9pbml0X3g4N19mcHVfY29udHJvbF93b3JkICk7CisgICAgX19rbXBfc3RvcmVfbXhjc3IoICZfX2ttcF9pbml0X214Y3NyICk7CisgICAgX19rbXBfaW5pdF9teGNzciAmPSBLTVBfWDg2X01YQ1NSX01BU0s7CisjZW5kaWYgLyogS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCAqLworCisjaWYgS01QX09TX1VOSVgKKyMgaWYgS01QX0hBTkRMRV9TSUdOQUxTCisgICAgLyogIG11c3QgYmUgYWZ0ZXIgX19rbXBfc2VyaWFsX2luaXRpYWxpemUgICovCisgICAgX19rbXBfaW5zdGFsbF9zaWduYWxzKCBUUlVFICk7CisjIGVuZGlmCisjZW5kaWYKKworICAgIF9fa21wX3N1c3BlbmRfaW5pdGlhbGl6ZSgpOworCisjICBpZiBkZWZpbmVkKFVTRV9MT0FEX0JBTEFOQ0UpCisgICAgaWYgKCBfX2ttcF9nbG9iYWwuZy5nX2R5bmFtaWNfbW9kZSA9PSBkeW5hbWljX2RlZmF1bHQgKSB7CisgICAgICAgIF9fa21wX2dsb2JhbC5nLmdfZHluYW1pY19tb2RlID0gZHluYW1pY19sb2FkX2JhbGFuY2U7CisgICAgfQorI2Vsc2UKKyAgICBpZiAoIF9fa21wX2dsb2JhbC5nLmdfZHluYW1pY19tb2RlID09IGR5bmFtaWNfZGVmYXVsdCApIHsKKyAgICAgICAgX19rbXBfZ2xvYmFsLmcuZ19keW5hbWljX21vZGUgPSBkeW5hbWljX3RocmVhZF9saW1pdDsKKyAgICB9CisjZW5kaWYKKworICAgIGlmICggX19rbXBfdmVyc2lvbiApIHsKKyAgICAgICAgX19rbXBfcHJpbnRfdmVyc2lvbl8yKCk7CisgICAgfQorCisgICAgLyogd2UgaGF2ZSBmaW5pc2hlZCBwYXJhbGxlbCBpbml0aWFsaXphdGlvbiAqLworICAgIFRDV19TWU5DXzQoX19rbXBfaW5pdF9wYXJhbGxlbCwgVFJVRSk7CisKKyAgICBLTVBfTUIoKTsKKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfcGFyYWxsZWxfaW5pdGlhbGl6ZTogZXhpdFxuIiApICk7CisKKyAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfaW5pdHpfbG9jayApOworfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkCitfX2ttcF9ydW5fYmVmb3JlX2ludm9rZWRfdGFzayggaW50IGd0aWQsIGludCB0aWQsIGttcF9pbmZvX3QgKnRoaXNfdGhyLAorICBrbXBfdGVhbV90ICp0ZWFtICkKK3sKKyAgICBrbXBfZGlzcF90ICpkaXNwYXRjaDsKKworICAgIEtNUF9NQigpOworCisgICAgLyogbm9uZSBvZiB0aGUgdGhyZWFkcyBoYXZlIGVuY291bnRlcmVkIGFueSBjb25zdHJ1Y3RzLCB5ZXQuICovCisgICAgdGhpc190aHItPnRoLnRoX2xvY2FsLnRoaXNfY29uc3RydWN0ID0gMDsKKyNpZiBLTVBfQ0FDSEVfTUFOQUdFCisgICAgS01QX0NBQ0hFX1BSRUZFVENIKCAmdGhpc190aHItPnRoLnRoX2JhclsgYnNfZm9ya2pvaW5fYmFycmllciBdLmJiLmJfYXJyaXZlZCApOworI2VuZGlmIC8qIEtNUF9DQUNIRV9NQU5BR0UgKi8KKyAgICBkaXNwYXRjaCA9IChrbXBfZGlzcF90ICopVENSX1BUUih0aGlzX3Roci0+dGgudGhfZGlzcGF0Y2gpOworICAgIEtNUF9ERUJVR19BU1NFUlQoIGRpc3BhdGNoICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbS0+dC50X2Rpc3BhdGNoICk7CisgICAgLy9LTVBfREVCVUdfQVNTRVJUKCB0aGlzX3Roci0+dGgudGhfZGlzcGF0Y2ggPT0gJnRlYW0tPnQudF9kaXNwYXRjaFsgdGhpc190aHItPnRoLnRoX2luZm8uZHMuZHNfdGlkIF0gKTsKKworICAgIGRpc3BhdGNoLT50aF9kaXNwX2luZGV4ID0gMDsgICAgLyogcmVzZXQgdGhlIGRpc3BhdGNoIGJ1ZmZlciBjb3VudGVyICovCisKKyAgICBpZiggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkKKyAgICAgICAgX19rbXBfcHVzaF9wYXJhbGxlbCggZ3RpZCwgdGVhbS0+dC50X2lkZW50ICk7CisKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KK30KKwordm9pZAorX19rbXBfcnVuX2FmdGVyX2ludm9rZWRfdGFzayggaW50IGd0aWQsIGludCB0aWQsIGttcF9pbmZvX3QgKnRoaXNfdGhyLAorICBrbXBfdGVhbV90ICp0ZWFtICkKK3sKKyAgICBpZiggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkKKyAgICAgICAgX19rbXBfcG9wX3BhcmFsbGVsKCBndGlkLCB0ZWFtLT50LnRfaWRlbnQgKTsKK30KKworaW50CitfX2ttcF9pbnZva2VfdGFza19mdW5jKCBpbnQgZ3RpZCApCit7CisgICAgaW50ICAgICAgICAgIHJjOworICAgIGludCAgICAgICAgICB0aWQgICAgICA9IF9fa21wX3RpZF9mcm9tX2d0aWQoIGd0aWQgKTsKKyAgICBrbXBfaW5mb190ICAqdGhpc190aHIgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisgICAga21wX3RlYW1fdCAgKnRlYW0gICAgID0gdGhpc190aHItPnRoLnRoX3RlYW07CisKKyAgICBfX2ttcF9ydW5fYmVmb3JlX2ludm9rZWRfdGFzayggZ3RpZCwgdGlkLCB0aGlzX3RociwgdGVhbSApOworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBpZiAoIF9faXR0X3N0YWNrX2NhbGxlcl9jcmVhdGVfcHRyICkgeworICAgICAgICBfX2ttcF9pdHRfc3RhY2tfY2FsbGVlX2VudGVyKCAoX19pdHRfY2FsbGVyKXRlYW0tPnQudF9zdGFja19pZCApOyAvLyBpbmZvcm0gaXR0bm90aWZ5IGFib3V0IGVudGVyaW5nIHVzZXIncyBjb2RlCisgICAgfQorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyNpZiBJTkNMVURFX1NTQ19NQVJLUworICAgIFNTQ19NQVJLX0lOVk9LSU5HKCk7CisjZW5kaWYKKyAgICByYyA9IF9fa21wX2ludm9rZV9taWNyb3Rhc2soIChtaWNyb3Rhc2tfdCkgVENSX1NZTkNfUFRSKHRlYW0tPnQudF9wa2ZuKSwKKyAgICAgIGd0aWQsIHRpZCwgKGludCkgdGVhbS0+dC50X2FyZ2MsICh2b2lkICoqKSB0ZWFtLT50LnRfYXJndiApOworCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIGlmICggX19pdHRfc3RhY2tfY2FsbGVyX2NyZWF0ZV9wdHIgKSB7CisgICAgICAgIF9fa21wX2l0dF9zdGFja19jYWxsZWVfbGVhdmUoIChfX2l0dF9jYWxsZXIpdGVhbS0+dC50X3N0YWNrX2lkICk7IC8vIGluZm9ybSBpdHRub3RpZnkgYWJvdXQgbGVhdmluZyB1c2VyJ3MgY29kZQorICAgIH0KKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAgX19rbXBfcnVuX2FmdGVyX2ludm9rZWRfdGFzayggZ3RpZCwgdGlkLCB0aGlzX3RociwgdGVhbSApOworCisgICAgcmV0dXJuIHJjOworfQorCisjaWYgT01QXzQwX0VOQUJMRUQKK3ZvaWQKK19fa21wX3RlYW1zX21hc3RlciggaW50IGd0aWQgKQoreworICAgIC8vIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYnkgYWxsIG1hc3RlciB0aHJlYWRzIGluIHRlYW1zIGNvbnN0cnVjdAorICAgIGttcF9pbmZvX3QgKnRociA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKyAgICBrbXBfdGVhbV90ICp0ZWFtID0gdGhyLT50aC50aF90ZWFtOworICAgIGlkZW50X3QgICAgICpsb2MgPSAgdGVhbS0+dC50X2lkZW50OworICAgIHRoci0+dGgudGhfc2V0X25wcm9jID0gdGhyLT50aC50aF90ZWFtc19zaXplLm50aDsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aHItPnRoLnRoX3RlYW1zX21pY3JvdGFzayApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRoci0+dGgudGhfc2V0X25wcm9jICk7CisgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX3RlYW1zX21hc3RlcjogVCMlZCwgVGlkICVkLCBtaWNyb3Rhc2sgJXBcbiIsCisgICAgICAgICAgICAgICAgICAgZ3RpZCwgX19rbXBfdGlkX2Zyb21fZ3RpZCggZ3RpZCApLCB0aHItPnRoLnRoX3RlYW1zX21pY3JvdGFzayApICk7CisgICAgLy8gTGF1bmNoIGxlYWd1ZSBvZiB0ZWFtcyBub3csIGJ1dCBub3QgbGV0IHdvcmtlcnMgZXhlY3V0ZQorICAgIC8vICh0aGV5IGhhbmcgb24gZm9yayBiYXJyaWVyIHVudGlsIG5leHQgcGFyYWxsZWwpCisjaWYgSU5DTFVERV9TU0NfTUFSS1MKKyAgICBTU0NfTUFSS19GT1JLSU5HKCk7CisjZW5kaWYKKyAgICBfX2ttcF9mb3JrX2NhbGwoIGxvYywgZ3RpZCwgZm9ya19jb250ZXh0X2ludGVsLAorICAgICAgICAgICAgdGVhbS0+dC50X2FyZ2MsCisgICAgICAgICAgICAobWljcm90YXNrX3QpdGhyLT50aC50aF90ZWFtc19taWNyb3Rhc2ssCisgICAgICAgICAgICBWT0xBVElMRV9DQVNUKGxhdW5jaF90KSBfX2ttcF9pbnZva2VfdGFza19mdW5jLAorICAgICAgICAgICAgTlVMTCApOworI2lmIElOQ0xVREVfU1NDX01BUktTCisgICAgU1NDX01BUktfSk9JTklORygpOworI2VuZGlmCisgICAgX19rbXBfam9pbl9jYWxsKCBsb2MsIGd0aWQsIDEgKTsgLy8gQUM6IGxhc3QgcGFyYW1ldGVyICIxIiBlbGltaW5hdGVzIGpvaW4gYmFycmllciB3aGljaCB3b24ndCB3b3JrIGJlY2F1c2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3b3JrZXIgdGhyZWFkcyBhcmUgaW4gYSBmb3JrIGJhcnJpZXIgd2FpdGluZyBmb3IgbW9yZSBwYXJhbGxlbCByZWdpb25zCit9CisKK2ludAorX19rbXBfaW52b2tlX3RlYW1zX21hc3RlciggaW50IGd0aWQgKQoreworICAgIGttcF9pbmZvX3QgICp0aGlzX3RociA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKyAgICBrbXBfdGVhbV90ICAqdGVhbSAgICAgPSB0aGlzX3Roci0+dGgudGhfdGVhbTsKKyAgICAjaWYgS01QX0RFQlVHCisgICAgaWYgKCAhX19rbXBfdGhyZWFkc1tndGlkXS0+IHRoLnRoX3RlYW0tPnQudF9zZXJpYWxpemVkICkKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggKHZvaWQqKV9fa21wX3RocmVhZHNbZ3RpZF0tPiB0aC50aF90ZWFtLT50LnRfcGtmbiA9PSAodm9pZCopX19rbXBfdGVhbXNfbWFzdGVyICk7CisgICAgI2VuZGlmCisgICAgX19rbXBfcnVuX2JlZm9yZV9pbnZva2VkX3Rhc2soIGd0aWQsIDAsIHRoaXNfdGhyLCB0ZWFtICk7CisgICAgX19rbXBfdGVhbXNfbWFzdGVyKCBndGlkICk7CisgICAgX19rbXBfcnVuX2FmdGVyX2ludm9rZWRfdGFzayggZ3RpZCwgMCwgdGhpc190aHIsIHRlYW0gKTsKKyAgICByZXR1cm4gMTsKK30KKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworCisvKiB0aGlzIHNldHMgdGhlIHJlcXVlc3RlZCBudW1iZXIgb2YgdGhyZWFkcyBmb3IgdGhlIG5leHQgcGFyYWxsZWwgcmVnaW9uCisgKiBlbmNvdW50ZXJlZCBieSB0aGlzIHRlYW0gKi8KKy8qIHNpbmNlIHRoaXMgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBmb3Jram9pbiBjcml0aWNhbCBzZWN0aW9uIGl0CisgKiBzaG91bGQgYXZvaWQgcmFjZSBjb25kaXRpb25zIHdpdGggYXNzeW1tZXRyaWNhbCBuZXN0ZWQgcGFyYWxsZWxpc20gKi8KKwordm9pZAorX19rbXBfcHVzaF9udW1fdGhyZWFkcyggaWRlbnRfdCAqaWQsIGludCBndGlkLCBpbnQgbnVtX3RocmVhZHMgKQoreworICAgIGttcF9pbmZvX3QgKnRociA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisKKyAgICBpZiggbnVtX3RocmVhZHMgPiAwICkKKyAgICAgICAgdGhyLT50aC50aF9zZXRfbnByb2MgPSBudW1fdGhyZWFkczsKK30KKworI2lmIE9NUF80MF9FTkFCTEVECisKKy8qIHRoaXMgc2V0cyB0aGUgcmVxdWVzdGVkIG51bWJlciBvZiB0ZWFtcyBmb3IgdGhlIHRlYW1zIHJlZ2lvbiBhbmQvb3IKKyAqIHRoZSBudW1iZXIgb2YgdGhyZWFkcyBmb3IgdGhlIG5leHQgcGFyYWxsZWwgcmVnaW9uIGVuY291bnRlcmVkICAqLwordm9pZAorX19rbXBfcHVzaF9udW1fdGVhbXMoIGlkZW50X3QgKmlkLCBpbnQgZ3RpZCwgaW50IG51bV90ZWFtcywgaW50IG51bV90aHJlYWRzICkKK3sKKyAgICBrbXBfaW5mb190ICp0aHIgPSBfX2ttcF90aHJlYWRzW2d0aWRdOworICAgIEtNUF9ERUJVR19BU1NFUlQobnVtX3RlYW1zID49IDApOworICAgIEtNUF9ERUJVR19BU1NFUlQobnVtX3RocmVhZHMgPj0gMCk7CisgICAgaWYoIG51bV90ZWFtcyA9PSAwICkgeworICAgICAgICBudW1fdGVhbXMgPSAxOyAgICAvLyBkZWZhdWx0IG51bWJlciBvZiB0ZWFtcyBpcyAxLgorICAgIH0KKyAgICAvLyBTZXQgbnVtYmVyIG9mIHRlYW1zIChudW1iZXIgb2YgdGhyZWFkcyBpbiB0aGUgb3V0ZXIgInBhcmFsbGVsIiBvZiB0aGUgdGVhbXMpCisgICAgdGhyLT50aC50aF9zZXRfbnByb2MgPSB0aHItPnRoLnRoX3RlYW1zX3NpemUubnRlYW1zID0gbnVtX3RlYW1zOworCisgICAgLy8gUmVtZW1iZXIgdGhlIG51bWJlciBvZiB0aHJlYWRzIGZvciBpbm5lciBwYXJhbGxlbCByZWdpb25zCisgICAgaWYoIG51bV90aHJlYWRzID4gMCApIHsKKyAgICAgICAgdGhyLT50aC50aF90ZWFtc19zaXplLm50aCA9IG51bV90aHJlYWRzOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmKCAhVENSXzQoX19rbXBfaW5pdF9taWRkbGUpICkKKyAgICAgICAgICAgIF9fa21wX21pZGRsZV9pbml0aWFsaXplKCk7ICAvLyBnZXQgX19rbXBfYXZhaWxfcHJvYyBjYWxjdWxhdGVkCisgICAgICAgIHRoci0+dGgudGhfdGVhbXNfc2l6ZS5udGggPSBfX2ttcF9hdmFpbF9wcm9jIC8gbnVtX3RlYW1zOworICAgIH0KK30KKworCisvLworLy8gU2V0IHRoZSBwcm9jX2JpbmQgdmFyIHRvIHVzZSBpbiB0aGUgZm9sbG93aW5nIHBhcmFsbGVsIHJlZ2lvbi4KKy8vCit2b2lkCitfX2ttcF9wdXNoX3Byb2NfYmluZCggaWRlbnRfdCAqaWQsIGludCBndGlkLCBrbXBfcHJvY19iaW5kX3QgcHJvY19iaW5kICkKK3sKKyAgICBrbXBfaW5mb190ICp0aHIgPSBfX2ttcF90aHJlYWRzW2d0aWRdOworICAgIHRoci0+dGgudGhfc2V0X3Byb2NfYmluZCA9IHByb2NfYmluZDsKK30KKworI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisKKy8qIExhdW5jaCB0aGUgd29ya2VyIHRocmVhZHMgaW50byB0aGUgbWljcm90YXNrLiAqLworCit2b2lkCitfX2ttcF9pbnRlcm5hbF9mb3JrKCBpZGVudF90ICppZCwgaW50IGd0aWQsIGttcF90ZWFtX3QgKnRlYW0gKQoreworICAgIGttcF9pbmZvX3QgKnRoaXNfdGhyID0gX19rbXBfdGhyZWFkc1tndGlkXTsKKworI2lmZGVmIEtNUF9ERUJVRworICAgIGludCBmOworI2VuZGlmIC8qIEtNUF9ERUJVRyAqLworCisgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbSApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRoaXNfdGhyLT50aC50aF90ZWFtICA9PSAgdGVhbSApOworICAgIEtNUF9BU1NFUlQoICAgICAgIEtNUF9NQVNURVJfR1RJRChndGlkKSApOworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgdGVhbS0+dC50X2NvbnN0cnVjdCA9IDA7ICAgICAgICAgIC8qIG5vIHNpbmdsZSBkaXJlY3RpdmVzIHNlZW4geWV0ICovCisgICAgdGVhbS0+dC50X29yZGVyZWQuZHQudF92YWx1ZSA9IDA7IC8qIHRocmVhZCAwIGVudGVycyB0aGUgb3JkZXJlZCBzZWN0aW9uIGZpcnN0ICovCisKKyAgICAvKiBSZXNldCB0aGUgaWRlbnRpZmllcnMgb24gdGhlIGRpc3BhdGNoIGJ1ZmZlciAqLworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRlYW0tPnQudF9kaXNwX2J1ZmZlciApOworICAgIGlmICggdGVhbS0+dC50X21heF9ucHJvYyA+IDEgKSB7CisgICAgICAgIGludCBpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgIEtNUF9NQVhfRElTUF9CVUY7ICsraSkKKyAgICAgICAgICAgIHRlYW0tPnQudF9kaXNwX2J1ZmZlclsgaSBdLmJ1ZmZlcl9pbmRleCA9IGk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdGVhbS0+dC50X2Rpc3BfYnVmZmVyWyAwIF0uYnVmZmVyX2luZGV4ID0gMDsKKyAgICB9CisKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKyAgICBLTVBfQVNTRVJUKCB0aGlzX3Roci0+dGgudGhfdGVhbSAgPT0gIHRlYW0gKTsKKworI2lmZGVmIEtNUF9ERUJVRworICAgIGZvciggZj0wIDsgZjx0ZWFtLT50LnRfbnByb2MgOyBmKysgKSB7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHRlYW0tPnQudF90aHJlYWRzW2ZdICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF90aHJlYWRzW2ZdLT50aC50aF90ZWFtX25wcm9jID09IHRlYW0tPnQudF9ucHJvYyApOworICAgIH0KKyNlbmRpZiAvKiBLTVBfREVCVUcgKi8KKworICAgIC8qIHJlbGVhc2UgdGhlIHdvcmtlciB0aHJlYWRzIHNvIHRoZXkgbWF5IGJlZ2luIHdvcmtpbmcgKi8KKyAgICBfX2ttcF9mb3JrX2JhcnJpZXIoIGd0aWQsIDAgKTsKK30KKworCit2b2lkCitfX2ttcF9pbnRlcm5hbF9qb2luKCBpZGVudF90ICppZCwgaW50IGd0aWQsIGttcF90ZWFtX3QgKnRlYW0gKQoreworICAgIGttcF9pbmZvX3QgKnRoaXNfdGhyID0gX19rbXBfdGhyZWFkc1tndGlkXTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRlYW0gKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aGlzX3Roci0+dGgudGhfdGVhbSAgPT0gIHRlYW0gKTsKKyAgICBLTVBfQVNTRVJUKCAgICAgICBLTVBfTUFTVEVSX0dUSUQoZ3RpZCkgKTsKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgIC8qIEpvaW4gYmFycmllciBhZnRlciBmb3JrICovCisKKyNpZmRlZiBLTVBfREVCVUcKKyAgICBpZiAoX19rbXBfdGhyZWFkc1tndGlkXSAmJiBfX2ttcF90aHJlYWRzW2d0aWRdLT50aC50aF90ZWFtX25wcm9jICE9IHRlYW0tPnQudF9ucHJvYyApIHsKKyAgICAgICAgX19rbXBfcHJpbnRmKCJHVElEOiAlZCwgX19rbXBfdGhyZWFkc1slZF09JXBcbiIsZ3RpZCwgZ3RpZCwgX19rbXBfdGhyZWFkc1tndGlkXSk7CisgICAgICAgIF9fa21wX3ByaW50ZigiX19rbXBfdGhyZWFkc1slZF0tPnRoLnRoX3RlYW1fbnByb2M9JWQsIFRFQU06ICVwLCB0ZWFtLT50LnRfbnByb2M9JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICBndGlkLCBfX2ttcF90aHJlYWRzW2d0aWRdLT50aC50aF90ZWFtX25wcm9jLCB0ZWFtLCB0ZWFtLT50LnRfbnByb2MpOworICAgICAgICBfX2ttcF9wcmludF9zdHJ1Y3R1cmUoKTsKKyAgICB9CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfdGhyZWFkc1tndGlkXSAmJgorICAgICAgICAgICAgICAgICAgICAgX19rbXBfdGhyZWFkc1tndGlkXS0+dGgudGhfdGVhbV9ucHJvYyA9PSB0ZWFtLT50LnRfbnByb2MgKTsKKyNlbmRpZiAvKiBLTVBfREVCVUcgKi8KKworICAgIF9fa21wX2pvaW5fYmFycmllciggZ3RpZCApOyAgLyogd2FpdCBmb3IgZXZlcnlvbmUgKi8KKworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworICAgIEtNUF9BU1NFUlQoIHRoaXNfdGhyLT50aC50aF90ZWFtICA9PSAgdGVhbSApOworfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZmRlZiBVU0VfTE9BRF9CQUxBTkNFCisKKy8vCisvLyBSZXR1cm4gdGhlIHdvcmtlciB0aHJlYWRzIGFjdGl2ZWx5IHNwaW5uaW5nIGluIHRoZSBob3QgdGVhbSwgaWYgd2UKKy8vIGFyZSBhdCB0aGUgb3V0ZXJtb3N0IGxldmVsIG9mIHBhcmFsbGVsaXNtLiAgT3RoZXJ3aXNlLCByZXR1cm4gMC4KKy8vCitzdGF0aWMgaW50CitfX2ttcF9hY3RpdmVfaG90X3RlYW1fbnByb2MoIGttcF9yb290X3QgKnJvb3QgKQoreworICAgIGludCBpOworICAgIGludCByZXR2YWw7CisgICAga21wX3RlYW1fdCAqaG90X3RlYW07CisKKyAgICBpZiAoIHJvb3QtPnIucl9hY3RpdmUgKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBob3RfdGVhbSA9IHJvb3QtPnIucl9ob3RfdGVhbTsKKyAgICBpZiAoIF9fa21wX2RmbHRfYmxvY2t0aW1lID09IEtNUF9NQVhfQkxPQ0tUSU1FICkgeworICAgICAgICByZXR1cm4gaG90X3RlYW0tPnQudF9ucHJvYyAtIDE7ICAvLyBEb24ndCBjb3VudCBtYXN0ZXIgdGhyZWFkCisgICAgfQorCisgICAgLy8KKyAgICAvLyBTa2lwIHRoZSBtYXN0ZXIgdGhyZWFkIC0gaXQgaXMgYWNjb3VudGVkIGZvciBlbHNld2hlcmUuCisgICAgLy8KKyAgICByZXR2YWwgPSAwOworICAgIGZvciAoIGkgPSAxOyBpIDwgaG90X3RlYW0tPnQudF9ucHJvYzsgaSsrICkgeworICAgICAgICBpZiAoIGhvdF90ZWFtLT50LnRfdGhyZWFkc1tpXS0+dGgudGhfYWN0aXZlICkgeworICAgICAgICAgICAgcmV0dmFsKys7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJldHZhbDsKK30KKworLy8KKy8vIFBlcmZvcm0gYW4gYXV0b21hdGljIGFkanVzdG1lbnQgdG8gdGhlIG51bWJlciBvZgorLy8gdGhyZWFkcyB1c2VkIGJ5IHRoZSBuZXh0IHBhcmFsbGVsIHJlZ2lvbi4KKy8vCitzdGF0aWMgaW50CitfX2ttcF9sb2FkX2JhbGFuY2VfbnByb2MoIGttcF9yb290X3QgKnJvb3QsIGludCBzZXRfbnByb2MgKQoreworICAgIGludCByZXR2YWw7CisgICAgaW50IHBvb2xfYWN0aXZlOworICAgIGludCBob3RfdGVhbV9hY3RpdmU7CisgICAgaW50IHRlYW1fY3Vycl9hY3RpdmU7CisgICAgaW50IHN5c3RlbV9hY3RpdmU7CisKKyAgICBLQl9UUkFDRSggMjAsICgiX19rbXBfbG9hZF9iYWxhbmNlX25wcm9jOiBjYWxsZWQgcm9vdDolcCBzZXRfbnByb2M6JWRcbiIsCisgICAgICAgICAgICAgICAgcm9vdCwgc2V0X25wcm9jICkgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCByb290ICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggcm9vdC0+ci5yX3Jvb3RfdGVhbS0+dC50X3RocmVhZHNbMF0tPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5keW5hbWljID09IFRSVUUgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBzZXRfbnByb2MgPiAxICk7CisKKyAgICBpZiAoIHNldF9ucHJvYyA9PSAxKSB7CisgICAgICAgIEtCX1RSQUNFKCAyMCwgKCJfX2ttcF9sb2FkX2JhbGFuY2VfbnByb2M6IHNlcmlhbCBleGVjdXRpb24uXG4iICkgKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBUaHJlYWRzIHRoYXQgYXJlIGFjdGl2ZSBpbiB0aGUgdGhyZWFkIHBvb2wsIGFjdGl2ZSBpbiB0aGUgaG90IHRlYW0KKyAgICAvLyBmb3IgdGhpcyBwYXJ0aWN1bGFyIHJvb3QgKGlmIHdlIGFyZSBhdCB0aGUgb3V0ZXIgcGFyIGxldmVsKSwgYW5kCisgICAgLy8gdGhlIGN1cnJlbnRseSBleGVjdXRpbmcgdGhyZWFkICh0byBiZWNvbWUgdGhlIG1hc3RlcikgYXJlIGF2YWlsYWJsZQorICAgIC8vIHRvIGFkZCB0byB0aGUgbmV3IHRlYW0sIGJ1dCBhcmUgY3VycmVudGx5IGNvbnRyaWJ1dGluZyB0byB0aGUgc3lzdGVtCisgICAgLy8gbG9hZCwgYW5kIG11c3QgYmUgYWNjb3VudGVkIGZvci4KKyAgICAvLworICAgIHBvb2xfYWN0aXZlID0gVENSXzQoX19rbXBfdGhyZWFkX3Bvb2xfYWN0aXZlX250aCk7CisgICAgaG90X3RlYW1fYWN0aXZlID0gX19rbXBfYWN0aXZlX2hvdF90ZWFtX25wcm9jKCByb290ICk7CisgICAgdGVhbV9jdXJyX2FjdGl2ZSA9IHBvb2xfYWN0aXZlICsgaG90X3RlYW1fYWN0aXZlICsgMTsKKworICAgIC8vCisgICAgLy8gQ2hlY2sgdGhlIHN5c3RlbSBsb2FkLgorICAgIC8vCisgICAgc3lzdGVtX2FjdGl2ZSA9IF9fa21wX2dldF9sb2FkX2JhbGFuY2UoIF9fa21wX2F2YWlsX3Byb2MgKyB0ZWFtX2N1cnJfYWN0aXZlICk7CisgICAgS0JfVFJBQ0UoIDMwLCAoIl9fa21wX2xvYWRfYmFsYW5jZV9ucHJvYzogc3lzdGVtIGFjdGl2ZSA9ICVkIHBvb2wgYWN0aXZlID0gJWQgaG90IHRlYW0gYWN0aXZlID0gJWRcbiIsCisgICAgICBzeXN0ZW1fYWN0aXZlLCBwb29sX2FjdGl2ZSwgaG90X3RlYW1fYWN0aXZlICkgKTsKKworICAgIGlmICggc3lzdGVtX2FjdGl2ZSA8IDAgKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIFRoZXJlIHdhcyBhbiBlcnJvciByZWFkaW5nIHRoZSBuZWNlc3NhcnkgaW5mbyBmcm9tIC9wcm9jLAorICAgICAgICAvLyBzbyB1c2UgdGhlIHRocmVhZCBsaW1pdCBhbGdvcml0aG0gaW5zdGVhZC4gIE9uY2Ugd2Ugc2V0CisgICAgICAgIC8vIF9fa21wX2dsb2JhbC5nLmdfZHluYW1pY19tb2RlID0gZHluYW1pY190aHJlYWRfbGltaXQsCisgICAgICAgIC8vIHdlIHNob3VsZG4ndCB3aW5kIHVwIGdldHRpbmcgYmFjayBoZXJlLgorICAgICAgICAvLworICAgICAgICBfX2ttcF9nbG9iYWwuZy5nX2R5bmFtaWNfbW9kZSA9IGR5bmFtaWNfdGhyZWFkX2xpbWl0OworICAgICAgICBLTVBfV0FSTklORyggQ2FudExvYWRCYWxVc2luZywgIktNUF9EWU5BTUlDX01PREU9dGhyZWFkIGxpbWl0IiApOworCisgICAgICAgIC8vCisgICAgICAgIC8vIE1ha2UgdGhpcyBjYWxsIGJlaGF2ZSBsaWtlIHRoZSB0aHJlYWQgbGltaXQgYWxnb3JpdGhtLgorICAgICAgICAvLworICAgICAgICByZXR2YWwgPSBfX2ttcF9hdmFpbF9wcm9jIC0gX19rbXBfbnRoICsgKHJvb3QtPnIucl9hY3RpdmUgPyAxCisgICAgICAgICAgOiByb290LT5yLnJfaG90X3RlYW0tPnQudF9ucHJvYyk7CisgICAgICAgIGlmICggcmV0dmFsID4gc2V0X25wcm9jICkgeworICAgICAgICAgICAgcmV0dmFsID0gc2V0X25wcm9jOworICAgICAgICB9CisgICAgICAgIGlmICggcmV0dmFsIDwgS01QX01JTl9OVEggKSB7CisgICAgICAgICAgICByZXR2YWwgPSBLTVBfTUlOX05USDsKKyAgICAgICAgfQorCisgICAgICAgIEtCX1RSQUNFKCAyMCwgKCJfX2ttcF9sb2FkX2JhbGFuY2VfbnByb2M6IHRocmVhZCBsaW1pdCBleGl0LiByZXR2YWw6JWRcbiIsIHJldHZhbCApICk7CisgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBUaGVyZSBpcyBhIHNsaWdodCBkZWxheSBpbiB0aGUgbG9hZCBiYWxhbmNlIGFsZ29yaXRobSBpbiBkZXRlY3RpbmcKKyAgICAvLyBuZXcgcnVubmluZyBwcm9jcy4gIFRoZSByZWFsIHN5c3RlbSBsb2FkIGF0IHRoaXMgaW5zdGFudCBzaG91bGQgYmUKKyAgICAvLyBhdCBsZWFzdCBhcyBsYXJnZSBhcyB0aGUgI2FjdGl2ZSBvbXAgdGhyZWFkIHRoYXQgYXJlIGF2YWlsYWJsZSB0bworICAgIC8vIGFkZCB0byB0aGUgdGVhbS4KKyAgICAvLworICAgIGlmICggc3lzdGVtX2FjdGl2ZSA8IHRlYW1fY3Vycl9hY3RpdmUgKSB7CisgICAgICAgIHN5c3RlbV9hY3RpdmUgPSB0ZWFtX2N1cnJfYWN0aXZlOworICAgIH0KKyAgICByZXR2YWwgPSBfX2ttcF9hdmFpbF9wcm9jIC0gc3lzdGVtX2FjdGl2ZSArIHRlYW1fY3Vycl9hY3RpdmU7CisgICAgaWYgKCByZXR2YWwgPiBzZXRfbnByb2MgKSB7CisgICAgICAgIHJldHZhbCA9IHNldF9ucHJvYzsKKyAgICB9CisgICAgaWYgKCByZXR2YWwgPCBLTVBfTUlOX05USCApIHsKKyAgICAgICAgcmV0dmFsID0gS01QX01JTl9OVEg7CisgICAgfQorCisgICAgS0JfVFJBQ0UoIDIwLCAoIl9fa21wX2xvYWRfYmFsYW5jZV9ucHJvYzogZXhpdC4gcmV0dmFsOiVkXG4iLCByZXR2YWwgKSApOworICAgIHJldHVybiByZXR2YWw7Cit9IC8vIF9fa21wX2xvYWRfYmFsYW5jZV9ucHJvYygpCisKKyNlbmRpZiAvKiBVU0VfTE9BRF9CQUxBTkNFICovCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogTk9URTogdGhpcyBpcyBjYWxsZWQgd2l0aCB0aGUgX19rbXBfaW5pdF9sb2NrIGhlbGQgKi8KK3ZvaWQKK19fa21wX2NsZWFudXAoIHZvaWQgKQoreworICAgIGludCBmOworCisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2NsZWFudXA6IGVudGVyXG4iICkgKTsKKworICAgIGlmIChUQ1JfNChfX2ttcF9pbml0X3BhcmFsbGVsKSkgeworI2lmIEtNUF9IQU5ETEVfU0lHTkFMUworICAgICAgICBfX2ttcF9yZW1vdmVfc2lnbmFscygpOworI2VuZGlmCisgICAgICAgIFRDV180KF9fa21wX2luaXRfcGFyYWxsZWwsIEZBTFNFKTsKKyAgICB9CisKKyAgICBpZiAoVENSXzQoX19rbXBfaW5pdF9taWRkbGUpKSB7CisjaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgICAgICBfX2ttcF9hZmZpbml0eV91bmluaXRpYWxpemUoKTsKKyNlbmRpZiAvKiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVEICovCisgICAgICAgIFRDV180KF9fa21wX2luaXRfbWlkZGxlLCBGQUxTRSk7CisgICAgfQorCisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2NsZWFudXA6IGdvIHNlcmlhbCBjbGVhbnVwXG4iICkgKTsKKworICAgIGlmIChfX2ttcF9pbml0X3NlcmlhbCkgeworCisgICAgICAgIF9fa21wX3J1bnRpbWVfZGVzdHJveSgpOworCisgICAgICAgIF9fa21wX2luaXRfc2VyaWFsID0gRkFMU0U7CisgICAgfQorCisgICAgZm9yICggZiA9IDA7IGYgPCBfX2ttcF90aHJlYWRzX2NhcGFjaXR5OyBmKysgKSB7CisgICAgICAgIGlmICggX19rbXBfcm9vdFsgZiBdICE9IE5VTEwgKSB7CisgICAgICAgICAgICBfX2ttcF9mcmVlKCBfX2ttcF9yb290WyBmIF0gKTsKKyAgICAgICAgICAgIF9fa21wX3Jvb3RbIGYgXSA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgX19rbXBfZnJlZSggX19rbXBfdGhyZWFkcyApOworICAgIC8vIF9fa21wX3RocmVhZHMgYW5kIF9fa21wX3Jvb3Qgd2VyZSBhbGxvY2F0ZWQgYXQgb25jZSwgYXMgc2luZ2xlIGJsb2NrLCBzbyB0aGVyZSBpcyBubyBuZWVkIGluCisgICAgLy8gZnJlZWluZyBfX2ttcF9yb290LgorICAgIF9fa21wX3RocmVhZHMgPSBOVUxMOworICAgIF9fa21wX3Jvb3QgICAgPSBOVUxMOworICAgIF9fa21wX3RocmVhZHNfY2FwYWNpdHkgPSAwOworCisgICAgX19rbXBfY2xlYW51cF91c2VyX2xvY2tzKCk7CisKKyAgICAjaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgICAgICBLTVBfSU5URVJOQUxfRlJFRSggKHZvaWQgKikgX19rbXBfY3B1aW5mb19maWxlICk7CisgICAgICAgIF9fa21wX2NwdWluZm9fZmlsZSA9IE5VTEw7CisgICAgI2VuZGlmIC8qIEtNUF9BRkZJTklUWV9TVVBQT1JURUQgKi8KKworICAgI2lmIEtNUF9VU0VfQURBUFRJVkVfTE9DS1MKKyAgICNpZiBLTVBfREVCVUdfQURBUFRJVkVfTE9DS1MKKyAgICAgICBfX2ttcF9wcmludF9zcGVjdWxhdGl2ZV9zdGF0cygpOworICAgI2VuZGlmCisgICAjZW5kaWYKKyAgICBLTVBfSU5URVJOQUxfRlJFRSggX19rbXBfbmVzdGVkX250aC5udGggKTsKKyAgICBfX2ttcF9uZXN0ZWRfbnRoLm50aCA9IE5VTEw7CisgICAgX19rbXBfbmVzdGVkX250aC5zaXplID0gMDsKKyAgICBfX2ttcF9uZXN0ZWRfbnRoLnVzZWQgPSAwOworCisgICAgX19rbXBfaTE4bl9jYXRjbG9zZSgpOworCisjaWYgS01QX1NUQVRTX0VOQUJMRUQKKyAgICBfX2ttcF9hY2N1bXVsYXRlX3N0YXRzX2F0X2V4aXQoKTsKKyAgICBfX2ttcF9zdGF0c19saXN0LmRlYWxsb2NhdGUoKTsKKyNlbmRpZgorCisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2NsZWFudXA6IGV4aXRcbiIgKSApOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitpbnQKK19fa21wX2lnbm9yZV9tcHBiZWcoIHZvaWQgKQoreworICAgIGNoYXIgKmVudjsKKworICAgIGlmICgoZW52ID0gZ2V0ZW52KCAiS01QX0lHTk9SRV9NUFBCRUciICkpICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKF9fa21wX3N0cl9tYXRjaF9mYWxzZSggZW52ICkpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIC8vIEJ5IGRlZmF1bHQgX19rbXBjX2JlZ2luKCkgaXMgbm8tb3AuCisgICAgcmV0dXJuIFRSVUU7Cit9CisKK2ludAorX19rbXBfaWdub3JlX21wcGVuZCggdm9pZCApCit7CisgICAgY2hhciAqZW52OworCisgICAgaWYgKChlbnYgPSBnZXRlbnYoICJLTVBfSUdOT1JFX01QUEVORCIgKSkgIT0gTlVMTCkgeworICAgICAgICBpZiAoX19rbXBfc3RyX21hdGNoX2ZhbHNlKCBlbnYgKSkKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgLy8gQnkgZGVmYXVsdCBfX2ttcGNfZW5kKCkgaXMgbm8tb3AuCisgICAgcmV0dXJuIFRSVUU7Cit9CisKK3ZvaWQKK19fa21wX2ludGVybmFsX2JlZ2luKCB2b2lkICkKK3sKKyAgICBpbnQgZ3RpZDsKKyAgICBrbXBfcm9vdF90ICpyb290OworCisgICAgLyogdGhpcyBpcyBhIHZlcnkgaW1wb3J0YW50IHN0ZXAgYXMgaXQgd2lsbCByZWdpc3RlciBuZXcgc2libGluZyB0aHJlYWRzCisgICAgICogYW5kIGFzc2lnbiB0aGVzZSBuZXcgdWJlciB0aHJlYWRzIGEgbmV3IGd0aWQgKi8KKyAgICBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOworICAgIHJvb3QgPSBfX2ttcF90aHJlYWRzWyBndGlkIF0tPnRoLnRoX3Jvb3Q7CisgICAgS01QX0FTU0VSVCggS01QX1VCRVJfR1RJRCggZ3RpZCApKTsKKworICAgIGlmKCByb290LT5yLnJfYmVnaW4gKSByZXR1cm47CisgICAgX19rbXBfYWNxdWlyZV9sb2NrKCAmcm9vdC0+ci5yX2JlZ2luX2xvY2ssIGd0aWQgKTsKKyAgICBpZiggcm9vdC0+ci5yX2JlZ2luICkgeworICAgICAgICBfX2ttcF9yZWxlYXNlX2xvY2soICYgcm9vdC0+ci5yX2JlZ2luX2xvY2ssIGd0aWQgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHJvb3QtPnIucl9iZWdpbiA9IFRSVUU7CisKKyAgICBfX2ttcF9yZWxlYXNlX2xvY2soICYgcm9vdC0+ci5yX2JlZ2luX2xvY2ssIGd0aWQgKTsKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkCitfX2ttcF91c2VyX3NldF9saWJyYXJ5IChlbnVtIGxpYnJhcnlfdHlwZSBhcmcpCit7CisgICAgaW50IGd0aWQ7CisgICAga21wX3Jvb3RfdCAqcm9vdDsKKyAgICBrbXBfaW5mb190ICp0aHJlYWQ7CisKKyAgICAvKiBmaXJzdCwgbWFrZSBzdXJlIHdlIGFyZSBpbml0aWFsaXplZCBzbyB3ZSBjYW4gZ2V0IG91ciBndGlkICovCisKKyAgICBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOworICAgIHRocmVhZCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKworICAgIHJvb3QgPSB0aHJlYWQtPnRoLnRoX3Jvb3Q7CisKKyAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfdXNlcl9zZXRfbGlicmFyeTogZW50ZXIgVCMlZCwgYXJnOiAlZCwgJWRcbiIsIGd0aWQsIGFyZywgbGlicmFyeV9zZXJpYWwgKSk7CisgICAgaWYgKHJvb3QtPnIucl9pbl9wYXJhbGxlbCkgeyAvKiBNdXN0IGJlIGNhbGxlZCBpbiBzZXJpYWwgc2VjdGlvbiBvZiB0b3AtbGV2ZWwgdGhyZWFkICovCisgICAgICAgIEtNUF9XQVJOSU5HKCBTZXRMaWJyYXJ5SW5jb3JyZWN0Q2FsbCApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3dpdGNoICggYXJnICkgeworICAgIGNhc2UgbGlicmFyeV9zZXJpYWwgOgorICAgICAgICB0aHJlYWQtPnRoLnRoX3NldF9ucHJvYyA9IDA7CisgICAgICAgIHNldF9fbnByb2MoIHRocmVhZCwgMSApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIGxpYnJhcnlfdHVybmFyb3VuZCA6CisgICAgICAgIHRocmVhZC0+dGgudGhfc2V0X25wcm9jID0gMDsKKyAgICAgICAgc2V0X19ucHJvYyggdGhyZWFkLCBfX2ttcF9kZmx0X3RlYW1fbnRoID8gX19rbXBfZGZsdF90ZWFtX250aCA6IF9fa21wX2RmbHRfdGVhbV9udGhfdWIgKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBsaWJyYXJ5X3Rocm91Z2hwdXQgOgorICAgICAgICB0aHJlYWQtPnRoLnRoX3NldF9ucHJvYyA9IDA7CisgICAgICAgIHNldF9fbnByb2MoIHRocmVhZCwgX19rbXBfZGZsdF90ZWFtX250aCA/IF9fa21wX2RmbHRfdGVhbV9udGggOiBfX2ttcF9kZmx0X3RlYW1fbnRoX3ViICk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIEtNUF9GQVRBTCggVW5rbm93bkxpYnJhcnlUeXBlLCBhcmcgKTsKKyAgICB9CisKKyAgICBfX2ttcF9hdXhfc2V0X2xpYnJhcnkgKCBhcmcgKTsKK30KKwordm9pZAorX19rbXBfYXV4X3NldF9zdGFja3NpemUoIHNpemVfdCBhcmcgKQoreworICAgIGlmICghIF9fa21wX2luaXRfc2VyaWFsKQorICAgICAgICBfX2ttcF9zZXJpYWxfaW5pdGlhbGl6ZSgpOworCisjaWYgS01QX09TX0RBUldJTgorICAgIGlmIChhcmcgJiAoMHgxMDAwIC0gMSkpIHsKKyAgICAgICAgYXJnICY9IH4oMHgxMDAwIC0gMSk7CisgICAgICAgIGlmKGFyZyArIDB4MTAwMCkgLyogY2hlY2sgZm9yIG92ZXJmbG93IGlmIHdlIHJvdW5kIHVwICovCisgICAgICAgICAgICBhcmcgKz0gMHgxMDAwOworICAgIH0KKyNlbmRpZgorICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9pbml0el9sb2NrICk7CisKKyAgICAvKiBvbmx5IGNoYW5nZSB0aGUgZGVmYXVsdCBzdGFja3NpemUgYmVmb3JlIHRoZSBmaXJzdCBwYXJhbGxlbCByZWdpb24gKi8KKyAgICBpZiAoISBUQ1JfNChfX2ttcF9pbml0X3BhcmFsbGVsKSkgeworICAgICAgICBzaXplX3QgdmFsdWUgPSBhcmc7ICAgICAgIC8qIGFyZ3VtZW50IGlzIGluIGJ5dGVzICovCisKKyAgICAgICAgaWYgKHZhbHVlIDwgX19rbXBfc3lzX21pbl9zdGtzaXplICkKKyAgICAgICAgICAgIHZhbHVlID0gX19rbXBfc3lzX21pbl9zdGtzaXplIDsKKyAgICAgICAgZWxzZSBpZiAodmFsdWUgPiBLTVBfTUFYX1NUS1NJWkUpCisgICAgICAgICAgICB2YWx1ZSA9IEtNUF9NQVhfU1RLU0laRTsKKworICAgICAgICBfX2ttcF9zdGtzaXplID0gdmFsdWU7CisKKyAgICAgICAgX19rbXBfZW52X3N0a3NpemUgPSBUUlVFOyAgICAvKiB3YXMgS01QX1NUQUNLU0laRSBzcGVjaWZpZWQ/ICovCisgICAgfQorCisgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJl9fa21wX2luaXR6X2xvY2sgKTsKK30KKworLyogc2V0IHRoZSBiZWhhdmlvdXIgb2YgdGhlIHJ1bnRpbWUgbGlicmFyeSAqLworLyogVE9ETyB0aGlzIGNhbiBjYXVzZSBzb21lIG9kZCBiZWhhdmlvdXIgd2l0aCBzaWJsaW5nIHBhcmFsbGVsaXNtLi4uICovCit2b2lkCitfX2ttcF9hdXhfc2V0X2xpYnJhcnkgKGVudW0gbGlicmFyeV90eXBlIGFyZykKK3sKKyAgICBfX2ttcF9saWJyYXJ5ID0gYXJnOworCisgICAgc3dpdGNoICggX19rbXBfbGlicmFyeSApIHsKKyAgICBjYXNlIGxpYnJhcnlfc2VyaWFsIDoKKyAgICAgICAgeworICAgICAgICAgICAgS01QX0lORk9STSggTGlicmFyeUlzU2VyaWFsICk7CisgICAgICAgICAgICAodm9pZCkgX19rbXBfY2hhbmdlX2xpYnJhcnkoIFRSVUUgKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIGxpYnJhcnlfdHVybmFyb3VuZCA6CisgICAgICAgICh2b2lkKSBfX2ttcF9jaGFuZ2VfbGlicmFyeSggVFJVRSApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIGxpYnJhcnlfdGhyb3VnaHB1dCA6CisgICAgICAgICh2b2lkKSBfX2ttcF9jaGFuZ2VfbGlicmFyeSggRkFMU0UgKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgS01QX0ZBVEFMKCBVbmtub3duTGlicmFyeVR5cGUsIGFyZyApOworICAgIH0KK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZAorX19rbXBfYXV4X3NldF9ibG9ja3RpbWUgKGludCBhcmcsIGttcF9pbmZvX3QgKnRocmVhZCwgaW50IHRpZCkKK3sKKyAgICBpbnQgYmxvY2t0aW1lID0gYXJnOyAgICAgICAgLyogYXJndW1lbnQgaXMgaW4gbWlsbGlzZWNvbmRzICovCisgICAgaW50IGJ0X2ludGVydmFsczsKKyAgICBpbnQgYnRfc2V0OworCisgICAgX19rbXBfc2F2ZV9pbnRlcm5hbF9jb250cm9scyggdGhyZWFkICk7CisKKyAgICAvKiBOb3JtYWxpemUgYW5kIHNldCBibG9ja3RpbWUgZm9yIHRoZSB0ZWFtcyAqLworICAgIGlmIChibG9ja3RpbWUgPCBLTVBfTUlOX0JMT0NLVElNRSkKKyAgICAgICAgYmxvY2t0aW1lID0gS01QX01JTl9CTE9DS1RJTUU7CisgICAgZWxzZSBpZiAoYmxvY2t0aW1lID4gS01QX01BWF9CTE9DS1RJTUUpCisgICAgICAgIGJsb2NrdGltZSA9IEtNUF9NQVhfQkxPQ0tUSU1FOworCisgICAgc2V0X19ibG9ja3RpbWVfdGVhbSggdGhyZWFkLT50aC50aF90ZWFtLCB0aWQsIGJsb2NrdGltZSApOworICAgIHNldF9fYmxvY2t0aW1lX3RlYW0oIHRocmVhZC0+dGgudGhfc2VyaWFsX3RlYW0sIDAsIGJsb2NrdGltZSApOworCisgICAgLyogQ2FsY3VsYXRlIGFuZCBzZXQgYmxvY2t0aW1lIGludGVydmFscyBmb3IgdGhlIHRlYW1zICovCisgICAgYnRfaW50ZXJ2YWxzID0gS01QX0lOVEVSVkFMU19GUk9NX0JMT0NLVElNRShibG9ja3RpbWUsIF9fa21wX21vbml0b3Jfd2FrZXVwcyk7CisKKyAgICBzZXRfX2J0X2ludGVydmFsc190ZWFtKCB0aHJlYWQtPnRoLnRoX3RlYW0sIHRpZCwgYnRfaW50ZXJ2YWxzICk7CisgICAgc2V0X19idF9pbnRlcnZhbHNfdGVhbSggdGhyZWFkLT50aC50aF9zZXJpYWxfdGVhbSwgMCwgYnRfaW50ZXJ2YWxzICk7CisKKyAgICAvKiBTZXQgd2hldGhlciBibG9ja3RpbWUgaGFzIGJlZW4gc2V0IHRvICJUUlVFIiAqLworICAgIGJ0X3NldCA9IFRSVUU7CisKKyAgICBzZXRfX2J0X3NldF90ZWFtKCB0aHJlYWQtPnRoLnRoX3RlYW0sIHRpZCwgYnRfc2V0ICk7CisgICAgc2V0X19idF9zZXRfdGVhbSggdGhyZWFkLT50aC50aF9zZXJpYWxfdGVhbSwgMCwgYnRfc2V0ICk7CisgICAgS0ZfVFJBQ0UoMTAsICggImttcF9zZXRfYmxvY2t0aW1lOiBUIyVkKCVkOiVkKSwgYmxvY2t0aW1lPSVkLCBidF9pbnRlcnZhbHM9JWQsIG1vbml0b3JfdXBkYXRlcz0lZFxuIiwKKyAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aWQodGlkLCB0aHJlYWQtPnRoLnRoX3RlYW0pLAorICAgICAgICAgICAgICAgICAgdGhyZWFkLT50aC50aF90ZWFtLT50LnRfaWQsIHRpZCwgYmxvY2t0aW1lLCBidF9pbnRlcnZhbHMsIF9fa21wX21vbml0b3Jfd2FrZXVwcyApICk7Cit9CisKK3ZvaWQKK19fa21wX2F1eF9zZXRfZGVmYXVsdHMoCisgICAgY2hhciBjb25zdCAqIHN0ciwKKyAgICBpbnQgICAgICAgICAgbGVuCispIHsKKyAgICBpZiAoICEgX19rbXBfaW5pdF9zZXJpYWwgKSB7CisgICAgICAgIF9fa21wX3NlcmlhbF9pbml0aWFsaXplKCk7CisgICAgfTsKKyAgICBfX2ttcF9lbnZfaW5pdGlhbGl6ZSggc3RyICk7CisKKyAgICBpZiAoX19rbXBfc2V0dGluZ3MKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICB8fCBfX2ttcF9kaXNwbGF5X2VudiB8fCBfX2ttcF9kaXNwbGF5X2Vudl92ZXJib3NlCisjZW5kaWYgLy8gT01QXzQwX0VOQUJMRUQKKyAgICAgICAgKSB7CisgICAgICAgIF9fa21wX2Vudl9wcmludCgpOworICAgIH0KK30gLy8gX19rbXBfYXV4X3NldF9kZWZhdWx0cworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIGludGVybmFsIGZhc3QgcmVkdWN0aW9uIHJvdXRpbmVzCisgKi8KKworUEFDS0VEX1JFRFVDVElPTl9NRVRIT0RfVAorX19rbXBfZGV0ZXJtaW5lX3JlZHVjdGlvbl9tZXRob2QoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQsCisgICAgICAgIGttcF9pbnQzMiBudW1fdmFycywgc2l6ZV90IHJlZHVjZV9zaXplLCB2b2lkICpyZWR1Y2VfZGF0YSwgdm9pZCAoKnJlZHVjZV9mdW5jKSh2b2lkICpsaHNfZGF0YSwgdm9pZCAqcmhzX2RhdGEpLAorICAgICAgICBrbXBfY3JpdGljYWxfbmFtZSAqbGNrICkKK3sKKworICAgIC8vIERlZmF1bHQgcmVkdWN0aW9uIG1ldGhvZDogY3JpdGljYWwgY29uc3RydWN0ICggbGNrICE9IE5VTEwsIGxpa2UgaW4gY3VycmVudCBQQVJPUFQgKQorICAgIC8vIElmICggcmVkdWNlX2RhdGEhPU5VTEwgJiYgcmVkdWNlX2Z1bmMhPU5VTEwgKTogdGhlIHRyZWUtcmVkdWN0aW9uIG1ldGhvZCBjYW4gYmUgc2VsZWN0ZWQgYnkgUlRMCisgICAgLy8gSWYgbG9jLT5mbGFncyBjb250YWlucyBLTVBfSURFTlRfQVRPTUlDX1JFRFVDRSwgdGhlIGF0b21pYyByZWR1Y2UgbWV0aG9kIGNhbiBiZSBzZWxlY3RlZCBieSBSVEwKKyAgICAvLyBGaW5hbGx5LCBpdCdzIHVwIHRvIE9wZW5NUCBSVEwgdG8gbWFrZSBhIGRlY2lzaW9uIG9uIHdoaWNoIG1ldGhvZCB0byBzZWxlY3QgYW1vbmcgZ2VuZXJhdGVkIGJ5IFBBUk9QVC4KKworICAgIFBBQ0tFRF9SRURVQ1RJT05fTUVUSE9EX1QgcmV0dmFsOworCisgICAgaW50IHRlYW1fc2l6ZTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIGxvYyApOyAgICAvLyBpdCB3b3VsZCBiZSBuaWNlIHRvIHRlc3QgKCBsb2MgIT0gMCApCisgICAgS01QX0RFQlVHX0FTU0VSVCggbGNrICk7ICAgIC8vIGl0IHdvdWxkIGJlIG5pY2UgdG8gdGVzdCAoIGxjayAhPSAwICkKKworICAgICNkZWZpbmUgRkFTVF9SRURVQ1RJT05fQVRPTUlDX01FVEhPRF9HRU5FUkFURUQgKCAoIGxvYy0+ZmxhZ3MgJiAoIEtNUF9JREVOVF9BVE9NSUNfUkVEVUNFICkgKSA9PSAoIEtNUF9JREVOVF9BVE9NSUNfUkVEVUNFICkgKQorICAgICNkZWZpbmUgRkFTVF9SRURVQ1RJT05fVFJFRV9NRVRIT0RfR0VORVJBVEVEICAgKCAoIHJlZHVjZV9kYXRhICkgJiYgKCByZWR1Y2VfZnVuYyApICkKKworICAgIHJldHZhbCA9IGNyaXRpY2FsX3JlZHVjZV9ibG9jazsKKworICAgIHRlYW1fc2l6ZSA9IF9fa21wX2dldF90ZWFtX251bV90aHJlYWRzKCBnbG9iYWxfdGlkICk7IC8vIGFub3RoZXIgY2hvaWNlIG9mIGdldHRpbmcgYSB0ZWFtIHNpemUgKCB3aXRoIDEgZHluYW1pYyBkZWZlcmVuY2UgKSBpcyBzbG93ZXIKKworICAgIGlmKCB0ZWFtX3NpemUgPT0gMSApIHsKKworICAgICAgICByZXR2YWwgPSBlbXB0eV9yZWR1Y2VfYmxvY2s7CisKKyAgICB9IGVsc2UgeworCisgICAgICAgIGludCBhdG9taWNfYXZhaWxhYmxlID0gRkFTVF9SRURVQ1RJT05fQVRPTUlDX01FVEhPRF9HRU5FUkFURUQ7CisgICAgICAgIGludCB0cmVlX2F2YWlsYWJsZSAgID0gRkFTVF9SRURVQ1RJT05fVFJFRV9NRVRIT0RfR0VORVJBVEVEOworCisgICAgICAgICNpZiBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfUFBDNjQgfHwgS01QX0FSQ0hfQUFSQ0g2NAorCisgICAgICAgICAgICAjaWYgS01QX09TX0xJTlVYIHx8IEtNUF9PU19GUkVFQlNEIHx8IEtNUF9PU19XSU5ET1dTIHx8IEtNUF9PU19EQVJXSU4KKyAgICAgICAgICAgICAgICAjaWYgS01QX01JQworICAgICAgICAgICAgICAgICAgICAjZGVmaW5lIFJFRFVDVElPTl9URUFNU0laRV9DVVRPRkYgOAorICAgICAgICAgICAgICAgICNlbHNlIC8vIEtNUF9NSUMKKyAgICAgICAgICAgICAgICAgICAgI2RlZmluZSBSRURVQ1RJT05fVEVBTVNJWkVfQ1VUT0ZGIDQKKyAgICAgICAgICAgICAgICAjZW5kaWYgLy8gS01QX01JQworICAgICAgICAgICAgICAgIGlmKCB0cmVlX2F2YWlsYWJsZSApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIHRlYW1fc2l6ZSA8PSBSRURVQ1RJT05fVEVBTVNJWkVfQ1VUT0ZGICkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBhdG9taWNfYXZhaWxhYmxlICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IGF0b21pY19yZWR1Y2VfYmxvY2s7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBUUkVFX1JFRFVDRV9CTE9DS19XSVRIX1JFRFVDVElPTl9CQVJSSUVSOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICggYXRvbWljX2F2YWlsYWJsZSApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gYXRvbWljX3JlZHVjZV9ibG9jazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgICAgICNlcnJvciAiVW5rbm93biBvciB1bnN1cHBvcnRlZCBPUyIKKyAgICAgICAgICAgICNlbmRpZiAvLyBLTVBfT1NfTElOVVggfHwgS01QX09TX0ZSRUVCU0QgfHwgS01QX09TX1dJTkRPV1MgfHwgS01QX09TX0RBUldJTgorCisgICAgICAgICNlbGlmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9BUk0gfHwgS01QX0FSQ0hfQUFSQ0gKKworICAgICAgICAgICAgI2lmIEtNUF9PU19MSU5VWCB8fCBLTVBfT1NfV0lORE9XUworCisgICAgICAgICAgICAgICAgLy8gYmFzaWMgdHVuaW5nCisKKyAgICAgICAgICAgICAgICBpZiggYXRvbWljX2F2YWlsYWJsZSApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIG51bV92YXJzIDw9IDIgKSB7IC8vICYmICggdGVhbV9zaXplIDw9IDggKSBkdWUgdG8gZmFsc2Utc2hhcmluZyA/Pz8KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IGF0b21pY19yZWR1Y2VfYmxvY2s7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IC8vIG90aGVyd2lzZTogdXNlIGNyaXRpY2FsIHNlY3Rpb24KKworICAgICAgICAgICAgI2VsaWYgS01QX09TX0RBUldJTgorCisgICAgICAgICAgICAgICAgaWYoIGF0b21pY19hdmFpbGFibGUgJiYgKCBudW1fdmFycyA8PSAzICkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBhdG9taWNfcmVkdWNlX2Jsb2NrOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiggdHJlZV9hdmFpbGFibGUgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKCAoIHJlZHVjZV9zaXplID4gKCA5ICogc2l6ZW9mKCBrbXBfcmVhbDY0ICkgKSApICYmICggcmVkdWNlX3NpemUgPCAoIDIwMDAgKiBzaXplb2YoIGttcF9yZWFsNjQgKSApICkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBUUkVFX1JFRFVDRV9CTE9DS19XSVRIX1BMQUlOX0JBUlJJRVI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IC8vIG90aGVyd2lzZTogdXNlIGNyaXRpY2FsIHNlY3Rpb24KKworICAgICAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgICAgICAjZXJyb3IgIlVua25vd24gb3IgdW5zdXBwb3J0ZWQgT1MiCisgICAgICAgICAgICAjZW5kaWYKKworICAgICAgICAjZWxzZQorICAgICAgICAgICAgI2Vycm9yICJVbmtub3duIG9yIHVuc3VwcG9ydGVkIGFyY2hpdGVjdHVyZSIKKyAgICAgICAgI2VuZGlmCisKKyAgICB9CisKKyAgICAvLyBLTVBfRk9SQ0VfUkVEVUNUSU9OCisKKyAgICBpZiggX19rbXBfZm9yY2VfcmVkdWN0aW9uX21ldGhvZCAhPSByZWR1Y3Rpb25fbWV0aG9kX25vdF9kZWZpbmVkICkgeworCisgICAgICAgIFBBQ0tFRF9SRURVQ1RJT05fTUVUSE9EX1QgZm9yY2VkX3JldHZhbDsKKworICAgICAgICBpbnQgYXRvbWljX2F2YWlsYWJsZSwgdHJlZV9hdmFpbGFibGU7CisKKyAgICAgICAgc3dpdGNoKCAoIGZvcmNlZF9yZXR2YWwgPSBfX2ttcF9mb3JjZV9yZWR1Y3Rpb25fbWV0aG9kICkgKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIGNyaXRpY2FsX3JlZHVjZV9ibG9jazoKKyAgICAgICAgICAgICAgICBLTVBfQVNTRVJUKCBsY2sgKTsgICAgICAgICAgICAgIC8vIGxjayBzaG91bGQgYmUgIT0gMAorICAgICAgICAgICAgICAgIGlmKCB0ZWFtX3NpemUgPD0gMSApIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yY2VkX3JldHZhbCA9IGVtcHR5X3JlZHVjZV9ibG9jazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgYXRvbWljX3JlZHVjZV9ibG9jazoKKyAgICAgICAgICAgICAgICBhdG9taWNfYXZhaWxhYmxlID0gRkFTVF9SRURVQ1RJT05fQVRPTUlDX01FVEhPRF9HRU5FUkFURUQ7CisgICAgICAgICAgICAgICAgS01QX0FTU0VSVCggYXRvbWljX2F2YWlsYWJsZSApOyAvLyBhdG9taWNfYXZhaWxhYmxlIHNob3VsZCBiZSAhPSAwCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgdHJlZV9yZWR1Y2VfYmxvY2s6CisgICAgICAgICAgICAgICAgdHJlZV9hdmFpbGFibGUgPSBGQVNUX1JFRFVDVElPTl9UUkVFX01FVEhPRF9HRU5FUkFURUQ7CisgICAgICAgICAgICAgICAgS01QX0FTU0VSVCggdHJlZV9hdmFpbGFibGUgKTsgICAvLyB0cmVlX2F2YWlsYWJsZSBzaG91bGQgYmUgIT0gMAorICAgICAgICAgICAgICAgICNpZiBLTVBfRkFTVF9SRURVQ1RJT05fQkFSUklFUgorICAgICAgICAgICAgICAgIGZvcmNlZF9yZXR2YWwgPSBUUkVFX1JFRFVDRV9CTE9DS19XSVRIX1JFRFVDVElPTl9CQVJSSUVSOworICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQoIDAgKTsgLy8gInVuc3VwcG9ydGVkIG1ldGhvZCBzcGVjaWZpZWQiCisgICAgICAgIH0KKworICAgICAgICByZXR2YWwgPSBmb3JjZWRfcmV0dmFsOworICAgIH0KKworICAgIEtBX1RSQUNFKDEwLCAoICJyZWR1Y3Rpb24gbWV0aG9kIHNlbGVjdGVkPSUwOHhcbiIsIHJldHZhbCApICk7CisKKyAgICAjdW5kZWYgRkFTVF9SRURVQ1RJT05fVFJFRV9NRVRIT0RfR0VORVJBVEVECisgICAgI3VuZGVmIEZBU1RfUkVEVUNUSU9OX0FUT01JQ19NRVRIT0RfR0VORVJBVEVECisKKyAgICByZXR1cm4gKCByZXR2YWwgKTsKK30KKworLy8gdGhpcyBmdW5jdGlvbiBpcyBmb3IgdGVzdGluZyBzZXQvZ2V0L2RldGVybWluZSByZWR1Y2UgbWV0aG9kCitrbXBfaW50MzIKK19fa21wX2dldF9yZWR1Y2VfbWV0aG9kKCB2b2lkICkgeworICAgIHJldHVybiAoICggX19rbXBfZW50cnlfdGhyZWFkKCktPnRoLnRoX2xvY2FsLnBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kICkgPj4gOCApOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9zY2hlZC5jcHAgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfc2NoZWQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0ZmE2MmUKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfc2NoZWQuY3BwCkBAIC0wLDAgKzEsODgzIEBACisvKgorICoga21wX3NjaGVkLmMgLS0gc3RhdGljIHNjaGVkdWxpbmcgLS0gaXRlcmF0aW9uIGluaXRpYWxpemF0aW9uCisgKiAkUmV2aXNpb246IDQzNDU3ICQKKyAqICREYXRlOiAyMDE0LTA5LTE3IDAzOjU3OjIyIC0wNTAwIChXZWQsIDE3IFNlcCAyMDE0KSAkCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKy8qCisgKiBTdGF0aWMgc2NoZWR1bGluZyBpbml0aWFsaXphdGlvbi4KKyAqCisgKiBOT1RFOiB0ZWFtLT50LnRfbnByb2MgaXMgYSBjb25zdGFudCBpbnNpZGUgb2YgYW55IGRpc3BhdGNoIGxvb3AsIGhvd2V2ZXIKKyAqICAgICAgIGl0IG1heSBjaGFuZ2UgdmFsdWVzIGJldHdlZW4gcGFyYWxsZWwgcmVnaW9ucy4gIF9fa21wX21heF9udGgKKyAqICAgICAgIGlzIHRoZSBsYXJnZXN0IHZhbHVlIF9fa21wX250aCBtYXkgdGFrZSwgMSBpcyB0aGUgc21hbGxlc3QuCisgKgorICovCisKKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJrbXBfaTE4bi5oIgorI2luY2x1ZGUgImttcF9zdHIuaCIKKyNpbmNsdWRlICJrbXBfZXJyb3IuaCIKKyNpbmNsdWRlICJrbXBfc3RhdHMuaCIKKyNpbmNsdWRlICJrbXBfaXR0LmgiCisKKy8vIHRlbXBsYXRlIGZvciB0eXBlIGxpbWl0cwordGVtcGxhdGU8IHR5cGVuYW1lIFQgPgorc3RydWN0IGlfbWF4bWluIHsKKyAgICBzdGF0aWMgY29uc3QgVCBteDsKKyAgICBzdGF0aWMgY29uc3QgVCBtbjsKK307Cit0ZW1wbGF0ZTw+CitzdHJ1Y3QgaV9tYXhtaW48IGludCA+IHsKKyAgICBzdGF0aWMgY29uc3QgaW50IG14ID0gMHg3ZmZmZmZmZjsKKyAgICBzdGF0aWMgY29uc3QgaW50IG1uID0gMHg4MDAwMDAwMDsKK307Cit0ZW1wbGF0ZTw+CitzdHJ1Y3QgaV9tYXhtaW48IHVuc2lnbmVkIGludCA+IHsKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG14ID0gMHhmZmZmZmZmZjsKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1uID0gMHgwMDAwMDAwMDsKK307Cit0ZW1wbGF0ZTw+CitzdHJ1Y3QgaV9tYXhtaW48IGxvbmcgbG9uZyA+IHsKKyAgICBzdGF0aWMgY29uc3QgbG9uZyBsb25nIG14ID0gMHg3ZmZmZmZmZmZmZmZmZmZmTEw7CisgICAgc3RhdGljIGNvbnN0IGxvbmcgbG9uZyBtbiA9IDB4ODAwMDAwMDAwMDAwMDAwMExMOworfTsKK3RlbXBsYXRlPD4KK3N0cnVjdCBpX21heG1pbjwgdW5zaWduZWQgbG9uZyBsb25nID4geworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgbXggPSAweGZmZmZmZmZmZmZmZmZmZmZMTDsKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIG1uID0gMHgwMDAwMDAwMDAwMDAwMDAwTEw7Cit9OworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWZkZWYgS01QX0RFQlVHCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHRlbXBsYXRlIGZvciBkZWJ1ZyBwcmludHMgc3BlY2lmaWNhdGlvbiAoIGQsIHUsIGxsZCwgbGx1ICkKKyAgICBjaGFyIGNvbnN0ICogdHJhaXRzX3Q8IGludCA+OjpzcGVjID0gImQiOworICAgIGNoYXIgY29uc3QgKiB0cmFpdHNfdDwgdW5zaWduZWQgaW50ID46OnNwZWMgPSAidSI7CisgICAgY2hhciBjb25zdCAqIHRyYWl0c190PCBsb25nIGxvbmcgPjo6c3BlYyA9ICJsbGQiOworICAgIGNoYXIgY29uc3QgKiB0cmFpdHNfdDwgdW5zaWduZWQgbG9uZyBsb25nID46OnNwZWMgPSAibGx1IjsKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2VuZGlmCisKK3RlbXBsYXRlPCB0eXBlbmFtZSBUID4KK3N0YXRpYyB2b2lkCitfX2ttcF9mb3Jfc3RhdGljX2luaXQoCisgICAgaWRlbnRfdCAgICAgICAgICAgICAgICAgICAgICAgICAgKmxvYywKKyAgICBrbXBfaW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsX3RpZCwKKyAgICBrbXBfaW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZWR0eXBlLAorICAgIGttcF9pbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICpwbGFzdGl0ZXIsCisgICAgVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBsb3dlciwKKyAgICBUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHVwcGVyLAorICAgIHR5cGVuYW1lIHRyYWl0c190PCBUID46OnNpZ25lZF90ICpwc3RyaWRlLAorICAgIHR5cGVuYW1lIHRyYWl0c190PCBUID46OnNpZ25lZF90ICBpbmNyLAorICAgIHR5cGVuYW1lIHRyYWl0c190PCBUID46OnNpZ25lZF90ICBjaHVuaworKSB7CisgICAgS01QX0NPVU5UX0JMT0NLKE9NUF9GT1Jfc3RhdGljKTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190PCBUID46OnVuc2lnbmVkX3QgIFVUOworICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3Q8IFQgPjo6c2lnbmVkX3QgICAgU1Q7CisgICAgLyogIHRoaXMgYWxsIGhhcyB0byBiZSBjaGFuZ2VkIGJhY2sgdG8gVElEIGFuZCBzdWNoLi4gKi8KKyAgICByZWdpc3RlciBrbXBfaW50MzIgICBndGlkID0gZ2xvYmFsX3RpZDsKKyAgICByZWdpc3RlciBrbXBfdWludDMyICB0aWQ7CisgICAgcmVnaXN0ZXIga21wX3VpbnQzMiAgbnRoOworICAgIHJlZ2lzdGVyIFVUICAgICAgICAgIHRyaXBfY291bnQ7CisgICAgcmVnaXN0ZXIga21wX3RlYW1fdCAqdGVhbTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIHBsYXN0aXRlciAmJiBwbG93ZXIgJiYgcHVwcGVyICYmIHBzdHJpZGUgKTsKKyAgICBLRV9UUkFDRSggMTAsICgiX19rbXBjX2Zvcl9zdGF0aWNfaW5pdCBjYWxsZWQgKCVkKVxuIiwgZ2xvYmFsX3RpZCkpOworICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICB7CisgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmOworICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoCisgICAgICAgICAgICAiX19rbXBjX2Zvcl9zdGF0aWNfaW5pdDogVCMlJWQgc2NoZWQ9JSVkIGxpdGVyPSUlZCBpdGVyPSglJSVzLCIgXAorICAgICAgICAgICAgIiAlJSVzLCAlJSVzKSBpbmNyPSUlJXMgY2h1bms9JSUlcyBzaWduZWQ/PCVzPlxuIiwKKyAgICAgICAgICAgIHRyYWl0c190PCBUID46OnNwZWMsIHRyYWl0c190PCBUID46OnNwZWMsIHRyYWl0c190PCBTVCA+OjpzcGVjLAorICAgICAgICAgICAgdHJhaXRzX3Q8IFNUID46OnNwZWMsIHRyYWl0c190PCBTVCA+OjpzcGVjLCB0cmFpdHNfdDwgVCA+OjpzcGVjICk7CisgICAgICAgIEtEX1RSQUNFKDEwMCwgKCBidWZmLCBnbG9iYWxfdGlkLCBzY2hlZHR5cGUsICpwbGFzdGl0ZXIsCisgICAgICAgICAgICAqcGxvd2VyLCAqcHVwcGVyLCAqcHN0cmlkZSwgaW5jciwgY2h1bmsgKSApOworICAgICAgICBfX2ttcF9zdHJfZnJlZSggJmJ1ZmYgKTsKKyAgICB9CisgICAgI2VuZGlmCisKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgX19rbXBfcHVzaF93b3Jrc2hhcmUoIGdsb2JhbF90aWQsIGN0X3BkbywgbG9jICk7CisgICAgICAgIGlmICggaW5jciA9PSAwICkgeworICAgICAgICAgICAgX19rbXBfZXJyb3JfY29uc3RydWN0KCBrbXBfaTE4bl9tc2dfQ25zTG9vcEluY3JaZXJvUHJvaGliaXRlZCwgY3RfcGRvLCBsb2MgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBzcGVjaWFsIGhhbmRsaW5nIGZvciB6ZXJvLXRyaXAgbG9vcHMgKi8KKyAgICBpZiAoIGluY3IgPiAwID8gKCpwdXBwZXIgPCAqcGxvd2VyKSA6ICgqcGxvd2VyIDwgKnB1cHBlcikgKSB7CisgICAgICAgIGlmKCBwbGFzdGl0ZXIgIT0gTlVMTCApCisgICAgICAgICAgICAqcGxhc3RpdGVyID0gRkFMU0U7CisgICAgICAgIC8qIGxlYXZlIHB1cHBlciBhbmQgcGxvd2VyIHNldCB0byBlbnRpcmUgaXRlcmF0aW9uIHNwYWNlICovCisgICAgICAgICpwc3RyaWRlID0gaW5jcjsgICAvKiB2YWx1ZSBzaG91bGQgbmV2ZXIgYmUgdXNlZCAqLworCS8vICAgICAgICAqcGxvd2VyID0gKnB1cHBlciAtIGluY3I7ICAgLy8gbGV0IGNvbXBpbGVyIGJ5cGFzcyB0aGUgaWxsZWdhbCBsb29wIChsaWtlIGZvcihpPTE7aTwxMDtpLS0pKSAgVEhJUyBMSU5FIENBVVNFRCBzaGFwZTJGL2hfdGVzdHNfMS5mIFRPIEhBVkUgQSBGQUlMVVJFIE9OIEEgWkVSTy1UUklQIExPT1AgKGxvd2VyPTEsXAorCSAgdXBwZXI9MCxzdHJpZGU9MSkgLSBKUEggSnVuZSAyMywgMjAwOS4KKyAgICAgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBjaGFyICogYnVmZjsKKyAgICAgICAgICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgICAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoCisgICAgICAgICAgICAgICAgIl9fa21wY19mb3Jfc3RhdGljX2luaXQ6KFpFUk8gVFJJUCkgbGl0ZXI9JSVkIGxvd2VyPSUlJXMgdXBwZXI9JSUlcyBzdHJpZGUgPSAlJSVzIHNpZ25lZD88JXM+LCBsb2MgPSAlJXNcbiIsCisgICAgICAgICAgICAgICAgdHJhaXRzX3Q8IFQgPjo6c3BlYywgdHJhaXRzX3Q8IFQgPjo6c3BlYywgdHJhaXRzX3Q8IFNUID46OnNwZWMsIHRyYWl0c190PCBUID46OnNwZWMgKTsKKyAgICAgICAgICAgIEtEX1RSQUNFKDEwMCwgKCBidWZmLCAqcGxhc3RpdGVyLCAqcGxvd2VyLCAqcHVwcGVyLCAqcHN0cmlkZSwgbG9jLT5wc291cmNlICkgKTsKKyAgICAgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgICAgICB9CisgICAgICAgICNlbmRpZgorICAgICAgICBLRV9UUkFDRSggMTAsICgiX19rbXBjX2Zvcl9zdGF0aWNfaW5pdDogVCMlZCByZXR1cm5cbiIsIGdsb2JhbF90aWQgKSApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgI2lmIE9NUF80MF9FTkFCTEVECisgICAgaWYgKCBzY2hlZHR5cGUgPiBrbXBfb3JkX3VwcGVyICkgeworICAgICAgICAvLyB3ZSBhcmUgaW4gRElTVFJJQlVURSBjb25zdHJ1Y3QKKyAgICAgICAgc2NoZWR0eXBlICs9IGttcF9zY2hfc3RhdGljIC0ga21wX2Rpc3RyaWJ1dGVfc3RhdGljOyAgICAgIC8vIEFDOiBjb252ZXJ0IHRvIHVzdWFsIHNjaGVkdWxlIHR5cGUKKyAgICAgICAgdGlkICA9IF9fa21wX3RocmVhZHNbIGd0aWQgXS0+dGgudGhfdGVhbS0+dC50X21hc3Rlcl90aWQ7CisgICAgICAgIHRlYW0gPSBfX2ttcF90aHJlYWRzWyBndGlkIF0tPnRoLnRoX3RlYW0tPnQudF9wYXJlbnQ7CisgICAgfSBlbHNlCisgICAgI2VuZGlmCisgICAgeworICAgICAgICB0aWQgID0gX19rbXBfdGlkX2Zyb21fZ3RpZCggZ2xvYmFsX3RpZCApOworICAgICAgICB0ZWFtID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdLT50aC50aF90ZWFtOworICAgIH0KKworICAgIC8qIGRldGVybWluZSBpZiAiZm9yIiBsb29wIGlzIGFuIGFjdGl2ZSB3b3Jrc2hhcmluZyBjb25zdHJ1Y3QgKi8KKyAgICBpZiAoIHRlYW0gLT4gdC50X3NlcmlhbGl6ZWQgKSB7CisgICAgICAgIC8qIHNlcmlhbGl6ZWQgcGFyYWxsZWwsIGVhY2ggdGhyZWFkIGV4ZWN1dGVzIHdob2xlIGl0ZXJhdGlvbiBzcGFjZSAqLworICAgICAgICBpZiggcGxhc3RpdGVyICE9IE5VTEwgKQorICAgICAgICAgICAgKnBsYXN0aXRlciA9IFRSVUU7CisgICAgICAgIC8qIGxlYXZlIHB1cHBlciBhbmQgcGxvd2VyIHNldCB0byBlbnRpcmUgaXRlcmF0aW9uIHNwYWNlICovCisgICAgICAgICpwc3RyaWRlID0gKGluY3IgPiAwKSA/ICgqcHVwcGVyIC0gKnBsb3dlciArIDEpIDogKC0oKnBsb3dlciAtICpwdXBwZXIgKyAxKSk7CisKKyAgICAgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBjaGFyICogYnVmZjsKKyAgICAgICAgICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgICAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoCisgICAgICAgICAgICAgICAgIl9fa21wY19mb3Jfc3RhdGljX2luaXQ6IChzZXJpYWwpIGxpdGVyPSUlZCBsb3dlcj0lJSVzIHVwcGVyPSUlJXMgc3RyaWRlID0gJSUlc1xuIiwKKyAgICAgICAgICAgICAgICB0cmFpdHNfdDwgVCA+OjpzcGVjLCB0cmFpdHNfdDwgVCA+OjpzcGVjLCB0cmFpdHNfdDwgU1QgPjo6c3BlYyApOworICAgICAgICAgICAgS0RfVFJBQ0UoMTAwLCAoIGJ1ZmYsICpwbGFzdGl0ZXIsICpwbG93ZXIsICpwdXBwZXIsICpwc3RyaWRlICkgKTsKKyAgICAgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgICAgICB9CisgICAgICAgICNlbmRpZgorICAgICAgICBLRV9UUkFDRSggMTAsICgiX19rbXBjX2Zvcl9zdGF0aWNfaW5pdDogVCMlZCByZXR1cm5cbiIsIGdsb2JhbF90aWQgKSApOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG50aCA9IHRlYW0tPnQudF9ucHJvYzsKKyAgICBpZiAoIG50aCA9PSAxICkgeworICAgICAgICBpZiggcGxhc3RpdGVyICE9IE5VTEwgKQorICAgICAgICAgICAgKnBsYXN0aXRlciA9IFRSVUU7CisgICAgICAgICpwc3RyaWRlID0gKGluY3IgPiAwKSA/ICgqcHVwcGVyIC0gKnBsb3dlciArIDEpIDogKC0oKnBsb3dlciAtICpwdXBwZXIgKyAxKSk7CisgICAgICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgY2hhciAqIGJ1ZmY7CisgICAgICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KAorICAgICAgICAgICAgICAgICJfX2ttcGNfZm9yX3N0YXRpY19pbml0OiAoc2VyaWFsKSBsaXRlcj0lJWQgbG93ZXI9JSUlcyB1cHBlcj0lJSVzIHN0cmlkZSA9ICUlJXNcbiIsCisgICAgICAgICAgICAgICAgdHJhaXRzX3Q8IFQgPjo6c3BlYywgdHJhaXRzX3Q8IFQgPjo6c3BlYywgdHJhaXRzX3Q8IFNUID46OnNwZWMgKTsKKyAgICAgICAgICAgIEtEX1RSQUNFKDEwMCwgKCBidWZmLCAqcGxhc3RpdGVyLCAqcGxvd2VyLCAqcHVwcGVyLCAqcHN0cmlkZSApICk7CisgICAgICAgICAgICBfX2ttcF9zdHJfZnJlZSggJmJ1ZmYgKTsKKyAgICAgICAgfQorICAgICAgICAjZW5kaWYKKyAgICAgICAgS0VfVFJBQ0UoIDEwLCAoIl9fa21wY19mb3Jfc3RhdGljX2luaXQ6IFQjJWQgcmV0dXJuXG4iLCBnbG9iYWxfdGlkICkgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIGNvbXB1dGUgdHJpcCBjb3VudCAqLworICAgIGlmICggaW5jciA9PSAxICkgeworICAgICAgICB0cmlwX2NvdW50ID0gKnB1cHBlciAtICpwbG93ZXIgKyAxOworICAgIH0gZWxzZSBpZiAoaW5jciA9PSAtMSkgeworICAgICAgICB0cmlwX2NvdW50ID0gKnBsb3dlciAtICpwdXBwZXIgKyAxOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmICggaW5jciA+IDEgKSB7ICAvLyB0aGUgY2hlY2sgaXMgbmVlZGVkIGZvciB1bnNpZ25lZCBkaXZpc2lvbiB3aGVuIGluY3IgPCAwCisgICAgICAgICAgICB0cmlwX2NvdW50ID0gKCpwdXBwZXIgLSAqcGxvd2VyKSAvIGluY3IgKyAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdHJpcF9jb3VudCA9ICgqcGxvd2VyIC0gKnB1cHBlcikgLyAoIC1pbmNyICkgKyAxOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIC8qIHRyaXBjb3VudCBvdmVyZmxvdz8gKi8KKyAgICAgICAgaWYgKCB0cmlwX2NvdW50ID09IDAgJiYgKnB1cHBlciAhPSAqcGxvd2VyICkgeworICAgICAgICAgICAgX19rbXBfZXJyb3JfY29uc3RydWN0KCBrbXBfaTE4bl9tc2dfQ25zSXRlcmF0aW9uUmFuZ2VUb29MYXJnZSwgY3RfcGRvLCBsb2MgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGNvbXB1dGUgcmVtYWluaW5nIHBhcmFtZXRlcnMgKi8KKyAgICBzd2l0Y2ggKCBzY2hlZHR5cGUgKSB7CisgICAgY2FzZSBrbXBfc2NoX3N0YXRpYzoKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCB0cmlwX2NvdW50IDwgbnRoICkgeworICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoCisgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0YXRpYyA9PSBrbXBfc2NoX3N0YXRpY19ncmVlZHkgfHwgXAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGF0aWMgPT0ga21wX3NjaF9zdGF0aWNfYmFsYW5jZWQKKyAgICAgICAgICAgICAgICApOyAvLyBVbmtub3duIHN0YXRpYyBzY2hlZHVsaW5nIHR5cGUuCisgICAgICAgICAgICAgICAgaWYgKCB0aWQgPCB0cmlwX2NvdW50ICkgeworICAgICAgICAgICAgICAgICAgICAqcHVwcGVyID0gKnBsb3dlciA9ICpwbG93ZXIgKyB0aWQgKiBpbmNyOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICpwbG93ZXIgPSAqcHVwcGVyICsgaW5jcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYoIHBsYXN0aXRlciAhPSBOVUxMICkKKyAgICAgICAgICAgICAgICAgICAgKnBsYXN0aXRlciA9ICggdGlkID09IHRyaXBfY291bnQgLSAxICk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICggX19rbXBfc3RhdGljID09IGttcF9zY2hfc3RhdGljX2JhbGFuY2VkICkgeworICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBVVCBzbWFsbF9jaHVuayA9IHRyaXBfY291bnQgLyBudGg7CisgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIFVUIGV4dHJhcyA9IHRyaXBfY291bnQgJSBudGg7CisgICAgICAgICAgICAgICAgICAgICpwbG93ZXIgKz0gaW5jciAqICggdGlkICogc21hbGxfY2h1bmsgKyAoIHRpZCA8IGV4dHJhcyA/IHRpZCA6IGV4dHJhcyApICk7CisgICAgICAgICAgICAgICAgICAgICpwdXBwZXIgPSAqcGxvd2VyICsgc21hbGxfY2h1bmsgKiBpbmNyIC0gKCB0aWQgPCBleHRyYXMgPyAwIDogaW5jciApOworICAgICAgICAgICAgICAgICAgICBpZiggcGxhc3RpdGVyICE9IE5VTEwgKQorICAgICAgICAgICAgICAgICAgICAgICAgKnBsYXN0aXRlciA9ICggdGlkID09IG50aCAtIDEgKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBUIGJpZ19jaHVua19pbmNfY291bnQgPSAoIHRyaXBfY291bnQvbnRoICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAoIHRyaXBfY291bnQgJSBudGggKSA/IDEgOiAwKSApICogaW5jcjsKKyAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgVCBvbGRfdXBwZXIgPSAqcHVwcGVyOworCisgICAgICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX3N0YXRpYyA9PSBrbXBfc2NoX3N0YXRpY19ncmVlZHkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVua25vd24gc3RhdGljIHNjaGVkdWxpbmcgdHlwZS4KKworICAgICAgICAgICAgICAgICAgICAqcGxvd2VyICs9IHRpZCAqIGJpZ19jaHVua19pbmNfY291bnQ7CisgICAgICAgICAgICAgICAgICAgICpwdXBwZXIgPSAqcGxvd2VyICsgYmlnX2NodW5rX2luY19jb3VudCAtIGluY3I7CisgICAgICAgICAgICAgICAgICAgIGlmICggaW5jciA+IDAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggKnB1cHBlciA8ICpwbG93ZXIgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdXBwZXIgPSBpX21heG1pbjwgVCA+OjpteDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwbGFzdGl0ZXIgIT0gTlVMTCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBsYXN0aXRlciA9ICpwbG93ZXIgPD0gb2xkX3VwcGVyICYmICpwdXBwZXIgPiBvbGRfdXBwZXIgLSBpbmNyOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAqcHVwcGVyID4gb2xkX3VwcGVyICkgKnB1cHBlciA9IG9sZF91cHBlcjsgLy8gdHJhY2tlciBDNzMyNTgKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAqcHVwcGVyID4gKnBsb3dlciApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB1cHBlciA9IGlfbWF4bWluPCBUID46Om1uOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBsYXN0aXRlciAhPSBOVUxMICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcGxhc3RpdGVyID0gKnBsb3dlciA+PSBvbGRfdXBwZXIgJiYgKnB1cHBlciA8IG9sZF91cHBlciAtIGluY3I7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICpwdXBwZXIgPCBvbGRfdXBwZXIgKSAqcHVwcGVyID0gb2xkX3VwcGVyOyAvLyB0cmFja2VyIEM3MzI1OAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICBjYXNlIGttcF9zY2hfc3RhdGljX2NodW5rZWQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlZ2lzdGVyIFNUIHNwYW47CisgICAgICAgICAgICBpZiAoIGNodW5rIDwgMSApIHsKKyAgICAgICAgICAgICAgICBjaHVuayA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcGFuID0gY2h1bmsgKiBpbmNyOworICAgICAgICAgICAgKnBzdHJpZGUgPSBzcGFuICogbnRoOworICAgICAgICAgICAgKnBsb3dlciA9ICpwbG93ZXIgKyAoc3BhbiAqIHRpZCk7CisgICAgICAgICAgICAqcHVwcGVyID0gKnBsb3dlciArIHNwYW4gLSBpbmNyOworICAgICAgICAgICAgaWYoIHBsYXN0aXRlciAhPSBOVUxMICkKKyAgICAgICAgICAgICAgICAqcGxhc3RpdGVyID0gKHRpZCA9PSAoKHRyaXBfY291bnQgLSAxKS8oIFVUICljaHVuaykgJSBudGgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgICBLTVBfQVNTRVJUMiggMCwgIl9fa21wY19mb3Jfc3RhdGljX2luaXQ6IHVua25vd24gc2NoZWR1bGluZyB0eXBlIiApOworICAgICAgICBicmVhazsKKyAgICB9CisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgLy8gUmVwb3J0IGxvb3AgbWV0YWRhdGEKKyAgICBpZiAoIEtNUF9NQVNURVJfVElEKHRpZCkgJiYgX19pdHRfbWV0YWRhdGFfYWRkX3B0ciAmJiBfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSA9PSAzICkgeworICAgICAgICBrbXBfdWludDY0IGN1cl9jaHVuayA9IGNodW5rOworICAgICAgICAvLyBDYWxjdWxhdGUgY2h1bmsgaW4gY2FzZSBpdCB3YXMgbm90IHNwZWNpZmllZDsgaXQgaXMgc3BlY2lmaWVkIGZvciBrbXBfc2NoX3N0YXRpY19jaHVua2VkCisgICAgICAgIGlmICggc2NoZWR0eXBlID09IGttcF9zY2hfc3RhdGljICkgeworICAgICAgICAgICAgY3VyX2NodW5rID0gdHJpcF9jb3VudCAvIG50aCArICggKCB0cmlwX2NvdW50ICUgbnRoICkgPyAxIDogMCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gMCAtICJzdGF0aWMiIHNjaGVkdWxlCisgICAgICAgIF9fa21wX2l0dF9tZXRhZGF0YV9sb29wKGxvYywgMCwgdHJpcF9jb3VudCwgY3VyX2NodW5rKTsKKyAgICB9CisjZW5kaWYKKyAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgeworICAgICAgICBjb25zdCBjaGFyICogYnVmZjsKKyAgICAgICAgLy8gY3JlYXRlIGZvcm1hdCBzcGVjaWZpZXJzIGJlZm9yZSB0aGUgZGVidWcgb3V0cHV0CisgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KAorICAgICAgICAgICAgIl9fa21wY19mb3Jfc3RhdGljX2luaXQ6IGxpdGVyPSUlZCBsb3dlcj0lJSVzIHVwcGVyPSUlJXMgc3RyaWRlID0gJSUlcyBzaWduZWQ/PCVzPlxuIiwKKyAgICAgICAgICAgIHRyYWl0c190PCBUID46OnNwZWMsIHRyYWl0c190PCBUID46OnNwZWMsIHRyYWl0c190PCBTVCA+OjpzcGVjLCB0cmFpdHNfdDwgVCA+OjpzcGVjICk7CisgICAgICAgIEtEX1RSQUNFKDEwMCwgKCBidWZmLCAqcGxhc3RpdGVyLCAqcGxvd2VyLCAqcHVwcGVyLCAqcHN0cmlkZSApICk7CisgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgIH0KKyAgICAjZW5kaWYKKyAgICBLRV9UUkFDRSggMTAsICgiX19rbXBjX2Zvcl9zdGF0aWNfaW5pdDogVCMlZCByZXR1cm5cbiIsIGdsb2JhbF90aWQgKSApOworICAgIHJldHVybjsKK30KKwordGVtcGxhdGU8IHR5cGVuYW1lIFQgPgorc3RhdGljIHZvaWQKK19fa21wX2Rpc3RfZm9yX3N0YXRpY19pbml0KAorICAgIGlkZW50X3QgICAgICAgICAgICAgICAgICAgICAgICAgICpsb2MsCisgICAga21wX2ludDMyICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsCisgICAga21wX2ludDMyICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlLAorICAgIGttcF9pbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICpwbGFzdGl0ZXIsCisgICAgVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBsb3dlciwKKyAgICBUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHVwcGVyLAorICAgIFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdXBwZXJEaXN0LAorICAgIHR5cGVuYW1lIHRyYWl0c190PCBUID46OnNpZ25lZF90ICpwc3RyaWRlLAorICAgIHR5cGVuYW1lIHRyYWl0c190PCBUID46OnNpZ25lZF90ICBpbmNyLAorICAgIHR5cGVuYW1lIHRyYWl0c190PCBUID46OnNpZ25lZF90ICBjaHVuaworKSB7CisgICAgS01QX0NPVU5UX0JMT0NLKE9NUF9ESVNUUl9GT1Jfc3RhdGljKTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190PCBUID46OnVuc2lnbmVkX3QgIFVUOworICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3Q8IFQgPjo6c2lnbmVkX3QgICAgU1Q7CisgICAgcmVnaXN0ZXIga21wX3VpbnQzMiAgdGlkOworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgIG50aDsKKyAgICByZWdpc3RlciBrbXBfdWludDMyICB0ZWFtX2lkOworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgIG50ZWFtczsKKyAgICByZWdpc3RlciBVVCAgICAgICAgICB0cmlwX2NvdW50OworICAgIHJlZ2lzdGVyIGttcF90ZWFtX3QgKnRlYW07CisgICAga21wX2luZm9fdCAqIHRoOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggcGxhc3RpdGVyICYmIHBsb3dlciAmJiBwdXBwZXIgJiYgcHVwcGVyRGlzdCAmJiBwc3RyaWRlICk7CisgICAgS0VfVFJBQ0UoIDEwLCAoIl9fa21wY19kaXN0X2Zvcl9zdGF0aWNfaW5pdCBjYWxsZWQgKCVkKVxuIiwgZ3RpZCkpOworICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICB7CisgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmOworICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoCisgICAgICAgICAgICAiX19rbXBjX2Rpc3RfZm9yX3N0YXRpY19pbml0OiBUIyUlZCBzY2hlZExvb3A9JSVkIGxpdGVyPSUlZCAiXAorICAgICAgICAgICAgIml0ZXI9KCUlJXMsICUlJXMsICUlJXMpIGNodW5rPSUlJXMgc2lnbmVkPzwlcz5cbiIsCisgICAgICAgICAgICB0cmFpdHNfdDwgVCA+OjpzcGVjLCB0cmFpdHNfdDwgVCA+OjpzcGVjLCB0cmFpdHNfdDwgU1QgPjo6c3BlYywKKyAgICAgICAgICAgIHRyYWl0c190PCBTVCA+OjpzcGVjLCB0cmFpdHNfdDwgVCA+OjpzcGVjICk7CisgICAgICAgIEtEX1RSQUNFKDEwMCwgKCBidWZmLCBndGlkLCBzY2hlZHVsZSwgKnBsYXN0aXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgKnBsb3dlciwgKnB1cHBlciwgaW5jciwgY2h1bmsgKSApOworICAgICAgICBfX2ttcF9zdHJfZnJlZSggJmJ1ZmYgKTsKKyAgICB9CisgICAgI2VuZGlmCisKKyAgICBpZiggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBfX2ttcF9wdXNoX3dvcmtzaGFyZSggZ3RpZCwgY3RfcGRvLCBsb2MgKTsKKyAgICAgICAgaWYoIGluY3IgPT0gMCApIHsKKyAgICAgICAgICAgIF9fa21wX2Vycm9yX2NvbnN0cnVjdCgga21wX2kxOG5fbXNnX0Nuc0xvb3BJbmNyWmVyb1Byb2hpYml0ZWQsIGN0X3BkbywgbG9jICk7CisgICAgICAgIH0KKyAgICAgICAgaWYoIGluY3IgPiAwID8gKCpwdXBwZXIgPCAqcGxvd2VyKSA6ICgqcGxvd2VyIDwgKnB1cHBlcikgKSB7CisgICAgICAgICAgICAvLyBUaGUgbG9vcCBpcyBpbGxlZ2FsLgorICAgICAgICAgICAgLy8gU29tZSB6ZXJvLXRyaXAgbG9vcHMgbWFpbnRhaW5lZCBieSBjb21waWxlciwgZS5nLjoKKyAgICAgICAgICAgIC8vICAgZm9yKGk9MTA7aTwwOysraSkgLy8gbG93ZXIgPj0gdXBwZXIgLSBydW4tdGltZSBjaGVjaworICAgICAgICAgICAgLy8gICBmb3IoaT0wO2k+MTA7LS1pKSAvLyBsb3dlciA8PSB1cHBlciAtIHJ1bi10aW1lIGNoZWNrCisgICAgICAgICAgICAvLyAgIGZvcihpPTA7aT4xMDsrK2kpIC8vIGluY3IgPiAwICAgICAgIC0gY29tcGlsZS10aW1lIGNoZWNrCisgICAgICAgICAgICAvLyAgIGZvcihpPTEwO2k8MDstLWkpIC8vIGluY3IgPCAwICAgICAgIC0gY29tcGlsZS10aW1lIGNoZWNrCisgICAgICAgICAgICAvLyBDb21waWxlciBkb2VzIG5vdCBjaGVjayB0aGUgZm9sbG93aW5nIGlsbGVnYWwgbG9vcHM6CisgICAgICAgICAgICAvLyAgIGZvcihpPTA7aTwxMDtpKz1pbmNyKSAvLyB3aGVyZSBpbmNyPDAKKyAgICAgICAgICAgIC8vICAgZm9yKGk9MTA7aT4wO2ktPWluY3IpIC8vIHdoZXJlIGluY3I8MAorICAgICAgICAgICAgX19rbXBfZXJyb3JfY29uc3RydWN0KCBrbXBfaTE4bl9tc2dfQ25zTG9vcEluY3JJbGxlZ2FsLCBjdF9wZG8sIGxvYyApOworICAgICAgICB9CisgICAgfQorICAgIHRpZCA9IF9fa21wX3RpZF9mcm9tX2d0aWQoIGd0aWQgKTsKKyAgICB0aCA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisgICAgS01QX0RFQlVHX0FTU0VSVCh0aC0+dGgudGhfdGVhbXNfbWljcm90YXNrKTsgICAvLyB3ZSBhcmUgaW4gdGhlIHRlYW1zIGNvbnN0cnVjdAorICAgIG50aCA9IHRoLT50aC50aF90ZWFtX25wcm9jOworICAgIHRlYW0gPSB0aC0+dGgudGhfdGVhbTsKKyAgICAjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBudGVhbXMgPSB0aC0+dGgudGhfdGVhbXNfc2l6ZS5udGVhbXM7CisgICAgI2VuZGlmCisgICAgdGVhbV9pZCA9IHRlYW0tPnQudF9tYXN0ZXJfdGlkOworICAgIEtNUF9ERUJVR19BU1NFUlQobnRlYW1zID09IHRlYW0tPnQudF9wYXJlbnQtPnQudF9ucHJvYyk7CisKKyAgICAvLyBjb21wdXRlIGdsb2JhbCB0cmlwIGNvdW50CisgICAgaWYoIGluY3IgPT0gMSApIHsKKyAgICAgICAgdHJpcF9jb3VudCA9ICpwdXBwZXIgLSAqcGxvd2VyICsgMTsKKyAgICB9IGVsc2UgaWYoaW5jciA9PSAtMSkgeworICAgICAgICB0cmlwX2NvdW50ID0gKnBsb3dlciAtICpwdXBwZXIgKyAxOworICAgIH0gZWxzZSB7CisgICAgICAgIHRyaXBfY291bnQgPSAoU1QpKCpwdXBwZXIgLSAqcGxvd2VyKSAvIGluY3IgKyAxOyAvLyBjYXN0IHRvIHNpZ25lZCB0byBjb3ZlciBpbmNyPDAgY2FzZQorICAgIH0KKyAgICAqcHN0cmlkZSA9ICpwdXBwZXIgLSAqcGxvd2VyOyAgLy8ganVzdCBpbiBjYXNlIChjYW4gYmUgdW51c2VkKQorICAgIGlmKCB0cmlwX2NvdW50IDw9IG50ZWFtcyApIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCgKKyAgICAgICAgICAgIF9fa21wX3N0YXRpYyA9PSBrbXBfc2NoX3N0YXRpY19ncmVlZHkgfHwgXAorICAgICAgICAgICAgX19rbXBfc3RhdGljID09IGttcF9zY2hfc3RhdGljX2JhbGFuY2VkCisgICAgICAgICk7IC8vIFVua25vd24gc3RhdGljIHNjaGVkdWxpbmcgdHlwZS4KKyAgICAgICAgLy8gb25seSBtYXN0ZXJzIG9mIHNvbWUgdGVhbXMgZ2V0IHNpbmdsZSBpdGVyYXRpb24sIG90aGVyIHRocmVhZHMgZ2V0IG5vdGhpbmcKKyAgICAgICAgaWYoIHRlYW1faWQgPCB0cmlwX2NvdW50ICYmIHRpZCA9PSAwICkgeworICAgICAgICAgICAgKnB1cHBlciA9ICpwdXBwZXJEaXN0ID0gKnBsb3dlciA9ICpwbG93ZXIgKyB0ZWFtX2lkICogaW5jcjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICpwdXBwZXJEaXN0ID0gKnB1cHBlcjsKKyAgICAgICAgICAgICpwbG93ZXIgPSAqcHVwcGVyICsgaW5jcjsgLy8gY29tcGlsZXIgc2hvdWxkIHNraXAgbG9vcCBib2R5CisgICAgICAgIH0KKyAgICAgICAgaWYoIHBsYXN0aXRlciAhPSBOVUxMICkKKyAgICAgICAgICAgICpwbGFzdGl0ZXIgPSAoIHRpZCA9PSAwICYmIHRlYW1faWQgPT0gdHJpcF9jb3VudCAtIDEgKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBHZXQgdGhlIHRlYW0ncyBjaHVuayBmaXJzdCAoZWFjaCB0ZWFtIGdldHMgYXQgbW9zdCBvbmUgY2h1bmspCisgICAgICAgIGlmKCBfX2ttcF9zdGF0aWMgPT0ga21wX3NjaF9zdGF0aWNfYmFsYW5jZWQgKSB7CisgICAgICAgICAgICByZWdpc3RlciBVVCBjaHVua0QgPSB0cmlwX2NvdW50IC8gbnRlYW1zOworICAgICAgICAgICAgcmVnaXN0ZXIgVVQgZXh0cmFzID0gdHJpcF9jb3VudCAlIG50ZWFtczsKKyAgICAgICAgICAgICpwbG93ZXIgKz0gaW5jciAqICggdGVhbV9pZCAqIGNodW5rRCArICggdGVhbV9pZCA8IGV4dHJhcyA/IHRlYW1faWQgOiBleHRyYXMgKSApOworICAgICAgICAgICAgKnB1cHBlckRpc3QgPSAqcGxvd2VyICsgY2h1bmtEICogaW5jciAtICggdGVhbV9pZCA8IGV4dHJhcyA/IDAgOiBpbmNyICk7CisgICAgICAgICAgICBpZiggcGxhc3RpdGVyICE9IE5VTEwgKQorICAgICAgICAgICAgICAgICpwbGFzdGl0ZXIgPSAoIHRlYW1faWQgPT0gbnRlYW1zIC0gMSApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVnaXN0ZXIgVCBjaHVua19pbmNfY291bnQgPQorICAgICAgICAgICAgICAgICggdHJpcF9jb3VudCAvIG50ZWFtcyArICggKCB0cmlwX2NvdW50ICUgbnRlYW1zICkgPyAxIDogMCkgKSAqIGluY3I7CisgICAgICAgICAgICByZWdpc3RlciBUIHVwcGVyID0gKnB1cHBlcjsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX3N0YXRpYyA9PSBrbXBfc2NoX3N0YXRpY19ncmVlZHkgKTsKKyAgICAgICAgICAgICAgICAvLyBVbmtub3duIHN0YXRpYyBzY2hlZHVsaW5nIHR5cGUuCisgICAgICAgICAgICAqcGxvd2VyICs9IHRlYW1faWQgKiBjaHVua19pbmNfY291bnQ7CisgICAgICAgICAgICAqcHVwcGVyRGlzdCA9ICpwbG93ZXIgKyBjaHVua19pbmNfY291bnQgLSBpbmNyOworICAgICAgICAgICAgLy8gQ2hlY2svY29ycmVjdCBib3VuZHMgaWYgbmVlZGVkCisgICAgICAgICAgICBpZiggaW5jciA+IDAgKSB7CisgICAgICAgICAgICAgICAgaWYoICpwdXBwZXJEaXN0IDwgKnBsb3dlciApCisgICAgICAgICAgICAgICAgICAgICpwdXBwZXJEaXN0ID0gaV9tYXhtaW48IFQgPjo6bXg7CisgICAgICAgICAgICAgICAgaWYoIHBsYXN0aXRlciAhPSBOVUxMICkKKyAgICAgICAgICAgICAgICAgICAgKnBsYXN0aXRlciA9ICpwbG93ZXIgPD0gdXBwZXIgJiYgKnB1cHBlckRpc3QgPiB1cHBlciAtIGluY3I7CisgICAgICAgICAgICAgICAgaWYoICpwdXBwZXJEaXN0ID4gdXBwZXIgKQorICAgICAgICAgICAgICAgICAgICAqcHVwcGVyRGlzdCA9IHVwcGVyOyAvLyB0cmFja2VyIEM3MzI1OAorICAgICAgICAgICAgICAgIGlmKCAqcGxvd2VyID4gKnB1cHBlckRpc3QgKSB7CisgICAgICAgICAgICAgICAgICAgICpwdXBwZXIgPSAqcHVwcGVyRGlzdDsgIC8vIG5vIGl0ZXJhdGlvbnMgYXZhaWxhYmxlIGZvciB0aGUgdGVhbQorICAgICAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmKCAqcHVwcGVyRGlzdCA+ICpwbG93ZXIgKQorICAgICAgICAgICAgICAgICAgICAqcHVwcGVyRGlzdCA9IGlfbWF4bWluPCBUID46Om1uOworICAgICAgICAgICAgICAgIGlmKCBwbGFzdGl0ZXIgIT0gTlVMTCApCisgICAgICAgICAgICAgICAgICAgICpwbGFzdGl0ZXIgPSAqcGxvd2VyID49IHVwcGVyICYmICpwdXBwZXJEaXN0IDwgdXBwZXIgLSBpbmNyOworICAgICAgICAgICAgICAgIGlmKCAqcHVwcGVyRGlzdCA8IHVwcGVyICkKKyAgICAgICAgICAgICAgICAgICAgKnB1cHBlckRpc3QgPSB1cHBlcjsgLy8gdHJhY2tlciBDNzMyNTgKKyAgICAgICAgICAgICAgICBpZiggKnBsb3dlciA8ICpwdXBwZXJEaXN0ICkgeworICAgICAgICAgICAgICAgICAgICAqcHVwcGVyID0gKnB1cHBlckRpc3Q7ICAvLyBubyBpdGVyYXRpb25zIGF2YWlsYWJsZSBmb3IgdGhlIHRlYW0KKyAgICAgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIEdldCB0aGUgcGFyYWxsZWwgbG9vcCBjaHVuayBub3cgKGZvciB0aHJlYWQpCisgICAgICAgIC8vIGNvbXB1dGUgdHJpcCBjb3VudCBmb3IgdGVhbSdzIGNodW5rCisgICAgICAgIGlmKCBpbmNyID09IDEgKSB7CisgICAgICAgICAgICB0cmlwX2NvdW50ID0gKnB1cHBlckRpc3QgLSAqcGxvd2VyICsgMTsKKyAgICAgICAgfSBlbHNlIGlmKGluY3IgPT0gLTEpIHsKKyAgICAgICAgICAgIHRyaXBfY291bnQgPSAqcGxvd2VyIC0gKnB1cHBlckRpc3QgKyAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdHJpcF9jb3VudCA9IChTVCkoKnB1cHBlckRpc3QgLSAqcGxvd2VyKSAvIGluY3IgKyAxOworICAgICAgICB9CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHRyaXBfY291bnQgKTsKKyAgICAgICAgc3dpdGNoKCBzY2hlZHVsZSApIHsKKyAgICAgICAgY2FzZSBrbXBfc2NoX3N0YXRpYzoKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIHRyaXBfY291bnQgPD0gbnRoICkgeworICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoCisgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0YXRpYyA9PSBrbXBfc2NoX3N0YXRpY19ncmVlZHkgfHwgXAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGF0aWMgPT0ga21wX3NjaF9zdGF0aWNfYmFsYW5jZWQKKyAgICAgICAgICAgICAgICApOyAvLyBVbmtub3duIHN0YXRpYyBzY2hlZHVsaW5nIHR5cGUuCisgICAgICAgICAgICAgICAgaWYoIHRpZCA8IHRyaXBfY291bnQgKQorICAgICAgICAgICAgICAgICAgICAqcHVwcGVyID0gKnBsb3dlciA9ICpwbG93ZXIgKyB0aWQgKiBpbmNyOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgKnBsb3dlciA9ICpwdXBwZXIgKyBpbmNyOyAvLyBubyBpdGVyYXRpb25zIGF2YWlsYWJsZQorICAgICAgICAgICAgICAgIGlmKCBwbGFzdGl0ZXIgIT0gTlVMTCApCisgICAgICAgICAgICAgICAgICAgIGlmKCAqcGxhc3RpdGVyICE9IDAgJiYgISggdGlkID09IHRyaXBfY291bnQgLSAxICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgKnBsYXN0aXRlciA9IDA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmKCBfX2ttcF9zdGF0aWMgPT0ga21wX3NjaF9zdGF0aWNfYmFsYW5jZWQgKSB7CisgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIFVUIGNodW5rTCA9IHRyaXBfY291bnQgLyBudGg7CisgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIFVUIGV4dHJhcyA9IHRyaXBfY291bnQgJSBudGg7CisgICAgICAgICAgICAgICAgICAgICpwbG93ZXIgKz0gaW5jciAqICh0aWQgKiBjaHVua0wgKyAodGlkIDwgZXh0cmFzID8gdGlkIDogZXh0cmFzKSk7CisgICAgICAgICAgICAgICAgICAgICpwdXBwZXIgPSAqcGxvd2VyICsgY2h1bmtMICogaW5jciAtICh0aWQgPCBleHRyYXMgPyAwIDogaW5jcik7CisgICAgICAgICAgICAgICAgICAgIGlmKCBwbGFzdGl0ZXIgIT0gTlVMTCApCisgICAgICAgICAgICAgICAgICAgICAgICBpZiggKnBsYXN0aXRlciAhPSAwICYmICEoIHRpZCA9PSBudGggLSAxICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwbGFzdGl0ZXIgPSAwOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIFQgY2h1bmtfaW5jX2NvdW50ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICggdHJpcF9jb3VudCAvIG50aCArICggKCB0cmlwX2NvdW50ICUgbnRoICkgPyAxIDogMCkgKSAqIGluY3I7CisgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIFQgdXBwZXIgPSAqcHVwcGVyRGlzdDsKKyAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfc3RhdGljID09IGttcF9zY2hfc3RhdGljX2dyZWVkeSApOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gVW5rbm93biBzdGF0aWMgc2NoZWR1bGluZyB0eXBlLgorICAgICAgICAgICAgICAgICAgICAqcGxvd2VyICs9IHRpZCAqIGNodW5rX2luY19jb3VudDsKKyAgICAgICAgICAgICAgICAgICAgKnB1cHBlciA9ICpwbG93ZXIgKyBjaHVua19pbmNfY291bnQgLSBpbmNyOworICAgICAgICAgICAgICAgICAgICBpZiggaW5jciA+IDAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggKnB1cHBlciA8ICpwbG93ZXIgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdXBwZXIgPSBpX21heG1pbjwgVCA+OjpteDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwbGFzdGl0ZXIgIT0gTlVMTCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoICpwbGFzdGl0ZXIgIT0gMCAmJiAhKCpwbG93ZXIgPD0gdXBwZXIgJiYgKnB1cHBlciA+IHVwcGVyIC0gaW5jcikgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcGxhc3RpdGVyID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAqcHVwcGVyID4gdXBwZXIgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdXBwZXIgPSB1cHBlcjsvL3RyYWNrZXIgQzczMjU4CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggKnB1cHBlciA+ICpwbG93ZXIgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdXBwZXIgPSBpX21heG1pbjwgVCA+OjptbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwbGFzdGl0ZXIgIT0gTlVMTCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoICpwbGFzdGl0ZXIgIT0gMCAmJiAhKCpwbG93ZXIgPj0gdXBwZXIgJiYgKnB1cHBlciA8IHVwcGVyIC0gaW5jcikgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcGxhc3RpdGVyID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAqcHVwcGVyIDwgdXBwZXIgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdXBwZXIgPSB1cHBlcjsvL3RyYWNrZXIgQzczMjU4CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIGttcF9zY2hfc3RhdGljX2NodW5rZWQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlZ2lzdGVyIFNUIHNwYW47CisgICAgICAgICAgICBpZiggY2h1bmsgPCAxICkKKyAgICAgICAgICAgICAgICBjaHVuayA9IDE7CisgICAgICAgICAgICBzcGFuID0gY2h1bmsgKiBpbmNyOworICAgICAgICAgICAgKnBzdHJpZGUgPSBzcGFuICogbnRoOworICAgICAgICAgICAgKnBsb3dlciA9ICpwbG93ZXIgKyAoc3BhbiAqIHRpZCk7CisgICAgICAgICAgICAqcHVwcGVyID0gKnBsb3dlciArIHNwYW4gLSBpbmNyOworICAgICAgICAgICAgaWYoIHBsYXN0aXRlciAhPSBOVUxMICkKKyAgICAgICAgICAgICAgICBpZiggKnBsYXN0aXRlciAhPSAwICYmICEodGlkID09ICgodHJpcF9jb3VudCAtIDEpIC8gKCBVVCApY2h1bmspICUgbnRoKSApCisgICAgICAgICAgICAgICAgICAgICpwbGFzdGl0ZXIgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEtNUF9BU1NFUlQyKCAwLCAiX19rbXBjX2Rpc3RfZm9yX3N0YXRpY19pbml0OiB1bmtub3duIGxvb3Agc2NoZWR1bGluZyB0eXBlIiApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgZW5kOjsKKyAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgeworICAgICAgICBjb25zdCBjaGFyICogYnVmZjsKKyAgICAgICAgLy8gY3JlYXRlIGZvcm1hdCBzcGVjaWZpZXJzIGJlZm9yZSB0aGUgZGVidWcgb3V0cHV0CisgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KAorICAgICAgICAgICAgIl9fa21wY19kaXN0X2Zvcl9zdGF0aWNfaW5pdDogbGFzdD0lJWQgbG89JSUlcyB1cD0lJSVzIHVwRGlzdD0lJSVzICJcCisgICAgICAgICAgICAic3RyaWRlPSUlJXMgc2lnbmVkPzwlcz5cbiIsCisgICAgICAgICAgICB0cmFpdHNfdDwgVCA+OjpzcGVjLCB0cmFpdHNfdDwgVCA+OjpzcGVjLCB0cmFpdHNfdDwgVCA+OjpzcGVjLAorICAgICAgICAgICAgdHJhaXRzX3Q8IFNUID46OnNwZWMsIHRyYWl0c190PCBUID46OnNwZWMgKTsKKyAgICAgICAgS0RfVFJBQ0UoMTAwLCAoIGJ1ZmYsICpwbGFzdGl0ZXIsICpwbG93ZXIsICpwdXBwZXIsICpwdXBwZXJEaXN0LCAqcHN0cmlkZSApICk7CisgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgIH0KKyAgICAjZW5kaWYKKyAgICBLRV9UUkFDRSggMTAsICgiX19rbXBjX2Rpc3RfZm9yX3N0YXRpY19pbml0OiBUIyVkIHJldHVyblxuIiwgZ3RpZCApICk7CisgICAgcmV0dXJuOworfQorCit0ZW1wbGF0ZTwgdHlwZW5hbWUgVCA+CitzdGF0aWMgdm9pZAorX19rbXBfdGVhbV9zdGF0aWNfaW5pdCgKKyAgICBpZGVudF90ICAgICAgICAgICAgICAgICAgICAgICAgICAqbG9jLAorICAgIGttcF9pbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLAorICAgIGttcF9pbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICpwX2xhc3QsCisgICAgVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBfbGIsCisgICAgVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBfdWIsCisgICAgdHlwZW5hbWUgdHJhaXRzX3Q8IFQgPjo6c2lnbmVkX3QgKnBfc3QsCisgICAgdHlwZW5hbWUgdHJhaXRzX3Q8IFQgPjo6c2lnbmVkX3QgIGluY3IsCisgICAgdHlwZW5hbWUgdHJhaXRzX3Q8IFQgPjo6c2lnbmVkX3QgIGNodW5rCispIHsKKyAgICAvLyBUaGUgcm91dGluZSByZXR1cm5zIHRoZSBmaXJzdCBjaHVuayBkaXN0cmlidXRlZCB0byB0aGUgdGVhbSBhbmQKKyAgICAvLyBzdHJpZGUgZm9yIG5leHQgY2h1bmtzIGNhbGN1bGF0aW9uLgorICAgIC8vIExhc3QgaXRlcmF0aW9uIGZsYWcgc2V0IGZvciB0aGUgdGVhbSB0aGF0IHdpbGwgZXhlY3V0ZQorICAgIC8vIHRoZSBsYXN0IGl0ZXJhdGlvbiBvZiB0aGUgbG9vcC4KKyAgICAvLyBUaGUgcm91dGluZSBpcyBjYWxsZWQgZm9yIGRpc3Rfc2NoZWR1ZShzdGF0aWMsY2h1bmspIG9ubHkuCisgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdDwgVCA+Ojp1bnNpZ25lZF90ICBVVDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190PCBUID46OnNpZ25lZF90ICAgIFNUOworICAgIGttcF91aW50MzIgIHRlYW1faWQ7CisgICAga21wX3VpbnQzMiAgbnRlYW1zOworICAgIFVUICAgICAgICAgIHRyaXBfY291bnQ7CisgICAgVCAgICAgICAgICAgbG93ZXI7CisgICAgVCAgICAgICAgICAgdXBwZXI7CisgICAgU1QgICAgICAgICAgc3BhbjsKKyAgICBrbXBfdGVhbV90ICp0ZWFtOworICAgIGttcF9pbmZvX3QgKnRoOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggcF9sYXN0ICYmIHBfbGIgJiYgcF91YiAmJiBwX3N0ICk7CisgICAgS0VfVFJBQ0UoIDEwLCAoIl9fa21wX3RlYW1fc3RhdGljX2luaXQgY2FsbGVkICglZClcbiIsIGd0aWQpKTsKKyAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgeworICAgICAgICBjb25zdCBjaGFyICogYnVmZjsKKyAgICAgICAgLy8gY3JlYXRlIGZvcm1hdCBzcGVjaWZpZXJzIGJlZm9yZSB0aGUgZGVidWcgb3V0cHV0CisgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KCAiX19rbXBfdGVhbV9zdGF0aWNfaW5pdCBlbnRlcjogVCMlJWQgbGl0ZXI9JSVkICJcCisgICAgICAgICAgICAiaXRlcj0oJSUlcywgJSUlcywgJSUlcykgY2h1bmsgJSUlczsgc2lnbmVkPzwlcz5cbiIsCisgICAgICAgICAgICB0cmFpdHNfdDwgVCA+OjpzcGVjLCB0cmFpdHNfdDwgVCA+OjpzcGVjLCB0cmFpdHNfdDwgU1QgPjo6c3BlYywKKyAgICAgICAgICAgIHRyYWl0c190PCBTVCA+OjpzcGVjLCB0cmFpdHNfdDwgVCA+OjpzcGVjICk7CisgICAgICAgIEtEX1RSQUNFKDEwMCwgKCBidWZmLCBndGlkLCAqcF9sYXN0LCAqcF9sYiwgKnBfdWIsICpwX3N0LCBjaHVuayApICk7CisgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgIH0KKyAgICAjZW5kaWYKKworICAgIGxvd2VyID0gKnBfbGI7CisgICAgdXBwZXIgPSAqcF91YjsKKyAgICBpZiggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBpZiggaW5jciA9PSAwICkgeworICAgICAgICAgICAgX19rbXBfZXJyb3JfY29uc3RydWN0KCBrbXBfaTE4bl9tc2dfQ25zTG9vcEluY3JaZXJvUHJvaGliaXRlZCwgY3RfcGRvLCBsb2MgKTsKKyAgICAgICAgfQorICAgICAgICBpZiggaW5jciA+IDAgPyAodXBwZXIgPCBsb3dlcikgOiAobG93ZXIgPCB1cHBlcikgKSB7CisgICAgICAgICAgICAvLyBUaGUgbG9vcCBpcyBpbGxlZ2FsLgorICAgICAgICAgICAgLy8gU29tZSB6ZXJvLXRyaXAgbG9vcHMgbWFpbnRhaW5lZCBieSBjb21waWxlciwgZS5nLjoKKyAgICAgICAgICAgIC8vICAgZm9yKGk9MTA7aTwwOysraSkgLy8gbG93ZXIgPj0gdXBwZXIgLSBydW4tdGltZSBjaGVjaworICAgICAgICAgICAgLy8gICBmb3IoaT0wO2k+MTA7LS1pKSAvLyBsb3dlciA8PSB1cHBlciAtIHJ1bi10aW1lIGNoZWNrCisgICAgICAgICAgICAvLyAgIGZvcihpPTA7aT4xMDsrK2kpIC8vIGluY3IgPiAwICAgICAgIC0gY29tcGlsZS10aW1lIGNoZWNrCisgICAgICAgICAgICAvLyAgIGZvcihpPTEwO2k8MDstLWkpIC8vIGluY3IgPCAwICAgICAgIC0gY29tcGlsZS10aW1lIGNoZWNrCisgICAgICAgICAgICAvLyBDb21waWxlciBkb2VzIG5vdCBjaGVjayB0aGUgZm9sbG93aW5nIGlsbGVnYWwgbG9vcHM6CisgICAgICAgICAgICAvLyAgIGZvcihpPTA7aTwxMDtpKz1pbmNyKSAvLyB3aGVyZSBpbmNyPDAKKyAgICAgICAgICAgIC8vICAgZm9yKGk9MTA7aT4wO2ktPWluY3IpIC8vIHdoZXJlIGluY3I8MAorICAgICAgICAgICAgX19rbXBfZXJyb3JfY29uc3RydWN0KCBrbXBfaTE4bl9tc2dfQ25zTG9vcEluY3JJbGxlZ2FsLCBjdF9wZG8sIGxvYyApOworICAgICAgICB9CisgICAgfQorICAgIHRoID0gX19rbXBfdGhyZWFkc1tndGlkXTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKHRoLT50aC50aF90ZWFtc19taWNyb3Rhc2spOyAgIC8vIHdlIGFyZSBpbiB0aGUgdGVhbXMgY29uc3RydWN0CisgICAgdGVhbSA9IHRoLT50aC50aF90ZWFtOworICAgICNpZiBPTVBfNDBfRU5BQkxFRAorICAgIG50ZWFtcyA9IHRoLT50aC50aF90ZWFtc19zaXplLm50ZWFtczsKKyAgICAjZW5kaWYKKyAgICB0ZWFtX2lkID0gdGVhbS0+dC50X21hc3Rlcl90aWQ7CisgICAgS01QX0RFQlVHX0FTU0VSVChudGVhbXMgPT0gdGVhbS0+dC50X3BhcmVudC0+dC50X25wcm9jKTsKKworICAgIC8vIGNvbXB1dGUgdHJpcCBjb3VudAorICAgIGlmKCBpbmNyID09IDEgKSB7CisgICAgICAgIHRyaXBfY291bnQgPSB1cHBlciAtIGxvd2VyICsgMTsKKyAgICB9IGVsc2UgaWYoaW5jciA9PSAtMSkgeworICAgICAgICB0cmlwX2NvdW50ID0gbG93ZXIgLSB1cHBlciArIDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdHJpcF9jb3VudCA9IChTVCkodXBwZXIgLSBsb3dlcikgLyBpbmNyICsgMTsgLy8gY2FzdCB0byBzaWduZWQgdG8gY292ZXIgaW5jcjwwIGNhc2UKKyAgICB9CisgICAgaWYoIGNodW5rIDwgMSApCisgICAgICAgIGNodW5rID0gMTsKKyAgICBzcGFuID0gY2h1bmsgKiBpbmNyOworICAgICpwX3N0ID0gc3BhbiAqIG50ZWFtczsKKyAgICAqcF9sYiA9IGxvd2VyICsgKHNwYW4gKiB0ZWFtX2lkKTsKKyAgICAqcF91YiA9ICpwX2xiICsgc3BhbiAtIGluY3I7CisgICAgaWYgKCBwX2xhc3QgIT0gTlVMTCApCisgICAgICAgICpwX2xhc3QgPSAodGVhbV9pZCA9PSAoKHRyaXBfY291bnQgLSAxKS8oVVQpY2h1bmspICUgbnRlYW1zKTsKKyAgICAvLyBDb3JyZWN0IHVwcGVyIGJvdW5kIGlmIG5lZWRlZAorICAgIGlmKCBpbmNyID4gMCApIHsKKyAgICAgICAgaWYoICpwX3ViIDwgKnBfbGIgKSAvLyBvdmVyZmxvdz8KKyAgICAgICAgICAgICpwX3ViID0gaV9tYXhtaW48IFQgPjo6bXg7CisgICAgICAgIGlmKCAqcF91YiA+IHVwcGVyICkKKyAgICAgICAgICAgICpwX3ViID0gdXBwZXI7IC8vIHRyYWNrZXIgQzczMjU4CisgICAgfSBlbHNlIHsgICAvLyBpbmNyIDwgMAorICAgICAgICBpZiggKnBfdWIgPiAqcF9sYiApCisgICAgICAgICAgICAqcF91YiA9IGlfbWF4bWluPCBUID46Om1uOworICAgICAgICBpZiggKnBfdWIgPCB1cHBlciApCisgICAgICAgICAgICAqcF91YiA9IHVwcGVyOyAvLyB0cmFja2VyIEM3MzI1OAorICAgIH0KKyAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgeworICAgICAgICBjb25zdCBjaGFyICogYnVmZjsKKyAgICAgICAgLy8gY3JlYXRlIGZvcm1hdCBzcGVjaWZpZXJzIGJlZm9yZSB0aGUgZGVidWcgb3V0cHV0CisgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KCAiX19rbXBfdGVhbV9zdGF0aWNfaW5pdCBleGl0OiBUIyUlZCB0ZWFtJSV1IGxpdGVyPSUlZCAiXAorICAgICAgICAgICAgIml0ZXI9KCUlJXMsICUlJXMsICUlJXMpIGNodW5rICUlJXNcbiIsCisgICAgICAgICAgICB0cmFpdHNfdDwgVCA+OjpzcGVjLCB0cmFpdHNfdDwgVCA+OjpzcGVjLCB0cmFpdHNfdDwgU1QgPjo6c3BlYywKKyAgICAgICAgICAgIHRyYWl0c190PCBTVCA+OjpzcGVjICk7CisgICAgICAgIEtEX1RSQUNFKDEwMCwgKCBidWZmLCBndGlkLCB0ZWFtX2lkLCAqcF9sYXN0LCAqcF9sYiwgKnBfdWIsICpwX3N0LCBjaHVuayApICk7CisgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgIH0KKyAgICAjZW5kaWYKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZXh0ZXJuICJDIiB7CisKKy8qIQorQGluZ3JvdXAgV09SS19TSEFSSU5HCitAcGFyYW0gICAgbG9jICAgICAgIFNvdXJjZSBjb2RlIGxvY2F0aW9uCitAcGFyYW0gICAgZ3RpZCAgICAgIEdsb2JhbCB0aHJlYWQgaWQgb2YgdGhpcyB0aHJlYWQKK0BwYXJhbSAgICBzY2hlZHR5cGUgIFNjaGVkdWxpbmcgdHlwZQorQHBhcmFtICAgIHBsYXN0aXRlciBQb2ludGVyIHRvIHRoZSAibGFzdCBpdGVyYXRpb24iIGZsYWcKK0BwYXJhbSAgICBwbG93ZXIgICAgUG9pbnRlciB0byB0aGUgbG93ZXIgYm91bmQKK0BwYXJhbSAgICBwdXBwZXIgICAgUG9pbnRlciB0byB0aGUgdXBwZXIgYm91bmQKK0BwYXJhbSAgICBwc3RyaWRlICAgUG9pbnRlciB0byB0aGUgc3RyaWRlCitAcGFyYW0gICAgaW5jciAgICAgIExvb3AgaW5jcmVtZW50CitAcGFyYW0gICAgY2h1bmsgICAgIFRoZSBjaHVuayBzaXplCisKK0VhY2ggb2YgdGhlIGZvdXIgZnVuY3Rpb25zIGhlcmUgYXJlIGlkZW50aWNhbCBhcGFydCBmcm9tIHRoZSBhcmd1bWVudCB0eXBlcy4KKworVGhlIGZ1bmN0aW9ucyBjb21wdXRlIHRoZSB1cHBlciBhbmQgbG93ZXIgYm91bmRzIGFuZCBzdHJpZGUgdG8gYmUgdXNlZCBmb3IgdGhlIHNldCBvZiBpdGVyYXRpb25zCit0byBiZSBleGVjdXRlZCBieSB0aGUgY3VycmVudCB0aHJlYWQgZnJvbSB0aGUgc3RhdGljYWxseSBzY2hlZHVsZWQgbG9vcCB0aGF0IGlzIGRlc2NyaWJlZCBieSB0aGUKK2luaXRpYWwgdmFsdWVzIG9mIHRoZSBib3VuZHMsIHN0cmlkZSwgaW5jcmVtZW50IGFuZCBjaHVuayBzaXplLgorCitAeworKi8KK3ZvaWQKK19fa21wY19mb3Jfc3RhdGljX2luaXRfNCggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwga21wX2ludDMyIHNjaGVkdHlwZSwga21wX2ludDMyICpwbGFzdGl0ZXIsCisgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyICpwbG93ZXIsIGttcF9pbnQzMiAqcHVwcGVyLAorICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiAqcHN0cmlkZSwga21wX2ludDMyIGluY3IsIGttcF9pbnQzMiBjaHVuayApCit7CisgICAgX19rbXBfZm9yX3N0YXRpY19pbml0PCBrbXBfaW50MzIgPigKKyAgICAgICAgICAgICAgICAgICAgICBsb2MsIGd0aWQsIHNjaGVkdHlwZSwgcGxhc3RpdGVyLCBwbG93ZXIsIHB1cHBlciwgcHN0cmlkZSwgaW5jciwgY2h1bmsgKTsKK30KKworLyohCisgU2VlIEByZWYgX19rbXBjX2Zvcl9zdGF0aWNfaW5pdF80CisgKi8KK3ZvaWQKK19fa21wY19mb3Jfc3RhdGljX2luaXRfNHUoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIGttcF9pbnQzMiBzY2hlZHR5cGUsIGttcF9pbnQzMiAqcGxhc3RpdGVyLAorICAgICAgICAgICAgICAgICAgICAgIGttcF91aW50MzIgKnBsb3dlciwga21wX3VpbnQzMiAqcHVwcGVyLAorICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiAqcHN0cmlkZSwga21wX2ludDMyIGluY3IsIGttcF9pbnQzMiBjaHVuayApCit7CisgICAgX19rbXBfZm9yX3N0YXRpY19pbml0PCBrbXBfdWludDMyID4oCisgICAgICAgICAgICAgICAgICAgICAgbG9jLCBndGlkLCBzY2hlZHR5cGUsIHBsYXN0aXRlciwgcGxvd2VyLCBwdXBwZXIsIHBzdHJpZGUsIGluY3IsIGNodW5rICk7Cit9CisKKy8qIQorIFNlZSBAcmVmIF9fa21wY19mb3Jfc3RhdGljX2luaXRfNAorICovCit2b2lkCitfX2ttcGNfZm9yX3N0YXRpY19pbml0XzgoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIGttcF9pbnQzMiBzY2hlZHR5cGUsIGttcF9pbnQzMiAqcGxhc3RpdGVyLAorICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQ2NCAqcGxvd2VyLCBrbXBfaW50NjQgKnB1cHBlciwKKyAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50NjQgKnBzdHJpZGUsIGttcF9pbnQ2NCBpbmNyLCBrbXBfaW50NjQgY2h1bmsgKQoreworICAgIF9fa21wX2Zvcl9zdGF0aWNfaW5pdDwga21wX2ludDY0ID4oCisgICAgICAgICAgICAgICAgICAgICAgbG9jLCBndGlkLCBzY2hlZHR5cGUsIHBsYXN0aXRlciwgcGxvd2VyLCBwdXBwZXIsIHBzdHJpZGUsIGluY3IsIGNodW5rICk7Cit9CisKKy8qIQorIFNlZSBAcmVmIF9fa21wY19mb3Jfc3RhdGljX2luaXRfNAorICovCit2b2lkCitfX2ttcGNfZm9yX3N0YXRpY19pbml0Xzh1KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCBrbXBfaW50MzIgc2NoZWR0eXBlLCBrbXBfaW50MzIgKnBsYXN0aXRlciwKKyAgICAgICAgICAgICAgICAgICAgICBrbXBfdWludDY0ICpwbG93ZXIsIGttcF91aW50NjQgKnB1cHBlciwKKyAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50NjQgKnBzdHJpZGUsIGttcF9pbnQ2NCBpbmNyLCBrbXBfaW50NjQgY2h1bmsgKQoreworICAgIF9fa21wX2Zvcl9zdGF0aWNfaW5pdDwga21wX3VpbnQ2NCA+KAorICAgICAgICAgICAgICAgICAgICAgIGxvYywgZ3RpZCwgc2NoZWR0eXBlLCBwbGFzdGl0ZXIsIHBsb3dlciwgcHVwcGVyLCBwc3RyaWRlLCBpbmNyLCBjaHVuayApOworfQorLyohCitAfQorKi8KKworLyohCitAaW5ncm91cCBXT1JLX1NIQVJJTkcKK0BwYXJhbSAgICBsb2MgICAgICAgU291cmNlIGNvZGUgbG9jYXRpb24KK0BwYXJhbSAgICBndGlkICAgICAgR2xvYmFsIHRocmVhZCBpZCBvZiB0aGlzIHRocmVhZAorQHBhcmFtICAgIHNjaGVkdWxlRCBTY2hlZHVsaW5nIHR5cGUgZm9yIHRoZSBkaXN0cmlidXRlCitAcGFyYW0gICAgc2NoZWR1bGVMIFNjaGVkdWxpbmcgdHlwZSBmb3IgdGhlIHBhcmFsbGVsIGxvb3AKK0BwYXJhbSAgICBwbGFzdGl0ZXIgUG9pbnRlciB0byB0aGUgImxhc3QgaXRlcmF0aW9uIiBmbGFnCitAcGFyYW0gICAgcGxvd2VyICAgIFBvaW50ZXIgdG8gdGhlIGxvd2VyIGJvdW5kCitAcGFyYW0gICAgcHVwcGVyICAgIFBvaW50ZXIgdG8gdGhlIHVwcGVyIGJvdW5kIG9mIGxvb3AgY2h1bmsKK0BwYXJhbSAgICBwdXBwZXJEICAgUG9pbnRlciB0byB0aGUgdXBwZXIgYm91bmQgb2YgZGlzdF9jaHVuaworQHBhcmFtICAgIHBzdHJpZGVEICBQb2ludGVyIHRvIHRoZSBzdHJpZGUgZm9yIGRpc3RyaWJ1dGUKK0BwYXJhbSAgICBwc3RyaWRlTCAgUG9pbnRlciB0byB0aGUgc3RyaWRlIGZvciBwYXJhbGxlbCBsb29wCitAcGFyYW0gICAgaW5jciAgICAgIExvb3AgaW5jcmVtZW50CitAcGFyYW0gICAgY2h1bmtEICAgIFRoZSBjaHVuayBzaXplIGZvciB0aGUgZGlzdHJpYnV0ZQorQHBhcmFtICAgIGNodW5rTCAgICBUaGUgY2h1bmsgc2l6ZSBmb3IgdGhlIHBhcmFsbGVsIGxvb3AKKworRWFjaCBvZiB0aGUgZm91ciBmdW5jdGlvbnMgaGVyZSBhcmUgaWRlbnRpY2FsIGFwYXJ0IGZyb20gdGhlIGFyZ3VtZW50IHR5cGVzLgorCitUaGUgZnVuY3Rpb25zIGNvbXB1dGUgdGhlIHVwcGVyIGFuZCBsb3dlciBib3VuZHMgYW5kIHN0cmlkZXMgdG8gYmUgdXNlZCBmb3IgdGhlIHNldCBvZiBpdGVyYXRpb25zCit0byBiZSBleGVjdXRlZCBieSB0aGUgY3VycmVudCB0aHJlYWQgZnJvbSB0aGUgc3RhdGljYWxseSBzY2hlZHVsZWQgbG9vcCB0aGF0IGlzIGRlc2NyaWJlZCBieSB0aGUKK2luaXRpYWwgdmFsdWVzIG9mIHRoZSBib3VuZHMsIHN0cmlkZXMsIGluY3JlbWVudCBhbmQgY2h1bmtzIGZvciBwYXJhbGxlbCBsb29wIGFuZCBkaXN0cmlidXRlCitjb25zdHJ1Y3RzLgorCitAeworKi8KK3ZvaWQKK19fa21wY19kaXN0X2Zvcl9zdGF0aWNfaW5pdF80KAorICAgIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIGttcF9pbnQzMiBzY2hlZHVsZSwga21wX2ludDMyICpwbGFzdGl0ZXIsCisgICAga21wX2ludDMyICpwbG93ZXIsIGttcF9pbnQzMiAqcHVwcGVyLCBrbXBfaW50MzIgKnB1cHBlckQsCisgICAga21wX2ludDMyICpwc3RyaWRlLCBrbXBfaW50MzIgaW5jciwga21wX2ludDMyIGNodW5rICkKK3sKKyAgICBfX2ttcF9kaXN0X2Zvcl9zdGF0aWNfaW5pdDwga21wX2ludDMyID4oCisgICAgICAgIGxvYywgZ3RpZCwgc2NoZWR1bGUsIHBsYXN0aXRlciwgcGxvd2VyLCBwdXBwZXIsIHB1cHBlckQsIHBzdHJpZGUsIGluY3IsIGNodW5rICk7Cit9CisKKy8qIQorIFNlZSBAcmVmIF9fa21wY19kaXN0X2Zvcl9zdGF0aWNfaW5pdF80CisgKi8KK3ZvaWQKK19fa21wY19kaXN0X2Zvcl9zdGF0aWNfaW5pdF80dSgKKyAgICBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCBrbXBfaW50MzIgc2NoZWR1bGUsIGttcF9pbnQzMiAqcGxhc3RpdGVyLAorICAgIGttcF91aW50MzIgKnBsb3dlciwga21wX3VpbnQzMiAqcHVwcGVyLCBrbXBfdWludDMyICpwdXBwZXJELAorICAgIGttcF9pbnQzMiAqcHN0cmlkZSwga21wX2ludDMyIGluY3IsIGttcF9pbnQzMiBjaHVuayApCit7CisgICAgX19rbXBfZGlzdF9mb3Jfc3RhdGljX2luaXQ8IGttcF91aW50MzIgPigKKyAgICAgICAgbG9jLCBndGlkLCBzY2hlZHVsZSwgcGxhc3RpdGVyLCBwbG93ZXIsIHB1cHBlciwgcHVwcGVyRCwgcHN0cmlkZSwgaW5jciwgY2h1bmsgKTsKK30KKworLyohCisgU2VlIEByZWYgX19rbXBjX2Rpc3RfZm9yX3N0YXRpY19pbml0XzQKKyAqLwordm9pZAorX19rbXBjX2Rpc3RfZm9yX3N0YXRpY19pbml0XzgoCisgICAgaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwga21wX2ludDMyIHNjaGVkdWxlLCBrbXBfaW50MzIgKnBsYXN0aXRlciwKKyAgICBrbXBfaW50NjQgKnBsb3dlciwga21wX2ludDY0ICpwdXBwZXIsIGttcF9pbnQ2NCAqcHVwcGVyRCwKKyAgICBrbXBfaW50NjQgKnBzdHJpZGUsIGttcF9pbnQ2NCBpbmNyLCBrbXBfaW50NjQgY2h1bmsgKQoreworICAgIF9fa21wX2Rpc3RfZm9yX3N0YXRpY19pbml0PCBrbXBfaW50NjQgPigKKyAgICAgICAgbG9jLCBndGlkLCBzY2hlZHVsZSwgcGxhc3RpdGVyLCBwbG93ZXIsIHB1cHBlciwgcHVwcGVyRCwgcHN0cmlkZSwgaW5jciwgY2h1bmsgKTsKK30KKworLyohCisgU2VlIEByZWYgX19rbXBjX2Rpc3RfZm9yX3N0YXRpY19pbml0XzQKKyAqLwordm9pZAorX19rbXBjX2Rpc3RfZm9yX3N0YXRpY19pbml0Xzh1KAorICAgIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIGttcF9pbnQzMiBzY2hlZHVsZSwga21wX2ludDMyICpwbGFzdGl0ZXIsCisgICAga21wX3VpbnQ2NCAqcGxvd2VyLCBrbXBfdWludDY0ICpwdXBwZXIsIGttcF91aW50NjQgKnB1cHBlckQsCisgICAga21wX2ludDY0ICpwc3RyaWRlLCBrbXBfaW50NjQgaW5jciwga21wX2ludDY0IGNodW5rICkKK3sKKyAgICBfX2ttcF9kaXN0X2Zvcl9zdGF0aWNfaW5pdDwga21wX3VpbnQ2NCA+KAorICAgICAgICBsb2MsIGd0aWQsIHNjaGVkdWxlLCBwbGFzdGl0ZXIsIHBsb3dlciwgcHVwcGVyLCBwdXBwZXJELCBwc3RyaWRlLCBpbmNyLCBjaHVuayApOworfQorLyohCitAfQorKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQXV4aWxpYXJ5IHJvdXRpbmVzIGZvciBEaXN0cmlidXRlIFBhcmFsbGVsIExvb3AgY29uc3RydWN0IGltcGxlbWVudGF0aW9uCisvLyAgICBUcmFuc2ZlciBjYWxsIHRvIHRlbXBsYXRlPCB0eXBlIFQgPgorLy8gICAgX19rbXBfdGVhbV9zdGF0aWNfaW5pdCggaWRlbnRfdCAqbG9jLCBpbnQgZ3RpZCwKKy8vICAgICAgICBpbnQgKnBfbGFzdCwgVCAqbGIsIFQgKnViLCBTVCAqc3QsIFNUIGluY3IsIFNUIGNodW5rICkKKworLyohCitAaW5ncm91cCBXT1JLX1NIQVJJTkcKK0B7CitAcGFyYW0gbG9jIFNvdXJjZSBsb2NhdGlvbgorQHBhcmFtIGd0aWQgR2xvYmFsIHRocmVhZCBpZAorQHBhcmFtIHBfbGFzdCBwb2ludGVyIHRvIGxhc3QgaXRlcmF0aW9uIGZsYWcKK0BwYXJhbSBwX2xiICBwb2ludGVyIHRvIExvd2VyIGJvdW5kCitAcGFyYW0gcF91YiAgcG9pbnRlciB0byBVcHBlciBib3VuZAorQHBhcmFtIHBfc3QgIFN0ZXAgKG9yIGluY3JlbWVudCBpZiB5b3UgcHJlZmVyKQorQHBhcmFtIGluY3IgIExvb3AgaW5jcmVtZW50CitAcGFyYW0gY2h1bmsgVGhlIGNodW5rIHNpemUgdG8gYmxvY2sgd2l0aAorCitUaGUgZnVuY3Rpb25zIGNvbXB1dGUgdGhlIHVwcGVyIGFuZCBsb3dlciBib3VuZHMgYW5kIHN0cmlkZSB0byBiZSB1c2VkIGZvciB0aGUgc2V0IG9mIGl0ZXJhdGlvbnMKK3RvIGJlIGV4ZWN1dGVkIGJ5IHRoZSBjdXJyZW50IHRlYW0gZnJvbSB0aGUgc3RhdGljYWxseSBzY2hlZHVsZWQgbG9vcCB0aGF0IGlzIGRlc2NyaWJlZCBieSB0aGUKK2luaXRpYWwgdmFsdWVzIG9mIHRoZSBib3VuZHMsIHN0cmlkZSwgaW5jcmVtZW50IGFuZCBjaHVuayBmb3IgdGhlIGRpc3RyaWJ1dGUgY29uc3RydWN0IGFzIHBhcnQgb2YKK2NvbXBvc2l0ZSBkaXN0cmlidXRlIHBhcmFsbGVsIGxvb3AgY29uc3RydWN0LgorVGhlc2UgZnVuY3Rpb25zIGFyZSBhbGwgaWRlbnRpY2FsIGFwYXJ0IGZyb20gdGhlIHR5cGVzIG9mIHRoZSBhcmd1bWVudHMuCisqLworCit2b2lkCitfX2ttcGNfdGVhbV9zdGF0aWNfaW5pdF80KAorICAgIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIGttcF9pbnQzMiAqcF9sYXN0LAorICAgIGttcF9pbnQzMiAqcF9sYiwga21wX2ludDMyICpwX3ViLCBrbXBfaW50MzIgKnBfc3QsIGttcF9pbnQzMiBpbmNyLCBrbXBfaW50MzIgY2h1bmsgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7CisgICAgX19rbXBfdGVhbV9zdGF0aWNfaW5pdDwga21wX2ludDMyID4oIGxvYywgZ3RpZCwgcF9sYXN0LCBwX2xiLCBwX3ViLCBwX3N0LCBpbmNyLCBjaHVuayApOworfQorCisvKiEKKyBTZWUgQHJlZiBfX2ttcGNfdGVhbV9zdGF0aWNfaW5pdF80CisgKi8KK3ZvaWQKK19fa21wY190ZWFtX3N0YXRpY19pbml0XzR1KAorICAgIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIGttcF9pbnQzMiAqcF9sYXN0LAorICAgIGttcF91aW50MzIgKnBfbGIsIGttcF91aW50MzIgKnBfdWIsIGttcF9pbnQzMiAqcF9zdCwga21wX2ludDMyIGluY3IsIGttcF9pbnQzMiBjaHVuayApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsKKyAgICBfX2ttcF90ZWFtX3N0YXRpY19pbml0PCBrbXBfdWludDMyID4oIGxvYywgZ3RpZCwgcF9sYXN0LCBwX2xiLCBwX3ViLCBwX3N0LCBpbmNyLCBjaHVuayApOworfQorCisvKiEKKyBTZWUgQHJlZiBfX2ttcGNfdGVhbV9zdGF0aWNfaW5pdF80CisgKi8KK3ZvaWQKK19fa21wY190ZWFtX3N0YXRpY19pbml0XzgoCisgICAgaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwga21wX2ludDMyICpwX2xhc3QsCisgICAga21wX2ludDY0ICpwX2xiLCBrbXBfaW50NjQgKnBfdWIsIGttcF9pbnQ2NCAqcF9zdCwga21wX2ludDY0IGluY3IsIGttcF9pbnQ2NCBjaHVuayApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsKKyAgICBfX2ttcF90ZWFtX3N0YXRpY19pbml0PCBrbXBfaW50NjQgPiggbG9jLCBndGlkLCBwX2xhc3QsIHBfbGIsIHBfdWIsIHBfc3QsIGluY3IsIGNodW5rICk7Cit9CisKKy8qIQorIFNlZSBAcmVmIF9fa21wY190ZWFtX3N0YXRpY19pbml0XzQKKyAqLwordm9pZAorX19rbXBjX3RlYW1fc3RhdGljX2luaXRfOHUoCisgICAgaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwga21wX2ludDMyICpwX2xhc3QsCisgICAga21wX3VpbnQ2NCAqcF9sYiwga21wX3VpbnQ2NCAqcF91Yiwga21wX2ludDY0ICpwX3N0LCBrbXBfaW50NjQgaW5jciwga21wX2ludDY0IGNodW5rICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOworICAgIF9fa21wX3RlYW1fc3RhdGljX2luaXQ8IGttcF91aW50NjQgPiggbG9jLCBndGlkLCBwX2xhc3QsIHBfbGIsIHBfdWIsIHBfc3QsIGluY3IsIGNodW5rICk7Cit9CisvKiEKK0B9CisqLworCit9IC8vIGV4dGVybiAiQyIKKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX3NldHRpbmdzLmMgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfc2V0dGluZ3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2FiMWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX3NldHRpbmdzLmMKQEAgLTAsMCArMSw1MzU3IEBACisvKgorICoga21wX3NldHRpbmdzLmMgLS0gSW5pdGlhbGl6ZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMKKyAqICRSZXZpc2lvbjogNDM0NzMgJAorICogJERhdGU6IDIwMTQtMDktMjYgMTU6MDI6NTcgLTA1MDAgKEZyaSwgMjYgU2VwIDIwMTQpICQKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgImttcC5oIgorI2luY2x1ZGUgImttcF93cmFwcGVyX2dldHBpZC5oIgorI2luY2x1ZGUgImttcF9lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgImttcF9hdG9taWMuaCIKKyNpbmNsdWRlICJrbXBfaXR0LmgiCisjaW5jbHVkZSAia21wX3N0ci5oIgorI2luY2x1ZGUgImttcF9zZXR0aW5ncy5oIgorI2luY2x1ZGUgImttcF9pMThuLmgiCisjaW5jbHVkZSAia21wX2lvLmgiCisKKworc3RhdGljIGludCBfX2ttcF9lbnZfaXNEZWZpbmVkKCBjaGFyIGNvbnN0ICogbmFtZSApOworc3RhdGljIGludCBfX2ttcF9lbnZfdG9QcmludCggY2hhciBjb25zdCAqIG5hbWUsIGludCBmbGFnICk7CisKK2Jvb2wgX19rbXBfZW52X2Zvcm1hdCA9IDA7IC8vIDAgLSBvbGQgZm9ybWF0OyAxIC0gbmV3IGZvcm1hdAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSGVscGVyIHN0cmluZyBmdW5jdGlvbnMuIFN1YmplY3QgdG8gbW92ZSB0byBrbXBfc3RyLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgZG91YmxlCitfX2ttcF9jb252ZXJ0X3RvX2RvdWJsZSggY2hhciBjb25zdCAqIHMgKQoreworICAgIGRvdWJsZSByZXN1bHQ7CisKKyAgICBpZiAoIHNzY2FuZiggcywgIiVsZiIsICZyZXN1bHQgKSA8IDEgKSB7CisgICAgICAgIHJlc3VsdCA9IDAuMDsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdW5zaWduZWQgaW50CitfX2ttcF9yZWFkc3RyX3dpdGhfc2VudGluZWwoY2hhciAqZGVzdCwgY2hhciBjb25zdCAqIHNyYywgc2l6ZV90IGxlbiwgY2hhciBzZW50aW5lbCkgeworICAgIHVuc2lnbmVkIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICBpZiAoKCpzcmMgPT0gJ1wwJykgfHwgKCpzcmMgPT0gc2VudGluZWwpKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAqKGRlc3QrKykgPSAqKHNyYysrKTsKKyAgICB9CisgICAgKmRlc3QgPSAnXDAnOworICAgIHJldHVybiBpOworfQorCitzdGF0aWMgaW50CitfX2ttcF9tYXRjaF93aXRoX3NlbnRpbmVsKCBjaGFyIGNvbnN0ICogYSwgY2hhciBjb25zdCAqIGIsIHNpemVfdCBsZW4sIGNoYXIgc2VudGluZWwgKSB7CisgICAgc2l6ZV90IGwgPSAwOworCisgICAgaWYoYSA9PSBOVUxMKQorICAgICAgICBhID0gIiI7CisgICAgaWYoYiA9PSBOVUxMKQorICAgICAgICBiID0gIiI7CisgICAgd2hpbGUoKmEgJiYgKmIgJiYgKmIgIT0gc2VudGluZWwpIHsKKyAgICAgICAgY2hhciBjYSA9ICphLCBjYiA9ICpiOworCisgICAgICAgIGlmKGNhID49ICdhJyAmJiBjYSA8PSAneicpCisgICAgICAgICAgICBjYSAtPSAnYScgLSAnQSc7CisgICAgICAgIGlmKGNiID49ICdhJyAmJiBjYiA8PSAneicpCisgICAgICAgICAgICBjYiAtPSAnYScgLSAnQSc7CisgICAgICAgIGlmKGNhICE9IGNiKQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICArK2w7CisgICAgICAgICsrYTsKKyAgICAgICAgKytiOworICAgIH0KKyAgICByZXR1cm4gbCA+PSBsZW47Cit9CisKKy8vCisvLyBFeHBlY3RlZCB1c2FnZToKKy8vICAgICB0b2tlbiBpcyB0aGUgdG9rZW4gdG8gY2hlY2sgZm9yLgorLy8gICAgIGJ1ZiBpcyB0aGUgc3RyaW5nIGJlaW5nIHBhcnNlZC4KKy8vICAgICAqZW5kIHJldHVybnMgdGhlIGNoYXIgYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgdG9rZW4uCisvLyAgICAgICAgaXQgaXMgbm90IG1vZGlmaWVkIHVubGVzcyBhIG1hdGNoIG9jY3Vycy4KKy8vCisvLworLy8gRXhhbXBsZSAxOgorLy8KKy8vICAgICBpZiAoX19rbXBfbWF0Y2hfc3RyKCJ0b2tlbiIsIGJ1ZiwgKmVuZCkgeworLy8gICAgICAgICA8ZG8gc29tZXRoaW5nPgorLy8gICAgICAgICBidWYgPSBlbmQ7CisvLyAgICAgfQorLy8KKy8vICBFeGFtcGxlIDI6CisvLworLy8gICAgIGlmIChfX2ttcF9tYXRjaF9zdHIoInRva2VuIiwgYnVmLCAqZW5kKSB7CisvLyAgICAgICAgIGNoYXIgKnNhdmUgPSAqKmVuZDsKKy8vICAgICAgICAgKiplbmQgPSBzZW50aW5lbDsKKy8vICAgICAgICAgPHVzZSBhbnkgb2YgdGhlIF9fa21wKl93aXRoX3NlbnRpbmVsKCkgZnVuY3Rpb25zPgorLy8gICAgICAgICAqKmVuZCA9IHNhdmU7CisvLyAgICAgICAgIGJ1ZiA9IGVuZDsKKy8vICAgICB9CisvLworCitzdGF0aWMgaW50CitfX2ttcF9tYXRjaF9zdHIoIGNoYXIgY29uc3QgKnRva2VuLCBjaGFyIGNvbnN0ICpidWYsIGNvbnN0IGNoYXIgKiplbmQpIHsKKworICAgIEtNUF9BU1NFUlQodG9rZW4gIT0gTlVMTCk7CisgICAgS01QX0FTU0VSVChidWYgIT0gTlVMTCk7CisgICAgS01QX0FTU0VSVChlbmQgIT0gTlVMTCk7CisKKyAgICB3aGlsZSAoKnRva2VuICYmICpidWYpIHsKKyAgICAgICAgY2hhciBjdCA9ICp0b2tlbiwgY2IgPSAqYnVmOworCisgICAgICAgIGlmKGN0ID49ICdhJyAmJiBjdCA8PSAneicpCisgICAgICAgICAgICBjdCAtPSAnYScgLSAnQSc7CisgICAgICAgIGlmKGNiID49ICdhJyAmJiBjYiA8PSAneicpCisgICAgICAgICAgICBjYiAtPSAnYScgLSAnQSc7CisgICAgICAgIGlmIChjdCAhPSBjYikKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgKyt0b2tlbjsKKyAgICAgICAgKytidWY7CisgICAgfQorICAgIGlmICgqdG9rZW4pIHsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICAqZW5kID0gYnVmOworICAgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgY2hhciAqCitfX2ttcF9zdHJpcF9xdW90ZXMoIGNoYXIgKnRhcmdldCwgaW50IGxlbikgeworICAgIGNoYXIgKmVuZCA9IHRhcmdldCArIGxlbiAtIDE7CisKKyAgICB3aGlsZSgqdGFyZ2V0ID09ICciJyB8fCAqdGFyZ2V0ID09ICdcJycpIHsKKyAgICAgICAgaWYoZW5kIDw9IHRhcmdldCB8fCAoKmVuZCAhPSAnIicgJiYgKmVuZCAhPSAnXCcnKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAqZW5kID0gMDsKKyAgICAgICAgLS1lbmQ7CisgICAgICAgICp0YXJnZXQgPSAwOworICAgICAgICArK3RhcmdldDsKKyAgICB9CisgICAgcmV0dXJuIHRhcmdldDsKK30KKworCitzdGF0aWMgc2l6ZV90CitfX2ttcF9yb3VuZDRrKCBzaXplX3Qgc2l6ZSApIHsKKyAgICBzaXplX3QgXzRrID0gNCAqIDEwMjQ7CisgICAgaWYgKCBzaXplICYgKCBfNGsgLSAxICkgKSB7CisgICAgICAgIHNpemUgJj0gfiAoIF80ayAtIDEgKTsKKyAgICAgICAgaWYgKCBzaXplIDw9IEtNUF9TSVpFX1RfTUFYIC0gXzRrICkgeworICAgICAgICAgICAgc2l6ZSArPSBfNGs7ICAgIC8vIFJvdW5kIHVwIGlmIHRoZXJlIGlzIG5vIG92ZXJmbG93LgorICAgICAgICB9OyAvLyBpZgorICAgIH07IC8vIGlmCisgICAgcmV0dXJuIHNpemU7Cit9IC8vIF9fa21wX3JvdW5kNGsKKworCitzdGF0aWMgaW50CitfX2ttcF9jb252ZXJ0X3RvX3NlY29uZHMoIGNoYXIgY29uc3QgKiBkYXRhICkKK3sKKyAgICBpbnQgbnZhbHVlcywgdmFsdWUsIGZhY3RvcjsKKyAgICBjaGFyIG11bHQsIGV4dHJhOworCisgICAgaWYgKGRhdGEgPT0gTlVMTCkgcmV0dXJuICgwKTsKKyAgICB2YWx1ZSA9IDA7CisgICAgbXVsdCA9ICdcMCc7CisgICAgbnZhbHVlcyA9IHNzY2FuZiAoZGF0YSwgIiVkJWMlYyIsICZ2YWx1ZSwgJm11bHQsICZleHRyYSk7CisgICAgaWYgKG52YWx1ZXMgPCAxKSByZXR1cm4gKDApOworICAgIGlmIChudmFsdWVzID09IDEpIG11bHQgPSAnXDAnOworICAgIGlmIChudmFsdWVzID09IDMpIHJldHVybiAoLTEpOworCisgICAgc3dpdGNoIChtdWx0KSB7CisgICAgY2FzZSAncyc6IGNhc2UgJ1MnOgorICAgICAgICBmYWN0b3IgPSAxOworICAgICAgICBicmVhazsKKyAgICBjYXNlICdcMCc6CisgICAgICAgIGZhY3RvciA9IDYwOworICAgICAgICBicmVhazsKKyAgICBjYXNlICdtJzogY2FzZSAnTSc6CisgICAgICAgIGZhY3RvciA9IDYwOworICAgICAgICBicmVhazsKKyAgICBjYXNlICdoJzogY2FzZSAnSCc6CisgICAgICAgIGZhY3RvciA9IDYwICogNjA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJ2QnOiBjYXNlICdEJzoKKyAgICAgICAgZmFjdG9yID0gMjQgKiA2MCAqIDYwOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gKC0xKTsKKyAgICB9CisKKyAgICBpZiAodmFsdWUgPiAoSU5UX01BWCAvIGZhY3RvcikpCisgICAgICAgIHZhbHVlID0gSU5UX01BWDsKKyAgICBlbHNlCisgICAgICAgIHZhbHVlICo9IGZhY3RvcjsKKworICAgIHJldHVybiB2YWx1ZTsKK30KKworLyoKKyAgICBIZXJlLCBtdWx0aXBsaWVycyBhcmUgbGlrZSBfX2ttcF9jb252ZXJ0X3RvX3NlY29uZHMsIGJ1dCBmbG9hdGluZy1wb2ludAorICAgIHZhbHVlcyBhcmUgYWxsb3dlZCwgYW5kIHRoZSByZXR1cm4gdmFsdWUgaXMgaW4gbWlsbGlzZWNvbmRzLiAgVGhlIGRlZmF1bHQKKyAgICBtdWx0aXBsaWVyIGlzIG1pbGxpc2Vjb25kcy4gIFJldHVybnMgSU5UX01BWCBvbmx5IGlmIHRoZSB2YWx1ZSBzcGVjaWZpZWQKKyAgICBtYXRjaGVzICJpbmZpbml0KiIuICBSZXR1cm5zIC0xIGlmIHNwZWNpZmllZCBzdHJpbmcgaXMgaW52YWxpZC4KKyovCitpbnQKK19fa21wX2NvbnZlcnRfdG9fbWlsbGlzZWNvbmRzKCBjaGFyIGNvbnN0ICogZGF0YSApCit7CisgICAgaW50IHJldCwgbnZhbHVlcywgZmFjdG9yOworICAgIGNoYXIgbXVsdCwgZXh0cmE7CisgICAgZG91YmxlIHZhbHVlOworCisgICAgaWYgKGRhdGEgPT0gTlVMTCkgcmV0dXJuICgtMSk7CisgICAgaWYgKCBfX2ttcF9zdHJfbWF0Y2goICJpbmZpbml0IiwgLTEsIGRhdGEpKSByZXR1cm4gKElOVF9NQVgpOworICAgIHZhbHVlID0gKGRvdWJsZSkgMC4wOworICAgIG11bHQgPSAnXDAnOworICAgIG52YWx1ZXMgPSBzc2NhbmYgKGRhdGEsICIlbGYlYyVjIiwgJnZhbHVlLCAmbXVsdCwgJmV4dHJhKTsKKyAgICBpZiAobnZhbHVlcyA8IDEpIHJldHVybiAoLTEpOworICAgIGlmIChudmFsdWVzID09IDEpIG11bHQgPSAnXDAnOworICAgIGlmIChudmFsdWVzID09IDMpIHJldHVybiAoLTEpOworCisgICAgaWYgKHZhbHVlIDwgMCkgICAgcmV0dXJuICgtMSk7CisKKyAgICBzd2l0Y2ggKG11bHQpIHsKKyAgICBjYXNlICdcMCc6CisgICAgICAgIC8qICBkZWZhdWx0IGlzIG1pbGxpc2Vjb25kcyAgKi8KKyAgICAgICAgZmFjdG9yID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAncyc6IGNhc2UgJ1MnOgorICAgICAgICBmYWN0b3IgPSAxMDAwOworICAgICAgICBicmVhazsKKyAgICBjYXNlICdtJzogY2FzZSAnTSc6CisgICAgICAgIGZhY3RvciA9IDEwMDAgKiA2MDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnaCc6IGNhc2UgJ0gnOgorICAgICAgICBmYWN0b3IgPSAxMDAwICogNjAgKiA2MDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnZCc6IGNhc2UgJ0QnOgorICAgICAgICBmYWN0b3IgPSAxMDAwICogMjQgKiA2MCAqIDYwOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gKC0xKTsKKyAgICB9CisKKyAgICBpZiAoIHZhbHVlID49ICggKElOVF9NQVgtMSkgLyBmYWN0b3IpICkKKyAgICAgICAgcmV0ID0gSU5UX01BWC0xOyAgICAgICAgLyogRG9uJ3QgYWxsb3cgaW5maW5pdGUgdmFsdWUgaGVyZSAqLworICAgIGVsc2UKKyAgICAgICAgcmV0ID0gKGludCkgKHZhbHVlICogKGRvdWJsZSkgZmFjdG9yKTsgIC8qIHRydW5jYXRlIHRvIGludCAgKi8KKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBrbXBfdWludDY0CitfX2ttcF9jb252ZXJ0X3RvX25hbm9zZWNvbmRzKCAgICAgICAgIC8vIFI6IFRpbWUgaW4gbmFub3NlY29uZHMsIG9yIH4wIGluIGNhc2Ugb2YgZXJyb3IuCisgICAgY2hhciBjb25zdCAqIHN0ciAgICAgICAgICAgICAgICAgIC8vIEk6IFN0cmluZyByZXByZXNlbnRpbmcgdGltZS4KKykgeworCisgICAgZG91YmxlICAgICB2YWx1ZTsgICAgLy8gUGFyc2VkIHZhbHVlLgorICAgIGNoYXIgICAgICAgdW5pdDsgICAgIC8vIFVuaXQ6ICdzJywgJ20nLCAndScsIG9yICduJy4KKyAgICBjaGFyICAgICAgIGV4dHJhOyAgICAvLyBCdWZmZXIgZm9yIGV4dHJhIGNoYXJhY3RlciAoaWYgYW55KS4KKyAgICBpbnQgICAgICAgIHJjOyAgICAgICAvLyBSZXR1cm4gY29kZSBvZiBzc2NhbmYoKS4KKyAgICBkb3VibGUgICAgIGZhY3RvcjsgICAvLyBOdW1lcmljIGZhY3RvciBjb3JyZXNwb25kaW5nIHRvIHVuaXQuCisgICAga21wX3VpbnQ2NCByZXN1bHQ7CisKKyAgICBpZiAoIHN0ciA9PSBOVUxMIHx8IHN0clsgMCBdID09IDAgKSB7ICAgIC8vIE5vIHN0cmluZyBvciBlbXB0eSBzdHJpbmcuCisgICAgICAgIHJldHVybiAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEZWZhdWx0IHZhbHVlLgorICAgIH07IC8vIGlmCisgICAgcmMgPSBzc2NhbmYoIHN0ciwgIiVsZiVjJWMiLCAmdmFsdWUsICZ1bml0LCAmZXh0cmEgKTsKKyAgICBzd2l0Y2ggKCByYyApIHsKKyAgICAgICAgY2FzZSAwOiB7ICAgICAgICAgICAgIC8vIFZhbHVlIGlzIG5vdCBwYXJzZWQuCisgICAgICAgICAgICByZXR1cm4gfiAwOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIDE6IHsgICAgICAgICAgICAgLy8gT25lIHZhbHVlIHBhcnNlZCwgbm8gdW5pdCBpcyBzcGVjaWZpZWQuCisgICAgICAgICAgICB1bml0ID0gJ3MnOyAgICAgICAvLyBVc2UgZGVmYXVsdCB1bml0LgorICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIDI6IHsgICAgICAgICAgICAgLy8gVmFsdWUgYW5kIHVuaXQgYXJlIHBhcnNlZC4KKyAgICAgICAgICAgIC8vIERvIG5vdGhpbmcuCisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgMzogeyAgICAgICAgICAgICAvLyBFeHRyYSBjaGFyYWN0ZXJzIGlzIHNwZWNpZmllZC4KKyAgICAgICAgICAgIHJldHVybiB+IDA7CisgICAgICAgIH0gYnJlYWs7CisgICAgfTsgLy8gc3dpdGNoCisgICAgc3dpdGNoICggdW5pdCApIHsKKyAgICAgICAgY2FzZSAncyc6IHsKKyAgICAgICAgICAgIGZhY3RvciA9IDEuMEUrOTsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSAnbSc6IHsKKyAgICAgICAgICAgIGZhY3RvciA9IDEuMEUrNjsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSAndSc6IHsKKyAgICAgICAgICAgIGZhY3RvciA9IDEuMEUrMzsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSAnbic6IHsKKyAgICAgICAgICAgIGZhY3RvciA9IDEuMDsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgZGVmYXVsdDogeyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElsbGVnYWwgdW5pdC4KKyAgICAgICAgICAgIHJldHVybiB+IDA7ICAgICAgICAgICAgICAgICAgICAgIC8vIFJldHVybiBlcnJvci4KKyAgICAgICAgfSBicmVhazsKKyAgICB9OyAvLyBzd2l0Y2gKKyAgICByZXN1bHQgPSAoa21wX3VpbnQ2NCkoIHZhbHVlICogZmFjdG9yICk7CisgICAgcmV0dXJuIHJlc3VsdDsKKworfTsgLy8gZnVuYyBfX2ttcF9jb252ZXJ0X3RvX25hbm9zZWNvbmRzCisKKworc3RhdGljIGludAorX19rbXBfc3RyY2FzZWNtcF93aXRoX3NlbnRpbmVsKCBjaGFyIGNvbnN0ICogYSwgY2hhciBjb25zdCAqIGIsIGNoYXIgc2VudGluZWwgKSB7CisgICAgaWYoYSA9PSBOVUxMKQorICAgICAgICBhID0gIiI7CisgICAgaWYoYiA9PSBOVUxMKQorICAgICAgICBiID0gIiI7CisgICAgd2hpbGUoKmEgJiYgKmIgJiYgKmIgIT0gc2VudGluZWwpIHsKKyAgICAgICAgY2hhciBjYSA9ICphLCBjYiA9ICpiOworCisgICAgICAgIGlmKGNhID49ICdhJyAmJiBjYSA8PSAneicpCisgICAgICAgICAgICBjYSAtPSAnYScgLSAnQSc7CisgICAgICAgIGlmKGNiID49ICdhJyAmJiBjYiA8PSAneicpCisgICAgICAgICAgICBjYiAtPSAnYScgLSAnQSc7CisgICAgICAgIGlmKGNhICE9IGNiKQorICAgICAgICAgICAgcmV0dXJuIChpbnQpKHVuc2lnbmVkIGNoYXIpKmEgLSAoaW50KSh1bnNpZ25lZCBjaGFyKSpiOworICAgICAgICArK2E7CisgICAgICAgICsrYjsKKyAgICB9CisgICAgcmV0dXJuICphID8KKyAgICAgICAgKCpiICYmICpiICE9IHNlbnRpbmVsKSA/IChpbnQpKHVuc2lnbmVkIGNoYXIpKmEgLSAoaW50KSh1bnNpZ25lZCBjaGFyKSpiIDogMSA6CisgICAgICAgICgqYiAmJiAqYiAhPSBzZW50aW5lbCkgPyAtMSA6IDA7Cit9CisKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gVGFibGUgc3RydWN0dXJlcyBhbmQgaGVscGVyIGZ1bmN0aW9ucy4KKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwordHlwZWRlZiBzdHJ1Y3QgX19rbXBfc2V0dGluZyAgICAgICAga21wX3NldHRpbmdfdDsKK3R5cGVkZWYgc3RydWN0IF9fa21wX3N0Z19zc19kYXRhICAgIGttcF9zdGdfc3NfZGF0YV90OwordHlwZWRlZiBzdHJ1Y3QgX19rbXBfc3RnX3dwX2RhdGEgICAga21wX3N0Z193cF9kYXRhX3Q7Cit0eXBlZGVmIHN0cnVjdCBfX2ttcF9zdGdfZnJfZGF0YSAgICBrbXBfc3RnX2ZyX2RhdGFfdDsKKwordHlwZWRlZiB2b2lkICggKiBrbXBfc3RnX3BhcnNlX2Z1bmNfdCApKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApOwordHlwZWRlZiB2b2lkICggKiBrbXBfc3RnX3ByaW50X2Z1bmNfdCApKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKTsKKworc3RydWN0IF9fa21wX3NldHRpbmcgeworICAgIGNoYXIgY29uc3QgKiAgICAgICAgIG5hbWU7ICAgICAgICAvLyBOYW1lIG9mIHNldHRpbmcgKGVudmlyb25tZW50IHZhcmlhYmxlKS4KKyAgICBrbXBfc3RnX3BhcnNlX2Z1bmNfdCBwYXJzZTsgICAgICAgLy8gUGFyc2VyIGZ1bmN0aW9uLgorICAgIGttcF9zdGdfcHJpbnRfZnVuY190IHByaW50OyAgICAgICAvLyBQcmludCBmdW5jdGlvbi4KKyAgICB2b2lkICogICAgICAgICAgICAgICBkYXRhOyAgICAgICAgLy8gRGF0YSBwYXNzZWQgdG8gcGFyc2VyIGFuZCBwcmludGVyLgorICAgIGludCAgICAgICAgICAgICAgICAgIHNldDsgICAgICAgICAvLyBWYXJpYWJsZSBzZXQgZHVyaW5nIHRoaXMgInNlc3Npb24iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAoX19rbXBfZW52X2luaXRpYWxpemUoKSBvciBrbXBfc2V0X2RlZmF1bHRzKCkgY2FsbCkuCisgICAgaW50ICAgICAgICAgICAgICAgICAgZGVmaW5lZDsgICAgIC8vIFZhcmlhYmxlIHNldCBpbiBhbnkgInNlc3Npb24iLgorfTsgLy8gc3RydWN0IF9fa21wX3NldHRpbmcKKworc3RydWN0IF9fa21wX3N0Z19zc19kYXRhIHsKKyAgICBzaXplX3QgICAgICAgICAgICAgZmFjdG9yOyAgLy8gRGVmYXVsdCBmYWN0b3I6IDEgZm9yIEtNUF9TVEFDS1NJWkUsIDEwMjQgZm9yIG90aGVycy4KKyAgICBrbXBfc2V0dGluZ190ICogKiAgcml2YWxzOyAgLy8gQXJyYXkgb2YgcG9pbnRlcnMgdG8gcml2YWxzIChpbmNsdWRpbmcgaXRzZWxmKS4KK307IC8vIHN0cnVjdCBfX2ttcF9zdGdfc3NfZGF0YQorCitzdHJ1Y3QgX19rbXBfc3RnX3dwX2RhdGEgeworICAgIGludCAgICAgICAgICAgICAgICBvbXA7ICAgICAvLyAwIC0tIEtNUF9MSUJSQVJZLCAxIC0tIE9NUF9XQUlUX1BPTElDWS4KKyAgICBrbXBfc2V0dGluZ190ICogKiAgcml2YWxzOyAgLy8gQXJyYXkgb2YgcG9pbnRlcnMgdG8gcml2YWxzIChpbmNsdWRpbmcgaXRzZWxmKS4KK307IC8vIHN0cnVjdCBfX2ttcF9zdGdfd3BfZGF0YQorCitzdHJ1Y3QgX19rbXBfc3RnX2ZyX2RhdGEgeworICAgIGludCAgICAgICAgICAgICAgICBmb3JjZTsgIC8vIDAgLS0gS01QX0RFVEVSTUlOSVNUSUNfUkVEVUNUSU9OLCAxIC0tIEtNUF9GT1JDRV9SRURVQ1RJT04uCisgICAga21wX3NldHRpbmdfdCAqICogIHJpdmFsczsgIC8vIEFycmF5IG9mIHBvaW50ZXJzIHRvIHJpdmFscyAoaW5jbHVkaW5nIGl0c2VsZikuCit9OyAvLyBzdHJ1Y3QgX19rbXBfc3RnX2ZyX2RhdGEKKworc3RhdGljIGludAorX19rbXBfc3RnX2NoZWNrX3JpdmFscyggICAgICAgICAgLy8gMCAtLSBPaywgMSAtLSBlcnJvcnMgZm91bmQuCisgICAgY2hhciBjb25zdCAqICAgICAgIG5hbWUsICAgICAvLyBOYW1lIG9mIHZhcmlhYmxlLgorICAgIGNoYXIgY29uc3QgKiAgICAgICB2YWx1ZSwgICAgLy8gVmFsdWUgb2YgdGhlIHZhcmlhYmxlLgorICAgIGttcF9zZXR0aW5nX3QgKiAqICByaXZhbHMgICAgLy8gTGlzdCBvZiByaXZhbCBzZXR0aW5ncyAodGhlIGxpc3QgbXVzdCBpbmNsdWRlIGN1cnJlbnQgb25lKS4KKyk7CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSGVscGVyIHBhcnNlIGZ1bmN0aW9ucy4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9ib29sKAorICAgIGNoYXIgY29uc3QgKiBuYW1lLAorICAgIGNoYXIgY29uc3QgKiB2YWx1ZSwKKyAgICBpbnQgKiAgICAgICAgb3V0CispIHsKKyAgICBpZiAoIF9fa21wX3N0cl9tYXRjaF90cnVlKCB2YWx1ZSApICkgeworICAgICAgICAqIG91dCA9IFRSVUU7CisgICAgfSBlbHNlIGlmIChfX2ttcF9zdHJfbWF0Y2hfZmFsc2UoIHZhbHVlICkgKSB7CisgICAgICAgICogb3V0ID0gRkFMU0U7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAga21wX21zX3dhcm5pbmcsCisgICAgICAgICAgICBLTVBfTVNHKCBCYWRCb29sVmFsdWUsIG5hbWUsIHZhbHVlICksCisgICAgICAgICAgICBLTVBfSE5UKCBWYWxpZEJvb2xWYWx1ZXMgKSwKKyAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICk7CisgICAgfTsgLy8gaWYKK30gLy8gX19rbXBfc3RnX3BhcnNlX2Jvb2wKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9zaXplKAorICAgIGNoYXIgY29uc3QgKiBuYW1lLAorICAgIGNoYXIgY29uc3QgKiB2YWx1ZSwKKyAgICBzaXplX3QgICAgICAgc2l6ZV9taW4sCisgICAgc2l6ZV90ICAgICAgIHNpemVfbWF4LAorICAgIGludCAqICAgICAgICBpc19zcGVjaWZpZWQsCisgICAgc2l6ZV90ICogICAgIG91dCwKKyAgICBzaXplX3QgICAgICAgZmFjdG9yCispIHsKKyAgICBjaGFyIGNvbnN0ICogbXNnID0gTlVMTDsKKyAgICAjaWYgS01QX09TX0RBUldJTgorICAgICAgICBzaXplX21pbiA9IF9fa21wX3JvdW5kNGsoIHNpemVfbWluICk7CisgICAgICAgIHNpemVfbWF4ID0gX19rbXBfcm91bmQ0ayggc2l6ZV9tYXggKTsKKyAgICAjZW5kaWYgLy8gS01QX09TX0RBUldJTgorICAgIGlmICggdmFsdWUgKSB7CisgICAgICAgIGlmICggaXNfc3BlY2lmaWVkICE9IE5VTEwgKSB7CisgICAgICAgICAgICAqIGlzX3NwZWNpZmllZCA9IDE7CisgICAgICAgIH07IC8vIGlmCisgICAgICAgIF9fa21wX3N0cl90b19zaXplKCB2YWx1ZSwgb3V0LCBmYWN0b3IsICYgbXNnICk7CisgICAgICAgIGlmICggbXNnID09IE5VTEwgKSB7CisgICAgICAgICAgICBpZiAoICogb3V0ID4gc2l6ZV9tYXggKSB7CisgICAgICAgICAgICAgICAgKiBvdXQgPSBzaXplX21heDsKKyAgICAgICAgICAgICAgICBtc2cgPSBLTVBfSTE4Tl9TVFIoIFZhbHVlVG9vTGFyZ2UgKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoICogb3V0IDwgc2l6ZV9taW4gKSB7CisgICAgICAgICAgICAgICAgKiBvdXQgPSBzaXplX21pbjsKKyAgICAgICAgICAgICAgICBtc2cgPSBLTVBfSTE4Tl9TVFIoIFZhbHVlVG9vU21hbGwgKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgI2lmIEtNUF9PU19EQVJXSU4KKyAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHJvdW5kNGsgPSBfX2ttcF9yb3VuZDRrKCAqIG91dCApOworICAgICAgICAgICAgICAgICAgICBpZiAoICogb3V0ICE9IHJvdW5kNGsgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqIG91dCA9IHJvdW5kNGs7CisgICAgICAgICAgICAgICAgICAgICAgICBtc2cgPSBLTVBfSTE4Tl9TVFIoIE5vdE11bHRpcGxlNEsgKTsKKyAgICAgICAgICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBJZiBpbnRlZ2VyIG92ZXJmbG93IG9jY3VycmVkLCAqIG91dCA9PSBLTVBfU0laRV9UX01BWC4gQ3V0IGl0IHRvIHNpemVfbWF4IHNpbGVudGx5LgorICAgICAgICAgICAgaWYgKCAqIG91dCA8IHNpemVfbWluICkgeworICAgICAgICAgICAgICAgICogb3V0ID0gc2l6ZV9tYXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICggKiBvdXQgPiAgc2l6ZV9tYXggKSB7CisgICAgICAgICAgICAgICAgKiBvdXQgPSBzaXplX21heDsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgIH07IC8vIGlmCisgICAgICAgIGlmICggbXNnICE9IE5VTEwgKSB7CisgICAgICAgICAgICAvLyBNZXNzYWdlIGlzIG5vdCBlbXB0eS4gUHJpbnQgd2FybmluZy4KKyAgICAgICAgICAgIGttcF9zdHJfYnVmX3QgYnVmOworICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9pbml0KCAmIGJ1ZiApOworICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludF9zaXplKCAmIGJ1ZiwgKiBvdXQgKTsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBQYXJzZVNpemVJbnRXYXJuLCBuYW1lLCB2YWx1ZSwgbXNnICk7CisgICAgICAgICAgICBLTVBfSU5GT1JNKCBVc2luZ19zdHJfVmFsdWUsIG5hbWUsIGJ1Zi5zdHIgKTsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfZnJlZSggJiBidWYgKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICB9OyAvLyBpZgorfSAvLyBfX2ttcF9zdGdfcGFyc2Vfc2l6ZQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX3N0cigKKyAgICBjaGFyIGNvbnN0ICogICAgICBuYW1lLAorICAgIGNoYXIgY29uc3QgKiAgICAgIHZhbHVlLAorICAgIGNoYXIgY29uc3QgKiAqICAgIG91dAorKSB7CisgICAgS01QX0lOVEVSTkFMX0ZSRUUoICh2b2lkICopICogb3V0ICk7CisgICAgKiBvdXQgPSBfX2ttcF9zdHJfZm9ybWF0KCAiJXMiLCB2YWx1ZSApOworfSAvLyBfX2ttcF9zdGdfcGFyc2Vfc3RyCisKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9pbnQoCisgICAgY2hhciBjb25zdCAqIG5hbWUsICAgLy8gSTogTmFtZSBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZSAodXNlZCBpbiB3YXJuaW5nIG1lc3NhZ2VzKS4KKyAgICBjaGFyIGNvbnN0ICogdmFsdWUsICAvLyBJOiBWYWx1ZSBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBwYXJzZS4KKyAgICBpbnQgICAgICAgICAgbWluLCAgICAvLyBJOiBNaW1pbmFsIGFsbG93ZWQgdmFsdWUuCisgICAgaW50ICAgICAgICAgIG1heCwgICAgLy8gSTogTWF4aW11bSBhbGxvd2VkIHZhbHVlLgorICAgIGludCAqICAgICAgICBvdXQgICAgIC8vIE86IE91dHB1dCAocGFyc2VkKSB2YWx1ZS4KKykgeworICAgIGNoYXIgY29uc3QgKiBtc2cgID0gTlVMTDsKKyAgICBrbXBfdWludDY0ICAgdWludCA9ICogb3V0OworICAgIF9fa21wX3N0cl90b191aW50KCB2YWx1ZSwgJiB1aW50LCAmIG1zZyApOworICAgIGlmICggbXNnID09IE5VTEwgKSB7CisgICAgICAgIGlmICggdWludCA8ICh1bnNpZ25lZCBpbnQpbWluICkgeworICAgICAgICAgICAgbXNnID0gS01QX0kxOE5fU1RSKCBWYWx1ZVRvb1NtYWxsICk7CisgICAgICAgICAgICB1aW50ID0gbWluOworICAgICAgICB9IGVsc2UgaWYgKCB1aW50ID4gKHVuc2lnbmVkIGludCltYXggKSB7CisgICAgICAgICAgICBtc2cgPSBLTVBfSTE4Tl9TVFIoIFZhbHVlVG9vTGFyZ2UgKTsKKyAgICAgICAgICAgIHVpbnQgPSBtYXg7CisgICAgICAgIH07IC8vIGlmCisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gSWYgb3ZlcmZsb3cgb2NjdXJyZWQgbXNnIGNvbnRhaW5zIGVycm9yIG1lc3NhZ2UgYW5kIHVpbnQgaXMgdmVyeSBiaWcuIEN1dCB0bXAgaXQKKyAgICAgICAgLy8gdG8gSU5UX01BWC4KKyAgICAgICAgaWYgKCB1aW50IDwgKHVuc2lnbmVkIGludCltaW4gKSB7CisgICAgICAgICAgICB1aW50ID0gbWluOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCB1aW50ID4gKHVuc2lnbmVkIGludCltYXggKSB7CisgICAgICAgICAgICB1aW50ID0gbWF4OworICAgICAgICB9OyAvLyBpZgorICAgIH07IC8vIGlmCisgICAgaWYgKCBtc2cgIT0gTlVMTCApIHsKKyAgICAgICAgLy8gTWVzc2FnZSBpcyBub3QgZW1wdHkuIFByaW50IHdhcm5pbmcuCisgICAgICAgIGttcF9zdHJfYnVmX3QgYnVmOworICAgICAgICBLTVBfV0FSTklORyggUGFyc2VTaXplSW50V2FybiwgbmFtZSwgdmFsdWUsIG1zZyApOworICAgICAgICBfX2ttcF9zdHJfYnVmX2luaXQoICYgYnVmICk7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICZidWYsICIlIiBLTVBfVUlOVDY0X1NQRUMgIiIsIHVpbnQgKTsKKyAgICAgICAgS01QX0lORk9STSggVXNpbmdfdWludDY0X1ZhbHVlLCBuYW1lLCBidWYuc3RyICk7CisgICAgICAgIF9fa21wX3N0cl9idWZfZnJlZSggJmJ1ZiApOworICAgIH07IC8vIGlmCisgICAgKiBvdXQgPSB1aW50OworfSAvLyBfX2ttcF9zdGdfcGFyc2VfaW50CisKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9maWxlKAorICAgIGNoYXIgY29uc3QgKiBuYW1lLAorICAgIGNoYXIgY29uc3QgKiB2YWx1ZSwKKyAgICBjaGFyICogICAgICAgc3VmZml4LAorICAgIGNoYXIgKiAqICAgICBvdXQKKykgeworICAgIGNoYXIgYnVmZmVyWzI1Nl07CisgICAgY2hhciAqdDsKKyAgICBpbnQgaGFzU3VmZml4OworICAgIEtNUF9JTlRFUk5BTF9GUkVFKCAodm9pZCAqKSAqIG91dCApOworICAgIHQgPSAoY2hhciAqKSBzdHJyY2hyKHZhbHVlLCAnLicpOworICAgIGhhc1N1ZmZpeCA9IHQgJiYgX19rbXBfc3RyX2VxZiggdCwgc3VmZml4ICk7CisgICAgdCA9IF9fa21wX3N0cl9mb3JtYXQoICIlcyVzIiwgdmFsdWUsIGhhc1N1ZmZpeCA/ICIiIDogc3VmZml4ICk7CisgICAgX19rbXBfZXhwYW5kX2ZpbGVfbmFtZSggYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgdCk7CisgICAgS01QX0lOVEVSTkFMX0ZSRUUodCk7CisgICAgKiBvdXQgPSBfX2ttcF9zdHJfZm9ybWF0KCAiJXMiLCBidWZmZXIgKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX2ZpbGUKKworI2lmZGVmIEtNUF9ERUJVRworc3RhdGljIGNoYXIgKiBwYXJfcmFuZ2VfdG9fcHJpbnQgPSBOVUxMOworCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX3Bhcl9yYW5nZSgKKyAgICBjaGFyIGNvbnN0ICogbmFtZSwKKyAgICBjaGFyIGNvbnN0ICogdmFsdWUsCisgICAgaW50ICogICAgICAgIG91dF9yYW5nZSwKKyAgICBjaGFyICogICAgICAgb3V0X3JvdXRpbmUsCisgICAgY2hhciAqICAgICAgIG91dF9maWxlLAorICAgIGludCAqICAgICAgICBvdXRfbGIsCisgICAgaW50ICogICAgICAgIG91dF91YgorKSB7CisgICAgc2l6ZV90IGxlbiA9IHN0cmxlbiggdmFsdWUgKyAxICk7CisgICAgcGFyX3JhbmdlX3RvX3ByaW50ID0gKGNoYXIgKikgS01QX0lOVEVSTkFMX01BTExPQyggbGVuICsxICk7CisgICAgc3RybmNweSggcGFyX3JhbmdlX3RvX3ByaW50LCB2YWx1ZSwgbGVuICsgMSk7CisgICAgX19rbXBfcGFyX3JhbmdlID0gKzE7CisgICAgX19rbXBfcGFyX3JhbmdlX2xiID0gMDsKKyAgICBfX2ttcF9wYXJfcmFuZ2VfdWIgPSBJTlRfTUFYOworICAgIGZvciAoOzspIHsKKyAgICAgICAgdW5zaWduZWQgaW50IGxlbjsKKyAgICAgICAgaWYgKCggdmFsdWUgPT0gTlVMTCApIHx8ICggKnZhbHVlID09ICdcMCcgKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCAhIF9fa21wX3N0cmNhc2VjbXBfd2l0aF9zZW50aW5lbCggInJvdXRpbmUiLCB2YWx1ZSwgJz0nICkpIHsKKyAgICAgICAgICAgIHZhbHVlID0gc3RyY2hyKCB2YWx1ZSwgJz0nICkgKyAxOworICAgICAgICAgICAgbGVuID0gX19rbXBfcmVhZHN0cl93aXRoX3NlbnRpbmVsKCBvdXRfcm91dGluZSwKKyAgICAgICAgICAgICAgdmFsdWUsIEtNUF9QQVJfUkFOR0VfUk9VVElORV9MRU4gLSAxLCAnLCcgKTsKKyAgICAgICAgICAgIGlmICggbGVuID09IDAgKSB7CisgICAgICAgICAgICAgICAgZ290byBwYXJfcmFuZ2VfZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2YWx1ZSA9IHN0cmNociggdmFsdWUsICcsJyApOworICAgICAgICAgICAgaWYgKCB2YWx1ZSAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgIHZhbHVlKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoICEgX19rbXBfc3RyY2FzZWNtcF93aXRoX3NlbnRpbmVsKCAiZmlsZW5hbWUiLCB2YWx1ZSwgJz0nICkpIHsKKyAgICAgICAgICAgIHZhbHVlID0gc3RyY2hyKCB2YWx1ZSwgJz0nICkgKyAxOworICAgICAgICAgICAgbGVuID0gX19rbXBfcmVhZHN0cl93aXRoX3NlbnRpbmVsKCBvdXRfZmlsZSwKKyAgICAgICAgICAgICAgdmFsdWUsIEtNUF9QQVJfUkFOR0VfRklMRU5BTUVfTEVOIC0gMSwgJywnICk7CisgICAgICAgICAgICBpZiAoIGxlbiA9PSAwKSB7CisgICAgICAgICAgICAgICAgZ290byBwYXJfcmFuZ2VfZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2YWx1ZSA9IHN0cmNociggdmFsdWUsICcsJyApOworICAgICAgICAgICAgaWYgKCB2YWx1ZSAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgIHZhbHVlKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKCAhIF9fa21wX3N0cmNhc2VjbXBfd2l0aF9zZW50aW5lbCggInJhbmdlIiwgdmFsdWUsICc9JyApKQorICAgICAgICAgIHx8ICggISBfX2ttcF9zdHJjYXNlY21wX3dpdGhfc2VudGluZWwoICJpbmNsX3JhbmdlIiwgdmFsdWUsICc9JyApKSkgeworICAgICAgICAgICAgdmFsdWUgPSBzdHJjaHIoIHZhbHVlLCAnPScgKSArIDE7CisgICAgICAgICAgICBpZiAoIHNzY2FuZiggdmFsdWUsICIlZDolZCIsIG91dF9sYiwgb3V0X3ViICkgIT0gMiApIHsKKyAgICAgICAgICAgICAgICBnb3RvIHBhcl9yYW5nZV9lcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpvdXRfcmFuZ2UgPSArMTsKKyAgICAgICAgICAgIHZhbHVlID0gc3RyY2hyKCB2YWx1ZSwgJywnICk7CisgICAgICAgICAgICBpZiAoIHZhbHVlICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgdmFsdWUrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmICggISBfX2ttcF9zdHJjYXNlY21wX3dpdGhfc2VudGluZWwoICJleGNsX3JhbmdlIiwgdmFsdWUsICc9JyApKSB7CisgICAgICAgICAgICB2YWx1ZSA9IHN0cmNociggdmFsdWUsICc9JyApICsgMTsKKyAgICAgICAgICAgIGlmICggc3NjYW5mKCB2YWx1ZSwgIiVkOiVkIiwgb3V0X2xiLCBvdXRfdWIpICE9IDIgKSB7CisgICAgICAgICAgICAgICAgZ290byBwYXJfcmFuZ2VfZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqb3V0X3JhbmdlID0gLTE7CisgICAgICAgICAgICB2YWx1ZSA9IHN0cmNociggdmFsdWUsICcsJyApOworICAgICAgICAgICAgaWYgKCB2YWx1ZSAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgIHZhbHVlKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBwYXJfcmFuZ2VfZXJyb3I6CisgICAgICAgIEtNUF9XQVJOSU5HKCBQYXJSYW5nZVN5bnRheCwgbmFtZSApOworICAgICAgICBfX2ttcF9wYXJfcmFuZ2UgPSAwOworICAgICAgICBicmVhazsKKyAgICB9Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9wYXJfcmFuZ2UKKyNlbmRpZgorCitpbnQKK19fa21wX2luaXRpYWxfdGhyZWFkc19jYXBhY2l0eSggaW50IHJlcV9ucHJvYyApCit7CisgICAgaW50IG50aCA9IDMyOworCisgICAgLyogTUlOKCBNQVgoIDMyLCA0ICogJE9NUF9OVU1fVEhSRUFEUywgNCAqIG9tcF9nZXRfbnVtX3Byb2NzKCkgKSwgX19rbXBfbWF4X250aCkgKi8KKyAgICBpZiAobnRoIDwgKDQgKiByZXFfbnByb2MpKQorICAgICAgICBudGggPSAoNCAqIHJlcV9ucHJvYyk7CisgICAgaWYgKG50aCA8ICg0ICogX19rbXBfeHByb2MpKQorICAgICAgICBudGggPSAoNCAqIF9fa21wX3hwcm9jKTsKKworICAgIGlmIChudGggPiBfX2ttcF9tYXhfbnRoKQorICAgICAgICBudGggPSBfX2ttcF9tYXhfbnRoOworCisgICAgcmV0dXJuIG50aDsKK30KKworCitpbnQKK19fa21wX2RlZmF1bHRfdHBfY2FwYWNpdHkoIGludCByZXFfbnByb2MsIGludCBtYXhfbnRoLCBpbnQgYWxsX3RocmVhZHNfc3BlY2lmaWVkKSB7CisgICAgaW50IG50aCA9IDEyODsKKworICAgIGlmKGFsbF90aHJlYWRzX3NwZWNpZmllZCkKKyAgICAgICAgcmV0dXJuIG1heF9udGg7CisgICAgLyogTUlOKCBNQVggKDEyOCwgNCAqICRPTVBfTlVNX1RIUkVBRFMsIDQgKiBvbXBfZ2V0X251bV9wcm9jcygpICksIF9fa21wX21heF9udGggKSAqLworICAgIGlmIChudGggPCAoNCAqIHJlcV9ucHJvYykpCisgICAgICAgIG50aCA9ICg0ICogcmVxX25wcm9jKTsKKyAgICBpZiAobnRoIDwgKDQgKiBfX2ttcF94cHJvYykpCisgICAgICAgIG50aCA9ICg0ICogX19rbXBfeHByb2MpOworCisgICAgaWYgKG50aCA+IF9fa21wX21heF9udGgpCisgICAgICAgIG50aCA9IF9fa21wX21heF9udGg7CisKKyAgICByZXR1cm4gbnRoOworfQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEhlbHBlciBwcmludCBmdW5jdGlvbnMuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfYm9vbCgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIGludCB2YWx1ZSApIHsKKyAgICBpZiggX19rbXBfZW52X2Zvcm1hdCApIHsKKyAgICAgICAgS01QX1NUUl9CVUZfUFJJTlRfQk9PTDsKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIgICAlcz0lc1xuIiwgbmFtZSwgdmFsdWUgPyAidHJ1ZSIgOiAiZmFsc2UiICk7CisgICAgfQorfSAvLyBfX2ttcF9zdGdfcHJpbnRfYm9vbAorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2ludCgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIGludCB2YWx1ZSApIHsKKyAgICBpZiggX19rbXBfZW52X2Zvcm1hdCApIHsKKyAgICAgICAgS01QX1NUUl9CVUZfUFJJTlRfSU5UOworICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiAgICVzPSVkXG4iLCBuYW1lLCB2YWx1ZSApOworICAgIH0KK30gLy8gX19rbXBfc3RnX3ByaW50X2ludAorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X3VpbnQ2NCgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIGttcF91aW50NjQgdmFsdWUgKSB7CisgICAgaWYoIF9fa21wX2Vudl9mb3JtYXQgKSB7CisgICAgICAgIEtNUF9TVFJfQlVGX1BSSU5UX1VJTlQ2NDsKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIgICAlcz0lIiBLTVBfVUlOVDY0X1NQRUMgIlxuIiwgbmFtZSwgdmFsdWUgKTsKKyAgICB9Cit9IC8vIF9fa21wX3N0Z19wcmludF91aW50NjQKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9zdHIoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUgKSB7CisgICAgaWYoIF9fa21wX2Vudl9mb3JtYXQgKSB7CisgICAgICAgIEtNUF9TVFJfQlVGX1BSSU5UX1NUUjsKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIgICAlcz0lc1xuIiwgbmFtZSwgdmFsdWUgKTsKKyAgICB9Cit9IC8vIF9fa21wX3N0Z19wcmludF9zdHIKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9zaXplKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgc2l6ZV90IHZhbHVlICkgeworICAgIGlmKCBfX2ttcF9lbnZfZm9ybWF0ICkgeworICAgICAgICBLTVBfU1RSX0JVRl9QUklOVF9OQU1FX0VYKG5hbWUpOworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50X3NpemUoIGJ1ZmZlciwgdmFsdWUgKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJ1xuIiApOworICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiAgICVzPSIsIG5hbWUgKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludF9zaXplKCBidWZmZXIsIHZhbHVlICk7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIlxuIiApOworICAgICAgICByZXR1cm47CisgICAgfQorfSAvLyBfX2ttcF9zdGdfcHJpbnRfc2l6ZQorCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIFBhcnNlIGFuZCBwcmludCBmdW5jdGlvbnMuCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9BTExfVEhSRUFEUywgS01QX01BWF9USFJFQURTLCBPTVBfVEhSRUFEX0xJTUlUCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfYWxsX3RocmVhZHMoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworCisgICAga21wX3NldHRpbmdfdCAqICogcml2YWxzID0gKGttcF9zZXR0aW5nX3QgKiAqKSBkYXRhOworICAgIGludCAgICAgICAgICAgICAgIHJjOworICAgIHJjID0gX19rbXBfc3RnX2NoZWNrX3JpdmFscyggbmFtZSwgdmFsdWUsIHJpdmFscyApOworICAgIGlmICggcmMgKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9OyAvLyBpZgorICAgIGlmICggISBfX2ttcF9zdHJjYXNlY21wX3dpdGhfc2VudGluZWwoICJhbGwiLCB2YWx1ZSwgMCApICkgeworICAgICAgICBfX2ttcF9tYXhfbnRoID0gX19rbXBfeHByb2M7CisgICAgICAgIF9fa21wX2FsbFRocmVhZHNTcGVjaWZpZWQgPSAxOworICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX3N0Z19wYXJzZV9pbnQoIG5hbWUsIHZhbHVlLCAxLCBfX2ttcF9zeXNfbWF4X250aCwgJiBfX2ttcF9tYXhfbnRoICk7CisgICAgICAgIF9fa21wX2FsbFRocmVhZHNTcGVjaWZpZWQgPSAwOworICAgIH0KKyAgICBLX0RJQUcoIDEsICggIl9fa21wX21heF9udGggPT0gJWRcbiIsIF9fa21wX21heF9udGggKSApOworCit9IC8vIF9fa21wX3N0Z19wYXJzZV9hbGxfdGhyZWFkcworCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2FsbF90aHJlYWRzKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X2ludCggYnVmZmVyLCBuYW1lLCBfX2ttcF9tYXhfbnRoICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9hbGxfdGhyZWFkcworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfQkxPQ0tUSU1FCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfYmxvY2t0aW1lKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9kZmx0X2Jsb2NrdGltZSA9IF9fa21wX2NvbnZlcnRfdG9fbWlsbGlzZWNvbmRzKCB2YWx1ZSApOworICAgIGlmICggX19rbXBfZGZsdF9ibG9ja3RpbWUgPCAwICkgeworICAgICAgICBfX2ttcF9kZmx0X2Jsb2NrdGltZSA9IEtNUF9ERUZBVUxUX0JMT0NLVElNRTsKKyAgICAgICAgX19rbXBfbXNnKCBrbXBfbXNfd2FybmluZywgS01QX01TRyggSW52YWxpZFZhbHVlLCBuYW1lLCB2YWx1ZSApLCBfX2ttcF9tc2dfbnVsbCApOworICAgICAgICBLTVBfSU5GT1JNKCBVc2luZ19pbnRfVmFsdWUsIG5hbWUsIF9fa21wX2RmbHRfYmxvY2t0aW1lICk7CisgICAgICAgIF9fa21wX2Vudl9ibG9ja3RpbWUgPSBGQUxTRTsgIC8vIFJldmVydCB0byBkZWZhdWx0IGFzIGlmIHZhciBub3Qgc2V0LgorICAgIH0gZWxzZSB7CisgICAgICAgIGlmICggX19rbXBfZGZsdF9ibG9ja3RpbWUgPCBLTVBfTUlOX0JMT0NLVElNRSApIHsKKyAgICAgICAgICAgIF9fa21wX2RmbHRfYmxvY2t0aW1lID0gS01QX01JTl9CTE9DS1RJTUU7CisgICAgICAgICAgICBfX2ttcF9tc2coIGttcF9tc193YXJuaW5nLCBLTVBfTVNHKCBTbWFsbFZhbHVlLCBuYW1lLCB2YWx1ZSApLCBfX2ttcF9tc2dfbnVsbCApOworICAgICAgICAgICAgS01QX0lORk9STSggTWluVmFsdWVVc2luZywgbmFtZSwgX19rbXBfZGZsdF9ibG9ja3RpbWUgKTsKKyAgICAgICAgfSBlbHNlIGlmICggX19rbXBfZGZsdF9ibG9ja3RpbWUgPiBLTVBfTUFYX0JMT0NLVElNRSApIHsKKyAgICAgICAgICAgIF9fa21wX2RmbHRfYmxvY2t0aW1lID0gS01QX01BWF9CTE9DS1RJTUU7CisgICAgICAgICAgICBfX2ttcF9tc2coIGttcF9tc193YXJuaW5nLCBLTVBfTVNHKCBMYXJnZVZhbHVlLCBuYW1lLCB2YWx1ZSApLCBfX2ttcF9tc2dfbnVsbCApOworICAgICAgICAgICAgS01QX0lORk9STSggTWF4VmFsdWVVc2luZywgbmFtZSwgX19rbXBfZGZsdF9ibG9ja3RpbWUgKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgX19rbXBfZW52X2Jsb2NrdGltZSA9IFRSVUU7ICAgIC8vIEtNUF9CTE9DS1RJTUUgd2FzIHNwZWNpZmllZC4KKyAgICB9OyAvLyBpZgorICAgIC8vIGNhbGN1bGF0ZSBudW1iZXIgb2YgbW9uaXRvciB0aHJlYWQgd2FrZXVwIGludGVydmFscyBjb3JyZXNvbmRpbmcgdG8gYmxvY2t0aW1lLgorICAgIF9fa21wX21vbml0b3Jfd2FrZXVwcyA9IEtNUF9XQUtFVVBTX0ZST01fQkxPQ0tUSU1FKCBfX2ttcF9kZmx0X2Jsb2NrdGltZSwgX19rbXBfbW9uaXRvcl93YWtldXBzICk7CisgICAgX19rbXBfYnRfaW50ZXJ2YWxzID0gS01QX0lOVEVSVkFMU19GUk9NX0JMT0NLVElNRSggX19rbXBfZGZsdF9ibG9ja3RpbWUsIF9fa21wX21vbml0b3Jfd2FrZXVwcyApOworICAgIEtfRElBRyggMSwgKCAiX19rbXBfZW52X2Jsb2NrdGltZSA9PSAlZFxuIiwgX19rbXBfZW52X2Jsb2NrdGltZSApICk7CisgICAgaWYgKCBfX2ttcF9lbnZfYmxvY2t0aW1lICkgeworICAgICAgICBLX0RJQUcoIDEsICggIl9fa21wX2RmbHRfYmxvY2t0aW1lID09ICVkXG4iLCBfX2ttcF9kZmx0X2Jsb2NrdGltZSApICk7CisgICAgfQorfSAvLyBfX2ttcF9zdGdfcGFyc2VfYmxvY2t0aW1lCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfYmxvY2t0aW1lKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X2ludCggYnVmZmVyLCBuYW1lLCBfX2ttcF9kZmx0X2Jsb2NrdGltZSApOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfYmxvY2t0aW1lCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9EVVBMSUNBVEVfTElCX09LCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfZHVwbGljYXRlX2xpYl9vayggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgLyogYWN0dWFsbHkgdGhpcyB2YXJpYWJsZSBpcyBub3Qgc3VwcG9ydGVkLAorICAgICAgIHB1dCBoZXJlIGZvciBjb21wYXRpYmlsaXR5IHdpdGggZWFybGllciBidWlsZHMgYW5kIGZvciBzdGF0aWMvZHluYW1pYyBjb21iaW5hdGlvbiAqLworICAgIF9fa21wX3N0Z19wYXJzZV9ib29sKCBuYW1lLCB2YWx1ZSwgJiBfX2ttcF9kdXBsaWNhdGVfbGlicmFyeV9vayApOworfSAvLyBfX2ttcF9zdGdfcGFyc2VfZHVwbGljYXRlX2xpYl9vaworCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2R1cGxpY2F0ZV9saWJfb2soIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcHJpbnRfYm9vbCggYnVmZmVyLCBuYW1lLCBfX2ttcF9kdXBsaWNhdGVfbGlicmFyeV9vayApOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfZHVwbGljYXRlX2xpYl9vaworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfSU5IRVJJVF9GUF9DT05UUk9MCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfaW5oZXJpdF9mcF9jb250cm9sKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcGFyc2VfYm9vbCggbmFtZSwgdmFsdWUsICYgX19rbXBfaW5oZXJpdF9mcF9jb250cm9sICk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9pbmhlcml0X2ZwX2NvbnRyb2wKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9pbmhlcml0X2ZwX2NvbnRyb2woIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyNpZiBLTVBfREVCVUcKKyAgICBfX2ttcF9zdGdfcHJpbnRfYm9vbCggYnVmZmVyLCBuYW1lLCBfX2ttcF9pbmhlcml0X2ZwX2NvbnRyb2wgKTsKKyNlbmRpZiAvKiBLTVBfREVCVUcgKi8KK30gLy8gX19rbXBfc3RnX3ByaW50X2luaGVyaXRfZnBfY29udHJvbAorCisjZW5kaWYgLyogS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCAqLworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfTElCUkFSWSwgT01QX1dBSVRfUE9MSUNZCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2Vfd2FpdF9wb2xpY3koIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworCisgICAga21wX3N0Z193cF9kYXRhX3QgKiB3YWl0ID0gKGttcF9zdGdfd3BfZGF0YV90ICopIGRhdGE7CisgICAgaW50ICAgICAgICAgICAgICAgICByYzsKKworICAgIHJjID0gX19rbXBfc3RnX2NoZWNrX3JpdmFscyggbmFtZSwgdmFsdWUsIHdhaXQtPnJpdmFscyApOworICAgIGlmICggcmMgKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9OyAvLyBpZgorCisgICAgaWYgKCB3YWl0LT5vbXAgKSB7CisgICAgICAgIGlmICggX19rbXBfc3RyX21hdGNoKCAiQUNUSVZFIiwgMSwgdmFsdWUgKSApIHsKKyAgICAgICAgICAgX19rbXBfbGlicmFyeSA9IGxpYnJhcnlfdHVybmFyb3VuZDsKKyAgICAgICAgfSBlbHNlIGlmICggX19rbXBfc3RyX21hdGNoKCAiUEFTU0lWRSIsIDEsIHZhbHVlICkgKSB7CisgICAgICAgICAgIF9fa21wX2xpYnJhcnkgPSBsaWJyYXJ5X3Rocm91Z2hwdXQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBLTVBfV0FSTklORyggU3RnSW52YWxpZFZhbHVlLCBuYW1lLCB2YWx1ZSApOworICAgICAgICB9OyAvLyBpZgorICAgIH0gZWxzZSB7CisgICAgICAgIGlmICggX19rbXBfc3RyX21hdGNoKCAic2VyaWFsIiwgMSwgdmFsdWUgKSApIHsgICAgICAgICAgICAgLyogUyAqLworICAgICAgICAgICBfX2ttcF9saWJyYXJ5ID0gbGlicmFyeV9zZXJpYWw7CisgICAgICAgIH0gZWxzZSBpZiAoIF9fa21wX3N0cl9tYXRjaCggInRocm91Z2hwdXQiLCAyLCB2YWx1ZSApICkgeyAgLyogVEggKi8KKyAgICAgICAgICAgX19rbXBfbGlicmFyeSA9IGxpYnJhcnlfdGhyb3VnaHB1dDsKKyAgICAgICAgfSBlbHNlIGlmICggX19rbXBfc3RyX21hdGNoKCAidHVybmFyb3VuZCIsIDIsIHZhbHVlICkgKSB7ICAvKiBUVSAqLworICAgICAgICAgICBfX2ttcF9saWJyYXJ5ID0gbGlicmFyeV90dXJuYXJvdW5kOworICAgICAgICB9IGVsc2UgaWYgKCBfX2ttcF9zdHJfbWF0Y2goICJkZWRpY2F0ZWQiLCAxLCB2YWx1ZSApICkgeyAgIC8qIEQgKi8KKyAgICAgICAgICAgX19rbXBfbGlicmFyeSA9IGxpYnJhcnlfdHVybmFyb3VuZDsKKyAgICAgICAgfSBlbHNlIGlmICggX19rbXBfc3RyX21hdGNoKCAibXVsdGl1c2VyIiwgMSwgdmFsdWUgKSApIHsgICAvKiBNICovCisgICAgICAgICAgIF9fa21wX2xpYnJhcnkgPSBsaWJyYXJ5X3Rocm91Z2hwdXQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBLTVBfV0FSTklORyggU3RnSW52YWxpZFZhbHVlLCBuYW1lLCB2YWx1ZSApOworICAgICAgICB9OyAvLyBpZgorICAgIH07IC8vIGlmCisgICAgX19rbXBfYXV4X3NldF9saWJyYXJ5KCBfX2ttcF9saWJyYXJ5ICk7CisKK30gLy8gX19rbXBfc3RnX3BhcnNlX3dhaXRfcG9saWN5CisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfd2FpdF9wb2xpY3koIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKworICAgIGttcF9zdGdfd3BfZGF0YV90ICogd2FpdCA9IChrbXBfc3RnX3dwX2RhdGFfdCAqKSBkYXRhOworICAgIGNoYXIgY29uc3QgKiAgICAgICAgdmFsdWUgPSBOVUxMOworCisgICAgaWYgKCB3YWl0LT5vbXAgKSB7CisgICAgICAgIHN3aXRjaCAoIF9fa21wX2xpYnJhcnkgKSB7CisgICAgICAgICAgICBjYXNlIGxpYnJhcnlfdHVybmFyb3VuZCA6IHsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9ICJBQ1RJVkUiOworICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgIGNhc2UgbGlicmFyeV90aHJvdWdocHV0IDogeworICAgICAgICAgICAgICAgIHZhbHVlID0gIlBBU1NJVkUiOworICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgfTsgLy8gc3dpdGNoCisgICAgfSBlbHNlIHsKKyAgICAgICAgc3dpdGNoICggX19rbXBfbGlicmFyeSApIHsKKyAgICAgICAgICAgIGNhc2UgbGlicmFyeV9zZXJpYWwgOiB7CisgICAgICAgICAgICAgICAgdmFsdWUgPSAic2VyaWFsIjsKKyAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICBjYXNlIGxpYnJhcnlfdHVybmFyb3VuZCA6IHsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9ICJ0dXJuYXJvdW5kIjsKKyAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICBjYXNlIGxpYnJhcnlfdGhyb3VnaHB1dCA6IHsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9ICJ0aHJvdWdocHV0IjsKKyAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgIH07IC8vIHN3aXRjaAorICAgIH07IC8vIGlmCisgICAgaWYgKCB2YWx1ZSAhPSBOVUxMICkgeworICAgICAgICBfX2ttcF9zdGdfcHJpbnRfc3RyKCBidWZmZXIsIG5hbWUsIHZhbHVlICk7CisgICAgfTsgLy8gaWYKKworfSAvLyBfX2ttcF9zdGdfcHJpbnRfd2FpdF9wb2xpY3kKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX01PTklUT1JfU1RBQ0tTSVpFCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfbW9uaXRvcl9zdGFja3NpemUoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wYXJzZV9zaXplKAorICAgICAgICBuYW1lLAorICAgICAgICB2YWx1ZSwKKyAgICAgICAgX19rbXBfc3lzX21pbl9zdGtzaXplLAorICAgICAgICBLTVBfTUFYX1NUS1NJWkUsCisgICAgICAgIE5VTEwsCisgICAgICAgICYgX19rbXBfbW9uaXRvcl9zdGtzaXplLAorICAgICAgICAxCisgICAgKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX21vbml0b3Jfc3RhY2tzaXplCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfbW9uaXRvcl9zdGFja3NpemUoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBpZiggX19rbXBfZW52X2Zvcm1hdCApIHsKKyAgICAgICAgaWYgKCAgX19rbXBfbW9uaXRvcl9zdGtzaXplID4gMCApCisgICAgICAgICAgICBLTVBfU1RSX0JVRl9QUklOVF9OQU1FX0VYKG5hbWUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBLTVBfU1RSX0JVRl9QUklOVF9OQU1FOworICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiAgICVzIiwgbmFtZSApOworICAgIH0KKyAgICBpZiAoICBfX2ttcF9tb25pdG9yX3N0a3NpemUgPiAwICkgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50X3NpemUoIGJ1ZmZlciwgX19rbXBfbW9uaXRvcl9zdGtzaXplICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiOiAlc1xuIiwgS01QX0kxOE5fU1RSKCBOb3REZWZpbmVkICkgKTsKKyAgICB9CisgICAgaWYoIF9fa21wX2Vudl9mb3JtYXQgJiYgX19rbXBfbW9uaXRvcl9zdGtzaXplICkgeworICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJ1xuIik7CisgICAgfQorCit9IC8vIF9fa21wX3N0Z19wcmludF9tb25pdG9yX3N0YWNrc2l6ZQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfU0VUVElOR1MKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9zZXR0aW5ncyggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3BhcnNlX2Jvb2woIG5hbWUsIHZhbHVlLCAmIF9fa21wX3NldHRpbmdzICk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9zZXR0aW5ncworCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X3NldHRpbmdzKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X2Jvb2woIGJ1ZmZlciwgbmFtZSwgX19rbXBfc2V0dGluZ3MgKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X3NldHRpbmdzCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9TVEFDS1BBRAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX3N0YWNrcGFkKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcGFyc2VfaW50KAorICAgICAgICBuYW1lLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRW52IHZhciBuYW1lCisgICAgICAgIHZhbHVlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFbnYgdmFyIHZhbHVlCisgICAgICAgIEtNUF9NSU5fU1RLUEFERElORywgICAgICAgICAgICAgICAvLyBNaW4gdmFsdWUKKyAgICAgICAgS01QX01BWF9TVEtQQURESU5HLCAgICAgICAgICAgICAgIC8vIE1heCB2YWx1ZQorICAgICAgICAmIF9fa21wX3N0a3BhZGRpbmcgICAgICAgICAgICAgICAgLy8gVmFyIHRvIGluaXRpYWxpemUKKyAgICApOworfSAvLyBfX2ttcF9zdGdfcGFyc2Vfc3RhY2twYWQKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9zdGFja3BhZCgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9pbnQoIGJ1ZmZlciwgbmFtZSwgX19rbXBfc3RrcGFkZGluZyApOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfc3RhY2twYWQKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX1NUQUNLT0ZGU0VUCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2Vfc3RhY2tvZmZzZXQoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wYXJzZV9zaXplKAorICAgICAgICBuYW1lLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRW52IHZhciBuYW1lCisgICAgICAgIHZhbHVlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFbnYgdmFyIHZhbHVlCisgICAgICAgIEtNUF9NSU5fU1RLT0ZGU0VULCAgICAgICAgICAgICAgICAvLyBNaW4gdmFsdWUKKyAgICAgICAgS01QX01BWF9TVEtPRkZTRVQsICAgICAgICAgICAgICAgIC8vIE1heCB2YWx1ZQorICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgJiBfX2ttcF9zdGtvZmZzZXQsICAgICAgICAgICAgICAgIC8vIFZhciB0byBpbml0aWFsaXplCisgICAgICAgIDEKKyAgICApOworfSAvLyBfX2ttcF9zdGdfcGFyc2Vfc3RhY2tvZmZzZXQKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9zdGFja29mZnNldCgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9zaXplKCBidWZmZXIsIG5hbWUsIF9fa21wX3N0a29mZnNldCApOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfc3RhY2tvZmZzZXQKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX1NUQUNLU0laRSwgT01QX1NUQUNLU0laRSwgR09NUF9TVEFDS1NJWkUKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9zdGFja3NpemUoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworCisgICAga21wX3N0Z19zc19kYXRhX3QgKiAgc3RhY2tzaXplID0gKGttcF9zdGdfc3NfZGF0YV90ICopIGRhdGE7CisgICAgaW50ICAgICAgICAgICAgICAgICAgcmM7CisKKyAgICByYyA9IF9fa21wX3N0Z19jaGVja19yaXZhbHMoIG5hbWUsIHZhbHVlLCBzdGFja3NpemUtPnJpdmFscyApOworICAgIGlmICggcmMgKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9OyAvLyBpZgorICAgIF9fa21wX3N0Z19wYXJzZV9zaXplKAorICAgICAgICBuYW1lLCAgICAgICAgICAgICAgICAgICAgIC8vIEVudiB2YXIgbmFtZQorICAgICAgICB2YWx1ZSwgICAgICAgICAgICAgICAgICAgIC8vIEVudiB2YXIgdmFsdWUKKyAgICAgICAgX19rbXBfc3lzX21pbl9zdGtzaXplLCAgICAvLyBNaW4gdmFsdWUKKyAgICAgICAgS01QX01BWF9TVEtTSVpFLCAgICAgICAgICAvLyBNYXggdmFsdWUKKyAgICAgICAgJiBfX2ttcF9lbnZfc3Rrc2l6ZSwgICAgICAvLworICAgICAgICAmIF9fa21wX3N0a3NpemUsICAgICAgICAgIC8vIFZhciB0byBpbml0aWFsaXplCisgICAgICAgIHN0YWNrc2l6ZS0+ZmFjdG9yCisgICAgKTsKKworfSAvLyBfX2ttcF9zdGdfcGFyc2Vfc3RhY2tzaXplCisKKy8vIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBwcmludGluZyBib3RoIEtNUF9TVEFDS1NJWkUgKGZhY3RvciBpcyAxKSBhbmQgT01QX1NUQUNLU0laRSAoZmFjdG9yIGlzIDEwMjQpLgorLy8gQ3VycmVudGx5IGl0IGlzIG5vdCBwb3NzaWJsZSB0byBwcmludCBPTVBfU1RBQ0tTSVpFIHZhbHVlIGluIGJ5dGVzLiBXZSBjYW4gY29uc2lkZXIgYWRkaW5nIHRoaXMKKy8vIHBvc3NpYmlsaXR5IGJ5IGEgY3VzdG9tZXIgcmVxdWVzdCBpbiBmdXR1cmUuCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X3N0YWNrc2l6ZSgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIGttcF9zdGdfc3NfZGF0YV90ICogIHN0YWNrc2l6ZSA9IChrbXBfc3RnX3NzX2RhdGFfdCAqKSBkYXRhOworICAgIGlmKCBfX2ttcF9lbnZfZm9ybWF0ICkgeworICAgICAgICBLTVBfU1RSX0JVRl9QUklOVF9OQU1FX0VYKG5hbWUpOworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50X3NpemUoIGJ1ZmZlciwgKF9fa21wX3N0a3NpemUgJSAxMDI0KSA/IF9fa21wX3N0a3NpemUgLyBzdGFja3NpemUtPmZhY3RvciA6IF9fa21wX3N0a3NpemUgKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJ1xuIiApOworICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiAgICVzPSIsIG5hbWUgKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludF9zaXplKCBidWZmZXIsIChfX2ttcF9zdGtzaXplICUgMTAyNCkgPyBfX2ttcF9zdGtzaXplIC8gc3RhY2tzaXplLT5mYWN0b3IgOiBfX2ttcF9zdGtzaXplICk7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIlxuIiApOworICAgIH0KK30gLy8gX19rbXBfc3RnX3ByaW50X3N0YWNrc2l6ZQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfVkVSU0lPTgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX3ZlcnNpb24oIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wYXJzZV9ib29sKCBuYW1lLCB2YWx1ZSwgJiBfX2ttcF92ZXJzaW9uICk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV92ZXJzaW9uCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfdmVyc2lvbigga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9ib29sKCBidWZmZXIsIG5hbWUsIF9fa21wX3ZlcnNpb24gKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X3ZlcnNpb24KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX1dBUk5JTkdTCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2Vfd2FybmluZ3MoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wYXJzZV9ib29sKCBuYW1lLCB2YWx1ZSwgJiBfX2ttcF9nZW5lcmF0ZV93YXJuaW5ncyApOworICAgIGlmIChfX2ttcF9nZW5lcmF0ZV93YXJuaW5ncyAhPSBrbXBfd2FybmluZ3Nfb2ZmKSB7ICAgLy8gQUM6IHdlIGhhdmUgb25seSAwLzEgdmFsdWVzIGRvY3VtZW50ZWQsCisgICAgICAgIF9fa21wX2dlbmVyYXRlX3dhcm5pbmdzID0ga21wX3dhcm5pbmdzX2V4cGxpY2l0OyAvLyAgICAgc28gcmVzZXQgaXQgdG8gZXhwbGljaXQgaW4gb3JkZXIgdG8KKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBkaXN0aW5ndWlzaCBmcm9tIGRlZmF1bHQgc2V0dGluZworfSAvLyBfX2ttcF9lbnZfcGFyc2Vfd2FybmluZ3MKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF93YXJuaW5ncygga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9ib29sKCBidWZmZXIsIG5hbWUsIF9fa21wX2dlbmVyYXRlX3dhcm5pbmdzICk7IC8vIEFDOiBUT0RPOiBjaGFuZ2UgdG8gcHJpbnRfaW50PworfSAvLyBfX2ttcF9lbnZfcHJpbnRfd2FybmluZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAobmVlZHMgZG9jdW1lbnRhdGlvbiBjaGFuZ2UpLi4uCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE9NUF9ORVNURUQsIE9NUF9OVU1fVEhSRUFEUworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX25lc3RlZCggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3BhcnNlX2Jvb2woIG5hbWUsIHZhbHVlLCAmIF9fa21wX2RmbHRfbmVzdGVkICk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9uZXN0ZWQKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9uZXN0ZWQoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcHJpbnRfYm9vbCggYnVmZmVyLCBuYW1lLCBfX2ttcF9kZmx0X25lc3RlZCApOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfbmVzdGVkCisKK3N0YXRpYyB2b2lkCitfX2ttcF9wYXJzZV9uZXN0ZWRfbnVtX3RocmVhZHMoIGNvbnN0IGNoYXIgKnZhciwgY29uc3QgY2hhciAqZW52LCBrbXBfbmVzdGVkX250aHJlYWRzX3QgKm50aF9hcnJheSApCit7CisgICAgY29uc3QgY2hhciAqbmV4dCA9IGVudjsKKyAgICBjb25zdCBjaGFyICpzY2FuID0gbmV4dDsKKworICAgIGludCB0b3RhbCA9IDA7ICAgICAgICAgIC8vIENvdW50IGVsZW1lbnRzIHRoYXQgd2VyZSBzZXQuIEl0J2xsIGJlIHVzZWQgYXMgYW4gYXJyYXkgc2l6ZQorICAgIGludCBwcmV2X2NvbW1hID0gRkFMU0U7IC8vIEZvciBjb3JyZWN0IHByb2Nlc3Npbmcgc2VxdWVudGlhbCBjb21tYXMKKworICAgIC8vIENvdW50IHRoZSBudW1iZXIgb2YgdmFsdWVzIGluIHRoZSBlbnYuIHZhciBzdHJpbmcKKyAgICBmb3IgKCA7IDsgKSB7CisgICAgICAgIFNLSVBfV1MoIG5leHQgKTsKKworICAgICAgICBpZiAoICpuZXh0ID09ICdcMCcgKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAvLyBOZXh0IGNoYXJhY3RlciBpcyBub3QgYW4gaW50ZWdlciBvciBub3QgYSBjb21tYSA9PiBlbmQgb2YgbGlzdAorICAgICAgICBpZiAoICggKCAqbmV4dCA8ICcwJyApIHx8ICggKm5leHQgPiAnOScgKSApICYmICggKm5leHQgIT0nLCcpICkgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoIE50aFN5bnRheEVycm9yLCB2YXIsIGVudiApOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8vIFRoZSBuZXh0IGNoYXJhY3RlciBpcyAnLCcKKyAgICAgICAgaWYgKCAqbmV4dCA9PSAnLCcgKSB7CisgICAgICAgICAgICAvLyAnLCcgaXMgdGhlIGZpc3J0IGNoYXJhY3RlcgorICAgICAgICAgICAgaWYgKCB0b3RhbCA9PSAwIHx8IHByZXZfY29tbWEgKSB7CisgICAgICAgICAgICAgICAgdG90YWwrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByZXZfY29tbWEgPSBUUlVFOworICAgICAgICAgICAgbmV4dCsrOyAvL3NraXAgJywnCisgICAgICAgICAgICBTS0lQX1dTKCBuZXh0ICk7CisgICAgICAgIH0KKyAgICAgICAgLy8gTmV4dCBjaGFyYWN0ZXIgaXMgYSBkaWdpdAorICAgICAgICBpZiAoICpuZXh0ID49ICcwJyAmJiAqbmV4dCA8PSAnOScgKSB7CisgICAgICAgICAgICBwcmV2X2NvbW1hID0gRkFMU0U7CisgICAgICAgICAgICBTS0lQX0RJR0lUUyggbmV4dCApOworICAgICAgICAgICAgdG90YWwrKzsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRtcCA9IG5leHQ7CisgICAgICAgICAgICBTS0lQX1dTKCB0bXAgKTsKKyAgICAgICAgICAgIGlmICggKCAqbmV4dCA9PSAnICcgfHwgKm5leHQgPT0gJ1x0JyApICYmICggKnRtcCA+PSAnMCcgJiYgKnRtcCA8PSAnOScgKSApIHsKKyAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggTnRoU3BhY2VzTm90QWxsb3dlZCwgdmFyLCBlbnYgKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgS01QX0RFQlVHX0FTU0VSVCggdG90YWwgPiAwICk7CisgICAgaWYoIHRvdGFsIDw9IDAgKSB7CisgICAgICAgIEtNUF9XQVJOSU5HKCBOdGhTeW50YXhFcnJvciwgdmFyLCBlbnYgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIENoZWNrIGlmIHRoZSBuZXN0ZWQgbnRocmVhZHMgYXJyYXkgZXhpc3RzCisgICAgaWYgKCAhIG50aF9hcnJheS0+bnRoICkgeworICAgICAgICAvLyBBbGxvY2F0ZSBhbiBhcnJheSBvZiBkb3VibGUgc2l6ZQorICAgICAgICBudGhfYXJyYXktPm50aCA9ICggaW50ICogKUtNUF9JTlRFUk5BTF9NQUxMT0MoIHNpemVvZiggaW50ICkgKiB0b3RhbCAqIDIgKTsKKyAgICAgICAgaWYgKCBudGhfYXJyYXktPm50aCA9PSBOVUxMICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBNZW1vcnlBbGxvY0ZhaWxlZCApOworICAgICAgICB9CisgICAgICAgIG50aF9hcnJheS0+c2l6ZSA9IHRvdGFsICogMjsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoIG50aF9hcnJheS0+c2l6ZSA8IHRvdGFsICkgeworICAgICAgICAgICAgLy8gSW5jcmVhc2UgdGhlIGFycmF5IHNpemUKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBudGhfYXJyYXktPnNpemUgKj0gMjsKKyAgICAgICAgICAgIH0gd2hpbGUgKCBudGhfYXJyYXktPnNpemUgPCB0b3RhbCApOworCisgICAgICAgICAgICBudGhfYXJyYXktPm50aCA9IChpbnQgKikgS01QX0lOVEVSTkFMX1JFQUxMT0MoCisgICAgICAgICAgICAgICAgbnRoX2FycmF5LT5udGgsIHNpemVvZiggaW50ICkgKiBudGhfYXJyYXktPnNpemUgKTsKKyAgICAgICAgICAgIGlmICggbnRoX2FycmF5LT5udGggPT0gTlVMTCApIHsKKwkJS01QX0ZBVEFMKCBNZW1vcnlBbGxvY0ZhaWxlZCApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIG50aF9hcnJheS0+dXNlZCA9IHRvdGFsOworICAgIGludCBpID0gMDsKKworICAgIHByZXZfY29tbWEgPSBGQUxTRTsKKyAgICB0b3RhbCA9IDA7CisgICAgLy8gU2F2ZSB2YWx1ZXMgaW4gdGhlIGFycmF5CisgICAgZm9yICggOyA7ICkgeworICAgICAgICBTS0lQX1dTKCBzY2FuICk7CisgICAgICAgIGlmICggKnNjYW4gPT0gJ1wwJyApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIC8vIFRoZSBuZXh0IGNoYXJhY3RlciBpcyAnLCcKKyAgICAgICAgaWYgKCAqc2NhbiA9PSAnLCcgKSB7CisgICAgICAgICAgICAvLyAnLCcgaW4gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlzdAorICAgICAgICAgICAgaWYgKCB0b3RhbCA9PSAwICkgeworICAgICAgICAgICAgICAgIC8vIFRoZSB2YWx1ZSBpcyBzdXBwb3NlZCB0byBiZSBlcXVhbCB0byBfX2ttcF9hdmFpbF9wcm9jIGJ1dCBpdCBpcyB1bmtub3duIGF0IHRoZSBtb21lbnQuCisgICAgICAgICAgICAgICAgLy8gU28gbGV0J3MgcHV0IGEgcGxhY2Vob2xkZXIgKCN0aHJlYWRzID0gMCkgdG8gY29ycmVjdCBpdCBsYXRlci4KKyAgICAgICAgICAgICAgICBudGhfYXJyYXktPm50aFtpKytdID0gMDsKKyAgICAgICAgICAgICAgICB0b3RhbCsrOworICAgICAgICAgICAgfWVsc2UgaWYgKCBwcmV2X2NvbW1hICkgeworICAgICAgICAgICAgICAgIC8vIE51bSB0aHJlYWRzIGlzIGluaGVyaXRlZCBmcm9tIHRoZSBwcmV2aW91cyBsZXZlbAorICAgICAgICAgICAgICAgIG50aF9hcnJheS0+bnRoW2ldID0gbnRoX2FycmF5LT5udGhbaSAtIDFdOworICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICB0b3RhbCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJldl9jb21tYSA9IFRSVUU7CisgICAgICAgICAgICBzY2FuKys7IC8vc2tpcCAnLCcKKyAgICAgICAgICAgIFNLSVBfV1MoIHNjYW4gKTsKKyAgICAgICAgfQorICAgICAgICAvLyBOZXh0IGNoYXJhY3RlciBpcyBhIGRpZ2l0CisgICAgICAgIGlmICggKnNjYW4gPj0gJzAnICYmICpzY2FuIDw9ICc5JyApIHsKKyAgICAgICAgICAgIGludCBudW07CisgICAgICAgICAgICBjb25zdCBjaGFyICpidWYgPSBzY2FuOworICAgICAgICAgICAgY2hhciBjb25zdCAqIG1zZyAgPSBOVUxMOworICAgICAgICAgICAgcHJldl9jb21tYSA9IEZBTFNFOworICAgICAgICAgICAgU0tJUF9ESUdJVFMoIHNjYW4gKTsKKyAgICAgICAgICAgIHRvdGFsKys7CisKKyAgICAgICAgICAgIG51bSA9IF9fa21wX3N0cl90b19pbnQoIGJ1ZiwgKnNjYW4gKTsKKyAgICAgICAgICAgIGlmICggbnVtIDwgS01QX01JTl9OVEggKSB7CisgICAgICAgICAgICAgICAgbXNnID0gS01QX0kxOE5fU1RSKCBWYWx1ZVRvb1NtYWxsICk7CisgICAgICAgICAgICAgICAgbnVtID0gS01QX01JTl9OVEg7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCBudW0gPiBfX2ttcF9zeXNfbWF4X250aCApIHsKKyAgICAgICAgICAgICAgICBtc2cgPSBLTVBfSTE4Tl9TVFIoIFZhbHVlVG9vTGFyZ2UgKTsKKyAgICAgICAgICAgICAgICBudW0gPSBfX2ttcF9zeXNfbWF4X250aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggbXNnICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgLy8gTWVzc2FnZSBpcyBub3QgZW1wdHkuIFByaW50IHdhcm5pbmcuCisgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoIFBhcnNlU2l6ZUludFdhcm4sIHZhciwgZW52LCBtc2cgKTsKKyAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKCBVc2luZ19pbnRfVmFsdWUsIHZhciwgbnVtICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBudGhfYXJyYXktPm50aFtpKytdID0gbnVtOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX251bV90aHJlYWRzKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICAvLyBUT0RPOiBSZW1vdmUgdGhpcyBvcHRpb24uIE9NUF9OVU1fVEhSRUFEUyBpcyBhIGxpc3Qgb2YgcG9zaXRpdmUgaW50ZWdlcnMhCisgICAgaWYgKCAhIF9fa21wX3N0cmNhc2VjbXBfd2l0aF9zZW50aW5lbCggImFsbCIsIHZhbHVlLCAwICkgKSB7CisgICAgICAgIC8vIFRoZSBhcnJheSBvZiAxIGVsZW1lbnQKKyAgICAgICAgX19rbXBfbmVzdGVkX250aC5udGggPSAoIGludCogKUtNUF9JTlRFUk5BTF9NQUxMT0MoIHNpemVvZiggaW50ICkgKTsKKyAgICAgICAgX19rbXBfbmVzdGVkX250aC5zaXplID0gX19rbXBfbmVzdGVkX250aC51c2VkID0gMTsKKyAgICAgICAgX19rbXBfbmVzdGVkX250aC5udGhbMF0gPSBfX2ttcF9kZmx0X3RlYW1fbnRoID0gX19rbXBfZGZsdF90ZWFtX250aF91YiA9IF9fa21wX3hwcm9jOworICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX3BhcnNlX25lc3RlZF9udW1fdGhyZWFkcyggbmFtZSwgdmFsdWUsICYgX19rbXBfbmVzdGVkX250aCApOworICAgICAgICBpZiAoIF9fa21wX25lc3RlZF9udGgubnRoICkgeworICAgICAgICAgICAgX19rbXBfZGZsdF90ZWFtX250aCA9IF9fa21wX25lc3RlZF9udGgubnRoWzBdOworICAgICAgICAgICAgaWYgKCBfX2ttcF9kZmx0X3RlYW1fbnRoX3ViIDwgX19rbXBfZGZsdF90ZWFtX250aCApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9kZmx0X3RlYW1fbnRoX3ViID0gX19rbXBfZGZsdF90ZWFtX250aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07IC8vIGlmCisgICAgS19ESUFHKCAxLCAoICJfX2ttcF9kZmx0X3RlYW1fbnRoID09ICVkXG4iLCBfX2ttcF9kZmx0X3RlYW1fbnRoICkgKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX251bV90aHJlYWRzCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfbnVtX3RocmVhZHMoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBpZiggX19rbXBfZW52X2Zvcm1hdCApIHsKKyAgICAgICAgS01QX1NUUl9CVUZfUFJJTlRfTkFNRTsKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIgICAlcyIsIG5hbWUgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9uZXN0ZWRfbnRoLnVzZWQgKSB7CisgICAgICAgIGttcF9zdHJfYnVmX3QgYnVmOworICAgICAgICBfX2ttcF9zdHJfYnVmX2luaXQoICZidWYgKTsKKyAgICAgICAgZm9yICggaW50IGkgPSAwOyBpIDwgX19rbXBfbmVzdGVkX250aC51c2VkOyBpKyspIHsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICZidWYsICIlZCIsIF9fa21wX25lc3RlZF9udGgubnRoW2ldICk7CisgICAgICAgICAgICBpZiAoIGkgPCBfX2ttcF9uZXN0ZWRfbnRoLnVzZWQgLSAxICkgeworICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICZidWYsICIsIiApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIj0nJXMnXG4iLCBidWYuc3RyICk7CisgICAgICAgIF9fa21wX3N0cl9idWZfZnJlZSgmYnVmKTsKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICI6ICVzXG4iLCBLTVBfSTE4Tl9TVFIoIE5vdERlZmluZWQgKSApOworICAgIH0KK30gLy8gX19rbXBfc3RnX3ByaW50X251bV90aHJlYWRzCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE9wZW5NUCAzLjA6IEtNUF9UQVNLSU5HLCBPTVBfTUFYX0FDVElWRV9MRVZFTFMsCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfdGFza2luZyggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3BhcnNlX2ludCggbmFtZSwgdmFsdWUsIDAsIChpbnQpdHNrbV9tYXgsIChpbnQgKikmX19rbXBfdGFza2luZ19tb2RlICk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV90YXNraW5nCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfdGFza2luZygga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9pbnQoIGJ1ZmZlciwgbmFtZSwgX19rbXBfdGFza2luZ19tb2RlICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF90YXNraW5nCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfdGFza19zdGVhbGluZyggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3BhcnNlX2ludCggbmFtZSwgdmFsdWUsIDAsIDEsIChpbnQgKikmX19rbXBfdGFza19zdGVhbGluZ19jb25zdHJhaW50ICk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV90YXNrX3N0ZWFsaW5nCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfdGFza19zdGVhbGluZygga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9pbnQoIGJ1ZmZlciwgbmFtZSwgX19rbXBfdGFza19zdGVhbGluZ19jb25zdHJhaW50ICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF90YXNrX3N0ZWFsaW5nCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfbWF4X2FjdGl2ZV9sZXZlbHMoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworCSBfX2ttcF9zdGdfcGFyc2VfaW50KCBuYW1lLCB2YWx1ZSwgMCwgS01QX01BWF9BQ1RJVkVfTEVWRUxTX0xJTUlULCAmIF9fa21wX2RmbHRfbWF4X2FjdGl2ZV9sZXZlbHMgKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX21heF9hY3RpdmVfbGV2ZWxzCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfbWF4X2FjdGl2ZV9sZXZlbHMoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcHJpbnRfaW50KCBidWZmZXIsIG5hbWUsIF9fa21wX2RmbHRfbWF4X2FjdGl2ZV9sZXZlbHMgKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X21heF9hY3RpdmVfbGV2ZWxzCisKKyNpZiBLTVBfTkVTVEVEX0hPVF9URUFNUworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX0hPVF9URUFNU19NQVhfTEVWRUwsIEtNUF9IT1RfVEVBTVNfTU9ERQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2hvdF90ZWFtc19sZXZlbCggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgaWYgKCBUQ1JfNChfX2ttcF9pbml0X3BhcmFsbGVsKSApIHsKKyAgICAgICAgS01QX1dBUk5JTkcoIEVudlBhcmFsbGVsV2FybiwgbmFtZSApOworICAgICAgICByZXR1cm47CisgICAgfSAgIC8vIHJlYWQgdmFsdWUgYmVmb3JlIGZpcnN0IHBhcmFsbGVsIG9ubHkKKyAgICBfX2ttcF9zdGdfcGFyc2VfaW50KCBuYW1lLCB2YWx1ZSwgMCwgS01QX01BWF9BQ1RJVkVfTEVWRUxTX0xJTUlULCAmIF9fa21wX2hvdF90ZWFtc19tYXhfbGV2ZWwgKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX2hvdF90ZWFtc19sZXZlbAorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2hvdF90ZWFtc19sZXZlbCgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9pbnQoIGJ1ZmZlciwgbmFtZSwgX19rbXBfaG90X3RlYW1zX21heF9sZXZlbCApOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfaG90X3RlYW1zX2xldmVsCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfaG90X3RlYW1zX21vZGUoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIGlmICggVENSXzQoX19rbXBfaW5pdF9wYXJhbGxlbCkgKSB7CisgICAgICAgIEtNUF9XQVJOSU5HKCBFbnZQYXJhbGxlbFdhcm4sIG5hbWUgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0gICAvLyByZWFkIHZhbHVlIGJlZm9yZSBmaXJzdCBwYXJhbGxlbCBvbmx5CisgICAgX19rbXBfc3RnX3BhcnNlX2ludCggbmFtZSwgdmFsdWUsIDAsIEtNUF9NQVhfQUNUSVZFX0xFVkVMU19MSU1JVCwgJiBfX2ttcF9ob3RfdGVhbXNfbW9kZSApOworfSAvLyBfX2ttcF9zdGdfcGFyc2VfaG90X3RlYW1zX21vZGUKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9ob3RfdGVhbXNfbW9kZSgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9pbnQoIGJ1ZmZlciwgbmFtZSwgX19rbXBfaG90X3RlYW1zX21vZGUgKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X2hvdF90ZWFtc19tb2RlCisKKyNlbmRpZiAvLyBLTVBfTkVTVEVEX0hPVF9URUFNUworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfSEFORExFX1NJR05BTFMKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmIEtNUF9IQU5ETEVfU0lHTkFMUworCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2hhbmRsZV9zaWduYWxzKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKwlfX2ttcF9zdGdfcGFyc2VfYm9vbCggbmFtZSwgdmFsdWUsICYgX19rbXBfaGFuZGxlX3NpZ25hbHMgKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX2hhbmRsZV9zaWduYWxzCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfaGFuZGxlX3NpZ25hbHMoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcHJpbnRfYm9vbCggYnVmZmVyLCBuYW1lLCBfX2ttcF9oYW5kbGVfc2lnbmFscyApOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfaGFuZGxlX3NpZ25hbHMKKworI2VuZGlmIC8vIEtNUF9IQU5ETEVfU0lHTkFMUworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfWF9ERUJVRywgS01QX0RFQlVHLCBLTVBfREVCVUdfQlVGXyosIEtNUF9ESUFHCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZmRlZiBLTVBfREVCVUcKKworI2RlZmluZSBLTVBfU1RHX1hfREVCVUcoIHggKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RhdGljIHZvaWQgX19rbXBfc3RnX3BhcnNlXyMjeCMjX2RlYnVnKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsgICAgIFwKKwlfX2ttcF9zdGdfcGFyc2VfaW50KCBuYW1lLCB2YWx1ZSwgMCwgSU5UX01BWCwgJiBrbXBfIyN4IyNfZGVidWcgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAvKiBfX2ttcF9zdGdfcGFyc2VfeF9kZWJ1ZyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGF0aWMgdm9pZCBfX2ttcF9zdGdfcHJpbnRfIyN4IyNfZGVidWcoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsgXAorCV9fa21wX3N0Z19wcmludF9pbnQoIGJ1ZmZlciwgbmFtZSwga21wXyMjeCMjX2RlYnVnICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IC8qIF9fa21wX3N0Z19wcmludF94X2RlYnVnICovCisKK0tNUF9TVEdfWF9ERUJVRyggYSApCitLTVBfU1RHX1hfREVCVUcoIGIgKQorS01QX1NUR19YX0RFQlVHKCBjICkKK0tNUF9TVEdfWF9ERUJVRyggZCApCitLTVBfU1RHX1hfREVCVUcoIGUgKQorS01QX1NUR19YX0RFQlVHKCBmICkKKworI3VuZGVmIEtNUF9TVEdfWF9ERUJVRworCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2RlYnVnKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICBpbnQgZGVidWcgPSAwOworICAgIF9fa21wX3N0Z19wYXJzZV9pbnQoIG5hbWUsIHZhbHVlLCAwLCBJTlRfTUFYLCAmIGRlYnVnICk7CisgICAgaWYgKCBrbXBfYV9kZWJ1ZyA8IGRlYnVnICkgeworCWttcF9hX2RlYnVnID0gZGVidWc7CisgICAgfTsgLy8gaWYKKyAgICBpZiAoIGttcF9iX2RlYnVnIDwgZGVidWcgKSB7CisJa21wX2JfZGVidWcgPSBkZWJ1ZzsKKyAgICB9OyAvLyBpZgorICAgIGlmICgga21wX2NfZGVidWcgPCBkZWJ1ZyApIHsKKwlrbXBfY19kZWJ1ZyA9IGRlYnVnOworICAgIH07IC8vIGlmCisgICAgaWYgKCBrbXBfZF9kZWJ1ZyA8IGRlYnVnICkgeworCWttcF9kX2RlYnVnID0gZGVidWc7CisgICAgfTsgLy8gaWYKKyAgICBpZiAoIGttcF9lX2RlYnVnIDwgZGVidWcgKSB7CisJa21wX2VfZGVidWcgPSBkZWJ1ZzsKKyAgICB9OyAvLyBpZgorICAgIGlmICgga21wX2ZfZGVidWcgPCBkZWJ1ZyApIHsKKwlrbXBfZl9kZWJ1ZyA9IGRlYnVnOworICAgIH07IC8vIGlmCit9IC8vIF9fa21wX3N0Z19wYXJzZV9kZWJ1ZworCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2RlYnVnX2J1ZiggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3BhcnNlX2Jvb2woIG5hbWUsIHZhbHVlLCAmIF9fa21wX2RlYnVnX2J1ZiApOworICAgIC8vICEhISBUT0RPOiBNb3ZlIGJ1ZmZlciBpbml0aWFsaXphdGlvbiBvZiBvZiB0aGlzIGZpbGUhIEl0IG1heSB3b3JrcyBpbmNvcnJlY3RseSBpZgorICAgIC8vIEtNUF9ERUJVR19CVUYgaXMgcGFyc2VkIGJlZm9yZSBLTVBfREVCVUdfQlVGX0xJTkVTIG9yIEtNUF9ERUJVR19CVUZfQ0hBUlMuCisgICAgaWYgKCBfX2ttcF9kZWJ1Z19idWYgKSB7CisJaW50IGk7CisJaW50IGVsZW1lbnRzID0gX19rbXBfZGVidWdfYnVmX2xpbmVzICogX19rbXBfZGVidWdfYnVmX2NoYXJzOworCisJLyogYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYWxsIGVudHJpZXMgaW4gZGVidWcgYnVmZmVyIHRvIGVtcHR5ICovCisJX19rbXBfZGVidWdfYnVmZmVyID0gKGNoYXIgKikgX19rbXBfcGFnZV9hbGxvY2F0ZSggZWxlbWVudHMgKiBzaXplb2YoIGNoYXIgKSApOworCWZvciAoIGkgPSAwOyBpIDwgZWxlbWVudHM7IGkgKz0gX19rbXBfZGVidWdfYnVmX2NoYXJzICkKKwkgICBfX2ttcF9kZWJ1Z19idWZmZXJbaV0gPSAnXDAnOworCisJX19rbXBfZGVidWdfY291bnQgPSAwOworICAgIH0KKyAgICBLX0RJQUcoIDEsICggIl9fa21wX2RlYnVnX2J1ZiA9ICVkXG4iLCBfX2ttcF9kZWJ1Z19idWYgKSApOworfSAvLyBfX2ttcF9zdGdfcGFyc2VfZGVidWdfYnVmCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfZGVidWdfYnVmKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X2Jvb2woIGJ1ZmZlciwgbmFtZSwgX19rbXBfZGVidWdfYnVmICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9kZWJ1Z19idWYKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9kZWJ1Z19idWZfYXRvbWljKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcGFyc2VfYm9vbCggbmFtZSwgdmFsdWUsICYgX19rbXBfZGVidWdfYnVmX2F0b21pYyApOworfSAvLyBfX2ttcF9zdGdfcGFyc2VfZGVidWdfYnVmX2F0b21pYworCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2RlYnVnX2J1Zl9hdG9taWMoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcHJpbnRfYm9vbCggYnVmZmVyLCBuYW1lLCBfX2ttcF9kZWJ1Z19idWZfYXRvbWljICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9kZWJ1Z19idWZfYXRvbWljCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfZGVidWdfYnVmX2NoYXJzKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcGFyc2VfaW50KAorCW5hbWUsCisJdmFsdWUsCisJS01QX0RFQlVHX0JVRl9DSEFSU19NSU4sCisJSU5UX01BWCwKKwkmIF9fa21wX2RlYnVnX2J1Zl9jaGFycworICAgICk7Cit9IC8vIF9fa21wX3N0Z19kZWJ1Z19wYXJzZV9idWZfY2hhcnMKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9kZWJ1Z19idWZfY2hhcnMoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcHJpbnRfaW50KCBidWZmZXIsIG5hbWUsIF9fa21wX2RlYnVnX2J1Zl9jaGFycyApOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfZGVidWdfYnVmX2NoYXJzCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfZGVidWdfYnVmX2xpbmVzKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcGFyc2VfaW50KAorCW5hbWUsCisJdmFsdWUsCisJS01QX0RFQlVHX0JVRl9MSU5FU19NSU4sCisJSU5UX01BWCwKKwkmIF9fa21wX2RlYnVnX2J1Zl9saW5lcworICAgICk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9kZWJ1Z19idWZfbGluZXMKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9kZWJ1Z19idWZfbGluZXMoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcHJpbnRfaW50KCBidWZmZXIsIG5hbWUsIF9fa21wX2RlYnVnX2J1Zl9saW5lcyApOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfZGVidWdfYnVmX2xpbmVzCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfZGlhZyggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3BhcnNlX2ludCggbmFtZSwgdmFsdWUsIDAsIElOVF9NQVgsICYga21wX2RpYWcgKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX2RpYWcKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9kaWFnKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X2ludCggYnVmZmVyLCBuYW1lLCBrbXBfZGlhZyApOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfZGlhZworCisjZW5kaWYgLy8gS01QX0RFQlVHCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9BTElHTl9BTExPQworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2FsaWduX2FsbG9jKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcGFyc2Vfc2l6ZSgKKyAgICAgICAgbmFtZSwKKyAgICAgICAgdmFsdWUsCisgICAgICAgIENBQ0hFX0xJTkUsCisgICAgICAgIElOVF9NQVgsCisgICAgICAgIE5VTEwsCisgICAgICAgICYgX19rbXBfYWxpZ25fYWxsb2MsCisgICAgICAgIDEKKyAgICApOworfSAvLyBfX2ttcF9zdGdfcGFyc2VfYWxpZ25fYWxsb2MKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9hbGlnbl9hbGxvYygga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgICAgICBfX2ttcF9zdGdfcHJpbnRfc2l6ZSggYnVmZmVyLCBuYW1lLCBfX2ttcF9hbGlnbl9hbGxvYyApOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfYWxpZ25fYWxsb2MKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX1BMQUlOX0JBUlJJRVIsIEtNUF9GT1JLSk9JTl9CQVJSSUVSLCBLTVBfUkVEVUNUSU9OX0JBUlJJRVIKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gVE9ETzogUmVtb3ZlIF9fa21wX2JhcnJpZXJfYnJhbmNoX2JpdF9lbnZfbmFtZSB2YXJpYmFsZSwgcmVtb3ZlIGxvb3BzIGZyb20gcGFyc2UgYW5kIHByaW50CisvLyAgICAgICBmdW5jdGlvbnMsIHBhc3MgcmVxdWlyZWQgaW5mbyB0aHJvdWdoIGRhdGEgYXJndW1lbnQuCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfYmFycmllcl9icmFuY2hfYml0KCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICBjb25zdCBjaGFyICp2YXI7CisKKyAgICAvKiAtLS0tLS0tLS0tIEJhcnJpZXIgYnJhbmNoIGJpdCBjb250cm9sIC0tLS0tLS0tLS0tLSAqLworICAgIGZvciAoIGludCBpPWJzX3BsYWluX2JhcnJpZXI7IGk8YnNfbGFzdF9iYXJyaWVyOyBpKysgKSB7CisgICAgICAgIHZhciA9IF9fa21wX2JhcnJpZXJfYnJhbmNoX2JpdF9lbnZfbmFtZVsgaSBdOworICAgICAgICBpZiAoICggc3RyY21wKCB2YXIsIG5hbWUpID09IDAgKSAmJiAoIHZhbHVlICE9IDAgKSApIHsKKyAgICAgICAgICAgIGNoYXIgKmNvbW1hOworCisgICAgICAgICAgICBjb21tYSA9IChjaGFyICopIHN0cmNociggdmFsdWUsICcsJyApOworICAgICAgICAgICAgX19rbXBfYmFycmllcl9nYXRoZXJfYnJhbmNoX2JpdHNbIGkgXSA9ICgga21wX3VpbnQzMiApIF9fa21wX3N0cl90b19pbnQoIHZhbHVlLCAnLCcgKTsKKyAgICAgICAgICAgIC8qIGlzIHRoZXJlIGEgc3BlY2lmaWVkIHJlbGVhc2UgcGFyYW1ldGVyPyAqLworICAgICAgICAgICAgaWYgKCBjb21tYSA9PSBOVUxMICkgeworICAgICAgICAgICAgICAgIF9fa21wX2JhcnJpZXJfcmVsZWFzZV9icmFuY2hfYml0c1sgaSBdID0gX19rbXBfYmFycmllcl9yZWxlYXNlX2JiX2RmbHQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIF9fa21wX2JhcnJpZXJfcmVsZWFzZV9icmFuY2hfYml0c1sgaSBdID0gKGttcF91aW50MzIpIF9fa21wX3N0cl90b19pbnQoIGNvbW1hICsgMSwgMCApOworCisgICAgICAgICAgICAgICAgaWYgKCBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfYnJhbmNoX2JpdHNbIGkgXSA+IEtNUF9NQVhfQlJBTkNIX0JJVFMgKSB7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZygga21wX21zX3dhcm5pbmcsIEtNUF9NU0coIEJhcnJSZWxlYXNlVmFsdWVJbnZhbGlkLCBuYW1lLCBjb21tYSArIDEgKSwgX19rbXBfbXNnX251bGwgKTsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfYmFycmllcl9yZWxlYXNlX2JyYW5jaF9iaXRzWyBpIF0gPSBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfYmJfZGZsdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIF9fa21wX2JhcnJpZXJfZ2F0aGVyX2JyYW5jaF9iaXRzWyBpIF0gPiBLTVBfTUFYX0JSQU5DSF9CSVRTICkgeworICAgICAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggQmFyckdhdGhlclZhbHVlSW52YWxpZCwgbmFtZSwgdmFsdWUgKTsKKyAgICAgICAgICAgICAgICAgICAgS01QX0lORk9STSggVXNpbmdfdWludF9WYWx1ZSwgbmFtZSwgX19rbXBfYmFycmllcl9nYXRoZXJfYmJfZGZsdCApOworICAgICAgICAgICAgICAgIF9fa21wX2JhcnJpZXJfZ2F0aGVyX2JyYW5jaF9iaXRzWyBpIF0gPSAgX19rbXBfYmFycmllcl9nYXRoZXJfYmJfZGZsdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBLX0RJQUcoMSwgKCIlcyA9PSAlZCwlZFxuIiwgX19rbXBfYmFycmllcl9icmFuY2hfYml0X2Vudl9uYW1lWyBpIF0sIFwKKyAgICAgICAgICAgICAgICAgICBfX2ttcF9iYXJyaWVyX2dhdGhlcl9icmFuY2hfYml0cyBbIGkgXSwgXAorICAgICAgICAgICAgICAgICAgIF9fa21wX2JhcnJpZXJfcmVsZWFzZV9icmFuY2hfYml0cyBbIGkgXSkpCisgICAgfQorfSAvLyBfX2ttcF9zdGdfcGFyc2VfYmFycmllcl9icmFuY2hfYml0CisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfYmFycmllcl9icmFuY2hfYml0KCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgY29uc3QgY2hhciAqdmFyOworICAgIGZvciAoIGludCBpPWJzX3BsYWluX2JhcnJpZXI7IGk8YnNfbGFzdF9iYXJyaWVyOyBpKysgKSB7CisgICAgICAgIHZhciA9IF9fa21wX2JhcnJpZXJfYnJhbmNoX2JpdF9lbnZfbmFtZVsgaSBdOworICAgICAgICBpZiAoIHN0cmNtcCggdmFyLCBuYW1lKSA9PSAwICApIHsKKyAgICAgICAgICAgIGlmKCBfX2ttcF9lbnZfZm9ybWF0ICkgeworICAgICAgICAgICAgICAgIEtNUF9TVFJfQlVGX1BSSU5UX05BTUVfRVgoX19rbXBfYmFycmllcl9icmFuY2hfYml0X2Vudl9uYW1lWyBpIF0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIgICAlcz0nIiwgX19rbXBfYmFycmllcl9icmFuY2hfYml0X2Vudl9uYW1lWyBpIF0gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVkLCVkJ1xuIiwgX19rbXBfYmFycmllcl9nYXRoZXJfYnJhbmNoX2JpdHMgWyBpIF0sIF9fa21wX2JhcnJpZXJfcmVsZWFzZV9icmFuY2hfYml0cyBbIGkgXSk7CisgICAgICAgIH0KKyAgICB9Cit9IC8vIF9fa21wX3N0Z19wcmludF9iYXJyaWVyX2JyYW5jaF9iaXQKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfUExBSU5fQkFSUklFUl9QQVRURVJOLCBLTVBfRk9SS0pPSU5fQkFSUklFUl9QQVRURVJOLCBLTVBfUkVEVUNUSU9OX0JBUlJJRVJfUEFUVEVSTgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBUT0RPOiBSZW1vdmUgX19rbXBfYmFycmllcl9wYXR0ZXJuX25hbWUgdmFyaWFibGUsIHJlbW92ZSBsb29wcyBmcm9tIHBhcnNlIGFuZCBwcmludCBmdW5jdGlvbnMsCisvLyAgICAgICBwYXNzIHJlcXVpcmVkIGRhdGEgdG8gZnVuY3Rpb25zIHRocm91Z2ggZGF0YSBhcmd1bWVudC4KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9iYXJyaWVyX3BhdHRlcm4oIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIGNvbnN0IGNoYXIgKnZhcjsKKyAgICAvKiAtLS0tLS0tLS0tIEJhcnJpZXIgbWV0aG9kIGNvbnRyb2wgLS0tLS0tLS0tLS0tICovCisKKyAgICBmb3IgKCBpbnQgaT1ic19wbGFpbl9iYXJyaWVyOyBpPGJzX2xhc3RfYmFycmllcjsgaSsrICkgeworICAgICAgICB2YXIgPSBfX2ttcF9iYXJyaWVyX3BhdHRlcm5fZW52X25hbWVbIGkgXTsKKworICAgICAgICBpZiAoICggc3RyY21wICggdmFyLCBuYW1lICkgPT0gMCApICYmICggdmFsdWUgIT0gMCApICkgeworICAgICAgICAgICAgaW50IGo7CisgICAgICAgICAgICBjaGFyICpjb21tYSA9IChjaGFyICopIHN0cmNociggdmFsdWUsICcsJyApOworCisgICAgICAgICAgICAvKiBoYW5kbGUgZmlyc3QgcGFyYW1ldGVyOiBnYXRoZXIgcGF0dGVybiAqLworICAgICAgICAgICAgZm9yICggaiA9IGJwX2xpbmVhcl9iYXI7IGo8YnBfbGFzdF9iYXI7IGorKyApIHsKKyAgICAgICAgICAgICAgICBpZiAoX19rbXBfbWF0Y2hfd2l0aF9zZW50aW5lbCggX19rbXBfYmFycmllcl9wYXR0ZXJuX25hbWVbal0sIHZhbHVlLCAxLCAnLCcgKSkgeworICAgICAgICAgICAgICAgICAgIF9fa21wX2JhcnJpZXJfZ2F0aGVyX3BhdHRlcm5bIGkgXSA9IChrbXBfYmFyX3BhdF9lKSBqOworICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggaiA9PSBicF9sYXN0X2JhciApIHsKKyAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggQmFyckdhdGhlclZhbHVlSW52YWxpZCwgbmFtZSwgdmFsdWUgKTsKKyAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKCBVc2luZ19zdHJfVmFsdWUsIG5hbWUsIF9fa21wX2JhcnJpZXJfcGF0dGVybl9uYW1lWyBicF9saW5lYXJfYmFyIF0gKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogaGFuZGxlIHNlY29uZCBwYXJhbWV0ZXI6IHJlbGVhc2UgcGF0dGVybiAqLworICAgICAgICAgICAgaWYgKCBjb21tYSAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgIGZvciAoIGogPSBicF9saW5lYXJfYmFyOyBqIDwgYnBfbGFzdF9iYXI7IGorKyApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBfX2ttcF9zdHJfbWF0Y2goIF9fa21wX2JhcnJpZXJfcGF0dGVybl9uYW1lW2pdLCAxLCBjb21tYSArIDEgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfYmFycmllcl9yZWxlYXNlX3BhdHRlcm5bIGkgXSA9IChrbXBfYmFyX3BhdF9lKSBqOworICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaiA9PSBicF9sYXN0X2JhcikgeworICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2coIGttcF9tc193YXJuaW5nLCBLTVBfTVNHKCBCYXJyUmVsZWFzZVZhbHVlSW52YWxpZCwgbmFtZSwgY29tbWEgKyAxICksIF9fa21wX21zZ19udWxsICk7CisgICAgICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oIFVzaW5nX3N0cl9WYWx1ZSwgbmFtZSwgX19rbXBfYmFycmllcl9wYXR0ZXJuX25hbWVbIGJwX2xpbmVhcl9iYXIgXSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30gLy8gX19rbXBfc3RnX3BhcnNlX2JhcnJpZXJfcGF0dGVybgorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2JhcnJpZXJfcGF0dGVybigga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIGNvbnN0IGNoYXIgKnZhcjsKKyAgICBmb3IgKCBpbnQgaT1ic19wbGFpbl9iYXJyaWVyOyBpPGJzX2xhc3RfYmFycmllcjsgaSsrICkgeworICAgICAgICB2YXIgPSBfX2ttcF9iYXJyaWVyX3BhdHRlcm5fZW52X25hbWVbIGkgXTsKKyAgICAgICAgaWYgKCBzdHJjbXAgKCB2YXIsIG5hbWUgKSA9PSAwICkgeworICAgICAgICAgICAgaW50IGogPSBfX2ttcF9iYXJyaWVyX2dhdGhlcl9wYXR0ZXJuIFsgaSBdOworICAgICAgICAgICAgaW50IGsgPSBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfcGF0dGVybiBbIGkgXTsKKyAgICAgICAgICAgIGlmKCBfX2ttcF9lbnZfZm9ybWF0ICkgeworICAgICAgICAgICAgICAgIEtNUF9TVFJfQlVGX1BSSU5UX05BTUVfRVgoX19rbXBfYmFycmllcl9wYXR0ZXJuX2Vudl9uYW1lWyBpIF0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIgICAlcz0nIiwgX19rbXBfYmFycmllcl9wYXR0ZXJuX2Vudl9uYW1lWyBpIF0gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzLCVzJ1xuIiwgX19rbXBfYmFycmllcl9wYXR0ZXJuX25hbWUgWyBqIF0sIF9fa21wX2JhcnJpZXJfcGF0dGVybl9uYW1lIFsgayBdKTsKKyAgICAgICAgfQorICAgIH0KK30gLy8gX19rbXBfc3RnX3ByaW50X2JhcnJpZXJfcGF0dGVybgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfQUJPUlRfREVMQVkKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9hYm9ydF9kZWxheSggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgLy8gVW5pdHMgb2YgS01QX0RFTEFZX0FCT1JUIGFyZSBzZWNvbmRzLCB1bml0cyBvZiBfX2ttcF9hYm9ydF9kZWxheSBpcyBtaWxsaXNlY29uZHMuCisgICAgaW50IGRlbGF5ID0gX19rbXBfYWJvcnRfZGVsYXkgLyAxMDAwOworICAgIF9fa21wX3N0Z19wYXJzZV9pbnQoIG5hbWUsIHZhbHVlLCAwLCBJTlRfTUFYIC8gMTAwMCwgJiBkZWxheSApOworICAgIF9fa21wX2Fib3J0X2RlbGF5ID0gZGVsYXkgKiAxMDAwOworfSAvLyBfX2ttcF9zdGdfcGFyc2VfYWJvcnRfZGVsYXkKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9hYm9ydF9kZWxheSgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9pbnQoIGJ1ZmZlciwgbmFtZSwgX19rbXBfYWJvcnRfZGVsYXkgKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X2Fib3J0X2RlbGF5CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9DUFVJTkZPX0ZJTEUKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9jcHVpbmZvX2ZpbGUoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgICNpZiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgICAgIF9fa21wX3N0Z19wYXJzZV9zdHIoIG5hbWUsIHZhbHVlLCAmIF9fa21wX2NwdWluZm9fZmlsZSApOworICAgICAgICBLX0RJQUcoIDEsICggIl9fa21wX2NwdWluZm9fZmlsZSA9PSAlc1xuIiwgX19rbXBfY3B1aW5mb19maWxlICkgKTsKKyAgICAjZW5kaWYKK30gLy9fX2ttcF9zdGdfcGFyc2VfY3B1aW5mb19maWxlCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfY3B1aW5mb19maWxlKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgI2lmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICAgICAgaWYoIF9fa21wX2Vudl9mb3JtYXQgKSB7CisgICAgICAgICAgICBLTVBfU1RSX0JVRl9QUklOVF9OQU1FOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAgJXMiLCBuYW1lICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBfX2ttcF9jcHVpbmZvX2ZpbGUgKSB7CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICI9JyVzJ1xuIiwgX19rbXBfY3B1aW5mb19maWxlICk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICI6ICVzXG4iLCBLTVBfSTE4Tl9TVFIoIE5vdERlZmluZWQgKSApOworICAgICAgICB9CisgICAgI2VuZGlmCit9IC8vX19rbXBfc3RnX3ByaW50X2NwdWluZm9fZmlsZQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfRk9SQ0VfUkVEVUNUSU9OLCBLTVBfREVURVJNSU5JU1RJQ19SRURVQ1RJT04KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9mb3JjZV9yZWR1Y3Rpb24oIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkKK3sKKyAgICBrbXBfc3RnX2ZyX2RhdGFfdCAqIHJlZHVjdGlvbiA9IChrbXBfc3RnX2ZyX2RhdGFfdCAqKSBkYXRhOworICAgIGludCAgICAgICAgICAgICAgICAgcmM7CisKKyAgICByYyA9IF9fa21wX3N0Z19jaGVja19yaXZhbHMoIG5hbWUsIHZhbHVlLCByZWR1Y3Rpb24tPnJpdmFscyApOworICAgIGlmICggcmMgKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9OyAvLyBpZgorICAgIGlmICggcmVkdWN0aW9uLT5mb3JjZSApIHsKKyAgICAgICAgaWYoIHZhbHVlICE9IDAgKSB7CisgICAgICAgICAgICBpZiggX19rbXBfc3RyX21hdGNoKCAiY3JpdGljYWwiLCAwLCB2YWx1ZSApICkKKyAgICAgICAgICAgICAgIF9fa21wX2ZvcmNlX3JlZHVjdGlvbl9tZXRob2QgPSBjcml0aWNhbF9yZWR1Y2VfYmxvY2s7CisgICAgICAgICAgICBlbHNlIGlmKCBfX2ttcF9zdHJfbWF0Y2goICJhdG9taWMiLCAwLCB2YWx1ZSApICkKKyAgICAgICAgICAgICAgIF9fa21wX2ZvcmNlX3JlZHVjdGlvbl9tZXRob2QgPSBhdG9taWNfcmVkdWNlX2Jsb2NrOworICAgICAgICAgICAgZWxzZSBpZiggX19rbXBfc3RyX21hdGNoKCAidHJlZSIsIDAsIHZhbHVlICkgKQorICAgICAgICAgICAgICAgX19rbXBfZm9yY2VfcmVkdWN0aW9uX21ldGhvZCA9IHRyZWVfcmVkdWNlX2Jsb2NrOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgS01QX0ZBVEFMKCBVbmtub3duRm9yY2VSZWR1Y3Rpb24sIG5hbWUsIHZhbHVlICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9zdGdfcGFyc2VfYm9vbCggbmFtZSwgdmFsdWUsICYgX19rbXBfZGV0ZXJtX3JlZCApOworICAgICAgICBpZiggX19rbXBfZGV0ZXJtX3JlZCApIHsKKyAgICAgICAgICAgIF9fa21wX2ZvcmNlX3JlZHVjdGlvbl9tZXRob2QgPSB0cmVlX3JlZHVjZV9ibG9jazsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIF9fa21wX2ZvcmNlX3JlZHVjdGlvbl9tZXRob2QgPSByZWR1Y3Rpb25fbWV0aG9kX25vdF9kZWZpbmVkOworICAgICAgICB9CisgICAgfQorICAgIEtfRElBRyggMSwgKCAiX19rbXBfZm9yY2VfcmVkdWN0aW9uX21ldGhvZCA9PSAlZFxuIiwgX19rbXBfZm9yY2VfcmVkdWN0aW9uX21ldGhvZCApICk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9mb3JjZV9yZWR1Y3Rpb24KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9mb3JjZV9yZWR1Y3Rpb24oIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKworICAgIGttcF9zdGdfZnJfZGF0YV90ICogcmVkdWN0aW9uID0gKGttcF9zdGdfZnJfZGF0YV90ICopIGRhdGE7CisgICAgY2hhciBjb25zdCAqICAgICAgICB2YWx1ZSA9IE5VTEw7CisgICAgaWYgKCByZWR1Y3Rpb24tPmZvcmNlICkgeworICAgICAgICBpZiggX19rbXBfZm9yY2VfcmVkdWN0aW9uX21ldGhvZCA9PSBjcml0aWNhbF9yZWR1Y2VfYmxvY2spIHsKKyAgICAgICAgICAgIF9fa21wX3N0Z19wcmludF9zdHIoIGJ1ZmZlciwgbmFtZSwgImNyaXRpY2FsIik7CisgICAgICAgIH0gZWxzZSBpZiAoIF9fa21wX2ZvcmNlX3JlZHVjdGlvbl9tZXRob2QgPT0gYXRvbWljX3JlZHVjZV9ibG9jayApIHsKKyAgICAgICAgICAgIF9fa21wX3N0Z19wcmludF9zdHIoIGJ1ZmZlciwgbmFtZSwgImF0b21pYyIpOworICAgICAgICB9IGVsc2UgaWYgKCBfX2ttcF9mb3JjZV9yZWR1Y3Rpb25fbWV0aG9kID09IHRyZWVfcmVkdWNlX2Jsb2NrICkgeworICAgICAgICAgICAgX19rbXBfc3RnX3ByaW50X3N0ciggYnVmZmVyLCBuYW1lLCAidHJlZSIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYoIF9fa21wX2Vudl9mb3JtYXQgKSB7CisgICAgICAgICAgICAgICAgS01QX1NUUl9CVUZfUFJJTlRfTkFNRTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAgJXMiLCBuYW1lICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICI6ICVzXG4iLCBLTVBfSTE4Tl9TVFIoIE5vdERlZmluZWQgKSApOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfc3RnX3ByaW50X2Jvb2woIGJ1ZmZlciwgbmFtZSwgX19rbXBfZGV0ZXJtX3JlZCApOworICAgIH0KKworCit9IC8vIF9fa21wX3N0Z19wcmludF9mb3JjZV9yZWR1Y3Rpb24KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX1NUT1JBR0VfTUFQCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2Vfc3RvcmFnZV9tYXAoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIGlmICggX19rbXBfc3RyX21hdGNoKCAgInZlcmJvc2UiLCAxLCB2YWx1ZSApICkgeworICAgICAgICBfX2ttcF9zdG9yYWdlX21hcCAgICAgICAgID0gVFJVRTsKKyAgICAgICAgX19rbXBfc3RvcmFnZV9tYXBfdmVyYm9zZSA9IFRSVUU7CisgICAgICAgIF9fa21wX3N0b3JhZ2VfbWFwX3ZlcmJvc2Vfc3BlY2lmaWVkID0gVFJVRTsKKworICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX3N0b3JhZ2VfbWFwX3ZlcmJvc2UgPSBGQUxTRTsKKyAgICAgICAgX19rbXBfc3RnX3BhcnNlX2Jvb2woIG5hbWUsIHZhbHVlLCAmIF9fa21wX3N0b3JhZ2VfbWFwICk7IC8vICEhIQorICAgIH07IC8vIGlmCit9IC8vIF9fa21wX3N0Z19wYXJzZV9zdG9yYWdlX21hcAorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X3N0b3JhZ2VfbWFwKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgaWYgKCBfX2ttcF9zdG9yYWdlX21hcF92ZXJib3NlIHx8IF9fa21wX3N0b3JhZ2VfbWFwX3ZlcmJvc2Vfc3BlY2lmaWVkICkgeworICAgICAgICBfX2ttcF9zdGdfcHJpbnRfc3RyKCBidWZmZXIsIG5hbWUsICJ2ZXJib3NlIiApOworICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX3N0Z19wcmludF9ib29sKCBidWZmZXIsIG5hbWUsIF9fa21wX3N0b3JhZ2VfbWFwICk7CisgICAgfQorfSAvLyBfX2ttcF9zdGdfcHJpbnRfc3RvcmFnZV9tYXAKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX0FMTF9USFJFQURQUklWQVRFCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfYWxsX3RocmVhZHByaXZhdGUoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wYXJzZV9pbnQoIG5hbWUsIHZhbHVlLCBfX2ttcF9hbGxUaHJlYWRzU3BlY2lmaWVkID8gX19rbXBfbWF4X250aCA6IDEsIF9fa21wX21heF9udGgsCisgICAgICAgICYgX19rbXBfdHBfY2FwYWNpdHkgKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX2FsbF90aHJlYWRwcml2YXRlCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfYWxsX3RocmVhZHByaXZhdGUoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcHJpbnRfaW50KCBidWZmZXIsIG5hbWUsIF9fa21wX3RwX2NhcGFjaXR5ICk7CisKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX0ZPUkVJR05fVEhSRUFEU19USFJFQURQUklWQVRFCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfZm9yZWlnbl90aHJlYWRzX3RocmVhZHByaXZhdGUoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wYXJzZV9ib29sKCBuYW1lLCB2YWx1ZSwgJiBfX2ttcF9mb3JlaWduX3RwICk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9mb3JlaWduX3RocmVhZHNfdGhyZWFkcHJpdmF0ZQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2ZvcmVpZ25fdGhyZWFkc190aHJlYWRwcml2YXRlKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X2Jvb2woIGJ1ZmZlciwgbmFtZSwgX19rbXBfZm9yZWlnbl90cCApOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfZm9yZWlnbl90aHJlYWRzX3RocmVhZHByaXZhdGUKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfQUZGSU5JVFksIEdPTVBfQ1BVX0FGRklOSVRZLCBLTVBfVE9QT0xPR1lfTUVUSE9ECisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisvLworLy8gUGFyc2UgdGhlIHByb2MgaWQgbGlzdC4gIFJldHVybiBUUlVFIGlmIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZS4KKy8vCitzdGF0aWMgaW50CitfX2ttcF9wYXJzZV9hZmZpbml0eV9wcm9jX2lkX2xpc3QoIGNvbnN0IGNoYXIgKnZhciwgY29uc3QgY2hhciAqZW52LAorICAgIGNvbnN0IGNoYXIgKipuZXh0RW52LCBjaGFyICoqcHJvY2xpc3QgKQoreworICAgIGNvbnN0IGNoYXIgKnNjYW4gPSBlbnY7CisgICAgY29uc3QgY2hhciAqbmV4dCA9IHNjYW47CisgICAgaW50IGVtcHR5ID0gVFJVRTsKKworICAgICpwcm9jbGlzdCA9IE5VTEw7CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGludCBzdGFydCwgZW5kLCBzdHJpZGU7CisKKyAgICAgICAgU0tJUF9XUyhzY2FuKTsKKyAgICAgICAgbmV4dCA9IHNjYW47CisgICAgICAgIGlmICgqbmV4dCA9PSAnXDAnKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgqbmV4dCA9PSAneycpIHsKKyAgICAgICAgICAgIGludCBudW07CisgICAgICAgICAgICBuZXh0Kys7ICAgICAvLyBza2lwICd7JworICAgICAgICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICAgICAgICAgIHNjYW4gPSBuZXh0OworCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gUmVhZCB0aGUgZmlyc3QgaW50ZWdlciBpbiB0aGUgc2V0LgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGlmICgoKm5leHQgPCAnMCcpIHx8ICgqbmV4dCA+ICc5JykpIHsKKyAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggQWZmU3ludGF4RXJyb3IsIHZhciApOworICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgICAgICAgICAgbnVtID0gX19rbXBfc3RyX3RvX2ludChzY2FuLCAqbmV4dCk7CisgICAgICAgICAgICBLTVBfQVNTRVJUKG51bSA+PSAwKTsKKworICAgICAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGVuZCBvZiBzZXQuCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICBTS0lQX1dTKG5leHQpOworICAgICAgICAgICAgICAgIGlmICgqbmV4dCA9PSAnfScpIHsKKyAgICAgICAgICAgICAgICAgICAgbmV4dCsrOyAgICAgLy8gc2tpcCAnfScKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyBTa2lwIG9wdGlvbmFsIGNvbW1hLgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgaWYgKCpuZXh0ID09ICcsJykgeworICAgICAgICAgICAgICAgICAgICBuZXh0Kys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFNLSVBfV1MobmV4dCk7CisKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIFJlYWQgdGhlIG5leHQgaW50ZWdlciBpbiB0aGUgc2V0LgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgc2NhbiA9IG5leHQ7CisgICAgICAgICAgICAgICAgaWYgKCgqbmV4dCA8ICcwJykgfHwgKCpuZXh0ID4gJzknKSkgeworICAgICAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggQWZmU3ludGF4RXJyb3IsIHZhciApOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgU0tJUF9ESUdJVFMobmV4dCk7CisgICAgICAgICAgICAgICAgbnVtID0gX19rbXBfc3RyX3RvX2ludChzY2FuLCAqbmV4dCk7CisgICAgICAgICAgICAgICAgS01QX0FTU0VSVChudW0gPj0gMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbXB0eSA9IEZBTFNFOworCisgICAgICAgICAgICBTS0lQX1dTKG5leHQpOworICAgICAgICAgICAgaWYgKCpuZXh0ID09ICcsJykgeworICAgICAgICAgICAgICAgIG5leHQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNjYW4gPSBuZXh0OworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvLworICAgICAgICAvLyBOZXh0IGNoYXJhY3RlciBpcyBub3QgYW4gaW50ZWdlciA9PiBlbmQgb2YgbGlzdAorICAgICAgICAvLworICAgICAgICBpZiAoKCpuZXh0IDwgJzAnKSB8fCAoKm5leHQgPiAnOScpKSB7CisgICAgICAgICAgICBpZiAoZW1wdHkpIHsKKyAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggQWZmU3ludGF4RXJyb3IsIHZhciApOworICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gUmVhZCB0aGUgZmlyc3QgaW50ZWdlci4KKyAgICAgICAgLy8KKyAgICAgICAgU0tJUF9ESUdJVFMobmV4dCk7CisgICAgICAgIHN0YXJ0ID0gX19rbXBfc3RyX3RvX2ludChzY2FuLCAqbmV4dCk7CisgICAgICAgIEtNUF9BU1NFUlQoc3RhcnQgPj0gMCk7CisgICAgICAgIFNLSVBfV1MobmV4dCk7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gSWYgdGhpcyBpc24ndCBhIHJhbmdlLCB0aGVuIGdvIG9uLgorICAgICAgICAvLworICAgICAgICBpZiAoKm5leHQgIT0gJy0nKSB7CisgICAgICAgICAgICBlbXB0eSA9IEZBTFNFOworCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gU2tpcCBvcHRpb25hbCBjb21tYS4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBpZiAoKm5leHQgPT0gJywnKSB7CisgICAgICAgICAgICAgICAgbmV4dCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2NhbiA9IG5leHQ7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIFRoaXMgaXMgYSByYW5nZS4gIFNraXAgb3ZlciB0aGUgJy0nIGFuZCByZWFkIGluIHRoZSAybmQgaW50LgorICAgICAgICAvLworICAgICAgICBuZXh0Kys7ICAgICAgICAgLy8gc2tpcCAnLScKKyAgICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICAgICAgc2NhbiA9IG5leHQ7CisgICAgICAgIGlmICgoKm5leHQgPCAnMCcpIHx8ICgqbmV4dCA+ICc5JykpIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBBZmZTeW50YXhFcnJvciwgdmFyICk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgU0tJUF9ESUdJVFMobmV4dCk7CisgICAgICAgIGVuZCA9IF9fa21wX3N0cl90b19pbnQoc2NhbiwgKm5leHQpOworICAgICAgICBLTVBfQVNTRVJUKGVuZCA+PSAwKTsKKworICAgICAgICAvLworICAgICAgICAvLyBDaGVjayBmb3IgYSBzdHJpZGUgcGFyYW1ldGVyCisgICAgICAgIC8vCisgICAgICAgIHN0cmlkZSA9IDE7CisgICAgICAgIFNLSVBfV1MobmV4dCk7CisgICAgICAgIGlmICgqbmV4dCA9PSAnOicpIHsKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBBIHN0cmlkZSBpcyBzcGVjaWZpZWQuICBTa2lwIG92ZXIgdGhlICc6IiBhbmQgcmVhZCB0aGUgM3JkIGludC4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBpbnQgc2lnbiA9ICsxOworICAgICAgICAgICAgbmV4dCsrOyAgICAgICAgIC8vIHNraXAgJzonCisgICAgICAgICAgICBTS0lQX1dTKG5leHQpOworICAgICAgICAgICAgc2NhbiA9IG5leHQ7CisgICAgICAgICAgICBpZiAoKm5leHQgPT0gJy0nKSB7CisgICAgICAgICAgICAgICAgc2lnbiA9IC0xOworICAgICAgICAgICAgICAgIG5leHQrKzsKKyAgICAgICAgICAgICAgICBTS0lQX1dTKG5leHQpOworICAgICAgICAgICAgICAgIHNjYW4gPSBuZXh0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCgqbmV4dCA8ICcwJykgfHwgKCpuZXh0ID4gJzknKSkgeworICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBBZmZTeW50YXhFcnJvciwgdmFyICk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU0tJUF9ESUdJVFMobmV4dCk7CisgICAgICAgICAgICBzdHJpZGUgPSBfX2ttcF9zdHJfdG9faW50KHNjYW4sICpuZXh0KTsKKyAgICAgICAgICAgIEtNUF9BU1NFUlQoc3RyaWRlID49IDApOworICAgICAgICAgICAgc3RyaWRlICo9IHNpZ247CisgICAgICAgIH0KKworICAgICAgICAvLworICAgICAgICAvLyBEbyBzb21lIHJhbmdlIGNoZWNrcy4KKyAgICAgICAgLy8KKyAgICAgICAgaWYgKHN0cmlkZSA9PSAwKSB7CisgICAgICAgICAgICBLTVBfV0FSTklORyggQWZmWmVyb1N0cmlkZSwgdmFyICk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cmlkZSA+IDApIHsKKyAgICAgICAgICAgIGlmIChzdGFydCA+IGVuZCkgeworICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBBZmZTdGFydEdyZWF0ZXJFbmQsIHZhciwgc3RhcnQsIGVuZCApOworICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmIChzdGFydCA8IGVuZCkgeworICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBBZmZTdHJpZGVMZXNzWmVybywgdmFyLCBzdGFydCwgZW5kICk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICgoZW5kIC0gc3RhcnQpIC8gc3RyaWRlID4gNjU1MzYgKSB7CisgICAgICAgICAgICBLTVBfV0FSTklORyggQWZmUmFuZ2VUb29CaWcsIHZhciwgZW5kLCBzdGFydCwgc3RyaWRlICk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBlbXB0eSA9IEZBTFNFOworCisgICAgICAgIC8vCisgICAgICAgIC8vIFNraXAgb3B0aW9uYWwgY29tbWEuCisgICAgICAgIC8vCisgICAgICAgIFNLSVBfV1MobmV4dCk7CisgICAgICAgIGlmICgqbmV4dCA9PSAnLCcpIHsKKyAgICAgICAgICAgIG5leHQrKzsKKyAgICAgICAgfQorICAgICAgICBzY2FuID0gbmV4dDsKKyAgICB9CisKKyAgICAqbmV4dEVudiA9IG5leHQ7CisKKyAgICB7CisgICAgICAgIGludCBsZW4gPSBuZXh0IC0gZW52OworICAgICAgICBjaGFyICpyZXRsaXN0ID0gKGNoYXIgKilfX2ttcF9hbGxvY2F0ZSgobGVuICsgMSkgKiBzaXplb2YoY2hhcikpOworICAgICAgICBtZW1jcHkocmV0bGlzdCwgZW52LCBsZW4gKiBzaXplb2YoY2hhcikpOworICAgICAgICByZXRsaXN0W2xlbl0gPSAnXDAnOworICAgICAgICAqcHJvY2xpc3QgPSByZXRsaXN0OworICAgIH0KKyAgICByZXR1cm4gVFJVRTsKK30KKworCisvLworLy8gSWYgS01QX0FGRklOSVRZIGlzIHNwZWNpZmllZCB3aXRob3V0IGEgdHlwZSwgdGhlbgorLy8gX19rbXBfYWZmaW5pdHlfbm90eXBlIHNob3VsZCBwb2ludCB0byBpdHMgc2V0dGluZy4KKy8vCitzdGF0aWMga21wX3NldHRpbmdfdCAqX19rbXBfYWZmaW5pdHlfbm90eXBlID0gTlVMTDsKKworc3RhdGljIHZvaWQKK19fa21wX3BhcnNlX2FmZmluaXR5X2VudiggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwKKyAgICBlbnVtIGFmZmluaXR5X3R5cGUgICogb3V0X3R5cGUsCisgICAgY2hhciAgICAgICAgICAgICAgICAqKiBvdXRfcHJvY2xpc3QsCisgICAgaW50ICAgICAgICAgICAgICAgICAqIG91dF92ZXJib3NlLAorICAgIGludCAgICAgICAgICAgICAgICAgKiBvdXRfd2FybiwKKyAgICBpbnQgICAgICAgICAgICAgICAgICogb3V0X3Jlc3BlY3QsCisgICAgZW51bSBhZmZpbml0eV9ncmFuICAqIG91dF9ncmFuLAorICAgIGludCAgICAgICAgICAgICAgICAgKiBvdXRfZ3Jhbl9sZXZlbHMsCisgICAgaW50ICAgICAgICAgICAgICAgICAqIG91dF9kdXBzLAorICAgIGludCAgICAgICAgICAgICAgICAgKiBvdXRfY29tcGFjdCwKKyAgICBpbnQgICAgICAgICAgICAgICAgICogb3V0X29mZnNldAorKQoreworICAgIGNoYXIgKiBidWZmZXIgPSBOVUxMOyAgICAvLyBDb3B5IG9mIGVudiB2YXIgdmFsdWUuCisgICAgY2hhciAqIGJ1ZiAgICA9IE5VTEw7ICAgIC8vIEJ1ZmZlciBmb3Igc3RydG9rX3IoKSBmdW5jdGlvbi4KKyAgICBjaGFyICogbmV4dCA9IE5VTEw7ICAgICAgLy8gZW5kIG9mIHRva2VuIC8gc3RhcnQgb2YgbmV4dC4KKyAgICBjb25zdCBjaGFyICogc3RhcnQ7ICAgICAgLy8gc3RhcnQgb2YgY3VycmVudCB0b2tlbiAoZm9yIGVyciBtc2dzKQorICAgIGludCAgICBjb3VudCAgPSAwOyAgICAgICAvLyBDb3VudGVyIG9mIHBhcnNlZCBpbnRlZ2VyIG51bWJlcnMuCisgICAgaW50ICAgIG51bWJlclsgMiBdOyAgICAgIC8vIFBhcnNlZCBudW1iZXJzLgorCisgICAgLy8gR3VhcmRzLgorICAgIGludCB0eXBlICAgICAgICAgPSAwOworICAgIGludCBwcm9jbGlzdCAgICAgPSAwOworICAgIGludCBtYXhfcHJvY2xpc3QgPSAwOworICAgIGludCB2ZXJib3NlICAgICAgPSAwOworICAgIGludCB3YXJuaW5ncyAgICAgPSAwOworICAgIGludCByZXNwZWN0ICAgICAgPSAwOworICAgIGludCBncmFuICAgICAgICAgPSAwOworICAgIGludCBkdXBzICAgICAgICAgPSAwOworCisgICAgS01QX0FTU0VSVCggdmFsdWUgIT0gTlVMTCApOworCisgICAgaWYgKCBUQ1JfNChfX2ttcF9pbml0X21pZGRsZSkgKSB7CisgICAgICAgIEtNUF9XQVJOSU5HKCBFbnZNaWRkbGVXYXJuLCBuYW1lICk7CisgICAgICAgIF9fa21wX2Vudl90b1ByaW50KCBuYW1lLCAwICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgX19rbXBfZW52X3RvUHJpbnQoIG5hbWUsIDEgKTsKKworICAgIGJ1ZmZlciA9IF9fa21wX3N0cl9mb3JtYXQoICIlcyIsIHZhbHVlICk7ICAgICAgICAgLy8gQ29weSBlbnYgdmFyIHRvIGtlZXAgb3JpZ2luYWwgaW50YWN0LgorICAgIGJ1ZiA9IGJ1ZmZlcjsKKyAgICBTS0lQX1dTKGJ1Zik7CisKKyAgICAvLyBIZWxwZXIgbWFjcm9zLgorCisgICAgLy8KKyAgICAvLyBJZiB3ZSBzZWUgYSBwYXJzZSBlcnJvciwgZW1pdCBhIHdhcm5pbmcgYW5kIHNjYW4gdG8gdGhlIG5leHQgIiwiLgorICAgIC8vCisgICAgLy8gRklYTUUgLSB0aGVyZSdzIGdvdCB0byBiZSBhIGJldHRlciB3YXkgdG8gcHJpbnQgYW4gZXJyb3IKKyAgICAvLyBtZXNzYWdlLCBob3BlZnVsbHkgd2l0aG91dCBvdmVyd3JpdHRpbmcgcGVpY2VzIG9mIGJ1Zi4KKyAgICAvLworICAgICNkZWZpbmUgRU1JVF9XQVJOKHNraXAsZXJybGlzdCkgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgY2hhciBjaDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKHNraXApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIFNLSVBfVE8obmV4dCwgJywnKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgY2ggPSAqbmV4dDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKm5leHQgPSAnXDAnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgS01QX1dBUk5JTkcgZXJybGlzdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKm5leHQgPSBjaDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKHNraXApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnLCcpIG5leHQrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYnVmID0gbmV4dDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9CisKKyAgICAjZGVmaW5lIF9zZXRfcGFyYW0oX2d1YXJkLF92YXIsX3ZhbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmICggX2d1YXJkID09IDAgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBfdmFyID0gX3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBFTUlUX1dBUk4oIEZBTFNFLCAoIEFmZlBhcmFtRGVmaW5lZCwgbmFtZSwgc3RhcnQgKSApOyAgICAgICAgIFwKKyAgICAgICAgICAgIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICsrIF9ndWFyZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfQorCisgICAgI2RlZmluZSBzZXRfdHlwZSh2YWwpICAgICAgICAgIF9zZXRfcGFyYW0oIHR5cGUsICAgICAqb3V0X3R5cGUsICAgICAgICB2YWwgKQorICAgICNkZWZpbmUgc2V0X3ZlcmJvc2UodmFsKSAgICAgICBfc2V0X3BhcmFtKCB2ZXJib3NlLCAgKm91dF92ZXJib3NlLCAgICAgdmFsICkKKyAgICAjZGVmaW5lIHNldF93YXJuaW5ncyh2YWwpICAgICAgX3NldF9wYXJhbSggd2FybmluZ3MsICpvdXRfd2FybiwgICAgICAgIHZhbCApCisgICAgI2RlZmluZSBzZXRfcmVzcGVjdCh2YWwpICAgICAgIF9zZXRfcGFyYW0oIHJlc3BlY3QsICAqb3V0X3Jlc3BlY3QsICAgICB2YWwgKQorICAgICNkZWZpbmUgc2V0X2R1cHModmFsKSAgICAgICAgICBfc2V0X3BhcmFtKCBkdXBzLCAgICAgKm91dF9kdXBzLCAgICAgICAgdmFsICkKKyAgICAjZGVmaW5lIHNldF9wcm9jbGlzdCh2YWwpICAgICAgX3NldF9wYXJhbSggcHJvY2xpc3QsICpvdXRfcHJvY2xpc3QsICAgIHZhbCApCisKKyAgICAjZGVmaW5lIHNldF9ncmFuKHZhbCxsZXZlbHMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmICggZ3JhbiA9PSAwICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAqb3V0X2dyYW4gPSB2YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAqb3V0X2dyYW5fbGV2ZWxzID0gbGV2ZWxzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBFTUlUX1dBUk4oIEZBTFNFLCAoIEFmZlBhcmFtRGVmaW5lZCwgbmFtZSwgc3RhcnQgKSApOyAgICAgICAgIFwKKyAgICAgICAgICAgIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICsrIGdyYW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfQorCisjIGlmIE9NUF80MF9FTkFCTEVECisgICAgS01QX0RFQlVHX0FTU0VSVCggKCBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXMgIT0gTlVMTCApCisgICAgICAmJiAoIF9fa21wX25lc3RlZF9wcm9jX2JpbmQudXNlZCA+IDAgKSApOworIyBlbmRpZgorCisgICAgd2hpbGUgKCAqYnVmICE9ICdcMCcgKSB7CisgICAgICAgIHN0YXJ0ID0gbmV4dCA9IGJ1ZjsKKworICAgICAgICBpZiAoX19rbXBfbWF0Y2hfc3RyKCJub25lIiwgYnVmLCAoY29uc3QgY2hhciAqKikmbmV4dCkpIHsKKyAgICAgICAgICAgIHNldF90eXBlKCBhZmZpbml0eV9ub25lICk7CisjIGlmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPSBwcm9jX2JpbmRfZmFsc2U7CisjIGVuZGlmCisgICAgICAgICAgICBidWYgPSBuZXh0OworICAgICAgICB9IGVsc2UgaWYgKF9fa21wX21hdGNoX3N0cigic2NhdHRlciIsIGJ1ZiwgKGNvbnN0IGNoYXIgKiopJm5leHQpKSB7CisgICAgICAgICAgICBzZXRfdHlwZSggYWZmaW5pdHlfc2NhdHRlciApOworIyBpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdID0gcHJvY19iaW5kX2ludGVsOworIyBlbmRpZgorICAgICAgICAgICAgYnVmID0gbmV4dDsKKyAgICAgICAgfSBlbHNlIGlmIChfX2ttcF9tYXRjaF9zdHIoImNvbXBhY3QiLCBidWYsIChjb25zdCBjaGFyICoqKSZuZXh0KSkgeworICAgICAgICAgICAgc2V0X3R5cGUoIGFmZmluaXR5X2NvbXBhY3QgKTsKKyMgaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSA9IHByb2NfYmluZF9pbnRlbDsKKyMgZW5kaWYKKyAgICAgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICAgIH0gZWxzZSBpZiAoX19rbXBfbWF0Y2hfc3RyKCJsb2dpY2FsIiwgYnVmLCAoY29uc3QgY2hhciAqKikmbmV4dCkpIHsKKyAgICAgICAgICAgIHNldF90eXBlKCBhZmZpbml0eV9sb2dpY2FsICk7CisjIGlmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPSBwcm9jX2JpbmRfaW50ZWw7CisjIGVuZGlmCisgICAgICAgICAgICBidWYgPSBuZXh0OworICAgICAgICB9IGVsc2UgaWYgKF9fa21wX21hdGNoX3N0cigicGh5c2ljYWwiLCBidWYsIChjb25zdCBjaGFyICoqKSZuZXh0KSkgeworICAgICAgICAgICAgc2V0X3R5cGUoIGFmZmluaXR5X3BoeXNpY2FsICk7CisjIGlmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPSBwcm9jX2JpbmRfaW50ZWw7CisjIGVuZGlmCisgICAgICAgICAgICBidWYgPSBuZXh0OworICAgICAgICB9IGVsc2UgaWYgKF9fa21wX21hdGNoX3N0cigiZXhwbGljaXQiLCBidWYsIChjb25zdCBjaGFyICoqKSZuZXh0KSkgeworICAgICAgICAgICAgc2V0X3R5cGUoIGFmZmluaXR5X2V4cGxpY2l0ICk7CisjIGlmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPSBwcm9jX2JpbmRfaW50ZWw7CisjIGVuZGlmCisgICAgICAgICAgICBidWYgPSBuZXh0OworICAgICAgICB9IGVsc2UgaWYgKF9fa21wX21hdGNoX3N0cigiYmFsYW5jZWQiLCBidWYsIChjb25zdCBjaGFyICoqKSZuZXh0KSkgeworICAgICAgICAgICAgc2V0X3R5cGUoIGFmZmluaXR5X2JhbGFuY2VkICk7CisjICBpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdID0gcHJvY19iaW5kX2ludGVsOworIyAgZW5kaWYKKyAgICAgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICAgIH0gZWxzZSBpZiAoX19rbXBfbWF0Y2hfc3RyKCJkaXNhYmxlZCIsIGJ1ZiwgKGNvbnN0IGNoYXIgKiopJm5leHQpKSB7CisgICAgICAgICAgICBzZXRfdHlwZSggYWZmaW5pdHlfZGlzYWJsZWQgKTsKKyMgaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSA9IHByb2NfYmluZF9mYWxzZTsKKyMgZW5kaWYKKyAgICAgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICAgIH0gZWxzZSBpZiAoX19rbXBfbWF0Y2hfc3RyKCJ2ZXJib3NlIiwgYnVmLCAoY29uc3QgY2hhciAqKikmbmV4dCkpIHsKKyAgICAgICAgICAgIHNldF92ZXJib3NlKCBUUlVFICk7CisgICAgICAgICAgICBidWYgPSBuZXh0OworICAgICAgICB9IGVsc2UgaWYgKF9fa21wX21hdGNoX3N0cigibm92ZXJib3NlIiwgYnVmLCAoY29uc3QgY2hhciAqKikmbmV4dCkpIHsKKyAgICAgICAgICAgIHNldF92ZXJib3NlKCBGQUxTRSApOworICAgICAgICAgICAgYnVmID0gbmV4dDsKKyAgICAgICAgfSBlbHNlIGlmIChfX2ttcF9tYXRjaF9zdHIoIndhcm5pbmdzIiwgYnVmLCAoY29uc3QgY2hhciAqKikmbmV4dCkpIHsKKyAgICAgICAgICAgIHNldF93YXJuaW5ncyggVFJVRSApOworICAgICAgICAgICAgYnVmID0gbmV4dDsKKyAgICAgICAgfSBlbHNlIGlmIChfX2ttcF9tYXRjaF9zdHIoIm5vd2FybmluZ3MiLCBidWYsIChjb25zdCBjaGFyICoqKSZuZXh0KSkgeworICAgICAgICAgICAgc2V0X3dhcm5pbmdzKCBGQUxTRSApOworICAgICAgICAgICAgYnVmID0gbmV4dDsKKyAgICAgICAgfSBlbHNlIGlmIChfX2ttcF9tYXRjaF9zdHIoInJlc3BlY3QiLCBidWYsIChjb25zdCBjaGFyICoqKSZuZXh0KSkgeworICAgICAgICAgICAgc2V0X3Jlc3BlY3QoIFRSVUUgKTsKKyAgICAgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICAgIH0gZWxzZSBpZiAoX19rbXBfbWF0Y2hfc3RyKCJub3Jlc3BlY3QiLCBidWYsIChjb25zdCBjaGFyICoqKSZuZXh0KSkgeworICAgICAgICAgICAgc2V0X3Jlc3BlY3QoIEZBTFNFICk7CisgICAgICAgICAgICBidWYgPSBuZXh0OworICAgICAgICB9IGVsc2UgaWYgKF9fa21wX21hdGNoX3N0cigiZHVwbGljYXRlcyIsIGJ1ZiwgKGNvbnN0IGNoYXIgKiopJm5leHQpCisgICAgICAgICAgfHwgX19rbXBfbWF0Y2hfc3RyKCJkdXBzIiwgYnVmLCAoY29uc3QgY2hhciAqKikmbmV4dCkpIHsKKyAgICAgICAgICAgIHNldF9kdXBzKCBUUlVFICk7CisgICAgICAgICAgICBidWYgPSBuZXh0OworICAgICAgICB9IGVsc2UgaWYgKF9fa21wX21hdGNoX3N0cigibm9kdXBsaWNhdGVzIiwgYnVmLCAoY29uc3QgY2hhciAqKikmbmV4dCkKKyAgICAgICAgICB8fCBfX2ttcF9tYXRjaF9zdHIoIm5vZHVwcyIsIGJ1ZiwgKGNvbnN0IGNoYXIgKiopJm5leHQpKSB7CisgICAgICAgICAgICBzZXRfZHVwcyggRkFMU0UgKTsKKyAgICAgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICAgIH0gZWxzZSBpZiAoX19rbXBfbWF0Y2hfc3RyKCJncmFudWxhcml0eSIsIGJ1ZiwgKGNvbnN0IGNoYXIgKiopJm5leHQpCisgICAgICAgICAgfHwgX19rbXBfbWF0Y2hfc3RyKCJncmFuIiwgYnVmLCAoY29uc3QgY2hhciAqKikmbmV4dCkpIHsKKyAgICAgICAgICAgIFNLSVBfV1MobmV4dCk7CisgICAgICAgICAgICBpZiAoKm5leHQgIT0gJz0nKSB7CisgICAgICAgICAgICAgICAgRU1JVF9XQVJOKCBUUlVFLCAoIEFmZkludmFsaWRQYXJhbSwgbmFtZSwgc3RhcnQgKSApOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbmV4dCsrOyAgICAgIC8vIHNraXAgJz0nCisgICAgICAgICAgICBTS0lQX1dTKG5leHQpOworCisgICAgICAgICAgICBidWYgPSBuZXh0OworICAgICAgICAgICAgaWYgKF9fa21wX21hdGNoX3N0cigiZmluZSIsIGJ1ZiwgKGNvbnN0IGNoYXIgKiopJm5leHQpKSB7CisgICAgICAgICAgICAgICAgc2V0X2dyYW4oIGFmZmluaXR5X2dyYW5fZmluZSwgLTEgKTsKKyAgICAgICAgICAgICAgICBidWYgPSBuZXh0OworICAgICAgICAgICAgfSBlbHNlIGlmIChfX2ttcF9tYXRjaF9zdHIoInRocmVhZCIsIGJ1ZiwgKGNvbnN0IGNoYXIgKiopJm5leHQpKSB7CisgICAgICAgICAgICAgICAgc2V0X2dyYW4oIGFmZmluaXR5X2dyYW5fdGhyZWFkLCAtMSApOworICAgICAgICAgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICAgICAgICB9IGVsc2UgaWYgKF9fa21wX21hdGNoX3N0cigiY29yZSIsIGJ1ZiwgKGNvbnN0IGNoYXIgKiopJm5leHQpKSB7CisgICAgICAgICAgICAgICAgc2V0X2dyYW4oIGFmZmluaXR5X2dyYW5fY29yZSwgLTEgKTsKKyAgICAgICAgICAgICAgICBidWYgPSBuZXh0OworICAgICAgICAgICAgfSBlbHNlIGlmIChfX2ttcF9tYXRjaF9zdHIoInBhY2thZ2UiLCBidWYsIChjb25zdCBjaGFyICoqKSZuZXh0KSkgeworICAgICAgICAgICAgICAgIHNldF9ncmFuKCBhZmZpbml0eV9ncmFuX3BhY2thZ2UsIC0xICk7CisgICAgICAgICAgICAgICAgYnVmID0gbmV4dDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoX19rbXBfbWF0Y2hfc3RyKCJub2RlIiwgYnVmLCAoY29uc3QgY2hhciAqKikmbmV4dCkpIHsKKyAgICAgICAgICAgICAgICBzZXRfZ3JhbiggYWZmaW5pdHlfZ3Jhbl9ub2RlLCAtMSApOworICAgICAgICAgICAgICAgIGJ1ZiA9IG5leHQ7CisjIGlmIEtNUF9PU19XSU5ET1dTICYmIEtNUF9BUkNIX1g4Nl82NAorICAgICAgICAgICAgfSBlbHNlIGlmIChfX2ttcF9tYXRjaF9zdHIoImdyb3VwIiwgYnVmLCAoY29uc3QgY2hhciAqKikmbmV4dCkpIHsKKyAgICAgICAgICAgICAgICBzZXRfZ3JhbiggYWZmaW5pdHlfZ3Jhbl9ncm91cCwgLTEgKTsKKyAgICAgICAgICAgICAgICBidWYgPSBuZXh0OworIyBlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAmJiBLTVBfQVJDSF9YODZfNjQgKi8KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKCpidWYgPj0gJzAnKSAmJiAoKmJ1ZiA8PSAnOScpKSB7CisgICAgICAgICAgICAgICAgaW50IG47CisgICAgICAgICAgICAgICAgbmV4dCA9IGJ1ZjsKKyAgICAgICAgICAgICAgICBTS0lQX0RJR0lUUyhuZXh0KTsKKyAgICAgICAgICAgICAgICBuID0gX19rbXBfc3RyX3RvX2ludCggYnVmLCAqbmV4dCApOworICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQobiA+PSAwKTsKKyAgICAgICAgICAgICAgICBidWYgPSBuZXh0OworICAgICAgICAgICAgICAgIHNldF9ncmFuKCBhZmZpbml0eV9ncmFuX2RlZmF1bHQsIG4gKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgRU1JVF9XQVJOKCBUUlVFLCAoIEFmZkludmFsaWRQYXJhbSwgbmFtZSwgc3RhcnQgKSApOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKF9fa21wX21hdGNoX3N0cigicHJvY2xpc3QiLCBidWYsIChjb25zdCBjaGFyICoqKSZuZXh0KSkgeworICAgICAgICAgICAgY2hhciAqdGVtcF9wcm9jbGlzdDsKKworICAgICAgICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICAgICAgICAgIGlmICgqbmV4dCAhPSAnPScpIHsKKyAgICAgICAgICAgICAgICBFTUlUX1dBUk4oIFRSVUUsICggQWZmSW52YWxpZFBhcmFtLCBuYW1lLCBzdGFydCApICk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuZXh0Kys7ICAgICAgLy8gc2tpcCAnPScKKyAgICAgICAgICAgIFNLSVBfV1MobmV4dCk7CisgICAgICAgICAgICBpZiAoKm5leHQgIT0gJ1snKSB7CisgICAgICAgICAgICAgICAgRU1JVF9XQVJOKCBUUlVFLCAoIEFmZkludmFsaWRQYXJhbSwgbmFtZSwgc3RhcnQgKSApOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbmV4dCsrOyAgICAgIC8vIHNraXAgJ1snCisgICAgICAgICAgICBidWYgPSBuZXh0OworICAgICAgICAgICAgaWYgKCEgX19rbXBfcGFyc2VfYWZmaW5pdHlfcHJvY19pZF9saXN0KG5hbWUsIGJ1ZiwKKyAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKiopJm5leHQsICZ0ZW1wX3Byb2NsaXN0KSkgeworICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gd2FybmluZyBhbHJlYWR5IGVtaXR0ZWQuCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICBTS0lQX1RPKG5leHQsICddJyk7CisgICAgICAgICAgICAgICAgaWYgKCpuZXh0ID09ICddJykgbmV4dCsrOworICAgICAgICAgICAgICAgIFNLSVBfVE8obmV4dCwgJywnKTsKKyAgICAgICAgICAgICAgICBpZiAoKm5leHQgPT0gJywnKSBuZXh0Kys7CisgICAgICAgICAgICAgICAgYnVmID0gbmV4dDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgqbmV4dCAhPSAnXScpIHsKKyAgICAgICAgICAgICAgICBFTUlUX1dBUk4oIFRSVUUsICggQWZmSW52YWxpZFBhcmFtLCBuYW1lLCBzdGFydCApICk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuZXh0Kys7ICAgICAgLy8gc2tpcCAnXScKKyAgICAgICAgICAgIHNldF9wcm9jbGlzdCggdGVtcF9wcm9jbGlzdCApOworICAgICAgICB9IGVsc2UgaWYgKCgqYnVmID49ICcwJykgJiYgKCpidWYgPD0gJzknKSkgeworICAgICAgICAgICAgLy8gUGFyc2UgaW50ZWdlciBudW1iZXJzIC0tIHBlcm11dGUgYW5kIG9mZnNldC4KKyAgICAgICAgICAgIGludCBuOworICAgICAgICAgICAgbmV4dCA9IGJ1ZjsKKyAgICAgICAgICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgICAgICAgICAgbiA9IF9fa21wX3N0cl90b19pbnQoIGJ1ZiwgKm5leHQgKTsKKyAgICAgICAgICAgIEtNUF9BU1NFUlQobiA+PSAwKTsKKyAgICAgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICAgICAgICBpZiAoIGNvdW50IDwgMiApIHsKKyAgICAgICAgICAgICAgICBudW1iZXJbIGNvdW50IF0gPSBuOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggQWZmTWFueVBhcmFtcywgbmFtZSwgc3RhcnQgKTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICArKyBjb3VudDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEVNSVRfV0FSTiggVFJVRSwgKCBBZmZJbnZhbGlkUGFyYW0sIG5hbWUsIHN0YXJ0ICkgKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICAgICAgaWYgKCpuZXh0ID09ICcsJykgeworICAgICAgICAgICAgbmV4dCsrOworICAgICAgICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgqbmV4dCAhPSAnXDAnKSB7CisgICAgICAgICAgICBjb25zdCBjaGFyICp0ZW1wID0gbmV4dDsKKyAgICAgICAgICAgIEVNSVRfV0FSTiggVFJVRSwgKCBQYXJzZUV4dHJhQ2hhcnNXYXJuLCBuYW1lLCB0ZW1wICkgKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgfSAvLyB3aGlsZQorCisgICAgI3VuZGVmIEVNSVRfV0FSTgorICAgICN1bmRlZiBfc2V0X3BhcmFtCisgICAgI3VuZGVmIHNldF90eXBlCisgICAgI3VuZGVmIHNldF92ZXJib3NlCisgICAgI3VuZGVmIHNldF93YXJuaW5ncworICAgICN1bmRlZiBzZXRfcmVzcGVjdAorICAgICN1bmRlZiBzZXRfZ3JhbnVsYXJpdHkKKworICAgIEtNUF9JTlRFUk5BTF9GUkVFKCBidWZmZXIgKTsKKworICAgIGlmICggcHJvY2xpc3QgKSB7CisgICAgICAgIGlmICggISB0eXBlICkgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoIEFmZlByb2NMaXN0Tm9UeXBlLCBuYW1lICk7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV90eXBlID0gYWZmaW5pdHlfZXhwbGljaXQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfZXhwbGljaXQgKSB7CisgICAgICAgICAgICBLTVBfV0FSTklORyggQWZmUHJvY0xpc3ROb3RFeHBsaWNpdCwgbmFtZSApOworICAgICAgICAgICAgS01QX0FTU0VSVCggKm91dF9wcm9jbGlzdCAhPSBOVUxMICk7CisgICAgICAgICAgICBLTVBfSU5URVJOQUxfRlJFRSggKm91dF9wcm9jbGlzdCApOworICAgICAgICAgICAgKm91dF9wcm9jbGlzdCA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgc3dpdGNoICggKm91dF90eXBlICkgeworICAgICAgICBjYXNlIGFmZmluaXR5X2xvZ2ljYWw6CisgICAgICAgIGNhc2UgYWZmaW5pdHlfcGh5c2ljYWw6IHsKKyAgICAgICAgICAgIGlmICggY291bnQgPiAwICkgeworICAgICAgICAgICAgICAgICpvdXRfb2Zmc2V0ID0gbnVtYmVyWyAwIF07CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgaWYgKCBjb3VudCA+IDEgKSB7CisgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoIEFmZk1hbnlQYXJhbXNGb3JMb2dpYywgbmFtZSwgbnVtYmVyWyAxIF0gKTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgYWZmaW5pdHlfYmFsYW5jZWQ6IHsKKyAgICAgICAgICAgIGlmICggY291bnQgPiAwICkgeworICAgICAgICAgICAgICAgICpvdXRfY29tcGFjdCA9IG51bWJlclsgMCBdOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgIGlmICggY291bnQgPiAxICkgeworICAgICAgICAgICAgICAgICpvdXRfb2Zmc2V0ID0gbnVtYmVyWyAxIF07CisgICAgICAgICAgICB9OyAvLyBpZgorCisgICAgICAgICAgICBpZiAoIF9fa21wX2FmZmluaXR5X2dyYW4gPT0gYWZmaW5pdHlfZ3Jhbl9kZWZhdWx0ICkgeworIyBpZiBLTVBfTUlDCisgICAgICAgICAgICAgICAgaWYoIF9fa21wX2FmZmluaXR5X3ZlcmJvc2UgfHwgX19rbXBfYWZmaW5pdHlfd2FybmluZ3MgKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBBZmZHcmFuVXNpbmcsICJLTVBfQUZGSU5JVFkiLCAiZmluZSIgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3JhbiA9IGFmZmluaXR5X2dyYW5fZmluZTsKKyMgZWxzZQorICAgICAgICAgICAgICAgIGlmKCBfX2ttcF9hZmZpbml0eV92ZXJib3NlIHx8IF9fa21wX2FmZmluaXR5X3dhcm5pbmdzICkgeworICAgICAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggQWZmR3JhblVzaW5nLCAiS01QX0FGRklOSVRZIiwgImNvcmUiICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW4gPSBhZmZpbml0eV9ncmFuX2NvcmU7CisjIGVuZGlmIC8qIEtNUF9NSUMgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBhZmZpbml0eV9zY2F0dGVyOgorICAgICAgICBjYXNlIGFmZmluaXR5X2NvbXBhY3Q6IHsKKyAgICAgICAgICAgIGlmICggY291bnQgPiAwICkgeworICAgICAgICAgICAgICAgICpvdXRfY29tcGFjdCA9IG51bWJlclsgMCBdOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgIGlmICggY291bnQgPiAxICkgeworICAgICAgICAgICAgICAgICpvdXRfb2Zmc2V0ID0gbnVtYmVyWyAxIF07CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIGFmZmluaXR5X2V4cGxpY2l0OiB7CisgICAgICAgICAgICBpZiAoICpvdXRfcHJvY2xpc3QgPT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggQWZmTm9Qcm9jTGlzdCwgbmFtZSApOworICAgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9ub25lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBjb3VudCA+IDAgKSB7CisgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoIEFmZk5vUGFyYW0sIG5hbWUsICJleHBsaWNpdCIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBhZmZpbml0eV9ub25lOiB7CisgICAgICAgICAgICBpZiAoIGNvdW50ID4gMCApIHsKKyAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggQWZmTm9QYXJhbSwgbmFtZSwgIm5vbmUiICk7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIGFmZmluaXR5X2Rpc2FibGVkOiB7CisgICAgICAgICAgICBpZiAoIGNvdW50ID4gMCApIHsKKyAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggQWZmTm9QYXJhbSwgbmFtZSwgImRpc2FibGVkIiApOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBhZmZpbml0eV9kZWZhdWx0OiB7CisgICAgICAgICAgICBpZiAoIGNvdW50ID4gMCApIHsKKyAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggQWZmTm9QYXJhbSwgbmFtZSwgImRlZmF1bHQiICk7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICB9IGJyZWFrOworICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgICBLTVBfQVNTRVJUKCAwICk7CisgICAgICAgIH07CisgICAgfTsgLy8gc3dpdGNoCit9IC8vIF9fa21wX3BhcnNlX2FmZmluaXR5X2VudgorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2FmZmluaXR5KCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApCit7CisgICAga21wX3NldHRpbmdfdCAqKnJpdmFscyA9IChrbXBfc2V0dGluZ190ICoqKSBkYXRhOworICAgIGludCByYzsKKworICAgIHJjID0gX19rbXBfc3RnX2NoZWNrX3JpdmFscyggbmFtZSwgdmFsdWUsIHJpdmFscyApOworICAgIGlmICggcmMgKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBfX2ttcF9wYXJzZV9hZmZpbml0eV9lbnYoIG5hbWUsIHZhbHVlLCAmIF9fa21wX2FmZmluaXR5X3R5cGUsCisgICAgICAmIF9fa21wX2FmZmluaXR5X3Byb2NsaXN0LCAmIF9fa21wX2FmZmluaXR5X3ZlcmJvc2UsCisgICAgICAmIF9fa21wX2FmZmluaXR5X3dhcm5pbmdzLCAmIF9fa21wX2FmZmluaXR5X3Jlc3BlY3RfbWFzaywKKyAgICAgICYgX19rbXBfYWZmaW5pdHlfZ3JhbiwgJiBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscywKKyAgICAgICYgX19rbXBfYWZmaW5pdHlfZHVwcywgJiBfX2ttcF9hZmZpbml0eV9jb21wYWN0LAorICAgICAgJiBfX2ttcF9hZmZpbml0eV9vZmZzZXQgKTsKKworfSAvLyBfX2ttcF9zdGdfcGFyc2VfYWZmaW5pdHkKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9hZmZpbml0eSgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIGlmKCBfX2ttcF9lbnZfZm9ybWF0ICkgeworICAgICAgICBLTVBfU1RSX0JVRl9QUklOVF9OQU1FX0VYKG5hbWUpOworICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiAgICVzPSciLCBuYW1lICk7CisgICAgfQorICAgIGlmICggX19rbXBfYWZmaW5pdHlfdmVyYm9zZSApIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMsIiwgInZlcmJvc2UiKTsKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcywiLCAibm92ZXJib3NlIik7CisgICAgfQorICAgIGlmICggX19rbXBfYWZmaW5pdHlfd2FybmluZ3MgKSB7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzLCIsICJ3YXJuaW5ncyIpOworICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzLCIsICJub3dhcm5pbmdzIik7CisgICAgfQorICAgIGlmICggS01QX0FGRklOSVRZX0NBUEFCTEUoKSApIHsKKyAgICAgICAgaWYgKCBfX2ttcF9hZmZpbml0eV9yZXNwZWN0X21hc2sgKSB7CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcywiLCAicmVzcGVjdCIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMsIiwgIm5vcmVzcGVjdCIpOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoIF9fa21wX2FmZmluaXR5X2dyYW4gKSB7CisgICAgICAgICAgICBjYXNlIGFmZmluaXR5X2dyYW5fZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcyIsICJncmFudWxhcml0eT1kZWZhdWx0LCIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBhZmZpbml0eV9ncmFuX2ZpbmU6CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMiLCAiZ3JhbnVsYXJpdHk9ZmluZSwiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgYWZmaW5pdHlfZ3Jhbl90aHJlYWQ6CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMiLCAiZ3JhbnVsYXJpdHk9dGhyZWFkLCIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBhZmZpbml0eV9ncmFuX2NvcmU6CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMiLCAiZ3JhbnVsYXJpdHk9Y29yZSwiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgYWZmaW5pdHlfZ3Jhbl9wYWNrYWdlOgorICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzIiwgImdyYW51bGFyaXR5PXBhY2thZ2UsIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGFmZmluaXR5X2dyYW5fbm9kZToKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcyIsICJncmFudWxhcml0eT1ub2RlLCIpOworICAgICAgICAgICAgICAgIGJyZWFrOworIyBpZiBLTVBfT1NfV0lORE9XUyAmJiBLTVBfQVJDSF9YODZfNjQKKyAgICAgICAgICAgIGNhc2UgYWZmaW5pdHlfZ3Jhbl9ncm91cDoKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcyIsICJncmFudWxhcml0eT1ncm91cCwiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyMgZW5kaWYgLyogS01QX09TX1dJTkRPV1MgJiYgS01QX0FSQ0hfWDg2XzY0ICovCisgICAgICAgIH0KKyAgICAgICAgaWYgKCBfX2ttcF9hZmZpbml0eV9kdXBzICkgeworICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMsIiwgImR1cGxpY2F0ZXMiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzLCIsICJub2R1cGxpY2F0ZXMiKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoICEgS01QX0FGRklOSVRZX0NBUEFCTEUoKSApIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMiLCAiZGlzYWJsZWQiICk7CisgICAgfQorICAgIGVsc2Ugc3dpdGNoICggX19rbXBfYWZmaW5pdHlfdHlwZSApeworICAgICAgICBjYXNlIGFmZmluaXR5X25vbmU6CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcyIsICJub25lIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBhZmZpbml0eV9waHlzaWNhbDoKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzLCVkIiwgInBoeXNpY2FsIiwKKyAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfb2Zmc2V0ICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBhZmZpbml0eV9sb2dpY2FsOgorICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMsJWQiLCAibG9naWNhbCIsCisgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X29mZnNldCApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgYWZmaW5pdHlfY29tcGFjdDoKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzLCVkLCVkIiwgImNvbXBhY3QiLAorICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9jb21wYWN0LCBfX2ttcF9hZmZpbml0eV9vZmZzZXQgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGFmZmluaXR5X3NjYXR0ZXI6CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcywlZCwlZCIsICJzY2F0dGVyIiwKKyAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfY29tcGFjdCwgX19rbXBfYWZmaW5pdHlfb2Zmc2V0ICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBhZmZpbml0eV9leHBsaWNpdDoKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzPVslc10sJXMiLCAicHJvY2xpc3QiLAorICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9wcm9jbGlzdCwgImV4cGxpY2l0IiApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgYWZmaW5pdHlfYmFsYW5jZWQ6CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcywlZCwlZCIsICJiYWxhbmNlZCIsCisgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2NvbXBhY3QsIF9fa21wX2FmZmluaXR5X29mZnNldCApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgYWZmaW5pdHlfZGlzYWJsZWQ6CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcyIsICJkaXNhYmxlZCIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgYWZmaW5pdHlfZGVmYXVsdDoKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzIiwgImRlZmF1bHQiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMiLCAiPHVua25vd24+Iik7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIidcbiIgKTsKK30gLy9fX2ttcF9zdGdfcHJpbnRfYWZmaW5pdHkKKworIyBpZmRlZiBLTVBfR09NUF9DT01QQVQKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9nb21wX2NwdV9hZmZpbml0eSggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKQoreworICAgIGNvbnN0IGNoYXIgKiBuZXh0ID0gTlVMTDsKKyAgICBjaGFyICogdGVtcF9wcm9jbGlzdDsKKyAgICBrbXBfc2V0dGluZ190ICoqcml2YWxzID0gKGttcF9zZXR0aW5nX3QgKiopIGRhdGE7CisgICAgaW50IHJjOworCisgICAgcmMgPSBfX2ttcF9zdGdfY2hlY2tfcml2YWxzKCBuYW1lLCB2YWx1ZSwgcml2YWxzICk7CisgICAgaWYgKCByYyApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICggVENSXzQoX19rbXBfaW5pdF9taWRkbGUpICkgeworICAgICAgICBLTVBfV0FSTklORyggRW52TWlkZGxlV2FybiwgbmFtZSApOworICAgICAgICBfX2ttcF9lbnZfdG9QcmludCggbmFtZSwgMCApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgX19rbXBfZW52X3RvUHJpbnQoIG5hbWUsIDEgKTsKKworICAgIGlmICggX19rbXBfcGFyc2VfYWZmaW5pdHlfcHJvY19pZF9saXN0KCBuYW1lLCB2YWx1ZSwgJm5leHQsCisgICAgICAmdGVtcF9wcm9jbGlzdCApKSB7CisgICAgICAgIFNLSVBfV1MobmV4dCk7CisgICAgICAgIGlmICgqbmV4dCA9PSAnXDAnKSB7CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gR09NUF9DUFVfQUZGSU5JVFkgPT4gZ3JhbnVsYXJpdHk9ZmluZSxleHBsaWNpdCxwcm9jbGlzdD0uLi4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9wcm9jbGlzdCA9IHRlbXBfcHJvY2xpc3Q7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV90eXBlID0gYWZmaW5pdHlfZXhwbGljaXQ7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuID0gYWZmaW5pdHlfZ3Jhbl9maW5lOworIyBpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdID0gcHJvY19iaW5kX2ludGVsOworIyBlbmRpZgorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoIEFmZlN5bnRheEVycm9yLCBuYW1lICk7CisgICAgICAgICAgICBpZiAodGVtcF9wcm9jbGlzdCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgS01QX0lOVEVSTkFMX0ZSRUUoKHZvaWQgKil0ZW1wX3Byb2NsaXN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gV2FybmluZyBhbHJlYWR5IGVtaXR0ZWQKKyAgICAgICAgLy8KKyAgICAgICAgX19rbXBfYWZmaW5pdHlfdHlwZSA9IGFmZmluaXR5X25vbmU7CisgICAgfQorfSAvLyBfX2ttcF9zdGdfcGFyc2VfZ29tcF9jcHVfYWZmaW5pdHkKKworIyBlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKworCisjIGlmIE9NUF80MF9FTkFCTEVECisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIE9NUF9QTEFDRVMgcHJvYyBpZCBsaXN0IHBhcnNlci4gSGVyZSBpcyB0aGUgZ3JhbW1hcjoKKworcGxhY2VfbGlzdCA6PSBwbGFjZQorcGxhY2VfbGlzdCA6PSBwbGFjZSAsIHBsYWNlX2xpc3QKK3BsYWNlIDo9IG51bQorcGxhY2UgOj0gcGxhY2UgOiBudW0KK3BsYWNlIDo9IHBsYWNlIDogbnVtIDogc2lnbmVkCitwbGFjZSA6PSB7IHN1YnBsYWNlbGlzdCB9CitwbGFjZSA6PSAhIHBsYWNlICAgICAgICAgICAgICAgICAgLy8gKGxvd2VzdCBwcmlvcml0eSkKK3N1YnBsYWNlX2xpc3QgOj0gc3VicGxhY2UKK3N1YnBsYWNlX2xpc3QgOj0gc3VicGxhY2UgLCBzdWJwbGFjZV9saXN0CitzdWJwbGFjZSA6PSBudW0KK3N1YnBsYWNlIDo9IG51bSA6IG51bQorc3VicGxhY2UgOj0gbnVtIDogbnVtIDogc2lnbmVkCitzaWduZWQgOj0gbnVtCitzaWduZWQgOj0gKyBzaWduZWQKK3NpZ25lZCA6PSAtIHNpZ25lZAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbnQKK19fa21wX3BhcnNlX3N1YnBsYWNlX2xpc3QoIGNvbnN0IGNoYXIgKnZhciwgY29uc3QgY2hhciAqKnNjYW4gKQoreworICAgIGNvbnN0IGNoYXIgKm5leHQ7CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGludCBzdGFydCwgY291bnQsIHN0cmlkZTsKKworICAgICAgICAvLworICAgICAgICAvLyBSZWFkIGluIHRoZSBzdGFydGluZyBwcm9jIGlkCisgICAgICAgIC8vCisgICAgICAgIFNLSVBfV1MoKnNjYW4pOworICAgICAgICBpZiAoKCoqc2NhbiA8ICcwJykgfHwgKCoqc2NhbiA+ICc5JykpIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBTeW50YXhFcnJvclVzaW5nLCB2YXIsICJcInRocmVhZHNcIiIgKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICBuZXh0ID0gKnNjYW47CisgICAgICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgICAgICBzdGFydCA9IF9fa21wX3N0cl90b19pbnQoKnNjYW4sICpuZXh0KTsKKyAgICAgICAgS01QX0FTU0VSVChzdGFydCA+PSAwKTsKKyAgICAgICAgKnNjYW4gPSBuZXh0OworCisgICAgICAgIC8vCisgICAgICAgIC8vIHZhbGlkIGZvbGxvdyBzZXRzIGFyZSAnLCcgJzonIGFuZCAnfScKKyAgICAgICAgLy8KKyAgICAgICAgU0tJUF9XUygqc2Nhbik7CisgICAgICAgIGlmICgqKnNjYW4gPT0gJ30nKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoKipzY2FuID09ICcsJykgeworICAgICAgICAgICAgKCpzY2FuKSsrOyAgLy8gc2tpcCAnLCcKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmICgqKnNjYW4gIT0gJzonKSB7CisgICAgICAgICAgICBLTVBfV0FSTklORyggU3ludGF4RXJyb3JVc2luZywgdmFyLCAiXCJ0aHJlYWRzXCIiICk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgKCpzY2FuKSsrOyAgICAgIC8vIHNraXAgJzonCisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gUmVhZCBjb3VudCBwYXJhbWV0ZXIKKyAgICAgICAgLy8KKyAgICAgICAgU0tJUF9XUygqc2Nhbik7CisgICAgICAgIGlmICgoKipzY2FuIDwgJzAnKSB8fCAoKipzY2FuID4gJzknKSkgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoIFN5bnRheEVycm9yVXNpbmcsIHZhciwgIlwidGhyZWFkc1wiIiApOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAgIG5leHQgPSAqc2NhbjsKKyAgICAgICAgU0tJUF9ESUdJVFMobmV4dCk7CisgICAgICAgIGNvdW50ID0gX19rbXBfc3RyX3RvX2ludCgqc2NhbiwgKm5leHQpOworICAgICAgICBLTVBfQVNTRVJUKGNvdW50ID49IDApOworICAgICAgICAqc2NhbiA9IG5leHQ7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gdmFsaWQgZm9sbG93IHNldHMgYXJlICcsJyAnOicgYW5kICd9JworICAgICAgICAvLworICAgICAgICBTS0lQX1dTKCpzY2FuKTsKKyAgICAgICAgaWYgKCoqc2NhbiA9PSAnfScpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmICgqKnNjYW4gPT0gJywnKSB7CisgICAgICAgICAgICAoKnNjYW4pKys7ICAvLyBza2lwICcsJworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCoqc2NhbiAhPSAnOicpIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBTeW50YXhFcnJvclVzaW5nLCB2YXIsICJcInRocmVhZHNcIiIgKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICAoKnNjYW4pKys7ICAgICAgLy8gc2tpcCAnOicKKworICAgICAgICAvLworICAgICAgICAvLyBSZWFkIHN0cmlkZSBwYXJhbWV0ZXIKKyAgICAgICAgLy8KKyAgICAgICAgaW50IHNpZ24gPSArMTsKKyAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgU0tJUF9XUygqc2Nhbik7CisgICAgICAgICAgICBpZiAoKipzY2FuID09ICcrJykgeworICAgICAgICAgICAgICAgICgqc2NhbikrKzsgLy8gc2tpcCAnKycKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgqKnNjYW4gPT0gJy0nKSB7CisgICAgICAgICAgICAgICAgc2lnbiAqPSAtMTsKKyAgICAgICAgICAgICAgICAoKnNjYW4pKys7IC8vIHNraXAgJy0nCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBTS0lQX1dTKCpzY2FuKTsKKyAgICAgICAgaWYgKCgqKnNjYW4gPCAnMCcpIHx8ICgqKnNjYW4gPiAnOScpKSB7CisgICAgICAgICAgICBLTVBfV0FSTklORyggU3ludGF4RXJyb3JVc2luZywgdmFyLCAiXCJ0aHJlYWRzXCIiICk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgbmV4dCA9ICpzY2FuOworICAgICAgICBTS0lQX0RJR0lUUyhuZXh0KTsKKyAgICAgICAgc3RyaWRlID0gX19rbXBfc3RyX3RvX2ludCgqc2NhbiwgKm5leHQpOworICAgICAgICBLTVBfQVNTRVJUKHN0cmlkZSA+PSAwKTsKKyAgICAgICAgKnNjYW4gPSBuZXh0OworICAgICAgICBzdHJpZGUgKj0gc2lnbjsKKworICAgICAgICAvLworICAgICAgICAvLyB2YWxpZCBmb2xsb3cgc2V0cyBhcmUgJywnIGFuZCAnfScKKyAgICAgICAgLy8KKyAgICAgICAgU0tJUF9XUygqc2Nhbik7CisgICAgICAgIGlmICgqKnNjYW4gPT0gJ30nKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoKipzY2FuID09ICcsJykgeworICAgICAgICAgICAgKCpzY2FuKSsrOyAgLy8gc2tpcCAnLCcKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgS01QX1dBUk5JTkcoIFN5bnRheEVycm9yVXNpbmcsIHZhciwgIlwidGhyZWFkc1wiIiApOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW50CitfX2ttcF9wYXJzZV9wbGFjZSggY29uc3QgY2hhciAqdmFyLCBjb25zdCBjaGFyICoqIHNjYW4gKQoreworICAgIGNvbnN0IGNoYXIgKm5leHQ7CisKKyAgICAvLworICAgIC8vIHZhbGlkIGZvbGxvdyBzZXRzIGFyZSAneycgJyEnIGFuZCBudW0KKyAgICAvLworICAgIFNLSVBfV1MoKnNjYW4pOworICAgIGlmICgqKnNjYW4gPT0gJ3snKSB7CisgICAgICAgICgqc2NhbikrKzsgICAgICAvLyBza2lwICd7JworICAgICAgICBpZiAoISBfX2ttcF9wYXJzZV9zdWJwbGFjZV9saXN0KHZhciwgc2NhbikpIHsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKipzY2FuICE9ICd9JykgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoIFN5bnRheEVycm9yVXNpbmcsIHZhciwgIlwidGhyZWFkc1wiIiApOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAgICgqc2NhbikrKzsgICAgICAvLyBza2lwICd9JworICAgIH0KKyAgICBlbHNlIGlmICgqKnNjYW4gPT0gJyEnKSB7CisgICAgICAgICgqc2NhbikrKzsgICAgICAvLyBza2lwICchJworICAgICAgICByZXR1cm4gX19rbXBfcGFyc2VfcGxhY2UodmFyLCBzY2FuKTsgLy8nIScgaGFzIGxvd2VyIHByZWNlZGVuY2UgdGhhbiAnOicKKyAgICB9CisgICAgZWxzZSBpZiAoKCoqc2NhbiA+PSAnMCcpICYmICgqKnNjYW4gPD0gJzknKSkgeworICAgICAgICBuZXh0ID0gKnNjYW47CisgICAgICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgICAgICBpbnQgcHJvYyA9IF9fa21wX3N0cl90b19pbnQoKnNjYW4sICpuZXh0KTsKKyAgICAgICAgS01QX0FTU0VSVChwcm9jID49IDApOworICAgICAgICAqc2NhbiA9IG5leHQ7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBLTVBfV0FSTklORyggU3ludGF4RXJyb3JVc2luZywgdmFyLCAiXCJ0aHJlYWRzXCIiICk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBpbnQKK19fa21wX3BhcnNlX3BsYWNlX2xpc3QoIGNvbnN0IGNoYXIgKnZhciwgY29uc3QgY2hhciAqZW52LCBjaGFyICoqcGxhY2VfbGlzdCApCit7CisgICAgY29uc3QgY2hhciAqc2NhbiA9IGVudjsKKyAgICBjb25zdCBjaGFyICpuZXh0ID0gc2NhbjsKKworICAgIGZvciAoOzspIHsKKyAgICAgICAgaW50IHN0YXJ0LCBjb3VudCwgc3RyaWRlOworCisgICAgICAgIGlmICghIF9fa21wX3BhcnNlX3BsYWNlKHZhciwgJnNjYW4pKSB7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICAvLworICAgICAgICAvLyB2YWxpZCBmb2xsb3cgc2V0cyBhcmUgJywnICc6JyBhbmQgRU9MCisgICAgICAgIC8vCisgICAgICAgIFNLSVBfV1Moc2Nhbik7CisgICAgICAgIGlmICgqc2NhbiA9PSAnXDAnKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoKnNjYW4gPT0gJywnKSB7CisgICAgICAgICAgICBzY2FuKys7ICAgICAvLyBza2lwICcsJworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCpzY2FuICE9ICc6JykgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoIFN5bnRheEVycm9yVXNpbmcsIHZhciwgIlwidGhyZWFkc1wiIiApOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAgIHNjYW4rKzsgICAgICAgICAvLyBza2lwICc6JworCisgICAgICAgIC8vCisgICAgICAgIC8vIFJlYWQgY291bnQgcGFyYW1ldGVyCisgICAgICAgIC8vCisgICAgICAgIFNLSVBfV1Moc2Nhbik7CisgICAgICAgIGlmICgoKnNjYW4gPCAnMCcpIHx8ICgqc2NhbiA+ICc5JykpIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBTeW50YXhFcnJvclVzaW5nLCB2YXIsICJcInRocmVhZHNcIiIgKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICBuZXh0ID0gc2NhbjsKKyAgICAgICAgU0tJUF9ESUdJVFMobmV4dCk7CisgICAgICAgIGNvdW50ID0gX19rbXBfc3RyX3RvX2ludChzY2FuLCAqbmV4dCk7CisgICAgICAgIEtNUF9BU1NFUlQoY291bnQgPj0gMCk7CisgICAgICAgIHNjYW4gPSBuZXh0OworCisgICAgICAgIC8vCisgICAgICAgIC8vIHZhbGlkIGZvbGxvdyBzZXRzIGFyZSAnLCcgJzonIGFuZCBFT0wKKyAgICAgICAgLy8KKyAgICAgICAgU0tJUF9XUyhzY2FuKTsKKyAgICAgICAgaWYgKCpzY2FuID09ICdcMCcpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmICgqc2NhbiA9PSAnLCcpIHsKKyAgICAgICAgICAgIHNjYW4rKzsgICAgIC8vIHNraXAgJywnCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKnNjYW4gIT0gJzonKSB7CisgICAgICAgICAgICBLTVBfV0FSTklORyggU3ludGF4RXJyb3JVc2luZywgdmFyLCAiXCJ0aHJlYWRzXCIiICk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgc2NhbisrOyAgICAgICAgIC8vIHNraXAgJzonCisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gUmVhZCBzdHJpZGUgcGFyYW1ldGVyCisgICAgICAgIC8vCisgICAgICAgIGludCBzaWduID0gKzE7CisgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgIFNLSVBfV1Moc2Nhbik7CisgICAgICAgICAgICBpZiAoKnNjYW4gPT0gJysnKSB7CisgICAgICAgICAgICAgICAgc2NhbisrOyAvLyBza2lwICcrJworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCpzY2FuID09ICctJykgeworICAgICAgICAgICAgICAgIHNpZ24gKj0gLTE7CisgICAgICAgICAgICAgICAgc2NhbisrOyAvLyBza2lwICctJworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgU0tJUF9XUyhzY2FuKTsKKyAgICAgICAgaWYgKCgqc2NhbiA8ICcwJykgfHwgKCpzY2FuID4gJzknKSkgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoIFN5bnRheEVycm9yVXNpbmcsIHZhciwgIlwidGhyZWFkc1wiIiApOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAgIG5leHQgPSBzY2FuOworICAgICAgICBTS0lQX0RJR0lUUyhuZXh0KTsKKyAgICAgICAgc3RyaWRlID0gX19rbXBfc3RyX3RvX2ludChzY2FuLCAqbmV4dCk7CisgICAgICAgIEtNUF9BU1NFUlQoc3RyaWRlID49IDApOworICAgICAgICBzY2FuID0gbmV4dDsKKyAgICAgICAgc3RyaWRlICo9IHNpZ247CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gdmFsaWQgZm9sbG93IHNldHMgYXJlICcsJyBhbmQgRU9MCisgICAgICAgIC8vCisgICAgICAgIFNLSVBfV1Moc2Nhbik7CisgICAgICAgIGlmICgqc2NhbiA9PSAnXDAnKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoKnNjYW4gPT0gJywnKSB7CisgICAgICAgICAgICBzY2FuKys7ICAgICAvLyBza2lwICcsJworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBLTVBfV0FSTklORyggU3ludGF4RXJyb3JVc2luZywgdmFyLCAiXCJ0aHJlYWRzXCIiICk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIGludCBsZW4gPSBzY2FuIC0gZW52OworICAgICAgICBjaGFyICpyZXRsaXN0ID0gKGNoYXIgKilfX2ttcF9hbGxvY2F0ZSgobGVuICsgMSkgKiBzaXplb2YoY2hhcikpOworICAgICAgICBtZW1jcHkocmV0bGlzdCwgZW52LCBsZW4gKiBzaXplb2YoY2hhcikpOworICAgICAgICByZXRsaXN0W2xlbl0gPSAnXDAnOworICAgICAgICAqcGxhY2VfbGlzdCA9IHJldGxpc3Q7CisgICAgfQorICAgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX3BsYWNlcyggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKQoreworICAgIGludCBjb3VudDsKKyAgICBjb25zdCBjaGFyICpzY2FuID0gdmFsdWU7CisgICAgY29uc3QgY2hhciAqbmV4dCA9IHNjYW47CisgICAgY29uc3QgY2hhciAqa2luZCA9ICJcInRocmVhZHNcIiI7CisgICAga21wX3NldHRpbmdfdCAqKnJpdmFscyA9IChrbXBfc2V0dGluZ190ICoqKSBkYXRhOworICAgIGludCByYzsKKworICAgIHJjID0gX19rbXBfc3RnX2NoZWNrX3JpdmFscyggbmFtZSwgdmFsdWUsIHJpdmFscyApOworICAgIGlmICggcmMgKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLworICAgIC8vIElmIE9NUF9QUk9DX0JJTkQgaXMgbm90IHNwZWNpZmllZCBidXQgT01QX1BMQUNFUyBpcywKKyAgICAvLyB0aGVuIGxldCBPTVBfUFJPQ19CSU5EIGRlZmF1bHQgdG8gdHJ1ZS4KKyAgICAvLworICAgIGlmICggX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdID09IHByb2NfYmluZF9kZWZhdWx0ICkgeworICAgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPSBwcm9jX2JpbmRfdHJ1ZTsKKyAgICB9CisKKyAgICAvL19fa21wX2FmZmluaXR5X251bV9wbGFjZXMgPSAwOworCisgICAgaWYgKCBfX2ttcF9tYXRjaF9zdHIoICJ0aHJlYWRzIiwgc2NhbiwgJm5leHQgKSApIHsKKyAgICAgICAgc2NhbiA9IG5leHQ7CisgICAgICAgIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9jb21wYWN0OworICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuID0gYWZmaW5pdHlfZ3Jhbl90aHJlYWQ7CisgICAgICAgIF9fa21wX2FmZmluaXR5X2R1cHMgPSBGQUxTRTsKKyAgICAgICAga2luZCA9ICJcInRocmVhZHNcIiI7CisgICAgfQorICAgIGVsc2UgaWYgKCBfX2ttcF9tYXRjaF9zdHIoICJjb3JlcyIsIHNjYW4sICZuZXh0ICkgKSB7CisgICAgICAgIHNjYW4gPSBuZXh0OworICAgICAgICBfX2ttcF9hZmZpbml0eV90eXBlID0gYWZmaW5pdHlfY29tcGFjdDsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3JhbiA9IGFmZmluaXR5X2dyYW5fY29yZTsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfZHVwcyA9IEZBTFNFOworICAgICAgICBraW5kID0gIlwiY29yZXNcIiI7CisgICAgfQorICAgIGVsc2UgaWYgKCBfX2ttcF9tYXRjaF9zdHIoICJzb2NrZXRzIiwgc2NhbiwgJm5leHQgKSApIHsKKyAgICAgICAgc2NhbiA9IG5leHQ7CisgICAgICAgIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9jb21wYWN0OworICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuID0gYWZmaW5pdHlfZ3Jhbl9wYWNrYWdlOworICAgICAgICBfX2ttcF9hZmZpbml0eV9kdXBzID0gRkFMU0U7CisgICAgICAgIGtpbmQgPSAiXCJzb2NrZXRzXCIiOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKCBfX2ttcF9hZmZpbml0eV9wcm9jbGlzdCAhPSBOVUxMICkgeworICAgICAgICAgICAgS01QX0lOVEVSTkFMX0ZSRUUoICh2b2lkICopX19rbXBfYWZmaW5pdHlfcHJvY2xpc3QgKTsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3Byb2NsaXN0ID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIF9fa21wX3BhcnNlX3BsYWNlX2xpc3QoIG5hbWUsIHZhbHVlLCAmX19rbXBfYWZmaW5pdHlfcHJvY2xpc3QgKSApIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9leHBsaWNpdDsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW4gPSBhZmZpbml0eV9ncmFuX2ZpbmU7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9kdXBzID0gRkFMU0U7CisgICAgICAgICAgICBpZiAoIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSA9PSBwcm9jX2JpbmRfZGVmYXVsdCApIHsKKyAgICAgICAgICAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdID0gcHJvY19iaW5kX3RydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICggX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdID09IHByb2NfYmluZF9kZWZhdWx0ICkgeworICAgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPSBwcm9jX2JpbmRfdHJ1ZTsKKyAgICB9CisKKyAgICBTS0lQX1dTKHNjYW4pOworICAgIGlmICggKnNjYW4gPT0gJ1wwJyApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vCisgICAgLy8gUGFyc2Ugb3B0aW9uIGNvdW50IHBhcmFtZXRlciBpbiBwYXJlbnRoZXNlcworICAgIC8vCisgICAgaWYgKCAqc2NhbiAhPSAnKCcgKSB7CisgICAgICAgIEtNUF9XQVJOSU5HKCBTeW50YXhFcnJvclVzaW5nLCBuYW1lLCBraW5kICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc2NhbisrOyAgICAgLy8gc2tpcCAnKCcKKworICAgIFNLSVBfV1Moc2Nhbik7CisgICAgbmV4dCA9IHNjYW47CisgICAgU0tJUF9ESUdJVFMobmV4dCk7CisgICAgY291bnQgPSBfX2ttcF9zdHJfdG9faW50KHNjYW4sICpuZXh0KTsKKyAgICBLTVBfQVNTRVJUKGNvdW50ID49IDApOworICAgIHNjYW4gPSBuZXh0OworCisgICAgU0tJUF9XUyhzY2FuKTsKKyAgICBpZiAoICpzY2FuICE9ICcpJyApIHsKKyAgICAgICAgS01QX1dBUk5JTkcoIFN5bnRheEVycm9yVXNpbmcsIG5hbWUsIGtpbmQgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzY2FuKys7ICAgICAvLyBza2lwICcpJworCisgICAgU0tJUF9XUyhzY2FuKTsKKyAgICBpZiAoICpzY2FuICE9ICdcMCcgKSB7CisgICAgICAgIEtNUF9XQVJOSU5HKCBQYXJzZUV4dHJhQ2hhcnNXYXJuLCBuYW1lLCBzY2FuICk7CisgICAgfQorICAgIF9fa21wX2FmZmluaXR5X251bV9wbGFjZXMgPSBjb3VudDsKK30KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9wbGFjZXMoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLAorICB2b2lkICogZGF0YSApCit7CisgICAgaWYoIF9fa21wX2Vudl9mb3JtYXQgKSB7CisgICAgICAgIEtNUF9TVFJfQlVGX1BSSU5UX05BTUU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAgJXMiLCBuYW1lICk7CisgICAgfQorICAgIGlmICggKCBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLnVzZWQgPT0gMCApCisgICAgICB8fCAoIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlcyA9PSBOVUxMICkKKyAgICAgIHx8ICggX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdID09IHByb2NfYmluZF9mYWxzZSApICkgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICI6ICVzXG4iLCBLTVBfSTE4Tl9TVFIoIE5vdERlZmluZWQgKSApOworICAgIH0KKyAgICBlbHNlIGlmICggX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9leHBsaWNpdCApIHsKKyAgICAgICAgaWYgKCBfX2ttcF9hZmZpbml0eV9wcm9jbGlzdCAhPSBOVUxMICkgeworICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiPSclcydcbiIsIF9fa21wX2FmZmluaXR5X3Byb2NsaXN0ICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICI6ICVzXG4iLCBLTVBfSTE4Tl9TVFIoIE5vdERlZmluZWQgKSApOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKCBfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X2NvbXBhY3QgKSB7CisgICAgICAgIGludCBudW07CisgICAgICAgIGlmICggX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzID4gMCApIHsKKyAgICAgICAgICAgIG51bSA9IF9fa21wX2FmZmluaXR5X251bV9tYXNrczsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggX19rbXBfYWZmaW5pdHlfbnVtX3BsYWNlcyA+IDAgKSB7CisgICAgICAgICAgICBudW0gPSBfX2ttcF9hZmZpbml0eV9udW1fcGxhY2VzOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgbnVtID0gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIF9fa21wX2FmZmluaXR5X2dyYW4gPT0gYWZmaW5pdHlfZ3Jhbl90aHJlYWQgKSB7CisgICAgICAgICAgICBpZiAoIG51bSA+IDAgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiPSd0aHJlYWRzKCVkKSdcbiIsIG51bSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiPSd0aHJlYWRzJ1xuIiApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCBfX2ttcF9hZmZpbml0eV9ncmFuID09IGFmZmluaXR5X2dyYW5fY29yZSApIHsKKyAgICAgICAgICAgIGlmICggbnVtID4gMCApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICI9J2NvcmVzKCVkKScgXG4iLCBudW0gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIj0nY29yZXMnXG4iICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIF9fa21wX2FmZmluaXR5X2dyYW4gPT0gYWZmaW5pdHlfZ3Jhbl9wYWNrYWdlICkgeworICAgICAgICAgICAgaWYgKCBudW0gPiAwICkgeworICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIj0nc29ja2V0cyglZCknXG4iLCBudW0gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIj0nc29ja2V0cydcbiIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIjogJXNcbiIsIEtNUF9JMThOX1NUUiggTm90RGVmaW5lZCApICk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIjogJXNcbiIsIEtNUF9JMThOX1NUUiggTm90RGVmaW5lZCApICk7CisgICAgfQorfQorCisjIGVuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisKKyMgaWYgKCEgT01QXzQwX0VOQUJMRUQpCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfcHJvY19iaW5kKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApCit7CisgICAgaW50IGVuYWJsZWQ7CisgICAga21wX3NldHRpbmdfdCAqKnJpdmFscyA9IChrbXBfc2V0dGluZ190ICoqKSBkYXRhOworICAgIGludCByYzsKKworICAgIHJjID0gX19rbXBfc3RnX2NoZWNrX3JpdmFscyggbmFtZSwgdmFsdWUsIHJpdmFscyApOworICAgIGlmICggcmMgKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLworICAgIC8vIGluIE9NUCAzLjEsIE9NUF9QUk9DX0JJTkQgaXMgc3RyaWN0bHkgYSBib29sZWFuCisgICAgLy8KKyAgICBfX2ttcF9zdGdfcGFyc2VfYm9vbCggbmFtZSwgdmFsdWUsICYgZW5hYmxlZCApOworICAgIGlmICggZW5hYmxlZCApIHsKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBPTVBfUFJPQ19CSU5EID0+IGdyYW51bGFyaXR5PWZpbmUsc2NhdHRlciBvbiBNSUMKKyAgICAgICAgICAgIC8vIE9NUF9QUk9DX0JJTkQgPT4gZ3JhbnVsYXJpdHk9Y29yZSxzY2F0dGVyIGVsc2V3aGVyZQorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9zY2F0dGVyOworIyAgaWYgS01QX01JQworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3JhbiA9IGFmZmluaXR5X2dyYW5fZmluZTsKKyMgIGVsc2UKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW4gPSBhZmZpbml0eV9ncmFuX2NvcmU7CisjICBlbmRpZiAvKiBLTVBfTUlDICovCisgICAgfQorICAgIGVsc2UgeworICAgICAgICBfX2ttcF9hZmZpbml0eV90eXBlID0gYWZmaW5pdHlfbm9uZTsKKyAgICB9Cit9IC8vIF9fa21wX3BhcnNlX3Byb2NfYmluZAorCisjIGVuZGlmIC8qIGlmICghIE9NUF80MF9FTkFCTEVEKSAqLworCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfdG9wb2xvZ3lfbWV0aG9kKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLAorICB2b2lkICogZGF0YSApIHsKKyAgICBpZiAoIF9fa21wX3N0cl9tYXRjaCggImFsbCIsIDEsIHZhbHVlICkgKSB7CisgICAgICAgX19rbXBfYWZmaW5pdHlfdG9wX21ldGhvZCA9IGFmZmluaXR5X3RvcF9tZXRob2RfYWxsOworICAgIH0KKyMgaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorICAgIGVsc2UgaWYgKCBfX2ttcF9zdHJfbWF0Y2goICJ4MmFwaWMgaWQiLCA5LCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJ4MmFwaWNfaWQiLCA5LCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJ4MmFwaWMtaWQiLCA5LCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJ4MmFwaWNpZCIsIDgsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImNwdWlkIGxlYWYgMTEiLCAxMywgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiY3B1aWRfbGVhZl8xMSIsIDEzLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJjcHVpZC1sZWFmLTExIiwgMTMsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImNwdWlkIGxlYWYxMSIsIDEyLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJjcHVpZF9sZWFmMTEiLCAxMiwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiY3B1aWQtbGVhZjExIiwgMTIsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImNwdWlkbGVhZiAxMSIsIDEyLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJjcHVpZGxlYWZfMTEiLCAxMiwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiY3B1aWRsZWFmLTExIiwgMTIsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImNwdWlkbGVhZjExIiwgMTEsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImNwdWlkIDExIiwgOCwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiY3B1aWRfMTEiLCA4LCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJjcHVpZC0xMSIsIDgsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImNwdWlkMTEiLCA3LCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJsZWFmIDExIiwgNywgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAibGVhZl8xMSIsIDcsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImxlYWYtMTEiLCA3LCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJsZWFmMTEiLCA2LCB2YWx1ZSApICkgeworICAgICAgICBfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID0gYWZmaW5pdHlfdG9wX21ldGhvZF94MmFwaWNpZDsKKyAgICB9CisgICAgZWxzZSBpZiAoIF9fa21wX3N0cl9tYXRjaCggImFwaWMgaWQiLCA3LCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJhcGljX2lkIiwgNywgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiYXBpYy1pZCIsIDcsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImFwaWNpZCIsIDYsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImNwdWlkIGxlYWYgNCIsIDEyLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJjcHVpZF9sZWFmXzQiLCAxMiwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiY3B1aWQtbGVhZi00IiwgMTIsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImNwdWlkIGxlYWY0IiwgMTEsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImNwdWlkX2xlYWY0IiwgMTEsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImNwdWlkLWxlYWY0IiwgMTEsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImNwdWlkbGVhZiA0IiwgMTEsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImNwdWlkbGVhZl80IiwgMTEsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImNwdWlkbGVhZi00IiwgMTEsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImNwdWlkbGVhZjQiLCAxMCwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiY3B1aWQgNCIsIDcsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImNwdWlkXzQiLCA3LCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJjcHVpZC00IiwgNywgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiY3B1aWQ0IiwgNiwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAibGVhZiA0IiwgNiwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAibGVhZl80IiwgNiwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAibGVhZi00IiwgNiwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAibGVhZjQiLCA1LCB2YWx1ZSApICkgeworICAgICAgICBfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID0gYWZmaW5pdHlfdG9wX21ldGhvZF9hcGljaWQ7CisgICAgfQorIyBlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisgICAgZWxzZSBpZiAoIF9fa21wX3N0cl9tYXRjaCggIi9wcm9jL2NwdWluZm8iLCAyLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJjcHVpbmZvIiwgNSwgdmFsdWUgKSkgeworICAgICAgICBfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID0gYWZmaW5pdHlfdG9wX21ldGhvZF9jcHVpbmZvOworICAgIH0KKyMgaWYgS01QX09TX1dJTkRPV1MgJiYgS01QX0FSQ0hfWDg2XzY0CisgICAgZWxzZSBpZiAoIF9fa21wX3N0cl9tYXRjaCggImdyb3VwIiwgMSwgdmFsdWUgKSApIHsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfdG9wX21ldGhvZCA9IGFmZmluaXR5X3RvcF9tZXRob2RfZ3JvdXA7CisgICAgfQorIyBlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAmJiBLTVBfQVJDSF9YODZfNjQgKi8KKyAgICBlbHNlIGlmICggX19rbXBfc3RyX21hdGNoKCAiZmxhdCIsIDEsIHZhbHVlICkgKSB7CisgICAgICAgIF9fa21wX2FmZmluaXR5X3RvcF9tZXRob2QgPSBhZmZpbml0eV90b3BfbWV0aG9kX2ZsYXQ7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBLTVBfV0FSTklORyggU3RnSW52YWxpZFZhbHVlLCBuYW1lLCB2YWx1ZSApOworICAgIH0KK30gLy8gX19rbXBfc3RnX3BhcnNlX3RvcG9sb2d5X21ldGhvZAorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X3RvcG9sb2d5X21ldGhvZCgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsCisgIHZvaWQgKiBkYXRhICkgeworIyBpZiBLTVBfREVCVUcKKyAgICBjaGFyIGNvbnN0ICogdmFsdWUgPSBOVUxMOworCisgICAgc3dpdGNoICggX19rbXBfYWZmaW5pdHlfdG9wX21ldGhvZCApIHsKKyAgICAgICAgY2FzZSBhZmZpbml0eV90b3BfbWV0aG9kX2RlZmF1bHQ6CisgICAgICAgIHZhbHVlID0gImRlZmF1bHQiOworICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGFmZmluaXR5X3RvcF9tZXRob2RfYWxsOgorICAgICAgICB2YWx1ZSA9ICJhbGwiOworICAgICAgICBicmVhazsKKworIyAgaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorICAgICAgICBjYXNlIGFmZmluaXR5X3RvcF9tZXRob2RfeDJhcGljaWQ6CisgICAgICAgIHZhbHVlID0gIngyQVBJQyBpZCI7CisgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgYWZmaW5pdHlfdG9wX21ldGhvZF9hcGljaWQ6CisgICAgICAgIHZhbHVlID0gIkFQSUMgaWQiOworICAgICAgICBicmVhazsKKyMgIGVuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKworICAgICAgICBjYXNlIGFmZmluaXR5X3RvcF9tZXRob2RfY3B1aW5mbzoKKyAgICAgICAgdmFsdWUgPSAiY3B1aW5mbyI7CisgICAgICAgIGJyZWFrOworCisjICBpZiBLTVBfT1NfV0lORE9XUyAmJiBLTVBfQVJDSF9YODZfNjQKKyAgICAgICAgY2FzZSBhZmZpbml0eV90b3BfbWV0aG9kX2dyb3VwOgorICAgICAgICB2YWx1ZSA9ICJncm91cCI7CisgICAgICAgIGJyZWFrOworIyAgZW5kaWYgLyogS01QX09TX1dJTkRPV1MgJiYgS01QX0FSQ0hfWDg2XzY0ICovCisKKyAgICAgICAgY2FzZSBhZmZpbml0eV90b3BfbWV0aG9kX2ZsYXQ6CisgICAgICAgIHZhbHVlID0gImZsYXQiOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIHZhbHVlICE9IE5VTEwgKSB7CisgICAgICAgIF9fa21wX3N0Z19wcmludF9zdHIoIGJ1ZmZlciwgbmFtZSwgdmFsdWUgKTsKKyAgICB9CisjIGVuZGlmIC8qIEtNUF9ERUJVRyAqLworfSAvLyBfX2ttcF9zdGdfcHJpbnRfdG9wb2xvZ3lfbWV0aG9kCisKKyNlbmRpZiAvKiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVEICovCisKKworI2lmIE9NUF80MF9FTkFCTEVECisKKy8vCisvLyBPTVBfUFJPQ19CSU5EIC8gYmluZC12YXIgaXMgZnVuY3Rpb25hbCBvbiBhbGwgNC4wIGJ1aWxkcywgaW5jbHVkaW5nIE9TIFgqCisvLyBPTVBfUExBQ0VTIC8gcGxhY2UtcGFydGl0aW9uLXZhciBpcyBub3QuCisvLworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9wcm9jX2JpbmQoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkKK3sKKyAgICBrbXBfc2V0dGluZ190ICoqcml2YWxzID0gKGttcF9zZXR0aW5nX3QgKiopIGRhdGE7CisgICAgaW50IHJjOworCisgICAgcmMgPSBfX2ttcF9zdGdfY2hlY2tfcml2YWxzKCBuYW1lLCB2YWx1ZSwgcml2YWxzICk7CisgICAgaWYgKCByYyApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vCisgICAgLy8gaW4gT01QIDQuMCBPTVBfUFJPQ19CSU5EIGlzIGEgdmVjdG9yIG9mIHByb2NfYmluZCB0eXBlcy4KKyAgICAvLworICAgIEtNUF9ERUJVR19BU1NFUlQoIChfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXMgIT0gTlVMTCkKKyAgICAgICYmICggX19rbXBfbmVzdGVkX3Byb2NfYmluZC51c2VkID4gMCApICk7CisKKyAgICBjb25zdCBjaGFyICpidWYgPSB2YWx1ZTsKKyAgICBjb25zdCBjaGFyICpuZXh0OworICAgIGludCBudW07CisgICAgU0tJUF9XUyggYnVmICk7CisgICAgaWYgKCAoKmJ1ZiA+PSAnMCcpICYmICgqYnVmIDw9ICc5JykgKSB7CisgICAgICAgIG5leHQgPSBidWY7CisgICAgICAgIFNLSVBfRElHSVRTKCBuZXh0ICk7CisgICAgICAgIG51bSA9IF9fa21wX3N0cl90b19pbnQoIGJ1ZiwgKm5leHQgKTsKKyAgICAgICAgS01QX0FTU0VSVCggbnVtID49IDAgKTsKKyAgICAgICAgYnVmID0gbmV4dDsKKyAgICAgICAgU0tJUF9XUyggYnVmICk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBudW0gPSAtMTsKKyAgICB9CisKKyAgICBuZXh0ID0gYnVmOworICAgIGlmICggX19rbXBfbWF0Y2hfc3RyKCAiZGlzYWJsZWQiLCBidWYsICZuZXh0ICkgKSB7CisgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICAgIFNLSVBfV1MoIGJ1ZiApOworIyBpZiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgICAgIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9kaXNhYmxlZDsKKyMgZW5kaWYgLyogS01QX0FGRklOSVRZX1NVUFBPUlRFRCAqLworICAgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLnVzZWQgPSAxOworICAgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPSBwcm9jX2JpbmRfZGlzYWJsZWQ7CisgICAgfQorICAgIGVsc2UgaWYgKCAoIG51bSA9PSAoaW50KXByb2NfYmluZF9mYWxzZSApCisgICAgICB8fCBfX2ttcF9tYXRjaF9zdHIoICJmYWxzZSIsIGJ1ZiwgJm5leHQgKSApIHsKKyAgICAgICAgYnVmID0gbmV4dDsKKyAgICAgICAgU0tJUF9XUyggYnVmICk7CisjIGlmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfdHlwZSA9IGFmZmluaXR5X25vbmU7CisjIGVuZGlmIC8qIEtNUF9BRkZJTklUWV9TVVBQT1JURUQgKi8KKyAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC51c2VkID0gMTsKKyAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdID0gcHJvY19iaW5kX2ZhbHNlOworICAgIH0KKyAgICBlbHNlIGlmICggKCBudW0gPT0gKGludClwcm9jX2JpbmRfdHJ1ZSApCisgICAgICB8fCBfX2ttcF9tYXRjaF9zdHIoICJ0cnVlIiwgYnVmLCAmbmV4dCApICkgeworICAgICAgICBidWYgPSBuZXh0OworICAgICAgICBTS0lQX1dTKCBidWYgKTsKKyAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC51c2VkID0gMTsKKyAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdID0gcHJvY19iaW5kX3RydWU7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvLworICAgICAgICAvLyBDb3VudCB0aGUgbnVtYmVyIG9mIHZhbHVlcyBpbiB0aGUgZW52IHZhciBzdHJpbmcKKyAgICAgICAgLy8KKyAgICAgICAgY29uc3QgY2hhciAqc2NhbjsKKyAgICAgICAgaW50IG5lbGVtID0gMTsKKyAgICAgICAgZm9yICggc2NhbiA9IGJ1ZjsgKnNjYW4gIT0gJ1wwJzsgc2NhbisrICkgeworICAgICAgICAgICAgaWYgKCAqc2NhbiA9PSAnLCcgKSB7CisgICAgICAgICAgICAgICAgbmVsZW0rKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIENyZWF0ZSAvIGV4cGFuZCB0aGUgbmVzdGVkIHByb2NfYmluZCBhcnJheSBhcyBuZWVkZWQKKyAgICAgICAgLy8KKyAgICAgICAgaWYgKCBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLnNpemUgPCBuZWxlbSApIHsKKyAgICAgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlcyA9IChrbXBfcHJvY19iaW5kX3QgKikKKyAgICAgICAgICAgICAgICBLTVBfSU5URVJOQUxfUkVBTExPQyggX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzLAorICAgICAgICAgICAgICAgIHNpemVvZihrbXBfcHJvY19iaW5kX3QpICogbmVsZW0gKTsKKyAgICAgICAgICAgIGlmICggX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzID09IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgS01QX0ZBVEFMKCBNZW1vcnlBbGxvY0ZhaWxlZCApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC5zaXplID0gbmVsZW07CisgICAgICAgIH0KKyAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC51c2VkID0gbmVsZW07CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gU2F2ZSB2YWx1ZXMgaW4gdGhlIG5lc3RlZCBwcm9jX2JpbmQgYXJyYXkKKyAgICAgICAgLy8KKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICBlbnVtIGttcF9wcm9jX2JpbmRfdCBiaW5kOworCisgICAgICAgICAgICBpZiAoICggbnVtID09IChpbnQpcHJvY19iaW5kX21hc3RlciApCisgICAgICAgICAgICAgIHx8IF9fa21wX21hdGNoX3N0ciggIm1hc3RlciIsIGJ1ZiwgJm5leHQgKSApIHsKKyAgICAgICAgICAgICAgICBidWYgPSBuZXh0OworICAgICAgICAgICAgICAgIFNLSVBfV1MoIGJ1ZiApOworICAgICAgICAgICAgICAgIGJpbmQgPSBwcm9jX2JpbmRfbWFzdGVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoICggbnVtID09IChpbnQpcHJvY19iaW5kX2Nsb3NlICkKKyAgICAgICAgICAgICAgfHwgX19rbXBfbWF0Y2hfc3RyKCAiY2xvc2UiLCBidWYsICZuZXh0ICkgKSB7CisgICAgICAgICAgICAgICAgYnVmID0gbmV4dDsKKyAgICAgICAgICAgICAgICBTS0lQX1dTKCBidWYgKTsKKyAgICAgICAgICAgICAgICBiaW5kID0gcHJvY19iaW5kX2Nsb3NlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoICggbnVtID09IChpbnQpcHJvY19iaW5kX3NwcmVhZCApCisgICAgICAgICAgICAgIHx8IF9fa21wX21hdGNoX3N0ciggInNwcmVhZCIsIGJ1ZiwgJm5leHQgKSApIHsKKyAgICAgICAgICAgICAgICBidWYgPSBuZXh0OworICAgICAgICAgICAgICAgIFNLSVBfV1MoIGJ1ZiApOworICAgICAgICAgICAgICAgIGJpbmQgPSBwcm9jX2JpbmRfc3ByZWFkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoIFN0Z0ludmFsaWRWYWx1ZSwgbmFtZSwgdmFsdWUgKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPSBwcm9jX2JpbmRfZmFsc2U7CisgICAgICAgICAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC51c2VkID0gMTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1tpKytdID0gYmluZDsKKyAgICAgICAgICAgIGlmICggaSA+PSBuZWxlbSApIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoICpidWYgPT0gJywnICk7CisgICAgICAgICAgICBidWYrKzsKKyAgICAgICAgICAgIFNLSVBfV1MoIGJ1ZiApOworCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gUmVhZCBuZXh0IHZhbHVlIGlmIGl0IHdhcyBzcGVjaWZpZWQgYXMgYW4gaW50ZWdlcgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGlmICggKCpidWYgPj0gJzAnKSAmJiAoKmJ1ZiA8PSAnOScpICkgeworICAgICAgICAgICAgICAgIG5leHQgPSBidWY7CisgICAgICAgICAgICAgICAgU0tJUF9ESUdJVFMoIG5leHQgKTsKKyAgICAgICAgICAgICAgICBudW0gPSBfX2ttcF9zdHJfdG9faW50KCBidWYsICpuZXh0ICk7CisgICAgICAgICAgICAgICAgS01QX0FTU0VSVCggbnVtID49IDAgKTsKKyAgICAgICAgICAgICAgICBidWYgPSBuZXh0OworICAgICAgICAgICAgICAgIFNLSVBfV1MoIGJ1ZiApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgbnVtID0gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgU0tJUF9XUyggYnVmICk7CisgICAgfQorICAgIGlmICggKmJ1ZiAhPSAnXDAnICkgeworICAgICAgICBLTVBfV0FSTklORyggUGFyc2VFeHRyYUNoYXJzV2FybiwgbmFtZSwgYnVmICk7CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfcHJvY19iaW5kKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwKKyAgdm9pZCAqIGRhdGEgKQoreworICAgIGludCBuZWxlbSA9IF9fa21wX25lc3RlZF9wcm9jX2JpbmQudXNlZDsKKyAgICBpZiggX19rbXBfZW52X2Zvcm1hdCApIHsKKyAgICAgICAgS01QX1NUUl9CVUZfUFJJTlRfTkFNRTsKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIgICAlcyIsIG5hbWUgKTsKKyAgICB9CisgICAgaWYgKCBuZWxlbSA9PSAwICkgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICI6ICVzXG4iLCBLTVBfSTE4Tl9TVFIoIE5vdERlZmluZWQgKSApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIj0nIiwgbmFtZSApOworICAgICAgICBmb3IgKCBpID0gMDsgaSA8IG5lbGVtOyBpKysgKSB7CisgICAgICAgICAgICBzd2l0Y2ggKCBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbaV0gKSB7CisgICAgICAgICAgICAgICAgY2FzZSBwcm9jX2JpbmRfZmFsc2U6CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiZmFsc2UiICk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIHByb2NfYmluZF90cnVlOgorICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgInRydWUiICk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIHByb2NfYmluZF9tYXN0ZXI6CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAibWFzdGVyIiApOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBwcm9jX2JpbmRfY2xvc2U6CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiY2xvc2UiICk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIHByb2NfYmluZF9zcHJlYWQ6CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAic3ByZWFkIiApOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBwcm9jX2JpbmRfZGlzYWJsZWQ6CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiZGlzYWJsZWQiICk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIHByb2NfYmluZF9pbnRlbDoKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICJpbnRlbCIgKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgcHJvY19iaW5kX2RlZmF1bHQ6CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiZGVmYXVsdCIgKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggaSA8IG5lbGVtIC0gMSApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIsIiApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIidcbiIgKTsKKyAgICB9Cit9CisKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE9NUF9EWU5BTUlDCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2Vfb21wX2R5bmFtaWMoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkKK3sKKyAgICBfX2ttcF9zdGdfcGFyc2VfYm9vbCggbmFtZSwgdmFsdWUsICYgKF9fa21wX2dsb2JhbC5nLmdfZHluYW1pYykgKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX29tcF9keW5hbWljCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfb21wX2R5bmFtaWMoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApCit7CisgICAgX19rbXBfc3RnX3ByaW50X2Jvb2woIGJ1ZmZlciwgbmFtZSwgX19rbXBfZ2xvYmFsLmcuZ19keW5hbWljICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9vbXBfZHluYW1pYworCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2ttcF9keW5hbWljX21vZGUoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkKK3sKKyAgICBpZiAoIFRDUl80KF9fa21wX2luaXRfcGFyYWxsZWwpICkgeworICAgICAgICBLTVBfV0FSTklORyggRW52UGFyYWxsZWxXYXJuLCBuYW1lICk7CisgICAgICAgIF9fa21wX2Vudl90b1ByaW50KCBuYW1lLCAwICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisjaWZkZWYgVVNFX0xPQURfQkFMQU5DRQorICAgIGVsc2UgaWYgKCBfX2ttcF9zdHJfbWF0Y2goICJsb2FkIGJhbGFuY2UiLCAyLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJsb2FkX2JhbGFuY2UiLCAyLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJsb2FkLWJhbGFuY2UiLCAyLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJsb2FkYmFsYW5jZSIsIDIsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImJhbGFuY2UiLCAxLCB2YWx1ZSApICkgeworICAgICAgICBfX2ttcF9nbG9iYWwuZy5nX2R5bmFtaWNfbW9kZSA9IGR5bmFtaWNfbG9hZF9iYWxhbmNlOworICAgIH0KKyNlbmRpZiAvKiBVU0VfTE9BRF9CQUxBTkNFICovCisgICAgZWxzZSBpZiAoIF9fa21wX3N0cl9tYXRjaCggInRocmVhZCBsaW1pdCIsIDEsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggInRocmVhZF9saW1pdCIsIDEsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggInRocmVhZC1saW1pdCIsIDEsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggInRocmVhZGxpbWl0IiwgMSwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAibGltaXQiLCAyLCB2YWx1ZSApICkgeworICAgICAgICBfX2ttcF9nbG9iYWwuZy5nX2R5bmFtaWNfbW9kZSA9IGR5bmFtaWNfdGhyZWFkX2xpbWl0OworICAgIH0KKyAgICBlbHNlIGlmICggX19rbXBfc3RyX21hdGNoKCAicmFuZG9tIiwgMSwgdmFsdWUgKSApIHsKKyAgICAgICAgX19rbXBfZ2xvYmFsLmcuZ19keW5hbWljX21vZGUgPSBkeW5hbWljX3JhbmRvbTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIEtNUF9XQVJOSU5HKCBTdGdJbnZhbGlkVmFsdWUsIG5hbWUsIHZhbHVlICk7CisgICAgfQorfSAvL19fa21wX3N0Z19wYXJzZV9rbXBfZHluYW1pY19tb2RlCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfa21wX2R5bmFtaWNfbW9kZSgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkKK3sKKyNpZiBLTVBfREVCVUcKKyAgICBpZiAoIF9fa21wX2dsb2JhbC5nLmdfZHluYW1pY19tb2RlID09IGR5bmFtaWNfZGVmYXVsdCApIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAgJXM6ICVzIFxuIiwgbmFtZSwgS01QX0kxOE5fU1RSKCBOb3REZWZpbmVkICkgKTsKKyAgICB9CisjIGlmZGVmIFVTRV9MT0FEX0JBTEFOQ0UKKyAgICBlbHNlIGlmICggX19rbXBfZ2xvYmFsLmcuZ19keW5hbWljX21vZGUgPT0gZHluYW1pY19sb2FkX2JhbGFuY2UgKSB7CisgICAgICAgIF9fa21wX3N0Z19wcmludF9zdHIoIGJ1ZmZlciwgbmFtZSwgImxvYWQgYmFsYW5jZSIgKTsKKyAgICB9CisjIGVuZGlmIC8qIFVTRV9MT0FEX0JBTEFOQ0UgKi8KKyAgICBlbHNlIGlmICggX19rbXBfZ2xvYmFsLmcuZ19keW5hbWljX21vZGUgPT0gZHluYW1pY190aHJlYWRfbGltaXQgKSB7CisgICAgICAgIF9fa21wX3N0Z19wcmludF9zdHIoIGJ1ZmZlciwgbmFtZSwgInRocmVhZCBsaW1pdCIgKTsKKyAgICB9CisgICAgZWxzZSBpZiAoIF9fa21wX2dsb2JhbC5nLmdfZHluYW1pY19tb2RlID09IGR5bmFtaWNfcmFuZG9tICkgeworICAgICAgICBfX2ttcF9zdGdfcHJpbnRfc3RyKCBidWZmZXIsIG5hbWUsICJyYW5kb20iICk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBLTVBfQVNTRVJUKDApOworICAgIH0KKyNlbmRpZiAvKiBLTVBfREVCVUcgKi8KK30gLy8gX19rbXBfc3RnX3ByaW50X2ttcF9keW5hbWljX21vZGUKKworCisjaWZkZWYgVVNFX0xPQURfQkFMQU5DRQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfTE9BRF9CQUxBTkNFX0lOVEVSVkFMCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfbGRfYmFsYW5jZV9pbnRlcnZhbCggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKQoreworICAgIGRvdWJsZSBpbnRlcnZhbCA9IF9fa21wX2NvbnZlcnRfdG9fZG91YmxlKCB2YWx1ZSApOworICAgIGlmICggaW50ZXJ2YWwgPj0gMCApIHsKKyAgICAgICAgX19rbXBfbG9hZF9iYWxhbmNlX2ludGVydmFsID0gaW50ZXJ2YWw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgS01QX1dBUk5JTkcoIFN0Z0ludmFsaWRWYWx1ZSwgbmFtZSwgdmFsdWUgKTsKKyAgICB9OyAvLyBpZgorfSAvLyBfX2ttcF9zdGdfcGFyc2VfbG9hZF9iYWxhbmNlX2ludGVydmFsCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfbGRfYmFsYW5jZV9pbnRlcnZhbCgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworI2lmIEtNUF9ERUJVRworICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiAgICVzPSU4LjZmXG4iLCBuYW1lLCBfX2ttcF9sb2FkX2JhbGFuY2VfaW50ZXJ2YWwgKTsKKyNlbmRpZiAvKiBLTVBfREVCVUcgKi8KK30gLy8gX19rbXBfc3RnX3ByaW50X2xvYWRfYmFsYW5jZV9pbnRlcnZhbAorCisjZW5kaWYgLyogVVNFX0xPQURfQkFMQU5DRSAqLworCisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX0lOSVRfQVRfRk9SSworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2luaXRfYXRfZm9yayggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3BhcnNlX2Jvb2woIG5hbWUsIHZhbHVlLCAmIF9fa21wX25lZWRfcmVnaXN0ZXJfYXRmb3JrICk7CisgICAgaWYgKCBfX2ttcF9uZWVkX3JlZ2lzdGVyX2F0Zm9yayApIHsKKyAgICAgICAgX19rbXBfbmVlZF9yZWdpc3Rlcl9hdGZvcmtfc3BlY2lmaWVkID0gVFJVRTsKKyAgICB9OworfSAvLyBfX2ttcF9zdGdfcGFyc2VfaW5pdF9hdF9mb3JrCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfaW5pdF9hdF9mb3JrKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X2Jvb2woIGJ1ZmZlciwgbmFtZSwgX19rbXBfbmVlZF9yZWdpc3Rlcl9hdGZvcmtfc3BlY2lmaWVkICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9pbml0X2F0X2ZvcmsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX1NDSEVEVUxFCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2Vfc2NoZWR1bGUoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworCisgICAgaWYgKCB2YWx1ZSAhPSBOVUxMICkgeworICAgICAgICBzaXplX3QgbGVuZ3RoID0gc3RybGVuKCB2YWx1ZSApOworICAgICAgICBpZiAoIGxlbmd0aCA+IElOVF9NQVggKSB7CisgICAgICAgICAgICBLTVBfV0FSTklORyggTG9uZ1ZhbHVlLCBuYW1lICk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjaGFyICpzZW1pY29sb247CisgICAgICAgICAgICBpZiggdmFsdWVbIGxlbmd0aCAtIDEgXSA9PSAnIicgfHwgdmFsdWVbIGxlbmd0aCAtMSBdID09ICdcJycgKQorICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBVbmJhbGFuY2VkUXVvdGVzLCBuYW1lICk7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgY2hhciBzZW50aW5lbDsKKworICAgICAgICAgICAgICAgIHNlbWljb2xvbiA9IChjaGFyICopIHN0cmNociggdmFsdWUsICc7JyApOworICAgICAgICAgICAgICAgIGlmKCAqdmFsdWUgJiYgc2VtaWNvbG9uICE9IHZhbHVlICkgeworICAgICAgICAgICAgICAgICAgICBjaGFyICpjb21tYSA9IChjaGFyICopIHN0cmNociggdmFsdWUsICcsJyApOworCisgICAgICAgICAgICAgICAgICAgIGlmICggY29tbWEgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICArK2NvbW1hOworICAgICAgICAgICAgICAgICAgICAgICAgc2VudGluZWwgPSAnLCc7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgc2VudGluZWwgPSAnOyc7CisgICAgICAgICAgICAgICAgICAgIGlmICggIV9fa21wX3N0cmNhc2VjbXBfd2l0aF9zZW50aW5lbCggInN0YXRpYyIsIHZhbHVlLCBzZW50aW5lbCApICkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYoICFfX2ttcF9zdHJjYXNlY21wX3dpdGhfc2VudGluZWwoICJncmVlZHkiLCBjb21tYSwgJzsnICkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RhdGljID0ga21wX3NjaF9zdGF0aWNfZ3JlZWR5OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmKCAhX19rbXBfc3RyY2FzZWNtcF93aXRoX3NlbnRpbmVsKCAiYmFsYW5jZWQiLCBjb21tYSwgJzsnICkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RhdGljID0ga21wX3NjaF9zdGF0aWNfYmFsYW5jZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoICFfX2ttcF9zdHJjYXNlY21wX3dpdGhfc2VudGluZWwoICJndWlkZWQiLCB2YWx1ZSwgc2VudGluZWwgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggIV9fa21wX3N0cmNhc2VjbXBfd2l0aF9zZW50aW5lbCggIml0ZXJhdGl2ZSIsIGNvbW1hLCAnOycgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndWlkZWQgPSBrbXBfc2NoX2d1aWRlZF9pdGVyYXRpdmVfY2h1bmtlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoICFfX2ttcF9zdHJjYXNlY21wX3dpdGhfc2VudGluZWwoICJhbmFseXRpY2FsIiwgY29tbWEsICc7JyApICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFuYWx5dGljYWwgbm90IGFsbG93ZWQgZm9yIHRvbyBtYW55IHRocmVhZHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndWlkZWQgPSBrbXBfc2NoX2d1aWRlZF9hbmFseXRpY2FsX2NodW5rZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoIEludmFsaWRDbGF1c2UsIG5hbWUsIHZhbHVlICk7CisgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBFbXB0eUNsYXVzZSwgbmFtZSApOworICAgICAgICAgICAgfSB3aGlsZSAoICh2YWx1ZSA9IHNlbWljb2xvbiA/IHNlbWljb2xvbiArIDEgOiBOVUxMKSApOworICAgICAgICB9CisgICAgfTsgLy8gaWYKKworfSAvLyBfX2ttcF9zdGdfcGFyc2VfX3NjaGVkdWxlCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfc2NoZWR1bGUoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBpZiggX19rbXBfZW52X2Zvcm1hdCApIHsKKyAgICAgICAgS01QX1NUUl9CVUZfUFJJTlRfTkFNRV9FWChuYW1lKTsKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIgICAlcz0nIiwgbmFtZSApOworICAgIH0KKyAgICBpZiAoIF9fa21wX3N0YXRpYyA9PSBrbXBfc2NoX3N0YXRpY19ncmVlZHkgKSB7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzIiwgInN0YXRpYyxncmVlZHkiKTsKKyAgICB9IGVsc2UgaWYgKCBfX2ttcF9zdGF0aWMgPT0ga21wX3NjaF9zdGF0aWNfYmFsYW5jZWQgKSB7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQgKCBidWZmZXIsICIlcyIsICJzdGF0aWMsYmFsYW5jZWQiKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9ndWlkZWQgPT0ga21wX3NjaF9ndWlkZWRfaXRlcmF0aXZlX2NodW5rZWQgKSB7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIjslcydcbiIsICJndWlkZWQsaXRlcmF0aXZlIik7CisgICAgfSBlbHNlIGlmICggX19rbXBfZ3VpZGVkID09IGttcF9zY2hfZ3VpZGVkX2FuYWx5dGljYWxfY2h1bmtlZCApIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiOyVzJ1xuIiwgImd1aWRlZCxhbmFseXRpY2FsIik7CisgICAgfQorfSAvLyBfX2ttcF9zdGdfcHJpbnRfc2NoZWR1bGUKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gT01QX1NDSEVEVUxFCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2Vfb21wX3NjaGVkdWxlKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApCit7CisgICAgc2l6ZV90ICAgICAgbGVuZ3RoOworICAgIGlmKCB2YWx1ZSApIHsKKyAgICAgICAgbGVuZ3RoID0gc3RybGVuKCB2YWx1ZSApOworICAgICAgICBpZiggbGVuZ3RoICkgeworICAgICAgICAgICAgY2hhciAqY29tbWEgPSAoY2hhciAqKSBzdHJjaHIoIHZhbHVlLCAnLCcgKTsKKyAgICAgICAgICAgIGlmKCB2YWx1ZVsgbGVuZ3RoIC0gMSBdID09ICciJyB8fCB2YWx1ZVsgbGVuZ3RoIC0xIF0gPT0gJ1wnJykKKyAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggVW5iYWxhbmNlZFF1b3RlcywgbmFtZSApOworICAgICAgICAgICAgLyogZ2V0IHRoZSBzcGVjaWZpZWQgc2NoZWR1bGluZyBzdHlsZSAqLworICAgICAgICAgICAgaWYgKCFfX2ttcF9zdHJjYXNlY21wX3dpdGhfc2VudGluZWwoImR5bmFtaWMiLCB2YWx1ZSwgJywnKSkgICAgICAgICAgLyogRFlOQU1JQyAqLworICAgICAgICAgICAgICAgIF9fa21wX3NjaGVkID0ga21wX3NjaF9keW5hbWljX2NodW5rZWQ7CisgICAgICAgICAgICBlbHNlIGlmICghX19rbXBfc3RyY2FzZWNtcF93aXRoX3NlbnRpbmVsKCJndWlkZWQiLCB2YWx1ZSwgJywnKSkgICAgICAvKiBHVUlERUQgKi8KKyAgICAgICAgICAgICAgICBfX2ttcF9zY2hlZCA9IGttcF9zY2hfZ3VpZGVkX2NodW5rZWQ7CisvLyBBQzogVE9ETzogYWRkIEFVVE8gc2NoZWR1bGUsIGFuZCBwcHJvYmFibHkgcmVtb3ZlIFRSQVBFWk9JREFMIChPTVAgMy4wIGRvZXMgbm90IGFsbG93IGl0KQorICAgICAgICAgICAgZWxzZSBpZiAoIV9fa21wX3N0cmNhc2VjbXBfd2l0aF9zZW50aW5lbCgiYXV0byIsIHZhbHVlLCAnLCcpKSB7ICAgICAgIC8qIEFVVE8gKi8KKyAgICAgICAgICAgICAgICBfX2ttcF9zY2hlZCA9IGttcF9zY2hfYXV0bzsKKyAgICAgICAgICAgICAgICBpZiggY29tbWEgKSB7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZygga21wX21zX3dhcm5pbmcsIEtNUF9NU0coIElnbm9yZUNodW5rLCBuYW1lLCBjb21tYSApLCBfX2ttcF9tc2dfbnVsbCApOworICAgICAgICAgICAgICAgICAgICBjb21tYSA9IE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIV9fa21wX3N0cmNhc2VjbXBfd2l0aF9zZW50aW5lbCgidHJhcGV6b2lkYWwiLCB2YWx1ZSwgJywnKSkgLyogVFJBUEVaT0lEQUwgKi8KKyAgICAgICAgICAgICAgICBfX2ttcF9zY2hlZCA9IGttcF9zY2hfdHJhcGV6b2lkYWw7CisgICAgICAgICAgICBlbHNlIGlmICghX19rbXBfc3RyY2FzZWNtcF93aXRoX3NlbnRpbmVsKCJzdGF0aWMiLCB2YWx1ZSwgJywnKSkgICAgICAvKiBTVEFUSUMgKi8KKyAgICAgICAgICAgICAgICBfX2ttcF9zY2hlZCA9IGttcF9zY2hfc3RhdGljOworI2lmZGVmIEtNUF9TVEFUSUNfU1RFQUxfRU5BQkxFRAorICAgICAgICAgICAgZWxzZSBpZiAoS01QX0FSQ0hfWDg2XzY0ICYmCisgICAgICAgICAgICAgICAgICAgICAhX19rbXBfc3RyY2FzZWNtcF93aXRoX3NlbnRpbmVsKCJzdGF0aWNfc3RlYWwiLCB2YWx1ZSwgJywnKSkKKyAgICAgICAgICAgICAgICBfX2ttcF9zY2hlZCA9IGttcF9zY2hfc3RhdGljX3N0ZWFsOworI2VuZGlmCisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggU3RnSW52YWxpZFZhbHVlLCBuYW1lLCB2YWx1ZSApOworICAgICAgICAgICAgICAgIHZhbHVlID0gTlVMTDsgLyogc2tpcCBwcm9jZXNzaW5nIG9mIGNvbW1hICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiggdmFsdWUgJiYgY29tbWEgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfZW52X2NodW5rID0gVFJVRTsKKworICAgICAgICAgICAgICAgIGlmKF9fa21wX3NjaGVkID09IGttcF9zY2hfc3RhdGljKQorICAgICAgICAgICAgICAgICAgICBfX2ttcF9zY2hlZCA9IGttcF9zY2hfc3RhdGljX2NodW5rZWQ7CisgICAgICAgICAgICAgICAgKytjb21tYTsKKyAgICAgICAgICAgICAgICBfX2ttcF9jaHVuayA9IF9fa21wX3N0cl90b19pbnQoIGNvbW1hLCAwICk7CisgICAgICAgICAgICAgICAgaWYgKCBfX2ttcF9jaHVuayA8IDEgKSB7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX2NodW5rID0gS01QX0RFRkFVTFRfQ0hVTks7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZygga21wX21zX3dhcm5pbmcsIEtNUF9NU0coIEludmFsaWRDaHVuaywgbmFtZSwgY29tbWEgKSwgX19rbXBfbXNnX251bGwgKTsKKyAgICAgICAgICAgICAgICAgICAgS01QX0lORk9STSggVXNpbmdfaW50X1ZhbHVlLCBuYW1lLCBfX2ttcF9jaHVuayApOworLy8gQUM6IG5leHQgYmxvY2sgY29tbWVudGVkIG91dCB1bnRpbCBLTVBfREVGQVVMVF9DSFVOSyAhPSBLTVBfTUlOX0NIVU5LICh0byBpbXByb3ZlIGNvZGUgY292ZXJhZ2UgOikKKy8vICAgICBUaGUgZGVmYXVsdCBjaHVuayBzaXplIGlzIDEgYWNjb3JkaW5nIHRvIHN0YW5kYXJkLCB0aHVzIG1ha2luZyBLTVBfTUlOX0NIVU5LIG5vdCAxIHdlIHdvdWxkIGludHJvZHVjZSBtZXNzOgorLy8gICAgIHdyb25nIGNodW5rIGJlY29tZXMgMSwgYnV0IGl0IHdpbGwgYmUgaW1wb3NzaWJsZSB0byBleHBsaWNpdGVseSBzZXQgMSwgYmVjYXVzZSBpdCBiZWNvbWVzIEtNUF9NSU5fQ0hVTksuLi4KKy8vICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIF9fa21wX2NodW5rIDwgS01QX01JTl9DSFVOSyApIHsKKy8vICAgICAgICAgICAgICAgICAgICBfX2ttcF9jaHVuayA9IEtNUF9NSU5fQ0hVTks7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICggX19rbXBfY2h1bmsgPiBLTVBfTUFYX0NIVU5LICkgeworICAgICAgICAgICAgICAgICAgICBfX2ttcF9jaHVuayA9IEtNUF9NQVhfQ0hVTks7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZygga21wX21zX3dhcm5pbmcsIEtNUF9NU0coIExhcmdlQ2h1bmssIG5hbWUsIGNvbW1hICksIF9fa21wX21zZ19udWxsICk7CisgICAgICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oIFVzaW5nX2ludF9WYWx1ZSwgbmFtZSwgX19rbXBfY2h1bmsgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBfX2ttcF9lbnZfY2h1bmsgPSBGQUxTRTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBLTVBfV0FSTklORyggRW1wdHlTdHJpbmcsIG5hbWUgKTsKKyAgICB9CisgICAgS19ESUFHKDEsICgiX19rbXBfc3RhdGljID09ICVkXG4iLCBfX2ttcF9zdGF0aWMpKQorICAgIEtfRElBRygxLCAoIl9fa21wX2d1aWRlZCA9PSAlZFxuIiwgX19rbXBfZ3VpZGVkKSkKKyAgICBLX0RJQUcoMSwgKCJfX2ttcF9zY2hlZCA9PSAlZFxuIiwgX19rbXBfc2NoZWQpKQorICAgIEtfRElBRygxLCAoIl9fa21wX2NodW5rID09ICVkXG4iLCBfX2ttcF9jaHVuaykpCit9IC8vIF9fa21wX3N0Z19wYXJzZV9vbXBfc2NoZWR1bGUKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9vbXBfc2NoZWR1bGUoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBpZiggX19rbXBfZW52X2Zvcm1hdCApIHsKKyAgICAgICAgS01QX1NUUl9CVUZfUFJJTlRfTkFNRV9FWChuYW1lKTsKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIgICAlcz0nIiwgbmFtZSApOworICAgIH0KKyAgICBpZiAoIF9fa21wX2NodW5rICkgeworICAgICAgICBzd2l0Y2ggKCBfX2ttcF9zY2hlZCApIHsKKyAgICAgICAgICAgIGNhc2Uga21wX3NjaF9keW5hbWljX2NodW5rZWQ6CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMsJWQnXG4iLCAiZHluYW1pYyIsIF9fa21wX2NodW5rKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2Uga21wX3NjaF9ndWlkZWRfaXRlcmF0aXZlX2NodW5rZWQ6CisgICAgICAgICAgICBjYXNlIGttcF9zY2hfZ3VpZGVkX2FuYWx5dGljYWxfY2h1bmtlZDoKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcywlZCdcbiIsICJndWlkZWQiLCBfX2ttcF9jaHVuayk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGttcF9zY2hfdHJhcGV6b2lkYWw6CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMsJWQnXG4iLCAidHJhcGV6b2lkYWwiLCBfX2ttcF9jaHVuayk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGttcF9zY2hfc3RhdGljOgorICAgICAgICAgICAgY2FzZSBrbXBfc2NoX3N0YXRpY19jaHVua2VkOgorICAgICAgICAgICAgY2FzZSBrbXBfc2NoX3N0YXRpY19iYWxhbmNlZDoKKyAgICAgICAgICAgIGNhc2Uga21wX3NjaF9zdGF0aWNfZ3JlZWR5OgorICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzLCVkJ1xuIiwgInN0YXRpYyIsIF9fa21wX2NodW5rKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2Uga21wX3NjaF9zdGF0aWNfc3RlYWw6CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMsJWQnXG4iLCAic3RhdGljX3N0ZWFsIiwgX19rbXBfY2h1bmspOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBrbXBfc2NoX2F1dG86CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMsJWQnXG4iLCAiYXV0byIsIF9fa21wX2NodW5rKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHN3aXRjaCAoIF9fa21wX3NjaGVkICkgeworICAgICAgICAgICAgY2FzZSBrbXBfc2NoX2R5bmFtaWNfY2h1bmtlZDoKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcydcbiIsICJkeW5hbWljIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGttcF9zY2hfZ3VpZGVkX2l0ZXJhdGl2ZV9jaHVua2VkOgorICAgICAgICAgICAgY2FzZSBrbXBfc2NoX2d1aWRlZF9hbmFseXRpY2FsX2NodW5rZWQ6CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMnXG4iLCAiZ3VpZGVkIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGttcF9zY2hfdHJhcGV6b2lkYWw6CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMnXG4iLCAidHJhcGV6b2lkYWwiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2Uga21wX3NjaF9zdGF0aWM6CisgICAgICAgICAgICBjYXNlIGttcF9zY2hfc3RhdGljX2NodW5rZWQ6CisgICAgICAgICAgICBjYXNlIGttcF9zY2hfc3RhdGljX2JhbGFuY2VkOgorICAgICAgICAgICAgY2FzZSBrbXBfc2NoX3N0YXRpY19ncmVlZHk6CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMnXG4iLCAic3RhdGljIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGttcF9zY2hfc3RhdGljX3N0ZWFsOgorICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzJ1xuIiwgInN0YXRpY19zdGVhbCIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBrbXBfc2NoX2F1dG86CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMnXG4iLCAiYXV0byIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfSAvLyBfX2ttcF9zdGdfcHJpbnRfb21wX3NjaGVkdWxlCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9BVE9NSUNfTU9ERQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2F0b21pY19tb2RlKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICAvLyBNb2RlczogMCAtLSBkbyBub3QgY2hhbmdlIGRlZmF1bHQ7IDEgLS0gSW50ZWwgcGVyZiBtb2RlLCAyIC0tIEdPTVAgY29tcGF0aWJpbGl0eSBtb2RlLgorICAgIGludCBtb2RlID0gMDsKKyAgICBpbnQgbWF4ICA9IDE7CisgICAgI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorICAgICAgICBtYXggPSAyOworICAgICNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKyAgICBfX2ttcF9zdGdfcGFyc2VfaW50KCBuYW1lLCB2YWx1ZSwgMCwgbWF4LCAmIG1vZGUgKTsKKyAgICAvLyBUT0RPOyBwYXJzZV9pbnQgaXMgbm90IHZlcnkgc3VpdGFibGUgZm9yIHRoaXMgY2FzZS4gSW4gY2FzZSBvZiBvdmVyZmxvdyBpdCBpcyBiZXR0ZXIgdG8gdXNlCisgICAgLy8gMCByYXRoZXIgdGhhdCBtYXggdmFsdWUuCisgICAgaWYgKCBtb2RlID4gMCApIHsKKyAgICAgICAgX19rbXBfYXRvbWljX21vZGUgPSBtb2RlOworICAgIH07IC8vIGlmCit9IC8vIF9fa21wX3N0Z19wYXJzZV9hdG9taWNfbW9kZQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2F0b21pY19tb2RlKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X2ludCggYnVmZmVyLCBuYW1lLCBfX2ttcF9hdG9taWNfbW9kZSApOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfYXRvbWljX21vZGUKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfQ09OU0lTVEVOQ1lfQ0hFQ0sKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9jb25zaXN0ZW5jeV9jaGVjayggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgaWYgKCAhIF9fa21wX3N0cmNhc2VjbXBfd2l0aF9zZW50aW5lbCggImFsbCIsIHZhbHVlLCAwICkgKSB7CisgICAgICAgIC8vIE5vdGUsIHRoaXMgd2lsbCBub3Qgd29yayBmcm9tIGttcF9zZXRfZGVmYXVsdHMgYmVjYXVzZSB0aF9jb25zIHN0YWNrIHdhcyBub3QgYWxsb2NhdGVkCisgICAgICAgIC8vIGZvciBleGlzdGVkIHRocmVhZChzKSB0aHVzIHRoZSBmaXJzdCBfX2ttcF9wdXNoXzxjb25zdHJ1Y3Q+IHdpbGwgYnJlYWsgd2l0aCBhc3NlcnRpb24uCisgICAgICAgIC8vIFRPRE86IGFsbG9jYXRlIHRoX2NvbnMgaWYgY2FsbGVkIGZyb20ga21wX3NldF9kZWZhdWx0cy4KKyAgICAgICAgX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrID0gVFJVRTsKKyAgICB9IGVsc2UgaWYgKCAhIF9fa21wX3N0cmNhc2VjbXBfd2l0aF9zZW50aW5lbCggIm5vbmUiLCB2YWx1ZSwgMCApICkgeworICAgICAgICBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgPSBGQUxTRTsKKyAgICB9IGVsc2UgeworICAgICAgICBLTVBfV0FSTklORyggU3RnSW52YWxpZFZhbHVlLCBuYW1lLCB2YWx1ZSApOworICAgIH07IC8vIGlmCit9IC8vIF9fa21wX3N0Z19wYXJzZV9jb25zaXN0ZW5jeV9jaGVjaworCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2NvbnNpc3RlbmN5X2NoZWNrKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisjaWYgS01QX0RFQlVHCisgICAgY29uc3QgY2hhciAqdmFsdWUgPSBOVUxMOworCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIHZhbHVlID0gImFsbCI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdmFsdWUgPSAibm9uZSI7CisgICAgfQorCisgICAgaWYgKCB2YWx1ZSAhPSBOVUxMICkgeworICAgICAgICBfX2ttcF9zdGdfcHJpbnRfc3RyKCBidWZmZXIsIG5hbWUsIHZhbHVlICk7CisgICAgfQorI2VuZGlmIC8qIEtNUF9ERUJVRyAqLworfSAvLyBfX2ttcF9zdGdfcHJpbnRfY29uc2lzdGVuY3lfY2hlY2sKKworCisjaWYgVVNFX0lUVF9CVUlMRAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX0lUVF9QUkVQQVJFX0RFTEFZCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZiBVU0VfSVRUX05PVElGWQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2l0dF9wcmVwYXJlX2RlbGF5KCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApCit7CisgICAgLy8gRXhwZXJpbWVudGFsIGNvZGU6IEtNUF9JVFRfUFJFUEFSRV9ERUxBWSBzcGVjaWZpZXMgbnVtYmVydCBvZiBsb29wIGl0ZXJhdGlvbnMuCisgICAgaW50IGRlbGF5ID0gMDsKKyAgICBfX2ttcF9zdGdfcGFyc2VfaW50KCBuYW1lLCB2YWx1ZSwgMCwgSU5UX01BWCwgJiBkZWxheSApOworICAgIF9fa21wX2l0dF9wcmVwYXJlX2RlbGF5ID0gZGVsYXk7Cit9IC8vIF9fa21wX3N0cl9wYXJzZV9pdHRfcHJlcGFyZV9kZWxheQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2l0dF9wcmVwYXJlX2RlbGF5KCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X3VpbnQ2NCggYnVmZmVyLCBuYW1lLCBfX2ttcF9pdHRfcHJlcGFyZV9kZWxheSApOworCit9IC8vIF9fa21wX3N0cl9wcmludF9pdHRfcHJlcGFyZV9kZWxheQorCisjZW5kaWYgLy8gVVNFX0lUVF9OT1RJRlkKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9NQUxMT0NfUE9PTF9JTkNSCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfbWFsbG9jX3Bvb2xfaW5jciggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3BhcnNlX3NpemUoCisgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgdmFsdWUsCisgICAgICAgICAgICBLTVBfTUlOX01BTExPQ19QT09MX0lOQ1IsCisgICAgICAgICAgICBLTVBfTUFYX01BTExPQ19QT09MX0lOQ1IsCisgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgJiBfX2ttcF9tYWxsb2NfcG9vbF9pbmNyLAorICAgICAgICAgICAgMQorICAgICAgICApOworfSAvLyBfX2ttcF9zdGdfcGFyc2VfbWFsbG9jX3Bvb2xfaW5jcgorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X21hbGxvY19wb29sX2luY3IoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICAgICBfX2ttcF9zdGdfcHJpbnRfc2l6ZSggYnVmZmVyLCBuYW1lLCBfX2ttcF9tYWxsb2NfcG9vbF9pbmNyICk7CisKK30gLy8gX2ttcF9zdGdfcHJpbnRfbWFsbG9jX3Bvb2xfaW5jcgorCisKKyNpZmRlZiBLTVBfREVCVUcKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX1BBUl9SQU5HRQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX3Bhcl9yYW5nZV9lbnYoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgICAgICBfX2ttcF9zdGdfcGFyc2VfcGFyX3JhbmdlKAorICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgIHZhbHVlLAorICAgICAgICAgICAgJiBfX2ttcF9wYXJfcmFuZ2UsCisgICAgICAgICAgICBfX2ttcF9wYXJfcmFuZ2Vfcm91dGluZSwKKyAgICAgICAgICAgIF9fa21wX3Bhcl9yYW5nZV9maWxlbmFtZSwKKyAgICAgICAgICAgICYgX19rbXBfcGFyX3JhbmdlX2xiLAorICAgICAgICAgICAgJiBfX2ttcF9wYXJfcmFuZ2VfdWIKKyAgICAgICAgKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX3Bhcl9yYW5nZV9lbnYKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9wYXJfcmFuZ2VfZW52KCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgaWYgKF9fa21wX3Bhcl9yYW5nZSAhPSAwKSB7CisgICAgICAgIF9fa21wX3N0Z19wcmludF9zdHIoIGJ1ZmZlciwgbmFtZSwgcGFyX3JhbmdlX3RvX3ByaW50ICk7CisgICAgfQorfSAvLyBfX2ttcF9zdGdfcHJpbnRfcGFyX3JhbmdlX2VudgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfWUlFTERfQ1lDTEUsIEtNUF9ZSUVMRF9PTiwgS01QX1lJRUxEX09GRgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX3lpZWxkX2N5Y2xlKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICBpbnQgZmxhZyA9IF9fa21wX3lpZWxkX2N5Y2xlOworICAgIF9fa21wX3N0Z19wYXJzZV9ib29sKCBuYW1lLCB2YWx1ZSwgJiBmbGFnICk7CisgICAgX19rbXBfeWllbGRfY3ljbGUgPSBmbGFnOworfSAvLyBfX2ttcF9zdGdfcGFyc2VfeWllbGRfY3ljbGUKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF95aWVsZF9jeWNsZSgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9ib29sKCBidWZmZXIsIG5hbWUsIF9fa21wX3lpZWxkX2N5Y2xlICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF95aWVsZF9jeWNsZQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX3lpZWxkX29uKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICAgICAgX19rbXBfc3RnX3BhcnNlX2ludCggbmFtZSwgdmFsdWUsIDIsIElOVF9NQVgsICYgX19rbXBfeWllbGRfb25fY291bnQgKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX3lpZWxkX29uCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfeWllbGRfb24oIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcHJpbnRfaW50KCBidWZmZXIsIG5hbWUsIF9fa21wX3lpZWxkX29uX2NvdW50ICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF95aWVsZF9vbgorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX3lpZWxkX29mZiggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgICAgIF9fa21wX3N0Z19wYXJzZV9pbnQoIG5hbWUsIHZhbHVlLCAyLCBJTlRfTUFYLCAmIF9fa21wX3lpZWxkX29mZl9jb3VudCApOworfSAvLyBfX2ttcF9zdGdfcGFyc2VfeWllbGRfb2ZmCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfeWllbGRfb2ZmKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X2ludCggYnVmZmVyLCBuYW1lLCBfX2ttcF95aWVsZF9vZmZfY291bnQgKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X3lpZWxkX29mZgorCisjZW5kaWYKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX0lOSVRfV0FJVCwgS01QX05FWFRfV0FJVAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2luaXRfd2FpdCggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICBpbnQgd2FpdDsKKyAgIEtNUF9BU1NFUlQoICggX19rbXBfaW5pdF93YWl0ICYgMSApID09IDAgKTsKKyAgIHdhaXQgPSBfX2ttcF9pbml0X3dhaXQgLyAyOworICAgIF9fa21wX3N0Z19wYXJzZV9pbnQoIG5hbWUsIHZhbHVlLCBLTVBfTUlOX0lOSVRfV0FJVCwgS01QX01BWF9JTklUX1dBSVQsICYgd2FpdCApOworICAgIF9fa21wX2luaXRfd2FpdCA9IHdhaXQgKiAyOworICAgIEtNUF9BU1NFUlQoICggX19rbXBfaW5pdF93YWl0ICYgMSApID09IDAgKTsKKyAgICBfX2ttcF95aWVsZF9pbml0ID0gX19rbXBfaW5pdF93YWl0OworfSAvLyBfX2ttcF9zdGdfcGFyc2VfaW5pdF93YWl0CisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfaW5pdF93YWl0KCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X2ludCggYnVmZmVyLCBuYW1lLCBfX2ttcF9pbml0X3dhaXQgKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X2luaXRfd2FpdAorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX25leHRfd2FpdCggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgaW50IHdhaXQ7CisgICAgS01QX0FTU0VSVCggKCBfX2ttcF9uZXh0X3dhaXQgJiAxICkgPT0gMCApOworICAgIHdhaXQgPSBfX2ttcF9uZXh0X3dhaXQgLyAyOworICAgIF9fa21wX3N0Z19wYXJzZV9pbnQoIG5hbWUsIHZhbHVlLCBLTVBfTUlOX05FWFRfV0FJVCwgS01QX01BWF9ORVhUX1dBSVQsICYgd2FpdCApOworICAgIF9fa21wX25leHRfd2FpdCA9IHdhaXQgKiAyOworICAgIEtNUF9BU1NFUlQoICggX19rbXBfbmV4dF93YWl0ICYgMSApID09IDAgKTsKKyAgICBfX2ttcF95aWVsZF9uZXh0ID0gX19rbXBfbmV4dF93YWl0OworfSAvLyBfX2ttcF9zdGdfcGFyc2VfbmV4dF93YWl0CisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfbmV4dF93YWl0KCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X2ludCggYnVmZmVyLCBuYW1lLCBfX2ttcF9uZXh0X3dhaXQgKTsKK30gLy9fX2ttcF9zdGdfcHJpbnRfbmV4dF93YWl0CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX0dUSURfTU9ERQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2d0aWRfbW9kZSggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgLy8KKyAgICAvLyBNb2RlczoKKyAgICAvLyAgIDAgLS0gZG8gbm90IGNoYW5nZSBkZWZhdWx0CisgICAgLy8gICAxIC0tIHNwIHNlYXJjaAorICAgIC8vICAgMiAtLSB1c2UgImtleWVkIiBUTFMgdmFyLCBpLmUuCisgICAgLy8gICAgICAgIHB0aHJlYWRfZ2V0c3BlY2lmaWMoTGludXgqIE9TL09TIFgqKSBvciBUbHNHZXRWYWx1ZShXaW5kb3dzKiBPUykKKyAgICAvLyAgIDMgLS0gX19kZWNsc3BlYyh0aHJlYWQpIFRMUyB2YXIgaW4gdGRhdGEgc2VjdGlvbgorICAgIC8vCisgICAgaW50IG1vZGUgPSAwOworICAgIGludCBtYXggID0gMjsKKyAgICAjaWZkZWYgS01QX1REQVRBX0dUSUQKKyAgICAgICAgbWF4ID0gMzsKKyAgICAjZW5kaWYgLyogS01QX1REQVRBX0dUSUQgKi8KKyAgICBfX2ttcF9zdGdfcGFyc2VfaW50KCBuYW1lLCB2YWx1ZSwgMCwgbWF4LCAmIG1vZGUgKTsKKyAgICAvLyBUT0RPOyBwYXJzZV9pbnQgaXMgbm90IHZlcnkgc3VpdGFibGUgZm9yIHRoaXMgY2FzZS4gSW4gY2FzZSBvZiBvdmVyZmxvdyBpdCBpcyBiZXR0ZXIgdG8gdXNlCisgICAgLy8gMCByYXRoZXIgdGhhdCBtYXggdmFsdWUuCisgICAgaWYgKCBtb2RlID09IDAgKSB7CisgICAgICAgIF9fa21wX2FkanVzdF9ndGlkX21vZGUgPSBUUlVFOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgX19rbXBfZ3RpZF9tb2RlID0gbW9kZTsKKyAgICAgICAgX19rbXBfYWRqdXN0X2d0aWRfbW9kZSA9IEZBTFNFOworICAgIH07IC8vIGlmCit9IC8vIF9fa21wX3N0cl9wYXJzZV9ndGlkX21vZGUKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9ndGlkX21vZGUoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBpZiAoIF9fa21wX2FkanVzdF9ndGlkX21vZGUgKSB7CisgICAgICAgIF9fa21wX3N0Z19wcmludF9pbnQoIGJ1ZmZlciwgbmFtZSwgMCApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgX19rbXBfc3RnX3ByaW50X2ludCggYnVmZmVyLCBuYW1lLCBfX2ttcF9ndGlkX21vZGUgKTsKKyAgICB9Cit9IC8vIF9fa21wX3N0Z19wcmludF9ndGlkX21vZGUKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfTlVNX0xPQ0tTX0lOX0JMT0NLCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfbG9ja19ibG9jayggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3BhcnNlX2ludCggbmFtZSwgdmFsdWUsIDAsIEtNUF9JTlRfTUFYLCAmIF9fa21wX251bV9sb2Nrc19pbl9ibG9jayApOworfSAvLyBfX2ttcF9zdHJfcGFyc2VfbG9ja19ibG9jaworCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2xvY2tfYmxvY2soIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcHJpbnRfaW50KCBidWZmZXIsIG5hbWUsIF9fa21wX251bV9sb2Nrc19pbl9ibG9jayApOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfbG9ja19ibG9jaworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfTE9DS19LSU5ECisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfbG9ja19raW5kKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICBpZiAoIF9fa21wX2luaXRfdXNlcl9sb2NrcyApIHsKKyAgICAgICAgS01QX1dBUk5JTkcoIEVudkxvY2tXYXJuLCBuYW1lICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIF9fa21wX3N0cl9tYXRjaCggInRhcyIsIDIsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggInRlc3QgYW5kIHNldCIsIDIsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggInRlc3RfYW5kX3NldCIsIDIsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggInRlc3QtYW5kLXNldCIsIDIsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggInRlc3QgYW5kc2V0IiwgMiwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAidGVzdF9hbmRzZXQiLCAyLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJ0ZXN0LWFuZHNldCIsIDIsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggInRlc3RhbmQgc2V0IiwgMiwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAidGVzdGFuZF9zZXQiLCAyLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJ0ZXN0YW5kLXNldCIsIDIsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggInRlc3RhbmRzZXQiLCAyLCB2YWx1ZSApICkgeworICAgICAgICBfX2ttcF91c2VyX2xvY2tfa2luZCA9IGxrX3RhczsKKyAgICB9CisjaWYgS01QX09TX0xJTlVYICYmIChLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSkKKyAgICBlbHNlIGlmICggX19rbXBfc3RyX21hdGNoKCAiZnV0ZXgiLCAxLCB2YWx1ZSApICkgeworICAgICAgICBpZiAoIF9fa21wX2Z1dGV4X2RldGVybWluZV9jYXBhYmxlKCkgKSB7CisgICAgICAgICAgICBfX2ttcF91c2VyX2xvY2tfa2luZCA9IGxrX2Z1dGV4OworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoIEZ1dGV4Tm90U3VwcG9ydGVkLCBuYW1lLCB2YWx1ZSApOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisgICAgZWxzZSBpZiAoIF9fa21wX3N0cl9tYXRjaCggInRpY2tldCIsIDIsIHZhbHVlICkgKSB7CisgICAgICAgIF9fa21wX3VzZXJfbG9ja19raW5kID0gbGtfdGlja2V0OworICAgIH0KKyAgICBlbHNlIGlmICggX19rbXBfc3RyX21hdGNoKCAicXVldWluZyIsIDEsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggInF1ZXVlIiwgMSwgdmFsdWUgKSApIHsKKyAgICAgICAgX19rbXBfdXNlcl9sb2NrX2tpbmQgPSBsa19xdWV1aW5nOworICAgIH0KKyAgICBlbHNlIGlmICggX19rbXBfc3RyX21hdGNoKCAiZHJkcGEgdGlja2V0IiwgMSwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiZHJkcGFfdGlja2V0IiwgMSwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiZHJkcGEtdGlja2V0IiwgMSwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiZHJkcGF0aWNrZXQiLCAxLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJkcmRwYSIsIDEsIHZhbHVlICkgKSB7CisgICAgICAgIF9fa21wX3VzZXJfbG9ja19raW5kID0gbGtfZHJkcGE7CisgICAgfQorI2lmIEtNUF9VU0VfQURBUFRJVkVfTE9DS1MKKyAgICBlbHNlIGlmICggX19rbXBfc3RyX21hdGNoKCAiYWRhcHRpdmUiLCAxLCB2YWx1ZSApICApIHsKKyAgICAgICAgaWYoIF9fa21wX2NwdWluZm8ucnRtICkgeyAvLyA/Pz8gSXMgY3B1aW5mbyBhdmFpbGFibGUgaGVyZT8KKyAgICAgICAgICAgIF9fa21wX3VzZXJfbG9ja19raW5kID0gbGtfYWRhcHRpdmU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBLTVBfV0FSTklORyggQWRhcHRpdmVOb3RTdXBwb3J0ZWQsIG5hbWUsIHZhbHVlICk7CisgICAgICAgICAgICBfX2ttcF91c2VyX2xvY2tfa2luZCA9IGxrX3F1ZXVpbmc7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLy8gS01QX1VTRV9BREFQVElWRV9MT0NLUworICAgIGVsc2UgeworICAgICAgICBLTVBfV0FSTklORyggU3RnSW52YWxpZFZhbHVlLCBuYW1lLCB2YWx1ZSApOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9sb2NrX2tpbmQoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBjb25zdCBjaGFyICp2YWx1ZSA9IE5VTEw7CisKKyAgICBzd2l0Y2ggKCBfX2ttcF91c2VyX2xvY2tfa2luZCApIHsKKyAgICAgICAgY2FzZSBsa19kZWZhdWx0OgorICAgICAgICB2YWx1ZSA9ICJkZWZhdWx0IjsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBsa190YXM6CisgICAgICAgIHZhbHVlID0gInRhcyI7CisgICAgICAgIGJyZWFrOworCisjaWYgS01QX09TX0xJTlVYICYmIChLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0KQorICAgICAgICBjYXNlIGxrX2Z1dGV4OgorICAgICAgICB2YWx1ZSA9ICJmdXRleCI7CisgICAgICAgIGJyZWFrOworI2VuZGlmCisKKyAgICAgICAgY2FzZSBsa190aWNrZXQ6CisgICAgICAgIHZhbHVlID0gInRpY2tldCI7CisgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgbGtfcXVldWluZzoKKyAgICAgICAgdmFsdWUgPSAicXVldWluZyI7CisgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgbGtfZHJkcGE6CisgICAgICAgIHZhbHVlID0gImRyZHBhIjsKKyAgICAgICAgYnJlYWs7CisjaWYgS01QX1VTRV9BREFQVElWRV9MT0NLUworICAgICAgICBjYXNlIGxrX2FkYXB0aXZlOgorICAgICAgICB2YWx1ZSA9ICJhZGFwdGl2ZSI7CisgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgfQorCisgICAgaWYgKCB2YWx1ZSAhPSBOVUxMICkgeworICAgICAgICBfX2ttcF9zdGdfcHJpbnRfc3RyKCBidWZmZXIsIG5hbWUsIHZhbHVlICk7CisgICAgfQorfQorCisjaWYgS01QX1VTRV9BREFQVElWRV9MT0NLUworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfQURBUFRJVkVfTE9DS19QUk9QUywgS01QX1NQRUNVTEFUSVZFX1NUQVRTRklMRQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBQYXJzZSBvdXQgdmFsdWVzIGZvciB0aGUgdHVuYWJsZSBwYXJhbWV0ZXJzIGZyb20gYSBzdHJpbmcgb2YgdGhlIGZvcm0KKy8vIEtNUF9BREFQVElWRV9MT0NLX1BST1BTPW1heF9zb2Z0X3JldHJpZXNbLG1heF9iYWRuZXNzXQorc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9hZGFwdGl2ZV9sb2NrX3Byb3BzKCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSwgdm9pZCAqZGF0YSApCit7CisgICAgaW50IG1heF9yZXRyaWVzID0gMDsKKyAgICBpbnQgbWF4X2JhZG5lc3MgPSAwOworCisgICAgY29uc3QgY2hhciAqbmV4dCA9IHZhbHVlOworICAgIGNvbnN0IGNoYXIgKnNjYW4gPSBuZXh0OworCisgICAgaW50IHRvdGFsID0gMDsgICAgICAgICAgLy8gQ291bnQgZWxlbWVudHMgdGhhdCB3ZXJlIHNldC4gSXQnbGwgYmUgdXNlZCBhcyBhbiBhcnJheSBzaXplCisgICAgaW50IHByZXZfY29tbWEgPSBGQUxTRTsgLy8gRm9yIGNvcnJlY3QgcHJvY2Vzc2luZyBzZXF1ZW50aWFsIGNvbW1hcworICAgIGludCBpOworCisgICAgLy8gU2F2ZSB2YWx1ZXMgaW4gdGhlIHN0cnVjdHVyZSBfX2ttcF9zcGVjdWxhdGl2ZV9iYWNrb2ZmX3BhcmFtcworICAgIC8vIFJ1biBvbmx5IDMgaXRlcmF0aW9ucyBiZWNhdXNlIGl0IGlzIGVub3VnaCB0byByZWFkIHR3byB2YWx1ZXMgb3IgZmluZCBhIHN5bnRheCBlcnJvcgorICAgIGZvciAoIGkgPSAwOyBpIDwgMyA7IGkrKykgeworICAgICAgICBTS0lQX1dTKCBuZXh0ICk7CisKKyAgICAgICAgaWYgKCAqbmV4dCA9PSAnXDAnICkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgLy8gTmV4dCBjaGFyYWN0ZXIgaXMgbm90IGFuIGludGVnZXIgb3Igbm90IGEgY29tbWEgT1IgbnVtYmVyIG9mIHZhbHVlcyA+IDIgPT4gZW5kIG9mIGxpc3QKKyAgICAgICAgaWYgKCAoICggKm5leHQgPCAnMCcgfHwgKm5leHQgPiAnOScgKSAmJiAqbmV4dCAhPScsJyApIHx8IHRvdGFsID4gMiApIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBFbnZTeW50YXhFcnJvciwgbmFtZSwgdmFsdWUgKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAvLyBUaGUgbmV4dCBjaGFyYWN0ZXIgaXMgJywnCisgICAgICAgIGlmICggKm5leHQgPT0gJywnICkgeworICAgICAgICAgICAgLy8gJywnIGlzIHRoZSBmaXNydCBjaGFyYWN0ZXIKKyAgICAgICAgICAgIGlmICggdG90YWwgPT0gMCB8fCBwcmV2X2NvbW1hICkgeworICAgICAgICAgICAgICAgIHRvdGFsKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcmV2X2NvbW1hID0gVFJVRTsKKyAgICAgICAgICAgIG5leHQrKzsgLy9za2lwICcsJworICAgICAgICAgICAgU0tJUF9XUyggbmV4dCApOworICAgICAgICB9CisgICAgICAgIC8vIE5leHQgY2hhcmFjdGVyIGlzIGEgZGlnaXQKKyAgICAgICAgaWYgKCAqbmV4dCA+PSAnMCcgJiYgKm5leHQgPD0gJzknICkgeworICAgICAgICAgICAgaW50IG51bTsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmJ1ZiA9IG5leHQ7CisgICAgICAgICAgICBjaGFyIGNvbnN0ICogbXNnICA9IE5VTEw7CisgICAgICAgICAgICBwcmV2X2NvbW1hID0gRkFMU0U7CisgICAgICAgICAgICBTS0lQX0RJR0lUUyggbmV4dCApOworICAgICAgICAgICAgdG90YWwrKzsKKworICAgICAgICAgICAgY29uc3QgY2hhciAqdG1wID0gbmV4dDsKKyAgICAgICAgICAgIFNLSVBfV1MoIHRtcCApOworICAgICAgICAgICAgaWYgKCAoICpuZXh0ID09ICcgJyB8fCAqbmV4dCA9PSAnXHQnICkgJiYgKCAqdG1wID49ICcwJyAmJiAqdG1wIDw9ICc5JyApICkgeworICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBFbnZTcGFjZXNOb3RBbGxvd2VkLCBuYW1lLCB2YWx1ZSApOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbnVtID0gX19rbXBfc3RyX3RvX2ludCggYnVmLCAqbmV4dCApOworICAgICAgICAgICAgaWYgKCBudW0gPCAxICkgeyAvLyBUaGUgbnVtYmVyIG9mIHJldHJpZXMgc2hvdWxkIGJlID4gMAorICAgICAgICAgICAgICAgIG1zZyA9IEtNUF9JMThOX1NUUiggVmFsdWVUb29TbWFsbCApOworICAgICAgICAgICAgICAgIG51bSA9IDE7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCBudW0gPiBLTVBfSU5UX01BWCApIHsKKyAgICAgICAgICAgICAgICBtc2cgPSBLTVBfSTE4Tl9TVFIoIFZhbHVlVG9vTGFyZ2UgKTsKKyAgICAgICAgICAgICAgICBudW0gPSBLTVBfSU5UX01BWDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggbXNnICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgLy8gTWVzc2FnZSBpcyBub3QgZW1wdHkuIFByaW50IHdhcm5pbmcuCisgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoIFBhcnNlU2l6ZUludFdhcm4sIG5hbWUsIHZhbHVlLCBtc2cgKTsKKyAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKCBVc2luZ19pbnRfVmFsdWUsIG5hbWUsIG51bSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoIHRvdGFsID09IDEgKSB7CisgICAgICAgICAgICAgICAgbWF4X3JldHJpZXMgPSBudW07CisgICAgICAgICAgICB9IGVsc2UgaWYoIHRvdGFsID09IDIgKSB7CisgICAgICAgICAgICAgICAgbWF4X2JhZG5lc3MgPSBudW07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgS01QX0RFQlVHX0FTU0VSVCggdG90YWwgPiAwICk7CisgICAgaWYoIHRvdGFsIDw9IDAgKSB7CisgICAgICAgIEtNUF9XQVJOSU5HKCBFbnZTeW50YXhFcnJvciwgbmFtZSwgdmFsdWUgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiggbWF4X3JldHJpZXMgIT0gMCApIHsKKyAgICAgICAgX19rbXBfYWRhcHRpdmVfYmFja29mZl9wYXJhbXMubWF4X3NvZnRfcmV0cmllcyA9IG1heF9yZXRyaWVzOworICAgIH0KKyAgICBpZiggbWF4X2JhZG5lc3MgIT0gMCApIHsKKyAgICAgICAgX19rbXBfYWRhcHRpdmVfYmFja29mZl9wYXJhbXMubWF4X2JhZG5lc3MgPSBtYXhfYmFkbmVzczsKKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9hZGFwdGl2ZV9sb2NrX3Byb3BzKGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApCit7CisgICAgaWYoIF9fa21wX2Vudl9mb3JtYXQgKSB7CisgICAgICAgIEtNUF9TVFJfQlVGX1BSSU5UX05BTUVfRVgobmFtZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAgJXM9JyIsIG5hbWUgKTsKKyAgICB9CisgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJWQsJWQnXG4iLCBfX2ttcF9hZGFwdGl2ZV9iYWNrb2ZmX3BhcmFtcy5tYXhfc29mdF9yZXRyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2FkYXB0aXZlX2JhY2tvZmZfcGFyYW1zLm1heF9iYWRuZXNzICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9hZGFwdGl2ZV9sb2NrX3Byb3BzCisKKyNpZiBLTVBfREVCVUdfQURBUFRJVkVfTE9DS1MKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9zcGVjdWxhdGl2ZV9zdGF0c2ZpbGUoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wYXJzZV9maWxlKCBuYW1lLCB2YWx1ZSwgIiIsICYgX19rbXBfc3BlY3VsYXRpdmVfc3RhdHNmaWxlICk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9zcGVjdWxhdGl2ZV9zdGF0c2ZpbGUKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9zcGVjdWxhdGl2ZV9zdGF0c2ZpbGUoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBpZiAoIF9fa21wX3N0cl9tYXRjaCggIi0iLCAwLCBfX2ttcF9zcGVjdWxhdGl2ZV9zdGF0c2ZpbGUgKSAgKSB7CisgICAgICAgIF9fa21wX3N0Z19wcmludF9zdHIoIGJ1ZmZlciwgbmFtZSwgInN0ZG91dCIgKTsKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9zdGdfcHJpbnRfc3RyKCBidWZmZXIsIG5hbWUsIF9fa21wX3NwZWN1bGF0aXZlX3N0YXRzZmlsZSApOworICAgIH0KKworfSAvLyBfX2ttcF9zdGdfcHJpbnRfc3BlY3VsYXRpdmVfc3RhdHNmaWxlCisKKyNlbmRpZiAvLyBLTVBfREVCVUdfQURBUFRJVkVfTE9DS1MKKworI2VuZGlmIC8vIEtNUF9VU0VfQURBUFRJVkVfTE9DS1MKKworI2lmIEtNUF9NSUMKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9QTEFDRV9USFJFQURTCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfcGxhY2VfdGhyZWFkcyggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgLy8gVmFsdWUgZXhhbXBsZTogNUN4MlR4MTVPCisgICAgLy8gV2hpY2ggbWVhbnMgInVzZSA1IGNvcmVzIHdpdGggb2Zmc2V0IDE1LCAyIHRocmVhZHMgcGVyIGNvcmUiCisKKyAgICBpbnQgICAgICAgICBudW07CisgICAgaW50ICAgICAgICAgcHJldl9kZWxpbSA9IDA7CisgICAgY29uc3QgY2hhciAqbmV4dCA9IHZhbHVlOworICAgIGNvbnN0IGNoYXIgKnByZXY7CisKKyAgICBTS0lQX1dTKCBuZXh0ICk7CisgICAgaWYgKCAqbmV4dCA9PSAnXDAnICkgeworICAgICAgICByZXR1cm47ICAgLy8gbGVhdmUgZGVmYXVsdCB2YWx1ZXMKKyAgICB9CisKKyAgICAvLyBHZXQgbnVtX2NvcmVzIGZpcnN0CisgICAgaWYgKCAqbmV4dCA+PSAnMCcgJiYgKm5leHQgPD0gJzknICkgeworICAgICAgICBwcmV2ID0gbmV4dDsKKyAgICAgICAgU0tJUF9ESUdJVFMoIG5leHQgKTsKKyAgICAgICAgbnVtID0gX19rbXBfc3RyX3RvX2ludCggcHJldiwgKm5leHQgKTsKKyAgICAgICAgU0tJUF9XUyggbmV4dCApOworICAgICAgICBpZiAoICpuZXh0ID09ICdDJyB8fCAqbmV4dCA9PSAnYycgKSB7CisgICAgICAgICAgICBfX2ttcF9wbGFjZV9udW1fY29yZXMgPSBudW07CisgICAgICAgICAgICBuZXh0Kys7CisgICAgICAgIH0gZWxzZSBpZiAoICpuZXh0ID09ICcsJyB8fCAqbmV4dCA9PSAneCcgKSB7CisgICAgICAgICAgICBfX2ttcF9wbGFjZV9udW1fY29yZXMgPSBudW07CisgICAgICAgICAgICBwcmV2X2RlbGltID0gMTsKKyAgICAgICAgICAgIG5leHQrKzsKKyAgICAgICAgfSBlbHNlIGlmICggKm5leHQgPT0gJ1QnIHx8ICpuZXh0ID09ICd0JyApIHsKKyAgICAgICAgICAgIF9fa21wX3BsYWNlX251bV90aHJlYWRzX3Blcl9jb3JlID0gbnVtOworICAgICAgICAgICAgcmV0dXJuOyAgIC8vIHdlIGlnbm9yZSBvZmZzZXQgdmFsdWUgaW4gY2FzZSBhbGwgY29yZXMgYXJlIHVzZWQKKyAgICAgICAgfSBlbHNlIGlmICggKm5leHQgPT0gJ1wwJyApIHsKKyAgICAgICAgICAgIF9fa21wX3BsYWNlX251bV9jb3JlcyA9IG51bTsKKyAgICAgICAgICAgIHJldHVybjsgICAvLyB0aGUgb25seSB2YWx1ZSBwcm92aWRlZAorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoIEFmZlRoclBsYWNlSW52YWxpZCwgbmFtZSwgdmFsdWUgKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoICpuZXh0ID09ICcsJyB8fCAqbmV4dCA9PSAneCcgKSB7CisgICAgICAgIC8vIEZpcnN0IGNoYXJhY3RlciBpcyBkZWxpbWl0ZXIsIHNraXAgaXQsIGxlYXZlIG51bV9jb3JlcyBkZWZhdWx0IHZhbHVlCisgICAgICAgIHByZXZfZGVsaW0gPSAyOworICAgICAgICBuZXh0Kys7CisgICAgfSBlbHNlIHsKKyAgICAgICAgS01QX1dBUk5JTkcoIEFmZlRoclBsYWNlSW52YWxpZCwgbmFtZSwgdmFsdWUgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBTS0lQX1dTKCBuZXh0ICk7CisgICAgaWYgKCAqbmV4dCA9PSAnXDAnICkgeworICAgICAgICByZXR1cm47ICAgLy8gIiBuICAiIC0gc29tZXRoaW5nIGxpa2UgdGhpcworICAgIH0KKyAgICBpZiAoICggKm5leHQgPT0gJywnIHx8ICpuZXh0ID09ICd4JyApICYmICFwcmV2X2RlbGltICkgeworICAgICAgICBwcmV2X2RlbGltID0gMTsKKyAgICAgICAgbmV4dCsrOyAgIC8vIHNraXAgZGVsaW1pdGVyIGFmdGVyIG51bV9jb3JlIHZhbHVlCisgICAgICAgIFNLSVBfV1MoIG5leHQgKTsKKyAgICB9CisKKyAgICAvLyBHZXQgdGhyZWFkc19wZXJfY29yZSBuZXh0CisgICAgaWYgKCAqbmV4dCA+PSAnMCcgJiYgKm5leHQgPD0gJzknICkgeworICAgICAgICBwcmV2X2RlbGltID0gMDsKKyAgICAgICAgcHJldiA9IG5leHQ7CisgICAgICAgIFNLSVBfRElHSVRTKCBuZXh0ICk7CisgICAgICAgIG51bSA9IF9fa21wX3N0cl90b19pbnQoIHByZXYsICpuZXh0ICk7CisgICAgICAgIFNLSVBfV1MoIG5leHQgKTsKKyAgICAgICAgaWYgKCAqbmV4dCA9PSAnVCcgfHwgKm5leHQgPT0gJ3QnICkgeworICAgICAgICAgICAgX19rbXBfcGxhY2VfbnVtX3RocmVhZHNfcGVyX2NvcmUgPSBudW07CisgICAgICAgICAgICBuZXh0Kys7CisgICAgICAgIH0gZWxzZSBpZiAoICpuZXh0ID09ICcsJyB8fCAqbmV4dCA9PSAneCcgKSB7CisgICAgICAgICAgICBfX2ttcF9wbGFjZV9udW1fdGhyZWFkc19wZXJfY29yZSA9IG51bTsKKyAgICAgICAgICAgIHByZXZfZGVsaW0gPSAxOworICAgICAgICAgICAgbmV4dCsrOworICAgICAgICB9IGVsc2UgaWYgKCAqbmV4dCA9PSAnTycgfHwgKm5leHQgPT0gJ28nICkgeworICAgICAgICAgICAgX19rbXBfcGxhY2VfY29yZV9vZmZzZXQgPSBudW07CisgICAgICAgICAgICByZXR1cm47ICAgLy8gdGhyZWFkc19wZXJfY29yZSByZW1haW5zIGRlZmF1bHQKKyAgICAgICAgfSBlbHNlIGlmICggKm5leHQgPT0gJ1wwJyApIHsKKyAgICAgICAgICAgIF9fa21wX3BsYWNlX251bV90aHJlYWRzX3Blcl9jb3JlID0gbnVtOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoIEFmZlRoclBsYWNlSW52YWxpZCwgbmFtZSwgdmFsdWUgKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoICpuZXh0ID09ICcsJyB8fCAqbmV4dCA9PSAneCcgKSB7CisgICAgICAgIGlmICggcHJldl9kZWxpbSA9PSAyICkgeworICAgICAgICAgICAgcmV0dXJuOyAvLyBubyBzZW5zZSBpbiB0aGUgb25seSBvZmZzZXQgdmFsdWUsIHRodXMgc2tpcCB0aGUgcmVzdAorICAgICAgICB9CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHByZXZfZGVsaW0gPT0gMSApOworICAgICAgICBuZXh0Kys7ICAgICAvLyBubyB2YWx1ZSBmb3IgdGhyZWFkc19wZXJfY29yZSBwcm92aWRlZAorICAgIH0gZWxzZSB7CisgICAgICAgIEtNUF9XQVJOSU5HKCBBZmZUaHJQbGFjZUludmFsaWQsIG5hbWUsIHZhbHVlICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgU0tJUF9XUyggbmV4dCApOworICAgIGlmICggKm5leHQgPT0gJ1wwJyApIHsKKyAgICAgICAgcmV0dXJuOyAgIC8vICIgbkMsbVQgICIgLSBzb21ldGhpbmcgbGlrZSB0aGlzCisgICAgfQorICAgIGlmICggKCAqbmV4dCA9PSAnLCcgfHwgKm5leHQgPT0gJ3gnICkgJiYgIXByZXZfZGVsaW0gKSB7CisgICAgICAgIHByZXZfZGVsaW0gPSAxOworICAgICAgICBuZXh0Kys7ICAgLy8gc2tpcCBkZWxpbWl0ZXIgYWZ0ZXIgdGhyZWFkc19wZXJfY29yZSB2YWx1ZQorICAgICAgICBTS0lQX1dTKCBuZXh0ICk7CisgICAgfQorCisgICAgLy8gR2V0IGNvcmUgb2Zmc2V0IGxhc3QgaWYgYW55LAorICAgIC8vIGRvbid0IGJvdGhlciBjaGVja2luZyBzeW50YXggYWZ0ZXIgYWxsIGRhdGEgb2J0YWluZWQKKyAgICBpZiAoICpuZXh0ID49ICcwJyAmJiAqbmV4dCA8PSAnOScgKSB7CisgICAgICAgIHByZXYgPSBuZXh0OworICAgICAgICBTS0lQX0RJR0lUUyggbmV4dCApOworICAgICAgICBudW0gPSBfX2ttcF9zdHJfdG9faW50KCBwcmV2LCAqbmV4dCApOworICAgICAgICBfX2ttcF9wbGFjZV9jb3JlX29mZnNldCA9IG51bTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfcGxhY2VfdGhyZWFkcygga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIGlmICggX19rbXBfcGxhY2VfbnVtX2NvcmVzICsgX19rbXBfcGxhY2VfbnVtX3RocmVhZHNfcGVyX2NvcmUgKSB7CisgICAgICAgIGttcF9zdHJfYnVmX3QgYnVmOworICAgICAgICBfX2ttcF9zdHJfYnVmX2luaXQoICZidWYgKTsKKyAgICAgICAgaWYoIF9fa21wX2Vudl9mb3JtYXQgKSB7CisgICAgICAgICAgICBLTVBfU1RSX0JVRl9QUklOVF9OQU1FX0VYKG5hbWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAgJXM9JyIsIG5hbWUgKTsKKyAgICAgICAgfQorICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmYnVmLCAiJWRDIiwgX19rbXBfcGxhY2VfbnVtX2NvcmVzICk7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICZidWYsICJ4JWRUIiwgX19rbXBfcGxhY2VfbnVtX3RocmVhZHNfcGVyX2NvcmUgKTsKKyAgICAgICAgaWYgKCBfX2ttcF9wbGFjZV9jb3JlX29mZnNldCApIHsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICZidWYsICIsJWRPIiwgX19rbXBfcGxhY2VfY29yZV9vZmZzZXQgKTsKKyAgICAgICAgfQorICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KGJ1ZmZlciwgIiVzJ1xuIiwgYnVmLnN0ciApOworICAgICAgICBfX2ttcF9zdHJfYnVmX2ZyZWUoJmJ1Zik7CisvKgorICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiAgICVzOiAlcyBcbiIsIG5hbWUsIEtNUF9JMThOX1NUUiggTm90RGVmaW5lZCApICk7CisqLworICAgIH0KK30KKyNlbmRpZgorCisjaWYgVVNFX0lUVF9CVUlMRAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX0ZPUktKT0lOX0ZSQU1FUworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2Zvcmtqb2luX2ZyYW1lcyggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3BhcnNlX2Jvb2woIG5hbWUsIHZhbHVlLCAmIF9fa21wX2Zvcmtqb2luX2ZyYW1lcyApOworfSAvLyBfX2ttcF9zdGdfcGFyc2VfZm9ya2pvaW5fZnJhbWVzCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfZm9ya2pvaW5fZnJhbWVzKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X2Jvb2woIGJ1ZmZlciwgbmFtZSwgX19rbXBfZm9ya2pvaW5fZnJhbWVzICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9mb3Jram9pbl9mcmFtZXMKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX0ZPUktKT0lOX0ZSQU1FU19NT0RFCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfZm9ya2pvaW5fZnJhbWVzX21vZGUoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wYXJzZV9pbnQoIG5hbWUsIHZhbHVlLCAwLCAzLCAmIF9fa21wX2Zvcmtqb2luX2ZyYW1lc19tb2RlICk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9mb3Jram9pbl9mcmFtZXMKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9mb3Jram9pbl9mcmFtZXNfbW9kZSgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9pbnQoIGJ1ZmZlciwgbmFtZSwgX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGUgKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X2Zvcmtqb2luX2ZyYW1lcworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gT01QX0RJU1BMQVlfRU5WCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX29tcF9kaXNwbGF5X2VudiggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKQoreworICAgIGlmICggX19rbXBfc3RyX21hdGNoKCAiVkVSQk9TRSIsIDEsIHZhbHVlICkgKQorICAgIHsKKyAgICAgICAgX19rbXBfZGlzcGxheV9lbnZfdmVyYm9zZSA9IFRSVUU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfc3RnX3BhcnNlX2Jvb2woIG5hbWUsIHZhbHVlLCAmIF9fa21wX2Rpc3BsYXlfZW52ICk7CisgICAgfQorCit9IC8vIF9fa21wX3N0Z19wYXJzZV9vbXBfZGlzcGxheV9lbnYKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9vbXBfZGlzcGxheV9lbnYoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApCit7CisgICAgaWYgKCBfX2ttcF9kaXNwbGF5X2Vudl92ZXJib3NlICkKKyAgICB7CisgICAgICAgIF9fa21wX3N0Z19wcmludF9zdHIoIGJ1ZmZlciwgbmFtZSwgIlZFUkJPU0UiICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfc3RnX3ByaW50X2Jvb2woIGJ1ZmZlciwgbmFtZSwgX19rbXBfZGlzcGxheV9lbnYgKTsKKyAgICB9Cit9IC8vIF9fa21wX3N0Z19wcmludF9vbXBfZGlzcGxheV9lbnYKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9vbXBfY2FuY2VsbGF0aW9uKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICBpZiAoIFRDUl80KF9fa21wX2luaXRfcGFyYWxsZWwpICkgeworICAgICAgICBLTVBfV0FSTklORyggRW52UGFyYWxsZWxXYXJuLCBuYW1lICk7CisgICAgICAgIHJldHVybjsKKyAgICB9ICAgLy8gcmVhZCB2YWx1ZSBiZWZvcmUgZmlyc3QgcGFyYWxsZWwgb25seQorICAgIF9fa21wX3N0Z19wYXJzZV9ib29sKCBuYW1lLCB2YWx1ZSwgJiBfX2ttcF9vbXBfY2FuY2VsbGF0aW9uICk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9vbXBfY2FuY2VsbGF0aW9uCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfb21wX2NhbmNlbGxhdGlvbigga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9ib29sKCBidWZmZXIsIG5hbWUsIF9fa21wX29tcF9jYW5jZWxsYXRpb24gKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X29tcF9jYW5jZWxsYXRpb24KKworI2VuZGlmCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRhYmxlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK3N0YXRpYyBrbXBfc2V0dGluZ190IF9fa21wX3N0Z190YWJsZVtdID0geworCisgICAgeyAiS01QX0FMTF9USFJFQURTIiwgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2FsbF90aHJlYWRzLCAgICAgICAgX19rbXBfc3RnX3ByaW50X2FsbF90aHJlYWRzLCAgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9CTE9DS1RJTUUiLCAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9ibG9ja3RpbWUsICAgICAgICAgIF9fa21wX3N0Z19wcmludF9ibG9ja3RpbWUsICAgICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfRFVQTElDQVRFX0xJQl9PSyIsICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfZHVwbGljYXRlX2xpYl9vaywgICBfX2ttcF9zdGdfcHJpbnRfZHVwbGljYXRlX2xpYl9vaywgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX0xJQlJBUlkiLCAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX3dhaXRfcG9saWN5LCAgICAgICAgX19rbXBfc3RnX3ByaW50X3dhaXRfcG9saWN5LCAgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9NQVhfVEhSRUFEUyIsICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9hbGxfdGhyZWFkcywgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsIDAgfSwgLy8gRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKKyAgICB7ICJLTVBfTU9OSVRPUl9TVEFDS1NJWkUiLCAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfbW9uaXRvcl9zdGFja3NpemUsICBfX2ttcF9zdGdfcHJpbnRfbW9uaXRvcl9zdGFja3NpemUsICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX1NFVFRJTkdTIiwgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX3NldHRpbmdzLCAgICAgICAgICAgX19rbXBfc3RnX3ByaW50X3NldHRpbmdzLCAgICAgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9TVEFDS09GRlNFVCIsICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9zdGFja29mZnNldCwgICAgICAgIF9fa21wX3N0Z19wcmludF9zdGFja29mZnNldCwgICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfU1RBQ0tTSVpFIiwgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2Vfc3RhY2tzaXplLCAgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfc3RhY2tzaXplLCAgICAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX1NUQUNLUEFEIiwgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX3N0YWNrcGFkLCAgICAgICAgICAgX19rbXBfc3RnX3ByaW50X3N0YWNrcGFkLCAgICAgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9WRVJTSU9OIiwgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV92ZXJzaW9uLCAgICAgICAgICAgIF9fa21wX3N0Z19wcmludF92ZXJzaW9uLCAgICAgICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfV0FSTklOR1MiLCAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2Vfd2FybmluZ3MsICAgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfd2FybmluZ3MsICAgICAgICAgICBOVUxMLCAwLCAwIH0sCisKKyAgICB7ICJPTVBfTkVTVEVEIiwgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfbmVzdGVkLCAgICAgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfbmVzdGVkLCAgICAgICAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiT01QX05VTV9USFJFQURTIiwgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX251bV90aHJlYWRzLCAgICAgICAgX19rbXBfc3RnX3ByaW50X251bV90aHJlYWRzLCAgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIk9NUF9TVEFDS1NJWkUiLCAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9zdGFja3NpemUsICAgICAgICAgIF9fa21wX3N0Z19wcmludF9zdGFja3NpemUsICAgICAgICAgIE5VTEwsIDAsIDAgfSwKKworICAgIHsgIktNUF9UQVNLSU5HIiwgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV90YXNraW5nLCAgICAgICAgICAgIF9fa21wX3N0Z19wcmludF90YXNraW5nLCAgICAgICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfVEFTS19TVEVBTElOR19DT05TVFJBSU5UIiwgICAgICBfX2ttcF9zdGdfcGFyc2VfdGFza19zdGVhbGluZywgICAgICBfX2ttcF9zdGdfcHJpbnRfdGFza19zdGVhbGluZywgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiT01QX01BWF9BQ1RJVkVfTEVWRUxTIiwgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX21heF9hY3RpdmVfbGV2ZWxzLCAgX19rbXBfc3RnX3ByaW50X21heF9hY3RpdmVfbGV2ZWxzLCAgTlVMTCwgMCwgMCB9LAorICAgIHsgIk9NUF9USFJFQURfTElNSVQiLCAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9hbGxfdGhyZWFkcywgICAgICAgIF9fa21wX3N0Z19wcmludF9hbGxfdGhyZWFkcywgICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJPTVBfV0FJVF9QT0xJQ1kiLCAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2Vfd2FpdF9wb2xpY3ksICAgICAgICBfX2ttcF9zdGdfcHJpbnRfd2FpdF9wb2xpY3ksICAgICAgICBOVUxMLCAwLCAwIH0sCisjaWYgS01QX05FU1RFRF9IT1RfVEVBTVMKKyAgICB7ICJLTVBfSE9UX1RFQU1TX01BWF9MRVZFTCIsICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfaG90X3RlYW1zX2xldmVsLCAgICBfX2ttcF9zdGdfcHJpbnRfaG90X3RlYW1zX2xldmVsLCAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX0hPVF9URUFNU19NT0RFIiwgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2hvdF90ZWFtc19tb2RlLCAgICAgX19rbXBfc3RnX3ByaW50X2hvdF90ZWFtc19tb2RlLCAgICAgTlVMTCwgMCwgMCB9LAorI2VuZGlmIC8vIEtNUF9ORVNURURfSE9UX1RFQU1TCisKKyNpZiBLTVBfSEFORExFX1NJR05BTFMKKyAgICB7ICJLTVBfSEFORExFX1NJR05BTFMiLCAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfaGFuZGxlX3NpZ25hbHMsICAgICBfX2ttcF9zdGdfcHJpbnRfaGFuZGxlX3NpZ25hbHMsICAgICBOVUxMLCAwLCAwIH0sCisjZW5kaWYKKworI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKyAgICB7ICJLTVBfSU5IRVJJVF9GUF9DT05UUk9MIiwgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfaW5oZXJpdF9mcF9jb250cm9sLCBfX2ttcF9zdGdfcHJpbnRfaW5oZXJpdF9mcF9jb250cm9sLCBOVUxMLCAwLCAwIH0sCisjZW5kaWYgLyogS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCAqLworCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisgICAgeyAiR09NUF9TVEFDS1NJWkUiLCAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX3N0YWNrc2l6ZSwgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgMCB9LAorI2VuZGlmCisKKyNpZmRlZiBLTVBfREVCVUcKKyAgICB7ICJLTVBfQV9ERUJVRyIsICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfYV9kZWJ1ZywgICAgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfYV9kZWJ1ZywgICAgICAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX0JfREVCVUciLCAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2JfZGVidWcsICAgICAgICAgICAgX19rbXBfc3RnX3ByaW50X2JfZGVidWcsICAgICAgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9DX0RFQlVHIiwgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9jX2RlYnVnLCAgICAgICAgICAgIF9fa21wX3N0Z19wcmludF9jX2RlYnVnLCAgICAgICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfRF9ERUJVRyIsICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfZF9kZWJ1ZywgICAgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfZF9kZWJ1ZywgICAgICAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX0VfREVCVUciLCAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2VfZGVidWcsICAgICAgICAgICAgX19rbXBfc3RnX3ByaW50X2VfZGVidWcsICAgICAgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9GX0RFQlVHIiwgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9mX2RlYnVnLCAgICAgICAgICAgIF9fa21wX3N0Z19wcmludF9mX2RlYnVnLCAgICAgICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfREVCVUciLCAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfZGVidWcsICAgICAgICAgICAgICBOVUxMLCAvKiBubyBwcmludCAqLyAgICAgICAgICAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX0RFQlVHX0JVRiIsICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2RlYnVnX2J1ZiwgICAgICAgICAgX19rbXBfc3RnX3ByaW50X2RlYnVnX2J1ZiwgICAgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9ERUJVR19CVUZfQVRPTUlDIiwgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9kZWJ1Z19idWZfYXRvbWljLCAgIF9fa21wX3N0Z19wcmludF9kZWJ1Z19idWZfYXRvbWljLCAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfREVCVUdfQlVGX0NIQVJTIiwgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfZGVidWdfYnVmX2NoYXJzLCAgICBfX2ttcF9zdGdfcHJpbnRfZGVidWdfYnVmX2NoYXJzLCAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX0RFQlVHX0JVRl9MSU5FUyIsICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2RlYnVnX2J1Zl9saW5lcywgICAgX19rbXBfc3RnX3ByaW50X2RlYnVnX2J1Zl9saW5lcywgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9ESUFHIiwgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9kaWFnLCAgICAgICAgICAgICAgIF9fa21wX3N0Z19wcmludF9kaWFnLCAgICAgICAgICAgICAgIE5VTEwsIDAsIDAgfSwKKworICAgIHsgIktNUF9QQVJfUkFOR0UiLCAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9wYXJfcmFuZ2VfZW52LCAgICAgIF9fa21wX3N0Z19wcmludF9wYXJfcmFuZ2VfZW52LCAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfWUlFTERfQ1lDTEUiLCAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfeWllbGRfY3ljbGUsICAgICAgICBfX2ttcF9zdGdfcHJpbnRfeWllbGRfY3ljbGUsICAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX1lJRUxEX09OIiwgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX3lpZWxkX29uLCAgICAgICAgICAgX19rbXBfc3RnX3ByaW50X3lpZWxkX29uLCAgICAgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9ZSUVMRF9PRkYiLCAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV95aWVsZF9vZmYsICAgICAgICAgIF9fa21wX3N0Z19wcmludF95aWVsZF9vZmYsICAgICAgICAgIE5VTEwsIDAsIDAgfSwKKyNlbmRpZiAvLyBLTVBfREVCVUcKKworICAgIHsgIktNUF9BTElHTl9BTExPQyIsICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9hbGlnbl9hbGxvYywgICAgICAgIF9fa21wX3N0Z19wcmludF9hbGlnbl9hbGxvYywgICAgICAgIE5VTEwsIDAsIDAgfSwKKworICAgIHsgIktNUF9QTEFJTl9CQVJSSUVSIiwgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9iYXJyaWVyX2JyYW5jaF9iaXQsIF9fa21wX3N0Z19wcmludF9iYXJyaWVyX2JyYW5jaF9iaXQsIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfUExBSU5fQkFSUklFUl9QQVRURVJOIiwgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfYmFycmllcl9wYXR0ZXJuLCAgICBfX2ttcF9zdGdfcHJpbnRfYmFycmllcl9wYXR0ZXJuLCAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX0ZPUktKT0lOX0JBUlJJRVIiLCAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2JhcnJpZXJfYnJhbmNoX2JpdCwgX19rbXBfc3RnX3ByaW50X2JhcnJpZXJfYnJhbmNoX2JpdCwgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9GT1JLSk9JTl9CQVJSSUVSX1BBVFRFUk4iLCAgICAgIF9fa21wX3N0Z19wYXJzZV9iYXJyaWVyX3BhdHRlcm4sICAgIF9fa21wX3N0Z19wcmludF9iYXJyaWVyX3BhdHRlcm4sICAgIE5VTEwsIDAsIDAgfSwKKyNpZiBLTVBfRkFTVF9SRURVQ1RJT05fQkFSUklFUgorICAgIHsgIktNUF9SRURVQ1RJT05fQkFSUklFUiIsICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9iYXJyaWVyX2JyYW5jaF9iaXQsIF9fa21wX3N0Z19wcmludF9iYXJyaWVyX2JyYW5jaF9iaXQsIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfUkVEVUNUSU9OX0JBUlJJRVJfUEFUVEVSTiIsICAgICBfX2ttcF9zdGdfcGFyc2VfYmFycmllcl9wYXR0ZXJuLCAgICBfX2ttcF9zdGdfcHJpbnRfYmFycmllcl9wYXR0ZXJuLCAgICBOVUxMLCAwLCAwIH0sCisjZW5kaWYKKworICAgIHsgIktNUF9BQk9SVF9ERUxBWSIsICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9hYm9ydF9kZWxheSwgICAgICAgIF9fa21wX3N0Z19wcmludF9hYm9ydF9kZWxheSwgICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfQ1BVSU5GT19GSUxFIiwgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfY3B1aW5mb19maWxlLCAgICAgICBfX2ttcF9zdGdfcHJpbnRfY3B1aW5mb19maWxlLCAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX0ZPUkNFX1JFRFVDVElPTiIsICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2ZvcmNlX3JlZHVjdGlvbiwgICAgX19rbXBfc3RnX3ByaW50X2ZvcmNlX3JlZHVjdGlvbiwgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9ERVRFUk1JTklTVElDX1JFRFVDVElPTiIsICAgICAgIF9fa21wX3N0Z19wYXJzZV9mb3JjZV9yZWR1Y3Rpb24sICAgIF9fa21wX3N0Z19wcmludF9mb3JjZV9yZWR1Y3Rpb24sICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfU1RPUkFHRV9NQVAiLCAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2Vfc3RvcmFnZV9tYXAsICAgICAgICBfX2ttcF9zdGdfcHJpbnRfc3RvcmFnZV9tYXAsICAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX0FMTF9USFJFQURQUklWQVRFIiwgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2FsbF90aHJlYWRwcml2YXRlLCAgX19rbXBfc3RnX3ByaW50X2FsbF90aHJlYWRwcml2YXRlLCAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9GT1JFSUdOX1RIUkVBRFNfVEhSRUFEUFJJVkFURSIsIF9fa21wX3N0Z19wYXJzZV9mb3JlaWduX3RocmVhZHNfdGhyZWFkcHJpdmF0ZSwgX19rbXBfc3RnX3ByaW50X2ZvcmVpZ25fdGhyZWFkc190aHJlYWRwcml2YXRlLCAgICAgTlVMTCwgMCwgMCB9LAorCisjaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgIHsgIktNUF9BRkZJTklUWSIsICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9hZmZpbml0eSwgICAgICAgICAgIF9fa21wX3N0Z19wcmludF9hZmZpbml0eSwgICAgICAgICAgIE5VTEwsIDAsIDAgfSwKKyMgaWZkZWYgS01QX0dPTVBfQ09NUEFUCisgICAgeyAiR09NUF9DUFVfQUZGSU5JVFkiLCAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2dvbXBfY3B1X2FmZmluaXR5LCAgTlVMTCwgLyogbm8gcHJpbnQgKi8gICAgICAgICAgICAgICAgTlVMTCwgMCwgMCB9LAorIyBlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKyMgaWYgT01QXzQwX0VOQUJMRUQKKyAgICB7ICJPTVBfUFJPQ19CSU5EIiwgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfcHJvY19iaW5kLCAgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfcHJvY19iaW5kLCAgICAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiT01QX1BMQUNFUyIsICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX3BsYWNlcywgICAgICAgICAgICAgX19rbXBfc3RnX3ByaW50X3BsYWNlcywgICAgICAgICAgICAgTlVMTCwgMCwgMCB9LAorIyBlbHNlCisgICAgeyAiT01QX1BST0NfQklORCIsICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX3Byb2NfYmluZCwgICAgICAgICAgTlVMTCwgLyogbm8gcHJpbnQgKi8gICAgICAgICAgICAgICAgTlVMTCwgMCwgMCB9LAorIyBlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworCisgICAgeyAiS01QX1RPUE9MT0dZX01FVEhPRCIsICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX3RvcG9sb2d5X21ldGhvZCwgICAgX19rbXBfc3RnX3ByaW50X3RvcG9sb2d5X21ldGhvZCwgICAgTlVMTCwgMCwgMCB9LAorCisjZWxzZQorCisgICAgLy8KKyAgICAvLyBLTVBfQUZGSU5JVFkgaXMgbm90IHN1cHBvcnRlZCBvbiBPUyBYKiwgbm9yIGlzIE9NUF9QTEFDRVMuCisgICAgLy8gT01QX1BST0NfQklORCBhbmQgcHJvYy1iaW5kLXZhciBhcmUgc3VwcG9ydGVkLCBob3dldmVyLgorICAgIC8vCisjIGlmIE9NUF80MF9FTkFCTEVECisgICAgeyAiT01QX1BST0NfQklORCIsICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX3Byb2NfYmluZCwgICAgICAgICAgX19rbXBfc3RnX3ByaW50X3Byb2NfYmluZCwgICAgICAgICAgTlVMTCwgMCwgMCB9LAorIyBlbmRpZgorCisjZW5kaWYgLy8gS01QX0FGRklOSVRZX1NVUFBPUlRFRAorCisgICAgeyAiS01QX0lOSVRfQVRfRk9SSyIsICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2luaXRfYXRfZm9yaywgICAgICAgX19rbXBfc3RnX3ByaW50X2luaXRfYXRfZm9yaywgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9TQ0hFRFVMRSIsICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9zY2hlZHVsZSwgICAgICAgICAgIF9fa21wX3N0Z19wcmludF9zY2hlZHVsZSwgICAgICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJPTVBfU0NIRURVTEUiLCAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2Vfb21wX3NjaGVkdWxlLCAgICAgICBfX2ttcF9zdGdfcHJpbnRfb21wX3NjaGVkdWxlLCAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX0FUT01JQ19NT0RFIiwgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2F0b21pY19tb2RlLCAgICAgICAgX19rbXBfc3RnX3ByaW50X2F0b21pY19tb2RlLCAgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9DT05TSVNURU5DWV9DSEVDSyIsICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9jb25zaXN0ZW5jeV9jaGVjaywgIF9fa21wX3N0Z19wcmludF9jb25zaXN0ZW5jeV9jaGVjaywgIE5VTEwsIDAsIDAgfSwKKworI2lmIFVTRV9JVFRfQlVJTEQgJiYgVVNFX0lUVF9OT1RJRlkKKyAgICB7ICJLTVBfSVRUX1BSRVBBUkVfREVMQVkiLCAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfaXR0X3ByZXBhcmVfZGVsYXksICBfX2ttcF9zdGdfcHJpbnRfaXR0X3ByZXBhcmVfZGVsYXksICBOVUxMLCAwLCAwIH0sCisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAmJiBVU0VfSVRUX05PVElGWSAqLworICAgIHsgIktNUF9NQUxMT0NfUE9PTF9JTkNSIiwgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9tYWxsb2NfcG9vbF9pbmNyLCAgIF9fa21wX3N0Z19wcmludF9tYWxsb2NfcG9vbF9pbmNyLCAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfSU5JVF9XQUlUIiwgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfaW5pdF93YWl0LCAgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfaW5pdF93YWl0LCAgICAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX05FWFRfV0FJVCIsICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX25leHRfd2FpdCwgICAgICAgICAgX19rbXBfc3RnX3ByaW50X25leHRfd2FpdCwgICAgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9HVElEX01PREUiLCAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9ndGlkX21vZGUsICAgICAgICAgIF9fa21wX3N0Z19wcmludF9ndGlkX21vZGUsICAgICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJPTVBfRFlOQU1JQyIsICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2Vfb21wX2R5bmFtaWMsICAgICAgICBfX2ttcF9zdGdfcHJpbnRfb21wX2R5bmFtaWMsICAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX0RZTkFNSUNfTU9ERSIsICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2ttcF9keW5hbWljX21vZGUsICAgX19rbXBfc3RnX3ByaW50X2ttcF9keW5hbWljX21vZGUsICAgTlVMTCwgMCwgMCB9LAorCisjaWZkZWYgVVNFX0xPQURfQkFMQU5DRQorICAgIHsgIktNUF9MT0FEX0JBTEFOQ0VfSU5URVJWQUwiLCAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9sZF9iYWxhbmNlX2ludGVydmFsLF9fa21wX3N0Z19wcmludF9sZF9iYWxhbmNlX2ludGVydmFsLE5VTEwsIDAsIDAgfSwKKyNlbmRpZgorCisKKworICAgIHsgIktNUF9OVU1fTE9DS1NfSU5fQkxPQ0siLCAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9sb2NrX2Jsb2NrLCAgICAgICAgIF9fa21wX3N0Z19wcmludF9sb2NrX2Jsb2NrLCAgICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfTE9DS19LSU5EIiwgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfbG9ja19raW5kLCAgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfbG9ja19raW5kLCAgICAgICAgICBOVUxMLCAwLCAwIH0sCisjaWYgS01QX1VTRV9BREFQVElWRV9MT0NLUworICAgIHsgIktNUF9BREFQVElWRV9MT0NLX1BST1BTIiwgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9hZGFwdGl2ZV9sb2NrX3Byb3BzLF9fa21wX3N0Z19wcmludF9hZGFwdGl2ZV9sb2NrX3Byb3BzLCAgTlVMTCwgMCwgMCB9LAorI2lmIEtNUF9ERUJVR19BREFQVElWRV9MT0NLUworICAgIHsgIktNUF9TUEVDVUxBVElWRV9TVEFUU0ZJTEUiLCAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9zcGVjdWxhdGl2ZV9zdGF0c2ZpbGUsX19rbXBfc3RnX3ByaW50X3NwZWN1bGF0aXZlX3N0YXRzZmlsZSwgIE5VTEwsIDAsIDAgfSwKKyNlbmRpZgorI2VuZGlmIC8vIEtNUF9VU0VfQURBUFRJVkVfTE9DS1MKKyNpZiBLTVBfTUlDCisgICAgeyAiS01QX1BMQUNFX1RIUkVBRFMiLCAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX3BsYWNlX3RocmVhZHMsICAgICAgX19rbXBfc3RnX3ByaW50X3BsYWNlX3RocmVhZHMsICAgICAgTlVMTCwgMCwgMCB9LAorI2VuZGlmCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIHsgIktNUF9GT1JLSk9JTl9GUkFNRVMiLCAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9mb3Jram9pbl9mcmFtZXMsICAgIF9fa21wX3N0Z19wcmludF9mb3Jram9pbl9mcmFtZXMsICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfRk9SS0pPSU5fRlJBTUVTX01PREUiLCAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfZm9ya2pvaW5fZnJhbWVzX21vZGUsX19rbXBfc3RnX3ByaW50X2Zvcmtqb2luX2ZyYW1lc19tb2RlLCAgTlVMTCwgMCwgMCB9LAorI2VuZGlmCisKKyMgaWYgT01QXzQwX0VOQUJMRUQKKyAgICB7ICJPTVBfRElTUExBWV9FTlYiLCAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2Vfb21wX2Rpc3BsYXlfZW52LCAgICBfX2ttcF9zdGdfcHJpbnRfb21wX2Rpc3BsYXlfZW52LCAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiT01QX0NBTkNFTExBVElPTiIsICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX29tcF9jYW5jZWxsYXRpb24sICAgX19rbXBfc3RnX3ByaW50X29tcF9jYW5jZWxsYXRpb24sICAgTlVMTCwgMCwgMCB9LAorI2VuZGlmCisgICAgeyAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgMCB9Cit9OyAvLyBzZXR0aW5ncworCitzdGF0aWMgaW50IGNvbnN0IF9fa21wX3N0Z19jb3VudCA9IHNpemVvZiggX19rbXBfc3RnX3RhYmxlICkgLyBzaXplb2YoIGttcF9zZXR0aW5nX3QgKTsKKworc3RhdGljIGlubGluZQora21wX3NldHRpbmdfdCAqCitfX2ttcF9zdGdfZmluZCggY2hhciBjb25zdCAqIG5hbWUgKSB7CisKKyAgICBpbnQgaTsKKyAgICBpZiAoIG5hbWUgIT0gTlVMTCApIHsKKyAgICAgICAgZm9yICggaSA9IDA7IGkgPCBfX2ttcF9zdGdfY291bnQ7ICsrIGkgKSB7CisgICAgICAgICAgICBpZiAoIHN0cmNtcCggX19rbXBfc3RnX3RhYmxlWyBpIF0ubmFtZSwgbmFtZSApID09IDAgKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICYgX19rbXBfc3RnX3RhYmxlWyBpIF07CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICB9OyAvLyBmb3IKKyAgICB9OyAvLyBpZgorICAgIHJldHVybiBOVUxMOworCit9IC8vIF9fa21wX3N0Z19maW5kCisKKworc3RhdGljIGludAorX19rbXBfc3RnX2NtcCggdm9pZCBjb25zdCAqIF9hLCB2b2lkIGNvbnN0ICogX2IgKSB7CisgICAga21wX3NldHRpbmdfdCAqIGEgPSAoa21wX3NldHRpbmdfdCAqKSBfYTsKKyAgICBrbXBfc2V0dGluZ190ICogYiA9IChrbXBfc2V0dGluZ190ICopIF9iOworCisgICAgLy8KKyAgICAvLyBQcm9jZXNzIEtNUF9BRkZJTklUWSBsYXN0LgorICAgIC8vIEl0IG5lZWRzIHRvIGNvbWUgYWZ0ZXIgT01QX1BMQUNFUyBhbmQgR09NUF9DUFVfQUZGSU5JVFkuCisgICAgLy8KKyAgICBpZiAoIHN0cmNtcCggYS0+bmFtZSwgIktNUF9BRkZJTklUWSIgKSA9PSAwICkgeworICAgICAgICBpZiAoIHN0cmNtcCggYi0+bmFtZSwgIktNUF9BRkZJTklUWSIgKSA9PSAwICkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGVsc2UgaWYgKCBzdHJjbXAoIGItPm5hbWUsICJLTVBfQUZGSU5JVFkiICkgPT0gMCApIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gc3RyY21wKCBhLT5uYW1lLCBiLT5uYW1lICk7Cit9IC8vIF9fa21wX3N0Z19jbXAKKworCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX2luaXQoIHZvaWQKKykgeworCisgICAgc3RhdGljIGludCBpbml0aWFsaXplZCA9IDA7CisKKyAgICBpZiAoICEgaW5pdGlhbGl6ZWQgKSB7CisKKyAgICAgICAgLy8gU29ydCB0YWJsZS4KKyAgICAgICAgcXNvcnQoIF9fa21wX3N0Z190YWJsZSwgX19rbXBfc3RnX2NvdW50IC0gMSwgc2l6ZW9mKCBrbXBfc2V0dGluZ190ICksIF9fa21wX3N0Z19jbXAgKTsKKworICAgICAgICB7IC8vIEluaXRpYWxpemUgKl9TVEFDS1NJWkUgZGF0YS4KKworICAgICAgICAgICAga21wX3NldHRpbmdfdCAqIGttcF9zdGFja3NpemUgID0gX19rbXBfc3RnX2ZpbmQoICJLTVBfU1RBQ0tTSVpFIiAgKTsgICAgICAvLyAxc3QgcHJpb3JpdHkuCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisgICAgICAgICAgICBrbXBfc2V0dGluZ190ICogZ29tcF9zdGFja3NpemUgPSBfX2ttcF9zdGdfZmluZCggIkdPTVBfU1RBQ0tTSVpFIiApOyAgICAgIC8vIDJuZCBwcmlvcml0eS4KKyNlbmRpZgorICAgICAgICAgICAga21wX3NldHRpbmdfdCAqIG9tcF9zdGFja3NpemUgID0gX19rbXBfc3RnX2ZpbmQoICJPTVBfU1RBQ0tTSVpFIiAgKTsgICAgICAvLyAzcmQgcHJpb3JpdHkuCisKKyAgICAgICAgICAgIC8vICEhISB2b2xhdGlsZSBrZXl3b3JkIGlzIEludGVsIChSKSBDIENvbXBpbGVyIGJ1ZyBDUTQ5OTA4IHdvcmthcm91bmQuCisgICAgICAgICAgICAvLyAhISEgQ29tcGlsZXIgZG9lcyBub3QgdW5kZXJzdGFuZCByaXZhbHMgaXMgdXNlZCBhbmQgb3B0aW1pemVzIG91dCBhc3NpZ25tZW50cworICAgICAgICAgICAgLy8gISEhICAgICByaXZhbHNbIGkgKysgXSA9IC4uLjsKKyAgICAgICAgICAgIHN0YXRpYyBrbXBfc2V0dGluZ190ICogdm9sYXRpbGUgcml2YWxzWyA0IF07CisgICAgICAgICAgICBzdGF0aWMga21wX3N0Z19zc19kYXRhX3Qga21wX2RhdGEgID0geyAgICAxLCAoa21wX3NldHRpbmdfdCAqKilyaXZhbHMgfTsKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyAgICAgICAgICAgIHN0YXRpYyBrbXBfc3RnX3NzX2RhdGFfdCBnb21wX2RhdGEgPSB7IDEwMjQsIChrbXBfc2V0dGluZ190ICoqKXJpdmFscyB9OworI2VuZGlmCisgICAgICAgICAgICBzdGF0aWMga21wX3N0Z19zc19kYXRhX3Qgb21wX2RhdGEgID0geyAxMDI0LCAoa21wX3NldHRpbmdfdCAqKilyaXZhbHMgfTsKKyAgICAgICAgICAgIGludCBpID0gMDsKKworICAgICAgICAgICAgcml2YWxzWyBpICsrIF0gPSBrbXBfc3RhY2tzaXplOworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorICAgICAgICAgICAgaWYgKCBnb21wX3N0YWNrc2l6ZSAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgIHJpdmFsc1sgaSArKyBdID0gZ29tcF9zdGFja3NpemU7CisgICAgICAgICAgICB9OyAvLyBpZgorI2VuZGlmCisgICAgICAgICAgICByaXZhbHNbIGkgKysgXSA9IG9tcF9zdGFja3NpemU7CisgICAgICAgICAgICByaXZhbHNbIGkgKysgXSA9IE5VTEw7CisKKyAgICAgICAgICAgIGttcF9zdGFja3NpemUtPmRhdGEgPSAmIGttcF9kYXRhOworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorICAgICAgICAgICAgaWYgKCBnb21wX3N0YWNrc2l6ZSAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgIGdvbXBfc3RhY2tzaXplLT5kYXRhID0gJiBnb21wX2RhdGE7CisgICAgICAgICAgICB9OyAvLyBpZgorI2VuZGlmCisgICAgICAgICAgICBvbXBfc3RhY2tzaXplLT5kYXRhID0gJiBvbXBfZGF0YTsKKworICAgICAgICB9CisKKyAgICAgICAgeyAvLyBJbml0aWFsaXplIEtNUF9MSUJSQVJZIGFuZCBPTVBfV0FJVF9QT0xJQ1kgZGF0YS4KKworICAgICAgICAgICAga21wX3NldHRpbmdfdCAqIGttcF9saWJyYXJ5ICAgICA9IF9fa21wX3N0Z19maW5kKCAiS01QX0xJQlJBUlkiICk7ICAgICAgICAvLyAxc3QgcHJpb3JpdHkuCisgICAgICAgICAgICBrbXBfc2V0dGluZ190ICogb21wX3dhaXRfcG9saWN5ID0gX19rbXBfc3RnX2ZpbmQoICJPTVBfV0FJVF9QT0xJQ1kiICk7ICAgIC8vIDJuZCBwcmlvcml0eS4KKworICAgICAgICAgICAgLy8gISEhIHZvbGF0aWxlIGtleXdvcmQgaXMgSW50ZWwgKFIpIEMgQ29tcGlsZXIgYnVnIENRNDk5MDggd29ya2Fyb3VuZC4KKyAgICAgICAgICAgIHN0YXRpYyBrbXBfc2V0dGluZ190ICogdm9sYXRpbGUgcml2YWxzWyAzIF07CisgICAgICAgICAgICBzdGF0aWMga21wX3N0Z193cF9kYXRhX3Qga21wX2RhdGEgID0geyAwLCAoa21wX3NldHRpbmdfdCAqKilyaXZhbHMgfTsKKyAgICAgICAgICAgIHN0YXRpYyBrbXBfc3RnX3dwX2RhdGFfdCBvbXBfZGF0YSAgPSB7IDEsIChrbXBfc2V0dGluZ190ICoqKXJpdmFscyB9OworICAgICAgICAgICAgaW50IGkgPSAwOworCisgICAgICAgICAgICByaXZhbHNbIGkgKysgXSA9IGttcF9saWJyYXJ5OworICAgICAgICAgICAgaWYgKCBvbXBfd2FpdF9wb2xpY3kgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICByaXZhbHNbIGkgKysgXSA9IG9tcF93YWl0X3BvbGljeTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICByaXZhbHNbIGkgKysgXSA9IE5VTEw7CisKKyAgICAgICAgICAgIGttcF9saWJyYXJ5LT5kYXRhICA9ICYga21wX2RhdGE7CisgICAgICAgICAgICBpZiAoIG9tcF93YWl0X3BvbGljeSAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgIG9tcF93YWl0X3BvbGljeS0+ZGF0YSA9ICYgb21wX2RhdGE7CisgICAgICAgICAgICB9OyAvLyBpZgorCisgICAgICAgIH0KKworICAgICAgICB7IC8vIEluaXRpYWxpemUgS01QX0FMTF9USFJFQURTLCBLTVBfTUFYX1RIUkVBRFMsIGFuZCBPTVBfVEhSRUFEX0xJTUlUIGRhdGEuCisKKyAgICAgICAgICAgIGttcF9zZXR0aW5nX3QgKiBrbXBfYWxsX3RocmVhZHMgID0gX19rbXBfc3RnX2ZpbmQoICJLTVBfQUxMX1RIUkVBRFMiICApOyAgLy8gMXN0IHByaW9yaXR5LgorICAgICAgICAgICAga21wX3NldHRpbmdfdCAqIGttcF9tYXhfdGhyZWFkcyAgPSBfX2ttcF9zdGdfZmluZCggIktNUF9NQVhfVEhSRUFEUyIgICk7ICAvLyAybmQgcHJpb3JpdHkuCisgICAgICAgICAgICBrbXBfc2V0dGluZ190ICogb21wX3RocmVhZF9saW1pdCA9IF9fa21wX3N0Z19maW5kKCAiT01QX1RIUkVBRF9MSU1JVCIgKTsgIC8vIDNyZCBwcmlvcml0eS4KKworICAgICAgICAgICAgLy8gISEhIHZvbGF0aWxlIGtleXdvcmQgaXMgSW50ZWwgKFIpIEMgQ29tcGlsZXIgYnVnIENRNDk5MDggd29ya2Fyb3VuZC4KKyAgICAgICAgICAgIHN0YXRpYyBrbXBfc2V0dGluZ190ICogdm9sYXRpbGUgcml2YWxzWyA0IF07CisgICAgICAgICAgICBpbnQgaSA9IDA7CisKKyAgICAgICAgICAgIHJpdmFsc1sgaSArKyBdID0ga21wX2FsbF90aHJlYWRzOworICAgICAgICAgICAgcml2YWxzWyBpICsrIF0gPSBrbXBfbWF4X3RocmVhZHM7CisgICAgICAgICAgICBpZiAoIG9tcF90aHJlYWRfbGltaXQgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICByaXZhbHNbIGkgKysgXSA9IG9tcF90aHJlYWRfbGltaXQ7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgcml2YWxzWyBpICsrIF0gPSBOVUxMOworCisgICAgICAgICAgICBrbXBfYWxsX3RocmVhZHMtPmRhdGEgPSAodm9pZCopJiByaXZhbHM7CisgICAgICAgICAgICBrbXBfbWF4X3RocmVhZHMtPmRhdGEgPSAodm9pZCopJiByaXZhbHM7CisgICAgICAgICAgICBpZiAoIG9tcF90aHJlYWRfbGltaXQgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICBvbXBfdGhyZWFkX2xpbWl0LT5kYXRhID0gKHZvaWQqKSYgcml2YWxzOworICAgICAgICAgICAgfTsgLy8gaWYKKworICAgICAgICB9CisKKyNpZiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgICAgIHsgLy8gSW5pdGlhbGl6ZSBLTVBfQUZGSU5JVFksIEdPTVBfQ1BVX0FGRklOSVRZLCBhbmQgT01QX1BST0NfQklORCBkYXRhLgorCisgICAgICAgICAgICBrbXBfc2V0dGluZ190ICoga21wX2FmZmluaXR5ID0gX19rbXBfc3RnX2ZpbmQoICJLTVBfQUZGSU5JVFkiICApOyAgLy8gMXN0IHByaW9yaXR5LgorICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCgga21wX2FmZmluaXR5ICE9IE5VTEwgKTsKKworIyBpZmRlZiBLTVBfR09NUF9DT01QQVQKKyAgICAgICAgICAgIGttcF9zZXR0aW5nX3QgKiBnb21wX2NwdV9hZmZpbml0eSA9IF9fa21wX3N0Z19maW5kKCAiR09NUF9DUFVfQUZGSU5JVFkiICApOyAgLy8gMm5kIHByaW9yaXR5LgorICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggZ29tcF9jcHVfYWZmaW5pdHkgIT0gTlVMTCApOworIyBlbmRpZgorCisgICAgICAgICAgICBrbXBfc2V0dGluZ190ICogb21wX3Byb2NfYmluZCA9IF9fa21wX3N0Z19maW5kKCAiT01QX1BST0NfQklORCIgKTsgIC8vIDNyZCBwcmlvcml0eS4KKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIG9tcF9wcm9jX2JpbmQgIT0gTlVMTCApOworCisgICAgICAgICAgICAvLyAhISEgdm9sYXRpbGUga2V5d29yZCBpcyBJbnRlbCAoUikgQyBDb21waWxlciBidWcgQ1E0OTkwOCB3b3JrYXJvdW5kLgorICAgICAgICAgICAgc3RhdGljIGttcF9zZXR0aW5nX3QgKiB2b2xhdGlsZSByaXZhbHNbIDQgXTsKKyAgICAgICAgICAgIGludCBpID0gMDsKKworICAgICAgICAgICAgcml2YWxzWyBpICsrIF0gPSBrbXBfYWZmaW5pdHk7CisKKyMgaWZkZWYgS01QX0dPTVBfQ09NUEFUCisgICAgICAgICAgICByaXZhbHNbIGkgKysgXSA9IGdvbXBfY3B1X2FmZmluaXR5OworICAgICAgICAgICAgZ29tcF9jcHVfYWZmaW5pdHktPmRhdGEgPSAodm9pZCopJiByaXZhbHM7CisjIGVuZGlmCisKKyAgICAgICAgICAgIHJpdmFsc1sgaSArKyBdID0gb21wX3Byb2NfYmluZDsKKyAgICAgICAgICAgIG9tcF9wcm9jX2JpbmQtPmRhdGEgPSAodm9pZCopJiByaXZhbHM7CisgICAgICAgICAgICByaXZhbHNbIGkgKysgXSA9IE5VTEw7CisKKyMgaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgICAgIHN0YXRpYyBrbXBfc2V0dGluZ190ICogdm9sYXRpbGUgcGxhY2VzX3JpdmFsc1sgNCBdOworICAgICAgICAgICAgaSA9IDA7CisKKyAgICAgICAgICAgIGttcF9zZXR0aW5nX3QgKiBvbXBfcGxhY2VzID0gX19rbXBfc3RnX2ZpbmQoICJPTVBfUExBQ0VTIiApOyAgLy8gM3JkIHByaW9yaXR5LgorICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggb21wX3BsYWNlcyAhPSBOVUxMICk7CisKKyAgICAgICAgICAgIHBsYWNlc19yaXZhbHNbIGkgKysgXSA9IGttcF9hZmZpbml0eTsKKyMgIGlmZGVmIEtNUF9HT01QX0NPTVBBVAorICAgICAgICAgICAgcGxhY2VzX3JpdmFsc1sgaSArKyBdID0gZ29tcF9jcHVfYWZmaW5pdHk7CisjICBlbmRpZgorICAgICAgICAgICAgcGxhY2VzX3JpdmFsc1sgaSArKyBdID0gb21wX3BsYWNlczsKKyAgICAgICAgICAgIG9tcF9wbGFjZXMtPmRhdGEgPSAodm9pZCopJiBwbGFjZXNfcml2YWxzOworICAgICAgICAgICAgcGxhY2VzX3JpdmFsc1sgaSArKyBdID0gTlVMTDsKKyMgZW5kaWYKKyAgICAgICAgfQorI2Vsc2UKKyAgICAvLyBLTVBfQUZGSU5JVFkgbm90IHN1cHBvcnRlZCwgc28gT01QX1BST0NfQklORCBoYXMgbm8gcml2YWxzLgorICAgIC8vIE9NUF9QTEFDRVMgbm90IHN1cHBvcnRlZCB5ZXQuCisjZW5kaWYgLy8gS01QX0FGRklOSVRZX1NVUFBPUlRFRAorCisgICAgICAgIHsgLy8gSW5pdGlhbGl6ZSBLTVBfREVURVJNSU5JU1RJQ19SRURVQ1RJT04gYW5kIEtNUF9GT1JDRV9SRURVQ1RJT04gZGF0YS4KKworICAgICAgICAgICAga21wX3NldHRpbmdfdCAqIGttcF9mb3JjZV9yZWQgID0gX19rbXBfc3RnX2ZpbmQoICJLTVBfRk9SQ0VfUkVEVUNUSU9OIiApOyAgICAgICAgIC8vIDFzdCBwcmlvcml0eS4KKyAgICAgICAgICAgIGttcF9zZXR0aW5nX3QgKiBrbXBfZGV0ZXJtX3JlZCA9IF9fa21wX3N0Z19maW5kKCAiS01QX0RFVEVSTUlOSVNUSUNfUkVEVUNUSU9OIiApOyAvLyAybmQgcHJpb3JpdHkuCisKKyAgICAgICAgICAgIC8vICEhISB2b2xhdGlsZSBrZXl3b3JkIGlzIEludGVsIChSKSBDIENvbXBpbGVyIGJ1ZyBDUTQ5OTA4IHdvcmthcm91bmQuCisgICAgICAgICAgICBzdGF0aWMga21wX3NldHRpbmdfdCAqIHZvbGF0aWxlIHJpdmFsc1sgMyBdOworICAgICAgICAgICAgc3RhdGljIGttcF9zdGdfZnJfZGF0YV90IGZvcmNlX2RhdGEgICA9IHsgMSwgKGttcF9zZXR0aW5nX3QgKiopcml2YWxzIH07CisgICAgICAgICAgICBzdGF0aWMga21wX3N0Z19mcl9kYXRhX3QgZGV0ZXJtX2RhdGEgID0geyAwLCAoa21wX3NldHRpbmdfdCAqKilyaXZhbHMgfTsKKyAgICAgICAgICAgIGludCBpID0gMDsKKworICAgICAgICAgICAgcml2YWxzWyBpICsrIF0gPSBrbXBfZm9yY2VfcmVkOworICAgICAgICAgICAgaWYgKCBrbXBfZGV0ZXJtX3JlZCAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgIHJpdmFsc1sgaSArKyBdID0ga21wX2RldGVybV9yZWQ7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgcml2YWxzWyBpICsrIF0gPSBOVUxMOworCisgICAgICAgICAgICBrbXBfZm9yY2VfcmVkLT5kYXRhID0gJiBmb3JjZV9kYXRhOworICAgICAgICAgICAgaWYgKCBrbXBfZGV0ZXJtX3JlZCAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgIGttcF9kZXRlcm1fcmVkLT5kYXRhICA9ICYgZGV0ZXJtX2RhdGE7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICB9CisKKyAgICAgICAgaW5pdGlhbGl6ZWQgPSAxOworCisgICAgfTsgLy8gaWYKKworICAgIC8vIFJlc2V0IGZsYWdzLgorICAgIGludCBpOworICAgIGZvciAoIGkgPSAwOyBpIDwgX19rbXBfc3RnX2NvdW50OyArKyBpICkgeworICAgICAgICBfX2ttcF9zdGdfdGFibGVbIGkgXS5zZXQgPSAwOworICAgIH07IC8vIGZvcgorCit9IC8vIF9fa21wX3N0Z19pbml0CisKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZSgKKyAgICBjaGFyIGNvbnN0ICogbmFtZSwKKyAgICBjaGFyIGNvbnN0ICogdmFsdWUKKykgeworCisgICAgLy8gT24gV2luZG93cyogT1MgdGhlcmUgYXJlIHNvbWUgbmFtZWxlc3MgdmFyaWFibGVzIGxpa2UgIkM6PUM6XCIgKHllYWgsIHJlYWxseSBuYW1lbGVzcywgdGhleSBhcmUKKyAgICAvLyBwcmVzZW50ZWQgaW4gZW52aXJvbm1lbnQgYmxvY2sgYXMgIj1DOj1DXFxceDAwPUQ6PUQ6XFxceDAwLi4uIiwgc28gbGV0IHVzIHNraXAgdGhlbS4KKyAgICBpZiAoIG5hbWVbIDAgXSA9PSAwICkgeworICAgICAgICByZXR1cm47CisgICAgfTsgLy8gaWYKKworICAgIGlmICggdmFsdWUgIT0gTlVMTCApIHsKKyAgICAgICAga21wX3NldHRpbmdfdCAqIHNldHRpbmcgPSBfX2ttcF9zdGdfZmluZCggbmFtZSApOworICAgICAgICBpZiAoIHNldHRpbmcgIT0gTlVMTCApIHsKKyAgICAgICAgICAgIHNldHRpbmctPnBhcnNlKCBuYW1lLCB2YWx1ZSwgc2V0dGluZy0+ZGF0YSApOworICAgICAgICAgICAgc2V0dGluZy0+ZGVmaW5lZCA9IDE7CisgICAgICAgIH07IC8vIGlmCisgICAgfTsgLy8gaWYKKworfSAvLyBfX2ttcF9zdGdfcGFyc2UKKworCitzdGF0aWMgaW50CitfX2ttcF9zdGdfY2hlY2tfcml2YWxzKCAgICAgICAgICAvLyAwIC0tIE9rLCAxIC0tIGVycm9ycyBmb3VuZC4KKyAgICBjaGFyIGNvbnN0ICogICAgICAgbmFtZSwgICAgIC8vIE5hbWUgb2YgdmFyaWFibGUuCisgICAgY2hhciBjb25zdCAqICAgICAgIHZhbHVlLCAgICAvLyBWYWx1ZSBvZiB0aGUgdmFyaWFibGUuCisgICAga21wX3NldHRpbmdfdCAqICogIHJpdmFscyAgICAvLyBMaXN0IG9mIHJpdmFsIHNldHRpbmdzICh0aGUgbGlzdCBtdXN0IGluY2x1ZGUgY3VycmVudCBvbmUpLgorKSB7CisKKyAgICBpZiAoIHJpdmFscyA9PSBOVUxMICkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvLyBMb29wIHRocnUgaGlnaGVyIHByaW9yaXR5IHNldHRpbmdzIChsaXN0ZWQgYmVmb3JlIGN1cnJlbnQpLgorICAgIGludCBpID0gMDsKKyAgICBmb3IgKCA7IHN0cmNtcCggcml2YWxzWyBpIF0tPm5hbWUsIG5hbWUgKSAhPSAwOyBpKysgKSB7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHJpdmFsc1sgaSBdICE9IE5VTEwgKTsKKworI2lmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICAgICAgaWYgKCByaXZhbHNbIGkgXSA9PSBfX2ttcF9hZmZpbml0eV9ub3R5cGUgKSB7CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gSWYgS01QX0FGRklOSVRZIGlzIHNwZWNpZmllZCB3aXRob3V0IGEgdHlwZSBuYW1lLAorICAgICAgICAgICAgLy8gaXQgZG9lcyBub3Qgcml2YWwgT01QX1BST0NfQklORCBvciBHT01QX0NQVV9BRkZJTklUWS4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgaWYgKCByaXZhbHNbIGkgXS0+c2V0ICkgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoIFN0Z0lnbm9yZWQsIG5hbWUsIHZhbHVlLCByaXZhbHNbIGkgXS0+bmFtZSApOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH07IC8vIGlmCisgICAgfTsgLy8gd2hpbGUKKworICAgICsrIGk7IC8vIFNraXAgY3VycmVudCBzZXR0aW5nLgorICAgIHJldHVybiAwOworCit9OyAvLyBfX2ttcF9zdGdfY2hlY2tfcml2YWxzCisKKworCitzdGF0aWMgaW50CitfX2ttcF9lbnZfaXNEZWZpbmVkKCBjaGFyIGNvbnN0ICogbmFtZSApIHsKKyAgICBpbnQgcmMgPSAwOworICAgIGttcF9zZXR0aW5nX3QgKiBzZXR0aW5nID0gX19rbXBfc3RnX2ZpbmQoIG5hbWUgKTsKKyAgICBpZiAoIHNldHRpbmcgIT0gTlVMTCApIHsKKyAgICAgICAgcmMgPSBzZXR0aW5nLT5zZXQ7CisgICAgfTsgLy8gaWYKKyAgICByZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQKK19fa21wX2Vudl90b1ByaW50KCBjaGFyIGNvbnN0ICogbmFtZSwgaW50IGZsYWcgKSB7CisgICAgaW50IHJjID0gMDsKKyAgICBrbXBfc2V0dGluZ190ICogc2V0dGluZyA9IF9fa21wX3N0Z19maW5kKCBuYW1lICk7CisgICAgaWYgKCBzZXR0aW5nICE9IE5VTEwgKSB7CisgICAgICAgIHJjID0gc2V0dGluZy0+ZGVmaW5lZDsKKyAgICAgICAgaWYgKCBmbGFnID49IDAgKSB7CisgICAgICAgICAgICBzZXR0aW5nLT5kZWZpbmVkID0gZmxhZzsKKyAgICAgICAgfTsgLy8gaWYKKyAgICB9OyAvLyBpZgorICAgIHJldHVybiByYzsKK30KKworCitzdGF0aWMgdm9pZAorX19rbXBfYXV4X2Vudl9pbml0aWFsaXplKCBrbXBfZW52X2Jsa190KiBibG9jayApIHsKKworICAgIGNoYXIgY29uc3QgKiB2YWx1ZTsKKworICAgIC8qIE9NUF9OVU1fVEhSRUFEUyAqLworICAgIHZhbHVlID0gX19rbXBfZW52X2Jsa192YXIoIGJsb2NrLCAiT01QX05VTV9USFJFQURTIiApOworICAgIGlmICggdmFsdWUgKSB7CisgICAgICAgIG9tcGNfc2V0X251bV90aHJlYWRzKCBfX2ttcF9kZmx0X3RlYW1fbnRoICk7CisgICAgfQorCisgICAgLyogS01QX0JMT0NLVElNRSAqLworICAgIHZhbHVlID0gX19rbXBfZW52X2Jsa192YXIoIGJsb2NrLCAiS01QX0JMT0NLVElNRSIgKTsKKyAgICBpZiAoIHZhbHVlICkgeworICAgICAgICBrbXBjX3NldF9ibG9ja3RpbWUoIF9fa21wX2RmbHRfYmxvY2t0aW1lICk7CisgICAgfQorCisgICAgLyogT01QX05FU1RFRCAqLworICAgIHZhbHVlID0gX19rbXBfZW52X2Jsa192YXIoIGJsb2NrLCAiT01QX05FU1RFRCIgKTsKKyAgICBpZiAoIHZhbHVlICkgeworICAgICAgICBvbXBjX3NldF9uZXN0ZWQoIF9fa21wX2RmbHRfbmVzdGVkICk7CisgICAgfQorCisgICAgLyogT01QX0RZTkFNSUMgKi8KKyAgICB2YWx1ZSA9IF9fa21wX2Vudl9ibGtfdmFyKCBibG9jaywgIk9NUF9EWU5BTUlDIiApOworICAgIGlmICggdmFsdWUgKSB7CisgICAgICAgIG9tcGNfc2V0X2R5bmFtaWMoIF9fa21wX2dsb2JhbC5nLmdfZHluYW1pYyApOworICAgIH0KKworfQorCit2b2lkCitfX2ttcF9lbnZfaW5pdGlhbGl6ZSggY2hhciBjb25zdCAqIHN0cmluZyApIHsKKworICAgIGttcF9lbnZfYmxrX3QgYmxvY2s7CisgICAgaW50ICAgICAgICAgICBpOworCisgICAgX19rbXBfc3RnX2luaXQoKTsKKworICAgIC8vIEhhY2shISEKKyAgICBpZiAoIHN0cmluZyA9PSBOVUxMICkgeworICAgICAgICAvLyBfX2ttcF9tYXhfbnRoID0gX19rbXBfc3lzX21heF9udGg7CisgICAgICAgIF9fa21wX3RocmVhZHNfY2FwYWNpdHkgPSBfX2ttcF9pbml0aWFsX3RocmVhZHNfY2FwYWNpdHkoIF9fa21wX2RmbHRfdGVhbV9udGhfdWIgKTsKKyAgICB9OyAvLyBpZgorICAgIF9fa21wX2Vudl9ibGtfaW5pdCggJiBibG9jaywgc3RyaW5nICk7CisKKyAgICAvLworICAgIC8vIHVwZGF0ZSB0aGUgc2V0IGZsYWcgb24gYWxsIGVudHJpZXMgdGhhdCBoYXZlIGFuIGVudiB2YXIKKyAgICAvLworICAgIGZvciAoIGkgPSAwOyBpIDwgYmxvY2suY291bnQ7ICsrIGkgKSB7CisgICAgICAgIGlmICgoIGJsb2NrLnZhcnNbIGkgXS5uYW1lID09IE5VTEwgKQorICAgICAgICAgIHx8ICggKmJsb2NrLnZhcnNbIGkgXS5uYW1lID09ICdcMCcpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIGJsb2NrLnZhcnNbIGkgXS52YWx1ZSA9PSBOVUxMICkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAga21wX3NldHRpbmdfdCAqIHNldHRpbmcgPSBfX2ttcF9zdGdfZmluZCggYmxvY2sudmFyc1sgaSBdLm5hbWUgKTsKKyAgICAgICAgaWYgKCBzZXR0aW5nICE9IE5VTEwgKSB7CisgICAgICAgICAgICBzZXR0aW5nLT5zZXQgPSAxOworICAgICAgICB9CisgICAgfTsgLy8gZm9yIGkKKworICAgIC8vIFNwZWNpYWwgY2FzZS4gSWYgd2UgcGFyc2UgZW52aXJvbm1lbnQsIG5vdCBhIHN0cmluZywgcHJvY2VzcyBLTVBfV0FSTklOR1MgZmlyc3QuCisgICAgaWYgKCBzdHJpbmcgPT0gTlVMTCApIHsKKyAgICAgICAgY2hhciBjb25zdCAqIG5hbWUgID0gIktNUF9XQVJOSU5HUyI7CisgICAgICAgIGNoYXIgY29uc3QgKiB2YWx1ZSA9IF9fa21wX2Vudl9ibGtfdmFyKCAmIGJsb2NrLCBuYW1lICk7CisgICAgICAgIF9fa21wX3N0Z19wYXJzZSggbmFtZSwgdmFsdWUgKTsKKyAgICB9OyAvLyBpZgorCisjaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgIC8vCisgICAgLy8gU3BlY2lhbCBjYXNlLiBLTVBfQUZGSU5JVFkgaXMgbm90IGEgcml2YWwgdG8gb3RoZXIgYWZmaW5pdHkgZW52IHZhcnMKKyAgICAvLyBpZiBubyBhZmZpbml0eSB0eXBlIGlzIHNwZWNpZmllZC4gIFdlIHdhbnQgdG8gYWxsb3cKKyAgICAvLyBLTVBfQUZGSU5JVFk9W25vXSx2ZXJib3NlL1tub113YXJuaW5ncy9ldGMuICB0byBiZSBlbmFibGVkIHdoZW4KKyAgICAvLyBzcGVjaWZ5aW5nIHRoZSBhZmZpbml0eSB0eXBlIHZpYSBHT01QX0NQVV9BRkZJTklUWSBvciB0aGUgT01QIDQuMAorICAgIC8vIGFmZmluaXR5IG1lY2hhbmlzbS4KKyAgICAvLworICAgIF9fa21wX2FmZmluaXR5X25vdHlwZSA9IE5VTEw7CisgICAgY2hhciBjb25zdCAqYWZmX3N0ciA9IF9fa21wX2Vudl9ibGtfdmFyKCAmIGJsb2NrLCAiS01QX0FGRklOSVRZIiApOworICAgIGlmICggYWZmX3N0ciAhPSBOVUxMICkgeworICAgICAgICAvLworICAgICAgICAvLyBDaGVjayBpZiB0aGUgS01QX0FGRklOSVRZIHR5cGUgaXMgc3BlY2lmaWVkIGluIHRoZSBzdHJpbmcuCisgICAgICAgIC8vIFdlIGp1c3Qgc2VhcmNoIHRoZSBzdHJpbmcgZm9yICJjb21wYWN0IiwgInNjYXR0ZXIiLCBldGMuCisgICAgICAgIC8vIHdpdGhvdXQgcmVhbGx5IHBhcnNpbmcgdGhlIHN0cmluZy4gIFRoZSBzeW50YXggb2YgdGhlCisgICAgICAgIC8vIEtNUF9BRkZJTklUWSBlbnYgdmFyIGlzIHN1Y2ggdGhhdCBub25lIG9mIHRoZSBhZmZpbml0eQorICAgICAgICAvLyB0eXBlIG5hbWVzIGNhbiBhcHBlYXIgYW55d2hlcmUgb3RoZXIgdGhhdCB0aGUgdHlwZQorICAgICAgICAvLyBzcGVjaWZpZXIsIGV2ZW4gYXMgc3Vic3RyaW5ncy4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gSSBjYW4ndCBmaW5kIGEgY2FzZS1pbnNlbnNpdGl2ZSB2ZXJzaW9uIG9mIHN0cnN0ciBvbiBXaW5kb3dzKiBPUy4KKyAgICAgICAgLy8gVXNlIHRoZSBjYXNlLXNlbnNpdGl2ZSB2ZXJzaW9uIGZvciBub3cuCisgICAgICAgIC8vCisKKyMgaWYgS01QX09TX1dJTkRPV1MKKyMgIGRlZmluZSBGSU5EIHN0cnN0cgorIyBlbHNlCisjICBkZWZpbmUgRklORCBzdHJjYXNlc3RyCisjIGVuZGlmCisKKyAgICAgICAgaWYgKCAoIEZJTkQoIGFmZl9zdHIsICJub25lIiApID09IE5VTEwgKQorICAgICAgICAgICYmICggRklORCggYWZmX3N0ciwgInBoeXNpY2FsIiApID09IE5VTEwgKQorICAgICAgICAgICYmICggRklORCggYWZmX3N0ciwgImxvZ2ljYWwiICkgPT0gTlVMTCApCisgICAgICAgICAgJiYgKCBGSU5EKCBhZmZfc3RyLCAiY29tcGFjdCIgKSA9PSBOVUxMICkKKyAgICAgICAgICAmJiAoIEZJTkQoIGFmZl9zdHIsICJzY2F0dGVyIiApID09IE5VTEwgKQorICAgICAgICAgICYmICggRklORCggYWZmX3N0ciwgImV4cGxpY2l0IiApID09IE5VTEwgKQorICAgICAgICAgICYmICggRklORCggYWZmX3N0ciwgImJhbGFuY2VkIiApID09IE5VTEwgKQorICAgICAgICAgICYmICggRklORCggYWZmX3N0ciwgImRpc2FibGVkIiApID09IE5VTEwgKSApIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X25vdHlwZSA9IF9fa21wX3N0Z19maW5kKCAiS01QX0FGRklOSVRZIiAgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBBIG5ldyBhZmZpbml0eSB0eXBlIGlzIHNwZWNpZmllZC4KKyAgICAgICAgICAgIC8vIFJlc2V0IHRoZSBhZmZpbml0eSBmbGFncyB0byB0aGVpciBkZWZhdWx0IHZhbHVlcywKKyAgICAgICAgICAgIC8vIGluIGNhc2UgdGhpcyBpcyBjYWxsZWQgZnJvbSBrbXBfc2V0X2RlZmF1bHRzKCkuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfdHlwZSA9IGFmZmluaXR5X2RlZmF1bHQ7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuID0gYWZmaW5pdHlfZ3Jhbl9kZWZhdWx0OworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfdG9wX21ldGhvZCA9IGFmZmluaXR5X3RvcF9tZXRob2RfZGVmYXVsdDsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3Jlc3BlY3RfbWFzayA9IGFmZmluaXR5X3Jlc3BlY3RfbWFza19kZWZhdWx0OworICAgICAgICB9CisjIHVuZGVmIEZJTkQKKworI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgIC8vCisgICAgICAgIC8vIEFsc28gcmVzZXQgdGhlIGFmZmluaXR5IGZsYWdzIGlmIE9NUF9QUk9DX0JJTkQgaXMgc3BlY2lmaWVkLgorICAgICAgICAvLworICAgICAgICBhZmZfc3RyID0gX19rbXBfZW52X2Jsa192YXIoICYgYmxvY2ssICJPTVBfUFJPQ19CSU5EIiApOworICAgICAgICBpZiAoIGFmZl9zdHIgIT0gTlVMTCApIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9kZWZhdWx0OworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3JhbiA9IGFmZmluaXR5X2dyYW5fZGVmYXVsdDsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3RvcF9tZXRob2QgPSBhZmZpbml0eV90b3BfbWV0aG9kX2RlZmF1bHQ7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9yZXNwZWN0X21hc2sgPSBhZmZpbml0eV9yZXNwZWN0X21hc2tfZGVmYXVsdDsKKyAgICAgICAgfQorI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisgICAgfQorCisjZW5kaWYgLyogS01QX0FGRklOSVRZX1NVUFBPUlRFRCAqLworCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAvLworICAgIC8vIFNldCB1cCB0aGUgbmVzdGVkIHByb2MgYmluZCB0eXBlIHZlY3Rvci4KKyAgICAvLworICAgIGlmICggX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzID09IE5VTEwgKSB7CisgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlcyA9IChrbXBfcHJvY19iaW5kX3QgKikKKyAgICAgICAgICBLTVBfSU5URVJOQUxfTUFMTE9DKCBzaXplb2Yoa21wX3Byb2NfYmluZF90KSApOworICAgICAgICBpZiAoIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlcyA9PSBOVUxMICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBNZW1vcnlBbGxvY0ZhaWxlZCApOworICAgICAgICB9CisgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuc2l6ZSA9IDE7CisgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQudXNlZCA9IDE7CisgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSA9IHByb2NfYmluZF9kZWZhdWx0OworICAgIH0KKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworCisgICAgLy8KKyAgICAvLyBOb3cgcHJvY2VzcyBhbGwgb2YgdGhlIHNldHRpbmdzLgorICAgIC8vCisgICAgZm9yICggaSA9IDA7IGkgPCBibG9jay5jb3VudDsgKysgaSApIHsKKyAgICAgICAgX19rbXBfc3RnX3BhcnNlKCBibG9jay52YXJzWyBpIF0ubmFtZSwgYmxvY2sudmFyc1sgaSBdLnZhbHVlICk7CisgICAgfTsgLy8gZm9yIGkKKworICAgIC8vCisgICAgLy8gSWYgdXNlciBsb2NrcyBoYXZlIGJlZW4gYWxsb2NhdGVkIHlldCwgZG9uJ3QgcmVzZXQgdGhlIGxvY2sgdnB0ciB0YWJsZS4KKyAgICAvLworICAgIGlmICggISBfX2ttcF9pbml0X3VzZXJfbG9ja3MgKSB7CisgICAgICAgIGlmICggX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfZGVmYXVsdCApIHsKKyAgICAgICAgICAgIF9fa21wX3VzZXJfbG9ja19raW5kID0gbGtfcXVldWluZzsKKyAgICAgICAgfQorICAgICAgICBfX2ttcF9zZXRfdXNlcl9sb2NrX3ZwdHJzKCBfX2ttcF91c2VyX2xvY2tfa2luZCApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggc3RyaW5nICE9IE5VTEwpOyAvLyBrbXBfc2V0X2RlZmF1bHRzKCkgd2FzIGNhbGxlZAorICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF91c2VyX2xvY2tfa2luZCAhPSBsa19kZWZhdWx0ICk7CisgICAgICAgIF9fa21wX3NldF91c2VyX2xvY2tfdnB0cnMoIF9fa21wX3VzZXJfbG9ja19raW5kICk7CisgICAgICAgIC8vIEJpbmRzIGxvY2sgZnVuY3Rpb25zIGFnYWluIHRvIGZvbGxvdyB0aGUgdHJhbnNpdGlvbiBiZXR3ZWVuIGRpZmZlcmVudAorICAgICAgICAvLyBLTVBfQ09OU0lTVEVOQ1lfQ0hFQ0sgdmFsdWVzLiBDYWxsaW5nIHRoaXMgYWdhaW4gaXMgaGFybWxlc3MgYXMgbG9uZworICAgICAgICAvLyBhcyB3ZSBkbyBub3QgYWxsb3cgbG9jayBraW5kIGNoYW5nZXMgYWZ0ZXIgbWFraW5nIGEgY2FsbCB0byBhbnkKKyAgICAgICAgLy8gdXNlciBsb2NrIGZ1bmN0aW9ucyAodHJ1ZSkuCisgICAgfQorCisjaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorCisgICAgaWYgKCAhIFRDUl80KF9fa21wX2luaXRfbWlkZGxlKSApIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gRGV0ZXJtaW5lIGlmIHRoZSBtYWNoaW5lL09TIGlzIGFjdHVhbGx5IGNhcGFibGUgb2Ygc3VwcG9ydGluZworICAgICAgICAvLyBhZmZpbml0eS4KKyAgICAgICAgLy8KKyAgICAgICAgY29uc3QgY2hhciAqdmFyID0gIktNUF9BRkZJTklUWSI7CisgICAgICAgIGlmICggX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9kaXNhYmxlZCApIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluX21hc2tfc2l6ZSA9IDA7ICAvLyBzaG91bGQgYWxyZWFkeSBiZSAwCisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoICEgS01QX0FGRklOSVRZX0NBUEFCTEUoKSApIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2RldGVybWluZV9jYXBhYmxlKCB2YXIgKTsKKyAgICAgICAgICAgIGlmICggISBLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpICkgeworICAgICAgICAgICAgICAgIGlmICggX19rbXBfYWZmaW5pdHlfdmVyYm9zZSB8fCAoIF9fa21wX2FmZmluaXR5X3dhcm5pbmdzCisgICAgICAgICAgICAgICAgICAmJiAoIF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfZGVmYXVsdCApCisgICAgICAgICAgICAgICAgICAmJiAoIF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfbm9uZSApCisgICAgICAgICAgICAgICAgICAmJiAoIF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfZGlzYWJsZWQgKSApICkgeworICAgICAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggQWZmTm90U3VwcG9ydGVkLCB2YXIgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfdHlwZSA9IGFmZmluaXR5X2Rpc2FibGVkOworICAgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3Jlc3BlY3RfbWFzayA9IDA7CisgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3JhbiA9IGFmZmluaXR5X2dyYW5fZmluZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisjIGlmIE9NUF80MF9FTkFCTEVECisgICAgICAgIGlmICggX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9kaXNhYmxlZCApICB7CisgICAgICAgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPSBwcm9jX2JpbmRfZGlzYWJsZWQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSA9PSBwcm9jX2JpbmRfdHJ1ZSApIHsKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBPTVBfUFJPQ19CSU5EPXRydWUgbWFwcyB0byBPTVBfUFJPQ19CSU5EPXNwcmVhZC4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPSBwcm9jX2JpbmRfc3ByZWFkOworICAgICAgICB9CisjIGVuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisKKyAgICAgICAgaWYgKCBLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpICkgeworCisjIGlmIEtNUF9PU19XSU5ET1dTICYmIEtNUF9BUkNIX1g4Nl82NAorCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gSGFuZGxlIHRoZSBXaW4gNjQgZ3JvdXAgYWZmaW5pdHkgc3R1ZmYgaWYgdGhlcmUgYXJlIG11bHRpcGxlCisgICAgICAgICAgICAvLyBwcm9jZXNzb3IgZ3JvdXBzLCBvciBpZiB0aGUgdXNlciByZXF1ZXN0ZWQgaXQsIGFuZCBPTVAgNC4wCisgICAgICAgICAgICAvLyBhZmZpbml0eSBpcyBub3QgaW4gZWZmZWN0LgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGlmICggKCAoIF9fa21wX251bV9wcm9jX2dyb3VwcyA+IDEgKQorICAgICAgICAgICAgICAmJiAoIF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfZGVmYXVsdCApCisjICBpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICAgICAgICAmJiAoIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSA9PSBwcm9jX2JpbmRfZGVmYXVsdCApICkKKyMgIGVuZGlmCisgICAgICAgICAgICAgIHx8ICggX19rbXBfYWZmaW5pdHlfdG9wX21ldGhvZCA9PSBhZmZpbml0eV90b3BfbWV0aG9kX2dyb3VwICkgKSB7CisgICAgICAgICAgICAgICAgaWYgKCBfX2ttcF9hZmZpbml0eV9yZXNwZWN0X21hc2sgPT0gYWZmaW5pdHlfcmVzcGVjdF9tYXNrX2RlZmF1bHQgKSB7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3Jlc3BlY3RfbWFzayA9IEZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfZGVmYXVsdCApIHsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfdHlwZSA9IGFmZmluaXR5X2NvbXBhY3Q7CisjICBpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPSBwcm9jX2JpbmRfaW50ZWw7CisjICBlbmRpZgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIF9fa21wX2FmZmluaXR5X3RvcF9tZXRob2QgPT0gYWZmaW5pdHlfdG9wX21ldGhvZF9kZWZhdWx0ICkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIF9fa21wX2FmZmluaXR5X2dyYW4gPT0gYWZmaW5pdHlfZ3Jhbl9kZWZhdWx0ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfdG9wX21ldGhvZCA9IGFmZmluaXR5X3RvcF9tZXRob2RfZ3JvdXA7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuID0gYWZmaW5pdHlfZ3Jhbl9ncm91cDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggX19rbXBfYWZmaW5pdHlfZ3JhbiA9PSBhZmZpbml0eV9ncmFuX2dyb3VwICkgeworICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfdG9wX21ldGhvZCA9IGFmZmluaXR5X3RvcF9tZXRob2RfZ3JvdXA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID0gYWZmaW5pdHlfdG9wX21ldGhvZF9hbGw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIF9fa21wX2FmZmluaXR5X3RvcF9tZXRob2QgPT0gYWZmaW5pdHlfdG9wX21ldGhvZF9ncm91cCApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBfX2ttcF9hZmZpbml0eV9ncmFuID09IGFmZmluaXR5X2dyYW5fZGVmYXVsdCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW4gPSBhZmZpbml0eV9ncmFuX2dyb3VwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoIF9fa21wX2FmZmluaXR5X2dyYW4gIT0gYWZmaW5pdHlfZ3Jhbl9ncm91cCApCisgICAgICAgICAgICAgICAgICAgICAgJiYgKCBfX2ttcF9hZmZpbml0eV9ncmFuICE9IGFmZmluaXR5X2dyYW5fZmluZSApCisgICAgICAgICAgICAgICAgICAgICAgJiYgKCBfX2ttcF9hZmZpbml0eV9ncmFuICE9IGFmZmluaXR5X2dyYW5fdGhyZWFkICkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpzdHIgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICggX19rbXBfYWZmaW5pdHlfZ3JhbiApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGFmZmluaXR5X2dyYW5fY29yZTogc3RyID0gImNvcmUiOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGFmZmluaXR5X2dyYW5fcGFja2FnZTogc3RyID0gInBhY2thZ2UiOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGFmZmluaXR5X2dyYW5fbm9kZTogc3RyID0gIm5vZGUiOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiBLTVBfREVCVUdfQVNTRVJUKCAwICk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggQWZmR3JhblRvcEdyb3VwLCB2YXIsIHN0ciApOworICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3JhbiA9IGFmZmluaXR5X2dyYW5fZmluZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBfX2ttcF9hZmZpbml0eV9ncmFuID09IGFmZmluaXR5X2dyYW5fZGVmYXVsdCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW4gPSBhZmZpbml0eV9ncmFuX2NvcmU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIF9fa21wX2FmZmluaXR5X2dyYW4gPT0gYWZmaW5pdHlfZ3Jhbl9ncm91cCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnN0ciA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKCBfX2ttcF9hZmZpbml0eV90eXBlICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgYWZmaW5pdHlfcGh5c2ljYWw6IHN0ciA9ICJwaHlzaWNhbCI7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgYWZmaW5pdHlfbG9naWNhbDogc3RyID0gImxvZ2ljYWwiOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGFmZmluaXR5X2NvbXBhY3Q6IHN0ciA9ICJjb21wYWN0IjsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBhZmZpbml0eV9zY2F0dGVyOiBzdHIgPSAic2NhdHRlciI7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgYWZmaW5pdHlfZXhwbGljaXQ6IHN0ciA9ICJleHBsaWNpdCI7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vIE1JQyBvbiB3aW5kb3dzLCBzbyBubyBhZmZpbml0eV9iYWxhbmNlZCBjYXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogS01QX0RFQlVHX0FTU0VSVCggMCApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoIEFmZkdyYW5Hcm91cFR5cGUsIHZhciwgc3RyICk7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuID0gYWZmaW5pdHlfZ3Jhbl9jb3JlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorCisjIGVuZGlmIC8qIEtNUF9PU19XSU5ET1dTICYmIEtNUF9BUkNIX1g4Nl82NCAqLworCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCBfX2ttcF9hZmZpbml0eV9yZXNwZWN0X21hc2sgPT0gYWZmaW5pdHlfcmVzcGVjdF9tYXNrX2RlZmF1bHQgKSB7CisjIGlmIEtNUF9PU19XSU5ET1dTICYmIEtNUF9BUkNIX1g4Nl82NAorICAgICAgICAgICAgICAgICAgICBpZiAoIF9fa21wX251bV9wcm9jX2dyb3VwcyA+IDEgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9yZXNwZWN0X21hc2sgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisjIGVuZGlmIC8qIEtNUF9PU19XSU5ET1dTICYmIEtNUF9BUkNIX1g4Nl82NCAqLworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9yZXNwZWN0X21hc2sgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorIyBpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICAgICAgICAgIGlmICggKCBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gIT0gcHJvY19iaW5kX2ludGVsICkKKyAgICAgICAgICAgICAgICAgICYmICggX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdICE9IHByb2NfYmluZF9kZWZhdWx0ICkgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICggX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9kZWZhdWx0ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfdHlwZSA9IGFmZmluaXR5X2NvbXBhY3Q7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9kdXBzID0gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorIyBlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworICAgICAgICAgICAgICAgIGlmICggX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9kZWZhdWx0ICkgeworIyBpZiBLTVBfTUlDCisgICAgICAgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9zY2F0dGVyOworIyAgaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdID0gcHJvY19iaW5kX2ludGVsOworIyAgZW5kaWYKKyMgZWxzZQorICAgICAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV90eXBlID0gYWZmaW5pdHlfbm9uZTsKKyMgIGlmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgICAgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSA9IHByb2NfYmluZF9mYWxzZTsKKyMgIGVuZGlmCisjIGVuZGlmCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICggKCBfX2ttcF9hZmZpbml0eV9ncmFuID09IGFmZmluaXR5X2dyYW5fZGVmYXVsdCApCisgICAgICAgICAgICAgICAgICAmJiAgKCBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscyA8IDAgKSApIHsKKyMgaWYgS01QX01JQworICAgICAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuID0gYWZmaW5pdHlfZ3Jhbl9maW5lOworIyBlbHNlCisgICAgICAgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW4gPSBhZmZpbml0eV9ncmFuX2NvcmU7CisjIGVuZGlmCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICggX19rbXBfYWZmaW5pdHlfdG9wX21ldGhvZCA9PSBhZmZpbml0eV90b3BfbWV0aG9kX2RlZmF1bHQgKSB7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3RvcF9tZXRob2QgPSBhZmZpbml0eV90b3BfbWV0aG9kX2FsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBLX0RJQUcoIDEsICggIl9fa21wX2FmZmluaXR5X3R5cGUgICAgICAgICA9PSAlZFxuIiwgX19rbXBfYWZmaW5pdHlfdHlwZSAgICAgICAgICkgKTsKKyAgICAgICAgS19ESUFHKCAxLCAoICJfX2ttcF9hZmZpbml0eV9jb21wYWN0ICAgICAgPT0gJWRcbiIsIF9fa21wX2FmZmluaXR5X2NvbXBhY3QgICAgICApICk7CisgICAgICAgIEtfRElBRyggMSwgKCAiX19rbXBfYWZmaW5pdHlfb2Zmc2V0ICAgICAgID09ICVkXG4iLCBfX2ttcF9hZmZpbml0eV9vZmZzZXQgICAgICAgKSApOworICAgICAgICBLX0RJQUcoIDEsICggIl9fa21wX2FmZmluaXR5X3ZlcmJvc2UgICAgICA9PSAlZFxuIiwgX19rbXBfYWZmaW5pdHlfdmVyYm9zZSAgICAgICkgKTsKKyAgICAgICAgS19ESUFHKCAxLCAoICJfX2ttcF9hZmZpbml0eV93YXJuaW5ncyAgICAgPT0gJWRcbiIsIF9fa21wX2FmZmluaXR5X3dhcm5pbmdzICAgICApICk7CisgICAgICAgIEtfRElBRyggMSwgKCAiX19rbXBfYWZmaW5pdHlfcmVzcGVjdF9tYXNrID09ICVkXG4iLCBfX2ttcF9hZmZpbml0eV9yZXNwZWN0X21hc2sgKSApOworICAgICAgICBLX0RJQUcoIDEsICggIl9fa21wX2FmZmluaXR5X2dyYW4gICAgICAgICA9PSAlZFxuIiwgX19rbXBfYWZmaW5pdHlfZ3JhbiAgICAgICAgICkgKTsKKworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X2RlZmF1bHQpOworIyBpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0KKyAgICAgICAgICAhPSBwcm9jX2JpbmRfZGVmYXVsdCApOworIyBlbmRpZgorICAgIH0KKworI2VuZGlmIC8qIEtNUF9BRkZJTklUWV9TVVBQT1JURUQgKi8KKworICAgIGlmICggX19rbXBfdmVyc2lvbiApIHsKKyAgICAgICAgX19rbXBfcHJpbnRfdmVyc2lvbl8xKCk7CisgICAgfTsgLy8gaWYKKworICAgIC8vIFBvc3QtaW5pdGlhbGl6YXRpb24gc3RlcDogc29tZSBlbnYuIHZhcnMgbmVlZCB0aGVpciB2YWx1ZSdzIGZ1cnRoZXIgcHJvY2Vzc2luZworICAgIGlmICggc3RyaW5nICE9IE5VTEwpIHsgLy8ga21wX3NldF9kZWZhdWx0cygpIHdhcyBjYWxsZWQKKyAgICAgICAgX19rbXBfYXV4X2Vudl9pbml0aWFsaXplKCAmYmxvY2sgKTsKKyAgICB9CisKKyAgICBfX2ttcF9lbnZfYmxrX2ZyZWUoICYgYmxvY2sgKTsKKworICAgIEtNUF9NQigpOworCit9IC8vIF9fa21wX2Vudl9pbml0aWFsaXplCisKKwordm9pZAorX19rbXBfZW52X3ByaW50KCkgeworCisgICAga21wX2Vudl9ibGtfdCBibG9jazsKKyAgICBpbnQgICAgICAgICAgIGk7CisgICAga21wX3N0cl9idWZfdCBidWZmZXI7CisKKyAgICBfX2ttcF9zdGdfaW5pdCgpOworICAgIF9fa21wX3N0cl9idWZfaW5pdCggJiBidWZmZXIgKTsKKworICAgIF9fa21wX2Vudl9ibGtfaW5pdCggJiBibG9jaywgTlVMTCApOworICAgIF9fa21wX2Vudl9ibGtfc29ydCggJiBibG9jayApOworCisgICAgLy8gUHJpbnQgcmVhbCBlbnZpcm9ubWVudCB2YWx1ZXMuCisgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBidWZmZXIsICJcbiVzXG5cbiIsIEtNUF9JMThOX1NUUiggVXNlclNldHRpbmdzICkgICk7CisgICAgZm9yICggaSA9IDA7IGkgPCBibG9jay5jb3VudDsgKysgaSApIHsKKyAgICAgICAgY2hhciBjb25zdCAqIG5hbWUgID0gYmxvY2sudmFyc1sgaSBdLm5hbWU7CisgICAgICAgIGNoYXIgY29uc3QgKiB2YWx1ZSA9IGJsb2NrLnZhcnNbIGkgXS52YWx1ZTsKKyAgICAgICAgaWYgKAorICAgICAgICAgICAgKCBzdHJsZW4oIG5hbWUgKSA+IDQgJiYgc3RybmNtcCggbmFtZSwgIktNUF8iLCA0ICkgPT0gMCApCisgICAgICAgICAgICB8fCBzdHJuY21wKCBuYW1lLCAiT01QXyIsIDQgKSA9PSAwCisgICAgICAgICAgICAjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisgICAgICAgICAgICAgICAgfHwgc3RybmNtcCggbmFtZSwgIkdPTVBfIiwgNSApID09IDAKKyAgICAgICAgICAgICNlbmRpZiAvLyBLTVBfR09NUF9DT01QQVQKKyAgICAgICAgKSB7CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmIGJ1ZmZlciwgIiAgICVzPSVzXG4iLCBuYW1lLCB2YWx1ZSApOworICAgICAgICB9OyAvLyBpZgorICAgIH07IC8vIGZvcgorICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICYgYnVmZmVyLCAiXG4iICk7CisKKyAgICAvLyBQcmludCBpbnRlcm5hbCAoZWZmZWN0aXZlKSBzZXR0aW5ncy4KKyAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmIGJ1ZmZlciwgIiVzXG5cbiIsIEtNUF9JMThOX1NUUiggRWZmZWN0aXZlU2V0dGluZ3MgKSApOworICAgIGZvciAoIGludCBpID0gMDsgaSA8IF9fa21wX3N0Z19jb3VudDsgKysgaSApIHsKKyAgICAgICAgaWYgKCAgX19rbXBfc3RnX3RhYmxlWyBpIF0ucHJpbnQgIT0gTlVMTCApIHsKKyAgICAgICAgICAgIF9fa21wX3N0Z190YWJsZVsgaSBdLnByaW50KCAmIGJ1ZmZlciwgX19rbXBfc3RnX3RhYmxlWyBpIF0ubmFtZSwgX19rbXBfc3RnX3RhYmxlWyBpIF0uZGF0YSApOworICAgICAgICB9OyAvLyBpZgorICAgIH07IC8vIGZvcgorCisgICAgX19rbXBfcHJpbnRmKCAiJXMiLCBidWZmZXIuc3RyICk7CisKKyAgICBfX2ttcF9lbnZfYmxrX2ZyZWUoICYgYmxvY2sgKTsKKyAgICBfX2ttcF9zdHJfYnVmX2ZyZWUoICYgYnVmZmVyICk7CisKKyAgICBfX2ttcF9wcmludGYoIlxuIik7CisKK30gLy8gX19rbXBfZW52X3ByaW50CisKKworI2lmIE9NUF80MF9FTkFCTEVECit2b2lkCitfX2ttcF9lbnZfcHJpbnRfMigpIHsKKworICAgIGttcF9lbnZfYmxrX3QgYmxvY2s7CisgICAgaW50ICAgICAgICAgICBpOworICAgIGttcF9zdHJfYnVmX3QgYnVmZmVyOworCisgICAgX19rbXBfZW52X2Zvcm1hdCA9IDE7CisKKyAgICBfX2ttcF9zdGdfaW5pdCgpOworICAgIF9fa21wX3N0cl9idWZfaW5pdCggJiBidWZmZXIgKTsKKworICAgIF9fa21wX2Vudl9ibGtfaW5pdCggJiBibG9jaywgTlVMTCApOworICAgIF9fa21wX2Vudl9ibGtfc29ydCggJiBibG9jayApOworCisgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBidWZmZXIsICJcbiVzXG4iLCBLTVBfSTE4Tl9TVFIoIERpc3BsYXlFbnZCZWdpbiApICApOworICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICYgYnVmZmVyLCAiICAgX09QRU5NUD0nJWQnXG4iLCBfX2ttcF9vcGVubXBfdmVyc2lvbiApOworCisgICAgZm9yICggaW50IGkgPSAwOyBpIDwgX19rbXBfc3RnX2NvdW50OyArKyBpICkgeworICAgICAgICBpZiAoICBfX2ttcF9zdGdfdGFibGVbIGkgXS5wcmludCAhPSBOVUxMICYmCisgICAgICAgICAgICAgICggKCBfX2ttcF9kaXNwbGF5X2VudiAmJiBzdHJuY21wKCBfX2ttcF9zdGdfdGFibGVbIGkgXS5uYW1lLCAiT01QXyIsIDQgKSA9PSAwICkgfHwgX19rbXBfZGlzcGxheV9lbnZfdmVyYm9zZSApICkgeworICAgICAgICAgICAgX19rbXBfc3RnX3RhYmxlWyBpIF0ucHJpbnQoICYgYnVmZmVyLCBfX2ttcF9zdGdfdGFibGVbIGkgXS5uYW1lLCBfX2ttcF9zdGdfdGFibGVbIGkgXS5kYXRhICk7CisgICAgICAgIH07IC8vIGlmCisgICAgfTsgLy8gZm9yCisKKyAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmIGJ1ZmZlciwgIiVzXG4iLCBLTVBfSTE4Tl9TVFIoIERpc3BsYXlFbnZFbmQgKSAgKTsKKyAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmIGJ1ZmZlciwgIlxuIiApOworCisgICAgX19rbXBfcHJpbnRmKCAiJXMiLCBidWZmZXIuc3RyICk7CisKKyAgICBfX2ttcF9lbnZfYmxrX2ZyZWUoICYgYmxvY2sgKTsKKyAgICBfX2ttcF9zdHJfYnVmX2ZyZWUoICYgYnVmZmVyICk7CisKKyAgICBfX2ttcF9wcmludGYoIlxuIik7CisKK30gLy8gX19rbXBfZW52X3ByaW50XzIKKyNlbmRpZiAvLyBPTVBfNDBfRU5BQkxFRAorCisKKworLy8gZW5kIG9mIGZpbGUKKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX3NldHRpbmdzLmggYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfc2V0dGluZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWFkNDI4Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX3NldHRpbmdzLmgKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIGttcF9zZXR0aW5ncy5oIC0tIEluaXRpYWxpemUgZW52aXJvbm1lbnQgdmFyaWFibGVzCisgKiAkUmV2aXNpb246IDQyOTUxICQKKyAqICREYXRlOiAyMDE0LTAxLTIxIDE0OjQxOjQxIC0wNjAwIChUdWUsIDIxIEphbiAyMDE0KSAkCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgS01QX1NFVFRJTkdTX0gKKyNkZWZpbmUgS01QX1NFVFRJTkdTX0gKKwordm9pZCBfX2ttcF9yZXNldF9nbG9iYWxfdmFycyggdm9pZCApOwordm9pZCBfX2ttcF9lbnZfaW5pdGlhbGl6ZSggY2hhciBjb25zdCAqICk7Cit2b2lkIF9fa21wX2Vudl9wcmludCgpOworI2lmIE9NUF80MF9FTkFCTEVECit2b2lkIF9fa21wX2Vudl9wcmludF8yKCk7CisjZW5kaWYgLy8gT01QXzQwX0VOQUJMRUQKKworaW50IF9fa21wX2luaXRpYWxfdGhyZWFkc19jYXBhY2l0eSggaW50IHJlcV9ucHJvYyApOwordm9pZCBfX2ttcF9pbml0X2RmbHRfdGVhbV9udGgoKTsKK2ludCBfX2ttcF9jb252ZXJ0X3RvX21pbGxpc2Vjb25kcyggY2hhciBjb25zdCAqICk7CitpbnQgX19rbXBfZGVmYXVsdF90cF9jYXBhY2l0eSggaW50LCBpbnQsIGludCk7CisKKyNpZiBLTVBfTUlDCisjZGVmaW5lIEtNUF9TVFJfQlVGX1BSSU5UX05BTUUgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAlcyAlcyIsIEtNUF9JMThOX1NUUihEZXZpY2UpLCBuYW1lICkKKyNkZWZpbmUgS01QX1NUUl9CVUZfUFJJTlRfTkFNRV9FWCh4KSAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIgICVzICVzPSciLCBLTVBfSTE4Tl9TVFIoRGV2aWNlKSwgeCApCisjZGVmaW5lIEtNUF9TVFJfQlVGX1BSSU5UX0JPT0wgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAlcyAlcz0nJXMnXG4iLCBLTVBfSTE4Tl9TVFIoRGV2aWNlKSwgbmFtZSwgdmFsdWUgPyAiVFJVRSIgOiAiRkFMU0UiICk7CisjZGVmaW5lIEtNUF9TVFJfQlVGX1BSSU5UX0lOVCAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAlcyAlcz0nJWQnXG4iLCBLTVBfSTE4Tl9TVFIoRGV2aWNlKSwgbmFtZSwgdmFsdWUgKQorI2RlZmluZSBLTVBfU1RSX0JVRl9QUklOVF9VSU5UNjQgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiAgJXMgJXM9JyUiIEtNUF9VSU5UNjRfU1BFQyAiJ1xuIiwgS01QX0kxOE5fU1RSKERldmljZSksIG5hbWUsIHZhbHVlICk7CisjZGVmaW5lIEtNUF9TVFJfQlVGX1BSSU5UX1NUUiAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAlcyAlcz0nJXMnXG4iLCBLTVBfSTE4Tl9TVFIoRGV2aWNlKSwgbmFtZSwgdmFsdWUgKQorI2Vsc2UKKyNkZWZpbmUgS01QX1NUUl9CVUZfUFJJTlRfTkFNRSAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIgICVzICVzIiwgS01QX0kxOE5fU1RSKEhvc3QpLCBuYW1lICkKKyNkZWZpbmUgS01QX1NUUl9CVUZfUFJJTlRfTkFNRV9FWCh4KSAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIgICVzICVzPSciLCBLTVBfSTE4Tl9TVFIoSG9zdCksIHggKQorI2RlZmluZSBLTVBfU1RSX0JVRl9QUklOVF9CT09MICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiAgJXMgJXM9JyVzJ1xuIiwgS01QX0kxOE5fU1RSKEhvc3QpLCBuYW1lLCB2YWx1ZSA/ICJUUlVFIiA6ICJGQUxTRSIgKTsKKyNkZWZpbmUgS01QX1NUUl9CVUZfUFJJTlRfSU5UICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIgICVzICVzPSclZCdcbiIsIEtNUF9JMThOX1NUUihIb3N0KSwgbmFtZSwgdmFsdWUgKQorI2RlZmluZSBLTVBfU1RSX0JVRl9QUklOVF9VSU5UNjQgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiAgJXMgJXM9JyUiIEtNUF9VSU5UNjRfU1BFQyAiJ1xuIiwgS01QX0kxOE5fU1RSKEhvc3QpLCBuYW1lLCB2YWx1ZSApOworI2RlZmluZSBLTVBfU1RSX0JVRl9QUklOVF9TVFIgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiAgJXMgJXM9JyVzJ1xuIiwgS01QX0kxOE5fU1RSKEhvc3QpLCBuYW1lLCB2YWx1ZSApCisjZW5kaWYKKworI2VuZGlmIC8vIEtNUF9TRVRUSU5HU19ICisKKy8vIGVuZCBvZiBmaWxlIC8vCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9zdGF0cy5jcHAgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfc3RhdHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3NTBmN2IKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfc3RhdHMuY3BwCkBAIC0wLDAgKzEsNjE1IEBACisvKiogQGZpbGUga21wX3N0YXRzLmNwcAorICogU3RhdGlzdGljcyBnYXRoZXJpbmcgYW5kIHByb2Nlc3NpbmcuCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZiBLTVBfU1RBVFNfRU5BQkxFRAorCisjaW5jbHVkZSAia21wLmgiCisjaW5jbHVkZSAia21wX3N0ci5oIgorI2luY2x1ZGUgImttcF9sb2NrLmgiCisjaW5jbHVkZSAia21wX3N0YXRzLmgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxpb21hbmlwPgorI2luY2x1ZGUgPHN0ZGxpYi5oPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGF0ZXhpdAorCisjZGVmaW5lIFNUUklOR0laRTIoeCkgI3gKKyNkZWZpbmUgU1RSSU5HSVpFKHgpIFNUUklOR0laRTIoeCkKKworI2RlZmluZSBleHBhbmROYW1lKG5hbWUsZmxhZ3MsaWdub3JlKSAge1NUUklOR0laRShuYW1lKSxmbGFnc30sCitzdGF0SW5mbyB0aW1lU3RhdDo6dGltZXJJbmZvW10gPSB7CisgICAgS01QX0ZPUkVBQ0hfVElNRVIoZXhwYW5kTmFtZSwwKQorICAgIHswLDB9Cit9OworY29uc3Qgc3RhdEluZm8gY291bnRlcjo6Y291bnRlckluZm9bXSA9IHsKKyAgICBLTVBfRk9SRUFDSF9DT1VOVEVSKGV4cGFuZE5hbWUsMCkKKyAgICB7MCwwfQorfTsKKyN1bmRlZiBleHBhbmROYW1lCisKKyNkZWZpbmUgZXhwYW5kTmFtZShpZ25vcmUxLGlnbm9yZTIsaWdub3JlMykgIHswLjAsMC4wLDAuMH0sCitrbXBfc3RhdHNfb3V0cHV0X21vZHVsZTo6cmdiX2NvbG9yIGttcF9zdGF0c19vdXRwdXRfbW9kdWxlOjp0aW1lckNvbG9ySW5mb1tdID0geworICAgIEtNUF9GT1JFQUNIX1RJTUVSKGV4cGFuZE5hbWUsMCkKKyAgICB7MC4wLDAuMCwwLjB9Cit9OworI3VuZGVmIGV4cGFuZE5hbWUKKworY29uc3Qga21wX3N0YXRzX291dHB1dF9tb2R1bGU6OnJnYl9jb2xvciBrbXBfc3RhdHNfb3V0cHV0X21vZHVsZTo6Z2xvYmFsQ29sb3JBcnJheVtdID0geworICAgIHsxLjAsIDAuMCwgMC4wfSwgLy8gcmVkCisgICAgezEuMCwgMC42LCAwLjB9LCAvLyBvcmFuZ2UKKyAgICB7MS4wLCAxLjAsIDAuMH0sIC8vIHllbGxvdworICAgIHswLjAsIDEuMCwgMC4wfSwgLy8gZ3JlZW4gCisgICAgezAuMCwgMC4wLCAxLjB9LCAvLyBibHVlCisgICAgezAuNiwgMC4yLCAwLjh9LCAvLyBwdXJwbGUKKyAgICB7MS4wLCAwLjAsIDEuMH0sIC8vIG1hZ2VudGEKKyAgICB7MC4wLCAwLjQsIDAuMn0sIC8vIGRhcmsgZ3JlZW4KKyAgICB7MS4wLCAxLjAsIDAuNn0sIC8vIGxpZ2h0IHllbGxvdworICAgIHswLjYsIDAuNCwgMC42fSwgLy8gZGlydHkgcHVycGxlCisgICAgezAuMCwgMS4wLCAxLjB9LCAvLyBjeWFuCisgICAgezEuMCwgMC40LCAwLjh9LCAvLyBwaW5rCisgICAgezAuNSwgMC41LCAwLjV9LCAvLyBncmV5CisgICAgezAuOCwgMC43LCAwLjV9LCAvLyBicm93bgorICAgIHswLjYsIDAuNiwgMS4wfSwgLy8gbGlnaHQgYmx1ZQorICAgIHsxLjAsIDAuNywgMC41fSwgLy8gcGVhY2gKKyAgICB7MC44LCAwLjUsIDEuMH0sIC8vIGxhdmVuZGVyCisgICAgezAuNiwgMC4wLCAwLjB9LCAvLyBkYXJrIHJlZAorICAgIHswLjcsIDAuNiwgMC4wfSwgLy8gZ29sZAorICAgIHswLjAsIDAuMCwgMC4wfSAgLy8gYmxhY2sKK307CisKKy8vIEVuc3VyZSB0aGF0IHRoZSBhdGV4aXQgaGFuZGxlciBvbmx5IHJ1bnMgb25jZS4KK3N0YXRpYyB1aW50MzJfdCBzdGF0c1ByaW50ZWQgPSAwOworCisvLyBvdXRwdXQgaW50ZXJmYWNlCitzdGF0aWMga21wX3N0YXRzX291dHB1dF9tb2R1bGUgX19rbXBfc3RhdHNfZ2xvYmFsX291dHB1dDsKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqKioqKioqKioqKioqIHN0YXRpc3RpYyBtZW1iZXIgZnVuY3Rpb25zICoqKioqKioqKioqKiogKi8KKwordm9pZCBzdGF0aXN0aWM6OmFkZFNhbXBsZShkb3VibGUgc2FtcGxlKQoreworICAgIGRvdWJsZSBkZWx0YSA9IHNhbXBsZSAtIG1lYW5WYWw7CisKKyAgICBzYW1wbGVDb3VudCA9IHNhbXBsZUNvdW50ICsgMTsKKyAgICBtZWFuVmFsICAgICA9IG1lYW5WYWwgKyBkZWx0YS9zYW1wbGVDb3VudDsKKyAgICBtMiAgICAgICAgICA9IG0yICsgZGVsdGEqKHNhbXBsZSAtIG1lYW5WYWwpOworCisgICAgbWluVmFsID0gc3RkOjptaW4obWluVmFsLCBzYW1wbGUpOworICAgIG1heFZhbCA9IHN0ZDo6bWF4KG1heFZhbCwgc2FtcGxlKTsKK30KKworc3RhdGlzdGljICYgc3RhdGlzdGljOjpvcGVyYXRvcis9IChjb25zdCBzdGF0aXN0aWMgJiBvdGhlcikKK3sKKyAgICBpZiAoc2FtcGxlQ291bnQgPT0gMCkKKyAgICB7CisgICAgICAgICp0aGlzID0gb3RoZXI7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICB1aW50NjRfdCBuZXdTYW1wbGVDb3VudCA9IHNhbXBsZUNvdW50ICsgb3RoZXIuc2FtcGxlQ291bnQ7CisgICAgZG91YmxlIGRuc2MgID0gZG91YmxlKG5ld1NhbXBsZUNvdW50KTsKKyAgICBkb3VibGUgZHNjICAgPSBkb3VibGUoc2FtcGxlQ291bnQpOworICAgIGRvdWJsZSBkc2NCeWRuc2MgPSBkc2MvZG5zYzsKKyAgICBkb3VibGUgZG9zYyAgPSBkb3VibGUob3RoZXIuc2FtcGxlQ291bnQpOworICAgIGRvdWJsZSBkZWx0YSA9IG90aGVyLm1lYW5WYWwgLSBtZWFuVmFsOworCisgICAgLy8gVHJ5IHRvIG9yZGVyIHRoZXNlIGNhbGN1bGF0aW9ucyB0byBhdm9pZCBvdmVyZmxvd3MuCisgICAgLy8gSWYgdGhpcyB3ZXJlIEZvcnRyYW4sIHRoZW4gdGhlIGNvbXBpbGVyIHdvdWxkIG5vdCBiZSBhYmxlIHRvIHJlLW9yZGVyIG92ZXIgYnJhY2tldHMuCisgICAgLy8gSW4gQysrIGl0IG1heSBiZSBsZWdhbCB0byBkbyB0aGF0ICh3ZSBjZXJ0YWlubHkgaG9wZSBpdCBkb2Vzbid0LCBhbmQgQ0MrIFByb2dyYW1taW5nIExhbmd1YWdlIDJuZCBlZGl0aW9uCisgICAgLy8gc3VnZ2VzdHMgaXQgc2hvdWxkbid0LCBzaW5jZSBpdCBzYXlzIHRoYXQgZXhwbG9pdGF0aW9uIG9mIGFzc29jaWF0aXZpdHkgY2FuIG9ubHkgYmUgbWFkZSBpZiB0aGUgb3BlcmF0aW9uCisgICAgLy8gcmVhbGx5IGlzIGFzc29jaWF0aXZlICh3aGljaCBmbG9hdGluZyBhZGRpdGlvbiBpc24ndC4uLikpLgorICAgIG1lYW5WYWwgICAgID0gbWVhblZhbCpkc2NCeWRuc2MgKyBvdGhlci5tZWFuVmFsKigxLWRzY0J5ZG5zYyk7CisgICAgbTIgICAgICAgICAgPSBtMiArIG90aGVyLm0yICsgZHNjQnlkbnNjKmRvc2MqZGVsdGEqZGVsdGE7CisgICAgbWluVmFsICAgICAgPSBzdGQ6Om1pbiAobWluVmFsLCBvdGhlci5taW5WYWwpOworICAgIG1heFZhbCAgICAgID0gc3RkOjptYXggKG1heFZhbCwgb3RoZXIubWF4VmFsKTsKKyAgICBzYW1wbGVDb3VudCA9IG5ld1NhbXBsZUNvdW50OworCisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3ZvaWQgc3RhdGlzdGljOjpzY2FsZShkb3VibGUgZmFjdG9yKQoreworICAgIG1pblZhbCA9IG1pblZhbCpmYWN0b3I7CisgICAgbWF4VmFsID0gbWF4VmFsKmZhY3RvcjsKKyAgICBtZWFuVmFsPSBtZWFuVmFsKmZhY3RvcjsKKyAgICBtMiAgICAgPSBtMipmYWN0b3IqZmFjdG9yOworICAgIHJldHVybjsKK30KKworc3RkOjpzdHJpbmcgc3RhdGlzdGljOjpmb3JtYXQoY2hhciB1bml0LCBib29sIHRvdGFsKSBjb25zdAoreworICAgIHN0ZDo6c3RyaW5nIHJlc3VsdCA9IGZvcm1hdFNJKHNhbXBsZUNvdW50LDksJyAnKTsKKworICAgIHJlc3VsdCA9IHJlc3VsdCArIHN0ZDo6c3RyaW5nKCIsICIpICsgZm9ybWF0U0kobWluVmFsLCAgOSwgdW5pdCk7CisgICAgcmVzdWx0ID0gcmVzdWx0ICsgc3RkOjpzdHJpbmcoIiwgIikgKyBmb3JtYXRTSShtZWFuVmFsLCA5LCB1bml0KTsKKyAgICByZXN1bHQgPSByZXN1bHQgKyBzdGQ6OnN0cmluZygiLCAiKSArIGZvcm1hdFNJKG1heFZhbCwgIDksIHVuaXQpOworICAgIGlmICh0b3RhbCkKKyAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgc3RkOjpzdHJpbmcoIiwgIikgKyBmb3JtYXRTSShtZWFuVmFsKnNhbXBsZUNvdW50LCA5LCB1bml0KTsKKyAgICByZXN1bHQgPSByZXN1bHQgKyBzdGQ6OnN0cmluZygiLCAiKSArIGZvcm1hdFNJKGdldFNEKCksIDksIHVuaXQpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKioqKioqKioqKioqKiBleHBsaWNpdFRpbWVyIG1lbWJlciBmdW5jdGlvbnMgKioqKioqKioqKioqKiAqLworCit2b2lkIGV4cGxpY2l0VGltZXI6OnN0YXJ0KHRpbWVyX2UgdGltZXJFbnVtVmFsdWUpIHsgCisgICAgc3RhcnRUaW1lID0gdHNjX3RpY2tfY291bnQ6Om5vdygpOyAKKyAgICBpZih0aW1lU3RhdDo6bG9nRXZlbnQodGltZXJFbnVtVmFsdWUpKSB7CisgICAgICAgIF9fa21wX3N0YXRzX3RocmVhZF9wdHItPmluY3JlbWVudE5lc3RWYWx1ZSgpOworICAgIH0KKyAgICByZXR1cm47Cit9CisKK3ZvaWQgZXhwbGljaXRUaW1lcjo6c3RvcCh0aW1lcl9lIHRpbWVyRW51bVZhbHVlKSB7CisgICAgaWYgKHN0YXJ0VGltZS5nZXRWYWx1ZSgpID09IDApCisgICAgICAgIHJldHVybjsKKworICAgIHRzY190aWNrX2NvdW50IGZpbmlzaFRpbWUgPSB0c2NfdGlja19jb3VudDo6bm93KCk7CisKKyAgICAvL3N0YXQtPmFkZFNhbXBsZSAoKHRzY190aWNrX2NvdW50Ojpub3coKSAtIHN0YXJ0VGltZSkudGlja3MoKSk7CisgICAgc3RhdC0+YWRkU2FtcGxlICgoZmluaXNoVGltZSAtIHN0YXJ0VGltZSkudGlja3MoKSk7CisKKyAgICBpZih0aW1lU3RhdDo6bG9nRXZlbnQodGltZXJFbnVtVmFsdWUpKSB7CisgICAgICAgIF9fa21wX3N0YXRzX3RocmVhZF9wdHItPnB1c2hfZXZlbnQoc3RhcnRUaW1lLmdldFZhbHVlKCkgLSBfX2ttcF9zdGF0c19zdGFydF90aW1lLmdldFZhbHVlKCksIGZpbmlzaFRpbWUuZ2V0VmFsdWUoKSAtIF9fa21wX3N0YXRzX3N0YXJ0X3RpbWUuZ2V0VmFsdWUoKSwgX19rbXBfc3RhdHNfdGhyZWFkX3B0ci0+Z2V0TmVzdFZhbHVlKCksIHRpbWVyRW51bVZhbHVlKTsgCisgICAgICAgIF9fa21wX3N0YXRzX3RocmVhZF9wdHItPmRlY3JlbWVudE5lc3RWYWx1ZSgpOworICAgIH0KKworICAgIC8qIFdlIGFjY2VwdCB0aGUgcmlzayB0aGF0IHdlIGRyb3AgYSBzYW1wbGUgYmVjYXVzZSBpdCByZWFsbHkgZGlkIHN0YXJ0IGF0IHQ9PTAuICovCisgICAgc3RhcnRUaW1lID0gMDsgCisgICAgcmV0dXJuOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqKioqKioqKioqKioqIGttcF9zdGF0c19ldmVudF92ZWN0b3IgbWVtYmVyIGZ1bmN0aW9ucyAqKioqKioqKioqKioqICovCisKK3ZvaWQga21wX3N0YXRzX2V2ZW50X3ZlY3Rvcjo6ZGVhbGxvY2F0ZSgpIHsKKyAgICBfX2ttcF9mcmVlKGV2ZW50cyk7CisgICAgaW50ZXJuYWxfc2l6ZSA9IDA7CisgICAgYWxsb2NhdGVkX3NpemUgPSAwOworICAgIGV2ZW50cyA9IE5VTEw7Cit9CisKKy8vIFRoaXMgZnVuY3Rpb24gaXMgZm9yIHFzb3J0KCkgd2hpY2ggcmVxdWlyZXMgdGhlIGNvbXBhcmUgZnVuY3Rpb24gdG8gcmV0dXJuCisvLyBlaXRoZXIgYSBuZWdhdGl2ZSBudW1iZXIgaWYgZXZlbnQxIDwgZXZlbnQyLCBhIHBvc2l0aXZlIG51bWJlciBpZiBldmVudDEgPiBldmVudDIKKy8vIG9yIHplcm8gaWYgZXZlbnQxID09IGV2ZW50Mi4gIAorLy8gVGhpcyBzb3J0cyBieSBzdGFydCB0aW1lIChsb3dlc3QgdG8gaGlnaGVzdCkuCitpbnQgY29tcGFyZV90d29fZXZlbnRzKGNvbnN0IHZvaWQqIGV2ZW50MSwgY29uc3Qgdm9pZCogZXZlbnQyKSB7CisgICAga21wX3N0YXRzX2V2ZW50KiBldjEgPSAoa21wX3N0YXRzX2V2ZW50KilldmVudDE7CisgICAga21wX3N0YXRzX2V2ZW50KiBldjIgPSAoa21wX3N0YXRzX2V2ZW50KilldmVudDI7CisKKyAgICBpZihldjEtPmdldFN0YXJ0KCkgPCBldjItPmdldFN0YXJ0KCkpIHJldHVybiAtMTsKKyAgICBlbHNlIGlmKGV2MS0+Z2V0U3RhcnQoKSA+IGV2Mi0+Z2V0U3RhcnQoKSkgcmV0dXJuIDE7CisgICAgZWxzZSByZXR1cm4gMDsKK30KKwordm9pZCBrbXBfc3RhdHNfZXZlbnRfdmVjdG9yOjpzb3J0KCkgeworICAgIHFzb3J0KGV2ZW50cywgaW50ZXJuYWxfc2l6ZSwgc2l6ZW9mKGttcF9zdGF0c19ldmVudCksIGNvbXBhcmVfdHdvX2V2ZW50cyk7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqKioqKioqKioqKioqIGttcF9zdGF0c19saXN0IG1lbWJlciBmdW5jdGlvbnMgKioqKioqKioqKioqKiAqLworCisvLyByZXR1cm5zIGEgcG9pbnRlciB0byBuZXdseSBjcmVhdGVkIHN0YXRzIG5vZGUKK2ttcF9zdGF0c19saXN0KiBrbXBfc3RhdHNfbGlzdDo6cHVzaF9iYWNrKGludCBndGlkKSB7IAorICAgIGttcF9zdGF0c19saXN0KiBuZXdub2RlID0gKGttcF9zdGF0c19saXN0KilfX2ttcF9hbGxvY2F0ZShzaXplb2Yoa21wX3N0YXRzX2xpc3QpKTsKKyAgICAvLyBwbGFjZW1lbnQgbmV3LCBvbmx5IHJlcXVpcmVzIHNwYWNlIGFuZCBwb2ludGVyIGFuZCBpbml0aWFsaXplcyAoc28gX19rbXBfYWxsb2NhdGUgaW5zdGVhZCBvZiBDKysgbmV3W10gaXMgdXNlZCkKKyAgICBuZXcgKG5ld25vZGUpIGttcF9zdGF0c19saXN0KCk7CisgICAgbmV3bm9kZS0+c2V0R3RpZChndGlkKTsKKyAgICBuZXdub2RlLT5wcmV2ID0gdGhpcy0+cHJldjsKKyAgICBuZXdub2RlLT5uZXh0ID0gdGhpczsKKyAgICBuZXdub2RlLT5wcmV2LT5uZXh0ID0gbmV3bm9kZTsKKyAgICBuZXdub2RlLT5uZXh0LT5wcmV2ID0gbmV3bm9kZTsKKyAgICByZXR1cm4gbmV3bm9kZTsKK30KK3ZvaWQga21wX3N0YXRzX2xpc3Q6OmRlYWxsb2NhdGUoKSB7CisgICAga21wX3N0YXRzX2xpc3QqIHB0ciA9IHRoaXMtPm5leHQ7CisgICAga21wX3N0YXRzX2xpc3QqIGRlbHB0ciA9IHRoaXMtPm5leHQ7CisgICAgd2hpbGUocHRyICE9IHRoaXMpIHsKKyAgICAgICAgZGVscHRyID0gcHRyOworICAgICAgICBwdHI9cHRyLT5uZXh0OworICAgICAgICAvLyBwbGFjZW1lbnQgbmV3IG1lYW5zIHdlIGhhdmUgdG8gZXhwbGljaXRseSBjYWxsIGRlc3RydWN0b3IuCisgICAgICAgIGRlbHB0ci0+X2V2ZW50X3ZlY3Rvci5kZWFsbG9jYXRlKCk7CisgICAgICAgIGRlbHB0ci0+fmttcF9zdGF0c19saXN0KCk7CisgICAgICAgIF9fa21wX2ZyZWUoZGVscHRyKTsKKyAgICB9Cit9CitrbXBfc3RhdHNfbGlzdDo6aXRlcmF0b3Iga21wX3N0YXRzX2xpc3Q6OmJlZ2luKCkgeworICAgIGttcF9zdGF0c19saXN0OjppdGVyYXRvciBpdDsKKyAgICBpdC5wdHIgPSB0aGlzLT5uZXh0OworICAgIHJldHVybiBpdDsKK30KK2ttcF9zdGF0c19saXN0OjppdGVyYXRvciBrbXBfc3RhdHNfbGlzdDo6ZW5kKCkgeworICAgIGttcF9zdGF0c19saXN0OjppdGVyYXRvciBpdDsKKyAgICBpdC5wdHIgPSB0aGlzOworICAgIHJldHVybiBpdDsKK30KK2ludCBrbXBfc3RhdHNfbGlzdDo6c2l6ZSgpIHsKKyAgICBpbnQgcmV0dmFsOworICAgIGttcF9zdGF0c19saXN0OjppdGVyYXRvciBpdDsKKyAgICBmb3IocmV0dmFsPTAsIGl0PWJlZ2luKCk7IGl0IT1lbmQoKTsgaXQrKywgcmV0dmFsKyspIHt9CisgICAgcmV0dXJuIHJldHZhbDsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqKioqKioqKioqKioqIGttcF9zdGF0c19saXN0OjppdGVyYXRvciBtZW1iZXIgZnVuY3Rpb25zICoqKioqKioqKioqKiogKi8KKwora21wX3N0YXRzX2xpc3Q6Oml0ZXJhdG9yOjppdGVyYXRvcigpIDogcHRyKE5VTEwpIHt9IAora21wX3N0YXRzX2xpc3Q6Oml0ZXJhdG9yOjp+aXRlcmF0b3IoKSB7fQora21wX3N0YXRzX2xpc3Q6Oml0ZXJhdG9yIGttcF9zdGF0c19saXN0OjppdGVyYXRvcjo6b3BlcmF0b3IrKygpIHsKKyAgICB0aGlzLT5wdHIgPSB0aGlzLT5wdHItPm5leHQ7CisgICAgcmV0dXJuICp0aGlzOworfQora21wX3N0YXRzX2xpc3Q6Oml0ZXJhdG9yIGttcF9zdGF0c19saXN0OjppdGVyYXRvcjo6b3BlcmF0b3IrKyhpbnQgZHVtbXkpIHsKKyAgICB0aGlzLT5wdHIgPSB0aGlzLT5wdHItPm5leHQ7CisgICAgcmV0dXJuICp0aGlzOworfQora21wX3N0YXRzX2xpc3Q6Oml0ZXJhdG9yIGttcF9zdGF0c19saXN0OjppdGVyYXRvcjo6b3BlcmF0b3ItLSgpIHsKKyAgICB0aGlzLT5wdHIgPSB0aGlzLT5wdHItPnByZXY7CisgICAgcmV0dXJuICp0aGlzOworfQora21wX3N0YXRzX2xpc3Q6Oml0ZXJhdG9yIGttcF9zdGF0c19saXN0OjppdGVyYXRvcjo6b3BlcmF0b3ItLShpbnQgZHVtbXkpIHsKKyAgICB0aGlzLT5wdHIgPSB0aGlzLT5wdHItPnByZXY7CisgICAgcmV0dXJuICp0aGlzOworfQorYm9vbCBrbXBfc3RhdHNfbGlzdDo6aXRlcmF0b3I6Om9wZXJhdG9yIT0oY29uc3Qga21wX3N0YXRzX2xpc3Q6Oml0ZXJhdG9yICYgcmhzKSB7CisgICByZXR1cm4gdGhpcy0+cHRyIT1yaHMucHRyOyAKK30KK2Jvb2wga21wX3N0YXRzX2xpc3Q6Oml0ZXJhdG9yOjpvcGVyYXRvcj09KGNvbnN0IGttcF9zdGF0c19saXN0OjppdGVyYXRvciAmIHJocykgeworICAgcmV0dXJuIHRoaXMtPnB0cj09cmhzLnB0cjsgCit9CitrbXBfc3RhdHNfbGlzdCoga21wX3N0YXRzX2xpc3Q6Oml0ZXJhdG9yOjpvcGVyYXRvciooKSBjb25zdCB7CisgICAgcmV0dXJuIHRoaXMtPnB0cjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqKioqKioqKioqKioqICBrbXBfc3RhdHNfb3V0cHV0X21vZHVsZSBmdW5jdGlvbnMgKioqKioqKioqKioqKiogKi8KKworY29uc3QgY2hhcioga21wX3N0YXRzX291dHB1dF9tb2R1bGU6Om91dHB1dEZpbGVOYW1lID0gTlVMTDsKK2NvbnN0IGNoYXIqIGttcF9zdGF0c19vdXRwdXRfbW9kdWxlOjpldmVudHNGaWxlTmFtZSA9IE5VTEw7Citjb25zdCBjaGFyKiBrbXBfc3RhdHNfb3V0cHV0X21vZHVsZTo6cGxvdEZpbGVOYW1lICAgPSBOVUxMOworaW50IGttcF9zdGF0c19vdXRwdXRfbW9kdWxlOjpwcmludFBlclRocmVhZEZsYWcgICAgICAgPSAwOworaW50IGttcF9zdGF0c19vdXRwdXRfbW9kdWxlOjpwcmludFBlclRocmVhZEV2ZW50c0ZsYWcgPSAwOworCisvLyBpbml0KCkgaXMgY2FsbGVkIHZlcnkgbmVhciB0aGUgYmVnaW5uaW5nIG9mIGV4ZWN1dGlvbiB0aW1lIGluIHRoZSBjb25zdHJ1Y3RvciBvZiBfX2ttcF9zdGF0c19nbG9iYWxfb3V0cHV0Cit2b2lkIGttcF9zdGF0c19vdXRwdXRfbW9kdWxlOjppbml0KCkgCit7CisgICAgY2hhciAqIHN0YXRzRmlsZU5hbWUgID0gZ2V0ZW52KCJLTVBfU1RBVFNfRklMRSIpOworICAgIGV2ZW50c0ZpbGVOYW1lICAgICAgICA9IGdldGVudigiS01QX1NUQVRTX0VWRU5UU19GSUxFIik7CisgICAgcGxvdEZpbGVOYW1lICAgICAgICAgID0gZ2V0ZW52KCJLTVBfU1RBVFNfUExPVF9GSUxFIik7CisgICAgY2hhciAqIHRocmVhZFN0YXRzICAgID0gZ2V0ZW52KCJLTVBfU1RBVFNfVEhSRUFEUyIpOworICAgIGNoYXIgKiB0aHJlYWRFdmVudHMgICA9IGdldGVudigiS01QX1NUQVRTX0VWRU5UUyIpOworCisgICAgLy8gc2V0IHRoZSBzdGF0cyBvdXRwdXQgZmlsZW5hbWVzIGJhc2VkIG9uIGVudmlyb25tZW50IHZhcmlhYmxlcyBhbmQgZGVmYXVsdHMKKyAgICBvdXRwdXRGaWxlTmFtZSA9IHN0YXRzRmlsZU5hbWU7CisgICAgZXZlbnRzRmlsZU5hbWUgPSBldmVudHNGaWxlTmFtZSA/IGV2ZW50c0ZpbGVOYW1lIDogImV2ZW50cy5kYXQiOworICAgIHBsb3RGaWxlTmFtZSAgID0gcGxvdEZpbGVOYW1lICAgPyBwbG90RmlsZU5hbWUgICA6ICJldmVudHMucGx0IjsKKworICAgIC8vIHNldCB0aGUgZmxhZ3MgYmFzZWQgb24gZW52aXJvbm1lbnQgdmFyaWFibGVzIG1hdGNoaW5nOiB0cnVlLCBvbiwgMSwgLnRydWUuICwgLnQuICwgeWVzCisgICAgcHJpbnRQZXJUaHJlYWRGbGFnICAgICAgICA9IF9fa21wX3N0cl9tYXRjaF90cnVlKHRocmVhZFN0YXRzKTsKKyAgICBwcmludFBlclRocmVhZEV2ZW50c0ZsYWcgID0gX19rbXBfc3RyX21hdGNoX3RydWUodGhyZWFkRXZlbnRzKTsKKworICAgIGlmKHByaW50UGVyVGhyZWFkRXZlbnRzRmxhZykgeworICAgICAgICAvLyBhc3NpZ25zIGEgY29sb3IgdG8gZWFjaCB0aW1lciBmb3IgcHJpbnRpbmcKKyAgICAgICAgc2V0dXBFdmVudENvbG9ycygpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIHdpbGwgY2xlYXIgZmxhZyBzbyB0aGF0IG5vIGV2ZW50IHdpbGwgYmUgbG9nZ2VkCisgICAgICAgIHRpbWVTdGF0OjpjbGVhckV2ZW50RmxhZ3MoKTsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKK3ZvaWQga21wX3N0YXRzX291dHB1dF9tb2R1bGU6OnNldHVwRXZlbnRDb2xvcnMoKSB7CisgICAgaW50IGk7CisgICAgaW50IGdsb2JhbENvbG9ySW5kZXggPSAwOworICAgIGludCBudW1HbG9iYWxDb2xvcnMgPSBzaXplb2YoZ2xvYmFsQ29sb3JBcnJheSkgLyBzaXplb2YocmdiX2NvbG9yKTsKKyAgICBmb3IoaT0wO2k8VElNRVJfTEFTVDtpKyspIHsKKyAgICAgICAgaWYodGltZVN0YXQ6OmxvZ0V2ZW50KCh0aW1lcl9lKWkpKSB7CisgICAgICAgICAgICB0aW1lckNvbG9ySW5mb1tpXSA9IGdsb2JhbENvbG9yQXJyYXlbZ2xvYmFsQ29sb3JJbmRleF07CisgICAgICAgICAgICBnbG9iYWxDb2xvckluZGV4ID0gKGdsb2JhbENvbG9ySW5kZXgrMSklbnVtR2xvYmFsQ29sb3JzOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybjsKK30KKwordm9pZCBrbXBfc3RhdHNfb3V0cHV0X21vZHVsZTo6cHJpbnRTdGF0cyhGSUxFICpzdGF0c091dCwgc3RhdGlzdGljIGNvbnN0ICogdGhlU3RhdHMsIGJvb2wgYXJlVGltZXJzKQoreworICAgIGlmIChhcmVUaW1lcnMpCisgICAgeworICAgICAgICAvLyBDaGVjayBpZiB3ZSBoYXZlIHVzZWZ1bCB0aW1lcnMsIHNpbmNlIHdlIGRvbid0IHByaW50IHplcm8gdmFsdWUgdGltZXJzIHdlIG5lZWQgdG8gYXZvaWQKKyAgICAgICAgLy8gcHJpbnRpbmcgYSBoZWFkZXIgYW5kIHRoZW4gbm8gZGF0YS4KKyAgICAgICAgYm9vbCBoYXZlVGltZXJzID0gZmFsc2U7CisgICAgICAgIGZvciAoaW50IHMgPSAwOyBzPFRJTUVSX0xBU1Q7IHMrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHRoZVN0YXRzW3NdLmdldENvdW50KCkgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBoYXZlVGltZXJzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIWhhdmVUaW1lcnMpCisgICAgICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gUHJpbnQKKyAgICBjb25zdCBjaGFyICogdGl0bGUgPSBhcmVUaW1lcnMgPyAiVGltZXIsICAgICAgICAgICAgICAgICAgIFNhbXBsZUNvdW50LCIgOiAiQ291bnRlciwgICAgICAgICAgICAgICAgIFRocmVhZENvdW50LCI7CisgICAgZnByaW50ZiAoc3RhdHNPdXQsICIlcyAgICBNaW4sICAgICAgTWVhbiwgICAgICAgTWF4LCAgICAgVG90YWwsICAgICAgICBTRFxuIiwgdGl0bGUpOyAgICAKKyAgICBpZiAoYXJlVGltZXJzKSB7CisgICAgICAgIGZvciAoaW50IHMgPSAwOyBzPFRJTUVSX0xBU1Q7IHMrKykgeworICAgICAgICAgICAgc3RhdGlzdGljIGNvbnN0ICogc3RhdCA9ICZ0aGVTdGF0c1tzXTsKKyAgICAgICAgICAgIGlmIChzdGF0LT5nZXRDb3VudCgpICE9IDApIHsKKyAgICAgICAgICAgICAgICBjaGFyIHRhZyA9IHRpbWVTdGF0Ojpub1VuaXRzKHRpbWVyX2UocykpID8gJyAnIDogJ1QnOworICAgICAgICAgICAgICAgIGZwcmludGYgKHN0YXRzT3V0LCAiJS0yNXMsICVzXG4iLCB0aW1lU3RhdDo6bmFtZSh0aW1lcl9lKHMpKSwgc3RhdC0+Zm9ybWF0KHRhZywgdHJ1ZSkuY19zdHIoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeyAgIC8vIENvdW50ZXJzCisgICAgICAgIGZvciAoaW50IHMgPSAwOyBzPENPVU5URVJfTEFTVDsgcysrKSB7CisgICAgICAgICAgICBzdGF0aXN0aWMgY29uc3QgKiBzdGF0ID0gJnRoZVN0YXRzW3NdOworICAgICAgICAgICAgZnByaW50ZiAoc3RhdHNPdXQsICIlLTI1cywgJXNcbiIsIGNvdW50ZXI6Om5hbWUoY291bnRlcl9lKHMpKSwgc3RhdC0+Zm9ybWF0KCcgJywgdHJ1ZSkuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICB9Cit9IAorCit2b2lkIGttcF9zdGF0c19vdXRwdXRfbW9kdWxlOjpwcmludENvdW50ZXJzKEZJTEUgKiBzdGF0c091dCwgY291bnRlciBjb25zdCAqIHRoZUNvdW50ZXJzKQoreworICAgIC8vIFdlIHByaW50IGFsbCB0aGUgY291bnRlcnMgZXZlbiBpZiB0aGV5IGFyZSB6ZXJvLgorICAgIC8vIFRoYXQgbWFrZXMgaXQgZWFzaWVyIHRvIHNsaWNlIHRoZW0gaW50byBhIHNwcmVhZHNoZWV0IGlmIHlvdSBuZWVkIHRvLgorICAgIGZwcmludGYgKHN0YXRzT3V0LCAiXG5Db3VudGVyLCAgICAgICAgICAgICAgICAgICAgQ291bnRcbiIpOworICAgIGZvciAoaW50IGMgPSAwOyBjPENPVU5URVJfTEFTVDsgYysrKSB7CisgICAgICAgIGNvdW50ZXIgY29uc3QgKiBzdGF0ID0gJnRoZUNvdW50ZXJzW2NdOworICAgICAgICBmcHJpbnRmIChzdGF0c091dCwgIiUtMjVzLCAlc1xuIiwgY291bnRlcjo6bmFtZShjb3VudGVyX2UoYykpLCBmb3JtYXRTSShzdGF0LT5nZXRWYWx1ZSgpLCA5LCAnICcpLmNfc3RyKCkpOworICAgIH0KK30KKwordm9pZCBrbXBfc3RhdHNfb3V0cHV0X21vZHVsZTo6cHJpbnRFdmVudHMoRklMRSogZXZlbnRzT3V0LCBrbXBfc3RhdHNfZXZlbnRfdmVjdG9yKiB0aGVFdmVudHMsIGludCBndGlkKSB7CisgICAgLy8gc29ydCBieSBzdGFydCB0aW1lIGJlZm9yZSBwcmludGluZworICAgIHRoZUV2ZW50cy0+c29ydCgpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhlRXZlbnRzLT5zaXplKCk7IGkrKykgeworICAgICAgICBrbXBfc3RhdHNfZXZlbnQgZXYgPSB0aGVFdmVudHMtPmF0KGkpOworICAgICAgICByZ2JfY29sb3IgY29sb3IgPSBnZXRFdmVudENvbG9yKGV2LmdldFRpbWVyTmFtZSgpKTsKKyAgICAgICAgZnByaW50ZihldmVudHNPdXQsICIlZCAlbHUgJWx1ICUxLjFmIHJnYiglMS4xZiwlMS4xZiwlMS4xZikgJXNcbiIsIAorICAgICAgICAgICAgICAgIGd0aWQsIAorICAgICAgICAgICAgICAgIGV2LmdldFN0YXJ0KCksIAorICAgICAgICAgICAgICAgIGV2LmdldFN0b3AoKSwgCisgICAgICAgICAgICAgICAgMS4yIC0gKGV2LmdldE5lc3RMZXZlbCgpICogMC4yKSwKKyAgICAgICAgICAgICAgICBjb2xvci5yLCBjb2xvci5nLCBjb2xvci5iLAorICAgICAgICAgICAgICAgIHRpbWVTdGF0OjpuYW1lKGV2LmdldFRpbWVyTmFtZSgpKQorICAgICAgICAgICAgICAgKTsKKyAgICB9CisgICAgcmV0dXJuOworfQorCit2b2lkIGttcF9zdGF0c19vdXRwdXRfbW9kdWxlOjp3aW5kdXBFeHBsaWNpdFRpbWVycygpCit7CisgICAgLy8gV2luZCB1cCBhbnkgZXhwbGljaXQgdGltZXJzLiBXZSBhc3N1bWUgdGhhdCBpdCdzIGZhaXIgYXQgdGhpcyBwb2ludCB0byBqdXN0IHdhbGsgYWxsIHRoZSBleHBsY2l0IHRpbWVycyBpbiBhbGwgdGhyZWFkcyAKKyAgICAvLyBhbmQgc2F5ICJpdCdzIG92ZXIiLgorICAgIC8vIElmIHRoZSB0aW1lciB3YXNuJ3QgcnVubmluZywgdGhpcyB3b24ndCByZWNvcmQgYW55dGhpbmcgYW55d2F5LgorICAgIGttcF9zdGF0c19saXN0OjppdGVyYXRvciBpdDsKKyAgICBmb3IoaXQgPSBfX2ttcF9zdGF0c19saXN0LmJlZ2luKCk7IGl0ICE9IF9fa21wX3N0YXRzX2xpc3QuZW5kKCk7IGl0KyspIHsKKyAgICAgICAgZm9yIChpbnQgdGltZXI9MDsgdGltZXI8RVhQTElDSVRfVElNRVJfTEFTVDsgdGltZXIrKykgeworICAgICAgICAgICAgKCppdCktPmdldEV4cGxpY2l0VGltZXIoZXhwbGljaXRfdGltZXJfZSh0aW1lcikpLT5zdG9wKCh0aW1lcl9lKXRpbWVyKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBrbXBfc3RhdHNfb3V0cHV0X21vZHVsZTo6cHJpbnRQbG90aWN1c0ZpbGUoKSB7CisgICAgaW50IGk7CisgICAgaW50IHNpemUgPSBfX2ttcF9zdGF0c19saXN0LnNpemUoKTsKKyAgICBGSUxFKiBwbG90T3V0ID0gZm9wZW4ocGxvdEZpbGVOYW1lLCAidysiKTsKKworICAgIGZwcmludGYocGxvdE91dCwgIiNwcm9jIHBhZ2VcbiIKKyAgICAgICAgICAgICAgICAgICAgICIgICBwYWdlc2l6ZTogMTUgMTBcbiIKKyAgICAgICAgICAgICAgICAgICAgICIgICBzY2FsZTogMS4wXG5cbiIpOworCisgICAgZnByaW50ZihwbG90T3V0LCAiI3Byb2MgZ2V0ZGF0YVxuIgorICAgICAgICAgICAgICAgICAgICAgIiAgIGZpbGU6ICVzXG5cbiIsIAorICAgICAgICAgICAgICAgICAgICAgZXZlbnRzRmlsZU5hbWUpOworCisgICAgZnByaW50ZihwbG90T3V0LCAiI3Byb2MgYXJlYWRlZlxuIgorICAgICAgICAgICAgICAgICAgICAgIiAgIHRpdGxlOiBPcGVuTVAgU2FtcGxpbmcgVGltZWxpbmVcbiIKKyAgICAgICAgICAgICAgICAgICAgICIgICB0aXRsZWRldGFpbHM6IGFsaWduPWNlbnRlciBzaXplPTE2XG4iCisgICAgICAgICAgICAgICAgICAgICAiICAgcmVjdGFuZ2xlOiAxIDEgMTMgOVxuIgorICAgICAgICAgICAgICAgICAgICAgIiAgIHhhdXRvcmFuZ2U6IGRhdGFmaWVsZD0yLDNcbiIKKyAgICAgICAgICAgICAgICAgICAgICIgICB5YXV0b3JhbmdlOiAtMSAlZFxuXG4iLCAKKyAgICAgICAgICAgICAgICAgICAgIHNpemUpOworCisgICAgZnByaW50ZihwbG90T3V0LCAiI3Byb2MgeGF4aXNcbiIKKyAgICAgICAgICAgICAgICAgICAgICIgICBzdHViczogaW5jXG4iCisgICAgICAgICAgICAgICAgICAgICAiICAgc3R1YmRldGFpbHM6IHNpemU9MTJcbiIKKyAgICAgICAgICAgICAgICAgICAgICIgICBsYWJlbDogVGltZSAodGlja3MpXG4iCisgICAgICAgICAgICAgICAgICAgICAiICAgbGFiZWxkZXRhaWxzOiBzaXplPTE0XG5cbiIpOworCisgICAgZnByaW50ZihwbG90T3V0LCAiI3Byb2MgeWF4aXNcbiIKKyAgICAgICAgICAgICAgICAgICAgICIgICBzdHViczogaW5jIDFcbiIKKyAgICAgICAgICAgICAgICAgICAgICIgICBzdHVicmFuZ2U6IDAgJWRcbiIKKyAgICAgICAgICAgICAgICAgICAgICIgICBzdHViZGV0YWlsczogc2l6ZT0xMlxuIgorICAgICAgICAgICAgICAgICAgICAgIiAgIGxhYmVsOiBUaHJlYWQgI1xuIgorICAgICAgICAgICAgICAgICAgICAgIiAgIGxhYmVsZGV0YWlsczogc2l6ZT0xNFxuXG4iLCAKKyAgICAgICAgICAgICAgICAgICAgIHNpemUtMSk7CisKKyAgICBmcHJpbnRmKHBsb3RPdXQsICIjcHJvYyBiYXJzXG4iCisgICAgICAgICAgICAgICAgICAgICAiICAgZXhhY3Rjb2xvcmZpZWxkOiA1XG4iCisgICAgICAgICAgICAgICAgICAgICAiICAgYXhpczogeFxuIgorICAgICAgICAgICAgICAgICAgICAgIiAgIGxvY2ZpZWxkOiAxXG4iCisgICAgICAgICAgICAgICAgICAgICAiICAgc2VnbWVudGZpZWxkczogMiAzXG4iCisgICAgICAgICAgICAgICAgICAgICAiICAgYmFyd2lkdGhmaWVsZDogNFxuXG4iKTsKKworICAgIC8vIGNyZWF0ZSBsZWdlbmQgZW50cmllcyBjb3JyZXNwb25kaW5nIHRvIHRoZSB0aW1lciBjb2xvcgorICAgIGZvcihpPTA7aTxUSU1FUl9MQVNUO2krKykgeworICAgICAgICBpZih0aW1lU3RhdDo6bG9nRXZlbnQoKHRpbWVyX2UpaSkpIHsKKyAgICAgICAgICAgIHJnYl9jb2xvciBjID0gZ2V0RXZlbnRDb2xvcigodGltZXJfZSlpKTsKKyAgICAgICAgICAgIGZwcmludGYocGxvdE91dCwgIiNwcm9jIGxlZ2VuZGVudHJ5XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICBzYW1wbGV0eXBlOiBjb2xvclxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgbGFiZWw6ICVzXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICBkZXRhaWxzOiByZ2IoJTEuMWYsJTEuMWYsJTEuMWYpXG5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVTdGF0OjpuYW1lKCh0aW1lcl9lKWkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLnIsIGMuZywgYy5iKTsKKworICAgICAgICB9CisgICAgfQorCisgICAgZnByaW50ZihwbG90T3V0LCAiI3Byb2MgbGVnZW5kXG4iCisgICAgICAgICAgICAgICAgICAgICAiICAgZm9ybWF0OiBkb3duXG4iCisgICAgICAgICAgICAgICAgICAgICAiICAgbG9jYXRpb246IG1heCBtYXhcblxuIik7CisgICAgZmNsb3NlKHBsb3RPdXQpOworICAgIHJldHVybjsKK30KKwordm9pZCBrbXBfc3RhdHNfb3V0cHV0X21vZHVsZTo6b3V0cHV0U3RhdHMoY29uc3QgY2hhciogaGVhZGluZykgCit7CisgICAgc3RhdGlzdGljIGFsbFN0YXRzW1RJTUVSX0xBU1RdOworICAgIHN0YXRpc3RpYyBhbGxDb3VudGVyc1tDT1VOVEVSX0xBU1RdOworCisgICAgLy8gc3RvcCBhbGwgdGhlIGV4cGxpY2l0IHRpbWVycyBmb3IgYWxsIHRocmVhZHMKKyAgICB3aW5kdXBFeHBsaWNpdFRpbWVycygpOworCisgICAgRklMRSAqIGV2ZW50c091dDsKKyAgICBGSUxFICogc3RhdHNPdXQgPSBvdXRwdXRGaWxlTmFtZSA/IGZvcGVuIChvdXRwdXRGaWxlTmFtZSwgImErIikgOiBzdGRlcnI7CisKKyAgICBpZiAoZXZlbnRQcmludGluZ0VuYWJsZWQoKSkgeworICAgICAgICBldmVudHNPdXQgPSBmb3BlbihldmVudHNGaWxlTmFtZSwgIncrIik7CisgICAgfQorCisgICAgaWYgKCFzdGF0c091dCkKKyAgICAgICAgc3RhdHNPdXQgPSBzdGRlcnI7CisKKyAgICBmcHJpbnRmKHN0YXRzT3V0LCAiJXNcbiIsaGVhZGluZyk7CisgICAgLy8gQWNjdW11bGF0ZSBhY3Jvc3MgdGhyZWFkcy4KKyAgICBrbXBfc3RhdHNfbGlzdDo6aXRlcmF0b3IgaXQ7CisgICAgZm9yIChpdCA9IF9fa21wX3N0YXRzX2xpc3QuYmVnaW4oKTsgaXQgIT0gX19rbXBfc3RhdHNfbGlzdC5lbmQoKTsgaXQrKykgeworICAgICAgICBpbnQgdCA9ICgqaXQpLT5nZXRHdGlkKCk7CisgICAgICAgIC8vIE91dHB1dCBwZXIgdGhyZWFkIHN0YXRzIGlmIHJlcXVlc3RlZC4KKyAgICAgICAgaWYgKHBlclRocmVhZFByaW50aW5nRW5hYmxlZCgpKSB7CisgICAgICAgICAgICBmcHJpbnRmIChzdGF0c091dCwgIlRocmVhZCAlZFxuIiwgdCk7CisgICAgICAgICAgICBwcmludFN0YXRzKHN0YXRzT3V0LCAoKml0KS0+Z2V0VGltZXJzKCksIHRydWUpOworICAgICAgICAgICAgcHJpbnRDb3VudGVycyhzdGF0c091dCwgKCppdCktPmdldENvdW50ZXJzKCkpOworICAgICAgICAgICAgZnByaW50ZihzdGF0c091dCwiXG4iKTsKKyAgICAgICAgfQorICAgICAgICAvLyBPdXRwdXQgcGVyIHRocmVhZCBldmVudHMgaWYgcmVxdWVzdGVkLgorICAgICAgICBpZiAoZXZlbnRQcmludGluZ0VuYWJsZWQoKSkgeworICAgICAgICAgICAga21wX3N0YXRzX2V2ZW50X3ZlY3RvciBldmVudHMgPSAoKml0KS0+Z2V0RXZlbnRWZWN0b3IoKTsKKyAgICAgICAgICAgIHByaW50RXZlbnRzKGV2ZW50c091dCwgJmV2ZW50cywgdCk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGludCBzID0gMDsgczxUSU1FUl9MQVNUOyBzKyspIHsKKyAgICAgICAgICAgIC8vIFNlZSBpZiB3ZSBzaG91bGQgaWdub3JlIHRoaXMgdGltZXIgd2hlbiBhZ2dyZWdhdGluZworICAgICAgICAgICAgaWYgKCh0aW1lU3RhdDo6bWFzdGVyT25seSh0aW1lcl9lKHMpKSAmJiAodCAhPSAwKSkgfHwgLy8gVGltZXIgaXMgb25seSB2YWxpZCBvbiB0aGUgbWFzdGVyIGFuZCB0aGlzIHRocmVhZCBpcyBhIHdvcmtlcgorICAgICAgICAgICAgICAgICh0aW1lU3RhdDo6d29ya2VyT25seSh0aW1lcl9lKHMpKSAmJiAodCA9PSAwKSkgfHwgLy8gVGltZXIgaXMgb25seSB2YWxpZCBvbiBhIHdvcmtlciBhbmQgdGhpcyB0aHJlYWQgaXMgdGhlIG1hc3RlcgorICAgICAgICAgICAgICAgIHRpbWVTdGF0OjpzeW50aGVzaXplZCh0aW1lcl9lKHMpKSAgICAgICAgICAgICAgICAgLy8gSXQncyBhIHN5bnRoZXNpemVkIHN0YXQsIHNvIHRoZXJlJ3Mgbm8gcmF3IGRhdGEgZm9yIGl0LgorICAgICAgICAgICAgICAgKSAgICAgICAgICAgIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0aXN0aWMgKiB0aHJlYWRTdGF0ID0gKCppdCktPmdldFRpbWVyKHRpbWVyX2UocykpOworICAgICAgICAgICAgYWxsU3RhdHNbc10gKz0gKnRocmVhZFN0YXQ7CisgICAgICAgIH0KKworICAgICAgICAvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciBzeW50aGVzaXplZCBzdGF0aXN0aWNzLgorICAgICAgICAvLyBUaGVzZSBqdXN0IGhhdmUgdG8gYmUgY29kZWQgc3BlY2lhbGx5IGhlcmUgZm9yIG5vdy4gCisgICAgICAgIC8vIEF0IHByZXNlbnQgd2Ugb25seSBoYXZlIG9uZTogdGhlIHRvdGFsIHBhcmFsbGVsIHdvcmsgZG9uZSBpbiBlYWNoIHRocmVhZC4KKyAgICAgICAgLy8gVGhlIHZhcmlhbmNlIGhlcmUgbWFrZXMgaXQgZWFzeSB0byBzZWUgbG9hZCBpbWJhbGFuY2Ugb3ZlciB0aGUgd2hvbGUgcHJvZ3JhbSAodGhvdWdoLCBvZiBjb3Vyc2UsCisgICAgICAgIC8vIGl0J3MgcG9zc2libGUgdG8gaGF2ZSBhIGNvZGUgd2l0aCBhd2Z1bCBsb2FkIGJhbGFuY2UgaW4gZXZlcnkgcGFyYWxsZWwgcmVnaW9uIGJ1dCBwZXJmZWN0IGxvYWQKKyAgICAgICAgLy8gYmFsYW5jZSBvZXZlciB0aGUgd2hvbGUgcHJvZ3JhbS4pCisgICAgICAgIGFsbFN0YXRzW1RJTUVSX1RvdGFsX3dvcmtdLmFkZFNhbXBsZSAoKCppdCktPmdldFRpbWVyKFRJTUVSX09NUF93b3JrKS0+Z2V0VG90YWwoKSk7CisKKyAgICAgICAgLy8gVGltZSB3YWl0aW5nIGZvciB3b3JrIChzeW50aGVzaXplZCkKKyAgICAgICAgaWYgKCh0ICE9IDApIHx8ICF0aW1lU3RhdDo6d29ya2VyT25seSh0aW1lcl9lKFRJTUVSX09NUF9hd2FpdF93b3JrKSkpCisgICAgICAgICAgICBhbGxTdGF0c1tUSU1FUl9Ub3RhbF9hd2FpdF93b3JrXS5hZGRTYW1wbGUgKCgqaXQpLT5nZXRUaW1lcihUSU1FUl9PTVBfYXdhaXRfd29yayktPmdldFRvdGFsKCkpOworCisgICAgICAgIC8vIFRpbWUgaW4gZXhwbGljaXQgYmFycmllcnMuCisgICAgICAgIGFsbFN0YXRzW1RJTUVSX1RvdGFsX2JhcnJpZXJdLmFkZFNhbXBsZSAoKCppdCktPmdldFRpbWVyKFRJTUVSX09NUF9iYXJyaWVyKS0+Z2V0VG90YWwoKSk7CisKKyAgICAgICAgZm9yIChpbnQgYyA9IDA7IGM8Q09VTlRFUl9MQVNUOyBjKyspIHsKKyAgICAgICAgICAgIGlmIChjb3VudGVyOjptYXN0ZXJPbmx5KGNvdW50ZXJfZShjKSkgJiYgdCAhPSAwKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgYWxsQ291bnRlcnNbY10uYWRkU2FtcGxlICgoKml0KS0+Z2V0Q291bnRlcihjb3VudGVyX2UoYykpLT5nZXRWYWx1ZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChldmVudFByaW50aW5nRW5hYmxlZCgpKSB7CisgICAgICAgIHByaW50UGxvdGljdXNGaWxlKCk7CisgICAgICAgIGZjbG9zZShldmVudHNPdXQpOworICAgIH0KKworICAgIGZwcmludGYgKHN0YXRzT3V0LCAiQWdncmVnYXRlIGZvciBhbGwgdGhyZWFkc1xuIik7CisgICAgcHJpbnRTdGF0cyAoc3RhdHNPdXQsICZhbGxTdGF0c1swXSwgdHJ1ZSk7CisgICAgZnByaW50ZiAoc3RhdHNPdXQsICJcbiIpOworICAgIHByaW50U3RhdHMgKHN0YXRzT3V0LCAmYWxsQ291bnRlcnNbMF0sIGZhbHNlKTsKKworICAgIGlmIChzdGF0c091dCAhPSBzdGRlcnIpCisgICAgICAgIGZjbG9zZShzdGF0c091dCk7CisKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICoqKioqKioqKioqKiogIGV4cG9ydGVkIEMgZnVuY3Rpb25zICoqKioqKioqKioqKioqICovCisKKy8vIG5vIG5hbWUgbWFuZ2xpbmcgZm9yIHRoZXNlIGZ1bmN0aW9ucywgd2Ugd2FudCB0aGUgYyBmaWxlcyB0byBiZSBhYmxlIHRvIGdldCBhdCB0aGVzZSBmdW5jdGlvbnMKK2V4dGVybiAiQyIgeworCit2b2lkIF9fa21wX3Jlc2V0X3N0YXRzKCkKK3sKKyAgICBrbXBfc3RhdHNfbGlzdDo6aXRlcmF0b3IgaXQ7CisgICAgZm9yKGl0ID0gX19rbXBfc3RhdHNfbGlzdC5iZWdpbigpOyBpdCAhPSBfX2ttcF9zdGF0c19saXN0LmVuZCgpOyBpdCsrKSB7CisgICAgICAgIHRpbWVTdGF0ICogdGltZXJzICAgICA9ICgqaXQpLT5nZXRUaW1lcnMoKTsKKyAgICAgICAgY291bnRlciAqIGNvdW50ZXJzICAgID0gKCppdCktPmdldENvdW50ZXJzKCk7CisgICAgICAgIGV4cGxpY2l0VGltZXIgKiBlVGltZXJzID0gKCppdCktPmdldEV4cGxpY2l0VGltZXJzKCk7CisKKyAgICAgICAgZm9yIChpbnQgdCA9IDA7IHQ8VElNRVJfTEFTVDsgdCsrKQorICAgICAgICAgICAgdGltZXJzW3RdLnJlc2V0KCk7CisKKyAgICAgICAgZm9yIChpbnQgYyA9IDA7IGM8Q09VTlRFUl9MQVNUOyBjKyspCisgICAgICAgICAgICBjb3VudGVyc1tjXS5yZXNldCgpOworCisgICAgICAgIGZvciAoaW50IHQ9MDsgdDxFWFBMSUNJVF9USU1FUl9MQVNUOyB0KyspCisgICAgICAgICAgICBlVGltZXJzW3RdLnJlc2V0KCk7CisKKyAgICAgICAgLy8gcmVzZXQgdGhlIGV2ZW50IHZlY3RvciBzbyBhbGwgcHJldmlvdXMgZXZlbnRzIGFyZSAiZXJhc2VkIgorICAgICAgICAoKml0KS0+cmVzZXRFdmVudFZlY3RvcigpOworCisgICAgICAgIC8vIE1heSBuZWVkIHRvIHJlc3RhcnQgdGhlIGV4cGxpY2l0IHRpbWVycyBpbiB0aHJlYWQgemVybz8KKyAgICB9CisgICAgS01QX1NUQVJUX0VYUExJQ0lUX1RJTUVSKE9NUF9zZXJpYWwpOworICAgIEtNUF9TVEFSVF9FWFBMSUNJVF9USU1FUihPTVBfc3RhcnRfZW5kKTsKK30KKworLy8gVGhpcyBmdW5jdGlvbiB3aWxsIHJlc2V0IGFsbCBzdGF0cyBhbmQgc3RvcCBhbGwgdGhyZWFkcycgZXhwbGljaXQgdGltZXJzIGlmIHRoZXkgaGF2ZW4ndCBiZWVuIHN0b3BwZWQgYWxyZWFkeS4KK3ZvaWQgX19rbXBfb3V0cHV0X3N0YXRzKGNvbnN0IGNoYXIgKiBoZWFkaW5nKQoreworICAgIF9fa21wX3N0YXRzX2dsb2JhbF9vdXRwdXQub3V0cHV0U3RhdHMoaGVhZGluZyk7CisgICAgX19rbXBfcmVzZXRfc3RhdHMoKTsKK30KKwordm9pZCBfX2ttcF9hY2N1bXVsYXRlX3N0YXRzX2F0X2V4aXQodm9pZCkKK3sKKyAgICAvLyBPbmx5IGRvIHRoaXMgb25jZS4KKyAgICBpZiAoS01QX1hDSEdfRklYRUQzMigmc3RhdHNQcmludGVkLCAxKSAhPSAwKQorICAgICAgICByZXR1cm47CisKKyAgICBfX2ttcF9vdXRwdXRfc3RhdHMoIlN0YXRpc3RpY3Mgb24gZXhpdCIpOworICAgIHJldHVybjsKK30KKwordm9pZCBfX2ttcF9zdGF0c19pbml0KHZvaWQpIAoreworICAgIHJldHVybjsKK30KKworfSAvLyBleHRlcm4gIkMiIAorCisjZW5kaWYgLy8gS01QX1NUQVRTX0VOQUJMRUQKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9zdGF0cy5oIGIvZmluYWwvcnVudGltZS9zcmMva21wX3N0YXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgwNGNiNQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9zdGF0cy5oCkBAIC0wLDAgKzEsNzA2IEBACisjaWZuZGVmIEtNUF9TVEFUU19ICisjZGVmaW5lIEtNUF9TVEFUU19ICisKKy8qKiBAZmlsZSBrbXBfc3RhdHMuaAorICogRnVuY3Rpb25zIGZvciBjb2xsZWN0aW5nIHN0YXRpc3RpY3MuCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZiBLTVBfU1RBVFNfRU5BQkxFRAorLyoKKyAqIFN0YXRpc3RpY3MgYWNjdW11bGF0b3IuCisgKiBBY2N1bXVsYXRlcyBudW1iZXIgb2Ygc2FtcGxlcyBhbmQgY29tcHV0ZXMgbWluLCBtYXgsIG1lYW4sIHN0YW5kYXJkIGRldmlhdGlvbiBvbiB0aGUgZmx5LgorICoKKyAqIE9ubGluZSB2YXJpYW5jZSBjYWxjdWxhdGlvbiBhbGdvcml0aG0gZnJvbSBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0FsZ29yaXRobXNfZm9yX2NhbGN1bGF0aW5nX3ZhcmlhbmNlI09uLWxpbmVfYWxnb3JpdGhtCisgKi8KKworI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPG5ldz4gLy8gcGxhY2VtZW50IG5ldworI2luY2x1ZGUgImttcF9zdGF0c190aW1pbmcuaCIKKworCisvKiEKKyAqIEBpbmdyb3VwIFNUQVRTX0dBVEhFUklORworICogXGJyaWVmIGZsYWdzIHRvIGRlc2NyaWJlIHRoZSBzdGF0aXN0aWMgKCB0aW1lcnMgb3IgY291bnRlciApCisgKgorKi8KK2NsYXNzIHN0YXRzX2ZsYWdzX2UgeworICAgIHB1YmxpYzoKKyAgICAgICAgY29uc3Qgc3RhdGljIGludCBvbmx5SW5NYXN0ZXIgPSAxPDwwOyAvLyE8IHN0YXRpc3RpYyBpcyB2YWxpZCBvbmx5IGZvciBtYXN0ZXIKKyAgICAgICAgY29uc3Qgc3RhdGljIGludCBub1VuaXRzICAgICAgPSAxPDwxOyAvLyE8IHN0YXRpc3RpYyBkb2Vzbid0IG5lZWQgdW5pdHMgcHJpbnRlZCBuZXh0IHRvIGl0IGluIG91dHB1dAorICAgICAgICBjb25zdCBzdGF0aWMgaW50IHN5bnRoZXNpemVkICA9IDE8PDI7IC8vITwgc3RhdGlzdGljJ3MgdmFsdWUgaXMgY3JlYXRlZCBhdGV4aXQgdGltZSBpbiB0aGUgX19rbXBfb3V0cHV0X3N0YXRzIGZ1bmN0aW9uCisgICAgICAgIGNvbnN0IHN0YXRpYyBpbnQgbm90SW5NYXN0ZXIgID0gMTw8MzsgLy8hPCBzdGF0aXN0aWMgaXMgdmFsaWQgZm9yIG5vbi1tYXN0ZXIgdGhyZWFkcworICAgICAgICBjb25zdCBzdGF0aWMgaW50IGxvZ0V2ZW50ICAgICA9IDE8PDQ7IC8vITwgc3RhdGlzdGljIGNhbiBiZSBsb2dnZWQgd2hlbiBLTVBfU1RBVFNfRVZFTlRTIGlzIG9uICh2YWxpZCBvbmx5IGZvciB0aW1lcnMpCit9OworCisvKiEKKyAqIFxicmllZiBBZGQgbmV3IGNvdW50ZXJzIHVuZGVyIEtNUF9GT1JFQUNIX0NPVU5URVIoKSBtYWNybyBpbiBrbXBfc3RhdHMuaAorICoKKyAqIEBwYXJhbSBtYWNybyBhIHVzZXIgZGVmaW5lZCBtYWNybyB0aGF0IHRha2VzIHRocmVlIGFyZ3VtZW50cyAtIG1hY3JvKENPVU5URVJfTkFNRSwgZmxhZ3MsIGFyZykKKyAqIEBwYXJhbSBhcmcgYSB1c2VyIGRlZmluZWQgYXJndW1lbnQgdG8gc2VuZCB0byB0aGUgdXNlciBkZWZpbmVkIG1hY3JvCisgKgorICogXGRldGFpbHMgQSBjb3VudGVyIGNvdW50cyB0aGUgb2NjdXJlbmNlIG9mIHNvbWUgZXZlbnQuCisgKiBFYWNoIHRocmVhZCBhY2N1bXVsYXRlcyBpdHMgb3duIGNvdW50LCBhdCB0aGUgZW5kIG9mIGV4ZWN1dGlvbiB0aGUgY291bnRzIGFyZSBhZ2dyZWdhdGVkIHRyZWF0aW5nIGVhY2ggdGhyZWFkCisgKiBhcyBhIHNlcGFyYXRlIG1lYXN1cmVtZW50LiAoVW5sZXNzIG9ubHlJbk1hc3RlciBpcyBzZXQsIGluIHdoaWNoIGNhc2UgdGhlcmUncyBvbmx5IGEgc2luZ2xlIG1lYXN1cmVtZW50KS4KKyAqIFRoZSBtaW4sbWVhbixtYXggYXJlIHRoZXJlZm9yZSB0aGUgdmFsdWVzIGZvciB0aGUgdGhyZWFkcy4KKyAqIEFkZGluZyB0aGUgY291bnRlciBoZXJlIGFuZCB0aGVuIHB1dHRpbmcgaW4gYSBLTVBfQkxPQ0tfQ09VTlRFUihuYW1lKSBpcyBhbGwgeW91IG5lZWQgdG8gZG8uCisgKiBBbGwgb2YgdGhlIHRhYmxlcyBhbmQgcHJpbnRpbmcgaXMgZ2VuZXJhdGVkIGZyb20gdGhpcyBtYWNyby4KKyAqIEZvcm1hdCBpcyAibWFjcm8obmFtZSwgZmxhZ3MsIGFyZykiCisgKgorICogQGluZ3JvdXAgU1RBVFNfR0FUSEVSSU5HCisqLworI2RlZmluZSBLTVBfRk9SRUFDSF9DT1VOVEVSKG1hY3JvLCBhcmcpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoT01QX1BBUkFMTEVMLCBzdGF0c19mbGFnc19lOjpvbmx5SW5NYXN0ZXIsIGFyZykgICAgICBcCisgICAgbWFjcm8gKE9NUF9GT1Jfc3RhdGljLCAwLCBhcmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChPTVBfRk9SX2R5bmFtaWMsIDAsIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoT01QX0RJU1RSX0ZPUl9zdGF0aWMsIDAsIGFyZykgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKE9NUF9ESVNUUl9GT1JfZHluYW1pYywgMCwgYXJnKSAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChPTVBfQkFSUklFUiwgMCwgYXJnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoT01QX0NSSVRJQ0FMLDAsIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKE9NUF9TSU5HTEUsIDAsIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChPTVBfTUFTVEVSLCAwLCBhcmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoT01QX3NldF9sb2NrLCAwLCBhcmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKE9NUF90ZXN0X2xvY2ssIDAsIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChPTVBfdGVzdF9sb2NrX2ZhaWx1cmUsIDAsIGFyZykgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoUkVEVUNFX3dhaXQsIDAsIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKFJFRFVDRV9ub3dhaXQsIDAsIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChMQVNULDAsYXJnKQorCisvKiEKKyAqIFxicmllZiBBZGQgbmV3IHRpbWVycyB1bmRlciBLTVBfRk9SRUFDSF9USU1FUigpIG1hY3JvIGluIGttcF9zdGF0cy5oCisgKgorICogQHBhcmFtIG1hY3JvIGEgdXNlciBkZWZpbmVkIG1hY3JvIHRoYXQgdGFrZXMgdGhyZWUgYXJndW1lbnRzIC0gbWFjcm8oVElNRVJfTkFNRSwgZmxhZ3MsIGFyZykKKyAqIEBwYXJhbSBhcmcgYSB1c2VyIGRlZmluZWQgYXJndW1lbnQgdG8gc2VuZCB0byB0aGUgdXNlciBkZWZpbmVkIG1hY3JvCisgKgorICogXGRldGFpbHMgQSB0aW1lciBjb2xsZWN0cyBtdWx0aXBsZSBzYW1wbGVzIG9mIHNvbWUgY291bnQgaW4gZWFjaCB0aHJlYWQgYW5kIHRoZW4gZmluYWxseSBhZ2dyZWdhdGVzIG92ZXIgYWxsIHRoZSB0aHJlYWRzLgorICogVGhlIGNvdW50IGlzIG5vcm1hbGx5IGEgdGltZSAoaW4gdGlja3MpLCBoZW5jZSB0aGUgbmFtZSAidGltZXIiLiAoQnV0IGNhbiBiZSBhbnkgdmFsdWUsIHNvIHdlIHVzZSB0aGlzIGZvciAibnVtYmVyIG9mIGFyZ3VtZW50cyBwYXNzZWQgdG8gZm9yayIKKyAqIGFzIHdlbGwsIG9yIHdlIGNvdWxkIGNvbGxlY3QgImxvb3AgaXRlcmF0aW9uIGNvdW50IiBpZiB3ZSB3YW50ZWQgdG8pLgorICogRm9yIHRpbWVycyB0aGUgdGhyZWFkcyBhcmUgbm90IHNpZ25pZmljYW50LCBpdCdzIHRoZSBpbmRpdmlkdWFsIG9ic2VydmF0aW9ucyB0aGF0IGNvdW50LCBzbyB0aGUgc3RhdGlzdGljcyBhcmUgYXQgdGhhdCBsZXZlbC4KKyAqIEZvcm1hdCBpcyAibWFjcm8obmFtZSwgZmxhZ3MsIGFyZykiCisgKgorICogQGluZ3JvdXAgU1RBVFNfR0FUSEVSSU5HCisgKi8KKyNkZWZpbmUgS01QX0ZPUkVBQ0hfVElNRVIobWFjcm8sIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKE9NUF9QQVJBTExFTF9hcmdzLCBzdGF0c19mbGFnc19lOjpvbmx5SW5NYXN0ZXIgfCBzdGF0c19mbGFnc19lOjpub1VuaXRzLCBhcmcpIFwKKyAgICBtYWNybyAoRk9SX3N0YXRpY19pdGVyYXRpb25zLCBzdGF0c19mbGFnc19lOjpvbmx5SW5NYXN0ZXIgfCBzdGF0c19mbGFnc19lOjpub1VuaXRzLCBhcmcpIFwKKyAgICBtYWNybyAoRk9SX2R5bmFtaWNfaXRlcmF0aW9ucywgc3RhdHNfZmxhZ3NfZTo6bm9Vbml0cywgYXJnKSAgICAgICAgIFwKKyAgICBtYWNybyAoT01QX3N0YXJ0X2VuZCwgc3RhdHNfZmxhZ3NfZTo6b25seUluTWFzdGVyLCBhcmcpICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoT01QX3NlcmlhbCwgc3RhdHNfZmxhZ3NfZTo6b25seUluTWFzdGVyLCBhcmcpICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoT01QX3dvcmssIDAsIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoVG90YWxfd29yaywgc3RhdHNfZmxhZ3NfZTo6c3ludGhlc2l6ZWQsIGFyZykgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoT01QX2F3YWl0X3dvcmssIHN0YXRzX2ZsYWdzX2U6Om5vdEluTWFzdGVyLCBhcmcpICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoVG90YWxfYXdhaXRfd29yaywgc3RhdHNfZmxhZ3NfZTo6c3ludGhlc2l6ZWQsIGFyZykgICAgICAgICAgIFwKKyAgICBtYWNybyAoT01QX2JhcnJpZXIsIDAsIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoVG90YWxfYmFycmllciwgc3RhdHNfZmxhZ3NfZTo6c3ludGhlc2l6ZWQsIGFyZykgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoT01QX3Rlc3RfbG9jaywgMCwgYXJnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoRk9SX3N0YXRpY19zY2hlZHVsaW5nLCAwLCBhcmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoRk9SX2R5bmFtaWNfc2NoZWR1bGluZywgMCwgYXJnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoS01QX2ZvcmtfY2FsbCwgMCwgYXJnKSBcCisgICAgbWFjcm8gKEtNUF9qb2luX2NhbGwsIDAsIGFyZykgXAorICAgIG1hY3JvIChLTVBfZm9ya19iYXJyaWVyLCBzdGF0c19mbGFnc19lOjpsb2dFdmVudCwgYXJnKSAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChLTVBfam9pbl9iYXJyaWVyLCBzdGF0c19mbGFnc19lOjpsb2dFdmVudCwgYXJnKSAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChLTVBfYmFycmllciwgMCwgYXJnKSAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKEtNUF9lbmRfc3BsaXRfYmFycmllciwgMCwgYXJnKSBcCisgICAgbWFjcm8gKEtNUF93YWl0X3NsZWVwLCAwLCBhcmcpIFwKKyAgICBtYWNybyAoS01QX3JlbGVhc2UsIDAsIGFyZykgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChLTVBfaGllcl9nYXRoZXIsIDAsIGFyZykgXAorICAgIG1hY3JvIChLTVBfaGllcl9yZWxlYXNlLCAwLCBhcmcpIFwKKyAgICBtYWNybyAoS01QX2h5cGVyX2dhdGhlciwgIHN0YXRzX2ZsYWdzX2U6OmxvZ0V2ZW50LCBhcmcpIFwKKyAgICBtYWNybyAoS01QX2h5cGVyX3JlbGVhc2UsICBzdGF0c19mbGFnc19lOjpsb2dFdmVudCwgYXJnKSBcCisgICAgbWFjcm8gKEtNUF9saW5lYXJfZ2F0aGVyLCAwLCBhcmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKEtNUF9saW5lYXJfcmVsZWFzZSwgMCwgYXJnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKEtNUF90cmVlX2dhdGhlciwgMCwgYXJnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKEtNUF90cmVlX3JlbGVhc2UsIDAsIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKFVTRVJfbWFzdGVyX2ludm9rZSwgc3RhdHNfZmxhZ3NfZTo6bG9nRXZlbnQsIGFyZykgXAorICAgIG1hY3JvIChVU0VSX3dvcmtlcl9pbnZva2UsIHN0YXRzX2ZsYWdzX2U6OmxvZ0V2ZW50LCBhcmcpIFwKKyAgICBtYWNybyAoVVNFUl9yZXN1bWUsIHN0YXRzX2ZsYWdzX2U6OmxvZ0V2ZW50LCBhcmcpIFwKKyAgICBtYWNybyAoVVNFUl9zdXNwZW5kLCBzdGF0c19mbGFnc19lOjpsb2dFdmVudCwgYXJnKSBcCisgICAgbWFjcm8gKFVTRVJfbGF1bmNoX3RocmVhZF9sb29wLCBzdGF0c19mbGFnc19lOjpsb2dFdmVudCwgYXJnKSBcCisgICAgbWFjcm8gKEtNUF9hbGxvY2F0ZV90ZWFtLCAwLCBhcmcpIFwKKyAgICBtYWNybyAoS01QX3NldHVwX2ljdl9jb3B5LCAwLCBhcmcpIFwKKyAgICBtYWNybyAoVVNFUl9pY3ZfY29weSwgMCwgYXJnKSBcCisgICAgbWFjcm8gKExBU1QsMCwgYXJnKQorCisKKworLy8gT01QX1BBUkFMTEVMX2FyZ3MgICAgICAtLSB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyBwYXNzZWQgdG8gYSBmb3JrCisvLyBGT1Jfc3RhdGljX2l0ZXJhdGlvbnMgIC0tIE51bWJlciBvZiBhdmFpbGFibGUgcGFyYWxsZWwgY2h1bmtzIG9mIHdvcmsgaW4gYSBzdGF0aWMgZm9yCisvLyBGT1JfZHluYW1pY19pdGVyYXRpb25zIC0tIE51bWJlciBvZiBhdmFpbGFibGUgcGFyYWxsZWwgY2h1bmtzIG9mIHdvcmsgaW4gYSBkeW5hbWljIGZvcgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICBCb3RoIGFkanVzdCBmb3IgYW55IGNodW5raW5nLCBzbyBpZiB0aGVyZSB3ZXJlIGFuIGl0ZXJhdGlvbiBjb3VudCBvZiAyMCBidXQgYSBjaHVuayBzaXplIG9mIDEwLCB3ZSdkIHJlY29yZCAyLgorLy8gT01QX3NlcmlhbCAgICAgICAgICAgICAtLSB0aHJlYWQgemVybyB0aW1lIGV4ZWN1dGluZyBzZXJpYWwgY29kZQorLy8gT01QX3N0YXJ0X2VuZCAgICAgICAgICAtLSB0aW1lIGZyb20gd2hlbiBPcGVuTVAgaXMgaW5pdGlhbGl6ZWQgdW50aWwgdGhlIHN0YXRzIGFyZSBwcmludGVkIGF0IGV4aXQKKy8vIE9NUF93b3JrICAgICAgICAgICAgICAgLS0gZWxhcHNlZCB0aW1lIGluIGNvZGUgZGlzcGF0Y2hlZCBieSBhIGZvcmsgKG1lYXN1cmVkIGluIHRoZSB0aHJlYWQpCisvLyBUb3RhbF93b3JrICAgICAgICAgICAgIC0tIGEgc3ludGhlc2l6ZWQgc3RhdGlzdGljIHN1bW1hcml6aW5nIGhvdyBtdWNoIHBhcmFsbGVsIHdvcmsgZWFjaCB0aHJlYWQgZXhlY3V0ZWQuCisvLyBPTVBfYmFycmllciAgICAgICAgICAgIC0tIHRpbWUgYXQgInJlYWwiIGJhcnJpZXJzCisvLyBUb3RhbF9iYXJyaWVyICAgICAgICAgIC0tIGEgc3ludGhlc2l6ZWQgc3RhdGlzdGljIHN1bW1hcml6aW5nIGhvdyBtdWNoIHRpbWUgYXQgcmVhbCBiYXJyaWVycyBpbiBlYWNoIHRocmVhZAorLy8gT01QX3NldF9sb2NrICAgICAgICAgICAtLSB0aW1lIGluIGxvY2sgc2V0dGluZworLy8gT01QX3Rlc3RfbG9jayAgICAgICAgICAtLSB0aW1lIGluIHRlc3RpbmcgYSBsb2NrCisvLyBMT0NLX1dBSVQgICAgICAgICAgICAgIC0tIHRpbWUgd2FpdGluZyBmb3IgYSBsb2NrCisvLyBGT1Jfc3RhdGljX3NjaGVkdWxpbmcgIC0tIHRpbWUgc3BlbnQgZG9pbmcgc2NoZWR1bGluZyBmb3IgYSBzdGF0aWMgImZvciIKKy8vIEZPUl9keW5hbWljX3NjaGVkdWxpbmcgLS0gdGltZSBzcGVudCBkb2luZyBzY2hlZHVsaW5nIGZvciBhIGR5bmFtaWMgImZvciIKKy8vIEtNUF93YWl0X3NsZWVwICAgICAgICAgLS0gdGltZSBpbiBfX2ttcF93YWl0X3NsZWVwCisvLyBLTVBfcmVsZWFzZSAgICAgICAgICAgIC0tIHRpbWUgaW4gX19rbXBfcmVsZWFzZQorLy8gS01QX2ZvcmtfYmFycmllciAgICAgICAtLSB0aW1lIGluIF9fa21wX2ZvcmtfYmFycmllcgorLy8gS01QX2pvaW5fYmFycmllciAgICAgICAtLSB0aW1lIGluIF9fa21wX2pvaW5fYmFycmllcgorLy8gS01QX2JhcnJpZXIgICAgICAgICAgICAtLSB0aW1lIGluIF9fa21wX2JhcnJpZXIKKy8vIEtNUF9lbmRfc3BsaXRfYmFycmllciAgLS0gdGltZSBpbiBfX2ttcF9lbmRfc3BsaXRfYmFycmllcgorLy8gS01QX3NldHVwX2ljdl9jb3B5ICAgICAtLSB0aW1lIGluIF9fa21wX3NldHVwX2ljdl9jb3B5CisvLyBLTVBfaWN2X2NvcHkgICAgICAgICAgIC0tIHN0YXJ0L3N0b3AgdGltZXIgZm9yIGFueSBJQ1YgY29weWluZworLy8gS01QX2xpbmVhcl9nYXRoZXIgICAgICAtLSB0aW1lIGluIF9fa21wX2xpbmVhcl9iYXJyaWVyX2dhdGhlcgorLy8gS01QX2xpbmVhcl9yZWxlYXNlICAgICAtLSB0aW1lIGluIF9fa21wX2xpbmVhcl9iYXJyaWVyX3JlbGVhc2UKKy8vIEtNUF90cmVlX2dhdGhlciAgICAgICAgLS0gdGltZSBpbiBfX2ttcF90cmVlX2JhcnJpZXJfZ2F0aGVyCisvLyBLTVBfdHJlZV9yZWxlYXNlICAgICAgIC0tIHRpbWUgaW4gX19rbXBfdHJlZV9iYXJyaWVyX3JlbGVhc2UKKy8vIEtNUF9oeXBlcl9nYXRoZXIgICAgICAgLS0gdGltZSBpbiBfX2ttcF9oeXBlcl9iYXJyaWVyX2dhdGhlcgorLy8gS01QX2h5cGVyX3JlbGVhc2UgICAgICAtLSB0aW1lIGluIF9fa21wX2h5cGVyX2JhcnJpZXJfcmVsZWFzZQorCisvKiEKKyAqIFxicmllZiBBZGQgbmV3IGV4cGxpY2l0IHRpbWVycyB1bmRlciBLTVBfRk9SRUFDSF9FWFBMSUNJVF9USU1FUigpIG1hY3JvLgorICoKKyAqIEBwYXJhbSBtYWNybyBhIHVzZXIgZGVmaW5lZCBtYWNybyB0aGF0IHRha2VzIHRocmVlIGFyZ3VtZW50cyAtIG1hY3JvKFRJTUVSX05BTUUsIGZsYWdzLCBhcmcpCisgKiBAcGFyYW0gYXJnIGEgdXNlciBkZWZpbmVkIGFyZ3VtZW50IHRvIHNlbmQgdG8gdGhlIHVzZXIgZGVmaW5lZCBtYWNybworICoKKyAqIFx3YXJuaW5nIFlPVSBNVVNUIEhBVkUgVEhFIFNBTUUgTkFNRUQgVElNRVIgVU5ERVIgS01QX0ZPUkVBQ0hfVElNRVIoKSBPUiBFTFNFIEJBRCBUSElOR1MgV0lMTCBIQVBQRU4hCisgKgorICogXGRldGFpbHMgRXhwbGljaXQgdGltZXJzIGFyZSBvbmVzIHdoZXJlIHdlIG5lZWQgdG8gYWxsb2NhdGUgYSB0aW1lciBpdHNlbGYgKGFzIHdlbGwgYXMgdGhlIGFjY3VtdWxhdGVkIHRpbWluZyBzdGF0aXN0aWNzKS4KKyAqIFdlIGFsbG9jYXRlIHRoZXNlIG9uIGEgcGVyLXRocmVhZCBiYXNpcywgYW5kIGV4cGxpY2l0bHkgc3RhcnQgYW5kIHN0b3AgdGhlbS4KKyAqIEJsb2NrIHRpbWVycyBqdXN0IGFsbG9jYXRlIHRoZSB0aW1lciBpdHNlbGYgb24gdGhlIHN0YWNrLCBhbmQgdXNlIHRoZSBkZXN0cnVjdG9yIHRvIG5vdGljZSBibG9jayBleGl0OyB0aGV5IGRvbid0CisgKiBuZWVkIHRvIGJlIGRlZmluZWQgaGVyZS4KKyAqIFRoZSBuYW1lIGhlcmUgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIHRoYXQgb2YgYSB0aW1lciBhYm92ZS4KKyAqCisgKiBAaW5ncm91cCBTVEFUU19HQVRIRVJJTkcKKyovCisjZGVmaW5lIEtNUF9GT1JFQUNIX0VYUExJQ0lUX1RJTUVSKG1hY3JvLCBhcmcpICBcCisgICAgbWFjcm8oT01QX3NlcmlhbCwgMCwgYXJnKSAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8oT01QX3N0YXJ0X2VuZCwgMCwgYXJnKSAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8oVVNFUl9pY3ZfY29weSwgMCwgYXJnKSBcCisgICAgbWFjcm8oVVNFUl9sYXVuY2hfdGhyZWFkX2xvb3AsIHN0YXRzX2ZsYWdzX2U6OmxvZ0V2ZW50LCBhcmcpIFwKKyAgICBtYWNybyhMQVNULCAwLCBhcmcpCisKKyNkZWZpbmUgRU5VTUVSQVRFKG5hbWUsaWdub3JlLHByZWZpeCkgcHJlZml4IyNuYW1lLAorZW51bSB0aW1lcl9lIHsKKyAgICBLTVBfRk9SRUFDSF9USU1FUihFTlVNRVJBVEUsIFRJTUVSXykKK307CisKK2VudW0gZXhwbGljaXRfdGltZXJfZSB7CisgICAgS01QX0ZPUkVBQ0hfRVhQTElDSVRfVElNRVIoRU5VTUVSQVRFLCBFWFBMSUNJVF9USU1FUl8pCit9OworCitlbnVtIGNvdW50ZXJfZSB7CisgICAgS01QX0ZPUkVBQ0hfQ09VTlRFUihFTlVNRVJBVEUsIENPVU5URVJfKQorfTsKKyN1bmRlZiBFTlVNRVJBVEUKKworY2xhc3Mgc3RhdGlzdGljCit7CisgICAgZG91YmxlICAgbWluVmFsOworICAgIGRvdWJsZSAgIG1heFZhbDsKKyAgICBkb3VibGUgICBtZWFuVmFsOworICAgIGRvdWJsZSAgIG0yOworICAgIHVpbnQ2NF90IHNhbXBsZUNvdW50OworCisgcHVibGljOgorICAgIHN0YXRpc3RpYygpIHsgcmVzZXQoKTsgfQorICAgIHN0YXRpc3RpYyAoc3RhdGlzdGljIGNvbnN0ICZvKTogbWluVmFsKG8ubWluVmFsKSwgbWF4VmFsKG8ubWF4VmFsKSwgbWVhblZhbChvLm1lYW5WYWwpLCBtMihvLm0yKSwgc2FtcGxlQ291bnQoby5zYW1wbGVDb3VudCkge30KKworICAgIGRvdWJsZSAgIGdldE1pbigpICAgY29uc3QgeyByZXR1cm4gbWluVmFsOyB9CisgICAgZG91YmxlICAgZ2V0TWVhbigpICBjb25zdCB7IHJldHVybiBtZWFuVmFsOyB9CisgICAgZG91YmxlICAgZ2V0TWF4KCkgICBjb25zdCB7IHJldHVybiBtYXhWYWw7IH0KKyAgICB1aW50NjRfdCBnZXRDb3VudCgpIGNvbnN0IHsgcmV0dXJuIHNhbXBsZUNvdW50OyB9CisgICAgZG91YmxlICAgZ2V0U0QoKSAgICBjb25zdCB7IHJldHVybiBzcXJ0KG0yL3NhbXBsZUNvdW50KTsgfQorICAgIGRvdWJsZSAgIGdldFRvdGFsKCkgY29uc3QgeyByZXR1cm4gc2FtcGxlQ291bnQqbWVhblZhbDsgfQorCisgICAgdm9pZCByZXNldCgpCisgICAgeworICAgICAgICBtaW5WYWwgPSAgc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+OjptYXgoKTsKKyAgICAgICAgbWF4VmFsID0gLXN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6bWF4KCk7CisgICAgICAgIG1lYW5WYWw9IDAuMDsKKyAgICAgICAgbTIgICAgID0gMC4wOworICAgICAgICBzYW1wbGVDb3VudCA9IDA7CisgICAgfQorICAgIHZvaWQgYWRkU2FtcGxlKGRvdWJsZSBzYW1wbGUpOworICAgIHZvaWQgc2NhbGUgICAgKGRvdWJsZSBmYWN0b3IpOworICAgIHZvaWQgc2NhbGVEb3duKGRvdWJsZSBmKSAgeyBzY2FsZSAoMS4vZik7IH0KKyAgICBzdGF0aXN0aWMgJiBvcGVyYXRvcis9IChzdGF0aXN0aWMgY29uc3QgJiBvdGhlcik7CisKKyAgICBzdGQ6OnN0cmluZyBmb3JtYXQoY2hhciB1bml0LCBib29sIHRvdGFsPWZhbHNlKSBjb25zdDsKK307CisKK3N0cnVjdCBzdGF0SW5mbworeworICAgIGNvbnN0IGNoYXIgKiBuYW1lOworICAgIHVpbnQzMl90ICAgICBmbGFnczsKK307CisKK2NsYXNzIHRpbWVTdGF0IDogcHVibGljIHN0YXRpc3RpYworeworICAgIHN0YXRpYyBzdGF0SW5mbyB0aW1lckluZm9bXTsKKworIHB1YmxpYzoKKyAgICB0aW1lU3RhdCgpIDogc3RhdGlzdGljKCkge30KKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIG5hbWUodGltZXJfZSBlKSB7IHJldHVybiB0aW1lckluZm9bZV0ubmFtZTsgfQorICAgIHN0YXRpYyBib29sICBtYXN0ZXJPbmx5ICh0aW1lcl9lIGUpIHsgcmV0dXJuIHRpbWVySW5mb1tlXS5mbGFncyAmIHN0YXRzX2ZsYWdzX2U6Om9ubHlJbk1hc3RlcjsgfQorICAgIHN0YXRpYyBib29sICB3b3JrZXJPbmx5ICh0aW1lcl9lIGUpIHsgcmV0dXJuIHRpbWVySW5mb1tlXS5mbGFncyAmIHN0YXRzX2ZsYWdzX2U6Om5vdEluTWFzdGVyOyAgfQorICAgIHN0YXRpYyBib29sICBub1VuaXRzICAgICh0aW1lcl9lIGUpIHsgcmV0dXJuIHRpbWVySW5mb1tlXS5mbGFncyAmIHN0YXRzX2ZsYWdzX2U6Om5vVW5pdHM7ICAgICAgfQorICAgIHN0YXRpYyBib29sICBzeW50aGVzaXplZCh0aW1lcl9lIGUpIHsgcmV0dXJuIHRpbWVySW5mb1tlXS5mbGFncyAmIHN0YXRzX2ZsYWdzX2U6OnN5bnRoZXNpemVkOyAgfQorICAgIHN0YXRpYyBib29sICBsb2dFdmVudCAgICh0aW1lcl9lIGUpIHsgcmV0dXJuIHRpbWVySW5mb1tlXS5mbGFncyAmIHN0YXRzX2ZsYWdzX2U6OmxvZ0V2ZW50OyAgICAgfQorICAgIHN0YXRpYyB2b2lkICBjbGVhckV2ZW50RmxhZ3MoKSAgICAgIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGZvcihpPTA7aTxUSU1FUl9MQVNUO2krKykgeworICAgICAgICAgICAgdGltZXJJbmZvW2ldLmZsYWdzICY9ICh+KHN0YXRzX2ZsYWdzX2U6OmxvZ0V2ZW50KSk7CisgICAgICAgIH0KKyAgICB9Cit9OworCisvLyBXaGVyZSB3ZSBuZWVkIGV4cGxpY2l0bHkgdG8gc3RhcnQgYW5kIGVuZCB0aGUgdGltZXIsIHRoaXMgdmVyc2lvbiBjYW4gYmUgdXNlZAorLy8gU2luY2UgdGhlc2UgdGltZXJzIG5vcm1hbGx5IGFyZW4ndCBuaWNlbHkgc2NvcGVkLCBzbyBkb24ndCBoYXZlIGEgZ29vZCBwbGFjZSB0byBsaXZlCisvLyBvbiB0aGUgc3RhY2sgb2YgdGhlIHRocmVhZCwgdGhleSdyZSBtb3JlIHdvcmsgdG8gdXNlLgorY2xhc3MgZXhwbGljaXRUaW1lcgoreworICAgIHRpbWVTdGF0ICogc3RhdDsKKyAgICB0c2NfdGlja19jb3VudCBzdGFydFRpbWU7CisKKyBwdWJsaWM6CisgICAgZXhwbGljaXRUaW1lciAoKSA6IHN0YXQoMCksIHN0YXJ0VGltZSgwKSB7IH0KKyAgICBleHBsaWNpdFRpbWVyICh0aW1lU3RhdCAqIHMpIDogc3RhdChzKSwgc3RhcnRUaW1lKCkgeyB9CisKKyAgICB2b2lkIHNldFN0YXQgKHRpbWVTdGF0ICpzKSB7IHN0YXQgPSBzOyB9CisgICAgdm9pZCBzdGFydCh0aW1lcl9lIHRpbWVyRW51bVZhbHVlKTsKKyAgICB2b2lkIHN0b3AodGltZXJfZSB0aW1lckVudW1WYWx1ZSk7CisgICAgdm9pZCByZXNldCgpIHsgc3RhcnRUaW1lID0gMDsgfQorfTsKKworLy8gV2hlcmUgYWxsIHlvdSBuZWVkIGlzIHRvIHRpbWUgYSBibG9jaywgdGhpcyBpcyBlbm91Z2guCisvLyAoSXQgYXZvaWRzIHRoZSBuZWVkIHRvIGhhdmUgYW4gZXhwbGljaXQgZW5kLCBsZWF2aW5nIHRoZSBzY29wZSBzdWZmaWNlcy4pCitjbGFzcyBibG9ja1RpbWVyIDogcHVibGljIGV4cGxpY2l0VGltZXIKK3sKKyAgICB0aW1lcl9lIHRpbWVyRW51bVZhbHVlOworIHB1YmxpYzoKKyAgICBibG9ja1RpbWVyICh0aW1lU3RhdCAqIHMsIHRpbWVyX2UgbmV3VGltZXJFbnVtVmFsdWUpIDogdGltZXJFbnVtVmFsdWUobmV3VGltZXJFbnVtVmFsdWUpLCBleHBsaWNpdFRpbWVyKHMpIHsgc3RhcnQodGltZXJFbnVtVmFsdWUpOyB9CisgICAgfmJsb2NrVGltZXIoKSB7IHN0b3AodGltZXJFbnVtVmFsdWUpOyB9Cit9OworCisvLyBJZiBhbGwgeW91IHdhbnQgaXMgYSBjb3VudCwgdGhlbiB5b3UgY2FuIHVzZSB0aGlzLi4uCisvLyBUaGUgaW5kaXZpZHVhbCBwZXItdGhyZWFkIGNvdW50cyB3aWxsIGJlIGFnZ3JlZ2F0ZWQgaW50byBhIHN0YXRpc3RpYyBhdCBwcm9ncmFtIGV4aXQuCitjbGFzcyBjb3VudGVyCit7CisgICAgdWludDY0X3QgdmFsdWU7CisgICAgc3RhdGljIGNvbnN0IHN0YXRJbmZvIGNvdW50ZXJJbmZvW107CisKKyBwdWJsaWM6CisgICAgY291bnRlcigpIDogdmFsdWUoMCkge30KKyAgICB2b2lkIGluY3JlbWVudCgpIHsgdmFsdWUrKzsgfQorICAgIHVpbnQ2NF90IGdldFZhbHVlKCkgY29uc3QgeyByZXR1cm4gdmFsdWU7IH0KKyAgICB2b2lkIHJlc2V0KCkgeyB2YWx1ZSA9IDA7IH0KKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIG5hbWUoY291bnRlcl9lIGUpIHsgcmV0dXJuIGNvdW50ZXJJbmZvW2VdLm5hbWU7IH0KKyAgICBzdGF0aWMgYm9vbCAgbWFzdGVyT25seSAoY291bnRlcl9lIGUpIHsgcmV0dXJuIGNvdW50ZXJJbmZvW2VdLmZsYWdzICYgc3RhdHNfZmxhZ3NfZTo6b25seUluTWFzdGVyOyB9Cit9OworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgQ2xhc3MgdG8gaW1wbGVtZW50IGFuIGV2ZW50CisKKyAgICBUaGVyZSBhcmUgZm91ciBjb21wb25lbnRzIHRvIGFuIGV2ZW50OiBzdGFydCB0aW1lLCBzdG9wIHRpbWUKKyAgICBuZXN0X2xldmVsLCBhbmQgdGltZXJfbmFtZS4KKyAgICBUaGUgc3RhcnQgYW5kIHN0b3AgdGltZSBzaG91bGQgYmUgb2J2aW91cyAocmVjb3JkZWQgaW4gY2xvY2sgdGlja3MpLgorICAgIFRoZSBuZXN0X2xldmVsIHJlbGF0ZXMgdG8gdGhlIGJhciB3aWR0aCBpbiB0aGUgdGltZWxpbmUgZ3JhcGguCisgICAgVGhlIHRpbWVyX25hbWUgaXMgdXNlZCB0byBkZXRlcm1pbmUgd2hpY2ggdGltZXIgZXZlbnQgdHJpZ2dlcmVkIHRoaXMgZXZlbnQuCisKKyAgICB0aGUgaW50ZXJmYWNlIHRvIHRoaXMgY2xhc3MgaXMgdGhyb3VnaCBmb3VyIHJlYWQtb25seSBvcGVyYXRpb25zOgorICAgIDEpIGdldFN0YXJ0KCkgICAgIC0tIHJldHVybnMgdGhlIHN0YXJ0IHRpbWUgYXMgNjQgYml0IGludGVnZXIKKyAgICAyKSBnZXRTdG9wKCkgICAgICAtLSByZXR1cm5zIHRoZSBzdG9wIHRpbWUgYXMgNjQgYml0IGludGVnZXIKKyAgICAzKSBnZXROZXN0TGV2ZWwoKSAtLSByZXR1cm5zIHRoZSBuZXN0IGxldmVsIG9mIHRoZSBldmVudAorICAgIDQpIGdldFRpbWVyTmFtZSgpIC0tIHJldHVybnMgdGhlIHRpbWVyIG5hbWUgdGhhdCB0cmlnZ2VyZWQgZXZlbnQKKworICAgICpNT1JFIE9OIE5FU1RfTEVWRUwqCisgICAgVGhlIG5lc3QgbGV2ZWwgaXMgdXNlZCBpbiB0aGUgYmFyIGdyYXBoIHRoYXQgcmVwcmVzZW50cyB0aGUgdGltZWxpbmUuCisgICAgSXRzIG1haW4gcHVycG9zZSBpcyBmb3Igc2hvd2luZyBob3cgZXZlbnRzIGFyZSBuZXN0ZWQgaW5zaWRlIGVhY2hvdGhlci4KKyAgICBGb3IgZXhhbXBsZSwgc2F5IGV2ZW50cywgQSwgQiwgYW5kIEMgYXJlIHJlY29yZGVkLiAgSWYgdGhlIHRpbWVsaW5lCisgICAgbG9va3MgbGlrZSB0aGlzOgorCitCZWdpbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPiBUaW1lCisgICAgICAgICB8ICAgIHwgICAgICAgICAgfCAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgICAgICB8CisgICAgICAgICBBICAgIEIgICAgICAgICAgQyAgICAgICAgQyAgICAgICAgICBCICAgICAgICAgICAgICBBCisgICAgICAgc3RhcnQgc3RhcnQgICAgIHN0YXJ0ICAgICBlbmQgICAgICAgIGVuZCAgICAgICAgICAgIGVuZAorCisgICAgICAgVGhlbiBBLCBCLCBDIHdpbGwgaGF2ZSBhIG5lc3QgbGV2ZWwgb2YgMSwgMiwgMyByZXNwZWN0aXZlbHkuCisgICAgICAgVGhlc2UgdmFsdWVzIGFyZSB0aGVuIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBiYXJ3aWR0aCBzbyB5b3UgY2FuCisgICAgICAgc2VlIHRoYXQgaW5zaWRlIEEsIEIgaGFzIG9jY3VyZWQsIGFuZCBpbnNpZGUgQiwgQyBoYXMgb2NjdXJlZC4KKyAgICAgICBDdXJyZW50bHksIHRoaXMgaXMgc2hvd24gd2l0aCBBJ3MgYmFyIHdpZHRoIGJlaW5nIGxhcmdlciB0aGFuIEIncworICAgICAgIGJhciB3aWR0aCwgYW5kIEIncyBiYXIgd2lkdGggYmVpbmcgbGFyZ2VyIHRoYW4gQydzIGJhciB3aWR0aC4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworY2xhc3Mga21wX3N0YXRzX2V2ZW50IHsKKyAgICB1aW50NjRfdCBzdGFydDsKKyAgICB1aW50NjRfdCBzdG9wOworICAgIGludCBuZXN0X2xldmVsOworICAgIHRpbWVyX2UgdGltZXJfbmFtZTsKKyBwdWJsaWM6CisgICAga21wX3N0YXRzX2V2ZW50KCkgOiBzdGFydCgwKSwgc3RvcCgwKSwgbmVzdF9sZXZlbCgwKSwgdGltZXJfbmFtZShUSU1FUl9MQVNUKSB7fQorICAgIGttcF9zdGF0c19ldmVudCh1aW50NjRfdCBzdHJ0LCB1aW50NjRfdCBzdHAsIGludCBuc3QsIHRpbWVyX2Ugbm1lKSA6IHN0YXJ0KHN0cnQpLCBzdG9wKHN0cCksIG5lc3RfbGV2ZWwobnN0KSwgdGltZXJfbmFtZShubWUpIHt9CisgICAgaW5saW5lIHVpbnQ2NF90ICBnZXRTdGFydCgpIGNvbnN0IHsgcmV0dXJuIHN0YXJ0OyB9CisgICAgaW5saW5lIHVpbnQ2NF90ICBnZXRTdG9wKCkgY29uc3QgIHsgcmV0dXJuIHN0b3A7ICB9CisgICAgaW5saW5lIGludCAgICAgICBnZXROZXN0TGV2ZWwoKSBjb25zdCB7IHJldHVybiBuZXN0X2xldmVsOyB9CisgICAgaW5saW5lIHRpbWVyX2UgICBnZXRUaW1lck5hbWUoKSBjb25zdCB7IHJldHVybiB0aW1lcl9uYW1lOyB9Cit9OworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgQ2xhc3MgdG8gaW1wbGVtZW50IGEgZHluYW1pY2FsbHkgZXhwYW5kYWJsZSBhcnJheSBvZiBldmVudHMKKworICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHwgZXZlbnQgMSB8IGV2ZW50IDIgfCBldmVudCAzIHwgZXZlbnQgNCB8IC4uLiB8IGV2ZW50IE4gfAorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgQW4gZXZlbnQgaXMgcHVzaGVkIG9udG8gdGhlIGJhY2sgb2YgdGhpcyBhcnJheSBhdCBldmVyeQorICAgIGV4cGxpY2l0VGltZXItPnN0b3AoKSBjYWxsLiAgVGhlIGV2ZW50IHJlY29yZHMgdGhlIHRocmVhZCAjLAorICAgIHN0YXJ0IHRpbWUsIHN0b3AgdGltZSwgYW5kIG5lc3QgbGV2ZWwgcmVsYXRlZCB0byB0aGUgYmFyIHdpZHRoLgorCisgICAgVGhlIGV2ZW50IHZlY3RvciBzdGFydHMgYXQgc2l6ZSBJTklUX1NJWkUgYW5kIGdyb3dzIChkb3VibGVzIGluIHNpemUpCisgICAgaWYgbmVlZGVkLiAgQW4gaW1wbGljYXRpb24gb2YgdGhpcyBiZWhhdmlvciBpcyB0aGF0IGxvZyhOKQorICAgIHJlYWxsb2NhdGlvbnMgYXJlIG5lZWRlZCAod2hlcmUgTiBpcyBudW1iZXIgb2YgZXZlbnRzKS4gIElmIHlvdSB3YW50CisgICAgdG8gYXZvaWQgcmVhbGxvY2F0aW9ucywgdGhlbiBzZXQgSU5JVF9TSVpFIHRvIGEgbGFyZ2UgdmFsdWUuCisKKyAgICB0aGUgaW50ZXJmYWNlIHRvIHRoaXMgY2xhc3MgaXMgdGhyb3VnaCBzaXggb3BlcmF0aW9uczoKKyAgICAxKSByZXNldCgpIC0tIHNldHMgdGhlIGludGVybmFsX3NpemUgYmFjayB0byAwIGJ1dCBkb2VzIG5vdCBkZWFsbG9jYXRlIGFueSBtZW1vcnkKKyAgICAyKSBzaXplKCkgIC0tIHJldHVybnMgdGhlIG51bWJlciBvZiB2YWxpZCBlbGVtZW50cyBpbiB0aGUgdmVjdG9yCisgICAgMykgcHVzaF9iYWNrKHN0YXJ0LCBzdG9wLCBuZXN0LCB0aW1lcl9uYW1lKSAtLSBwdXNoZXMgYW4gZXZlbnQgb250bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJhY2sgb2YgdGhlIGFycmF5CisgICAgNCkgZGVhbGxvY2F0ZSgpIC0tIGZyZWVzIGFsbCBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIHRoZSB2ZWN0b3IKKyAgICA1KSBzb3J0KCkgLS0gc29ydHMgdGhlIHZlY3RvciBieSBzdGFydCB0aW1lCisgICAgNikgb3BlcmF0b3JbaW5kZXhdIG9yIGF0KGluZGV4KSAtLSByZXR1cm5zIGV2ZW50IHJlZmVyZW5jZSBhdCB0aGF0IGluZGV4CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KK2NsYXNzIGttcF9zdGF0c19ldmVudF92ZWN0b3IgeworICAgIGttcF9zdGF0c19ldmVudCogZXZlbnRzOworICAgIGludCBpbnRlcm5hbF9zaXplOworICAgIGludCBhbGxvY2F0ZWRfc2l6ZTsKKyAgICBzdGF0aWMgY29uc3QgaW50IElOSVRfU0laRSA9IDEwMjQ7CisgcHVibGljOgorICAgIGttcF9zdGF0c19ldmVudF92ZWN0b3IoKSB7CisgICAgICAgIGV2ZW50cyA9IChrbXBfc3RhdHNfZXZlbnQqKV9fa21wX2FsbG9jYXRlKHNpemVvZihrbXBfc3RhdHNfZXZlbnQpKklOSVRfU0laRSk7CisgICAgICAgIGludGVybmFsX3NpemUgPSAwOworICAgICAgICBhbGxvY2F0ZWRfc2l6ZSA9IElOSVRfU0laRTsKKyAgICB9CisgICB+a21wX3N0YXRzX2V2ZW50X3ZlY3RvcigpIHt9CisgICAgaW5saW5lIHZvaWQgcmVzZXQoKSB7IGludGVybmFsX3NpemUgPSAwOyB9CisgICAgaW5saW5lIGludCAgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGludGVybmFsX3NpemU7IH0KKyAgICB2b2lkIHB1c2hfYmFjayh1aW50NjRfdCBzdGFydF90aW1lLCB1aW50NjRfdCBzdG9wX3RpbWUsIGludCBuZXN0X2xldmVsLCB0aW1lcl9lIG5hbWUpIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGlmKGludGVybmFsX3NpemUgPT0gYWxsb2NhdGVkX3NpemUpIHsKKyAgICAgICAgICAgIGttcF9zdGF0c19ldmVudCogdG1wID0gKGttcF9zdGF0c19ldmVudCopX19rbXBfYWxsb2NhdGUoc2l6ZW9mKGttcF9zdGF0c19ldmVudCkqYWxsb2NhdGVkX3NpemUqMik7CisgICAgICAgICAgICBmb3IoaT0wO2k8aW50ZXJuYWxfc2l6ZTtpKyspIHRtcFtpXSA9IGV2ZW50c1tpXTsKKyAgICAgICAgICAgIF9fa21wX2ZyZWUoZXZlbnRzKTsKKyAgICAgICAgICAgIGV2ZW50cyA9IHRtcDsKKyAgICAgICAgICAgIGFsbG9jYXRlZF9zaXplKj0yOworICAgICAgICB9CisgICAgICAgIGV2ZW50c1tpbnRlcm5hbF9zaXplXSA9IGttcF9zdGF0c19ldmVudChzdGFydF90aW1lLCBzdG9wX3RpbWUsIG5lc3RfbGV2ZWwsIG5hbWUpOworICAgICAgICBpbnRlcm5hbF9zaXplKys7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgdm9pZCBkZWFsbG9jYXRlKCk7CisgICAgdm9pZCBzb3J0KCk7CisgICAgY29uc3Qga21wX3N0YXRzX2V2ZW50ICYgb3BlcmF0b3JbXShpbnQgaW5kZXgpIGNvbnN0IHsgcmV0dXJuIGV2ZW50c1tpbmRleF07IH0KKyAgICAgICAgICBrbXBfc3RhdHNfZXZlbnQgJiBvcGVyYXRvcltdKGludCBpbmRleCkgeyByZXR1cm4gZXZlbnRzW2luZGV4XTsgfQorICAgIGNvbnN0IGttcF9zdGF0c19ldmVudCAmIGF0KGludCBpbmRleCkgY29uc3QgeyByZXR1cm4gZXZlbnRzW2luZGV4XTsgfQorICAgICAgICAgIGttcF9zdGF0c19ldmVudCAmIGF0KGludCBpbmRleCkgeyByZXR1cm4gZXZlbnRzW2luZGV4XTsgfQorfTsKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIENsYXNzIHRvIGltcGxlbWVudCBhIGRvdWJseS1saW5rZWQsIGNpcmN1bGFyLCBzdGF0aXN0aWNzIGxpc3QKKworICAgIHwtLS18IC0tLT4gfC0tLXwgLS0tPiB8LS0tfCAtLS0+IHwtLS18IC0tLT4gLi4uIG5leHQKKyAgICB8ICAgfCAgICAgIHwgICB8ICAgICAgfCAgIHwgICAgICB8ICAgfAorICAgIHwtLS18IDwtLS0gfC0tLXwgPC0tLSB8LS0tfCA8LS0tIHwtLS18IDwtLS0gLi4uIHByZXYKKyAgICBTZW50aW5lbCAgIGZpcnN0ICAgICAgc2Vjb25kICAgICB0aGlyZAorICAgIE5vZGUgICAgICAgbm9kZSAgICAgICBub2RlICAgICAgIG5vZGUKKworICAgIFRoZSBTZW50aW5lbCBOb2RlIGlzIHRoZSB1c2VyIGhhbmRsZSBvbiB0aGUgbGlzdC4KKyAgICBUaGUgZmlyc3Qgbm9kZSBjb3JyZXNwb25kcyB0byB0aHJlYWQgMCdzIHN0YXRpc3RpY3MuCisgICAgVGhlIHNlY29uZCBub2RlIGNvcnJlc3BvbmRzIHRvIHRocmVhZCAxJ3Mgc3RhdGlzdGljcyBhbmQgc28gb24uLi4KKworICAgIEVhY2ggbm9kZSBoYXMgYSBfdGltZXJzLCBfY291bnRlcnMsIGFuZCBfZXhwbGljaXRUaW1lcnMgYXJyYXkgdG8KKyAgICBob2xkIHRoYXQgdGhyZWFkJ3Mgc3RhdGlzdGljcy4gIFRoZSBfZXhwbGljaXRUaW1lcnMKKyAgICBwb2ludCB0byB0aGUgY29ycmVjdCBfdGltZXIgYW5kIHVwZGF0ZSBpdHMgc3RhdGlzdGljcyBhdCBldmVyeSBzdG9wKCkgY2FsbC4KKyAgICBUaGUgZXhwbGljaXRUaW1lcnMnIHBvaW50ZXJzIGFyZSBzZXQgdXAgaW4gdGhlIGNvbnN0cnVjdG9yLgorICAgIEVhY2ggbm9kZSBhbHNvIGhhcyBhbiBldmVudCB2ZWN0b3IgdG8gaG9sZCB0aGF0IHRocmVhZCdzIHRpbWluZyBldmVudHMuCisgICAgVGhlIGV2ZW50IHZlY3RvciBleHBhbmRzIGFzIG5lY2Vzc2FyeSBhbmQgcmVjb3JkcyB0aGUgc3RhcnQtc3RvcCB0aW1lcworICAgIGZvciBlYWNoIHRpbWVyLgorCisgICAgVGhlIG5lc3RMZXZlbCB2YXJpYWJsZSBpcyBmb3IgcGxvdHRpbmcgZXZlbnRzIGFuZCBpcyByZWxhdGVkCisgICAgdG8gdGhlIGJhciB3aWR0aCBpbiB0aGUgdGltZWxpbmUgZ3JhcGguCisKKyAgICBFdmVyeSB0aHJlYWQgd2lsbCBoYXZlIGEgX190aHJlYWQgbG9jYWwgcG9pbnRlciB0byBpdHMgbm9kZSBpbgorICAgIHRoZSBsaXN0LiAgVGhlIHNlbnRpbmVsIG5vZGUgaXMgdXNlZCBieSB0aGUgbWFzdGVyIHRocmVhZCB0bworICAgIHN0b3JlICJkdW1teSIgc3RhdGlzdGljcyBiZWZvcmUgX19rbXBfY3JlYXRlX3dvcmtlcigpIGlzIGNhbGxlZC4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworY2xhc3Mga21wX3N0YXRzX2xpc3QgeworICAgIGludCBndGlkOworICAgIHRpbWVTdGF0ICAgICAgX3RpbWVyc1tUSU1FUl9MQVNUKzFdOworICAgIGNvdW50ZXIgICAgICAgX2NvdW50ZXJzW0NPVU5URVJfTEFTVCsxXTsKKyAgICBleHBsaWNpdFRpbWVyIF9leHBsaWNpdFRpbWVyc1tFWFBMSUNJVF9USU1FUl9MQVNUKzFdOworICAgIGludCAgICAgICAgICAgX25lc3RMZXZlbDsgLy8gb25lIHBlciB0aHJlYWQKKyAgICBrbXBfc3RhdHNfZXZlbnRfdmVjdG9yIF9ldmVudF92ZWN0b3I7CisgICAga21wX3N0YXRzX2xpc3QqIG5leHQ7CisgICAga21wX3N0YXRzX2xpc3QqIHByZXY7CisgcHVibGljOgorICAgIGttcF9zdGF0c19saXN0KCkgOiBuZXh0KHRoaXMpICwgcHJldih0aGlzKSAsIF9ldmVudF92ZWN0b3IoKSwgX25lc3RMZXZlbCgwKSB7CisjZGVmaW5lIGRvSW5pdChuYW1lLGlnbm9yZTEsaWdub3JlMikgXAorICAgICAgICBnZXRFeHBsaWNpdFRpbWVyKEVYUExJQ0lUX1RJTUVSXyMjbmFtZSktPnNldFN0YXQoZ2V0VGltZXIoVElNRVJfIyNuYW1lKSk7CisgICAgICAgIEtNUF9GT1JFQUNIX0VYUExJQ0lUX1RJTUVSKGRvSW5pdCwwKTsKKyN1bmRlZiBkb0luaXQKKyAgICB9CisgICB+a21wX3N0YXRzX2xpc3QoKSB7IH0KKyAgICBpbmxpbmUgdGltZVN0YXQgKiAgICAgIGdldFRpbWVyKHRpbWVyX2UgaWR4KSAgICAgICAgICAgICAgICAgIHsgcmV0dXJuICZfdGltZXJzW2lkeF07IH0KKyAgICBpbmxpbmUgY291bnRlciAgKiAgICAgIGdldENvdW50ZXIoY291bnRlcl9lIGlkeCkgICAgICAgICAgICAgIHsgcmV0dXJuICZfY291bnRlcnNbaWR4XTsgfQorICAgIGlubGluZSBleHBsaWNpdFRpbWVyICogZ2V0RXhwbGljaXRUaW1lcihleHBsaWNpdF90aW1lcl9lIGlkeCkgeyByZXR1cm4gJl9leHBsaWNpdFRpbWVyc1tpZHhdOyB9CisgICAgaW5saW5lIHRpbWVTdGF0ICogICAgICBnZXRUaW1lcnMoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBfdGltZXJzOyB9CisgICAgaW5saW5lIGNvdW50ZXIgICogICAgICBnZXRDb3VudGVycygpICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBfY291bnRlcnM7IH0KKyAgICBpbmxpbmUgZXhwbGljaXRUaW1lciAqIGdldEV4cGxpY2l0VGltZXJzKCkgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIF9leHBsaWNpdFRpbWVyczsgfQorICAgIGlubGluZSBrbXBfc3RhdHNfZXZlbnRfdmVjdG9yICYgZ2V0RXZlbnRWZWN0b3IoKSAgICAgICAgICAgICAgeyByZXR1cm4gX2V2ZW50X3ZlY3RvcjsgfQorICAgIGlubGluZSB2b2lkIHJlc2V0RXZlbnRWZWN0b3IoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBfZXZlbnRfdmVjdG9yLnJlc2V0KCk7IH0KKyAgICBpbmxpbmUgdm9pZCBpbmNyZW1lbnROZXN0VmFsdWUoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgX25lc3RMZXZlbCsrOyB9CisgICAgaW5saW5lIGludCAgZ2V0TmVzdFZhbHVlKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBfbmVzdExldmVsOyB9CisgICAgaW5saW5lIHZvaWQgZGVjcmVtZW50TmVzdFZhbHVlKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IF9uZXN0TGV2ZWwtLTsgfQorICAgIGlubGluZSBpbnQgIGdldEd0aWQoKSBjb25zdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gZ3RpZDsgfQorICAgIGlubGluZSB2b2lkIHNldEd0aWQoaW50IG5ld2d0aWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBndGlkID0gbmV3Z3RpZDsgfQorICAgIGttcF9zdGF0c19saXN0KiBwdXNoX2JhY2soaW50IGd0aWQpOyAvLyByZXR1cm5zIG5ld2x5IGNyZWF0ZWQgbGlzdCBub2RlCisgICAgaW5saW5lIHZvaWQgICAgIHB1c2hfZXZlbnQodWludDY0X3Qgc3RhcnRfdGltZSwgdWludDY0X3Qgc3RvcF90aW1lLCBpbnQgbmVzdF9sZXZlbCwgdGltZXJfZSBuYW1lKSB7CisgICAgICAgIF9ldmVudF92ZWN0b3IucHVzaF9iYWNrKHN0YXJ0X3RpbWUsIHN0b3BfdGltZSwgbmVzdF9sZXZlbCwgbmFtZSk7CisgICAgfQorICAgIHZvaWQgZGVhbGxvY2F0ZSgpOworICAgIGNsYXNzIGl0ZXJhdG9yOworICAgIGttcF9zdGF0c19saXN0OjppdGVyYXRvciBiZWdpbigpOworICAgIGttcF9zdGF0c19saXN0OjppdGVyYXRvciBlbmQoKTsKKyAgICBpbnQgc2l6ZSgpOworICAgIGNsYXNzIGl0ZXJhdG9yIHsKKyAgICAgICAga21wX3N0YXRzX2xpc3QqIHB0cjsKKyAgICAgICAgZnJpZW5kIGttcF9zdGF0c19saXN0OjppdGVyYXRvciBrbXBfc3RhdHNfbGlzdDo6YmVnaW4oKTsKKyAgICAgICAgZnJpZW5kIGttcF9zdGF0c19saXN0OjppdGVyYXRvciBrbXBfc3RhdHNfbGlzdDo6ZW5kKCk7CisgICAgICBwdWJsaWM6CisgICAgICAgIGl0ZXJhdG9yKCk7CisgICAgICAgfml0ZXJhdG9yKCk7CisgICAgICAgIGl0ZXJhdG9yIG9wZXJhdG9yKysoKTsKKyAgICAgICAgaXRlcmF0b3Igb3BlcmF0b3IrKyhpbnQgZHVtbXkpOworICAgICAgICBpdGVyYXRvciBvcGVyYXRvci0tKCk7CisgICAgICAgIGl0ZXJhdG9yIG9wZXJhdG9yLS0oaW50IGR1bW15KTsKKyAgICAgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGl0ZXJhdG9yICYgcmhzKTsKKyAgICAgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGl0ZXJhdG9yICYgcmhzKTsKKyAgICAgICAga21wX3N0YXRzX2xpc3QqIG9wZXJhdG9yKigpIGNvbnN0OyAvLyBkZXJlZmVyZW5jZSBvcGVyYXRvcgorICAgIH07Cit9OworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBDbGFzcyB0byBlbmNhcHN1bGF0ZSBhbGwgb3V0cHV0IGZ1bmN0aW9ucyBhbmQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcworCisgICBUaGlzIG1vZHVsZSBob2xkcyBmaWxlbmFtZXMgZm9yIHZhcmlvdXMgb3V0cHV0cyAobm9ybWFsIHN0YXRzLCBldmVudHMsIHBsb3QgZmlsZSksCisgICBhcyB3ZWxsIGFzIGNvbG9yaW5nIGluZm9ybWF0aW9uIGZvciB0aGUgcGxvdCBmaWxlLgorCisgICBUaGUgZmlsZW5hbWVzIGFuZCBmbGFncyB2YXJpYWJsZXMgYXJlIHJlYWQgZnJvbSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuCisgICBUaGVzZSBhcmUgcmVhZCBvbmNlIGJ5IHRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgZ2xvYmFsIHZhcmlhYmxlIF9fa21wX3N0YXRzX291dHB1dAorICAgd2hpY2ggY2FsbHMgaW5pdCgpLgorCisgICBEdXJpbmcgdGhpcyBpbml0KCkgY2FsbCwgZXZlbnQgZmxhZ3MgZm9yIHRoZSB0aW1lU3RhdDo6dGltZXJJbmZvW10gZ2xvYmFsIGFycmF5CisgICBhcmUgY2xlYXJlZCBpZiBLTVBfU1RBVFNfRVZFTlRTIGlzIG5vdCB0cnVlIChvbiwgMSwgeWVzKS4KKworICAgVGhlIG9ubHkgaW50ZXJmYWNlIGZ1bmN0aW9uIHRoYXQgaXMgcHVibGljIGlzIG91dHB1dFN0YXRzKGhlYWRpbmcpLiAgVGhpcyBmdW5jdGlvbgorICAgc2hvdWxkIHByaW50IG91dCBldmVyeXRoaW5nIGl0IG5lZWRzIHRvLCBlaXRoZXIgdG8gZmlsZXMgb3Igc3RkZXJyLAorICAgZGVwZW5kaW5nIG9uIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZGVzY3JpYmVkIGJlbG93CisKKyAgIEVOVklST05NRU5UIFZBUklBQkxFUzoKKyAgIEtNUF9TVEFUU19GSUxFIC0tIGlmIHNldCwgYWxsIHN0YXRpc3RpY3MgKG5vdCBldmVudHMpIHdpbGwgYmUgcHJpbnRlZCB0byB0aGlzIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICBvdGhlcndpc2UsIHByaW50IHRvIHN0ZGVycgorICAgS01QX1NUQVRTX1RIUkVBRFMgLS0gaWYgc2V0IHRvICJvbiIsIHRoZW4gd2lsbCBwcmludCBwZXIgdGhyZWFkIHN0YXRpc3RpY3MgdG8gZWl0aGVyCisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfU1RBVFNfRklMRSBvciBzdGRlcnIKKyAgIEtNUF9TVEFUU19QTE9UX0ZJTEUgLS0gaWYgc2V0LCBwcmludCB0aGUgcGxvdGljdXMgcGxvdCBmaWxlIHRvIHRoaXMgZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyd2lzZSwgdGhlIHBsb3QgZmlsZSBpcyBzZW50IHRvICJldmVudHMucGx0IgorICAgS01QX1NUQVRTX0VWRU5UUyAtLSBpZiBzZXQgdG8gIm9uIiwgdGhlbiBsb2cgZXZlbnRzLCBvdGhlcndpc2UsIGRvbid0IGxvZyBldmVudHMKKyAgIEtNUF9TVEFUU19FVkVOVFNfRklMRSAtLSBpZiBzZXQsIGFsbCBldmVudHMgYXJlIG91dHB1dHRlZCB0byB0aGlzIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJ3aXNlLCBvdXRwdXQgaXMgc2VudCB0byAiZXZlbnRzLmRhdCIKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworY2xhc3Mga21wX3N0YXRzX291dHB1dF9tb2R1bGUgeworCisgcHVibGljOgorICAgIHN0cnVjdCByZ2JfY29sb3IgeworICAgICAgICBmbG9hdCByOworICAgICAgICBmbG9hdCBnOworICAgICAgICBmbG9hdCBiOworICAgIH07CisKKyBwcml2YXRlOgorICAgIHN0YXRpYyBjb25zdCBjaGFyKiBvdXRwdXRGaWxlTmFtZTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciogZXZlbnRzRmlsZU5hbWU7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIHBsb3RGaWxlTmFtZTsKKyAgICBzdGF0aWMgaW50IHByaW50UGVyVGhyZWFkRmxhZzsKKyAgICBzdGF0aWMgaW50IHByaW50UGVyVGhyZWFkRXZlbnRzRmxhZzsKKyAgICBzdGF0aWMgY29uc3QgcmdiX2NvbG9yIGdsb2JhbENvbG9yQXJyYXlbXTsKKyAgICBzdGF0aWMgICAgICAgcmdiX2NvbG9yIHRpbWVyQ29sb3JJbmZvW107CisKKyAgICB2b2lkIGluaXQoKTsKKyAgICBzdGF0aWMgdm9pZCBzZXR1cEV2ZW50Q29sb3JzKCk7CisgICAgc3RhdGljIHZvaWQgcHJpbnRQbG90aWN1c0ZpbGUoKTsKKyAgICBzdGF0aWMgdm9pZCBwcmludFN0YXRzKEZJTEUgKnN0YXRzT3V0LCBzdGF0aXN0aWMgY29uc3QgKiB0aGVTdGF0cywgYm9vbCBhcmVUaW1lcnMpOworICAgIHN0YXRpYyB2b2lkIHByaW50Q291bnRlcnMoRklMRSAqIHN0YXRzT3V0LCBjb3VudGVyIGNvbnN0ICogdGhlQ291bnRlcnMpOworICAgIHN0YXRpYyB2b2lkIHByaW50RXZlbnRzKEZJTEUgKiBldmVudHNPdXQsIGttcF9zdGF0c19ldmVudF92ZWN0b3IqIHRoZUV2ZW50cywgaW50IGd0aWQpOworICAgIHN0YXRpYyByZ2JfY29sb3IgZ2V0RXZlbnRDb2xvcih0aW1lcl9lIGUpIHsgcmV0dXJuIHRpbWVyQ29sb3JJbmZvW2VdOyB9CisgICAgc3RhdGljIHZvaWQgd2luZHVwRXhwbGljaXRUaW1lcnMoKTsKKyAgICBib29sIGV2ZW50UHJpbnRpbmdFbmFibGVkKCkgeworICAgICAgICBpZihwcmludFBlclRocmVhZEV2ZW50c0ZsYWcpIHJldHVybiB0cnVlOworICAgICAgICBlbHNlIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgYm9vbCBwZXJUaHJlYWRQcmludGluZ0VuYWJsZWQoKSB7CisgICAgICAgIGlmKHByaW50UGVyVGhyZWFkRmxhZykgcmV0dXJuIHRydWU7CisgICAgICAgIGVsc2UgcmV0dXJuIGZhbHNlOworICAgIH0KKworIHB1YmxpYzoKKyAgICBrbXBfc3RhdHNfb3V0cHV0X21vZHVsZSgpIHsgaW5pdCgpOyB9CisgICAgdm9pZCBvdXRwdXRTdGF0cyhjb25zdCBjaGFyKiBoZWFkaW5nKTsKK307CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKK3ZvaWQgX19rbXBfc3RhdHNfaW5pdCgpOwordm9pZCBfX2ttcF9yZXNldF9zdGF0cygpOwordm9pZCBfX2ttcF9vdXRwdXRfc3RhdHMoY29uc3QgY2hhciAqKTsKK3ZvaWQgX19rbXBfYWNjdW11bGF0ZV9zdGF0c19hdF9leGl0KHZvaWQpOworLy8gdGhyZWFkIGxvY2FsIHBvaW50ZXIgdG8gc3RhdHMgbm9kZSB3aXRoaW4gbGlzdAorZXh0ZXJuIF9fdGhyZWFkIGttcF9zdGF0c19saXN0KiBfX2ttcF9zdGF0c190aHJlYWRfcHRyOworLy8gaGVhZCB0byBzdGF0cyBsaXN0LgorZXh0ZXJuIGttcF9zdGF0c19saXN0IF9fa21wX3N0YXRzX2xpc3Q7CisvLyBsb2NrIGZvciBfX2ttcF9zdGF0c19saXN0CitleHRlcm4ga21wX3Rhc19sb2NrX3QgIF9fa21wX3N0YXRzX2xvY2s7CisvLyByZWZlcmVuY2Ugc3RhcnQgdGltZQorZXh0ZXJuIHRzY190aWNrX2NvdW50IF9fa21wX3N0YXRzX3N0YXJ0X3RpbWU7CisvLyBpbnRlcmZhY2UgdG8gb3V0cHV0CitleHRlcm4ga21wX3N0YXRzX291dHB1dF9tb2R1bGUgX19rbXBfc3RhdHNfb3V0cHV0OworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisvLyBTaW1wbGUsIHN0YW5kYXJkIGludGVyZmFjZXMgdGhhdCBkcm9wIG91dCBjb21wbGV0ZWx5IGlmIHN0YXRzIGFyZW4ndCBlbmFibGVkCisKKworLyohCisgKiBcYnJpZWYgVXNlcyBzcGVjaWZpZWQgdGltZXIgKG5hbWUpIHRvIHRpbWUgY29kZSBibG9jay4KKyAqCisgKiBAcGFyYW0gbmFtZSB0aW1lciBuYW1lIGFzIHNwZWNpZmllZCB1bmRlciB0aGUgS01QX0ZPUkVBQ0hfVElNRVIoKSBtYWNybworICoKKyAqIFxkZXRhaWxzIFVzZSBLTVBfVElNRV9CTE9DSyhuYW1lKSBtYWNybyB0byB0aW1lIGEgY29kZSBibG9jay4gIFRoaXMgd2lsbCByZWNvcmQgdGhlIHRpbWUgdGFrZW4gaW4gdGhlIGJsb2NrCisgKiBhbmQgdXNlIHRoZSBkZXN0cnVjdG9yIHRvIHN0b3AgdGhlIHRpbWVyLiAgQ29udmVuaWVudCEKKyAqIFdpdGggdGhpcyBkZWZpbml0aW9uIHlvdSBjYW4ndCBoYXZlIG1vcmUgdGhhbiBvbmUgS01QX1RJTUVfQkxPQ0sgaW4gdGhlIHNhbWUgY29kZSBibG9jay4KKyAqIEkgZG9uJ3QgdGhpbmsgdGhhdCdzIGEgcHJvYmxlbS4KKyAqCisgKiBAaW5ncm91cCBTVEFUU19HQVRIRVJJTkcKKyovCisjZGVmaW5lIEtNUF9USU1FX0JMT0NLKG5hbWUpIFwKKyAgICBibG9ja1RpbWVyIF9fQkxPQ0tUSU1FX18oX19rbXBfc3RhdHNfdGhyZWFkX3B0ci0+Z2V0VGltZXIoVElNRVJfIyNuYW1lKSwgVElNRVJfIyNuYW1lKQorCisvKiEKKyAqIFxicmllZiBBZGRzIHZhbHVlIHRvIHNwZWNpZmllZCB0aW1lciAobmFtZSkuCisgKgorICogQHBhcmFtIG5hbWUgdGltZXIgbmFtZSBhcyBzcGVjaWZpZWQgdW5kZXIgdGhlIEtNUF9GT1JFQUNIX1RJTUVSKCkgbWFjcm8KKyAqIEBwYXJhbSB2YWx1ZSBkb3VibGUgcHJlY2lzaW9uIHNhbXBsZSB2YWx1ZSB0byBhZGQgdG8gc3RhdGlzdGljcyBmb3IgdGhlIHRpbWVyCisgKgorICogXGRldGFpbHMgVXNlIEtNUF9DT1VOVF9WQUxVRShuYW1lLCB2YWx1ZSkgbWFjcm8gdG8gYWRkIGEgcGFydGljdWxhciB2YWx1ZSB0byBhIHRpbWVyIHN0YXRpc3RpY3MuCisgKgorICogQGluZ3JvdXAgU1RBVFNfR0FUSEVSSU5HCisqLworI2RlZmluZSBLTVBfQ09VTlRfVkFMVUUobmFtZSwgdmFsdWUpIFwKKyAgICBfX2ttcF9zdGF0c190aHJlYWRfcHRyLT5nZXRUaW1lcihUSU1FUl8jI25hbWUpLT5hZGRTYW1wbGUodmFsdWUpCisKKy8qIQorICogXGJyaWVmIEluY3JlbWVudHMgc3BlY2lmaWVkIGNvdW50ZXIgKG5hbWUpLgorICoKKyAqIEBwYXJhbSBuYW1lIGNvdW50ZXIgbmFtZSBhcyBzcGVjaWZpZWQgdW5kZXIgdGhlIEtNUF9GT1JFQUNIX0NPVU5URVIoKSBtYWNybworICoKKyAqIFxkZXRhaWxzIFVzZSBLTVBfQ09VTlRfQkxPQ0sobmFtZSwgdmFsdWUpIG1hY3JvIHRvIGluY3JlbWVudCBhIHN0YXRpc3RpY3MgY291bnRlciBmb3IgdGhlIGV4ZWN1dGluZyB0aHJlYWQuCisgKgorICogQGluZ3JvdXAgU1RBVFNfR0FUSEVSSU5HCisqLworI2RlZmluZSBLTVBfQ09VTlRfQkxPQ0sobmFtZSkgXAorICAgX19rbXBfc3RhdHNfdGhyZWFkX3B0ci0+Z2V0Q291bnRlcihDT1VOVEVSXyMjbmFtZSktPmluY3JlbWVudCgpCisKKy8qIQorICogXGJyaWVmICJTdGFydHMiIGFuIGV4cGxpY2l0IHRpbWVyIHdoaWNoIHdpbGwgbmVlZCBhIGNvcnJlc3BvbmRpbmcgS01QX1NUT1BfRVhQTElDSVRfVElNRVIoKSBtYWNyby4KKyAqCisgKiBAcGFyYW0gbmFtZSBleHBsaWNpdCB0aW1lciBuYW1lIGFzIHNwZWNpZmllZCB1bmRlciB0aGUgS01QX0ZPUkVBQ0hfRVhQTElDSVRfVElNRVIoKSBtYWNybworICoKKyAqIFxkZXRhaWxzIFVzZSB0byBzdGFydCBhIHRpbWVyLiAgVGhpcyB3aWxsIG5lZWQgYSBjb3JyZXNwb25kaW5nIEtNUF9TVE9QX0VYUExJQ0lUX1RJTUVSKCkKKyAqIG1hY3JvIHRvIHN0b3AgdGhlIHRpbWVyIHVubGlrZSB0aGUgS01QX1RJTUVfQkxPQ0sobmFtZSkgbWFjcm8gd2hpY2ggaGFzIGFuIGltcGxpY2l0IHN0b3BwaW5nIG1hY3JvIGF0IHRoZSBlbmQKKyAqIG9mIHRoZSBjb2RlIGJsb2NrLiAgQWxsIGV4cGxpY2l0IHRpbWVycyBhcmUgc3RvcHBlZCBhdCBsaWJyYXJ5IGV4aXQgdGltZSBiZWZvcmUgdGhlIGZpbmFsIHN0YXRpc3RpY3MgYXJlIG91dHB1dHRlZC4KKyAqCisgKiBAaW5ncm91cCBTVEFUU19HQVRIRVJJTkcKKyovCisjZGVmaW5lIEtNUF9TVEFSVF9FWFBMSUNJVF9USU1FUihuYW1lKSBcCisgICAgX19rbXBfc3RhdHNfdGhyZWFkX3B0ci0+Z2V0RXhwbGljaXRUaW1lcihFWFBMSUNJVF9USU1FUl8jI25hbWUpLT5zdGFydChUSU1FUl8jI25hbWUpCisKKy8qIQorICogXGJyaWVmICJTdG9wcyIgYW4gZXhwbGljaXQgdGltZXIuCisgKgorICogQHBhcmFtIG5hbWUgZXhwbGljaXQgdGltZXIgbmFtZSBhcyBzcGVjaWZpZWQgdW5kZXIgdGhlIEtNUF9GT1JFQUNIX0VYUExJQ0lUX1RJTUVSKCkgbWFjcm8KKyAqCisgKiBcZGV0YWlscyBVc2UgS01QX1NUT1BfRVhQTElDSVRfVElNRVIobmFtZSkgdG8gc3RvcCBhIHRpbWVyLiAgV2hlbiB0aGlzIGlzIGRvbmUsIHRoZSB0aW1lIGJldHdlZW4gdGhlIGxhc3QgS01QX1NUQVJUX0VYUExJQ0lUX1RJTUVSKG5hbWUpCisgKiBhbmQgdGhpcyBLTVBfU1RPUF9FWFBMSUNJVF9USU1FUihuYW1lKSB3aWxsIGJlIGFkZGVkIHRvIHRoZSB0aW1lcidzIHN0YXQgdmFsdWUuICBUaGUgdGltZXIgd2lsbCB0aGVuIGJlIHJlc2V0LgorICogQWZ0ZXIgdGhlIEtNUF9TVE9QX0VYUExJQ0lUX1RJTUVSKG5hbWUpIG1hY3JvIGlzIGNhbGxlZCwgYW5vdGhlciBjYWxsIHRvIEtNUF9TVEFSVF9FWFBMSUNJVF9USU1FUihuYW1lKSB3aWxsIHN0YXJ0IHRoZSB0aW1lciBvbmNlIGFnYWluLgorICoKKyAqIEBpbmdyb3VwIFNUQVRTX0dBVEhFUklORworKi8KKyNkZWZpbmUgS01QX1NUT1BfRVhQTElDSVRfVElNRVIobmFtZSkgXAorICAgIF9fa21wX3N0YXRzX3RocmVhZF9wdHItPmdldEV4cGxpY2l0VGltZXIoRVhQTElDSVRfVElNRVJfIyNuYW1lKS0+c3RvcChUSU1FUl8jI25hbWUpCisKKy8qIQorICogXGJyaWVmIE91dHB1dHMgdGhlIGN1cnJlbnQgdGhyZWFkIHN0YXRpc3RpY3MgYW5kIHJlc2V0IHRoZW0uCisgKgorICogQHBhcmFtIGhlYWRpbmdfc3RyaW5nIGhlYWRpbmcgcHV0IGFib3ZlIHRoZSBmaW5hbCBzdGF0cyBvdXRwdXQKKyAqCisgKiBcZGV0YWlscyBFeHBsaWNpdGx5IHN0b3BzIGFsbCB0aW1lcnMgYW5kIG91dHB1dHMgYWxsIHN0YXRzLgorICogRW52aXJvbm1lbnQgdmFyaWFibGUsIGBPTVBUQl9TVEFUU0ZJTEU9ZmlsZW5hbWVgLCBjYW4gYmUgdXNlZCB0byBvdXRwdXQgdGhlIHN0YXRzIHRvIGEgZmlsZW5hbWUgaW5zdGVhZCBvZiBzdGRlcnIKKyAqIEVudmlyb25tZW50IHZhcmlhYmxlLCBgT01QVEJfU1RBVFNUSFJFQURTPXRydWV8dW5kZWZpbmVkYCwgY2FuIGJlIHVzZWQgdG8gb3V0cHV0IHRocmVhZCBzcGVjaWZpYyBzdGF0cworICogRm9yIG5vdyB0aGUgYE9NUFRCX1NUQVRTVEhSRUFEU2AgZW52aXJvbm1lbnQgdmFyaWFibGUgY2FuIGVpdGhlciBiZSBkZWZpbmVkIHdpdGggYW55IHZhbHVlLCB3aGljaCB3aWxsIHByaW50IG91dCB0aHJlYWQKKyAqIHNwZWNpZmljIHN0YXRzLCBvciBpdCBjYW4gYmUgdW5kZWZpbmVkIChub3Qgc3BlY2lmaWVkIGluIHRoZSBlbnZpcm9ubWVudCkgYW5kIHRocmVhZCBzcGVjaWZpYyBzdGF0cyB3b24ndCBiZSBwcmludGVkCisgKiBJdCBzaG91bGQgYmUgbm90ZWQgdGhhdCBhbGwgc3RhdGlzdGljcyBhcmUgcmVzZXQgd2hlbiB0aGlzIG1hY3JvIGlzIGNhbGxlZC4KKyAqCisgKiBAaW5ncm91cCBTVEFUU19HQVRIRVJJTkcKKyovCisjZGVmaW5lIEtNUF9PVVRQVVRfU1RBVFMoaGVhZGluZ19zdHJpbmcpIFwKKyAgICBfX2ttcF9vdXRwdXRfc3RhdHMoaGVhZGluZ19zdHJpbmcpCisKKy8qIQorICogXGJyaWVmIHJlc2V0cyBhbGwgc3RhdHMgKGNvdW50ZXJzIHRvIDAsIHRpbWVycyB0byAwIGVsYXBzZWQgdGlja3MpCisgKgorICogXGRldGFpbHMgUmVzZXQgYWxsIHN0YXRzIGZvciBhbGwgdGhyZWFkcy4KKyAqCisgKiBAaW5ncm91cCBTVEFUU19HQVRIRVJJTkcKKyovCisjZGVmaW5lIEtNUF9SRVNFVF9TVEFUUygpICBfX2ttcF9yZXNldF9zdGF0cygpCisKKyNlbHNlIC8vIEtNUF9TVEFUU19FTkFCTEVECisKKy8vIE51bGwgZGVmaW5pdGlvbnMKKyNkZWZpbmUgS01QX1RJTUVfQkxPQ0sobikgICAgICAgICAgICAgKCh2b2lkKTApCisjZGVmaW5lIEtNUF9DT1VOVF9WQUxVRShuLHYpICAgICAgICAgICgodm9pZCkwKQorI2RlZmluZSBLTVBfQ09VTlRfQkxPQ0sobikgICAgICAgICAgICAoKHZvaWQpMCkKKyNkZWZpbmUgS01QX1NUQVJUX0VYUExJQ0lUX1RJTUVSKG4pICAgKCh2b2lkKTApCisjZGVmaW5lIEtNUF9TVE9QX0VYUExJQ0lUX1RJTUVSKG4pICAgICgodm9pZCkwKQorCisjZGVmaW5lIEtNUF9PVVRQVVRfU1RBVFMoaGVhZGluZ19zdHJpbmcpICgodm9pZCkwKQorI2RlZmluZSBLTVBfUkVTRVRfU1RBVFMoKSAgKCh2b2lkKTApCisKKyNlbmRpZiAgLy8gS01QX1NUQVRTX0VOQUJMRUQKKworI2VuZGlmIC8vIEtNUF9TVEFUU19ICmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfc3RhdHNfdGltaW5nLmNwcCBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9zdGF0c190aW1pbmcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4N2VhNGYKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfc3RhdHNfdGltaW5nLmNwcApAQCAtMCwwICsxLDE2NyBAQAorLyoqIEBmaWxlIGttcF9zdGF0c190aW1pbmcuY3BwCisgKiBUaW1pbmcgZnVuY3Rpb25zCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPGlvbWFuaXA+CisjaW5jbHVkZSA8c3N0cmVhbT4KKworI2luY2x1ZGUgImttcF9zdGF0c190aW1pbmcuaCIKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworI2lmIEtNUF9PU19MSU5VWAorIyBpZiBLTVBfTUlDCitkb3VibGUgdHNjX3RpY2tfY291bnQ6OnRpY2tfdGltZSgpCit7CisgICAgLy8gcHJldHR5IGJhZCBhc3N1bXB0aW9uIG9mIDFHSHogY2xvY2sgZm9yIE1JQworICAgIHJldHVybiAxLygoZG91YmxlKTEwMDAqMS5lNik7Cit9CisjIGVsc2UKKyMgIGluY2x1ZGUgPHN0cmluZy5oPgorLy8gRXh0cmFjdCB0aGUgdmFsdWUgZnJvbSB0aGUgQ1BVSUQgaW5mb3JtYXRpb24KK2RvdWJsZSB0c2NfdGlja19jb3VudDo6dGlja190aW1lKCkKK3sKKyAgICBzdGF0aWMgZG91YmxlIHJlc3VsdCA9IDAuMDsKKworICAgIGlmIChyZXN1bHQgPT0gMC4wKQorICAgIHsKKyAgICAgICAgaW50IGNwdWluZm9bNF07CisgICAgICAgIGNoYXIgYnJhbmRbMjU2XTsKKworICAgICAgICBfX2NwdWlkKGNwdWluZm8sIDB4ODAwMDAwMDApOworICAgICAgICBtZW1zZXQoYnJhbmQsIDAsIHNpemVvZihicmFuZCkpOworICAgICAgICBpbnQgaWRzID0gY3B1aW5mb1swXTsKKworICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBpPTI7IGk8KGlkc14weDgwMDAwMDAwKSsyOyBpKyspCisgICAgICAgICAgICBfX2NwdWlkKGJyYW5kKyhpLTIpKnNpemVvZihjcHVpbmZvKSwgaSB8IDB4ODAwMDAwMDApOworCisgICAgICAgIGNoYXIgKiBzdGFydCA9ICZicmFuZFswXTsKKyAgICAgICAgZm9yICg7KnN0YXJ0ID09ICcgJzsgc3RhcnQrKykKKyAgICAgICAgICAgIDsKKyAgICAKKyAgICAgICAgY2hhciAqIGVuZCA9IGJyYW5kICsgc3RybGVuKGJyYW5kKSAtIDM7CisgICAgICAgIHVpbnQ2NF90IG11bHRpcGxpZXI7CisKKyAgICAgICAgaWYgKCplbmQgPT0gJ00nKSBtdWx0aXBsaWVyID0gMTAwMExMKjEwMDBMTDsKKyAgICAgICAgZWxzZSBpZiAoKmVuZCA9PSAnRycpIG11bHRpcGxpZXIgPSAxMDAwTEwqMTAwMExMKjEwMDBMTDsKKyAgICAgICAgZWxzZSBpZiAoKmVuZCA9PSAnVCcpIG11bHRpcGxpZXIgPSAxMDAwTEwqMTAwMExMKjEwMDBMTCoxMDAwTEw7CisgICAgICAgIGVsc2UgCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvdXQgPDwgIkVycm9yIGRldGVybWluaW5nIG11bHRpcGxpZXIgJyIgPDwgKmVuZCA8PCAiJ1xuIjsKKyAgICAgICAgICAgIGV4aXQgKC0xKTsKKyAgICAgICAgfQorICAgICAgICAqZW5kID0gMDsKKyAgICAgICAgd2hpbGUgKCplbmQgIT0gJyAnKSBlbmQtLTsKKyAgICAgICAgZW5kKys7CisgICAgCisgICAgICAgIGRvdWJsZSBmcmVxID0gc3RydG9kKGVuZCwgJnN0YXJ0KTsKKyAgICAgICAgaWYgKGZyZXEgPT0gMC4wKSAKKyAgICAgICAgeworICAgICAgICAgICAgY291dCA8PCAiRXJyb3IgY2FsY3VsYXRpbmcgZnJlcXVlbmN5ICIgPDwgIGVuZCA8PCAiXG4iOworICAgICAgICAgICAgZXhpdCAoLTEpOworICAgICAgICB9CisKKyAgICAgICAgcmVzdWx0ID0gKChkb3VibGUpMS4wKS8oZnJlcSAqIG11bHRpcGxpZXIpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorIyBlbmRpZgorI2VuZGlmCisKK3N0YXRpYyBib29sIHVzZVNJID0gdHJ1ZTsKKworLy8gUmV0dXJuIGEgZm9ybWF0dGVkIHN0cmluZyBhZnRlciBub3JtYWxpc2luZyB0aGUgdmFsdWUgaW50bworLy8gZW5naW5lZXJpbmcgc3R5bGUgYW5kIHVzaW5nIGEgc3VpdGFibGUgdW5pdCBwcmVmaXggKGUuZy4gbXMsIHVzLCBucykuCitzdGQ6OnN0cmluZyBmb3JtYXRTSShkb3VibGUgaW50ZXJ2YWwsIGludCB3aWR0aCwgY2hhciB1bml0KQoreworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIG9zOworCisgICAgaWYgKHVzZVNJKQorICAgIHsKKyAgICAgICAgLy8gUHJlc2VydmUgYWNjdXJhY3kgZm9yIHNtYWxsIG51bWJlcnMsIHNpbmNlIHdlIG9ubHkgbXVsdGlwbHkgYW5kIHRoZSBwb3NpdGl2ZSBwb3dlcnMKKyAgICAgICAgLy8gb2YgdGVuIGFyZSBwcmVjaXNlbHkgcmVwcmVzZW50YWJsZS4gCisgICAgICAgIHN0YXRpYyBzdHJ1Y3QgeyBkb3VibGUgc2NhbGU7IGNoYXIgcHJlZml4OyB9IHJhbmdlc1tdID0geworICAgICAgICAgICAgezEuZTEyLCdmJ30sCisgICAgICAgICAgICB7MS5lOSwgJ3AnfSwKKyAgICAgICAgICAgIHsxLmU2LCAnbid9LAorICAgICAgICAgICAgezEuZTMsICd1J30sCisgICAgICAgICAgICB7MS4wLCAgJ20nfSwKKyAgICAgICAgICAgIHsxLmUtMywnICd9LAorICAgICAgICAgICAgezEuZS02LCdrJ30sCisgICAgICAgICAgICB7MS5lLTksJ00nfSwKKyAgICAgICAgICAgIHsxLmUtMTIsJ0cnfSwKKyAgICAgICAgICAgIHsxLmUtMTUsJ1QnfSwKKyAgICAgICAgICAgIHsxLmUtMTgsJ1AnfSwKKyAgICAgICAgICAgIHsxLmUtMjEsJ0UnfSwKKyAgICAgICAgICAgIHsxLmUtMjQsJ1onfSwKKyAgICAgICAgICAgIHsxLmUtMjcsJ1knfQorICAgICAgICB9OworICAgICAgICAKKyAgICAgICAgaWYgKGludGVydmFsID09IDAuMCkKKyAgICAgICAgeworICAgICAgICAgICAgb3MgPDwgc3RkOjpzZXR3KHdpZHRoLTMpIDw8IHN0ZDo6cmlnaHQgPDwgIjAuMDAiIDw8IHN0ZDo6c2V0dygzKSA8PCB1bml0OworICAgICAgICAgICAgcmV0dXJuIG9zLnN0cigpOworICAgICAgICB9CisKKyAgICAgICAgYm9vbCBuZWdhdGl2ZSA9IGZhbHNlOworICAgICAgICBpZiAoaW50ZXJ2YWwgPCAwLjApCisgICAgICAgIHsKKyAgICAgICAgICAgIG5lZ2F0aXZlID0gdHJ1ZTsKKyAgICAgICAgICAgIGludGVydmFsID0gLWludGVydmFsOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBmb3IgKGludCBpPTA7IGk8KGludCkoc2l6ZW9mKHJhbmdlcykvc2l6ZW9mKHJhbmdlc1swXSkpOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpbnRlcnZhbCpyYW5nZXNbaV0uc2NhbGUgPCAxLmUwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludGVydmFsID0gaW50ZXJ2YWwgKiAxMDAwLmUwICogcmFuZ2VzW2ldLnNjYWxlOworICAgICAgICAgICAgICAgIG9zIDw8IHN0ZDo6Zml4ZWQgPDwgc3RkOjpzZXRwcmVjaXNpb24oMikgPDwgc3RkOjpzZXR3KHdpZHRoLTMpIDw8IHN0ZDo6cmlnaHQgPDwgCisgICAgICAgICAgICAgICAgICAgIChuZWdhdGl2ZSA/IC1pbnRlcnZhbCA6IGludGVydmFsKSA8PCBzdGQ6OnNldHcoMikgPDwgcmFuZ2VzW2ldLnByZWZpeCA8PCBzdGQ6OnNldHcoMSkgPDwgdW5pdDsKKworICAgICAgICAgICAgICAgIHJldHVybiBvcy5zdHIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBvcyA8PCBzdGQ6OnNldHByZWNpc2lvbigyKSA8PCBzdGQ6OmZpeGVkIDw8IHN0ZDo6cmlnaHQgPDwgc3RkOjpzZXR3KHdpZHRoLTMpIDw8IGludGVydmFsIDw8IHN0ZDo6c2V0dygzKSA8PCB1bml0OworCisgICAgcmV0dXJuIG9zLnN0cigpOworfQorCit0c2NfdGlja19jb3VudDo6dHNjX2ludGVydmFsX3QgY29tcHV0ZUxhc3RJbkxhc3RPdXRJbnRlcnZhbCh0aW1lUGFpciAqIHRpbWVzLCBpbnQgblRpbWVzKQoreworICAgIHRpbWVQYWlyIGxhc3RUaW1lcyA9IHRpbWVzWzBdOworICAgIHRzY190aWNrX2NvdW50ICogc3RhcnRwID0gbGFzdFRpbWVzLmdldF9zdGFydHAoKTsKKyAgICB0c2NfdGlja19jb3VudCAqIGVuZHAgICA9IGxhc3RUaW1lcy5nZXRfZW5kcCgpOworCisgICAgZm9yIChpbnQgaT0xOyBpPG5UaW1lczsgaSsrKQorICAgIHsKKyAgICAgICAoKnN0YXJ0cCkgPSBzdGFydHAtPmxhdGVyKHRpbWVzW2ldLmdldF9zdGFydCgpKTsKKyAgICAgICAoKmVuZHApICAgPSBlbmRwLT5sYXRlciAgKHRpbWVzW2ldLmdldF9lbmQoKSk7CisgICAgfQorCisgICAgcmV0dXJuIGxhc3RUaW1lcy5kdXJhdGlvbigpOworfQorCitzdGQ6OnN0cmluZyB0aW1lUGFpcjo6Zm9ybWF0KCkgY29uc3QKK3sKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworCisgICAgb3NzIDw8IHN0YXJ0LmdldFZhbHVlKCkgPDwgIjoiIDw8IGVuZC5nZXRWYWx1ZSgpIDw8ICIgPSAiIDw8IChlbmQtc3RhcnQpLmdldFZhbHVlKCk7CisKKyAgICByZXR1cm4gb3NzLnN0cigpOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX3N0YXRzX3RpbWluZy5oIGIvZmluYWwvcnVudGltZS9zcmMva21wX3N0YXRzX3RpbWluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiZGZkZWEKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfc3RhdHNfdGltaW5nLmgKQEAgLTAsMCArMSwxMDQgQEAKKyNpZm5kZWYgS01QX1NUQVRTX1RJTUlOR19ICisjZGVmaW5lIEtNUF9TVEFUU19USU1JTkdfSAorCisvKiogQGZpbGUga21wX3N0YXRzX3RpbWluZy5oCisgKiBBY2Nlc3MgdG8gcmVhbCB0aW1lIGNsb2NrIGFuZCB0aW1lcnMuCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSAia21wX29zLmgiCisKK2NsYXNzIHRzY190aWNrX2NvdW50IHsKKyAgcHJpdmF0ZToKKyAgICBpbnQ2NF90IG15X2NvdW50OworCisgIHB1YmxpYzoKKyAgICBjbGFzcyB0c2NfaW50ZXJ2YWxfdCB7CisgICAgICAgIGludDY0X3QgdmFsdWU7CisgICAgICAgIGV4cGxpY2l0IHRzY19pbnRlcnZhbF90KGludDY0X3QgX3ZhbHVlKSA6IHZhbHVlKF92YWx1ZSkge30KKyAgICAgcHVibGljOgorICAgICAgICB0c2NfaW50ZXJ2YWxfdCgpIDogdmFsdWUoMCkge307IC8vIENvbnN0cnVjdCAwIHRpbWUgZHVyYXRpb24KKyAgICAgICAgZG91YmxlIHNlY29uZHMoKSBjb25zdDsgLy8gUmV0dXJuIHRoZSBsZW5ndGggb2YgYSB0aW1lIGludGVydmFsIGluIHNlY29uZHMKKyAgICAgICAgZG91YmxlIHRpY2tzKCkgY29uc3QgeyByZXR1cm4gZG91YmxlKHZhbHVlKTsgfQorICAgICAgICBpbnQ2NF90IGdldFZhbHVlKCkgY29uc3QgeyByZXR1cm4gdmFsdWU7IH0KKworICAgICAgICBmcmllbmQgY2xhc3MgdHNjX3RpY2tfY291bnQ7CisKKyAgICAgICAgZnJpZW5kIHRzY19pbnRlcnZhbF90IG9wZXJhdG9yLSgKKyAgICAgICAgY29uc3QgdHNjX3RpY2tfY291bnQgdDEsIGNvbnN0IHRzY190aWNrX2NvdW50IHQwKTsKKyAgICB9OworCisgICAgdHNjX3RpY2tfY291bnQoKSA6IG15X2NvdW50KHN0YXRpY19jYXN0PGludDY0X3Q+KF9fcmR0c2MoKSkpIHt9OworICAgIHRzY190aWNrX2NvdW50KGludDY0X3QgdmFsdWUpIDogbXlfY291bnQodmFsdWUpIHt9OworICAgIGludDY0X3QgZ2V0VmFsdWUoKSBjb25zdCB7IHJldHVybiBteV9jb3VudDsgfQorICAgIHRzY190aWNrX2NvdW50IGxhdGVyICh0c2NfdGlja19jb3VudCBjb25zdCBvdGhlcikgY29uc3QgeyAKKyAgICAgICAgcmV0dXJuIG15X2NvdW50ID4gb3RoZXIubXlfY291bnQgPyAoKnRoaXMpIDogb3RoZXI7IAorICAgIH0KKyAgICB0c2NfdGlja19jb3VudCBlYXJsaWVyKHRzY190aWNrX2NvdW50IGNvbnN0IG90aGVyKSBjb25zdCB7IAorICAgICAgICByZXR1cm4gbXlfY291bnQgPCBvdGhlci5teV9jb3VudCA/ICgqdGhpcykgOiBvdGhlcjsgCisgICAgfQorICAgIHN0YXRpYyBkb3VibGUgdGlja190aW1lKCk7IC8vIHJldHVybnMgc2Vjb25kcyBwZXIgY3ljbGUgKHBlcmlvZCkgb2YgY2xvY2sKKyAgICBzdGF0aWMgdHNjX3RpY2tfY291bnQgbm93KCkgeyByZXR1cm4gdHNjX3RpY2tfY291bnQoKTsgfSAvLyByZXR1cm5zIHRoZSByZHRzYyByZWdpc3RlciB2YWx1ZQorICAgIGZyaWVuZCB0c2NfdGlja19jb3VudDo6dHNjX2ludGVydmFsX3Qgb3BlcmF0b3ItKGNvbnN0IHRzY190aWNrX2NvdW50IHQxLCBjb25zdCB0c2NfdGlja19jb3VudCB0MCk7Cit9OworCitpbmxpbmUgdHNjX3RpY2tfY291bnQ6OnRzY19pbnRlcnZhbF90IG9wZXJhdG9yLShjb25zdCB0c2NfdGlja19jb3VudCB0MSwgY29uc3QgdHNjX3RpY2tfY291bnQgdDApIAoreworICAgIHJldHVybiB0c2NfdGlja19jb3VudDo6dHNjX2ludGVydmFsX3QoIHQxLm15X2NvdW50LXQwLm15X2NvdW50ICk7Cit9CisKK2lubGluZSBkb3VibGUgdHNjX3RpY2tfY291bnQ6OnRzY19pbnRlcnZhbF90OjpzZWNvbmRzKCkgY29uc3QgCit7CisgICAgcmV0dXJuIHZhbHVlKnRpY2tfdGltZSgpOworfQorCitleHRlcm4gc3RkOjpzdHJpbmcgZm9ybWF0U0koZG91YmxlIGludGVydmFsLCBpbnQgd2lkdGgsIGNoYXIgdW5pdCk7CisKK2lubGluZSBzdGQ6OnN0cmluZyBmb3JtYXRTZWNvbmRzKGRvdWJsZSBpbnRlcnZhbCwgaW50IHdpZHRoKQoreworICAgIHJldHVybiBmb3JtYXRTSShpbnRlcnZhbCwgd2lkdGgsICdTJyk7Cit9CisKK2lubGluZSBzdGQ6OnN0cmluZyBmb3JtYXRUaWNrcyhkb3VibGUgaW50ZXJ2YWwsIGludCB3aWR0aCkKK3sKKyAgICByZXR1cm4gZm9ybWF0U0koaW50ZXJ2YWwsIHdpZHRoLCAnVCcpOworfQorCitjbGFzcyB0aW1lUGFpcgoreworICAgIHRzY190aWNrX2NvdW50IEtNUF9BTElHTl9DQUNIRSBzdGFydDsKKyAgICB0c2NfdGlja19jb3VudCBlbmQ7CisKK3B1YmxpYzoKKyAgICB0aW1lUGFpcigpIDogc3RhcnQoLXN0ZDo6bnVtZXJpY19saW1pdHM8aW50NjRfdD46Om1heCgpKSwgZW5kKC1zdGQ6Om51bWVyaWNfbGltaXRzPGludDY0X3Q+OjptYXgoKSkge30KKyAgICB0c2NfdGlja19jb3VudCBnZXRfc3RhcnQoKSBjb25zdCB7IHJldHVybiBzdGFydDsgfQorICAgIHRzY190aWNrX2NvdW50IGdldF9lbmQoKSAgIGNvbnN0IHsgcmV0dXJuIGVuZDsgfQorICAgIHRzY190aWNrX2NvdW50ICogZ2V0X3N0YXJ0cCgpICAgIHsgcmV0dXJuICZzdGFydDsgfQorICAgIHRzY190aWNrX2NvdW50ICogZ2V0X2VuZHAoKSAgICAgIHsgcmV0dXJuICZlbmQ7IH0KKworICAgIHZvaWQgbWFya1N0YXJ0KCkgeyBzdGFydCA9IHRzY190aWNrX2NvdW50Ojpub3coKTsgfQorICAgIHZvaWQgbWFya0VuZCgpICAgeyBlbmQgICA9IHRzY190aWNrX2NvdW50Ojpub3coKTsgfQorICAgIHZvaWQgc2V0X3N0YXJ0KHRzY190aWNrX2NvdW50IHMpIHsgc3RhcnQgPSBzOyB9CisgICAgdm9pZCBzZXRfZW5kICAodHNjX3RpY2tfY291bnQgZSkgeyBlbmQgPSBlOyB9CisKKyAgICB0c2NfdGlja19jb3VudDo6dHNjX2ludGVydmFsX3QgZHVyYXRpb24oKSBjb25zdCB7IHJldHVybiBlbmQtc3RhcnQ7IH0KKyAgICBzdGQ6OnN0cmluZyBmb3JtYXQoKSBjb25zdDsKKworfTsKKworZXh0ZXJuIHRzY190aWNrX2NvdW50Ojp0c2NfaW50ZXJ2YWxfdCBjb21wdXRlTGFzdEluTGFzdE91dEludGVydmFsKHRpbWVQYWlyICogdGltZXMsIGludCBuVGltZXMpOworI2VuZGlmIC8vIEtNUF9TVEFUU19USU1JTkdfSApkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX3N0ci5jIGIvZmluYWwvcnVudGltZS9zcmMva21wX3N0ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5ZThkMjYKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfc3RyLmMKQEAgLTAsMCArMSw4ODcgQEAKKy8qCisgKiBrbXBfc3RyLmMgLS0gU3RyaW5nIG1hbmlwdWxhdGlvbiByb3V0aW5lcy4KKyAqICRSZXZpc2lvbjogNDMwODQgJAorICogJERhdGU6IDIwMTQtMDQtMTUgMDk6MTU6MTQgLTA1MDAgKFR1ZSwgMTUgQXByIDIwMTQpICQKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgImttcF9zdHIuaCIKKworI2luY2x1ZGUgPHN0ZGFyZy5oPiAgICAvLyB2YV8qCisjaW5jbHVkZSA8c3RkaW8uaD4gICAgIC8vIHZzbnByaW50ZigpCisjaW5jbHVkZSA8c3RkbGliLmg+ICAgIC8vIG1hbGxvYygpLCByZWFsbG9jKCkKKworI2luY2x1ZGUgImttcC5oIgorI2luY2x1ZGUgImttcF9pMThuLmgiCisKKy8qCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU3RyaW5nIGJ1ZmZlci4KKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFVzYWdlOgorCisgICAgICAgIC8vIERlY2xhcmUgYnVmZmVyIGFuZCBpbml0aWFsaXplIGl0LgorICAgICAgICBrbXBfc3RyX2J1Zl90ICBidWZmZXI7CisJX19rbXBfc3RyX2J1Zl9pbml0KCAmIGJ1ZmZlciApOworCisgICAgICAgIC8vIFByaW50IHRvIGJ1ZmZlci4KKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBidWZmZXIsICJFcnJvciBpbiBmaWxlIFwiJXNcIiBsaW5lICVkXG4iLCAiZm9vLmMiLCAxMiApOworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmIGJ1ZmZlciwgIiAgICA8JXM+XG4iLCBsaW5lICk7CisKKyAgICAgICAgLy8gVXNlIGJ1ZmZlciBjb250ZW50cy4gYnVmZmVyLnN0ciBpcyBhIHBvaW50ZXIgdG8gZGF0YSwgYnVmZmVyLnVzZWQgaXMgYSBudW1iZXIgb2YgcHJpbnRlZAorICAgICAgICAvLyBjaGFyYWN0ZXJzIChub3QgaW5jbHVkaW5nIHRlcm1pbmF0aW5nIHplcm8pLgorICAgICAgICB3cml0ZSggZmQsIGJ1ZmZlci5zdHIsIGJ1ZmZlci51c2VkICk7CisKKyAgICAgICAgLy8gRnJlZSBidWZmZXIuCisgICAgICAgIF9fa21wX3N0cl9idWZfZnJlZSggJiBidWZmZXIgKTsKKworICAgICAgICAvLyBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIGRldGFjaCBhbGxvY2F0ZWQgbWVtb3J5IGZyb20gYnVmZmVyOgorICAgICAgICBfX2ttcF9zdHJfYnVmX2RldGFjaCggJiBidWZmZXIgKTsKKyAgICAgICAgcmV0dXJuIGJ1ZmZlci5zdHI7ICAgIC8vIFRoYXQgbWVtb3J5IHNob3VsZCBiZSBmcmVlZCBldmVudHVhbGx5LgorCisKKyAgICBOb3RlczoKKworICAgICAgICAqIEJ1ZmZlciB1c2VycyBtYXkgdXNlIGJ1ZmZlci5zdHIgYW5kIGJ1ZmZlci51c2VkLiBVc2VycyBzaG91bGQgbm90IGNoYW5nZSBhbnkgZmllbGRzIG9mCisgICAgICAgICAgYnVmZmVyIGRpcmVjdGx5LgorCisgICAgICAgICogYnVmZmVyLnN0ciBpcyBuZXZlciBOVUxMLiBJZiBidWZmZXIgaXMgZW1wdHksIGJ1ZmZlci5zdHIgcG9pbnRzIHRvIGVtcHR5IHN0cmluZyAoIiIpLgorCisgICAgICAgICogRm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIGJ1ZmZlciB1c2VzIHN0YWNrIG1lbW9yeSAoYnVmZmVyLmJ1bGspIGZpcnN0LiBJZiBzdGFjayBtZW1vcnkgaXMKKyAgICAgICAgICBleGhhdXN0ZWQsIGJ1ZmZlciBhbGxvY2F0ZXMgbWVtb3J5IG9uIGhlYXAgYnkgbWFsbG9jKCksIGFuZCByZWFsbG9jYXRlcyBpdCBieSByZWFsbG9jKCkKKyAgICAgICAgICBhcyBhbW91bnQgb2YgdXNlZCBtZW1vcnkgZ3Jvd3MuCisKKyAgICAgICAgKiBCdWZmZXIgZG91YmxlcyBhbW91bnQgb2YgYWxsb2NhdGVkIG1lbW9yeSBlYWNoIHRpbWUgaXQgaXMgZXhoYXVzdGVkLgorCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisvLyBUT0RPOiBfX2ttcF9zdHJfYnVmX3ByaW50KCkgY2FuIHVzZSB0aHJlYWQgbG9jYWwgbWVtb3J5IGFsbG9jYXRvci4KKworI2RlZmluZSBLTVBfU1RSX0JVRl9JTlZBUklBTlQoIGIgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggKGIpLT5zdHIgIT0gTlVMTCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCAoYiktPnNpemUgPj0gc2l6ZW9mKCAoYiktPmJ1bGsgKSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIChiKS0+c2l6ZSAlIHNpemVvZiggKGIpLT5idWxrICkgPT0gMCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggKHVuc2lnbmVkKShiKS0+dXNlZCA8IChiKS0+c2l6ZSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCAoYiktPnNpemUgPT0gc2l6ZW9mKCAoYiktPmJ1bGsgKSA/IChiKS0+c3RyID09ICYgKGIpLT5idWxrWyAwIF0gOiAxICk7ICBcCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIChiKS0+c2l6ZSA+IHNpemVvZiggKGIpLT5idWxrICkgPyAoYiktPnN0ciAhPSAmIChiKS0+YnVsa1sgMCBdIDogMSApOyAgIFwKKyAgICB9CisKK3ZvaWQKKyBfX2ttcF9zdHJfYnVmX2NsZWFyKAorICAgICBrbXBfc3RyX2J1Zl90ICogYnVmZmVyCispIHsKKyAgICBLTVBfU1RSX0JVRl9JTlZBUklBTlQoIGJ1ZmZlciApOworICAgIGlmICggYnVmZmVyLT51c2VkID4gMCApIHsKKyAgICAgICAgYnVmZmVyLT51c2VkID0gMDsKKyAgICAgICAgYnVmZmVyLT5zdHJbIDAgXSA9IDA7CisgICAgfTsgLy8gaWYKKyAgICBLTVBfU1RSX0JVRl9JTlZBUklBTlQoIGJ1ZmZlciApOworfSAvLyBfX2ttcF9zdHJfYnVmX2NsZWFyCisKKwordm9pZAorX19rbXBfc3RyX2J1Zl9yZXNlcnZlKAorICAgIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsCisgICAgaW50ICAgICAgICAgICAgIHNpemUKKykgeworCisgICAgS01QX1NUUl9CVUZfSU5WQVJJQU5UKCBidWZmZXIgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBzaXplID49IDAgKTsKKworICAgIGlmICggYnVmZmVyLT5zaXplIDwgKHVuc2lnbmVkIGludClzaXplICkgeworCisgICAgICAgIC8vIENhbGN1bGF0ZSBidWZmZXIgc2l6ZS4KKyAgICAgICAgZG8geworICAgICAgICAgICAgYnVmZmVyLT5zaXplICo9IDI7CisgICAgICAgIH0gd2hpbGUgKCBidWZmZXItPnNpemUgPCAodW5zaWduZWQgaW50KXNpemUgKTsKKworICAgICAgICAvLyBFbmxhcmdlIGJ1ZmZlci4KKyAgICAgICAgaWYgKCBidWZmZXItPnN0ciA9PSAmIGJ1ZmZlci0+YnVsa1sgMCBdICkgeworICAgICAgICAgICAgYnVmZmVyLT5zdHIgPSAoY2hhciAqKSBLTVBfSU5URVJOQUxfTUFMTE9DKCBidWZmZXItPnNpemUgKTsKKyAgICAgICAgICAgIGlmICggYnVmZmVyLT5zdHIgPT0gTlVMTCApIHsKKwkJS01QX0ZBVEFMKCBNZW1vcnlBbGxvY0ZhaWxlZCApOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgIG1lbWNweSggYnVmZmVyLT5zdHIsIGJ1ZmZlci0+YnVsaywgYnVmZmVyLT51c2VkICsgMSApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYnVmZmVyLT5zdHIgPSAoY2hhciAqKSBLTVBfSU5URVJOQUxfUkVBTExPQyggYnVmZmVyLT5zdHIsIGJ1ZmZlci0+c2l6ZSApOworICAgICAgICAgICAgaWYgKCBidWZmZXItPnN0ciA9PSBOVUxMICkgeworCQlLTVBfRkFUQUwoIE1lbW9yeUFsbG9jRmFpbGVkICk7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICB9OyAvLyBpZgorCisgICAgfTsgLy8gaWYKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIGJ1ZmZlci0+c2l6ZSA+IDAgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBidWZmZXItPnNpemUgPj0gKHVuc2lnbmVkKXNpemUgKTsKKyAgICBLTVBfU1RSX0JVRl9JTlZBUklBTlQoIGJ1ZmZlciApOworCit9IC8vIF9fa21wX3N0cl9idWZfcmVzZXJ2ZQorCisKK3ZvaWQKK19fa21wX3N0cl9idWZfZGV0YWNoKAorICAgIGttcF9zdHJfYnVmX3QgKiAgYnVmZmVyCispIHsKKworICAgIEtNUF9TVFJfQlVGX0lOVkFSSUFOVCggYnVmZmVyICk7CisKKyAgICAvLyBJZiBpbnRlcm5hbCBidWxrIGlzIHVzZWQsIGFsbG9jYXRlIG1lbW9yeSBhbmQgY29weSBpdC4KKyAgICBpZiAoIGJ1ZmZlci0+c2l6ZSA8PSBzaXplb2YoIGJ1ZmZlci0+YnVsayApICkgeworICAgICAgICBidWZmZXItPnN0ciA9IChjaGFyICopIEtNUF9JTlRFUk5BTF9NQUxMT0MoIGJ1ZmZlci0+c2l6ZSApOworICAgICAgICBpZiAoIGJ1ZmZlci0+c3RyID09IE5VTEwgKSB7CisJCUtNUF9GQVRBTCggTWVtb3J5QWxsb2NGYWlsZWQgKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgbWVtY3B5KCBidWZmZXItPnN0ciwgYnVmZmVyLT5idWxrLCBidWZmZXItPnVzZWQgKyAxICk7CisgICAgfTsgLy8gaWYKKworfSAvLyBfX2ttcF9zdHJfYnVmX2RldGFjaAorCisKK3ZvaWQKK19fa21wX3N0cl9idWZfZnJlZSgKKyAgICBrbXBfc3RyX2J1Zl90ICogYnVmZmVyCispIHsKKyAgICBLTVBfU1RSX0JVRl9JTlZBUklBTlQoIGJ1ZmZlciApOworICAgIGlmICggYnVmZmVyLT5zaXplID4gc2l6ZW9mKCBidWZmZXItPmJ1bGsgKSApIHsKKyAgICAgICAgS01QX0lOVEVSTkFMX0ZSRUUoIGJ1ZmZlci0+c3RyICk7CisgICAgfTsgLy8gaWYKKyAgICBidWZmZXItPnN0ciAgPSBidWZmZXItPmJ1bGs7CisgICAgYnVmZmVyLT5zaXplID0gc2l6ZW9mKCBidWZmZXItPmJ1bGsgKTsKKyAgICBidWZmZXItPnVzZWQgPSAwOworICAgIEtNUF9TVFJfQlVGX0lOVkFSSUFOVCggYnVmZmVyICk7Cit9IC8vIF9fa21wX3N0cl9idWZfZnJlZQorCisKK3ZvaWQKK19fa21wX3N0cl9idWZfY2F0KAorICAgIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsCisgICAgY2hhciBjb25zdCAqICAgIHN0ciwKKyAgICBpbnQgICAgICAgICAgICAgbGVuCispIHsKKyAgICBLTVBfU1RSX0JVRl9JTlZBUklBTlQoIGJ1ZmZlciApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHN0ciAhPSBOVUxMICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggbGVuID49IDAgKTsKKyAgICBfX2ttcF9zdHJfYnVmX3Jlc2VydmUoIGJ1ZmZlciwgYnVmZmVyLT51c2VkICsgbGVuICsgMSApOworICAgIG1lbWNweSggYnVmZmVyLT5zdHIgKyBidWZmZXItPnVzZWQsIHN0ciwgbGVuICk7CisgICAgYnVmZmVyLT5zdHJbIGJ1ZmZlci0+dXNlZCArIGxlbiBdID0gMDsKKyAgICBidWZmZXItPnVzZWQgKz0gbGVuOworICAgIEtNUF9TVFJfQlVGX0lOVkFSSUFOVCggYnVmZmVyICk7Cit9IC8vIF9fa21wX3N0cl9idWZfY2F0CisKKwordm9pZAorX19rbXBfc3RyX2J1Zl92cHJpbnQoCisgICAga21wX3N0cl9idWZfdCAqICBidWZmZXIsCisgICAgY2hhciBjb25zdCAqICAgICBmb3JtYXQsCisgICAgdmFfbGlzdCAgICAgICAgICBhcmdzCispIHsKKworICAgIEtNUF9TVFJfQlVGX0lOVkFSSUFOVCggYnVmZmVyICk7CisKKyAgICBmb3IgKCA7IDsgKSB7CisKKyAgICAgICAgaW50IGNvbnN0IGZyZWUgPSBidWZmZXItPnNpemUgLSBidWZmZXItPnVzZWQ7CisgICAgICAgIGludCAgICAgICByYzsKKyAgICAgICAgaW50ICAgICAgIHNpemU7CisKKyAgICAgICAgLy8gVHJ5IHRvIGZvcm1hdCBzdHJpbmcuCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgT24gTGludXgqIE9TIEludGVsKFIpIDY0LCB2c25wcmludGYoKSBtb2RpZmllcyBhcmdzIGFyZ3VtZW50LCBzbyB2c25wcmludGYoKSBjcmFzaGVzIGlmIGl0CisgICAgICAgICAgICAgICAgaXMgY2FsbGVkIGZvciB0aGUgc2Vjb25kIHRpbWUgd2l0aCB0aGUgc2FtZSBhcmdzLiBUbyBwcmV2ZW50IHRoZSBjcmFzaCwgd2UgaGF2ZSB0bworICAgICAgICAgICAgICAgIHBhc3MgYSBmcmVzaCBpbnRhY3QgY29weSBvZiBhcmdzIHRvIHZzbnByaW50ZigpIG9uIGVhY2ggaXRlcmF0aW9uLgorCisgICAgICAgICAgICAgICAgVW5mb3J0dW5hdGVseSwgc3RhbmRhcmQgdmFfY29weSgpIG1hY3JvIGlzIG5vdCBhdmFpbGFibGUgb24gV2luZG93cyogT1MuIEhvd2V2ZXIsIGl0CisgICAgICAgICAgICAgICAgc2VlbXMgdnNucHJpbnRmKCkgZG9lcyBub3QgbW9kaWZ5IGFyZ3MgYXJndW1lbnQgb24gV2luZG93cyogT1MuCisgICAgICAgICAgICAqLworCisgICAgICAgICAgICAjaWYgISBLTVBfT1NfV0lORE9XUworICAgICAgICAgICAgICAgIHZhX2xpc3QgX2FyZ3M7CisgICAgICAgICAgICAgICAgX192YV9jb3B5KCBfYXJncywgYXJncyApOyAgLy8gTWFrZSBjb3B5IG9mIGFyZ3MuCisgICAgICAgICAgICAgICAgI2RlZmluZSBhcmdzIF9hcmdzICAgICAgICAgLy8gU3Vic3RpdHV0ZSBhcmdzIHdpdGggaXRzIGNvcHksIF9hcmdzLgorICAgICAgICAgICAgI2VuZGlmIC8vIEtNUF9PU19XSU5ET1dTCisgICAgICAgICAgICByYyA9IHZzbnByaW50ZiggYnVmZmVyLT5zdHIgKyBidWZmZXItPnVzZWQsIGZyZWUsIGZvcm1hdCwgYXJncyApOworICAgICAgICAgICAgI2lmICEgS01QX09TX1dJTkRPV1MKKyAgICAgICAgICAgICAgICAjdW5kZWYgYXJncyAgICAgICAgICAgICAgICAvLyBSZW1vdmUgc3Vic3RpdHV0aW9uLgorICAgICAgICAgICAgICAgIHZhX2VuZCggX2FyZ3MgKTsKKyAgICAgICAgICAgICNlbmRpZiAvLyBLTVBfT1NfV0lORE9XUworICAgICAgICB9CisKKyAgICAgICAgLy8gTm8gZXJyb3JzLCBzdHJpbmcgaGFzIGJlZW4gZm9ybWF0dGVkLgorICAgICAgICBpZiAoIHJjID49IDAgJiYgcmMgPCBmcmVlICkgeworICAgICAgICAgICAgYnVmZmVyLT51c2VkICs9IHJjOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH07IC8vIGlmCisKKyAgICAgICAgLy8gRXJyb3Igb2NjdXJyZWQsIGJ1ZmZlciBpcyB0b28gc21hbGwuCisgICAgICAgIGlmICggcmMgPj0gMCApIHsKKyAgICAgICAgICAgIC8vIEM5OS1jb25mb3JtaW5nIGltcGxlbWVudGF0aW9uIG9mIHZzbnByaW50ZiByZXR1cm5zIHJlcXVpcmVkIGJ1ZmZlciBzaXplLgorICAgICAgICAgICAgc2l6ZSA9IGJ1ZmZlci0+dXNlZCArIHJjICsgMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIE9sZGVyIGltcGxlbWVudGF0aW9ucyBqdXN0IHJldHVybiAtMS4gRG91YmxlIGJ1ZmZlciBzaXplLgorICAgICAgICAgICAgc2l6ZSA9IGJ1ZmZlci0+c2l6ZSAqIDI7CisgICAgICAgIH07IC8vIGlmCisKKyAgICAgICAgLy8gRW5sYXJnZSBidWZmZXIuCisgICAgICAgIF9fa21wX3N0cl9idWZfcmVzZXJ2ZSggYnVmZmVyLCBzaXplICk7CisKKyAgICAgICAgLy8gQW5kIHRyeSBhZ2Fpbi4KKworICAgIH07IC8vIGZvcmV2ZXIKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIGJ1ZmZlci0+c2l6ZSA+IDAgKTsKKyAgICBLTVBfU1RSX0JVRl9JTlZBUklBTlQoIGJ1ZmZlciApOworCit9IC8vIF9fa21wX3N0cl9idWZfdnByaW50CisKKwordm9pZAorX19rbXBfc3RyX2J1Zl9wcmludCgKKyAgICBrbXBfc3RyX2J1Zl90ICogIGJ1ZmZlciwKKyAgICBjaGFyIGNvbnN0ICogICAgIGZvcm1hdCwKKyAgICAuLi4KKykgeworCisgICAgdmFfbGlzdCBhcmdzOworICAgIHZhX3N0YXJ0KCBhcmdzLCBmb3JtYXQgKTsKKyAgICBfX2ttcF9zdHJfYnVmX3ZwcmludCggYnVmZmVyLCBmb3JtYXQsIGFyZ3MgKTsKKyAgICB2YV9lbmQoIGFyZ3MgKTsKKworfSAvLyBfX2ttcF9zdHJfYnVmX3ByaW50CisKKworLyoKKyAgICBUaGUgZnVuY3Rpb24gcHJpbnRzIHNwZWNpZmllZCBzaXplIHRvIGJ1ZmZlci4gU2l6ZSBpcyBleHByZXNzZWQgdXNpbmcgYmlnZ2VzdCBwb3NzaWJsZSB1bml0LCBmb3IKKyAgICBleGFtcGxlIDEwMjQgaXMgcHJpbnRlZCBhcyAiMWsiLgorKi8KKwordm9pZAorX19rbXBfc3RyX2J1Zl9wcmludF9zaXplKAorICAgIGttcF9zdHJfYnVmX3QgKiBidWYsCisgICAgc2l6ZV90ICAgICAgICAgIHNpemUKKykgeworCisgICAgY2hhciBjb25zdCAqIG5hbWVzW10gPSB7ICIiLCAiayIsICJNIiwgIkciLCAiVCIsICJQIiwgIkUiLCAiWiIsICJZIiB9OworICAgIGludCBjb25zdCAgICB1bml0cyAgID0gc2l6ZW9mKCBuYW1lcyApIC8gc2l6ZW9mKCBjaGFyIGNvbnN0ICogKTsKKyAgICBpbnQgICAgICAgICAgdSAgICAgICA9IDA7CisgICAgaW50ICAgICAgICAgIHJjOworICAgIGlmICggc2l6ZSA+IDAgKSB7CisgICAgICAgIHdoaWxlICggKCBzaXplICUgMTAyNCA9PSAwICkgJiYgKCB1ICsgMSA8IHVuaXRzICkgKSB7CisgICAgICAgICAgICBzaXplID0gc2l6ZSAvIDEwMjQ7CisgICAgICAgICAgICArKyB1OworICAgICAgICB9OyAvLyB3aGlsZQorICAgIH07IC8vIGlmCisKKyAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWYsICIlIiBLTVBfU0laRV9UX1NQRUMgIiVzIiwgc2l6ZSwgbmFtZXNbIHUgXSApOworCit9IC8vIF9fa21wX3N0cl9idWZfcHJpbnRfc2l6ZQorCisKK3ZvaWQKK19fa21wX3N0cl9mbmFtZV9pbml0KAorICAgIGttcF9zdHJfZm5hbWVfdCAqIGZuYW1lLAorICAgIGNoYXIgY29uc3QgKiAgICAgIHBhdGgKKykgeworCisgICAgZm5hbWUtPnBhdGggPSBOVUxMOworICAgIGZuYW1lLT5kaXIgID0gTlVMTDsKKyAgICBmbmFtZS0+YmFzZSA9IE5VTEw7CisKKyAgICBpZiAoIHBhdGggIT0gTlVMTCApIHsKKyAgICAgICAgY2hhciAqIHNsYXNoID0gTlVMTDsgICAgLy8gUG9pbnRlciB0byB0aGUgbGFzdCBjaGFyYWN0ZXIgb2YgZGlyLgorICAgICAgICBjaGFyICogYmFzZSAgPSBOVUxMOyAgICAvLyBQb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgYmFzZW5hbWUuCisgICAgICAgIGZuYW1lLT5wYXRoID0gX19rbXBfc3RyX2Zvcm1hdCggIiVzIiwgcGF0aCApOworICAgICAgICAgICAgLy8gT3JpZ2luYWwgY29kZSB1c2VkIHN0cmR1cCgpIGZ1bmN0aW9uIHRvIGNvcHkgYSBzdHJpbmcsIGJ1dCBvbiBXaW5kb3dzKiBPUyBJbnRlbChSKSA2NCBpdAorICAgICAgICAgICAgLy8gY2F1c2VzIGFzc2VydGlvb24gaWQgZGVidWcgaGVhcCwgc28gSSBoYWQgdG8gcmVwbGFjZSBzdHJkdXAgd2l0aCBfX2ttcF9zdHJfZm9ybWF0KCkuCisgICAgICAgIGlmICggS01QX09TX1dJTkRPV1MgKSB7CisgICAgICAgICAgICBfX2ttcF9zdHJfcmVwbGFjZSggZm5hbWUtPnBhdGgsICdcXCcsICcvJyApOworICAgICAgICB9OyAvLyBpZgorICAgICAgICBmbmFtZS0+ZGlyID0gX19rbXBfc3RyX2Zvcm1hdCggIiVzIiwgZm5hbWUtPnBhdGggKTsKKyAgICAgICAgc2xhc2ggPSBzdHJyY2hyKCBmbmFtZS0+ZGlyLCAnLycgKTsKKyAgICAgICAgaWYgKCBLTVBfT1NfV0lORE9XUyAmJiBzbGFzaCA9PSBOVUxMICkgeyAgICAgICAgICAgLy8gT24gV2luZG93cyogT1MsIGlmIHNsYXNoIG5vdCBmb3VuZCwKKyAgICAgICAgICAgIGNoYXIgZmlyc3QgPSBUT0xPV0VSKCBmbmFtZS0+ZGlyWyAwIF0gKTsgICAgIC8vIGxvb2sgZm9yIGRyaXZlLgorICAgICAgICAgICAgaWYgKCAnYScgPD0gZmlyc3QgJiYgZmlyc3QgPD0gJ3onICYmIGZuYW1lLT5kaXJbIDEgXSA9PSAnOicgKSB7CisgICAgICAgICAgICAgICAgc2xhc2ggPSAmIGZuYW1lLT5kaXJbIDEgXTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgIH07IC8vIGlmCisgICAgICAgIGJhc2UgPSAoIHNsYXNoID09IE5VTEwgPyBmbmFtZS0+ZGlyIDogc2xhc2ggKyAxICk7CisgICAgICAgIGZuYW1lLT5iYXNlID0gX19rbXBfc3RyX2Zvcm1hdCggIiVzIiwgYmFzZSApOyAgICAvLyBDb3B5IGJhc2VuYW1lCisgICAgICAgICogYmFzZSA9IDA7ICAgICAgICAgICAgICAgICAgICAvLyBhbmQgdHJ1bmNhdGUgZGlyLgorICAgIH07IC8vIGlmCisKK30gLy8ga21wX3N0cl9mbmFtZV9pbml0CisKKwordm9pZAorX19rbXBfc3RyX2ZuYW1lX2ZyZWUoCisgICAga21wX3N0cl9mbmFtZV90ICogZm5hbWUKKykgeworICAgIF9fa21wX3N0cl9mcmVlKCAoY2hhciBjb25zdCAqKikoICYgZm5hbWUtPnBhdGggKSApOworICAgIF9fa21wX3N0cl9mcmVlKCAoY2hhciBjb25zdCAqKikoICYgZm5hbWUtPmRpciAgKSApOworICAgIF9fa21wX3N0cl9mcmVlKCAoY2hhciBjb25zdCAqKikoICYgZm5hbWUtPmJhc2UgKSApOworfSAvLyBrbXBfc3RyX2ZuYW1lX2ZyZWUKKworCitpbnQKK19fa21wX3N0cl9mbmFtZV9tYXRjaCgKKyAgICBrbXBfc3RyX2ZuYW1lX3QgY29uc3QgKiBmbmFtZSwKKyAgICBjaGFyIGNvbnN0ICogICAgICAgICAgICBwYXR0ZXJuCispIHsKKworICAgIGludCBkaXJfbWF0Y2ggID0gMTsKKyAgICBpbnQgYmFzZV9tYXRjaCA9IDE7CisKKyAgICBpZiAoIHBhdHRlcm4gIT0gTlVMTCApIHsKKyAgICAgICAga21wX3N0cl9mbmFtZV90IHB0cm47CisgICAgICAgIF9fa21wX3N0cl9mbmFtZV9pbml0KCAmIHB0cm4sIHBhdHRlcm4gKTsKKyAgICAgICAgZGlyX21hdGNoID0KKyAgICAgICAgICAgIHN0cmNtcCggcHRybi5kaXIsICIqLyIgKSA9PSAwCisgICAgICAgICAgICB8fAorICAgICAgICAgICAgKCBmbmFtZS0+ZGlyICE9IE5VTEwgJiYgX19rbXBfc3RyX2VxZiggZm5hbWUtPmRpciwgcHRybi5kaXIgKSApOworICAgICAgICBiYXNlX21hdGNoID0KKyAgICAgICAgICAgIHN0cmNtcCggcHRybi5iYXNlLCAiKiIgKSA9PSAwCisgICAgICAgICAgICB8fAorICAgICAgICAgICAgKCBmbmFtZS0+YmFzZSAhPSBOVUxMICYmIF9fa21wX3N0cl9lcWYoIGZuYW1lLT5iYXNlLCBwdHJuLmJhc2UgKSApOworICAgICAgICBfX2ttcF9zdHJfZm5hbWVfZnJlZSggJiBwdHJuICk7CisgICAgfTsgLy8gaWYKKworICAgIHJldHVybiBkaXJfbWF0Y2ggJiYgYmFzZV9tYXRjaDsKKworfSAvLyBfX2ttcF9zdHJfZm5hbWVfbWF0Y2gKKworCitrbXBfc3RyX2xvY190CitfX2ttcF9zdHJfbG9jX2luaXQoCisgICAgY2hhciBjb25zdCAqIHBzb3VyY2UsCisgICAgaW50ICAgICAgICAgIGluaXRfZm5hbWUKKykgeworCisgICAga21wX3N0cl9sb2NfdCBsb2M7CisKKyAgICBsb2MuX2J1bGsgPSBOVUxMOworICAgIGxvYy5maWxlICA9IE5VTEw7CisgICAgbG9jLmZ1bmMgID0gTlVMTDsKKyAgICBsb2MubGluZSAgPSAwOworICAgIGxvYy5jb2wgICA9IDA7CisKKyAgICBpZiAoIHBzb3VyY2UgIT0gTlVMTCApIHsKKworICAgICAgICBjaGFyICogc3RyICAgPSBOVUxMOworICAgICAgICBjaGFyICogZHVtbXkgPSBOVUxMOworICAgICAgICBjaGFyICogbGluZSAgPSBOVUxMOworICAgICAgICBjaGFyICogY29sICAgPSBOVUxMOworCisgICAgICAgIC8vIENvcHkgcHNvdXJjZSB0byBrZWVwIGl0IGludGFjdC4KKyAgICAgICAgbG9jLl9idWxrID0gX19rbXBfc3RyX2Zvcm1hdCggIiVzIiwgcHNvdXJjZSApOworCisgICAgICAgIC8vIFBhcnNlIHBzb3VyY2Ugc3RyaW5nOiAiO2ZpbGU7ZnVuYztsaW5lO2NvbDs7IgorICAgICAgICBzdHIgPSBsb2MuX2J1bGs7CisgICAgICAgIF9fa21wX3N0cl9zcGxpdCggc3RyLCAnOycsICYgZHVtbXksICAgICYgc3RyICk7CisgICAgICAgIF9fa21wX3N0cl9zcGxpdCggc3RyLCAnOycsICYgbG9jLmZpbGUsICYgc3RyICk7CisgICAgICAgIF9fa21wX3N0cl9zcGxpdCggc3RyLCAnOycsICYgbG9jLmZ1bmMsICYgc3RyICk7CisgICAgICAgIF9fa21wX3N0cl9zcGxpdCggc3RyLCAnOycsICYgbGluZSwgICAgICYgc3RyICk7CisgICAgICAgIF9fa21wX3N0cl9zcGxpdCggc3RyLCAnOycsICYgY29sLCAgICAgICYgc3RyICk7CisKKyAgICAgICAgLy8gQ29udmVydCBsaW5lIGFuZCBjb2wgaW50byBudW1iZXJpYyB2YWx1ZXMuCisgICAgICAgIGlmICggbGluZSAhPSBOVUxMICkgeworICAgICAgICAgICAgbG9jLmxpbmUgPSBhdG9pKCBsaW5lICk7CisgICAgICAgICAgICBpZiAoIGxvYy5saW5lIDwgMCApIHsKKyAgICAgICAgICAgICAgICBsb2MubGluZSA9IDA7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICB9OyAvLyBpZgorICAgICAgICBpZiAoIGNvbCAhPSBOVUxMICkgeworICAgICAgICAgICAgbG9jLmNvbCA9IGF0b2koIGNvbCApOworICAgICAgICAgICAgaWYgKCBsb2MuY29sIDwgMCApIHsKKyAgICAgICAgICAgICAgICBsb2MuY29sID0gMDsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgIH07IC8vIGlmCisKKyAgICB9OyAvLyBpZgorCisgICAgX19rbXBfc3RyX2ZuYW1lX2luaXQoICYgbG9jLmZuYW1lLCBpbml0X2ZuYW1lID8gbG9jLmZpbGUgOiBOVUxMICk7CisKKyAgICByZXR1cm4gbG9jOworCit9IC8vIGttcF9zdHJfbG9jX2luaXQKKworCit2b2lkCitfX2ttcF9zdHJfbG9jX2ZyZWUoCisgICAga21wX3N0cl9sb2NfdCAqIGxvYworKSB7CisgICAgX19rbXBfc3RyX2ZuYW1lX2ZyZWUoICYgbG9jLT5mbmFtZSApOworICAgIEtNUF9JTlRFUk5BTF9GUkVFKCBsb2MtPl9idWxrICk7CisgICAgbG9jLT5fYnVsayA9IE5VTEw7CisgICAgbG9jLT5maWxlICA9IE5VTEw7CisgICAgbG9jLT5mdW5jICA9IE5VTEw7Cit9IC8vIGttcF9zdHJfbG9jX2ZyZWUKKworCisKKy8qCisgICAgVGhpcyBmdW5jdGlvbiBpcyBpbnRlbmRlZCB0byBjb21wYXJlIGZpbGUgbmFtZXMuIE9uIFdpbmRvd3MqIE9TIGZpbGUgbmFtZXMgYXJlIGNhc2UtaW5zZW5zaXRpdmUsCisgICAgc28gZnVuY3Rpb25zIHBlcmZvcm1zIGNhc2UtaW5zZW5zaXRpdmUgY29tcGFyaXNvbi4gT24gTGludXgqIE9TIGl0IHBlcmZvcm1zIGNhc2Utc2Vuc2l0aXZlCisgICAgY29tcGFyaXNvbi4KKyAgICBOb3RlOiBUaGUgZnVuY3Rpb24gcmV0dXJucyAqdHJ1ZSogaWYgc3RyaW5ncyBhcmUgKmVxdWFsKi4KKyovCisKK2ludAorX19rbXBfc3RyX2VxZiggICAgICAgICAvLyBUcnVlLCBpZiBzdHJpbmdzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgIGNoYXIgY29uc3QgKiBsaHMsICAvLyBGaXJzdCBzdHJpbmcuCisgICAgY2hhciBjb25zdCAqIHJocyAgIC8vIFNlY29uZCBzdHJpbmcuCispIHsKKyAgICBpbnQgcmVzdWx0OworICAgICNpZiBLTVBfT1NfV0lORE9XUworICAgICAgICByZXN1bHQgPSAoIF9zdHJpY21wKCBsaHMsIHJocyApID09IDAgKTsKKyAgICAjZWxzZQorICAgICAgICByZXN1bHQgPSAoIHN0cmNtcCggbGhzLCByaHMgKSA9PSAwICk7CisgICAgI2VuZGlmCisgICAgcmV0dXJuIHJlc3VsdDsKK30gLy8gX19rbXBfc3RyX2VxZgorCisKKy8qCisgICAgVGhpcyBmdW5jdGlvbiBpcyBsaWtlIHNwcmludGYsIGJ1dCBpdCAqYWxsb2NhdGVzKiBuZXcgYnVmZmVyLCB3aGljaCBtdXN0IGJlIGZyZWVkIGV2ZW50dWFsbHkgYnkKKyAgICBfX2ttcF9zdHJfZnJlZSgpLiBUaGUgZnVuY3Rpb24gaXMgdmVyeSBjb252ZW5pZW50IGZvciBjb25zdHJ1Y3Rpbmcgc3RyaW5ncywgaXQgc3VjY2Vzc2Z1bGx5CisgICAgcmVwbGFjZXMgc3RyZHVwKCksIHN0cmNhdCgpLCBpdCBmcmVlcyBwcm9ncmFtbWVyIGZyb20gYnVmZmVyIGFsbG9jYXRpb25zIGFuZCBoZWxwcyB0byBhdm9pZAorICAgIGJ1ZmZlciBvdmVyZmxvd3MuIEV4YW1wbGVzOgorCisgICAgICAgIHN0ciA9IF9fa21wX3N0cl9mb3JtYXQoICIlcyIsIG9yaWcgKTsgICAgICAgICAgICAgIC8vIHN0cmR1cCgpLCBkbyBub3QgY2FyZSBhYm91dCBidWZmZXIgc2l6ZS4KKyAgICAgICAgX19rbXBfc3RyX2ZyZWUoICYgc3RyICk7CisgICAgICAgIHN0ciA9IF9fa21wX3N0cl9mb3JtYXQoICIlcyVzIiwgb3JpZzEsIG9yaWcyICk7ICAgIC8vIHN0cmNhdCgpLCBkbyBub3QgY2FyZSBhYm91dCBidWZmZXIgc2l6ZS4KKyAgICAgICAgX19rbXBfc3RyX2ZyZWUoICYgc3RyICk7CisgICAgICAgIHN0ciA9IF9fa21wX3N0cl9mb3JtYXQoICIlcy8lcy50eHQiLCBwYXRoLCBmaWxlICk7IC8vIGNvbnN0cnVjdGluZyBzdHJpbmcuCisgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmIHN0ciApOworCisgICAgUGVyZm9ybWFuY2Ugbm90ZToKKyAgICAgICAgVGhpcyBmdW5jdGlvbiBhbGxvY2F0ZXMgbWVtb3J5IHdpdGggbWFsbG9jKCkgY2FsbHMsIHNvIGRvIG5vdCBjYWxsIGl0IGZyb20KKyAgICAgICAgcGVyZm9ybWFuY2UtY3JpdGljYWwgY29kZS4gSW4gcGVyZm9ybWFuY2UtY3JpdGljYWwgY29kZSBjb25zaWRlciB1c2luZyBrbXBfc3RyX2J1Zl90CisgICAgICAgIGluc3RlYWQsIHNpbmNlIGl0IHVzZXMgc3RhY2stYWxsb2NhdGVkIGJ1ZmZlciBmb3Igc2hvcnQgc3RyaW5ncy4KKworICAgIFdoeSBkb2VzIHRoaXMgZnVuY3Rpb24gdXNlIG1hbGxvYygpPworICAgICAgICAxLiBfX2ttcF9hbGxvY2F0ZSgpIHJldHVybnMgY2FjaGUtYWxpZ25lZCBtZW1vcnkgYWxsb2NhdGVkIHdpdGggbWFsbG9jKCkuIFRoZXJlIGFyZSBubworICAgICAgICAgICByZWFzb25zIGluIHVzaW5nIF9fa21wX2FsbG9jYXRlKCkgZm9yIHN0cmluZ3MgZHVlIHRvIGV4dHJhIG92ZXJoZWFkIHdoaWxlIGNhY2hlLWFsaWduZWQKKyAgICAgICAgICAgbWVtb3J5IGlzIG5vdCBuZWNlc3NhcnkuCisgICAgICAgIDIuIF9fa21wX3RocmVhZF9tYWxsb2MoKSBjYW5ub3QgYmUgdXNlZCBiZWNhdXNlIGl0IHJlcXVpcmVzIHBvaW50ZXIgdG8gdGhyZWFkIHN0cnVjdHVyZS4KKyAgICAgICAgICAgV2UgbmVlZCB0byBwZXJmb3JtIHN0cmluZyBvcGVyYXRpb25zIGR1cmluZyBsaWJyYXJ5IHN0YXJ0dXAgKGZvciBleGFtcGxlLCBpbgorICAgICAgICAgICBfX2ttcF9yZWdpc3Rlcl9saWJyYXJ5X3N0YXJ0dXAoKSkgd2hlbiBubyB0aHJlYWQgc3RydWN0dXJlcyBhcmUgYWxsb2NhdGVkIHlldC4KKyAgICBTbyBzdGFuZGFyZCBtYWxsb2MoKSBpcyB0aGUgb25seSBhdmFpbGFibGUgb3B0aW9uLgorKi8KKworLy8gVE9ETzogRmluZCBhbmQgcmVwbGFjZSBhbGwgcmVndWxhciBmcmVlKCkgd2l0aCBfX2ttcF9zdHJfZnJlZSgpLgorCitjaGFyICoKK19fa21wX3N0cl9mb3JtYXQoICAgICAgICAgICAvLyBBbGxvY2F0ZWQgc3RyaW5nLgorICAgIGNoYXIgY29uc3QgKiBmb3JtYXQsICAgIC8vIEZvcm1hdCBzdHJpbmcuCisgICAgLi4uICAgICAgICAgICAgICAgICAgICAgLy8gT3RoZXIgcGFyYW1ldGVycy4KKykgeworCisgICAgdmFfbGlzdCBhcmdzOworICAgIGludCAgICAgc2l6ZSAgID0gNTEyOworICAgIGNoYXIgKiAgYnVmZmVyID0gTlVMTDsKKyAgICBpbnQgICAgIHJjOworCisgICAgLy8gQWxsb2NhdGUgYnVmZmVyLgorICAgIGJ1ZmZlciA9IChjaGFyICopIEtNUF9JTlRFUk5BTF9NQUxMT0MoIHNpemUgKTsKKyAgICBpZiAoIGJ1ZmZlciA9PSBOVUxMICkgeworCUtNUF9GQVRBTCggTWVtb3J5QWxsb2NGYWlsZWQgKTsKKyAgICB9OyAvLyBpZgorCisgICAgZm9yICggOyA7ICkgeworCisgICAgICAgIC8vIFRyeSB0byBmb3JtYXQgc3RyaW5nLgorICAgICAgICB2YV9zdGFydCggYXJncywgZm9ybWF0ICk7CisgICAgICAgIHJjID0gdnNucHJpbnRmKCBidWZmZXIsIHNpemUsIGZvcm1hdCwgYXJncyApOworICAgICAgICB2YV9lbmQoIGFyZ3MgKTsKKworICAgICAgICAvLyBObyBlcnJvcnMsIHN0cmluZyBoYXMgYmVlbiBmb3JtYXR0ZWQuCisgICAgICAgIGlmICggcmMgPj0gMCAmJiByYyA8IHNpemUgKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfTsgLy8gaWYKKworICAgICAgICAvLyBFcnJvciBvY2N1cnJlZCwgYnVmZmVyIGlzIHRvbyBzbWFsbC4KKyAgICAgICAgaWYgKCByYyA+PSAwICkgeworICAgICAgICAgICAgLy8gQzk5LWNvbmZvcm1pbmcgaW1wbGVtZW50YXRpb24gb2YgdnNucHJpbnRmIHJldHVybnMgcmVxdWlyZWQgYnVmZmVyIHNpemUuCisgICAgICAgICAgICBzaXplID0gcmMgKyAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gT2xkZXIgaW1wbGVtZW50YXRpb25zIGp1c3QgcmV0dXJuIC0xLgorICAgICAgICAgICAgc2l6ZSA9IHNpemUgKiAyOworICAgICAgICB9OyAvLyBpZgorCisgICAgICAgIC8vIEVubGFyZ2UgYnVmZmVyIGFuZCB0cnkgYWdhaW4uCisgICAgICAgIGJ1ZmZlciA9IChjaGFyICopIEtNUF9JTlRFUk5BTF9SRUFMTE9DKCBidWZmZXIsIHNpemUgKTsKKyAgICAgICAgaWYgKCBidWZmZXIgPT0gTlVMTCApIHsKKyAgICAJICAgIEtNUF9GQVRBTCggTWVtb3J5QWxsb2NGYWlsZWQgKTsKKyAgICAgICAgfTsgLy8gaWYKKworICAgIH07IC8vIGZvcmV2ZXIKKworICAgIHJldHVybiBidWZmZXI7CisKK30gLy8gZnVuYyBfX2ttcF9zdHJfZm9ybWF0CisKKwordm9pZAorX19rbXBfc3RyX2ZyZWUoCisgICAgY2hhciBjb25zdCAqICogc3RyCispIHsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBzdHIgIT0gTlVMTCApOworICAgIEtNUF9JTlRFUk5BTF9GUkVFKCAodm9pZCAqKSAqIHN0ciApOworICAgICogc3RyID0gTlVMTDsKK30gLy8gZnVuYyBfX2ttcF9zdHJfZnJlZQorCisKKy8qIElmIGxlbiBpcyB6ZXJvLCByZXR1cm5zIHRydWUgaWZmIHRhcmdldCBhbmQgZGF0YSBoYXZlIGV4YWN0IGNhc2UtaW5zZW5zaXRpdmUgbWF0Y2guCisgICBJZiBsZW4gaXMgbmVnYXRpdmUsIHJldHVybnMgdHJ1ZSBpZmYgdGFyZ2V0IGlzIGEgY2FzZS1pbnNlbnNpdGl2ZSBzdWJzdHJpbmcgb2YgZGF0YS4KKyAgIElmIGxlbiBpcyBwb3NpdGl2ZSwgcmV0dXJucyB0cnVlIGlmZiB0YXJnZXQgaXMgYSBjYXNlLWluc2Vuc2l0aXZlIHN1YnN0cmluZyBvZiBkYXRhIG9yCisgICAgIHZpY2UgdmVyc2EsIGFuZCBuZWl0aGVyIGlzIHNob3J0ZXIgdGhhbiBsZW4uCisqLworaW50CitfX2ttcF9zdHJfbWF0Y2goCisgICAgY2hhciBjb25zdCAqIHRhcmdldCwKKyAgICBpbnQgICAgICAgICAgbGVuLAorICAgIGNoYXIgY29uc3QgKiBkYXRhCispIHsKKyAgICBpbnQgaTsKKyAgICBpZiAoIHRhcmdldCA9PSBOVUxMIHx8IGRhdGEgPT0gTlVMTCApIHsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH07IC8vIGlmCisgICAgZm9yICggaSA9IDA7IHRhcmdldFtpXSAmJiBkYXRhW2ldOyArKyBpICkgeworICAgICAgICBpZiAoIFRPTE9XRVIoIHRhcmdldFtpXSApICE9IFRPTE9XRVIoIGRhdGFbaV0gKSApIHsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICB9OyAvLyBmb3IgaQorICAgIHJldHVybiAoICggbGVuID4gMCApID8gaSA+PSBsZW4gOiAoICEgdGFyZ2V0W2ldICYmICggbGVuIHx8ICEgZGF0YVtpXSApICkgKTsKK30gLy8gX19rbXBfc3RyX21hdGNoCisKKworaW50CitfX2ttcF9zdHJfbWF0Y2hfZmFsc2UoIGNoYXIgY29uc3QgKiBkYXRhICkgeworICAgIGludCByZXN1bHQgPQorICAgICAgICBfX2ttcF9zdHJfbWF0Y2goICJmYWxzZSIsICAgMSwgZGF0YSApIHx8CisgICAgICAgIF9fa21wX3N0cl9tYXRjaCggIm9mZiIsICAgICAyLCBkYXRhICkgfHwKKyAgICAgICAgX19rbXBfc3RyX21hdGNoKCAiMCIsICAgICAgIDEsIGRhdGEgKSB8fAorICAgICAgICBfX2ttcF9zdHJfbWF0Y2goICIuZmFsc2UuIiwgMiwgZGF0YSApIHx8CisgICAgICAgIF9fa21wX3N0cl9tYXRjaCggIi5mLiIsICAgICAyLCBkYXRhICkgfHwKKyAgICAgICAgX19rbXBfc3RyX21hdGNoKCAibm8iLCAgICAgIDEsIGRhdGEgKTsKKyAgICByZXR1cm4gcmVzdWx0OworfSAvLyBfX2ttcF9zdHJfbWF0Y2hfZmFsc2UKKworCitpbnQKK19fa21wX3N0cl9tYXRjaF90cnVlKCBjaGFyIGNvbnN0ICogZGF0YSApIHsKKyAgICBpbnQgcmVzdWx0ID0KKyAgICAgICAgX19rbXBfc3RyX21hdGNoKCAidHJ1ZSIsICAgMSwgZGF0YSApIHx8CisgICAgICAgIF9fa21wX3N0cl9tYXRjaCggIm9uIiwgICAgIDIsIGRhdGEgKSB8fAorICAgICAgICBfX2ttcF9zdHJfbWF0Y2goICIxIiwgICAgICAxLCBkYXRhICkgfHwKKyAgICAgICAgX19rbXBfc3RyX21hdGNoKCAiLnRydWUuIiwgMiwgZGF0YSApIHx8CisgICAgICAgIF9fa21wX3N0cl9tYXRjaCggIi50LiIsICAgIDIsIGRhdGEgKSB8fAorICAgICAgICBfX2ttcF9zdHJfbWF0Y2goICJ5ZXMiLCAgICAxLCBkYXRhICk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30gLy8gX19rbXBfc3RyX21hdGNoX3RydWUKKwordm9pZAorX19rbXBfc3RyX3JlcGxhY2UoCisgICAgY2hhciAqIHN0ciwKKyAgICBjaGFyICAgc2VhcmNoX2ZvciwKKyAgICBjaGFyICAgcmVwbGFjZV93aXRoCispIHsKKworICAgIGNoYXIgKiBmb3VuZCA9IE5VTEw7CisKKyAgICBmb3VuZCA9IHN0cmNociggc3RyLCBzZWFyY2hfZm9yICk7CisgICAgd2hpbGUgKCBmb3VuZCApIHsKKyAgICAgICAgKiBmb3VuZCA9IHJlcGxhY2Vfd2l0aDsKKyAgICAgICAgZm91bmQgPSBzdHJjaHIoIGZvdW5kICsgMSwgc2VhcmNoX2ZvciApOworICAgIH07IC8vIHdoaWxlCisKK30gLy8gX19rbXBfc3RyX3JlcGxhY2UKKworCit2b2lkCitfX2ttcF9zdHJfc3BsaXQoCisgICAgY2hhciAqICBzdHIsICAgIC8vIEk6IFN0cmluZyB0byBzcGxpdC4KKyAgICBjaGFyICAgIGRlbGltLCAgLy8gSTogQ2hhcmFjdGVyIHRvIHNwbGl0IG9uLgorICAgIGNoYXIgKiogaGVhZCwgICAvLyBPOiBQb2ludGVyIHRvIGhlYWQgKG1heSBiZSBOVUxMKS4KKyAgICBjaGFyICoqIHRhaWwgICAgLy8gTzogUG9pbnRlciB0byB0YWlsIChtYXkgYmUgTlVMTCkuCispIHsKKyAgICBjaGFyICogaCA9IHN0cjsKKyAgICBjaGFyICogdCA9IE5VTEw7CisgICAgaWYgKCBzdHIgIT0gTlVMTCApIHsKKyAgICAgICAgY2hhciAqIHB0ciA9IHN0cmNociggc3RyLCBkZWxpbSApOworICAgICAgICBpZiAoIHB0ciAhPSBOVUxMICkgeworICAgICAgICAgICAgKiBwdHIgID0gMDsKKyAgICAgICAgICAgIHQgPSBwdHIgKyAxOworICAgICAgICB9OyAvLyBpZgorICAgIH07IC8vIGlmCisgICAgaWYgKCBoZWFkICE9IE5VTEwgKSB7CisgICAgICAgICogaGVhZCA9IGg7CisgICAgfTsgLy8gaWYKKyAgICBpZiAoIHRhaWwgIT0gTlVMTCApIHsKKyAgICAgICAgKiB0YWlsID0gdDsKKyAgICB9OyAvLyBpZgorfSAvLyBfX2ttcF9zdHJfc3BsaXQKKworLyoKKyAgICBzdHJ0b2tfcigpIGlzIG5vdCBhdmFpbGFibGUgb24gV2luZG93cyogT1MuIFRoaXMgZnVuY3Rpb24gcmVpbXBsZW1lbnRzIHN0cnRva19yKCkuCisqLworY2hhciAqCitfX2ttcF9zdHJfdG9rZW4oCisgICAgY2hhciAqICAgICAgIHN0ciwgICAvLyBTdHJpbmcgdG8gc3BsaXQgaW50byB0b2tlbnMuIE5vdGU6IFN0cmluZyAqaXMqIG1vZGlmaWVkIQorICAgIGNoYXIgY29uc3QgKiBkZWxpbSwgLy8gRGVsaW1pdGVycy4KKyAgICBjaGFyICoqICAgICAgYnVmICAgIC8vIEludGVybmFsIGJ1ZmZlci4KKykgeworICAgIGNoYXIgKiB0b2tlbiA9IE5VTEw7CisgICAgI2lmIEtNUF9PU19XSU5ET1dTCisgICAgICAgIC8vIE9uIFdpbmRvd3MqIE9TIHRoZXJlIGlzIG5vIHN0cnRva19yKCkgZnVuY3Rpb24uIExldCB1cyBpbXBsZW1lbnQgaXQuCisgICAgICAgIGlmICggc3RyICE9IE5VTEwgKSB7CisgICAgICAgICAgICAqIGJ1ZiA9IHN0cjsgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpcnN0IGNhbGwsIGluaXRpYWxpemUgYnVmLgorICAgICAgICB9OyAvLyBpZgorICAgICAgICAqIGJ1ZiArPSBzdHJzcG4oICogYnVmLCBkZWxpbSApOyAgICAgICAvLyBTa2lwIGxlYWRpbmcgZGVsaW1pdGVycy4KKyAgICAgICAgaWYgKCAqKiBidWYgIT0gMCApIHsgICAgICAgICAgICAgICAgICAgLy8gUmVzdCBvZiB0aGUgc3RyaW5nIGlzIG5vdCB5ZXQgZW1wdHkuCisgICAgICAgICAgICB0b2tlbiA9ICogYnVmOyAgICAgICAgICAgICAgICAgICAgIC8vIFVzZSBpdCBhcyByZXN1bHQuCisgICAgICAgICAgICAqIGJ1ZiArPSBzdHJjc3BuKCAqIGJ1ZiwgZGVsaW0gKTsgIC8vIFNraXAgbm9uLWRlbGltaXRlcnMuCisgICAgICAgICAgICBpZiAoICoqIGJ1ZiAhPSAwICkgeyAgICAgICAgICAgICAgIC8vIFJlc3Qgb2YgdGhlIHN0cmluZyBpcyBub3QgeWV0IGVtcHR5LgorICAgICAgICAgICAgICAgICoqIGJ1ZiA9IDA7ICAgICAgICAgICAgICAgICAgICAvLyBUZXJtaW5hdGUgdG9rZW4gaGVyZS4KKyAgICAgICAgICAgICAgICAqIGJ1ZiArPSAxOyAgICAgICAgICAgICAgICAgICAgLy8gQWR2YW5jZSBidWYgdG8gc3RhcnQgd2l0aCB0aGUgbmV4dCB0b2tlbiBuZXh0IHRpbWUuCisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICB9OyAvLyBpZgorICAgICNlbHNlCisgICAgICAgIC8vIE9uIExpbnV4KiBPUyBhbmQgT1MgWCosIHN0cnRva19yKCkgaXMgYXZhaWxhYmxlLiBMZXQgdXMgdXNlIGl0LgorICAgICAgICB0b2tlbiA9IHN0cnRva19yKCBzdHIsIGRlbGltLCBidWYgKTsKKyAgICAjZW5kaWYKKyAgICByZXR1cm4gdG9rZW47Cit9OyAvLyBfX2ttcF9zdHJfdG9rZW4KKworCitpbnQKK19fa21wX3N0cl90b19pbnQoCisgICAgY2hhciBjb25zdCAqIHN0ciwKKyAgICBjaGFyICAgICAgICAgc2VudGluZWwKKykgeworICAgIGludCByZXN1bHQsIGZhY3RvcjsKKyAgICBjaGFyIGNvbnN0ICogdDsKKworICAgIHJlc3VsdCA9IDA7CisKKyAgICBmb3IgKHQgPSBzdHI7ICp0ICE9ICdcMCc7ICsrdCkgeworICAgICAgICBpZiAoKnQgPCAnMCcgfHwgKnQgPiAnOScpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCAqIDEwKSArICgqdCAtICcwJyk7CisgICAgfQorCisgICAgc3dpdGNoICgqdCkgeworICAgIGNhc2UgJ1wwJzogICAgICAgICAgLyogdGhlIGN1cnJlbnQgZGVmYXVsdCBmb3Igbm8gc3VmZml4IGlzIGJ5dGVzICovCisJZmFjdG9yID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnYic6IGNhc2UgJ0InOiAvKiBieXRlcyAqLworCSsrdDsKKwlmYWN0b3IgPSAxOworICAgICAgICBicmVhazsKKyAgICBjYXNlICdrJzogY2FzZSAnSyc6IC8qIGtpbG8tYnl0ZXMgKi8KKwkrK3Q7CisJZmFjdG9yID0gMTAyNDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnbSc6IGNhc2UgJ00nOiAvKiBtZWdhLWJ5dGVzICovCisJKyt0OworCWZhY3RvciA9ICgxMDI0ICogMTAyNCk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisJaWYoKnQgIT0gc2VudGluZWwpCisJICAgIHJldHVybiAoLTEpOworCXQgPSAiIjsKKwlmYWN0b3IgPSAxOworICAgIH0KKworICAgIGlmIChyZXN1bHQgPiAoSU5UX01BWCAvIGZhY3RvcikpCisJcmVzdWx0ID0gSU5UX01BWDsKKyAgICBlbHNlCisJcmVzdWx0ICo9IGZhY3RvcjsKKworICAgIHJldHVybiAoKnQgIT0gMCA/IDAgOiByZXN1bHQpOworCit9IC8vIF9fa21wX3N0cl90b19pbnQKKworCisvKgorICAgIFRoZSByb3V0aW5lIHBhcnNlcyBpbnB1dCBzdHJpbmcuIEl0IGlzIGV4cGVjdGVkIGl0IGlzIGEgdW5zaWduZWQgaW50ZWdlciB3aXRoIG9wdGlvbmFsIHVuaXQuCisgICAgVW5pdHMgYXJlOiAiYiIgZm9yIGJ5dGVzLCAia2IiIG9yIGp1c3QgImsiIGZvciBraWxvYnl0ZXMsICJtYiIgb3IgIm0iIGZvciBtZWdhYnl0ZXMsIC4uLiwgInliIgorICAgIG9yICJ5IiBmb3IgeW90dGFieXRlcy4gOi0pIFVuaXQgbmFtZSBpcyBjYXNlLWluc2Vuc2l0aXZlLiBUaGUgcm91dGluZSByZXR1cm5zIDAgaWYgZXZlcnl0aGluZyBpcworICAgIG9rLCBvciBlcnJvciBjb2RlOiAtMSBpbiBjYXNlIG9mIG92ZXJmbG93LCAtMiBpbiBjYXNlIG9mIHVua25vd24gdW5pdC4gKnNpemUgaXMgc2V0IHRvIHBhcnNlZAorICAgIHZhbHVlLiBJbiBjYXNlIG9mIG92ZXJmbG93ICpzaXplIGlzIHNldCB0byBLTVBfU0laRV9UX01BWCwgaW4gY2FzZSBvZiB1bmtub3duIHVuaXQgKnNpemUgaXMgc2V0CisgICAgdG8gemVyby4KKyovCit2b2lkCitfX2ttcF9zdHJfdG9fc2l6ZSggICAgICAgICAvLyBSOiBFcnJvciBjb2RlLgorICAgIGNoYXIgY29uc3QgKiAgIHN0ciwgICAgLy8gSTogU3RyaW5nIG9mIGNoYXJhY3RlcnMsIHVuc2lnbmVkIG51bWJlciBhbmQgdW5pdCAoImIiLCAia2IiLCBldGMpLgorICAgIHNpemVfdCAqICAgICAgIG91dCwgICAgLy8gTzogUGFyc2VkIG51bWJlci4KKyAgICBzaXplX3QgICAgICAgICBkZmFjdG9yLCAvLyBJOiBUaGUgZmFjdG9yIGlmIG5vbmUgb2YgdGhlIGxldHRlcnMgc3BlY2lmaWVkLgorICAgIGNoYXIgY29uc3QgKiAqIGVycm9yICAgLy8gTzogTnVsbCBpZiBldmVyeXRoaW5nIGlzIG9rLCBlcnJvciBtZXNzYWdlIG90aGVyd2lzZS4KKykgeworCisgICAgc2l6ZV90IHZhbHVlICAgID0gMDsKKyAgICBzaXplX3QgZmFjdG9yICAgPSAwOworICAgIGludCAgICBvdmVyZmxvdyA9IDA7CisgICAgaW50ICAgIGJhZF91bml0ID0gMDsKKyAgICBpbnQgICAgaSAgICAgICAgPSAwOworICAgIGludCAgICBkaWdpdDsKKworCisgICAgS01QX0RFQlVHX0FTU0VSVCggc3RyICE9IE5VTEwgKTsKKworICAgIC8vIFNraXAgc3BhY2VzLgorICAgIHdoaWxlICggc3RyWyBpIF0gPT0gJyAnIHx8IHN0clsgaSBdID09ICdcdCcpIHsKKyAgICAgICAgKysgaTsKKyAgICB9OyAvLyB3aGlsZQorCisgICAgLy8gUGFyc2UgbnVtYmVyLgorICAgIGlmICggc3RyWyBpIF0gPCAnMCcgfHwgc3RyWyBpIF0gPiAnOScgKSB7CisgICAgICAgICogZXJyb3IgPSBLTVBfSTE4Tl9TVFIoIE5vdEFOdW1iZXIgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH07IC8vIGlmCisgICAgZG8geworICAgICAgICBkaWdpdCA9IHN0clsgaSBdIC0gJzAnOworICAgICAgICBvdmVyZmxvdyA9IG92ZXJmbG93IHx8ICggdmFsdWUgPiAoIEtNUF9TSVpFX1RfTUFYIC0gZGlnaXQgKSAvIDEwICk7CisgICAgICAgIHZhbHVlID0gKCB2YWx1ZSAqIDEwICkgKyBkaWdpdDsKKyAgICAgICAgKysgaTsKKyAgICB9IHdoaWxlICggc3RyWyBpIF0gPj0gJzAnICYmIHN0clsgaSBdIDw9ICc5JyApOworCisgICAgLy8gU2tpcCBzcGFjZXMuCisgICAgd2hpbGUgKCBzdHJbIGkgXSA9PSAnICcgfHwgc3RyWyBpIF0gPT0gJ1x0JyApIHsKKyAgICAgICAgKysgaTsKKyAgICB9OyAvLyB3aGlsZQorCisgICAgLy8gUGFyc2UgdW5pdC4KKyAgICAjZGVmaW5lIF9jYXNlKCBjaCwgZXhwICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIGNoIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgY2ggLSAoICdhJyAtICdBJyApIDogeyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHNpemVfdCBzaGlmdCA9IChleHApICogMTA7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKysgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoIHNoaWZ0IDwgc2l6ZW9mKCBzaXplX3QgKSAqIDggKSB7ICAgICAgIFwKKyAgICAgICAgICAgICAgICBmYWN0b3IgPSAoc2l6ZV90KSggMSApIDw8IHNoaWZ0OyAgICAgICAgXAorICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgb3ZlcmZsb3cgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9IGJyZWFrOworICAgIHN3aXRjaCAoIHN0clsgaSBdICkgeworICAgICAgICBfY2FzZSggJ2snLCAxICk7IC8vIEtpbG8KKyAgICAgICAgX2Nhc2UoICdtJywgMiApOyAvLyBNZWdhCisgICAgICAgIF9jYXNlKCAnZycsIDMgKTsgLy8gR2lnYQorICAgICAgICBfY2FzZSggJ3QnLCA0ICk7IC8vIFRlcmEKKyAgICAgICAgX2Nhc2UoICdwJywgNSApOyAvLyBQZXRhCisgICAgICAgIF9jYXNlKCAnZScsIDYgKTsgLy8gRXhhCisgICAgICAgIF9jYXNlKCAneicsIDcgKTsgLy8gWmV0dGEKKyAgICAgICAgX2Nhc2UoICd5JywgOCApOyAvLyBZb3R0YQorICAgICAgICAvLyBPb3BzLiBObyBtb3JlIHVuaXRzLi4uCisgICAgfTsgLy8gc3dpdGNoCisgICAgI3VuZGVmIF9jYXNlCisgICAgaWYgKCBzdHJbIGkgXSA9PSAnYicgfHwgc3RyWyBpIF0gPT0gJ0InICkgeyAgICAvLyBTa2lwIG9wdGlvbmFsICJiIi4KKwlpZiAoIGZhY3RvciA9PSAwICkgeworCSAgICBmYWN0b3IgPSAxOworCX0KKyAgICAgICAgKysgaTsKKyAgICB9OyAvLyBpZgorICAgIGlmICggISAoIHN0clsgaSBdID09ICcgJyB8fCBzdHJbIGkgXSA9PSAnXHQnIHx8IHN0clsgaSBdID09IDAgKSApIHsgLy8gQmFkIHVuaXQKKyAgICAgICAgKiBlcnJvciA9IEtNUF9JMThOX1NUUiggQmFkVW5pdCApOworICAgICAgICByZXR1cm47CisgICAgfTsgLy8gaWYKKworICAgIGlmICggZmFjdG9yID09IDAgKSB7CisJZmFjdG9yID0gZGZhY3RvcjsKKyAgICB9CisKKyAgICAvLyBBcHBseSBmYWN0b3IuCisgICAgb3ZlcmZsb3cgPSBvdmVyZmxvdyB8fCAoIHZhbHVlID4gKCBLTVBfU0laRV9UX01BWCAvIGZhY3RvciApICk7CisgICAgdmFsdWUgKj0gZmFjdG9yOworCisgICAgLy8gU2tpcCBzcGFjZXMuCisgICAgd2hpbGUgKCBzdHJbIGkgXSA9PSAnICcgfHwgc3RyWyBpIF0gPT0gJ1x0JyApIHsKKyAgICAgICAgKysgaTsKKyAgICB9OyAvLyB3aGlsZQorCisgICAgaWYgKCBzdHJbIGkgXSAhPSAwICkgeworICAgICAgICAqIGVycm9yID0gS01QX0kxOE5fU1RSKCBJbGxlZ2FsQ2hhcmFjdGVycyApOworICAgICAgICByZXR1cm47CisgICAgfTsgLy8gaWYKKworICAgIGlmICggb3ZlcmZsb3cgKSB7CisgICAgICAgICogZXJyb3IgPSBLTVBfSTE4Tl9TVFIoIFZhbHVlVG9vTGFyZ2UgKTsKKyAgICAgICAgKiBvdXQgPSBLTVBfU0laRV9UX01BWDsKKyAgICAgICAgcmV0dXJuOworICAgIH07IC8vIGlmCisKKyAgICAqIGVycm9yID0gTlVMTDsKKyAgICAqIG91dCA9IHZhbHVlOworCit9IC8vIF9fa21wX3N0cl90b19zaXplCisKKwordm9pZAorX19rbXBfc3RyX3RvX3VpbnQoICAgICAgICAgLy8gUjogRXJyb3IgY29kZS4KKyAgICBjaGFyIGNvbnN0ICogICBzdHIsICAgIC8vIEk6IFN0cmluZyBvZiBjaGFyYWN0ZXJzLCB1bnNpZ25lZCBudW1iZXIuCisgICAga21wX3VpbnQ2NCAqICAgb3V0LCAgICAvLyBPOiBQYXJzZWQgbnVtYmVyLgorICAgIGNoYXIgY29uc3QgKiAqIGVycm9yICAgLy8gTzogTnVsbCBpZiBldmVyeXRoaW5nIGlzIG9rLCBlcnJvciBtZXNzYWdlIG90aGVyd2lzZS4KKykgeworCisgICAgc2l6ZV90IHZhbHVlICAgID0gMDsKKyAgICBpbnQgICAgb3ZlcmZsb3cgPSAwOworICAgIGludCAgICBpICAgICAgICA9IDA7CisgICAgaW50ICAgIGRpZ2l0OworCisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBzdHIgIT0gTlVMTCApOworCisgICAgLy8gU2tpcCBzcGFjZXMuCisgICAgd2hpbGUgKCBzdHJbIGkgXSA9PSAnICcgfHwgc3RyWyBpIF0gPT0gJ1x0JyApIHsKKyAgICAgICAgKysgaTsKKyAgICB9OyAvLyB3aGlsZQorCisgICAgLy8gUGFyc2UgbnVtYmVyLgorICAgIGlmICggc3RyWyBpIF0gPCAnMCcgfHwgc3RyWyBpIF0gPiAnOScgKSB7CisgICAgICAgICogZXJyb3IgPSBLTVBfSTE4Tl9TVFIoIE5vdEFOdW1iZXIgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH07IC8vIGlmCisgICAgZG8geworICAgICAgICBkaWdpdCA9IHN0clsgaSBdIC0gJzAnOworICAgICAgICBvdmVyZmxvdyA9IG92ZXJmbG93IHx8ICggdmFsdWUgPiAoIEtNUF9TSVpFX1RfTUFYIC0gZGlnaXQgKSAvIDEwICk7CisgICAgICAgIHZhbHVlID0gKCB2YWx1ZSAqIDEwICkgKyBkaWdpdDsKKyAgICAgICAgKysgaTsKKyAgICB9IHdoaWxlICggc3RyWyBpIF0gPj0gJzAnICYmIHN0clsgaSBdIDw9ICc5JyApOworCisgICAgLy8gU2tpcCBzcGFjZXMuCisgICAgd2hpbGUgKCBzdHJbIGkgXSA9PSAnICcgfHwgc3RyWyBpIF0gPT0gJ1x0JyApIHsKKyAgICAgICAgKysgaTsKKyAgICB9OyAvLyB3aGlsZQorCisgICAgaWYgKCBzdHJbIGkgXSAhPSAwICkgeworICAgICAgICAqIGVycm9yID0gS01QX0kxOE5fU1RSKCBJbGxlZ2FsQ2hhcmFjdGVycyApOworICAgICAgICByZXR1cm47CisgICAgfTsgLy8gaWYKKworICAgIGlmICggb3ZlcmZsb3cgKSB7CisgICAgICAgICogZXJyb3IgPSBLTVBfSTE4Tl9TVFIoIFZhbHVlVG9vTGFyZ2UgKTsKKyAgICAgICAgKiBvdXQgPSAoa21wX3VpbnQ2NCkgLTE7CisgICAgICAgIHJldHVybjsKKyAgICB9OyAvLyBpZgorCisgICAgKiBlcnJvciA9IE5VTEw7CisgICAgKiBvdXQgPSB2YWx1ZTsKKworfSAvLyBfX2ttcF9zdHJfdG9fdW5pdAorCisKKworLy8gZW5kIG9mIGZpbGUgLy8KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9zdHIuaCBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9zdHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzRmYjk4Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX3N0ci5oCkBAIC0wLDAgKzEsMTIyIEBACisvKgorICoga21wX3N0ci5oIC0tIFN0cmluZyBtYW5pcHVsYXRpb24gcm91dGluZXMuCisgKiAkUmV2aXNpb246IDQzNDM1ICQKKyAqICREYXRlOiAyMDE0LTA5LTA0IDE1OjE2OjA4IC0wNTAwIChUaHUsIDA0IFNlcCAyMDE0KSAkCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgS01QX1NUUl9ICisjZGVmaW5lIEtNUF9TVFJfSAorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKyNpbmNsdWRlICJrbXBfb3MuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgICAgZXh0ZXJuICJDIiB7CisjZW5kaWYgLy8gX19jcGx1c3BsdXMKKworI2lmIEtNUF9PU19XSU5ET1dTCisjIGRlZmluZSBzdHJkdXAgICAgX3N0cmR1cAorIyBkZWZpbmUgc25wcmludGYgIF9zbnByaW50ZgorI2VuZGlmCisKKy8qICBzb21lIG1hY3JvcyB0byByZXBsYWNlIGN0eXBlLmggZnVuY3Rpb25zICAqLworI2RlZmluZSBUT0xPV0VSKGMpCSgoKChjKSA+PSAnQScpICYmICgoYykgPD0gJ1onKSkgPyAoKGMpICsgJ2EnIC0gJ0EnKSA6IChjKSkKKworc3RydWN0IGttcF9zdHJfYnVmIHsKKyAgICBjaGFyICAgICAgICogc3RyOyAgICAgICAgIC8vIFBvaW50ZXIgdG8gYnVmZmVyIGNvbnRlbnQsIHJlYWQgb25seS4KKyAgICB1bnNpZ25lZCBpbnQgc2l6ZTsgICAgICAgIC8vIERvIG5vdCBjaGFuZ2UgdGhpcyBmaWVsZCEKKyAgICBpbnQgICAgICAgICAgdXNlZDsgICAgICAgIC8vIE51bWJlciBvZiBjaGFyYWN0ZXJzIHByaW50ZWQgdG8gYnVmZmVyLCByZWFkIG9ubHkuCisgICAgY2hhciAgICAgICAgIGJ1bGtbIDUxMiBdOyAvLyBEbyBub3QgdXNlIHRoaXMgZmllbGQhCit9OyAvLyBzdHJ1Y3Qga21wX3N0cl9idWYKK3R5cGVkZWYgc3RydWN0IGttcF9zdHJfYnVmICBrbXBfc3RyX2J1Zl90OworCisjZGVmaW5lIF9fa21wX3N0cl9idWZfaW5pdCggYiApICAgeyAoYiktPnN0ciA9IChiKS0+YnVsazsgKGIpLT5zaXplID0gc2l6ZW9mKCAoYiktPmJ1bGsgKTsgKGIpLT51c2VkID0gMDsgKGIpLT5idWxrWyAwIF0gPSAwOyB9CisKK3ZvaWQgICBfX2ttcF9zdHJfYnVmX2NsZWFyKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyICk7Cit2b2lkICAgX19rbXBfc3RyX2J1Zl9yZXNlcnZlKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBpbnQgc2l6ZSApOwordm9pZCAgIF9fa21wX3N0cl9idWZfZGV0YWNoKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyICk7Cit2b2lkICAgX19rbXBfc3RyX2J1Zl9mcmVlKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyICk7Cit2b2lkICAgX19rbXBfc3RyX2J1Zl9jYXQoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBzdHIsIGludCBsZW4gKTsKK3ZvaWQgICBfX2ttcF9zdHJfYnVmX3ZwcmludCgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIGZvcm1hdCwgdmFfbGlzdCBhcmdzICk7Cit2b2lkICAgX19rbXBfc3RyX2J1Zl9wcmludCgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIGZvcm1hdCwgLi4uICk7Cit2b2lkICAgX19rbXBfc3RyX2J1Zl9wcmludF9zaXplKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBzaXplX3Qgc2l6ZSApOworCisvKgorICAgIEZpbGUgbmFtZSBwYXJzZXIuIFVzYWdlOgorCisgICAgICAgIGttcF9zdHJfZm5hbWVfdCBmbmFtZSA9IF9fa21wX3N0cl9mbmFtZV9pbml0KCBwYXRoICk7CisgICAgICAgIC8vIFVzZSBmbmFtZS5wYXRoIChjb3B5IG9mIG9yaWdpbmFsIHBhdGggKSwgZm5hbWUuZGlyLCBmbmFtZS5iYXNlLgorICAgICAgICAvLyBOb3RlIGZuYW1lLmRpciBjb25jYXRlbmF0ZWQgd2l0aCBmbmFtZS5iYXNlIGdpdmVzIGV4YWN0IGNvcHkgb2YgcGF0aC4KKyAgICAgICAgX19rbXBfc3RyX2ZuYW1lX2ZyZWUoICYgZm5hbWUgKTsKKworKi8KK3N0cnVjdCBrbXBfc3RyX2ZuYW1lIHsKKyAgICBjaGFyICogcGF0aDsKKyAgICBjaGFyICogZGlyOworICAgIGNoYXIgKiBiYXNlOworfTsgLy8gc3RydWN0IGttcF9zdHJfZm5hbWUKK3R5cGVkZWYgc3RydWN0IGttcF9zdHJfZm5hbWUga21wX3N0cl9mbmFtZV90Owordm9pZCBfX2ttcF9zdHJfZm5hbWVfaW5pdCgga21wX3N0cl9mbmFtZV90ICogZm5hbWUsIGNoYXIgY29uc3QgKiBwYXRoICk7Cit2b2lkIF9fa21wX3N0cl9mbmFtZV9mcmVlKCBrbXBfc3RyX2ZuYW1lX3QgKiBmbmFtZSApOworLy8gQ29tcGFyZXMgZmlsZSBuYW1lIHdpdGggc3BlY2lmaWVkIHBhdGVybi4gSWYgcGF0dGVybiBpcyBOVUxMLCBhbnkgZm5hbWUgbWF0Y2hlZC4KK2ludCBfX2ttcF9zdHJfZm5hbWVfbWF0Y2goIGttcF9zdHJfZm5hbWVfdCBjb25zdCAqIGZuYW1lLCBjaGFyIGNvbnN0ICogcGF0dGVybiApOworCisvKgorICAgIFRoZSBjb21waWxlciBwcm92aWRlcyBzb3VyY2UgbG9jYXRpb25zIGluIHN0cmluZyBmb3JtICI7ZmlsZTtmdW5jO2xpbmU7Y29sOzsiLiBJdCBub3Qgbm90CisgICAgY29udmVuaWVudCBmb3IgbWFudXB1bGF0aW9uLiBUaGVzZSBzdHJ1Y3R1cmUga2VlcHMgc291cmNlIGxvY2F0aW9uIGluIG1vcmUgY29udmVuaWVudCBmb3JtLgorICAgIFVzYWdlOgorCisgICAgICAgIGttcF9zdHJfbG9jX3QgbG9jID0gX19rbXBfc3RyX2xvY19pbml0KCBpZGVudC0+cHNvdXJjZSwgMCApOworICAgICAgICAvLyB1c2UgbG9jLmZpbGUsIGxvYy5mdW5jLCBsb2MubGluZSwgbG9jLmNvbC4KKyAgICAgICAgLy8gbG9jLmZuYW1lIGlzIGF2YWlsYWJsZSBpZiB0aGUgc2Vjb25kIGFyZ3VtZW50IG9mIF9fa21wX3N0cl9sb2NfaW5pdCBpcyB0cnVlLgorICAgICAgICBfX2ttcF9zdHJfbG9jX2ZyZWUoICYgbG9jICk7CisKKyAgICBJZiBwc291cmNlIGlzIE5VTEwgb3IgZG9lcyBub3QgZm9sbG93IGZvcm1hdCBhYm92ZSwgZmlsZSBhbmQvb3IgZnVuYyBtYXkgYmUgTlVMTCBwb2ludGVycy4KKyovCitzdHJ1Y3Qga21wX3N0cl9sb2MgeworICAgIGNoYXIgKiAgICAgICAgICBfYnVsazsgIC8vIERvIG5vdCB1c2UgdGhpZCBmaWVsZC4KKyAgICBrbXBfc3RyX2ZuYW1lX3QgZm5hbWU7ICAvLyBXaWxsIGJlIGluaXRpYWxpemVkIGlmIGluaXRfZm5hbWUgaXMgdHJ1ZS4KKyAgICBjaGFyICogICAgICAgICAgZmlsZTsKKyAgICBjaGFyICogICAgICAgICAgZnVuYzsKKyAgICBpbnQgICAgICAgICAgICAgbGluZTsKKyAgICBpbnQgICAgICAgICAgICAgY29sOworfTsgLy8gc3RydWN0IGttcF9zdHJfbG9jCit0eXBlZGVmIHN0cnVjdCBrbXBfc3RyX2xvYyBrbXBfc3RyX2xvY190Owora21wX3N0cl9sb2NfdCBfX2ttcF9zdHJfbG9jX2luaXQoIGNoYXIgY29uc3QgKiBwc291cmNlLCBpbnQgaW5pdF9mbmFtZSApOwordm9pZCBfX2ttcF9zdHJfbG9jX2ZyZWUoIGttcF9zdHJfbG9jX3QgKiBsb2MgKTsKKworaW50ICAgIF9fa21wX3N0cl9lcWYoIGNoYXIgY29uc3QgKiBsaHMsIGNoYXIgY29uc3QgKiByaHMgKTsKK2NoYXIgKiBfX2ttcF9zdHJfZm9ybWF0KCBjaGFyIGNvbnN0ICogZm9ybWF0LCAuLi4gKTsKK3ZvaWQgICBfX2ttcF9zdHJfZnJlZSggY2hhciBjb25zdCAqICogc3RyICk7CitpbnQgICAgX19rbXBfc3RyX21hdGNoKCBjaGFyIGNvbnN0ICogdGFyZ2V0LCBpbnQgbGVuLCBjaGFyIGNvbnN0ICogZGF0YSApOworaW50ICAgIF9fa21wX3N0cl9tYXRjaF9mYWxzZSggY2hhciBjb25zdCAqIGRhdGEgKTsKK2ludCAgICBfX2ttcF9zdHJfbWF0Y2hfdHJ1ZSggY2hhciBjb25zdCAqIGRhdGEgKTsKK3ZvaWQgICBfX2ttcF9zdHJfcmVwbGFjZSggY2hhciAqIHN0ciwgY2hhciBzZWFyY2hfZm9yLCBjaGFyIHJlcGxhY2Vfd2l0aCApOwordm9pZCAgIF9fa21wX3N0cl9zcGxpdCggY2hhciAqIHN0ciwgY2hhciBkZWxpbSwgY2hhciAqKiBoZWFkLCBjaGFyICoqIHRhaWwgKTsKK2NoYXIgKiBfX2ttcF9zdHJfdG9rZW4oIGNoYXIgKiBzdHIsIGNoYXIgY29uc3QgKiBkZWxpbSwgY2hhciAqKiBidWYgKTsKK2ludCAgICBfX2ttcF9zdHJfdG9faW50KCBjaGFyIGNvbnN0ICogc3RyLCBjaGFyIHNlbnRpbmVsICk7CisKK3ZvaWQgX19rbXBfc3RyX3RvX3NpemUoIGNoYXIgY29uc3QgKiBzdHIsIHNpemVfdCAqIG91dCwgc2l6ZV90IGRmYWN0b3IsIGNoYXIgY29uc3QgKiAqIGVycm9yICk7Cit2b2lkIF9fa21wX3N0cl90b191aW50KCBjaGFyIGNvbnN0ICogc3RyLCBrbXBfdWludDY0ICogb3V0LCBjaGFyIGNvbnN0ICogKiBlcnJvciApOworCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgICB9IC8vIGV4dGVybiAiQyIKKyNlbmRpZiAvLyBfX2NwbHVzcGx1cworCisjZW5kaWYgLy8gS01QX1NUUl9ICisKKy8vIGVuZCBvZiBmaWxlIC8vCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9zdHViLmMgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfc3R1Yi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlZjhlYjEKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfc3R1Yi5jCkBAIC0wLDAgKzEsMjU0IEBACisvKgorICoga21wX3N0dWIuYyAtLSBzdHViIHZlcnNpb25zIG9mIHVzZXItY2FsbGFibGUgT3Blbk1QIFJUIGZ1bmN0aW9ucy4KKyAqICRSZXZpc2lvbjogNDI5NTEgJAorICogJERhdGU6IDIwMTQtMDEtMjEgMTQ6NDE6NDEgLTA2MDAgKFR1ZSwgMjEgSmFuIDIwMTQpICQKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlICJvbXAuaCIgICAgICAgICAgICAgICAgLy8gRnVuY3Rpb24gcmVuYW1pbmdzLgorI2luY2x1ZGUgImttcC5oIiAgICAgICAgICAgICAgICAvLyBLTVBfREVGQVVMVF9TVEtTSVpFCisjaW5jbHVkZSAia21wX3N0dWIuaCIKKworI2lmIEtNUF9PU19XSU5ET1dTCisgICAgI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbHNlCisgICAgI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjZW5kaWYKKworLy8gTW92ZWQgZnJvbSBvbXAuaAorI2RlZmluZSBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzICAgIG9tcGNfc2V0X21heF9hY3RpdmVfbGV2ZWxzCisjZGVmaW5lIG9tcF9zZXRfc2NoZWR1bGUgICAgICAgICAgICAgb21wY19zZXRfc2NoZWR1bGUKKyNkZWZpbmUgb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtICBvbXBjX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCisjZGVmaW5lIG9tcF9nZXRfdGVhbV9zaXplICAgICAgICAgICAgb21wY19nZXRfdGVhbV9zaXplCisKKyNkZWZpbmUgb21wX3NldF9udW1fdGhyZWFkcyAgICAgICAgICBvbXBjX3NldF9udW1fdGhyZWFkcworI2RlZmluZSBvbXBfc2V0X2R5bmFtaWMgICAgICAgICAgICAgIG9tcGNfc2V0X2R5bmFtaWMKKyNkZWZpbmUgb21wX3NldF9uZXN0ZWQgICAgICAgICAgICAgICBvbXBjX3NldF9uZXN0ZWQKKyNkZWZpbmUga21wX3NldF9zdGFja3NpemUgICAgICAgICAgICBrbXBjX3NldF9zdGFja3NpemUKKyNkZWZpbmUga21wX3NldF9zdGFja3NpemVfcyAgICAgICAgICBrbXBjX3NldF9zdGFja3NpemVfcworI2RlZmluZSBrbXBfc2V0X2Jsb2NrdGltZSAgICAgICAgICAgIGttcGNfc2V0X2Jsb2NrdGltZQorI2RlZmluZSBrbXBfc2V0X2xpYnJhcnkgICAgICAgICAgICAgIGttcGNfc2V0X2xpYnJhcnkKKyNkZWZpbmUga21wX3NldF9kZWZhdWx0cyAgICAgICAgICAgICBrbXBjX3NldF9kZWZhdWx0cworI2RlZmluZSBrbXBfbWFsbG9jICAgICAgICAgICAgICAgICAgIGttcGNfbWFsbG9jCisjZGVmaW5lIGttcF9jYWxsb2MgICAgICAgICAgICAgICAgICAga21wY19jYWxsb2MKKyNkZWZpbmUga21wX3JlYWxsb2MgICAgICAgICAgICAgICAgICBrbXBjX3JlYWxsb2MKKyNkZWZpbmUga21wX2ZyZWUgICAgICAgICAgICAgICAgICAgICBrbXBjX2ZyZWUKKworc3RhdGljIGRvdWJsZSBmcmVxdWVuY3kgPSAwLjA7CisKKy8vIEhlbHBlciBmdW5jdGlvbnMuCitzdGF0aWMgc2l6ZV90IF9fa21wc19pbml0KCkgeworICAgIHN0YXRpYyBpbnQgICAgaW5pdGlhbGl6ZWQgPSAwOworICAgIHN0YXRpYyBzaXplX3QgZHVtbXkgPSAwOworICAgIGlmICggISBpbml0aWFsaXplZCApIHsKKworICAgICAgICAvLyBUT0RPOiBBbmFseXplIEtNUF9WRVJTSU9OIGVudmlyb25tZW50IHZhcmlhYmxlLCBwcmludCBfX2ttcF92ZXJzaW9uX2NvcHlyaWdodCBhbmQKKyAgICAgICAgLy8gX19rbXBfdmVyc2lvbl9idWlsZF90aW1lLgorICAgICAgICAvLyBXQVJOSU5HOiBEbyBub3QgdXNlICJmcHJpbnRmKCBzdGRlcnIsIC4uLiApIiBiZWNhdXNlIGl0IHdpbGwgY2F1c2UgdW5yZXNvbHZlZCAiX19pb2IiCisgICAgICAgIC8vIHN5bWJvbCAoc2VlIEM3MDA4MCkuIFdlIG5lZWQgdG8gZXh0cmFjdCBfX2ttcF9wcmludGYoKSBzdHVmZiBmcm9tIGttcF9ydW50aW1lLmMgYW5kIHVzZQorICAgICAgICAvLyBpdC4KKworICAgICAgICAvLyBUcmljayB3aXRoIGR1bW15IHZhcmlhYmxlIGZvcmNlcyBsaW5rZXIgdG8ga2VlcCBfX2ttcF92ZXJzaW9uX2NvcHlyaWdodCBhbmQKKyAgICAgICAgLy8gX19rbXBfdmVyc2lvbl9idWlsZF90aW1lIHN0cmluZ3MgaW4gZXhlY3V0YWJsZSBmaWxlIChpbiBjYXNlIG9mIHN0YXRpYyBsaW5rYWdlKS4KKyAgICAgICAgLy8gV2hlbiBLTVBfVkVSU0lPTiBhbmFseXplIGlzIGltcGxlbWVudGVkLCBkdW1teSB2YXJpYWJsZSBzaG91bGQgYmUgZGVsZXRlZCwgZnVuY3Rpb24KKyAgICAgICAgLy8gc2hvdWxkIHJldHVybiB2b2lkLgorICAgICAgICBkdW1teSA9IF9fa21wX3ZlcnNpb25fY29weXJpZ2h0IC0gX19rbXBfdmVyc2lvbl9idWlsZF90aW1lOworCisgICAgICAgICNpZiBLTVBfT1NfV0lORE9XUworICAgICAgICAgICAgTEFSR0VfSU5URUdFUiBmcmVxOworICAgICAgICAgICAgQk9PTCBzdGF0dXMgPSBRdWVyeVBlcmZvcm1hbmNlRnJlcXVlbmN5KCAmIGZyZXEgKTsKKyAgICAgICAgICAgIGlmICggc3RhdHVzICkgeworICAgICAgICAgICAgICAgIGZyZXF1ZW5jeSA9IGRvdWJsZSggZnJlcS5RdWFkUGFydCApOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgI2VuZGlmCisKKyAgICAgICAgaW5pdGlhbGl6ZWQgPSAxOworICAgIH07IC8vIGlmCisgICAgcmV0dXJuIGR1bW15OworfTsgLy8gX19rbXBzX2luaXQKKworI2RlZmluZSBpIF9fa21wc19pbml0KCk7CisKKy8qIHNldCBBUEkgZnVuY3Rpb25zICovCit2b2lkIG9tcF9zZXRfbnVtX3RocmVhZHMoIG9tcF9pbnRfdCBudW1fdGhyZWFkcyApIHsgaTsgfQordm9pZCBvbXBfc2V0X2R5bmFtaWMoIG9tcF9pbnRfdCBkeW5hbWljICkgICAgICAgICB7IGk7IF9fa21wc19zZXRfZHluYW1pYyggZHluYW1pYyApOyB9Cit2b2lkIG9tcF9zZXRfbmVzdGVkKCBvbXBfaW50X3QgbmVzdGVkICkgICAgICAgICAgIHsgaTsgX19rbXBzX3NldF9uZXN0ZWQoIG5lc3RlZCApOyAgIH0KK3ZvaWQgb21wX3NldF9tYXhfYWN0aXZlX2xldmVscyggb21wX2ludF90IG1heF9hY3RpdmVfbGV2ZWxzICkgeyBpOyB9Cit2b2lkIG9tcF9zZXRfc2NoZWR1bGUoIG9tcF9zY2hlZF90IGtpbmQsIG9tcF9pbnRfdCBtb2RpZmllciApIHsgaTsgX19rbXBzX3NldF9zY2hlZHVsZSggKGttcF9zY2hlZF90KWtpbmQsIG1vZGlmaWVyICk7IH0KK2ludCBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0oIG9tcF9pbnRfdCBsZXZlbCApIHsgaTsgcmV0dXJuICggbGV2ZWwgKSA/ICggLTEgKSA6ICggMCApOyB9CitpbnQgb21wX2dldF90ZWFtX3NpemUoIG9tcF9pbnRfdCBsZXZlbCApIHsgaTsgcmV0dXJuICggbGV2ZWwgKSA/ICggLTEgKSA6ICggMSApOyB9CitpbnQga21wY19zZXRfYWZmaW5pdHlfbWFza19wcm9jKCBpbnQgcHJvYywgdm9pZCAqKm1hc2sgKSB7IGk7IHJldHVybiAtMTsgfQoraW50IGttcGNfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jKCBpbnQgcHJvYywgdm9pZCAqKm1hc2sgKSB7IGk7IHJldHVybiAtMTsgfQoraW50IGttcGNfZ2V0X2FmZmluaXR5X21hc2tfcHJvYyggaW50IHByb2MsIHZvaWQgKiptYXNrICkgeyBpOyByZXR1cm4gLTE7IH0KKworLyoga21wIEFQSSBmdW5jdGlvbnMgKi8KK3ZvaWQga21wX3NldF9zdGFja3NpemUoIG9tcF9pbnRfdCBhcmcgKSAgIHsgaTsgX19rbXBzX3NldF9zdGFja3NpemUoIGFyZyApOyB9Cit2b2lkIGttcF9zZXRfc3RhY2tzaXplX3MoIHNpemVfdCBhcmcgKSAgICB7IGk7IF9fa21wc19zZXRfc3RhY2tzaXplKCBhcmcgKTsgfQordm9pZCBrbXBfc2V0X2Jsb2NrdGltZSggb21wX2ludF90IGFyZyApICAgeyBpOyBfX2ttcHNfc2V0X2Jsb2NrdGltZSggYXJnICk7IH0KK3ZvaWQga21wX3NldF9saWJyYXJ5KCBvbXBfaW50X3QgYXJnICkgICAgIHsgaTsgX19rbXBzX3NldF9saWJyYXJ5KCBhcmcgKTsgfQordm9pZCBrbXBfc2V0X2RlZmF1bHRzKCBjaGFyIGNvbnN0ICogc3RyICkgeyBpOyB9CisKKy8qIEtNUCBtZW1vcnkgbWFuYWdlbWVudCBmdW5jdGlvbnMuICovCit2b2lkICoga21wX21hbGxvYyggc2l6ZV90IHNpemUgKSAgICAgICAgICAgICAgICAgeyBpOyByZXR1cm4gbWFsbG9jKCBzaXplICk7IH0KK3ZvaWQgKiBrbXBfY2FsbG9jKCBzaXplX3QgbmVsZW0sIHNpemVfdCBlbHNpemUgKSB7IGk7IHJldHVybiBjYWxsb2MoIG5lbGVtLCBlbHNpemUgKTsgfQordm9pZCAqIGttcF9yZWFsbG9jKCB2b2lkICpwdHIsIHNpemVfdCBzaXplICkgICAgIHsgaTsgcmV0dXJuIHJlYWxsb2MoIHB0ciwgc2l6ZSApOyB9Cit2b2lkICAga21wX2ZyZWUoIHZvaWQgKiBwdHIgKSAgICAgICAgICAgICAgICAgICAgeyBpOyBmcmVlKCBwdHIgKTsgfQorCitzdGF0aWMgaW50IF9fa21wc19ibG9ja3RpbWUgPSBJTlRfTUFYOworCit2b2lkIF9fa21wc19zZXRfYmxvY2t0aW1lKCBpbnQgYXJnICkgeworICAgIGk7CisgICAgX19rbXBzX2Jsb2NrdGltZSA9IGFyZzsKK30gLy8gX19rbXBzX3NldF9ibG9ja3RpbWUKKworaW50IF9fa21wc19nZXRfYmxvY2t0aW1lKCB2b2lkICkgeworICAgIGk7CisgICAgcmV0dXJuIF9fa21wc19ibG9ja3RpbWU7Cit9IC8vIF9fa21wc19nZXRfYmxvY2t0aW1lCisKK3N0YXRpYyBpbnQgX19rbXBzX2R5bmFtaWMgPSAwOworCit2b2lkIF9fa21wc19zZXRfZHluYW1pYyggaW50IGFyZyApIHsKKyAgICBpOworICAgIF9fa21wc19keW5hbWljID0gYXJnOworfSAvLyBfX2ttcHNfc2V0X2R5bmFtaWMKKworaW50IF9fa21wc19nZXRfZHluYW1pYyggdm9pZCApIHsKKyAgICBpOworICAgIHJldHVybiBfX2ttcHNfZHluYW1pYzsKK30gLy8gX19rbXBzX2dldF9keW5hbWljCisKK3N0YXRpYyBpbnQgX19rbXBzX2xpYnJhcnkgPSAxMDAwOworCit2b2lkIF9fa21wc19zZXRfbGlicmFyeSggaW50IGFyZyApIHsKKyAgICBpOworICAgIF9fa21wc19saWJyYXJ5ID0gYXJnOworfSAvLyBfX2ttcHNfc2V0X2xpYnJhcnkKKworaW50IF9fa21wc19nZXRfbGlicmFyeSggdm9pZCApIHsKKyAgICBpOworICAgIHJldHVybiBfX2ttcHNfbGlicmFyeTsKK30gLy8gX19rbXBzX2dldF9saWJyYXJ5CisKK3N0YXRpYyBpbnQgX19rbXBzX25lc3RlZCA9IDA7CisKK3ZvaWQgX19rbXBzX3NldF9uZXN0ZWQoIGludCBhcmcgKSB7CisgICAgaTsKKyAgICBfX2ttcHNfbmVzdGVkID0gYXJnOworfSAvLyBfX2ttcHNfc2V0X25lc3RlZAorCitpbnQgX19rbXBzX2dldF9uZXN0ZWQoIHZvaWQgKSB7CisgICAgaTsKKyAgICByZXR1cm4gX19rbXBzX25lc3RlZDsKK30gLy8gX19rbXBzX2dldF9uZXN0ZWQKKworc3RhdGljIHNpemVfdCBfX2ttcHNfc3RhY2tzaXplID0gS01QX0RFRkFVTFRfU1RLU0laRTsKKwordm9pZCBfX2ttcHNfc2V0X3N0YWNrc2l6ZSggaW50IGFyZyApIHsKKyAgICBpOworICAgIF9fa21wc19zdGFja3NpemUgPSBhcmc7Cit9IC8vIF9fa21wc19zZXRfc3RhY2tzaXplCisKK2ludCBfX2ttcHNfZ2V0X3N0YWNrc2l6ZSggdm9pZCApIHsKKyAgICBpOworICAgIHJldHVybiBfX2ttcHNfc3RhY2tzaXplOworfSAvLyBfX2ttcHNfZ2V0X3N0YWNrc2l6ZQorCitzdGF0aWMga21wX3NjaGVkX3QgX19rbXBzX3NjaGVkX2tpbmQgICAgID0ga21wX3NjaGVkX2RlZmF1bHQ7CitzdGF0aWMgaW50ICAgICAgICAgX19rbXBzX3NjaGVkX21vZGlmaWVyID0gMDsKKworICAgIHZvaWQgX19rbXBzX3NldF9zY2hlZHVsZSgga21wX3NjaGVkX3Qga2luZCwgaW50IG1vZGlmaWVyICkgeworICAgICAgICBpOworICAgICAgICBfX2ttcHNfc2NoZWRfa2luZCAgICAgPSBraW5kOworICAgICAgICBfX2ttcHNfc2NoZWRfbW9kaWZpZXIgPSBtb2RpZmllcjsKKyAgICB9IC8vIF9fa21wc19zZXRfc2NoZWR1bGUKKworICAgIHZvaWQgX19rbXBzX2dldF9zY2hlZHVsZSgga21wX3NjaGVkX3QgKmtpbmQsIGludCAqbW9kaWZpZXIgKSB7CisgICAgICAgIGk7CisgICAgICAgICpraW5kICAgICA9IF9fa21wc19zY2hlZF9raW5kOworICAgICAgICAqbW9kaWZpZXIgPSBfX2ttcHNfc2NoZWRfbW9kaWZpZXI7CisgICAgfSAvLyBfX2ttcHNfZ2V0X3NjaGVkdWxlCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorCitzdGF0aWMga21wX3Byb2NfYmluZF90IF9fa21wc19wcm9jX2JpbmQgPSBwcm9jX2JpbmRfZmFsc2U7CisKK3ZvaWQgX19rbXBzX3NldF9wcm9jX2JpbmQoIGttcF9wcm9jX2JpbmRfdCBhcmcgKSB7CisgICAgaTsKKyAgICBfX2ttcHNfcHJvY19iaW5kID0gYXJnOworfSAvLyBfX2ttcHNfc2V0X3Byb2NfYmluZAorCitrbXBfcHJvY19iaW5kX3QgX19rbXBzX2dldF9wcm9jX2JpbmQoIHZvaWQgKSB7CisgICAgaTsKKyAgICByZXR1cm4gX19rbXBzX3Byb2NfYmluZDsKK30gLy8gX19rbXBzX2dldF9wcm9jX2JpbmQKKworI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisKK2RvdWJsZSBfX2ttcHNfZ2V0X3d0aW1lKCB2b2lkICkgeworICAgIC8vIEVsYXBzZWQgd2FsbCBjbG9jayB0aW1lIChpbiBzZWNvbmQpIGZyb20gInNvbWV0aW1lIGluIHRoZSBwYXN0Ii4KKyAgICBkb3VibGUgd3RpbWUgPSAwLjA7CisgICAgaTsKKyAgICAjaWYgS01QX09TX1dJTkRPV1MKKyAgICAgICAgaWYgKCBmcmVxdWVuY3kgPiAwLjAgKSB7CisgICAgICAgICAgICBMQVJHRV9JTlRFR0VSIG5vdzsKKyAgICAgICAgICAgIEJPT0wgc3RhdHVzID0gUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIoICYgbm93ICk7CisgICAgICAgICAgICBpZiAoIHN0YXR1cyApIHsKKyAgICAgICAgICAgICAgICB3dGltZSA9IGRvdWJsZSggbm93LlF1YWRQYXJ0ICkgLyBmcmVxdWVuY3k7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICB9OyAvLyBpZgorICAgICNlbHNlCisgICAgICAgIC8vIGdldHRpbWVvZmRheSgpIHJldHVybnMgc2Vjb25kcyBhbmQgbWljcm9zZWNvbmRzIHNpbnNlIHRoZSBFcG9jaC4KKyAgICAgICAgc3RydWN0IHRpbWV2YWwgIHR2YWw7CisgICAgICAgIGludCAgICAgICAgICAgICByYzsKKyAgICAgICAgcmMgPSBnZXR0aW1lb2ZkYXkoICYgdHZhbCwgTlVMTCApOworICAgICAgICBpZiAoIHJjID09IDAgKSB7CisgICAgICAgICAgICB3dGltZSA9IChkb3VibGUpKCB0dmFsLnR2X3NlYyApICsgMS4wRS0wNiAqIChkb3VibGUpKCB0dmFsLnR2X3VzZWMgKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFRPRE86IEFzc2VydCBvciBhYm9ydCBoZXJlLgorICAgICAgICB9OyAvLyBpZgorICAgICNlbmRpZgorICAgIHJldHVybiB3dGltZTsKK307IC8vIF9fa21wc19nZXRfd3RpbWUKKworZG91YmxlIF9fa21wc19nZXRfd3RpY2soIHZvaWQgKSB7CisgICAgLy8gTnVtYmVyIG9mIHNlY29uZHMgYmV0d2VlbiBzdWNjZXNzaXZlIGNsb2NrIHRpY2tzLgorICAgIGRvdWJsZSB3dGljayA9IDAuMDsKKyAgICBpOworICAgICNpZiBLTVBfT1NfV0lORE9XUworICAgICAgICB7CisgICAgICAgICAgICBEV09SRCBpbmNyZW1lbnQ7CisgICAgICAgICAgICBEV09SRCBhZGp1c3RtZW50OworICAgICAgICAgICAgQk9PTCAgZGlzYWJsZWQ7CisgICAgICAgICAgICBCT09MICByYzsKKyAgICAgICAgICAgIHJjID0gR2V0U3lzdGVtVGltZUFkanVzdG1lbnQoICYgYWRqdXN0bWVudCwgJiBpbmNyZW1lbnQsICYgZGlzYWJsZWQgKTsKKyAgICAgICAgICAgIGlmICggcmMgKSB7CisgICAgICAgICAgICAgICAgd3RpY2sgPSAxLjBFLTA3ICogKGRvdWJsZSkoIGRpc2FibGVkID8gaW5jcmVtZW50IDogYWRqdXN0bWVudCApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBBc3NlcnQgb3IgYWJvcnQgaGVyZS4KKyAgICAgICAgICAgICAgICB3dGljayA9IDEuMEUtMDM7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICB9CisgICAgI2Vsc2UKKyAgICAgICAgLy8gVE9ETzogZ2V0dGltZW9mZGF5KCkgcmV0dXJucyBpbiBtaWNyb3NlY29uZHMsIGJ1dCB3aGF0IHRoZSBwcmVjaXNpb24/CisgICAgICAgIHd0aWNrID0gMS4wRS0wNjsKKyAgICAjZW5kaWYKKyAgICByZXR1cm4gd3RpY2s7Cit9OyAvLyBfX2ttcHNfZ2V0X3d0aWNrCisKKy8vIGVuZCBvZiBmaWxlIC8vCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9zdHViLmggYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfc3R1Yi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0YmQxZjcKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfc3R1Yi5oCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBrbXBfc3R1Yi5oCisgKiAkUmV2aXNpb246IDQyOTUxICQKKyAqICREYXRlOiAyMDE0LTAxLTIxIDE0OjQxOjQxIC0wNjAwIChUdWUsIDIxIEphbiAyMDE0KSAkCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgS01QX1NUVUJfSAorI2RlZmluZSBLTVBfU1RVQl9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworICAgIGV4dGVybiAiQyIgeworI2VuZGlmIC8vIF9fY3BsdXNwbHVzCisKK3ZvaWQgX19rbXBzX3NldF9ibG9ja3RpbWUoIGludCBhcmcgKTsKK2ludCAgX19rbXBzX2dldF9ibG9ja3RpbWUoIHZvaWQgKTsKK3ZvaWQgX19rbXBzX3NldF9keW5hbWljKCBpbnQgYXJnICk7CitpbnQgIF9fa21wc19nZXRfZHluYW1pYyggdm9pZCApOwordm9pZCBfX2ttcHNfc2V0X2xpYnJhcnkoIGludCBhcmcgKTsKK2ludCAgX19rbXBzX2dldF9saWJyYXJ5KCB2b2lkICk7Cit2b2lkIF9fa21wc19zZXRfbmVzdGVkKCBpbnQgYXJnICk7CitpbnQgIF9fa21wc19nZXRfbmVzdGVkKCB2b2lkICk7Cit2b2lkIF9fa21wc19zZXRfc3RhY2tzaXplKCBpbnQgYXJnICk7CitpbnQgIF9fa21wc19nZXRfc3RhY2tzaXplKCk7CisKKyNpZm5kZWYgS01QX1NDSEVEX1RZUEVfREVGSU5FRAorI2RlZmluZSBLTVBfU0NIRURfVFlQRV9ERUZJTkVECit0eXBlZGVmIGVudW0ga21wX3NjaGVkIHsKKyAgICBrbXBfc2NoZWRfc3RhdGljICAgICAgICAgICAgPSAxLCAvLyBtYXBwZWQgdG8ga21wX3NjaF9zdGF0aWNfY2h1bmtlZCAgICAgICAgICAgKDMzKQorICAgIGttcF9zY2hlZF9keW5hbWljICAgICAgICAgICA9IDIsIC8vIG1hcHBlZCB0byBrbXBfc2NoX2R5bmFtaWNfY2h1bmtlZCAgICAgICAgICAoMzUpCisgICAga21wX3NjaGVkX2d1aWRlZCAgICAgICAgICAgID0gMywgLy8gbWFwcGVkIHRvIGttcF9zY2hfZ3VpZGVkX2NodW5rZWQgICAgICAgICAgICgzNikKKyAgICBrbXBfc2NoZWRfYXV0byAgICAgICAgICAgICAgPSA0LCAvLyBtYXBwZWQgdG8ga21wX3NjaF9hdXRvICAgICAgICAgICAgICAgICAgICAgKDM4KQorICAgIGttcF9zY2hlZF9kZWZhdWx0ID0ga21wX3NjaGVkX3N0YXRpYyAgIC8vIGRlZmF1bHQgc2NoZWR1bGluZworfSBrbXBfc2NoZWRfdDsKKyNlbmRpZgordm9pZCBfX2ttcHNfc2V0X3NjaGVkdWxlKCBrbXBfc2NoZWRfdCBraW5kLCBpbnQgbW9kaWZpZXIgKTsKK3ZvaWQgX19rbXBzX2dldF9zY2hlZHVsZSgga21wX3NjaGVkX3QgKmtpbmQsIGludCAqbW9kaWZpZXIgKTsKKworI2lmIE9NUF80MF9FTkFCTEVECit2b2lkIF9fa21wc19zZXRfcHJvY19iaW5kKCBrbXBfcHJvY19iaW5kX3QgYXJnICk7CitrbXBfcHJvY19iaW5kX3QgX19rbXBzX2dldF9wcm9jX2JpbmQoIHZvaWQgKTsKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworCitkb3VibGUgX19rbXBzX2dldF93dGltZSgpOworZG91YmxlIF9fa21wc19nZXRfd3RpY2soKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgICAgfSAvLyBleHRlcm4gIkMiCisjZW5kaWYgLy8gX19jcGx1c3BsdXMKKworI2VuZGlmIC8vIEtNUF9TVFVCX0gKKworLy8gZW5kIG9mIGZpbGUgLy8KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF90YXNrZGVwcy5jcHAgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfdGFza2RlcHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlNDI2MTcKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfdGFza2RlcHMuY3BwCkBAIC0wLDAgKzEsNDk1IEBACisvKgorICoga21wX3Rhc2tkZXBzLmNwcAorICogJFJldmlzaW9uOiA0MjUzOSAkCisgKiAkRGF0ZTogMjAxMy0wNy0xNyAxMToyMDowMSAtMDUwMCAoV2VkLCAxNyBKdWwgMjAxMykgJAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisvLyNkZWZpbmUgS01QX1NVUFBPUlRfR1JBUEhfT1VUUFVUIDEKKworI2luY2x1ZGUgImttcC5oIgorI2luY2x1ZGUgImttcF9pby5oIgorI2luY2x1ZGUgImttcF93YWl0X3JlbGVhc2UuaCIKKworI2lmIE9NUF80MF9FTkFCTEVECisKKy8vVE9ETzogSW1wcm92ZSBtZW1vcnkgYWxsb2NhdGlvbj8ga2VlcCBhIGxpc3Qgb2YgcHJlLWFsbG9jYXRlZCBzdHJ1Y3R1cmVzPyBhbGxvY2F0ZSBpbiBibG9ja3M/IHJlLXVzZSBsaXN0IGZpbmlzaGVkIGxpc3QgZW50cmllcz8KKy8vVE9ETzogZG9uJ3QgdXNlIGF0b21pYyByZWYgY291bnRlcnMgZm9yIHN0YWNrLWFsbG9jYXRlZCBub2Rlcy4KKy8vVE9ETzogZmluZCBhbiBhbHRlcm5hdGUgdG8gYXRvbWljIHJlZnMgZm9yIGhlYXAtYWxsb2NhdGVkIG5vZGVzPworLy9UT0RPOiBGaW5pc2ggZ3JhcGggb3V0cHV0IHN1cHBvcnQKKy8vVE9ETzoga21wX2xvY2tfdCBzZWVtcyBhIHRhZCB0byBiaWcgKGFuZCBoZWF2eSB3ZWlnaHQpIGZvciB0aGlzLiBDaGVjayBvdGhlciBydW50aW1lIGxvY2tzCisvL1RPRE86IEFueSBJVFQgc3VwcG9ydCBuZWVkZWQ/CisKKyNpZmRlZiBLTVBfU1VQUE9SVF9HUkFQSF9PVVRQVVQKK3N0YXRpYyBrbXBfaW50MzIga21wX25vZGVfaWRfc2VlZCA9IDA7CisjZW5kaWYKKworc3RhdGljIHZvaWQKK19fa21wX2luaXRfbm9kZSAoIGttcF9kZXBub2RlX3QgKm5vZGUgKQoreworICAgIG5vZGUtPmRuLnRhc2sgPSBOVUxMOyAvLyBzZXQgdG8gbnVsbCBpbml0aWFsbHksIGl0IHdpbGwgcG9pbnQgdG8gdGhlIHJpZ2h0IHRhc2sgb25jZSBkZXBlbmRlbmNlcyBoYXZlIGJlZW4gcHJvY2Vzc2VkCisgICAgbm9kZS0+ZG4uc3VjY2Vzc29ycyA9IE5VTEw7CisgICAgX19rbXBfaW5pdF9sb2NrKCZub2RlLT5kbi5sb2NrKTsKKyAgICBub2RlLT5kbi5ucmVmcyA9IDE7IC8vIGluaXQgY3JlYXRlcyB0aGUgZmlyc3QgcmVmZXJlbmNlIHRvIHRoZSBub2RlCisjaWZkZWYgS01QX1NVUFBPUlRfR1JBUEhfT1VUUFVUCisgICAgbm9kZS0+ZG4uaWQgPSBLTVBfVEVTVF9USEVOX0lOQzMyKCZrbXBfbm9kZV9pZF9zZWVkKTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIGttcF9kZXBub2RlX3QgKgorX19rbXBfbm9kZV9yZWYgKCBrbXBfZGVwbm9kZV90ICpub2RlICkKK3sKKyAgICBLTVBfVEVTVF9USEVOX0lOQzMyKCZub2RlLT5kbi5ucmVmcyk7CisgICAgcmV0dXJuIG5vZGU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19rbXBfbm9kZV9kZXJlZiAoIGttcF9pbmZvX3QgKnRocmVhZCwga21wX2RlcG5vZGVfdCAqbm9kZSApCit7CisgICAgaWYgKCFub2RlKSByZXR1cm47CisKKyAgICBrbXBfaW50MzIgbiA9IEtNUF9URVNUX1RIRU5fREVDMzIoJm5vZGUtPmRuLm5yZWZzKSAtIDE7CisgICAgaWYgKCBuID09IDAgKSB7CisgICAgICAgIEtNUF9BU1NFUlQobm9kZS0+ZG4ubnJlZnMgPT0gMCk7CisjaWYgVVNFX0ZBU1RfTUVNT1JZCisgICAgICAgIF9fa21wX2Zhc3RfZnJlZSh0aHJlYWQsbm9kZSk7CisjZWxzZQorICAgICAgICBfX2ttcF90aHJlYWRfZnJlZSh0aHJlYWQsbm9kZSk7CisjZW5kaWYKKyAgICB9Cit9CisKKyNkZWZpbmUgS01QX0FDUVVJUkVfREVQTk9ERShndGlkLG4pIF9fa21wX2FjcXVpcmVfbG9jaygmKG4pLT5kbi5sb2NrLChndGlkKSkKKyNkZWZpbmUgS01QX1JFTEVBU0VfREVQTk9ERShndGlkLG4pIF9fa21wX3JlbGVhc2VfbG9jaygmKG4pLT5kbi5sb2NrLChndGlkKSkKKworc3RhdGljIHZvaWQKK19fa21wX2RlcG5vZGVfbGlzdF9mcmVlICgga21wX2luZm9fdCAqdGhyZWFkLCBrbXBfZGVwbm9kZV9saXN0ICpsaXN0ICk7CisKK3N0YXRpYyBjb25zdCBrbXBfaW50MzIga21wX2RlcGhhc2hfbG9nMiA9IDY7CitzdGF0aWMgY29uc3Qga21wX2ludDMyIGttcF9kZXBoYXNoX3NpemUgPSAoMSA8PCBrbXBfZGVwaGFzaF9sb2cyKTsKKworc3RhdGljIGlubGluZSBrbXBfaW50MzIKK19fa21wX2RlcGhhc2hfaGFzaCAoIGttcF9pbnRwdHJfdCBhZGRyICkKK3sKKyAgICAvL1RPRE8gYWx0ZXJuYXRlIHRvIHRyeTogc2V0ID0gKCgoQWRkcjY0KShhZGRyVXNlZnVsQml0cyAqIDkuNjE4KSkgJSBtX251bV9zZXRzICk7CisgICAgcmV0dXJuICgoYWRkciA+PiBrbXBfZGVwaGFzaF9sb2cyKSBeIGFkZHIpICUga21wX2RlcGhhc2hfc2l6ZTsKK30KKworc3RhdGljIGttcF9kZXBoYXNoX3QgKgorX19rbXBfZGVwaGFzaF9jcmVhdGUgKCBrbXBfaW5mb190ICp0aHJlYWQgKQoreworICAgIGttcF9kZXBoYXNoX3QgKmg7CisKKyAgICBrbXBfaW50MzIgc2l6ZSA9IGttcF9kZXBoYXNoX3NpemUgKiBzaXplb2Yoa21wX2RlcGhhc2hfZW50cnlfdCkgKyBzaXplb2Yoa21wX2RlcGhhc2hfdCk7CisKKyNpZiBVU0VfRkFTVF9NRU1PUlkKKyAgICBoID0gKGttcF9kZXBoYXNoX3QgKikgX19rbXBfZmFzdF9hbGxvY2F0ZSggdGhyZWFkLCBzaXplICk7CisjZWxzZQorICAgIGggPSAoa21wX2RlcGhhc2hfdCAqKSBfX2ttcF90aHJlYWRfbWFsbG9jKCB0aHJlYWQsIHNpemUgKTsKKyNlbmRpZgorCisjaWZkZWYgS01QX0RFQlVHCisgICAgaC0+bmVsZW1lbnRzID0gMDsKKyNlbmRpZgorICAgIGgtPmJ1Y2tldHMgPSAoa21wX2RlcGhhc2hfZW50cnkgKiopKGgrMSk7CisKKyAgICBmb3IgKCBrbXBfaW50MzIgaSA9IDA7IGkgPCBrbXBfZGVwaGFzaF9zaXplOyBpKysgKQorICAgICAgICBoLT5idWNrZXRzW2ldID0gMDsKKworICAgIHJldHVybiBoOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfZGVwaGFzaF9mcmVlICgga21wX2luZm9fdCAqdGhyZWFkLCBrbXBfZGVwaGFzaF90ICpoICkKK3sKKyAgICBmb3IgKCBrbXBfaW50MzIgaT0wOyBpIDwga21wX2RlcGhhc2hfc2l6ZTsgaSsrICkgeworICAgICAgICBpZiAoIGgtPmJ1Y2tldHNbaV0gKSB7CisgICAgICAgICAgICBrbXBfZGVwaGFzaF9lbnRyeV90ICpuZXh0OworICAgICAgICAgICAgZm9yICgga21wX2RlcGhhc2hfZW50cnlfdCAqZW50cnkgPSBoLT5idWNrZXRzW2ldOyBlbnRyeTsgZW50cnkgPSBuZXh0ICkgeworICAgICAgICAgICAgICAgIG5leHQgPSBlbnRyeS0+bmV4dF9pbl9idWNrZXQ7CisgICAgICAgICAgICAgICAgX19rbXBfZGVwbm9kZV9saXN0X2ZyZWUodGhyZWFkLGVudHJ5LT5sYXN0X2lucyk7CisgICAgICAgICAgICAgICAgX19rbXBfbm9kZV9kZXJlZih0aHJlYWQsZW50cnktPmxhc3Rfb3V0KTsKKyNpZiBVU0VfRkFTVF9NRU1PUlkKKyAgICAgICAgICAgICAgICBfX2ttcF9mYXN0X2ZyZWUodGhyZWFkLGVudHJ5KTsKKyNlbHNlCisgICAgICAgICAgICAgICAgX19rbXBfdGhyZWFkX2ZyZWUodGhyZWFkLGVudHJ5KTsKKyNlbmRpZgorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorI2lmIFVTRV9GQVNUX01FTU9SWQorICAgIF9fa21wX2Zhc3RfZnJlZSh0aHJlYWQsaCk7CisjZWxzZQorICAgIF9fa21wX3RocmVhZF9mcmVlKHRocmVhZCxoKTsKKyNlbmRpZgorfQorCitzdGF0aWMga21wX2RlcGhhc2hfZW50cnkgKgorX19rbXBfZGVwaGFzaF9maW5kICgga21wX2luZm9fdCAqdGhyZWFkLCBrbXBfZGVwaGFzaF90ICpoLCBrbXBfaW50cHRyX3QgYWRkciApCit7CisgICAga21wX2ludDMyIGJ1Y2tldCA9IF9fa21wX2RlcGhhc2hfaGFzaChhZGRyKTsKKworICAgIGttcF9kZXBoYXNoX2VudHJ5X3QgKmVudHJ5OworICAgIGZvciAoIGVudHJ5ID0gaC0+YnVja2V0c1tidWNrZXRdOyBlbnRyeTsgZW50cnkgPSBlbnRyeS0+bmV4dF9pbl9idWNrZXQgKQorICAgICAgICBpZiAoIGVudHJ5LT5hZGRyID09IGFkZHIgKSBicmVhazsKKworICAgIGlmICggZW50cnkgPT0gTlVMTCApIHsKKyAgICAgICAgLy8gY3JlYXRlIGVudHJ5LiBUaGlzIGlzIG9ubHkgZG9uZSBieSBvbmUgdGhyZWFkIHNvIG5vIGxvY2tpbmcgcmVxdWlyZWQKKyNpZiBVU0VfRkFTVF9NRU1PUlkKKyAgICAgICAgZW50cnkgPSAoa21wX2RlcGhhc2hfZW50cnlfdCAqKSBfX2ttcF9mYXN0X2FsbG9jYXRlKCB0aHJlYWQsIHNpemVvZihrbXBfZGVwaGFzaF9lbnRyeV90KSApOworI2Vsc2UKKyAgICAgICAgZW50cnkgPSAoa21wX2RlcGhhc2hfZW50cnlfdCAqKSBfX2ttcF90aHJlYWRfbWFsbG9jKCB0aHJlYWQsIHNpemVvZihrbXBfZGVwaGFzaF9lbnRyeV90KSApOworI2VuZGlmCisgICAgICAgIGVudHJ5LT5hZGRyID0gYWRkcjsKKyAgICAgICAgZW50cnktPmxhc3Rfb3V0ID0gTlVMTDsKKyAgICAgICAgZW50cnktPmxhc3RfaW5zID0gTlVMTDsKKyAgICAgICAgZW50cnktPm5leHRfaW5fYnVja2V0ID0gaC0+YnVja2V0c1tidWNrZXRdOworICAgICAgICBoLT5idWNrZXRzW2J1Y2tldF0gPSBlbnRyeTsKKyNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgaC0+bmVsZW1lbnRzKys7CisgICAgICAgIGlmICggZW50cnktPm5leHRfaW5fYnVja2V0ICkgaC0+bmNvbmZsaWN0cysrOworI2VuZGlmCisgICAgfQorICAgIHJldHVybiBlbnRyeTsKK30KKworc3RhdGljIGttcF9kZXBub2RlX2xpc3RfdCAqCitfX2ttcF9hZGRfbm9kZSAoIGttcF9pbmZvX3QgKnRocmVhZCwga21wX2RlcG5vZGVfbGlzdF90ICpsaXN0LCBrbXBfZGVwbm9kZV90ICpub2RlICkKK3sKKyAgICBrbXBfZGVwbm9kZV9saXN0X3QgKm5ld19oZWFkOworCisjaWYgVVNFX0ZBU1RfTUVNT1JZCisgICAgbmV3X2hlYWQgPSAoa21wX2RlcG5vZGVfbGlzdF90ICopIF9fa21wX2Zhc3RfYWxsb2NhdGUodGhyZWFkLHNpemVvZihrbXBfZGVwbm9kZV9saXN0X3QpKTsKKyNlbHNlCisgICAgbmV3X2hlYWQgPSAoa21wX2RlcG5vZGVfbGlzdF90ICopIF9fa21wX3RocmVhZF9tYWxsb2ModGhyZWFkLHNpemVvZihrbXBfZGVwbm9kZV9saXN0X3QpKTsKKyNlbmRpZgorCisgICAgbmV3X2hlYWQtPm5vZGUgPSBfX2ttcF9ub2RlX3JlZihub2RlKTsKKyAgICBuZXdfaGVhZC0+bmV4dCA9IGxpc3Q7CisKKyAgICByZXR1cm4gbmV3X2hlYWQ7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9kZXBub2RlX2xpc3RfZnJlZSAoIGttcF9pbmZvX3QgKnRocmVhZCwga21wX2RlcG5vZGVfbGlzdCAqbGlzdCApCit7CisgICAga21wX2RlcG5vZGVfbGlzdCAqbmV4dDsKKworICAgIGZvciAoIDsgbGlzdCA7IGxpc3QgPSBuZXh0ICkgeworICAgICAgICBuZXh0ID0gbGlzdC0+bmV4dDsKKworICAgICAgICBfX2ttcF9ub2RlX2RlcmVmKHRocmVhZCxsaXN0LT5ub2RlKTsKKyNpZiBVU0VfRkFTVF9NRU1PUlkKKyAgICAgICAgX19rbXBfZmFzdF9mcmVlKHRocmVhZCxsaXN0KTsKKyNlbHNlCisgICAgICAgIF9fa21wX3RocmVhZF9mcmVlKHRocmVhZCxsaXN0KTsKKyNlbmRpZgorICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkCitfX2ttcF90cmFja19kZXBlbmRlbmNlICgga21wX2RlcG5vZGVfdCAqc291cmNlLCBrbXBfZGVwbm9kZV90ICpzaW5rICkKK3sKKyNpZmRlZiBLTVBfU1VQUE9SVF9HUkFQSF9PVVRQVVQKKyAgICBrbXBfdGFza2RhdGFfdCAqIHRhc2tfc291cmNlID0gS01QX1RBU0tfVE9fVEFTS0RBVEEoc291cmNlLT5kbi50YXNrKTsKKyAgICBrbXBfdGFza2RhdGFfdCAqIHRhc2tfc2luayA9IEtNUF9UQVNLX1RPX1RBU0tEQVRBKHNpbmstPmRuLnRhc2spOyAgICAvLyB0aGlzIGNhbiBiZSBOVUxMIHdoZW4gaWYoMCkgLi4uCisKKyAgICBfX2ttcF9wcmludGYoIiVkKCVzKSAtPiAlZCglcylcbiIsIHNvdXJjZS0+ZG4uaWQsIHRhc2tfc291cmNlLT50ZF9pZGVudC0+cHNvdXJjZSwgc2luay0+ZG4uaWQsIHRhc2tfc2luay0+dGRfaWRlbnQtPnBzb3VyY2UpOworI2VuZGlmCit9CisKK3RlbXBsYXRlPCBib29sIGZpbHRlciA+CitzdGF0aWMgaW5saW5lIGttcF9pbnQzMgorX19rbXBfcHJvY2Vzc19kZXBzICgga21wX2ludDMyIGd0aWQsIGttcF9kZXBub2RlX3QgKm5vZGUsIGttcF9kZXBoYXNoX3QgKmhhc2gsCisgICAgICAgICAgICAgICAgICAgICBib29sIGRlcF9iYXJyaWVyLGttcF9pbnQzMiBuZGVwcywga21wX2RlcGVuZF9pbmZvX3QgKmRlcF9saXN0KQoreworICAgIEtBX1RSQUNFKDMwLCAoIl9fa21wX3Byb2Nlc3NfZGVwczwlZD46IFQjJWQgcHJvY2Vzc2luZyAlZCBkZXBlbmNpZXMgOiBkZXBfYmFycmllciA9ICVkXG4iLCBmaWx0ZXIsIGd0aWQsIG5kZXBzLCBkZXBfYmFycmllciApICk7CisgICAgCisgICAga21wX2luZm9fdCAqdGhyZWFkID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworICAgIGttcF9pbnQzMiBucHJlZGVjZXNzb3JzPTA7CisgICAgZm9yICgga21wX2ludDMyIGkgPSAwOyBpIDwgbmRlcHMgOyBpKysgKSB7CisgICAgICAgIGNvbnN0IGttcF9kZXBlbmRfaW5mb190ICogZGVwID0gJmRlcF9saXN0W2ldOworCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoZGVwLT5mbGFncy5pbik7CisKKyAgICAgICAgaWYgKCBmaWx0ZXIgJiYgZGVwLT5iYXNlX2FkZHIgPT0gMCApIGNvbnRpbnVlOyAvLyBza2lwIGZpbHRlcmVkIGVudHJpZXMKKworICAgICAgICBrbXBfZGVwaGFzaF9lbnRyeV90ICppbmZvID0gX19rbXBfZGVwaGFzaF9maW5kKHRocmVhZCxoYXNoLGRlcC0+YmFzZV9hZGRyKTsKKyAgICAgICAga21wX2RlcG5vZGVfdCAqbGFzdF9vdXQgPSBpbmZvLT5sYXN0X291dDsKKworICAgICAgICBpZiAoIGRlcC0+ZmxhZ3Mub3V0ICYmIGluZm8tPmxhc3RfaW5zICkgeworICAgICAgICAgICAgZm9yICgga21wX2RlcG5vZGVfbGlzdF90ICogcCA9IGluZm8tPmxhc3RfaW5zOyBwOyBwID0gcC0+bmV4dCApIHsKKyAgICAgICAgICAgICAgICBrbXBfZGVwbm9kZV90ICogaW5kZXAgPSBwLT5ub2RlOworICAgICAgICAgICAgICAgIGlmICggaW5kZXAtPmRuLnRhc2sgKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9BQ1FVSVJFX0RFUE5PREUoZ3RpZCxpbmRlcCk7CisgICAgICAgICAgICAgICAgICAgIGlmICggaW5kZXAtPmRuLnRhc2sgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF90cmFja19kZXBlbmRlbmNlKGluZGVwLG5vZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXAtPmRuLnN1Y2Nlc3NvcnMgPSBfX2ttcF9hZGRfbm9kZSh0aHJlYWQsIGluZGVwLT5kbi5zdWNjZXNzb3JzLCBub2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtBX1RSQUNFKDQwLCgiX19rbXBfcHJvY2Vzc19kZXBzPCVkPjogVCMlZCBhZGRpbmcgZGVwZW5kZW5jZSBmcm9tICVwIHRvICVwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcixndGlkLCBLTVBfVEFTS19UT19UQVNLREFUQShpbmRlcC0+ZG4udGFzayksIEtNUF9UQVNLX1RPX1RBU0tEQVRBKG5vZGUtPmRuLnRhc2spKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBucHJlZGVjZXNzb3JzKys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgS01QX1JFTEVBU0VfREVQTk9ERShndGlkLGluZGVwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIF9fa21wX2RlcG5vZGVfbGlzdF9mcmVlKHRocmVhZCxpbmZvLT5sYXN0X2lucyk7CisgICAgICAgICAgICBpbmZvLT5sYXN0X2lucyA9IE5VTEw7CisKKyAgICAgICAgfSBlbHNlIGlmICggbGFzdF9vdXQgJiYgbGFzdF9vdXQtPmRuLnRhc2sgKSB7CisgICAgICAgICAgICBLTVBfQUNRVUlSRV9ERVBOT0RFKGd0aWQsbGFzdF9vdXQpOworICAgICAgICAgICAgaWYgKCBsYXN0X291dC0+ZG4udGFzayApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF90cmFja19kZXBlbmRlbmNlKGxhc3Rfb3V0LG5vZGUpOworICAgICAgICAgICAgICAgIGxhc3Rfb3V0LT5kbi5zdWNjZXNzb3JzID0gX19rbXBfYWRkX25vZGUodGhyZWFkLCBsYXN0X291dC0+ZG4uc3VjY2Vzc29ycywgbm9kZSk7CisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoNDAsKCJfX2ttcF9wcm9jZXNzX2RlcHM8JWQ+OiBUIyVkIGFkZGluZyBkZXBlbmRlbmNlIGZyb20gJXAgdG8gJXAiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyLGd0aWQsIEtNUF9UQVNLX1RPX1RBU0tEQVRBKGxhc3Rfb3V0LT5kbi50YXNrKSwgS01QX1RBU0tfVE9fVEFTS0RBVEEobm9kZS0+ZG4udGFzaykpKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBucHJlZGVjZXNzb3JzKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBLTVBfUkVMRUFTRV9ERVBOT0RFKGd0aWQsbGFzdF9vdXQpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCBkZXBfYmFycmllciApIHsKKyAgICAgICAgICAgIC8vIGlmIHRoaXMgaXMgYSBzeW5jIHBvaW50IGluIHRoZSBzZXJpYWwgc2VxdWVuY2UsIHRoZW4gdGhlIHByZXZpb3VzIG91dHB1dHMgYXJlIGd1YXJhbnRlZWQgdG8gYmUgY29tcGxldGVkIGFmdGVyCisgICAgICAgICAgICAvLyB0aGUgZXhlY3V0aW9uIG9mIHRoaXMgdGFzayBzbyB0aGUgcHJldmlvdXMgb3V0cHV0IG5vZGVzIGNhbiBiZSBjbGVhcmVkLgorICAgICAgICAgICAgX19rbXBfbm9kZV9kZXJlZih0aHJlYWQsbGFzdF9vdXQpOworICAgICAgICAgICAgaW5mby0+bGFzdF9vdXQgPSBOVUxMOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCBkZXAtPmZsYWdzLm91dCApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9ub2RlX2RlcmVmKHRocmVhZCxsYXN0X291dCk7CisgICAgICAgICAgICAgICAgaW5mby0+bGFzdF9vdXQgPSBfX2ttcF9ub2RlX3JlZihub2RlKTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIGluZm8tPmxhc3RfaW5zID0gX19rbXBfYWRkX25vZGUodGhyZWFkLCBpbmZvLT5sYXN0X2lucywgbm9kZSk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIEtBX1RSQUNFKDMwLCAoIl9fa21wX3Byb2Nlc3NfZGVwczwlZD46IFQjJWQgZm91bmQgJWQgcHJlZGVjZXNzb3JzXG4iLCBmaWx0ZXIsIGd0aWQsIG5wcmVkZWNlc3NvcnMgKSApOworCisgICAgcmV0dXJuIG5wcmVkZWNlc3NvcnM7Cit9CisKKyNkZWZpbmUgTk9fREVQX0JBUlJJRVIgKGZhbHNlKQorI2RlZmluZSBERVBfQkFSUklFUiAodHJ1ZSkKKworLy8gcmV0dXJucyB0cnVlIGlmIHRoZSB0YXNrIGhhcyBhbnkgb3V0c3RhbmRpbmcgZGVwZW5kZW5jZQorc3RhdGljIGJvb2wKK19fa21wX2NoZWNrX2RlcHMgKCBrbXBfaW50MzIgZ3RpZCwga21wX2RlcG5vZGVfdCAqbm9kZSwga21wX3Rhc2tfdCAqdGFzaywga21wX2RlcGhhc2hfdCAqaGFzaCwgYm9vbCBkZXBfYmFycmllciwKKyAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgbmRlcHMsIGttcF9kZXBlbmRfaW5mb190ICpkZXBfbGlzdCwKKyAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgbmRlcHNfbm9hbGlhcywga21wX2RlcGVuZF9pbmZvX3QgKm5vYWxpYXNfZGVwX2xpc3QgKQoreworICAgIGludCBpOworCisgICAga21wX3Rhc2tkYXRhX3QgKiB0YXNrZGF0YSA9IEtNUF9UQVNLX1RPX1RBU0tEQVRBKHRhc2spOworICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2NoZWNrX2RlcHM6IFQjJWQgY2hlY2tpbmcgZGVwZW5kZW5jaWVzIGZvciB0YXNrICVwIDogJWQgcG9zc2libHkgYWxpYXNlZCBkZXBlbmRlbmNpZXMsICVkIG5vbi1hbGlhc2VkIGRlcGVkZW5jaWVzIDogZGVwX2JhcnJpZXI9JWQgLlxuIiwgZ3RpZCwgdGFza2RhdGEsIG5kZXBzLCBuZGVwc19ub2FsaWFzLCBkZXBfYmFycmllciApICk7CisKKyAgICAvLyBGaWx0ZXIgZGVwcyBpbiBkZXBfbGlzdAorICAgIC8vIFRPRE86IERpZmZlcmVudCBhbGdvcml0aG0gZm9yIGxhcmdlIGRlcF9saXN0ICggPiAxMCA/ICkKKyAgICBmb3IgKCBpID0gMDsgaSA8IG5kZXBzOyBpICsrICkgeworICAgICAgICBpZiAoIGRlcF9saXN0W2ldLmJhc2VfYWRkciAhPSAwICkKKyAgICAgICAgICAgIGZvciAoIGludCBqID0gaSsxOyBqIDwgbmRlcHM7IGorKyApCisgICAgICAgICAgICAgICAgaWYgKCBkZXBfbGlzdFtpXS5iYXNlX2FkZHIgPT0gZGVwX2xpc3Rbal0uYmFzZV9hZGRyICkgeworICAgICAgICAgICAgICAgICAgICBkZXBfbGlzdFtpXS5mbGFncy5pbiB8PSBkZXBfbGlzdFtqXS5mbGFncy5pbjsKKyAgICAgICAgICAgICAgICAgICAgZGVwX2xpc3RbaV0uZmxhZ3Mub3V0IHw9IGRlcF9saXN0W2pdLmZsYWdzLm91dDsKKyAgICAgICAgICAgICAgICAgICAgZGVwX2xpc3Rbal0uYmFzZV9hZGRyID0gMDsgLy8gTWFyayBqIGVsZW1lbnQgYXMgdm9pZAorICAgICAgICAgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBkb2Vzbid0IG5lZWQgdG8gYmUgYXRvbWljIGFzIG5vIG90aGVyIHRocmVhZCBpcyBnb2luZyB0byBiZSBhY2Nlc3NpbmcgdGhpcyBub2RlIGp1c3QgeWV0CisgICAgLy8gbnByZWRlY2Vzc29ycyBpcyBzZXQgLTEgdG8gZW5zdXJlIHRoYXQgbm9uZSBvZiB0aGUgcmVsZWFzaW5nIHRhc2tzIHF1ZXVlcyB0aGlzIHRhc2sgYmVmb3JlIHdlIGhhdmUgZmluaXNoZWQgcHJvY2Vzc2luZyBhbGwgdGhlIGRlcGVuZGVuY2llcworICAgIG5vZGUtPmRuLm5wcmVkZWNlc3NvcnMgPSAtMTsKKworICAgIC8vIHVzZWQgdG8gcGFjayBhbGwgbnByZWRlY2Vzc29ycyBhZGRpdGlvbnMgaW50byBhIHNpbmdsZSBhdG9taWMgb3BlcmF0aW9uIGF0IHRoZSBlbmQKKyAgICBpbnQgbnByZWRlY2Vzc29yczsKKworICAgIG5wcmVkZWNlc3NvcnMgPSBfX2ttcF9wcm9jZXNzX2RlcHM8dHJ1ZT4oZ3RpZCwgbm9kZSwgaGFzaCwgZGVwX2JhcnJpZXIsIG5kZXBzLCBkZXBfbGlzdCk7CisgICAgbnByZWRlY2Vzc29ycyArPSBfX2ttcF9wcm9jZXNzX2RlcHM8ZmFsc2U+KGd0aWQsIG5vZGUsIGhhc2gsIGRlcF9iYXJyaWVyLCBuZGVwc19ub2FsaWFzLCBub2FsaWFzX2RlcF9saXN0KTsKKworICAgIG5vZGUtPmRuLnRhc2sgPSB0YXNrOworICAgIEtNUF9NQigpOworCisgICAgLy8gQWNjb3VudCBmb3Igb3VyIGluaXRpYWwgZmFrZSB2YWx1ZQorICAgIG5wcmVkZWNlc3NvcnMrKzsKKworICAgIC8vIFVwZGF0ZSBwcmVkZWNlc3NvcnMgYW5kIG9idGFpbiBjdXJyZW50IHZhbHVlIHRvIGNoZWNrIGlmIHRoZXJlIGFyZSBzdGlsbCBhbnkgb3V0c3RhbmRpZyBkZXBlbmRlbmNlcyAoc29tZSB0YXNrcyBtYXkgaGF2ZSBmaW5pc2hlZCB3aGlsZSB3ZSBwcm9jZXNzZWQgdGhlIGRlcGVuZGVuY2VzKQorICAgIG5wcmVkZWNlc3NvcnMgPSBLTVBfVEVTVF9USEVOX0FERDMyKCZub2RlLT5kbi5ucHJlZGVjZXNzb3JzLCBucHJlZGVjZXNzb3JzKSArIG5wcmVkZWNlc3NvcnM7CisKKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9jaGVja19kZXBzOiBUIyVkIGZvdW5kICVkIHByZWRlY2Vzc29ycyBmb3IgdGFzayAlcCBcbiIsIGd0aWQsIG5wcmVkZWNlc3NvcnMsIHRhc2tkYXRhICkgKTsKKworICAgIC8vIGJleW9uZCB0aGlzIHBvaW50IHRoZSB0YXNrIGNvdWxkIGJlIHF1ZXVlZCAoYW5kIGV4ZWN1dGVkKSBieSBhIHJlbGVhc2luZyB0YXNrLi4uCisgICAgcmV0dXJuIG5wcmVkZWNlc3NvcnMgPiAwID8gdHJ1ZSA6IGZhbHNlOworfQorCit2b2lkCitfX2ttcF9yZWxlYXNlX2RlcHMgKCBrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tkYXRhX3QgKnRhc2sgKQoreworICAgIGttcF9pbmZvX3QgKnRocmVhZCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKyAgICBrbXBfZGVwbm9kZV90ICpub2RlID0gdGFzay0+dGRfZGVwbm9kZTsKKworICAgIGlmICggdGFzay0+dGRfZGVwaGFzaCApIHsKKyAgICAgICAgS0FfVFJBQ0UoNDAsICgiX19rbXBfcmVhbGVhc2VfZGVwczogVCMlZCBmcmVlaW5nIGRlcGVuZGVuY2llcyBoYXNoIG9mIHRhc2sgJXAuXG4iLCBndGlkLCB0YXNrICkgKTsKKyAgICAgICAgX19rbXBfZGVwaGFzaF9mcmVlKHRocmVhZCx0YXNrLT50ZF9kZXBoYXNoKTsKKyAgICB9CisKKyAgICBpZiAoICFub2RlICkgcmV0dXJuOworCisgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfcmVhbGVhc2VfZGVwczogVCMlZCBub3RpZnlpbmcgc3VjY2Vzb3JzIG9mIHRhc2sgJXAuXG4iLCBndGlkLCB0YXNrICkgKTsKKyAgICAKKyAgICBLTVBfQUNRVUlSRV9ERVBOT0RFKGd0aWQsbm9kZSk7CisgICAgbm9kZS0+ZG4udGFzayA9IE5VTEw7IC8vIG1hcmsgdGhpcyB0YXNrIGFzIGZpbmlzaGVkLCBzbyBubyBuZXcgZGVwZW5kZW5jaWVzIGFyZSBnZW5lcmF0ZWQKKyAgICBLTVBfUkVMRUFTRV9ERVBOT0RFKGd0aWQsbm9kZSk7CisKKyAgICBrbXBfZGVwbm9kZV9saXN0X3QgKm5leHQ7CisgICAgZm9yICgga21wX2RlcG5vZGVfbGlzdF90ICpwID0gbm9kZS0+ZG4uc3VjY2Vzc29yczsgcDsgcCA9IG5leHQgKSB7CisgICAgICAgIGttcF9kZXBub2RlX3QgKnN1Y2Nlc3NvciA9IHAtPm5vZGU7CisgICAgICAgIGttcF9pbnQzMiBucHJlZGVjZXNzb3JzID0gS01QX1RFU1RfVEhFTl9ERUMzMigmc3VjY2Vzc29yLT5kbi5ucHJlZGVjZXNzb3JzKSAtIDE7CisKKyAgICAgICAgLy8gc3VjY2Vzc29yIHRhc2sgY2FuIGJlIE5VTEwgZm9yIHdhaXRfZGVwZW5kcyBvciBiZWNhdXNlIGRlcHMgYXJlIHN0aWxsIGJlaW5nIHByb2Nlc3NlZAorICAgICAgICBpZiAoIG5wcmVkZWNlc3NvcnMgPT0gMCApIHsKKyAgICAgICAgICAgIEtNUF9NQigpOworICAgICAgICAgICAgaWYgKCBzdWNjZXNzb3ItPmRuLnRhc2sgKSB7ICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfcmVhbGVhc2VfZGVwczogVCMlZCBzdWNjZXNzb3IgJXAgb2YgJXAgc2NoZWR1bGVkIGZvciBleGVjdXRpb24uXG4iLCBndGlkLCBzdWNjZXNzb3ItPmRuLnRhc2ssIHRhc2sgKSApOworICAgICAgICAgICAgICAgIF9fa21wX29tcF90YXNrKGd0aWQsc3VjY2Vzc29yLT5kbi50YXNrLGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG5leHQgPSBwLT5uZXh0OworICAgICAgICBfX2ttcF9ub2RlX2RlcmVmKHRocmVhZCxwLT5ub2RlKTsKKyNpZiBVU0VfRkFTVF9NRU1PUlkKKyAgICAgICAgX19rbXBfZmFzdF9mcmVlKHRocmVhZCxwKTsKKyNlbHNlCisgICAgICAgIF9fa21wX3RocmVhZF9mcmVlKHRocmVhZCxwKTsKKyNlbmRpZgorICAgIH0KKworICAgIF9fa21wX25vZGVfZGVyZWYodGhyZWFkLG5vZGUpOworCisgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfcmVhbGVhc2VfZGVwczogVCMlZCBhbGwgc3VjY2Vzc29ycyBvZiAlcCBub3RpZmllZCBvZiBjb21wbGV0YXRpb25cbiIsIGd0aWQsIHRhc2sgKSApOworfQorCisvKiEKK0Bpbmdyb3VwIFRBU0tJTkcKK0BwYXJhbSBsb2NfcmVmIGxvY2F0aW9uIG9mIHRoZSBvcmlnaW5hbCB0YXNrIGRpcmVjdGl2ZQorQHBhcmFtIGd0aWQgR2xvYmFsIFRocmVhZCBJRCBvZiBlbmNvdW50ZXJpbmcgdGhyZWFkCitAcGFyYW0gbmV3X3Rhc2sgdGFzayB0aHVuayBhbGxvY2F0ZWQgYnkgX19rbXBfb21wX3Rhc2tfYWxsb2MoKSBmb3IgdGhlICcnbmV3IHRhc2snJworQHBhcmFtIG5kZXBzIE51bWJlciBvZiBkZXBlbmQgaXRlbXMgd2l0aCBwb3NzaWJsZSBhbGlhc2luZworQHBhcmFtIGRlcF9saXN0IExpc3Qgb2YgZGVwZW5kIGl0ZW1zIHdpdGggcG9zc2libGUgYWxpYXNpbmcKK0BwYXJhbSBuZGVwc19ub2FsaWFzIE51bWJlciBvZiBkZXBlbmQgaXRlbXMgd2l0aCBubyBhbGlhc2luZworQHBhcmFtIG5vYWxpYXNfZGVwX2xpc3QgTGlzdCBvZiBkZXBlbmQgaXRlbXMgd2l0aCBubyBhbGlhc2luZworCitAcmV0dXJuIFJldHVybnMgZWl0aGVyIFRBU0tfQ1VSUkVOVF9OT1RfUVVFVUVEIGlmIHRoZSBjdXJyZW50IHRhc2sgd2FzIG5vdCBzdXNwZW5kZW5kIGFuZCBxdWV1ZWQsIG9yIFRBU0tfQ1VSUkVOVF9RVUVVRUQgaWYgaXQgd2FzIHN1c3BlbmRlZCBhbmQgcXVldWVkCisKK1NjaGVkdWxlIGEgbm9uLXRocmVhZC1zd2l0Y2hhYmxlIHRhc2sgd2l0aCBkZXBlbmRlbmNlcyBmb3IgZXhlY3V0aW9uCisqLwora21wX2ludDMyCitfX2ttcGNfb21wX3Rhc2tfd2l0aF9kZXBzKCBpZGVudF90ICpsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tfdCAqIG5ld190YXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBuZGVwcywga21wX2RlcGVuZF9pbmZvX3QgKmRlcF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBuZGVwc19ub2FsaWFzLCBrbXBfZGVwZW5kX2luZm9fdCAqbm9hbGlhc19kZXBfbGlzdCApCit7CisKKyAgICBrbXBfdGFza2RhdGFfdCAqIG5ld190YXNrZGF0YSA9IEtNUF9UQVNLX1RPX1RBU0tEQVRBKG5ld190YXNrKTsKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcGNfb21wX3Rhc2tfd2l0aF9kZXBzKGVudGVyKTogVCMlZCBsb2M9JXAgdGFzaz0lcFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIGxvY19yZWYsIG5ld190YXNrZGF0YSApICk7CisKKyAgICBrbXBfaW5mb190ICp0aHJlYWQgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisgICAga21wX3Rhc2tkYXRhX3QgKiBjdXJyZW50X3Rhc2sgPSB0aHJlYWQtPnRoLnRoX2N1cnJlbnRfdGFzazsKKworICAgIGJvb2wgc2VyaWFsID0gY3VycmVudF90YXNrLT50ZF9mbGFncy50ZWFtX3NlcmlhbCB8fCBjdXJyZW50X3Rhc2stPnRkX2ZsYWdzLnRhc2tpbmdfc2VyIHx8IGN1cnJlbnRfdGFzay0+dGRfZmxhZ3MuZmluYWw7CisKKyAgICBpZiAoICFzZXJpYWwgJiYgKCBuZGVwcyA+IDAgfHwgbmRlcHNfbm9hbGlhcyA+IDAgKSkgeworICAgICAgICAvKiBpZiBubyBkZXBlbmRlbmNpZXMgaGF2ZSBiZWVuIHRyYWNrZWQgeWV0LCBjcmVhdGUgdGhlIGRlcGVuZGVuY2UgaGFzaCAqLworICAgICAgICBpZiAoIGN1cnJlbnRfdGFzay0+dGRfZGVwaGFzaCA9PSBOVUxMICkKKyAgICAgICAgICAgIGN1cnJlbnRfdGFzay0+dGRfZGVwaGFzaCA9IF9fa21wX2RlcGhhc2hfY3JlYXRlKHRocmVhZCk7CisKKyNpZiBVU0VfRkFTVF9NRU1PUlkKKyAgICAgICAga21wX2RlcG5vZGVfdCAqbm9kZSA9IChrbXBfZGVwbm9kZV90ICopIF9fa21wX2Zhc3RfYWxsb2NhdGUodGhyZWFkLHNpemVvZihrbXBfZGVwbm9kZV90KSk7CisjZWxzZQorICAgICAgICBrbXBfZGVwbm9kZV90ICpub2RlID0gKGttcF9kZXBub2RlX3QgKikgX19rbXBfdGhyZWFkX21hbGxvYyh0aHJlYWQsc2l6ZW9mKGttcF9kZXBub2RlX3QpKTsKKyNlbmRpZgorCisgICAgICAgIF9fa21wX2luaXRfbm9kZShub2RlKTsKKyAgICAgICAgbmV3X3Rhc2tkYXRhLT50ZF9kZXBub2RlID0gbm9kZTsKKworICAgICAgICBpZiAoIF9fa21wX2NoZWNrX2RlcHMoIGd0aWQsIG5vZGUsIG5ld190YXNrLCBjdXJyZW50X3Rhc2stPnRkX2RlcGhhc2gsIE5PX0RFUF9CQVJSSUVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5kZXBzLCBkZXBfbGlzdCwgbmRlcHNfbm9hbGlhcyxub2FsaWFzX2RlcF9saXN0ICkgKSB7CisgICAgICAgICAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcGNfb21wX3Rhc2tfd2l0aF9kZXBzKGV4aXQpOiBUIyVkIHRhc2sgaGFkIGJsb2NraW5nIGRlcGVuZGVuY2llczogIgorICAgICAgICAgICAgICAgICAgImxvYz0lcCB0YXNrPSVwLCByZXR1cm46IFRBU0tfQ1VSUkVOVF9OT1RfUVVFVUVEXG4iLCBndGlkLCBsb2NfcmVmLAorICAgICAgICAgICAgICAgICAgbmV3X3Rhc2tkYXRhICkgKTsKKyAgICAgICAgICAgIHJldHVybiBUQVNLX0NVUlJFTlRfTk9UX1FVRVVFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wY19vbXBfdGFza193aXRoX2RlcHMoZXhpdCk6IFQjJWQgdGFzayBoYWQgbm8gYmxvY2tpbmcgZGVwZW5kZW5jaWVzIDogIgorICAgICAgICAgICAgICAgICAgImxvYz0lcCB0YXNrPSVwLCB0cmFuc2ZlcnJpbmcgdG8gX19rbXBjX29tcF90YXNrXG4iLCBndGlkLCBsb2NfcmVmLAorICAgICAgICAgICAgICAgICAgbmV3X3Rhc2tkYXRhICkgKTsgICAgCisKKyAgICByZXR1cm4gX19rbXBjX29tcF90YXNrKGxvY19yZWYsZ3RpZCxuZXdfdGFzayk7Cit9CisKKy8qIQorQGluZ3JvdXAgVEFTS0lORworQHBhcmFtIGxvY19yZWYgbG9jYXRpb24gb2YgdGhlIG9yaWdpbmFsIHRhc2sgZGlyZWN0aXZlCitAcGFyYW0gZ3RpZCBHbG9iYWwgVGhyZWFkIElEIG9mIGVuY291bnRlcmluZyB0aHJlYWQKK0BwYXJhbSBuZGVwcyBOdW1iZXIgb2YgZGVwZW5kIGl0ZW1zIHdpdGggcG9zc2libGUgYWxpYXNpbmcKK0BwYXJhbSBkZXBfbGlzdCBMaXN0IG9mIGRlcGVuZCBpdGVtcyB3aXRoIHBvc3NpYmxlIGFsaWFzaW5nCitAcGFyYW0gbmRlcHNfbm9hbGlhcyBOdW1iZXIgb2YgZGVwZW5kIGl0ZW1zIHdpdGggbm8gYWxpYXNpbmcKK0BwYXJhbSBub2FsaWFzX2RlcF9saXN0IExpc3Qgb2YgZGVwZW5kIGl0ZW1zIHdpdGggbm8gYWxpYXNpbmcKKworQmxvY2tzIHRoZSBjdXJyZW50IHRhc2sgdW50aWwgYWxsIHNwZWNpZmllcyBkZXBlbmRlbmNpZXMgaGF2ZSBiZWVuIGZ1bGZpbGxlZC4KKyovCit2b2lkCitfX2ttcGNfb21wX3dhaXRfZGVwcyAoIGlkZW50X3QgKmxvY19yZWYsIGttcF9pbnQzMiBndGlkLCBrbXBfaW50MzIgbmRlcHMsIGttcF9kZXBlbmRfaW5mb190ICpkZXBfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIG5kZXBzX25vYWxpYXMsIGttcF9kZXBlbmRfaW5mb190ICpub2FsaWFzX2RlcF9saXN0ICkKK3sKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcGNfb21wX3dhaXRfZGVwcyhlbnRlcik6IFQjJWQgbG9jPSVwXG4iLCBndGlkLCBsb2NfcmVmKSApOworCisgICAgaWYgKCBuZGVwcyA9PSAwICYmIG5kZXBzX25vYWxpYXMgPT0gMCApIHsKKyAgICAgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX29tcF93YWl0X2RlcHMoZXhpdCk6IFQjJWQgaGFzIG5vIGRlcGVuZGVuY2llcyB0byB3YWl0IHVwb24gOiBsb2M9JXBcbiIsIGd0aWQsIGxvY19yZWYpICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBrbXBfaW5mb190ICp0aHJlYWQgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisgICAga21wX3Rhc2tkYXRhX3QgKiBjdXJyZW50X3Rhc2sgPSB0aHJlYWQtPnRoLnRoX2N1cnJlbnRfdGFzazsKKworICAgIC8vIFdlIGNhbiByZXR1cm4gaW1tZWRpYXRlbHkgYXM6CisgICAgLy8gICAtIGRlcGVuZGVuY2VzIGFyZSBub3QgY29tcHV0ZWQgaW4gc2VyaWFsIHRlYW1zCisgICAgLy8gICAtIGlmIHRoZSBkZXBoYXNoIGlzIG5vdCB5ZXQgY3JlYXRlZCBpdCBtZWFucyB3ZSBoYXZlIG5vdGhpbmcgdG8gd2FpdCBmb3IKKyAgICBpZiAoIGN1cnJlbnRfdGFzay0+dGRfZmxhZ3MudGVhbV9zZXJpYWwgfHwgY3VycmVudF90YXNrLT50ZF9mbGFncy50YXNraW5nX3NlciB8fCBjdXJyZW50X3Rhc2stPnRkX2ZsYWdzLmZpbmFsIHx8IGN1cnJlbnRfdGFzay0+dGRfZGVwaGFzaCA9PSBOVUxMICkgeworICAgICAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcGNfb21wX3dhaXRfZGVwcyhleGl0KTogVCMlZCBoYXMgbm8gYmxvY2tpbmcgZGVwZW5kZW5jaWVzIDogbG9jPSVwXG4iLCBndGlkLCBsb2NfcmVmKSApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAga21wX2RlcG5vZGVfdCBub2RlOworICAgIF9fa21wX2luaXRfbm9kZSgmbm9kZSk7CisKKyAgICBpZiAoIV9fa21wX2NoZWNrX2RlcHMoIGd0aWQsICZub2RlLCBOVUxMLCBjdXJyZW50X3Rhc2stPnRkX2RlcGhhc2gsIERFUF9CQVJSSUVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbmRlcHMsIGRlcF9saXN0LCBuZGVwc19ub2FsaWFzLCBub2FsaWFzX2RlcF9saXN0ICkpIHsKKyAgICAgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX29tcF93YWl0X2RlcHMoZXhpdCk6IFQjJWQgaGFzIG5vIGJsb2NraW5nIGRlcGVuZGVuY2llcyA6IGxvYz0lcFxuIiwgZ3RpZCwgbG9jX3JlZikgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludCB0aHJlYWRfZmluaXNoZWQgPSBGQUxTRTsKKyAgICBrbXBfZmxhZ18zMiBmbGFnKCh2b2xhdGlsZSBrbXBfdWludDMyICopJihub2RlLmRuLm5wcmVkZWNlc3NvcnMpLCAwVSk7CisgICAgd2hpbGUgKCBub2RlLmRuLm5wcmVkZWNlc3NvcnMgPiAwICkgeworICAgICAgICBmbGFnLmV4ZWN1dGVfdGFza3ModGhyZWFkLCBndGlkLCBGQUxTRSwgJnRocmVhZF9maW5pc2hlZCwKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF90YXNrX3N0ZWFsaW5nX2NvbnN0cmFpbnQgKTsKKyAgICB9CisKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcGNfb21wX3dhaXRfZGVwcyhleGl0KTogVCMlZCBmaW5pc2hlZCB3YWl0aW5nIDogbG9jPSVwXG4iLCBndGlkLCBsb2NfcmVmKSApOworfQorCisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX3Rhc2tpbmcuYyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF90YXNraW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRiMTU2NQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF90YXNraW5nLmMKQEAgLTAsMCArMSwyNDM5IEBACisvKgorICoga21wX3Rhc2tpbmcuYyAtLSBPcGVuTVAgMy4wIHRhc2tpbmcgc3VwcG9ydC4KKyAqICRSZXZpc2lvbjogNDMzODkgJAorICogJERhdGU6IDIwMTQtMDgtMTEgMTA6NTQ6MDEgLTA1MDAgKE1vbiwgMTEgQXVnIDIwMTQpICQKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgImttcC5oIgorI2luY2x1ZGUgImttcF9pMThuLmgiCisjaW5jbHVkZSAia21wX2l0dC5oIgorI2luY2x1ZGUgImttcF93YWl0X3JlbGVhc2UuaCIKKworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKworLyogZm9yd2FyZCBkZWNsYXJhdGlvbiAqLworc3RhdGljIHZvaWQgX19rbXBfZW5hYmxlX3Rhc2tpbmcoIGttcF90YXNrX3RlYW1fdCAqdGFza190ZWFtLCBrbXBfaW5mb190ICp0aGlzX3RociApOworc3RhdGljIHZvaWQgX19rbXBfYWxsb2NfdGFza19kZXF1ZSgga21wX2luZm9fdCAqdGhyZWFkLCBrbXBfdGhyZWFkX2RhdGFfdCAqdGhyZWFkX2RhdGEgKTsKK3N0YXRpYyBpbnQgIF9fa21wX3JlYWxsb2NfdGFza190aHJlYWRzX2RhdGEoIGttcF9pbmZvX3QgKnRocmVhZCwga21wX3Rhc2tfdGVhbV90ICp0YXNrX3RlYW0gKTsKKworc3RhdGljIGlubGluZSB2b2lkIF9fa21wX251bGxfcmVzdW1lX3dyYXBwZXIoaW50IGd0aWQsIHZvbGF0aWxlIHZvaWQgKmZsYWcpIHsKKyAgICBzd2l0Y2ggKCgoa21wX2ZsYWdfNjQgKilmbGFnKS0+Z2V0X3R5cGUoKSkgeworICAgIGNhc2UgZmxhZzMyOiBfX2ttcF9yZXN1bWVfMzIoZ3RpZCwgTlVMTCk7IGJyZWFrOworICAgIGNhc2UgZmxhZzY0OiBfX2ttcF9yZXN1bWVfNjQoZ3RpZCwgTlVMTCk7IGJyZWFrOworICAgIGNhc2UgZmxhZ19vbmNvcmU6IF9fa21wX3Jlc3VtZV9vbmNvcmUoZ3RpZCwgTlVMTCk7IGJyZWFrOworICAgIH0KK30KKworI2lmZGVmIEJVSUxEX1RJRURfVEFTS19TVEFDSworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIF9fa21wX3RyYWNlX3Rhc2tfc3RhY2s6IHByaW50IHRoZSB0aWVkIHRhc2tzIGZyb20gdGhlIHRhc2sgc3RhY2sgaW4gb3JkZXIKKy8vICAgICBmcm9tIHRvcCBkbyBib3R0b20KKy8vCisvLyAgZ3RpZDogZ2xvYmFsIHRocmVhZCBpZGVudGlmaWVyIGZvciB0aHJlYWQgY29udGFpbmluZyBzdGFjaworLy8gIHRocmVhZF9kYXRhOiB0aHJlYWQgZGF0YSBmb3IgdGFzayB0ZWFtIHRocmVhZCBjb250YWluaW5nIHN0YWNrCisvLyAgdGhyZXNob2xkOiB2YWx1ZSBhYm92ZSB3aGljaCB0aGUgdHJhY2Ugc3RhdGVtZW50IHRyaWdnZXJzCisvLyAgbG9jYXRpb246IHN0cmluZyBpZGVudGlmeWluZyBjYWxsIHNpdGUgb2YgdGhpcyBmdW5jdGlvbiAoZm9yIHRyYWNlKQorCitzdGF0aWMgdm9pZAorX19rbXBfdHJhY2VfdGFza19zdGFjaygga21wX2ludDMyIGd0aWQsIGttcF90aHJlYWRfZGF0YV90ICp0aHJlYWRfZGF0YSwgaW50IHRocmVzaG9sZCwgY2hhciAqbG9jYXRpb24gKQoreworICAgIGttcF90YXNrX3N0YWNrX3QgKnRhc2tfc3RhY2sgPSAmIHRocmVhZF9kYXRhLT50ZC50ZF9zdXNwX3RpZWRfdGFza3M7CisgICAga21wX3Rhc2tkYXRhX3QgKipzdGFja190b3AgPSB0YXNrX3N0YWNrIC0+IHRzX3RvcDsKKyAgICBrbXBfaW50MzIgZW50cmllcyA9IHRhc2tfc3RhY2sgLT4gdHNfZW50cmllczsKKyAgICBrbXBfdGFza2RhdGFfdCAqdGllZF90YXNrOworCisgICAgS0FfVFJBQ0UodGhyZXNob2xkLCAoIl9fa21wX3RyYWNlX3Rhc2tfc3RhY2soc3RhcnQpOiBsb2NhdGlvbiA9ICVzLCBndGlkID0gJWQsIGVudHJpZXMgPSAlZCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJmaXJzdF9ibG9jayA9ICVwLCBzdGFja190b3AgPSAlcCBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24sIGd0aWQsIGVudHJpZXMsIHRhc2tfc3RhY2stPnRzX2ZpcnN0X2Jsb2NrLCBzdGFja190b3AgKSApOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggc3RhY2tfdG9wICE9IE5VTEwgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBlbnRyaWVzID4gMCApOworCisgICAgd2hpbGUgKCBlbnRyaWVzICE9IDAgKQorICAgIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggc3RhY2tfdG9wICE9ICYgdGFza19zdGFjay0+dHNfZmlyc3RfYmxvY2suc2JfYmxvY2tbMF0gKTsKKyAgICAgICAgLy8gZml4IHVwIHRzX3RvcCBpZiB3ZSBuZWVkIHRvIHBvcCBmcm9tIHByZXZpb3VzIGJsb2NrCisgICAgICAgIGlmICggZW50cmllcyAmIFRBU0tfU1RBQ0tfSU5ERVhfTUFTSyA9PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAga21wX3N0YWNrX2Jsb2NrX3QgKnN0YWNrX2Jsb2NrID0gKGttcF9zdGFja19ibG9ja190ICopIChzdGFja190b3ApIDsKKworICAgICAgICAgICAgc3RhY2tfYmxvY2sgPSBzdGFja19ibG9jayAtPiBzYl9wcmV2OworICAgICAgICAgICAgc3RhY2tfdG9wID0gJiBzdGFja19ibG9jayAtPiBzYl9ibG9ja1tUQVNLX1NUQUNLX0JMT0NLX1NJWkVdOworICAgICAgICB9CisKKyAgICAgICAgLy8gZmluaXNoIGJvb2trZWVwaW5nCisgICAgICAgIHN0YWNrX3RvcC0tOworICAgICAgICBlbnRyaWVzLS07CisKKyAgICAgICAgdGllZF90YXNrID0gKiBzdGFja190b3A7CisKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGllZF90YXNrICE9IE5VTEwgKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGllZF90YXNrIC0+IHRkX2ZsYWdzLnRhc2t0eXBlID09IFRBU0tfVElFRCApOworCisgICAgICAgIEtBX1RSQUNFKHRocmVzaG9sZCwgKCJfX2ttcF90cmFjZV90YXNrX3N0YWNrKCVzKTogICAgICAgICAgICAgZ3RpZD0lZCwgZW50cnk9JWQsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0YWNrX3RvcD0lcCwgdGllZF90YXNrPSVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiwgZ3RpZCwgZW50cmllcywgc3RhY2tfdG9wLCB0aWVkX3Rhc2sgKSApOworICAgIH0KKyAgICBLTVBfREVCVUdfQVNTRVJUKCBzdGFja190b3AgPT0gJiB0YXNrX3N0YWNrLT50c19maXJzdF9ibG9jay5zYl9ibG9ja1swXSApOworCisgICAgS0FfVFJBQ0UodGhyZXNob2xkLCAoIl9fa21wX3RyYWNlX3Rhc2tfc3RhY2soZXhpdCk6IGxvY2F0aW9uID0gJXMsIGd0aWQgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiwgZ3RpZCApICk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgX19rbXBfaW5pdF90YXNrX3N0YWNrOiBpbml0aWFsaXplIHRoZSB0YXNrIHN0YWNrIGZvciB0aGUgZmlyc3QgdGltZQorLy8gICAgYWZ0ZXIgYSB0aHJlYWRfZGF0YSBzdHJ1Y3R1cmUgaXMgY3JlYXRlZC4KKy8vICAgIEl0IHNob3VsZCBub3QgYmUgbmVjZXNzYXJ5IHRvIGRvIHRoaXMgYWdhaW4gKGFzc3VtaW5nIHRoZSBzdGFjayB3b3JrcykuCisvLworLy8gIGd0aWQ6IGdsb2JhbCB0aHJlYWQgaWRlbnRpZmllciBvZiBjYWxsaW5nIHRocmVhZAorLy8gIHRocmVhZF9kYXRhOiB0aHJlYWQgZGF0YSBmb3IgdGFzayB0ZWFtIHRocmVhZCBjb250YWluaW5nIHN0YWNrCisKK3N0YXRpYyB2b2lkCitfX2ttcF9pbml0X3Rhc2tfc3RhY2soIGttcF9pbnQzMiBndGlkLCBrbXBfdGhyZWFkX2RhdGFfdCAqdGhyZWFkX2RhdGEgKQoreworICAgIGttcF90YXNrX3N0YWNrX3QgKnRhc2tfc3RhY2sgPSAmIHRocmVhZF9kYXRhLT50ZC50ZF9zdXNwX3RpZWRfdGFza3M7CisgICAga21wX3N0YWNrX2Jsb2NrX3QgKmZpcnN0X2Jsb2NrOworCisgICAgLy8gc2V0IHVwIHRoZSBmaXJzdCBibG9jayBvZiB0aGUgc3RhY2sKKyAgICBmaXJzdF9ibG9jayA9ICYgdGFza19zdGFjayAtPiB0c19maXJzdF9ibG9jazsKKyAgICB0YXNrX3N0YWNrIC0+IHRzX3RvcCA9IChrbXBfdGFza2RhdGFfdCAqKikgZmlyc3RfYmxvY2s7CisgICAgbWVtc2V0KCAodm9pZCAqKSBmaXJzdF9ibG9jaywgJ1wwJywgVEFTS19TVEFDS19CTE9DS19TSVpFICogc2l6ZW9mKGttcF90YXNrZGF0YV90ICopKTsKKworICAgIC8vIGluaXRpYWxpemUgdGhlIHN0YWNrIHRvIGJlIGVtcHR5CisgICAgdGFza19zdGFjayAgLT4gdHNfZW50cmllcyA9IFRBU0tfU1RBQ0tfRU1QVFk7CisgICAgZmlyc3RfYmxvY2sgLT4gc2JfbmV4dCA9IE5VTEw7CisgICAgZmlyc3RfYmxvY2sgLT4gc2JfcHJldiA9IE5VTEw7Cit9CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBfX2ttcF9mcmVlX3Rhc2tfc3RhY2s6IGZyZWUgdGhlIHRhc2sgc3RhY2sgd2hlbiB0aHJlYWRfZGF0YSBpcyBkZXN0cm95ZWQuCisvLworLy8gIGd0aWQ6IGdsb2JhbCB0aHJlYWQgaWRlbnRpZmllciBmb3IgY2FsbGluZyB0aHJlYWQKKy8vICB0aHJlYWRfZGF0YTogdGhyZWFkIGluZm8gZm9yIHRocmVhZCBjb250YWluaW5nIHN0YWNrCisKK3N0YXRpYyB2b2lkCitfX2ttcF9mcmVlX3Rhc2tfc3RhY2soIGttcF9pbnQzMiBndGlkLCBrbXBfdGhyZWFkX2RhdGFfdCAqdGhyZWFkX2RhdGEgKQoreworICAgIGttcF90YXNrX3N0YWNrX3QgKnRhc2tfc3RhY2sgPSAmIHRocmVhZF9kYXRhLT50ZC50ZF9zdXNwX3RpZWRfdGFza3M7CisgICAga21wX3N0YWNrX2Jsb2NrX3QgKnN0YWNrX2Jsb2NrID0gJiB0YXNrX3N0YWNrIC0+IHRzX2ZpcnN0X2Jsb2NrOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggdGFza19zdGFjayAtPiB0c19lbnRyaWVzID09IFRBU0tfU1RBQ0tfRU1QVFkgKTsKKyAgICAvLyBmcmVlIGZyb20gdGhlIHNlY29uZCBibG9jayBvZiB0aGUgc3RhY2sKKyAgICB3aGlsZSAoIHN0YWNrX2Jsb2NrICE9IE5VTEwgKSB7CisgICAgICAgIGttcF9zdGFja19ibG9ja190ICpuZXh0X2Jsb2NrID0gKHN0YWNrX2Jsb2NrKSA/IHN0YWNrX2Jsb2NrIC0+IHNiX25leHQgOiBOVUxMOworCisgICAgICAgIHN0YWNrX2Jsb2NrIC0+IHNiX25leHQgPSBOVUxMOworICAgICAgICBzdGFja19ibG9jayAtPiBzYl9wcmV2ID0gTlVMTDsKKyAgICAgICAgaWYgKHN0YWNrX2Jsb2NrICE9ICYgdGFza19zdGFjayAtPiB0c19maXJzdF9ibG9jaykgeworICAgICAgICAgICAgX19rbXBfdGhyZWFkX2ZyZWUoIHRocmVhZCwgc3RhY2tfYmxvY2sgKTsgIC8vIGZyZWUgdGhlIGJsb2NrLCBpZiBub3QgdGhlIGZpcnN0CisgICAgICAgIH0KKyAgICAgICAgc3RhY2tfYmxvY2sgPSBuZXh0X2Jsb2NrOworICAgIH0KKyAgICAvLyBpbml0aWFsaXplIHRoZSBzdGFjayB0byBiZSBlbXB0eQorICAgIHRhc2tfc3RhY2sgLT4gdHNfZW50cmllcyA9IDA7CisgICAgdGFza19zdGFjayAtPiB0c190b3AgPSBOVUxMOworfQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgX19rbXBfcHVzaF90YXNrX3N0YWNrOiBQdXNoIHRoZSB0aWVkIHRhc2sgb250byB0aGUgdGFzayBzdGFjay4KKy8vICAgICBHcm93IHRoZSBzdGFjayBpZiBuZWNlc3NhcnkgYnkgYWxsb2NhdGluZyBhbm90aGVyIGJsb2NrLgorLy8KKy8vICBndGlkOiBnbG9iYWwgdGhyZWFkIGlkZW50aWZpZXIgZm9yIGNhbGxpbmcgdGhyZWFkCisvLyAgdGhyZWFkOiB0aHJlYWQgaW5mbyBmb3IgdGhyZWFkIGNvbnRhaW5pbmcgc3RhY2sKKy8vICB0aWVkX3Rhc2s6IHRoZSB0YXNrIHRvIHB1c2ggb24gdGhlIHN0YWNrCisKK3N0YXRpYyB2b2lkCitfX2ttcF9wdXNoX3Rhc2tfc3RhY2soIGttcF9pbnQzMiBndGlkLCBrbXBfaW5mb190ICp0aHJlYWQsIGttcF90YXNrZGF0YV90ICogdGllZF90YXNrICkKK3sKKyAgICAvLyBHRUggLSBuZWVkIHRvIGNvbnNpZGVyIHdoYXQgdG8gZG8gaWYgdHRfdGhyZWFkc19kYXRhIG5vdCBhbGxvY2F0ZWQgeWV0CisgICAga21wX3RocmVhZF9kYXRhX3QgKnRocmVhZF9kYXRhID0gJiB0aHJlYWQgLT4gdGgudGhfdGFza190ZWFtIC0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHQudHRfdGhyZWFkc19kYXRhWyBfX2ttcF90aWRfZnJvbV9ndGlkKCBndGlkICkgXTsKKyAgICBrbXBfdGFza19zdGFja190ICp0YXNrX3N0YWNrID0gJiB0aHJlYWRfZGF0YS0+dGQudGRfc3VzcF90aWVkX3Rhc2tzIDsKKworICAgIGlmICggdGllZF90YXNrLT50ZF9mbGFncy50ZWFtX3NlcmlhbCB8fCB0aWVkX3Rhc2stPnRkX2ZsYWdzLnRhc2tpbmdfc2VyICkgeworICAgICAgICByZXR1cm47ICAvLyBEb24ndCBwdXNoIGFueXRoaW5nIG9uIHN0YWNrIGlmIHRlYW0gb3IgdGVhbSB0YXNrcyBhcmUgc2VyaWFsaXplZAorICAgIH0KKworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRpZWRfdGFzayAtPiB0ZF9mbGFncy50YXNrdHlwZSA9PSBUQVNLX1RJRUQgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrX3N0YWNrIC0+IHRzX3RvcCAhPSBOVUxMICk7CisKKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9wdXNoX3Rhc2tfc3RhY2soZW50ZXIpOiBHVElEOiAlZDsgVEhSRUFEOiAlcDsgVEFTSzogJXBcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCB0aHJlYWQsIHRpZWRfdGFzayApICk7CisgICAgLy8gU3RvcmUgZW50cnkKKyAgICAqICh0YXNrX3N0YWNrIC0+IHRzX3RvcCkgPSB0aWVkX3Rhc2s7CisKKyAgICAvLyBEbyBib29ra2VlcGluZyBmb3IgbmV4dCBwdXNoCisgICAgdGFza19zdGFjayAtPiB0c190b3ArKzsKKyAgICB0YXNrX3N0YWNrIC0+IHRzX2VudHJpZXMrKzsKKworICAgIGlmICggdGFza19zdGFjayAtPiB0c19lbnRyaWVzICYgVEFTS19TVEFDS19JTkRFWF9NQVNLID09IDAgKQorICAgIHsKKyAgICAgICAgLy8gRmluZCBiZWdpbm5pbmcgb2YgdGhpcyB0YXNrIGJsb2NrCisgICAgICAgIGttcF9zdGFja19ibG9ja190ICpzdGFja19ibG9jayA9CisgICAgICAgICAgICAgKGttcF9zdGFja19ibG9ja190ICopICh0YXNrX3N0YWNrIC0+IHRzX3RvcCAtIFRBU0tfU1RBQ0tfQkxPQ0tfU0laRSk7CisKKyAgICAgICAgLy8gQ2hlY2sgaWYgd2UgYWxyZWFkeSBoYXZlIGEgYmxvY2sKKyAgICAgICAgaWYgKCBzdGFja19ibG9jayAtPiBzYl9uZXh0ICE9IE5VTEwgKQorICAgICAgICB7ICAgIC8vIHJlc2V0IHRzX3RvcCB0byBiZWdpbm5pbmcgb2YgbmV4dCBibG9jaworICAgICAgICAgICAgdGFza19zdGFjayAtPiB0c190b3AgPSAmIHN0YWNrX2Jsb2NrIC0+IHNiX25leHQgLT4gc2JfYmxvY2tbMF07CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7ICAgLy8gQWxsb2MgbmV3IGJsb2NrIGFuZCBsaW5rIGl0IHVwCisgICAgICAgICAgICBrbXBfc3RhY2tfYmxvY2tfdCAqbmV3X2Jsb2NrID0gKGttcF9zdGFja19ibG9ja190ICopCisgICAgICAgICAgICAgIF9fa21wX3RocmVhZF9jYWxsb2ModGhyZWFkLCBzaXplb2Yoa21wX3N0YWNrX2Jsb2NrX3QpKTsKKworICAgICAgICAgICAgdGFza19zdGFjayAtPiB0c190b3AgID0gJiBuZXdfYmxvY2sgLT4gc2JfYmxvY2tbMF07CisgICAgICAgICAgICBzdGFja19ibG9jayAtPiBzYl9uZXh0ID0gbmV3X2Jsb2NrOworICAgICAgICAgICAgbmV3X2Jsb2NrICAtPiBzYl9wcmV2ID0gc3RhY2tfYmxvY2s7CisgICAgICAgICAgICBuZXdfYmxvY2sgIC0+IHNiX25leHQgPSBOVUxMOworCisgICAgICAgICAgICBLQV9UUkFDRSgzMCwgKCJfX2ttcF9wdXNoX3Rhc2tfc3RhY2soKTogR1RJRDogJWQ7IFRBU0s6ICVwOyBBbGxvYyBuZXcgYmxvY2s6ICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0aWVkX3Rhc2ssIG5ld19ibG9jayApICk7CisgICAgICAgIH0KKyAgICB9CisgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfcHVzaF90YXNrX3N0YWNrKGV4aXQpOiBHVElEOiAlZDsgVEFTSzogJXBcbiIsIGd0aWQsIHRpZWRfdGFzayApICk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgX19rbXBfcG9wX3Rhc2tfc3RhY2s6IFBvcCB0aGUgdGllZCB0YXNrIGZyb20gdGhlIHRhc2sgc3RhY2suICBEb24ndCByZXR1cm4KKy8vICAgICB0aGUgdGFzaywganVzdCBjaGVjayB0byBtYWtlIHN1cmUgaXQgbWF0Y2hlcyB0aGUgZW5kaW5nIHRhc2sgcGFzc2VkIGluLgorLy8KKy8vICBndGlkOiBnbG9iYWwgdGhyZWFkIGlkZW50aWZpZXIgZm9yIHRoZSBjYWxsaW5nIHRocmVhZAorLy8gIHRocmVhZDogdGhyZWFkIGluZm8gc3RydWN0dXJlIGNvbnRhaW5pbmcgc3RhY2sKKy8vICB0aWVkX3Rhc2s6IHRoZSB0YXNrIHBvcHBlZCBvZmYgdGhlIHN0YWNrCisvLyAgZW5kaW5nX3Rhc2s6IHRoZSB0YXNrIHRoYXQgaXMgZW5kaW5nIChzaG91bGQgbWF0Y2ggcG9wcGVkIHRhc2spCisKK3N0YXRpYyB2b2lkCitfX2ttcF9wb3BfdGFza19zdGFjaygga21wX2ludDMyIGd0aWQsIGttcF9pbmZvX3QgKnRocmVhZCwga21wX3Rhc2tkYXRhX3QgKmVuZGluZ190YXNrICkKK3sKKyAgICAvLyBHRUggLSBuZWVkIHRvIGNvbnNpZGVyIHdoYXQgdG8gZG8gaWYgdHRfdGhyZWFkc19kYXRhIG5vdCBhbGxvY2F0ZWQgeWV0CisgICAga21wX3RocmVhZF9kYXRhX3QgKnRocmVhZF9kYXRhID0gJiB0aHJlYWQgLT4gdGgudGhfdGFza190ZWFtIC0+IHR0X3RocmVhZHNfZGF0YVsgX19rbXBfdGlkX2Zyb21fZ3RpZCggZ3RpZCApIF07CisgICAga21wX3Rhc2tfc3RhY2tfdCAqdGFza19zdGFjayA9ICYgdGhyZWFkX2RhdGEtPnRkLnRkX3N1c3BfdGllZF90YXNrcyA7CisgICAga21wX3Rhc2tkYXRhX3QgKnRpZWRfdGFzazsKKworICAgIGlmICggZW5kaW5nX3Rhc2stPnRkX2ZsYWdzLnRlYW1fc2VyaWFsIHx8IGVuZGluZ190YXNrLT50ZF9mbGFncy50YXNraW5nX3NlciApIHsKKyAgICAgICAgcmV0dXJuOyAgLy8gRG9uJ3QgcG9wIGFueXRoaW5nIGZyb20gc3RhY2sgaWYgdGVhbSBvciB0ZWFtIHRhc2tzIGFyZSBzZXJpYWxpemVkCisgICAgfQorCisgICAgS01QX0RFQlVHX0FTU0VSVCggdGFza19zdGFjayAtPiB0c190b3AgIT0gTlVMTCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tfc3RhY2sgLT4gdHNfZW50cmllcyA+IDAgKTsKKworICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX3BvcF90YXNrX3N0YWNrKGVudGVyKTogR1RJRDogJWQ7IFRIUkVBRDogJXBcbiIsIGd0aWQsIHRocmVhZCApICk7CisKKyAgICAvLyBmaXggdXAgdHNfdG9wIGlmIHdlIG5lZWQgdG8gcG9wIGZyb20gcHJldmlvdXMgYmxvY2sKKyAgICBpZiAoIHRhc2tfc3RhY2sgLT4gdHNfZW50cmllcyAmIFRBU0tfU1RBQ0tfSU5ERVhfTUFTSyA9PSAwICkKKyAgICB7CisgICAgICAgIGttcF9zdGFja19ibG9ja190ICpzdGFja19ibG9jayA9CisgICAgICAgICAgIChrbXBfc3RhY2tfYmxvY2tfdCAqKSAodGFza19zdGFjayAtPiB0c190b3ApIDsKKworICAgICAgICBzdGFja19ibG9jayA9IHN0YWNrX2Jsb2NrIC0+IHNiX3ByZXY7CisgICAgICAgIHRhc2tfc3RhY2sgLT4gdHNfdG9wID0gJiBzdGFja19ibG9jayAtPiBzYl9ibG9ja1tUQVNLX1NUQUNLX0JMT0NLX1NJWkVdOworICAgIH0KKworICAgIC8vIGZpbmlzaCBib29ra2VlcGluZworICAgIHRhc2tfc3RhY2sgLT4gdHNfdG9wLS07CisgICAgdGFza19zdGFjayAtPiB0c19lbnRyaWVzLS07CisKKyAgICB0aWVkX3Rhc2sgPSAqICh0YXNrX3N0YWNrIC0+IHRzX3RvcCApOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggdGllZF90YXNrICE9IE5VTEwgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aWVkX3Rhc2sgLT4gdGRfZmxhZ3MudGFza3R5cGUgPT0gVEFTS19USUVEICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGllZF90YXNrID09IGVuZGluZ190YXNrICk7ICAvLyBJZiB3ZSBidWlsdCB0aGUgc3RhY2sgY29ycmVjdGx5CisKKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9wb3BfdGFza19zdGFjayhleGl0KTogR1RJRDogJWQ7IFRBU0s6ICVwXG4iLCBndGlkLCB0aWVkX3Rhc2sgKSApOworICAgIHJldHVybjsKK30KKyNlbmRpZiAvKiBCVUlMRF9USUVEX1RBU0tfU1RBQ0sgKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBfX2ttcF9wdXNoX3Rhc2s6IEFkZCBhIHRhc2sgdG8gdGhlIHRocmVhZCdzIGRlcXVlCisKK3N0YXRpYyBrbXBfaW50MzIKK19fa21wX3B1c2hfdGFzayhrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tfdCAqIHRhc2sgKQoreworICAgIGttcF9pbmZvX3QgKiAgICAgICAgdGhyZWFkID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworICAgIGttcF90YXNrZGF0YV90ICogICAgdGFza2RhdGEgPSBLTVBfVEFTS19UT19UQVNLREFUQSh0YXNrKTsKKyAgICBrbXBfdGFza190ZWFtX3QgKiAgIHRhc2tfdGVhbSA9IHRocmVhZC0+dGgudGhfdGFza190ZWFtOworICAgIGttcF9pbnQzMiAgICAgICAgICAgdGlkID0gX19rbXBfdGlkX2Zyb21fZ3RpZCggZ3RpZCApOworICAgIGttcF90aHJlYWRfZGF0YV90ICogdGhyZWFkX2RhdGE7CisKKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9wdXNoX3Rhc2s6IFQjJWQgdHJ5aW5nIHRvIHB1c2ggdGFzayAlcC5cbiIsIGd0aWQsIHRhc2tkYXRhICkgKTsKKworICAgIC8vIFRoZSBmaXJzdCBjaGVjayBhdm9pZHMgYnVpbGRpbmcgdGFza190ZWFtIHRocmVhZCBkYXRhIGlmIHNlcmlhbGl6ZWQKKyAgICBpZiAoIHRhc2tkYXRhLT50ZF9mbGFncy50YXNrX3NlcmlhbCApIHsKKyAgICAgICAgS0FfVFJBQ0UoMjAsICggIl9fa21wX3B1c2hfdGFzazogVCMlZCB0ZWFtIHNlcmlhbGl6ZWQ7IHJldHVybmluZyBUQVNLX05PVF9QVVNIRUQgZm9yIHRhc2sgJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRhc2tkYXRhICkgKTsKKyAgICAgICAgcmV0dXJuIFRBU0tfTk9UX1BVU0hFRDsKKyAgICB9CisKKyAgICAvLyBOb3cgdGhhdCBzZXJpYWxpemVkIHRhc2tzIGhhdmUgcmV0dXJuZWQsIHdlIGNhbiBhc3N1bWUgdGhhdCB3ZSBhcmUgbm90IGluIGltbWVkaWF0ZSBleGVjIG1vZGUKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYyApOworICAgIGlmICggISBLTVBfVEFTS0lOR19FTkFCTEVEKCB0YXNrX3RlYW0sIHRocmVhZC0+dGgudGhfdGFza19zdGF0ZSApICkgeworICAgICAgICAgX19rbXBfZW5hYmxlX3Rhc2tpbmcoIHRhc2tfdGVhbSwgdGhyZWFkICk7CisgICAgfQorICAgIEtNUF9ERUJVR19BU1NFUlQoIFRDUl80KHRhc2tfdGVhbSAtPiB0dC50dF9mb3VuZF90YXNrcykgPT0gVFJVRSApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIFRDUl9QVFIodGFza190ZWFtIC0+IHR0LnR0X3RocmVhZHNfZGF0YSkgIT0gTlVMTCApOworCisgICAgLy8gRmluZCB0YXNraW5nIGRlcXVlIHNwZWNpZmljIHRvIGVuY291bnRlcmluZyB0aHJlYWQKKyAgICB0aHJlYWRfZGF0YSA9ICYgdGFza190ZWFtIC0+IHR0LnR0X3RocmVhZHNfZGF0YVsgdGlkIF07CisKKyAgICAvLyBObyBsb2NrIG5lZWRlZCBzaW5jZSBvbmx5IG93bmVyIGNhbiBhbGxvY2F0ZQorICAgIGlmICh0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZSA9PSBOVUxMICkgeworICAgICAgICBfX2ttcF9hbGxvY190YXNrX2RlcXVlKCB0aHJlYWQsIHRocmVhZF9kYXRhICk7CisgICAgfQorCisgICAgLy8gQ2hlY2sgaWYgZGVxdWUgaXMgZnVsbAorICAgIGlmICggVENSXzQodGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVfbnRhc2tzKSA+PSBUQVNLX0RFUVVFX1NJWkUgKQorICAgIHsKKyAgICAgICAgS0FfVFJBQ0UoMjAsICggIl9fa21wX3B1c2hfdGFzazogVCMlZCBkZXF1ZSBpcyBmdWxsOyByZXR1cm5pbmcgVEFTS19OT1RfUFVTSEVEIGZvciB0YXNrICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0YXNrZGF0YSApICk7CisgICAgICAgIHJldHVybiBUQVNLX05PVF9QVVNIRUQ7CisgICAgfQorCisgICAgLy8gTG9jayB0aGUgZGVxdWUgZm9yIHRoZSB0YXNrIHB1c2ggb3BlcmF0aW9uCisgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJiB0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV9sb2NrICk7CisKKyAgICAvLyBNdXN0IGhhdmUgcm9vbSBzaW5jZSBubyB0aHJlYWQgY2FuIGFkZCB0YXNrcyBidXQgY2FsbGluZyB0aHJlYWQKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBUQ1JfNCh0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV9udGFza3MpIDwgVEFTS19ERVFVRV9TSVpFICk7CisKKyAgICB0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZVsgdGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVfdGFpbCBdID0gdGFza2RhdGE7ICAvLyBQdXNoIHRhc2tkYXRhCisgICAgLy8gV3JhcCBpbmRleC4KKyAgICB0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV90YWlsID0gKCB0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV90YWlsICsgMSApICYgVEFTS19ERVFVRV9NQVNLOworICAgIFRDV180KHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlX250YXNrcywgVENSXzQodGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVfbnRhc2tzKSArIDEpOyAgICAgICAgICAgICAvLyBBZGp1c3QgdGFzayBjb3VudAorCisgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJiB0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV9sb2NrICk7CisKKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9wdXNoX3Rhc2s6IFQjJWQgcmV0dXJuaW5nIFRBU0tfU1VDQ0VTU0ZVTExZX1BVU0hFRDogIgorICAgICAgICAgICAgICAgICAgInRhc2s9JXAgbnRhc2tzPSVkIGhlYWQ9JXUgdGFpbD0ldVxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIHRhc2tkYXRhLCB0aHJlYWRfZGF0YS0+dGQudGRfZGVxdWVfbnRhc2tzLAorICAgICAgICAgICAgICAgICAgdGhyZWFkX2RhdGEtPnRkLnRkX2RlcXVlX3RhaWwsIHRocmVhZF9kYXRhLT50ZC50ZF9kZXF1ZV9oZWFkKSApOworCisgICAgcmV0dXJuIFRBU0tfU1VDQ0VTU0ZVTExZX1BVU0hFRDsKK30KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcF9wb3BfY3VycmVudF90YXNrX2Zyb21fdGhyZWFkOiBzZXQgdXAgY3VycmVudCB0YXNrIGZyb20gY2FsbGVkIHRocmVhZCB3aGVuIHRlYW0gZW5kcworLy8gdGhpc190aHI6IHRocmVhZCBzdHJ1Y3R1cmUgdG8gc2V0IGN1cnJlbnRfdGFzayBpbi4KKwordm9pZAorX19rbXBfcG9wX2N1cnJlbnRfdGFza19mcm9tX3RocmVhZCgga21wX2luZm9fdCAqdGhpc190aHIgKQoreworICAgIEtGX1RSQUNFKCAxMCwgKCJfX2ttcF9wb3BfY3VycmVudF90YXNrX2Zyb21fdGhyZWFkKGVudGVyKTogVCMlZCB0aGlzX3RocmVhZD0lcCwgY3VydGFzaz0lcCwgIgorICAgICAgICAgICAgICAgICAgICJjdXJ0YXNrX3BhcmVudD0lcFxuIiwKKyAgICAgICAgICAgICAgICAgICAwLCB0aGlzX3RociwgdGhpc190aHIgLT4gdGgudGhfY3VycmVudF90YXNrLAorICAgICAgICAgICAgICAgICAgIHRoaXNfdGhyIC0+IHRoLnRoX2N1cnJlbnRfdGFzayAtPiB0ZF9wYXJlbnQgKSApOworCisgICAgdGhpc190aHIgLT4gdGgudGhfY3VycmVudF90YXNrID0gdGhpc190aHIgLT4gdGgudGhfY3VycmVudF90YXNrIC0+IHRkX3BhcmVudDsKKworICAgIEtGX1RSQUNFKCAxMCwgKCJfX2ttcF9wb3BfY3VycmVudF90YXNrX2Zyb21fdGhyZWFkKGV4aXQpOiBUIyVkIHRoaXNfdGhyZWFkPSVwLCBjdXJ0YXNrPSVwLCAiCisgICAgICAgICAgICAgICAgICAgImN1cnRhc2tfcGFyZW50PSVwXG4iLAorICAgICAgICAgICAgICAgICAgIDAsIHRoaXNfdGhyLCB0aGlzX3RociAtPiB0aC50aF9jdXJyZW50X3Rhc2ssCisgICAgICAgICAgICAgICAgICAgdGhpc190aHIgLT4gdGgudGhfY3VycmVudF90YXNrIC0+IHRkX3BhcmVudCApICk7Cit9CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wX3B1c2hfY3VycmVudF90YXNrX3RvX3RocmVhZDogc2V0IHVwIGN1cnJlbnQgdGFzayBpbiBjYWxsZWQgdGhyZWFkIGZvciBhIG5ldyB0ZWFtCisvLyB0aGlzX3RocjogdGhyZWFkIHN0cnVjdHVyZSB0byBzZXQgdXAKKy8vIHRlYW06IHRlYW0gZm9yIGltcGxpY2l0IHRhc2sgZGF0YQorLy8gdGlkOiB0aHJlYWQgd2l0aGluIHRlYW0gdG8gc2V0IHVwCisKK3ZvaWQKK19fa21wX3B1c2hfY3VycmVudF90YXNrX3RvX3RocmVhZCgga21wX2luZm9fdCAqdGhpc190aHIsIGttcF90ZWFtX3QgKnRlYW0sIGludCB0aWQgKQoreworICAgIC8vIGN1cnJlbnQgdGFzayBvZiB0aGUgdGhyZWFkIGlzIGEgcGFyZW50IG9mIHRoZSBuZXcganVzdCBjcmVhdGVkIGltcGxpY2l0IHRhc2tzIG9mIG5ldyB0ZWFtCisgICAgS0ZfVFJBQ0UoIDEwLCAoICJfX2ttcF9wdXNoX2N1cnJlbnRfdGFza190b190aHJlYWQoZW50ZXIpOiBUIyVkIHRoaXNfdGhyZWFkPSVwIGN1cnRhc2s9JXAgIgorICAgICAgICAgICAgICAgICAgICAicGFyZW50X3Rhc2s9JXBcbiIsCisgICAgICAgICAgICAgICAgICAgIHRpZCwgdGhpc190aHIsIHRoaXNfdGhyLT50aC50aF9jdXJyZW50X3Rhc2ssCisgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhW3RpZF0udGRfcGFyZW50ICkgKTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQgKHRoaXNfdGhyICE9IE5VTEwpOworCisgICAgaWYoIHRpZCA9PSAwICkgeworICAgICAgICBpZiggdGhpc190aHItPnRoLnRoX2N1cnJlbnRfdGFzayAhPSAmIHRlYW0gLT4gdC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbIDAgXSApIHsKKyAgICAgICAgICAgIHRlYW0gLT4gdC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbIDAgXS50ZF9wYXJlbnQgPSB0aGlzX3Roci0+dGgudGhfY3VycmVudF90YXNrOworICAgICAgICAgICAgdGhpc190aHItPnRoLnRoX2N1cnJlbnRfdGFzayA9ICYgdGVhbSAtPiB0LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVsgMCBdOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgdGVhbSAtPiB0LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVsgdGlkIF0udGRfcGFyZW50ID0gdGVhbSAtPiB0LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVsgMCBdLnRkX3BhcmVudDsKKyAgICAgICAgdGhpc190aHItPnRoLnRoX2N1cnJlbnRfdGFzayA9ICYgdGVhbSAtPiB0LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVsgdGlkIF07CisgICAgfQorCisgICAgS0ZfVFJBQ0UoIDEwLCAoICJfX2ttcF9wdXNoX2N1cnJlbnRfdGFza190b190aHJlYWQoZXhpdCk6IFQjJWQgdGhpc190aHJlYWQ9JXAgY3VydGFzaz0lcCAiCisgICAgICAgICAgICAgICAgICAgICJwYXJlbnRfdGFzaz0lcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgdGlkLCB0aGlzX3RociwgdGhpc190aHItPnRoLnRoX2N1cnJlbnRfdGFzaywKKyAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbdGlkXS50ZF9wYXJlbnQgKSApOworfQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBfdGFza19zdGFydDogYm9va2tlZXBpbmcgZm9yIGEgdGFzayBzdGFydGluZyBleGVjdXRpb24KKy8vIEdUSUQ6IGdsb2JhbCB0aHJlYWQgaWQgb2YgY2FsbGluZyB0aHJlYWQKKy8vIHRhc2s6IHRhc2sgc3RhcnRpbmcgZXhlY3V0aW9uCisvLyBjdXJyZW50X3Rhc2s6IHRhc2sgc3VzcGVuZGluZworCitzdGF0aWMgdm9pZAorX19rbXBfdGFza19zdGFydCgga21wX2ludDMyIGd0aWQsIGttcF90YXNrX3QgKiB0YXNrLCBrbXBfdGFza2RhdGFfdCAqIGN1cnJlbnRfdGFzayApCit7CisgICAga21wX3Rhc2tkYXRhX3QgKiB0YXNrZGF0YSA9IEtNUF9UQVNLX1RPX1RBU0tEQVRBKHRhc2spOworICAgIGttcF9pbmZvX3QgKiB0aHJlYWQgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcF90YXNrX3N0YXJ0KGVudGVyKTogVCMlZCBzdGFydGluZyB0YXNrICVwOiBjdXJyZW50X3Rhc2s9JXBcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCB0YXNrZGF0YSwgY3VycmVudF90YXNrKSApOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggdGFza2RhdGEgLT4gdGRfZmxhZ3MudGFza3R5cGUgPT0gVEFTS19FWFBMSUNJVCApOworCisgICAgLy8gbWFyayBjdXJyZW50bHkgZXhlY3V0aW5nIHRhc2sgYXMgc3VzcGVuZGVkCisgICAgLy8gVE9ETzogR0VIIC0gbWFrZSBzdXJlIHJvb3QgdGVhbSBpbXBsaWNpdCB0YXNrIGlzIGluaXRpYWxpemVkIHByb3Blcmx5LgorICAgIC8vIEtNUF9ERUJVR19BU1NFUlQoIGN1cnJlbnRfdGFzayAtPiB0ZF9mbGFncy5leGVjdXRpbmcgPT0gMSApOworICAgIGN1cnJlbnRfdGFzayAtPiB0ZF9mbGFncy5leGVjdXRpbmcgPSAwOworCisgICAgLy8gQWRkIHRhc2sgdG8gc3RhY2sgaWYgdGllZAorI2lmZGVmIEJVSUxEX1RJRURfVEFTS19TVEFDSworICAgIGlmICggdGFza2RhdGEgLT4gdGRfZmxhZ3MudGllZG5lc3MgPT0gVEFTS19USUVEICkKKyAgICB7CisgICAgICAgIF9fa21wX3B1c2hfdGFza19zdGFjayggZ3RpZCwgdGhyZWFkLCB0YXNrZGF0YSApOworICAgIH0KKyNlbmRpZiAvKiBCVUlMRF9USUVEX1RBU0tfU1RBQ0sgKi8KKworICAgIC8vIG1hcmsgc3RhcnRpbmcgdGFzayBhcyBleGVjdXRpbmcgYW5kIGFzIGN1cnJlbnQgdGFzaworICAgIHRocmVhZCAtPiB0aC50aF9jdXJyZW50X3Rhc2sgPSB0YXNrZGF0YTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tkYXRhIC0+IHRkX2ZsYWdzLnN0YXJ0ZWQgPT0gMCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tkYXRhIC0+IHRkX2ZsYWdzLmV4ZWN1dGluZyA9PSAwICk7CisgICAgdGFza2RhdGEgLT4gdGRfZmxhZ3Muc3RhcnRlZCA9IDE7CisgICAgdGFza2RhdGEgLT4gdGRfZmxhZ3MuZXhlY3V0aW5nID0gMTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrZGF0YSAtPiB0ZF9mbGFncy5jb21wbGV0ZSA9PSAwICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGFza2RhdGEgLT4gdGRfZmxhZ3MuZnJlZWQgPT0gMCApOworCisgICAgLy8gR0VIIFRPRE86IHNob3VsZG4ndCB3ZSBwYXNzIHNvbWUgc29ydCBvZiBsb2NhdGlvbiBpZGVudGlmaWVyIGhlcmU/CisgICAgLy8gQVBUOiB5ZXMsIHdlIHdpbGwgcGFzcyBsb2NhdGlvbiBoZXJlLgorICAgIC8vIG5lZWQgdG8gc3RvcmUgY3VycmVudCB0aHJlYWQgc3RhdGUgKGluIGEgdGhyZWFkIG9yIHRhc2tkYXRhIHN0cnVjdHVyZSkKKyAgICAvLyBiZWZvcmUgc2V0dGluZyB3b3JrX3N0YXRlLCBvdGhlcndpc2Ugd3Jvbmcgc3RhdGUgaXMgc2V0IGFmdGVyIGVuZCBvZiB0YXNrCisKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcF90YXNrX3N0YXJ0KGV4aXQpOiBUIyVkIHRhc2s9JXBcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCB0YXNrZGF0YSApICk7CisKKyAgICByZXR1cm47Cit9CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcGNfb21wX3Rhc2tfYmVnaW5faWYwOiByZXBvcnQgdGhhdCBhIGdpdmVuIHNlcmlhbGl6ZWQgdGFzayBoYXMgc3RhcnRlZCBleGVjdXRpb24KKy8vIGxvY19yZWY6IHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbjsgcG9pbnRzIHRvIGJlZ2lubmluZyBvZiB0YXNrIGJsb2NrLgorLy8gZ3RpZDogZ2xvYmFsIHRocmVhZCBudW1iZXIuCisvLyB0YXNrOiB0YXNrIHRodW5rIGZvciB0aGUgc3RhcnRlZCB0YXNrLgorCit2b2lkCitfX2ttcGNfb21wX3Rhc2tfYmVnaW5faWYwKCBpZGVudF90ICpsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tfdCAqIHRhc2sgKQoreworICAgIGttcF90YXNrZGF0YV90ICogdGFza2RhdGEgPSBLTVBfVEFTS19UT19UQVNLREFUQSh0YXNrKTsKKyAgICBrbXBfdGFza2RhdGFfdCAqIGN1cnJlbnRfdGFzayA9IF9fa21wX3RocmVhZHNbIGd0aWQgXSAtPiB0aC50aF9jdXJyZW50X3Rhc2s7CisKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcGNfb21wX3Rhc2tfYmVnaW5faWYwKGVudGVyKTogVCMlZCBsb2M9JXAgdGFzaz0lcCBjdXJyZW50X3Rhc2s9JXBcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCBsb2NfcmVmLCB0YXNrZGF0YSwgY3VycmVudF90YXNrICkgKTsKKworICAgIHRhc2tkYXRhIC0+IHRkX2ZsYWdzLnRhc2tfc2VyaWFsID0gMTsgIC8vIEV4ZWN1dGUgdGhpcyB0YXNrIGltbWVkaWF0ZWx5LCBub3QgZGVmZXJyZWQuCisgICAgX19rbXBfdGFza19zdGFydCggZ3RpZCwgdGFzaywgY3VycmVudF90YXNrICk7CisKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcGNfb21wX3Rhc2tfYmVnaW5faWYwKGV4aXQpOiBUIyVkIGxvYz0lcCB0YXNrPSVwLFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIGxvY19yZWYsIHRhc2tkYXRhICkgKTsKKworICAgIHJldHVybjsKK30KKworI2lmZGVmIFRBU0tfVU5VU0VECisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wY19vbXBfdGFza19iZWdpbjogcmVwb3J0IHRoYXQgYSBnaXZlbiB0YXNrIGhhcyBzdGFydGVkIGV4ZWN1dGlvbgorLy8gTkVWRVIgR0VORVJBVEVEIEJZIENPTVBJTEVSLCBERVBSRUNBVEVEISEhCisKK3ZvaWQKK19fa21wY19vbXBfdGFza19iZWdpbiggaWRlbnRfdCAqbG9jX3JlZiwga21wX2ludDMyIGd0aWQsIGttcF90YXNrX3QgKiB0YXNrICkKK3sKKyAgICBrbXBfdGFza2RhdGFfdCAqIGN1cnJlbnRfdGFzayA9IF9fa21wX3RocmVhZHNbIGd0aWQgXSAtPiB0aC50aF9jdXJyZW50X3Rhc2s7CisKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcGNfb21wX3Rhc2tfYmVnaW4oZW50ZXIpOiBUIyVkIGxvYz0lcCB0YXNrPSVwIGN1cnJlbnRfdGFzaz0lcFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIGxvY19yZWYsIEtNUF9UQVNLX1RPX1RBU0tEQVRBKHRhc2spLCBjdXJyZW50X3Rhc2sgKSApOworCisgICAgX19rbXBfdGFza19zdGFydCggZ3RpZCwgdGFzaywgY3VycmVudF90YXNrICk7CisKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcGNfb21wX3Rhc2tfYmVnaW4oZXhpdCk6IFQjJWQgbG9jPSVwIHRhc2s9JXAsXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgbG9jX3JlZiwgS01QX1RBU0tfVE9fVEFTS0RBVEEodGFzaykgKSApOworCisgICAgcmV0dXJuOworfQorI2VuZGlmIC8vIFRBU0tfVU5VU0VECisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcF9mcmVlX3Rhc2s6IGZyZWUgdGhlIGN1cnJlbnQgdGFzayBzcGFjZSBhbmQgdGhlIHNwYWNlIGZvciBzaGFyZWRzCisvLyBndGlkOiBHbG9iYWwgdGhyZWFkIElEIG9mIGNhbGxpbmcgdGhyZWFkCisvLyB0YXNrZGF0YTogdGFzayB0byBmcmVlCisvLyB0aHJlYWQ6IHRocmVhZCBkYXRhIHN0cnVjdHVyZSBvZiBjYWxsZXIKKworc3RhdGljIHZvaWQKK19fa21wX2ZyZWVfdGFzaygga21wX2ludDMyIGd0aWQsIGttcF90YXNrZGF0YV90ICogdGFza2RhdGEsIGttcF9pbmZvX3QgKiB0aHJlYWQgKQoreworICAgIEtBX1RSQUNFKDMwLCAoIl9fa21wX2ZyZWVfdGFzazogVCMlZCBmcmVlaW5nIGRhdGEgZnJvbSB0YXNrICVwXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgdGFza2RhdGEpICk7CisKKyAgICAvLyBDaGVjayB0byBtYWtlIHN1cmUgYWxsIGZsYWdzIGFuZCBjb3VudGVycyBoYXZlIHRoZSBjb3JyZWN0IHZhbHVlcworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tkYXRhLT50ZF9mbGFncy50YXNrdHlwZSA9PSBUQVNLX0VYUExJQ0lUICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGFza2RhdGEtPnRkX2ZsYWdzLmV4ZWN1dGluZyA9PSAwICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGFza2RhdGEtPnRkX2ZsYWdzLmNvbXBsZXRlID09IDEgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrZGF0YS0+dGRfZmxhZ3MuZnJlZWQgPT0gMCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIFRDUl80KHRhc2tkYXRhLT50ZF9hbGxvY2F0ZWRfY2hpbGRfdGFza3MpID09IDAgIHx8IHRhc2tkYXRhLT50ZF9mbGFncy50YXNrX3NlcmlhbCA9PSAxKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBUQ1JfNCh0YXNrZGF0YS0+dGRfaW5jb21wbGV0ZV9jaGlsZF90YXNrcykgPT0gMCApOworCisgICAgdGFza2RhdGEtPnRkX2ZsYWdzLmZyZWVkID0gMTsKKyAgICAvLyBkZWFsbG9jYXRlIHRoZSB0YXNrZGF0YSBhbmQgc2hhcmVkIHZhcmlhYmxlIGJsb2NrcyBhc3NvY2lhdGVkIHdpdGggdGhpcyB0YXNrCisgICAgI2lmIFVTRV9GQVNUX01FTU9SWQorICAgICAgICBfX2ttcF9mYXN0X2ZyZWUoIHRocmVhZCwgdGFza2RhdGEgKTsKKyAgICAjZWxzZSAvKiAhIFVTRV9GQVNUX01FTU9SWSAqLworICAgICAgICBfX2ttcF90aHJlYWRfZnJlZSggdGhyZWFkLCB0YXNrZGF0YSApOworICAgICNlbmRpZgorCisgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfZnJlZV90YXNrOiBUIyVkIGZyZWVkIHRhc2sgJXBcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCB0YXNrZGF0YSkgKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcF9mcmVlX3Rhc2tfYW5kX2FuY2VzdG9yczogZnJlZSB0aGUgY3VycmVudCB0YXNrIGFuZCBhbmNlc3RvcnMgd2l0aG91dCBjaGlsZHJlbgorLy8KKy8vIGd0aWQ6IEdsb2JhbCB0aHJlYWQgSUQgb2YgY2FsbGluZyB0aHJlYWQKKy8vIHRhc2tkYXRhOiB0YXNrIHRvIGZyZWUKKy8vIHRocmVhZDogdGhyZWFkIGRhdGEgc3RydWN0dXJlIG9mIGNhbGxlcgorCitzdGF0aWMgdm9pZAorX19rbXBfZnJlZV90YXNrX2FuZF9hbmNlc3RvcnMoIGttcF9pbnQzMiBndGlkLCBrbXBfdGFza2RhdGFfdCAqIHRhc2tkYXRhLCBrbXBfaW5mb190ICogdGhyZWFkICkKK3sKKyAgICBrbXBfaW50MzIgY2hpbGRyZW4gPSAwOworICAgIGttcF9pbnQzMiB0ZWFtX29yX3Rhc2tpbmdfc2VyaWFsaXplZCA9IHRhc2tkYXRhIC0+IHRkX2ZsYWdzLnRlYW1fc2VyaWFsIHx8IHRhc2tkYXRhIC0+IHRkX2ZsYWdzLnRhc2tpbmdfc2VyOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggdGFza2RhdGEgLT4gdGRfZmxhZ3MudGFza3R5cGUgPT0gVEFTS19FWFBMSUNJVCApOworCisgICAgaWYgKCAhdGVhbV9vcl90YXNraW5nX3NlcmlhbGl6ZWQgKSB7CisgICAgICAgIGNoaWxkcmVuID0gS01QX1RFU1RfVEhFTl9ERUMzMiggKGttcF9pbnQzMiAqKSgmIHRhc2tkYXRhIC0+IHRkX2FsbG9jYXRlZF9jaGlsZF90YXNrcykgKSAtIDE7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGNoaWxkcmVuID49IDAgKTsKKyAgICB9CisKKyAgICAvLyBOb3csIGdvIHVwIHRoZSBhbmNlc3RvciB0cmVlIHRvIHNlZSBpZiBhbnkgYW5jZXN0b3JzIGNhbiBub3cgYmUgZnJlZWQuCisgICAgd2hpbGUgKCBjaGlsZHJlbiA9PSAwICkKKyAgICB7CisgICAgICAgIGttcF90YXNrZGF0YV90ICogcGFyZW50X3Rhc2tkYXRhID0gdGFza2RhdGEgLT4gdGRfcGFyZW50OworCisgICAgICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2ZyZWVfdGFza19hbmRfYW5jZXN0b3JzKGVudGVyKTogVCMlZCB0YXNrICVwIGNvbXBsZXRlICIKKyAgICAgICAgICAgICAgICAgICAgICAiYW5kIGZyZWVpbmcgaXRzZWxmXG4iLCBndGlkLCB0YXNrZGF0YSkgKTsKKworICAgICAgICAvLyAtLS0gRGVhbGxvY2F0ZSBteSBhbmNlc3RvciB0YXNrIC0tLQorICAgICAgICBfX2ttcF9mcmVlX3Rhc2soIGd0aWQsIHRhc2tkYXRhLCB0aHJlYWQgKTsKKworICAgICAgICB0YXNrZGF0YSA9IHBhcmVudF90YXNrZGF0YTsKKworICAgICAgICAvLyBTdG9wIGNoZWNraW5nIGFuY2VzdG9ycyBhdCBpbXBsaWNpdCB0YXNrIG9yIGlmIHRhc2tpbmcgc2VyaWFsaXplZAorICAgICAgICAvLyBpbnN0ZWFkIG9mIHdhbGtpbmcgdXAgYW5jZXN0b3IgdHJlZSB0byBhdm9pZCBwcmVtYXR1cmUgZGVhbGxvY2F0aW9uIG9mIGFuY2VzdG9ycy4KKyAgICAgICAgaWYgKCB0ZWFtX29yX3Rhc2tpbmdfc2VyaWFsaXplZCB8fCB0YXNrZGF0YSAtPiB0ZF9mbGFncy50YXNrdHlwZSA9PSBUQVNLX0lNUExJQ0lUICkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBpZiAoICF0ZWFtX29yX3Rhc2tpbmdfc2VyaWFsaXplZCApIHsKKyAgICAgICAgICAgIC8vIFByZWRlY3JlbWVudCBzaW11bGF0ZWQgYnkgIi0gMSIgY2FsY3VsYXRpb24KKyAgICAgICAgICAgIGNoaWxkcmVuID0gS01QX1RFU1RfVEhFTl9ERUMzMiggKGttcF9pbnQzMiAqKSgmIHRhc2tkYXRhIC0+IHRkX2FsbG9jYXRlZF9jaGlsZF90YXNrcykgKSAtIDE7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBjaGlsZHJlbiA+PSAwICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9mcmVlX3Rhc2tfYW5kX2FuY2VzdG9ycyhleGl0KTogVCMlZCB0YXNrICVwIGhhcyAlZCBjaGlsZHJlbjsgIgorICAgICAgICAgICAgICAgICAgIm5vdCBmcmVlaW5nIGl0IHlldFxuIiwgZ3RpZCwgdGFza2RhdGEsIGNoaWxkcmVuKSApOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBfdGFza19maW5pc2g6IGJvb2trZWVwaW5nIHRvIGRvIHdoZW4gYSB0YXNrIGZpbmlzaGVzIGV4ZWN1dGlvbgorLy8gZ3RpZDogZ2xvYmFsIHRocmVhZCBJRCBmb3IgY2FsbGluZyB0aHJlYWQKKy8vIHRhc2s6IHRhc2sgdG8gYmUgZmluaXNoZWQKKy8vIHJlc3VtZWRfdGFzazogdGFzayB0byBiZSByZXN1bWVkLiAgKG1heSBiZSBOVUxMIGlmIHRhc2sgaXMgc2VyaWFsaXplZCkKKworc3RhdGljIHZvaWQKK19fa21wX3Rhc2tfZmluaXNoKCBrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tfdCAqdGFzaywga21wX3Rhc2tkYXRhX3QgKnJlc3VtZWRfdGFzayApCit7CisgICAga21wX3Rhc2tkYXRhX3QgKiB0YXNrZGF0YSA9IEtNUF9UQVNLX1RPX1RBU0tEQVRBKHRhc2spOworICAgIGttcF9pbmZvX3QgKiB0aHJlYWQgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisgICAga21wX2ludDMyIGNoaWxkcmVuID0gMDsKKworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wX3Rhc2tfZmluaXNoKGVudGVyKTogVCMlZCBmaW5pc2hpbmcgdGFzayAlcCBhbmQgcmVzdW1pbmcgdGFzayAlcFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIHRhc2tkYXRhLCByZXN1bWVkX3Rhc2spICk7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrZGF0YSAtPiB0ZF9mbGFncy50YXNrdHlwZSA9PSBUQVNLX0VYUExJQ0lUICk7CisKKyAgICAvLyBQb3AgdGFzayBmcm9tIHN0YWNrIGlmIHRpZWQKKyNpZmRlZiBCVUlMRF9USUVEX1RBU0tfU1RBQ0sKKyAgICBpZiAoIHRhc2tkYXRhIC0+IHRkX2ZsYWdzLnRpZWRuZXNzID09IFRBU0tfVElFRCApCisgICAgeworICAgICAgICBfX2ttcF9wb3BfdGFza19zdGFjayggZ3RpZCwgdGhyZWFkLCB0YXNrZGF0YSApOworICAgIH0KKyNlbmRpZiAvKiBCVUlMRF9USUVEX1RBU0tfU1RBQ0sgKi8KKworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tkYXRhIC0+IHRkX2ZsYWdzLmNvbXBsZXRlID09IDAgKTsKKyAgICB0YXNrZGF0YSAtPiB0ZF9mbGFncy5jb21wbGV0ZSA9IDE7ICAgLy8gbWFyayB0aGUgdGFzayBhcyBjb21wbGV0ZWQKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrZGF0YSAtPiB0ZF9mbGFncy5zdGFydGVkID09IDEgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrZGF0YSAtPiB0ZF9mbGFncy5mcmVlZCA9PSAwICk7CisKKyAgICAvLyBPbmx5IG5lZWQgdG8ga2VlcCB0cmFjayBvZiBjb3VudCBpZiB0ZWFtIHBhcmFsbGVsIGFuZCB0YXNraW5nIG5vdCBzZXJpYWxpemVkCisgICAgaWYgKCAhKCB0YXNrZGF0YSAtPiB0ZF9mbGFncy50ZWFtX3NlcmlhbCB8fCB0YXNrZGF0YSAtPiB0ZF9mbGFncy50YXNraW5nX3NlciApICkgeworICAgICAgICAvLyBQcmVkZWNyZW1lbnQgc2ltdWxhdGVkIGJ5ICItIDEiIGNhbGN1bGF0aW9uCisgICAgICAgIGNoaWxkcmVuID0gS01QX1RFU1RfVEhFTl9ERUMzMiggKGttcF9pbnQzMiAqKSgmIHRhc2tkYXRhIC0+IHRkX3BhcmVudCAtPiB0ZF9pbmNvbXBsZXRlX2NoaWxkX3Rhc2tzKSApIC0gMTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggY2hpbGRyZW4gPj0gMCApOworI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgIGlmICggdGFza2RhdGEtPnRkX3Rhc2tncm91cCApCisgICAgICAgICAgICBLTVBfVEVTVF9USEVOX0RFQzMyKCAoa21wX2ludDMyICopKCYgdGFza2RhdGEtPnRkX3Rhc2tncm91cC0+Y291bnQpICk7CisgICAgICAgIF9fa21wX3JlbGVhc2VfZGVwcyhndGlkLHRhc2tkYXRhKTsKKyNlbmRpZgorICAgIH0KKworICAgIC8vIHRkX2ZsYWdzLmV4ZWN1dGluZyAgbXVzdCBiZSBtYXJrZWQgYXMgMCBhZnRlciBfX2ttcF9yZWxlYXNlX2RlcHMgaGFzIGJlZW4gY2FsbGVkCisgICAgLy8gT3RoZXJ0d2lzZSwgaWYgYSB0YXNrIGlzIGV4ZWN1dGVkIGltbWVkaWF0ZWx5IGZyb20gdGhlIHJlbGVhc2VfZGVwcyBjb2RlCisgICAgLy8gdGhlIGZsYWcgd2lsbCBiZSByZXNldCB0byAxIGFnYWluIGJ5IHRoaXMgc2FtZSBmdW5jdGlvbgorICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tkYXRhIC0+IHRkX2ZsYWdzLmV4ZWN1dGluZyA9PSAxICk7CisgICAgdGFza2RhdGEgLT4gdGRfZmxhZ3MuZXhlY3V0aW5nID0gMDsgIC8vIHN1c3BlbmQgdGhlIGZpbmlzaGluZyB0YXNrCisKKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF90YXNrX2ZpbmlzaDogVCMlZCBmaW5pc2hlZCB0YXNrICVwLCAlZCBpbmNvbXBsZXRlIGNoaWxkcmVuXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgdGFza2RhdGEsIGNoaWxkcmVuKSApOworCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAvKiBJZiB0aGUgdGFza3MnIGRlc3RydWN0b3IgdGh1bmsgZmxhZyBoYXMgYmVlbiBzZXQsIHdlIG5lZWQgdG8gaW52b2tlIHRoZQorICAgICAgIGRlc3RydWN0b3IgdGh1bmsgdGhhdCBoYXMgYmVlbiBnZW5lcmF0ZWQgYnkgdGhlIGNvbXBpbGVyLgorICAgICAgIFRoZSBjb2RlIGlzIHBsYWNlZCBoZXJlLCBzaW5jZSBhdCB0aGlzIHBvaW50IG90aGVyIHRhc2tzIG1pZ2h0IGhhdmUgYmVlbiByZWxlYXNlZAorICAgICAgIGhlbmNlIG92ZXJsYXBwaW5nIHRoZSBkZXN0cnVjdG9yIGludm9rYXRpb25zIHdpdGggc29tZSBvdGhlciB3b3JrIGluIHRoZQorICAgICAgIHJlbGVhc2VkIHRhc2tzLiAgVGhlIE9wZW5NUCBzcGVjIGlzIG5vdCBzcGVjaWZpYyBvbiB3aGVuIHRoZSBkZXN0cnVjdG9ycyBhcmUKKyAgICAgICBpbnZva2VkLCBzbyB3ZSBzaG91bGQgYmUgZnJlZSB0byBjaG9vc2UuCisgICAgICovCisgICAgaWYgKHRhc2tkYXRhLT50ZF9mbGFncy5kZXN0cnVjdG9yc190aHVuaykgeworICAgICAgICBrbXBfcm91dGluZV9lbnRyeV90IGRlc3RyX3RodW5rID0gdGFzay0+ZGVzdHJ1Y3RvcnM7CisgICAgICAgIEtNUF9BU1NFUlQoZGVzdHJfdGh1bmspOworICAgICAgICBkZXN0cl90aHVuayhndGlkLCB0YXNrKTsKKyAgICB9CisjZW5kaWYgLy8gT01QXzQwX0VOQUJMRUQKKworICAgIC8vIGJvb2trZWVwaW5nIGZvciByZXN1bWluZyB0YXNrOgorICAgIC8vIEdFSCAtIG5vdGUgdGFza2luZ19zZXIgPT4gdGFza19zZXJpYWwKKyAgICBLTVBfREVCVUdfQVNTRVJUKCAodGFza2RhdGEtPnRkX2ZsYWdzLnRhc2tpbmdfc2VyIHx8IHRhc2tkYXRhLT50ZF9mbGFncy50YXNrX3NlcmlhbCkgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgdGFza2RhdGEtPnRkX2ZsYWdzLnRhc2tfc2VyaWFsKTsKKyAgICBpZiAoIHRhc2tkYXRhLT50ZF9mbGFncy50YXNrX3NlcmlhbCApCisgICAgeworICAgICAgICBpZiAocmVzdW1lZF90YXNrID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJlc3VtZWRfdGFzayA9IHRhc2tkYXRhLT50ZF9wYXJlbnQ7ICAvLyBJbiBhIHNlcmlhbGl6ZWQgdGFzaywgdGhlIHJlc3VtZWQgdGFzayBpcyB0aGUgcGFyZW50CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvLyB2ZXJpZnkgcmVzdW1lZCB0YXNrIHBhc3NlZCBpbiBwb2ludHMgdG8gcGFyZW50CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCByZXN1bWVkX3Rhc2sgPT0gdGFza2RhdGEtPnRkX3BhcmVudCApOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCByZXN1bWVkX3Rhc2sgIT0gTlVMTCApOyAgICAgICAgLy8gdmVyaWZ5IHRoYXQgcmVzdW1lZCB0YXNrIGlzIHBhc3NlZCBhcyBhcmd1ZW1udAorICAgIH0KKworICAgIC8vIEZyZWUgdGhpcyB0YXNrIGFuZCB0aGVuIGFuY2VzdG9yIHRhc2tzIGlmIHRoZXkgaGF2ZSBubyBjaGlsZHJlbi4KKyAgICBfX2ttcF9mcmVlX3Rhc2tfYW5kX2FuY2VzdG9ycyhndGlkLCB0YXNrZGF0YSwgdGhyZWFkKTsKKworICAgIF9fa21wX3RocmVhZHNbIGd0aWQgXSAtPiB0aC50aF9jdXJyZW50X3Rhc2sgPSByZXN1bWVkX3Rhc2s7IC8vIHJlc3RvcmUgY3VycmVudF90YXNrCisKKyAgICAvLyBUT0RPOiBHRUggLSBtYWtlIHN1cmUgcm9vdCB0ZWFtIGltcGxpY2l0IHRhc2sgaXMgaW5pdGlhbGl6ZWQgcHJvcGVybHkuCisgICAgLy8gS01QX0RFQlVHX0FTU0VSVCggcmVzdW1lZF90YXNrLT50ZF9mbGFncy5leGVjdXRpbmcgPT0gMCApOworICAgIHJlc3VtZWRfdGFzay0+dGRfZmxhZ3MuZXhlY3V0aW5nID0gMTsgIC8vIHJlc3VtZSBwcmV2aW91cyB0YXNrCisKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcF90YXNrX2ZpbmlzaChleGl0KTogVCMlZCBmaW5pc2hlZCB0YXNrICVwLCByZXN1bWluZyB0YXNrICVwXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgdGFza2RhdGEsIHJlc3VtZWRfdGFzaykgKTsKKworICAgIHJldHVybjsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wY19vbXBfdGFza19jb21wbGV0ZV9pZjA6IHJlcG9ydCB0aGF0IGEgdGFzayBoYXMgY29tcGxldGVkIGV4ZWN1dGlvbgorLy8gbG9jX3JlZjogc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uOyBwb2ludHMgdG8gZW5kIG9mIHRhc2sgYmxvY2suCisvLyBndGlkOiBnbG9iYWwgdGhyZWFkIG51bWJlci4KKy8vIHRhc2s6IHRhc2sgdGh1bmsgZm9yIHRoZSBjb21wbGV0ZWQgdGFzay4KKwordm9pZAorX19rbXBjX29tcF90YXNrX2NvbXBsZXRlX2lmMCggaWRlbnRfdCAqbG9jX3JlZiwga21wX2ludDMyIGd0aWQsIGttcF90YXNrX3QgKnRhc2sgKQoreworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wY19vbXBfdGFza19jb21wbGV0ZV9pZjAoZW50ZXIpOiBUIyVkIGxvYz0lcCB0YXNrPSVwXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgbG9jX3JlZiwgS01QX1RBU0tfVE9fVEFTS0RBVEEodGFzaykgKSApOworCisgICAgX19rbXBfdGFza19maW5pc2goIGd0aWQsIHRhc2ssIE5VTEwgKTsgIC8vIHRoaXMgcm91dGluZSB3aWxsIHByb3ZpZGUgdGFzayB0byByZXN1bWUKKworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wY19vbXBfdGFza19jb21wbGV0ZV9pZjAoZXhpdCk6IFQjJWQgbG9jPSVwIHRhc2s9JXBcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCBsb2NfcmVmLCBLTVBfVEFTS19UT19UQVNLREFUQSh0YXNrKSApICk7CisKKyAgICByZXR1cm47Cit9CisKKyNpZmRlZiBUQVNLX1VOVVNFRAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wY19vbXBfdGFza19jb21wbGV0ZTogcmVwb3J0IHRoYXQgYSB0YXNrIGhhcyBjb21wbGV0ZWQgZXhlY3V0aW9uCisvLyBORVZFUiBHRU5FUkFURUQgQlkgQ09NUElMRVIsIERFUFJFQ0FURUQhISEKKwordm9pZAorX19rbXBjX29tcF90YXNrX2NvbXBsZXRlKCBpZGVudF90ICpsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tfdCAqdGFzayApCit7CisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX29tcF90YXNrX2NvbXBsZXRlKGVudGVyKTogVCMlZCBsb2M9JXAgdGFzaz0lcFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIGxvY19yZWYsIEtNUF9UQVNLX1RPX1RBU0tEQVRBKHRhc2spICkgKTsKKworICAgIF9fa21wX3Rhc2tfZmluaXNoKCBndGlkLCB0YXNrLCBOVUxMICk7ICAvLyBOb3Qgc3VyZSBob3cgdG8gZmluZCB0YXNrIHRvIHJlc3VtZQorCisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX29tcF90YXNrX2NvbXBsZXRlKGV4aXQpOiBUIyVkIGxvYz0lcCB0YXNrPSVwXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgbG9jX3JlZiwgS01QX1RBU0tfVE9fVEFTS0RBVEEodGFzaykgKSApOworICAgIHJldHVybjsKK30KKyNlbmRpZiAvLyBUQVNLX1VOVVNFRAorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBfaW5pdF9pbXBsaWNpdF90YXNrOiBJbml0aWFsaXplIHRoZSBhcHByb3ByaWF0ZSBmaWVsZHMgaW4gdGhlIGltcGxpY2l0IHRhc2sgZm9yIGEgZ2l2ZW4gdGhyZWFkCisvLworLy8gbG9jX3JlZjogIHJlZmVyZW5jZSB0byBzb3VyY2UgbG9jYXRpb24gb2YgcGFyYWxsZWwgcmVnaW9uCisvLyB0aGlzX3RocjogIHRocmVhZCBkYXRhIHN0cnVjdHVyZSBjb3JyZXNwb25kaW5nIHRvIGltcGxpY2l0IHRhc2sKKy8vIHRlYW06IHRlYW0gZm9yIHRoaXNfdGhyCisvLyB0aWQ6IHRocmVhZCBpZCBvZiBnaXZlbiB0aHJlYWQgd2l0aGluIHRlYW0KKy8vIHNldF9jdXJyX3Rhc2s6IFRSVUUgaWYgbmVlZCB0byBwdXNoIGN1cnJlbnQgdGFzayB0byB0aHJlYWQKKy8vIE5PVEU6IFJvdXRpbmUgZG9lcyBub3Qgc2V0IHVwIHRoZSBpbXBsaWNpdCB0YXNrIElDVlMuICBUaGlzIGlzIGFzc3VtZWQgdG8gaGF2ZSBhbHJlYWR5IGJlZW4gZG9uZSBlbHNld2hlcmUuCisvLyBUT0RPOiBHZXQgYmV0dGVyIGxvY19yZWYuICBWYWx1ZSBwYXNzZWQgaW4gbWF5IGJlIE5VTEwKKwordm9pZAorX19rbXBfaW5pdF9pbXBsaWNpdF90YXNrKCBpZGVudF90ICpsb2NfcmVmLCBrbXBfaW5mb190ICp0aGlzX3Rociwga21wX3RlYW1fdCAqdGVhbSwgaW50IHRpZCwgaW50IHNldF9jdXJyX3Rhc2sgKQoreworICAgIGttcF90YXNrZGF0YV90ICogdGFzayAgID0gJiB0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVsgdGlkIF07CisKKyAgICBLRl9UUkFDRSgxMCwgKCJfX2ttcF9pbml0X2ltcGxpY2l0X3Rhc2soZW50ZXIpOiBUIzolZCB0ZWFtPSVwIHRhc2s9JXAsIHJlaW5pdD0lc1xuIiwKKyAgICAgICAgICAgICAgICAgIHRpZCwgdGVhbSwgdGFzaywgc2V0X2N1cnJfdGFzayA/ICJUUlVFIiA6ICJGQUxTRSIgKSApOworCisgICAgdGFzay0+dGRfdGFza19pZCAgPSBLTVBfR0VOX1RBU0tfSUQoKTsKKyAgICB0YXNrLT50ZF90ZWFtICAgICA9IHRlYW07CisvLyAgICB0YXNrLT50ZF9wYXJlbnQgICA9IE5VTEw7ICAvLyBmaXggZm9yIENRMjMwMTAxIChicm9rZW4gcGFyZW50IHRhc2sgaW5mbyBpbiBkZWJ1Z2dlcikKKyAgICB0YXNrLT50ZF9pZGVudCAgICA9IGxvY19yZWY7CisgICAgdGFzay0+dGRfdGFza3dhaXRfaWRlbnQgICA9IE5VTEw7CisgICAgdGFzay0+dGRfdGFza3dhaXRfY291bnRlciA9IDA7CisgICAgdGFzay0+dGRfdGFza3dhaXRfdGhyZWFkICA9IDA7CisKKyAgICB0YXNrLT50ZF9mbGFncy50aWVkbmVzcyAgICA9IFRBU0tfVElFRDsKKyAgICB0YXNrLT50ZF9mbGFncy50YXNrdHlwZSAgICA9IFRBU0tfSU1QTElDSVQ7CisgICAgLy8gQWxsIGltcGxpY2l0IHRhc2tzIGFyZSBleGVjdXRlZCBpbW1lZGlhdGVseSwgbm90IGRlZmVycmVkCisgICAgdGFzay0+dGRfZmxhZ3MudGFza19zZXJpYWwgPSAxOworICAgIHRhc2stPnRkX2ZsYWdzLnRhc2tpbmdfc2VyID0gKCBfX2ttcF90YXNraW5nX21vZGUgPT0gdHNrbV9pbW1lZGlhdGVfZXhlYyApOworICAgIHRhc2stPnRkX2ZsYWdzLnRlYW1fc2VyaWFsID0gKCB0ZWFtLT50LnRfc2VyaWFsaXplZCApID8gMSA6IDA7CisKKyAgICB0YXNrLT50ZF9mbGFncy5zdGFydGVkICAgICA9IDE7CisgICAgdGFzay0+dGRfZmxhZ3MuZXhlY3V0aW5nICAgPSAxOworICAgIHRhc2stPnRkX2ZsYWdzLmNvbXBsZXRlICAgID0gMDsKKyAgICB0YXNrLT50ZF9mbGFncy5mcmVlZCAgICAgICA9IDA7CisKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIHRhc2stPnRkX2RlcGhhc2ggPSBOVUxMOworICAgIHRhc2stPnRkX2RlcG5vZGUgPSBOVUxMOworI2VuZGlmCisKKyAgICBpZiAoc2V0X2N1cnJfdGFzaykgeyAgLy8gb25seSBkbyB0aGlzIGluaXRpYWxpemF0aW9uIHRoZSBmaXJzdCB0aW1lIGEgdGhyZWFkIGlzIGNyZWF0ZWQKKyAgICAgICAgdGFzay0+dGRfaW5jb21wbGV0ZV9jaGlsZF90YXNrcyA9IDA7CisgICAgICAgIHRhc2stPnRkX2FsbG9jYXRlZF9jaGlsZF90YXNrcyAgPSAwOyAvLyBOb3QgdXNlZCBiZWNhdXNlIGRvIG5vdCBuZWVkIHRvIGRlYWxsb2NhdGUgaW1wbGljaXQgdGFzaworI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgIHRhc2stPnRkX3Rhc2tncm91cCA9IE5VTEw7ICAgICAgICAgICAvLyBBbiBpbXBsaWNpdCB0YXNrIGRvZXMgbm90IGhhdmUgdGFza2dyb3VwCisjZW5kaWYKKyAgICAgICAgX19rbXBfcHVzaF9jdXJyZW50X3Rhc2tfdG9fdGhyZWFkKCB0aGlzX3RociwgdGVhbSwgdGlkICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCh0YXNrLT50ZF9pbmNvbXBsZXRlX2NoaWxkX3Rhc2tzID09IDApOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHRhc2stPnRkX2FsbG9jYXRlZF9jaGlsZF90YXNrcyAgPT0gMCk7CisgICAgfQorCisgICAgS0ZfVFJBQ0UoMTAsICgiX19rbXBfaW5pdF9pbXBsaWNpdF90YXNrKGV4aXQpOiBUIzolZCB0ZWFtPSVwIHRhc2s9JXBcbiIsCisgICAgICAgICAgICAgICAgICB0aWQsIHRlYW0sIHRhc2sgKSApOworfQorCisvLyBSb3VuZCB1cCBhIHNpemUgdG8gYSBwb3dlciBvZiB0d28gc3BlY2lmaWVkIGJ5IHZhbAorLy8gVXNlZCB0byBpbnNlcnQgcGFkZGluZyBiZXR3ZWVuIHN0cnVjdHVyZXMgY28tYWxsb2NhdGVkIHVzaW5nIGEgc2luZ2xlIG1hbGxvYygpIGNhbGwKK3N0YXRpYyBzaXplX3QKK19fa21wX3JvdW5kX3VwX3RvX3ZhbCggc2l6ZV90IHNpemUsIHNpemVfdCB2YWwgKSB7CisgICAgaWYgKCBzaXplICYgKCB2YWwgLSAxICkgKSB7CisgICAgICAgIHNpemUgJj0gfiAoIHZhbCAtIDEgKTsKKyAgICAgICAgaWYgKCBzaXplIDw9IEtNUF9TSVpFX1RfTUFYIC0gdmFsICkgeworICAgICAgICAgICAgc2l6ZSArPSB2YWw7ICAgIC8vIFJvdW5kIHVwIGlmIHRoZXJlIGlzIG5vIG92ZXJmbG93LgorICAgICAgICB9OyAvLyBpZgorICAgIH07IC8vIGlmCisgICAgcmV0dXJuIHNpemU7Cit9IC8vIF9fa21wX3JvdW5kX3VwX3RvX3ZhCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wX3Rhc2tfYWxsb2M6IEFsbG9jYXRlIHRoZSB0YXNrZGF0YSBhbmQgdGFzayBkYXRhIHN0cnVjdHVyZXMgZm9yIGEgdGFzaworLy8KKy8vIGxvY19yZWY6IHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbgorLy8gZ3RpZDogZ2xvYmFsIHRocmVhZCBudW1iZXIuCisvLyBmbGFnczogaW5jbHVkZSB0aWVkbmVzcyAmIHRhc2sgdHlwZSAoZXhwbGljaXQgdnMuIGltcGxpY2l0KSBvZiB0aGUgJyduZXcnJyB0YXNrIGVuY291bnRlcmVkLgorLy8gICAgICAgIENvbnZlcnRlZCBmcm9tIGttcF9pbnQzMiB0byBrbXBfdGFza2luZ19mbGFnc190IGluIHJvdXRpbmUuCisvLyBzaXplb2Zfa21wX3Rhc2tfdDogIFNpemUgaW4gYnl0ZXMgb2Yga21wX3Rhc2tfdCBkYXRhIHN0cnVjdHVyZSBpbmNsdWRpbmcgcHJpdmF0ZSB2YXJzIGFjY2Vzc2VkIGluIHRhc2suCisvLyBzaXplb2Zfc2hhcmVkczogIFNpemUgaW4gYnl0ZXMgb2YgYXJyYXkgb2YgcG9pbnRlcnMgdG8gc2hhcmVkIHZhcnMgYWNjZXNzZWQgaW4gdGFzay4KKy8vIHRhc2tfZW50cnk6IFBvaW50ZXIgdG8gdGFzayBjb2RlIGVudHJ5IHBvaW50IGdlbmVyYXRlZCBieSBjb21waWxlci4KKy8vIHJldHVybnM6IGEgcG9pbnRlciB0byB0aGUgYWxsb2NhdGVkIGttcF90YXNrX3Qgc3RydWN0dXJlICh0YXNrKS4KKwora21wX3Rhc2tfdCAqCitfX2ttcF90YXNrX2FsbG9jKCBpZGVudF90ICpsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tpbmdfZmxhZ3NfdCAqZmxhZ3MsCisgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZW9mX2ttcF90YXNrX3QsIHNpemVfdCBzaXplb2Zfc2hhcmVkcywKKyAgICAgICAgICAgICAgICAgIGttcF9yb3V0aW5lX2VudHJ5X3QgdGFza19lbnRyeSApCit7CisgICAga21wX3Rhc2tfdCAqdGFzazsKKyAgICBrbXBfdGFza2RhdGFfdCAqdGFza2RhdGE7CisgICAga21wX2luZm9fdCAqdGhyZWFkID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworICAgIGttcF90ZWFtX3QgKnRlYW0gPSB0aHJlYWQtPnRoLnRoX3RlYW07CisgICAga21wX3Rhc2tkYXRhX3QgKnBhcmVudF90YXNrID0gdGhyZWFkLT50aC50aF9jdXJyZW50X3Rhc2s7CisgICAgc2l6ZV90IHNoYXJlZHNfb2Zmc2V0OworCisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBfdGFza19hbGxvYyhlbnRlcik6IFQjJWQgbG9jPSVwLCBmbGFncz0oMHgleCkgIgorICAgICAgICAgICAgICAgICAgInNpemVvZl90YXNrPSVsZCBzaXplb2Zfc2hhcmVkPSVsZCBlbnRyeT0lcFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIGxvY19yZWYsICooKGttcF9pbnQzMiAqKWZsYWdzKSwgc2l6ZW9mX2ttcF90YXNrX3QsCisgICAgICAgICAgICAgICAgICBzaXplb2Zfc2hhcmVkcywgdGFza19lbnRyeSkgKTsKKworICAgIGlmICggcGFyZW50X3Rhc2stPnRkX2ZsYWdzLmZpbmFsICkgeworICAgICAgICBpZiAoZmxhZ3MtPm1lcmdlZF9pZjApIHsKKyAgICAgICAgfQorICAgICAgICBmbGFncy0+ZmluYWwgPSAxOworICAgIH0KKworICAgIC8vIENhbGN1bGF0ZSBzaGFyZWQgc3RydWN0dXJlIG9mZnNldCBpbmNsdWRpbmcgcGFkZGluZyBhZnRlciBrbXBfdGFza190IHN0cnVjdAorICAgIC8vIHRvIGFsaWduIHBvaW50ZXJzIGluIHNoYXJlZCBzdHJ1Y3QKKyAgICBzaGFyZWRzX29mZnNldCA9IHNpemVvZigga21wX3Rhc2tkYXRhX3QgKSArIHNpemVvZl9rbXBfdGFza190OworICAgIHNoYXJlZHNfb2Zmc2V0ID0gX19rbXBfcm91bmRfdXBfdG9fdmFsKCBzaGFyZWRzX29mZnNldCwgc2l6ZW9mKCB2b2lkICogKSk7CisKKyAgICAvLyBBbGxvY2F0ZSBhIGttcF90YXNrZGF0YV90IGJsb2NrIGFuZCBhIGttcF90YXNrX3QgYmxvY2suCisgICAgS0FfVFJBQ0UoMzAsICgiX19rbXBfdGFza19hbGxvYzogVCMlZCBGaXJzdCBtYWxsb2Mgc2l6ZTogJWxkXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgc2hhcmVkc19vZmZzZXQpICk7CisgICAgS0FfVFJBQ0UoMzAsICgiX19rbXBfdGFza19hbGxvYzogVCMlZCBTZWNvbmQgbWFsbG9jIHNpemU6ICVsZFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIHNpemVvZl9zaGFyZWRzKSApOworCisgICAgLy8gQXZvaWQgZG91YmxlIGFsbG9jYXRpb24gaGVyZSBieSBjb21iaW5pbmcgc2hhcmVkcyB3aXRoIHRhc2tkYXRhCisgICAgI2lmIFVTRV9GQVNUX01FTU9SWQorICAgIHRhc2tkYXRhID0gKGttcF90YXNrZGF0YV90ICopIF9fa21wX2Zhc3RfYWxsb2NhdGUoIHRocmVhZCwgc2hhcmVkc19vZmZzZXQgKyBzaXplb2Zfc2hhcmVkcyApOworICAgICNlbHNlIC8qICEgVVNFX0ZBU1RfTUVNT1JZICovCisgICAgdGFza2RhdGEgPSAoa21wX3Rhc2tkYXRhX3QgKikgX19rbXBfdGhyZWFkX21hbGxvYyggdGhyZWFkLCBzaGFyZWRzX29mZnNldCArIHNpemVvZl9zaGFyZWRzICk7CisgICAgI2VuZGlmIC8qIFVTRV9GQVNUX01FTU9SWSAqLworCisgICAgdGFzayAgICAgICAgICAgICAgICAgICAgICA9IEtNUF9UQVNLREFUQV9UT19UQVNLKHRhc2tkYXRhKTsKKworICAgIC8vIE1ha2Ugc3VyZSB0YXNrICYgdGFza2RhdGEgYXJlIGFsaWduZWQgYXBwcm9wcmlhdGVseQorI2lmIEtNUF9BUkNIX1g4NgorICAgIEtNUF9ERUJVR19BU1NFUlQoICggKChrbXBfdWludHB0cl90KXRhc2tkYXRhKSAmIChzaXplb2YoZG91YmxlKS0xKSApID09IDAgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCAoICgoa21wX3VpbnRwdHJfdCl0YXNrKSAmIChzaXplb2YoZG91YmxlKS0xKSApID09IDAgKTsKKyNlbHNlCisgICAgS01QX0RFQlVHX0FTU0VSVCggKCAoKGttcF91aW50cHRyX3QpdGFza2RhdGEpICYgKHNpemVvZihfUXVhZCktMSkgKSA9PSAwICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggKCAoKGttcF91aW50cHRyX3QpdGFzaykgJiAoc2l6ZW9mKF9RdWFkKS0xKSApID09IDAgKTsKKyNlbmRpZgorICAgIGlmIChzaXplb2Zfc2hhcmVkcyA+IDApIHsKKyAgICAgICAgLy8gQXZvaWQgZG91YmxlIGFsbG9jYXRpb24gaGVyZSBieSBjb21iaW5pbmcgc2hhcmVkcyB3aXRoIHRhc2tkYXRhCisgICAgICAgIHRhc2stPnNoYXJlZHMgICAgICAgICA9ICYgKChjaGFyICopIHRhc2tkYXRhKVsgc2hhcmVkc19vZmZzZXQgXTsKKyAgICAgICAgLy8gTWFrZSBzdXJlIHNoYXJlZHMgc3RydWN0IGlzIGFsaWduZWQgdG8gcG9pbnRlciBzaXplCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoICggKChrbXBfdWludHB0cl90KXRhc2stPnNoYXJlZHMpICYgKHNpemVvZih2b2lkICopLTEpICkgPT0gMCApOworICAgIH0gZWxzZSB7CisgICAgICAgIHRhc2stPnNoYXJlZHMgICAgICAgICA9IE5VTEw7CisgICAgfQorICAgIHRhc2stPnJvdXRpbmUgICAgICAgICAgICAgPSB0YXNrX2VudHJ5OworICAgIHRhc2stPnBhcnRfaWQgICAgICAgICAgICAgPSAwOyAgICAgIC8vIEFDOiBBbHdheXMgc3RhcnQgd2l0aCAwIHBhcnQgaWQKKworICAgIHRhc2tkYXRhLT50ZF90YXNrX2lkICAgICAgPSBLTVBfR0VOX1RBU0tfSUQoKTsKKyAgICB0YXNrZGF0YS0+dGRfdGVhbSAgICAgICAgID0gdGVhbTsKKyAgICB0YXNrZGF0YS0+dGRfYWxsb2NfdGhyZWFkID0gdGhyZWFkOworICAgIHRhc2tkYXRhLT50ZF9wYXJlbnQgICAgICAgPSBwYXJlbnRfdGFzazsKKyAgICB0YXNrZGF0YS0+dGRfbGV2ZWwgICAgICAgID0gcGFyZW50X3Rhc2stPnRkX2xldmVsICsgMTsgLy8gaW5jcmVtZW50IG5lc3RpbmcgbGV2ZWwKKyAgICB0YXNrZGF0YS0+dGRfaWRlbnQgICAgICAgID0gbG9jX3JlZjsKKyAgICB0YXNrZGF0YS0+dGRfdGFza3dhaXRfaWRlbnQgICA9IE5VTEw7CisgICAgdGFza2RhdGEtPnRkX3Rhc2t3YWl0X2NvdW50ZXIgPSAwOworICAgIHRhc2tkYXRhLT50ZF90YXNrd2FpdF90aHJlYWQgID0gMDsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrZGF0YS0+dGRfcGFyZW50ICE9IE5VTEwgKTsKKyAgICBjb3B5X2ljdnMoICZ0YXNrZGF0YS0+dGRfaWN2cywgJnRhc2tkYXRhLT50ZF9wYXJlbnQtPnRkX2ljdnMgKTsKKworICAgIHRhc2tkYXRhLT50ZF9mbGFncy50aWVkbmVzcyAgICA9IGZsYWdzLT50aWVkbmVzczsKKyAgICB0YXNrZGF0YS0+dGRfZmxhZ3MuZmluYWwgICAgICAgPSBmbGFncy0+ZmluYWw7CisgICAgdGFza2RhdGEtPnRkX2ZsYWdzLm1lcmdlZF9pZjAgID0gZmxhZ3MtPm1lcmdlZF9pZjA7CisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICB0YXNrZGF0YS0+dGRfZmxhZ3MuZGVzdHJ1Y3RvcnNfdGh1bmsgPSBmbGFncy0+ZGVzdHJ1Y3RvcnNfdGh1bms7CisjZW5kaWYgLy8gT01QXzQwX0VOQUJMRUQKKyAgICB0YXNrZGF0YS0+dGRfZmxhZ3MudGFza3R5cGUgICAgPSBUQVNLX0VYUExJQ0lUOworCisgICAgLy8gR0VIIC0gVE9ETzogZml4IHRoaXMgdG8gY29weSBwYXJlbnQgdGFzaydzIHZhbHVlIG9mIHRhc2tpbmdfc2VyIGZsYWcKKyAgICB0YXNrZGF0YS0+dGRfZmxhZ3MudGFza2luZ19zZXIgPSAoIF9fa21wX3Rhc2tpbmdfbW9kZSA9PSB0c2ttX2ltbWVkaWF0ZV9leGVjICk7CisKKyAgICAvLyBHRUggLSBUT0RPOiBmaXggdGhpcyB0byBjb3B5IHBhcmVudCB0YXNrJ3MgdmFsdWUgb2YgdGVhbV9zZXJpYWwgZmxhZworICAgIHRhc2tkYXRhLT50ZF9mbGFncy50ZWFtX3NlcmlhbCA9ICggdGVhbS0+dC50X3NlcmlhbGl6ZWQgKSA/IDEgOiAwOworCisgICAgLy8gR0VIIC0gTm90ZSB3ZSBzZXJpYWxpemUgdGhlIHRhc2sgaWYgdGhlIHRlYW0gaXMgc2VyaWFsaXplZCB0byBtYWtlIHN1cmUgaW1wbGljaXQgcGFyYWxsZWwgcmVnaW9uCisgICAgLy8gICAgICAgdGFza3MgYXJlIG5vdCBsZWZ0IHVudGlsIHByb2dyYW0gdGVybWluYXRpb24gdG8gZXhlY3V0ZS4gIEFsc28sIGl0IGhlbHBzIGxvY2FsaXR5IHRvIGV4ZWN1dGUKKyAgICAvLyAgICAgICBpbW1lZGlhdGVseS4KKyAgICB0YXNrZGF0YS0+dGRfZmxhZ3MudGFza19zZXJpYWwgPSAoIHRhc2tkYXRhLT50ZF9mbGFncy5maW5hbAorICAgICAgfHwgdGFza2RhdGEtPnRkX2ZsYWdzLnRlYW1fc2VyaWFsIHx8IHRhc2tkYXRhLT50ZF9mbGFncy50YXNraW5nX3NlciApOworCisgICAgdGFza2RhdGEtPnRkX2ZsYWdzLnN0YXJ0ZWQgICAgID0gMDsKKyAgICB0YXNrZGF0YS0+dGRfZmxhZ3MuZXhlY3V0aW5nICAgPSAwOworICAgIHRhc2tkYXRhLT50ZF9mbGFncy5jb21wbGV0ZSAgICA9IDA7CisgICAgdGFza2RhdGEtPnRkX2ZsYWdzLmZyZWVkICAgICAgID0gMDsKKworICAgIHRhc2tkYXRhLT50ZF9mbGFncy5uYXRpdmUgICAgICA9IGZsYWdzLT5uYXRpdmU7CisKKyAgICB0YXNrZGF0YS0+dGRfaW5jb21wbGV0ZV9jaGlsZF90YXNrcyA9IDA7CisgICAgdGFza2RhdGEtPnRkX2FsbG9jYXRlZF9jaGlsZF90YXNrcyAgPSAxOyAvLyBzdGFydCBhdCBvbmUgYmVjYXVzZSBjb3VudHMgY3VycmVudCB0YXNrIGFuZCBjaGlsZHJlbgorI2lmIE9NUF80MF9FTkFCTEVECisgICAgdGFza2RhdGEtPnRkX3Rhc2tncm91cCA9IHBhcmVudF90YXNrLT50ZF90YXNrZ3JvdXA7IC8vIHRhc2sgaW5oZXJpdHMgdGhlIHRhc2tncm91cCBmcm9tIHRoZSBwYXJlbnQgdGFzaworICAgIHRhc2tkYXRhLT50ZF9kZXBoYXNoID0gTlVMTDsKKyAgICB0YXNrZGF0YS0+dGRfZGVwbm9kZSA9IE5VTEw7CisjZW5kaWYKKyAgICAvLyBPbmx5IG5lZWQgdG8ga2VlcCB0cmFjayBvZiBjaGlsZCB0YXNrIGNvdW50cyBpZiB0ZWFtIHBhcmFsbGVsIGFuZCB0YXNraW5nIG5vdCBzZXJpYWxpemVkCisgICAgaWYgKCAhKCB0YXNrZGF0YSAtPiB0ZF9mbGFncy50ZWFtX3NlcmlhbCB8fCB0YXNrZGF0YSAtPiB0ZF9mbGFncy50YXNraW5nX3NlciApICkgeworICAgICAgICBLTVBfVEVTVF9USEVOX0lOQzMyKCAoa21wX2ludDMyICopKCYgcGFyZW50X3Rhc2stPnRkX2luY29tcGxldGVfY2hpbGRfdGFza3MpICk7CisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgaWYgKCBwYXJlbnRfdGFzay0+dGRfdGFza2dyb3VwICkKKyAgICAgICAgICAgIEtNUF9URVNUX1RIRU5fSU5DMzIoIChrbXBfaW50MzIgKikoJiBwYXJlbnRfdGFzay0+dGRfdGFza2dyb3VwLT5jb3VudCkgKTsKKyNlbmRpZgorICAgICAgICAvLyBPbmx5IG5lZWQgdG8ga2VlcCB0cmFjayBvZiBhbGxvY2F0ZWQgY2hpbGQgdGFza3MgZm9yIGV4cGxpY2l0IHRhc2tzIHNpbmNlIGltcGxpY2l0IG5vdCBkZWFsbG9jYXRlZAorICAgICAgICBpZiAoIHRhc2tkYXRhLT50ZF9wYXJlbnQtPnRkX2ZsYWdzLnRhc2t0eXBlID09IFRBU0tfRVhQTElDSVQgKSB7CisgICAgICAgICAgICBLTVBfVEVTVF9USEVOX0lOQzMyKCAoa21wX2ludDMyICopKCYgdGFza2RhdGEtPnRkX3BhcmVudC0+dGRfYWxsb2NhdGVkX2NoaWxkX3Rhc2tzKSApOworICAgICAgICB9CisgICAgfQorCisgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfdGFza19hbGxvYyhleGl0KTogVCMlZCBjcmVhdGVkIHRhc2sgJXAgcGFyZW50PSVwXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgdGFza2RhdGEsIHRhc2tkYXRhLT50ZF9wYXJlbnQpICk7CisKKyAgICByZXR1cm4gdGFzazsKK30KKworCitrbXBfdGFza190ICoKK19fa21wY19vbXBfdGFza19hbGxvYyggaWRlbnRfdCAqbG9jX3JlZiwga21wX2ludDMyIGd0aWQsIGttcF9pbnQzMiBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemVvZl9rbXBfdGFza190LCBzaXplX3Qgc2l6ZW9mX3NoYXJlZHMsCisgICAgICAgICAgICAgICAgICAgICAgIGttcF9yb3V0aW5lX2VudHJ5X3QgdGFza19lbnRyeSApCit7CisgICAga21wX3Rhc2tfdCAqcmV0dmFsOworICAgIGttcF90YXNraW5nX2ZsYWdzX3QgKmlucHV0X2ZsYWdzID0gKGttcF90YXNraW5nX2ZsYWdzX3QgKikgJiBmbGFnczsKKworICAgIGlucHV0X2ZsYWdzLT5uYXRpdmUgPSBGQUxTRTsKKyAgICAvLyBfX2ttcF90YXNrX2FsbG9jKCkgc2V0cyB1cCBhbGwgb3RoZXIgcnVudGltZSBmbGFncworCisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX29tcF90YXNrX2FsbG9jKGVudGVyKTogVCMlZCBsb2M9JXAsIGZsYWdzPSglcykgIgorICAgICAgICAgICAgICAgICAgInNpemVvZl90YXNrPSVsZCBzaXplb2Zfc2hhcmVkPSVsZCBlbnRyeT0lcFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIGxvY19yZWYsIGlucHV0X2ZsYWdzLT50aWVkbmVzcyA/ICJ0aWVkICAiIDogInVudGllZCIsCisgICAgICAgICAgICAgICAgICBzaXplb2Zfa21wX3Rhc2tfdCwgc2l6ZW9mX3NoYXJlZHMsIHRhc2tfZW50cnkpICk7CisKKyAgICByZXR2YWwgPSBfX2ttcF90YXNrX2FsbG9jKCBsb2NfcmVmLCBndGlkLCBpbnB1dF9mbGFncywgc2l6ZW9mX2ttcF90YXNrX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mX3NoYXJlZHMsIHRhc2tfZW50cnkgKTsKKworICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wY19vbXBfdGFza19hbGxvYyhleGl0KTogVCMlZCByZXR2YWwgJXBcbiIsIGd0aWQsIHJldHZhbCkgKTsKKworICAgIHJldHVybiByZXR2YWw7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBfX2ttcF9pbnZva2VfdGFzazogaW52b2tlIHRoZSBzcGVjaWZpZWQgdGFzaworLy8KKy8vIGd0aWQ6IGdsb2JhbCB0aHJlYWQgSUQgb2YgY2FsbGVyCisvLyB0YXNrOiB0aGUgdGFzayB0byBpbnZva2UKKy8vIGN1cnJlbnRfdGFzazogdGhlIHRhc2sgdG8gcmVzdW1lIGFmdGVyIHRhc2sgaW52b2thdGlvbgorCitzdGF0aWMgdm9pZAorX19rbXBfaW52b2tlX3Rhc2soIGttcF9pbnQzMiBndGlkLCBrbXBfdGFza190ICp0YXNrLCBrbXBfdGFza2RhdGFfdCAqIGN1cnJlbnRfdGFzayApCit7CisgICAga21wX3Rhc2tkYXRhX3QgKiB0YXNrZGF0YSA9IEtNUF9UQVNLX1RPX1RBU0tEQVRBKHRhc2spOworI2lmIE9NUF80MF9FTkFCTEVECisgICAgaW50IGRpc2NhcmQgPSAwIC8qIGZhbHNlICovOworI2VuZGlmCisgICAgS0FfVFJBQ0UoMzAsICgiX19rbXBfaW52b2tlX3Rhc2soZW50ZXIpOiBUIyVkIGludm9raW5nIHRhc2sgJXAsIGN1cnJlbnRfdGFzaz0lcFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIHRhc2tkYXRhLCBjdXJyZW50X3Rhc2spICk7CisKKyAgICBfX2ttcF90YXNrX3N0YXJ0KCBndGlkLCB0YXNrLCBjdXJyZW50X3Rhc2sgKTsKKworI2lmIE9NUF80MF9FTkFCTEVECisgICAgLy8gVE9ETzogY2FuY2VsIHRhc2tzIGlmIHRoZSBwYXJhbGxlbCByZWdpb24gaGFzIGFsc28gYmVlbiBjYW5jZWxsZWQKKyAgICAvLyBUT0RPOiBjaGVjayBpZiB0aGlzIHNlcXVlbmNlIGNhbiBiZSBob2lzdGVkIGFib3ZlIF9fa21wX3Rhc2tfc3RhcnQKKyAgICAvLyBpZiBjYW5jZWxsYXRpb24gaGFzIGJlZW4gZW5hYmxlZCBmb3IgdGhpcyBydW4gLi4uCisgICAgaWYgKF9fa21wX29tcF9jYW5jZWxsYXRpb24pIHsKKyAgICAgICAga21wX2luZm9fdCAqdGhpc190aHIgPSBfX2ttcF90aHJlYWRzIFsgZ3RpZCBdOworICAgICAgICBrbXBfdGVhbV90ICogdGhpc190ZWFtID0gdGhpc190aHItPnRoLnRoX3RlYW07CisgICAgICAgIGttcF90YXNrZ3JvdXBfdCAqIHRhc2tncm91cCA9IHRhc2tkYXRhLT50ZF90YXNrZ3JvdXA7CisgICAgICAgIGlmICgodGFza2dyb3VwICYmIHRhc2tncm91cC0+Y2FuY2VsX3JlcXVlc3QpIHx8ICh0aGlzX3RlYW0tPnQudF9jYW5jZWxfcmVxdWVzdCA9PSBjYW5jZWxfcGFyYWxsZWwpKSB7CisgICAgICAgICAgICAvLyB0aGlzIHRhc2sgYmVsb25ncyB0byBhIHRhc2sgZ3JvdXAgYW5kIHdlIG5lZWQgdG8gY2FuY2VsIGl0CisgICAgICAgICAgICBkaXNjYXJkID0gMSAvKiB0cnVlICovOworICAgICAgICB9CisgICAgfQorCisgICAgLy8KKyAgICAvLyBJbnZva2UgdGhlIHRhc2sgcm91dGluZSBhbmQgcGFzcyBpbiByZWxldmFudCBkYXRhLgorICAgIC8vIFRodW5rcyBnZW5lcmF0ZWQgYnkgZ2NjIHRha2UgYSBkaWZmZXJlbnQgYXJndW1lbnQgbGlzdC4KKyAgICAvLworICAgIGlmICghZGlzY2FyZCkgeworI2VuZGlmIC8vIE9NUF80MF9FTkFCTEVECisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisgICAgICAgIGlmICh0YXNrZGF0YS0+dGRfZmxhZ3MubmF0aXZlKSB7CisgICAgICAgICAgICAoKHZvaWQgKCopKHZvaWQgKikpKCoodGFzay0+cm91dGluZSkpKSh0YXNrLT5zaGFyZWRzKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisgICAgICAgIHsKKyAgICAgICAgICAgICgqKHRhc2stPnJvdXRpbmUpKShndGlkLCB0YXNrKTsKKyAgICAgICAgfQorI2lmIE9NUF80MF9FTkFCTEVECisgICAgfQorI2VuZGlmIC8vIE9NUF80MF9FTkFCTEVECisKKyAgICBfX2ttcF90YXNrX2ZpbmlzaCggZ3RpZCwgdGFzaywgY3VycmVudF90YXNrICk7CisKKyAgICBLQV9UUkFDRSgzMCwgKCJfX2ttcF9pbm92a2VfdGFzayhleGl0KTogVCMlZCBjb21wbGV0ZWQgdGFzayAlcCwgcmVzdW1pbmcgdGFzayAlcFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIHRhc2tkYXRhLCBjdXJyZW50X3Rhc2spICk7CisgICAgcmV0dXJuOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcGNfb21wX3Rhc2tfcGFydHM6IFNjaGVkdWxlIGEgdGhyZWFkLXN3aXRjaGFibGUgdGFzayBmb3IgZXhlY3V0aW9uCisvLworLy8gbG9jX3JlZjogbG9jYXRpb24gb2Ygb3JpZ2luYWwgdGFzayBwcmFnbWEgKGlnbm9yZWQpCisvLyBndGlkOiBHbG9iYWwgVGhyZWFkIElEIG9mIGVuY291bnRlcmluZyB0aHJlYWQKKy8vIG5ld190YXNrOiB0YXNrIHRodW5rIGFsbG9jYXRlZCBieSBfX2ttcF9vbXBfdGFza19hbGxvYygpIGZvciB0aGUgJyduZXcgdGFzaycnCisvLyBSZXR1cm5zOgorLy8gICAgVEFTS19DVVJSRU5UX05PVF9RVUVVRUQgKDApIGlmIGRpZCBub3Qgc3VzcGVuZCBhbmQgcXVldWUgY3VycmVudCB0YXNrIHRvIGJlIHJlc3VtZWQgbGF0ZXIuCisvLyAgICBUQVNLX0NVUlJFTlRfUVVFVUVEICgxKSBpZiBzdXNwZW5kZWQgYW5kIHF1ZXVlZCB0aGUgY3VycmVudCB0YXNrIHRvIGJlIHJlc3VtZWQgbGF0ZXIuCisKK2ttcF9pbnQzMgorX19rbXBjX29tcF90YXNrX3BhcnRzKCBpZGVudF90ICpsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tfdCAqIG5ld190YXNrKQoreworICAgIGttcF90YXNrZGF0YV90ICogbmV3X3Rhc2tkYXRhID0gS01QX1RBU0tfVE9fVEFTS0RBVEEobmV3X3Rhc2spOworCisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX29tcF90YXNrX3BhcnRzKGVudGVyKTogVCMlZCBsb2M9JXAgdGFzaz0lcFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIGxvY19yZWYsIG5ld190YXNrZGF0YSApICk7CisKKyAgICAvKiBTaG91bGQgd2UgZXhlY3V0ZSB0aGUgbmV3IHRhc2sgb3IgcXVldWUgaXQ/ICAgRm9yIG5vdywgbGV0J3MganVzdCBhbHdheXMgdHJ5IHRvCisgICAgICAgcXVldWUgaXQuICBJZiB0aGUgcXVldWUgZmlsbHMgdXAsIHRoZW4gd2UnbGwgZXhlY3V0ZSBpdC4gICovCisKKyAgICBpZiAoIF9fa21wX3B1c2hfdGFzayggZ3RpZCwgbmV3X3Rhc2sgKSA9PSBUQVNLX05PVF9QVVNIRUQgKSAvLyBpZiBjYW5ub3QgZGVmZXIKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFeGVjdXRlIHRoaXMgdGFzayBpbW1lZGlhdGVseQorICAgICAgICBrbXBfdGFza2RhdGFfdCAqIGN1cnJlbnRfdGFzayA9IF9fa21wX3RocmVhZHNbIGd0aWQgXSAtPiB0aC50aF9jdXJyZW50X3Rhc2s7CisgICAgICAgIG5ld190YXNrZGF0YS0+dGRfZmxhZ3MudGFza19zZXJpYWwgPSAxOworICAgICAgICBfX2ttcF9pbnZva2VfdGFzayggZ3RpZCwgbmV3X3Rhc2ssIGN1cnJlbnRfdGFzayApOworICAgIH0KKworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wY19vbXBfdGFza19wYXJ0cyhleGl0KTogVCMlZCByZXR1cm5pbmcgVEFTS19DVVJSRU5UX05PVF9RVUVVRUQ6ICIKKyAgICAgICAgICAgICAgICAgICJsb2M9JXAgdGFzaz0lcCwgcmV0dXJuOiBUQVNLX0NVUlJFTlRfTk9UX1FVRVVFRFxuIiwgZ3RpZCwgbG9jX3JlZiwKKyAgICAgICAgICAgICAgICAgIG5ld190YXNrZGF0YSApICk7CisKKyAgICByZXR1cm4gVEFTS19DVVJSRU5UX05PVF9RVUVVRUQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcF9vbXBfdGFzazogU2NoZWR1bGUgYSBub24tdGhyZWFkLXN3aXRjaGFibGUgdGFzayBmb3IgZXhlY3V0aW9uCisvLyBndGlkOiBHbG9iYWwgVGhyZWFkIElEIG9mIGVuY291bnRlcmluZyB0aHJlYWQKKy8vIG5ld190YXNrOiBub24tdGhyZWFkLXN3aXRjaGFibGUgdGFzayB0aHVuayBhbGxvY2F0ZWQgYnkgX19rbXBfb21wX3Rhc2tfYWxsb2MoKQorLy8gc2VyaWFsaXplX2ltbWVkaWF0ZTogaWYgVFJVRSB0aGVuIGlmIHRoZSB0YXNrIGlzIGV4ZWN1dGVkIGltbWVkaWF0ZWx5IGl0cyBleGVjdXRpb24gd2lsbCBiZSBzZXJpYWxpemVkCisvLyByZXR1cm5zOgorLy8KKy8vICAgIFRBU0tfQ1VSUkVOVF9OT1RfUVVFVUVEICgwKSBpZiBkaWQgbm90IHN1c3BlbmQgYW5kIHF1ZXVlIGN1cnJlbnQgdGFzayB0byBiZSByZXN1bWVkIGxhdGVyLgorLy8gICAgVEFTS19DVVJSRU5UX1FVRVVFRCAoMSkgaWYgc3VzcGVuZGVkIGFuZCBxdWV1ZWQgdGhlIGN1cnJlbnQgdGFzayB0byBiZSByZXN1bWVkIGxhdGVyLgora21wX2ludDMyCitfX2ttcF9vbXBfdGFzaygga21wX2ludDMyIGd0aWQsIGttcF90YXNrX3QgKiBuZXdfdGFzaywgYm9vbCBzZXJpYWxpemVfaW1tZWRpYXRlICkKK3sKKyAgICBrbXBfdGFza2RhdGFfdCAqIG5ld190YXNrZGF0YSA9IEtNUF9UQVNLX1RPX1RBU0tEQVRBKG5ld190YXNrKTsKKworICAgIC8qIFNob3VsZCB3ZSBleGVjdXRlIHRoZSBuZXcgdGFzayBvciBxdWV1ZSBpdD8gICBGb3Igbm93LCBsZXQncyBqdXN0IGFsd2F5cyB0cnkgdG8KKyAgICAgICBxdWV1ZSBpdC4gIElmIHRoZSBxdWV1ZSBmaWxscyB1cCwgdGhlbiB3ZSdsbCBleGVjdXRlIGl0LiAgKi8KKworICAgIGlmICggX19rbXBfcHVzaF90YXNrKCBndGlkLCBuZXdfdGFzayApID09IFRBU0tfTk9UX1BVU0hFRCApIC8vIGlmIGNhbm5vdCBkZWZlcgorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV4ZWN1dGUgdGhpcyB0YXNrIGltbWVkaWF0ZWx5CisgICAgICAgIGttcF90YXNrZGF0YV90ICogY3VycmVudF90YXNrID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdIC0+IHRoLnRoX2N1cnJlbnRfdGFzazsKKyAgICAgICAgaWYgKCBzZXJpYWxpemVfaW1tZWRpYXRlICkKKyAgICAgICAgICBuZXdfdGFza2RhdGEgLT4gdGRfZmxhZ3MudGFza19zZXJpYWwgPSAxOworICAgICAgICBfX2ttcF9pbnZva2VfdGFzayggZ3RpZCwgbmV3X3Rhc2ssIGN1cnJlbnRfdGFzayApOworICAgIH0KKworCisgICAgcmV0dXJuIFRBU0tfQ1VSUkVOVF9OT1RfUVVFVUVEOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBjX29tcF90YXNrOiBXcmFwcGVyIGFyb3VuZCBfX2ttcF9vbXBfdGFzayB0byBzY2hlZHVsZSBhIG5vbi10aHJlYWQtc3dpdGNoYWJsZSB0YXNrIGZyb20KKy8vIHRoZSBwYXJlbnQgdGhyZWFkIG9ubHkhCisvLyBsb2NfcmVmOiBsb2NhdGlvbiBvZiBvcmlnaW5hbCB0YXNrIHByYWdtYSAoaWdub3JlZCkKKy8vIGd0aWQ6IEdsb2JhbCBUaHJlYWQgSUQgb2YgZW5jb3VudGVyaW5nIHRocmVhZAorLy8gbmV3X3Rhc2s6IG5vbi10aHJlYWQtc3dpdGNoYWJsZSB0YXNrIHRodW5rIGFsbG9jYXRlZCBieSBfX2ttcF9vbXBfdGFza19hbGxvYygpCisvLyByZXR1cm5zOgorLy8KKy8vICAgIFRBU0tfQ1VSUkVOVF9OT1RfUVVFVUVEICgwKSBpZiBkaWQgbm90IHN1c3BlbmQgYW5kIHF1ZXVlIGN1cnJlbnQgdGFzayB0byBiZSByZXN1bWVkIGxhdGVyLgorLy8gICAgVEFTS19DVVJSRU5UX1FVRVVFRCAoMSkgaWYgc3VzcGVuZGVkIGFuZCBxdWV1ZWQgdGhlIGN1cnJlbnQgdGFzayB0byBiZSByZXN1bWVkIGxhdGVyLgorCitrbXBfaW50MzIKK19fa21wY19vbXBfdGFzayggaWRlbnRfdCAqbG9jX3JlZiwga21wX2ludDMyIGd0aWQsIGttcF90YXNrX3QgKiBuZXdfdGFzaykKK3sKKyAgICBrbXBfdGFza2RhdGFfdCAqIG5ld190YXNrZGF0YSA9IEtNUF9UQVNLX1RPX1RBU0tEQVRBKG5ld190YXNrKTsKKyAgICBrbXBfaW50MzIgcmVzOworCisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX29tcF90YXNrKGVudGVyKTogVCMlZCBsb2M9JXAgdGFzaz0lcFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIGxvY19yZWYsIG5ld190YXNrZGF0YSApICk7CisKKyAgICByZXMgPSAgX19rbXBfb21wX3Rhc2soZ3RpZCxuZXdfdGFzayx0cnVlKTsKKworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wY19vbXBfdGFzayhleGl0KTogVCMlZCByZXR1cm5pbmcgVEFTS19DVVJSRU5UX05PVF9RVUVVRUQ6IGxvYz0lcCB0YXNrPSVwXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgbG9jX3JlZiwgbmV3X3Rhc2tkYXRhICkgKTsKKyAgICByZXR1cm4gcmVzOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wY19vbXBfdGFza3dhaXQ6IFdhaXQgdW50aWwgYWxsIHRhc2tzIGdlbmVyYXRlZCBieSB0aGUgY3VycmVudCB0YXNrIGFyZSBjb21wbGV0ZQorCitrbXBfaW50MzIKK19fa21wY19vbXBfdGFza3dhaXQoIGlkZW50X3QgKmxvY19yZWYsIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBrbXBfdGFza2RhdGFfdCAqIHRhc2tkYXRhOworICAgIGttcF9pbmZvX3QgKiB0aHJlYWQ7CisgICAgaW50IHRocmVhZF9maW5pc2hlZCA9IEZBTFNFOworCisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX29tcF90YXNrd2FpdChlbnRlcik6IFQjJWQgbG9jPSVwXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgbG9jX3JlZikgKTsKKworICAgIGlmICggX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMgKSB7CisgICAgICAgIC8vIEdFSCBUT0RPOiBzaG91bGRuJ3Qgd2UgaGF2ZSBzb21lIHNvcnQgb2YgT01QUkFQIEFQSSBjYWxscyBoZXJlIHRvIG1hcmsgYmVnaW4gd2FpdD8KKworICAgICAgICB0aHJlYWQgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisgICAgICAgIHRhc2tkYXRhID0gdGhyZWFkIC0+IHRoLnRoX2N1cnJlbnRfdGFzazsKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgIC8vIE5vdGU6IFRoZXNlIHZhbHVlcyBhcmUgdXNlZCBieSBJVFQgZXZlbnRzIGFzIHdlbGwuCisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworICAgICAgICB0YXNrZGF0YS0+dGRfdGFza3dhaXRfY291bnRlciArPSAxOworICAgICAgICB0YXNrZGF0YS0+dGRfdGFza3dhaXRfaWRlbnQgICAgPSBsb2NfcmVmOworICAgICAgICB0YXNrZGF0YS0+dGRfdGFza3dhaXRfdGhyZWFkICAgPSBndGlkICsgMTsKKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgdm9pZCAqIGl0dF9zeW5jX29iaiA9IF9fa21wX2l0dF90YXNrd2FpdF9vYmplY3QoIGd0aWQgKTsKKyAgICAgICAgaWYgKCBpdHRfc3luY19vYmogIT0gTlVMTCApCisgICAgICAgICAgICBfX2ttcF9pdHRfdGFza3dhaXRfc3RhcnRpbmcoIGd0aWQsIGl0dF9zeW5jX29iaiApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgICAgICBpZiAoICEgdGFza2RhdGEtPnRkX2ZsYWdzLnRlYW1fc2VyaWFsICkgeworICAgICAgICAgICAgLy8gR0VIOiBpZiB0ZWFtIHNlcmlhbGl6ZWQsIGF2b2lkIHJlYWRpbmcgdGhlIHZvbGF0aWxlIHZhcmlhYmxlIGJlbG93LgorICAgICAgICAgICAga21wX2ZsYWdfMzIgZmxhZygmKHRhc2tkYXRhLT50ZF9pbmNvbXBsZXRlX2NoaWxkX3Rhc2tzKSwgMFUpOworICAgICAgICAgICAgd2hpbGUgKCBUQ1JfNCh0YXNrZGF0YSAtPiB0ZF9pbmNvbXBsZXRlX2NoaWxkX3Rhc2tzKSAhPSAwICkgeworICAgICAgICAgICAgICAgIGZsYWcuZXhlY3V0ZV90YXNrcyh0aHJlYWQsIGd0aWQsIEZBTFNFLCAmdGhyZWFkX2ZpbmlzaGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaiksIF9fa21wX3Rhc2tfc3RlYWxpbmdfY29uc3RyYWludCApOworICAgICAgICAgICAgfQorICAgICAgICB9CisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICBpZiAoIGl0dF9zeW5jX29iaiAhPSBOVUxMICkKKyAgICAgICAgICAgIF9fa21wX2l0dF90YXNrd2FpdF9maW5pc2hlZCggZ3RpZCwgaXR0X3N5bmNfb2JqICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgICAgICAgIC8vIEdFSCBUT0RPOiBzaG91bGRuJ3Qgd2UgaGF2ZSBzb21lIHNvcnQgb2YgT01QUkFQIEFQSSBjYWxscyBoZXJlIHRvIG1hcmsgZW5kIG9mIHdhaXQ/CisgICAgICAgIHRhc2tkYXRhLT50ZF90YXNrd2FpdF90aHJlYWQgPSAtIHRhc2tkYXRhLT50ZF90YXNrd2FpdF90aHJlYWQ7CisgICAgfQorCisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX29tcF90YXNrd2FpdChleGl0KTogVCMlZCB0YXNrICVwIGZpbmlzaGVkIHdhaXRpbmcsICIKKyAgICAgICAgICAgICAgICAgICJyZXR1cm5pbmcgVEFTS19DVVJSRU5UX05PVF9RVUVVRURcbiIsIGd0aWQsIHRhc2tkYXRhKSApOworCisgICAgcmV0dXJuIFRBU0tfQ1VSUkVOVF9OT1RfUVVFVUVEOworfQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBjX29tcF90YXNreWllbGQ6IHN3aXRjaCB0byBhIGRpZmZlcmVudCB0YXNrCisKK2ttcF9pbnQzMgorX19rbXBjX29tcF90YXNreWllbGQoIGlkZW50X3QgKmxvY19yZWYsIGttcF9pbnQzMiBndGlkLCBpbnQgZW5kX3BhcnQgKQoreworICAgIGttcF90YXNrZGF0YV90ICogdGFza2RhdGE7CisgICAga21wX2luZm9fdCAqIHRocmVhZDsKKyAgICBpbnQgdGhyZWFkX2ZpbmlzaGVkID0gRkFMU0U7CisKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcGNfb21wX3Rhc2t5aWVsZChlbnRlcik6IFQjJWQgbG9jPSVwIGVuZF9wYXJ0ID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCBsb2NfcmVmLCBlbmRfcGFydCkgKTsKKworICAgIGlmICggX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMgJiYgX19rbXBfaW5pdF9wYXJhbGxlbCApIHsKKyAgICAgICAgLy8gR0VIIFRPRE86IHNob3VsZG4ndCB3ZSBoYXZlIHNvbWUgc29ydCBvZiBPTVBSQVAgQVBJIGNhbGxzIGhlcmUgdG8gbWFyayBiZWdpbiB3YWl0PworCisgICAgICAgIHRocmVhZCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKyAgICAgICAgdGFza2RhdGEgPSB0aHJlYWQgLT4gdGgudGhfY3VycmVudF90YXNrOworICAgICAgICAvLyBTaG91bGQgd2UgbW9kZWwgdGhpcyBhcyBhIHRhc2sgd2FpdCBvciBub3Q/CisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICAvLyBOb3RlOiBUaGVzZSB2YWx1ZXMgYXJlIHVzZWQgYnkgSVRUIGV2ZW50cyBhcyB3ZWxsLgorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICAgICAgdGFza2RhdGEtPnRkX3Rhc2t3YWl0X2NvdW50ZXIgKz0gMTsKKyAgICAgICAgdGFza2RhdGEtPnRkX3Rhc2t3YWl0X2lkZW50ICAgID0gbG9jX3JlZjsKKyAgICAgICAgdGFza2RhdGEtPnRkX3Rhc2t3YWl0X3RocmVhZCAgID0gZ3RpZCArIDE7CisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgIHZvaWQgKiBpdHRfc3luY19vYmogPSBfX2ttcF9pdHRfdGFza3dhaXRfb2JqZWN0KCBndGlkICk7CisgICAgICAgIGlmICggaXR0X3N5bmNfb2JqICE9IE5VTEwgKQorICAgICAgICAgICAgX19rbXBfaXR0X3Rhc2t3YWl0X3N0YXJ0aW5nKCBndGlkLCBpdHRfc3luY19vYmogKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAgICAgIGlmICggISB0YXNrZGF0YS0+dGRfZmxhZ3MudGVhbV9zZXJpYWwgKSB7CisgICAgICAgICAgICBrbXBfdGFza190ZWFtX3QgKiB0YXNrX3RlYW0gPSB0aHJlYWQtPnRoLnRoX3Rhc2tfdGVhbTsKKyAgICAgICAgICAgIGlmICh0YXNrX3RlYW0gIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGlmIChLTVBfVEFTS0lOR19FTkFCTEVEKHRhc2tfdGVhbSwgdGhyZWFkLT50aC50aF90YXNrX3N0YXRlKSkgeworICAgICAgICAgICAgICAgICAgICBfX2ttcF9leGVjdXRlX3Rhc2tzXzMyKCB0aHJlYWQsIGd0aWQsIE5VTEwsIEZBTFNFLCAmdGhyZWFkX2ZpbmlzaGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaiksIF9fa21wX3Rhc2tfc3RlYWxpbmdfY29uc3RyYWludCApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgaWYgKCBpdHRfc3luY19vYmogIT0gTlVMTCApCisgICAgICAgICAgICBfX2ttcF9pdHRfdGFza3dhaXRfZmluaXNoZWQoIGd0aWQsIGl0dF9zeW5jX29iaiApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgICAgICAvLyBHRUggVE9ETzogc2hvdWxkbid0IHdlIGhhdmUgc29tZSBzb3J0IG9mIE9NUFJBUCBBUEkgY2FsbHMgaGVyZSB0byBtYXJrIGVuZCBvZiB3YWl0PworICAgICAgICB0YXNrZGF0YS0+dGRfdGFza3dhaXRfdGhyZWFkID0gLSB0YXNrZGF0YS0+dGRfdGFza3dhaXRfdGhyZWFkOworICAgIH0KKworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wY19vbXBfdGFza3lpZWxkKGV4aXQpOiBUIyVkIHRhc2sgJXAgcmVzdW1pbmcsICIKKyAgICAgICAgICAgICAgICAgICJyZXR1cm5pbmcgVEFTS19DVVJSRU5UX05PVF9RVUVVRURcbiIsIGd0aWQsIHRhc2tkYXRhKSApOworCisgICAgcmV0dXJuIFRBU0tfQ1VSUkVOVF9OT1RfUVVFVUVEOworfQorCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcGNfdGFza2dyb3VwOiBTdGFydCBhIG5ldyB0YXNrZ3JvdXAKKwordm9pZAorX19rbXBjX3Rhc2tncm91cCggaWRlbnRfdCogbG9jLCBpbnQgZ3RpZCApCit7CisgICAga21wX2luZm9fdCAgICAgICogdGhyZWFkID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworICAgIGttcF90YXNrZGF0YV90ICAqIHRhc2tkYXRhID0gdGhyZWFkLT50aC50aF9jdXJyZW50X3Rhc2s7CisgICAga21wX3Rhc2tncm91cF90ICogdGdfbmV3ID0KKyAgICAgICAgKGttcF90YXNrZ3JvdXBfdCAqKV9fa21wX3RocmVhZF9tYWxsb2MoIHRocmVhZCwgc2l6ZW9mKCBrbXBfdGFza2dyb3VwX3QgKSApOworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wY190YXNrZ3JvdXA6IFQjJWQgbG9jPSVwIGdyb3VwPSVwXG4iLCBndGlkLCBsb2MsIHRnX25ldykgKTsKKyAgICB0Z19uZXctPmNvdW50ID0gMDsKKyAgICB0Z19uZXctPmNhbmNlbF9yZXF1ZXN0ID0gY2FuY2VsX25vcmVxOworICAgIHRnX25ldy0+cGFyZW50ID0gdGFza2RhdGEtPnRkX3Rhc2tncm91cDsKKyAgICB0YXNrZGF0YS0+dGRfdGFza2dyb3VwID0gdGdfbmV3OworfQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBjX2VuZF90YXNrZ3JvdXA6IFdhaXQgdW50aWwgYWxsIHRhc2tzIGdlbmVyYXRlZCBieSB0aGUgY3VycmVudCB0YXNrCisvLyAgICAgICAgICAgICAgICAgICAgICAgYW5kIGl0cyBkZXNjZW5kYW50cyBhcmUgY29tcGxldGUKKwordm9pZAorX19rbXBjX2VuZF90YXNrZ3JvdXAoIGlkZW50X3QqIGxvYywgaW50IGd0aWQgKQoreworICAgIGttcF9pbmZvX3QgICAgICAqIHRocmVhZCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKyAgICBrbXBfdGFza2RhdGFfdCAgKiB0YXNrZGF0YSA9IHRocmVhZC0+dGgudGhfY3VycmVudF90YXNrOworICAgIGttcF90YXNrZ3JvdXBfdCAqIHRhc2tncm91cCA9IHRhc2tkYXRhLT50ZF90YXNrZ3JvdXA7CisgICAgaW50IHRocmVhZF9maW5pc2hlZCA9IEZBTFNFOworCisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX2VuZF90YXNrZ3JvdXAoZW50ZXIpOiBUIyVkIGxvYz0lcFxuIiwgZ3RpZCwgbG9jKSApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tncm91cCAhPSBOVUxMICk7CisKKyAgICBpZiAoIF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjICkgeworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgLy8gRm9yIElUVCB0aGUgdGFza2dyb3VwIHdhaXQgaXMgc2ltaWxhciB0byB0YXNrd2FpdCB1bnRpbCB3ZSBuZWVkIHRvIGRpc3Rpbmd1aXNoIHRoZW0KKyAgICAgICAgdm9pZCAqIGl0dF9zeW5jX29iaiA9IF9fa21wX2l0dF90YXNrd2FpdF9vYmplY3QoIGd0aWQgKTsKKyAgICAgICAgaWYgKCBpdHRfc3luY19vYmogIT0gTlVMTCApCisgICAgICAgICAgICBfX2ttcF9pdHRfdGFza3dhaXRfc3RhcnRpbmcoIGd0aWQsIGl0dF9zeW5jX29iaiApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgICAgICBpZiAoICEgdGFza2RhdGEtPnRkX2ZsYWdzLnRlYW1fc2VyaWFsICkgeworICAgICAgICAgICAga21wX2ZsYWdfMzIgZmxhZygmKHRhc2tncm91cC0+Y291bnQpLCAwVSk7CisgICAgICAgICAgICB3aGlsZSAoIFRDUl80KHRhc2tncm91cC0+Y291bnQpICE9IDAgKSB7CisgICAgICAgICAgICAgICAgZmxhZy5leGVjdXRlX3Rhc2tzKHRocmVhZCwgZ3RpZCwgRkFMU0UsICZ0aHJlYWRfZmluaXNoZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSwgX19rbXBfdGFza19zdGVhbGluZ19jb25zdHJhaW50ICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgaWYgKCBpdHRfc3luY19vYmogIT0gTlVMTCApCisgICAgICAgICAgICBfX2ttcF9pdHRfdGFza3dhaXRfZmluaXNoZWQoIGd0aWQsIGl0dF9zeW5jX29iaiApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICB9CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGFza2dyb3VwLT5jb3VudCA9PSAwICk7CisKKyAgICAvLyBSZXN0b3JlIHBhcmVudCB0YXNrZ3JvdXAgZm9yIHRoZSBjdXJyZW50IHRhc2sKKyAgICB0YXNrZGF0YS0+dGRfdGFza2dyb3VwID0gdGFza2dyb3VwLT5wYXJlbnQ7CisgICAgX19rbXBfdGhyZWFkX2ZyZWUoIHRocmVhZCwgdGFza2dyb3VwICk7CisKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcGNfZW5kX3Rhc2tncm91cChleGl0KTogVCMlZCB0YXNrICVwIGZpbmlzaGVkIHdhaXRpbmdcbiIsIGd0aWQsIHRhc2tkYXRhKSApOworfQorI2VuZGlmCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wX3JlbW92ZV9teV90YXNrOiByZW1vdmUgYSB0YXNrIGZyb20gbXkgb3duIGRlcXVlCisKK3N0YXRpYyBrbXBfdGFza190ICoKK19fa21wX3JlbW92ZV9teV90YXNrKCBrbXBfaW5mb190ICogdGhyZWFkLCBrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tfdGVhbV90ICp0YXNrX3RlYW0sCisgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIGlzX2NvbnN0cmFpbmVkICkKK3sKKyAgICBrbXBfdGFza190ICogdGFzazsKKyAgICBrbXBfdGFza2RhdGFfdCAqIHRhc2tkYXRhOworICAgIGttcF90aHJlYWRfZGF0YV90ICp0aHJlYWRfZGF0YTsKKyAgICBrbXBfdWludDMyIHRhaWw7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYyApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tfdGVhbSAtPiB0dC50dF90aHJlYWRzX2RhdGEgIT0gTlVMTCApOyAvLyBDYWxsZXIgc2hvdWxkIGNoZWNrIHRoaXMgY29uZGl0aW9uCisKKyAgICAgICAgdGhyZWFkX2RhdGEgPSAmIHRhc2tfdGVhbSAtPiB0dC50dF90aHJlYWRzX2RhdGFbIF9fa21wX3RpZF9mcm9tX2d0aWQoIGd0aWQgKSBdOworCisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBfcmVtb3ZlX215X3Rhc2soZW50ZXIpOiBUIyVkIG50YXNrcz0lZCBoZWFkPSV1IHRhaWw9JXVcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCB0aHJlYWRfZGF0YS0+dGQudGRfZGVxdWVfbnRhc2tzLCB0aHJlYWRfZGF0YS0+dGQudGRfZGVxdWVfaGVhZCwKKyAgICAgICAgICAgICAgICAgIHRocmVhZF9kYXRhLT50ZC50ZF9kZXF1ZV90YWlsKSApOworCisgICAgaWYgKFRDUl80KHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlX250YXNrcykgPT0gMCkgeworICAgICAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcF9yZW1vdmVfbXlfdGFzayhleGl0ICMxKTogVCMlZCBObyB0YXNrcyB0byByZW1vdmU6IG50YXNrcz0lZCBoZWFkPSV1IHRhaWw9JXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGhyZWFkX2RhdGEtPnRkLnRkX2RlcXVlX250YXNrcywgdGhyZWFkX2RhdGEtPnRkLnRkX2RlcXVlX2hlYWQsCisgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkX2RhdGEtPnRkLnRkX2RlcXVlX3RhaWwpICk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICYgdGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVfbG9jayApOworCisgICAgaWYgKFRDUl80KHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlX250YXNrcykgPT0gMCkgeworICAgICAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmIHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlX2xvY2sgKTsKKyAgICAgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBfcmVtb3ZlX215X3Rhc2soZXhpdCAjMik6IFQjJWQgTm8gdGFza3MgdG8gcmVtb3ZlOiBudGFza3M9JWQgaGVhZD0ldSB0YWlsPSV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRocmVhZF9kYXRhLT50ZC50ZF9kZXF1ZV9udGFza3MsIHRocmVhZF9kYXRhLT50ZC50ZF9kZXF1ZV9oZWFkLAorICAgICAgICAgICAgICAgICAgICAgIHRocmVhZF9kYXRhLT50ZC50ZF9kZXF1ZV90YWlsKSApOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICB0YWlsID0gKCB0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV90YWlsIC0gMSApICYgVEFTS19ERVFVRV9NQVNLOyAgLy8gV3JhcCBpbmRleC4KKyAgICB0YXNrZGF0YSA9IHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlWyB0YWlsIF07CisKKyAgICBpZiAoaXNfY29uc3RyYWluZWQpIHsKKyAgICAgICAgLy8gd2UgbmVlZCB0byBjaGVjayBpZiB0aGUgY2FuZGlkYXRlIG9iZXlzIHRhc2sgc2NoZWR1bGluZyBjb25zdHJhaW50OgorICAgICAgICAvLyBvbmx5IGNoaWxkIG9mIGN1cnJlbnQgdGFzayBjYW4gYmUgc2NoZWR1bGVkCisgICAgICAgIGttcF90YXNrZGF0YV90ICogY3VycmVudCA9IHRocmVhZC0+dGgudGhfY3VycmVudF90YXNrOworICAgICAgICBrbXBfaW50MzIgICAgICAgIGxldmVsID0gY3VycmVudC0+dGRfbGV2ZWw7CisgICAgICAgIGttcF90YXNrZGF0YV90ICogcGFyZW50ID0gdGFza2RhdGEtPnRkX3BhcmVudDsKKyAgICAgICAgd2hpbGUgKCBwYXJlbnQgIT0gY3VycmVudCAmJiBwYXJlbnQtPnRkX2xldmVsID4gbGV2ZWwgKSB7CisgICAgICAgICAgICBwYXJlbnQgPSBwYXJlbnQtPnRkX3BhcmVudDsgIC8vIGNoZWNrIGdlbmVyYXRpb24gdXAgdG8gdGhlIGxldmVsIG9mIHRoZSBjdXJyZW50IHRhc2sKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQocGFyZW50ICE9IE5VTEwpOworICAgICAgICB9CisgICAgICAgIGlmICggcGFyZW50ICE9IGN1cnJlbnQgKSB7CisgICAgICAgICAgICAvLyBJZiB0aGUgdGFpbCB0YXNrIGlzIG5vdCBhIGNoaWxkLCB0aGVuIG5vIG90aGVyIGNoaWxkcyBjYW4gYXBwZWFyIGluIHRoZSBkZXF1ZS4KKyAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICYgdGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVfbG9jayApOworICAgICAgICAgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBfcmVtb3ZlX215X3Rhc2soZXhpdCAjMik6IFQjJWQgTm8gdGFza3MgdG8gcmVtb3ZlOiBudGFza3M9JWQgaGVhZD0ldSB0YWlsPSV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0aHJlYWRfZGF0YS0+dGQudGRfZGVxdWVfbnRhc2tzLCB0aHJlYWRfZGF0YS0+dGQudGRfZGVxdWVfaGVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkX2RhdGEtPnRkLnRkX2RlcXVlX3RhaWwpICk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlX3RhaWwgPSB0YWlsOworICAgIFRDV180KHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlX250YXNrcywgdGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVfbnRhc2tzIC0gMSk7CisKKyAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmIHRocmVhZF9kYXRhLT50ZC50ZF9kZXF1ZV9sb2NrICk7CisKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcF9yZW1vdmVfbXlfdGFzayhleGl0ICMyKTogVCMlZCB0YXNrICVwIHJlbW92ZWQ6IG50YXNrcz0lZCBoZWFkPSV1IHRhaWw9JXVcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCB0YXNrZGF0YSwgdGhyZWFkX2RhdGEtPnRkLnRkX2RlcXVlX250YXNrcywgdGhyZWFkX2RhdGEtPnRkLnRkX2RlcXVlX2hlYWQsCisgICAgICAgICAgICAgICAgICB0aHJlYWRfZGF0YS0+dGQudGRfZGVxdWVfdGFpbCkgKTsKKworICAgIHRhc2sgPSBLTVBfVEFTS0RBVEFfVE9fVEFTSyggdGFza2RhdGEgKTsKKyAgICByZXR1cm4gdGFzazsKK30KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcF9zdGVhbF90YXNrOiByZW1vdmUgYSB0YXNrIGZyb20gYW5vdGhlciB0aHJlYWQncyBkZXF1ZQorLy8gQXNzdW1lIHRoYXQgY2FsbGluZyB0aHJlYWQgaGFzIGFscmVhZHkgY2hlY2tlZCBleGlzdGVuY2Ugb2YKKy8vIHRhc2tfdGVhbSB0aHJlYWRfZGF0YSBiZWZvcmUgY2FsbGluZyB0aGlzIHJvdXRpbmUuCisKK3N0YXRpYyBrbXBfdGFza190ICoKK19fa21wX3N0ZWFsX3Rhc2soIGttcF9pbmZvX3QgKnZpY3RpbSwga21wX2ludDMyIGd0aWQsIGttcF90YXNrX3RlYW1fdCAqdGFza190ZWFtLAorICAgICAgICAgICAgICAgICAgdm9sYXRpbGUga21wX3VpbnQzMiAqdW5maW5pc2hlZF90aHJlYWRzLCBpbnQgKnRocmVhZF9maW5pc2hlZCwKKyAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBpc19jb25zdHJhaW5lZCApCit7CisgICAga21wX3Rhc2tfdCAqIHRhc2s7CisgICAga21wX3Rhc2tkYXRhX3QgKiB0YXNrZGF0YTsKKyAgICBrbXBfdGhyZWFkX2RhdGFfdCAqdmljdGltX3RkLCAqdGhyZWFkc19kYXRhOworICAgIGttcF9pbnQzMiB2aWN0aW1fdGlkLCB0aHJlYWRfdGlkOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMgKTsKKworICAgIHRocmVhZHNfZGF0YSA9IHRhc2tfdGVhbSAtPiB0dC50dF90aHJlYWRzX2RhdGE7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGhyZWFkc19kYXRhICE9IE5VTEwgKTsgIC8vIENhbGxlciBzaG91bGQgY2hlY2sgdGhpcyBjb25kaXRpb24KKworICAgIHZpY3RpbV90aWQgPSB2aWN0aW0tPnRoLnRoX2luZm8uZHMuZHNfdGlkOworICAgIHZpY3RpbV90ZCA9ICYgdGhyZWFkc19kYXRhWyB2aWN0aW1fdGlkIF07CisKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcF9zdGVhbF90YXNrKGVudGVyKTogVCMlZCB0cnkgdG8gc3RlYWwgZnJvbSBUIyVkOiB0YXNrX3RlYW09JXAgbnRhc2tzPSVkICIKKyAgICAgICAgICAgICAgICAgICJoZWFkPSV1IHRhaWw9JXVcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB2aWN0aW0gKSwgdGFza190ZWFtLCB2aWN0aW1fdGQtPnRkLnRkX2RlcXVlX250YXNrcywKKyAgICAgICAgICAgICAgICAgIHZpY3RpbV90ZC0+dGQudGRfZGVxdWVfaGVhZCwgdmljdGltX3RkLT50ZC50ZF9kZXF1ZV90YWlsKSApOworCisgICAgaWYgKCAoVENSXzQodmljdGltX3RkIC0+IHRkLnRkX2RlcXVlX250YXNrcykgPT0gMCkgfHwgLy8gQ2FsbGVyIHNob3VsZCBub3QgY2hlY2sgdGhpcyBjb25kaXRpb24KKyAgICAgICAgIChUQ1JfUFRSKHZpY3RpbS0+dGgudGhfdGFza190ZWFtKSAhPSB0YXNrX3RlYW0pKSAvLyBHRUg6IHdoeSB3b3VsZCB0aGlzIGhhcHBlbj8KKyAgICB7CisgICAgICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wX3N0ZWFsX3Rhc2soZXhpdCAjMSk6IFQjJWQgY291bGQgbm90IHN0ZWFsIGZyb20gVCMlZDogdGFza190ZWFtPSVwICIKKyAgICAgICAgICAgICAgICAgICAgICAibnRhc2tzPSVkIGhlYWQ9JXUgdGFpbD0ldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBndGlkLCBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB2aWN0aW0gKSwgdGFza190ZWFtLCB2aWN0aW1fdGQtPnRkLnRkX2RlcXVlX250YXNrcywKKyAgICAgICAgICAgICAgICAgICAgICB2aWN0aW1fdGQtPnRkLnRkX2RlcXVlX2hlYWQsIHZpY3RpbV90ZC0+dGQudGRfZGVxdWVfdGFpbCkgKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJiB2aWN0aW1fdGQgLT4gdGQudGRfZGVxdWVfbG9jayApOworCisgICAgLy8gQ2hlY2sgYWdhaW4gYWZ0ZXIgd2UgYWNxdWlyZSB0aGUgbG9jaworICAgIGlmICggKFRDUl80KHZpY3RpbV90ZCAtPiB0ZC50ZF9kZXF1ZV9udGFza3MpID09IDApIHx8CisgICAgICAgICAoVENSX1BUUih2aWN0aW0tPnRoLnRoX3Rhc2tfdGVhbSkgIT0gdGFza190ZWFtKSkgLy8gR0VIOiB3aHkgd291bGQgdGhpcyBoYXBwZW4/CisgICAgeworICAgICAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmIHZpY3RpbV90ZCAtPiB0ZC50ZF9kZXF1ZV9sb2NrICk7CisgICAgICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wX3N0ZWFsX3Rhc2soZXhpdCAjMik6IFQjJWQgY291bGQgbm90IHN0ZWFsIGZyb20gVCMlZDogdGFza190ZWFtPSVwICIKKyAgICAgICAgICAgICAgICAgICAgICAibnRhc2tzPSVkIGhlYWQ9JXUgdGFpbD0ldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBndGlkLCBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB2aWN0aW0gKSwgdGFza190ZWFtLCB2aWN0aW1fdGQtPnRkLnRkX2RlcXVlX250YXNrcywKKyAgICAgICAgICAgICAgICAgICAgICB2aWN0aW1fdGQtPnRkLnRkX2RlcXVlX2hlYWQsIHZpY3RpbV90ZC0+dGQudGRfZGVxdWVfdGFpbCkgKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgS01QX0RFQlVHX0FTU0VSVCggdmljdGltX3RkIC0+IHRkLnRkX2RlcXVlICE9IE5VTEwgKTsKKworICAgIGlmICggIWlzX2NvbnN0cmFpbmVkICkgeworICAgICAgICB0YXNrZGF0YSA9IHZpY3RpbV90ZCAtPiB0ZC50ZF9kZXF1ZVsgdmljdGltX3RkIC0+IHRkLnRkX2RlcXVlX2hlYWQgXTsKKyAgICAgICAgLy8gQnVtcCBoZWFkIHBvaW50ZXIgYW5kIFdyYXAuCisgICAgICAgIHZpY3RpbV90ZCAtPiB0ZC50ZF9kZXF1ZV9oZWFkID0gKCB2aWN0aW1fdGQgLT4gdGQudGRfZGVxdWVfaGVhZCArIDEgKSAmIFRBU0tfREVRVUVfTUFTSzsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBXaGlsZSB3ZSBoYXZlIHBvc3Rwb25lZCB0YXNrcyBsZXQncyBzdGVhbCBmcm9tIHRhaWwgb2YgdGhlIGRlcXVlIChzbWFsbGVyIHRhc2tzKQorICAgICAgICBrbXBfaW50MzIgdGFpbCA9ICggdmljdGltX3RkIC0+IHRkLnRkX2RlcXVlX3RhaWwgLSAxICkgJiBUQVNLX0RFUVVFX01BU0s7ICAvLyBXcmFwIGluZGV4LgorICAgICAgICB0YXNrZGF0YSA9IHZpY3RpbV90ZCAtPiB0ZC50ZF9kZXF1ZVsgdGFpbCBdOworICAgICAgICAvLyB3ZSBuZWVkIHRvIGNoZWNrIGlmIHRoZSBjYW5kaWRhdGUgb2JleXMgdGFzayBzY2hlZHVsaW5nIGNvbnN0cmFpbnQ6CisgICAgICAgIC8vIG9ubHkgY2hpbGQgb2YgY3VycmVudCB0YXNrIGNhbiBiZSBzY2hlZHVsZWQKKyAgICAgICAga21wX3Rhc2tkYXRhX3QgKiBjdXJyZW50ID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdLT50aC50aF9jdXJyZW50X3Rhc2s7CisgICAgICAgIGttcF9pbnQzMiAgICAgICAgbGV2ZWwgPSBjdXJyZW50LT50ZF9sZXZlbDsKKyAgICAgICAga21wX3Rhc2tkYXRhX3QgKiBwYXJlbnQgPSB0YXNrZGF0YS0+dGRfcGFyZW50OworICAgICAgICB3aGlsZSAoIHBhcmVudCAhPSBjdXJyZW50ICYmIHBhcmVudC0+dGRfbGV2ZWwgPiBsZXZlbCApIHsKKyAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC0+dGRfcGFyZW50OyAgLy8gY2hlY2sgZ2VuZXJhdGlvbiB1cCB0byB0aGUgbGV2ZWwgb2YgdGhlIGN1cnJlbnQgdGFzaworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChwYXJlbnQgIT0gTlVMTCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBwYXJlbnQgIT0gY3VycmVudCApIHsKKyAgICAgICAgICAgIC8vIElmIHRoZSB0YWlsIHRhc2sgaXMgbm90IGEgY2hpbGQsIHRoZW4gbm8gb3RoZXIgY2hpbGRzIGNhbiBhcHBlYXIgaW4gdGhlIGRlcXVlICg/KS4KKyAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICYgdmljdGltX3RkIC0+IHRkLnRkX2RlcXVlX2xvY2sgKTsKKyAgICAgICAgICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wX3N0ZWFsX3Rhc2soZXhpdCAjMik6IFQjJWQgY291bGQgbm90IHN0ZWFsIGZyb20gVCMlZDogdGFza190ZWFtPSVwICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIm50YXNrcz0lZCBoZWFkPSV1IHRhaWw9JXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRocmVhZHNfZGF0YVt2aWN0aW1fdGlkXS50ZC50ZF90aHIgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGFza190ZWFtLCB2aWN0aW1fdGQtPnRkLnRkX2RlcXVlX250YXNrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdmljdGltX3RkLT50ZC50ZF9kZXF1ZV9oZWFkLCB2aWN0aW1fdGQtPnRkLnRkX2RlcXVlX3RhaWwpICk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICB2aWN0aW1fdGQgLT4gdGQudGRfZGVxdWVfdGFpbCA9IHRhaWw7CisgICAgfQorICAgIGlmICgqdGhyZWFkX2ZpbmlzaGVkKSB7CisgICAgICAgIC8vIFdlIG5lZWQgdG8gdW4tbWFyayB0aGlzIHZpY3RpbSBhcyBhIGZpbmlzaGVkIHZpY3RpbS4gIFRoaXMgbXVzdCBiZSBkb25lIGJlZm9yZQorICAgICAgICAvLyByZWxlYXNpbmcgdGhlIGxvY2ssIG9yIGVsc2Ugb3RoZXIgdGhyZWFkcyAoc3RhcnRpbmcgd2l0aCB0aGUgbWFzdGVyIHZpY3RpbSkKKyAgICAgICAgLy8gbWlnaHQgYmUgcHJlbWF0dXJlbHkgcmVsZWFzZWQgZnJvbSB0aGUgYmFycmllciEhIQorICAgICAgICBrbXBfdWludDMyIGNvdW50ID0gS01QX1RFU1RfVEhFTl9JTkMzMiggKGttcF9pbnQzMiAqKXVuZmluaXNoZWRfdGhyZWFkcyApOworCisgICAgICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX3N0ZWFsX3Rhc2s6IFQjJWQgaW5jIHVuZmluaXNoZWRfdGhyZWFkcyB0byAlZDogdGFza190ZWFtPSVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIGNvdW50ICsgMSwgdGFza190ZWFtKSApOworCisgICAgICAgICp0aHJlYWRfZmluaXNoZWQgPSBGQUxTRTsKKyAgICB9CisgICAgVENXXzQodmljdGltX3RkIC0+IHRkLnRkX2RlcXVlX250YXNrcywgVENSXzQodmljdGltX3RkIC0+IHRkLnRkX2RlcXVlX250YXNrcykgLSAxKTsKKworICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICYgdmljdGltX3RkIC0+IHRkLnRkX2RlcXVlX2xvY2sgKTsKKworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wX3N0ZWFsX3Rhc2soZXhpdCAjMyk6IFQjJWQgc3RvbGUgdGFzayAlcCBmcm9tIFQjJWQ6IHRhc2tfdGVhbT0lcCAiCisgICAgICAgICAgICAgICAgICAibnRhc2tzPSVkIGhlYWQ9JXUgdGFpbD0ldVxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIHRhc2tkYXRhLCBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB2aWN0aW0gKSwgdGFza190ZWFtLAorICAgICAgICAgICAgICAgICAgdmljdGltX3RkLT50ZC50ZF9kZXF1ZV9udGFza3MsIHZpY3RpbV90ZC0+dGQudGRfZGVxdWVfaGVhZCwKKyAgICAgICAgICAgICAgICAgIHZpY3RpbV90ZC0+dGQudGRfZGVxdWVfdGFpbCkgKTsKKworICAgIHRhc2sgPSBLTVBfVEFTS0RBVEFfVE9fVEFTSyggdGFza2RhdGEgKTsKKyAgICByZXR1cm4gdGFzazsKK30KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcF9leGVjdXRlX3Rhc2tzX3RlbXBsYXRlOiBDaG9vc2UgYW5kIGV4ZWN1dGUgdGFza3MgdW50aWwgZWl0aGVyIHRoZSBjb25kaXRpb24KKy8vIGlzIHN0YXRpc2ZpZWQgKHJldHVybiB0cnVlKSBvciB0aGVyZSBhcmUgbm9uZSBsZWZ0IChyZXR1cm4gZmFsc2UpLgorLy8gZmluYWxfc3BpbiBpcyBUUlVFIGlmIHRoaXMgaXMgdGhlIHNwaW4gYXQgdGhlIHJlbGVhc2UgYmFycmllci4KKy8vIHRocmVhZF9maW5pc2hlZCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgdGhyZWFkIGlzIGZpbmlzaGVkIGV4ZWN1dGluZyBhbGwKKy8vIHRoZSB0YXNrcyBpdCBoYXMgb24gaXRzIGRlcXVlLCBhbmQgaXMgYXQgdGhlIHJlbGVhc2UgYmFycmllci4KKy8vIHNwaW5uZXIgaXMgdGhlIGxvY2F0aW9uIG9uIHdoaWNoIHRvIHNwaW4uCisvLyBzcGlubmVyID09IE5VTEwgbWVhbnMgb25seSBleGVjdXRlIGEgc2luZ2xlIHRhc2sgYW5kIHJldHVybi4KKy8vIGNoZWNrZXIgaXMgdGhlIHZhbHVlIHRvIGNoZWNrIHRvIHRlcm1pbmF0ZSB0aGUgc3Bpbi4KK3RlbXBsYXRlIDxjbGFzcyBDPgorc3RhdGljIGlubGluZSBpbnQgX19rbXBfZXhlY3V0ZV90YXNrc190ZW1wbGF0ZShrbXBfaW5mb190ICp0aHJlYWQsIGttcF9pbnQzMiBndGlkLCBDICpmbGFnLCBpbnQgZmluYWxfc3BpbiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqdGhyZWFkX2ZpbmlzaGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKHZvaWQgKiBpdHRfc3luY19vYmopLCBrbXBfaW50MzIgaXNfY29uc3RyYWluZWQpCit7CisgICAga21wX3Rhc2tfdGVhbV90ICogICAgIHRhc2tfdGVhbTsKKyAgICBrbXBfdGVhbV90ICogICAgICAgICAgdGVhbTsKKyAgICBrbXBfdGhyZWFkX2RhdGFfdCAqICAgdGhyZWFkc19kYXRhOworICAgIGttcF90YXNrX3QgKiAgICAgICAgICB0YXNrOworICAgIGttcF90YXNrZGF0YV90ICogICAgICBjdXJyZW50X3Rhc2sgPSB0aHJlYWQgLT4gdGgudGhfY3VycmVudF90YXNrOworICAgIHZvbGF0aWxlIGttcF91aW50MzIgKiB1bmZpbmlzaGVkX3RocmVhZHM7CisgICAga21wX2ludDMyICAgICAgICAgICAgIG50aHJlYWRzLCBsYXN0X3N0b2xlbiwgaywgdGlkOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aHJlYWQgPT0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdICk7CisKKyAgICB0YXNrX3RlYW0gPSB0aHJlYWQgLT4gdGgudGhfdGFza190ZWFtOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tfdGVhbSAhPSBOVUxMICk7CisKKyAgICBLQV9UUkFDRSgxNSwgKCJfX2ttcF9leGVjdXRlX3Rhc2tzX3RlbXBsYXRlKGVudGVyKTogVCMlZCBmaW5hbF9zcGluPSVkICp0aHJlYWRfZmluaXNoZWQ9JWRcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCBmaW5hbF9zcGluLCAqdGhyZWFkX2ZpbmlzaGVkKSApOworCisgICAgdGhyZWFkc19kYXRhID0gKGttcF90aHJlYWRfZGF0YV90ICopVENSX1BUUih0YXNrX3RlYW0gLT4gdHQudHRfdGhyZWFkc19kYXRhKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aHJlYWRzX2RhdGEgIT0gTlVMTCApOworCisgICAgbnRocmVhZHMgPSB0YXNrX3RlYW0gLT4gdHQudHRfbnByb2M7CisgICAgdW5maW5pc2hlZF90aHJlYWRzID0gJih0YXNrX3RlYW0gLT4gdHQudHRfdW5maW5pc2hlZF90aHJlYWRzKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBudGhyZWFkcyA+IDEgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBUQ1JfNCgoaW50KSp1bmZpbmlzaGVkX3RocmVhZHMpID49IDAgKTsKKworICAgIC8vIENob29zZSB0YXNrcyBmcm9tIG91ciBvd24gd29yayBxdWV1ZS4KKyAgICBzdGFydDoKKyAgICB3aGlsZSAoKCB0YXNrID0gX19rbXBfcmVtb3ZlX215X3Rhc2soIHRocmVhZCwgZ3RpZCwgdGFza190ZWFtLCBpc19jb25zdHJhaW5lZCApKSAhPSBOVUxMICkgeworI2lmIFVTRV9JVFRfQlVJTEQgJiYgVVNFX0lUVF9OT1RJRlkKKyAgICAgICAgaWYgKCBfX2l0dF9zeW5jX2NyZWF0ZV9wdHIgfHwgS01QX0lUVF9ERUJVRyApIHsKKyAgICAgICAgICAgIGlmICggaXR0X3N5bmNfb2JqID09IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgLy8gd2UgYXJlIGF0IGZvcmsgYmFycmllciB3aGVyZSB3ZSBjb3VsZCBub3QgZ2V0IHRoZSBvYmplY3QgcmVsaWFibHkKKyAgICAgICAgICAgICAgICBpdHRfc3luY19vYmogID0gX19rbXBfaXR0X2JhcnJpZXJfb2JqZWN0KCBndGlkLCBic19mb3Jram9pbl9iYXJyaWVyICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfX2ttcF9pdHRfdGFza19zdGFydGluZyggaXR0X3N5bmNfb2JqICk7CisgICAgICAgIH0KKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICYmIFVTRV9JVFRfTk9USUZZICovCisgICAgICAgIF9fa21wX2ludm9rZV90YXNrKCBndGlkLCB0YXNrLCBjdXJyZW50X3Rhc2sgKTsKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgIGlmICggaXR0X3N5bmNfb2JqICE9IE5VTEwgKQorICAgICAgICAgICAgX19rbXBfaXR0X3Rhc2tfZmluaXNoZWQoIGl0dF9zeW5jX29iaiApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgICAgICAvLyBJZiB0aGlzIHRocmVhZCBpcyBvbmx5IHBhcnR3YXkgdGhyb3VnaCB0aGUgYmFycmllciBhbmQgdGhlIGNvbmRpdGlvbgorICAgICAgICAvLyBpcyBtZXQsIHRoZW4gcmV0dXJuIG5vdywgc28gdGhhdCB0aGUgYmFycmllciBnYXRoZXIvcmVsZWFzZSBwYXR0ZXJuIGNhbiBwcm9jZWVkLgorICAgICAgICAvLyBJZiB0aGlzIHRocmVhZCBpcyBpbiB0aGUgbGFzdCBzcGluIGxvb3AgaW4gdGhlIGJhcnJpZXIsIHdhaXRpbmcgdG8gYmUKKyAgICAgICAgLy8gcmVsZWFzZWQsIHdlIGtub3cgdGhhdCB0aGUgdGVybWluYXRpb24gY29uZGl0aW9uIHdpbGwgbm90IGJlIHNhdGlzaWZpZWQsCisgICAgICAgIC8vIHNvIGRvbid0IHdhc3RlIGFueSBjeWNsZXMgY2hlY2tpbmcgaXQuCisgICAgICAgIGlmIChmbGFnID09IE5VTEwgfHwgKCFmaW5hbF9zcGluICYmIGZsYWctPmRvbmVfY2hlY2soKSkpIHsKKyAgICAgICAgICAgIEtBX1RSQUNFKDE1LCAoIl9fa21wX2V4ZWN1dGVfdGFza3NfdGVtcGxhdGUoZXhpdCAjMSk6IFQjJWQgc3BpbiBjb25kaXRpb24gc2F0aXNmaWVkXG4iLCBndGlkKSApOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIH0KKyAgICAgICAgS01QX1lJRUxEKCBfX2ttcF9saWJyYXJ5ID09IGxpYnJhcnlfdGhyb3VnaHB1dCApOyAgIC8vIFlpZWxkIGJlZm9yZSBleGVjdXRpbmcgbmV4dCB0YXNrCisgICAgfQorCisgICAgLy8gVGhpcyB0aHJlYWQncyB3b3JrIHF1ZXVlIGlzIGVtcHR5LiAgSWYgd2UgYXJlIGluIHRoZSBmaW5hbCBzcGluIGxvb3AKKyAgICAvLyBvZiB0aGUgYmFycmllciwgY2hlY2sgYW5kIHNlZSBpZiB0aGUgdGVybWluYXRpb24gY29uZGl0aW9uIGlzIHNhdGlzZmllZC4KKyAgICBpZiAoZmluYWxfc3BpbikgeworICAgICAgICAvLyBGaXJzdCwgZGVjcmVtZW50IHRoZSAjdW5maW5pc2hlZCB0aHJlYWRzLCBpZiB0aGF0IGhhcyBub3QgYWxyZWFkeQorICAgICAgICAvLyBiZWVuIGRvbmUuICBUaGlzIGRlY3JlbWVudCBtaWdodCBiZSB0byB0aGUgc3BpbiBsb2NhdGlvbiwgYW5kCisgICAgICAgIC8vIHJlc3VsdCBpbiB0aGUgdGVybWluYXRpb24gY29uZGl0aW9uIGJlaW5nIHNhdGlzZmllZC4KKyAgICAgICAgaWYgKCEgKnRocmVhZF9maW5pc2hlZCkgeworICAgICAgICAgICAga21wX3VpbnQzMiBjb3VudCA9IEtNUF9URVNUX1RIRU5fREVDMzIoIChrbXBfaW50MzIgKil1bmZpbmlzaGVkX3RocmVhZHMgKSAtIDE7CisgICAgICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9leGVjdXRlX3Rhc2tzX3RlbXBsYXRlKGRlYyAjMSk6IFQjJWQgZGVjIHVuZmluaXNoZWRfdGhyZWFkcyB0byAlZCB0YXNrX3RlYW09JXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIGNvdW50LCB0YXNrX3RlYW0pICk7CisgICAgICAgICAgICAqdGhyZWFkX2ZpbmlzaGVkID0gVFJVRTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEl0IGlzIG5vdyB1bnNhZmUgdG8gcmVmZXJlbmNlIHRocmVhZC0+dGgudGhfdGVhbSAhISEKKyAgICAgICAgLy8gRGVjcmVtZW50aW5nIHRhc2tfdGVhbS0+dHQudHRfdW5maW5pc2hlZF90aHJlYWRzIGNhbiBhbGxvdyB0aGUgbWFzdGVyCisgICAgICAgIC8vIHRocmVhZCB0byBwYXNzIHRocm91Z2ggdGhlIGJhcnJpZXIsIHdoZXJlIGl0IG1pZ2h0IHJlc2V0IGVhY2ggdGhyZWFkJ3MKKyAgICAgICAgLy8gdGgudGhfdGVhbSBmaWVsZCBmb3IgdGhlIG5leHQgcGFyYWxsZWwgcmVnaW9uLgorICAgICAgICAvLyBJZiB3ZSBjYW4gc3RlYWwgbW9yZSB3b3JrLCB3ZSBrbm93IHRoYXQgdGhpcyBoYXMgbm90IGhhcHBlbmVkIHlldC4KKyAgICAgICAgaWYgKGZsYWcgIT0gTlVMTCAmJiBmbGFnLT5kb25lX2NoZWNrKCkpIHsKKyAgICAgICAgICAgIEtBX1RSQUNFKDE1LCAoIl9fa21wX2V4ZWN1dGVfdGFza3NfdGVtcGxhdGUoZXhpdCAjMik6IFQjJWQgc3BpbiBjb25kaXRpb24gc2F0aXNmaWVkXG4iLCBndGlkKSApOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUcnkgdG8gc3RlYWwgZnJvbSB0aGUgbGFzdCBwbGFjZSBJIHN0b2xlIGZyb20gc3VjY2Vzc2Z1bGx5LgorICAgIHRpZCA9IHRocmVhZCAtPiB0aC50aF9pbmZvLmRzLmRzX3RpZDsvL19fa21wX3RpZF9mcm9tX2d0aWQoIGd0aWQgKTsKKyAgICBsYXN0X3N0b2xlbiA9IHRocmVhZHNfZGF0YVsgdGlkIF0udGQudGRfZGVxdWVfbGFzdF9zdG9sZW47CisKKyAgICBpZiAobGFzdF9zdG9sZW4gIT0gLTEpIHsKKyAgICAgICAga21wX2luZm9fdCAqb3RoZXJfdGhyZWFkID0gdGhyZWFkc19kYXRhW2xhc3Rfc3RvbGVuXS50ZC50ZF90aHI7CisKKyAgICAgICAgd2hpbGUgKCh0YXNrID0gX19rbXBfc3RlYWxfdGFzayggb3RoZXJfdGhyZWFkLCBndGlkLCB0YXNrX3RlYW0sIHVuZmluaXNoZWRfdGhyZWFkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkX2ZpbmlzaGVkLCBpc19jb25zdHJhaW5lZCApKSAhPSBOVUxMKQorICAgICAgICB7CisjaWYgVVNFX0lUVF9CVUlMRCAmJiBVU0VfSVRUX05PVElGWQorICAgICAgICAgICAgaWYgKCBfX2l0dF9zeW5jX2NyZWF0ZV9wdHIgfHwgS01QX0lUVF9ERUJVRyApIHsKKyAgICAgICAgICAgICAgICBpZiAoIGl0dF9zeW5jX29iaiA9PSBOVUxMICkgeworICAgICAgICAgICAgICAgICAgICAvLyB3ZSBhcmUgYXQgZm9yayBiYXJyaWVyIHdoZXJlIHdlIGNvdWxkIG5vdCBnZXQgdGhlIG9iamVjdCByZWxpYWJseQorICAgICAgICAgICAgICAgICAgICBpdHRfc3luY19vYmogID0gX19rbXBfaXR0X2JhcnJpZXJfb2JqZWN0KCBndGlkLCBic19mb3Jram9pbl9iYXJyaWVyICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIF9fa21wX2l0dF90YXNrX3N0YXJ0aW5nKCBpdHRfc3luY19vYmogKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICYmIFVTRV9JVFRfTk9USUZZICovCisgICAgICAgICAgICBfX2ttcF9pbnZva2VfdGFzayggZ3RpZCwgdGFzaywgY3VycmVudF90YXNrICk7CisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICAgICAgaWYgKCBpdHRfc3luY19vYmogIT0gTlVMTCApCisgICAgICAgICAgICAgICAgX19rbXBfaXR0X3Rhc2tfZmluaXNoZWQoIGl0dF9zeW5jX29iaiApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgICAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoaXMgdGhyZWFkIGNhbiBwcm9jZWVkLgorICAgICAgICAgICAgaWYgKGZsYWcgPT0gTlVMTCB8fCAoIWZpbmFsX3NwaW4gJiYgZmxhZy0+ZG9uZV9jaGVjaygpKSkgeworICAgICAgICAgICAgICAgIEtBX1RSQUNFKDE1LCAoIl9fa21wX2V4ZWN1dGVfdGFza3NfdGVtcGxhdGUoZXhpdCAjMyk6IFQjJWQgc3BpbiBjb25kaXRpb24gc2F0aXNmaWVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCkgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgS01QX1lJRUxEKCBfX2ttcF9saWJyYXJ5ID09IGxpYnJhcnlfdGhyb3VnaHB1dCApOyAgIC8vIFlpZWxkIGJlZm9yZSBleGVjdXRpbmcgbmV4dCB0YXNrCisgICAgICAgICAgICAvLyBJZiB0aGUgZXhlY3V0aW9uIG9mIHRoZSBzdG9sZW4gdGFzayByZXN1bHRlZCBpbiBtb3JlIHRhc2tzIGJlaW5nCisgICAgICAgICAgICAvLyBwbGFjZWQgb24gb3VyIHJ1biBxdWV1ZSwgdGhlbiByZXN0YXJ0IHRoZSB3aG9sZSBwcm9jZXNzLgorICAgICAgICAgICAgaWYgKFRDUl80KHRocmVhZHNfZGF0YVsgdGlkIF0udGQudGRfZGVxdWVfbnRhc2tzKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfZXhlY3V0ZV90YXNrc190ZW1wbGF0ZTogVCMlZCBzdG9sZW4gdGFzayBzcGF3bmVkIG90aGVyIHRhc2tzLCByZXN0YXJ0XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCkgKTsKKyAgICAgICAgICAgICAgICBnb3RvIHN0YXJ0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gRG9uJ3QgZ2l2ZSBwcmlvcml0eSB0byBzdGVhbGluZyBmcm9tIHRoaXMgdGhyZWFkIGFueW1vcmUuCisgICAgICAgIHRocmVhZHNfZGF0YVsgdGlkIF0udGQudGRfZGVxdWVfbGFzdF9zdG9sZW4gPSAtMTsKKworICAgICAgICAvLyBUaGUgdmljdGltcydzIHdvcmsgcXVldWUgaXMgZW1wdHkuICBJZiB3ZSBhcmUgaW4gdGhlIGZpbmFsIHNwaW4gbG9vcAorICAgICAgICAvLyBvZiB0aGUgYmFycmllciwgY2hlY2sgYW5kIHNlZSBpZiB0aGUgdGVybWluYXRpb24gY29uZGl0aW9uIGlzIHNhdGlzZmllZC4KKyAgICAgICAgaWYgKGZpbmFsX3NwaW4pIHsKKyAgICAgICAgICAgIC8vIEZpcnN0LCBkZWNyZW1lbnQgdGhlICN1bmZpbmlzaGVkIHRocmVhZHMsIGlmIHRoYXQgaGFzIG5vdCBhbHJlYWR5CisgICAgICAgICAgICAvLyBiZWVuIGRvbmUuICBUaGlzIGRlY3JlbWVudCBtaWdodCBiZSB0byB0aGUgc3BpbiBsb2NhdGlvbiwgYW5kCisgICAgICAgICAgICAvLyByZXN1bHQgaW4gdGhlIHRlcm1pbmF0aW9uIGNvbmRpdGlvbiBiZWluZyBzYXRpc2ZpZWQuCisgICAgICAgICAgICBpZiAoISAqdGhyZWFkX2ZpbmlzaGVkKSB7CisgICAgICAgICAgICAgICAga21wX3VpbnQzMiBjb3VudCA9IEtNUF9URVNUX1RIRU5fREVDMzIoIChrbXBfaW50MzIgKil1bmZpbmlzaGVkX3RocmVhZHMgKSAtIDE7CisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfZXhlY3V0ZV90YXNrc190ZW1wbGF0ZShkZWMgIzIpOiBUIyVkIGRlYyB1bmZpbmlzaGVkX3RocmVhZHMgdG8gJWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhc2tfdGVhbT0lcFxuIiwgZ3RpZCwgY291bnQsIHRhc2tfdGVhbSkgKTsKKyAgICAgICAgICAgICAgICAqdGhyZWFkX2ZpbmlzaGVkID0gVFJVRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSWYgX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMKKyAgICAgICAgICAgIC8vIHRoZW4gaXQgaXMgbm93IHVuc2FmZSB0byByZWZlcmVuY2UgdGhyZWFkLT50aC50aF90ZWFtICEhIQorICAgICAgICAgICAgLy8gRGVjcmVtZW50aW5nIHRhc2tfdGVhbS0+dHQudHRfdW5maW5pc2hlZF90aHJlYWRzIGNhbiBhbGxvdyB0aGUgbWFzdGVyCisgICAgICAgICAgICAvLyB0aHJlYWQgdG8gcGFzcyB0aHJvdWdoIHRoZSBiYXJyaWVyLCB3aGVyZSBpdCBtaWdodCByZXNldCBlYWNoIHRocmVhZCdzCisgICAgICAgICAgICAvLyB0aC50aF90ZWFtIGZpZWxkIGZvciB0aGUgbmV4dCBwYXJhbGxlbCByZWdpb24uCisgICAgICAgICAgICAvLyBJZiB3ZSBjYW4gc3RlYWwgbW9yZSB3b3JrLCB3ZSBrbm93IHRoYXQgdGhpcyBoYXMgbm90IGhhcHBlbmVkIHlldC4KKyAgICAgICAgICAgIGlmIChmbGFnICE9IE5VTEwgJiYgZmxhZy0+ZG9uZV9jaGVjaygpKSB7CisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoMTUsICgiX19rbXBfZXhlY3V0ZV90YXNrc190ZW1wbGF0ZShleGl0ICM0KTogVCMlZCBzcGluIGNvbmRpdGlvbiBzYXRpc2ZpZWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkKSApOworICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gRmluZCBhIGRpZmZlcmVudCB0aHJlYWQgdG8gc3RlYWwgd29yayBmcm9tLiAgUGljayBhIHJhbmRvbSB0aHJlYWQuCisgICAgLy8gTXkgaW5pdGlhbCBwbGFuIHdhcyB0byBjeWNsZSB0aHJvdWdoIGFsbCB0aGUgdGhyZWFkcywgYW5kIG9ubHkgcmV0dXJuCisgICAgLy8gaWYgd2UgdHJpZWQgdG8gc3RlYWwgZnJvbSBldmVyeSB0aHJlYWQsIGFuZCBmYWlsZWQuICBBcmNoIHNheXMgdGhhdCdzCisgICAgLy8gbm90IHN1Y2ggYSBncmVhdCBpZGVhLgorICAgIC8vIEdFSCAtIG5lZWQgeWllbGQgY29kZSBpbiB0aGlzIGxvb3AgZm9yIHRocm91Z2hwdXQgbGlicmFyeSBtb2RlPworICAgIG5ld192aWN0aW06CisgICAgayA9IF9fa21wX2dldF9yYW5kb20oIHRocmVhZCApICUgKG50aHJlYWRzIC0gMSk7CisgICAgaWYgKCBrID49IHRocmVhZCAtPiB0aC50aF9pbmZvLmRzLmRzX3RpZCApIHsKKyAgICAgICAgKytrOyAgICAgICAgICAgICAgIC8vIEFkanVzdHMgcmFuZG9tIGRpc3RyaWJ1dGlvbiB0byBleGNsdWRlIHNlbGYKKyAgICB9CisgICAgeworICAgICAgICBrbXBfaW5mb190ICpvdGhlcl90aHJlYWQgPSB0aHJlYWRzX2RhdGFba10udGQudGRfdGhyOworICAgICAgICBpbnQgZmlyc3Q7CisKKyAgICAgICAgLy8gVGhlcmUgaXMgYSBzbGlnaHQgY2hhbmNlIHRoYXQgX19rbXBfZW5hYmxlX3Rhc2tpbmcoKSBkaWQgbm90IHdha2UgdXAKKyAgICAgICAgLy8gYWxsIHRocmVhZHMgd2FpdGluZyBhdCB0aGUgYmFycmllci4gIElmIHRoaXMgdGhyZWFkIGlzIHNsZWVwaW5nLCB0aGVuCisgICAgICAgIC8vIHRoZW4gd2FrZSBpdCB1cC4gIFNpbmNlIHdlIHdlcmVlIGdvaW5nIHRvIHBheSB0aGUgY2FjaGUgbWlzcyBwZW5hbHR5CisgICAgICAgIC8vIGZvciByZWZlcmVuY2VpbmcgYW5vdGhlciB0aHJlYWQncyBrbXBfaW5mb190IHN0cnVjdCBhbnl3YXksIHRoZSBjaGVjaworICAgICAgICAvLyBzaG91bGRuJ3QgY29zdCB0b28gbXVjaCBwZXJmb3JtYW5jZSBhdCB0aGlzIHBvaW50LgorICAgICAgICAvLyBJbiBleHRyYSBiYXJyaWVyIG1vZGUsIHRhc2tzIGRvIG5vdCBzbGVlcCBhdCB0aGUgc2VwYXJhdGUgdGFza2luZworICAgICAgICAvLyBiYXJyaWVyLCBzbyB0aGlzIGlzbid0IGEgcHJvYmxlbS4KKyAgICAgICAgaWYgKCAoIF9fa21wX3Rhc2tpbmdfbW9kZSA9PSB0c2ttX3Rhc2tfdGVhbXMgKSAmJgorICAgICAgICAgICAgIChfX2ttcF9kZmx0X2Jsb2NrdGltZSAhPSBLTVBfTUFYX0JMT0NLVElNRSkgJiYKKyAgICAgICAgICAgICAoVENSX1BUUihvdGhlcl90aHJlYWQtPnRoLnRoX3NsZWVwX2xvYykgIT0gTlVMTCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fa21wX251bGxfcmVzdW1lX3dyYXBwZXIoX19rbXBfZ3RpZF9mcm9tX3RocmVhZChvdGhlcl90aHJlYWQpLCBvdGhlcl90aHJlYWQtPnRoLnRoX3NsZWVwX2xvYyk7CisgICAgICAgICAgICAvLyBBIHNsZWVwaW5nIHRocmVhZCBzaG91bGQgbm90IGhhdmUgYW55IHRhc2tzIG9uIGl0J3MgcXVldWUuCisgICAgICAgICAgICAvLyBUaGVyZSBpcyBhIHNsaWdodCBwb3NzaWJpbGl0eSB0aGF0IGl0IHJlc3VtZXMsIHN0ZWFscyBhIHRhc2sgZnJvbQorICAgICAgICAgICAgLy8gYW5vdGhlciB0aHJlYWQsIHdoaWNoIHNwYXducyBtb3JlIHRhc2tzLCBhbGwgaW4gdGhlIHRoYXQgaXQgdGFrZXMKKyAgICAgICAgICAgIC8vIHRoaXMgdGhyZWFkIHRvIGNoZWNrID0+IGRvbid0IHdyaXRlIGFuIGFzc2VydGlvbiB0aGF0IHRoZSB2aWN0aW0ncworICAgICAgICAgICAgLy8gcXVldWUgaXMgZW1wdHkuICBUcnkgc3RlYWxpbmcgZnJvbSBhIGRpZmZlcmVudCB0aHJlYWQuCisgICAgICAgICAgICBnb3RvIG5ld192aWN0aW07CisgICAgICAgIH0KKworICAgICAgICAvLyBOb3cgdHJ5IHRvIHN0ZWFsIHdvcmsgZnJvbSB0aGUgc2VsZWN0ZWQgdGhyZWFkCisgICAgICAgIGZpcnN0ID0gVFJVRTsKKyAgICAgICAgd2hpbGUgKCh0YXNrID0gX19rbXBfc3RlYWxfdGFzayggb3RoZXJfdGhyZWFkLCBndGlkLCB0YXNrX3RlYW0sIHVuZmluaXNoZWRfdGhyZWFkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkX2ZpbmlzaGVkLCBpc19jb25zdHJhaW5lZCApKSAhPSBOVUxMKQorICAgICAgICB7CisjaWYgVVNFX0lUVF9CVUlMRCAmJiBVU0VfSVRUX05PVElGWQorICAgICAgICAgICAgaWYgKCBfX2l0dF9zeW5jX2NyZWF0ZV9wdHIgfHwgS01QX0lUVF9ERUJVRyApIHsKKyAgICAgICAgICAgICAgICBpZiAoIGl0dF9zeW5jX29iaiA9PSBOVUxMICkgeworICAgICAgICAgICAgICAgICAgICAvLyB3ZSBhcmUgYXQgZm9yayBiYXJyaWVyIHdoZXJlIHdlIGNvdWxkIG5vdCBnZXQgdGhlIG9iamVjdCByZWxpYWJseQorICAgICAgICAgICAgICAgICAgICBpdHRfc3luY19vYmogID0gX19rbXBfaXR0X2JhcnJpZXJfb2JqZWN0KCBndGlkLCBic19mb3Jram9pbl9iYXJyaWVyICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIF9fa21wX2l0dF90YXNrX3N0YXJ0aW5nKCBpdHRfc3luY19vYmogKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICYmIFVTRV9JVFRfTk9USUZZICovCisgICAgICAgICAgICBfX2ttcF9pbnZva2VfdGFzayggZ3RpZCwgdGFzaywgY3VycmVudF90YXNrICk7CisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICAgICAgaWYgKCBpdHRfc3luY19vYmogIT0gTlVMTCApCisgICAgICAgICAgICAgICAgX19rbXBfaXR0X3Rhc2tfZmluaXNoZWQoIGl0dF9zeW5jX29iaiApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgICAgICAgICAgLy8gVHJ5IHN0ZWFsaW5nIGZyb20gdGhpcyB2aWN0aW0gYWdhaW4sIGluIHRoZSBmdXR1cmUuCisgICAgICAgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgICAgICAgICB0aHJlYWRzX2RhdGFbIHRpZCBdLnRkLnRkX2RlcXVlX2xhc3Rfc3RvbGVuID0gazsKKyAgICAgICAgICAgICAgICBmaXJzdCA9IEZBTFNFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhpcyB0aHJlYWQgY2FuIHByb2NlZWQuCisgICAgICAgICAgICBpZiAoZmxhZyA9PSBOVUxMIHx8ICghZmluYWxfc3BpbiAmJiBmbGFnLT5kb25lX2NoZWNrKCkpKSB7CisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoMTUsICgiX19rbXBfZXhlY3V0ZV90YXNrc190ZW1wbGF0ZShleGl0ICM1KTogVCMlZCBzcGluIGNvbmRpdGlvbiBzYXRpc2ZpZWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkKSApOworICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgS01QX1lJRUxEKCBfX2ttcF9saWJyYXJ5ID09IGxpYnJhcnlfdGhyb3VnaHB1dCApOyAgIC8vIFlpZWxkIGJlZm9yZSBleGVjdXRpbmcgbmV4dCB0YXNrCisKKyAgICAgICAgICAgIC8vIElmIHRoZSBleGVjdXRpb24gb2YgdGhlIHN0b2xlbiB0YXNrIHJlc3VsdGVkIGluIG1vcmUgdGFza3MgYmVpbmcKKyAgICAgICAgICAgIC8vIHBsYWNlZCBvbiBvdXIgcnVuIHF1ZXVlLCB0aGVuIHJlc3RhcnQgdGhlIHdob2xlIHByb2Nlc3MuCisgICAgICAgICAgICBpZiAoVENSXzQodGhyZWFkc19kYXRhWyB0aWQgXS50ZC50ZF9kZXF1ZV9udGFza3MpICE9IDApIHsKKyAgICAgICAgICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9leGVjdXRlX3Rhc2tzX3RlbXBsYXRlOiBUIyVkIHN0b2xlbiB0YXNrIHNwYXduZWQgb3RoZXIgdGFza3MsIHJlc3RhcnRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkKSApOworICAgICAgICAgICAgICAgIGdvdG8gc3RhcnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBUaGUgdmljdGltcydzIHdvcmsgcXVldWUgaXMgZW1wdHkuICBJZiB3ZSBhcmUgaW4gdGhlIGZpbmFsIHNwaW4gbG9vcAorICAgICAgICAvLyBvZiB0aGUgYmFycmllciwgY2hlY2sgYW5kIHNlZSBpZiB0aGUgdGVybWluYXRpb24gY29uZGl0aW9uIGlzIHNhdGlzZmllZC4KKyAgICAgICAgLy8gR29pbmcgb24gYW5kIGZpbmRpbmcgYSBuZXcgdmljdGltIHRvIHN0ZWFsIGZyb20gaXMgZXhwZW5zaXZlLCBhcyBpdAorICAgICAgICAvLyBpbnZvbHZlcyBhIGxvdCBvZiBjYWNoZSBtaXNzZXMsIHNvIHdlIGRlZmluaXRlbHkgd2FudCB0byByZS1jaGVjayB0aGUKKyAgICAgICAgLy8gdGVybWluYXRpb24gY29uZGl0aW9uIGJlZm9yZSBkb2luZyB0aGF0LgorICAgICAgICBpZiAoZmluYWxfc3BpbikgeworICAgICAgICAgICAgLy8gRmlyc3QsIGRlY3JlbWVudCB0aGUgI3VuZmluaXNoZWQgdGhyZWFkcywgaWYgdGhhdCBoYXMgbm90IGFscmVhZHkKKyAgICAgICAgICAgIC8vIGJlZW4gZG9uZS4gIFRoaXMgZGVjcmVtZW50IG1pZ2h0IGJlIHRvIHRoZSBzcGluIGxvY2F0aW9uLCBhbmQKKyAgICAgICAgICAgIC8vIHJlc3VsdCBpbiB0aGUgdGVybWluYXRpb24gY29uZGl0aW9uIGJlaW5nIHNhdGlzZmllZC4KKyAgICAgICAgICAgIGlmICghICp0aHJlYWRfZmluaXNoZWQpIHsKKyAgICAgICAgICAgICAgICBrbXBfdWludDMyIGNvdW50ID0gS01QX1RFU1RfVEhFTl9ERUMzMiggKGttcF9pbnQzMiAqKXVuZmluaXNoZWRfdGhyZWFkcyApIC0gMTsKKyAgICAgICAgICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9leGVjdXRlX3Rhc2tzX3RlbXBsYXRlKGRlYyAjMyk6IFQjJWQgZGVjIHVuZmluaXNoZWRfdGhyZWFkcyB0byAlZDsgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhc2tfdGVhbT0lcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIGNvdW50LCB0YXNrX3RlYW0pICk7CisgICAgICAgICAgICAgICAgKnRocmVhZF9maW5pc2hlZCA9IFRSVUU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIElmIF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjLAorICAgICAgICAgICAgLy8gdGhlbiBpdCBpcyBub3cgdW5zYWZlIHRvIHJlZmVyZW5jZSB0aHJlYWQtPnRoLnRoX3RlYW0gISEhCisgICAgICAgICAgICAvLyBEZWNyZW1lbnRpbmcgdGFza190ZWFtLT50dC50dF91bmZpbmlzaGVkX3RocmVhZHMgY2FuIGFsbG93IHRoZSBtYXN0ZXIKKyAgICAgICAgICAgIC8vIHRocmVhZCB0byBwYXNzIHRocm91Z2ggdGhlIGJhcnJpZXIsIHdoZXJlIGl0IG1pZ2h0IHJlc2V0IGVhY2ggdGhyZWFkJ3MKKyAgICAgICAgICAgIC8vIHRoLnRoX3RlYW0gZmllbGQgZm9yIHRoZSBuZXh0IHBhcmFsbGVsIHJlZ2lvbi4KKyAgICAgICAgICAgIC8vIElmIHdlIGNhbiBzdGVhbCBtb3JlIHdvcmssIHdlIGtub3cgdGhhdCB0aGlzIGhhcyBub3QgaGFwcGVuZWQgeWV0LgorICAgICAgICAgICAgaWYgKGZsYWcgIT0gTlVMTCAmJiBmbGFnLT5kb25lX2NoZWNrKCkpIHsKKyAgICAgICAgICAgICAgICBLQV9UUkFDRSgxNSwgKCJfX2ttcF9leGVjdXRlX3Rhc2tzX3RlbXBsYXRlKGV4aXQgIzYpOiBUIyVkIHNwaW4gY29uZGl0aW9uIHNhdGlzZmllZFxuIiwgZ3RpZCkgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEtBX1RSQUNFKDE1LCAoIl9fa21wX2V4ZWN1dGVfdGFza3NfdGVtcGxhdGUoZXhpdCAjNyk6IFQjJWQgY2FuJ3QgZmluZCB3b3JrXG4iLCBndGlkKSApOworICAgIHJldHVybiBGQUxTRTsKK30KKworaW50IF9fa21wX2V4ZWN1dGVfdGFza3NfMzIoa21wX2luZm9fdCAqdGhyZWFkLCBrbXBfaW50MzIgZ3RpZCwga21wX2ZsYWdfMzIgKmZsYWcsIGludCBmaW5hbF9zcGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICp0aHJlYWRfZmluaXNoZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKHZvaWQgKiBpdHRfc3luY19vYmopLCBrbXBfaW50MzIgaXNfY29uc3RyYWluZWQpCit7CisgICAgcmV0dXJuIF9fa21wX2V4ZWN1dGVfdGFza3NfdGVtcGxhdGUodGhyZWFkLCBndGlkLCBmbGFnLCBmaW5hbF9zcGluLCB0aHJlYWRfZmluaXNoZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopLCBpc19jb25zdHJhaW5lZCk7Cit9CisKK2ludCBfX2ttcF9leGVjdXRlX3Rhc2tzXzY0KGttcF9pbmZvX3QgKnRocmVhZCwga21wX2ludDMyIGd0aWQsIGttcF9mbGFnXzY0ICpmbGFnLCBpbnQgZmluYWxfc3BpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqdGhyZWFkX2ZpbmlzaGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyh2b2lkICogaXR0X3N5bmNfb2JqKSwga21wX2ludDMyIGlzX2NvbnN0cmFpbmVkKQoreworICAgIHJldHVybiBfX2ttcF9leGVjdXRlX3Rhc2tzX3RlbXBsYXRlKHRocmVhZCwgZ3RpZCwgZmxhZywgZmluYWxfc3BpbiwgdGhyZWFkX2ZpbmlzaGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSwgaXNfY29uc3RyYWluZWQpOworfQorCitpbnQgX19rbXBfZXhlY3V0ZV90YXNrc19vbmNvcmUoa21wX2luZm9fdCAqdGhyZWFkLCBrbXBfaW50MzIgZ3RpZCwga21wX2ZsYWdfb25jb3JlICpmbGFnLCBpbnQgZmluYWxfc3BpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnRocmVhZF9maW5pc2hlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKHZvaWQgKiBpdHRfc3luY19vYmopLCBrbXBfaW50MzIgaXNfY29uc3RyYWluZWQpCit7CisgICAgcmV0dXJuIF9fa21wX2V4ZWN1dGVfdGFza3NfdGVtcGxhdGUodGhyZWFkLCBndGlkLCBmbGFnLCBmaW5hbF9zcGluLCB0aHJlYWRfZmluaXNoZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopLCBpc19jb25zdHJhaW5lZCk7Cit9CisKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcF9lbmFibGVfdGFza2luZzogQWxsb2NhdGUgdGFzayB0ZWFtIGFuZCByZXN1bWUgdGhyZWFkcyBzbGVlcGluZyBhdCB0aGUKKy8vIG5leHQgYmFycmllciBzbyB0aGV5IGNhbiBhc3Npc3QgaW4gZXhlY3V0aW5nIGVucXVldWVkIHRhc2tzLgorLy8gRmlyc3QgdGhyZWFkIGluIGFsbG9jYXRlcyB0aGUgdGFzayB0ZWFtIGF0b21pY2FsbHkuCisKK3N0YXRpYyB2b2lkCitfX2ttcF9lbmFibGVfdGFza2luZygga21wX3Rhc2tfdGVhbV90ICp0YXNrX3RlYW0sIGttcF9pbmZvX3QgKnRoaXNfdGhyICkKK3sKKyAgICBrbXBfdGVhbV90ICp0ZWFtID0gdGhpc190aHItPnRoLnRoX3RlYW07CisgICAga21wX3RocmVhZF9kYXRhX3QgKnRocmVhZHNfZGF0YTsKKyAgICBpbnQgbnRocmVhZHMsIGksIGlzX2luaXRfdGhyZWFkOworCisgICAgS0FfVFJBQ0UoIDEwLCAoICJfX2ttcF9lbmFibGVfdGFza2luZyhlbnRlcik6IFQjJWRcbiIsCisgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRoaXNfdGhyICkgKSApOworCisgICAgS01QX0RFQlVHX0FTU0VSVCh0YXNrX3RlYW0gIT0gTlVMTCk7CisgICAgS01QX0RFQlVHX0FTU0VSVCh0ZWFtICE9IE5VTEwpOworCisgICAgbnRocmVhZHMgPSB0YXNrX3RlYW0tPnR0LnR0X25wcm9jOworICAgIEtNUF9ERUJVR19BU1NFUlQobnRocmVhZHMgPiAwKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKG50aHJlYWRzID09IHRlYW0tPnQudF9ucHJvYyk7CisKKyAgICAvLyBBbGxvY2F0ZSBvciBpbmNyZWFzZSB0aGUgc2l6ZSBvZiB0aHJlYWRzX2RhdGEgaWYgbmVjZXNzYXJ5CisgICAgaXNfaW5pdF90aHJlYWQgPSBfX2ttcF9yZWFsbG9jX3Rhc2tfdGhyZWFkc19kYXRhKCB0aGlzX3RociwgdGFza190ZWFtICk7CisKKyAgICBpZiAoIWlzX2luaXRfdGhyZWFkKSB7CisgICAgICAgIC8vIFNvbWUgb3RoZXIgdGhyZWFkIGFscmVhZHkgc2V0IHVwIHRoZSBhcnJheS4KKyAgICAgICAgS0FfVFJBQ0UoIDIwLCAoICJfX2ttcF9lbmFibGVfdGFza2luZyhleGl0KTogVCMlZDogdGhyZWFkcyBhcnJheSBhbHJlYWR5IHNldCB1cC5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aGlzX3RociApICkgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICB0aHJlYWRzX2RhdGEgPSAoa21wX3RocmVhZF9kYXRhX3QgKilUQ1JfUFRSKHRhc2tfdGVhbSAtPiB0dC50dF90aHJlYWRzX2RhdGEpOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRocmVhZHNfZGF0YSAhPSBOVUxMICk7CisKKyAgICBpZiAoICggX19rbXBfdGFza2luZ19tb2RlID09IHRza21fdGFza190ZWFtcyApICYmCisgICAgICAgICAoIF9fa21wX2RmbHRfYmxvY2t0aW1lICE9IEtNUF9NQVhfQkxPQ0tUSU1FICkgKQorICAgIHsKKyAgICAgICAgLy8gUmVsZWFzZSBhbnkgdGhyZWFkcyBzbGVlcGluZyBhdCB0aGUgYmFycmllciwgc28gdGhhdCB0aGV5IGNhbiBzdGVhbAorICAgICAgICAvLyB0YXNrcyBhbmQgZXhlY3V0ZSB0aGVtLiAgSW4gZXh0cmEgYmFycmllciBtb2RlLCB0YXNrcyBkbyBub3Qgc2xlZXAKKyAgICAgICAgLy8gYXQgdGhlIHNlcGFyYXRlIHRhc2tpbmcgYmFycmllciwgc28gdGhpcyBpc24ndCBhIHByb2JsZW0uCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudGhyZWFkczsgaSsrKSB7CisgICAgICAgICAgICB2b2xhdGlsZSB2b2lkICpzbGVlcF9sb2M7CisgICAgICAgICAgICBrbXBfaW5mb190ICp0aHJlYWQgPSB0aHJlYWRzX2RhdGFbaV0udGQudGRfdGhyOworCisgICAgICAgICAgICBpZiAoaSA9PSB0aGlzX3Roci0+dGgudGhfaW5mby5kcy5kc190aWQpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFNpbmNlIHdlIGhhdmVuJ3QgbG9ja2VkIHRoZSB0aHJlYWQncyBzdXNwZW5kIG11dGV4IGxvY2sgYXQgdGhpcworICAgICAgICAgICAgLy8gcG9pbnQsIHRoZXJlIGlzIGEgc21hbGwgd2luZG93IHdoZXJlIGEgdGhyZWFkIG1pZ2h0IGJlIHB1dHRpbmcKKyAgICAgICAgICAgIC8vIGl0c2VsZiB0byBzbGVlcCwgYnV0IGhhc24ndCBzZXQgdGhlIHRoX3NsZWVwX2xvYyBmaWVsZCB5ZXQuCisgICAgICAgICAgICAvLyBUbyB3b3JrIGFyb3VuZCB0aGlzLCBfX2ttcF9leGVjdXRlX3Rhc2tzX3RlbXBsYXRlKCkgcGVyaW9kaWNhbGx5IGNoZWNrcworICAgICAgICAgICAgLy8gc2VlIGlmIG90aGVyIHRocmVhZHMgYXJlIHNsZWVwaW5nICh1c2luZyB0aGUgc2FtZSByYW5kb20KKyAgICAgICAgICAgIC8vIG1lY2hhbmlzbSB0aGF0IGlzIHVzZWQgZm9yIHRhc2sgc3RlYWxpbmcpIGFuZCBhd2FrZW5zIHRoZW0gaWYKKyAgICAgICAgICAgIC8vIHRoZXkgYXJlLgorICAgICAgICAgICAgaWYgKCAoIHNsZWVwX2xvYyA9IFRDUl9QVFIoIHRocmVhZCAtPiB0aC50aF9zbGVlcF9sb2MpICkgIT0gTlVMTCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgS0ZfVFJBQ0UoIDUwLCAoICJfX2ttcF9lbmFibGVfdGFza2luZzogVCMlZCB3YWtpbmcgdXAgdGhyZWFkIFQjJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aGlzX3RociApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGhyZWFkICkgKSApOworICAgICAgICAgICAgICAgIF9fa21wX251bGxfcmVzdW1lX3dyYXBwZXIoX19rbXBfZ3RpZF9mcm9tX3RocmVhZCh0aHJlYWQpLCBzbGVlcF9sb2MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgS0ZfVFJBQ0UoIDUwLCAoICJfX2ttcF9lbmFibGVfdGFza2luZzogVCMlZCBkb24ndCB3YWtlIHVwIHRocmVhZCBUIyVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGhpc190aHIgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRocmVhZCApICkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEtBX1RSQUNFKCAxMCwgKCAiX19rbXBfZW5hYmxlX3Rhc2tpbmcoZXhpdCk6IFQjJWRcbiIsCisgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRoaXNfdGhyICkgKSApOworfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLy8gVE9ETzogQ2hlY2sgdGhlIGNvbW1lbnQgY29uc2lzdGVuY3kKKyAqIFV0aWxpdHkgcm91dGluZXMgZm9yICJ0YXNrIHRlYW1zIi4gIEEgdGFzayB0ZWFtIChrbXBfdGFza190KSBpcyBraW5kIG9mCisgKiBsaWtlIGEgc2hhZG93IG9mIHRoZSBrbXBfdGVhbV90IGRhdGEgc3RydWN0LCB3aXRoIGEgZGlmZmVyZW50IGxpZmV0aW1lLgorICogQWZ0ZXIgYSBjaGlsZCAqIHRocmVhZCBjaGVja3MgaW50byBhIGJhcnJpZXIgYW5kIGNhbGxzIF9fa21wX3JlbGVhc2UoKSBmcm9tCisgKiB0aGUgcGFydGljdWxhciB2YXJpYW50IG9mIF9fa21wXzxiYXJyaWVyX2tpbmQ+X2JhcnJpZXJfZ2F0aGVyKCksIGl0IGNhbiBubworICogbG9uZ2VyIGFzc3VtZSB0aGF0IHRoZSBrbXBfdGVhbV90IHN0cnVjdHVyZSBpcyBpbnRhY3QgKGF0IGFueSBtb21lbnQsIHRoZQorICogbWFzdGVyIHRocmVhZCBtYXkgZXhpdCB0aGUgYmFycmllciBjb2RlIGFuZCBmcmVlIHRoZSB0ZWFtIGRhdGEgc3RydWN0dXJlLAorICogYW5kIHJldHVybiB0aGUgdGhyZWFkcyB0byB0aGUgdGhyZWFkIHBvb2wpLgorICoKKyAqIFRoaXMgZG9lcyBub3Qgd29yayB3aXRoIHRoZSB0aGUgdGFza2luZyBjb2RlLCBhcyB0aGUgdGhyZWFkIGlzIHN0aWxsCisgKiBleHBlY3RlZCB0byBwYXJ0aWNpcGF0ZSBpbiB0aGUgZXhlY3V0aW9uIG9mIGFueSB0YXNrcyB0aGF0IG1heSBoYXZlIGJlZW4KKyAqIHNwYXduZWQgbXkgYSBtZW1iZXIgb2YgdGhlIHRlYW0sIGFuZCB0aGUgdGhyZWFkIHN0aWxsIG5lZWRzIGFjY2VzcyB0byBhbGwKKyAqIHRvIGVhY2ggdGhyZWFkIGluIHRoZSB0ZWFtLCBzbyB0aGF0IGl0IGNhbiBzdGVhbCB3b3JrIGZyb20gaXQuCisgKgorICogRW50ZXIgdGhlIGV4aXN0ZW5jZSBvZiB0aGUga21wX3Rhc2tfdGVhbV90IHN0cnVjdC4gIEl0IGVtcGxveXMgYSByZWZlcmVuY2UKKyAqIGNvdW50aW5nIG1lY2hhbmltcywgYW5kIGlzIGFsbG9jYXRlZCBieSB0aGUgbWFzdGVyIHRocmVhZCBiZWZvcmUgY2FsbGluZworICogX19rbXBfPGJhcnJpZXJfa2luZD5fcmVsZWFzZSwgYW5kIHRoZW4gaXMgcmVsZWFzZSBieSB0aGUgbGFzdCB0aHJlYWQgdG8KKyAqIGV4aXQgX19rbXBfPGJhcnJpZXJfa2luZD5fcmVsZWFzZSBhdCB0aGUgbmV4dCBiYXJyaWVyLiAgSS5lLiB0aGUgbGlmZXRpbWVzCisgKiBvZiB0aGUga21wX3Rhc2tfdGVhbV90IHN0cnVjdHMgZm9yIGNvbnNlY3V0aXZlIGJhcnJpZXJzIGNhbiBvdmVybGFwCisgKiAoYW5kIHdpbGwsIHVubGVzcyB0aGUgbWFzdGVyIHRocmVhZCBpcyB0aGUgbGFzdCB0aHJlYWQgdG8gZXhpdCB0aGUgYmFycmllcgorICogcmVsZWFzZSBwaGFzZSwgd2hpY2ggaXMgbm90IHR5cGljYWwpLgorICoKKyAqIFRoZSBleGlzdGVuY2Ugb2Ygc3VjaCBhIHN0cnVjdCBpcyB1c2VmdWwgb3V0c2lkZSB0aGUgY29udGV4dCBvZiB0YXNraW5nLAorICogYnV0IGZvciBub3csIEknbSB0cnlpbmcgdG8ga2VlcCBpdCBzcGVjaWZpYyB0byB0aGUgT01QXzMwX0VOQUJMRUQgbWFjcm8sCisgKiBzbyB0aGF0IGFueSBwZXJmb3JtYW5jZSBkaWZmZXJlbmNlcyBzaG93IHVwIHdoZW4gY29tcGFyaW5nIHRoZSAyLjUgdnMuIDMuMAorICogbGlicmFyaWVzLgorICoKKyAqIFdlIGN1cnJlbnRseSB1c2UgdGhlIGV4aXN0ZW5jZSBvZiB0aGUgdGhyZWFkcyBhcnJheSBhcyBhbiBpbmRpY2F0b3IgdGhhdAorICogdGFza3Mgd2VyZSBzcGF3bmVkIHNpbmNlIHRoZSBsYXN0IGJhcnJpZXIuICBJZiB0aGUgc3RydWN0dXJlIGlzIHRvIGJlCisgKiB1c2VmdWwgb3V0c2lkZSB0aGUgY29udGV4dCBvZiB0YXNraW5nLCB0aGVuIHRoaXMgd2lsbCBoYXZlIHRvIGNoYW5nZSwgYnV0CisgKiBub3Qgc2V0dHRpbmcgdGhlIGZpZWxkIG1pbmltaXplcyB0aGUgcGVyZm9ybWFuY2UgaW1wYWN0IG9mIHRhc2tpbmcgb24KKyAqIGJhcnJpZXJzLCB3aGVuIG5vIGV4cGxpY2l0IHRhc2tzIHdlcmUgc3Bhd25lZCAocHVzaGVkLCBhY3R1YWxseSkuCisgKi8KKworCitzdGF0aWMga21wX3Rhc2tfdGVhbV90ICpfX2ttcF9mcmVlX3Rhc2tfdGVhbXMgPSBOVUxMOyAgICAgICAgICAgLy8gRnJlZSBsaXN0IGZvciB0YXNrX3RlYW0gZGF0YSBzdHJ1Y3R1cmVzCisvLyBMb2NrIGZvciB0YXNrIHRlYW0gZGF0YSBzdHJ1Y3R1cmVzCitzdGF0aWMga21wX2Jvb3RzdHJhcF9sb2NrX3QgX19rbXBfdGFza190ZWFtX2xvY2sgPSBLTVBfQk9PVFNUUkFQX0xPQ0tfSU5JVElBTElaRVIoIF9fa21wX3Rhc2tfdGVhbV9sb2NrICk7CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wX2FsbG9jX3Rhc2tfZGVxdWU6CisvLyBBbGxvY2F0ZXMgYSB0YXNrIGRlcXVlIGZvciBhIHBhcnRpY3VsYXIgdGhyZWFkLCBhbmQgaW5pdGlhbGl6ZSB0aGUgbmVjZXNzYXJ5CisvLyBkYXRhIHN0cnVjdHVyZXMgcmVsYXRpbmcgdG8gdGhlIGRlcXVlLiAgVGhpcyBvbmx5IGhhcHBlbnMgb25jZSBwZXIgdGhyZWFkCisvLyBwZXIgdGFzayB0ZWFtIHNpbmNlIHRhc2sgdGVhbXMgYXJlIHJlY3ljbGVkLgorLy8gTm8gbG9jayBpcyBuZWVkZWQgZHVyaW5nIGFsbG9jYXRpb24gc2luY2UgZWFjaCB0aHJlYWQgYWxsb2NhdGVzIGl0cyBvd24KKy8vIGRlcXVlLgorCitzdGF0aWMgdm9pZAorX19rbXBfYWxsb2NfdGFza19kZXF1ZSgga21wX2luZm9fdCAqdGhyZWFkLCBrbXBfdGhyZWFkX2RhdGFfdCAqdGhyZWFkX2RhdGEgKQoreworICAgIF9fa21wX2luaXRfYm9vdHN0cmFwX2xvY2soICYgdGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVfbG9jayApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlID09IE5VTEwgKTsKKworICAgIC8vIEluaXRpYWxpemUgbGFzdCBzdG9sZW4gdGFzayBmaWVsZCB0byAibm9uZSIKKyAgICB0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV9sYXN0X3N0b2xlbiA9IC0xOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggVENSXzQodGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVfbnRhc2tzKSA9PSAwICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVfaGVhZCA9PSAwICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVfdGFpbCA9PSAwICk7CisKKyAgICBLRV9UUkFDRSggMTAsICggIl9fa21wX2FsbG9jX3Rhc2tfZGVxdWU6IFQjJWQgYWxsb2NhdGluZyBkZXF1ZVslZF0gZm9yIHRocmVhZF9kYXRhICVwXG4iLAorICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRocmVhZCApLCBUQVNLX0RFUVVFX1NJWkUsIHRocmVhZF9kYXRhICkgKTsKKyAgICAvLyBBbGxvY2F0ZSBzcGFjZSBmb3IgdGFzayBkZXF1ZSwgYW5kIHplcm8gdGhlIGRlcXVlCisgICAgLy8gQ2Fubm90IHVzZSBfX2ttcF90aHJlYWRfY2FsbG9jKCkgYmVjYXVzZSB0aHJlYWRzIG5vdCBhcm91bmQgZm9yCisgICAgLy8ga21wX3JlYXBfdGFza190ZWFtKCApLgorICAgIHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlID0gKGttcF90YXNrZGF0YV90ICoqKQorICAgICAgICAgICAgX19rbXBfYWxsb2NhdGUoIFRBU0tfREVRVUVfU0laRSAqIHNpemVvZihrbXBfdGFza2RhdGFfdCAqKSk7Cit9CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wX2ZyZWVfdGFza19kZXF1ZToKKy8vIERlYWxsb2NhdGVzIGEgdGFzayBkZXF1ZSBmb3IgYSBwYXJ0aWN1bGFyIHRocmVhZC4KKy8vIEhhcHBlbnMgYXQgbGlicmFyeSBkZWFsbG9jYXRpb24gc28gZG9uJ3QgbmVlZCB0byByZXNldCBhbGwgdGhyZWFkIGRhdGEgZmllbGRzLgorCitzdGF0aWMgdm9pZAorX19rbXBfZnJlZV90YXNrX2RlcXVlKCBrbXBfdGhyZWFkX2RhdGFfdCAqdGhyZWFkX2RhdGEgKQoreworICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICYgdGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVfbG9jayApOworCisgICAgaWYgKCB0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZSAhPSBOVUxMICkgeworICAgICAgICBUQ1dfNCh0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV9udGFza3MsIDApOworICAgICAgICAgX19rbXBfZnJlZSggdGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWUgKTsKKyAgICAgICAgdGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWUgPSBOVUxMOworICAgIH0KKyAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmIHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlX2xvY2sgKTsKKworI2lmZGVmIEJVSUxEX1RJRURfVEFTS19TVEFDSworICAgIC8vIEdFSDogRmlndXJlIG91dCB3aGF0IHRvIGRvIGhlcmUgZm9yIHRkX3N1c3BfdGllZF90YXNrcworICAgIGlmICggdGhyZWFkX2RhdGEgLT4gdGQudGRfc3VzcF90aWVkX3Rhc2tzLnRzX2VudHJpZXMgIT0gVEFTS19TVEFDS19FTVBUWSApIHsKKyAgICAgICAgX19rbXBfZnJlZV90YXNrX3N0YWNrKCBfX2ttcF90aHJlYWRfZnJvbV9ndGlkKCBndGlkICksIHRocmVhZF9kYXRhICk7CisgICAgfQorI2VuZGlmIC8vIEJVSUxEX1RJRURfVEFTS19TVEFDSworfQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcF9yZWFsbG9jX3Rhc2tfdGhyZWFkc19kYXRhOgorLy8gQWxsb2NhdGVzIGEgdGhyZWFkc19kYXRhIGFycmF5IGZvciBhIHRhc2sgdGVhbSwgZWl0aGVyIGJ5IGFsbG9jYXRpbmcgYW4gaW5pdGlhbAorLy8gYXJyYXkgb3IgZW5sYXJnaW5nIGFuIGV4aXN0aW5nIGFycmF5LiAgT25seSB0aGUgZmlyc3QgdGhyZWFkIHRvIGdldCB0aGUgbG9jaworLy8gYWxsb2NzIG9yIGVubGFyZ2VzIHRoZSBhcnJheSBhbmQgcmUtaW5pdGlhbGl6ZXMgdGhlIGFycmF5IGVsZWVtbnRzLgorLy8gVGhhdCB0aHJlYWQgcmV0dXJucyAiVFJVRSIsIHRoZSByZXN0IHJldHVybiAiRkFMU0UiLgorLy8gQXNzdW1lcyB0aGF0IHRoZSBuZXcgYXJyYXkgc2l6ZSBpcyBnaXZlbiBieSB0YXNrX3RlYW0gLT4gdHQudHRfbnByb2MuCisvLyBUaGUgY3VycmVudCBzaXplIGlzIGdpdmVuIGJ5IHRhc2tfdGVhbSAtPiB0dC50dF9tYXhfdGhyZWFkcy4KKworc3RhdGljIGludAorX19rbXBfcmVhbGxvY190YXNrX3RocmVhZHNfZGF0YSgga21wX2luZm9fdCAqdGhyZWFkLCBrbXBfdGFza190ZWFtX3QgKnRhc2tfdGVhbSApCit7CisgICAga21wX3RocmVhZF9kYXRhX3QgKiogdGhyZWFkc19kYXRhX3A7CisgICAga21wX2ludDMyICAgICAgICAgICAgbnRocmVhZHMsIG1heHRocmVhZHM7CisgICAgaW50ICAgICAgICAgICAgICAgICAgaXNfaW5pdF90aHJlYWQgPSBGQUxTRTsKKworICAgIGlmICggVENSXzQodGFza190ZWFtIC0+IHR0LnR0X2ZvdW5kX3Rhc2tzKSApIHsKKyAgICAgICAgLy8gQWxyZWFkeSByZWFsbG9jYXRlZCBhbmQgaW5pdGlhbGl6ZWQuCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICB0aHJlYWRzX2RhdGFfcCA9ICYgdGFza190ZWFtIC0+IHR0LnR0X3RocmVhZHNfZGF0YTsKKyAgICBudGhyZWFkcyAgID0gdGFza190ZWFtIC0+IHR0LnR0X25wcm9jOworICAgIG1heHRocmVhZHMgPSB0YXNrX3RlYW0gLT4gdHQudHRfbWF4X3RocmVhZHM7CisKKyAgICAvLyBBbGwgdGhyZWFkcyBtdXN0IGxvY2sgd2hlbiB0aGV5IGVuY291bnRlciB0aGUgZmlyc3QgdGFzayBvZiB0aGUgaW1wbGljaXQgdGFzaworICAgIC8vIHJlZ2lvbiB0byBtYWtlIHN1cmUgdGhyZWFkc19kYXRhIGZpZWxkcyBhcmUgKHJlKWluaXRpYWxpemVkIGJlZm9yZSB1c2VkLgorICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICYgdGFza190ZWFtIC0+IHR0LnR0X3RocmVhZHNfbG9jayApOworCisgICAgaWYgKCAhIFRDUl80KHRhc2tfdGVhbSAtPiB0dC50dF9mb3VuZF90YXNrcykgKSB7CisgICAgICAgIC8vIGZpcnN0IHRocmVhZCB0byBlbmFibGUgdGFza2luZworICAgICAgICBrbXBfdGVhbV90ICp0ZWFtID0gdGhyZWFkIC0+IHRoLnRoX3RlYW07CisgICAgICAgIGludCBpOworCisgICAgICAgIGlzX2luaXRfdGhyZWFkID0gVFJVRTsKKyAgICAgICAgaWYgKCBtYXh0aHJlYWRzIDwgbnRocmVhZHMgKSB7CisKKyAgICAgICAgICAgIGlmICggKnRocmVhZHNfZGF0YV9wICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAga21wX3RocmVhZF9kYXRhX3QgKm9sZF9kYXRhID0gKnRocmVhZHNfZGF0YV9wOworICAgICAgICAgICAgICAgIGttcF90aHJlYWRfZGF0YV90ICpuZXdfZGF0YSA9IE5VTEw7CisKKyAgICAgICAgICAgICAgICBLRV9UUkFDRSggMTAsICggIl9fa21wX3JlYWxsb2NfdGFza190aHJlYWRzX2RhdGE6IFQjJWQgcmVhbGxvY2F0aW5nICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhyZWFkcyBkYXRhIGZvciB0YXNrX3RlYW0gJXAsIG5ld19zaXplID0gJWQsIG9sZF9zaXplID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGhyZWFkICksIHRhc2tfdGVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudGhyZWFkcywgbWF4dGhyZWFkcyApICk7CisgICAgICAgICAgICAgICAgLy8gUmVhbGxvY2F0ZSB0aHJlYWRzX2RhdGEgdG8gaGF2ZSBtb3JlIGVsZW1lbnRzIHRoYW4gY3VycmVudCBhcnJheQorICAgICAgICAgICAgICAgIC8vIENhbm5vdCB1c2UgX19rbXBfdGhyZWFkX3JlYWxsb2MoKSBiZWNhdXNlIHRocmVhZHMgbm90IGFyb3VuZCBmb3IKKyAgICAgICAgICAgICAgICAvLyBrbXBfcmVhcF90YXNrX3RlYW0oICkuICBOb3RlIGFsbCBuZXcgYXJyYXkgZW50cmllcyBhcmUgaW5pdGlhbGl6ZWQKKyAgICAgICAgICAgICAgICAvLyB0byB6ZXJvIGJ5IF9fa21wX2FsbG9jYXRlKCkuCisgICAgICAgICAgICAgICAgbmV3X2RhdGEgPSAoa21wX3RocmVhZF9kYXRhX3QgKikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9hbGxvY2F0ZSggbnRocmVhZHMgKiBzaXplb2Yoa21wX3RocmVhZF9kYXRhX3QpICk7CisgICAgICAgICAgICAgICAgLy8gY29weSBvbGQgZGF0YSB0byBuZXcgZGF0YQorICAgICAgICAgICAgICAgIG1lbWNweSggKHZvaWQgKikgbmV3X2RhdGEsICh2b2lkICopIG9sZF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgbWF4dGhyZWFkcyAqIHNpemVvZihrbXBfdGFza2RhdGFfdCAqKSApOworCisjaWZkZWYgQlVJTERfVElFRF9UQVNLX1NUQUNLCisgICAgICAgICAgICAgICAgLy8gR0VIOiBGaWd1cmUgb3V0IGlmIHRoaXMgaXMgdGhlIHJpZ2h0IHRoaW5nIHRvIGRvCisgICAgICAgICAgICAgICAgZm9yIChpID0gbWF4dGhyZWFkczsgaSA8IG50aHJlYWRzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAga21wX3RocmVhZF9kYXRhX3QgKnRocmVhZF9kYXRhID0gJiAoKnRocmVhZHNfZGF0YV9wKVtpXTsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfaW5pdF90YXNrX3N0YWNrKCBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aHJlYWQgKSwgdGhyZWFkX2RhdGEgKTsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYgLy8gQlVJTERfVElFRF9UQVNLX1NUQUNLCisgICAgICAgICAgICAgICAgLy8gSW5zdGFsbCB0aGUgbmV3IGRhdGEgYW5kIGZyZWUgdGhlIG9sZCBkYXRhCisgICAgICAgICAgICAgICAgKCp0aHJlYWRzX2RhdGFfcCkgPSBuZXdfZGF0YTsKKyAgICAgICAgICAgICAgICBfX2ttcF9mcmVlKCBvbGRfZGF0YSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgS0VfVFJBQ0UoIDEwLCAoICJfX2ttcF9yZWFsbG9jX3Rhc2tfdGhyZWFkc19kYXRhOiBUIyVkIGFsbG9jYXRpbmcgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aHJlYWRzIGRhdGEgZm9yIHRhc2tfdGVhbSAlcCwgc2l6ZSA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRocmVhZCApLCB0YXNrX3RlYW0sIG50aHJlYWRzICkgKTsKKyAgICAgICAgICAgICAgICAvLyBNYWtlIHRoZSBpbml0aWFsIGFsbG9jYXRlIGZvciB0aHJlYWRzX2RhdGEgYXJyYXksIGFuZCB6ZXJvIGVudHJpZXMKKyAgICAgICAgICAgICAgICAvLyBDYW5ub3QgdXNlIF9fa21wX3RocmVhZF9jYWxsb2MoKSBiZWNhdXNlIHRocmVhZHMgbm90IGFyb3VuZCBmb3IKKyAgICAgICAgICAgICAgICAvLyBrbXBfcmVhcF90YXNrX3RlYW0oICkuCisgICAgICAgICAgICAgICAgKnRocmVhZHNfZGF0YV9wID0gKGttcF90aHJlYWRfZGF0YV90ICopCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfYWxsb2NhdGUoIG50aHJlYWRzICogc2l6ZW9mKGttcF90aHJlYWRfZGF0YV90KSApOworI2lmZGVmIEJVSUxEX1RJRURfVEFTS19TVEFDSworICAgICAgICAgICAgICAgIC8vIEdFSDogRmlndXJlIG91dCBpZiB0aGlzIGlzIHRoZSByaWdodCB0aGluZyB0byBkbworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudGhyZWFkczsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGttcF90aHJlYWRfZGF0YV90ICp0aHJlYWRfZGF0YSA9ICYgKCp0aHJlYWRzX2RhdGFfcClbaV07CisgICAgICAgICAgICAgICAgICAgIF9fa21wX2luaXRfdGFza19zdGFjayggX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGhyZWFkICksIHRocmVhZF9kYXRhICk7CisgICAgICAgICAgICAgICAgfQorI2VuZGlmIC8vIEJVSUxEX1RJRURfVEFTS19TVEFDSworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGFza190ZWFtIC0+IHR0LnR0X21heF90aHJlYWRzID0gbnRocmVhZHM7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvLyBJZiBhcnJheSBoYXMgKG1vcmUgdGhhbikgZW5vdWdoIGVsZW1lbnRzLCBnbyBhaGVhZCBhbmQgdXNlIGl0CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCAqdGhyZWFkc19kYXRhX3AgIT0gTlVMTCApOworICAgICAgICB9CisKKyAgICAgICAgLy8gaW5pdGlhbGl6ZSB0aHJlYWRzX2RhdGEgcG9pbnRlcnMgYmFjayB0byB0aHJlYWRfaW5mbyBzdHJ1Y3R1cmVzCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudGhyZWFkczsgaSsrKSB7CisgICAgICAgICAgICBrbXBfdGhyZWFkX2RhdGFfdCAqdGhyZWFkX2RhdGEgPSAmICgqdGhyZWFkc19kYXRhX3ApW2ldOworICAgICAgICAgICAgdGhyZWFkX2RhdGEgLT4gdGQudGRfdGhyID0gdGVhbSAtPiB0LnRfdGhyZWFkc1tpXTsKKworICAgICAgICAgICAgaWYgKCB0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV9sYXN0X3N0b2xlbiA+PSBudGhyZWFkcykgeworICAgICAgICAgICAgICAgIC8vIFRoZSBsYXN0IHN0b2xlbiBmaWVsZCBzdXJ2aXZlcyBhY3Jvc3MgdGVhbXMgLyBiYXJyaWVyLCBhbmQgdGhlIG51bWJlcgorICAgICAgICAgICAgICAgIC8vIG9mIHRocmVhZHMgbWF5IGhhdmUgY2hhbmdlZC4gIEl0J3MgcG9zc2libGUgKGxpa2VseT8pIHRoYXQgYSBuZXcKKyAgICAgICAgICAgICAgICAvLyBwYXJhbGxlbCByZWdpb24gd2lsbCBleGhpYml0IHRoZSBzYW1lIGJlaGF2aW9yIGFzIHRoZSBwcmV2aW91cyByZWdpb24uCisgICAgICAgICAgICAgICAgdGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVfbGFzdF9zdG9sZW4gPSAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEtNUF9NQigpOworICAgICAgICBUQ1dfU1lOQ180KHRhc2tfdGVhbSAtPiB0dC50dF9mb3VuZF90YXNrcywgVFJVRSk7CisgICAgfQorCisgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJiB0YXNrX3RlYW0gLT4gdHQudHRfdGhyZWFkc19sb2NrICk7CisgICAgcmV0dXJuIGlzX2luaXRfdGhyZWFkOworfQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcF9mcmVlX3Rhc2tfdGhyZWFkc19kYXRhOgorLy8gRGVhbGxvY2F0ZXMgYSB0aHJlYWRzX2RhdGEgYXJyYXkgZm9yIGEgdGFzayB0ZWFtLCBpbmNsdWRpbmcgYW55IGF0dGFjaGVkCisvLyB0YXNraW5nIGRlcXVlcy4gIE9ubHkgb2NjdXJzIGF0IGxpYnJhcnkgc2h1dGRvd24uCisKK3N0YXRpYyB2b2lkCitfX2ttcF9mcmVlX3Rhc2tfdGhyZWFkc19kYXRhKCBrbXBfdGFza190ZWFtX3QgKnRhc2tfdGVhbSApCit7CisgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJiB0YXNrX3RlYW0gLT4gdHQudHRfdGhyZWFkc19sb2NrICk7CisgICAgaWYgKCB0YXNrX3RlYW0gLT4gdHQudHRfdGhyZWFkc19kYXRhICE9IE5VTEwgKSB7CisgICAgICAgIGludCBpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGFza190ZWFtLT50dC50dF9tYXhfdGhyZWFkczsgaSsrICkgeworICAgICAgICAgICAgX19rbXBfZnJlZV90YXNrX2RlcXVlKCAmIHRhc2tfdGVhbSAtPiB0dC50dF90aHJlYWRzX2RhdGFbaV0gKTsKKyAgICAgICAgfQorICAgICAgICBfX2ttcF9mcmVlKCB0YXNrX3RlYW0gLT4gdHQudHRfdGhyZWFkc19kYXRhICk7CisgICAgICAgIHRhc2tfdGVhbSAtPiB0dC50dF90aHJlYWRzX2RhdGEgPSBOVUxMOworICAgIH0KKyAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmIHRhc2tfdGVhbSAtPiB0dC50dF90aHJlYWRzX2xvY2sgKTsKK30KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBfYWxsb2NhdGVfdGFza190ZWFtOgorLy8gQWxsb2NhdGVzIGEgdGFzayB0ZWFtIGFzc29jaWF0ZWQgd2l0aCBhIHNwZWNpZmljIHRlYW0sIHRha2luZyBpdCBmcm9tCisvLyB0aGUgZ2xvYmFsIHRhc2sgdGVhbSBmcmVlIGxpc3QgaWYgcG9zc2libGUuICBBbHNvIGluaXRpYWxpemVzIGRhdGEgc3RydWN0dXJlcy4KKworc3RhdGljIGttcF90YXNrX3RlYW1fdCAqCitfX2ttcF9hbGxvY2F0ZV90YXNrX3RlYW0oIGttcF9pbmZvX3QgKnRocmVhZCwga21wX3RlYW1fdCAqdGVhbSApCit7CisgICAga21wX3Rhc2tfdGVhbV90ICp0YXNrX3RlYW0gPSBOVUxMOworICAgIGludCBudGhyZWFkczsKKworICAgIEtBX1RSQUNFKCAyMCwgKCAiX19rbXBfYWxsb2NhdGVfdGFza190ZWFtOiBUIyVkIGVudGVyaW5nOyB0ZWFtID0gJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICh0aHJlYWQgPyBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aHJlYWQgKSA6IC0xKSwgdGVhbSApICk7CisKKyAgICBpZiAoVENSX1BUUihfX2ttcF9mcmVlX3Rhc2tfdGVhbXMpICE9IE5VTEwpIHsKKyAgICAgICAgLy8gVGFrZSBhIHRhc2sgdGVhbSBmcm9tIHRoZSB0YXNrIHRlYW0gcG9vbAorICAgICAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfdGFza190ZWFtX2xvY2sgKTsKKyAgICAgICAgaWYgKF9fa21wX2ZyZWVfdGFza190ZWFtcyAhPSBOVUxMKSB7CisgICAgICAgICAgICB0YXNrX3RlYW0gPSBfX2ttcF9mcmVlX3Rhc2tfdGVhbXM7CisgICAgICAgICAgICBUQ1dfUFRSKF9fa21wX2ZyZWVfdGFza190ZWFtcywgdGFza190ZWFtIC0+IHR0LnR0X25leHQpOworICAgICAgICAgICAgdGFza190ZWFtIC0+IHR0LnR0X25leHQgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICZfX2ttcF90YXNrX3RlYW1fbG9jayApOworICAgIH0KKworICAgIGlmICh0YXNrX3RlYW0gPT0gTlVMTCkgeworICAgICAgICBLRV9UUkFDRSggMTAsICggIl9fa21wX2FsbG9jYXRlX3Rhc2tfdGVhbTogVCMlZCBhbGxvY2F0aW5nICIKKyAgICAgICAgICAgICAgICAgICAgICAgInRhc2sgdGVhbSBmb3IgdGVhbSAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGhyZWFkICksIHRlYW0gKSApOworICAgICAgICAvLyBBbGxvY2F0ZSBhIG5ldyB0YXNrIHRlYW0gaWYgb25lIGlzIG5vdCBhdmFpbGFibGUuCisgICAgICAgIC8vIENhbm5vdCB1c2UgX19rbXBfdGhyZWFkX21hbGxvYygpIGJlY2F1c2UgdGhyZWFkcyBub3QgYXJvdW5kIGZvcgorICAgICAgICAvLyBrbXBfcmVhcF90YXNrX3RlYW0oICkuCisgICAgICAgIHRhc2tfdGVhbSA9IChrbXBfdGFza190ZWFtX3QgKikgX19rbXBfYWxsb2NhdGUoIHNpemVvZihrbXBfdGFza190ZWFtX3QpICk7CisgICAgICAgIF9fa21wX2luaXRfYm9vdHN0cmFwX2xvY2soICYgdGFza190ZWFtIC0+IHR0LnR0X3RocmVhZHNfbG9jayApOworICAgICAgICAvL3Rhc2tfdGVhbSAtPiB0dC50dF90aHJlYWRzX2RhdGEgPSBOVUxMOyAgIC8vIEFDOiBfX2ttcF9hbGxvY2F0ZSB6ZXJvZXMgcmV0dXJuZWQgbWVtb3J5CisgICAgICAgIC8vdGFza190ZWFtIC0+IHR0LnR0X21heF90aHJlYWRzID0gMDsKKyAgICAgICAgLy90YXNrX3RlYW0gLT4gdHQudHRfbmV4dCA9IE5VTEw7CisgICAgfQorCisgICAgVENXXzQodGFza190ZWFtIC0+IHR0LnR0X2ZvdW5kX3Rhc2tzLCBGQUxTRSk7CisgICAgdGFza190ZWFtIC0+IHR0LnR0X25wcm9jID0gbnRocmVhZHMgPSB0ZWFtLT50LnRfbnByb2M7CisKKyAgICB0YXNrX3RlYW0gLT4gdHQudHRfc3RhdGUgPSAwOworICAgIFRDV180KCB0YXNrX3RlYW0gLT4gdHQudHRfdW5maW5pc2hlZF90aHJlYWRzLCBudGhyZWFkcyApOworICAgIFRDV180KCB0YXNrX3RlYW0gLT4gdHQudHRfYWN0aXZlLCBUUlVFICk7CisgICAgVENXXzQoIHRhc2tfdGVhbSAtPiB0dC50dF9yZWZfY3QsIG50aHJlYWRzIC0gMSk7CisKKyAgICBLQV9UUkFDRSggMjAsICggIl9fa21wX2FsbG9jYXRlX3Rhc2tfdGVhbTogVCMlZCBleGl0aW5nOyB0YXNrX3RlYW0gPSAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgKHRocmVhZCA/IF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRocmVhZCApIDogLTEpLCB0YXNrX3RlYW0gKSApOworICAgIHJldHVybiB0YXNrX3RlYW07Cit9CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wX2ZyZWVfdGFza190ZWFtOgorLy8gRnJlZXMgdGhlIHRhc2sgdGVhbSBhc3NvY2lhdGVkIHdpdGggYSBzcGVjaWZpYyB0aHJlYWQsIGFuZCBhZGRzIGl0CisvLyB0byB0aGUgZ2xvYmFsIHRhc2sgdGVhbSBmcmVlIGxpc3QuCisvLworCitzdGF0aWMgdm9pZAorX19rbXBfZnJlZV90YXNrX3RlYW0oIGttcF9pbmZvX3QgKnRocmVhZCwga21wX3Rhc2tfdGVhbV90ICp0YXNrX3RlYW0gKQoreworICAgIEtBX1RSQUNFKCAyMCwgKCAiX19rbXBfZnJlZV90YXNrX3RlYW06IFQjJWQgdGFza190ZWFtID0gJXBcbiIsCisgICAgICAgICAgICAgICAgICAgIHRocmVhZCA/IF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRocmVhZCApIDogLTEsIHRhc2tfdGVhbSApICk7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBUQ1JfNCh0YXNrX3RlYW0gLT4gdHQudHRfcmVmX2N0KSA9PSAwICk7CisKKyAgICAvLyBQdXQgdGFzayB0ZWFtIGJhY2sgb24gZnJlZSBsaXN0CisgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJiBfX2ttcF90YXNrX3RlYW1fbG9jayApOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggdGFza190ZWFtIC0+IHR0LnR0X25leHQgPT0gTlVMTCApOworICAgIHRhc2tfdGVhbSAtPiB0dC50dF9uZXh0ID0gX19rbXBfZnJlZV90YXNrX3RlYW1zOworICAgIFRDV180KHRhc2tfdGVhbSAtPiB0dC50dF9mb3VuZF90YXNrcywgRkFMU0UpOworICAgIFRDV19QVFIoX19rbXBfZnJlZV90YXNrX3RlYW1zLCB0YXNrX3RlYW0pOworCisgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJiBfX2ttcF90YXNrX3RlYW1fbG9jayApOworfQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcF9yZWFwX3Rhc2tfdGVhbXM6CisvLyBGcmVlIGFsbCB0aGUgdGFzayB0ZWFtcyBvbiB0aGUgdGFzayB0ZWFtIGZyZWUgbGlzdC4KKy8vIFNob3VsZCBvbmx5IGJlIGRvbmUgZHVyaW5nIGxpYnJhcnkgc2h1dGRvd24uCisvLyBDYW5ub3QgZG8gYW55dGhpbmcgdGhhdCBuZWVkcyBhIHRocmVhZCBzdHJ1Y3R1cmUgb3IgZ3RpZCBzaW5jZSB0aGV5IGFyZSBhbHJlYWR5IGdvbmUuCisKK3ZvaWQKK19fa21wX3JlYXBfdGFza190ZWFtcyggdm9pZCApCit7CisgICAga21wX3Rhc2tfdGVhbV90ICAgKnRhc2tfdGVhbTsKKworICAgIGlmICggVENSX1BUUihfX2ttcF9mcmVlX3Rhc2tfdGVhbXMpICE9IE5VTEwgKSB7CisgICAgICAgIC8vIEZyZWUgYWxsIHRhc2tfdGVhbXMgb24gdGhlIGZyZWUgbGlzdAorICAgICAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfdGFza190ZWFtX2xvY2sgKTsKKyAgICAgICAgd2hpbGUgKCAoIHRhc2tfdGVhbSA9IF9fa21wX2ZyZWVfdGFza190ZWFtcyApICE9IE5VTEwgKSB7CisgICAgICAgICAgICBfX2ttcF9mcmVlX3Rhc2tfdGVhbXMgPSB0YXNrX3RlYW0gLT4gdHQudHRfbmV4dDsKKyAgICAgICAgICAgIHRhc2tfdGVhbSAtPiB0dC50dF9uZXh0ID0gTlVMTDsKKworICAgICAgICAgICAgLy8gRnJlZSB0aHJlYWRzX2RhdGEgaWYgbmVjZXNzYXJ5CisgICAgICAgICAgICBpZiAoIHRhc2tfdGVhbSAtPiB0dC50dF90aHJlYWRzX2RhdGEgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9mcmVlX3Rhc2tfdGhyZWFkc19kYXRhKCB0YXNrX3RlYW0gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9fa21wX2ZyZWUoIHRhc2tfdGVhbSApOworICAgICAgICB9CisgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICZfX2ttcF90YXNrX3RlYW1fbG9jayApOworICAgIH0KK30KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBfdW5yZWZfdGFza190ZWFtczoKKy8vIFJlbW92ZSBvbmUgdGhyZWFkIGZyb20gcmVmZXJlbmNpbmcgdGhlIHRhc2sgdGVhbSBzdHJ1Y3R1cmUgYnkKKy8vIGRlY3JlYXNpbmcgdGhlIHJlZmVyZW5jZSBjb3VudCBhbmQgZGVhbGxvY2F0ZSB0YXNrIHRlYW0gaWYgbm8gbW9yZQorLy8gcmVmZXJlbmNlcyB0byBpdC4KKy8vCit2b2lkCitfX2ttcF91bnJlZl90YXNrX3RlYW0oIGttcF90YXNrX3RlYW1fdCAqdGFza190ZWFtLCBrbXBfaW5mb190ICp0aHJlYWQgKQoreworICAgIGttcF91aW50IHJlZl9jdDsKKworICAgIHJlZl9jdCA9IEtNUF9URVNUX1RIRU5fREVDMzIoIChrbXBfaW50MzIgKikoJiB0YXNrX3RlYW0tPnR0LnR0X3JlZl9jdCkgKSAtIDE7CisKKyAgICBLQV9UUkFDRSggMjAsICggIl9fa21wX3VucmVmX3Rhc2tfdGVhbTogVCMlZCB0YXNrX3RlYW0gPSAlcCByZWZfY3QgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGhyZWFkICksIHRhc2tfdGVhbSwgcmVmX2N0ICkgKTsKKworCisgICAgaWYgKCByZWZfY3QgPT0gMCApIHsKKyAgICAgICAgX19rbXBfZnJlZV90YXNrX3RlYW0oIHRocmVhZCwgdGFza190ZWFtICk7CisgICAgfQorCisgICAgVENXX1BUUiggKigodm9sYXRpbGUga21wX3Rhc2tfdGVhbV90ICoqKSgmdGhyZWFkLT50aC50aF90YXNrX3RlYW0pKSwgTlVMTCApOworfQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcF93YWl0X3RvX3VucmVmX3Rhc2tfdGVhbXM6CisvLyBTb21lIHRocmVhZHMgY291bGQgc3RpbGwgYmUgaW4gdGhlIGZvcmsgYmFycmllciByZWxlYXNlIGNvZGUsIHBvc3NpYmx5CisvLyB0cnlpbmcgdG8gc3RlYWwgdGFza3MuICBXYWl0IGZvciBlYWNoIHRocmVhZCB0byB1bnJlZmVyZW5jZSBpdHMgdGFzayB0ZWFtLgorLy8KK3ZvaWQKK19fa21wX3dhaXRfdG9fdW5yZWZfdGFza190ZWFtcyh2b2lkKQoreworICAgIGttcF9pbmZvX3QgKnRocmVhZDsKKyAgICBrbXBfdWludDMyIHNwaW5zOworICAgIGludCBkb25lOworCisgICAgS01QX0lOSVRfWUlFTEQoIHNwaW5zICk7CisKKworICAgIGZvciAoOzspIHsKKyAgICAgICAgZG9uZSA9IFRSVUU7CisKKyAgICAgICAgLy8gVE9ETzogR0VIIC0gdGhpcyBtYXkgYmUgaXMgd3JvbmcgYmVjYXVzZSBzb21lIHN5bmMgd291bGQgYmUgbmVjZXNzYXJ5CisgICAgICAgIC8vICAgICAgICAgICAgIGluIGNhc2UgdGhyZWFkcyBhcmUgYWRkZWQgdG8gdGhlIHBvb2wgZHVyaW5nIHRoZSB0cmF2ZXJzYWwuCisgICAgICAgIC8vICAgICAgICAgICAgIE5lZWQgdG8gdmVyaWZ5IHRoYXQgbG9jayBmb3IgdGhyZWFkIHBvb2wgaXMgaGVsZCB3aGVuIGNhbGxpbmcKKyAgICAgICAgLy8gICAgICAgICAgICAgdGhpcyByb3V0aW5lLgorICAgICAgICBmb3IgKHRocmVhZCA9IChrbXBfaW5mb190ICopX19rbXBfdGhyZWFkX3Bvb2w7CisgICAgICAgICAgICAgdGhyZWFkICE9IE5VTEw7CisgICAgICAgICAgICAgdGhyZWFkID0gdGhyZWFkLT50aC50aF9uZXh0X3Bvb2wpCisgICAgICAgIHsKKyNpZiBLTVBfT1NfV0lORE9XUworICAgICAgICAgICAgRFdPUkQgZXhpdF92YWw7CisjZW5kaWYKKyAgICAgICAgICAgIGlmICggVENSX1BUUih0aHJlYWQtPnRoLnRoX3Rhc2tfdGVhbSkgPT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfd2FpdF90b191bnJlZl90YXNrX3RlYW06IFQjJWQgdGFza190ZWFtID09IE5VTExcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGhyZWFkICkgKSApOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorI2lmIEtNUF9PU19XSU5ET1dTCisgICAgICAgICAgICAvLyBUT0RPOiBHRUggLSBhZGQgdGhpcyBjaGVjayBmb3IgTGludXgqIE9TIC8gT1MgWCogYXMgd2VsbD8KKyAgICAgICAgICAgIGlmICghX19rbXBfaXNfdGhyZWFkX2FsaXZlKHRocmVhZCwgJmV4aXRfdmFsKSkgeworICAgICAgICAgICAgICAgIGlmIChUQ1JfUFRSKHRocmVhZC0+dGgudGhfdGFza190ZWFtKSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX3VucmVmX3Rhc2tfdGVhbSggdGhyZWFkLT50aC50aF90YXNrX3RlYW0sIHRocmVhZCApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgICAgICBkb25lID0gRkFMU0U7ICAvLyBCZWNhdXNlIHRoX3Rhc2tfdGVhbSBwb2ludGVyIGlzIG5vdCBOVUxMIGZvciB0aGlzIHRocmVhZAorCisgICAgICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfd2FpdF90b191bnJlZl90YXNrX3RlYW06IFdhaXRpbmcgZm9yIFQjJWQgdG8gdW5yZWZlcmVuY2UgdGFza190ZWFtXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGhyZWFkICkgKSApOworCisgICAgICAgICAgICBpZiAoIF9fa21wX2RmbHRfYmxvY2t0aW1lICE9IEtNUF9NQVhfQkxPQ0tUSU1FICkgeworICAgICAgICAgICAgICAgIHZvbGF0aWxlIHZvaWQgKnNsZWVwX2xvYzsKKyAgICAgICAgICAgICAgICAvLyBJZiB0aGUgdGhyZWFkIGlzIHNsZWVwaW5nLCBhd2FrZW4gaXQuCisgICAgICAgICAgICAgICAgaWYgKCAoIHNsZWVwX2xvYyA9IFRDUl9QVFIoIHRocmVhZC0+dGgudGhfc2xlZXBfbG9jKSApICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgICAgIEtBX1RSQUNFKCAxMCwgKCAiX19rbXBfd2FpdF90b191bnJlZl90YXNrX3RlYW06IFQjJWQgd2FraW5nIHVwIHRocmVhZCBUIyVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGhyZWFkICksIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRocmVhZCApICkgKTsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbnVsbF9yZXN1bWVfd3JhcHBlcihfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKHRocmVhZCksIHNsZWVwX2xvYyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChkb25lKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8vIElmIHdlIGFyZSBvdmVyc3Vic2NyaWJlZCwKKyAgICAgICAgLy8gb3IgaGF2ZSB3YWl0ZWQgYSBiaXQgKGFuZCBsaWJyYXJ5IG1vZGUgaXMgdGhyb3VnaHB1dCksIHlpZWxkLgorICAgICAgICAvLyBQYXVzZSBpcyBpbiB0aGUgZm9sbG93aW5nIGNvZGUuCisgICAgICAgIEtNUF9ZSUVMRCggVENSXzQoX19rbXBfbnRoKSA+IF9fa21wX2F2YWlsX3Byb2MgKTsKKyAgICAgICAgS01QX1lJRUxEX1NQSU4oIHNwaW5zICk7ICAgICAgICAvLyBZaWVsZHMgb25seSBpZiBLTVBfTElCUkFSWT10aHJvdWdocHV0CisgICAgfQorCisKK30KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBfdGFza190ZWFtX3NldHVwOiAgQ3JlYXRlIGEgdGFza190ZWFtIGZvciB0aGUgY3VycmVudCB0ZWFtLCBidXQgdXNlCisvLyBhbiBhbHJlYWR5IGNyZWF0ZWQsIHVudXNlZCBvbmUgaWYgaXQgYWxyZWFkeSBleGlzdHMuCisvLyBUaGlzIG1heSBiZSBjYWxsZWQgYnkgYW55IHRocmVhZCwgYnV0IG9ubHkgZm9yIHRlYW1zIHdpdGggIyB0aHJlYWRzID4xLgorCit2b2lkCitfX2ttcF90YXNrX3RlYW1fc2V0dXAoIGttcF9pbmZvX3QgKnRoaXNfdGhyLCBrbXBfdGVhbV90ICp0ZWFtICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYyApOworCisgICAgaWYgKCAoIHRlYW0tPnQudF90YXNrX3RlYW0gPT0gTlVMTCApICYmICggdGVhbS0+dC50X25wcm9jID4gMSApICkgeworICAgICAgICAvLyBBbGxvY2F0ZSBhIG5ldyB0YXNrIHRlYW0sIHdoaWNoIHdpbGwgYmUgcHJvcGFnYXRlZCB0bworICAgICAgICAvLyBhbGwgb2YgdGhlIHdvcmtlciB0aHJlYWRzIGFmdGVyIHRoZSBiYXJyaWVyLiAgQXMgdGhleQorICAgICAgICAvLyBzcGluIGluIHRoZSBiYXJyaWVyIHJlbGVhc2UgcGhhc2UsIHRoZW4gd2lsbCBjb250aW51ZQorICAgICAgICAvLyB0byB1c2UgdGhlIHByZXZpb3VzIHRhc2sgdGVhbSBzdHJ1Y3QsIHVudGlsIHRoZXkgcmVjZWl2ZQorICAgICAgICAvLyB0aGUgc2lnbmFsIHRvIHN0b3AgY2hlY2tpbmcgZm9yIHRhc2tzICh0aGV5IGNhbid0IHNhZmVseQorICAgICAgICAvLyByZWZlcmVuY2UgdGhlIGttcF90ZWFtX3Qgc3RydWN0LCB3aGljaCBjb3VsZCBiZSByZWFsbG9jYXRlZAorICAgICAgICAvLyBieSB0aGUgbWFzdGVyIHRocmVhZCkuCisgICAgICAgIHRlYW0tPnQudF90YXNrX3RlYW0gPSBfX2ttcF9hbGxvY2F0ZV90YXNrX3RlYW0oIHRoaXNfdGhyLCB0ZWFtICk7CisgICAgICAgIEtBX1RSQUNFKCAyMCwgKCAiX19rbXBfdGFza190ZWFtX3NldHVwOiBNYXN0ZXIgVCMlZCBjcmVhdGVkIG5ldyAiCisgICAgICAgICAgICAgICAgICAgICAgICAidGFza190ZWFtICVwIGZvciB0ZWFtICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGhpc190aHIgKSwgdGVhbS0+dC50X3Rhc2tfdGVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgodGVhbSAhPSBOVUxMKSA/IHRlYW0tPnQudF9pZCA6IC0xKSkgKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8vIEFsbCB0aHJlYWRzIGhhdmUgcmVwb3J0ZWQgaW4sIGFuZCBubyB0YXNrcyB3ZXJlIHNwYXduZWQKKyAgICAgICAgLy8gZm9yIHRoaXMgcmVsZWFzZS0+Z2F0aGVyIHJlZ2lvbi4gIExlYXZlIHRoZSBvbGQgdGFzaworICAgICAgICAvLyB0ZWFtIHN0cnVjdCBpbiBwbGFjZSBmb3IgdGhlIHVwY29taW5nIHJlZ2lvbi4gIE5vIHRhc2sKKyAgICAgICAgLy8gdGVhbXMgYXJlIGZvcm1lZCBmb3Igc2VyaWFsaXplZCB0ZWFtcy4KKyAgICB9CisgICAgaWYgKCB0ZWFtLT50LnRfdGFza190ZWFtICE9IE5VTEwgKSB7CisgICAgICAgIC8vIFRvZ2dsZSB0aGUgc3RhdGUgZmxhZyBzbyB0aGF0IHdlIGNhbiB0ZWxsIHdoaWNoIHNpZGUgb2YKKyAgICAgICAgLy8gdGhlIGJhcnJpZXIgd2UgYXJlIG9uLgorICAgICAgICB0ZWFtLT50LnRfdGFza190ZWFtLT50dC50dF9zdGF0ZSA9IDEgLSB0aGlzX3Roci0+dGgudGhfdGFza19zdGF0ZTsKKyAgICB9Cit9CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wX3Rhc2tfdGVhbV9zeW5jOiBQcm9wYWdhdGlvbiBvZiB0YXNrIHRlYW0gZGF0YSBmcm9tIHRlYW0gdG8gdGhyZWFkcworLy8gd2hpY2ggaGFwcGVucyBqdXN0IGFmdGVyIHRoZSByZWxlYXNlIHBoYXNlIG9mIGEgdGVhbSBiYXJyaWVyLiAgVGhpcyBtYXkgYmUKKy8vIGNhbGxlZCBieSBhbnkgdGhyZWFkLCBidXQgb25seSBmb3IgdGVhbXMgd2l0aCAjIHRocmVhZHMgPiAxLgorCit2b2lkCitfX2ttcF90YXNrX3RlYW1fc3luYygga21wX2luZm9fdCAqdGhpc190aHIsIGttcF90ZWFtX3QgKnRlYW0gKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjICk7CisKKyAgICAvLyBPbiB0aGUgcmFyZSBjaGFuY2UgdGhhdCB0aGlzIHRocmVhZCBuZXZlciBzYXcgdGhhdCB0aGUgdGFzaworICAgIC8vIHRlYW0gd2FzIG5vIGxvbmdlciBhY3RpdmUsIHRoZW4gdW5yZWYvZGVhbGxvY2F0ZSBpdCBub3cuCisgICAgaWYgKCB0aGlzX3Roci0+dGgudGhfdGFza190ZWFtICE9IE5VTEwgKSB7CisgICAgICAgIGlmICggISBUQ1JfU1lOQ180KCB0aGlzX3Roci0+dGgudGhfdGFza190ZWFtLT50dC50dF9hY3RpdmUgKSApIHsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoICEgS01QX01BU1RFUl9USUQoIF9fa21wX3RpZF9mcm9tX2d0aWQoIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRoaXNfdGhyICkgKSApICk7CisgICAgICAgICAgICBfX2ttcF91bnJlZl90YXNrX3RlYW0oIHRoaXNfdGhyLT50aC50aF90YXNrX3RlYW0sIHRoaXNfdGhyICk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gV2UgYXJlIHJlLXVzaW5nIGEgdGFzayB0ZWFtIHRoYXQgd2FzIG5ldmVyIGVuYWJsZWQuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGhpc190aHItPnRoLnRoX3Rhc2tfdGVhbSA9PSB0ZWFtLT50LnRfdGFza190ZWFtICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLworICAgIC8vIEl0IGlzIG5vdyBzYWZlIHRvIHByb3BhZ2F0ZSB0aGUgdGFzayB0ZWFtIHBvaW50ZXIgZnJvbSB0aGUKKyAgICAvLyB0ZWFtIHN0cnVjdCB0byB0aGUgY3VycmVudCB0aHJlYWQuCisgICAgLy8KKyAgICBUQ1dfUFRSKHRoaXNfdGhyLT50aC50aF90YXNrX3RlYW0sIHRlYW0tPnQudF90YXNrX3RlYW0pOworICAgIGlmICggdGhpc190aHItPnRoLnRoX3Rhc2tfdGVhbSAhPSBOVUxMICkgeworICAgICAgICAvLworICAgICAgICAvLyBUb2dnbGUgdGhlIHRoX3Rhc2tfc3RhdGUgZmllbGQsIGluc3RlYWQgb2YgcmVhZGluZyBpdCBmcm9tCisgICAgICAgIC8vIHRoZSB0YXNrIHRlYW0uICBSZWFkaW5nIHRoZSB0dF9zdGF0ZSBmaWVsZCBhdCB0aGlzIHBvaW50CisgICAgICAgIC8vIGNhdXNlcyBhIDMwJSByZWdyZXNzaW9uIG9uIEVQQ0MgcGFyYWxsZWwgLSB0b2dnbGluZyBpdAorICAgICAgICAvLyBpcyBtdWNoIGNoZWFwZXIuCisgICAgICAgIC8vCisgICAgICAgIHRoaXNfdGhyLT50aC50aF90YXNrX3N0YXRlID0gMSAtIHRoaXNfdGhyLT50aC50aF90YXNrX3N0YXRlOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0aGlzX3Roci0+dGgudGhfdGFza19zdGF0ZSA9PSBUQ1JfNCh0ZWFtLT50LnRfdGFza190ZWFtLT50dC50dF9zdGF0ZSkgKTsKKyAgICB9CisgICAgS0FfVFJBQ0UoIDIwLCAoICJfX2ttcF90YXNrX3RlYW1fc3luYzogVGhyZWFkIFQjJWQgdGFzayB0ZWFtIGFzc2lnbmVkIHBvaW50ZXIgKCVwKSBmcm9tIFRlYW0gIyVkIHRhc2sgdGVhbVxuIiwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGhpc190aHIgKSwgJnRoaXNfdGhyLT50aC50aF90YXNrX3RlYW0sCisgICAgICAgICAgICAgICAgICAgIHRoaXNfdGhyLT50aC50aF90YXNrX3RlYW0sICgodGVhbSAhPSBOVUxMKSA/ICh0ZWFtLT50LnRfaWQpIDogLTEpICkgKTsKK30KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBfdGFza190ZWFtX3dhaXQ6IE1hc3RlciB0aHJlYWQgd2FpdHMgZm9yIG91dHN0YW5kaW5nIHRhc2tzIGFmdGVyCisvLyB0aGUgYmFycmllciBnYXRoZXIgcGhhc2UuICBPbmx5IGNhbGxlZCBieSBtYXN0ZXIgdGhyZWFkIGlmICN0aHJlYWRzCisvLyBpbiB0ZWFtID4gMSAhCisKK3ZvaWQKK19fa21wX3Rhc2tfdGVhbV93YWl0KCBrbXBfaW5mb190ICp0aGlzX3RociwKKyAgICAgICAgICAgICAgICAgICAgICBrbXBfdGVhbV90ICp0ZWFtCisgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcodm9pZCAqIGl0dF9zeW5jX29iaikKKyAgICAgICAgICAgICAgICAgICAgICApCit7CisgICAga21wX3Rhc2tfdGVhbV90ICp0YXNrX3RlYW0gPSB0ZWFtLT50LnRfdGFza190ZWFtOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrX3RlYW0gPT0gdGhpc190aHItPnRoLnRoX3Rhc2tfdGVhbSApOworCisgICAgaWYgKCAoIHRhc2tfdGVhbSAhPSBOVUxMICkgJiYgS01QX1RBU0tJTkdfRU5BQkxFRCggdGFza190ZWFtLCB0aGlzX3Roci0+dGgudGhfdGFza19zdGF0ZSApICkgeworICAgICAgICBLQV9UUkFDRSggMjAsICggIl9fa21wX3Rhc2tfdGVhbV93YWl0OiBNYXN0ZXIgVCMlZCB3YWl0aW5nIGZvciBhbGwgdGFza3M6IHRhc2tfdGVhbSA9ICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aGlzX3RociApLCB0YXNrX3RlYW0gKSApOworICAgICAgICAvLworICAgICAgICAvLyBBbGwgd29ya2VyIHRocmVhZHMgbWlnaHQgaGF2ZSBkcm9wcGVkIHRocm91Z2ggdG8gdGhlCisgICAgICAgIC8vIHJlbGVhc2UgcGhhc2UsIGJ1dCBjb3VsZCBzdGlsbCBiZSBleGVjdXRpbmcgdGFza3MuCisgICAgICAgIC8vIFdhaXQgaGVyZSBmb3IgYWxsIHRhc2tzIHRvIGNvbXBsZXRlLiAgVG8gYXZvaWQgbWVtb3J5CisgICAgICAgIC8vIGNvbnRlbnRpb24sIG9ubHkgdGhlIG1hc3RlciB0aHJlYWQgY2hlY2tzIGZvciB0aGUKKyAgICAgICAgLy8gdGVybWluYXRpb24gY29uZGl0aW9uLgorICAgICAgICAvLworICAgICAgICBrbXBfZmxhZ18zMiBmbGFnKCZ0YXNrX3RlYW0tPnR0LnR0X3VuZmluaXNoZWRfdGhyZWFkcywgMFUpOworICAgICAgICBmbGFnLndhaXQodGhpc190aHIsIFRSVUUKKyAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaikpOworCisgICAgICAgIC8vCisgICAgICAgIC8vIEtpbGwgdGhlIG9sZCB0YXNrIHRlYW0sIHNvIHRoYXQgdGhlIHdvcmtlciB0aHJlYWRzIHdpbGwKKyAgICAgICAgLy8gc3RvcCByZWZlcmVuY2luZyBpdCB3aGlsZSBzcGlubmluZy4gIFRoZXkgd2lsbAorICAgICAgICAvLyBkZWFsbG9jYXRlIGl0IHdoZW4gdGhlIHJlZmVyZW5jZSBjb3VudCByZWFjaGVzIHplcm8uCisgICAgICAgIC8vIFRoZSBtYXN0ZXIgdGhyZWFkIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgcmVmIGNvdW50LgorICAgICAgICAvLworICAgICAgICBLQV9UUkFDRSggMjAsICggIl9fa21wX3Rhc2tfdGVhbV93YWl0OiBNYXN0ZXIgVCMlZCBkZWFjdGl2YXRpbmcgdGFza190ZWFtICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aGlzX3RociApLCB0YXNrX3RlYW0gKSApOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrX3RlYW0tPnR0LnR0X25wcm9jID4gMSApOworICAgICAgICBUQ1dfU1lOQ180KCB0YXNrX3RlYW0tPnR0LnR0X2FjdGl2ZSwgRkFMU0UgKTsKKyAgICAgICAgS01QX01CKCk7CisKKyAgICAgICAgVENXX1BUUih0aGlzX3Roci0+dGgudGhfdGFza190ZWFtLCBOVUxMKTsKKyAgICAgICAgdGVhbS0+dC50X3Rhc2tfdGVhbSA9IE5VTEw7CisgICAgfQorfQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcF90YXNraW5nX2JhcnJpZXI6CisvLyBJbnRlcm5hbCBmdW5jdGlvbiB0byBleGVjdXRlIGFsbCB0YXNrcyBwcmlvciB0byBhIHJlZ3VsYXIgYmFycmllciBvciBhCisvLyBqb2luIGJhcnJpZXIuICBJdCBpcyBhIGZ1bGwgYmFycmllciBpdHNlbGYsIHdoaWNoIHVuZm9ydHVuYXRlbHkgdHVybnMKKy8vIHJlZ3VsYXIgYmFycmllcnMgaW50byBkb3VibGUgYmFycmllcnMgYW5kIGpvaW4gYmFycmllcnMgaW50byAxIDEvMgorLy8gYmFycmllcnMuCisvLyBUaGlzIHJvdXRpbmUgbWF5IG9ubHkgY2FsbGVkIHdoZW4gX19rbXBfdGFza2luZ19tb2RlID09IHRza21fZXh0cmFfYmFycmllci4KKwordm9pZAorX19rbXBfdGFza2luZ19iYXJyaWVyKCBrbXBfdGVhbV90ICp0ZWFtLCBrbXBfaW5mb190ICp0aHJlYWQsIGludCBndGlkICkKK3sKKyAgICB2b2xhdGlsZSBrbXBfdWludDMyICpzcGluID0gJnRlYW0tPnQudF90YXNrX3RlYW0tPnR0LnR0X3VuZmluaXNoZWRfdGhyZWFkczsKKyAgICBpbnQgZmxhZyA9IEZBTFNFOworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX3Rhc2tpbmdfbW9kZSA9PSB0c2ttX2V4dHJhX2JhcnJpZXIgKTsKKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBLTVBfRlNZTkNfU1BJTl9JTklUKCBzcGluLCAoa21wX3VpbnQzMiopIE5VTEwgKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAga21wX2ZsYWdfMzIgc3Bpbl9mbGFnKHNwaW4sIDBVKTsKKyAgICB3aGlsZSAoISBzcGluX2ZsYWcuZXhlY3V0ZV90YXNrcyh0aHJlYWQsIGd0aWQsIFRSVUUsICZmbGFnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoTlVMTCksIDAgKSApIHsKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgIC8vIFRPRE86IFdoYXQgYWJvdXQgaXR0X3N5bmNfb2JqPz8KKyAgICAgICAgS01QX0ZTWU5DX1NQSU5fUFJFUEFSRSggc3BpbiApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgICAgICBpZiggVENSXzQoX19rbXBfZ2xvYmFsLmcuZ19kb25lKSApIHsKKyAgICAgICAgICAgIGlmKCBfX2ttcF9nbG9iYWwuZy5nX2Fib3J0ICkKKyAgICAgICAgICAgICAgICBfX2ttcF9hYm9ydF90aHJlYWQoICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBLTVBfWUlFTEQoIFRSVUUgKTsgICAgICAgLy8gR0g6IFdlIGFsd2F5cyB5aWVsZCBoZXJlCisgICAgfQorI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBLTVBfRlNZTkNfU1BJTl9BQ1FVSVJFRCggKHZvaWQqKSBzcGluICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworfQorCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfdGFza3EuYyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF90YXNrcS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhMjc2YjUKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfdGFza3EuYwpAQCAtMCwwICsxLDIwMzMgQEAKKy8qCisgKiBrbXBfdGFza3EuYyAtLSBUQVNLUSBzdXBwb3J0IGZvciBPcGVuTVAuCisgKiAkUmV2aXNpb246IDQzMzg5ICQKKyAqICREYXRlOiAyMDE0LTA4LTExIDEwOjU0OjAxIC0wNTAwIChNb24sIDExIEF1ZyAyMDE0KSAkCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJrbXBfaTE4bi5oIgorI2luY2x1ZGUgImttcF9pby5oIgorI2luY2x1ZGUgImttcF9lcnJvci5oIgorCisjZGVmaW5lIE1BWF9NRVNTQUdFIDUxMgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogVGFza3Egcm91dGluZXMgYW5kIGdsb2JhbCB2YXJpYWJsZXMKKyAqLworCisjZGVmaW5lIEtNUF9ERUJVR19SRUZfQ1RTKHgpICAgIEtGX1RSQUNFKDEsIHgpOworCisjZGVmaW5lIFRIUkVBRF9BTExPQ19GT1JfVEFTS1EKKworc3RhdGljIGludAoraW5fcGFyYWxsZWxfY29udGV4dCgga21wX3RlYW1fdCAqdGVhbSApCit7CisgICAgcmV0dXJuICEgdGVhbSAtPiB0LnRfc2VyaWFsaXplZDsKK30KKworc3RhdGljIHZvaWQKK19fa21wX3Rhc2txX2VvKCBpbnQgKmd0aWRfcmVmLCBpbnQgKmNpZF9yZWYsIGlkZW50X3QgKmxvY19yZWYgKQoreworICAgIGludCAgICAgICAgICAgICAgICBndGlkID0gKmd0aWRfcmVmOworICAgIGludCAgICAgICAgICAgICAgICB0aWQgID0gX19rbXBfdGlkX2Zyb21fZ3RpZCggZ3RpZCApOworICAgIGttcF91aW50MzIgICAgICAgICBzcGluczsKKyAgICBrbXBfdWludDMyICAgICAgICAgbXlfdG9rZW47CisgICAga21wY190YXNrX3F1ZXVlX3QgKnRhc2txOworICAgIGttcF90YXNrcV90ICAgICAgICp0cSAgID0gJiBfX2ttcF90aHJlYWRzW2d0aWRdIC0+IHRoLnRoX3RlYW0gLT4gdC50X3Rhc2txOworCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKQorICAgICAgICBfX2ttcF9wdXNoX3N5bmMoIGd0aWQsIGN0X29yZGVyZWRfaW5fdGFza3EsIGxvY19yZWYsIE5VTEwgKTsKKworICAgIGlmICggISBfX2ttcF90aHJlYWRzWyBndGlkIF0tPiB0aC50aF90ZWFtIC0+IHQudF9zZXJpYWxpemVkICkgeworICAgICAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgICAgICAvKiBHRUggLSBuZWVkIGNoZWNrIGhlcmUgdW5kZXIgc3RhdHMgdG8gbWFrZSBzdXJlICAgKi8KKyAgICAgICAgLyogICAgICAgaW5zaWRlIHRhc2sgKGN1cnJfdGh1bmtbKnRpZF9yZWZdICE9IE5VTEwpICovCisKKyAgICAgICAgbXlfdG9rZW4gPXRxLT50cV9jdXJyX3RodW5rWyB0aWQgXS0+IHRoX3Rhc2tudW07CisKKyAgICAgICAgdGFza3EgPSB0cS0+dHFfY3Vycl90aHVua1sgdGlkIF0tPiB0aC50aF9zaGFyZWRzIC0+IHN2X3F1ZXVlOworCisgICAgICAgIEtNUF9XQUlUX1lJRUxEKCZ0YXNrcS0+dHFfdGFza251bV9zZXJ2aW5nLCBteV90b2tlbiwgS01QX0VRLCBOVUxMKTsKKyAgICAgICAgS01QX01CKCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorX19rbXBfdGFza3FfeG8oIGludCAqZ3RpZF9yZWYsIGludCAqY2lkX3JlZiwgaWRlbnRfdCAqbG9jX3JlZiApCit7CisgICAgaW50ICAgICAgICAgICBndGlkID0gKmd0aWRfcmVmOworICAgIGludCAgICAgICAgICAgdGlkICA9IF9fa21wX3RpZF9mcm9tX2d0aWQoIGd0aWQgKTsKKyAgICBrbXBfdWludDMyICAgIG15X3Rva2VuOworICAgIGttcF90YXNrcV90ICAqdHEgICA9ICYgX19rbXBfdGhyZWFkc1tndGlkXSAtPiB0aC50aF90ZWFtIC0+IHQudF90YXNrcTsKKworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkKKyAgICAgICAgX19rbXBfcG9wX3N5bmMoIGd0aWQsIGN0X29yZGVyZWRfaW5fdGFza3EsIGxvY19yZWYgKTsKKworICAgIGlmICggISBfX2ttcF90aHJlYWRzWyBndGlkIF0tPiB0aC50aF90ZWFtIC0+IHQudF9zZXJpYWxpemVkICkgeworICAgICAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgICAgICAvKiBHRUggLSBuZWVkIGNoZWNrIGhlcmUgdW5kZXIgc3RhdHMgdG8gbWFrZSBzdXJlICovCisgICAgICAgIC8qICAgICAgIGluc2lkZSB0YXNrIChjdXJyX3RodW5rW3RpZF0gIT0gTlVMTCkgICAgKi8KKworICAgICAgICBteV90b2tlbiA9IHRxLT50cV9jdXJyX3RodW5rWyB0aWQgXS0+dGhfdGFza251bTsKKworICAgICAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgICAgICB0cS0+dHFfY3Vycl90aHVua1sgdGlkIF0tPiB0aC50aF9zaGFyZWRzIC0+IHN2X3F1ZXVlIC0+IHRxX3Rhc2tudW1fc2VydmluZyA9IG15X3Rva2VuICsgMTsKKworICAgICAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF90YXNrcV9jaGVja19vcmRlcmVkKCBrbXBfaW50MzIgZ3RpZCwga21wY190aHVua190ICp0aHVuayApCit7CisgICAga21wX3VpbnQzMiBzcGluczsKKyAgICBrbXBfdWludDMyIG15X3Rva2VuOworICAgIGttcGNfdGFza19xdWV1ZV90ICp0YXNrcTsKKworICAgIC8qIGFzc3VtZSB3ZSBhcmUgYWx3YXlzIGNhbGxlZCBmcm9tIGFuIGFjdGl2ZSBwYXJhbGxlbCBjb250ZXh0ICovCisKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgIG15X3Rva2VuID0gIHRodW5rIC0+IHRoX3Rhc2tudW07CisKKyAgICB0YXNrcSA9ICB0aHVuayAtPiB0aC50aF9zaGFyZWRzIC0+IHN2X3F1ZXVlOworCisgICAgaWYodGFza3EtPnRxX3Rhc2tudW1fc2VydmluZyA8PSBteV90b2tlbikgeworICAgICAgICBLTVBfV0FJVF9ZSUVMRCgmdGFza3EtPnRxX3Rhc2tudW1fc2VydmluZywgbXlfdG9rZW4sIEtNUF9HRSwgTlVMTCk7CisgICAgICAgIEtNUF9NQigpOworICAgICAgICB0YXNrcS0+dHFfdGFza251bV9zZXJ2aW5nID0gbXlfdG9rZW4gKzE7CisgICAgICAgIEtNUF9NQigpOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK19fa21wX2R1bXBfVFFGKGttcF9pbnQzMiBmbGFncykKK3sKKyAgICBpZiAoZmxhZ3MgJiBUUUZfSVNfT1JERVJFRCkKKyAgICAgICAgX19rbXBfcHJpbnRmKCJPUkRFUkVEICIpOworICAgIGlmIChmbGFncyAmIFRRRl9JU19MQVNUUFJJVkFURSkKKyAgICAgICAgX19rbXBfcHJpbnRmKCJMQVNUX1BSSVYgIik7CisgICAgaWYgKGZsYWdzICYgVFFGX0lTX05PV0FJVCkKKyAgICAgICAgX19rbXBfcHJpbnRmKCJOT1dBSVQgIik7CisgICAgaWYgKGZsYWdzICYgVFFGX0hFVVJJU1RJQ1MpCisgICAgICAgIF9fa21wX3ByaW50ZigiSEVVUklTVCAiKTsKKyAgICBpZiAoZmxhZ3MgJiBUUUZfSU5URVJGQUNFX1JFU0VSVkVEMSkKKyAgICAgICAgX19rbXBfcHJpbnRmKCJSRVNFUlYxICIpOworICAgIGlmIChmbGFncyAmIFRRRl9JTlRFUkZBQ0VfUkVTRVJWRUQyKQorICAgICAgICBfX2ttcF9wcmludGYoIlJFU0VSVjIgIik7CisgICAgaWYgKGZsYWdzICYgVFFGX0lOVEVSRkFDRV9SRVNFUlZFRDMpCisgICAgICAgIF9fa21wX3ByaW50ZigiUkVTRVJWMyAiKTsKKyAgICBpZiAoZmxhZ3MgJiBUUUZfSU5URVJGQUNFX1JFU0VSVkVENCkKKyAgICAgICAgX19rbXBfcHJpbnRmKCJSRVNFUlY0ICIpOworICAgIGlmIChmbGFncyAmIFRRRl9JU19MQVNUX1RBU0spCisgICAgICAgIF9fa21wX3ByaW50ZigiTEFTVF9UQVNLICIpOworICAgIGlmIChmbGFncyAmIFRRRl9UQVNLUV9UQVNLKQorICAgICAgICBfX2ttcF9wcmludGYoIlRBU0tRX1RBU0sgIik7CisgICAgaWYgKGZsYWdzICYgVFFGX1JFTEVBU0VfV09SS0VSUykKKyAgICAgICAgX19rbXBfcHJpbnRmKCJSRUxFQVNFICIpOworICAgIGlmIChmbGFncyAmIFRRRl9BTExfVEFTS1NfUVVFVUVEKQorICAgICAgICBfX2ttcF9wcmludGYoIkFMTF9RVUVVRUQgIik7CisgICAgaWYgKGZsYWdzICYgVFFGX1BBUkFMTEVMX0NPTlRFWFQpCisgICAgICAgIF9fa21wX3ByaW50ZigiUEFSQUxMRUwgIik7CisgICAgaWYgKGZsYWdzICYgVFFGX0RFQUxMT0NBVEVEKQorICAgICAgICBfX2ttcF9wcmludGYoIkRFQUxMT0MgIik7CisgICAgaWYgKCEoZmxhZ3MgJiAoVFFGX0lOVEVSTkFMX0ZMQUdTfFRRRl9JTlRFUkZBQ0VfRkxBR1MpKSkKKyAgICAgICAgX19rbXBfcHJpbnRmKCIoTk9ORSkiKTsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2R1bXBfdGh1bmsoIGttcF90YXNrcV90ICp0cSwga21wY190aHVua190ICp0aHVuaywga21wX2ludDMyIGdsb2JhbF90aWQgKQoreworICAgIGludCBpOworICAgIGludCBucHJvYyA9IF9fa21wX3RocmVhZHNbZ2xvYmFsX3RpZF0gLT4gdGgudGhfdGVhbSAtPiB0LnRfbnByb2M7CisKKyAgICBfX2ttcF9wcmludGYoIlx0VGh1bmsgYXQgJXAgb24gKCVkKTogICIsIHRodW5rLCBnbG9iYWxfdGlkKTsKKworICAgIGlmICh0aHVuayAhPSBOVUxMKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBucHJvYzsgaSsrKSB7CisgICAgICAgICAgICBpZiggdHEtPnRxX2N1cnJfdGh1bmtbaV0gPT0gdGh1bmsgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRmKCJbJWldICIsIGkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIF9fa21wX3ByaW50ZigidGhfc2hhcmVkcz0lcCwgIiwgdGh1bmstPnRoLnRoX3NoYXJlZHMpOworICAgICAgICBfX2ttcF9wcmludGYoInRoX3Rhc2s9JXAsICIsIHRodW5rLT50aF90YXNrKTsKKyAgICAgICAgX19rbXBfcHJpbnRmKCJ0aF9lbmNsX3RodW5rPSVwLCAiLCB0aHVuay0+dGhfZW5jbF90aHVuayk7CisgICAgICAgIF9fa21wX3ByaW50ZigidGhfc3RhdHVzPSVkLCAiLCB0aHVuay0+dGhfc3RhdHVzKTsKKyAgICAgICAgX19rbXBfcHJpbnRmKCJ0aF90YXNrbnVtPSV1LCAiLCB0aHVuay0+dGhfdGFza251bSk7CisgICAgICAgIF9fa21wX3ByaW50ZigidGhfZmxhZ3M9Iik7IF9fa21wX2R1bXBfVFFGKHRodW5rLT50aF9mbGFncyk7CisgICAgfQorCisgICAgX19rbXBfcHJpbnRmKCJcbiIpOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfZHVtcF90aHVua19zdGFjayhrbXBjX3RodW5rX3QgKnRodW5rLCBrbXBfaW50MzIgdGhyZWFkX251bSkKK3sKKyAgICBrbXBjX3RodW5rX3QgKnRoOworCisgICAgX19rbXBfcHJpbnRmKCIgICAgVGh1bmsgc3RhY2sgZm9yIFQjJWQ6ICAiLCB0aHJlYWRfbnVtKTsKKworICAgIGZvciAodGggPSB0aHVuazsgdGggIT0gTlVMTDsgdGggPSB0aC0+dGhfZW5jbF90aHVuayApCisgICAgICAgIF9fa21wX3ByaW50ZigiJXAgIiwgdGgpOworCisgICAgX19rbXBfcHJpbnRmKCJcbiIpOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfZHVtcF90YXNrX3F1ZXVlKCBrbXBfdGFza3FfdCAqdHEsIGttcGNfdGFza19xdWV1ZV90ICpxdWV1ZSwga21wX2ludDMyIGdsb2JhbF90aWQgKQoreworICAgIGludCAgICAgICAgICAgICAgICAgIHFzLCBjb3VudCwgaTsKKyAgICBrbXBjX3RodW5rX3QgICAgICAgICp0aHVuazsKKyAgICBrbXBjX3Rhc2tfcXVldWVfdCAgICp0YXNrcTsKKworICAgIF9fa21wX3ByaW50ZigiVGFzayBRdWV1ZSBhdCAlcCBvbiAoJWQpOlxuIiwgcXVldWUsIGdsb2JhbF90aWQpOworCisgICAgaWYgKHF1ZXVlICE9IE5VTEwpIHsKKyAgICAgICAgaW50IGluX3BhcmFsbGVsID0gcXVldWUtPnRxX2ZsYWdzICYgVFFGX1BBUkFMTEVMX0NPTlRFWFQ7CisKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgX19rbXBfcHJpbnRmKCIgICAgdHFfbG9jICAgICAgICAgICAgIDogIik7CisgICAgfQorICAgICAgICBpZiAoaW5fcGFyYWxsZWwpIHsKKworICAgICAgICAgICAgLy9pZiAocXVldWUtPnRxLnRxX3BhcmVudCAhPSAwKQorICAgICAgICAgICAgICAgIC8vX19rbXBfYWNxdWlyZV9sb2NrKCYgcXVldWUtPnRxLnRxX3BhcmVudC0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworCisgICAgICAgICAgICAvL19fa21wX2FjcXVpcmVfbG9jaygmIHF1ZXVlLT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisKKyAgICAgICAgICAgIEtNUF9NQigpOyAgLyogbWFrZSBzdXJlIGRhdGEgc3RydWN0dXJlcyBhcmUgaW4gY29uc2lzdGVudCBzdGF0ZSBiZWZvcmUgcXVlcnlpbmcgdGhlbSAqLworICAgICAgICAgICAgICAgICAgICAgICAvKiBTZWVtcyB0byB3b3JrIGZpbmUgd2l0aG91dCB0aGlzIGNhbGwgZm9yIGRpZ2l0YWwvYWxwaGEsIG5lZWRlZCBmb3IgSUJNL1JTNjAwMCAqLworCisgICAgICAgICAgICBfX2ttcF9wcmludGYoIiAgICB0cV9wYXJlbnQgICAgICAgICAgOiAlcFxuIiwgcXVldWUtPnRxLnRxX3BhcmVudCk7CisgICAgICAgICAgICBfX2ttcF9wcmludGYoIiAgICB0cV9maXJzdF9jaGlsZCAgICAgOiAlcFxuIiwgcXVldWUtPnRxX2ZpcnN0X2NoaWxkKTsKKyAgICAgICAgICAgIF9fa21wX3ByaW50ZigiICAgIHRxX25leHRfY2hpbGQgICAgICA6ICVwXG4iLCBxdWV1ZS0+dHFfbmV4dF9jaGlsZCk7CisgICAgICAgICAgICBfX2ttcF9wcmludGYoIiAgICB0cV9wcmV2X2NoaWxkICAgICAgOiAlcFxuIiwgcXVldWUtPnRxX3ByZXZfY2hpbGQpOworICAgICAgICAgICAgX19rbXBfcHJpbnRmKCIgICAgdHFfcmVmX2NvdW50ICAgICAgIDogJWRcbiIsIHF1ZXVlLT50cV9yZWZfY291bnQpOworCisgICAgICAgICAgICAvL19fa21wX3JlbGVhc2VfbG9jaygmIHF1ZXVlLT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisKKyAgICAgICAgICAgIC8vaWYgKHF1ZXVlLT50cS50cV9wYXJlbnQgIT0gMCkKKyAgICAgICAgICAgICAgICAvL19fa21wX3JlbGVhc2VfbG9jaygmIHF1ZXVlLT50cS50cV9wYXJlbnQtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKworICAgICAgICAgICAgLy9fX2ttcF9hY3F1aXJlX2xvY2soJiBxdWV1ZS0+dHFfZnJlZV90aHVua3NfbGNrLCBnbG9iYWxfdGlkKTsKKyAgICAgICAgICAgIC8vX19rbXBfYWNxdWlyZV9sb2NrKCYgcXVldWUtPnRxX3F1ZXVlX2xjaywgZ2xvYmFsX3RpZCk7CisKKyAgICAgICAgICAgIEtNUF9NQigpOyAgLyogbWFrZSBzdXJlIGRhdGEgc3RydWN0dXJlcyBhcmUgaW4gY29uc2lzdGVudCBzdGF0ZSBiZWZvcmUgcXVlcnlpbmcgdGhlbSAqLworICAgICAgICAgICAgICAgICAgICAgICAvKiBTZWVtcyB0byB3b3JrIGZpbmUgd2l0aG91dCB0aGlzIGNhbGwgZm9yIGRpZ2l0YWwvYWxwaGEsIG5lZWRlZCBmb3IgSUJNL1JTNjAwMCAqLworICAgICAgICB9CisKKyAgICAgICAgX19rbXBfcHJpbnRmKCIgICAgdHFfc2hhcmVkcyAgICAgICAgIDogIik7CisgICAgICAgIGZvciAoaT0wOyBpPCgocXVldWUgPT0gdHEtPnRxX3Jvb3QpID8gcXVldWUtPnRxX25wcm9jIDogMSk7IGkrKykKKyAgICAgICAgICAgIF9fa21wX3ByaW50ZigiJXAgIiwgcXVldWUtPnRxX3NoYXJlZHNbaV0uYWlfZGF0YSk7CisgICAgICAgIF9fa21wX3ByaW50ZigiXG4iKTsKKworICAgICAgICBpZiAoaW5fcGFyYWxsZWwpIHsKKyAgICAgICAgICAgIF9fa21wX3ByaW50ZigiICAgIHRxX3Rhc2tudW1fcXVldWluZyA6ICV1XG4iLCBxdWV1ZS0+dHFfdGFza251bV9xdWV1aW5nKTsKKyAgICAgICAgICAgIF9fa21wX3ByaW50ZigiICAgIHRxX3Rhc2tudW1fc2VydmluZyA6ICV1XG4iLCBxdWV1ZS0+dHFfdGFza251bV9zZXJ2aW5nKTsKKyAgICAgICAgfQorCisgICAgICAgIF9fa21wX3ByaW50ZigiICAgIHRxX3F1ZXVlICAgICAgICAgICA6ICVwXG4iLCBxdWV1ZS0+dHFfcXVldWUpOworICAgICAgICBfX2ttcF9wcmludGYoIiAgICB0cV90aHVua19zcGFjZSAgICAgOiAlcFxuIiwgcXVldWUtPnRxX3RodW5rX3NwYWNlKTsKKyAgICAgICAgX19rbXBfcHJpbnRmKCIgICAgdHFfdGFza3Ffc2xvdCAgICAgIDogJXBcbiIsIHF1ZXVlLT50cV90YXNrcV9zbG90KTsKKworICAgICAgICBfX2ttcF9wcmludGYoIiAgICB0cV9mcmVlX3RodW5rcyAgICAgOiAiKTsKKyAgICAgICAgZm9yICh0aHVuayA9IHF1ZXVlLT50cV9mcmVlX3RodW5rczsgdGh1bmsgIT0gTlVMTDsgdGh1bmsgPSB0aHVuay0+dGgudGhfbmV4dF9mcmVlICkKKyAgICAgICAgICAgIF9fa21wX3ByaW50ZigiJXAgIiwgdGh1bmspOworICAgICAgICBfX2ttcF9wcmludGYoIlxuIik7CisKKyAgICAgICAgX19rbXBfcHJpbnRmKCIgICAgdHFfbnNsb3RzICAgICAgICAgIDogJWRcbiIsIHF1ZXVlLT50cV9uc2xvdHMpOworICAgICAgICBfX2ttcF9wcmludGYoIiAgICB0cV9oZWFkICAgICAgICAgICAgOiAlZFxuIiwgcXVldWUtPnRxX2hlYWQpOworICAgICAgICBfX2ttcF9wcmludGYoIiAgICB0cV90YWlsICAgICAgICAgICAgOiAlZFxuIiwgcXVldWUtPnRxX3RhaWwpOworICAgICAgICBfX2ttcF9wcmludGYoIiAgICB0cV9uZnVsbCAgICAgICAgICAgOiAlZFxuIiwgcXVldWUtPnRxX25mdWxsKTsKKyAgICAgICAgX19rbXBfcHJpbnRmKCIgICAgdHFfaGl3YXQgICAgICAgICAgIDogJWRcbiIsIHF1ZXVlLT50cV9oaXdhdCk7CisgICAgICAgIF9fa21wX3ByaW50ZigiICAgIHRxX2ZsYWdzICAgICAgICAgICA6ICIpOyBfX2ttcF9kdW1wX1RRRihxdWV1ZS0+dHFfZmxhZ3MpOworICAgICAgICBfX2ttcF9wcmludGYoIlxuIik7CisKKyAgICAgICAgaWYgKGluX3BhcmFsbGVsKSB7CisgICAgICAgICAgICBfX2ttcF9wcmludGYoIiAgICB0cV90aF90aHVua3MgICAgICAgOiAiKTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBxdWV1ZS0+dHFfbnByb2M7IGkrKykgeworICAgICAgICAgICAgICAgIF9fa21wX3ByaW50ZigiJWQgIiwgcXVldWUtPnRxX3RoX3RodW5rc1tpXS5haV9kYXRhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9fa21wX3ByaW50ZigiXG4iKTsKKyAgICAgICAgfQorCisgICAgICAgIF9fa21wX3ByaW50ZigiXG4iKTsKKyAgICAgICAgX19rbXBfcHJpbnRmKCIgICAgUXVldWUgc2xvdHM6XG4iKTsKKworCisgICAgICAgIHFzID0gcXVldWUtPnRxX3RhaWw7CisgICAgICAgIGZvciAoIGNvdW50ID0gMDsgY291bnQgPCBxdWV1ZS0+dHFfbmZ1bGw7ICsrY291bnQgKSB7CisgICAgICAgICAgICBfX2ttcF9wcmludGYoIiglZCkiLCBxcyk7CisgICAgICAgICAgICBfX2ttcF9kdW1wX3RodW5rKCB0cSwgcXVldWUtPnRxX3F1ZXVlW3FzXS5xc190aHVuaywgZ2xvYmFsX3RpZCApOworICAgICAgICAgICAgcXMgPSAocXMrMSkgJSBxdWV1ZS0+dHFfbnNsb3RzOworICAgICAgICB9CisKKyAgICAgICAgX19rbXBfcHJpbnRmKCJcbiIpOworCisgICAgICAgIGlmIChpbl9wYXJhbGxlbCkgeworICAgICAgICAgICAgaWYgKHF1ZXVlLT50cV90YXNrcV9zbG90ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludGYoIiAgICBUYXNrUSBzbG90OlxuIik7CisgICAgICAgICAgICAgICAgX19rbXBfZHVtcF90aHVuayggdHEsIChrbXBjX3RodW5rX3QgKikgcXVldWUtPnRxX3Rhc2txX3Nsb3QsIGdsb2JhbF90aWQgKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludGYoIlxuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvL19fa21wX3JlbGVhc2VfbG9jaygmIHF1ZXVlLT50cV9xdWV1ZV9sY2ssIGdsb2JhbF90aWQpOworICAgICAgICAgICAgLy9fX2ttcF9yZWxlYXNlX2xvY2soJiBxdWV1ZS0+dHFfZnJlZV90aHVua3NfbGNrLCBnbG9iYWxfdGlkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIF9fa21wX3ByaW50ZigiICAgIFRhc2txIGZyZWVsaXN0OiAiKTsKKworICAgIC8vX19rbXBfYWNxdWlyZV9sb2NrKCAmIHRxLT50cV9mcmVlbGlzdF9sY2ssIGdsb2JhbF90aWQgKTsKKworICAgIEtNUF9NQigpOyAgLyogbWFrZSBzdXJlIGRhdGEgc3RydWN0dXJlcyBhcmUgaW4gY29uc2lzdGVudCBzdGF0ZSBiZWZvcmUgcXVlcnlpbmcgdGhlbSAqLworICAgICAgICAgICAgICAgLyogU2VlbXMgdG8gd29yayBmaW5lIHdpdGhvdXQgdGhpcyBjYWxsIGZvciBkaWdpdGFsL2FscGhhLCBuZWVkZWQgZm9yIElCTS9SUzYwMDAgKi8KKworICAgIGZvciggdGFza3EgPSB0cS0+dHFfZnJlZWxpc3Q7IHRhc2txICE9IE5VTEw7IHRhc2txID0gdGFza3EtPnRxLnRxX25leHRfZnJlZSApCisgICAgICAgIF9fa21wX3ByaW50ZigiJXAgIiwgdGFza3EpOworCisgICAgLy9fX2ttcF9yZWxlYXNlX2xvY2soICYgdHEtPnRxX2ZyZWVsaXN0X2xjaywgZ2xvYmFsX3RpZCApOworCisgICAgX19rbXBfcHJpbnRmKCJcblxuIik7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9hdXhfZHVtcF90YXNrX3F1ZXVlX3RyZWUoIGttcF90YXNrcV90ICp0cSwga21wY190YXNrX3F1ZXVlX3QgKmN1cnJfcXVldWUsIGttcF9pbnQzMiBsZXZlbCwga21wX2ludDMyIGdsb2JhbF90aWQgKQoreworICAgIGludCBpLCBjb3VudCwgcXM7CisgICAgaW50IG5wcm9jID0gX19rbXBfdGhyZWFkc1tnbG9iYWxfdGlkXSAtPiB0aC50aF90ZWFtIC0+IHQudF9ucHJvYzsKKyAgICBrbXBjX3Rhc2tfcXVldWVfdCAqcXVldWUgPSBjdXJyX3F1ZXVlOworCisgICAgaWYgKGN1cnJfcXVldWUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworCisgICAgX19rbXBfcHJpbnRmKCIgICAgIik7CisKKyAgICBmb3IgKGk9MDsgaTxsZXZlbDsgaSsrKQorICAgICAgICBfX2ttcF9wcmludGYoIiAgIik7CisKKyAgICBfX2ttcF9wcmludGYoIiVwIiwgY3Vycl9xdWV1ZSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnByb2M7IGkrKykgeworICAgICAgICBpZiggdHEtPnRxX2N1cnJfdGh1bmtbaV0gJiYgdHEtPnRxX2N1cnJfdGh1bmtbaV0tPnRoLnRoX3NoYXJlZHMtPnN2X3F1ZXVlID09IGN1cnJfcXVldWUgKSB7CisgICAgICAgICAgICBfX2ttcF9wcmludGYoIiBbJWldIiwgaSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBfX2ttcF9wcmludGYoIjoiKTsKKworICAgIC8vX19rbXBfYWNxdWlyZV9sb2NrKCYgY3Vycl9xdWV1ZS0+dHFfcXVldWVfbGNrLCBnbG9iYWxfdGlkKTsKKworICAgIEtNUF9NQigpOyAgLyogbWFrZSBzdXJlIGRhdGEgc3RydWN0dXJlcyBhcmUgaW4gY29uc2lzdGVudCBzdGF0ZSBiZWZvcmUgcXVlcnlpbmcgdGhlbSAqLworICAgICAgICAgICAgICAgLyogU2VlbXMgdG8gd29yayBmaW5lIHdpdGhvdXQgdGhpcyBjYWxsIGZvciBkaWdpdGFsL2FscGhhLCBuZWVkZWQgZm9yIElCTS9SUzYwMDAgKi8KKworICAgIHFzID0gY3Vycl9xdWV1ZS0+dHFfdGFpbDsKKworICAgIGZvciAoIGNvdW50ID0gMDsgY291bnQgPCBjdXJyX3F1ZXVlLT50cV9uZnVsbDsgKytjb3VudCApIHsKKyAgICAgICAgX19rbXBfcHJpbnRmKCIlcCAiLCBjdXJyX3F1ZXVlLT50cV9xdWV1ZVtxc10ucXNfdGh1bmspOworICAgICAgICAgcXMgPSAocXMrMSkgJSBjdXJyX3F1ZXVlLT50cV9uc2xvdHM7CisgICAgfQorCisgICAgLy9fX2ttcF9yZWxlYXNlX2xvY2soJiBjdXJyX3F1ZXVlLT50cV9xdWV1ZV9sY2ssIGdsb2JhbF90aWQpOworCisgICAgX19rbXBfcHJpbnRmKCJcbiIpOworCisgICAgaWYgKGN1cnJfcXVldWUtPnRxX2ZpcnN0X2NoaWxkKSB7CisgICAgICAgIC8vX19rbXBfYWNxdWlyZV9sb2NrKCYgY3Vycl9xdWV1ZS0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworCisgICAgICAgIEtNUF9NQigpOyAgLyogbWFrZSBzdXJlIGRhdGEgc3RydWN0dXJlcyBhcmUgaW4gY29uc2lzdGVudCBzdGF0ZSBiZWZvcmUgcXVlcnlpbmcgdGhlbSAqLworICAgICAgICAgICAgICAgICAgIC8qIFNlZW1zIHRvIHdvcmsgZmluZSB3aXRob3V0IHRoaXMgY2FsbCBmb3IgZGlnaXRhbC9hbHBoYSwgbmVlZGVkIGZvciBJQk0vUlM2MDAwICovCisKKyAgICAgICAgaWYgKGN1cnJfcXVldWUtPnRxX2ZpcnN0X2NoaWxkKSB7CisgICAgICAgICAgICBmb3IocXVldWUgPSAoa21wY190YXNrX3F1ZXVlX3QgKiljdXJyX3F1ZXVlLT50cV9maXJzdF9jaGlsZDsKKyAgICAgICAgICAgICAgICBxdWV1ZSAhPSBOVUxMOworICAgICAgICAgICAgICAgIHF1ZXVlID0gcXVldWUtPnRxX25leHRfY2hpbGQpIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9hdXhfZHVtcF90YXNrX3F1ZXVlX3RyZWUoIHRxLCBxdWV1ZSwgbGV2ZWwrMSwgZ2xvYmFsX3RpZCApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy9fX2ttcF9yZWxlYXNlX2xvY2soJiBjdXJyX3F1ZXVlLT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorX19rbXBfZHVtcF90YXNrX3F1ZXVlX3RyZWUoIGttcF90YXNrcV90ICp0cSwga21wY190YXNrX3F1ZXVlX3QgKnRxcm9vdCwga21wX2ludDMyIGdsb2JhbF90aWQpCit7CisgICAgX19rbXBfcHJpbnRmKCJUYXNrUSBUcmVlIGF0IHJvb3QgJXAgb24gKCVkKTpcbiIsIHRxcm9vdCwgZ2xvYmFsX3RpZCk7CisKKyAgICBfX2ttcF9hdXhfZHVtcF90YXNrX3F1ZXVlX3RyZWUoIHRxLCB0cXJvb3QsIDAsIGdsb2JhbF90aWQgKTsKKworICAgIF9fa21wX3ByaW50ZigiXG4iKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgICAgTmV3IHRhc2txIHN0b3JhZ2Ugcm91dGluZXMgdGhhdCB0cnkgdG8gbWluaW1pemUgb3ZlcmhlYWQgb2YgbWFsbG9jcyBidXQKKyAgICBzdGlsbCBwcm92aWRlIGNhY2hlIGxpbmUgYWxpZ25tZW50LgorKi8KKworCitzdGF0aWMgdm9pZCAqCitfX2ttcF90YXNrcV9hbGxvY2F0ZShzaXplX3Qgc2l6ZSwga21wX2ludDMyIGdsb2JhbF90aWQpCit7CisgICAgdm9pZCAqYWRkciwgKm9yaWdfYWRkcjsKKyAgICBzaXplX3QgYnl0ZXM7CisKKyAgICBLQl9UUkFDRSggNSwgKCJfX2ttcF90YXNrcV9hbGxvY2F0ZTogY2FsbGVkIHNpemU9JWQsIGd0aWQ9JWRcbiIsIChpbnQpIHNpemUsIGdsb2JhbF90aWQgKSApOworCisgICAgYnl0ZXMgPSBzaXplb2Yodm9pZCAqKSArIENBQ0hFX0xJTkUgKyBzaXplOworCisjaWZkZWYgVEhSRUFEX0FMTE9DX0ZPUl9UQVNLUQorICAgIG9yaWdfYWRkciA9ICh2b2lkICopIF9fa21wX3RocmVhZF9tYWxsb2MoIF9fa21wX3RocmVhZF9mcm9tX2d0aWQoZ2xvYmFsX3RpZCksIGJ5dGVzICk7CisjZWxzZQorICAgIEtFX1RSQUNFKCAxMCwgKCIlJSUlJSUgTUFMTE9DKCAlZCApXG4iLCBieXRlcyApICk7CisgICAgb3JpZ19hZGRyID0gKHZvaWQgKikgS01QX0lOVEVSTkFMX01BTExPQyggYnl0ZXMgKTsKKyNlbmRpZiAvKiBUSFJFQURfQUxMT0NfRk9SX1RBU0tRICovCisKKyAgICBpZiAob3JpZ19hZGRyID09IDApCisgICAgICAgIEtNUF9GQVRBTCggT3V0T2ZIZWFwTWVtb3J5ICk7CisKKyAgICBhZGRyID0gb3JpZ19hZGRyOworCisgICAgaWYgKCgoa21wX3VpbnRwdHJfdCkgYWRkciAmICggQ0FDSEVfTElORSAtIDEgKSkgIT0gMCkgeworICAgICAgICBLQl9UUkFDRSggNTAsICgiX19rbXBfdGFza3FfYWxsb2NhdGU6ICBhZGp1c3QgZm9yIGNhY2hlIGFsaWdubWVudFxuIiApICk7CisgICAgICAgIGFkZHIgPSAodm9pZCAqKSAoKChrbXBfdWludHB0cl90KSBhZGRyICsgQ0FDSEVfTElORSkgJiB+KCBDQUNIRV9MSU5FIC0gMSApKTsKKyAgICB9CisKKyAgICAoKiAodm9pZCAqKikgYWRkcikgPSBvcmlnX2FkZHI7CisKKyAgICBLQl9UUkFDRSggMTAsICgiX19rbXBfdGFza3FfYWxsb2NhdGU6ICBhbGxvY2F0ZTogJXAsIHVzZTogJXAgLSAlcCwgc2l6ZTogJWQsIGd0aWQ6ICVkXG4iLAorICAgICAgICAgICAgIG9yaWdfYWRkciwgKCh2b2lkICoqKSBhZGRyKSArIDEsICgoY2hhciAqKSgoKHZvaWQgKiopIGFkZHIpICsgMSkpICsgc2l6ZS0xLAorICAgICAgICAgICAgIChpbnQpIHNpemUsIGdsb2JhbF90aWQgKSk7CisKKyAgICByZXR1cm4gKCAoKHZvaWQgKiopIGFkZHIpICsgMSApOworfQorCitzdGF0aWMgdm9pZAorX19rbXBjX3Rhc2txX2ZyZWUodm9pZCAqcCwga21wX2ludDMyIGdsb2JhbF90aWQpCit7CisgICAgS0JfVFJBQ0UoIDUsICgiX19rbXBjX3Rhc2txX2ZyZWU6IGNhbGxlZCBhZGRyPSVwLCBndGlkPSVkXG4iLCBwLCBnbG9iYWxfdGlkICkgKTsKKworICAgIEtCX1RSQUNFKDEwLCAoIl9fa21wY190YXNrcV9mcmVlOiAgZnJlZWluZzogJXAsIGd0aWQ6ICVkXG4iLCAoKiggKCh2b2lkICoqKSBwKS0xKSksIGdsb2JhbF90aWQgKSk7CisKKyNpZmRlZiBUSFJFQURfQUxMT0NfRk9SX1RBU0tRCisgICAgX19rbXBfdGhyZWFkX2ZyZWUoIF9fa21wX3RocmVhZF9mcm9tX2d0aWQoZ2xvYmFsX3RpZCksICooICgodm9pZCAqKikgcCktMSkgKTsKKyNlbHNlCisgICAgS01QX0lOVEVSTkFMX0ZSRUUoICooICgodm9pZCAqKikgcCktMSkgKTsKKyNlbmRpZiAvKiBUSFJFQURfQUxMT0NfRk9SX1RBU0tRICovCit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogICAgICBLZWVwIGZyZWVkIGttcGNfdGFza19xdWV1ZV90IG9uIGFuIGludGVybmFsIGZyZWVsaXN0IGFuZCByZWN5Y2xlIHNpbmNlCisgKiAgICAgIHRoZXkncmUgb2YgY29uc3RhbnQgc2l6ZS4KKyAqLworCitzdGF0aWMga21wY190YXNrX3F1ZXVlX3QgKgorX19rbXBfYWxsb2NfdGFza3EgKCBrbXBfdGFza3FfdCAqdHEsIGludCBpbl9wYXJhbGxlbCwga21wX2ludDMyIG5zbG90cywga21wX2ludDMyIG50aHVua3MsCisgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBuc2hhcmVkcywga21wX2ludDMyIG5wcm9jLCBzaXplX3Qgc2l6ZW9mX3RodW5rLAorICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZW9mX3NoYXJlZHMsIGttcGNfdGh1bmtfdCAqKm5ld190YXNrcV90aHVuaywga21wX2ludDMyIGdsb2JhbF90aWQgKQoreworICAgIGttcF9pbnQzMiAgICAgICAgICAgICAgICAgIGk7CisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgYnl0ZXM7CisgICAga21wY190YXNrX3F1ZXVlX3QgICAgICAgICAgKm5ld19xdWV1ZTsKKyAgICBrbXBjX2FsaWduZWRfc2hhcmVkX3ZhcnNfdCAqc2hhcmVkX3Zhcl9hcnJheTsKKyAgICBjaGFyICAgICAgICAgICAgICAgICAgICAgICAqc2hhcmVkX3Zhcl9zdG9yYWdlOworICAgIGNoYXIgICAgICAgICAgICAgICAgICAgICAgICpwdDsgLyogZm9yIGRvaW5nIGJ5dGUtYWRqdXN0ZWQgYWRkcmVzcyBjb21wdXRhdGlvbnMgKi8KKworICAgIF9fa21wX2FjcXVpcmVfbG9jayggJiB0cS0+dHFfZnJlZWxpc3RfbGNrLCBnbG9iYWxfdGlkICk7CisKKyAgICBLTVBfTUIoKTsgIC8qIG1ha2Ugc3VyZSBkYXRhIHN0cnVjdHVyZXMgYXJlIGluIGNvbnNpc3RlbnQgc3RhdGUgYmVmb3JlIHF1ZXJ5aW5nIHRoZW0gKi8KKyAgICAgICAgICAgICAgIC8qIFNlZW1zIHRvIHdvcmsgZmluZSB3aXRob3V0IHRoaXMgY2FsbCBmb3IgZGlnaXRhbC9hbHBoYSwgbmVlZGVkIGZvciBJQk0vUlM2MDAwICovCisKKyAgICBpZiggdHEtPnRxX2ZyZWVsaXN0ICkgeworICAgICAgICBuZXdfcXVldWUgPSAgdHEgLT4gdHFfZnJlZWxpc3Q7CisgICAgICAgIHRxIC0+IHRxX2ZyZWVsaXN0ID0gIHRxIC0+IHRxX2ZyZWVsaXN0IC0+IHRxLnRxX25leHRfZnJlZTsKKworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKG5ld19xdWV1ZS0+dHFfZmxhZ3MgJiBUUUZfREVBTExPQ0FURUQpOworCisgICAgICAgIG5ld19xdWV1ZS0+dHFfZmxhZ3MgPSAwOworCisgICAgICAgIF9fa21wX3JlbGVhc2VfbG9jayggJiB0cS0+dHFfZnJlZWxpc3RfbGNrLCBnbG9iYWxfdGlkICk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBfX2ttcF9yZWxlYXNlX2xvY2soICYgdHEtPnRxX2ZyZWVsaXN0X2xjaywgZ2xvYmFsX3RpZCApOworCisgICAgICAgIG5ld19xdWV1ZSA9IChrbXBjX3Rhc2tfcXVldWVfdCAqKSBfX2ttcF90YXNrcV9hbGxvY2F0ZSAoc2l6ZW9mIChrbXBjX3Rhc2tfcXVldWVfdCksIGdsb2JhbF90aWQpOworICAgICAgICBuZXdfcXVldWUtPnRxX2ZsYWdzID0gMDsKKyAgICB9CisKKyAgICAvKiAgc3BhY2UgaW4gdGhlIHRhc2sgcXVldWUgZm9yIHF1ZXVlIHNsb3RzIChhbGxvY2F0ZSBhcyBvbmUgYmlnIGNodW5rICovCisgICAgLyogb2Ygc3RvcmFnZSBpbmNsdWRpbmcgbmV3X3Rhc2txX3Rhc2sgc3BhY2UpICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgc2l6ZW9mX3RodW5rICs9IChDQUNIRV9MSU5FIC0gKHNpemVvZl90aHVuayAlIENBQ0hFX0xJTkUpKTsgICAgICAgICAvKiBwYWQgdG8gY2FjaGUgbGluZSBzaXplICovCisgICAgcHQgPSAoY2hhciAqKSBfX2ttcF90YXNrcV9hbGxvY2F0ZSAobnRodW5rcyAqIHNpemVvZl90aHVuaywgZ2xvYmFsX3RpZCk7CisgICAgbmV3X3F1ZXVlLT50cV90aHVua19zcGFjZSA9IChrbXBjX3RodW5rX3QgKilwdDsKKyAgICAqbmV3X3Rhc2txX3RodW5rID0gKGttcGNfdGh1bmtfdCAqKShwdCArIChudGh1bmtzIC0gMSkgKiBzaXplb2ZfdGh1bmspOworCisgICAgLyogIGNoYWluIHRoZSBhbGxvY2F0ZWQgdGh1bmtzIGludG8gYSBmcmVlbGlzdCBmb3IgdGhpcyBxdWV1ZSAgKi8KKworICAgIG5ld19xdWV1ZS0+dHFfZnJlZV90aHVua3MgPSAoa21wY190aHVua190ICopcHQ7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgKG50aHVua3MgLSAyKTsgaSsrKSB7CisgICAgICAgICgoa21wY190aHVua190ICopKHB0K2kqc2l6ZW9mX3RodW5rKSktPnRoLnRoX25leHRfZnJlZSA9IChrbXBjX3RodW5rX3QgKikocHQgKyAoaSsxKSpzaXplb2ZfdGh1bmspOworI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAoKGttcGNfdGh1bmtfdCAqKShwdCtpKnNpemVvZl90aHVuaykpLT50aF9mbGFncyA9IFRRRl9ERUFMTE9DQVRFRDsKKyNlbmRpZgorICAgIH0KKworICAgICgoa21wY190aHVua190ICopKHB0KyhudGh1bmtzLTIpKnNpemVvZl90aHVuaykpLT50aC50aF9uZXh0X2ZyZWUgPSBOVUxMOworI2lmZGVmIEtNUF9ERUJVRworICAgICgoa21wY190aHVua190ICopKHB0KyhudGh1bmtzLTIpKnNpemVvZl90aHVuaykpLT50aF9mbGFncyA9IFRRRl9ERUFMTE9DQVRFRDsKKyNlbmRpZgorCisgICAgLyogaW5pdGlhbGl6ZSB0aGUgbG9ja3MgKi8KKworICAgIGlmIChpbl9wYXJhbGxlbCkgeworICAgICAgICBfX2ttcF9pbml0X2xvY2soICYgbmV3X3F1ZXVlLT50cV9saW5rX2xjayApOworICAgICAgICBfX2ttcF9pbml0X2xvY2soICYgbmV3X3F1ZXVlLT50cV9mcmVlX3RodW5rc19sY2sgKTsKKyAgICAgICAgX19rbXBfaW5pdF9sb2NrKCAmIG5ld19xdWV1ZS0+dHFfcXVldWVfbGNrICk7CisgICAgfQorCisgICAgLyogbm93IGFsbG9jYXRlIHRoZSBzbG90cyAqLworCisgICAgYnl0ZXMgPSBuc2xvdHMgKiBzaXplb2YgKGttcGNfYWxpZ25lZF9xdWV1ZV9zbG90X3QpOworICAgIG5ld19xdWV1ZS0+dHFfcXVldWUgPSAoa21wY19hbGlnbmVkX3F1ZXVlX3Nsb3RfdCAqKSBfX2ttcF90YXNrcV9hbGxvY2F0ZSggYnl0ZXMsIGdsb2JhbF90aWQgKTsKKworICAgIC8qICBzcGFjZSBmb3IgYXJyYXkgb2YgcG9pbnRlcnMgdG8gc2hhcmVkIHZhcmlhYmxlIHN0cnVjdHVyZXMgKi8KKyAgICBzaXplb2Zfc2hhcmVkcyArPSBzaXplb2Yoa21wY190YXNrX3F1ZXVlX3QgKik7CisgICAgc2l6ZW9mX3NoYXJlZHMgKz0gKENBQ0hFX0xJTkUgLSAoc2l6ZW9mX3NoYXJlZHMgJSBDQUNIRV9MSU5FKSk7ICAgICAvKiBwYWQgdG8gY2FjaGUgbGluZSBzaXplICovCisKKyAgICBieXRlcyA9IG5zaGFyZWRzICogc2l6ZW9mIChrbXBjX2FsaWduZWRfc2hhcmVkX3ZhcnNfdCk7CisgICAgc2hhcmVkX3Zhcl9hcnJheSA9IChrbXBjX2FsaWduZWRfc2hhcmVkX3ZhcnNfdCAqKSBfX2ttcF90YXNrcV9hbGxvY2F0ZSAoIGJ5dGVzLCBnbG9iYWxfdGlkKTsKKworICAgIGJ5dGVzID0gbnNoYXJlZHMgKiBzaXplb2Zfc2hhcmVkczsKKyAgICBzaGFyZWRfdmFyX3N0b3JhZ2UgPSAoY2hhciAqKSBfX2ttcF90YXNrcV9hbGxvY2F0ZSAoIGJ5dGVzLCBnbG9iYWxfdGlkKTsKKworICAgIGZvciAoaT0wOyBpPG5zaGFyZWRzOyBpKyspIHsKKyAgICAgICAgc2hhcmVkX3Zhcl9hcnJheVtpXS5haV9kYXRhID0gKGttcGNfc2hhcmVkX3ZhcnNfdCAqKSAoc2hhcmVkX3Zhcl9zdG9yYWdlICsgaSpzaXplb2Zfc2hhcmVkcyk7CisgICAgICAgIHNoYXJlZF92YXJfYXJyYXlbaV0uYWlfZGF0YS0+c3ZfcXVldWUgPSBuZXdfcXVldWU7CisgICAgfQorICAgIG5ld19xdWV1ZS0+dHFfc2hhcmVkcyA9IHNoYXJlZF92YXJfYXJyYXk7CisKKworICAgIC8qIGFycmF5IGZvciBudW1iZXIgb2Ygb3V0c3RhbmRpbmcgdGh1bmtzIHBlciB0aHJlYWQgKi8KKworICAgIGlmIChpbl9wYXJhbGxlbCkgeworICAgICAgICBieXRlcyA9IG5wcm9jICogc2l6ZW9mKGttcGNfYWxpZ25lZF9pbnQzMl90KTsKKyAgICAgICAgbmV3X3F1ZXVlLT50cV90aF90aHVua3MgPSAoa21wY19hbGlnbmVkX2ludDMyX3QgKikgX19rbXBfdGFza3FfYWxsb2NhdGUgKCBieXRlcywgZ2xvYmFsX3RpZCk7CisgICAgICAgIG5ld19xdWV1ZS0+dHFfbnByb2MgICAgID0gbnByb2M7CisKKyAgICAgICAgZm9yIChpPTA7IGk8bnByb2M7IGkrKykKKyAgICAgICAgICAgIG5ld19xdWV1ZS0+dHFfdGhfdGh1bmtzW2ldLmFpX2RhdGEgPSAwOworICAgIH0KKworICAgIHJldHVybiBuZXdfcXVldWU7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9mcmVlX3Rhc2txIChrbXBfdGFza3FfdCAqdHEsIGttcGNfdGFza19xdWV1ZV90ICpwLCBpbnQgaW5fcGFyYWxsZWwsIGttcF9pbnQzMiBnbG9iYWxfdGlkKQoreworICAgIF9fa21wY190YXNrcV9mcmVlKHAtPnRxX3RodW5rX3NwYWNlLCBnbG9iYWxfdGlkKTsKKyAgICBfX2ttcGNfdGFza3FfZnJlZShwLT50cV9xdWV1ZSwgZ2xvYmFsX3RpZCk7CisKKyAgICAvKiBmcmVlIHNoYXJlZCB2YXIgc3RydWN0dXJlIHN0b3JhZ2UgKi8KKyAgICBfX2ttcGNfdGFza3FfZnJlZSgodm9pZCAqKSBwLT50cV9zaGFyZWRzWzBdLmFpX2RhdGEsIGdsb2JhbF90aWQpOworCisgICAgLyogZnJlZSBhcnJheSBvZiBwb2ludGVycyB0byBzaGFyZWQgdmFycyBzdG9yYWdlICovCisgICAgX19rbXBjX3Rhc2txX2ZyZWUocC0+dHFfc2hhcmVkcywgZ2xvYmFsX3RpZCk7CisKKyNpZmRlZiBLTVBfREVCVUcKKyAgICBwLT50cV9maXJzdF9jaGlsZCA9IE5VTEw7CisgICAgcC0+dHFfbmV4dF9jaGlsZCA9IE5VTEw7CisgICAgcC0+dHFfcHJldl9jaGlsZCA9IE5VTEw7CisgICAgcC0+dHFfcmVmX2NvdW50ID0gLTEwOworICAgIHAtPnRxX3NoYXJlZHMgPSBOVUxMOworICAgIHAtPnRxX3Rhc2tudW1fcXVldWluZyA9IDA7CisgICAgcC0+dHFfdGFza251bV9zZXJ2aW5nID0gMDsKKyAgICBwLT50cV9xdWV1ZSA9IE5VTEw7CisgICAgcC0+dHFfdGh1bmtfc3BhY2UgPSBOVUxMOworICAgIHAtPnRxX3Rhc2txX3Nsb3QgPSBOVUxMOworICAgIHAtPnRxX2ZyZWVfdGh1bmtzID0gTlVMTDsKKyAgICBwLT50cV9uc2xvdHMgPSAwOworICAgIHAtPnRxX2hlYWQgPSAwOworICAgIHAtPnRxX3RhaWwgPSAwOworICAgIHAtPnRxX25mdWxsID0gMDsKKyAgICBwLT50cV9oaXdhdCA9IDA7CisKKyAgICBpZiAoaW5fcGFyYWxsZWwpIHsKKyAgICAgICAgaW50IGk7CisKKyAgICAgICAgZm9yIChpPTA7IGk8cC0+dHFfbnByb2M7IGkrKykKKyAgICAgICAgICAgIHAtPnRxX3RoX3RodW5rc1tpXS5haV9kYXRhID0gMDsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKQorICAgICAgICBwLT50cV9sb2MgPSBOVUxMOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHAtPnRxX2ZsYWdzICYgVFFGX0RFQUxMT0NBVEVEICk7CisgICAgcC0+dHFfZmxhZ3MgPSBUUUZfREVBTExPQ0FURUQ7CisjZW5kaWYgLyogS01QX0RFQlVHICovCisKKyAgICBpZiAoaW5fcGFyYWxsZWwpICB7CisgICAgICAgIF9fa21wY190YXNrcV9mcmVlKHAtPnRxX3RoX3RodW5rcywgZ2xvYmFsX3RpZCk7CisgICAgICAgIF9fa21wX2Rlc3Ryb3lfbG9jaygmIHAtPnRxX2xpbmtfbGNrKTsKKyAgICAgICAgX19rbXBfZGVzdHJveV9sb2NrKCYgcC0+dHFfcXVldWVfbGNrKTsKKyAgICAgICAgX19rbXBfZGVzdHJveV9sb2NrKCYgcC0+dHFfZnJlZV90aHVua3NfbGNrKTsKKyAgICB9CisjaWZkZWYgS01QX0RFQlVHCisgICAgcC0+dHFfdGhfdGh1bmtzID0gTlVMTDsKKyNlbmRpZiAvKiBLTVBfREVCVUcgKi8KKworICAgIEtNUF9NQigpOyAgLyogbWFrZSBzdXJlIGRhdGEgc3RydWN0dXJlcyBhcmUgaW4gY29uc2lzdGVudCBzdGF0ZSBiZWZvcmUgcXVlcnlpbmcgdGhlbSAqLworICAgICAgICAgICAgICAgLyogU2VlbXMgdG8gd29yayBmaW5lIHdpdGhvdXQgdGhpcyBjYWxsIGZvciBkaWdpdGFsL2FscGhhLCBuZWVkZWQgZm9yIElCTS9SUzYwMDAgKi8KKworICAgIF9fa21wX2FjcXVpcmVfbG9jayggJiB0cS0+dHFfZnJlZWxpc3RfbGNrLCBnbG9iYWxfdGlkICk7CisgICAgcC0+dHEudHFfbmV4dF9mcmVlID0gdHEtPnRxX2ZyZWVsaXN0OworCisgICAgdHEtPnRxX2ZyZWVsaXN0ID0gcDsKKyAgICBfX2ttcF9yZWxlYXNlX2xvY2soICYgdHEtPnRxX2ZyZWVsaXN0X2xjaywgZ2xvYmFsX3RpZCApOworfQorCisvKgorICogICAgT25jZSBhIGdyb3VwIG9mIHRodW5rcyBoYXMgYmVlbiBhbGxvY2F0ZWQgZm9yIHVzZSBpbiBhIHBhcnRpY3VsYXIgcXVldWUsCisgKiAgICB0aGVzZSBhcmUgbWFuYWdlZCB2aWEgYSBwZXItcXVldWUgZnJlZWxpc3QuCisgKiAgICBXZSBmb3JjZSBhIGNoZWNrIHRoYXQgdGhlcmUncyBhbHdheXMgYSB0aHVuayBmcmVlIGlmIHdlIG5lZWQgb25lLgorICovCisKK3N0YXRpYyBrbXBjX3RodW5rX3QgKgorX19rbXBfYWxsb2NfdGh1bmsgKGttcGNfdGFza19xdWV1ZV90ICpxdWV1ZSwgaW50IGluX3BhcmFsbGVsLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCkKK3sKKyAgICBrbXBjX3RodW5rX3QgKmZsOworCisgICAgaWYgKGluX3BhcmFsbGVsKSB7CisgICAgICAgIF9fa21wX2FjcXVpcmVfbG9jaygmIHF1ZXVlLT50cV9mcmVlX3RodW5rc19sY2ssIGdsb2JhbF90aWQpOworCisgICAgICAgIEtNUF9NQigpOyAgLyogbWFrZSBzdXJlIGRhdGEgc3RydWN0dXJlcyBhcmUgaW4gY29uc2lzdGVudCBzdGF0ZSBiZWZvcmUgcXVlcnlpbmcgdGhlbSAqLworICAgICAgICAgICAgICAgICAgIC8qIFNlZW1zIHRvIHdvcmsgZmluZSB3aXRob3V0IHRoaXMgY2FsbCBmb3IgZGlnaXRhbC9hbHBoYSwgbmVlZGVkIGZvciBJQk0vUlM2MDAwICovCisgICAgfQorCisgICAgZmwgPSBxdWV1ZS0+dHFfZnJlZV90aHVua3M7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUIChmbCAhPSBOVUxMKTsKKworICAgIHF1ZXVlLT50cV9mcmVlX3RodW5rcyA9IGZsLT50aC50aF9uZXh0X2ZyZWU7CisgICAgZmwtPnRoX2ZsYWdzID0gMDsKKworICAgIGlmIChpbl9wYXJhbGxlbCkKKyAgICAgICAgX19rbXBfcmVsZWFzZV9sb2NrKCYgcXVldWUtPnRxX2ZyZWVfdGh1bmtzX2xjaywgZ2xvYmFsX3RpZCk7CisKKyAgICByZXR1cm4gZmw7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9mcmVlX3RodW5rIChrbXBjX3Rhc2tfcXVldWVfdCAqcXVldWUsIGttcGNfdGh1bmtfdCAqcCwgaW50IGluX3BhcmFsbGVsLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCkKK3sKKyNpZmRlZiBLTVBfREVCVUcKKyAgICBwLT50aF90YXNrID0gMDsKKyAgICBwLT50aF9lbmNsX3RodW5rID0gMDsKKyAgICBwLT50aF9zdGF0dXMgPSAwOworICAgIHAtPnRoX3Rhc2tudW0gPSAwOworICAgIC8qIEFsc28gY291bGQgemVybyBwb2ludGVycyB0byBwcml2YXRlIHZhcnMgKi8KKyNlbmRpZgorCisgICAgaWYgKGluX3BhcmFsbGVsKSB7CisgICAgICAgIF9fa21wX2FjcXVpcmVfbG9jaygmIHF1ZXVlLT50cV9mcmVlX3RodW5rc19sY2ssIGdsb2JhbF90aWQpOworCisgICAgICAgIEtNUF9NQigpOyAgLyogbWFrZSBzdXJlIGRhdGEgc3RydWN0dXJlcyBhcmUgaW4gY29uc2lzdGVudCBzdGF0ZSBiZWZvcmUgcXVlcnlpbmcgdGhlbSAqLworICAgICAgICAgICAgICAgICAgIC8qIFNlZW1zIHRvIHdvcmsgZmluZSB3aXRob3V0IHRoaXMgY2FsbCBmb3IgZGlnaXRhbC9hbHBoYSwgbmVlZGVkIGZvciBJQk0vUlM2MDAwICovCisgICAgfQorCisgICAgcC0+dGgudGhfbmV4dF9mcmVlID0gcXVldWUtPnRxX2ZyZWVfdGh1bmtzOworICAgIHF1ZXVlLT50cV9mcmVlX3RodW5rcyA9IHA7CisKKyNpZmRlZiBLTVBfREVCVUcKKyAgICBwLT50aF9mbGFncyA9IFRRRl9ERUFMTE9DQVRFRDsKKyNlbmRpZgorCisgICAgaWYgKGluX3BhcmFsbGVsKQorICAgICAgICBfX2ttcF9yZWxlYXNlX2xvY2soJiBxdWV1ZS0+dHFfZnJlZV90aHVua3NfbGNrLCBnbG9iYWxfdGlkKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qICByZXR1cm5zIG5vbnplcm8gaWYgdGhlIHF1ZXVlIGp1c3QgYmVjYW1lIGZ1bGwgYWZ0ZXIgdGhlIGVucXVldWUgICovCisKK3N0YXRpYyBrbXBfaW50MzIKK19fa21wX2VucXVldWVfdGFzayAoIGttcF90YXNrcV90ICp0cSwga21wX2ludDMyIGdsb2JhbF90aWQsIGttcGNfdGFza19xdWV1ZV90ICpxdWV1ZSwga21wY190aHVua190ICp0aHVuaywgaW50IGluX3BhcmFsbGVsICkKK3sKKyAgICBrbXBfaW50MzIgICAgcmV0OworCisgICAgLyogIGRrcDogY2FuIHdlIGdldCBhcm91bmQgdGhlIGxvY2sgaW4gdGhlIFRRRl9SRUxFQVNFX1dPUktFUlMgY2FzZSAob25seSB0aGUgbWFzdGVyIGlzIGV4ZWN1dGluZyB0aGVuKSAgKi8KKyAgICBpZiAoaW5fcGFyYWxsZWwpIHsKKyAgICAgICAgX19rbXBfYWNxdWlyZV9sb2NrKCYgcXVldWUtPnRxX3F1ZXVlX2xjaywgZ2xvYmFsX3RpZCk7CisKKyAgICAgICAgS01QX01CKCk7ICAvKiBtYWtlIHN1cmUgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBpbiBjb25zaXN0ZW50IHN0YXRlIGJlZm9yZSBxdWVyeWluZyB0aGVtICovCisgICAgICAgICAgICAgICAgICAgLyogU2VlbXMgdG8gd29yayBmaW5lIHdpdGhvdXQgdGhpcyBjYWxsIGZvciBkaWdpdGFsL2FscGhhLCBuZWVkZWQgZm9yIElCTS9SUzYwMDAgKi8KKyAgICB9CisKKyAgICBLTVBfREVCVUdfQVNTRVJUIChxdWV1ZS0+dHFfbmZ1bGwgPCBxdWV1ZS0+dHFfbnNsb3RzKTsgIC8qICBjaGVjayBxdWV1ZSBub3QgZnVsbCAgKi8KKworICAgIHF1ZXVlLT50cV9xdWV1ZVsocXVldWUtPnRxX2hlYWQpKytdLnFzX3RodW5rID0gdGh1bms7CisKKyAgICBpZiAocXVldWUtPnRxX2hlYWQgPj0gcXVldWUtPnRxX25zbG90cykKKyAgICAgICAgcXVldWUtPnRxX2hlYWQgPSAwOworCisgICAgKHF1ZXVlLT50cV9uZnVsbCkrKzsKKworICAgIEtNUF9NQigpOyAgIC8qIHRvIGFzc3VyZSB0aGF0IG5mdWxsIGlzIHNlZW4gdG8gaW5jcmVhc2UgYmVmb3JlIFRRRl9BTExfVEFTS1NfUVVFVUVEIGlzIHNldCAqLworCisgICAgcmV0ID0gKGluX3BhcmFsbGVsKSA/IChxdWV1ZS0+dHFfbmZ1bGwgPT0gcXVldWUtPnRxX25zbG90cykgOiBGQUxTRTsKKworICAgIGlmIChpbl9wYXJhbGxlbCkgeworICAgICAgICAvKiBkb24ndCBuZWVkIHRvIHdhaXQgdW50aWwgd29ya2VycyBhcmUgcmVsZWFzZWQgYmVmb3JlIHVubG9ja2luZyAqLworICAgICAgICBfX2ttcF9yZWxlYXNlX2xvY2soJiBxdWV1ZS0+dHFfcXVldWVfbGNrLCBnbG9iYWxfdGlkKTsKKworICAgICAgICBpZiggdHEtPnRxX2dsb2JhbF9mbGFncyAmIFRRRl9SRUxFQVNFX1dPUktFUlMgKSB7CisgICAgICAgICAgICAvKiBJZiBqdXN0IGNyZWF0aW5nIHRoZSByb290IHF1ZXVlLCB0aGUgd29ya2VyIHRocmVhZHMgYXJlIHdhaXRpbmcgYXQgKi8KKyAgICAgICAgICAgIC8qIGEgam9pbiBiYXJyaWVyIHVudGlsIG5vdywgd2hlbiB0aGVyZSdzIHNvbWV0aGluZyBpbiB0aGUgcXVldWUgZm9yICAqLworICAgICAgICAgICAgLyogdGhlbSB0byBkbzsgcmVsZWFzZSB0aGVtIG5vdyB0byBkbyB3b3JrLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAvKiBUaGlzIHNob3VsZCBvbmx5IGJlIGRvbmUgd2hlbiB0aGlzIGlzIHRoZSBmaXJzdCB0YXNrIGVucXVldWVkLCAgICAgKi8KKyAgICAgICAgICAgIC8qIHNvIHJlc2V0IHRoZSBmbGFnIGhlcmUgYWxzby4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgICAgICAgICB0cS0+dHFfZ2xvYmFsX2ZsYWdzICY9IH5UUUZfUkVMRUFTRV9XT1JLRVJTOyAgLyogbm8gbG9jayBuZWVkZWQsIHdvcmtlcnMgYXJlIHN0aWxsIGluIHNwaW4gbW9kZSAqLworCisgICAgICAgICAgICBLTVBfTUIoKTsgICAvKiBhdm9pZCByZWxlYXNpbmcgYmFycmllciB0d2ljZSBpZiB0YXNrcV90YXNrIHN3aXRjaGVzIHRocmVhZHMgKi8KKworICAgICAgICAgICAgX19rbXBjX2VuZF9iYXJyaWVyX21hc3RlciggTlVMTCwgZ2xvYmFsX3RpZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMga21wY190aHVua190ICoKK19fa21wX2RlcXVldWVfdGFzayAoa21wX2ludDMyIGdsb2JhbF90aWQsIGttcGNfdGFza19xdWV1ZV90ICpxdWV1ZSwgaW50IGluX3BhcmFsbGVsKQoreworICAgIGttcGNfdGh1bmtfdCAqcHQ7CisgICAgaW50ICAgICAgICAgICB0aWQgPSBfX2ttcF90aWRfZnJvbV9ndGlkKCBnbG9iYWxfdGlkICk7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUIChxdWV1ZS0+dHFfbmZ1bGwgPiAwKTsgIC8qICBjaGVjayBxdWV1ZSBub3QgZW1wdHkgICovCisKKyAgICBpZiAocXVldWUtPnRxLnRxX3BhcmVudCAhPSBOVUxMICYmIGluX3BhcmFsbGVsKSB7CisgICAgICAgIGludCBjdDsKKyAgICAgICAgX19rbXBfYWNxdWlyZV9sb2NrKCYgcXVldWUtPnRxLnRxX3BhcmVudC0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworICAgICAgICBjdCA9ICsrKHF1ZXVlLT50cV9yZWZfY291bnQpOworICAgICAgICBfX2ttcF9yZWxlYXNlX2xvY2soJiBxdWV1ZS0+dHEudHFfcGFyZW50LT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisgICAgICAgIEtNUF9ERUJVR19SRUZfQ1RTKCgibGluZSAlZCBndGlkICVkOiBRICVwIGluYyAlZFxuIiwKKyAgICAgICAgICBfX0xJTkVfXywgZ2xvYmFsX3RpZCwgcXVldWUsIGN0KSk7CisgICAgfQorCisgICAgcHQgPSBxdWV1ZS0+dHFfcXVldWVbKHF1ZXVlLT50cV90YWlsKSsrXS5xc190aHVuazsKKworICAgIGlmIChxdWV1ZS0+dHFfdGFpbCA+PSBxdWV1ZS0+dHFfbnNsb3RzKQorICAgICAgICBxdWV1ZS0+dHFfdGFpbCA9IDA7CisKKyAgICBpZiAoaW5fcGFyYWxsZWwpIHsKKyAgICAgICAgcXVldWUtPnRxX3RoX3RodW5rc1t0aWRdLmFpX2RhdGErKzsKKworICAgICAgICBLTVBfTUIoKTsgLyogbmVjZXNzYXJ5IHNvIGFpX2RhdGEgaW5jcmVtZW50IGlzIHByb3BhZ2F0ZWQgdG8gb3RoZXIgdGhyZWFkcyBpbW1lZGlhdGVseSAoZGlnaXRhbCkgKi8KKworICAgICAgICBLRl9UUkFDRSgyMDAsICgiX19rbXBfZGVxdWV1ZV90YXNrOiBUIyVkKDolZCkgbm93IGhhcyAlZCBvdXRzdGFuZGluZyB0aHVua3MgZnJvbSBxdWV1ZSAlcFxuIiwKKyAgICAgICAgICAgIGdsb2JhbF90aWQsIHRpZCwgcXVldWUtPnRxX3RoX3RodW5rc1t0aWRdLmFpX2RhdGEsIHF1ZXVlKSk7CisgICAgfQorCisgICAgKHF1ZXVlLT50cV9uZnVsbCktLTsKKworI2lmZGVmIEtNUF9ERUJVRworICAgIEtNUF9NQigpOworCisgICAgLyogbmVjZXNzYXJ5IHNvIChxdWV1ZS0+dHFfbmZ1bGwgPiAwKSBhYm92ZSBzdWNjZWVkcyBhZnRlciB0cV9uZnVsbCBpcyBkZWNyZW1lbnRlZCAqLworCisgICAgS01QX0RFQlVHX0FTU0VSVChxdWV1ZS0+dHFfbmZ1bGwgPj0gMCk7CisKKyAgICBpZiAoaW5fcGFyYWxsZWwpIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVChxdWV1ZS0+dHFfdGhfdGh1bmtzW3RpZF0uYWlfZGF0YSA8PSBfX0tNUF9UQVNLUV9USFVOS1NfUEVSX1RIKTsKKyAgICB9CisjZW5kaWYKKworICAgIHJldHVybiBwdDsKK30KKworLyoKKyAqIEZpbmQgdGhlIG5leHQgKG5vbi1udWxsKSB0YXNrIHRvIGRlcXVldWUgYW5kIHJldHVybiBpdC4KKyAqIFRoaXMgaXMgbmV2ZXIgY2FsbGVkIHVubGVzcyBpbl9wYXJhbGxlbD1UUlVFCisgKgorICogSGVyZSBhcmUgdGhlIHJ1bGVzIGZvciBkZWNpZGluZyB3aGljaCBxdWV1ZSB0byB0YWtlIHRoZSB0YXNrIGZyb206CisgKiAxLiAgV2FsayB1cCB0aGUgdGFzayBxdWV1ZSB0cmVlIGZyb20gdGhlIGN1cnJlbnQgcXVldWUncyBwYXJlbnQgYW5kIGxvb2sKKyAqICAgICAgb24gdGhlIHdheSB1cCAoZm9yIGxvb3AsIGJlbG93KS4KKyAqIDIuICBEbyBhIGRlcHRoLWZpcnN0IHNlYXJjaCBiYWNrIGRvd24gdGhlIHRyZWUgZnJvbSB0aGUgcm9vdCBhbmQKKyAqICAgICAgbG9vayAoZmluZF90YXNrX2luX2Rlc2NlbmRhbnRfcXVldWUoKSkuCisgKgorICogSGVyZSBhcmUgdGhlIHJ1bGVzIGZvciBkZWNpZGluZyB3aGljaCB0YXNrIHRvIHRha2UgZnJvbSBhIHF1ZXVlCisgKiAoX19rbXBfZmluZF90YXNrX2luX3F1ZXVlICgpKToKKyAqIDEuICBOZXZlciB0YWtlIHRoZSBsYXN0IHRhc2sgZnJvbSBhIHF1ZXVlIGlmIFRRRl9JU19MQVNUUFJJVkFURTsgdGhpcyB0YXNrCisgKiAgICAgbXVzdCBiZSBzdGFnZWQgdG8gbWFrZSBzdXJlIHdlIGV4ZWN1dGUgdGhlIGxhc3Qgb25lIHdpdGgKKyAqICAgICBUUUZfSVNfTEFTVF9UQVNLIGF0IHRoZSBlbmQgb2YgdGFzayBxdWV1ZSBleGVjdXRpb24uCisgKiAyLiAgSWYgdGhlIHF1ZXVlIGxlbmd0aCBpcyBiZWxvdyBzb21lIGhpZ2ggd2F0ZXIgbWFyayBhbmQgdGhlIHRhc2txIHRhc2sKKyAqICAgICBpcyBlbnF1ZXVlZCwgcHJlZmVyIHJ1bm5pbmcgdGhlIHRhc2txIHRhc2suCisgKiAzLiAgT3RoZXJ3aXNlLCB0YWtlIGEgKG5vcm1hbCkgdGFzayBmcm9tIHRoZSBxdWV1ZS4KKyAqCisgKiBJZiB3ZSBkbyBhbGwgdGhpcyBhbmQgcmV0dXJuIHB0ID09IE5VTEwgYXQgdGhlIGJvdHRvbSBvZiB0aGlzIHJvdXRpbmUsCisgKiB0aGlzIG1lYW5zIHRoZXJlIGFyZSBubyBtb3JlIHRhc2tzIHRvIGV4ZWN1dGUgKGV4Y2VwdCBwb3NzaWJseSBmb3IKKyAqIFRRRl9JU19MQVNUUFJJVkFURSkuCisgKi8KKworc3RhdGljIGttcGNfdGh1bmtfdCAqCitfX2ttcF9maW5kX3Rhc2tfaW5fcXVldWUgKGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBjX3Rhc2tfcXVldWVfdCAqcXVldWUpCit7CisgICAga21wY190aHVua190ICpwdCAgPSBOVUxMOworICAgIGludCAgICAgICAgICAgdGlkID0gX19rbXBfdGlkX2Zyb21fZ3RpZCggZ2xvYmFsX3RpZCApOworCisgICAgLyogVG8gcHJldmVudCBkZWFkbG9jayBmcm9tIHRxX3F1ZXVlX2xjayBpZiBxdWV1ZSBhbHJlYWR5IGRlYWxsb2NhdGVkICovCisgICAgaWYgKCAhKHF1ZXVlLT50cV9mbGFncyAmIFRRRl9ERUFMTE9DQVRFRCkgKSB7CisKKyAgICAgICAgX19rbXBfYWNxdWlyZV9sb2NrKCYgcXVldWUtPnRxX3F1ZXVlX2xjaywgZ2xvYmFsX3RpZCk7CisKKyAgICAgICAgLyogQ2hlY2sgYWdhaW4gdG8gYXZvaWQgcmFjZSBpbiBfX2ttcGNfZW5kX3Rhc2txKCkgKi8KKyAgICAgICAgaWYgKCAhKHF1ZXVlLT50cV9mbGFncyAmIFRRRl9ERUFMTE9DQVRFRCkgKSB7CisKKyAgICAgICAgICAgIEtNUF9NQigpOyAgLyogbWFrZSBzdXJlIGRhdGEgc3RydWN0dXJlcyBhcmUgaW4gY29uc2lzdGVudCBzdGF0ZSBiZWZvcmUgcXVlcnlpbmcgdGhlbSAqLworICAgICAgICAgICAgICAgICAgICAgICAvKiBTZWVtcyB0byB3b3JrIGZpbmUgd2l0aG91dCB0aGlzIGNhbGwgZm9yIGRpZ2l0YWwvYWxwaGEsIG5lZWRlZCBmb3IgSUJNL1JTNjAwMCAqLworCisgICAgICAgICAgICBpZiAoKHF1ZXVlLT50cV90YXNrcV9zbG90ICE9IE5VTEwpICYmIChxdWV1ZS0+dHFfbmZ1bGwgPD0gcXVldWUtPnRxX2hpd2F0KSkgeworICAgICAgICAgICAgICAgIC8qIGlmIHRoZXJlJ3MgZW5vdWdoIHJvb20gaW4gdGhlIHF1ZXVlIGFuZCB0aGUgZGlzcGF0Y2hlciAqLworICAgICAgICAgICAgICAgIC8qICh0YXNrcSB0YXNrKSBpcyBhdmFpbGFibGUsIHNjaGVkdWxlIG1vcmUgdGFza3MgICAgICAgICAqLworICAgICAgICAgICAgICAgIHB0ID0gKGttcGNfdGh1bmtfdCAqKSBxdWV1ZS0+dHFfdGFza3Ffc2xvdDsKKyAgICAgICAgICAgICAgICBxdWV1ZS0+dHFfdGFza3Ffc2xvdCA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChxdWV1ZS0+dHFfbmZ1bGwgPT0gMCB8fAorICAgICAgICAgICAgICAgICAgICAgcXVldWUtPnRxX3RoX3RodW5rc1t0aWRdLmFpX2RhdGEgPj0gX19LTVBfVEFTS1FfVEhVTktTX1BFUl9USCkgeworICAgICAgICAgICAgICAgIC8qIGRvIG5vdGhpbmcgaWYgbm8gdGh1bmtzIGF2YWlsYWJsZSBvciB0aGlzIHRocmVhZCBjYW4ndCAqLworICAgICAgICAgICAgICAgIC8qIHJ1biBhbnkgYmVjYXVzZSBpdCBhbHJlYWR5IGlzIGV4ZWN1dGluZyB0b28gbWFueSAgICAgICAqLworCisgICAgICAgICAgICAgICAgcHQgPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAocXVldWUtPnRxX25mdWxsID4gMSkgeworICAgICAgICAgICAgICAgIC8qICBhbHdheXMgc2FmZSB0byBzY2hlZHVsZSBhIHRhc2sgZXZlbiBpZiBUUUZfSVNfTEFTVFBSSVZBVEUgICovCisKKyAgICAgICAgICAgICAgICBwdCA9IF9fa21wX2RlcXVldWVfdGFzayAoZ2xvYmFsX3RpZCwgcXVldWUsIFRSVUUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIShxdWV1ZS0+dHFfZmxhZ3MgJiBUUUZfSVNfTEFTVFBSSVZBVEUpKSB7CisgICAgICAgICAgICAgICAgLyogIG9uZSB0aGluZyBpbiBxdWV1ZSwgYWx3YXlzIHNhZmUgdG8gc2NoZWR1bGUgaWYgIVRRRl9JU19MQVNUUFJJVkFURSAgKi8KKworICAgICAgICAgICAgICAgIHB0ID0gX19rbXBfZGVxdWV1ZV90YXNrIChnbG9iYWxfdGlkLCBxdWV1ZSwgVFJVRSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChxdWV1ZS0+dHFfZmxhZ3MgJiBUUUZfSVNfTEFTVF9UQVNLKSB7CisgICAgICAgICAgICAgICAgLyogVFFGX0lTX0xBU1RQUklWQVRFLCBvbmUgdGhpbmcgaW4gcXVldWUsIGttcGNfZW5kX3Rhc2txX3Rhc2soKSAgICovCisgICAgICAgICAgICAgICAgLyogaGFzIGJlZW4gcnVuIHNvIHRoaXMgaXMgbGFzdCB0YXNrLCBydW4gd2l0aCBUUUZfSVNfTEFTVF9UQVNLIHNvICovCisgICAgICAgICAgICAgICAgLyogaW5zdHJ1bWVudGF0aW9uIGRvZXMgY29weS1vdXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgICAgICBwdCA9IF9fa21wX2RlcXVldWVfdGFzayAoZ2xvYmFsX3RpZCwgcXVldWUsIFRSVUUpOworICAgICAgICAgICAgICAgIHB0LT50aF9mbGFncyB8PSBUUUZfSVNfTEFTVF9UQVNLOyAgLyogZG9uJ3QgbmVlZCB0ZXN0X3RoZW5fb3Igc2luY2UgYWxyZWFkeSBsb2NrZWQgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIEdFSCAtIFdoYXQgaGFwcGVucyBoZXJlIGlmIGlzIGxhc3Rwcml2YXRlLCBidXQgbm90IGxhc3QgdGFzaz8gKi8KKyAgICAgICAgX19rbXBfcmVsZWFzZV9sb2NrKCYgcXVldWUtPnRxX3F1ZXVlX2xjaywgZ2xvYmFsX3RpZCk7CisgICAgfQorCisgICAgcmV0dXJuIHB0OworfQorCisvKgorICogV2FsayBhIHRyZWUgb2YgcXVldWVzIHN0YXJ0aW5nIGF0IHF1ZXVlJ3MgZmlyc3QgY2hpbGQKKyAqIGFuZCByZXR1cm4gYSBub24tTlVMTCB0aHVuayBpZiBvbmUgY2FuIGJlIHNjaGVkdWxlZC4KKyAqIE11c3Qgb25seSBiZSBjYWxsZWQgd2hlbiBpbl9wYXJhbGxlbD1UUlVFCisgKi8KKworc3RhdGljIGttcGNfdGh1bmtfdCAqCitfX2ttcF9maW5kX3Rhc2tfaW5fZGVzY2VuZGFudF9xdWV1ZSAoa21wX2ludDMyIGdsb2JhbF90aWQsIGttcGNfdGFza19xdWV1ZV90ICpjdXJyX3F1ZXVlKQoreworICAgIGttcGNfdGh1bmtfdCAqcHQgPSBOVUxMOworICAgIGttcGNfdGFza19xdWV1ZV90ICpxdWV1ZSA9IGN1cnJfcXVldWU7CisKKyAgICBpZiAoY3Vycl9xdWV1ZS0+dHFfZmlyc3RfY2hpbGQgIT0gTlVMTCkgeworICAgICAgICBfX2ttcF9hY3F1aXJlX2xvY2soJiBjdXJyX3F1ZXVlLT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisKKyAgICAgICAgS01QX01CKCk7ICAvKiBtYWtlIHN1cmUgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBpbiBjb25zaXN0ZW50IHN0YXRlIGJlZm9yZSBxdWVyeWluZyB0aGVtICovCisgICAgICAgICAgICAgICAgICAgLyogU2VlbXMgdG8gd29yayBmaW5lIHdpdGhvdXQgdGhpcyBjYWxsIGZvciBkaWdpdGFsL2FscGhhLCBuZWVkZWQgZm9yIElCTS9SUzYwMDAgKi8KKworICAgICAgICBxdWV1ZSA9IChrbXBjX3Rhc2tfcXVldWVfdCAqKSBjdXJyX3F1ZXVlLT50cV9maXJzdF9jaGlsZDsKKyAgICAgICAgaWYgKHF1ZXVlID09IE5VTEwpIHsKKyAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfbG9jaygmIGN1cnJfcXVldWUtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgd2hpbGUgKHF1ZXVlICE9IE5VTEwpICB7CisgICAgICAgICAgICBpbnQgY3Q7CisgICAgICAgICAgICBrbXBjX3Rhc2tfcXVldWVfdCAqbmV4dDsKKworICAgICAgICAgICAgY3Q9ICsrKHF1ZXVlLT50cV9yZWZfY291bnQpOworICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9sb2NrKCYgY3Vycl9xdWV1ZS0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworICAgICAgICAgICAgS01QX0RFQlVHX1JFRl9DVFMoKCJsaW5lICVkIGd0aWQgJWQ6IFEgJXAgaW5jICVkXG4iLAorICAgICAgICAgICAgICBfX0xJTkVfXywgZ2xvYmFsX3RpZCwgcXVldWUsIGN0KSk7CisKKyAgICAgICAgICAgIHB0ID0gX19rbXBfZmluZF90YXNrX2luX3F1ZXVlIChnbG9iYWxfdGlkLCBxdWV1ZSk7CisKKyAgICAgICAgICAgIGlmIChwdCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaW50IGN0OworCisgICAgICAgICAgICAgICAgX19rbXBfYWNxdWlyZV9sb2NrKCYgY3Vycl9xdWV1ZS0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworCisgICAgICAgICAgICAgICAgS01QX01CKCk7ICAvKiBtYWtlIHN1cmUgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBpbiBjb25zaXN0ZW50IHN0YXRlIGJlZm9yZSBxdWVyeWluZyB0aGVtICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTZWVtcyB0byB3b3JrIGZpbmUgd2l0aG91dCB0aGlzIGNhbGwgZm9yIGRpZ2l0YWwvYWxwaGEsIG5lZWRlZCBmb3IgSUJNL1JTNjAwMCAqLworCisgICAgICAgICAgICAgICAgY3QgPSAtLShxdWV1ZS0+dHFfcmVmX2NvdW50KTsKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfUkVGX0NUUygoImxpbmUgJWQgZ3RpZCAlZDogUSAlcCBkZWMgJWRcbiIsCisgICAgICAgICAgICAgICAgICBfX0xJTkVfXywgZ2xvYmFsX3RpZCwgcXVldWUsIGN0KSk7CisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggcXVldWUtPnRxX3JlZl9jb3VudCA+PSAwICk7CisKKyAgICAgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX2xvY2soJiBjdXJyX3F1ZXVlLT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gcHQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGFsdGhvdWdoIHJlZmVyZW5jZSBjb3VudCBzdGF5cyBhY3RpdmUgZHVyaW5nIGRlc2NlbmRhbnQgd2Fsaywgc2hvdWxkbid0IG1hdHRlciAgKi8KKyAgICAgICAgICAgIC8qIHNpbmNlIGlmIGNoaWxkcmVuIHN0aWxsIGV4aXN0LCByZWZlcmVuY2UgY291bnRzIGFyZW4ndCBiZWluZyBtb25pdG9yZWQgYW55d2F5ICAgKi8KKworICAgICAgICAgICAgcHQgPSBfX2ttcF9maW5kX3Rhc2tfaW5fZGVzY2VuZGFudF9xdWV1ZSAoZ2xvYmFsX3RpZCwgcXVldWUpOworCisgICAgICAgICAgICBpZiAocHQgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGludCBjdDsKKworICAgICAgICAgICAgICAgIF9fa21wX2FjcXVpcmVfbG9jaygmIGN1cnJfcXVldWUtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKworICAgICAgICAgICAgICAgIEtNUF9NQigpOyAgLyogbWFrZSBzdXJlIGRhdGEgc3RydWN0dXJlcyBhcmUgaW4gY29uc2lzdGVudCBzdGF0ZSBiZWZvcmUgcXVlcnlpbmcgdGhlbSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2VlbXMgdG8gd29yayBmaW5lIHdpdGhvdXQgdGhpcyBjYWxsIGZvciBkaWdpdGFsL2FscGhhLCBuZWVkZWQgZm9yIElCTS9SUzYwMDAgKi8KKworICAgICAgICAgICAgICAgIGN0ID0gLS0ocXVldWUtPnRxX3JlZl9jb3VudCk7CisgICAgICAgICAgICAgICAgS01QX0RFQlVHX1JFRl9DVFMoKCJsaW5lICVkIGd0aWQgJWQ6IFEgJXAgZGVjICVkXG4iLAorICAgICAgICAgICAgICAgICAgX19MSU5FX18sIGdsb2JhbF90aWQsIHF1ZXVlLCBjdCkpOworICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGN0ID49IDAgKTsKKworICAgICAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfbG9jaygmIGN1cnJfcXVldWUtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKworICAgICAgICAgICAgICAgIHJldHVybiBwdDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgX19rbXBfYWNxdWlyZV9sb2NrKCYgY3Vycl9xdWV1ZS0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworCisgICAgICAgICAgICBLTVBfTUIoKTsgIC8qIG1ha2Ugc3VyZSBkYXRhIHN0cnVjdHVyZXMgYXJlIGluIGNvbnNpc3RlbnQgc3RhdGUgYmVmb3JlIHF1ZXJ5aW5nIHRoZW0gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgLyogU2VlbXMgdG8gd29yayBmaW5lIHdpdGhvdXQgdGhpcyBjYWxsIGZvciBkaWdpdGFsL2FscGhhLCBuZWVkZWQgZm9yIElCTS9SUzYwMDAgKi8KKworICAgICAgICAgICAgbmV4dCA9IHF1ZXVlLT50cV9uZXh0X2NoaWxkOworCisgICAgICAgICAgICBjdCA9IC0tKHF1ZXVlLT50cV9yZWZfY291bnQpOworICAgICAgICAgICAgS01QX0RFQlVHX1JFRl9DVFMoKCJsaW5lICVkIGd0aWQgJWQ6IFEgJXAgZGVjICVkXG4iLAorICAgICAgICAgICAgICBfX0xJTkVfXywgZ2xvYmFsX3RpZCwgcXVldWUsIGN0KSk7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBjdCA+PSAwICk7CisKKyAgICAgICAgICAgIHF1ZXVlID0gbmV4dDsKKyAgICAgICAgfQorCisgICAgICAgIF9fa21wX3JlbGVhc2VfbG9jaygmIGN1cnJfcXVldWUtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKyAgICB9CisKKyAgICByZXR1cm4gcHQ7Cit9CisKKy8qCisgKiBXYWxrIHVwIHRoZSB0YXNrcSB0cmVlIGxvb2tpbmcgZm9yIGEgdGFzayB0byBleGVjdXRlLgorICogSWYgd2UgZ2V0IHRvIHRoZSByb290LCBzZWFyY2ggdGhlIHRyZWUgZm9yIGEgZGVzY2VuZGVudCBxdWV1ZSB0YXNrLgorICogTXVzdCBvbmx5IGJlIGNhbGxlZCB3aGVuIGluX3BhcmFsbGVsPVRSVUUKKyAqLworCitzdGF0aWMga21wY190aHVua190ICoKK19fa21wX2ZpbmRfdGFza19pbl9hbmNlc3Rvcl9xdWV1ZSAoa21wX3Rhc2txX3QgKnRxLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wY190YXNrX3F1ZXVlX3QgKmN1cnJfcXVldWUpCit7CisgICAga21wY190YXNrX3F1ZXVlX3QgKnF1ZXVlOworICAgIGttcGNfdGh1bmtfdCAgICAgICpwdDsKKworICAgIHB0ID0gTlVMTDsKKworICAgIGlmIChjdXJyX3F1ZXVlLT50cS50cV9wYXJlbnQgIT0gTlVMTCkgeworICAgICAgICBxdWV1ZSA9IGN1cnJfcXVldWUtPnRxLnRxX3BhcmVudDsKKworICAgICAgICB3aGlsZSAocXVldWUgIT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKHF1ZXVlLT50cS50cV9wYXJlbnQgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGludCBjdDsKKyAgICAgICAgICAgICAgICBfX2ttcF9hY3F1aXJlX2xvY2soJiBxdWV1ZS0+dHEudHFfcGFyZW50LT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisKKyAgICAgICAgICAgICAgICBLTVBfTUIoKTsgIC8qIG1ha2Ugc3VyZSBkYXRhIHN0cnVjdHVyZXMgYXJlIGluIGNvbnNpc3RlbnQgc3RhdGUgYmVmb3JlIHF1ZXJ5aW5nIHRoZW0gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNlZW1zIHRvIHdvcmsgZmluZSB3aXRob3V0IHRoaXMgY2FsbCBmb3IgZGlnaXRhbC9hbHBoYSwgbmVlZGVkIGZvciBJQk0vUlM2MDAwICovCisKKyAgICAgICAgICAgICAgICBjdCA9ICsrKHF1ZXVlLT50cV9yZWZfY291bnQpOworICAgICAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfbG9jaygmIHF1ZXVlLT50cS50cV9wYXJlbnQtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfUkVGX0NUUygoImxpbmUgJWQgZ3RpZCAlZDogUSAlcCBpbmMgJWRcbiIsCisgICAgICAgICAgICAgICAgICBfX0xJTkVfXywgZ2xvYmFsX3RpZCwgcXVldWUsIGN0KSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB0ID0gX19rbXBfZmluZF90YXNrX2luX3F1ZXVlIChnbG9iYWxfdGlkLCBxdWV1ZSk7CisgICAgICAgICAgICBpZiAocHQgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGlmIChxdWV1ZS0+dHEudHFfcGFyZW50ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGN0OworICAgICAgICAgICAgICAgICAgICBfX2ttcF9hY3F1aXJlX2xvY2soJiBxdWV1ZS0+dHEudHFfcGFyZW50LT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisKKyAgICAgICAgICAgICAgICAgICAgS01QX01CKCk7ICAvKiBtYWtlIHN1cmUgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBpbiBjb25zaXN0ZW50IHN0YXRlIGJlZm9yZSBxdWVyeWluZyB0aGVtICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTZWVtcyB0byB3b3JrIHdpdGhvdXQgdGhpcyBjYWxsIGZvciBkaWdpdGFsL2FscGhhLCBuZWVkZWQgZm9yIElCTS9SUzYwMDAgKi8KKworICAgICAgICAgICAgICAgICAgICBjdCA9IC0tKHF1ZXVlLT50cV9yZWZfY291bnQpOworICAgICAgICAgICAgICAgICAgICBLTVBfREVCVUdfUkVGX0NUUygoImxpbmUgJWQgZ3RpZCAlZDogUSAlcCBkZWMgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgX19MSU5FX18sIGdsb2JhbF90aWQsIHF1ZXVlLCBjdCkpOworICAgICAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBjdCA+PSAwICk7CisKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9sb2NrKCYgcXVldWUtPnRxLnRxX3BhcmVudC0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBwdDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHF1ZXVlLT50cS50cV9wYXJlbnQgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGludCBjdDsKKyAgICAgICAgICAgICAgICBfX2ttcF9hY3F1aXJlX2xvY2soJiBxdWV1ZS0+dHEudHFfcGFyZW50LT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisKKyAgICAgICAgICAgICAgICBLTVBfTUIoKTsgIC8qIG1ha2Ugc3VyZSBkYXRhIHN0cnVjdHVyZXMgYXJlIGluIGNvbnNpc3RlbnQgc3RhdGUgYmVmb3JlIHF1ZXJ5aW5nIHRoZW0gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNlZW1zIHRvIHdvcmsgZmluZSB3aXRob3V0IHRoaXMgY2FsbCBmb3IgZGlnaXRhbC9hbHBoYSwgbmVlZGVkIGZvciBJQk0vUlM2MDAwICovCisKKyAgICAgICAgICAgICAgICBjdCA9IC0tKHF1ZXVlLT50cV9yZWZfY291bnQpOworICAgICAgICAgICAgICAgIEtNUF9ERUJVR19SRUZfQ1RTKCgibGluZSAlZCBndGlkICVkOiBRICVwIGRlYyAlZFxuIiwKKyAgICAgICAgICAgICAgICAgIF9fTElORV9fLCBnbG9iYWxfdGlkLCBxdWV1ZSwgY3QpKTsKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBjdCA+PSAwICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBxdWV1ZSA9IHF1ZXVlLT50cS50cV9wYXJlbnQ7CisKKyAgICAgICAgICAgIGlmIChxdWV1ZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfbG9jaygmIHF1ZXVlLT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIHB0ID0gX19rbXBfZmluZF90YXNrX2luX2Rlc2NlbmRhbnRfcXVldWUoIGdsb2JhbF90aWQsIHRxLT50cV9yb290ICk7CisKKyAgICByZXR1cm4gcHQ7Cit9CisKK3N0YXRpYyBpbnQKK19fa21wX3Rhc2txX3Rhc2tzX2ZpbmlzaGVkIChrbXBjX3Rhc2tfcXVldWVfdCAqcXVldWUpCit7CisgICAgaW50IGk7CisKKyAgICAvKiBLTVBfTUIoKTsgKi8vKiBpcyB0aGlzIHJlYWxseSBuZWNlc3Nhcnk/ICovCisKKyAgICBmb3IgKGk9MDsgaTxxdWV1ZS0+dHFfbnByb2M7IGkrKykgeworICAgICAgICBpZiAocXVldWUtPnRxX3RoX3RodW5rc1tpXS5haV9kYXRhICE9IDApCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBpbnQKK19fa21wX3Rhc2txX2hhc19hbnlfY2hpbGRyZW4gKGttcGNfdGFza19xdWV1ZV90ICpxdWV1ZSkKK3sKKyAgICByZXR1cm4gKHF1ZXVlLT50cV9maXJzdF9jaGlsZCAhPSBOVUxMKTsKK30KKworc3RhdGljIHZvaWQKK19fa21wX3JlbW92ZV9xdWV1ZV9mcm9tX3RyZWUoIGttcF90YXNrcV90ICp0cSwga21wX2ludDMyIGdsb2JhbF90aWQsIGttcGNfdGFza19xdWV1ZV90ICpxdWV1ZSwgaW50IGluX3BhcmFsbGVsICkKK3sKKyNpZmRlZiBLTVBfREVCVUcKKyAgICBrbXBfaW50MzIgICAgIGk7CisgICAga21wY190aHVua190ICp0aHVuazsKKyNlbmRpZgorCisgICAgS0ZfVFJBQ0UoNTAsICgiQmVmb3JlIERlbGV0aW9uIG9mIFRhc2tRIGF0ICVwIG9uICglZCk6XG4iLCBxdWV1ZSwgZ2xvYmFsX3RpZCkpOworICAgIEtGX0RVTVAoNTAsIF9fa21wX2R1bXBfdGFza19xdWV1ZSggdHEsIHF1ZXVlLCBnbG9iYWxfdGlkICkpOworCisgICAgLyogIHN1Yi1xdWV1ZSBpbiBhIHJlY3Vyc2lvbiwgbm90IHRoZSByb290IHRhc2sgcXVldWUgICovCisgICAgS01QX0RFQlVHX0FTU0VSVCAocXVldWUtPnRxLnRxX3BhcmVudCAhPSBOVUxMKTsKKworICAgIGlmIChpbl9wYXJhbGxlbCkgeworICAgICAgICBfX2ttcF9hY3F1aXJlX2xvY2soJiBxdWV1ZS0+dHEudHFfcGFyZW50LT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisKKyAgICAgICAgS01QX01CKCk7ICAvKiBtYWtlIHN1cmUgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBpbiBjb25zaXN0ZW50IHN0YXRlIGJlZm9yZSBxdWVyeWluZyB0aGVtICovCisgICAgICAgICAgICAgICAgICAgLyogU2VlbXMgdG8gd29yayBmaW5lIHdpdGhvdXQgdGhpcyBjYWxsIGZvciBkaWdpdGFsL2FscGhhLCBuZWVkZWQgZm9yIElCTS9SUzYwMDAgKi8KKyAgICB9CisKKyAgICBLTVBfREVCVUdfQVNTRVJUIChxdWV1ZS0+dHFfZmlyc3RfY2hpbGQgPT0gTlVMTCk7CisKKyAgICAvKiAgdW5saW5rIHF1ZXVlIGZyb20gaXRzIHNpYmxpbmdzIGlmIGFueSBhdCB0aGlzIGxldmVsICAqLworICAgIGlmIChxdWV1ZS0+dHFfcHJldl9jaGlsZCAhPSBOVUxMKQorICAgICAgICBxdWV1ZS0+dHFfcHJldl9jaGlsZC0+dHFfbmV4dF9jaGlsZCA9IHF1ZXVlLT50cV9uZXh0X2NoaWxkOworICAgIGlmIChxdWV1ZS0+dHFfbmV4dF9jaGlsZCAhPSBOVUxMKQorICAgICAgICBxdWV1ZS0+dHFfbmV4dF9jaGlsZC0+dHFfcHJldl9jaGlsZCA9IHF1ZXVlLT50cV9wcmV2X2NoaWxkOworICAgIGlmIChxdWV1ZS0+dHEudHFfcGFyZW50LT50cV9maXJzdF9jaGlsZCA9PSBxdWV1ZSkKKyAgICAgICAgcXVldWUtPnRxLnRxX3BhcmVudC0+dHFfZmlyc3RfY2hpbGQgPSBxdWV1ZS0+dHFfbmV4dF9jaGlsZDsKKworICAgIHF1ZXVlLT50cV9wcmV2X2NoaWxkID0gTlVMTDsKKyAgICBxdWV1ZS0+dHFfbmV4dF9jaGlsZCA9IE5VTEw7CisKKyAgICBpZiAoaW5fcGFyYWxsZWwpIHsKKyAgICAgICAga21wX3VpbnQzMiBzcGluczsKKworICAgICAgICBLTVBfREVCVUdfUkVGX0NUUygoImxpbmUgJWQgZ3RpZCAlZDogUSAlcCB3YWl0aW5nIGZvciByZWZfY291bnQgb2YgJWQgdG8gcmVhY2ggMVxuIiwKKyAgICAgICAgICBfX0xJTkVfXywgZ2xvYmFsX3RpZCwgcXVldWUsIHF1ZXVlLT50cV9yZWZfY291bnQpKTsKKworICAgICAgICAvKiB3YWl0IHVudGlsIGFsbCBvdGhlciB0aHJlYWRzIGhhdmUgc3RvcHBlZCBhY2Nlc3NpbmcgdGhpcyBxdWV1ZSAqLworICAgICAgICB3aGlsZSAocXVldWUtPnRxX3JlZl9jb3VudCA+IDEpIHsKKyAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfbG9jaygmIHF1ZXVlLT50cS50cV9wYXJlbnQtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKworICAgICAgICAgICAgS01QX1dBSVRfWUlFTEQoKHZvbGF0aWxlIGttcF91aW50MzIqKSZxdWV1ZS0+dHFfcmVmX2NvdW50LCAxLCBLTVBfTEUsIE5VTEwpOworCisgICAgICAgICAgICBfX2ttcF9hY3F1aXJlX2xvY2soJiBxdWV1ZS0+dHEudHFfcGFyZW50LT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisKKyAgICAgICAgICAgIEtNUF9NQigpOyAgLyogbWFrZSBzdXJlIGRhdGEgc3RydWN0dXJlcyBhcmUgaW4gY29uc2lzdGVudCBzdGF0ZSBiZWZvcmUgcXVlcnlpbmcgdGhlbSAqLworICAgICAgICAgICAgICAgICAgICAgICAvKiBTZWVtcyB0byB3b3JrIGZpbmUgd2l0aG91dCB0aGlzIGNhbGwgZm9yIGRpZ2l0YWwvYWxwaGEsIG5lZWRlZCBmb3IgSUJNL1JTNjAwMCAqLworICAgICAgICB9CisKKyAgICAgICAgX19rbXBfcmVsZWFzZV9sb2NrKCYgcXVldWUtPnRxLnRxX3BhcmVudC0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworICAgIH0KKworICAgIEtNUF9ERUJVR19SRUZfQ1RTKCgibGluZSAlZCBndGlkICVkOiBRICVwIGZyZWVpbmcgcXVldWVcbiIsCisgICAgICBfX0xJTkVfXywgZ2xvYmFsX3RpZCwgcXVldWUpKTsKKworI2lmZGVmIEtNUF9ERUJVRworICAgIEtNUF9ERUJVR19BU1NFUlQocXVldWUtPnRxX2ZsYWdzICYgVFFGX0FMTF9UQVNLU19RVUVVRUQpOworICAgIEtNUF9ERUJVR19BU1NFUlQocXVldWUtPnRxX25mdWxsID09IDApOworCisgICAgZm9yIChpPTA7IGk8cXVldWUtPnRxX25wcm9jOyBpKyspIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVChxdWV1ZS0+dHFfdGhfdGh1bmtzW2ldLmFpX2RhdGEgPT0gMCk7CisgICAgfQorCisgICAgaSA9IDA7CisgICAgZm9yICh0aHVuaz1xdWV1ZS0+dHFfZnJlZV90aHVua3M7IHRodW5rICE9IE5VTEw7IHRodW5rPXRodW5rLT50aC50aF9uZXh0X2ZyZWUpCisgICAgICAgICsraTsKKworICAgIEtNUF9BU1NFUlQgKGkgPT0gcXVldWUtPnRxX25zbG90cyArIChxdWV1ZS0+dHFfbnByb2MgKiBfX0tNUF9UQVNLUV9USFVOS1NfUEVSX1RIKSk7CisjZW5kaWYKKworICAgIC8qICByZWxlYXNlIHN0b3JhZ2UgZm9yIHF1ZXVlIGVudHJ5ICAqLworICAgIF9fa21wX2ZyZWVfdGFza3EgKCB0cSwgcXVldWUsIFRSVUUsIGdsb2JhbF90aWQgKTsKKworICAgIEtGX1RSQUNFKDUwLCAoIkFmdGVyIERlbGV0aW9uIG9mIFRhc2tRIGF0ICVwIG9uICglZCk6XG4iLCBxdWV1ZSwgZ2xvYmFsX3RpZCkpOworICAgIEtGX0RVTVAoNTAsIF9fa21wX2R1bXBfdGFza19xdWV1ZV90cmVlKCB0cSwgdHEtPnRxX3Jvb3QsIGdsb2JhbF90aWQgKSk7Cit9CisKKy8qCisgKiBTdGFydGluZyBmcm9tIGluZGljYXRlZCBxdWV1ZSwgcHJvY2VlZCBkb3dud2FyZCB0aHJvdWdoIHRyZWUgYW5kCisgKiByZW1vdmUgYWxsIHRhc2txcyB3aGljaCBhcmUgZmluaXNoZWQsIGJ1dCBvbmx5IGdvIGRvd24gdG8gdGFza3FzCisgKiB3aGljaCBoYXZlIHRoZSAibm93YWl0IiBjbGF1c2UgcHJlc2VudC4gIEFzc3VtZSB0aGlzIGlzIG9ubHkgY2FsbGVkCisgKiB3aGVuIGluX3BhcmFsbGVsPVRSVUUuCisgKi8KKworc3RhdGljIHZvaWQKK19fa21wX2ZpbmRfYW5kX3JlbW92ZV9maW5pc2hlZF9jaGlsZF90YXNrcSgga21wX3Rhc2txX3QgKnRxLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wY190YXNrX3F1ZXVlX3QgKmN1cnJfcXVldWUgKQoreworICAgIGttcGNfdGFza19xdWV1ZV90ICpxdWV1ZSA9IGN1cnJfcXVldWU7CisKKyAgICBpZiAoY3Vycl9xdWV1ZS0+dHFfZmlyc3RfY2hpbGQgIT0gTlVMTCkgeworICAgICAgICBfX2ttcF9hY3F1aXJlX2xvY2soJiBjdXJyX3F1ZXVlLT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisKKyAgICAgICAgS01QX01CKCk7ICAvKiBtYWtlIHN1cmUgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBpbiBjb25zaXN0ZW50IHN0YXRlIGJlZm9yZSBxdWVyeWluZyB0aGVtICovCisgICAgICAgICAgICAgICAgICAgLyogU2VlbXMgdG8gd29yayBmaW5lIHdpdGhvdXQgdGhpcyBjYWxsIGZvciBkaWdpdGFsL2FscGhhLCBuZWVkZWQgZm9yIElCTS9SUzYwMDAgKi8KKworICAgICAgICBxdWV1ZSA9IChrbXBjX3Rhc2tfcXVldWVfdCAqKSBjdXJyX3F1ZXVlLT50cV9maXJzdF9jaGlsZDsKKyAgICAgICAgaWYgKHF1ZXVlICE9IE5VTEwpIHsKKyAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfbG9jaygmIGN1cnJfcXVldWUtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlIChxdWV1ZSAhPSBOVUxMKSAgeworICAgICAgICAgICAga21wY190YXNrX3F1ZXVlX3QgKm5leHQ7CisgICAgICAgICAgICBpbnQgY3QgPSArKyhxdWV1ZS0+dHFfcmVmX2NvdW50KTsKKyAgICAgICAgICAgIEtNUF9ERUJVR19SRUZfQ1RTKCgibGluZSAlZCBndGlkICVkOiBRICVwIGluYyAlZFxuIiwKKyAgICAgICAgICAgICAgX19MSU5FX18sIGdsb2JhbF90aWQsIHF1ZXVlLCBjdCkpOworCisKKyAgICAgICAgICAgIC8qIGFsdGhvdWdoIHJlZmVyZW5jZSBjb3VudCBzdGF5cyBhY3RpdmUgZHVyaW5nIGRlc2NlbmRhbnQgd2FsaywgKi8KKyAgICAgICAgICAgIC8qIHNob3VsZG4ndCBtYXR0ZXIgc2luY2UgaWYgY2hpbGRyZW4gc3RpbGwgZXhpc3QsIHJlZmVyZW5jZSAgICAgKi8KKyAgICAgICAgICAgIC8qIGNvdW50cyBhcmVuJ3QgYmVpbmcgbW9uaXRvcmVkIGFueXdheSAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgaWYgKHF1ZXVlLT50cV9mbGFncyAmIFRRRl9JU19OT1dBSVQpIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9maW5kX2FuZF9yZW1vdmVfZmluaXNoZWRfY2hpbGRfdGFza3EgKCB0cSwgZ2xvYmFsX3RpZCwgcXVldWUgKTsKKworICAgICAgICAgICAgICAgIGlmICgocXVldWUtPnRxX2ZsYWdzICYgVFFGX0FMTF9UQVNLU19RVUVVRUQpICYmIChxdWV1ZS0+dHFfbmZ1bGwgPT0gMCkgJiYKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfdGFza3FfdGFza3NfZmluaXNoZWQocXVldWUpICYmICEgX19rbXBfdGFza3FfaGFzX2FueV9jaGlsZHJlbihxdWV1ZSkpIHsKKworICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgT25seSByZW1vdmUgdGhpcyBpZiB3ZSBoYXZlIG5vdCBhbHJlYWR5IG1hcmtlZCBpdCBmb3IgZGVhbGxvY2F0aW9uLgorICAgICAgICAgICAgICAgICAgICAgVGhpcyBzaG91bGQgcHJldmVudCBtdWx0aXBsZSB0aHJlYWRzIGZyb20gdHJ5aW5nIHRvIGZyZWUgdGhpcy4KKyAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBfX2ttcF90ZXN0X2xvY2soJiBxdWV1ZS0+dHFfcXVldWVfbGNrLCBnbG9iYWxfdGlkKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggIShxdWV1ZS0+dHFfZmxhZ3MgJiBUUUZfREVBTExPQ0FURUQpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlLT50cV9mbGFncyB8PSBUUUZfREVBTExPQ0FURUQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9sb2NrKCYgcXVldWUtPnRxX3F1ZXVlX2xjaywgZ2xvYmFsX3RpZCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9yZW1vdmVfcXVldWVfZnJvbV90cmVlKCB0cSwgZ2xvYmFsX3RpZCwgcXVldWUsIFRSVUUgKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENhbid0IGRvIGFueSBtb3JlIGhlcmUgc2luY2UgY2FuJ3QgYmUgc3VyZSB3aGVyZSBzaWJsaW5nIHF1ZXVlIGlzIHNvIGp1c3QgZXhpdCB0aGlzIGxldmVsICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9sb2NrKCYgcXVldWUtPnRxX3F1ZXVlX2xjaywgZ2xvYmFsX3RpZCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLyogb3RoZXJ3aXNlLCBqdXN0IGZhbGwgdGhyb3VnaCBhbmQgZGVjcmVtZW50IHJlZmVyZW5jZSBjb3VudCAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgX19rbXBfYWNxdWlyZV9sb2NrKCYgY3Vycl9xdWV1ZS0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworCisgICAgICAgICAgICBLTVBfTUIoKTsgIC8qIG1ha2Ugc3VyZSBkYXRhIHN0cnVjdHVyZXMgYXJlIGluIGNvbnNpc3RlbnQgc3RhdGUgYmVmb3JlIHF1ZXJ5aW5nIHRoZW0gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgLyogU2VlbXMgdG8gd29yayBmaW5lIHdpdGhvdXQgdGhpcyBjYWxsIGZvciBkaWdpdGFsL2FscGhhLCBuZWVkZWQgZm9yIElCTS9SUzYwMDAgKi8KKworICAgICAgICAgICAgbmV4dCA9IHF1ZXVlLT50cV9uZXh0X2NoaWxkOworCisgICAgICAgICAgICBjdCA9IC0tKHF1ZXVlLT50cV9yZWZfY291bnQpOworICAgICAgICAgICAgS01QX0RFQlVHX1JFRl9DVFMoKCJsaW5lICVkIGd0aWQgJWQ6IFEgJXAgZGVjICVkXG4iLAorICAgICAgICAgICAgICBfX0xJTkVfXywgZ2xvYmFsX3RpZCwgcXVldWUsIGN0KSk7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBjdCA+PSAwICk7CisKKyAgICAgICAgICAgIHF1ZXVlID0gbmV4dDsKKyAgICAgICAgfQorCisgICAgICAgIF9fa21wX3JlbGVhc2VfbG9jaygmIGN1cnJfcXVldWUtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKyAgICB9Cit9CisKKy8qCisgKiBTdGFydGluZyBmcm9tIGluZGljYXRlZCBxdWV1ZSwgcHJvY2VlZCBkb3dud2FyZCB0aHJvdWdoIHRyZWUgYW5kCisgKiByZW1vdmUgYWxsIHRhc2txJ3MgYXNzdW1pbmcgYWxsIGFyZSBmaW5pc2hlZCBhbmQKKyAqIGFzc3VtaW5nIE5PIG90aGVyIHRocmVhZHMgYXJlIGV4ZWN1dGluZyBhdCB0aGlzIHBvaW50LgorICovCisKK3N0YXRpYyB2b2lkCitfX2ttcF9yZW1vdmVfYWxsX2NoaWxkX3Rhc2txKCBrbXBfdGFza3FfdCAqdHEsIGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBjX3Rhc2tfcXVldWVfdCAqcXVldWUgKQoreworICAgIGttcGNfdGFza19xdWV1ZV90ICpuZXh0X2NoaWxkOworCisgICAgcXVldWUgPSAoa21wY190YXNrX3F1ZXVlX3QgKikgcXVldWUtPnRxX2ZpcnN0X2NoaWxkOworCisgICAgd2hpbGUgKHF1ZXVlICE9IE5VTEwpICB7CisgICAgICAgIF9fa21wX3JlbW92ZV9hbGxfY2hpbGRfdGFza3EgKCB0cSwgZ2xvYmFsX3RpZCwgcXVldWUgKTsKKworICAgICAgICBuZXh0X2NoaWxkID0gcXVldWUtPnRxX25leHRfY2hpbGQ7CisgICAgICAgIHF1ZXVlLT50cV9mbGFncyB8PSBUUUZfREVBTExPQ0FURUQ7CisgICAgICAgIF9fa21wX3JlbW92ZV9xdWV1ZV9mcm9tX3RyZWUgKCB0cSwgZ2xvYmFsX3RpZCwgcXVldWUsIEZBTFNFICk7CisgICAgICAgIHF1ZXVlID0gbmV4dF9jaGlsZDsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9leGVjdXRlX3Rhc2tfZnJvbV9xdWV1ZSgga21wX3Rhc2txX3QgKnRxLCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBjX3RodW5rX3QgKnRodW5rLCBpbnQgaW5fcGFyYWxsZWwgKQoreworICAgIGttcGNfdGFza19xdWV1ZV90ICpxdWV1ZSA9IHRodW5rLT50aC50aF9zaGFyZWRzLT5zdl9xdWV1ZTsKKyAgICBrbXBfaW50MzIgICAgICAgICAgdGlkICAgPSBfX2ttcF90aWRfZnJvbV9ndGlkKCBnbG9iYWxfdGlkICk7CisKKyAgICBLRl9UUkFDRSgxMDAsICgiQWZ0ZXIgZGVxdWV1ZWluZyB0aGlzIFRhc2sgb24gKCVkKTpcbiIsIGdsb2JhbF90aWQpKTsKKyAgICBLRl9EVU1QKDEwMCwgX19rbXBfZHVtcF90aHVuayggdHEsIHRodW5rLCBnbG9iYWxfdGlkICkpOworICAgIEtGX1RSQUNFKDEwMCwgKCJUYXNrIFF1ZXVlOiAlcCBsb29rcyBsaWtlIHRoaXMgKCVkKTpcbiIsIHF1ZXVlLCBnbG9iYWxfdGlkKSk7CisgICAgS0ZfRFVNUCgxMDAsIF9fa21wX2R1bXBfdGFza19xdWV1ZSggdHEsIHF1ZXVlLCBnbG9iYWxfdGlkICkpOworCisgICAgLyoKKyAgICAgKiBGb3IgdGhlIHRhc2txIHRhc2ssIHRoZSBjdXJyX3RodW5rIHB1c2hlcyBhbmQgcG9wIHBhaXJzIGFyZSBzZXQgdXAgYXMgZm9sbG93czoKKyAgICAgKgorICAgICAqIGhhcHBlbnMgZXhhY3RseSBvbmNlOgorICAgICAqIDEpIF9fa21wY190YXNrcSAgICAgICAgICAgICA6IHB1c2ggKGlmIHJldHVybmluZyB0aHVuayBvbmx5KQorICAgICAqIDQpIF9fa21wY19lbmRfdGFza3FfdGFzayAgICA6IHBvcAorICAgICAqCisgICAgICogb3B0aW9uYWxseSBoYXBwZW5zICplYWNoKiB0aW1lIHRhc2txIHRhc2sgaXMgZGVxdWV1ZWQvZW5xdWV1ZWQ6CisgICAgICogMikgX19rbXBjX3Rhc2txX3Rhc2sgICAgICAgIDogcG9wCisgICAgICogMykgX19rbXBfZXhlY3V0ZV90YXNrX2Zyb21fcXVldWUgIDogcHVzaAorICAgICAqCisgICAgICogZXhlY3V0aW9uIG9yZGVyaW5nOiAgMSwoMiwzKSosNAorICAgICAqLworCisgICAgaWYgKCEodGh1bmstPnRoX2ZsYWdzICYgVFFGX1RBU0tRX1RBU0spKSB7CisgICAgICAgIGttcF9pbnQzMiBpbmRleCA9IChxdWV1ZSA9PSB0cS0+dHFfcm9vdCkgPyB0aWQgOiAwOworICAgICAgICB0aHVuay0+dGgudGhfc2hhcmVkcyA9IChrbXBjX3NoYXJlZF92YXJzX3QgKikgcXVldWUtPnRxX3NoYXJlZHNbaW5kZXhdLmFpX2RhdGE7CisKKyAgICAgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgICAgICBfX2ttcF9wdXNoX3dvcmtzaGFyZSggZ2xvYmFsX3RpZCwKKyAgICAgICAgICAgICAgICAgICAgKHF1ZXVlLT50cV9mbGFncyAmIFRRRl9JU19PUkRFUkVEKSA/IGN0X3Rhc2tfb3JkZXJlZCA6IGN0X3Rhc2ssCisgICAgICAgICAgICAgICAgICAgIHF1ZXVlLT50cV9sb2MgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKQorICAgICAgICAgICAgX19rbXBfcHVzaF93b3Jrc2hhcmUoIGdsb2JhbF90aWQsIGN0X3Rhc2txLCBxdWV1ZS0+dHFfbG9jICk7CisgICAgfQorCisgICAgaWYgKGluX3BhcmFsbGVsKSB7CisgICAgICAgIHRodW5rLT50aF9lbmNsX3RodW5rID0gdHEtPnRxX2N1cnJfdGh1bmtbdGlkXTsKKyAgICAgICAgdHEtPnRxX2N1cnJfdGh1bmtbdGlkXSA9IHRodW5rOworCisgICAgICAgIEtGX0RVTVAoIDIwMCwgX19rbXBfZHVtcF90aHVua19zdGFjayggdHEtPnRxX2N1cnJfdGh1bmtbdGlkXSwgZ2xvYmFsX3RpZCApKTsKKyAgICB9CisKKyAgICBLRl9UUkFDRSggNTAsICgiQmVnaW4gRXhlY3V0aW5nIFRodW5rICVwIGZyb20gcXVldWUgJXAgb24gKCVkKVxuIiwgdGh1bmssIHF1ZXVlLCBnbG9iYWxfdGlkKSk7CisgICAgdGh1bmstPnRoX3Rhc2sgKGdsb2JhbF90aWQsIHRodW5rKTsKKyAgICBLRl9UUkFDRSggNTAsICgiRW5kIEV4ZWN1dGluZyBUaHVuayAlcCBmcm9tIHF1ZXVlICVwIG9uICglZClcbiIsIHRodW5rLCBxdWV1ZSwgZ2xvYmFsX3RpZCkpOworCisgICAgaWYgKCEodGh1bmstPnRoX2ZsYWdzICYgVFFGX1RBU0tRX1RBU0spKSB7CisgICAgICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkKKyAgICAgICAgICAgIF9fa21wX3BvcF93b3Jrc2hhcmUoIGdsb2JhbF90aWQsIChxdWV1ZS0+dHFfZmxhZ3MgJiBUUUZfSVNfT1JERVJFRCkgPyBjdF90YXNrX29yZGVyZWQgOiBjdF90YXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUtPnRxX2xvYyApOworCisgICAgICAgIGlmIChpbl9wYXJhbGxlbCkgeworICAgICAgICAgICAgdHEtPnRxX2N1cnJfdGh1bmtbdGlkXSA9IHRodW5rLT50aF9lbmNsX3RodW5rOworICAgICAgICAgICAgdGh1bmstPnRoX2VuY2xfdGh1bmsgPSBOVUxMOworICAgICAgICAgICAgS0ZfRFVNUCggMjAwLCBfX2ttcF9kdW1wX3RodW5rX3N0YWNrKCB0cS0+dHFfY3Vycl90aHVua1t0aWRdLCBnbG9iYWxfdGlkICkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCh0aHVuay0+dGhfZmxhZ3MgJiBUUUZfSVNfT1JERVJFRCkgJiYgaW5fcGFyYWxsZWwpIHsKKyAgICAgICAgICAgIF9fa21wX3Rhc2txX2NoZWNrX29yZGVyZWQoZ2xvYmFsX3RpZCwgdGh1bmspOworICAgICAgICB9CisKKyAgICAgICAgX19rbXBfZnJlZV90aHVuayAocXVldWUsIHRodW5rLCBpbl9wYXJhbGxlbCwgZ2xvYmFsX3RpZCk7CisKKyAgICAgICAgS0ZfVFJBQ0UoMTAwLCAoIlQjJWQgQWZ0ZXIgZnJlZWluZyB0aHVuazogJXAsIFRhc2tRIGxvb2tzIGxpa2UgdGhpczpcbiIsIGdsb2JhbF90aWQsIHRodW5rKSk7CisgICAgICAgIEtGX0RVTVAoMTAwLCBfX2ttcF9kdW1wX3Rhc2tfcXVldWUoIHRxLCBxdWV1ZSwgZ2xvYmFsX3RpZCApKTsKKworICAgICAgICBpZiAoaW5fcGFyYWxsZWwpIHsKKyAgICAgICAgICAgIEtNUF9NQigpOyAgIC8qIG5lZWRlZCBzbyB0aHVuayBwdXQgb24gZnJlZSBsaXN0IGJlZm9yZSBvdXRzdGFuZGluZyB0aHVuayBjb3VudCBpcyBkZWNyZW1lbnRlZCAqLworCisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHF1ZXVlLT50cV90aF90aHVua3NbdGlkXS5haV9kYXRhID49IDEpOworCisgICAgICAgICAgICBLRl9UUkFDRSggMjAwLCAoIl9fa21wX2V4ZWN1dGVfdGFza19mcm9tX3F1ZXVlOiBUIyVkIGhhcyAlZCB0aHVua3MgaW4gcXVldWUgJXBcbiIsCisgICAgICAgICAgICAgICAgZ2xvYmFsX3RpZCwgcXVldWUtPnRxX3RoX3RodW5rc1t0aWRdLmFpX2RhdGEtMSwgcXVldWUpKTsKKworICAgICAgICAgICAgcXVldWUtPnRxX3RoX3RodW5rc1t0aWRdLmFpX2RhdGEtLTsKKworICAgICAgICAgICAgLyogS01QX01CKCk7ICovICAgICAvKiBpcyBNQiByZWFsbHkgbmVjZXNzYXJ5ID8gKi8KKyAgICAgICAgfQorCisgICAgICAgIGlmIChxdWV1ZS0+dHEudHFfcGFyZW50ICE9IE5VTEwgJiYgaW5fcGFyYWxsZWwpIHsKKyAgICAgICAgICAgIGludCBjdDsKKyAgICAgICAgICAgIF9fa21wX2FjcXVpcmVfbG9jaygmIHF1ZXVlLT50cS50cV9wYXJlbnQtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKyAgICAgICAgICAgIGN0ID0gLS0ocXVldWUtPnRxX3JlZl9jb3VudCk7CisgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX2xvY2soJiBxdWV1ZS0+dHEudHFfcGFyZW50LT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisgICAgICAgICAgICBLTVBfREVCVUdfUkVGX0NUUygoImxpbmUgJWQgZ3RpZCAlZDogUSAlcCBkZWMgJWRcbiIsCisgICAgICAgICAgICAgIF9fTElORV9fLCBnbG9iYWxfdGlkLCBxdWV1ZSwgY3QpKTsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGN0ID49IDAgKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIHN0YXJ0cyBhIHRhc2txOyBjcmVhdGVzIGFuZCByZXR1cm5zIGEgdGh1bmsgZm9yIHRoZSB0YXNrcV90YXNrICAgICAgICAqLworLyogYWxzbywgcmV0dXJucyBwb2ludGVyIHRvIHNoYXJlZCB2YXJzIGZvciB0aGlzIHRocmVhZCBpbiAic2hhcmVkcyIgYXJnICovCisKK2ttcGNfdGh1bmtfdCAqCitfX2ttcGNfdGFza3EoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQsIGttcGNfdGFza190IHRhc2txX3Rhc2ssCisgICAgICAgICAgICAgIHNpemVfdCBzaXplb2ZfdGh1bmssIHNpemVfdCBzaXplb2Zfc2hhcmVkcywKKyAgICAgICAgICAgICAga21wX2ludDMyIGZsYWdzLCBrbXBjX3NoYXJlZF92YXJzX3QgKipzaGFyZWRzICkKK3sKKyAgICBpbnQgICAgICAgICAgICAgICAgICBpbl9wYXJhbGxlbDsKKyAgICBrbXBfaW50MzIgICAgICAgICAgICBuc2xvdHMsIG50aHVua3MsIG5zaGFyZWRzLCBucHJvYzsKKyAgICBrbXBjX3Rhc2tfcXVldWVfdCAgICpuZXdfcXVldWUsICpjdXJyX3F1ZXVlOworICAgIGttcGNfdGh1bmtfdCAgICAgICAgKm5ld190YXNrcV90aHVuazsKKyAgICBrbXBfaW5mb190ICAgICAgICAgICp0aDsKKyAgICBrbXBfdGVhbV90ICAgICAgICAgICp0ZWFtOworICAgIGttcF90YXNrcV90ICAgICAgICAgKnRxOworICAgIGttcF9pbnQzMiAgICAgICAgICAgIHRpZDsKKworICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcGNfdGFza3EgY2FsbGVkICglZClcbiIsIGdsb2JhbF90aWQpKTsKKworICAgIHRoID0gX19rbXBfdGhyZWFkc1sgZ2xvYmFsX3RpZCBdOworICAgIHRlYW0gPSB0aCAtPiB0aC50aF90ZWFtOworICAgIHRxID0gJiB0ZWFtIC0+IHQudF90YXNrcTsKKyAgICBucHJvYyA9IHRlYW0gLT4gdC50X25wcm9jOworICAgIHRpZCA9IF9fa21wX3RpZF9mcm9tX2d0aWQoIGdsb2JhbF90aWQgKTsKKworICAgIC8qIGZpbmQgb3V0IHdoZXRoZXIgdGhpcyBpcyBhIHBhcmFsbGVsIHRhc2txIG9yIHNlcmlhbGl6ZWQgb25lLiAqLworICAgIGluX3BhcmFsbGVsID0gaW5fcGFyYWxsZWxfY29udGV4dCggdGVhbSApOworCisgICAgaWYoICEgdHEtPnRxX3Jvb3QgKSB7CisgICAgICAgIGlmIChpbl9wYXJhbGxlbCkgeworICAgICAgICAgICAgLyogVmVjdG9yIE9SREVSRUQgU0VDVElPTiB0byB0YXNrcSB2ZXJzaW9uICovCisgICAgICAgICAgICB0aC0+dGgudGhfZGlzcGF0Y2gtPnRoX2Rlb19mY24gPSBfX2ttcF90YXNrcV9lbzsKKworICAgICAgICAgICAgLyogVmVjdG9yIE9SREVSRUQgU0VDVElPTiB0byB0YXNrcSB2ZXJzaW9uICovCisgICAgICAgICAgICB0aC0+dGgudGhfZGlzcGF0Y2gtPnRoX2R4b19mY24gPSBfX2ttcF90YXNrcV94bzsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpbl9wYXJhbGxlbCkgeworICAgICAgICAgICAgLyogVGhpcyBzaG91bGRuJ3QgYmUgYSBiYXJyaWVyIHJlZ2lvbiBib3VuZGFyeSwgaXQgd2lsbCBjb25mdXNlIHRoZSB1c2VyLiAqLworICAgICAgICAgICAgLyogTmVlZCB0aGUgYm91bmRhcnkgdG8gYmUgYXQgdGhlIGVuZCB0YXNrcSBpbnN0ZWFkLiAqLworICAgICAgICAgICAgaWYgKCBfX2ttcF9iYXJyaWVyKCBic19wbGFpbl9iYXJyaWVyLCBnbG9iYWxfdGlkLCBUUlVFLCAwLCBOVUxMLCBOVUxMICkpIHsKKyAgICAgICAgICAgICAgICAvKiBDcmVhdGluZyB0aGUgYWN0aXZlIHJvb3QgcXVldWUsIGFuZCB3ZSBhcmUgbm90IHRoZSBtYXN0ZXIgdGhyZWFkLiAqLworICAgICAgICAgICAgICAgIC8qIFRoZSBtYXN0ZXIgdGhyZWFkIGJlbG93IGNyZWF0ZWQgdGhlIHF1ZXVlIGFuZCB0YXNrcyBoYXZlIGJlZW4gICAgICovCisgICAgICAgICAgICAgICAgLyogZW5xdWV1ZWQsIGFuZCB0aGUgbWFzdGVyIHRocmVhZCByZWxlYXNlZCB0aGlzIGJhcnJpZXIuICBUaGlzICAgICAgKi8KKyAgICAgICAgICAgICAgICAvKiB3b3JrZXIgdGhyZWFkIGNhbiBub3cgcHJvY2VlZCBhbmQgZXhlY3V0ZSB0YXNrcy4gIFNlZSBhbHNvIHRoZSAgICAqLworICAgICAgICAgICAgICAgIC8qIFRRRl9SRUxFQVNFX1dPUktFUlMgd2hpY2ggaXMgdXNlZCB0byBoYW5kbGUgdGhpcyBjYXNlLiAgICAgICAgICAgICovCisKKyAgICAgICAgICAgICAgICAqc2hhcmVkcyA9IChrbXBjX3NoYXJlZF92YXJzX3QgKikgdHEtPnRxX3Jvb3QtPnRxX3NoYXJlZHNbdGlkXS5haV9kYXRhOworCisgICAgICAgICAgICAgICAgS0VfVFJBQ0UoIDEwLCAoIl9fa21wY190YXNrcSByZXR1cm4gKCVkKVxuIiwgZ2xvYmFsX3RpZCkpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBtYXN0ZXIgdGhyZWFkIG9ubHkgZXhlY3V0ZXMgdGhpcyBjb2RlICovCisKKyAgICAgICAgaWYoIHRxLT50cV9jdXJyX3RodW5rX2NhcGFjaXR5IDwgbnByb2MgKSB7CisgICAgICAgICAgICBpbnQgaTsKKworICAgICAgICAgICAgaWYodHEtPnRxX2N1cnJfdGh1bmspCisgICAgICAgICAgICAgICAgX19rbXBfZnJlZSh0cS0+dHFfY3Vycl90aHVuayk7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBvbmx5IG5lZWQgdG8gZG8gdGhpcyBvbmNlIGF0IG91dGVyIGxldmVsLCBpLmUuIHdoZW4gdHFfY3Vycl90aHVuayBpcyBzdGlsbCBOVUxMICovCisgICAgICAgICAgICAgICAgX19rbXBfaW5pdF9sb2NrKCAmIHRxLT50cV9mcmVlbGlzdF9sY2sgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHEtPnRxX2N1cnJfdGh1bmsgPSAoa21wY190aHVua190ICoqKSBfX2ttcF9hbGxvY2F0ZSggbnByb2MgKiBzaXplb2Yoa21wY190aHVua190ICopICk7CisgICAgICAgICAgICB0cSAtPiB0cV9jdXJyX3RodW5rX2NhcGFjaXR5ID0gbnByb2M7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaW5fcGFyYWxsZWwpCisgICAgICAgICAgICB0cS0+dHFfZ2xvYmFsX2ZsYWdzID0gVFFGX1JFTEVBU0VfV09SS0VSUzsKKyAgICB9CisKKyAgICAvKiBka3A6IGluIGZ1dHVyZSwgaWYgZmxhZ3MgJiBUUUZfSEVVUklTVElDUywgd2lsbCBjaG9vc2UgbnNsb3RzIGJhc2VkICovCisgICAgLyogICAgICBvbiBzb21lIGhldXJpc3RpY3MgKGUuZy4sIGRlcHRoIG9mIHF1ZXVlIG5lc3Rpbmc/KS4gICAgICAgICAgICAqLworCisgICAgbnNsb3RzID0gKGluX3BhcmFsbGVsKSA/ICgyICogbnByb2MpIDogMTsKKworICAgIC8qIFRoZXJlIG11c3QgYmUgbnByb2MgKiBfX0tNUF9UQVNLUV9USFVOS1NfUEVSX1RIIGV4dHJhIHNsb3RzIGZvciBwZW5kaW5nICovCisgICAgLyogam9icyBiZWluZyBleGVjdXRlZCBieSBvdGhlciB0aHJlYWRzLCBhbmQgb25lIGV4dHJhIGZvciB0YXNrcSBzbG90ICAgICAgICAgICovCisKKyAgICBudGh1bmtzID0gKGluX3BhcmFsbGVsKSA/IChuc2xvdHMgKyAobnByb2MgKiBfX0tNUF9UQVNLUV9USFVOS1NfUEVSX1RIKSArIDEpIDogbnNsb3RzICsgMjsKKworICAgIC8qIE9ubHkgdGhlIHJvb3QgdGFza3EgZ2V0cyBhIHBlci10aHJlYWQgYXJyYXkgb2Ygc2hhcmVkcy4gICAgICAgKi8KKyAgICAvKiBUaGUgcmVzdCBvZiB0aGUgdGFza3EncyBvbmx5IGdldCBvbmUgY29weSBvZiB0aGUgc2hhcmVkIHZhcnMuICovCisKKyAgICBuc2hhcmVkcyA9ICggIXRxLT50cV9yb290ICYmIGluX3BhcmFsbGVsKSA/IG5wcm9jIDogMTsKKworICAgIC8qICBjcmVhdGUgb3ZlcmFsbCBxdWV1ZSBkYXRhIHN0cnVjdHVyZSBhbmQgaXRzIGNvbXBvbmVudHMgdGhhdCByZXF1aXJlIGFsbG9jYXRpb24gKi8KKworICAgIG5ld19xdWV1ZSA9IF9fa21wX2FsbG9jX3Rhc2txICggdHEsIGluX3BhcmFsbGVsLCBuc2xvdHMsIG50aHVua3MsIG5zaGFyZWRzLCBucHJvYywKKyAgICAgICAgc2l6ZW9mX3RodW5rLCBzaXplb2Zfc2hhcmVkcywgJm5ld190YXNrcV90aHVuaywgZ2xvYmFsX3RpZCApOworCisgICAgLyogIHJlc3Qgb2YgbmV3X3F1ZXVlIGluaXRpYWxpemF0aW9ucyAgKi8KKworICAgIG5ld19xdWV1ZS0+dHFfZmxhZ3MgICAgICAgICAgID0gZmxhZ3MgJiBUUUZfSU5URVJGQUNFX0ZMQUdTOworCisgICAgaWYgKGluX3BhcmFsbGVsKSB7CisgICAgICAgIG5ld19xdWV1ZS0+dHFfdGFza251bV9xdWV1aW5nICA9IDA7CisgICAgICAgIG5ld19xdWV1ZS0+dHFfdGFza251bV9zZXJ2aW5nICA9IDA7CisgICAgICAgIG5ld19xdWV1ZS0+dHFfZmxhZ3MgICAgICAgICAgIHw9IFRRRl9QQVJBTExFTF9DT05URVhUOworICAgIH0KKworICAgIG5ld19xdWV1ZS0+dHFfdGFza3Ffc2xvdCAgID0gTlVMTDsKKyAgICBuZXdfcXVldWUtPnRxX25zbG90cyAgICAgICA9IG5zbG90czsKKyAgICBuZXdfcXVldWUtPnRxX2hpd2F0ICAgICAgICA9IEhJR0hfV0FURVJfTUFSSyAobnNsb3RzKTsKKyAgICBuZXdfcXVldWUtPnRxX25mdWxsICAgICAgICA9IDA7CisgICAgbmV3X3F1ZXVlLT50cV9oZWFkICAgICAgICAgPSAwOworICAgIG5ld19xdWV1ZS0+dHFfdGFpbCAgICAgICAgID0gMDsKKyAgICBuZXdfcXVldWUtPnRxX2xvYyAgICAgICAgICA9IGxvYzsKKworICAgIGlmICgobmV3X3F1ZXVlLT50cV9mbGFncyAmIFRRRl9JU19PUkRFUkVEKSAmJiBpbl9wYXJhbGxlbCkgeworICAgICAgICAvKiBwcmVwYXJlIHRvIHNlcnZlIHRoZSBmaXJzdC1xdWV1ZWQgdGFzaydzIE9SREVSRUQgZGlyZWN0aXZlICovCisgICAgICAgIG5ld19xdWV1ZS0+dHFfdGFza251bV9zZXJ2aW5nID0gMTsKKworICAgICAgICAvKiBWZWN0b3IgT1JERVJFRCBTRUNUSU9OIHRvIHRhc2txIHZlcnNpb24gKi8KKyAgICAgICAgdGgtPnRoLnRoX2Rpc3BhdGNoLT50aF9kZW9fZmNuID0gX19rbXBfdGFza3FfZW87CisKKyAgICAgICAgLyogVmVjdG9yIE9SREVSRUQgU0VDVElPTiB0byB0YXNrcSB2ZXJzaW9uICovCisgICAgICAgIHRoLT50aC50aF9kaXNwYXRjaC0+dGhfZHhvX2ZjbiA9IF9fa21wX3Rhc2txX3hvOworICAgIH0KKworICAgIC8qICBjcmVhdGUgYSBuZXcgdGh1bmsgZm9yIHRoZSB0YXNrcV90YXNrIGluIHRoZSBuZXdfcXVldWUgICovCisgICAgKnNoYXJlZHMgPSAoa21wY19zaGFyZWRfdmFyc190ICopIG5ld19xdWV1ZS0+dHFfc2hhcmVkc1swXS5haV9kYXRhOworCisgICAgbmV3X3Rhc2txX3RodW5rLT50aC50aF9zaGFyZWRzID0gKnNoYXJlZHM7CisgICAgbmV3X3Rhc2txX3RodW5rLT50aF90YXNrICAgICAgID0gdGFza3FfdGFzazsKKyAgICBuZXdfdGFza3FfdGh1bmstPnRoX2ZsYWdzICAgICAgPSBuZXdfcXVldWUtPnRxX2ZsYWdzIHwgVFFGX1RBU0tRX1RBU0s7CisgICAgbmV3X3Rhc2txX3RodW5rLT50aF9zdGF0dXMgICAgID0gMDsKKworICAgIEtNUF9ERUJVR19BU1NFUlQgKG5ld190YXNrcV90aHVuay0+dGhfZmxhZ3MgJiBUUUZfVEFTS1FfVEFTSyk7CisKKyAgICAvKiBLTVBfTUIoKTsgKi8gLyogbWFrZSBzdXJlIHRoZXNlIGluaXRzIGNvbXBsZXRlIGJlZm9yZSB0aHJlYWRzIHN0YXJ0IHVzaW5nIHRoaXMgcXVldWUgKG5lY2Vzc2FyeT8pICovCisKKyAgICAvKiBpbnNlcnQgdGhlIG5ldyB0YXNrIHF1ZXVlIGludG8gdGhlIHRyZWUsIGJ1dCBvbmx5IGFmdGVyIGFsbCBmaWVsZHMgaW5pdGlhbGl6ZWQgKi8KKworICAgIGlmIChpbl9wYXJhbGxlbCkgeworICAgICAgICBpZiggISB0cS0+dHFfcm9vdCApIHsKKyAgICAgICAgICAgIG5ld19xdWV1ZS0+dHEudHFfcGFyZW50ICAgPSBOVUxMOworICAgICAgICAgICAgbmV3X3F1ZXVlLT50cV9maXJzdF9jaGlsZCA9IE5VTEw7CisgICAgICAgICAgICBuZXdfcXVldWUtPnRxX25leHRfY2hpbGQgID0gTlVMTDsKKyAgICAgICAgICAgIG5ld19xdWV1ZS0+dHFfcHJldl9jaGlsZCAgPSBOVUxMOworICAgICAgICAgICAgbmV3X3F1ZXVlLT50cV9yZWZfY291bnQgICA9IDE7CisgICAgICAgICAgICB0cS0+dHFfcm9vdCA9IG5ld19xdWV1ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGN1cnJfcXVldWUgPSB0cS0+dHFfY3Vycl90aHVua1t0aWRdLT50aC50aF9zaGFyZWRzLT5zdl9xdWV1ZTsKKyAgICAgICAgICAgIG5ld19xdWV1ZS0+dHEudHFfcGFyZW50ICAgPSBjdXJyX3F1ZXVlOworICAgICAgICAgICAgbmV3X3F1ZXVlLT50cV9maXJzdF9jaGlsZCA9IE5VTEw7CisgICAgICAgICAgICBuZXdfcXVldWUtPnRxX3ByZXZfY2hpbGQgID0gTlVMTDsKKyAgICAgICAgICAgIG5ld19xdWV1ZS0+dHFfcmVmX2NvdW50ICAgPSAxOyAgICAgIC8qIGZvciB0aGlzIHRoZSB0aHJlYWQgdGhhdCBidWlsdCB0aGUgcXVldWUgKi8KKworICAgICAgICAgICAgS01QX0RFQlVHX1JFRl9DVFMoKCJsaW5lICVkIGd0aWQgJWQ6IFEgJXAgYWxsb2MgJWRcbiIsCisgICAgICAgICAgICAgIF9fTElORV9fLCBnbG9iYWxfdGlkLCBuZXdfcXVldWUsIG5ld19xdWV1ZS0+dHFfcmVmX2NvdW50KSk7CisKKyAgICAgICAgICAgIF9fa21wX2FjcXVpcmVfbG9jaygmIGN1cnJfcXVldWUtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKworICAgICAgICAgICAgS01QX01CKCk7ICAvKiBtYWtlIHN1cmUgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBpbiBjb25zaXN0ZW50IHN0YXRlIGJlZm9yZSBxdWVyeWluZyB0aGVtICovCisgICAgICAgICAgICAgICAgICAgICAgIC8qIFNlZW1zIHRvIHdvcmsgZmluZSB3aXRob3V0IHRoaXMgY2FsbCBmb3IgZGlnaXRhbC9hbHBoYSwgbmVlZGVkIGZvciBJQk0vUlM2MDAwICovCisKKyAgICAgICAgICAgIG5ld19xdWV1ZS0+dHFfbmV4dF9jaGlsZCA9IChzdHJ1Y3Qga21wY190YXNrX3F1ZXVlX3QgKikgY3Vycl9xdWV1ZS0+dHFfZmlyc3RfY2hpbGQ7CisKKyAgICAgICAgICAgIGlmIChjdXJyX3F1ZXVlLT50cV9maXJzdF9jaGlsZCAhPSBOVUxMKQorICAgICAgICAgICAgICAgIGN1cnJfcXVldWUtPnRxX2ZpcnN0X2NoaWxkLT50cV9wcmV2X2NoaWxkID0gbmV3X3F1ZXVlOworCisgICAgICAgICAgICBjdXJyX3F1ZXVlLT50cV9maXJzdF9jaGlsZCA9IG5ld19xdWV1ZTsKKworICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9sb2NrKCYgY3Vycl9xdWV1ZS0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworICAgICAgICB9CisKKyAgICAgICAgLyogc2V0IHVwIHRodW5rIHN0YWNrIG9ubHkgYWZ0ZXIgY29kZSB0aGF0IGRldGVybWluZXMgY3Vycl9xdWV1ZSBhYm92ZSAqLworICAgICAgICBuZXdfdGFza3FfdGh1bmstPnRoX2VuY2xfdGh1bmsgPSB0cS0+dHFfY3Vycl90aHVua1t0aWRdOworICAgICAgICB0cS0+dHFfY3Vycl90aHVua1t0aWRdID0gbmV3X3Rhc2txX3RodW5rOworCisgICAgICAgIEtGX0RVTVAoIDIwMCwgX19rbXBfZHVtcF90aHVua19zdGFjayggdHEtPnRxX2N1cnJfdGh1bmtbdGlkXSwgZ2xvYmFsX3RpZCApKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIG5ld190YXNrcV90aHVuay0+dGhfZW5jbF90aHVuayA9IDA7CisgICAgICAgIG5ld19xdWV1ZS0+dHEudHFfcGFyZW50ICAgPSBOVUxMOworICAgICAgICBuZXdfcXVldWUtPnRxX2ZpcnN0X2NoaWxkID0gTlVMTDsKKyAgICAgICAgbmV3X3F1ZXVlLT50cV9uZXh0X2NoaWxkICA9IE5VTEw7CisgICAgICAgIG5ld19xdWV1ZS0+dHFfcHJldl9jaGlsZCAgPSBOVUxMOworICAgICAgICBuZXdfcXVldWUtPnRxX3JlZl9jb3VudCAgID0gMTsKKyAgICB9CisKKyNpZmRlZiBLTVBfREVCVUcKKyAgICBLRl9UUkFDRSgxNTAsICgiQ3JlYXRpbmcgVGFza1EgVGFzayBvbiAoJWQpOlxuIiwgZ2xvYmFsX3RpZCkpOworICAgIEtGX0RVTVAoMTUwLCBfX2ttcF9kdW1wX3RodW5rKCB0cSwgbmV3X3Rhc2txX3RodW5rLCBnbG9iYWxfdGlkICkpOworCisgICAgaWYgKGluX3BhcmFsbGVsKSB7CisgICAgICAgIEtGX1RSQUNFKDI1LCAoIkFmdGVyIFRhc2tRIGF0ICVwIENyZWF0aW9uIG9uICglZCk6XG4iLCBuZXdfcXVldWUsIGdsb2JhbF90aWQpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBLRl9UUkFDRSgyNSwgKCJBZnRlciBTZXJpYWwgVGFza1EgYXQgJXAgQ3JlYXRpb24gb24gKCVkKTpcbiIsIG5ld19xdWV1ZSwgZ2xvYmFsX3RpZCkpOworICAgIH0KKworICAgIEtGX0RVTVAoMjUsIF9fa21wX2R1bXBfdGFza19xdWV1ZSggdHEsIG5ld19xdWV1ZSwgZ2xvYmFsX3RpZCApKTsKKworICAgIGlmIChpbl9wYXJhbGxlbCkgeworICAgICAgICBLRl9EVU1QKDUwLCBfX2ttcF9kdW1wX3Rhc2tfcXVldWVfdHJlZSggdHEsIHRxLT50cV9yb290LCBnbG9iYWxfdGlkICkpOworICAgIH0KKyNlbmRpZiAvKiBLTVBfREVCVUcgKi8KKworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkKKyAgICAgICAgX19rbXBfcHVzaF93b3Jrc2hhcmUoIGdsb2JhbF90aWQsIGN0X3Rhc2txLCBuZXdfcXVldWUtPnRxX2xvYyApOworCisgICAgS0VfVFJBQ0UoIDEwLCAoIl9fa21wY190YXNrcSByZXR1cm4gKCVkKVxuIiwgZ2xvYmFsX3RpZCkpOworCisgICAgcmV0dXJuIG5ld190YXNrcV90aHVuazsKK30KKworCisvKiAgZW5kcyBhIHRhc2txOyBsYXN0IHRocmVhZCBvdXQgZGVzdHJveXMgdGhlIHF1ZXVlICAqLworCit2b2lkCitfX2ttcGNfZW5kX3Rhc2txKGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQsIGttcGNfdGh1bmtfdCAqdGFza3FfdGh1bmspCit7CisjaWZkZWYgS01QX0RFQlVHCisgICAga21wX2ludDMyICAgICAgICAgICBpOworI2VuZGlmCisgICAga21wX3Rhc2txX3QgICAgICAgICp0cTsKKyAgICBpbnQgICAgICAgICAgICAgICAgIGluX3BhcmFsbGVsOworICAgIGttcF9pbmZvX3QgICAgICAgICAqdGg7CisgICAga21wX2ludDMyICAgICAgICAgICBpc19vdXRlcm1vc3Q7CisgICAga21wY190YXNrX3F1ZXVlX3QgICpxdWV1ZTsKKyAgICBrbXBjX3RodW5rX3QgICAgICAgKnRodW5rOworICAgIGludCAgICAgICAgICAgICAgICAgbnByb2M7CisKKyAgICBLRV9UUkFDRSggMTAsICgiX19rbXBjX2VuZF90YXNrcSBjYWxsZWQgKCVkKVxuIiwgZ2xvYmFsX3RpZCkpOworCisgICAgdHEgPSAmIF9fa21wX3RocmVhZHNbZ2xvYmFsX3RpZF0gLT4gdGgudGhfdGVhbSAtPiB0LnRfdGFza3E7CisgICAgbnByb2MgPSBfX2ttcF90aHJlYWRzW2dsb2JhbF90aWRdIC0+IHRoLnRoX3RlYW0gLT4gdC50X25wcm9jOworCisgICAgLyogRm9yIHRoZSBvdXRlcm1vc3QgdGFza3Egb25seSwgYWxsIGJ1dCBvbmUgdGhyZWFkIHdpbGwgaGF2ZSB0YXNrcV90aHVuayA9PSBOVUxMICovCisgICAgcXVldWUgPSAodGFza3FfdGh1bmsgPT0gTlVMTCkgPyB0cS0+dHFfcm9vdCA6IHRhc2txX3RodW5rLT50aC50aF9zaGFyZWRzLT5zdl9xdWV1ZTsKKworICAgIEtFX1RSQUNFKCA1MCwgKCJfX2ttcGNfZW5kX3Rhc2txIHF1ZXVlPSVwICglZCkgXG4iLCBxdWV1ZSwgZ2xvYmFsX3RpZCkpOworICAgIGlzX291dGVybW9zdCA9IChxdWV1ZSA9PSB0cS0+dHFfcm9vdCk7CisgICAgaW5fcGFyYWxsZWwgPSAocXVldWUtPnRxX2ZsYWdzICYgVFFGX1BBUkFMTEVMX0NPTlRFWFQpOworCisgICAgaWYgKGluX3BhcmFsbGVsKSB7CisgICAgICAgIGttcF91aW50MzIgc3BpbnM7CisKKyAgICAgICAgLyogdGhpcyBpcyBqdXN0IGEgc2FmZWd1YXJkIHRvIHJlbGVhc2UgdGhlIHdhaXRpbmcgdGhyZWFkcyBpZiAqLworICAgICAgICAvKiB0aGUgb3V0ZXJtb3N0IHRhc2txIG5ldmVyIHF1ZXVlcyBhIHRhc2sgICAgICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgaWYgKGlzX291dGVybW9zdCAmJiAoS01QX01BU1RFUl9HVElEKCBnbG9iYWxfdGlkICkpKSB7CisgICAgICAgICAgICBpZiggdHEtPnRxX2dsb2JhbF9mbGFncyAmIFRRRl9SRUxFQVNFX1dPUktFUlMgKSB7CisgICAgICAgICAgICAgICAgLyogbm8gbG9jayBuZWVkZWQsIHdvcmtlcnMgYXJlIHN0aWxsIGluIHNwaW4gbW9kZSAqLworICAgICAgICAgICAgICAgIHRxLT50cV9nbG9iYWxfZmxhZ3MgJj0gflRRRl9SRUxFQVNFX1dPUktFUlM7CisKKyAgICAgICAgICAgICAgICBfX2ttcF9lbmRfc3BsaXRfYmFycmllciggYnNfcGxhaW5fYmFycmllciwgZ2xvYmFsX3RpZCApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoga2VlcCBkZXF1ZXVlaW5nIHdvcmsgdW50aWwgYWxsIHRhc2tzIGFyZSBxdWV1ZWQgYW5kIGRlcXVldWVkICovCisKKyAgICAgICAgZG8geworICAgICAgICAgICAgLyogd2FpdCB1bnRpbCBzb21ldGhpbmcgaXMgYXZhaWxhYmxlIHRvIGRlcXVldWUgKi8KKyAgICAgICAgICAgIEtNUF9JTklUX1lJRUxEKHNwaW5zKTsKKworICAgICAgICAgICAgd2hpbGUgKCAocXVldWUtPnRxX25mdWxsID09IDApCisgICAgICAgICAgICAgICAgICYmIChxdWV1ZS0+dHFfdGFza3Ffc2xvdCA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAmJiAoISBfX2ttcF90YXNrcV9oYXNfYW55X2NoaWxkcmVuKHF1ZXVlKSApCisgICAgICAgICAgICAgICAgICYmICghIChxdWV1ZS0+dHFfZmxhZ3MgJiBUUUZfQUxMX1RBU0tTX1FVRVVFRCkgKQorICAgICAgICAgICAgICAgICAgKSB7CisgICAgICAgICAgICAgICAgS01QX1lJRUxEX1dIRU4oIFRSVUUsIHNwaW5zICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGNoZWNrIHRvIHNlZSBpZiB3ZSBjYW4gZXhlY3V0ZSB0YXNrcyBpbiB0aGUgcXVldWUgKi8KKyAgICAgICAgICAgIHdoaWxlICggKCAocXVldWUtPnRxX25mdWxsICE9IDApIHx8IChxdWV1ZS0+dHFfdGFza3Ffc2xvdCAhPSBOVUxMKSApCisgICAgICAgICAgICAgICAgICYmICh0aHVuayA9IF9fa21wX2ZpbmRfdGFza19pbl9xdWV1ZShnbG9iYWxfdGlkLCBxdWV1ZSkpICE9IE5VTEwKKyAgICAgICAgICAgICAgICAgICkgeworICAgICAgICAgICAgICAgIEtGX1RSQUNFKDUwLCAoIkZvdW5kIHRodW5rOiAlcCBpbiBwcmltYXJ5IHF1ZXVlICVwICglZClcbiIsIHRodW5rLCBxdWV1ZSwgZ2xvYmFsX3RpZCkpOworICAgICAgICAgICAgICAgIF9fa21wX2V4ZWN1dGVfdGFza19mcm9tX3F1ZXVlKCB0cSwgbG9jLCBnbG9iYWxfdGlkLCB0aHVuaywgaW5fcGFyYWxsZWwgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogc2VlIGlmIHdvcmsgZm91bmQgY2FuIGJlIGZvdW5kIGluIGEgZGVzY2VuZGFudCBxdWV1ZSAqLworICAgICAgICAgICAgaWYgKCAoX19rbXBfdGFza3FfaGFzX2FueV9jaGlsZHJlbihxdWV1ZSkpCisgICAgICAgICAgICAgICYmICh0aHVuayA9IF9fa21wX2ZpbmRfdGFza19pbl9kZXNjZW5kYW50X3F1ZXVlKGdsb2JhbF90aWQsIHF1ZXVlKSkgIT0gTlVMTAorICAgICAgICAgICAgICAgKSB7CisKKyAgICAgICAgICAgICAgICBLRl9UUkFDRSg1MCwgKCJTdG9sZSB0aHVuazogJXAgaW4gZGVzY2VuZGFudCBxdWV1ZTogJXAgd2hpbGUgd2FpdGluZyBpbiBxdWV1ZTogJXAgKCVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgdGh1bmssIHRodW5rLT50aC50aF9zaGFyZWRzLT5zdl9xdWV1ZSwgcXVldWUsIGdsb2JhbF90aWQgKSk7CisKKyAgICAgICAgICAgICAgICBfX2ttcF9leGVjdXRlX3Rhc2tfZnJvbV9xdWV1ZSggdHEsIGxvYywgZ2xvYmFsX3RpZCwgdGh1bmssIGluX3BhcmFsbGVsICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSB3aGlsZSAoICghIChxdWV1ZS0+dHFfZmxhZ3MgJiBUUUZfQUxMX1RBU0tTX1FVRVVFRCkpCisgICAgICAgICAgICAgICB8fCAocXVldWUtPnRxX25mdWxsICE9IDApCisgICAgICAgICAgICAgICAgKTsKKworICAgICAgICBLRl9UUkFDRSg1MCwgKCJBbGwgdGFza3MgcXVldWVkIGFuZCBkZXF1ZXVlZCBpbiBxdWV1ZTogJXAgKCVkKVxuIiwgcXVldWUsIGdsb2JhbF90aWQpKTsKKworICAgICAgICAvKiB3YWl0IHdoaWxlIGFsbCB0YXNrcyBhcmUgbm90IGZpbmlzaGVkIGFuZCBtb3JlIHdvcmsgZm91bmQKKyAgICAgICAgICAgaW4gZGVzY2VuZGFudCBxdWV1ZXMgKi8KKworICAgICAgICB3aGlsZSAoICghX19rbXBfdGFza3FfdGFza3NfZmluaXNoZWQocXVldWUpKQorICAgICAgICAgICAgICYmICh0aHVuayA9IF9fa21wX2ZpbmRfdGFza19pbl9kZXNjZW5kYW50X3F1ZXVlKGdsb2JhbF90aWQsIHF1ZXVlKSkgIT0gTlVMTAorICAgICAgICAgICAgICApIHsKKworICAgICAgICAgICAgS0ZfVFJBQ0UoNTAsICgiU3RvbGUgdGh1bms6ICVwIGluIGRlc2NlbmRhbnQgcXVldWU6ICVwIHdoaWxlIHdhaXRpbmcgaW4gcXVldWU6ICVwICglZClcbiIsCisgICAgICAgICAgICAgICAgdGh1bmssIHRodW5rLT50aC50aF9zaGFyZWRzLT5zdl9xdWV1ZSwgcXVldWUsIGdsb2JhbF90aWQpKTsKKworICAgICAgICAgICAgX19rbXBfZXhlY3V0ZV90YXNrX2Zyb21fcXVldWUoIHRxLCBsb2MsIGdsb2JhbF90aWQsIHRodW5rLCBpbl9wYXJhbGxlbCApOworICAgICAgICB9CisKKyAgICAgICAgS0ZfVFJBQ0UoNTAsICgiTm8gd29yayBmb3VuZCBpbiBkZXNjZW5kZW50IHF1ZXVlcyBvciBhbGwgd29yayBmaW5pc2hlZCBpbiBxdWV1ZTogJXAgKCVkKVxuIiwgcXVldWUsIGdsb2JhbF90aWQpKTsKKworICAgICAgICBpZiAoIWlzX291dGVybW9zdCkgeworICAgICAgICAgICAgLyogbmVlZCB0byByZXR1cm4gaWYgTk9XQUlUIHByZXNlbnQgYW5kIG5vdCBvdXRlcm1vc3QgdGFza3EgKi8KKworICAgICAgICAgICAgaWYgKHF1ZXVlLT50cV9mbGFncyAmIFRRRl9JU19OT1dBSVQpIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9hY3F1aXJlX2xvY2soJiBxdWV1ZS0+dHEudHFfcGFyZW50LT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisgICAgICAgICAgICAgICAgcXVldWUtPnRxX3JlZl9jb3VudC0tOworICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHF1ZXVlLT50cV9yZWZfY291bnQgPj0gMCApOworICAgICAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfbG9jaygmIHF1ZXVlLT50cS50cV9wYXJlbnQtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKworICAgICAgICAgICAgICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcGNfZW5kX3Rhc2txIHJldHVybiBmb3Igbm93YWl0IGNhc2UgKCVkKVxuIiwgZ2xvYmFsX3RpZCkpOworCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfX2ttcF9maW5kX2FuZF9yZW1vdmVfZmluaXNoZWRfY2hpbGRfdGFza3EoIHRxLCBnbG9iYWxfdGlkLCBxdWV1ZSApOworCisgICAgICAgICAgICAvKiBXQUlUIHVudGlsIGFsbCB0YXNrcyBhcmUgZmluaXNoZWQgYW5kIG5vIGNoaWxkIHF1ZXVlcyBleGlzdCBiZWZvcmUgcHJvY2VlZGluZyAqLworICAgICAgICAgICAgS01QX0lOSVRfWUlFTEQoc3BpbnMpOworCisgICAgICAgICAgICB3aGlsZSAoIV9fa21wX3Rhc2txX3Rhc2tzX2ZpbmlzaGVkKHF1ZXVlKSB8fCBfX2ttcF90YXNrcV9oYXNfYW55X2NoaWxkcmVuKHF1ZXVlKSkgeworICAgICAgICAgICAgICAgIHRodW5rID0gX19rbXBfZmluZF90YXNrX2luX2FuY2VzdG9yX3F1ZXVlKCB0cSwgZ2xvYmFsX3RpZCwgcXVldWUgKTsKKworICAgICAgICAgICAgICAgIGlmICh0aHVuayAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIEtGX1RSQUNFKDUwLCAoIlN0b2xlIHRodW5rOiAlcCBpbiBhbmNlc3RvciBxdWV1ZTogJXAgd2hpbGUgd2FpdGluZyBpbiBxdWV1ZTogJXAgKCVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHVuaywgdGh1bmstPnRoLnRoX3NoYXJlZHMtPnN2X3F1ZXVlLCBxdWV1ZSwgZ2xvYmFsX3RpZCkpOworICAgICAgICAgICAgICAgICAgICBfX2ttcF9leGVjdXRlX3Rhc2tfZnJvbV9xdWV1ZSggdHEsIGxvYywgZ2xvYmFsX3RpZCwgdGh1bmssIGluX3BhcmFsbGVsICk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgS01QX1lJRUxEX1dIRU4oIHRodW5rID09IE5VTEwsIHNwaW5zICk7CisKKyAgICAgICAgICAgICAgICBfX2ttcF9maW5kX2FuZF9yZW1vdmVfZmluaXNoZWRfY2hpbGRfdGFza3EoIHRxLCBnbG9iYWxfdGlkLCBxdWV1ZSApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfX2ttcF9hY3F1aXJlX2xvY2soJiBxdWV1ZS0+dHFfcXVldWVfbGNrLCBnbG9iYWxfdGlkKTsKKyAgICAgICAgICAgIGlmICggIShxdWV1ZS0+dHFfZmxhZ3MgJiBUUUZfREVBTExPQ0FURUQpICkgeworICAgICAgICAgICAgICAgIHF1ZXVlLT50cV9mbGFncyB8PSBUUUZfREVBTExPQ0FURUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX2xvY2soJiBxdWV1ZS0+dHFfcXVldWVfbGNrLCBnbG9iYWxfdGlkKTsKKworICAgICAgICAgICAgLyogb25seSB0aGUgYWxsb2NhdGluZyB0aHJlYWQgY2FuIGRlYWxsb2NhdGUgdGhlIHF1ZXVlICovCisgICAgICAgICAgICBpZiAodGFza3FfdGh1bmsgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIF9fa21wX3JlbW92ZV9xdWV1ZV9mcm9tX3RyZWUoIHRxLCBnbG9iYWxfdGlkLCBxdWV1ZSwgVFJVRSApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBLRV9UUkFDRSggMTAsICgiX19rbXBjX2VuZF90YXNrcSByZXR1cm4gZm9yIG5vbl9vdXRlcm1vc3QgcXVldWUsIHdhaXQgY2FzZSAoJWQpXG4iLCBnbG9iYWxfdGlkKSk7CisKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8qIE91dGVybW9zdCBRdWV1ZTogc3RlYWwgd29yayBmcm9tIGRlc2NlbmRhbnRzIHVudGlsIGFsbCB0YXNrcyBhcmUgZmluaXNoZWQgKi8KKworICAgICAgICBLTVBfSU5JVF9ZSUVMRChzcGlucyk7CisKKyAgICAgICAgd2hpbGUgKCFfX2ttcF90YXNrcV90YXNrc19maW5pc2hlZChxdWV1ZSkpIHsKKyAgICAgICAgICAgIHRodW5rID0gX19rbXBfZmluZF90YXNrX2luX2Rlc2NlbmRhbnRfcXVldWUoZ2xvYmFsX3RpZCwgcXVldWUpOworCisgICAgICAgICAgICBpZiAodGh1bmsgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIEtGX1RSQUNFKDUwLCAoIlN0b2xlIHRodW5rOiAlcCBpbiBkZXNjZW5kYW50IHF1ZXVlOiAlcCB3aGlsZSB3YWl0aW5nIGluIHF1ZXVlOiAlcCAoJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICB0aHVuaywgdGh1bmstPnRoLnRoX3NoYXJlZHMtPnN2X3F1ZXVlLCBxdWV1ZSwgZ2xvYmFsX3RpZCkpOworCisgICAgICAgICAgICAgICAgX19rbXBfZXhlY3V0ZV90YXNrX2Zyb21fcXVldWUoIHRxLCBsb2MsIGdsb2JhbF90aWQsIHRodW5rLCBpbl9wYXJhbGxlbCApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBLTVBfWUlFTERfV0hFTiggdGh1bmsgPT0gTlVMTCwgc3BpbnMgKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIE5lZWQgdGhpcyBiYXJyaWVyIHRvIHByZXZlbnQgZGVzdHJ1Y3Rpb24gb2YgcXVldWUgYmVmb3JlIHRocmVhZHMgaGF2ZSBhbGwgZXhlY3V0ZWQgYWJvdmUgY29kZSAqLworICAgICAgICAvKiBUaGlzIG1heSBuZWVkIHRvIGJlIGRvbmUgZWFybGllciB3aGVuIE5PV0FJVCBpcyBpbXBsZW1lbnRlZCBmb3IgdGhlIG91dGVybW9zdCBsZXZlbCAqLworCisgICAgICAgIGlmICggIV9fa21wX2JhcnJpZXIoIGJzX3BsYWluX2JhcnJpZXIsIGdsb2JhbF90aWQsIFRSVUUsIDAsIE5VTEwsIE5VTEwgKSkgeworICAgICAgICAgICAgLyogdGhlIHF1ZXVlLT50cV9mbGFncyAmIFRRRl9JU19OT1dBSVQgY2FzZSBpcyBub3QgeWV0IGhhbmRsZWQgaGVyZTsgICAqLworICAgICAgICAgICAgLyogZm9yIHJpZ2h0IG5vdywgZXZlcnlib2R5IHdhaXRzLCBhbmQgdGhlIG1hc3RlciB0aHJlYWQgZGVzdHJveXMgdGhlICAqLworICAgICAgICAgICAgLyogcmVtYWluaW5nIHF1ZXVlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgICAgICAgICBfX2ttcF9yZW1vdmVfYWxsX2NoaWxkX3Rhc2txKCB0cSwgZ2xvYmFsX3RpZCwgcXVldWUgKTsKKworICAgICAgICAgICAgLyogTm93IGRlc3Ryb3kgdGhlIHJvb3QgcXVldWUgKi8KKyAgICAgICAgICAgIEtGX1RSQUNFKDEwMCwgKCJUIyVkIEJlZm9yZSBEZWxldGlvbiBvZiB0b3AtbGV2ZWwgVGFza1EgYXQgJXA6XG4iLCBnbG9iYWxfdGlkLCBxdWV1ZSApKTsKKyAgICAgICAgICAgIEtGX0RVTVAoMTAwLCBfX2ttcF9kdW1wX3Rhc2tfcXVldWUoIHRxLCBxdWV1ZSwgZ2xvYmFsX3RpZCApKTsKKworI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAgICAgLyogIHRoZSByb290IHF1ZXVlIGVudHJ5ICAqLworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCAoKHF1ZXVlLT50cS50cV9wYXJlbnQgPT0gTlVMTCkgJiYgKHF1ZXVlLT50cV9uZXh0X2NoaWxkID09IE5VTEwpKTsKKworICAgICAgICAgICAgLyogIGNoaWxkcmVuIG11c3QgYWxsIGJlIGdvbmUgYnkgbm93IGJlY2F1c2Ugb2YgYmFycmllciBhYm92ZSAqLworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCAocXVldWUtPnRxX2ZpcnN0X2NoaWxkID09IE5VTEwpOworCisgICAgICAgICAgICBmb3IgKGk9MDsgaTxucHJvYzsgaSsrKSB7CisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChxdWV1ZS0+dHFfdGhfdGh1bmtzW2ldLmFpX2RhdGEgPT0gMCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoaT0wLCB0aHVuaz1xdWV1ZS0+dHFfZnJlZV90aHVua3M7IHRodW5rICE9IE5VTEw7IGkrKywgdGh1bms9dGh1bmstPnRoLnRoX25leHRfZnJlZSk7CisKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQgKGkgPT0gcXVldWUtPnRxX25zbG90cyArIChucHJvYyAqIF9fS01QX1RBU0tRX1RIVU5LU19QRVJfVEgpKTsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG5wcm9jOyBpKyspIHsKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCAhIHRxLT50cV9jdXJyX3RodW5rW2ldICk7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgIC8qICB1bmxpbmsgdGhlIHJvb3QgcXVldWUgZW50cnkgICovCisgICAgICAgICAgICB0cSAtPiB0cV9yb290ID0gIE5VTEw7CisKKyAgICAgICAgICAgIC8qICByZWxlYXNlIHN0b3JhZ2UgZm9yIHJvb3QgcXVldWUgZW50cnkgICovCisgICAgICAgICAgICBLRl9UUkFDRSg1MCwgKCJBZnRlciBEZWxldGlvbiBvZiB0b3AtbGV2ZWwgVGFza1EgYXQgJXAgb24gKCVkKTpcbiIsIHF1ZXVlLCBnbG9iYWxfdGlkKSk7CisKKyAgICAgICAgICAgIHF1ZXVlLT50cV9mbGFncyB8PSBUUUZfREVBTExPQ0FURUQ7CisgICAgICAgICAgICBfX2ttcF9mcmVlX3Rhc2txICggdHEsIHF1ZXVlLCBpbl9wYXJhbGxlbCwgZ2xvYmFsX3RpZCApOworCisgICAgICAgICAgICBLRl9EVU1QKDUwLCBfX2ttcF9kdW1wX3Rhc2tfcXVldWVfdHJlZSggdHEsIHRxLT50cV9yb290LCBnbG9iYWxfdGlkICkpOworCisgICAgICAgICAgICAvKiByZWxlYXNlIHRoZSB3b3JrZXJzIG5vdyB0aGF0IHRoZSBkYXRhIHN0cnVjdHVyZXMgYXJlIHVwIHRvIGRhdGUgKi8KKyAgICAgICAgICAgIF9fa21wX2VuZF9zcGxpdF9iYXJyaWVyKCBic19wbGFpbl9iYXJyaWVyLCBnbG9iYWxfdGlkICk7CisgICAgICAgIH0KKworICAgICAgICB0aCA9IF9fa21wX3RocmVhZHNbIGdsb2JhbF90aWQgXTsKKworICAgICAgICAvKiBSZXNldCBPUkRFUkVEIFNFQ1RJT04gdG8gcGFyYWxsZWwgdmVyc2lvbiAqLworICAgICAgICB0aC0+dGgudGhfZGlzcGF0Y2gtPnRoX2Rlb19mY24gPSAwOworCisgICAgICAgIC8qIFJlc2V0IE9SREVSRUQgU0VDVElPTiB0byBwYXJhbGxlbCB2ZXJzaW9uICovCisgICAgICAgIHRoLT50aC50aF9kaXNwYXRjaC0+dGhfZHhvX2ZjbiA9IDA7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBpbiBzZXJpYWwgZXhlY3V0aW9uIGNvbnRleHQsIGRlcXVldWUgdGhlIGxhc3QgdGFzayAgKi8KKyAgICAgICAgLyogYW5kIGV4ZWN1dGUgaXQsIGlmIHRoZXJlIHdlcmUgYW55IHRhc2tzIGVuY291bnRlcmVkICovCisKKyAgICAgICAgaWYgKHF1ZXVlLT50cV9uZnVsbCA+IDApIHsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQocXVldWUtPnRxX25mdWxsID09IDEpOworCisgICAgICAgICAgICB0aHVuayA9IF9fa21wX2RlcXVldWVfdGFzayhnbG9iYWxfdGlkLCBxdWV1ZSwgaW5fcGFyYWxsZWwpOworCisgICAgICAgICAgICBpZiAocXVldWUtPnRxX2ZsYWdzICYgVFFGX0lTX0xBU1RfVEFTSykgeworICAgICAgICAgICAgICAgIC8qIFRRRl9JU19MQVNUUFJJVkFURSwgb25lIHRoaW5nIGluIHF1ZXVlLCBfX2ttcGNfZW5kX3Rhc2txX3Rhc2soKSAqLworICAgICAgICAgICAgICAgIC8qIGhhcyBiZWVuIHJ1biBzbyB0aGlzIGlzIGxhc3QgdGFzaywgcnVuIHdpdGggVFFGX0lTX0xBU1RfVEFTSyBzbyAqLworICAgICAgICAgICAgICAgIC8qIGluc3RydW1lbnRhdGlvbiBkb2VzIGNvcHktb3V0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgICAgICAgICAgICAgLyogbm8gbmVlZCBmb3IgdGVzdF90aGVuX29yIGNhbGwgc2luY2UgYWxyZWFkeSBsb2NrZWQgKi8KKyAgICAgICAgICAgICAgICB0aHVuay0+dGhfZmxhZ3MgfD0gVFFGX0lTX0xBU1RfVEFTSzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgS0ZfVFJBQ0UoNTAsICgiVCMlZCBmb3VuZCB0aHVuazogJXAgaW4gc2VyaWFsIHF1ZXVlOiAlcFxuIiwgZ2xvYmFsX3RpZCwgdGh1bmssIHF1ZXVlKSk7CisKKyAgICAgICAgICAgIF9fa21wX2V4ZWN1dGVfdGFza19mcm9tX3F1ZXVlKCB0cSwgbG9jLCBnbG9iYWxfdGlkLCB0aHVuaywgaW5fcGFyYWxsZWwgKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGRlc3Ryb3kgdGhlIHVuYXR0YWNoZWQgc2VyaWFsIHF1ZXVlIG5vdyB0aGF0IHRoZXJlIGlzIG5vIG1vcmUgd29yayB0byBkbyAqLworICAgICAgICBLRl9UUkFDRSgxMDAsICgiQmVmb3JlIERlbGV0aW9uIG9mIFNlcmlhbGl6ZWQgVGFza1EgYXQgJXAgb24gKCVkKTpcbiIsIHF1ZXVlLCBnbG9iYWxfdGlkKSk7CisgICAgICAgIEtGX0RVTVAoMTAwLCBfX2ttcF9kdW1wX3Rhc2tfcXVldWUoIHRxLCBxdWV1ZSwgZ2xvYmFsX3RpZCApKTsKKworI2lmZGVmIEtNUF9ERUJVRworICAgICAgICBpID0gMDsKKyAgICAgICAgZm9yICh0aHVuaz1xdWV1ZS0+dHFfZnJlZV90aHVua3M7IHRodW5rICE9IE5VTEw7IHRodW5rPXRodW5rLT50aC50aF9uZXh0X2ZyZWUpCisgICAgICAgICAgICArK2k7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQgKGkgPT0gcXVldWUtPnRxX25zbG90cyArIDEpOworI2VuZGlmCisgICAgICAgIC8qICByZWxlYXNlIHN0b3JhZ2UgZm9yIHVuYXR0YWNoZWQgc2VyaWFsIHF1ZXVlICAqLworICAgICAgICBLRl9UUkFDRSg1MCwgKCJTZXJpYWxpemVkIFRhc2tRIGF0ICVwIGRlbGV0ZWQgb24gKCVkKS5cbiIsIHF1ZXVlLCBnbG9iYWxfdGlkKSk7CisKKyAgICAgICAgcXVldWUtPnRxX2ZsYWdzIHw9IFRRRl9ERUFMTE9DQVRFRDsKKyAgICAgICAgX19rbXBfZnJlZV90YXNrcSAoIHRxLCBxdWV1ZSwgaW5fcGFyYWxsZWwsIGdsb2JhbF90aWQgKTsKKyAgICB9CisKKyAgICBLRV9UUkFDRSggMTAsICgiX19rbXBjX2VuZF90YXNrcSByZXR1cm4gKCVkKVxuIiwgZ2xvYmFsX3RpZCkpOworfQorCisvKiAgRW5xdWV1ZXMgYSB0YXNrIGZvciB0aHVuayBwcmV2aW91c2x5IGNyZWF0ZWQgYnkgX19rbXBjX3Rhc2tfYnVmZmVyLiAqLworLyogIFJldHVybnMgbm9uemVybyBpZiBqdXN0IGZpbGxlZCB1cCBxdWV1ZSAgKi8KKwora21wX2ludDMyCitfX2ttcGNfdGFzayhpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBjX3RodW5rX3QgKnRodW5rKQoreworICAgIGttcF9pbnQzMiAgICAgICAgICByZXQ7CisgICAga21wY190YXNrX3F1ZXVlX3QgKnF1ZXVlOworICAgIGludCAgICAgICAgICAgICAgICBpbl9wYXJhbGxlbDsKKyAgICBrbXBfdGFza3FfdCAgICAgICAqdHE7CisKKyAgICBLRV9UUkFDRSggMTAsICgiX19rbXBjX3Rhc2sgY2FsbGVkICglZClcbiIsIGdsb2JhbF90aWQpKTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQgKCEodGh1bmstPnRoX2ZsYWdzICYgVFFGX1RBU0tRX1RBU0spKTsgIC8qICB0aHVuay0+dGhfdGFzayBpcyBhIHJlZ3VsYXIgdGFzayAgKi8KKworICAgIHRxICAgICAgICAgID0gJl9fa21wX3RocmVhZHNbZ2xvYmFsX3RpZF0gLT4gdGgudGhfdGVhbSAtPiB0LnRfdGFza3E7CisgICAgcXVldWUgICAgICAgPSB0aHVuay0+dGgudGhfc2hhcmVkcy0+c3ZfcXVldWU7CisgICAgaW5fcGFyYWxsZWwgPSAocXVldWUtPnRxX2ZsYWdzICYgVFFGX1BBUkFMTEVMX0NPTlRFWFQpOworCisgICAgaWYgKGluX3BhcmFsbGVsICYmICh0aHVuay0+dGhfZmxhZ3MgJiBUUUZfSVNfT1JERVJFRCkpCisgICAgICAgIHRodW5rLT50aF90YXNrbnVtID0gKytxdWV1ZS0+dHFfdGFza251bV9xdWV1aW5nOworCisgICAgLyogRm9yIHNlcmlhbCBleGVjdXRpb24gZGVxdWV1ZSB0aGUgcHJlY2VkaW5nIHRhc2sgYW5kIGV4ZWN1dGUgaXQsIGlmIG9uZSBleGlzdHMgKi8KKyAgICAvKiBUaGlzIGNhbm5vdCBiZSB0aGUgbGFzdCB0YXNrLiAgVGhhdCBvbmUgaXMgaGFuZGxlZCBpbiBfX2ttcGNfZW5kX3Rhc2txICovCisKKyAgICBpZiAoIWluX3BhcmFsbGVsICYmIHF1ZXVlLT50cV9uZnVsbCA+IDApIHsKKyAgICAgICAga21wY190aHVua190ICpwcmV2X3RodW5rOworCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQocXVldWUtPnRxX25mdWxsID09IDEpOworCisgICAgICAgIHByZXZfdGh1bmsgPSBfX2ttcF9kZXF1ZXVlX3Rhc2soZ2xvYmFsX3RpZCwgcXVldWUsIGluX3BhcmFsbGVsKTsKKworICAgICAgICBLRl9UUkFDRSg1MCwgKCJUIyVkIGZvdW5kIHRodW5rOiAlcCBpbiBzZXJpYWwgcXVldWU6ICVwXG4iLCBnbG9iYWxfdGlkLCBwcmV2X3RodW5rLCBxdWV1ZSkpOworCisgICAgICAgIF9fa21wX2V4ZWN1dGVfdGFza19mcm9tX3F1ZXVlKCB0cSwgbG9jLCBnbG9iYWxfdGlkLCBwcmV2X3RodW5rLCBpbl9wYXJhbGxlbCApOworICAgIH0KKworICAgIC8qIFRoZSBpbnN0cnVtZW50YXRpb24gc2VxdWVuY2UgaXM6ICBfX2ttcGNfdGFza19idWZmZXIoKSwgaW5pdGlhbGl6ZSBwcml2YXRlICAgICovCisgICAgLyogdmFyaWFibGVzLCBfX2ttcGNfdGFzaygpLiAgVGhlIF9fa21wY190YXNrX2J1ZmZlciByb3V0aW5lIGNoZWNrcyB0aGF0IHRoZSAgICAgKi8KKyAgICAvKiB0YXNrIHF1ZXVlIGlzIG5vdCBmdWxsIGFuZCBhbGxvY2F0ZXMgYSB0aHVuayAod2hpY2ggaXMgdGhlbiBwYXNzZWQgdG8gICAgICAgICAqLworICAgIC8qIF9fa21wY190YXNrKCkpLiAgU28sIHRoZSBlbnF1ZXVlIGJlbG93IHNob3VsZCBuZXZlciBmYWlsIGR1ZSB0byBhIGZ1bGwgcXVldWUuICovCisKKyAgICBLRl9UUkFDRSgxMDAsICgiQWZ0ZXIgZW5xdWV1ZWluZyB0aGlzIFRhc2sgb24gKCVkKTpcbiIsIGdsb2JhbF90aWQpKTsKKyAgICBLRl9EVU1QKDEwMCwgX19rbXBfZHVtcF90aHVuayggdHEsIHRodW5rLCBnbG9iYWxfdGlkICkpOworCisgICAgcmV0ID0gX19rbXBfZW5xdWV1ZV90YXNrICggdHEsIGdsb2JhbF90aWQsIHF1ZXVlLCB0aHVuaywgaW5fcGFyYWxsZWwgKTsKKworICAgIEtGX1RSQUNFKDEwMCwgKCJUYXNrIFF1ZXVlIGxvb2tzIGxpa2UgdGhpcyBvbiAoJWQpOlxuIiwgZ2xvYmFsX3RpZCkpOworICAgIEtGX0RVTVAoMTAwLCBfX2ttcF9kdW1wX3Rhc2tfcXVldWUoIHRxLCBxdWV1ZSwgZ2xvYmFsX3RpZCApKTsKKworICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcGNfdGFzayByZXR1cm4gKCVkKVxuIiwgZ2xvYmFsX3RpZCkpOworCisgICAgcmV0dXJuIHJldDsKK30KKworLyogIGVucXVldWVzIGEgdGFza3FfdGFzayBmb3IgdGh1bmsgcHJldmlvdXNseSBjcmVhdGVkIGJ5IF9fa21wY190YXNrcSAgKi8KKy8qICB0aGlzIHNob3VsZCBuZXZlciBiZSBjYWxsZWQgdW5sZXNzIGluIGEgcGFyYWxsZWwgY29udGV4dCAgICAgICAgICAgICovCisKK3ZvaWQKK19fa21wY190YXNrcV90YXNrKGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQsIGttcGNfdGh1bmtfdCAqdGh1bmssIGttcF9pbnQzMiBzdGF0dXMpCit7CisgICAga21wY190YXNrX3F1ZXVlX3QgKnF1ZXVlOworICAgIGttcF90YXNrcV90ICAgICAgICp0cSAgPSAmX19rbXBfdGhyZWFkc1tnbG9iYWxfdGlkXSAtPiB0aC50aF90ZWFtIC0+IHQudF90YXNrcTsKKyAgICBpbnQgICAgICAgICAgICAgICAgdGlkID0gX19rbXBfdGlkX2Zyb21fZ3RpZCggZ2xvYmFsX3RpZCApOworCisgICAgS0VfVFJBQ0UoIDEwLCAoIl9fa21wY190YXNrcV90YXNrIGNhbGxlZCAoJWQpXG4iLCBnbG9iYWxfdGlkKSk7CisgICAgS0ZfVFJBQ0UoMTAwLCAoIlRhc2tRIFRhc2sgYXJndW1lbnQgdGh1bmsgb24gKCVkKTpcbiIsIGdsb2JhbF90aWQpKTsKKyAgICBLRl9EVU1QKDEwMCwgX19rbXBfZHVtcF90aHVuayggdHEsIHRodW5rLCBnbG9iYWxfdGlkICkpOworCisgICAgcXVldWUgPSB0aHVuay0+dGgudGhfc2hhcmVkcy0+c3ZfcXVldWU7CisKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApCisgICAgICAgIF9fa21wX3BvcF93b3Jrc2hhcmUoIGdsb2JhbF90aWQsIGN0X3Rhc2txLCBsb2MgKTsKKworICAgIC8qICB0aHVuay0+dGhfdGFzayBpcyB0aGUgdGFza3FfdGFzayAgKi8KKyAgICBLTVBfREVCVUdfQVNTRVJUICh0aHVuay0+dGhfZmxhZ3MgJiBUUUZfVEFTS1FfVEFTSyk7CisKKyAgICAvKiAgbm90IHN1cHBvc2VkIHRvIGNhbGwgX19rbXBjX3Rhc2txX3Rhc2sgaWYgaXQncyBhbHJlYWR5IGVucXVldWVkICAqLworICAgIEtNUF9ERUJVR19BU1NFUlQgKHF1ZXVlLT50cV90YXNrcV9zbG90ID09IE5VTEwpOworCisgICAgLyogZGVxdWV1ZSB0YXNrcSB0aHVuayBmcm9tIGN1cnJfdGh1bmsgc3RhY2sgKi8KKyAgICB0cS0+dHFfY3Vycl90aHVua1t0aWRdID0gdGh1bmstPnRoX2VuY2xfdGh1bms7CisgICAgdGh1bmstPnRoX2VuY2xfdGh1bmsgPSBOVUxMOworCisgICAgS0ZfRFVNUCggMjAwLCBfX2ttcF9kdW1wX3RodW5rX3N0YWNrKCB0cS0+dHFfY3Vycl90aHVua1t0aWRdLCBnbG9iYWxfdGlkICkpOworCisgICAgdGh1bmstPnRoX3N0YXR1cyA9IHN0YXR1czsKKworICAgIEtNUF9NQigpOyAgLyogIGZsdXNoIHRodW5rLT50aF9zdGF0dXMgYmVmb3JlIHRhc2txX3Rhc2sgZW5xdWV1ZWQgdG8gYXZvaWQgcmFjZSBjb25kaXRpb24gICovCisKKyAgICAvKiAgZW5xdWV1ZSB0YXNrcV90YXNrIGluIHRodW5rIGludG8gc3BlY2lhbCBzbG90IGluIHF1ZXVlICAgICAqLworICAgIC8qIEdFSCAtIHByb2JhYmx5IGRvbid0IG5lZWQgdG8gbG9jayB0YXNrcSBzbG90IHNpbmNlIG9ubHkgb25lICovCisgICAgLyogICAgICAgdGhyZWFkIGVucXVldWVzICYgYWxyZWFkeSBhIGxvY2sgc2V0IGF0IGRlcXVldWUgcG9pbnQgKi8KKworICAgIHF1ZXVlLT50cV90YXNrcV9zbG90ID0gdGh1bms7CisKKyAgICBLRV9UUkFDRSggMTAsICgiX19rbXBjX3Rhc2txX3Rhc2sgcmV0dXJuICglZClcbiIsIGdsb2JhbF90aWQpKTsKK30KKworLyogIGVuZHMgYSB0YXNrcV90YXNrOyBkb25lIGdlbmVyYXRpbmcgdGFza3MgICovCisKK3ZvaWQKK19fa21wY19lbmRfdGFza3FfdGFzayhpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBjX3RodW5rX3QgKnRodW5rKQoreworICAgIGttcF90YXNrcV90ICAgICAgICp0cTsKKyAgICBrbXBjX3Rhc2tfcXVldWVfdCAqcXVldWU7CisgICAgaW50ICAgICAgICAgICAgICAgIGluX3BhcmFsbGVsOworICAgIGludCAgICAgICAgICAgICAgICB0aWQ7CisKKyAgICBLRV9UUkFDRSggMTAsICgiX19rbXBjX2VuZF90YXNrcV90YXNrIGNhbGxlZCAoJWQpXG4iLCBnbG9iYWxfdGlkKSk7CisKKyAgICB0cSAgICAgICAgICA9ICZfX2ttcF90aHJlYWRzW2dsb2JhbF90aWRdIC0+IHRoLnRoX3RlYW0gLT4gdC50X3Rhc2txOworICAgIHF1ZXVlICAgICAgID0gdGh1bmstPnRoLnRoX3NoYXJlZHMtPnN2X3F1ZXVlOworICAgIGluX3BhcmFsbGVsID0gKHF1ZXVlLT50cV9mbGFncyAmIFRRRl9QQVJBTExFTF9DT05URVhUKTsKKyAgICB0aWQgICAgICAgICA9IF9fa21wX3RpZF9mcm9tX2d0aWQoIGdsb2JhbF90aWQgKTsKKworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkKKyAgICAgICAgX19rbXBfcG9wX3dvcmtzaGFyZSggZ2xvYmFsX3RpZCwgY3RfdGFza3EsIGxvYyApOworCisgICAgaWYgKGluX3BhcmFsbGVsKSB7CisjaWYgS01QX0FSQ0hfWDg2IHx8IFwKKyAgICBLTVBfQVJDSF9YODZfNjQKKworICAgICAgICBLTVBfVEVTVF9USEVOX09SMzIoICZxdWV1ZS0+dHFfZmxhZ3MsIChrbXBfaW50MzIpIFRRRl9BTExfVEFTS1NfUVVFVUVEICk7CisjZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBfX2ttcF9hY3F1aXJlX2xvY2soJiBxdWV1ZS0+dHFfcXVldWVfbGNrLCBnbG9iYWxfdGlkKTsKKworICAgICAgICAgICAgS01QX01CKCk7ICAvKiBtYWtlIHN1cmUgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBpbiBjb25zaXN0ZW50IHN0YXRlIGJlZm9yZSBxdWVyeWluZyB0aGVtICovCisgICAgICAgICAgICAgICAgICAgICAgIC8qIFNlZW1zIHRvIHdvcmsgZmluZSB3aXRob3V0IHRoaXMgY2FsbCBmb3IgZGlnaXRhbC9hbHBoYSwgbmVlZGVkIGZvciBJQk0vUlM2MDAwICovCisKKyAgICAgICAgICAgIHF1ZXVlLT50cV9mbGFncyB8PSBUUUZfQUxMX1RBU0tTX1FVRVVFRDsKKworICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9sb2NrKCYgcXVldWUtPnRxX3F1ZXVlX2xjaywgZ2xvYmFsX3RpZCk7CisgICAgICAgIH0KKyNlbmRpZgorICAgIH0KKworICAgIGlmICh0aHVuay0+dGhfZmxhZ3MgJiBUUUZfSVNfTEFTVFBSSVZBVEUpIHsKKyAgICAgICAgLyogTm9ybWFsbHksIF9fa21wX2ZpbmRfdGFza19pbl9xdWV1ZSgpIHJlZnVzZXMgdG8gc2NoZWR1bGUgdGhlIGxhc3QgdGFzayBpbiB0aGUgKi8KKyAgICAgICAgLyogcXVldWUgaWYgVFFGX0lTX0xBU1RQUklWQVRFIHNvIHdlIGNhbiBwb3NpdGl2ZWx5IGlkZW50aWZ5IHRoYXQgbGFzdCB0YXNrICAgICAgKi8KKyAgICAgICAgLyogYW5kIHJ1biBpdCB3aXRoIGl0cyBUUUZfSVNfTEFTVF9UQVNLIGJpdCB0dXJuZWQgb24gaW4gdGhfZmxhZ3MuICBXaGVuICAgICAgICAgKi8KKyAgICAgICAgLyogX19rbXBjX2VuZF90YXNrcV90YXNrKCkgaXMgY2FsbGVkIHdlIGFyZSBkb25lIGdlbmVyYXRpbmcgYWxsIHRoZSB0YXNrcywgc28gICAgKi8KKyAgICAgICAgLyogd2Uga25vdyB0aGUgbGFzdCBvbmUgaW4gdGhlIHF1ZXVlIGlzIHRoZSBsYXN0cHJpdmF0ZSB0YXNrLiAgTWFyayB0aGUgcXVldWUgICAgKi8KKyAgICAgICAgLyogYXMgaGF2aW5nIGdvdHRlbiB0byB0aGlzIHN0YXRlIHZpYSB0cV9mbGFncyAmIFRRRl9JU19MQVNUX1RBU0s7IHdoZW4gdGhhdCAgICAgKi8KKyAgICAgICAgLyogdGFzayBhY3R1YWxseSBleGVjdXRlcyBtYXJrIGl0IHZpYSB0aF9mbGFncyAmIFRRRl9JU19MQVNUX1RBU0sgKHRoaXMgdGhfZmxhZ3MgKi8KKyAgICAgICAgLyogYml0IHNpZ25hbHMgdGhlIGluc3RydW1lbnRlZCBjb2RlIHRvIGRvIGNvcHktb3V0cyBhZnRlciBleGVjdXRpb24pLiAgICAgICAgICAgKi8KKworICAgICAgICBpZiAoISBpbl9wYXJhbGxlbCkgeworICAgICAgICAgICAgLyogTm8gc3luY2hyb25pemF0aW9uIG5lZWRlZCBmb3Igc2VyaWFsIGNvbnRleHQgKi8KKyAgICAgICAgICAgIHF1ZXVlLT50cV9mbGFncyB8PSBUUUZfSVNfTEFTVF9UQVNLOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworI2lmIEtNUF9BUkNIX1g4NiB8fCBcCisgICAgS01QX0FSQ0hfWDg2XzY0CisKKyAgICAgICAgICAgIEtNUF9URVNUX1RIRU5fT1IzMiggJnF1ZXVlLT50cV9mbGFncywgKGttcF9pbnQzMikgVFFGX0lTX0xBU1RfVEFTSyApOworI2Vsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9hY3F1aXJlX2xvY2soJiBxdWV1ZS0+dHFfcXVldWVfbGNrLCBnbG9iYWxfdGlkKTsKKworICAgICAgICAgICAgICAgIEtNUF9NQigpOyAgLyogbWFrZSBzdXJlIGRhdGEgc3RydWN0dXJlcyBhcmUgaW4gY29uc2lzdGVudCBzdGF0ZSBiZWZvcmUgcXVlcnlpbmcgdGhlbSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2VlbXMgdG8gd29yayB3aXRob3V0IHRoaXMgY2FsbCBmb3IgZGlnaXRhbC9hbHBoYSwgbmVlZGVkIGZvciBJQk0vUlM2MDAwICovCisKKyAgICAgICAgICAgICAgICBxdWV1ZS0+dHFfZmxhZ3MgfD0gVFFGX0lTX0xBU1RfVEFTSzsKKworICAgICAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfbG9jaygmIHF1ZXVlLT50cV9xdWV1ZV9sY2ssIGdsb2JhbF90aWQpOworICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICAvKiB0byBwcmV2ZW50IHJhY2UgY29uZGl0aW9uIHdoZXJlIGxhc3QgdGFzayBpcyBkZXF1ZXVlZCBidXQgKi8KKyAgICAgICAgICAgIC8qIGZsYWcgaXNuJ3QgdmlzaWJsZSB5ZXQgKG5vdCBzdXJlIGFib3V0IHRoaXMpICAgICAgICAgICAgICAqLworICAgICAgICAgICAgS01QX01CKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBkZXF1ZXVlIHRhc2txIHRodW5rIGZyb20gY3Vycl90aHVuayBzdGFjayAqLworICAgIGlmIChpbl9wYXJhbGxlbCkgeworICAgICAgICB0cS0+dHFfY3Vycl90aHVua1t0aWRdID0gdGh1bmstPnRoX2VuY2xfdGh1bms7CisgICAgICAgIHRodW5rLT50aF9lbmNsX3RodW5rID0gTlVMTDsKKworICAgICAgICBLRl9EVU1QKCAyMDAsIF9fa21wX2R1bXBfdGh1bmtfc3RhY2soIHRxLT50cV9jdXJyX3RodW5rW3RpZF0sIGdsb2JhbF90aWQgKSk7CisgICAgfQorCisgICAgS0VfVFJBQ0UoIDEwLCAoIl9fa21wY19lbmRfdGFza3FfdGFzayByZXR1cm4gKCVkKVxuIiwgZ2xvYmFsX3RpZCkpOworfQorCisvKiByZXR1cm5zIHRodW5rIGZvciBhIHJlZ3VsYXIgdGFzayBiYXNlZCBvbiB0YXNrcV90aHVuayAgICAgICAgICAgICAgKi8KKy8qIChfX2ttcGNfdGFza3FfdGFzayBkb2VzIHRoZSBhbmFsb2dvdXMgdGhpbmcgZm9yIGEgVFFGX1RBU0tRX1RBU0spICAqLworCitrbXBjX3RodW5rX3QgKgorX19rbXBjX3Rhc2tfYnVmZmVyKGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQsIGttcGNfdGh1bmtfdCAqdGFza3FfdGh1bmssIGttcGNfdGFza190IHRhc2spCit7CisgICAga21wX3Rhc2txX3QgICAgICAgKnRxOworICAgIGttcGNfdGFza19xdWV1ZV90ICpxdWV1ZTsKKyAgICBrbXBjX3RodW5rX3QgICAgICAqbmV3X3RodW5rOworICAgIGludCAgICAgICAgICAgICAgICBpbl9wYXJhbGxlbDsKKworICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcGNfdGFza19idWZmZXIgY2FsbGVkICglZClcbiIsIGdsb2JhbF90aWQpKTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQgKHRhc2txX3RodW5rLT50aF9mbGFncyAmIFRRRl9UQVNLUV9UQVNLKTsgIC8qICB0YXNrcV90aHVuay0+dGhfdGFzayBpcyB0aGUgdGFza3FfdGFzayAgKi8KKworICAgIHRxICAgICAgICAgID0gJl9fa21wX3RocmVhZHNbZ2xvYmFsX3RpZF0gLT4gdGgudGhfdGVhbSAtPiB0LnRfdGFza3E7CisgICAgcXVldWUgICAgICAgPSB0YXNrcV90aHVuay0+dGgudGhfc2hhcmVkcy0+c3ZfcXVldWU7CisgICAgaW5fcGFyYWxsZWwgPSAocXVldWUtPnRxX2ZsYWdzICYgVFFGX1BBUkFMTEVMX0NPTlRFWFQpOworCisgICAgLyogVGhlIGluc3RydW1lbnRhdGlvbiBzZXF1ZW5jZSBpczogIF9fa21wY190YXNrX2J1ZmZlcigpLCBpbml0aWFsaXplIHByaXZhdGUgKi8KKyAgICAvKiB2YXJpYWJsZXMsIF9fa21wY190YXNrKCkuICBUaGUgX19rbXBjX3Rhc2tfYnVmZmVyIHJvdXRpbmUgY2hlY2tzIHRoYXQgdGhlICAqLworICAgIC8qIHRhc2sgcXVldWUgaXMgbm90IGZ1bGwgYW5kIGFsbG9jYXRlcyBhIHRodW5rICh3aGljaCBpcyB0aGVuIHBhc3NlZCB0byAgICAgICovCisgICAgLyogX19rbXBjX3Rhc2soKSkuICBTbywgd2UgY2FuIHByZS1hbGxvY2F0ZSBhIHRodW5rIGhlcmUgYXNzdW1pbmcgaXQgd2lsbCBiZSAgKi8KKyAgICAvKiB0aGUgbmV4dCB0byBiZSBlbnF1ZXVlZCBpbiBfX2ttcGNfdGFzaygpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgbmV3X3RodW5rID0gX19rbXBfYWxsb2NfdGh1bmsgKHF1ZXVlLCBpbl9wYXJhbGxlbCwgZ2xvYmFsX3RpZCk7CisgICAgbmV3X3RodW5rLT50aC50aF9zaGFyZWRzID0gKGttcGNfc2hhcmVkX3ZhcnNfdCAqKSBxdWV1ZS0+dHFfc2hhcmVkc1swXS5haV9kYXRhOworICAgIG5ld190aHVuay0+dGhfZW5jbF90aHVuayA9IE5VTEw7CisgICAgbmV3X3RodW5rLT50aF90YXNrICAgICAgID0gdGFzazsKKworICAgIC8qIEdFSCAtIHNob3VsZG4ndCBuZWVkIHRvIGxvY2sgdGhlIHJlYWQgb2YgdHFfZmxhZ3MgaGVyZSAqLworICAgIG5ld190aHVuay0+dGhfZmxhZ3MgICAgICA9IHF1ZXVlLT50cV9mbGFncyAmIFRRRl9JTlRFUkZBQ0VfRkxBR1M7CisKKyAgICBuZXdfdGh1bmstPnRoX3N0YXR1cyAgICAgPSAwOworCisgICAgS01QX0RFQlVHX0FTU0VSVCAoIShuZXdfdGh1bmstPnRoX2ZsYWdzICYgVFFGX1RBU0tRX1RBU0spKTsKKworICAgIEtGX1RSQUNFKDEwMCwgKCJDcmVhdGluZyBSZWd1bGFyIFRhc2sgb24gKCVkKTpcbiIsIGdsb2JhbF90aWQpKTsKKyAgICBLRl9EVU1QKDEwMCwgX19rbXBfZHVtcF90aHVuayggdHEsIG5ld190aHVuaywgZ2xvYmFsX3RpZCApKTsKKworICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcGNfdGFza19idWZmZXIgcmV0dXJuICglZClcbiIsIGdsb2JhbF90aWQpKTsKKworICAgIHJldHVybiBuZXdfdGh1bms7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX3RocmVhZHByaXZhdGUuYyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF90aHJlYWRwcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJmMjcwMQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF90aHJlYWRwcml2YXRlLmMKQEAgLTAsMCArMSw3MzUgQEAKKy8qCisgKiBrbXBfdGhyZWFkcHJpdmF0ZS5jIC0tIE9wZW5NUCB0aHJlYWRwcml2YXRlIHN1cHBvcnQgbGlicmFyeQorICogJFJldmlzaW9uOiA0Mjk1MSAkCisgKiAkRGF0ZTogMjAxNC0wMS0yMSAxNDo0MTo0MSAtMDYwMCAoVHVlLCAyMSBKYW4gMjAxNCkgJAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAia21wLmgiCisjaW5jbHVkZSAia21wX2l0dC5oIgorI2luY2x1ZGUgImttcF9pMThuLmgiCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgVVNFX0NIRUNLU19DT01NT04KKworI2RlZmluZSBLTVBfSU5MSU5FX1NVQlIgICAgICAgICAxCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZAora21wX3RocmVhZHByaXZhdGVfaW5zZXJ0X3ByaXZhdGVfZGF0YSggaW50IGd0aWQsIHZvaWQgKnBjX2FkZHIsIHZvaWQgKmRhdGFfYWRkciwgc2l6ZV90IHBjX3NpemUgKTsKK3N0cnVjdCBwcml2YXRlX2NvbW1vbiAqCitrbXBfdGhyZWFkcHJpdmF0ZV9pbnNlcnQoIGludCBndGlkLCB2b2lkICpwY19hZGRyLCB2b2lkICpkYXRhX2FkZHIsIHNpemVfdCBwY19zaXplICk7CisKK3N0cnVjdCBzaGFyZWRfdGFibGUgICAgIF9fa21wX3RocmVhZHByaXZhdGVfZF90YWJsZTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljCisjaWZkZWYgS01QX0lOTElORV9TVUJSCitfX2ZvcmNlaW5saW5lCisjZW5kaWYKK3N0cnVjdCBwcml2YXRlX2NvbW1vbiAqCitfX2ttcF90aHJlYWRwcml2YXRlX2ZpbmRfdGFza19jb21tb24oIHN0cnVjdCBjb21tb25fdGFibGUgKnRibCwgaW50IGd0aWQsIHZvaWQgKnBjX2FkZHIgKQorCit7CisgICAgc3RydWN0IHByaXZhdGVfY29tbW9uICp0bjsKKworI2lmZGVmIEtNUF9UQVNLX0NPTU1PTl9ERUJVRworICAgIEtDX1RSQUNFKCAxMCwgKCAiX19rbXBfdGhyZWFkcHJpdmF0ZV9maW5kX3Rhc2tfY29tbW9uOiB0aHJlYWQjJWQsIGNhbGxlZCB3aXRoIGFkZHJlc3MgJXBcbiIsCisgICAgICAgICAgICAgICAgICAgIGd0aWQsIHBjX2FkZHIgKSApOworICAgIGR1bXBfbGlzdCgpOworI2VuZGlmCisKKyAgICBmb3IgKHRuID0gdGJsLT5kYXRhWyBLTVBfSEFTSChwY19hZGRyKSBdOyB0bjsgdG4gPSB0bi0+bmV4dCkgeworICAgICAgICBpZiAodG4tPmdibF9hZGRyID09IHBjX2FkZHIpIHsKKyNpZmRlZiBLTVBfVEFTS19DT01NT05fREVCVUcKKyAgICAgICAgICAgIEtDX1RSQUNFKCAxMCwgKCAiX19rbXBfdGhyZWFkcHJpdmF0ZV9maW5kX3Rhc2tfY29tbW9uOiB0aHJlYWQjJWQsIGZvdW5kIG5vZGUgJXAgb24gbGlzdFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCBwY19hZGRyICkgKTsKKyNlbmRpZgorICAgICAgICAgICAgcmV0dXJuIHRuOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMKKyNpZmRlZiBLTVBfSU5MSU5FX1NVQlIKK19fZm9yY2VpbmxpbmUKKyNlbmRpZgorc3RydWN0IHNoYXJlZF9jb21tb24gKgorX19rbXBfZmluZF9zaGFyZWRfdGFza19jb21tb24oIHN0cnVjdCBzaGFyZWRfdGFibGUgKnRibCwgaW50IGd0aWQsIHZvaWQgKnBjX2FkZHIgKQoreworICAgIHN0cnVjdCBzaGFyZWRfY29tbW9uICp0bjsKKworICAgIGZvciAodG4gPSB0YmwtPmRhdGFbIEtNUF9IQVNIKHBjX2FkZHIpIF07IHRuOyB0biA9IHRuLT5uZXh0KSB7CisgICAgICAgIGlmICh0bi0+Z2JsX2FkZHIgPT0gcGNfYWRkcikgeworI2lmZGVmIEtNUF9UQVNLX0NPTU1PTl9ERUJVRworICAgICAgICAgICAgS0NfVFJBQ0UoIDEwLCAoICJfX2ttcF9maW5kX3NoYXJlZF90YXNrX2NvbW1vbjogdGhyZWFkIyVkLCBmb3VuZCBub2RlICVwIG9uIGxpc3RcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgcGNfYWRkciApICk7CisjZW5kaWYKKyAgICAgICAgICAgIHJldHVybiB0bjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworCisvKgorICogICAgICBDcmVhdGUgYSB0ZW1wbGF0ZSBmb3IgdGhlIGRhdGEgaW5pdGlhbGl6ZWQgc3RvcmFnZS4KKyAqICAgICAgRWl0aGVyIHRoZSB0ZW1wbGF0ZSBpcyBOVUxMIGluZGljYXRpbmcgemVybyBmaWxsLAorICogICAgICBvciB0aGUgdGVtcGxhdGUgaXMgYSBjb3B5IG9mIHRoZSBvcmlnaW5hbCBkYXRhLgorICovCisKK3N0YXRpYyBzdHJ1Y3QgcHJpdmF0ZV9kYXRhICoKK19fa21wX2luaXRfY29tbW9uX2RhdGEoIHZvaWQgKnBjX2FkZHIsIHNpemVfdCBwY19zaXplICkKK3sKKyAgICBzdHJ1Y3QgcHJpdmF0ZV9kYXRhICpkOworICAgIHNpemVfdCAgICAgICBpOworICAgIGNoYXIgICAgICAgICpwOworCisgICAgZCA9IChzdHJ1Y3QgcHJpdmF0ZV9kYXRhICopIF9fa21wX2FsbG9jYXRlKCBzaXplb2YoIHN0cnVjdCBwcml2YXRlX2RhdGEgKSApOworLyoKKyAgICBkLT5kYXRhID0gMDsgIC8vIEFDOiBjb21tZW50ZWQgb3V0IGJlY2F1c2UgX19rbXBfYWxsb2NhdGUgemVyb2VzIHRoZSBtZW1vcnkKKyAgICBkLT5uZXh0ID0gMDsKKyovCisgICAgZC0+c2l6ZSA9IHBjX3NpemU7CisgICAgZC0+bW9yZSA9IDE7CisKKyAgICBwID0gKGNoYXIqKXBjX2FkZHI7CisKKyAgICBmb3IgKGkgPSBwY19zaXplOyAgaSA+IDA7IC0taSkgeworICAgICAgICBpZiAoKnArKyAhPSAnXDAnKSB7CisgICAgICAgICAgICBkLT5kYXRhID0gX19rbXBfYWxsb2NhdGUoIHBjX3NpemUgKTsKKyAgICAgICAgICAgIG1lbWNweSggZC0+ZGF0YSwgcGNfYWRkciwgcGNfc2l6ZSApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZDsKK30KKworLyoKKyAqICAgICAgSW5pdGlhbGl6ZSB0aGUgZGF0YSBhcmVhIGZyb20gdGhlIHRlbXBsYXRlLgorICovCisKK3N0YXRpYyB2b2lkCitfX2ttcF9jb3B5X2NvbW1vbl9kYXRhKCB2b2lkICpwY19hZGRyLCBzdHJ1Y3QgcHJpdmF0ZV9kYXRhICpkICkKK3sKKyAgICBjaGFyICphZGRyID0gKGNoYXIgKikgcGNfYWRkcjsKKyAgICBpbnQgICBpLCBvZmZzZXQ7CisKKyAgICBmb3IgKG9mZnNldCA9IDA7IGQgIT0gMDsgZCA9IGQtPm5leHQpIHsKKyAgICAgICAgZm9yIChpID0gZC0+bW9yZTsgaSA+IDA7IC0taSkgeworICAgICAgICAgICAgaWYgKGQtPmRhdGEgPT0gMCkKKyAgICAgICAgICAgICAgICBtZW1zZXQoICYgYWRkclsgb2Zmc2V0IF0sICdcMCcsIGQtPnNpemUgKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBtZW1jcHkoICYgYWRkclsgb2Zmc2V0IF0sIGQtPmRhdGEsIGQtPnNpemUgKTsKKyAgICAgICAgICAgIG9mZnNldCArPSBkLT5zaXplOworICAgICAgICB9CisgICAgfQorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiB3ZSBhcmUgY2FsbGVkIGZyb20gX19rbXBfc2VyaWFsX2luaXRpYWxpemUoKSB3aXRoIF9fa21wX2luaXR6X2xvY2sgaGVsZC4gKi8KK3ZvaWQKK19fa21wX2NvbW1vbl9pbml0aWFsaXplKCB2b2lkICkKK3sKKyAgICBpZiggISBUQ1JfNChfX2ttcF9pbml0X2NvbW1vbikgKSB7CisgICAgICAgIGludCBxOworI2lmZGVmIEtNUF9ERUJVRworICAgICAgICBpbnQgZ3RpZDsKKyNlbmRpZgorCisgICAgICAgIF9fa21wX3RocmVhZHByaXZfY2FjaGVfbGlzdCA9IE5VTEw7CisKKyNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgLyogdmVyaWZ5IHRoZSB1YmVyIG1hc3RlcnMgd2VyZSBpbml0aWFsaXplZCAqLworICAgICAgICBmb3IoZ3RpZCA9IDAgOyBndGlkIDwgX19rbXBfdGhyZWFkc19jYXBhY2l0eTsgZ3RpZCsrICkKKyAgICAgICAgICAgIGlmKCBfX2ttcF9yb290W2d0aWRdICkgeworICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX3Jvb3RbZ3RpZF0tPnIucl91YmVyX3RocmVhZCApOworICAgICAgICAgICAgICAgIGZvciAoIHEgPSAwOyBxPCBLTVBfSEFTSF9UQUJMRV9TSVpFOyArK3EpCisgICAgICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoICFfX2ttcF9yb290W2d0aWRdLT5yLnJfdWJlcl90aHJlYWQtPnRoLnRoX3ByaV9jb21tb24tPmRhdGFbcV0gKTsKKy8qICAgICAgICAgICAgICAgICAgICBfX2ttcF9yb290WyBnaXRkIF0tPiByLnJfdWJlcl90aHJlYWQgLT4gdGgudGhfcHJpX2NvbW1vbiAtPiBkYXRhWyBxIF0gPSAwOyovCisgICAgICAgICAgICB9CisjZW5kaWYgLyogS01QX0RFQlVHICovCisKKyAgICAgICAgZm9yIChxID0gMDsgcSA8IEtNUF9IQVNIX1RBQkxFX1NJWkU7ICsrcSkKKyAgICAgICAgICAgIF9fa21wX3RocmVhZHByaXZhdGVfZF90YWJsZS5kYXRhWyBxIF0gPSAwOworCisgICAgICAgIFRDV180KF9fa21wX2luaXRfY29tbW9uLCBUUlVFKTsKKyAgICB9Cit9CisKKy8qIENhbGwgYWxsIGRlc3RydWN0b3JzIGZvciB0aHJlYWRwcml2YXRlIGRhdGEgYmVsb25naW5nIHRvIGFsbCB0aHJlYWRzLgorICAgQ3VycmVudGx5IHVudXNlZCEgKi8KK3ZvaWQKK19fa21wX2NvbW1vbl9kZXN0cm95KCB2b2lkICkKK3sKKyAgICBpZiggVENSXzQoX19rbXBfaW5pdF9jb21tb24pICkgeworICAgICAgICBpbnQgcTsKKworICAgICAgICBUQ1dfNChfX2ttcF9pbml0X2NvbW1vbiwgRkFMU0UpOworCisgICAgICAgIGZvciAocSA9IDA7IHEgPCBLTVBfSEFTSF9UQUJMRV9TSVpFOyArK3EpIHsKKyAgICAgICAgICAgIGludCBndGlkOworICAgICAgICAgICAgc3RydWN0IHByaXZhdGVfY29tbW9uICp0bjsKKyAgICAgICAgICAgIHN0cnVjdCBzaGFyZWRfY29tbW9uICAqZF90bjsKKworICAgICAgICAgICAgLyogIEMrKyBkZXN0cnVjdG9ycyBuZWVkIHRvIGJlIGNhbGxlZCBvbmNlIHBlciB0aHJlYWQgYmVmb3JlIGV4aXRpbmcgICovCisgICAgICAgICAgICAvKiAgZG9uJ3QgY2FsbCBkZXN0cnVjdG9ycyBmb3IgbWFzdGVyIHRocmVhZCB0aG91Z2ggdW5sZXNzIHdlIHVzZWQgY29weSBjb25zdHJ1Y3RvciAqLworCisgICAgICAgICAgICBmb3IgKGRfdG4gPSBfX2ttcF90aHJlYWRwcml2YXRlX2RfdGFibGUuZGF0YVsgcSBdOyBkX3RuOyBkX3RuID0gZF90bi0+bmV4dCkgeworICAgICAgICAgICAgICAgIGlmIChkX3RuLT5pc192ZWMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRfdG4tPmR0LmR0b3J2ICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoZ3RpZCA9IDA7IGd0aWQgPCBfX2ttcF9hbGxfbnRoOyArK2d0aWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggX19rbXBfdGhyZWFkc1tndGlkXSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIChfX2ttcF9mb3JlaWduX3RwKSA/ICghIEtNUF9JTklUSUFMX0dUSUQgKGd0aWQpKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoISBLTVBfVUJFUl9HVElEIChndGlkKSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0biA9IF9fa21wX3RocmVhZHByaXZhdGVfZmluZF90YXNrX2NvbW1vbiggX19rbXBfdGhyZWFkc1sgZ3RpZCBdLT50aC50aF9wcmlfY29tbW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIGRfdG4tPmdibF9hZGRyICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmRfdG4tPmR0LmR0b3J2KSAodG4tPnBhcl9hZGRyLCBkX3RuLT52ZWNfbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkX3RuLT5vYmpfaW5pdCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpkX3RuLT5kdC5kdG9ydikgKGRfdG4tPm9ial9pbml0LCBkX3RuLT52ZWNfbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChkX3RuLT5kdC5kdG9yICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoZ3RpZCA9IDA7IGd0aWQgPCBfX2ttcF9hbGxfbnRoOyArK2d0aWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggX19rbXBfdGhyZWFkc1tndGlkXSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIChfX2ttcF9mb3JlaWduX3RwKSA/ICghIEtNUF9JTklUSUFMX0dUSUQgKGd0aWQpKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoISBLTVBfVUJFUl9HVElEIChndGlkKSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0biA9IF9fa21wX3RocmVhZHByaXZhdGVfZmluZF90YXNrX2NvbW1vbiggX19rbXBfdGhyZWFkc1sgZ3RpZCBdLT50aC50aF9wcmlfY29tbW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIGRfdG4tPmdibF9hZGRyICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmRfdG4tPmR0LmR0b3IpICh0bi0+cGFyX2FkZHIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRfdG4tPm9ial9pbml0ICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmRfdG4tPmR0LmR0b3IpIChkX3RuLT5vYmpfaW5pdCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfX2ttcF90aHJlYWRwcml2YXRlX2RfdGFibGUuZGF0YVsgcSBdID0gMDsKKyAgICAgICAgfQorICAgIH0KK30KKworLyogQ2FsbCBhbGwgZGVzdHJ1Y3RvcnMgZm9yIHRocmVhZHByaXZhdGUgZGF0YSBiZWxvbmdpbmcgdG8gdGhpcyB0aHJlYWQgKi8KK3ZvaWQKK19fa21wX2NvbW1vbl9kZXN0cm95X2d0aWQoIGludCBndGlkICkKK3sKKyAgICBzdHJ1Y3QgcHJpdmF0ZV9jb21tb24gKnRuOworICAgIHN0cnVjdCBzaGFyZWRfY29tbW9uICpkX3RuOworCisgICAgS0NfVFJBQ0UoIDEwLCAoIl9fa21wX2NvbW1vbl9kZXN0cm95X2d0aWQ6IFQjJWQgY2FsbGVkXG4iLCBndGlkICkgKTsKKyAgICBpZiggKF9fa21wX2ZvcmVpZ25fdHApID8gKCEgS01QX0lOSVRJQUxfR1RJRCAoZ3RpZCkpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCEgS01QX1VCRVJfR1RJRCAoZ3RpZCkpICkgeworCisgICAgICAgIGlmKCBUQ1JfNChfX2ttcF9pbml0X2NvbW1vbikgKSB7CisKKyAgICAgICAgICAgIC8qIENhbm5vdCBkbyB0aGlzIGhlcmUgc2luY2Ugbm90IGFsbCB0aHJlYWRzIGhhdmUgZGVzdHJveWVkIHRoZWlyIGRhdGEgKi8KKyAgICAgICAgICAgIC8qIFRDV180KF9fa21wX2luaXRfY29tbW9uLCBGQUxTRSk7ICovCisKKyAgICAgICAgICAgIGZvciAodG4gPSBfX2ttcF90aHJlYWRzWyBndGlkIF0tPnRoLnRoX3ByaV9oZWFkOyB0bjsgdG4gPSB0bi0+bGluaykgeworCisgICAgICAgICAgICAgICAgZF90biA9IF9fa21wX2ZpbmRfc2hhcmVkX3Rhc2tfY29tbW9uKCAmX19rbXBfdGhyZWFkcHJpdmF0ZV9kX3RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdG4tPmdibF9hZGRyICk7CisKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBkX3RuICk7CisKKyAgICAgICAgICAgICAgICBpZiAoZF90bi0+aXNfdmVjKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChkX3RuLT5kdC5kdG9ydiAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCkgKCpkX3RuLT5kdC5kdG9ydikgKHRuLT5wYXJfYWRkciwgZF90bi0+dmVjX2xlbik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGRfdG4tPm9ial9pbml0ICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKSAoKmRfdG4tPmR0LmR0b3J2KSAoZF90bi0+b2JqX2luaXQsIGRfdG4tPnZlY19sZW4pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRfdG4tPmR0LmR0b3IgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQpICgqZF90bi0+ZHQuZHRvcikgKHRuLT5wYXJfYWRkcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGRfdG4tPm9ial9pbml0ICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKSAoKmRfdG4tPmR0LmR0b3IpIChkX3RuLT5vYmpfaW5pdCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBLQ19UUkFDRSggMzAsICgiX19rbXBfY29tbW9uX2Rlc3Ryb3lfZ3RpZDogVCMlZCB0aHJlYWRwcml2YXRlIGRlc3RydWN0b3JzIGNvbXBsZXRlXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCApICk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZmRlZiBLTVBfVEFTS19DT01NT05fREVCVUcKK3N0YXRpYyB2b2lkCitkdW1wX2xpc3QoIHZvaWQgKQoreworICAgIGludCBwLCBxOworCisgICAgZm9yIChwID0gMDsgcCA8IF9fa21wX2FsbF9udGg7ICsrcCkgeworICAgICAgICBpZiggIV9fa21wX3RocmVhZHNbcF0gKSBjb250aW51ZTsKKyAgICAgICAgZm9yIChxID0gMDsgcSA8IEtNUF9IQVNIX1RBQkxFX1NJWkU7ICsrcSkgeworICAgICAgICAgICAgaWYgKF9fa21wX3RocmVhZHNbIHAgXS0+dGgudGhfcHJpX2NvbW1vbi0+ZGF0YVsgcSBdKSB7CisgICAgICAgICAgICAgICAgc3RydWN0IHByaXZhdGVfY29tbW9uICp0bjsKKworICAgICAgICAgICAgICAgIEtDX1RSQUNFKCAxMCwgKCAiXHRkdW1wX2xpc3Q6IGd0aWQ6JWQgYWRkcmVzc2VzXG4iLCBwICkgKTsKKworICAgICAgICAgICAgICAgIGZvciAodG4gPSBfX2ttcF90aHJlYWRzWyBwIF0tPnRoLnRoX3ByaV9jb21tb24tPmRhdGFbIHEgXTsgdG47IHRuID0gdG4tPm5leHQpICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEtDX1RSQUNFKCAxMCwgKCAiXHRkdW1wX2xpc3Q6IFRIUkVBRFBSSVZBVEU6IFNlcmlhbCAlcCAtPiBQYXJhbGxlbCAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRuLT5nYmxfYWRkciwgdG4tPnBhcl9hZGRyICkgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisjZW5kaWYgLyogS01QX1RBU0tfQ09NTU9OX0RFQlVHICovCisKKworLyoKKyAqIE5PVEU6IHRoaXMgcm91dGluZSBpcyB0byBiZSBjYWxsZWQgb25seSBmcm9tIHRoZSBzZXJpYWwgcGFydCBvZiB0aGUgcHJvZ3JhbS4KKyAqLworCit2b2lkCitrbXBfdGhyZWFkcHJpdmF0ZV9pbnNlcnRfcHJpdmF0ZV9kYXRhKCBpbnQgZ3RpZCwgdm9pZCAqcGNfYWRkciwgdm9pZCAqZGF0YV9hZGRyLCBzaXplX3QgcGNfc2l6ZSApCit7CisgICAgc3RydWN0IHNoYXJlZF9jb21tb24gKipsbmtfdG4sICpkX3RuOworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX3RocmVhZHNbIGd0aWQgXSAmJgorICAgICAgICAgICAgX19rbXBfdGhyZWFkc1sgZ3RpZCBdIC0+IHRoLnRoX3Jvb3QgLT4gci5yX2FjdGl2ZSA9PSAwICk7CisKKyAgICBkX3RuID0gX19rbXBfZmluZF9zaGFyZWRfdGFza19jb21tb24oICZfX2ttcF90aHJlYWRwcml2YXRlX2RfdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCBwY19hZGRyICk7CisKKyAgICBpZiAoZF90biA9PSAwKSB7CisgICAgICAgIGRfdG4gPSAoc3RydWN0IHNoYXJlZF9jb21tb24gKikgX19rbXBfYWxsb2NhdGUoIHNpemVvZiggc3RydWN0IHNoYXJlZF9jb21tb24gKSApOworCisgICAgICAgIGRfdG4tPmdibF9hZGRyID0gcGNfYWRkcjsKKyAgICAgICAgZF90bi0+cG9kX2luaXQgPSBfX2ttcF9pbml0X2NvbW1vbl9kYXRhKCBkYXRhX2FkZHIsIHBjX3NpemUgKTsKKy8qCisgICAgICAgIGRfdG4tPm9ial9pbml0ID0gMDsgIC8vIEFDOiBjb21tZW50ZWQgb3V0IGJlY2F1c2UgX19rbXBfYWxsb2NhdGUgemVyb2VzIHRoZSBtZW1vcnkKKyAgICAgICAgZF90bi0+Y3QuY3RvciA9IDA7CisgICAgICAgIGRfdG4tPmNjdC5jY3RvciA9IDA7OworICAgICAgICBkX3RuLT5kdC5kdG9yID0gMDsKKyAgICAgICAgZF90bi0+aXNfdmVjID0gRkFMU0U7CisgICAgICAgIGRfdG4tPnZlY19sZW4gPSAwTDsKKyovCisgICAgICAgIGRfdG4tPmNtbl9zaXplID0gcGNfc2l6ZTsKKworICAgICAgICBfX2ttcF9hY3F1aXJlX2xvY2soICZfX2ttcF9nbG9iYWxfbG9jaywgZ3RpZCApOworCisgICAgICAgIGxua190biA9ICYoX19rbXBfdGhyZWFkcHJpdmF0ZV9kX3RhYmxlLmRhdGFbIEtNUF9IQVNIKHBjX2FkZHIpIF0pOworCisgICAgICAgIGRfdG4tPm5leHQgPSAqbG5rX3RuOworICAgICAgICAqbG5rX3RuID0gZF90bjsKKworICAgICAgICBfX2ttcF9yZWxlYXNlX2xvY2soICZfX2ttcF9nbG9iYWxfbG9jaywgZ3RpZCApOworICAgIH0KK30KKworc3RydWN0IHByaXZhdGVfY29tbW9uICoKK2ttcF90aHJlYWRwcml2YXRlX2luc2VydCggaW50IGd0aWQsIHZvaWQgKnBjX2FkZHIsIHZvaWQgKmRhdGFfYWRkciwgc2l6ZV90IHBjX3NpemUgKQoreworICAgIHN0cnVjdCBwcml2YXRlX2NvbW1vbiAqdG4sICoqdHQ7CisgICAgc3RydWN0IHNoYXJlZF9jb21tb24gICpkX3RuOworCisgICAgLyogKysrKysrKysrIFNUQVJUIE9GIENSSVRJQ0FMIFNFQ1RJT04gKysrKysrKysrICovCisKKyAgICBfX2ttcF9hY3F1aXJlX2xvY2soICYgX19rbXBfZ2xvYmFsX2xvY2ssIGd0aWQgKTsKKworICAgIHRuID0gKHN0cnVjdCBwcml2YXRlX2NvbW1vbiAqKSBfX2ttcF9hbGxvY2F0ZSggc2l6ZW9mIChzdHJ1Y3QgcHJpdmF0ZV9jb21tb24pICk7CisKKyAgICB0bi0+Z2JsX2FkZHIgPSBwY19hZGRyOworCisgICAgZF90biA9IF9fa21wX2ZpbmRfc2hhcmVkX3Rhc2tfY29tbW9uKCAmX19rbXBfdGhyZWFkcHJpdmF0ZV9kX3RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgcGNfYWRkciApOyAgICAgLyogT25seSB0aGUgTUFTVEVSIGRhdGEgdGFibGUgZXhpc3RzLiAqLworCisgICAgaWYgKGRfdG4gIT0gMCkgeworICAgICAgICAvKiBUaGlzIHRocmVhZHByaXZhdGUgdmFyaWFibGUgaGFzIGFscmVhZHkgYmVlbiBzZWVuLiAqLworCisgICAgICAgIGlmICggZF90bi0+cG9kX2luaXQgPT0gMCAmJiBkX3RuLT5vYmpfaW5pdCA9PSAwICkgeworICAgICAgICAgICAgZF90bi0+Y21uX3NpemUgPSBwY19zaXplOworCisgICAgICAgICAgICBpZiAoZF90bi0+aXNfdmVjKSB7CisgICAgICAgICAgICAgICAgaWYgKGRfdG4tPmN0LmN0b3J2ICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLyogQ29uc3RydWN0IGZyb20gc2NyYXRjaCBzbyBubyBwcm90b3R5cGUgZXhpc3RzICovCisgICAgICAgICAgICAgICAgICAgIGRfdG4tPm9ial9pbml0ID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoZF90bi0+Y2N0LmNjdG9ydiAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIE5vdyBkYXRhIGluaXRpYWxpemUgdGhlIHByb3RvdHlwZSBzaW5jZSBpdCB3YXMgcHJldmlvdXNseSByZWdpc3RlcmVkICovCisgICAgICAgICAgICAgICAgICAgIGRfdG4tPm9ial9pbml0ID0gKHZvaWQgKikgX19rbXBfYWxsb2NhdGUoIGRfdG4tPmNtbl9zaXplICk7CisgICAgICAgICAgICAgICAgICAgICh2b2lkKSAoKmRfdG4tPmNjdC5jY3RvcnYpIChkX3RuLT5vYmpfaW5pdCwgcGNfYWRkciwgZF90bi0+dmVjX2xlbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBkX3RuLT5wb2RfaW5pdCA9IF9fa21wX2luaXRfY29tbW9uX2RhdGEoIGRhdGFfYWRkciwgZF90bi0+Y21uX3NpemUgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChkX3RuLT5jdC5jdG9yICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLyogQ29uc3RydWN0IGZyb20gc2NyYXRjaCBzbyBubyBwcm90b3R5cGUgZXhpc3RzICovCisgICAgICAgICAgICAgICAgICAgIGRfdG4tPm9ial9pbml0ID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoZF90bi0+Y2N0LmNjdG9yICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLyogTm93IGRhdGEgaW5pdGlhbGl6ZSB0aGUgcHJvdG90eXBlIHNpbmNlIGl0IHdhcyBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgZF90bi0+b2JqX2luaXQgPSAodm9pZCAqKSBfX2ttcF9hbGxvY2F0ZSggZF90bi0+Y21uX3NpemUgKTsKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQpICgqZF90bi0+Y2N0LmNjdG9yKSAoZF90bi0+b2JqX2luaXQsIHBjX2FkZHIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZF90bi0+cG9kX2luaXQgPSBfX2ttcF9pbml0X2NvbW1vbl9kYXRhKCBkYXRhX2FkZHIsIGRfdG4tPmNtbl9zaXplICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBzdHJ1Y3Qgc2hhcmVkX2NvbW1vbiAqKmxua190bjsKKworICAgICAgICBkX3RuID0gKHN0cnVjdCBzaGFyZWRfY29tbW9uICopIF9fa21wX2FsbG9jYXRlKCBzaXplb2YoIHN0cnVjdCBzaGFyZWRfY29tbW9uICkgKTsKKyAgICAgICAgZF90bi0+Z2JsX2FkZHIgPSBwY19hZGRyOworICAgICAgICBkX3RuLT5jbW5fc2l6ZSA9IHBjX3NpemU7CisgICAgICAgIGRfdG4tPnBvZF9pbml0ID0gX19rbXBfaW5pdF9jb21tb25fZGF0YSggZGF0YV9hZGRyLCBwY19zaXplICk7CisvKgorICAgICAgICBkX3RuLT5vYmpfaW5pdCA9IDA7ICAvLyBBQzogY29tbWVudGVkIG91dCBiZWNhdXNlIF9fa21wX2FsbG9jYXRlIHplcm9lcyB0aGUgbWVtb3J5CisgICAgICAgIGRfdG4tPmN0LmN0b3IgPSAwOworICAgICAgICBkX3RuLT5jY3QuY2N0b3IgPSAwOworICAgICAgICBkX3RuLT5kdC5kdG9yID0gMDsKKyAgICAgICAgZF90bi0+aXNfdmVjID0gRkFMU0U7CisgICAgICAgIGRfdG4tPnZlY19sZW4gPSAwTDsKKyovCisgICAgICAgIGxua190biA9ICYoX19rbXBfdGhyZWFkcHJpdmF0ZV9kX3RhYmxlLmRhdGFbIEtNUF9IQVNIKHBjX2FkZHIpIF0pOworCisgICAgICAgIGRfdG4tPm5leHQgPSAqbG5rX3RuOworICAgICAgICAqbG5rX3RuID0gZF90bjsKKyAgICB9CisKKyAgICB0bi0+Y21uX3NpemUgPSBkX3RuLT5jbW5fc2l6ZTsKKworICAgIGlmICggKF9fa21wX2ZvcmVpZ25fdHApID8gKEtNUF9JTklUSUFMX0dUSUQgKGd0aWQpKSA6IChLTVBfVUJFUl9HVElEIChndGlkKSkgKSB7CisgICAgICAgIHRuLT5wYXJfYWRkciA9ICh2b2lkICopIHBjX2FkZHI7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICB0bi0+cGFyX2FkZHIgPSAodm9pZCAqKSBfX2ttcF9hbGxvY2F0ZSggdG4tPmNtbl9zaXplICk7CisgICAgfQorCisgICAgX19rbXBfcmVsZWFzZV9sb2NrKCAmIF9fa21wX2dsb2JhbF9sb2NrLCBndGlkICk7CisKKyAgICAvKiArKysrKysrKysgRU5EIE9GIENSSVRJQ0FMIFNFQ1RJT04gKysrKysrKysrICovCisKKyNpZmRlZiBVU0VfQ0hFQ0tTX0NPTU1PTgorICAgICAgICBpZiAocGNfc2l6ZSA+IGRfdG4tPmNtbl9zaXplKSB7CisgICAgICAgICAgICBLQ19UUkFDRSggMTAsICggIl9fa21wX3RocmVhZHByaXZhdGVfaW5zZXJ0OiBUSFJFQURQUklWQVRFOiAlcCAoJSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfVUlOVFBUUl9TUEVDICIgLCUiIEtNUF9VSU5UUFRSX1NQRUMgIilcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNfYWRkciwgcGNfc2l6ZSwgZF90bi0+Y21uX3NpemUgKSApOworICAgICAgICAgICAgS01QX0ZBVEFMKCBUUENvbW1vbkJsb2Nrc0luY29uc2lzdCApOworICAgICAgICB9CisjZW5kaWYgLyogVVNFX0NIRUNLU19DT01NT04gKi8KKworICAgIHR0ID0gJihfX2ttcF90aHJlYWRzWyBndGlkIF0tPnRoLnRoX3ByaV9jb21tb24tPmRhdGFbIEtNUF9IQVNIKHBjX2FkZHIpIF0pOworCisjaWZkZWYgS01QX1RBU0tfQ09NTU9OX0RFQlVHCisgICAgaWYgKCp0dCAhPSAwKSB7CisgICAgICAgIEtDX1RSQUNFKCAxMCwgKCAiX19rbXBfdGhyZWFkcHJpdmF0ZV9pbnNlcnQ6IFdBUk5JTkchIHRocmVhZCMlZDogY29sbGlzaW9uIG9uICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgcGNfYWRkciApICk7CisgICAgfQorI2VuZGlmCisgICAgdG4tPm5leHQgPSAqdHQ7CisgICAgKnR0ID0gdG47CisKKyNpZmRlZiBLTVBfVEFTS19DT01NT05fREVCVUcKKyAgICBLQ19UUkFDRSggMTAsICggIl9fa21wX3RocmVhZHByaXZhdGVfaW5zZXJ0OiB0aHJlYWQjJWQsIGluc2VydGVkIG5vZGUgJXAgb24gbGlzdFxuIiwKKyAgICAgICAgICAgICAgICAgICAgZ3RpZCwgcGNfYWRkciApICk7CisgICAgZHVtcF9saXN0KCApOworI2VuZGlmCisKKyAgICAvKiBMaW5rIHRoZSBub2RlIGludG8gYSBzaW1wbGUgbGlzdCAqLworCisgICAgdG4tPmxpbmsgPSBfX2ttcF90aHJlYWRzWyBndGlkIF0tPnRoLnRoX3ByaV9oZWFkOworICAgIF9fa21wX3RocmVhZHNbIGd0aWQgXS0+dGgudGhfcHJpX2hlYWQgPSB0bjsKKworI2lmZGVmIEJVSUxEX1RWCisgICAgX19rbXBfdHZfdGhyZWFkcHJpdmF0ZV9zdG9yZSggX19rbXBfdGhyZWFkc1sgZ3RpZCBdLCB0bi0+Z2JsX2FkZHIsIHRuLT5wYXJfYWRkciApOworI2VuZGlmCisKKyAgICBpZiggKF9fa21wX2ZvcmVpZ25fdHApID8gKEtNUF9JTklUSUFMX0dUSUQgKGd0aWQpKSA6IChLTVBfVUJFUl9HVElEIChndGlkKSkgKQorICAgICAgICByZXR1cm4gdG47CisKKyAgICAvKgorICAgICAqIGlmIEMrKyBvYmplY3Qgd2l0aCBjb3B5IGNvbnN0cnVjdG9yLCB1c2UgaXQ7CisgICAgICogZWxzZSBpZiBDKysgb2JqZWN0IHdpdGggY29uc3RydWN0b3IsIHVzZSBpdCBmb3IgdGhlIG5vbi1tYXN0ZXIgY29waWVzIG9ubHk7CisgICAgICogZWxzZSB1c2UgcG9kX2luaXQgYW5kIG1lbWNweQorICAgICAqCisgICAgICogQysrIGNvbnN0cnVjdG9ycyBuZWVkIHRvIGJlIGNhbGxlZCBvbmNlIGZvciBlYWNoIG5vbi1tYXN0ZXIgdGhyZWFkIG9uIGFsbG9jYXRlCisgICAgICogQysrIGNvcHkgY29uc3RydWN0b3JzIG5lZWQgdG8gYmUgY2FsbGVkIG9uY2UgZm9yIGVhY2ggdGhyZWFkIG9uIGFsbG9jYXRlCisgICAgICovCisKKyAgICAvKgorICAgICAqIEMrKyBvYmplY3Qgd2l0aCBjb25zdHJ1Y3RvcnMvZGVzdHJ1Y3RvcnM7CisgICAgICogZG9uJ3QgY2FsbCBjb25zdHJ1Y3RvcnMgZm9yIG1hc3RlciB0aHJlYWQgdGhvdWdoCisgICAgICovCisgICAgaWYgKGRfdG4tPmlzX3ZlYykgeworICAgICAgICBpZiAoIGRfdG4tPmN0LmN0b3J2ICE9IDApIHsKKyAgICAgICAgICAgICh2b2lkKSAoKmRfdG4tPmN0LmN0b3J2KSAodG4tPnBhcl9hZGRyLCBkX3RuLT52ZWNfbGVuKTsKKyAgICAgICAgfSBlbHNlIGlmIChkX3RuLT5jY3QuY2N0b3J2ICE9IDApIHsKKyAgICAgICAgICAgICh2b2lkKSAoKmRfdG4tPmNjdC5jY3RvcnYpICh0bi0+cGFyX2FkZHIsIGRfdG4tPm9ial9pbml0LCBkX3RuLT52ZWNfbGVuKTsKKyAgICAgICAgfSBlbHNlIGlmICh0bi0+cGFyX2FkZHIgIT0gdG4tPmdibF9hZGRyKSB7CisgICAgICAgICAgICBfX2ttcF9jb3B5X2NvbW1vbl9kYXRhKCB0bi0+cGFyX2FkZHIsIGRfdG4tPnBvZF9pbml0ICk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoIGRfdG4tPmN0LmN0b3IgIT0gMCApIHsKKyAgICAgICAgICAgICh2b2lkKSAoKmRfdG4tPmN0LmN0b3IpICh0bi0+cGFyX2FkZHIpOworICAgICAgICB9IGVsc2UgaWYgKGRfdG4tPmNjdC5jY3RvciAhPSAwKSB7CisgICAgICAgICAgICAodm9pZCkgKCpkX3RuLT5jY3QuY2N0b3IpICh0bi0+cGFyX2FkZHIsIGRfdG4tPm9ial9pbml0KTsKKyAgICAgICAgfSBlbHNlIGlmICh0bi0+cGFyX2FkZHIgIT0gdG4tPmdibF9hZGRyKSB7CisgICAgICAgICAgICBfX2ttcF9jb3B5X2NvbW1vbl9kYXRhKCB0bi0+cGFyX2FkZHIsIGRfdG4tPnBvZF9pbml0ICk7CisgICAgICAgIH0KKyAgICB9CisvKiAhQlVJTERfT1BFTk1QX0MKKyAgICBpZiAodG4tPnBhcl9hZGRyICE9IHRuLT5nYmxfYWRkcikKKyAgICAgICAgX19rbXBfY29weV9jb21tb25fZGF0YSggdG4tPnBhcl9hZGRyLCBkX3RuLT5wb2RfaW5pdCApOyAqLworCisgICAgcmV0dXJuIHRuOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIFdlIGFyZSBjdXJyZW50bHkgcGFyYWxsZWwsIGFuZCB3ZSBrbm93IHRoZSB0aHJlYWQgaWQuICAgICAgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIQorIEBpbmdyb3VwIFRIUkVBRFBSSVZBVEUKKworIEBwYXJhbSBsb2Mgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uIAorIEBwYXJhbSBkYXRhICBwb2ludGVyIHRvIGRhdGEgYmVpbmcgcHJpdmF0aXplZCAKKyBAcGFyYW0gY3RvciAgcG9pbnRlciB0byBjb25zdHJ1Y3RvciBmdW5jdGlvbiBmb3IgZGF0YSAKKyBAcGFyYW0gY2N0b3IgIHBvaW50ZXIgdG8gY29weSBjb25zdHJ1Y3RvciBmdW5jdGlvbiBmb3IgZGF0YSAKKyBAcGFyYW0gZHRvciAgcG9pbnRlciB0byBkZXN0cnVjdG9yIGZ1bmN0aW9uIGZvciBkYXRhIAorCisgUmVnaXN0ZXIgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycyBmb3IgdGhyZWFkIHByaXZhdGUgZGF0YS4KKyBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGV4ZWN1dGluZyBpbiBwYXJhbGxlbCwgd2hlbiB3ZSBrbm93IHRoZSB0aHJlYWQgaWQuCisqLwordm9pZAorX19rbXBjX3RocmVhZHByaXZhdGVfcmVnaXN0ZXIoaWRlbnRfdCAqbG9jLCB2b2lkICpkYXRhLCBrbXBjX2N0b3IgY3Rvciwga21wY19jY3RvciBjY3Rvciwga21wY19kdG9yIGR0b3IpCit7CisgICAgc3RydWN0IHNoYXJlZF9jb21tb24gKmRfdG4sICoqbG5rX3RuOworCisgICAgS0NfVFJBQ0UoIDEwLCAoIl9fa21wY190aHJlYWRwcml2YXRlX3JlZ2lzdGVyOiBjYWxsZWRcbiIgKSApOworCisjaWZkZWYgVVNFX0NIRUNLU19DT01NT04KKyAgICAvKiBjb3B5IGNvbnN0cnVjdG9yIG11c3QgYmUgemVybyBmb3IgY3VycmVudCBjb2RlIGdlbiAoTm92IDIwMDIgLSBqcGgpICovCisgICAgS01QX0FTU0VSVCggY2N0b3IgPT0gMCk7CisjZW5kaWYgLyogVVNFX0NIRUNLU19DT01NT04gKi8KKworICAgIC8qIE9ubHkgdGhlIGdsb2JhbCBkYXRhIHRhYmxlIGV4aXN0cy4gKi8KKyAgICBkX3RuID0gX19rbXBfZmluZF9zaGFyZWRfdGFza19jb21tb24oICZfX2ttcF90aHJlYWRwcml2YXRlX2RfdGFibGUsIC0xLCBkYXRhICk7CisKKyAgICBpZiAoZF90biA9PSAwKSB7CisgICAgICAgIGRfdG4gPSAoc3RydWN0IHNoYXJlZF9jb21tb24gKikgX19rbXBfYWxsb2NhdGUoIHNpemVvZiggc3RydWN0IHNoYXJlZF9jb21tb24gKSApOworICAgICAgICBkX3RuLT5nYmxfYWRkciA9IGRhdGE7CisKKyAgICAgICAgZF90bi0+Y3QuY3RvciA9IGN0b3I7CisgICAgICAgIGRfdG4tPmNjdC5jY3RvciA9IGNjdG9yOworICAgICAgICBkX3RuLT5kdC5kdG9yID0gZHRvcjsKKy8qCisgICAgICAgIGRfdG4tPmlzX3ZlYyA9IEZBTFNFOyAgLy8gQUM6IGNvbW1lbnRlZCBvdXQgYmVjYXVzZSBfX2ttcF9hbGxvY2F0ZSB6ZXJvZXMgdGhlIG1lbW9yeQorICAgICAgICBkX3RuLT52ZWNfbGVuID0gMEw7CisgICAgICAgIGRfdG4tPm9ial9pbml0ID0gMDsKKyAgICAgICAgZF90bi0+cG9kX2luaXQgPSAwOworKi8KKyAgICAgICAgbG5rX3RuID0gJihfX2ttcF90aHJlYWRwcml2YXRlX2RfdGFibGUuZGF0YVsgS01QX0hBU0goZGF0YSkgXSk7CisKKyAgICAgICAgZF90bi0+bmV4dCA9ICpsbmtfdG47CisgICAgICAgICpsbmtfdG4gPSBkX3RuOworICAgIH0KK30KKwordm9pZCAqCitfX2ttcGNfdGhyZWFkcHJpdmF0ZShpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkKK3sKKyAgICB2b2lkICpyZXQ7CisgICAgc3RydWN0IHByaXZhdGVfY29tbW9uICp0bjsKKworICAgIEtDX1RSQUNFKCAxMCwgKCJfX2ttcGNfdGhyZWFkcHJpdmF0ZTogVCMlZCBjYWxsZWRcbiIsIGdsb2JhbF90aWQgKSApOworCisjaWZkZWYgVVNFX0NIRUNLU19DT01NT04KKyAgICBpZiAoISBfX2ttcF9pbml0X3NlcmlhbCkKKyAgICAgICAgS01QX0ZBVEFMKCBSVExOb3RJbml0aWFsaXplZCApOworI2VuZGlmIC8qIFVTRV9DSEVDS1NfQ09NTU9OICovCisKKyAgICBpZiAoICEgX19rbXBfdGhyZWFkc1tnbG9iYWxfdGlkXSAtPiB0aC50aF9yb290IC0+IHIucl9hY3RpdmUgJiYgISBfX2ttcF9mb3JlaWduX3RwICkgeworICAgICAgICAvKiBUaGUgcGFyYWxsZWwgYWRkcmVzcyB3aWxsIE5FVkVSIG92ZXJsYXAgd2l0aCB0aGUgZGF0YV9hZGRyZXNzICovCisgICAgICAgIC8qIGRrcDogM3JkIGFyZyB0byBrbXBfdGhyZWFkcHJpdmF0ZV9pbnNlcnRfcHJpdmF0ZV9kYXRhKCkgaXMgdGhlIGRhdGFfYWRkcmVzczsgdXNlIGRhdGFfYWRkcmVzcyA9IGRhdGEgKi8KKworICAgICAgICBLQ19UUkFDRSggMjAsICgiX19rbXBjX3RocmVhZHByaXZhdGU6IFQjJWQgaW5zZXJ0aW5nIHByaXZhdGUgZGF0YVxuIiwgZ2xvYmFsX3RpZCApICk7CisgICAgICAgIGttcF90aHJlYWRwcml2YXRlX2luc2VydF9wcml2YXRlX2RhdGEoIGdsb2JhbF90aWQsIGRhdGEsIGRhdGEsIHNpemUgKTsKKworICAgICAgICByZXQgPSBkYXRhOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgS0NfVFJBQ0UoIDUwLCAoIl9fa21wY190aHJlYWRwcml2YXRlOiBUIyVkIHRyeSB0byBmaW5kIHByaXZhdGUgZGF0YSBhdCBhZGRyZXNzICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxfdGlkLCBkYXRhICkgKTsKKyAgICAgICAgdG4gPSBfX2ttcF90aHJlYWRwcml2YXRlX2ZpbmRfdGFza19jb21tb24oIF9fa21wX3RocmVhZHNbIGdsb2JhbF90aWQgXS0+dGgudGhfcHJpX2NvbW1vbiwgZ2xvYmFsX3RpZCwgZGF0YSApOworCisgICAgICAgIGlmICggdG4gKSB7CisgICAgICAgICAgICBLQ19UUkFDRSggMjAsICgiX19rbXBjX3RocmVhZHByaXZhdGU6IFQjJWQgZm91bmQgZGF0YVxuIiwgZ2xvYmFsX3RpZCApICk7CisjaWZkZWYgVVNFX0NIRUNLU19DT01NT04KKyAgICAgICAgICAgIGlmICgoc2l6ZV90KSBzaXplID4gdG4tPmNtbl9zaXplKSB7CisgICAgICAgICAgICAgICAgS0NfVFJBQ0UoIDEwLCAoICJUSFJFQURQUklWQVRFOiAlcCAoJSIgS01QX1VJTlRQVFJfU1BFQyAiICwlIiBLTVBfVUlOVFBUUl9TUEVDICIpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLCBzaXplLCB0bi0+Y21uX3NpemUgKSApOworICAgICAgICAgICAgICAgIEtNUF9GQVRBTCggVFBDb21tb25CbG9ja3NJbmNvbnNpc3QgKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBVU0VfQ0hFQ0tTX0NPTU1PTiAqLworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLyogVGhlIHBhcmFsbGVsIGFkZHJlc3Mgd2lsbCBORVZFUiBvdmVybGFwIHdpdGggdGhlIGRhdGFfYWRkcmVzcyAqLworICAgICAgICAgICAgLyogZGtwOiAzcmQgYXJnIHRvIGttcF90aHJlYWRwcml2YXRlX2luc2VydCgpIGlzIHRoZSBkYXRhX2FkZHJlc3M7IHVzZSBkYXRhX2FkZHJlc3MgPSBkYXRhICovCisgICAgICAgICAgICBLQ19UUkFDRSggMjAsICgiX19rbXBjX3RocmVhZHByaXZhdGU6IFQjJWQgaW5zZXJ0aW5nIGRhdGFcbiIsIGdsb2JhbF90aWQgKSApOworICAgICAgICAgICAgdG4gPSBrbXBfdGhyZWFkcHJpdmF0ZV9pbnNlcnQoIGdsb2JhbF90aWQsIGRhdGEsIGRhdGEsIHNpemUgKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldCA9IHRuLT5wYXJfYWRkcjsKKyAgICB9CisgICAgS0NfVFJBQ0UoIDEwLCAoIl9fa21wY190aHJlYWRwcml2YXRlOiBUIyVkIGV4aXRpbmc7IHJldHVybiB2YWx1ZSA9ICVwXG4iLAorICAgICAgICAgICAgICAgICAgIGdsb2JhbF90aWQsIHJldCApICk7CisKKyAgICByZXR1cm4gcmV0OworfQorCisvKiEKKyBAaW5ncm91cCBUSFJFQURQUklWQVRFCisgQHBhcmFtIGxvYyBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24gCisgQHBhcmFtIGdsb2JhbF90aWQgIGdsb2JhbCB0aHJlYWQgbnVtYmVyIAorIEBwYXJhbSBkYXRhICBwb2ludGVyIHRvIGRhdGEgdG8gcHJpdmF0aXplIAorIEBwYXJhbSBzaXplICBzaXplIG9mIGRhdGEgdG8gcHJpdmF0aXplIAorIEBwYXJhbSBjYWNoZSAgcG9pbnRlciB0byBjYWNoZSAKKyBAcmV0dXJuIHBvaW50ZXIgdG8gcHJpdmF0ZSBzdG9yYWdlIAorCisgQWxsb2NhdGUgcHJpdmF0ZSBzdG9yYWdlIGZvciB0aHJlYWRwcml2YXRlIGRhdGEuIAorKi8KK3ZvaWQgKgorX19rbXBjX3RocmVhZHByaXZhdGVfY2FjaGVkKAorICAgIGlkZW50X3QgKiAgbG9jLAorICAgIGttcF9pbnQzMiAgZ2xvYmFsX3RpZCwgICAvLyBndGlkLgorICAgIHZvaWQgKiAgICAgZGF0YSwgICAgICAgICAvLyBQb2ludGVyIHRvIG9yaWdpbmFsIGdsb2JhbCB2YXJpYWJsZS4KKyAgICBzaXplX3QgICAgIHNpemUsICAgICAgICAgLy8gU2l6ZSBvZiBvcmlnaW5hbCBnbG9iYWwgdmFyaWFibGUuCisgICAgdm9pZCAqKiogICBjYWNoZQorKSB7CisgICAgS0NfVFJBQ0UoIDEwLCAoIl9fa21wY190aHJlYWRwcml2YXRlX2NhY2hlZDogVCMlZCBjYWxsZWQgd2l0aCBjYWNoZTogJXAsIGFkZHJlc3M6ICVwLCBzaXplOiAlIgorICAgICAgICAgICAgICAgICAgIEtNUF9TSVpFX1RfU1BFQyAiXG4iLAorICAgICAgICAgICAgICAgICAgIGdsb2JhbF90aWQsICpjYWNoZSwgZGF0YSwgc2l6ZSApICk7CisKKyAgICBpZiAoIFRDUl9QVFIoKmNhY2hlKSA9PSAwKSB7CisgICAgICAgIF9fa21wX2FjcXVpcmVfbG9jayggJiBfX2ttcF9nbG9iYWxfbG9jaywgZ2xvYmFsX3RpZCApOworCisgICAgICAgIGlmICggVENSX1BUUigqY2FjaGUpID09IDApIHsKKyAgICAgICAgICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soJl9fa21wX3RwX2NhY2hlZF9sb2NrKTsKKyAgICAgICAgICAgIF9fa21wX3RwX2NhY2hlZCA9IDE7CisgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCZfX2ttcF90cF9jYWNoZWRfbG9jayk7CisgICAgICAgICAgICB2b2lkICoqIG15X2NhY2hlOworICAgICAgICAgICAgS01QX0lUVF9JR05PUkUoCisgICAgICAgICAgICBteV9jYWNoZSA9ICh2b2lkKiopCisgICAgICAgICAgICAgICAgX19rbXBfYWxsb2NhdGUoc2l6ZW9mKCB2b2lkICogKSAqIF9fa21wX3RwX2NhcGFjaXR5ICsgc2l6ZW9mICgga21wX2NhY2hlZF9hZGRyX3QgKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgLy8gTm8gbmVlZCB0byB6ZXJvIHRoZSBhbGxvY2F0ZWQgbWVtb3J5OyBfX2ttcF9hbGxvY2F0ZSBkb2VzIHRoYXQuCisgICAgICAgICAgICBLQ19UUkFDRSggNTAsICgiX19rbXBjX3RocmVhZHByaXZhdGVfY2FjaGVkOiBUIyVkIGFsbG9jYXRlZCBjYWNoZSBhdCBhZGRyZXNzICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsX3RpZCwgbXlfY2FjaGUgKSApOworICAgICAgICAgICAgCisgICAgICAgICAgICAvKiBUT0RPOiBmcmVlIGFsbCB0aGlzIG1lbW9yeSBpbiBfX2ttcF9jb21tb25fZGVzdHJveSB1c2luZyBfX2ttcF90aHJlYWRwcml2X2NhY2hlX2xpc3QgKi8KKyAgICAgICAgICAgIC8qIEFkZCBhZGRyZXNzIG9mIG15Y2FjaGUgdG8gbGlua2VkIGxpc3QgZm9yIGNsZWFudXAgbGF0ZXIgICovCisgICAgICAgICAgICBrbXBfY2FjaGVkX2FkZHJfdCAqdHBfY2FjaGVfYWRkcjsKKworICAgICAgICAgICAgdHBfY2FjaGVfYWRkciA9IChrbXBfY2FjaGVkX2FkZHJfdCAqKSAmIG15X2NhY2hlW19fa21wX3RwX2NhcGFjaXR5XTsKKyAgICAgICAgICAgIHRwX2NhY2hlX2FkZHIgLT4gYWRkciA9IG15X2NhY2hlOworICAgICAgICAgICAgdHBfY2FjaGVfYWRkciAtPiBuZXh0ID0gX19rbXBfdGhyZWFkcHJpdl9jYWNoZV9saXN0OworICAgICAgICAgICAgX19rbXBfdGhyZWFkcHJpdl9jYWNoZV9saXN0ID0gdHBfY2FjaGVfYWRkcjsKKworICAgICAgICAgICAgS01QX01CKCk7CisKKyAgICAgICAgICAgIFRDV19QVFIoICpjYWNoZSwgbXlfY2FjaGUpOworCisgICAgICAgICAgICBLTVBfTUIoKTsKKyAgICAgICAgfQorCisgICAgICAgIF9fa21wX3JlbGVhc2VfbG9jayggJiBfX2ttcF9nbG9iYWxfbG9jaywgZ2xvYmFsX3RpZCApOworICAgIH0KKworICAgIHZvaWQgKnJldDsKKyAgICBpZiAoKHJldCA9IFRDUl9QVFIoKCpjYWNoZSlbIGdsb2JhbF90aWQgXSkpID09IDApIHsKKyAgICAgICAgcmV0ID0gX19rbXBjX3RocmVhZHByaXZhdGUoIGxvYywgZ2xvYmFsX3RpZCwgZGF0YSwgKHNpemVfdCkgc2l6ZSk7CisKKyAgICAgICAgVENXX1BUUiggKCpjYWNoZSlbIGdsb2JhbF90aWQgXSwgcmV0KTsKKyAgICB9CisgICAgS0NfVFJBQ0UoIDEwLCAoIl9fa21wY190aHJlYWRwcml2YXRlX2NhY2hlZDogVCMlZCBleGl0aW5nOyByZXR1cm4gdmFsdWUgPSAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICBnbG9iYWxfdGlkLCByZXQgKSApOworCisgICAgcmV0dXJuIHJldDsKK30KKworLyohCisgQGluZ3JvdXAgVEhSRUFEUFJJVkFURQorIEBwYXJhbSBsb2Mgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uIAorIEBwYXJhbSBkYXRhICBwb2ludGVyIHRvIGRhdGEgYmVpbmcgcHJpdmF0aXplZCAKKyBAcGFyYW0gY3RvciAgcG9pbnRlciB0byBjb25zdHJ1Y3RvciBmdW5jdGlvbiBmb3IgZGF0YSAKKyBAcGFyYW0gY2N0b3IgIHBvaW50ZXIgdG8gY29weSBjb25zdHJ1Y3RvciBmdW5jdGlvbiBmb3IgZGF0YSAKKyBAcGFyYW0gZHRvciAgcG9pbnRlciB0byBkZXN0cnVjdG9yIGZ1bmN0aW9uIGZvciBkYXRhIAorIEBwYXJhbSB2ZWN0b3JfbGVuZ3RoIGxlbmd0aCBvZiB0aGUgdmVjdG9yIChieXRlcyBvciBlbGVtZW50cz8pCisgUmVnaXN0ZXIgdmVjdG9yIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMgZm9yIHRocmVhZCBwcml2YXRlIGRhdGEuCisqLwordm9pZAorX19rbXBjX3RocmVhZHByaXZhdGVfcmVnaXN0ZXJfdmVjKCBpZGVudF90ICpsb2MsIHZvaWQgKmRhdGEsIGttcGNfY3Rvcl92ZWMgY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wY19jY3Rvcl92ZWMgY2N0b3IsIGttcGNfZHRvcl92ZWMgZHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHZlY3Rvcl9sZW5ndGggKQoreworICAgIHN0cnVjdCBzaGFyZWRfY29tbW9uICpkX3RuLCAqKmxua190bjsKKworICAgIEtDX1RSQUNFKCAxMCwgKCJfX2ttcGNfdGhyZWFkcHJpdmF0ZV9yZWdpc3Rlcl92ZWM6IGNhbGxlZFxuIiApICk7CisKKyNpZmRlZiBVU0VfQ0hFQ0tTX0NPTU1PTgorICAgIC8qIGNvcHkgY29uc3RydWN0b3IgbXVzdCBiZSB6ZXJvIGZvciBjdXJyZW50IGNvZGUgZ2VuIChOb3YgMjAwMiAtIGpwaCkgKi8KKyAgICBLTVBfQVNTRVJUKCBjY3RvciA9PSAwKTsKKyNlbmRpZiAvKiBVU0VfQ0hFQ0tTX0NPTU1PTiAqLworCisgICAgZF90biA9IF9fa21wX2ZpbmRfc2hhcmVkX3Rhc2tfY29tbW9uKCAmX19rbXBfdGhyZWFkcHJpdmF0ZV9kX3RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEsIGRhdGEgKTsgICAgICAgIC8qIE9ubHkgdGhlIGdsb2JhbCBkYXRhIHRhYmxlIGV4aXN0cy4gKi8KKworICAgIGlmIChkX3RuID09IDApIHsKKyAgICAgICAgZF90biA9IChzdHJ1Y3Qgc2hhcmVkX2NvbW1vbiAqKSBfX2ttcF9hbGxvY2F0ZSggc2l6ZW9mKCBzdHJ1Y3Qgc2hhcmVkX2NvbW1vbiApICk7CisgICAgICAgIGRfdG4tPmdibF9hZGRyID0gZGF0YTsKKworICAgICAgICBkX3RuLT5jdC5jdG9ydiA9IGN0b3I7CisgICAgICAgIGRfdG4tPmNjdC5jY3RvcnYgPSBjY3RvcjsKKyAgICAgICAgZF90bi0+ZHQuZHRvcnYgPSBkdG9yOworICAgICAgICBkX3RuLT5pc192ZWMgPSBUUlVFOworICAgICAgICBkX3RuLT52ZWNfbGVuID0gKHNpemVfdCkgdmVjdG9yX2xlbmd0aDsKKy8qCisgICAgICAgIGRfdG4tPm9ial9pbml0ID0gMDsgIC8vIEFDOiBjb21tZW50ZWQgb3V0IGJlY2F1c2UgX19rbXBfYWxsb2NhdGUgemVyb2VzIHRoZSBtZW1vcnkKKyAgICAgICAgZF90bi0+cG9kX2luaXQgPSAwOworKi8KKyAgICAgICAgbG5rX3RuID0gJihfX2ttcF90aHJlYWRwcml2YXRlX2RfdGFibGUuZGF0YVsgS01QX0hBU0goZGF0YSkgXSk7CisKKyAgICAgICAgZF90bi0+bmV4dCA9ICpsbmtfdG47CisgICAgICAgICpsbmtfdG4gPSBkX3RuOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF91dGlsaXR5LmMgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfdXRpbGl0eS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4MGZjZWEKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfdXRpbGl0eS5jCkBAIC0wLDAgKzEsNDQyIEBACisvKgorICoga21wX3V0aWxpdHkuYyAtLSBVdGlsaXR5IHJvdXRpbmVzIGZvciB0aGUgT3Blbk1QIHN1cHBvcnQgbGlicmFyeS4KKyAqICRSZXZpc2lvbjogNDI5NTEgJAorICogJERhdGU6IDIwMTQtMDEtMjEgMTQ6NDE6NDEgLTA2MDAgKFR1ZSwgMjEgSmFuIDIwMTQpICQKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgImttcC5oIgorI2luY2x1ZGUgImttcF93cmFwcGVyX2dldHBpZC5oIgorI2luY2x1ZGUgImttcF9zdHIuaCIKKyNpbmNsdWRlIDxmbG9hdC5oPgorI2luY2x1ZGUgImttcF9pMThuLmgiCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBjb25zdCBjaGFyICp1bmtub3duID0gInVua25vd24iOworCisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorCisvKiBOT1RFOiBJZiBjYWxsZWQgYmVmb3JlIHNlcmlhbF9pbml0aWFsaXplIChpLmUuIGZyb20gcnVudGltZV9pbml0aWFsaXplKSwgdGhlbiAqLworLyogdGhlIGRlYnVnZ2luZyBwYWNrYWdlIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCB5ZXQsIGFuZCBvbmx5ICIwIiB3aWxsIHByaW50ICAgKi8KKy8qIGRlYnVnZ2luZyBvdXRwdXQgc2luY2UgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBoYXZlIG5vdCBiZWVuIHJlYWQuICAgICAgICAgICovCisKK3N0YXRpYyBpbnQgdHJhY2VfbGV2ZWwgPSA1OworCisvKgorICogTE9HX0lEX0JJVFMgID0gKCAxICsgZmxvb3IoIGxvZ18yKCBtYXgoIGxvZ19wZXJfcGh5IC0gMSwgMSApKSkpCisgKiBBUElDX0lEICAgICAgPSAoUEhZX0lEIDw8IExPR19JRF9CSVRTKSB8IExPR19JRAorICogUEhZX0lEICAgICAgID0gQVBJQ19JRCA+PiBMT0dfSURfQklUUworICovCitpbnQKK19fa21wX2dldF9waHlzaWNhbF9pZCggaW50IGxvZ19wZXJfcGh5LCBpbnQgYXBpY19pZCApCit7CisgICBpbnQgaW5kZXhfbHNiLCBpbmRleF9tc2IsIHRlbXA7CisKKyAgIGlmIChsb2dfcGVyX3BoeSA+IDEpIHsKKwlpbmRleF9sc2IgPSAwOworCWluZGV4X21zYiA9IDMxOworCisJdGVtcCA9IGxvZ19wZXJfcGh5OworICAgICAgICB3aGlsZSAoICh0ZW1wICYgMSkgPT0gMCApIHsKKwkgICAgdGVtcCAgPj49IDE7CisJICAgIGluZGV4X2xzYisrOworCX0KKworCXRlbXAgPSBsb2dfcGVyX3BoeTsKKwl3aGlsZSAoICh0ZW1wICYgMHg4MDAwMDAwMCk9PTAgKSB7CisJICAgIHRlbXAgPDw9IDE7CisJICAgIGluZGV4X21zYi0tOworCX0KKworCS8qIElmID4xIGJpdHMgd2VyZSBzZXQgaW4gbG9nX3Blcl9waHksIGNob29zZSBuZXh0IGhpZ2hlciBwb3dlciBvZiAyICovCisJaWYgKGluZGV4X2xzYiAhPSBpbmRleF9tc2IpIGluZGV4X21zYisrOworCisJcmV0dXJuICggKGludCkgKGFwaWNfaWQgPj4gaW5kZXhfbXNiKSApOworICAgfQorCisgICByZXR1cm4gYXBpY19pZDsKK30KKworCisvKgorICogTE9HX0lEX0JJVFMgID0gKCAxICsgZmxvb3IoIGxvZ18yKCBtYXgoIGxvZ19wZXJfcGh5IC0gMSwgMSApKSkpCisgKiBBUElDX0lEICAgICAgPSAoUEhZX0lEIDw8IExPR19JRF9CSVRTKSB8IExPR19JRAorICogTE9HX0lEICAgICAgID0gQVBJQ19JRCAmICgoIDEgPDwgTE9HX0lEX0JJVFMgKSAtIDEgKQorICovCitpbnQKK19fa21wX2dldF9sb2dpY2FsX2lkKCBpbnQgbG9nX3Blcl9waHksIGludCBhcGljX2lkICkKK3sKKyAgIHVuc2lnbmVkIGN1cnJlbnRfYml0OworICAgaW50IGJpdHNfc2VlbjsKKyAgIHVuc2lnbmVkIG1hc2s7CisKKyAgIGlmIChsb2dfcGVyX3BoeSA8PSAxKSByZXR1cm4gKCAwICk7CisKKyAgIGJpdHNfc2VlbiA9IDA7CisKKyAgIGZvciAoY3VycmVudF9iaXQgPSAxOyBsb2dfcGVyX3BoeSAhPSAwOyBjdXJyZW50X2JpdCA8PD0gMSkgeworCWlmICggbG9nX3Blcl9waHkgJiBjdXJyZW50X2JpdCApIHsKKwkgICAgbG9nX3Blcl9waHkgJj0gfmN1cnJlbnRfYml0OworCSAgICBiaXRzX3NlZW4rKzsKKwl9CisgICB9CisKKyAgIC8qIElmIGV4YWN0bHkgMSBiaXQgd2FzIHNldCBpbiBsb2dfcGVyX3BoeSwgY2hvb3NlIG5leHQgbG93ZXIgcG93ZXIgb2YgMiAqLworICAgaWYgKGJpdHNfc2VlbiA9PSAxKSB7CisJY3VycmVudF9iaXQgPj49IDE7CisgICB9CisKKyAgIHJldHVybiAoIChpbnQpICgoY3VycmVudF9iaXQgLSAxKSAmIGFwaWNfaWQpICk7Cit9CisKKworc3RhdGljCitrbXBfdWludDY0CitfX2ttcF9wYXJzZV9mcmVxdWVuY3koICAgICAgICAvLyBSOiBGcmVxdWVuY3kgaW4gSHouCisgICAgY2hhciBjb25zdCAqIGZyZXF1ZW5jeSAgICAvLyBJOiBGbG9hdCBudW1iZXIgYW5kIHVuaXQ6IE1IeiwgR0h6LCBvciBUR3ouCispIHsKKworICAgIGRvdWJsZSAgICAgICB2YWx1ZSAgPSAwLjA7CisgICAgY2hhciBjb25zdCAqIHVuaXQgICA9IE5VTEw7CisgICAga21wX3VpbnQ2NCAgIHJlc3VsdCA9IH4gMDsKKworICAgIGlmICggZnJlcXVlbmN5ID09IE5VTEwgKSB7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfTsgLy8gaWYKKyAgICB2YWx1ZSA9IHN0cnRvZCggZnJlcXVlbmN5LCAoY2hhciAqICopICYgdW5pdCApOyAvLyBzdHJ0b2QoKSBkb2VzIG5vdCBsaWtlICJjaGFyIGNvbnRzICoiLgorICAgIGlmICggMCA8IHZhbHVlICYmIHZhbHVlIDw9IERCTF9NQVggKSB7ICAgICAgICAgIC8vIEdvb2QgdmFsdWUgKG5vdCBvdmVyZmxvdywgdW5kZXJmbG93LCBldGMpLgorICAgICAgICBpZiAoIHN0cmNtcCggdW5pdCwgIk1IeiIgKSA9PSAwICkgeworICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZSAqIDEuMEUrNjsKKyAgICAgICAgfSBlbHNlIGlmICggc3RyY21wKCB1bml0LCAiR0h6IiApID09IDAgKSB7CisgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlICogMS4wRSs5OworICAgICAgICB9IGVsc2UgaWYgKCBzdHJjbXAoIHVuaXQsICJUSHoiICkgPT0gMCApIHsKKyAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgKiAxLjBFKzEyOworICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAvLyBXcm9uZyB1bml0LgorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgcmVzdWx0ID0gdmFsdWU7CisgICAgfTsgLy8gaWYKKyAgICByZXR1cm4gcmVzdWx0OworCit9OyAvLyBmdW5jIF9fa21wX3BhcnNlX2NwdV9mcmVxdWVuY3kKKwordm9pZAorX19rbXBfcXVlcnlfY3B1aWQoIGttcF9jcHVpbmZvX3QgKnAgKQoreworICAgIHN0cnVjdCBrbXBfY3B1aWQgYnVmOworICAgIGludCBtYXhfYXJnOworICAgIGludCBsb2dfcGVyX3BoeTsKKyAgICBpbnQgY2ZsdXNoX3NpemU7CisKKyAgICBwLT5pbml0aWFsaXplZCA9IDE7CisKKyAgICBwLT5zc2UyID0gMTsgLy8gQXNzdW1lIFNTRTIgYnkgZGVmYXVsdC4KKworICAgIF9fa21wX3g4Nl9jcHVpZCggMCwgMCwgJmJ1ZiApOworCisgICAgS0FfVFJBQ0UoIHRyYWNlX2xldmVsLCAoIklORk86IENQVUlEICVkOiBFQVg9MHglMDhYIEVCWD0weCUwOFggRUNYPTB4JTA4WCBFRFg9MHglMDhYXG4iLAorICAgICAgICAwLCBidWYuZWF4LCBidWYuZWJ4LCBidWYuZWN4LCBidWYuZWR4ICkgKTsKKworICAgIG1heF9hcmcgPSBidWYuZWF4OworCisgICAgcC0+YXBpY19pZCA9IC0xOworCisgICAgaWYgKG1heF9hcmcgPj0gMSkgeworICAgICAgICBpbnQgaTsKKyAgICAgICAga21wX3VpbnQzMiB0LCBkYXRhWyA0IF07CisKKyAgICAgICAgX19rbXBfeDg2X2NwdWlkKCAxLCAwLCAmYnVmICk7CisgICAgICAgIEtBX1RSQUNFKCB0cmFjZV9sZXZlbCwgKCJJTkZPOiBDUFVJRCAlZDogRUFYPTB4JTA4WCBFQlg9MHglMDhYIEVDWD0weCUwOFggRURYPTB4JTA4WFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgYnVmLmVheCwgYnVmLmVieCwgYnVmLmVjeCwgYnVmLmVkeCApICk7CisKKyAgICAgICAgeworI2RlZmluZSBnZXRfdmFsdWUocmVnLGxvLG1hc2spICggKCAoIHJlZyApID4+ICggbG8gKSApICYgKCBtYXNrICApICkKKworICAgICAgICAgICAgcC0+c2lnbmF0dXJlID0gYnVmLmVheDsKKyAgICAgICAgICAgIHAtPmZhbWlseSAgICA9ICAgZ2V0X3ZhbHVlKCBidWYuZWF4LCAyMCwgMHhmZiApICAgICAgICArIGdldF92YWx1ZSggYnVmLmVheCwgOCwgMHgwZiApOworICAgICAgICAgICAgcC0+bW9kZWwgICAgID0gKCBnZXRfdmFsdWUoIGJ1Zi5lYXgsIDE2LCAweDBmICkgPDwgNCApICsgZ2V0X3ZhbHVlKCBidWYuZWF4LCA0LCAweDBmICk7CisgICAgICAgICAgICBwLT5zdGVwcGluZyAgPSAgIGdldF92YWx1ZSggYnVmLmVheCwgIDAsIDB4MGYgKTsKKworI3VuZGVmIGdldF92YWx1ZQorCisgICAgICAgICAgICBLQV9UUkFDRSggdHJhY2VfbGV2ZWwsICgiIGZhbWlseSA9ICVkLCBtb2RlbCA9ICVkLCBzdGVwcGluZyA9ICVkXG4iLCBwLT5mYW1pbHksIHAtPm1vZGVsLCBwLT5zdGVwcGluZyApICk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKCB0ID0gYnVmLmVieCwgaSA9IDA7IGkgPCA0OyB0ID4+PSA4LCArK2kgKSB7CisgICAgICAgICAgICBkYXRhWyBpIF0gPSAodCAmIDB4ZmYpOworICAgICAgICB9OyAvLyBmb3IKKworICAgICAgICBwLT5zc2UyID0gKCBidWYuZWR4ID4+IDI2ICkgJiAxOworCisjaWZkZWYgS01QX0RFQlVHCisKKyAgICAgICAgaWYgKCAoYnVmLmVkeCA+PiA0KSAmIDEgKSB7CisgICAgICAgICAgICAvKiBUU0MgLSBUaW1lc3RhbXAgQ291bnRlciBBdmFpbGFibGUgKi8KKyAgICAgICAgICAgIEtBX1RSQUNFKCB0cmFjZV9sZXZlbCwgKCIgVFNDIiApICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCAoYnVmLmVkeCA+PiA4KSAmIDEgKSB7CisgICAgICAgICAgICAvKiBDWDggLSBDTVBYQ0hHOEIgSW5zdHJ1Y3Rpb24gQXZhaWxhYmxlICovCisgICAgICAgICAgICBLQV9UUkFDRSggdHJhY2VfbGV2ZWwsICgiIENYOCIgKSApOworICAgICAgICB9CisgICAgICAgIGlmICggKGJ1Zi5lZHggPj4gOSkgJiAxICkgeworICAgICAgICAgICAgLyogQVBJQyAtIExvY2FsIEFQSUMgUHJlc2VudCAobXVsdGktcHJvY2Vzc29yIG9wZXJhdGlvbiBzdXBwb3J0ICovCisgICAgICAgICAgICBLQV9UUkFDRSggdHJhY2VfbGV2ZWwsICgiIEFQSUMiICkgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIChidWYuZWR4ID4+IDE1KSAmIDEgKSB7CisgICAgICAgICAgICAvKiBDTU9WIC0gQ29uZGl0aW9uYWwgTU9WZSBJbnN0cnVjdGlvbiBBdmFpbGFibGUgKi8KKyAgICAgICAgICAgIEtBX1RSQUNFKCB0cmFjZV9sZXZlbCwgKCIgQ01PViIgKSApOworICAgICAgICB9CisgICAgICAgIGlmICggKGJ1Zi5lZHggPj4gMTgpICYgMSApIHsKKyAgICAgICAgICAgIC8qIFBTTiAtIFByb2Nlc3NvciBTZXJpYWwgTnVtYmVyIEF2YWlsYWJsZSAqLworICAgICAgICAgICAgS0FfVFJBQ0UoIHRyYWNlX2xldmVsLCAoIiBQU04iICkgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIChidWYuZWR4ID4+IDE5KSAmIDEgKSB7CisgICAgICAgICAgICAvKiBDTEZVTFNIIC0gQ2FjaGUgRmx1c2ggSW5zdHJ1Y3Rpb24gQXZhaWxhYmxlICovCisgICAgICAgICAgICBjZmx1c2hfc2l6ZSA9IGRhdGFbIDEgXSAqIDg7ICAgIC8qIEJpdHMgMTUtMDg6IENMRkxVU0ggbGluZSBzaXplID0gOCAoNjQgYnl0ZXMpICovCisgICAgICAgICAgICBLQV9UUkFDRSggdHJhY2VfbGV2ZWwsICgiIENMRkxVU0goJWRiKSIsIGNmbHVzaF9zaXplICkgKTsKKworICAgICAgICB9CisgICAgICAgIGlmICggKGJ1Zi5lZHggPj4gMjEpICYgMSApIHsKKyAgICAgICAgICAgIC8qIERURVMgLSBEZWJ1ZyBUcmFjZSAmIEVNT04gU3RvcmUgKi8KKyAgICAgICAgICAgIEtBX1RSQUNFKCB0cmFjZV9sZXZlbCwgKCIgRFRFUyIgKSApOworICAgICAgICB9CisgICAgICAgIGlmICggKGJ1Zi5lZHggPj4gMjIpICYgMSApIHsKKyAgICAgICAgICAgIC8qIEFDUEkgLSBBQ1BJIFN1cHBvcnQgQXZhaWxhYmxlICovCisgICAgICAgICAgICBLQV9UUkFDRSggdHJhY2VfbGV2ZWwsICgiIEFDUEkiICkgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIChidWYuZWR4ID4+IDIzKSAmIDEgKSB7CisgICAgICAgICAgICAvKiBNTVggLSBNdWx0aW1lZGlhIEV4dGVuc2lvbnMgKi8KKyAgICAgICAgICAgIEtBX1RSQUNFKCB0cmFjZV9sZXZlbCwgKCIgTU1YIiApICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCAoYnVmLmVkeCA+PiAyNSkgJiAxICkgeworICAgICAgICAgICAgLyogU1NFIC0gU1NFIEluc3RydWN0aW9ucyAqLworICAgICAgICAgICAgS0FfVFJBQ0UoIHRyYWNlX2xldmVsLCAoIiBTU0UiICkgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIChidWYuZWR4ID4+IDI2KSAmIDEgKSB7CisgICAgICAgICAgICAvKiBTU0UyIC0gU1NFMiBJbnN0cnVjdGlvbnMgKi8KKyAgICAgICAgICAgIEtBX1RSQUNFKCB0cmFjZV9sZXZlbCwgKCIgU1NFMiIgKSApOworICAgICAgICB9CisgICAgICAgIGlmICggKGJ1Zi5lZHggPj4gMjcpICYgMSApIHsKKyAgICAgICAgICAgIC8qIFNMRlNOUCAtIFNlbGYtU25vb3BpbmcgQ2FjaGUgKi8KKyAgICAgICAgICAgIEtBX1RSQUNFKCB0cmFjZV9sZXZlbCwgKCIgU0xGU05QIiApICk7CisgICAgICAgIH0KKyNlbmRpZiAvKiBLTVBfREVCVUcgKi8KKworICAgICAgICBfX2ttcF9odF9jYXBhYmxlID0gRkFMU0U7CisgICAgICAgIGlmICggKGJ1Zi5lZHggPj4gMjgpICYgMSApIHsKKworICAgICAgICAgICAgLyogSFQgLSBQcm9jZXNzb3IgaXMgSFQgRW5hYmxlZCAoZm9ybWVybHkgSlQpICovCisgICAgICAgICAgICBfX2ttcF9odF9jYXBhYmxlID0gVFJVRTsKKworICAgICAgICAgICAgLyogQml0cyAyMy0xNjogTG9naWNhbCBQcm9jZXNzb3JzIHBlciBQaHlzaWNhbCBQcm9jZXNzb3IgKDEgZm9yIFA0KSAqLworICAgICAgICAgICAgbG9nX3Blcl9waHkgPSBkYXRhWyAyIF07CisgICAgICAgICAgICBfX2ttcF9odF9sb2dfcGVyX3BoeSA9IGxvZ19wZXJfcGh5OworCisgICAgICAgICAgICBwLT5hcGljX2lkICAgICA9IGRhdGFbIDMgXTsgLyogQml0cyAzMS0yNDogUHJvY2Vzc29yIEluaXRpYWwgQVBJQyBJRCAoWCkgKi8KKyAgICAgICAgICAgIEtBX1RSQUNFKCB0cmFjZV9sZXZlbCwgKCIgSFQoJWQgVFBVcykiLCBsb2dfcGVyX3BoeSApICk7CisKKyAgICAgICAgICAgIGlmKCBsb2dfcGVyX3BoeSA+IDEgKSB7CisgICAgICAgICAgICAgICAgLyogZGVmYXVsdCB0byAxayBGT1IgSlQtZW5hYmxlZCBwcm9jZXNzb3JzICg0ayBvbiBPUyBYKikgKi8KKyNpZiBLTVBfT1NfREFSV0lOCisgICAgICAgICAgICAgICAgcC0+Y3B1X3N0YWNrb2Zmc2V0ID0gNCAqIDEwMjQ7CisjZWxzZQorICAgICAgICAgICAgICAgIHAtPmNwdV9zdGFja29mZnNldCA9IDEgKiAxMDI0OworI2VuZGlmCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHAtPnBoeXNpY2FsX2lkID0gX19rbXBfZ2V0X3BoeXNpY2FsX2lkKCBsb2dfcGVyX3BoeSwgcC0+YXBpY19pZCApOworICAgICAgICAgICAgcC0+bG9naWNhbF9pZCAgPSBfX2ttcF9nZXRfbG9naWNhbF9pZCggbG9nX3Blcl9waHksIHAtPmFwaWNfaWQgKTsKKyAgICAgICAgfQorI2lmZGVmIEtNUF9ERUJVRworICAgICAgICBpZiAoIChidWYuZWR4ID4+IDI5KSAmIDEgKSB7CisgICAgICAgICAgICAvKiBBVEhST1RMIC0gQXV0b21hdGljIFRocm90dGxlIENvbnRyb2wgKi8KKyAgICAgICAgICAgIEtBX1RSQUNFKCB0cmFjZV9sZXZlbCwgKCIgQVRIUk9UTCIgKSApOworICAgICAgICB9CisgICAgICAgIEtBX1RSQUNFKCB0cmFjZV9sZXZlbCwgKCIgXVxuIiApICk7CisKKyAgICAgICAgZm9yIChpID0gMjsgaSA8PSBtYXhfYXJnOyArK2kpIHsKKyAgICAgICAgICAgIF9fa21wX3g4Nl9jcHVpZCggaSwgMCwgJmJ1ZiApOworICAgICAgICAgICAgS0FfVFJBQ0UoIHRyYWNlX2xldmVsLAorICAgICAgICAgICAgICAgICAgICAgICggIklORk86IENQVUlEICVkOiBFQVg9MHglMDhYIEVCWD0weCUwOFggRUNYPTB4JTA4WCBFRFg9MHglMDhYXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgaSwgYnVmLmVheCwgYnVmLmVieCwgYnVmLmVjeCwgYnVmLmVkeCApICk7CisgICAgICAgIH0KKyNlbmRpZgorI2lmIEtNUF9VU0VfQURBUFRJVkVfTE9DS1MKKyAgICAgICAgcC0+cnRtID0gMDsKKyAgICAgICAgaWYgKG1heF9hcmcgPiA3KQorICAgICAgICB7CisgICAgICAgICAgICAvKiBSVE0gYml0IENQVUlELjA3OkVCWCwgYml0IDExICovCisgICAgICAgICAgICBfX2ttcF94ODZfY3B1aWQoNywgMCwgJmJ1Zik7CisgICAgICAgICAgICBwLT5ydG0gPSAoYnVmLmVieCA+PiAxMSkgJiAxOworICAgICAgICAgICAgS0FfVFJBQ0UoIHRyYWNlX2xldmVsLCAoIiBSVE0iICkgKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgfTsgLy8gaWYKKworICAgIHsgLy8gUGFyc2UgQ1BVIGJyYW5kIHN0cmluZyBmb3IgZnJlcXVlbmN5LgorCisgICAgICAgIHVuaW9uIGttcF9jcHVfYnJhbmRfc3RyaW5nIHsKKyAgICAgICAgICAgIHN0cnVjdCBrbXBfY3B1aWQgYnVmWyAzIF07CisgICAgICAgICAgICBjaGFyICAgICAgICAgICAgIHN0cmluZ1sgc2l6ZW9mKCBzdHJ1Y3Qga21wX2NwdWlkICkgKiAzICsgMSBdOworICAgICAgICB9OyAvLyB1bmlvbiBrbXBfY3B1X2JyYW5kX3N0cmluZworICAgICAgICB1bmlvbiBrbXBfY3B1X2JyYW5kX3N0cmluZyBicmFuZDsKKyAgICAgICAgaW50IGk7CisKKyAgICAgICAgcC0+ZnJlcXVlbmN5ID0gMDsKKworICAgICAgICAvLyBHZXQgQ1BVIGJyYW5kIHN0cmluZy4KKyAgICAgICAgZm9yICggaSA9IDA7IGkgPCAzOyArKyBpICkgeworICAgICAgICAgICAgX19rbXBfeDg2X2NwdWlkKCAweDgwMDAwMDAyICsgaSwgMCwgJmJyYW5kLmJ1ZlsgaSBdICk7CisgICAgICAgIH07IC8vIGZvcgorICAgICAgICBicmFuZC5zdHJpbmdbIHNpemVvZiggYnJhbmQuc3RyaW5nICkgLSAxIF0gPSAwOyAvLyBKdXN0IGluIGNhc2UuIDstKQorICAgICAgICBLQV9UUkFDRSggdHJhY2VfbGV2ZWwsICggImNwdSBicmFuZCBzdHJpbmc6IFwiJXNcIlxuIiwgYnJhbmQuc3RyaW5nICkgKTsKKworICAgICAgICAvLyBQYXJzZSBmcmVxdWVuY3kuCisgICAgICAgIHAtPmZyZXF1ZW5jeSA9IF9fa21wX3BhcnNlX2ZyZXF1ZW5jeSggc3RycmNociggYnJhbmQuc3RyaW5nLCAnICcgKSApOworICAgICAgICBLQV9UUkFDRSggdHJhY2VfbGV2ZWwsICggImNwdSBmcmVxdWVuY3kgZnJvbSBicmFuZCBzdHJpbmc6ICUiIEtNUF9VSU5UNjRfU1BFQyAiXG4iLCBwLT5mcmVxdWVuY3kgKSApOworICAgIH0KK30KKworI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZAorX19rbXBfZXhwYW5kX2hvc3RfbmFtZSggY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVChzaXplID49IHNpemVvZih1bmtub3duKSk7CisjaWYgS01QX09TX1dJTkRPV1MKKyAgICB7CisJRFdPUkQJcyA9IHNpemU7CisKKwlpZiAoISBHZXRDb21wdXRlck5hbWVBKCBidWZmZXIsICYgcyApKQorCSAgICBzdHJjcHkoIGJ1ZmZlciwgdW5rbm93biApOworICAgIH0KKyNlbHNlCisgICAgYnVmZmVyW3NpemUgLSAyXSA9IDA7CisgICAgaWYgKGdldGhvc3RuYW1lKCBidWZmZXIsIHNpemUgKSB8fCBidWZmZXJbc2l6ZSAtIDJdICE9IDApCisJc3RyY3B5KCBidWZmZXIsIHVua25vd24gKTsKKyNlbmRpZgorfQorCisvKiBFeHBhbmQgdGhlIG1ldGEgY2hhcmFjdGVycyBpbiB0aGUgZmlsZW5hbWU6CisgKgorICogQ3VycmVudGx5IGRlZmluZWQgY2hhcmFjdGVycyBhcmU6CisgKgorICogJUggdGhlIGhvc3RuYW1lCisgKiAlUCB0aGUgbnVtYmVyIG9mIHRocmVhZHMgdXNlZC4KKyAqICVJIHRoZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBydW4uCisgKi8KKwordm9pZAorX19rbXBfZXhwYW5kX2ZpbGVfbmFtZSggY2hhciAqcmVzdWx0LCBzaXplX3QgcmxlbiwgY2hhciAqcGF0dGVybiApCit7CisgICAgY2hhcgkqcG9zID0gcmVzdWx0LCAqZW5kID0gcmVzdWx0ICsgcmxlbiAtIDE7CisgICAgY2hhcgkgYnVmZmVyWzI1Nl07CisgICAgaW50CQkgZGVmYXVsdF9jcHVfd2lkdGggPSAxOworICAgIGludCAgICAgICAgICBzbnBfcmVzdWx0OworCisgICAgS01QX0RFQlVHX0FTU0VSVChybGVuID4gMCk7CisgICAgKmVuZCA9IDA7CisgICAgeworCWludCBpOworCWZvcihpID0gX19rbXBfeHByb2M7IGkgPj0gMTA7IGkgLz0gMTAsICsrZGVmYXVsdF9jcHVfd2lkdGgpOworICAgIH0KKworICAgIGlmIChwYXR0ZXJuICE9IE5VTEwpIHsKKwl3aGlsZSAoKnBhdHRlcm4gIT0gJ1wwJyAmJiBwb3MgPCBlbmQpIHsKKwkgICAgaWYgKCpwYXR0ZXJuICE9ICclJykgeworCQkqcG9zKysgPSAqcGF0dGVybisrOworCSAgICB9IGVsc2UgeworCQljaGFyICpvbGRfcGF0dGVybiA9IHBhdHRlcm47CisJCWludCB3aWR0aCA9IDE7CisJCWludCBjcHVfd2lkdGggPSBkZWZhdWx0X2NwdV93aWR0aDsKKworCQkrK3BhdHRlcm47CisKKwkJaWYgKCpwYXR0ZXJuID49ICcwJyAmJiAqcGF0dGVybiA8PSAnOScpIHsKKwkJICAgIHdpZHRoID0gMDsKKwkJICAgIGRvIHsKKwkJCXdpZHRoID0gKHdpZHRoICogMTApICsgKnBhdHRlcm4rKyAtICcwJzsKKwkJICAgIH0gd2hpbGUgKCpwYXR0ZXJuID49ICcwJyAmJiAqcGF0dGVybiA8PSAnOScpOworCQkgICAgaWYgKHdpZHRoIDwgMCB8fCB3aWR0aCA+IDEwMjQpCisJCQl3aWR0aCA9IDE7CisKKwkJICAgIGNwdV93aWR0aCA9IHdpZHRoOworCQl9CisKKwkJc3dpdGNoICgqcGF0dGVybikgeworCQljYXNlICdIJzoKKwkJY2FzZSAnaCc6CisJCSAgICB7CisJCQlfX2ttcF9leHBhbmRfaG9zdF9uYW1lKCBidWZmZXIsIHNpemVvZiggYnVmZmVyICkgKTsKKwkJCXN0cm5jcHkoIHBvcywgIGJ1ZmZlciwgZW5kIC0gcG9zICsgMSk7CisJCQlpZigqZW5kID09IDApIHsKKwkJCSAgICB3aGlsZSAoICpwb3MgKQorCQkJCSsrcG9zOworCQkJICAgICsrcGF0dGVybjsKKwkJCX0gZWxzZQorCQkJICAgIHBvcyA9IGVuZDsKKwkJICAgIH0KKwkJICAgIGJyZWFrOworCQljYXNlICdQJzoKKwkJY2FzZSAncCc6CisJCSAgICB7CisJCQlzbnBfcmVzdWx0ID0gc25wcmludGYoIHBvcywgZW5kIC0gcG9zICsgMSwgIiUwKmQiLCBjcHVfd2lkdGgsIF9fa21wX2RmbHRfdGVhbV9udGggKTsKKwkJCWlmKHNucF9yZXN1bHQgPj0gMCAmJiBzbnBfcmVzdWx0IDw9IGVuZCAtIHBvcykgeworCQkJICAgIHdoaWxlICggKnBvcyApCisJCQkJKytwb3M7CisJCQkgICAgKytwYXR0ZXJuOworCQkJfSBlbHNlCisJCQkgICAgcG9zID0gZW5kOworCQkgICAgfQorCQkgICAgYnJlYWs7CisJCWNhc2UgJ0knOgorCQljYXNlICdpJzoKKwkJICAgIHsKKwkJCXBpZF90IGlkID0gZ2V0cGlkKCk7CisJCQlzbnBfcmVzdWx0ID0gc25wcmludGYoIHBvcywgZW5kIC0gcG9zICsgMSwgIiUwKmQiLCB3aWR0aCwgaWQgKTsKKwkJCWlmKHNucF9yZXN1bHQgPj0gMCAmJiBzbnBfcmVzdWx0IDw9IGVuZCAtIHBvcykgeworCQkJICAgIHdoaWxlICggKnBvcyApCisJCQkJKytwb3M7CisJCQkgICAgKytwYXR0ZXJuOworCQkJfSBlbHNlCisJCQkgICAgcG9zID0gZW5kOworCQkJYnJlYWs7CisJCSAgICB9CisJCWNhc2UgJyUnOgorCQkgICAgeworCQkJKnBvcysrID0gJyUnOworCQkJKytwYXR0ZXJuOworCQkJYnJlYWs7CisJCSAgICB9CisJCWRlZmF1bHQ6CisJCSAgICB7CisJCQkqcG9zKysgPSAnJSc7CisJCQlwYXR0ZXJuID0gb2xkX3BhdHRlcm4gKyAxOworCQkJYnJlYWs7CisJCSAgICB9CisJCX0KKwkgICAgfQorCX0KKwkvKiBUT0RPOiBIb3cgZG8gd2UgZ2V0IHJpZCBvZiB0aGlzPyAqLworCWlmKCpwYXR0ZXJuICE9ICdcMCcpCisJICAgIEtNUF9GQVRBTCggRmlsZU5hbWVUb29Mb25nICk7CisgICAgfQorCisgICAgKnBvcyA9ICdcMCc7Cit9CisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF92ZXJzaW9uLmMgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfdmVyc2lvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3YTI0ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfdmVyc2lvbi5jCkBAIC0wLDAgKzEsMjExIEBACisvKgorICoga21wX3ZlcnNpb24uYworICogJFJldmlzaW9uOiA0MzQzNSAkCisgKiAkRGF0ZTogMjAxNC0wOS0wNCAxNToxNjowOCAtMDUwMCAoVGh1LCAwNCBTZXAgMjAxNCkgJAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAia21wLmgiCisjaW5jbHVkZSAia21wX2lvLmgiCisjaW5jbHVkZSAia21wX3ZlcnNpb24uaCIKKworLy8gUmVwbGFjZSB3aXRoIHNuYXBzaG90IGRhdGUgWVlZWU1NREQgZm9yIHByb21vdGlvbiBidWlsZC4KKyNkZWZpbmUgS01QX1ZFUlNJT05fQlVJTEQgICAgMjAxNDA5MjYKKworLy8gSGVscGVyIG1hY3JvcyB0byBjb252ZXJ0IHZhbHVlIG9mIG1hY3JvIHRvIHN0cmluZyBsaXRlcmFsLgorI2RlZmluZSBfc3RyaW5nZXIoIHggKSAjeAorI2RlZmluZSBzdHJpbmdlciggeCApICBfc3RyaW5nZXIoIHggKQorCisvLyBEZXRlY3QgY29tcGlsZXIuCisjaWYgS01QX0NPTVBJTEVSX0lDQworICAgICNpZiAgIF9fSU5URUxfQ09NUElMRVIgPT0gMTAxMAorICAgICAgICAjZGVmaW5lIEtNUF9DT01QSUxFUiAiSW50ZWwgQysrIENvbXBpbGVyIDEwLjEiCisgICAgI2VsaWYgX19JTlRFTF9DT01QSUxFUiA9PSAxMTAwCisgICAgICAgICNkZWZpbmUgS01QX0NPTVBJTEVSICJJbnRlbCBDKysgQ29tcGlsZXIgMTEuMCIKKyAgICAjZWxpZiBfX0lOVEVMX0NPTVBJTEVSID09IDExMTAKKyAgICAgICAgI2RlZmluZSBLTVBfQ09NUElMRVIgIkludGVsIEMrKyBDb21waWxlciAxMS4xIgorICAgICNlbGlmIF9fSU5URUxfQ09NUElMRVIgPT0gMTIwMAorICAgICAgICAjZGVmaW5lIEtNUF9DT01QSUxFUiAiSW50ZWwgQysrIENvbXBpbGVyIDEyLjAiCisgICAgI2VsaWYgX19JTlRFTF9DT01QSUxFUiA9PSAxMjEwCisgICAgICAgICNkZWZpbmUgS01QX0NPTVBJTEVSICJJbnRlbCBDKysgQ29tcGlsZXIgMTIuMSIKKyAgICAjZWxpZiBfX0lOVEVMX0NPTVBJTEVSID09IDEzMDAKKyAgICAgICAgI2RlZmluZSBLTVBfQ09NUElMRVIgIkludGVsIEMrKyBDb21waWxlciAxMy4wIgorICAgICNlbGlmIF9fSU5URUxfQ09NUElMRVIgPT0gMTMxMAorICAgICAgICAjZGVmaW5lIEtNUF9DT01QSUxFUiAiSW50ZWwgQysrIENvbXBpbGVyIDEzLjEiCisgICAgI2VsaWYgX19JTlRFTF9DT01QSUxFUiA9PSAxNDAwCisgICAgICAgICNkZWZpbmUgS01QX0NPTVBJTEVSICJJbnRlbCBDKysgQ29tcGlsZXIgMTQuMCIKKyAgICAjZWxpZiBfX0lOVEVMX0NPTVBJTEVSID09IDE0MTAKKyAgICAgICAgI2RlZmluZSBLTVBfQ09NUElMRVIgIkludGVsIEMrKyBDb21waWxlciAxNC4xIgorICAgICNlbGlmIF9fSU5URUxfQ09NUElMRVIgPT0gMTUwMAorICAgICAgICAjZGVmaW5lIEtNUF9DT01QSUxFUiAiSW50ZWwgQysrIENvbXBpbGVyIDE1LjAiCisgICAgI2VsaWYgX19JTlRFTF9DT01QSUxFUiA9PSA5OTk5CisgICAgICAgICNkZWZpbmUgS01QX0NPTVBJTEVSICJJbnRlbCBDKysgQ29tcGlsZXIgbWFpbmxpbmUiCisgICAgI2VuZGlmCisjZWxpZiBLTVBfQ09NUElMRVJfQ0xBTkcKKyAgICAjZGVmaW5lIEtNUF9DT01QSUxFUiAiQ2xhbmcgIiBzdHJpbmdlciggX19jbGFuZ19tYWpvcl9fICkgIi4iIHN0cmluZ2VyKCBfX2NsYW5nX21pbm9yX18gKQorI2VsaWYgS01QX0NPTVBJTEVSX0dDQworICAgICNkZWZpbmUgS01QX0NPTVBJTEVSICJHQ0MgIiBzdHJpbmdlciggX19HTlVDX18gKSAiLiIgc3RyaW5nZXIoIF9fR05VQ19NSU5PUl9fICkKKyNlbGlmIEtNUF9DT01QSUxFUl9NU1ZDCisgICAgI2RlZmluZSBLTVBfQ09NUElMRVIgIk1TVkMgIiBzdHJpbmdlciggX01TQ19GVUxMX1ZFUiApCisjZW5kaWYKKyNpZm5kZWYgS01QX0NPTVBJTEVSCisgICAgI3dhcm5pbmcgIlVua25vd24gY29tcGlsZXIiCisgICAgI2RlZmluZSBLTVBfQ09NUElMRVIgInVua25vd24gY29tcGlsZXIiCisjZW5kaWYKKworLy8gRGV0ZWN0IGxpYnJyYXkgdHlwZSAocGVyZiwgc3R1YikuCisjaWZkZWYgS01QX1NUVUIKKyAgICAjZGVmaW5lIEtNUF9MSUJfVFlQRSAic3R1YiIKKyNlbHNlCisgICAgI2RlZmluZSBLTVBfTElCX1RZUEUgInBlcmZvcm1hbmNlIgorI2VuZGlmIC8vIEtNUF9MSUJfVFlQRQorCisvLyBEZXRlY3QgbGluayB0eXBlIChzdGF0aWMsIGR5bmFtaWMpLgorI2lmZGVmIEdVSURFRExMX0VYUE9SVFMKKyAgICAjZGVmaW5lIEtNUF9MSU5LX1RZUEUgImR5bmFtaWMiCisjZWxzZQorICAgICNkZWZpbmUgS01QX0xJTktfVFlQRSAic3RhdGljIgorI2VuZGlmIC8vIEtNUF9MSU5LX1RZUEUKKworLy8gRmluYWxseSwgZGVmaW5lIHN0cmluZ3MuCisjZGVmaW5lIEtNUF9MSUJSQVJZICAgS01QX0xJQl9UWVBFICIgbGlicmFyeSAoIiBLTVBfTElOS19UWVBFICIpIgorI2RlZmluZSBLTVBfQ09QWVJJR0hUICIiCisKK2ludCBjb25zdCBfX2ttcF92ZXJzaW9uX21ham9yID0gS01QX1ZFUlNJT05fTUFKT1I7CitpbnQgY29uc3QgX19rbXBfdmVyc2lvbl9taW5vciA9IEtNUF9WRVJTSU9OX01JTk9SOworaW50IGNvbnN0IF9fa21wX3ZlcnNpb25fYnVpbGQgPSBLTVBfVkVSU0lPTl9CVUlMRDsKK2ludCBjb25zdCBfX2ttcF9vcGVubXBfdmVyc2lvbiA9CisgICAgI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgIDIwMTMwNzsKKyAgICAjZWxzZQorICAgICAgICAyMDExMDc7CisgICAgI2VuZGlmCisKKy8qIERvIE5PVCBjaGFuZ2UgdGhlIGZvcm1hdCBvZiB0aGlzIHN0cmluZyEgIEludGVsKFIpIFRocmVhZCBQcm9maWxlciBjaGVja3MgZm9yIGEKKyAgIHNwZWNpZmljIGZvcm1hdCBzb21lIGNoYW5nZXMgaW4gdGhlIHJlY29nbml0aW9uIHJvdXRpbmUgdGhlcmUgbmVlZCB0bworICAgYmUgbWFkZSBiZWZvcmUgdGhpcyBpcyBjaGFuZ2VkLgorKi8KK2NoYXIgY29uc3QgX19rbXBfY29weXJpZ2h0W10gPQorICAgIEtNUF9WRVJTSU9OX1BSRUZJWCBLTVBfTElCUkFSWQorICAgICIgdmVyLiAiIHN0cmluZ2VyKCBLTVBfVkVSU0lPTl9NQUpPUiApICIuIiBzdHJpbmdlciggS01QX1ZFUlNJT05fTUlOT1IgKQorICAgICIuIiBzdHJpbmdlciggS01QX1ZFUlNJT05fQlVJTEQgKSAiICIKKyAgICBLTVBfQ09QWVJJR0hUOworCitjaGFyIGNvbnN0IF9fa21wX3ZlcnNpb25fY29weXJpZ2h0W10gICAgICA9IEtNUF9WRVJTSU9OX1BSRUZJWCBLTVBfQ09QWVJJR0hUOworY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX2xpYl92ZXJbXSAgICAgICAgPSBLTVBfVkVSU0lPTl9QUkVGSVggInZlcnNpb246ICIgc3RyaW5nZXIoIEtNUF9WRVJTSU9OX01BSk9SICkgIi4iIHN0cmluZ2VyKCBLTVBfVkVSU0lPTl9NSU5PUiApICIuIiBzdHJpbmdlciggS01QX1ZFUlNJT05fQlVJTEQgKTsKK2NoYXIgY29uc3QgX19rbXBfdmVyc2lvbl9saWJfdHlwZVtdICAgICAgID0gS01QX1ZFUlNJT05fUFJFRklYICJsaWJyYXJ5IHR5cGU6ICIgS01QX0xJQl9UWVBFOworY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX2xpbmtfdHlwZVtdICAgICAgPSBLTVBfVkVSU0lPTl9QUkVGSVggImxpbmsgdHlwZTogIiBLTVBfTElOS19UWVBFOworY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX2J1aWxkX3RpbWVbXSAgICAgPSBLTVBfVkVSU0lPTl9QUkVGSVggImJ1aWxkIHRpbWU6ICIgX0tNUF9CVUlMRF9USU1FOworI2lmIEtNUF9NSUMyCisgICAgY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX3RhcmdldF9lbnZbXSA9IEtNUF9WRVJTSU9OX1BSRUZJWCAidGFyZ2V0IGVudmlyb25tZW50OiBNSUMyIjsKKyNlbmRpZgorY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX2J1aWxkX2NvbXBpbGVyW10gPSBLTVBfVkVSU0lPTl9QUkVGSVggImJ1aWxkIGNvbXBpbGVyOiAiIEtNUF9DT01QSUxFUjsKKworLy8KKy8vIENhbGxlZCBhdCBzZXJpYWwgaW5pdGlhbGl6YXRpb24gdGltZS4KKy8vCitzdGF0aWMgaW50IF9fa21wX3ZlcnNpb25fMV9wcmludGVkID0gRkFMU0U7CisKK3ZvaWQKK19fa21wX3ByaW50X3ZlcnNpb25fMSggdm9pZCApCit7CisgICAgaWYgKCBfX2ttcF92ZXJzaW9uXzFfcHJpbnRlZCApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH07IC8vIGlmCisgICAgX19rbXBfdmVyc2lvbl8xX3ByaW50ZWQgPSBUUlVFOworCisgICAgI2lmbmRlZiBLTVBfU1RVQgorICAgICAgICBrbXBfc3RyX2J1Zl90IGJ1ZmZlcjsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9pbml0KCAmIGJ1ZmZlciApOworICAgICAgICAvLyBQcmludCB2ZXJzaW9uIHN0cmluZ3Mgc2tpcHBpbmcgaW5pdGlhbCBtYWdpYy4KKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBidWZmZXIsICIlc1xuIiwgJiBfX2ttcF92ZXJzaW9uX2xpYl92ZXJbIEtNUF9WRVJTSU9OX01BR0lDX0xFTiBdICk7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICYgYnVmZmVyLCAiJXNcbiIsICYgX19rbXBfdmVyc2lvbl9saWJfdHlwZVsgS01QX1ZFUlNJT05fTUFHSUNfTEVOIF0gKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBidWZmZXIsICIlc1xuIiwgJiBfX2ttcF92ZXJzaW9uX2xpbmtfdHlwZVsgS01QX1ZFUlNJT05fTUFHSUNfTEVOIF0gKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBidWZmZXIsICIlc1xuIiwgJiBfX2ttcF92ZXJzaW9uX2J1aWxkX3RpbWVbIEtNUF9WRVJTSU9OX01BR0lDX0xFTiBdICk7CisgICAgICAjaWYgS01QX01JQworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmIGJ1ZmZlciwgIiVzXG4iLCAmIF9fa21wX3ZlcnNpb25fdGFyZ2V0X2VudlsgS01QX1ZFUlNJT05fTUFHSUNfTEVOIF0gKTsKKyAgICAgICNlbmRpZgorICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmIGJ1ZmZlciwgIiVzXG4iLCAmIF9fa21wX3ZlcnNpb25fYnVpbGRfY29tcGlsZXJbIEtNUF9WRVJTSU9OX01BR0lDX0xFTiBdICk7CisgICAgICAgICNpZiBkZWZpbmVkKEtNUF9HT01QX0NPTVBBVCkKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICYgYnVmZmVyLCAiJXNcbiIsICYgX19rbXBfdmVyc2lvbl9hbHRfY29tcFsgS01QX1ZFUlNJT05fTUFHSUNfTEVOIF0gKTsKKyAgICAgICAgI2VuZGlmIC8qIGRlZmluZWQoS01QX0dPTVBfQ09NUEFUKSAqLworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmIGJ1ZmZlciwgIiVzXG4iLCAmIF9fa21wX3ZlcnNpb25fb21wX2FwaVsgS01QX1ZFUlNJT05fTUFHSUNfTEVOIF0gKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBidWZmZXIsICIlc2R5bmFtaWMgZXJyb3IgY2hlY2tpbmc6ICVzXG4iLCBLTVBfVkVSU0lPTl9QUkVGX1NUUiwgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgPyAieWVzIiA6ICJubyIgKSAgKTsKKyAgICAgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAgICAgZm9yICggaW50IGkgPSBic19wbGFpbl9iYXJyaWVyOyBpIDwgYnNfbGFzdF9iYXJyaWVyOyArKyBpICkgeworICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoCisgICAgICAgICAgICAgICAgICAgICYgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAiJXMlcyBiYXJyaWVyIGJyYW5jaCBiaXRzOiBnYXRoZXI9JXUsIHJlbGVhc2U9JXVcbiIsCisgICAgICAgICAgICAgICAgICAgIEtNUF9WRVJTSU9OX1BSRUZfU1RSLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9iYXJyaWVyX3R5cGVfbmFtZVsgaSBdLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9iYXJyaWVyX2dhdGhlcl9icmFuY2hfYml0c1sgaSBdLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfYnJhbmNoX2JpdHNbIGkgXQorICAgICAgICAgICAgICAgICk7IC8vIF9fa21wX3N0cl9idWZfcHJpbnQKKyAgICAgICAgICAgIH07IC8vIGZvciBpCisgICAgICAgICAgICBmb3IgKCBpbnQgaSA9IGJzX3BsYWluX2JhcnJpZXI7IGkgPCBic19sYXN0X2JhcnJpZXI7ICsrIGkgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCgKKyAgICAgICAgICAgICAgICAgICAgJiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICIlcyVzIGJhcnJpZXIgcGF0dGVybjogZ2F0aGVyPSVzLCByZWxlYXNlPSVzXG4iLAorICAgICAgICAgICAgICAgICAgICBLTVBfVkVSU0lPTl9QUkVGX1NUUiwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfYmFycmllcl90eXBlX25hbWVbIGkgXSwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfYmFycmllcl9wYXR0ZXJuX25hbWVbIF9fa21wX2JhcnJpZXJfZ2F0aGVyX3BhdHRlcm5bIGkgXSBdLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9iYXJyaWVyX3BhdHRlcm5fbmFtZVsgX19rbXBfYmFycmllcl9yZWxlYXNlX3BhdHRlcm5bIGkgXSBdCisgICAgICAgICAgICAgICAgKTsgLy8gX19rbXBfc3RyX2J1Zl9wcmludAorICAgICAgICAgICAgfTsgLy8gZm9yIGkKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICYgYnVmZmVyLCAiJXNcbiIsICYgX19rbXBfdmVyc2lvbl9sb2NrWyBLTVBfVkVSU0lPTl9NQUdJQ19MRU4gXSApOworICAgICAgICAjZW5kaWYKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCgKKyAgICAgICAgICAgICYgYnVmZmVyLAorICAgICAgICAgICAgIiVzdGhyZWFkIGFmZmluaXR5IHN1cHBvcnQ6ICVzXG4iLAorICAgICAgICAgICAgS01QX1ZFUlNJT05fUFJFRl9TVFIsCisgICAgICAgICAgICAjaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgICAgICAgICAgICAgICgKKyAgICAgICAgICAgICAgICAgICAgS01QX0FGRklOSVRZX0NBUEFCTEUoKQorICAgICAgICAgICAgICAgICAgICA/CisgICAgICAgICAgICAgICAgICAgICgKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfbm9uZQorICAgICAgICAgICAgICAgICAgICAgICAgPworICAgICAgICAgICAgICAgICAgICAgICAgIm5vdCB1c2VkIgorICAgICAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgICAgICAgICAgICAgInllcyIKKyAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICAgICAgICAgICJubyIKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgICAgICJubyIKKyAgICAgICAgICAgICNlbmRpZgorICAgICAgICApOworICAgICAgICBfX2ttcF9wcmludGYoICIlcyIsIGJ1ZmZlci5zdHIgKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9mcmVlKCAmIGJ1ZmZlciApOworICAgICAgICBLX0RJQUcoIDEsICggIktNUF9WRVJTSU9OIGlzIHRydWVcbiIgKSApOworICAgICNlbmRpZiAvLyBLTVBfU1RVQgorfSAvLyBfX2ttcF9wcmludF92ZXJzaW9uXzEKKworLy8KKy8vIENhbGxlZCBhdCBwYXJhbGxlbCBpbml0aWFsaXphdGlvbiB0aW1lLgorLy8KK3N0YXRpYyBpbnQgX19rbXBfdmVyc2lvbl8yX3ByaW50ZWQgPSBGQUxTRTsKKwordm9pZAorX19rbXBfcHJpbnRfdmVyc2lvbl8yKCB2b2lkICkgeworICAgIGlmICggX19rbXBfdmVyc2lvbl8yX3ByaW50ZWQgKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9OyAvLyBpZgorICAgIF9fa21wX3ZlcnNpb25fMl9wcmludGVkID0gVFJVRTsKKworICAgICNpZm5kZWYgS01QX1NUVUIKKyAgICAjZW5kaWYgLy8gS01QX1NUVUIKK30gLy8gX19rbXBfcHJpbnRfdmVyc2lvbl8yCisKKy8vIGVuZCBvZiBmaWxlIC8vCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfdmVyc2lvbi5oIGIvZmluYWwvcnVudGltZS9zcmMva21wX3ZlcnNpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmUxZTYzCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX3ZlcnNpb24uaApAQCAtMCwwICsxLDcwIEBACisvKgorICoga21wX3ZlcnNpb24uaCAtLSB2ZXJzaW9uIG51bWJlciBmb3IgdGhpcyByZWxlYXNlCisgKiAkUmV2aXNpb246IDQyOTgyICQKKyAqICREYXRlOiAyMDE0LTAyLTEyIDEwOjExOjAyIC0wNjAwIChXZWQsIDEyIEZlYiAyMDE0KSAkCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgS01QX1ZFUlNJT05fSAorI2RlZmluZSBLTVBfVkVSU0lPTl9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworICAgIGV4dGVybiAiQyIgeworI2VuZGlmIC8vIF9fY3BsdXNwbHVzCisKKyNpZm5kZWYgS01QX1ZFUlNJT05fTUFKT1IKKyAgICAjZXJyb3IgS01QX1ZFUlNJT05fTUFKT1IgbWFjcm8gaXMgbm90IGRlZmluZWQuCisjZW5kaWYKKyNkZWZpbmUgS01QX1ZFUlNJT05fTUlOT1IgICAgICAgMAorLyoKKyAgICBVc2luZyAibWFnaWMiIHByZWZpeCBpbiBhbGwgdGhlIHZlcnNpb24gc3RyaW5ncyBpcyByYXRoZXIgY29udmVuaWVudCB0byBnZXQgc3RhdGljIHZlcnNpb24gaW5mbworICAgIGZyb20gYmluYXJpZXMgYnkgdXNpbmcgc3RhbmRhcmQgdXRpbGl0aWVzICJzdHJpbmdzIiBhbmQgImdyZXAiLCBlLiBnLjoKKyAgICAgICAgJCBzdHJpbmdzIGxpYmlvbXA1LnNvIHwgZ3JlcCAiQCgjKSIKKyAgICBnaXZlcyBjbGVhbiBsaXN0IG9mIGFsbCB2ZXJzaW9uIHN0cmluZ3MgaW4gdGhlIGxpYnJhcnkuIExlYWRpbmcgemVybyBoZWxwcyB0byBrZWVwIHZlcnNpb24KKyAgICBzdHJpbmcgc2VwYXJhdGUgZnJvbSBwcmludGFibGUgY2hhcmFjdGVycyB3aGljaCBtYXkgb2NjdXJzIGp1c3QgYmVmb3JlIHZlcnNpb24gc3RyaW5nLgorKi8KKyNkZWZpbmUgS01QX1ZFUlNJT05fTUFHSUNfU1RSICAgIlx4MDBAKCMpICIKKyNkZWZpbmUgS01QX1ZFUlNJT05fTUFHSUNfTEVOICAgNiAgICAgICAgICAgICAgICAvLyBMZW5ndGggb2YgS01QX1ZFUlNJT05fTUFHSUNfU1RSLgorI2RlZmluZSBLTVBfVkVSU0lPTl9QUkVGX1NUUiAgICAiSW50ZWwoUikgT01QICIKKyNkZWZpbmUgS01QX1ZFUlNJT05fUFJFRklYICAgICAgS01QX1ZFUlNJT05fTUFHSUNfU1RSIEtNUF9WRVJTSU9OX1BSRUZfU1RSCisKKy8qIGRlY2xhcmUgYWxsIHRoZSB2ZXJzaW9uIHN0cmluZyBjb25zdGFudHMgZm9yIEtNUF9WRVJTSU9OIGVudi4gdmFyaWFibGUgKi8KK2V4dGVybiBpbnQgIGNvbnN0IF9fa21wX3ZlcnNpb25fbWFqb3I7CitleHRlcm4gaW50ICBjb25zdCBfX2ttcF92ZXJzaW9uX21pbm9yOworZXh0ZXJuIGludCAgY29uc3QgX19rbXBfdmVyc2lvbl9idWlsZDsKK2V4dGVybiBpbnQgIGNvbnN0IF9fa21wX29wZW5tcF92ZXJzaW9uOworZXh0ZXJuIGNoYXIgY29uc3QgX19rbXBfY29weXJpZ2h0W107ICAgIC8vIE9sZCB2YXJpYWJsZSwga2VwdCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIElUQyBhbmQgSVRQLgorZXh0ZXJuIGNoYXIgY29uc3QgX19rbXBfdmVyc2lvbl9jb3B5cmlnaHRbXTsKK2V4dGVybiBjaGFyIGNvbnN0IF9fa21wX3ZlcnNpb25fbGliX3ZlcltdOworZXh0ZXJuIGNoYXIgY29uc3QgX19rbXBfdmVyc2lvbl9saWJfdHlwZVtdOworZXh0ZXJuIGNoYXIgY29uc3QgX19rbXBfdmVyc2lvbl9saW5rX3R5cGVbXTsKK2V4dGVybiBjaGFyIGNvbnN0IF9fa21wX3ZlcnNpb25fYnVpbGRfdGltZVtdOworZXh0ZXJuIGNoYXIgY29uc3QgX19rbXBfdmVyc2lvbl90YXJnZXRfZW52W107CitleHRlcm4gY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX2J1aWxkX2NvbXBpbGVyW107CitleHRlcm4gY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX2FsdF9jb21wW107CitleHRlcm4gY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX29tcF9hcGlbXTsKKy8vID8/PyBleHRlcm4gY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX2RlYnVnW107CitleHRlcm4gY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX2xvY2tbXTsKK2V4dGVybiBjaGFyIGNvbnN0IF9fa21wX3ZlcnNpb25fbmVzdGVkX3N0YXRzX3JlcG9ydGluZ1tdOworZXh0ZXJuIGNoYXIgY29uc3QgX19rbXBfdmVyc2lvbl9mdG5zdGRjYWxsW107CitleHRlcm4gY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX2Z0bmNkZWNsW107CitleHRlcm4gY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX2Z0bmV4dHJhW107CisKK3ZvaWQgX19rbXBfcHJpbnRfdmVyc2lvbl8xKCB2b2lkICk7Cit2b2lkIF9fa21wX3ByaW50X3ZlcnNpb25fMiggdm9pZCApOworCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgICB9IC8vIGV4dGVybiAiQyIKKyNlbmRpZiAvLyBfX2NwbHVzcGx1cworCisjZW5kaWYgLyogS01QX1ZFUlNJT05fSCAqLwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX3dhaXRfcmVsZWFzZS5jcHAgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfd2FpdF9yZWxlYXNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2UyMjhmCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX3dhaXRfcmVsZWFzZS5jcHAKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIGttcF93YWl0X3JlbGVhc2UuY3BwIC0tIFdhaXQvUmVsZWFzZSBpbXBsZW1lbnRhdGlvbgorICogJFJldmlzaW9uOiA0MzQxNyAkCisgKiAkRGF0ZTogMjAxNC0wOC0yNiAxNDowNjozOCAtMDUwMCAoVHVlLCAyNiBBdWcgMjAxNCkgJAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgImttcF93YWl0X3JlbGVhc2UuaCIKKwordm9pZCBfX2ttcF93YWl0XzMyKGttcF9pbmZvX3QgKnRoaXNfdGhyLCBrbXBfZmxhZ18zMiAqZmxhZywgaW50IGZpbmFsX3NwaW4KKyAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyh2b2lkICogaXR0X3N5bmNfb2JqKSApCit7CisgICAgX19rbXBfd2FpdF90ZW1wbGF0ZSh0aGlzX3RociwgZmxhZywgZmluYWxfc3BpbgorICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSApOworfQorCit2b2lkIF9fa21wX3dhaXRfNjQoa21wX2luZm9fdCAqdGhpc190aHIsIGttcF9mbGFnXzY0ICpmbGFnLCBpbnQgZmluYWxfc3BpbgorICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKHZvaWQgKiBpdHRfc3luY19vYmopICkKK3sKKyAgICBfX2ttcF93YWl0X3RlbXBsYXRlKHRoaXNfdGhyLCBmbGFnLCBmaW5hbF9zcGluCisgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopICk7Cit9CisKK3ZvaWQgX19rbXBfd2FpdF9vbmNvcmUoa21wX2luZm9fdCAqdGhpc190aHIsIGttcF9mbGFnX29uY29yZSAqZmxhZywgaW50IGZpbmFsX3NwaW4KKyAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcodm9pZCAqIGl0dF9zeW5jX29iaikgKQoreworICAgIF9fa21wX3dhaXRfdGVtcGxhdGUodGhpc190aHIsIGZsYWcsIGZpbmFsX3NwaW4KKyAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaikgKTsKK30KKworCisKK3ZvaWQgX19rbXBfcmVsZWFzZV8zMihrbXBfZmxhZ18zMiAqZmxhZykgeworICAgIF9fa21wX3JlbGVhc2VfdGVtcGxhdGUoZmxhZyk7Cit9CisKK3ZvaWQgX19rbXBfcmVsZWFzZV82NChrbXBfZmxhZ182NCAqZmxhZykgeworICAgIF9fa21wX3JlbGVhc2VfdGVtcGxhdGUoZmxhZyk7Cit9CisKK3ZvaWQgX19rbXBfcmVsZWFzZV9vbmNvcmUoa21wX2ZsYWdfb25jb3JlICpmbGFnKSB7CisgICAgX19rbXBfcmVsZWFzZV90ZW1wbGF0ZShmbGFnKTsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF93YWl0X3JlbGVhc2UuaCBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF93YWl0X3JlbGVhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTlkY2YwCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX3dhaXRfcmVsZWFzZS5oCkBAIC0wLDAgKzEsNDk2IEBACisvKgorICoga21wX3dhaXRfcmVsZWFzZS5oIC0tIFdhaXQvUmVsZWFzZSBpbXBsZW1lbnRhdGlvbgorICogJFJldmlzaW9uOiA0MzQxNyAkCisgKiAkRGF0ZTogMjAxNC0wOC0yNiAxNDowNjozOCAtMDUwMCAoVHVlLCAyNiBBdWcgMjAxNCkgJAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIEtNUF9XQUlUX1JFTEVBU0VfSAorI2RlZmluZSBLTVBfV0FJVF9SRUxFQVNFX0gKKworI2luY2x1ZGUgImttcC5oIgorI2luY2x1ZGUgImttcF9pdHQuaCIKKworLyohCitAZGVmZ3JvdXAgV0FJVF9SRUxFQVNFIFdhaXQvUmVsZWFzZSBvcGVyYXRpb25zCisKK1RoZSBkZWZpbml0aW9ucyBhbmQgZnVuY3Rpb25zIGhlcmUgaW1wbGVtZW50IHRoZSBsb3dlc3QgbGV2ZWwgdGhyZWFkCitzeW5jaHJvbml6YXRpb25zIG9mIHN1c3BlbmRpbmcgYSB0aHJlYWQgYW5kIGF3YWtpbmcgaXQuIFRoZXkgYXJlIHVzZWQKK3RvIGJ1aWxkIGhpZ2hlciBsZXZlbCBvcGVyYXRpb25zIHN1Y2ggYXMgYmFycmllcnMgYW5kIGZvcmsvam9pbi4KKyovCisKKy8qIQorQGluZ3JvdXAgV0FJVF9SRUxFQVNFCitAeworKi8KKworLyohIAorICogVGhlIGZsYWdfdHlwZSBkZXNjcmliZXMgdGhlIHN0b3JhZ2UgdXNlZCBmb3IgdGhlIGZsYWcuCisgKi8KK2VudW0gZmxhZ190eXBlIHsKKyAgICBmbGFnMzIsICAgICAgICAvKio8IDMyIGJpdCBmbGFncyAqLworICAgIGZsYWc2NCwgICAgICAgIC8qKjwgNjQgYml0IGZsYWdzICovCisgICAgZmxhZ19vbmNvcmUgICAgLyoqPCBzcGVjaWFsIDY0LWJpdCBmbGFnIGZvciBvbi1jb3JlIGJhcnJpZXIgKGhpZXJhcmNoaWNhbCkgKi8KK307CisKKy8qIQorICogQmFzZSBjbGFzcyBmb3Igd2FpdC9yZWxlYXNlIHZvbGF0aWxlIGZsYWcKKyAqLwordGVtcGxhdGUgPHR5cGVuYW1lIFA+CitjbGFzcyBrbXBfZmxhZyB7CisgICAgdm9sYXRpbGUgUCAqIGxvYzsgIC8qKjwgUG9pbnRlciB0byB0aGUgZmxhZyBzdG9yYWdlIHRoYXQgaXMgbW9kaWZpZWQgYnkgYW5vdGhlciB0aHJlYWQgKi8KKyAgICBmbGFnX3R5cGUgdDsgICAgICAgLyoqPCAiVHlwZSIgb2YgdGhlIGZsYWcgaW4gbG9jICovCisgcHVibGljOgorICAgIHR5cGVkZWYgUCBmbGFnX3Q7CisgICAga21wX2ZsYWcodm9sYXRpbGUgUCAqcCwgZmxhZ190eXBlIGZ0KSA6IGxvYyhwKSwgdChmdCkge30KKyAgICAvKiEKKyAgICAgKiBAcmVzdWx0IHRoZSBwb2ludGVyIHRvIHRoZSBhY3R1YWwgZmxhZworICAgICAqLworICAgIHZvbGF0aWxlIFAgKiBnZXQoKSB7IHJldHVybiBsb2M7IH0KKyAgICAvKiEKKyAgICAgKiBAcmVzdWx0IHRoZSBmbGFnX3R5cGUKKyAgICAgKi8KKyAgICBmbGFnX3R5cGUgZ2V0X3R5cGUoKSB7IHJldHVybiB0OyB9CisgICAgLy8gRGVyaXZlZCBjbGFzc2VzIG11c3QgcHJvdmlkZSB0aGUgZm9sbG93aW5nOgorICAgIC8qCisgICAga21wX2luZm9fdCAqIGdldF93YWl0ZXIoa21wX3VpbnQzMiBpKTsKKyAgICBrbXBfdWludDMyIGdldF9udW1fd2FpdGVycygpOworICAgIGJvb2wgZG9uZV9jaGVjaygpOworICAgIGJvb2wgZG9uZV9jaGVja192YWwoUCBvbGRfbG9jKTsKKyAgICBib29sIG5vdGRvbmVfY2hlY2soKTsKKyAgICBQIGludGVybmFsX3JlbGVhc2UoKTsKKyAgICBQIHNldF9zbGVlcGluZygpOworICAgIFAgdW5zZXRfc2xlZXBpbmcoKTsKKyAgICBib29sIGlzX3NsZWVwaW5nKCk7CisgICAgYm9vbCBpc19zbGVlcGluZ192YWwoUCBvbGRfbG9jKTsKKyAgICAqLworfTsKKworLyogU3BpbiB3YWl0IGxvb3AgdGhhdCBmaXJzdCBkb2VzIHBhdXNlLCB0aGVuIHlpZWxkLCB0aGVuIHNsZWVwLiBBIHRocmVhZCB0aGF0IGNhbGxzIF9fa21wX3dhaXRfKgorICAgbXVzdCBtYWtlIGNlcnRhaW4gdGhhdCBhbm90aGVyIHRocmVhZCBjYWxscyBfX2ttcF9yZWxlYXNlIHRvIHdha2UgaXQgYmFjayB1cCB0byBwcmV2ZW50IGRlYWRsb2NrcyEgICovCit0ZW1wbGF0ZSA8Y2xhc3MgQz4KK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2ttcF93YWl0X3RlbXBsYXRlKGttcF9pbmZvX3QgKnRoaXNfdGhyLCBDICpmbGFnLCBpbnQgZmluYWxfc3BpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcodm9pZCAqIGl0dF9zeW5jX29iaikgKQoreworICAgIC8vIE5PVEU6IFdlIG1heSBub3QgYmVsb25nIHRvIGEgdGVhbSBhdCB0aGlzIHBvaW50LgorICAgIHZvbGF0aWxlIHR5cGVuYW1lIEM6OmZsYWdfdCAqc3BpbiA9IGZsYWctPmdldCgpOworICAgIGttcF91aW50MzIgc3BpbnM7CisgICAga21wX3VpbnQzMiBoaWJlcm5hdGU7CisgICAgaW50IHRoX2d0aWQ7CisgICAgaW50IHRhc2tzX2NvbXBsZXRlZCA9IEZBTFNFOworCisgICAgS01QX0ZTWU5DX1NQSU5fSU5JVChzcGluLCBOVUxMKTsKKyAgICBpZiAoZmxhZy0+ZG9uZV9jaGVjaygpKSB7CisgICAgICAgIEtNUF9GU1lOQ19TUElOX0FDUVVJUkVEKHNwaW4pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHRoX2d0aWQgPSB0aGlzX3Roci0+dGgudGhfaW5mby5kcy5kc19ndGlkOworICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX3dhaXRfc2xlZXA6IFQjJWQgd2FpdGluZyBmb3IgZmxhZyglcClcbiIsIHRoX2d0aWQsIGZsYWcpKTsKKworICAgIC8vIFNldHVwIGZvciB3YWl0aW5nCisgICAgS01QX0lOSVRfWUlFTEQoc3BpbnMpOworCisgICAgaWYgKF9fa21wX2RmbHRfYmxvY2t0aW1lICE9IEtNUF9NQVhfQkxPQ0tUSU1FKSB7CisgICAgICAgIC8vIFRoZSB3b3JrZXIgdGhyZWFkcyBjYW5ub3QgcmVseSBvbiB0aGUgdGVhbSBzdHJ1Y3QgZXhpc3RpbmcgYXQgdGhpcyBwb2ludC4KKyAgICAgICAgLy8gVXNlIHRoZSBidCB2YWx1ZXMgY2FjaGVkIGluIHRoZSB0aHJlYWQgc3RydWN0IGluc3RlYWQuCisjaWZkZWYgS01QX0FESlVTVF9CTE9DS1RJTUUKKyAgICAgICAgaWYgKF9fa21wX3plcm9fYnQgJiYgIXRoaXNfdGhyLT50aC50aF90ZWFtX2J0X3NldCkKKyAgICAgICAgICAgIC8vIEZvcmNlIGltbWVkaWF0ZSBzdXNwZW5kIGlmIG5vdCBzZXQgYnkgdXNlciBhbmQgbW9yZSB0aHJlYWRzIHRoYW4gYXZhaWxhYmxlIHByb2NzCisgICAgICAgICAgICBoaWJlcm5hdGUgPSAwOworICAgICAgICBlbHNlCisgICAgICAgICAgICBoaWJlcm5hdGUgPSB0aGlzX3Roci0+dGgudGhfdGVhbV9idF9pbnRlcnZhbHM7CisjZWxzZQorICAgICAgICBoaWJlcm5hdGUgPSB0aGlzX3Roci0+dGgudGhfdGVhbV9idF9pbnRlcnZhbHM7CisjZW5kaWYgLyogS01QX0FESlVTVF9CTE9DS1RJTUUgKi8KKworICAgICAgICAvKiBJZiB0aGUgYmxvY2t0aW1lIGlzIG5vbnplcm8sIHdlIHdhbnQgdG8gbWFrZSBzdXJlIHRoYXQgd2Ugc3BpbiB3YWl0IGZvciB0aGUgZW50aXJldHkKKyAgICAgICAgICAgb2YgdGhlIHNwZWNpZmllZCAjaW50ZXJ2YWxzLCBwbHVzIHVwIHRvIG9uZSBpbnRlcnZhbCBtb3JlLiAgVGhpcyBpbmNyZW1lbnQgbWFrZQorICAgICAgICAgICBjZXJ0YWluIHRoYXQgdGhpcyB0aHJlYWQgZG9lc24ndCBnbyB0byBzbGVlcCB0b28gc29vbi4gICovCisgICAgICAgIGlmIChoaWJlcm5hdGUgIT0gMCkKKyAgICAgICAgICAgIGhpYmVybmF0ZSsrOworCisgICAgICAgIC8vIEFkZCBpbiB0aGUgY3VycmVudCB0aW1lIHZhbHVlLgorICAgICAgICBoaWJlcm5hdGUgKz0gVENSXzQoX19rbXBfZ2xvYmFsLmcuZ190aW1lLmR0LnRfdmFsdWUpOworICAgICAgICBLRl9UUkFDRSgyMCwgKCJfX2ttcF93YWl0X3NsZWVwOiBUIyVkIG5vdz0lZCwgaGliZXJuYXRlPSVkLCBpbnRlcnZhbHM9JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgdGhfZ3RpZCwgX19rbXBfZ2xvYmFsLmcuZ190aW1lLmR0LnRfdmFsdWUsIGhpYmVybmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICBoaWJlcm5hdGUgLSBfX2ttcF9nbG9iYWwuZy5nX3RpbWUuZHQudF92YWx1ZSkpOworICAgIH0KKyAgICBLTVBfTUIoKTsKKworICAgIC8vIE1haW4gd2FpdCBzcGluIGxvb3AKKyAgICB3aGlsZSAoZmxhZy0+bm90ZG9uZV9jaGVjaygpKSB7CisgICAgICAgIGludCBpbl9wb29sOworCisgICAgICAgIC8qIElmIHRoZSB0YXNrIHRlYW0gaXMgTlVMTCwgaXQgbWVhbnMgb25lIG9mIHRoaW5nczoKKyAgICAgICAgICAgMSkgQSBuZXdseS1jcmVhdGVkIHRocmVhZCBpcyBmaXJzdCBiZWluZyByZWxlYXNlZCBieSBfX2ttcF9mb3JrX2JhcnJpZXIoKSwgYW5kCisgICAgICAgICAgICAgIGl0cyB0YXNrIHRlYW0gaGFzIG5vdCBiZWVuIHNldCB1cCB5ZXQuCisgICAgICAgICAgIDIpIEFsbCB0YXNrcyBoYXZlIGJlZW4gZXhlY3V0ZWQgdG8gY29tcGxldGlvbiwgdGhpcyB0aHJlYWQgaGFzIGRlY3JlbWVudGVkIHRoZSB0YXNrCisgICAgICAgICAgICAgIHRlYW0ncyByZWYgY3QgYW5kIHBvc3NpYmx5IGRlYWxsb2NhdGVkIGl0LCBhbmQgc2hvdWxkIG5vIGxvbmdlciByZWZlcmVuY2UgaXQuCisgICAgICAgICAgIDMpIFRhc2tpbmcgaXMgb2ZmIGZvciB0aGlzIHJlZ2lvbi4gIFRoaXMgY291bGQgYmUgYmVjYXVzZSB3ZSBhcmUgaW4gYSBzZXJpYWxpemVkIHJlZ2lvbgorICAgICAgICAgICAgICAocGVyaGFwcyB0aGUgb3V0ZXIgb25lKSwgb3IgZWxzZSB0YXNraW5nIHdhcyBtYW51YWxseSBkaXNhYmxlZCAoS01QX1RBU0tJTkc9MCkuICAqLworICAgICAgICBrbXBfdGFza190ZWFtX3QgKiB0YXNrX3RlYW0gPSBOVUxMOworICAgICAgICBpZiAoX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMpIHsKKyAgICAgICAgICAgIHRhc2tfdGVhbSA9IHRoaXNfdGhyLT50aC50aF90YXNrX3RlYW07CisgICAgICAgICAgICBpZiAodGFza190ZWFtICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpZiAoIVRDUl9TWU5DXzQodGFza190ZWFtLT50dC50dF9hY3RpdmUpKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIUtNUF9NQVNURVJfVElEKHRoaXNfdGhyLT50aC50aF9pbmZvLmRzLmRzX3RpZCkpOworICAgICAgICAgICAgICAgICAgICBfX2ttcF91bnJlZl90YXNrX3RlYW0odGFza190ZWFtLCB0aGlzX3Rocik7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChLTVBfVEFTS0lOR19FTkFCTEVEKHRhc2tfdGVhbSwgdGhpc190aHItPnRoLnRoX3Rhc2tfc3RhdGUpKSB7CisgICAgICAgICAgICAgICAgICAgIGZsYWctPmV4ZWN1dGVfdGFza3ModGhpc190aHIsIHRoX2d0aWQsIGZpbmFsX3NwaW4sICZ0YXNrc19jb21wbGV0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopLCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IC8vIGlmCisgICAgICAgIH0gLy8gaWYKKworICAgICAgICBLTVBfRlNZTkNfU1BJTl9QUkVQQVJFKHNwaW4pOworICAgICAgICBpZiAoVENSXzQoX19rbXBfZ2xvYmFsLmcuZ19kb25lKSkgeworICAgICAgICAgICAgaWYgKF9fa21wX2dsb2JhbC5nLmdfYWJvcnQpCisgICAgICAgICAgICAgICAgX19rbXBfYWJvcnRfdGhyZWFkKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8vIElmIHdlIGFyZSBvdmVyc3Vic2NyaWJlZCwgb3IgaGF2ZSB3YWl0ZWQgYSBiaXQgKGFuZCBLTVBfTElCUkFSWT10aHJvdWdocHV0KSwgdGhlbiB5aWVsZAorICAgICAgICBLTVBfWUlFTEQoVENSXzQoX19rbXBfbnRoKSA+IF9fa21wX2F2YWlsX3Byb2MpOworICAgICAgICAvLyBUT0RPOiBTaG91bGQgaXQgYmUgbnVtYmVyIG9mIGNvcmVzIGluc3RlYWQgb2YgdGhyZWFkIGNvbnRleHRzPyBMaWtlOgorICAgICAgICAvLyBLTVBfWUlFTEQoVENSXzQoX19rbXBfbnRoKSA+IF9fa21wX25jb3Jlcyk7CisgICAgICAgIC8vIE5lZWQgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQgZGF0YSB0byBtYWtlIHRoZSBjaGFuZ2UuLi4KKyAgICAgICAgS01QX1lJRUxEX1NQSU4oc3BpbnMpOworCisgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgdGhyZWFkIHdhcyB0cmFuc2ZlcnJlZCBmcm9tIGEgdGVhbQorICAgICAgICAvLyB0byB0aGUgdGhyZWFkIHBvb2wgKG9yIHZpY2UtdmVyc2EpIHdoaWxlIHNwaW5uaW5nLgorICAgICAgICBpbl9wb29sID0gISFUQ1JfNCh0aGlzX3Roci0+dGgudGhfaW5fcG9vbCk7CisgICAgICAgIGlmIChpbl9wb29sICE9ICEhdGhpc190aHItPnRoLnRoX2FjdGl2ZV9pbl9wb29sKSB7CisgICAgICAgICAgICBpZiAoaW5fcG9vbCkgeyAvLyBSZWNlbnRseSB0cmFuc2ZlcnJlZCBmcm9tIHRlYW0gdG8gcG9vbAorICAgICAgICAgICAgICAgIEtNUF9URVNUX1RIRU5fSU5DMzIoKGttcF9pbnQzMiAqKSZfX2ttcF90aHJlYWRfcG9vbF9hY3RpdmVfbnRoKTsKKyAgICAgICAgICAgICAgICB0aGlzX3Roci0+dGgudGhfYWN0aXZlX2luX3Bvb2wgPSBUUlVFOworICAgICAgICAgICAgICAgIC8qIEhlcmUsIHdlIGNhbm5vdCBhc3NlcnQgdGhhdDoKKyAgICAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKFRDUl80KF9fa21wX3RocmVhZF9wb29sX2FjdGl2ZV9udGgpIDw9IF9fa21wX3RocmVhZF9wb29sX250aCk7CisgICAgICAgICAgICAgICAgICAgX19rbXBfdGhyZWFkX3Bvb2xfbnRoIGlzIGluYy9kZWMnZCBieSB0aGUgbWFzdGVyIHRocmVhZCB3aGlsZSB0aGUgZm9yay9qb2luCisgICAgICAgICAgICAgICAgICAgbG9jayBpcyBoZWxkLCB3aGVyZWFzIF9fa21wX3RocmVhZF9wb29sX2FjdGl2ZV9udGggaXMgaW5jL2RlYydkIGFzeW5jaHJvbm91c2x5CisgICAgICAgICAgICAgICAgICAgYnkgdGhlIHdvcmtlcnMuICBUaGUgdHdvIGNhbiBnZXQgb3V0IG9mIHN5bmMgZm9yIGJyaWVmIHBlcmlvZHMgb2YgdGltZS4gICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsgLy8gUmVjZW50bHkgdHJhbnNmZXJyZWQgZnJvbSBwb29sIHRvIHRlYW0KKyAgICAgICAgICAgICAgICBLTVBfVEVTVF9USEVOX0RFQzMyKChrbXBfaW50MzIgKikgJl9fa21wX3RocmVhZF9wb29sX2FjdGl2ZV9udGgpOworICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoVENSXzQoX19rbXBfdGhyZWFkX3Bvb2xfYWN0aXZlX250aCkgPj0gMCk7CisgICAgICAgICAgICAgICAgdGhpc190aHItPnRoLnRoX2FjdGl2ZV9pbl9wb29sID0gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBEb24ndCBzdXNwZW5kIGlmIEtNUF9CTE9DS1RJTUUgaXMgc2V0IHRvICJpbmZpbml0ZSIKKyAgICAgICAgaWYgKF9fa21wX2RmbHRfYmxvY2t0aW1lID09IEtNUF9NQVhfQkxPQ0tUSU1FKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgLy8gRG9uJ3Qgc3VzcGVuZCBpZiB0aGVyZSBpcyBhIGxpa2VsaWhvb2Qgb2YgbmV3IHRhc2tzIGJlaW5nIHNwYXduZWQuCisgICAgICAgIGlmICgodGFza190ZWFtICE9IE5VTEwpICYmIFRDUl80KHRhc2tfdGVhbS0+dHQudHRfZm91bmRfdGFza3MpKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgLy8gSWYgd2UgaGF2ZSB3YWl0ZWQgYSBiaXQgbW9yZSwgZmFsbCBhc2xlZXAKKyAgICAgICAgaWYgKFRDUl80KF9fa21wX2dsb2JhbC5nLmdfdGltZS5kdC50X3ZhbHVlKSA8IGhpYmVybmF0ZSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIEtGX1RSQUNFKDUwLCAoIl9fa21wX3dhaXRfc2xlZXA6IFQjJWQgc3VzcGVuZCB0aW1lIHJlYWNoZWRcbiIsIHRoX2d0aWQpKTsKKworICAgICAgICBmbGFnLT5zdXNwZW5kKHRoX2d0aWQpOworCisgICAgICAgIGlmIChUQ1JfNChfX2ttcF9nbG9iYWwuZy5nX2RvbmUpKSB7CisgICAgICAgICAgICBpZiAoX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCkKKyAgICAgICAgICAgICAgICBfX2ttcF9hYm9ydF90aHJlYWQoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIC8vIFRPRE86IElmIHRocmVhZCBpcyBkb25lIHdpdGggd29yayBhbmQgdGltZXMgb3V0LCBkaXNiYW5kL2ZyZWUKKyAgICB9CisgICAgS01QX0ZTWU5DX1NQSU5fQUNRVUlSRUQoc3Bpbik7Cit9CisKKy8qIFJlbGVhc2UgYW55IHRocmVhZHMgc3BlY2lmaWVkIGFzIHdhaXRpbmcgb24gdGhlIGZsYWcgYnkgcmVsZWFzaW5nIHRoZSBmbGFnIGFuZCByZXN1bWUgdGhlIHdhaXRpbmcgdGhyZWFkCisgICBpZiBpbmRpY2F0ZWQgYnkgdGhlIHNsZWVwIGJpdChzKS4gQSB0aHJlYWQgdGhhdCBjYWxscyBfX2ttcF93YWl0X3RlbXBsYXRlIG11c3QgY2FsbCB0aGlzIGZ1bmN0aW9uIHRvIHdha2UKKyAgIHVwIHRoZSBwb3RlbnRpYWxseSBzbGVlcGluZyB0aHJlYWQgYW5kIHByZXZlbnQgZGVhZGxvY2tzISAgKi8KK3RlbXBsYXRlIDxjbGFzcyBDPgorc3RhdGljIGlubGluZSB2b2lkIF9fa21wX3JlbGVhc2VfdGVtcGxhdGUoQyAqZmxhZykKK3sKKyNpZmRlZiBLTVBfREVCVUcKKyAgICAvLyBGSVggTUUKKyAgICBrbXBfaW5mb190ICogd2FpdF90aHIgPSBmbGFnLT5nZXRfd2FpdGVyKDApOworICAgIGludCB0YXJnZXRfZ3RpZCA9IHdhaXRfdGhyLT50aC50aF9pbmZvLmRzLmRzX2d0aWQ7CisgICAgaW50IGd0aWQgPSBUQ1JfNChfX2ttcF9pbml0X2d0aWQpID8gX19rbXBfZ2V0X2d0aWQoKSA6IC0xOworI2VuZGlmCisgICAgS0ZfVFJBQ0UoMjAsICgiX19rbXBfcmVsZWFzZTogVCMlZCByZWxlYXNpbmcgVCMlZCBzcGluKCVwKVxuIiwgZ3RpZCwgdGFyZ2V0X2d0aWQsIGZsYWctPmdldCgpKSk7CisgICAgS01QX0RFQlVHX0FTU0VSVChmbGFnLT5nZXQoKSk7CisgICAgS01QX0ZTWU5DX1JFTEVBU0lORyhmbGFnLT5nZXQoKSk7CisKKyAgICB0eXBlbmFtZSBDOjpmbGFnX3Qgb2xkX3NwaW4gPSBmbGFnLT5pbnRlcm5hbF9yZWxlYXNlKCk7CisKKyAgICBLRl9UUkFDRSgxMDAsICgiX19rbXBfcmVsZWFzZTogVCMlZCBvbGQgc3BpbiglcCk9JWQsIHNldCBuZXcgc3Bpbj0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICBndGlkLCBmbGFnLT5nZXQoKSwgb2xkX3NwaW4sICooZmxhZy0+Z2V0KCkpKSk7CisKKyAgICBpZiAoX19rbXBfZGZsdF9ibG9ja3RpbWUgIT0gS01QX01BWF9CTE9DS1RJTUUpIHsKKyAgICAgICAgLy8gT25seSBuZWVkIHRvIGNoZWNrIHNsZWVwIHN0dWZmIGlmIGluZmluaXRlIGJsb2NrIHRpbWUgbm90IHNldAorICAgICAgICBpZiAoZmxhZy0+aXNfc2xlZXBpbmdfdmFsKG9sZF9zcGluKSkgeworICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaT0wOyBpPGZsYWctPmdldF9udW1fd2FpdGVycygpOyArK2kpIHsKKyAgICAgICAgICAgICAgICBrbXBfaW5mb190ICogd2FpdGVyID0gZmxhZy0+Z2V0X3dhaXRlcihpKTsKKyAgICAgICAgICAgICAgICBpbnQgd2FpdF9ndGlkID0gd2FpdGVyLT50aC50aF9pbmZvLmRzLmRzX2d0aWQ7CisgICAgICAgICAgICAgICAgLy8gV2FrZSB1cCB0aHJlYWQgaWYgbmVlZGVkCisgICAgICAgICAgICAgICAgS0ZfVFJBQ0UoNTAsICgiX19rbXBfcmVsZWFzZTogVCMlZCB3YWtpbmcgdXAgdGhyZWFkIFQjJWQgc2luY2Ugc2xlZXAgc3BpbiglcCkgc2V0XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgd2FpdF9ndGlkLCBmbGFnLT5nZXQoKSkpOworICAgICAgICAgICAgICAgIGZsYWctPnJlc3VtZSh3YWl0X2d0aWQpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgS0ZfVFJBQ0UoNTAsICgiX19rbXBfcmVsZWFzZTogVCMlZCBkb24ndCB3YWtlIHVwIHRocmVhZCBUIyVkIHNpbmNlIHNsZWVwIHNwaW4oJXApIG5vdCBzZXRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRhcmdldF9ndGlkLCBmbGFnLT5nZXQoKSkpOworICAgICAgICB9CisgICAgfQorfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRmxhZ1R5cGU+CitzdHJ1Y3QgZmxhZ190cmFpdHMge307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgZmxhZ190cmFpdHM8a21wX3VpbnQzMj4geworICAgIHR5cGVkZWYga21wX3VpbnQzMiBmbGFnX3Q7CisgICAgc3RhdGljIGNvbnN0IGZsYWdfdHlwZSB0ID0gZmxhZzMyOworICAgIHN0YXRpYyBpbmxpbmUgZmxhZ190IHRjcihmbGFnX3QgZikgeyByZXR1cm4gVENSXzQoZik7IH0KKyAgICBzdGF0aWMgaW5saW5lIGZsYWdfdCB0ZXN0X3RoZW5fYWRkNCh2b2xhdGlsZSBmbGFnX3QgKmYpIHsgcmV0dXJuIEtNUF9URVNUX1RIRU5fQURENF8zMigodm9sYXRpbGUga21wX2ludDMyICopZik7IH0KKyAgICBzdGF0aWMgaW5saW5lIGZsYWdfdCB0ZXN0X3RoZW5fb3Iodm9sYXRpbGUgZmxhZ190ICpmLCBmbGFnX3QgdikgeyByZXR1cm4gS01QX1RFU1RfVEhFTl9PUjMyKCh2b2xhdGlsZSBrbXBfaW50MzIgKilmLCB2KTsgfQorICAgIHN0YXRpYyBpbmxpbmUgZmxhZ190IHRlc3RfdGhlbl9hbmQodm9sYXRpbGUgZmxhZ190ICpmLCBmbGFnX3QgdikgeyByZXR1cm4gS01QX1RFU1RfVEhFTl9BTkQzMigodm9sYXRpbGUga21wX2ludDMyICopZiwgdik7IH0KK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgZmxhZ190cmFpdHM8a21wX3VpbnQ2ND4geworICAgIHR5cGVkZWYga21wX3VpbnQ2NCBmbGFnX3Q7CisgICAgc3RhdGljIGNvbnN0IGZsYWdfdHlwZSB0ID0gZmxhZzY0OworICAgIHN0YXRpYyBpbmxpbmUgZmxhZ190IHRjcihmbGFnX3QgZikgeyByZXR1cm4gVENSXzgoZik7IH0KKyAgICBzdGF0aWMgaW5saW5lIGZsYWdfdCB0ZXN0X3RoZW5fYWRkNCh2b2xhdGlsZSBmbGFnX3QgKmYpIHsgcmV0dXJuIEtNUF9URVNUX1RIRU5fQURENF82NCgodm9sYXRpbGUga21wX2ludDY0ICopZik7IH0KKyAgICBzdGF0aWMgaW5saW5lIGZsYWdfdCB0ZXN0X3RoZW5fb3Iodm9sYXRpbGUgZmxhZ190ICpmLCBmbGFnX3QgdikgeyByZXR1cm4gS01QX1RFU1RfVEhFTl9PUjY0KCh2b2xhdGlsZSBrbXBfaW50NjQgKilmLCB2KTsgfQorICAgIHN0YXRpYyBpbmxpbmUgZmxhZ190IHRlc3RfdGhlbl9hbmQodm9sYXRpbGUgZmxhZ190ICpmLCBmbGFnX3QgdikgeyByZXR1cm4gS01QX1RFU1RfVEhFTl9BTkQ2NCgodm9sYXRpbGUga21wX2ludDY0ICopZiwgdik7IH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBGbGFnVHlwZT4KK2NsYXNzIGttcF9iYXNpY19mbGFnIDogcHVibGljIGttcF9mbGFnPEZsYWdUeXBlPiB7CisgICAgdHlwZWRlZiBmbGFnX3RyYWl0czxGbGFnVHlwZT4gdHJhaXRzX3R5cGU7CisgICAgRmxhZ1R5cGUgY2hlY2tlcjsgIC8qKjwgVmFsdWUgdG8gY29tcGFyZSBmbGFnIHRvIHRvIGNoZWNrIGlmIGZsYWcgaGFzIGJlZW4gcmVsZWFzZWQuICovCisgICAga21wX2luZm9fdCAqIHdhaXRpbmdfdGhyZWFkc1sxXTsgIC8qKjwgQXJyYXkgb2YgdGhyZWFkcyBzbGVlcGluZyBvbiB0aGlzIHRocmVhZC4gKi8KKyAgICBrbXBfdWludDMyIG51bV93YWl0aW5nX3RocmVhZHM7ICAgICAgIC8qKjwgTnVtYmVyIG9mIHRocmVhZHMgc2xlZXBpbmcgb24gdGhpcyB0aHJlYWQuICovCitwdWJsaWM6CisgICAga21wX2Jhc2ljX2ZsYWcodm9sYXRpbGUgRmxhZ1R5cGUgKnApIDoga21wX2ZsYWc8RmxhZ1R5cGU+KHAsIHRyYWl0c190eXBlOjp0KSwgbnVtX3dhaXRpbmdfdGhyZWFkcygwKSB7fQorICAgIGttcF9iYXNpY19mbGFnKHZvbGF0aWxlIEZsYWdUeXBlICpwLCBrbXBfaW5mb190ICp0aHIpIDoga21wX2ZsYWc8RmxhZ1R5cGU+KHAsIHRyYWl0c190eXBlOjp0KSwgbnVtX3dhaXRpbmdfdGhyZWFkcygxKSB7CisgICAgICAgIHdhaXRpbmdfdGhyZWFkc1swXSA9IHRocjsgCisgICAgfQorICAgIGttcF9iYXNpY19mbGFnKHZvbGF0aWxlIEZsYWdUeXBlICpwLCBGbGFnVHlwZSBjKSA6IGttcF9mbGFnPEZsYWdUeXBlPihwLCB0cmFpdHNfdHlwZTo6dCksIGNoZWNrZXIoYyksIG51bV93YWl0aW5nX3RocmVhZHMoMCkge30KKyAgICAvKiEKKyAgICAgKiBwYXJhbSBpIGluICAgaW5kZXggaW50byB3YWl0aW5nX3RocmVhZHMKKyAgICAgKiBAcmVzdWx0IHRoZSB0aHJlYWQgdGhhdCBpcyB3YWl0aW5nIGF0IGluZGV4IGkKKyAgICAgKi8KKyAgICBrbXBfaW5mb190ICogZ2V0X3dhaXRlcihrbXBfdWludDMyIGkpIHsgCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoaTxudW1fd2FpdGluZ190aHJlYWRzKTsKKyAgICAgICAgcmV0dXJuIHdhaXRpbmdfdGhyZWFkc1tpXTsgCisgICAgfQorICAgIC8qIQorICAgICAqIEByZXN1bHQgbnVtX3dhaXRpbmdfdGhyZWFkcworICAgICAqLworICAgIGttcF91aW50MzIgZ2V0X251bV93YWl0ZXJzKCkgeyByZXR1cm4gbnVtX3dhaXRpbmdfdGhyZWFkczsgfQorICAgIC8qIQorICAgICAqIEBwYXJhbSB0aHIgaW4gICB0aGUgdGhyZWFkIHdoaWNoIGlzIG5vdyB3YWl0aW5nCisgICAgICoKKyAgICAgKiBJbnNlcnQgYSB3YWl0aW5nIHRocmVhZCBhdCBpbmRleCAwLgorICAgICAqLworICAgIHZvaWQgc2V0X3dhaXRlcihrbXBfaW5mb190ICp0aHIpIHsgCisgICAgICAgIHdhaXRpbmdfdGhyZWFkc1swXSA9IHRocjsgCisgICAgICAgIG51bV93YWl0aW5nX3RocmVhZHMgPSAxOworICAgIH0KKyAgICAvKiEKKyAgICAgKiBAcmVzdWx0IHRydWUgaWYgdGhlIGZsYWcgb2JqZWN0IGhhcyBiZWVuIHJlbGVhc2VkLgorICAgICAqLworICAgIGJvb2wgZG9uZV9jaGVjaygpIHsgcmV0dXJuIHRyYWl0c190eXBlOjp0Y3IoKih0aGlzLT5nZXQoKSkpID09IGNoZWNrZXI7IH0KKyAgICAvKiEKKyAgICAgKiBAcGFyYW0gb2xkX2xvYyBpbiAgIG9sZCB2YWx1ZSBvZiBmbGFnCisgICAgICogQHJlc3VsdCB0cnVlIGlmIHRoZSBmbGFnJ3Mgb2xkIHZhbHVlIGluZGljYXRlcyBpdCB3YXMgcmVsZWFzZWQuCisgICAgICovCisgICAgYm9vbCBkb25lX2NoZWNrX3ZhbChGbGFnVHlwZSBvbGRfbG9jKSB7IHJldHVybiBvbGRfbG9jID09IGNoZWNrZXI7IH0KKyAgICAvKiEKKyAgICAgKiBAcmVzdWx0IHRydWUgaWYgdGhlIGZsYWcgb2JqZWN0IGlzIG5vdCB5ZXQgcmVsZWFzZWQuCisgICAgICogVXNlZCBpbiBfX2ttcF93YWl0X3RlbXBsYXRlIGxpa2U6CisgICAgICogQGNvZGUKKyAgICAgKiB3aGlsZSAoZmxhZy5ub3Rkb25lX2NoZWNrKCkpIHsgcGF1c2UoKTsgfQorICAgICAqIEBlbmRjb2RlCisgICAgICovCisgICAgYm9vbCBub3Rkb25lX2NoZWNrKCkgeyByZXR1cm4gdHJhaXRzX3R5cGU6OnRjcigqKHRoaXMtPmdldCgpKSkgIT0gY2hlY2tlcjsgfQorICAgIC8qIQorICAgICAqIEByZXN1bHQgQWN0dWFsIGZsYWcgdmFsdWUgYmVmb3JlIHJlbGVhc2Ugd2FzIGFwcGxpZWQuCisgICAgICogVHJpZ2dlciBhbGwgd2FpdGluZyB0aHJlYWRzIHRvIHJ1biBieSBtb2RpZnlpbmcgZmxhZyB0byByZWxlYXNlIHN0YXRlLgorICAgICAqLworICAgIEZsYWdUeXBlIGludGVybmFsX3JlbGVhc2UoKSB7CisgICAgICAgIHJldHVybiB0cmFpdHNfdHlwZTo6dGVzdF90aGVuX2FkZDQoKHZvbGF0aWxlIEZsYWdUeXBlICopdGhpcy0+Z2V0KCkpOworICAgIH0KKyAgICAvKiEKKyAgICAgKiBAcmVzdWx0IEFjdHVhbCBmbGFnIHZhbHVlIGJlZm9yZSBzbGVlcCBiaXQocykgc2V0LgorICAgICAqIE5vdGVzIHRoYXQgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIHRocmVhZCBzbGVlcGluZyBvbiB0aGUgZmxhZyBieSBzZXR0aW5nIHNsZWVwIGJpdChzKS4KKyAgICAgKi8KKyAgICBGbGFnVHlwZSBzZXRfc2xlZXBpbmcoKSB7IAorICAgICAgICByZXR1cm4gdHJhaXRzX3R5cGU6OnRlc3RfdGhlbl9vcigodm9sYXRpbGUgRmxhZ1R5cGUgKil0aGlzLT5nZXQoKSwgS01QX0JBUlJJRVJfU0xFRVBfU1RBVEUpOworICAgIH0KKyAgICAvKiEKKyAgICAgKiBAcmVzdWx0IEFjdHVhbCBmbGFnIHZhbHVlIGJlZm9yZSBzbGVlcCBiaXQocykgY2xlYXJlZC4KKyAgICAgKiBOb3RlcyB0aGF0IHRoZXJlIGFyZSBubyBsb25nZXIgdGhyZWFkcyBzbGVlcGluZyBvbiB0aGUgZmxhZyBieSBjbGVhcmluZyBzbGVlcCBiaXQocykuCisgICAgICovCisgICAgRmxhZ1R5cGUgdW5zZXRfc2xlZXBpbmcoKSB7IAorICAgICAgICByZXR1cm4gdHJhaXRzX3R5cGU6OnRlc3RfdGhlbl9hbmQoKHZvbGF0aWxlIEZsYWdUeXBlICopdGhpcy0+Z2V0KCksIH5LTVBfQkFSUklFUl9TTEVFUF9TVEFURSk7CisgICAgfQorICAgIC8qISAKKyAgICAgKiBAcGFyYW0gb2xkX2xvYyBpbiAgIG9sZCB2YWx1ZSBvZiBmbGFnCisgICAgICogVGVzdCB3aGV0aGVyIHRoZXJlIGFyZSB0aHJlYWRzIHNsZWVwaW5nIG9uIHRoZSBmbGFnJ3Mgb2xkIHZhbHVlIGluIG9sZF9sb2MuCisgICAgICovCisgICAgYm9vbCBpc19zbGVlcGluZ192YWwoRmxhZ1R5cGUgb2xkX2xvYykgeyByZXR1cm4gb2xkX2xvYyAmIEtNUF9CQVJSSUVSX1NMRUVQX1NUQVRFOyB9CisgICAgLyohIAorICAgICAqIFRlc3Qgd2hldGhlciB0aGVyZSBhcmUgdGhyZWFkcyBzbGVlcGluZyBvbiB0aGUgZmxhZy4KKyAgICAgKi8KKyAgICBib29sIGlzX3NsZWVwaW5nKCkgeyByZXR1cm4gaXNfc2xlZXBpbmdfdmFsKCoodGhpcy0+Z2V0KCkpKTsgfQorfTsKKworY2xhc3Mga21wX2ZsYWdfMzIgOiBwdWJsaWMga21wX2Jhc2ljX2ZsYWc8a21wX3VpbnQzMj4geworcHVibGljOgorICAgIGttcF9mbGFnXzMyKHZvbGF0aWxlIGttcF91aW50MzIgKnApIDoga21wX2Jhc2ljX2ZsYWc8a21wX3VpbnQzMj4ocCkge30KKyAgICBrbXBfZmxhZ18zMih2b2xhdGlsZSBrbXBfdWludDMyICpwLCBrbXBfaW5mb190ICp0aHIpIDoga21wX2Jhc2ljX2ZsYWc8a21wX3VpbnQzMj4ocCwgdGhyKSB7fQorICAgIGttcF9mbGFnXzMyKHZvbGF0aWxlIGttcF91aW50MzIgKnAsIGttcF91aW50MzIgYykgOiBrbXBfYmFzaWNfZmxhZzxrbXBfdWludDMyPihwLCBjKSB7fQorICAgIHZvaWQgc3VzcGVuZChpbnQgdGhfZ3RpZCkgeyBfX2ttcF9zdXNwZW5kXzMyKHRoX2d0aWQsIHRoaXMpOyB9CisgICAgdm9pZCByZXN1bWUoaW50IHRoX2d0aWQpIHsgX19rbXBfcmVzdW1lXzMyKHRoX2d0aWQsIHRoaXMpOyB9CisgICAgaW50IGV4ZWN1dGVfdGFza3Moa21wX2luZm9fdCAqdGhpc190aHIsIGttcF9pbnQzMiBndGlkLCBpbnQgZmluYWxfc3BpbiwgaW50ICp0aHJlYWRfZmluaXNoZWQKKyAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyh2b2lkICogaXR0X3N5bmNfb2JqKSwga21wX2ludDMyIGlzX2NvbnN0cmFpbmVkKSB7CisgICAgICAgIHJldHVybiBfX2ttcF9leGVjdXRlX3Rhc2tzXzMyKHRoaXNfdGhyLCBndGlkLCB0aGlzLCBmaW5hbF9zcGluLCB0aHJlYWRfZmluaXNoZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSwgaXNfY29uc3RyYWluZWQpOworICAgIH0KKyAgICB2b2lkIHdhaXQoa21wX2luZm9fdCAqdGhpc190aHIsIGludCBmaW5hbF9zcGluCisgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKHZvaWQgKiBpdHRfc3luY19vYmopKSB7CisgICAgICAgIF9fa21wX3dhaXRfdGVtcGxhdGUodGhpc190aHIsIHRoaXMsIGZpbmFsX3NwaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopKTsKKyAgICB9CisgICAgdm9pZCByZWxlYXNlKCkgeyBfX2ttcF9yZWxlYXNlX3RlbXBsYXRlKHRoaXMpOyB9Cit9OworCitjbGFzcyBrbXBfZmxhZ182NCA6IHB1YmxpYyBrbXBfYmFzaWNfZmxhZzxrbXBfdWludDY0PiB7CitwdWJsaWM6CisgICAga21wX2ZsYWdfNjQodm9sYXRpbGUga21wX3VpbnQ2NCAqcCkgOiBrbXBfYmFzaWNfZmxhZzxrbXBfdWludDY0PihwKSB7fQorICAgIGttcF9mbGFnXzY0KHZvbGF0aWxlIGttcF91aW50NjQgKnAsIGttcF9pbmZvX3QgKnRocikgOiBrbXBfYmFzaWNfZmxhZzxrbXBfdWludDY0PihwLCB0aHIpIHt9CisgICAga21wX2ZsYWdfNjQodm9sYXRpbGUga21wX3VpbnQ2NCAqcCwga21wX3VpbnQ2NCBjKSA6IGttcF9iYXNpY19mbGFnPGttcF91aW50NjQ+KHAsIGMpIHt9CisgICAgdm9pZCBzdXNwZW5kKGludCB0aF9ndGlkKSB7IF9fa21wX3N1c3BlbmRfNjQodGhfZ3RpZCwgdGhpcyk7IH0KKyAgICB2b2lkIHJlc3VtZShpbnQgdGhfZ3RpZCkgeyBfX2ttcF9yZXN1bWVfNjQodGhfZ3RpZCwgdGhpcyk7IH0KKyAgICBpbnQgZXhlY3V0ZV90YXNrcyhrbXBfaW5mb190ICp0aGlzX3Rociwga21wX2ludDMyIGd0aWQsIGludCBmaW5hbF9zcGluLCBpbnQgKnRocmVhZF9maW5pc2hlZAorICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKHZvaWQgKiBpdHRfc3luY19vYmopLCBrbXBfaW50MzIgaXNfY29uc3RyYWluZWQpIHsKKyAgICAgICAgcmV0dXJuIF9fa21wX2V4ZWN1dGVfdGFza3NfNjQodGhpc190aHIsIGd0aWQsIHRoaXMsIGZpbmFsX3NwaW4sIHRocmVhZF9maW5pc2hlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopLCBpc19jb25zdHJhaW5lZCk7CisgICAgfQorICAgIHZvaWQgd2FpdChrbXBfaW5mb190ICp0aGlzX3RociwgaW50IGZpbmFsX3NwaW4KKyAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcodm9pZCAqIGl0dF9zeW5jX29iaikpIHsKKyAgICAgICAgX19rbXBfd2FpdF90ZW1wbGF0ZSh0aGlzX3RociwgdGhpcywgZmluYWxfc3BpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaikpOworICAgIH0KKyAgICB2b2lkIHJlbGVhc2UoKSB7IF9fa21wX3JlbGVhc2VfdGVtcGxhdGUodGhpcyk7IH0KK307CisKKy8vIEhpZXJhcmNoaWNhbCA2NC1iaXQgb24tY29yZSBiYXJyaWVyIGluc3RhbnRpYXRpb24KK2NsYXNzIGttcF9mbGFnX29uY29yZSA6IHB1YmxpYyBrbXBfZmxhZzxrbXBfdWludDY0PiB7CisgICAga21wX3VpbnQ2NCBjaGVja2VyOworICAgIGttcF9pbmZvX3QgKiB3YWl0aW5nX3RocmVhZHNbMV07CisgICAga21wX3VpbnQzMiBudW1fd2FpdGluZ190aHJlYWRzOworICAgIGttcF91aW50MzIgb2Zmc2V0OyAgICAgIC8qKjwgUG9ydGlvbiBvZiBmbGFnIHRoYXQgaXMgb2YgaW50ZXJlc3QgZm9yIGFuIG9wZXJhdGlvbi4gKi8KKyAgICBib29sIGZsYWdfc3dpdGNoOyAgICAgICAvKio8IEluZGljYXRlcyBhIHN3aXRjaCBpbiBmbGFnIGxvY2F0aW9uLiAqLworICAgIGVudW0gYmFycmllcl90eXBlIGJ0OyAgIC8qKjwgQmFycmllciB0eXBlLiAqLworICAgIGttcF9pbmZvX3QgKiB0aGlzX3RocjsgIC8qKjwgVGhyZWFkIHRoYXQgbWF5IGJlIHJlZGlyZWN0ZWQgdG8gZGlmZmVyZW50IGZsYWcgbG9jYXRpb24uICovCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIHZvaWQgKml0dF9zeW5jX29iajsgICAgIC8qKjwgSVRUIG9iamVjdCB0aGF0IG11c3QgYmUgcGFzc2VkIHRvIG5ldyBmbGFnIGxvY2F0aW9uLiAqLworI2VuZGlmCisgICAgY2hhciYgYnl0ZXJlZih2b2xhdGlsZSBrbXBfdWludDY0KiBsb2MsIHNpemVfdCBvZmZzZXQpIHsgcmV0dXJuICgoY2hhciAqKWxvYylbb2Zmc2V0XTsgfQorcHVibGljOgorICAgIGttcF9mbGFnX29uY29yZSh2b2xhdGlsZSBrbXBfdWludDY0ICpwKQorICAgICAgICA6IGttcF9mbGFnPGttcF91aW50NjQ+KHAsIGZsYWdfb25jb3JlKSwgbnVtX3dhaXRpbmdfdGhyZWFkcygwKSwgZmxhZ19zd2l0Y2goZmFsc2UpIHt9CisgICAga21wX2ZsYWdfb25jb3JlKHZvbGF0aWxlIGttcF91aW50NjQgKnAsIGttcF91aW50MzIgaWR4KQorICAgICAgICA6IGttcF9mbGFnPGttcF91aW50NjQ+KHAsIGZsYWdfb25jb3JlKSwgb2Zmc2V0KGlkeCksIG51bV93YWl0aW5nX3RocmVhZHMoMCksIGZsYWdfc3dpdGNoKGZhbHNlKSB7fQorICAgIGttcF9mbGFnX29uY29yZSh2b2xhdGlsZSBrbXBfdWludDY0ICpwLCBrbXBfdWludDY0IGMsIGttcF91aW50MzIgaWR4LCBlbnVtIGJhcnJpZXJfdHlwZSBiYXJfdCwKKyAgICAgICAgICAgICAgICAgICAga21wX2luZm9fdCAqIHRocgorI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgICAgICAgICAgICAgLCB2b2lkICppdHQKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICApIAorICAgICAgICA6IGttcF9mbGFnPGttcF91aW50NjQ+KHAsIGZsYWdfb25jb3JlKSwgY2hlY2tlcihjKSwgb2Zmc2V0KGlkeCksIGJ0KGJhcl90KSwgdGhpc190aHIodGhyKQorI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgLCBpdHRfc3luY19vYmooaXR0KQorI2VuZGlmCisgICAgICAgICwgbnVtX3dhaXRpbmdfdGhyZWFkcygwKSwgZmxhZ19zd2l0Y2goZmFsc2UpIHt9CisgICAga21wX2luZm9fdCAqIGdldF93YWl0ZXIoa21wX3VpbnQzMiBpKSB7IAorICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGk8bnVtX3dhaXRpbmdfdGhyZWFkcyk7CisgICAgICAgIHJldHVybiB3YWl0aW5nX3RocmVhZHNbaV07IAorICAgIH0KKyAgICBrbXBfdWludDMyIGdldF9udW1fd2FpdGVycygpIHsgcmV0dXJuIG51bV93YWl0aW5nX3RocmVhZHM7IH0KKyAgICB2b2lkIHNldF93YWl0ZXIoa21wX2luZm9fdCAqdGhyKSB7IAorICAgICAgICB3YWl0aW5nX3RocmVhZHNbMF0gPSB0aHI7IAorICAgICAgICBudW1fd2FpdGluZ190aHJlYWRzID0gMTsKKyAgICB9CisgICAgYm9vbCBkb25lX2NoZWNrX3ZhbChrbXBfdWludDY0IG9sZF9sb2MpIHsgcmV0dXJuIGJ5dGVyZWYoJm9sZF9sb2Msb2Zmc2V0KSA9PSBjaGVja2VyOyB9CisgICAgYm9vbCBkb25lX2NoZWNrKCkgeyByZXR1cm4gZG9uZV9jaGVja192YWwoKmdldCgpKTsgfQorICAgIGJvb2wgbm90ZG9uZV9jaGVjaygpIHsgCisgICAgICAgIC8vIENhbGN1bGF0ZSBmbGFnX3N3aXRjaAorICAgICAgICBpZiAodGhpc190aHItPnRoLnRoX2JhcltidF0uYmIud2FpdF9mbGFnID09IEtNUF9CQVJSSUVSX1NXSVRDSF9UT19PV05fRkxBRykKKyAgICAgICAgICAgIGZsYWdfc3dpdGNoID0gdHJ1ZTsKKyAgICAgICAgaWYgKGJ5dGVyZWYoZ2V0KCksb2Zmc2V0KSAhPSAxICYmICFmbGFnX3N3aXRjaCkgCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgZWxzZSBpZiAoZmxhZ19zd2l0Y2gpIHsKKyAgICAgICAgICAgIHRoaXNfdGhyLT50aC50aF9iYXJbYnRdLmJiLndhaXRfZmxhZyA9IEtNUF9CQVJSSUVSX1NXSVRDSElORzsKKyAgICAgICAgICAgIGttcF9mbGFnXzY0IGZsYWcoJnRoaXNfdGhyLT50aC50aF9iYXJbYnRdLmJiLmJfZ28sIChrbXBfdWludDY0KUtNUF9CQVJSSUVSX1NUQVRFX0JVTVApOworICAgICAgICAgICAgX19rbXBfd2FpdF82NCh0aGlzX3RociwgJmZsYWcsIFRSVUUKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgICAgICAgICAgICAgICAgICAgICwgaXR0X3N5bmNfb2JqCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGttcF91aW50NjQgaW50ZXJuYWxfcmVsZWFzZSgpIHsgCisgICAgICAgIGttcF91aW50NjQgb2xkX3ZhbDsKKyAgICAgICAgaWYgKF9fa21wX2RmbHRfYmxvY2t0aW1lID09IEtNUF9NQVhfQkxPQ0tUSU1FKSB7CisgICAgICAgICAgICBvbGRfdmFsID0gKmdldCgpOworICAgICAgICAgICAgYnl0ZXJlZihnZXQoKSxvZmZzZXQpID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGttcF91aW50NjQgbWFzaz0wOworICAgICAgICAgICAgYnl0ZXJlZigmbWFzayxvZmZzZXQpID0gMTsKKyAgICAgICAgICAgIG9sZF92YWwgPSBLTVBfVEVTVF9USEVOX09SNjQoKHZvbGF0aWxlIGttcF9pbnQ2NCAqKWdldCgpLCBtYXNrKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gb2xkX3ZhbDsKKyAgICB9CisgICAga21wX3VpbnQ2NCBzZXRfc2xlZXBpbmcoKSB7IAorICAgICAgICByZXR1cm4gS01QX1RFU1RfVEhFTl9PUjY0KChrbXBfaW50NjQgdm9sYXRpbGUgKilnZXQoKSwgS01QX0JBUlJJRVJfU0xFRVBfU1RBVEUpOworICAgIH0KKyAgICBrbXBfdWludDY0IHVuc2V0X3NsZWVwaW5nKCkgeyAKKyAgICAgICAgcmV0dXJuIEtNUF9URVNUX1RIRU5fQU5ENjQoKGttcF9pbnQ2NCB2b2xhdGlsZSAqKWdldCgpLCB+S01QX0JBUlJJRVJfU0xFRVBfU1RBVEUpOworICAgIH0KKyAgICBib29sIGlzX3NsZWVwaW5nX3ZhbChrbXBfdWludDY0IG9sZF9sb2MpIHsgcmV0dXJuIG9sZF9sb2MgJiBLTVBfQkFSUklFUl9TTEVFUF9TVEFURTsgfQorICAgIGJvb2wgaXNfc2xlZXBpbmcoKSB7IHJldHVybiBpc19zbGVlcGluZ192YWwoKmdldCgpKTsgfQorICAgIHZvaWQgd2FpdChrbXBfaW5mb190ICp0aGlzX3RociwgaW50IGZpbmFsX3NwaW4KKyAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcodm9pZCAqIGl0dF9zeW5jX29iaikpIHsKKyAgICAgICAgX19rbXBfd2FpdF90ZW1wbGF0ZSh0aGlzX3RociwgdGhpcywgZmluYWxfc3BpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaikpOworICAgIH0KKyAgICB2b2lkIHJlbGVhc2UoKSB7IF9fa21wX3JlbGVhc2VfdGVtcGxhdGUodGhpcyk7IH0KKyAgICB2b2lkIHN1c3BlbmQoaW50IHRoX2d0aWQpIHsgX19rbXBfc3VzcGVuZF9vbmNvcmUodGhfZ3RpZCwgdGhpcyk7IH0KKyAgICB2b2lkIHJlc3VtZShpbnQgdGhfZ3RpZCkgeyBfX2ttcF9yZXN1bWVfb25jb3JlKHRoX2d0aWQsIHRoaXMpOyB9CisgICAgaW50IGV4ZWN1dGVfdGFza3Moa21wX2luZm9fdCAqdGhpc190aHIsIGttcF9pbnQzMiBndGlkLCBpbnQgZmluYWxfc3BpbiwgaW50ICp0aHJlYWRfZmluaXNoZWQKKyAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyh2b2lkICogaXR0X3N5bmNfb2JqKSwga21wX2ludDMyIGlzX2NvbnN0cmFpbmVkKSB7CisgICAgICAgIHJldHVybiBfX2ttcF9leGVjdXRlX3Rhc2tzX29uY29yZSh0aGlzX3RociwgZ3RpZCwgdGhpcywgZmluYWxfc3BpbiwgdGhyZWFkX2ZpbmlzaGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaiksIGlzX2NvbnN0cmFpbmVkKTsKKyAgICB9Cit9OworCisvKiEKK0B9CisqLworCisjZW5kaWYgLy8gS01QX1dBSVRfUkVMRUFTRV9ICmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfd3JhcHBlcl9nZXRwaWQuaCBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF93cmFwcGVyX2dldHBpZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1ZTRkMTcKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfd3JhcHBlcl9nZXRwaWQuaApAQCAtMCwwICsxLDU4IEBACisvKgorICoga21wX3dyYXBwZXJfZ2V0cGlkLmggLS0gZ2V0cGlkKCkgZGVjbGFyYXRpb24uCisgKiAkUmV2aXNpb246IDQyOTUxICQKKyAqICREYXRlOiAyMDE0LTAxLTIxIDE0OjQxOjQxIC0wNjAwIChUdWUsIDIxIEphbiAyMDE0KSAkCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgS01QX1dSQVBQRVJfR0VUUElEX0gKKyNkZWZpbmUgS01QX1dSQVBQRVJfR0VUUElEX0gKKworI2lmIEtNUF9PU19VTklYCisKKyAgICAvLyBPbiBVbml4LWxpa2Ugc3lzdGVtcyAoTGludXgqIE9TIGFuZCBPUyBYKikgZ2V0cGlkKCkgaXMgZGVjbGFyZWQgaW4gc3RhbmRhcmQgaGVhZGVycy4KKyAgICAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisgICAgI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjZWxpZiBLTVBfT1NfV0lORE9XUworCisgICAgLy8gT24gV2luZG93cyogT1MgX2dldHBpZCgpIHJldHVybnMgaW50IChub3QgcGlkX3QpIGFuZCBpcyBkZWNsYXJlZCBpbiAicHJvY2Vzcy5oIi4KKyAgICAjaW5jbHVkZSA8cHJvY2Vzcy5oPgorICAgIC8vIExldCB1cyBzaW11bGF0ZSBVbml4LgorICAgIHR5cGVkZWYgaW50IHBpZF90OworICAgICNkZWZpbmUgZ2V0cGlkIF9nZXRwaWQKKworI2Vsc2UKKworICAgICNlcnJvciBVbmtub3duIG9yIHVuc3VwcG9ydGVkIE9TLgorCisjZW5kaWYKKworLyoKKyAgICBUT0RPOiBBbGwgdGhlIGxpYm9tcCBzb3VyY2UgY29kZSB1c2VzIHBpZF90IHR5cGUgZm9yIHN0b3JpbmcgdGhlIHJlc3VsdCBvZiBnZXRwaWQoKSwgaXQgaXMgZ29vZC4KKyAgICBCdXQgb2Z0ZW4gaXQgcHJpbnRlZCBhcyAiJWQiLCB0aGF0IGlzIG5vdCBnb29kLCBiZWNhdXNlIGl0IGlnbm9yZXMgcGlkX3QgZGVmaW5pdGlvbiAobWF5IHBpZF90CisgICAgYmUgbG9uZ2VyIHRoYXQgaW50PykuIEl0IHNlZW1zIGFsbCBwaWQgcHJpbnRzIHNob3VsZCBiZSByZXdyaXR0ZW4gYXMKKworICAgICAgICBwcmludGYoICIlIiBLTVBfVUlOVDY0X1NQRUMsIChrbXBfdWludDY0KSBwaWQgKTsKKworICAgIG9yIChhdCBsZWFzdCkgYXMKKworICAgICAgICBwcmludGYoICIlIiBLTVBfVUlOVDMyX1NQRUMsIChrbXBfdWludDMyKSBwaWQgKTsKKworICAgIChrbXBfdWludDMyLCBrbXBfdWludDY0LCBLTVBfVUlOVDY0X1NQRUMsIGFuZCBLTVBfVU5JVDMyX1NQRUMgYXJlIGRlZmluZWQgaW4gImttcF9vcy5oIi4pCisKKyovCisKKyNlbmRpZiAvLyBLTVBfV1JBUFBFUl9HRVRQSURfSAorCisvLyBlbmQgb2YgZmlsZSAvLwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX3dyYXBwZXJfbWFsbG9jLmggYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfd3JhcHBlcl9tYWxsb2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDU2NGI5Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX3dyYXBwZXJfbWFsbG9jLmgKQEAgLTAsMCArMSwyMDcgQEAKKy8qCisgKiBrbXBfd3JhcHBlcl9tYWxsb2MuaCAtLSBXcmFwcGVycyBmb3IgbWVtb3J5IGFsbG9jYXRpb24gcm91dGluZXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIChtYWxsb2MoKSwgZnJlZSgpLCBhbmQgb3RoZXJzKS4KKyAqICRSZXZpc2lvbjogNDMwODQgJAorICogJERhdGU6IDIwMTQtMDQtMTUgMDk6MTU6MTQgLTA1MDAgKFR1ZSwgMTUgQXByIDIwMTQpICQKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBLTVBfV1JBUFBFUl9NQUxMT0NfSAorI2RlZmluZSBLTVBfV1JBUFBFUl9NQUxMT0NfSAorCisvKgorICAgIFRoaXMgaGVhZGVyIHNlcnZlcyBmb3IgMyBwdXJwb3NlczoKKworICAgICAgICAxLiBEZWNsYXJpbmcgc3RhbmRhcmQgbWVtb3J5IGFsbG9jYXRpb24gcm91cmluZXMgaW4gT1MtaW5kZXBlbmRlbnQgd2F5LgorICAgICAgICAyLiBQYXNzaW5nIHNvdXJjZSBsb2NhdGlvbiBpbmZvIHRocm91Z2ggbWVtb3J5IGFsbG9jYXRpb24gd3JhcHBlcnMuCisgICAgICAgIDMuIEVuYWJsaW5nIG5hdGl2ZSBtZW1vcnkgZGVidWdnaW5nIGNhcGFiaWxpdGllcy4KKworCisgICAgMS4gRGVjbGFyaW5nIHN0YW5kYXJkIG1lbW9yeSBhbGxvY2F0aW9uIHJvdXJpbmVzIGluIE9TLWluZGVwZW5kZW50IHdheS4KKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgT24gTGludXgqIE9TLCBhbGxvY2EoKSBmdW5jdGlvbiBpcyBkZWNsYXJlZCBpbiA8YWxsb2NhLmg+IGhlYWRlciwgd2hpbGUgb24gV2luZG93cyogT1MgdGhlcmUgaXMgbm8KKyAgICA8YWxsb2NhLmg+IGhlYWRlciwgZnVuY3Rpb24gX2FsbG9jYSgpIChub3RlIHVuZGVyc2NvcmUhKSBpcyBkZWNsYXJlZCBpbiA8bWFsbG9jLmg+LiBUaGlzIGhlYWRlcgorICAgIGVsaW1pbmF0ZXMgdGhlc2UgZGlmZmVyZW5jZXMsIHNvIGNsaWVudCBjb2RlIGluY2x1aWRpbmcgImttcF93cmFwcGVyX21hbGxvYy5oIiBjYW4gcmVseSBvbgorICAgIGZvbGxvd2luZyByb3V0aW5lczoKKworICAgICAgICBtYWxsb2MKKyAgICAgICAgY2FsbG9jCisgICAgICAgIHJlYWxsb2MKKyAgICAgICAgZnJlZQorICAgICAgICBhbGxvY2EKKworICAgIGluIE9TLWluZGVwZW5kZW50IHdheS4gSXQgYWxzbyBlbmFibGVzIG1lbW9yeSB0cmFja2luZyBjYXBhYmlsaXRpZXMgaW4gZGVidWcgYnVpbGQuIChDdXJyZW50bHkKKyAgICBpdCBpcyBhdmFpbGFibGUgb25seSBvbiBXaW5kb3dzKiBPUy4pCisKKworICAgIDIuIFBhc3Npbmcgc291cmNlIGxvY2F0aW9uIGluZm8gdGhyb3VnaCBtZW1vcnkgYWxsb2NhdGlvbiB3cmFwcGVycy4KKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBTb21lIHRvb2xzIG1heSBoZWxwIGRlYnVnZ2luZyBtZW1vcnkgZXJyb3JzLCBmb3IgZXhhbXBsZSwgcmVwb3J0IG1lbW9yeSBsZWFrcy4gSG93ZXZlciwgbWVtb3J5CisgICAgYWxsb2NhdGlvbiB3cmFwcGVycyBtYXkgaGluZGVyIHNvdXJjZSBsb2NhdGlvbi4KKworICAgIEZvciBleGFtcGxlOgorCisgICAgICAgIHZvaWQgKiBhbGlnbmVkX21hbGxvYyggaW50IHNpemUgKSB7CisgICAgICAgICAgICB2b2lkICogcHRyID0gbWFsbG9jKCBzaXplICk7IC8vIEFsbCB0aGUgbWVtb3J5IGxlYWtzIHdpbGwgYmUgcmVwb3J0ZWQgYXQgdGhpcyBsaW5lLgorICAgICAgICAgICAgLy8gc29tZSBhZGp1c3RtZW50cy4uLgorICAgICAgICAgICAgcmV0dXJuIHB0cjsKKyAgICAgICAgfTsKKworICAgICAgICBwdHIgPSBhbGlnbmVkX21hbGxvYyggc2l6ZSApOyAgICAvLyBNZW1vcnkgbGVhayB3aWxsICpub3QqIGJlIGRldGVjdGVkIGhlcmUuIDotKAorCisgICAgVG8gb3ZlcmNvbWUgdGhlIHByb2JsZW0sIGluZm9ybWF0aW9uIGFib3V0IG9yaWdpbmFsIHNvdXJjZSBsb2NhdGlvbiBzaG91bGQgYmUgcGFzc2VkIHRocm91Z2ggYWxsCisgICAgdGhlIG1lbW9yeSBhbGxvY2F0aW9uIHdyYXBwZXJzLCBmb3IgZXhhbXBsZToKKworICAgICAgICB2b2lkICogYWxpZ25lZF9tYWxsb2MoIGludCBzaXplLCBjaGFyIGNvbnN0ICogZmlsZSwgaW50IGxpbmUgKSB7CisgICAgICAgICAgICB2b2lkICogcHRyID0gX21hbGxvY19kYmcoIHNpemUsIGZpbGUsIGxpbmUgKTsKKyAgICAgICAgICAgIC8vIHNvbWUgYWRqdXN0bWVudHMuLi4KKyAgICAgICAgICAgIHJldHVybiBwdHI7CisgICAgICAgIH07CisKKyAgICAgICAgdm9pZCAqIHB0ciA9IGFsaWduZWRfbWFsbG9jKCBzaXplLCBfX0ZJTEVfXywgX19MSU5FX18gKTsKKworICAgIFRoaXMgaXMgYSBnb29kIGlkZWEgZm9yIGRlYnVnLCBidXQgcGFzc2luZyBhZGRpdGlvbmFsIGFyZ3VtZW50cyBpbXBhY3RzIHBlcmZvcm1hbmNlLiBEaXNhYmxpbmcKKyAgICBleHRyYSBhcmd1bWVudHMgaW4gcmVsZWFzZSB2ZXJzaW9uIG9mIHRoZSBzb2Z0d2FyZSBpbnRyb2R1Y2VzIHRvbyBtYW55IGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uLAorICAgIHdoaWNoIG1ha2VzIGNvZGUgdW5yZWFkYWJsZS4gVGhpcyBoZWFkZXIgZGVmaW5lcyBmZXcgbWFjcm9zIGFuZCBmdW5jdGlvbnMgZmFjaWxpdGF0aW5nIGl0OgorCisgICAgICAgIHZvaWQgKiBfYWxpZ25lZF9tYWxsb2MoIGludCBzaXplIEtNUF9TUkNfTE9DX0RFQ0wgKSB7CisgICAgICAgICAgICB2b2lkICogcHRyID0gbWFsbG9jX3NyY19sb2MoIHNpemUgS01QX1NSQ19MT0NfUEFSTSApOworICAgICAgICAgICAgLy8gc29tZSBhZGp1c3RtZW50cy4uLgorICAgICAgICAgICAgcmV0dXJuIHB0cjsKKyAgICAgICAgfTsKKyAgICAgICAgI2RlZmluZSBhbGlnbmVkX21hbGxvYyggc2l6ZSApIF9hbGlnbmVkX21hbGxvYyggKHNpemUpIEtNUF9TUkNfTE9DX0NVUlIgKQorICAgICAgICAgICAgLy8gVXNlIG1hY3JvIGluc3RlYWQgb2YgZGlyZWN0IGNhbGwgdG8gZnVuY3Rpb24uCisKKyAgICAgICAgdm9pZCAqIHB0ciA9IGFsaWduZWRfbWFsbG9jKCBzaXplICk7ICAvLyBCaW5nbyEgTWVtb3J5IGxlYWsgd2lsbCBiZSByZXBvcnRlZCBhdCB0aGlzIGxpbmUuCisKKworICAgIDMuIEVuYWJsaW5nIG5hdGl2ZSBtZW1vcnkgZGVidWdnaW5nIGNhcGFiaWxpdGllcy4KKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBTb21lIHBsYXRmb3JtcyBtYXkgb2ZmZXIgbWVtb3J5IGRlYnVnZ2luZyBjYXBhYmlsaXRpZXMuIEZvciBleGFtcGxlLCBkZWJ1ZyB2ZXJzaW9uIG9mIE1pY3Jvc29mdAorICAgIFJUTCB0cmFja3MgYWxsIG1lbW9yeSBhbGxvY2F0aW9ucyBhbmQgY2FuIHJlcG9ydCBtZW1vcnkgbGVha3MuIFRoaXMgaGVhZGVyIGVuYWJsZXMgdGhpcywgYW5kCisgICAgbWFrZXMgcmVwb3J0IG1vcmUgdXNlZnVsIChzZWUgIlBhc3Npbmcgc291cmNlIGxvY2F0aW9uIGluZm8gdGhyb3VnaCBtZW1vcnkgYWxsb2NhdGlvbgorICAgIHdyYXBwZXJzIikuCisKKyovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgImttcF9vcy5oIgorCisvLyBJbmNsdWRlIGFsbG9jYSgpIGRlY2xhcmF0aW9uLgorI2lmIEtNUF9PU19XSU5ET1dTCisgICAgI2luY2x1ZGUgPG1hbGxvYy5oPiAgICAgICAgLy8gV2luZG93cyogT1M6IF9hbGxvY2EoKSBkZWNsYXJlZCBpbiAibWFsbG9jLmgiLgorICAgICNkZWZpbmUgYWxsb2NhIF9hbGxvY2EgICAgIC8vIEFsbG93IHRvIHVzZSBhbGxvY2EoKSB3aXRoIG5vIHVuZGVyc2NvcmUuCisjZWxpZiBLTVBfT1NfRlJFRUJTRAorICAgIC8vIERlY2xhcmVkIGluICJzdGRsaWIuaCIuCisjZWxpZiBLTVBfT1NfVU5JWAorICAgICNpbmNsdWRlIDxhbGxvY2EuaD4gICAgICAgIC8vIExpbnV4KiBPUyBhbmQgT1MgWCo6IGFsbG9jKCkgZGVjbGFyZWQgaW4gImFsbG9jYSIuCisjZWxzZQorICAgICNlcnJvciBVbmtub3duIG9yIHVuc3VwcG9ydGVkIE9TLgorI2VuZGlmCisKKy8qCisgICAgS01QX1NSQ19MT0NfREVDTCAtLSBEZWNsYXJpbmcgc291cmNlIGxvY2F0aW9uIHBhcmFtZW10ZXJzLCB0byBiZSB1c2VkIGluIGZ1bmN0aW9uIGRlY2xhcmF0aW9uLgorICAgIEtNUF9TUkNfTE9DX1BBUk0gLS0gU291cmNlIGxvY2F0aW9uIHBhcmFtZW10ZXJzLCB0byBiZSB1c2VkIHRvIHBhc3MgcGFyYW1ldGVycyB0byB1bmRlcmx5aW5nCisgICAgICAgIGxldmVscy4KKyAgICBLTVBfU1JDX0xPQ19DVVJSIC0tIFNvdXJjZSBsb2NhdGlvbiBhcmd1bWVudHMgZGVzY3JpYmluZyBjdXJyZW50IGxvY2F0aW9uLCB0byBiZSB1c2VkIGF0CisgICAgICAgIHRvcC1sZXZlbC4KKworICAgIFR5cGljYWwgdXNhZ2U6CisKKyAgICAgICAgdm9pZCAqIF9hbGlnbmVkX21hbGxvYyggaW50IHNpemUgS01QX1NSQ19MT0NfREVDTCApIHsKKyAgICAgICAgICAgIC8vIE5vdGU6IENvbW1hIGlzIG1pc3NlZCBiZWZvcmUgS01QX1NSQ19MT0NfREVDTC4KKyAgICAgICAgICAgIEtFX1RSQUNFKCAyNSwgKCAiY2FsbGVkIGZyb20gJXM6JWRcbiIsIEtNUF9TUkNfTE9DX1BBUk0gKSApOworICAgICAgICAgICAgLi4uCisgICAgICAgIH0KKyAgICAgICAgI2RlZmluZSBhbGlnbmVkX21hbGxvYyggc2l6ZSApIF9hbGlnbmVkX21hbGxvYyggKHNpemUpIEtNUF9TUkNfTE9DX0NVUlIgKQorICAgICAgICAgICAgLy8gVXNlIG1hY3JvIGluc3RlYWQgb2YgZGlyZWN0IGNhbGwgdG8gZnVuY3Rpb24gLS0gbWFjcm8gcGFzc2VzIGluZm8gYWJvdXQgY3VycmVudAorICAgICAgICAgICAgLy8gc291cmNlIGxvY2F0aW9uIHRvIHRoZSBmdW5jLgorKi8KKyNpZiBLTVBfREVCVUcKKyAgICAjZGVmaW5lIEtNUF9TUkNfTE9DX0RFQ0wgICAgLCBjaGFyIGNvbnN0ICogX2ZpbGVfLCBpbnQgX2xpbmVfCisgICAgI2RlZmluZSBLTVBfU1JDX0xPQ19QQVJNICAgICwgX2ZpbGVfLCBfbGluZV8KKyAgICAjZGVmaW5lIEtNUF9TUkNfTE9DX0NVUlIgICAgLCBfX0ZJTEVfXywgX19MSU5FX18KKyNlbHNlCisgICAgI2RlZmluZSBLTVBfU1JDX0xPQ19ERUNMCisgICAgI2RlZmluZSBLTVBfU1JDX0xPQ19QQVJNCisgICAgI2RlZmluZSBLTVBfU1JDX0xPQ19DVVJSCisjZW5kaWYgLy8gS01QX0RFQlVHCisKKy8qCisgICAgbWFsbG9jX3NyY19sb2MoKSBhbmQgZnJlZV9zcmNfbG9jKCkgYXJlIHBzZXVkby1mdW5jdGlvbnMgKHJlYWxseSBtYWNyb3MpIHdpdGggYWNjZXB0cyBleHRyYQorICAgIGFyZ3VtZW50cyAoc291cmNlIGxvY2F0aW9uIGluZm8pIGluIGRlYnVnIG1vZGUuIFRoZXkgc2hvdWxkIGJlIHVzZWQgaW4gcGxhY2Ugb2YgbWFsbG9jKCkgYW5kCisgICAgZnJlZSgpLCB0aGlzIGFsbG93cyBlbmFibGluZyBuYXRpdmUgbWVtb3J5IGRlYnVnZ2luZyBjYXBhYmlsaXRpZXMgKGlmIGFueSkuCisKKyAgICBUeXBpY2FsIHVzYWdlOgorCisgICAgICAgIHB0ciA9IG1hbGxvY19zcmNfbG9jKCBzaXplIEtNUF9TUkNfTE9DX1BBUk0gKTsKKyAgICAgICAgICAgIC8vIEluc2lkZSBtZW1vcnkgYWxsb2NhdGlvbiB3cmFwcGVyLCBvcgorICAgICAgICBwdHIgPSBtYWxsb2Nfc3JjX2xvYyggc2l6ZSBLTVBfU1JDX0xPQ19DVVJSICk7CisgICAgICAgICAgICAvLyBPdXRzaWRlIG9mIG1lbW9yeSBhbGxvY2F0aW9uIHdyYXBwZXIuCisKKworKi8KKyNkZWZpbmUgbWFsbG9jX3NyY19sb2MoIGFyZ3MgKSAgICBfbWFsbG9jX3NyY19sb2MoIGFyZ3MgKQorI2RlZmluZSBmcmVlX3NyY19sb2MoICAgYXJncyApICAgIF9mcmVlX3NyY19sb2MoICAgYXJncyApCisgICAgLyoKKyAgICAgICAgRGVwZW5kaW5nIG9uIGJ1aWxkIG1vZGUgKGRlYnVnIG9yIHJlbGVhc2UpLCBtYWxsb2Nfc3JjX2xvYyBpcyBkZWNsYXJlZCB3aXRoIDEgb3IgMworICAgICAgICBwYXJhbWV0ZXJzLCBidXQgY2FsbHMgdG8gbWFsbG9jX3NyY19sb2MoKSBhcmUgYWx3YXlzIHRoZSBzYW1lOgorCisgICAgICAgICAgICAuLi4gbWFsbG9jX3NyY19sb2MoIHNpemUgS01QX1NSQ19MT0NfUEFSTSApOyAvLyBvciBLTVBfU1JDX0xPQ19DVVJSCisKKyAgICAgICAgQ29tcGlsZXIgaXNzdWVzIHdhcm5pbmcvZXJyb3IgInRvbyBmZXcgYXJndW1lbnRzIGluIG1hY3JvIGludm9jYXRpb24iLiBEZWNsYXJpbmcgdHdvCisgICAgICAgIG1hY3Jvc2VzLCBtYWxsb2Nfc3JjX2xvYygpIGFuZCBfbWFsbG9jX3NyY19sb2MoKSBvdmVyY29tZXMgdGhlIHByb2JsZW0uCisgICAgKi8KKworI2lmIEtNUF9ERUJVRworCisgICAgI2lmIEtNUF9PU19XSU5ET1dTICYmIF9ERUJVRworICAgICAgICAvLyBLTVBfREVCVUcgIT0gX0RFQlVHLiBNUyBkZWJ1ZyBSVEwgaXMgYXZhaWxhYmxlIG9ubHkgaWYgX0RFQlVHIGlzIGRlZmluZWQuCisKKyAgICAgICAgLy8gV2luZG93cyogT1MgaGFzIG5hdGl2ZSBtZW1vcnkgZGVidWdnaW5nIGNhcGFiaWxpdGllcy4gRW5hYmxlIHRoZW0uCisKKyAgICAgICAgI2luY2x1ZGUgPGNydGRiZy5oPgorCisgICAgICAgICNkZWZpbmUgS01QX01FTV9CTE9DSyAgICAgICAgICAgX0NMSUVOVF9CTE9DSworICAgICAgICAjZGVmaW5lIG1hbGxvYyggc2l6ZSApICAgICAgICAgIF9tYWxsb2NfZGJnKCAoc2l6ZSksIEtNUF9NRU1fQkxPQ0ssIF9fRklMRV9fLCBfX0xJTkVfXyApCisgICAgICAgICNkZWZpbmUgY2FsbG9jKCBudW0sIHNpemUgKSAgICAgX2NhbGxvY19kYmcoIChudW0pLCAoc2l6ZSksIEtNUF9NRU1fQkxPQ0ssIF9fRklMRV9fLCBfX0xJTkVfXyApCisgICAgICAgICNkZWZpbmUgcmVhbGxvYyggcHRyLCBzaXplICkgICAgX3JlYWxsb2NfZGJnKCAocHRyKSwgKHNpemUpLCBLTVBfTUVNX0JMT0NLLCBfX0ZJTEVfXywgX19MSU5FX18gKQorICAgICAgICAjZGVmaW5lIGZyZWUoIHB0ciApICAgICAgICAgICAgIF9mcmVlX2RiZyggKHB0ciksIEtNUF9NRU1fQkxPQ0sgKQorCisgICAgICAgICNkZWZpbmUgX21hbGxvY19zcmNfbG9jKCBzaXplLCBmaWxlLCBsaW5lICkgIF9tYWxsb2NfZGJnKCAoc2l6ZSksIEtNUF9NRU1fQkxPQ0ssIChmaWxlKSwgKGxpbmUpICkKKyAgICAgICAgI2RlZmluZSBfZnJlZV9zcmNfbG9jKCAgICBwdHIsIGZpbGUsIGxpbmUgKSAgX2ZyZWVfZGJnKCAgIChwdHIpLCAgS01QX01FTV9CTE9DSyAgICAgICAgICAgICAgICAgKQorCisgICAgI2Vsc2UKKworICAgICAgICAvLyBMaW51eCogT1MsIE9TIFgqLCBvciBub24tZGVidWcgV2luZG93cyogT1MuCisKKyAgICAgICAgI2RlZmluZSBfbWFsbG9jX3NyY19sb2MoIHNpemUsIGZpbGUsIGxpbmUgKSAgICBtYWxsb2MoIChzaXplKSApCisgICAgICAgICNkZWZpbmUgX2ZyZWVfc3JjX2xvYyggcHRyLCBmaWxlLCBsaW5lICkgICAgICAgZnJlZSggKHB0cikgKQorCisgICAgI2VuZGlmCisKKyNlbHNlCisKKyAgICAvLyBJbiByZWxlYXNlIGJ1aWxkIG1hbGxvY19zcmNfbG9jKCkgYW5kIGZyZWVfc3JjX2xvYygpIGRvIG5vdCBoYXZlIGV4dHJhIHBhcmFtZXRlcnMuCisgICAgI2RlZmluZSBfbWFsbG9jX3NyY19sb2MoIHNpemUgKSAgICBtYWxsb2MoIChzaXplKSApCisgICAgI2RlZmluZSBfZnJlZV9zcmNfbG9jKCBwdHIgKSAgICAgICBmcmVlKCAocHRyKSApCisKKyNlbmRpZiAvLyBLTVBfREVCVUcKKworI2VuZGlmIC8vIEtNUF9XUkFQUEVSX01BTExPQ19ICisKKy8vIGVuZCBvZiBmaWxlIC8vCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9saWJpb21wLnJjLnZhciBiL2ZpbmFsL3J1bnRpbWUvc3JjL2xpYmlvbXAucmMudmFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMjIxYjYKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9saWJpb21wLnJjLnZhcgpAQCAtMCwwICsxLDcyIEBACisvLyBsaWJpb21wLnJjLnZhcgorLy8gJFJldmlzaW9uOiA0Mjk5NCAkCisvLyAkRGF0ZTogMjAxNC0wMy0wNCAwMjoyMjoxNSAtMDYwMCAoVHVlLCAwNCBNYXIgMjAxNCkgJAorCisvLworLy8vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vLworLy8vLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLy8vCisvLy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLy8vCisvLy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworCisjaW5jbHVkZSAid2lucmVzLmgiCisKK0xBTkdVQUdFIExBTkdfRU5HTElTSCwgU1VCTEFOR19FTkdMSVNIX1VTICAgIC8vIEVuZ2xpc2ggKFUuUy4pIHJlc291cmNlcworI3ByYWdtYSBjb2RlX3BhZ2UoMTI1MikKKworVlNfVkVSU0lPTl9JTkZPIFZFUlNJT05JTkZPCisgICAgLy8gUGFydHMgb2YgRklMRVZFUlNJT04gYW5kIFBST0RVQ1RWRVJTSU9OIGFyZSAxNi1iaXQgZmllbGRzLCBlbnRpcmUgYnVpbGQgZGF0ZSB5eXl5bW1kZAorICAgIC8vIGRvZXMgbm90IGZpdCBpbnRvIG9uZSB2ZXJzaW9uIHBhcnQsIHNvIHdlIG5lZWQgdG8gc3BsaXQgaXQgaW50byB5eXl5IGFuZCBtbWRkOgorICAgIEZJTEVWRVJTSU9OICAgICRLTVBfVkVSU0lPTl9NQUpPUiwkS01QX1ZFUlNJT05fTUlOT1IsJHt7IG91ciAkS01QX1ZFUlNJT05fQlVJTEQ7IGludCggJEtNUF9WRVJTSU9OX0JVSUxEIC8gMTAwMDAgKSAuICIsIiAuICggJEtNUF9WRVJTSU9OX0JVSUxEICUgMTAwMDAgKSB9fQorICAgIFBST0RVQ1RWRVJTSU9OICRLTVBfVkVSU0lPTl9NQUpPUiwkS01QX1ZFUlNJT05fTUlOT1IsJHt7IG91ciAkS01QX1ZFUlNJT05fQlVJTEQ7IGludCggJEtNUF9WRVJTSU9OX0JVSUxEIC8gMTAwMDAgKSAuICIsIiAuICggJEtNUF9WRVJTSU9OX0JVSUxEICUgMTAwMDAgKSB9fQorICAgIEZJTEVGTEFHU01BU0sgIFZTX0ZGSV9GSUxFRkxBR1NNQVNLCisgICAgRklMRUZMQUdTICAgICAgMAorICAgICNpZiAkS01QX0RJQUcgfHwgJEtNUF9ERUJVR19JTkZPCisgICAgICAgIHwgVlNfRkZfREVCVUcKKyAgICAjZW5kaWYKKyAgICAjaWYgJEtNUF9WRVJTSU9OX0JVSUxEID09IDAKKyAgICAgICAgfCBWU19GRl9QUklWQVRFQlVJTEQgfCBWU19GRl9QUkVSRUxFQVNFCisgICAgI2VuZGlmCisgICAgRklMRU9TICAgICAgICAgIFZPU19OVF9XSU5ET1dTMzIgICAgLy8gV2luZG93cyogU2VydmVyKiAyMDAzLCBYUCosIDIwMDAsIG9yIE5UKgorICAgIEZJTEVUWVBFICAgICAgICBWRlRfRExMCisgICAgQkVHSU4KKyAgICAgICAgQkxPQ0sgIlN0cmluZ0ZpbGVJbmZvIgorICAgICAgICBCRUdJTgorICAgICAgICAgICAgQkxPQ0sgIjA0MDkwNGIwIiAgICAgICAgICAgIC8vIFUuUy4gRW5nbGlzaCwgVW5pY29kZSAoMHgwNGIwID09IDEyMDApCisgICAgICAgICAgICBCRUdJTgorCisgICAgICAgICAgICAgICAgLy8gRmlsZURlc2NyaXB0aW9uIGFuZCBMZWdhbENvcHlyaWdodCBzaG91bGQgYmUgc2hvcnQuCisgICAgICAgICAgICAgICAgVkFMVUUgIkZpbGVEZXNjcmlwdGlvbiIsICAiSW50ZWwoUikgT3Blbk1QKiBSdW50aW1lIExpYnJhcnkke3sgb3VyICRNRVNTQUdFX0NBVEFMT0c7ICRNRVNTQUdFX0NBVEFMT0cgPyAiIE1lc3NhZ2UgQ2F0YWxvZyIgOiAiIiB9fVwwIgorICAgICAgICAgICAgICAgIC8vIEZvbGxvd2luZyB2YWx1ZXMgbWF5IGJlIHJlbGF0aXZlbHkgbG9uZy4KKyAgICAgICAgICAgICAgICBWQUxVRSAiQ29tcGFueU5hbWUiLCAgICAgICJJbnRlbCBDb3Jwb3JhdGlvblwwIgorICAgICAgICAgICAgICAgIC8vIFZBTFVFICJMZWdhbFRyYWRlbWFya3MiLCAgIlwwIiAgLy8gTm90IHVzZWQgZm9yIG5vdy4KKyAgICAgICAgICAgICAgICBWQUxVRSAiUHJvZHVjdE5hbWUiLCAgICAgICJJbnRlbChSKSBPcGVuTVAqIFJ1bnRpbWUgTGlicmFyeVwwIgorICAgICAgICAgICAgICAgIFZBTFVFICJQcm9kdWN0VmVyc2lvbiIsICAgIiRLTVBfVkVSU0lPTl9NQUpPUi4kS01QX1ZFUlNJT05fTUlOT1JcMCIKKyAgICAgICAgICAgICAgICBWQUxVRSAiRmlsZVZlcnNpb24iLCAgICAgICIkS01QX1ZFUlNJT05fQlVJTERcMCIKKyAgICAgICAgICAgICAgICBWQUxVRSAiSW50ZXJuYWxOYW1lIiwgICAgICIkS01QX0ZJTEVcMCIKKyAgICAgICAgICAgICAgICBWQUxVRSAiT3JpZ2luYWxGaWxlbmFtZSIsICIkS01QX0ZJTEVcMCIKKyAgICAgICAgICAgICAgICBWQUxVRSAiQ29tbWVudHMiLAorICAgICAgICAgICAgICAgICAgICAiSW50ZWwoUikgT3Blbk1QKiAke3sgb3VyICggJE1FU1NBR0VfQ0FUQUxPRywgJEtNUF9UWVBFICk7ICRNRVNTQUdFX0NBVEFMT0cgPyAiUnVudGltZSBMaWJyYXJ5IE1lc3NhZ2UgQ2F0YWxvZyIgOiAiJEtNUF9UWVBFIExpYnJhcnkiIH19ICIKKyAgICAgICAgICAgICAgICAgICAgInZlcnNpb24gJEtNUF9WRVJTSU9OX01BSk9SLiRLTVBfVkVSU0lPTl9NSU5PUi4kS01QX1ZFUlNJT05fQlVJTEQgIgorICAgICAgICAgICAgICAgICAgICAiZm9yICRLTVBfQVJDSCBhcmNoaXRlY3R1cmUgYnVpbHQgb24gJEtNUF9CVUlMRF9EQVRFLlwwIgorICAgICAgICAgICAgICAgICNpZiAkS01QX1ZFUlNJT05fQlVJTEQgPT0gMAorICAgICAgICAgICAgICAgICAgICBWQUxVRSAiUHJpdmF0ZUJ1aWxkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJUaGlzIGlzIGEgZGV2ZWxvcG1lbnQgYnVpbGQgZm9yIGludGVybmFsIHRlc3RpbmcgcHVycG9zZXMgb25seS4gIgorICAgICAgICAgICAgICAgICAgICAgICAgIkRvIG5vdCBkaXN0cmlidXRlIGl0IG91dHNpZGUgb2YgSW50ZWwuXDAiCisgICAgICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAgICAgLy8gVkFMVUUgIlNwZWNpYWxCdWlsZCIsICAgICAiXDAiICAgIC8vIE5vdCB1c2VkIGZvciBub3cuCisKKyAgICAgICAgICAgIEVORAorICAgICAgICBFTkQKKyAgICAgICAgQkxPQ0sgIlZhckZpbGVJbmZvIgorICAgICAgICBCRUdJTgorICAgICAgICAgICAgVkFMVUUgIlRyYW5zbGF0aW9uIiwgJHt7IG91ciAoICRNRVNTQUdFX0NBVEFMT0csICRMQU5HVUFHRSApOyAkTUVTU0FHRV9DQVRBTE9HID8gJExBTkdVQUdFIDogMTAzMyB9fSwgMTIwMAorICAgICAgICAgICAgLy8gMTAzMyAtLSBVLlMuIEVuZ2xpc2gsIDEyMDAgLS0gVW5pY29kZQorICAgICAgICBFTkQKKyAgICBFTkQKKworLy8gZW5kIG9mIGZpbGUgLy8KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL21ha2VmaWxlLm1rIGIvZmluYWwvcnVudGltZS9zcmMvbWFrZWZpbGUubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ2NTRiZQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL21ha2VmaWxlLm1rCkBAIC0wLDAgKzEsMTYwMCBAQAorIyBtYWtlZmlsZS5tayAjCisjICRSZXZpc2lvbjogNDM0NzMgJAorIyAkRGF0ZTogMjAxNC0wOS0yNiAxNTowMjo1NyAtMDUwMCAoRnJpLCAyNiBTZXAgMjAxNCkgJAorCisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKKyMgQ2hlY2sgYW5kIG5vcm1hbGl6ZSBMSUJPTVBfV09SSy4KKyMgVGhpcyBwaWVjZSBvZiBjb2RlIGlzIGNvbW1vbiwgYnV0IGl0IGNhbm5vdCBiZSBtb3ZlZCB0byBjb21tb24gZmlsZS4KK2lmZXEgIiQoTElCT01QX1dPUkspIiAiIgorICAgICQoZXJyb3IgTElCT01QX1dPUksgZW52aXJvbm1lbnQgdmFyaWFibGUgbXVzdCBiZSBzZXQpCitlbmRpZgoraWZuZXEgIiQod29yZHMgJChMSUJPTVBfV09SSykpIiAiMSIKKyAgICAkKGVycm9yIExJQk9NUF9XT1JLIG11c3Qgbm90IGNvbnRhaW4gc3BhY2VzKQorZW5kaWYKK292ZXJyaWRlIExJQk9NUF9XT1JLIDo9ICQoc3Vic3QgXCwvLCQoTElCT01QX1dPUkspKQoraWZlcSAiJChmaWx0ZXIgJS8sJChMSUJPTVBfV09SSykpIiAiIgorICAgIG92ZXJyaWRlIExJQk9NUF9XT1JLIDo9ICQoTElCT01QX1dPUkspLworZW5kaWYKKworIyBJbmNsdWRlIGRlZmluaXRpb25zIGNvbW1vbiBmb3IgUlRMIGFuZCBEU0wuCitpbmNsdWRlICQoTElCT01QX1dPUkspc3JjL2RlZnMubWsKKworc3JjX2RpciAgICAgID0gJChMSUJPTVBfV09SSylzcmMvCitpbmNfZGlyICAgICAgPSAkKExJQk9NUF9XT1JLKXNyYy9pbmNsdWRlLyQoT01QX1ZFUlNJT04pLworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucy4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBCdWlsZCBjb21waWxlcgorQlVJTERfQ09NUElMRVIgOj0gJChjYWxsIGNoZWNrX3ZhcmlhYmxlLEJVSUxEX0NPTVBJTEVSLGljYyBnY2MgY2xhbmcgaWNsIGljbC5leGUpCisjIERpc3RyaWJ1dGlvbiB0eXBlOiBjb20gKGNvbW1lcmNpYWwpIG9yIG9zcyAob3Blbi1zb3VyY2UpCitESVNUUklCVVRJT04gIDo9ICQoY2FsbCBjaGVja192YXJpYWJsZSxESVNUUklCVVRJT04sY29tIG9zcykKKworaWZlcSAiJChjKSIgIiIKKyAgICBjID0gJChCVUlMRF9DT01QSUxFUikKKyAgICBpZmVxICIkKG9zKSIgIndpbiIKKyAgICAgICAgYyA9IGljbC5leGUKKyAgICBlbmRpZgorZW5kaWYKK2lmZXEgIiQoZGlzdCkiICIiCisgICAgZGlzdCA9ICQoRElTVFJJQlVUSU9OKQorZW5kaWYKK2lmZXEgIiQoZGlzdCkiICIiCisgICAgZGlzdCA9IGNvbQorZW5kaWYKKworIyBDb21waWxlIGFsbCBDIGZpbGVzIGFzIEMrKyBzb3VyY2UuCitDUExVU1BMVVMgICAgOj0gJChjYWxsIGNoZWNrX3ZhcmlhYmxlLENQTFVTUExVUyxvbikKKyMgVHVybiBvbiBpbnN0cnVtZW50YXRpb24gZm9yIGNvZGUgY292ZXJhZ2UuCitDT1ZFUkFHRSAgICAgOj0gJChjYWxsIGNoZWNrX3ZhcmlhYmxlLENPVkVSQUdFLG9mZiBvbikKKyMgSW5zdHJ1Y3QgY29tcGlsZXIgdG8gZW1pdCBkZWJ1ZyBpbmZvcm1hdGlvbi4KK0RFQlVHX0lORk8gICA6PSAkKGNhbGwgY2hlY2tfdmFyaWFibGUsREVCVUdfSU5GTyxvbiBvZmYpCisjIFR1cm4gb24gZGVidWcgc3VwcG9ydCBpbiBsaWJyYXJ5IGNvZGUsIGFzc2VydGlvbnMgYW5kIHRyYWNlcy4KK0RJQUcgICAgICAgICA6PSAkKGNhbGwgY2hlY2tfdmFyaWFibGUsRElBRyxvbiBvZmYpCitMSUJfVFlQRSAgICAgOj0gJChjYWxsIGNoZWNrX3ZhcmlhYmxlLExJQl9UWVBFLG5vcm0gcHJvZiBzdHViKQorIyBUeXBlIG9mIGxpYnJhcnk6IGR5bmFtaWMgb3Igc3RhdGljIGxpbmtpbmcuCitMSU5LX1RZUEUgICAgOj0gJChjYWxsIGNoZWNrX3ZhcmlhYmxlLExJTktfVFlQRSxkeW5hIHN0YXQpCisjIFN1cHBvcnRlZCBPcGVuTVAgdmVyc2lvbiwgMi41IG9yIDMuMC4KK09NUF9WRVJTSU9OICA6PSAkKGNhbGwgY2hlY2tfdmFyaWFibGUsT01QX1ZFUlNJT04sNDAgMzAgMjUpCisjIEdlbmVyYXRlIG9wdGltaXplZCBjb2RlLgorT1BUSU1JWkFUSU9OIDo9ICQoY2FsbCBjaGVja192YXJpYWJsZSxPUFRJTUlaQVRJT04sb2ZmIG9uKQorIyBUYXJnZXQgY29tcGlsZXIuCitUQVJHRVRfQ09NUElMRVIgOj0gJChjYWxsIGNoZWNrX3ZhcmlhYmxlLFRBUkdFVF9DT01QSUxFUiwxMiAxMSkKKyMgTGlicmFyeSB2ZXJzaW9uOiA0IC0tIGxlZ2FjeSwgNSAtLSBjb21wYXQuCitWRVJTSU9OICAgICAgOj0gJChjYWxsIGNoZWNrX3ZhcmlhYmxlLFZFUlNJT04sNSA0KQorIyBxdWFkIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludAorSEFWRV9RVUFEICAgICA9IDEKKworVlBBVEggKz0gJChzcmNfZGlyKQorVlBBVEggKz0gJChzcmNfZGlyKWkxOG4vCitWUEFUSCArPSAkKGluY19kaXIpCitWUEFUSCArPSAkKHNyY19kaXIpdGhpcmRwYXJ0eS9pdHRub3RpZnkvCisKKworIyBEZWZpbmUgY29uZmlnLgorZGVmaW5lIGN1cnJfY29uZmlnCisgICAgQ1BMVVNQTFVTPSQoQ1BMVVNQTFVTKQorICAgIENPVkVSQUdFPSQoQ09WRVJBR0UpCisgICAgREVCVUdfSU5GTz0kKERFQlVHX0lORk8pCisgICAgRElBRz0kKERJQUcpCisgICAgTElCX1RZUEU9JChMSUJfVFlQRSkKKyAgICBMSU5LX1RZUEU9JChMSU5LX1RZUEUpCisgICAgT01QX1ZFUlNJT049JChPTVBfVkVSU0lPTikKKyAgICBPUFRJTUlaQVRJT049JChPUFRJTUlaQVRJT04pCisgICAgVEFSR0VUX0NPTVBJTEVSPSQoVEFSR0VUX0NPTVBJTEVSKQorICAgIFZFUlNJT049JChWRVJTSU9OKQorICAgIENQUEZMQUdTPSQoc3Vic3QgJChzcGFjZSksXywkKENQUEZMQUdTKSkKKyAgICBDRkxBR1M9JChzdWJzdCAkKHNwYWNlKSxfLCQoQ0ZMQUdTKSkKKyAgICBDWFhGTEFHUz0kKHN1YnN0ICQoc3BhY2UpLF8sJChDWFhGTEFHUykpCisgICAgRkZMQUdTPSQoc3Vic3QgJChzcGFjZSksXywkKEZGTEFHUykpCisgICAgTERGTEFHUz0kKHN1YnN0ICQoc3BhY2UpLF8sJChMREZMQUdTKSkKK2VuZGVmCisjIEFuZCBjaGVjayBpdC4KK2luY2x1ZGUgJCh0b29sc19kaXIpc3JjL2NvbW1vbi1jaGVja3MubWsKKworIyBGdW5jdGlvbiB0byBjb252ZXJ0IExJQl9UWVBFIHRvIHByaW50YWJsZSBvbmUuCitsZWdhbF90eXBlID0gJChpZiAkKGZpbHRlciBub3JtLCQoTElCX1RZUEUpKSxQZXJmb3JtYW5jZSwkKGlmICQoZmlsdGVyIHByb2YsJChMSUJfVFlQRSkpLFByb2ZpbGluZyxTdHViKSkKKworIyBDaGVjayB0aGUgT1MgWCB2ZXJzaW9uICh3ZSBuZWVkIGl0IHRvIGRlY2lkZSB3aGljaCB0b29sIHVzZSBmb3Igb2JqZWN0cyBhY2N1bXVsYXRpb24pCitpZmVxICIkKG9zKSIgIm1hYyIKKyAgICBtYWNfb3NfbmV3IDo9ICQoc2hlbGwgL2Jpbi9zaCAtYyAnaWYgW1sgYHN3X3ZlcnMgLXByb2R1Y3RWZXJzaW9uYCA+IDEwLjYgXV07IHRoZW4gZWNobyAiMSI7IGVsc2UgZWNobyAiMCI7IGZpJykKK2VuZGlmCisKKyMgRm9ybSB0YXJnZXQgZGlyZWN0b3J5IG5hbWUgZm9yIE1JQyBwbGF0Zm9ybXMKK2lmZXEgIiQoTUlDX0FSQ0gpIiAia25jIgorICAgIG1pYy1wb3N0ZjEgID0gLmtuYworZW5kaWYKK2lmZXEgIiQoTUlDX09TKSIgImxpbiIKKyAgICBtaWMtcG9zdGZpeCA9ICQobWljLXBvc3RmMSkubGluCitlbHNlCisgICAgbWljLXBvc3RmaXggPSAkKG1pYy1wb3N0ZjEpCitlbmRpZgorCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRGV2IHRvb2xzIGFuZCBnZW5lcmFsIG9wdGlvbnMgKGxpa2UgLWZwaWMsIC1PMiBvciAtZykuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbmNsdWRlICQodG9vbHNfZGlyKXNyYy9jb21tb24tdG9vbHMubWsKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBQcm9qZWN0LXNwZWNpZmljIHRvb2xzIG9wdGlvbnMuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgLS0tIEFzc2VtYmxlciBvcHRpb25zIC0tLQorCitpZmVxICIkKG9zKSIgIndpbiIKKyAgICBpZmVxICIkKGFyY2gpIiAiMzIiCisgICAgICAgIGFzLWZsYWdzICs9IC1jb2ZmCisgICAgICAgIGFzLWZsYWdzICs9IC1EX01fSUEzMgorICAgIGVuZGlmCisgICAgaWZlcSAiJChhcmNoKSIgIjMyZSIKKyAgICAgICAgYXMtZmxhZ3MgICs9IC1EX01fQU1ENjQKKyAgICBlbmRpZgorICAgIGlmZXEgIiQoYXJjaCkiICI2NCIKKyAgICBlbmRpZgorZW5kaWYKKworIyAtLS0gQy9DKysgb3B0aW9ucyAtLS0KKworIyBFbmFibGUgX1F1YWQgdHlwZS4KK2lmbmVxICIkKGZpbHRlciBpY2MgaWNsIGljbC5leGUsJChjKSkiICIiCisgICAgYy1mbGFncyAgICs9IC1Rb3B0aW9uLGNwcCwtLWV4dGVuZGVkX2Zsb2F0X3R5cGVzCisgICAgY3h4LWZsYWdzICs9IC1Rb3B0aW9uLGNwcCwtLWV4dGVuZGVkX2Zsb2F0X3R5cGVzCitlbmRpZgorCitpZmVxICIkKGMpIiAiZ2NjIgorICAgIGlmZXEgIiQoYXJjaCkiICIzMiIKKyAgICAgICAgYy1mbGFncyArPSAtbTMyIC1tc3NlCisgICAgICAgIGN4eC1mbGFncyArPSAtbTMyIC1tc3NlCisgICAgICAgIGZvcnQtZmxhZ3MgKz0gLW0zMiAtbXNzZQorICAgICAgICBsZC1mbGFncyArPSAtbTMyIC1tc3NlCisgICAgICAgIGFzLWZsYWdzICs9IC1tMzIgLW1zc2UKKyAgICBlbmRpZgorZW5kaWYKKworaWZlcSAiJChjKSIgImNsYW5nIgorICAgIGMtZmxhZ3MgKz0gLVduby11bnVzZWQtdmFsdWUgLVduby1zd2l0Y2ggLVduby1kZXByZWNhdGVkLXJlZ2lzdGVyCisgICAgY3h4LWZsYWdzICs9IC1Xbm8tdW51c2VkLXZhbHVlIC1Xbm8tc3dpdGNoIC1Xbm8tZGVwcmVjYXRlZC1yZWdpc3RlcgorICAgIGlmZXEgIiQoYXJjaCkiICIzMiIKKyAgICAgICAgYy1mbGFncyArPSAtbTMyIC1tc3NlCisgICAgICAgIGN4eC1mbGFncyArPSAtbTMyIC1tc3NlCisgICAgICAgIGZvcnQtZmxhZ3MgKz0gLW0zMiAtbXNzZQorICAgICAgICBsZC1mbGFncyArPSAtbTMyIC1tc3NlCisgICAgICAgIGFzLWZsYWdzICs9IC1tMzIgLW1zc2UKKyAgICBlbmRpZgorICAgIEhBVkVfUVVBRCA9IDAKK2VuZGlmCisKK2lmZXEgIiQoTElOS19UWVBFKSIgImR5bmEiCisjIGRlYnVnLWluZm8KKyAgICBpZmVxICIkKG9zKSIgIndpbiIKKyAgICAgICAgYy1mbGFncyAgICArPSAtWmkKKyAgICAgICAgY3h4LWZsYWdzICArPSAtWmkKKyAgICAgICAgZm9ydC1mbGFncyArPSAtWmkKKyAgICBlbHNlCisgICAgICBpZm5lcSAiJChvcykiICJtYWMiCisgICAgICAgIGMtZmxhZ3MgICAgKz0gLWcKKyAgICAgICAgY3h4LWZsYWdzICArPSAtZworICAgICAgICBmb3J0LWZsYWdzICs9IC1nCisgICAgICAgIGxkLWZsYWdzICAgKz0gLWcKKyAgICAgIGVuZGlmCisgICAgZW5kaWYKK2VuZGlmCisKKyMgRW5hYmxlIDgwLWJpdCAibG9uZyBkb3VibGUiLgorIyA/Pz8gSW4gb3JpZ2luYWwgbWFrZWZpbGUsIGl0IHdhcyBlbmFibGVkIGZvciBhbGwgZmlsZXMgb24gd2luXzMyIGFuZCB3aW5fNjQsIGFuZCBvbmx5IGZvciBvbmUKKyMgZmlsZSBrbXBfYXRvbWljLmMgb24gd2luXzMyZS4KK2lmZXEgIiQob3MpIiAid2luIgorICAgIGMtZmxhZ3MgICArPSAtUWxvbmdfZG91YmxlCisgICAgY3h4LWZsYWdzICs9IC1RbG9uZ19kb3VibGUKK2VuZGlmCisKKyMgRW5hYmxlIHNhdmluZyBjb21waWxlciBvcHRpb25zIGFuZCB2ZXJzaW9uIGluIG9iamVjdCBmaWxlcyBhbmQgbGlicmFyaWVzLgoraWZlcSAiJChmaWx0ZXIgZ2NjIGNsYW5nLCQoYykpIiAiIgorICAgIGlmZXEgIiQob3MpIiAid2luIgorICAgICAgICAjIE5ld2VyIE1TIGxpbmtlciBpc3N1ZXMgd2FybmluZ3MgaWYgLVFzb3ggaXMgdXNlZDoKKyAgICAgICAgIyAid2FybmluZyBMTks0MjI0OiAvQ09NTUVOVCBpcyBubyBsb25nZXIgc3VwcG9ydGVkOyAgaWdub3JlZCIKKyAgICAgICAgIyBzbyBsZXQgdXMgY29tbWVudCBpdCBvdXQgKGFuZCBkZWxldGUgbGF0ZXIpLgorICAgICAgICAjIGlmbmVxICIkKGFyY2gpIiAiMzJlIgorICAgICAgICAjICAgICBjLWZsYWdzICAgKz0gLVFzb3gKKyAgICAgICAgIyAgICAgY3h4LWZsYWdzICs9IC1Rc294CisgICAgICAgICMgZW5kaWYKKyAgICAgICAgZm9ydC1mbGFncyArPSAtUXNveAorICAgIGVsc2UKKyAgICAgICAgIyBGb3IgdW5rbm93biByZWFzb24sIGljYyBhbmQgaWZvcnQgb24gbWFjIGRvZXMgbm90IGFjY2VwdCB0aGlzIG9wdGlvbi4KKyAgICAgICAgaWZuZXEgIiQoZmlsdGVyIGxpbiBscmIsJChvcykpIiAiIgorICAgICAgICAgICAgYy1mbGFncyAgICArPSAtc294CisgICAgICAgICAgICBjeHgtZmxhZ3MgICs9IC1zb3gKKyAgICAgICAgICAgIGZvcnQtZmxhZ3MgKz0gLXNveAorICAgICAgICBlbmRpZgorICAgIGVuZGlmCitlbmRpZgorCisjIE9uIExpbnV4IGFuZCBXaW5kb3dzIEludGVsNjQgd2UgbmVlZCBvZmZsb2FkIGF0dHJpYnV0ZSBmb3IgYWxsIEZvcnRyYW4gZW50cmllcworIyBpbiBvcmRlciB0byBzdXBwb3J0IE9wZW5NUCBmdW5jdGlvbiBjYWxscyBpbnNpZGUgRGV2aWNlIGNvbnN0cnVjdHMKK2lmZXEgIiQoZm9ydCkiICJpZm9ydCIKKyAgICBpZmVxICIkKG9zKV8kKGFyY2gpIiAibGluXzMyZSIKKyAgICAgICAgIyBUT0RPOiBjaGFuZ2UgdG8gLXFvZmZsb2FkLi4uIHdoZW4gd2Ugc3RvcCBzdXBwb3J0aW5nIDE0LjAgY29tcGlsZXIgKC1vZmZsb2FkIGlzIGRlcHJlY2F0ZWQpCisgICAgICAgIGZvcnQtZmxhZ3MgKz0gLW9mZmxvYWQtYXR0cmlidXRlLXRhcmdldD1taWMKKyAgICBlbmRpZgorICAgIGlmZXEgIiQob3MpXyQoYXJjaCkiICJ3aW5fMzJlIgorICAgICAgICBmb3J0LWZsYWdzICs9IC9Rb2ZmbG9hZC1hdHRyaWJ1dGUtdGFyZ2V0Om1pYworICAgIGVuZGlmCitlbmRpZgorCitpZmVxICIkKG9zKSIgImxyYiIKKyAgICBjLWZsYWdzICAgICs9IC1tbWljCisgICAgY3h4LWZsYWdzICArPSAtbW1pYworICAgIGZvcnQtZmxhZ3MgKz0gLW1taWMKKyAgICBsZC1mbGFncyAgICs9IC1tbWljCisgICAgYXMtZmxhZ3MgICArPSAtbW1pYworICAgIGNwcC1mbGFncyAgKz0gLW1taWMKK2VuZGlmCisKKyMgRXhjZXB0aW9uIGhhbmRsaW5nLgoraWZlcSAiJChvcykiICJ3aW4iCisgICAgIyA/Pz8gRW5hYmxlIGV4Y2VwdGlvbiBoYW5kbGluZz8KKyAgICBpZmVxICIkKExJTktfVFlQRSkiICJkeW5hIgorICAgICAgICBjLWZsYWdzICAgKz0gLUVIc2MKKyAgICAgICAgY3h4LWZsYWdzICs9IC1FSHNjCisgICAgZW5kaWYKK2Vsc2UKKyAgICAjIERpc2FibGUgZXhjZXB0aW9uIGhhbmRsaW5nLgorICAgIGMtZmxhZ3MgICArPSAtZm5vLWV4Y2VwdGlvbnMKKyAgICBjeHgtZmxhZ3MgKz0gLWZuby1leGNlcHRpb25zCitlbmRpZgorCisjIERpc2FibGUgdXNlIG9mIEVCUCBhcyBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXIuCitpZmVxICIkKG9zKSIgIndpbiIKKyAgICBpZmVxICIkKGFyY2gpIiAiMzIiCisgICAgICAgIGMtZmxhZ3MgICArPSAtT3ktCisgICAgICAgIGN4eC1mbGFncyArPSAtT3ktCisgICAgZW5kaWYKK2VuZGlmCisKK2lmZXEgIiQob3MpIiAibGluIgorICAgIGMtZmxhZ3MgICArPSAtV3NpZ24tY29tcGFyZQorICAgIGN4eC1mbGFncyArPSAtV3NpZ24tY29tcGFyZQorICAgIGxkLWZsYWdzICArPSAtV3NpZ24tY29tcGFyZQorICAgIGlmZXEgIiQoZmlsdGVyIGdjYyBjbGFuZywkKGMpKSIgIiIKKyAgICAgICAgYy1mbGFncyAgICs9IC1XZXJyb3IKKyAgICAgICAgY3h4LWZsYWdzICs9IC1XZXJyb3IKKyAgICAgICAgbGQtZmxhZ3MgICs9IC1XZXJyb3IKKyAgICBlbmRpZgorZW5kaWYKK2lmZXEgIiQob3MpIiAid2luIgorICAgIGMtZmxhZ3MgICArPSAtV1gKKyAgICBjeHgtZmxhZ3MgKz0gLVdYCisgICAgbGQtZmxhZ3MgICs9IC1XWDpOTworZW5kaWYKKworaWZlcSAiJChvcykiICJscmIiCisgICAgIyBXaXRoICItZnRscy1tb2RlbD1pbml0aWFsLWV4ZWMiIHRoZSBjb21waWxlciBnZW5lcmF0ZXMgZmFzdGVyIGNvZGUgZm9yIHN0YXRpYyBUTFMKKyAgICAjIGFjY2Vzc2VzLCBpdCBnZW5lcmF0ZXMgc2xvd2VyIGNhbGxzIHRvIGdsaWJjIG90aGVyd2lzZS4gV2UgZG9uJ3QgdXNlIHRoaXMKKyAgICAjIGZlYXR1cmUgb24gTGludXggYmVjYXVzZSBpdCBwcmV2ZW50cyBkeW5hbWljIGxvYWRpbmcgKHVzZSBvZiBkbG9wZW4pIG9mIHRoZSBsaWJyYXJ5LgorICAgICMgUmVsaWFibGUgZHluYW1pYyBsb2FkaW5nIGlzIG1vcmUgaW1wb3J0YW50IHRoYW4gc2xpZ2h0bHkgZmFzdGVyIGFjY2VzcyB0byBUTFMuCisgICAgIyBPbiBJbnRlbChSKSBYZW9uIFBoaShUTSkgY29wcm9jZXNzb3Igd2UgaGF2ZW4ndCBlbmNvdW50ZXJlZCBkeW5hbWljIGxvYWRpbmcgcHJvYmxlbSB5ZXQsIHNvIHVzZSBmYXN0ZXIKKyAgICAjIGFjY2VzcyB0byBzdGF0aWMgVExTLgorICAgIGMtZmxhZ3MgICArPSAtZnRscy1tb2RlbD1pbml0aWFsLWV4ZWMKKyAgICBjeHgtZmxhZ3MgKz0gLWZ0bHMtbW9kZWw9aW5pdGlhbC1leGVjCisgICAgIyBkaXNhYmxlIHN0cmVhbWluZyBzdG9yZXMgaW4gb3JkZXIgdG8gd29yayBvbiBBMCBTaQorICAgIGMtZmxhZ3MgICArPSAtb3B0LXN0cmVhbWluZy1zdG9yZXMgbmV2ZXIKKyAgICBjeHgtZmxhZ3MgKz0gLW9wdC1zdHJlYW1pbmctc3RvcmVzIG5ldmVyCitlbmRpZgorCisjIFNlbGVjdCBDIHJ1bnRpbWUuCitpZmVxICIkKG9zKSIgIndpbiIKKyAgICAjIFJlZ2FyZGxlc3Mgb2YgZm9sbG93aW5nIC1abCBvcHRpb24sIHdlIHNob3VsZCBzcGVjaWZ5IC1NVCBvciAtTVRkLCBvdGhlcndpc2UgdGVzdC10b3VjaAorICAgICMgd2lsIGZhaWxzIGR1ZSB0byB1bnJlc29sdmVkIHJlZmVyZW5jZSAiX2Vycm5vIi4KKyAgICBpZmVxICIkKE9QVElNSVpBVElPTikiICJvbiIKKyAgICAgICAgYy1mbGFncyAgICs9IC1NVAorICAgICAgICBjeHgtZmxhZ3MgKz0gLU1UCisgICAgZWxzZQorICAgICAgICBjLWZsYWdzICAgKz0gLU1UZAorICAgICAgICBjeHgtZmxhZ3MgKz0gLU1UZAorICAgIGVuZGlmCisgICAgaWZlcSAiJChMSU5LX1RZUEUpIiAic3RhdCIKKyAgICAgICAgIyBEbyBub3QgZW1pdCBDIHJ1bnRpbWUgbGlicmFyeSB0byBvYmplY3QgZmlsZS4gSXQgd2lsbCBhbGxvd3MgbGluayBPcGVuTVAgUlRMIHdpdGggZWl0aGVyIHN0YXRpYworICAgICAgICAjIG9yIGR5bmFtaWMgQyBydW50aW1lLiBXaW5kb3dzKiBPUyBzcGVjaWZpYywgYXBwbGljYWJsZSBvbmx5IHRvIHN0YXRpYyBSVEwuCisgICAgICAgIGMtZmxhZ3MgICArPSAtWmwKKyAgICAgICAgY3h4LWZsYWdzICs9IC1abAorICAgIGVuZGlmCitlbmRpZgorCitpZmVxICIkKG9zKSIgIndpbiIKKyAgICBjLWZsYWdzICAgKz0gLVczCisgICAgY3h4LWZsYWdzICs9IC1XMworICAgICMgRGlzYWJsZSB3YXJuaW5nOiAiLi4uIGRlY2xhcmVkIGJ1dCBuZXZlciByZWZlcmVuY2VkIgorICAgICMgRGlzYWJsZSByZW1hcmsgIzUwODI6IERpcmVjdGl2ZSBpZ25vcmVkIC0gU3ludGF4IGVycm9yLCBmb3VuZCBJREVOVElGSUVSICdMUkInLi4uCisgICAgZm9ydC1mbGFncyAgICs9IC1RZGlhZy1kaXNhYmxlOjE3Nyw1MDgyCisgICAgYy1mbGFncyAgICAgICs9IC1RZGlhZy1kaXNhYmxlOjE3NworICAgIGN4eC1mbGFncyAgICArPSAtUWRpYWctZGlzYWJsZToxNzcKK2VuZGlmCisKK2lmZXEgIiQoQ1BMVVNQTFVTKSIgIm9uIgorICAgIGlmZXEgIiQob3MpIiAid2luIgorICAgICAgICBjLWZsYWdzICAgKz0gLVRQCisgICAgZWxzZSBpZmVxICIkKGFyY2gpIiAicHBjNjQiCisgICAgIyBjKysxMSBvbiBwcGM2NCBsaW51eCByZW1vdmVzIGRlZmluaXRpb24gb2YgcHJlcHJvYy4gbWFjcm9zLCBuZWVkZWQgaW4gLmhzCisgICAgICBjLWZsYWdzICAgKz0gLXggYysrIC1zdGQ9Z251KysxMQorICAgIGVsc2UKKyAgICAgICAgaWZuZXEgIiQoZmlsdGVyIGdjYyBjbGFuZywkKGMpKSIgIiIKKyAgICAgICAgICAgIGMtZmxhZ3MgICArPSAteCBjKysgLXN0ZD1jKysxMQorICAgICAgICBlbHNlCisgICAgICAgICAgICBjLWZsYWdzICAgKz0gLUtjKysKKyAgICAgICAgZW5kaWYKKyAgICBlbmRpZgorZW5kaWYKKworIyAtLS0gTGlua2VyIG9wdGlvbnMgLS0tCisKK2lmZXEgIiQob3MpIiAibGluIgorICAgIGlmbmVxICIkKExJQl9UWVBFKSIgInN0dWIiCisgICAgICAgIGlmZXEgIiQobGQpIiAibGQiCisgICAgICAgICAgICAjIFdhcm4gYWJvdXQgbm9uLVBJQyBjb2RlIHByZXNlbmNlCisgICAgICAgICAgICBsZC1mbGFncyArPSAtLXdhcm4tc2hhcmVkLXRleHRyZWwKKyAgICAgICAgICAgIGxkLWZsYWdzICs9IC1maW5pPV9fa21wX2ludGVybmFsX2VuZF9maW5pCisgICAgICAgICAgICBsZC1mbGFncyArPSAtbHB0aHJlYWQKKyAgICAgICAgZWxzZSAjICQoYykgb3IgJChjeHgpCisgICAgICAgICAgICBsZC1mbGFncyArPSAtV2wsLS13YXJuLXNoYXJlZC10ZXh0cmVsCisgICAgICAgICAgICBsZC1mbGFncyArPSAtV2wsLWZpbmk9X19rbXBfaW50ZXJuYWxfZW5kX2ZpbmkKKyAgICAgICAgICAgIGxkLWZsYWdzICs9IC1wdGhyZWFkCisgICAgICAgIGVuZGlmCisgICAgZW5kaWYKKyAgICBpZmVxICIkKGxkKSIgIiQoYykiCisgICAgICAgIGxkLWZsYWdzICs9IC1mUElDCisgICAgICAgIGlmZXEgIiQoREVCVUdfSU5GTykiICJvbiIKKyAgICAgICAgICAgIGxkLWZsYWdzICs9IC1nCisgICAgICAgIGVuZGlmCisgICAgICAgIGlmZXEgIiQoT1BUSU1JWkFUSU9OKSIgIm9mZiIKKyAgICAgICAgICAgIGxkLWZsYWdzICs9IC1PMAorICAgICAgICBlbmRpZgorICAgICAgICBsZC1mbGFncyArPSAtV2wsLS12ZXJzaW9uLXNjcmlwdD0kKHNyY19kaXIpZXhwb3J0c19zby50eHQKKyAgICBlbHNlCisgICAgICAgIGxkLWZsYWdzICs9IC0tdmVyc2lvbi1zY3JpcHQ9JChzcmNfZGlyKWV4cG9ydHNfc28udHh0CisgICAgZW5kaWYKKyAgICBpZmVxICIkKGxkKSIgIiQoYykiCisgICAgICAgICMgdG8gcmVtb3ZlIGRlcGVuZGVuY3kgb24gbGliaW1mLCBsaWJzdm1sLCBsaWJpbnRsYzoKKyAgICAgICAgaWZlcSAiJChjKSIgImljYyIKKyAgICAgICAgICAgIGxkLWZsYWdzLWRsbCArPSAtc3RhdGljLWludGVsCisgICAgICAgIGVuZGlmCisgICAgICAgIGxkLWZsYWdzLWRsbCArPSAtV2wsLS1hcy1uZWVkZWQKKyAgICAgICAgIyB0byByZW1vdmUgZGVwZW5kZW5jeSBvbiBsaWJnY2NfczoKKyAgICAgICAgaWZlcSAiJChjKSIgImdjYyIKKyAgICAgICAgICAgIGxkLWZsYWdzLWRsbCArPSAtc3RhdGljLWxpYmdjYworICAgICAgICAgICAgIyBvbXBfb3MgaXMgbm9uLWVtcHR5IG9ubHkgaW4gdGhlIG9wZW4tc291cmNlIGNvZGUKKyAgICAgICAgICAgIGlmbmVxICIkKG9tcF9vcykiICJmcmVlYnNkIgorICAgICAgICAgICAgICAgIGxkLWZsYWdzLWV4dHJhICs9IC1XbCwtbGRsCisgICAgICAgICAgICBlbmRpZgorICAgICAgICBlbmRpZgorICAgICAgICBpZmVxICIkKGMpIiAiY2xhbmciCisgICAgICAgICAgICBpZm5lcSAiJChvbXBfb3MpIiAiZnJlZWJzZCIKKyAgICAgICAgICAgICAgICBsZC1mbGFncy1leHRyYSArPSAtV2wsLWxkbAorICAgICAgICAgICAgZW5kaWYKKyAgICAgICAgZW5kaWYKKyAgICAgICAgaWZlcSAiJChhcmNoKSIgIjMyIgorICAgICAgICAgICAgaWZlcSAiJChmaWx0ZXIgZ2NjIGNsYW5nLCQoYykpIiAiIgorICAgICAgICAgICAgIyB0byB3b3JrYXJvdW5kIENRMjE1MjI5IGxpbmsgbGliaXJjX3BpYyBtYW51YWxseQorICAgICAgICAgICAgbGQtZmxhZ3MtZXh0cmEgKz0gLWxpcmNfcGljCisgICAgICAgICAgICBlbmRpZgorICAgICAgICBlbmRpZgorICAgICAgICBpZmVxICIkKGZpbHRlciAzMiAzMmUgNjQgcHBjNjQsJChhcmNoKSkiICIiCisgICAgICAgICAgICBsZC1mbGFncy1leHRyYSArPSAkKHNoZWxsIHBrZy1jb25maWcgLS1saWJzIGxpYmZmaSkKKyAgICAgICAgZW5kaWYKKyAgICBlbHNlCisgICAgICAgIGlmZXEgIiQoYXJjaCkiICIzMmUiCisgICAgICAgICAgICAjID8/PworICAgICAgICAgICAgbGQtZmxhZ3MgKz0gLUJzdGF0aWMgLUwvdXNyL2xpYjY0IC1sY19ub25zaGFyZWQgLUJkeW5hbWljCisgICAgICAgIGVuZGlmCisgICAgZW5kaWYKK2VuZGlmCisKK2lmZXEgIiQob3MpIiAibHJiIgorICBpZmVxICIkKGxkKSIgImxkIgorICAgIGlmbmVxICIkKExJQl9UWVBFKSIgInN0dWIiCisgICAgICAgIGxkLWZsYWdzICs9IC1sdGhyCisgICAgICAgIGxkLWZsYWdzICs9IC1maW5pPV9fa21wX2ludGVybmFsX2VuZF9hdGV4aXQKKyAgICAgICAgIyBXYXJuIGFib3V0IG5vbi1QSUMgY29kZSBwcmVzZW5jZQorICAgICAgICBsZC1mbGFncyArPSAtLXdhcm4tc2hhcmVkLXRleHRyZWwKKyAgICBlbmRpZgorICAgIGxkLWZsYWdzICs9IC0tdmVyc2lvbi1zY3JpcHQ9JChzcmNfZGlyKWV4cG9ydHNfc28udHh0CisgIGVuZGlmCisgIGlmZXEgIiQobGQpIiAiJChjKSIKKyAgICBsZC1mbGFncyArPSAtV2wsLS13YXJuLXNoYXJlZC10ZXh0cmVsCisgICAgbGQtZmxhZ3MgKz0gLVdsLC0tdmVyc2lvbi1zY3JpcHQ9JChzcmNfZGlyKWV4cG9ydHNfc28udHh0CisgICAgbGQtZmxhZ3MgKz0gLXN0YXRpYy1pbnRlbAorICAgICMgRG9uJ3QgbGluayBsaWJjaWxrKi4KKyAgICBsZC1mbGFncyArPSAtbm8taW50ZWwtZXh0ZW5zaW9ucworICAgICMgRGlzY2FyZCB1bm5lZWRlZCBkZXBlbmRlbmNpZXMuCisgICAgbGQtZmxhZ3MgKz0gLVdsLC0tYXMtbmVlZGVkCisjICAgIGxkLWZsYWdzICs9IC1ub2RlZmF1bHRsaWJzCisgICAgIyBUbyBjaGVjayB3aGljaCBsaWJyYXJpZXMgdGhlIGNvbXBpbGVyIGxpbmtzIGNvbW1lbnQgYWJvdmUgbGluZSBhbmQgdW5jb21tZW50IGJlbG93IGxpbmUKKyMgICAgbGQtZmxhZ3MgKz0gLVwjCisgICAgIyBsaW5rIGxpYnJhcmllcyBpbiB0aGUgb3JkZXIgdGhlIGljYyBjb21waWxlciB1c2VzIChvYnRhaW5lZCB1c2luZyAiaWNjIC1zaGFyZWQgLSMiIGNvbW1hbmQgbGluZSkKKyAgICAjIENvbXBpbGVyIDIwMTAxMDE3IHVzZXMgIi1saW50bGMgLWx0aHIgLWxjIC1saW50bGMgLWxpcmNfcyIgc2VxdWVuY2UsIHdlIGZvbGxvdyBpdDoKKyMgICAgbGQtZmxhZ3MgKz0gLWxpbnRsYworICAgIGlmbmVxICIkKExJQl9UWVBFKSIgInN0dWIiCisgICAgICAgIGxkLWZsYWdzICs9IC1wdGhyZWFkCisgICAgICAgIGlmZXEgIiQoTUlDX09TKSIgImxpbiIKKyAgICAgICAgICAgIGxkLWZsYWdzICs9IC1sZGwKKyAgICAgICAgZW5kaWYKKyAgICBlbmRpZgorICAgICMgaW5jbHVkZSB0aGUgYysrIGxpYnJhcnkgZm9yIHN0YXRzLWdhdGhlcmluZyBjb2RlCisgICAgaWZlcSAiJChzdGF0cykiICJvbiIKKyAgICAgICAgbGQtZmxhZ3MtZXh0cmEgKz0gLVdsLC1sc3RkYysrCisgICAgZW5kaWYKKyAgZW5kaWYKK2VuZGlmCisKK2lmZXEgIiQob3MpIiAibWFjIgorICAgIGlmZXEgIiQobGQpIiAiaWNjIgorICAgICAgICBsZC1mbGFncyArPSAtbm8taW50ZWwtZXh0ZW5zaW9ucworICAgIGVuZGlmCisgICAgbGQtZmxhZ3MgKz0gLXNpbmdsZV9tb2R1bGUKKyAgICBsZC1mbGFncyArPSAtY3VycmVudF92ZXJzaW9uICQoVkVSU0lPTikuMCAtY29tcGF0aWJpbGl0eV92ZXJzaW9uICQoVkVSU0lPTikuMAorZW5kaWYKKworaWZlcSAiJChvcykiICJ3aW4iCisgICAgbGQtZmxhZ3MgKz0gLWluY3JlbWVudGFsOm5vCisgICAgbGQtZmxhZ3MgKz0gLXZlcnNpb246JChWRVJTSU9OKS4wCitlbmRpZgorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFByb2plY3Qtc3BlY2lmaWMgcHJlcHJvY2Vzc29yIGRlZmluaXRpb25zLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjcHAtZmxhZ3MgKz0gLUQgS01QX0FSQ0hfU1RSPSJcIiQoY2FsbCBsZWdhbF9hcmNoLCQoYXJjaCkpXCIiCisKK2lmZXEgIiQob3MpIiAid2luIgorICAgIGNwcC1mbGFncyArPSAtRCBfV0lORE9XUyAtRCBfV0lOTlQgLUQgX1dJTjMyX1dJTk5UPTB4MDUwMQorICAgICMgMHgwNTAxIG1lYW5zIFdpbmRvd3MqIFhQKiBPUyBvciBXaW5kb3dzKiBTZXJ2ZXIgMjAwMyogT1Mgb3IgbGF0ZXIuCisgICAgIyBXZSBuZWVkIHRoaXMgZm9yIEdldE1vZHVsZUhhbmxlRXggZnVuY3Rpb24uCisgICAgaWZlcSAiJChMSU5LX1RZUEUpIiAiZHluYSIKKyAgICAgICAgY3BwLWZsYWdzICs9IC1EIF9VU1JETEwKKyAgICBlbmRpZgorZWxzZSAjIGxpbiwgbHJiIG9yIG1hYworICAgIGNwcC1mbGFncyArPSAtRCBfR05VX1NPVVJDRQorICAgIGNwcC1mbGFncyArPSAtRCBfUkVFTlRSQU5UCitlbmRpZgorCisjIFRPRE86IERJQUcgbGVhZHMgdG8gREVCVUcuIENvbmZ1c2luZyBhIGJpdC4gUmFuYW1lIEtNUF9ERUJVRyB0byBLTVBfRElBRz8KK2lmZXEgIiQoRElBRykiICJvbiIKKyAgICBjcHAtZmxhZ3MgKz0gLUQgS01QX0RFQlVHCitlbmRpZgoraWZlcSAiJChDT1ZFUkFHRSkiICJvbiIKKyAgICBjcHAtZmxhZ3MgKz0gLUQgQ09WRVIKK2VuZGlmCisjIEFzc2VydGlvbnMgaW4gT01QIFJUTCBjb2RlIGFyZSBjb250cm9sbGVkIGJ5IHR3byBtYWNyb3M6IEtNUF9ERUJVRyBlbmFibGVzIG9yIGRpc2FibGVzIGFzc2VydGlvbnMKKyMgaWZmIEtNUF9VU0VfQVNTRVJUIGlzIGRlZmluZWQuIElmIEtNUF9VU0VfQVNTRVJUIGlzIG5vdCBkZWZpbmVkLCBhc3NlcnRpb25zIGRpc2FibGVkIHJlZ2FyZGxlc3Mgb2YKKyMgS01QX0RFQlVHLiBJdCB3YXMgaW1wbGVtZW50ZWQgZm9yIGNvZGUgY292ZXJhZ2UgLS0gdG8gaGF2ZSBkZWJ1ZyBidWlsZCB3aXRoIG5vIGFzc2VydGlvbiwgYnV0IGl0CisjIGRvZXMgbm90IGhhdmUgbXVjaCBlZmZlY3QuIFRPRE86IFJlbW92ZSBtYWNyby4KK2lmZXEgIiQoQ09WRVJBR0UpIiAib2ZmIgorICAgIGNwcC1mbGFncyArPSAtRCBLTVBfVVNFX0FTU0VSVAorZW5kaWYKKworY3BwLWZsYWdzICs9IC1EIEJVSUxEX0k4CitpZm5lcSAiJChvcykiICJ3aW4iCisgICAgY3BwLWZsYWdzICs9IC1EIEJVSUxEX1RWCitlbmRpZgorY3BwLWZsYWdzICs9IC1EIEtNUF9MSUJSQVJZX0ZJTEU9XCIkKGxpYl9maWxlKVwiCitjcHAtZmxhZ3MgKz0gLUQgS01QX1ZFUlNJT05fTUFKT1I9JChWRVJTSU9OKQorCisjIGN1c3RvbWl6ZSBwcGM2NCBjYWNoZSBsaW5lIHNpemUgdG8gMTI4LCA2NCBvdGhlcndpc2UKK2lmZXEgIiQoYXJjaCkiICJwcGM2NCIKKwljcHAtZmxhZ3MgKz0gLUQgQ0FDSEVfTElORT0xMjgKK2Vsc2UgCisJY3BwLWZsYWdzICs9IC1EIENBQ0hFX0xJTkU9NjQKK2VuZGlmCisKKyMgY3VzdG9taXplIGFhcmNoNjQgY2FjaGUgbGluZSBzaXplIHRvIDEyOCwgNjQgb3RoZXJ3aXNlIG1hZ2ljIHdvbid0IGhhcHBlbgorIyBKdXN0IGtpZGRpbmcuLiBjYW4gd2UgaGF2ZSBzb21lIGRvY3VtZW50YXRpb24gb24gdGhpcywgcGxlYXNlCitpZmVxICIkKGFyY2gpIiAiYWFyY2g2NCIKKwljcHAtZmxhZ3MgKz0gLUQgQ0FDSEVfTElORT0xMjgKK2Vsc2UgCisJY3BwLWZsYWdzICs9IC1EIENBQ0hFX0xJTkU9NjQKK2VuZGlmCisKK2NwcC1mbGFncyArPSAtRCBLTVBfQURKVVNUX0JMT0NLVElNRT0xCitjcHAtZmxhZ3MgKz0gLUQgQlVJTERfUEFSQUxMRUxfT1JERVJFRAorY3BwLWZsYWdzICs9IC1EIEtNUF9BU01fSU5UUklOUworY3BwLWZsYWdzICs9IC1EIEtNUF9VU0VfSU5URVJOT0RFX0FMSUdOTUVOVD0wCisjIExpbnV4IGFuZCBNSUMgY29tcGlsZSB3aXRoIHZlcnNpb24gc3ltYm9scworaWZuZXEgIiQoZmlsdGVyIGxpbiBscmIsJChvcykpIiAiIgoraWZlcSAiJChmaWx0ZXIgcHBjNjQsJChhcmNoKSkiICIiCisgICAgY3BwLWZsYWdzICs9IC1EIEtNUF9VU0VfVkVSU0lPTl9TWU1CT0xTCitlbmRpZgorZW5kaWYKK2lmbmVxICIkKG9zKSIgImxyYiIKKyAgICBjcHAtZmxhZ3MgKz0gLUQgVVNFX0xPQURfQkFMQU5DRQorZW5kaWYKK2lmbmVxICIkKG9zKSIgIndpbiIKKyAgICBjcHAtZmxhZ3MgKz0gLUQgVVNFX0NCTEtEQVRBCisgICAgIyA/Pz8gV2luZG93cyogT1M6IFVTRV9DQkxLREFUQSBkZWZpbmVkIGluIGttcC5oLgorZW5kaWYKK2lmZXEgIiQob3MpIiAid2luIgorICAgIGNwcC1mbGFncyArPSAtRCBLTVBfV0lOX0NERUNMCitlbmRpZgoraWZlcSAiJChMSU5LX1RZUEUpIiAiZHluYSIKKyAgICBjcHAtZmxhZ3MgKz0gLUQgR1VJREVETExfRVhQT1JUUworZW5kaWYKK2lmZXEgIiQoTElCX1RZUEUpIiAic3R1YiIKKyAgICBjcHAtZmxhZ3MgKz0gLUQgS01QX1NUVUIKK2VuZGlmCitpZmVxICIkKFZFUlNJT04pIiAiNCIKK2Vsc2UgIyA1CisgICAgaWZlcSAiJChvcykiICJ3aW4iCisgICAgZWxzZQorICAgICAgICBjcHAtZmxhZ3MgKz0gLUQgS01QX0dPTVBfQ09NUEFUCisgICAgZW5kaWYKK2VuZGlmCitjcHAtZmxhZ3MgKz0gLUQgS01QX05FU1RFRF9IT1RfVEVBTVMKK2lmbmVxICIkKGZpbHRlciAzMiAzMmUsJChhcmNoKSkiICIiCitjcHAtZmxhZ3MgKz0gLUQgS01QX1VTRV9BREFQVElWRV9MT0NLUz0xIC1EIEtNUF9ERUJVR19BREFQVElWRV9MT0NLUz0wCitlbmRpZgorCisjIGlzIHRoZSBzdGQgYysrIGxpYnJhcnkgbmVlZGVkPyAoZm9yIHN0YXRzLWdhdGhlcmluZywgaXQgaXMpCitzdGRfY3BwX2xpYj0wCitpZm5lcSAiJChmaWx0ZXIgbGluIGxyYiwkKG9zKSkiICIiCisgICAgaWZlcSAiJChzdGF0cykiICJvbiIKKyAgICAgICAgY3BwLWZsYWdzICs9IC1EIEtNUF9TVEFUU19FTkFCTEVEPTEKKyAgICAgICAgc3RkX2NwcF9saWI9MQorICAgIGVsc2UKKyAgICAgICAgY3BwLWZsYWdzICs9IC1EIEtNUF9TVEFUU19FTkFCTEVEPTAKKyAgICBlbmRpZgorZWxzZSAjIG5vIG1hYyBvciB3aW5kb3dzIHN1cHBvcnQgZm9yIHN0YXRzLWdhdGhlcmluZworICAgIGlmZXEgIiQoc3RhdHMpIiAib24iCisgICAgICAgICQoZXJyb3IgU3RhdGlzdGljcy1nYXRoZXJpbmcgZnVuY3Rpb25hbGl0eSBub3QgYXZhaWxhYmxlIG9uICQob3MpIHBsYXRmb3JtKQorICAgIGVuZGlmCisgICAgY3BwLWZsYWdzICs9IC1EIEtNUF9TVEFUU19FTkFCTEVEPTAKK2VuZGlmCisKKyMgZGVmaW5lIGNvbXBhdGliaWxpdHkgd2l0aCBkaWZmZXJlbnQgT3Blbk1QIHZlcnNpb25zCitoYXZlX29tcF81MD0wCitoYXZlX29tcF80MT0wCitoYXZlX29tcF80MD0wCitpZmVxICIkKE9NUF9WRVJTSU9OKSIgIjUwIgorCWhhdmVfb21wXzUwPTEKKwloYXZlX29tcF80MT0xCisJaGF2ZV9vbXBfNDA9MQorZW5kaWYKK2lmZXEgIiQoT01QX1ZFUlNJT04pIiAiNDEiCisJaGF2ZV9vbXBfNTA9MAorCWhhdmVfb21wXzQxPTEKKwloYXZlX29tcF80MD0xCitlbmRpZgoraWZlcSAiJChPTVBfVkVSU0lPTikiICI0MCIKKwloYXZlX29tcF81MD0wCisJaGF2ZV9vbXBfNDE9MAorCWhhdmVfb21wXzQwPTEKK2VuZGlmCitpZmVxICIkKE9NUF9WRVJTSU9OKSIgIjMwIgorCWhhdmVfb21wXzUwPTAKKwloYXZlX29tcF80MT0wCisJaGF2ZV9vbXBfNDA9MAorZW5kaWYKK2NwcC1mbGFncyArPSAtRCBPTVBfNTBfRU5BQkxFRD0kKGhhdmVfb21wXzUwKSAtRCBPTVBfNDFfRU5BQkxFRD0kKGhhdmVfb21wXzQxKSAtRCBPTVBfNDBfRU5BQkxFRD0kKGhhdmVfb21wXzQwKQorCisjIFVzaW5nIGl0dG5vdGlmeSBpcyBlbmFibGVkIGJ5IGRlZmF1bHQuCitVU0VfSVRUX05PVElGWSA9IDEKK2lmZXEgIiQob3MpLSQoYXJjaCkiICJ3aW4tNjQiCisgICAgVVNFX0lUVF9OT1RJRlkgPSAwCitlbmRpZgoraWZlcSAiJChMSU5LX1RZUEUpIiAic3RhdCIKKyAgICBVU0VfSVRUX05PVElGWSA9IDAKK2VuZGlmCitjcHAtZmxhZ3MgKz0gLUQgVVNFX0lUVF9OT1RJRlk9JChVU0VfSVRUX05PVElGWSkKK2lmZXEgIiQoVVNFX0lUVF9OT1RJRlkpIiAiMCIKKyAgICAjIERpc2FibGUgYWxsIGl0dG5vdGlmeSBjYWxscy4KKyAgICBjcHAtZmxhZ3MgKz0gLUQgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorZWxzZQorICAgIGlmZXEgIiQob3MpIiAid2luIgorICAgICAgICBpdHRub3RpZnlfc3RhdGljJChvYmopIDogY3BwLWZsYWdzICs9IC1EIFVOSUNPREUKKyAgICBlbmRpZgorZW5kaWYKKyMgU3BlY2lmeSBwcmVmaXggdG8gYmUgdXNlZCBmb3IgZXh0ZXJuYWwgc3ltYm9scy4gUHJlZml4IGlzIHJlcXVpcmVkIGV2ZW4gaWYgSVRUIE5vZml0eSB0dXJuZWQgb2ZmCisjIGJlY2F1c2Ugd2UgaGF2ZSBzb21lIGZ1bmN0aW9ucyB3aXRoIF9faXR0XyBwcmVmaXggKF9faXR0X2Vycm9yX2hhbmRsZXIpIGFuZCB3YW50IHByZWZpeCB0byBiZQorIyBjaGFuZ2VkIHRvIF9fa21wX2l0dF8uCitjcHAtZmxhZ3MgKz0gLUQgSU5URUxfSVRUTk9USUZZX1BSRUZJWD1fX2ttcF9pdHRfCisKKworIyBMaW51eCogT1M6IF9fZGVjbHNwZWModGhyZWFkKSBUTFMgaXMgc3RpbGwgYnVnZ3kgb24gc3RhdGljIGJ1aWxkcy4KKyMgV2luZG93cyogT1M6IFRoaXMgZGVmaW5lIGNhdXNlcyBwcm9ibGVtcyB3aXRoIExvYWRMaWJyYXJ5ICsgZGVjbHNwZWModGhyZWFkKSBvbiBXaW5kb3dzKiBPUy4gU2VlIENRNTA1NjQsCisjICAgICB0ZXN0cyBrbXBfbG9hZF9saWJyYXJ5X2xpYiouYywgYW5kIHRoZSBmb2xsb3dpbmcgTVNETiByZWZlcmVuY2U6CisjICAgICBodHRwOi8vc3VwcG9ydC5taWNyb3NvZnQuY29tL2tiLzExODgxNgoraWZuZXEgIiQoZmlsdGVyIGxpbiBscmIsJChvcykpIiAiIgorICAgIGlmZXEgIiQoTElOS19UWVBFKSIgImR5bmEiCisgICAgICAgIGNwcC1mbGFncyArPSAtRCBLTVBfVERBVEFfR1RJRAorICAgIGVsc2UKKyAgICAgICAgIyBBQzogYWxsb3cgX190aHJlYWQgaW4gc3RhdGljIGJ1aWxkIGZvciBJbnRlbChSKSA2NCwgbG9va3MgbGlrZSBpdCBpcworICAgICAgICAjIHdvcmtpbmcgdGhlcmUuIEl0IGlzIGJyb2tlbiBvbiBJQS0zMiBhcmNoaXRlY3R1cmUgZm9yIFJIRUw0IGFuZCBTTEVTOS4KKyAgICAgICAgaWZlcSAiJChhcmNoKSIgIjMyZSIKKyAgICAgICAgICAgIGNwcC1mbGFncyArPSAtRCBLTVBfVERBVEFfR1RJRAorICAgICAgICBlbmRpZgorICAgIGVuZGlmCitlbmRpZgorCisjIEludGVsIGNvbXBpbGVyIGhhcyBhIGJ1ZzogaW4gY2FzZSBvZiBjcm9zcy1idWlsZCBpZiB1c2VkIHdpdGgKKyMgLXggYXNzZW1ibGVyLXdpdGgtY3BwIG9wdGlvbiwgaXQgZGVmaW5lcyBtYWNyb3MgZm9yIGJvdGggYXJjaGl0ZWN0dXJlcywKKyMgaG9zdCBhbmQgdGFydGdldC4gRm9yIGV4YW1wbGUsIGlmIGNvbXBpbGVyIGZvciBJQS0zMiBhcmNoaXRlY3R1cmUKKyMgcnVucyBvbiBJbnRlbChSKSA2NCwgaXQgZGVmaW5lcyBib3RoIF9faTM4NiBhbmQgX194ODZfNjQuIChOb3RlIGl0IGlzIGEgYnVnCisjIG9ubHkgaWYgLXggYXNzZW1ibGVyLXdpdGgtY3BwIGlzIHNwZWNpZmllZCwgaW4gY2FzZSBvZiBDIGZpbGVzIGljYyBkZWZpbmVzCisjIG9ubHkgb25lLCB0YXJnZXQgYXJjaGl0ZWN0dXJlKS4gU28gd2UgY2Fubm90IGF1dG9kZXRlY3QgdGFyZ2V0IGFyY2hpdGVjdHVyZQorIyB3aXRoaW4gdGhlIGZpbGUsIGFuZCBoYXZlIHRvIHBhc3MgdGFyZ2V0IGFyY2hpdGVjdHVyZSBmcm9tIGNvbW1hbmQgbGluZS4KK2lmbmVxICIkKG9zKSIgIndpbiIKKyAgICBpZmVxICIkKGFyY2gpIiAiYXJtIgorICAgICAgICB6X0xpbnV4X2FzbSQob2JqKSA6IFwKKwkJICAgIGNwcC1mbGFncyArPSAtRCBLTVBfQVJDSF9BUk0KKyAgICBlbHNlIGlmZXEgIiQoYXJjaCkiICJwcGM2NCIgCisgICAgICAgIHpfTGludXhfYXNtJChvYmopIDogXAorCQkJY3BwLWZsYWdzICs9IC1EIEtNUF9BUkNIX1BQQzY0CQkgICAgCisgICAgZWxzZSBpZmVxICIkKGFyY2gpIiAiYWFyY2g2NCIKKyAgICAgICAgel9MaW51eF9hc20kKG9iaikgOiBcICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgY3BwLWZsYWdzICs9IC1EIEtNUF9BUkNIX0FBUkNINjQKKyAgICBlbHNlCisgICAgICAgIHpfTGludXhfYXNtJChvYmopIDogXAorCQkgICAgY3BwLWZsYWdzICs9IC1EIEtNUF9BUkNIX1g4NiQoaWYgJChmaWx0ZXIgMzJlLCQoYXJjaCkpLF82NCkKKyAgICBlbmRpZgorZW5kaWYKKworIyBEZWZpbmluZyBLTVBfQlVJTERfREFURSBmb3IgYWxsIGZpbGVzIGxlYWRzIHRvIHdhcm5pbmcgImluY29tcGF0aWJsZSByZWRlZmluaXRpb24iLCBiZWNhdXNlIHRoZQorIyBzYW1lIG1hY3JvIGlzIGFsc28gZGVmaW5lZCBpbiBvbXAuaC4gVG8gYXZvaWQgY29uZmxpY3QsIGxldCB1cyBkZWZpbmUgbWFjcm8gd2l0aCBkaWZmZXJlbnQgbmFtZSwKKyMgX0tNUF9CVUlMRF9USU1FLgora21wX3ZlcnNpb24kKG9iaikgOiBjcHAtZmxhZ3MgKz0gLUQgX0tNUF9CVUlMRF9USU1FPSJcIiQoZGF0ZSlcIiIKKworIyAtLS0gTWFjcm9zIGZvciBnZW5lcmF0ZS1kZWYucGwgLS0tCisKK2dkLWZsYWdzICs9IC1EIGFyY2hfJChhcmNoKQorZ2QtZmxhZ3MgKz0gLUQgJChMSUJfVFlQRSkKK2lmZXEgIiQoSEFWRV9RVUFEKSIgIjEiCisgICAgZ2QtZmxhZ3MgKz0gLUQgSEFWRV9RVUFECitlbmRpZgoraWZlcSAiJChPTVBfVkVSU0lPTikiICI0MCIKKyAgICBnZC1mbGFncyArPSAtRCBPTVBfNDAgLUQgT01QXzMwCitlbHNlCisgICAgaWZlcSAiJChPTVBfVkVSU0lPTikiICIzMCIKKyAgICAgICAgZ2QtZmxhZ3MgKz0gLUQgT01QXzMwCisgICAgZW5kaWYKK2VuZGlmCitpZm5lcSAiJChWRVJTSU9OKSIgIjQiCisgICAgZ2QtZmxhZ3MgKz0gLUQgbXN2Y19jb21wYXQKK2VuZGlmCitpZmVxICIkKERJQUcpIiAib24iCisgICAgZ2QtZmxhZ3MgKz0gLUQgS01QX0RFQlVHCitlbmRpZgorCisjIC0tLSBNYWNybyBmb3IgZXhwYW5kLXZhcnMucGwgLS0tCisKKyMgJFJldmlzaW9uIGFuZCAkRGF0ZSBvZnRlbiBvY2N1ciBpbiBmaWxlIGhlYWRlciwgc28gZGVmaW5lIHRoZXNlIHZhcmlhYmxlcyB0byBzYXRpc2Z5IGV4cGFuZC12YXJzLnBsLgorZXYtZmxhZ3MgKz0gLUQgUmV2aXNpb249IlwkJFJldmlzaW9uIiAtRCBEYXRlPSJcJCREYXRlIgorCisjIFZhcmlvdXMgdmFyaWFibGVzLgorZXYtZmxhZ3MgKz0gLUQgS01QX1RZUEU9IiQoY2FsbCBsZWdhbF90eXBlLCQoTElCX1RZUEUpKSIgLUQgS01QX0FSQ0g9IiQoY2FsbCBsZWdhbF9hcmNoLCQoYXJjaCkpIgorZXYtZmxhZ3MgKz0gLUQgS01QX1ZFUlNJT05fTUFKT1I9JChWRVJTSU9OKSAtRCBLTVBfVkVSU0lPTl9NSU5PUj0wIC1EIEtNUF9WRVJTSU9OX0JVSUxEPSQoYnVpbGQpCitldi1mbGFncyArPSAtRCBLTVBfQlVJTERfREFURT0iJChkYXRlKSIKK2V2LWZsYWdzICs9IC1EIEtNUF9UQVJHRVRfQ09NUElMRVI9JChUQVJHRVRfQ09NUElMRVIpCitldi1mbGFncyArPSAtRCBLTVBfRElBRz0kKGlmICQoZmlsdGVyIG9uLCQoRElBRykpLDEsMCkKK2V2LWZsYWdzICs9IC1EIEtNUF9ERUJVR19JTkZPPSQoaWYgJChmaWx0ZXIgb24sJChERUJVR19JTkZPKSksMSwwKQoraWZlcSAiJChPTVBfVkVSU0lPTikiICI0MCIKKyAgICBldi1mbGFncyArPSAtRCBPTVBfVkVSU0lPTj0yMDEzMDcKK2Vsc2UKKyAgICBpZmVxICIkKE9NUF9WRVJTSU9OKSIgIjMwIgorICAgICAgICBldi1mbGFncyArPSAtRCBPTVBfVkVSU0lPTj0yMDExMDcKKyAgICBlbHNlCisgICAgICAgIGV2LWZsYWdzICs9IC1EIE9NUF9WRVJTSU9OPTIwMDUwNQorICAgIGVuZGlmCitlbmRpZgorCisjIC0tIE9wdGlvbnMgc3BlY2lmaWVkIGluIGNvbW1hbmQgbGluZSAtLS0KKworY3BwLWZsYWdzICArPSAkKENQUEZMQUdTKQorYy1mbGFncyAgICArPSAkKENGTEFHUykKK2N4eC1mbGFncyAgKz0gJChDWFhGTEFHUykKK2ZvcnQtZmxhZ3MgKz0gJChGRkxBR1MpCitsZC1mbGFncyAgICs9ICQoTERGTEFHUykKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBGaWxlcy4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBMaWJyYXJ5IGZpbGVzLiBUaGVzZSBmaWxlcyBwYXJ0aWNpcGF0ZSBpbiBhbGwga2luZHMgb2YgbGlicmFyeS4KK2xpYl9jX2l0ZW1zIDo9ICAgICAgXAorICAgIGttcF9mdG5fY2RlY2wgICBcCisgICAga21wX2Z0bl9leHRyYSAgIFwKKyAgICBrbXBfdmVyc2lvbiAgICAgXAorICAgICQoZW1wdHkpCitsaWJfY3BwX2l0ZW1zIDo9CitsaWJfYXNtX2l0ZW1zIDo9CisKKyMgRmlsZXMgdG8gYmUgbGlua2VkIGludG8gaW1wb3J0IGxpYnJhcnkuCitpbXBfY19pdGVtcyA6PQorCitkb190ZXN0X3RvdWNoX210IDo9IDEKKworaWZlcSAiJChMSUJfVFlQRSkiICJzdHViIgorICAgIGxpYl9jX2l0ZW1zICs9IGttcF9zdHViCitlbHNlICMgbm9ybSBvciBwcm9mCisgICAgbGliX2NfaXRlbXMgKz0gICAgICAgICAgICAgICAgICAgXAorICAgICAgICBrbXBfYWxsb2MgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAga21wX2F0b21pYyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGttcF9jc3VwcG9ydCAgICAgICAgICAgICAgICAgXAorICAgICAgICBrbXBfZGVidWcgICAgICAgICAgICAgICAgICAgIFwKKwlrbXBfaXR0ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgJChlbXB0eSkKKyAgICBpZmVxICIkKFVTRV9JVFRfTk9USUZZKSIgIjEiCisgICAgICAgIGxpYl9jX2l0ZW1zICs9ICBpdHRub3RpZnlfc3RhdGljCisgICAgZW5kaWYKKworCisgICAgbGliX2NwcF9pdGVtcyArPSAgICAgICAgICAgICAgICAgXAorICAgICAgICBrbXBfZW52aXJvbm1lbnQgICAgICAgICAgICAgIFwKKyAgICAgICAga21wX2Vycm9yICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGttcF9nbG9iYWwgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBrbXBfaTE4biAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAga21wX2lvICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGttcF9ydW50aW1lICAgICAgICAgICAgICAgICAgXAorICAgICAgICBrbXBfd2FpdF9yZWxlYXNlICAgICAgICAgICAgIFwKKyAgICAgICAga21wX2JhcnJpZXIgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGttcF9zZXR0aW5ncyAgICAgICAgICAgICAgICAgXAorICAgICAgICBrbXBfc3RyICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAga21wX3Rhc2tpbmcgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGttcF90YXNrcSAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBrbXBfdGhyZWFkcHJpdmF0ZSAgICAgICAgICAgIFwKKyAgICAgICAga21wX3V0aWxpdHkgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGttcF9hZmZpbml0eSAgICAgICAgICAgICAgICAgXAorICAgICAgICBrbXBfZGlzcGF0Y2ggICAgICAgICAgICAgICAgIFwKKyAgICAgICAga21wX2xvY2sgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGttcF9zY2hlZCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAkKGVtcHR5KQorCitpZmVxICIkKE9NUF9WRVJTSU9OKSIgIjQwIgorICAgIGxpYl9jcHBfaXRlbXMgKz0ga21wX3Rhc2tkZXBzCisgICAgbGliX2NwcF9pdGVtcyArPSBrbXBfY2FuY2VsCitlbmRpZgoraWZlcSAiJChzdGF0cykiICJvbiIKKyAgICBsaWJfY3BwX2l0ZW1zICs9IGttcF9zdGF0cworICAgIGxpYl9jcHBfaXRlbXMgKz0ga21wX3N0YXRzX3RpbWluZworZW5kaWYKKworICAgICMgT1Mtc3BlY2lmaWMgZmlsZXMuCisgICAgaWZlcSAiJChvcykiICJ3aW4iCisgICAgICAgIGxpYl9jX2l0ZW1zICs9IHpfV2luZG93c19OVF91dGlsCisgICAgICAgICMgQXJjaC1zcGVjaWZpYyBmaWxlcy4KKyAgICAgICAgbGliX2NfaXRlbXMgICArPSB6X1dpbmRvd3NfTlQtNTg2X3V0aWwKKyAgICAgICAgbGliX2FzbV9pdGVtcyArPSB6X1dpbmRvd3NfTlQtNTg2X2FzbQorICAgICAgICBpZmVxICIkKExJTktfVFlQRSkiICJkeW5hIgorICAgICAgICAgICAgaW1wX2NfaXRlbXMgKz0ga21wX2ltcG9ydAorICAgICAgICAgICAgIyBmb3Igd2luXzMyL3dpbl8zMmUgZHluYW1pYyBsaWJndWlkZTQwLmRsbCwKKyAgICAgICAgICAgICMgYnVpbGQgdGhlIHNoaW0gbGliIGluc3RlYWQKKyAgICAgICAgICAgIGlmZXEgIiQoVkVSU0lPTikiICI0IgorICAgICAgICAgICAgICAgIGlmbmVxICIkKGFyY2gpIiAiNjQiCisgICAgICAgICAgICAgICAgICAgIGlmZXEgIiQoTElCX1RZUEUpIiAibm9ybSIKKyAgICAgICAgICAgICAgICAgICAgbGliX2NfaXRlbXMgICA9IGttcF9zaGltCisgICAgICAgICAgICAgICAgICAgICAgICBsaWJfY3BwX2l0ZW1zID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGxpYl9hc21faXRlbXMgPQorICAgICAgICAgICAgICAgICAgICAgICAgZ2QtZmxhZ3MgKz0gLUQgc2hpbQorICAgICAgICAgICAgICAgICAgICAgICAgIyBmb3Igc29tZSByZWFzb24sIHRlc3QtdG91Y2gtbWQgaXMgYWJsZSB0byB3b3JrIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICMgdGhlIGJ1aWxkIGNvbXBpbGVyJ3MgdmVyc2lvbiBvZiBsaWJpb21wNW1kLmRsbCwgYnV0CisgICAgICAgICAgICAgICAgICAgICAgICAjIHRlc3QtdG91Y2gtbXQgY2FuJ3QgbG9hZCBpdC4KKyAgICAgICAgICAgICAgICAgICAgICAgIGRvX3Rlc3RfdG91Y2hfbXQgOj0gMAorICAgICAgICAgICAgICAgICAgICBlbmRpZgorICAgICAgICAgICAgICAgIGVuZGlmCisgICAgICAgICAgICBlbmRpZgorICAgICAgICBlbmRpZgorICAgIGVsc2UgIyBsaW4sIGxyYiBvciBtYWMKKyAgICAgICAgbGliX2NfaXRlbXMgKz0gel9MaW51eF91dGlsCisgICAgICAgICMgR0NDIENvbXBhdGliaWxpdHkgZmlsZXMKKyAgICAgICAgaWZlcSAiJChWRVJTSU9OKSIgIjQiCisgICAgICAgIGVsc2UgIyA1CisgICAgICAgICAgICBsaWJfY19pdGVtcyArPSBrbXBfZ3N1cHBvcnQKKyAgICAgICAgZW5kaWYKKyMgICAgICAgIGlmbmVxICIkKGFyY2gpIiAicHBjNjQiCisgICAgICAgIGxpYl9hc21faXRlbXMgKz0gel9MaW51eF9hc20KKyMJICAgICBlbmRpZgorICAgIGVuZGlmCitlbmRpZgorCitsaWJfb2JqX2ZpbGVzIDo9ICQoc29ydCAkKGFkZHN1ZmZpeCAkKG9iaiksJChsaWJfY19pdGVtcykgJChsaWJfY3BwX2l0ZW1zKSAkKGxpYl9hc21faXRlbXMpKSkKK2ltcF9vYmpfZmlsZXMgOj0gJChzb3J0ICQoYWRkc3VmZml4ICQob2JqKSwkKGltcF9jX2l0ZW1zKSAkKGltcF9jcHBfaXRlbXMpICQoaW1wX2FzbV9pdGVtcykpKQorZGVwX2ZpbGVzICAgICA6PSAkKHNvcnQgJChhZGRzdWZmaXggLmQsJChsaWJfY19pdGVtcykgJChsaWJfY3BwX2l0ZW1zKSAkKGltcF9jX2l0ZW1zKSAkKGltcF9jcHBfaXRlbXMpKSkKK2lfZmlsZXMgICAgICAgOj0gJChzb3J0ICQoYWRkc3VmZml4IC5pLCQobGliX2NfaXRlbXMpICQobGliX2NwcF9pdGVtcykgJChpbXBfY19pdGVtcykgJChpbXBfY3BwX2l0ZW1zKSkpCisKKworIyAtLS0gQ29uc3RydWN0IGxpYnJhcnkgZmlsZSBuYW1lIC0tLQorCitpZmVxICIkKFZFUlNJT04pIiAiNCIKKyAgICBpZmVxICIkKExJQl9UWVBFKSIgInN0dWIiCisgICAgICAgIF9saWJfaXRlbSA9IGxpYm9tcHN0dWIKKyAgICBlbHNlICMgbm9ybSBvciBwcm9mCisgICAgICAgIF9saWJfaXRlbSA9IGxpYmd1aWRlCisgICAgZW5kaWYKKyAgICBpZmVxICIkKG9zKS0kKExJTktfVFlQRSkiICJ3aW4tZHluYSIKKyAgICAgICAgX2xpYl9pdGVtICs9IDQwCisgICAgZW5kaWYKKyAgICBpZmVxICIkKExJQl9UWVBFKSIgInByb2YiCisgICAgICAgIF9saWJfaXRlbSArPSBfc3RhdHMKKyAgICBlbmRpZgorZWxzZQorICAgIF9saWJfaXRlbSA9IGxpYmlvbXAKKyAgICBpZmVxICIkKExJQl9UWVBFKSIgInByb2YiCisgICAgICAgIF9saWJfaXRlbSArPSBwcm9mCisgICAgZW5kaWYKKyAgICBpZmVxICIkKExJQl9UWVBFKSIgInN0dWIiCisgICAgICAgIF9saWJfaXRlbSArPSBzdHVicworICAgIGVuZGlmCisgICAgX2xpYl9pdGVtICs9ICQoVkVSU0lPTikKKyAgICBpZmVxICIkKG9zKSIgIndpbiIKKyAgICAgICAgaWZlcSAiJChMSU5LX1RZUEUpIiAiZHluYSIKKyAgICAgICAgICAgIF9saWJfaXRlbSArPSBtZAorICAgICAgICBlbHNlCisgICAgICAgICAgICBfbGliX2l0ZW0gKz0gbXQKKyAgICAgICAgZW5kaWYKKyAgICBlbmRpZgorZW5kaWYKKyMgX2xpYl9pdGVtIGlzIGEgbGlzdCBvZiBzcGFjZSBzZXBhcmF0ZWQgbmFtZSBwYXJ0cy4gUmVtb3ZlIHNwYWNlcyB0byBmb3JtIGZpbmFsIG5hbWUuCitsaWJfaXRlbSA9ICQoc3Vic3QgJChzcGFjZSksLCQoX2xpYl9pdGVtKSkKK2lmZXEgIiQoTElOS19UWVBFKSIgImR5bmEiCisgICAgbGliX2V4dCA9ICQoZGxsKQorZWxzZQorICAgIGxpYl9leHQgPSAkKGxpYikKK2VuZGlmCitsaWJfZmlsZSAgPSAkKGxpYl9pdGVtKSQobGliX2V4dCkKK2lmZXEgIiQob3MpLSQoTElOS19UWVBFKSIgIndpbi1keW5hIgorICAgIGltcF9maWxlICA9ICQobGliX2l0ZW0pJChsaWIpCisgICAgZGVmX2ZpbGUgID0gJChsaWJfaXRlbSkuZGVmCisgICAgcmVzX2ZpbGUgID0gJChsaWJfaXRlbSkucmVzCisgICAgcmNfZmlsZSAgID0gJChsaWJfaXRlbSkucmMKKyAgICAjIFBEQiBmaWxlIHNob3VsZCBiZSBnZW5lcmF0ZWQgaWY6ICggREVCSUdfSU5GTyBpcyBvbiApIE9SICggd2UgYXJlIGJ1aWxkaW5nIDMyLWJpdCBub3JtYWwKKyAgICAjIGxpYnJhcnkgQU5EIHZlcnNpb24gaXMgNSApLgorICAgIGlmbmVxICIkKGZpbHRlciBvbiwkKERFQlVHX0lORk8pKSQoZmlsdGVyIG5vcm0tNSwkKExJQl9UWVBFKS0kKFZFUlNJT04pKSIgIiIKKyAgICAgICAgcGRiX2ZpbGUgPSAkKGxpYl9pdGVtKS5wZGIKKyAgICBlbmRpZgorZW5kaWYKK2lmbmVxICIkKGZpbHRlciBsaW4gbHJiLCQob3MpKSIgIiIKKyAgICBpZmVxICIkKExJTktfVFlQRSkiICJkeW5hIgorICAgICAgaWZuZXEgIiQoREVCVUdfSU5GTykiICJvbiIKKyAgICAgICAgZGJnX2ZpbGUgPSAkKGxpYl9pdGVtKS5kYmcKKyAgICAgIGVuZGlmCisgICAgZWxzZQorICAgICAgICBkYmdfc3RyaXAgPSAib24iCisgICAgZW5kaWYKK2VuZGlmCisKKyMgLS0tIE91dHB1dCBmaWxlcyAtLS0KKworb3V0X2xpYl9maWxlcyAgPSAkKGFkZHByZWZpeCAkKG91dF9saWJfZGlyKSwkKGxpYl9maWxlKSAkKGltcF9maWxlKSAkKHBkYl9maWxlKSAkKGRiZ19maWxlKSkKK291dF9pbmNfZmlsZXMgID0gJChhZGRwcmVmaXggJChvdXRfcHRmX2RpcilpbmNsdWRlX2NvbXBhdC8saW9tcF9saWIuaCkKK291dF9tb2RfZmlsZXMgID0gXAorICAgICQoYWRkcHJlZml4ICQob3V0X3B0Zl9kaXIpaW5jbHVkZS8sb21wX2xpYi5tb2Qgb21wX2xpYl9raW5kcy5tb2QpCitvdXRfY21uX2ZpbGVzICA9IFwKKyAgICAkKGFkZHByZWZpeCAkKG91dF9jbW5fZGlyKWluY2x1ZGUvLG9tcC5oIG9tcF9saWIuaCBvbXBfbGliLmYgb21wX2xpYi5mOTApIFwKKyAgICAkKGFkZHByZWZpeCAkKG91dF9jbW5fZGlyKWluY2x1ZGVfY29tcGF0Lyxpb21wLmgpCitpZm5lcSAiJChvdXRfbGliX2ZhdF9kaXIpIiAiIgorICAgIG91dF9saWJfZmF0X2ZpbGVzICA9ICQoYWRkcHJlZml4ICQob3V0X2xpYl9mYXRfZGlyKSwkKGxpYl9maWxlKSAkKGltcF9maWxlKSkKK2VuZGlmCisKKyMgLS0tIFNwZWNpYWwgZGVwZW5kZW5jaWVzIC0tLQorCisjIFdlIGhhdmUgdG8gZW5jb2RlIGRlcGVuZGVuY2llcyBvbiBvbXAuaCBtYW51YWxseSwgYmVjYXVzZSBhdXRvbWF0aWMgZGVwZW5kZW5jeSBnZW5lcmF0aW9uCisjIGJ5IGNvbXBpbGVyIHByb2R1Y2VzIGRlcGVkZW5jeSBvbiBvbXAuaCBmaWxlIGxvY2F0ZWQgaW4gY29tcGlsZXIgaW5jbHVkZSBkaXJlY3RvcnkuCitrbXBfY3N1cHBvcnQkKG9iaikgOiBvbXAuaAora21wX3N0dWIkKG9iaikgICAgIDogb21wLmgKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBFeHRlcm5hbCBsaWJyYXJpZXMgdG8gbGluayBpbi4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBXZSAoYWN0dWFsbHksIG91ciBjdXN0b21lcnMpIGRvIG5vIHdhbnQgT3Blbk1QIFJUTCBkZXBlbmRzIG9uIGV4dGVybmFsIGxpYnJhcmllcywgc28gd2UgaGF2ZSB0bworIyBwaWNrIHVwIHNvbWUgb2JqZWN0IGZpbGVzIGZyb20gbGliaXJjIGxpYnJhcnkgKEludGVsIGNvbXBpbGVyIGdlbmVyYXRlIGNvZGUgd2l0aCBjYWxscyB0byBsaWJpcmMpCisjIGFuZCBsaW5rIHRoZW0gaW50byBPTVAgUlRMLgorIyBsaWJpcGdvIGlzIHJlcXVpcmVkIG9ubHkgZm9yIGNvbGxlY3RpbmcgY29kZSBjb3ZlcmFnZSBkYXRhLCBidXQgaXMgaXMgY29udmVuaWVudCB0byBsaW5rIGluIGludG8KKyMgT01QIFJUTCBhcyB3ZWxsLCBub3QgdG8gZGVwZW5kIG9uIGV4dHJhIGxpYnMgYW5kIHBhdGhzLgorCisjIGxpYmlyYyBkb2VzIG1hdHRlciBvbmx5IGlmIEludGVsIGNvbXBpbGVyIGlzIHVzZWQuCitpZm5lcSAiJChmaWx0ZXIgaWNjIGljbCBpY2wuZXhlLCQoYykpIiAiIgorCisgICAgaWZuZXEgIiQoSUNDX0xJQl9ESVIpIiAiIgorICAgICAgICBpY2NfbGliX2RpciA6PSAkKElDQ19MSUJfRElSKQorICAgIGVsc2UKKyAgICAgICAgIworICAgICAgICAjIExldCB1cyBmaW5kIHBhdGggdG8gSW50ZWwgbGlicmFyaWVzIGZpcnN0LiAoZG9uJ3QgdXNlIHRhYnMgaW4gdGhlc2UgbGluZXMhKQorICAgICAgICAjCisgICAgICAgIGljY19wYXRoIDo9ICQoc2hlbGwgd2hpY2ggJChjKSkKKyAgICAgICAgJChjYWxsIGRlYnVnLGljY19wYXRoKQorICAgICAgICBpZmVxICIkKHdvcmRzICQoaWNjX3BhdGgpKSIgIjAiCisgICAgICAgICAgICAkKGVycm9yIFBhdGggdG8gIiQoYykiIG5vdCBmb3VuZCwgcmVwb3J0ZWQgcGF0aDogJChpY2NfcGF0aCkpCisgICAgICAgIGVuZGlmCisgICAgICAgIGlmbmVxICIkKHdvcmRzICQoaWNjX3BhdGgpKSIgIjEiCisgICAgICAgICAgICAkKGVycm9yIFBhdGggdG8gIiQoYykiIGNvbnRhaW5zIHNwYWNlczogIiQoaWNjX3BhdGgpIikKKyAgICAgICAgZW5kaWYKKyAgICAgICAgaWZlcSAiJChvcykiICJ3aW4iICAjIFdpbmRvd3MqIE9TIHNwZWNpZmljLgorICAgICAgICAgICAgIyBgd2hpY2gnIGNhbiByZXR1cm4gcGF0aCB3aXRoIGJhY2tzbGFzaGVzLiBDb252ZXJ0IHRoZW0uCisgICAgICAgICAgICBpY2NfcGF0aCA6PSAkKHN1YnN0IFwsLywkKGljY19wYXRoKSkKKyAgICAgICAgICAgICMgaWNjJ3MgImJpbi8iIGRpcmVjdG9yeSBtYXkgYmUgbmFtZWQgYXMgIkJpbi8iIG9yIGV2ZW4gIkJJTi8iLiBDb252ZXJ0IGl0IHRvIGxvd2VyIGNhc2UuCisgICAgICAgICAgICBpY2NfcGF0aCA6PSAkKHN1YnN0IEIsYiwkKGljY19wYXRoKSkKKyAgICAgICAgICAgIGljY19wYXRoIDo9ICQoc3Vic3QgSSxpLCQoaWNjX3BhdGgpKQorICAgICAgICAgICAgaWNjX3BhdGggOj0gJChzdWJzdCBOLG4sJChpY2NfcGF0aCkpCisgICAgICAgICAgICAkKGNhbGwgZGVidWcsaWNjX3BhdGgpCisgICAgICAgIGVuZGlmCisgICAgICAgICMgaWNjIDEwLnggZGlyZWN0b3J5IGxheW91dDoKKyAgICAgICAgIyAgICAgICAgIGJpbi8KKyAgICAgICAgIyAgICAgICAgIGxpYi8KKyAgICAgICAgIyBpY2MgMTEueCBkaXJlY3RvcnkgbGF5b3V0OgorICAgICAgICAjICAgICAgICAgYmluL3tpYTMyLGludGVsNjR9LworICAgICAgICAjICAgICAgICAgbGliL3tpYTMyLGludGVsNjR9LworICAgICAgICAjIGljYyAxMi54IGRpcmVjdG9yeSBsYXlvdXQ6CisgICAgICAgICMgICAgICAgICBiaW4ve2lhMzIsaW50ZWw2NH0vCisgICAgICAgICMgICAgICAgICBjb21waWxlci9saWIve2lhMzIsaW50ZWw2NH0vCisgICAgICAgICMgTm90ZTogT24gT1MgWCogZmF0IGxpYnJhcmllcyByZXNpZGUgaW4gbGliLyBkaXJlY3RvcnkuIE9uIG90aGVyIHN5c3RlbXMgbGlicmFyaWVzIGFyZSBpbgorICAgICAgICAjIGxpYi88YXJjaD4vLgorICAgICAgICBpY2NfcGF0aF91cDEgOj0gJChkaXIgJChpY2NfcGF0aCkpCisgICAgICAgIGljY19wYXRoX3VwMiA6PSAkKGRpciAkKHBhdHN1YnN0ICUvLCUsJChpY2NfcGF0aF91cDEpKSkKKyAgICAgICAgJChjYWxsIGRlYnVnLGljY19wYXRoX3VwMSkKKyAgICAgICAgJChjYWxsIGRlYnVnLGljY19wYXRoX3VwMikKKyAgICAgICAgaWZuZXEgIiQoZmlsdGVyICUvYmluLywkKGljY19wYXRoX3VwMSkpIiAiIgorICAgICAgICAgICAgIyBMb29rIGxpa2UgMTAueCBjb21waWxlci4KKyAgICAgICAgICAgIGljY19saWJfZGlyIDo9ICQocGF0c3Vic3QgJS9iaW4vLCUvbGliLywkKGljY19wYXRoX3VwMSkpCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGlmbmVxICIkKGZpbHRlciAlL2Jpbi8sJChpY2NfcGF0aF91cDIpKSIgIiIKKyAgICAgICAgICAgICAgICAjIEl0IGxvb2tzIGxpa2UgMTEueCBvciBsYXRlciBjb21waWxlci4KKyAgICAgICAgICAgICAgICBpZmVxICIkKG9zKSIgIm1hYyIKKyAgICAgICAgICAgICAgICAgICAgaWNjX2xpYjEyIDo9ICQocGF0c3Vic3QgJS9iaW4vLCUvY29tcGlsZXIvbGliLywkKGljY19wYXRoX3VwMikpCisgICAgICAgICAgICAgICAgICAgIGlmbmVxICIkKHdpbGRjYXJkICQoaWNjX2xpYjEyKWxpYmlyYyokKGxpYikpIiAiIgorICAgICAgICAgICAgICAgICAgICAgICAgIyAxMi54CisgICAgICAgICAgICAgICAgICAgICAgICBpY2NfbGliX2RpciA6PSAkKGljY19saWIxMikKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgIyAxMS54CisgICAgICAgICAgICAgICAgICAgICAgICBpY2NfbGliX2RpciA6PSAkKHBhdHN1YnN0ICUvYmluLywlL2xpYi8sJChpY2NfcGF0aF91cDIpKQorICAgICAgICAgICAgICAgICAgICBlbmRpZgorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgaWNjX2xpYjEyIDo9ICQocGF0c3Vic3QgJS9iaW4vLCUvY29tcGlsZXIvbGliLywkKGljY19wYXRoX3VwMikpJChub3RkaXIgJChwYXRzdWJzdCAlLywlLCQoaWNjX3BhdGhfdXAxKSkpLworICAgICAgICAgICAgICAgICAgICBpZm5lcSAiJCh3aWxkY2FyZCAkKGljY19saWIxMilsaWJpcmMqJChsaWIpKSIgIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICMgMTIueAorICAgICAgICAgICAgICAgICAgICAgICAgaWNjX2xpYl9kaXIgOj0gJChpY2NfbGliMTIpCisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICMgMTEueAorICAgICAgICAgICAgICAgICAgICAgICAgaWNjX2xpYl9kaXIgOj0gJChwYXRzdWJzdCAlL2Jpbi8sJS9saWIvLCQoaWNjX3BhdGhfdXAyKSkkKG5vdGRpciAkKHBhdHN1YnN0ICUvLCUsJChpY2NfcGF0aF91cDEpKSkvCisgICAgICAgICAgICAgICAgICAgIGVuZGlmCisgICAgICAgICAgICAgICAgZW5kaWYKKyAgICAgICAgICAgIGVuZGlmCisgICAgICAgIGVuZGlmCisgICAgICAgICQoY2FsbCBkZWJ1ZyxpY2NfbGliX2RpcikKKyAgICAgICAgaWZlcSAiJChpY2NfbGliX2RpcikiICIiCisgICAgICAgICAgICAkKGVycm9yIFBhdGggdG8gJChjKSBsaWIvIGRpciBub3QgZm91bmQpCisgICAgICAgIGVuZGlmCisgICAgZW5kaWYKKworICAgICMKKyAgICAjIFRoZW4gc2VsZWN0IHByb3BlciBsaWJyYXJpZXMuCisgICAgIworICAgIGlmZXEgIiQob3MpIiAid2luIgorICAgICAgICBsaWJpcmMgID0gJChpY2NfbGliX2RpcilcbGliaXJjbXQkKGxpYikKKyAgICAgICAgbGliaXBnbyA9ICQoaWNjX2xpYl9kaXIpXGxpYmlwZ28kKGxpYikKKyAgICBlbHNlICMgbGluLCBscmIgb3IgbWFjCisgICAgICAgIGlmZXEgIiQoTElOS19UWVBFKSIgImR5bmEiCisgICAgICAgICAgICAjIEluIGNhc2Ugb2YgZHluYW1pYyBsaW5raW5nLCBwcmVmZXIgbGliaSpfcGljLmEgbGlicmFyaWVzLCB0aGV5IGNvbnRhaW5zCisgICAgICAgICAgICAjIHBvc2l0aW9uLWluZGVwZW5kZW50IGNvZGUuCisgICAgICAgICAgICBsaWJpcmMgID0gJChpY2NfbGliX2RpcilsaWJpcmNfcGljJChsaWIpCisgICAgICAgICAgICBsaWJpcGdvID0gJChpY2NfbGliX2RpcilsaWJpcGdvX3BpYyQobGliKQorICAgICAgICAgICAgIyBJZiBsaWJpKl9waWMuYSBpcyBub3QgZm91bmQgKGl0IGlzIG1pc3NlZCBpbiBvbGRlciBjb21waWxlcnMpLCB1c2UgbGliaSouYS4KKyAgICAgICAgICAgIGlmZXEgIiQod2lsZGNhcmQgJChsaWJpcmMpKSIgIiIKKyAgICAgICAgICAgICAgICBsaWJpcmMgPSAkKGljY19saWJfZGlyKWxpYmlyYyQobGliKQorICAgICAgICAgICAgZW5kaWYKKyAgICAgICAgICAgIGlmZXEgIiQod2lsZGNhcmQgJChsaWJpcGdvKSkiICIiCisgICAgICAgICAgICAgICAgbGliaXBnbyA9ICQoaWNjX2xpYl9kaXIpbGliaXBnbyQobGliKQorICAgICAgICAgICAgZW5kaWYKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbGliaXJjICA9ICQoaWNjX2xpYl9kaXIpbGliaXJjJChsaWIpCisgICAgICAgICAgICBsaWJpcGdvID0gJChpY2NfbGliX2RpcilsaWJpcGdvJChsaWIpCisgICAgICAgIGVuZGlmCisgICAgZW5kaWYKKworICAgICMgT2ssIG5vdyBsZXQgdXMgZGVjaWRlIHdoZW4gbGlua2VkCisgICAgIyBMaW51eCogT1M6CisgICAgIyBXZSBsaW5rIGluIGxpYnJhcmllcyB0byBzdGF0aWMgbGlicmFyeSBvbmx5LgorICAgIGlmZXEgIiQob3MpLSQoTElOS19UWVBFKSIgImxpbi1zdGF0IgorICAgICAgICBsaW5rZWRfaW5fbGlicyArPSBsaWJpcmMKKyAgICBlbmRpZgorICAgICMgT1MgWCo6CisgICAgIyBUaGUgdHJpY2sgaXMgbm90IHJlcXVpcmVkIGluIGNhc2Ugb2YgZHluYW1pYyBsaWJyYXJ5LCBidXQgb24gSW50ZWwoUikgNjQgYXJjaGl0ZWN0dXJlIHdlIGhhdmUgYQorICAgICMgcHJvYmxlbTogbGliaXJjLmEgaXMgYSBmYXQsIHNvIGxpbmtlciAobGlidG9vbCkgcHJvZHVjZXMgZmF0IGxpYmd1aWRlLmR5bGliLi4uIDotKCAoT25seQorICAgICMgZnVuY3Rpb25zIGZyb20gbGliaXJjIGFyZSBwcmVzZW50ZWQgZm9yIGJvdGggYXJjaGl0ZWN0dXJlcywgbGliZ3VpZGUgZnVuY3Rpb25zIGFyZSBmb3IgSW50ZWwoUikgNjQKKyAgICAjIG9ubHkuKSBUbyBhdm9pZCB0aGlzIHVuZGVzaXJlZCBlZmZlY3QsIGxpYmlyYyB0cmljayBpcyBlbmFibGVkIGZvciBib3RoIHN0YXRpYyBhbmQgZHluYW1pYworICAgICMgYnVpbGRzLiBQcm9iYWJseSB3ZSBjYW4gaW5zdHJ1Y3QgbGlidG9vbCB0byBwcm9kdWNlICJ0aGluIiAobm90IGZhdCkgbGlicmFyeSBieSB1c2luZworICAgICMgLWFyY2hfb25seSBvcHRpb24uLi4KKyAgICBpZmVxICIkKG9zKSIgIm1hYyIKKyAgICAgICAgbGlua2VkX2luX2xpYnMgKz0gbGliaXJjCisgICAgZW5kaWYKKyAgICAjIFdpbmRvd3MqIE9TOgorICAgICMgVGhlIHRyaWNrIGlzIHJlcXVpcmVkIG9ubHkgaW4gY2FzZSBvZiBzdGF0aWMgT01QIFJUTC4gSW4gY2FzZSBvZiBkeW5hbWljIE9NUCBSVEwgbGlua2VyIGRvZXMKKyAgICAjIHRoZSBqb2IuCisgICAgaWZlcSAiJChvcyktJChMSU5LX1RZUEUpIiAid2luLXN0YXQiCisgICAgICAgIGxpbmtlZF9pbl9saWJzICs9IGxpYmlyYworICAgIGVuZGlmCisKKyAgICBpZmVxICIkKENPVkVSQUdFKSIgIm9uIgorICAgICAgICBsaW5rZWRfaW5fbGlicyArPSBsaWJpcGdvCisgICAgZW5kaWYKKworZW5kaWYKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBNYWluIHRhcmdldHMuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2FsbCAgICA6IGxpYiBpbmMgbW9kCitsaWIgICAgOiB0ZXN0cyAkKG91dF9saWJfZmlsZXMpCitpbmMgICAgOiAkKG91dF9pbmNfZmlsZXMpCittb2QgICAgOiAkKG91dF9tb2RfZmlsZXMpCitjbGVhbiAgOgorCSQocm0pICQob3V0X2xpYl9maWxlcykgJChvdXRfbGliX2ZhdF9maWxlcykKKwkkKHJtKSAkKG91dF9pbmNfZmlsZXMpICQob3V0X21vZF9maWxlcykKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBCdWlsZGluZyBsaWJyYXJ5LgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCiskKGxpYl9maWxlKSA6ICQoaWYgJChkYmdfZmlsZSksc3RyaXBwZWQsdW5zdHJpcHBlZCkvJChsaWJfZmlsZSkKKwkkKHRhcmdldCkKKwkkKGNwKSAkPCAkQAorCitpZm5lcSAiJChkYmdfZmlsZSkiICIiCisgICAgJChkYmdfZmlsZSkgOiB1bnN0cmlwcGVkLyQoZGJnX2ZpbGUpCisJJCh0YXJnZXQpCisJJChjcCkgJDwgJEAKK2VuZGlmCisKK2lmbmVxICIkKGZpbHRlciBsaW4gbHJiLCQob3MpKSIgIiIKKyAgICBsaWJfZmlsZV9kZXBzID0gJChpZiAkKGxpbmtlZF9pbl9saWJzKSxyZXF1aXJlZC8ub2JqcywkKGxpYl9vYmpfZmlsZXMpKQorZW5kaWYKK2lmZXEgIiQob3MpIiAibWFjIgorICAgIGxpYl9maWxlX2RlcHMgPSBpb21wJChvYmopCitlbmRpZgoraWZlcSAiJChvcykiICJ3aW4iCisgICAgbGliX2ZpbGVfZGVwcyA9ICQoaWYgJChsaW5rZWRfaW5fbGlicyksd2lwZWQvLm9ianMsJChsaWJfb2JqX2ZpbGVzKSkKK2VuZGlmCisKKyMgb2JqX2RlcF9maWxlcyAtLSBvYmplY3QgZmlsZXMsIGV4cGxpY2l0bHkgc3BlY2lmaWVkIGluIGRlcGVuZGVuY3kgbGlzdC4gT3RoZXIgZmlsZXMgKG5vbi1vYmplY3QpCisjIGFyZSBmaWx0ZXJlZCBvdXQuCitvYmpfZGVwc19maWxlcyA9ICQoZmlsdGVyICUkKG9iaiksJF4pCisjIG9ial9kZXBzX2ZsYWdzIC0tIG9iamVjdCBmaWxlcyBjb3JyZXNwb25kaW5nIHRvIGZsYWdzLCBzcGVjaWZpZWQgaW4gZGVwZW5kZW5jeSBsaXN0LiBGbGFnIGlzIGEKKyMgc3BlY2lhbCBmaWxlIGxpa2UgInJlcXVpcmVkLy5vYmpzIi4gRmxhZyBmaWxlIGlzIHJlcGxhY2VkIHdpdGggYSBsaXN0IG9mIGFsbCBvYmplY3QgZmlsZXMgaW4gZmxhZworIyBkaXJlY3RvcnksIGZvciBleGFtcGxlLCAicmVxdWlyZWQvKi5vIgorb2JqX2RlcHNfZmxhZ3MgPSAkKGFkZHN1ZmZpeCAqJChvYmopLCQoZGlyICQoZmlsdGVyICUvLm9ianMsJF4pKSkKKyMgb2JqX2RlcHNfYWxsIC0tIGxpc3Qgb2YgYWxsIG9iamVjdCBmaWxlcyBzcGVjaWZpZWQgaW4gZGVwZW5kZW5jeSBsaXN0LCBlaXRoZXIgZXhwbGljaXQgb3IgZm91bmQKKyMgaW4gZmxhZ2dlZCBkaXJlY3Rvcmllcy4KK29ial9kZXBzX2FsbCAgID0gJChvYmpfZGVwc19maWxlcykgJChvYmpfZGVwc19mbGFncykKKwordW5zdHJpcHBlZC8kKGxpYl9maWxlKS5sc3QgOiAkKGxpYl9maWxlX2RlcHMpIHVuc3RyaXBwZWQvLmRpciAucmVidWlsZAorCSQodGFyZ2V0KQorCWVjaG8gJChvYmpfZGVwc19hbGwpID4gJEAKKworaWZlcSAiJChvcyktJChMSU5LX1RZUEUpIiAibGluLWR5bmEiCisgICAgJChsaWJfZmlsZSkgOiBleHBvcnRzX3NvLnR4dAorZW5kaWYKKworIyBDb3B5IG9iamVjdCBmaWxlcywgd2lwaW5nIG91dCByZWZlcmVuY2VzIHRvIGxpYmlyYyBsaWJyYXJ5LiBPYmplY3QgZmlsZXMgKG91cnMgYW5kIGV4dHJhY3RlZAorIyBmcm9tIGxpYmlyYy5saWIpIGhhdmUgIi1kZWZhdWx0bGliOmxpYmlyYy5saWIiIGxpbmtlciBkaXJlY3RpdmUsIHNvIGxpbmtlciB3aWxsIHJlcXVpcmUgbGliaXJjLmxpYgorIyByZWdhcmRsZXNzIG9mIGFic2VuY2Ugb2YgcmVhbCBkZXBlbmRlbmN5LiBBY3R1YWxseSwgdGhpcyBydWxlIGlzIHJlcXVpcmVkIG9ubHkgb24gV2luZG93cyogT1MsIGJ1dAorIyB0aGVyZSBpcyBubyBXaW5kb3dzKiBPUy1zcGVjaWZpYyBjb21tYW5kcywgc28gSSBvbWl0IGNvbmRpdGlvbnMgdG8ga2VlcCBjb2RlIHNob3J0ZXIgYW5kIGJlIGFibGUgdGVzdAorIyB0aGUgcnVsZSBvbiBMaW51eCogT1MuCisjIE5vdGU6IElmIHdlIGFyZSBub3QgZ29pbmcgdG8gcGljayB1cCBvYmplY3RzIGZyb20gbGliaXJjLCB0aGVyZSBpcyBubyBwb2ludCBpbiB3aXBpbmcgb3V0CisjIGxpYmlyYyByZWZlcmVuY2VzLgorIyBBZGRpdGlvbjogV2lwZSBhbHNvIHJlZmVyZW5jZXMgdG8gQysrIHJ1bnRpbWUgKGxpYmNwbXQubGliKSBmb3IgdGhlIHNhbWUgcmVhc29uOiBzb21ldGltZXMgQysrCisjIHJ1bnRpbWUgcm91dGluZXMgYXJlIG5vdCBhY3R1YWxseSB1c2VkLCBidXQgY29tcGlsZXIgcHV0cyAiLWRlZmF1bHRsaWI6bGliY3BtdC5saWIiIGRpcmVjdGl2ZSB0bworIyBvYmplY3QgZmlsZS4gV2lwZSBpdCBvdXQsIGlmIHdlIGhhdmUgcmVhbCBkZXBlbmRlbmN5IG9uIEMrKyBydW50aW1lLCB0ZXN0LXRvdWNoIHdpbGwgZmFpbC4KK3dpcGVkLy5vYmpzIDogcmVxdWlyZWQvLm9ianMgXAorICAgICQodG9vbHNfZGlyKXdpcGUtc3RyaW5nLnBsIHdpcGVkLy5kaXIgLnJlYnVpbGQKKwkkKHRhcmdldCkKKwkkKHJtKSAkKGRpciAkQCkqJChvYmopCisgICAgaWZlcSAiJChvcykiICJ3aW4iCisJJChwZXJsKSAkKHRvb2xzX2Rpcil3aXBlLXN0cmluZy5wbCAtLXF1aWV0IFwKKwkgICAgLS13aXBlLXJlZ2V4cD0iKC18LykoZGVmYXVsdGxpYnxERUZBVUxUTElCKTpcIihsaWJpcnxsaWJjfExJQkN8T0xETnxsaWJtbXxsaWJkZXxzdm1sKS4qP1wiIiBcCisJICAgIC0tdGFyZ2V0LWRpcmVjdG9yeT0kKGRpciAkQCkgJChvYmpfZGVwc19hbGwpCisgICAgZWxzZQorCSQocGVybCkgJCh0b29sc19kaXIpd2lwZS1zdHJpbmcucGwgLS1xdWlldCBcCisJICAgIC0td2lwZS1yZWdleHA9IigtfC8pKGRlZmF1bHRsaWJ8REVGQVVMVExJQik6XCIobGliaXJ8bGliY3xMSUJDfE9MRE4pLio/XCIiIFwKKwkgICAgLS10YXJnZXQtZGlyZWN0b3J5PSQoZGlyICRAKSAkKG9ial9kZXBzX2FsbCkKKyAgICBlbmRpZgorCSQodG91Y2gpICRACisKKyMgcmVxdWlyZWQtb2JqZWN0cy5wbCB1c2VzICJvYmpjb3B5IiB1dGlsaXR5IHRvIHJlbmFtZSBzeW1ib2xzIGluIG9iamVjdCBmaWxlcy4gT24gTGludXgqIE9TIHRoaXMgaXMgYQorIyBzdGFuZGFyZCB1dGlsaXR5IChmcm9tIGJpbnV0aWxzIHBhY2thZ2UpLiBPbiBXaW5kb3dzKiBPUyB3ZSBwcm92aWRlcyBob21lYnJldyBpbXBsZW1lbnRhdGlvbiAodmVyeQorIyBsaW1pdGVkLCBidXQgZW5vdWdoIGZvciBvdXIgcHVycG9zZXMpLgoraWZlcSAiJChvcykiICJ3aW4iCisgICAgb2JqY29weSA9IG9iamNvcHkkKGV4ZSkKK2VuZGlmCisKKyMgcmVxdWlyZWQvIGlzIGEgZGlyZWN0b3J5IGNvbnRhaW5pbmcgT01QIFJUTCBvYmplY3QgZmlsZXMgYW5kIHJlYWxseSByZXF1aXJlZCBmaWxlcyBmcm9tIGV4dGVybmFsCisjIGxpYnJhcmllcy4gcmVxdWlyZWQvLm9iaiBpcyBhIGZsYWcuIElmIHRoaXMgZmlsZSBwcmVzZW50LCBpdCBtZWFucyBhbGwgcmVxdWlyZWQgb2JqZWN0cyBhbHJlYWR5CisjIGluIHBsYWNlLiBOb3RlLCByZXF1aXJlZC1vYmplY3RzLnBsIGNvcGllcyBmaWxlcyB0byBzcGVjaWZpZWQgZGlyZWN0b3J5LiBJdCBpcyBuZWNlc3NhcnksIGJlY2F1c2UKKyMgb2JqZWN0IGZpbGVzIGFyZSBlZGl0ZWQgZHVyaW5nIGNvcHlpbmcgLS0gc3ltYm9scyBkZWZpbmVkIGluIGV4dGVybmFsIG9iamVjdCBmaWxlcyBhcmUgcmVuYW1lZC4KK3JlcXVpcmVkLy5vYmpzIDogJChsaWJfb2JqX2ZpbGVzKSAkKGFkZHN1ZmZpeCAvLm9ianMsJChsaW5rZWRfaW5fbGlicykpIFwKKyAgICAkKHRvb2xzX2RpcilyZXF1aXJlZC1vYmplY3RzLnBsICQob2JqY29weSkgcmVxdWlyZWQvLmRpciAucmVidWlsZAorCSQodGFyZ2V0KQorCSQocm0pICQoZGlyICRAKSokKG9iaikKKwkkKHBlcmwpICQodG9vbHNfZGlyKXJlcXVpcmVkLW9iamVjdHMucGwgLS1xdWlldCAkKG9hLW9wdHMpIC0tcHJlZml4PV9fa21wX2V4dGVybmFsXyBcCisJICAgIC0tYmFzZSAkKG9ial9kZXBzX2ZpbGVzKSAtLWV4dHJhICQob2JqX2RlcHNfZmxhZ3MpIC0tY29weS1hbGw9JChkaXIgJEApCisJJCh0b3VjaCkgJEAKKworIyBFeHRyYWN0aW5nIG9iamVjdCBmaWxlcyBmcm9tIGxpYmlyYy4gRmlsZSAibGliaXJjLy5vYmoiIGlzIGEgZmxhZy4gSWYgdGhlIGZpbGUgcHJlc2VudCwgbWFrZQorIyB0aGlua3MgZmlsZXMgYXJlIGV4dHJhY3RlZC4KK2lmbmVxICIkKGxpYmlyYykiICIiCisgICAgbGliaXJjLy5vYmpzIDogJChsaWJpcmMpIFwKKwkkKHRvb2xzX2RpcilleHRyYWN0LW9iamVjdHMucGwgbGliaXJjLy5kaXIgLnJlYnVpbGQKKwkgICAgJCh0YXJnZXQpCisJICAgICQocm0pICQoZGlyICRAKSokKG9iaikKKwkgICAgJChwZXJsKSAkKHRvb2xzX2RpcilleHRyYWN0LW9iamVjdHMucGwgLS1xdWlldCAkKG9hLW9wdHMpIC0tb3V0cHV0PSQoZGlyICRAKSAkPAorCSAgICAkKHRvdWNoKSAkQAorZW5kaWYKKworIyBFeHRyYWN0aW5nIG9iamVjdCBmaWxlcyBmcm9tIGxpYmlwZ28uIEZpbGUgIi9saWJpcGdvLy5vYmoiIGlzIGEgZmxhZy4gSWYgdGhlIGZpbGUgcHJlc2VudCwgbWFrZQorIyB0aGlua3Mgb2JqZWN0cyBhcmUgZXh0cmFjdGVkLgoraWZuZXEgIiQobGliaXBnbykiICIiCisgICAgbGliaXBnby8ub2JqcyA6ICQobGliaXBnbykgXAorCSQodG9vbHNfZGlyKWV4dHJhY3Qtb2JqZWN0cy5wbCBsaWJpcGdvLy5kaXIgLnJlYnVpbGQKKwkgICAgJCh0YXJnZXQpCisJICAgICQocm0pICQoZGlyICRAKSokKG9iaikKKwkgICAgJChwZXJsKSAkKHRvb2xzX2RpcilleHRyYWN0LW9iamVjdHMucGwgLS1xdWlldCAkKG9hLW9wdHMpIC0tb3V0cHV0PSQoZGlyICRAKSAkPAorCSAgICAkKHRvdWNoKSAkQAorZW5kaWYKKworCitzdHJpcHBlZC8kKGxpYl9maWxlKSA6IHVuc3RyaXBwZWQvJChsaWJfZmlsZSkgJChkYmdfZmlsZSkgc3RyaXBwZWQvLmRpciAucmVidWlsZAorCSQodGFyZ2V0KQorCW9iamNvcHkgLS1zdHJpcC1kZWJ1ZyAkPCAkQC50bXAKKwlvYmpjb3B5IC0tYWRkLWdudS1kZWJ1Z2xpbms9JChkYmdfZmlsZSkgJEAudG1wICRACisKK2lmZXEgIiQob3MpIiAibWFjIgorCisgICAgIyBUaGVzZSB0YXJnZXRzIGFyZSB1bmRlciBjb25kaXRpb24gYmVjYXVzZSBvZiBzb21lIE9TIFgqLXNwZWNpZmljIGxkIGFuZCBubSBvcHRpb25zLiBGb3IKKyAgICAjIGV4YW1wbGUsIEdOVSBubSBkb2VzIG5vdCBhY2NlcHQgLWosIEdOVSBsZCBkb2VzIG5vdCBrbm93IC1maWxlbGlzdC4KKworICAgICMgaW9tcC5vIGlzIGEgYmlnIG9iamVjdCBmaWxlIGluY2x1ZGluZyBhbGwgdGhlIE9NUCBSVEwgb2JqZWN0IGZpbGVzIGFuZCBvYmplY3QgZmlsZXMgZnJvbQorICAgICMgZXh0ZXJuYWwgbGlicmFyaWVzIChsaWtlIGxpYmlyYykuIEl0IGlzIHBhcnRpYWxseSBsaW5rZWQsIHJlZmVyZW5jZXMgdG8gZXh0ZXJuYWwgc3ltYm9scworICAgICMgKGUuIGcuIHJlZmVyZW5jZXMgdG8gbGliaXJjKSBhbHJlYWR5IHJlc29sdmVkLCBzeW1ib2xzIGRlZmluZWQgaW4gZXh0ZXJuYWwgbGlicmFyaWVzIGFyZQorICAgICMgaGlkZGVuIGJ5IHVzaW5nIC11bmV4cG9ydGVkLXN5bWJvbC1saXN0IGFuZCAtbm9uX2dsb2JhbF9zeW1ib2xzX3N0cmlwX2xpc3QgbGlua2VyIG9wdGlvbnMKKyAgICAjIChib3RoIG9wdGlvbnMgYXJlIHJlcXVpcmVkKS4KKyAgICAjIEFDOiAyMDEyLTA0LTEyOiBhZnRlciBNQUMgbWFjaGluZXMgdXBncmFkZSBjb21waWxlciBmYWlscyB0byBjcmVhdGUgb2JqZWN0LCBzbyB1c2UgbGlua2VyIGluc3RlYWQKK2lmZXEgIiQobWFjX29zX25ldykiICIxIgorICAgIGlvbXAkKG9iaikgOiAkKGxpYl9vYmpfZmlsZXMpIGV4dGVybmFsLXN5bWJvbHMubHN0IGV4dGVybmFsLW9iamVjdHMubHN0IC5yZWJ1aWxkCisJICAgICQodGFyZ2V0KQorCSAgICBsZCAtciAtdW5leHBvcnRlZF9zeW1ib2xzX2xpc3QgZXh0ZXJuYWwtc3ltYm9scy5sc3QgXAorCQktbm9uX2dsb2JhbF9zeW1ib2xzX3N0cmlwX2xpc3QgZXh0ZXJuYWwtc3ltYm9scy5sc3QgXAorCQktZmlsZWxpc3QgZXh0ZXJuYWwtb2JqZWN0cy5sc3QgXAorCQktbyAkQCAkKG9ial9kZXBzX2ZpbGVzKQorZWxzZQorICAgIGlvbXAkKG9iaikgOiAkKGxpYl9vYmpfZmlsZXMpIGV4dGVybmFsLXN5bWJvbHMubHN0IGV4dGVybmFsLW9iamVjdHMubHN0IC5yZWJ1aWxkCisJICAgICQodGFyZ2V0KQorCSAgICAkKGMpIC1yIC1ub3N0YXJ0ZmlsZXMgLXN0YXRpYy1pbnRlbCAgLW5vLWludGVsLWV4dGVuc2lvbnMgXAorCQktV2wsLXVuZXhwb3J0ZWRfc3ltYm9sc19saXN0LGV4dGVybmFsLXN5bWJvbHMubHN0IFwKKwkJLVdsLC1ub25fZ2xvYmFsX3N5bWJvbHNfc3RyaXBfbGlzdCxleHRlcm5hbC1zeW1ib2xzLmxzdCBcCisJCS1maWxlbGlzdCBleHRlcm5hbC1vYmplY3RzLmxzdCBcCisJCS1vICRAICQob2JqX2RlcHNfZmlsZXMpCitlbmRpZgorCisgICAgIyBleHRlcm5hbC1vYmplY3RzLmxzdCBpcyBhIGxpc3Qgb2Ygb2JqZWN0IGZpbGVzIGV4dHJhY3RlZCBmcm9tIGV4dGVybmFsIGxpYnJhcmllcywgd2hpY2ggc2hvdWxkCisgICAgIyBiZSBsaW5rZWQgaW50byBpb21wLm8uIGttcF9kdW1teS5vIGlzIGFkZGVkIHRvIHRoZSBsaXN0IHRvIGF2b2lkIGVtcHR5IGxpc3QgLS0gT1MgWCogdXRpbGl0aWVzCisgICAgIyBubSBhbmQgbGQgZG8gbm90IGxpa2UgZW1wdHkgbGlzdHMuCisgICAgZXh0ZXJuYWwtb2JqZWN0cy5sc3QgOiAkKGxpYl9vYmpfZmlsZXMpICQoYWRkc3VmZml4IC8ub2JqcywkKGxpbmtlZF9pbl9saWJzKSkga21wX2R1bW15JChvYmopIFwKKwkkKHRvb2xzX2RpcilyZXF1aXJlZC1vYmplY3RzLnBsIC5yZWJ1aWxkCisJICAgICQodGFyZ2V0KQorCSAgICAkKHBlcmwpICQodG9vbHNfZGlyKXJlcXVpcmVkLW9iamVjdHMucGwgJChvYS1vcHRzKSBcCisJCS0tYmFzZSAkKG9ial9kZXBzX2ZpbGVzKSAtLWV4dHJhICQob2JqX2RlcHNfZmxhZ3MpIC0tcHJpbnQtZXh0cmEgPiAkQC50bXAKKwkgICAgZWNobyAia21wX2R1bW15JChvYmopIiA+PiAkQC50bXAKKwkgICAgbXYgJEAudG1wICRACisKKyAgICAjIFByZXBhcmUgbGlzdCBvZiBzeW1ib2xzIGluIGV4dGVybmFsIG9iamVjdCBmaWxlcy4gV2Ugd2lsbCBoaWRlIGFsbCB0aGVzZSBzeW1ib2xzLgorICAgICMgTm90ZTogLWogaXMgbm9uLUdOVSBvcHRpb24gd2hpY2ggbWVhbnMgIkp1c3QgZGlzcGxheSB0aGUgc3ltYm9sIG5hbWVzIChubyB2YWx1ZSBvciB0eXBlKS4iCisgICAgZXh0ZXJuYWwtc3ltYm9scy5sc3QgOiBleHRlcm5hbC1vYmplY3RzLmxzdCAucmVidWlsZAorCSAgICAkKHRhcmdldCkKKwkgICAgbm0gLWdvaiAkJChjYXQgZXh0ZXJuYWwtb2JqZWN0cy5sc3QpID4gJEAuMC50bXAKKwkgICAgY3V0IC1mMiAtZCIgIiAkQC4wLnRtcCA+ICRALjEudG1wCisJICAgIG12ICRALjEudG1wICRACisKK2VuZGlmICMgbWFjCisKKyMgSW1wb3J0IGxpYnJhcnkgdHJpY2tzIGFyZSBXaW5kb3dzKiBPUy1zcGVjaWZpYy4KK2lmZXEgIiQob3MpIiAid2luIgorCisgICAgaW1wb3J0JChsaWIpIDogJChsaWJfaXRlbSkkKGRsbCkKKworICAgICMgQ2hhbmdlIHRoZSBuYW1lIG9mIGltcG9ydCBsaWJyYXJ5IHByb2R1Y2VkIGJ5IHRoZSBsaW5rZXIsIHdlIHdpbGwgY29tYmluZSBpdCB3aXRoIHNvbWUgbW9yZQorICAgICMgb2JqZWN0IGZpbGVzIHRvIHByb2R1Y2UgImV4dGVuZGVkIGltcG9ydCBsaWIiLgorICAgICQobGliX2l0ZW0pJChkbGwpIDogaW1wX2ZpbGUgOj0gaW1wb3J0JChsaWIpCisKKyAgICAjIERlZmF1bHQgcnVsZSAiYyB0byBvYmoiIHdpbGwgY29tcGlsZSBzb3VyY2VzIHdpdGggLU1UIG9wdGlvbiwgd2hpY2ggaXMgbm90IGRlc2lyZWQuCisgICAgIyBDYW5jZWwgZWZmZWN0IG9mIC1NVCB3aXRoIC1abC4KKyAgICAjIEFDOiBDdXJyZW50bHkgd2Ugb25seSBoYXZlIG9uZSBvYmplY3QgdGhhdCBkb2VzIG5vdCBuZWVkIGFueSBzcGVjaWFsCisgICAgIyAgICAgY29tcGlsZXIgb3B0aW9ucywgc28gdXNlIG1pbmltYWwgc2V0LiBXaXRoIHN0YW5kYXJkIHNldCBvZiBvcHRpb25zIHdlIHVzZWQKKyAgICAjICAgICB0aGVyZSB3ZXJlIHByb2JsZW1zIHdpdGggZGVidWcgaW5mbyBsZWFrZWQgaW50byB0aGUgaW1wb3J0IGxpYnJhcnkKKyAgICAjICAgICB3aXRoIHRoaXMgb2JqZWN0IChidWcgcmVwb3J0ICMzMzQ1NjUpLgorICAgICQoaW1wX29ial9maWxlcykgOiBjLWZsYWdzIDo9IC1abCAtbm9sb2dvIC1jCisKKyAgICAkKGltcF9maWxlKS5sc3QgOiAkKGltcF9vYmpfZmlsZXMpIGltcG9ydCQobGliKSAucmVidWlsZAorCSAgICAkKHRhcmdldCkKKwkgICAgZWNobyAkKGZpbHRlci1vdXQgLnJlYnVpbGQsJF4pID4gJEAKKworZW5kaWYKKwora21wX2kxOG5faWQuaW5jIDogZW5fVVMudHh0IFwKKyAgICAkKHRvb2xzX2RpciltZXNzYWdlLWNvbnZlcnRlci5wbCAucmVidWlsZAorCSQodGFyZ2V0KQorCSQocGVybCkgJCh0b29sc19kaXIpbWVzc2FnZS1jb252ZXJ0ZXIucGwgJChvYS1vcHRzKSAtLXByZWZpeD1rbXBfaTE4biAtLWVudW09JEAgJDwKKwora21wX2kxOG5fZGVmYXVsdC5pbmMgOiBlbl9VUy50eHQgXAorICAgICQodG9vbHNfZGlyKW1lc3NhZ2UtY29udmVydGVyLnBsIC5yZWJ1aWxkCisJJCh0YXJnZXQpCisJJChwZXJsKSAkKHRvb2xzX2RpciltZXNzYWdlLWNvbnZlcnRlci5wbCAkKG9hLW9wdHMpIC0tcHJlZml4PWttcF9pMThuIC0tZGVmYXVsdD0kQCAkPAorCisjIFJlYnVpbHQga21wX3ZlcnNpb24ubyBvbiBhbnkgY2hhbmdlIHRvIGhhdmUgYWN0dWFsIGJ1aWxkIHRpbWUgc3RyaW5nIGFsd2F5cyB1cGRhdGVkLgora21wX3ZlcnNpb24kKG9iaik6ICQoZmlsdGVyLW91dCBrbXBfdmVyc2lvbiQob2JqKSwkKGxpYl9vYmpfZmlsZXMpICQoaW1wX29ial9maWxlcykpCisKKyQoZGVmX2ZpbGUpIDogZGxsZXhwb3J0cyBcCisgICAgJCh0b29sc19kaXIpZ2VuZXJhdGUtZGVmLnBsIC5yZWJ1aWxkCisJJCh0YXJnZXQpCisJJChwZXJsKSAkKHRvb2xzX2RpcilnZW5lcmF0ZS1kZWYucGwgJChnZC1mbGFncykgLW8gJEAgJDwKKworbGliaW9tcC5yYyA6IGxpYmlvbXAucmMudmFyIGttcF92ZXJzaW9uLmMKK2xpYmlvbXAucmMgOiBldi1mbGFncyArPSAtRCBLTVBfRklMRT0kKGxpYl9maWxlKQorCiskKHJjX2ZpbGUpIDogbGliaW9tcC5yYyAucmVidWlsZAorCSQodGFyZ2V0KQorCSQoY3ApICQ8ICRACisKK2ttcF9kdW1teS5jIDogLnJlYnVpbGQKKwkkKHRhcmdldCkKKwllY2hvICJ2b2lkIF9fa21wX2R1bW15KCkge30iID4gJEAKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUZXN0cy4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyAtLS0gdGVzdC10b3VjaCAtLS0KKworIyB0ZXN0LXRvdWNoIGlzIG5vdCBhdmFpbGFibGUgZm9yIGxyYi4KK2lmbmVxICIkKG9zKSIgImxyYiIKKworICAgICMgQ29tcGlsZSBhIHNpbXBsZSBDIHRlc3QgYW5kIGxpbmsgaXQgd2l0aCB0aGUgbGlicmFyeS4gRG8gaXQgdHdvIHRpbWVzOiB0aGUgZmlyc3QgbGluayBnaXZlcyB1cworICAgICMgY2xlYXIgbWVzc2FnZSBpZiB0aGVyZSBhcmUgYW55IHByb2JsZW1zLCB0aGUgc2Vjb25kIGxpbmsgcnVuIGluIHZlcmJvc2UgbW9kZSwgbGlua2VyIG91dHB1dAorICAgICMgc2VhcmNoZWQgZm9yICJsaWJpcmMiIHN0cmluZyAtLSBzaG91bGQgbm90IGJlIGFueSBsaWJpcmMgcmVmZXJlbmNlcy4gRmluYWxseSwgdGVzdCBleGVjdXRhYmxlCisgICAgIyBydW4gd2l0aCBLTVBfVkVSQk9TRT0xLgorCisgICAgaWZlcSAiJChvcykiICJ3aW4iCisgICAgICAgIGlmbmVxICIkKGRvX3Rlc3RfdG91Y2hfbXQpIiAiMCIKKyAgICAgICAgICAgIHRlc3RfdG91Y2hfaXRlbXMgKz0gdGVzdC10b3VjaC1tZCB0ZXN0LXRvdWNoLW10CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRlc3RfdG91Y2hfaXRlbXMgKz0gdGVzdC10b3VjaC1tZAorICAgICAgICBlbmRpZgorICAgIGVsc2UKKyAgICAgICAgdGVzdF90b3VjaF9pdGVtcyArPSB0ZXN0LXRvdWNoLXJ0CisgICAgZW5kaWYKKworICAgIGZvcmNlLXRlc3QtdG91Y2ggOiAkKGFkZHN1ZmZpeCAvLmZvcmNlLCQodGVzdF90b3VjaF9pdGVtcykpICQoYWRkc3VmZml4IC8udGVzdCwkKHRlc3RfdG91Y2hfaXRlbXMpKQorICAgIHRlc3QtdG91Y2ggICAgICAgOiAkKGFkZHN1ZmZpeCAvLnRlc3QsJCh0ZXN0X3RvdWNoX2l0ZW1zKSkKKworICAgIHR0LWV4ZS1maWxlID0gJChkaXIgJEApdGVzdC10b3VjaCQoZXhlKQorICAgIGlmZXEgIiQob3MpIiAid2luIgorICAgICAgICAjIE9uIFdpbmRvd3MqIE9TIHRoZSB0ZXN0IHF1YWxpdHkgaXMgcHJvYmxlbWF0aWMsIGJlY2F1c2UgTElCIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHNldCB1cCBmb3IKKyAgICAgICAgIyBJbnRlbCBjb21waWxlciBzbyBNaWNyb3NvZnQgY29tcGlsZXIgaXMgYWJsZSB0byBmaW5kIGxpYmlyYyBpZiBpdCBpcyBzcGVjaWZpZWQgaW4gZGVmYXVsdGxpYgorICAgICAgICAjIGRpcmVjdGl2ZSB3aXRoaW4gb2JqZWN0IGZpbGUuLi4gVGhpcyBkaXNhZHZhbnRhZ2UgaXMgY29tcGVuc2F0ZWQgYnkgZ3JlcHBpbmcgdmVyYm9zZSBsaW5rCisgICAgICAgICMgb3V0cHV0IGZvciAibGliaXJjIiBzdHJpbmcuCisgICAgICAgIHR0LWMgICAgICAgICAgICA9IGNsCisgICAgICAgIHR0LWMtZmxhZ3MgICAgICs9IC1ub2xvZ28KKyAgICAgICAgaWZlcSAiJChPUFRJTUlaQVRJT04pIiAib24iCisgICAgICAgICAgICB0dC1jLWZsYWdzLW10ID0gLU1UCisgICAgICAgICAgICB0dC1jLWZsYWdzLW1kID0gLU1ECisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHR0LWMtZmxhZ3MtbXQgPSAtTVRkCisgICAgICAgICAgICB0dC1jLWZsYWdzLW1kID0gLU1EZAorICAgICAgICBlbmRpZgorICAgICAgICBpZmVxICIkKExJTktfVFlQRSkiICJzdGF0IgorICAgICAgICAgICAgdHQtbGlicyAgKz0gJChsaWJfZmlsZSkKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdHQtbGlicyAgKz0gJChpbXBfZmlsZSkKKyAgICAgICAgZW5kaWYKKyAgICAgICAgaWZuZXEgIiQoYXJjaCkiICIzMiIKKyAgICAgICAgICAgICMgVG8gc3VjY2Vzc2Z1bGx5IGJ1aWxkIHdpdGggVlMyMDA4CisgICAgICAgICAgICAjIHR0LWxpYnMgKz0gYnVmZmVyb3ZlcmZsb3d1LmxpYgorICAgICAgICAgICAgIyBQcmV2ZW50aW5nICJ1bnJlc29sdmVkIGV4dGVybmFsIHN5bWJvbCBfX3NlY3VyaXR5X2Nvb2tpZSIgKGFuZAorICAgICAgICAgICAgIyAiLi4uIF9fc2VjdXJpdHlfY2hlY2tfY29va2llIikgbGlua2VyIGVycm9ycyBvbiB3aW5fMzJlIGFuZCB3aW5fNjQuCisgICAgICAgIGVuZGlmCisgICAgICAgIHR0LWMtZmxhZ3MgICs9IC1GbyQoZGlyICRAKXRlc3QtdG91Y2gkKG9iaikgLUZlJCh0dC1leGUtZmlsZSkKKyAgICAgICAgdHQtbGQtZmxhZ3MgKz0gLWxpbmsKKyAgICAgICAgIyBTb21lIFBvc2l4IGJ1dCBub24tSVNPIGZ1bmN0aW9ucyAobGlrZSBzdHJkdXApIGFyZSBkZWZpbmVkIGluIG9sZG5hbWVzLmxpYiwgd2hpY2ggaXMgdXNlZAorICAgICAgICAjIGltcGxpY2l0bHkuIERyb3Agb2xkbmFtZXMubGliIGxpYnJhcnksIHNvIHdlIGNhbiBjYXRjaAorICAgICAgICB0dC1sZC1mbGFncyArPSAtbm9kZWZhdWx0bGliOm9sZG5hbWVzCisgICAgICAgIGlmZXEgIiQoYXJjaCkiICIzMiIKKyAgICAgICAgICAgIHR0LWxkLWZsYWdzICs9IC1zYWZlc2VoCisgICAgICAgIGVuZGlmCisgICAgICAgIHR0LWxkLWZsYWdzLXYgKz0gLXZlcmJvc2UKKyAgICBlbHNlICMgbGluIG9yIG1hYworICAgICAgICAjIE9uIExpbnV4KiBPUyBhbmQgT1MgWCogdGhlIHRlc3QgaXMgZ29vZCBlbm91Z2ggYmVjYXVzZSBHTlUgY29tcGlsZXIga25vd3Mgbm90aGluZworICAgICAgICAjIGFib3V0IGxpYmlyYyBhbmQgSW50ZWwgY29tcGlsZXIgcHJpdmF0ZSBsaWIgZGlyZWN0b3JpZXMsIGJ1dCB3ZSB3aWxsIGdyZXAgdmVyYm9zZSBsaW5rZXIKKyAgICAgICAgIyBvdXRwdXQganVzdCBpbiBjYXNlLgorICAgICAgICAjIFVzaW5nIGNsYW5nIG9uIE9TIFgqIGJlY2F1c2Ugb2YgZGlzY29udGludWVkIHN1cHBvcnQgb2YgR05VIGNvbXBpbGVycy4KKyAgICAgICAgaWZlcSAiJChvcykiICJtYWMiCisgICAgICAgICAgICBpZmVxICIkKHN0ZF9jcHBfbGliKSIgIjEiCisgICAgICAgICAgICAgICAgdHQtYyAgICAgICAgPSBjbGFuZysrCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdHQtYyAgICAgICAgPSBjbGFuZworICAgICAgICAgICAgZW5kaWYKKyAgICAgICAgZWxzZSAjIGxpbgorICAgICAgICAgICAgaWZlcSAiJChzdGRfY3BwX2xpYikiICIxIgorICAgICAgICAgICAgICAgIHR0LWMgICAgICAgID0gZysrCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdHQtYyAgICAgICAgPSBnY2MKKyAgICAgICAgICAgIGVuZGlmCisgICAgICAgICAgICAjIEdDQyBvbiBPUyBYKiBkb2VzIG5vdCByZWNvZ25pemUgLXB0aHJlYWQuCisgICAgICAgICAgICB0dC1jLWZsYWdzICArPSAtcHRocmVhZAorICAgICAgICBlbmRpZgorICAgICAgICB0dC1jLWZsYWdzICs9IC1vICQodHQtZXhlLWZpbGUpCisgICAgICAgIGlmbmVxICIkKGZpbHRlciAzMiAzMmUgNjQsJChhcmNoKSkiICIiCisgICAgICAgICAgICB0dC1jLWZsYWdzICs9ICQoaWYgJChmaWx0ZXIgNjQsJChhcmNoKSksLCQoaWYgJChmaWx0ZXIgMzIsJChhcmNoKSksLW0zMiwtbTY0KSkKKyAgICAgICAgZW5kaWYKKyAgICAgICAgdHQtbGlicyAgICArPSAkKGxpYl9maWxlKQorICAgICAgICBpZmVxICIkKG9zKS0kKENPVkVSQUdFKS0kKExJTktfVFlQRSkiICJsaW4tb24tc3RhdCIKKyAgICAgICAgICAgICMgU3RhdGljIGNvdmVyYWdlIGJ1aWxkIG9uIExpbnV4KiBPUyBmYWlscyBkdWUgdG8gdW5yZXNvbHZlZCBzeW1ib2xzIGRsb3BlbiwgZGxzeW0sIGRsY2xvc2UuCisgICAgICAgICAgICAjIEV4cGxpY2l0bHkgYWRkIGRsIGxpYnJhcnkgdG8gYXZvaWQgZmFpbHVyZS4KKyAgICAgICAgICAgIHR0LWxkLWZsYWdzICs9IC1sZGwKKyAgICAgICAgZW5kaWYKKyAgICAgICAgaWZlcSAiJChvcykiICJtYWMiCisgICAgICAgICAgICB0dC1sZC1mbGFncy12ICs9IC1XbCwtdAorICAgICAgICAgICAgdHQtZW52ICAgICAgICArPSBEWUxEX0xJQlJBUllfUEFUSD0iLjokKERZTERfTElCUkFSWV9QQVRIKSIKKyAgICAgICAgZWxzZSAjIGxpbgorICAgICAgICAgICAgdHQtbGQtZmxhZ3MtdiArPSAtV2wsLS12ZXJib3NlCisgICAgICAgICAgICB0dC1lbnYgICAgICAgICs9IExEX0xJQlJBUllfUEFUSD0iLjokKExEX0xJQlJBUllfUEFUSCkiCisgICAgICAgIGVuZGlmCisgICAgZW5kaWYKKyAgICB0dC1jLWZsYWdzICs9ICQodHQtYy1mbGFncy1ydCkKKyAgICB0dC1lbnYgICAgICs9IEtNUF9WRVJTSU9OPTEKKyAgICB0dC1pICAgICAgICA9ICQoaWYgJChmaWx0ZXIgb2ZmLCQoVEVTVF9UT1VDSCkpLC0pCisKKyAgICBpZm5kZWYgdGVzdC10b3VjaC1jb21tYW5kcworICAgICAgICAjIFRoZSBmaXJzdCBidWlsZGluZyBnaXZlcyBzaG9ydCBhbmQgY2xlYXIgZXJyb3IgbWVzc2FnZSBpbiBjYXNlIG9mIGFueSBwcm9ibGVtLgorICAgICAgICAjIFRoZSBzZWNvbmQgYnVpbGRpbmcgcnVucyBsaW5rZXIgaW4gdmVyYm9zZSBtb2RlIGFuZCBzYXZlcyBsaW5rZXIgb3V0cHV0IGZvciBncmVwcGluZy4KKyAgICAgIGRlZmluZSB0ZXN0LXRvdWNoLWNvbW1hbmRzCisJICAgICQocm0pICQoZGlyICRAKSoKKwkgICAgJCh0dC1pKSQodHQtYykgJCh0dC1jLWZsYWdzKSAkPCAkKHR0LWxpYnMpICQodHQtbGQtZmxhZ3MpCisJICAgICQocm0pICQodHQtZXhlLWZpbGUpCisJICAgICQodHQtaSkkKHR0LWMpICQodHQtYy1mbGFncykgXAorCQkkPCAkKHR0LWxpYnMpIFwKKwkJJCh0dC1sZC1mbGFncykgJCh0dC1sZC1mbGFncy12KSBcCisJCT4gJChkaXIgJEApYnVpbGQubG9nIDI+JjEKKwkgICAgJCh0dC1pKSQodHQtZW52KSAkKHR0LWV4ZS1maWxlKQorCSAgICAkKHR0LWkpZ3JlcCAtaSAtZSAiW15fXWxpYmlyYyIgJChkaXIgJEApYnVpbGQubG9nID4gJChkaXIgJEApbGliaXJjLmxvZzsgXAorCQlbICQkPyAtZXEgMSBdCisgICAgICBlbmRlZgorICAgIGVuZGlmCisKKyAgICB0ZXN0LXRvdWNoLXJ0Ly50ZXN0IDogdHQtYy1mbGFncy1ydCA9CisgICAgdGVzdC10b3VjaC1tdC8udGVzdCA6IHR0LWMtZmxhZ3MtcnQgPSAkKHR0LWMtZmxhZ3MtbXQpCisgICAgdGVzdC10b3VjaC1tZC8udGVzdCA6IHR0LWMtZmxhZ3MtcnQgPSAkKHR0LWMtZmxhZ3MtbWQpCisKKyAgICB0ZXN0LXRvdWNoLXJ0Ly50ZXN0IDogdGVzdC10b3VjaC5jICQobGliX2ZpbGUpIHRlc3QtdG91Y2gtcnQvLmRpciAucmVidWlsZAorCSAgICAkKHRhcmdldCkKKwkgICAgJCh0ZXN0LXRvdWNoLWNvbW1hbmRzKQorCSAgICAkKHRvdWNoKSAkQAorICAgIHRlc3QtdG91Y2gtbXQvLnRlc3QgOiB0ZXN0LXRvdWNoLmMgJChsaWJfZmlsZSkgJChpbXBfZmlsZSkgdGVzdC10b3VjaC1tdC8uZGlyIC5yZWJ1aWxkCisJICAgICQodGFyZ2V0KQorCSAgICAkKHRlc3QtdG91Y2gtY29tbWFuZHMpCisJICAgICQodG91Y2gpICRACisgICAgdGVzdC10b3VjaC1tZC8udGVzdCA6IHRlc3QtdG91Y2guYyAkKGxpYl9maWxlKSAkKGltcF9maWxlKSB0ZXN0LXRvdWNoLW1kLy5kaXIgLnJlYnVpbGQKKwkgICAgJCh0YXJnZXQpCisJICAgICQodGVzdC10b3VjaC1jb21tYW5kcykKKwkgICAgJCh0b3VjaCkgJEAKKworZW5kaWYKKworIyAtLS0gdGVzdC1yZWxvIC0tLQorCisjIEJ1dCB0ZXN0LXJlbG8gZG9lcyBhY3R1YWwgd29yayBvbmx5IG9uIExpbnV4KiBPUyBhbmQKKyMgSW50ZWwoUikgTWFueSBJbnRlZ3JhdGVkIENvcmUgQXJjaGl0ZWN0dXJlIGluIGNhc2Ugb2YgZHluYW1pYyBsaW5raW5nLgoraWZlcSAiJChpZiAkKGZpbHRlciBsaW4gbHJiLCQob3MpKSxvcyktJChMSU5LX1RZUEUpIiAib3MtZHluYSIKKworICAgICMgTWFrZSBzdXJlIGR5bmFtaWMgbGlicmFyeSBkb2VzIG5vdCBjb250YWluIHBvc2l0aW9uLWRlcGVuZGVudCBjb2RlLgorICAgIGZvcmNlLXRlc3QtcmVsbyA6IHRlc3QtcmVsby8uZm9yY2UgdGVzdC1yZWxvLy50ZXN0CisgICAgdGVzdC1yZWxvICAgICAgIDogdGVzdC1yZWxvLy50ZXN0CisKKyAgICB0ZXN0LXJlbG8vLnRlc3QgOiAkKGxpYl9pdGVtKSQoZGxsKSB0ZXN0LXJlbG8vLmRpciAucmVidWlsZAorCSAgICAkKHRhcmdldCkKKwkgICAgcmVhZGVsZiAtZCAkPCA+ICQoZGlyICRAKXJlYWRlbGYubG9nCisJICAgIGdyZXAgLWUgVEVYVFJFTCAkKGRpciAkQClyZWFkZWxmLmxvZzsgWyAkJD8gLWVxIDEgXQorCSAgICAkKHRvdWNoKSAkQAorCitlbmRpZgorCisjIC0tLSB0ZXN0LWV4ZWNzdGFjayAtLS0KKworIyBCdXQgdGVzdC1leGVjc3RhY2sgZG9lcyBhY3R1YWwgd29yayBvbmx5IG9uIExpbnV4KiBPUyBpbiBjYXNlIG9mIGR5bmFtaWMgbGlua2luZy4KKyMgVE9ETzogRW5hYmxlIGl0IG9uIEludGVsKFIpIE1hbnkgSW50ZWdyYXRlZCBDb3JlIEFyY2hpdGVjdHVyZSBhcyB3ZWxsLgoraWZlcSAiJChpZiAkKGZpbHRlciBsaW4sJChvcykpLG9zKS0kKExJTktfVFlQRSkiICJvcy1keW5hIgorCisgICAgdGVzdHMgKz0gdGVzdC1leGVjc3RhY2sKKworICAgICMgTWFrZSBzdXJlIHN0YWNrIGlzIG5vdCBleGVjdXRhYmxlLgorICAgIGZvcmNlLXRlc3QtZXhlY3N0YWNrIDogdGVzdC1leGVjc3RhY2svLmZvcmNlIHRlc3QtZXhlY3N0YWNrLy50ZXN0CisgICAgdGVzdC1leGVjc3RhY2sgICAgICAgOiB0ZXN0LWV4ZWNzdGFjay8udGVzdAorCisgICAgdGVzdC1leGVjc3RhY2svLnRlc3QgOiAkKGxpYl9pdGVtKSQoZGxsKSB0ZXN0LWV4ZWNzdGFjay8uZGlyIC5yZWJ1aWxkCisJICAgICQodGFyZ2V0KQorCSAgICAkKHBlcmwpICQodG9vbHNfZGlyKWNoZWNrLWV4ZWNzdGFjay5wbCAkPAorCSAgICAkKHRvdWNoKSAkQAorCitlbmRpZgorCisjIC0tLSB0ZXN0LWluc3RyIC0tLQorCisjIEJ1dCB0ZXN0LWluc3RyIGRvZXMgYWN0dWFsIHdvcmsgb25seSBvbiBJbnRlbChSKSBNYW55IEludGVncmF0ZWQgQ29yZSBBcmNoaXRlY3R1cmUuCitpZmVxICIkKG9zKSIgImxyYiIKKworICAgICMgTWFrZSBzdXJlIGR5bmFtaWMgbGlicmFyeSBkb2VzIG5vdCBjb250YWluIHBvc2l0aW9uLWRlcGVuZGVudCBjb2RlLgorICAgIGZvcmNlLXRlc3QtaW5zdHIgOiB0ZXN0LWluc3RyLy5mb3JjZSB0ZXN0LWluc3RyLy50ZXN0CisgICAgdGVzdC1pbnN0ciAgICAgICA6IHRlc3QtaW5zdHIvLnRlc3QKKworICAgIHRlc3QtaW5zdHIvLnRlc3QgOiAkKGxpYl9maWxlKSAkKHRvb2xzX2RpciljaGVjay1pbnN0cnVjdGlvbi1zZXQucGwgdGVzdC1pbnN0ci8uZGlyIC5yZWJ1aWxkCisJICAgICQodGFyZ2V0KQorCSAgICAkKHBlcmwpICQodG9vbHNfZGlyKWNoZWNrLWluc3RydWN0aW9uLXNldC5wbCAkKG9hLW9wdHMpIC0tc2hvdyAtLW1pYy1hcmNoPSQoTUlDX0FSQ0gpIC0tbWljLW9zPSQoTUlDX09TKSAkPAorCSAgICAkKHRvdWNoKSAkQAorCitlbmRpZgorCisjIC0tLSB0ZXN0LWRlcHMgLS0tCisKKyMgdGVzdC1kZXBzIGRvZXMgYWN0dWFsIHdvcmsgZm9yIGR5bWFuaWMgbGlua2luZyAoYWxsIE9TZXMpLCBhbmQgV2luZG93cyogT1MgKGFsbCBsaW5raW5nIHR5cGVzKS4KK2lmbmVxICIkKGZpbHRlciAlLWR5bmEgd2luLSUsJChvcyktJChMSU5LX1RZUEUpKSIgIiIKKworICAgIGZvcmNlLXRlc3QtZGVwcyA6IHRlc3QtZGVwcy8uZm9yY2UgdGVzdC1kZXBzLy50ZXN0CisgICAgdGVzdC1kZXBzICAgICAgIDogdGVzdC1kZXBzLy50ZXN0CisKKyAgICB0ZF9leHAgPQorICAgIGlmZXEgIiQob3MpIiAibGluIgorICAgICAgICBpZmVxICIkKGFyY2gpIiAiMzIiCisgICAgICAgICAgICB0ZF9leHAgKz0gbGliYy5zby42CisgICAgICAgICAgICB0ZF9leHAgKz0gbGQtbGludXguc28uMgorICAgICAgICBlbmRpZgorICAgICAgICBpZmVxICIkKGFyY2gpIiAiMzJlIgorICAgICAgICAgICAgdGRfZXhwICs9IGxpYmMuc28uNgorICAgICAgICAgICAgdGRfZXhwICs9IGxkLWxpbnV4LXg4Ni02NC5zby4yCisgICAgICAgIGVuZGlmCisgICAgICAgIGlmZXEgIiQoYXJjaCkiICI2NCIKKyAgICAgICAgICAgIHRkX2V4cCArPSBsaWJjLnNvLjYuMQorICAgICAgICBlbmRpZgorICAgICAgICBpZmVxICIkKGFyY2gpIiAiYXJtIgorICAgICAgICAgICAgdGRfZXhwICs9IGxpYmMuc28uNgorICAgICAgICAgICAgdGRfZXhwICs9IGxkLWxpbnV4LWFybWhmLnNvLjMKKyAgICAgICAgZW5kaWYKKyAgICAgICAgaWZlcSAiJChhcmNoKSIgInBwYzY0IgorICAgICAgICAgICAgdGRfZXhwICs9IGxpYmMuc28uNgorICAgICAgICAgICAgdGRfZXhwICs9IGxkNjQuc28uMQorICAgICAgICBlbmRpZgorICAgICAgICBpZmVxICIkKGFyY2gpIiAiYWFyY2giCisgICAgICAgICAgICB0ZF9leHAgKz0gbGliYy5zby42CisgICAgICAgICAgICB0ZF9leHAgKz0gbGQtbGludXgtYWFyY2g2NC5zby4xCisgICAgICAgIGVuZGlmCisgICAgICAgIGlmZXEgIiQoc3RkX2NwcF9saWIpIiAiMSIKKyAgICAgICAgICAgIHRkX2V4cCArPSBsaWJzdGRjKysuc28uNgorICAgICAgICBlbmRpZgorCisgICAgICAgIHRkX2V4cCArPSBsaWJkbC5zby4yCisgICAgICAgIHRkX2V4cCArPSBsaWJnY2Nfcy5zby4xCisgICAgICAgIGlmZXEgIiQoZmlsdGVyIDMyIDMyZSA2NCBwcGM2NCwkKGFyY2gpKSIgIiIKKyAgICAgICAgICAgIHRkX2V4cCArPSBsaWJmZmkuc28uNgorICAgICAgICAgICAgdGRfZXhwICs9IGxpYmZmaS5zby41CisgICAgICAgIGVuZGlmCisgICAgICAgIGlmbmVxICIkKExJQl9UWVBFKSIgInN0dWIiCisgICAgICAgICAgICB0ZF9leHAgKz0gbGlicHRocmVhZC5zby4wCisgICAgICAgIGVuZGlmCisgICAgZW5kaWYKKyAgICBpZmVxICIkKG9zKSIgImxyYiIKKyAgICAgICAgaWZlcSAiJChNSUNfT1MpIiAibGluIgorICAgICAgICAgICAgaWZlcSAiJChzdGRfY3BwX2xpYikiICIxIgorICAgICAgICAgICAgICAgIHRkX2V4cCArPSBsaWJzdGRjKysuc28uNgorICAgICAgICAgICAgZW5kaWYKKyAgICAgICAgICAgIGlmZXEgIiQoTUlDX0FSQ0gpIiAia25mIgorICAgICAgICAgICAgICAgIHRkX2V4cCArPSAibGQtbGludXgtbDFvbS5zby4yIgorICAgICAgICAgICAgICAgIHRkX2V4cCArPSBsaWJjLnNvLjYKKyAgICAgICAgICAgICAgICB0ZF9leHAgKz0gbGlicHRocmVhZC5zby4wCisgICAgICAgICAgICAgICAgdGRfZXhwICs9IGxpYmRsLnNvLjIKKyAgICAgICAgICAgICAgICB0ZF9leHAgKz0gbGliZ2NjX3Muc28uMQorICAgICAgICAgICAgZW5kaWYKKyAgICAgICAgICAgIGlmZXEgIiQoTUlDX0FSQ0gpIiAia25jIgorICAgICAgICAgICAgICAgIHRkX2V4cCArPSAibGQtbGludXgtazFvbS5zby4yIgorICAgICAgICAgICAgICAgIHRkX2V4cCArPSBsaWJjLnNvLjYKKyAgICAgICAgICAgICAgICB0ZF9leHAgKz0gbGliZGwuc28uMgorICAgICAgICAgICAgICAgIHRkX2V4cCArPSBsaWJwdGhyZWFkLnNvLjAKKyAgICAgICAgICAgIGVuZGlmCisgICAgICAgIGVuZGlmCisgICAgICAgIGlmZXEgIiQoTUlDX09TKSIgImJzZCIKKyAgICAgICAgICAgIHRkX2V4cCArPSBsaWJjLnNvLjcKKyAgICAgICAgICAgIHRkX2V4cCArPSBsaWJ0aHIuc28uMworICAgICAgICAgICAgdGRfZXhwICs9IGxpYnVud2luZC5zby41CisgICAgICAgIGVuZGlmCisgICAgZW5kaWYKKyAgICBpZmVxICIkKG9zKSIgIm1hYyIKKyMgICAgICAgIHRkX2V4cCArPSAvdXNyL2xpYi9saWJnY2Nfcy4xLmR5bGliCisgICAgICAgIHRkX2V4cCArPSAvdXNyL2xpYi9saWJTeXN0ZW0uQi5keWxpYgorICAgIGVuZGlmCisgICAgaWZlcSAiJChvcykiICJ3aW4iCisgICAgICAgIGlmZXEgIiQoTElOS19UWVBFKSIgImR5bmEiCisgICAgICAgICAgICB0ZF9leHAgKz0ga2VybmVsMzIuZGxsCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRkX2V4cCArPSB1dWlkCisgICAgICAgIGVuZGlmCisgICAgZW5kaWYKKworICAgIGlmZXEgIiQob21wX29zKSIgImZyZWVic2QiCisgICAgICAgIHRkX2V4cCA9IAorICAgICAgICB0ZF9leHAgKz0gbGliYy5zby43CisgICAgICAgIHRkX2V4cCArPSBsaWJ0aHIuc28uMworICAgICAgICB0ZF9leHAgKz0gbGlidW53aW5kLnNvLjUKKyAgICBlbmRpZgorCisgICAgdGVzdC1kZXBzLy50ZXN0IDogJChsaWJfZmlsZSkgJCh0b29sc19kaXIpY2hlY2stZGVwZW5kcy5wbCB0ZXN0LWRlcHMvLmRpciAucmVidWlsZAorCSAgICAkKHRhcmdldCkKKwkgICAgJCh0ZC1pKSQocGVybCkgJCh0b29sc19kaXIpY2hlY2stZGVwZW5kcy5wbCAkKG9hLW9wdHMpIFwKKwkJJChpZiAkKHRkX2V4cCksLS1leHBlY3RlZD0iJChzdWJzdCAkKHNwYWNlKSwkKGNvbW1hKSwkKHRkX2V4cCkpIikgJDwKKwkgICAgJCh0b3VjaCkgJEAKKworZW5kaWYKKworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEZvcnRyYW4gZmlsZXMuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpZmVxICIkKFRBUkdFVF9DT01QSUxFUikiICIxMSIKKyAgICBvbXBfbGliX2YgPSBvbXBfbGliLmYKK2VuZGlmCitpZmVxICIkKFRBUkdFVF9DT01QSUxFUikiICIxMiIKKyAgICBvbXBfbGliX2YgPSBvbXBfbGliLmY5MAorZW5kaWYKK2lmZXEgIiQob21wX2xpYl9mKSIgIiIKKyAgICAkKGVycm9yIG9tcF9saWJfZiBpcyBub3QgZGVmaW5lZCkKK2VuZGlmCitvbXBfbGliLm1vZCBvbXBfbGliX2tpbmRzLm1vZCA6ICQob21wX2xpYl9mKSAucmVidWlsZAorCSQodGFyZ2V0KQorCSQoZm9ydCkgJChmb3J0LWZsYWdzKSAkPAorCitvbXBfbGliLmggIDogZXYtZmxhZ3MgKz0gLUQgS01QX0lOVF9QVFJfS0lORD0iaW50X3B0cl9raW5kKCkiCitpb21wX2xpYi5oIDogZXYtZmxhZ3MgKz0gLUQgS01QX0lOVF9QVFJfS0lORD0kKGlmICQoZmlsdGVyIDMyLCQoYXJjaCkpLDQsOCkKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb21tb24gZmlsZXMuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NvbW1vbiA6ICQob3V0X2Ntbl9maWxlcykKKworY2xlYW4tY29tbW9uIDoKKwkkKHJtKSAkKG91dF9jbW5fZmlsZXMpCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRGVwZW5kZW5jeSBmaWxlcyBhbmQgY29tbW9uIHJ1bGVzLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisuUEhPTlkgOiBkZXAKK2RlcCAgICA6ICQoZGVwX2ZpbGVzKQorCSQodGFyZ2V0KQorCitpbmNsdWRlICQoTElCT01QX1dPUkspc3JjL3J1bGVzLm1rCisKKyMgSW5pdGlhdGUgcmVidWlsZCBpZiBhbnkgb2YgbWFrZWZpbGVzIG9yIGJ1aWxkIHNyaXB0IGlzIGNoYW5nZWQuCisjIFdoZW4gZGV2ZWxvcGluZyBtYWtlZmlsZXMsIGl0IGlzIHVzZWZ1bCB0byBjb21tZW50IGl0LCBvdGhlcndpc2UgbWFrZSB3aWxsIHBlcmZvcm0gZnVsbCByZWJ1aWxkCisjIG9uIGV2ZXJ5IGNoYW5nZSBvZiBtYWtlZmlsZXMuCisucmVidWlsZCA6ICQoTUFLRUZJTEVfTElTVCkgJCh0b29sc19kaXIpYnVpbGQucGwgJCh0b29sc19kaXIpbGliL0J1aWxkLnBtCisKK2lmZXEgIiQoY2xlYW4pIiAiIgorICAgICMgRG8gbm90IGluY2x1ZGUgZGVwZW5kZW5jeSBmaWxlcyBpZiAiY2xlYW4iIGdvYWwgaXMgc3BlY2lmaWVkLgorICAgIC1pbmNsdWRlICQoZGVwX2ZpbGVzKQorZW5kaWYKKworIyBlbmQgb2YgZmlsZSAjCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9ydWxlcy5tayBiL2ZpbmFsL3J1bnRpbWUvc3JjL3J1bGVzLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5ZjMwYmEKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9ydWxlcy5tawpAQCAtMCwwICsxLDkzIEBACisjIHJ1bGVzLm1rICMKKyMgJFJldmlzaW9uOiA0Mjk1MSAkCisjICREYXRlOiAyMDE0LTAxLTIxIDE0OjQxOjQxIC0wNjAwIChUdWUsIDIxIEphbiAyMDE0KSAkCisKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKKworIyAtLS0gQ29weSBmaWxlcyB0byBvdXQgZGlyZWN0b3JpZXMgLS0tCisKKyQob3V0X2Ntbl9kaXIpaW5jbHVkZS8lIDogJSAkKG91dF9jbW5fZGlyKWluY2x1ZGUvLmRpciAucmVidWlsZAorCSQodGFyZ2V0KQorCSQoY3ApICQ8ICRACisKKyQob3V0X2Ntbl9kaXIpaW5jbHVkZV9jb21wYXQvJSA6ICUgJChvdXRfY21uX2RpcilpbmNsdWRlX2NvbXBhdC8uZGlyIC5yZWJ1aWxkCisJJCh0YXJnZXQpCisJJChjcCkgJDwgJEAKKworIyBGYXQ6IHRvdWNoIC50b3VjaCBmaWxlIG9uIGV2ZXJ5IHVwZGF0ZSBpbiAkKG91dF9saWJfZGlyKSwgc28gd2Ugd2lsbCBrbm93IHNob3VsZCB3ZSB1cGRhdGUgZmF0CisjIGdvYWwgb3Igbm90LgorJChvdXRfbGliX2RpciklIDogJSAkKG91dF9saWJfZGlyKS5kaXIgLnJlYnVpbGQKKwkkKHRhcmdldCkKKwkkKGNwKSAkPCAkQAorICAgICAgICBpZm5lcSAiJChvdXRfbGliX2ZhdF9kaXIpIiAiIgorCSAgICAkKHRvdWNoKSAkKGRpciAkQCkudG91Y2gKKyAgICAgICAgZW5kaWYKKworJChvdXRfcHRmX2RpcilpbmNsdWRlLyUgOiAlICQob3V0X3B0Zl9kaXIpaW5jbHVkZS8uZGlyIC5yZWJ1aWxkCisJJCh0YXJnZXQpCisJJChjcCkgJDwgJEAKKworJChvdXRfcHRmX2RpcilpbmNsdWRlX2NvbXBhdC8lIDogJSAkKG91dF9wdGZfZGlyKWluY2x1ZGVfY29tcGF0Ly5kaXIgLnJlYnVpbGQKKwkkKHRhcmdldCkKKwkkKGNwKSAkPCAkQAorCiskKG91dF9sMTBuX2RpciklLyQoY2F0X2ZpbGUpIDogbDEwbi8lLyQoY2F0X2ZpbGUpICQob3V0X2wxMG5fZGlyKSUvLmRpciAucmVidWlsZAorCSQodGFyZ2V0KQorCSQoY3ApICQ8ICRACisKK2lmZXEgIiQob3MpIiAibWFjIgorICAgICQob3V0X2wxMG5fZmF0X2RpciklLyQoY2F0X2ZpbGUpIDogbDEwbi8lLyQoY2F0X2ZpbGUpICQob3V0X2wxMG5fZmF0X2RpciklLy5kaXIgLnJlYnVpbGQKKwkgICAgJCh0YXJnZXQpCisJICAgICQoY3ApICQ8ICRACitlbmRpZgorCisjIC0tLSBJbmNsdWRlIHJlYWxseSBjb21tb24gcnVsZXMgLS0tCisKK2luY2x1ZGUgJChMSUJPTVBfV09SSyl0b29scy9zcmMvY29tbW9uLXJ1bGVzLm1rCisKKyMgLS0tIEJ1aWxkaW5nIGhlbHBlciB0b29scyBmcm9tIHNvdXJjZXMgLS0tCisKKy5QUkVDSU9VUzogJSQoZXhlKSAgICAgICAgICAgICAgICAgICAgICMgRG8gbm90IGRlbGV0ZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgZmlsZXMuCisKKyUkKGV4ZSkgOiAkKHRvb2xzX2RpciklLmNwcCAucmVidWlsZAorCSQodGFyZ2V0KQorCSQoY3h4KSAkKGN4eC1vdXQpJEAgJDwKKworIyAtLS0gRmF0IGxpYnJhcmllcyAtLS0KKworIyBFdmVyeSB0aW1lIG5ldyBmaWxlIGlzIGNvcGllZCB0byAkKG91dF9saWJfZGlyKSBkaXJlY3Rvcnkgd2UgdXBkYXRlICQob3V0X2xpYl9kaXIpLnJlYnVpbGQgZmlsZSwKKyMgc28gd2Uga25vdyBzaG91bGQgd2UgcmVidWlsZCBmYXQgbGlicmFyaWVzIG9yIG5vdC4KKworIyBOb3RlOiBPcmlnaW5hbCBpbXBsZW1lbnRhdGlvbiBidWlsdCBmYXQgbGlicmFyaWVzIGluIG1hY18zMiBkaXJlY3RvcnksIHRoZW4gY29waWVkIGFsbCB0aGUKKyMgbGlicmFyaWVzIGZyb20gbWFjXzMyIHRvIG1hY18zMmUgZGlyZWN0b3J5LiBIb3dldmVyLCB0aGlzIG1heSB3b3JrIHdyb25nIGlmIGV4cG9ydHMvbWFjXyovbGliLworIyBjb250YWlucyBvdGhlciBsaWJyYXJpZXMuIFNvIG5vdyB3ZSBidWlsZCBmYXQgbGlicmFyaWVzIHR3aWNlOiBpbiBib3RoIG1hY18zMgorIyBhbmQgbWFjXzMyZSBkaXJlY3Rvcmllcy4KKworaWZlcSAiJChwbGF0Zm9ybSkiICJtYWNfMzJlIgorCisgICAgLlBIT05ZIDogZmF0CisgICAgZmF0ICAgIDogJChjYWxsIF9vdXRfbGliX2ZhdF9kaXIsbWFjXzMyKS5kb25lICQoY2FsbCBfb3V0X2xpYl9mYXRfZGlyLG1hY18zMmUpLmRvbmUKKworICAgICQoY2FsbCBfb3V0X2xpYl9mYXRfZGlyLG1hY18zMikuZG9uZSBcCisgICAgJChjYWxsIF9vdXRfbGliX2ZhdF9kaXIsbWFjXzMyZSkuZG9uZSA6IFwKKyAgICAgICAgJChjYWxsIF9vdXRfbGliX2RpcixtYWNfMzIpLnRvdWNoIFwKKyAgICAgICAgJChjYWxsIF9vdXRfbGliX2RpcixtYWNfMzJlKS50b3VjaCBcCisgICAgICAgICQodG9vbHNfZGlyKW1ha2UtZmF0LWJpbmFyaWVzLnBsIFwKKyAgICAgICAgJChjYWxsIF9vdXRfbGliX2ZhdF9kaXIsbWFjXzMyKS5kaXIgJChjYWxsIF9vdXRfbGliX2ZhdF9kaXIsbWFjXzMyZSkuZGlyIC5yZWJ1aWxkCisJICAgICQodGFyZ2V0KQorCSAgICAkKHBlcmwpICQodG9vbHNfZGlyKW1ha2UtZmF0LWJpbmFyaWVzLnBsIFwKKwkgICAgICAgIC0tb3V0cHV0PSQoZGlyICRAKSAkKGNhbGwgX291dF9saWJfZGlyLG1hY18zMikgJChjYWxsIF9vdXRfbGliX2RpcixtYWNfMzJlKQorCSAgICAkKHRvdWNoKSAkQAorCitlbmRpZgorCisjIGVuZCBvZiBmaWxlICMKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL3Rlc3QtdG91Y2guYyBiL2ZpbmFsL3J1bnRpbWUvc3JjL3Rlc3QtdG91Y2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2U1MjlhCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMvdGVzdC10b3VjaC5jCkBAIC0wLDAgKzEsMzEgQEAKKy8vIHRlc3QtdG91Y2guYyAvLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorZXh0ZXJuIGRvdWJsZSBvbXBfZ2V0X3d0aW1lKCk7CitleHRlcm4gaW50ICAgIG9tcF9nZXRfbnVtX3RocmVhZHMoKTsKK2V4dGVybiBpbnQgICAgb21wX2dldF9tYXhfdGhyZWFkcygpOworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworaW50IG1haW4oKSB7CisgICAgb21wX2dldF93dGltZSgpOworICAgIG9tcF9nZXRfbnVtX3RocmVhZHMoKTsKKyAgICBvbXBfZ2V0X21heF90aHJlYWRzKCk7CisgICAgcmV0dXJuIDA7Cit9CisKKy8vIGVuZCBvZiBmaWxlIC8vCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy90aGlyZHBhcnR5L2l0dG5vdGlmeS9kaXNhYmxlX3dhcm5pbmdzLmggYi9maW5hbC9ydW50aW1lL3NyYy90aGlyZHBhcnR5L2l0dG5vdGlmeS9kaXNhYmxlX3dhcm5pbmdzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIyNDJmZAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL3RoaXJkcGFydHkvaXR0bm90aWZ5L2Rpc2FibGVfd2FybmluZ3MuaApAQCAtMCwwICsxLDI5IEBACisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJpdHRub3RpZnlfY29uZmlnLmgiCisKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKworI3ByYWdtYSB3YXJuaW5nIChkaXNhYmxlOiA1OTMpICAgLyogcGFyYW1ldGVyICJYWFhYIiB3YXMgc2V0IGJ1dCBuZXZlciB1c2VkICAgICAgICAgICAgICAgICAqLworI3ByYWdtYSB3YXJuaW5nIChkaXNhYmxlOiAzNDQpICAgLyogdHlwZWRlZiBuYW1lIGhhcyBhbHJlYWR5IGJlZW4gZGVjbGFyZWQgKHdpdGggc2FtZSB0eXBlKSAqLworI3ByYWdtYSB3YXJuaW5nIChkaXNhYmxlOiAxNzQpICAgLyogZXhwcmVzc2lvbiBoYXMgbm8gZWZmZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI3ByYWdtYSB3YXJuaW5nIChkaXNhYmxlOiA0MTI3KSAgLyogY29uZGl0aW9uYWwgZXhwcmVzc2lvbiBpcyBjb25zdGFudCAgICAgICAgICAgICAgICAgICAgICAqLworI3ByYWdtYSB3YXJuaW5nIChkaXNhYmxlOiA0MzA2KSAgLyogY29udmVyc2lvbiBmcm9tICc/JyB0byAnPycgb2YgZ3JlYXRlciBzaXplICAgICAgICAgICAgICAqLworCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKKyNpZiBkZWZpbmVkIF9fSU5URUxfQ09NUElMRVIKKworI3ByYWdtYSB3YXJuaW5nIChkaXNhYmxlOiA4NjkpICAvKiBwYXJhbWV0ZXIgIlhYWFhYIiB3YXMgbmV2ZXIgcmVmZXJlbmNlZCAgICAgICAgICAgICAgICAgICovCisjcHJhZ21hIHdhcm5pbmcgKGRpc2FibGU6IDE0MTgpIC8qIGV4dGVybmFsIGZ1bmN0aW9uIGRlZmluaXRpb24gd2l0aCBubyBwcmlvciBkZWNsYXJhdGlvbiAgKi8KKyNwcmFnbWEgd2FybmluZyAoZGlzYWJsZTogMTQxOSkgLyogZXh0ZXJuYWwgZGVjbGFyYXRpb24gaW4gcHJpbWFyeSBzb3VyY2UgZmlsZSAgICAgICAgICAgICAqLworCisjZW5kaWYgLyogX19JTlRFTF9DT01QSUxFUiAqLwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMvdGhpcmRwYXJ0eS9pdHRub3RpZnkvaXR0bm90aWZ5LmggYi9maW5hbC9ydW50aW1lL3NyYy90aGlyZHBhcnR5L2l0dG5vdGlmeS9pdHRub3RpZnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDVkOGI3Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMvdGhpcmRwYXJ0eS9pdHRub3RpZnkvaXR0bm90aWZ5LmgKQEAgLTAsMCArMSwzODA0IEBACisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgX0lUVE5PVElGWV9IXworI2RlZmluZSBfSVRUTk9USUZZX0hfCisKKy8qKgorQGZpbGUKK0BicmllZiBQdWJsaWMgVXNlciBBUEkgZnVuY3Rpb25zIGFuZCB0eXBlcworQG1haW5wYWdlCisKK1RoZSBJVFQgQVBJIGlzIHVzZWQgdG8gYW5ub3RhdGUgYSB1c2VyJ3MgcHJvZ3JhbSB3aXRoIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3RoYXQgY2FuIGJlIHVzZWQgYnkgY29ycmVjdG5lc3MgYW5kIHBlcmZvcm1hbmNlIHRvb2xzLiBUaGUgdXNlciBpbnNlcnRzCitjYWxscyBpbiB0aGVpciBwcm9ncmFtLiBUaG9zZSBjYWxscyBnZW5lcmF0ZSBpbmZvcm1hdGlvbiB0aGF0IGlzIGNvbGxlY3RlZAorYXQgcnVudGltZSwgYW5kIHVzZWQgYnkgSW50ZWwoUikgVGhyZWFkaW5nIFRvb2xzLgorCitAc2VjdGlvbiBBUEkgQ29uY2VwdHMKK1RoZSBmb2xsb3dpbmcgZ2VuZXJhbCBjb25jZXB0cyBhcmUgdXNlZCB0aHJvdWdob3V0IHRoZSBBUEkuCisKK0BzdWJzZWN0aW9uIFVuaWNvZGUgU3VwcG9ydAorTWFueSBBUEkgZnVuY3Rpb25zIHRha2UgY2hhcmFjdGVyIHN0cmluZyBhcmd1bWVudHMuIE9uIFdpbmRvd3MsIHRoZXJlCithcmUgdHdvIHZlcnNpb25zIG9mIGVhY2ggc3VjaCBmdW5jdGlvbi4gVGhlIGZ1bmN0aW9uIG5hbWUgaXMgc3VmZml4ZWQKK2J5IFcgaWYgVW5pY29kZSBzdXBwb3J0IGlzIGVuYWJsZWQsIGFuZCBieSBBIG90aGVyd2lzZS4gQW55IEFQSSBmdW5jdGlvbgordGhhdCB0YWtlcyBhIGNoYXJhY3RlciBzdHJpbmcgYXJndW1lbnQgYWRoZXJlcyB0byB0aGlzIGNvbnZlbnRpb24uCisKK0BzdWJzZWN0aW9uIENvbmRpdGlvbmFsIENvbXBpbGF0aW9uCitNYW55IHVzZXJzIHByZWZlciBoYXZpbmcgYW4gb3B0aW9uIHRvIG1vZGlmeSBJVFQgQVBJIGNvZGUgd2hlbiBsaW5raW5nIGl0CitpbnNpZGUgdGhlaXIgcnVudGltZXMuIElUVCBBUEkgaGVhZGVyIGZpbGUgcHJvdmlkZXMgYSBtZWNoYW5pc20gdG8gcmVwbGFjZQorSVRUIEFQSSBmdW5jdGlvbiBuYW1lcyBpbnNpZGUgeW91ciBjb2RlIHdpdGggZW1wdHkgc3RyaW5ncy4gVG8gZG8gdGhpcywKK2RlZmluZSB0aGUgbWFjcm9zIElOVEVMX05PX0lUVE5PVElGWV9BUEkgZHVyaW5nIGNvbXBpbGF0aW9uIGFuZCByZW1vdmUgdGhlCitzdGF0aWMgbGlicmFyeSBmcm9tIHRoZSBsaW5rZXIgc2NyaXB0LgorCitAc3Vic2VjdGlvbiBEb21haW5zCitbc2VlIGRvbWFpbnNdCitEb21haW5zIHByb3ZpZGUgYSB3YXkgdG8gc2VwYXJhdGUgbm90aWZpY2F0aW9uIGZvciBkaWZmZXJlbnQgbW9kdWxlcyBvcgorbGlicmFyaWVzIGluIGEgcHJvZ3JhbS4gRG9tYWlucyBhcmUgc3BlY2lmaWVkIGJ5IGRvdHRlZCBjaGFyYWN0ZXIgc3RyaW5ncywKK2UuZy4gVEJCLkludGVybmFsLkNvbnRyb2wuCisKK0EgbWVjaGFuaXNtICh0byBiZSBzcGVjaWZpZWQpIGlzIHByb3ZpZGVkIHRvIGVuYWJsZSBhbmQgZGlzYWJsZQorZG9tYWlucy4gQnkgZGVmYXVsdCwgYWxsIGRvbWFpbnMgYXJlIGVuYWJsZWQuCitAc3Vic2VjdGlvbiBOYW1lZCBFbnRpdGllcyBhbmQgSW5zdGFuY2VzCitOYW1lZCBlbnRpdGllcyAoZnJhbWVzLCByZWdpb25zLCB0YXNrcywgYW5kIG1hcmtlcnMpIGNvbW11bmljYXRlCitpbmZvcm1hdGlvbiBhYm91dCB0aGUgcHJvZ3JhbSB0byB0aGUgYW5hbHlzaXMgdG9vbHMuIEEgbmFtZWQgZW50aXR5IG9mdGVuCityZWZlcnMgdG8gYSBzZWN0aW9uIG9mIHByb2dyYW0gY29kZSwgb3IgdG8gc29tZSBzZXQgb2YgbG9naWNhbCBjb25jZXB0cwordGhhdCB0aGUgcHJvZ3JhbW1lciB3YW50cyB0byBncm91cCB0b2dldGhlci4KKworTmFtZWQgZW50aXRpZXMgcmVsYXRlIHRvIHRoZSBwcm9ncmFtbWVyJ3Mgc3RhdGljIHZpZXcgb2YgdGhlIHByb2dyYW0uIFdoZW4KK3RoZSBwcm9ncmFtIGFjdHVhbGx5IGV4ZWN1dGVzLCBtYW55IGluc3RhbmNlcyBvZiBhIGdpdmVuIG5hbWVkIGVudGl0eQorbWF5IGJlIGNyZWF0ZWQuCisKK1RoZSBBUEkgYW5ub3RhdGlvbnMgZGVub3RlIGluc3RhbmNlcyBvZiBuYW1lZCBlbnRpdGllcy4gVGhlIGFjdHVhbAorbmFtZWQgZW50aXRpZXMgYXJlIGRpc3BsYXllZCB1c2luZyB0aGUgYW5hbHlzaXMgdG9vbHMuIEluIG90aGVyIHdvcmRzLAordGhlIG5hbWVkIGVudGl0aWVzIGNvbWUgaW50byBleGlzdGVuY2Ugd2hlbiBpbnN0YW5jZXMgYXJlIGNyZWF0ZWQuCisKK0luc3RhbmNlcyBvZiBuYW1lZCBlbnRpdGllcyBtYXkgaGF2ZSBpbnN0YW5jZSBpZGVudGlmaWVycyAoSURzKS4gU29tZQorQVBJIGNhbGxzIHVzZSBpbnN0YW5jZSBpZGVudGlmaWVycyB0byBjcmVhdGUgcmVsYXRpb25zaGlwcyBiZXR3ZWVuCitkaWZmZXJlbnQgaW5zdGFuY2VzIG9mIG5hbWVkIGVudGl0aWVzLiBPdGhlciBBUEkgY2FsbHMgYXNzb2NpYXRlIGRhdGEKK3dpdGggaW5zdGFuY2VzIG9mIG5hbWVkIGVudGl0aWVzLgorCitTb21lIG5hbWVkIGVudGl0aWVzIG11c3QgYWx3YXlzIGhhdmUgaW5zdGFuY2UgSURzLiBJbiBwYXJ0aWN1bGFyLCByZWdpb25zCithbmQgZnJhbWVzIGFsd2F5cyBoYXZlIElEcy4gVGFzayBhbmQgbWFya2VycyBuZWVkIElEcyBvbmx5IGlmIHRoZSBJRCBpcworbmVlZGVkIGluIGFub3RoZXIgQVBJIGNhbGwgKHN1Y2ggYXMgYWRkaW5nIGEgcmVsYXRpb24gb3IgbWV0YWRhdGEpLgorCitUaGUgbGlmZXRpbWUgb2YgaW5zdGFuY2UgSURzIGlzIGRpc3RpbmN0IGZyb20gdGhlIGxpZmV0aW1lIG9mCitpbnN0YW5jZXMuIFRoaXMgYWxsb3dzIHZhcmlvdXMgcmVsYXRpb25zaGlwcyB0byBiZSBzcGVjaWZpZWQgc2VwYXJhdGUKK2Zyb20gdGhlIGFjdHVhbCBleGVjdXRpb24gb2YgaW5zdGFuY2VzLiBUaGlzIGZsZXhpYmlsaXR5IGNvbWVzIGF0IHRoZQorZXhwZW5zZSBvZiBleHRyYSBBUEkgY2FsbHMuCisKK1RoZSBzYW1lIElEIG1heSBub3QgYmUgcmV1c2VkIGZvciBkaWZmZXJlbnQgaW5zdGFuY2VzLCB1bmxlc3MgYSBwcmV2aW91cworW3JlZl0gX19pdHRfaWRfZGVzdHJveSBjYWxsIGZvciB0aGF0IElEIGhhcyBiZWVuIGlzc3VlZC4KKyovCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJVFRfT1NfV0lOCisjICBkZWZpbmUgSVRUX09TX1dJTiAgIDEKKyNlbmRpZiAvKiBJVFRfT1NfV0lOICovCisKKyNpZm5kZWYgSVRUX09TX0xJTlVYCisjICBkZWZpbmUgSVRUX09TX0xJTlVYIDIKKyNlbmRpZiAvKiBJVFRfT1NfTElOVVggKi8KKworI2lmbmRlZiBJVFRfT1NfTUFDCisjICBkZWZpbmUgSVRUX09TX01BQyAgIDMKKyNlbmRpZiAvKiBJVFRfT1NfTUFDICovCisKKyNpZm5kZWYgSVRUX09TCisjICBpZiBkZWZpbmVkIFdJTjMyIHx8IGRlZmluZWQgX1dJTjMyCisjICAgIGRlZmluZSBJVFRfT1MgSVRUX09TX1dJTgorIyAgZWxpZiBkZWZpbmVkKCBfX0FQUExFX18gKSAmJiBkZWZpbmVkKCBfX01BQ0hfXyApCisjICAgIGRlZmluZSBJVFRfT1MgSVRUX09TX01BQworIyAgZWxzZQorIyAgICBkZWZpbmUgSVRUX09TIElUVF9PU19MSU5VWAorIyAgZW5kaWYKKyNlbmRpZiAvKiBJVFRfT1MgKi8KKworI2lmbmRlZiBJVFRfUExBVEZPUk1fV0lOCisjICBkZWZpbmUgSVRUX1BMQVRGT1JNX1dJTiAxCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNX1dJTiAqLworCisjaWZuZGVmIElUVF9QTEFURk9STV9QT1NJWAorIyAgZGVmaW5lIElUVF9QTEFURk9STV9QT1NJWCAyCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNX1BPU0lYICovCisKKyNpZm5kZWYgSVRUX1BMQVRGT1JNX01BQworIyAgZGVmaW5lIElUVF9QTEFURk9STV9NQUMgMworI2VuZGlmIC8qIElUVF9QTEFURk9STV9NQUMgKi8KKworI2lmbmRlZiBJVFRfUExBVEZPUk0KKyMgIGlmIElUVF9PUz09SVRUX09TX1dJTgorIyAgICBkZWZpbmUgSVRUX1BMQVRGT1JNIElUVF9QTEFURk9STV9XSU4KKyMgIGVsaWYgSVRUX09TPT1JVFRfT1NfTUFDCisjICAgIGRlZmluZSBJVFRfUExBVEZPUk0gSVRUX1BMQVRGT1JNX01BQworIyAgZWxzZQorIyAgICBkZWZpbmUgSVRUX1BMQVRGT1JNIElUVF9QTEFURk9STV9QT1NJWAorIyAgZW5kaWYKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk0gKi8KKworI2lmIGRlZmluZWQoX1VOSUNPREUpICYmICFkZWZpbmVkKFVOSUNPREUpCisjZGVmaW5lIFVOSUNPREUKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjaW5jbHVkZSA8dGNoYXIuaD4KKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpZiBkZWZpbmVkKFVOSUNPREUpIHx8IGRlZmluZWQoX1VOSUNPREUpCisjaW5jbHVkZSA8d2NoYXIuaD4KKyNlbmRpZiAvKiBVTklDT0RFIHx8IF9VTklDT0RFICovCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKKyNpZm5kZWYgQ0RFQ0wKKyMgIGlmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorIyAgICBkZWZpbmUgQ0RFQ0wgX19jZGVjbAorIyAgZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyMgICAgaWYgZGVmaW5lZCBfTV9JWDg2IHx8IGRlZmluZWQgX19pMzg2X18gCisjICAgICAgZGVmaW5lIENERUNMIF9fYXR0cmlidXRlX18gKChjZGVjbCkpCisjICAgIGVsc2UgIC8qIF9NX0lYODYgfHwgX19pMzg2X18gKi8KKyMgICAgICBkZWZpbmUgQ0RFQ0wgLyogYWN0dWFsIG9ubHkgb24geDg2IHBsYXRmb3JtICovCisjICAgIGVuZGlmIC8qIF9NX0lYODYgfHwgX19pMzg2X18gKi8KKyMgIGVuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIENERUNMICovCisKKyNpZm5kZWYgU1REQ0FMTAorIyAgaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjICAgIGRlZmluZSBTVERDQUxMIF9fc3RkY2FsbAorIyAgZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyMgICAgaWYgZGVmaW5lZCBfTV9JWDg2IHx8IGRlZmluZWQgX19pMzg2X18KKyMgICAgICBkZWZpbmUgU1REQ0FMTCBfX2F0dHJpYnV0ZV9fICgoc3RkY2FsbCkpIAorIyAgICBlbHNlICAvKiBfTV9JWDg2IHx8IF9faTM4Nl9fICovCisjICAgICAgZGVmaW5lIFNURENBTEwgLyogc3VwcG9ydGVkIG9ubHkgb24geDg2IHBsYXRmb3JtICovCisjICAgIGVuZGlmIC8qIF9NX0lYODYgfHwgX19pMzg2X18gKi8KKyMgIGVuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIFNURENBTEwgKi8KKworI2RlZmluZSBJVFRBUEkgICAgQ0RFQ0wKKyNkZWZpbmUgTElCSVRUQVBJIENERUNMCisKKy8qIFRPRE86IFRlbXBvcmFyeSBmb3IgY29tcGF0aWJpbGl0eSEgKi8KKyNkZWZpbmUgSVRUQVBJX0NBTEwgICAgQ0RFQ0wKKyNkZWZpbmUgTElCSVRUQVBJX0NBTEwgQ0RFQ0wKKworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorLyogdXNlIF9fZm9yY2VpbmxpbmUgKFZDKysgc3BlY2lmaWMpICovCisjZGVmaW5lIElUVF9JTkxJTkUgICAgICAgICAgIF9fZm9yY2VpbmxpbmUKKyNkZWZpbmUgSVRUX0lOTElORV9BVFRSSUJVVEUgLyogbm90aGluZyAqLworI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworLyoKKyAqIEdlbmVyYWxseSwgZnVuY3Rpb25zIGFyZSBub3QgaW5saW5lZCB1bmxlc3Mgb3B0aW1pemF0aW9uIGlzIHNwZWNpZmllZC4KKyAqIEZvciBmdW5jdGlvbnMgZGVjbGFyZWQgaW5saW5lLCB0aGlzIGF0dHJpYnV0ZSBpbmxpbmVzIHRoZSBmdW5jdGlvbiBldmVuCisgKiBpZiBubyBvcHRpbWl6YXRpb24gbGV2ZWwgd2FzIHNwZWNpZmllZC4KKyAqLworI2lmZGVmIF9fU1RSSUNUX0FOU0lfXworI2RlZmluZSBJVFRfSU5MSU5FICAgICAgICAgICBzdGF0aWMKKyNlbHNlICAvKiBfX1NUUklDVF9BTlNJX18gKi8KKyNkZWZpbmUgSVRUX0lOTElORSAgICAgICAgICAgc3RhdGljIGlubGluZQorI2VuZGlmIC8qIF9fU1RSSUNUX0FOU0lfXyAqLworI2RlZmluZSBJVFRfSU5MSU5FX0FUVFJJQlVURSBfX2F0dHJpYnV0ZV9fICgoYWx3YXlzX2lubGluZSwgdW51c2VkKSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKy8qKiBAZW5kY29uZCAqLworCisjaWZkZWYgSU5URUxfSVRUTk9USUZZX0VOQUJMRV9MRUdBQ1kKKyMgIGlmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorIyAgICBwcmFnbWEgbWVzc2FnZSgiV0FSTklORyEhISBEZXByZWNhdGVkIEFQSSBpcyB1c2VkLiBQbGVhc2UgdW5kZWZpbmUgSU5URUxfSVRUTk9USUZZX0VOQUJMRV9MRUdBQ1kgbWFjcm8iKQorIyAgZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyMgICAgd2FybmluZyAiRGVwcmVjYXRlZCBBUEkgaXMgdXNlZC4gUGxlYXNlIHVuZGVmaW5lIElOVEVMX0lUVE5PVElGWV9FTkFCTEVfTEVHQUNZIG1hY3JvIgorIyAgZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjICBpbmNsdWRlICJsZWdhY3kvaXR0bm90aWZ5LmgiCisjZW5kaWYgLyogSU5URUxfSVRUTk9USUZZX0VOQUJMRV9MRUdBQ1kgKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisvKiBIZWxwZXIgbWFjcm8gZm9yIGpvaW5pbmcgdG9rZW5zICovCisjZGVmaW5lIElUVF9KT0lOX0FVWChwLG4pIHAjI24KKyNkZWZpbmUgSVRUX0pPSU4ocCxuKSAgICAgSVRUX0pPSU5fQVVYKHAsbikKKworI2lmZGVmIElUVF9NQUpPUgorI3VuZGVmIElUVF9NQUpPUgorI2VuZGlmCisjaWZkZWYgSVRUX01JTk9SCisjdW5kZWYgSVRUX01JTk9SCisjZW5kaWYKKyNkZWZpbmUgSVRUX01BSk9SICAgICAzCisjZGVmaW5lIElUVF9NSU5PUiAgICAgMAorCisvKiBTdGFuZGFyZCB2ZXJzaW9uaW5nIG9mIGEgdG9rZW4gd2l0aCBtYWpvciBhbmQgbWlub3IgdmVyc2lvbiBudW1iZXJzICovCisjZGVmaW5lIElUVF9WRVJTSU9OSVpFKHgpICAgIFwKKyAgICBJVFRfSk9JTih4LCAgICAgICAgICAgICAgXAorICAgIElUVF9KT0lOKF8sICAgICAgICAgICAgICBcCisgICAgSVRUX0pPSU4oSVRUX01BSk9SLCAgICAgIFwKKyAgICBJVFRfSk9JTihfLCBJVFRfTUlOT1IpKSkpCisKKyNpZm5kZWYgSU5URUxfSVRUTk9USUZZX1BSRUZJWAorIyAgZGVmaW5lIElOVEVMX0lUVE5PVElGWV9QUkVGSVggX19pdHRfCisjZW5kaWYgLyogSU5URUxfSVRUTk9USUZZX1BSRUZJWCAqLworI2lmbmRlZiBJTlRFTF9JVFROT1RJRllfUE9TVEZJWAorIyAgZGVmaW5lIElOVEVMX0lUVE5PVElGWV9QT1NURklYIF9wdHJfCisjZW5kaWYgLyogSU5URUxfSVRUTk9USUZZX1BPU1RGSVggKi8KKworI2RlZmluZSBJVFROT1RJRllfTkFNRV9BVVgobikgSVRUX0pPSU4oSU5URUxfSVRUTk9USUZZX1BSRUZJWCxuKQorI2RlZmluZSBJVFROT1RJRllfTkFNRShuKSAgICAgSVRUX1ZFUlNJT05JWkUoSVRUTk9USUZZX05BTUVfQVVYKElUVF9KT0lOKG4sSU5URUxfSVRUTk9USUZZX1BPU1RGSVgpKSkKKworI2RlZmluZSBJVFROT1RJRllfVk9JRChuKSAoIUlUVE5PVElGWV9OQU1FKG4pKSA/ICh2b2lkKTAgOiBJVFROT1RJRllfTkFNRShuKQorI2RlZmluZSBJVFROT1RJRllfREFUQShuKSAoIUlUVE5PVElGWV9OQU1FKG4pKSA/ICAgICAgIDAgOiBJVFROT1RJRllfTkFNRShuKQorCisjZGVmaW5lIElUVE5PVElGWV9WT0lEX0QwKG4sZCkgICAgICAgKCEoZCktPmZsYWdzKSA/ICh2b2lkKTAgOiAoIUlUVE5PVElGWV9OQU1FKG4pKSA/ICh2b2lkKTAgOiBJVFROT1RJRllfTkFNRShuKShkKQorI2RlZmluZSBJVFROT1RJRllfVk9JRF9EMShuLGQseCkgICAgICghKGQpLT5mbGFncykgPyAodm9pZCkwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAodm9pZCkwIDogSVRUTk9USUZZX05BTUUobikoZCx4KQorI2RlZmluZSBJVFROT1RJRllfVk9JRF9EMihuLGQseCx5KSAgICghKGQpLT5mbGFncykgPyAodm9pZCkwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAodm9pZCkwIDogSVRUTk9USUZZX05BTUUobikoZCx4LHkpCisjZGVmaW5lIElUVE5PVElGWV9WT0lEX0QzKG4sZCx4LHkseikgKCEoZCktPmZsYWdzKSA/ICh2b2lkKTAgOiAoIUlUVE5PVElGWV9OQU1FKG4pKSA/ICh2b2lkKTAgOiBJVFROT1RJRllfTkFNRShuKShkLHgseSx6KQorI2RlZmluZSBJVFROT1RJRllfVk9JRF9ENChuLGQseCx5LHosYSkgICAgICghKGQpLT5mbGFncykgPyAodm9pZCkwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAodm9pZCkwIDogSVRUTk9USUZZX05BTUUobikoZCx4LHkseixhKQorI2RlZmluZSBJVFROT1RJRllfVk9JRF9ENShuLGQseCx5LHosYSxiKSAgICghKGQpLT5mbGFncykgPyAodm9pZCkwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAodm9pZCkwIDogSVRUTk9USUZZX05BTUUobikoZCx4LHkseixhLGIpCisjZGVmaW5lIElUVE5PVElGWV9WT0lEX0Q2KG4sZCx4LHkseixhLGIsYykgKCEoZCktPmZsYWdzKSA/ICh2b2lkKTAgOiAoIUlUVE5PVElGWV9OQU1FKG4pKSA/ICh2b2lkKTAgOiBJVFROT1RJRllfTkFNRShuKShkLHgseSx6LGEsYixjKQorI2RlZmluZSBJVFROT1RJRllfREFUQV9EMChuLGQpICAgICAgICghKGQpLT5mbGFncykgPyAgICAgICAwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAgICAgICAwIDogSVRUTk9USUZZX05BTUUobikoZCkKKyNkZWZpbmUgSVRUTk9USUZZX0RBVEFfRDEobixkLHgpICAgICAoIShkKS0+ZmxhZ3MpID8gICAgICAgMCA6ICghSVRUTk9USUZZX05BTUUobikpID8gICAgICAgMCA6IElUVE5PVElGWV9OQU1FKG4pKGQseCkKKyNkZWZpbmUgSVRUTk9USUZZX0RBVEFfRDIobixkLHgseSkgICAoIShkKS0+ZmxhZ3MpID8gICAgICAgMCA6ICghSVRUTk9USUZZX05BTUUobikpID8gICAgICAgMCA6IElUVE5PVElGWV9OQU1FKG4pKGQseCx5KQorI2RlZmluZSBJVFROT1RJRllfREFUQV9EMyhuLGQseCx5LHopICghKGQpLT5mbGFncykgPyAgICAgICAwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAgICAgICAwIDogSVRUTk9USUZZX05BTUUobikoZCx4LHkseikKKyNkZWZpbmUgSVRUTk9USUZZX0RBVEFfRDQobixkLHgseSx6LGEpICAgICAoIShkKS0+ZmxhZ3MpID8gMCA6ICghSVRUTk9USUZZX05BTUUobikpID8gICAgICAgMCA6IElUVE5PVElGWV9OQU1FKG4pKGQseCx5LHosYSkKKyNkZWZpbmUgSVRUTk9USUZZX0RBVEFfRDUobixkLHgseSx6LGEsYikgICAoIShkKS0+ZmxhZ3MpID8gMCA6ICghSVRUTk9USUZZX05BTUUobikpID8gICAgICAgMCA6IElUVE5PVElGWV9OQU1FKG4pKGQseCx5LHosYSxiKQorI2RlZmluZSBJVFROT1RJRllfREFUQV9ENihuLGQseCx5LHosYSxiLGMpICghKGQpLT5mbGFncykgPyAwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAgICAgICAwIDogSVRUTk9USUZZX05BTUUobikoZCx4LHkseixhLGIsYykKKworI2lmZGVmIElUVF9TVFVCCisjdW5kZWYgSVRUX1NUVUIKKyNlbmRpZgorI2lmZGVmIElUVF9TVFVCVgorI3VuZGVmIElUVF9TVFVCVgorI2VuZGlmCisjZGVmaW5lIElUVF9TVFVCVihhcGksdHlwZSxuYW1lLGFyZ3MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdHlwZWRlZiB0eXBlIChhcGkqIElUVF9KT0lOKElUVE5PVElGWV9OQU1FKG5hbWUpLF90KSkgYXJnczsgICBcCisgICAgZXh0ZXJuIElUVF9KT0lOKElUVE5PVElGWV9OQU1FKG5hbWUpLF90KSBJVFROT1RJRllfTkFNRShuYW1lKTsKKyNkZWZpbmUgSVRUX1NUVUIgSVRUX1NUVUJWCisvKiogQGVuZGNvbmQgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2dwYV9kb2N1bWVudGF0aW9uICovCisvKioKKyAqIEBkZWZncm91cCBwdWJsaWMgUHVibGljIEFQSQorICogQHsKKyAqIEB9CisgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgY29udHJvbCBDb2xsZWN0aW9uIENvbnRyb2wKKyAqIEBpbmdyb3VwIHB1YmxpYworICogR2VuZXJhbCBiZWhhdmlvcjogYXBwbGljYXRpb24gY29udGludWVzIHRvIHJ1biwgYnV0IG5vIHByb2ZpbGluZyBpbmZvcm1hdGlvbiBpcyBiZWluZyBjb2xsZWN0ZWQKKyAqCisgKiBQYXVzaW5nIG9jY3VycyBub3Qgb25seSBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkIGJ1dCBmb3IgYWxsIHByb2Nlc3MgYXMgd2VsbCBhcyBzcGF3bmVkIHByb2Nlc3NlcworICogLSBJbnRlbChSKSBQYXJhbGxlbCBJbnNwZWN0b3IgYW5kIEludGVsKFIpIEluc3BlY3RvciBYRToKKyAqICAgLSBEb2VzIG5vdCBhbmFseXplIG9yIHJlcG9ydCBlcnJvcnMgdGhhdCBpbnZvbHZlIG1lbW9yeSBhY2Nlc3MuCisgKiAgIC0gT3RoZXIgZXJyb3JzIGFyZSByZXBvcnRlZCBhcyB1c3VhbC4gUGF1c2luZyBkYXRhIGNvbGxlY3Rpb24gaW4KKyAqICAgICBJbnRlbChSKSBQYXJhbGxlbCBJbnNwZWN0b3IgYW5kIEludGVsKFIpIEluc3BlY3RvciBYRQorICogICAgIG9ubHkgcGF1c2VzIHRyYWNpbmcgYW5kIGFuYWx5emluZyBtZW1vcnkgYWNjZXNzLgorICogICAgIEl0IGRvZXMgbm90IHBhdXNlIHRyYWNpbmcgb3IgYW5hbHl6aW5nIHRocmVhZGluZyBBUElzLgorICogICAuCisgKiAtIEludGVsKFIpIFBhcmFsbGVsIEFtcGxpZmllciBhbmQgSW50ZWwoUikgVlR1bmUoVE0pIEFtcGxpZmllciBYRToKKyAqICAgLSBEb2VzIGNvbnRpbnVlIHRvIHJlY29yZCB3aGVuIG5ldyB0aHJlYWRzIGFyZSBzdGFydGVkLgorICogICAuCisgKiAtIE90aGVyIGVmZmVjdHM6CisgKiAgIC0gUG9zc2libGUgcmVkdWN0aW9uIG9mIHJ1bnRpbWUgb3ZlcmhlYWQuCisgKiAgIC4KKyAqIEB7CisgKi8KKy8qKiBAYnJpZWYgUGF1c2UgY29sbGVjdGlvbiAqLwordm9pZCBJVFRBUEkgX19pdHRfcGF1c2Uodm9pZCk7CisvKiogQGJyaWVmIFJlc3VtZSBjb2xsZWN0aW9uICovCit2b2lkIElUVEFQSSBfX2l0dF9yZXN1bWUodm9pZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHBhdXNlLCAgKHZvaWQpKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgcmVzdW1lLCAodm9pZCkpCisjZGVmaW5lIF9faXR0X3BhdXNlICAgICAgSVRUTk9USUZZX1ZPSUQocGF1c2UpCisjZGVmaW5lIF9faXR0X3BhdXNlX3B0ciAgSVRUTk9USUZZX05BTUUocGF1c2UpCisjZGVmaW5lIF9faXR0X3Jlc3VtZSAgICAgSVRUTk9USUZZX1ZPSUQocmVzdW1lKQorI2RlZmluZSBfX2l0dF9yZXN1bWVfcHRyIElUVE5PVElGWV9OQU1FKHJlc3VtZSkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X3BhdXNlKCkKKyNkZWZpbmUgX19pdHRfcGF1c2VfcHRyICAwCisjZGVmaW5lIF9faXR0X3Jlc3VtZSgpCisjZGVmaW5lIF9faXR0X3Jlc3VtZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X3BhdXNlX3B0ciAgMAorI2RlZmluZSBfX2l0dF9yZXN1bWVfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKy8qKiBAfSBjb250cm9sIGdyb3VwICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgdGhyZWFkcyBUaHJlYWRzCisgKiBAaW5ncm91cCBwdWJsaWMKKyAqIEdpdmUgbmFtZXMgdG8gdGhyZWFkcworICogQHsKKyAqLworLyoqCisgKiBAYnJpZWYgU2V0cyB0aHJlYWQgbmFtZSBvZiBjYWxsaW5nIHRocmVhZAorICogQHBhcmFtW2luXSBuYW1lIC0gbmFtZSBvZiB0aHJlYWQKKyAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgordm9pZCBJVFRBUEkgX19pdHRfdGhyZWFkX3NldF9uYW1lQShjb25zdCBjaGFyICAgICpuYW1lKTsKK3ZvaWQgSVRUQVBJIF9faXR0X3RocmVhZF9zZXRfbmFtZVcoY29uc3Qgd2NoYXJfdCAqbmFtZSk7CisjaWYgZGVmaW5lZChVTklDT0RFKSB8fCBkZWZpbmVkKF9VTklDT0RFKQorIyAgZGVmaW5lIF9faXR0X3RocmVhZF9zZXRfbmFtZSAgICAgX19pdHRfdGhyZWFkX3NldF9uYW1lVworIyAgZGVmaW5lIF9faXR0X3RocmVhZF9zZXRfbmFtZV9wdHIgX19pdHRfdGhyZWFkX3NldF9uYW1lV19wdHIKKyNlbHNlIC8qIFVOSUNPREUgKi8KKyMgIGRlZmluZSBfX2l0dF90aHJlYWRfc2V0X25hbWUgICAgIF9faXR0X3RocmVhZF9zZXRfbmFtZUEKKyMgIGRlZmluZSBfX2l0dF90aHJlYWRfc2V0X25hbWVfcHRyIF9faXR0X3RocmVhZF9zZXRfbmFtZUFfcHRyCisjZW5kaWYgLyogVU5JQ09ERSAqLworI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLwordm9pZCBJVFRBUEkgX19pdHRfdGhyZWFkX3NldF9uYW1lKGNvbnN0IGNoYXIgKm5hbWUpOworI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCB0aHJlYWRfc2V0X25hbWVBLCAoY29uc3QgY2hhciAgICAqbmFtZSkpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCB0aHJlYWRfc2V0X25hbWVXLCAoY29uc3Qgd2NoYXJfdCAqbmFtZSkpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCB0aHJlYWRfc2V0X25hbWUsICAoY29uc3QgY2hhciAgICAqbmFtZSkpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X3RocmVhZF9zZXRfbmFtZUEgICAgIElUVE5PVElGWV9WT0lEKHRocmVhZF9zZXRfbmFtZUEpCisjZGVmaW5lIF9faXR0X3RocmVhZF9zZXRfbmFtZUFfcHRyIElUVE5PVElGWV9OQU1FKHRocmVhZF9zZXRfbmFtZUEpCisjZGVmaW5lIF9faXR0X3RocmVhZF9zZXRfbmFtZVcgICAgIElUVE5PVElGWV9WT0lEKHRocmVhZF9zZXRfbmFtZVcpCisjZGVmaW5lIF9faXR0X3RocmVhZF9zZXRfbmFtZVdfcHRyIElUVE5PVElGWV9OQU1FKHRocmVhZF9zZXRfbmFtZVcpCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfdGhyZWFkX3NldF9uYW1lICAgICBJVFROT1RJRllfVk9JRCh0aHJlYWRfc2V0X25hbWUpCisjZGVmaW5lIF9faXR0X3RocmVhZF9zZXRfbmFtZV9wdHIgSVRUTk9USUZZX05BTUUodGhyZWFkX3NldF9uYW1lKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfdGhyZWFkX3NldF9uYW1lQShuYW1lKQorI2RlZmluZSBfX2l0dF90aHJlYWRfc2V0X25hbWVBX3B0ciAwCisjZGVmaW5lIF9faXR0X3RocmVhZF9zZXRfbmFtZVcobmFtZSkKKyNkZWZpbmUgX19pdHRfdGhyZWFkX3NldF9uYW1lV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X3RocmVhZF9zZXRfbmFtZShuYW1lKQorI2RlZmluZSBfX2l0dF90aHJlYWRfc2V0X25hbWVfcHRyIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF90aHJlYWRfc2V0X25hbWVBX3B0ciAwCisjZGVmaW5lIF9faXR0X3RocmVhZF9zZXRfbmFtZVdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF90aHJlYWRfc2V0X25hbWVfcHRyIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9ncGFfZG9jdW1lbnRhdGlvbiAqLworCisvKioKKyAqIEBicmllZiBNYXJrIGN1cnJlbnQgdGhyZWFkIGFzIGlnbm9yZWQgZnJvbSB0aGlzIHBvaW50IG9uLCBmb3IgdGhlIGR1cmF0aW9uIG9mIGl0cyBleGlzdGVuY2UuCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3RocmVhZF9pZ25vcmUodm9pZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHRocmVhZF9pZ25vcmUsICh2b2lkKSkKKyNkZWZpbmUgX19pdHRfdGhyZWFkX2lnbm9yZSAgICAgSVRUTk9USUZZX1ZPSUQodGhyZWFkX2lnbm9yZSkKKyNkZWZpbmUgX19pdHRfdGhyZWFkX2lnbm9yZV9wdHIgSVRUTk9USUZZX05BTUUodGhyZWFkX2lnbm9yZSkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X3RocmVhZF9pZ25vcmUoKQorI2RlZmluZSBfX2l0dF90aHJlYWRfaWdub3JlX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfdGhyZWFkX2lnbm9yZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworLyoqIEB9IHRocmVhZHMgZ3JvdXAgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgc3VwcHJlc3MgRXJyb3Igc3VwcHJlc3Npb24KKyAqIEBpbmdyb3VwIHB1YmxpYworICogR2VuZXJhbCBiZWhhdmlvcjogYXBwbGljYXRpb24gY29udGludWVzIHRvIHJ1biwgYnV0IGVycm9ycyBhcmUgc3VwcHJlc3NlZAorICoKKyAqIEB7CisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLy8qKgorICogQG5hbWUgZ3JvdXAgb2YgZnVuY3Rpb25zIHVzZWQgZm9yIGVycm9yIHN1cHByZXNzaW9uIGluIGNvcnJlY3RuZXNzIHRvb2xzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqIEB7ICovCisvKioKKyAqIEBoaWRlaW5pdGlhbGl6ZXIgCisgKiBAYnJpZWYgcG9zc2libGUgdmFsdWUgZm9yIHN1cHByZXNzaW9uIG1hc2sKKyAqLworI2RlZmluZSBfX2l0dF9zdXBwcmVzc19hbGxfZXJyb3JzIDB4N2ZmZmZmZmYKKworLyoqCisgKiBAaGlkZWluaXRpYWxpemVyIAorICogQGJyaWVmIHBvc3NpYmxlIHZhbHVlIGZvciBzdXBwcmVzc2lvbiBtYXNrIChzdXBwcmVzc2VzIGVycm9ycyBmcm9tIHRocmVhZGluZyBhbmFseXNpcykKKyAqLworI2RlZmluZSBfX2l0dF9zdXBwcmVzc190aHJlYWRpbmdfZXJyb3JzIDB4MDAwMDAwZmYKKworLyoqCisgKiBAaGlkZWluaXRpYWxpemVyIAorICogQGJyaWVmIHBvc3NpYmxlIHZhbHVlIGZvciBzdXBwcmVzc2lvbiBtYXNrIChzdXBwcmVzc2VzIGVycm9ycyBmcm9tIG1lbW9yeSBhbmFseXNpcykKKyAqLworI2RlZmluZSBfX2l0dF9zdXBwcmVzc19tZW1vcnlfZXJyb3JzIDB4MDAwMGZmMDAKKworLyoqCisgKiBAYnJpZWYgU3RhcnQgc3VwcHJlc3NpbmcgZXJyb3JzIGlkZW50aWZpZWQgaW4gbWFzayBvbiB0aGlzIHRocmVhZAorICovCit2b2lkIElUVEFQSSBfX2l0dF9zdXBwcmVzc19wdXNoKHVuc2lnbmVkIGludCBtYXNrKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3VwcHJlc3NfcHVzaCwgKHVuc2lnbmVkIGludCBtYXNrKSkKKyNkZWZpbmUgX19pdHRfc3VwcHJlc3NfcHVzaCAgICAgSVRUTk9USUZZX1ZPSUQoc3VwcHJlc3NfcHVzaCkKKyNkZWZpbmUgX19pdHRfc3VwcHJlc3NfcHVzaF9wdHIgSVRUTk9USUZZX05BTUUoc3VwcHJlc3NfcHVzaCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X3N1cHByZXNzX3B1c2gobWFzaykKKyNkZWZpbmUgX19pdHRfc3VwcHJlc3NfcHVzaF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X3N1cHByZXNzX3B1c2hfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgVW5kbyB0aGUgZWZmZWN0cyBvZiB0aGUgbWF0Y2hpbmcgY2FsbCB0byBfX2l0dF9zdXBwcmVzc19wdXNoICAKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfc3VwcHJlc3NfcG9wKHZvaWQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzdXBwcmVzc19wb3AsICh2b2lkKSkKKyNkZWZpbmUgX19pdHRfc3VwcHJlc3NfcG9wICAgICBJVFROT1RJRllfVk9JRChzdXBwcmVzc19wb3ApCisjZGVmaW5lIF9faXR0X3N1cHByZXNzX3BvcF9wdHIgSVRUTk9USUZZX05BTUUoc3VwcHJlc3NfcG9wKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfc3VwcHJlc3NfcG9wKCkKKyNkZWZpbmUgX19pdHRfc3VwcHJlc3NfcG9wX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfc3VwcHJlc3NfcG9wX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGVudW0gX19pdHRfbW9kZWxfZGlzYWJsZQorICogQGJyaWVmIEVudW1lcmF0b3IgZm9yIHRoZSBkaXNhYmxlIG1ldGhvZHMKKyAqLwordHlwZWRlZiBlbnVtIF9faXR0X3N1cHByZXNzX21vZGUgeworICAgIF9faXR0X3Vuc3VwcHJlc3NfcmFuZ2UsCisgICAgX19pdHRfc3VwcHJlc3NfcmFuZ2UKK30gX19pdHRfc3VwcHJlc3NfbW9kZV90OworCisvKioKKyAqIEBicmllZiBNYXJrIGEgcmFuZ2Ugb2YgbWVtb3J5IGZvciBlcnJvciBzdXBwcmVzc2lvbiBvciB1bnN1cHByZXNzaW9uIGZvciBlcnJvciB0eXBlcyBpbmNsdWRlZCBpbiBtYXNrCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3N1cHByZXNzX21hcmtfcmFuZ2UoX19pdHRfc3VwcHJlc3NfbW9kZV90IG1vZGUsIHVuc2lnbmVkIGludCBtYXNrLCB2b2lkICogYWRkcmVzcywgc2l6ZV90IHNpemUpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzdXBwcmVzc19tYXJrX3JhbmdlLCAoX19pdHRfc3VwcHJlc3NfbW9kZV90IG1vZGUsIHVuc2lnbmVkIGludCBtYXNrLCB2b2lkICogYWRkcmVzcywgc2l6ZV90IHNpemUpKQorI2RlZmluZSBfX2l0dF9zdXBwcmVzc19tYXJrX3JhbmdlICAgICBJVFROT1RJRllfVk9JRChzdXBwcmVzc19tYXJrX3JhbmdlKQorI2RlZmluZSBfX2l0dF9zdXBwcmVzc19tYXJrX3JhbmdlX3B0ciBJVFROT1RJRllfTkFNRShzdXBwcmVzc19tYXJrX3JhbmdlKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfc3VwcHJlc3NfbWFya19yYW5nZShtYXNrKQorI2RlZmluZSBfX2l0dF9zdXBwcmVzc19tYXJrX3JhbmdlX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfc3VwcHJlc3NfbWFya19yYW5nZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBVbmRvIHRoZSBlZmZlY3Qgb2YgYSBtYXRjaGluZyBjYWxsIHRvIF9faXR0X3N1cHByZXNzX21hcmtfcmFuZ2UuICAgSWYgbm90IG1hdGNoaW5nCisgKiAgICAgICAgY2FsbCBpcyBmb3VuZCwgbm90aGluZyBpcyBjaGFuZ2VkLgorICovCit2b2lkIElUVEFQSSBfX2l0dF9zdXBwcmVzc19jbGVhcl9yYW5nZShfX2l0dF9zdXBwcmVzc19tb2RlX3QgbW9kZSwgdW5zaWduZWQgaW50IG1hc2ssIHZvaWQgKiBhZGRyZXNzLCBzaXplX3Qgc2l6ZSk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN1cHByZXNzX2NsZWFyX3JhbmdlLCAoX19pdHRfc3VwcHJlc3NfbW9kZV90IG1vZGUsIHVuc2lnbmVkIGludCBtYXNrLCB2b2lkICogYWRkcmVzcywgc2l6ZV90IHNpemUpKQorI2RlZmluZSBfX2l0dF9zdXBwcmVzc19jbGVhcl9yYW5nZSAgICAgSVRUTk9USUZZX1ZPSUQoc3VwcHJlc3NfY2xlYXJfcmFuZ2UpCisjZGVmaW5lIF9faXR0X3N1cHByZXNzX2NsZWFyX3JhbmdlX3B0ciBJVFROT1RJRllfTkFNRShzdXBwcmVzc19jbGVhcl9yYW5nZSkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X3N1cHByZXNzX2NsZWFyX3JhbmdlKG1hc2spCisjZGVmaW5lIF9faXR0X3N1cHByZXNzX2NsZWFyX3JhbmdlX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfc3VwcHJlc3NfY2xlYXJfcmFuZ2VfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKy8qKiBAfSAqLworLyoqIEB9IHN1cHByZXNzIGdyb3VwICovCisKKy8qKgorICogQGRlZmdyb3VwIHN5bmMgU3luY2hyb25pemF0aW9uCisgKiBAaW5ncm91cCBwdWJsaWMKKyAqIEluZGljYXRlIHVzZXItd3JpdHRlbiBzeW5jaHJvbml6YXRpb24gY29kZQorICogQHsKKyAqLworLyoqCisgKiBAaGlkZWluaXRpYWxpemVyCisgKiBAYnJpZWYgcG9zc2libGUgdmFsdWUgb2YgYXR0cmlidXRlIGFyZ3VtZW50IGZvciBzeW5jIG9iamVjdCB0eXBlCisgKi8KKyNkZWZpbmUgX19pdHRfYXR0cl9iYXJyaWVyIDEKKworLyoqCisgKiBAaGlkZWluaXRpYWxpemVyCisgKiBAYnJpZWYgcG9zc2libGUgdmFsdWUgb2YgYXR0cmlidXRlIGFyZ3VtZW50IGZvciBzeW5jIG9iamVjdCB0eXBlCisgKi8KKyNkZWZpbmUgX19pdHRfYXR0cl9tdXRleCAgIDIKKworLyoqCitAYnJpZWYgTmFtZSBhIHN5bmNocm9uaXphdGlvbiBvYmplY3QKK0BwYXJhbVtpbl0gYWRkciAgICAgICBIYW5kbGUgZm9yIHRoZSBzeW5jaHJvbml6YXRpb24gb2JqZWN0LiBZb3Ugc2hvdWxkCit1c2UgYSByZWFsIGFkZHJlc3MgdG8gdW5pcXVlbHkgaWRlbnRpZnkgdGhlIHN5bmNocm9uaXphdGlvbiBvYmplY3QuCitAcGFyYW1baW5dIG9ianR5cGUgICAgbnVsbC10ZXJtaW5hdGVkIG9iamVjdCB0eXBlIHN0cmluZy4gSWYgTlVMTCBpcworcGFzc2VkLCB0aGUgbmFtZSB3aWxsIGJlICJVc2VyIFN5bmNocm9uaXphdGlvbiIuCitAcGFyYW1baW5dIG9iam5hbWUgICAgbnVsbC10ZXJtaW5hdGVkIG9iamVjdCBuYW1lIHN0cmluZy4gSWYgTlVMTCwKK25vIG5hbWUgd2lsbCBiZSBhc3NpZ25lZCB0byB0aGUgb2JqZWN0LgorQHBhcmFtW2luXSBhdHRyaWJ1dGUgIG9uZSBvZiBbI19faXR0X2F0dHJfYmFycmllciwgI19faXR0X2F0dHJfbXV0ZXhdCisgKi8KKworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgordm9pZCBJVFRBUEkgX19pdHRfc3luY19jcmVhdGVBKHZvaWQgKmFkZHIsIGNvbnN0IGNoYXIgICAgKm9ianR5cGUsIGNvbnN0IGNoYXIgICAgKm9iam5hbWUsIGludCBhdHRyaWJ1dGUpOwordm9pZCBJVFRBUEkgX19pdHRfc3luY19jcmVhdGVXKHZvaWQgKmFkZHIsIGNvbnN0IHdjaGFyX3QgKm9ianR5cGUsIGNvbnN0IHdjaGFyX3QgKm9iam5hbWUsIGludCBhdHRyaWJ1dGUpOworI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKyMgIGRlZmluZSBfX2l0dF9zeW5jX2NyZWF0ZSAgICAgX19pdHRfc3luY19jcmVhdGVXCisjICBkZWZpbmUgX19pdHRfc3luY19jcmVhdGVfcHRyIF9faXR0X3N5bmNfY3JlYXRlV19wdHIKKyNlbHNlIC8qIFVOSUNPREUgKi8KKyMgIGRlZmluZSBfX2l0dF9zeW5jX2NyZWF0ZSAgICAgX19pdHRfc3luY19jcmVhdGVBCisjICBkZWZpbmUgX19pdHRfc3luY19jcmVhdGVfcHRyIF9faXR0X3N5bmNfY3JlYXRlQV9wdHIKKyNlbmRpZiAvKiBVTklDT0RFICovCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3N5bmNfY3JlYXRlICh2b2lkICphZGRyLCBjb25zdCBjaGFyICpvYmp0eXBlLCBjb25zdCBjaGFyICpvYmpuYW1lLCBpbnQgYXR0cmlidXRlKTsKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3luY19jcmVhdGVBLCAodm9pZCAqYWRkciwgY29uc3QgY2hhciAgICAqb2JqdHlwZSwgY29uc3QgY2hhciAgICAqb2JqbmFtZSwgaW50IGF0dHJpYnV0ZSkpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzeW5jX2NyZWF0ZVcsICh2b2lkICphZGRyLCBjb25zdCB3Y2hhcl90ICpvYmp0eXBlLCBjb25zdCB3Y2hhcl90ICpvYmpuYW1lLCBpbnQgYXR0cmlidXRlKSkKKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN5bmNfY3JlYXRlLCAgKHZvaWQgKmFkZHIsIGNvbnN0IGNoYXIqICAgIG9ianR5cGUsIGNvbnN0IGNoYXIqICAgIG9iam5hbWUsIGludCBhdHRyaWJ1dGUpKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9zeW5jX2NyZWF0ZUEgICAgIElUVE5PVElGWV9WT0lEKHN5bmNfY3JlYXRlQSkKKyNkZWZpbmUgX19pdHRfc3luY19jcmVhdGVBX3B0ciBJVFROT1RJRllfTkFNRShzeW5jX2NyZWF0ZUEpCisjZGVmaW5lIF9faXR0X3N5bmNfY3JlYXRlVyAgICAgSVRUTk9USUZZX1ZPSUQoc3luY19jcmVhdGVXKQorI2RlZmluZSBfX2l0dF9zeW5jX2NyZWF0ZVdfcHRyIElUVE5PVElGWV9OQU1FKHN5bmNfY3JlYXRlVykKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9zeW5jX2NyZWF0ZSAgICAgSVRUTk9USUZZX1ZPSUQoc3luY19jcmVhdGUpCisjZGVmaW5lIF9faXR0X3N5bmNfY3JlYXRlX3B0ciBJVFROT1RJRllfTkFNRShzeW5jX2NyZWF0ZSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X3N5bmNfY3JlYXRlQShhZGRyLCBvYmp0eXBlLCBvYmpuYW1lLCBhdHRyaWJ1dGUpCisjZGVmaW5lIF9faXR0X3N5bmNfY3JlYXRlQV9wdHIgMAorI2RlZmluZSBfX2l0dF9zeW5jX2NyZWF0ZVcoYWRkciwgb2JqdHlwZSwgb2JqbmFtZSwgYXR0cmlidXRlKQorI2RlZmluZSBfX2l0dF9zeW5jX2NyZWF0ZVdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9zeW5jX2NyZWF0ZShhZGRyLCBvYmp0eXBlLCBvYmpuYW1lLCBhdHRyaWJ1dGUpCisjZGVmaW5lIF9faXR0X3N5bmNfY3JlYXRlX3B0ciAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfc3luY19jcmVhdGVBX3B0ciAwCisjZGVmaW5lIF9faXR0X3N5bmNfY3JlYXRlV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X3N5bmNfY3JlYXRlX3B0ciAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorQGJyaWVmIFJlbmFtZSBhIHN5bmNocm9uaXphdGlvbiBvYmplY3QKKworWW91IGNhbiB1c2UgdGhlIHJlbmFtZSBjYWxsIHRvIGFzc2lnbiBvciByZWFzc2lnbiBhIG5hbWUgdG8gYSBnaXZlbgorc3luY2hyb25pemF0aW9uIG9iamVjdC4KK0BwYXJhbVtpbl0gYWRkciAgaGFuZGxlIGZvciB0aGUgc3luY2hyb25pemF0aW9uIG9iamVjdC4KK0BwYXJhbVtpbl0gbmFtZSAgbnVsbC10ZXJtaW5hdGVkIG9iamVjdCBuYW1lIHN0cmluZy4KKyovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCit2b2lkIElUVEFQSSBfX2l0dF9zeW5jX3JlbmFtZUEodm9pZCAqYWRkciwgY29uc3QgY2hhciAgICAqbmFtZSk7Cit2b2lkIElUVEFQSSBfX2l0dF9zeW5jX3JlbmFtZVcodm9pZCAqYWRkciwgY29uc3Qgd2NoYXJfdCAqbmFtZSk7CisjaWYgZGVmaW5lZChVTklDT0RFKSB8fCBkZWZpbmVkKF9VTklDT0RFKQorIyAgZGVmaW5lIF9faXR0X3N5bmNfcmVuYW1lICAgICBfX2l0dF9zeW5jX3JlbmFtZVcKKyMgIGRlZmluZSBfX2l0dF9zeW5jX3JlbmFtZV9wdHIgX19pdHRfc3luY19yZW5hbWVXX3B0cgorI2Vsc2UgLyogVU5JQ09ERSAqLworIyAgZGVmaW5lIF9faXR0X3N5bmNfcmVuYW1lICAgICBfX2l0dF9zeW5jX3JlbmFtZUEKKyMgIGRlZmluZSBfX2l0dF9zeW5jX3JlbmFtZV9wdHIgX19pdHRfc3luY19yZW5hbWVBX3B0cgorI2VuZGlmIC8qIFVOSUNPREUgKi8KKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLwordm9pZCBJVFRBUEkgX19pdHRfc3luY19yZW5hbWUodm9pZCAqYWRkciwgY29uc3QgY2hhciAqbmFtZSk7CisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN5bmNfcmVuYW1lQSwgKHZvaWQgKmFkZHIsIGNvbnN0IGNoYXIgICAgKm5hbWUpKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3luY19yZW5hbWVXLCAodm9pZCAqYWRkciwgY29uc3Qgd2NoYXJfdCAqbmFtZSkpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzeW5jX3JlbmFtZSwgICh2b2lkICphZGRyLCBjb25zdCBjaGFyICAgICpuYW1lKSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfc3luY19yZW5hbWVBICAgICBJVFROT1RJRllfVk9JRChzeW5jX3JlbmFtZUEpCisjZGVmaW5lIF9faXR0X3N5bmNfcmVuYW1lQV9wdHIgSVRUTk9USUZZX05BTUUoc3luY19yZW5hbWVBKQorI2RlZmluZSBfX2l0dF9zeW5jX3JlbmFtZVcgICAgIElUVE5PVElGWV9WT0lEKHN5bmNfcmVuYW1lVykKKyNkZWZpbmUgX19pdHRfc3luY19yZW5hbWVXX3B0ciBJVFROT1RJRllfTkFNRShzeW5jX3JlbmFtZVcpCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfc3luY19yZW5hbWUgICAgIElUVE5PVElGWV9WT0lEKHN5bmNfcmVuYW1lKQorI2RlZmluZSBfX2l0dF9zeW5jX3JlbmFtZV9wdHIgSVRUTk9USUZZX05BTUUoc3luY19yZW5hbWUpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9zeW5jX3JlbmFtZUEoYWRkciwgbmFtZSkKKyNkZWZpbmUgX19pdHRfc3luY19yZW5hbWVBX3B0ciAwCisjZGVmaW5lIF9faXR0X3N5bmNfcmVuYW1lVyhhZGRyLCBuYW1lKQorI2RlZmluZSBfX2l0dF9zeW5jX3JlbmFtZVdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9zeW5jX3JlbmFtZShhZGRyLCBuYW1lKQorI2RlZmluZSBfX2l0dF9zeW5jX3JlbmFtZV9wdHIgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X3N5bmNfcmVuYW1lQV9wdHIgMAorI2RlZmluZSBfX2l0dF9zeW5jX3JlbmFtZVdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9zeW5jX3JlbmFtZV9wdHIgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyBAYnJpZWYgRGVzdHJveSBhIHN5bmNocm9uaXphdGlvbiBvYmplY3QuCisgQHBhcmFtIGFkZHIgSGFuZGxlIGZvciB0aGUgc3luY2hyb25pemF0aW9uIG9iamVjdC4KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfc3luY19kZXN0cm95KHZvaWQgKmFkZHIpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzeW5jX2Rlc3Ryb3ksICh2b2lkICphZGRyKSkKKyNkZWZpbmUgX19pdHRfc3luY19kZXN0cm95ICAgICBJVFROT1RJRllfVk9JRChzeW5jX2Rlc3Ryb3kpCisjZGVmaW5lIF9faXR0X3N5bmNfZGVzdHJveV9wdHIgSVRUTk9USUZZX05BTUUoc3luY19kZXN0cm95KQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfc3luY19kZXN0cm95KGFkZHIpCisjZGVmaW5lIF9faXR0X3N5bmNfZGVzdHJveV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X3N5bmNfZGVzdHJveV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovLyoqCisgKiBAbmFtZSBncm91cCBvZiBmdW5jdGlvbnMgaXMgdXNlZCBmb3IgcGVyZm9ybWFuY2UgbWVhc3VyZW1lbnQgdG9vbHMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiogQHsgKi8KKy8qKgorICogQGJyaWVmIEVudGVyIHNwaW4gbG9vcCBvbiB1c2VyLWRlZmluZWQgc3luYyBvYmplY3QKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfc3luY19wcmVwYXJlKHZvaWQqIGFkZHIpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzeW5jX3ByZXBhcmUsICh2b2lkICphZGRyKSkKKyNkZWZpbmUgX19pdHRfc3luY19wcmVwYXJlICAgICBJVFROT1RJRllfVk9JRChzeW5jX3ByZXBhcmUpCisjZGVmaW5lIF9faXR0X3N5bmNfcHJlcGFyZV9wdHIgSVRUTk9USUZZX05BTUUoc3luY19wcmVwYXJlKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfc3luY19wcmVwYXJlKGFkZHIpCisjZGVmaW5lIF9faXR0X3N5bmNfcHJlcGFyZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X3N5bmNfcHJlcGFyZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBRdWl0IHNwaW4gbG9vcCB3aXRob3V0IGFjcXVpcmluZyBzcGluIG9iamVjdAorICovCit2b2lkIElUVEFQSSBfX2l0dF9zeW5jX2NhbmNlbCh2b2lkICphZGRyKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3luY19jYW5jZWwsICh2b2lkICphZGRyKSkKKyNkZWZpbmUgX19pdHRfc3luY19jYW5jZWwgICAgIElUVE5PVElGWV9WT0lEKHN5bmNfY2FuY2VsKQorI2RlZmluZSBfX2l0dF9zeW5jX2NhbmNlbF9wdHIgSVRUTk9USUZZX05BTUUoc3luY19jYW5jZWwpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9zeW5jX2NhbmNlbChhZGRyKQorI2RlZmluZSBfX2l0dF9zeW5jX2NhbmNlbF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X3N5bmNfY2FuY2VsX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIFN1Y2Nlc3NmdWwgc3BpbiBsb29wIGNvbXBsZXRpb24gKHN5bmMgb2JqZWN0IGFjcXVpcmVkKQorICovCit2b2lkIElUVEFQSSBfX2l0dF9zeW5jX2FjcXVpcmVkKHZvaWQgKmFkZHIpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzeW5jX2FjcXVpcmVkLCAodm9pZCAqYWRkcikpCisjZGVmaW5lIF9faXR0X3N5bmNfYWNxdWlyZWQgICAgIElUVE5PVElGWV9WT0lEKHN5bmNfYWNxdWlyZWQpCisjZGVmaW5lIF9faXR0X3N5bmNfYWNxdWlyZWRfcHRyIElUVE5PVElGWV9OQU1FKHN5bmNfYWNxdWlyZWQpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9zeW5jX2FjcXVpcmVkKGFkZHIpCisjZGVmaW5lIF9faXR0X3N5bmNfYWNxdWlyZWRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9zeW5jX2FjcXVpcmVkX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIFN0YXJ0IHN5bmMgb2JqZWN0IHJlbGVhc2luZyBjb2RlLiBJcyBjYWxsZWQgYmVmb3JlIHRoZSBsb2NrIHJlbGVhc2UgY2FsbC4KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfc3luY19yZWxlYXNpbmcodm9pZCogYWRkcik7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN5bmNfcmVsZWFzaW5nLCAodm9pZCAqYWRkcikpCisjZGVmaW5lIF9faXR0X3N5bmNfcmVsZWFzaW5nICAgICBJVFROT1RJRllfVk9JRChzeW5jX3JlbGVhc2luZykKKyNkZWZpbmUgX19pdHRfc3luY19yZWxlYXNpbmdfcHRyIElUVE5PVElGWV9OQU1FKHN5bmNfcmVsZWFzaW5nKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfc3luY19yZWxlYXNpbmcoYWRkcikKKyNkZWZpbmUgX19pdHRfc3luY19yZWxlYXNpbmdfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9zeW5jX3JlbGVhc2luZ19wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworLyoqIEB9ICovCisKKy8qKiBAfSBzeW5jIGdyb3VwICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8vKioKKyAqIEBuYW1lIGdyb3VwIG9mIGZ1bmN0aW9ucyBpcyB1c2VkIGZvciBjb3JyZWN0bmVzcyBjaGVja2luZyB0b29scworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiBAeyAqLworLyoqCisgKiBAaW5ncm91cCBsZWdhY3kKKyAqIEBkZXByZWNhdGVkIExlZ2FjeSBBUEkKKyAqIEBicmllZiBGYXN0IHN5bmNocm9uaXphdGlvbiB3aGljaCBkb2VzIG5vIHJlcXVpcmUgc3Bpbm5pbmcuCisgKiAtIFRoaXMgc3BlY2lhbCBmdW5jdGlvbiBpcyB0byBiZSB1c2VkIGJ5IFRCQiBhbmQgT3Blbk1QIGxpYnJhcmllcyBvbmx5IHdoZW4gdGhleSBrbm93CisgKiAgIHRoZXJlIGlzIG5vIHNwaW4gYnV0IHRoZXkgbmVlZCB0byBzdXBwcmVzcyBUQyB3YXJuaW5ncyBhYm91dCBzaGFyZWQgdmFyaWFibGUgbW9kaWZpY2F0aW9ucy4KKyAqIC0gSXQgb25seSBoYXMgY29ycmVzcG9uZGluZyBwb2ludGVycyBpbiBzdGF0aWMgbGlicmFyeSBhbmQgZG9lcyBub3QgaGF2ZSBjb3JyZXNwb25kaW5nIGZ1bmN0aW9uCisgKiAgIGluIGR5bmFtaWMgbGlicmFyeS4KKyAqIEBzZWUgdm9pZCBfX2l0dF9zeW5jX3ByZXBhcmUodm9pZCogYWRkcik7CisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X2ZzeW5jX3ByZXBhcmUodm9pZCogYWRkcik7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGZzeW5jX3ByZXBhcmUsICh2b2lkICphZGRyKSkKKyNkZWZpbmUgX19pdHRfZnN5bmNfcHJlcGFyZSAgICAgSVRUTk9USUZZX1ZPSUQoZnN5bmNfcHJlcGFyZSkKKyNkZWZpbmUgX19pdHRfZnN5bmNfcHJlcGFyZV9wdHIgSVRUTk9USUZZX05BTUUoZnN5bmNfcHJlcGFyZSkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2ZzeW5jX3ByZXBhcmUoYWRkcikKKyNkZWZpbmUgX19pdHRfZnN5bmNfcHJlcGFyZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X2ZzeW5jX3ByZXBhcmVfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAaW5ncm91cCBsZWdhY3kKKyAqIEBkZXByZWNhdGVkIExlZ2FjeSBBUEkKKyAqIEBicmllZiBGYXN0IHN5bmNocm9uaXphdGlvbiB3aGljaCBkb2VzIG5vIHJlcXVpcmUgc3Bpbm5pbmcuCisgKiAtIFRoaXMgc3BlY2lhbCBmdW5jdGlvbiBpcyB0byBiZSB1c2VkIGJ5IFRCQiBhbmQgT3Blbk1QIGxpYnJhcmllcyBvbmx5IHdoZW4gdGhleSBrbm93CisgKiAgIHRoZXJlIGlzIG5vIHNwaW4gYnV0IHRoZXkgbmVlZCB0byBzdXBwcmVzcyBUQyB3YXJuaW5ncyBhYm91dCBzaGFyZWQgdmFyaWFibGUgbW9kaWZpY2F0aW9ucy4KKyAqIC0gSXQgb25seSBoYXMgY29ycmVzcG9uZGluZyBwb2ludGVycyBpbiBzdGF0aWMgbGlicmFyeSBhbmQgZG9lcyBub3QgaGF2ZSBjb3JyZXNwb25kaW5nIGZ1bmN0aW9uCisgKiAgIGluIGR5bmFtaWMgbGlicmFyeS4KKyAqIEBzZWUgdm9pZCBfX2l0dF9zeW5jX2NhbmNlbCh2b2lkICphZGRyKTsKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfZnN5bmNfY2FuY2VsKHZvaWQgKmFkZHIpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBmc3luY19jYW5jZWwsICh2b2lkICphZGRyKSkKKyNkZWZpbmUgX19pdHRfZnN5bmNfY2FuY2VsICAgICBJVFROT1RJRllfVk9JRChmc3luY19jYW5jZWwpCisjZGVmaW5lIF9faXR0X2ZzeW5jX2NhbmNlbF9wdHIgSVRUTk9USUZZX05BTUUoZnN5bmNfY2FuY2VsKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfZnN5bmNfY2FuY2VsKGFkZHIpCisjZGVmaW5lIF9faXR0X2ZzeW5jX2NhbmNlbF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X2ZzeW5jX2NhbmNlbF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBpbmdyb3VwIGxlZ2FjeQorICogQGRlcHJlY2F0ZWQgTGVnYWN5IEFQSQorICogQGJyaWVmIEZhc3Qgc3luY2hyb25pemF0aW9uIHdoaWNoIGRvZXMgbm8gcmVxdWlyZSBzcGlubmluZy4KKyAqIC0gVGhpcyBzcGVjaWFsIGZ1bmN0aW9uIGlzIHRvIGJlIHVzZWQgYnkgVEJCIGFuZCBPcGVuTVAgbGlicmFyaWVzIG9ubHkgd2hlbiB0aGV5IGtub3cKKyAqICAgdGhlcmUgaXMgbm8gc3BpbiBidXQgdGhleSBuZWVkIHRvIHN1cHByZXNzIFRDIHdhcm5pbmdzIGFib3V0IHNoYXJlZCB2YXJpYWJsZSBtb2RpZmljYXRpb25zLgorICogLSBJdCBvbmx5IGhhcyBjb3JyZXNwb25kaW5nIHBvaW50ZXJzIGluIHN0YXRpYyBsaWJyYXJ5IGFuZCBkb2VzIG5vdCBoYXZlIGNvcnJlc3BvbmRpbmcgZnVuY3Rpb24KKyAqICAgaW4gZHluYW1pYyBsaWJyYXJ5LgorICogQHNlZSB2b2lkIF9faXR0X3N5bmNfYWNxdWlyZWQodm9pZCAqYWRkcik7CisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X2ZzeW5jX2FjcXVpcmVkKHZvaWQgKmFkZHIpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBmc3luY19hY3F1aXJlZCwgKHZvaWQgKmFkZHIpKQorI2RlZmluZSBfX2l0dF9mc3luY19hY3F1aXJlZCAgICAgSVRUTk9USUZZX1ZPSUQoZnN5bmNfYWNxdWlyZWQpCisjZGVmaW5lIF9faXR0X2ZzeW5jX2FjcXVpcmVkX3B0ciBJVFROT1RJRllfTkFNRShmc3luY19hY3F1aXJlZCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2ZzeW5jX2FjcXVpcmVkKGFkZHIpCisjZGVmaW5lIF9faXR0X2ZzeW5jX2FjcXVpcmVkX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfZnN5bmNfYWNxdWlyZWRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAaW5ncm91cCBsZWdhY3kKKyAqIEBkZXByZWNhdGVkIExlZ2FjeSBBUEkKKyAqIEBicmllZiBGYXN0IHN5bmNocm9uaXphdGlvbiB3aGljaCBkb2VzIG5vIHJlcXVpcmUgc3Bpbm5pbmcuCisgKiAtIFRoaXMgc3BlY2lhbCBmdW5jdGlvbiBpcyB0byBiZSB1c2VkIGJ5IFRCQiBhbmQgT3Blbk1QIGxpYnJhcmllcyBvbmx5IHdoZW4gdGhleSBrbm93CisgKiAgIHRoZXJlIGlzIG5vIHNwaW4gYnV0IHRoZXkgbmVlZCB0byBzdXBwcmVzcyBUQyB3YXJuaW5ncyBhYm91dCBzaGFyZWQgdmFyaWFibGUgbW9kaWZpY2F0aW9ucy4KKyAqIC0gSXQgb25seSBoYXMgY29ycmVzcG9uZGluZyBwb2ludGVycyBpbiBzdGF0aWMgbGlicmFyeSBhbmQgZG9lcyBub3QgaGF2ZSBjb3JyZXNwb25kaW5nIGZ1bmN0aW9uCisgKiAgIGluIGR5bmFtaWMgbGlicmFyeS4KKyAqIEBzZWUgdm9pZCBfX2l0dF9zeW5jX3JlbGVhc2luZyh2b2lkKiBhZGRyKTsKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfZnN5bmNfcmVsZWFzaW5nKHZvaWQqIGFkZHIpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBmc3luY19yZWxlYXNpbmcsICh2b2lkICphZGRyKSkKKyNkZWZpbmUgX19pdHRfZnN5bmNfcmVsZWFzaW5nICAgICBJVFROT1RJRllfVk9JRChmc3luY19yZWxlYXNpbmcpCisjZGVmaW5lIF9faXR0X2ZzeW5jX3JlbGVhc2luZ19wdHIgSVRUTk9USUZZX05BTUUoZnN5bmNfcmVsZWFzaW5nKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfZnN5bmNfcmVsZWFzaW5nKGFkZHIpCisjZGVmaW5lIF9faXR0X2ZzeW5jX3JlbGVhc2luZ19wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X2ZzeW5jX3JlbGVhc2luZ19wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworLyoqIEB9ICovCisKKy8qKgorICogQGRlZmdyb3VwIG1vZGVsIE1vZGVsaW5nIGJ5IEludGVsKFIpIFBhcmFsbGVsIEFkdmlzb3IKKyAqIEBpbmdyb3VwIHB1YmxpYworICogVGhpcyBpcyB0aGUgc3Vic2V0IG9mIGl0dCB1c2VkIGZvciBtb2RlbGluZyBieSBJbnRlbChSKSBQYXJhbGxlbCBBZHZpc29yLgorICogVGhpcyBBUEkgaXMgY2FsbGVkIE9OTFkgdXNpbmcgYW5ub3RhdGUuaCwgYnkgIkFubm90YXRpb24iIG1hY3JvcworICogdGhlIHVzZXIgcGxhY2VzIGluIHRoZWlyIHNvdXJjZXMgZHVyaW5nIHRoZSBwYXJhbGxlbGlzbSBtb2RlbGluZyBzdGVwcy4KKyAqCisgKiBzaXRlX2JlZ2luL2VuZCBhbmQgdGFza19iZWdpbi9lbmQgdGFrZSB0aGUgYWRkcmVzcyBvZiBoYW5kbGUgdmFyaWFibGVzLAorICogd2hpY2ggYXJlIHdyaXRlYWJsZSBieSB0aGUgQVBJLiAgSGFuZGxlcyBtdXN0IGJlIDAgaW5pdGlhbGl6ZWQgcHJpb3IKKyAqIHRvIHRoZSBmaXJzdCBjYWxsIHRvIGJlZ2luLCBvciBtYXkgY2F1c2UgYSBydW4tdGltZSBmYWlsdXJlLgorICogVGhlIGhhbmRsZXMgYXJlIGluaXRpYWxpemVkIGluIGEgbXVsdGktdGhyZWFkIHNhZmUgd2F5IGJ5IHRoZSBBUEkgaWYKKyAqIHRoZSBoYW5kbGUgaXMgMC4gIFRoZSBjb21tb25seSBleHBlY3RlZCBpZGlvbSBpcyBvbmUgc3RhdGljIGhhbmRsZSB0bworICogaWRlbnRpZnkgYSBzaXRlIG9yIHRhc2suICBJZiBhIHNpdGUgb3IgdGFzayBvZiB0aGUgc2FtZSBuYW1lIGhhcyBhbHJlYWR5CisgKiBiZWVuIHN0YXJ0ZWQgZHVyaW5nIHRoaXMgY29sbGVjdGlvbiwgdGhlIHNhbWUgaGFuZGxlIE1BWSBiZSByZXR1cm5lZCwKKyAqIGJ1dCBpcyBub3QgcmVxdWlyZWQgdG8gYmUgLSBpdCBpcyB1bnNwZWNpZmllZCBpZiBkYXRhIG1lcmdpbmcgaXMgZG9uZQorICogYmFzZWQgb24gbmFtZS4gIFRoZXNlIHJvdXRpbmVzIGFsc28gdGFrZSBhbiBpbnN0YW5jZSB2YXJpYWJsZS4gIExpa2UKKyAqIHRoZSBsZXhpY2FsIGluc3RhbmNlLCB0aGVzZSBtdXN0IGJlIDAgaW5pdGlhbGl6ZWQuICBVbmxpa2UgdGhlIGxleGljYWwKKyAqIGluc3RhbmNlLCB0aGlzIGlzIHVzZWQgdG8gdHJhY2sgYSBzaW5nbGUgZHluYW1pYyBpbnN0YW5jZS4KKyAqCisgKiBBUEkgdXNlZCBieSB0aGUgSW50ZWwoUikgUGFyYWxsZWwgQWR2aXNvciB0byBkZXNjcmliZSBwb3RlbnRpYWwgY29uY3VycmVuY3kKKyAqIGFuZCByZWxhdGVkIGFjdGl2aXRpZXMuIFVzZXItYWRkZWQgc291cmNlIGFubm90YXRpb25zIGV4cGFuZCB0byBjYWxscworICogdG8gdGhlc2UgcHJvY2VkdXJlcyB0byBlbmFibGUgbW9kZWxpbmcgb2YgYSBoeXBvdGhldGljYWwgY29uY3VycmVudAorICogZXhlY3V0aW9uIHNlcmlhbGx5LgorICogQHsKKyAqLworI2lmICFkZWZpbmVkKF9BRFZJU09SX0FOTk9UQVRFX0hfKSB8fCBkZWZpbmVkKEFOTk9UQVRFX0VYUEFORF9OVUxMKQorCit0eXBlZGVmIHZvaWQqIF9faXR0X21vZGVsX3NpdGU7ICAgICAgICAgICAgIC8qITwgQGJyaWVmIGhhbmRsZSBmb3IgbGV4aWNhbCBzaXRlICAgICAqLwordHlwZWRlZiB2b2lkKiBfX2l0dF9tb2RlbF9zaXRlX2luc3RhbmNlOyAgICAvKiE8IEBicmllZiBoYW5kbGUgZm9yIGR5bmFtaWMgaW5zdGFuY2UgKi8KK3R5cGVkZWYgdm9pZCogX19pdHRfbW9kZWxfdGFzazsgICAgICAgICAgICAgLyohPCBAYnJpZWYgaGFuZGxlIGZvciBsZXhpY2FsIHNpdGUgICAgICovCit0eXBlZGVmIHZvaWQqIF9faXR0X21vZGVsX3Rhc2tfaW5zdGFuY2U7ICAgIC8qITwgQGJyaWVmIGhhbmRsZSBmb3IgZHluYW1pYyBpbnN0YW5jZSAqLworCisvKioKKyAqIEBlbnVtIF9faXR0X21vZGVsX2Rpc2FibGUKKyAqIEBicmllZiBFbnVtZXJhdG9yIGZvciB0aGUgZGlzYWJsZSBtZXRob2RzCisgKi8KK3R5cGVkZWYgZW51bSB7CisgICAgX19pdHRfbW9kZWxfZGlzYWJsZV9vYnNlcnZhdGlvbiwKKyAgICBfX2l0dF9tb2RlbF9kaXNhYmxlX2NvbGxlY3Rpb24KK30gX19pdHRfbW9kZWxfZGlzYWJsZTsKKworI2VuZGlmIC8qICFfQURWSVNPUl9BTk5PVEFURV9IXyB8fCBBTk5PVEFURV9FWFBBTkRfTlVMTCAqLworCisvKioKKyAqIEBicmllZiBBTk5PVEFURV9TSVRFX0JFR0lOL0FOTk9UQVRFX1NJVEVfRU5EIHN1cHBvcnQuCisgKgorICogc2l0ZV9iZWdpbi9lbmQgbW9kZWwgYSBwb3RlbnRpYWwgY29uY3VycmVuY3kgc2l0ZS4KKyAqIHNpdGUgaW5zdGFuY2VzIG1heSBiZSByZWN1cnNpdmVseSBuZXN0ZWQgd2l0aCB0aGVtc2VsdmVzLgorICogc2l0ZV9lbmQgZXhpdHMgdGhlIG1vc3QgcmVjZW50bHkgc3RhcnRlZCBidXQgdW5lbmRlZCBzaXRlIGZvciB0aGUgY3VycmVudAorICogdGhyZWFkLiAgVGhlIGhhbmRsZSBwYXNzZWQgdG8gZW5kIG1heSBiZSB1c2VkIHRvIHZhbGlkYXRlIHN0cnVjdHVyZS4KKyAqIEluc3RhbmNlcyBvZiBhIHNpdGUgZW5jb3VudGVyZWQgb24gZGlmZmVyZW50IHRocmVhZHMgY29uY3VycmVudGx5CisgKiBhcmUgY29uc2lkZXJlZCBjb21wbGV0ZWx5IGRpc3RpbmN0LiBJZiB0aGUgc2l0ZSBuYW1lIGZvciB0d28gZGlmZmVyZW50CisgKiBsZXhpY2FsIHNpdGVzIG1hdGNoLCBpdCBpcyB1bnNwZWNpZmllZCB3aGV0aGVyIHRoZXkgYXJlIHRyZWF0ZWQgYXMgdGhlCisgKiBzYW1lIG9yIGRpZmZlcmVudCBmb3IgZGF0YSBwcmVzZW50YXRpb24uCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X21vZGVsX3NpdGVfYmVnaW4oX19pdHRfbW9kZWxfc2l0ZSAqc2l0ZSwgX19pdHRfbW9kZWxfc2l0ZV9pbnN0YW5jZSAqaW5zdGFuY2UsIGNvbnN0IGNoYXIgKm5hbWUpOworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgordm9pZCBJVFRBUEkgX19pdHRfbW9kZWxfc2l0ZV9iZWdpblcoY29uc3Qgd2NoYXJfdCAqbmFtZSk7CisjZW5kaWYKK3ZvaWQgSVRUQVBJIF9faXR0X21vZGVsX3NpdGVfYmVnaW5BKGNvbnN0IGNoYXIgKm5hbWUpOwordm9pZCBJVFRBUEkgX19pdHRfbW9kZWxfc2l0ZV9iZWdpbkFMKGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBzaXRlTmFtZUxlbik7Cit2b2lkIElUVEFQSSBfX2l0dF9tb2RlbF9zaXRlX2VuZCAgKF9faXR0X21vZGVsX3NpdGUgKnNpdGUsIF9faXR0X21vZGVsX3NpdGVfaW5zdGFuY2UgKmluc3RhbmNlKTsKK3ZvaWQgSVRUQVBJIF9faXR0X21vZGVsX3NpdGVfZW5kXzIodm9pZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX3NpdGVfYmVnaW4sICAoX19pdHRfbW9kZWxfc2l0ZSAqc2l0ZSwgX19pdHRfbW9kZWxfc2l0ZV9pbnN0YW5jZSAqaW5zdGFuY2UsIGNvbnN0IGNoYXIgKm5hbWUpKQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfc2l0ZV9iZWdpblcsICAoY29uc3Qgd2NoYXJfdCAqbmFtZSkpCisjZW5kaWYKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX3NpdGVfYmVnaW5BLCAgKGNvbnN0IGNoYXIgKm5hbWUpKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfc2l0ZV9iZWdpbkFMLCAgKGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBzaXRlTmFtZUxlbikpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9zaXRlX2VuZCwgICAgKF9faXR0X21vZGVsX3NpdGUgKnNpdGUsIF9faXR0X21vZGVsX3NpdGVfaW5zdGFuY2UgKmluc3RhbmNlKSkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX3NpdGVfZW5kXzIsICAodm9pZCkpCisjZGVmaW5lIF9faXR0X21vZGVsX3NpdGVfYmVnaW4gICAgICBJVFROT1RJRllfVk9JRChtb2RlbF9zaXRlX2JlZ2luKQorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2JlZ2luX3B0ciAgSVRUTk9USUZZX05BTUUobW9kZWxfc2l0ZV9iZWdpbikKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfbW9kZWxfc2l0ZV9iZWdpblcgICAgICBJVFROT1RJRllfVk9JRChtb2RlbF9zaXRlX2JlZ2luVykKKyNkZWZpbmUgX19pdHRfbW9kZWxfc2l0ZV9iZWdpbldfcHRyICBJVFROT1RJRllfTkFNRShtb2RlbF9zaXRlX2JlZ2luVykKKyNlbmRpZgorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2JlZ2luQSAgICAgIElUVE5PVElGWV9WT0lEKG1vZGVsX3NpdGVfYmVnaW5BKQorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2JlZ2luQV9wdHIgIElUVE5PVElGWV9OQU1FKG1vZGVsX3NpdGVfYmVnaW5BKQorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2JlZ2luQUwgICAgICBJVFROT1RJRllfVk9JRChtb2RlbF9zaXRlX2JlZ2luQUwpCisjZGVmaW5lIF9faXR0X21vZGVsX3NpdGVfYmVnaW5BTF9wdHIgIElUVE5PVElGWV9OQU1FKG1vZGVsX3NpdGVfYmVnaW5BTCkKKyNkZWZpbmUgX19pdHRfbW9kZWxfc2l0ZV9lbmQgICAgICAgIElUVE5PVElGWV9WT0lEKG1vZGVsX3NpdGVfZW5kKQorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2VuZF9wdHIgICAgSVRUTk9USUZZX05BTUUobW9kZWxfc2l0ZV9lbmQpCisjZGVmaW5lIF9faXR0X21vZGVsX3NpdGVfZW5kXzIgICAgICAgIElUVE5PVElGWV9WT0lEKG1vZGVsX3NpdGVfZW5kXzIpCisjZGVmaW5lIF9faXR0X21vZGVsX3NpdGVfZW5kXzJfcHRyICAgIElUVE5PVElGWV9OQU1FKG1vZGVsX3NpdGVfZW5kXzIpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2JlZ2luKHNpdGUsIGluc3RhbmNlLCBuYW1lKQorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2JlZ2luX3B0ciAgMAorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2JlZ2luVyhuYW1lKQorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2JlZ2luV19wdHIgIDAKKyNlbmRpZgorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2JlZ2luQShuYW1lKQorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2JlZ2luQV9wdHIgIDAKKyNkZWZpbmUgX19pdHRfbW9kZWxfc2l0ZV9iZWdpbkFMKG5hbWUsIHNpdGVOYW1lTGVuKQorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2JlZ2luQUxfcHRyICAwCisjZGVmaW5lIF9faXR0X21vZGVsX3NpdGVfZW5kKHNpdGUsIGluc3RhbmNlKQorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2VuZF9wdHIgICAgMAorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2VuZF8yKCkKKyNkZWZpbmUgX19pdHRfbW9kZWxfc2l0ZV9lbmRfMl9wdHIgICAgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X21vZGVsX3NpdGVfYmVnaW5fcHRyICAwCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X21vZGVsX3NpdGVfYmVnaW5XX3B0ciAgMAorI2VuZGlmCisjZGVmaW5lIF9faXR0X21vZGVsX3NpdGVfYmVnaW5BX3B0ciAgMAorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2JlZ2luQUxfcHRyICAwCisjZGVmaW5lIF9faXR0X21vZGVsX3NpdGVfZW5kX3B0ciAgICAwCisjZGVmaW5lIF9faXR0X21vZGVsX3NpdGVfZW5kXzJfcHRyICAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgQU5OT1RBVEVfVEFTS19CRUdJTi9BTk5PVEFURV9UQVNLX0VORCBzdXBwb3J0CisgKgorICogdGFza19iZWdpbi9lbmQgbW9kZWwgYSBwb3RlbnRpYWwgdGFzaywgd2hpY2ggaXMgY29udGFpbmVkIHdpdGhpbiB0aGUgbW9zdAorICogY2xvc2VseSBlbmNsb3NpbmcgZHluYW1pYyBzaXRlLiAgdGFza19lbmQgZXhpdHMgdGhlIG1vc3QgcmVjZW50bHkgc3RhcnRlZAorICogYnV0IHVuZW5kZWQgdGFzay4gIFRoZSBoYW5kbGUgcGFzc2VkIHRvIGVuZCBtYXkgYmUgdXNlZCB0byB2YWxpZGF0ZQorICogc3RydWN0dXJlLiAgSXQgaXMgdW5zcGVjaWZpZWQgaWYgYmFkIGR5bmFtaWMgbmVzdGluZyBpcyBkZXRlY3RlZC4gIElmIGl0CisgKiBpcywgaXQgc2hvdWxkIGJlIGVuY29kZWQgaW4gdGhlIHJlc3VsdGluZyBkYXRhIGNvbGxlY3Rpb24uICBUaGUgY29sbGVjdG9yCisgKiBzaG91bGQgbm90IGZhaWwgZHVlIHRvIGNvbnN0cnVjdCBuZXN0aW5nIGlzc3Vlcywgbm9yIGF0dGVtcHQgdG8gZGlyZWN0bHkKKyAqIGluZGljYXRlIHRoZSBwcm9ibGVtLgorICovCit2b2lkIElUVEFQSSBfX2l0dF9tb2RlbF90YXNrX2JlZ2luKF9faXR0X21vZGVsX3Rhc2sgKnRhc2ssIF9faXR0X21vZGVsX3Rhc2tfaW5zdGFuY2UgKmluc3RhbmNlLCBjb25zdCBjaGFyICpuYW1lKTsKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK3ZvaWQgSVRUQVBJIF9faXR0X21vZGVsX3Rhc2tfYmVnaW5XKGNvbnN0IHdjaGFyX3QgKm5hbWUpOwordm9pZCBJVFRBUEkgX19pdHRfbW9kZWxfaXRlcmF0aW9uX3Rhc2tXKGNvbnN0IHdjaGFyX3QgKm5hbWUpOworI2VuZGlmCit2b2lkIElUVEFQSSBfX2l0dF9tb2RlbF90YXNrX2JlZ2luQShjb25zdCBjaGFyICpuYW1lKTsKK3ZvaWQgSVRUQVBJIF9faXR0X21vZGVsX3Rhc2tfYmVnaW5BTChjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgdGFza05hbWVMZW4pOwordm9pZCBJVFRBUEkgX19pdHRfbW9kZWxfaXRlcmF0aW9uX3Rhc2tBKGNvbnN0IGNoYXIgKm5hbWUpOwordm9pZCBJVFRBUEkgX19pdHRfbW9kZWxfaXRlcmF0aW9uX3Rhc2tBTChjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgdGFza05hbWVMZW4pOwordm9pZCBJVFRBUEkgX19pdHRfbW9kZWxfdGFza19lbmQgIChfX2l0dF9tb2RlbF90YXNrICp0YXNrLCBfX2l0dF9tb2RlbF90YXNrX2luc3RhbmNlICppbnN0YW5jZSk7Cit2b2lkIElUVEFQSSBfX2l0dF9tb2RlbF90YXNrX2VuZF8yKHZvaWQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF90YXNrX2JlZ2luLCAgKF9faXR0X21vZGVsX3Rhc2sgKnRhc2ssIF9faXR0X21vZGVsX3Rhc2tfaW5zdGFuY2UgKmluc3RhbmNlLCBjb25zdCBjaGFyICpuYW1lKSkKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX3Rhc2tfYmVnaW5XLCAgKGNvbnN0IHdjaGFyX3QgKm5hbWUpKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfaXRlcmF0aW9uX3Rhc2tXLCAoY29uc3Qgd2NoYXJfdCAqbmFtZSkpCisjZW5kaWYKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX3Rhc2tfYmVnaW5BLCAgKGNvbnN0IGNoYXIgKm5hbWUpKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfdGFza19iZWdpbkFMLCAgKGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCB0YXNrTmFtZUxlbikpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9pdGVyYXRpb25fdGFza0EsICAoY29uc3QgY2hhciAqbmFtZSkpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9pdGVyYXRpb25fdGFza0FMLCAgKGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCB0YXNrTmFtZUxlbikpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF90YXNrX2VuZCwgICAgKF9faXR0X21vZGVsX3Rhc2sgKnRhc2ssIF9faXR0X21vZGVsX3Rhc2tfaW5zdGFuY2UgKmluc3RhbmNlKSkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX3Rhc2tfZW5kXzIsICAodm9pZCkpCisjZGVmaW5lIF9faXR0X21vZGVsX3Rhc2tfYmVnaW4gICAgICBJVFROT1RJRllfVk9JRChtb2RlbF90YXNrX2JlZ2luKQorI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2JlZ2luX3B0ciAgSVRUTk9USUZZX05BTUUobW9kZWxfdGFza19iZWdpbikKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfbW9kZWxfdGFza19iZWdpblcgICAgIElUVE5PVElGWV9WT0lEKG1vZGVsX3Rhc2tfYmVnaW5XKQorI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2JlZ2luV19wdHIgSVRUTk9USUZZX05BTUUobW9kZWxfdGFza19iZWdpblcpCisjZGVmaW5lIF9faXR0X21vZGVsX2l0ZXJhdGlvbl90YXNrVyAgICAgSVRUTk9USUZZX1ZPSUQobW9kZWxfaXRlcmF0aW9uX3Rhc2tXKQorI2RlZmluZSBfX2l0dF9tb2RlbF9pdGVyYXRpb25fdGFza1dfcHRyIElUVE5PVElGWV9OQU1FKG1vZGVsX2l0ZXJhdGlvbl90YXNrVykKKyNlbmRpZgorI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2JlZ2luQSAgICBJVFROT1RJRllfVk9JRChtb2RlbF90YXNrX2JlZ2luQSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfdGFza19iZWdpbkFfcHRyIElUVE5PVElGWV9OQU1FKG1vZGVsX3Rhc2tfYmVnaW5BKQorI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2JlZ2luQUwgICAgSVRUTk9USUZZX1ZPSUQobW9kZWxfdGFza19iZWdpbkFMKQorI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2JlZ2luQUxfcHRyIElUVE5PVElGWV9OQU1FKG1vZGVsX3Rhc2tfYmVnaW5BTCkKKyNkZWZpbmUgX19pdHRfbW9kZWxfaXRlcmF0aW9uX3Rhc2tBICAgIElUVE5PVElGWV9WT0lEKG1vZGVsX2l0ZXJhdGlvbl90YXNrQSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfaXRlcmF0aW9uX3Rhc2tBX3B0ciBJVFROT1RJRllfTkFNRShtb2RlbF9pdGVyYXRpb25fdGFza0EpCisjZGVmaW5lIF9faXR0X21vZGVsX2l0ZXJhdGlvbl90YXNrQUwgICAgSVRUTk9USUZZX1ZPSUQobW9kZWxfaXRlcmF0aW9uX3Rhc2tBTCkKKyNkZWZpbmUgX19pdHRfbW9kZWxfaXRlcmF0aW9uX3Rhc2tBTF9wdHIgSVRUTk9USUZZX05BTUUobW9kZWxfaXRlcmF0aW9uX3Rhc2tBTCkKKyNkZWZpbmUgX19pdHRfbW9kZWxfdGFza19lbmQgICAgICAgIElUVE5PVElGWV9WT0lEKG1vZGVsX3Rhc2tfZW5kKQorI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2VuZF9wdHIgICAgSVRUTk9USUZZX05BTUUobW9kZWxfdGFza19lbmQpCisjZGVmaW5lIF9faXR0X21vZGVsX3Rhc2tfZW5kXzIgICAgICAgIElUVE5PVElGWV9WT0lEKG1vZGVsX3Rhc2tfZW5kXzIpCisjZGVmaW5lIF9faXR0X21vZGVsX3Rhc2tfZW5kXzJfcHRyICAgIElUVE5PVElGWV9OQU1FKG1vZGVsX3Rhc2tfZW5kXzIpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2JlZ2luKHRhc2ssIGluc3RhbmNlLCBuYW1lKQorI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2JlZ2luX3B0ciAgMAorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2JlZ2luVyhuYW1lKQorI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2JlZ2luV19wdHIgIDAKKyNlbmRpZgorI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2JlZ2luQShuYW1lKQorI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2JlZ2luQV9wdHIgIDAKKyNkZWZpbmUgX19pdHRfbW9kZWxfdGFza19iZWdpbkFMKG5hbWUsIHNpdGVOYW1lTGVuKQorI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2JlZ2luQUxfcHRyICAwCisjZGVmaW5lIF9faXR0X21vZGVsX2l0ZXJhdGlvbl90YXNrQShuYW1lKQorI2RlZmluZSBfX2l0dF9tb2RlbF9pdGVyYXRpb25fdGFza0FfcHRyICAwCisjZGVmaW5lIF9faXR0X21vZGVsX2l0ZXJhdGlvbl90YXNrQUwobmFtZSwgc2l0ZU5hbWVMZW4pCisjZGVmaW5lIF9faXR0X21vZGVsX2l0ZXJhdGlvbl90YXNrQUxfcHRyICAwCisjZGVmaW5lIF9faXR0X21vZGVsX3Rhc2tfZW5kKHRhc2ssIGluc3RhbmNlKQorI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2VuZF9wdHIgICAgMAorI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2VuZF8yKCkKKyNkZWZpbmUgX19pdHRfbW9kZWxfdGFza19lbmRfMl9wdHIgICAgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X21vZGVsX3Rhc2tfYmVnaW5fcHRyICAwCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X21vZGVsX3Rhc2tfYmVnaW5XX3B0ciAwCisjZW5kaWYKKyNkZWZpbmUgX19pdHRfbW9kZWxfdGFza19iZWdpbkFfcHRyICAwCisjZGVmaW5lIF9faXR0X21vZGVsX3Rhc2tfYmVnaW5BTF9wdHIgIDAKKyNkZWZpbmUgX19pdHRfbW9kZWxfaXRlcmF0aW9uX3Rhc2tBX3B0ciAgICAwCisjZGVmaW5lIF9faXR0X21vZGVsX2l0ZXJhdGlvbl90YXNrQUxfcHRyICAgIDAKKyNkZWZpbmUgX19pdHRfbW9kZWxfdGFza19lbmRfcHRyICAgIDAKKyNkZWZpbmUgX19pdHRfbW9kZWxfdGFza19lbmRfMl9wdHIgICAgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBBTk5PVEFURV9MT0NLX0FDUVVJUkUvQU5OT1RBVEVfTE9DS19SRUxFQVNFIHN1cHBvcnQKKyAqCisgKiBsb2NrX2FjcXVpcmUvcmVsZWFzZSBtb2RlbCBhIHBvdGVudGlhbCBsb2NrIGZvciBib3RoIGxvY2tzZXQgYW5kCisgKiBwZXJmb3JtYW5jZSBtb2RlbGluZy4gIEVhY2ggdW5pcXVlIGFkZHJlc3MgaXMgbW9kZWxlZCBhcyBhIHNlcGFyYXRlCisgKiBsb2NrLCB3aXRoIGludmFsaWQgYWRkcmVzc2VzIGJlaW5nIHZhbGlkIGxvY2sgSURzLiAgU3BlY2lmaWNhbGx5OgorICogbm8gc3RvcmFnZSBpcyBhY2Nlc3NlZCBieSB0aGUgQVBJIGF0IHRoZSBzcGVjaWZpZWQgYWRkcmVzcyAtIGl0IGlzIG9ubHkKKyAqIHVzZWQgZm9yIGxvY2sgaWRlbnRpZmljYXRpb24uICBMb2NrIGFjcXVpcmVzIG1heSBiZSBzZWxmLW5lc3RlZCBhbmQgYXJlCisgKiB1bmxvY2tlZCBieSBhIGNvcnJlc3BvbmRpbmcgbnVtYmVyIG9mIHJlbGVhc2VzLgorICogKFRoZXNlIGNsb3NlbHkgY29ycmVzcG9uZCB0byBfX2l0dF9zeW5jX2FjcXVpcmVkL19faXR0X3N5bmNfcmVsZWFzaW5nLAorICogYnV0IG1heSBub3QgaGF2ZSBpZGVudGljYWwgc2VtYW50aWNzLikKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfbW9kZWxfbG9ja19hY3F1aXJlKHZvaWQgKmxvY2spOwordm9pZCBJVFRBUEkgX19pdHRfbW9kZWxfbG9ja19hY3F1aXJlXzIodm9pZCAqbG9jayk7Cit2b2lkIElUVEFQSSBfX2l0dF9tb2RlbF9sb2NrX3JlbGVhc2Uodm9pZCAqbG9jayk7Cit2b2lkIElUVEFQSSBfX2l0dF9tb2RlbF9sb2NrX3JlbGVhc2VfMih2b2lkICpsb2NrKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfbG9ja19hY3F1aXJlLCAodm9pZCAqbG9jaykpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9sb2NrX2FjcXVpcmVfMiwgKHZvaWQgKmxvY2spKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfbG9ja19yZWxlYXNlLCAodm9pZCAqbG9jaykpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9sb2NrX3JlbGVhc2VfMiwgKHZvaWQgKmxvY2spKQorI2RlZmluZSBfX2l0dF9tb2RlbF9sb2NrX2FjcXVpcmUgICAgIElUVE5PVElGWV9WT0lEKG1vZGVsX2xvY2tfYWNxdWlyZSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfbG9ja19hY3F1aXJlX3B0ciBJVFROT1RJRllfTkFNRShtb2RlbF9sb2NrX2FjcXVpcmUpCisjZGVmaW5lIF9faXR0X21vZGVsX2xvY2tfYWNxdWlyZV8yICAgICBJVFROT1RJRllfVk9JRChtb2RlbF9sb2NrX2FjcXVpcmVfMikKKyNkZWZpbmUgX19pdHRfbW9kZWxfbG9ja19hY3F1aXJlXzJfcHRyIElUVE5PVElGWV9OQU1FKG1vZGVsX2xvY2tfYWNxdWlyZV8yKQorI2RlZmluZSBfX2l0dF9tb2RlbF9sb2NrX3JlbGVhc2UgICAgIElUVE5PVElGWV9WT0lEKG1vZGVsX2xvY2tfcmVsZWFzZSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfbG9ja19yZWxlYXNlX3B0ciBJVFROT1RJRllfTkFNRShtb2RlbF9sb2NrX3JlbGVhc2UpCisjZGVmaW5lIF9faXR0X21vZGVsX2xvY2tfcmVsZWFzZV8yICAgICBJVFROT1RJRllfVk9JRChtb2RlbF9sb2NrX3JlbGVhc2VfMikKKyNkZWZpbmUgX19pdHRfbW9kZWxfbG9ja19yZWxlYXNlXzJfcHRyIElUVE5PVElGWV9OQU1FKG1vZGVsX2xvY2tfcmVsZWFzZV8yKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfbW9kZWxfbG9ja19hY3F1aXJlKGxvY2spCisjZGVmaW5lIF9faXR0X21vZGVsX2xvY2tfYWNxdWlyZV9wdHIgMAorI2RlZmluZSBfX2l0dF9tb2RlbF9sb2NrX2FjcXVpcmVfMihsb2NrKQorI2RlZmluZSBfX2l0dF9tb2RlbF9sb2NrX2FjcXVpcmVfMl9wdHIgMAorI2RlZmluZSBfX2l0dF9tb2RlbF9sb2NrX3JlbGVhc2UobG9jaykKKyNkZWZpbmUgX19pdHRfbW9kZWxfbG9ja19yZWxlYXNlX3B0ciAwCisjZGVmaW5lIF9faXR0X21vZGVsX2xvY2tfcmVsZWFzZV8yKGxvY2spCisjZGVmaW5lIF9faXR0X21vZGVsX2xvY2tfcmVsZWFzZV8yX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfbW9kZWxfbG9ja19hY3F1aXJlX3B0ciAwCisjZGVmaW5lIF9faXR0X21vZGVsX2xvY2tfYWNxdWlyZV8yX3B0ciAwCisjZGVmaW5lIF9faXR0X21vZGVsX2xvY2tfcmVsZWFzZV9wdHIgMAorI2RlZmluZSBfX2l0dF9tb2RlbF9sb2NrX3JlbGVhc2VfMl9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBBTk5PVEFURV9SRUNPUkRfQUxMT0NBVElPTi9BTk5PVEFURV9SRUNPUkRfREVBTExPQ0FUSU9OIHN1cHBvcnQKKyAqCisgKiByZWNvcmRfYWxsb2NhdGlvbi9kZWFsbG9jYXRpb24gZGVzY3JpYmUgdXNlci1kZWZpbmVkIG1lbW9yeSBhbGxvY2F0b3IKKyAqIGJlaGF2aW9yLCB3aGljaCBtYXkgYmUgcmVxdWlyZWQgZm9yIGNvcnJlY3RuZXNzIG1vZGVsaW5nIHRvIHVuZGVyc3RhbmQKKyAqIHdoZW4gc3RvcmFnZSBpcyBub3QgZXhwZWN0ZWQgdG8gYmUgYWN0dWFsbHkgcmV1c2VkIGFjcm9zcyB0aHJlYWRzLgorICovCit2b2lkIElUVEFQSSBfX2l0dF9tb2RlbF9yZWNvcmRfYWxsb2NhdGlvbiAgKHZvaWQgKmFkZHIsIHNpemVfdCBzaXplKTsKK3ZvaWQgSVRUQVBJIF9faXR0X21vZGVsX3JlY29yZF9kZWFsbG9jYXRpb24odm9pZCAqYWRkcik7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX3JlY29yZF9hbGxvY2F0aW9uLCAgICh2b2lkICphZGRyLCBzaXplX3Qgc2l6ZSkpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9yZWNvcmRfZGVhbGxvY2F0aW9uLCAodm9pZCAqYWRkcikpCisjZGVmaW5lIF9faXR0X21vZGVsX3JlY29yZF9hbGxvY2F0aW9uICAgICAgIElUVE5PVElGWV9WT0lEKG1vZGVsX3JlY29yZF9hbGxvY2F0aW9uKQorI2RlZmluZSBfX2l0dF9tb2RlbF9yZWNvcmRfYWxsb2NhdGlvbl9wdHIgICBJVFROT1RJRllfTkFNRShtb2RlbF9yZWNvcmRfYWxsb2NhdGlvbikKKyNkZWZpbmUgX19pdHRfbW9kZWxfcmVjb3JkX2RlYWxsb2NhdGlvbiAgICAgSVRUTk9USUZZX1ZPSUQobW9kZWxfcmVjb3JkX2RlYWxsb2NhdGlvbikKKyNkZWZpbmUgX19pdHRfbW9kZWxfcmVjb3JkX2RlYWxsb2NhdGlvbl9wdHIgSVRUTk9USUZZX05BTUUobW9kZWxfcmVjb3JkX2RlYWxsb2NhdGlvbikKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X21vZGVsX3JlY29yZF9hbGxvY2F0aW9uKGFkZHIsIHNpemUpCisjZGVmaW5lIF9faXR0X21vZGVsX3JlY29yZF9hbGxvY2F0aW9uX3B0ciAgIDAKKyNkZWZpbmUgX19pdHRfbW9kZWxfcmVjb3JkX2RlYWxsb2NhdGlvbihhZGRyKQorI2RlZmluZSBfX2l0dF9tb2RlbF9yZWNvcmRfZGVhbGxvY2F0aW9uX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfbW9kZWxfcmVjb3JkX2FsbG9jYXRpb25fcHRyICAgMAorI2RlZmluZSBfX2l0dF9tb2RlbF9yZWNvcmRfZGVhbGxvY2F0aW9uX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIEFOTk9UQVRFX0lORFVDVElPTl9VU0VTIHN1cHBvcnQKKyAqCisgKiBOb3RlIHBhcnRpY3VsYXIgc3RvcmFnZSBpcyBpbmR1Y3RpdmUgdGhyb3VnaCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IHNpdGUKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfbW9kZWxfaW5kdWN0aW9uX3VzZXModm9pZCogYWRkciwgc2l6ZV90IHNpemUpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9pbmR1Y3Rpb25fdXNlcywgKHZvaWQgKmFkZHIsIHNpemVfdCBzaXplKSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfaW5kdWN0aW9uX3VzZXMgICAgIElUVE5PVElGWV9WT0lEKG1vZGVsX2luZHVjdGlvbl91c2VzKQorI2RlZmluZSBfX2l0dF9tb2RlbF9pbmR1Y3Rpb25fdXNlc19wdHIgSVRUTk9USUZZX05BTUUobW9kZWxfaW5kdWN0aW9uX3VzZXMpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9tb2RlbF9pbmR1Y3Rpb25fdXNlcyhhZGRyLCBzaXplKQorI2RlZmluZSBfX2l0dF9tb2RlbF9pbmR1Y3Rpb25fdXNlc19wdHIgICAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfbW9kZWxfaW5kdWN0aW9uX3VzZXNfcHRyICAgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBBTk5PVEFURV9SRURVQ1RJT05fVVNFUyBzdXBwb3J0CisgKgorICogTm90ZSBwYXJ0aWN1bGFyIHN0b3JhZ2UgaXMgdXNlZCBmb3IgcmVkdWN0aW9uIHRocm91Z2ggdGhlIGVuZAorICogb2YgdGhlIGN1cnJlbnQgc2l0ZQorICovCit2b2lkIElUVEFQSSBfX2l0dF9tb2RlbF9yZWR1Y3Rpb25fdXNlcyh2b2lkKiBhZGRyLCBzaXplX3Qgc2l6ZSk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX3JlZHVjdGlvbl91c2VzLCAodm9pZCAqYWRkciwgc2l6ZV90IHNpemUpKQorI2RlZmluZSBfX2l0dF9tb2RlbF9yZWR1Y3Rpb25fdXNlcyAgICAgSVRUTk9USUZZX1ZPSUQobW9kZWxfcmVkdWN0aW9uX3VzZXMpCisjZGVmaW5lIF9faXR0X21vZGVsX3JlZHVjdGlvbl91c2VzX3B0ciBJVFROT1RJRllfTkFNRShtb2RlbF9yZWR1Y3Rpb25fdXNlcykKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X21vZGVsX3JlZHVjdGlvbl91c2VzKGFkZHIsIHNpemUpCisjZGVmaW5lIF9faXR0X21vZGVsX3JlZHVjdGlvbl91c2VzX3B0ciAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9tb2RlbF9yZWR1Y3Rpb25fdXNlc19wdHIgICAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIEFOTk9UQVRFX09CU0VSVkVfVVNFUyBzdXBwb3J0CisgKgorICogSGF2ZSBjb3JyZWN0bmVzcyBtb2RlbGluZyByZWNvcmQgb2JzZXJ2YXRpb25zIGFib3V0IHVzZXMgb2Ygc3RvcmFnZQorICogdGhyb3VnaCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IHNpdGUKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfbW9kZWxfb2JzZXJ2ZV91c2VzKHZvaWQqIGFkZHIsIHNpemVfdCBzaXplKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfb2JzZXJ2ZV91c2VzLCAodm9pZCAqYWRkciwgc2l6ZV90IHNpemUpKQorI2RlZmluZSBfX2l0dF9tb2RlbF9vYnNlcnZlX3VzZXMgICAgIElUVE5PVElGWV9WT0lEKG1vZGVsX29ic2VydmVfdXNlcykKKyNkZWZpbmUgX19pdHRfbW9kZWxfb2JzZXJ2ZV91c2VzX3B0ciBJVFROT1RJRllfTkFNRShtb2RlbF9vYnNlcnZlX3VzZXMpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9tb2RlbF9vYnNlcnZlX3VzZXMoYWRkciwgc2l6ZSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfb2JzZXJ2ZV91c2VzX3B0ciAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9tb2RlbF9vYnNlcnZlX3VzZXNfcHRyICAgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBBTk5PVEFURV9DTEVBUl9VU0VTIHN1cHBvcnQKKyAqCisgKiBDbGVhciB0aGUgc3BlY2lhbCBoYW5kbGluZyBvZiBhIHBpZWNlIG9mIHN0b3JhZ2UgcmVsYXRlZCB0byBpbmR1Y3Rpb24sCisgKiByZWR1Y3Rpb24gb3Igb2JzZXJ2ZV91c2VzCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X21vZGVsX2NsZWFyX3VzZXModm9pZCogYWRkcik7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX2NsZWFyX3VzZXMsICh2b2lkICphZGRyKSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfY2xlYXJfdXNlcyAgICAgSVRUTk9USUZZX1ZPSUQobW9kZWxfY2xlYXJfdXNlcykKKyNkZWZpbmUgX19pdHRfbW9kZWxfY2xlYXJfdXNlc19wdHIgSVRUTk9USUZZX05BTUUobW9kZWxfY2xlYXJfdXNlcykKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X21vZGVsX2NsZWFyX3VzZXMoYWRkcikKKyNkZWZpbmUgX19pdHRfbW9kZWxfY2xlYXJfdXNlc19wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X21vZGVsX2NsZWFyX3VzZXNfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgQU5OT1RBVEVfRElTQUJMRV8qX1BVU0gvQU5OT1RBVEVfRElTQUJMRV8qX1BPUCBzdXBwb3J0CisgKgorICogZGlzYWJsZV9wdXNoL2Rpc2FibGVfcG9wIHB1c2ggYW5kIHBvcCBkaXNhYmxpbmcgYmFzZWQgb24gYSBwYXJhbWV0ZXIuCisgKiBEaXNhYmxpbmcgb2JzZXJ2YXRpb25zIHN0b3BzIHByb2Nlc3Npbmcgb2YgbWVtb3J5IHJlZmVyZW5jZXMgZHVyaW5nCisgKiBjb3JyZWN0bmVzcyBtb2RlbGluZywgYW5kIGFsbCBhbm5vdGF0aW9ucyB0aGF0IG9jY3VyIGluIHRoZSBkaXNhYmxlZAorICogcmVnaW9uLiAgVGhpcyBhbGxvd3MgZGVzY3JpcHRpb24gb2YgY29kZSB0aGF0IGlzIGV4cGVjdGVkIHRvIGJlIGhhbmRsZWQKKyAqIHNwZWNpYWxseSBkdXJpbmcgY29udmVyc2lvbiB0byBwYXJhbGxlbGlzbSBvciB0aGF0IGlzIG5vdCByZWNvZ25pemVkCisgKiBieSB0b29scyAoZS5nLiBzb21lIGtpbmRzIG9mIHN5bmNocm9uaXphdGlvbiBvcGVyYXRpb25zLikKKyAqIFRoaXMgbWVjaGFuaXNtIGNhdXNlcyBhbGwgYW5ub3RhdGlvbnMgaW4gdGhlIGRpc2FibGVkIHJlZ2lvbiwgb3RoZXIKKyAqIHRoYW4gZGlzYWJsZV9wdXNoIGFuZCBkaXNhYmxlX3BvcCwgdG8gYmUgaWdub3JlZC4gIChGb3IgZXhhbXBsZSwgdGhpcworICogbWlnaHQgdmFsaWRseSBiZSB1c2VkIHRvIGRpc2FibGUgYW4gZW50aXJlIHBhcmFsbGVsIHNpdGUgYW5kIHRoZSBjb250YWluZWQKKyAqIHRhc2tzIGFuZCBsb2NraW5nIGluIGl0IGZvciBkYXRhIGNvbGxlY3Rpb24gcHVycG9zZXMuKQorICogVGhlIGRpc2FibGUgZm9yIGNvbGxlY3Rpb24gaXMgYSBtb3JlIGV4cGVuc2l2ZSBvcGVyYXRpb24sIGJ1dCByZWR1Y2VzCisgKiBjb2xsZWN0b3Igb3ZlcmhlYWQgc2lnbmlmaWNhbnRseS4gIFRoaXMgYXBwbGllcyB0byBCT1RIIGNvcnJlY3RuZXNzIGRhdGEKKyAqIGNvbGxlY3Rpb24gYW5kIHBlcmZvcm1hbmNlIGRhdGEgY29sbGVjdGlvbi4gIEZvciBleGFtcGxlLCBhIHNpdGUKKyAqIGNvbnRhaW5pbmcgYSB0YXNrIG1pZ2h0IG9ubHkgZW5hYmxlIGRhdGEgY29sbGVjdGlvbiBmb3IgdGhlIGZpcnN0IDEwCisgKiBpdGVyYXRpb25zLiAgQm90aCBwZXJmb3JtYW5jZSBhbmQgY29ycmVjdG5lc3MgZGF0YSBzaG91bGQgcmVmbGVjdCB0aGlzLAorICogYW5kIHRoZSBwcm9ncmFtIHNob3VsZCBydW4gYXMgY2xvc2UgdG8gZnVsbCBzcGVlZCBhcyBwb3NzaWJsZSB3aGVuCisgKiBjb2xsZWN0aW9uIGlzIGRpc2FibGVkLgorICovCit2b2lkIElUVEFQSSBfX2l0dF9tb2RlbF9kaXNhYmxlX3B1c2goX19pdHRfbW9kZWxfZGlzYWJsZSB4KTsKK3ZvaWQgSVRUQVBJIF9faXR0X21vZGVsX2Rpc2FibGVfcG9wKHZvaWQpOwordm9pZCBJVFRBUEkgX19pdHRfbW9kZWxfYWdncmVnYXRlX3Rhc2soc2l6ZV90IHgpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9kaXNhYmxlX3B1c2gsIChfX2l0dF9tb2RlbF9kaXNhYmxlIHgpKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfZGlzYWJsZV9wb3AsICAodm9pZCkpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9hZ2dyZWdhdGVfdGFzaywgKHNpemVfdCB4KSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfZGlzYWJsZV9wdXNoICAgICBJVFROT1RJRllfVk9JRChtb2RlbF9kaXNhYmxlX3B1c2gpCisjZGVmaW5lIF9faXR0X21vZGVsX2Rpc2FibGVfcHVzaF9wdHIgSVRUTk9USUZZX05BTUUobW9kZWxfZGlzYWJsZV9wdXNoKQorI2RlZmluZSBfX2l0dF9tb2RlbF9kaXNhYmxlX3BvcCAgICAgIElUVE5PVElGWV9WT0lEKG1vZGVsX2Rpc2FibGVfcG9wKQorI2RlZmluZSBfX2l0dF9tb2RlbF9kaXNhYmxlX3BvcF9wdHIgIElUVE5PVElGWV9OQU1FKG1vZGVsX2Rpc2FibGVfcG9wKQorI2RlZmluZSBfX2l0dF9tb2RlbF9hZ2dyZWdhdGVfdGFzayAgICAgIElUVE5PVElGWV9WT0lEKG1vZGVsX2FnZ3JlZ2F0ZV90YXNrKQorI2RlZmluZSBfX2l0dF9tb2RlbF9hZ2dyZWdhdGVfdGFza19wdHIgIElUVE5PVElGWV9OQU1FKG1vZGVsX2FnZ3JlZ2F0ZV90YXNrKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfbW9kZWxfZGlzYWJsZV9wdXNoKHgpCisjZGVmaW5lIF9faXR0X21vZGVsX2Rpc2FibGVfcHVzaF9wdHIgMAorI2RlZmluZSBfX2l0dF9tb2RlbF9kaXNhYmxlX3BvcCgpCisjZGVmaW5lIF9faXR0X21vZGVsX2Rpc2FibGVfcG9wX3B0ciAwCisjZGVmaW5lIF9faXR0X21vZGVsX2FnZ3JlZ2F0ZV90YXNrKHgpCisjZGVmaW5lIF9faXR0X21vZGVsX2FnZ3JlZ2F0ZV90YXNrX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfbW9kZWxfZGlzYWJsZV9wdXNoX3B0ciAwCisjZGVmaW5lIF9faXR0X21vZGVsX2Rpc2FibGVfcG9wX3B0ciAwCisjZGVmaW5lIF9faXR0X21vZGVsX2FnZ3JlZ2F0ZV90YXNrX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisvKiogQH0gbW9kZWwgZ3JvdXAgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgaGVhcCBIZWFwCisgKiBAaW5ncm91cCBwdWJsaWMKKyAqIEhlYXAgZ3JvdXAKKyAqIEB7CisgKi8KKwordHlwZWRlZiB2b2lkKiBfX2l0dF9oZWFwX2Z1bmN0aW9uOworCisvKioKKyAqIEBicmllZiBDcmVhdGUgYW4gaWRlbnRpZmljYXRpb24gZm9yIGhlYXAgZnVuY3Rpb24KKyAqIEByZXR1cm4gbm9uLXplcm8gaWRlbnRpZmllciBvciBOVUxMCisgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK19faXR0X2hlYXBfZnVuY3Rpb24gSVRUQVBJIF9faXR0X2hlYXBfZnVuY3Rpb25fY3JlYXRlQShjb25zdCBjaGFyKiAgICBuYW1lLCBjb25zdCBjaGFyKiAgICBkb21haW4pOworX19pdHRfaGVhcF9mdW5jdGlvbiBJVFRBUEkgX19pdHRfaGVhcF9mdW5jdGlvbl9jcmVhdGVXKGNvbnN0IHdjaGFyX3QqIG5hbWUsIGNvbnN0IHdjaGFyX3QqIGRvbWFpbik7CisjaWYgZGVmaW5lZChVTklDT0RFKSB8fCBkZWZpbmVkKF9VTklDT0RFKQorIyAgZGVmaW5lIF9faXR0X2hlYXBfZnVuY3Rpb25fY3JlYXRlICAgICBfX2l0dF9oZWFwX2Z1bmN0aW9uX2NyZWF0ZVcKKyMgIGRlZmluZSBfX2l0dF9oZWFwX2Z1bmN0aW9uX2NyZWF0ZV9wdHIgX19pdHRfaGVhcF9mdW5jdGlvbl9jcmVhdGVXX3B0cgorI2Vsc2UKKyMgIGRlZmluZSBfX2l0dF9oZWFwX2Z1bmN0aW9uX2NyZWF0ZSAgICAgX19pdHRfaGVhcF9mdW5jdGlvbl9jcmVhdGVBCisjICBkZWZpbmUgX19pdHRfaGVhcF9mdW5jdGlvbl9jcmVhdGVfcHRyIF9faXR0X2hlYXBfZnVuY3Rpb25fY3JlYXRlQV9wdHIKKyNlbmRpZiAvKiBVTklDT0RFICovCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitfX2l0dF9oZWFwX2Z1bmN0aW9uIElUVEFQSSBfX2l0dF9oZWFwX2Z1bmN0aW9uX2NyZWF0ZShjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyKiBkb21haW4pOworI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQihJVFRBUEksIF9faXR0X2hlYXBfZnVuY3Rpb24sIGhlYXBfZnVuY3Rpb25fY3JlYXRlQSwgKGNvbnN0IGNoYXIqICAgIG5hbWUsIGNvbnN0IGNoYXIqICAgIGRvbWFpbikpCitJVFRfU1RVQihJVFRBUEksIF9faXR0X2hlYXBfZnVuY3Rpb24sIGhlYXBfZnVuY3Rpb25fY3JlYXRlVywgKGNvbnN0IHdjaGFyX3QqIG5hbWUsIGNvbnN0IHdjaGFyX3QqIGRvbWFpbikpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQihJVFRBUEksIF9faXR0X2hlYXBfZnVuY3Rpb24sIGhlYXBfZnVuY3Rpb25fY3JlYXRlLCAgKGNvbnN0IGNoYXIqICAgIG5hbWUsIGNvbnN0IGNoYXIqICAgIGRvbWFpbikpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X2hlYXBfZnVuY3Rpb25fY3JlYXRlQSAgICAgSVRUTk9USUZZX0RBVEEoaGVhcF9mdW5jdGlvbl9jcmVhdGVBKQorI2RlZmluZSBfX2l0dF9oZWFwX2Z1bmN0aW9uX2NyZWF0ZUFfcHRyIElUVE5PVElGWV9OQU1FKGhlYXBfZnVuY3Rpb25fY3JlYXRlQSkKKyNkZWZpbmUgX19pdHRfaGVhcF9mdW5jdGlvbl9jcmVhdGVXICAgICBJVFROT1RJRllfREFUQShoZWFwX2Z1bmN0aW9uX2NyZWF0ZVcpCisjZGVmaW5lIF9faXR0X2hlYXBfZnVuY3Rpb25fY3JlYXRlV19wdHIgSVRUTk9USUZZX05BTUUoaGVhcF9mdW5jdGlvbl9jcmVhdGVXKQorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X2hlYXBfZnVuY3Rpb25fY3JlYXRlICAgICAgSVRUTk9USUZZX0RBVEEoaGVhcF9mdW5jdGlvbl9jcmVhdGUpCisjZGVmaW5lIF9faXR0X2hlYXBfZnVuY3Rpb25fY3JlYXRlX3B0ciAgSVRUTk9USUZZX05BTUUoaGVhcF9mdW5jdGlvbl9jcmVhdGUpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9oZWFwX2Z1bmN0aW9uX2NyZWF0ZUEobmFtZSwgZG9tYWluKSAoX19pdHRfaGVhcF9mdW5jdGlvbikwCisjZGVmaW5lIF9faXR0X2hlYXBfZnVuY3Rpb25fY3JlYXRlQV9wdHIgMAorI2RlZmluZSBfX2l0dF9oZWFwX2Z1bmN0aW9uX2NyZWF0ZVcobmFtZSwgZG9tYWluKSAoX19pdHRfaGVhcF9mdW5jdGlvbikwCisjZGVmaW5lIF9faXR0X2hlYXBfZnVuY3Rpb25fY3JlYXRlV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X2hlYXBfZnVuY3Rpb25fY3JlYXRlKG5hbWUsIGRvbWFpbikgIChfX2l0dF9oZWFwX2Z1bmN0aW9uKTAKKyNkZWZpbmUgX19pdHRfaGVhcF9mdW5jdGlvbl9jcmVhdGVfcHRyICAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfaGVhcF9mdW5jdGlvbl9jcmVhdGVBX3B0ciAwCisjZGVmaW5lIF9faXR0X2hlYXBfZnVuY3Rpb25fY3JlYXRlV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X2hlYXBfZnVuY3Rpb25fY3JlYXRlX3B0ciAgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBSZWNvcmQgYW4gYWxsb2NhdGlvbiBiZWdpbiBvY2N1cnJlbmNlLgorICovCit2b2lkIElUVEFQSSBfX2l0dF9oZWFwX2FsbG9jYXRlX2JlZ2luKF9faXR0X2hlYXBfZnVuY3Rpb24gaCwgc2l6ZV90IHNpemUsIGludCBpbml0aWFsaXplZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGhlYXBfYWxsb2NhdGVfYmVnaW4sIChfX2l0dF9oZWFwX2Z1bmN0aW9uIGgsIHNpemVfdCBzaXplLCBpbnQgaW5pdGlhbGl6ZWQpKQorI2RlZmluZSBfX2l0dF9oZWFwX2FsbG9jYXRlX2JlZ2luICAgICBJVFROT1RJRllfVk9JRChoZWFwX2FsbG9jYXRlX2JlZ2luKQorI2RlZmluZSBfX2l0dF9oZWFwX2FsbG9jYXRlX2JlZ2luX3B0ciBJVFROT1RJRllfTkFNRShoZWFwX2FsbG9jYXRlX2JlZ2luKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfaGVhcF9hbGxvY2F0ZV9iZWdpbihoLCBzaXplLCBpbml0aWFsaXplZCkKKyNkZWZpbmUgX19pdHRfaGVhcF9hbGxvY2F0ZV9iZWdpbl9wdHIgICAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfaGVhcF9hbGxvY2F0ZV9iZWdpbl9wdHIgICAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIFJlY29yZCBhbiBhbGxvY2F0aW9uIGVuZCBvY2N1cnJlbmNlLgorICovCit2b2lkIElUVEFQSSBfX2l0dF9oZWFwX2FsbG9jYXRlX2VuZChfX2l0dF9oZWFwX2Z1bmN0aW9uIGgsIHZvaWQqKiBhZGRyLCBzaXplX3Qgc2l6ZSwgaW50IGluaXRpYWxpemVkKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgaGVhcF9hbGxvY2F0ZV9lbmQsIChfX2l0dF9oZWFwX2Z1bmN0aW9uIGgsIHZvaWQqKiBhZGRyLCBzaXplX3Qgc2l6ZSwgaW50IGluaXRpYWxpemVkKSkKKyNkZWZpbmUgX19pdHRfaGVhcF9hbGxvY2F0ZV9lbmQgICAgIElUVE5PVElGWV9WT0lEKGhlYXBfYWxsb2NhdGVfZW5kKQorI2RlZmluZSBfX2l0dF9oZWFwX2FsbG9jYXRlX2VuZF9wdHIgSVRUTk9USUZZX05BTUUoaGVhcF9hbGxvY2F0ZV9lbmQpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9oZWFwX2FsbG9jYXRlX2VuZChoLCBhZGRyLCBzaXplLCBpbml0aWFsaXplZCkKKyNkZWZpbmUgX19pdHRfaGVhcF9hbGxvY2F0ZV9lbmRfcHRyICAgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X2hlYXBfYWxsb2NhdGVfZW5kX3B0ciAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgUmVjb3JkIGFuIGZyZWUgYmVnaW4gb2NjdXJyZW5jZS4KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfaGVhcF9mcmVlX2JlZ2luKF9faXR0X2hlYXBfZnVuY3Rpb24gaCwgdm9pZCogYWRkcik7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGhlYXBfZnJlZV9iZWdpbiwgKF9faXR0X2hlYXBfZnVuY3Rpb24gaCwgdm9pZCogYWRkcikpCisjZGVmaW5lIF9faXR0X2hlYXBfZnJlZV9iZWdpbiAgICAgSVRUTk9USUZZX1ZPSUQoaGVhcF9mcmVlX2JlZ2luKQorI2RlZmluZSBfX2l0dF9oZWFwX2ZyZWVfYmVnaW5fcHRyIElUVE5PVElGWV9OQU1FKGhlYXBfZnJlZV9iZWdpbikKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2hlYXBfZnJlZV9iZWdpbihoLCBhZGRyKQorI2RlZmluZSBfX2l0dF9oZWFwX2ZyZWVfYmVnaW5fcHRyICAgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X2hlYXBfZnJlZV9iZWdpbl9wdHIgICAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIFJlY29yZCBhbiBmcmVlIGVuZCBvY2N1cnJlbmNlLgorICovCit2b2lkIElUVEFQSSBfX2l0dF9oZWFwX2ZyZWVfZW5kKF9faXR0X2hlYXBfZnVuY3Rpb24gaCwgdm9pZCogYWRkcik7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGhlYXBfZnJlZV9lbmQsIChfX2l0dF9oZWFwX2Z1bmN0aW9uIGgsIHZvaWQqIGFkZHIpKQorI2RlZmluZSBfX2l0dF9oZWFwX2ZyZWVfZW5kICAgICBJVFROT1RJRllfVk9JRChoZWFwX2ZyZWVfZW5kKQorI2RlZmluZSBfX2l0dF9oZWFwX2ZyZWVfZW5kX3B0ciBJVFROT1RJRllfTkFNRShoZWFwX2ZyZWVfZW5kKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfaGVhcF9mcmVlX2VuZChoLCBhZGRyKQorI2RlZmluZSBfX2l0dF9oZWFwX2ZyZWVfZW5kX3B0ciAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9oZWFwX2ZyZWVfZW5kX3B0ciAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgUmVjb3JkIGFuIHJlYWxsb2NhdGlvbiBiZWdpbiBvY2N1cnJlbmNlLgorICovCit2b2lkIElUVEFQSSBfX2l0dF9oZWFwX3JlYWxsb2NhdGVfYmVnaW4oX19pdHRfaGVhcF9mdW5jdGlvbiBoLCB2b2lkKiBhZGRyLCBzaXplX3QgbmV3X3NpemUsIGludCBpbml0aWFsaXplZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGhlYXBfcmVhbGxvY2F0ZV9iZWdpbiwgKF9faXR0X2hlYXBfZnVuY3Rpb24gaCwgdm9pZCogYWRkciwgc2l6ZV90IG5ld19zaXplLCBpbnQgaW5pdGlhbGl6ZWQpKQorI2RlZmluZSBfX2l0dF9oZWFwX3JlYWxsb2NhdGVfYmVnaW4gICAgIElUVE5PVElGWV9WT0lEKGhlYXBfcmVhbGxvY2F0ZV9iZWdpbikKKyNkZWZpbmUgX19pdHRfaGVhcF9yZWFsbG9jYXRlX2JlZ2luX3B0ciBJVFROT1RJRllfTkFNRShoZWFwX3JlYWxsb2NhdGVfYmVnaW4pCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9oZWFwX3JlYWxsb2NhdGVfYmVnaW4oaCwgYWRkciwgbmV3X3NpemUsIGluaXRpYWxpemVkKQorI2RlZmluZSBfX2l0dF9oZWFwX3JlYWxsb2NhdGVfYmVnaW5fcHRyICAgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X2hlYXBfcmVhbGxvY2F0ZV9iZWdpbl9wdHIgICAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIFJlY29yZCBhbiByZWFsbG9jYXRpb24gZW5kIG9jY3VycmVuY2UuCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X2hlYXBfcmVhbGxvY2F0ZV9lbmQoX19pdHRfaGVhcF9mdW5jdGlvbiBoLCB2b2lkKiBhZGRyLCB2b2lkKiogbmV3X2FkZHIsIHNpemVfdCBuZXdfc2l6ZSwgaW50IGluaXRpYWxpemVkKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgaGVhcF9yZWFsbG9jYXRlX2VuZCwgKF9faXR0X2hlYXBfZnVuY3Rpb24gaCwgdm9pZCogYWRkciwgdm9pZCoqIG5ld19hZGRyLCBzaXplX3QgbmV3X3NpemUsIGludCBpbml0aWFsaXplZCkpCisjZGVmaW5lIF9faXR0X2hlYXBfcmVhbGxvY2F0ZV9lbmQgICAgIElUVE5PVElGWV9WT0lEKGhlYXBfcmVhbGxvY2F0ZV9lbmQpCisjZGVmaW5lIF9faXR0X2hlYXBfcmVhbGxvY2F0ZV9lbmRfcHRyIElUVE5PVElGWV9OQU1FKGhlYXBfcmVhbGxvY2F0ZV9lbmQpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9oZWFwX3JlYWxsb2NhdGVfZW5kKGgsIGFkZHIsIG5ld19hZGRyLCBuZXdfc2l6ZSwgaW5pdGlhbGl6ZWQpCisjZGVmaW5lIF9faXR0X2hlYXBfcmVhbGxvY2F0ZV9lbmRfcHRyICAgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X2hlYXBfcmVhbGxvY2F0ZV9lbmRfcHRyICAgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKiogQGJyaWVmIGludGVybmFsIGFjY2VzcyBiZWdpbiAqLwordm9pZCBJVFRBUEkgX19pdHRfaGVhcF9pbnRlcm5hbF9hY2Nlc3NfYmVnaW4odm9pZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGhlYXBfaW50ZXJuYWxfYWNjZXNzX2JlZ2luLCAgKHZvaWQpKQorI2RlZmluZSBfX2l0dF9oZWFwX2ludGVybmFsX2FjY2Vzc19iZWdpbiAgICAgIElUVE5PVElGWV9WT0lEKGhlYXBfaW50ZXJuYWxfYWNjZXNzX2JlZ2luKQorI2RlZmluZSBfX2l0dF9oZWFwX2ludGVybmFsX2FjY2Vzc19iZWdpbl9wdHIgIElUVE5PVElGWV9OQU1FKGhlYXBfaW50ZXJuYWxfYWNjZXNzX2JlZ2luKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfaGVhcF9pbnRlcm5hbF9hY2Nlc3NfYmVnaW4oKQorI2RlZmluZSBfX2l0dF9oZWFwX2ludGVybmFsX2FjY2Vzc19iZWdpbl9wdHIgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9oZWFwX2ludGVybmFsX2FjY2Vzc19iZWdpbl9wdHIgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqIEBicmllZiBpbnRlcm5hbCBhY2Nlc3MgZW5kICovCit2b2lkIElUVEFQSSBfX2l0dF9oZWFwX2ludGVybmFsX2FjY2Vzc19lbmQodm9pZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGhlYXBfaW50ZXJuYWxfYWNjZXNzX2VuZCwgKHZvaWQpKQorI2RlZmluZSBfX2l0dF9oZWFwX2ludGVybmFsX2FjY2Vzc19lbmQgICAgIElUVE5PVElGWV9WT0lEKGhlYXBfaW50ZXJuYWxfYWNjZXNzX2VuZCkKKyNkZWZpbmUgX19pdHRfaGVhcF9pbnRlcm5hbF9hY2Nlc3NfZW5kX3B0ciBJVFROT1RJRllfTkFNRShoZWFwX2ludGVybmFsX2FjY2Vzc19lbmQpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9oZWFwX2ludGVybmFsX2FjY2Vzc19lbmQoKQorI2RlZmluZSBfX2l0dF9oZWFwX2ludGVybmFsX2FjY2Vzc19lbmRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9oZWFwX2ludGVybmFsX2FjY2Vzc19lbmRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqIEBicmllZiByZWNvcmQgbWVtb3J5IGdyb3d0aCBiZWdpbiAqLwordm9pZCBJVFRBUEkgX19pdHRfaGVhcF9yZWNvcmRfbWVtb3J5X2dyb3d0aF9iZWdpbih2b2lkKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgaGVhcF9yZWNvcmRfbWVtb3J5X2dyb3d0aF9iZWdpbiwgICh2b2lkKSkKKyNkZWZpbmUgX19pdHRfaGVhcF9yZWNvcmRfbWVtb3J5X2dyb3d0aF9iZWdpbiAgICAgIElUVE5PVElGWV9WT0lEKGhlYXBfcmVjb3JkX21lbW9yeV9ncm93dGhfYmVnaW4pCisjZGVmaW5lIF9faXR0X2hlYXBfcmVjb3JkX21lbW9yeV9ncm93dGhfYmVnaW5fcHRyICBJVFROT1RJRllfTkFNRShoZWFwX3JlY29yZF9tZW1vcnlfZ3Jvd3RoX2JlZ2luKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfaGVhcF9yZWNvcmRfbWVtb3J5X2dyb3d0aF9iZWdpbigpCisjZGVmaW5lIF9faXR0X2hlYXBfcmVjb3JkX21lbW9yeV9ncm93dGhfYmVnaW5fcHRyICAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfaGVhcF9yZWNvcmRfbWVtb3J5X2dyb3d0aF9iZWdpbl9wdHIgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqIEBicmllZiByZWNvcmQgbWVtb3J5IGdyb3d0aCBlbmQgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X2hlYXBfcmVjb3JkX21lbW9yeV9ncm93dGhfZW5kKHZvaWQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBoZWFwX3JlY29yZF9tZW1vcnlfZ3Jvd3RoX2VuZCwgKHZvaWQpKQorI2RlZmluZSBfX2l0dF9oZWFwX3JlY29yZF9tZW1vcnlfZ3Jvd3RoX2VuZCAgICAgSVRUTk9USUZZX1ZPSUQoaGVhcF9yZWNvcmRfbWVtb3J5X2dyb3d0aF9lbmQpCisjZGVmaW5lIF9faXR0X2hlYXBfcmVjb3JkX21lbW9yeV9ncm93dGhfZW5kX3B0ciBJVFROT1RJRllfTkFNRShoZWFwX3JlY29yZF9tZW1vcnlfZ3Jvd3RoX2VuZCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2hlYXBfcmVjb3JkX21lbW9yeV9ncm93dGhfZW5kKCkKKyNkZWZpbmUgX19pdHRfaGVhcF9yZWNvcmRfbWVtb3J5X2dyb3d0aF9lbmRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9oZWFwX3JlY29yZF9tZW1vcnlfZ3Jvd3RoX2VuZF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBTcGVjaWZ5IHRoZSB0eXBlIG9mIGhlYXAgZGV0ZWN0aW9uL3JlcG9ydGluZyB0byBtb2RpZnkuCisgKi8KKy8qKgorICogQGhpZGVpbml0aWFsaXplciAKKyAqIEBicmllZiBSZXBvcnQgb24gbWVtb3J5IGxlYWtzLgorICovCisjZGVmaW5lIF9faXR0X2hlYXBfbGVha3MgMHgwMDAwMDAwMQorCisvKioKKyAqIEBoaWRlaW5pdGlhbGl6ZXIgCisgKiBAYnJpZWYgUmVwb3J0IG9uIG1lbW9yeSBncm93dGguCisgKi8KKyNkZWZpbmUgX19pdHRfaGVhcF9ncm93dGggMHgwMDAwMDAwMgorCisKKy8qKiBAYnJpZWYgaGVhcCByZXNldCBkZXRlY3Rpb24gKi8KK3ZvaWQgSVRUQVBJIF9faXR0X2hlYXBfcmVzZXRfZGV0ZWN0aW9uKHVuc2lnbmVkIGludCByZXNldF9tYXNrKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgaGVhcF9yZXNldF9kZXRlY3Rpb24sICAodW5zaWduZWQgaW50IHJlc2V0X21hc2spKQorI2RlZmluZSBfX2l0dF9oZWFwX3Jlc2V0X2RldGVjdGlvbiAgICAgIElUVE5PVElGWV9WT0lEKGhlYXBfcmVzZXRfZGV0ZWN0aW9uKQorI2RlZmluZSBfX2l0dF9oZWFwX3Jlc2V0X2RldGVjdGlvbl9wdHIgIElUVE5PVElGWV9OQU1FKGhlYXBfcmVzZXRfZGV0ZWN0aW9uKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfaGVhcF9yZXNldF9kZXRlY3Rpb24oKQorI2RlZmluZSBfX2l0dF9oZWFwX3Jlc2V0X2RldGVjdGlvbl9wdHIgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9oZWFwX3Jlc2V0X2RldGVjdGlvbl9wdHIgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqIEBicmllZiByZXBvcnQgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X2hlYXBfcmVjb3JkKHVuc2lnbmVkIGludCByZWNvcmRfbWFzayk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGhlYXBfcmVjb3JkLCAodW5zaWduZWQgaW50IHJlY29yZF9tYXNrKSkKKyNkZWZpbmUgX19pdHRfaGVhcF9yZWNvcmQgICAgIElUVE5PVElGWV9WT0lEKGhlYXBfcmVjb3JkKQorI2RlZmluZSBfX2l0dF9oZWFwX3JlY29yZF9wdHIgSVRUTk9USUZZX05BTUUoaGVhcF9yZWNvcmQpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9oZWFwX3JlY29yZCgpCisjZGVmaW5lIF9faXR0X2hlYXBfcmVjb3JkX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfaGVhcF9yZWNvcmRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqIEB9IGhlYXAgZ3JvdXAgKi8KKy8qKiBAZW5kY29uZCAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgZG9tYWlucyBEb21haW5zCisgKiBAaW5ncm91cCBwdWJsaWMKKyAqIERvbWFpbnMgZ3JvdXAKKyAqIEB7CisgKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjcHJhZ21hIHBhY2socHVzaCwgOCkKKwordHlwZWRlZiBzdHJ1Y3QgX19faXR0X2RvbWFpbgoreworICAgIHZvbGF0aWxlIGludCBmbGFnczsgLyohPCBaZXJvIGlmIGRpc2FibGVkLCBub24temVybyBpZiBlbmFibGVkLiBUaGUgbWVhbmluZyBvZiBkaWZmZXJlbnQgbm9uLXplcm8gdmFsdWVzIGlzIHJlc2VydmVkIHRvIHRoZSBydW50aW1lICovCisgICAgY29uc3QgY2hhciogbmFtZUE7ICAvKiE8IENvcHkgb2Ygb3JpZ2luYWwgbmFtZSBpbiBBU0NJSS4gKi8KKyNpZiBkZWZpbmVkKFVOSUNPREUpIHx8IGRlZmluZWQoX1VOSUNPREUpCisgICAgY29uc3Qgd2NoYXJfdCogbmFtZVc7IC8qITwgQ29weSBvZiBvcmlnaW5hbCBuYW1lIGluIFVOSUNPREUuICovCisjZWxzZSAgLyogVU5JQ09ERSB8fCBfVU5JQ09ERSAqLworICAgIHZvaWQqIG5hbWVXOworI2VuZGlmIC8qIFVOSUNPREUgfHwgX1VOSUNPREUgKi8KKyAgICBpbnQgICBleHRyYTE7IC8qITwgUmVzZXJ2ZWQgdG8gdGhlIHJ1bnRpbWUgKi8KKyAgICB2b2lkKiBleHRyYTI7IC8qITwgUmVzZXJ2ZWQgdG8gdGhlIHJ1bnRpbWUgKi8KKyAgICBzdHJ1Y3QgX19faXR0X2RvbWFpbiogbmV4dDsKK30gX19pdHRfZG9tYWluOworCisjcHJhZ21hIHBhY2socG9wKQorLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGluZ3JvdXAgZG9tYWlucworICogQGJyaWVmIENyZWF0ZSBhIGRvbWFpbi4KKyAqIENyZWF0ZSBkb21haW4gdXNpbmcgc29tZSBkb21haW4gbmFtZTogdGhlIFVSSSBuYW1pbmcgc3R5bGUgaXMgcmVjb21tZW5kZWQuCisgKiBCZWNhdXNlIHRoZSBzZXQgb2YgZG9tYWlucyBpcyBleHBlY3RlZCB0byBiZSBzdGF0aWMgb3ZlciB0aGUgYXBwbGljYXRpb24ncyAKKyAqIGV4ZWN1dGlvbiB0aW1lLCB0aGVyZSBpcyBubyBtZWNoYW5pc20gdG8gZGVzdHJveSBhIGRvbWFpbi4KKyAqIEFueSBkb21haW4gY2FuIGJlIGFjY2Vzc2VkIGJ5IGFueSB0aHJlYWQgaW4gdGhlIHByb2Nlc3MsIHJlZ2FyZGxlc3Mgb2YKKyAqIHdoaWNoIHRocmVhZCBjcmVhdGVkIHRoZSBkb21haW4uIFRoaXMgY2FsbCBpcyB0aHJlYWQtc2FmZS4KKyAqIEBwYXJhbVtpbl0gbmFtZSBuYW1lIG9mIGRvbWFpbgorICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitfX2l0dF9kb21haW4qIElUVEFQSSBfX2l0dF9kb21haW5fY3JlYXRlQShjb25zdCBjaGFyICAgICpuYW1lKTsKK19faXR0X2RvbWFpbiogSVRUQVBJIF9faXR0X2RvbWFpbl9jcmVhdGVXKGNvbnN0IHdjaGFyX3QgKm5hbWUpOworI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKyMgIGRlZmluZSBfX2l0dF9kb21haW5fY3JlYXRlICAgICBfX2l0dF9kb21haW5fY3JlYXRlVworIyAgZGVmaW5lIF9faXR0X2RvbWFpbl9jcmVhdGVfcHRyIF9faXR0X2RvbWFpbl9jcmVhdGVXX3B0cgorI2Vsc2UgLyogVU5JQ09ERSAqLworIyAgZGVmaW5lIF9faXR0X2RvbWFpbl9jcmVhdGUgICAgIF9faXR0X2RvbWFpbl9jcmVhdGVBCisjICBkZWZpbmUgX19pdHRfZG9tYWluX2NyZWF0ZV9wdHIgX19pdHRfZG9tYWluX2NyZWF0ZUFfcHRyCisjZW5kaWYgLyogVU5JQ09ERSAqLworI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworX19pdHRfZG9tYWluKiBJVFRBUEkgX19pdHRfZG9tYWluX2NyZWF0ZShjb25zdCBjaGFyICpuYW1lKTsKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9kb21haW4qLCBkb21haW5fY3JlYXRlQSwgKGNvbnN0IGNoYXIgICAgKm5hbWUpKQorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9kb21haW4qLCBkb21haW5fY3JlYXRlVywgKGNvbnN0IHdjaGFyX3QgKm5hbWUpKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9kb21haW4qLCBkb21haW5fY3JlYXRlLCAgKGNvbnN0IGNoYXIgICAgKm5hbWUpKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9kb21haW5fY3JlYXRlQSAgICAgSVRUTk9USUZZX0RBVEEoZG9tYWluX2NyZWF0ZUEpCisjZGVmaW5lIF9faXR0X2RvbWFpbl9jcmVhdGVBX3B0ciBJVFROT1RJRllfTkFNRShkb21haW5fY3JlYXRlQSkKKyNkZWZpbmUgX19pdHRfZG9tYWluX2NyZWF0ZVcgICAgIElUVE5PVElGWV9EQVRBKGRvbWFpbl9jcmVhdGVXKQorI2RlZmluZSBfX2l0dF9kb21haW5fY3JlYXRlV19wdHIgSVRUTk9USUZZX05BTUUoZG9tYWluX2NyZWF0ZVcpCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfZG9tYWluX2NyZWF0ZSAgICAgSVRUTk9USUZZX0RBVEEoZG9tYWluX2NyZWF0ZSkKKyNkZWZpbmUgX19pdHRfZG9tYWluX2NyZWF0ZV9wdHIgSVRUTk9USUZZX05BTUUoZG9tYWluX2NyZWF0ZSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X2RvbWFpbl9jcmVhdGVBKG5hbWUpIChfX2l0dF9kb21haW4qKTAKKyNkZWZpbmUgX19pdHRfZG9tYWluX2NyZWF0ZUFfcHRyIDAKKyNkZWZpbmUgX19pdHRfZG9tYWluX2NyZWF0ZVcobmFtZSkgKF9faXR0X2RvbWFpbiopMAorI2RlZmluZSBfX2l0dF9kb21haW5fY3JlYXRlV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X2RvbWFpbl9jcmVhdGUobmFtZSkgIChfX2l0dF9kb21haW4qKTAKKyNkZWZpbmUgX19pdHRfZG9tYWluX2NyZWF0ZV9wdHIgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X2RvbWFpbl9jcmVhdGVBX3B0ciAwCisjZGVmaW5lIF9faXR0X2RvbWFpbl9jcmVhdGVXX3B0ciAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfZG9tYWluX2NyZWF0ZV9wdHIgIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKy8qKiBAfSBkb21haW5zIGdyb3VwICovCisKKy8qKgorICogQGRlZmdyb3VwIGlkcyBJRHMKKyAqIEBpbmdyb3VwIHB1YmxpYworICogSURzIGdyb3VwCisgKiBAeworICovCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI3ByYWdtYSBwYWNrKHB1c2gsIDgpCisKK3R5cGVkZWYgc3RydWN0IF9fX2l0dF9pZAoreworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBkMSwgZDIsIGQzOworfSBfX2l0dF9pZDsKKworI3ByYWdtYSBwYWNrKHBvcCkKKy8qKiBAZW5kY29uZCAqLworCitzdGF0aWMgY29uc3QgX19pdHRfaWQgX19pdHRfbnVsbCA9IHsgMCwgMCwgMCB9OworCisvKioKKyAqIEBpbmdyb3VwIGlkcworICogQGJyaWVmIEEgY29udmVuaWVuY2UgZnVuY3Rpb24gaXMgcHJvdmlkZWQgdG8gY3JlYXRlIGFuIElEIHdpdGhvdXQgZG9tYWluIGNvbnRyb2wuCisgKiBAYnJpZWYgVGhpcyBpcyBhIGNvbnZlbmllbmNlIGZ1bmN0aW9uIHRvIGluaXRpYWxpemUgYW4gX19pdHRfaWQgc3RydWN0dXJlLiBUaGlzIGZ1bmN0aW9uCisgKiBkb2VzIG5vdCBhZmZlY3QgdGhlIHRyYWNlIGNvbGxlY3RvciBydW50aW1lIGluIGFueSB3YXkuIEFmdGVyIHlvdSBtYWtlIHRoZSBJRCB3aXRoIHRoaXMKKyAqIGZ1bmN0aW9uLCB5b3Ugc3RpbGwgbXVzdCBjcmVhdGUgaXQgd2l0aCB0aGUgX19pdHRfaWRfY3JlYXRlIGZ1bmN0aW9uIGJlZm9yZSB1c2luZyB0aGUgSUQKKyAqIHRvIGlkZW50aWZ5IGEgbmFtZWQgZW50aXR5LgorICogQHBhcmFtW2luXSBhZGRyIFRoZSBhZGRyZXNzIG9mIG9iamVjdDsgaGlnaCBRV09SRCBvZiB0aGUgSUQgdmFsdWUuCisgKiBAcGFyYW1baW5dIGV4dHJhIFRoZSBleHRyYSBkYXRhIHRvIHVuaXF1ZSBpZGVudGlmeSBvYmplY3Q7IGxvdyBRV09SRCBvZiB0aGUgSUQgdmFsdWUuCisgKi8KKworSVRUX0lOTElORSBfX2l0dF9pZCBJVFRBUEkgX19pdHRfaWRfbWFrZSh2b2lkKiBhZGRyLCB1bnNpZ25lZCBsb25nIGxvbmcgZXh0cmEpIElUVF9JTkxJTkVfQVRUUklCVVRFOworSVRUX0lOTElORSBfX2l0dF9pZCBJVFRBUEkgX19pdHRfaWRfbWFrZSh2b2lkKiBhZGRyLCB1bnNpZ25lZCBsb25nIGxvbmcgZXh0cmEpCit7CisgICAgX19pdHRfaWQgaWQgPSBfX2l0dF9udWxsOworICAgIGlkLmQxID0gKHVuc2lnbmVkIGxvbmcgbG9uZykoKHVpbnRwdHJfdClhZGRyKTsKKyAgICBpZC5kMiA9ICh1bnNpZ25lZCBsb25nIGxvbmcpZXh0cmE7CisgICAgaWQuZDMgPSAodW5zaWduZWQgbG9uZyBsb25nKTA7IC8qIFJlc2VydmVkLiBNdXN0IGJlIHplcm8gKi8KKyAgICByZXR1cm4gaWQ7Cit9CisKKy8qKgorICogQGluZ3JvdXAgaWRzCisgKiBAYnJpZWYgQ3JlYXRlIGFuIGluc3RhbmNlIG9mIGlkZW50aWZpZXIuCisgKiBUaGlzIGVzdGFibGlzaGVzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpZmV0aW1lIG9mIGFuIGluc3RhbmNlIG9mCisgKiB0aGUgZ2l2ZW4gSUQgaW4gdGhlIHRyYWNlLiBPbmNlIHRoaXMgbGlmZXRpbWUgc3RhcnRzLCB0aGUgSUQKKyAqIGNhbiBiZSB1c2VkIHRvIHRhZyBuYW1lZCBlbnRpdHkgaW5zdGFuY2VzIGluIGNhbGxzIHN1Y2ggYXMKKyAqIF9faXR0X3Rhc2tfYmVnaW4sIGFuZCB0byBzcGVjaWZ5IHJlbGF0aW9uc2hpcHMgYW1vbmcKKyAqIGlkZW50aWZpZWQgbmFtZWQgZW50aXR5IGluc3RhbmNlcywgdXNpbmcgdGhlIFxyZWYgcmVsYXRpb25zIEFQSXMuCisgKiBJbnN0YW5jZSBJRHMgYXJlIG5vdCBkb21haW4gc3BlY2lmaWMhCisgKiBAcGFyYW1baW5dIGRvbWFpbiBUaGUgZG9tYWluIGNvbnRyb2xsaW5nIHRoZSBleGVjdXRpb24gb2YgdGhpcyBjYWxsLgorICogQHBhcmFtW2luXSBpZCBUaGUgSUQgdG8gY3JlYXRlLgorICovCit2b2lkIElUVEFQSSBfX2l0dF9pZF9jcmVhdGUoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgaWRfY3JlYXRlLCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkKSkKKyNkZWZpbmUgX19pdHRfaWRfY3JlYXRlKGQseCkgSVRUTk9USUZZX1ZPSURfRDEoaWRfY3JlYXRlLGQseCkKKyNkZWZpbmUgX19pdHRfaWRfY3JlYXRlX3B0ciAgSVRUTk9USUZZX05BTUUoaWRfY3JlYXRlKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfaWRfY3JlYXRlKGRvbWFpbixpZCkKKyNkZWZpbmUgX19pdHRfaWRfY3JlYXRlX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfaWRfY3JlYXRlX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGluZ3JvdXAgaWRzCisgKiBAYnJpZWYgRGVzdHJveSBhbiBpbnN0YW5jZSBvZiBpZGVudGlmaWVyLgorICogVGhpcyBlbmRzIHRoZSBsaWZldGltZSBvZiB0aGUgY3VycmVudCBpbnN0YW5jZSBvZiB0aGUgZ2l2ZW4gSUQgdmFsdWUgaW4gdGhlIHRyYWNlLgorICogQW55IHJlbGF0aW9uc2hpcHMgdGhhdCBhcmUgZXN0YWJsaXNoZWQgYWZ0ZXIgdGhpcyBsaWZldGltZSBlbmRzIGFyZSBpbnZhbGlkLgorICogVGhpcyBjYWxsIG11c3QgYmUgcGVyZm9ybWVkIGJlZm9yZSB0aGUgZ2l2ZW4gSUQgdmFsdWUgY2FuIGJlIHJldXNlZCBmb3IgYSBkaWZmZXJlbnQgCisgKiBuYW1lZCBlbnRpdHkgaW5zdGFuY2UuCisgKiBAcGFyYW1baW5dIGRvbWFpbiBUaGUgZG9tYWluIGNvbnRyb2xsaW5nIHRoZSBleGVjdXRpb24gb2YgdGhpcyBjYWxsLgorICogQHBhcmFtW2luXSBpZCBUaGUgSUQgdG8gZGVzdHJveS4KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfaWRfZGVzdHJveShjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaWQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBpZF9kZXN0cm95LCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkKSkKKyNkZWZpbmUgX19pdHRfaWRfZGVzdHJveShkLHgpIElUVE5PVElGWV9WT0lEX0QxKGlkX2Rlc3Ryb3ksZCx4KQorI2RlZmluZSBfX2l0dF9pZF9kZXN0cm95X3B0ciAgSVRUTk9USUZZX05BTUUoaWRfZGVzdHJveSkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2lkX2Rlc3Ryb3koZG9tYWluLGlkKQorI2RlZmluZSBfX2l0dF9pZF9kZXN0cm95X3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfaWRfZGVzdHJveV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworLyoqIEB9IGlkcyBncm91cCAqLworCisvKioKKyAqIEBkZWZncm91cCBoYW5kbGVzcyBTdHJpbmcgSGFuZGxlcworICogQGluZ3JvdXAgcHVibGljCisgKiBTdHJpbmcgSGFuZGxlcyBncm91cAorICogQHsKKyAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNwcmFnbWEgcGFjayhwdXNoLCA4KQorCit0eXBlZGVmIHN0cnVjdCBfX19pdHRfc3RyaW5nX2hhbmRsZQoreworICAgIGNvbnN0IGNoYXIqIHN0ckE7IC8qITwgQ29weSBvZiBvcmlnaW5hbCBzdHJpbmcgaW4gQVNDSUkuICovCisjaWYgZGVmaW5lZChVTklDT0RFKSB8fCBkZWZpbmVkKF9VTklDT0RFKQorICAgIGNvbnN0IHdjaGFyX3QqIHN0clc7IC8qITwgQ29weSBvZiBvcmlnaW5hbCBzdHJpbmcgaW4gVU5JQ09ERS4gKi8KKyNlbHNlICAvKiBVTklDT0RFIHx8IF9VTklDT0RFICovCisgICAgdm9pZCogc3RyVzsKKyNlbmRpZiAvKiBVTklDT0RFIHx8IF9VTklDT0RFICovCisgICAgaW50ICAgZXh0cmExOyAvKiE8IFJlc2VydmVkLiBNdXN0IGJlIHplcm8gICAqLworICAgIHZvaWQqIGV4dHJhMjsgLyohPCBSZXNlcnZlZC4gTXVzdCBiZSB6ZXJvICAgKi8KKyAgICBzdHJ1Y3QgX19faXR0X3N0cmluZ19oYW5kbGUqIG5leHQ7Cit9IF9faXR0X3N0cmluZ19oYW5kbGU7CisKKyNwcmFnbWEgcGFjayhwb3ApCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAaW5ncm91cCBoYW5kbGVzCisgKiBAYnJpZWYgQ3JlYXRlIGEgc3RyaW5nIGhhbmRsZS4KKyAqIENyZWF0ZSBhbmQgcmV0dXJuIGhhbmRsZSB2YWx1ZSB0aGF0IGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggYSBzdHJpbmcuCisgKiBDb25zZWN1dGl2ZSBjYWxscyB0byBfX2l0dF9zdHJpbmdfaGFuZGxlX2NyZWF0ZSB3aXRoIHRoZSBzYW1lIG5hbWUKKyAqIHJldHVybiB0aGUgc2FtZSB2YWx1ZS4gQmVjYXVzZSB0aGUgc2V0IG9mIHN0cmluZyBoYW5kbGVzIGlzIGV4cGVjdGVkIHRvIHJlbWFpbgorICogc3RhdGljIGR1cmluZyB0aGUgYXBwbGljYXRpb24ncyBleGVjdXRpb24gdGltZSwgdGhlcmUgaXMgbm8gbWVjaGFuaXNtIHRvIGRlc3Ryb3kgYSBzdHJpbmcgaGFuZGxlLgorICogQW55IHN0cmluZyBoYW5kbGUgY2FuIGJlIGFjY2Vzc2VkIGJ5IGFueSB0aHJlYWQgaW4gdGhlIHByb2Nlc3MsIHJlZ2FyZGxlc3Mgb2Ygd2hpY2ggdGhyZWFkIGNyZWF0ZWQKKyAqIHRoZSBzdHJpbmcgaGFuZGxlLiBUaGlzIGNhbGwgaXMgdGhyZWFkLXNhZmUuCisgKiBAcGFyYW1baW5dIG5hbWUgVGhlIGlucHV0IHN0cmluZworICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitfX2l0dF9zdHJpbmdfaGFuZGxlKiBJVFRBUEkgX19pdHRfc3RyaW5nX2hhbmRsZV9jcmVhdGVBKGNvbnN0IGNoYXIgICAgKm5hbWUpOworX19pdHRfc3RyaW5nX2hhbmRsZSogSVRUQVBJIF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlVyhjb25zdCB3Y2hhcl90ICpuYW1lKTsKKyNpZiBkZWZpbmVkKFVOSUNPREUpIHx8IGRlZmluZWQoX1VOSUNPREUpCisjICBkZWZpbmUgX19pdHRfc3RyaW5nX2hhbmRsZV9jcmVhdGUgICAgIF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlVworIyAgZGVmaW5lIF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlX3B0ciBfX2l0dF9zdHJpbmdfaGFuZGxlX2NyZWF0ZVdfcHRyCisjZWxzZSAvKiBVTklDT0RFICovCisjICBkZWZpbmUgX19pdHRfc3RyaW5nX2hhbmRsZV9jcmVhdGUgICAgIF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlQQorIyAgZGVmaW5lIF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlX3B0ciBfX2l0dF9zdHJpbmdfaGFuZGxlX2NyZWF0ZUFfcHRyCisjZW5kaWYgLyogVU5JQ09ERSAqLworI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworX19pdHRfc3RyaW5nX2hhbmRsZSogSVRUQVBJIF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlKGNvbnN0IGNoYXIgKm5hbWUpOworI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQihJVFRBUEksIF9faXR0X3N0cmluZ19oYW5kbGUqLCBzdHJpbmdfaGFuZGxlX2NyZWF0ZUEsIChjb25zdCBjaGFyICAgICpuYW1lKSkKK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfc3RyaW5nX2hhbmRsZSosIHN0cmluZ19oYW5kbGVfY3JlYXRlVywgKGNvbnN0IHdjaGFyX3QgKm5hbWUpKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9zdHJpbmdfaGFuZGxlKiwgc3RyaW5nX2hhbmRsZV9jcmVhdGUsICAoY29uc3QgY2hhciAgICAqbmFtZSkpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlQSAgICAgSVRUTk9USUZZX0RBVEEoc3RyaW5nX2hhbmRsZV9jcmVhdGVBKQorI2RlZmluZSBfX2l0dF9zdHJpbmdfaGFuZGxlX2NyZWF0ZUFfcHRyIElUVE5PVElGWV9OQU1FKHN0cmluZ19oYW5kbGVfY3JlYXRlQSkKKyNkZWZpbmUgX19pdHRfc3RyaW5nX2hhbmRsZV9jcmVhdGVXICAgICBJVFROT1RJRllfREFUQShzdHJpbmdfaGFuZGxlX2NyZWF0ZVcpCisjZGVmaW5lIF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlV19wdHIgSVRUTk9USUZZX05BTUUoc3RyaW5nX2hhbmRsZV9jcmVhdGVXKQorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlICAgICBJVFROT1RJRllfREFUQShzdHJpbmdfaGFuZGxlX2NyZWF0ZSkKKyNkZWZpbmUgX19pdHRfc3RyaW5nX2hhbmRsZV9jcmVhdGVfcHRyIElUVE5PVElGWV9OQU1FKHN0cmluZ19oYW5kbGVfY3JlYXRlKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfc3RyaW5nX2hhbmRsZV9jcmVhdGVBKG5hbWUpIChfX2l0dF9zdHJpbmdfaGFuZGxlKikwCisjZGVmaW5lIF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlQV9wdHIgMAorI2RlZmluZSBfX2l0dF9zdHJpbmdfaGFuZGxlX2NyZWF0ZVcobmFtZSkgKF9faXR0X3N0cmluZ19oYW5kbGUqKTAKKyNkZWZpbmUgX19pdHRfc3RyaW5nX2hhbmRsZV9jcmVhdGVXX3B0ciAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfc3RyaW5nX2hhbmRsZV9jcmVhdGUobmFtZSkgIChfX2l0dF9zdHJpbmdfaGFuZGxlKikwCisjZGVmaW5lIF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlX3B0ciAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfc3RyaW5nX2hhbmRsZV9jcmVhdGVBX3B0ciAwCisjZGVmaW5lIF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlX3B0ciAgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworLyoqIEB9IGhhbmRsZXMgZ3JvdXAgKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2l0dF90aW1lc3RhbXA7CisvKiogQGVuZGNvbmQgKi8KKworc3RhdGljIGNvbnN0IF9faXR0X3RpbWVzdGFtcCBfX2l0dF90aW1lc3RhbXBfbm9uZSA9IChfX2l0dF90aW1lc3RhbXApLTFMTDsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9ncGFfZG9jdW1lbnRhdGlvbiAqLworCisvKioKKyAqIEBpbmdyb3VwIHRpbWVzdGFtcHMKKyAqIEBicmllZiBSZXR1cm4gdGltZXN0YW1wIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGN1cnJlbnQgbW9tZW50LgorICogVGhpcyByZXR1cm5zIHRoZSB0aW1lc3RhbXAgaW4gdGhlIGZvcm1hdCB0aGF0IGlzIHRoZSBtb3N0IHJlbGV2YW50IGZvciB0aGUgY3VycmVudAorICogaG9zdCBvciBwbGF0Zm9ybSAoUkRUU0MsIFFQQywgYW5kIG90aGVycykuIFlvdSBjYW4gdXNlIHRoZSAiPCIgb3BlcmF0b3IgdG8KKyAqIGNvbXBhcmUgX19pdHRfdGltZXN0YW1wIHZhbHVlcy4KKyAqLworX19pdHRfdGltZXN0YW1wIElUVEFQSSBfX2l0dF9nZXRfdGltZXN0YW1wKHZvaWQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQihJVFRBUEksIF9faXR0X3RpbWVzdGFtcCwgZ2V0X3RpbWVzdGFtcCwgKHZvaWQpKQorI2RlZmluZSBfX2l0dF9nZXRfdGltZXN0YW1wICAgICAgSVRUTk9USUZZX0RBVEEoZ2V0X3RpbWVzdGFtcCkKKyNkZWZpbmUgX19pdHRfZ2V0X3RpbWVzdGFtcF9wdHIgIElUVE5PVElGWV9OQU1FKGdldF90aW1lc3RhbXApCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9nZXRfdGltZXN0YW1wKCkKKyNkZWZpbmUgX19pdHRfZ2V0X3RpbWVzdGFtcF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X2dldF90aW1lc3RhbXBfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKy8qKiBAfSB0aW1lc3RhbXBzICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9ncGFfZG9jdW1lbnRhdGlvbiAqLworCisvKioKKyAqIEBkZWZncm91cCByZWdpb25zIFJlZ2lvbnMKKyAqIEBpbmdyb3VwIHB1YmxpYworICogUmVnaW9ucyBncm91cAorICogQHsKKyAqLworLyoqCisgKiBAaW5ncm91cCByZWdpb25zCisgKiBAYnJpZWYgQmVnaW4gb2YgcmVnaW9uIGluc3RhbmNlLgorICogU3VjY2Vzc2l2ZSBjYWxscyB0byBfX2l0dF9yZWdpb25fYmVnaW4gd2l0aCB0aGUgc2FtZSBJRCBhcmUgaWdub3JlZAorICogdW50aWwgYSBjYWxsIHRvIF9faXR0X3JlZ2lvbl9lbmQgd2l0aCB0aGUgc2FtZSBJRAorICogQHBhcmFtW2luXSBkb21haW4gVGhlIGRvbWFpbiBmb3IgdGhpcyByZWdpb24gaW5zdGFuY2UKKyAqIEBwYXJhbVtpbl0gaWQgVGhlIGluc3RhbmNlIElEIGZvciB0aGlzIHJlZ2lvbiBpbnN0YW5jZS4gTXVzdCBub3QgYmUgX19pdHRfbnVsbAorICogQHBhcmFtW2luXSBwYXJlbnRpZCBUaGUgaW5zdGFuY2UgSUQgZm9yIHRoZSBwYXJlbnQgb2YgdGhpcyByZWdpb24gaW5zdGFuY2UsIG9yIF9faXR0X251bGwKKyAqIEBwYXJhbVtpbl0gbmFtZSBUaGUgbmFtZSBvZiB0aGlzIHJlZ2lvbgorICovCit2b2lkIElUVEFQSSBfX2l0dF9yZWdpb25fYmVnaW4oY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkLCBfX2l0dF9pZCBwYXJlbnRpZCwgX19pdHRfc3RyaW5nX2hhbmRsZSAqbmFtZSk7CisKKy8qKgorICogQGluZ3JvdXAgcmVnaW9ucworICogQGJyaWVmIEVuZCBvZiByZWdpb24gaW5zdGFuY2UuCisgKiBUaGUgZmlyc3QgY2FsbCB0byBfX2l0dF9yZWdpb25fZW5kIHdpdGggYSBnaXZlbiBJRCBlbmRzIHRoZQorICogcmVnaW9uLiBTdWNjZXNzaXZlIGNhbGxzIHdpdGggdGhlIHNhbWUgSUQgYXJlIGlnbm9yZWQsIGFzIGFyZQorICogY2FsbHMgdGhhdCBkbyBub3QgaGF2ZSBhIG1hdGNoaW5nIF9faXR0X3JlZ2lvbl9iZWdpbiBjYWxsLgorICogQHBhcmFtW2luXSBkb21haW4gVGhlIGRvbWFpbiBmb3IgdGhpcyByZWdpb24gaW5zdGFuY2UKKyAqIEBwYXJhbVtpbl0gaWQgVGhlIGluc3RhbmNlIElEIGZvciB0aGlzIHJlZ2lvbiBpbnN0YW5jZQorICovCit2b2lkIElUVEFQSSBfX2l0dF9yZWdpb25fZW5kKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHJlZ2lvbl9iZWdpbiwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCwgX19pdHRfaWQgcGFyZW50aWQsIF9faXR0X3N0cmluZ19oYW5kbGUgKm5hbWUpKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgcmVnaW9uX2VuZCwgICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkKSkKKyNkZWZpbmUgX19pdHRfcmVnaW9uX2JlZ2luKGQseCx5LHopIElUVE5PVElGWV9WT0lEX0QzKHJlZ2lvbl9iZWdpbixkLHgseSx6KQorI2RlZmluZSBfX2l0dF9yZWdpb25fYmVnaW5fcHRyICAgICAgSVRUTk9USUZZX05BTUUocmVnaW9uX2JlZ2luKQorI2RlZmluZSBfX2l0dF9yZWdpb25fZW5kKGQseCkgICAgICAgSVRUTk9USUZZX1ZPSURfRDEocmVnaW9uX2VuZCxkLHgpCisjZGVmaW5lIF9faXR0X3JlZ2lvbl9lbmRfcHRyICAgICAgICBJVFROT1RJRllfTkFNRShyZWdpb25fZW5kKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfcmVnaW9uX2JlZ2luKGQseCx5LHopCisjZGVmaW5lIF9faXR0X3JlZ2lvbl9iZWdpbl9wdHIgMAorI2RlZmluZSBfX2l0dF9yZWdpb25fZW5kKGQseCkKKyNkZWZpbmUgX19pdHRfcmVnaW9uX2VuZF9wdHIgICAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfcmVnaW9uX2JlZ2luX3B0ciAwCisjZGVmaW5lIF9faXR0X3JlZ2lvbl9lbmRfcHRyICAgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworLyoqIEB9IHJlZ2lvbnMgZ3JvdXAgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgZnJhbWVzIEZyYW1lcworICogQGluZ3JvdXAgcHVibGljCisgKiBGcmFtZXMgYXJlIHNpbWlsYXIgdG8gcmVnaW9ucywgYnV0IGFyZSBpbnRlbmRlZCB0byBiZSBlYXNpZXIgdG8gdXNlIGFuZCB0byBpbXBsZW1lbnQuCisgKiBJbiBwYXJ0aWN1bGFyOgorICogLSBGcmFtZXMgYWx3YXlzIHJlcHJlc2VudCBwZXJpb2RzIG9mIGVsYXBzZWQgdGltZQorICogLSBCeSBkZWZhdWx0LCBmcmFtZXMgaGF2ZSBubyBuZXN0aW5nIHJlbGF0aW9uc2hpcHMKKyAqIEB7CisgKi8KKworLyoqCisgKiBAaW5ncm91cCBmcmFtZXMKKyAqIEBicmllZiBCZWdpbiBhIGZyYW1lIGluc3RhbmNlLgorICogU3VjY2Vzc2l2ZSBjYWxscyB0byBfX2l0dF9mcmFtZV9iZWdpbiB3aXRoIHRoZQorICogc2FtZSBJRCBhcmUgaWdub3JlZCB1bnRpbCBhIGNhbGwgdG8gX19pdHRfZnJhbWVfZW5kIHdpdGggdGhlIHNhbWUgSUQuCisgKiBAcGFyYW1baW5dIGRvbWFpbiBUaGUgZG9tYWluIGZvciB0aGlzIGZyYW1lIGluc3RhbmNlCisgKiBAcGFyYW1baW5dIGlkIFRoZSBpbnN0YW5jZSBJRCBmb3IgdGhpcyBmcmFtZSBpbnN0YW5jZSBvciBOVUxMCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X2ZyYW1lX2JlZ2luX3YzKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCAqaWQpOworCisvKioKKyAqIEBpbmdyb3VwIGZyYW1lcworICogQGJyaWVmIEVuZCBhIGZyYW1lIGluc3RhbmNlLgorICogVGhlIGZpcnN0IGNhbGwgdG8gX19pdHRfZnJhbWVfZW5kIHdpdGggYSBnaXZlbiBJRAorICogZW5kcyB0aGUgZnJhbWUuIFN1Y2Nlc3NpdmUgY2FsbHMgd2l0aCB0aGUgc2FtZSBJRCBhcmUgaWdub3JlZCwgYXMgYXJlCisgKiBjYWxscyB0aGF0IGRvIG5vdCBoYXZlIGEgbWF0Y2hpbmcgX19pdHRfZnJhbWVfYmVnaW4gY2FsbC4KKyAqIEBwYXJhbVtpbl0gZG9tYWluIFRoZSBkb21haW4gZm9yIHRoaXMgZnJhbWUgaW5zdGFuY2UKKyAqIEBwYXJhbVtpbl0gaWQgVGhlIGluc3RhbmNlIElEIGZvciB0aGlzIGZyYW1lIGluc3RhbmNlIG9yIE5VTEwgZm9yIGN1cnJlbnQKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfZnJhbWVfZW5kX3YzKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCAqaWQpOworCisvKioKKyAqIEBpbmdyb3VwIGZyYW1lcworICogQGJyaWVmIFN1Ym1pdHMgYSBmcmFtZSBpbnN0YW5jZS4KKyAqIFN1Y2Nlc3NpdmUgY2FsbHMgdG8gX19pdHRfZnJhbWVfYmVnaW4gb3IgX19pdHRfZnJhbWVfc3VibWl0IHdpdGggdGhlCisgKiBzYW1lIElEIGFyZSBpZ25vcmVkIHVudGlsIGEgY2FsbCB0byBfX2l0dF9mcmFtZV9lbmQgb3IgX19pdHRfZnJhbWVfc3VibWl0CisgKiB3aXRoIHRoZSBzYW1lIElELgorICogUGFzc2luZyBzcGVjaWFsIF9faXR0X3RpbWVzdGFtcF9ub25lIHZhbHVlIGFzICJlbmQiIGFyZ3VtZW50IG1lYW5zCisgKiB0YWtlIHRoZSBjdXJyZW50IHRpbWVzdGFtcCBhcyB0aGUgZW5kIHRpbWVzdGFtcC4KKyAqIEBwYXJhbVtpbl0gZG9tYWluIFRoZSBkb21haW4gZm9yIHRoaXMgZnJhbWUgaW5zdGFuY2UKKyAqIEBwYXJhbVtpbl0gaWQgVGhlIGluc3RhbmNlIElEIGZvciB0aGlzIGZyYW1lIGluc3RhbmNlIG9yIE5VTEwKKyAqIEBwYXJhbVtpbl0gYmVnaW4gVGltZXN0YW1wIG9mIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZyYW1lCisgKiBAcGFyYW1baW5dIGVuZCBUaW1lc3RhbXAgb2YgdGhlIGVuZCBvZiB0aGUgZnJhbWUKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfZnJhbWVfc3VibWl0X3YzKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCAqaWQsCisgICAgX19pdHRfdGltZXN0YW1wIGJlZ2luLCBfX2l0dF90aW1lc3RhbXAgZW5kKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgZnJhbWVfYmVnaW5fdjMsICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkICppZCkpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBmcmFtZV9lbmRfdjMsICAgIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgKmlkKSkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGZyYW1lX3N1Ym1pdF92MywgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCAqaWQsIF9faXR0X3RpbWVzdGFtcCBiZWdpbiwgX19pdHRfdGltZXN0YW1wIGVuZCkpCisjZGVmaW5lIF9faXR0X2ZyYW1lX2JlZ2luX3YzKGQseCkgICAgICBJVFROT1RJRllfVk9JRF9EMShmcmFtZV9iZWdpbl92MyxkLHgpCisjZGVmaW5lIF9faXR0X2ZyYW1lX2JlZ2luX3YzX3B0ciAgICAgICBJVFROT1RJRllfTkFNRShmcmFtZV9iZWdpbl92MykKKyNkZWZpbmUgX19pdHRfZnJhbWVfZW5kX3YzKGQseCkgICAgICAgIElUVE5PVElGWV9WT0lEX0QxKGZyYW1lX2VuZF92MyxkLHgpCisjZGVmaW5lIF9faXR0X2ZyYW1lX2VuZF92M19wdHIgICAgICAgICBJVFROT1RJRllfTkFNRShmcmFtZV9lbmRfdjMpCisjZGVmaW5lIF9faXR0X2ZyYW1lX3N1Ym1pdF92MyhkLHgsYixlKSBJVFROT1RJRllfVk9JRF9EMyhmcmFtZV9zdWJtaXRfdjMsZCx4LGIsZSkKKyNkZWZpbmUgX19pdHRfZnJhbWVfc3VibWl0X3YzX3B0ciAgICAgIElUVE5PVElGWV9OQU1FKGZyYW1lX3N1Ym1pdF92MykKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2ZyYW1lX2JlZ2luX3YzKGRvbWFpbixpZCkKKyNkZWZpbmUgX19pdHRfZnJhbWVfYmVnaW5fdjNfcHRyIDAKKyNkZWZpbmUgX19pdHRfZnJhbWVfZW5kX3YzKGRvbWFpbixpZCkKKyNkZWZpbmUgX19pdHRfZnJhbWVfZW5kX3YzX3B0ciAgIDAKKyNkZWZpbmUgX19pdHRfZnJhbWVfc3VibWl0X3YzKGRvbWFpbixpZCxiZWdpbixlbmQpCisjZGVmaW5lIF9faXR0X2ZyYW1lX3N1Ym1pdF92M19wdHIgICAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfZnJhbWVfYmVnaW5fdjNfcHRyIDAKKyNkZWZpbmUgX19pdHRfZnJhbWVfZW5kX3YzX3B0ciAgIDAKKyNkZWZpbmUgX19pdHRfZnJhbWVfc3VibWl0X3YzX3B0ciAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKy8qKiBAfSBmcmFtZXMgZ3JvdXAgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBkZWZncm91cCB0YXNrZ3JvdXAgVGFzayBHcm91cAorICogQGluZ3JvdXAgcHVibGljCisgKiBUYXNrIEdyb3VwCisgKiBAeworICovCisvKioKKyAqIEBpbmdyb3VwIHRhc2tfZ3JvdXBzCisgKiBAYnJpZWYgRGVub3RlcyBhIHRhc2tfZ3JvdXAgaW5zdGFuY2UuCisgKiBTdWNjZXNzaXZlIGNhbGxzIHRvIF9faXR0X3Rhc2tfZ3JvdXAgd2l0aCB0aGUgc2FtZSBJRCBhcmUgaWdub3JlZC4KKyAqIEBwYXJhbVtpbl0gZG9tYWluIFRoZSBkb21haW4gZm9yIHRoaXMgdGFza19ncm91cCBpbnN0YW5jZQorICogQHBhcmFtW2luXSBpZCBUaGUgaW5zdGFuY2UgSUQgZm9yIHRoaXMgdGFza19ncm91cCBpbnN0YW5jZS4gTXVzdCBub3QgYmUgX19pdHRfbnVsbC4KKyAqIEBwYXJhbVtpbl0gcGFyZW50aWQgVGhlIGluc3RhbmNlIElEIGZvciB0aGUgcGFyZW50IG9mIHRoaXMgdGFza19ncm91cCBpbnN0YW5jZSwgb3IgX19pdHRfbnVsbC4KKyAqIEBwYXJhbVtpbl0gbmFtZSBUaGUgbmFtZSBvZiB0aGlzIHRhc2tfZ3JvdXAKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfdGFza19ncm91cChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaWQsIF9faXR0X2lkIHBhcmVudGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlICpuYW1lKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgdGFza19ncm91cCwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCwgX19pdHRfaWQgcGFyZW50aWQsIF9faXR0X3N0cmluZ19oYW5kbGUgKm5hbWUpKQorI2RlZmluZSBfX2l0dF90YXNrX2dyb3VwKGQseCx5LHopIElUVE5PVElGWV9WT0lEX0QzKHRhc2tfZ3JvdXAsZCx4LHkseikKKyNkZWZpbmUgX19pdHRfdGFza19ncm91cF9wdHIgICAgICBJVFROT1RJRllfTkFNRSh0YXNrX2dyb3VwKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfdGFza19ncm91cChkLHgseSx6KQorI2RlZmluZSBfX2l0dF90YXNrX2dyb3VwX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfdGFza19ncm91cF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworLyoqIEB9IHRhc2tncm91cCBncm91cCAqLworCisvKioKKyAqIEBkZWZncm91cCB0YXNrcyBUYXNrcworICogQGluZ3JvdXAgcHVibGljCisgKiBBIHRhc2sgaW5zdGFuY2UgcmVwcmVzZW50cyBhIHBpZWNlIG9mIHdvcmsgcGVyZm9ybWVkIGJ5IGEgcGFydGljdWxhcgorICogdGhyZWFkIGZvciBhIHBlcmlvZCBvZiB0aW1lLiBBIGNhbGwgdG8gX19pdHRfdGFza19iZWdpbiBjcmVhdGVzIGEKKyAqIHRhc2sgaW5zdGFuY2UuIFRoaXMgYmVjb21lcyB0aGUgY3VycmVudCBpbnN0YW5jZSBmb3IgdGhhdCB0YXNrIG9uIHRoYXQKKyAqIHRocmVhZC4gQSBmb2xsb3dpbmcgY2FsbCB0byBfX2l0dF90YXNrX2VuZCBvbiB0aGUgc2FtZSB0aHJlYWQgZW5kcyB0aGUKKyAqIGluc3RhbmNlLiBUaGVyZSBtYXkgYmUgbXVsdGlwbGUgc2ltdWx0YW5lb3VzIGluc3RhbmNlcyBvZiB0YXNrcyB3aXRoIHRoZQorICogc2FtZSBuYW1lIG9uIGRpZmZlcmVudCB0aHJlYWRzLiBJZiBhbiBJRCBpcyBzcGVjaWZpZWQsIHRoZSB0YXNrIGluc3RhbmNlCisgKiByZWNlaXZlcyB0aGF0IElELiBOZXN0ZWQgdGFza3MgYXJlIGFsbG93ZWQuCisgKgorICogTm90ZTogVGhlIHRhc2sgaXMgZGVmaW5lZCBieSB0aGUgYnJhY2tldGluZyBvZiBfX2l0dF90YXNrX2JlZ2luIGFuZAorICogX19pdHRfdGFza19lbmQgb24gdGhlIHNhbWUgdGhyZWFkLiBJZiBzb21lIHNjaGVkdWxpbmcgbWVjaGFuaXNtIGNhdXNlcworICogdGFzayBzd2l0Y2hpbmcgKHRoZSB0aHJlYWQgZXhlY3V0ZXMgYSBkaWZmZXJlbnQgdXNlciB0YXNrKSBvciB0YXNrCisgKiBzd2l0Y2hpbmcgKHRoZSB1c2VyIHRhc2sgc3dpdGNoZXMgdG8gYSBkaWZmZXJlbnQgdGhyZWFkKSB0aGVuIHRoaXMgYnJlYWtzCisgKiB0aGUgbm90aW9uIG9mICBjdXJyZW50IGluc3RhbmNlLiBBZGRpdGlvbmFsIEFQSSBjYWxscyBhcmUgcmVxdWlyZWQgdG8KKyAqIGRlYWwgd2l0aCB0aGF0IHBvc3NpYmlsaXR5LgorICogQHsKKyAqLworCisvKioKKyAqIEBpbmdyb3VwIHRhc2tzCisgKiBAYnJpZWYgQmVnaW4gYSB0YXNrIGluc3RhbmNlLgorICogQHBhcmFtW2luXSBkb21haW4gVGhlIGRvbWFpbiBmb3IgdGhpcyB0YXNrCisgKiBAcGFyYW1baW5dIHRhc2tpZCBUaGUgaW5zdGFuY2UgSUQgZm9yIHRoaXMgdGFzayBpbnN0YW5jZSwgb3IgX19pdHRfbnVsbAorICogQHBhcmFtW2luXSBwYXJlbnRpZCBUaGUgcGFyZW50IGluc3RhbmNlIHRvIHdoaWNoIHRoaXMgdGFzayBpbnN0YW5jZSBiZWxvbmdzLCBvciBfX2l0dF9udWxsCisgKiBAcGFyYW1baW5dIG5hbWUgVGhlIG5hbWUgb2YgdGhpcyB0YXNrCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3Rhc2tfYmVnaW4oY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIHRhc2tpZCwgX19pdHRfaWQgcGFyZW50aWQsIF9faXR0X3N0cmluZ19oYW5kbGUgKm5hbWUpOworCisvKioKKyAqIEBpbmdyb3VwIHRhc2tzCisgKiBAYnJpZWYgQmVnaW4gYSB0YXNrIGluc3RhbmNlLgorICogQHBhcmFtW2luXSBkb21haW4gVGhlIGRvbWFpbiBmb3IgdGhpcyB0YXNrCisgKiBAcGFyYW1baW5dIHRhc2tpZCBUaGUgaWRlbnRpZmllciBmb3IgdGhpcyB0YXNrIGluc3RhbmNlIChtYXkgYmUgMCkKKyAqIEBwYXJhbVtpbl0gcGFyZW50aWQgVGhlIHBhcmVudCBvZiB0aGlzIHRhc2sgKG1heSBiZSAwKQorICogQHBhcmFtW2luXSBmbiBUaGUgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24geW91IGFyZSB0cmFjaW5nCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3Rhc2tfYmVnaW5fZm4oY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIHRhc2tpZCwgX19pdHRfaWQgcGFyZW50aWQsIHZvaWQqIGZuKTsKKworLyoqCisgKiBAaW5ncm91cCB0YXNrcworICogQGJyaWVmIEVuZCB0aGUgY3VycmVudCB0YXNrIGluc3RhbmNlLgorICogQHBhcmFtW2luXSBkb21haW4gVGhlIGRvbWFpbiBmb3IgdGhpcyB0YXNrCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3Rhc2tfZW5kKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgdGFza19iZWdpbiwgICAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCwgX19pdHRfaWQgcGFyZW50aWQsIF9faXR0X3N0cmluZ19oYW5kbGUgKm5hbWUpKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgdGFza19iZWdpbl9mbiwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCwgX19pdHRfaWQgcGFyZW50aWQsIHZvaWQqIGZuKSkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHRhc2tfZW5kLCAgICAgIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbikpCisjZGVmaW5lIF9faXR0X3Rhc2tfYmVnaW4oZCx4LHkseikgICAgSVRUTk9USUZZX1ZPSURfRDModGFza19iZWdpbixkLHgseSx6KQorI2RlZmluZSBfX2l0dF90YXNrX2JlZ2luX3B0ciAgICAgICAgIElUVE5PVElGWV9OQU1FKHRhc2tfYmVnaW4pCisjZGVmaW5lIF9faXR0X3Rhc2tfYmVnaW5fZm4oZCx4LHkseikgSVRUTk9USUZZX1ZPSURfRDModGFza19iZWdpbl9mbixkLHgseSx6KQorI2RlZmluZSBfX2l0dF90YXNrX2JlZ2luX2ZuX3B0ciAgICAgIElUVE5PVElGWV9OQU1FKHRhc2tfYmVnaW5fZm4pCisjZGVmaW5lIF9faXR0X3Rhc2tfZW5kKGQpICAgICAgICAgICAgSVRUTk9USUZZX1ZPSURfRDAodGFza19lbmQsZCkKKyNkZWZpbmUgX19pdHRfdGFza19lbmRfcHRyICAgICAgICAgICBJVFROT1RJRllfTkFNRSh0YXNrX2VuZCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X3Rhc2tfYmVnaW4oZG9tYWluLGlkLHBhcmVudGlkLG5hbWUpCisjZGVmaW5lIF9faXR0X3Rhc2tfYmVnaW5fcHRyICAgIDAKKyNkZWZpbmUgX19pdHRfdGFza19iZWdpbl9mbihkb21haW4saWQscGFyZW50aWQsZm4pCisjZGVmaW5lIF9faXR0X3Rhc2tfYmVnaW5fZm5fcHRyIDAKKyNkZWZpbmUgX19pdHRfdGFza19lbmQoZG9tYWluKQorI2RlZmluZSBfX2l0dF90YXNrX2VuZF9wdHIgICAgICAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfdGFza19iZWdpbl9wdHIgICAgMAorI2RlZmluZSBfX2l0dF90YXNrX2JlZ2luX2ZuX3B0ciAwCisjZGVmaW5lIF9faXR0X3Rhc2tfZW5kX3B0ciAgICAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKy8qKiBAfSB0YXNrcyBncm91cCAqLworCisvKioKKyAqIEBkZWZncm91cCBjb3VudGVycyBDb3VudGVycworICogQGluZ3JvdXAgcHVibGljCisgKiBDb3VudGVycyBhcmUgdXNlci1kZWZpbmVkIG9iamVjdHMgd2l0aCBhIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZworICogdmFsdWUuIENvdW50ZXIgdmFsdWVzIGFyZSA2NC1iaXQgdW5zaWduZWQgaW50ZWdlcnMuIENvdW50ZXIgdmFsdWVzCisgKiBhcmUgdHJhY2tlZCBwZXItdGhyZWFkLiBDb3VudGVycyBoYXZlIG5hbWVzIHRoYXQgY2FuIGJlIGRpc3BsYXllZCBpbgorICogdGhlIHRvb2xzLgorICogQHsKKyAqLworCisvKioKKyAqIEBpbmdyb3VwIGNvdW50ZXJzCisgKiBAYnJpZWYgSW5jcmVtZW50IGEgY291bnRlciBieSBvbmUuCisgKiBUaGUgZmlyc3QgY2FsbCB3aXRoIGEgZ2l2ZW4gbmFtZSBjcmVhdGVzIGEgY291bnRlciBieSB0aGF0IG5hbWUgYW5kIHNldHMgaXRzCisgKiB2YWx1ZSB0byB6ZXJvIG9uIGV2ZXJ5IHRocmVhZC4gU3VjY2Vzc2l2ZSBjYWxscyBpbmNyZW1lbnQgdGhlIGNvdW50ZXIgdmFsdWUKKyAqIG9uIHRoZSB0aHJlYWQgb24gd2hpY2ggdGhlIGNhbGwgaXMgaXNzdWVkLgorICogQHBhcmFtW2luXSBkb21haW4gVGhlIGRvbWFpbiBjb250cm9sbGluZyB0aGUgY2FsbC4gQ291bnRlciBuYW1lcyBhcmUgbm90IGRvbWFpbiBzcGVjaWZpYy4KKyAqICAgICAgICAgICAgVGhlIGRvbWFpbiBhcmd1bWVudCBpcyB1c2VkIG9ubHkgdG8gZW5hYmxlIG9yIGRpc2FibGUgdGhlIEFQSSBjYWxscy4KKyAqIEBwYXJhbVtpbl0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgY291bnRlcgorICovCit2b2lkIElUVEFQSSBfX2l0dF9jb3VudGVyX2luY192Myhjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfc3RyaW5nX2hhbmRsZSAqbmFtZSk7CisKKy8qKgorICogQGluZ3JvdXAgY291bnRlcnMKKyAqIEBicmllZiBJbmNyZW1lbnQgYSBjb3VudGVyIGJ5IHRoZSB2YWx1ZSBzcGVjaWZpZWQgaW4gZGVsdGEuCisgKiBAcGFyYW1baW5dIGRvbWFpbiBUaGUgZG9tYWluIGNvbnRyb2xsaW5nIHRoZSBjYWxsLiBDb3VudGVyIG5hbWVzIGFyZSBub3QgZG9tYWluIHNwZWNpZmljLgorICogICAgICAgICAgICBUaGUgZG9tYWluIGFyZ3VtZW50IGlzIHVzZWQgb25seSB0byBlbmFibGUgb3IgZGlzYWJsZSB0aGUgQVBJIGNhbGxzLgorICogQHBhcmFtW2luXSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBjb3VudGVyCisgKiBAcGFyYW1baW5dIGRlbHRhIFRoZSBhbW91bnQgYnkgd2hpY2ggdG8gaW5jcmVtZW50IHRoZSBjb3VudGVyCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X2NvdW50ZXJfaW5jX2RlbHRhX3YzKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9zdHJpbmdfaGFuZGxlICpuYW1lLCB1bnNpZ25lZCBsb25nIGxvbmcgZGVsdGEpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBjb3VudGVyX2luY192MywgICAgICAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9zdHJpbmdfaGFuZGxlICpuYW1lKSkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGNvdW50ZXJfaW5jX2RlbHRhX3YzLCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X3N0cmluZ19oYW5kbGUgKm5hbWUsIHVuc2lnbmVkIGxvbmcgbG9uZyBkZWx0YSkpCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfaW5jX3YzKGQseCkgICAgICAgICBJVFROT1RJRllfVk9JRF9EMShjb3VudGVyX2luY192MyxkLHgpCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfaW5jX3YzX3B0ciAgICAgICAgICBJVFROT1RJRllfTkFNRShjb3VudGVyX2luY192MykKKyNkZWZpbmUgX19pdHRfY291bnRlcl9pbmNfZGVsdGFfdjMoZCx4LHkpIElUVE5PVElGWV9WT0lEX0QyKGNvdW50ZXJfaW5jX2RlbHRhX3YzLGQseCx5KQorI2RlZmluZSBfX2l0dF9jb3VudGVyX2luY19kZWx0YV92M19wdHIgICAgSVRUTk9USUZZX05BTUUoY291bnRlcl9pbmNfZGVsdGFfdjMpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9jb3VudGVyX2luY192Myhkb21haW4sbmFtZSkKKyNkZWZpbmUgX19pdHRfY291bnRlcl9pbmNfdjNfcHRyICAgICAgIDAKKyNkZWZpbmUgX19pdHRfY291bnRlcl9pbmNfZGVsdGFfdjMoZG9tYWluLG5hbWUsZGVsdGEpCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfaW5jX2RlbHRhX3YzX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfY291bnRlcl9pbmNfdjNfcHRyICAgICAgIDAKKyNkZWZpbmUgX19pdHRfY291bnRlcl9pbmNfZGVsdGFfdjNfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKy8qKiBAfSBjb3VudGVycyBncm91cCAqLworCisvKioKKyAqIEBkZWZncm91cCBtYXJrZXJzIE1hcmtlcnMKKyAqIE1hcmtlcnMgcmVwcmVzZW50IGEgc2luZ2xlIGRpc2NyZWV0IGV2ZW50IGluIHRpbWUuIE1hcmtlcnMgaGF2ZSBhIHNjb3BlLAorICogZGVzY3JpYmVkIGJ5IGFuIGVudW1lcmF0ZWQgdHlwZSBfX2l0dF9zY29wZS4gTWFya2VycyBhcmUgY3JlYXRlZCBieQorICogdGhlIEFQSSBjYWxsIF9faXR0X21hcmtlci4gQSBtYXJrZXIgaW5zdGFuY2UgY2FuIGJlIGdpdmVuIGFuIElEIGZvciB1c2UgaW4KKyAqIGFkZGluZyBtZXRhZGF0YS4KKyAqIEB7CisgKi8KKworLyoqCisgKiBAYnJpZWYgRGVzY3JpYmVzIHRoZSBzY29wZSBvZiBhbiBldmVudCBvYmplY3QgaW4gdGhlIHRyYWNlLgorICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBfX2l0dF9zY29wZV91bmtub3duID0gMCwKKyAgICBfX2l0dF9zY29wZV9nbG9iYWwsCisgICAgX19pdHRfc2NvcGVfdHJhY2tfZ3JvdXAsCisgICAgX19pdHRfc2NvcGVfdHJhY2ssCisgICAgX19pdHRfc2NvcGVfdGFzaywKKyAgICBfX2l0dF9zY29wZV9tYXJrZXIKK30gX19pdHRfc2NvcGU7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2RlZmluZSBfX2l0dF9tYXJrZXJfc2NvcGVfdW5rbm93biAgX19pdHRfc2NvcGVfdW5rbm93bgorI2RlZmluZSBfX2l0dF9tYXJrZXJfc2NvcGVfZ2xvYmFsICAgX19pdHRfc2NvcGVfZ2xvYmFsCisjZGVmaW5lIF9faXR0X21hcmtlcl9zY29wZV9wcm9jZXNzICBfX2l0dF9zY29wZV90cmFja19ncm91cAorI2RlZmluZSBfX2l0dF9tYXJrZXJfc2NvcGVfdGhyZWFkICAgX19pdHRfc2NvcGVfdHJhY2sKKyNkZWZpbmUgX19pdHRfbWFya2VyX3Njb3BlX3Rhc2sgICAgIF9faXR0X3Njb3BlX3Rhc2sKKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBpbmdyb3VwIG1hcmtlcnMKKyAqIEBicmllZiBDcmVhdGUgYSBtYXJrZXIgaW5zdGFuY2UKKyAqIEBwYXJhbVtpbl0gZG9tYWluIFRoZSBkb21haW4gZm9yIHRoaXMgbWFya2VyCisgKiBAcGFyYW1baW5dIGlkIFRoZSBpbnN0YW5jZSBJRCBmb3IgdGhpcyBtYXJrZXIgb3IgX19pdHRfbnVsbAorICogQHBhcmFtW2luXSBuYW1lIFRoZSBuYW1lIGZvciB0aGlzIG1hcmtlcgorICogQHBhcmFtW2luXSBzY29wZSBUaGUgc2NvcGUgZm9yIHRoaXMgbWFya2VyCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X21hcmtlcihjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaWQsIF9faXR0X3N0cmluZ19oYW5kbGUgKm5hbWUsIF9faXR0X3Njb3BlIHNjb3BlKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbWFya2VyLCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlICpuYW1lLCBfX2l0dF9zY29wZSBzY29wZSkpCisjZGVmaW5lIF9faXR0X21hcmtlcihkLHgseSx6KSBJVFROT1RJRllfVk9JRF9EMyhtYXJrZXIsZCx4LHkseikKKyNkZWZpbmUgX19pdHRfbWFya2VyX3B0ciAgICAgIElUVE5PVElGWV9OQU1FKG1hcmtlcikKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X21hcmtlcihkb21haW4saWQsbmFtZSxzY29wZSkKKyNkZWZpbmUgX19pdHRfbWFya2VyX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfbWFya2VyX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisvKiogQH0gbWFya2VycyBncm91cCAqLworCisvKioKKyAqIEBkZWZncm91cCBtZXRhZGF0YSBNZXRhZGF0YQorICogVGhlIG1ldGFkYXRhIEFQSSBpcyB1c2VkIHRvIGF0dGFjaCBleHRyYSBpbmZvcm1hdGlvbiB0byBuYW1lZAorICogZW50aXRpZXMuIE1ldGFkYXRhIGNhbiBiZSBhdHRhY2hlZCB0byBhbiBpZGVudGlmaWVkIG5hbWVkIGVudGl0eSBieSBJRCwKKyAqIG9yIHRvIHRoZSBjdXJyZW50IGVudGl0eSAod2hpY2ggaXMgYWx3YXlzIGEgdGFzaykuCisgKgorICogQ29uY2VwdHVhbGx5IG1ldGFkYXRhIGhhcyBhIHR5cGUgKHdoYXQga2luZCBvZiBtZXRhZGF0YSksIGEga2V5ICh0aGUKKyAqIG5hbWUgb2YgdGhlIG1ldGFkYXRhKSwgYW5kIGEgdmFsdWUgKHRoZSBhY3R1YWwgZGF0YSkuIFRoZSBlbmNvZGluZyBvZgorICogdGhlIHZhbHVlIGRlcGVuZHMgb24gdGhlIHR5cGUgb2YgdGhlIG1ldGFkYXRhLgorICoKKyAqIFRoZSB0eXBlIG9mIG1ldGFkYXRhIGlzIHNwZWNpZmllZCBieSBhbiBlbnVtZXJhdGVkIHR5cGUgX19pdHRfbWV0ZGF0YV90eXBlLgorICogQHsKKyAqLworCisvKioKKyAqIEBpbmdyb3VwIHBhcmFtZXRlcnMKKyAqIEBicmllZiBkZXNjcmliZXMgdGhlIHR5cGUgb2YgbWV0YWRhdGEKKyAqLwordHlwZWRlZiBlbnVtIHsKKyAgICBfX2l0dF9tZXRhZGF0YV91bmtub3duID0gMCwKKyAgICBfX2l0dF9tZXRhZGF0YV91NjQsICAgICAvKio8IFVuc2lnbmVkIDY0LWJpdCBpbnRlZ2VyICovCisgICAgX19pdHRfbWV0YWRhdGFfczY0LCAgICAgLyoqPCBTaWduZWQgNjQtYml0IGludGVnZXIgKi8KKyAgICBfX2l0dF9tZXRhZGF0YV91MzIsICAgICAvKio8IFVuc2lnbmVkIDMyLWJpdCBpbnRlZ2VyICovCisgICAgX19pdHRfbWV0YWRhdGFfczMyLCAgICAgLyoqPCBTaWduZWQgMzItYml0IGludGVnZXIgKi8KKyAgICBfX2l0dF9tZXRhZGF0YV91MTYsICAgICAvKio8IFVuc2lnbmVkIDE2LWJpdCBpbnRlZ2VyICovCisgICAgX19pdHRfbWV0YWRhdGFfczE2LCAgICAgLyoqPCBTaWduZWQgMTYtYml0IGludGVnZXIgKi8KKyAgICBfX2l0dF9tZXRhZGF0YV9mbG9hdCwgICAvKio8IFNpZ25lZCAzMi1iaXQgZmxvYXRpbmctcG9pbnQgKi8KKyAgICBfX2l0dF9tZXRhZGF0YV9kb3VibGUgICAvKio8IFNJZ25lZCA2NC1iaXQgZmxvYXRpbmctcG9pbnQgKi8KK30gX19pdHRfbWV0YWRhdGFfdHlwZTsKKworLyoqCisgKiBAaW5ncm91cCBwYXJhbWV0ZXJzCisgKiBAYnJpZWYgQWRkIG1ldGFkYXRhIHRvIGFuIGluc3RhbmNlIG9mIGEgbmFtZWQgZW50aXR5LgorICogQHBhcmFtW2luXSBkb21haW4gVGhlIGRvbWFpbiBjb250cm9sbGluZyB0aGUgY2FsbAorICogQHBhcmFtW2luXSBpZCBUaGUgaWRlbnRpZmllciBvZiB0aGUgaW5zdGFuY2UgdG8gd2hpY2ggdGhlIG1ldGFkYXRhIGlzIHRvIGJlIGFkZGVkLCBvciBfX2l0dF9udWxsIHRvIGFkZCB0byB0aGUgY3VycmVudCB0YXNrCisgKiBAcGFyYW1baW5dIGtleSBUaGUgbmFtZSBvZiB0aGUgbWV0YWRhdGEKKyAqIEBwYXJhbVtpbl0gdHlwZSBUaGUgdHlwZSBvZiB0aGUgbWV0YWRhdGEKKyAqIEBwYXJhbVtpbl0gY291bnQgVGhlIG51bWJlciBvZiBlbGVtZW50cyBvZiB0aGUgZ2l2ZW4gdHlwZS4gSWYgY291bnQgPT0gMCwgbm8gbWV0YWRhdGEgd2lsbCBiZSBhZGRlZC4KKyAqIEBwYXJhbVtpbl0gZGF0YSBUaGUgbWV0YWRhdGEgaXRzZWxmCisqLwordm9pZCBJVFRBUEkgX19pdHRfbWV0YWRhdGFfYWRkKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCwgX19pdHRfc3RyaW5nX2hhbmRsZSAqa2V5LCBfX2l0dF9tZXRhZGF0YV90eXBlIHR5cGUsIHNpemVfdCBjb3VudCwgdm9pZCAqZGF0YSk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1ldGFkYXRhX2FkZCwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCwgX19pdHRfc3RyaW5nX2hhbmRsZSAqa2V5LCBfX2l0dF9tZXRhZGF0YV90eXBlIHR5cGUsIHNpemVfdCBjb3VudCwgdm9pZCAqZGF0YSkpCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX2FkZChkLHgseSx6LGEsYikgSVRUTk9USUZZX1ZPSURfRDUobWV0YWRhdGFfYWRkLGQseCx5LHosYSxiKQorI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9hZGRfcHRyICAgICAgICAgIElUVE5PVElGWV9OQU1FKG1ldGFkYXRhX2FkZCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX2FkZChkLHgseSx6LGEsYikKKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfYWRkX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfYWRkX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGluZ3JvdXAgcGFyYW1ldGVycworICogQGJyaWVmIEFkZCBzdHJpbmcgbWV0YWRhdGEgdG8gYW4gaW5zdGFuY2Ugb2YgYSBuYW1lZCBlbnRpdHkuCisgKiBAcGFyYW1baW5dIGRvbWFpbiBUaGUgZG9tYWluIGNvbnRyb2xsaW5nIHRoZSBjYWxsCisgKiBAcGFyYW1baW5dIGlkIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBpbnN0YW5jZSB0byB3aGljaCB0aGUgbWV0YWRhdGEgaXMgdG8gYmUgYWRkZWQsIG9yIF9faXR0X251bGwgdG8gYWRkIHRvIHRoZSBjdXJyZW50IHRhc2sKKyAqIEBwYXJhbVtpbl0ga2V5IFRoZSBuYW1lIG9mIHRoZSBtZXRhZGF0YQorICogQHBhcmFtW2luXSBkYXRhIFRoZSBtZXRhZGF0YSBpdHNlbGYKKyAqIEBwYXJhbVtpbl0gbGVuZ3RoIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nLCBvciAtMSBpZiB0aGUgbGVuZ3RoIGlzIHVua25vd24gYnV0IHRoZSBzdHJpbmcgaXMgbnVsbC10ZXJtaW5hdGVkIAorKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK3ZvaWQgSVRUQVBJIF9faXR0X21ldGFkYXRhX3N0cl9hZGRBKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCwgX19pdHRfc3RyaW5nX2hhbmRsZSAqa2V5LCBjb25zdCBjaGFyICpkYXRhLCBzaXplX3QgbGVuZ3RoKTsKK3ZvaWQgSVRUQVBJIF9faXR0X21ldGFkYXRhX3N0cl9hZGRXKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCwgX19pdHRfc3RyaW5nX2hhbmRsZSAqa2V5LCBjb25zdCB3Y2hhcl90ICpkYXRhLCBzaXplX3QgbGVuZ3RoKTsKKyNpZiBkZWZpbmVkKFVOSUNPREUpIHx8IGRlZmluZWQoX1VOSUNPREUpCisjICBkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZCAgICAgX19pdHRfbWV0YWRhdGFfc3RyX2FkZFcKKyMgIGRlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkX3B0ciBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkV19wdHIKKyNlbHNlIC8qIFVOSUNPREUgKi8KKyMgIGRlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkICAgICBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkQQorIyAgZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRfcHRyIF9faXR0X21ldGFkYXRhX3N0cl9hZGRBX3B0cgorI2VuZGlmIC8qIFVOSUNPREUgKi8KKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLwordm9pZCBJVFRBUEkgX19pdHRfbWV0YWRhdGFfc3RyX2FkZChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaWQsIF9faXR0X3N0cmluZ19oYW5kbGUgKmtleSwgY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IGxlbmd0aCk7CisjZW5kaWYKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbWV0YWRhdGFfc3RyX2FkZEEsIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaWQsIF9faXR0X3N0cmluZ19oYW5kbGUgKmtleSwgY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IGxlbmd0aCkpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtZXRhZGF0YV9zdHJfYWRkVywgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCwgX19pdHRfc3RyaW5nX2hhbmRsZSAqa2V5LCBjb25zdCB3Y2hhcl90ICpkYXRhLCBzaXplX3QgbGVuZ3RoKSkKKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1ldGFkYXRhX3N0cl9hZGQsIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaWQsIF9faXR0X3N0cmluZ19oYW5kbGUgKmtleSwgY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IGxlbmd0aCkpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRBKGQseCx5LHosYSkgSVRUTk9USUZZX1ZPSURfRDQobWV0YWRhdGFfc3RyX2FkZEEsZCx4LHkseixhKQorI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkQV9wdHIgICAgICAgIElUVE5PVElGWV9OQU1FKG1ldGFkYXRhX3N0cl9hZGRBKQorI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkVyhkLHgseSx6LGEpIElUVE5PVElGWV9WT0lEX0Q0KG1ldGFkYXRhX3N0cl9hZGRXLGQseCx5LHosYSkKKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZFdfcHRyICAgICAgICBJVFROT1RJRllfTkFNRShtZXRhZGF0YV9zdHJfYWRkVykKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkKGQseCx5LHosYSkgIElUVE5PVElGWV9WT0lEX0Q0KG1ldGFkYXRhX3N0cl9hZGQsZCx4LHkseixhKQorI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkX3B0ciAgICAgICAgIElUVE5PVElGWV9OQU1FKG1ldGFkYXRhX3N0cl9hZGQpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkQShkLHgseSx6LGEpIAorI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkQV9wdHIgMAorI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkVyhkLHgseSx6LGEpIAorI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGQoZCx4LHkseixhKQorI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkX3B0ciAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZEFfcHRyIDAKKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZFdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkX3B0ciAgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBpbmdyb3VwIHBhcmFtZXRlcnMKKyAqIEBicmllZiBBZGQgbWV0YWRhdGEgdG8gYW4gaW5zdGFuY2Ugb2YgYSBuYW1lZCBlbnRpdHkuCisgKiBAcGFyYW1baW5dIGRvbWFpbiBUaGUgZG9tYWluIGNvbnRyb2xsaW5nIHRoZSBjYWxsCisgKiBAcGFyYW1baW5dIHNjb3BlIFRoZSBzY29wZSBvZiB0aGUgaW5zdGFuY2UgdG8gd2hpY2ggdGhlIG1ldGFkYXRhIGlzIHRvIGJlIGFkZGVkCisKKyAqIEBwYXJhbVtpbl0gaWQgVGhlIGlkZW50aWZpZXIgb2YgdGhlIGluc3RhbmNlIHRvIHdoaWNoIHRoZSBtZXRhZGF0YSBpcyB0byBiZSBhZGRlZCwgb3IgX19pdHRfbnVsbCB0byBhZGQgdG8gdGhlIGN1cnJlbnQgdGFzaworIAorICogQHBhcmFtW2luXSBrZXkgVGhlIG5hbWUgb2YgdGhlIG1ldGFkYXRhCisgKiBAcGFyYW1baW5dIHR5cGUgVGhlIHR5cGUgb2YgdGhlIG1ldGFkYXRhCisgKiBAcGFyYW1baW5dIGNvdW50IFRoZSBudW1iZXIgb2YgZWxlbWVudHMgb2YgdGhlIGdpdmVuIHR5cGUuIElmIGNvdW50ID09IDAsIG5vIG1ldGFkYXRhIHdpbGwgYmUgYWRkZWQuCisgKiBAcGFyYW1baW5dIGRhdGEgVGhlIG1ldGFkYXRhIGl0c2VsZgorKi8KK3ZvaWQgSVRUQVBJIF9faXR0X21ldGFkYXRhX2FkZF93aXRoX3Njb3BlKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9zY29wZSBzY29wZSwgX19pdHRfc3RyaW5nX2hhbmRsZSAqa2V5LCBfX2l0dF9tZXRhZGF0YV90eXBlIHR5cGUsIHNpemVfdCBjb3VudCwgdm9pZCAqZGF0YSk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1ldGFkYXRhX2FkZF93aXRoX3Njb3BlLCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X3Njb3BlIHNjb3BlLCBfX2l0dF9zdHJpbmdfaGFuZGxlICprZXksIF9faXR0X21ldGFkYXRhX3R5cGUgdHlwZSwgc2l6ZV90IGNvdW50LCB2b2lkICpkYXRhKSkKKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfYWRkX3dpdGhfc2NvcGUoZCx4LHkseixhLGIpIElUVE5PVElGWV9WT0lEX0Q1KG1ldGFkYXRhX2FkZF93aXRoX3Njb3BlLGQseCx5LHosYSxiKQorI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9hZGRfd2l0aF9zY29wZV9wdHIgICAgICAgICAgSVRUTk9USUZZX05BTUUobWV0YWRhdGFfYWRkX3dpdGhfc2NvcGUpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9hZGRfd2l0aF9zY29wZShkLHgseSx6LGEsYikKKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfYWRkX3dpdGhfc2NvcGVfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9hZGRfd2l0aF9zY29wZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBpbmdyb3VwIHBhcmFtZXRlcnMKKyAqIEBicmllZiBBZGQgc3RyaW5nIG1ldGFkYXRhIHRvIGFuIGluc3RhbmNlIG9mIGEgbmFtZWQgZW50aXR5LgorICogQHBhcmFtW2luXSBkb21haW4gVGhlIGRvbWFpbiBjb250cm9sbGluZyB0aGUgY2FsbAorICogQHBhcmFtW2luXSBzY29wZSBUaGUgc2NvcGUgb2YgdGhlIGluc3RhbmNlIHRvIHdoaWNoIHRoZSBtZXRhZGF0YSBpcyB0byBiZSBhZGRlZAorCisgKiBAcGFyYW1baW5dIGlkIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBpbnN0YW5jZSB0byB3aGljaCB0aGUgbWV0YWRhdGEgaXMgdG8gYmUgYWRkZWQsIG9yIF9faXR0X251bGwgdG8gYWRkIHRvIHRoZSBjdXJyZW50IHRhc2sKKworICogQHBhcmFtW2luXSBrZXkgVGhlIG5hbWUgb2YgdGhlIG1ldGFkYXRhCisgKiBAcGFyYW1baW5dIGRhdGEgVGhlIG1ldGFkYXRhIGl0c2VsZgorICogQHBhcmFtW2luXSBsZW5ndGggVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcsIG9yIC0xIGlmIHRoZSBsZW5ndGggaXMgdW5rbm93biBidXQgdGhlIHN0cmluZyBpcyBudWxsLXRlcm1pbmF0ZWQgCisqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgordm9pZCBJVFRBUEkgX19pdHRfbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlQShjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfc2NvcGUgc2NvcGUsIF9faXR0X3N0cmluZ19oYW5kbGUgKmtleSwgY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IGxlbmd0aCk7Cit2b2lkIElUVEFQSSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGVXKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9zY29wZSBzY29wZSwgX19pdHRfc3RyaW5nX2hhbmRsZSAqa2V5LCBjb25zdCB3Y2hhcl90ICpkYXRhLCBzaXplX3QgbGVuZ3RoKTsKKyNpZiBkZWZpbmVkKFVOSUNPREUpIHx8IGRlZmluZWQoX1VOSUNPREUpCisjICBkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlICAgICBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGVXCisjICBkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlX3B0ciBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGVXX3B0cgorI2Vsc2UgLyogVU5JQ09ERSAqLworIyAgZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZSAgICAgX19pdHRfbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlQQorIyAgZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZV9wdHIgX19pdHRfbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlQV9wdHIKKyNlbmRpZiAvKiBVTklDT0RFICovCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK3ZvaWQgSVRUQVBJIF9faXR0X21ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZShjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfc2NvcGUgc2NvcGUsIF9faXR0X3N0cmluZ19oYW5kbGUgKmtleSwgY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IGxlbmd0aCk7CisjZW5kaWYKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlQSwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9zY29wZSBzY29wZSwgX19pdHRfc3RyaW5nX2hhbmRsZSAqa2V5LCBjb25zdCBjaGFyICpkYXRhLCBzaXplX3QgbGVuZ3RoKSkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZVcsIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfc2NvcGUgc2NvcGUsIF9faXR0X3N0cmluZ19oYW5kbGUgKmtleSwgY29uc3Qgd2NoYXJfdCAqZGF0YSwgc2l6ZV90IGxlbmd0aCkpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGUsIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfc2NvcGUgc2NvcGUsIF9faXR0X3N0cmluZ19oYW5kbGUgKmtleSwgY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IGxlbmd0aCkpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZUEoZCx4LHkseixhKSBJVFROT1RJRllfVk9JRF9ENChtZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGVBLGQseCx5LHosYSkKKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlQV9wdHIgICAgICAgIElUVE5PVElGWV9OQU1FKG1ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZUEpCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZVcoZCx4LHkseixhKSBJVFROT1RJRllfVk9JRF9ENChtZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGVXLGQseCx5LHosYSkKKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlV19wdHIgICAgICAgIElUVE5PVElGWV9OQU1FKG1ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZVcpCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlKGQseCx5LHosYSkgIElUVE5PVElGWV9WT0lEX0Q0KG1ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZSxkLHgseSx6LGEpCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZV9wdHIgICAgICAgICBJVFROT1RJRllfTkFNRShtZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGUpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGVBKGQseCx5LHosYSkgCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZUFfcHRyICAwCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZVcoZCx4LHkseixhKSAKKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlV19wdHIgIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGUoZCx4LHkseixhKQorI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGVfcHRyICAgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZUFfcHRyICAwCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZVdfcHRyICAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlX3B0ciAgIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqIEB9IG1ldGFkYXRhIGdyb3VwICovCisKKy8qKgorICogQGRlZmdyb3VwIHJlbGF0aW9ucyBSZWxhdGlvbnMKKyAqIEluc3RhbmNlcyBvZiBuYW1lZCBlbnRpdGllcyBjYW4gYmUgZXhwbGljaXRseSBhc3NvY2lhdGVkIHdpdGggb3RoZXIKKyAqIGluc3RhbmNlcyB1c2luZyBpbnN0YW5jZSBJRHMgYW5kIHRoZSByZWxhdGlvbnNoaXAgQVBJIGNhbGxzLgorICoKKyAqIEB7CisgKi8KKworLyoqCisgKiBAaW5ncm91cCByZWxhdGlvbnMKKyAqIEBicmllZiBUaGUga2luZCBvZiByZWxhdGlvbiBiZXR3ZWVuIHR3byBpbnN0YW5jZXMgaXMgc3BlY2lmaWVkIGJ5IHRoZSBlbnVtZXJhdGVkIHR5cGUgX19pdHRfcmVsYXRpb24uCisgKiBSZWxhdGlvbnMgYmV0d2VlbiBpbnN0YW5jZXMgY2FuIGJlIGFkZGVkIHdpdGggYW4gQVBJIGNhbGwuIFRoZSByZWxhdGlvbgorICogQVBJIHVzZXMgaW5zdGFuY2UgSURzLiBSZWxhdGlvbnMgY2FuIGJlIGFkZGVkIGJlZm9yZSBvciBhZnRlciB0aGUgYWN0dWFsCisgKiBpbnN0YW5jZXMgYXJlIGNyZWF0ZWQgYW5kIHBlcnNpc3QgaW5kZXBlbmRlbnRseSBvZiB0aGUgaW5zdGFuY2VzLiBUaGlzCisgKiBpcyB0aGUgbW90aXZhdGlvbiBmb3IgaGF2aW5nIGRpZmZlcmVudCBsaWZldGltZXMgZm9yIGluc3RhbmNlIElEcyBhbmQKKyAqIHRoZSBhY3R1YWwgaW5zdGFuY2VzLgorICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBfX2l0dF9yZWxhdGlvbl9pc191bmtub3duID0gMCwKKyAgICBfX2l0dF9yZWxhdGlvbl9pc19kZXBlbmRlbnRfb24sICAgICAgICAgLyoqPCAiQSBpcyBkZXBlbmRlbnQgb24gQiIgbWVhbnMgdGhhdCBBIGNhbm5vdCBzdGFydCB1bnRpbCBCIGNvbXBsZXRlcyAqLworICAgIF9faXR0X3JlbGF0aW9uX2lzX3NpYmxpbmdfb2YsICAgICAgICAgICAvKio8ICJBIGlzIHNpYmxpbmcgb2YgQiIgbWVhbnMgdGhhdCBBIGFuZCBCIHdlcmUgY3JlYXRlZCBhcyBhIGdyb3VwICovCisgICAgX19pdHRfcmVsYXRpb25faXNfcGFyZW50X29mLCAgICAgICAgICAgIC8qKjwgIkEgaXMgcGFyZW50IG9mIEIiIG1lYW5zIHRoYXQgQSBjcmVhdGVkIEIgKi8KKyAgICBfX2l0dF9yZWxhdGlvbl9pc19jb250aW51YXRpb25fb2YsICAgICAgLyoqPCAiQSBpcyBjb250aW51YXRpb24gb2YgQiIgbWVhbnMgdGhhdCBBIGFzc3VtZXMgdGhlIGRlcGVuZGVuY2llcyBvZiBCICovCisgICAgX19pdHRfcmVsYXRpb25faXNfY2hpbGRfb2YsICAgICAgICAgICAgIC8qKjwgIkEgaXMgY2hpbGQgb2YgQiIgbWVhbnMgdGhhdCBBIHdhcyBjcmVhdGVkIGJ5IEIgKGludmVyc2Ugb2YgaXNfcGFyZW50X29mKSAqLworICAgIF9faXR0X3JlbGF0aW9uX2lzX2NvbnRpbnVlZF9ieSwgICAgICAgICAvKio8ICJBIGlzIGNvbnRpbnVlZCBieSBCIiBtZWFucyB0aGF0IEIgYXNzdW1lcyB0aGUgZGVwZW5kZW5jaWVzIG9mIEEgKGludmVyc2Ugb2YgaXNfY29udGludWF0aW9uX29mKSAqLworICAgIF9faXR0X3JlbGF0aW9uX2lzX3ByZWRlY2Vzc29yX3RvICAgICAgICAvKio8ICJBIGlzIHByZWRlY2Vzc29yIHRvIEIiIG1lYW5zIHRoYXQgQiBjYW5ub3Qgc3RhcnQgdW50aWwgQSBjb21wbGV0ZXMgKGludmVyc2Ugb2YgaXNfZGVwZW5kZW50X29uKSAqLworfSBfX2l0dF9yZWxhdGlvbjsKKworLyoqCisgKiBAaW5ncm91cCByZWxhdGlvbnMKKyAqIEBicmllZiBBZGQgYSByZWxhdGlvbiB0byB0aGUgY3VycmVudCB0YXNrIGluc3RhbmNlLgorICogVGhlIGN1cnJlbnQgdGFzayBpbnN0YW5jZSBpcyB0aGUgaGVhZCBvZiB0aGUgcmVsYXRpb24uCisgKiBAcGFyYW1baW5dIGRvbWFpbiBUaGUgZG9tYWluIGNvbnRyb2xsaW5nIHRoaXMgY2FsbAorICogQHBhcmFtW2luXSByZWxhdGlvbiBUaGUga2luZCBvZiByZWxhdGlvbgorICogQHBhcmFtW2luXSB0YWlsIFRoZSBJRCBmb3IgdGhlIHRhaWwgb2YgdGhlIHJlbGF0aW9uCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3JlbGF0aW9uX2FkZF90b19jdXJyZW50KGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9yZWxhdGlvbiByZWxhdGlvbiwgX19pdHRfaWQgdGFpbCk7CisKKy8qKgorICogQGluZ3JvdXAgcmVsYXRpb25zCisgKiBAYnJpZWYgQWRkIGEgcmVsYXRpb24gYmV0d2VlbiB0d28gaW5zdGFuY2UgaWRlbnRpZmllcnMuCisgKiBAcGFyYW1baW5dIGRvbWFpbiBUaGUgZG9tYWluIGNvbnRyb2xsaW5nIHRoaXMgY2FsbAorICogQHBhcmFtW2luXSBoZWFkIFRoZSBJRCBmb3IgdGhlIGhlYWQgb2YgdGhlIHJlbGF0aW9uCisgKiBAcGFyYW1baW5dIHJlbGF0aW9uIFRoZSBraW5kIG9mIHJlbGF0aW9uCisgKiBAcGFyYW1baW5dIHRhaWwgVGhlIElEIGZvciB0aGUgdGFpbCBvZiB0aGUgcmVsYXRpb24KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfcmVsYXRpb25fYWRkKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBoZWFkLCBfX2l0dF9yZWxhdGlvbiByZWxhdGlvbiwgX19pdHRfaWQgdGFpbCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHJlbGF0aW9uX2FkZF90b19jdXJyZW50LCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X3JlbGF0aW9uIHJlbGF0aW9uLCBfX2l0dF9pZCB0YWlsKSkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHJlbGF0aW9uX2FkZCwgICAgICAgICAgICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGhlYWQsIF9faXR0X3JlbGF0aW9uIHJlbGF0aW9uLCBfX2l0dF9pZCB0YWlsKSkKKyNkZWZpbmUgX19pdHRfcmVsYXRpb25fYWRkX3RvX2N1cnJlbnQoZCx4LHkpIElUVE5PVElGWV9WT0lEX0QyKHJlbGF0aW9uX2FkZF90b19jdXJyZW50LGQseCx5KQorI2RlZmluZSBfX2l0dF9yZWxhdGlvbl9hZGRfdG9fY3VycmVudF9wdHIgICAgSVRUTk9USUZZX05BTUUocmVsYXRpb25fYWRkX3RvX2N1cnJlbnQpCisjZGVmaW5lIF9faXR0X3JlbGF0aW9uX2FkZChkLHgseSx6KSAgICAgICAgICBJVFROT1RJRllfVk9JRF9EMyhyZWxhdGlvbl9hZGQsZCx4LHkseikKKyNkZWZpbmUgX19pdHRfcmVsYXRpb25fYWRkX3B0ciAgICAgICAgICAgICAgIElUVE5PVElGWV9OQU1FKHJlbGF0aW9uX2FkZCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X3JlbGF0aW9uX2FkZF90b19jdXJyZW50KGQseCx5KQorI2RlZmluZSBfX2l0dF9yZWxhdGlvbl9hZGRfdG9fY3VycmVudF9wdHIgMAorI2RlZmluZSBfX2l0dF9yZWxhdGlvbl9hZGQoZCx4LHkseikKKyNkZWZpbmUgX19pdHRfcmVsYXRpb25fYWRkX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfcmVsYXRpb25fYWRkX3RvX2N1cnJlbnRfcHRyIDAKKyNkZWZpbmUgX19pdHRfcmVsYXRpb25fYWRkX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisvKiogQH0gcmVsYXRpb25zIGdyb3VwICovCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI3ByYWdtYSBwYWNrKHB1c2gsIDgpCisKK3R5cGVkZWYgc3RydWN0IF9fX2l0dF9jbG9ja19pbmZvCit7CisgICAgdW5zaWduZWQgbG9uZyBsb25nIGNsb2NrX2ZyZXE7IC8qITwgQ2xvY2sgZG9tYWluIGZyZXF1ZW5jeSAqLworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBjbG9ja19iYXNlOyAvKiE8IENsb2NrIGRvbWFpbiBiYXNlIHRpbWVzdGFtcCAqLworfSBfX2l0dF9jbG9ja19pbmZvOworCisjcHJhZ21hIHBhY2socG9wKQorLyoqIEBlbmRjb25kICovCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLwordHlwZWRlZiB2b2lkIChJVFRBUEkgKl9faXR0X2dldF9jbG9ja19pbmZvX2ZuKShfX2l0dF9jbG9ja19pbmZvKiBjbG9ja19pbmZvLCB2b2lkKiBkYXRhKTsKKy8qKiBAZW5kY29uZCAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNwcmFnbWEgcGFjayhwdXNoLCA4KQorCit0eXBlZGVmIHN0cnVjdCBfX19pdHRfY2xvY2tfZG9tYWluCit7CisgICAgX19pdHRfY2xvY2tfaW5mbyBpbmZvOyAgICAgIC8qITwgTW9zdCByZWNlbnQgY2xvY2sgZG9tYWluIGluZm8gKi8KKyAgICBfX2l0dF9nZXRfY2xvY2tfaW5mb19mbiBmbjsgLyohPCBDYWxsYmFjayBmdW5jdGlvbiBwb2ludGVyICovCisgICAgdm9pZCogZm5fZGF0YTsgICAgICAgICAgICAgIC8qITwgSW5wdXQgYXJndW1lbnQgZm9yIHRoZSBjYWxsYmFjayBmdW5jdGlvbiAqLworICAgIGludCAgIGV4dHJhMTsgICAgICAgICAgICAgICAvKiE8IFJlc2VydmVkLiBNdXN0IGJlIHplcm8gKi8KKyAgICB2b2lkKiBleHRyYTI7ICAgICAgICAgICAgICAgLyohPCBSZXNlcnZlZC4gTXVzdCBiZSB6ZXJvICovCisgICAgc3RydWN0IF9fX2l0dF9jbG9ja19kb21haW4qIG5leHQ7Cit9IF9faXR0X2Nsb2NrX2RvbWFpbjsKKworI3ByYWdtYSBwYWNrKHBvcCkKKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBpbmdyb3VwIGNsb2NrZG9tYWlucworICogQGJyaWVmIENyZWF0ZSBhIGNsb2NrIGRvbWFpbi4KKyAqIENlcnRhaW4gYXBwbGljYXRpb25zIHJlcXVpcmUgdGhlIGNhcGFiaWxpdHkgdG8gdHJhY2UgdGhlaXIgYXBwbGljYXRpb24gdXNpbmcKKyAqIGEgY2xvY2sgZG9tYWluIGRpZmZlcmVudCB0aGFuIHRoZSBDUFUsIGZvciBpbnN0YW5jZSB0aGUgaW5zdHJ1bWVudGF0aW9uIG9mIGV2ZW50cworICogdGhhdCBvY2N1ciBvbiBhIEdQVS4KKyAqIEJlY2F1c2UgdGhlIHNldCBvZiBkb21haW5zIGlzIGV4cGVjdGVkIHRvIGJlIHN0YXRpYyBvdmVyIHRoZSBhcHBsaWNhdGlvbidzIGV4ZWN1dGlvbiB0aW1lLAorICogdGhlcmUgaXMgbm8gbWVjaGFuaXNtIHRvIGRlc3Ryb3kgYSBkb21haW4uCisgKiBBbnkgZG9tYWluIGNhbiBiZSBhY2Nlc3NlZCBieSBhbnkgdGhyZWFkIGluIHRoZSBwcm9jZXNzLCByZWdhcmRsZXNzIG9mIHdoaWNoIHRocmVhZCBjcmVhdGVkCisgKiB0aGUgZG9tYWluLiBUaGlzIGNhbGwgaXMgdGhyZWFkLXNhZmUuCisgKiBAcGFyYW1baW5dIGZuIEEgcG9pbnRlciB0byBhIGNhbGxiYWNrIGZ1bmN0aW9uIHdoaWNoIHJldHJpZXZlcyBhbHRlcm5hdGl2ZSBDUFUgdGltZXN0YW1wcworICogQHBhcmFtW2luXSBmbl9kYXRhIEFyZ3VtZW50IGZvciBhIGNhbGxiYWNrIGZ1bmN0aW9uOyBtYXkgYmUgTlVMTAorICovCitfX2l0dF9jbG9ja19kb21haW4qIElUVEFQSSBfX2l0dF9jbG9ja19kb21haW5fY3JlYXRlKF9faXR0X2dldF9jbG9ja19pbmZvX2ZuIGZuLCB2b2lkKiBmbl9kYXRhKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9jbG9ja19kb21haW4qLCBjbG9ja19kb21haW5fY3JlYXRlLCAoX19pdHRfZ2V0X2Nsb2NrX2luZm9fZm4gZm4sIHZvaWQqIGZuX2RhdGEpKQorI2RlZmluZSBfX2l0dF9jbG9ja19kb21haW5fY3JlYXRlICAgICBJVFROT1RJRllfREFUQShjbG9ja19kb21haW5fY3JlYXRlKQorI2RlZmluZSBfX2l0dF9jbG9ja19kb21haW5fY3JlYXRlX3B0ciBJVFROT1RJRllfTkFNRShjbG9ja19kb21haW5fY3JlYXRlKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfY2xvY2tfZG9tYWluX2NyZWF0ZShmbixmbl9kYXRhKSAoX19pdHRfY2xvY2tfZG9tYWluKikwCisjZGVmaW5lIF9faXR0X2Nsb2NrX2RvbWFpbl9jcmVhdGVfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9jbG9ja19kb21haW5fY3JlYXRlX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGluZ3JvdXAgY2xvY2tkb21haW5zCisgKiBAYnJpZWYgUmVjYWxjdWxhdGUgY2xvY2sgZG9tYWlucyBmcmVxdWVuY2VzIGFuZCBjbG9jayBiYXNlIHRpbWVzdGFtcHMuCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X2Nsb2NrX2RvbWFpbl9yZXNldCh2b2lkKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgY2xvY2tfZG9tYWluX3Jlc2V0LCAodm9pZCkpCisjZGVmaW5lIF9faXR0X2Nsb2NrX2RvbWFpbl9yZXNldCAgICAgSVRUTk9USUZZX1ZPSUQoY2xvY2tfZG9tYWluX3Jlc2V0KQorI2RlZmluZSBfX2l0dF9jbG9ja19kb21haW5fcmVzZXRfcHRyIElUVE5PVElGWV9OQU1FKGNsb2NrX2RvbWFpbl9yZXNldCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2Nsb2NrX2RvbWFpbl9yZXNldCgpCisjZGVmaW5lIF9faXR0X2Nsb2NrX2RvbWFpbl9yZXNldF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X2Nsb2NrX2RvbWFpbl9yZXNldF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBpbmdyb3VwIGNsb2NrZG9tYWluCisgKiBAYnJpZWYgQ3JlYXRlIGFuIGluc3RhbmNlIG9mIGlkZW50aWZpZXIuIFRoaXMgZXN0YWJsaXNoZXMgdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlmZXRpbWUgb2YKKyAqIGFuIGluc3RhbmNlIG9mIHRoZSBnaXZlbiBJRCBpbiB0aGUgdHJhY2UuIE9uY2UgdGhpcyBsaWZldGltZSBzdGFydHMsIHRoZSBJRCBjYW4gYmUgdXNlZCB0bworICogdGFnIG5hbWVkIGVudGl0eSBpbnN0YW5jZXMgaW4gY2FsbHMgc3VjaCBhcyBfX2l0dF90YXNrX2JlZ2luLCBhbmQgdG8gc3BlY2lmeSByZWxhdGlvbnNoaXBzIGFtb25nCisgKiBpZGVudGlmaWVkIG5hbWVkIGVudGl0eSBpbnN0YW5jZXMsIHVzaW5nIHRoZSBccmVmIHJlbGF0aW9ucyBBUElzLgorICogQHBhcmFtW2luXSBkb21haW4gVGhlIGRvbWFpbiBjb250cm9sbGluZyB0aGUgZXhlY3V0aW9uIG9mIHRoaXMgY2FsbC4KKyAqIEBwYXJhbVtpbl0gY2xvY2tfZG9tYWluIFRoZSBjbG9jayBkb21haW4gY29udHJvbGxpbmcgdGhlIGV4ZWN1dGlvbiBvZiB0aGlzIGNhbGwuCisgKiBAcGFyYW1baW5dIHRpbWVzdGFtcCBUaGUgdXNlciBkZWZpbmVkIHRpbWVzdGFtcC4KKyAqIEBwYXJhbVtpbl0gaWQgVGhlIElEIHRvIGNyZWF0ZS4KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfaWRfY3JlYXRlX2V4KGNvbnN0IF9faXR0X2RvbWFpbiogZG9tYWluLCBfX2l0dF9jbG9ja19kb21haW4qIGNsb2NrX2RvbWFpbiwgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcCwgX19pdHRfaWQgaWQpOworCisvKioKKyAqIEBpbmdyb3VwIGNsb2NrZG9tYWluCisgKiBAYnJpZWYgRGVzdHJveSBhbiBpbnN0YW5jZSBvZiBpZGVudGlmaWVyLiBUaGlzIGVuZHMgdGhlIGxpZmV0aW1lIG9mIHRoZSBjdXJyZW50IGluc3RhbmNlIG9mIHRoZQorICogZ2l2ZW4gSUQgdmFsdWUgaW4gdGhlIHRyYWNlLiBBbnkgcmVsYXRpb25zaGlwcyB0aGF0IGFyZSBlc3RhYmxpc2hlZCBhZnRlciB0aGlzIGxpZmV0aW1lIGVuZHMgYXJlCisgKiBpbnZhbGlkLiBUaGlzIGNhbGwgbXVzdCBiZSBwZXJmb3JtZWQgYmVmb3JlIHRoZSBnaXZlbiBJRCB2YWx1ZSBjYW4gYmUgcmV1c2VkIGZvciBhIGRpZmZlcmVudAorICogbmFtZWQgZW50aXR5IGluc3RhbmNlLgorICogQHBhcmFtW2luXSBkb21haW4gVGhlIGRvbWFpbiBjb250cm9sbGluZyB0aGUgZXhlY3V0aW9uIG9mIHRoaXMgY2FsbC4KKyAqIEBwYXJhbVtpbl0gY2xvY2tfZG9tYWluIFRoZSBjbG9jayBkb21haW4gY29udHJvbGxpbmcgdGhlIGV4ZWN1dGlvbiBvZiB0aGlzIGNhbGwuCisgKiBAcGFyYW1baW5dIHRpbWVzdGFtcCBUaGUgdXNlciBkZWZpbmVkIHRpbWVzdGFtcC4KKyAqIEBwYXJhbVtpbl0gaWQgVGhlIElEIHRvIGRlc3Ryb3kuCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X2lkX2Rlc3Ryb3lfZXgoY29uc3QgX19pdHRfZG9tYWluKiBkb21haW4sIF9faXR0X2Nsb2NrX2RvbWFpbiogY2xvY2tfZG9tYWluLCB1bnNpZ25lZCBsb25nIGxvbmcgdGltZXN0YW1wLCBfX2l0dF9pZCBpZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGlkX2NyZWF0ZV9leCwgIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfY2xvY2tfZG9tYWluKiBjbG9ja19kb21haW4sIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXAsIF9faXR0X2lkIGlkKSkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGlkX2Rlc3Ryb3lfZXgsIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfY2xvY2tfZG9tYWluKiBjbG9ja19kb21haW4sIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXAsIF9faXR0X2lkIGlkKSkKKyNkZWZpbmUgX19pdHRfaWRfY3JlYXRlX2V4KGQseCx5LHopICBJVFROT1RJRllfVk9JRF9EMyhpZF9jcmVhdGVfZXgsZCx4LHkseikKKyNkZWZpbmUgX19pdHRfaWRfY3JlYXRlX2V4X3B0ciAgICAgICBJVFROT1RJRllfTkFNRShpZF9jcmVhdGVfZXgpCisjZGVmaW5lIF9faXR0X2lkX2Rlc3Ryb3lfZXgoZCx4LHkseikgSVRUTk9USUZZX1ZPSURfRDMoaWRfZGVzdHJveV9leCxkLHgseSx6KQorI2RlZmluZSBfX2l0dF9pZF9kZXN0cm95X2V4X3B0ciAgICAgIElUVE5PVElGWV9OQU1FKGlkX2Rlc3Ryb3lfZXgpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9pZF9jcmVhdGVfZXgoZG9tYWluLGNsb2NrX2RvbWFpbix0aW1lc3RhbXAsaWQpCisjZGVmaW5lIF9faXR0X2lkX2NyZWF0ZV9leF9wdHIgICAgMAorI2RlZmluZSBfX2l0dF9pZF9kZXN0cm95X2V4KGRvbWFpbixjbG9ja19kb21haW4sdGltZXN0YW1wLGlkKQorI2RlZmluZSBfX2l0dF9pZF9kZXN0cm95X2V4X3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfaWRfY3JlYXRlX2V4X3B0ciAgICAwCisjZGVmaW5lIF9faXR0X2lkX2Rlc3Ryb3lfZXhfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAaW5ncm91cCBjbG9ja2RvbWFpbgorICogQGJyaWVmIEJlZ2luIGEgdGFzayBpbnN0YW5jZS4KKyAqIEBwYXJhbVtpbl0gZG9tYWluIFRoZSBkb21haW4gZm9yIHRoaXMgdGFzaworICogQHBhcmFtW2luXSBjbG9ja19kb21haW4gVGhlIGNsb2NrIGRvbWFpbiBjb250cm9sbGluZyB0aGUgZXhlY3V0aW9uIG9mIHRoaXMgY2FsbC4KKyAqIEBwYXJhbVtpbl0gdGltZXN0YW1wIFRoZSB1c2VyIGRlZmluZWQgdGltZXN0YW1wLgorICogQHBhcmFtW2luXSB0YXNraWQgVGhlIGluc3RhbmNlIElEIGZvciB0aGlzIHRhc2sgaW5zdGFuY2UsIG9yIF9faXR0X251bGwKKyAqIEBwYXJhbVtpbl0gcGFyZW50aWQgVGhlIHBhcmVudCBpbnN0YW5jZSB0byB3aGljaCB0aGlzIHRhc2sgaW5zdGFuY2UgYmVsb25ncywgb3IgX19pdHRfbnVsbAorICogQHBhcmFtW2luXSBuYW1lIFRoZSBuYW1lIG9mIHRoaXMgdGFzaworICovCit2b2lkIElUVEFQSSBfX2l0dF90YXNrX2JlZ2luX2V4KGNvbnN0IF9faXR0X2RvbWFpbiogZG9tYWluLCBfX2l0dF9jbG9ja19kb21haW4qIGNsb2NrX2RvbWFpbiwgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcCwgX19pdHRfaWQgdGFza2lkLCBfX2l0dF9pZCBwYXJlbnRpZCwgX19pdHRfc3RyaW5nX2hhbmRsZSogbmFtZSk7CisKKy8qKgorICogQGluZ3JvdXAgY2xvY2tkb21haW4KKyAqIEBicmllZiBCZWdpbiBhIHRhc2sgaW5zdGFuY2UuCisgKiBAcGFyYW1baW5dIGRvbWFpbiBUaGUgZG9tYWluIGZvciB0aGlzIHRhc2sKKyAqIEBwYXJhbVtpbl0gY2xvY2tfZG9tYWluIFRoZSBjbG9jayBkb21haW4gY29udHJvbGxpbmcgdGhlIGV4ZWN1dGlvbiBvZiB0aGlzIGNhbGwuCisgKiBAcGFyYW1baW5dIHRpbWVzdGFtcCBUaGUgdXNlciBkZWZpbmVkIHRpbWVzdGFtcC4KKyAqIEBwYXJhbVtpbl0gdGFza2lkIFRoZSBpZGVudGlmaWVyIGZvciB0aGlzIHRhc2sgaW5zdGFuY2UsIG9yIF9faXR0X251bGwKKyAqIEBwYXJhbVtpbl0gcGFyZW50aWQgVGhlIHBhcmVudCBvZiB0aGlzIHRhc2ssIG9yIF9faXR0X251bGwKKyAqIEBwYXJhbVtpbl0gZm4gVGhlIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIHlvdSBhcmUgdHJhY2luZworICovCit2b2lkIElUVEFQSSBfX2l0dF90YXNrX2JlZ2luX2ZuX2V4KGNvbnN0IF9faXR0X2RvbWFpbiogZG9tYWluLCBfX2l0dF9jbG9ja19kb21haW4qIGNsb2NrX2RvbWFpbiwgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcCwgX19pdHRfaWQgdGFza2lkLCBfX2l0dF9pZCBwYXJlbnRpZCwgdm9pZCogZm4pOworCisvKioKKyAqIEBpbmdyb3VwIGNsb2NrZG9tYWluCisgKiBAYnJpZWYgRW5kIHRoZSBjdXJyZW50IHRhc2sgaW5zdGFuY2UuCisgKiBAcGFyYW1baW5dIGRvbWFpbiBUaGUgZG9tYWluIGZvciB0aGlzIHRhc2sKKyAqIEBwYXJhbVtpbl0gY2xvY2tfZG9tYWluIFRoZSBjbG9jayBkb21haW4gY29udHJvbGxpbmcgdGhlIGV4ZWN1dGlvbiBvZiB0aGlzIGNhbGwuCisgKiBAcGFyYW1baW5dIHRpbWVzdGFtcCBUaGUgdXNlciBkZWZpbmVkIHRpbWVzdGFtcC4KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfdGFza19lbmRfZXgoY29uc3QgX19pdHRfZG9tYWluKiBkb21haW4sIF9faXR0X2Nsb2NrX2RvbWFpbiogY2xvY2tfZG9tYWluLCB1bnNpZ25lZCBsb25nIGxvbmcgdGltZXN0YW1wKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgdGFza19iZWdpbl9leCwgICAgICAgIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfY2xvY2tfZG9tYWluKiBjbG9ja19kb21haW4sIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXAsIF9faXR0X2lkIGlkLCBfX2l0dF9pZCBwYXJlbnRpZCwgX19pdHRfc3RyaW5nX2hhbmRsZSAqbmFtZSkpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCB0YXNrX2JlZ2luX2ZuX2V4LCAgICAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9jbG9ja19kb21haW4qIGNsb2NrX2RvbWFpbiwgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcCwgX19pdHRfaWQgaWQsIF9faXR0X2lkIHBhcmVudGlkLCB2b2lkKiBmbikpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCB0YXNrX2VuZF9leCwgICAgICAgICAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9jbG9ja19kb21haW4qIGNsb2NrX2RvbWFpbiwgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcCkpCisjZGVmaW5lIF9faXR0X3Rhc2tfYmVnaW5fZXgoZCx4LHkseixhLGIpICAgICAgSVRUTk9USUZZX1ZPSURfRDUodGFza19iZWdpbl9leCxkLHgseSx6LGEsYikKKyNkZWZpbmUgX19pdHRfdGFza19iZWdpbl9leF9wdHIgICAgICAgICAgICAgICBJVFROT1RJRllfTkFNRSh0YXNrX2JlZ2luX2V4KQorI2RlZmluZSBfX2l0dF90YXNrX2JlZ2luX2ZuX2V4KGQseCx5LHosYSxiKSAgIElUVE5PVElGWV9WT0lEX0Q1KHRhc2tfYmVnaW5fZm5fZXgsZCx4LHkseixhLGIpCisjZGVmaW5lIF9faXR0X3Rhc2tfYmVnaW5fZm5fZXhfcHRyICAgICAgICAgICAgSVRUTk9USUZZX05BTUUodGFza19iZWdpbl9mbl9leCkKKyNkZWZpbmUgX19pdHRfdGFza19lbmRfZXgoZCx4LHkpICAgICAgICAgICAgICBJVFROT1RJRllfVk9JRF9EMih0YXNrX2VuZF9leCxkLHgseSkKKyNkZWZpbmUgX19pdHRfdGFza19lbmRfZXhfcHRyICAgICAgICAgICAgICAgICBJVFROT1RJRllfTkFNRSh0YXNrX2VuZF9leCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X3Rhc2tfYmVnaW5fZXgoZG9tYWluLGNsb2NrX2RvbWFpbix0aW1lc3RhbXAsaWQscGFyZW50aWQsbmFtZSkKKyNkZWZpbmUgX19pdHRfdGFza19iZWdpbl9leF9wdHIgICAgICAgICAgMAorI2RlZmluZSBfX2l0dF90YXNrX2JlZ2luX2ZuX2V4KGRvbWFpbixjbG9ja19kb21haW4sdGltZXN0YW1wLGlkLHBhcmVudGlkLGZuKQorI2RlZmluZSBfX2l0dF90YXNrX2JlZ2luX2ZuX2V4X3B0ciAgICAgICAwCisjZGVmaW5lIF9faXR0X3Rhc2tfZW5kX2V4KGRvbWFpbixjbG9ja19kb21haW4sdGltZXN0YW1wKQorI2RlZmluZSBfX2l0dF90YXNrX2VuZF9leF9wdHIgICAgICAgICAgICAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfdGFza19iZWdpbl9leF9wdHIgICAgICAgICAgMAorI2RlZmluZSBfX2l0dF90YXNrX2JlZ2luX2ZuX2V4X3B0ciAgICAgICAwCisjZGVmaW5lIF9faXR0X3Rhc2tfZW5kX2V4X3B0ciAgICAgICAgICAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAaW5ncm91cCBtYXJrZXJzCisgKiBAYnJpZWYgQ3JlYXRlIGEgbWFya2VyIGluc3RhbmNlLgorICogQHBhcmFtW2luXSBkb21haW4gVGhlIGRvbWFpbiBmb3IgdGhpcyBtYXJrZXIKKyAqIEBwYXJhbVtpbl0gY2xvY2tfZG9tYWluIFRoZSBjbG9jayBkb21haW4gY29udHJvbGxpbmcgdGhlIGV4ZWN1dGlvbiBvZiB0aGlzIGNhbGwuCisgKiBAcGFyYW1baW5dIHRpbWVzdGFtcCBUaGUgdXNlciBkZWZpbmVkIHRpbWVzdGFtcC4KKyAqIEBwYXJhbVtpbl0gaWQgVGhlIGluc3RhbmNlIElEIGZvciB0aGlzIG1hcmtlciwgb3IgX19pdHRfbnVsbAorICogQHBhcmFtW2luXSBuYW1lIFRoZSBuYW1lIGZvciB0aGlzIG1hcmtlcgorICogQHBhcmFtW2luXSBzY29wZSBUaGUgc2NvcGUgZm9yIHRoaXMgbWFya2VyCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X21hcmtlcl9leChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgIF9faXR0X2Nsb2NrX2RvbWFpbiogY2xvY2tfZG9tYWluLCB1bnNpZ25lZCBsb25nIGxvbmcgdGltZXN0YW1wLCBfX2l0dF9pZCBpZCwgX19pdHRfc3RyaW5nX2hhbmRsZSAqbmFtZSwgX19pdHRfc2NvcGUgc2NvcGUpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtYXJrZXJfZXgsICAgIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgIF9faXR0X2Nsb2NrX2RvbWFpbiogY2xvY2tfZG9tYWluLCB1bnNpZ25lZCBsb25nIGxvbmcgdGltZXN0YW1wLCBfX2l0dF9pZCBpZCwgX19pdHRfc3RyaW5nX2hhbmRsZSAqbmFtZSwgX19pdHRfc2NvcGUgc2NvcGUpKQorI2RlZmluZSBfX2l0dF9tYXJrZXJfZXgoZCx4LHkseixhLGIpICAgIElUVE5PVElGWV9WT0lEX0Q1KG1hcmtlcl9leCxkLHgseSx6LGEsYikKKyNkZWZpbmUgX19pdHRfbWFya2VyX2V4X3B0ciAgICAgICAgICAgICBJVFROT1RJRllfTkFNRShtYXJrZXJfZXgpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9tYXJrZXJfZXgoZG9tYWluLGNsb2NrX2RvbWFpbix0aW1lc3RhbXAsaWQsbmFtZSxzY29wZSkKKyNkZWZpbmUgX19pdHRfbWFya2VyX2V4X3B0ciAgICAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfbWFya2VyX2V4X3B0ciAgICAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGluZ3JvdXAgY2xvY2tkb21haW4KKyAqIEBicmllZiBBZGQgYSByZWxhdGlvbiB0byB0aGUgY3VycmVudCB0YXNrIGluc3RhbmNlLgorICogVGhlIGN1cnJlbnQgdGFzayBpbnN0YW5jZSBpcyB0aGUgaGVhZCBvZiB0aGUgcmVsYXRpb24uCisgKiBAcGFyYW1baW5dIGRvbWFpbiBUaGUgZG9tYWluIGNvbnRyb2xsaW5nIHRoaXMgY2FsbAorICogQHBhcmFtW2luXSBjbG9ja19kb21haW4gVGhlIGNsb2NrIGRvbWFpbiBjb250cm9sbGluZyB0aGUgZXhlY3V0aW9uIG9mIHRoaXMgY2FsbC4KKyAqIEBwYXJhbVtpbl0gdGltZXN0YW1wIFRoZSB1c2VyIGRlZmluZWQgdGltZXN0YW1wLgorICogQHBhcmFtW2luXSByZWxhdGlvbiBUaGUga2luZCBvZiByZWxhdGlvbgorICogQHBhcmFtW2luXSB0YWlsIFRoZSBJRCBmb3IgdGhlIHRhaWwgb2YgdGhlIHJlbGF0aW9uCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3JlbGF0aW9uX2FkZF90b19jdXJyZW50X2V4KGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCAgX19pdHRfY2xvY2tfZG9tYWluKiBjbG9ja19kb21haW4sIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXAsIF9faXR0X3JlbGF0aW9uIHJlbGF0aW9uLCBfX2l0dF9pZCB0YWlsKTsKKworLyoqCisgKiBAaW5ncm91cCBjbG9ja2RvbWFpbgorICogQGJyaWVmIEFkZCBhIHJlbGF0aW9uIGJldHdlZW4gdHdvIGluc3RhbmNlIGlkZW50aWZpZXJzLgorICogQHBhcmFtW2luXSBkb21haW4gVGhlIGRvbWFpbiBjb250cm9sbGluZyB0aGlzIGNhbGwKKyAqIEBwYXJhbVtpbl0gY2xvY2tfZG9tYWluIFRoZSBjbG9jayBkb21haW4gY29udHJvbGxpbmcgdGhlIGV4ZWN1dGlvbiBvZiB0aGlzIGNhbGwuCisgKiBAcGFyYW1baW5dIHRpbWVzdGFtcCBUaGUgdXNlciBkZWZpbmVkIHRpbWVzdGFtcC4KKyAqIEBwYXJhbVtpbl0gaGVhZCBUaGUgSUQgZm9yIHRoZSBoZWFkIG9mIHRoZSByZWxhdGlvbgorICogQHBhcmFtW2luXSByZWxhdGlvbiBUaGUga2luZCBvZiByZWxhdGlvbgorICogQHBhcmFtW2luXSB0YWlsIFRoZSBJRCBmb3IgdGhlIHRhaWwgb2YgdGhlIHJlbGF0aW9uCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3JlbGF0aW9uX2FkZF9leChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgIF9faXR0X2Nsb2NrX2RvbWFpbiogY2xvY2tfZG9tYWluLCB1bnNpZ25lZCBsb25nIGxvbmcgdGltZXN0YW1wLCBfX2l0dF9pZCBoZWFkLCBfX2l0dF9yZWxhdGlvbiByZWxhdGlvbiwgX19pdHRfaWQgdGFpbCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHJlbGF0aW9uX2FkZF90b19jdXJyZW50X2V4LCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2Nsb2NrX2RvbWFpbiogY2xvY2tfZG9tYWluLCB1bnNpZ25lZCBsb25nIGxvbmcgdGltZXN0YW1wLCBfX2l0dF9yZWxhdGlvbiByZWxhdGlvbiwgX19pdHRfaWQgdGFpbCkpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCByZWxhdGlvbl9hZGRfZXgsICAgICAgICAgICAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9jbG9ja19kb21haW4qIGNsb2NrX2RvbWFpbiwgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcCwgX19pdHRfaWQgaGVhZCwgX19pdHRfcmVsYXRpb24gcmVsYXRpb24sIF9faXR0X2lkIHRhaWwpKQorI2RlZmluZSBfX2l0dF9yZWxhdGlvbl9hZGRfdG9fY3VycmVudF9leChkLHgseSx6LGEpIElUVE5PVElGWV9WT0lEX0Q0KHJlbGF0aW9uX2FkZF90b19jdXJyZW50X2V4LGQseCx5LHosYSkKKyNkZWZpbmUgX19pdHRfcmVsYXRpb25fYWRkX3RvX2N1cnJlbnRfZXhfcHRyICAgICAgICBJVFROT1RJRllfTkFNRShyZWxhdGlvbl9hZGRfdG9fY3VycmVudF9leCkKKyNkZWZpbmUgX19pdHRfcmVsYXRpb25fYWRkX2V4KGQseCx5LHosYSxiKSAgICAgICAgICBJVFROT1RJRllfVk9JRF9ENShyZWxhdGlvbl9hZGRfZXgsZCx4LHkseixhLGIpCisjZGVmaW5lIF9faXR0X3JlbGF0aW9uX2FkZF9leF9wdHIgICAgICAgICAgICAgICAgICAgSVRUTk9USUZZX05BTUUocmVsYXRpb25fYWRkX2V4KQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfcmVsYXRpb25fYWRkX3RvX2N1cnJlbnRfZXgoZG9tYWluLGNsb2NrX2RvbWFpbix0aW1lc3RhbWUscmVsYXRpb24sdGFpbCkKKyNkZWZpbmUgX19pdHRfcmVsYXRpb25fYWRkX3RvX2N1cnJlbnRfZXhfcHRyIDAKKyNkZWZpbmUgX19pdHRfcmVsYXRpb25fYWRkX2V4KGRvbWFpbixjbG9ja19kb21haW4sdGltZXN0YW1wLGhlYWQscmVsYXRpb24sdGFpbCkKKyNkZWZpbmUgX19pdHRfcmVsYXRpb25fYWRkX2V4X3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfcmVsYXRpb25fYWRkX3RvX2N1cnJlbnRfZXhfcHRyIDAKKyNkZWZpbmUgX19pdHRfcmVsYXRpb25fYWRkX2V4X3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLwordHlwZWRlZiBlbnVtIF9fX2l0dF90cmFja19ncm91cF90eXBlCit7CisgICAgX19pdHRfdHJhY2tfZ3JvdXBfdHlwZV9ub3JtYWwgPSAwCit9IF9faXR0X3RyYWNrX2dyb3VwX3R5cGU7CisvKiogQGVuZGNvbmQgKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjcHJhZ21hIHBhY2socHVzaCwgOCkKKwordHlwZWRlZiBzdHJ1Y3QgX19faXR0X3RyYWNrX2dyb3VwCit7CisgICAgX19pdHRfc3RyaW5nX2hhbmRsZSogbmFtZTsgICAgIC8qITwgTmFtZSBvZiB0aGUgdHJhY2sgZ3JvdXAgKi8KKyAgICBzdHJ1Y3QgX19faXR0X3RyYWNrKiB0cmFjazsgICAgLyohPCBMaXN0IG9mIGNoaWxkIHRyYWNrcyAgICAqLworICAgIF9faXR0X3RyYWNrX2dyb3VwX3R5cGUgdGd0eXBlOyAvKiE8IFR5cGUgb2YgdGhlIHRyYWNrIGdyb3VwICovCisgICAgaW50ICAgZXh0cmExOyAgICAgICAgICAgICAgICAgIC8qITwgUmVzZXJ2ZWQuIE11c3QgYmUgemVybyAgKi8KKyAgICB2b2lkKiBleHRyYTI7ICAgICAgICAgICAgICAgICAgLyohPCBSZXNlcnZlZC4gTXVzdCBiZSB6ZXJvICAqLworICAgIHN0cnVjdCBfX19pdHRfdHJhY2tfZ3JvdXAqIG5leHQ7Cit9IF9faXR0X3RyYWNrX2dyb3VwOworCisjcHJhZ21hIHBhY2socG9wKQorLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIFBsYWNlaG9sZGVyIGZvciBjdXN0b20gdHJhY2sgdHlwZXMuIEN1cnJlbnRseSwgIm5vcm1hbCIgY3VzdG9tIHRyYWNrCisgKiBpcyB0aGUgb25seSBhdmFpbGFibGUgdHJhY2sgdHlwZS4KKyAqLwordHlwZWRlZiBlbnVtIF9fX2l0dF90cmFja190eXBlCit7CisgICAgX19pdHRfdHJhY2tfdHlwZV9ub3JtYWwgPSAwCisjaWZkZWYgSU5URUxfSVRUTk9USUZZX0FQSV9QUklWQVRFCisgICAgLCBfX2l0dF90cmFja190eXBlX3F1ZXVlCisjZW5kaWYgLyogSU5URUxfSVRUTk9USUZZX0FQSV9QUklWQVRFICovCit9IF9faXR0X3RyYWNrX3R5cGU7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI3ByYWdtYSBwYWNrKHB1c2gsIDgpCisKK3R5cGVkZWYgc3RydWN0IF9fX2l0dF90cmFjaworeworICAgIF9faXR0X3N0cmluZ19oYW5kbGUqIG5hbWU7IC8qITwgTmFtZSBvZiB0aGUgdHJhY2sgZ3JvdXAgKi8KKyAgICBfX2l0dF90cmFja19ncm91cCogZ3JvdXA7ICAvKiE8IFBhcmVudCBncm91cCB0byBhIHRyYWNrICovCisgICAgX19pdHRfdHJhY2tfdHlwZSB0dHlwZTsgICAgLyohPCBUeXBlIG9mIHRoZSB0cmFjayAgICAgICAqLworICAgIGludCAgIGV4dHJhMTsgICAgICAgICAgICAgIC8qITwgUmVzZXJ2ZWQuIE11c3QgYmUgemVybyAgKi8KKyAgICB2b2lkKiBleHRyYTI7ICAgICAgICAgICAgICAvKiE8IFJlc2VydmVkLiBNdXN0IGJlIHplcm8gICovCisgICAgc3RydWN0IF9fX2l0dF90cmFjayogbmV4dDsKK30gX19pdHRfdHJhY2s7CisKKyNwcmFnbWEgcGFjayhwb3ApCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgQ3JlYXRlIGxvZ2ljYWwgdHJhY2sgZ3JvdXAuCisgKi8KK19faXR0X3RyYWNrX2dyb3VwKiBJVFRBUEkgX19pdHRfdHJhY2tfZ3JvdXBfY3JlYXRlKF9faXR0X3N0cmluZ19oYW5kbGUqIG5hbWUsIF9faXR0X3RyYWNrX2dyb3VwX3R5cGUgdHJhY2tfZ3JvdXBfdHlwZSk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfdHJhY2tfZ3JvdXAqLCB0cmFja19ncm91cF9jcmVhdGUsIChfX2l0dF9zdHJpbmdfaGFuZGxlKiBuYW1lLCBfX2l0dF90cmFja19ncm91cF90eXBlIHRyYWNrX2dyb3VwX3R5cGUpKQorI2RlZmluZSBfX2l0dF90cmFja19ncm91cF9jcmVhdGUgICAgIElUVE5PVElGWV9EQVRBKHRyYWNrX2dyb3VwX2NyZWF0ZSkKKyNkZWZpbmUgX19pdHRfdHJhY2tfZ3JvdXBfY3JlYXRlX3B0ciBJVFROT1RJRllfTkFNRSh0cmFja19ncm91cF9jcmVhdGUpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF90cmFja19ncm91cF9jcmVhdGUobmFtZSkgIChfX2l0dF90cmFja19ncm91cCopMAorI2RlZmluZSBfX2l0dF90cmFja19ncm91cF9jcmVhdGVfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF90cmFja19ncm91cF9jcmVhdGVfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgQ3JlYXRlIGxvZ2ljYWwgdHJhY2suCisgKi8KK19faXR0X3RyYWNrKiBJVFRBUEkgX19pdHRfdHJhY2tfY3JlYXRlKF9faXR0X3RyYWNrX2dyb3VwKiB0cmFja19ncm91cCwgX19pdHRfc3RyaW5nX2hhbmRsZSogbmFtZSwgX19pdHRfdHJhY2tfdHlwZSB0cmFja190eXBlKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF90cmFjayosIHRyYWNrX2NyZWF0ZSwgKF9faXR0X3RyYWNrX2dyb3VwKiB0cmFja19ncm91cCxfX2l0dF9zdHJpbmdfaGFuZGxlKiBuYW1lLCBfX2l0dF90cmFja190eXBlIHRyYWNrX3R5cGUpKQorI2RlZmluZSBfX2l0dF90cmFja19jcmVhdGUgICAgIElUVE5PVElGWV9EQVRBKHRyYWNrX2NyZWF0ZSkKKyNkZWZpbmUgX19pdHRfdHJhY2tfY3JlYXRlX3B0ciBJVFROT1RJRllfTkFNRSh0cmFja19jcmVhdGUpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF90cmFja19jcmVhdGUodHJhY2tfZ3JvdXAsbmFtZSx0cmFja190eXBlKSAgKF9faXR0X3RyYWNrKikwCisjZGVmaW5lIF9faXR0X3RyYWNrX2NyZWF0ZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X3RyYWNrX2NyZWF0ZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBTZXQgdGhlIGxvZ2ljYWwgdHJhY2suCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3NldF90cmFjayhfX2l0dF90cmFjayogdHJhY2spOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzZXRfdHJhY2ssIChfX2l0dF90cmFjayAqdHJhY2spKQorI2RlZmluZSBfX2l0dF9zZXRfdHJhY2sgICAgIElUVE5PVElGWV9WT0lEKHNldF90cmFjaykKKyNkZWZpbmUgX19pdHRfc2V0X3RyYWNrX3B0ciBJVFROT1RJRllfTkFNRShzZXRfdHJhY2spCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9zZXRfdHJhY2sodHJhY2spCisjZGVmaW5lIF9faXR0X3NldF90cmFja19wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X3NldF90cmFja19wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9ncGFfZG9jdW1lbnRhdGlvbiAqLworLyoqCisgKiBAZGVmZ3JvdXAgZXZlbnRzIEV2ZW50cworICogQGluZ3JvdXAgcHVibGljCisgKiBFdmVudHMgZ3JvdXAKKyAqIEB7CisgKi8KKy8qKiBAYnJpZWYgdXNlciBldmVudCB0eXBlICovCit0eXBlZGVmIGludCBfX2l0dF9ldmVudDsKKworLyoqCisgKiBAYnJpZWYgQ3JlYXRlIGFuIGV2ZW50IG5vdGlmaWNhdGlvbgorICogQG5vdGUgbmFtZSBvciBuYW1lbGVuIGJlaW5nIG51bGwvbmFtZSBhbmQgbmFtZWxlbiBub3QgbWF0Y2hpbmcsIHVzZXIgZXZlbnQgZmVhdHVyZSBub3QgZW5hYmxlZAorICogQHJldHVybiBub24temVybyBldmVudCBpZGVudGlmaWVyIHVwb24gc3VjY2VzcyBhbmQgX19pdHRfZXJyIG90aGVyd2lzZQorICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitfX2l0dF9ldmVudCBMSUJJVFRBUEkgX19pdHRfZXZlbnRfY3JlYXRlQShjb25zdCBjaGFyICAgICpuYW1lLCBpbnQgbmFtZWxlbik7CitfX2l0dF9ldmVudCBMSUJJVFRBUEkgX19pdHRfZXZlbnRfY3JlYXRlVyhjb25zdCB3Y2hhcl90ICpuYW1lLCBpbnQgbmFtZWxlbik7CisjaWYgZGVmaW5lZChVTklDT0RFKSB8fCBkZWZpbmVkKF9VTklDT0RFKQorIyAgZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZSAgICAgX19pdHRfZXZlbnRfY3JlYXRlVworIyAgZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZV9wdHIgX19pdHRfZXZlbnRfY3JlYXRlV19wdHIKKyNlbHNlCisjICBkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlICAgICBfX2l0dF9ldmVudF9jcmVhdGVBCisjICBkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlX3B0ciBfX2l0dF9ldmVudF9jcmVhdGVBX3B0cgorI2VuZGlmIC8qIFVOSUNPREUgKi8KKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK19faXR0X2V2ZW50IExJQklUVEFQSSBfX2l0dF9ldmVudF9jcmVhdGUoY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4pOworI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQihMSUJJVFRBUEksIF9faXR0X2V2ZW50LCBldmVudF9jcmVhdGVBLCAoY29uc3QgY2hhciAgICAqbmFtZSwgaW50IG5hbWVsZW4pKQorSVRUX1NUVUIoTElCSVRUQVBJLCBfX2l0dF9ldmVudCwgZXZlbnRfY3JlYXRlVywgKGNvbnN0IHdjaGFyX3QgKm5hbWUsIGludCBuYW1lbGVuKSkKKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCKExJQklUVEFQSSwgX19pdHRfZXZlbnQsIGV2ZW50X2NyZWF0ZSwgIChjb25zdCBjaGFyICAgICpuYW1lLCBpbnQgbmFtZWxlbikpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZUEgICAgIElUVE5PVElGWV9EQVRBKGV2ZW50X2NyZWF0ZUEpCisjZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZUFfcHRyIElUVE5PVElGWV9OQU1FKGV2ZW50X2NyZWF0ZUEpCisjZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZVcgICAgIElUVE5PVElGWV9EQVRBKGV2ZW50X2NyZWF0ZVcpCisjZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZVdfcHRyIElUVE5PVElGWV9OQU1FKGV2ZW50X2NyZWF0ZVcpCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlICAgICAgSVRUTk9USUZZX0RBVEEoZXZlbnRfY3JlYXRlKQorI2RlZmluZSBfX2l0dF9ldmVudF9jcmVhdGVfcHRyICBJVFROT1RJRllfTkFNRShldmVudF9jcmVhdGUpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9ldmVudF9jcmVhdGVBKG5hbWUsIG5hbWVsZW4pIChfX2l0dF9ldmVudCkwCisjZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZUFfcHRyIDAKKyNkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlVyhuYW1lLCBuYW1lbGVuKSAoX19pdHRfZXZlbnQpMAorI2RlZmluZSBfX2l0dF9ldmVudF9jcmVhdGVXX3B0ciAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlKG5hbWUsIG5hbWVsZW4pICAoX19pdHRfZXZlbnQpMAorI2RlZmluZSBfX2l0dF9ldmVudF9jcmVhdGVfcHRyICAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlQV9wdHIgMAorI2RlZmluZSBfX2l0dF9ldmVudF9jcmVhdGVXX3B0ciAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlX3B0ciAgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBSZWNvcmQgYW4gZXZlbnQgb2NjdXJyZW5jZS4KKyAqIEByZXR1cm4gX19pdHRfZXJyIHVwb24gZmFpbHVyZSAoaW52YWxpZCBldmVudCBpZC91c2VyIGV2ZW50IGZlYXR1cmUgbm90IGVuYWJsZWQpCisgKi8KK2ludCBMSUJJVFRBUEkgX19pdHRfZXZlbnRfc3RhcnQoX19pdHRfZXZlbnQgZXZlbnQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQihMSUJJVFRBUEksIGludCwgZXZlbnRfc3RhcnQsIChfX2l0dF9ldmVudCBldmVudCkpCisjZGVmaW5lIF9faXR0X2V2ZW50X3N0YXJ0ICAgICBJVFROT1RJRllfREFUQShldmVudF9zdGFydCkKKyNkZWZpbmUgX19pdHRfZXZlbnRfc3RhcnRfcHRyIElUVE5PVElGWV9OQU1FKGV2ZW50X3N0YXJ0KQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfZXZlbnRfc3RhcnQoZXZlbnQpIChpbnQpMAorI2RlZmluZSBfX2l0dF9ldmVudF9zdGFydF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X2V2ZW50X3N0YXJ0X3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIFJlY29yZCBhbiBldmVudCBlbmQgb2NjdXJyZW5jZS4KKyAqIEBub3RlIEl0IGlzIG9wdGlvbmFsIGlmIGV2ZW50cyBkbyBub3QgaGF2ZSBkdXJhdGlvbnMuCisgKiBAcmV0dXJuIF9faXR0X2VyciB1cG9uIGZhaWx1cmUgKGludmFsaWQgZXZlbnQgaWQvdXNlciBldmVudCBmZWF0dXJlIG5vdCBlbmFibGVkKQorICovCitpbnQgTElCSVRUQVBJIF9faXR0X2V2ZW50X2VuZChfX2l0dF9ldmVudCBldmVudCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCKExJQklUVEFQSSwgaW50LCBldmVudF9lbmQsIChfX2l0dF9ldmVudCBldmVudCkpCisjZGVmaW5lIF9faXR0X2V2ZW50X2VuZCAgICAgSVRUTk9USUZZX0RBVEEoZXZlbnRfZW5kKQorI2RlZmluZSBfX2l0dF9ldmVudF9lbmRfcHRyIElUVE5PVElGWV9OQU1FKGV2ZW50X2VuZCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2V2ZW50X2VuZChldmVudCkgKGludCkwCisjZGVmaW5lIF9faXR0X2V2ZW50X2VuZF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X2V2ZW50X2VuZF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworLyoqIEB9IGV2ZW50cyBncm91cCAqLworCisKKy8qKgorICogQGRlZmdyb3VwIGFycmF5cyBBcnJheXMgVmlzdWFsaXplcgorICogQGluZ3JvdXAgcHVibGljCisgKiBWaXN1YWxpemUgYXJyYXlzCisgKiBAeworICovCisKKy8qKgorICogQGVudW0gX19pdHRfYXZfZGF0YV90eXBlCisgKiBAYnJpZWYgRGVmaW5lcyB0eXBlcyBvZiBhcnJheXMgZGF0YSAoZm9yIEMvQysrIGludHJpbnNpYyB0eXBlcykgCisgKi8KK3R5cGVkZWYgZW51bSAKK3sKKyAgICBfX2l0dF9lX2ZpcnN0ID0gMCwKKyAgICBfX2l0dF9lX2NoYXIgPSAwLCAgLyogMS1ieXRlIGludGVnZXIgKi8KKyAgICBfX2l0dF9lX3VjaGFyLCAgICAgLyogMS1ieXRlIHVuc2lnbmVkIGludGVnZXIgKi8KKyAgICBfX2l0dF9lX2ludDE2LCAgICAgLyogMi1ieXRlIGludGVnZXIgKi8KKyAgICBfX2l0dF9lX3VpbnQxNiwgICAgLyogMi1ieXRlIHVuc2lnbmVkIGludGVnZXIgICovCisgICAgX19pdHRfZV9pbnQzMiwgICAgIC8qIDQtYnl0ZSBpbnRlZ2VyICovCisgICAgX19pdHRfZV91aW50MzIsICAgIC8qIDQtYnl0ZSB1bnNpZ25lZCBpbnRlZ2VyICovCisgICAgX19pdHRfZV9pbnQ2NCwgICAgIC8qIDgtYnl0ZSBpbnRlZ2VyICovCisgICAgX19pdHRfZV91aW50NjQsICAgIC8qIDgtYnl0ZSB1bnNpZ25lZCBpbnRlZ2VyICovCisgICAgX19pdHRfZV9mbG9hdCwgICAgIC8qIDQtYnl0ZSBmbG9hdGluZyAqLworICAgIF9faXR0X2VfZG91YmxlLCAgICAvKiA4LWJ5dGUgZmxvYXRpbmcgKi8KKyAgICBfX2l0dF9lX2xhc3QgPSBfX2l0dF9lX2RvdWJsZQorfSBfX2l0dF9hdl9kYXRhX3R5cGU7CisKKy8qKgorICogQGJyaWVmIFNhdmUgYW4gYXJyYXkgZGF0YSB0byBhIGZpbGUuCisgKiBPdXRwdXQgZm9ybWF0IGlzIGRlZmluZWQgYnkgdGhlIGZpbGUgZXh0ZW5zaW9uLiBUaGUgY3N2IGFuZCBibXAgZm9ybWF0cyBhcmUgc3VwcG9ydGVkIChibXAgLSBmb3IgMi1kaW1lbnNpb25hbCBhcnJheSBvbmx5KS4KKyAqIEBwYXJhbVtpbl0gZGF0YSAtIHBvaW50ZXIgdG8gdGhlIGFycmF5IGRhdGEKKyAqIEBwYXJhbVtpbl0gcmFuayAtIHRoZSByYW5rIG9mIHRoZSBhcnJheSAKKyAqIEBwYXJhbVtpbl0gZGltZW5zaW9ucyAtIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgaW50ZWdlcnMsIHdoaWNoIHNwZWNpZmllcyB0aGUgYXJyYXkgZGltZW5zaW9ucy4gCisgKiBUaGUgc2l6ZSBvZiBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwgdG8gdGhlIHJhbmsKKyAqIEBwYXJhbVtpbl0gdHlwZSAtIHRoZSB0eXBlIG9mIHRoZSBhcnJheSwgc3BlY2lmaWVkIGFzIG9uZSBvZiB0aGUgX19pdHRfYXZfZGF0YV90eXBlIHZhbHVlcyAoZm9yIGludHJpbnNpYyB0eXBlcykKKyAqIEBwYXJhbVtpbl0gZmlsZVBhdGggLSB0aGUgZmlsZSBwYXRoOyB0aGUgb3V0cHV0IGZvcm1hdCBpcyBkZWZpbmVkIGJ5IHRoZSBmaWxlIGV4dGVuc2lvbgorICogQHBhcmFtW2luXSBjb2x1bW5PcmRlciAtIGRlZmluZXMgaG93IHRoZSBhcnJheSBpcyBzdG9yZWQgaW4gdGhlIGxpbmVhciBtZW1vcnkuCisgKiBJdCBzaG91bGQgYmUgMSBmb3IgY29sdW1uLW1ham9yIG9yZGVyIChlLmcuIGluIEZPUlRSQU4pIG9yIDAgLSBmb3Igcm93LW1ham9yIG9yZGVyIChlLmcuIGluIEMpLgorICovCisKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK2ludCBJVFRBUEkgX19pdHRfYXZfc2F2ZUEodm9pZCAqZGF0YSwgaW50IHJhbmssIGNvbnN0IGludCAqZGltZW5zaW9ucywgaW50IHR5cGUsIGNvbnN0IGNoYXIgKmZpbGVQYXRoLCBpbnQgY29sdW1uT3JkZXIpOworaW50IElUVEFQSSBfX2l0dF9hdl9zYXZlVyh2b2lkICpkYXRhLCBpbnQgcmFuaywgY29uc3QgaW50ICpkaW1lbnNpb25zLCBpbnQgdHlwZSwgY29uc3Qgd2NoYXJfdCAqZmlsZVBhdGgsIGludCBjb2x1bW5PcmRlcik7CisjaWYgZGVmaW5lZChVTklDT0RFKSB8fCBkZWZpbmVkKF9VTklDT0RFKQorIyAgZGVmaW5lIF9faXR0X2F2X3NhdmUgICAgIF9faXR0X2F2X3NhdmVXCisjICBkZWZpbmUgX19pdHRfYXZfc2F2ZV9wdHIgX19pdHRfYXZfc2F2ZVdfcHRyCisjZWxzZSAvKiBVTklDT0RFICovCisjICBkZWZpbmUgX19pdHRfYXZfc2F2ZSAgICAgX19pdHRfYXZfc2F2ZUEKKyMgIGRlZmluZSBfX2l0dF9hdl9zYXZlX3B0ciBfX2l0dF9hdl9zYXZlQV9wdHIKKyNlbmRpZiAvKiBVTklDT0RFICovCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitpbnQgSVRUQVBJIF9faXR0X2F2X3NhdmUodm9pZCAqZGF0YSwgaW50IHJhbmssIGNvbnN0IGludCAqZGltZW5zaW9ucywgaW50IHR5cGUsIGNvbnN0IGNoYXIgKmZpbGVQYXRoLCBpbnQgY29sdW1uT3JkZXIpOworI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQihJVFRBUEksIGludCwgYXZfc2F2ZUEsICh2b2lkICpkYXRhLCBpbnQgcmFuaywgY29uc3QgaW50ICpkaW1lbnNpb25zLCBpbnQgdHlwZSwgY29uc3QgY2hhciAqZmlsZVBhdGgsIGludCBjb2x1bW5PcmRlcikpCitJVFRfU1RVQihJVFRBUEksIGludCwgYXZfc2F2ZVcsICh2b2lkICpkYXRhLCBpbnQgcmFuaywgY29uc3QgaW50ICpkaW1lbnNpb25zLCBpbnQgdHlwZSwgY29uc3Qgd2NoYXJfdCAqZmlsZVBhdGgsIGludCBjb2x1bW5PcmRlcikpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQihJVFRBUEksIGludCwgYXZfc2F2ZSwgICh2b2lkICpkYXRhLCBpbnQgcmFuaywgY29uc3QgaW50ICpkaW1lbnNpb25zLCBpbnQgdHlwZSwgY29uc3QgY2hhciAqZmlsZVBhdGgsIGludCBjb2x1bW5PcmRlcikpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X2F2X3NhdmVBICAgICBJVFROT1RJRllfREFUQShhdl9zYXZlQSkKKyNkZWZpbmUgX19pdHRfYXZfc2F2ZUFfcHRyIElUVE5PVElGWV9OQU1FKGF2X3NhdmVBKQorI2RlZmluZSBfX2l0dF9hdl9zYXZlVyAgICAgSVRUTk9USUZZX0RBVEEoYXZfc2F2ZVcpCisjZGVmaW5lIF9faXR0X2F2X3NhdmVXX3B0ciBJVFROT1RJRllfTkFNRShhdl9zYXZlVykKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9hdl9zYXZlICAgICBJVFROT1RJRllfREFUQShhdl9zYXZlKQorI2RlZmluZSBfX2l0dF9hdl9zYXZlX3B0ciBJVFROT1RJRllfTkFNRShhdl9zYXZlKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfYXZfc2F2ZUEobmFtZSkKKyNkZWZpbmUgX19pdHRfYXZfc2F2ZUFfcHRyIDAKKyNkZWZpbmUgX19pdHRfYXZfc2F2ZVcobmFtZSkKKyNkZWZpbmUgX19pdHRfYXZfc2F2ZVdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9hdl9zYXZlKG5hbWUpCisjZGVmaW5lIF9faXR0X2F2X3NhdmVfcHRyIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9hdl9zYXZlQV9wdHIgMAorI2RlZmluZSBfX2l0dF9hdl9zYXZlV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X2F2X3NhdmVfcHRyIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKwordm9pZCBJVFRBUEkgX19pdHRfZW5hYmxlX2F0dGFjaCh2b2lkKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgZW5hYmxlX2F0dGFjaCwgKHZvaWQpKQorI2RlZmluZSBfX2l0dF9lbmFibGVfYXR0YWNoICAgICBJVFROT1RJRllfVk9JRChlbmFibGVfYXR0YWNoKQorI2RlZmluZSBfX2l0dF9lbmFibGVfYXR0YWNoX3B0ciBJVFROT1RJRllfTkFNRShlbmFibGVfYXR0YWNoKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfZW5hYmxlX2F0dGFjaCgpCisjZGVmaW5lIF9faXR0X2VuYWJsZV9hdHRhY2hfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9lbmFibGVfYXR0YWNoX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZ3BhX2RvY3VtZW50YXRpb24gKi8KKworLyoqIEB9IGFycmF5cyBncm91cCAqLworCisvKiogQGVuZGNvbmQgKi8KKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisjZW5kaWYgLyogX0lUVE5PVElGWV9IXyAqLworCisjaWZkZWYgSU5URUxfSVRUTk9USUZZX0FQSV9QUklWQVRFCisKKyNpZm5kZWYgX0lUVE5PVElGWV9QUklWQVRFXworI2RlZmluZSBfSVRUTk9USUZZX1BSSVZBVEVfCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworLyoqCisgKiBAaW5ncm91cCB0YXNrcworICogQGJyaWVmIEJlZ2luIGFuIG92ZXJsYXBwZWQgdGFzayBpbnN0YW5jZS4KKyAqIEBwYXJhbVtpbl0gZG9tYWluIFRoZSBkb21haW4gZm9yIHRoaXMgdGFzay4KKyAqIEBwYXJhbVtpbl0gdGFza2lkIFRoZSBpZGVudGlmaWVyIGZvciB0aGlzIHRhc2sgaW5zdGFuY2UsICpjYW5ub3QqIGJlIF9faXR0X251bGwuCisgKiBAcGFyYW1baW5dIHBhcmVudGlkIFRoZSBwYXJlbnQgb2YgdGhpcyB0YXNrLCBvciBfX2l0dF9udWxsLgorICogQHBhcmFtW2luXSBuYW1lIFRoZSBuYW1lIG9mIHRoaXMgdGFzay4KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfdGFza19iZWdpbl9vdmVybGFwcGVkKGNvbnN0IF9faXR0X2RvbWFpbiogZG9tYWluLCBfX2l0dF9pZCB0YXNraWQsIF9faXR0X2lkIHBhcmVudGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlKiBuYW1lKTsKKworLyoqCisgKiBAaW5ncm91cCBjbG9ja2RvbWFpbgorICogQGJyaWVmIEJlZ2luIGFuIG92ZXJsYXBwZWQgdGFzayBpbnN0YW5jZS4KKyAqIEBwYXJhbVtpbl0gZG9tYWluIFRoZSBkb21haW4gZm9yIHRoaXMgdGFzaworICogQHBhcmFtW2luXSBjbG9ja19kb21haW4gVGhlIGNsb2NrIGRvbWFpbiBjb250cm9sbGluZyB0aGUgZXhlY3V0aW9uIG9mIHRoaXMgY2FsbC4KKyAqIEBwYXJhbVtpbl0gdGltZXN0YW1wIFRoZSB1c2VyIGRlZmluZWQgdGltZXN0YW1wLgorICogQHBhcmFtW2luXSB0YXNraWQgVGhlIGlkZW50aWZpZXIgZm9yIHRoaXMgdGFzayBpbnN0YW5jZSwgKmNhbm5vdCogYmUgX19pdHRfbnVsbC4KKyAqIEBwYXJhbVtpbl0gcGFyZW50aWQgVGhlIHBhcmVudCBvZiB0aGlzIHRhc2ssIG9yIF9faXR0X251bGwuCisgKiBAcGFyYW1baW5dIG5hbWUgVGhlIG5hbWUgb2YgdGhpcyB0YXNrLgorICovCit2b2lkIElUVEFQSSBfX2l0dF90YXNrX2JlZ2luX292ZXJsYXBwZWRfZXgoY29uc3QgX19pdHRfZG9tYWluKiBkb21haW4sIF9faXR0X2Nsb2NrX2RvbWFpbiogY2xvY2tfZG9tYWluLCB1bnNpZ25lZCBsb25nIGxvbmcgdGltZXN0YW1wLCBfX2l0dF9pZCB0YXNraWQsIF9faXR0X2lkIHBhcmVudGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlKiBuYW1lKTsKKworLyoqCisgKiBAaW5ncm91cCB0YXNrcworICogQGJyaWVmIEVuZCBhbiBvdmVybGFwcGVkIHRhc2sgaW5zdGFuY2UuCisgKiBAcGFyYW1baW5dIGRvbWFpbiBUaGUgZG9tYWluIGZvciB0aGlzIHRhc2sKKyAqIEBwYXJhbVtpbl0gdGFza2lkIEV4cGxpY2l0IElEIG9mIGZpbmlzaGVkIHRhc2sKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfdGFza19lbmRfb3ZlcmxhcHBlZChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgdGFza2lkKTsKKworLyoqCisgKiBAaW5ncm91cCBjbG9ja2RvbWFpbgorICogQGJyaWVmIEVuZCBhbiBvdmVybGFwcGVkIHRhc2sgaW5zdGFuY2UuCisgKiBAcGFyYW1baW5dIGRvbWFpbiBUaGUgZG9tYWluIGZvciB0aGlzIHRhc2sKKyAqIEBwYXJhbVtpbl0gY2xvY2tfZG9tYWluIFRoZSBjbG9jayBkb21haW4gY29udHJvbGxpbmcgdGhlIGV4ZWN1dGlvbiBvZiB0aGlzIGNhbGwuCisgKiBAcGFyYW1baW5dIHRpbWVzdGFtcCBUaGUgdXNlciBkZWZpbmVkIHRpbWVzdGFtcC4KKyAqIEBwYXJhbVtpbl0gdGFza2lkIEV4cGxpY2l0IElEIG9mIGZpbmlzaGVkIHRhc2sKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfdGFza19lbmRfb3ZlcmxhcHBlZF9leChjb25zdCBfX2l0dF9kb21haW4qIGRvbWFpbiwgX19pdHRfY2xvY2tfZG9tYWluKiBjbG9ja19kb21haW4sIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXAsIF9faXR0X2lkIHRhc2tpZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHRhc2tfYmVnaW5fb3ZlcmxhcHBlZCwgICAgICAgICAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCB0YXNraWQsIF9faXR0X2lkIHBhcmVudGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlICpuYW1lKSkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHRhc2tfYmVnaW5fb3ZlcmxhcHBlZF9leCwgICAgICAgKGNvbnN0IF9faXR0X2RvbWFpbiogZG9tYWluLCBfX2l0dF9jbG9ja19kb21haW4qIGNsb2NrX2RvbWFpbiwgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcCwgX19pdHRfaWQgdGFza2lkLCBfX2l0dF9pZCBwYXJlbnRpZCwgX19pdHRfc3RyaW5nX2hhbmRsZSogbmFtZSkpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCB0YXNrX2VuZF9vdmVybGFwcGVkLCAgICAgICAgICAgIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgdGFza2lkKSkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHRhc2tfZW5kX292ZXJsYXBwZWRfZXgsICAgICAgICAgKGNvbnN0IF9faXR0X2RvbWFpbiogZG9tYWluLCBfX2l0dF9jbG9ja19kb21haW4qIGNsb2NrX2RvbWFpbiwgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcCwgX19pdHRfaWQgdGFza2lkKSkKKyNkZWZpbmUgX19pdHRfdGFza19iZWdpbl9vdmVybGFwcGVkKGQseCx5LHopICAgICAgICAgICAgSVRUTk9USUZZX1ZPSURfRDModGFza19iZWdpbl9vdmVybGFwcGVkLGQseCx5LHopCisjZGVmaW5lIF9faXR0X3Rhc2tfYmVnaW5fb3ZlcmxhcHBlZF9wdHIgICAgICAgICAgICAgICAgIElUVE5PVElGWV9OQU1FKHRhc2tfYmVnaW5fb3ZlcmxhcHBlZCkKKyNkZWZpbmUgX19pdHRfdGFza19iZWdpbl9vdmVybGFwcGVkX2V4KGQseCx5LHosYSxiKSAgICAgSVRUTk9USUZZX1ZPSURfRDUodGFza19iZWdpbl9vdmVybGFwcGVkX2V4LGQseCx5LHosYSxiKQorI2RlZmluZSBfX2l0dF90YXNrX2JlZ2luX292ZXJsYXBwZWRfZXhfcHRyICAgICAgICAgICAgICBJVFROT1RJRllfTkFNRSh0YXNrX2JlZ2luX292ZXJsYXBwZWRfZXgpCisjZGVmaW5lIF9faXR0X3Rhc2tfZW5kX292ZXJsYXBwZWQoZCx4KSAgICAgICAgICAgICAgICAgIElUVE5PVElGWV9WT0lEX0QxKHRhc2tfZW5kX292ZXJsYXBwZWQsZCx4KQorI2RlZmluZSBfX2l0dF90YXNrX2VuZF9vdmVybGFwcGVkX3B0ciAgICAgICAgICAgICAgICAgICBJVFROT1RJRllfTkFNRSh0YXNrX2VuZF9vdmVybGFwcGVkKQorI2RlZmluZSBfX2l0dF90YXNrX2VuZF9vdmVybGFwcGVkX2V4KGQseCx5LHopICAgICAgICAgICBJVFROT1RJRllfVk9JRF9EMyh0YXNrX2VuZF9vdmVybGFwcGVkX2V4LGQseCx5LHopCisjZGVmaW5lIF9faXR0X3Rhc2tfZW5kX292ZXJsYXBwZWRfZXhfcHRyICAgICAgICAgICAgICAgIElUVE5PVElGWV9OQU1FKHRhc2tfZW5kX292ZXJsYXBwZWRfZXgpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF90YXNrX2JlZ2luX292ZXJsYXBwZWQoZG9tYWluLHRhc2tpZCxwYXJlbnRpZCxuYW1lKQorI2RlZmluZSBfX2l0dF90YXNrX2JlZ2luX292ZXJsYXBwZWRfcHRyICAgICAgICAgMAorI2RlZmluZSBfX2l0dF90YXNrX2JlZ2luX292ZXJsYXBwZWRfZXgoZG9tYWluLGNsb2NrX2RvbWFpbix0aW1lc3RhbXAsdGFza2lkLHBhcmVudGlkLG5hbWUpCisjZGVmaW5lIF9faXR0X3Rhc2tfYmVnaW5fb3ZlcmxhcHBlZF9leF9wdHIgICAgICAwCisjZGVmaW5lIF9faXR0X3Rhc2tfZW5kX292ZXJsYXBwZWQoZG9tYWluLHRhc2tpZCkKKyNkZWZpbmUgX19pdHRfdGFza19lbmRfb3ZlcmxhcHBlZF9wdHIgICAgICAgICAgIDAKKyNkZWZpbmUgX19pdHRfdGFza19lbmRfb3ZlcmxhcHBlZF9leChkb21haW4sY2xvY2tfZG9tYWluLHRpbWVzdGFtcCx0YXNraWQpCisjZGVmaW5lIF9faXR0X3Rhc2tfZW5kX292ZXJsYXBwZWRfZXhfcHRyICAgICAgICAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfdGFza19iZWdpbl9vdmVybGFwcGVkX3B0ciAgICAgICAgIDAKKyNkZWZpbmUgX19pdHRfdGFza19iZWdpbl9vdmVybGFwcGVkX2V4X3B0ciAgICAgIDAKKyNkZWZpbmUgX19pdHRfdGFza19lbmRfb3ZlcmxhcHBlZF9wdHIgICAgICAgICAgIDAKKyNkZWZpbmUgX19pdHRfdGFza19lbmRfb3ZlcmxhcHBlZF9leF9wdHIgICAgICAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgbWFrcnNfaW50ZXJuYWwgTWFya3MKKyAqIEBpbmdyb3VwIGludGVybmFsCisgKiBNYXJrcyBncm91cAorICogQHdhcm5pbmcgSW50ZXJuYWwgQVBJOgorICogICAtIEl0IGlzIG5vdCBzaGlwcGVkIHRvIG91dHNpZGUgb2YgSW50ZWwKKyAqICAgLSBJdCBpcyBkZWxpdmVyZWQgdG8gaW50ZXJuYWwgSW50ZWwgdGVhbXMgdXNpbmcgZS1tYWlsIG9yIFNWTiBhY2Nlc3Mgb25seQorICogQHsKKyAqLworLyoqIEBicmllZiB1c2VyIG1hcmsgdHlwZSAqLwordHlwZWRlZiBpbnQgX19pdHRfbWFya190eXBlOworCisvKioKKyAqIEBicmllZiBDcmVhdGVzIGEgdXNlciBtYXJrIHR5cGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgdXNpbmcgY2hhciBvciBVbmljb2RlIHN0cmluZy4KKyAqIEBwYXJhbVtpbl0gbmFtZSAtIG5hbWUgb2YgbWFyayB0byBjcmVhdGUKKyAqIEByZXR1cm4gUmV0dXJucyBhIGhhbmRsZSB0byB0aGUgbWFyayB0eXBlCisgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK19faXR0X21hcmtfdHlwZSBJVFRBUEkgX19pdHRfbWFya19jcmVhdGVBKGNvbnN0IGNoYXIgICAgKm5hbWUpOworX19pdHRfbWFya190eXBlIElUVEFQSSBfX2l0dF9tYXJrX2NyZWF0ZVcoY29uc3Qgd2NoYXJfdCAqbmFtZSk7CisjaWYgZGVmaW5lZChVTklDT0RFKSB8fCBkZWZpbmVkKF9VTklDT0RFKQorIyAgZGVmaW5lIF9faXR0X21hcmtfY3JlYXRlICAgICBfX2l0dF9tYXJrX2NyZWF0ZVcKKyMgIGRlZmluZSBfX2l0dF9tYXJrX2NyZWF0ZV9wdHIgX19pdHRfbWFya19jcmVhdGVXX3B0cgorI2Vsc2UgLyogVU5JQ09ERSAqLworIyAgZGVmaW5lIF9faXR0X21hcmtfY3JlYXRlICAgICBfX2l0dF9tYXJrX2NyZWF0ZUEKKyMgIGRlZmluZSBfX2l0dF9tYXJrX2NyZWF0ZV9wdHIgX19pdHRfbWFya19jcmVhdGVBX3B0cgorI2VuZGlmIC8qIFVOSUNPREUgKi8KKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworX19pdHRfbWFya190eXBlIElUVEFQSSBfX2l0dF9tYXJrX2NyZWF0ZShjb25zdCBjaGFyICpuYW1lKTsKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9tYXJrX3R5cGUsIG1hcmtfY3JlYXRlQSwgKGNvbnN0IGNoYXIgICAgKm5hbWUpKQorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9tYXJrX3R5cGUsIG1hcmtfY3JlYXRlVywgKGNvbnN0IHdjaGFyX3QgKm5hbWUpKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9tYXJrX3R5cGUsIG1hcmtfY3JlYXRlLCAgKGNvbnN0IGNoYXIgKm5hbWUpKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9tYXJrX2NyZWF0ZUEgICAgIElUVE5PVElGWV9EQVRBKG1hcmtfY3JlYXRlQSkKKyNkZWZpbmUgX19pdHRfbWFya19jcmVhdGVBX3B0ciBJVFROT1RJRllfTkFNRShtYXJrX2NyZWF0ZUEpCisjZGVmaW5lIF9faXR0X21hcmtfY3JlYXRlVyAgICAgSVRUTk9USUZZX0RBVEEobWFya19jcmVhdGVXKQorI2RlZmluZSBfX2l0dF9tYXJrX2NyZWF0ZVdfcHRyIElUVE5PVElGWV9OQU1FKG1hcmtfY3JlYXRlVykKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9tYXJrX2NyZWF0ZSAgICAgIElUVE5PVElGWV9EQVRBKG1hcmtfY3JlYXRlKQorI2RlZmluZSBfX2l0dF9tYXJrX2NyZWF0ZV9wdHIgIElUVE5PVElGWV9OQU1FKG1hcmtfY3JlYXRlKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfbWFya19jcmVhdGVBKG5hbWUpIChfX2l0dF9tYXJrX3R5cGUpMAorI2RlZmluZSBfX2l0dF9tYXJrX2NyZWF0ZUFfcHRyIDAKKyNkZWZpbmUgX19pdHRfbWFya19jcmVhdGVXKG5hbWUpIChfX2l0dF9tYXJrX3R5cGUpMAorI2RlZmluZSBfX2l0dF9tYXJrX2NyZWF0ZVdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9tYXJrX2NyZWF0ZShuYW1lKSAgKF9faXR0X21hcmtfdHlwZSkwCisjZGVmaW5lIF9faXR0X21hcmtfY3JlYXRlX3B0ciAgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X21hcmtfY3JlYXRlQV9wdHIgMAorI2RlZmluZSBfX2l0dF9tYXJrX2NyZWF0ZVdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9tYXJrX2NyZWF0ZV9wdHIgIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgQ3JlYXRlcyBhICJkaXNjcmV0ZSIgdXNlciBtYXJrIHR5cGUgb2YgdGhlIHNwZWNpZmllZCB0eXBlIGFuZCBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgdXNpbmcgY2hhciBvciBVbmljb2RlIHN0cmluZy4KKyAqCisgKiAtIFRoZSBtYXJrIG9mICJkaXNjcmV0ZSIgdHlwZSBpcyBwbGFjZWQgdG8gY29sbGVjdGlvbiByZXN1bHRzIGluIGNhc2Ugb2Ygc3VjY2Vzcy4gSXQgYXBwZWFycyBpbiBvdmVydGltZSB2aWV3KHMpIGFzIGEgc3BlY2lhbCB0aWNrIHNpZ24uCisgKiAtIFRoZSBjYWxsIGlzICJzeW5jaHJvbm91cyIgLSBmdW5jdGlvbiByZXR1cm5zIGFmdGVyIG1hcmsgaXMgYWN0dWFsbHkgYWRkZWQgdG8gcmVzdWx0cy4KKyAqIC0gVGhpcyBmdW5jdGlvbiBpcyB1c2VmdWwsIGZvciBleGFtcGxlLCB0byBtYXJrIGRpZmZlcmVudCBwaGFzZXMgb2YgYXBwbGljYXRpb24KKyAqICAgKGJlZ2lubmluZyBvZiB0aGUgbmV4dCBtYXJrIGF1dG9tYXRpY2FsbHkgbWVhbmQgZW5kIG9mIGN1cnJlbnQgcmVnaW9uKS4KKyAqIC0gQ2FuIGJlIHVzZWQgdG9nZXRoZXIgd2l0aCAiY29udGludW91cyIgbWFya3MgKHNlZSBiZWxvdykgYXQgdGhlIHNhbWUgY29sbGVjdGlvbiBzZXNzaW9uCisgKiBAcGFyYW1baW5dIG10IC0gbWFyaywgY3JlYXRlZCBieSBfX2l0dF9tYXJrX2NyZWF0ZShjb25zdCBjaGFyKiBuYW1lKSBmdW5jdGlvbgorICogQHBhcmFtW2luXSBwYXJhbWV0ZXIgLSBzdHJpbmcgcGFyYW1ldGVyIG9mIG1hcmsKKyAqIEByZXR1cm4gUmV0dXJucyB6ZXJvIHZhbHVlIGluIGNhc2Ugb2Ygc3VjY2Vzcywgbm9uLXplcm8gdmFsdWUgb3RoZXJ3aXNlLgorICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitpbnQgSVRUQVBJIF9faXR0X21hcmtBKF9faXR0X21hcmtfdHlwZSBtdCwgY29uc3QgY2hhciAgICAqcGFyYW1ldGVyKTsKK2ludCBJVFRBUEkgX19pdHRfbWFya1coX19pdHRfbWFya190eXBlIG10LCBjb25zdCB3Y2hhcl90ICpwYXJhbWV0ZXIpOworI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKyMgIGRlZmluZSBfX2l0dF9tYXJrICAgICBfX2l0dF9tYXJrVworIyAgZGVmaW5lIF9faXR0X21hcmtfcHRyIF9faXR0X21hcmtXX3B0cgorI2Vsc2UgLyogVU5JQ09ERSAgKi8KKyMgIGRlZmluZSBfX2l0dF9tYXJrICAgICBfX2l0dF9tYXJrQQorIyAgZGVmaW5lIF9faXR0X21hcmtfcHRyIF9faXR0X21hcmtBX3B0cgorI2VuZGlmIC8qIFVOSUNPREUgKi8KKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworaW50IElUVEFQSSBfX2l0dF9tYXJrKF9faXR0X21hcmtfdHlwZSBtdCwgY29uc3QgY2hhciAqcGFyYW1ldGVyKTsKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUIoSVRUQVBJLCBpbnQsIG1hcmtBLCAoX19pdHRfbWFya190eXBlIG10LCBjb25zdCBjaGFyICAgICpwYXJhbWV0ZXIpKQorSVRUX1NUVUIoSVRUQVBJLCBpbnQsIG1hcmtXLCAoX19pdHRfbWFya190eXBlIG10LCBjb25zdCB3Y2hhcl90ICpwYXJhbWV0ZXIpKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUIoSVRUQVBJLCBpbnQsIG1hcmssICAoX19pdHRfbWFya190eXBlIG10LCBjb25zdCBjaGFyICpwYXJhbWV0ZXIpKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9tYXJrQSAgICAgSVRUTk9USUZZX0RBVEEobWFya0EpCisjZGVmaW5lIF9faXR0X21hcmtBX3B0ciBJVFROT1RJRllfTkFNRShtYXJrQSkKKyNkZWZpbmUgX19pdHRfbWFya1cgICAgIElUVE5PVElGWV9EQVRBKG1hcmtXKQorI2RlZmluZSBfX2l0dF9tYXJrV19wdHIgSVRUTk9USUZZX05BTUUobWFya1cpCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfbWFyayAgICAgIElUVE5PVElGWV9EQVRBKG1hcmspCisjZGVmaW5lIF9faXR0X21hcmtfcHRyICBJVFROT1RJRllfTkFNRShtYXJrKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfbWFya0EobXQsIHBhcmFtZXRlcikgKGludCkwCisjZGVmaW5lIF9faXR0X21hcmtBX3B0ciAwCisjZGVmaW5lIF9faXR0X21hcmtXKG10LCBwYXJhbWV0ZXIpIChpbnQpMAorI2RlZmluZSBfX2l0dF9tYXJrV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X21hcmsobXQsIHBhcmFtZXRlcikgIChpbnQpMAorI2RlZmluZSBfX2l0dF9tYXJrX3B0ciAgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X21hcmtBX3B0ciAwCisjZGVmaW5lIF9faXR0X21hcmtXX3B0ciAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfbWFya19wdHIgIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgVXNlIHRoaXMgaWYgbmVjZXNzYXJ5IHRvIGNyZWF0ZSBhICJkaXNjcmV0ZSIgdXNlciBldmVudCB0eXBlIChtYXJrKSBmb3IgcHJvY2VzcworICogcmF0aGVyIHRoZW4gZm9yIG9uZSB0aHJlYWQKKyAqIEBzZWUgaW50IF9faXR0X21hcmsoX19pdHRfbWFya190eXBlIG10LCBjb25zdCBjaGFyKiBwYXJhbWV0ZXIpOworICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitpbnQgSVRUQVBJIF9faXR0X21hcmtfZ2xvYmFsQShfX2l0dF9tYXJrX3R5cGUgbXQsIGNvbnN0IGNoYXIgICAgKnBhcmFtZXRlcik7CitpbnQgSVRUQVBJIF9faXR0X21hcmtfZ2xvYmFsVyhfX2l0dF9tYXJrX3R5cGUgbXQsIGNvbnN0IHdjaGFyX3QgKnBhcmFtZXRlcik7CisjaWYgZGVmaW5lZChVTklDT0RFKSB8fCBkZWZpbmVkKF9VTklDT0RFKQorIyAgZGVmaW5lIF9faXR0X21hcmtfZ2xvYmFsICAgICBfX2l0dF9tYXJrX2dsb2JhbFcKKyMgIGRlZmluZSBfX2l0dF9tYXJrX2dsb2JhbF9wdHIgX19pdHRfbWFya19nbG9iYWxXX3B0cgorI2Vsc2UgLyogVU5JQ09ERSAgKi8KKyMgIGRlZmluZSBfX2l0dF9tYXJrX2dsb2JhbCAgICAgX19pdHRfbWFya19nbG9iYWxBCisjICBkZWZpbmUgX19pdHRfbWFya19nbG9iYWxfcHRyIF9faXR0X21hcmtfZ2xvYmFsQV9wdHIKKyNlbmRpZiAvKiBVTklDT0RFICovCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK2ludCBJVFRBUEkgX19pdHRfbWFya19nbG9iYWwoX19pdHRfbWFya190eXBlIG10LCBjb25zdCBjaGFyICpwYXJhbWV0ZXIpOworI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQihJVFRBUEksIGludCwgbWFya19nbG9iYWxBLCAoX19pdHRfbWFya190eXBlIG10LCBjb25zdCBjaGFyICAgICpwYXJhbWV0ZXIpKQorSVRUX1NUVUIoSVRUQVBJLCBpbnQsIG1hcmtfZ2xvYmFsVywgKF9faXR0X21hcmtfdHlwZSBtdCwgY29uc3Qgd2NoYXJfdCAqcGFyYW1ldGVyKSkKKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCKElUVEFQSSwgaW50LCBtYXJrX2dsb2JhbCwgIChfX2l0dF9tYXJrX3R5cGUgbXQsIGNvbnN0IGNoYXIgKnBhcmFtZXRlcikpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X21hcmtfZ2xvYmFsQSAgICAgSVRUTk9USUZZX0RBVEEobWFya19nbG9iYWxBKQorI2RlZmluZSBfX2l0dF9tYXJrX2dsb2JhbEFfcHRyIElUVE5PVElGWV9OQU1FKG1hcmtfZ2xvYmFsQSkKKyNkZWZpbmUgX19pdHRfbWFya19nbG9iYWxXICAgICBJVFROT1RJRllfREFUQShtYXJrX2dsb2JhbFcpCisjZGVmaW5lIF9faXR0X21hcmtfZ2xvYmFsV19wdHIgSVRUTk9USUZZX05BTUUobWFya19nbG9iYWxXKQorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X21hcmtfZ2xvYmFsICAgICAgSVRUTk9USUZZX0RBVEEobWFya19nbG9iYWwpCisjZGVmaW5lIF9faXR0X21hcmtfZ2xvYmFsX3B0ciAgSVRUTk9USUZZX05BTUUobWFya19nbG9iYWwpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9tYXJrX2dsb2JhbEEobXQsIHBhcmFtZXRlcikgKGludCkwCisjZGVmaW5lIF9faXR0X21hcmtfZ2xvYmFsQV9wdHIgMAorI2RlZmluZSBfX2l0dF9tYXJrX2dsb2JhbFcobXQsIHBhcmFtZXRlcikgKGludCkwCisjZGVmaW5lIF9faXR0X21hcmtfZ2xvYmFsV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X21hcmtfZ2xvYmFsKG10LCBwYXJhbWV0ZXIpICAoaW50KTAKKyNkZWZpbmUgX19pdHRfbWFya19nbG9iYWxfcHRyICAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfbWFya19nbG9iYWxBX3B0ciAwCisjZGVmaW5lIF9faXR0X21hcmtfZ2xvYmFsV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X21hcmtfZ2xvYmFsX3B0ciAgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBDcmVhdGVzIGFuICJlbmQiIHBvaW50IGZvciAiY29udGludW91cyIgbWFyayB3aXRoIHNwZWNpZmllZCBuYW1lLgorICoKKyAqIC0gUmV0dXJucyB6ZXJvIHZhbHVlIGluIGNhc2Ugb2Ygc3VjY2Vzcywgbm9uLXplcm8gdmFsdWUgb3RoZXJ3aXNlLgorICogICBBbHNvIHJldHVybnMgbm9uLXplcm8gdmFsdWUgd2hlbiBwcmVjZWRpbmcgImJlZ2luIiBwb2ludCBmb3IgdGhlCisgKiAgIG1hcmsgd2l0aCB0aGUgc2FtZSBuYW1lIGZhaWxlZCB0byBiZSBjcmVhdGVkIG9yIG5vdCBjcmVhdGVkLgorICogLSBUaGUgbWFyayBvZiAiY29udGludW91cyIgdHlwZSBpcyBwbGFjZWQgdG8gY29sbGVjdGlvbiByZXN1bHRzIGluCisgKiAgIGNhc2Ugb2Ygc3VjY2Vzcy4gSXQgYXBwZWFycyBpbiBvdmVydGltZSB2aWV3KHMpIGFzIGEgc3BlY2lhbCB0aWNrCisgKiAgIHNpZ24gKGRpZmZlcmVudCBmcm9tICJkaXNjcmV0ZSIgbWFyaykgdG9nZXRoZXIgd2l0aCBsaW5lIGZyb20KKyAqICAgY29ycmVzcG9uZGluZyAiYmVnaW4iIG1hcmsgdG8gImVuZCIgbWFyay4KKyAqIEBub3RlIENvbnRpbnVvdXMgbWFya3MgY2FuIG92ZXJsYXAgYW5kIGJlIG5lc3RlZCBpbnNpZGUgZWFjaCBvdGhlci4KKyAqIERpc2NyZXRlIG1hcmsgY2FuIGJlIG5lc3RlZCBpbnNpZGUgbWFya2VkIHJlZ2lvbgorICogQHBhcmFtW2luXSBtdCAtIG1hcmssIGNyZWF0ZWQgYnkgX19pdHRfbWFya19jcmVhdGUoY29uc3QgY2hhciogbmFtZSkgZnVuY3Rpb24KKyAqIEByZXR1cm4gUmV0dXJucyB6ZXJvIHZhbHVlIGluIGNhc2Ugb2Ygc3VjY2Vzcywgbm9uLXplcm8gdmFsdWUgb3RoZXJ3aXNlLgorICovCitpbnQgSVRUQVBJIF9faXR0X21hcmtfb2ZmKF9faXR0X21hcmtfdHlwZSBtdCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCKElUVEFQSSwgaW50LCBtYXJrX29mZiwgKF9faXR0X21hcmtfdHlwZSBtdCkpCisjZGVmaW5lIF9faXR0X21hcmtfb2ZmICAgICBJVFROT1RJRllfREFUQShtYXJrX29mZikKKyNkZWZpbmUgX19pdHRfbWFya19vZmZfcHRyIElUVE5PVElGWV9OQU1FKG1hcmtfb2ZmKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfbWFya19vZmYobXQpIChpbnQpMAorI2RlZmluZSBfX2l0dF9tYXJrX29mZl9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X21hcmtfb2ZmX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIFVzZSB0aGlzIGlmIG5lY2Vzc2FyeSB0byBjcmVhdGUgYW4gImVuZCIgcG9pbnQgZm9yIG1hcmsgb2YgcHJvY2VzcworICogQHNlZSBpbnQgX19pdHRfbWFya19vZmYoX19pdHRfbWFya190eXBlIG10KTsKKyAqLworaW50IElUVEFQSSBfX2l0dF9tYXJrX2dsb2JhbF9vZmYoX19pdHRfbWFya190eXBlIG10KTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUIoSVRUQVBJLCBpbnQsIG1hcmtfZ2xvYmFsX29mZiwgKF9faXR0X21hcmtfdHlwZSBtdCkpCisjZGVmaW5lIF9faXR0X21hcmtfZ2xvYmFsX29mZiAgICAgSVRUTk9USUZZX0RBVEEobWFya19nbG9iYWxfb2ZmKQorI2RlZmluZSBfX2l0dF9tYXJrX2dsb2JhbF9vZmZfcHRyIElUVE5PVElGWV9OQU1FKG1hcmtfZ2xvYmFsX29mZikKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X21hcmtfZ2xvYmFsX29mZihtdCkgKGludCkwCisjZGVmaW5lIF9faXR0X21hcmtfZ2xvYmFsX29mZl9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X21hcmtfZ2xvYmFsX29mZl9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworLyoqIEB9IG1hcmtzIGdyb3VwICovCisKKy8qKgorICogQGRlZmdyb3VwIGNvdW50ZXJzX2ludGVybmFsIENvdW50ZXJzCisgKiBAaW5ncm91cCBpbnRlcm5hbAorICogQ291bnRlcnMgZ3JvdXAKKyAqIEB7CisgKi8KKy8qKgorICogQGJyaWVmIG9wYXF1ZSBzdHJ1Y3R1cmUgZm9yIGNvdW50ZXIgaWRlbnRpZmljYXRpb24KKyAqLwordHlwZWRlZiBzdHJ1Y3QgX19faXR0X2NvdW50ZXIgKl9faXR0X2NvdW50ZXI7CisKKy8qKgorICogQGJyaWVmIENyZWF0ZSBhIGNvdW50ZXIgd2l0aCBnaXZlbiBuYW1lL2RvbWFpbiBmb3IgdGhlIGNhbGxpbmcgdGhyZWFkCisgKgorICogQWZ0ZXIgX19pdHRfY291bnRlcl9jcmVhdGUoKSBpcyBjYWxsZWQsIF9faXR0X2NvdW50ZXJfaW5jKCkgLyBfX2l0dF9jb3VudGVyX2luY19kZWx0YSgpIGNhbiBiZSB1c2VkCisgKiB0byBpbmNyZW1lbnQgdGhlIGNvdW50ZXIgb24gYW55IHRocmVhZAorICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitfX2l0dF9jb3VudGVyIElUVEFQSSBfX2l0dF9jb3VudGVyX2NyZWF0ZUEoY29uc3QgY2hhciAgICAqbmFtZSwgY29uc3QgY2hhciAgICAqZG9tYWluKTsKK19faXR0X2NvdW50ZXIgSVRUQVBJIF9faXR0X2NvdW50ZXJfY3JlYXRlVyhjb25zdCB3Y2hhcl90ICpuYW1lLCBjb25zdCB3Y2hhcl90ICpkb21haW4pOworI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKyMgIGRlZmluZSBfX2l0dF9jb3VudGVyX2NyZWF0ZSAgICAgX19pdHRfY291bnRlcl9jcmVhdGVXCisjICBkZWZpbmUgX19pdHRfY291bnRlcl9jcmVhdGVfcHRyIF9faXR0X2NvdW50ZXJfY3JlYXRlV19wdHIKKyNlbHNlIC8qIFVOSUNPREUgKi8KKyMgIGRlZmluZSBfX2l0dF9jb3VudGVyX2NyZWF0ZSAgICAgX19pdHRfY291bnRlcl9jcmVhdGVBCisjICBkZWZpbmUgX19pdHRfY291bnRlcl9jcmVhdGVfcHRyIF9faXR0X2NvdW50ZXJfY3JlYXRlQV9wdHIKKyNlbmRpZiAvKiBVTklDT0RFICovCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK19faXR0X2NvdW50ZXIgSVRUQVBJIF9faXR0X2NvdW50ZXJfY3JlYXRlKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmRvbWFpbik7CisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfY291bnRlciwgY291bnRlcl9jcmVhdGVBLCAoY29uc3QgY2hhciAgICAqbmFtZSwgY29uc3QgY2hhciAgICAqZG9tYWluKSkKK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfY291bnRlciwgY291bnRlcl9jcmVhdGVXLCAoY29uc3Qgd2NoYXJfdCAqbmFtZSwgY29uc3Qgd2NoYXJfdCAqZG9tYWluKSkKKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfY291bnRlciwgY291bnRlcl9jcmVhdGUsICAoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqZG9tYWluKSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfY291bnRlcl9jcmVhdGVBICAgICBJVFROT1RJRllfREFUQShjb3VudGVyX2NyZWF0ZUEpCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfY3JlYXRlQV9wdHIgSVRUTk9USUZZX05BTUUoY291bnRlcl9jcmVhdGVBKQorI2RlZmluZSBfX2l0dF9jb3VudGVyX2NyZWF0ZVcgICAgIElUVE5PVElGWV9EQVRBKGNvdW50ZXJfY3JlYXRlVykKKyNkZWZpbmUgX19pdHRfY291bnRlcl9jcmVhdGVXX3B0ciBJVFROT1RJRllfTkFNRShjb3VudGVyX2NyZWF0ZVcpCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfY291bnRlcl9jcmVhdGUgICAgIElUVE5PVElGWV9EQVRBKGNvdW50ZXJfY3JlYXRlKQorI2RlZmluZSBfX2l0dF9jb3VudGVyX2NyZWF0ZV9wdHIgSVRUTk9USUZZX05BTUUoY291bnRlcl9jcmVhdGUpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9jb3VudGVyX2NyZWF0ZUEobmFtZSwgZG9tYWluKQorI2RlZmluZSBfX2l0dF9jb3VudGVyX2NyZWF0ZUFfcHRyIDAKKyNkZWZpbmUgX19pdHRfY291bnRlcl9jcmVhdGVXKG5hbWUsIGRvbWFpbikKKyNkZWZpbmUgX19pdHRfY291bnRlcl9jcmVhdGVXX3B0ciAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfY291bnRlcl9jcmVhdGUobmFtZSwgZG9tYWluKQorI2RlZmluZSBfX2l0dF9jb3VudGVyX2NyZWF0ZV9wdHIgIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9jb3VudGVyX2NyZWF0ZUFfcHRyIDAKKyNkZWZpbmUgX19pdHRfY291bnRlcl9jcmVhdGVXX3B0ciAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfY291bnRlcl9jcmVhdGVfcHRyICAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIERlc3Ryb3kgdGhlIGNvdW50ZXIgaWRlbnRpZmllZCBieSB0aGUgcG9pbnRlciBwcmV2aW91c2x5IHJldHVybmVkIGJ5IF9faXR0X2NvdW50ZXJfY3JlYXRlKCkKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfY291bnRlcl9kZXN0cm95KF9faXR0X2NvdW50ZXIgaWQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBjb3VudGVyX2Rlc3Ryb3ksIChfX2l0dF9jb3VudGVyIGlkKSkKKyNkZWZpbmUgX19pdHRfY291bnRlcl9kZXN0cm95ICAgICBJVFROT1RJRllfVk9JRChjb3VudGVyX2Rlc3Ryb3kpCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfZGVzdHJveV9wdHIgSVRUTk9USUZZX05BTUUoY291bnRlcl9kZXN0cm95KQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfY291bnRlcl9kZXN0cm95KGlkKQorI2RlZmluZSBfX2l0dF9jb3VudGVyX2Rlc3Ryb3lfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9jb3VudGVyX2Rlc3Ryb3lfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgSW5jcmVtZW50IHRoZSBjb3VudGVyIHZhbHVlCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X2NvdW50ZXJfaW5jKF9faXR0X2NvdW50ZXIgaWQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBjb3VudGVyX2luYywgKF9faXR0X2NvdW50ZXIgaWQpKQorI2RlZmluZSBfX2l0dF9jb3VudGVyX2luYyAgICAgSVRUTk9USUZZX1ZPSUQoY291bnRlcl9pbmMpCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfaW5jX3B0ciBJVFROT1RJRllfTkFNRShjb3VudGVyX2luYykKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfaW5jKGlkKQorI2RlZmluZSBfX2l0dF9jb3VudGVyX2luY19wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfaW5jX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIEluY3JlbWVudCB0aGUgY291bnRlciB2YWx1ZSB3aXRoIHgKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfY291bnRlcl9pbmNfZGVsdGEoX19pdHRfY291bnRlciBpZCwgdW5zaWduZWQgbG9uZyBsb25nIHZhbHVlKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgY291bnRlcl9pbmNfZGVsdGEsIChfX2l0dF9jb3VudGVyIGlkLCB1bnNpZ25lZCBsb25nIGxvbmcgdmFsdWUpKQorI2RlZmluZSBfX2l0dF9jb3VudGVyX2luY19kZWx0YSAgICAgSVRUTk9USUZZX1ZPSUQoY291bnRlcl9pbmNfZGVsdGEpCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfaW5jX2RlbHRhX3B0ciBJVFROT1RJRllfTkFNRShjb3VudGVyX2luY19kZWx0YSkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfaW5jX2RlbHRhKGlkLCB2YWx1ZSkKKyNkZWZpbmUgX19pdHRfY291bnRlcl9pbmNfZGVsdGFfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9jb3VudGVyX2luY19kZWx0YV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworLyoqIEB9IGNvdW50ZXJzIGdyb3VwICovCisKKy8qKgorICogQGRlZmdyb3VwIHN0aXRjaCBTdGFjayBTdGl0Y2hpbmcKKyAqIEBpbmdyb3VwIGludGVybmFsCisgKiBTdGFjayBTdGl0Y2hpbmcgZ3JvdXAKKyAqIEB7CisgKi8KKy8qKgorICogQGJyaWVmIG9wYXF1ZSBzdHJ1Y3R1cmUgZm9yIGNvdW50ZXIgaWRlbnRpZmljYXRpb24KKyAqLwordHlwZWRlZiBzdHJ1Y3QgX19faXR0X2NhbGxlciAqX19pdHRfY2FsbGVyOworCisvKioKKyAqIEBicmllZiBDcmVhdGUgdGhlIHN0aXRjaCBwb2ludCBlLmcuIGEgcG9pbnQgaW4gY2FsbCBzdGFjayB3aGVyZSBvdGhlciBzdGFja3Mgc2hvdWxkIGJlIHN0aXRjaGVkIHRvLgorICogVGhlIGZ1bmN0aW9uIHJldHVybnMgYSB1bmlxdWUgaWRlbnRpZmllciB3aGljaCBpcyB1c2VkIHRvIG1hdGNoIHRoZSBjdXQgcG9pbnRzIHdpdGggY29ycmVzcG9uZGluZyBzdGl0Y2ggcG9pbnRzLgorICovCitfX2l0dF9jYWxsZXIgSVRUQVBJIF9faXR0X3N0YWNrX2NhbGxlcl9jcmVhdGUodm9pZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfY2FsbGVyLCBzdGFja19jYWxsZXJfY3JlYXRlLCAodm9pZCkpCisjZGVmaW5lIF9faXR0X3N0YWNrX2NhbGxlcl9jcmVhdGUgICAgIElUVE5PVElGWV9EQVRBKHN0YWNrX2NhbGxlcl9jcmVhdGUpCisjZGVmaW5lIF9faXR0X3N0YWNrX2NhbGxlcl9jcmVhdGVfcHRyIElUVE5PVElGWV9OQU1FKHN0YWNrX2NhbGxlcl9jcmVhdGUpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9zdGFja19jYWxsZXJfY3JlYXRlKCkgKF9faXR0X2NhbGxlcikwCisjZGVmaW5lIF9faXR0X3N0YWNrX2NhbGxlcl9jcmVhdGVfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9zdGFja19jYWxsZXJfY3JlYXRlX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIERlc3Ryb3kgdGhlIGluZm9yYW10aW9uIGFib3V0IHN0aXRjaCBwb2ludCBpZGVudGlmaWVkIGJ5IHRoZSBwb2ludGVyIHByZXZpb3VzbHkgcmV0dXJuZWQgYnkgX19pdHRfc3RhY2tfY2FsbGVyX2NyZWF0ZSgpCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3N0YWNrX2NhbGxlcl9kZXN0cm95KF9faXR0X2NhbGxlciBpZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN0YWNrX2NhbGxlcl9kZXN0cm95LCAoX19pdHRfY2FsbGVyIGlkKSkKKyNkZWZpbmUgX19pdHRfc3RhY2tfY2FsbGVyX2Rlc3Ryb3kgICAgIElUVE5PVElGWV9WT0lEKHN0YWNrX2NhbGxlcl9kZXN0cm95KQorI2RlZmluZSBfX2l0dF9zdGFja19jYWxsZXJfZGVzdHJveV9wdHIgSVRUTk9USUZZX05BTUUoc3RhY2tfY2FsbGVyX2Rlc3Ryb3kpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9zdGFja19jYWxsZXJfZGVzdHJveShpZCkKKyNkZWZpbmUgX19pdHRfc3RhY2tfY2FsbGVyX2Rlc3Ryb3lfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9zdGFja19jYWxsZXJfZGVzdHJveV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBTZXRzIHRoZSBjdXQgcG9pbnQuIFN0YWNrIGZyb20gZWFjaCBldmVudCB3aGljaCBvY2N1cnMgYWZ0ZXIgdGhpcyBjYWxsIHdpbGwgYmUgY3V0CisgKiBhdCB0aGUgc2FtZSBzdGFjayBsZXZlbCB0aGUgZnVuY3Rpb24gd2FzIGNhbGxlZCBhbmQgc3RpdGNoZWQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgc3RpdGNoIHBvaW50LgorICovCit2b2lkIElUVEFQSSBfX2l0dF9zdGFja19jYWxsZWVfZW50ZXIoX19pdHRfY2FsbGVyIGlkKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3RhY2tfY2FsbGVlX2VudGVyLCAoX19pdHRfY2FsbGVyIGlkKSkKKyNkZWZpbmUgX19pdHRfc3RhY2tfY2FsbGVlX2VudGVyICAgICBJVFROT1RJRllfVk9JRChzdGFja19jYWxsZWVfZW50ZXIpCisjZGVmaW5lIF9faXR0X3N0YWNrX2NhbGxlZV9lbnRlcl9wdHIgSVRUTk9USUZZX05BTUUoc3RhY2tfY2FsbGVlX2VudGVyKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfc3RhY2tfY2FsbGVlX2VudGVyKGlkKQorI2RlZmluZSBfX2l0dF9zdGFja19jYWxsZWVfZW50ZXJfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9zdGFja19jYWxsZWVfZW50ZXJfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgVGhpcyBmdW5jdGlvbiBlbGltaW5hdGVzIHRoZSBjdXQgcG9pbnQgd2hpY2ggd2FzIHNldCBieSBsYXRlc3QgX19pdHRfc3RhY2tfY2FsbGVlX2VudGVyKCkuCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3N0YWNrX2NhbGxlZV9sZWF2ZShfX2l0dF9jYWxsZXIgaWQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzdGFja19jYWxsZWVfbGVhdmUsIChfX2l0dF9jYWxsZXIgaWQpKQorI2RlZmluZSBfX2l0dF9zdGFja19jYWxsZWVfbGVhdmUgICAgIElUVE5PVElGWV9WT0lEKHN0YWNrX2NhbGxlZV9sZWF2ZSkKKyNkZWZpbmUgX19pdHRfc3RhY2tfY2FsbGVlX2xlYXZlX3B0ciBJVFROT1RJRllfTkFNRShzdGFja19jYWxsZWVfbGVhdmUpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9zdGFja19jYWxsZWVfbGVhdmUoaWQpCisjZGVmaW5lIF9faXR0X3N0YWNrX2NhbGxlZV9sZWF2ZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X3N0YWNrX2NhbGxlZV9sZWF2ZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKiogQH0gc3RpdGNoIGdyb3VwICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCit0eXBlZGVmIGVudW0gX19pdHRfZXJyb3JfY29kZQoreworICAgIF9faXR0X2Vycm9yX3N1Y2Nlc3MgICAgICAgPSAwLCAvKiE8IG5vIGVycm9yICovCisgICAgX19pdHRfZXJyb3Jfbm9fbW9kdWxlICAgICA9IDEsIC8qITwgbW9kdWxlIGNhbid0IGJlIGxvYWRlZCAqLworICAgIC8qICUxJHMgLS0gbGlicmFyeSBuYW1lOyB3aW46ICUyJGQgLS0gc3lzdGVtIGVycm9yIGNvZGU7IHVueDogJTIkcyAtLSBzeXN0ZW0gZXJyb3IgbWVzc2FnZS4gKi8KKyAgICBfX2l0dF9lcnJvcl9ub19zeW1ib2wgICAgID0gMiwgLyohPCBzeW1ib2wgbm90IGZvdW5kICovCisgICAgLyogJTEkcyAtLSBsaWJyYXJ5IG5hbWUsICUyJHMgLS0gc3ltYm9sIG5hbWUuICovCisgICAgX19pdHRfZXJyb3JfdW5rbm93bl9ncm91cCA9IDMsIC8qITwgdW5rbm93biBncm91cCBzcGVjaWZpZWQgKi8KKyAgICAvKiAlMSRzIC0tIGVudiB2YXIgbmFtZSwgJTIkcyAtLSBncm91cCBuYW1lLiAqLworICAgIF9faXR0X2Vycm9yX2NhbnRfcmVhZF9lbnYgPSA0LCAvKiE8IEdldEVudmlyb25tZW50VmFyaWFibGUoKSBmYWlsZWQgKi8KKyAgICAvKiAlMSRzIC0tIGVudiB2YXIgbmFtZSwgJTIkZCAtLSBzeXN0ZW0gZXJyb3IuICovCisgICAgX19pdHRfZXJyb3JfZW52X3Rvb19sb25nICA9IDUsIC8qITwgdmFyaWFibGUgdmFsdWUgdG9vIGxvbmcgKi8KKyAgICAvKiAlMSRzIC0tIGVudiB2YXIgbmFtZSwgJTIkZCAtLSBhY3R1YWwgbGVuZ3RoIG9mIHRoZSB2YXIsICUzJGQgLS0gbWF4IGFsbG93ZWQgbGVuZ3RoLiAqLworICAgIF9faXR0X2Vycm9yX3N5c3RlbSAgICAgICAgPSA2ICAvKiE8IHB0aHJlYWRfbXV0ZXhhdHRyX2luaXQgb3IgcHRocmVhZF9tdXRleF9pbml0IGZhaWxlZCAqLworICAgIC8qICUxJHMgLS0gZnVuY3Rpb24gbmFtZSwgJTIkZCAtLSBlcnJuby4gKi8KK30gX19pdHRfZXJyb3JfY29kZTsKKwordHlwZWRlZiB2b2lkIChfX2l0dF9lcnJvcl9oYW5kbGVyX3QpKF9faXR0X2Vycm9yX2NvZGUgY29kZSwgdmFfbGlzdCk7CitfX2l0dF9lcnJvcl9oYW5kbGVyX3QqIF9faXR0X3NldF9lcnJvcl9oYW5kbGVyKF9faXR0X2Vycm9yX2hhbmRsZXJfdCopOworCitjb25zdCBjaGFyKiBJVFRBUEkgX19pdHRfYXBpX3ZlcnNpb24odm9pZCk7CisvKiogQGVuZGNvbmQgKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorI2RlZmluZSBfX2l0dF9lcnJvcl9oYW5kbGVyIElUVF9KT0lOKElOVEVMX0lUVE5PVElGWV9QUkVGSVgsIGVycm9yX2hhbmRsZXIpCit2b2lkIF9faXR0X2Vycm9yX2hhbmRsZXIoX19pdHRfZXJyb3JfY29kZSBjb2RlLCB2YV9saXN0IGFyZ3MpOworZXh0ZXJuIGNvbnN0IGludCBJVFROT1RJRllfTkFNRShlcnIpOworI2RlZmluZSBfX2l0dF9lcnIgSVRUTk9USUZZX05BTUUoZXJyKQorSVRUX1NUVUIoSVRUQVBJLCBjb25zdCBjaGFyKiwgYXBpX3ZlcnNpb24sICh2b2lkKSkKKyNkZWZpbmUgX19pdHRfYXBpX3ZlcnNpb24gICAgIElUVE5PVElGWV9EQVRBKGFwaV92ZXJzaW9uKQorI2RlZmluZSBfX2l0dF9hcGlfdmVyc2lvbl9wdHIgSVRUTk9USUZZX05BTUUoYXBpX3ZlcnNpb24pCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9hcGlfdmVyc2lvbigpICAgKGNvbnN0IGNoYXIqKTAKKyNkZWZpbmUgX19pdHRfYXBpX3ZlcnNpb25fcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9hcGlfdmVyc2lvbl9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisjZW5kaWYgLyogX0lUVE5PVElGWV9QUklWQVRFXyAqLworCisjZW5kaWYgLyogSU5URUxfSVRUTk9USUZZX0FQSV9QUklWQVRFICovCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy90aGlyZHBhcnR5L2l0dG5vdGlmeS9pdHRub3RpZnlfY29uZmlnLmggYi9maW5hbC9ydW50aW1lL3NyYy90aGlyZHBhcnR5L2l0dG5vdGlmeS9pdHRub3RpZnlfY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTMyMzI1NAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL3RoaXJkcGFydHkvaXR0bm90aWZ5L2l0dG5vdGlmeV9jb25maWcuaApAQCAtMCwwICsxLDQ3MyBAQAorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIF9JVFROT1RJRllfQ09ORklHX0hfCisjZGVmaW5lIF9JVFROT1RJRllfQ09ORklHX0hfCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJVFRfT1NfV0lOCisjICBkZWZpbmUgSVRUX09TX1dJTiAgIDEKKyNlbmRpZiAvKiBJVFRfT1NfV0lOICovCisKKyNpZm5kZWYgSVRUX09TX0xJTlVYCisjICBkZWZpbmUgSVRUX09TX0xJTlVYIDIKKyNlbmRpZiAvKiBJVFRfT1NfTElOVVggKi8KKworI2lmbmRlZiBJVFRfT1NfTUFDCisjICBkZWZpbmUgSVRUX09TX01BQyAgIDMKKyNlbmRpZiAvKiBJVFRfT1NfTUFDICovCisKKyNpZm5kZWYgSVRUX09TCisjICBpZiBkZWZpbmVkIFdJTjMyIHx8IGRlZmluZWQgX1dJTjMyCisjICAgIGRlZmluZSBJVFRfT1MgSVRUX09TX1dJTgorIyAgZWxpZiBkZWZpbmVkKCBfX0FQUExFX18gKSAmJiBkZWZpbmVkKCBfX01BQ0hfXyApCisjICAgIGRlZmluZSBJVFRfT1MgSVRUX09TX01BQworIyAgZWxzZQorIyAgICBkZWZpbmUgSVRUX09TIElUVF9PU19MSU5VWAorIyAgZW5kaWYKKyNlbmRpZiAvKiBJVFRfT1MgKi8KKworI2lmbmRlZiBJVFRfUExBVEZPUk1fV0lOCisjICBkZWZpbmUgSVRUX1BMQVRGT1JNX1dJTiAxCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNX1dJTiAqLworCisjaWZuZGVmIElUVF9QTEFURk9STV9QT1NJWAorIyAgZGVmaW5lIElUVF9QTEFURk9STV9QT1NJWCAyCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNX1BPU0lYICovCisKKyNpZm5kZWYgSVRUX1BMQVRGT1JNX01BQworIyAgZGVmaW5lIElUVF9QTEFURk9STV9NQUMgMworI2VuZGlmIC8qIElUVF9QTEFURk9STV9NQUMgKi8KKworI2lmbmRlZiBJVFRfUExBVEZPUk0KKyMgIGlmIElUVF9PUz09SVRUX09TX1dJTgorIyAgICBkZWZpbmUgSVRUX1BMQVRGT1JNIElUVF9QTEFURk9STV9XSU4KKyMgIGVsaWYgSVRUX09TPT1JVFRfT1NfTUFDCisjICAgIGRlZmluZSBJVFRfUExBVEZPUk0gSVRUX1BMQVRGT1JNX01BQworIyAgZWxzZQorIyAgICBkZWZpbmUgSVRUX1BMQVRGT1JNIElUVF9QTEFURk9STV9QT1NJWAorIyAgZW5kaWYKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk0gKi8KKworI2lmIGRlZmluZWQoX1VOSUNPREUpICYmICFkZWZpbmVkKFVOSUNPREUpCisjZGVmaW5lIFVOSUNPREUKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjaW5jbHVkZSA8dGNoYXIuaD4KKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpZiBkZWZpbmVkKFVOSUNPREUpIHx8IGRlZmluZWQoX1VOSUNPREUpCisjaW5jbHVkZSA8d2NoYXIuaD4KKyNlbmRpZiAvKiBVTklDT0RFIHx8IF9VTklDT0RFICovCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKKyNpZm5kZWYgQ0RFQ0wKKyMgIGlmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorIyAgICBkZWZpbmUgQ0RFQ0wgX19jZGVjbAorIyAgZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyMgICAgaWYgZGVmaW5lZCBfTV9JWDg2IHx8IGRlZmluZWQgX19pMzg2X18gCisjICAgICAgZGVmaW5lIENERUNMIF9fYXR0cmlidXRlX18gKChjZGVjbCkpCisjICAgIGVsc2UgIC8qIF9NX0lYODYgfHwgX19pMzg2X18gKi8KKyMgICAgICBkZWZpbmUgQ0RFQ0wgLyogYWN0dWFsIG9ubHkgb24geDg2IHBsYXRmb3JtICovCisjICAgIGVuZGlmIC8qIF9NX0lYODYgfHwgX19pMzg2X18gKi8KKyMgIGVuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIENERUNMICovCisKKyNpZm5kZWYgU1REQ0FMTAorIyAgaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjICAgIGRlZmluZSBTVERDQUxMIF9fc3RkY2FsbAorIyAgZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyMgICAgaWYgZGVmaW5lZCBfTV9JWDg2IHx8IGRlZmluZWQgX19pMzg2X18KKyMgICAgICBkZWZpbmUgU1REQ0FMTCBfX2F0dHJpYnV0ZV9fICgoc3RkY2FsbCkpIAorIyAgICBlbHNlICAvKiBfTV9JWDg2IHx8IF9faTM4Nl9fICovCisjICAgICAgZGVmaW5lIFNURENBTEwgLyogc3VwcG9ydGVkIG9ubHkgb24geDg2IHBsYXRmb3JtICovCisjICAgIGVuZGlmIC8qIF9NX0lYODYgfHwgX19pMzg2X18gKi8KKyMgIGVuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIFNURENBTEwgKi8KKworI2RlZmluZSBJVFRBUEkgICAgQ0RFQ0wKKyNkZWZpbmUgTElCSVRUQVBJIENERUNMCisKKy8qIFRPRE86IFRlbXBvcmFyeSBmb3IgY29tcGF0aWJpbGl0eSEgKi8KKyNkZWZpbmUgSVRUQVBJX0NBTEwgICAgQ0RFQ0wKKyNkZWZpbmUgTElCSVRUQVBJX0NBTEwgQ0RFQ0wKKworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorLyogdXNlIF9fZm9yY2VpbmxpbmUgKFZDKysgc3BlY2lmaWMpICovCisjZGVmaW5lIElUVF9JTkxJTkUgICAgICAgICAgIF9fZm9yY2VpbmxpbmUKKyNkZWZpbmUgSVRUX0lOTElORV9BVFRSSUJVVEUgLyogbm90aGluZyAqLworI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworLyoKKyAqIEdlbmVyYWxseSwgZnVuY3Rpb25zIGFyZSBub3QgaW5saW5lZCB1bmxlc3Mgb3B0aW1pemF0aW9uIGlzIHNwZWNpZmllZC4KKyAqIEZvciBmdW5jdGlvbnMgZGVjbGFyZWQgaW5saW5lLCB0aGlzIGF0dHJpYnV0ZSBpbmxpbmVzIHRoZSBmdW5jdGlvbiBldmVuCisgKiBpZiBubyBvcHRpbWl6YXRpb24gbGV2ZWwgd2FzIHNwZWNpZmllZC4KKyAqLworI2lmZGVmIF9fU1RSSUNUX0FOU0lfXworI2RlZmluZSBJVFRfSU5MSU5FICAgICAgICAgICBzdGF0aWMKKyNlbHNlICAvKiBfX1NUUklDVF9BTlNJX18gKi8KKyNkZWZpbmUgSVRUX0lOTElORSAgICAgICAgICAgc3RhdGljIGlubGluZQorI2VuZGlmIC8qIF9fU1RSSUNUX0FOU0lfXyAqLworI2RlZmluZSBJVFRfSU5MSU5FX0FUVFJJQlVURSBfX2F0dHJpYnV0ZV9fICgoYWx3YXlzX2lubGluZSwgdW51c2VkKSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKy8qKiBAZW5kY29uZCAqLworCisjaWZuZGVmIElUVF9BUkNIX0lBMzIKKyMgIGRlZmluZSBJVFRfQVJDSF9JQTMyICAxCisjZW5kaWYgLyogSVRUX0FSQ0hfSUEzMiAqLworCisjaWZuZGVmIElUVF9BUkNIX0lBMzJFCisjICBkZWZpbmUgSVRUX0FSQ0hfSUEzMkUgMgorI2VuZGlmIC8qIElUVF9BUkNIX0lBMzJFICovCisKKy8qIFdhcyB0aGVyZSBhIG1hZ2ljYWwgcmVhc29uIHdlIGRpZG4ndCBoYXZlIDMgaGVyZSBiZWZvcmU/ICovCisjaWZuZGVmIElUVF9BUkNIX0FBUkNINjQKKyMgIGRlZmluZSBJVFRfQVJDSF9BQVJDSDY0ICAzCisjZW5kaWYgLyogSVRUX0FSQ0hfQUFSQ0g2NCAqLworCisjaWZuZGVmIElUVF9BUkNIX0FSTQorIyAgZGVmaW5lIElUVF9BUkNIX0FSTSAgNAorI2VuZGlmIC8qIElUVF9BUkNIX0FSTSAqLworCisjaWZuZGVmIElUVF9BUkNIX1BQQzY0CisjICBkZWZpbmUgSVRUX0FSQ0hfUFBDNjQgIDUKKyNlbmRpZiAvKiBJVFRfQVJDSF9QUEM2NCAqLworCisKKyNpZm5kZWYgSVRUX0FSQ0gKKyMgIGlmIGRlZmluZWQgX01fSVg4NiB8fCBkZWZpbmVkIF9faTM4Nl9fCisjICAgIGRlZmluZSBJVFRfQVJDSCBJVFRfQVJDSF9JQTMyCisjICBlbGlmIGRlZmluZWQgX01fWDY0IHx8IGRlZmluZWQgX01fQU1ENjQgfHwgZGVmaW5lZCBfX3g4Nl82NF9fCisjICAgIGRlZmluZSBJVFRfQVJDSCBJVFRfQVJDSF9JQTMyRQorIyAgZWxpZiBkZWZpbmVkIF9NX0lBNjQgfHwgZGVmaW5lZCBfX2lhNjRfXworIyAgICBkZWZpbmUgSVRUX0FSQ0ggSVRUX0FSQ0hfSUE2NAorIyAgZWxpZiBkZWZpbmVkIF9NX0FSTSB8fCBfX2FybV9fCisjICAgIGRlZmluZSBJVFRfQVJDSCBJVFRfQVJDSF9BUk0KKyMgIGVsaWYgZGVmaW5lZCBfX3Bvd2VycGM2NF9fCisjICAgIGRlZmluZSBJVFRfQVJDSCBJVFRfQVJDSF9QUEM2NAorIyAgZWxpZiBkZWZpbmVkIF9fYWFyY2g2NF9fCisjICAgIGRlZmluZSBJVFRfQVJDSCBJVFRfQVJDSF9BQVJDSDY0CisjICBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworIyAgZGVmaW5lIElUVF9FWFRFUk5fQyBleHRlcm4gIkMiCisjZWxzZQorIyAgZGVmaW5lIElUVF9FWFRFUk5fQyAvKiBub3RoaW5nICovCisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2RlZmluZSBJVFRfVE9fU1RSX0FVWCh4KSAjeAorI2RlZmluZSBJVFRfVE9fU1RSKHgpICAgICBJVFRfVE9fU1RSX0FVWCh4KQorCisjZGVmaW5lIF9fSVRUX0JVSUxEX0FTU0VSVChleHByLCBzdWZmaXgpIGRvIHsgXAorICAgIHN0YXRpYyBjaGFyIF9faXR0X2J1aWxkX2NoZWNrXyMjc3VmZml4WyhleHByKSA/IDEgOiAtMV07IFwKKyAgICBfX2l0dF9idWlsZF9jaGVja18jI3N1ZmZpeFswXSA9IDA7IFwKK30gd2hpbGUoMCkKKyNkZWZpbmUgX0lUVF9CVUlMRF9BU1NFUlQoZXhwciwgc3VmZml4KSAgX19JVFRfQlVJTERfQVNTRVJUKChleHByKSwgc3VmZml4KQorI2RlZmluZSBJVFRfQlVJTERfQVNTRVJUKGV4cHIpICAgICAgICAgICBfSVRUX0JVSUxEX0FTU0VSVCgoZXhwciksIF9fTElORV9fKQorCisjZGVmaW5lIElUVF9NQUdJQyB7IDB4RUQsIDB4QUIsIDB4QUIsIDB4RUMsIDB4MEQsIDB4RUUsIDB4REEsIDB4MzAgfQorCisvKiBSZXBsYWNlIHdpdGggc25hcHNob3QgZGF0ZSBZWVlZTU1ERCBmb3IgcHJvbW90aW9uIGJ1aWxkLiAqLworI2RlZmluZSBBUElfVkVSU0lPTl9CVUlMRCAgICAyMDExMTExMQorCisjaWZuZGVmIEFQSV9WRVJTSU9OX05VTQorI2RlZmluZSBBUElfVkVSU0lPTl9OVU0gMC4wLjAKKyNlbmRpZiAvKiBBUElfVkVSU0lPTl9OVU0gKi8KKworI2RlZmluZSBBUElfVkVSU0lPTiAiSVRULUFQSS1WZXJzaW9uICIgSVRUX1RPX1NUUihBUElfVkVSU0lPTl9OVU0pIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAoIiBJVFRfVE9fU1RSKEFQSV9WRVJTSU9OX0JVSUxEKSAiKSIKKworLyogT1MgY29tbXVuaWNhdGlvbiBmdW5jdGlvbnMgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNpbmNsdWRlIDx3aW5kb3dzLmg+Cit0eXBlZGVmIEhNT0RVTEUgICAgICAgICAgIGxpYl90OwordHlwZWRlZiBEV09SRCAgICAgICAgICAgICBUSURUOwordHlwZWRlZiBDUklUSUNBTF9TRUNUSU9OICBtdXRleF90OworI2RlZmluZSBNVVRFWF9JTklUSUFMSVpFUiB7IDAgfQorI2RlZmluZSBzdHJvbmdfYWxpYXMobmFtZSwgYWxpYXNuYW1lKSAvKiBlbXB0eSBmb3IgV2luZG93cyAqLworI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2luY2x1ZGUgPGRsZmNuLmg+CisjaWYgZGVmaW5lZChVTklDT0RFKSB8fCBkZWZpbmVkKF9VTklDT0RFKQorI2luY2x1ZGUgPHdjaGFyLmg+CisjZW5kaWYgLyogVU5JQ09ERSAqLworI2lmbmRlZiBfR05VX1NPVVJDRQorI2RlZmluZSBfR05VX1NPVVJDRSAxIC8qIG5lZWQgZm9yIFBUSFJFQURfTVVURVhfUkVDVVJTSVZFICovCisjZW5kaWYgLyogX0dOVV9TT1VSQ0UgKi8KKyNpZm5kZWYgX19VU0VfVU5JWDk4CisjZGVmaW5lIF9fVVNFX1VOSVg5OCAxIC8qIG5lZWQgZm9yIFBUSFJFQURfTVVURVhfUkVDVVJTSVZFLCBvbiBTTEVTMTEuMSB3aXRoIGdjYyA0LjMuNCB3aGVyZWluIHB0aHJlYWQuaCBtaXNzaW5nIGRlcGVuZGVuY3kgb24gX19VU0VfWE9QRU4ySzggKi8KKyNlbmRpZiAvKl9fVVNFX1VOSVg5OCovCisjaW5jbHVkZSA8cHRocmVhZC5oPgordHlwZWRlZiB2b2lkKiAgICAgICAgICAgICBsaWJfdDsKK3R5cGVkZWYgcHRocmVhZF90ICAgICAgICAgVElEVDsKK3R5cGVkZWYgcHRocmVhZF9tdXRleF90ICAgbXV0ZXhfdDsKKyNkZWZpbmUgTVVURVhfSU5JVElBTElaRVIgUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUgorI2RlZmluZSBfc3Ryb25nX2FsaWFzKG5hbWUsIGFsaWFzbmFtZSkgXAorICAgICAgICAgICAgZXh0ZXJuIF9fdHlwZW9mIChuYW1lKSBhbGlhc25hbWUgX19hdHRyaWJ1dGVfXyAoKGFsaWFzICgjbmFtZSkpKTsKKyNkZWZpbmUgc3Ryb25nX2FsaWFzKG5hbWUsIGFsaWFzbmFtZSkgX3N0cm9uZ19hbGlhcyhuYW1lLCBhbGlhc25hbWUpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfZ2V0X3Byb2MobGliLCBuYW1lKSBHZXRQcm9jQWRkcmVzcyhsaWIsIG5hbWUpCisjZGVmaW5lIF9faXR0X211dGV4X2luaXQobXV0ZXgpICAgSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbihtdXRleCkKKyNkZWZpbmUgX19pdHRfbXV0ZXhfbG9jayhtdXRleCkgICBFbnRlckNyaXRpY2FsU2VjdGlvbihtdXRleCkKKyNkZWZpbmUgX19pdHRfbXV0ZXhfdW5sb2NrKG11dGV4KSBMZWF2ZUNyaXRpY2FsU2VjdGlvbihtdXRleCkKKyNkZWZpbmUgX19pdHRfbG9hZF9saWIobmFtZSkgICAgICBMb2FkTGlicmFyeUEobmFtZSkKKyNkZWZpbmUgX19pdHRfdW5sb2FkX2xpYihoYW5kbGUpICBGcmVlTGlicmFyeShoYW5kbGUpCisjZGVmaW5lIF9faXR0X3N5c3RlbV9lcnJvcigpICAgICAgKGludClHZXRMYXN0RXJyb3IoKQorI2RlZmluZSBfX2l0dF9mc3RyY21wKHMxLCBzMikgICAgIGxzdHJjbXBBKHMxLCBzMikKKyNkZWZpbmUgX19pdHRfZnN0cmxlbihzKSAgICAgICAgICBsc3RybGVuQShzKQorI2RlZmluZSBfX2l0dF9mc3RyY3B5bihzMSwgczIsIGwpIGxzdHJjcHluQShzMSwgczIsIGwpCisjZGVmaW5lIF9faXR0X2ZzdHJkdXAocykgICAgICAgICAgX3N0cmR1cChzKQorI2RlZmluZSBfX2l0dF90aHJlYWRfaWQoKSAgICAgICAgIEdldEN1cnJlbnRUaHJlYWRJZCgpCisjZGVmaW5lIF9faXR0X3RocmVhZF95aWVsZCgpICAgICAgU3dpdGNoVG9UaHJlYWQoKQorI2lmbmRlZiBJVFRfU0lNUExFX0lOSVQKK0lUVF9JTkxJTkUgbG9uZworX19pdHRfaW50ZXJsb2NrZWRfaW5jcmVtZW50KHZvbGF0aWxlIGxvbmcqIHB0cikgSVRUX0lOTElORV9BVFRSSUJVVEU7CitJVFRfSU5MSU5FIGxvbmcgX19pdHRfaW50ZXJsb2NrZWRfaW5jcmVtZW50KHZvbGF0aWxlIGxvbmcqIHB0cikKK3sKKyAgICByZXR1cm4gSW50ZXJsb2NrZWRJbmNyZW1lbnQocHRyKTsKK30KKyNlbmRpZiAvKiBJVFRfU0lNUExFX0lOSVQgKi8KKyNlbHNlIC8qIElUVF9QTEFURk9STSE9SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9nZXRfcHJvYyhsaWIsIG5hbWUpIGRsc3ltKGxpYiwgbmFtZSkKKyNkZWZpbmUgX19pdHRfbXV0ZXhfaW5pdChtdXRleCkgICB7XAorICAgIHB0aHJlYWRfbXV0ZXhhdHRyX3QgbXV0ZXhfYXR0cjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgZXJyb3JfY29kZSA9IHB0aHJlYWRfbXV0ZXhhdHRyX2luaXQoJm11dGV4X2F0dHIpOyAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGVycm9yX2NvZGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBfX2l0dF9yZXBvcnRfZXJyb3IoX19pdHRfZXJyb3Jfc3lzdGVtLCAicHRocmVhZF9tdXRleGF0dHJfaW5pdCIsICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX2NvZGUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZXJyb3JfY29kZSA9IHB0aHJlYWRfbXV0ZXhhdHRyX3NldHR5cGUoJm11dGV4X2F0dHIsICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBUSFJFQURfTVVURVhfUkVDVVJTSVZFKTsgICAgICAgIFwKKyAgICBpZiAoZXJyb3JfY29kZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIF9faXR0X3JlcG9ydF9lcnJvcihfX2l0dF9lcnJvcl9zeXN0ZW0sICJwdGhyZWFkX211dGV4YXR0cl9zZXR0eXBlIiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfY29kZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlcnJvcl9jb2RlID0gcHRocmVhZF9tdXRleF9pbml0KG11dGV4LCAmbXV0ZXhfYXR0cik7ICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGVycm9yX2NvZGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBfX2l0dF9yZXBvcnRfZXJyb3IoX19pdHRfZXJyb3Jfc3lzdGVtLCAicHRocmVhZF9tdXRleF9pbml0IiwgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX2NvZGUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZXJyb3JfY29kZSA9IHB0aHJlYWRfbXV0ZXhhdHRyX2Rlc3Ryb3koJm11dGV4X2F0dHIpOyAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChlcnJvcl9jb2RlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgX19pdHRfcmVwb3J0X2Vycm9yKF9faXR0X2Vycm9yX3N5c3RlbSwgInB0aHJlYWRfbXV0ZXhhdHRyX2Rlc3Ryb3kiLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9jb2RlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorI2RlZmluZSBfX2l0dF9tdXRleF9sb2NrKG11dGV4KSAgIHB0aHJlYWRfbXV0ZXhfbG9jayhtdXRleCkKKyNkZWZpbmUgX19pdHRfbXV0ZXhfdW5sb2NrKG11dGV4KSBwdGhyZWFkX211dGV4X3VubG9jayhtdXRleCkKKyNkZWZpbmUgX19pdHRfbG9hZF9saWIobmFtZSkgICAgICBkbG9wZW4obmFtZSwgUlRMRF9MQVpZKQorI2RlZmluZSBfX2l0dF91bmxvYWRfbGliKGhhbmRsZSkgIGRsY2xvc2UoaGFuZGxlKQorI2RlZmluZSBfX2l0dF9zeXN0ZW1fZXJyb3IoKSAgICAgIGVycm5vCisjZGVmaW5lIF9faXR0X2ZzdHJjbXAoczEsIHMyKSAgICAgc3RyY21wKHMxLCBzMikKKyNkZWZpbmUgX19pdHRfZnN0cmxlbihzKSAgICAgICAgICBzdHJsZW4ocykKKyNkZWZpbmUgX19pdHRfZnN0cmNweW4oczEsIHMyLCBsKSBzdHJuY3B5KHMxLCBzMiwgbCkKKyNkZWZpbmUgX19pdHRfZnN0cmR1cChzKSAgICAgICAgICBzdHJkdXAocykKKyNkZWZpbmUgX19pdHRfdGhyZWFkX2lkKCkgICAgICAgICBwdGhyZWFkX3NlbGYoKQorI2RlZmluZSBfX2l0dF90aHJlYWRfeWllbGQoKSAgICAgIHNjaGVkX3lpZWxkKCkKKyNpZiBJVFRfQVJDSD09SVRUX0FSQ0hfSUE2NAorI2lmZGVmIF9fSU5URUxfQ09NUElMRVIKKyNkZWZpbmUgX19UQkJfbWFjaGluZV9mZXRjaGFkZDQoYWRkciwgdmFsKSBfX2ZldGNoYWRkNF9hY3EoKHZvaWQgKilhZGRyLCB2YWwpCisjZWxzZSAgLyogX19JTlRFTF9DT01QSUxFUiAqLworLyogVE9ETzogQWRkIFN1cHBvcnQgZm9yIG5vdCBJbnRlbCBjb21waWxlcnMgZm9yIElBLTY0ICovCisjZW5kaWYgLyogX19JTlRFTF9DT01QSUxFUiAqLworI2VsaWYgSVRUX0FSQ0g9PUlUVF9BUkNIX0lBMzIgfHwgSVRUX0FSQ0g9PUlUVF9BUkNIX0lBMzJFIC8qIElUVF9BUkNIIT1JVFRfQVJDSF9JQTY0ICovCitJVFRfSU5MSU5FIGxvbmcKK19fVEJCX21hY2hpbmVfZmV0Y2hhZGQ0KHZvbGF0aWxlIHZvaWQqIHB0ciwgbG9uZyBhZGRlbmQpIElUVF9JTkxJTkVfQVRUUklCVVRFOworSVRUX0lOTElORSBsb25nIF9fVEJCX21hY2hpbmVfZmV0Y2hhZGQ0KHZvbGF0aWxlIHZvaWQqIHB0ciwgbG9uZyBhZGRlbmQpCit7CisgICAgbG9uZyByZXN1bHQ7CisgICAgX19hc21fXyBfX3ZvbGF0aWxlX18oImxvY2tcbnhhZGQgJTAsJTEiCisgICAgICAgICAgICAgICAgICAgICAgICAgIDogIj1yIihyZXN1bHQpLCI9bSIoKihpbnQqKXB0cikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiMCIoYWRkZW5kKSwgIm0iKCooaW50KilwdHIpCisgICAgICAgICAgICAgICAgICAgICAgICAgIDogIm1lbW9yeSIpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisjZWxpZiBJVFRfQVJDSD09SVRUX0FSQ0hfQVJNIHx8IElUVF9BUkNIPT1JVFRfQVJDSF9QUEM2NCB8fCBJVFRfQVJDSD09SVRUX0FSQ0hfQUFSQ0g2NAorI2RlZmluZSBfX1RCQl9tYWNoaW5lX2ZldGNoYWRkNChhZGRyLCB2YWwpIF9fc3luY19mZXRjaF9hbmRfYWRkKGFkZHIsIHZhbCkKKyNlbmRpZiAvKiBJVFRfQVJDSD09SVRUX0FSQ0hfSUE2NCAqLworI2lmbmRlZiBJVFRfU0lNUExFX0lOSVQKK0lUVF9JTkxJTkUgbG9uZworX19pdHRfaW50ZXJsb2NrZWRfaW5jcmVtZW50KHZvbGF0aWxlIGxvbmcqIHB0cikgSVRUX0lOTElORV9BVFRSSUJVVEU7CitJVFRfSU5MSU5FIGxvbmcgX19pdHRfaW50ZXJsb2NrZWRfaW5jcmVtZW50KHZvbGF0aWxlIGxvbmcqIHB0cikKK3sKKyAgICByZXR1cm4gX19UQkJfbWFjaGluZV9mZXRjaGFkZDQocHRyLCAxKSArIDFMOworfQorI2VuZGlmIC8qIElUVF9TSU1QTEVfSU5JVCAqLworI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCit0eXBlZGVmIGVudW0geworICAgIF9faXR0X2NvbGxlY3Rpb25fbm9ybWFsID0gMCwKKyAgICBfX2l0dF9jb2xsZWN0aW9uX3BhdXNlZCA9IDEKK30gX19pdHRfY29sbGVjdGlvbl9zdGF0ZTsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBfX2l0dF90aHJlYWRfbm9ybWFsICA9IDAsCisgICAgX19pdHRfdGhyZWFkX2lnbm9yZWQgPSAxCit9IF9faXR0X3RocmVhZF9zdGF0ZTsKKworI3ByYWdtYSBwYWNrKHB1c2gsIDgpCisKK3R5cGVkZWYgc3RydWN0IF9fX2l0dF90aHJlYWRfaW5mbworeworICAgIGNvbnN0IGNoYXIqIG5hbWVBOyAvKiE8IENvcHkgb2Ygb3JpZ2luYWwgbmFtZSBpbiBBU0NJSS4gKi8KKyNpZiBkZWZpbmVkKFVOSUNPREUpIHx8IGRlZmluZWQoX1VOSUNPREUpCisgICAgY29uc3Qgd2NoYXJfdCogbmFtZVc7IC8qITwgQ29weSBvZiBvcmlnaW5hbCBuYW1lIGluIFVOSUNPREUuICovCisjZWxzZSAgLyogVU5JQ09ERSB8fCBfVU5JQ09ERSAqLworICAgIHZvaWQqIG5hbWVXOworI2VuZGlmIC8qIFVOSUNPREUgfHwgX1VOSUNPREUgKi8KKyAgICBUSURUICAgICAgICAgICAgICAgdGlkOworICAgIF9faXR0X3RocmVhZF9zdGF0ZSBzdGF0ZTsgICAvKiE8IFRocmVhZCBzdGF0ZSAocGF1c2VkIG9yIG5vcm1hbCkgKi8KKyAgICBpbnQgICAgICAgICAgICAgICAgZXh0cmExOyAgLyohPCBSZXNlcnZlZCB0byB0aGUgcnVudGltZSAqLworICAgIHZvaWQqICAgICAgICAgICAgICBleHRyYTI7ICAvKiE8IFJlc2VydmVkIHRvIHRoZSBydW50aW1lICovCisgICAgc3RydWN0IF9fX2l0dF90aHJlYWRfaW5mbyogbmV4dDsKK30gX19pdHRfdGhyZWFkX2luZm87CisKKyNpbmNsdWRlICJpdHRub3RpZnlfdHlwZXMuaCIgLyogRm9yIF9faXR0X2dyb3VwX2lkIGRlZmluaXRpb24gKi8KKwordHlwZWRlZiBzdHJ1Y3QgX19faXR0X2FwaV9pbmZvXzIwMTAxMDAxCit7CisgICAgY29uc3QgY2hhciogICAgbmFtZTsKKyAgICB2b2lkKiogICAgICAgICBmdW5jX3B0cjsKKyAgICB2b2lkKiAgICAgICAgICBpbml0X2Z1bmM7CisgICAgX19pdHRfZ3JvdXBfaWQgZ3JvdXA7Cit9ICBfX2l0dF9hcGlfaW5mb18yMDEwMTAwMTsKKwordHlwZWRlZiBzdHJ1Y3QgX19faXR0X2FwaV9pbmZvCit7CisgICAgY29uc3QgY2hhciogICAgbmFtZTsKKyAgICB2b2lkKiogICAgICAgICBmdW5jX3B0cjsKKyAgICB2b2lkKiAgICAgICAgICBpbml0X2Z1bmM7CisgICAgdm9pZCogICAgICAgICAgbnVsbF9mdW5jOworICAgIF9faXR0X2dyb3VwX2lkIGdyb3VwOworfSAgX19pdHRfYXBpX2luZm87CisKK3N0cnVjdCBfX19pdHRfZG9tYWluOworc3RydWN0IF9fX2l0dF9zdHJpbmdfaGFuZGxlOworCit0eXBlZGVmIHN0cnVjdCBfX19pdHRfZ2xvYmFsCit7CisgICAgdW5zaWduZWQgY2hhciAgICAgICAgICBtYWdpY1s4XTsKKyAgICB1bnNpZ25lZCBsb25nICAgICAgICAgIHZlcnNpb25fbWFqb3I7CisgICAgdW5zaWduZWQgbG9uZyAgICAgICAgICB2ZXJzaW9uX21pbm9yOworICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgdmVyc2lvbl9idWlsZDsKKyAgICB2b2xhdGlsZSBsb25nICAgICAgICAgIGFwaV9pbml0aWFsaXplZDsKKyAgICB2b2xhdGlsZSBsb25nICAgICAgICAgIG11dGV4X2luaXRpYWxpemVkOworICAgIHZvbGF0aWxlIGxvbmcgICAgICAgICAgYXRvbWljX2NvdW50ZXI7CisgICAgbXV0ZXhfdCAgICAgICAgICAgICAgICBtdXRleDsKKyAgICBsaWJfdCAgICAgICAgICAgICAgICAgIGxpYjsKKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgIGVycm9yX2hhbmRsZXI7CisgICAgY29uc3QgY2hhcioqICAgICAgICAgICBkbGxfcGF0aF9wdHI7CisgICAgX19pdHRfYXBpX2luZm8qICAgICAgICBhcGlfbGlzdF9wdHI7CisgICAgc3RydWN0IF9fX2l0dF9nbG9iYWwqICBuZXh0OworICAgIC8qIEpvaW5hYmxlIHN0cnVjdHVyZXMgYmVsb3cgKi8KKyAgICBfX2l0dF90aHJlYWRfaW5mbyogICAgIHRocmVhZF9saXN0OworICAgIHN0cnVjdCBfX19pdHRfZG9tYWluKiAgZG9tYWluX2xpc3Q7CisgICAgc3RydWN0IF9fX2l0dF9zdHJpbmdfaGFuZGxlKiBzdHJpbmdfbGlzdDsKKyAgICBfX2l0dF9jb2xsZWN0aW9uX3N0YXRlIHN0YXRlOworfSBfX2l0dF9nbG9iYWw7CisKKyNwcmFnbWEgcGFjayhwb3ApCisKKyNkZWZpbmUgTkVXX1RIUkVBRF9JTkZPX1coZ3B0cixoLGhfdGFpbCx0LHMsbikgeyBcCisgICAgaCA9IChfX2l0dF90aHJlYWRfaW5mbyopbWFsbG9jKHNpemVvZihfX2l0dF90aHJlYWRfaW5mbykpOyBcCisgICAgaWYgKGggIT0gTlVMTCkgeyBcCisgICAgICAgIGgtPnRpZCAgICA9IHQ7IFwKKyAgICAgICAgaC0+bmFtZUEgID0gTlVMTDsgXAorICAgICAgICBoLT5uYW1lVyAgPSBuID8gX3djc2R1cChuKSA6IE5VTEw7IFwKKyAgICAgICAgaC0+c3RhdGUgID0gczsgXAorICAgICAgICBoLT5leHRyYTEgPSAwOyAgICAvKiByZXNlcnZlZCAqLyBcCisgICAgICAgIGgtPmV4dHJhMiA9IE5VTEw7IC8qIHJlc2VydmVkICovIFwKKyAgICAgICAgaC0+bmV4dCAgID0gTlVMTDsgXAorICAgICAgICBpZiAoaF90YWlsID09IE5VTEwpIFwKKyAgICAgICAgICAgIChncHRyKS0+dGhyZWFkX2xpc3QgPSBoOyBcCisgICAgICAgIGVsc2UgXAorICAgICAgICAgICAgaF90YWlsLT5uZXh0ID0gaDsgXAorICAgIH0gXAorfQorCisjZGVmaW5lIE5FV19USFJFQURfSU5GT19BKGdwdHIsaCxoX3RhaWwsdCxzLG4pIHsgXAorICAgIGggPSAoX19pdHRfdGhyZWFkX2luZm8qKW1hbGxvYyhzaXplb2YoX19pdHRfdGhyZWFkX2luZm8pKTsgXAorICAgIGlmIChoICE9IE5VTEwpIHsgXAorICAgICAgICBoLT50aWQgICAgPSB0OyBcCisgICAgICAgIGgtPm5hbWVBICA9IG4gPyBfX2l0dF9mc3RyZHVwKG4pIDogTlVMTDsgXAorICAgICAgICBoLT5uYW1lVyAgPSBOVUxMOyBcCisgICAgICAgIGgtPnN0YXRlICA9IHM7IFwKKyAgICAgICAgaC0+ZXh0cmExID0gMDsgICAgLyogcmVzZXJ2ZWQgKi8gXAorICAgICAgICBoLT5leHRyYTIgPSBOVUxMOyAvKiByZXNlcnZlZCAqLyBcCisgICAgICAgIGgtPm5leHQgICA9IE5VTEw7IFwKKyAgICAgICAgaWYgKGhfdGFpbCA9PSBOVUxMKSBcCisgICAgICAgICAgICAoZ3B0ciktPnRocmVhZF9saXN0ID0gaDsgXAorICAgICAgICBlbHNlIFwKKyAgICAgICAgICAgIGhfdGFpbC0+bmV4dCA9IGg7IFwKKyAgICB9IFwKK30KKworI2RlZmluZSBORVdfRE9NQUlOX1coZ3B0cixoLGhfdGFpbCxuYW1lKSB7IFwKKyAgICBoID0gKF9faXR0X2RvbWFpbiopbWFsbG9jKHNpemVvZihfX2l0dF9kb21haW4pKTsgXAorICAgIGlmIChoICE9IE5VTEwpIHsgXAorICAgICAgICBoLT5mbGFncyAgPSAwOyAgICAvKiBkb21haW4gaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCAqLyBcCisgICAgICAgIGgtPm5hbWVBICA9IE5VTEw7IFwKKyAgICAgICAgaC0+bmFtZVcgID0gbmFtZSA/IF93Y3NkdXAobmFtZSkgOiBOVUxMOyBcCisgICAgICAgIGgtPmV4dHJhMSA9IDA7ICAgIC8qIHJlc2VydmVkICovIFwKKyAgICAgICAgaC0+ZXh0cmEyID0gTlVMTDsgLyogcmVzZXJ2ZWQgKi8gXAorICAgICAgICBoLT5uZXh0ICAgPSBOVUxMOyBcCisgICAgICAgIGlmIChoX3RhaWwgPT0gTlVMTCkgXAorICAgICAgICAgICAgKGdwdHIpLT5kb21haW5fbGlzdCA9IGg7IFwKKyAgICAgICAgZWxzZSBcCisgICAgICAgICAgICBoX3RhaWwtPm5leHQgPSBoOyBcCisgICAgfSBcCit9CisKKyNkZWZpbmUgTkVXX0RPTUFJTl9BKGdwdHIsaCxoX3RhaWwsbmFtZSkgeyBcCisgICAgaCA9IChfX2l0dF9kb21haW4qKW1hbGxvYyhzaXplb2YoX19pdHRfZG9tYWluKSk7IFwKKyAgICBpZiAoaCAhPSBOVUxMKSB7IFwKKyAgICAgICAgaC0+ZmxhZ3MgID0gMDsgICAgLyogZG9tYWluIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQgKi8gXAorICAgICAgICBoLT5uYW1lQSAgPSBuYW1lID8gX19pdHRfZnN0cmR1cChuYW1lKSA6IE5VTEw7IFwKKyAgICAgICAgaC0+bmFtZVcgID0gTlVMTDsgXAorICAgICAgICBoLT5leHRyYTEgPSAwOyAgICAvKiByZXNlcnZlZCAqLyBcCisgICAgICAgIGgtPmV4dHJhMiA9IE5VTEw7IC8qIHJlc2VydmVkICovIFwKKyAgICAgICAgaC0+bmV4dCAgID0gTlVMTDsgXAorICAgICAgICBpZiAoaF90YWlsID09IE5VTEwpIFwKKyAgICAgICAgICAgIChncHRyKS0+ZG9tYWluX2xpc3QgPSBoOyBcCisgICAgICAgIGVsc2UgXAorICAgICAgICAgICAgaF90YWlsLT5uZXh0ID0gaDsgXAorICAgIH0gXAorfQorCisjZGVmaW5lIE5FV19TVFJJTkdfSEFORExFX1coZ3B0cixoLGhfdGFpbCxuYW1lKSB7IFwKKyAgICBoID0gKF9faXR0X3N0cmluZ19oYW5kbGUqKW1hbGxvYyhzaXplb2YoX19pdHRfc3RyaW5nX2hhbmRsZSkpOyBcCisgICAgaWYgKGggIT0gTlVMTCkgeyBcCisgICAgICAgIGgtPnN0ckEgICA9IE5VTEw7IFwKKyAgICAgICAgaC0+c3RyVyAgID0gbmFtZSA/IF93Y3NkdXAobmFtZSkgOiBOVUxMOyBcCisgICAgICAgIGgtPmV4dHJhMSA9IDA7ICAgIC8qIHJlc2VydmVkICovIFwKKyAgICAgICAgaC0+ZXh0cmEyID0gTlVMTDsgLyogcmVzZXJ2ZWQgKi8gXAorICAgICAgICBoLT5uZXh0ICAgPSBOVUxMOyBcCisgICAgICAgIGlmIChoX3RhaWwgPT0gTlVMTCkgXAorICAgICAgICAgICAgKGdwdHIpLT5zdHJpbmdfbGlzdCA9IGg7IFwKKyAgICAgICAgZWxzZSBcCisgICAgICAgICAgICBoX3RhaWwtPm5leHQgPSBoOyBcCisgICAgfSBcCit9CisKKyNkZWZpbmUgTkVXX1NUUklOR19IQU5ETEVfQShncHRyLGgsaF90YWlsLG5hbWUpIHsgXAorICAgIGggPSAoX19pdHRfc3RyaW5nX2hhbmRsZSopbWFsbG9jKHNpemVvZihfX2l0dF9zdHJpbmdfaGFuZGxlKSk7IFwKKyAgICBpZiAoaCAhPSBOVUxMKSB7IFwKKyAgICAgICAgaC0+c3RyQSAgID0gbmFtZSA/IF9faXR0X2ZzdHJkdXAobmFtZSkgOiBOVUxMOyBcCisgICAgICAgIGgtPnN0clcgICA9IE5VTEw7IFwKKyAgICAgICAgaC0+ZXh0cmExID0gMDsgICAgLyogcmVzZXJ2ZWQgKi8gXAorICAgICAgICBoLT5leHRyYTIgPSBOVUxMOyAvKiByZXNlcnZlZCAqLyBcCisgICAgICAgIGgtPm5leHQgICA9IE5VTEw7IFwKKyAgICAgICAgaWYgKGhfdGFpbCA9PSBOVUxMKSBcCisgICAgICAgICAgICAoZ3B0ciktPnN0cmluZ19saXN0ID0gaDsgXAorICAgICAgICBlbHNlIFwKKyAgICAgICAgICAgIGhfdGFpbC0+bmV4dCA9IGg7IFwKKyAgICB9IFwKK30KKworI2VuZGlmIC8qIF9JVFROT1RJRllfQ09ORklHX0hfICovCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy90aGlyZHBhcnR5L2l0dG5vdGlmeS9pdHRub3RpZnlfc3RhdGljLmMgYi9maW5hbC9ydW50aW1lL3NyYy90aGlyZHBhcnR5L2l0dG5vdGlmeS9pdHRub3RpZnlfc3RhdGljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI0NDAxMQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL3RoaXJkcGFydHkvaXR0bm90aWZ5L2l0dG5vdGlmeV9zdGF0aWMuYwpAQCAtMCwwICsxLDEwNTAgQEAKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIml0dG5vdGlmeV9jb25maWcuaCIKKworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBQQVRIX01BWCA1MTIKKyNlbHNlIC8qIElUVF9QTEFURk9STSE9SVRUX1BMQVRGT1JNX1dJTiAqLworI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPGRsZmNuLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjZGVmaW5lIElOVEVMX05PX01BQ1JPX0JPRFkgCisjZGVmaW5lIElOVEVMX0lUVE5PVElGWV9BUElfUFJJVkFURQorI2luY2x1ZGUgIml0dG5vdGlmeS5oIgorI2luY2x1ZGUgImxlZ2FjeS9pdHRub3RpZnkuaCIKKworI2luY2x1ZGUgImRpc2FibGVfd2FybmluZ3MuaCIKKworc3RhdGljIGNvbnN0IGNoYXIgYXBpX3ZlcnNpb25bXSA9IEFQSV9WRVJTSU9OICJcMFxuQCgjKSAkUmV2aXNpb246IDQzMzc1ICRcbiI7CisKKyNkZWZpbmUgX05fKG4pIElUVF9KT0lOKElOVEVMX0lUVE5PVElGWV9QUkVGSVgsbikKKworI2lmIElUVF9PUz09SVRUX09TX1dJTgorc3RhdGljIGNvbnN0IGNoYXIqIGl0dG5vdGlmeV9saWJfbmFtZSA9ICJsaWJpdHRub3RpZnkuZGxsIjsKKyNlbGlmIElUVF9PUz09SVRUX09TX0xJTlVYCitzdGF0aWMgY29uc3QgY2hhciogaXR0bm90aWZ5X2xpYl9uYW1lID0gImxpYml0dG5vdGlmeS5zbyI7CisjZWxpZiBJVFRfT1M9PUlUVF9PU19NQUMKK3N0YXRpYyBjb25zdCBjaGFyKiBpdHRub3RpZnlfbGliX25hbWUgPSAibGliaXR0bm90aWZ5LmR5bGliIjsKKyNlbHNlCisjZXJyb3IgVW5zdXBwb3J0ZWQgb3IgdW5rbm93biBPUy4KKyNlbmRpZgorCisjaWZkZWYgX19BTkRST0lEX18KKyNpbmNsdWRlIDxhbmRyb2lkL2xvZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpbWl0cy5oPgorCisjaWZkZWYgSVRUX0FORFJPSURfTE9HCisgICAgI2RlZmluZSBJVFRfQU5EUk9JRF9MT0dfVEFHICAgIklOVEVMX1ZUVU5FX1VTRVJBUEkiCisgICAgI2RlZmluZSBJVFRfQU5EUk9JRF9MT0dJKC4uLikgKCh2b2lkKV9fYW5kcm9pZF9sb2dfcHJpbnQoQU5EUk9JRF9MT0dfSU5GTywgSVRUX0FORFJPSURfTE9HX1RBRywgX19WQV9BUkdTX18pKQorICAgICNkZWZpbmUgSVRUX0FORFJPSURfTE9HVyguLi4pICgodm9pZClfX2FuZHJvaWRfbG9nX3ByaW50KEFORFJPSURfTE9HX1dBUk4sIElUVF9BTkRST0lEX0xPR19UQUcsIF9fVkFfQVJHU19fKSkKKyAgICAjZGVmaW5lIElUVF9BTkRST0lEX0xPR0UoLi4uKSAoKHZvaWQpX19hbmRyb2lkX2xvZ19wcmludChBTkRST0lEX0xPR19FUlJPUixJVFRfQU5EUk9JRF9MT0dfVEFHLCBfX1ZBX0FSR1NfXykpCisgICAgI2RlZmluZSBJVFRfQU5EUk9JRF9MT0dEKC4uLikgKCh2b2lkKV9fYW5kcm9pZF9sb2dfcHJpbnQoQU5EUk9JRF9MT0dfREVCVUcsSVRUX0FORFJPSURfTE9HX1RBRywgX19WQV9BUkdTX18pKQorI2Vsc2UKKyAgICAjZGVmaW5lIElUVF9BTkRST0lEX0xPR0koLi4uKQorICAgICNkZWZpbmUgSVRUX0FORFJPSURfTE9HVyguLi4pCisgICAgI2RlZmluZSBJVFRfQU5EUk9JRF9MT0dFKC4uLikKKyAgICAjZGVmaW5lIElUVF9BTkRST0lEX0xPR0QoLi4uKQorI2VuZGlmCisKKy8qIGRlZmF1bHQgbG9jYXRpb24gb2YgdXNlcmFwaSBjb2xsZWN0b3Igb24gQW5kcm9pZCAqLworI2RlZmluZSBBTkRST0lEX0lUVE5PVElGWV9ERUZBVUxUX1BBVEggICIvZGF0YS9kYXRhL2NvbS5pbnRlbC52dHVuZS9pbnRlbC9saWJpdHRub3RpZnkuc28iCisjZW5kaWYKKworCisjaWZuZGVmIExJQl9WQVJfTkFNRQorI2lmIElUVF9BUkNIPT1JVFRfQVJDSF9JQTMyIHx8IElUVF9BUkNIPT1JVFRfQVJDSF9BUk0KKyNkZWZpbmUgTElCX1ZBUl9OQU1FIElOVEVMX0xJQklUVE5PVElGWTMyCisjZWxzZQorI2RlZmluZSBMSUJfVkFSX05BTUUgSU5URUxfTElCSVRUTk9USUZZNjQKKyNlbmRpZgorI2VuZGlmIC8qIExJQl9WQVJfTkFNRSAqLworCisjZGVmaW5lIElUVF9NVVRFWF9JTklUX0FORF9MT0NLKHApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICghcC5tdXRleF9pbml0aWFsaXplZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoX19pdHRfaW50ZXJsb2NrZWRfaW5jcmVtZW50KCZwLmF0b21pY19jb3VudGVyKSA9PSAxKSBcCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgX19pdHRfbXV0ZXhfaW5pdCgmcC5tdXRleCk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgcC5tdXRleF9pbml0aWFsaXplZCA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgd2hpbGUgKCFwLm11dGV4X2luaXRpYWxpemVkKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIF9faXR0X3RocmVhZF95aWVsZCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIF9faXR0X211dGV4X2xvY2soJnAubXV0ZXgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKK2NvbnN0IGludCBfTl8oZXJyKSA9IDA7CisKK3R5cGVkZWYgaW50IChfX2l0dF9pbml0X2l0dGxpYl90KShjb25zdCBjaGFyKiwgX19pdHRfZ3JvdXBfaWQpOworCisvKiB0aGlzIGRlZmluZSB1c2VkIHRvIGNvbnRyb2wgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24gbmFtZS4gKi8KKyNpZm5kZWYgX19pdHRfaW5pdF9pdHRsaWJfbmFtZQorSVRUX0VYVEVSTl9DIGludCBfTl8oaW5pdF9pdHRsaWIpKGNvbnN0IGNoYXIqLCBfX2l0dF9ncm91cF9pZCk7CitzdGF0aWMgX19pdHRfaW5pdF9pdHRsaWJfdCogX19pdHRfaW5pdF9pdHRsaWJfcHRyID0gX05fKGluaXRfaXR0bGliKTsKKyNkZWZpbmUgX19pdHRfaW5pdF9pdHRsaWJfbmFtZSBfX2l0dF9pbml0X2l0dGxpYl9wdHIKKyNlbmRpZiAvKiBfX2l0dF9pbml0X2l0dGxpYl9uYW1lICovCisKK3R5cGVkZWYgdm9pZCAoX19pdHRfZmluaV9pdHRsaWJfdCkodm9pZCk7CisKKy8qIHRoaXMgZGVmaW5lIHVzZWQgdG8gY29udHJvbCBmaW5hbGl6YXRpb24gZnVuY3Rpb24gbmFtZS4gKi8KKyNpZm5kZWYgX19pdHRfZmluaV9pdHRsaWJfbmFtZQorSVRUX0VYVEVSTl9DIHZvaWQgX05fKGZpbmlfaXR0bGliKSh2b2lkKTsKK3N0YXRpYyBfX2l0dF9maW5pX2l0dGxpYl90KiBfX2l0dF9maW5pX2l0dGxpYl9wdHIgPSBfTl8oZmluaV9pdHRsaWIpOworI2RlZmluZSBfX2l0dF9maW5pX2l0dGxpYl9uYW1lIF9faXR0X2ZpbmlfaXR0bGliX3B0cgorI2VuZGlmIC8qIF9faXR0X2ZpbmlfaXR0bGliX25hbWUgKi8KKworLyogYnVpbGRpbmcgcG9pbnRlcnMgdG8gaW1wb3J0ZWQgZnVuY3MgKi8KKyN1bmRlZiBJVFRfU1RVQlYKKyN1bmRlZiBJVFRfU1RVQgorI2RlZmluZSBJVFRfU1RVQihhcGksdHlwZSxuYW1lLGFyZ3MscGFyYW1zLHB0cixncm91cCxmb3JtYXQpICAgXAorc3RhdGljIHR5cGUgYXBpIElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhuYW1lKSxfaW5pdCkpIGFyZ3M7XAordHlwZWRlZiB0eXBlIGFwaSBJVFRfSk9JTihfTl8obmFtZSksX3QpIGFyZ3M7ICAgICAgICAgICAgICAgICAgXAorSVRUX0VYVEVSTl9DIElUVF9KT0lOKF9OXyhuYW1lKSxfdCkqIElUVE5PVElGWV9OQU1FKG5hbWUpID0gSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKG5hbWUpLF9pbml0KSk7IFwKK3N0YXRpYyB0eXBlIGFwaSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8obmFtZSksX2luaXQpKSBhcmdzIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2l0dF9pbml0X2l0dGxpYl9uYW1lKE5VTEwsIF9faXR0X2dyb3VwX2FsbCk7ICAgICAgICAgICAgIFwKKyAgICBpZiAoSVRUTk9USUZZX05BTUUobmFtZSkgJiYgSVRUTk9USUZZX05BTUUobmFtZSkgIT0gSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKG5hbWUpLF9pbml0KSkpIFwKKyAgICAgICAgcmV0dXJuIElUVE5PVElGWV9OQU1FKG5hbWUpIHBhcmFtczsgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuICh0eXBlKTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBJVFRfU1RVQlYoYXBpLHR5cGUsbmFtZSxhcmdzLHBhcmFtcyxwdHIsZ3JvdXAsZm9ybWF0KSAgXAorc3RhdGljIHR5cGUgYXBpIElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhuYW1lKSxfaW5pdCkpIGFyZ3M7XAordHlwZWRlZiB0eXBlIGFwaSBJVFRfSk9JTihfTl8obmFtZSksX3QpIGFyZ3M7ICAgICAgICAgICAgICAgICAgXAorSVRUX0VYVEVSTl9DIElUVF9KT0lOKF9OXyhuYW1lKSxfdCkqIElUVE5PVElGWV9OQU1FKG5hbWUpID0gSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKG5hbWUpLF9pbml0KSk7IFwKK3N0YXRpYyB0eXBlIGFwaSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8obmFtZSksX2luaXQpKSBhcmdzIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2l0dF9pbml0X2l0dGxpYl9uYW1lKE5VTEwsIF9faXR0X2dyb3VwX2FsbCk7ICAgICAgICAgICAgIFwKKyAgICBpZiAoSVRUTk9USUZZX05BTUUobmFtZSkgJiYgSVRUTk9USUZZX05BTUUobmFtZSkgIT0gSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKG5hbWUpLF9pbml0KSkpIFwKKyAgICAgICAgSVRUTk9USUZZX05BTUUobmFtZSkgcGFyYW1zOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI3VuZGVmIF9fSVRUX0lOVEVSTkFMX0lOSVQKKyNpbmNsdWRlICJpdHRub3RpZnlfc3RhdGljLmgiCisKKyN1bmRlZiBJVFRfU1RVQgorI3VuZGVmIElUVF9TVFVCVgorI2RlZmluZSBJVFRfU1RVQihhcGksdHlwZSxuYW1lLGFyZ3MscGFyYW1zLHB0cixncm91cCxmb3JtYXQpICAgXAorc3RhdGljIHR5cGUgYXBpIElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhuYW1lKSxfaW5pdCkpIGFyZ3M7XAordHlwZWRlZiB0eXBlIGFwaSBJVFRfSk9JTihfTl8obmFtZSksX3QpIGFyZ3M7ICAgICAgICAgICAgICAgICAgXAorSVRUX0VYVEVSTl9DIElUVF9KT0lOKF9OXyhuYW1lKSxfdCkqIElUVE5PVElGWV9OQU1FKG5hbWUpID0gSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKG5hbWUpLF9pbml0KSk7CisKKyNkZWZpbmUgSVRUX1NUVUJWKGFwaSx0eXBlLG5hbWUsYXJncyxwYXJhbXMscHRyLGdyb3VwLGZvcm1hdCkgIFwKK3N0YXRpYyB0eXBlIGFwaSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8obmFtZSksX2luaXQpKSBhcmdzO1wKK3R5cGVkZWYgdHlwZSBhcGkgSVRUX0pPSU4oX05fKG5hbWUpLF90KSBhcmdzOyAgICAgICAgICAgICAgICAgIFwKK0lUVF9FWFRFUk5fQyBJVFRfSk9JTihfTl8obmFtZSksX3QpKiBJVFROT1RJRllfTkFNRShuYW1lKSA9IElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhuYW1lKSxfaW5pdCkpOworCisjZGVmaW5lIF9fSVRUX0lOVEVSTkFMX0lOSVQKKyNpbmNsdWRlICJpdHRub3RpZnlfc3RhdGljLmgiCisjdW5kZWYgX19JVFRfSU5URVJOQUxfSU5JVAorCitJVFRfR1JPVVBfTElTVChncm91cF9saXN0KTsKKworI3ByYWdtYSBwYWNrKHB1c2gsIDgpCisKK3R5cGVkZWYgc3RydWN0IF9fX2l0dF9ncm91cF9hbGlhcworeworICAgIGNvbnN0IGNoYXIqICAgIGVudl92YXI7CisgICAgX19pdHRfZ3JvdXBfaWQgZ3JvdXBzOworfSBfX2l0dF9ncm91cF9hbGlhczsKKworc3RhdGljIF9faXR0X2dyb3VwX2FsaWFzIGdyb3VwX2FsaWFzW10gPSB7CisgICAgeyAiS01QX0ZPUl9UUFJPRklMRSIsIChfX2l0dF9ncm91cF9pZCkoX19pdHRfZ3JvdXBfY29udHJvbCB8IF9faXR0X2dyb3VwX3RocmVhZCB8IF9faXR0X2dyb3VwX3N5bmMgIHwgX19pdHRfZ3JvdXBfbWFyaykgfSwKKyAgICB7ICJLTVBfRk9SX1RDSEVDSyIsICAgKF9faXR0X2dyb3VwX2lkKShfX2l0dF9ncm91cF9jb250cm9sIHwgX19pdHRfZ3JvdXBfdGhyZWFkIHwgX19pdHRfZ3JvdXBfc3luYyAgfCBfX2l0dF9ncm91cF9mc3luYyB8IF9faXR0X2dyb3VwX21hcmsgfCBfX2l0dF9ncm91cF9zdXBwcmVzcykgfSwKKyAgICB7IE5VTEwsICAgICAgICAgICAgICAgKF9faXR0X2dyb3VwX25vbmUpIH0sCisgICAgeyBhcGlfdmVyc2lvbiwgICAgICAgIChfX2l0dF9ncm91cF9ub25lKSB9IC8qICEhISBKdXN0IHRvIGF2b2lkIHVudXNlZCBjb2RlIGVsaW1pbmF0aW9uICEhISAqLworfTsKKworI3ByYWdtYSBwYWNrKHBvcCkKKworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI3ByYWdtYSB3YXJuaW5nKHB1c2gpCisjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTogNDA1NCkgLyogd2FybmluZyBDNDA1NDogJ3R5cGUgY2FzdCcgOiBmcm9tIGZ1bmN0aW9uIHBvaW50ZXIgJ1hYWCcgdG8gZGF0YSBwb2ludGVyICd2b2lkIConICovCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKK3N0YXRpYyBfX2l0dF9hcGlfaW5mbyBhcGlfbGlzdFtdID0geworLyogRGVmaW5lIGZ1bmN0aW9ucyB3aXRoIHN0YXRpYyBpbXBsZW1lbnRhdGlvbiAqLworI3VuZGVmIElUVF9TVFVCCisjdW5kZWYgSVRUX1NUVUJWCisjZGVmaW5lIElUVF9TVFVCKGFwaSx0eXBlLG5hbWUsYXJncyxwYXJhbXMsbmFtZWluZGxsLGdyb3VwLGZvcm1hdCkgeyBJVFRfVE9fU1RSKElUVF9KT0lOKF9faXR0XyxuYW1laW5kbGwpKSwgKHZvaWQqKikodm9pZCopJklUVE5PVElGWV9OQU1FKG5hbWUpLCAodm9pZCopKHNpemVfdCkmSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKG5hbWUpLF9pbml0KSksICh2b2lkKikoc2l6ZV90KSZJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8obmFtZSksX2luaXQpKSwgKF9faXR0X2dyb3VwX2lkKShncm91cCl9LAorI2RlZmluZSBJVFRfU1RVQlYgSVRUX1NUVUIKKyNkZWZpbmUgX19JVFRfSU5URVJOQUxfSU5JVAorI2luY2x1ZGUgIml0dG5vdGlmeV9zdGF0aWMuaCIKKyN1bmRlZiBfX0lUVF9JTlRFUk5BTF9JTklUCisvKiBEZWZpbmUgZnVuY3Rpb25zIHdpdGhvdXQgc3RhdGljIGltcGxlbWVudGF0aW9uICovCisjdW5kZWYgSVRUX1NUVUIKKyN1bmRlZiBJVFRfU1RVQlYKKyNkZWZpbmUgSVRUX1NUVUIoYXBpLHR5cGUsbmFtZSxhcmdzLHBhcmFtcyxuYW1laW5kbGwsZ3JvdXAsZm9ybWF0KSB7SVRUX1RPX1NUUihJVFRfSk9JTihfX2l0dF8sbmFtZWluZGxsKSksICh2b2lkKiopKHZvaWQqKSZJVFROT1RJRllfTkFNRShuYW1lKSwgKHZvaWQqKShzaXplX3QpJklUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhuYW1lKSxfaW5pdCkpLCBOVUxMLCAoX19pdHRfZ3JvdXBfaWQpKGdyb3VwKX0sCisjZGVmaW5lIElUVF9TVFVCViBJVFRfU1RVQgorI2luY2x1ZGUgIml0dG5vdGlmeV9zdGF0aWMuaCIKKyAgICB7TlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgX19pdHRfZ3JvdXBfbm9uZX0KK307CisKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNwcmFnbWEgd2FybmluZyhwb3ApCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKKy8qIHByaXZhdGUsIGluaXQgdGhyZWFkIGluZm8gaXRlbS4gdXNlZCBmb3IgaW50ZXJuYWwgcHVycG9zZXMgKi8KK3N0YXRpYyBfX2l0dF90aHJlYWRfaW5mbyBpbml0X3RocmVhZF9pbmZvID0geworICAgIChjb25zdCBjaGFyKilOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5hbWVBICovCisjaWYgZGVmaW5lZChVTklDT0RFKSB8fCBkZWZpbmVkKF9VTklDT0RFKQorICAgIChjb25zdCB3Y2hhcl90KilOVUxMLCAgICAgICAgICAgICAgICAgICAgIC8qIG5hbWVXICovCisjZWxzZQorICAgICh2b2lkKilOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5hbWVXICovCisjZW5kaWYKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aWQgKi8KKyAgICBfX2l0dF90aHJlYWRfbm9ybWFsLCAgICAgICAgICAgICAgICAgICAgICAvKiBzdGF0ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGV4dHJhMSAqLworICAgICh2b2lkKilOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGV4dHJhMiAqLworICAgIChfX2l0dF90aHJlYWRfaW5mbyopTlVMTCAgICAgICAgICAgICAgICAgIC8qIG5leHQgKi8KK307CisKKy8qIHByaXZhdGUsIE5VTEwgZG9tYWluIGl0ZW0uIHVzZWQgZm9yIGludGVybmFsIHB1cnBvc2VzICovCitzdGF0aWMgX19pdHRfZG9tYWluIG51bGxfZG9tYWluID0geworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZsYWdzOiAgZGlzYWJsZWQgYnkgZGVmYXVsdCAqLworICAgIChjb25zdCBjaGFyKilOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5hbWVBICovCisjaWYgZGVmaW5lZChVTklDT0RFKSB8fCBkZWZpbmVkKF9VTklDT0RFKQorICAgIChjb25zdCB3Y2hhcl90KilOVUxMLCAgICAgICAgICAgICAgICAgICAgIC8qIG5hbWVXICovCisjZWxzZQorICAgICh2b2lkKilOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5hbWVXICovCisjZW5kaWYKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBleHRyYTEgKi8KKyAgICAodm9pZCopTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBleHRyYTIgKi8KKyAgICAoX19pdHRfZG9tYWluKilOVUxMICAgICAgICAgICAgICAgICAgICAgICAvKiBuZXh0ICovCit9OworCisvKiBwcml2YXRlLCBOVUxMIHN0cmluZyBoYW5kbGUgaXRlbS4gdXNlZCBmb3IgaW50ZXJuYWwgcHVycG9zZXMgKi8KK3N0YXRpYyBfX2l0dF9zdHJpbmdfaGFuZGxlIG51bGxfc3RyaW5nX2hhbmRsZSA9IHsKKyAgICAoY29uc3QgY2hhciopTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdHJBICovCisjaWYgZGVmaW5lZChVTklDT0RFKSB8fCBkZWZpbmVkKF9VTklDT0RFKQorICAgIChjb25zdCB3Y2hhcl90KilOVUxMLCAgICAgICAgICAgICAgICAgICAgIC8qIHN0clcgKi8KKyNlbHNlCisgICAgKHZvaWQqKU5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RyVyAqLworI2VuZGlmCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZXh0cmExICovCisgICAgKHZvaWQqKU5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZXh0cmEyICovCisgICAgKF9faXR0X3N0cmluZ19oYW5kbGUqKU5VTEwgICAgICAgICAgICAgICAgLyogbmV4dCAqLworfTsKKworc3RhdGljIGNvbnN0IGNoYXIgZGxsX3BhdGhbUEFUSF9NQVhdID0geyAwIH07CisKKy8qIHN0YXRpYyBwYXJ0IGRlc2NyaXB0b3Igd2hpY2ggaGFuZGxlcy4gYWxsIG5vdGlmaWNhdGlvbiBhcGkgYXR0cmlidXRlcy4gKi8KK19faXR0X2dsb2JhbCBfTl8oX2l0dGFwaV9nbG9iYWwpID0geworICAgIElUVF9NQUdJQywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWRlbnRpZmljYXRpb24gaW5mbyAqLworICAgIElUVF9NQUpPUiwgSVRUX01JTk9SLCBBUElfVkVSU0lPTl9CVUlMRCwgICAgICAgLyogdmVyc2lvbiBpbmZvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhcGlfaW5pdGlhbGl6ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG11dGV4X2luaXRpYWxpemVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhdG9taWNfY291bnRlciAqLworICAgIE1VVEVYX0lOSVRJQUxJWkVSLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbXV0ZXggKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGR5bmFtaWMgbGlicmFyeSBoYW5kbGUgKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVycm9yX2hhbmRsZXIgKi8KKyAgICAoY29uc3QgY2hhcioqKSZkbGxfcGF0aCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGRsbF9wYXRoX3B0ciAqLworICAgIChfX2l0dF9hcGlfaW5mbyopJmFwaV9saXN0LCAgICAgICAgICAgICAgICAgICAgLyogYXBpX2xpc3RfcHRyICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuZXh0IF9faXR0X2dsb2JhbCAqLworICAgIChfX2l0dF90aHJlYWRfaW5mbyopJmluaXRfdGhyZWFkX2luZm8sICAgICAgICAgLyogdGhyZWFkX2xpc3QgKi8KKyAgICAoX19pdHRfZG9tYWluKikmbnVsbF9kb21haW4sICAgICAgICAgICAgICAgICAgIC8qIGRvbWFpbl9saXN0ICovCisgICAgKF9faXR0X3N0cmluZ19oYW5kbGUqKSZudWxsX3N0cmluZ19oYW5kbGUsICAgICAvKiBzdHJpbmdfbGlzdCAqLworICAgIF9faXR0X2NvbGxlY3Rpb25fbm9ybWFsICAgICAgICAgICAgICAgICAgICAgICAgLyogY29sbGVjdGlvbiBzdGF0ZSAqLworfTsKKwordHlwZWRlZiB2b2lkIChfX2l0dF9hcGlfaW5pdF90KShfX2l0dF9nbG9iYWwqLCBfX2l0dF9ncm91cF9pZCk7Cit0eXBlZGVmIHZvaWQgKF9faXR0X2FwaV9maW5pX3QpKF9faXR0X2dsb2JhbCopOworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKyNpZmRlZiBJVFRfTk9USUZZX0VYVF9SRVBPUlQKK0lUVF9FWFRFUk5fQyB2b2lkIF9OXyhlcnJvcl9oYW5kbGVyKShfX2l0dF9lcnJvcl9jb2RlLCB2YV9saXN0IGFyZ3MpOworI2VuZGlmIC8qIElUVF9OT1RJRllfRVhUX1JFUE9SVCAqLworCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjcHJhZ21hIHdhcm5pbmcocHVzaCkKKyNwcmFnbWEgd2FybmluZyhkaXNhYmxlOiA0MDU1KSAvKiB3YXJuaW5nIEM0MDU1OiAndHlwZSBjYXN0JyA6IGZyb20gZGF0YSBwb2ludGVyICd2b2lkIConIHRvIGZ1bmN0aW9uIHBvaW50ZXIgJ1hYWCcgKi8KKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworc3RhdGljIHZvaWQgX19pdHRfcmVwb3J0X2Vycm9yKF9faXR0X2Vycm9yX2NvZGUgY29kZSwgLi4uKQoreworICAgIHZhX2xpc3QgYXJnczsKKyAgICB2YV9zdGFydChhcmdzLCBjb2RlKTsKKyAgICBpZiAoX05fKF9pdHRhcGlfZ2xvYmFsKS5lcnJvcl9oYW5kbGVyICE9IE5VTEwpCisgICAgeworICAgICAgICBfX2l0dF9lcnJvcl9oYW5kbGVyX3QqIGhhbmRsZXIgPSAoX19pdHRfZXJyb3JfaGFuZGxlcl90Kikoc2l6ZV90KV9OXyhfaXR0YXBpX2dsb2JhbCkuZXJyb3JfaGFuZGxlcjsKKyAgICAgICAgaGFuZGxlcihjb2RlLCBhcmdzKTsKKyAgICB9CisjaWZkZWYgSVRUX05PVElGWV9FWFRfUkVQT1JUCisgICAgX05fKGVycm9yX2hhbmRsZXIpKGNvZGUsIGFyZ3MpOworI2VuZGlmIC8qIElUVF9OT1RJRllfRVhUX1JFUE9SVCAqLworICAgIHZhX2VuZChhcmdzKTsKK30KKworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI3ByYWdtYSB3YXJuaW5nKHBvcCkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorc3RhdGljIF9faXR0X2RvbWFpbiogSVRUQVBJIElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhkb21haW5fY3JlYXRlVyksX2luaXQpKShjb25zdCB3Y2hhcl90KiBuYW1lKQoreworICAgIF9faXR0X2RvbWFpbiAqaF90YWlsLCAqaDsKKworICAgIGlmICghX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfaW5pdGlhbGl6ZWQgJiYgX05fKF9pdHRhcGlfZ2xvYmFsKS50aHJlYWRfbGlzdC0+dGlkID09IDApCisgICAgeworICAgICAgICBfX2l0dF9pbml0X2l0dGxpYl9uYW1lKE5VTEwsIF9faXR0X2dyb3VwX2FsbCk7CisgICAgICAgIGlmIChJVFROT1RJRllfTkFNRShkb21haW5fY3JlYXRlVykgJiYgSVRUTk9USUZZX05BTUUoZG9tYWluX2NyZWF0ZVcpICE9IElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhkb21haW5fY3JlYXRlVyksX2luaXQpKSkKKyAgICAgICAgICAgIHJldHVybiBJVFROT1RJRllfTkFNRShkb21haW5fY3JlYXRlVykobmFtZSk7CisgICAgfQorCisgICAgaWYgKG5hbWUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIF9OXyhfaXR0YXBpX2dsb2JhbCkuZG9tYWluX2xpc3Q7CisKKyAgICBJVFRfTVVURVhfSU5JVF9BTkRfTE9DSyhfTl8oX2l0dGFwaV9nbG9iYWwpKTsKKyAgICBmb3IgKGhfdGFpbCA9IE5VTEwsIGggPSBfTl8oX2l0dGFwaV9nbG9iYWwpLmRvbWFpbl9saXN0OyBoICE9IE5VTEw7IGhfdGFpbCA9IGgsIGggPSBoLT5uZXh0KQorICAgICAgICBpZiAoaC0+bmFtZVcgIT0gTlVMTCAmJiAhd2NzY21wKGgtPm5hbWVXLCBuYW1lKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgIGlmIChoID09IE5VTEwpIHsKKyAgICAgICAgTkVXX0RPTUFJTl9XKCZfTl8oX2l0dGFwaV9nbG9iYWwpLGgsaF90YWlsLG5hbWUpOworICAgIH0KKyAgICBfX2l0dF9tdXRleF91bmxvY2soJl9OXyhfaXR0YXBpX2dsb2JhbCkubXV0ZXgpOworICAgIHJldHVybiBoOworfQorCitzdGF0aWMgX19pdHRfZG9tYWluKiBJVFRBUEkgSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKGRvbWFpbl9jcmVhdGVBKSxfaW5pdCkpKGNvbnN0IGNoYXIqIG5hbWUpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNIT1JVFRfUExBVEZPUk1fV0lOICovCitzdGF0aWMgX19pdHRfZG9tYWluKiBJVFRBUEkgSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKGRvbWFpbl9jcmVhdGUpLF9pbml0KSkoY29uc3QgY2hhciogbmFtZSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK3sKKyAgICBfX2l0dF9kb21haW4gKmhfdGFpbCwgKmg7CisKKyAgICBpZiAoIV9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2luaXRpYWxpemVkICYmIF9OXyhfaXR0YXBpX2dsb2JhbCkudGhyZWFkX2xpc3QtPnRpZCA9PSAwKQorICAgIHsKKyAgICAgICAgX19pdHRfaW5pdF9pdHRsaWJfbmFtZShOVUxMLCBfX2l0dF9ncm91cF9hbGwpOworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorICAgICAgICBpZiAoSVRUTk9USUZZX05BTUUoZG9tYWluX2NyZWF0ZUEpICYmIElUVE5PVElGWV9OQU1FKGRvbWFpbl9jcmVhdGVBKSAhPSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8oZG9tYWluX2NyZWF0ZUEpLF9pbml0KSkpCisgICAgICAgICAgICByZXR1cm4gSVRUTk9USUZZX05BTUUoZG9tYWluX2NyZWF0ZUEpKG5hbWUpOworI2Vsc2UKKyAgICAgICAgaWYgKElUVE5PVElGWV9OQU1FKGRvbWFpbl9jcmVhdGUpICYmIElUVE5PVElGWV9OQU1FKGRvbWFpbl9jcmVhdGUpICE9IElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhkb21haW5fY3JlYXRlKSxfaW5pdCkpKQorICAgICAgICAgICAgcmV0dXJuIElUVE5PVElGWV9OQU1FKGRvbWFpbl9jcmVhdGUpKG5hbWUpOworI2VuZGlmCisgICAgfQorCisgICAgaWYgKG5hbWUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIF9OXyhfaXR0YXBpX2dsb2JhbCkuZG9tYWluX2xpc3Q7CisKKyAgICBJVFRfTVVURVhfSU5JVF9BTkRfTE9DSyhfTl8oX2l0dGFwaV9nbG9iYWwpKTsKKyAgICBmb3IgKGhfdGFpbCA9IE5VTEwsIGggPSBfTl8oX2l0dGFwaV9nbG9iYWwpLmRvbWFpbl9saXN0OyBoICE9IE5VTEw7IGhfdGFpbCA9IGgsIGggPSBoLT5uZXh0KQorICAgICAgICBpZiAoaC0+bmFtZUEgIT0gTlVMTCAmJiAhX19pdHRfZnN0cmNtcChoLT5uYW1lQSwgbmFtZSkpCisgICAgICAgICAgICBicmVhazsKKyAgICBpZiAoaCA9PSBOVUxMKSB7CisgICAgICAgIE5FV19ET01BSU5fQSgmX05fKF9pdHRhcGlfZ2xvYmFsKSxoLGhfdGFpbCxuYW1lKTsKKyAgICB9CisgICAgX19pdHRfbXV0ZXhfdW5sb2NrKCZfTl8oX2l0dGFwaV9nbG9iYWwpLm11dGV4KTsKKyAgICByZXR1cm4gaDsKK30KKworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorc3RhdGljIF9faXR0X3N0cmluZ19oYW5kbGUqIElUVEFQSSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8oc3RyaW5nX2hhbmRsZV9jcmVhdGVXKSxfaW5pdCkpKGNvbnN0IHdjaGFyX3QqIG5hbWUpCit7CisgICAgX19pdHRfc3RyaW5nX2hhbmRsZSAqaF90YWlsLCAqaDsKKworICAgIGlmICghX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfaW5pdGlhbGl6ZWQgJiYgX05fKF9pdHRhcGlfZ2xvYmFsKS50aHJlYWRfbGlzdC0+dGlkID09IDApCisgICAgeworICAgICAgICBfX2l0dF9pbml0X2l0dGxpYl9uYW1lKE5VTEwsIF9faXR0X2dyb3VwX2FsbCk7CisgICAgICAgIGlmIChJVFROT1RJRllfTkFNRShzdHJpbmdfaGFuZGxlX2NyZWF0ZVcpICYmIElUVE5PVElGWV9OQU1FKHN0cmluZ19oYW5kbGVfY3JlYXRlVykgIT0gSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKHN0cmluZ19oYW5kbGVfY3JlYXRlVyksX2luaXQpKSkKKyAgICAgICAgICAgIHJldHVybiBJVFROT1RJRllfTkFNRShzdHJpbmdfaGFuZGxlX2NyZWF0ZVcpKG5hbWUpOworICAgIH0KKworICAgIGlmIChuYW1lID09IE5VTEwpCisgICAgICAgIHJldHVybiBfTl8oX2l0dGFwaV9nbG9iYWwpLnN0cmluZ19saXN0OworCisgICAgSVRUX01VVEVYX0lOSVRfQU5EX0xPQ0soX05fKF9pdHRhcGlfZ2xvYmFsKSk7CisgICAgZm9yIChoX3RhaWwgPSBOVUxMLCBoID0gX05fKF9pdHRhcGlfZ2xvYmFsKS5zdHJpbmdfbGlzdDsgaCAhPSBOVUxMOyBoX3RhaWwgPSBoLCBoID0gaC0+bmV4dCkKKyAgICAgICAgaWYgKGgtPnN0clcgIT0gTlVMTCAmJiAhd2NzY21wKGgtPnN0clcsIG5hbWUpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgaWYgKGggPT0gTlVMTCkgeworICAgICAgICBORVdfU1RSSU5HX0hBTkRMRV9XKCZfTl8oX2l0dGFwaV9nbG9iYWwpLGgsaF90YWlsLG5hbWUpOworICAgIH0KKyAgICBfX2l0dF9tdXRleF91bmxvY2soJl9OXyhfaXR0YXBpX2dsb2JhbCkubXV0ZXgpOworICAgIHJldHVybiBoOworfQorCitzdGF0aWMgX19pdHRfc3RyaW5nX2hhbmRsZSogSVRUQVBJIElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhzdHJpbmdfaGFuZGxlX2NyZWF0ZUEpLF9pbml0KSkoY29uc3QgY2hhciogbmFtZSkKKyNlbHNlICAvKiBJVFRfUExBVEZPUk0hPUlUVF9QTEFURk9STV9XSU4gKi8KK3N0YXRpYyBfX2l0dF9zdHJpbmdfaGFuZGxlKiBJVFRBUEkgSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKHN0cmluZ19oYW5kbGVfY3JlYXRlKSxfaW5pdCkpKGNvbnN0IGNoYXIqIG5hbWUpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCit7CisgICAgX19pdHRfc3RyaW5nX2hhbmRsZSAqaF90YWlsLCAqaDsKKworICAgIGlmICghX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfaW5pdGlhbGl6ZWQgJiYgX05fKF9pdHRhcGlfZ2xvYmFsKS50aHJlYWRfbGlzdC0+dGlkID09IDApCisgICAgeworICAgICAgICBfX2l0dF9pbml0X2l0dGxpYl9uYW1lKE5VTEwsIF9faXR0X2dyb3VwX2FsbCk7CisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisgICAgICAgIGlmIChJVFROT1RJRllfTkFNRShzdHJpbmdfaGFuZGxlX2NyZWF0ZUEpICYmIElUVE5PVElGWV9OQU1FKHN0cmluZ19oYW5kbGVfY3JlYXRlQSkgIT0gSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKHN0cmluZ19oYW5kbGVfY3JlYXRlQSksX2luaXQpKSkKKyAgICAgICAgICAgIHJldHVybiBJVFROT1RJRllfTkFNRShzdHJpbmdfaGFuZGxlX2NyZWF0ZUEpKG5hbWUpOworI2Vsc2UKKyAgICAgICAgaWYgKElUVE5PVElGWV9OQU1FKHN0cmluZ19oYW5kbGVfY3JlYXRlKSAmJiBJVFROT1RJRllfTkFNRShzdHJpbmdfaGFuZGxlX2NyZWF0ZSkgIT0gSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKHN0cmluZ19oYW5kbGVfY3JlYXRlKSxfaW5pdCkpKQorICAgICAgICAgICAgcmV0dXJuIElUVE5PVElGWV9OQU1FKHN0cmluZ19oYW5kbGVfY3JlYXRlKShuYW1lKTsKKyNlbmRpZgorICAgIH0KKworICAgIGlmIChuYW1lID09IE5VTEwpCisgICAgICAgIHJldHVybiBfTl8oX2l0dGFwaV9nbG9iYWwpLnN0cmluZ19saXN0OworCisgICAgSVRUX01VVEVYX0lOSVRfQU5EX0xPQ0soX05fKF9pdHRhcGlfZ2xvYmFsKSk7CisgICAgZm9yIChoX3RhaWwgPSBOVUxMLCBoID0gX05fKF9pdHRhcGlfZ2xvYmFsKS5zdHJpbmdfbGlzdDsgaCAhPSBOVUxMOyBoX3RhaWwgPSBoLCBoID0gaC0+bmV4dCkKKyAgICAgICAgaWYgKGgtPnN0ckEgIT0gTlVMTCAmJiAhX19pdHRfZnN0cmNtcChoLT5zdHJBLCBuYW1lKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgIGlmIChoID09IE5VTEwpIHsKKyAgICAgICAgTkVXX1NUUklOR19IQU5ETEVfQSgmX05fKF9pdHRhcGlfZ2xvYmFsKSxoLGhfdGFpbCxuYW1lKTsKKyAgICB9CisgICAgX19pdHRfbXV0ZXhfdW5sb2NrKCZfTl8oX2l0dGFwaV9nbG9iYWwpLm11dGV4KTsKKyAgICByZXR1cm4gaDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQgSVRUQVBJIElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhwYXVzZSksX2luaXQpKSh2b2lkKQoreworICAgIGlmICghX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfaW5pdGlhbGl6ZWQgJiYgX05fKF9pdHRhcGlfZ2xvYmFsKS50aHJlYWRfbGlzdC0+dGlkID09IDApCisgICAgeworICAgICAgICBfX2l0dF9pbml0X2l0dGxpYl9uYW1lKE5VTEwsIF9faXR0X2dyb3VwX2FsbCk7CisgICAgICAgIGlmIChJVFROT1RJRllfTkFNRShwYXVzZSkgJiYgSVRUTk9USUZZX05BTUUocGF1c2UpICE9IElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhwYXVzZSksX2luaXQpKSkKKyAgICAgICAgeworICAgICAgICAgICAgSVRUTk9USUZZX05BTUUocGF1c2UpKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgX05fKF9pdHRhcGlfZ2xvYmFsKS5zdGF0ZSA9IF9faXR0X2NvbGxlY3Rpb25fcGF1c2VkOworfQorCitzdGF0aWMgdm9pZCBJVFRBUEkgSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKHJlc3VtZSksX2luaXQpKSh2b2lkKQoreworICAgIGlmICghX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfaW5pdGlhbGl6ZWQgJiYgX05fKF9pdHRhcGlfZ2xvYmFsKS50aHJlYWRfbGlzdC0+dGlkID09IDApCisgICAgeworICAgICAgICBfX2l0dF9pbml0X2l0dGxpYl9uYW1lKE5VTEwsIF9faXR0X2dyb3VwX2FsbCk7CisgICAgICAgIGlmIChJVFROT1RJRllfTkFNRShyZXN1bWUpICYmIElUVE5PVElGWV9OQU1FKHJlc3VtZSkgIT0gSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKHJlc3VtZSksX2luaXQpKSkKKyAgICAgICAgeworICAgICAgICAgICAgSVRUTk9USUZZX05BTUUocmVzdW1lKSgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIF9OXyhfaXR0YXBpX2dsb2JhbCkuc3RhdGUgPSBfX2l0dF9jb2xsZWN0aW9uX25vcm1hbDsKK30KKworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorc3RhdGljIHZvaWQgSVRUQVBJIElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyh0aHJlYWRfc2V0X25hbWVXKSxfaW5pdCkpKGNvbnN0IHdjaGFyX3QqIG5hbWUpCit7CisgICAgVElEVCB0aWQgPSBfX2l0dF90aHJlYWRfaWQoKTsKKyAgICBfX2l0dF90aHJlYWRfaW5mbyAqaF90YWlsLCAqaDsKKworICAgIGlmICghX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfaW5pdGlhbGl6ZWQgJiYgX05fKF9pdHRhcGlfZ2xvYmFsKS50aHJlYWRfbGlzdC0+dGlkID09IDApCisgICAgeworICAgICAgICBfX2l0dF9pbml0X2l0dGxpYl9uYW1lKE5VTEwsIF9faXR0X2dyb3VwX2FsbCk7CisgICAgICAgIGlmIChJVFROT1RJRllfTkFNRSh0aHJlYWRfc2V0X25hbWVXKSAmJiBJVFROT1RJRllfTkFNRSh0aHJlYWRfc2V0X25hbWVXKSAhPSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8odGhyZWFkX3NldF9uYW1lVyksX2luaXQpKSkKKyAgICAgICAgeworICAgICAgICAgICAgSVRUTk9USUZZX05BTUUodGhyZWFkX3NldF9uYW1lVykobmFtZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBfX2l0dF9tdXRleF9sb2NrKCZfTl8oX2l0dGFwaV9nbG9iYWwpLm11dGV4KTsKKyAgICBmb3IgKGhfdGFpbCA9IE5VTEwsIGggPSBfTl8oX2l0dGFwaV9nbG9iYWwpLnRocmVhZF9saXN0OyBoICE9IE5VTEw7IGhfdGFpbCA9IGgsIGggPSBoLT5uZXh0KQorICAgICAgICBpZiAoaC0+dGlkID09IHRpZCkKKyAgICAgICAgICAgIGJyZWFrOworICAgIGlmIChoID09IE5VTEwpIHsKKyAgICAgICAgTkVXX1RIUkVBRF9JTkZPX1coJl9OXyhfaXR0YXBpX2dsb2JhbCksIGgsIGhfdGFpbCwgdGlkLCBfX2l0dF90aHJlYWRfbm9ybWFsLCBuYW1lKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaC0+bmFtZVcgPSBuYW1lID8gX3djc2R1cChuYW1lKSA6IE5VTEw7CisgICAgfQorICAgIF9faXR0X211dGV4X3VubG9jaygmX05fKF9pdHRhcGlfZ2xvYmFsKS5tdXRleCk7Cit9CisKK3N0YXRpYyBpbnQgSVRUQVBJIElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyh0aHJfbmFtZV9zZXRXKSxfaW5pdCkpKGNvbnN0IHdjaGFyX3QqIG5hbWUsIGludCBuYW1lbGVuKQoreworICAgIG5hbWVsZW4gPSBuYW1lbGVuOworICAgIElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyh0aHJlYWRfc2V0X25hbWVXKSxfaW5pdCkpKG5hbWUpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBJVFRBUEkgSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKHRocmVhZF9zZXRfbmFtZUEpLF9pbml0KSkoY29uc3QgY2hhciogbmFtZSkKKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK3N0YXRpYyB2b2lkIElUVEFQSSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8odGhyZWFkX3NldF9uYW1lKSxfaW5pdCkpKGNvbnN0IGNoYXIqIG5hbWUpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCit7CisgICAgVElEVCB0aWQgPSBfX2l0dF90aHJlYWRfaWQoKTsKKyAgICBfX2l0dF90aHJlYWRfaW5mbyAqaF90YWlsLCAqaDsKKworICAgIGlmICghX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfaW5pdGlhbGl6ZWQgJiYgX05fKF9pdHRhcGlfZ2xvYmFsKS50aHJlYWRfbGlzdC0+dGlkID09IDApCisgICAgeworICAgICAgICBfX2l0dF9pbml0X2l0dGxpYl9uYW1lKE5VTEwsIF9faXR0X2dyb3VwX2FsbCk7CisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisgICAgICAgIGlmIChJVFROT1RJRllfTkFNRSh0aHJlYWRfc2V0X25hbWVBKSAmJiBJVFROT1RJRllfTkFNRSh0aHJlYWRfc2V0X25hbWVBKSAhPSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8odGhyZWFkX3NldF9uYW1lQSksX2luaXQpKSkKKyAgICAgICAgeworICAgICAgICAgICAgSVRUTk9USUZZX05BTUUodGhyZWFkX3NldF9uYW1lQSkobmFtZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyAgICAgICAgaWYgKElUVE5PVElGWV9OQU1FKHRocmVhZF9zZXRfbmFtZSkgJiYgSVRUTk9USUZZX05BTUUodGhyZWFkX3NldF9uYW1lKSAhPSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8odGhyZWFkX3NldF9uYW1lKSxfaW5pdCkpKQorICAgICAgICB7CisgICAgICAgICAgICBJVFROT1RJRllfTkFNRSh0aHJlYWRfc2V0X25hbWUpKG5hbWUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisgICAgfQorCisgICAgX19pdHRfbXV0ZXhfbG9jaygmX05fKF9pdHRhcGlfZ2xvYmFsKS5tdXRleCk7CisgICAgZm9yIChoX3RhaWwgPSBOVUxMLCBoID0gX05fKF9pdHRhcGlfZ2xvYmFsKS50aHJlYWRfbGlzdDsgaCAhPSBOVUxMOyBoX3RhaWwgPSBoLCBoID0gaC0+bmV4dCkKKyAgICAgICAgaWYgKGgtPnRpZCA9PSB0aWQpCisgICAgICAgICAgICBicmVhazsKKyAgICBpZiAoaCA9PSBOVUxMKSB7CisgICAgICAgIE5FV19USFJFQURfSU5GT19BKCZfTl8oX2l0dGFwaV9nbG9iYWwpLCBoLCBoX3RhaWwsIHRpZCwgX19pdHRfdGhyZWFkX25vcm1hbCwgbmFtZSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGgtPm5hbWVBID0gbmFtZSA/IF9faXR0X2ZzdHJkdXAobmFtZSkgOiBOVUxMOworICAgIH0KKyAgICBfX2l0dF9tdXRleF91bmxvY2soJl9OXyhfaXR0YXBpX2dsb2JhbCkubXV0ZXgpOworfQorCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitzdGF0aWMgaW50IElUVEFQSSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8odGhyX25hbWVfc2V0QSksX2luaXQpKShjb25zdCBjaGFyKiBuYW1lLCBpbnQgbmFtZWxlbikKK3sKKyAgICBuYW1lbGVuID0gbmFtZWxlbjsKKyAgICBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8odGhyZWFkX3NldF9uYW1lQSksX2luaXQpKShuYW1lKTsKKyAgICByZXR1cm4gMDsKK30KKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK3N0YXRpYyBpbnQgSVRUQVBJIElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyh0aHJfbmFtZV9zZXQpLF9pbml0KSkoY29uc3QgY2hhciogbmFtZSwgaW50IG5hbWVsZW4pCit7CisgICAgbmFtZWxlbiA9IG5hbWVsZW47CisgICAgSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKHRocmVhZF9zZXRfbmFtZSksX2luaXQpKShuYW1lKTsKKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworc3RhdGljIHZvaWQgSVRUQVBJIElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyh0aHJlYWRfaWdub3JlKSxfaW5pdCkpKHZvaWQpCit7CisgICAgVElEVCB0aWQgPSBfX2l0dF90aHJlYWRfaWQoKTsKKyAgICBfX2l0dF90aHJlYWRfaW5mbyAqaF90YWlsLCAqaDsKKworICAgIGlmICghX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfaW5pdGlhbGl6ZWQgJiYgX05fKF9pdHRhcGlfZ2xvYmFsKS50aHJlYWRfbGlzdC0+dGlkID09IDApCisgICAgeworICAgICAgICBfX2l0dF9pbml0X2l0dGxpYl9uYW1lKE5VTEwsIF9faXR0X2dyb3VwX2FsbCk7CisgICAgICAgIGlmIChJVFROT1RJRllfTkFNRSh0aHJlYWRfaWdub3JlKSAmJiBJVFROT1RJRllfTkFNRSh0aHJlYWRfaWdub3JlKSAhPSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8odGhyZWFkX2lnbm9yZSksX2luaXQpKSkKKyAgICAgICAgeworICAgICAgICAgICAgSVRUTk9USUZZX05BTUUodGhyZWFkX2lnbm9yZSkoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIF9faXR0X211dGV4X2xvY2soJl9OXyhfaXR0YXBpX2dsb2JhbCkubXV0ZXgpOworICAgIGZvciAoaF90YWlsID0gTlVMTCwgaCA9IF9OXyhfaXR0YXBpX2dsb2JhbCkudGhyZWFkX2xpc3Q7IGggIT0gTlVMTDsgaF90YWlsID0gaCwgaCA9IGgtPm5leHQpCisgICAgICAgIGlmIChoLT50aWQgPT0gdGlkKQorICAgICAgICAgICAgYnJlYWs7CisgICAgaWYgKGggPT0gTlVMTCkgeworICAgICAgICBzdGF0aWMgY29uc3QgY2hhciogbmFtZSA9ICJ1bmtub3duIjsKKyAgICAgICAgTkVXX1RIUkVBRF9JTkZPX0EoJl9OXyhfaXR0YXBpX2dsb2JhbCksIGgsIGhfdGFpbCwgdGlkLCBfX2l0dF90aHJlYWRfaWdub3JlZCwgbmFtZSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGgtPnN0YXRlID0gX19pdHRfdGhyZWFkX2lnbm9yZWQ7CisgICAgfQorICAgIF9faXR0X211dGV4X3VubG9jaygmX05fKF9pdHRhcGlfZ2xvYmFsKS5tdXRleCk7Cit9CisKK3N0YXRpYyB2b2lkIElUVEFQSSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8odGhyX2lnbm9yZSksX2luaXQpKSh2b2lkKQoreworICAgIElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyh0aHJlYWRfaWdub3JlKSxfaW5pdCkpKCk7Cit9CisKK3N0YXRpYyB2b2lkIElUVEFQSSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8oZW5hYmxlX2F0dGFjaCksX2luaXQpKSh2b2lkKQoreworI2lmZGVmIF9fQU5EUk9JRF9fCisgICAgLyoKKyAgICAgKiBpZiBMSUJfVkFSX05BTUUgZW52IHZhcmlhYmxlIHdlcmUgc2V0IGJlZm9yZSB0aGVuIHN0YXkgcHJldmlvdXMgdmFsdWUKKyAgICAgKiBlbHNlIHNldCBkZWZhdWx0IHBhdGgKKyAgICAqLworICAgIHNldGVudihJVFRfVE9fU1RSKExJQl9WQVJfTkFNRSksIEFORFJPSURfSVRUTk9USUZZX0RFRkFVTFRfUEFUSCwgMCk7CisjZW5kaWYKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGNvbnN0IGNoYXIqIF9faXR0X2ZzcGxpdChjb25zdCBjaGFyKiBzLCBjb25zdCBjaGFyKiBzZXAsIGNvbnN0IGNoYXIqKiBvdXQsIGludCogbGVuKQoreworICAgIGludCBpOworICAgIGludCBqOworCisgICAgaWYgKCFzIHx8ICFzZXAgfHwgIW91dCB8fCAhbGVuKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGZvciAoaSA9IDA7IHNbaV07IGkrKykKKyAgICB7CisgICAgICAgIGludCBiID0gMDsKKyAgICAgICAgZm9yIChqID0gMDsgc2VwW2pdOyBqKyspCisgICAgICAgICAgICBpZiAoc1tpXSA9PSBzZXBbal0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYiA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIGlmICghYikKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghc1tpXSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICAqbGVuID0gMDsKKyAgICAqb3V0ID0gJnNbaV07CisKKyAgICBmb3IgKDsgc1tpXTsgaSsrLCAoKmxlbikrKykKKyAgICB7CisgICAgICAgIGludCBiID0gMDsKKyAgICAgICAgZm9yIChqID0gMDsgc2VwW2pdOyBqKyspCisgICAgICAgICAgICBpZiAoc1tpXSA9PSBzZXBbal0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYiA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIGlmIChiKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgZm9yICg7IHNbaV07IGkrKykKKyAgICB7CisgICAgICAgIGludCBiID0gMDsKKyAgICAgICAgZm9yIChqID0gMDsgc2VwW2pdOyBqKyspCisgICAgICAgICAgICBpZiAoc1tpXSA9PSBzZXBbal0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYiA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIGlmICghYikKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiAmc1tpXTsKK30KKworLyogVGhpcyBmdW5jdGlvbiByZXR1cm4gdmFsdWUgb2YgZW52IHZhcmlhYmxlIHRoYXQgcGxhY2VkIGludG8gc3RhdGljIGJ1ZmZlci4KKyAqICEhISBUaGUgc2FtZSBzdGF0aWMgYnVmZmVyIGlzIHVzZWQgZm9yIHN1YnNlcXVlbnQgY2FsbHMuICEhIQorICogVGhpcyB3YXMgZG9uZSB0byBhdmlvZCBkeW5hbWljIGFsbG9jYXRpb24gZm9yIGZldyBjYWxscy4KKyAqIEFjdHVhbGx5IHdlIG5lZWQgdGhpcyBmdW5jdGlvbiBvbmx5IGZvdXIgdGltZXMuCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyKiBfX2l0dF9nZXRfZW52X3Zhcihjb25zdCBjaGFyKiBuYW1lKQoreworI2RlZmluZSBNQVhfRU5WX1ZBTFVFX1NJWkUgNDA4NgorICAgIHN0YXRpYyBjaGFyICBlbnZfYnVmZltNQVhfRU5WX1ZBTFVFX1NJWkVdOworICAgIHN0YXRpYyBjaGFyKiBlbnZfdmFsdWUgPSAoY2hhciopZW52X2J1ZmY7CisKKyAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgIHsKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyAgICAgICAgc2l6ZV90IG1heF9sZW4gPSBNQVhfRU5WX1ZBTFVFX1NJWkUgLSAoc2l6ZV90KShlbnZfdmFsdWUgLSBlbnZfYnVmZik7CisgICAgICAgIERXT1JEIHJjID0gR2V0RW52aXJvbm1lbnRWYXJpYWJsZUEobmFtZSwgZW52X3ZhbHVlLCAoRFdPUkQpbWF4X2xlbik7CisgICAgICAgIGlmIChyYyA+PSBtYXhfbGVuKQorICAgICAgICAgICAgX19pdHRfcmVwb3J0X2Vycm9yKF9faXR0X2Vycm9yX2Vudl90b29fbG9uZywgbmFtZSwgKHNpemVfdClyYyAtIDEsIChzaXplX3QpKG1heF9sZW4gLSAxKSk7CisgICAgICAgIGVsc2UgaWYgKHJjID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgY2hhciogcmV0ID0gKGNvbnN0IGNoYXIqKWVudl92YWx1ZTsKKyAgICAgICAgICAgIGVudl92YWx1ZSArPSByYyArIDE7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyogSWYgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgZW1wdHksIEdldEVudmlyb3JubWVudFZhcmlhYmxlcygpCisgICAgICAgICAgICAgKiByZXR1cm5zIHplcm8gKG51bWJlciBvZiBjaGFyYWN0ZXJzIChub3QgaW5jbHVkaW5nIHRlcm1pbmF0aW5nIG51bGwpLAorICAgICAgICAgICAgICogYW5kIEdldExhc3RFcnJvcigpIHJldHVybnMgRVJST1JfU1VDQ0VTUy4gKi8KKyAgICAgICAgICAgIERXT1JEIGVyciA9IEdldExhc3RFcnJvcigpOworICAgICAgICAgICAgaWYgKGVyciA9PSBFUlJPUl9TVUNDRVNTKQorICAgICAgICAgICAgICAgIHJldHVybiBlbnZfdmFsdWU7CisKKyAgICAgICAgICAgIGlmIChlcnIgIT0gRVJST1JfRU5WVkFSX05PVF9GT1VORCkKKyAgICAgICAgICAgICAgICBfX2l0dF9yZXBvcnRfZXJyb3IoX19pdHRfZXJyb3JfY2FudF9yZWFkX2VudiwgbmFtZSwgKGludCllcnIpOworICAgICAgICB9CisjZWxzZSAgLyogSVRUX1BMQVRGT1JNIT1JVFRfUExBVEZPUk1fV0lOICovCisgICAgICAgIGNoYXIqIGVudiA9IGdldGVudihuYW1lKTsKKyAgICAgICAgaWYgKGVudiAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBzaXplX3QgbGVuID0gc3RybGVuKGVudik7CisgICAgICAgICAgICBzaXplX3QgbWF4X2xlbiA9IE1BWF9FTlZfVkFMVUVfU0laRSAtIChzaXplX3QpKGVudl92YWx1ZSAtIGVudl9idWZmKTsKKyAgICAgICAgICAgIGlmIChsZW4gPCBtYXhfbGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHJldCA9IChjb25zdCBjaGFyKillbnZfdmFsdWU7CisgICAgICAgICAgICAgICAgc3RybmNweShlbnZfdmFsdWUsIGVudiwgbGVuICsgMSk7CisgICAgICAgICAgICAgICAgZW52X3ZhbHVlICs9IGxlbiArIDE7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIF9faXR0X3JlcG9ydF9lcnJvcihfX2l0dF9lcnJvcl9lbnZfdG9vX2xvbmcsIG5hbWUsIChzaXplX3QpbGVuLCAoc2l6ZV90KShtYXhfbGVuIC0gMSkpOworICAgICAgICB9CisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgY29uc3QgY2hhciogX19pdHRfZ2V0X2xpYl9uYW1lKHZvaWQpCit7CisgICAgY29uc3QgY2hhciogbGliX25hbWUgPSBfX2l0dF9nZXRfZW52X3ZhcihJVFRfVE9fU1RSKExJQl9WQVJfTkFNRSkpOworCisjaWZkZWYgX19BTkRST0lEX18KKyAgICBpZiAobGliX25hbWUgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIGNvbnN0IGNoYXIqIGNvbnN0IHN5c3RlbV93aWRlX21hcmtlcl9maWxlbmFtZSA9ICIvZGF0YS9sb2NhbC90bXAvY29tLmludGVsLml0dC5jb2xsZWN0b3JfbGliIjsKKyAgICAgICAgaW50IGl0dF9tYXJrZXJfZmlsZV9mZCA9IG9wZW4oc3lzdGVtX3dpZGVfbWFya2VyX2ZpbGVuYW1lLCBPX1JET05MWSk7CisgICAgICAgIHNzaXplX3QgcmVzID0gMDsKKworICAgICAgICBpZiAoaXR0X21hcmtlcl9maWxlX2ZkID09IC0xKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBwaWRfdCBteV9waWQgPSBnZXRwaWQoKTsKKyAgICAgICAgICAgIGNoYXIgY21kbGluZV9wYXRoW1BBVEhfTUFYXSA9IHswfTsKKyAgICAgICAgICAgIGNoYXIgcGFja2FnZV9uYW1lW1BBVEhfTUFYXSA9IHswfTsKKyAgICAgICAgICAgIGNoYXIgYXBwX3NhbmRib3hfZmlsZVtQQVRIX01BWF0gPSB7MH07CisgICAgICAgICAgICBpbnQgY21kbGluZV9mZCA9IDA7CisKKyAgICAgICAgICAgIElUVF9BTkRST0lEX0xPR0koIlVuYWJsZSB0byBvcGVuIHN5c3RlbS13aWRlIG1hcmtlciBmaWxlLiIpOworICAgICAgICAgICAgc25wcmludGYoY21kbGluZV9wYXRoLCBQQVRIX01BWCAtIDEsICIvcHJvYy8lZC9jbWRsaW5lIiwgbXlfcGlkKTsKKyAgICAgICAgICAgIElUVF9BTkRST0lEX0xPR0koIkNNRCBmaWxlOiAlc1xuIiwgY21kbGluZV9wYXRoKTsKKyAgICAgICAgICAgIGNtZGxpbmVfZmQgPSBvcGVuKGNtZGxpbmVfcGF0aCwgT19SRE9OTFkpOworICAgICAgICAgICAgaWYgKGNtZGxpbmVfZmQgPT0gLTEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSVRUX0FORFJPSURfTE9HRSgiVW5hYmxlIHRvIG9wZW4gJXMgZmlsZSEiLCBjbWRsaW5lX3BhdGgpOworICAgICAgICAgICAgICAgIHJldHVybiBsaWJfbmFtZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcyA9IHJlYWQoY21kbGluZV9mZCwgcGFja2FnZV9uYW1lLCBQQVRIX01BWCAtIDEpOworICAgICAgICAgICAgaWYgKHJlcyA9PSAtMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJVFRfQU5EUk9JRF9MT0dFKCJVbmFibGUgdG8gcmVhZCAlcyBmaWxlISIsIGNtZGxpbmVfcGF0aCk7CisgICAgICAgICAgICAgICAgcmVzID0gY2xvc2UoY21kbGluZV9mZCk7CisgICAgICAgICAgICAgICAgaWYgKHJlcyA9PSAtMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIElUVF9BTkRST0lEX0xPR0UoIlVuYWJsZSB0byBjbG9zZSAlcyBmaWxlISIsIGNtZGxpbmVfcGF0aCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBsaWJfbmFtZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcyA9IGNsb3NlKGNtZGxpbmVfZmQpOworICAgICAgICAgICAgaWYgKHJlcyA9PSAtMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJVFRfQU5EUk9JRF9MT0dFKCJVbmFibGUgdG8gY2xvc2UgJXMgZmlsZSEiLCBjbWRsaW5lX3BhdGgpOworICAgICAgICAgICAgICAgIHJldHVybiBsaWJfbmFtZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIElUVF9BTkRST0lEX0xPR0koIlBhY2thZ2UgbmFtZTogJXNcbiIsIHBhY2thZ2VfbmFtZSk7CisgICAgICAgICAgICBzbnByaW50ZihhcHBfc2FuZGJveF9maWxlLCBQQVRIX01BWCAtIDEsICIvZGF0YS9kYXRhLyVzL2NvbS5pbnRlbC5pdHQuY29sbGVjdG9yX2xpYiIsIHBhY2thZ2VfbmFtZSk7CisgICAgICAgICAgICBJVFRfQU5EUk9JRF9MT0dJKCJMaWIgbWFya2VyIGZpbGUgbmFtZTogJXNcbiIsIGFwcF9zYW5kYm94X2ZpbGUpOworICAgICAgICAgICAgaXR0X21hcmtlcl9maWxlX2ZkID0gb3BlbihhcHBfc2FuZGJveF9maWxlLCBPX1JET05MWSk7CisgICAgICAgICAgICBpZiAoaXR0X21hcmtlcl9maWxlX2ZkID09IC0xKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIElUVF9BTkRST0lEX0xPR0UoIlVuYWJsZSB0byBvcGVuIGFwcCBtYXJrZXIgZmlsZSEiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbGliX25hbWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB7CisgICAgICAgICAgICBjaGFyIGl0dF9saWJfbmFtZVtQQVRIX01BWF0gPSB7MH07CisKKyAgICAgICAgICAgIHJlcyA9IHJlYWQoaXR0X21hcmtlcl9maWxlX2ZkLCBpdHRfbGliX25hbWUsIFBBVEhfTUFYIC0gMSk7CisgICAgICAgICAgICBpZiAocmVzID09IC0xKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIElUVF9BTkRST0lEX0xPR0UoIlVuYWJsZSB0byByZWFkICVzIGZpbGUhIiwgaXR0X21hcmtlcl9maWxlX2ZkKTsKKyAgICAgICAgICAgICAgICByZXMgPSBjbG9zZShpdHRfbWFya2VyX2ZpbGVfZmQpOworICAgICAgICAgICAgICAgIGlmIChyZXMgPT0gLTEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBJVFRfQU5EUk9JRF9MT0dFKCJVbmFibGUgdG8gY2xvc2UgJXMgZmlsZSEiLCBpdHRfbWFya2VyX2ZpbGVfZmQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbGliX25hbWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBJVFRfQU5EUk9JRF9MT0dJKCJJVFQgTGliIHBhdGg6ICVzIiwgaXR0X2xpYl9uYW1lKTsKKyAgICAgICAgICAgIHJlcyA9IGNsb3NlKGl0dF9tYXJrZXJfZmlsZV9mZCk7CisgICAgICAgICAgICBpZiAocmVzID09IC0xKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIElUVF9BTkRST0lEX0xPR0UoIlVuYWJsZSB0byBjbG9zZSAlcyBmaWxlISIsIGl0dF9tYXJrZXJfZmlsZV9mZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGxpYl9uYW1lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgSVRUX0FORFJPSURfTE9HSSgiU2V0IGVudiIpOworICAgICAgICAgICAgcmVzID0gc2V0ZW52KElUVF9UT19TVFIoTElCX1ZBUl9OQU1FKSwgaXR0X2xpYl9uYW1lLCAwKTsKKyAgICAgICAgICAgIGlmIChyZXMgPT0gLTEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSVRUX0FORFJPSURfTE9HRSgiVW5hYmxlIHRvIHNldCBlbnYgdmFyISIpOworICAgICAgICAgICAgICAgIHJldHVybiBsaWJfbmFtZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxpYl9uYW1lID0gX19pdHRfZ2V0X2Vudl92YXIoSVRUX1RPX1NUUihMSUJfVkFSX05BTUUpKTsKKyAgICAgICAgICAgIElUVF9BTkRST0lEX0xPR0koIklUVCBMaWIgcGF0aCBmcm9tIGVudjogJXMiLCBpdHRfbGliX25hbWUpOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICByZXR1cm4gbGliX25hbWU7Cit9CisKKyNpZm5kZWYgbWluCisjZGVmaW5lIG1pbihhLGIpIChhKSA8IChiKSA/IChhKSA6IChiKQorI2VuZGlmIC8qIG1pbiAqLworCitzdGF0aWMgX19pdHRfZ3JvdXBfaWQgX19pdHRfZ2V0X2dyb3Vwcyh2b2lkKQoreworICAgIHJlZ2lzdGVyIGludCBpOworICAgIF9faXR0X2dyb3VwX2lkIHJlcyA9IF9faXR0X2dyb3VwX25vbmU7CisgICAgY29uc3QgY2hhciogdmFyX25hbWUgID0gIklOVEVMX0lUVE5PVElGWV9HUk9VUFMiOworICAgIGNvbnN0IGNoYXIqIGdyb3VwX3N0ciA9IF9faXR0X2dldF9lbnZfdmFyKHZhcl9uYW1lKTsKKworICAgIGlmIChncm91cF9zdHIgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludCBsZW47CisgICAgICAgIGNoYXIgZ3JbMjU1XTsKKyAgICAgICAgY29uc3QgY2hhciogY2h1bms7CisgICAgICAgIHdoaWxlICgoZ3JvdXBfc3RyID0gX19pdHRfZnNwbGl0KGdyb3VwX3N0ciwgIiw7ICIsICZjaHVuaywgJmxlbikpICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9faXR0X2ZzdHJjcHluKGdyLCBjaHVuaywgc2l6ZW9mKGdyKSAtIDEpOworICAgICAgICAgICAgZ3JbbWluKGxlbiwgKGludCkoc2l6ZW9mKGdyKSAtIDEpKV0gPSAwOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBncm91cF9saXN0W2ldLm5hbWUgIT0gTlVMTDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghX19pdHRfZnN0cmNtcChnciwgZ3JvdXBfbGlzdFtpXS5uYW1lKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJlcyA9IChfX2l0dF9ncm91cF9pZCkocmVzIHwgZ3JvdXBfbGlzdFtpXS5pZCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBUT0RPOiAhISEgV29ya2Fyb3VuZCBmb3IgYnVnIHdpdGggd2FybmluZyBmb3IgdW5rbm93biBncm91cCAhISEKKyAgICAgICAgICogU2hvdWxkIGJlIGZpeGVkIGluIG5ldyBpbml0aWFsaXphdGlvbiBzY2hlbWUuCisgICAgICAgICAqIE5vdyB0aGUgZm9sbG93aW5nIGdyb3VwcyBzaG91bGQgYmUgc2V0IGFsd2F5cy4gKi8KKyAgICAgICAgZm9yIChpID0gMDsgZ3JvdXBfbGlzdFtpXS5pZCAhPSBfX2l0dF9ncm91cF9ub25lOyBpKyspCisgICAgICAgICAgICBpZiAoZ3JvdXBfbGlzdFtpXS5pZCAhPSBfX2l0dF9ncm91cF9hbGwgJiYKKyAgICAgICAgICAgICAgICBncm91cF9saXN0W2ldLmlkID4gX19pdHRfZ3JvdXBfc3BsaXR0ZXJfbWluICYmCisgICAgICAgICAgICAgICAgZ3JvdXBfbGlzdFtpXS5pZCA8IF9faXR0X2dyb3VwX3NwbGl0dGVyX21heCkKKyAgICAgICAgICAgICAgICByZXMgPSAoX19pdHRfZ3JvdXBfaWQpKHJlcyB8IGdyb3VwX2xpc3RbaV0uaWQpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBmb3IgKGkgPSAwOyBncm91cF9hbGlhc1tpXS5lbnZfdmFyICE9IE5VTEw7IGkrKykKKyAgICAgICAgICAgIGlmIChfX2l0dF9nZXRfZW52X3Zhcihncm91cF9hbGlhc1tpXS5lbnZfdmFyKSAhPSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiBncm91cF9hbGlhc1tpXS5ncm91cHM7CisgICAgfQorCisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIGludCBfX2l0dF9saWJfdmVyc2lvbihsaWJfdCBsaWIpCit7CisgICAgaWYgKGxpYiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoX19pdHRfZ2V0X3Byb2MobGliLCAiX19pdHRfYXBpX2luaXQiKSkKKyAgICAgICAgcmV0dXJuIDI7CisgICAgaWYgKF9faXR0X2dldF9wcm9jKGxpYiwgIl9faXR0X2FwaV92ZXJzaW9uIikpCisgICAgICAgIHJldHVybiAxOworICAgIHJldHVybiAwOworfQorCisvKiBJdCdzIG5vdCB1c2VkIHJpZ2h0IG5vdyEgQ29tbWVudCBpdCBvdXQgdG8gYXZvaWQgd2FybmluZ3MuCitzdGF0aWMgdm9pZCBfX2l0dF9yZWluaXRfYWxsX3BvaW50ZXJzKHZvaWQpCit7CisgICAgcmVnaXN0ZXIgaW50IGk7CisgICAgLy8gRmlsbCBhbGwgcG9pbnRlcnMgd2l0aCBpbml0aWFsIHN0dWJzCisgICAgZm9yIChpID0gMDsgX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfbGlzdF9wdHJbaV0ubmFtZSAhPSBOVUxMOyBpKyspCisgICAgICAgICpfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9saXN0X3B0cltpXS5mdW5jX3B0ciA9IF9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2xpc3RfcHRyW2ldLmluaXRfZnVuYzsKK30KKyovCisKK3N0YXRpYyB2b2lkIF9faXR0X251bGxpZnlfYWxsX3BvaW50ZXJzKHZvaWQpCit7CisgICAgcmVnaXN0ZXIgaW50IGk7CisgICAgLyogTnVsaWZ5IGFsbCBwb2ludGVycyBleGNlcHQgZG9tYWluX2NyZWF0ZSBhbmQgc3RyaW5nX2hhbmRsZV9jcmVhdGUgKi8KKyAgICBmb3IgKGkgPSAwOyBfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9saXN0X3B0cltpXS5uYW1lICE9IE5VTEw7IGkrKykKKyAgICAgICAgKl9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2xpc3RfcHRyW2ldLmZ1bmNfcHRyID0gX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfbGlzdF9wdHJbaV0ubnVsbF9mdW5jOworfQorCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjcHJhZ21hIHdhcm5pbmcocHVzaCkKKyNwcmFnbWEgd2FybmluZyhkaXNhYmxlOiA0MDU0KSAvKiB3YXJuaW5nIEM0MDU0OiAndHlwZSBjYXN0JyA6IGZyb20gZnVuY3Rpb24gcG9pbnRlciAnWFhYJyB0byBkYXRhIHBvaW50ZXIgJ3ZvaWQgKicgKi8KKyNwcmFnbWEgd2FybmluZyhkaXNhYmxlOiA0MDU1KSAvKiB3YXJuaW5nIEM0MDU1OiAndHlwZSBjYXN0JyA6IGZyb20gZGF0YSBwb2ludGVyICd2b2lkIConIHRvIGZ1bmN0aW9uIHBvaW50ZXIgJ1hYWCcgKi8KKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworSVRUX0VYVEVSTl9DIHZvaWQgX05fKGZpbmlfaXR0bGliKSh2b2lkKQoreworICAgIF9faXR0X2FwaV9maW5pX3QqIF9faXR0X2FwaV9maW5pX3B0cjsKKyAgICBzdGF0aWMgdm9sYXRpbGUgVElEVCBjdXJyZW50X3RocmVhZCA9IDA7CisKKyAgICBpZiAoX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfaW5pdGlhbGl6ZWQpCisgICAgeworICAgICAgICBfX2l0dF9tdXRleF9sb2NrKCZfTl8oX2l0dGFwaV9nbG9iYWwpLm11dGV4KTsKKyAgICAgICAgaWYgKF9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2luaXRpYWxpemVkKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY3VycmVudF90aHJlYWQgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjdXJyZW50X3RocmVhZCA9IF9faXR0X3RocmVhZF9pZCgpOworICAgICAgICAgICAgICAgIF9faXR0X2FwaV9maW5pX3B0ciA9IChfX2l0dF9hcGlfZmluaV90Kikoc2l6ZV90KV9faXR0X2dldF9wcm9jKF9OXyhfaXR0YXBpX2dsb2JhbCkubGliLCAiX19pdHRfYXBpX2ZpbmkiKTsKKyAgICAgICAgICAgICAgICBpZiAoX19pdHRfYXBpX2ZpbmlfcHRyKQorICAgICAgICAgICAgICAgICAgICBfX2l0dF9hcGlfZmluaV9wdHIoJl9OXyhfaXR0YXBpX2dsb2JhbCkpOworCisgICAgICAgICAgICAgICAgX19pdHRfbnVsbGlmeV9hbGxfcG9pbnRlcnMoKTsKKworIC8qIFRPRE86ICEhISBub3Qgc2FmZSAhISEgZG9uJ3Qgc3VwcG9ydCB1bmxvYWQgc28gZmFyLgorICAqICAgICAgICAgICAgIGlmIChfTl8oX2l0dGFwaV9nbG9iYWwpLmxpYiAhPSBOVUxMKQorICAqICAgICAgICAgICAgICAgICBfX2l0dF91bmxvYWRfbGliKF9OXyhfaXR0YXBpX2dsb2JhbCkubGliKTsKKyAgKiAgICAgICAgICAgICBfTl8oX2l0dGFwaV9nbG9iYWwpLmxpYiA9IE5VTEw7CisgICovCisgICAgICAgICAgICAgICAgX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfaW5pdGlhbGl6ZWQgPSAwOworICAgICAgICAgICAgICAgIGN1cnJlbnRfdGhyZWFkID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBfX2l0dF9tdXRleF91bmxvY2soJl9OXyhfaXR0YXBpX2dsb2JhbCkubXV0ZXgpOworICAgIH0KK30KKworSVRUX0VYVEVSTl9DIGludCBfTl8oaW5pdF9pdHRsaWIpKGNvbnN0IGNoYXIqIGxpYl9uYW1lLCBfX2l0dF9ncm91cF9pZCBpbml0X2dyb3VwcykKK3sKKyAgICByZWdpc3RlciBpbnQgaTsKKyAgICBfX2l0dF9ncm91cF9pZCBncm91cHM7CisjaWZkZWYgSVRUX0NPTVBMRVRFX0dST1VQCisgICAgX19pdHRfZ3JvdXBfaWQgemVyb19ncm91cCA9IF9faXR0X2dyb3VwX25vbmU7CisjZW5kaWYgLyogSVRUX0NPTVBMRVRFX0dST1VQICovCisgICAgc3RhdGljIHZvbGF0aWxlIFRJRFQgY3VycmVudF90aHJlYWQgPSAwOworCisgICAgaWYgKCFfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9pbml0aWFsaXplZCkKKyAgICB7CisjaWZuZGVmIElUVF9TSU1QTEVfSU5JVAorICAgICAgICBJVFRfTVVURVhfSU5JVF9BTkRfTE9DSyhfTl8oX2l0dGFwaV9nbG9iYWwpKTsKKyNlbmRpZiAvKiBJVFRfU0lNUExFX0lOSVQgKi8KKworICAgICAgICBpZiAoIV9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2luaXRpYWxpemVkKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY3VycmVudF90aHJlYWQgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjdXJyZW50X3RocmVhZCA9IF9faXR0X3RocmVhZF9pZCgpOworICAgICAgICAgICAgICAgIF9OXyhfaXR0YXBpX2dsb2JhbCkudGhyZWFkX2xpc3QtPnRpZCA9IGN1cnJlbnRfdGhyZWFkOworICAgICAgICAgICAgICAgIGlmIChsaWJfbmFtZSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICBsaWJfbmFtZSA9IF9faXR0X2dldF9saWJfbmFtZSgpOworICAgICAgICAgICAgICAgIGdyb3VwcyA9IF9faXR0X2dldF9ncm91cHMoKTsKKyAgICAgICAgICAgICAgICBpZiAoZ3JvdXBzICE9IF9faXR0X2dyb3VwX25vbmUgfHwgbGliX25hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9OXyhfaXR0YXBpX2dsb2JhbCkubGliID0gX19pdHRfbG9hZF9saWIoKGxpYl9uYW1lID09IE5VTEwpID8gaXR0bm90aWZ5X2xpYl9uYW1lIDogbGliX25hbWUpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChfTl8oX2l0dGFwaV9nbG9iYWwpLmxpYiAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2l0dF9hcGlfaW5pdF90KiBfX2l0dF9hcGlfaW5pdF9wdHI7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGliX3ZlcnNpb24gPSBfX2l0dF9saWJfdmVyc2lvbihfTl8oX2l0dGFwaV9nbG9iYWwpLmxpYik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobGliX3ZlcnNpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cHMgPSBfX2l0dF9ncm91cF9sZWdhY3k7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmlsbCBhbGwgcG9pbnRlcnMgZnJvbSBkeW5hbWljIGxpYnJhcnkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9saXN0X3B0cltpXS5uYW1lICE9IE5VTEw7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9saXN0X3B0cltpXS5ncm91cCAmIGdyb3VwcyAmIGluaXRfZ3JvdXBzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfbGlzdF9wdHJbaV0uZnVuY19wdHIgPSAodm9pZCopX19pdHRfZ2V0X3Byb2MoX05fKF9pdHRhcGlfZ2xvYmFsKS5saWIsIF9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2xpc3RfcHRyW2ldLm5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCpfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9saXN0X3B0cltpXS5mdW5jX3B0ciA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlc3RvcmUgcG9pbnRlcnMgZm9yIGZ1bmN0aW9uIHdpdGggc3RhdGljIGltcGxlbWVudGF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKl9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2xpc3RfcHRyW2ldLmZ1bmNfcHRyID0gX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfbGlzdF9wdHJbaV0ubnVsbF9mdW5jOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faXR0X3JlcG9ydF9lcnJvcihfX2l0dF9lcnJvcl9ub19zeW1ib2wsIGxpYl9uYW1lLCBfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9saXN0X3B0cltpXS5uYW1lKTsKKyNpZmRlZiBJVFRfQ09NUExFVEVfR1JPVVAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZXJvX2dyb3VwID0gKF9faXR0X2dyb3VwX2lkKSh6ZXJvX2dyb3VwIHwgX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfbGlzdF9wdHJbaV0uZ3JvdXApOworI2VuZGlmIC8qIElUVF9DT01QTEVURV9HUk9VUCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9saXN0X3B0cltpXS5mdW5jX3B0ciA9IF9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2xpc3RfcHRyW2ldLm51bGxfZnVuYzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ3JvdXBzID09IF9faXR0X2dyb3VwX2xlZ2FjeSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbXBhdGliaWxpdHkgd2l0aCBsZWdhY3kgdG9vbHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVRUTk9USUZZX05BTUUodGhyZWFkX2lnbm9yZSkgID0gSVRUTk9USUZZX05BTUUodGhyX2lnbm9yZSk7CisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElUVE5PVElGWV9OQU1FKHN5bmNfY3JlYXRlQSkgICA9IElUVE5PVElGWV9OQU1FKHN5bmNfc2V0X25hbWVBKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVRUTk9USUZZX05BTUUoc3luY19jcmVhdGVXKSAgID0gSVRUTk9USUZZX05BTUUoc3luY19zZXRfbmFtZVcpOworI2Vsc2UgIC8qIElUVF9QTEFURk9STSE9SVRUX1BMQVRGT1JNX1dJTiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVFROT1RJRllfTkFNRShzeW5jX2NyZWF0ZSkgICAgPSBJVFROT1RJRllfTkFNRShzeW5jX3NldF9uYW1lKTsKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVRUTk9USUZZX05BTUUoc3luY19wcmVwYXJlKSAgID0gSVRUTk9USUZZX05BTUUobm90aWZ5X3N5bmNfcHJlcGFyZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElUVE5PVElGWV9OQU1FKHN5bmNfY2FuY2VsKSAgICA9IElUVE5PVElGWV9OQU1FKG5vdGlmeV9zeW5jX2NhbmNlbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElUVE5PVElGWV9OQU1FKHN5bmNfYWNxdWlyZWQpICA9IElUVE5PVElGWV9OQU1FKG5vdGlmeV9zeW5jX2FjcXVpcmVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVRUTk9USUZZX05BTUUoc3luY19yZWxlYXNpbmcpID0gSVRUTk9USUZZX05BTUUobm90aWZ5X3N5bmNfcmVsZWFzaW5nKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyNpZmRlZiBJVFRfQ09NUExFVEVfR1JPVVAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9saXN0X3B0cltpXS5uYW1lICE9IE5VTEw7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2xpc3RfcHRyW2ldLmdyb3VwICYgemVyb19ncm91cCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9saXN0X3B0cltpXS5mdW5jX3B0ciA9IF9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2xpc3RfcHRyW2ldLm51bGxfZnVuYzsKKyNlbmRpZiAvKiBJVFRfQ09NUExFVEVfR1JPVVAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2l0dF9hcGlfaW5pdF9wdHIgPSAoX19pdHRfYXBpX2luaXRfdCopKHNpemVfdClfX2l0dF9nZXRfcHJvYyhfTl8oX2l0dGFwaV9nbG9iYWwpLmxpYiwgIl9faXR0X2FwaV9pbml0Iik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9faXR0X2FwaV9pbml0X3B0cikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19pdHRfYXBpX2luaXRfcHRyKCZfTl8oX2l0dGFwaV9nbG9iYWwpLCBpbml0X2dyb3Vwcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2l0dF9udWxsaWZ5X2FsbF9wb2ludGVycygpOworCisgICAgICAgICAgICAgICAgICAgICAgICBfX2l0dF9yZXBvcnRfZXJyb3IoX19pdHRfZXJyb3Jfbm9fbW9kdWxlLCBsaWJfbmFtZSwKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2l0dF9zeXN0ZW1fZXJyb3IoKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRsZXJyb3IoKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfX2l0dF9udWxsaWZ5X2FsbF9wb2ludGVycygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9pbml0aWFsaXplZCA9IDE7CisgICAgICAgICAgICAgICAgY3VycmVudF90aHJlYWQgPSAwOworICAgICAgICAgICAgICAgIC8qICEhISBKdXN0IHRvIGF2b2lkIHVudXNlZCBjb2RlIGVsaW1pbmF0aW9uICEhISAqLworICAgICAgICAgICAgICAgIGlmIChfX2l0dF9maW5pX2l0dGxpYl9wdHIgPT0gX05fKGZpbmlfaXR0bGliKSkgY3VycmVudF90aHJlYWQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyNpZm5kZWYgSVRUX1NJTVBMRV9JTklUCisgICAgICAgIF9faXR0X211dGV4X3VubG9jaygmX05fKF9pdHRhcGlfZ2xvYmFsKS5tdXRleCk7CisjZW5kaWYgLyogSVRUX1NJTVBMRV9JTklUICovCisgICAgfQorCisgICAgLyogRXZhbHVhdGluZyBpZiBhbnkgZnVuY3Rpb24gcHRyIGlzIG5vbiBlbXB0eSBhbmQgaXQncyBpbiBpbml0X2dyb3VwcyAqLworICAgIGZvciAoaSA9IDA7IF9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2xpc3RfcHRyW2ldLm5hbWUgIT0gTlVMTDsgaSsrKQorICAgICAgICBpZiAoKl9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2xpc3RfcHRyW2ldLmZ1bmNfcHRyICE9IF9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2xpc3RfcHRyW2ldLm51bGxfZnVuYyAmJgorICAgICAgICAgICAgX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfbGlzdF9wdHJbaV0uZ3JvdXAgJiBpbml0X2dyb3VwcykKKyAgICAgICAgICAgIHJldHVybiAxOworICAgIHJldHVybiAwOworfQorCitJVFRfRVhURVJOX0MgX19pdHRfZXJyb3JfaGFuZGxlcl90KiBfTl8oc2V0X2Vycm9yX2hhbmRsZXIpKF9faXR0X2Vycm9yX2hhbmRsZXJfdCogaGFuZGxlcikKK3sKKyAgICBfX2l0dF9lcnJvcl9oYW5kbGVyX3QqIHByZXYgPSAoX19pdHRfZXJyb3JfaGFuZGxlcl90Kikoc2l6ZV90KV9OXyhfaXR0YXBpX2dsb2JhbCkuZXJyb3JfaGFuZGxlcjsKKyAgICBfTl8oX2l0dGFwaV9nbG9iYWwpLmVycm9yX2hhbmRsZXIgPSAodm9pZCopKHNpemVfdCloYW5kbGVyOworICAgIHJldHVybiBwcmV2OworfQorCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjcHJhZ21hIHdhcm5pbmcocG9wKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy90aGlyZHBhcnR5L2l0dG5vdGlmeS9pdHRub3RpZnlfc3RhdGljLmggYi9maW5hbC9ydW50aW1lL3NyYy90aGlyZHBhcnR5L2l0dG5vdGlmeS9pdHRub3RpZnlfc3RhdGljLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIxOGNjOAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL3RoaXJkcGFydHkvaXR0bm90aWZ5L2l0dG5vdGlmeV9zdGF0aWMuaApAQCAtMCwwICsxLDMxNiBAQAorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAiaXR0bm90aWZ5X2NvbmZpZy5oIgorCisjaWZuZGVmIElUVF9GT1JNQVRfREVGSU5FRAorIyAgaWZuZGVmIElUVF9GT1JNQVQKKyMgICAgZGVmaW5lIElUVF9GT1JNQVQKKyMgIGVuZGlmIC8qIElUVF9GT1JNQVQgKi8KKyMgIGlmbmRlZiBJVFRfTk9fUEFSQU1TCisjICAgIGRlZmluZSBJVFRfTk9fUEFSQU1TCisjICBlbmRpZiAvKiBJVFRfTk9fUEFSQU1TICovCisjZW5kaWYgLyogSVRUX0ZPUk1BVF9ERUZJTkVEICovCisKKy8qCisgKiBwYXJhbWV0ZXJzIGZvciBtYWNybyBleHBlY3RlZDoKKyAqIElUVF9TVFVCKGFwaSwgdHlwZSwgZnVuY19uYW1lLCBhcmd1bWVudHMsIHBhcmFtcywgZnVuY19uYW1lX2luX2RsbCwgZ3JvdXAsIHByaW50Zl9mbXQpCisgKi8KKyNpZmRlZiBfX0lUVF9JTlRFUk5BTF9JTklUCisKKyNpZm5kZWYgX19JVFRfSU5URVJOQUxfQk9EWQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9kb21haW4qLCBkb21haW5fY3JlYXRlQSwgKGNvbnN0IGNoYXIgICAgKm5hbWUpLCAoSVRUX0ZPUk1BVCBuYW1lKSwgZG9tYWluX2NyZWF0ZUEsIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIlwiJXNcIiIpCitJVFRfU1RVQihJVFRBUEksIF9faXR0X2RvbWFpbiosIGRvbWFpbl9jcmVhdGVXLCAoY29uc3Qgd2NoYXJfdCAqbmFtZSksIChJVFRfRk9STUFUIG5hbWUpLCBkb21haW5fY3JlYXRlVywgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiXCIlU1wiIikKKyNlbHNlICAvKiBJVFRfUExBVEZPUk0hPUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfZG9tYWluKiwgZG9tYWluX2NyZWF0ZSwgIChjb25zdCBjaGFyICAgICpuYW1lKSwgKElUVF9GT1JNQVQgbmFtZSksIGRvbWFpbl9jcmVhdGUsICBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICJcIiVzXCIiKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQihJVFRBUEksIF9faXR0X3N0cmluZ19oYW5kbGUqLCBzdHJpbmdfaGFuZGxlX2NyZWF0ZUEsIChjb25zdCBjaGFyICAgICpuYW1lKSwgKElUVF9GT1JNQVQgbmFtZSksIHN0cmluZ19oYW5kbGVfY3JlYXRlQSwgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiXCIlc1wiIikKK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfc3RyaW5nX2hhbmRsZSosIHN0cmluZ19oYW5kbGVfY3JlYXRlVywgKGNvbnN0IHdjaGFyX3QgKm5hbWUpLCAoSVRUX0ZPUk1BVCBuYW1lKSwgc3RyaW5nX2hhbmRsZV9jcmVhdGVXLCBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICJcIiVTXCIiKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STSE9SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9zdHJpbmdfaGFuZGxlKiwgc3RyaW5nX2hhbmRsZV9jcmVhdGUsICAoY29uc3QgY2hhciAgICAqbmFtZSksIChJVFRfRk9STUFUIG5hbWUpLCBzdHJpbmdfaGFuZGxlX2NyZWF0ZSwgIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIlwiJXNcIiIpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHBhdXNlLCAgKHZvaWQpLCAoSVRUX05PX1BBUkFNUyksIHBhdXNlLCAgX19pdHRfZ3JvdXBfY29udHJvbCB8IF9faXR0X2dyb3VwX2xlZ2FjeSwgIm5vIGFyZ3MiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgcmVzdW1lLCAodm9pZCksIChJVFRfTk9fUEFSQU1TKSwgcmVzdW1lLCBfX2l0dF9ncm91cF9jb250cm9sIHwgX19pdHRfZ3JvdXBfbGVnYWN5LCAibm8gYXJncyIpCisKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHRocmVhZF9zZXRfbmFtZUEsIChjb25zdCBjaGFyICAgICpuYW1lKSwgKElUVF9GT1JNQVQgbmFtZSksIHRocmVhZF9zZXRfbmFtZUEsIF9faXR0X2dyb3VwX3RocmVhZCwgIlwiJXNcIiIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCB0aHJlYWRfc2V0X25hbWVXLCAoY29uc3Qgd2NoYXJfdCAqbmFtZSksIChJVFRfRk9STUFUIG5hbWUpLCB0aHJlYWRfc2V0X25hbWVXLCBfX2l0dF9ncm91cF90aHJlYWQsICJcIiVTXCIiKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STSE9SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgdGhyZWFkX3NldF9uYW1lLCAgKGNvbnN0IGNoYXIgICAgKm5hbWUpLCAoSVRUX0ZPUk1BVCBuYW1lKSwgdGhyZWFkX3NldF9uYW1lLCAgX19pdHRfZ3JvdXBfdGhyZWFkLCAiXCIlc1wiIikKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHRocmVhZF9pZ25vcmUsICh2b2lkKSwgKElUVF9OT19QQVJBTVMpLCB0aHJlYWRfaWdub3JlLCBfX2l0dF9ncm91cF90aHJlYWQsICJubyBhcmdzIikKKworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUIoTElCSVRUQVBJLCBpbnQsICB0aHJfbmFtZV9zZXRBLCAoY29uc3QgY2hhciAgICAqbmFtZSwgaW50IG5hbWVsZW4pLCAoSVRUX0ZPUk1BVCBuYW1lLCBuYW1lbGVuKSwgdGhyX25hbWVfc2V0QSwgX19pdHRfZ3JvdXBfdGhyZWFkIHwgX19pdHRfZ3JvdXBfbGVnYWN5LCAiXCIlc1wiLCAlZCIpCitJVFRfU1RVQihMSUJJVFRBUEksIGludCwgIHRocl9uYW1lX3NldFcsIChjb25zdCB3Y2hhcl90ICpuYW1lLCBpbnQgbmFtZWxlbiksIChJVFRfRk9STUFUIG5hbWUsIG5hbWVsZW4pLCB0aHJfbmFtZV9zZXRXLCBfX2l0dF9ncm91cF90aHJlYWQgfCBfX2l0dF9ncm91cF9sZWdhY3ksICJcIiVTXCIsICVkIikKKyNlbHNlICAvKiBJVFRfUExBVEZPUk0hPUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCKExJQklUVEFQSSwgaW50LCAgdGhyX25hbWVfc2V0LCAgKGNvbnN0IGNoYXIgICAgKm5hbWUsIGludCBuYW1lbGVuKSwgKElUVF9GT1JNQVQgbmFtZSwgbmFtZWxlbiksIHRocl9uYW1lX3NldCwgIF9faXR0X2dyb3VwX3RocmVhZCB8IF9faXR0X2dyb3VwX2xlZ2FjeSwgIlwiJXNcIiwgJWQiKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUJWKExJQklUVEFQSSwgdm9pZCwgdGhyX2lnbm9yZSwgICAodm9pZCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSVRUX05PX1BBUkFNUyksICAgICAgICAgICAgdGhyX2lnbm9yZSwgICAgX19pdHRfZ3JvdXBfdGhyZWFkIHwgX19pdHRfZ3JvdXBfbGVnYWN5LCAibm8gYXJncyIpCisjZW5kaWYgLyogX19JVFRfSU5URVJOQUxfQk9EWSAqLworCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBlbmFibGVfYXR0YWNoLCAodm9pZCksIChJVFRfTk9fUEFSQU1TKSwgZW5hYmxlX2F0dGFjaCwgX19pdHRfZ3JvdXBfYWxsLCAibm8gYXJncyIpCisKKyNlbHNlICAvKiBfX0lUVF9JTlRFUk5BTF9JTklUICovCisKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN5bmNfY3JlYXRlQSwgKHZvaWQgKmFkZHIsIGNvbnN0IGNoYXIgICAgKm9ianR5cGUsIGNvbnN0IGNoYXIgICAgKm9iam5hbWUsIGludCBhdHRyaWJ1dGUpLCAoSVRUX0ZPUk1BVCBhZGRyLCBvYmp0eXBlLCBvYmpuYW1lLCBhdHRyaWJ1dGUpLCBzeW5jX2NyZWF0ZUEsIF9faXR0X2dyb3VwX3N5bmMgfCBfX2l0dF9ncm91cF9mc3luYywgIiVwLCBcIiVzXCIsIFwiJXNcIiwgJXgiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3luY19jcmVhdGVXLCAodm9pZCAqYWRkciwgY29uc3Qgd2NoYXJfdCAqb2JqdHlwZSwgY29uc3Qgd2NoYXJfdCAqb2JqbmFtZSwgaW50IGF0dHJpYnV0ZSksIChJVFRfRk9STUFUIGFkZHIsIG9ianR5cGUsIG9iam5hbWUsIGF0dHJpYnV0ZSksIHN5bmNfY3JlYXRlVywgX19pdHRfZ3JvdXBfc3luYyB8IF9faXR0X2dyb3VwX2ZzeW5jLCAiJXAsIFwiJVNcIiwgXCIlU1wiLCAleCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzeW5jX3JlbmFtZUEsICh2b2lkICphZGRyLCBjb25zdCBjaGFyICAgICpuYW1lKSwgKElUVF9GT1JNQVQgYWRkciwgbmFtZSksIHN5bmNfcmVuYW1lQSwgX19pdHRfZ3JvdXBfc3luYyB8IF9faXR0X2dyb3VwX2ZzeW5jLCAiJXAsIFwiJXNcIiIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzeW5jX3JlbmFtZVcsICh2b2lkICphZGRyLCBjb25zdCB3Y2hhcl90ICpuYW1lKSwgKElUVF9GT1JNQVQgYWRkciwgbmFtZSksIHN5bmNfcmVuYW1lVywgX19pdHRfZ3JvdXBfc3luYyB8IF9faXR0X2dyb3VwX2ZzeW5jLCAiJXAsIFwiJVNcIiIpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNIT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzeW5jX2NyZWF0ZSwgICh2b2lkICphZGRyLCBjb25zdCBjaGFyICAgICpvYmp0eXBlLCBjb25zdCBjaGFyICAgICpvYmpuYW1lLCBpbnQgYXR0cmlidXRlKSwgKElUVF9GT1JNQVQgYWRkciwgb2JqdHlwZSwgb2JqbmFtZSwgYXR0cmlidXRlKSwgc3luY19jcmVhdGUsICBfX2l0dF9ncm91cF9zeW5jIHwgX19pdHRfZ3JvdXBfZnN5bmMsICIlcCwgXCIlc1wiLCBcIiVzXCIsICV4IikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN5bmNfcmVuYW1lLCAgKHZvaWQgKmFkZHIsIGNvbnN0IGNoYXIgICAgKm5hbWUpLCAoSVRUX0ZPUk1BVCBhZGRyLCBuYW1lKSwgc3luY19yZW5hbWUsICBfX2l0dF9ncm91cF9zeW5jIHwgX19pdHRfZ3JvdXBfZnN5bmMsICIlcCwgXCIlc1wiIikKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN5bmNfZGVzdHJveSwgICAgKHZvaWQgKmFkZHIpLCAoSVRUX0ZPUk1BVCBhZGRyKSwgc3luY19kZXN0cm95LCAgIF9faXR0X2dyb3VwX3N5bmMgfCBfX2l0dF9ncm91cF9mc3luYywgIiVwIikKKworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3luY19wcmVwYXJlLCAgICAodm9pZCogYWRkciksIChJVFRfRk9STUFUIGFkZHIpLCBzeW5jX3ByZXBhcmUsICAgX19pdHRfZ3JvdXBfc3luYywgICIlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzeW5jX2NhbmNlbCwgICAgICh2b2lkICphZGRyKSwgKElUVF9GT1JNQVQgYWRkciksIHN5bmNfY2FuY2VsLCAgICBfX2l0dF9ncm91cF9zeW5jLCAgIiVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN5bmNfYWNxdWlyZWQsICAgKHZvaWQgKmFkZHIpLCAoSVRUX0ZPUk1BVCBhZGRyKSwgc3luY19hY3F1aXJlZCwgIF9faXR0X2dyb3VwX3N5bmMsICAiJXAiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3luY19yZWxlYXNpbmcsICAodm9pZCogYWRkciksIChJVFRfRk9STUFUIGFkZHIpLCBzeW5jX3JlbGVhc2luZywgX19pdHRfZ3JvdXBfc3luYywgICIlcCIpCisKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN1cHByZXNzX3B1c2gsICAgICAgICh1bnNpZ25lZCBpbnQgbWFzayksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSVRUX0ZPUk1BVCBtYXNrKSwgc3VwcHJlc3NfcHVzaCwgIF9faXR0X2dyb3VwX3N1cHByZXNzLCAgIiVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN1cHByZXNzX3BvcCwgICAgICAgICh2b2lkKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSVRUX05PX1BBUkFNUyksICAgc3VwcHJlc3NfcG9wLCAgIF9faXR0X2dyb3VwX3N1cHByZXNzLCAgIm5vIGFyZ3MiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3VwcHJlc3NfbWFya19yYW5nZSwgKF9faXR0X3N1cHByZXNzX21vZGVfdCBtb2RlLCB1bnNpZ25lZCBpbnQgbWFzaywgdm9pZCAqIGFkZHJlc3MsIHNpemVfdCBzaXplKSwoSVRUX0ZPUk1BVCBtb2RlLCBtYXNrLCBhZGRyZXNzLCBzaXplKSwgc3VwcHJlc3NfbWFya19yYW5nZSwgX19pdHRfZ3JvdXBfc3VwcHJlc3MsICIlZCwgJXAsICVwLCAlZCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzdXBwcmVzc19jbGVhcl9yYW5nZSwoX19pdHRfc3VwcHJlc3NfbW9kZV90IG1vZGUsIHVuc2lnbmVkIGludCBtYXNrLCB2b2lkICogYWRkcmVzcywgc2l6ZV90IHNpemUpLChJVFRfRk9STUFUIG1vZGUsIG1hc2ssIGFkZHJlc3MsIHNpemUpLCBzdXBwcmVzc19jbGVhcl9yYW5nZSxfX2l0dF9ncm91cF9zdXBwcmVzcywgIiVkLCAlcCwgJXAsICVkIikKKworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgZnN5bmNfcHJlcGFyZSwgICAodm9pZCogYWRkciksIChJVFRfRk9STUFUIGFkZHIpLCBzeW5jX3ByZXBhcmUsICAgX19pdHRfZ3JvdXBfZnN5bmMsICIlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBmc3luY19jYW5jZWwsICAgICh2b2lkICphZGRyKSwgKElUVF9GT1JNQVQgYWRkciksIHN5bmNfY2FuY2VsLCAgICBfX2l0dF9ncm91cF9mc3luYywgIiVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGZzeW5jX2FjcXVpcmVkLCAgKHZvaWQgKmFkZHIpLCAoSVRUX0ZPUk1BVCBhZGRyKSwgc3luY19hY3F1aXJlZCwgIF9faXR0X2dyb3VwX2ZzeW5jLCAiJXAiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgZnN5bmNfcmVsZWFzaW5nLCAodm9pZCogYWRkciksIChJVFRfRk9STUFUIGFkZHIpLCBzeW5jX3JlbGVhc2luZywgX19pdHRfZ3JvdXBfZnN5bmMsICIlcCIpCisKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX3NpdGVfYmVnaW4sICAgICAgICAgIChfX2l0dF9tb2RlbF9zaXRlICpzaXRlLCBfX2l0dF9tb2RlbF9zaXRlX2luc3RhbmNlICppbnN0YW5jZSwgY29uc3QgY2hhciAqbmFtZSksIChJVFRfRk9STUFUIHNpdGUsIGluc3RhbmNlLCBuYW1lKSwgbW9kZWxfc2l0ZV9iZWdpbiwgX19pdHRfZ3JvdXBfbW9kZWwsICIlcCwgJXAsIFwiJXNcIiIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9zaXRlX2VuZCwgICAgICAgICAgICAoX19pdHRfbW9kZWxfc2l0ZSAqc2l0ZSwgX19pdHRfbW9kZWxfc2l0ZV9pbnN0YW5jZSAqaW5zdGFuY2UpLCAgICAgICAgICAgICAgICAgICAoSVRUX0ZPUk1BVCBzaXRlLCBpbnN0YW5jZSksICAgICAgIG1vZGVsX3NpdGVfZW5kLCAgIF9faXR0X2dyb3VwX21vZGVsLCAiJXAsICVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX3Rhc2tfYmVnaW4sICAgICAgICAgIChfX2l0dF9tb2RlbF90YXNrICp0YXNrLCBfX2l0dF9tb2RlbF90YXNrX2luc3RhbmNlICppbnN0YW5jZSwgY29uc3QgY2hhciAqbmFtZSksIChJVFRfRk9STUFUIHRhc2ssIGluc3RhbmNlLCBuYW1lKSwgbW9kZWxfdGFza19iZWdpbiwgX19pdHRfZ3JvdXBfbW9kZWwsICIlcCwgJXAsIFwiJXNcIiIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF90YXNrX2VuZCwgICAgICAgICAgICAoX19pdHRfbW9kZWxfdGFzayAqdGFzaywgX19pdHRfbW9kZWxfdGFza19pbnN0YW5jZSAqaW5zdGFuY2UpLCAgICAgICAgICAgICAgICAgICAoSVRUX0ZPUk1BVCB0YXNrLCBpbnN0YW5jZSksICAgICAgIG1vZGVsX3Rhc2tfZW5kLCAgIF9faXR0X2dyb3VwX21vZGVsLCAiJXAsICVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX2xvY2tfYWNxdWlyZSwgICAgICAgICh2b2lkICpsb2NrKSwgKElUVF9GT1JNQVQgbG9jayksIG1vZGVsX2xvY2tfYWNxdWlyZSwgX19pdHRfZ3JvdXBfbW9kZWwsICIlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9sb2NrX3JlbGVhc2UsICAgICAgICAodm9pZCAqbG9jayksIChJVFRfRk9STUFUIGxvY2spLCBtb2RlbF9sb2NrX3JlbGVhc2UsIF9faXR0X2dyb3VwX21vZGVsLCAiJXAiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfcmVjb3JkX2FsbG9jYXRpb24sICAgKHZvaWQgKmFkZHIsIHNpemVfdCBzaXplKSwgKElUVF9GT1JNQVQgYWRkciwgc2l6ZSksIG1vZGVsX3JlY29yZF9hbGxvY2F0aW9uLCAgIF9faXR0X2dyb3VwX21vZGVsLCAiJXAsICVkIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX3JlY29yZF9kZWFsbG9jYXRpb24sICh2b2lkICphZGRyKSwgICAgICAgICAgICAgIChJVFRfRk9STUFUIGFkZHIpLCAgICAgICBtb2RlbF9yZWNvcmRfZGVhbGxvY2F0aW9uLCBfX2l0dF9ncm91cF9tb2RlbCwgIiVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX2luZHVjdGlvbl91c2VzLCAgICAgICh2b2lkKiBhZGRyLCBzaXplX3Qgc2l6ZSksIChJVFRfRk9STUFUIGFkZHIsIHNpemUpLCBtb2RlbF9pbmR1Y3Rpb25fdXNlcywgICAgICBfX2l0dF9ncm91cF9tb2RlbCwgIiVwLCAlZCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9yZWR1Y3Rpb25fdXNlcywgICAgICAodm9pZCogYWRkciwgc2l6ZV90IHNpemUpLCAoSVRUX0ZPUk1BVCBhZGRyLCBzaXplKSwgbW9kZWxfcmVkdWN0aW9uX3VzZXMsICAgICAgX19pdHRfZ3JvdXBfbW9kZWwsICIlcCwgJWQiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfb2JzZXJ2ZV91c2VzLCAgICAgICAgKHZvaWQqIGFkZHIsIHNpemVfdCBzaXplKSwgKElUVF9GT1JNQVQgYWRkciwgc2l6ZSksIG1vZGVsX29ic2VydmVfdXNlcywgICAgICAgIF9faXR0X2dyb3VwX21vZGVsLCAiJXAsICVkIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX2NsZWFyX3VzZXMsICAgICAgICAgICh2b2lkKiBhZGRyKSwgICAgICAgICAgICAgIChJVFRfRk9STUFUIGFkZHIpLCAgICAgICBtb2RlbF9jbGVhcl91c2VzLCAgICAgICAgICBfX2l0dF9ncm91cF9tb2RlbCwgIiVwIikKKworI2lmbmRlZiBfX0lUVF9JTlRFUk5BTF9CT0RZCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9zaXRlX2JlZ2luVywgICAgICAgICAoY29uc3Qgd2NoYXJfdCAqbmFtZSksICAgICAoSVRUX0ZPUk1BVCBuYW1lKSwgICAgICAgbW9kZWxfc2l0ZV9iZWdpblcsICAgICAgICAgX19pdHRfZ3JvdXBfbW9kZWwsICJcIiVzXCIiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfdGFza19iZWdpblcsICAgICAgICAgKGNvbnN0IHdjaGFyX3QgKm5hbWUpLCAgICAgKElUVF9GT1JNQVQgbmFtZSksICAgICAgIG1vZGVsX3Rhc2tfYmVnaW5XLCAgICAgICAgIF9faXR0X2dyb3VwX21vZGVsLCAiXCIlc1wiIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX2l0ZXJhdGlvbl90YXNrVywgICAgIChjb25zdCB3Y2hhcl90ICpuYW1lKSwgICAgIChJVFRfRk9STUFUIG5hbWUpLCAgICAgICBtb2RlbF9pdGVyYXRpb25fdGFza1csICAgICBfX2l0dF9ncm91cF9tb2RlbCwgIlwiJXNcIiIpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9zaXRlX2JlZ2luQSwgICAgICAgICAoY29uc3QgY2hhciAqbmFtZSksICAgICAgICAoSVRUX0ZPUk1BVCBuYW1lKSwgICAgICAgbW9kZWxfc2l0ZV9iZWdpbkEsICAgICAgICAgX19pdHRfZ3JvdXBfbW9kZWwsICJcIiVzXCIiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfc2l0ZV9iZWdpbkFMLCAgICAgICAgKGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBsZW4pLCAoSVRUX0ZPUk1BVCBuYW1lLCBsZW4pLCBtb2RlbF9zaXRlX2JlZ2luQUwsICAgIF9faXR0X2dyb3VwX21vZGVsLCAiXCIlc1wiLCAlZCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF90YXNrX2JlZ2luQSwgICAgICAgICAoY29uc3QgY2hhciAqbmFtZSksICAgICAgICAoSVRUX0ZPUk1BVCBuYW1lKSwgICAgICAgbW9kZWxfdGFza19iZWdpbkEsICAgICAgICAgX19pdHRfZ3JvdXBfbW9kZWwsICJcIiVzXCIiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfdGFza19iZWdpbkFMLCAgICAgICAgKGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBsZW4pLCAoSVRUX0ZPUk1BVCBuYW1lLCBsZW4pLCBtb2RlbF90YXNrX2JlZ2luQUwsICAgIF9faXR0X2dyb3VwX21vZGVsLCAiXCIlc1wiLCAlZCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9pdGVyYXRpb25fdGFza0EsICAgICAoY29uc3QgY2hhciAqbmFtZSksICAgICAgICAoSVRUX0ZPUk1BVCBuYW1lKSwgICAgICAgbW9kZWxfaXRlcmF0aW9uX3Rhc2tBLCAgICAgX19pdHRfZ3JvdXBfbW9kZWwsICJcIiVzXCIiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfaXRlcmF0aW9uX3Rhc2tBTCwgICAgKGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBsZW4pLCAoSVRUX0ZPUk1BVCBuYW1lLCBsZW4pLCBtb2RlbF9pdGVyYXRpb25fdGFza0FMLCBfX2l0dF9ncm91cF9tb2RlbCwgIlwiJXNcIiwgJWQiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfc2l0ZV9lbmRfMiwgICAgICAgICAgKHZvaWQpLCAgICAgICAgICAgICAgICAgICAgKElUVF9OT19QQVJBTVMpLCAgICAgICAgIG1vZGVsX3NpdGVfZW5kXzIsICAgICAgICAgIF9faXR0X2dyb3VwX21vZGVsLCAibm8gYXJncyIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF90YXNrX2VuZF8yLCAgICAgICAgICAodm9pZCksICAgICAgICAgICAgICAgICAgICAoSVRUX05PX1BBUkFNUyksICAgICAgICAgbW9kZWxfdGFza19lbmRfMiwgICAgICAgICAgX19pdHRfZ3JvdXBfbW9kZWwsICJubyBhcmdzIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX2xvY2tfYWNxdWlyZV8yLCAgICAgICh2b2lkICpsb2NrKSwgICAgICAgICAgICAgIChJVFRfRk9STUFUIGxvY2spLCAgICAgICBtb2RlbF9sb2NrX2FjcXVpcmVfMiwgICAgICBfX2l0dF9ncm91cF9tb2RlbCwgIiVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX2xvY2tfcmVsZWFzZV8yLCAgICAgICh2b2lkICpsb2NrKSwgICAgICAgICAgICAgIChJVFRfRk9STUFUIGxvY2spLCAgICAgICBtb2RlbF9sb2NrX3JlbGVhc2VfMiwgICAgICBfX2l0dF9ncm91cF9tb2RlbCwgIiVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX2FnZ3JlZ2F0ZV90YXNrLCAgICAgIChzaXplX3QgY291bnQpLCAgICAgICAgICAgIChJVFRfRk9STUFUIGNvdW50KSwgICAgICBtb2RlbF9hZ2dyZWdhdGVfdGFzaywgICAgICBfX2l0dF9ncm91cF9tb2RlbCwgIiVkIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX2Rpc2FibGVfcHVzaCwgICAgICAgIChfX2l0dF9tb2RlbF9kaXNhYmxlIHgpLCAgIChJVFRfRk9STUFUIHgpLCAgICAgICAgICBtb2RlbF9kaXNhYmxlX3B1c2gsICAgICAgICBfX2l0dF9ncm91cF9tb2RlbCwgIiVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX2Rpc2FibGVfcG9wLCAgICAgICAgICh2b2lkKSwgICAgICAgICAgICAgICAgICAgIChJVFRfTk9fUEFSQU1TKSwgICAgICAgICBtb2RlbF9kaXNhYmxlX3BvcCwgICAgICAgICBfX2l0dF9ncm91cF9tb2RlbCwgIm5vIGFyZ3MiKQorI2VuZGlmIC8qIF9fSVRUX0lOVEVSTkFMX0JPRFkgKi8KKworI2lmbmRlZiBfX0lUVF9JTlRFUk5BTF9CT0RZCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQihJVFRBUEksIF9faXR0X2hlYXBfZnVuY3Rpb24sIGhlYXBfZnVuY3Rpb25fY3JlYXRlQSwgKGNvbnN0IGNoYXIgICAgKm5hbWUsIGNvbnN0IGNoYXIgICAgKmRvbWFpbiksIChJVFRfRk9STUFUIG5hbWUsIGRvbWFpbiksIGhlYXBfZnVuY3Rpb25fY3JlYXRlQSwgX19pdHRfZ3JvdXBfaGVhcCwgIlwiJXNcIiwgXCIlc1wiIikKK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfaGVhcF9mdW5jdGlvbiwgaGVhcF9mdW5jdGlvbl9jcmVhdGVXLCAoY29uc3Qgd2NoYXJfdCAqbmFtZSwgY29uc3Qgd2NoYXJfdCAqZG9tYWluKSwgKElUVF9GT1JNQVQgbmFtZSwgZG9tYWluKSwgaGVhcF9mdW5jdGlvbl9jcmVhdGVXLCBfX2l0dF9ncm91cF9oZWFwLCAiXCIlc1wiLCBcIiVzXCIiKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9oZWFwX2Z1bmN0aW9uLCBoZWFwX2Z1bmN0aW9uX2NyZWF0ZSwgIChjb25zdCBjaGFyICAgICpuYW1lLCBjb25zdCBjaGFyICAgICpkb21haW4pLCAoSVRUX0ZPUk1BVCBuYW1lLCBkb21haW4pLCBoZWFwX2Z1bmN0aW9uX2NyZWF0ZSwgIF9faXR0X2dyb3VwX2hlYXAsICJcIiVzXCIsIFwiJXNcIiIpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogX19JVFRfSU5URVJOQUxfQk9EWSAqLworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgaGVhcF9hbGxvY2F0ZV9iZWdpbiwgICAoX19pdHRfaGVhcF9mdW5jdGlvbiBoLCBzaXplX3Qgc2l6ZSwgaW50IGluaXRpYWxpemVkKSwgICAgICAgICAgICAgKElUVF9GT1JNQVQgaCwgc2l6ZSwgaW5pdGlhbGl6ZWQpLCAgICAgICBoZWFwX2FsbG9jYXRlX2JlZ2luLCBfX2l0dF9ncm91cF9oZWFwLCAiJXAsICVsdSwgJWQiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgaGVhcF9hbGxvY2F0ZV9lbmQsICAgICAoX19pdHRfaGVhcF9mdW5jdGlvbiBoLCB2b2lkKiogYWRkciwgc2l6ZV90IHNpemUsIGludCBpbml0aWFsaXplZCksIChJVFRfRk9STUFUIGgsIGFkZHIsIHNpemUsIGluaXRpYWxpemVkKSwgaGVhcF9hbGxvY2F0ZV9lbmQsICAgX19pdHRfZ3JvdXBfaGVhcCwgIiVwLCAlcCwgJWx1LCAlZCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBoZWFwX2ZyZWVfYmVnaW4sICAgICAgIChfX2l0dF9oZWFwX2Z1bmN0aW9uIGgsIHZvaWQqICBhZGRyKSwgKElUVF9GT1JNQVQgaCwgYWRkciksIGhlYXBfZnJlZV9iZWdpbiwgX19pdHRfZ3JvdXBfaGVhcCwgIiVwLCAlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBoZWFwX2ZyZWVfZW5kLCAgICAgICAgIChfX2l0dF9oZWFwX2Z1bmN0aW9uIGgsIHZvaWQqICBhZGRyKSwgKElUVF9GT1JNQVQgaCwgYWRkciksIGhlYXBfZnJlZV9lbmQsICAgX19pdHRfZ3JvdXBfaGVhcCwgIiVwLCAlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBoZWFwX3JlYWxsb2NhdGVfYmVnaW4sIChfX2l0dF9oZWFwX2Z1bmN0aW9uIGgsIHZvaWQqICBhZGRyLCBzaXplX3QgbmV3X3NpemUsIGludCBpbml0aWFsaXplZCksICAgICAgICAgICAgICAgICAgKElUVF9GT1JNQVQgaCwgYWRkciwgbmV3X3NpemUsIGluaXRpYWxpemVkKSwgICAgICAgICAgIGhlYXBfcmVhbGxvY2F0ZV9iZWdpbiwgX19pdHRfZ3JvdXBfaGVhcCwgIiVwLCAlcCwgJWx1LCAlZCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBoZWFwX3JlYWxsb2NhdGVfZW5kLCAgIChfX2l0dF9oZWFwX2Z1bmN0aW9uIGgsIHZvaWQqICBhZGRyLCB2b2lkKiogbmV3X2FkZHIsIHNpemVfdCBuZXdfc2l6ZSwgaW50IGluaXRpYWxpemVkKSwgKElUVF9GT1JNQVQgaCwgYWRkciwgbmV3X2FkZHIsIG5ld19zaXplLCBpbml0aWFsaXplZCksIGhlYXBfcmVhbGxvY2F0ZV9lbmQsICAgX19pdHRfZ3JvdXBfaGVhcCwgIiVwLCAlcCwgJXAsICVsdSwgJWQiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgaGVhcF9pbnRlcm5hbF9hY2Nlc3NfYmVnaW4sICh2b2lkKSwgKElUVF9OT19QQVJBTVMpLCBoZWFwX2ludGVybmFsX2FjY2Vzc19iZWdpbiwgX19pdHRfZ3JvdXBfaGVhcCwgIm5vIGFyZ3MiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgaGVhcF9pbnRlcm5hbF9hY2Nlc3NfZW5kLCAgICh2b2lkKSwgKElUVF9OT19QQVJBTVMpLCBoZWFwX2ludGVybmFsX2FjY2Vzc19lbmQsICAgX19pdHRfZ3JvdXBfaGVhcCwgIm5vIGFyZ3MiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgaGVhcF9yZWNvcmRfbWVtb3J5X2dyb3d0aF9iZWdpbiwgKHZvaWQpLCAoSVRUX05PX1BBUkFNUyksIGhlYXBfcmVjb3JkX21lbW9yeV9ncm93dGhfYmVnaW4sIF9faXR0X2dyb3VwX2hlYXAsICJubyBhcmdzIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGhlYXBfcmVjb3JkX21lbW9yeV9ncm93dGhfZW5kLCAgICh2b2lkKSwgKElUVF9OT19QQVJBTVMpLCBoZWFwX3JlY29yZF9tZW1vcnlfZ3Jvd3RoX2VuZCwgICBfX2l0dF9ncm91cF9oZWFwLCAibm8gYXJncyIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBoZWFwX3Jlc2V0X2RldGVjdGlvbiwgKHVuc2lnbmVkIGludCByZXNldF9tYXNrKSwgIChJVFRfRk9STUFUIHJlc2V0X21hc2spLCBoZWFwX3Jlc2V0X2RldGVjdGlvbiwgX19pdHRfZ3JvdXBfaGVhcCwgIiV1IikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGhlYXBfcmVjb3JkLCAgICAgICAgICAodW5zaWduZWQgaW50IHJlY29yZF9tYXNrKSwgKElUVF9GT1JNQVQgcmVjb3JkX21hc2spLCAgaGVhcF9yZWNvcmQsICAgICAgICBfX2l0dF9ncm91cF9oZWFwLCAiJXUiKQorCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBpZF9jcmVhdGUsICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkKSwgKElUVF9GT1JNQVQgZG9tYWluLCBpZCksIGlkX2NyZWF0ZSwgIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlbHUiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgaWRfZGVzdHJveSwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCksIChJVFRfRk9STUFUIGRvbWFpbiwgaWQpLCBpZF9kZXN0cm95LCBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJWx1IikKKworSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF90aW1lc3RhbXAsIGdldF90aW1lc3RhbXAsICh2b2lkKSwgKElUVF9OT19QQVJBTVMpLCBnZXRfdGltZXN0YW1wLCAgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAibm8gYXJncyIpCisKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHJlZ2lvbl9iZWdpbiwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCwgX19pdHRfaWQgcGFyZW50LCBfX2l0dF9zdHJpbmdfaGFuZGxlICpuYW1lKSwgKElUVF9GT1JNQVQgZG9tYWluLCBpZCwgcGFyZW50LCBuYW1lKSwgcmVnaW9uX2JlZ2luLCBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJWx1LCAlbHUsICVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHJlZ2lvbl9lbmQsICAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElUVF9GT1JNQVQgZG9tYWluLCBpZCksICAgICAgICAgICAgICAgcmVnaW9uX2VuZCwgICBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJWx1IikKKworI2lmbmRlZiBfX0lUVF9JTlRFUk5BTF9CT0RZCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBmcmFtZV9iZWdpbl92MywgIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgKmlkKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSVRUX0ZPUk1BVCBkb21haW4sIGlkKSwgICAgICAgICAgICAgZnJhbWVfYmVnaW5fdjMsICBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJXAiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgZnJhbWVfZW5kX3YzLCAgICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkICppZCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElUVF9GT1JNQVQgZG9tYWluLCBpZCksICAgICAgICAgICAgIGZyYW1lX2VuZF92MywgICAgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGZyYW1lX3N1Ym1pdF92MywgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCAqaWQsIF9faXR0X3RpbWVzdGFtcCBiZWdpbiwgX19pdHRfdGltZXN0YW1wIGVuZCksIChJVFRfRk9STUFUIGRvbWFpbiwgaWQsIGJlZ2luLCBlbmQpLCBmcmFtZV9zdWJtaXRfdjMsIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlcCwgJWx1LCAlbHUiKQorI2VuZGlmIC8qIF9fSVRUX0lOVEVSTkFMX0JPRFkgKi8KKworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgdGFza19ncm91cCwgICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkLCBfX2l0dF9pZCBwYXJlbnQsIF9faXR0X3N0cmluZ19oYW5kbGUgKm5hbWUpLCAoSVRUX0ZPUk1BVCBkb21haW4sIGlkLCBwYXJlbnQsIG5hbWUpLCB0YXNrX2dyb3VwLCAgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVsdSwgJWx1LCAlcCIpCisKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHRhc2tfYmVnaW4sICAgIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaWQsIF9faXR0X2lkIHBhcmVudCwgX19pdHRfc3RyaW5nX2hhbmRsZSAqbmFtZSksIChJVFRfRk9STUFUIGRvbWFpbiwgaWQsIHBhcmVudCwgbmFtZSksIHRhc2tfYmVnaW4sICAgIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlbHUsICVsdSwgJXAiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgdGFza19iZWdpbl9mbiwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCwgX19pdHRfaWQgcGFyZW50LCB2b2lkKiBmbiksICAgICAgICAgICAgICAgICAgKElUVF9GT1JNQVQgZG9tYWluLCBpZCwgcGFyZW50LCBmbiksICAgdGFza19iZWdpbl9mbiwgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVsdSwgJWx1LCAlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCB0YXNrX2VuZCwgICAgICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4pLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSVRUX0ZPUk1BVCBkb21haW4pLCAgICAgICAgICAgICAgICAgICB0YXNrX2VuZCwgICAgICBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCIpCisKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGNvdW50ZXJfaW5jX3YzLCAgICAgICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X3N0cmluZ19oYW5kbGUgKm5hbWUpLCAgICAgICAgICAgICAgICAgICAgICAgICAgIChJVFRfRk9STUFUIGRvbWFpbiwgbmFtZSksICAgICAgICBjb3VudGVyX2luY192MywgICAgICAgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGNvdW50ZXJfaW5jX2RlbHRhX3YzLCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X3N0cmluZ19oYW5kbGUgKm5hbWUsIHVuc2lnbmVkIGxvbmcgbG9uZyB2YWx1ZSksIChJVFRfRk9STUFUIGRvbWFpbiwgbmFtZSwgdmFsdWUpLCBjb3VudGVyX2luY19kZWx0YV92MywgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVwLCAlbHUiKQorCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtYXJrZXIsIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaWQsIF9faXR0X3N0cmluZ19oYW5kbGUgKm5hbWUsIF9faXR0X3Njb3BlIHNjb3BlKSwgKElUVF9GT1JNQVQgZG9tYWluLCBpZCwgbmFtZSwgc2NvcGUpLCBtYXJrZXIsIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlbHUsICVwLCAlZCIpCisKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1ldGFkYXRhX2FkZCwgICAgICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlICprZXksIF9faXR0X21ldGFkYXRhX3R5cGUgdHlwZSwgc2l6ZV90IGNvdW50LCB2b2lkICpkYXRhKSwgKElUVF9GT1JNQVQgZG9tYWluLCBpZCwga2V5LCB0eXBlLCBjb3VudCwgZGF0YSksIG1ldGFkYXRhX2FkZCwgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVsdSwgJXAsICVkLCAlbHUsICVwIikKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1ldGFkYXRhX3N0cl9hZGRBLCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlICprZXksIGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBsZW5ndGgpLCAgICAoSVRUX0ZPUk1BVCBkb21haW4sIGlkLCBrZXksIGRhdGEsIGxlbmd0aCksIG1ldGFkYXRhX3N0cl9hZGRBLCBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJWx1LCAlcCwgJXAsICVsdSIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtZXRhZGF0YV9zdHJfYWRkVywgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCwgX19pdHRfc3RyaW5nX2hhbmRsZSAqa2V5LCBjb25zdCB3Y2hhcl90KiBkYXRhLCBzaXplX3QgbGVuZ3RoKSwgKElUVF9GT1JNQVQgZG9tYWluLCBpZCwga2V5LCBkYXRhLCBsZW5ndGgpLCBtZXRhZGF0YV9zdHJfYWRkVywgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVsdSwgJXAsICVwLCAlbHUiKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STSE9SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbWV0YWRhdGFfc3RyX2FkZCwgIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaWQsIF9faXR0X3N0cmluZ19oYW5kbGUgKmtleSwgY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IGxlbmd0aCksICAgIChJVFRfRk9STUFUIGRvbWFpbiwgaWQsIGtleSwgZGF0YSwgbGVuZ3RoKSwgbWV0YWRhdGFfc3RyX2FkZCwgIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlbHUsICVwLCAlcCwgJWx1IikKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgcmVsYXRpb25fYWRkX3RvX2N1cnJlbnQsIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfcmVsYXRpb24gcmVsYXRpb24sIF9faXR0X2lkIHRhaWwpLCAgICAgICAgICAgICAgICAoSVRUX0ZPUk1BVCBkb21haW4sIHJlbGF0aW9uLCB0YWlsKSwgICAgICAgcmVsYXRpb25fYWRkX3RvX2N1cnJlbnQsIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlbHUsICVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHJlbGF0aW9uX2FkZCwgICAgICAgICAgICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGhlYWQsIF9faXR0X3JlbGF0aW9uIHJlbGF0aW9uLCBfX2l0dF9pZCB0YWlsKSwgKElUVF9GT1JNQVQgZG9tYWluLCBoZWFkLCByZWxhdGlvbiwgdGFpbCksIHJlbGF0aW9uX2FkZCwgICAgICAgICAgICBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJXAsICVsdSwgJXAiKQorCisjaWZuZGVmIF9fSVRUX0lOVEVSTkFMX0JPRFkKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCKExJQklUVEFQSSwgX19pdHRfZXZlbnQsIGV2ZW50X2NyZWF0ZUEsIChjb25zdCBjaGFyICAgICpuYW1lLCBpbnQgbmFtZWxlbiksIChJVFRfRk9STUFUIG5hbWUsIG5hbWVsZW4pLCBldmVudF9jcmVhdGVBLCBfX2l0dF9ncm91cF9tYXJrIHwgX19pdHRfZ3JvdXBfbGVnYWN5LCAiXCIlc1wiLCAlZCIpCitJVFRfU1RVQihMSUJJVFRBUEksIF9faXR0X2V2ZW50LCBldmVudF9jcmVhdGVXLCAoY29uc3Qgd2NoYXJfdCAqbmFtZSwgaW50IG5hbWVsZW4pLCAoSVRUX0ZPUk1BVCBuYW1lLCBuYW1lbGVuKSwgZXZlbnRfY3JlYXRlVywgX19pdHRfZ3JvdXBfbWFyayB8IF9faXR0X2dyb3VwX2xlZ2FjeSwgIlwiJVNcIiwgJWQiKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STSE9SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUIoTElCSVRUQVBJLCBfX2l0dF9ldmVudCwgZXZlbnRfY3JlYXRlLCAgKGNvbnN0IGNoYXIgICAgKm5hbWUsIGludCBuYW1lbGVuKSwgKElUVF9GT1JNQVQgbmFtZSwgbmFtZWxlbiksIGV2ZW50X2NyZWF0ZSwgIF9faXR0X2dyb3VwX21hcmsgfCBfX2l0dF9ncm91cF9sZWdhY3ksICJcIiVzXCIsICVkIikKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCKExJQklUVEFQSSwgaW50LCAgZXZlbnRfc3RhcnQsICAgICAgICAgIChfX2l0dF9ldmVudCBldmVudCksICAgICAgICAgICAgICAgIChJVFRfRk9STUFUIGV2ZW50KSwgICAgICAgICBldmVudF9zdGFydCwgICBfX2l0dF9ncm91cF9tYXJrIHwgX19pdHRfZ3JvdXBfbGVnYWN5LCAiJWQiKQorSVRUX1NUVUIoTElCSVRUQVBJLCBpbnQsICBldmVudF9lbmQsICAgICAgICAgICAgKF9faXR0X2V2ZW50IGV2ZW50KSwgICAgICAgICAgICAgICAgKElUVF9GT1JNQVQgZXZlbnQpLCAgICAgICAgIGV2ZW50X2VuZCwgICAgIF9faXR0X2dyb3VwX21hcmsgfCBfX2l0dF9ncm91cF9sZWdhY3ksICIlZCIpCisjZW5kaWYgLyogX19JVFRfSU5URVJOQUxfQk9EWSAqLworCisjaWZuZGVmIF9fSVRUX0lOVEVSTkFMX0JPRFkKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN5bmNfc2V0X25hbWVBLCAodm9pZCAqYWRkciwgY29uc3QgY2hhciAgICAqb2JqdHlwZSwgY29uc3QgY2hhciAgICAqb2JqbmFtZSwgaW50IGF0dHJpYnV0ZSksIChJVFRfRk9STUFUIGFkZHIsIG9ianR5cGUsIG9iam5hbWUsIGF0dHJpYnV0ZSksIHN5bmNfc2V0X25hbWVBLCBfX2l0dF9ncm91cF9zeW5jIHwgX19pdHRfZ3JvdXBfZnN5bmMgfCBfX2l0dF9ncm91cF9sZWdhY3ksICIlcCwgXCIlc1wiLCBcIiVzXCIsICV4IikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN5bmNfc2V0X25hbWVXLCAodm9pZCAqYWRkciwgY29uc3Qgd2NoYXJfdCAqb2JqdHlwZSwgY29uc3Qgd2NoYXJfdCAqb2JqbmFtZSwgaW50IGF0dHJpYnV0ZSksIChJVFRfRk9STUFUIGFkZHIsIG9ianR5cGUsIG9iam5hbWUsIGF0dHJpYnV0ZSksIHN5bmNfc2V0X25hbWVXLCBfX2l0dF9ncm91cF9zeW5jIHwgX19pdHRfZ3JvdXBfZnN5bmMgfCBfX2l0dF9ncm91cF9sZWdhY3ksICIlcCwgXCIlU1wiLCBcIiVTXCIsICV4IikKKyNlbHNlICAvKiBJVFRfUExBVEZPUk0hPUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN5bmNfc2V0X25hbWUsICAodm9pZCAqYWRkciwgY29uc3QgY2hhciAgICAqb2JqdHlwZSwgY29uc3QgY2hhciAgICAqb2JqbmFtZSwgaW50IGF0dHJpYnV0ZSksIChJVFRfRk9STUFUIGFkZHIsIG9ianR5cGUsIG9iam5hbWUsIGF0dHJpYnV0ZSksIHN5bmNfc2V0X25hbWUsICBfX2l0dF9ncm91cF9zeW5jIHwgX19pdHRfZ3JvdXBfZnN5bmMgfCBfX2l0dF9ncm91cF9sZWdhY3ksICJwLCBcIiVzXCIsIFwiJXNcIiwgJXgiKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQihMSUJJVFRBUEksIGludCwgbm90aWZ5X3N5bmNfbmFtZUEsICh2b2lkICpwLCBjb25zdCBjaGFyICAgICpvYmp0eXBlLCBpbnQgdHlwZWxlbiwgY29uc3QgY2hhciAgICAqb2JqbmFtZSwgaW50IG5hbWVsZW4sIGludCBhdHRyaWJ1dGUpLCAoSVRUX0ZPUk1BVCBwLCBvYmp0eXBlLCB0eXBlbGVuLCBvYmpuYW1lLCBuYW1lbGVuLCBhdHRyaWJ1dGUpLCBub3RpZnlfc3luY19uYW1lQSwgX19pdHRfZ3JvdXBfc3luYyB8IF9faXR0X2dyb3VwX2ZzeW5jIHwgX19pdHRfZ3JvdXBfbGVnYWN5LCAiJXAsIFwiJXNcIiwgJWQsIFwiJXNcIiwgJWQsICV4IikKK0lUVF9TVFVCKExJQklUVEFQSSwgaW50LCBub3RpZnlfc3luY19uYW1lVywgKHZvaWQgKnAsIGNvbnN0IHdjaGFyX3QgKm9ianR5cGUsIGludCB0eXBlbGVuLCBjb25zdCB3Y2hhcl90ICpvYmpuYW1lLCBpbnQgbmFtZWxlbiwgaW50IGF0dHJpYnV0ZSksIChJVFRfRk9STUFUIHAsIG9ianR5cGUsIHR5cGVsZW4sIG9iam5hbWUsIG5hbWVsZW4sIGF0dHJpYnV0ZSksIG5vdGlmeV9zeW5jX25hbWVXLCBfX2l0dF9ncm91cF9zeW5jIHwgX19pdHRfZ3JvdXBfZnN5bmMgfCBfX2l0dF9ncm91cF9sZWdhY3ksICIlcCwgXCIlU1wiLCAlZCwgXCIlU1wiLCAlZCwgJXgiKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STSE9SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUIoTElCSVRUQVBJLCBpbnQsIG5vdGlmeV9zeW5jX25hbWUsICAodm9pZCAqcCwgY29uc3QgY2hhciAgICAqb2JqdHlwZSwgaW50IHR5cGVsZW4sIGNvbnN0IGNoYXIgICAgKm9iam5hbWUsIGludCBuYW1lbGVuLCBpbnQgYXR0cmlidXRlKSwgKElUVF9GT1JNQVQgcCwgb2JqdHlwZSwgdHlwZWxlbiwgb2JqbmFtZSwgbmFtZWxlbiwgYXR0cmlidXRlKSwgbm90aWZ5X3N5bmNfbmFtZSwgIF9faXR0X2dyb3VwX3N5bmMgfCBfX2l0dF9ncm91cF9mc3luYyB8IF9faXR0X2dyb3VwX2xlZ2FjeSwgIiVwLCBcIiVzXCIsICVkLCBcIiVzXCIsICVkLCAleCIpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKK0lUVF9TVFVCVihMSUJJVFRBUEksIHZvaWQsIG5vdGlmeV9zeW5jX3ByZXBhcmUsICAgKHZvaWQgKnApLCAoSVRUX0ZPUk1BVCBwKSwgbm90aWZ5X3N5bmNfcHJlcGFyZSwgICBfX2l0dF9ncm91cF9zeW5jIHwgX19pdHRfZ3JvdXBfZnN5bmMgfCBfX2l0dF9ncm91cF9sZWdhY3ksICIlcCIpCitJVFRfU1RVQlYoTElCSVRUQVBJLCB2b2lkLCBub3RpZnlfc3luY19jYW5jZWwsICAgICh2b2lkICpwKSwgKElUVF9GT1JNQVQgcCksIG5vdGlmeV9zeW5jX2NhbmNlbCwgICAgX19pdHRfZ3JvdXBfc3luYyB8IF9faXR0X2dyb3VwX2ZzeW5jIHwgX19pdHRfZ3JvdXBfbGVnYWN5LCAiJXAiKQorSVRUX1NUVUJWKExJQklUVEFQSSwgdm9pZCwgbm90aWZ5X3N5bmNfYWNxdWlyZWQsICAodm9pZCAqcCksIChJVFRfRk9STUFUIHApLCBub3RpZnlfc3luY19hY3F1aXJlZCwgIF9faXR0X2dyb3VwX3N5bmMgfCBfX2l0dF9ncm91cF9mc3luYyB8IF9faXR0X2dyb3VwX2xlZ2FjeSwgIiVwIikKK0lUVF9TVFVCVihMSUJJVFRBUEksIHZvaWQsIG5vdGlmeV9zeW5jX3JlbGVhc2luZywgKHZvaWQgKnApLCAoSVRUX0ZPUk1BVCBwKSwgbm90aWZ5X3N5bmNfcmVsZWFzaW5nLCBfX2l0dF9ncm91cF9zeW5jIHwgX19pdHRfZ3JvdXBfZnN5bmMgfCBfX2l0dF9ncm91cF9sZWdhY3ksICIlcCIpCisjZW5kaWYgLyogX19JVFRfSU5URVJOQUxfQk9EWSAqLworCitJVFRfU1RVQlYoTElCSVRUQVBJLCB2b2lkLCBtZW1vcnlfcmVhZCwgICAodm9pZCAqYWRkciwgc2l6ZV90IHNpemUpLCAoSVRUX0ZPUk1BVCBhZGRyLCBzaXplKSwgbWVtb3J5X3JlYWQsICAgX19pdHRfZ3JvdXBfbGVnYWN5LCAiJXAsICVsdSIpCitJVFRfU1RVQlYoTElCSVRUQVBJLCB2b2lkLCBtZW1vcnlfd3JpdGUsICAodm9pZCAqYWRkciwgc2l6ZV90IHNpemUpLCAoSVRUX0ZPUk1BVCBhZGRyLCBzaXplKSwgbWVtb3J5X3dyaXRlLCAgX19pdHRfZ3JvdXBfbGVnYWN5LCAiJXAsICVsdSIpCitJVFRfU1RVQlYoTElCSVRUQVBJLCB2b2lkLCBtZW1vcnlfdXBkYXRlLCAodm9pZCAqYWRkciwgc2l6ZV90IHNpemUpLCAoSVRUX0ZPUk1BVCBhZGRyLCBzaXplKSwgbWVtb3J5X3VwZGF0ZSwgX19pdHRfZ3JvdXBfbGVnYWN5LCAiJXAsICVsdSIpCisKK0lUVF9TVFVCKExJQklUVEFQSSwgX19pdHRfc3RhdGVfdCwgICAgIHN0YXRlX2dldCwgICAgKHZvaWQpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJVFRfTk9fUEFSQU1TKSwgICBzdGF0ZV9nZXQsICAgIF9faXR0X2dyb3VwX2xlZ2FjeSwgIm5vIGFyZ3MiKQorSVRUX1NUVUIoTElCSVRUQVBJLCBfX2l0dF9zdGF0ZV90LCAgICAgc3RhdGVfc2V0LCAgICAoX19pdHRfc3RhdGVfdCBzKSwgICAgICAgICAgICAgICAgICAgICAgICAgKElUVF9GT1JNQVQgcyksICAgIHN0YXRlX3NldCwgICAgX19pdHRfZ3JvdXBfbGVnYWN5LCAiJWQiKQorSVRUX1NUVUIoTElCSVRUQVBJLCBfX2l0dF9vYmpfc3RhdGVfdCwgb2JqX21vZGVfc2V0LCAoX19pdHRfb2JqX3Byb3BfdCBwLCBfX2l0dF9vYmpfc3RhdGVfdCBzKSwgKElUVF9GT1JNQVQgcCwgcyksIG9ial9tb2RlX3NldCwgX19pdHRfZ3JvdXBfbGVnYWN5LCAiJWQsICVkIikKK0lUVF9TVFVCKExJQklUVEFQSSwgX19pdHRfdGhyX3N0YXRlX3QsIHRocl9tb2RlX3NldCwgKF9faXR0X3Rocl9wcm9wX3QgcCwgX19pdHRfdGhyX3N0YXRlX3QgcyksIChJVFRfRk9STUFUIHAsIHMpLCB0aHJfbW9kZV9zZXQsIF9faXR0X2dyb3VwX2xlZ2FjeSwgIiVkLCAlZCIpCisKKyNpZm5kZWYgX19JVFRfSU5URVJOQUxfQk9EWQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9mcmFtZSwgZnJhbWVfY3JlYXRlQSwgKGNvbnN0IGNoYXIgICAgKmRvbWFpbiksIChJVFRfRk9STUFUIGRvbWFpbiksIGZyYW1lX2NyZWF0ZUEsIF9faXR0X2dyb3VwX2ZyYW1lLCAiXCIlc1wiIikKK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfZnJhbWUsIGZyYW1lX2NyZWF0ZVcsIChjb25zdCB3Y2hhcl90ICpkb21haW4pLCAoSVRUX0ZPUk1BVCBkb21haW4pLCBmcmFtZV9jcmVhdGVXLCBfX2l0dF9ncm91cF9mcmFtZSwgIlwiJXNcIiIpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQihJVFRBUEksIF9faXR0X2ZyYW1lLCBmcmFtZV9jcmVhdGUsICAoY29uc3QgY2hhciAgICAqZG9tYWluKSwgKElUVF9GT1JNQVQgZG9tYWluKSwgZnJhbWVfY3JlYXRlLCAgX19pdHRfZ3JvdXBfZnJhbWUsICJcIiVzXCIiKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIF9fSVRUX0lOVEVSTkFMX0JPRFkgKi8KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGZyYW1lX2JlZ2luLCAgICAgICAgIChfX2l0dF9mcmFtZSBmcmFtZSksICAgICAoSVRUX0ZPUk1BVCBmcmFtZSksICBmcmFtZV9iZWdpbiwgICBfX2l0dF9ncm91cF9mcmFtZSwgIiVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGZyYW1lX2VuZCwgICAgICAgICAgIChfX2l0dF9mcmFtZSBmcmFtZSksICAgICAoSVRUX0ZPUk1BVCBmcmFtZSksICBmcmFtZV9lbmQsICAgICBfX2l0dF9ncm91cF9mcmFtZSwgIiVwIikKKworI2lmbmRlZiBfX0lUVF9JTlRFUk5BTF9CT0RZCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQihJVFRBUEksIF9faXR0X2NvdW50ZXIsIGNvdW50ZXJfY3JlYXRlQSwgKGNvbnN0IGNoYXIgICAgKm5hbWUsIGNvbnN0IGNoYXIgICAgKmRvbWFpbiksIChJVFRfRk9STUFUIG5hbWUsIGRvbWFpbiksIGNvdW50ZXJfY3JlYXRlQSwgX19pdHRfZ3JvdXBfY291bnRlciwgIlwiJXNcIiwgXCIlc1wiIikKK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfY291bnRlciwgY291bnRlcl9jcmVhdGVXLCAoY29uc3Qgd2NoYXJfdCAqbmFtZSwgY29uc3Qgd2NoYXJfdCAqZG9tYWluKSwgKElUVF9GT1JNQVQgbmFtZSwgZG9tYWluKSwgY291bnRlcl9jcmVhdGVXLCBfX2l0dF9ncm91cF9jb3VudGVyLCAiXCIlc1wiLCBcIiVzXCIiKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9jb3VudGVyLCBjb3VudGVyX2NyZWF0ZSwgIChjb25zdCBjaGFyICAgICpuYW1lLCBjb25zdCBjaGFyICAgICpkb21haW4pLCAoSVRUX0ZPUk1BVCBuYW1lLCBkb21haW4pLCBjb3VudGVyX2NyZWF0ZSwgIF9faXR0X2dyb3VwX2NvdW50ZXIsICJcIiVzXCIsIFwiJXNcIiIpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogX19JVFRfSU5URVJOQUxfQk9EWSAqLworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgY291bnRlcl9kZXN0cm95LCAgIChfX2l0dF9jb3VudGVyIGlkKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAoSVRUX0ZPUk1BVCBpZCksICAgICAgICBjb3VudGVyX2Rlc3Ryb3ksICAgX19pdHRfZ3JvdXBfY291bnRlciwgIiVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGNvdW50ZXJfaW5jLCAgICAgICAoX19pdHRfY291bnRlciBpZCksICAgICAgICAgICAgICAgICAgICAgICAgICAgKElUVF9GT1JNQVQgaWQpLCAgICAgICAgY291bnRlcl9pbmMsICAgICAgIF9faXR0X2dyb3VwX2NvdW50ZXIsICIlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBjb3VudGVyX2luY19kZWx0YSwgKF9faXR0X2NvdW50ZXIgaWQsIHVuc2lnbmVkIGxvbmcgbG9uZyB2YWx1ZSksIChJVFRfRk9STUFUIGlkLCB2YWx1ZSksIGNvdW50ZXJfaW5jX2RlbHRhLCBfX2l0dF9ncm91cF9jb3VudGVyLCAiJXAsICVsdSIpCisKKyNpZm5kZWYgX19JVFRfSU5URVJOQUxfQk9EWQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9tYXJrX3R5cGUsIG1hcmtfY3JlYXRlQSwgKGNvbnN0IGNoYXIgICAgKm5hbWUpLCAoSVRUX0ZPUk1BVCBuYW1lKSwgbWFya19jcmVhdGVBLCBfX2l0dF9ncm91cF9tYXJrLCAiXCIlc1wiIikKK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfbWFya190eXBlLCBtYXJrX2NyZWF0ZVcsIChjb25zdCB3Y2hhcl90ICpuYW1lKSwgKElUVF9GT1JNQVQgbmFtZSksIG1hcmtfY3JlYXRlVywgX19pdHRfZ3JvdXBfbWFyaywgIlwiJVNcIiIpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNIT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQihJVFRBUEksIF9faXR0X21hcmtfdHlwZSwgbWFya19jcmVhdGUsICAoY29uc3QgY2hhciAgICAqbmFtZSksIChJVFRfRk9STUFUIG5hbWUpLCBtYXJrX2NyZWF0ZSwgIF9faXR0X2dyb3VwX21hcmssICJcIiVzXCIiKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIF9fSVRUX0lOVEVSTkFMX0JPRFkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCKElUVEFQSSwgaW50LCAgbWFya0EsICAgICAgICAoX19pdHRfbWFya190eXBlIG10LCBjb25zdCBjaGFyICAgICpwYXJhbWV0ZXIpLCAoSVRUX0ZPUk1BVCBtdCwgcGFyYW1ldGVyKSwgbWFya0EsIF9faXR0X2dyb3VwX21hcmssICIlZCwgXCIlc1wiIikKK0lUVF9TVFVCKElUVEFQSSwgaW50LCAgbWFya1csICAgICAgICAoX19pdHRfbWFya190eXBlIG10LCBjb25zdCB3Y2hhcl90ICpwYXJhbWV0ZXIpLCAoSVRUX0ZPUk1BVCBtdCwgcGFyYW1ldGVyKSwgbWFya1csIF9faXR0X2dyb3VwX21hcmssICIlZCwgXCIlU1wiIikKKyNlbHNlICAvKiBJVFRfUExBVEZPUk0hPUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCKElUVEFQSSwgaW50LCAgbWFyaywgICAgICAgICAoX19pdHRfbWFya190eXBlIG10LCBjb25zdCBjaGFyICAgICpwYXJhbWV0ZXIpLCAoSVRUX0ZPUk1BVCBtdCwgcGFyYW1ldGVyKSwgbWFyaywgIF9faXR0X2dyb3VwX21hcmssICIlZCwgXCIlc1wiIikKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCKElUVEFQSSwgaW50LCAgbWFya19vZmYsIChfX2l0dF9tYXJrX3R5cGUgbXQpLCAoSVRUX0ZPUk1BVCBtdCksIG1hcmtfb2ZmLCBfX2l0dF9ncm91cF9tYXJrLCAiJWQiKQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUIoSVRUQVBJLCBpbnQsICBtYXJrX2dsb2JhbEEsIChfX2l0dF9tYXJrX3R5cGUgbXQsIGNvbnN0IGNoYXIgICAgKnBhcmFtZXRlciksIChJVFRfRk9STUFUIG10LCBwYXJhbWV0ZXIpLCBtYXJrX2dsb2JhbEEsIF9faXR0X2dyb3VwX21hcmssICIlZCwgXCIlc1wiIikKK0lUVF9TVFVCKElUVEFQSSwgaW50LCAgbWFya19nbG9iYWxXLCAoX19pdHRfbWFya190eXBlIG10LCBjb25zdCB3Y2hhcl90ICpwYXJhbWV0ZXIpLCAoSVRUX0ZPUk1BVCBtdCwgcGFyYW1ldGVyKSwgbWFya19nbG9iYWxXLCBfX2l0dF9ncm91cF9tYXJrLCAiJWQsIFwiJVNcIiIpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNIT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQihJVFRBUEksIGludCwgIG1hcmtfZ2xvYmFsLCAgKF9faXR0X21hcmtfdHlwZSBtdCwgY29uc3QgY2hhciAgICAqcGFyYW1ldGVyKSwgKElUVF9GT1JNQVQgbXQsIHBhcmFtZXRlciksIG1hcmtfZ2xvYmFsLCAgX19pdHRfZ3JvdXBfbWFyaywgIiVkLCBcIiVTXCIiKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUIoSVRUQVBJLCBpbnQsICBtYXJrX2dsb2JhbF9vZmYsIChfX2l0dF9tYXJrX3R5cGUgbXQpLCAgICAgICAgICAgICAgICAgICAgICAgIChJVFRfRk9STUFUIG10KSwgICAgICAgICAgICBtYXJrX2dsb2JhbF9vZmYsIF9faXR0X2dyb3VwX21hcmssICIlZCIpCisKKyNpZm5kZWYgX19JVFRfSU5URVJOQUxfQk9EWQorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9jYWxsZXIsIHN0YWNrX2NhbGxlcl9jcmVhdGUsICh2b2lkKSwgKElUVF9OT19QQVJBTVMpLCBzdGFja19jYWxsZXJfY3JlYXRlLCAgX19pdHRfZ3JvdXBfc3RpdGNoLCAibm8gYXJncyIpCisjZW5kaWYgLyogX19JVFRfSU5URVJOQUxfQk9EWSAqLworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3RhY2tfY2FsbGVyX2Rlc3Ryb3ksIChfX2l0dF9jYWxsZXIgaWQpLCAoSVRUX0ZPUk1BVCBpZCksIHN0YWNrX2NhbGxlcl9kZXN0cm95LCBfX2l0dF9ncm91cF9zdGl0Y2gsICIlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzdGFja19jYWxsZWVfZW50ZXIsICAgKF9faXR0X2NhbGxlciBpZCksIChJVFRfRk9STUFUIGlkKSwgc3RhY2tfY2FsbGVlX2VudGVyLCAgIF9faXR0X2dyb3VwX3N0aXRjaCwgIiVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN0YWNrX2NhbGxlZV9sZWF2ZSwgICAoX19pdHRfY2FsbGVyIGlkKSwgKElUVF9GT1JNQVQgaWQpLCBzdGFja19jYWxsZWVfbGVhdmUsICAgX19pdHRfZ3JvdXBfc3RpdGNoLCAiJXAiKQorCitJVFRfU1RVQihJVFRBUEksICBfX2l0dF9jbG9ja19kb21haW4qLCBjbG9ja19kb21haW5fY3JlYXRlLCAoX19pdHRfZ2V0X2Nsb2NrX2luZm9fZm4gZm4sIHZvaWQqIGZuX2RhdGEpLCAoSVRUX0ZPUk1BVCBmbiwgZm5fZGF0YSksIGNsb2NrX2RvbWFpbl9jcmVhdGUsIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCAgICAgICAgICAgICAgICBjbG9ja19kb21haW5fcmVzZXQsICAodm9pZCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSVRUX05PX1BBUkFNUyksICAgICAgICAgIGNsb2NrX2RvbWFpbl9yZXNldCwgIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIm5vIGFyZ3MiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgaWRfY3JlYXRlX2V4LCAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9jbG9ja19kb21haW4qIGNsb2NrX2RvbWFpbiwgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcCwgX19pdHRfaWQgaWQpLCAoSVRUX0ZPUk1BVCBkb21haW4sIGNsb2NrX2RvbWFpbiwgdGltZXN0YW1wLCBpZCksIGlkX2NyZWF0ZV9leCwgIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlcCwgJWx1LCAlbHUiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgaWRfZGVzdHJveV9leCwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9jbG9ja19kb21haW4qIGNsb2NrX2RvbWFpbiwgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcCwgX19pdHRfaWQgaWQpLCAoSVRUX0ZPUk1BVCBkb21haW4sIGNsb2NrX2RvbWFpbiwgdGltZXN0YW1wLCBpZCksIGlkX2Rlc3Ryb3lfZXgsIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlcCwgJWx1LCAlbHUiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgdGFza19iZWdpbl9leCwgICAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9jbG9ja19kb21haW4qIGNsb2NrX2RvbWFpbiwgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcCwgX19pdHRfaWQgaWQsIF9faXR0X2lkIHBhcmVudGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlICpuYW1lKSwgKElUVF9GT1JNQVQgZG9tYWluLCBjbG9ja19kb21haW4sIHRpbWVzdGFtcCwgaWQsIHBhcmVudGlkLCBuYW1lKSwgdGFza19iZWdpbl9leCwgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVwLCAlbHUsICVsdSwgJWx1LCAlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCB0YXNrX2JlZ2luX2ZuX2V4LCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2Nsb2NrX2RvbWFpbiogY2xvY2tfZG9tYWluLCB1bnNpZ25lZCBsb25nIGxvbmcgdGltZXN0YW1wLCBfX2l0dF9pZCBpZCwgX19pdHRfaWQgcGFyZW50aWQsIHZvaWQqIGZuKSwgICAgICAgICAgICAgICAgICAoSVRUX0ZPUk1BVCBkb21haW4sIGNsb2NrX2RvbWFpbiwgdGltZXN0YW1wLCBpZCwgcGFyZW50aWQsIGZuKSwgdGFza19iZWdpbl9mbl9leCwgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVwLCAlbHUsICVsdSwgJWx1LCAlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCB0YXNrX2VuZF9leCwgICAgICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2Nsb2NrX2RvbWFpbiogY2xvY2tfZG9tYWluLCB1bnNpZ25lZCBsb25nIGxvbmcgdGltZXN0YW1wKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSVRUX0ZPUk1BVCBkb21haW4sIGNsb2NrX2RvbWFpbiwgdGltZXN0YW1wKSwgdGFza19lbmRfZXgsIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlcCwgJWx1IikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHRhc2tfYmVnaW5fb3ZlcmxhcHBlZCwgICAgICAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCwgX19pdHRfaWQgcGFyZW50LCBfX2l0dF9zdHJpbmdfaGFuZGxlICpuYW1lKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElUVF9GT1JNQVQgZG9tYWluLCBpZCwgcGFyZW50LCBuYW1lKSwgdGFza19iZWdpbl9vdmVybGFwcGVkLCBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJWx1LCAlbHUsICVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHRhc2tfYmVnaW5fb3ZlcmxhcHBlZF9leCwgICAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9jbG9ja19kb21haW4qIGNsb2NrX2RvbWFpbiwgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcCwgX19pdHRfaWQgaWQsIF9faXR0X2lkIHBhcmVudGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlICpuYW1lKSwgKElUVF9GT1JNQVQgZG9tYWluLCBjbG9ja19kb21haW4sIHRpbWVzdGFtcCwgaWQsIHBhcmVudGlkLCBuYW1lKSwgdGFza19iZWdpbl9vdmVybGFwcGVkX2V4LCBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJXAsICVsdSwgJWx1LCAlbHUsICVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHRhc2tfZW5kX292ZXJsYXBwZWQsIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaWQpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElUVF9GT1JNQVQgZG9tYWluLCBpZCksIHRhc2tfZW5kX292ZXJsYXBwZWQsIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlbHUiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgdGFza19lbmRfb3ZlcmxhcHBlZF9leCwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9jbG9ja19kb21haW4qIGNsb2NrX2RvbWFpbiwgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcCwgX19pdHRfaWQgaWQpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSVRUX0ZPUk1BVCBkb21haW4sIGNsb2NrX2RvbWFpbiwgdGltZXN0YW1wLCBpZCksIHRhc2tfZW5kX292ZXJsYXBwZWRfZXgsIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlcCwgJWx1LCAlbHUiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbWFya2VyX2V4LCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2Nsb2NrX2RvbWFpbiogY2xvY2tfZG9tYWluLCB1bnNpZ25lZCBsb25nIGxvbmcgdGltZXN0YW1wLCBfX2l0dF9pZCBpZCwgX19pdHRfc3RyaW5nX2hhbmRsZSAqbmFtZSwgX19pdHRfc2NvcGUgc2NvcGUpLCAoSVRUX0ZPUk1BVCBkb21haW4sIGNsb2NrX2RvbWFpbiwgdGltZXN0YW1wLCBpZCwgbmFtZSwgc2NvcGUpLCBtYXJrZXJfZXgsIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlcCwgJWx1LCAlbHUsICVwLCAlZCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtZXRhZGF0YV9hZGRfd2l0aF9zY29wZSwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9zY29wZSBzY29wZSwgX19pdHRfc3RyaW5nX2hhbmRsZSAqa2V5LCBfX2l0dF9tZXRhZGF0YV90eXBlIHR5cGUsIHNpemVfdCBjb3VudCwgdm9pZCAqZGF0YSksIChJVFRfRk9STUFUIGRvbWFpbiwgc2NvcGUsIGtleSwgdHlwZSwgY291bnQsIGRhdGEpLCBtZXRhZGF0YV9hZGRfd2l0aF9zY29wZSwgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVkLCAlcCwgJWQsICVsdSwgJXAiKQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlQSwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9zY29wZSBzY29wZSwgX19pdHRfc3RyaW5nX2hhbmRsZSAqa2V5LCBjb25zdCBjaGFyICpkYXRhLCBzaXplX3QgbGVuZ3RoKSwgICAgKElUVF9GT1JNQVQgZG9tYWluLCBzY29wZSwga2V5LCBkYXRhLCBsZW5ndGgpLCBtZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGVBLCBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJWQsICVwLCAlcCwgJWx1IikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZVcsIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfc2NvcGUgc2NvcGUsIF9faXR0X3N0cmluZ19oYW5kbGUgKmtleSwgY29uc3Qgd2NoYXJfdCAqZGF0YSwgc2l6ZV90IGxlbmd0aCksIChJVFRfRk9STUFUIGRvbWFpbiwgc2NvcGUsIGtleSwgZGF0YSwgbGVuZ3RoKSwgbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlVywgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVkLCAlcCwgJXAsICVsdSIpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNIT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGUsICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X3Njb3BlIHNjb3BlLCBfX2l0dF9zdHJpbmdfaGFuZGxlICprZXksIGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBsZW5ndGgpLCAgICAoSVRUX0ZPUk1BVCBkb21haW4sIHNjb3BlLCBrZXksIGRhdGEsIGxlbmd0aCksIG1ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZSwgIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlZCwgJXAsICVwLCAlbHUiKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgcmVsYXRpb25fYWRkX3RvX2N1cnJlbnRfZXgsIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfY2xvY2tfZG9tYWluKiBjbG9ja19kb21haW4sIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXAsIF9faXR0X3JlbGF0aW9uIHJlbGF0aW9uLCBfX2l0dF9pZCB0YWlsKSwgICAgICAgICAgICAgICAgKElUVF9GT1JNQVQgZG9tYWluLCBjbG9ja19kb21haW4sIHRpbWVzdGFtcCwgcmVsYXRpb24sIHRhaWwpLCAgICAgICByZWxhdGlvbl9hZGRfdG9fY3VycmVudF9leCwgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVwLCAlbHUsICVkLCAlbHUiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgcmVsYXRpb25fYWRkX2V4LCAgICAgICAgICAgIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfY2xvY2tfZG9tYWluKiBjbG9ja19kb21haW4sIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXAsIF9faXR0X2lkIGhlYWQsIF9faXR0X3JlbGF0aW9uIHJlbGF0aW9uLCBfX2l0dF9pZCB0YWlsKSwgKElUVF9GT1JNQVQgZG9tYWluLCBjbG9ja19kb21haW4sIHRpbWVzdGFtcCwgaGVhZCwgcmVsYXRpb24sIHRhaWwpLCByZWxhdGlvbl9hZGRfZXgsICAgICAgICAgICAgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVwLCAlbHUsICVsdSwgJWQsICVsdSIpCitJVFRfU1RVQihJVFRBUEksICBfX2l0dF90cmFja19ncm91cCosIHRyYWNrX2dyb3VwX2NyZWF0ZSwgKF9faXR0X3N0cmluZ19oYW5kbGUqIG5hbWUsIF9faXR0X3RyYWNrX2dyb3VwX3R5cGUgdHJhY2tfZ3JvdXBfdHlwZSksICAgICAgICAgICAgICAgICAgICAoSVRUX0ZPUk1BVCBuYW1lLCB0cmFja19ncm91cF90eXBlKSwgICAgICAgIHRyYWNrX2dyb3VwX2NyZWF0ZSwgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVkIikKK0lUVF9TVFVCKElUVEFQSSwgIF9faXR0X3RyYWNrKiwgICAgICAgdHJhY2tfY3JlYXRlLCAgICAgICAoX19pdHRfdHJhY2tfZ3JvdXAqIHRyYWNrX2dyb3VwLF9faXR0X3N0cmluZ19oYW5kbGUqIG5hbWUsIF9faXR0X3RyYWNrX3R5cGUgdHJhY2tfdHlwZSksIChJVFRfRk9STUFUIHRyYWNrX2dyb3VwLCBuYW1lLCB0cmFja190eXBlKSwgdHJhY2tfY3JlYXRlLCAgICAgICBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJXAsICVkIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsICAgICAgICAgICAgICAgc2V0X3RyYWNrLCAgICAgICAgICAoX19pdHRfdHJhY2sgKnRyYWNrKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJVFRfRk9STUFUIHRyYWNrKSwgICAgICAgICAgICAgICAgICAgICAgICAgc2V0X3RyYWNrLCAgICAgICAgICBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCIpCisKKyNpZm5kZWYgX19JVFRfSU5URVJOQUxfQk9EWQorSVRUX1NUVUIoSVRUQVBJLCBjb25zdCBjaGFyKiwgYXBpX3ZlcnNpb24sICh2b2lkKSwgKElUVF9OT19QQVJBTVMpLCBhcGlfdmVyc2lvbiwgX19pdHRfZ3JvdXBfYWxsICYgfl9faXR0X2dyb3VwX2xlZ2FjeSwgIm5vIGFyZ3MiKQorI2VuZGlmIC8qIF9fSVRUX0lOVEVSTkFMX0JPRFkgKi8KKworI2lmbmRlZiBfX0lUVF9JTlRFUk5BTF9CT0RZCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQihJVFRBUEksIGludCwgYXZfc2F2ZUEsICh2b2lkICpkYXRhLCBpbnQgcmFuaywgY29uc3QgaW50ICpkaW1lbnNpb25zLCBpbnQgdHlwZSwgY29uc3QgY2hhciAqZmlsZVBhdGgsIGludCBjb2x1bW5PcmRlciksIChJVFRfRk9STUFUIGRhdGEsIHJhbmssIGRpbWVuc2lvbnMsIHR5cGUsIGZpbGVQYXRoLCBjb2x1bW5PcmRlciksIGF2X3NhdmVBLCBfX2l0dF9ncm91cF9hcnJheXMsICIlcCwgJWQsICVwLCAlZCwgXCIlc1wiLCAlZCIpCitJVFRfU1RVQihJVFRBUEksIGludCwgYXZfc2F2ZVcsICh2b2lkICpkYXRhLCBpbnQgcmFuaywgY29uc3QgaW50ICpkaW1lbnNpb25zLCBpbnQgdHlwZSwgY29uc3Qgd2NoYXJfdCAqZmlsZVBhdGgsIGludCBjb2x1bW5PcmRlciksIChJVFRfRk9STUFUIGRhdGEsIHJhbmssIGRpbWVuc2lvbnMsIHR5cGUsIGZpbGVQYXRoLCBjb2x1bW5PcmRlciksIGF2X3NhdmVXLCBfX2l0dF9ncm91cF9hcnJheXMsICIlcCwgJWQsICVwLCAlZCwgXCIlU1wiLCAlZCIpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNIT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQihJVFRBUEksIGludCwgYXZfc2F2ZSwgICh2b2lkICpkYXRhLCBpbnQgcmFuaywgY29uc3QgaW50ICpkaW1lbnNpb25zLCBpbnQgdHlwZSwgY29uc3QgY2hhciAqZmlsZVBhdGgsIGludCBjb2x1bW5PcmRlciksIChJVFRfRk9STUFUIGRhdGEsIHJhbmssIGRpbWVuc2lvbnMsIHR5cGUsIGZpbGVQYXRoLCBjb2x1bW5PcmRlciksIGF2X3NhdmUsICBfX2l0dF9ncm91cF9hcnJheXMsICIlcCwgJWQsICVwLCAlZCwgXCIlc1wiLCAlZCIpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogX19JVFRfSU5URVJOQUxfQk9EWSAqLworCisjZW5kaWYgLyogX19JVFRfSU5URVJOQUxfSU5JVCAqLwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMvdGhpcmRwYXJ0eS9pdHRub3RpZnkvaXR0bm90aWZ5X3R5cGVzLmggYi9maW5hbC9ydW50aW1lL3NyYy90aGlyZHBhcnR5L2l0dG5vdGlmeS9pdHRub3RpZnlfdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjk1YTY3Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMvdGhpcmRwYXJ0eS9pdHRub3RpZnkvaXR0bm90aWZ5X3R5cGVzLmgKQEAgLTAsMCArMSw2NyBAQAorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIF9JVFROT1RJRllfVFlQRVNfSF8KKyNkZWZpbmUgX0lUVE5PVElGWV9UWVBFU19IXworCit0eXBlZGVmIGVudW0gX19faXR0X2dyb3VwX2lkCit7CisgICAgX19pdHRfZ3JvdXBfbm9uZSAgICAgID0gMCwKKyAgICBfX2l0dF9ncm91cF9sZWdhY3kgICAgPSAxPDwwLAorICAgIF9faXR0X2dyb3VwX2NvbnRyb2wgICA9IDE8PDEsCisgICAgX19pdHRfZ3JvdXBfdGhyZWFkICAgID0gMTw8MiwKKyAgICBfX2l0dF9ncm91cF9tYXJrICAgICAgPSAxPDwzLAorICAgIF9faXR0X2dyb3VwX3N5bmMgICAgICA9IDE8PDQsCisgICAgX19pdHRfZ3JvdXBfZnN5bmMgICAgID0gMTw8NSwKKyAgICBfX2l0dF9ncm91cF9qaXQgICAgICAgPSAxPDw2LAorICAgIF9faXR0X2dyb3VwX21vZGVsICAgICA9IDE8PDcsCisgICAgX19pdHRfZ3JvdXBfc3BsaXR0ZXJfbWluID0gMTw8NywKKyAgICBfX2l0dF9ncm91cF9jb3VudGVyICAgPSAxPDw4LAorICAgIF9faXR0X2dyb3VwX2ZyYW1lICAgICA9IDE8PDksCisgICAgX19pdHRfZ3JvdXBfc3RpdGNoICAgID0gMTw8MTAsCisgICAgX19pdHRfZ3JvdXBfaGVhcCAgICAgID0gMTw8MTEsCisgICAgX19pdHRfZ3JvdXBfc3BsaXR0ZXJfbWF4ID0gMTw8MTIsCisgICAgX19pdHRfZ3JvdXBfc3RydWN0dXJlID0gMTw8MTIsCisgICAgX19pdHRfZ3JvdXBfc3VwcHJlc3MgPSAxPDwxMywKKyAgICBfX2l0dF9ncm91cF9hcnJheXMgICAgPSAxPDwxNCwKKyAgICBfX2l0dF9ncm91cF9hbGwgICAgICAgPSAtMQorfSBfX2l0dF9ncm91cF9pZDsKKworI3ByYWdtYSBwYWNrKHB1c2gsIDgpCisKK3R5cGVkZWYgc3RydWN0IF9fX2l0dF9ncm91cF9saXN0Cit7CisgICAgX19pdHRfZ3JvdXBfaWQgaWQ7CisgICAgY29uc3QgY2hhciogICAgbmFtZTsKK30gX19pdHRfZ3JvdXBfbGlzdDsKKworI3ByYWdtYSBwYWNrKHBvcCkKKworI2RlZmluZSBJVFRfR1JPVVBfTElTVCh2YXJuYW1lKSBcCisgICAgc3RhdGljIF9faXR0X2dyb3VwX2xpc3QgdmFybmFtZVtdID0geyAgICAgICBcCisgICAgICAgIHsgX19pdHRfZ3JvdXBfYWxsLCAgICAgICAiYWxsIiAgICAgICB9LCBcCisgICAgICAgIHsgX19pdHRfZ3JvdXBfY29udHJvbCwgICAiY29udHJvbCIgICB9LCBcCisgICAgICAgIHsgX19pdHRfZ3JvdXBfdGhyZWFkLCAgICAidGhyZWFkIiAgICB9LCBcCisgICAgICAgIHsgX19pdHRfZ3JvdXBfbWFyaywgICAgICAibWFyayIgICAgICB9LCBcCisgICAgICAgIHsgX19pdHRfZ3JvdXBfc3luYywgICAgICAic3luYyIgICAgICB9LCBcCisgICAgICAgIHsgX19pdHRfZ3JvdXBfZnN5bmMsICAgICAiZnN5bmMiICAgICB9LCBcCisgICAgICAgIHsgX19pdHRfZ3JvdXBfaml0LCAgICAgICAiaml0IiAgICAgICB9LCBcCisgICAgICAgIHsgX19pdHRfZ3JvdXBfbW9kZWwsICAgICAibW9kZWwiICAgICB9LCBcCisgICAgICAgIHsgX19pdHRfZ3JvdXBfY291bnRlciwgICAiY291bnRlciIgICB9LCBcCisgICAgICAgIHsgX19pdHRfZ3JvdXBfZnJhbWUsICAgICAiZnJhbWUiICAgICB9LCBcCisgICAgICAgIHsgX19pdHRfZ3JvdXBfc3RpdGNoLCAgICAic3RpdGNoIiAgICB9LCBcCisgICAgICAgIHsgX19pdHRfZ3JvdXBfaGVhcCwgICAgICAiaGVhcCIgICAgICB9LCBcCisgICAgICAgIHsgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAic3RydWN0dXJlIiB9LCBcCisgICAgICAgIHsgX19pdHRfZ3JvdXBfc3VwcHJlc3MsICAic3VwcHJlc3MiICB9LCBcCisgICAgICAgIHsgX19pdHRfZ3JvdXBfYXJyYXlzLCAgICAiYXJyYXlzIiAgICB9LCBcCisgICAgICAgIHsgX19pdHRfZ3JvdXBfbm9uZSwgICAgICBOVUxMICAgICAgICB9ICBcCisgICAgfQorCisjZW5kaWYgLyogX0lUVE5PVElGWV9UWVBFU19IXyAqLwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMvdGhpcmRwYXJ0eS9pdHRub3RpZnkvbGVnYWN5L2l0dG5vdGlmeS5oIGIvZmluYWwvcnVudGltZS9zcmMvdGhpcmRwYXJ0eS9pdHRub3RpZnkvbGVnYWN5L2l0dG5vdGlmeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkODdiZDMKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy90aGlyZHBhcnR5L2l0dG5vdGlmeS9sZWdhY3kvaXR0bm90aWZ5LmgKQEAgLTAsMCArMSw5NzEgQEAKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBfTEVHQUNZX0lUVE5PVElGWV9IXworI2RlZmluZSBfTEVHQUNZX0lUVE5PVElGWV9IXworCisvKioKKyAqIEBmaWxlCisgKiBAYnJpZWYgTGVnYWN5IFVzZXIgQVBJIGZ1bmN0aW9ucyBhbmQgdHlwZXMKKyAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSVRUX09TX1dJTgorIyAgZGVmaW5lIElUVF9PU19XSU4gICAxCisjZW5kaWYgLyogSVRUX09TX1dJTiAqLworCisjaWZuZGVmIElUVF9PU19MSU5VWAorIyAgZGVmaW5lIElUVF9PU19MSU5VWCAyCisjZW5kaWYgLyogSVRUX09TX0xJTlVYICovCisKKyNpZm5kZWYgSVRUX09TX01BQworIyAgZGVmaW5lIElUVF9PU19NQUMgICAzCisjZW5kaWYgLyogSVRUX09TX01BQyAqLworCisjaWZuZGVmIElUVF9PUworIyAgaWYgZGVmaW5lZCBXSU4zMiB8fCBkZWZpbmVkIF9XSU4zMgorIyAgICBkZWZpbmUgSVRUX09TIElUVF9PU19XSU4KKyMgIGVsaWYgZGVmaW5lZCggX19BUFBMRV9fICkgJiYgZGVmaW5lZCggX19NQUNIX18gKQorIyAgICBkZWZpbmUgSVRUX09TIElUVF9PU19NQUMKKyMgIGVsc2UKKyMgICAgZGVmaW5lIElUVF9PUyBJVFRfT1NfTElOVVgKKyMgIGVuZGlmCisjZW5kaWYgLyogSVRUX09TICovCisKKyNpZm5kZWYgSVRUX1BMQVRGT1JNX1dJTgorIyAgZGVmaW5lIElUVF9QTEFURk9STV9XSU4gMQorI2VuZGlmIC8qIElUVF9QTEFURk9STV9XSU4gKi8KKworI2lmbmRlZiBJVFRfUExBVEZPUk1fUE9TSVgKKyMgIGRlZmluZSBJVFRfUExBVEZPUk1fUE9TSVggMgorI2VuZGlmIC8qIElUVF9QTEFURk9STV9QT1NJWCAqLworCisjaWZuZGVmIElUVF9QTEFURk9STV9NQUMKKyMgIGRlZmluZSBJVFRfUExBVEZPUk1fTUFDIDMKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk1fTUFDICovCisKKyNpZm5kZWYgSVRUX1BMQVRGT1JNCisjICBpZiBJVFRfT1M9PUlUVF9PU19XSU4KKyMgICAgZGVmaW5lIElUVF9QTEFURk9STSBJVFRfUExBVEZPUk1fV0lOCisjICBlbGlmIElUVF9PUz09SVRUX09TX01BQworIyAgICBkZWZpbmUgSVRUX1BMQVRGT1JNIElUVF9QTEFURk9STV9NQUMKKyMgIGVsc2UKKyMgICAgZGVmaW5lIElUVF9QTEFURk9STSBJVFRfUExBVEZPUk1fUE9TSVgKKyMgIGVuZGlmCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNICovCisKKyNpZiBkZWZpbmVkKF9VTklDT0RFKSAmJiAhZGVmaW5lZChVTklDT0RFKQorI2RlZmluZSBVTklDT0RFCisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2luY2x1ZGUgPHRjaGFyLmg+CisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaWYgZGVmaW5lZChVTklDT0RFKSB8fCBkZWZpbmVkKF9VTklDT0RFKQorI2luY2x1ZGUgPHdjaGFyLmg+CisjZW5kaWYgLyogVU5JQ09ERSB8fCBfVU5JQ09ERSAqLworI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCisjaWZuZGVmIENERUNMCisjICBpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyMgICAgZGVmaW5lIENERUNMIF9fY2RlY2wKKyMgIGVsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjICAgIGlmIGRlZmluZWQgX01fSVg4NiB8fCBkZWZpbmVkIF9faTM4Nl9fIAorIyAgICAgIGRlZmluZSBDREVDTCBfX2F0dHJpYnV0ZV9fICgoY2RlY2wpKQorIyAgICBlbHNlICAvKiBfTV9JWDg2IHx8IF9faTM4Nl9fICovCisjICAgICAgZGVmaW5lIENERUNMIC8qIGFjdHVhbCBvbmx5IG9uIHg4NiBwbGF0Zm9ybSAqLworIyAgICBlbmRpZiAvKiBfTV9JWDg2IHx8IF9faTM4Nl9fICovCisjICBlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBDREVDTCAqLworCisjaWZuZGVmIFNURENBTEwKKyMgIGlmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorIyAgICBkZWZpbmUgU1REQ0FMTCBfX3N0ZGNhbGwKKyMgIGVsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjICAgIGlmIGRlZmluZWQgX01fSVg4NiB8fCBkZWZpbmVkIF9faTM4Nl9fCisjICAgICAgZGVmaW5lIFNURENBTEwgX19hdHRyaWJ1dGVfXyAoKHN0ZGNhbGwpKSAKKyMgICAgZWxzZSAgLyogX01fSVg4NiB8fCBfX2kzODZfXyAqLworIyAgICAgIGRlZmluZSBTVERDQUxMIC8qIHN1cHBvcnRlZCBvbmx5IG9uIHg4NiBwbGF0Zm9ybSAqLworIyAgICBlbmRpZiAvKiBfTV9JWDg2IHx8IF9faTM4Nl9fICovCisjICBlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBTVERDQUxMICovCisKKyNkZWZpbmUgSVRUQVBJICAgIENERUNMCisjZGVmaW5lIExJQklUVEFQSSBDREVDTAorCisvKiBUT0RPOiBUZW1wb3JhcnkgZm9yIGNvbXBhdGliaWxpdHkhICovCisjZGVmaW5lIElUVEFQSV9DQUxMICAgIENERUNMCisjZGVmaW5lIExJQklUVEFQSV9DQUxMIENERUNMCisKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKy8qIHVzZSBfX2ZvcmNlaW5saW5lIChWQysrIHNwZWNpZmljKSAqLworI2RlZmluZSBJVFRfSU5MSU5FICAgICAgICAgICBfX2ZvcmNlaW5saW5lCisjZGVmaW5lIElUVF9JTkxJTkVfQVRUUklCVVRFIC8qIG5vdGhpbmcgKi8KKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKy8qCisgKiBHZW5lcmFsbHksIGZ1bmN0aW9ucyBhcmUgbm90IGlubGluZWQgdW5sZXNzIG9wdGltaXphdGlvbiBpcyBzcGVjaWZpZWQuCisgKiBGb3IgZnVuY3Rpb25zIGRlY2xhcmVkIGlubGluZSwgdGhpcyBhdHRyaWJ1dGUgaW5saW5lcyB0aGUgZnVuY3Rpb24gZXZlbgorICogaWYgbm8gb3B0aW1pemF0aW9uIGxldmVsIHdhcyBzcGVjaWZpZWQuCisgKi8KKyNpZmRlZiBfX1NUUklDVF9BTlNJX18KKyNkZWZpbmUgSVRUX0lOTElORSAgICAgICAgICAgc3RhdGljCisjZWxzZSAgLyogX19TVFJJQ1RfQU5TSV9fICovCisjZGVmaW5lIElUVF9JTkxJTkUgICAgICAgICAgIHN0YXRpYyBpbmxpbmUKKyNlbmRpZiAvKiBfX1NUUklDVF9BTlNJX18gKi8KKyNkZWZpbmUgSVRUX0lOTElORV9BVFRSSUJVVEUgX19hdHRyaWJ1dGVfXyAoKGFsd2F5c19pbmxpbmUsIHVudXNlZCkpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisvKiBIZWxwZXIgbWFjcm8gZm9yIGpvaW5pbmcgdG9rZW5zICovCisjZGVmaW5lIElUVF9KT0lOX0FVWChwLG4pIHAjI24KKyNkZWZpbmUgSVRUX0pPSU4ocCxuKSAgICAgSVRUX0pPSU5fQVVYKHAsbikKKworI2lmZGVmIElUVF9NQUpPUgorI3VuZGVmIElUVF9NQUpPUgorI2VuZGlmCisjaWZkZWYgSVRUX01JTk9SCisjdW5kZWYgSVRUX01JTk9SCisjZW5kaWYKKyNkZWZpbmUgSVRUX01BSk9SICAgICAzCisjZGVmaW5lIElUVF9NSU5PUiAgICAgMAorCisvKiBTdGFuZGFyZCB2ZXJzaW9uaW5nIG9mIGEgdG9rZW4gd2l0aCBtYWpvciBhbmQgbWlub3IgdmVyc2lvbiBudW1iZXJzICovCisjZGVmaW5lIElUVF9WRVJTSU9OSVpFKHgpICAgIFwKKyAgICBJVFRfSk9JTih4LCAgICAgICAgICAgICAgXAorICAgIElUVF9KT0lOKF8sICAgICAgICAgICAgICBcCisgICAgSVRUX0pPSU4oSVRUX01BSk9SLCAgICAgIFwKKyAgICBJVFRfSk9JTihfLCBJVFRfTUlOT1IpKSkpCisKKyNpZm5kZWYgSU5URUxfSVRUTk9USUZZX1BSRUZJWAorIyAgZGVmaW5lIElOVEVMX0lUVE5PVElGWV9QUkVGSVggX19pdHRfCisjZW5kaWYgLyogSU5URUxfSVRUTk9USUZZX1BSRUZJWCAqLworI2lmbmRlZiBJTlRFTF9JVFROT1RJRllfUE9TVEZJWAorIyAgZGVmaW5lIElOVEVMX0lUVE5PVElGWV9QT1NURklYIF9wdHJfCisjZW5kaWYgLyogSU5URUxfSVRUTk9USUZZX1BPU1RGSVggKi8KKworI2RlZmluZSBJVFROT1RJRllfTkFNRV9BVVgobikgSVRUX0pPSU4oSU5URUxfSVRUTk9USUZZX1BSRUZJWCxuKQorI2RlZmluZSBJVFROT1RJRllfTkFNRShuKSAgICAgSVRUX1ZFUlNJT05JWkUoSVRUTk9USUZZX05BTUVfQVVYKElUVF9KT0lOKG4sSU5URUxfSVRUTk9USUZZX1BPU1RGSVgpKSkKKworI2RlZmluZSBJVFROT1RJRllfVk9JRChuKSAoIUlUVE5PVElGWV9OQU1FKG4pKSA/ICh2b2lkKTAgOiBJVFROT1RJRllfTkFNRShuKQorI2RlZmluZSBJVFROT1RJRllfREFUQShuKSAoIUlUVE5PVElGWV9OQU1FKG4pKSA/ICAgICAgIDAgOiBJVFROT1RJRllfTkFNRShuKQorCisjZGVmaW5lIElUVE5PVElGWV9WT0lEX0QwKG4sZCkgICAgICAgKCEoZCktPmZsYWdzKSA/ICh2b2lkKTAgOiAoIUlUVE5PVElGWV9OQU1FKG4pKSA/ICh2b2lkKTAgOiBJVFROT1RJRllfTkFNRShuKShkKQorI2RlZmluZSBJVFROT1RJRllfVk9JRF9EMShuLGQseCkgICAgICghKGQpLT5mbGFncykgPyAodm9pZCkwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAodm9pZCkwIDogSVRUTk9USUZZX05BTUUobikoZCx4KQorI2RlZmluZSBJVFROT1RJRllfVk9JRF9EMihuLGQseCx5KSAgICghKGQpLT5mbGFncykgPyAodm9pZCkwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAodm9pZCkwIDogSVRUTk9USUZZX05BTUUobikoZCx4LHkpCisjZGVmaW5lIElUVE5PVElGWV9WT0lEX0QzKG4sZCx4LHkseikgKCEoZCktPmZsYWdzKSA/ICh2b2lkKTAgOiAoIUlUVE5PVElGWV9OQU1FKG4pKSA/ICh2b2lkKTAgOiBJVFROT1RJRllfTkFNRShuKShkLHgseSx6KQorI2RlZmluZSBJVFROT1RJRllfVk9JRF9ENChuLGQseCx5LHosYSkgICAgICghKGQpLT5mbGFncykgPyAodm9pZCkwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAodm9pZCkwIDogSVRUTk9USUZZX05BTUUobikoZCx4LHkseixhKQorI2RlZmluZSBJVFROT1RJRllfVk9JRF9ENShuLGQseCx5LHosYSxiKSAgICghKGQpLT5mbGFncykgPyAodm9pZCkwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAodm9pZCkwIDogSVRUTk9USUZZX05BTUUobikoZCx4LHkseixhLGIpCisjZGVmaW5lIElUVE5PVElGWV9WT0lEX0Q2KG4sZCx4LHkseixhLGIsYykgKCEoZCktPmZsYWdzKSA/ICh2b2lkKTAgOiAoIUlUVE5PVElGWV9OQU1FKG4pKSA/ICh2b2lkKTAgOiBJVFROT1RJRllfTkFNRShuKShkLHgseSx6LGEsYixjKQorI2RlZmluZSBJVFROT1RJRllfREFUQV9EMChuLGQpICAgICAgICghKGQpLT5mbGFncykgPyAgICAgICAwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAgICAgICAwIDogSVRUTk9USUZZX05BTUUobikoZCkKKyNkZWZpbmUgSVRUTk9USUZZX0RBVEFfRDEobixkLHgpICAgICAoIShkKS0+ZmxhZ3MpID8gICAgICAgMCA6ICghSVRUTk9USUZZX05BTUUobikpID8gICAgICAgMCA6IElUVE5PVElGWV9OQU1FKG4pKGQseCkKKyNkZWZpbmUgSVRUTk9USUZZX0RBVEFfRDIobixkLHgseSkgICAoIShkKS0+ZmxhZ3MpID8gICAgICAgMCA6ICghSVRUTk9USUZZX05BTUUobikpID8gICAgICAgMCA6IElUVE5PVElGWV9OQU1FKG4pKGQseCx5KQorI2RlZmluZSBJVFROT1RJRllfREFUQV9EMyhuLGQseCx5LHopICghKGQpLT5mbGFncykgPyAgICAgICAwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAgICAgICAwIDogSVRUTk9USUZZX05BTUUobikoZCx4LHkseikKKyNkZWZpbmUgSVRUTk9USUZZX0RBVEFfRDQobixkLHgseSx6LGEpICAgICAoIShkKS0+ZmxhZ3MpID8gMCA6ICghSVRUTk9USUZZX05BTUUobikpID8gICAgICAgMCA6IElUVE5PVElGWV9OQU1FKG4pKGQseCx5LHosYSkKKyNkZWZpbmUgSVRUTk9USUZZX0RBVEFfRDUobixkLHgseSx6LGEsYikgICAoIShkKS0+ZmxhZ3MpID8gMCA6ICghSVRUTk9USUZZX05BTUUobikpID8gICAgICAgMCA6IElUVE5PVElGWV9OQU1FKG4pKGQseCx5LHosYSxiKQorI2RlZmluZSBJVFROT1RJRllfREFUQV9ENihuLGQseCx5LHosYSxiLGMpICghKGQpLT5mbGFncykgPyAwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAgICAgICAwIDogSVRUTk9USUZZX05BTUUobikoZCx4LHkseixhLGIsYykKKworI2lmZGVmIElUVF9TVFVCCisjdW5kZWYgSVRUX1NUVUIKKyNlbmRpZgorI2lmZGVmIElUVF9TVFVCVgorI3VuZGVmIElUVF9TVFVCVgorI2VuZGlmCisjZGVmaW5lIElUVF9TVFVCVihhcGksdHlwZSxuYW1lLGFyZ3MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdHlwZWRlZiB0eXBlIChhcGkqIElUVF9KT0lOKElUVE5PVElGWV9OQU1FKG5hbWUpLF90KSkgYXJnczsgICBcCisgICAgZXh0ZXJuIElUVF9KT0lOKElUVE5PVElGWV9OQU1FKG5hbWUpLF90KSBJVFROT1RJRllfTkFNRShuYW1lKTsKKyNkZWZpbmUgSVRUX1NUVUIgSVRUX1NUVUJWCisvKiogQGVuZGNvbmQgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisvKioKKyAqIEBkZWZncm91cCBsZWdhY3kgTGVnYWN5IEFQSQorICogQHsKKyAqIEB9CisgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgbGVnYWN5X2NvbnRyb2wgQ29sbGVjdGlvbiBDb250cm9sCisgKiBAaW5ncm91cCBsZWdhY3kKKyAqIEdlbmVyYWwgYmVoYXZpb3I6IGFwcGxpY2F0aW9uIGNvbnRpbnVlcyB0byBydW4sIGJ1dCBubyBwcm9maWxpbmcgaW5mb3JtYXRpb24gaXMgYmVpbmcgY29sbGVjdGVkCisgKgorICogUGF1c2luZyBvY2N1cnMgbm90IG9ubHkgZm9yIHRoZSBjdXJyZW50IHRocmVhZCBidXQgZm9yIGFsbCBwcm9jZXNzIGFzIHdlbGwgYXMgc3Bhd25lZCBwcm9jZXNzZXMKKyAqIC0gSW50ZWwoUikgUGFyYWxsZWwgSW5zcGVjdG9yIGFuZCBJbnRlbChSKSBJbnNwZWN0b3IgWEU6CisgKiAgIC0gRG9lcyBub3QgYW5hbHl6ZSBvciByZXBvcnQgZXJyb3JzIHRoYXQgaW52b2x2ZSBtZW1vcnkgYWNjZXNzLgorICogICAtIE90aGVyIGVycm9ycyBhcmUgcmVwb3J0ZWQgYXMgdXN1YWwuIFBhdXNpbmcgZGF0YSBjb2xsZWN0aW9uIGluCisgKiAgICAgSW50ZWwoUikgUGFyYWxsZWwgSW5zcGVjdG9yIGFuZCBJbnRlbChSKSBJbnNwZWN0b3IgWEUKKyAqICAgICBvbmx5IHBhdXNlcyB0cmFjaW5nIGFuZCBhbmFseXppbmcgbWVtb3J5IGFjY2Vzcy4KKyAqICAgICBJdCBkb2VzIG5vdCBwYXVzZSB0cmFjaW5nIG9yIGFuYWx5emluZyB0aHJlYWRpbmcgQVBJcy4KKyAqICAgLgorICogLSBJbnRlbChSKSBQYXJhbGxlbCBBbXBsaWZpZXIgYW5kIEludGVsKFIpIFZUdW5lKFRNKSBBbXBsaWZpZXIgWEU6CisgKiAgIC0gRG9lcyBjb250aW51ZSB0byByZWNvcmQgd2hlbiBuZXcgdGhyZWFkcyBhcmUgc3RhcnRlZC4KKyAqICAgLgorICogLSBPdGhlciBlZmZlY3RzOgorICogICAtIFBvc3NpYmxlIHJlZHVjdGlvbiBvZiBydW50aW1lIG92ZXJoZWFkLgorICogICAuCisgKiBAeworICovCisjaWZuZGVmIF9JVFROT1RJRllfSF8KKy8qKiBAYnJpZWYgUGF1c2UgY29sbGVjdGlvbiAqLwordm9pZCBJVFRBUEkgX19pdHRfcGF1c2Uodm9pZCk7CisvKiogQGJyaWVmIFJlc3VtZSBjb2xsZWN0aW9uICovCit2b2lkIElUVEFQSSBfX2l0dF9yZXN1bWUodm9pZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHBhdXNlLCAgICh2b2lkKSkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHJlc3VtZSwgICh2b2lkKSkKKyNkZWZpbmUgX19pdHRfcGF1c2UgICAgICBJVFROT1RJRllfVk9JRChwYXVzZSkKKyNkZWZpbmUgX19pdHRfcGF1c2VfcHRyICBJVFROT1RJRllfTkFNRShwYXVzZSkKKyNkZWZpbmUgX19pdHRfcmVzdW1lICAgICBJVFROT1RJRllfVk9JRChyZXN1bWUpCisjZGVmaW5lIF9faXR0X3Jlc3VtZV9wdHIgSVRUTk9USUZZX05BTUUocmVzdW1lKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfcGF1c2UoKQorI2RlZmluZSBfX2l0dF9wYXVzZV9wdHIgIDAKKyNkZWZpbmUgX19pdHRfcmVzdW1lKCkKKyNkZWZpbmUgX19pdHRfcmVzdW1lX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfcGF1c2VfcHRyICAwCisjZGVmaW5lIF9faXR0X3Jlc3VtZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworI2VuZGlmIC8qIF9JVFROT1RJRllfSF8gKi8KKy8qKiBAfSBsZWdhY3lfY29udHJvbCBncm91cCAqLworCisvKioKKyAqIEBkZWZncm91cCBsZWdhY3lfdGhyZWFkcyBUaHJlYWRzCisgKiBAaW5ncm91cCBsZWdhY3kKKyAqIFRocmVhZHMgZ3JvdXAKKyAqIEB3YXJuaW5nIExlZ2FjeSBBUEkKKyAqIEB7CisgKi8KKy8qKgorICogQGRlcHJlY2F0ZWQgTGVnYWN5IEFQSQorICogQGJyaWVmIFNldCBuYW1lIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aHJlYWQgaW4gYW5hbHlzaXMgR1VJLgorICogQHJldHVybiBfX2l0dF9lcnIgdXBvbiBmYWlsdXJlIChuYW1lIG9yIG5hbWVsZW4gYmVpbmcgbnVsbCxuYW1lIGFuZCBuYW1lbGVuIG1pc21hdGNoZWQpCisgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK2ludCBMSUJJVFRBUEkgX19pdHRfdGhyX25hbWVfc2V0QShjb25zdCBjaGFyICAgICpuYW1lLCBpbnQgbmFtZWxlbik7CitpbnQgTElCSVRUQVBJIF9faXR0X3Rocl9uYW1lX3NldFcoY29uc3Qgd2NoYXJfdCAqbmFtZSwgaW50IG5hbWVsZW4pOworI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKyMgIGRlZmluZSBfX2l0dF90aHJfbmFtZV9zZXQgICAgIF9faXR0X3Rocl9uYW1lX3NldFcKKyMgIGRlZmluZSBfX2l0dF90aHJfbmFtZV9zZXRfcHRyIF9faXR0X3Rocl9uYW1lX3NldFdfcHRyCisjZWxzZQorIyAgZGVmaW5lIF9faXR0X3Rocl9uYW1lX3NldCAgICAgX19pdHRfdGhyX25hbWVfc2V0QQorIyAgZGVmaW5lIF9faXR0X3Rocl9uYW1lX3NldF9wdHIgX19pdHRfdGhyX25hbWVfc2V0QV9wdHIKKyNlbmRpZiAvKiBVTklDT0RFICovCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK2ludCBMSUJJVFRBUEkgX19pdHRfdGhyX25hbWVfc2V0KGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuKTsKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUIoTElCSVRUQVBJLCBpbnQsIHRocl9uYW1lX3NldEEsIChjb25zdCBjaGFyICAgICpuYW1lLCBpbnQgbmFtZWxlbikpCitJVFRfU1RVQihMSUJJVFRBUEksIGludCwgdGhyX25hbWVfc2V0VywgKGNvbnN0IHdjaGFyX3QgKm5hbWUsIGludCBuYW1lbGVuKSkKKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCKExJQklUVEFQSSwgaW50LCB0aHJfbmFtZV9zZXQsICAoY29uc3QgY2hhciAgICAqbmFtZSwgaW50IG5hbWVsZW4pKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF90aHJfbmFtZV9zZXRBICAgICBJVFROT1RJRllfREFUQSh0aHJfbmFtZV9zZXRBKQorI2RlZmluZSBfX2l0dF90aHJfbmFtZV9zZXRBX3B0ciBJVFROT1RJRllfTkFNRSh0aHJfbmFtZV9zZXRBKQorI2RlZmluZSBfX2l0dF90aHJfbmFtZV9zZXRXICAgICBJVFROT1RJRllfREFUQSh0aHJfbmFtZV9zZXRXKQorI2RlZmluZSBfX2l0dF90aHJfbmFtZV9zZXRXX3B0ciBJVFROT1RJRllfTkFNRSh0aHJfbmFtZV9zZXRXKQorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X3Rocl9uYW1lX3NldCAgICAgSVRUTk9USUZZX0RBVEEodGhyX25hbWVfc2V0KQorI2RlZmluZSBfX2l0dF90aHJfbmFtZV9zZXRfcHRyIElUVE5PVElGWV9OQU1FKHRocl9uYW1lX3NldCkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X3Rocl9uYW1lX3NldEEobmFtZSwgbmFtZWxlbikKKyNkZWZpbmUgX19pdHRfdGhyX25hbWVfc2V0QV9wdHIgMAorI2RlZmluZSBfX2l0dF90aHJfbmFtZV9zZXRXKG5hbWUsIG5hbWVsZW4pCisjZGVmaW5lIF9faXR0X3Rocl9uYW1lX3NldFdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF90aHJfbmFtZV9zZXQobmFtZSwgbmFtZWxlbikKKyNkZWZpbmUgX19pdHRfdGhyX25hbWVfc2V0X3B0ciAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfdGhyX25hbWVfc2V0QV9wdHIgMAorI2RlZmluZSBfX2l0dF90aHJfbmFtZV9zZXRXX3B0ciAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfdGhyX25hbWVfc2V0X3B0ciAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGRlcHJlY2F0ZWQgTGVnYWN5IEFQSQorICogQGJyaWVmIE1hcmsgY3VycmVudCB0aHJlYWQgYXMgaWdub3JlZCBmcm9tIHRoaXMgcG9pbnQgb24sIGZvciB0aGUgZHVyYXRpb24gb2YgaXRzIGV4aXN0ZW5jZS4KKyAqLwordm9pZCBMSUJJVFRBUEkgX19pdHRfdGhyX2lnbm9yZSh2b2lkKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKExJQklUVEFQSSwgdm9pZCwgdGhyX2lnbm9yZSwgKHZvaWQpKQorI2RlZmluZSBfX2l0dF90aHJfaWdub3JlICAgICBJVFROT1RJRllfVk9JRCh0aHJfaWdub3JlKQorI2RlZmluZSBfX2l0dF90aHJfaWdub3JlX3B0ciBJVFROT1RJRllfTkFNRSh0aHJfaWdub3JlKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfdGhyX2lnbm9yZSgpCisjZGVmaW5lIF9faXR0X3Rocl9pZ25vcmVfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF90aHJfaWdub3JlX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisvKiogQH0gbGVnYWN5X3RocmVhZHMgZ3JvdXAgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgbGVnYWN5X3N5bmMgU3luY2hyb25pemF0aW9uCisgKiBAaW5ncm91cCBsZWdhY3kKKyAqIFN5bmNocm9uaXphdGlvbiBncm91cAorICogQHdhcm5pbmcgTGVnYWN5IEFQSQorICogQHsKKyAqLworLyoqCisgKiBAaGlkZWluaXRpYWxpemVyCisgKiBAYnJpZWYgcG9zc2libGUgdmFsdWUgb2YgYXR0cmlidXRlIGFyZ3VtZW50IGZvciBzeW5jIG9iamVjdCB0eXBlCisgKi8KKyNkZWZpbmUgX19pdHRfYXR0cl9iYXJyaWVyIDEKKworLyoqCisgKiBAaGlkZWluaXRpYWxpemVyCisgKiBAYnJpZWYgcG9zc2libGUgdmFsdWUgb2YgYXR0cmlidXRlIGFyZ3VtZW50IGZvciBzeW5jIG9iamVjdCB0eXBlCisgKi8KKyNkZWZpbmUgX19pdHRfYXR0cl9tdXRleCAgIDIKKworLyoqCisgKiBAZGVwcmVjYXRlZCBMZWdhY3kgQVBJCisgKiBAYnJpZWYgQXNzaWduIGEgbmFtZSB0byBhIHN5bmMgb2JqZWN0IHVzaW5nIGNoYXIgb3IgVW5pY29kZSBzdHJpbmcKKyAqIEBwYXJhbVtpbl0gYWRkciAgICAtIHBvaW50ZXIgdG8gdGhlIHN5bmMgb2JqZWN0LiBZb3Ugc2hvdWxkIHVzZSBhIHJlYWwgcG9pbnRlciB0byB5b3VyIG9iamVjdAorICogICAgICAgICAgICAgICAgICAgICAgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHZhbHVlcyBkb24ndCBjbGFzaCB3aXRoIG90aGVyIG9iamVjdCBhZGRyZXNzZXMKKyAqIEBwYXJhbVtpbl0gb2JqdHlwZSAtIG51bGwtdGVybWluYXRlZCBvYmplY3QgdHlwZSBzdHJpbmcuIElmIE5VTEwgaXMgcGFzc2VkLCB0aGUgb2JqZWN0IHdpbGwKKyAqICAgICAgICAgICAgICAgICAgICAgIGJlIGFzc3VtZWQgdG8gYmUgb2YgZ2VuZXJpYyAiVXNlciBTeW5jaHJvbml6YXRpb24iIHR5cGUKKyAqIEBwYXJhbVtpbl0gb2JqbmFtZSAtIG51bGwtdGVybWluYXRlZCBvYmplY3QgbmFtZSBzdHJpbmcuIElmIE5VTEwsIG5vIG5hbWUgd2lsbCBiZSBhc3NpZ25lZAorICogICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIG9iamVjdCAtLSB5b3UgY2FuIHVzZSB0aGUgX19pdHRfc3luY19yZW5hbWUgY2FsbCBsYXRlciB0byBhc3NpZ24KKyAqICAgICAgICAgICAgICAgICAgICAgIHRoZSBuYW1lCisgKiBAcGFyYW1baW5dIGF0dHJpYnV0ZSAtIG9uZSBvZiBbI19faXR0X2F0dHJfYmFycmllciwgI19faXR0X2F0dHJfbXV0ZXhdIHZhbHVlcyB3aGljaCBkZWZpbmVzIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgZXhhY3Qgc2VtYW50aWNzIG9mIGhvdyBwcmVwYXJlL2FjcXVpcmVkL3JlbGVhc2luZyBjYWxscyB3b3JrLgorICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCit2b2lkIElUVEFQSSBfX2l0dF9zeW5jX3NldF9uYW1lQSh2b2lkICphZGRyLCBjb25zdCBjaGFyICAgICpvYmp0eXBlLCBjb25zdCBjaGFyICAgICpvYmpuYW1lLCBpbnQgYXR0cmlidXRlKTsKK3ZvaWQgSVRUQVBJIF9faXR0X3N5bmNfc2V0X25hbWVXKHZvaWQgKmFkZHIsIGNvbnN0IHdjaGFyX3QgKm9ianR5cGUsIGNvbnN0IHdjaGFyX3QgKm9iam5hbWUsIGludCBhdHRyaWJ1dGUpOworI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKyMgIGRlZmluZSBfX2l0dF9zeW5jX3NldF9uYW1lICAgICBfX2l0dF9zeW5jX3NldF9uYW1lVworIyAgZGVmaW5lIF9faXR0X3N5bmNfc2V0X25hbWVfcHRyIF9faXR0X3N5bmNfc2V0X25hbWVXX3B0cgorI2Vsc2UgLyogVU5JQ09ERSAqLworIyAgZGVmaW5lIF9faXR0X3N5bmNfc2V0X25hbWUgICAgIF9faXR0X3N5bmNfc2V0X25hbWVBCisjICBkZWZpbmUgX19pdHRfc3luY19zZXRfbmFtZV9wdHIgX19pdHRfc3luY19zZXRfbmFtZUFfcHRyCisjZW5kaWYgLyogVU5JQ09ERSAqLworI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCit2b2lkIElUVEFQSSBfX2l0dF9zeW5jX3NldF9uYW1lKHZvaWQgKmFkZHIsIGNvbnN0IGNoYXIqIG9ianR5cGUsIGNvbnN0IGNoYXIqIG9iam5hbWUsIGludCBhdHRyaWJ1dGUpOworI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzeW5jX3NldF9uYW1lQSwgKHZvaWQgKmFkZHIsIGNvbnN0IGNoYXIgICAgKm9ianR5cGUsIGNvbnN0IGNoYXIgICAgKm9iam5hbWUsIGludCBhdHRyaWJ1dGUpKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3luY19zZXRfbmFtZVcsICh2b2lkICphZGRyLCBjb25zdCB3Y2hhcl90ICpvYmp0eXBlLCBjb25zdCB3Y2hhcl90ICpvYmpuYW1lLCBpbnQgYXR0cmlidXRlKSkKKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN5bmNfc2V0X25hbWUsICAodm9pZCAqYWRkciwgY29uc3QgY2hhciAgICAqb2JqdHlwZSwgY29uc3QgY2hhciAgICAqb2JqbmFtZSwgaW50IGF0dHJpYnV0ZSkpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X3N5bmNfc2V0X25hbWVBICAgICBJVFROT1RJRllfVk9JRChzeW5jX3NldF9uYW1lQSkKKyNkZWZpbmUgX19pdHRfc3luY19zZXRfbmFtZUFfcHRyIElUVE5PVElGWV9OQU1FKHN5bmNfc2V0X25hbWVBKQorI2RlZmluZSBfX2l0dF9zeW5jX3NldF9uYW1lVyAgICAgSVRUTk9USUZZX1ZPSUQoc3luY19zZXRfbmFtZVcpCisjZGVmaW5lIF9faXR0X3N5bmNfc2V0X25hbWVXX3B0ciBJVFROT1RJRllfTkFNRShzeW5jX3NldF9uYW1lVykKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9zeW5jX3NldF9uYW1lICAgICBJVFROT1RJRllfVk9JRChzeW5jX3NldF9uYW1lKQorI2RlZmluZSBfX2l0dF9zeW5jX3NldF9uYW1lX3B0ciBJVFROT1RJRllfTkFNRShzeW5jX3NldF9uYW1lKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfc3luY19zZXRfbmFtZUEoYWRkciwgb2JqdHlwZSwgb2JqbmFtZSwgYXR0cmlidXRlKQorI2RlZmluZSBfX2l0dF9zeW5jX3NldF9uYW1lQV9wdHIgMAorI2RlZmluZSBfX2l0dF9zeW5jX3NldF9uYW1lVyhhZGRyLCBvYmp0eXBlLCBvYmpuYW1lLCBhdHRyaWJ1dGUpCisjZGVmaW5lIF9faXR0X3N5bmNfc2V0X25hbWVXX3B0ciAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfc3luY19zZXRfbmFtZShhZGRyLCBvYmp0eXBlLCBvYmpuYW1lLCBhdHRyaWJ1dGUpCisjZGVmaW5lIF9faXR0X3N5bmNfc2V0X25hbWVfcHRyIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9zeW5jX3NldF9uYW1lQV9wdHIgMAorI2RlZmluZSBfX2l0dF9zeW5jX3NldF9uYW1lV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X3N5bmNfc2V0X25hbWVfcHRyIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAZGVwcmVjYXRlZCBMZWdhY3kgQVBJCisgKiBAYnJpZWYgQXNzaWduIGEgbmFtZSBhbmQgdHlwZSB0byBhIHN5bmMgb2JqZWN0IHVzaW5nIGNoYXIgb3IgVW5pY29kZSBzdHJpbmcKKyAqIEBwYXJhbVtpbl0gYWRkciAtICAgICAgcG9pbnRlciB0byB0aGUgc3luYyBvYmplY3QuIFlvdSBzaG91bGQgdXNlIGEgcmVhbCBwb2ludGVyIHRvIHlvdXIgb2JqZWN0CisgKiAgICAgICAgICAgICAgICAgICAgICAgIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSB2YWx1ZXMgZG9uJ3QgY2xhc2ggd2l0aCBvdGhlciBvYmplY3QgYWRkcmVzc2VzCisgKiBAcGFyYW1baW5dIG9ianR5cGUgLSAgIG51bGwtdGVybWluYXRlZCBvYmplY3QgdHlwZSBzdHJpbmcuIElmIE5VTEwgaXMgcGFzc2VkLCB0aGUgb2JqZWN0IHdpbGwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgYmUgYXNzdW1lZCB0byBiZSBvZiBnZW5lcmljICJVc2VyIFN5bmNocm9uaXphdGlvbiIgdHlwZQorICogQHBhcmFtW2luXSBvYmpuYW1lIC0gICBudWxsLXRlcm1pbmF0ZWQgb2JqZWN0IG5hbWUgc3RyaW5nLiBJZiBOVUxMLCBubyBuYW1lIHdpbGwgYmUgYXNzaWduZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIG9iamVjdCAtLSB5b3UgY2FuIHVzZSB0aGUgX19pdHRfc3luY19yZW5hbWUgY2FsbCBsYXRlciB0byBhc3NpZ24KKyAqICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG5hbWUKKyAqIEBwYXJhbVtpbl0gdHlwZWxlbiwgbmFtZWxlbiAtICAgYSBsZW5ndGggb2Ygc3RyaW5nIGZvciBhcHByb3ByaWF0ZSBvYmp0eXBlIGFuZCBvYmpuYW1lIHBhcmFtZXRlcgorICogQHBhcmFtW2luXSBhdHRyaWJ1dGUgLSBvbmUgb2YgWyNfX2l0dF9hdHRyX2JhcnJpZXIsICNfX2l0dF9hdHRyX211dGV4XSB2YWx1ZXMgd2hpY2ggZGVmaW5lcyB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgZXhhY3Qgc2VtYW50aWNzIG9mIGhvdyBwcmVwYXJlL2FjcXVpcmVkL3JlbGVhc2luZyBjYWxscyB3b3JrLgorICogQHJldHVybiBfX2l0dF9lcnIgdXBvbiBmYWlsdXJlIChuYW1lIG9yIG5hbWVsZW4gYmVpbmcgbnVsbCxuYW1lIGFuZCBuYW1lbGVuIG1pc21hdGNoZWQpCisgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK2ludCBMSUJJVFRBUEkgX19pdHRfbm90aWZ5X3N5bmNfbmFtZUEodm9pZCAqYWRkciwgY29uc3QgY2hhciAgICAqb2JqdHlwZSwgaW50IHR5cGVsZW4sIGNvbnN0IGNoYXIgICAgKm9iam5hbWUsIGludCBuYW1lbGVuLCBpbnQgYXR0cmlidXRlKTsKK2ludCBMSUJJVFRBUEkgX19pdHRfbm90aWZ5X3N5bmNfbmFtZVcodm9pZCAqYWRkciwgY29uc3Qgd2NoYXJfdCAqb2JqdHlwZSwgaW50IHR5cGVsZW4sIGNvbnN0IHdjaGFyX3QgKm9iam5hbWUsIGludCBuYW1lbGVuLCBpbnQgYXR0cmlidXRlKTsKKyNpZiBkZWZpbmVkKFVOSUNPREUpIHx8IGRlZmluZWQoX1VOSUNPREUpCisjICBkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfbmFtZSBfX2l0dF9ub3RpZnlfc3luY19uYW1lVworI2Vsc2UKKyMgIGRlZmluZSBfX2l0dF9ub3RpZnlfc3luY19uYW1lIF9faXR0X25vdGlmeV9zeW5jX25hbWVBCisjZW5kaWYKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworaW50IExJQklUVEFQSSBfX2l0dF9ub3RpZnlfc3luY19uYW1lKHZvaWQgKmFkZHIsIGNvbnN0IGNoYXIgKm9ianR5cGUsIGludCB0eXBlbGVuLCBjb25zdCBjaGFyICpvYmpuYW1lLCBpbnQgbmFtZWxlbiwgaW50IGF0dHJpYnV0ZSk7CisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCKExJQklUVEFQSSwgaW50LCBub3RpZnlfc3luY19uYW1lQSwgKHZvaWQgKmFkZHIsIGNvbnN0IGNoYXIgICAgKm9ianR5cGUsIGludCB0eXBlbGVuLCBjb25zdCBjaGFyICAgICpvYmpuYW1lLCBpbnQgbmFtZWxlbiwgaW50IGF0dHJpYnV0ZSkpCitJVFRfU1RVQihMSUJJVFRBUEksIGludCwgbm90aWZ5X3N5bmNfbmFtZVcsICh2b2lkICphZGRyLCBjb25zdCB3Y2hhcl90ICpvYmp0eXBlLCBpbnQgdHlwZWxlbiwgY29uc3Qgd2NoYXJfdCAqb2JqbmFtZSwgaW50IG5hbWVsZW4sIGludCBhdHRyaWJ1dGUpKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUIoTElCSVRUQVBJLCBpbnQsIG5vdGlmeV9zeW5jX25hbWUsICAodm9pZCAqYWRkciwgY29uc3QgY2hhciAgICAqb2JqdHlwZSwgaW50IHR5cGVsZW4sIGNvbnN0IGNoYXIgICAgKm9iam5hbWUsIGludCBuYW1lbGVuLCBpbnQgYXR0cmlidXRlKSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfbmFtZUEgICAgIElUVE5PVElGWV9EQVRBKG5vdGlmeV9zeW5jX25hbWVBKQorI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19uYW1lQV9wdHIgSVRUTk9USUZZX05BTUUobm90aWZ5X3N5bmNfbmFtZUEpCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX25hbWVXICAgICBJVFROT1RJRllfREFUQShub3RpZnlfc3luY19uYW1lVykKKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfbmFtZVdfcHRyIElUVE5PVElGWV9OQU1FKG5vdGlmeV9zeW5jX25hbWVXKQorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX25hbWUgICAgIElUVE5PVElGWV9EQVRBKG5vdGlmeV9zeW5jX25hbWUpCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX25hbWVfcHRyIElUVE5PVElGWV9OQU1FKG5vdGlmeV9zeW5jX25hbWUpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19uYW1lQShhZGRyLCBvYmp0eXBlLCB0eXBlbGVuLCBvYmpuYW1lLCBuYW1lbGVuLCBhdHRyaWJ1dGUpCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX25hbWVBX3B0ciAwCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX25hbWVXKGFkZHIsIG9ianR5cGUsIHR5cGVsZW4sIG9iam5hbWUsIG5hbWVsZW4sIGF0dHJpYnV0ZSkKKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfbmFtZVdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19uYW1lKGFkZHIsIG9ianR5cGUsIHR5cGVsZW4sIG9iam5hbWUsIG5hbWVsZW4sIGF0dHJpYnV0ZSkKKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfbmFtZV9wdHIgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX25hbWVBX3B0ciAwCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX25hbWVXX3B0ciAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfbmFtZV9wdHIgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBkZXByZWNhdGVkIExlZ2FjeSBBUEkKKyAqIEBicmllZiBFbnRlciBzcGluIGxvb3Agb24gdXNlci1kZWZpbmVkIHN5bmMgb2JqZWN0CisgKi8KK3ZvaWQgTElCSVRUQVBJIF9faXR0X25vdGlmeV9zeW5jX3ByZXBhcmUodm9pZCogYWRkcik7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihMSUJJVFRBUEksIHZvaWQsIG5vdGlmeV9zeW5jX3ByZXBhcmUsICh2b2lkICphZGRyKSkKKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfcHJlcGFyZSAgICAgSVRUTk9USUZZX1ZPSUQobm90aWZ5X3N5bmNfcHJlcGFyZSkKKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfcHJlcGFyZV9wdHIgSVRUTk9USUZZX05BTUUobm90aWZ5X3N5bmNfcHJlcGFyZSkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX3ByZXBhcmUoYWRkcikKKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfcHJlcGFyZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX3ByZXBhcmVfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAZGVwcmVjYXRlZCBMZWdhY3kgQVBJCisgKiBAYnJpZWYgUXVpdCBzcGluIGxvb3Agd2l0aG91dCBhY3F1aXJpbmcgc3BpbiBvYmplY3QKKyAqLwordm9pZCBMSUJJVFRBUEkgX19pdHRfbm90aWZ5X3N5bmNfY2FuY2VsKHZvaWQgKmFkZHIpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoTElCSVRUQVBJLCB2b2lkLCBub3RpZnlfc3luY19jYW5jZWwsICh2b2lkICphZGRyKSkKKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfY2FuY2VsICAgICBJVFROT1RJRllfVk9JRChub3RpZnlfc3luY19jYW5jZWwpCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX2NhbmNlbF9wdHIgSVRUTk9USUZZX05BTUUobm90aWZ5X3N5bmNfY2FuY2VsKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfY2FuY2VsKGFkZHIpCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX2NhbmNlbF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX2NhbmNlbF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBkZXByZWNhdGVkIExlZ2FjeSBBUEkKKyAqIEBicmllZiBTdWNjZXNzZnVsIHNwaW4gbG9vcCBjb21wbGV0aW9uIChzeW5jIG9iamVjdCBhY3F1aXJlZCkKKyAqLwordm9pZCBMSUJJVFRBUEkgX19pdHRfbm90aWZ5X3N5bmNfYWNxdWlyZWQodm9pZCAqYWRkcik7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihMSUJJVFRBUEksIHZvaWQsIG5vdGlmeV9zeW5jX2FjcXVpcmVkLCAodm9pZCAqYWRkcikpCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX2FjcXVpcmVkICAgICBJVFROT1RJRllfVk9JRChub3RpZnlfc3luY19hY3F1aXJlZCkKKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfYWNxdWlyZWRfcHRyIElUVE5PVElGWV9OQU1FKG5vdGlmeV9zeW5jX2FjcXVpcmVkKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfYWNxdWlyZWQoYWRkcikKKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfYWNxdWlyZWRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19hY3F1aXJlZF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBkZXByZWNhdGVkIExlZ2FjeSBBUEkKKyAqIEBicmllZiBTdGFydCBzeW5jIG9iamVjdCByZWxlYXNpbmcgY29kZS4gSXMgY2FsbGVkIGJlZm9yZSB0aGUgbG9jayByZWxlYXNlIGNhbGwuCisgKi8KK3ZvaWQgTElCSVRUQVBJIF9faXR0X25vdGlmeV9zeW5jX3JlbGVhc2luZyh2b2lkKiBhZGRyKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKExJQklUVEFQSSwgdm9pZCwgbm90aWZ5X3N5bmNfcmVsZWFzaW5nLCAodm9pZCAqYWRkcikpCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX3JlbGVhc2luZyAgICAgSVRUTk9USUZZX1ZPSUQobm90aWZ5X3N5bmNfcmVsZWFzaW5nKQorI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19yZWxlYXNpbmdfcHRyIElUVE5PVElGWV9OQU1FKG5vdGlmeV9zeW5jX3JlbGVhc2luZykKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX3JlbGVhc2luZyhhZGRyKQorI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19yZWxlYXNpbmdfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19yZWxlYXNpbmdfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKy8qKiBAfSBsZWdhY3lfc3luYyBncm91cCAqLworCisjaWZuZGVmIF9JVFROT1RJRllfSF8KKy8qKgorICogQGRlZmdyb3VwIGxlZ2FjeV9ldmVudHMgRXZlbnRzCisgKiBAaW5ncm91cCBsZWdhY3kKKyAqIEV2ZW50cyBncm91cAorICogQHsKKyAqLworCisvKiogQGJyaWVmIHVzZXIgZXZlbnQgdHlwZSAqLwordHlwZWRlZiBpbnQgX19pdHRfZXZlbnQ7CisKKy8qKgorICogQGJyaWVmIENyZWF0ZSBhbiBldmVudCBub3RpZmljYXRpb24KKyAqIEBub3RlIG5hbWUgb3IgbmFtZWxlbiBiZWluZyBudWxsL25hbWUgYW5kIG5hbWVsZW4gbm90IG1hdGNoaW5nLCB1c2VyIGV2ZW50IGZlYXR1cmUgbm90IGVuYWJsZWQKKyAqIEByZXR1cm4gbm9uLXplcm8gZXZlbnQgaWRlbnRpZmllciB1cG9uIHN1Y2Nlc3MgYW5kIF9faXR0X2VyciBvdGhlcndpc2UKKyAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorX19pdHRfZXZlbnQgTElCSVRUQVBJIF9faXR0X2V2ZW50X2NyZWF0ZUEoY29uc3QgY2hhciAgICAqbmFtZSwgaW50IG5hbWVsZW4pOworX19pdHRfZXZlbnQgTElCSVRUQVBJIF9faXR0X2V2ZW50X2NyZWF0ZVcoY29uc3Qgd2NoYXJfdCAqbmFtZSwgaW50IG5hbWVsZW4pOworI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKyMgIGRlZmluZSBfX2l0dF9ldmVudF9jcmVhdGUgICAgIF9faXR0X2V2ZW50X2NyZWF0ZVcKKyMgIGRlZmluZSBfX2l0dF9ldmVudF9jcmVhdGVfcHRyIF9faXR0X2V2ZW50X2NyZWF0ZVdfcHRyCisjZWxzZQorIyAgZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZSAgICAgX19pdHRfZXZlbnRfY3JlYXRlQQorIyAgZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZV9wdHIgX19pdHRfZXZlbnRfY3JlYXRlQV9wdHIKKyNlbmRpZiAvKiBVTklDT0RFICovCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitfX2l0dF9ldmVudCBMSUJJVFRBUEkgX19pdHRfZXZlbnRfY3JlYXRlKGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuKTsKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUIoTElCSVRUQVBJLCBfX2l0dF9ldmVudCwgZXZlbnRfY3JlYXRlQSwgKGNvbnN0IGNoYXIgICAgKm5hbWUsIGludCBuYW1lbGVuKSkKK0lUVF9TVFVCKExJQklUVEFQSSwgX19pdHRfZXZlbnQsIGV2ZW50X2NyZWF0ZVcsIChjb25zdCB3Y2hhcl90ICpuYW1lLCBpbnQgbmFtZWxlbikpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQihMSUJJVFRBUEksIF9faXR0X2V2ZW50LCBldmVudF9jcmVhdGUsICAoY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4pKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9ldmVudF9jcmVhdGVBICAgICBJVFROT1RJRllfREFUQShldmVudF9jcmVhdGVBKQorI2RlZmluZSBfX2l0dF9ldmVudF9jcmVhdGVBX3B0ciBJVFROT1RJRllfTkFNRShldmVudF9jcmVhdGVBKQorI2RlZmluZSBfX2l0dF9ldmVudF9jcmVhdGVXICAgICBJVFROT1RJRllfREFUQShldmVudF9jcmVhdGVXKQorI2RlZmluZSBfX2l0dF9ldmVudF9jcmVhdGVXX3B0ciBJVFROT1RJRllfTkFNRShldmVudF9jcmVhdGVXKQorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZSAgICAgIElUVE5PVElGWV9EQVRBKGV2ZW50X2NyZWF0ZSkKKyNkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlX3B0ciAgSVRUTk9USUZZX05BTUUoZXZlbnRfY3JlYXRlKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlQShuYW1lLCBuYW1lbGVuKSAoX19pdHRfZXZlbnQpMAorI2RlZmluZSBfX2l0dF9ldmVudF9jcmVhdGVBX3B0ciAwCisjZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZVcobmFtZSwgbmFtZWxlbikgKF9faXR0X2V2ZW50KTAKKyNkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZShuYW1lLCBuYW1lbGVuKSAgKF9faXR0X2V2ZW50KTAKKyNkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlX3B0ciAgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZUFfcHRyIDAKKyNkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZV9wdHIgIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgUmVjb3JkIGFuIGV2ZW50IG9jY3VycmVuY2UuCisgKiBAcmV0dXJuIF9faXR0X2VyciB1cG9uIGZhaWx1cmUgKGludmFsaWQgZXZlbnQgaWQvdXNlciBldmVudCBmZWF0dXJlIG5vdCBlbmFibGVkKQorICovCitpbnQgTElCSVRUQVBJIF9faXR0X2V2ZW50X3N0YXJ0KF9faXR0X2V2ZW50IGV2ZW50KTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUIoTElCSVRUQVBJLCBpbnQsIGV2ZW50X3N0YXJ0LCAoX19pdHRfZXZlbnQgZXZlbnQpKQorI2RlZmluZSBfX2l0dF9ldmVudF9zdGFydCAgICAgSVRUTk9USUZZX0RBVEEoZXZlbnRfc3RhcnQpCisjZGVmaW5lIF9faXR0X2V2ZW50X3N0YXJ0X3B0ciBJVFROT1RJRllfTkFNRShldmVudF9zdGFydCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2V2ZW50X3N0YXJ0KGV2ZW50KSAoaW50KTAKKyNkZWZpbmUgX19pdHRfZXZlbnRfc3RhcnRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9ldmVudF9zdGFydF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBSZWNvcmQgYW4gZXZlbnQgZW5kIG9jY3VycmVuY2UuCisgKiBAbm90ZSBJdCBpcyBvcHRpb25hbCBpZiBldmVudHMgZG8gbm90IGhhdmUgZHVyYXRpb25zLgorICogQHJldHVybiBfX2l0dF9lcnIgdXBvbiBmYWlsdXJlIChpbnZhbGlkIGV2ZW50IGlkL3VzZXIgZXZlbnQgZmVhdHVyZSBub3QgZW5hYmxlZCkKKyAqLworaW50IExJQklUVEFQSSBfX2l0dF9ldmVudF9lbmQoX19pdHRfZXZlbnQgZXZlbnQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQihMSUJJVFRBUEksIGludCwgZXZlbnRfZW5kLCAoX19pdHRfZXZlbnQgZXZlbnQpKQorI2RlZmluZSBfX2l0dF9ldmVudF9lbmQgICAgIElUVE5PVElGWV9EQVRBKGV2ZW50X2VuZCkKKyNkZWZpbmUgX19pdHRfZXZlbnRfZW5kX3B0ciBJVFROT1RJRllfTkFNRShldmVudF9lbmQpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9ldmVudF9lbmQoZXZlbnQpIChpbnQpMAorI2RlZmluZSBfX2l0dF9ldmVudF9lbmRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9ldmVudF9lbmRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKy8qKiBAfSBsZWdhY3lfZXZlbnRzIGdyb3VwICovCisjZW5kaWYgLyogX0lUVE5PVElGWV9IXyAqLworCisvKioKKyAqIEBkZWZncm91cCBsZWdhY3lfbWVtb3J5IE1lbW9yeSBBY2Nlc3NlcworICogQGluZ3JvdXAgbGVnYWN5CisgKi8KKworLyoqCisgKiBAZGVwcmVjYXRlZCBMZWdhY3kgQVBJCisgKiBAYnJpZWYgSW5mb3JtIHRoZSB0b29sIG9mIG1lbW9yeSBhY2Nlc3NlcyBvbiByZWFkaW5nCisgKi8KK3ZvaWQgTElCSVRUQVBJIF9faXR0X21lbW9yeV9yZWFkKHZvaWQgKmFkZHIsIHNpemVfdCBzaXplKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKExJQklUVEFQSSwgdm9pZCwgbWVtb3J5X3JlYWQsICh2b2lkICphZGRyLCBzaXplX3Qgc2l6ZSkpCisjZGVmaW5lIF9faXR0X21lbW9yeV9yZWFkICAgICBJVFROT1RJRllfVk9JRChtZW1vcnlfcmVhZCkKKyNkZWZpbmUgX19pdHRfbWVtb3J5X3JlYWRfcHRyIElUVE5PVElGWV9OQU1FKG1lbW9yeV9yZWFkKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfbWVtb3J5X3JlYWQoYWRkciwgc2l6ZSkKKyNkZWZpbmUgX19pdHRfbWVtb3J5X3JlYWRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9tZW1vcnlfcmVhZF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBkZXByZWNhdGVkIExlZ2FjeSBBUEkKKyAqIEBicmllZiBJbmZvcm0gdGhlIHRvb2wgb2YgbWVtb3J5IGFjY2Vzc2VzIG9uIHdyaXRpbmcKKyAqLwordm9pZCBMSUJJVFRBUEkgX19pdHRfbWVtb3J5X3dyaXRlKHZvaWQgKmFkZHIsIHNpemVfdCBzaXplKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKExJQklUVEFQSSwgdm9pZCwgbWVtb3J5X3dyaXRlLCAodm9pZCAqYWRkciwgc2l6ZV90IHNpemUpKQorI2RlZmluZSBfX2l0dF9tZW1vcnlfd3JpdGUgICAgIElUVE5PVElGWV9WT0lEKG1lbW9yeV93cml0ZSkKKyNkZWZpbmUgX19pdHRfbWVtb3J5X3dyaXRlX3B0ciBJVFROT1RJRllfTkFNRShtZW1vcnlfd3JpdGUpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9tZW1vcnlfd3JpdGUoYWRkciwgc2l6ZSkKKyNkZWZpbmUgX19pdHRfbWVtb3J5X3dyaXRlX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfbWVtb3J5X3dyaXRlX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGRlcHJlY2F0ZWQgTGVnYWN5IEFQSQorICogQGJyaWVmIEluZm9ybSB0aGUgdG9vbCBvZiBtZW1vcnkgYWNjZXNzZXMgb24gdXBkYXRpbmcKKyAqLwordm9pZCBMSUJJVFRBUEkgX19pdHRfbWVtb3J5X3VwZGF0ZSh2b2lkICphZGRyZXNzLCBzaXplX3Qgc2l6ZSk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihMSUJJVFRBUEksIHZvaWQsIG1lbW9yeV91cGRhdGUsICh2b2lkICphZGRyLCBzaXplX3Qgc2l6ZSkpCisjZGVmaW5lIF9faXR0X21lbW9yeV91cGRhdGUgICAgIElUVE5PVElGWV9WT0lEKG1lbW9yeV91cGRhdGUpCisjZGVmaW5lIF9faXR0X21lbW9yeV91cGRhdGVfcHRyIElUVE5PVElGWV9OQU1FKG1lbW9yeV91cGRhdGUpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9tZW1vcnlfdXBkYXRlKGFkZHIsIHNpemUpCisjZGVmaW5lIF9faXR0X21lbW9yeV91cGRhdGVfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9tZW1vcnlfdXBkYXRlX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisvKiogQH0gbGVnYWN5X21lbW9yeSBncm91cCAqLworCisvKioKKyAqIEBkZWZncm91cCBsZWdhY3lfc3RhdGUgVGhyZWFkIGFuZCBPYmplY3QgU3RhdGVzCisgKiBAaW5ncm91cCBsZWdhY3kKKyAqLworCisvKiogQGJyaWVmIHN0YXRlIHR5cGUgKi8KK3R5cGVkZWYgaW50IF9faXR0X3N0YXRlX3Q7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLwordHlwZWRlZiBlbnVtIF9faXR0X29ial9zdGF0ZSB7CisgICAgX19pdHRfb2JqX3N0YXRlX2VyciA9IDAsCisgICAgX19pdHRfb2JqX3N0YXRlX2NsciA9IDEsCisgICAgX19pdHRfb2JqX3N0YXRlX3NldCA9IDIsCisgICAgX19pdHRfb2JqX3N0YXRlX3VzZSA9IDMKK30gX19pdHRfb2JqX3N0YXRlX3Q7CisKK3R5cGVkZWYgZW51bSBfX2l0dF90aHJfc3RhdGUgeworICAgIF9faXR0X3Rocl9zdGF0ZV9lcnIgPSAwLAorICAgIF9faXR0X3Rocl9zdGF0ZV9jbHIgPSAxLAorICAgIF9faXR0X3Rocl9zdGF0ZV9zZXQgPSAyCit9IF9faXR0X3Rocl9zdGF0ZV90OworCit0eXBlZGVmIGVudW0gX19pdHRfb2JqX3Byb3AgeworICAgIF9faXR0X29ial9wcm9wX3dhdGNoICAgID0gMSwKKyAgICBfX2l0dF9vYmpfcHJvcF9pZ25vcmUgICA9IDIsCisgICAgX19pdHRfb2JqX3Byb3Bfc2hhcmFibGUgPSAzCit9IF9faXR0X29ial9wcm9wX3Q7CisKK3R5cGVkZWYgZW51bSBfX2l0dF90aHJfcHJvcCB7CisgICAgX19pdHRfdGhyX3Byb3BfcXVpZXQgPSAxCit9IF9faXR0X3Rocl9wcm9wX3Q7CisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAZGVwcmVjYXRlZCBMZWdhY3kgQVBJCisgKiBAYnJpZWYgbWFuYWdpbmcgdGhyZWFkIGFuZCBvYmplY3Qgc3RhdGVzCisgKi8KK19faXR0X3N0YXRlX3QgTElCSVRUQVBJIF9faXR0X3N0YXRlX2dldCh2b2lkKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9zdGF0ZV90LCBzdGF0ZV9nZXQsICh2b2lkKSkKKyNkZWZpbmUgX19pdHRfc3RhdGVfZ2V0ICAgICBJVFROT1RJRllfREFUQShzdGF0ZV9nZXQpCisjZGVmaW5lIF9faXR0X3N0YXRlX2dldF9wdHIgSVRUTk9USUZZX05BTUUoc3RhdGVfZ2V0KQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfc3RhdGVfZ2V0KHZvaWQpIChfX2l0dF9zdGF0ZV90KTAKKyNkZWZpbmUgX19pdHRfc3RhdGVfZ2V0X3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfc3RhdGVfZ2V0X3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGRlcHJlY2F0ZWQgTGVnYWN5IEFQSQorICogQGJyaWVmIG1hbmFnaW5nIHRocmVhZCBhbmQgb2JqZWN0IHN0YXRlcworICovCitfX2l0dF9zdGF0ZV90IExJQklUVEFQSSBfX2l0dF9zdGF0ZV9zZXQoX19pdHRfc3RhdGVfdCBzKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9zdGF0ZV90LCBzdGF0ZV9zZXQsIChfX2l0dF9zdGF0ZV90IHMpKQorI2RlZmluZSBfX2l0dF9zdGF0ZV9zZXQgICAgIElUVE5PVElGWV9EQVRBKHN0YXRlX3NldCkKKyNkZWZpbmUgX19pdHRfc3RhdGVfc2V0X3B0ciBJVFROT1RJRllfTkFNRShzdGF0ZV9zZXQpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9zdGF0ZV9zZXQocykgKF9faXR0X3N0YXRlX3QpMAorI2RlZmluZSBfX2l0dF9zdGF0ZV9zZXRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9zdGF0ZV9zZXRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAZGVwcmVjYXRlZCBMZWdhY3kgQVBJCisgKiBAYnJpZWYgbWFuYWdpbmcgdGhyZWFkIGFuZCBvYmplY3QgbW9kZXMKKyAqLworX19pdHRfdGhyX3N0YXRlX3QgTElCSVRUQVBJIF9faXR0X3Rocl9tb2RlX3NldChfX2l0dF90aHJfcHJvcF90IHAsIF9faXR0X3Rocl9zdGF0ZV90IHMpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQihJVFRBUEksIF9faXR0X3Rocl9zdGF0ZV90LCB0aHJfbW9kZV9zZXQsIChfX2l0dF90aHJfcHJvcF90IHAsIF9faXR0X3Rocl9zdGF0ZV90IHMpKQorI2RlZmluZSBfX2l0dF90aHJfbW9kZV9zZXQgICAgIElUVE5PVElGWV9EQVRBKHRocl9tb2RlX3NldCkKKyNkZWZpbmUgX19pdHRfdGhyX21vZGVfc2V0X3B0ciBJVFROT1RJRllfTkFNRSh0aHJfbW9kZV9zZXQpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF90aHJfbW9kZV9zZXQocCwgcykgKF9faXR0X3Rocl9zdGF0ZV90KTAKKyNkZWZpbmUgX19pdHRfdGhyX21vZGVfc2V0X3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfdGhyX21vZGVfc2V0X3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGRlcHJlY2F0ZWQgTGVnYWN5IEFQSQorICogQGJyaWVmIG1hbmFnaW5nIHRocmVhZCBhbmQgb2JqZWN0IG1vZGVzCisgKi8KK19faXR0X29ial9zdGF0ZV90IExJQklUVEFQSSBfX2l0dF9vYmpfbW9kZV9zZXQoX19pdHRfb2JqX3Byb3BfdCBwLCBfX2l0dF9vYmpfc3RhdGVfdCBzKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9vYmpfc3RhdGVfdCwgb2JqX21vZGVfc2V0LCAoX19pdHRfb2JqX3Byb3BfdCBwLCBfX2l0dF9vYmpfc3RhdGVfdCBzKSkKKyNkZWZpbmUgX19pdHRfb2JqX21vZGVfc2V0ICAgICBJVFROT1RJRllfREFUQShvYmpfbW9kZV9zZXQpCisjZGVmaW5lIF9faXR0X29ial9tb2RlX3NldF9wdHIgSVRUTk9USUZZX05BTUUob2JqX21vZGVfc2V0KQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfb2JqX21vZGVfc2V0KHAsIHMpIChfX2l0dF9vYmpfc3RhdGVfdCkwCisjZGVmaW5lIF9faXR0X29ial9tb2RlX3NldF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X29ial9tb2RlX3NldF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworLyoqIEB9IGxlZ2FjeV9zdGF0ZSBncm91cCAqLworCisvKioKKyAqIEBkZWZncm91cCBmcmFtZXMgRnJhbWVzCisgKiBAaW5ncm91cCBsZWdhY3kKKyAqIEZyYW1lcyBncm91cAorICogQHsKKyAqLworLyoqCisgKiBAYnJpZWYgb3BhcXVlIHN0cnVjdHVyZSBmb3IgZnJhbWUgaWRlbnRpZmljYXRpb24KKyAqLwordHlwZWRlZiBzdHJ1Y3QgX19pdHRfZnJhbWVfdCAqX19pdHRfZnJhbWU7CisKKy8qKgorICogQGJyaWVmIENyZWF0ZSBhIGdsb2JhbCBmcmFtZSB3aXRoIGdpdmVuIGRvbWFpbgorICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitfX2l0dF9mcmFtZSBJVFRBUEkgX19pdHRfZnJhbWVfY3JlYXRlQShjb25zdCBjaGFyICAgICpkb21haW4pOworX19pdHRfZnJhbWUgSVRUQVBJIF9faXR0X2ZyYW1lX2NyZWF0ZVcoY29uc3Qgd2NoYXJfdCAqZG9tYWluKTsKKyNpZiBkZWZpbmVkKFVOSUNPREUpIHx8IGRlZmluZWQoX1VOSUNPREUpCisjICBkZWZpbmUgX19pdHRfZnJhbWVfY3JlYXRlICAgICBfX2l0dF9mcmFtZV9jcmVhdGVXCisjICBkZWZpbmUgX19pdHRfZnJhbWVfY3JlYXRlX3B0ciBfX2l0dF9mcmFtZV9jcmVhdGVXX3B0cgorI2Vsc2UgLyogVU5JQ09ERSAqLworIyAgZGVmaW5lIF9faXR0X2ZyYW1lX2NyZWF0ZSAgICAgX19pdHRfZnJhbWVfY3JlYXRlQQorIyAgZGVmaW5lIF9faXR0X2ZyYW1lX2NyZWF0ZV9wdHIgX19pdHRfZnJhbWVfY3JlYXRlQV9wdHIKKyNlbmRpZiAvKiBVTklDT0RFICovCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK19faXR0X2ZyYW1lIElUVEFQSSBfX2l0dF9mcmFtZV9jcmVhdGUoY29uc3QgY2hhciAqZG9tYWluKTsKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9mcmFtZSwgZnJhbWVfY3JlYXRlQSwgKGNvbnN0IGNoYXIgICAgKmRvbWFpbikpCitJVFRfU1RVQihJVFRBUEksIF9faXR0X2ZyYW1lLCBmcmFtZV9jcmVhdGVXLCAoY29uc3Qgd2NoYXJfdCAqZG9tYWluKSkKKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfZnJhbWUsIGZyYW1lX2NyZWF0ZSwgIChjb25zdCBjaGFyICpkb21haW4pKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9mcmFtZV9jcmVhdGVBICAgICBJVFROT1RJRllfREFUQShmcmFtZV9jcmVhdGVBKQorI2RlZmluZSBfX2l0dF9mcmFtZV9jcmVhdGVBX3B0ciBJVFROT1RJRllfTkFNRShmcmFtZV9jcmVhdGVBKQorI2RlZmluZSBfX2l0dF9mcmFtZV9jcmVhdGVXICAgICBJVFROT1RJRllfREFUQShmcmFtZV9jcmVhdGVXKQorI2RlZmluZSBfX2l0dF9mcmFtZV9jcmVhdGVXX3B0ciBJVFROT1RJRllfTkFNRShmcmFtZV9jcmVhdGVXKQorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X2ZyYW1lX2NyZWF0ZSAgICAgSVRUTk9USUZZX0RBVEEoZnJhbWVfY3JlYXRlKQorI2RlZmluZSBfX2l0dF9mcmFtZV9jcmVhdGVfcHRyIElUVE5PVElGWV9OQU1FKGZyYW1lX2NyZWF0ZSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X2ZyYW1lX2NyZWF0ZUEoZG9tYWluKQorI2RlZmluZSBfX2l0dF9mcmFtZV9jcmVhdGVBX3B0ciAwCisjZGVmaW5lIF9faXR0X2ZyYW1lX2NyZWF0ZVcoZG9tYWluKQorI2RlZmluZSBfX2l0dF9mcmFtZV9jcmVhdGVXX3B0ciAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfZnJhbWVfY3JlYXRlKGRvbWFpbikKKyNkZWZpbmUgX19pdHRfZnJhbWVfY3JlYXRlX3B0ciAgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X2ZyYW1lX2NyZWF0ZUFfcHRyIDAKKyNkZWZpbmUgX19pdHRfZnJhbWVfY3JlYXRlV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X2ZyYW1lX2NyZWF0ZV9wdHIgIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqIEBicmllZiBSZWNvcmQgYW4gZnJhbWUgYmVnaW4gb2NjdXJyZW5jZS4gKi8KK3ZvaWQgSVRUQVBJIF9faXR0X2ZyYW1lX2JlZ2luKF9faXR0X2ZyYW1lIGZyYW1lKTsKKy8qKiBAYnJpZWYgUmVjb3JkIGFuIGZyYW1lIGVuZCBvY2N1cnJlbmNlLiAqLwordm9pZCBJVFRBUEkgX19pdHRfZnJhbWVfZW5kICAoX19pdHRfZnJhbWUgZnJhbWUpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBmcmFtZV9iZWdpbiwgKF9faXR0X2ZyYW1lIGZyYW1lKSkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGZyYW1lX2VuZCwgICAoX19pdHRfZnJhbWUgZnJhbWUpKQorI2RlZmluZSBfX2l0dF9mcmFtZV9iZWdpbiAgICAgSVRUTk9USUZZX1ZPSUQoZnJhbWVfYmVnaW4pCisjZGVmaW5lIF9faXR0X2ZyYW1lX2JlZ2luX3B0ciBJVFROT1RJRllfTkFNRShmcmFtZV9iZWdpbikKKyNkZWZpbmUgX19pdHRfZnJhbWVfZW5kICAgICAgIElUVE5PVElGWV9WT0lEKGZyYW1lX2VuZCkKKyNkZWZpbmUgX19pdHRfZnJhbWVfZW5kX3B0ciAgIElUVE5PVElGWV9OQU1FKGZyYW1lX2VuZCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2ZyYW1lX2JlZ2luKGZyYW1lKQorI2RlZmluZSBfX2l0dF9mcmFtZV9iZWdpbl9wdHIgMAorI2RlZmluZSBfX2l0dF9mcmFtZV9lbmQoZnJhbWUpCisjZGVmaW5lIF9faXR0X2ZyYW1lX2VuZF9wdHIgICAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfZnJhbWVfYmVnaW5fcHRyIDAKKyNkZWZpbmUgX19pdHRfZnJhbWVfZW5kX3B0ciAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKy8qKiBAfSBmcmFtZXMgZ3JvdXAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmIC8qIF9MRUdBQ1lfSVRUTk9USUZZX0hfICovCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy96X0xpbnV4X2FzbS5zIGIvZmluYWwvcnVudGltZS9zcmMvel9MaW51eF9hc20ucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzg1ZmFiCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMvel9MaW51eF9hc20ucwpAQCAtMCwwICsxLDEzOTcgQEAKKy8vICB6X0xpbnV4X2FzbS5zOiAgLSBtaWNyb3Rhc2tpbmcgcm91dGluZXMgc3BlY2lmaWNhbGx5CisvLyAgICAgICAgICAgICAgICAgICAgd3JpdHRlbiBmb3IgSW50ZWwgcGxhdGZvcm1zIHJ1bm5pbmcgTGludXgqIE9TCisvLyAkUmV2aXNpb246IDQzNDczICQKKy8vICREYXRlOiAyMDE0LTA5LTI2IDE1OjAyOjU3IC0wNTAwIChGcmksIDI2IFNlcCAyMDE0KSAkCisKKy8vCisvLy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8vCisvLy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vLy8KKy8vLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8vLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vLy8KKy8vLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBtYWNyb3MKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisKKyMgaWYgX19NSUNfXyB8fCBfX01JQzJfXworLy8KKy8vIHRoZSAnZGVsYXkgcjE2L3IzMi9yNjQnIHNob3VsZCBiZSB1c2VkIGluc3RlYWQgb2YgdGhlICdwYXVzZScuCisvLyBUaGUgZGVsYXkgb3BlcmF0aW9uIGhhcyB0aGUgZWZmZWN0IG9mIHJlbW92aW5nIHRoZSBjdXJyZW50IHRocmVhZCBmcm9tCisvLyB0aGUgcm91bmQtcm9iaW4gSFQgbWVjaGFuaXNtLCBhbmQgdGhlcmVmb3JlIHNwZWVkcyB1cCB0aGUgaXNzdWUgcmF0ZSBvZgorLy8gdGhlIG90aGVyIHRocmVhZHMgb24gdGhlIHNhbWUgY29yZS4KKy8vCisvLyBBIHZhbHVlIG9mIDAgd29ya3MgZmluZSBmb3IgPD0gMiB0aHJlYWRzIHBlciBjb3JlLCBidXQgY2F1c2VzIHRoZSBFUENDCisvLyBiYXJyaWVyIHRpbWUgdG8gaW5jcmVhc2UgZ3JlYXRseSBmb3IgMyBvciBtb3JlIHRocmVhZHMgcGVyIGNvcmUuCisvLworLy8gQSB2YWx1ZSBvZiAxMDAgd29ya3MgcHJldHR5IHdlbGwgZm9yIHVwIHRvIDQgdGhyZWFkcyBwZXIgY29yZSwgYnV0IGlzbid0CisvLyBxdWl0ZSBhcyBmYXN0IGFzIDAgZm9yIDIgdGhyZWFkcyBwZXIgY29yZS4KKy8vCisvLyBXZSBuZWVkIHRvIGNoZWNrIHdoYXQgaGFwcGVucyBmb3Igb3ZlcnN1YnNjcmlwdGlvbiAvID4gNCB0aHJlYWRzIHBlciBjb3JlLgorLy8gSXQgaXMgcG9zc2libGUgdGhhdCB3ZSBuZWVkIHRvIHBhc3MgdGhlIGRlbGF5IHZhbHVlIGluIGFzIGEgcGFyYW1ldGVyCisvLyB0aGF0IHRoZSBjYWxsZXIgZGV0ZXJtaW5lcyBiYXNlZCBvbiB0aGUgdG90YWwgIyB0aHJlYWRzIC8gIyBjb3Jlcy4KKy8vCisvLy5tYWNybyBwYXVzZV9vcAorLy8JbW92ICAgICQxMDAsICVyYXgKKy8vCWRlbGF5ICAlcmF4CisvLy5lbmRtCisjIGVsc2UKKyMgIGRlZmluZSBwYXVzZV9vcCAgIC5ieXRlIDB4ZjMsMHg5MAorIyBlbmRpZiAvLyBfX01JQ19fIHx8IF9fTUlDMl9fCisKKyMgaWYgZGVmaW5lZCBfX0FQUExFX18gJiYgZGVmaW5lZCBfX01BQ0hfXworIyAgZGVmaW5lIEtNUF9QUkVGSVhfVU5ERVJTQ09SRSh4KSBfIyN4ICAvLyBleHRyYSB1bmRlcnNjb3JlIGZvciBPUyBYKiBzeW1ib2xzCisubWFjcm8gQUxJR04KKwkuYWxpZ24gJDAKKy5lbmRtYWNybworLm1hY3JvIERFQlVHX0lORk8KKy8qIE5vdCBzdXJlIHdoYXQgLnNpemUgZG9lcyBpbiBpY2MsIG5vdCBzdXJlIGlmIHdlIG5lZWQgdG8gZG8gc29tZXRoaW5nCisgICBzaW1pbGFyIGZvciBPUyBYKi4KKyovCisuZW5kbWFjcm8KKy5tYWNybyBQUk9DCisJQUxJR04gIDQKKwkuZ2xvYmwgS01QX1BSRUZJWF9VTkRFUlNDT1JFKCQwKQorS01QX1BSRUZJWF9VTkRFUlNDT1JFKCQwKToKKy5lbmRtYWNybworIyBlbHNlIC8vIGRlZmluZWQgX19BUFBMRV9fICYmIGRlZmluZWQgX19NQUNIX18KKyMgIGRlZmluZSBLTVBfUFJFRklYX1VOREVSU0NPUkUoeCkgeCAgLy8gbm8gZXh0cmEgdW5kZXJzY29yZSBmb3IgTGludXgqIE9TIHN5bWJvbHMKKy5tYWNybyBBTElHTiBzaXplCisJLmFsaWduIDE8PChcc2l6ZSkKKy5lbmRtCisubWFjcm8gREVCVUdfSU5GTyBwcm9jCisvLyBOb3Qgc3VyZSB3aHkgd2UgbmVlZCAudHlwZSBhbmQgLnNpemUgZm9yIHRoZSBmdW5jdGlvbnMKKwkuYWxpZ24gMTYKKwkudHlwZSAgXHByb2MsQGZ1bmN0aW9uCisgICAgICAgIC5zaXplICBccHJvYywuLVxwcm9jCisuZW5kbQorLm1hY3JvIFBST0MgcHJvYworCUFMSUdOICA0CisgICAgICAgIC5nbG9ibCBLTVBfUFJFRklYX1VOREVSU0NPUkUoXHByb2MpCitLTVBfUFJFRklYX1VOREVSU0NPUkUoXHByb2MpOgorLmVuZG0KKyMgZW5kaWYgLy8gZGVmaW5lZCBfX0FQUExFX18gJiYgZGVmaW5lZCBfX01BQ0hfXworI2VuZGlmIC8vIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF94ODZfNjQKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZGF0YQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorCisvLworLy8gU3VwcG9ydCBmb3IgdW5uYW1lZCBjb21tb24gYmxvY2tzLgorLy8KKy8vIEJlY2F1c2UgdGhlIHN5bWJvbCAiLmdvbXBfY3JpdGljYWxfdXNlcl8iIGNvbnRhaW5zIGEgIi4iLCB3ZSBoYXZlIHRvCisvLyBwdXQgdGhpcyBzdHVmZiBpbiBhc3NlbWJseS4KKy8vCisKKyMgaWYgS01QX0FSQ0hfWDg2CisjICBpZiBkZWZpbmVkIF9fQVBQTEVfXyAmJiBkZWZpbmVkIF9fTUFDSF9fCisgICAgICAgIC5kYXRhCisgICAgICAgIC5jb21tIC5nb21wX2NyaXRpY2FsX3VzZXJfLDMyCisgICAgICAgIC5kYXRhCisgICAgICAgIC5nbG9ibCBfX19rbXBfdW5uYW1lZF9jcml0aWNhbF9hZGRyCitfX19rbXBfdW5uYW1lZF9jcml0aWNhbF9hZGRyOgorICAgICAgICAubG9uZyAuZ29tcF9jcml0aWNhbF91c2VyXworIyAgZWxzZSAvKiBMaW51eCogT1MgKi8KKyAgICAgICAgLmRhdGEKKyAgICAgICAgLmNvbW0gLmdvbXBfY3JpdGljYWxfdXNlcl8sMzIsOAorICAgICAgICAuZGF0YQorCUFMSUdOIDQKKyAgICAgICAgLmdsb2JhbCBfX2ttcF91bm5hbWVkX2NyaXRpY2FsX2FkZHIKK19fa21wX3VubmFtZWRfY3JpdGljYWxfYWRkcjoKKyAgICAgICAgLjRieXRlIC5nb21wX2NyaXRpY2FsX3VzZXJfCisgICAgICAgIC50eXBlIF9fa21wX3VubmFtZWRfY3JpdGljYWxfYWRkcixAb2JqZWN0CisgICAgICAgIC5zaXplIF9fa21wX3VubmFtZWRfY3JpdGljYWxfYWRkciw0CisjICBlbmRpZiAvKiBkZWZpbmVkIF9fQVBQTEVfXyAmJiBkZWZpbmVkIF9fTUFDSF9fICovCisjIGVuZGlmIC8qIEtNUF9BUkNIX1g4NiAqLworCisjIGlmIEtNUF9BUkNIX1g4Nl82NAorIyAgaWYgZGVmaW5lZCBfX0FQUExFX18gJiYgZGVmaW5lZCBfX01BQ0hfXworICAgICAgICAuZGF0YQorICAgICAgICAuY29tbSAuZ29tcF9jcml0aWNhbF91c2VyXywzMgorICAgICAgICAuZGF0YQorICAgICAgICAuZ2xvYmwgX19fa21wX3VubmFtZWRfY3JpdGljYWxfYWRkcgorX19fa21wX3VubmFtZWRfY3JpdGljYWxfYWRkcjoKKyAgICAgICAgLnF1YWQgLmdvbXBfY3JpdGljYWxfdXNlcl8KKyMgIGVsc2UgLyogTGludXgqIE9TICovCisgICAgICAgIC5kYXRhCisgICAgICAgIC5jb21tIC5nb21wX2NyaXRpY2FsX3VzZXJfLDMyLDgKKyAgICAgICAgLmRhdGEKKwlBTElHTiA4CisgICAgICAgIC5nbG9iYWwgX19rbXBfdW5uYW1lZF9jcml0aWNhbF9hZGRyCitfX2ttcF91bm5hbWVkX2NyaXRpY2FsX2FkZHI6CisgICAgICAgIC44Ynl0ZSAuZ29tcF9jcml0aWNhbF91c2VyXworICAgICAgICAudHlwZSBfX2ttcF91bm5hbWVkX2NyaXRpY2FsX2FkZHIsQG9iamVjdAorICAgICAgICAuc2l6ZSBfX2ttcF91bm5hbWVkX2NyaXRpY2FsX2FkZHIsOAorIyAgZW5kaWYgLyogZGVmaW5lZCBfX0FQUExFX18gJiYgZGVmaW5lZCBfX01BQ0hfXyAqLworIyBlbmRpZiAvKiBLTVBfQVJDSF9YODZfNjQgKi8KKworI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworCisKKyNpZiBLTVBfQVJDSF9YODYgJiYgIUtNUF9BUkNIX1BQQzY0CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBtaWNyb3Rhc2tpbmcgcm91dGluZXMgc3BlY2lmaWNhbGx5IHdyaXR0ZW4gZm9yIElBLTMyIGFyY2hpdGVjdHVyZQorLy8gcnVubmluZyBMaW51eCogT1MKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworCisJLmlkZW50ICJJbnRlbCBDb3Jwb3JhdGlvbiIKKwkuZGF0YQorCUFMSUdOIDQKKy8vIHZvaWQKKy8vIF9fa21wX3g4Nl9wYXVzZSggdm9pZCApOworLy8KKworICAgICAgICAudGV4dAorCVBST0MgIF9fa21wX3g4Nl9wYXVzZQorCisgICAgICAgIHBhdXNlX29wCisgICAgICAgIHJldAorCisJREVCVUdfSU5GTyBfX2ttcF94ODZfcGF1c2UKKworLy8KKy8vIHZvaWQKKy8vIF9fa21wX3g4Nl9jcHVpZCggaW50IG1vZGUsIGludCBtb2RlMiwgdm9pZCAqY3B1aWRfYnVmZmVyICk7CisvLworCVBST0MgIF9fa21wX3g4Nl9jcHVpZAorCisJcHVzaGwgJWVicAorCW1vdmwgICVlc3AsJWVicAorICAgICAgICBwdXNobCAlZWRpCisgICAgICAgIHB1c2hsICVlYngKKyAgICAgICAgcHVzaGwgJWVjeAorICAgICAgICBwdXNobCAlZWR4CisKKwltb3ZsICA4KCVlYnApLCAlZWF4CisJbW92bCAgMTIoJWVicCksICVlY3gKKwljcHVpZAkJCQkvLyBRdWVyeSB0aGUgQ1BVSUQgZm9yIHRoZSBjdXJyZW50IHByb2Nlc3NvcgorCisJbW92bCAgMTYoJWVicCksICVlZGkKKwltb3ZsICAlZWF4LCAwKCVlZGkpCisJbW92bCAgJWVieCwgNCglZWRpKQorCW1vdmwgICVlY3gsIDgoJWVkaSkKKwltb3ZsICAlZWR4LCAxMiglZWRpKQorCisgICAgICAgIHBvcGwgICVlZHgKKyAgICAgICAgcG9wbCAgJWVjeAorICAgICAgICBwb3BsICAlZWJ4CisgICAgICAgIHBvcGwgICVlZGkKKyAgICAgICAgbW92bCAgJWVicCwgJWVzcAorICAgICAgICBwb3BsICAlZWJwCisJcmV0CisKKwlERUJVR19JTkZPIF9fa21wX3g4Nl9jcHVpZAorCisKKyMgaWYgIUtNUF9BU01fSU5UUklOUworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIGttcF9pbnQzMgorLy8gX19rbXBfdGVzdF90aGVuX2FkZDMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiBkICk7CisvLworCisgICAgICAgIFBST0MgICAgICBfX2ttcF90ZXN0X3RoZW5fYWRkMzIKKworICAgICAgICBtb3ZsICAgICAgNCglZXNwKSwgJWVjeAorICAgICAgICBtb3ZsICAgICAgOCglZXNwKSwgJWVheAorICAgICAgICBsb2NrCisgICAgICAgIHhhZGRsICAgICAlZWF4LCglZWN4KQorICAgICAgICByZXQKKworCURFQlVHX0lORk8gX19rbXBfdGVzdF90aGVuX2FkZDMyCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRlVOQ1RJT04gX19rbXBfeGNoZ19maXhlZDgKKy8vCisvLyBrbXBfaW50MzIKKy8vIF9fa21wX3hjaGdfZml4ZWQ4KCB2b2xhdGlsZSBrbXBfaW50OCAqcCwga21wX2ludDggZCApOworLy8KKy8vIHBhcmFtZXRlcnM6CisvLyAJcDoJNCglZXNwKQorLy8gCWQ6CTgoJWVzcCkKKy8vCisvLyByZXR1cm46CSVhbAorCisgICAgICAgIFBST0MgIF9fa21wX3hjaGdfZml4ZWQ4CisKKyAgICAgICAgbW92bCAgICAgIDQoJWVzcCksICVlY3ggICAgLy8gInAiCisgICAgICAgIG1vdmIgICAgICA4KCVlc3ApLCAlYWwJLy8gImQiCisKKyAgICAgICAgbG9jaworICAgICAgICB4Y2hnYiAgICAgJWFsLCglZWN4KQorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX3hjaGdfZml4ZWQ4CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGVU5DVElPTiBfX2ttcF94Y2hnX2ZpeGVkMTYKKy8vCisvLyBrbXBfaW50MTYKKy8vIF9fa21wX3hjaGdfZml4ZWQxNiggdm9sYXRpbGUga21wX2ludDE2ICpwLCBrbXBfaW50MTYgZCApOworLy8KKy8vIHBhcmFtZXRlcnM6CisvLyAJcDoJNCglZXNwKQorLy8gCWQ6CTgoJWVzcCkKKy8vIHJldHVybjogICAgICVheAorCisgICAgICAgIFBST0MgIF9fa21wX3hjaGdfZml4ZWQxNgorCisgICAgICAgIG1vdmwgICAgICA0KCVlc3ApLCAlZWN4ICAgIC8vICJwIgorICAgICAgICBtb3Z3ICAgICAgOCglZXNwKSwgJWF4CS8vICJkIgorCisgICAgICAgIGxvY2sKKyAgICAgICAgeGNoZ3cgICAgICVheCwoJWVjeCkKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF94Y2hnX2ZpeGVkMTYKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZVTkNUSU9OIF9fa21wX3hjaGdfZml4ZWQzMgorLy8KKy8vIGttcF9pbnQzMgorLy8gX19rbXBfeGNoZ19maXhlZDMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiBkICk7CisvLworLy8gcGFyYW1ldGVyczoKKy8vIAlwOgk0KCVlc3ApCisvLyAJZDoJOCglZXNwKQorLy8KKy8vIHJldHVybjoJJWVheAorCisgICAgICAgIFBST0MgIF9fa21wX3hjaGdfZml4ZWQzMgorCisgICAgICAgIG1vdmwgICAgICA0KCVlc3ApLCAlZWN4ICAgIC8vICJwIgorICAgICAgICBtb3ZsICAgICAgOCglZXNwKSwgJWVheAkvLyAiZCIKKworICAgICAgICBsb2NrCisgICAgICAgIHhjaGdsICAgICAlZWF4LCglZWN4KQorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX3hjaGdfZml4ZWQzMgorCisKKy8vCisvLyBrbXBfaW50OAorLy8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmU4KCB2b2xhdGlsZSBrbXBfaW50OCAqcCwga21wX2ludDggY3YsIGttcF9pbnQ4IHN2ICk7CisvLworCisgICAgICAgIFBST0MgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlOAorCisgICAgICAgIG1vdmwgICAgICA0KCVlc3ApLCAlZWN4CisgICAgICAgIG1vdmIgICAgICA4KCVlc3ApLCAlYWwKKyAgICAgICAgbW92YiAgICAgIDEyKCVlc3ApLCAlZGwKKyAgICAgICAgbG9jaworICAgICAgICBjbXB4Y2hnYiAgJWRsLCglZWN4KQorICAgICAgICBzZXRlICAgICAgJWFsICAgICAgICAgICAvLyBpZiAlYWwgPT0gKCVlY3gpIHNldCAlYWwgPSAxIGVsc2Ugc2V0ICVhbCA9IDAKKyAgICAgICAgYW5kICAgICAgICQxLCAlZWF4ICAgICAgLy8gc2lnbiBleHRlbmQgcHJldmlvdXMgaW5zdHJ1Y3Rpb24KKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTgKKworLy8KKy8vIGttcF9pbnQxNgorLy8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmUxNiggdm9sYXRpbGUga21wX2ludDE2ICpwLCBrbXBfaW50MTYgY3YsIGttcF9pbnQxNiBzdiApOworLy8KKworICAgICAgICBQUk9DICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTE2CisKKyAgICAgICAgbW92bCAgICAgIDQoJWVzcCksICVlY3gKKyAgICAgICAgbW92dyAgICAgIDgoJWVzcCksICVheAorICAgICAgICBtb3Z3ICAgICAgMTIoJWVzcCksICVkeAorICAgICAgICBsb2NrCisgICAgICAgIGNtcHhjaGd3ICAlZHgsKCVlY3gpCisgICAgICAgIHNldGUgICAgICAlYWwgICAgICAgICAgIC8vIGlmICVheCA9PSAoJWVjeCkgc2V0ICVhbCA9IDEgZWxzZSBzZXQgJWFsID0gMAorICAgICAgICBhbmQgICAgICAgJDEsICVlYXggICAgICAvLyBzaWduIGV4dGVuZCBwcmV2aW91cyBpbnN0cnVjdGlvbgorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMTYKKworLy8KKy8vIGttcF9pbnQzMgorLy8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmUzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgY3YsIGttcF9pbnQzMiBzdiApOworLy8KKworICAgICAgICBQUk9DICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTMyCisKKyAgICAgICAgbW92bCAgICAgIDQoJWVzcCksICVlY3gKKyAgICAgICAgbW92bCAgICAgIDgoJWVzcCksICVlYXgKKyAgICAgICAgbW92bCAgICAgIDEyKCVlc3ApLCAlZWR4CisgICAgICAgIGxvY2sKKyAgICAgICAgY21weGNoZ2wgICVlZHgsKCVlY3gpCisgICAgICAgIHNldGUgICAgICAlYWwgICAgICAgICAgIC8vIGlmICVlYXggPT0gKCVlY3gpIHNldCAlYWwgPSAxIGVsc2Ugc2V0ICVhbCA9IDAKKyAgICAgICAgYW5kICAgICAgICQxLCAlZWF4ICAgICAgLy8gc2lnbiBleHRlbmQgcHJldmlvdXMgaW5zdHJ1Y3Rpb24KKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTMyCisKKy8vCisvLyBrbXBfaW50MzIKKy8vIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IGN2LCBrbXBfaW50NjQgc3YgKTsKKy8vCisgICAgICAgIFBST0MgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQKKworICAgICAgICBwdXNobCAgICAgJWVicAorICAgICAgICBtb3ZsICAgICAgJWVzcCwgJWVicAorICAgICAgICBwdXNobCAgICAgJWVieAorICAgICAgICBwdXNobCAgICAgJWVkaQorICAgICAgICBtb3ZsICAgICAgOCglZWJwKSwgJWVkaQorICAgICAgICBtb3ZsICAgICAgMTIoJWVicCksICVlYXggICAgICAgIC8vICJjdiIgbG93IG9yZGVyIHdvcmQKKyAgICAgICAgbW92bCAgICAgIDE2KCVlYnApLCAlZWR4ICAgICAgICAvLyAiY3YiIGhpZ2ggb3JkZXIgd29yZAorICAgICAgICBtb3ZsICAgICAgMjAoJWVicCksICVlYnggICAgICAgIC8vICJzdiIgbG93IG9yZGVyIHdvcmQKKyAgICAgICAgbW92bCAgICAgIDI0KCVlYnApLCAlZWN4ICAgICAgICAvLyAic3YiIGhpZ2ggb3JkZXIgd29yZAorICAgICAgICBsb2NrCisgICAgICAgIGNtcHhjaGc4YiAoJWVkaSkKKyAgICAgICAgc2V0ZSAgICAgICVhbCAgICAgICAgICAgLy8gaWYgJWVkeDplYXggPT0gKCVlZGkpIHNldCAlYWwgPSAxIGVsc2Ugc2V0ICVhbCA9IDAKKyAgICAgICAgYW5kICAgICAgICQxLCAlZWF4ICAgICAgLy8gc2lnbiBleHRlbmQgcHJldmlvdXMgaW5zdHJ1Y3Rpb24KKyAgICAgICAgcG9wbCAgICAgICVlZGkKKyAgICAgICAgcG9wbCAgICAgICVlYngKKyAgICAgICAgbW92bCAgICAgICVlYnAsICVlc3AKKyAgICAgICAgcG9wbCAgICAgICVlYnAKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTY0CisKKy8vCisvLyBrbXBfaW50OAorLy8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0OCggdm9sYXRpbGUga21wX2ludDggKnAsIGttcF9pbnQ4IGN2LCBrbXBfaW50OCBzdiApOworLy8KKworICAgICAgICBQUk9DICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ4CisKKyAgICAgICAgbW92bCAgICAgIDQoJWVzcCksICVlY3gKKyAgICAgICAgbW92YiAgICAgIDgoJWVzcCksICVhbAorICAgICAgICBtb3ZiICAgICAgMTIoJWVzcCksICVkbAorICAgICAgICBsb2NrCisgICAgICAgIGNtcHhjaGdiICAlZGwsKCVlY3gpCisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0OAorCisvLworLy8ga21wX2ludDE2CisvLyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQxNiggdm9sYXRpbGUga21wX2ludDE2ICpwLCBrbXBfaW50MTYgY3YsIGttcF9pbnQxNiBzdiApOworLy8KKworICAgICAgICBQUk9DICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQxNgorCisgICAgICAgIG1vdmwgICAgICA0KCVlc3ApLCAlZWN4CisgICAgICAgIG1vdncgICAgICA4KCVlc3ApLCAlYXgKKyAgICAgICAgbW92dyAgICAgIDEyKCVlc3ApLCAlZHgKKyAgICAgICAgbG9jaworICAgICAgICBjbXB4Y2hndyAgJWR4LCglZWN4KQorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDE2CisKKy8vCisvLyBrbXBfaW50MzIKKy8vIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiBjdiwga21wX2ludDMyIHN2ICk7CisvLworCisgICAgICAgIFBST0MgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDMyCisKKyAgICAgICAgbW92bCAgICAgIDQoJWVzcCksICVlY3gKKyAgICAgICAgbW92bCAgICAgIDgoJWVzcCksICVlYXgKKyAgICAgICAgbW92bCAgICAgIDEyKCVlc3ApLCAlZWR4CisgICAgICAgIGxvY2sKKyAgICAgICAgY21weGNoZ2wgICVlZHgsKCVlY3gpCisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MzIKKworLy8KKy8vIGttcF9pbnQ2NAorLy8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0NjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IGN2LCBrbXBfaW50NjQgc3YgKTsKKy8vCisgICAgICAgIFBST0MgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDY0CisKKyAgICAgICAgcHVzaGwgICAgICVlYnAKKyAgICAgICAgbW92bCAgICAgICVlc3AsICVlYnAKKyAgICAgICAgcHVzaGwgICAgICVlYngKKyAgICAgICAgcHVzaGwgICAgICVlZGkKKyAgICAgICAgbW92bCAgICAgIDgoJWVicCksICVlZGkKKyAgICAgICAgbW92bCAgICAgIDEyKCVlYnApLCAlZWF4ICAgICAgICAvLyAiY3YiIGxvdyBvcmRlciB3b3JkCisgICAgICAgIG1vdmwgICAgICAxNiglZWJwKSwgJWVkeCAgICAgICAgLy8gImN2IiBoaWdoIG9yZGVyIHdvcmQKKyAgICAgICAgbW92bCAgICAgIDIwKCVlYnApLCAlZWJ4ICAgICAgICAvLyAic3YiIGxvdyBvcmRlciB3b3JkCisgICAgICAgIG1vdmwgICAgICAyNCglZWJwKSwgJWVjeCAgICAgICAgLy8gInN2IiBoaWdoIG9yZGVyIHdvcmQKKyAgICAgICAgbG9jaworICAgICAgICBjbXB4Y2hnOGIgKCVlZGkpCisgICAgICAgIHBvcGwgICAgICAlZWRpCisgICAgICAgIHBvcGwgICAgICAlZWJ4CisgICAgICAgIG1vdmwgICAgICAlZWJwLCAlZXNwCisgICAgICAgIHBvcGwgICAgICAlZWJwCisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0NjQKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZVTkNUSU9OIF9fa21wX3hjaGdfcmVhbDMyCisvLworLy8ga21wX3JlYWwzMgorLy8gX19rbXBfeGNoZ19yZWFsMzIoIHZvbGF0aWxlIGttcF9yZWFsMzIgKmFkZHIsIGttcF9yZWFsMzIgZGF0YSApOworLy8KKy8vIHBhcmFtZXRlcnM6CisvLyAJYWRkcjoJNCglZXNwKQorLy8gCWRhdGE6CTgoJWVzcCkKKy8vCisvLyByZXR1cm46CSVlYXgKKworCisgICAgICAgIFBST0MgIF9fa21wX3hjaGdfcmVhbDMyCisKKyAgICAgICAgcHVzaGwgICAlZWJwCisgICAgICAgIG1vdmwgICAgJWVzcCwgJWVicAorICAgICAgICBzdWJsICAgICQ0LCAlZXNwCisgICAgICAgIHB1c2hsICAgJWVzaQorCisgICAgICAgIG1vdmwgICAgNCglZWJwKSwgJWVzaQorICAgICAgICBmbGRzICAgICglZXNpKQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9hZCA8YWRkcj4KKyAgICAgICAgZnN0cyAgICAtNCglZWJwKQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RvcmUgb2xkIHZhbHVlCisKKyAgICAgICAgbW92bCAgICA4KCVlYnApLCAlZWF4CisKKyAgICAgICAgbG9jaworICAgICAgICB4Y2hnbCAgICVlYXgsICglZXNpKQorCisgICAgICAgIGZsZHMgICAgLTQoJWVicCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHVybiBvbGQgdmFsdWUKKworICAgICAgICBwb3BsICAgICVlc2kKKyAgICAgICAgbW92bCAgICAlZWJwLCAlZXNwCisgICAgICAgIHBvcGwgICAgJWVicAorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX3hjaGdfcmVhbDMyCisKKyMgZW5kaWYgLyogIUtNUF9BU01fSU5UUklOUyAqLworCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRlVOQ1RJT04gX19rbXBfbG9hZF94ODdfZnB1X2NvbnRyb2xfd29yZAorLy8KKy8vIHZvaWQKKy8vIF9fa21wX2xvYWRfeDg3X2ZwdV9jb250cm9sX3dvcmQoIGttcF9pbnQxNiAqcCApOworLy8KKy8vIHBhcmFtZXRlcnM6CisvLyAJcDoJNCglZXNwKQorLy8KKworICAgICAgICBQUk9DICBfX2ttcF9sb2FkX3g4N19mcHVfY29udHJvbF93b3JkCisKKyAgICAgICAgbW92bCAgNCglZXNwKSwgJWVheAorICAgICAgICBmbGRjdyAoJWVheCkKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF9sb2FkX3g4N19mcHVfY29udHJvbF93b3JkCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGVU5DVElPTiBfX2ttcF9zdG9yZV94ODdfZnB1X2NvbnRyb2xfd29yZAorLy8KKy8vIHZvaWQKKy8vIF9fa21wX3N0b3JlX3g4N19mcHVfY29udHJvbF93b3JkKCBrbXBfaW50MTYgKnAgKTsKKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8gCXA6CTQoJWVzcCkKKy8vCisKKyAgICAgICAgUFJPQyAgX19rbXBfc3RvcmVfeDg3X2ZwdV9jb250cm9sX3dvcmQKKworICAgICAgICBtb3ZsICA0KCVlc3ApLCAlZWF4CisgICAgICAgIGZzdGN3ICglZWF4KQorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX3N0b3JlX3g4N19mcHVfY29udHJvbF93b3JkCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGVU5DVElPTiBfX2ttcF9jbGVhcl94ODdfZnB1X3N0YXR1c193b3JkCisvLworLy8gdm9pZAorLy8gX19rbXBfY2xlYXJfeDg3X2ZwdV9zdGF0dXNfd29yZCgpOworLy8KKy8vCisKKyAgICAgICAgUFJPQyAgX19rbXBfY2xlYXJfeDg3X2ZwdV9zdGF0dXNfd29yZAorCisgICAgICAgIGZuY2xleAorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX2NsZWFyX3g4N19mcHVfc3RhdHVzX3dvcmQKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIHR5cGVkZWYgdm9pZAkoKm1pY3JvdGFza190KSggaW50ICpndGlkLCBpbnQgKnRpZCwgLi4uICk7CisvLworLy8gaW50CisvLyBfX2ttcF9pbnZva2VfbWljcm90YXNrKCBtaWNyb3Rhc2tfdCBwa2ZuLCBpbnQgZ3RpZCwgaW50IHRpZCwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhcmdjLCB2b2lkICpwX2FyZ3ZbXSApIHsKKy8vICAgICgqcGtmbikoICYgZ3RpZCwgJiBndGlkLCBhcmd2WzBdLCAuLi4gKTsKKy8vICAgIHJldHVybiAxOworLy8gfQorCisvLyAtLSBCZWdpbiBfX2ttcF9pbnZva2VfbWljcm90YXNrCisvLyBtYXJrX2JlZ2luOworCVBST0MgIF9fa21wX2ludm9rZV9taWNyb3Rhc2sKKworCXB1c2hsICVlYnAKKwltb3ZsICVlc3AsJWVicAkJLy8gZXN0YWJsaXNoIHRoZSBiYXNlIHBvaW50ZXIgZm9yIHRoaXMgcm91dGluZS4KKwlzdWJsICQ4LCVlc3AJCS8vIGFsbG9jYXRlIHNwYWNlIGZvciB0d28gbG9jYWwgdmFyaWFibGVzLgorCQkJCS8vIFRoZXNlIHZhcmliYWxlcyBhcmU6CisJCQkJLy8JYXJndjogLTQoJWVicCkKKwkJCQkvLwl0ZW1wOiAtOCglZWJwKQorCQkJCS8vCisJcHVzaGwgJWVieAkJLy8gc2F2ZSAlZWJ4IHRvIHVzZSBkdXJpbmcgdGhpcyByb3V0aW5lCisJCQkJLy8KKwltb3ZsIDIwKCVlYnApLCVlYngJLy8gU3RhY2sgYWxpZ25tZW50IC0gIyBhcmdzCisJYWRkbCAkMiwlZWJ4CQkvLyAjYXJncyArMiAgQWx3YXlzIHBhc3MgYXQgbGVhc3QgMiBhcmdzIChndGlkIGFuZCB0aWQpCisJc2hsbCAkMiwlZWJ4CQkvLyBOdW1iZXIgb2YgYnl0ZXMgdXNlZCBvbiBzdGFjazogKCNhcmdzKzIpKjQKKwltb3ZsICVlc3AsJWVheAkJLy8KKwlzdWJsICVlYngsJWVheAkJLy8gJWVzcC0oKCNhcmdzKzIpKjQpIC0+ICVlYXggLS0gd2l0aG91dCBtb2RzLCBzdGFjayBwdHIgd291bGQgYmUgdGhpcworCW1vdmwgJWVheCwlZWJ4CQkvLyBTYXZlIHRvICVlYngKKwlhbmRsICQweEZGRkZGRjgwLCVlYXgJLy8gbWFzayBvZmYgNyBiaXRzCisJc3VibCAlZWF4LCVlYngJCS8vIEFtb3VudCB0byBzdWJ0cmFjdCBmcm9tICVlc3AKKwlzdWJsICVlYngsJWVzcAkJLy8gUHJlcGFyZSB0aGUgc3RhY2sgcHRyIC0tCisJCQkJLy8gICBub3cgaXQgd2lsbCBiZSBhbGlnbmVkIG9uIDEyOC1ieXRlIGJvdW5kYXJ5IGF0IHRoZSBjYWxsCisKKwltb3ZsIDI0KCVlYnApLCVlYXgJLy8gY29weSBmcm9tIHBfYXJndltdCisJbW92bCAlZWF4LC00KCVlYnApCS8vIGludG8gdGhlIGxvY2FsIHZhcmlhYmxlICphcmd2LgorCisJbW92bCAyMCglZWJwKSwlZWJ4CS8vIGFyZ2MgaXMgMjAoJWVicCkKKwlzaGxsICQyLCVlYngKKworLmludm9rZV8yOgorCWNtcGwgJDAsJWVieAorCWpnICAuaW52b2tlXzQKKwlqbXAgLmludm9rZV8zCisJQUxJR04gMgorLmludm9rZV80OgorCW1vdmwgLTQoJWVicCksJWVheAorCXN1YmwgJDQsJWVieAkJCS8vIGRlY3JlbWVudCBhcmdjLgorCWFkZGwgJWVieCwlZWF4CQkJLy8gaW5kZXggaW50byBhcmd2LgorCW1vdmwgKCVlYXgpLCVlZHgKKwlwdXNobCAlZWR4CisKKwlqbXAgLmludm9rZV8yCisJQUxJR04gMgorLmludm9rZV8zOgorCWxlYWwgMTYoJWVicCksJWVheAkJLy8gcHVzaCAmIHRpZAorCXB1c2hsICVlYXgKKworCWxlYWwgMTIoJWVicCksJWVheAkJLy8gcHVzaCAmIGd0aWQKKwlwdXNobCAlZWF4CisKKwltb3ZsIDgoJWVicCksJWVieAorCWNhbGwgKiVlYngJCQkvLyBjYWxsICgqcGtmbikoKTsKKworCW1vdmwgJDEsJWVheAkJCS8vIHJldHVybiAxOworCisJbW92bCAtMTIoJWVicCksJWVieAkJLy8gcmVzdG9yZSAlZWJ4CisJbGVhdmUKKwlyZXQKKworCURFQlVHX0lORk8gX19rbXBfaW52b2tlX21pY3JvdGFzaworLy8gLS0gRW5kICBfX2ttcF9pbnZva2VfbWljcm90YXNrCisKKworLy8ga21wX3VpbnQ2NAorLy8gX19rbXBfaGFyZHdhcmVfdGltZXN0YW1wKHZvaWQpCisJUFJPQyAgX19rbXBfaGFyZHdhcmVfdGltZXN0YW1wCisJcmR0c2MKKwlyZXQKKworCURFQlVHX0lORk8gX19rbXBfaGFyZHdhcmVfdGltZXN0YW1wCisvLyAtLSBFbmQgIF9fa21wX2hhcmR3YXJlX3RpbWVzdGFtcAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiAqLworCisKKyNpZiBLTVBfQVJDSF9YODZfNjQKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIG1pY3JvdGFza2luZyByb3V0aW5lcyBzcGVjaWZpY2FsbHkgd3JpdHRlbiBmb3IgSUEtMzIgYXJjaGl0ZWN0dXJlIGFuZAorLy8gSW50ZWwoUikgNjQgcnVubmluZyBMaW51eCogT1MKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIC0tIE1hY2hpbmUgdHlwZSBQCisvLyBtYXJrX2Rlc2NyaXB0aW9uICJJbnRlbCBDb3Jwb3JhdGlvbiI7CisJLmlkZW50ICJJbnRlbCBDb3Jwb3JhdGlvbiIKKy8vIC0tCS5maWxlICJ6X0xpbnV4X2FzbS5zIgorCS5kYXRhCisJQUxJR04gNAorCisvLyBUbyBwcmV2ZW50IGdldHRpbmcgb3VyIGNvZGUgaW50byAuZGF0YSBzZWN0aW9uIC50ZXh0IGFkZGVkIHRvIGV2ZXJ5IHJvdXRpbmUgZGVmaW5pdGlvbiBmb3IgeDg2XzY0LgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGVU5DVElPTiBfX2ttcF94ODZfY3B1aWQKKy8vCisvLyB2b2lkCisvLyBfX2ttcF94ODZfY3B1aWQoIGludCBtb2RlLCBpbnQgbW9kZTIsIHZvaWQgKmNwdWlkX2J1ZmZlciApOworLy8KKy8vIHBhcmFtZXRlcnM6CisvLyAJbW9kZToJCSVlZGkKKy8vIAltb2RlMjoJCSVlc2kKKy8vIAljcHVpZF9idWZmZXI6CSVyZHgKKworICAgICAgICAudGV4dAorCVBST0MgIF9fa21wX3g4Nl9jcHVpZAorCisJcHVzaHEgICVyYnAKKwltb3ZxICAgJXJzcCwlcmJwCisgICAgICAgIHB1c2hxICAlcmJ4CQkJLy8gY2FsbGVlLXNhdmUgcmVnaXN0ZXIKKworCW1vdmwgICAlZXNpLCAlZWN4CQkvLyAibW9kZTIiCisJbW92bCAgICVlZGksICVlYXgJCS8vICJtb2RlIgorICAgICAgICBtb3ZxICAgJXJkeCwgJXJzaSAgICAgICAgICAgICAgIC8vIGNwdWlkX2J1ZmZlcgorCWNwdWlkCQkJCS8vIFF1ZXJ5IHRoZSBDUFVJRCBmb3IgdGhlIGN1cnJlbnQgcHJvY2Vzc29yCisKKwltb3ZsICAgJWVheCwgMCglcnNpKQkJLy8gc3RvcmUgcmVzdWx0cyBpbnRvIGJ1ZmZlcgorCW1vdmwgICAlZWJ4LCA0KCVyc2kpCisJbW92bCAgICVlY3gsIDgoJXJzaSkKKwltb3ZsICAgJWVkeCwgMTIoJXJzaSkKKworICAgICAgICBwb3BxICAgJXJieAkJCS8vIGNhbGxlZS1zYXZlIHJlZ2lzdGVyCisgICAgICAgIG1vdnEgICAlcmJwLCAlcnNwCisgICAgICAgIHBvcHEgICAlcmJwCisJcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF94ODZfY3B1aWQKKworCisKKyMgaWYgIUtNUF9BU01fSU5UUklOUworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZVTkNUSU9OIF9fa21wX3Rlc3RfdGhlbl9hZGQzMgorLy8KKy8vIGttcF9pbnQzMgorLy8gX19rbXBfdGVzdF90aGVuX2FkZDMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiBkICk7CisvLworLy8gcGFyYW1ldGVyczoKKy8vIAlwOgklcmRpCisvLyAJZDoJJWVzaQorLy8KKy8vIHJldHVybjoJJWVheAorCisgICAgICAgIC50ZXh0CisgICAgICAgIFBST0MgIF9fa21wX3Rlc3RfdGhlbl9hZGQzMgorCisgICAgICAgIG1vdmwgICAgICAlZXNpLCAlZWF4CS8vICJkIgorICAgICAgICBsb2NrCisgICAgICAgIHhhZGRsICAgICAlZWF4LCglcmRpKQorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX3Rlc3RfdGhlbl9hZGQzMgorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRlVOQ1RJT04gX19rbXBfdGVzdF90aGVuX2FkZDY0CisvLworLy8ga21wX2ludDY0CisvLyBfX2ttcF90ZXN0X3RoZW5fYWRkNjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IGQgKTsKKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8gCXA6CSVyZGkKKy8vIAlkOgklcnNpCisvLwlyZXR1cm46CSVyYXgKKworICAgICAgICAudGV4dAorICAgICAgICBQUk9DICBfX2ttcF90ZXN0X3RoZW5fYWRkNjQKKworICAgICAgICBtb3ZxICAgICAgJXJzaSwgJXJheAkvLyAiZCIKKyAgICAgICAgbG9jaworICAgICAgICB4YWRkcSAgICAgJXJheCwoJXJkaSkKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF90ZXN0X3RoZW5fYWRkNjQKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZVTkNUSU9OIF9fa21wX3hjaGdfZml4ZWQ4CisvLworLy8ga21wX2ludDMyCisvLyBfX2ttcF94Y2hnX2ZpeGVkOCggdm9sYXRpbGUga21wX2ludDggKnAsIGttcF9pbnQ4IGQgKTsKKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8gCXA6CSVyZGkKKy8vIAlkOgklc2lsCisvLworLy8gcmV0dXJuOgklYWwKKworICAgICAgICAudGV4dAorICAgICAgICBQUk9DICBfX2ttcF94Y2hnX2ZpeGVkOAorCisgICAgICAgIG1vdmIgICAgICAlc2lsLCAlYWwJLy8gImQiCisKKyAgICAgICAgbG9jaworICAgICAgICB4Y2hnYiAgICAgJWFsLCglcmRpKQorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX3hjaGdfZml4ZWQ4CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGVU5DVElPTiBfX2ttcF94Y2hnX2ZpeGVkMTYKKy8vCisvLyBrbXBfaW50MTYKKy8vIF9fa21wX3hjaGdfZml4ZWQxNiggdm9sYXRpbGUga21wX2ludDE2ICpwLCBrbXBfaW50MTYgZCApOworLy8KKy8vIHBhcmFtZXRlcnM6CisvLyAJcDoJJXJkaQorLy8gCWQ6CSVzaQorLy8gcmV0dXJuOiAgICAgJWF4CisKKyAgICAgICAgLnRleHQKKyAgICAgICAgUFJPQyAgX19rbXBfeGNoZ19maXhlZDE2CisKKyAgICAgICAgbW92dyAgICAgICVzaSwgJWF4CS8vICJkIgorCisgICAgICAgIGxvY2sKKyAgICAgICAgeGNoZ3cgICAgICVheCwoJXJkaSkKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF94Y2hnX2ZpeGVkMTYKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZVTkNUSU9OIF9fa21wX3hjaGdfZml4ZWQzMgorLy8KKy8vIGttcF9pbnQzMgorLy8gX19rbXBfeGNoZ19maXhlZDMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiBkICk7CisvLworLy8gcGFyYW1ldGVyczoKKy8vIAlwOgklcmRpCisvLyAJZDoJJWVzaQorLy8KKy8vIHJldHVybjoJJWVheAorCisgICAgICAgIC50ZXh0CisgICAgICAgIFBST0MgIF9fa21wX3hjaGdfZml4ZWQzMgorCisgICAgICAgIG1vdmwgICAgICAlZXNpLCAlZWF4CS8vICJkIgorCisgICAgICAgIGxvY2sKKyAgICAgICAgeGNoZ2wgICAgICVlYXgsKCVyZGkpCisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfeGNoZ19maXhlZDMyCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGVU5DVElPTiBfX2ttcF94Y2hnX2ZpeGVkNjQKKy8vCisvLyBrbXBfaW50NjQKKy8vIF9fa21wX3hjaGdfZml4ZWQ2NCggdm9sYXRpbGUga21wX2ludDY0ICpwLCBrbXBfaW50NjQgZCApOworLy8KKy8vIHBhcmFtZXRlcnM6CisvLyAJcDoJJXJkaQorLy8gCWQ6CSVyc2kKKy8vIHJldHVybjoJJXJheAorCisgICAgICAgIC50ZXh0CisgICAgICAgIFBST0MgIF9fa21wX3hjaGdfZml4ZWQ2NAorCisgICAgICAgIG1vdnEgICAgICAlcnNpLCAlcmF4CS8vICJkIgorCisgICAgICAgIGxvY2sKKyAgICAgICAgeGNoZ3EgICAgICVyYXgsKCVyZGkpCisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfeGNoZ19maXhlZDY0CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGVU5DVElPTiBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTgKKy8vCisvLyBrbXBfaW50OAorLy8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmU4KCB2b2xhdGlsZSBrbXBfaW50OCAqcCwga21wX2ludDggY3YsIGttcF9pbnQ4IHN2ICk7CisvLworLy8gcGFyYW1ldGVyczoKKy8vIAlwOgklcmRpCisvLyAJY3Y6CSVlc2kKKy8vCXN2OgklZWR4CisvLworLy8gcmV0dXJuOgklZWF4CisKKyAgICAgICAgLnRleHQKKyAgICAgICAgUFJPQyAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmU4CisKKyAgICAgICAgbW92YiAgICAgICVzaWwsICVhbAkvLyAiY3YiCisgICAgICAgIGxvY2sKKyAgICAgICAgY21weGNoZ2IgICVkbCwoJXJkaSkKKyAgICAgICAgc2V0ZSAgICAgICVhbCAgICAgICAgICAgLy8gaWYgJWFsID09ICglcmRpKSBzZXQgJWFsID0gMSBlbHNlIHNldCAlYWwgPSAwCisgICAgICAgIGFuZHEgICAgICAkMSwgJXJheCAgICAgIC8vIHNpZ24gZXh0ZW5kIHByZXZpb3VzIGluc3RydWN0aW9uIGZvciByZXR1cm4gdmFsdWUKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTgKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZVTkNUSU9OIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMTYKKy8vCisvLyBrbXBfaW50MTYKKy8vIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMTYoIHZvbGF0aWxlIGttcF9pbnQxNiAqcCwga21wX2ludDE2IGN2LCBrbXBfaW50MTYgc3YgKTsKKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8gCXA6CSVyZGkKKy8vIAljdjoJJXNpCisvLwlzdjoJJWR4CisvLworLy8gcmV0dXJuOgklZWF4CisKKyAgICAgICAgLnRleHQKKyAgICAgICAgUFJPQyAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmUxNgorCisgICAgICAgIG1vdncgICAgICAlc2ksICVheAkvLyAiY3YiCisgICAgICAgIGxvY2sKKyAgICAgICAgY21weGNoZ3cgICVkeCwoJXJkaSkKKyAgICAgICAgc2V0ZSAgICAgICVhbCAgICAgICAgICAgLy8gaWYgJWF4ID09ICglcmRpKSBzZXQgJWFsID0gMSBlbHNlIHNldCAlYWwgPSAwCisgICAgICAgIGFuZHEgICAgICAkMSwgJXJheCAgICAgIC8vIHNpZ24gZXh0ZW5kIHByZXZpb3VzIGluc3RydWN0aW9uIGZvciByZXR1cm4gdmFsdWUKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTE2CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGVU5DVElPTiBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTMyCisvLworLy8ga21wX2ludDMyCisvLyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiBjdiwga21wX2ludDMyIHN2ICk7CisvLworLy8gcGFyYW1ldGVyczoKKy8vIAlwOgklcmRpCisvLyAJY3Y6CSVlc2kKKy8vCXN2OgklZWR4CisvLworLy8gcmV0dXJuOgklZWF4CisKKyAgICAgICAgLnRleHQKKyAgICAgICAgUFJPQyAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmUzMgorCisgICAgICAgIG1vdmwgICAgICAlZXNpLCAlZWF4CS8vICJjdiIKKyAgICAgICAgbG9jaworICAgICAgICBjbXB4Y2hnbCAgJWVkeCwoJXJkaSkKKyAgICAgICAgc2V0ZSAgICAgICVhbCAgICAgICAgICAgLy8gaWYgJWVheCA9PSAoJXJkaSkgc2V0ICVhbCA9IDEgZWxzZSBzZXQgJWFsID0gMAorICAgICAgICBhbmRxICAgICAgJDEsICVyYXggICAgICAvLyBzaWduIGV4dGVuZCBwcmV2aW91cyBpbnN0cnVjdGlvbiBmb3IgcmV0dXJuIHZhbHVlCisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmUzMgorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRlVOQ1RJT04gX19rbXBfY29tcGFyZV9hbmRfc3RvcmU2NAorLy8KKy8vIGttcF9pbnQzMgorLy8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmU2NCggdm9sYXRpbGUga21wX2ludDY0ICpwLCBrbXBfaW50NjQgY3YsIGttcF9pbnQ2NCBzdiApOworLy8KKy8vIHBhcmFtZXRlcnM6CisvLyAJcDoJJXJkaQorLy8gCWN2OgklcnNpCisvLwlzdjoJJXJkeAorLy8JcmV0dXJuOgklZWF4CisKKyAgICAgICAgLnRleHQKKyAgICAgICAgUFJPQyAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmU2NAorCisgICAgICAgIG1vdnEgICAgICAlcnNpLCAlcmF4ICAgIC8vICJjdiIKKyAgICAgICAgbG9jaworICAgICAgICBjbXB4Y2hncSAgJXJkeCwoJXJkaSkKKyAgICAgICAgc2V0ZSAgICAgICVhbCAgICAgICAgICAgLy8gaWYgJXJheCA9PSAoJXJkaSkgc2V0ICVhbCA9IDEgZWxzZSBzZXQgJWFsID0gMAorICAgICAgICBhbmRxICAgICAgJDEsICVyYXggICAgICAvLyBzaWduIGV4dGVuZCBwcmV2aW91cyBpbnN0cnVjdGlvbiBmb3IgcmV0dXJuIHZhbHVlCisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmU2NAorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZVTkNUSU9OIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDgKKy8vCisvLyBrbXBfaW50OAorLy8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0OCggdm9sYXRpbGUga21wX2ludDggKnAsIGttcF9pbnQ4IGN2LCBrbXBfaW50OCBzdiApOworLy8KKy8vIHBhcmFtZXRlcnM6CisvLyAJcDoJJXJkaQorLy8gCWN2OgklZXNpCisvLwlzdjoJJWVkeAorLy8KKy8vIHJldHVybjoJJWVheAorCisgICAgICAgIC50ZXh0CisgICAgICAgIFBST0MgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDgKKworICAgICAgICBtb3ZiICAgICAgJXNpbCwgJWFsCS8vICJjdiIKKyAgICAgICAgbG9jaworICAgICAgICBjbXB4Y2hnYiAgJWRsLCglcmRpKQorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDgKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZVTkNUSU9OIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDE2CisvLworLy8ga21wX2ludDE2CisvLyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTE2X3JldCggdm9sYXRpbGUga21wX2ludDE2ICpwLCBrbXBfaW50MTYgY3YsIGttcF9pbnQxNiBzdiApOworLy8KKy8vIHBhcmFtZXRlcnM6CisvLyAJcDoJJXJkaQorLy8gCWN2Ogklc2kKKy8vCXN2OgklZHgKKy8vCisvLyByZXR1cm46CSVlYXgKKworICAgICAgICAudGV4dAorICAgICAgICBQUk9DICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQxNgorCisgICAgICAgIG1vdncgICAgICAlc2ksICVheAkvLyAiY3YiCisgICAgICAgIGxvY2sKKyAgICAgICAgY21weGNoZ3cgICVkeCwoJXJkaSkKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQxNgorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRlVOQ1RJT04gX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MzIKKy8vCisvLyBrbXBfaW50MzIKKy8vIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiBjdiwga21wX2ludDMyIHN2ICk7CisvLworLy8gcGFyYW1ldGVyczoKKy8vIAlwOgklcmRpCisvLyAJY3Y6CSVlc2kKKy8vCXN2OgklZWR4CisvLworLy8gcmV0dXJuOgklZWF4CisKKyAgICAgICAgLnRleHQKKyAgICAgICAgUFJPQyAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MzIKKworICAgICAgICBtb3ZsICAgICAgJWVzaSwgJWVheAkvLyAiY3YiCisgICAgICAgIGxvY2sKKyAgICAgICAgY21weGNoZ2wgICVlZHgsKCVyZGkpCisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MzIKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZVTkNUSU9OIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDY0CisvLworLy8ga21wX2ludDY0CisvLyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ2NCggdm9sYXRpbGUga21wX2ludDY0ICpwLCBrbXBfaW50NjQgY3YsIGttcF9pbnQ2NCBzdiApOworLy8KKy8vIHBhcmFtZXRlcnM6CisvLyAJcDoJJXJkaQorLy8gCWN2OgklcnNpCisvLwlzdjoJJXJkeAorLy8JcmV0dXJuOgklZWF4CisKKyAgICAgICAgLnRleHQKKyAgICAgICAgUFJPQyAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0NjQKKworICAgICAgICBtb3ZxICAgICAgJXJzaSwgJXJheCAgICAvLyAiY3YiCisgICAgICAgIGxvY2sKKyAgICAgICAgY21weGNoZ3EgICVyZHgsKCVyZGkpCisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0NjQKKworIyBlbmRpZiAvKiAhS01QX0FTTV9JTlRSSU5TICovCisKKworIyBpZiAhIChfX01JQ19fIHx8IF9fTUlDMl9fKQorCisjIGlmICFLTVBfQVNNX0lOVFJJTlMKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGVU5DVElPTiBfX2ttcF94Y2hnX3JlYWwzMgorLy8KKy8vIGttcF9yZWFsMzIKKy8vIF9fa21wX3hjaGdfcmVhbDMyKCB2b2xhdGlsZSBrbXBfcmVhbDMyICphZGRyLCBrbXBfcmVhbDMyIGRhdGEgKTsKKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8gCWFkZHI6CSVyZGkKKy8vIAlkYXRhOgkleG1tMCAobG93ZXIgNCBieXRlcykKKy8vCisvLyByZXR1cm46CSV4bW0wIChsb3dlciA0IGJ5dGVzKQorCisgICAgICAgIC50ZXh0CisgICAgICAgIFBST0MgIF9fa21wX3hjaGdfcmVhbDMyCisKKwltb3ZkCSV4bW0wLCAlZWF4CS8vIGxvYWQgImRhdGEiIHRvIGVheAorCisgICAgICAgICBsb2NrCisgICAgICAgICB4Y2hnbCAlZWF4LCAoJXJkaSkKKworCW1vdmQJJWVheCwgJXhtbTAJLy8gbG9hZCBvbGQgdmFsdWUgaW50byByZXR1cm4gcmVnaXN0ZXIKKworICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX3hjaGdfcmVhbDMyCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGVU5DVElPTiBfX2ttcF94Y2hnX3JlYWw2NAorLy8KKy8vIGttcF9yZWFsNjQKKy8vIF9fa21wX3hjaGdfcmVhbDY0KCB2b2xhdGlsZSBrbXBfcmVhbDY0ICphZGRyLCBrbXBfcmVhbDY0IGRhdGEgKTsKKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8gICAgICBhZGRyOiAgICVyZGkKKy8vICAgICAgZGF0YTogICAleG1tMCAobG93ZXIgOCBieXRlcykKKy8vICAgICAgcmV0dXJuOiAleG1tMCAobG93ZXIgOCBieXRlcykKKy8vCisKKyAgICAgICAgLnRleHQKKyAgICAgICAgUFJPQyAgX19rbXBfeGNoZ19yZWFsNjQKKworCW1vdmQJJXhtbTAsICVyYXgJLy8gbG9hZCAiZGF0YSIgdG8gcmF4CisKKyAgICAgICAgIGxvY2sKKwl4Y2hncSAgJXJheCwgKCVyZGkpCisKKwltb3ZkCSVyYXgsICV4bW0wCS8vIGxvYWQgb2xkIHZhbHVlIGludG8gcmV0dXJuIHJlZ2lzdGVyCisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfeGNoZ19yZWFsNjQKKworCisjIGVuZGlmIC8qICEoX19NSUNfXyB8fCBfX01JQzJfXykgKi8KKworIyBlbmRpZiAvKiAhS01QX0FTTV9JTlRSSU5TICovCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGVU5DVElPTiBfX2ttcF9sb2FkX3g4N19mcHVfY29udHJvbF93b3JkCisvLworLy8gdm9pZAorLy8gX19rbXBfbG9hZF94ODdfZnB1X2NvbnRyb2xfd29yZCgga21wX2ludDE2ICpwICk7CisvLworLy8gcGFyYW1ldGVyczoKKy8vIAlwOgklcmRpCisvLworCisgICAgICAgIC50ZXh0CisgICAgICAgIFBST0MgIF9fa21wX2xvYWRfeDg3X2ZwdV9jb250cm9sX3dvcmQKKworICAgICAgICBmbGRjdyAoJXJkaSkKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF9sb2FkX3g4N19mcHVfY29udHJvbF93b3JkCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGVU5DVElPTiBfX2ttcF9zdG9yZV94ODdfZnB1X2NvbnRyb2xfd29yZAorLy8KKy8vIHZvaWQKKy8vIF9fa21wX3N0b3JlX3g4N19mcHVfY29udHJvbF93b3JkKCBrbXBfaW50MTYgKnAgKTsKKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8gCXA6CSVyZGkKKy8vCisKKyAgICAgICAgLnRleHQKKyAgICAgICAgUFJPQyAgX19rbXBfc3RvcmVfeDg3X2ZwdV9jb250cm9sX3dvcmQKKworICAgICAgICBmc3RjdyAoJXJkaSkKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF9zdG9yZV94ODdfZnB1X2NvbnRyb2xfd29yZAorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRlVOQ1RJT04gX19rbXBfY2xlYXJfeDg3X2ZwdV9zdGF0dXNfd29yZAorLy8KKy8vIHZvaWQKKy8vIF9fa21wX2NsZWFyX3g4N19mcHVfc3RhdHVzX3dvcmQoKTsKKy8vCisvLworCisgICAgICAgIC50ZXh0CisgICAgICAgIFBST0MgIF9fa21wX2NsZWFyX3g4N19mcHVfc3RhdHVzX3dvcmQKKworI2lmIF9fTUlDX18gfHwgX19NSUMyX18KKy8vIFRPRE86IHJlbW92ZSB0aGUgd29ya2Fyb3VuZCBmb3IgcHJvYmxlbSB3aXRoIGZuY2xleCBpbnN0cnVjdGlvbiAobm8gQ1Ega25vd24pCisgICAgICAgIGZzdGVudiAgLTMyKCVyc3ApICAgICAgICAgICAgICAvLyBzdG9yZSBGUCBlbnYKKyAgICAgICAgYW5kdyAgICAkfjB4ODBmZiwgNC0zMiglcnNwKSAgIC8vIGNsZWFyIDAtNywxNSBiaXRzIG9mIEZQIFNXCisgICAgICAgIGZsZGVudiAgLTMyKCVyc3ApICAgICAgICAgICAgICAvLyBsb2FkIEZQIGVudiBiYWNrCisgICAgICAgIHJldAorI2Vsc2UKKyAgICAgICAgZm5jbGV4CisgICAgICAgIHJldAorI2VuZGlmCisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF9jbGVhcl94ODdfZnB1X3N0YXR1c193b3JkCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyB0eXBlZGVmIHZvaWQJKCptaWNyb3Rhc2tfdCkoIGludCAqZ3RpZCwgaW50ICp0aWQsIC4uLiApOworLy8KKy8vIGludAorLy8gX19rbXBfaW52b2tlX21pY3JvdGFzayggdm9pZCAoKnBrZm4pIChpbnQgZ3RpZCwgaW50IHRpZCwgLi4uKSwKKy8vCQkgICAgICAgICAgIGludCBndGlkLCBpbnQgdGlkLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFyZ2MsIHZvaWQgKnBfYXJndltdICkgeworLy8gICAgKCpwa2ZuKSggJiBndGlkLCAmIHRpZCwgYXJndlswXSwgLi4uICk7CisvLyAgICByZXR1cm4gMTsKKy8vIH0KKy8vCisvLyBub3RlOgorLy8JYXQgY2FsbCB0byBwa2ZuIG11c3QgaGF2ZSAlcnNwIDEyOC1ieXRlIGFsaWduZWQgZm9yIGNvbXBpbGVyCisvLworLy8gcGFyYW1ldGVyczoKKy8vICAgICAgJXJkaTogIAlwa2ZuCisvLwklZXNpOglndGlkCisvLwklZWR4Ogl0aWQKKy8vCSVlY3g6CWFyZ2MKKy8vCSVyODoJcF9hcmd2CisvLworLy8gbG9jYWxzOgorLy8JX19ndGlkOglndGlkIHBhcm0gcHVzaGVkIG9uIHN0YWNrIHNvIGNhbiBwYXNzICZndGlkIHRvIHBrZm4KKy8vCV9fdGlkOgl0aWQgcGFybSBwdXNoZWQgb24gc3RhY2sgc28gY2FuIHBhc3MgJnRpZCB0byBwa2ZuCisvLworLy8gcmVnIHRlbXBzOgorLy8JJXJheDoJdXNlZCBhbGwgb3ZlciB0aGUgcGxhY2UKKy8vCSVyZHg6CXVzZWQgaW4gc3RhY2sgcG9pbnRlciBhbGlnbm1lbnQgY2FsY3VsYXRpb24KKy8vCSVyMTE6CXVzZWQgdG8gdHJhdmVyc2UgcF9hcmd2IGFycmF5CisvLwklcnNpOgl1c2VkIGFzIHRlbXBvcmFyeSBmb3Igc3RhY2sgcGFyYW1ldGVycworLy8JCXVzZWQgYXMgdGVtcG9yYXJ5IGZvciBudW1iZXIgb2YgcGtmbiBwYXJtcyB0byBwdXNoCisvLwklcmJ4Ogl1c2VkIHRvIGhvbGQgcGtmbiBhZGRyZXNzLCBhbmQgemVybyBjb25zdGFudCwgY2FsbGVlLXNhdmUKKy8vCisvLyByZXR1cm46CSVlYXggCShhbHdheXMgMS9UUlVFKQorLy8KKworX19ndGlkID0gLTE2CitfX3RpZCA9IC0yNAorCisvLyAtLSBCZWdpbiBfX2ttcF9pbnZva2VfbWljcm90YXNrCisvLyBtYXJrX2JlZ2luOworICAgICAgICAudGV4dAorCVBST0MgIF9fa21wX2ludm9rZV9taWNyb3Rhc2sKKworCXB1c2hxIAklcmJwCQkvLyBzYXZlIGJhc2UgcG9pbnRlcgorCW1vdnEgCSVyc3AsJXJicAkvLyBlc3RhYmxpc2ggdGhlIGJhc2UgcG9pbnRlciBmb3IgdGhpcyByb3V0aW5lLgorCXB1c2hxIAklcmJ4CQkvLyAlcmJ4IGlzIGNhbGxlZS1zYXZlZCByZWdpc3RlcgorCisJcHVzaHEJJXJzaQkJLy8gUHV0IGd0aWQgb24gc3RhY2sgc28gY2FuIHBhc3MgJnRnaWQgdG8gcGtmbgorCXB1c2hxCSVyZHgJCS8vIFB1dCB0aWQgb24gc3RhY2sgc28gY2FuIHBhc3MgJnRpZCB0byBwa2ZuCisKKwltb3ZxCSVyY3gsICVyYXgJLy8gU3RhY2sgYWxpZ25tZW50IGNhbGN1bGF0aW9uIGJlZ2luczsgYXJnYyAtPiAlcmF4CisJbW92cQkkMCwgJXJieAkvLyBjb25zdGFudCBmb3IgY21vdnMgbGF0ZXIKKwlzdWJxCSQ0LCAlcmF4CS8vIHN1YnRyYWN0IGZvdXIgYXJncyBwYXNzZWQgaW4gcmVnaXN0ZXJzIHRvIHBrZm4KKyNpZiBfX01JQ19fIHx8IF9fTUlDMl9fCisJanMJTF9rbXBfMAkJLy8ganVtcCB0byBtb3ZxCisJam1wCUxfa21wXzBfZXhpdAkvLyBqdW1wIGFoZWFkCitMX2ttcF8wOgorCW1vdnEJJXJieCwgJXJheAkvLyB6ZXJvIG5lZ2F0aXZlIHZhbHVlIGluICVyYXggPC0gbWF4KDAsIGFyZ2MtNCkKK0xfa21wXzBfZXhpdDoKKyNlbHNlCisJY21vdnNxCSVyYngsICVyYXgJLy8gemVybyBuZWdhdGl2ZSB2YWx1ZSBpbiAlcmF4IDwtIG1heCgwLCBhcmdjLTQpCisjZW5kaWYgLy8gX19NSUNfXyB8fCBfX01JQzJfXworCisJbW92cQklcmF4LCAlcnNpCS8vIHNhdmUgbWF4KDAsIGFyZ2MtNCkgLT4gJXJzaSBmb3IgbGF0ZXIKKwlzaGxxIAkkMywgJXJheAkvLyBOdW1iZXIgb2YgYnl0ZXMgdXNlZCBvbiBzdGFjazogbWF4KDAsIGFyZ2MtNCkqOAorCisJbW92cSAJJXJzcCwgJXJkeAkvLworCXN1YnEgCSVyYXgsICVyZHgJLy8gJXJzcC0obWF4KDAsYXJnYy00KSo4KSAtPiAlcmR4IC0tCisJCQkJLy8gd2l0aG91dCBhbGlnbiwgc3RhY2sgcHRyIHdvdWxkIGJlIHRoaXMKKwltb3ZxIAklcmR4LCAlcmF4CS8vIFNhdmUgdG8gJXJheAorCisJYW5kcSAJJDB4RkZGRkZGRkZGRkZGRkY4MCwgJXJheCAgLy8gbWFzayBvZmYgbG93ZXIgNyBiaXRzICgxMjggYnl0ZXMgYWxpZ24pCisJc3VicSAJJXJheCwgJXJkeAkvLyBBbW91bnQgdG8gc3VidHJhY3QgZnJvbSAlcnNwCisJc3VicSAJJXJkeCwgJXJzcAkvLyBQcmVwYXJlIHRoZSBzdGFjayBwdHIgLS0KKwkJCQkvLyBub3cgJXJzcCB3aWxsIGFsaWduIHRvIDEyOC1ieXRlIGJvdW5kYXJ5IGF0IGNhbGwgc2l0ZQorCisJCQkJLy8gc2V0dXAgcGtmbiBwYXJhbWV0ZXIgcmVnIGFuZCBzdGFjaworCW1vdnEJJXJjeCwgJXJheAkvLyBhcmdjIC0+ICVyYXgKKwljbXBxCSQwLCAlcnNpCisJamUJTF9rbXBfaW52b2tlX3Bhc3NfcGFybXMJLy8ganVtcCBhaGVhZCBpZiBubyBwYXJtcyB0byBwdXNoCisJc2hscQkkMywgJXJjeAkvLyBhcmdjKjggLT4gJXJjeAorCW1vdnEgCSVyOCwgJXJkeAkvLyBwX2FyZ3YgLT4gJXJkeAorCWFkZHEJJXJjeCwgJXJkeAkvLyAmcF9hcmd2W2FyZ2NdIC0+ICVyZHgKKworCW1vdnEJJXJzaSwgJXJjeAkvLyBtYXggKDAsIGFyZ2MtNCkgLT4gJXJjeAorCitMX2ttcF9pbnZva2VfcHVzaF9wYXJtczoJLy8gcHVzaCBudGggLSA3dGggcGFybXMgdG8gcGtmbiBvbiBzdGFjaworCXN1YnEJJDgsICVyZHgJLy8gZGVjcmVtZW50IHBfYXJndiBwb2ludGVyIHRvIHByZXZpb3VzIHBhcm0KKwltb3ZxCSglcmR4KSwgJXJzaQkvLyBwX2FyZ3ZbJXJjeC0xXSAtPiAlcnNpCisJcHVzaHEJJXJzaQkJLy8gcHVzaCBwX2FyZ3ZbJXJjeC0xXSBvbnRvIHN0YWNrIChyZXZlcnNlIG9yZGVyKQorCXN1YmwJJDEsICVlY3gKKworLy8gQzY5NTcwOiAiWDg2XzY0X1JFTE9DX0JSQU5DSCBub3Qgc3VwcG9ydGVkIiBlcnJvciBhdCBsaW5raW5nIG9uIG1hY18zMmUKKy8vCQlpZiB0aGUgbmFtZSBvZiB0aGUgbGFiZWwgdGhhdCBpcyBhbiBvcGVyYW5kIG9mIHRoaXMgamVjeHogc3RhcnRzIHdpdGggYSBkb3QgKCIuIik7CisvLwkgICBBcHBsZSdzIGxpbmtlciBkb2VzIG5vdCBzdXBwb3J0IDEtYnl0ZSBsZW5ndGggcmVsb2NhdGlvbjsKKy8vICAgICAgICAgUmVzb2x1dGlvbjogcmVwbGFjZSBhbGwgLmxhYmVsWCBlbnRyaWVzIHdpdGggTF9sYWJlbFguCisKKwlqZWN4eiAgIExfa21wX2ludm9rZV9wYXNzX3Bhcm1zICAvLyBzdG9wIHdoZW4gZm91ciBwX2FyZ3ZbXSBwYXJtcyBsZWZ0CisJam1wCUxfa21wX2ludm9rZV9wdXNoX3Bhcm1zCisKKwlBTElHTiAzCitMX2ttcF9pbnZva2VfcGFzc19wYXJtczoJLy8gcHV0IDFzdCAtIDZ0aCBwYXJtcyB0byBwa2ZuIGluIHJlZ2lzdGVycy4KKwkJCQkvLyBvcmRlciBoZXJlIGlzIGltcG9ydGFudCB0byBhdm9pZCB0cmFzaGluZworCQkJCS8vIHJlZ2lzdGVycyB1c2VkIGZvciBib3RoIGlucHV0IGFuZCBvdXRwdXQgcGFybXMhCisJbW92cQklcmRpLCAlcmJ4CS8vIHBrZm4gLT4gJXJieAorCWxlYXEJX19ndGlkKCVyYnApLCAlcmRpIC8vICZndGlkIC0+ICVyZGkgKHN0b3JlIDFzdCBwYXJtIHRvIHBrZm4pCisJbGVhcQlfX3RpZCglcmJwKSwgJXJzaSAgLy8gJnRpZCAtPiAlcnNpIChzdG9yZSAybmQgcGFybSB0byBwa2ZuKQorCisJbW92cQklcjgsICVyMTEJLy8gcF9hcmd2IC0+ICVyMTEKKworI2lmIF9fTUlDX18gfHwgX19NSUMyX18KKwljbXBxCSQ0LCAlcmF4CS8vIGFyZ2MgPj0gND8KKwlqbnMJTF9rbXBfNAkJLy8ganVtcCB0byBtb3ZxCisJam1wCUxfa21wXzRfZXhpdCAgICAvLyBqdW1wIGFoZWFkCitMX2ttcF80OgorCW1vdnEJMjQoJXIxMSksICVyOQkvLyBwX2FyZ3ZbM10gLT4gJXI5IChzdG9yZSA2dGggcGFybSB0byBwa2ZuKQorTF9rbXBfNF9leGl0OgorCisJY21wcQkkMywgJXJheAkvLyBhcmdjID49IDM/CisJam5zCUxfa21wXzMJCS8vIGp1bXAgdG8gbW92cQorCWptcAlMX2ttcF8zX2V4aXQgICAgLy8ganVtcCBhaGVhZAorTF9rbXBfMzoKKwltb3ZxCTE2KCVyMTEpLCAlcjgJLy8gcF9hcmd2WzJdIC0+ICVyOCAoc3RvcmUgNXRoIHBhcm0gdG8gcGtmbikKK0xfa21wXzNfZXhpdDoKKworCWNtcHEJJDIsICVyYXgJLy8gYXJnYyA+PSAyPworCWpucwlMX2ttcF8yCQkvLyBqdW1wIHRvIG1vdnEKKwlqbXAJTF9rbXBfMl9leGl0ICAgIC8vIGp1bXAgYWhlYWQKK0xfa21wXzI6CisJbW92cQk4KCVyMTEpLCAlcmN4CS8vIHBfYXJndlsxXSAtPiAlcmN4IChzdG9yZSA0dGggcGFybSB0byBwa2ZuKQorTF9rbXBfMl9leGl0OgorCisJY21wcQkkMSwgJXJheAkvLyBhcmdjID49IDE/CisJam5zCUxfa21wXzEJCS8vIGp1bXAgdG8gbW92cQorCWptcAlMX2ttcF8xX2V4aXQgICAgLy8ganVtcCBhaGVhZAorTF9rbXBfMToKKwltb3ZxCSglcjExKSwgJXJkeAkvLyBwX2FyZ3ZbMF0gLT4gJXJkeCAoc3RvcmUgM3JkIHBhcm0gdG8gcGtmbikKK0xfa21wXzFfZXhpdDoKKyNlbHNlCisJY21wcQkkNCwgJXJheAkvLyBhcmdjID49IDQ/CisJY21vdm5zcQkyNCglcjExKSwgJXI5CS8vIHBfYXJndlszXSAtPiAlcjkgKHN0b3JlIDZ0aCBwYXJtIHRvIHBrZm4pCisKKwljbXBxCSQzLCAlcmF4CS8vIGFyZ2MgPj0gMz8KKwljbW92bnNxCTE2KCVyMTEpLCAlcjgJLy8gcF9hcmd2WzJdIC0+ICVyOCAoc3RvcmUgNXRoIHBhcm0gdG8gcGtmbikKKworCWNtcHEJJDIsICVyYXgJLy8gYXJnYyA+PSAyPworCWNtb3Zuc3EJOCglcjExKSwgJXJjeAkvLyBwX2FyZ3ZbMV0gLT4gJXJjeCAoc3RvcmUgNHRoIHBhcm0gdG8gcGtmbikKKworCWNtcHEJJDEsICVyYXgJLy8gYXJnYyA+PSAxPworCWNtb3Zuc3EJKCVyMTEpLCAlcmR4CS8vIHBfYXJndlswXSAtPiAlcmR4IChzdG9yZSAzcmQgcGFybSB0byBwa2ZuKQorI2VuZGlmIC8vIF9fTUlDX18gfHwgX19NSUMyX18KKworCWNhbGwJKiVyYngJCS8vIGNhbGwgKCpwa2ZuKSgpOworCW1vdnEJJDEsICVyYXgJLy8gbW92ZSAxIGludG8gcmV0dXJuIHJlZ2lzdGVyOworCisJbW92cQktOCglcmJwKSwgJXJieAkvLyByZXN0b3JlICVyYngJdXNpbmcgJXJicCBzaW5jZSAlcnNwIHdhcyBtb2RpZmllZAorCW1vdnEgCSVyYnAsICVyc3AJLy8gcmVzdG9yZSBzdGFjayBwb2ludGVyCisJcG9wcSAJJXJicAkJLy8gcmVzdG9yZSBmcmFtZSBwb2ludGVyCisJcmV0CisKKwlERUJVR19JTkZPIF9fa21wX2ludm9rZV9taWNyb3Rhc2sKKy8vIC0tIEVuZCAgX19rbXBfaW52b2tlX21pY3JvdGFzaworCisvLyBrbXBfdWludDY0CisvLyBfX2ttcF9oYXJkd2FyZV90aW1lc3RhbXAodm9pZCkKKyAgICAgICAgLnRleHQKKwlQUk9DICBfX2ttcF9oYXJkd2FyZV90aW1lc3RhbXAKKwlyZHRzYworCXNobHEgICAgJDMyLCAlcmR4CisJb3JxICAgICAlcmR4LCAlcmF4CisJcmV0CisKKwlERUJVR19JTkZPIF9fa21wX2hhcmR3YXJlX3RpbWVzdGFtcAorLy8gLS0gRW5kICBfX2ttcF9oYXJkd2FyZV90aW1lc3RhbXAKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGVU5DVElPTiBfX2ttcF9ic3IzMgorLy8KKy8vIGludAorLy8gX19rbXBfYnNyMzIoIGludCApOworLy8KKworICAgICAgICAudGV4dAorICAgICAgICBQUk9DICBfX2ttcF9ic3IzMgorCisgICAgICAgIGJzciAgICAlZWRpLCVlYXgKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF9ic3IzMgorCisJCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2VuZGlmIC8qIEtNUF9BUkNIX1g4Nl82NCAqLworCisjaWYgS01QX0FSQ0hfQVJNCisgICAgLmRhdGEKKyAgICAuY29tbSAuZ29tcF9jcml0aWNhbF91c2VyXywzMiw4CisgICAgLmRhdGEKKyAgICAuYWxpZ24gNAorICAgIC5nbG9iYWwgX19rbXBfdW5uYW1lZF9jcml0aWNhbF9hZGRyCitfX2ttcF91bm5hbWVkX2NyaXRpY2FsX2FkZHI6CisgICAgLjRieXRlIC5nb21wX2NyaXRpY2FsX3VzZXJfCisgICAgLnNpemUgX19rbXBfdW5uYW1lZF9jcml0aWNhbF9hZGRyLDQKKyNlbmRpZiAvKiBLTVBfQVJDSF9BUk0gKi8KKworI2lmIEtNUF9BUkNIX1BQQzY0IHx8IEtNUF9BUkNIX0FBUkNINjQKKyAgICAuZGF0YQorICAgIC5jb21tIC5nb21wX2NyaXRpY2FsX3VzZXJfLDMyLDgKKyAgICAuZGF0YQorICAgIC5hbGlnbiA4CisgICAgLmdsb2JhbCBfX2ttcF91bm5hbWVkX2NyaXRpY2FsX2FkZHIKK19fa21wX3VubmFtZWRfY3JpdGljYWxfYWRkcjoKKyAgICAuOGJ5dGUgLmdvbXBfY3JpdGljYWxfdXNlcl8KKyAgICAuc2l6ZSBfX2ttcF91bm5hbWVkX2NyaXRpY2FsX2FkZHIsOAorI2VuZGlmIC8qIEtNUF9BUkNIX1BQQzY0IHx8IEtNUF9BUkNIX0FBUkNINjQgKi8KKworI2lmIGRlZmluZWQoX19saW51eF9fKQorIyBpZiBLTVBfQVJDSF9BUk0KKy5zZWN0aW9uIC5ub3RlLkdOVS1zdGFjaywiIiwlcHJvZ2JpdHMKKyMgZWxzZQorLnNlY3Rpb24gLm5vdGUuR05VLXN0YWNrLCIiLEBwcm9nYml0cworIyBlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy96X0xpbnV4X3V0aWwuYyBiL2ZpbmFsL3J1bnRpbWUvc3JjL3pfTGludXhfdXRpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4YWFjZjQKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy96X0xpbnV4X3V0aWwuYwpAQCAtMCwwICsxLDI3MzQgQEAKKy8qCisgKiB6X0xpbnV4X3V0aWwuYyAtLSBwbGF0Zm9ybSBzcGVjaWZpYyByb3V0aW5lcy4KKyAqICRSZXZpc2lvbjogNDM0NzMgJAorICogJERhdGU6IDIwMTQtMDktMjYgMTU6MDI6NTcgLTA1MDAgKEZyaSwgMjYgU2VwIDIwMTQpICQKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgImttcC5oIgorI2luY2x1ZGUgImttcF93cmFwcGVyX2dldHBpZC5oIgorI2luY2x1ZGUgImttcF9pdHQuaCIKKyNpbmNsdWRlICJrbXBfc3RyLmgiCisjaW5jbHVkZSAia21wX2kxOG4uaCIKKyNpbmNsdWRlICJrbXBfaW8uaCIKKyNpbmNsdWRlICJrbXBfc3RhdHMuaCIKKyNpbmNsdWRlICJrbXBfd2FpdF9yZWxlYXNlLmgiCisKKyNpZiAhS01QX09TX0ZSRUVCU0QKKyMgaW5jbHVkZSA8YWxsb2NhLmg+CisjZW5kaWYKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxtYXRoLmg+ICAgICAgICAgICAgICAgLy8gSFVHRV9WQUwuCisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvdGltZXMuaD4KKyNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KKyNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgorCisjaWYgS01QX09TX0xJTlVYICYmICFLTVBfT1NfQ05LCisjIGluY2x1ZGUgPHN5cy9zeXNpbmZvLmg+CisjIGlmIEtNUF9PU19MSU5VWCAmJiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0gfHwgS01QX0FSQ0hfQUFSQ0g2NCkKKy8vIFdlIHNob3VsZCByZWFsbHkgaW5jbHVkZSA8ZnV0ZXguaD4sIGJ1dCB0aGF0IGNhdXNlcyBjb21wYXRpYmlsaXR5IHByb2JsZW1zIG9uIGRpZmZlcmVudAorLy8gTGludXgqIE9TIGRpc3RyaWJ1dGlvbnMgdGhhdCBlaXRoZXIgcmVxdWlyZSB0aGF0IHlvdSBpbmNsdWRlIChvciBicmVhayB3aGVuIHlvdSB0cnkgdG8gaW5jbHVkZSkKKy8vIDxwY2kvdHlwZXMuaD4uCisvLyBTaW5jZSBhbGwgd2UgbmVlZCBpcyB0aGUgdHdvIG1hY3JvcyBiZWxvdyAod2hpY2ggYXJlIHBhcnQgb2YgdGhlIGtlcm5lbCBBQkksIHNvIGNhbid0IGNoYW5nZSkKKy8vIHdlIGp1c3QgZGVmaW5lIHRoZSBjb25zdGFudHMgaGVyZSBhbmQgZG9uJ3QgaW5jbHVkZSA8ZnV0ZXguaD4KKyMgIGlmbmRlZiBGVVRFWF9XQUlUCisjICAgZGVmaW5lIEZVVEVYX1dBSVQgICAgMAorIyAgZW5kaWYKKyMgIGlmbmRlZiBGVVRFWF9XQUtFCisjICAgZGVmaW5lIEZVVEVYX1dBS0UgICAgMQorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbGlmIEtNUF9PU19EQVJXSU4KKyMgaW5jbHVkZSA8c3lzL3N5c2N0bC5oPgorIyBpbmNsdWRlIDxtYWNoL21hY2guaD4KKyNlbGlmIEtNUF9PU19GUkVFQlNECisjIGluY2x1ZGUgPHN5cy9zeXNjdGwuaD4KKyMgaW5jbHVkZSA8cHRocmVhZF9ucC5oPgorI2VuZGlmCisKKworI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKworLy8gRm9yIG5vbi14ODYgYXJjaGl0ZWN0dXJlCisjaWYgS01QX0NPTVBJTEVSX0dDQyAmJiAhKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfUFBDNjQgfHwgS01QX0FSQ0hfQUFSQ0g2NCkKKyMgaW5jbHVkZSA8c3RkYm9vbC5oPgorIyBpbmNsdWRlIDxmZmkuaD4KKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdHJ1Y3Qga21wX3N5c190aW1lciB7CisgICAgc3RydWN0IHRpbWVzcGVjICAgICBzdGFydDsKK307CisKKy8vIENvbnZlcnQgdGltZXNwZWMgdG8gbmFub3NlY29uZHMuCisjZGVmaW5lIFRTMk5TKHRpbWVzcGVjKSAoKCh0aW1lc3BlYykudHZfc2VjICogMWU5KSArICh0aW1lc3BlYykudHZfbnNlYykKKworc3RhdGljIHN0cnVjdCBrbXBfc3lzX3RpbWVyIF9fa21wX3N5c190aW1lcl9kYXRhOworCisjaWYgS01QX0hBTkRMRV9TSUdOQUxTCisgICAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqIHNpZ19mdW5jX3QgKSggaW50ICk7CisgICAgU1RBVElDX0VGSTJfV09SS0FST1VORCBzdHJ1Y3Qgc2lnYWN0aW9uICAgIF9fa21wX3NpZ2hsZHJzWyBOU0lHIF07CisgICAgc3RhdGljIHNpZ3NldF90ICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3NpZ3NldDsKKyNlbmRpZgorCitzdGF0aWMgaW50IF9fa21wX2luaXRfcnVudGltZSAgID0gRkFMU0U7CisKK3N0YXRpYyBpbnQgX19rbXBfZm9ya19jb3VudCA9IDA7CisKK3N0YXRpYyBwdGhyZWFkX2NvbmRhdHRyX3QgIF9fa21wX3N1c3BlbmRfY29uZF9hdHRyOworc3RhdGljIHB0aHJlYWRfbXV0ZXhhdHRyX3QgX19rbXBfc3VzcGVuZF9tdXRleF9hdHRyOworCitzdGF0aWMga21wX2NvbmRfYWxpZ25fdCAgICBfX2ttcF93YWl0X2N2Oworc3RhdGljIGttcF9tdXRleF9hbGlnbl90ICAgX19rbXBfd2FpdF9teDsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmZGVmIERFQlVHX1NVU1BFTkQKK3N0YXRpYyB2b2lkCitfX2ttcF9wcmludF9jb25kKCBjaGFyICpidWZmZXIsIGttcF9jb25kX2FsaWduX3QgKmNvbmQgKQoreworICAgIHNwcmludGYoIGJ1ZmZlciwgIihjb25kIChsb2NrICglbGQsICVkKSksIChkZXNjciAoJXApKSkiLAorICAgICAgICAgICAgICAgICAgICAgIGNvbmQtPmNfY29uZC5fX2NfbG9jay5fX3N0YXR1cywgY29uZC0+Y19jb25kLl9fY19sb2NrLl9fc3BpbmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgY29uZC0+Y19jb25kLl9fY193YWl0aW5nICk7Cit9CisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmICggS01QX09TX0xJTlVYICYmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQpCisKKy8qCisgKiBBZmZpbml0eSBzdXBwb3J0CisgKi8KKworLyoKKyAqIE9uIHNvbWUgb2YgdGhlIG9sZGVyIE9TJ3MgdGhhdCB3ZSBidWlsZCBvbiwgdGhlc2UgY29uc3RhbnRzIGFyZW4ndCBwcmVzZW50CisgKiBpbiA8YXNtL3VuaXN0ZC5oPiAjaW5jbHVkZWQgZnJvbSA8c3lzLnN5c2NhbGwuaD4uICBUaGV5IG11c3QgYmUgdGhlIHNhbWUgb24KKyAqIGFsbCBzeXN0ZW1zIG9mIHRoZSBzYW1lIGFyY2ggd2hlcmUgdGhleSBhcmUgZGVmaW5lZCwgYW5kIHRoZXkgY2Fubm90IGNoYW5nZS4KKyAqIHN0b25lIGZvcmV2ZXIuCisgKi8KKworIyAgaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX0FSTQorIyAgIGlmbmRlZiBfX05SX3NjaGVkX3NldGFmZmluaXR5CisjICAgIGRlZmluZSBfX05SX3NjaGVkX3NldGFmZmluaXR5ICAyNDEKKyMgICBlbGlmIF9fTlJfc2NoZWRfc2V0YWZmaW5pdHkgIT0gMjQxCisjICAgIGVycm9yIFdyb25nIGNvZGUgZm9yIHNldGFmZmluaXR5IHN5c3RlbSBjYWxsLgorIyAgIGVuZGlmIC8qIF9fTlJfc2NoZWRfc2V0YWZmaW5pdHkgKi8KKyMgICBpZm5kZWYgX19OUl9zY2hlZF9nZXRhZmZpbml0eQorIyAgICBkZWZpbmUgX19OUl9zY2hlZF9nZXRhZmZpbml0eSAgMjQyCisjICAgZWxpZiBfX05SX3NjaGVkX2dldGFmZmluaXR5ICE9IDI0MgorIyAgICBlcnJvciBXcm9uZyBjb2RlIGZvciBnZXRhZmZpbml0eSBzeXN0ZW0gY2FsbC4KKyMgICBlbmRpZiAvKiBfX05SX3NjaGVkX2dldGFmZmluaXR5ICovCisKKyMgIGVsaWYgS01QX0FSQ0hfQUFSQ0g2NAorIyAgIGlmbmRlZiBfX05SX3NjaGVkX3NldGFmZmluaXR5CisjICAgIGRlZmluZSBfX05SX3NjaGVkX3NldGFmZmluaXR5ICAxMjIKKyMgICBlbGlmIF9fTlJfc2NoZWRfc2V0YWZmaW5pdHkgIT0gMTIyCisjICAgIGVycm9yIFdyb25nIGNvZGUgZm9yIHNldGFmZmluaXR5IHN5c3RlbSBjYWxsLgorIyAgIGVuZGlmIC8qIF9fTlJfc2NoZWRfc2V0YWZmaW5pdHkgKi8KKyMgICBpZm5kZWYgX19OUl9zY2hlZF9nZXRhZmZpbml0eQorIyAgICBkZWZpbmUgX19OUl9zY2hlZF9nZXRhZmZpbml0eSAgMTIzCisjICAgZWxpZiBfX05SX3NjaGVkX2dldGFmZmluaXR5ICE9IDEyMworIyAgICBlcnJvciBXcm9uZyBjb2RlIGZvciBnZXRhZmZpbml0eSBzeXN0ZW0gY2FsbC4KKyMgICBlbmRpZiAvKiBfX05SX3NjaGVkX2dldGFmZmluaXR5ICovCisKKyMgIGVsaWYgS01QX0FSQ0hfWDg2XzY0CisjICAgaWZuZGVmIF9fTlJfc2NoZWRfc2V0YWZmaW5pdHkKKyMgICAgZGVmaW5lIF9fTlJfc2NoZWRfc2V0YWZmaW5pdHkgIDIwMworIyAgIGVsaWYgX19OUl9zY2hlZF9zZXRhZmZpbml0eSAhPSAyMDMKKyMgICAgZXJyb3IgV3JvbmcgY29kZSBmb3Igc2V0YWZmaW5pdHkgc3lzdGVtIGNhbGwuCisjICAgZW5kaWYgLyogX19OUl9zY2hlZF9zZXRhZmZpbml0eSAqLworIyAgIGlmbmRlZiBfX05SX3NjaGVkX2dldGFmZmluaXR5CisjICAgIGRlZmluZSBfX05SX3NjaGVkX2dldGFmZmluaXR5ICAyMDQKKyMgICBlbGlmIF9fTlJfc2NoZWRfZ2V0YWZmaW5pdHkgIT0gMjA0CisjICAgIGVycm9yIFdyb25nIGNvZGUgZm9yIGdldGFmZmluaXR5IHN5c3RlbSBjYWxsLgorIyAgIGVuZGlmIC8qIF9fTlJfc2NoZWRfZ2V0YWZmaW5pdHkgKi8KKworIyAgZWxpZiBLTVBfQVJDSF9QUEM2NAorIyAgIGlmbmRlZiBfX05SX3NjaGVkX3NldGFmZmluaXR5CisjICAgIGRlZmluZSBfX05SX3NjaGVkX3NldGFmZmluaXR5ICAyMjIKKyMgICBlbGlmIF9fTlJfc2NoZWRfc2V0YWZmaW5pdHkgIT0gMjIyCisjICAgIGVycm9yIFdyb25nIGNvZGUgZm9yIHNldGFmZmluaXR5IHN5c3RlbSBjYWxsLgorIyAgIGVuZGlmIC8qIF9fTlJfc2NoZWRfc2V0YWZmaW5pdHkgKi8KKyMgICBpZm5kZWYgX19OUl9zY2hlZF9nZXRhZmZpbml0eQorIyAgICBkZWZpbmUgX19OUl9zY2hlZF9nZXRhZmZpbml0eSAgMjIzCisjICAgZWxpZiBfX05SX3NjaGVkX2dldGFmZmluaXR5ICE9IDIyMworIyAgICBlcnJvciBXcm9uZyBjb2RlIGZvciBnZXRhZmZpbml0eSBzeXN0ZW0gY2FsbC4KKyMgICBlbmRpZiAvKiBfX05SX3NjaGVkX2dldGFmZmluaXR5ICovCisKKworIyAgZWxzZQorIyAgIGVycm9yIFVua25vd24gb3IgdW5zdXBwb3J0ZWQgYXJjaGl0ZWN0dXJlCisKKyMgIGVuZGlmIC8qIEtNUF9BUkNIXyogKi8KKworaW50CitfX2ttcF9zZXRfc3lzdGVtX2FmZmluaXR5KCBrbXBfYWZmaW5fbWFza190IGNvbnN0ICptYXNrLCBpbnQgYWJvcnRfb25fZXJyb3IgKQoreworICAgIEtNUF9BU1NFUlQyKEtNUF9BRkZJTklUWV9DQVBBQkxFKCksCisgICAgICAiSWxsZWdhbCBzZXQgYWZmaW5pdHkgb3BlcmF0aW9uIHdoZW4gbm90IGNhcGFibGUiKTsKKworICAgIGludCByZXR2YWwgPSBzeXNjYWxsKCBfX05SX3NjaGVkX3NldGFmZmluaXR5LCAwLCBfX2ttcF9hZmZpbl9tYXNrX3NpemUsIG1hc2sgKTsKKyAgICBpZiAocmV0dmFsID49IDApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGludCBlcnJvciA9IGVycm5vOworICAgIGlmIChhYm9ydF9vbl9lcnJvcikgeworICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICBLTVBfTVNHKCBGYXRhbFN5c0Vycm9yICksCisgICAgICAgICAgICBLTVBfRVJSKCBlcnJvciApLAorICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgKTsKKyAgICB9CisgICAgcmV0dXJuIGVycm9yOworfQorCitpbnQKK19fa21wX2dldF9zeXN0ZW1fYWZmaW5pdHkoIGttcF9hZmZpbl9tYXNrX3QgKm1hc2ssIGludCBhYm9ydF9vbl9lcnJvciApCit7CisgICAgS01QX0FTU0VSVDIoS01QX0FGRklOSVRZX0NBUEFCTEUoKSwKKyAgICAgICJJbGxlZ2FsIGdldCBhZmZpbml0eSBvcGVyYXRpb24gd2hlbiBub3QgY2FwYWJsZSIpOworCisgICAgaW50IHJldHZhbCA9IHN5c2NhbGwoIF9fTlJfc2NoZWRfZ2V0YWZmaW5pdHksIDAsIF9fa21wX2FmZmluX21hc2tfc2l6ZSwgbWFzayApOworICAgIGlmIChyZXR2YWwgPj0gMCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaW50IGVycm9yID0gZXJybm87CisgICAgaWYgKGFib3J0X29uX2Vycm9yKSB7CisgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgIEtNUF9NU0coIEZhdGFsU3lzRXJyb3IgKSwKKyAgICAgICAgICAgIEtNUF9FUlIoIGVycm9yICksCisgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICApOworICAgIH0KKyAgICByZXR1cm4gZXJyb3I7Cit9CisKK3ZvaWQKK19fa21wX2FmZmluaXR5X2JpbmRfdGhyZWFkKCBpbnQgd2hpY2ggKQoreworICAgIEtNUF9BU1NFUlQyKEtNUF9BRkZJTklUWV9DQVBBQkxFKCksCisgICAgICAiSWxsZWdhbCBzZXQgYWZmaW5pdHkgb3BlcmF0aW9uIHdoZW4gbm90IGNhcGFibGUiKTsKKworICAgIGttcF9hZmZpbl9tYXNrX3QgKm1hc2sgPSAoa21wX2FmZmluX21hc2tfdCAqKWFsbG9jYShfX2ttcF9hZmZpbl9tYXNrX3NpemUpOworICAgIEtNUF9DUFVfWkVSTyhtYXNrKTsKKyAgICBLTVBfQ1BVX1NFVCh3aGljaCwgbWFzayk7CisgICAgX19rbXBfc2V0X3N5c3RlbV9hZmZpbml0eShtYXNrLCBUUlVFKTsKK30KKworLyoKKyAqIERldGVybWluZSBpZiB3ZSBjYW4gYWNjZXNzIGFmZmluaXR5IGZ1bmN0aW9uYWxpdHkgb24gdGhpcyB2ZXJzaW9uIG9mCisgKiBMaW51eCogT1MgYnkgY2hlY2tpbmcgX19OUl9zY2hlZF97Z2V0LHNldH1hZmZpbml0eSBzeXN0ZW0gY2FsbHMsIGFuZCBzZXQKKyAqIF9fa21wX2FmZmluX21hc2tfc2l6ZSB0byB0aGUgYXBwcm9wcmlhdGUgdmFsdWUgKDAgbWVhbnMgbm90IGNhcGFibGUpLgorICovCit2b2lkCitfX2ttcF9hZmZpbml0eV9kZXRlcm1pbmVfY2FwYWJsZShjb25zdCBjaGFyICplbnZfdmFyKQoreworICAgIC8vCisgICAgLy8gQ2hlY2sgYW5kIHNlZSBpZiB0aGUgT1Mgc3VwcG9ydHMgdGhyZWFkIGFmZmluaXR5LgorICAgIC8vCisKKyMgZGVmaW5lIEtNUF9DUFVfU0VUX1NJWkVfTElNSVQgICAgICAgICAgKDEwMjQqMTAyNCkKKworICAgIGludCBnQ29kZTsKKyAgICBpbnQgc0NvZGU7CisgICAga21wX2FmZmluX21hc2tfdCAqYnVmOworICAgIGJ1ZiA9ICgga21wX2FmZmluX21hc2tfdCAqICkgS01QX0lOVEVSTkFMX01BTExPQyggS01QX0NQVV9TRVRfU0laRV9MSU1JVCApOworCisgICAgLy8gSWYgTGludXgqIE9TOgorICAgIC8vIElmIHRoZSBzeXNjYWxsIGZhaWxzIG9yIHJldHVybnMgYSBzdWdnZXN0aW9uIGZvciB0aGUgc2l6ZSwKKyAgICAvLyB0aGVuIHdlIGRvbid0IGhhdmUgdG8gc2VhcmNoIGZvciBhbiBhcHByb3ByaWF0ZSBzaXplLgorICAgIGdDb2RlID0gc3lzY2FsbCggX19OUl9zY2hlZF9nZXRhZmZpbml0eSwgMCwgS01QX0NQVV9TRVRfU0laRV9MSU1JVCwgYnVmICk7CisgICAgS0FfVFJBQ0UoMzAsICggIl9fa21wX2FmZmluaXR5X2RldGVybWluZV9jYXBhYmxlOiAiCisgICAgICAgImluaXRpYWwgZ2V0YWZmaW5pdHkgY2FsbCByZXR1cm5lZCAlZCBlcnJubyA9ICVkXG4iLAorICAgICAgIGdDb2RlLCBlcnJubykpOworCisgICAgLy9pZiAoKGdDb2RlIDwgMCkgJiYgKGVycm5vID09IEVOT1NZUykpCisgICAgaWYgKGdDb2RlIDwgMCkgeworICAgICAgICAvLworICAgICAgICAvLyBTeXN0ZW0gY2FsbCBub3Qgc3VwcG9ydGVkCisgICAgICAgIC8vCisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlIHx8IChfX2ttcF9hZmZpbml0eV93YXJuaW5ncworICAgICAgICAgICYmIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X25vbmUpCisgICAgICAgICAgJiYgKF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfZGVmYXVsdCkKKyAgICAgICAgICAmJiAoX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9kaXNhYmxlZCkpKSB7CisgICAgICAgICAgICBpbnQgZXJyb3IgPSBlcnJubzsKKyAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICBrbXBfbXNfd2FybmluZywKKyAgICAgICAgICAgICAgICBLTVBfTVNHKCBHZXRBZmZTeXNDYWxsTm90U3VwcG9ydGVkLCBlbnZfdmFyICksCisgICAgICAgICAgICAgICAgS01QX0VSUiggZXJyb3IgKSwKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgICAgICBfX2ttcF9hZmZpbl9tYXNrX3NpemUgPSAwOyAgLy8gc2hvdWxkIGFscmVhZHkgYmUgMAorICAgICAgICBLTVBfSU5URVJOQUxfRlJFRShidWYpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChnQ29kZSA+IDApIHsgLy8gTGludXgqIE9TIG9ubHkKKyAgICAgICAgLy8gVGhlIG9wdGltYWwgc2l0dWF0aW9uOiB0aGUgT1MgcmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyCisgICAgICAgIC8vIGl0IGV4cGVjdHMuCisgICAgICAgIC8vCisgICAgICAgIC8vIEEgdmVyaWZpY2F0aW9uIG9mIGNvcnJlY3QgYmVoYXZpb3IgaXMgdGhhdCBJc2V0YWZmaW5pdHkgb24gYSBOVUxMCisgICAgICAgIC8vIGJ1ZmZlciB3aXRoIHRoZSBzYW1lIHNpemUgZmFpbHMgd2l0aCBlcnJubyBzZXQgdG8gRUZBVUxULgorICAgICAgICBzQ29kZSA9IHN5c2NhbGwoIF9fTlJfc2NoZWRfc2V0YWZmaW5pdHksIDAsIGdDb2RlLCBOVUxMICk7CisgICAgICAgIEtBX1RSQUNFKDMwLCAoICJfX2ttcF9hZmZpbml0eV9kZXRlcm1pbmVfY2FwYWJsZTogIgorICAgICAgICAgICAic2V0YWZmaW5pdHkgZm9yIG1hc2sgc2l6ZSAlZCByZXR1cm5lZCAlZCBlcnJubyA9ICVkXG4iLAorICAgICAgICAgICBnQ29kZSwgc0NvZGUsIGVycm5vKSk7CisgICAgICAgIGlmIChzQ29kZSA8IDApIHsKKyAgICAgICAgICAgIGlmIChlcnJubyA9PSBFTk9TWVMpIHsKKyAgICAgICAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSB8fCAoX19rbXBfYWZmaW5pdHlfd2FybmluZ3MKKyAgICAgICAgICAgICAgICAgICYmIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X25vbmUpCisgICAgICAgICAgICAgICAgICAmJiAoX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9kZWZhdWx0KQorICAgICAgICAgICAgICAgICAgJiYgKF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfZGlzYWJsZWQpKSkgeworICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3IgPSBlcnJubzsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgICAgICAgICAga21wX21zX3dhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBTZXRBZmZTeXNDYWxsTm90U3VwcG9ydGVkLCBlbnZfdmFyICksCisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfRVJSKCBlcnJvciApLAorICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5fbWFza19zaXplID0gMDsgIC8vIHNob3VsZCBhbHJlYWR5IGJlIDAKKyAgICAgICAgICAgICAgICBLTVBfSU5URVJOQUxfRlJFRShidWYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGVycm5vID09IEVGQVVMVCkgeworICAgICAgICAgICAgICAgIF9fa21wX2FmZmluX21hc2tfc2l6ZSA9IGdDb2RlOworICAgICAgICAgICAgICAgIEtBX1RSQUNFKDEwLCAoICJfX2ttcF9hZmZpbml0eV9kZXRlcm1pbmVfY2FwYWJsZTogIgorICAgICAgICAgICAgICAgICAgImFmZmluaXR5IHN1cHBvcnRlZCAobWFzayBzaXplICVkKVxuIiwKKyAgICAgICAgICAgICAgICAgIChpbnQpX19rbXBfYWZmaW5fbWFza19zaXplKSk7CisgICAgICAgICAgICAgICAgS01QX0lOVEVSTkFMX0ZSRUUoYnVmKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLworICAgIC8vIENhbGwgdGhlIGdldGFmZmluaXR5IHN5c3RlbSBjYWxsIHJlcGVhdGVkbHkgd2l0aCBpbmNyZWFzaW5nIHNldCBzaXplcworICAgIC8vIHVudGlsIHdlIHN1Y2NlZWQsIG9yIHJlYWNoIGFuIHVwcGVyIGJvdW5kIG9uIHRoZSBzZWFyY2guCisgICAgLy8KKyAgICBLQV9UUkFDRSgzMCwgKCAiX19rbXBfYWZmaW5pdHlfZGV0ZXJtaW5lX2NhcGFibGU6ICIKKyAgICAgICJzZWFyY2hpbmcgZm9yIHByb3BlciBzZXQgc2l6ZVxuIikpOworICAgIGludCBzaXplOworICAgIGZvciAoc2l6ZSA9IDE7IHNpemUgPD0gS01QX0NQVV9TRVRfU0laRV9MSU1JVDsgc2l6ZSAqPSAyKSB7CisgICAgICAgIGdDb2RlID0gc3lzY2FsbCggX19OUl9zY2hlZF9nZXRhZmZpbml0eSwgMCwgIHNpemUsIGJ1ZiApOworICAgICAgICBLQV9UUkFDRSgzMCwgKCAiX19rbXBfYWZmaW5pdHlfZGV0ZXJtaW5lX2NhcGFibGU6ICIKKyAgICAgICAgICAiZ2V0YWZmaW5pdHkgZm9yIG1hc2sgc2l6ZSAlZCByZXR1cm5lZCAlZCBlcnJubyA9ICVkXG4iLCBzaXplLAorICAgICAgICAgICAgZ0NvZGUsIGVycm5vKSk7CisKKyAgICAgICAgaWYgKGdDb2RlIDwgMCkgeworICAgICAgICAgICAgaWYgKCBlcnJubyA9PSBFTk9TWVMgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gV2Ugc2hvdWxkbid0IGdldCBoZXJlCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICBLQV9UUkFDRSgzMCwgKCAiX19rbXBfYWZmaW5pdHlfZGV0ZXJtaW5lX2NhcGFibGU6ICIKKyAgICAgICAgICAgICAgICAgICJpbmNvbnNpc3RlbnQgT1MgY2FsbCBiZWhhdmlvcjogZXJybm8gPT0gRU5PU1lTIGZvciBtYXNrIHNpemUgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgc2l6ZSkpOworICAgICAgICAgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlIHx8IChfX2ttcF9hZmZpbml0eV93YXJuaW5ncworICAgICAgICAgICAgICAgICAgJiYgKF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfbm9uZSkKKyAgICAgICAgICAgICAgICAgICYmIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X2RlZmF1bHQpCisgICAgICAgICAgICAgICAgICAmJiAoX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9kaXNhYmxlZCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBlcnJvciA9IGVycm5vOworICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgICAgICBrbXBfbXNfd2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coIEdldEFmZlN5c0NhbGxOb3RTdXBwb3J0ZWQsIGVudl92YXIgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9FUlIoIGVycm9yICksCisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbl9tYXNrX3NpemUgPSAwOyAgLy8gc2hvdWxkIGFscmVhZHkgYmUgMAorICAgICAgICAgICAgICAgIEtNUF9JTlRFUk5BTF9GUkVFKGJ1Zik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBzQ29kZSA9IHN5c2NhbGwoIF9fTlJfc2NoZWRfc2V0YWZmaW5pdHksIDAsIGdDb2RlLCBOVUxMICk7CisgICAgICAgIEtBX1RSQUNFKDMwLCAoICJfX2ttcF9hZmZpbml0eV9kZXRlcm1pbmVfY2FwYWJsZTogIgorICAgICAgICAgICAic2V0YWZmaW5pdHkgZm9yIG1hc2sgc2l6ZSAlZCByZXR1cm5lZCAlZCBlcnJubyA9ICVkXG4iLAorICAgICAgICAgICBnQ29kZSwgc0NvZGUsIGVycm5vKSk7CisgICAgICAgIGlmIChzQ29kZSA8IDApIHsKKyAgICAgICAgICAgIGlmIChlcnJubyA9PSBFTk9TWVMpIHsgLy8gTGludXgqIE9TIG9ubHkKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIFdlIHNob3VsZG4ndCBnZXQgaGVyZQorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoMzAsICggIl9fa21wX2FmZmluaXR5X2RldGVybWluZV9jYXBhYmxlOiAiCisgICAgICAgICAgICAgICAgICAiaW5jb25zaXN0ZW50IE9TIGNhbGwgYmVoYXZpb3I6IGVycm5vID09IEVOT1NZUyBmb3IgbWFzayBzaXplICVkXG4iLAorICAgICAgICAgICAgICAgICAgIHNpemUpKTsKKyAgICAgICAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSB8fCAoX19rbXBfYWZmaW5pdHlfd2FybmluZ3MKKyAgICAgICAgICAgICAgICAgICYmIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X25vbmUpCisgICAgICAgICAgICAgICAgICAmJiAoX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9kZWZhdWx0KQorICAgICAgICAgICAgICAgICAgJiYgKF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfZGlzYWJsZWQpKSkgeworICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3IgPSBlcnJubzsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgICAgICAgICAga21wX21zX3dhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBTZXRBZmZTeXNDYWxsTm90U3VwcG9ydGVkLCBlbnZfdmFyICksCisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfRVJSKCBlcnJvciApLAorICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5fbWFza19zaXplID0gMDsgIC8vIHNob3VsZCBhbHJlYWR5IGJlIDAKKyAgICAgICAgICAgICAgICBLTVBfSU5URVJOQUxfRlJFRShidWYpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChlcnJubyA9PSBFRkFVTFQpIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbl9tYXNrX3NpemUgPSBnQ29kZTsKKyAgICAgICAgICAgICAgICBLQV9UUkFDRSgxMCwgKCAiX19rbXBfYWZmaW5pdHlfZGV0ZXJtaW5lX2NhcGFibGU6ICIKKyAgICAgICAgICAgICAgICAgICJhZmZpbml0eSBzdXBwb3J0ZWQgKG1hc2sgc2l6ZSAlZClcbiIsCisgICAgICAgICAgICAgICAgICAgKGludClfX2ttcF9hZmZpbl9tYXNrX3NpemUpKTsKKyAgICAgICAgICAgICAgICBLTVBfSU5URVJOQUxfRlJFRShidWYpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAvL2ludCBlcnJvciA9IGVycm5vOyAgLy8gc2F2ZSB1bmNhdWdodCBlcnJvciBjb2RlCisgICAgS01QX0lOVEVSTkFMX0ZSRUUoYnVmKTsKKyAgICAvLyBlcnJubyA9IGVycm9yOyAgLy8gcmVzdG9yZSB1bmNhdWdodCBlcnJvciBjb2RlLCB3aWxsIGJlIHByaW50ZWQgYXQgdGhlIG5leHQgS01QX1dBUk5JTkcgYmVsb3cKKworICAgIC8vCisgICAgLy8gQWZmaW5pdHkgaXMgbm90IHN1cHBvcnRlZAorICAgIC8vCisgICAgX19rbXBfYWZmaW5fbWFza19zaXplID0gMDsKKyAgICBLQV9UUkFDRSgxMCwgKCAiX19rbXBfYWZmaW5pdHlfZGV0ZXJtaW5lX2NhcGFibGU6ICIKKyAgICAgICJjYW5ub3QgZGV0ZXJtaW5lIG1hc2sgc2l6ZSAtIGFmZmluaXR5IG5vdCBzdXBwb3J0ZWRcbiIpKTsKKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSB8fCAoX19rbXBfYWZmaW5pdHlfd2FybmluZ3MKKyAgICAgICYmIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X25vbmUpCisgICAgICAmJiAoX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9kZWZhdWx0KQorICAgICAgJiYgKF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfZGlzYWJsZWQpKSkgeworICAgICAgICBLTVBfV0FSTklORyggQWZmQ2FudEdldE1hc2tTaXplLCBlbnZfdmFyICk7CisgICAgfQorfQorCisKKy8qCisgKiBDaGFuZ2UgdGhyZWFkIHRvIHRoZSBhZmZpbml0eSBtYXNrIHBvaW50ZWQgdG8gYnkgYWZmaW5fbWFzayBhcmd1bWVudAorICogYW5kIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIG9sZCB2YWx1ZSBpbiB0aGUgb2xkX21hc2sgYXJndW1lbnQsIGlmIGFyZ3VtZW50CisgKiBpcyBub24tTlVMTC4KKyAqLworCit2b2lkCitfX2ttcF9jaGFuZ2VfdGhyZWFkX2FmZmluaXR5X21hc2soIGludCBndGlkLCBrbXBfYWZmaW5fbWFza190ICpuZXdfbWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2FmZmluX21hc2tfdCAqb2xkX21hc2sgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIGd0aWQgPT0gX19rbXBfZ2V0X2d0aWQoKSApOworICAgIGlmICggS01QX0FGRklOSVRZX0NBUEFCTEUoKSApIHsKKyAgICAgICAgaW50IHN0YXR1czsKKyAgICAgICAga21wX2luZm9fdCAgKnRoID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIG5ld19tYXNrICE9IE5VTEwgKTsKKworICAgICAgICBpZiAoIG9sZF9tYXNrICE9IE5VTEwgKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBfX2ttcF9nZXRfc3lzdGVtX2FmZmluaXR5KCBvbGRfbWFzaywgVFJVRSApOworICAgICAgICAgICAgaW50IGVycm9yID0gZXJybm87CisgICAgICAgICAgICBpZiAoIHN0YXR1cyAhPSAwICkgeworICAgICAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBDaGFuZ2VUaHJlYWRBZmZNYXNrRXJyb3IgKSwKKyAgICAgICAgICAgICAgICAgICAgS01QX0VSUiggZXJyb3IgKSwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgX19rbXBfc2V0X3N5c3RlbV9hZmZpbml0eSggbmV3X21hc2ssIFRSVUUgKTsKKworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICAgICAgY2hhciBvbGRfYnVmW0tNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTl07CisgICAgICAgICAgICBjaGFyIG5ld19idWZbS01QX0FGRklOX01BU0tfUFJJTlRfTEVOXTsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3ByaW50X21hc2sob2xkX2J1ZiwgS01QX0FGRklOX01BU0tfUFJJTlRfTEVOLCBvbGRfbWFzayk7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9wcmludF9tYXNrKG5ld19idWYsIEtNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTiwgbmV3X21hc2spOworICAgICAgICAgICAgS01QX0lORk9STSggQ2hhbmdlQWZmTWFzaywgIktNUF9BRkZJTklUWSAoQmluZCkiLCBndGlkLCBvbGRfYnVmLCBuZXdfYnVmICk7CisKKyAgICAgICAgfQorCisgICAgICAgIC8qIE1ha2Ugc3VyZSBvbGQgdmFsdWUgaXMgY29ycmVjdCBpbiB0aHJlYWQgZGF0YSBzdHJ1Y3R1cmVzICovCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIG9sZF9tYXNrICE9IE5VTEwgJiYgKG1lbWNtcChvbGRfbWFzaywKKyAgICAgICAgICB0aC0+dGgudGhfYWZmaW5fbWFzaywgX19rbXBfYWZmaW5fbWFza19zaXplKSA9PSAwKSApOworICAgICAgICBLTVBfQ1BVX0NPUFkoIHRoLT50aC50aF9hZmZpbl9tYXNrLCBuZXdfbWFzayApOworICAgIH0KK30KKworI2VuZGlmIC8vIEtNUF9PU19MSU5VWCAmJiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiBLTVBfT1NfTElOVVggJiYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNIHx8IEtNUF9BUkNIX0FBUkNINjQpICYmICFLTVBfT1NfQ05LCisKK2ludAorX19rbXBfZnV0ZXhfZGV0ZXJtaW5lX2NhcGFibGUoKQoreworICAgIGludCBsb2MgPSAwOworICAgIGludCByYyA9IHN5c2NhbGwoIF9fTlJfZnV0ZXgsICZsb2MsIEZVVEVYX1dBS0UsIDEsIE5VTEwsIE5VTEwsIDAgKTsKKyAgICBpbnQgcmV0dmFsID0gKCByYyA9PSAwICkgfHwgKCBlcnJubyAhPSBFTk9TWVMgKTsKKworICAgIEtBX1RSQUNFKDEwLCAoICJfX2ttcF9mdXRleF9kZXRlcm1pbmVfY2FwYWJsZTogcmMgPSAlZCBlcnJubyA9ICVkXG4iLCByYywKKyAgICAgIGVycm5vICkgKTsKKyAgICBLQV9UUkFDRSgxMCwgKCAiX19rbXBfZnV0ZXhfZGV0ZXJtaW5lX2NhcGFibGU6IGZ1dGV4IHN5c2NhbGwlcyBzdXBwb3J0ZWRcbiIsCisgICAgICAgIHJldHZhbCA/ICIiIDogIiBub3QiICkgKTsKKworICAgIHJldHVybiByZXR2YWw7Cit9CisKKyNlbmRpZiAvLyBLTVBfT1NfTElOVVggJiYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNKSAmJiAhS01QX09TX0NOSworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQpICYmICghIEtNUF9BU01fSU5UUklOUykKKy8qCisgKiBPbmx5IDMyLWJpdCAiYWRkLWV4Y2hhbmdlIiBpbnN0cnVjdGlvbiBvbiBJQS0zMiBhcmNoaXRlY3R1cmUgY2F1c2VzIHVzIHRvCisgKiB1c2UgY29tcGFyZV9hbmRfc3RvcmUgZm9yIHRoZXNlIHJvdXRpbmVzCisgKi8KKwora21wX2ludDMyCitfX2ttcF90ZXN0X3RoZW5fb3IzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgZCApCit7CisgICAga21wX2ludDMyIG9sZF92YWx1ZSwgbmV3X3ZhbHVlOworCisgICAgb2xkX3ZhbHVlID0gVENSXzQoICpwICk7CisgICAgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlIHwgZDsKKworICAgIHdoaWxlICggISBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVMMzIgKCBwLCBvbGRfdmFsdWUsIG5ld192YWx1ZSApICkKKyAgICB7CisgICAgICAgIEtNUF9DUFVfUEFVU0UoKTsKKyAgICAgICAgb2xkX3ZhbHVlID0gVENSXzQoICpwICk7CisgICAgICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSB8IGQ7CisgICAgfQorICAgIHJldHVybiBvbGRfdmFsdWU7Cit9CisKK2ttcF9pbnQzMgorX19rbXBfdGVzdF90aGVuX2FuZDMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiBkICkKK3sKKyAgICBrbXBfaW50MzIgb2xkX3ZhbHVlLCBuZXdfdmFsdWU7CisKKyAgICBvbGRfdmFsdWUgPSBUQ1JfNCggKnAgKTsKKyAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgJiBkOworCisgICAgd2hpbGUgKCAhIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRUwzMiAoIHAsIG9sZF92YWx1ZSwgbmV3X3ZhbHVlICkgKQorICAgIHsKKyAgICAgICAgS01QX0NQVV9QQVVTRSgpOworICAgICAgICBvbGRfdmFsdWUgPSBUQ1JfNCggKnAgKTsKKyAgICAgICAgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlICYgZDsKKyAgICB9CisgICAgcmV0dXJuIG9sZF92YWx1ZTsKK30KKworIyBpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfUFBDNjQgfHwgS01QX0FSQ0hfQUFSQ0g2NAora21wX2ludDY0CitfX2ttcF90ZXN0X3RoZW5fYWRkNjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IGQgKQoreworICAgIGttcF9pbnQ2NCBvbGRfdmFsdWUsIG5ld192YWx1ZTsKKworICAgIG9sZF92YWx1ZSA9IFRDUl84KCAqcCApOworICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSArIGQ7CisKKyAgICB3aGlsZSAoICEgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFTDY0ICggcCwgb2xkX3ZhbHVlLCBuZXdfdmFsdWUgKSApCisgICAgeworICAgICAgICBLTVBfQ1BVX1BBVVNFKCk7CisgICAgICAgIG9sZF92YWx1ZSA9IFRDUl84KCAqcCApOworICAgICAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgKyBkOworICAgIH0KKyAgICByZXR1cm4gb2xkX3ZhbHVlOworfQorIyBlbmRpZiAvKiBLTVBfQVJDSF9YODYgKi8KKwora21wX2ludDY0CitfX2ttcF90ZXN0X3RoZW5fb3I2NCggdm9sYXRpbGUga21wX2ludDY0ICpwLCBrbXBfaW50NjQgZCApCit7CisgICAga21wX2ludDY0IG9sZF92YWx1ZSwgbmV3X3ZhbHVlOworCisgICAgb2xkX3ZhbHVlID0gVENSXzgoICpwICk7CisgICAgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlIHwgZDsKKyAgICB3aGlsZSAoICEgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFTDY0ICggcCwgb2xkX3ZhbHVlLCBuZXdfdmFsdWUgKSApCisgICAgeworICAgICAgICBLTVBfQ1BVX1BBVVNFKCk7CisgICAgICAgIG9sZF92YWx1ZSA9IFRDUl84KCAqcCApOworICAgICAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgfCBkOworICAgIH0KKyAgICByZXR1cm4gb2xkX3ZhbHVlOworfQorCitrbXBfaW50NjQKK19fa21wX3Rlc3RfdGhlbl9hbmQ2NCggdm9sYXRpbGUga21wX2ludDY0ICpwLCBrbXBfaW50NjQgZCApCit7CisgICAga21wX2ludDY0IG9sZF92YWx1ZSwgbmV3X3ZhbHVlOworCisgICAgb2xkX3ZhbHVlID0gVENSXzgoICpwICk7CisgICAgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlICYgZDsKKyAgICB3aGlsZSAoICEgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFTDY0ICggcCwgb2xkX3ZhbHVlLCBuZXdfdmFsdWUgKSApCisgICAgeworICAgICAgICBLTVBfQ1BVX1BBVVNFKCk7CisgICAgICAgIG9sZF92YWx1ZSA9IFRDUl84KCAqcCApOworICAgICAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgJiBkOworICAgIH0KKyAgICByZXR1cm4gb2xkX3ZhbHVlOworfQorCisjZW5kaWYgLyogKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQpICYmICghIEtNUF9BU01fSU5UUklOUykgKi8KKwordm9pZAorX19rbXBfdGVybWluYXRlX3RocmVhZCggaW50IGd0aWQgKQoreworICAgIGludCBzdGF0dXM7CisgICAga21wX2luZm9fdCAgKnRoID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworCisgICAgaWYgKCAhdGggKSByZXR1cm47CisKKyAgICAjaWZkZWYgS01QX0NBTkNFTF9USFJFQURTCisgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF90ZXJtaW5hdGVfdGhyZWFkOiBraWxsICglZClcbiIsIGd0aWQgKSApOworICAgICAgICBzdGF0dXMgPSBwdGhyZWFkX2NhbmNlbCggdGgtPnRoLnRoX2luZm8uZHMuZHNfdGhyZWFkICk7CisgICAgICAgIGlmICggc3RhdHVzICE9IDAgJiYgc3RhdHVzICE9IEVTUkNIICkgeworICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50VGVybWluYXRlV29ya2VyVGhyZWFkICksCisgICAgICAgICAgICAgICAgS01QX0VSUiggc3RhdHVzICksCisgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICk7CisgICAgICAgIH07IC8vIGlmCisgICAgI2VuZGlmCisgICAgX19rbXBfeWllbGQoIFRSVUUgKTsKK30gLy8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIFNldCB0aHJlYWQgc3RhY2sgaW5mbyBhY2NvcmRpbmcgdG8gdmFsdWVzIHJldHVybmVkIGJ5CisgKiBwdGhyZWFkX2dldGF0dHJfbnAoKS4KKyAqIElmIHZhbHVlcyBhcmUgdW5yZWFzb25hYmxlLCBhc3N1bWUgY2FsbCBmYWlsZWQgYW5kIHVzZQorICogaW5jcmVtZW50YWwgc3RhY2sgcmVmaW5lbWVudCBtZXRob2QgaW5zdGVhZC4KKyAqIFJldHVybnMgVFJVRSBpZiB0aGUgc3RhY2sgcGFyYW1ldGVycyBjb3VsZCBiZSBkZXRlcm1pbmVkIGV4YWN0bHksCisgKiBGQUxTRSBpZiBpbmNyZW1lbnRhbCByZWZpbmVtZW50IGlzIG5lY2Vzc2FyeS4KKyAqLworc3RhdGljIGttcF9pbnQzMgorX19rbXBfc2V0X3N0YWNrX2luZm8oIGludCBndGlkLCBrbXBfaW5mb190ICp0aCApCit7CisgICAgaW50ICAgICAgICAgICAgc3RhY2tfZGF0YTsKKyNpZiBLTVBfT1NfTElOVVggfHwgS01QX09TX0ZSRUVCU0QKKyAgICAvKiBMaW51eCogT1Mgb25seSAtLSBubyBwdGhyZWFkX2dldGF0dHJfbnAgc3VwcG9ydCBvbiBPUyBYKiAqLworICAgIHB0aHJlYWRfYXR0cl90IGF0dHI7CisgICAgaW50ICAgICAgICAgICAgc3RhdHVzOworICAgIHNpemVfdCAgICAgICAgIHNpemUgPSAwOworICAgIHZvaWQgKiAgICAgICAgIGFkZHIgPSAwOworCisgICAgLyogQWx3YXlzIGRvIGluY3JlbWVudGFsIHN0YWNrIHJlZmluZW1lbnQgZm9yIHViZXJtYXN0ZXIgdGhyZWFkcyBzaW5jZSB0aGUgaW5pdGlhbAorICAgICAgIHRocmVhZCBzdGFjayByYW5nZSBjYW4gYmUgcmVkdWNlZCBieSBzaWJsaW5nIHRocmVhZCBjcmVhdGlvbiBzbyBwdGhyZWFkX2F0dHJfZ2V0c3RhY2sKKyAgICAgICBtYXkgY2F1c2UgdGhyZWFkIGd0aWQgYWxpYXNpbmcgKi8KKyAgICBpZiAoICEgS01QX1VCRVJfR1RJRChndGlkKSApIHsKKworICAgICAgICAvKiBGZXRjaCB0aGUgcmVhbCB0aHJlYWQgYXR0cmlidXRlcyAqLworICAgICAgICBzdGF0dXMgPSBwdGhyZWFkX2F0dHJfaW5pdCggJmF0dHIgKTsKKyAgICAgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX2F0dHJfaW5pdCIsIHN0YXR1cyApOworI2lmIEtNUF9PU19GUkVFQlNECisgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfYXR0cl9nZXRfbnAoIHB0aHJlYWRfc2VsZigpLCAmYXR0ciApOworICAgICAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfYXR0cl9nZXRfbnAiLCBzdGF0dXMgKTsKKyNlbHNlCisgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfZ2V0YXR0cl9ucCggcHRocmVhZF9zZWxmKCksICZhdHRyICk7CisgICAgICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9nZXRhdHRyX25wIiwgc3RhdHVzICk7CisjZW5kaWYKKyAgICAgICAgc3RhdHVzID0gcHRocmVhZF9hdHRyX2dldHN0YWNrKCAmYXR0ciwgJmFkZHIsICZzaXplICk7CisgICAgICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9hdHRyX2dldHN0YWNrIiwgc3RhdHVzICk7CisgICAgICAgIEtBX1RSQUNFKCA2MCwgKCAiX19rbXBfc2V0X3N0YWNrX2luZm86IFQjJWQgcHRocmVhZF9hdHRyX2dldHN0YWNrIHJldHVybmVkIHNpemU6ICVsdSwgIgorICAgICAgICAgICAgICAgICAgICAgICAgImxvdyBhZGRyOiAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHNpemUsIGFkZHIgKSk7CisKKyAgICAgICAgc3RhdHVzID0gcHRocmVhZF9hdHRyX2Rlc3Ryb3koICZhdHRyICk7CisgICAgICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9hdHRyX2Rlc3Ryb3kiLCBzdGF0dXMgKTsKKyAgICB9CisKKyAgICBpZiAoIHNpemUgIT0gMCAmJiBhZGRyICE9IDAgKSB7ICAgICAvKiB3YXMgc3RhY2sgcGFyYW1ldGVyIGRldGVybWluYXRpb24gc3VjY2Vzc2Z1bD8gKi8KKyAgICAgICAgLyogU3RvcmUgdGhlIGNvcnJlY3QgYmFzZSBhbmQgc2l6ZSAqLworICAgICAgICBUQ1dfUFRSKHRoLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrYmFzZSwgKCgoY2hhciAqKWFkZHIpICsgc2l6ZSkpOworICAgICAgICBUQ1dfUFRSKHRoLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrc2l6ZSwgc2l6ZSk7CisgICAgICAgIFRDV180KHRoLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrZ3JvdywgRkFMU0UpOworICAgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisjZW5kaWYgLyogS01QX09TX0xJTlVYIHx8IEtNUF9PU19GUkVFQlNEICovCisgICAgLyogVXNlIGluY3JlbWVudGFsIHJlZmluZW1lbnQgc3RhcnRpbmcgZnJvbSBpbml0aWFsIGNvbnNlcnZhdGl2ZSBlc3RpbWF0ZSAqLworICAgIFRDV19QVFIodGgtPnRoLnRoX2luZm8uZHMuZHNfc3RhY2tzaXplLCAwKTsKKyAgICBUQ1dfUFRSKHRoIC0+IHRoLnRoX2luZm8uZHMuZHNfc3RhY2tiYXNlLCAmc3RhY2tfZGF0YSk7CisgICAgVENXXzQodGgtPnRoLnRoX2luZm8uZHMuZHNfc3RhY2tncm93LCBUUlVFKTsKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyB2b2lkKgorX19rbXBfbGF1bmNoX3dvcmtlciggdm9pZCAqdGhyICkKK3sKKyAgICBpbnQgc3RhdHVzLCBvbGRfdHlwZSwgb2xkX3N0YXRlOworI2lmZGVmIEtNUF9CTE9DS19TSUdOQUxTCisgICAgc2lnc2V0X3QgICAgbmV3X3NldCwgb2xkX3NldDsKKyNlbmRpZiAvKiBLTVBfQkxPQ0tfU0lHTkFMUyAqLworICAgIHZvaWQgKmV4aXRfdmFsOworICAgIHZvaWQgKnBhZGRpbmcgPSAwOworICAgIGludCBndGlkOworICAgIGludCBlcnJvcjsKKworICAgIGd0aWQgPSAoKGttcF9pbmZvX3QqKXRocikgLT4gdGgudGhfaW5mby5kcy5kc19ndGlkOworICAgIF9fa21wX2d0aWRfc2V0X3NwZWNpZmljKCBndGlkICk7CisjaWZkZWYgS01QX1REQVRBX0dUSUQKKyAgICBfX2ttcF9ndGlkID0gZ3RpZDsKKyNlbmRpZgorI2lmIEtNUF9TVEFUU19FTkFCTEVECisgICAgLy8gc2V0IF9fdGhyZWFkIGxvY2FsIGluZGV4IHRvIHBvaW50IHRvIHRocmVhZC1zcGVjaWZpYyBzdGF0cworICAgIF9fa21wX3N0YXRzX3RocmVhZF9wdHIgPSAoKGttcF9pbmZvX3QqKXRociktPnRoLnRoX3N0YXRzOworI2VuZGlmCisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X3RocmVhZF9uYW1lKCBndGlkICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisjaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgIF9fa21wX2FmZmluaXR5X3NldF9pbml0X21hc2soIGd0aWQsIEZBTFNFICk7CisjZW5kaWYKKworI2lmZGVmIEtNUF9DQU5DRUxfVEhSRUFEUworICAgIHN0YXR1cyA9IHB0aHJlYWRfc2V0Y2FuY2VsdHlwZSggUFRIUkVBRF9DQU5DRUxfQVNZTkNIUk9OT1VTLCAmIG9sZF90eXBlICk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX3NldGNhbmNlbHR5cGUiLCBzdGF0dXMgKTsKKyAgICAvKiBqb3NoIHRvZG86IGlzbid0IFBUSFJFQURfQ0FOQ0VMX0VOQUJMRSBkZWZhdWx0IGZvciBuZXdseS1jcmVhdGVkIHRocmVhZHM/ICovCisgICAgc3RhdHVzID0gcHRocmVhZF9zZXRjYW5jZWxzdGF0ZSggUFRIUkVBRF9DQU5DRUxfRU5BQkxFLCAmIG9sZF9zdGF0ZSApOworICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9zZXRjYW5jZWxzdGF0ZSIsIHN0YXR1cyApOworI2VuZGlmCisKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisgICAgLy8KKyAgICAvLyBTZXQgdGhlIEZQIGNvbnRyb2wgcmVncyB0byBiZSBhIGNvcHkgb2YKKyAgICAvLyB0aGUgcGFyYWxsZWwgaW5pdGlhbGl6YXRpb24gdGhyZWFkJ3MuCisgICAgLy8KKyAgICBfX2ttcF9jbGVhcl94ODdfZnB1X3N0YXR1c193b3JkKCk7CisgICAgX19rbXBfbG9hZF94ODdfZnB1X2NvbnRyb2xfd29yZCggJl9fa21wX2luaXRfeDg3X2ZwdV9jb250cm9sX3dvcmQgKTsKKyAgICBfX2ttcF9sb2FkX214Y3NyKCAmX19rbXBfaW5pdF9teGNzciApOworI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKworI2lmZGVmIEtNUF9CTE9DS19TSUdOQUxTCisgICAgc3RhdHVzID0gc2lnZmlsbHNldCggJiBuZXdfc2V0ICk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUxfRVJSTk8oICJzaWdmaWxsc2V0Iiwgc3RhdHVzICk7CisgICAgc3RhdHVzID0gcHRocmVhZF9zaWdtYXNrKCBTSUdfQkxPQ0ssICYgbmV3X3NldCwgJiBvbGRfc2V0ICk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX3NpZ21hc2siLCBzdGF0dXMgKTsKKyNlbmRpZiAvKiBLTVBfQkxPQ0tfU0lHTkFMUyAqLworCisjaWYgS01QX09TX0xJTlVYIHx8IEtNUF9PU19GUkVFQlNECisgICAgaWYgKCBfX2ttcF9zdGtvZmZzZXQgPiAwICYmIGd0aWQgPiAwICkgeworICAgICAgICBwYWRkaW5nID0gYWxsb2NhKCBndGlkICogX19rbXBfc3Rrb2Zmc2V0ICk7CisgICAgfQorI2VuZGlmCisKKyAgICBLTVBfTUIoKTsKKyAgICBfX2ttcF9zZXRfc3RhY2tfaW5mbyggZ3RpZCwgKGttcF9pbmZvX3QqKXRociApOworCisgICAgX19rbXBfY2hlY2tfc3RhY2tfb3ZlcmxhcCggKGttcF9pbmZvX3QqKXRociApOworCisgICAgZXhpdF92YWwgPSBfX2ttcF9sYXVuY2hfdGhyZWFkKCAoa21wX2luZm9fdCAqKSB0aHIgKTsKKworI2lmZGVmIEtNUF9CTE9DS19TSUdOQUxTCisgICAgc3RhdHVzID0gcHRocmVhZF9zaWdtYXNrKCBTSUdfU0VUTUFTSywgJiBvbGRfc2V0LCBOVUxMICk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX3NpZ21hc2siLCBzdGF0dXMgKTsKKyNlbmRpZiAvKiBLTVBfQkxPQ0tfU0lHTkFMUyAqLworCisgICAgcmV0dXJuIGV4aXRfdmFsOworfQorCisKKy8qIFRoZSBtb25pdG9yIHRocmVhZCBjb250cm9scyBhbGwgb2YgdGhlIHRocmVhZHMgaW4gdGhlIGNvbXBsZXggKi8KKworc3RhdGljIHZvaWQqCitfX2ttcF9sYXVuY2hfbW9uaXRvciggdm9pZCAqdGhyICkKK3sKKyAgICBpbnQgICAgICAgICBzdGF0dXMsIG9sZF90eXBlLCBvbGRfc3RhdGU7CisjaWZkZWYgS01QX0JMT0NLX1NJR05BTFMKKyAgICBzaWdzZXRfdCAgICBuZXdfc2V0OworI2VuZGlmIC8qIEtNUF9CTE9DS19TSUdOQUxTICovCisgICAgc3RydWN0IHRpbWVzcGVjICBpbnRlcnZhbDsKKyAgICBpbnQgeWllbGRfY291bnQ7CisgICAgaW50IHlpZWxkX2N5Y2xlcyA9IDA7CisgICAgaW50IGVycm9yOworCisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfbGF1bmNoX21vbml0b3I6ICMxIGxhdW5jaGVkXG4iICkgKTsKKworICAgIC8qIHJlZ2lzdGVyIHVzIGFzIHRoZSBtb25pdG9yIHRocmVhZCAqLworICAgIF9fa21wX2d0aWRfc2V0X3NwZWNpZmljKCBLTVBfR1RJRF9NT05JVE9SICk7CisjaWZkZWYgS01QX1REQVRBX0dUSUQKKyAgICBfX2ttcF9ndGlkID0gS01QX0dUSURfTU9OSVRPUjsKKyNlbmRpZgorCisgICAgS01QX01CKCk7CisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X3RocmVhZF9pZ25vcmUoKTsgICAgLy8gSW5zdHJ1Y3QgSW50ZWwoUikgVGhyZWFkaW5nIFRvb2xzIHRvIGlnbm9yZSBtb25pdG9yIHRocmVhZC4KKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICBfX2ttcF9zZXRfc3RhY2tfaW5mbyggKChrbXBfaW5mb190Kil0aHIpLT50aC50aF9pbmZvLmRzLmRzX2d0aWQsIChrbXBfaW5mb190Kil0aHIgKTsKKworICAgIF9fa21wX2NoZWNrX3N0YWNrX292ZXJsYXAoIChrbXBfaW5mb190Kil0aHIgKTsKKworI2lmZGVmIEtNUF9DQU5DRUxfVEhSRUFEUworICAgIHN0YXR1cyA9IHB0aHJlYWRfc2V0Y2FuY2VsdHlwZSggUFRIUkVBRF9DQU5DRUxfQVNZTkNIUk9OT1VTLCAmIG9sZF90eXBlICk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX3NldGNhbmNlbHR5cGUiLCBzdGF0dXMgKTsKKyAgICAvKiBqb3NoIHRvZG86IGlzbid0IFBUSFJFQURfQ0FOQ0VMX0VOQUJMRSBkZWZhdWx0IGZvciBuZXdseS1jcmVhdGVkIHRocmVhZHM/ICovCisgICAgc3RhdHVzID0gcHRocmVhZF9zZXRjYW5jZWxzdGF0ZSggUFRIUkVBRF9DQU5DRUxfRU5BQkxFLCAmIG9sZF9zdGF0ZSApOworICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9zZXRjYW5jZWxzdGF0ZSIsIHN0YXR1cyApOworI2VuZGlmCisKKyAgICAjaWYgS01QX1JFQUxfVElNRV9GSVgKKyAgICAvLyBUaGlzIGlzIGEgcG90ZW50aWFsIGZpeCB3aGljaCBhbGxvd3MgYXBwbGljYXRpb24gd2l0aCByZWFsLXRpbWUgc2NoZWR1bGluZyBwb2xpY3kgd29yay4KKyAgICAvLyBIb3dldmVyLCBkZWNpc2lvbiBhYm91dCB0aGUgZml4IGlzIG5vdCBtYWRlIHlldCwgc28gaXQgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdC4KKyAgICB7IC8vIEFyZSBwcm9ncmFtIHN0YXJ0ZWQgd2l0aCByZWFsLXRpbWUgc2NoZWR1bGluZyBwb2xpY3k/CisgICAgICAgIGludCBzY2hlZCA9IHNjaGVkX2dldHNjaGVkdWxlciggMCApOworICAgICAgICBpZiAoIHNjaGVkID09IFNDSEVEX0ZJRk8gfHwgc2NoZWQgPT0gU0NIRURfUlIgKSB7CisgICAgICAgICAgICAvLyBZZXMsIHdlIGFyZSBhIHBhcnQgb2YgcmVhbC10aW1lIGFwcGxpY2F0aW9uLiBUcnkgdG8gaW5jcmVhc2UgdGhlIHByaW9yaXR5IG9mIHRoZQorICAgICAgICAgICAgLy8gbW9uaXRvci4KKyAgICAgICAgICAgIHN0cnVjdCBzY2hlZF9wYXJhbSBwYXJhbTsKKyAgICAgICAgICAgIGludCAgICBtYXhfcHJpb3JpdHkgPSBzY2hlZF9nZXRfcHJpb3JpdHlfbWF4KCBzY2hlZCApOworICAgICAgICAgICAgaW50ICAgIHJjOworICAgICAgICAgICAgS01QX1dBUk5JTkcoIFJlYWxUaW1lU2NoZWROb3RTdXBwb3J0ZWQgKTsKKyAgICAgICAgICAgIHNjaGVkX2dldHBhcmFtKCAwLCAmIHBhcmFtICk7CisgICAgICAgICAgICBpZiAoIHBhcmFtLnNjaGVkX3ByaW9yaXR5IDwgbWF4X3ByaW9yaXR5ICkgeworICAgICAgICAgICAgICAgIHBhcmFtLnNjaGVkX3ByaW9yaXR5ICs9IDE7CisgICAgICAgICAgICAgICAgcmMgPSBzY2hlZF9zZXRzY2hlZHVsZXIoIDAsIHNjaGVkLCAmIHBhcmFtICk7CisgICAgICAgICAgICAgICAgaWYgKCByYyAhPSAwICkgeworICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3IgPSBlcnJubzsKKyAgICAgICAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICAgICAgICBrbXBfbXNfd2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50Q2hhbmdlTW9uaXRvclByaW9yaXR5ICksCisgICAgICAgICAgICAgICAgICAgICAgS01QX0VSUiggZXJyb3IgKSwKKyAgICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBNb25pdG9yV2lsbFN0YXJ2ZSApLAorICAgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFdlIGNhbm5vdCBhYm9ydCBoZXJlLCBiZWNhdXNlIG51bWJlciBvZiBDUFVzIG1heSBiZSBlbm91Z2ggZm9yIGFsbCB0aGUgdGhyZWFkcywKKyAgICAgICAgICAgICAgICAvLyBpbmNsdWRpbmcgdGhlIG1vbml0b3IgdGhyZWFkLCBzbyBhcHBsaWNhdGlvbiBjb3VsZCBwb3RlbnRpYWxseSB3b3JrLi4uCisgICAgICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgICAgICBrbXBfbXNfd2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgS01QX01TRyggUnVubmluZ0F0TWF4UHJpb3JpdHkgKSwKKyAgICAgICAgICAgICAgICAgICAgS01QX01TRyggTW9uaXRvcldpbGxTdGFydmUgKSwKKyAgICAgICAgICAgICAgICAgICAgS01QX0hOVCggUnVubmluZ0F0TWF4UHJpb3JpdHkgKSwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgVENXXzQoIF9fa21wX2dsb2JhbC5nLmdfdGltZS5kdC50X3ZhbHVlLCAwICk7ICAvLyBBQzogZnJlZSB0aHJlYWQgdGhhdCB3YWl0cyBmb3IgbW9uaXRvciBzdGFydGVkCisgICAgfQorICAgICNlbmRpZiAvLyBLTVBfUkVBTF9USU1FX0ZJWAorCisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICBpZiAoIF9fa21wX21vbml0b3Jfd2FrZXVwcyA9PSAxICkgeworICAgICAgICBpbnRlcnZhbC50dl9zZWMgID0gMTsKKyAgICAgICAgaW50ZXJ2YWwudHZfbnNlYyA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50ZXJ2YWwudHZfc2VjICA9IDA7CisgICAgICAgIGludGVydmFsLnR2X25zZWMgPSAoTlNFQ19QRVJfU0VDIC8gX19rbXBfbW9uaXRvcl93YWtldXBzKTsKKyAgICB9CisKKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfbGF1bmNoX21vbml0b3I6ICMyIG1vbml0b3JcbiIgKSApOworCisgICAgaWYgKF9fa21wX3lpZWxkX2N5Y2xlKSB7CisgICAgICAgIF9fa21wX3lpZWxkaW5nX29uID0gMDsgIC8qIFN0YXJ0IG91dCB3aXRoIHlpZWxkaW5nIHNodXQgb2ZmICovCisgICAgICAgIHlpZWxkX2NvdW50ID0gX19rbXBfeWllbGRfb2ZmX2NvdW50OworICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX3lpZWxkaW5nX29uID0gMTsgIC8qIFlpZWxkaW5nIGlzIG9uIHBlcm1hbmVudGx5ICovCisgICAgfQorCisgICAgd2hpbGUoICEgVENSXzQoIF9fa21wX2dsb2JhbC5nLmdfZG9uZSApICkgeworICAgICAgICBzdHJ1Y3QgdGltZXNwZWMgIG5vdzsKKyAgICAgICAgc3RydWN0IHRpbWV2YWwgICB0dmFsOworCisgICAgICAgIC8qICBUaGlzIHRocmVhZCBtb25pdG9ycyB0aGUgc3RhdGUgb2YgdGhlIHN5c3RlbSAqLworCisgICAgICAgIEtBX1RSQUNFKCAxNSwgKCAiX19rbXBfbGF1bmNoX21vbml0b3I6IHVwZGF0ZVxuIiApICk7CisKKyAgICAgICAgc3RhdHVzID0gZ2V0dGltZW9mZGF5KCAmdHZhbCwgTlVMTCApOworICAgICAgICBLTVBfQ0hFQ0tfU1lTRkFJTF9FUlJOTyggImdldHRpbWVvZmRheSIsIHN0YXR1cyApOworICAgICAgICBUSU1FVkFMX1RPX1RJTUVTUEVDKCAmdHZhbCwgJm5vdyApOworCisgICAgICAgIG5vdy50dl9zZWMgICs9IGludGVydmFsLnR2X3NlYzsKKyAgICAgICAgbm93LnR2X25zZWMgKz0gaW50ZXJ2YWwudHZfbnNlYzsKKworICAgICAgICBpZiAobm93LnR2X25zZWMgPj0gTlNFQ19QRVJfU0VDKSB7CisgICAgICAgICAgICBub3cudHZfc2VjICArPSAxOworICAgICAgICAgICAgbm93LnR2X25zZWMgLT0gTlNFQ19QRVJfU0VDOworICAgICAgICB9CisKKyAgICAgICAgc3RhdHVzID0gcHRocmVhZF9tdXRleF9sb2NrKCAmIF9fa21wX3dhaXRfbXgubV9tdXRleCApOworICAgICAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfbXV0ZXhfbG9jayIsIHN0YXR1cyApOworICAgICAgICAvLyBBQzogdGhlIG1vbml0b3Igc2hvdWxkIG5vdCBmYWxsIGFzbGVlcCBpZiBnX2RvbmUgaGFzIGJlZW4gc2V0CisgICAgICAgIGlmICggIVRDUl80KF9fa21wX2dsb2JhbC5nLmdfZG9uZSkgKSB7ICAvLyBjaGVjayBvbmNlIG1vcmUgdW5kZXIgbXV0ZXgKKyAgICAgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfY29uZF90aW1lZHdhaXQoICZfX2ttcF93YWl0X2N2LmNfY29uZCwgJl9fa21wX3dhaXRfbXgubV9tdXRleCwgJm5vdyApOworICAgICAgICAgICAgaWYgKCBzdGF0dXMgIT0gMCApIHsKKyAgICAgICAgICAgICAgICBpZiAoIHN0YXR1cyAhPSBFVElNRURPVVQgJiYgc3RhdHVzICE9IEVJTlRSICkgeworICAgICAgICAgICAgICAgICAgICBLTVBfU1lTRkFJTCggInB0aHJlYWRfY29uZF90aW1lZHdhaXQiLCBzdGF0dXMgKTsKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgfTsKKyAgICAgICAgfTsKKyAgICAgICAgc3RhdHVzID0gcHRocmVhZF9tdXRleF91bmxvY2soICYgX19rbXBfd2FpdF9teC5tX211dGV4ICk7CisgICAgICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9tdXRleF91bmxvY2siLCBzdGF0dXMgKTsKKworICAgICAgICBpZiAoX19rbXBfeWllbGRfY3ljbGUpIHsKKyAgICAgICAgICAgIHlpZWxkX2N5Y2xlcysrOworICAgICAgICAgICAgaWYgKCAoeWllbGRfY3ljbGVzICUgeWllbGRfY291bnQpID09IDAgKSB7CisgICAgICAgICAgICAgICAgaWYgKF9fa21wX3lpZWxkaW5nX29uKSB7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX3lpZWxkaW5nX29uID0gMDsgICAvKiBUdXJuIGl0IG9mZiBub3cgKi8KKyAgICAgICAgICAgICAgICAgICAgeWllbGRfY291bnQgPSBfX2ttcF95aWVsZF9vZmZfY291bnQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfeWllbGRpbmdfb24gPSAxOyAgIC8qIFR1cm4gaXQgb24gbm93ICovCisgICAgICAgICAgICAgICAgICAgIHlpZWxkX2NvdW50ID0gX19rbXBfeWllbGRfb25fY291bnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHlpZWxkX2N5Y2xlcyA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBfX2ttcF95aWVsZGluZ19vbiA9IDE7CisgICAgICAgIH0KKworICAgICAgICBUQ1dfNCggX19rbXBfZ2xvYmFsLmcuZ190aW1lLmR0LnRfdmFsdWUsCisgICAgICAgICAgVENSXzQoIF9fa21wX2dsb2JhbC5nLmdfdGltZS5kdC50X3ZhbHVlICkgKyAxICk7CisKKyAgICAgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisgICAgfQorCisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2xhdW5jaF9tb25pdG9yOiAjMyBjbGVhbnVwXG4iICkgKTsKKworI2lmZGVmIEtNUF9CTE9DS19TSUdOQUxTCisgICAgc3RhdHVzID0gc2lnZmlsbHNldCggJiBuZXdfc2V0ICk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUxfRVJSTk8oICJzaWdmaWxsc2V0Iiwgc3RhdHVzICk7CisgICAgc3RhdHVzID0gcHRocmVhZF9zaWdtYXNrKCBTSUdfVU5CTE9DSywgJiBuZXdfc2V0LCBOVUxMICk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX3NpZ21hc2siLCBzdGF0dXMgKTsKKyNlbmRpZiAvKiBLTVBfQkxPQ0tfU0lHTkFMUyAqLworCisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2xhdW5jaF9tb25pdG9yOiAjNCBmaW5pc2hlZFxuIiApICk7CisKKyAgICBpZiggX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCAhPSAwICkgeworICAgICAgICAvKiBub3cgd2UgbmVlZCB0byB0ZXJtaW5hdGUgdGhlIHdvcmtlciB0aHJlYWRzICAqLworICAgICAgICAvKiB0aGUgdmFsdWUgb2YgdF9hYm9ydCBpcyB0aGUgc2lnbmFsIHdlIGNhdWdodCAqLworCisgICAgICAgIGludCBndGlkOworCisgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9sYXVuY2hfbW9uaXRvcjogIzUgdGVybWluYXRlIHNpZz0lZFxuIiwgX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCApICk7CisKKyAgICAgICAgLyogdGVybWluYXRlIHRoZSBPcGVuTVAgd29ya2VyIHRocmVhZHMgKi8KKyAgICAgICAgLyogVE9ETyB0aGlzIGlzIG5vdCB2YWxpZCBmb3Igc2libGluZyB0aHJlYWRzISEKKyAgICAgICAgICogdGhlIHViZXIgbWFzdGVyIG1pZ2h0IG5vdCBiZSAwIGFueW1vcmUuLiAqLworICAgICAgICBmb3IgKGd0aWQgPSAxOyBndGlkIDwgX19rbXBfdGhyZWFkc19jYXBhY2l0eTsgKytndGlkKQorICAgICAgICAgICAgX19rbXBfdGVybWluYXRlX3RocmVhZCggZ3RpZCApOworCisgICAgICAgIF9fa21wX2NsZWFudXAoKTsKKworICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfbGF1bmNoX21vbml0b3I6ICM2IHJhaXNlIHNpZz0lZFxuIiwgX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCApICk7CisKKyAgICAgICAgaWYgKF9fa21wX2dsb2JhbC5nLmdfYWJvcnQgPiAwKQorICAgICAgICAgICAgcmFpc2UoIF9fa21wX2dsb2JhbC5nLmdfYWJvcnQgKTsKKworICAgIH0KKworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9sYXVuY2hfbW9uaXRvcjogIzcgZXhpdFxuIiApICk7CisKKyAgICByZXR1cm4gdGhyOworfQorCit2b2lkCitfX2ttcF9jcmVhdGVfd29ya2VyKCBpbnQgZ3RpZCwga21wX2luZm9fdCAqdGgsIHNpemVfdCBzdGFja19zaXplICkKK3sKKyAgICBwdGhyZWFkX3QgICAgICBoYW5kbGU7CisgICAgcHRocmVhZF9hdHRyX3QgdGhyZWFkX2F0dHI7CisgICAgaW50ICAgICAgICAgICAgc3RhdHVzOworCisKKyAgICB0aC0+dGgudGhfaW5mby5kcy5kc19ndGlkID0gZ3RpZDsKKworI2lmIEtNUF9TVEFUU19FTkFCTEVECisgICAgLy8gc2V0cyB1cCB3b3JrZXIgdGhyZWFkIHN0YXRzCisgICAgX19rbXBfYWNxdWlyZV90YXNfbG9jaygmX19rbXBfc3RhdHNfbG9jaywgZ3RpZCk7CisKKyAgICAvLyB0aC0+dGgudGhfc3RhdHMgaXMgdXNlZCB0byB0cmFuc2ZlciB0aHJlYWQgc3BlY2lmaWMgc3RhdHMtcG9pbnRlciB0byBfX2ttcF9sYXVuY2hfd29ya2VyCisgICAgLy8gU28gd2hlbiB0aHJlYWQgaXMgY3JlYXRlZCAoZ29lcyBpbnRvIF9fa21wX2xhdW5jaF93b3JrZXIpIGl0IHdpbGwKKyAgICAvLyBzZXQgaXQncyBfX3RocmVhZCBsb2NhbCBwb2ludGVyIHRvIHRoLT50aC50aF9zdGF0cworICAgIHRoLT50aC50aF9zdGF0cyA9IF9fa21wX3N0YXRzX2xpc3QucHVzaF9iYWNrKGd0aWQpOworICAgIGlmKEtNUF9VQkVSX0dUSUQoZ3RpZCkpIHsKKyAgICAgICAgX19rbXBfc3RhdHNfc3RhcnRfdGltZSA9IHRzY190aWNrX2NvdW50Ojpub3coKTsKKyAgICAgICAgX19rbXBfc3RhdHNfdGhyZWFkX3B0ciA9IHRoLT50aC50aF9zdGF0czsKKyAgICAgICAgX19rbXBfc3RhdHNfaW5pdCgpOworICAgICAgICBLTVBfU1RBUlRfRVhQTElDSVRfVElNRVIoT01QX3NlcmlhbCk7CisgICAgICAgIEtNUF9TVEFSVF9FWFBMSUNJVF9USU1FUihPTVBfc3RhcnRfZW5kKTsKKyAgICB9CisgICAgX19rbXBfcmVsZWFzZV90YXNfbG9jaygmX19rbXBfc3RhdHNfbG9jaywgZ3RpZCk7CisKKyNlbmRpZiAvLyBLTVBfU1RBVFNfRU5BQkxFRAorCisgICAgaWYgKCBLTVBfVUJFUl9HVElEKGd0aWQpICkgeworICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfY3JlYXRlX3dvcmtlcjogdWJlciB0aHJlYWQgKCVkKVxuIiwgZ3RpZCApICk7CisgICAgICAgIHRoIC0+IHRoLnRoX2luZm8uZHMuZHNfdGhyZWFkID0gcHRocmVhZF9zZWxmKCk7CisgICAgICAgIF9fa21wX3NldF9zdGFja19pbmZvKCBndGlkLCB0aCApOworICAgICAgICBfX2ttcF9jaGVja19zdGFja19vdmVybGFwKCB0aCApOworICAgICAgICByZXR1cm47CisgICAgfTsgLy8gaWYKKworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9jcmVhdGVfd29ya2VyOiB0cnkgdG8gY3JlYXRlIHRocmVhZCAoJWQpXG4iLCBndGlkICkgKTsKKworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisjaWZkZWYgS01QX1RIUkVBRF9BVFRSCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfYXR0cl9pbml0KCAmdGhyZWFkX2F0dHIgKTsKKyAgICAgICAgICAgIGlmICggc3RhdHVzICE9IDAgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coIENhbnRJbml0VGhyZWFkQXR0cnMgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0VSUiggc3RhdHVzICksCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgc3RhdHVzID0gcHRocmVhZF9hdHRyX3NldGRldGFjaHN0YXRlKCAmIHRocmVhZF9hdHRyLCBQVEhSRUFEX0NSRUFURV9KT0lOQUJMRSApOworICAgICAgICAgICAgaWYgKCBzdGF0dXMgIT0gMCApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX01TRyggQ2FudFNldFdvcmtlclN0YXRlICksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9FUlIoIHN0YXR1cyApLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfTsgLy8gaWYKKworICAgICAgICAgICAgLyogU2V0IHN0YWNrIHNpemUgZm9yIHRoaXMgdGhyZWFkIG5vdy4gKi8KKyAgICAgICAgICAgIHN0YWNrX3NpemUgKz0gZ3RpZCAqIF9fa21wX3N0a29mZnNldDsKKworICAgICAgICAgICAgS0FfVFJBQ0UoIDEwLCAoICJfX2ttcF9jcmVhdGVfd29ya2VyOiBUIyVkLCBkZWZhdWx0IHN0YWNrc2l6ZSA9ICVsdSBieXRlcywgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfX2ttcF9zdGtzaXplID0gJWx1IGJ5dGVzLCBmaW5hbCBzdGFja3NpemUgPSAlbHUgYnl0ZXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgS01QX0RFRkFVTFRfU1RLU0laRSwgX19rbXBfc3Rrc2l6ZSwgc3RhY2tfc2l6ZSApICk7CisKKyMgaWZkZWYgX1BPU0lYX1RIUkVBRF9BVFRSX1NUQUNLU0laRQorICAgICAgICAgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfYXR0cl9zZXRzdGFja3NpemUoICYgdGhyZWFkX2F0dHIsIHN0YWNrX3NpemUgKTsKKyMgIGlmZGVmIEtNUF9CQUNLVVBfU1RLU0laRQorICAgICAgICAgICAgaWYgKCBzdGF0dXMgIT0gMCApIHsKKyAgICAgICAgICAgICAgICBpZiAoICEgX19rbXBfZW52X3N0a3NpemUgKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YWNrX3NpemUgPSBLTVBfQkFDS1VQX1NUS1NJWkUgKyBndGlkICogX19rbXBfc3Rrb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGtzaXplID0gS01QX0JBQ0tVUF9TVEtTSVpFOworICAgICAgICAgICAgICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfY3JlYXRlX3dvcmtlcjogVCMlZCwgZGVmYXVsdCBzdGFja3NpemUgPSAlbHUgYnl0ZXMsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9fa21wX3N0a3NpemUgPSAlbHUgYnl0ZXMsIChiYWNrdXApIGZpbmFsIHN0YWNrc2l6ZSA9ICVsdSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJieXRlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgS01QX0RFRkFVTFRfU1RLU0laRSwgX19rbXBfc3Rrc2l6ZSwgc3RhY2tfc2l6ZSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBwdGhyZWFkX2F0dHJfc2V0c3RhY2tzaXplKCAmdGhyZWFkX2F0dHIsIHN0YWNrX3NpemUgKTsKKyAgICAgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgfTsgLy8gaWYKKyMgIGVuZGlmIC8qIEtNUF9CQUNLVVBfU1RLU0laRSAqLworICAgICAgICAgICAgaWYgKCBzdGF0dXMgIT0gMCApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX01TRyggQ2FudFNldFdvcmtlclN0YWNrU2l6ZSwgc3RhY2tfc2l6ZSApLAorICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfRVJSKCBzdGF0dXMgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0hOVCggQ2hhbmdlV29ya2VyU3RhY2tTaXplICApLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfTsgLy8gaWYKKyMgZW5kaWYgLyogX1BPU0lYX1RIUkVBRF9BVFRSX1NUQUNLU0laRSAqLworICAgICAgICB9CisjZW5kaWYgLyogS01QX1RIUkVBRF9BVFRSICovCisKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdHVzID0gcHRocmVhZF9jcmVhdGUoICYgaGFuZGxlLCAmIHRocmVhZF9hdHRyLCBfX2ttcF9sYXVuY2hfd29ya2VyLCAodm9pZCAqKSB0aCApOworICAgICAgICAgICAgaWYgKCBzdGF0dXMgIT0gMCB8fCAhIGhhbmRsZSApIHsgLy8gPz8/IFdoeSBkbyB3ZSBjaGVjayBoYW5kbGU/PworI2lmZGVmIF9QT1NJWF9USFJFQURfQVRUUl9TVEFDS1NJWkUKKyAgICAgICAgICAgICAgICBpZiAoIHN0YXR1cyA9PSBFSU5WQUwgKSB7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coIENhbnRTZXRXb3JrZXJTdGFja1NpemUsIHN0YWNrX3NpemUgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9FUlIoIHN0YXR1cyApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0hOVCggSW5jcmVhc2VXb3JrZXJTdGFja1NpemUgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgaWYgKCBzdGF0dXMgPT0gRU5PTUVNICkgeworICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50U2V0V29ya2VyU3RhY2tTaXplLCBzdGFja19zaXplICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfRVJSKCBzdGF0dXMgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9ITlQoIERlY3JlYXNlV29ya2VyU3RhY2tTaXplICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICB9OworI2VuZGlmIC8qIF9QT1NJWF9USFJFQURfQVRUUl9TVEFDS1NJWkUgKi8KKyAgICAgICAgICAgICAgICBpZiAoIHN0YXR1cyA9PSBFQUdBSU4gKSB7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coIE5vUmVzb3VyY2VzRm9yV29ya2VyVGhyZWFkICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfRVJSKCBzdGF0dXMgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9ITlQoIERlY3JlYXNlX05VTV9USFJFQURTICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgICAgIEtNUF9TWVNGQUlMKCAicHRocmVhZF9jcmVhdGUiLCBzdGF0dXMgKTsKKyAgICAgICAgICAgIH07IC8vIGlmCisKKyAgICAgICAgICAgIHRoLT50aC50aF9pbmZvLmRzLmRzX3RocmVhZCA9IGhhbmRsZTsKKyAgICAgICAgfQorCisjaWZkZWYgS01QX1RIUkVBRF9BVFRSCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfYXR0cl9kZXN0cm95KCAmIHRocmVhZF9hdHRyICk7CisgICAgICAgICAgICBpZiAoIHN0YXR1cyApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9tc193YXJuaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50RGVzdHJveVRocmVhZEF0dHJzICksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9FUlIoIHN0YXR1cyApLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgfQorI2VuZGlmIC8qIEtNUF9USFJFQURfQVRUUiAqLworCisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfY3JlYXRlX3dvcmtlcjogZG9uZSBjcmVhdGluZyB0aHJlYWQgKCVkKVxuIiwgZ3RpZCApICk7CisKK30gLy8gX19rbXBfY3JlYXRlX3dvcmtlcgorCisKK3ZvaWQKK19fa21wX2NyZWF0ZV9tb25pdG9yKCBrbXBfaW5mb190ICp0aCApCit7CisgICAgcHRocmVhZF90ICAgICAgICAgICBoYW5kbGU7CisgICAgcHRocmVhZF9hdHRyX3QgICAgICB0aHJlYWRfYXR0cjsKKyAgICBzaXplX3QgICAgICAgICAgICAgIHNpemU7CisgICAgaW50ICAgICAgICAgICAgICAgICBzdGF0dXM7CisgICAgaW50ICAgICAgICAgICAgICAgICBjYWxsZXJfZ3RpZCA9IF9fa21wX2dldF9ndGlkKCk7CisgICAgaW50ICAgICAgICAgICAgICAgICBhdXRvX2Fkal9zaXplID0gRkFMU0U7CisKKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfY3JlYXRlX21vbml0b3I6IHRyeSB0byBjcmVhdGUgbW9uaXRvclxuIiApICk7CisKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgIHRoLT50aC50aF9pbmZvLmRzLmRzX3RpZCAgPSBLTVBfR1RJRF9NT05JVE9SOworICAgIHRoLT50aC50aF9pbmZvLmRzLmRzX2d0aWQgPSBLTVBfR1RJRF9NT05JVE9SOworICAgICNpZiBLTVBfUkVBTF9USU1FX0ZJWAorICAgICAgICBUQ1dfNCggX19rbXBfZ2xvYmFsLmcuZ190aW1lLmR0LnRfdmFsdWUsIC0xICk7IC8vIFdpbGwgdXNlIGl0IGZvciBzeW5jaHJvbml6YXRpb24gYSBiaXQgbGF0ZXIuCisgICAgI2Vsc2UKKyAgICAgICAgVENXXzQoIF9fa21wX2dsb2JhbC5nLmdfdGltZS5kdC50X3ZhbHVlLCAwICk7CisgICAgI2VuZGlmIC8vIEtNUF9SRUFMX1RJTUVfRklYCisKKyAgICAjaWZkZWYgS01QX1RIUkVBRF9BVFRSCisgICAgICAgIGlmICggX19rbXBfbW9uaXRvcl9zdGtzaXplID09IDAgKSB7CisgICAgICAgICAgICBfX2ttcF9tb25pdG9yX3N0a3NpemUgPSBLTVBfREVGQVVMVF9NT05JVE9SX1NUS1NJWkU7CisgICAgICAgICAgICBhdXRvX2Fkal9zaXplID0gVFJVRTsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSBwdGhyZWFkX2F0dHJfaW5pdCggJnRocmVhZF9hdHRyICk7CisgICAgICAgIGlmICggc3RhdHVzICE9IDAgKSB7CisgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgICAgIEtNUF9NU0coIENhbnRJbml0VGhyZWFkQXR0cnMgKSwKKyAgICAgICAgICAgICAgICBLTVBfRVJSKCBzdGF0dXMgKSwKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgc3RhdHVzID0gcHRocmVhZF9hdHRyX3NldGRldGFjaHN0YXRlKCAmIHRocmVhZF9hdHRyLCBQVEhSRUFEX0NSRUFURV9KT0lOQUJMRSApOworICAgICAgICBpZiAoIHN0YXR1cyAhPSAwICkgeworICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50U2V0TW9uaXRvclN0YXRlICksCisgICAgICAgICAgICAgICAgS01QX0VSUiggc3RhdHVzICksCisgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICk7CisgICAgICAgIH07IC8vIGlmCisKKyAgICAgICAgI2lmZGVmIF9QT1NJWF9USFJFQURfQVRUUl9TVEFDS1NJWkUKKyAgICAgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfYXR0cl9nZXRzdGFja3NpemUoICYgdGhyZWFkX2F0dHIsICYgc2l6ZSApOworICAgICAgICAgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX2F0dHJfZ2V0c3RhY2tzaXplIiwgc3RhdHVzICk7CisgICAgICAgICNlbHNlCisgICAgICAgICAgICBzaXplID0gX19rbXBfc3lzX21pbl9zdGtzaXplOworICAgICAgICAjZW5kaWYgLyogX1BPU0lYX1RIUkVBRF9BVFRSX1NUQUNLU0laRSAqLworICAgICNlbmRpZiAvKiBLTVBfVEhSRUFEX0FUVFIgKi8KKworICAgIGlmICggX19rbXBfbW9uaXRvcl9zdGtzaXplID09IDAgKSB7CisgICAgICAgIF9fa21wX21vbml0b3Jfc3Rrc2l6ZSA9IEtNUF9ERUZBVUxUX01PTklUT1JfU1RLU0laRTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9tb25pdG9yX3N0a3NpemUgPCBfX2ttcF9zeXNfbWluX3N0a3NpemUgKSB7CisgICAgICAgIF9fa21wX21vbml0b3Jfc3Rrc2l6ZSA9IF9fa21wX3N5c19taW5fc3Rrc2l6ZTsKKyAgICB9CisKKyAgICBLQV9UUkFDRSggMTAsICggIl9fa21wX2NyZWF0ZV9tb25pdG9yOiBkZWZhdWx0IHN0YWNrc2l6ZSA9ICVsdSBieXRlcywiCisgICAgICAgICAgICAgICAgICAgICJyZXF1ZXN0ZWQgc3RhY2tzaXplID0gJWx1IGJ5dGVzXG4iLAorICAgICAgICAgICAgICAgICAgICBzaXplLCBfX2ttcF9tb25pdG9yX3N0a3NpemUgKSApOworCisgICAgcmV0cnk6CisKKyAgICAvKiBTZXQgc3RhY2sgc2l6ZSBmb3IgdGhpcyB0aHJlYWQgbm93LiAqLworCisgICAgI2lmZGVmIF9QT1NJWF9USFJFQURfQVRUUl9TVEFDS1NJWkUKKyAgICAgICAgS0FfVFJBQ0UoIDEwLCAoICJfX2ttcF9jcmVhdGVfbW9uaXRvcjogc2V0dGluZyBzdGFja3NpemUgPSAlbHUgYnl0ZXMsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX21vbml0b3Jfc3Rrc2l6ZSApICk7CisgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfYXR0cl9zZXRzdGFja3NpemUoICYgdGhyZWFkX2F0dHIsIF9fa21wX21vbml0b3Jfc3Rrc2l6ZSApOworICAgICAgICBpZiAoIHN0YXR1cyAhPSAwICkgeworICAgICAgICAgICAgaWYgKCBhdXRvX2Fkal9zaXplICkgeworICAgICAgICAgICAgICAgIF9fa21wX21vbml0b3Jfc3Rrc2l6ZSAqPSAyOworICAgICAgICAgICAgICAgIGdvdG8gcmV0cnk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAga21wX21zX3dhcm5pbmcsICAvLyBzaG91bGQgdGhpcyBiZSBmYXRhbD8gIEJCCisgICAgICAgICAgICAgICAgS01QX01TRyggQ2FudFNldE1vbml0b3JTdGFja1NpemUsIChsb25nIGludCkgX19rbXBfbW9uaXRvcl9zdGtzaXplICksCisgICAgICAgICAgICAgICAgS01QX0VSUiggc3RhdHVzICksCisgICAgICAgICAgICAgICAgS01QX0hOVCggQ2hhbmdlTW9uaXRvclN0YWNrU2l6ZSApLAorICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICApOworICAgICAgICB9OyAvLyBpZgorICAgICNlbmRpZiAvKiBfUE9TSVhfVEhSRUFEX0FUVFJfU1RBQ0tTSVpFICovCisKKyAgICBzdGF0dXMgPSBwdGhyZWFkX2NyZWF0ZSggJmhhbmRsZSwgJiB0aHJlYWRfYXR0ciwgX19rbXBfbGF1bmNoX21vbml0b3IsICh2b2lkICopIHRoICk7CisKKyAgICBpZiAoIHN0YXR1cyAhPSAwICkgeworICAgICAgICAjaWZkZWYgX1BPU0lYX1RIUkVBRF9BVFRSX1NUQUNLU0laRQorICAgICAgICAgICAgaWYgKCBzdGF0dXMgPT0gRUlOVkFMICkgeworICAgICAgICAgICAgICAgIGlmICggYXV0b19hZGpfc2l6ZSAgJiYgKCBfX2ttcF9tb25pdG9yX3N0a3NpemUgPCAoc2l6ZV90KTB4NDAwMDAwMDAgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbW9uaXRvcl9zdGtzaXplICo9IDI7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gcmV0cnk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50U2V0TW9uaXRvclN0YWNrU2l6ZSwgX19rbXBfbW9uaXRvcl9zdGtzaXplICksCisgICAgICAgICAgICAgICAgICAgIEtNUF9FUlIoIHN0YXR1cyApLAorICAgICAgICAgICAgICAgICAgICBLTVBfSE5UKCBJbmNyZWFzZU1vbml0b3JTdGFja1NpemUgKSwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgIGlmICggc3RhdHVzID09IEVOT01FTSApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgICAgICAgICAgS01QX01TRyggQ2FudFNldE1vbml0b3JTdGFja1NpemUsIF9fa21wX21vbml0b3Jfc3Rrc2l6ZSApLAorICAgICAgICAgICAgICAgICAgICBLTVBfRVJSKCBzdGF0dXMgKSwKKyAgICAgICAgICAgICAgICAgICAgS01QX0hOVCggRGVjcmVhc2VNb25pdG9yU3RhY2tTaXplICksCisgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICNlbmRpZiAvKiBfUE9TSVhfVEhSRUFEX0FUVFJfU1RBQ0tTSVpFICovCisgICAgICAgIGlmICggc3RhdHVzID09IEVBR0FJTiApIHsKKyAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgS01QX01TRyggTm9SZXNvdXJjZXNGb3JNb25pdG9yVGhyZWFkICksCisgICAgICAgICAgICAgICAgS01QX0VSUiggc3RhdHVzICksCisgICAgICAgICAgICAgICAgS01QX0hOVCggRGVjcmVhc2VOdW1iZXJPZlRocmVhZHNJblVzZSApLAorICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICApOworICAgICAgICB9OyAvLyBpZgorICAgICAgICBLTVBfU1lTRkFJTCggInB0aHJlYWRfY3JlYXRlIiwgc3RhdHVzICk7CisgICAgfTsgLy8gaWYKKworICAgIHRoLT50aC50aF9pbmZvLmRzLmRzX3RocmVhZCA9IGhhbmRsZTsKKworICAgICNpZiBLTVBfUkVBTF9USU1FX0ZJWAorICAgICAgICAvLyBXYWl0IGZvciB0aGUgbW9uaXRvciB0aHJlYWQgaXMgcmVhbGx5IHN0YXJ0ZWQgYW5kIHNldCBpdHMgKnByaW9yaXR5Ki4KKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggc2l6ZW9mKCBrbXBfdWludDMyICkgPT0gc2l6ZW9mKCBfX2ttcF9nbG9iYWwuZy5nX3RpbWUuZHQudF92YWx1ZSApICk7CisgICAgICAgIF9fa21wX3dhaXRfeWllbGRfNCgKKyAgICAgICAgICAgIChrbXBfdWludDMyIHZvbGF0aWxlICopICYgX19rbXBfZ2xvYmFsLmcuZ190aW1lLmR0LnRfdmFsdWUsIC0xLCAmIF9fa21wX25lcV80LCBOVUxMCisgICAgICAgICk7CisgICAgI2VuZGlmIC8vIEtNUF9SRUFMX1RJTUVfRklYCisKKyAgICAjaWZkZWYgS01QX1RIUkVBRF9BVFRSCisgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfYXR0cl9kZXN0cm95KCAmIHRocmVhZF9hdHRyICk7CisgICAgICAgIGlmICggc3RhdHVzICE9IDAgKSB7CisgICAgICAgICAgICBfX2ttcF9tc2coICAgIC8vCisgICAgICAgICAgICAgICAga21wX21zX3dhcm5pbmcsCisgICAgICAgICAgICAgICAgS01QX01TRyggQ2FudERlc3Ryb3lUaHJlYWRBdHRycyApLAorICAgICAgICAgICAgICAgIEtNUF9FUlIoIHN0YXR1cyApLAorICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICApOworICAgICAgICB9OyAvLyBpZgorICAgICNlbmRpZgorCisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICBLQV9UUkFDRSggMTAsICggIl9fa21wX2NyZWF0ZV9tb25pdG9yOiBtb25pdG9yIGNyZWF0ZWQgJSMuOGx4XG4iLCB0aC0+dGgudGhfaW5mby5kcy5kc190aHJlYWQgKSApOworCit9IC8vIF9fa21wX2NyZWF0ZV9tb25pdG9yCisKK3ZvaWQKK19fa21wX2V4aXRfdGhyZWFkKAorICAgIGludCBleGl0X3N0YXR1cworKSB7CisgICAgcHRocmVhZF9leGl0KCAodm9pZCAqKShpbnRwdHJfdCkgZXhpdF9zdGF0dXMgKTsKK30gLy8gX19rbXBfZXhpdF90aHJlYWQKKwordm9pZCBfX2ttcF9yZXN1bWVfbW9uaXRvcigpOworCit2b2lkCitfX2ttcF9yZWFwX21vbml0b3IoIGttcF9pbmZvX3QgKnRoICkKK3sKKyAgICBpbnQgICAgICAgICAgc3RhdHVzLCBpOworICAgIHZvaWQgICAgICAgICpleGl0X3ZhbDsKKworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9yZWFwX21vbml0b3I6IHRyeSB0byByZWFwIG1vbml0b3IgdGhyZWFkIHdpdGggaGFuZGxlICUjLjhseFxuIiwKKyAgICAgICAgICAgICAgICAgICB0aC0+dGgudGhfaW5mby5kcy5kc190aHJlYWQgKSApOworCisgICAgLy8gSWYgbW9uaXRvciBoYXMgYmVlbiBjcmVhdGVkLCBpdHMgdGlkIGFuZCBndGlkIHNob3VsZCBiZSBLTVBfR1RJRF9NT05JVE9SLgorICAgIC8vIElmIGJvdGggdGlkIGFuZCBndGlkIGFyZSAwLCBpdCBtZWFucyB0aGUgbW9uaXRvciBkaWQgbm90IGV2ZXIgc3RhcnQuCisgICAgLy8gSWYgYm90aCB0aWQgYW5kIGd0aWQgYXJlIEtNUF9HVElEX0RORSwgdGhlIG1vbml0b3IgaGFzIGJlZW4gc2h1dCBkb3duLgorICAgIEtNUF9ERUJVR19BU1NFUlQoIHRoLT50aC50aF9pbmZvLmRzLmRzX3RpZCA9PSB0aC0+dGgudGhfaW5mby5kcy5kc19ndGlkICk7CisgICAgaWYgKCB0aC0+dGgudGhfaW5mby5kcy5kc19ndGlkICE9IEtNUF9HVElEX01PTklUT1IgKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9OyAvLyBpZgorCisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKworICAgIC8qIEZpcnN0LCBjaGVjayB0byBzZWUgd2hldGhlciB0aGUgbW9uaXRvciB0aHJlYWQgZXhpc3RzLiAgVGhpcyBjb3VsZCBwcmV2ZW50IGEgaGFuZywKKyAgICAgICBidXQgaWYgdGhlIG1vbml0b3IgZGllcyBhZnRlciB0aGUgcHRocmVhZF9raWxsIGNhbGwgYW5kIGJlZm9yZSB0aGUgcHRocmVhZF9qb2luCisgICAgICAgY2FsbCwgaXQgd2lsbCBzdGlsbCBoYW5nLiAqLworCisgICAgc3RhdHVzID0gcHRocmVhZF9raWxsKCB0aC0+dGgudGhfaW5mby5kcy5kc190aHJlYWQsIDAgKTsKKyAgICBpZiAoc3RhdHVzID09IEVTUkNIKSB7CisKKyAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX3JlYXBfbW9uaXRvcjogbW9uaXRvciBkb2VzIG5vdCBleGlzdCwgcmV0dXJuaW5nXG4iKSApOworCisgICAgfSBlbHNlCisgICAgeworICAgICAgICBfX2ttcF9yZXN1bWVfbW9uaXRvcigpOyAgIC8vIFdha2UgdXAgdGhlIG1vbml0b3IgdGhyZWFkCisgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfam9pbiggdGgtPnRoLnRoX2luZm8uZHMuZHNfdGhyZWFkLCAmIGV4aXRfdmFsKTsKKyAgICAgICAgaWYgKGV4aXRfdmFsICE9IHRoKSB7CisgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgICAgIEtNUF9NU0coIFJlYXBNb25pdG9yRXJyb3IgKSwKKyAgICAgICAgICAgICAgICBLTVBfRVJSKCBzdGF0dXMgKSwKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHRoLT50aC50aF9pbmZvLmRzLmRzX3RpZCAgPSBLTVBfR1RJRF9ETkU7CisgICAgdGgtPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCA9IEtNUF9HVElEX0RORTsKKworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9yZWFwX21vbml0b3I6IGRvbmUgcmVhcGluZyBtb25pdG9yIHRocmVhZCB3aXRoIGhhbmRsZSAlIy44bHhcbiIsCisgICAgICAgICAgICAgICAgICAgdGgtPnRoLnRoX2luZm8uZHMuZHNfdGhyZWFkICkgKTsKKworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCit9CisKK3ZvaWQKK19fa21wX3JlYXBfd29ya2VyKCBrbXBfaW5mb190ICp0aCApCit7CisgICAgaW50ICAgICAgICAgIHN0YXR1czsKKyAgICB2b2lkICAgICAgICAqZXhpdF92YWw7CisKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9yZWFwX3dvcmtlcjogdHJ5IHRvIHJlYXAgVCMlZFxuIiwgdGgtPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCApICk7CisKKyAgICAvKiBGaXJzdCwgY2hlY2sgdG8gc2VlIHdoZXRoZXIgdGhlIHdvcmtlciB0aHJlYWQgZXhpc3RzLiAgVGhpcyBjb3VsZCBwcmV2ZW50IGEgaGFuZywKKyAgICAgICBidXQgaWYgdGhlIHdvcmtlciBkaWVzIGFmdGVyIHRoZSBwdGhyZWFkX2tpbGwgY2FsbCBhbmQgYmVmb3JlIHRoZSBwdGhyZWFkX2pvaW4KKyAgICAgICBjYWxsLCBpdCB3aWxsIHN0aWxsIGhhbmcuICovCisKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdHVzID0gcHRocmVhZF9raWxsKCB0aC0+dGgudGhfaW5mby5kcy5kc190aHJlYWQsIDAgKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gRVNSQ0gpIHsKKyAgICAgICAgICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfcmVhcF93b3JrZXI6IHdvcmtlciBUIyVkIGRvZXMgbm90IGV4aXN0LCByZXR1cm5pbmdcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGgtPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCApICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfcmVhcF93b3JrZXI6IHRyeSB0byBqb2luIHdpdGggd29ya2VyIFQjJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGgtPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCApICk7CisKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBwdGhyZWFkX2pvaW4oIHRoLT50aC50aF9pbmZvLmRzLmRzX3RocmVhZCwgJiBleGl0X3ZhbCk7CisjaWZkZWYgS01QX0RFQlVHCisgICAgICAgICAgICAgICAgLyogRG9uJ3QgZXhwb3NlIHRoZXNlIHRvIHRoZSB1c2VyIHVudGlsIHdlIHVuZGVyc3RhbmQgd2hlbiB0aGV5IHRyaWdnZXIgKi8KKyAgICAgICAgICAgICAgICBpZiAoIHN0YXR1cyAhPSAwICkgeworICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBSZWFwV29ya2VyRXJyb3IgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9FUlIoIHN0YXR1cyApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICggZXhpdF92YWwgIT0gdGggKSB7CisgICAgICAgICAgICAgICAgICAgIEtBX1RSQUNFKCAxMCwgKCAiX19rbXBfcmVhcF93b3JrZXI6IHdvcmtlciBUIyVkIGRpZCBub3QgcmVhcCBwcm9wZXJseSwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4aXRfdmFsID0gJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aC0+dGgudGhfaW5mby5kcy5kc19ndGlkLCBleGl0X3ZhbCApICk7CisgICAgICAgICAgICAgICAgfQorI2VuZGlmIC8qIEtNUF9ERUJVRyAqLworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfcmVhcF93b3JrZXI6IGRvbmUgcmVhcGluZyBUIyVkXG4iLCB0aC0+dGgudGhfaW5mby5kcy5kc19ndGlkICkgKTsKKworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiBLTVBfSEFORExFX1NJR05BTFMKKworCitzdGF0aWMgdm9pZAorX19rbXBfbnVsbF9oYW5kbGVyKCBpbnQgc2lnbm8gKQoreworICAgIC8vICBEbyBub3RoaW5nLCBmb3IgZG9pbmcgU0lHX0lHTi10eXBlIGFjdGlvbnMuCit9IC8vIF9fa21wX251bGxfaGFuZGxlcgorCisKK3N0YXRpYyB2b2lkCitfX2ttcF90ZWFtX2hhbmRsZXIoIGludCBzaWdubyApCit7CisgICAgaWYgKCBfX2ttcF9nbG9iYWwuZy5nX2Fib3J0ID09IDAgKSB7CisgICAgICAgIC8qIFN0YWdlIDEgc2lnbmFsIGhhbmRsZXIsIGxldCdzIHNodXQgZG93biBhbGwgb2YgdGhlIHRocmVhZHMgKi8KKyAgICAgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAgICAgX19rbXBfZGVidWdfcHJpbnRmKCAiX19rbXBfdGVhbV9oYW5kbGVyOiBjYXVnaHQgc2lnbmFsID0gJWRcbiIsIHNpZ25vICk7CisgICAgICAgICNlbmRpZgorICAgICAgICBzd2l0Y2ggKCBzaWdubyApIHsKKyAgICAgICAgICAgIGNhc2UgU0lHSFVQICA6CisgICAgICAgICAgICBjYXNlIFNJR0lOVCAgOgorICAgICAgICAgICAgY2FzZSBTSUdRVUlUIDoKKyAgICAgICAgICAgIGNhc2UgU0lHSUxMICA6CisgICAgICAgICAgICBjYXNlIFNJR0FCUlQgOgorICAgICAgICAgICAgY2FzZSBTSUdGUEUgIDoKKyAgICAgICAgICAgIGNhc2UgU0lHQlVTICA6CisgICAgICAgICAgICBjYXNlIFNJR1NFR1YgOgorICAgICAgICAgICAgI2lmZGVmIFNJR1NZUworICAgICAgICAgICAgICAgIGNhc2UgU0lHU1lTIDoKKyAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgY2FzZSBTSUdURVJNIDoKKyAgICAgICAgICAgICAgICBpZiAoIF9fa21wX2RlYnVnX2J1ZiApIHsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfZHVtcF9kZWJ1Z19idWZmZXIoICk7CisgICAgICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgICAgICBLTVBfTUIoKTsgICAgICAgLy8gRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLgorICAgICAgICAgICAgICAgIFRDV180KCBfX2ttcF9nbG9iYWwuZy5nX2Fib3J0LCBzaWdubyApOworICAgICAgICAgICAgICAgIEtNUF9NQigpOyAgICAgICAvLyBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuCisgICAgICAgICAgICAgICAgVENXXzQoIF9fa21wX2dsb2JhbC5nLmdfZG9uZSwgVFJVRSApOworICAgICAgICAgICAgICAgIEtNUF9NQigpOyAgICAgICAvLyBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfZGVidWdfcHJpbnRmKCAiX19rbXBfdGVhbV9oYW5kbGVyOiB1bmtub3duIHNpZ25hbCB0eXBlIiApOworICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9OyAvLyBzd2l0Y2gKKyAgICB9OyAvLyBpZgorfSAvLyBfX2ttcF90ZWFtX2hhbmRsZXIKKworCitzdGF0aWMKK3ZvaWQgX19rbXBfc2lnYWN0aW9uKCBpbnQgc2lnbnVtLCBjb25zdCBzdHJ1Y3Qgc2lnYWN0aW9uICogYWN0LCBzdHJ1Y3Qgc2lnYWN0aW9uICogb2xkYWN0ICkgeworICAgIGludCByYyA9IHNpZ2FjdGlvbiggc2lnbnVtLCBhY3QsIG9sZGFjdCApOworICAgIEtNUF9DSEVDS19TWVNGQUlMX0VSUk5PKCAic2lnYWN0aW9uIiwgcmMgKTsKK30KKworCitzdGF0aWMgdm9pZAorX19rbXBfaW5zdGFsbF9vbmVfaGFuZGxlciggaW50IHNpZywgc2lnX2Z1bmNfdCBoYW5kbGVyX2Z1bmMsIGludCBwYXJhbGxlbF9pbml0ICkKK3sKKyAgICBLTVBfTUIoKTsgICAgICAgLy8gRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLgorICAgIEtCX1RSQUNFKCA2MCwgKCAiX19rbXBfaW5zdGFsbF9vbmVfaGFuZGxlciggJWQsIC4uLiwgJWQgKVxuIiwgc2lnLCBwYXJhbGxlbF9pbml0ICkgKTsKKyAgICBpZiAoIHBhcmFsbGVsX2luaXQgKSB7CisgICAgICAgIHN0cnVjdCBzaWdhY3Rpb24gbmV3X2FjdGlvbjsKKyAgICAgICAgc3RydWN0IHNpZ2FjdGlvbiBvbGRfYWN0aW9uOworICAgICAgICBuZXdfYWN0aW9uLnNhX2hhbmRsZXIgPSBoYW5kbGVyX2Z1bmM7CisgICAgICAgIG5ld19hY3Rpb24uc2FfZmxhZ3MgICA9IDA7CisgICAgICAgIHNpZ2ZpbGxzZXQoICYgbmV3X2FjdGlvbi5zYV9tYXNrICk7CisgICAgICAgIF9fa21wX3NpZ2FjdGlvbiggc2lnLCAmIG5ld19hY3Rpb24sICYgb2xkX2FjdGlvbiApOworICAgICAgICBpZiAoIG9sZF9hY3Rpb24uc2FfaGFuZGxlciA9PSBfX2ttcF9zaWdobGRyc1sgc2lnIF0uc2FfaGFuZGxlciApIHsKKyAgICAgICAgICAgIHNpZ2FkZHNldCggJiBfX2ttcF9zaWdzZXQsIHNpZyApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gUmVzdG9yZS9rZWVwIHVzZXIncyBoYW5kbGVyIGlmIG9uZSBwcmV2aW91c2x5IGluc3RhbGxlZC4KKyAgICAgICAgICAgIF9fa21wX3NpZ2FjdGlvbiggc2lnLCAmIG9sZF9hY3Rpb24sIE5VTEwgKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBTYXZlIGluaXRpYWwvc3lzdGVtIHNpZ25hbCBoYW5kbGVycyB0byBzZWUgaWYgdXNlciBoYW5kbGVycyBpbnN0YWxsZWQuCisgICAgICAgIF9fa21wX3NpZ2FjdGlvbiggc2lnLCBOVUxMLCAmIF9fa21wX3NpZ2hsZHJzWyBzaWcgXSApOworICAgIH07IC8vIGlmCisgICAgS01QX01CKCk7ICAgICAgIC8vIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4KK30gLy8gX19rbXBfaW5zdGFsbF9vbmVfaGFuZGxlcgorCisKK3N0YXRpYyB2b2lkCitfX2ttcF9yZW1vdmVfb25lX2hhbmRsZXIoIGludCBzaWcgKQoreworICAgIEtCX1RSQUNFKCA2MCwgKCAiX19rbXBfcmVtb3ZlX29uZV9oYW5kbGVyKCAlZCApXG4iLCBzaWcgKSApOworICAgIGlmICggc2lnaXNtZW1iZXIoICYgX19rbXBfc2lnc2V0LCBzaWcgKSApIHsKKyAgICAgICAgc3RydWN0IHNpZ2FjdGlvbiBvbGQ7CisgICAgICAgIEtNUF9NQigpOyAgICAgICAvLyBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuCisgICAgICAgIF9fa21wX3NpZ2FjdGlvbiggc2lnLCAmIF9fa21wX3NpZ2hsZHJzWyBzaWcgXSwgJiBvbGQgKTsKKyAgICAgICAgaWYgKCAoIG9sZC5zYV9oYW5kbGVyICE9IF9fa21wX3RlYW1faGFuZGxlciApICYmICggb2xkLnNhX2hhbmRsZXIgIT0gX19rbXBfbnVsbF9oYW5kbGVyICkgKSB7CisgICAgICAgICAgICAvLyBSZXN0b3JlIHRoZSB1c2VycyBzaWduYWwgaGFuZGxlci4KKyAgICAgICAgICAgIEtCX1RSQUNFKCAxMCwgKCAiX19rbXBfcmVtb3ZlX29uZV9oYW5kbGVyOiBvb3BzLCBub3Qgb3VyIGhhbmRsZXIsIHJlc3RvcmluZzogc2lnPSVkXG4iLCBzaWcgKSApOworICAgICAgICAgICAgX19rbXBfc2lnYWN0aW9uKCBzaWcsICYgb2xkLCBOVUxMICk7CisgICAgICAgIH07IC8vIGlmCisgICAgICAgIHNpZ2RlbHNldCggJiBfX2ttcF9zaWdzZXQsIHNpZyApOworICAgICAgICBLTVBfTUIoKTsgICAgICAgLy8gRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLgorICAgIH07IC8vIGlmCit9IC8vIF9fa21wX3JlbW92ZV9vbmVfaGFuZGxlcgorCisKK3ZvaWQKK19fa21wX2luc3RhbGxfc2lnbmFscyggaW50IHBhcmFsbGVsX2luaXQgKQoreworICAgIEtCX1RSQUNFKCAxMCwgKCAiX19rbXBfaW5zdGFsbF9zaWduYWxzKCAlZCApXG4iLCBwYXJhbGxlbF9pbml0ICkgKTsKKyAgICBpZiAoIF9fa21wX2hhbmRsZV9zaWduYWxzIHx8ICEgcGFyYWxsZWxfaW5pdCApIHsKKyAgICAgICAgLy8gSWYgISBwYXJhbGxlbF9pbml0LCB3ZSBkbyBub3QgaW5zdGFsbCBoYW5kbGVycywganVzdCBzYXZlIG9yaWdpbmFsIGhhbmRsZXJzLgorICAgICAgICAvLyBMZXQgdXMgZG8gaXQgZXZlbiBfX2hhbmRsZV9zaWduYWxzIGlzIDAuCisgICAgICAgIHNpZ2VtcHR5c2V0KCAmIF9fa21wX3NpZ3NldCApOworICAgICAgICBfX2ttcF9pbnN0YWxsX29uZV9oYW5kbGVyKCBTSUdIVVAsICBfX2ttcF90ZWFtX2hhbmRsZXIsIHBhcmFsbGVsX2luaXQgKTsKKyAgICAgICAgX19rbXBfaW5zdGFsbF9vbmVfaGFuZGxlciggU0lHSU5ULCAgX19rbXBfdGVhbV9oYW5kbGVyLCBwYXJhbGxlbF9pbml0ICk7CisgICAgICAgIF9fa21wX2luc3RhbGxfb25lX2hhbmRsZXIoIFNJR1FVSVQsIF9fa21wX3RlYW1faGFuZGxlciwgcGFyYWxsZWxfaW5pdCApOworICAgICAgICBfX2ttcF9pbnN0YWxsX29uZV9oYW5kbGVyKCBTSUdJTEwsICBfX2ttcF90ZWFtX2hhbmRsZXIsIHBhcmFsbGVsX2luaXQgKTsKKyAgICAgICAgX19rbXBfaW5zdGFsbF9vbmVfaGFuZGxlciggU0lHQUJSVCwgX19rbXBfdGVhbV9oYW5kbGVyLCBwYXJhbGxlbF9pbml0ICk7CisgICAgICAgIF9fa21wX2luc3RhbGxfb25lX2hhbmRsZXIoIFNJR0ZQRSwgIF9fa21wX3RlYW1faGFuZGxlciwgcGFyYWxsZWxfaW5pdCApOworICAgICAgICBfX2ttcF9pbnN0YWxsX29uZV9oYW5kbGVyKCBTSUdCVVMsICBfX2ttcF90ZWFtX2hhbmRsZXIsIHBhcmFsbGVsX2luaXQgKTsKKyAgICAgICAgX19rbXBfaW5zdGFsbF9vbmVfaGFuZGxlciggU0lHU0VHViwgX19rbXBfdGVhbV9oYW5kbGVyLCBwYXJhbGxlbF9pbml0ICk7CisgICAgICAgICNpZmRlZiBTSUdTWVMKKyAgICAgICAgICAgIF9fa21wX2luc3RhbGxfb25lX2hhbmRsZXIoIFNJR1NZUywgIF9fa21wX3RlYW1faGFuZGxlciwgcGFyYWxsZWxfaW5pdCApOworICAgICAgICAjZW5kaWYgLy8gU0lHU1lTCisgICAgICAgIF9fa21wX2luc3RhbGxfb25lX2hhbmRsZXIoIFNJR1RFUk0sIF9fa21wX3RlYW1faGFuZGxlciwgcGFyYWxsZWxfaW5pdCApOworICAgICAgICAjaWZkZWYgU0lHUElQRQorICAgICAgICAgICAgX19rbXBfaW5zdGFsbF9vbmVfaGFuZGxlciggU0lHUElQRSwgX19rbXBfdGVhbV9oYW5kbGVyLCBwYXJhbGxlbF9pbml0ICk7CisgICAgICAgICNlbmRpZiAvLyBTSUdQSVBFCisgICAgfTsgLy8gaWYKK30gLy8gX19rbXBfaW5zdGFsbF9zaWduYWxzCisKKwordm9pZAorX19rbXBfcmVtb3ZlX3NpZ25hbHMoIHZvaWQgKQoreworICAgIGludCAgICBzaWc7CisgICAgS0JfVFJBQ0UoIDEwLCAoICJfX2ttcF9yZW1vdmVfc2lnbmFscygpXG4iICkgKTsKKyAgICBmb3IgKCBzaWcgPSAxOyBzaWcgPCBOU0lHOyArKyBzaWcgKSB7CisgICAgICAgIF9fa21wX3JlbW92ZV9vbmVfaGFuZGxlciggc2lnICk7CisgICAgfTsgLy8gZm9yIHNpZworfSAvLyBfX2ttcF9yZW1vdmVfc2lnbmFscworCisKKyNlbmRpZiAvLyBLTVBfSEFORExFX1NJR05BTFMKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZAorX19rbXBfZW5hYmxlKCBpbnQgbmV3X3N0YXRlICkKK3sKKyAgICAjaWZkZWYgS01QX0NBTkNFTF9USFJFQURTCisgICAgICAgIGludCBzdGF0dXMsIG9sZF9zdGF0ZTsKKyAgICAgICAgc3RhdHVzID0gcHRocmVhZF9zZXRjYW5jZWxzdGF0ZSggbmV3X3N0YXRlLCAmIG9sZF9zdGF0ZSApOworICAgICAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfc2V0Y2FuY2Vsc3RhdGUiLCBzdGF0dXMgKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggb2xkX3N0YXRlID09IFBUSFJFQURfQ0FOQ0VMX0RJU0FCTEUgKTsKKyAgICAjZW5kaWYKK30KKwordm9pZAorX19rbXBfZGlzYWJsZSggaW50ICogb2xkX3N0YXRlICkKK3sKKyAgICAjaWZkZWYgS01QX0NBTkNFTF9USFJFQURTCisgICAgICAgIGludCBzdGF0dXM7CisgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfc2V0Y2FuY2Vsc3RhdGUoIFBUSFJFQURfQ0FOQ0VMX0RJU0FCTEUsIG9sZF9zdGF0ZSApOworICAgICAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfc2V0Y2FuY2Vsc3RhdGUiLCBzdGF0dXMgKTsKKyAgICAjZW5kaWYKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQKK19fa21wX2F0Zm9ya19wcmVwYXJlICh2b2lkKQoreworICAgIC8qICBub3RoaW5nIHRvIGRvICAqLworfQorCitzdGF0aWMgdm9pZAorX19rbXBfYXRmb3JrX3BhcmVudCAodm9pZCkKK3sKKyAgICAvKiAgbm90aGluZyB0byBkbyAgKi8KK30KKworLyoKKyAgICBSZXNldCB0aGUgbGlicmFyeSBzbyBleGVjdXRpb24gaW4gdGhlIGNoaWxkIHN0YXJ0cyAiYWxsIG92ZXIgYWdhaW4iIHdpdGgKKyAgICBjbGVhbiBkYXRhIHN0cnVjdHVyZXMgaW4gaW5pdGlhbCBzdGF0ZXMuICBEb24ndCB3b3JyeSBhYm91dCBmcmVlaW5nIG1lbW9yeQorICAgIGFsbG9jYXRlZCBieSBwYXJlbnQsIGp1c3QgYWJhbmRvbiBpdCB0byBiZSBzYWZlLgorKi8KK3N0YXRpYyB2b2lkCitfX2ttcF9hdGZvcmtfY2hpbGQgKHZvaWQpCit7CisgICAgLyogVE9ETyBtYWtlIHN1cmUgdGhpcyBpcyBkb25lIHJpZ2h0IGZvciBuZXN0ZWQvc2libGluZyAqLworICAgIC8vIEFUVDogIE1lbW9yeSBsZWFrcyBhcmUgaGVyZT8gVE9ETzogQ2hlY2sgaXQgYW5kIGZpeC4KKyAgICAvKiBLTVBfQVNTRVJUKCAwICk7ICovCisKKyAgICArK19fa21wX2ZvcmtfY291bnQ7CisKKyAgICBfX2ttcF9pbml0X3J1bnRpbWUgPSBGQUxTRTsKKyAgICBfX2ttcF9pbml0X21vbml0b3IgPSAwOworICAgIF9fa21wX2luaXRfcGFyYWxsZWwgPSBGQUxTRTsKKyAgICBfX2ttcF9pbml0X21pZGRsZSA9IEZBTFNFOworICAgIF9fa21wX2luaXRfc2VyaWFsID0gRkFMU0U7CisgICAgVENXXzQoX19rbXBfaW5pdF9ndGlkLCBGQUxTRSk7CisgICAgX19rbXBfaW5pdF9jb21tb24gPSBGQUxTRTsKKworICAgIFRDV180KF9fa21wX2luaXRfdXNlcl9sb2NrcywgRkFMU0UpOworICAgIF9fa21wX3VzZXJfbG9ja190YWJsZS51c2VkID0gMTsKKyAgICBfX2ttcF91c2VyX2xvY2tfdGFibGUuYWxsb2NhdGVkID0gMDsKKyAgICBfX2ttcF91c2VyX2xvY2tfdGFibGUudGFibGUgPSBOVUxMOworICAgIF9fa21wX2xvY2tfYmxvY2tzID0gTlVMTDsKKworICAgIF9fa21wX2FsbF9udGggPSAwOworICAgIFRDV180KF9fa21wX250aCwgMCk7CisKKyAgICAvKiBNdXN0IGFjdHVhbGx5IHplcm8gYWxsIHRoZSAqY2FjaGUgYXJndW1lbnRzIHBhc3NlZCB0byBfX2ttcGNfdGhyZWFkcHJpdmF0ZSBoZXJlCisgICAgICAgc28gdGhyZWFkcHJpdmF0ZSBkb2Vzbid0IHVzZSBzdGFsZSBkYXRhICovCisgICAgS0FfVFJBQ0UoIDEwLCAoICJfX2ttcF9hdGZvcmtfY2hpbGQ6IGNoZWNraW5nIGNhY2hlIGFkZHJlc3MgbGlzdCAlcFxuIiwKKyAgICAgICAgICAgICAgICAgX19rbXBfdGhyZWFkcHJpdl9jYWNoZV9saXN0ICkgKTsKKworICAgIHdoaWxlICggX19rbXBfdGhyZWFkcHJpdl9jYWNoZV9saXN0ICE9IE5VTEwgKSB7CisKKyAgICAgICAgaWYgKCAqX19rbXBfdGhyZWFkcHJpdl9jYWNoZV9saXN0IC0+IGFkZHIgIT0gTlVMTCApIHsKKyAgICAgICAgICAgIEtDX1RSQUNFKCA1MCwgKCAiX19rbXBfYXRmb3JrX2NoaWxkOiB6ZXJvaW5nIGNhY2hlIGF0IGFkZHJlc3MgJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAmKCpfX2ttcF90aHJlYWRwcml2X2NhY2hlX2xpc3QgLT4gYWRkcikgKSApOworCisgICAgICAgICAgICAqX19rbXBfdGhyZWFkcHJpdl9jYWNoZV9saXN0IC0+IGFkZHIgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIF9fa21wX3RocmVhZHByaXZfY2FjaGVfbGlzdCA9IF9fa21wX3RocmVhZHByaXZfY2FjaGVfbGlzdCAtPiBuZXh0OworICAgIH0KKworICAgIF9fa21wX2luaXRfcnVudGltZSA9IEZBTFNFOworCisgICAgLyogcmVzZXQgc3RhdGljYWxseSBpbml0aWFsaXplZCBsb2NrcyAqLworICAgIF9fa21wX2luaXRfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9pbml0el9sb2NrICk7CisgICAgX19rbXBfaW5pdF9ib290c3RyYXBfbG9jayggJl9fa21wX3N0ZGlvX2xvY2sgKTsKKyAgICBfX2ttcF9pbml0X2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfY29uc29sZV9sb2NrICk7CisKKyAgICAvKiBUaGlzIGlzIG5lY2Vzc2FyeSB0byBtYWtlIHN1cmUgbm8gc3RhbGUgZGF0YSBpcyBsZWZ0IGFyb3VuZCAqLworICAgIC8qIEFDOiBjdXN0b21lcnMgY29tcGxhaW4gdGhhdCB3ZSB1c2UgdW5zYWZlIHJvdXRpbmVzIGluIHRoZSBhdGZvcmsKKyAgICAgICBoYW5kbGVyLiBNYXRod29ya3M6IGRsc3ltKCkgaXMgdW5zYWZlLiBXZSBjYWxsIGRsc3ltIGFuZCBkbG9wZW4KKyAgICAgICBpbiBkeW5hbWljX2xpbmsgd2hlbiBjaGVjayB0aGUgcHJlc2VuY2Ugb2Ygc2hhcmVkIHRiYm1hbGxvYyBsaWJyYXJ5LgorICAgICAgIFN1Z2dlc3Rpb24gaXMgdG8gbWFrZSB0aGUgbGlicmFyeSBpbml0aWFsaXphdGlvbiBsYXppZXIsIHNpbWlsYXIKKyAgICAgICB0byB3aGF0IGRvbmUgZm9yIF9fa21wY19iZWdpbigpLiAqLworICAgIC8vIFRPRE86IHN5bmNocm9uaXplIGFsbCBzdGF0aWMgaW5pdGlhbGl6YXRpb25zIHdpdGggcmVndWxhciBsaWJyYXJ5CisgICAgLy8gICAgICAgc3RhcnR1cDsgbG9vayBhdCBrbXBfZ2xvYmFsLmMgYW5kIGV0Yy4KKyAgICAvL19fa21wX2ludGVybmFsX2JlZ2luICgpOworCit9CisKK3ZvaWQKK19fa21wX3JlZ2lzdGVyX2F0Zm9yayh2b2lkKSB7CisgICAgaWYgKCBfX2ttcF9uZWVkX3JlZ2lzdGVyX2F0Zm9yayApIHsKKyAgICAgICAgaW50IHN0YXR1cyA9IHB0aHJlYWRfYXRmb3JrKCBfX2ttcF9hdGZvcmtfcHJlcGFyZSwgX19rbXBfYXRmb3JrX3BhcmVudCwgX19rbXBfYXRmb3JrX2NoaWxkICk7CisgICAgICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9hdGZvcmsiLCBzdGF0dXMgKTsKKyAgICAgICAgX19rbXBfbmVlZF9yZWdpc3Rlcl9hdGZvcmsgPSBGQUxTRTsKKyAgICB9Cit9CisKK3ZvaWQKK19fa21wX3N1c3BlbmRfaW5pdGlhbGl6ZSggdm9pZCApCit7CisgICAgaW50IHN0YXR1czsKKyAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4YXR0cl9pbml0KCAmX19rbXBfc3VzcGVuZF9tdXRleF9hdHRyICk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX211dGV4YXR0cl9pbml0Iiwgc3RhdHVzICk7CisgICAgc3RhdHVzID0gcHRocmVhZF9jb25kYXR0cl9pbml0KCAmX19rbXBfc3VzcGVuZF9jb25kX2F0dHIgKTsKKyAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfY29uZGF0dHJfaW5pdCIsIHN0YXR1cyApOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfc3VzcGVuZF9pbml0aWFsaXplX3RocmVhZCgga21wX2luZm9fdCAqdGggKQoreworICAgIGlmICggdGgtPnRoLnRoX3N1c3BlbmRfaW5pdF9jb3VudCA8PSBfX2ttcF9mb3JrX2NvdW50ICkgeworICAgICAgICAvKiB0aGlzIG1lYW5zIHdlIGhhdmVuJ3QgaW5pdGlhbGl6ZWQgdGhlIHN1c3BlbnNpb24gcHRocmVhZCBvYmplY3RzIGZvciB0aGlzIHRocmVhZAorICAgICAgICAgICBpbiB0aGlzIGluc3RhbmNlIG9mIHRoZSBwcm9jZXNzICovCisgICAgICAgIGludCAgICAgc3RhdHVzOworICAgICAgICBzdGF0dXMgPSBwdGhyZWFkX2NvbmRfaW5pdCggJnRoLT50aC50aF9zdXNwZW5kX2N2LmNfY29uZCwgJl9fa21wX3N1c3BlbmRfY29uZF9hdHRyICk7CisgICAgICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9jb25kX2luaXQiLCBzdGF0dXMgKTsKKyAgICAgICAgc3RhdHVzID0gcHRocmVhZF9tdXRleF9pbml0KCAmdGgtPnRoLnRoX3N1c3BlbmRfbXgubV9tdXRleCwgJiBfX2ttcF9zdXNwZW5kX211dGV4X2F0dHIgKTsKKyAgICAgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX211dGV4X2luaXQiLCBzdGF0dXMgKTsKKyAgICAgICAgKih2b2xhdGlsZSBpbnQqKSZ0aC0+dGgudGhfc3VzcGVuZF9pbml0X2NvdW50ID0gX19rbXBfZm9ya19jb3VudCArIDE7CisgICAgfTsKK30KKwordm9pZAorX19rbXBfc3VzcGVuZF91bmluaXRpYWxpemVfdGhyZWFkKCBrbXBfaW5mb190ICp0aCApCit7CisgICAgaWYodGgtPnRoLnRoX3N1c3BlbmRfaW5pdF9jb3VudCA+IF9fa21wX2ZvcmtfY291bnQpIHsKKyAgICAgICAgLyogdGhpcyBtZWFucyB3ZSBoYXZlIGluaXRpYWxpemUgdGhlIHN1c3BlbnNpb24gcHRocmVhZCBvYmplY3RzIGZvciB0aGlzIHRocmVhZAorICAgICAgICAgICBpbiB0aGlzIGluc3RhbmNlIG9mIHRoZSBwcm9jZXNzICovCisgICAgICAgIGludCBzdGF0dXM7CisKKyAgICAgICAgc3RhdHVzID0gcHRocmVhZF9jb25kX2Rlc3Ryb3koICZ0aC0+dGgudGhfc3VzcGVuZF9jdi5jX2NvbmQgKTsKKyAgICAgICAgaWYgKCBzdGF0dXMgIT0gMCAmJiBzdGF0dXMgIT0gRUJVU1kgKSB7CisgICAgICAgICAgICBLTVBfU1lTRkFJTCggInB0aHJlYWRfY29uZF9kZXN0cm95Iiwgc3RhdHVzICk7CisgICAgICAgIH07CisgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfZGVzdHJveSggJnRoLT50aC50aF9zdXNwZW5kX214Lm1fbXV0ZXggKTsKKyAgICAgICAgaWYgKCBzdGF0dXMgIT0gMCAmJiBzdGF0dXMgIT0gRUJVU1kgKSB7CisgICAgICAgICAgICBLTVBfU1lTRkFJTCggInB0aHJlYWRfbXV0ZXhfZGVzdHJveSIsIHN0YXR1cyApOworICAgICAgICB9OworICAgICAgICAtLXRoLT50aC50aF9zdXNwZW5kX2luaXRfY291bnQ7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQodGgtPnRoLnRoX3N1c3BlbmRfaW5pdF9jb3VudCA9PSBfX2ttcF9mb3JrX2NvdW50KTsKKyAgICB9Cit9CisKKy8qIFRoaXMgcm91dGluZSBwdXRzIHRoZSBjYWxsaW5nIHRocmVhZCB0byBzbGVlcCBhZnRlciBzZXR0aW5nIHRoZQorICogc2xlZXAgYml0IGZvciB0aGUgaW5kaWNhdGVkIGZsYWcgdmFyaWFibGUgdG8gdHJ1ZS4KKyAqLwordGVtcGxhdGUgPGNsYXNzIEM+CitzdGF0aWMgaW5saW5lIHZvaWQgX19rbXBfc3VzcGVuZF90ZW1wbGF0ZSggaW50IHRoX2d0aWQsIEMgKmZsYWcgKQoreworICAgIEtNUF9USU1FX0JMT0NLKFVTRVJfc3VzcGVuZCk7CisgICAga21wX2luZm9fdCAqdGggPSBfX2ttcF90aHJlYWRzW3RoX2d0aWRdOworICAgIGludCBzdGF0dXM7CisgICAgdHlwZW5hbWUgQzo6ZmxhZ190IG9sZF9zcGluOworCisgICAgS0ZfVFJBQ0UoIDMwLCAoIl9fa21wX3N1c3BlbmRfdGVtcGxhdGU6IFQjJWQgZW50ZXIgZm9yIGZsYWcgPSAlcFxuIiwgdGhfZ3RpZCwgZmxhZy0+Z2V0KCkgKSApOworCisgICAgX19rbXBfc3VzcGVuZF9pbml0aWFsaXplX3RocmVhZCggdGggKTsKKworICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfbG9jayggJnRoLT50aC50aF9zdXNwZW5kX214Lm1fbXV0ZXggKTsKKyAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfbXV0ZXhfbG9jayIsIHN0YXR1cyApOworCisgICAgS0ZfVFJBQ0UoIDEwLCAoICJfX2ttcF9zdXNwZW5kX3RlbXBsYXRlOiBUIyVkIHNldHRpbmcgc2xlZXAgYml0IGZvciBzcGluKCVwKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgdGhfZ3RpZCwgZmxhZy0+Z2V0KCkgKSApOworCisgICAgLyogVE9ETzogc2hvdWxkbid0IHRoaXMgdXNlIHJlbGVhc2Ugc2VtYW50aWNzIHRvIGVuc3VyZSB0aGF0IF9fa21wX3N1c3BlbmRfaW5pdGlhbGl6ZV90aHJlYWQKKyAgICAgICBnZXRzIGNhbGxlZCBmaXJzdD8KKyAgICAqLworICAgIG9sZF9zcGluID0gZmxhZy0+c2V0X3NsZWVwaW5nKCk7CisKKyAgICBLRl9UUkFDRSggNSwgKCAiX19rbXBfc3VzcGVuZF90ZW1wbGF0ZTogVCMlZCBzZXQgc2xlZXAgYml0IGZvciBzcGluKCVwKT09JWRcbiIsCisgICAgICAgICAgICAgICAgICAgdGhfZ3RpZCwgZmxhZy0+Z2V0KCksICooZmxhZy0+Z2V0KCkpICkgKTsKKworICAgIGlmICggZmxhZy0+ZG9uZV9jaGVja192YWwob2xkX3NwaW4pICkgeworICAgICAgICBvbGRfc3BpbiA9IGZsYWctPnVuc2V0X3NsZWVwaW5nKCk7CisgICAgICAgIEtGX1RSQUNFKCA1LCAoICJfX2ttcF9zdXNwZW5kX3RlbXBsYXRlOiBUIyVkIGZhbHNlIGFsYXJtLCByZXNldCBzbGVlcCBiaXQgZm9yIHNwaW4oJXApXG4iLAorICAgICAgICAgICAgICAgICAgICAgICB0aF9ndGlkLCBmbGFnLT5nZXQoKSkgKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBFbmNhcHN1bGF0ZSBpbiBhIGxvb3AgYXMgdGhlIGRvY3VtZW50YXRpb24gc3RhdGVzIHRoYXQgdGhpcyBtYXkKKyAgICAgICAgICogIndpdGggbG93IHByb2JhYmlsaXR5IiByZXR1cm4gd2hlbiB0aGUgY29uZGl0aW9uIHZhcmlhYmxlIGhhcworICAgICAgICAgKiBub3QgYmVlbiBzaWduYWxlZCBvciBicm9hZGNhc3QKKyAgICAgICAgICovCisgICAgICAgIGludCBkZWFjdGl2YXRlZCA9IEZBTFNFOworICAgICAgICBUQ1dfUFRSKHRoLT50aC50aF9zbGVlcF9sb2MsICh2b2lkICopZmxhZyk7CisgICAgICAgIHdoaWxlICggZmxhZy0+aXNfc2xlZXBpbmcoKSApIHsKKyNpZmRlZiBERUJVR19TVVNQRU5ECisgICAgICAgICAgICBjaGFyIGJ1ZmZlclsxMjhdOworICAgICAgICAgICAgX19rbXBfc3VzcGVuZF9jb3VudCsrOworICAgICAgICAgICAgX19rbXBfcHJpbnRfY29uZCggYnVmZmVyLCAmdGgtPnRoLnRoX3N1c3BlbmRfY3YgKTsKKyAgICAgICAgICAgIF9fa21wX3ByaW50ZiggIl9fa21wX3N1c3BlbmRfdGVtcGxhdGU6IHN1c3BlbmRpbmcgVCMlZDogJXNcbiIsIHRoX2d0aWQsIGJ1ZmZlciApOworI2VuZGlmCisgICAgICAgICAgICAvLyBNYXJrIHRoZSB0aHJlYWQgYXMgbm8gbG9uZ2VyIGFjdGl2ZSAob25seSBpbiB0aGUgZmlyc3QgaXRlcmF0aW9uIG9mIHRoZSBsb29wKS4KKyAgICAgICAgICAgIGlmICggISBkZWFjdGl2YXRlZCApIHsKKyAgICAgICAgICAgICAgICB0aC0+dGgudGhfYWN0aXZlID0gRkFMU0U7CisgICAgICAgICAgICAgICAgaWYgKCB0aC0+dGgudGhfYWN0aXZlX2luX3Bvb2wgKSB7CisgICAgICAgICAgICAgICAgICAgIHRoLT50aC50aF9hY3RpdmVfaW5fcG9vbCA9IEZBTFNFOworICAgICAgICAgICAgICAgICAgICBLTVBfVEVTVF9USEVOX0RFQzMyKAorICAgICAgICAgICAgICAgICAgICAgIChrbXBfaW50MzIgKikgJl9fa21wX3RocmVhZF9wb29sX2FjdGl2ZV9udGggKTsKKyAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggVENSXzQoX19rbXBfdGhyZWFkX3Bvb2xfYWN0aXZlX250aCkgPj0gMCApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkZWFjdGl2YXRlZCA9IFRSVUU7CisKKworICAgICAgICAgICAgfQorCisjaWYgVVNFX1NVU1BFTkRfVElNRU9VVAorICAgICAgICAgICAgc3RydWN0IHRpbWVzcGVjICBub3c7CisgICAgICAgICAgICBzdHJ1Y3QgdGltZXZhbCAgIHR2YWw7CisgICAgICAgICAgICBpbnQgbXNlY3M7CisKKyAgICAgICAgICAgIHN0YXR1cyA9IGdldHRpbWVvZmRheSggJnR2YWwsIE5VTEwgKTsKKyAgICAgICAgICAgIEtNUF9DSEVDS19TWVNGQUlMX0VSUk5PKCAiZ2V0dGltZW9mZGF5Iiwgc3RhdHVzICk7CisgICAgICAgICAgICBUSU1FVkFMX1RPX1RJTUVTUEVDKCAmdHZhbCwgJm5vdyApOworCisgICAgICAgICAgICBtc2VjcyA9ICg0Kl9fa21wX2RmbHRfYmxvY2t0aW1lKSArIDIwMDsKKyAgICAgICAgICAgIG5vdy50dl9zZWMgICs9IG1zZWNzIC8gMTAwMDsKKyAgICAgICAgICAgIG5vdy50dl9uc2VjICs9IChtc2VjcyAlIDEwMDApKjEwMDA7CisKKyAgICAgICAgICAgIEtGX1RSQUNFKCAxNSwgKCAiX19rbXBfc3VzcGVuZF90ZW1wbGF0ZTogVCMlZCBhYm91dCB0byBwZXJmb3JtIHB0aHJlYWRfY29uZF90aW1lZHdhaXRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhfZ3RpZCApICk7CisgICAgICAgICAgICBzdGF0dXMgPSBwdGhyZWFkX2NvbmRfdGltZWR3YWl0KCAmdGgtPnRoLnRoX3N1c3BlbmRfY3YuY19jb25kLCAmdGgtPnRoLnRoX3N1c3BlbmRfbXgubV9tdXRleCwgJiBub3cgKTsKKyNlbHNlCisgICAgICAgICAgICBLRl9UUkFDRSggMTUsICggIl9fa21wX3N1c3BlbmRfdGVtcGxhdGU6IFQjJWQgYWJvdXQgdG8gcGVyZm9ybSBwdGhyZWFkX2NvbmRfd2FpdFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aF9ndGlkICkgKTsKKworICAgICAgICAgICAgc3RhdHVzID0gcHRocmVhZF9jb25kX3dhaXQoICZ0aC0+dGgudGhfc3VzcGVuZF9jdi5jX2NvbmQsICZ0aC0+dGgudGhfc3VzcGVuZF9teC5tX211dGV4ICk7CisjZW5kaWYKKworICAgICAgICAgICAgaWYgKCAoc3RhdHVzICE9IDApICYmIChzdGF0dXMgIT0gRUlOVFIpICYmIChzdGF0dXMgIT0gRVRJTUVET1VUKSApIHsKKyAgICAgICAgICAgICAgICBLTVBfU1lTRkFJTCggInB0aHJlYWRfY29uZF93YWl0Iiwgc3RhdHVzICk7CisgICAgICAgICAgICB9CisjaWZkZWYgS01QX0RFQlVHCisgICAgICAgICAgICBpZiAoc3RhdHVzID09IEVUSU1FRE9VVCkgeworICAgICAgICAgICAgICAgIGlmICggZmxhZy0+aXNfc2xlZXBpbmcoKSApIHsKKyAgICAgICAgICAgICAgICAgICAgS0ZfVFJBQ0UoIDEwMCwgKCAiX19rbXBfc3VzcGVuZF90ZW1wbGF0ZTogVCMlZCB0aW1lb3V0IHdha2V1cFxuIiwgdGhfZ3RpZCApICk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgS0ZfVFJBQ0UoIDIsICggIl9fa21wX3N1c3BlbmRfdGVtcGxhdGU6IFQjJWQgdGltZW91dCB3YWtldXAsIHNsZWVwIGJpdCBub3Qgc2V0IVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhfZ3RpZCApICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmICggZmxhZy0+aXNfc2xlZXBpbmcoKSApIHsKKyAgICAgICAgICAgICAgICBLRl9UUkFDRSggMTAwLCAoICJfX2ttcF9zdXNwZW5kX3RlbXBsYXRlOiBUIyVkIHNwdXJpb3VzIHdha2V1cFxuIiwgdGhfZ3RpZCApICk7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgfSAvLyB3aGlsZQorCisgICAgICAgIC8vIE1hcmsgdGhlIHRocmVhZCBhcyBhY3RpdmUgYWdhaW4gKGlmIGl0IHdhcyBwcmV2aW91cyBtYXJrZWQgYXMgaW5hY3RpdmUpCisgICAgICAgIGlmICggZGVhY3RpdmF0ZWQgKSB7CisgICAgICAgICAgICB0aC0+dGgudGhfYWN0aXZlID0gVFJVRTsKKyAgICAgICAgICAgIGlmICggVENSXzQodGgtPnRoLnRoX2luX3Bvb2wpICkgeworICAgICAgICAgICAgICAgIEtNUF9URVNUX1RIRU5fSU5DMzIoIChrbXBfaW50MzIgKikgJl9fa21wX3RocmVhZF9wb29sX2FjdGl2ZV9udGggKTsKKyAgICAgICAgICAgICAgICB0aC0+dGgudGhfYWN0aXZlX2luX3Bvb2wgPSBUUlVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisjaWZkZWYgREVCVUdfU1VTUEVORAorICAgIHsKKyAgICAgICAgY2hhciBidWZmZXJbMTI4XTsKKyAgICAgICAgX19rbXBfcHJpbnRfY29uZCggYnVmZmVyLCAmdGgtPnRoLnRoX3N1c3BlbmRfY3YpOworICAgICAgICBfX2ttcF9wcmludGYoICJfX2ttcF9zdXNwZW5kX3RlbXBsYXRlOiBUIyVkIGhhcyBhd2FrZW5lZDogJXNcbiIsIHRoX2d0aWQsIGJ1ZmZlciApOworICAgIH0KKyNlbmRpZgorCisKKyAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4X3VubG9jayggJnRoLT50aC50aF9zdXNwZW5kX214Lm1fbXV0ZXggKTsKKyAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfbXV0ZXhfdW5sb2NrIiwgc3RhdHVzICk7CisKKyAgICBLRl9UUkFDRSggMzAsICgiX19rbXBfc3VzcGVuZF90ZW1wbGF0ZTogVCMlZCBleGl0XG4iLCB0aF9ndGlkICkgKTsKK30KKwordm9pZCBfX2ttcF9zdXNwZW5kXzMyKGludCB0aF9ndGlkLCBrbXBfZmxhZ18zMiAqZmxhZykgeworICAgIF9fa21wX3N1c3BlbmRfdGVtcGxhdGUodGhfZ3RpZCwgZmxhZyk7Cit9Cit2b2lkIF9fa21wX3N1c3BlbmRfNjQoaW50IHRoX2d0aWQsIGttcF9mbGFnXzY0ICpmbGFnKSB7CisgICAgX19rbXBfc3VzcGVuZF90ZW1wbGF0ZSh0aF9ndGlkLCBmbGFnKTsKK30KK3ZvaWQgX19rbXBfc3VzcGVuZF9vbmNvcmUoaW50IHRoX2d0aWQsIGttcF9mbGFnX29uY29yZSAqZmxhZykgeworICAgIF9fa21wX3N1c3BlbmRfdGVtcGxhdGUodGhfZ3RpZCwgZmxhZyk7Cit9CisKKworLyogVGhpcyByb3V0aW5lIHNpZ25hbHMgdGhlIHRocmVhZCBzcGVjaWZpZWQgYnkgdGFyZ2V0X2d0aWQgdG8gd2FrZSB1cAorICogYWZ0ZXIgc2V0dGluZyB0aGUgc2xlZXAgYml0IGluZGljYXRlZCBieSB0aGUgZmxhZyBhcmd1bWVudCB0byBGQUxTRS4KKyAqIFRoZSB0YXJnZXQgdGhyZWFkIG11c3QgYWxyZWFkeSBoYXZlIGNhbGxlZCBfX2ttcF9zdXNwZW5kX3RlbXBsYXRlKCkKKyAqLwordGVtcGxhdGUgPGNsYXNzIEM+CitzdGF0aWMgaW5saW5lIHZvaWQgX19rbXBfcmVzdW1lX3RlbXBsYXRlKCBpbnQgdGFyZ2V0X2d0aWQsIEMgKmZsYWcgKQoreworICAgIGttcF9pbmZvX3QgKnRoID0gX19rbXBfdGhyZWFkc1t0YXJnZXRfZ3RpZF07CisgICAgaW50IHN0YXR1czsKKworI2lmZGVmIEtNUF9ERUJVRworICAgIGludCBndGlkID0gVENSXzQoX19rbXBfaW5pdF9ndGlkKSA/IF9fa21wX2dldF9ndGlkKCkgOiAtMTsKKyNlbmRpZgorCisgICAgS0ZfVFJBQ0UoIDMwLCAoICJfX2ttcF9yZXN1bWVfdGVtcGxhdGU6IFQjJWQgd2FudHMgdG8gd2FrZXVwIFQjJWQgZW50ZXJcbiIsIGd0aWQsIHRhcmdldF9ndGlkICkgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBndGlkICE9IHRhcmdldF9ndGlkICk7CisKKyAgICBfX2ttcF9zdXNwZW5kX2luaXRpYWxpemVfdGhyZWFkKCB0aCApOworCisgICAgc3RhdHVzID0gcHRocmVhZF9tdXRleF9sb2NrKCAmdGgtPnRoLnRoX3N1c3BlbmRfbXgubV9tdXRleCApOworICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9tdXRleF9sb2NrIiwgc3RhdHVzICk7CisKKyAgICBpZiAoIWZsYWcpIHsKKyAgICAgICAgZmxhZyA9IChDICopdGgtPnRoLnRoX3NsZWVwX2xvYzsKKyAgICB9CisKKyAgICBpZiAoIWZsYWcpIHsKKyAgICAgICAgS0ZfVFJBQ0UoIDUsICggIl9fa21wX3Jlc3VtZV90ZW1wbGF0ZTogVCMlZCBleGl0aW5nLCB0aHJlYWQgVCMlZCBhbHJlYWR5IGF3YWtlOiBmbGFnKCVwKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGFyZ2V0X2d0aWQsIE5VTEwgKSApOworICAgICAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4X3VubG9jayggJnRoLT50aC50aF9zdXNwZW5kX214Lm1fbXV0ZXggKTsKKyAgICAgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX211dGV4X3VubG9jayIsIHN0YXR1cyApOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGVsc2UgeworICAgICAgICB0eXBlbmFtZSBDOjpmbGFnX3Qgb2xkX3NwaW4gPSBmbGFnLT51bnNldF9zbGVlcGluZygpOworICAgICAgICBpZiAoICEgZmxhZy0+aXNfc2xlZXBpbmdfdmFsKG9sZF9zcGluKSApIHsKKyAgICAgICAgICAgIEtGX1RSQUNFKCA1LCAoICJfX2ttcF9yZXN1bWVfdGVtcGxhdGU6IFQjJWQgZXhpdGluZywgdGhyZWFkIFQjJWQgYWxyZWFkeSBhd2FrZTogZmxhZyglcCk6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIldSA9PiAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRhcmdldF9ndGlkLCBmbGFnLT5nZXQoKSwgb2xkX3NwaW4sICpmbGFnLT5nZXQoKSApICk7CisKKyAgICAgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCAmdGgtPnRoLnRoX3N1c3BlbmRfbXgubV9tdXRleCApOworICAgICAgICAgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX211dGV4X3VubG9jayIsIHN0YXR1cyApOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIEtGX1RSQUNFKCA1LCAoICJfX2ttcF9yZXN1bWVfdGVtcGxhdGU6IFQjJWQgYWJvdXQgdG8gd2FrZXVwIFQjJWQsIHJlc2V0IHNsZWVwIGJpdCBmb3IgZmxhZydzIGxvYyglcCk6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgIiV1ID0+ICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0YXJnZXRfZ3RpZCwgZmxhZy0+Z2V0KCksIG9sZF9zcGluLCAqZmxhZy0+Z2V0KCkgKSApOworICAgIH0KKyAgICBUQ1dfUFRSKHRoLT50aC50aF9zbGVlcF9sb2MsIE5VTEwpOworCisKKyNpZmRlZiBERUJVR19TVVNQRU5ECisgICAgeworICAgICAgICBjaGFyIGJ1ZmZlclsxMjhdOworICAgICAgICBfX2ttcF9wcmludF9jb25kKCBidWZmZXIsICZ0aC0+dGgudGhfc3VzcGVuZF9jdiApOworICAgICAgICBfX2ttcF9wcmludGYoICJfX2ttcF9yZXN1bWVfdGVtcGxhdGU6IFQjJWQgcmVzdW1pbmcgVCMlZDogJXNcbiIsIGd0aWQsIHRhcmdldF9ndGlkLCBidWZmZXIgKTsKKyAgICB9CisjZW5kaWYKKworCisgICAgc3RhdHVzID0gcHRocmVhZF9jb25kX3NpZ25hbCggJnRoLT50aC50aF9zdXNwZW5kX2N2LmNfY29uZCApOworICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9jb25kX3NpZ25hbCIsIHN0YXR1cyApOworICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCAmdGgtPnRoLnRoX3N1c3BlbmRfbXgubV9tdXRleCApOworICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9tdXRleF91bmxvY2siLCBzdGF0dXMgKTsKKyAgICBLRl9UUkFDRSggMzAsICggIl9fa21wX3Jlc3VtZV90ZW1wbGF0ZTogVCMlZCBleGl0aW5nIGFmdGVyIHNpZ25hbGluZyB3YWtlIHVwIGZvciBUIyVkXG4iLAorICAgICAgICAgICAgICAgICAgICBndGlkLCB0YXJnZXRfZ3RpZCApICk7Cit9CisKK3ZvaWQgX19rbXBfcmVzdW1lXzMyKGludCB0YXJnZXRfZ3RpZCwga21wX2ZsYWdfMzIgKmZsYWcpIHsKKyAgICBfX2ttcF9yZXN1bWVfdGVtcGxhdGUodGFyZ2V0X2d0aWQsIGZsYWcpOworfQordm9pZCBfX2ttcF9yZXN1bWVfNjQoaW50IHRhcmdldF9ndGlkLCBrbXBfZmxhZ182NCAqZmxhZykgeworICAgIF9fa21wX3Jlc3VtZV90ZW1wbGF0ZSh0YXJnZXRfZ3RpZCwgZmxhZyk7Cit9Cit2b2lkIF9fa21wX3Jlc3VtZV9vbmNvcmUoaW50IHRhcmdldF9ndGlkLCBrbXBfZmxhZ19vbmNvcmUgKmZsYWcpIHsKKyAgICBfX2ttcF9yZXN1bWVfdGVtcGxhdGUodGFyZ2V0X2d0aWQsIGZsYWcpOworfQorCit2b2lkCitfX2ttcF9yZXN1bWVfbW9uaXRvcigpCit7CisgICAgS01QX1RJTUVfQkxPQ0soVVNFUl9yZXN1bWUpOworICAgIGludCBzdGF0dXM7CisjaWZkZWYgS01QX0RFQlVHCisgICAgaW50IGd0aWQgPSBUQ1JfNChfX2ttcF9pbml0X2d0aWQpID8gX19rbXBfZ2V0X2d0aWQoKSA6IC0xOworICAgIEtGX1RSQUNFKCAzMCwgKCAiX19rbXBfcmVzdW1lX21vbml0b3I6IFQjJWQgd2FudHMgdG8gd2FrZXVwIFQjJWQgZW50ZXJcbiIsCisgICAgICAgICAgICAgICAgICAgIGd0aWQsIEtNUF9HVElEX01PTklUT1IgKSApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIGd0aWQgIT0gS01QX0dUSURfTU9OSVRPUiApOworI2VuZGlmCisgICAgc3RhdHVzID0gcHRocmVhZF9tdXRleF9sb2NrKCAmX19rbXBfd2FpdF9teC5tX211dGV4ICk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX211dGV4X2xvY2siLCBzdGF0dXMgKTsKKyNpZmRlZiBERUJVR19TVVNQRU5ECisgICAgeworICAgICAgICBjaGFyIGJ1ZmZlclsxMjhdOworICAgICAgICBfX2ttcF9wcmludF9jb25kKCBidWZmZXIsICZfX2ttcF93YWl0X2N2LmNfY29uZCApOworICAgICAgICBfX2ttcF9wcmludGYoICJfX2ttcF9yZXN1bWVfbW9uaXRvcjogVCMlZCByZXN1bWluZyBUIyVkOiAlc1xuIiwgZ3RpZCwgS01QX0dUSURfTU9OSVRPUiwgYnVmZmVyICk7CisgICAgfQorI2VuZGlmCisgICAgc3RhdHVzID0gcHRocmVhZF9jb25kX3NpZ25hbCggJl9fa21wX3dhaXRfY3YuY19jb25kICk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX2NvbmRfc2lnbmFsIiwgc3RhdHVzICk7CisgICAgc3RhdHVzID0gcHRocmVhZF9tdXRleF91bmxvY2soICZfX2ttcF93YWl0X214Lm1fbXV0ZXggKTsKKyAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfbXV0ZXhfdW5sb2NrIiwgc3RhdHVzICk7CisgICAgS0ZfVFJBQ0UoIDMwLCAoICJfX2ttcF9yZXN1bWVfbW9uaXRvcjogVCMlZCBleGl0aW5nIGFmdGVyIHNpZ25hbGluZyB3YWtlIHVwIGZvciBUIyVkXG4iLAorICAgICAgICAgICAgICAgICAgICBndGlkLCBLTVBfR1RJRF9NT05JVE9SICkgKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZAorX19rbXBfeWllbGQoIGludCBjb25kICkKK3sKKyAgICBpZiAoY29uZCAmJiBfX2ttcF95aWVsZGluZ19vbikgeworICAgICAgICBzY2hlZF95aWVsZCgpOworICAgIH0KK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZAorX19rbXBfZ3RpZF9zZXRfc3BlY2lmaWMoIGludCBndGlkICkKK3sKKyAgICBpbnQgc3RhdHVzOworICAgIEtNUF9BU1NFUlQoIF9fa21wX2luaXRfcnVudGltZSApOworICAgIHN0YXR1cyA9IHB0aHJlYWRfc2V0c3BlY2lmaWMoIF9fa21wX2d0aWRfdGhyZWFkcHJpdmF0ZV9rZXksICh2b2lkKikoaW50cHRyX3QpKGd0aWQrMSkgKTsKKyAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfc2V0c3BlY2lmaWMiLCBzdGF0dXMgKTsKK30KKworaW50CitfX2ttcF9ndGlkX2dldF9zcGVjaWZpYygpCit7CisgICAgaW50IGd0aWQ7CisgICAgaWYgKCAhX19rbXBfaW5pdF9ydW50aW1lICkgeworICAgICAgICBLQV9UUkFDRSggNTAsICgiX19rbXBfZ2V0X3NwZWNpZmljOiBydW50aW1lIHNodXRkb3duLCByZXR1cm5pbmcgS01QX0dUSURfU0hVVERPV05cbiIgKSApOworICAgICAgICByZXR1cm4gS01QX0dUSURfU0hVVERPV047CisgICAgfQorICAgIGd0aWQgPSAoaW50KShzaXplX3QpcHRocmVhZF9nZXRzcGVjaWZpYyggX19rbXBfZ3RpZF90aHJlYWRwcml2YXRlX2tleSApOworICAgIGlmICggZ3RpZCA9PSAwICkgeworICAgICAgICBndGlkID0gS01QX0dUSURfRE5FOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgZ3RpZC0tOworICAgIH0KKyAgICBLQV9UUkFDRSggNTAsICgiX19rbXBfZ3RpZF9nZXRfc3BlY2lmaWM6IGtleTolZCBndGlkOiVkXG4iLAorICAgICAgICAgICAgICAgX19rbXBfZ3RpZF90aHJlYWRwcml2YXRlX2tleSwgZ3RpZCApKTsKKyAgICByZXR1cm4gZ3RpZDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworZG91YmxlCitfX2ttcF9yZWFkX2NwdV90aW1lKCB2b2lkICkKK3sKKyAgICAvKmNsb2NrX3QgICB0OyovCisgICAgc3RydWN0IHRtcyAgYnVmZmVyOworCisgICAgLyp0ID0qLyAgdGltZXMoICYgYnVmZmVyICk7CisKKyAgICByZXR1cm4gKGJ1ZmZlci50bXNfdXRpbWUgKyBidWZmZXIudG1zX2N1dGltZSkgLyAoZG91YmxlKSBDTE9DS1NfUEVSX1NFQzsKK30KKworaW50CitfX2ttcF9yZWFkX3N5c3RlbV9pbmZvKCBzdHJ1Y3Qga21wX3N5c19pbmZvICppbmZvICkKK3sKKyAgICBpbnQgc3RhdHVzOworICAgIHN0cnVjdCBydXNhZ2Ugcl91c2FnZTsKKworICAgIG1lbXNldCggaW5mbywgMCwgc2l6ZW9mKCAqaW5mbyApICk7CisKKyAgICBzdGF0dXMgPSBnZXRydXNhZ2UoIFJVU0FHRV9TRUxGLCAmcl91c2FnZSk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUxfRVJSTk8oICJnZXRydXNhZ2UiLCBzdGF0dXMgKTsKKworICAgIGluZm8tPm1heHJzcyAgPSByX3VzYWdlLnJ1X21heHJzczsgIC8qIHRoZSBtYXhpbXVtIHJlc2lkZW50IHNldCBzaXplIHV0aWxpemVkIChpbiBraWxvYnl0ZXMpICAgICAqLworICAgIGluZm8tPm1pbmZsdCAgPSByX3VzYWdlLnJ1X21pbmZsdDsgIC8qIHRoZSBudW1iZXIgb2YgcGFnZSBmYXVsdHMgc2VydmljZWQgd2l0aG91dCBhbnkgSS9PICAgICAgICAqLworICAgIGluZm8tPm1hamZsdCAgPSByX3VzYWdlLnJ1X21hamZsdDsgIC8qIHRoZSBudW1iZXIgb2YgcGFnZSBmYXVsdHMgc2VydmljZWQgdGhhdCByZXF1aXJlZCBJL08gICAgICAqLworICAgIGluZm8tPm5zd2FwICAgPSByX3VzYWdlLnJ1X25zd2FwOyAgIC8qIHRoZSBudW1iZXIgb2YgdGltZXMgYSBwcm9jZXNzIHdhcyAic3dhcHBlZCIgb3V0IG9mIG1lbW9yeSAqLworICAgIGluZm8tPmluYmxvY2sgPSByX3VzYWdlLnJ1X2luYmxvY2s7IC8qIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGZpbGUgc3lzdGVtIGhhZCB0byBwZXJmb3JtIGlucHV0ICAqLworICAgIGluZm8tPm91YmxvY2sgPSByX3VzYWdlLnJ1X291YmxvY2s7IC8qIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGZpbGUgc3lzdGVtIGhhZCB0byBwZXJmb3JtIG91dHB1dCAqLworICAgIGluZm8tPm52Y3N3ICAgPSByX3VzYWdlLnJ1X252Y3N3OyAgIC8qIHRoZSBudW1iZXIgb2YgdGltZXMgYSBjb250ZXh0IHN3aXRjaCB3YXMgdm9sdW50YXJpbHkgICAgICAqLworICAgIGluZm8tPm5pdmNzdyAgPSByX3VzYWdlLnJ1X25pdmNzdzsgIC8qIHRoZSBudW1iZXIgb2YgdGltZXMgYSBjb250ZXh0IHN3aXRjaCB3YXMgZm9yY2VkICAgICAgICAgICAqLworCisgICAgcmV0dXJuIChzdGF0dXMgIT0gMCk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwordm9pZAorX19rbXBfcmVhZF9zeXN0ZW1fdGltZSggZG91YmxlICpkZWx0YSApCit7CisgICAgZG91YmxlICAgICAgICAgICAgICB0X25zOworICAgIHN0cnVjdCB0aW1ldmFsICAgICAgdHZhbDsKKyAgICBzdHJ1Y3QgdGltZXNwZWMgICAgIHN0b3A7CisgICAgaW50IHN0YXR1czsKKworICAgIHN0YXR1cyA9IGdldHRpbWVvZmRheSggJnR2YWwsIE5VTEwgKTsKKyAgICBLTVBfQ0hFQ0tfU1lTRkFJTF9FUlJOTyggImdldHRpbWVvZmRheSIsIHN0YXR1cyApOworICAgIFRJTUVWQUxfVE9fVElNRVNQRUMoICZ0dmFsLCAmc3RvcCApOworICAgIHRfbnMgPSBUUzJOUyhzdG9wKSAtIFRTMk5TKF9fa21wX3N5c190aW1lcl9kYXRhLnN0YXJ0KTsKKyAgICAqZGVsdGEgPSAodF9ucyAqIDFlLTkpOworfQorCit2b2lkCitfX2ttcF9jbGVhcl9zeXN0ZW1fdGltZSggdm9pZCApCit7CisgICAgc3RydWN0IHRpbWV2YWwgdHZhbDsKKyAgICBpbnQgc3RhdHVzOworICAgIHN0YXR1cyA9IGdldHRpbWVvZmRheSggJnR2YWwsIE5VTEwgKTsKKyAgICBLTVBfQ0hFQ0tfU1lTRkFJTF9FUlJOTyggImdldHRpbWVvZmRheSIsIHN0YXR1cyApOworICAgIFRJTUVWQUxfVE9fVElNRVNQRUMoICZ0dmFsLCAmX19rbXBfc3lzX3RpbWVyX2RhdGEuc3RhcnQgKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmZGVmIEJVSUxEX1RWCisKK3ZvaWQKK19fa21wX3R2X3RocmVhZHByaXZhdGVfc3RvcmUoIGttcF9pbmZvX3QgKnRoLCB2b2lkICpnbG9iYWxfYWRkciwgdm9pZCAqdGhyZWFkX2FkZHIgKQoreworICAgIHN0cnVjdCB0dl9kYXRhICpwOworCisgICAgcCA9IChzdHJ1Y3QgdHZfZGF0YSAqKSBfX2ttcF9hbGxvY2F0ZSggc2l6ZW9mKCAqcCApICk7CisKKyAgICBwLT51LnRwLmdsb2JhbF9hZGRyID0gZ2xvYmFsX2FkZHI7CisgICAgcC0+dS50cC50aHJlYWRfYWRkciA9IHRocmVhZF9hZGRyOworCisgICAgcC0+dHlwZSA9ICh2b2lkICopIDE7CisKKyAgICBwLT5uZXh0ID0gIHRoLT50aC50aF9sb2NhbC50dl9kYXRhOworICAgIHRoLT50aC50aF9sb2NhbC50dl9kYXRhID0gcDsKKworICAgIGlmICggcC0+bmV4dCA9PSAwICkgeworICAgICAgICBpbnQgcmMgPSBwdGhyZWFkX3NldHNwZWNpZmljKCBfX2ttcF90dl9rZXksIHAgKTsKKyAgICAgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX3NldHNwZWNpZmljIiwgcmMgKTsKKyAgICB9Cit9CisKKyNlbmRpZiAvKiBCVUlMRF9UViAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50CitfX2ttcF9nZXRfeHByb2MoIHZvaWQgKSB7CisKKyAgICBpbnQgciA9IDA7CisKKyAgICAjaWYgS01QX09TX0xJTlVYCisKKyAgICAgICAgciA9IHN5c2NvbmYoIF9TQ19OUFJPQ0VTU09SU19PTkxOICk7CisKKyAgICAjZWxpZiBLTVBfT1NfREFSV0lOCisKKyAgICAgICAgLy8gQnVnIEM3NzAxMSBIaWdoICJPcGVuTVAgVGhyZWFkcyBhbmQgbnVtYmVyIG9mIGFjdGl2ZSBjb3JlcyIuCisKKyAgICAgICAgLy8gRmluZCB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBDUFVzLgorICAgICAgICBrZXJuX3JldHVybl90ICAgICAgICAgIHJjOworICAgICAgICBob3N0X2Jhc2ljX2luZm9fZGF0YV90IGluZm87CisgICAgICAgIG1hY2hfbXNnX3R5cGVfbnVtYmVyX3QgbnVtID0gSE9TVF9CQVNJQ19JTkZPX0NPVU5UOworICAgICAgICByYyA9IGhvc3RfaW5mbyggbWFjaF9ob3N0X3NlbGYoKSwgSE9TVF9CQVNJQ19JTkZPLCAoaG9zdF9pbmZvX3QpICYgaW5mbywgJiBudW0gKTsKKyAgICAgICAgaWYgKCByYyA9PSAwICYmIG51bSA9PSBIT1NUX0JBU0lDX0lORk9fQ09VTlQgKSB7CisgICAgICAgICAgICAvLyBDYW5ub3QgdXNlIEtBX1RSQUNFKCkgaGVyZSBiZWNhdXNlIHRoaXMgY29kZSB3b3JrcyBiZWZvcmUgdHJhY2Ugc3VwcG9ydCBpcworICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZWQuCisgICAgICAgICAgICByID0gaW5mby5hdmFpbF9jcHVzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoIENhbnRHZXROdW1BdmFpbENQVSApOworICAgICAgICAgICAgS01QX0lORk9STSggQXNzdW1lZE51bUNQVSApOworICAgICAgICB9OyAvLyBpZgorCisgICAgI2VsaWYgS01QX09TX0ZSRUVCU0QKKworICAgICAgICBpbnQgbWliW10gPSB7IENUTF9IVywgSFdfTkNQVSB9OworICAgICAgICBzaXplX3QgbGVuID0gc2l6ZW9mKCByICk7CisgICAgICAgIGlmICggc3lzY3RsKCBtaWIsIDIsICZyLCAmbGVuLCBOVUxMLCAwICkgPCAwICkgeworICAgICAgICAgICAgIHIgPSAwOworICAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBDYW50R2V0TnVtQXZhaWxDUFUgKTsKKyAgICAgICAgICAgICBLTVBfSU5GT1JNKCBBc3N1bWVkTnVtQ1BVICk7CisgICAgICAgIH0KKworICAgICNlbHNlCisKKyAgICAgICAgI2Vycm9yICJVbmtub3duIG9yIHVuc3VwcG9ydGVkIE9TLiIKKworICAgICNlbmRpZgorCisgICAgcmV0dXJuIHIgPiAwID8gciA6IDI7IC8qIGd1ZXNzIHZhbHVlIG9mIDIgaWYgT1MgdG9sZCB1cyAwICovCisKK30gLy8gX19rbXBfZ2V0X3hwcm9jCisKK2ludAorX19rbXBfcmVhZF9mcm9tX2ZpbGUoIGNoYXIgY29uc3QgKnBhdGgsIGNoYXIgY29uc3QgKmZvcm1hdCwgLi4uICkKK3sKKyAgICBpbnQgcmVzdWx0OworICAgIHZhX2xpc3QgYXJnczsKKworICAgIHZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7CisgICAgRklMRSAqZiA9IGZvcGVuKHBhdGgsICJyYiIpOworICAgIGlmICggZiA9PSBOVUxMICkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmVzdWx0ID0gdmZzY2FuZihmLCBmb3JtYXQsIGFyZ3MpOworICAgIGZjbG9zZShmKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQKK19fa21wX3J1bnRpbWVfaW5pdGlhbGl6ZSggdm9pZCApCit7CisgICAgaW50IHN0YXR1czsKKyAgICBwdGhyZWFkX211dGV4YXR0cl90IG11dGV4X2F0dHI7CisgICAgcHRocmVhZF9jb25kYXR0cl90ICBjb25kX2F0dHI7CisKKyAgICBpZiAoIF9fa21wX2luaXRfcnVudGltZSApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH07IC8vIGlmCisKKyAgICAjaWYgKCBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICkKKyAgICAgICAgaWYgKCAhIF9fa21wX2NwdWluZm8uaW5pdGlhbGl6ZWQgKSB7CisgICAgICAgICAgICBfX2ttcF9xdWVyeV9jcHVpZCggJl9fa21wX2NwdWluZm8gKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAjZW5kaWYgLyogS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCAqLworCisgICAgX19rbXBfeHByb2MgPSBfX2ttcF9nZXRfeHByb2MoKTsKKworICAgIGlmICggc3lzY29uZiggX1NDX1RIUkVBRFMgKSApIHsKKworICAgICAgICAvKiBRdWVyeSB0aGUgbWF4aW11bSBudW1iZXIgb2YgdGhyZWFkcyAqLworICAgICAgICBfX2ttcF9zeXNfbWF4X250aCA9IHN5c2NvbmYoIF9TQ19USFJFQURfVEhSRUFEU19NQVggKTsKKyAgICAgICAgaWYgKCBfX2ttcF9zeXNfbWF4X250aCA9PSAtMSApIHsKKyAgICAgICAgICAgIC8qIFVubGltaXRlZCB0aHJlYWRzIGZvciBOUFRMICovCisgICAgICAgICAgICBfX2ttcF9zeXNfbWF4X250aCA9IElOVF9NQVg7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIF9fa21wX3N5c19tYXhfbnRoIDw9IDEgKSB7CisgICAgICAgICAgICAvKiBDYW4ndCB0ZWxsLCBqdXN0IHVzZSBQVEhSRUFEX1RIUkVBRFNfTUFYICovCisgICAgICAgICAgICBfX2ttcF9zeXNfbWF4X250aCA9IEtNUF9NQVhfTlRIOworICAgICAgICB9CisKKyAgICAgICAgLyogUXVlcnkgdGhlIG1pbmltdW0gc3RhY2sgc2l6ZSAqLworICAgICAgICBfX2ttcF9zeXNfbWluX3N0a3NpemUgPSBzeXNjb25mKCBfU0NfVEhSRUFEX1NUQUNLX01JTiApOworICAgICAgICBpZiAoIF9fa21wX3N5c19taW5fc3Rrc2l6ZSA8PSAxICkgeworICAgICAgICAgICAgX19rbXBfc3lzX21pbl9zdGtzaXplID0gS01QX01JTl9TVEtTSVpFOworICAgICAgICB9CisgICAgfQorCisgICAgLyogU2V0IHVwIG1pbmltdW0gbnVtYmVyIG9mIHRocmVhZHMgdG8gc3dpdGNoIHRvIFRMUyBndGlkICovCisgICAgX19rbXBfdGxzX2d0aWRfbWluID0gS01QX1RMU19HVElEX01JTjsKKworCisgICAgI2lmZGVmIEJVSUxEX1RWCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCByYyA9IHB0aHJlYWRfa2V5X2NyZWF0ZSggJiBfX2ttcF90dl9rZXksIDAgKTsKKyAgICAgICAgICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9rZXlfY3JlYXRlIiwgcmMgKTsKKyAgICAgICAgfQorICAgICNlbmRpZgorCisgICAgc3RhdHVzID0gcHRocmVhZF9rZXlfY3JlYXRlKCAmX19rbXBfZ3RpZF90aHJlYWRwcml2YXRlX2tleSwgX19rbXBfaW50ZXJuYWxfZW5kX2Rlc3QgKTsKKyAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfa2V5X2NyZWF0ZSIsIHN0YXR1cyApOworICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhhdHRyX2luaXQoICYgbXV0ZXhfYXR0ciApOworICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9tdXRleGF0dHJfaW5pdCIsIHN0YXR1cyApOworICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfaW5pdCggJiBfX2ttcF93YWl0X214Lm1fbXV0ZXgsICYgbXV0ZXhfYXR0ciApOworICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9tdXRleF9pbml0Iiwgc3RhdHVzICk7CisgICAgc3RhdHVzID0gcHRocmVhZF9jb25kYXR0cl9pbml0KCAmIGNvbmRfYXR0ciApOworICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9jb25kYXR0cl9pbml0Iiwgc3RhdHVzICk7CisgICAgc3RhdHVzID0gcHRocmVhZF9jb25kX2luaXQoICYgX19rbXBfd2FpdF9jdi5jX2NvbmQsICYgY29uZF9hdHRyICk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX2NvbmRfaW5pdCIsIHN0YXR1cyApOworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfaW5pdGlhbGl6ZSgpOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgIF9fa21wX2luaXRfcnVudGltZSA9IFRSVUU7Cit9CisKK3ZvaWQKK19fa21wX3J1bnRpbWVfZGVzdHJveSggdm9pZCApCit7CisgICAgaW50IHN0YXR1czsKKworICAgIGlmICggISBfX2ttcF9pbml0X3J1bnRpbWUgKSB7CisgICAgICAgIHJldHVybjsgLy8gTm90aGluZyB0byBkby4KKyAgICB9OworCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9kZXN0cm95KCk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgICAgc3RhdHVzID0gcHRocmVhZF9rZXlfZGVsZXRlKCBfX2ttcF9ndGlkX3RocmVhZHByaXZhdGVfa2V5ICk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX2tleV9kZWxldGUiLCBzdGF0dXMgKTsKKyAgICAjaWZkZWYgQlVJTERfVFYKKyAgICAgICAgc3RhdHVzID0gcHRocmVhZF9rZXlfZGVsZXRlKCBfX2ttcF90dl9rZXkgKTsKKyAgICAgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX2tleV9kZWxldGUiLCBzdGF0dXMgKTsKKyAgICAjZW5kaWYKKworICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfZGVzdHJveSggJiBfX2ttcF93YWl0X214Lm1fbXV0ZXggKTsKKyAgICBpZiAoIHN0YXR1cyAhPSAwICYmIHN0YXR1cyAhPSBFQlVTWSApIHsKKyAgICAgICAgS01QX1NZU0ZBSUwoICJwdGhyZWFkX211dGV4X2Rlc3Ryb3kiLCBzdGF0dXMgKTsKKyAgICB9CisgICAgc3RhdHVzID0gcHRocmVhZF9jb25kX2Rlc3Ryb3koICYgX19rbXBfd2FpdF9jdi5jX2NvbmQgKTsKKyAgICBpZiAoIHN0YXR1cyAhPSAwICYmIHN0YXR1cyAhPSBFQlVTWSApIHsKKyAgICAgICAgS01QX1NZU0ZBSUwoICJwdGhyZWFkX2NvbmRfZGVzdHJveSIsIHN0YXR1cyApOworICAgIH0KKyAgICAjaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgICAgICBfX2ttcF9hZmZpbml0eV91bmluaXRpYWxpemUoKTsKKyAgICAjZW5kaWYKKworICAgIF9fa21wX2luaXRfcnVudGltZSA9IEZBTFNFOworfQorCisKKy8qIFB1dCB0aGUgdGhyZWFkIHRvIHNsZWVwIGZvciBhIHRpbWUgcGVyaW9kICovCisvKiBOT1RFOiBub3QgY3VycmVudGx5IHVzZWQgYW55d2hlcmUgKi8KK3ZvaWQKK19fa21wX3RocmVhZF9zbGVlcCggaW50IG1pbGxpcyApCit7CisgICAgc2xlZXAoICAoIG1pbGxpcyArIDUwMCApIC8gMTAwMCApOworfQorCisvKiBDYWxjdWxhdGUgdGhlIGVsYXBzZWQgd2FsbCBjbG9jayB0aW1lIGZvciB0aGUgdXNlciAqLwordm9pZAorX19rbXBfZWxhcHNlZCggZG91YmxlICp0ICkKK3sKKyAgICBpbnQgc3RhdHVzOworIyBpZmRlZiBGSVhfU0dJX0NMT0NLCisgICAgc3RydWN0IHRpbWVzcGVjIHRzOworCisgICAgc3RhdHVzID0gY2xvY2tfZ2V0dGltZSggQ0xPQ0tfUFJPQ0VTU19DUFVUSU1FX0lELCAmdHMgKTsKKyAgICBLTVBfQ0hFQ0tfU1lTRkFJTF9FUlJOTyggImNsb2NrX2dldHRpbWUiLCBzdGF0dXMgKTsKKyAgICAqdCA9IChkb3VibGUpIHRzLnR2X25zZWMgKiAoMS4wIC8gKGRvdWJsZSkgTlNFQ19QRVJfU0VDKSArCisgICAgICAgIChkb3VibGUpIHRzLnR2X3NlYzsKKyMgZWxzZQorICAgIHN0cnVjdCB0aW1ldmFsIHR2OworCisgICAgc3RhdHVzID0gZ2V0dGltZW9mZGF5KCAmIHR2LCBOVUxMICk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUxfRVJSTk8oICJnZXR0aW1lb2ZkYXkiLCBzdGF0dXMgKTsKKyAgICAqdCA9IChkb3VibGUpIHR2LnR2X3VzZWMgKiAoMS4wIC8gKGRvdWJsZSkgVVNFQ19QRVJfU0VDKSArCisgICAgICAgIChkb3VibGUpIHR2LnR2X3NlYzsKKyMgZW5kaWYKK30KKworLyogQ2FsY3VsYXRlIHRoZSBlbGFwc2VkIHdhbGwgY2xvY2sgdGljayBmb3IgdGhlIHVzZXIgKi8KK3ZvaWQKK19fa21wX2VsYXBzZWRfdGljayggZG91YmxlICp0ICkKK3sKKyAgICAqdCA9IDEgLyAoZG91YmxlKSBDTE9DS1NfUEVSX1NFQzsKK30KKworLyoKKyAgICBEZXRlcm1pbmUgd2hldGhlciB0aGUgZ2l2ZW4gYWRkcmVzcyBpcyBtYXBwZWQgaW50byB0aGUgY3VycmVudCBhZGRyZXNzIHNwYWNlLgorKi8KKworaW50CitfX2ttcF9pc19hZGRyZXNzX21hcHBlZCggdm9pZCAqIGFkZHIgKSB7CisKKyAgICBpbnQgZm91bmQgPSAwOworICAgIGludCByYzsKKworICAgICNpZiBLTVBfT1NfTElOVVgKKworICAgICAgICAvKgorICAgICAgICAgICAgT24gTGludXgqIE9TLCByZWFkIHRoZSAvcHJvYy88cGlkPi9tYXBzIHBzZXVkby1maWxlIHRvIGdldCBhbGwgdGhlIGFkZHJlc3MgcmFuZ2VzIG1hcHBlZAorICAgICAgICAgICAgaW50byB0aGUgYWRkcmVzcyBzcGFjZS4KKyAgICAgICAgKi8KKworICAgICAgICBjaGFyICogbmFtZSA9IF9fa21wX3N0cl9mb3JtYXQoICIvcHJvYy8lZC9tYXBzIiwgZ2V0cGlkKCkgKTsKKyAgICAgICAgRklMRSAqIGZpbGUgID0gTlVMTDsKKworICAgICAgICBmaWxlID0gZm9wZW4oIG5hbWUsICJyIiApOworICAgICAgICBLTVBfQVNTRVJUKCBmaWxlICE9IE5VTEwgKTsKKworICAgICAgICBmb3IgKCA7IDsgKSB7CisKKyAgICAgICAgICAgIHZvaWQgKiBiZWdpbm5pbmcgPSBOVUxMOworICAgICAgICAgICAgdm9pZCAqIGVuZGluZyAgICA9IE5VTEw7CisgICAgICAgICAgICBjaGFyICAgcGVybXNbIDUgXTsKKworICAgICAgICAgICAgcmMgPSBmc2NhbmYoIGZpbGUsICIlcC0lcCAlNHMgJSpbXlxuXVxuIiwgJiBiZWdpbm5pbmcsICYgZW5kaW5nLCBwZXJtcyApOworICAgICAgICAgICAgaWYgKCByYyA9PSBFT0YgKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgS01QX0FTU0VSVCggcmMgPT0gMyAmJiBzdHJsZW4oIHBlcm1zICkgPT0gNCApOyAvLyBNYWtlIHN1cmUgYWxsIGZpZWxkcyBhcmUgcmVhZC4KKworICAgICAgICAgICAgLy8gRW5kaW5nIGFkZHJlc3MgaXMgbm90IGluY2x1ZGVkIGluIHRoZSByZWdpb24sIGJ1dCBiZWdpbm5pbmcgaXMuCisgICAgICAgICAgICBpZiAoICggYWRkciA+PSBiZWdpbm5pbmcgKSAmJiAoIGFkZHIgPCBlbmRpbmcgKSApIHsKKyAgICAgICAgICAgICAgICBwZXJtc1sgMiBdID0gMDsgICAgLy8gM3RoIGFuZCA0dGggY2hhcmFjdGVyIGRvZXMgbm90IG1hdHRlci4KKyAgICAgICAgICAgICAgICBpZiAoIHN0cmNtcCggcGVybXMsICJydyIgKSA9PSAwICkgeworICAgICAgICAgICAgICAgICAgICAvLyBNZW1vcnkgd2UgYXJlIGxvb2tpbmcgZm9yIHNob3VsZCBiZSByZWFkYWJsZSBhbmQgd3JpdGFibGUuCisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gMTsKKyAgICAgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfTsgLy8gaWYKKworICAgICAgICB9OyAvLyBmb3JldmVyCisKKyAgICAgICAgLy8gRnJlZSByZXNvdXJjZXMuCisgICAgICAgIGZjbG9zZSggZmlsZSApOworICAgICAgICBLTVBfSU5URVJOQUxfRlJFRSggbmFtZSApOworCisgICAgI2VsaWYgS01QX09TX0RBUldJTgorCisgICAgICAgIC8qCisgICAgICAgICAgICBPbiBPUyBYKiwgL3Byb2MgcHNldWRvIGZpbGVzeXN0ZW0gaXMgbm90IGF2YWlsYWJsZS4gVHJ5IHRvIHJlYWQgbWVtb3J5IHVzaW5nIHZtCisgICAgICAgICAgICBpbnRlcmZhY2UuCisgICAgICAgICovCisKKyAgICAgICAgaW50ICAgICAgIGJ1ZmZlcjsKKyAgICAgICAgdm1fc2l6ZV90IGNvdW50OworICAgICAgICByYyA9CisgICAgICAgICAgICB2bV9yZWFkX292ZXJ3cml0ZSgKKyAgICAgICAgICAgICAgICBtYWNoX3Rhc2tfc2VsZigpLCAgICAgICAgICAgLy8gVGFzayB0byByZWFkIG1lbW9yeSBvZi4KKyAgICAgICAgICAgICAgICAodm1fYWRkcmVzc190KSggYWRkciApLCAgICAgLy8gQWRkcmVzcyB0byByZWFkIGZyb20uCisgICAgICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE51bWJlciBvZiBieXRlcyB0byBiZSByZWFkLgorICAgICAgICAgICAgICAgICh2bV9hZGRyZXNzX3QpKCAmIGJ1ZmZlciApLCAvLyBBZGRyZXNzIG9mIGJ1ZmZlciB0byBzYXZlIHJlYWQgYnl0ZXMgaW4uCisgICAgICAgICAgICAgICAgJiBjb3VudCAgICAgICAgICAgICAgICAgICAgIC8vIEFkZHJlc3Mgb2YgdmFyIHRvIHNhdmUgbnVtYmVyIG9mIHJlYWQgYnl0ZXMgaW4uCisgICAgICAgICAgICApOworICAgICAgICBpZiAoIHJjID09IDAgKSB7CisgICAgICAgICAgICAvLyBNZW1vcnkgc3VjY2Vzc2Z1bGx5IHJlYWQuCisgICAgICAgICAgICBmb3VuZCA9IDE7CisgICAgICAgIH07IC8vIGlmCisKKyAgICAjZWxpZiBLTVBfT1NfRlJFRUJTRAorCisgICAgICAgIC8vIEZJWE1FKEZyZWVCU0QqKTogSW1wbGVtZW50IHRoaXMKKyAgICAgICAgZm91bmQgPSAxOworCisgICAgI2Vsc2UKKworICAgICAgICAjZXJyb3IgIlVua25vd24gb3IgdW5zdXBwb3J0ZWQgT1MiCisKKyAgICAjZW5kaWYKKworICAgIHJldHVybiBmb3VuZDsKKworfSAvLyBfX2ttcF9pc19hZGRyZXNzX21hcHBlZAorCisjaWZkZWYgVVNFX0xPQURfQkFMQU5DRQorCisKKyMgaWYgS01QX09TX0RBUldJTgorCisvLyBUaGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgcm91bmRlZCB2YWx1ZSBvZiB0aGUgc3lzdGVtIGxvYWQgYXZlcmFnZQorLy8gZHVyaW5nIGdpdmVuIHRpbWUgaW50ZXJ2YWwgd2hpY2ggZGVwZW5kcyBvbiB0aGUgdmFsdWUgb2YKKy8vIF9fa21wX2xvYWRfYmFsYW5jZV9pbnRlcnZhbCB2YXJpYWJsZSAoZGVmYXVsdCBpcyA2MCBzZWMsIG90aGVyIHZhbHVlcworLy8gbWF5IGJlIDMwMCBzZWMgb3IgOTAwIHNlYykuCisvLyBJdCByZXR1cm5zIC0xIGluIGNhc2Ugb2YgZXJyb3IuCitpbnQKK19fa21wX2dldF9sb2FkX2JhbGFuY2UoIGludCBtYXggKQoreworICAgIGRvdWJsZSBhdmVyYWdlc1szXTsKKyAgICBpbnQgcmV0X2F2ZyA9IDA7CisKKyAgICBpbnQgcmVzID0gZ2V0bG9hZGF2ZyggYXZlcmFnZXMsIDMgKTsKKworICAgIC8vQ2hlY2sgX19rbXBfbG9hZF9iYWxhbmNlX2ludGVydmFsIHRvIGRldGVybWluZSB3aGljaCBvZiBhdmVyYWdlcyB0byB1c2UuCisgICAgLy8gZ2V0bG9hZGF2ZygpIG1heSByZXR1cm4gdGhlIG51bWJlciBvZiBzYW1wbGVzIGxlc3MgdGhhbiByZXF1ZXN0ZWQgdGhhdCBpcworICAgIC8vIGxlc3MgdGhhbiAzLgorICAgIGlmICggX19rbXBfbG9hZF9iYWxhbmNlX2ludGVydmFsIDwgMTgwICYmICggcmVzID49IDEgKSApIHsKKyAgICAgICAgcmV0X2F2ZyA9IGF2ZXJhZ2VzWzBdOy8vIDEgbWluCisgICAgfSBlbHNlIGlmICggKCBfX2ttcF9sb2FkX2JhbGFuY2VfaW50ZXJ2YWwgPj0gMTgwCisgICAgICAgICAgICAgICAgICAmJiBfX2ttcF9sb2FkX2JhbGFuY2VfaW50ZXJ2YWwgPCA2MDAgKSAmJiAoIHJlcyA+PSAyICkgKSB7CisgICAgICAgIHJldF9hdmcgPSBhdmVyYWdlc1sxXTsvLyA1IG1pbgorICAgIH0gZWxzZSBpZiAoICggX19rbXBfbG9hZF9iYWxhbmNlX2ludGVydmFsID49IDYwMCApICYmICggcmVzID09IDMgKSApIHsKKyAgICAgICAgcmV0X2F2ZyA9IGF2ZXJhZ2VzWzJdOy8vIDE1IG1pbgorICAgIH0gZWxzZSB7Ly8gRXJyb3Igb2NjdXJyZWQKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHJldHVybiByZXRfYXZnOworfQorCisjIGVsc2UgLy8gTGludXgqIE9TCisKKy8vIFRoZSBmdWN0aW9uIHJldHVybnMgbnVtYmVyIG9mIHJ1bm5pbmcgKG5vdCBzbGVlcGluZykgdGhyZWFkcywgb3IgLTEgaW4gY2FzZSBvZiBlcnJvci4KKy8vIEVycm9yIGNvdWxkIGJlIHJlcG9ydGVkIGlmIExpbnV4KiBPUyBrZXJuZWwgdG9vIG9sZCAod2l0aG91dCAiL3Byb2MiIHN1cHBvcnQpLgorLy8gQ291bnRpbmcgcnVubmluZyB0aHJlYWRzIHN0b3BzIGlmIG1heCBydW5uaW5nIHRocmVhZHMgZW5jb3VudGVyZWQuCitpbnQKK19fa21wX2dldF9sb2FkX2JhbGFuY2UoIGludCBtYXggKQoreworICAgIHN0YXRpYyBpbnQgcGVybWFuZW50X2Vycm9yID0gMDsKKworICAgIHN0YXRpYyBpbnQgICAgIGdsYl9ydW5uaW5nX3RocmVhZHMgICAgICAgICAgPSAwOyAgLyogU2F2ZWQgY291bnQgb2YgdGhlIHJ1bm5pbmcgdGhyZWFkcyBmb3IgdGhlIHRocmVhZCBiYWxhbmNlIGFsZ29ydGlobSAqLworICAgIHN0YXRpYyBkb3VibGUgIGdsYl9jYWxsX3RpbWUgPSAwOyAgLyogVGhyZWFkIGJhbGFuY2UgYWxnb3JpdGhtIGNhbGwgdGltZSAqLworCisgICAgaW50IHJ1bm5pbmdfdGhyZWFkcyA9IDA7ICAgICAgICAgICAgICAvLyBOdW1iZXIgb2YgcnVubmluZyB0aHJlYWRzIGluIHRoZSBzeXN0ZW0uCisKKyAgICBESVIgICogICAgICAgICAgcHJvY19kaXIgICA9IE5VTEw7ICAgIC8vIEhhbmRsZSBvZiAiL3Byb2MvIiBkaXJlY3RvcnkuCisgICAgc3RydWN0IGRpcmVudCAqIHByb2NfZW50cnkgPSBOVUxMOworCisgICAga21wX3N0cl9idWZfdCAgIHRhc2tfcGF0aDsgICAgICAgICAgICAvLyAiL3Byb2MvPHBpZD4vdGFzay88dGlkPi8iIHBhdGguCisgICAgRElSICAqICAgICAgICAgIHRhc2tfZGlyICAgPSBOVUxMOyAgICAvLyBIYW5kbGUgb2YgIi9wcm9jLzxwaWQ+L3Rhc2svPHRpZD4vIiBkaXJlY3RvcnkuCisgICAgc3RydWN0IGRpcmVudCAqIHRhc2tfZW50cnkgPSBOVUxMOworICAgIGludCAgICAgICAgICAgICB0YXNrX3BhdGhfZml4ZWRfbGVuOworCisgICAga21wX3N0cl9idWZfdCAgIHN0YXRfcGF0aDsgICAgICAgICAgICAvLyAiL3Byb2MvPHBpZD4vdGFzay88dGlkPi9zdGF0IiBwYXRoLgorICAgIGludCAgICAgICAgICAgICBzdGF0X2ZpbGUgPSAtMTsKKyAgICBpbnQgICAgICAgICAgICAgc3RhdF9wYXRoX2ZpeGVkX2xlbjsKKworICAgIGludCB0b3RhbF9wcm9jZXNzZXMgPSAwOyAgICAgICAgICAgICAgLy8gVG90YWwgbnVtYmVyIG9mIHByb2Nlc3NlcyBpbiBzeXN0ZW0uCisgICAgaW50IHRvdGFsX3RocmVhZHMgICA9IDA7ICAgICAgICAgICAgICAvLyBUb3RhbCBudW1iZXIgb2YgdGhyZWFkcyBpbiBzeXN0ZW0uCisKKyAgICBkb3VibGUgY2FsbF90aW1lID0gMC4wOworCisgICAgX19rbXBfc3RyX2J1Zl9pbml0KCAmIHRhc2tfcGF0aCApOworICAgIF9fa21wX3N0cl9idWZfaW5pdCggJiBzdGF0X3BhdGggKTsKKworICAgICBfX2ttcF9lbGFwc2VkKCAmIGNhbGxfdGltZSApOworCisgICAgaWYgKCBnbGJfY2FsbF90aW1lICYmCisgICAgICAgICAgICAoIGNhbGxfdGltZSAtIGdsYl9jYWxsX3RpbWUgPCBfX2ttcF9sb2FkX2JhbGFuY2VfaW50ZXJ2YWwgKSApIHsKKyAgICAgICAgcnVubmluZ190aHJlYWRzID0gZ2xiX3J1bm5pbmdfdGhyZWFkczsKKyAgICAgICAgZ290byBmaW5pc2g7CisgICAgfQorCisgICAgZ2xiX2NhbGxfdGltZSA9IGNhbGxfdGltZTsKKworICAgIC8vIERvIG5vdCBzcGVuZCB0aW1lIG9uIHNjYW5uaW5nICIvcHJvYy8iIGlmIHdlIGhhdmUgYSBwZXJtYW5lbnQgZXJyb3IuCisgICAgaWYgKCBwZXJtYW5lbnRfZXJyb3IgKSB7CisgICAgICAgIHJ1bm5pbmdfdGhyZWFkcyA9IC0xOworICAgICAgICBnb3RvIGZpbmlzaDsKKyAgICB9OyAvLyBpZgorCisgICAgaWYgKCBtYXggPD0gMCApIHsKKyAgICAgICAgbWF4ID0gSU5UX01BWDsKKyAgICB9OyAvLyBpZgorCisgICAgLy8gT3BlbiAiL3Byb2MvIiBkaXJlY3RvcnkuCisgICAgcHJvY19kaXIgPSBvcGVuZGlyKCAiL3Byb2MiICk7CisgICAgaWYgKCBwcm9jX2RpciA9PSBOVUxMICkgeworICAgICAgICAvLyBDYW5ub3Qgb3BlbiAiL3Bycm9jLyIuIFByb2JhYmx5IHRoZSBrZXJuZWwgZG9lcyBub3Qgc3VwcG9ydCBpdC4gUmV0dXJuIGFuIGVycm9yIG5vdyBhbmQKKyAgICAgICAgLy8gaW4gc3Vic2VxdWVudCBjYWxscy4KKyAgICAgICAgcnVubmluZ190aHJlYWRzID0gLTE7CisgICAgICAgIHBlcm1hbmVudF9lcnJvciA9IDE7CisgICAgICAgIGdvdG8gZmluaXNoOworICAgIH07IC8vIGlmCisKKyAgICAvLyBJbml0aWFsaXplIGZpeGVkIHBhcnQgb2YgdGFza19wYXRoLiBUaGlzIHBhcnQgd2lsbCBub3QgY2hhbmdlLgorICAgIF9fa21wX3N0cl9idWZfY2F0KCAmIHRhc2tfcGF0aCwgIi9wcm9jLyIsIDYgKTsKKyAgICB0YXNrX3BhdGhfZml4ZWRfbGVuID0gdGFza19wYXRoLnVzZWQ7ICAgIC8vIFJlbWVtYmVyIG51bWJlciBvZiB1c2VkIGNoYXJhY3RlcnMuCisKKyAgICBwcm9jX2VudHJ5ID0gcmVhZGRpciggcHJvY19kaXIgKTsKKyAgICB3aGlsZSAoIHByb2NfZW50cnkgIT0gTlVMTCApIHsKKyAgICAgICAgLy8gUHJvYyBlbnRyeSBpcyBhIGRpcmVjdG9yeSBhbmQgbmFtZSBzdGFydHMgd2l0aCBhIGRpZ2l0LiBBc3N1bWUgaXQgaXMgYSBwcm9jZXNzJworICAgICAgICAvLyBkaXJlY3RvcnkuCisgICAgICAgIGlmICggcHJvY19lbnRyeS0+ZF90eXBlID09IERUX0RJUiAmJiBpc2RpZ2l0KCBwcm9jX2VudHJ5LT5kX25hbWVbIDAgXSApICkgeworCisgICAgICAgICAgICArKyB0b3RhbF9wcm9jZXNzZXM7CisgICAgICAgICAgICAvLyBNYWtlIHN1cmUgaW5pdCBwcm9jZXNzIGlzIHRoZSB2ZXJ5IGZpcnN0IGluICIvcHJvYyIsIHNvIHdlIGNhbiByZXBsYWNlCisgICAgICAgICAgICAvLyBzdHJjbXAoIHByb2NfZW50cnktPmRfbmFtZSwgIjEiICkgPT0gMCB3aXRoIHNpbXBsZXIgdG90YWxfcHJvY2Vzc2VzID09IDEuCisgICAgICAgICAgICAvLyBXZSBhcmUgZ29pbmcgdG8gY2hlY2sgdGhhdCB0b3RhbF9wcm9jZXNzZXMgPT0gMSA9PiBkX25hbWUgPT0gIjEiIGlzIHRydWUgKHdoZXJlCisgICAgICAgICAgICAvLyAiPT4iIGlzIGltcGxpY2F0aW9uKS4gU2luY2UgQysrIGRvZXMgbm90IGhhdmUgPT4gb3BlcmF0b3IsIGxldCB1cyByZXBsYWNlIGl0IHdpdGggaXRzCisgICAgICAgICAgICAvLyBlcXVpdmFsZW50OiBhID0+IGIgPT0gISBhIHx8IGIuCisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0b3RhbF9wcm9jZXNzZXMgIT0gMSB8fCBzdHJjbXAoIHByb2NfZW50cnktPmRfbmFtZSwgIjEiICkgPT0gMCApOworCisgICAgICAgICAgICAvLyBDb25zdHJ1Y3QgdGFza19wYXRoLgorICAgICAgICAgICAgdGFza19wYXRoLnVzZWQgPSB0YXNrX3BhdGhfZml4ZWRfbGVuOyAgICAvLyBSZXNldCB0YXNrX3BhdGggdG8gIi9wcm9jLyIuCisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX2NhdCggJiB0YXNrX3BhdGgsIHByb2NfZW50cnktPmRfbmFtZSwgc3RybGVuKCBwcm9jX2VudHJ5LT5kX25hbWUgKSApOworICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9jYXQoICYgdGFza19wYXRoLCAiL3Rhc2siLCA1ICk7CisKKyAgICAgICAgICAgIHRhc2tfZGlyID0gb3BlbmRpciggdGFza19wYXRoLnN0ciApOworICAgICAgICAgICAgaWYgKCB0YXNrX2RpciA9PSBOVUxMICkgeworICAgICAgICAgICAgICAgIC8vIFByb2Nlc3MgY2FuIGZpbmlzaCBiZXR3ZWVuIHJlYWRpbmcgIi9wcm9jLyIgZGlyZWN0b3J5IGVudHJ5IGFuZCBvcGVuaW5nIHByb2Nlc3MnCisgICAgICAgICAgICAgICAgLy8gInRhc2svIiBkaXJlY3RvcnkuIFNvLCBpbiBnZW5lcmFsIGNhc2Ugd2Ugc2hvdWxkIG5vdCBjb21wbGFpbiwgYnV0IGhhdmUgdG8gc2tpcAorICAgICAgICAgICAgICAgIC8vIHRoaXMgcHJvY2VzcyBhbmQgcmVhZCB0aGUgbmV4dCBvbmUuCisgICAgICAgICAgICAgICAgLy8gQnV0IG9uIHN5c3RlbXMgd2l0aCBubyAidGFzay8iIHN1cHBvcnQgd2Ugd2lsbCBzcGVuZCBsb3Qgb2YgdGltZSB0byBzY2FuICIvcHJvYy8iCisgICAgICAgICAgICAgICAgLy8gdHJlZSBhZ2FpbiBhbmQgYWdhaW4gd2l0aG91dCBhbnkgYmVuZWZpdC4gImluaXQiIHByb2Nlc3MgKGl0cyBwaWQgaXMgMSkgc2hvdWxkCisgICAgICAgICAgICAgICAgLy8gZXhpc3QgYWx3YXlzLCBzbywgaWYgd2UgY2Fubm90IG9wZW4gIi9wcm9jLzEvdGFzay8iIGRpcmVjdG9yeSwgaXQgbWVhbnMgInRhc2svIgorICAgICAgICAgICAgICAgIC8vIGlzIG5vdCBzdXBwb3J0ZWQgYnkga2VybmVsLiBSZXBvcnQgYW4gZXJyb3Igbm93IGFuZCBpbiB0aGUgZnV0dXJlLgorICAgICAgICAgICAgICAgIGlmICggc3RyY21wKCBwcm9jX2VudHJ5LT5kX25hbWUsICIxIiApID09IDAgKSB7CisgICAgICAgICAgICAgICAgICAgIHJ1bm5pbmdfdGhyZWFkcyA9IC0xOworICAgICAgICAgICAgICAgICAgICBwZXJtYW5lbnRfZXJyb3IgPSAxOworICAgICAgICAgICAgICAgICAgICBnb3RvIGZpbmlzaDsKKyAgICAgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgLy8gQ29uc3RydWN0IGZpeGVkIHBhcnQgb2Ygc3RhdCBmaWxlIHBhdGguCisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9jbGVhciggJiBzdGF0X3BhdGggKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX2NhdCggJiBzdGF0X3BhdGgsIHRhc2tfcGF0aC5zdHIsIHRhc2tfcGF0aC51c2VkICk7CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9jYXQoICYgc3RhdF9wYXRoLCAiLyIsIDEgKTsKKyAgICAgICAgICAgICAgICBzdGF0X3BhdGhfZml4ZWRfbGVuID0gc3RhdF9wYXRoLnVzZWQ7CisKKyAgICAgICAgICAgICAgICB0YXNrX2VudHJ5ID0gcmVhZGRpciggdGFza19kaXIgKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoIHRhc2tfZW50cnkgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSXQgaXMgYSBkaXJlY3RvcnkgYW5kIG5hbWUgc3RhcnRzIHdpdGggYSBkaWdpdC4KKyAgICAgICAgICAgICAgICAgICAgaWYgKCBwcm9jX2VudHJ5LT5kX3R5cGUgPT0gRFRfRElSICYmIGlzZGlnaXQoIHRhc2tfZW50cnktPmRfbmFtZVsgMCBdICkgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICsrIHRvdGFsX3RocmVhZHM7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbnNydWN0IGNvbXBsZXRlIHN0YXQgZmlsZSBwYXRoLiBFYXNpZXN0IHdheSB3b3VsZCBiZToKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmIHN0YXRfcGF0aCwgIiVzLyVzL3N0YXQiLCB0YXNrX3BhdGguc3RyLCB0YXNrX2VudHJ5LT5kX25hbWUgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1dCBzZXJpYWUgb2YgX19rbXBfc3RyX2J1Zl9jYXQgd29ya3MgYSBiaXQgZmFzdGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdF9wYXRoLnVzZWQgPSBzdGF0X3BhdGhfZml4ZWRfbGVuOyAgICAvLyBSZXNldCBzdGF0IHBhdGggdG8gaXRzIGZpeGVkIHBhcnQuCisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX2NhdCggJiBzdGF0X3BhdGgsIHRhc2tfZW50cnktPmRfbmFtZSwgc3RybGVuKCB0YXNrX2VudHJ5LT5kX25hbWUgKSApOworICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9jYXQoICYgc3RhdF9wYXRoLCAiL3N0YXQiLCA1ICk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGU6IExvdy1sZXZlbCBBUEkgKG9wZW4vcmVhZC9jbG9zZSkgaXMgdXNlZC4gSGlnaC1sZXZlbCBBUEkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIChmb3Blbi9mY2xvc2UpICB3b3JrcyB+IDMwICUgc2xvd2VyLgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdF9maWxlID0gb3Blbiggc3RhdF9wYXRoLnN0ciwgT19SRE9OTFkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdF9maWxlID09IC0xICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGNhbm5vdCByZXBvcnQgYW4gZXJyb3IgYmVjYXVzZSB0YXNrICh0aHJlYWQpIGNhbiB0ZXJtaW5hdGUganVzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlZm9yZSByZWFkaW5nIHRoaXMgZmlsZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCBvZiAic3RhdCIgZmlsZSBsb29rcyBsaWtlOgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNDI4NSAocHJvZ3JhbSkgUyAuLi4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdCBpcyBhIHNpbmdsZSBsaW5lIChpZiBwcm9ncmFtIG5hbWUgZG9lcyBub3QgaW5jbHVkZSBmYW5ueQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2xzKS4gRmlyc3QgbnVtYmVyIGlzIGEgdGhyZWFkIGlkLCB0aGVuIG5hbWUgb2YgZXhlY3V0YWJsZSBmaWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgaW4gcGFyZXRoZXNlcywgdGhlbiBzdGF0ZSBvZiB0aGUgdGhyZWFkLiBXZSBuZWVkIGp1c3QgdGhyZWFkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdvb2QgbmV3czogTGVuZ3RoIG9mIHByb2dyYW0gbmFtZSBpcyAxNSBjaGFyYWN0ZXJzIG1heC4gTG9uZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzIGFyZSB0cnVuY2F0ZWQuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGh1cywgd2UgbmVlZCByYXRoZXIgc2hvcnQgYnVmZmVyOiAxNSBjaGFycyBmb3IgcHJvZ3JhbSBuYW1lICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiBwYXJlbnRoZXNpcywgKyAzIHNwYWNlcyArIH43IGRpZ2l0cyBvZiBwaWQgPSAzNy4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYWQgbmV3czogUHJvZ3JhbSBuYW1lIG1heSBjb250YWluIHNwZWNpYWwgc3ltYm9scyBsaWtlIHNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zaW5nIHBhcmVudGhlc2lzLCBvciBldmVuIG5ldyBsaW5lLiBUaGlzIG1ha2VzIHBhcnNpbmcgInN0YXQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgbm90IDEwMCAlIHJlbGlhYmxlLiBJbiBjYXNlIG9mIGZhbm55IHByb2dyYW0gbmFtZXMgcGFyc2luZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXkgZmFpbCAocmVwb3J0IGluY29ycmVjdCB0aHJlYWQgc3RhdGUpLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNpbmcgInN0YXR1cyIgZmlsZSBsb29rcyBtb3JlIHByb21pc3NpbmcgKGR1ZSB0byBkaWZmZXJlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSBzdHJ1Y3R1cmUgYW5kIGVzY2FwaW5nIHNwZWNpYWwgc3ltYm9scykgYnV0IHJlYWRpbmcgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNpbmcgb2YgInN0YXR1cyIgZmlsZSB3b3JrcyBzbG93ZXIuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gbG4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgYnVmZmVyWyA2NSBdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gcmVhZCggc3RhdF9maWxlLCBidWZmZXIsIHNpemVvZiggYnVmZmVyICkgLSAxICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBsZW4gPj0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyWyBsZW4gXSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVzaW5nIHNjYW5mOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgc3NjYW5mKCBidWZmZXIsICIlKmQgKCUqcykgJWMgIiwgJiBzdGF0ZSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb29rcyB2ZXJ5IG5pY2UsIGJ1dCBzZWFyY2hpbmcgZm9yIGEgY2xvc2luZyBwYXJlbnRoZXNpcyB3b3JrcyBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJpdCBmYXN0ZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKiBjbG9zZV9wYXJlbnQgPSBzdHJzdHIoIGJ1ZmZlciwgIikgIiApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGNsb3NlX3BhcmVudCAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBzdGF0ZSA9ICogKCBjbG9zZV9wYXJlbnQgKyAyICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlID09ICdSJyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArKyBydW5uaW5nX3RocmVhZHM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBydW5uaW5nX3RocmVhZHMgPj0gbWF4ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGZpbmlzaDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlKCBzdGF0X2ZpbGUgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0X2ZpbGUgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICAgICAgICAgIHRhc2tfZW50cnkgPSByZWFkZGlyKCB0YXNrX2RpciApOworICAgICAgICAgICAgICAgIH07IC8vIHdoaWxlCisgICAgICAgICAgICAgICAgY2xvc2VkaXIoIHRhc2tfZGlyICk7CisgICAgICAgICAgICAgICAgdGFza19kaXIgPSBOVUxMOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgcHJvY19lbnRyeSA9IHJlYWRkaXIoIHByb2NfZGlyICk7CisgICAgfTsgLy8gd2hpbGUKKworICAgIC8vCisgICAgLy8gVGhlcmUgX21pZ2h0XyBiZSBhIHRpbWluZyBob2xlIHdoZXJlIHRoZSB0aHJlYWQgZXhlY3V0aW5nIHRoaXMKKyAgICAvLyBjb2RlIGdldCBza2lwcGVkIGluIHRoZSBsb2FkIGJhbGFuY2UsIGFuZCBydW5uaW5nX3RocmVhZHMgaXMgMC4KKyAgICAvLyBBc3NlcnQgaW4gdGhlIGRlYnVnIGJ1aWxkcyBvbmx5ISEhCisgICAgLy8KKyAgICBLTVBfREVCVUdfQVNTRVJUKCBydW5uaW5nX3RocmVhZHMgPiAwICk7CisgICAgaWYgKCBydW5uaW5nX3RocmVhZHMgPD0gMCApIHsKKyAgICAgICAgcnVubmluZ190aHJlYWRzID0gMTsKKyAgICB9CisKKyAgICBmaW5pc2g6IC8vIENsZWFuIHVwIGFuZCBleGl0LgorICAgICAgICBpZiAoIHByb2NfZGlyICE9IE5VTEwgKSB7CisgICAgICAgICAgICBjbG9zZWRpciggcHJvY19kaXIgKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9mcmVlKCAmIHRhc2tfcGF0aCApOworICAgICAgICBpZiAoIHRhc2tfZGlyICE9IE5VTEwgKSB7CisgICAgICAgICAgICBjbG9zZWRpciggdGFza19kaXIgKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9mcmVlKCAmIHN0YXRfcGF0aCApOworICAgICAgICBpZiAoIHN0YXRfZmlsZSAhPSAtMSApIHsKKyAgICAgICAgICAgIGNsb3NlKCBzdGF0X2ZpbGUgKTsKKyAgICAgICAgfTsgLy8gaWYKKworICAgIGdsYl9ydW5uaW5nX3RocmVhZHMgPSBydW5uaW5nX3RocmVhZHM7CisKKyAgICByZXR1cm4gcnVubmluZ190aHJlYWRzOworCit9IC8vIF9fa21wX2dldF9sb2FkX2JhbGFuY2UKKworIyBlbmRpZiAvLyBLTVBfT1NfREFSV0lOCisKKyNlbmRpZiAvLyBVU0VfTE9BRF9CQUxBTkNFCisKKworI2lmIEtNUF9DT01QSUxFUl9HQ0MgJiYgIShLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX1BQQzY0IHx8IEtNUF9BUkNIX0FBUkNINjQpCisKK2ludCBfX2ttcF9pbnZva2VfbWljcm90YXNrKCBtaWNyb3Rhc2tfdCBwa2ZuLCBpbnQgZ3RpZCwgaW50IHRpZCwgaW50IGFyZ2MsCisgICAgICAgIHZvaWQgKnBfYXJndltdICkKK3sKKyAgICBpbnQgYXJnY19mdWxsID0gYXJnYyArIDI7CisgICAgaW50IGk7CisgICAgZmZpX2NpZiBjaWY7CisgICAgZmZpX3R5cGUgKnR5cGVzW2FyZ2NfZnVsbF07CisgICAgdm9pZCAqYXJnc1thcmdjX2Z1bGxdOworICAgIHZvaWQgKmlkcFsyXTsKKworICAgIC8qIFdlJ3JlIG9ubHkgcGFzc2luZyBwb2ludGVycyB0byB0aGUgdGFyZ2V0LiAqLworICAgIGZvciAoaSA9IDA7IGkgPCBhcmdjX2Z1bGw7IGkrKykKKyAgICAgICAgdHlwZXNbaV0gPSAmZmZpX3R5cGVfcG9pbnRlcjsKKworICAgIC8qIFVnbHkgZG91YmxlLWluZGlyZWN0aW9uLCBidXQgdGhhdCdzIGhvdyBpdCBnb2VzLi4uICovCisgICAgaWRwWzBdID0gJmd0aWQ7CisgICAgaWRwWzFdID0gJnRpZDsKKyAgICBhcmdzWzBdID0gJmlkcFswXTsKKyAgICBhcmdzWzFdID0gJmlkcFsxXTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBhcmdjOyBpKyspCisgICAgICAgIGFyZ3NbMiArIGldID0gJnBfYXJndltpXTsKKworICAgIGlmIChmZmlfcHJlcF9jaWYoJmNpZiwgRkZJX0RFRkFVTFRfQUJJLCBhcmdjX2Z1bGwsCisgICAgICAgICAgICAgICAgJmZmaV90eXBlX3ZvaWQsIHR5cGVzKSAhPSBGRklfT0spCisgICAgICAgIGFib3J0KCk7CisKKyAgICBmZmlfY2FsbCgmY2lmLCAodm9pZCAoKikodm9pZCkpcGtmbiwgTlVMTCwgYXJncyk7CisKKyAgICByZXR1cm4gMTsKK30KKworI2VuZGlmIC8vIEtNUF9DT01QSUxFUl9HQ0MgJiYgIShLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX1BQQzY0KQorCisjaWYgS01QX0FSQ0hfUFBDNjQgfHwgS01QX0FSQ0hfQUFSQ0g2NAorCisvLyB3ZSByZWFsbHkgb25seSBuZWVkIHRoZSBjYXNlIHdpdGggMSBhcmd1bWVudCwgYmVjYXVzZSBDTEFORyBhbHdheXMgYnVpbGQKKy8vIGEgc3RydWN0IG9mIHBvaW50ZXJzIHRvIHNoYXJlZCB2YXJpYWJsZXMgcmVmZXJlbmNlZCBpbiB0aGUgb3V0bGluZWQgZnVuY3Rpb24KK2ludAorX19rbXBfaW52b2tlX21pY3JvdGFzayggbWljcm90YXNrX3QgcGtmbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBndGlkLCBpbnQgdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFyZ2MsIHZvaWQgKnBfYXJndltdICkgeworICBzd2l0Y2ggKGFyZ2MpIHsKKyAgZGVmYXVsdDoKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlRvbyBtYW55IGFyZ3MgdG8gbWljcm90YXNrOiAlZCFcbiIsIGFyZ2MpOworICAgIGZmbHVzaChzdGRlcnIpOworICAgIGV4aXQoLTEpOworICBjYXNlIDA6CisgICAgKCpwa2ZuKSgmZ3RpZCwgJnRpZCk7CisgICAgYnJlYWs7CisgIGNhc2UgMToKKyAgICAoKnBrZm4pKCZndGlkLCAmdGlkLCBwX2FyZ3ZbMF0pOworICAgIGJyZWFrOworICBjYXNlIDI6CisgICAgKCpwa2ZuKSgmZ3RpZCwgJnRpZCwgcF9hcmd2WzBdLCBwX2FyZ3ZbMV0pOworICAgIGJyZWFrOworICBjYXNlIDM6CisgICAgKCpwa2ZuKSgmZ3RpZCwgJnRpZCwgcF9hcmd2WzBdLCBwX2FyZ3ZbMV0sIHBfYXJndlsyXSk7CisgICAgYnJlYWs7CisgIGNhc2UgNDoKKyAgICAoKnBrZm4pKCZndGlkLCAmdGlkLCBwX2FyZ3ZbMF0sIHBfYXJndlsxXSwgcF9hcmd2WzJdLCBwX2FyZ3ZbM10pOworICAgIGJyZWFrOworICBjYXNlIDU6CisgICAgKCpwa2ZuKSgmZ3RpZCwgJnRpZCwgcF9hcmd2WzBdLCBwX2FyZ3ZbMV0sIHBfYXJndlsyXSwgcF9hcmd2WzNdLCBwX2FyZ3ZbNF0pOworICAgIGJyZWFrOworICBjYXNlIDY6CisgICAgKCpwa2ZuKSgmZ3RpZCwgJnRpZCwgcF9hcmd2WzBdLCBwX2FyZ3ZbMV0sIHBfYXJndlsyXSwgcF9hcmd2WzNdLCBwX2FyZ3ZbNF0sCisgICAgICAgICAgICBwX2FyZ3ZbNV0pOworICAgIGJyZWFrOworICBjYXNlIDc6CisgICAgKCpwa2ZuKSgmZ3RpZCwgJnRpZCwgcF9hcmd2WzBdLCBwX2FyZ3ZbMV0sIHBfYXJndlsyXSwgcF9hcmd2WzNdLCBwX2FyZ3ZbNF0sCisgICAgICAgICAgICBwX2FyZ3ZbNV0sIHBfYXJndls2XSk7CisgICAgYnJlYWs7CisgIGNhc2UgODoKKyAgICAoKnBrZm4pKCZndGlkLCAmdGlkLCBwX2FyZ3ZbMF0sIHBfYXJndlsxXSwgcF9hcmd2WzJdLCBwX2FyZ3ZbM10sIHBfYXJndls0XSwKKyAgICAgICAgICAgIHBfYXJndls1XSwgcF9hcmd2WzZdLCBwX2FyZ3ZbN10pOworICAgIGJyZWFrOworICBjYXNlIDk6CisgICAgKCpwa2ZuKSgmZ3RpZCwgJnRpZCwgcF9hcmd2WzBdLCBwX2FyZ3ZbMV0sIHBfYXJndlsyXSwgcF9hcmd2WzNdLCBwX2FyZ3ZbNF0sCisgICAgICAgICAgICBwX2FyZ3ZbNV0sIHBfYXJndls2XSwgcF9hcmd2WzddLCBwX2FyZ3ZbOF0pOworICAgIGJyZWFrOworICBjYXNlIDEwOgorICAgICgqcGtmbikoJmd0aWQsICZ0aWQsIHBfYXJndlswXSwgcF9hcmd2WzFdLCBwX2FyZ3ZbMl0sIHBfYXJndlszXSwgcF9hcmd2WzRdLAorICAgICAgICAgICAgcF9hcmd2WzVdLCBwX2FyZ3ZbNl0sIHBfYXJndls3XSwgcF9hcmd2WzhdLCBwX2FyZ3ZbOV0pOworICAgIGJyZWFrOworICBjYXNlIDExOgorICAgICgqcGtmbikoJmd0aWQsICZ0aWQsIHBfYXJndlswXSwgcF9hcmd2WzFdLCBwX2FyZ3ZbMl0sIHBfYXJndlszXSwgcF9hcmd2WzRdLAorICAgICAgICAgICAgcF9hcmd2WzVdLCBwX2FyZ3ZbNl0sIHBfYXJndls3XSwgcF9hcmd2WzhdLCBwX2FyZ3ZbOV0sIHBfYXJndlsxMF0pOworICAgIGJyZWFrOworICBjYXNlIDEyOgorICAgICgqcGtmbikoJmd0aWQsICZ0aWQsIHBfYXJndlswXSwgcF9hcmd2WzFdLCBwX2FyZ3ZbMl0sIHBfYXJndlszXSwgcF9hcmd2WzRdLAorICAgICAgICAgICAgcF9hcmd2WzVdLCBwX2FyZ3ZbNl0sIHBfYXJndls3XSwgcF9hcmd2WzhdLCBwX2FyZ3ZbOV0sIHBfYXJndlsxMF0sCisgICAgICAgICAgICBwX2FyZ3ZbMTFdKTsKKyAgICBicmVhazsKKyAgY2FzZSAxMzoKKyAgICAoKnBrZm4pKCZndGlkLCAmdGlkLCBwX2FyZ3ZbMF0sIHBfYXJndlsxXSwgcF9hcmd2WzJdLCBwX2FyZ3ZbM10sIHBfYXJndls0XSwKKyAgICAgICAgICAgIHBfYXJndls1XSwgcF9hcmd2WzZdLCBwX2FyZ3ZbN10sIHBfYXJndls4XSwgcF9hcmd2WzldLCBwX2FyZ3ZbMTBdLAorICAgICAgICAgICAgcF9hcmd2WzExXSwgcF9hcmd2WzEyXSk7CisgICAgYnJlYWs7CisgIGNhc2UgMTQ6CisgICAgKCpwa2ZuKSgmZ3RpZCwgJnRpZCwgcF9hcmd2WzBdLCBwX2FyZ3ZbMV0sIHBfYXJndlsyXSwgcF9hcmd2WzNdLCBwX2FyZ3ZbNF0sCisgICAgICAgICAgICBwX2FyZ3ZbNV0sIHBfYXJndls2XSwgcF9hcmd2WzddLCBwX2FyZ3ZbOF0sIHBfYXJndls5XSwgcF9hcmd2WzEwXSwKKyAgICAgICAgICAgIHBfYXJndlsxMV0sIHBfYXJndlsxMl0sIHBfYXJndlsxM10pOworICAgIGJyZWFrOworICBjYXNlIDE1OgorICAgICgqcGtmbikoJmd0aWQsICZ0aWQsIHBfYXJndlswXSwgcF9hcmd2WzFdLCBwX2FyZ3ZbMl0sIHBfYXJndlszXSwgcF9hcmd2WzRdLAorICAgICAgICAgICAgcF9hcmd2WzVdLCBwX2FyZ3ZbNl0sIHBfYXJndls3XSwgcF9hcmd2WzhdLCBwX2FyZ3ZbOV0sIHBfYXJndlsxMF0sCisgICAgICAgICAgICBwX2FyZ3ZbMTFdLCBwX2FyZ3ZbMTJdLCBwX2FyZ3ZbMTNdLCBwX2FyZ3ZbMTRdKTsKKyAgICBicmVhazsKKyAgfQorCisgIHJldHVybiAxOworfQorCisjZW5kaWYKKworLy8gZW5kIG9mIGZpbGUgLy8KKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMvel9XaW5kb3dzX05ULTU4Nl9hc20uYXNtIGIvZmluYWwvcnVudGltZS9zcmMvel9XaW5kb3dzX05ULTU4Nl9hc20uYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4NWUzMjYKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy96X1dpbmRvd3NfTlQtNTg2X2FzbS5hc20KQEAgLTAsMCArMSwxMzkwIEBACis7ICB6X1dpbmRvd3NfTlQtNTg2X2FzbS5hc206ICAtIG1pY3JvdGFza2luZyByb3V0aW5lcyBzcGVjaWZpY2FsbHkKKzsgICAgd3JpdHRlbiBmb3IgSUEtMzIgYXJjaGl0ZWN0dXJlIGFuZCBJbnRlbChSKSA2NCBydW5uaW5nIFdpbmRvd3MqIE9TCis7ICAkUmV2aXNpb246IDQzMzczICQKKzsgICREYXRlOiAyMDE0LTA4LTA3IDA5OjE3OjMyIC0wNTAwIChUaHUsIDA3IEF1ZyAyMDE0KSAkCisKKzsKKzsvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworOy8vCis7Ly8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorOy8vCis7Ly8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorOy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorOy8vCis7Ly89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKzsKKworICAgICAgICBUSVRMRSAgIHpfV2luZG93c19OVC01ODZfYXNtLmFzbQorCis7ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IElBLTMyIGFyY2hpdGVjdHVyZSA9PT09PT09PT09PT09PT09PT09PT09PT09PQoraWZkZWYgX01fSUEzMgorCisgICAgICAgIC41ODZQCisKK2lmIEBWZXJzaW9uIGd0IDUxMAorICAgICAgICAubW9kZWwgSFVHRQorZWxzZQorX1RFWFQgICBTRUdNRU5UIFBBUkEgVVNFMzIgUFVCTElDICdDT0RFJworX1RFWFQgICBFTkRTCitfREFUQSAgIFNFR01FTlQgRFdPUkQgVVNFMzIgUFVCTElDICdEQVRBJworX0RBVEEgICBFTkRTCitDT05TVCAgIFNFR01FTlQgRFdPUkQgVVNFMzIgUFVCTElDICdDT05TVCcKK0NPTlNUICAgRU5EUworX0JTUyAgICBTRUdNRU5UIERXT1JEIFVTRTMyIFBVQkxJQyAnQlNTJworX0JTUyAgICBFTkRTCiskJFNZTUJPTFMgICAgICAgU0VHTUVOVCBCWVRFIFVTRTMyICdERUJTWU0nCiskJFNZTUJPTFMgICAgICAgRU5EUworJCRUWVBFUyBTRUdNRU5UIEJZVEUgVVNFMzIgJ0RFQlRZUCcKKyQkVFlQRVMgRU5EUworX1RMUyAgICBTRUdNRU5UIERXT1JEIFVTRTMyIFBVQkxJQyAnVExTJworX1RMUyAgICBFTkRTCitGTEFUICAgIEdST1VQIF9EQVRBLCBDT05TVCwgX0JTUworICAgICAgICBBU1NVTUUgIENTOiBGTEFULCBEUzogRkxBVCwgU1M6IEZMQVQKK2VuZGlmCisKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX19rbXBfeDg2X3BhdXNlCis7Cis7IHZvaWQKKzsgX19rbXBfeDg2X3BhdXNlKCB2b2lkICkKKzsKKworUFVCTElDICBfX19rbXBfeDg2X3BhdXNlCitfcCQgPSA0CitfZCQgPSA4CitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19fX2ttcF94ODZfcGF1c2UgUFJPQyBORUFSCisKKyAgICAgICAgZGIgICAgICAwZjNICisgICAgICAgIGRiICAgICAgMDkwSCAgICA7OyBwYXVzZQorICAgICAgICByZXQKKworX19fa21wX3g4Nl9wYXVzZSBFTkRQCitfVEVYVCAgIEVORFMKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX19rbXBfeDg2X2NwdWlkCis7Cis7IHZvaWQKKzsgX19rbXBfeDg2X2NwdWlkKCBpbnQgbW9kZSwgaW50IG1vZGUyLCBzdHJ1Y3Qga21wX2NwdWlkICpwICk7Cis7CisKK1BVQkxJQyAgX19fa21wX3g4Nl9jcHVpZAorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CitfbW9kZSQgID0gOAorX21vZGUyJCA9IDEyCitfcCQgICAgID0gMTYKK19lYXgkICAgPSAwCitfZWJ4JCAgID0gNAorX2VjeCQgICA9IDgKK19lZHgkICAgPSAxMgorCitfX19rbXBfeDg2X2NwdWlkIFBST0MgTkVBUgorCisgICAgICAgIHB1c2ggICAgICBlYnAKKyAgICAgICAgbW92ICAgICAgIGVicCwgZXNwCisKKyAgICAgICAgcHVzaCAgICAgIGVkaQorICAgICAgICBwdXNoICAgICAgZWJ4CisgICAgICAgIHB1c2ggICAgICBlY3gKKyAgICAgICAgcHVzaCAgICAgIGVkeAorCisgICAgICAgIG1vdgkgIGVheCwgRFdPUkQgUFRSIF9tb2RlJFtlYnBdCisgICAgICAgIG1vdgkgIGVjeCwgRFdPUkQgUFRSIF9tb2RlMiRbZWJwXQorCWNwdWlkCQkJCQk7IFF1ZXJ5IHRoZSBDUFVJRCBmb3IgdGhlIGN1cnJlbnQgcHJvY2Vzc29yCisKKyAgICAgICAgbW92ICAgICAgIGVkaSwgRFdPUkQgUFRSIF9wJFtlYnBdCisJbW92IAkgIERXT1JEIFBUUiBfZWF4JFsgZWRpIF0sIGVheAorCW1vdiAJICBEV09SRCBQVFIgX2VieCRbIGVkaSBdLCBlYngKKwltb3YgCSAgRFdPUkQgUFRSIF9lY3gkWyBlZGkgXSwgZWN4CisJbW92IAkgIERXT1JEIFBUUiBfZWR4JFsgZWRpIF0sIGVkeAorCisgICAgICAgIHBvcCAgICAgICBlZHgKKyAgICAgICAgcG9wICAgICAgIGVjeAorICAgICAgICBwb3AgICAgICAgZWJ4CisgICAgICAgIHBvcCAgICAgICBlZGkKKworICAgICAgICBtb3YgICAgICAgZXNwLCBlYnAKKyAgICAgICAgcG9wICAgICAgIGVicAorICAgICAgICByZXQKKworX19fa21wX3g4Nl9jcHVpZCBFTkRQCitfVEVYVCAgICAgRU5EUworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fX2ttcF90ZXN0X3RoZW5fYWRkMzIKKzsKKzsga21wX2ludDMyCis7IF9fa21wX3Rlc3RfdGhlbl9hZGQzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgZCApOworOworCitQVUJMSUMgIF9fX2ttcF90ZXN0X3RoZW5fYWRkMzIKK19wJCA9IDQKK19kJCA9IDgKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorX19fa21wX3Rlc3RfdGhlbl9hZGQzMiBQUk9DIE5FQVIKKworICAgICAgICBtb3YgICAgIGVheCwgRFdPUkQgUFRSIF9kJFtlc3BdCisgICAgICAgIG1vdiAgICAgZWN4LCBEV09SRCBQVFIgX3AkW2VzcF0KK2xvY2sgICAgeGFkZCAgICBEV09SRCBQVFIgW2VjeF0sIGVheAorICAgICAgICByZXQKKworX19fa21wX3Rlc3RfdGhlbl9hZGQzMiBFTkRQCitfVEVYVCAgIEVORFMKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX19rbXBfY29tcGFyZV9hbmRfc3RvcmU4Cis7Cis7IGttcF9pbnQ4Cis7IF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlOCggdm9sYXRpbGUga21wX2ludDggKnAsIGttcF9pbnQ4IGN2LCBrbXBfaW50OCBzdiApOworOworCitQVUJMSUMgIF9fX2ttcF9jb21wYXJlX2FuZF9zdG9yZTgKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorX3AkID0gNAorX2N2JCA9IDgKK19zdiQgPSAxMgorCitfX19rbXBfY29tcGFyZV9hbmRfc3RvcmU4IFBST0MgTkVBUgorCisgICAgICAgIG1vdiAgICAgICBlY3gsIERXT1JEIFBUUiBfcCRbZXNwXQorICAgICAgICBtb3YgICAgICAgYWwsIEJZVEUgUFRSIF9jdiRbZXNwXQorICAgICAgICBtb3YgICAgICAgZGwsIEJZVEUgUFRSIF9zdiRbZXNwXQorbG9jayAgICBjbXB4Y2hnICAgQllURSBQVFIgW2VjeF0sIGRsCisgICAgICAgIHNldGUgICAgICBhbCAgICAgICAgICAgOyBpZiBhbCA9PSBbZWN4XSBzZXQgYWwgPSAxIGVsc2Ugc2V0IGFsID0gMAorICAgICAgICBhbmQgICAgICAgZWF4LCAxICAgICAgIDsgc2lnbiBleHRlbmQgcHJldmlvdXMgaW5zdHJ1Y3Rpb24KKyAgICAgICAgcmV0CisKK19fX2ttcF9jb21wYXJlX2FuZF9zdG9yZTggRU5EUAorX1RFWFQgICAgIEVORFMKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX19rbXBfY29tcGFyZV9hbmRfc3RvcmUxNgorOworOyBrbXBfaW50MTYKKzsgX19rbXBfY29tcGFyZV9hbmRfc3RvcmUxNiggdm9sYXRpbGUga21wX2ludDE2ICpwLCBrbXBfaW50MTYgY3YsIGttcF9pbnQxNiBzdiApOworOworCitQVUJMSUMgIF9fX2ttcF9jb21wYXJlX2FuZF9zdG9yZTE2CitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19wJCA9IDQKK19jdiQgPSA4Citfc3YkID0gMTIKKworX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlMTYgUFJPQyBORUFSCisKKyAgICAgICAgbW92ICAgICAgIGVjeCwgRFdPUkQgUFRSIF9wJFtlc3BdCisgICAgICAgIG1vdiAgICAgICBheCwgV09SRCBQVFIgX2N2JFtlc3BdCisgICAgICAgIG1vdiAgICAgICBkeCwgV09SRCBQVFIgX3N2JFtlc3BdCitsb2NrICAgIGNtcHhjaGcgICBXT1JEIFBUUiBbZWN4XSwgZHgKKyAgICAgICAgc2V0ZSAgICAgIGFsICAgICAgICAgICA7IGlmIGF4ID09IFtlY3hdIHNldCBhbCA9IDEgZWxzZSBzZXQgYWwgPSAwCisgICAgICAgIGFuZCAgICAgICBlYXgsIDEgICAgICAgOyBzaWduIGV4dGVuZCBwcmV2aW91cyBpbnN0cnVjdGlvbgorICAgICAgICByZXQKKworX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlMTYgRU5EUAorX1RFWFQgICAgIEVORFMKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX19rbXBfY29tcGFyZV9hbmRfc3RvcmUzMgorOworOyBrbXBfaW50MzIKKzsgX19rbXBfY29tcGFyZV9hbmRfc3RvcmUzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgY3YsIGttcF9pbnQzMiBzdiApOworOworCitQVUJMSUMgIF9fX2ttcF9jb21wYXJlX2FuZF9zdG9yZTMyCitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19wJCA9IDQKK19jdiQgPSA4Citfc3YkID0gMTIKKworX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlMzIgUFJPQyBORUFSCisKKyAgICAgICAgbW92ICAgICAgIGVjeCwgRFdPUkQgUFRSIF9wJFtlc3BdCisgICAgICAgIG1vdiAgICAgICBlYXgsIERXT1JEIFBUUiBfY3YkW2VzcF0KKyAgICAgICAgbW92ICAgICAgIGVkeCwgRFdPUkQgUFRSIF9zdiRbZXNwXQorbG9jayAgICBjbXB4Y2hnICAgRFdPUkQgUFRSIFtlY3hdLCBlZHgKKyAgICAgICAgc2V0ZSAgICAgIGFsICAgICAgICAgICA7IGlmIGVheCA9PSBbZWN4XSBzZXQgYWwgPSAxIGVsc2Ugc2V0IGFsID0gMAorICAgICAgICBhbmQgICAgICAgZWF4LCAxICAgICAgIDsgc2lnbiBleHRlbmQgcHJldmlvdXMgaW5zdHJ1Y3Rpb24KKyAgICAgICAgcmV0CisKK19fX2ttcF9jb21wYXJlX2FuZF9zdG9yZTMyIEVORFAKK19URVhUICAgICBFTkRTCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQKKzsKKzsga21wX2ludDMyCis7IF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IGN2LCBrbXBfaW50NjQgc3YgKTsKKzsKKworUFVCTElDICBfX19rbXBfY29tcGFyZV9hbmRfc3RvcmU2NAorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CitfcCQgPSA4CitfY3ZfbG93JCA9IDEyCitfY3ZfaGlnaCQgPSAxNgorX3N2X2xvdyQgPSAyMAorX3N2X2hpZ2gkID0gMjQKKworX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQgUFJPQyBORUFSCisKKyAgICAgICAgcHVzaCAgICAgIGVicAorICAgICAgICBtb3YgICAgICAgZWJwLCBlc3AKKyAgICAgICAgcHVzaCAgICAgIGVieAorICAgICAgICBwdXNoICAgICAgZWRpCisgICAgICAgIG1vdiAgICAgICBlZGksIERXT1JEIFBUUiBfcCRbZWJwXQorICAgICAgICBtb3YgICAgICAgZWF4LCBEV09SRCBQVFIgX2N2X2xvdyRbZWJwXQorICAgICAgICBtb3YgICAgICAgZWR4LCBEV09SRCBQVFIgX2N2X2hpZ2gkW2VicF0KKyAgICAgICAgbW92ICAgICAgIGVieCwgRFdPUkQgUFRSIF9zdl9sb3ckW2VicF0KKyAgICAgICAgbW92ICAgICAgIGVjeCwgRFdPUkQgUFRSIF9zdl9oaWdoJFtlYnBdCitsb2NrICAgIGNtcHhjaGc4YiBRV09SRCBQVFIgW2VkaV0KKyAgICAgICAgc2V0ZSAgICAgIGFsICAgICAgICAgICA7IGlmIGVkeDplYXggPT0gW2VkaV0gc2V0IGFsID0gMSBlbHNlIHNldCBhbCA9IDAKKyAgICAgICAgYW5kICAgICAgIGVheCwgMSAgICAgICA7IHNpZ24gZXh0ZW5kIHByZXZpb3VzIGluc3RydWN0aW9uCisgICAgICAgIHBvcCAgICAgICBlZGkKKyAgICAgICAgcG9wICAgICAgIGVieAorICAgICAgICBtb3YgICAgICAgZXNwLCBlYnAKKyAgICAgICAgcG9wICAgICAgIGVicAorICAgICAgICByZXQKKworX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQgRU5EUAorX1RFWFQgICAgIEVORFMKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX19rbXBfeGNoZ19maXhlZDgKKzsKKzsga21wX2ludDgKKzsgX19rbXBfeGNoZ19maXhlZDgoIHZvbGF0aWxlIGttcF9pbnQ4ICpwLCBrbXBfaW50OCBkICk7Cis7CisKK1BVQkxJQyAgX19fa21wX3hjaGdfZml4ZWQ4CitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19wJCA9IDQKK19kJCA9IDgKKworX19fa21wX3hjaGdfZml4ZWQ4IFBST0MgTkVBUgorCisgICAgICAgIG1vdiAgICAgICBlY3gsIERXT1JEIFBUUiBfcCRbZXNwXQorICAgICAgICBtb3YgICAgICAgYWwsICBCWVRFIFBUUiBfZCRbZXNwXQorbG9jayAgICB4Y2hnICAgICAgQllURSBQVFIgW2VjeF0sIGFsCisgICAgICAgIHJldAorCitfX19rbXBfeGNoZ19maXhlZDggRU5EUAorX1RFWFQgICAgIEVORFMKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX19rbXBfeGNoZ19maXhlZDE2Cis7Cis7IGttcF9pbnQxNgorOyBfX2ttcF94Y2hnX2ZpeGVkMTYoIHZvbGF0aWxlIGttcF9pbnQxNiAqcCwga21wX2ludDE2IGQgKTsKKzsKKworUFVCTElDICBfX19rbXBfeGNoZ19maXhlZDE2CitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19wJCA9IDQKK19kJCA9IDgKKworX19fa21wX3hjaGdfZml4ZWQxNiBQUk9DIE5FQVIKKworICAgICAgICBtb3YgICAgICAgZWN4LCBEV09SRCBQVFIgX3AkW2VzcF0KKyAgICAgICAgbW92ICAgICAgIGF4LCAgV09SRCBQVFIgIF9kJFtlc3BdCitsb2NrICAgIHhjaGcgICAgICBXT1JEIFBUUiBbZWN4XSwgYXgKKyAgICAgICAgcmV0CisKK19fX2ttcF94Y2hnX2ZpeGVkMTYgRU5EUAorX1RFWFQgICAgIEVORFMKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX19rbXBfeGNoZ19maXhlZDMyCis7Cis7IGttcF9pbnQzMgorOyBfX2ttcF94Y2hnX2ZpeGVkMzIoIHZvbGF0aWxlIGttcF9pbnQzMiAqcCwga21wX2ludDMyIGQgKTsKKzsKKworUFVCTElDICBfX19rbXBfeGNoZ19maXhlZDMyCitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19wJCA9IDQKK19kJCA9IDgKKworX19fa21wX3hjaGdfZml4ZWQzMiBQUk9DIE5FQVIKKworICAgICAgICBtb3YgICAgICAgZWN4LCBEV09SRCBQVFIgX3AkW2VzcF0KKyAgICAgICAgbW92ICAgICAgIGVheCwgRFdPUkQgUFRSIF9kJFtlc3BdCitsb2NrICAgIHhjaGcgICAgICBEV09SRCBQVFIgW2VjeF0sIGVheAorICAgICAgICByZXQKKworX19fa21wX3hjaGdfZml4ZWQzMiBFTkRQCitfVEVYVCAgICAgRU5EUworCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19fa21wX3hjaGdfcmVhbDMyCis7Cis7IGttcF9yZWFsMzIKKzsgX19rbXBfeGNoZ19yZWFsMzIoIHZvbGF0aWxlIGttcF9yZWFsMzIgKnAsIGttcF9yZWFsMzIgZCApOworOworCitQVUJMSUMgIF9fX2ttcF94Y2hnX3JlYWwzMgorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CitfcCQgPSA4CitfZCQgPSAxMgorX29sZF92YWx1ZSQgPSAtNAorCitfX19rbXBfeGNoZ19yZWFsMzIgUFJPQyBORUFSCisKKyAgICAgICAgcHVzaCAgICBlYnAKKyAgICAgICAgbW92ICAgICBlYnAsIGVzcAorICAgICAgICBzdWIgICAgIGVzcCwgNAorICAgICAgICBwdXNoICAgIGVzaQorICAgICAgICBtb3YgICAgIGVzaSwgRFdPUkQgUFRSIF9wJFtlYnBdCisKKyAgICAgICAgZmxkICAgICBEV09SRCBQVFIgW2VzaV0KKyAgICAgICAgICAgICAgICAgICAgICAgIDs7IGxvYWQgPGFkZHI+CisgICAgICAgIGZzdCAgICAgRFdPUkQgUFRSIF9vbGRfdmFsdWUkW2VicF0KKyAgICAgICAgICAgICAgICAgICAgICAgIDs7IHN0b3JlIGludG8gb2xkX3ZhbHVlCisKKyAgICAgICAgbW92ICAgICBlYXgsIERXT1JEIFBUUiBfZCRbZWJwXQorCitsb2NrICAgIHhjaGcgICAgRFdPUkQgUFRSIFtlc2ldLCBlYXgKKworICAgICAgICBmbGQgICAgIERXT1JEIFBUUiBfb2xkX3ZhbHVlJFtlYnBdCisgICAgICAgICAgICAgICAgICAgICAgICA7OyByZXR1cm4gb2xkX3ZhbHVlCisgICAgICAgIHBvcCAgICAgZXNpCisgICAgICAgIG1vdiAgICAgZXNwLCBlYnAKKyAgICAgICAgcG9wICAgICBlYnAKKyAgICAgICAgcmV0CisKK19fX2ttcF94Y2hnX3JlYWwzMiBFTkRQCitfVEVYVCAgIEVORFMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ4Cis7Cis7IGttcF9pbnQ4Cis7IF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDgoIHZvbGF0aWxlIGttcF9pbnQ4ICpwLCBrbXBfaW50OCBjdiwga21wX2ludDggc3YgKTsKKzsKKworUFVCTElDICBfX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0OAorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CitfcCQgPSA0CitfY3YkID0gOAorX3N2JCA9IDEyCisKK19fX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ4IFBST0MgTkVBUgorCisgICAgICAgIG1vdiAgICAgICBlY3gsIERXT1JEIFBUUiBfcCRbZXNwXQorICAgICAgICBtb3YgICAgICAgYWwsIEJZVEUgUFRSIF9jdiRbZXNwXQorICAgICAgICBtb3YgICAgICAgZGwsIEJZVEUgUFRSIF9zdiRbZXNwXQorbG9jayAgICBjbXB4Y2hnICAgQllURSBQVFIgW2VjeF0sIGRsCisgICAgICAgIHJldAorCitfX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0OCBFTkRQCitfVEVYVCAgICAgRU5EUworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQxNgorOworOyBrbXBfaW50MTYKKzsgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MTYoIHZvbGF0aWxlIGttcF9pbnQxNiAqcCwga21wX2ludDE2IGN2LCBrbXBfaW50MTYgc3YgKTsKKzsKKworUFVCTElDICBfX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MTYKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorX3AkID0gNAorX2N2JCA9IDgKK19zdiQgPSAxMgorCitfX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MTYgUFJPQyBORUFSCisKKyAgICAgICAgbW92ICAgICAgIGVjeCwgRFdPUkQgUFRSIF9wJFtlc3BdCisgICAgICAgIG1vdiAgICAgICBheCwgV09SRCBQVFIgX2N2JFtlc3BdCisgICAgICAgIG1vdiAgICAgICBkeCwgV09SRCBQVFIgX3N2JFtlc3BdCitsb2NrICAgIGNtcHhjaGcgICBXT1JEIFBUUiBbZWN4XSwgZHgKKyAgICAgICAgcmV0CisKK19fX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQxNiBFTkRQCitfVEVYVCAgICAgRU5EUworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQzMgorOworOyBrbXBfaW50MzIKKzsgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MzIoIHZvbGF0aWxlIGttcF9pbnQzMiAqcCwga21wX2ludDMyIGN2LCBrbXBfaW50MzIgc3YgKTsKKzsKKworUFVCTElDICBfX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MzIKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorX3AkID0gNAorX2N2JCA9IDgKK19zdiQgPSAxMgorCitfX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MzIgUFJPQyBORUFSCisKKyAgICAgICAgbW92ICAgICAgIGVjeCwgRFdPUkQgUFRSIF9wJFtlc3BdCisgICAgICAgIG1vdiAgICAgICBlYXgsIERXT1JEIFBUUiBfY3YkW2VzcF0KKyAgICAgICAgbW92ICAgICAgIGVkeCwgRFdPUkQgUFRSIF9zdiRbZXNwXQorbG9jayAgICBjbXB4Y2hnICAgRFdPUkQgUFRSIFtlY3hdLCBlZHgKKyAgICAgICAgcmV0CisKK19fX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQzMiBFTkRQCitfVEVYVCAgICAgRU5EUworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ2NAorOworOyBrbXBfaW50NjQKKzsgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0NjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IGN2LCBrbXBfaW50NjQgc3YgKTsKKzsKKworUFVCTElDICBfX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0NjQKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorX3AkID0gOAorX2N2X2xvdyQgPSAxMgorX2N2X2hpZ2gkID0gMTYKK19zdl9sb3ckID0gMjAKK19zdl9oaWdoJCA9IDI0CisKK19fX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ2NCBQUk9DIE5FQVIKKworICAgICAgICBwdXNoICAgICAgZWJwCisgICAgICAgIG1vdiAgICAgICBlYnAsIGVzcAorICAgICAgICBwdXNoICAgICAgZWJ4CisgICAgICAgIHB1c2ggICAgICBlZGkKKyAgICAgICAgbW92ICAgICAgIGVkaSwgRFdPUkQgUFRSIF9wJFtlYnBdCisgICAgICAgIG1vdiAgICAgICBlYXgsIERXT1JEIFBUUiBfY3ZfbG93JFtlYnBdCisgICAgICAgIG1vdiAgICAgICBlZHgsIERXT1JEIFBUUiBfY3ZfaGlnaCRbZWJwXQorICAgICAgICBtb3YgICAgICAgZWJ4LCBEV09SRCBQVFIgX3N2X2xvdyRbZWJwXQorICAgICAgICBtb3YgICAgICAgZWN4LCBEV09SRCBQVFIgX3N2X2hpZ2gkW2VicF0KK2xvY2sgICAgY21weGNoZzhiIFFXT1JEIFBUUiBbZWRpXQorICAgICAgICBwb3AgICAgICAgZWRpCisgICAgICAgIHBvcCAgICAgICBlYngKKyAgICAgICAgbW92ICAgICAgIGVzcCwgZWJwCisgICAgICAgIHBvcCAgICAgICBlYnAKKyAgICAgICAgcmV0CisKK19fX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ2NCBFTkRQCitfVEVYVCAgICAgRU5EUworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fX2ttcF9sb2FkX3g4N19mcHVfY29udHJvbF93b3JkCis7Cis7IHZvaWQKKzsgX19rbXBfbG9hZF94ODdfZnB1X2NvbnRyb2xfd29yZCgga21wX2ludDE2ICpwICk7Cis7Cis7IHBhcmFtZXRlcnM6Cis7ICAgICAgIHA6ICAgICAgNCglZXNwKQorCitQVUJMSUMgIF9fX2ttcF9sb2FkX3g4N19mcHVfY29udHJvbF93b3JkCitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19wJCA9IDQKKworX19fa21wX2xvYWRfeDg3X2ZwdV9jb250cm9sX3dvcmQgUFJPQyBORUFSCisKKyAgICAgICAgbW92ICAgICAgIGVheCwgRFdPUkQgUFRSIF9wJFtlc3BdCisgICAgICAgIGZsZGN3ICAgICBXT1JEIFBUUiBbZWF4XQorICAgICAgICByZXQKKworX19fa21wX2xvYWRfeDg3X2ZwdV9jb250cm9sX3dvcmQgRU5EUAorX1RFWFQgICAgIEVORFMKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX19rbXBfc3RvcmVfeDg3X2ZwdV9jb250cm9sX3dvcmQKKzsKKzsgdm9pZAorOyBfX2ttcF9zdG9yZV94ODdfZnB1X2NvbnRyb2xfd29yZCgga21wX2ludDE2ICpwICk7Cis7Cis7IHBhcmFtZXRlcnM6Cis7ICAgICAgIHA6ICAgICAgNCglZXNwKQorCitQVUJMSUMgIF9fX2ttcF9zdG9yZV94ODdfZnB1X2NvbnRyb2xfd29yZAorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CitfcCQgPSA0CisKK19fX2ttcF9zdG9yZV94ODdfZnB1X2NvbnRyb2xfd29yZCBQUk9DIE5FQVIKKworICAgICAgICBtb3YgICAgICAgZWF4LCBEV09SRCBQVFIgX3AkW2VzcF0KKyAgICAgICAgZnN0Y3cgICAgIFdPUkQgUFRSIFtlYXhdCisgICAgICAgIHJldAorCitfX19rbXBfc3RvcmVfeDg3X2ZwdV9jb250cm9sX3dvcmQgRU5EUAorX1RFWFQgICAgIEVORFMKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX19rbXBfY2xlYXJfeDg3X2ZwdV9zdGF0dXNfd29yZAorOworOyB2b2lkCis7IF9fa21wX2NsZWFyX3g4N19mcHVfc3RhdHVzX3dvcmQoKTsKKzsKKworUFVCTElDICBfX19rbXBfY2xlYXJfeDg3X2ZwdV9zdGF0dXNfd29yZAorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CisKK19fX2ttcF9jbGVhcl94ODdfZnB1X3N0YXR1c193b3JkIFBST0MgTkVBUgorCisgICAgICAgIGZuY2xleAorICAgICAgICByZXQKKworX19fa21wX2NsZWFyX3g4N19mcHVfc3RhdHVzX3dvcmQgRU5EUAorX1RFWFQgICAgIEVORFMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fX2ttcF9pbnZva2VfbWljcm90YXNrCis7Cis7IHR5cGVkZWYgdm9pZCAgKCptaWNyb3Rhc2tfdCkoIGludCAqZ3RpZCwgaW50ICp0aWQsIC4uLiApOworOworOyBpbnQKKzsgX19rbXBfaW52b2tlX21pY3JvdGFzayggbWljcm90YXNrX3QgcGtmbiwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGd0aWQsIGludCB0aWQsCis7ICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhcmdjLCB2b2lkICpwX2FyZ3ZbXSApCis7CisKK1BVQkxJQyAgX19fa21wX2ludm9rZV9taWNyb3Rhc2sKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorX3BrZm4kID0gOAorX2d0aWQkID0gMTIKK190aWQkID0gMTYKK19hcmdjJCA9IDIwCitfYXJndiQgPSAyNAorX2kkID0gLTgKK19zdGtfYWRqJCA9IC0xNgorX3ZwdHIkID0gLTEyCitfcXB0ciQgPSAtNAorCitfX19rbXBfaW52b2tlX21pY3JvdGFzayBQUk9DIE5FQVIKKzsgTGluZSAxMDIKKyAgICAgICAgcHVzaCAgICBlYnAKKyAgICAgICAgbW92ICAgICBlYnAsIGVzcAorICAgICAgICBzdWIgICAgIGVzcCwgMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IDAwMDAwMDEwSAorICAgICAgICBwdXNoICAgIGVieAorICAgICAgICBwdXNoICAgIGVzaQorICAgICAgICBwdXNoICAgIGVkaQorOyBMaW5lIDExNAorICAgICAgICBtb3YgICAgIGVheCwgRFdPUkQgUFRSIF9hcmdjJFtlYnBdCisgICAgICAgIG1vdiAgICAgRFdPUkQgUFRSIF9pJFtlYnBdLCBlYXgKKworOzsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJbGVhICAgICBlZHgsIERXT1JEIFBUUiBbZWF4KjQrOF0KKwltb3YgICAgIGVjeCwgZXNwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IFNhdmUgY3VycmVudCBTUCBpbnRvIEVDWAorCW1vdgllYXgsZWR4CQk7IFNhdmUgdGhlIHNpemUgb2YgdGhlIGFyZ3MgaW4gZWF4CisJc3ViCWVjeCxlZHgJCTsgZXNwLSgoI2FyZ3MrMikqNCkgLT4gZWN4IC0tIHdpdGhvdXQgbW9kcywgc3RhY2sgcHRyIHdvdWxkIGJlIHRoaXMKKwltb3YJZWR4LGVjeAkJOyBTYXZlIHRvIGVkeAorCWFuZAllY3gsLTEyOAk7IE1hc2sgb2ZmIDcgYml0cworCXN1YgllZHgsZWN4CQk7IEFtb3VudCB0byBzdWJ0cmFjdCBmcm9tIGVzcAorCXN1Ygllc3AsZWR4CQk7IFByZXBhcmUgc3RhY2sgcHRyLS0gTm93IGl0IHdpbGwgYmUgYWxpZ25lZCBvbiAxMjgtYnl0ZSBib3VuZGFyeSBhdCB0aGUgY2FsbAorCisJYWRkCWVkeCxlYXgJCTsgQ2FsY3VsYXRlIHRvdGFsIHNpemUgb2YgdGhlIHN0YWNrIGRlY3JlbWVudC4KKyAgICAgICAgbW92ICAgICBEV09SRCBQVFIgX3N0a19hZGokW2VicF0sIGVkeAorOzsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgam1wICAgICBTSE9SVCAkTDIyMjM3CiskTDIyMjM4OgorICAgICAgICBtb3YgICAgIGVjeCwgRFdPUkQgUFRSIF9pJFtlYnBdCisgICAgICAgIHN1YiAgICAgZWN4LCAxCisgICAgICAgIG1vdiAgICAgRFdPUkQgUFRSIF9pJFtlYnBdLCBlY3gKKyRMMjIyMzc6CisgICAgICAgIGNtcCAgICAgRFdPUkQgUFRSIF9pJFtlYnBdLCAwCisgICAgICAgIGpsZSAgICAgU0hPUlQgJEwyMjIzOQorOyBMaW5lIDExNgorICAgICAgICBtb3YgICAgIGVkeCwgRFdPUkQgUFRSIF9pJFtlYnBdCisgICAgICAgIG1vdiAgICAgZWF4LCBEV09SRCBQVFIgX2FyZ3YkW2VicF0KKyAgICAgICAgbW92ICAgICBlY3gsIERXT1JEIFBUUiBbZWF4K2VkeCo0LTRdCisgICAgICAgIG1vdiAgICAgRFdPUkQgUFRSIF92cHRyJFtlYnBdLCBlY3gKKzsgTGluZSAxMjMKKyAgICAgICAgbW92ICAgICBlYXgsIERXT1JEIFBUUiBfdnB0ciRbZWJwXQorOyBMaW5lIDEyNAorICAgICAgICBwdXNoICAgIGVheAorOyBMaW5lIDEyNworICAgICAgICBqbXAgICAgIFNIT1JUICRMMjIyMzgKKyRMMjIyMzk6Cis7IExpbmUgMTI5CisgICAgICAgIGxlYSAgICAgZWR4LCBEV09SRCBQVFIgX3RpZCRbZWJwXQorICAgICAgICBtb3YgICAgIERXT1JEIFBUUiBfdnB0ciRbZWJwXSwgZWR4Cis7IExpbmUgMTMwCisgICAgICAgIGxlYSAgICAgZWF4LCBEV09SRCBQVFIgX2d0aWQkW2VicF0KKyAgICAgICAgbW92ICAgICBEV09SRCBQVFIgX3FwdHIkW2VicF0sIGVheAorOyBMaW5lIDE0MworICAgICAgICBtb3YgICAgIGVheCwgRFdPUkQgUFRSIF92cHRyJFtlYnBdCis7IExpbmUgMTQ0CisgICAgICAgIHB1c2ggICAgZWF4Cis7IExpbmUgMTQ1CisgICAgICAgIG1vdiAgICAgZWF4LCBEV09SRCBQVFIgX3FwdHIkW2VicF0KKzsgTGluZSAxNDYKKyAgICAgICAgcHVzaCAgICBlYXgKKzsgTGluZSAxNDcKKyAgICAgICAgY2FsbCAgICBEV09SRCBQVFIgX3BrZm4kW2VicF0KKzsgTGluZSAxNDgKKyAgICAgICAgYWRkICAgICBlc3AsIERXT1JEIFBUUiBfc3RrX2FkaiRbZWJwXQorOyBMaW5lIDE1MgorICAgICAgICBtb3YgICAgIGVheCwgMQorOyBMaW5lIDE1MworICAgICAgICBwb3AgICAgIGVkaQorICAgICAgICBwb3AgICAgIGVzaQorICAgICAgICBwb3AgICAgIGVieAorICAgICAgICBtb3YgICAgIGVzcCwgZWJwCisgICAgICAgIHBvcCAgICAgZWJwCisgICAgICAgIHJldCAgICAgMAorX19fa21wX2ludm9rZV9taWNyb3Rhc2sgRU5EUAorX1RFWFQgICBFTkRTCisKK2VuZGlmCisKKzsgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEludGVsKFIpIDY0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2lmZGVmIF9NX0FNRDY0CisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19rbXBfeDg2X2NwdWlkCis7Cis7IHZvaWQKKzsgX19rbXBfeDg2X2NwdWlkKCBpbnQgbW9kZSwgaW50IG1vZGUyLCBzdHJ1Y3Qga21wX2NwdWlkICpwICk7Cis7Cis7IHBhcmFtZXRlcnM6Cis7CW1vZGU6CQllY3gKKzsJbW9kZTI6CQllZHgKKzsJY3B1aWRfYnVmZmVyOiAJcjgKKworUFVCTElDICBfX2ttcF94ODZfY3B1aWQKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorCitfX2ttcF94ODZfY3B1aWQgUFJPQyBGUkFNRSA7TkVBUgorCisgICAgICAgIHB1c2ggICAgICByYnAKKyAgICAgICAgLnB1c2hyZWcgIHJicAorICAgICAgICBtb3YgICAgICAgcmJwLCByc3AKKyAgICAgICAgLnNldGZyYW1lIHJicCwgMAorICAgICAgICBwdXNoICAgICAgcmJ4CQkJCTsgY2FsbGVlLXNhdmUgcmVnaXN0ZXIKKyAgICAgICAgLnB1c2hyZWcgIHJieAorICAgICAgICAuRU5EUFJPTE9HCisKKwltb3YJICByMTAsIHI4ICAgICAgICAgICAgICAgICAgICAgICA7IHAgcGFyYW1ldGVyCisgICAgICAgIG1vdgkgIGVheCwgZWN4CQkJOyBtb2RlIHBhcmFtZXRlcgorICAgICAgICBtb3YJICBlY3gsIGVkeCAgICAgICAgICAgICAgICAgICAgICA7IG1vZGUyIHBhcmFtZXRlcgorCWNwdWlkCQkJCQk7IFF1ZXJ5IHRoZSBDUFVJRCBmb3IgdGhlIGN1cnJlbnQgcHJvY2Vzc29yCisKKwltb3YgCSAgRFdPUkQgUFRSIDBbIHIxMCBdLCBlYXgJOyBzdG9yZSByZXN1bHRzIGludG8gYnVmZmVyCisJbW92IAkgIERXT1JEIFBUUiA0WyByMTAgXSwgZWJ4CisJbW92IAkgIERXT1JEIFBUUiA4WyByMTAgXSwgZWN4CisJbW92IAkgIERXT1JEIFBUUiAxMlsgcjEwIF0sIGVkeAorCisgICAgICAgIHBvcCAgICAgICByYngJCQkJOyBjYWxsZWUtc2F2ZSByZWdpc3RlcgorICAgICAgICBtb3YgICAgICAgcnNwLCByYnAKKyAgICAgICAgcG9wICAgICAgIHJicAorICAgICAgICByZXQKKworX19rbXBfeDg2X2NwdWlkIEVORFAKK19URVhUICAgICBFTkRTCisKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX2ttcF90ZXN0X3RoZW5fYWRkMzIKKzsKKzsga21wX2ludDMyCis7IF9fa21wX3Rlc3RfdGhlbl9hZGQzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgZCApOworOworOyBwYXJhbWV0ZXJzOgorOwlwOglyY3gKKzsJZDoJZWR4Cis7Cis7IHJldHVybjogCWVheAorCitQVUJMSUMgIF9fa21wX3Rlc3RfdGhlbl9hZGQzMgorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CitfX2ttcF90ZXN0X3RoZW5fYWRkMzIgUFJPQyA7TkVBUgorCisgICAgICAgIG1vdiAgICAgZWF4LCBlZHgKK2xvY2sgICAgeGFkZCAgICBEV09SRCBQVFIgW3JjeF0sIGVheAorICAgICAgICByZXQKKworX19rbXBfdGVzdF90aGVuX2FkZDMyIEVORFAKK19URVhUICAgRU5EUworCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19rbXBfdGVzdF90aGVuX2FkZDY0Cis7Cis7IGttcF9pbnQzMgorOyBfX2ttcF90ZXN0X3RoZW5fYWRkNjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IGQgKTsKKzsKKzsgcGFyYW1ldGVyczoKKzsJcDoJcmN4Cis7CWQ6CXJkeAorOworOyByZXR1cm46IAlyYXgKKworUFVCTElDICBfX2ttcF90ZXN0X3RoZW5fYWRkNjQKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorX19rbXBfdGVzdF90aGVuX2FkZDY0IFBST0MgO05FQVIKKworICAgICAgICBtb3YgICAgIHJheCwgcmR4Citsb2NrICAgIHhhZGQgICAgUVdPUkQgUFRSIFtyY3hdLCByYXgKKyAgICAgICAgcmV0CisKK19fa21wX3Rlc3RfdGhlbl9hZGQ2NCBFTkRQCitfVEVYVCAgIEVORFMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlOAorOworOyBrbXBfaW50OAorOyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTgoIHZvbGF0aWxlIGttcF9pbnQ4ICpwLCBrbXBfaW50OCBjdiwga21wX2ludDggc3YgKTsKKzsgcGFyYW1ldGVyczoKKzsJcDoJcmN4Cis7CWN2OgllZHgKKzsJc3Y6CXI4ZAorOworOyByZXR1cm46CWVheAorCitQVUJMSUMgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlOAorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CisKK19fa21wX2NvbXBhcmVfYW5kX3N0b3JlOCBQUk9DIDtORUFSCisKKyAgICAgICAgbW92ICAgICAgIGFsLCBkbAk7ICJjdiIKKwltb3YJICBlZHgsIHI4ZAk7ICJzdiIKK2xvY2sgICAgY21weGNoZyAgIEJZVEUgUFRSIFtyY3hdLCBkbAorICAgICAgICBzZXRlICAgICAgYWwgICAgICAgICAgIAk7IGlmIGFsID09IFtyY3hdIHNldCBhbCA9IDEgZWxzZSBzZXQgYWwgPSAwCisgICAgICAgIGFuZCAgICAgICByYXgsIDEgICAgICAgCTsgc2lnbiBleHRlbmQgcHJldmlvdXMgaW5zdHJ1Y3Rpb24KKyAgICAgICAgcmV0CisKK19fa21wX2NvbXBhcmVfYW5kX3N0b3JlOCBFTkRQCitfVEVYVCAgICAgRU5EUworCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19rbXBfY29tcGFyZV9hbmRfc3RvcmUxNgorOworOyBrbXBfaW50MTYKKzsgX19rbXBfY29tcGFyZV9hbmRfc3RvcmUxNiggdm9sYXRpbGUga21wX2ludDE2ICpwLCBrbXBfaW50MTYgY3YsIGttcF9pbnQxNiBzdiApOworOyBwYXJhbWV0ZXJzOgorOwlwOglyY3gKKzsJY3Y6CWVkeAorOwlzdjoJcjhkCis7Cis7IHJldHVybjoJZWF4CisKK1BVQkxJQyAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmUxNgorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CisKK19fa21wX2NvbXBhcmVfYW5kX3N0b3JlMTYgUFJPQyA7TkVBUgorCisgICAgICAgIG1vdiAgICAgICBheCwgZHgJOyAiY3YiCisJbW92CSAgZWR4LCByOGQJOyAic3YiCitsb2NrICAgIGNtcHhjaGcgICBXT1JEIFBUUiBbcmN4XSwgZHgKKyAgICAgICAgc2V0ZSAgICAgIGFsICAgICAgICAgICAJOyBpZiBheCA9PSBbcmN4XSBzZXQgYWwgPSAxIGVsc2Ugc2V0IGFsID0gMAorICAgICAgICBhbmQgICAgICAgcmF4LCAxICAgICAgIAk7IHNpZ24gZXh0ZW5kIHByZXZpb3VzIGluc3RydWN0aW9uCisgICAgICAgIHJldAorCitfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTE2IEVORFAKK19URVhUICAgICBFTkRTCisKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTMyCis7Cis7IGttcF9pbnQzMgorOyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiBjdiwga21wX2ludDMyIHN2ICk7Cis7IHBhcmFtZXRlcnM6Cis7CXA6CXJjeAorOwljdjoJZWR4Cis7CXN2OglyOGQKKzsKKzsgcmV0dXJuOgllYXgKKworUFVCTElDICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTMyCitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKKworX19rbXBfY29tcGFyZV9hbmRfc3RvcmUzMiBQUk9DIDtORUFSCisKKyAgICAgICAgbW92ICAgICAgIGVheCwgZWR4CTsgImN2IgorCW1vdgkgIGVkeCwgcjhkCTsgInN2IgorbG9jayAgICBjbXB4Y2hnICAgRFdPUkQgUFRSIFtyY3hdLCBlZHgKKyAgICAgICAgc2V0ZSAgICAgIGFsICAgICAgICAgICAJOyBpZiBlYXggPT0gW3JjeF0gc2V0IGFsID0gMSBlbHNlIHNldCBhbCA9IDAKKyAgICAgICAgYW5kICAgICAgIHJheCwgMSAgICAgICAJOyBzaWduIGV4dGVuZCBwcmV2aW91cyBpbnN0cnVjdGlvbgorICAgICAgICByZXQKKworX19rbXBfY29tcGFyZV9hbmRfc3RvcmUzMiBFTkRQCitfVEVYVCAgICAgRU5EUworCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19rbXBfY29tcGFyZV9hbmRfc3RvcmU2NAorOworOyBrbXBfaW50MzIKKzsgX19rbXBfY29tcGFyZV9hbmRfc3RvcmU2NCggdm9sYXRpbGUga21wX2ludDY0ICpwLCBrbXBfaW50NjQgY3YsIGttcF9pbnQ2NCBzdiApOworOyBwYXJhbWV0ZXJzOgorOwlwOglyY3gKKzsJY3Y6CXJkeAorOwlzdjoJcjgKKzsKKzsgcmV0dXJuOgllYXgKKworUFVCTElDICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTY0CitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKKworX19rbXBfY29tcGFyZV9hbmRfc3RvcmU2NCBQUk9DIDtORUFSCisKKyAgICAgICAgbW92ICAgICAgIHJheCwgcmR4CTsgImN2IgorCW1vdgkgIHJkeCwgcjgJOyAic3YiCitsb2NrICAgIGNtcHhjaGcgICBRV09SRCBQVFIgW3JjeF0sIHJkeAorICAgICAgICBzZXRlICAgICAgYWwgICAgICAgICAgIDsgaWYgcmF4ID09IFtyY3hdIHNldCBhbCA9IDEgZWxzZSBzZXQgYWwgPSAwCisgICAgICAgIGFuZCAgICAgICByYXgsIDEgICAgICAgOyBzaWduIGV4dGVuZCBwcmV2aW91cyBpbnN0cnVjdGlvbgorICAgICAgICByZXQKKworX19rbXBfY29tcGFyZV9hbmRfc3RvcmU2NCBFTkRQCitfVEVYVCAgICAgRU5EUworCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19fa21wX3hjaGdfZml4ZWQ4Cis7Cis7IGttcF9pbnQ4Cis7IF9fa21wX3hjaGdfZml4ZWQ4KCB2b2xhdGlsZSBrbXBfaW50OCAqcCwga21wX2ludDggZCApOworOworOyBwYXJhbWV0ZXJzOgorOwlwOglyY3gKKzsJZDoJZGwKKzsKKzsgcmV0dXJuOiAJYWwKKworUFVCTElDICBfX2ttcF94Y2hnX2ZpeGVkOAorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CisKK19fa21wX3hjaGdfZml4ZWQ4IFBST0MgO05FQVIKKworICAgICAgICBtb3YgICAgICAgYWwsICBkbAorbG9jayAgICB4Y2hnICAgICAgQllURSBQVFIgW3JjeF0sIGFsCisgICAgICAgIHJldAorCitfX2ttcF94Y2hnX2ZpeGVkOCBFTkRQCitfVEVYVCAgICAgRU5EUworCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19fa21wX3hjaGdfZml4ZWQxNgorOworOyBrbXBfaW50MTYKKzsgX19rbXBfeGNoZ19maXhlZDE2KCB2b2xhdGlsZSBrbXBfaW50MTYgKnAsIGttcF9pbnQxNiBkICk7Cis7Cis7IHBhcmFtZXRlcnM6Cis7CXA6CXJjeAorOwlkOglkeAorOworOyByZXR1cm46IAlheAorCitQVUJMSUMgIF9fa21wX3hjaGdfZml4ZWQxNgorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CisKK19fa21wX3hjaGdfZml4ZWQxNiBQUk9DIDtORUFSCisKKyAgICAgICAgbW92ICAgICAgIGF4LCAgZHgKK2xvY2sgICAgeGNoZyAgICAgIFdPUkQgUFRSIFtyY3hdLCBheAorICAgICAgICByZXQKKworX19rbXBfeGNoZ19maXhlZDE2IEVORFAKK19URVhUICAgICBFTkRTCisKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX19rbXBfeGNoZ19maXhlZDMyCis7Cis7IGttcF9pbnQzMgorOyBfX2ttcF94Y2hnX2ZpeGVkMzIoIHZvbGF0aWxlIGttcF9pbnQzMiAqcCwga21wX2ludDMyIGQgKTsKKzsKKzsgcGFyYW1ldGVyczoKKzsJcDoJcmN4Cis7CWQ6CWVkeAorOworOyByZXR1cm46IAllYXgKKworUFVCTElDICBfX2ttcF94Y2hnX2ZpeGVkMzIKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorX19rbXBfeGNoZ19maXhlZDMyIFBST0MgO05FQVIKKworICAgICAgICBtb3YgICAgIGVheCwgZWR4Citsb2NrICAgIHhjaGcgICAgRFdPUkQgUFRSIFtyY3hdLCBlYXgKKyAgICAgICAgcmV0CisKK19fa21wX3hjaGdfZml4ZWQzMiBFTkRQCitfVEVYVCAgIEVORFMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fX2ttcF94Y2hnX2ZpeGVkNjQKKzsKKzsga21wX2ludDY0Cis7IF9fa21wX3hjaGdfZml4ZWQ2NCggdm9sYXRpbGUga21wX2ludDY0ICpwLCBrbXBfaW50NjQgZCApOworOworOyBwYXJhbWV0ZXJzOgorOwlwOglyY3gKKzsJZDoJcmR4Cis7Cis7IHJldHVybjogCXJheAorCitQVUJMSUMgIF9fa21wX3hjaGdfZml4ZWQ2NAorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CitfX2ttcF94Y2hnX2ZpeGVkNjQgUFJPQyA7TkVBUgorCisgICAgICAgIG1vdiAgICAgcmF4LCByZHgKK2xvY2sgICAgeGNoZyAgICBRV09SRCBQVFIgW3JjeF0sIHJheAorICAgICAgICByZXQKKworX19rbXBfeGNoZ19maXhlZDY0IEVORFAKK19URVhUICAgRU5EUworCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0OAorOworOyBrbXBfaW50OAorOyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ4KCB2b2xhdGlsZSBrbXBfaW50OCAqcCwga21wX2ludDggY3YsIGttcF9pbnQ4IHN2ICk7Cis7IHBhcmFtZXRlcnM6Cis7CXA6CXJjeAorOwljdjoJZWR4Cis7CXN2OglyOGQKKzsKKzsgcmV0dXJuOgllYXgKKworUFVCTElDICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ4CitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKKworX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0OCBQUk9DIDtORUFSCisgICAgICAgIG1vdiAgICAgICBhbCwgZGwJOyAiY3YiCisJbW92CSAgZWR4LCByOGQJOyAic3YiCitsb2NrICAgIGNtcHhjaGcgICBCWVRFIFBUUiBbcmN4XSwgZGwKKyAgICAgICAgICAgICAgICAgICAgICAgIDsgQ29tcGFyZSBBTCB3aXRoIFtyY3hdLiAgSWYgZXF1YWwgc2V0CisgICAgICAgICAgICAgICAgICAgICAgICA7IFpGIGFuZCBleGNoYW5nZSBETCB3aXRoIFtyY3hdLiAgRWxzZSwgY2xlYXIKKyAgICAgICAgICAgICAgICAgICAgICAgIDsgWkYgYW5kIGxvYWQgW3JjeF0gaW50byBBTC4KKyAgICAgICAgcmV0CisKK19fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDggRU5EUAorX1RFWFQgICAgIEVORFMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDE2Cis7Cis7IGttcF9pbnQxNgorOyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQxNiggdm9sYXRpbGUga21wX2ludDE2ICpwLCBrbXBfaW50MTYgY3YsIGttcF9pbnQxNiBzdiApOworOyBwYXJhbWV0ZXJzOgorOwlwOglyY3gKKzsJY3Y6CWVkeAorOwlzdjoJcjhkCis7Cis7IHJldHVybjoJZWF4CisKK1BVQkxJQyAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MTYKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorCitfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQxNiBQUk9DIDtORUFSCisKKyAgICAgICAgbW92ICAgICAgIGF4LCBkeAk7ICJjdiIKKwltb3YJICBlZHgsIHI4ZAk7ICJzdiIKK2xvY2sgICAgY21weGNoZyAgIFdPUkQgUFRSIFtyY3hdLCBkeAorICAgICAgICByZXQKKworX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MTYgRU5EUAorX1RFWFQgICAgIEVORFMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDMyCis7Cis7IGttcF9pbnQzMgorOyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgY3YsIGttcF9pbnQzMiBzdiApOworOyBwYXJhbWV0ZXJzOgorOwlwOglyY3gKKzsJY3Y6CWVkeAorOwlzdjoJcjhkCis7Cis7IHJldHVybjoJZWF4CisKK1BVQkxJQyAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MzIKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorCitfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQzMiBQUk9DIDtORUFSCisKKyAgICAgICAgbW92ICAgICAgIGVheCwgZWR4CTsgImN2IgorCW1vdgkgIGVkeCwgcjhkCTsgInN2IgorbG9jayAgICBjbXB4Y2hnICAgRFdPUkQgUFRSIFtyY3hdLCBlZHgKKyAgICAgICAgcmV0CisKK19fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDMyIEVORFAKK19URVhUICAgICBFTkRTCisKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ2NAorOworOyBrbXBfaW50NjQKKzsgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0NjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IGN2LCBrbXBfaW50NjQgc3YgKTsKKzsgcGFyYW1ldGVyczoKKzsJcDoJcmN4Cis7CWN2OglyZHgKKzsJc3Y6CXI4Cis7Cis7IHJldHVybjoJcmF4CisKK1BVQkxJQyAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0NjQKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorCitfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ2NCBQUk9DIDtORUFSCisKKyAgICAgICAgbW92ICAgICAgIHJheCwgcmR4CTsgImN2IgorCW1vdgkgIHJkeCwgcjgJOyAic3YiCitsb2NrICAgIGNtcHhjaGcgICBRV09SRCBQVFIgW3JjeF0sIHJkeAorICAgICAgICByZXQKKworX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0NjQgRU5EUAorX1RFWFQgICAgIEVORFMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX2xvb3A4Cis7Cis7IGttcF9pbnQ4Cis7IF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX2xvb3A4KCB2b2xhdGlsZSBrbXBfaW50OCAqcCwga21wX2ludDggY3YsIGttcF9pbnQ4IHN2ICk7Cis7IHBhcmFtZXRlcnM6Cis7CXA6CXJjeAorOwljdjoJZWR4Cis7CXN2OglyOGQKKzsKKzsgcmV0dXJuOglhbAorCitQVUJMSUMgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX2xvb3A4CitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKKworX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfbG9vcDggUFJPQyA7TkVBUgorJF9fa21wX2xvb3A6CisgICAgICAgIG1vdiAgICAgICBhbCwgZGwJOyAiY3YiCisJbW92CSAgZWR4LCByOGQJOyAic3YiCitsb2NrICAgIGNtcHhjaGcgICBCWVRFIFBUUiBbcmN4XSwgZGwKKyAgICAgICAgICAgICAgICAgICAgICAgIDsgQ29tcGFyZSBBTCB3aXRoIFtyY3hdLiAgSWYgZXF1YWwgc2V0CisgICAgICAgICAgICAgICAgICAgICAgICA7IFpGIGFuZCBleGNoYW5nZSBETCB3aXRoIFtyY3hdLiAgRWxzZSwgY2xlYXIKKyAgICAgICAgICAgICAgICAgICAgICAgIDsgWkYgYW5kIGxvYWQgW3JjeF0gaW50byBBTC4KKyAgICAgICAganogICAgIAlTSE9SVCAkX19rbXBfc3VjY2VzcworCisgICAgICAgIGRiICAgICAgMGYzSAorICAgICAgICBkYiAgICAgIDA5MEggICAgCQk7IHBhdXNlCisKKwlqbXAJU0hPUlQgJF9fa21wX2xvb3AKKworJF9fa21wX3N1Y2Nlc3M6CisgICAgICAgIHJldAorCitfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9sb29wOCBFTkRQCitfVEVYVCAgICAgRU5EUworCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19rbXBfeGNoZ19yZWFsMzIKKzsKKzsga21wX3JlYWwzMgorOyBfX2ttcF94Y2hnX3JlYWwzMiggdm9sYXRpbGUga21wX3JlYWwzMiAqcCwga21wX3JlYWwzMiBkICk7Cis7Cis7IHBhcmFtZXRlcnM6Cis7CXA6CXJjeAorOyAgICAgICBkOgl4bW0xIChsb3dlciA0IGJ5dGVzKQorOworOyByZXR1cm46CXhtbTAgKGxvd2VyIDQgYnl0ZXMpCisKK1BVQkxJQyAgX19rbXBfeGNoZ19yZWFsMzIKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorX19rbXBfeGNoZ19yZWFsMzIgUFJPQyA7TkVBUgorCisJbW92ZAllYXgsIHhtbTEJCTsgbG9hZCBkCisKK2xvY2sgICAgeGNoZyAgICBEV09SRCBQVFIgW3JjeF0sIGVheAorCisJbW92ZAl4bW0wLCBlYXgJCTsgbG9hZCBvbGQgdmFsdWUgaW50byByZXR1cm4gcmVnaXN0ZXIKKyAgICAgICAgcmV0CisKK19fa21wX3hjaGdfcmVhbDMyIEVORFAKK19URVhUICAgRU5EUworCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19rbXBfeGNoZ19yZWFsNjQKKzsKKzsga21wX3JlYWw2NAorOyBfX2ttcF94Y2hnX3JlYWw2NCggdm9sYXRpbGUga21wX3JlYWw2NCAqcCwga21wX3JlYWw2NCBkICk7Cis7Cis7IHBhcmFtZXRlcnM6Cis7CXA6CXJjeAorOwlkOgl4bW0xIChsb3dlciA4IGJ5dGVzKQorOworOyByZXR1cm46CXhtbTAgKGxvd2VyIDggYnl0ZXMpCisKK1BVQkxJQyAgX19rbXBfeGNoZ19yZWFsNjQKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorX19rbXBfeGNoZ19yZWFsNjQgUFJPQyA7TkVBUgorCisJbW92ZAlyYXgsIHhtbTEJCTsgbG9hZCAiZCIKKworbG9jayAgICB4Y2hnICAgIFFXT1JEIFBUUiBbcmN4XSwgcmF4CisKKwltb3ZkCXhtbTAsIHJheAkJOyBsb2FkIG9sZCB2YWx1ZSBpbnRvIHJldHVybiByZWdpc3RlcgorICAgICAgICByZXQKKworX19rbXBfeGNoZ19yZWFsNjQgRU5EUAorX1RFWFQgICBFTkRTCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19rbXBfbG9hZF94ODdfZnB1X2NvbnRyb2xfd29yZAorOworOyB2b2lkCis7IF9fa21wX2xvYWRfeDg3X2ZwdV9jb250cm9sX3dvcmQoIGttcF9pbnQxNiAqcCApOworOworOyBwYXJhbWV0ZXJzOgorOwlwOglyY3gKKzsKKworUFVCTElDICBfX2ttcF9sb2FkX3g4N19mcHVfY29udHJvbF93b3JkCitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19fa21wX2xvYWRfeDg3X2ZwdV9jb250cm9sX3dvcmQgUFJPQyA7TkVBUgorCisgICAgICAgIGZsZGN3ICAgV09SRCBQVFIgW3JjeF0KKyAgICAgICAgcmV0CisKK19fa21wX2xvYWRfeDg3X2ZwdV9jb250cm9sX3dvcmQgRU5EUAorX1RFWFQgICBFTkRTCisKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX2ttcF9zdG9yZV94ODdfZnB1X2NvbnRyb2xfd29yZAorOworOyB2b2lkCis7IF9fa21wX3N0b3JlX3g4N19mcHVfY29udHJvbF93b3JkKCBrbXBfaW50MTYgKnAgKTsKKzsKKzsgcGFyYW1ldGVyczoKKzsJcDoJcmN4Cis7CisKK1BVQkxJQyAgX19rbXBfc3RvcmVfeDg3X2ZwdV9jb250cm9sX3dvcmQKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorX19rbXBfc3RvcmVfeDg3X2ZwdV9jb250cm9sX3dvcmQgUFJPQyA7TkVBUgorCisgICAgICAgIGZzdGN3ICAgV09SRCBQVFIgW3JjeF0KKyAgICAgICAgcmV0CisKK19fa21wX3N0b3JlX3g4N19mcHVfY29udHJvbF93b3JkIEVORFAKK19URVhUICAgRU5EUworCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19rbXBfY2xlYXJfeDg3X2ZwdV9zdGF0dXNfd29yZAorOworOyB2b2lkCis7IF9fa21wX2NsZWFyX3g4N19mcHVfc3RhdHVzX3dvcmQoKQorOworCitQVUJMSUMgIF9fa21wX2NsZWFyX3g4N19mcHVfc3RhdHVzX3dvcmQKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorX19rbXBfY2xlYXJfeDg3X2ZwdV9zdGF0dXNfd29yZCBQUk9DIDtORUFSCisKKyAgICAgICAgZm5jbGV4CisgICAgICAgIHJldAorCitfX2ttcF9jbGVhcl94ODdfZnB1X3N0YXR1c193b3JkIEVORFAKK19URVhUICAgRU5EUworCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19rbXBfaW52b2tlX21pY3JvdGFzaworOworOyB0eXBlZGVmIHZvaWQgICgqbWljcm90YXNrX3QpKCBpbnQgKmd0aWQsIGludCAqdGlkLCAuLi4gKTsKKzsKKzsgaW50Cis7IF9fa21wX2ludm9rZV9taWNyb3Rhc2soIG1pY3JvdGFza190IHBrZm4sCis7ICAgICAgICAgICAgICAgICAgICAgICAgIGludCBndGlkLCBpbnQgdGlkLAorOyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXJnYywgdm9pZCAqcF9hcmd2W10gKSB7Cis7Cis7ICAgICAoKnBrZm4pICggJmd0aWQsICZ0aWQsIGFyZ3ZbMF0sIC4uLiApOworOyAgICAgcmV0dXJuIDE7Cis7IH0KKzsKKzsgbm90ZToKKzsgICAgICBqdXN0IGJlZm9yZSBjYWxsIHRvIHBrZm4gbXVzdCBoYXZlIHJzcCAxMjgtYnl0ZSBhbGlnbmVkIGZvciBjb21waWxlcgorOworOyBwYXJhbWV0ZXJzOgorOyAgICAgIHJjeDogICBwa2ZuCTE2W3JicF0KKzsgICAgICBlZHg6ICAgZ3RpZAkyNFtyYnBdCis7ICAgICAgcjhkOiAgIHRpZAkzMltyYnBdCis7ICAgICAgcjlkOiAgIGFyZ2MJNDBbcmJwXQorOyAgICAgIFtzdF06ICBwX2FyZ3YJNDhbcmJwXQorOworOyByZWcgdGVtcHM6Cis7ICAgICAgcmF4OiAgIHVzZWQgYWxsIG92ZXIgdGhlIHBsYWNlCis7ICAgICAgcmR4OiAgIHVzZWQgYWxsIG92ZXIgdGhlIHBsYWNlCis7ICAgICAgcmN4OiAgIHVzZWQgYXMgYXJndW1lbnQgY291bnRlciBmb3IgcHVzaCBwYXJtcyBsb29wCis7ICAgICAgcjEwOiAgIHVzZWQgdG8gaG9sZCBwa2ZuIGZ1bmN0aW9uIHBvaW50ZXIgYXJndW1lbnQKKzsKKzsgcmV0dXJuOiAgICAgIGVheCAgICAoYWx3YXlzIDEvVFJVRSkKKzsKKworJF9wa2ZuICAgPSAxNgorJF9ndGlkICAgPSAyNAorJF90aWQgICAgPSAzMgorJF9hcmdjICAgPSA0MAorJF9wX2FyZ3YgPSA0OAorCitQVUJMSUMgIF9fa21wX2ludm9rZV9taWNyb3Rhc2sKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorCitfX2ttcF9pbnZva2VfbWljcm90YXNrIFBST0MgRlJBTUUgO05FQVIKKwltb3YJUVdPUkQgUFRSIDE2W3JzcF0sIHJkeAk7IGhvbWUgZ3RpZCBwYXJhbWV0ZXIKKwltb3YgCVFXT1JEIFBUUiAyNFtyc3BdLCByOAk7IGhvbWUgdGlkIHBhcmFtZXRlcgorICAgICAgICBwdXNoICAgIHJicAkJOyBzYXZlIGJhc2UgcG9pbnRlcgorICAgICAgICAucHVzaHJlZyByYnAKKwlzdWIJcnNwLCAwCQk7IG5vIGZpeGVkIGFsbG9jYXRpb24gbmVjZXNzYXJ5IC0gZW5kIHByb2xvZworCisgICAgICAgIGxlYSAgICAgcmJwLCBRV09SRCBQVFIgW3JzcF0gICAJOyBlc3RhYmxpc2ggdGhlIGJhc2UgcG9pbnRlcgorICAgICAgICAuc2V0ZnJhbWUgcmJwLCAwCisgICAgICAgIC5FTkRQUk9MT0cKKwltb3YJcjEwLCByY3gJOyBzYXZlIHBrZm4gcG9pbnRlciBmb3IgbGF0ZXIKKworOzsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIG1vdiAgICAgcmF4LCByOQkJOyByYXggPD0gYXJnYworICAgICAgICBjbXAgICAgIHJheCwgMgorICAgICAgICBqZ2UgICAgIFNIT1JUICRfa21wX2ludm9rZV9zdGFja19hbGlnbgorICAgICAgICBtb3YgICAgIHJheCwgMiAgICAgICAgICA7IHNldCA0IGhvbWVzIGlmIGxlc3MgdGhhbiAyIHBhcm1zCiskX2ttcF9pbnZva2Vfc3RhY2tfYWxpZ246CisJbGVhICAgICByZHgsIFFXT1JEIFBUUiBbcmF4KjgrMTZdIDsgcmF4IDw9IChhcmdjICsgMikgKiA4CisJbW92ICAgICByYXgsIHJzcCAgICAgICAgOyBTYXZlIGN1cnJlbnQgU1AgaW50byByYXgKKwlzdWIJcmF4LCByZHgJOyByc3AgLSAoKGFyZ2MrMikqOCkgLT4gcmF4CisJCQkJOyB3aXRob3V0IGFsaWduLCByc3Agd291bGQgYmUgdGhpcworCWFuZCAgICAgcmF4LCAtMTI4ICAgICAgIDsgTWFzayBvZmYgNyBiaXRzICgxMjgtYnl0ZSBhbGlnbikKKwlhZGQgICAgIHJheCwgcmR4ICAgICAgICA7IGFkZCBzcGFjZSBmb3IgcHVzaCdzIGluIGEgbG9vcCBiZWxvdworCW1vdiAgICAgcnNwLCByYXggICAgICAgIDsgUHJlcGFyZSB0aGUgc3RhY2sgcHRyCisJCQkJOyBOb3cgaXQgd2lsbCBhbGlnbiB0byAxMjgtYnl0ZSBhdCB0aGUgY2FsbAorOzsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIAkJCTsgc2V0dXAgcGtmbiBwYXJhbWV0ZXIgc3RhY2sKKwltb3YJcmF4LCByOQkJOyByYXggPD0gYXJnYworCXNobAlyYXgsIDMJCTsgcmF4IDw9IGFyZ2MqOAorCW1vdglyZHgsIFFXT1JEIFBUUiAkX3BfYXJndltyYnBdCTsgcmR4IDw9IHBfYXJndgorCWFkZAlyZHgsIHJheAk7IHJkeCA8PSAmcF9hcmd2W2FyZ2NdCisJbW92CXJjeCwgcjkJCTsgcmN4IDw9IGFyZ2MKKwlqZWN4eglTSE9SVCAkX2ttcF9pbnZva2VfcGFzc19wYXJtcwk7IG5vdGhpbmcgdG8gcHVzaCBpZiBhcmdjPTAKKwljbXAJZWN4LCAxCQk7IGlmIGFyZ2M9MSBicmFuY2ggYWhlYWQKKwlqZQlTSE9SVCAkX2ttcF9pbnZva2Vfb25lX3Bhcm0KKwlzdWIJZWN4LCAyCQk7IGlmIGFyZ2M9MiBicmFuY2ggYWhlYWQsIHN1YnRyYWN0IHR3byBmcm9tCisJamUJU0hPUlQgJF9rbXBfaW52b2tlX3R3b19wYXJtcworCiskX2ttcF9pbnZva2VfcHVzaF9wYXJtczoJOyBwdXNoIGxhc3QgLSA1dGggcGFybXMgdG8gcGtmbiBvbiBzdGFjaworCXN1YglyZHgsIDgJCTsgZGVjcmVtZW50IHBfYXJndiBwb2ludGVyIHRvIHByZXZpb3VzIHBhcm0KKwltb3YgCXI4LCBRV09SRCBQVFIgW3JkeF0gOyByOCA8PSBwX2FyZ3ZbcmN4LTFdCisJcHVzaAlyOAkJOyBwdXNoIHBfYXJndltyY3gtMV0gb250byBzdGFjayAocmV2ZXJzZSBvcmRlcikKKwlzdWIJZWN4LCAxCisJamVjeHoJU0hPUlQgJF9rbXBfaW52b2tlX3R3b19wYXJtcworCWptcAlTSE9SVCAkX2ttcF9pbnZva2VfcHVzaF9wYXJtcworCiskX2ttcF9pbnZva2VfdHdvX3Bhcm1zOgorCXN1YglyZHgsIDgJCTsgcHV0IDR0aCBwYXJtIHRvIHBrZm4gaW4gcjkKKwltb3YJcjksIFFXT1JEIFBUUiBbcmR4XSA7IHI5IDw9IHBfYXJndlsxXQorCiskX2ttcF9pbnZva2Vfb25lX3Bhcm06CisgICAgICAgIHN1YglyZHgsIDgJCTsgcHV0IDNyZCBwYXJtIHRvIHBrZm4gaW4gcjgKKwltb3YJcjgsIFFXT1JEIFBUUiBbcmR4XSA7IHI4IDw9IHBfYXJndlswXQorCiskX2ttcF9pbnZva2VfcGFzc19wYXJtczoJOyBwdXQgMXN0ICYgMm5kIHBhcm1zIHRvIHBrZm4gaW4gcmVnaXN0ZXJzCisJbGVhCXJkeCwgUVdPUkQgUFRSICRfdGlkW3JicF0gIDsgcmR4IDw9ICZ0aWQgKDJuZCBwYXJtIHRvIHBrZm4pCisJbGVhCXJjeCwgUVdPUkQgUFRSICRfZ3RpZFtyYnBdIDsgcmN4IDw9ICZndGlkICgxc3QgcGFybSB0byBwa2ZuKQorICAgICAgICBzdWIgICAgIHJzcCwgMzIgICAgICAgICA7IGFkZCBzdGFjayBzcGFjZSBmb3IgZmlyc3QgZm91ciBwYXJtcworCW1vdglyYXgsIHIxMAk7IHJheCA8PSBwa2ZuCisJY2FsbAlyYXgJCTsgY2FsbCAoKnBrZm4pKCkKKwltb3YJcmF4LCAxCQk7IG1vdmUgMSBpbnRvIHJldHVybiByZWdpc3RlcjsKKworICAgICAgICBsZWEgICAgIHJzcCwgUVdPUkQgUFRSIFtyYnBdCTsgcmVzdG9yZSBzdGFjayBwb2ludGVyCisKKzsJYWRkCXJzcCwgMAkJOyBubyBmaXhlZCBhbGxvY2F0aW9uIG5lY2Vzc2FyeSAtIHN0YXJ0IGVwaWxvZworICAgICAgICBwb3AgICAgIHJicAkJOyByZXN0b3JlIGZyYW1lIHBvaW50ZXIKKyAgICAgICAgcmV0CitfX2ttcF9pbnZva2VfbWljcm90YXNrIEVORFAKK19URVhUICAgRU5EUworCitlbmRpZgorCitFTkQKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL3pfV2luZG93c19OVC01ODZfdXRpbC5jIGIvZmluYWwvcnVudGltZS9zcmMvel9XaW5kb3dzX05ULTU4Nl91dGlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUzNWRmNAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL3pfV2luZG93c19OVC01ODZfdXRpbC5jCkBAIC0wLDAgKzEsMTE3IEBACisvKgorICogel9XaW5kb3dzX05ULTU4Nl91dGlsLmMgLS0gcGxhdGZvcm0gc3BlY2lmaWMgcm91dGluZXMuCisgKiAkUmV2aXNpb246IDQyOTUxICQKKyAqICREYXRlOiAyMDE0LTAxLTIxIDE0OjQxOjQxIC0wNjAwIChUdWUsIDIxIEphbiAyMDE0KSAkCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJrbXAuaCIKKworI2lmIChLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0KQorLyogT25seSAzMi1iaXQgImFkZC1leGNoYW5nZSIgaW5zdHJ1Y3Rpb24gb24gSUEtMzIgYXJjaGl0ZWN0dXJlIGNhdXNlcyB1cyB0bworICogdXNlIGNvbXBhcmVfYW5kX3N0b3JlIGZvciB0aGVzZSByb3V0aW5lcworICovCisKK2ttcF9pbnQzMgorX19rbXBfdGVzdF90aGVuX29yMzIoIHZvbGF0aWxlIGttcF9pbnQzMiAqcCwga21wX2ludDMyIGQgKQoreworICAgIGttcF9pbnQzMiBvbGRfdmFsdWUsIG5ld192YWx1ZTsKKworICAgIG9sZF92YWx1ZSA9IFRDUl80KCAqcCApOworICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSB8IGQ7CisKKyAgICB3aGlsZSAoICEgX19rbXBfY29tcGFyZV9hbmRfc3RvcmUzMiAoIHAsIG9sZF92YWx1ZSwgbmV3X3ZhbHVlICkgKQorICAgIHsKKyAgICAgICAgS01QX0NQVV9QQVVTRSgpOworICAgICAgICBvbGRfdmFsdWUgPSBUQ1JfNCggKnAgKTsKKyAgICAgICAgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlIHwgZDsKKyAgICB9CisKKyAgICByZXR1cm4gb2xkX3ZhbHVlOworfQorCitrbXBfaW50MzIKK19fa21wX3Rlc3RfdGhlbl9hbmQzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgZCApCit7CisgICAga21wX2ludDMyIG9sZF92YWx1ZSwgbmV3X3ZhbHVlOworCisgICAgb2xkX3ZhbHVlID0gVENSXzQoICpwICk7CisgICAgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlICYgZDsKKworICAgIHdoaWxlICggISBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTMyICggcCwgb2xkX3ZhbHVlLCBuZXdfdmFsdWUgKSApCisgICAgeworICAgICAgICBLTVBfQ1BVX1BBVVNFKCk7CisgICAgICAgIG9sZF92YWx1ZSA9IFRDUl80KCAqcCApOworICAgICAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgJiBkOworICAgIH0KKyAgICByZXR1cm4gb2xkX3ZhbHVlOworfQorCisjaWYgS01QX0FSQ0hfWDg2CitrbXBfaW50NjQKK19fa21wX3Rlc3RfdGhlbl9hZGQ2NCggdm9sYXRpbGUga21wX2ludDY0ICpwLCBrbXBfaW50NjQgZCApCit7CisgICAga21wX2ludDY0IG9sZF92YWx1ZSwgbmV3X3ZhbHVlOworCisgICAgb2xkX3ZhbHVlID0gVENSXzgoICpwICk7CisgICAgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlICsgZDsKKyAgICB3aGlsZSAoICEgX19rbXBfY29tcGFyZV9hbmRfc3RvcmU2NCAoIHAsIG9sZF92YWx1ZSwgbmV3X3ZhbHVlICkgKQorICAgIHsKKyAgICAgICAgS01QX0NQVV9QQVVTRSgpOworICAgICAgICBvbGRfdmFsdWUgPSBUQ1JfOCggKnAgKTsKKyAgICAgICAgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlICsgZDsKKyAgICB9CisKKyAgICByZXR1cm4gb2xkX3ZhbHVlOworfQorI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiAqLworCitrbXBfaW50NjQKK19fa21wX3Rlc3RfdGhlbl9vcjY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCBkICkKK3sKKyAgICBrbXBfaW50NjQgb2xkX3ZhbHVlLCBuZXdfdmFsdWU7CisKKyAgICBvbGRfdmFsdWUgPSBUQ1JfOCggKnAgKTsKKyAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgfCBkOworICAgIHdoaWxlICggISBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTY0ICggcCwgb2xkX3ZhbHVlLCBuZXdfdmFsdWUgKSApCisgICAgeworICAgICAgICBLTVBfQ1BVX1BBVVNFKCk7CisgICAgICAgIG9sZF92YWx1ZSA9IFRDUl84KCAqcCApOworICAgICAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgfCBkOworICAgIH0KKworICAgIHJldHVybiBvbGRfdmFsdWU7Cit9CisKK2ttcF9pbnQ2NAorX19rbXBfdGVzdF90aGVuX2FuZDY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCBkICkKK3sKKyAgICBrbXBfaW50NjQgb2xkX3ZhbHVlLCBuZXdfdmFsdWU7CisKKyAgICBvbGRfdmFsdWUgPSBUQ1JfOCggKnAgKTsKKyAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgJiBkOworICAgIHdoaWxlICggISBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTY0ICggcCwgb2xkX3ZhbHVlLCBuZXdfdmFsdWUgKSApCisgICAgeworICAgICAgICBLTVBfQ1BVX1BBVVNFKCk7CisgICAgICAgIG9sZF92YWx1ZSA9IFRDUl84KCAqcCApOworICAgICAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgJiBkOworICAgIH0KKworICAgIHJldHVybiBvbGRfdmFsdWU7Cit9CisKKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL3pfV2luZG93c19OVF91dGlsLmMgYi9maW5hbC9ydW50aW1lL3NyYy96X1dpbmRvd3NfTlRfdXRpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0NDI0NDQKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy96X1dpbmRvd3NfTlRfdXRpbC5jCkBAIC0wLDAgKzEsMTk0OSBAQAorLyoKKyAqIHpfV2luZG93c19OVF91dGlsLmMgLS0gcGxhdGZvcm0gc3BlY2lmaWMgcm91dGluZXMuCisgKiAkUmV2aXNpb246IDQzMzg5ICQKKyAqICREYXRlOiAyMDE0LTA4LTExIDEwOjU0OjAxIC0wNTAwIChNb24sIDExIEF1ZyAyMDE0KSAkCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJrbXBfaXR0LmgiCisjaW5jbHVkZSAia21wX2kxOG4uaCIKKyNpbmNsdWRlICJrbXBfaW8uaCIKKyNpbmNsdWRlICJrbXBfd2FpdF9yZWxlYXNlLmgiCisKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogVGhpcyBjb2RlIGlzIHJlbGF0ZWQgdG8gTnRRdWVyeVN5c3RlbUluZm9ybWF0aW9uKCkgZnVuY3Rpb24uIFRoaXMgZnVuY3Rpb24KKyAgIGlzIHVzZWQgaW4gdGhlIExvYWQgYmFsYW5jZSBhbGdvcml0aG0gZm9yIE9NUF9EWU5BTUlDPXRydWUgdG8gZmluZCB0aGUKKyAgIG51bWJlciBvZiBydW5uaW5nIHRocmVhZHMgaW4gdGhlIHN5c3RlbS4gKi8KKworI2luY2x1ZGUgPG50c3RhdHVzLmg+CisjaW5jbHVkZSA8bnRzZWNhcGkuaD4gICAvLyBVTklDT0RFX1NUUklORworCitlbnVtIFNZU1RFTV9JTkZPUk1BVElPTl9DTEFTUyB7CisgICAgU3lzdGVtUHJvY2Vzc0luZm9ybWF0aW9uID0gNQorfTsgLy8gU1lTVEVNX0lORk9STUFUSU9OX0NMQVNTCisKK3N0cnVjdCBDTElFTlRfSUQgeworICAgIEhBTkRMRSBVbmlxdWVQcm9jZXNzOworICAgIEhBTkRMRSBVbmlxdWVUaHJlYWQ7Cit9OyAvLyBzdHJ1Y3QgQ0xJRU5UX0lECisKK2VudW0gVEhSRUFEX1NUQVRFIHsKKyAgICBTdGF0ZUluaXRpYWxpemVkLAorICAgIFN0YXRlUmVhZHksCisgICAgU3RhdGVSdW5uaW5nLAorICAgIFN0YXRlU3RhbmRieSwKKyAgICBTdGF0ZVRlcm1pbmF0ZWQsCisgICAgU3RhdGVXYWl0LAorICAgIFN0YXRlVHJhbnNpdGlvbiwKKyAgICBTdGF0ZVVua25vd24KK307IC8vIGVudW0gVEhSRUFEX1NUQVRFCisKK3N0cnVjdCBWTV9DT1VOVEVSUyB7CisgICAgU0laRV9UICAgICAgICBQZWFrVmlydHVhbFNpemU7CisgICAgU0laRV9UICAgICAgICBWaXJ0dWFsU2l6ZTsKKyAgICBVTE9ORyAgICAgICAgIFBhZ2VGYXVsdENvdW50OworICAgIFNJWkVfVCAgICAgICAgUGVha1dvcmtpbmdTZXRTaXplOworICAgIFNJWkVfVCAgICAgICAgV29ya2luZ1NldFNpemU7CisgICAgU0laRV9UICAgICAgICBRdW90YVBlYWtQYWdlZFBvb2xVc2FnZTsKKyAgICBTSVpFX1QgICAgICAgIFF1b3RhUGFnZWRQb29sVXNhZ2U7CisgICAgU0laRV9UICAgICAgICBRdW90YVBlYWtOb25QYWdlZFBvb2xVc2FnZTsKKyAgICBTSVpFX1QgICAgICAgIFF1b3RhTm9uUGFnZWRQb29sVXNhZ2U7CisgICAgU0laRV9UICAgICAgICBQYWdlZmlsZVVzYWdlOworICAgIFNJWkVfVCAgICAgICAgUGVha1BhZ2VmaWxlVXNhZ2U7CisgICAgU0laRV9UICAgICAgICBQcml2YXRlUGFnZUNvdW50OworfTsgLy8gc3RydWN0IFZNX0NPVU5URVJTCisKK3N0cnVjdCBTWVNURU1fVEhSRUFEIHsKKyAgTEFSR0VfSU5URUdFUiAgIEtlcm5lbFRpbWU7CisgIExBUkdFX0lOVEVHRVIgICBVc2VyVGltZTsKKyAgTEFSR0VfSU5URUdFUiAgIENyZWF0ZVRpbWU7CisgIFVMT05HICAgICAgICAgICBXYWl0VGltZTsKKyAgTFBWT0lEICAgICAgICAgIFN0YXJ0QWRkcmVzczsKKyAgQ0xJRU5UX0lEICAgICAgIENsaWVudElkOworICBEV09SRCAgICAgICAgICAgUHJpb3JpdHk7CisgIExPTkcgICAgICAgICAgICBCYXNlUHJpb3JpdHk7CisgIFVMT05HICAgICAgICAgICBDb250ZXh0U3dpdGNoQ291bnQ7CisgIFRIUkVBRF9TVEFURSAgICBTdGF0ZTsKKyAgVUxPTkcgICAgICAgICAgIFdhaXRSZWFzb247Cit9OyAvLyBTWVNURU1fVEhSRUFECisKK0tNUF9CVUlMRF9BU1NFUlQoIG9mZnNldG9mKCBTWVNURU1fVEhSRUFELCBLZXJuZWxUaW1lICkgPT0gMCApOworI2lmIEtNUF9BUkNIX1g4NgorICAgIEtNUF9CVUlMRF9BU1NFUlQoIG9mZnNldG9mKCBTWVNURU1fVEhSRUFELCBTdGFydEFkZHJlc3MgKSA9PSAyOCApOworICAgIEtNUF9CVUlMRF9BU1NFUlQoIG9mZnNldG9mKCBTWVNURU1fVEhSRUFELCBTdGF0ZSAgICAgICAgKSA9PSA1MiApOworI2Vsc2UKKyAgICBLTVBfQlVJTERfQVNTRVJUKCBvZmZzZXRvZiggU1lTVEVNX1RIUkVBRCwgU3RhcnRBZGRyZXNzICkgPT0gMzIgKTsKKyAgICBLTVBfQlVJTERfQVNTRVJUKCBvZmZzZXRvZiggU1lTVEVNX1RIUkVBRCwgU3RhdGUgICAgICAgICkgPT0gNjggKTsKKyNlbmRpZgorCitzdHJ1Y3QgU1lTVEVNX1BST0NFU1NfSU5GT1JNQVRJT04geworICBVTE9ORyAgICAgICAgICAgTmV4dEVudHJ5T2Zmc2V0OworICBVTE9ORyAgICAgICAgICAgTnVtYmVyT2ZUaHJlYWRzOworICBMQVJHRV9JTlRFR0VSICAgUmVzZXJ2ZWRbIDMgXTsKKyAgTEFSR0VfSU5URUdFUiAgIENyZWF0ZVRpbWU7CisgIExBUkdFX0lOVEVHRVIgICBVc2VyVGltZTsKKyAgTEFSR0VfSU5URUdFUiAgIEtlcm5lbFRpbWU7CisgIFVOSUNPREVfU1RSSU5HICBJbWFnZU5hbWU7CisgIERXT1JEICAgICAgICAgICBCYXNlUHJpb3JpdHk7CisgIEhBTkRMRSAgICAgICAgICBQcm9jZXNzSWQ7CisgIEhBTkRMRSAgICAgICAgICBQYXJlbnRQcm9jZXNzSWQ7CisgIFVMT05HICAgICAgICAgICBIYW5kbGVDb3VudDsKKyAgVUxPTkcgICAgICAgICAgIFJlc2VydmVkMlsgMiBdOworICBWTV9DT1VOVEVSUyAgICAgVk1Db3VudGVyczsKKyAgSU9fQ09VTlRFUlMgICAgIElPQ291bnRlcnM7CisgIFNZU1RFTV9USFJFQUQgICBUaHJlYWRzWyAxIF07Cit9OyAvLyBTWVNURU1fUFJPQ0VTU19JTkZPUk1BVElPTgordHlwZWRlZiBTWVNURU1fUFJPQ0VTU19JTkZPUk1BVElPTiAqIFBTWVNURU1fUFJPQ0VTU19JTkZPUk1BVElPTjsKKworS01QX0JVSUxEX0FTU0VSVCggb2Zmc2V0b2YoIFNZU1RFTV9QUk9DRVNTX0lORk9STUFUSU9OLCBOZXh0RW50cnlPZmZzZXQgKSA9PSAgMCApOworS01QX0JVSUxEX0FTU0VSVCggb2Zmc2V0b2YoIFNZU1RFTV9QUk9DRVNTX0lORk9STUFUSU9OLCBDcmVhdGVUaW1lICAgICAgKSA9PSAzMiApOworS01QX0JVSUxEX0FTU0VSVCggb2Zmc2V0b2YoIFNZU1RFTV9QUk9DRVNTX0lORk9STUFUSU9OLCBJbWFnZU5hbWUgICAgICAgKSA9PSA1NiApOworI2lmIEtNUF9BUkNIX1g4NgorICAgIEtNUF9CVUlMRF9BU1NFUlQoIG9mZnNldG9mKCBTWVNURU1fUFJPQ0VTU19JTkZPUk1BVElPTiwgUHJvY2Vzc0lkICAgICAgICkgPT0gIDY4ICk7CisgICAgS01QX0JVSUxEX0FTU0VSVCggb2Zmc2V0b2YoIFNZU1RFTV9QUk9DRVNTX0lORk9STUFUSU9OLCBIYW5kbGVDb3VudCAgICAgKSA9PSAgNzYgKTsKKyAgICBLTVBfQlVJTERfQVNTRVJUKCBvZmZzZXRvZiggU1lTVEVNX1BST0NFU1NfSU5GT1JNQVRJT04sIFZNQ291bnRlcnMgICAgICApID09ICA4OCApOworICAgIEtNUF9CVUlMRF9BU1NFUlQoIG9mZnNldG9mKCBTWVNURU1fUFJPQ0VTU19JTkZPUk1BVElPTiwgSU9Db3VudGVycyAgICAgICkgPT0gMTM2ICk7CisgICAgS01QX0JVSUxEX0FTU0VSVCggb2Zmc2V0b2YoIFNZU1RFTV9QUk9DRVNTX0lORk9STUFUSU9OLCBUaHJlYWRzICAgICAgICAgKSA9PSAxODQgKTsKKyNlbHNlCisgICAgS01QX0JVSUxEX0FTU0VSVCggb2Zmc2V0b2YoIFNZU1RFTV9QUk9DRVNTX0lORk9STUFUSU9OLCBQcm9jZXNzSWQgICAgICAgKSA9PSAgODAgKTsKKyAgICBLTVBfQlVJTERfQVNTRVJUKCBvZmZzZXRvZiggU1lTVEVNX1BST0NFU1NfSU5GT1JNQVRJT04sIEhhbmRsZUNvdW50ICAgICApID09ICA5NiApOworICAgIEtNUF9CVUlMRF9BU1NFUlQoIG9mZnNldG9mKCBTWVNURU1fUFJPQ0VTU19JTkZPUk1BVElPTiwgVk1Db3VudGVycyAgICAgICkgPT0gMTEyICk7CisgICAgS01QX0JVSUxEX0FTU0VSVCggb2Zmc2V0b2YoIFNZU1RFTV9QUk9DRVNTX0lORk9STUFUSU9OLCBJT0NvdW50ZXJzICAgICAgKSA9PSAyMDggKTsKKyAgICBLTVBfQlVJTERfQVNTRVJUKCBvZmZzZXRvZiggU1lTVEVNX1BST0NFU1NfSU5GT1JNQVRJT04sIFRocmVhZHMgICAgICAgICApID09IDI1NiApOworI2VuZGlmCisKK3R5cGVkZWYgTlRTVEFUVVMgKE5UQVBJICpOdFF1ZXJ5U3lzdGVtSW5mb3JtYXRpb25fdCkoIFNZU1RFTV9JTkZPUk1BVElPTl9DTEFTUywgUFZPSUQsIFVMT05HLCBQVUxPTkcgKTsKK050UXVlcnlTeXN0ZW1JbmZvcm1hdGlvbl90IE50UXVlcnlTeXN0ZW1JbmZvcm1hdGlvbiA9IE5VTEw7CisKK0hNT0RVTEUgbnRkbGwgPSBOVUxMOworCisvKiBFbmQgb2YgTnRRdWVyeVN5c3RlbUluZm9ybWF0aW9uKCktcmVsYXRlZCBjb2RlICovCisKKyNpZiBLTVBfQVJDSF9YODZfNjQKK3N0YXRpYyBITU9EVUxFIGtlcm5lbDMyID0gTlVMTDsKKyNlbmRpZiAvKiBLTVBfQVJDSF9YODZfNjQgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiBLTVBfSEFORExFX1NJR05BTFMKKyAgICB0eXBlZGVmIHZvaWQgICAgKCogc2lnX2Z1bmNfdCApKCBpbnQgKTsKKyAgICBzdGF0aWMgc2lnX2Z1bmNfdCAgX19rbXBfc2lnaGxkcnNbIE5TSUcgXTsKKyAgICBzdGF0aWMgaW50ICAgICAgICAgX19rbXBfc2lnaW5zdGFsbGVkWyBOU0lHIF07CisjZW5kaWYKKworc3RhdGljIEhBTkRMRSAgIF9fa21wX21vbml0b3JfZXY7CitzdGF0aWMga21wX2ludDY0IF9fa21wX3dpbjMyX3RpbWU7Citkb3VibGUgX19rbXBfd2luMzJfdGljazsKKworaW50IF9fa21wX2luaXRfcnVudGltZSA9IEZBTFNFOworQ1JJVElDQUxfU0VDVElPTiBfX2ttcF93aW4zMl9zZWN0aW9uOworCit2b2lkCitfX2ttcF93aW4zMl9tdXRleF9pbml0KCBrbXBfd2luMzJfbXV0ZXhfdCAqbXggKQoreworICAgIEluaXRpYWxpemVDcml0aWNhbFNlY3Rpb24oICYgbXgtPmNzICk7CisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9zeXN0ZW1fb2JqZWN0X2NyZWF0ZWQoICYgbXgtPmNzLCAiQ3JpdGljYWwgU2VjdGlvbiIgKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCit9CisKK3ZvaWQKK19fa21wX3dpbjMyX211dGV4X2Rlc3Ryb3koIGttcF93aW4zMl9tdXRleF90ICpteCApCit7CisgICAgRGVsZXRlQ3JpdGljYWxTZWN0aW9uKCAmIG14LT5jcyApOworfQorCit2b2lkCitfX2ttcF93aW4zMl9tdXRleF9sb2NrKCBrbXBfd2luMzJfbXV0ZXhfdCAqbXggKQoreworICAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmIG14LT5jcyApOworfQorCit2b2lkCitfX2ttcF93aW4zMl9tdXRleF91bmxvY2soIGttcF93aW4zMl9tdXRleF90ICpteCApCit7CisgICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICYgbXgtPmNzICk7Cit9CisKK3ZvaWQKK19fa21wX3dpbjMyX2NvbmRfaW5pdCgga21wX3dpbjMyX2NvbmRfdCAqY3YgKQoreworICAgIGN2LT53YWl0ZXJzX2NvdW50XyAgICAgICAgID0gMDsKKyAgICBjdi0+d2FpdF9nZW5lcmF0aW9uX2NvdW50XyA9IDA7CisgICAgY3YtPnJlbGVhc2VfY291bnRfICAgICAgICAgPSAwOworCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgY3JpdGljYWwgc2VjdGlvbiAqLworICAgIF9fa21wX3dpbjMyX211dGV4X2luaXQoICYgY3YtPndhaXRlcnNfY291bnRfbG9ja18gKTsKKworICAgIC8qIENyZWF0ZSBhIG1hbnVhbC1yZXNldCBldmVudC4gKi8KKyAgICBjdi0+ZXZlbnRfID0gQ3JlYXRlRXZlbnQoIE5VTEwsICAgICAvLyBubyBzZWN1cml0eQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSwgICAgIC8vIG1hbnVhbC1yZXNldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UsICAgIC8vIG5vbi1zaWduYWxlZCBpbml0aWFsbHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgKTsgICAvLyB1bm5hbWVkCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9zeXN0ZW1fb2JqZWN0X2NyZWF0ZWQoIGN2LT5ldmVudF8sICJFdmVudCIgKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCit9CisKK3ZvaWQKK19fa21wX3dpbjMyX2NvbmRfZGVzdHJveSgga21wX3dpbjMyX2NvbmRfdCAqY3YgKQoreworICAgIF9fa21wX3dpbjMyX211dGV4X2Rlc3Ryb3koICYgY3YtPndhaXRlcnNfY291bnRfbG9ja18gKTsKKyAgICBfX2ttcF9mcmVlX2hhbmRsZSggY3YtPmV2ZW50XyApOworICAgIG1lbXNldCggY3YsICdcMCcsIHNpemVvZiggKmN2ICkgKTsKK30KKworLyogVE9ETyBhc3NvY2lhdGUgY3Ygd2l0aCBhIHRlYW0gaW5zdGVhZCBvZiBhIHRocmVhZCBzbyBhcyB0byBvcHRpbWl6ZQorICogdGhlIGNhc2Ugd2hlcmUgd2Ugd2FrZSB1cCBhIHdob2xlIHRlYW0gKi8KKwordm9pZAorX19rbXBfd2luMzJfY29uZF93YWl0KCBrbXBfd2luMzJfY29uZF90ICpjdiwga21wX3dpbjMyX211dGV4X3QgKm14LCBrbXBfaW5mb190ICp0aCwgaW50IG5lZWRfZGVjcmVhc2VfbG9hZCApCit7CisgICAgaW50IG15X2dlbmVyYXRpb247CisgICAgaW50IGxhc3Rfd2FpdGVyOworCisgICAgLyogQXZvaWQgcmFjZSBjb25kaXRpb25zICovCisgICAgX19rbXBfd2luMzJfbXV0ZXhfbG9jayggJmN2LT53YWl0ZXJzX2NvdW50X2xvY2tfICk7CisKKyAgICAvKiBJbmNyZW1lbnQgY291bnQgb2Ygd2FpdGVycyAqLworICAgIGN2LT53YWl0ZXJzX2NvdW50XysrOworCisgICAgLyogU3RvcmUgY3VycmVudCBnZW5lcmF0aW9uIGluIG91ciBhY3RpdmF0aW9uIHJlY29yZC4gKi8KKyAgICBteV9nZW5lcmF0aW9uID0gY3YtPndhaXRfZ2VuZXJhdGlvbl9jb3VudF87CisKKyAgICBfX2ttcF93aW4zMl9tdXRleF91bmxvY2soICZjdi0+d2FpdGVyc19jb3VudF9sb2NrXyApOworICAgIF9fa21wX3dpbjMyX211dGV4X3VubG9jayggbXggKTsKKworCisgICAgZm9yICg7OykgeworICAgICAgICBpbnQgd2FpdF9kb25lOworCisgICAgICAgIC8qIFdhaXQgdW50aWwgdGhlIGV2ZW50IGlzIHNpZ25hbGVkICovCisgICAgICAgIFdhaXRGb3JTaW5nbGVPYmplY3QoIGN2LT5ldmVudF8sIElORklOSVRFICk7CisKKyAgICAgICAgX19rbXBfd2luMzJfbXV0ZXhfbG9jayggJmN2LT53YWl0ZXJzX2NvdW50X2xvY2tfICk7CisKKyAgICAgICAgLyogRXhpdCB0aGUgbG9vcCB3aGVuIHRoZSA8Y3YtPmV2ZW50Xz4gaXMgc2lnbmFsZWQgYW5kCisgICAgICAgICAqIHRoZXJlIGFyZSBzdGlsbCB3YWl0aW5nIHRocmVhZHMgZnJvbSB0aGlzIDx3YWl0X2dlbmVyYXRpb24+CisgICAgICAgICAqIHRoYXQgaGF2ZW4ndCBiZWVuIHJlbGVhc2VkIGZyb20gdGhpcyB3YWl0IHlldC4gICAgICAgICAgICAgICovCisgICAgICAgIHdhaXRfZG9uZSA9ICggY3YtPnJlbGVhc2VfY291bnRfID4gMCApICYmCisgICAgICAgICAgICAgICAgICAgICggY3YtPndhaXRfZ2VuZXJhdGlvbl9jb3VudF8gIT0gbXlfZ2VuZXJhdGlvbiApOworCisgICAgICAgIF9fa21wX3dpbjMyX211dGV4X3VubG9jayggJmN2LT53YWl0ZXJzX2NvdW50X2xvY2tfKTsKKworICAgICAgICAvKiB0aGVyZSB1c2VkIHRvIGJlIGEgc2VtaWNvbG9uIGFmdGVyIHRoZSBpZiBzdGF0ZW1lbnQsCisgICAgICAgICAqIGl0IGxvb2tlZCBsaWtlIGEgYnVnLCBzbyBpIHJlbW92ZWQgaXQgKi8KKyAgICAgICAgaWYoIHdhaXRfZG9uZSApCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBfX2ttcF93aW4zMl9tdXRleF9sb2NrKCBteCApOworICAgIF9fa21wX3dpbjMyX211dGV4X2xvY2soICZjdi0+d2FpdGVyc19jb3VudF9sb2NrXyApOworCisgICAgY3YtPndhaXRlcnNfY291bnRfLS07CisgICAgY3YtPnJlbGVhc2VfY291bnRfLS07CisKKyAgICBsYXN0X3dhaXRlciA9ICAoIGN2LT5yZWxlYXNlX2NvdW50XyA9PSAwICk7CisKKyAgICBfX2ttcF93aW4zMl9tdXRleF91bmxvY2soICZjdi0+d2FpdGVyc19jb3VudF9sb2NrXyApOworCisgICAgaWYoIGxhc3Rfd2FpdGVyICkgeworICAgICAgICAvKiBXZSdyZSB0aGUgbGFzdCB3YWl0ZXIgdG8gYmUgbm90aWZpZWQsIHNvIHJlc2V0IHRoZSBtYW51YWwgZXZlbnQuICovCisgICAgICAgIFJlc2V0RXZlbnQoIGN2LT5ldmVudF8gKTsKKyAgICB9Cit9CisKK3ZvaWQKK19fa21wX3dpbjMyX2NvbmRfYnJvYWRjYXN0KCBrbXBfd2luMzJfY29uZF90ICpjdiApCit7CisgICAgX19rbXBfd2luMzJfbXV0ZXhfbG9jayggJmN2LT53YWl0ZXJzX2NvdW50X2xvY2tfICk7CisKKyAgICBpZiggY3YtPndhaXRlcnNfY291bnRfID4gMCApIHsKKyAgICAgICAgU2V0RXZlbnQoIGN2LT5ldmVudF8gKTsKKyAgICAgICAgLyogUmVsZWFzZSBhbGwgdGhlIHRocmVhZHMgaW4gdGhpcyBnZW5lcmF0aW9uLiAqLworCisgICAgICAgIGN2LT5yZWxlYXNlX2NvdW50XyA9IGN2LT53YWl0ZXJzX2NvdW50XzsKKworICAgICAgICAvKiBTdGFydCBhIG5ldyBnZW5lcmF0aW9uLiAqLworICAgICAgICBjdi0+d2FpdF9nZW5lcmF0aW9uX2NvdW50XysrOworICAgIH0KKworICAgIF9fa21wX3dpbjMyX211dGV4X3VubG9jayggJmN2LT53YWl0ZXJzX2NvdW50X2xvY2tfICk7Cit9CisKK3ZvaWQKK19fa21wX3dpbjMyX2NvbmRfc2lnbmFsKCBrbXBfd2luMzJfY29uZF90ICpjdiApCit7CisgICAgX19rbXBfd2luMzJfY29uZF9icm9hZGNhc3QoIGN2ICk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQKK19fa21wX2VuYWJsZSggaW50IG5ld19zdGF0ZSApCit7CisgICAgaWYgKF9fa21wX2luaXRfcnVudGltZSkKKyAgICAgICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICYgX19rbXBfd2luMzJfc2VjdGlvbiApOworfQorCit2b2lkCitfX2ttcF9kaXNhYmxlKCBpbnQgKm9sZF9zdGF0ZSApCit7CisgICAgKm9sZF9zdGF0ZSA9IDA7CisKKyAgICBpZiAoX19rbXBfaW5pdF9ydW50aW1lKQorICAgICAgICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJiBfX2ttcF93aW4zMl9zZWN0aW9uICk7Cit9CisKK3ZvaWQKK19fa21wX3N1c3BlbmRfaW5pdGlhbGl6ZSggdm9pZCApCit7CisgICAgLyogZG8gbm90aGluZyAqLworfQorCitzdGF0aWMgdm9pZAorX19rbXBfc3VzcGVuZF9pbml0aWFsaXplX3RocmVhZCgga21wX2luZm9fdCAqdGggKQoreworICAgIGlmICggISBUQ1JfNCggdGgtPnRoLnRoX3N1c3BlbmRfaW5pdCApICkgeworICAgICAgLyogdGhpcyBtZWFucyB3ZSBoYXZlbid0IGluaXRpYWxpemVkIHRoZSBzdXNwZW5zaW9uIHB0aHJlYWQgb2JqZWN0cyBmb3IgdGhpcyB0aHJlYWQKKyAgICAgICAgIGluIHRoaXMgaW5zdGFuY2Ugb2YgdGhlIHByb2Nlc3MgKi8KKyAgICAgICAgX19rbXBfd2luMzJfY29uZF9pbml0KCAgJnRoLT50aC50aF9zdXNwZW5kX2N2ICk7CisgICAgICAgIF9fa21wX3dpbjMyX211dGV4X2luaXQoICZ0aC0+dGgudGhfc3VzcGVuZF9teCApOworICAgICAgICBUQ1dfNCggdGgtPnRoLnRoX3N1c3BlbmRfaW5pdCwgVFJVRSApOworICAgIH0KK30KKwordm9pZAorX19rbXBfc3VzcGVuZF91bmluaXRpYWxpemVfdGhyZWFkKCBrbXBfaW5mb190ICp0aCApCit7CisgICAgaWYgKCBUQ1JfNCggdGgtPnRoLnRoX3N1c3BlbmRfaW5pdCApICkgeworICAgICAgLyogdGhpcyBtZWFucyB3ZSBoYXZlIGluaXRpYWxpemUgdGhlIHN1c3BlbnNpb24gcHRocmVhZCBvYmplY3RzIGZvciB0aGlzIHRocmVhZAorICAgICAgICAgaW4gdGhpcyBpbnN0YW5jZSBvZiB0aGUgcHJvY2VzcyAqLworICAgICAgX19rbXBfd2luMzJfY29uZF9kZXN0cm95KCAmIHRoLT50aC50aF9zdXNwZW5kX2N2ICk7CisgICAgICBfX2ttcF93aW4zMl9tdXRleF9kZXN0cm95KCAmIHRoLT50aC50aF9zdXNwZW5kX214ICk7CisgICAgICBUQ1dfNCggdGgtPnRoLnRoX3N1c3BlbmRfaW5pdCwgRkFMU0UgKTsKKyAgICB9Cit9CisKKy8qIFRoaXMgcm91dGluZSBwdXRzIHRoZSBjYWxsaW5nIHRocmVhZCB0byBzbGVlcCBhZnRlciBzZXR0aW5nIHRoZQorICogc2xlZXAgYml0IGZvciB0aGUgaW5kaWNhdGVkIGZsYWcgdmFyaWFibGUgdG8gdHJ1ZS4KKyAqLwordGVtcGxhdGUgPGNsYXNzIEM+CitzdGF0aWMgaW5saW5lIHZvaWQgX19rbXBfc3VzcGVuZF90ZW1wbGF0ZSggaW50IHRoX2d0aWQsIEMgKmZsYWcgKQoreworICAgIGttcF9pbmZvX3QgKnRoID0gX19rbXBfdGhyZWFkc1t0aF9ndGlkXTsKKyAgICBpbnQgc3RhdHVzOworICAgIHR5cGVuYW1lIEM6OmZsYWdfdCBvbGRfc3BpbjsKKworICAgIEtGX1RSQUNFKCAzMCwgKCJfX2ttcF9zdXNwZW5kX3RlbXBsYXRlOiBUIyVkIGVudGVyIGZvciBmbGFnJ3MgbG9jKCVwKVxuIiwgdGhfZ3RpZCwgZmxhZy0+Z2V0KCkgKSApOworCisgICAgX19rbXBfc3VzcGVuZF9pbml0aWFsaXplX3RocmVhZCggdGggKTsKKyAgICBfX2ttcF93aW4zMl9tdXRleF9sb2NrKCAmdGgtPnRoLnRoX3N1c3BlbmRfbXggKTsKKworICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBfc3VzcGVuZF90ZW1wbGF0ZTogVCMlZCBzZXR0aW5nIHNsZWVwIGJpdCBmb3IgZmxhZydzIGxvYyglcClcbiIsCisgICAgICAgICAgICAgICAgICAgIHRoX2d0aWQsIGZsYWctPmdldCgpICkgKTsKKworICAgIC8qIFRPRE86IHNob3VsZG4ndCB0aGlzIHVzZSByZWxlYXNlIHNlbWFudGljcyB0byBlbnN1cmUgdGhhdCBfX2ttcF9zdXNwZW5kX2luaXRpYWxpemVfdGhyZWFkCisgICAgICAgZ2V0cyBjYWxsZWQgZmlyc3Q/CisgICAgKi8KKyAgICBvbGRfc3BpbiA9IGZsYWctPnNldF9zbGVlcGluZygpOworCisgICAgS0ZfVFJBQ0UoIDUsICggIl9fa21wX3N1c3BlbmRfdGVtcGxhdGU6IFQjJWQgc2V0IHNsZWVwIGJpdCBmb3IgZmxhZydzIGxvYyglcCk9PSVkXG4iLAorICAgICAgICAgICAgICAgICAgIHRoX2d0aWQsIGZsYWctPmdldCgpLCAqKGZsYWctPmdldCgpKSApICk7CisKKyAgICBpZiAoIGZsYWctPmRvbmVfY2hlY2tfdmFsKG9sZF9zcGluKSApIHsKKyAgICAgICAgb2xkX3NwaW4gPSBmbGFnLT51bnNldF9zbGVlcGluZygpOworICAgICAgICBLRl9UUkFDRSggNSwgKCAiX19rbXBfc3VzcGVuZF90ZW1wbGF0ZTogVCMlZCBmYWxzZSBhbGFybSwgcmVzZXQgc2xlZXAgYml0IGZvciBmbGFnJ3MgbG9jKCVwKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgdGhfZ3RpZCwgZmxhZy0+Z2V0KCkpICk7CisgICAgfSBlbHNlIHsKKyNpZmRlZiBERUJVR19TVVNQRU5ECisgICAgICAgIF9fa21wX3N1c3BlbmRfY291bnQrKzsKKyNlbmRpZgorICAgICAgICAvKiBFbmNhcHN1bGF0ZSBpbiBhIGxvb3AgYXMgdGhlIGRvY3VtZW50YXRpb24gc3RhdGVzIHRoYXQgdGhpcyBtYXkKKyAgICAgICAgICogIndpdGggbG93IHByb2JhYmlsaXR5IiByZXR1cm4gd2hlbiB0aGUgY29uZGl0aW9uIHZhcmlhYmxlIGhhcworICAgICAgICAgKiBub3QgYmVlbiBzaWduYWxlZCBvciBicm9hZGNhc3QKKyAgICAgICAgICovCisgICAgICAgIGludCBkZWFjdGl2YXRlZCA9IEZBTFNFOworICAgICAgICBUQ1dfUFRSKHRoLT50aC50aF9zbGVlcF9sb2MsICh2b2lkICopZmxhZyk7CisgICAgICAgIHdoaWxlICggZmxhZy0+aXNfc2xlZXBpbmcoKSApIHsKKyAgICAgICAgICAgIEtGX1RSQUNFKCAxNSwgKCJfX2ttcF9zdXNwZW5kX3RlbXBsYXRlOiBUIyVkIGFib3V0IHRvIHBlcmZvcm0ga21wX3dpbjMyX2NvbmRfd2FpdCgpXG4iLAorICAgICAgICAgICAgICAgICAgICAgdGhfZ3RpZCApICk7CisgICAgICAgICAgICAvLyBNYXJrIHRoZSB0aHJlYWQgYXMgbm8gbG9uZ2VyIGFjdGl2ZSAob25seSBpbiB0aGUgZmlyc3QgaXRlcmF0aW9uIG9mIHRoZSBsb29wKS4KKyAgICAgICAgICAgIGlmICggISBkZWFjdGl2YXRlZCApIHsKKyAgICAgICAgICAgICAgICB0aC0+dGgudGhfYWN0aXZlID0gRkFMU0U7CisgICAgICAgICAgICAgICAgaWYgKCB0aC0+dGgudGhfYWN0aXZlX2luX3Bvb2wgKSB7CisgICAgICAgICAgICAgICAgICAgIHRoLT50aC50aF9hY3RpdmVfaW5fcG9vbCA9IEZBTFNFOworICAgICAgICAgICAgICAgICAgICBLTVBfVEVTVF9USEVOX0RFQzMyKAorICAgICAgICAgICAgICAgICAgICAgIChrbXBfaW50MzIgKikgJl9fa21wX3RocmVhZF9wb29sX2FjdGl2ZV9udGggKTsKKyAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggVENSXzQoX19rbXBfdGhyZWFkX3Bvb2xfYWN0aXZlX250aCkgPj0gMCApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkZWFjdGl2YXRlZCA9IFRSVUU7CisKKworICAgICAgICAgICAgICAgIF9fa21wX3dpbjMyX2NvbmRfd2FpdCggJnRoLT50aC50aF9zdXNwZW5kX2N2LCAmdGgtPnRoLnRoX3N1c3BlbmRfbXgsIDAsIDAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIF9fa21wX3dpbjMyX2NvbmRfd2FpdCggJnRoLT50aC50aF9zdXNwZW5kX2N2LCAmdGgtPnRoLnRoX3N1c3BlbmRfbXgsIDAsIDAgKTsKKyAgICAgICAgICAgIH0KKworI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAgICAgaWYoIGZsYWctPmlzX3NsZWVwaW5nKCkgKSB7CisgICAgICAgICAgICAgICAgS0ZfVFJBQ0UoIDEwMCwgKCJfX2ttcF9zdXNwZW5kX3RlbXBsYXRlOiBUIyVkIHNwdXJpb3VzIHdha2V1cFxuIiwgdGhfZ3RpZCApKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBLTVBfREVCVUcgKi8KKworICAgICAgICB9IC8vIHdoaWxlCisKKyAgICAgICAgLy8gTWFyayB0aGUgdGhyZWFkIGFzIGFjdGl2ZSBhZ2FpbiAoaWYgaXQgd2FzIHByZXZpb3VzIG1hcmtlZCBhcyBpbmFjdGl2ZSkKKyAgICAgICAgaWYgKCBkZWFjdGl2YXRlZCApIHsKKyAgICAgICAgICAgIHRoLT50aC50aF9hY3RpdmUgPSBUUlVFOworICAgICAgICAgICAgaWYgKCBUQ1JfNCh0aC0+dGgudGhfaW5fcG9vbCkgKSB7CisgICAgICAgICAgICAgICAgS01QX1RFU1RfVEhFTl9JTkMzMigKKyAgICAgICAgICAgICAgICAgIChrbXBfaW50MzIgKikgJl9fa21wX3RocmVhZF9wb29sX2FjdGl2ZV9udGggKTsKKyAgICAgICAgICAgICAgICB0aC0+dGgudGhfYWN0aXZlX2luX3Bvb2wgPSBUUlVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICBfX2ttcF93aW4zMl9tdXRleF91bmxvY2soICZ0aC0+dGgudGhfc3VzcGVuZF9teCApOworCisgICAgS0ZfVFJBQ0UoIDMwLCAoIl9fa21wX3N1c3BlbmRfdGVtcGxhdGU6IFQjJWQgZXhpdFxuIiwgdGhfZ3RpZCApICk7Cit9CisKK3ZvaWQgX19rbXBfc3VzcGVuZF8zMihpbnQgdGhfZ3RpZCwga21wX2ZsYWdfMzIgKmZsYWcpIHsKKyAgICBfX2ttcF9zdXNwZW5kX3RlbXBsYXRlKHRoX2d0aWQsIGZsYWcpOworfQordm9pZCBfX2ttcF9zdXNwZW5kXzY0KGludCB0aF9ndGlkLCBrbXBfZmxhZ182NCAqZmxhZykgeworICAgIF9fa21wX3N1c3BlbmRfdGVtcGxhdGUodGhfZ3RpZCwgZmxhZyk7Cit9Cit2b2lkIF9fa21wX3N1c3BlbmRfb25jb3JlKGludCB0aF9ndGlkLCBrbXBfZmxhZ19vbmNvcmUgKmZsYWcpIHsKKyAgICBfX2ttcF9zdXNwZW5kX3RlbXBsYXRlKHRoX2d0aWQsIGZsYWcpOworfQorCisKKy8qIFRoaXMgcm91dGluZSBzaWduYWxzIHRoZSB0aHJlYWQgc3BlY2lmaWVkIGJ5IHRhcmdldF9ndGlkIHRvIHdha2UgdXAKKyAqIGFmdGVyIHNldHRpbmcgdGhlIHNsZWVwIGJpdCBpbmRpY2F0ZWQgYnkgdGhlIGZsYWcgYXJndW1lbnQgdG8gRkFMU0UKKyAqLwordGVtcGxhdGUgPGNsYXNzIEM+CitzdGF0aWMgaW5saW5lIHZvaWQgX19rbXBfcmVzdW1lX3RlbXBsYXRlKCBpbnQgdGFyZ2V0X2d0aWQsIEMgKmZsYWcgKQoreworICAgIGttcF9pbmZvX3QgKnRoID0gX19rbXBfdGhyZWFkc1t0YXJnZXRfZ3RpZF07CisgICAgaW50IHN0YXR1czsKKworI2lmZGVmIEtNUF9ERUJVRworICAgIGludCBndGlkID0gVENSXzQoX19rbXBfaW5pdF9ndGlkKSA/IF9fa21wX2dldF9ndGlkKCkgOiAtMTsKKyNlbmRpZgorCisgICAgS0ZfVFJBQ0UoIDMwLCAoICJfX2ttcF9yZXN1bWVfdGVtcGxhdGU6IFQjJWQgd2FudHMgdG8gd2FrZXVwIFQjJWQgZW50ZXJcbiIsIGd0aWQsIHRhcmdldF9ndGlkICkgKTsKKworICAgIF9fa21wX3N1c3BlbmRfaW5pdGlhbGl6ZV90aHJlYWQoIHRoICk7CisgICAgX19rbXBfd2luMzJfbXV0ZXhfbG9jayggJnRoLT50aC50aF9zdXNwZW5kX214ICk7CisKKyAgICBpZiAoIWZsYWcpIHsKKyAgICAgICAgZmxhZyA9IChDICopdGgtPnRoLnRoX3NsZWVwX2xvYzsKKyAgICB9CisKKyAgICBpZiAoIWZsYWcpIHsKKyAgICAgICAgS0ZfVFJBQ0UoIDUsICggIl9fa21wX3Jlc3VtZV90ZW1wbGF0ZTogVCMlZCBleGl0aW5nLCB0aHJlYWQgVCMlZCBhbHJlYWR5IGF3YWtlOiBmbGFnJ3MgbG9jKCVwKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGFyZ2V0X2d0aWQsIE5VTEwgKSApOworICAgICAgICBfX2ttcF93aW4zMl9tdXRleF91bmxvY2soICZ0aC0+dGgudGhfc3VzcGVuZF9teCApOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGVsc2UgeworICAgICAgICB0eXBlbmFtZSBDOjpmbGFnX3Qgb2xkX3NwaW4gPSBmbGFnLT51bnNldF9zbGVlcGluZygpOworICAgICAgICBpZiAoICFmbGFnLT5pc19zbGVlcGluZ192YWwob2xkX3NwaW4pICkgeworICAgICAgICAgICAgS0ZfVFJBQ0UoIDUsICggIl9fa21wX3Jlc3VtZV90ZW1wbGF0ZTogVCMlZCBleGl0aW5nLCB0aHJlYWQgVCMlZCBhbHJlYWR5IGF3YWtlOiBmbGFnJ3MgbG9jKCVwKTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiV1ID0+ICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGFyZ2V0X2d0aWQsIGZsYWctPmdldCgpLCBvbGRfc3BpbiwgKihmbGFnLT5nZXQoKSkgKSApOworICAgICAgICAgICAgX19rbXBfd2luMzJfbXV0ZXhfdW5sb2NrKCAmdGgtPnRoLnRoX3N1c3BlbmRfbXggKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICBUQ1dfUFRSKHRoLT50aC50aF9zbGVlcF9sb2MsIE5VTEwpOworCisgICAgS0ZfVFJBQ0UoIDUsICggIl9fa21wX3Jlc3VtZV90ZW1wbGF0ZTogVCMlZCBhYm91dCB0byB3YWtldXAgVCMlZCwgcmVzZXQgc2xlZXAgYml0IGZvciBmbGFnJ3MgbG9jKCVwKVxuIiwKKyAgICAgICAgICAgICAgICAgICBndGlkLCB0YXJnZXRfZ3RpZCwgZmxhZy0+Z2V0KCkgKSApOworCisKKyAgICBfX2ttcF93aW4zMl9jb25kX3NpZ25hbCggICZ0aC0+dGgudGhfc3VzcGVuZF9jdiApOworICAgIF9fa21wX3dpbjMyX211dGV4X3VubG9jayggJnRoLT50aC50aF9zdXNwZW5kX214ICk7CisKKyAgICBLRl9UUkFDRSggMzAsICggIl9fa21wX3Jlc3VtZV90ZW1wbGF0ZTogVCMlZCBleGl0aW5nIGFmdGVyIHNpZ25hbGluZyB3YWtlIHVwIGZvciBUIyVkXG4iLAorICAgICAgICAgICAgICAgICAgICBndGlkLCB0YXJnZXRfZ3RpZCApICk7Cit9CisKK3ZvaWQgX19rbXBfcmVzdW1lXzMyKGludCB0YXJnZXRfZ3RpZCwga21wX2ZsYWdfMzIgKmZsYWcpIHsKKyAgICBfX2ttcF9yZXN1bWVfdGVtcGxhdGUodGFyZ2V0X2d0aWQsIGZsYWcpOworfQordm9pZCBfX2ttcF9yZXN1bWVfNjQoaW50IHRhcmdldF9ndGlkLCBrbXBfZmxhZ182NCAqZmxhZykgeworICAgIF9fa21wX3Jlc3VtZV90ZW1wbGF0ZSh0YXJnZXRfZ3RpZCwgZmxhZyk7Cit9Cit2b2lkIF9fa21wX3Jlc3VtZV9vbmNvcmUoaW50IHRhcmdldF9ndGlkLCBrbXBfZmxhZ19vbmNvcmUgKmZsYWcpIHsKKyAgICBfX2ttcF9yZXN1bWVfdGVtcGxhdGUodGFyZ2V0X2d0aWQsIGZsYWcpOworfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQKK19fa21wX3lpZWxkKCBpbnQgY29uZCApCit7CisgICAgaWYgKGNvbmQpCisgICAgICAgIFNsZWVwKDApOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkCitfX2ttcF9ndGlkX3NldF9zcGVjaWZpYyggaW50IGd0aWQgKQoreworICAgIEtBX1RSQUNFKCA1MCwgKCJfX2ttcF9ndGlkX3NldF9zcGVjaWZpYzogVCMlZCBrZXk6JWRcbiIsCisgICAgICAgICAgICAgICAgZ3RpZCwgX19rbXBfZ3RpZF90aHJlYWRwcml2YXRlX2tleSApKTsKKyAgICBLTVBfQVNTRVJUKCBfX2ttcF9pbml0X3J1bnRpbWUgKTsKKyAgICBpZiggISBUbHNTZXRWYWx1ZSggX19rbXBfZ3RpZF90aHJlYWRwcml2YXRlX2tleSwgKExQVk9JRCkoZ3RpZCsxKSkgKQorICAgICAgICBLTVBfRkFUQUwoIFRMU1NldFZhbHVlRmFpbGVkICk7Cit9CisKK2ludAorX19rbXBfZ3RpZF9nZXRfc3BlY2lmaWMoKQoreworICAgIGludCBndGlkOworICAgIGlmKCAhX19rbXBfaW5pdF9ydW50aW1lICkgeworICAgICAgICBLQV9UUkFDRSggNTAsICgiX19rbXBfZ2V0X3NwZWNpZmljOiBydW50aW1lIHNodXRkb3duLCByZXR1cm5pbmcgS01QX0dUSURfU0hVVERPV05cbiIgKSApOworICAgICAgICByZXR1cm4gS01QX0dUSURfU0hVVERPV047CisgICAgfQorICAgIGd0aWQgPSAoaW50KShrbXBfaW50cHRyX3QpVGxzR2V0VmFsdWUoIF9fa21wX2d0aWRfdGhyZWFkcHJpdmF0ZV9rZXkgKTsKKyAgICBpZiAoIGd0aWQgPT0gMCApIHsKKyAgICAgICAgZ3RpZCA9IEtNUF9HVElEX0RORTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGd0aWQtLTsKKyAgICB9CisgICAgS0FfVFJBQ0UoIDUwLCAoIl9fa21wX2d0aWRfZ2V0X3NwZWNpZmljOiBrZXk6JWQgZ3RpZDolZFxuIiwKKyAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX3RocmVhZHByaXZhdGVfa2V5LCBndGlkICkpOworICAgIHJldHVybiBndGlkOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgS01QX0FSQ0hfWDg2XzY0CisKKy8vCisvLyBPbmx5IDEgRFdPUkQgaW4gdGhlIG1hc2sgc2hvdWxkIGhhdmUgYW55IHByb2NzIHNldC4KKy8vIFJldHVybiB0aGUgYXBwcm9wcmlhdGUgaW5kZXgsIG9yIC0xIGZvciBhbiBpbnZhbGlkIG1hc2suCisvLworaW50CitfX2ttcF9nZXRfcHJvY19ncm91cCgga21wX2FmZmluX21hc2tfdCBjb25zdCAqbWFzayApCit7CisgICAgaW50IGk7CisgICAgaW50IGdyb3VwID0gLTE7CisgICAgZm9yIChpID0gMDsgaSA8IF9fa21wX251bV9wcm9jX2dyb3VwczsgaSsrKSB7CisgICAgICAgIGlmIChtYXNrW2ldID09IDApIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChncm91cCA+PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgZ3JvdXAgPSBpOworICAgIH0KKyAgICByZXR1cm4gZ3JvdXA7Cit9CisKKyNlbmRpZiAvKiBLTVBfQVJDSF9YODZfNjQgKi8KKworaW50CitfX2ttcF9zZXRfc3lzdGVtX2FmZmluaXR5KCBrbXBfYWZmaW5fbWFza190IGNvbnN0ICptYXNrLCBpbnQgYWJvcnRfb25fZXJyb3IgKQoreworCisjaWYgS01QX0FSQ0hfWDg2XzY0CisKKyAgICBpZiAoX19rbXBfbnVtX3Byb2NfZ3JvdXBzID4gMSkgeworICAgICAgICAvLworICAgICAgICAvLyBDaGVjayBmb3IgYSB2YWxpZCBtYXNrLgorICAgICAgICAvLworICAgICAgICBHUk9VUF9BRkZJTklUWSBnYTsKKyAgICAgICAgaW50IGdyb3VwID0gX19rbXBfZ2V0X3Byb2NfZ3JvdXAoIG1hc2sgKTsKKyAgICAgICAgaWYgKGdyb3VwIDwgMCkgeworICAgICAgICAgICAgaWYgKGFib3J0X29uX2Vycm9yKSB7CisgICAgICAgICAgICAgICAgS01QX0ZBVEFMKEFmZmluaXR5SW52YWxpZE1hc2ssICJrbXBfc2V0X2FmZmluaXR5Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICAvLworICAgICAgICAvLyBUcmFuc2Zvcm0gdGhlIGJpdCB2ZWN0b3IgaW50byBhIEdST1VQX0FGRklOSVRZIHN0cnVjdAorICAgICAgICAvLyBhbmQgbWFrZSB0aGUgc3lzdGVtIGNhbGwgdG8gc2V0IGFmZmluaXR5LgorICAgICAgICAvLworICAgICAgICBnYS5Hcm91cCA9IGdyb3VwOworICAgICAgICBnYS5NYXNrID0gbWFza1tncm91cF07CisgICAgICAgIGdhLlJlc2VydmVkWzBdID0gZ2EuUmVzZXJ2ZWRbMV0gPSBnYS5SZXNlcnZlZFsyXSA9IDA7CisKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF9TZXRUaHJlYWRHcm91cEFmZmluaXR5ICE9IE5VTEwpOworICAgICAgICBpZiAoX19rbXBfU2V0VGhyZWFkR3JvdXBBZmZpbml0eShHZXRDdXJyZW50VGhyZWFkKCksICZnYSwgTlVMTCkgPT0gMCkgeworICAgICAgICAgICAgRFdPUkQgZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgICAgIGlmIChhYm9ydF9vbl9lcnJvcikgeworICAgICAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50U2V0VGhyZWFkQWZmTWFzayApLAorICAgICAgICAgICAgICAgICAgICBLTVBfRVJSKCBlcnJvciApLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZXJyb3I7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorCisjZW5kaWYgLyogS01QX0FSQ0hfWDg2XzY0ICovCisKKyAgICB7CisgICAgICAgIGlmICghU2V0VGhyZWFkQWZmaW5pdHlNYXNrKCBHZXRDdXJyZW50VGhyZWFkKCksICptYXNrICkpIHsKKyAgICAgICAgICAgIERXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgICAgICBpZiAoYWJvcnRfb25fZXJyb3IpIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgICAgICAgICAgS01QX01TRyggQ2FudFNldFRocmVhZEFmZk1hc2sgKSwKKyAgICAgICAgICAgICAgICAgICAgS01QX0VSUiggZXJyb3IgKSwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGVycm9yOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCitpbnQKK19fa21wX2dldF9zeXN0ZW1fYWZmaW5pdHkoIGttcF9hZmZpbl9tYXNrX3QgKm1hc2ssIGludCBhYm9ydF9vbl9lcnJvciApCit7CisKKyNpZiBLTVBfQVJDSF9YODZfNjQKKworICAgIGlmIChfX2ttcF9udW1fcHJvY19ncm91cHMgPiAxKSB7CisgICAgICAgIEtNUF9DUFVfWkVSTyhtYXNrKTsKKyAgICAgICAgR1JPVVBfQUZGSU5JVFkgZ2E7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoX19rbXBfR2V0VGhyZWFkR3JvdXBBZmZpbml0eSAhPSBOVUxMKTsKKworICAgICAgICBpZiAoX19rbXBfR2V0VGhyZWFkR3JvdXBBZmZpbml0eShHZXRDdXJyZW50VGhyZWFkKCksICZnYSkgPT0gMCkgeworICAgICAgICAgICAgRFdPUkQgZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgICAgIGlmIChhYm9ydF9vbl9lcnJvcikgeworICAgICAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKEZ1bmN0aW9uRXJyb3IsICJHZXRUaHJlYWRHcm91cEFmZmluaXR5KCkiKSwKKyAgICAgICAgICAgICAgICAgICAgS01QX0VSUihlcnJvciksCisgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBlcnJvcjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoZ2EuR3JvdXAgPCAwKSB8fCAoZ2EuR3JvdXAgPiBfX2ttcF9udW1fcHJvY19ncm91cHMpCisgICAgICAgICAgfHwgKGdhLk1hc2sgPT0gMCkpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIG1hc2tbZ2EuR3JvdXBdID0gZ2EuTWFzazsKKyAgICB9CisgICAgZWxzZQorCisjZW5kaWYgLyogS01QX0FSQ0hfWDg2XzY0ICovCisKKyAgICB7CisgICAgICAgIGttcF9hZmZpbl9tYXNrX3QgbmV3TWFzaywgc3lzTWFzaywgcmV0dmFsOworCisgICAgICAgIGlmICghR2V0UHJvY2Vzc0FmZmluaXR5TWFzayhHZXRDdXJyZW50UHJvY2VzcygpLCAmbmV3TWFzaywgJnN5c01hc2spKSB7CisgICAgICAgICAgICBEV09SRCBlcnJvciA9IEdldExhc3RFcnJvcigpOworICAgICAgICAgICAgaWYgKGFib3J0X29uX2Vycm9yKSB7CisgICAgICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coRnVuY3Rpb25FcnJvciwgIkdldFByb2Nlc3NBZmZpbml0eU1hc2soKSIpLAorICAgICAgICAgICAgICAgICAgICBLTVBfRVJSKGVycm9yKSwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGVycm9yOworICAgICAgICB9CisgICAgICAgIHJldHZhbCA9IFNldFRocmVhZEFmZmluaXR5TWFzayhHZXRDdXJyZW50VGhyZWFkKCksIG5ld01hc2spOworICAgICAgICBpZiAoISByZXR2YWwpIHsKKyAgICAgICAgICAgIERXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgICAgICBpZiAoYWJvcnRfb25fZXJyb3IpIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgICAgICAgICAgS01QX01TRyhGdW5jdGlvbkVycm9yLCAiU2V0VGhyZWFkQWZmaW5pdHlNYXNrKCkiKSwKKyAgICAgICAgICAgICAgICAgICAgS01QX0VSUihlcnJvciksCisgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBlcnJvcjsKKyAgICAgICAgfQorICAgICAgICBuZXdNYXNrID0gU2V0VGhyZWFkQWZmaW5pdHlNYXNrKEdldEN1cnJlbnRUaHJlYWQoKSwgcmV0dmFsKTsKKyAgICAgICAgaWYgKCEgbmV3TWFzaykgeworICAgICAgICAgICAgRFdPUkQgZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgICAgIGlmIChhYm9ydF9vbl9lcnJvcikgeworICAgICAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKEZ1bmN0aW9uRXJyb3IsICJTZXRUaHJlYWRBZmZpbml0eU1hc2soKSIpLAorICAgICAgICAgICAgICAgICAgICBLTVBfRVJSKGVycm9yKSwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICptYXNrID0gcmV0dmFsOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKwordm9pZAorX19rbXBfYWZmaW5pdHlfYmluZF90aHJlYWQoIGludCBwcm9jICkKK3sKKworI2lmIEtNUF9BUkNIX1g4Nl82NAorCisgICAgaWYgKF9fa21wX251bV9wcm9jX2dyb3VwcyA+IDEpIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gRm9ybSB0aGUgR1JPVVBfQUZGSU5JVFkgc3RydWN0IGRpcmVjdGx5LCByYXRoZXIgdGhhbiBmaWxsaW5nCisgICAgICAgIC8vIG91dCBhIGJpdCB2ZWN0b3IgYW5kIGNhbGxpbmcgX19rbXBfc2V0X3N5c3RlbV9hZmZpbml0eSgpLgorICAgICAgICAvLworICAgICAgICBHUk9VUF9BRkZJTklUWSBnYTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCgocHJvYyA+PSAwKSAmJiAocHJvYyA8IChfX2ttcF9udW1fcHJvY19ncm91cHMKKyAgICAgICAgICAgKiBDSEFSX0JJVCAqIHNpemVvZihEV09SRF9QVFIpKSkpOworICAgICAgICBnYS5Hcm91cCA9IHByb2MgLyAoQ0hBUl9CSVQgKiBzaXplb2YoRFdPUkRfUFRSKSk7CisgICAgICAgIGdhLk1hc2sgPSAodW5zaWduZWQgbG9uZyBsb25nKTEgPDwgKHByb2MgJSAoQ0hBUl9CSVQgKiBzaXplb2YoRFdPUkRfUFRSKSkpOworICAgICAgICBnYS5SZXNlcnZlZFswXSA9IGdhLlJlc2VydmVkWzFdID0gZ2EuUmVzZXJ2ZWRbMl0gPSAwOworCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoX19rbXBfU2V0VGhyZWFkR3JvdXBBZmZpbml0eSAhPSBOVUxMKTsKKyAgICAgICAgaWYgKF9fa21wX1NldFRocmVhZEdyb3VwQWZmaW5pdHkoR2V0Q3VycmVudFRocmVhZCgpLCAmZ2EsIE5VTEwpID09IDApIHsKKyAgICAgICAgICAgIERXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeyAvLyBBQzogY29udGludWUgc2lsZW50bHkgaWYgbm90IHZlcmJvc2UKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgIGttcF9tc193YXJuaW5nLAorICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50U2V0VGhyZWFkQWZmTWFzayApLAorICAgICAgICAgICAgICAgICAgICBLTVBfRVJSKCBlcnJvciApLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorCisjZW5kaWYgLyogS01QX0FSQ0hfWDg2XzY0ICovCisKKyAgICB7CisgICAgICAgIGttcF9hZmZpbl9tYXNrX3QgbWFzazsKKyAgICAgICAgS01QX0NQVV9aRVJPKCZtYXNrKTsKKyAgICAgICAgS01QX0NQVV9TRVQocHJvYywgJm1hc2spOworICAgICAgICBfX2ttcF9zZXRfc3lzdGVtX2FmZmluaXR5KCZtYXNrLCBUUlVFKTsKKyAgICB9Cit9CisKK3ZvaWQKK19fa21wX2FmZmluaXR5X2RldGVybWluZV9jYXBhYmxlKCBjb25zdCBjaGFyICplbnZfdmFyICkKK3sKKyAgICAvLworICAgIC8vIEFsbCB2ZXJzaW9ucyBvZiBXaW5kb3dzKiBPUyAoc2luY2UgV2luICc5NSkgc3VwcG9ydCBTZXRUaHJlYWRBZmZpbml0eU1hc2soKS4KKyAgICAvLworCisjaWYgS01QX0FSQ0hfWDg2XzY0CisgICAgX19rbXBfYWZmaW5fbWFza19zaXplID0gX19rbXBfbnVtX3Byb2NfZ3JvdXBzICogc2l6ZW9mKGttcF9hZmZpbl9tYXNrX3QpOworI2Vsc2UKKyAgICBfX2ttcF9hZmZpbl9tYXNrX3NpemUgPSBzaXplb2Yoa21wX2FmZmluX21hc2tfdCk7CisjZW5kaWYKKworICAgIEtBX1RSQUNFKCAxMCwgKAorICAgICAgICAiX19rbXBfYWZmaW5pdHlfZGV0ZXJtaW5lX2NhcGFibGU6ICIKKyAgICAgICAgICAgICJXaW5kb3dzKiBPUyBhZmZpbml0eSBpbnRlcmZhY2UgZnVuY3Rpb25hbCAobWFzayBzaXplID0gJSIgS01QX1NJWkVfVF9TUEVDICIpLlxuIiwKKyAgICAgICAgX19rbXBfYWZmaW5fbWFza19zaXplCisgICAgKSApOworfQorCitkb3VibGUKK19fa21wX3JlYWRfY3B1X3RpbWUoIHZvaWQgKQoreworICAgIEZJTEVUSU1FICAgIENyZWF0aW9uVGltZSwgRXhpdFRpbWUsIEtlcm5lbFRpbWUsIFVzZXJUaW1lOworICAgIGludCAgICAgICAgIHN0YXR1czsKKyAgICBkb3VibGUgICAgICBjcHVfdGltZTsKKworICAgIGNwdV90aW1lID0gMDsKKworICAgIHN0YXR1cyA9IEdldFByb2Nlc3NUaW1lcyggR2V0Q3VycmVudFByb2Nlc3MoKSwgJkNyZWF0aW9uVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZFeGl0VGltZSwgJktlcm5lbFRpbWUsICZVc2VyVGltZSApOworCisgICAgaWYgKHN0YXR1cykgeworICAgICAgICBkb3VibGUgIHNlYyA9IDA7CisKKyAgICAgICAgc2VjICs9IEtlcm5lbFRpbWUuZHdIaWdoRGF0ZVRpbWU7CisgICAgICAgIHNlYyArPSBVc2VyVGltZS5kd0hpZ2hEYXRlVGltZTsKKworICAgICAgICAvKiBTaGlmdCBsZWZ0IGJ5IDMyIGJpdHMgKi8KKyAgICAgICAgc2VjICo9IChkb3VibGUpICgxIDw8IDE2KSAqIChkb3VibGUpICgxIDw8IDE2KTsKKworICAgICAgICBzZWMgKz0gS2VybmVsVGltZS5kd0xvd0RhdGVUaW1lOworICAgICAgICBzZWMgKz0gVXNlclRpbWUuZHdMb3dEYXRlVGltZTsKKworICAgICAgICBjcHVfdGltZSArPSAoc2VjICogMTAwLjApIC8gTlNFQ19QRVJfU0VDOworICAgIH0KKworICAgIHJldHVybiBjcHVfdGltZTsKK30KKworaW50CitfX2ttcF9yZWFkX3N5c3RlbV9pbmZvKCBzdHJ1Y3Qga21wX3N5c19pbmZvICppbmZvICkKK3sKKyAgICBpbmZvLT5tYXhyc3MgID0gMDsgICAgICAgICAgICAgICAgICAgLyogdGhlIG1heGltdW0gcmVzaWRlbnQgc2V0IHNpemUgdXRpbGl6ZWQgKGluIGtpbG9ieXRlcykgICAgICovCisgICAgaW5mby0+bWluZmx0ICA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIHRoZSBudW1iZXIgb2YgcGFnZSBmYXVsdHMgc2VydmljZWQgd2l0aG91dCBhbnkgSS9PICAgICAgICAqLworICAgIGluZm8tPm1hamZsdCAgPSAwOyAgICAgICAgICAgICAgICAgICAvKiB0aGUgbnVtYmVyIG9mIHBhZ2UgZmF1bHRzIHNlcnZpY2VkIHRoYXQgcmVxdWlyZWQgSS9PICAgICAgKi8KKyAgICBpbmZvLT5uc3dhcCAgID0gMDsgICAgICAgICAgICAgICAgICAgLyogdGhlIG51bWJlciBvZiB0aW1lcyBhIHByb2Nlc3Mgd2FzICJzd2FwcGVkIiBvdXQgb2YgbWVtb3J5ICovCisgICAgaW5mby0+aW5ibG9jayA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGZpbGUgc3lzdGVtIGhhZCB0byBwZXJmb3JtIGlucHV0ICAqLworICAgIGluZm8tPm91YmxvY2sgPSAwOyAgICAgICAgICAgICAgICAgICAvKiB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBmaWxlIHN5c3RlbSBoYWQgdG8gcGVyZm9ybSBvdXRwdXQgKi8KKyAgICBpbmZvLT5udmNzdyAgID0gMDsgICAgICAgICAgICAgICAgICAgLyogdGhlIG51bWJlciBvZiB0aW1lcyBhIGNvbnRleHQgc3dpdGNoIHdhcyB2b2x1bnRhcmlseSAgICAgICovCisgICAgaW5mby0+bml2Y3N3ICA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIHRoZSBudW1iZXIgb2YgdGltZXMgYSBjb250ZXh0IHN3aXRjaCB3YXMgZm9yY2VkICAgICAgICAgICAqLworCisgICAgcmV0dXJuIDE7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwordm9pZAorX19rbXBfcnVudGltZV9pbml0aWFsaXplKCB2b2lkICkKK3sKKyAgICBTWVNURU1fSU5GTyBpbmZvOworICAgIGttcF9zdHJfYnVmX3QgcGF0aDsKKyAgICBVSU5UIHBhdGhfc2l6ZTsKKworICAgIGlmICggX19rbXBfaW5pdF9ydW50aW1lICkgeworICAgICAgICByZXR1cm47CisgICAgfTsKKworICAgIEluaXRpYWxpemVDcml0aWNhbFNlY3Rpb24oICYgX19rbXBfd2luMzJfc2VjdGlvbiApOworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfc3lzdGVtX29iamVjdF9jcmVhdGVkKCAmIF9fa21wX3dpbjMyX3NlY3Rpb24sICJDcml0aWNhbCBTZWN0aW9uIiApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICBfX2ttcF9pbml0aWFsaXplX3N5c3RlbV90aWNrKCk7CisKKyAgICAjaWYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQpCisgICAgICAgIGlmICggISBfX2ttcF9jcHVpbmZvLmluaXRpYWxpemVkICkgeworICAgICAgICAgICAgX19rbXBfcXVlcnlfY3B1aWQoICYgX19rbXBfY3B1aW5mbyApOworICAgICAgICB9OyAvLyBpZgorICAgICNlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisKKyAgICAvKiBTZXQgdXAgbWluaW11bSBudW1iZXIgb2YgdGhyZWFkcyB0byBzd2l0Y2ggdG8gVExTIGd0aWQgKi8KKyAgICAjaWYgS01QX09TX1dJTkRPV1MgJiYgISBkZWZpbmVkIEdVSURFRExMX0VYUE9SVFMKKyAgICAgICAgLy8gV2luZG93cyogT1MsIHN0YXRpYyBsaWJyYXJ5LgorICAgICAgICAvKgorICAgICAgICAgICAgTmV3IHRocmVhZCBtYXkgdXNlIHN0YWNrIHNwYWNlIHByZXZpb3VzbHkgdXNlZCBieSBhbm90aGVyIHRocmVhZCwgY3VycmVudGx5IHRlcm1pbmF0ZWQuCisgICAgICAgICAgICBPbiBXaW5kb3dzKiBPUywgaW4gY2FzZSBvZiBzdGF0aWMgbGlua2luZywgd2UgZG8gbm90IGtub3cgdGhlIG1vbWVudCBvZiB0aHJlYWQgdGVybWluYXRpb24sCisgICAgICAgICAgICBhbmQgb3VyIHN0cnVjdHVyZXMgKF9fa21wX3RocmVhZHMgYW5kIF9fa21wX3Jvb3QgYXJyYXlzKSBhcmUgc3RpbGwga2VlcCBpbmZvIGFib3V0IGRlYWQKKyAgICAgICAgICAgIHRocmVhZHMuIFRoaXMgbGVhZHMgdG8gcHJvYmxlbSBpbiBfX2ttcF9nZXRfZ2xvYmFsX3RocmVhZF9pZCgpIGZ1bmN0aW9uOiBpdCB3cm9uZ2x5CisgICAgICAgICAgICBmaW5kcyBndGlkIChieSBzZWFyY2hpbmcgdGhyb3VnaCBzdGFjayBhZGRyZXNzZXMgb2YgYWxsIGtub3duIHRocmVhZHMpIGZvciB1bnJlZ2lzdGVyZWQKKyAgICAgICAgICAgIGZvcmVpZ24gdHJlYWQuCisKKyAgICAgICAgICAgIFNldHRpbmcgX19rbXBfdGxzX2d0aWRfbWluIHRvIDAgd29ya2Fyb3VuZHMgdGhpcyBwcm9ibGVtOiBfX2ttcF9nZXRfZ2xvYmFsX3RocmVhZF9pZCgpCisgICAgICAgICAgICBkb2VzIG5vdCBzZWFyY2ggdGhyb3VnaCBzdGFja3MsIGJ1dCBnZXQgZ3RpZCBmcm9tIFRMUyBpbW1lZGlhdGVsbHkuCisKKyAgICAgICAgICAgIC0tbG4KKyAgICAgICAgKi8KKyAgICAgICAgX19rbXBfdGxzX2d0aWRfbWluID0gMDsKKyAgICAjZWxzZQorICAgICAgICBfX2ttcF90bHNfZ3RpZF9taW4gPSBLTVBfVExTX0dUSURfTUlOOworICAgICNlbmRpZgorCisgICAgLyogZm9yIHRoZSBzdGF0aWMgbGlicmFyeSAqLworICAgIGlmICggIV9fa21wX2d0aWRfdGhyZWFkcHJpdmF0ZV9rZXkgKSB7CisgICAgICAgIF9fa21wX2d0aWRfdGhyZWFkcHJpdmF0ZV9rZXkgPSBUbHNBbGxvYygpOworICAgICAgICBpZiggX19rbXBfZ3RpZF90aHJlYWRwcml2YXRlX2tleSA9PSBUTFNfT1VUX09GX0lOREVYRVMgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIFRMU091dE9mSW5kZXhlcyApOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvLworICAgIC8vIExvYWQgbnRkbGwuZGxsLgorICAgIC8vCisgICAgLyoKKyAgICAgICAgU2ltcGxlCisgICAgICAgICAgICBHZXRNb2R1bGVIYW5kbGUoICJudGRsbC5kbCIgKQorICAgICAgICBpcyBub3Qgc3VpdGFibGUgZHVlIHRvIHNlY3VyaXR5IGlzc3VlIChzZWUKKyAgICAgICAgaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3RlY2huZXQvc2VjdXJpdHkvYWR2aXNvcnkvMjI2OTYzNy5tc3B4KS4gV2UgaGF2ZSB0byBzcGVjaWZ5IGZ1bGwKKyAgICAgICAgcGF0aCB0byB0aGUgbGlicmFyeS4KKyAgICAqLworICAgIF9fa21wX3N0cl9idWZfaW5pdCggJiBwYXRoICk7CisgICAgcGF0aF9zaXplID0gR2V0U3lzdGVtRGlyZWN0b3J5KCBwYXRoLnN0ciwgcGF0aC5zaXplICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggcGF0aF9zaXplID4gMCApOworICAgIGlmICggcGF0aF9zaXplID49IHBhdGguc2l6ZSApIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gQnVmZmVyIGlzIHRvbyBzaG9ydC4gIEV4cGFuZCB0aGUgYnVmZmVyIGFuZCB0cnkgYWdhaW4uCisgICAgICAgIC8vCisgICAgICAgIF9fa21wX3N0cl9idWZfcmVzZXJ2ZSggJiBwYXRoLCBwYXRoX3NpemUgKTsKKyAgICAgICAgcGF0aF9zaXplID0gR2V0U3lzdGVtRGlyZWN0b3J5KCBwYXRoLnN0ciwgcGF0aC5zaXplICk7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHBhdGhfc2l6ZSA+IDAgKTsKKyAgICB9OyAvLyBpZgorICAgIGlmICggcGF0aF9zaXplID4gMCAmJiBwYXRoX3NpemUgPCBwYXRoLnNpemUgKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIE5vdyB3ZSBoYXZlIHN5c3RlbSBkaXJlY3RvcnkgbmFtZSBpbiB0aGUgYnVmZmVyLgorICAgICAgICAvLyBBcHBlbmQgYmFja3NsYXNoIGFuZCBuYW1lIG9mIGRsbCB0byBmb3JtIGZ1bGwgcGF0aCwKKyAgICAgICAgLy8KKyAgICAgICAgcGF0aC51c2VkID0gcGF0aF9zaXplOworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmIHBhdGgsICJcXCVzIiwgIm50ZGxsLmRsbCIgKTsKKworICAgICAgICAvLworICAgICAgICAvLyBOb3cgbG9hZCBudGRsbCB1c2luZyBmdWxsIHBhdGguCisgICAgICAgIC8vCisgICAgICAgIG50ZGxsID0gR2V0TW9kdWxlSGFuZGxlKCBwYXRoLnN0ciApOworICAgIH0KKworICAgIEtNUF9ERUJVR19BU1NFUlQoIG50ZGxsICE9IE5VTEwgKTsKKyAgICBpZiAoIG50ZGxsICE9IE5VTEwgKSB7CisgICAgICAgIE50UXVlcnlTeXN0ZW1JbmZvcm1hdGlvbiA9IChOdFF1ZXJ5U3lzdGVtSW5mb3JtYXRpb25fdCkgR2V0UHJvY0FkZHJlc3MoIG50ZGxsLCAiTnRRdWVyeVN5c3RlbUluZm9ybWF0aW9uIiApOworICAgIH0KKyAgICBLTVBfREVCVUdfQVNTRVJUKCBOdFF1ZXJ5U3lzdGVtSW5mb3JtYXRpb24gIT0gTlVMTCApOworCisjaWYgS01QX0FSQ0hfWDg2XzY0CisgICAgLy8KKyAgICAvLyBMb2FkIGtlcm5lbDMyLmRsbC4KKyAgICAvLyBTYW1lIGNhdmVhdCAtIG11c3QgdXNlIGZ1bGwgc3lzdGVtIHBhdGggbmFtZS4KKyAgICAvLworICAgIGlmICggcGF0aF9zaXplID4gMCAmJiBwYXRoX3NpemUgPCBwYXRoLnNpemUgKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIFRydW5jYXRlIHRoZSBidWZmZXIgYmFjayB0byBqdXN0IHRoZSBzeXN0ZW0gcGF0aCBsZW5ndGgsCisgICAgICAgIC8vIGRpc2NhcmRpbmcgIlxcbnRkbGwuZGxsIiwgYW5kIHJlcGxhY2luZyBpdCB3aXRoICJrZXJuZWwzMi5kbGwiLgorICAgICAgICAvLworICAgICAgICBwYXRoLnVzZWQgPSBwYXRoX3NpemU7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICYgcGF0aCwgIlxcJXMiLCAia2VybmVsMzIuZGxsIiApOworCisgICAgICAgIC8vCisgICAgICAgIC8vIExvYWQga2VybmVsMzIuZGxsIHVzaW5nIGZ1bGwgcGF0aC4KKyAgICAgICAgLy8KKyAgICAgICAga2VybmVsMzIgPSBHZXRNb2R1bGVIYW5kbGUoIHBhdGguc3RyICk7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gTG9hZCB0aGUgZnVuY3Rpb24gcG9pbnRlcnMgdG8ga2VybmVsMzIuZGxsIHJvdXRpbmVzCisgICAgICAgIC8vIHRoYXQgbWF5IG9yIG1heSBub3QgZXhpc3Qgb24gdGhpcyBzeXN0ZW0uCisgICAgICAgIC8vCisgICAgICAgIGlmICgga2VybmVsMzIgIT0gTlVMTCApIHsKKyAgICAgICAgICAgIF9fa21wX0dldEFjdGl2ZVByb2Nlc3NvckNvdW50ID0gKGttcF9HZXRBY3RpdmVQcm9jZXNzb3JDb3VudF90KSBHZXRQcm9jQWRkcmVzcygga2VybmVsMzIsICJHZXRBY3RpdmVQcm9jZXNzb3JDb3VudCIgKTsKKyAgICAgICAgICAgIF9fa21wX0dldEFjdGl2ZVByb2Nlc3Nvckdyb3VwQ291bnQgPSAoa21wX0dldEFjdGl2ZVByb2Nlc3Nvckdyb3VwQ291bnRfdCkgR2V0UHJvY0FkZHJlc3MoIGtlcm5lbDMyLCAiR2V0QWN0aXZlUHJvY2Vzc29yR3JvdXBDb3VudCIgKTsKKyAgICAgICAgICAgIF9fa21wX0dldFRocmVhZEdyb3VwQWZmaW5pdHkgPSAoa21wX0dldFRocmVhZEdyb3VwQWZmaW5pdHlfdCkgR2V0UHJvY0FkZHJlc3MoIGtlcm5lbDMyLCAiR2V0VGhyZWFkR3JvdXBBZmZpbml0eSIgKTsKKyAgICAgICAgICAgIF9fa21wX1NldFRocmVhZEdyb3VwQWZmaW5pdHkgPSAoa21wX1NldFRocmVhZEdyb3VwQWZmaW5pdHlfdCkgR2V0UHJvY0FkZHJlc3MoIGtlcm5lbDMyLCAiU2V0VGhyZWFkR3JvdXBBZmZpbml0eSIgKTsKKworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFNlZSBpZiBncm91cCBhZmZpbml0eSBpcyBzdXBwb3J0ZWQgb24gdGhpcyBzeXN0ZW0uCisgICAgICAgICAgICAvLyBJZiBzbywgY2FsY3VsYXRlIHRoZSAjZ3JvdXBzIGFuZCAjcHJvY3MuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gR3JvdXAgYWZmaW5pdHkgd2FzIGludHJvZHVjZWQgd2l0aCBXaW5kb3dzKiA3IE9TIGFuZAorICAgICAgICAgICAgLy8gV2luZG93cyogU2VydmVyIDIwMDggUjIgT1MuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgaWYgKCAoIF9fa21wX0dldEFjdGl2ZVByb2Nlc3NvckNvdW50ICE9IE5VTEwgKQorICAgICAgICAgICAgICAmJiAoIF9fa21wX0dldEFjdGl2ZVByb2Nlc3Nvckdyb3VwQ291bnQgIT0gTlVMTCApCisgICAgICAgICAgICAgICYmICggX19rbXBfR2V0VGhyZWFkR3JvdXBBZmZpbml0eSAhPSBOVUxMICkKKyAgICAgICAgICAgICAgJiYgKCBfX2ttcF9TZXRUaHJlYWRHcm91cEFmZmluaXR5ICE9IE5VTEwgKQorICAgICAgICAgICAgICAmJiAoICggX19rbXBfbnVtX3Byb2NfZ3JvdXBzCisgICAgICAgICAgICAgID0gX19rbXBfR2V0QWN0aXZlUHJvY2Vzc29yR3JvdXBDb3VudCgpICkgPiAxICkgKSB7CisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIHRvdGFsIG51bWJlciBvZiBhY3RpdmUgT1MgcHJvY3MuCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICBpbnQgaTsKKworICAgICAgICAgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9ydW50aW1lX2luaXRpYWxpemU6ICVkIHByb2Nlc3NvciBncm91cHMgZGV0ZWN0ZWRcbiIsIF9fa21wX251bV9wcm9jX2dyb3VwcyApICk7CisKKyAgICAgICAgICAgICAgICBfX2ttcF94cHJvYyA9IDA7CisKKyAgICAgICAgICAgICAgICBmb3IgKCBpID0gMDsgaSA8IF9fa21wX251bV9wcm9jX2dyb3VwczsgaSsrICkgeworICAgICAgICAgICAgICAgICAgICBEV09SRCBzaXplID0gX19rbXBfR2V0QWN0aXZlUHJvY2Vzc29yQ291bnQoIGkgKTsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfeHByb2MgKz0gc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX3J1bnRpbWVfaW5pdGlhbGl6ZTogcHJvYyBncm91cCAlZCBzaXplID0gJWRcbiIsIGksIHNpemUgKSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIF9fa21wX251bV9wcm9jX2dyb3VwcyA8PSAxICkgeworICAgICAgICBHZXRTeXN0ZW1JbmZvKCAmIGluZm8gKTsKKyAgICAgICAgX19rbXBfeHByb2MgPSBpbmZvLmR3TnVtYmVyT2ZQcm9jZXNzb3JzOworICAgIH0KKyNlbHNlCisgICAgR2V0U3lzdGVtSW5mbyggJiBpbmZvICk7CisgICAgX19rbXBfeHByb2MgPSBpbmZvLmR3TnVtYmVyT2ZQcm9jZXNzb3JzOworI2VuZGlmIC8vIEtNUF9BUkNIX1g4Nl82NAorCisgICAgLy8KKyAgICAvLyBJZiB0aGUgT1Mgc2FpZCB0aGVyZSB3ZXJlIDAgcHJvY3MsIHRha2UgYSBndWVzcyBhbmQgdXNlIGEgdmFsdWUgb2YgMi4KKyAgICAvLyBUaGlzIGlzIGRvbmUgZm9yIExpbnV4KiBPUywgYWxzby4gIERvIHdlIG5lZWQgZXJyb3IgLyB3YXJuaW5nPworICAgIC8vCisgICAgaWYgKCBfX2ttcF94cHJvYyA8PSAwICkgeworICAgICAgICBfX2ttcF94cHJvYyA9IDI7CisgICAgfQorCisgICAgS0FfVFJBQ0UoIDUsICgiX19rbXBfcnVudGltZV9pbml0aWFsaXplOiB0b3RhbCBwcm9jZXNzb3JzID0gJWRcbiIsIF9fa21wX3hwcm9jKSApOworCisgICAgX19rbXBfc3RyX2J1Zl9mcmVlKCAmIHBhdGggKTsKKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfaW5pdGlhbGl6ZSgpOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgIF9fa21wX2luaXRfcnVudGltZSA9IFRSVUU7Cit9IC8vIF9fa21wX3J1bnRpbWVfaW5pdGlhbGl6ZQorCit2b2lkCitfX2ttcF9ydW50aW1lX2Rlc3Ryb3koIHZvaWQgKQoreworICAgIGlmICggISBfX2ttcF9pbml0X3J1bnRpbWUgKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X2Rlc3Ryb3koKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICAvKiB3ZSBjYW4ndCBEZWxldGVDcml0aWNhbHNlY3Rpb24oICYgX19rbXBfd2luMzJfc2VjdGlvbiApOyAqLworICAgIC8qIGR1ZSB0byB0aGUgS1hfVFJBQ0UoKSBjb21tYW5kcyAqLworICAgIEtBX1RSQUNFKCA0MCwgKCJfX2ttcF9ydW50aW1lX2Rlc3Ryb3lcbiIgKSk7CisKKyAgICBpZiggX19rbXBfZ3RpZF90aHJlYWRwcml2YXRlX2tleSApIHsKKyAgICAgICAgVGxzRnJlZSggX19rbXBfZ3RpZF90aHJlYWRwcml2YXRlX2tleSApOworICAgICAgICBfX2ttcF9ndGlkX3RocmVhZHByaXZhdGVfa2V5ID0gMDsKKyAgICB9CisKKyAgICBfX2ttcF9hZmZpbml0eV91bmluaXRpYWxpemUoKTsKKyAgICBEZWxldGVDcml0aWNhbFNlY3Rpb24oICYgX19rbXBfd2luMzJfc2VjdGlvbiApOworCisgICAgbnRkbGwgPSBOVUxMOworICAgIE50UXVlcnlTeXN0ZW1JbmZvcm1hdGlvbiA9IE5VTEw7CisKKyNpZiBLTVBfQVJDSF9YODZfNjQKKyAgICBrZXJuZWwzMiA9IE5VTEw7CisgICAgX19rbXBfR2V0QWN0aXZlUHJvY2Vzc29yQ291bnQgPSBOVUxMOworICAgIF9fa21wX0dldEFjdGl2ZVByb2Nlc3Nvckdyb3VwQ291bnQgPSBOVUxMOworICAgIF9fa21wX0dldFRocmVhZEdyb3VwQWZmaW5pdHkgPSBOVUxMOworICAgIF9fa21wX1NldFRocmVhZEdyb3VwQWZmaW5pdHkgPSBOVUxMOworI2VuZGlmIC8vIEtNUF9BUkNIX1g4Nl82NAorCisgICAgX19rbXBfaW5pdF9ydW50aW1lID0gRkFMU0U7Cit9CisKKwordm9pZAorX19rbXBfdGVybWluYXRlX3RocmVhZCggaW50IGd0aWQgKQoreworICAgIGttcF9pbmZvX3QgICp0aCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKworICAgIGlmKCAhdGggKSByZXR1cm47CisKKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfdGVybWluYXRlX3RocmVhZDoga2lsbCAoJWQpXG4iLCBndGlkICkgKTsKKworICAgIGlmIChUZXJtaW5hdGVUaHJlYWQoIHRoLT50aC50aF9pbmZvLmRzLmRzX3RocmVhZCwgKERXT1JEKSAtMSkgPT0gRkFMU0UpIHsKKyAgICAgICAgLyogSXQncyBPSywgdGhlIHRocmVhZCBtYXkgaGF2ZSBleGl0ZWQgYWxyZWFkeSAqLworICAgIH0KKyAgICBfX2ttcF9mcmVlX2hhbmRsZSggdGgtPnRoLnRoX2luZm8uZHMuZHNfdGhyZWFkICk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQKK19fa21wX2NsZWFyX3N5c3RlbV90aW1lKCB2b2lkICkKK3sKKyAgICBCT09MIHN0YXR1czsKKyAgICBMQVJHRV9JTlRFR0VSIHRpbWU7CisgICAgc3RhdHVzID0gUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIoICYgdGltZSApOworICAgIF9fa21wX3dpbjMyX3RpbWUgPSAoa21wX2ludDY0KSB0aW1lLlF1YWRQYXJ0OworfQorCit2b2lkCitfX2ttcF9pbml0aWFsaXplX3N5c3RlbV90aWNrKCB2b2lkICkKK3sKKyAgICB7CisgIEJPT0wgc3RhdHVzOworICBMQVJHRV9JTlRFR0VSIGZyZXE7CisKKyAgc3RhdHVzID0gUXVlcnlQZXJmb3JtYW5jZUZyZXF1ZW5jeSggJiBmcmVxICk7CisgIGlmICghIHN0YXR1cykgeworICAgICAgICBEV09SRCBlcnJvciA9IEdldExhc3RFcnJvcigpOworICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICBLTVBfTVNHKCBGdW5jdGlvbkVycm9yLCAiUXVlcnlQZXJmb3JtYW5jZUZyZXF1ZW5jeSgpIiApLAorICAgICAgICAgICAgS01QX0VSUiggZXJyb3IgKSwKKyAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICk7CisKKyAgfQorICBlbHNlIHsKKyAgICAgIF9fa21wX3dpbjMyX3RpY2sgPSAoKGRvdWJsZSkgMS4wKSAvIChkb3VibGUpIGZyZXEuUXVhZFBhcnQ7CisgIH0KKyAgICB9Cit9CisKKy8qIENhbGN1bGF0ZSB0aGUgZWxhcHNlZCB3YWxsIGNsb2NrIHRpbWUgZm9yIHRoZSB1c2VyICovCisKK3ZvaWQKK19fa21wX2VsYXBzZWQoIGRvdWJsZSAqdCApCit7CisgICAgQk9PTCBzdGF0dXM7CisgICAgTEFSR0VfSU5URUdFUiBub3c7CisgICAgc3RhdHVzID0gUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIoICYgbm93ICk7CisgICAgKnQgPSAoKGRvdWJsZSkgbm93LlF1YWRQYXJ0KSAqIF9fa21wX3dpbjMyX3RpY2s7Cit9CisKKy8qIENhbGN1bGF0ZSB0aGUgZWxhcHNlZCB3YWxsIGNsb2NrIHRpY2sgZm9yIHRoZSB1c2VyICovCisKK3ZvaWQKK19fa21wX2VsYXBzZWRfdGljayggZG91YmxlICp0ICkKK3sKKyAgICAqdCA9IF9fa21wX3dpbjMyX3RpY2s7Cit9CisKK3ZvaWQKK19fa21wX3JlYWRfc3lzdGVtX3RpbWUoIGRvdWJsZSAqZGVsdGEgKQoreworCisgICAgaWYgKGRlbHRhICE9IE5VTEwpIHsKKyAgICAgICAgQk9PTCBzdGF0dXM7CisgICAgICAgIExBUkdFX0lOVEVHRVIgbm93OworCisgICAgICAgIHN0YXR1cyA9IFF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKCAmIG5vdyApOworCisgICAgICAgICpkZWx0YSA9ICgoZG91YmxlKSAoKChrbXBfaW50NjQpIG5vdy5RdWFkUGFydCkgLSBfX2ttcF93aW4zMl90aW1lKSkKKyAgICAqIF9fa21wX3dpbjMyX3RpY2s7CisgICAgfQorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogQ2hhbmdlIHRocmVhZCB0byB0aGUgYWZmaW5pdHkgbWFzayBwb2ludGVkIHRvIGJ5IGFmZmluX21hc2sgYXJndW1lbnQKKyAqIGFuZCByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBvbGQgdmFsdWUgaW4gdGhlIG9sZF9tYXNrIGFyZ3VtZW50LCBpZiBhcmd1bWVudAorICogaXMgbm9uLU5VTEwuCisgKi8KKwordm9pZAorX19rbXBfY2hhbmdlX3RocmVhZF9hZmZpbml0eV9tYXNrKCBpbnQgZ3RpZCwga21wX2FmZmluX21hc2tfdCAqbmV3X21hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9hZmZpbl9tYXNrX3QgKm9sZF9tYXNrICkKK3sKKyAgICBrbXBfaW5mb190ICAqdGggPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCAqbmV3X21hc2sgIT0gMCApOworCisgICAgaWYgKCBvbGRfbWFzayAhPSBOVUxMICkgeworICAgICAgICAqb2xkX21hc2sgPSBTZXRUaHJlYWRBZmZpbml0eU1hc2soIHRoIC0+IHRoLnRoX2luZm8uZHMuZHNfdGhyZWFkLCAqbmV3X21hc2sgKTsKKworICAgICAgICBpZiAoISAqb2xkX21hc2sgKSB7CisgICAgICAgICAgICBEV09SRCBlcnJvciA9IEdldExhc3RFcnJvcigpOworICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50U2V0VGhyZWFkQWZmTWFzayApLAorICAgICAgICAgICAgICAgIEtNUF9FUlIoIGVycm9yICksCisgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpCisgICAgICAgICAgICBLTVBfSU5GT1JNKCBDaGFuZ2VBZmZNYXNrLCAiS01QX0FGRklOSVRZIChCaW5kKSIsIGd0aWQsICpvbGRfbWFzaywgKm5ld19tYXNrICk7CisKKyAgICAvKiBNYWtlIHN1cmUgb2xkIHZhbHVlIGlzIGNvcnJlY3QgaW4gdGhyZWFkIGRhdGEgc3RydWN0dXJlcyAqLworICAgIEtNUF9ERUJVR19BU1NFUlQoIG9sZF9tYXNrICE9IE5VTEwgJiYgKm9sZF9tYXNrID09ICoodGggLT4gdGgudGhfYWZmaW5fbWFzayApKTsKKworICAgIEtNUF9DUFVfQ09QWSh0aCAtPiB0aC50aF9hZmZpbl9tYXNrLCBuZXdfbWFzayk7Cit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZCAqIF9fc3RkY2FsbAorX19rbXBfbGF1bmNoX3dvcmtlciggdm9pZCAqYXJnICkKK3sKKyAgICB2b2xhdGlsZSB2b2lkICpzdGFja19kYXRhOworICAgIHZvaWQgKmV4aXRfdmFsOworICAgIHZvaWQgKnBhZGRpbmcgPSAwOworICAgIGttcF9pbmZvX3QgKnRoaXNfdGhyID0gKGttcF9pbmZvX3QgKikgYXJnOworICAgIGludCBndGlkOworCisgICAgZ3RpZCA9IHRoaXNfdGhyLT50aC50aF9pbmZvLmRzLmRzX2d0aWQ7CisgICAgX19rbXBfZ3RpZF9zZXRfc3BlY2lmaWMoIGd0aWQgKTsKKyNpZmRlZiBLTVBfVERBVEFfR1RJRAorICAgICNlcnJvciAiVGhpcyBkZWZpbmUgY2F1c2VzIHByb2JsZW1zIHdpdGggTG9hZExpYnJhcnkoKSArIGRlY2xzcGVjKHRocmVhZCkgIiBcCisgICAgICAgICJvbiBXaW5kb3dzKiBPUy4gIFNlZSBDUTUwNTY0LCB0ZXN0cyBrbXBfbG9hZF9saWJyYXJ5Ki5jIGFuZCB0aGlzIE1TRE4gIiBcCisgICAgICAgICJyZWZlcmVuY2U6IGh0dHA6Ly9zdXBwb3J0Lm1pY3Jvc29mdC5jb20va2IvMTE4ODE2IgorICAgIC8vX19rbXBfZ3RpZCA9IGd0aWQ7CisjZW5kaWYKKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfdGhyZWFkX25hbWUoIGd0aWQgKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICBfX2ttcF9hZmZpbml0eV9zZXRfaW5pdF9tYXNrKCBndGlkLCBGQUxTRSApOworCisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorICAgIC8vCisgICAgLy8gU2V0IHRoZSBGUCBjb250cm9sIHJlZ3MgdG8gYmUgYSBjb3B5IG9mCisgICAgLy8gdGhlIHBhcmFsbGVsIGluaXRpYWxpemF0aW9uIHRocmVhZCdzLgorICAgIC8vCisgICAgX19rbXBfY2xlYXJfeDg3X2ZwdV9zdGF0dXNfd29yZCgpOworICAgIF9fa21wX2xvYWRfeDg3X2ZwdV9jb250cm9sX3dvcmQoICZfX2ttcF9pbml0X3g4N19mcHVfY29udHJvbF93b3JkICk7CisgICAgX19rbXBfbG9hZF9teGNzciggJl9fa21wX2luaXRfbXhjc3IgKTsKKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisKKyAgICBpZiAoIF9fa21wX3N0a29mZnNldCA+IDAgJiYgZ3RpZCA+IDAgKSB7CisgICAgICAgIHBhZGRpbmcgPSBfYWxsb2NhKCBndGlkICogX19rbXBfc3Rrb2Zmc2V0ICk7CisgICAgfQorCisgICAgS01QX0ZTWU5DX1JFTEVBU0lORyggJnRoaXNfdGhyIC0+IHRoLnRoX2luZm8uZHMuZHNfYWxpdmUgKTsKKyAgICB0aGlzX3RociAtPiB0aC50aF9pbmZvLmRzLmRzX3RocmVhZF9pZCA9IEdldEN1cnJlbnRUaHJlYWRJZCgpOworICAgIFRDV180KCB0aGlzX3RociAtPiB0aC50aF9pbmZvLmRzLmRzX2FsaXZlLCBUUlVFICk7CisKKyAgICBpZiAoIFRDUl80KF9fa21wX2d0aWRfbW9kZSkgPCAyICkgeyAvLyBjaGVjayBzdGFjayBvbmx5IGlmIGl0IGlzIHVzZWQgdG8gZ2V0IGd0aWQKKyAgICAgICAgVENXX1BUUih0aGlzX3Roci0+dGgudGhfaW5mby5kcy5kc19zdGFja2Jhc2UsICZzdGFja19kYXRhKTsKKyAgICAgICAgS01QX0FTU0VSVCggdGhpc190aHIgLT4gdGgudGhfaW5mby5kcy5kc19zdGFja2dyb3cgPT0gRkFMU0UgKTsKKyAgICAgICAgX19rbXBfY2hlY2tfc3RhY2tfb3ZlcmxhcCggdGhpc190aHIgKTsKKyAgICB9CisgICAgS01QX01CKCk7CisgICAgZXhpdF92YWwgPSBfX2ttcF9sYXVuY2hfdGhyZWFkKCB0aGlzX3RociApOworICAgIEtNUF9GU1lOQ19SRUxFQVNJTkcoICZ0aGlzX3RociAtPiB0aC50aF9pbmZvLmRzLmRzX2FsaXZlICk7CisgICAgVENXXzQoIHRoaXNfdGhyIC0+IHRoLnRoX2luZm8uZHMuZHNfYWxpdmUsIEZBTFNFICk7CisgICAgS01QX01CKCk7CisgICAgcmV0dXJuIGV4aXRfdmFsOworfQorCisKKy8qIFRoZSBtb25pdG9yIHRocmVhZCBjb250cm9scyBhbGwgb2YgdGhlIHRocmVhZHMgaW4gdGhlIGNvbXBsZXggKi8KKwordm9pZCAqIF9fc3RkY2FsbAorX19rbXBfbGF1bmNoX21vbml0b3IoIHZvaWQgKmFyZyApCit7CisgICAgRFdPUkQgICAgICAgIHdhaXRfc3RhdHVzOworICAgIGttcF90aHJlYWRfdCBtb25pdG9yOworICAgIGludCAgICAgICAgICBzdGF0dXM7CisgICAgaW50ICAgICAgICAgIGludGVydmFsOworICAgIGttcF9pbmZvX3QgKnRoaXNfdGhyID0gKGttcF9pbmZvX3QgKikgYXJnOworCisgICAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF9pbml0X21vbml0b3IpOworICAgIFRDV180KCBfX2ttcF9pbml0X21vbml0b3IsIDIgKTsgICAgLy8gQUM6IFNpZ25hbCB0aGUgbGlicmFyeSB0aGF0IG1vbml0b3IgaGFzIHN0YXJ0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGhpZGUgIjIiIGluIGVudW0gKGxpa2Uge3RydWUsZmFsc2Usc3RhcnRlZH0pCisgICAgdGhpc190aHIgLT4gdGgudGhfaW5mby5kcy5kc190aHJlYWRfaWQgPSBHZXRDdXJyZW50VGhyZWFkSWQoKTsKKyAgICBUQ1dfNCggdGhpc190aHIgLT4gdGgudGhfaW5mby5kcy5kc19hbGl2ZSwgVFJVRSApOworCisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2xhdW5jaF9tb25pdG9yOiBsYXVuY2hlZFxuIiApICk7CisKKyAgICBtb25pdG9yID0gR2V0Q3VycmVudFRocmVhZCgpOworCisgICAgLyogc2V0IHRocmVhZCBwcmlvcml0eSAqLworICAgIHN0YXR1cyA9IFNldFRocmVhZFByaW9yaXR5KCBtb25pdG9yLCBUSFJFQURfUFJJT1JJVFlfSElHSEVTVCApOworICAgIGlmICghIHN0YXR1cykgeworICAgICAgICBEV09SRCBlcnJvciA9IEdldExhc3RFcnJvcigpOworICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICBLTVBfTVNHKCBDYW50U2V0VGhyZWFkUHJpb3JpdHkgKSwKKyAgICAgICAgICAgIEtNUF9FUlIoIGVycm9yICksCisgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICApOworICAgIH0KKworICAgIC8qIHJlZ2lzdGVyIHVzIGFzIG1vbml0b3IgKi8KKyAgICBfX2ttcF9ndGlkX3NldF9zcGVjaWZpYyggS01QX0dUSURfTU9OSVRPUiApOworI2lmZGVmIEtNUF9UREFUQV9HVElECisgICAgI2Vycm9yICJUaGlzIGRlZmluZSBjYXVzZXMgcHJvYmxlbXMgd2l0aCBMb2FkTGlicmFyeSgpICsgZGVjbHNwZWModGhyZWFkKSAiIFwKKyAgICAgICAgIm9uIFdpbmRvd3MqIE9TLiAgU2VlIENRNTA1NjQsIHRlc3RzIGttcF9sb2FkX2xpYnJhcnkqLmMgYW5kIHRoaXMgTVNETiAiIFwKKyAgICAgICAgInJlZmVyZW5jZTogaHR0cDovL3N1cHBvcnQubWljcm9zb2Z0LmNvbS9rYi8xMTg4MTYiCisgICAgLy9fX2ttcF9ndGlkID0gS01QX0dUSURfTU9OSVRPUjsKKyNlbmRpZgorCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF90aHJlYWRfaWdub3JlKCk7ICAgIC8vIEluc3RydWN0IEludGVsKFIpIFRocmVhZGluZyBUb29scyB0byBpZ25vcmUgbW9uaXRvciB0aHJlYWQuCisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICBpbnRlcnZhbCA9ICggMTAwMCAvIF9fa21wX21vbml0b3Jfd2FrZXVwcyApOyAvKiBpbiBtaWxsaXNlY29uZHMgKi8KKworICAgIHdoaWxlICghIFRDUl80KF9fa21wX2dsb2JhbC5nLmdfZG9uZSkpIHsKKyAgICAgICAgLyogIFRoaXMgdGhyZWFkIG1vbml0b3JzIHRoZSBzdGF0ZSBvZiB0aGUgc3lzdGVtICovCisKKyAgICAgICAgS0FfVFJBQ0UoIDE1LCAoICJfX2ttcF9sYXVuY2hfbW9uaXRvcjogdXBkYXRlXG4iICkgKTsKKworICAgICAgICB3YWl0X3N0YXR1cyA9IFdhaXRGb3JTaW5nbGVPYmplY3QoIF9fa21wX21vbml0b3JfZXYsIGludGVydmFsICk7CisKKyAgICAgICAgaWYgKHdhaXRfc3RhdHVzID09IFdBSVRfVElNRU9VVCkgeworICAgICAgICAgICAgVENXXzQoIF9fa21wX2dsb2JhbC5nLmdfdGltZS5kdC50X3ZhbHVlLAorICAgICAgICAgICAgICBUQ1JfNCggX19rbXBfZ2xvYmFsLmcuZ190aW1lLmR0LnRfdmFsdWUgKSArIDEgKTsKKyAgICAgICAgfQorCisgICAgICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworICAgIH0KKworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9sYXVuY2hfbW9uaXRvcjogZmluaXNoZWRcbiIgKSApOworCisgICAgc3RhdHVzID0gU2V0VGhyZWFkUHJpb3JpdHkoIG1vbml0b3IsIFRIUkVBRF9QUklPUklUWV9OT1JNQUwgKTsKKyAgICBpZiAoISBzdGF0dXMpIHsKKyAgICAgICAgRFdPUkQgZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgS01QX01TRyggQ2FudFNldFRocmVhZFByaW9yaXR5ICksCisgICAgICAgICAgICBLTVBfRVJSKCBlcnJvciApLAorICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgKTsKKyAgICB9CisKKyAgICBpZiAoX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCAhPSAwKSB7CisgICAgICAgIC8qIG5vdyB3ZSBuZWVkIHRvIHRlcm1pbmF0ZSB0aGUgd29ya2VyIHRocmVhZHMgICAqLworICAgICAgICAvKiB0aGUgdmFsdWUgb2YgdF9hYm9ydCBpcyB0aGUgc2lnbmFsIHdlIGNhdWdodCAqLworCisgICAgICAgIGludCBndGlkOworCisgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9sYXVuY2hfbW9uaXRvcjogdGVybWluYXRlIHNpZz0lZFxuIiwgKF9fa21wX2dsb2JhbC5nLmdfYWJvcnQpICkgKTsKKworICAgICAgICAvKiB0ZXJtaW5hdGUgdGhlIE9wZW5NUCB3b3JrZXIgdGhyZWFkcyAqLworICAgICAgICAvKiBUT0RPIHRoaXMgaXMgbm90IHZhbGlkIGZvciBzaWJsaW5nIHRocmVhZHMhIQorICAgICAgICAgKiB0aGUgdWJlciBtYXN0ZXIgbWlnaHQgbm90IGJlIDAgYW55bW9yZS4uICovCisgICAgICAgIGZvciAoZ3RpZCA9IDE7IGd0aWQgPCBfX2ttcF90aHJlYWRzX2NhcGFjaXR5OyArK2d0aWQpCisgICAgICAgICAgICBfX2ttcF90ZXJtaW5hdGVfdGhyZWFkKCBndGlkICk7CisKKyAgICAgICAgX19rbXBfY2xlYW51cCgpOworCisgICAgICAgIFNsZWVwKCAwICk7CisKKyAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2xhdW5jaF9tb25pdG9yOiByYWlzZSBzaWc9JWRcbiIsIChfX2ttcF9nbG9iYWwuZy5nX2Fib3J0KSApICk7CisKKyAgICAgICAgaWYgKF9fa21wX2dsb2JhbC5nLmdfYWJvcnQgPiAwKSB7CisgICAgICAgICAgICByYWlzZSggX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCApOworICAgICAgICB9CisgICAgfQorCisgICAgVENXXzQoIHRoaXNfdGhyIC0+IHRoLnRoX2luZm8uZHMuZHNfYWxpdmUsIEZBTFNFICk7CisKKyAgICBLTVBfTUIoKTsKKyAgICByZXR1cm4gYXJnOworfQorCit2b2lkCitfX2ttcF9jcmVhdGVfd29ya2VyKCBpbnQgZ3RpZCwga21wX2luZm9fdCAqdGgsIHNpemVfdCBzdGFja19zaXplICkKK3sKKyAgICBrbXBfdGhyZWFkX3QgICBoYW5kbGU7CisgICAgRFdPUkQgICAgICAgICAgaWRUaHJlYWQ7CisKKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfY3JlYXRlX3dvcmtlcjogdHJ5IHRvIGNyZWF0ZSB0aHJlYWQgKCVkKVxuIiwgZ3RpZCApICk7CisKKyAgICB0aC0+dGgudGhfaW5mby5kcy5kc19ndGlkID0gZ3RpZDsKKworICAgIGlmICggS01QX1VCRVJfR1RJRChndGlkKSApIHsKKyAgICAgICAgaW50ICAgICBzdGFja19kYXRhOworCisgICAgICAgIC8qIFRPRE86IEdldEN1cnJlbnRUaHJlYWQoKSByZXR1cm5zIGEgcHNldWRvLWhhbmRsZSB0aGF0IGlzIHVuc3VpdGFibGUgZm9yIG90aGVyIHRocmVhZHMgdG8gdXNlLgorICAgICAgICAgICBJcyBpdCBhcHByb3ByaWF0ZSB0byBqdXN0IHVzZSBHZXRDdXJyZW50VGhyZWFkPyAgV2hlbiBzaG91bGQgd2UgY2xvc2UgdGhpcyBoYW5kbGU/ICBXaGVuCisgICAgICAgICAgIHVucmVnaXN0ZXJpbmcgdGhlIHJvb3Q/CisgICAgICAgICovCisgICAgICAgIHsKKyAgICAgICAgICAgIEJPT0wgcmM7CisgICAgICAgICAgICByYyA9IER1cGxpY2F0ZUhhbmRsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldEN1cnJlbnRQcm9jZXNzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRDdXJyZW50VGhyZWFkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRDdXJyZW50UHJvY2VzcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoLT50aC50aF9pbmZvLmRzLmRzX3RocmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERVUExJQ0FURV9TQU1FX0FDQ0VTUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIEtNUF9BU1NFUlQoIHJjICk7CisgICAgICAgICAgICBLQV9UUkFDRSggMTAsICgiIF9fa21wX2NyZWF0ZV93b3JrZXI6IFJPT1QgSGFuZGxlIGR1cGxpY2F0ZWQsIHRoID0gJXAsIGhhbmRsZSA9ICUiIEtNUF9VSU5UUFRSX1NQRUMgIlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChMUFZPSUQpdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0aC0+dGgudGhfaW5mby5kcy5kc190aHJlYWQgKSApOworICAgICAgICAgICAgdGgtPnRoLnRoX2luZm8uZHMuZHNfdGhyZWFkX2lkID0gR2V0Q3VycmVudFRocmVhZElkKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBUQ1JfNChfX2ttcF9ndGlkX21vZGUpIDwgMiApIHsgLy8gY2hlY2sgc3RhY2sgb25seSBpZiBpdCBpcyB1c2VkIHRvIGdldCBndGlkCisgICAgICAgICAgICAvKiB3ZSB3aWxsIGR5bmFtaWNhbGx5IHVwZGF0ZSB0aGUgc3RhY2sgcmFuZ2UgaWYgZ3RpZF9tb2RlID09IDEgKi8KKyAgICAgICAgICAgIFRDV19QVFIodGgtPnRoLnRoX2luZm8uZHMuZHNfc3RhY2tiYXNlLCAmc3RhY2tfZGF0YSk7CisgICAgICAgICAgICBUQ1dfUFRSKHRoLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrc2l6ZSwgMCk7CisgICAgICAgICAgICBUQ1dfNCh0aC0+dGgudGhfaW5mby5kcy5kc19zdGFja2dyb3csIFRSVUUpOworICAgICAgICAgICAgX19rbXBfY2hlY2tfc3RhY2tfb3ZlcmxhcCggdGggKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICAgICAgLyogU2V0IHN0YWNrIHNpemUgZm9yIHRoaXMgdGhyZWFkIG5vdy4gKi8KKyAgICAgICAgS0FfVFJBQ0UoIDEwLCAoICJfX2ttcF9jcmVhdGVfd29ya2VyOiBzdGFja19zaXplID0gJSIgS01QX1NJWkVfVF9TUEVDCisgICAgICAgICAgICAgICAgICAgICAgICAiIGJ5dGVzXG4iLCBzdGFja19zaXplICkgKTsKKworICAgICAgICBzdGFja19zaXplICs9IGd0aWQgKiBfX2ttcF9zdGtvZmZzZXQ7CisKKyAgICAgICAgVENXX1BUUih0aC0+dGgudGhfaW5mby5kcy5kc19zdGFja3NpemUsIHN0YWNrX3NpemUpOworICAgICAgICBUQ1dfNCh0aC0+dGgudGhfaW5mby5kcy5kc19zdGFja2dyb3csIEZBTFNFKTsKKworICAgICAgICBLQV9UUkFDRSggMTAsICggIl9fa21wX2NyZWF0ZV93b3JrZXI6IChiZWZvcmUpIHN0YWNrX3NpemUgPSAlIgorICAgICAgICAgICAgICAgICAgICAgICAgS01QX1NJWkVfVF9TUEVDCisgICAgICAgICAgICAgICAgICAgICAgICAiIGJ5dGVzLCAmX19rbXBfbGF1bmNoX3dvcmtlciA9ICVwLCB0aCA9ICVwLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAiJmlkVGhyZWFkID0gJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAoU0laRV9UKSBzdGFja19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgKExQVEhSRUFEX1NUQVJUX1JPVVRJTkUpICYgX19rbXBfbGF1bmNoX3dvcmtlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIChMUFZPSUQpIHRoLCAmaWRUaHJlYWQgKSApOworCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaGFuZGxlID0gQ3JlYXRlVGhyZWFkKCBOVUxMLCAoU0laRV9UKSBzdGFja19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExQVEhSRUFEX1NUQVJUX1JPVVRJTkUpIF9fa21wX2xhdW5jaF93b3JrZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFBWT0lEKSB0aCwgU1RBQ0tfU0laRV9QQVJBTV9JU19BX1JFU0VSVkFUSU9OLCAmaWRUaHJlYWQgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBLQV9UUkFDRSggMTAsICggIl9fa21wX2NyZWF0ZV93b3JrZXI6IChhZnRlcikgc3RhY2tfc2l6ZSA9ICUiCisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfU0laRV9UX1NQRUMKKyAgICAgICAgICAgICAgICAgICAgICAgICIgYnl0ZXMsICZfX2ttcF9sYXVuY2hfd29ya2VyID0gJXAsIHRoID0gJXAsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJpZFRocmVhZCA9ICV1LCBoYW5kbGUgPSAlIiBLTVBfVUlOVFBUUl9TUEVDICJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAoU0laRV9UKSBzdGFja19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgKExQVEhSRUFEX1NUQVJUX1JPVVRJTkUpICYgX19rbXBfbGF1bmNoX3dvcmtlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIChMUFZPSUQpIHRoLCBpZFRocmVhZCwgaGFuZGxlICkgKTsKKworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggaGFuZGxlID09IDAgKSB7CisgICAgICAgICAgICAgICAgICAgIERXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coIENhbnRDcmVhdGVUaHJlYWQgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9FUlIoIGVycm9yICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0aC0+dGgudGhfaW5mby5kcy5kc190aHJlYWQgPSBoYW5kbGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKyAgICB9CisKKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfY3JlYXRlX3dvcmtlcjogZG9uZSBjcmVhdGluZyB0aHJlYWQgKCVkKVxuIiwgZ3RpZCApICk7Cit9CisKK2ludAorX19rbXBfc3RpbGxfcnVubmluZyhrbXBfaW5mb190ICp0aCkgeworICAgIHJldHVybiAoV0FJVF9USU1FT1VUID09IFdhaXRGb3JTaW5nbGVPYmplY3QoIHRoLT50aC50aF9pbmZvLmRzLmRzX3RocmVhZCwgMCkpOworfQorCit2b2lkCitfX2ttcF9jcmVhdGVfbW9uaXRvcigga21wX2luZm9fdCAqdGggKQoreworICAgIGttcF90aHJlYWRfdCAgICAgICAgaGFuZGxlOworICAgIERXT1JEICAgICAgICAgICAgICAgaWRUaHJlYWQ7CisgICAgaW50ICAgICAgICAgICAgICAgICBpZGVhbCwgbmV3X2lkZWFsOworICAgIGludCAgICAgY2FsbGVyX2d0aWQgPSBfX2ttcF9nZXRfZ3RpZCgpOworCisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2NyZWF0ZV9tb25pdG9yOiB0cnkgdG8gY3JlYXRlIG1vbml0b3JcbiIgKSApOworCisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICBfX2ttcF9tb25pdG9yX2V2ID0gQ3JlYXRlRXZlbnQoIE5VTEwsIFRSVUUsIEZBTFNFLCBOVUxMICk7CisgICAgaWYgKCBfX2ttcF9tb25pdG9yX2V2ID09IE5VTEwgKSB7CisgICAgICAgIERXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgIEtNUF9NU0coIENhbnRDcmVhdGVFdmVudCApLAorICAgICAgICAgICAgS01QX0VSUiggZXJyb3IgKSwKKyAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICk7CisgICAgfTsgLy8gaWYKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X3N5c3RlbV9vYmplY3RfY3JlYXRlZCggX19rbXBfbW9uaXRvcl9ldiwgIkV2ZW50IiApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgIHRoLT50aC50aF9pbmZvLmRzLmRzX3RpZCAgPSBLTVBfR1RJRF9NT05JVE9SOworICAgIHRoLT50aC50aF9pbmZvLmRzLmRzX2d0aWQgPSBLTVBfR1RJRF9NT05JVE9SOworCisgICAgLy8gRklYTUUgLSBvbiBXaW5kb3dzKiBPUywgaWYgX19rbXBfbW9uaXRvcl9zdGtzaXplID0gMCwgZmlndXJlIG91dCBob3cKKyAgICAvLyB0byBhdXRvbWF0aWNhbGx5IGV4cGFuZCBzdGFja3NpemUgYmFzZWQgb24gQ3JlYXRlVGhyZWFkIGVycm9yIGNvZGUuCisgICAgaWYgKCBfX2ttcF9tb25pdG9yX3N0a3NpemUgPT0gMCApIHsKKyAgICAgICAgX19rbXBfbW9uaXRvcl9zdGtzaXplID0gS01QX0RFRkFVTFRfTU9OSVRPUl9TVEtTSVpFOworICAgIH0KKyAgICBpZiAoIF9fa21wX21vbml0b3Jfc3Rrc2l6ZSA8IF9fa21wX3N5c19taW5fc3Rrc2l6ZSApIHsKKyAgICAgICAgX19rbXBfbW9uaXRvcl9zdGtzaXplID0gX19rbXBfc3lzX21pbl9zdGtzaXplOworICAgIH0KKworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9jcmVhdGVfbW9uaXRvcjogcmVxdWVzdGVkIHN0YWNrc2l6ZSA9ICVkIGJ5dGVzXG4iLAorICAgICAgICAgICAgICAgICAgIChpbnQpIF9fa21wX21vbml0b3Jfc3Rrc2l6ZSApICk7CisKKyAgICBUQ1dfNCggX19rbXBfZ2xvYmFsLmcuZ190aW1lLmR0LnRfdmFsdWUsIDAgKTsKKworICAgIGhhbmRsZSA9IENyZWF0ZVRocmVhZCggTlVMTCwgKFNJWkVfVCkgX19rbXBfbW9uaXRvcl9zdGtzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKExQVEhSRUFEX1NUQVJUX1JPVVRJTkUpIF9fa21wX2xhdW5jaF9tb25pdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKExQVk9JRCkgdGgsIFNUQUNLX1NJWkVfUEFSQU1fSVNfQV9SRVNFUlZBVElPTiwgJmlkVGhyZWFkICk7CisgICAgaWYgKGhhbmRsZSA9PSAwKSB7CisgICAgICAgIERXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgIEtNUF9NU0coIENhbnRDcmVhdGVUaHJlYWQgKSwKKyAgICAgICAgICAgIEtNUF9FUlIoIGVycm9yICksCisgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICApOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHRoLT50aC50aF9pbmZvLmRzLmRzX3RocmVhZCA9IGhhbmRsZTsKKworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2NyZWF0ZV9tb25pdG9yOiBtb25pdG9yIGNyZWF0ZWQgJXBcbiIsCisgICAgICAgICAgICAgICAgICAgKHZvaWQgKikgdGgtPnRoLnRoX2luZm8uZHMuZHNfdGhyZWFkICkgKTsKK30KKworLyoKKyAgQ2hlY2sgdG8gc2VlIGlmIHRocmVhZCBpcyBzdGlsbCBhbGl2ZS4KKworICBOT1RFOiAgVGhlIEV4aXRQcm9jZXNzKGNvZGUpIHN5c3RlbSBjYWxsIGNhdXNlcyBhbGwgdGhyZWFkcyB0byBUZXJtaW5hdGUKKyAgICAgICAgIHdpdGggYSBleGl0X3ZhbCA9IGNvZGUuICBCZWNhdXNlIG9mIHRoaXMgd2UgY2FuIG5vdCByZWx5IG9uCisgICAgICAgICBleGl0X3ZhbCBoYXZpbmcgYW55IHBhcnRpY3VsYXIgdmFsdWUuICBTbyB0aGlzIHJvdXRpbmUgbWF5CisgICAgICAgICByZXR1cm4gU1RJTExfQUxJVkUgaW4gZXhpdF92YWwgZXZlbiBhZnRlciB0aGUgdGhyZWFkIGlzIGRlYWQuCisqLworCitpbnQKK19fa21wX2lzX3RocmVhZF9hbGl2ZSgga21wX2luZm9fdCAqIHRoLCBEV09SRCAqZXhpdF92YWwgKQoreworICAgIERXT1JEIHJjOworICAgIHJjID0gR2V0RXhpdENvZGVUaHJlYWQoIHRoLT50aC50aF9pbmZvLmRzLmRzX3RocmVhZCwgZXhpdF92YWwgKTsKKyAgICBpZiAoIHJjID09IDAgKSB7CisgICAgICAgIERXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgIEtNUF9NU0coIEZ1bmN0aW9uRXJyb3IsICJHZXRFeGl0Q29kZVRocmVhZCgpIiApLAorICAgICAgICAgICAgS01QX0VSUiggZXJyb3IgKSwKKyAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICk7CisgICAgfTsgLy8gaWYKKyAgICByZXR1cm4gKCAqZXhpdF92YWwgPT0gU1RJTExfQUNUSVZFICk7Cit9CisKKwordm9pZAorX19rbXBfZXhpdF90aHJlYWQoCisgICAgaW50IGV4aXRfc3RhdHVzCispIHsKKyAgICBFeGl0VGhyZWFkKCBleGl0X3N0YXR1cyApOworfSAvLyBfX2ttcF9leGl0X3RocmVhZAorCisvKgorICAgIFRoaXMgaXMgYSBjb21tb24gcGFydCBmb3IgYm90aCBfX2ttcF9yZWFwX3dvcmtlcigpIGFuZCBfX2ttcF9yZWFwX21vbml0b3IoKS4KKyovCitzdGF0aWMgdm9pZAorX19rbXBfcmVhcF9jb21tb24oIGttcF9pbmZvX3QgKiB0aCApCit7CisgICAgRFdPUkQgZXhpdF92YWw7CisKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgIEtBX1RSQUNFKCAxMCwgKCAiX19rbXBfcmVhcF9jb21tb246IHRyeSB0byByZWFwICglZClcbiIsIHRoLT50aC50aF9pbmZvLmRzLmRzX2d0aWQgKSApOworCisgICAgLyoKKyAgICAgICAgMjAwNi0xMC0xOToKKworICAgICAgICBUaGVyZSBhcmUgdHdvIG9wcG9zaXRlIHNpdHVhdGlvbnM6CisKKyAgICAgICAgICAgIDEuIFdpbmRvd3MqIE9TIGtlZXAgdGhyZWFkIGFsaXZlIGFmdGVyIGl0IHJlc2V0cyBkc19hbGl2ZSBmbGFnIGFuZCBleGl0cyBmcm9tIHRocmVhZAorICAgICAgICAgICAgICAgZnVuY3Rpb24uIChGb3IgZXhhbXBsZSwgc2VlIEM3MDc3MC9RMzk0MjgxICJ1bmxvYWRpbmcgb2YgZGxsIGJhc2VkIG9uIE9NUCBpcyB2ZXJ5CisgICAgICAgICAgICAgICBzbG93Ii4pCisgICAgICAgICAgICAyLiBXaW5kb3dzKiBPUyBtYXkga2lsbCB0aHJlYWQgYmVmb3JlIGl0IHJlc2V0cyBkc19hbGl2ZSBmbGFnLgorCisgICAgICAgIFJpZ2h0IHNvbHV0aW9uIHNlZW1zIHRvIGJlIHdhaXRpbmcgZm9yICplaXRoZXIqIHRocmVhZCB0ZXJtaW5hdGlvbiAqb3IqIGRzX2FsaXZlIHJlc2V0dGluZy4KKworICAgICovCisKKyAgICB7CisgICAgICAgIC8vIFRPRE86IFRoaXMgY29kZSBpcyB2ZXJ5IHNpbWlsYXIgdG8gS01QX1dBSVRfWUlFTEQuIE5lZWQgdG8gZ2VuZXJhbGl6ZSBLTVBfV0FJVF9ZSUVMRCB0bworICAgICAgICAvLyBjb3ZlciB0aGlzIHVzYWdlIGFsc28uCisgICAgICAgIHZvaWQgKiBvYmogPSBOVUxMOworICAgICAgICByZWdpc3RlciBrbXBfdWludDMyIHNwaW5zOworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgS01QX0ZTWU5DX1NQSU5fSU5JVCggb2JqLCAodm9pZCopICYgdGgtPnRoLnRoX2luZm8uZHMuZHNfYWxpdmUgKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAgICAgIEtNUF9JTklUX1lJRUxEKCBzcGlucyApOworICAgICAgICBkbyB7CisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICAgICAgS01QX0ZTWU5DX1NQSU5fUFJFUEFSRSggb2JqICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworICAgICAgICAgICAgX19rbXBfaXNfdGhyZWFkX2FsaXZlKCB0aCwgJmV4aXRfdmFsICk7CisgICAgICAgICAgICBLTVBfWUlFTEQoIFRDUl80KF9fa21wX250aCkgPiBfX2ttcF9hdmFpbF9wcm9jICk7CisgICAgICAgICAgICBLTVBfWUlFTERfU1BJTiggc3BpbnMgKTsKKyAgICAgICAgfSB3aGlsZSAoIGV4aXRfdmFsID09IFNUSUxMX0FDVElWRSAmJiBUQ1JfNCggdGgtPnRoLnRoX2luZm8uZHMuZHNfYWxpdmUgKSApOworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgaWYgKCBleGl0X3ZhbCA9PSBTVElMTF9BQ1RJVkUgKSB7CisgICAgICAgICAgICBLTVBfRlNZTkNfQ0FOQ0VMKCBvYmogKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEtNUF9GU1lOQ19TUElOX0FDUVVJUkVEKCBvYmogKTsKKyAgICAgICAgfTsgLy8gaWYKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAgfQorCisgICAgX19rbXBfZnJlZV9oYW5kbGUoIHRoLT50aC50aF9pbmZvLmRzLmRzX3RocmVhZCApOworCisgICAgLyoKKyAgICAgKiBOT1RFOiAgVGhlIEV4aXRQcm9jZXNzKGNvZGUpIHN5c3RlbSBjYWxsIGNhdXNlcyBhbGwgdGhyZWFkcyB0byBUZXJtaW5hdGUKKyAgICAgKiAgICAgICAgd2l0aCBhIGV4aXRfdmFsID0gY29kZS4gIEJlY2F1c2Ugb2YgdGhpcyB3ZSBjYW4gbm90IHJlbHkgb24KKyAgICAgKiAgICAgICAgZXhpdF92YWwgaGF2aW5nIGFueSBwYXJ0aWN1bGFyIHZhbHVlLgorICAgICAqLworICAgIGlmICggZXhpdF92YWwgPT0gU1RJTExfQUNUSVZFICkgeworICAgICAgICBLQV9UUkFDRSggMSwgKCAiX19rbXBfcmVhcF9jb21tb246IHRocmVhZCBzdGlsbCBhY3RpdmUuXG4iICkgKTsKKyAgICB9IGVsc2UgaWYgKCAodm9pZCAqKSBleGl0X3ZhbCAhPSAodm9pZCAqKSB0aCkgeworICAgICAgICBLQV9UUkFDRSggMSwgKCAiX19rbXBfcmVhcF9jb21tb246IEV4aXRQcm9jZXNzIC8gVGVybWluYXRlVGhyZWFkIHVzZWQ/XG4iICkgKTsKKyAgICB9OyAvLyBpZgorCisgICAgS0FfVFJBQ0UoIDEwLAorICAgICAgICAoCisgICAgICAgICAgICAiX19rbXBfcmVhcF9jb21tb246IGRvbmUgcmVhcGluZyAoJWQpLCBoYW5kbGUgPSAlIiBLTVBfVUlOVFBUUl9TUEVDICJcbiIsCisgICAgICAgICAgICB0aC0+dGgudGhfaW5mby5kcy5kc19ndGlkLAorICAgICAgICAgICAgdGgtPnRoLnRoX2luZm8uZHMuZHNfdGhyZWFkCisgICAgICAgICkKKyAgICApOworCisgICAgdGgtPnRoLnRoX2luZm8uZHMuZHNfdGhyZWFkICAgID0gMDsKKyAgICB0aC0+dGgudGhfaW5mby5kcy5kc190aWQgICAgICAgPSBLTVBfR1RJRF9ETkU7CisgICAgdGgtPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCAgICAgID0gS01QX0dUSURfRE5FOworICAgIHRoLT50aC50aF9pbmZvLmRzLmRzX3RocmVhZF9pZCA9IDA7CisKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KK30KKwordm9pZAorX19rbXBfcmVhcF9tb25pdG9yKCBrbXBfaW5mb190ICp0aCApCit7CisgICAgaW50IHN0YXR1czsKKworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9yZWFwX21vbml0b3I6IHRyeSB0byByZWFwICVwXG4iLAorICAgICAgICAgICAgICAgICAgICh2b2lkICopIHRoLT50aC50aF9pbmZvLmRzLmRzX3RocmVhZCApICk7CisKKyAgICAvLyBJZiBtb25pdG9yIGhhcyBiZWVuIGNyZWF0ZWQsIGl0cyB0aWQgYW5kIGd0aWQgc2hvdWxkIGJlIEtNUF9HVElEX01PTklUT1IuCisgICAgLy8gSWYgYm90aCB0aWQgYW5kIGd0aWQgYXJlIDAsIGl0IG1lYW5zIHRoZSBtb25pdG9yIGRpZCBub3QgZXZlciBzdGFydC4KKyAgICAvLyBJZiBib3RoIHRpZCBhbmQgZ3RpZCBhcmUgS01QX0dUSURfRE5FLCB0aGUgbW9uaXRvciBoYXMgYmVlbiBzaHV0IGRvd24uCisgICAgS01QX0RFQlVHX0FTU0VSVCggdGgtPnRoLnRoX2luZm8uZHMuZHNfdGlkID09IHRoLT50aC50aF9pbmZvLmRzLmRzX2d0aWQgKTsKKyAgICBpZiAoIHRoLT50aC50aF9pbmZvLmRzLmRzX2d0aWQgIT0gS01QX0dUSURfTU9OSVRPUiApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH07IC8vIGlmCisKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgIHN0YXR1cyA9IFNldEV2ZW50KCBfX2ttcF9tb25pdG9yX2V2ICk7CisgICAgaWYgKCBzdGF0dXMgPT0gRkFMU0UgKSB7CisgICAgICAgIERXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgIEtNUF9NU0coIENhbnRTZXRFdmVudCApLAorICAgICAgICAgICAgS01QX0VSUiggZXJyb3IgKSwKKyAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICk7CisgICAgfQorICAgIEtBX1RSQUNFKCAxMCwgKCAiX19rbXBfcmVhcF9tb25pdG9yOiByZWFwaW5nIHRocmVhZCAoJWQpXG4iLCB0aC0+dGgudGhfaW5mby5kcy5kc19ndGlkICkgKTsKKyAgICBfX2ttcF9yZWFwX2NvbW1vbiggdGggKTsKKworICAgIF9fa21wX2ZyZWVfaGFuZGxlKCBfX2ttcF9tb25pdG9yX2V2ICk7CisKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KK30KKwordm9pZAorX19rbXBfcmVhcF93b3JrZXIoIGttcF9pbmZvX3QgKiB0aCApCit7CisgICAgS0FfVFJBQ0UoIDEwLCAoICJfX2ttcF9yZWFwX3dvcmtlcjogcmVhcGluZyB0aHJlYWQgKCVkKVxuIiwgdGgtPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCApICk7CisgICAgX19rbXBfcmVhcF9jb21tb24oIHRoICk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiBLTVBfSEFORExFX1NJR05BTFMKKworCitzdGF0aWMgdm9pZAorX19rbXBfdGVhbV9oYW5kbGVyKCBpbnQgc2lnbm8gKQoreworICAgIGlmICggX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCA9PSAwICkgeworICAgICAgICAvLyBTdGFnZSAxIHNpZ25hbCBoYW5kbGVyLCBsZXQncyBzaHV0IGRvd24gYWxsIG9mIHRoZSB0aHJlYWRzLgorICAgICAgICBpZiAoIF9fa21wX2RlYnVnX2J1ZiApIHsKKyAgICAgICAgICAgIF9fa21wX2R1bXBfZGVidWdfYnVmZmVyKCk7CisgICAgICAgIH07IC8vIGlmCisgICAgICAgIEtNUF9NQigpOyAgICAgICAvLyBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuCisgICAgICAgIFRDV180KCBfX2ttcF9nbG9iYWwuZy5nX2Fib3J0LCBzaWdubyApOworICAgICAgICBLTVBfTUIoKTsgICAgICAgLy8gRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLgorICAgICAgICBUQ1dfNCggX19rbXBfZ2xvYmFsLmcuZ19kb25lLCBUUlVFICk7CisgICAgICAgIEtNUF9NQigpOyAgICAgICAvLyBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuCisgICAgfQorfSAvLyBfX2ttcF90ZWFtX2hhbmRsZXIKKworCisKK3N0YXRpYworc2lnX2Z1bmNfdCBfX2ttcF9zaWduYWwoIGludCBzaWdudW0sIHNpZ19mdW5jX3QgaGFuZGxlciApIHsKKyAgICBzaWdfZnVuY190IG9sZCA9IHNpZ25hbCggc2lnbnVtLCBoYW5kbGVyICk7CisgICAgaWYgKCBvbGQgPT0gU0lHX0VSUiApIHsKKyAgICAgICAgaW50IGVycm9yID0gZXJybm87CisgICAgICAgIF9fa21wX21zZygga21wX21zX2ZhdGFsLCBLTVBfTVNHKCBGdW5jdGlvbkVycm9yLCAic2lnbmFsIiApLCBLTVBfRVJSKCBlcnJvciApLCBfX2ttcF9tc2dfbnVsbCApOworICAgIH07IC8vIGlmCisgICAgcmV0dXJuIG9sZDsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2luc3RhbGxfb25lX2hhbmRsZXIoCisgICAgaW50ICAgICAgICAgICBzaWcsCisgICAgc2lnX2Z1bmNfdCAgICBoYW5kbGVyLAorICAgIGludCAgICAgICAgICAgcGFyYWxsZWxfaW5pdAorKSB7CisgICAgc2lnX2Z1bmNfdCBvbGQ7CisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisgICAgS0JfVFJBQ0UoIDYwLCAoIl9fa21wX2luc3RhbGxfb25lX2hhbmRsZXI6IGNhbGxlZDogc2lnPSVkXG4iLCBzaWcgKSApOworICAgIGlmICggcGFyYWxsZWxfaW5pdCApIHsKKyAgICAgICAgb2xkID0gX19rbXBfc2lnbmFsKCBzaWcsIGhhbmRsZXIgKTsKKyAgICAgICAgLy8gU0lHX0RGTCBvbiBXaW5kb3dzKiBPUyBpbiBOVUxMIG9yIDAuCisgICAgICAgIGlmICggb2xkID09IF9fa21wX3NpZ2hsZHJzWyBzaWcgXSApIHsKKyAgICAgICAgICAgIF9fa21wX3NpZ2luc3RhbGxlZFsgc2lnIF0gPSAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gUmVzdG9yZS9rZWVwIHVzZXIncyBoYW5kbGVyIGlmIG9uZSBwcmV2aW91c2x5IGluc3RhbGxlZC4KKyAgICAgICAgICAgIG9sZCA9IF9fa21wX3NpZ25hbCggc2lnLCBvbGQgKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBTYXZlIGluaXRpYWwvc3lzdGVtIHNpZ25hbCBoYW5kbGVycyB0byBzZWUgaWYgdXNlciBoYW5kbGVycyBpbnN0YWxsZWQuCisgICAgICAgIC8vIDIwMDktMDktMjM6IEl0IGlzIGEgZGVhZCBjb2RlLiBPbiBXaW5kb3dzKiBPUyBfX2ttcF9pbnN0YWxsX3NpZ25hbHMgY2FsbGVkIG9uY2Ugd2l0aAorICAgICAgICAvLyBwYXJhbGxlbF9pbml0ID09IFRSVUUuCisgICAgICAgIG9sZCA9IF9fa21wX3NpZ25hbCggc2lnLCBTSUdfREZMICk7CisgICAgICAgIF9fa21wX3NpZ2hsZHJzWyBzaWcgXSA9IG9sZDsKKyAgICAgICAgX19rbXBfc2lnbmFsKCBzaWcsIG9sZCApOworICAgIH07IC8vIGlmCisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCit9IC8vIF9fa21wX2luc3RhbGxfb25lX2hhbmRsZXIKKworc3RhdGljIHZvaWQKK19fa21wX3JlbW92ZV9vbmVfaGFuZGxlciggaW50IHNpZyApIHsKKyAgICBpZiAoIF9fa21wX3NpZ2luc3RhbGxlZFsgc2lnIF0gKSB7CisgICAgICAgIHNpZ19mdW5jX3Qgb2xkOworICAgICAgICBLTVBfTUIoKTsgICAgICAgLy8gRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLgorICAgICAgICBLQl9UUkFDRSggNjAsICggIl9fa21wX3JlbW92ZV9vbmVfaGFuZGxlcjogY2FsbGVkOiBzaWc9JWRcbiIsIHNpZyApICk7CisgICAgICAgIG9sZCA9IF9fa21wX3NpZ25hbCggc2lnLCBfX2ttcF9zaWdobGRyc1sgc2lnIF0gKTsKKyAgICAgICAgaWYgKCBvbGQgIT0gX19rbXBfdGVhbV9oYW5kbGVyICkgeworICAgICAgICAgICAgS0JfVFJBQ0UoIDEwLCAoICJfX2ttcF9yZW1vdmVfb25lX2hhbmRsZXI6IG9vcHMsIG5vdCBvdXIgaGFuZGxlciwgcmVzdG9yaW5nOiBzaWc9JWRcbiIsIHNpZyApICk7CisgICAgICAgICAgICBvbGQgPSBfX2ttcF9zaWduYWwoIHNpZywgb2xkICk7CisgICAgICAgIH07IC8vIGlmCisgICAgICAgIF9fa21wX3NpZ2hsZHJzWyBzaWcgXSA9IE5VTEw7CisgICAgICAgIF9fa21wX3NpZ2luc3RhbGxlZFsgc2lnIF0gPSAwOworICAgICAgICBLTVBfTUIoKTsgICAgICAgLy8gRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLgorICAgIH07IC8vIGlmCit9IC8vIF9fa21wX3JlbW92ZV9vbmVfaGFuZGxlcgorCisKK3ZvaWQKK19fa21wX2luc3RhbGxfc2lnbmFscyggaW50IHBhcmFsbGVsX2luaXQgKQoreworICAgIEtCX1RSQUNFKCAxMCwgKCAiX19rbXBfaW5zdGFsbF9zaWduYWxzOiBjYWxsZWRcbiIgKSApOworICAgIGlmICggISBfX2ttcF9oYW5kbGVfc2lnbmFscyApIHsKKyAgICAgICAgS0JfVFJBQ0UoIDEwLCAoICJfX2ttcF9pbnN0YWxsX3NpZ25hbHM6IEtNUF9IQU5ETEVfU0lHTkFMUyBpcyBmYWxzZSAtIGhhbmRsZXJzIG5vdCBpbnN0YWxsZWRcbiIgKSApOworICAgICAgICByZXR1cm47CisgICAgfTsgLy8gaWYKKyAgICBfX2ttcF9pbnN0YWxsX29uZV9oYW5kbGVyKCBTSUdJTlQsICBfX2ttcF90ZWFtX2hhbmRsZXIsIHBhcmFsbGVsX2luaXQgKTsKKyAgICBfX2ttcF9pbnN0YWxsX29uZV9oYW5kbGVyKCBTSUdJTEwsICBfX2ttcF90ZWFtX2hhbmRsZXIsIHBhcmFsbGVsX2luaXQgKTsKKyAgICBfX2ttcF9pbnN0YWxsX29uZV9oYW5kbGVyKCBTSUdBQlJULCBfX2ttcF90ZWFtX2hhbmRsZXIsIHBhcmFsbGVsX2luaXQgKTsKKyAgICBfX2ttcF9pbnN0YWxsX29uZV9oYW5kbGVyKCBTSUdGUEUsICBfX2ttcF90ZWFtX2hhbmRsZXIsIHBhcmFsbGVsX2luaXQgKTsKKyAgICBfX2ttcF9pbnN0YWxsX29uZV9oYW5kbGVyKCBTSUdTRUdWLCBfX2ttcF90ZWFtX2hhbmRsZXIsIHBhcmFsbGVsX2luaXQgKTsKKyAgICBfX2ttcF9pbnN0YWxsX29uZV9oYW5kbGVyKCBTSUdURVJNLCBfX2ttcF90ZWFtX2hhbmRsZXIsIHBhcmFsbGVsX2luaXQgKTsKK30gLy8gX19rbXBfaW5zdGFsbF9zaWduYWxzCisKKwordm9pZAorX19rbXBfcmVtb3ZlX3NpZ25hbHMoIHZvaWQgKQoreworICAgIGludCBzaWc7CisgICAgS0JfVFJBQ0UoIDEwLCAoIl9fa21wX3JlbW92ZV9zaWduYWxzOiBjYWxsZWRcbiIgKSApOworICAgIGZvciAoIHNpZyA9IDE7IHNpZyA8IE5TSUc7ICsrIHNpZyApIHsKKyAgICAgICAgX19rbXBfcmVtb3ZlX29uZV9oYW5kbGVyKCBzaWcgKTsKKyAgICB9OyAvLyBmb3Igc2lnCit9IC8vIF9fa21wX3JlbW92ZV9zaWduYWxzCisKKworI2VuZGlmIC8vIEtNUF9IQU5ETEVfU0lHTkFMUworCisvKiBQdXQgdGhlIHRocmVhZCB0byBzbGVlcCBmb3IgYSB0aW1lIHBlcmlvZCAqLwordm9pZAorX19rbXBfdGhyZWFkX3NsZWVwKCBpbnQgbWlsbGlzICkKK3sKKyAgICBEV09SRCBzdGF0dXM7CisKKyAgICBzdGF0dXMgPSBTbGVlcEV4KCAoRFdPUkQpIG1pbGxpcywgRkFMU0UgKTsKKyAgICBpZiAoIHN0YXR1cyApIHsKKyAgICAgICAgRFdPUkQgZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgS01QX01TRyggRnVuY3Rpb25FcnJvciwgIlNsZWVwRXgoKSIgKSwKKyAgICAgICAgICAgIEtNUF9FUlIoIGVycm9yICksCisgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICApOworICAgIH0KK30KKworLyogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGdpdmVuIGFkZHJlc3MgaXMgbWFwcGVkIGludG8gdGhlIGN1cnJlbnQgYWRkcmVzcyBzcGFjZS4gKi8KK2ludAorX19rbXBfaXNfYWRkcmVzc19tYXBwZWQoIHZvaWQgKiBhZGRyICkKK3sKKyAgICBEV09SRCBzdGF0dXM7CisgICAgTUVNT1JZX0JBU0lDX0lORk9STUFUSU9OIGxwQnVmZmVyOworICAgIFNJWkVfVCBkd0xlbmd0aDsKKworICAgIGR3TGVuZ3RoID0gc2l6ZW9mKE1FTU9SWV9CQVNJQ19JTkZPUk1BVElPTik7CisKKyAgICBzdGF0dXMgPSBWaXJ0dWFsUXVlcnkoIGFkZHIsICZscEJ1ZmZlciwgZHdMZW5ndGggKTsKKworICAgIHJldHVybiAhKCgoIGxwQnVmZmVyLlN0YXRlID09IE1FTV9SRVNFUlZFKSB8fCAoIGxwQnVmZmVyLlN0YXRlID09IE1FTV9GUkVFICkpIHx8CisgICAgICAgKCggbHBCdWZmZXIuUHJvdGVjdCA9PSBQQUdFX05PQUNDRVNTICkgfHwgKCBscEJ1ZmZlci5Qcm90ZWN0ID09IFBBR0VfRVhFQ1VURSApKSk7Cit9CisKK2ttcF91aW50NjQKK19fa21wX2hhcmR3YXJlX3RpbWVzdGFtcCh2b2lkKQoreworICAgIGttcF91aW50NjQgciA9IDA7CisKKyAgICBRdWVyeVBlcmZvcm1hbmNlQ291bnRlcigoTEFSR0VfSU5URUdFUiopICZyKTsKKyAgICByZXR1cm4gcjsKK30KKworLyogRnJlZSBoYW5kbGUgYW5kIGNoZWNrIHRoZSBlcnJvciBjb2RlICovCit2b2lkCitfX2ttcF9mcmVlX2hhbmRsZSgga21wX3RocmVhZF90IHRIYW5kbGUgKQoreworLyogY2FsbGVkIHdpdGggcGFyYW1ldGVyIHR5cGUgSEFORExFIGFsc28sIHRodXMgc3VwcG9zZSBrbXBfdGhyZWFkX3QgZGVmaW5lZCBhcyBIQU5ETEUgKi8KKyAgICBCT09MIHJjOworICAgIHJjID0gQ2xvc2VIYW5kbGUoIHRIYW5kbGUgKTsKKyAgICBpZiAoICFyYyApIHsKKyAgICAgICAgRFdPUkQgZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgS01QX01TRyggQ2FudENsb3NlSGFuZGxlICksCisgICAgICAgICAgICBLTVBfRVJSKCBlcnJvciApLAorICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgKTsKKyAgICB9Cit9CisKK2ludAorX19rbXBfZ2V0X2xvYWRfYmFsYW5jZSggaW50IG1heCApIHsKKworICAgIHN0YXRpYyBVTE9ORyBnbGJfYnVmZl9zaXplID0gMTAwICogMTAyNDsKKworICAgIHN0YXRpYyBpbnQgICAgIGdsYl9ydW5uaW5nX3RocmVhZHMgID0gMDsgIC8qIFNhdmVkIGNvdW50IG9mIHRoZSBydW5uaW5nIHRocmVhZHMgZm9yIHRoZSB0aHJlYWQgYmFsYW5jZSBhbGdvcnRpaG0gKi8KKyAgICBzdGF0aWMgZG91YmxlICBnbGJfY2FsbF90aW1lICAgICAgICA9IDA7ICAvKiBUaHJlYWQgYmFsYW5jZSBhbGdvcml0aG0gY2FsbCB0aW1lICovCisKKyAgICBpbnQgcnVubmluZ190aHJlYWRzID0gMDsgICAgICAgICAgICAgIC8vIE51bWJlciBvZiBydW5uaW5nIHRocmVhZHMgaW4gdGhlIHN5c3RlbS4KKyAgICBOVFNUQVRVUyAgc3RhdHVzICAgICAgICA9IDA7CisgICAgVUxPTkcgICAgIGJ1ZmZfc2l6ZSAgICAgPSAwOworICAgIFVMT05HICAgICBpbmZvX3NpemUgICAgID0gMDsKKyAgICB2b2lkICogICAgYnVmZmVyICAgICAgICA9IE5VTEw7CisgICAgUFNZU1RFTV9QUk9DRVNTX0lORk9STUFUSU9OIHNwaSA9IE5VTEw7CisgICAgaW50IGZpcnN0X3RpbWUgICAgICAgICAgPSAxOworCisgICAgZG91YmxlIGNhbGxfdGltZSA9IDAuMDsgLy9zdGFydCwgZmluaXNoOworCisgICAgX19rbXBfZWxhcHNlZCggJiBjYWxsX3RpbWUgKTsKKworICAgIGlmICggZ2xiX2NhbGxfdGltZSAmJgorICAgICAgICAgICAgKCBjYWxsX3RpbWUgLSBnbGJfY2FsbF90aW1lIDwgX19rbXBfbG9hZF9iYWxhbmNlX2ludGVydmFsICkgKSB7CisgICAgICAgIHJ1bm5pbmdfdGhyZWFkcyA9IGdsYl9ydW5uaW5nX3RocmVhZHM7CisgICAgICAgIGdvdG8gZmluaXNoOworICAgIH0KKyAgICBnbGJfY2FsbF90aW1lID0gY2FsbF90aW1lOworCisgICAgLy8gRG8gbm90IHNwZW5kIHRpbWUgb24gcnVubmluZyBhbGdvcml0aG0gaWYgd2UgaGF2ZSBhIHBlcm1hbmVudCBlcnJvci4KKyAgICBpZiAoIE50UXVlcnlTeXN0ZW1JbmZvcm1hdGlvbiA9PSBOVUxMICkgeworICAgICAgICBydW5uaW5nX3RocmVhZHMgPSAtMTsKKyAgICAgICAgZ290byBmaW5pc2g7CisgICAgfTsgLy8gaWYKKworICAgIGlmICggbWF4IDw9IDAgKSB7CisgICAgICAgIG1heCA9IElOVF9NQVg7CisgICAgfTsgLy8gaWYKKworICAgIGRvIHsKKworICAgICAgICBpZiAoIGZpcnN0X3RpbWUgKSB7CisgICAgICAgICAgICBidWZmX3NpemUgPSBnbGJfYnVmZl9zaXplOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYnVmZl9zaXplID0gMiAqIGJ1ZmZfc2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIGJ1ZmZlciA9IEtNUF9JTlRFUk5BTF9SRUFMTE9DKCBidWZmZXIsIGJ1ZmZfc2l6ZSApOworICAgICAgICBpZiAoIGJ1ZmZlciA9PSBOVUxMICkgeworICAgICAgICAgICAgcnVubmluZ190aHJlYWRzID0gLTE7CisgICAgICAgICAgICBnb3RvIGZpbmlzaDsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgc3RhdHVzID0gTnRRdWVyeVN5c3RlbUluZm9ybWF0aW9uKCBTeXN0ZW1Qcm9jZXNzSW5mb3JtYXRpb24sIGJ1ZmZlciwgYnVmZl9zaXplLCAmIGluZm9fc2l6ZSApOworICAgICAgICBmaXJzdF90aW1lID0gMDsKKworICAgIH0gd2hpbGUgKCBzdGF0dXMgPT0gU1RBVFVTX0lORk9fTEVOR1RIX01JU01BVENIICk7CisgICAgZ2xiX2J1ZmZfc2l6ZSA9IGJ1ZmZfc2l6ZTsKKworICAgICNkZWZpbmUgQ0hFQ0soIGNvbmQgKSAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggY29uZCApOyAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKCAhICggY29uZCApICkgeyAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHJ1bm5pbmdfdGhyZWFkcyA9IC0xOyAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGdvdG8gZmluaXNoOyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9CisKKyAgICBDSEVDSyggYnVmZl9zaXplID49IGluZm9fc2l6ZSApOworICAgIHNwaSA9IFBTWVNURU1fUFJPQ0VTU19JTkZPUk1BVElPTiggYnVmZmVyICk7CisgICAgZm9yICggOyA7ICkgeworICAgICAgICBwdHJkaWZmX3Qgb2Zmc2V0ID0gdWludHB0cl90KCBzcGkgKSAtIHVpbnRwdHJfdCggYnVmZmVyICk7CisgICAgICAgIENIRUNLKCAwIDw9IG9mZnNldCAmJiBvZmZzZXQgKyBzaXplb2YoIFNZU1RFTV9QUk9DRVNTX0lORk9STUFUSU9OICkgPCBpbmZvX3NpemUgKTsKKyAgICAgICAgSEFORExFIHBpZCA9IHNwaS0+UHJvY2Vzc0lkOworICAgICAgICBVTE9ORyBudW0gPSBzcGktPk51bWJlck9mVGhyZWFkczsKKyAgICAgICAgQ0hFQ0soIG51bSA+PSAxICk7CisgICAgICAgIHNpemVfdCBzcGlfc2l6ZSA9IHNpemVvZiggU1lTVEVNX1BST0NFU1NfSU5GT1JNQVRJT04gKSArIHNpemVvZiggU1lTVEVNX1RIUkVBRCApICogKCBudW0gLSAxICk7CisgICAgICAgIENIRUNLKCBvZmZzZXQgKyBzcGlfc2l6ZSA8IGluZm9fc2l6ZSApOyAgICAgICAgICAvLyBNYWtlIHN1cmUgcHJvY2VzcyBpbmZvIHJlY29yZCBmaXRzIHRoZSBidWZmZXIuCisgICAgICAgIGlmICggc3BpLT5OZXh0RW50cnlPZmZzZXQgIT0gMCApIHsKKyAgICAgICAgICAgIENIRUNLKCBzcGlfc2l6ZSA8PSBzcGktPk5leHRFbnRyeU9mZnNldCApOyAgIC8vIEFuZCBkbyBub3Qgb3ZlcmxhcCB3aXRoIHRoZSBuZXh0IHJlY29yZC4KKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgLy8gcGlkID09IDAgY29ycmVzcG9uZHMgdG8gdGhlIFN5c3RlbSBJZGxlIFByb2Nlc3MuIEl0IGFsd2F5cyBoYXMgcnVubmluZyB0aHJlYWRzCisgICAgICAgIC8vIG9uIGFsbCBjb3Jlcy4gU28sIHdlIGRvbid0IGNvbnNpZGVyIHRoZSBydW5uaW5nIHRocmVhZHMgb2YgdGhpcyBwcm9jZXNzLgorICAgICAgICBpZiAoIHBpZCAhPSAwICkgeworICAgICAgICAgICAgZm9yICggaW50IGkgPSAwOyBpIDwgbnVtOyArKyBpICkgeworICAgICAgICAgICAgICAgIFRIUkVBRF9TVEFURSBzdGF0ZSA9IHNwaS0+VGhyZWFkc1sgaSBdLlN0YXRlOworICAgICAgICAgICAgICAgIC8vIENvdW50IHRocmVhZHMgdGhhdCBoYXZlIFJlYWR5IG9yIFJ1bm5pbmcgc3RhdGUuCisgICAgICAgICAgICAgICAgLy8gISEhIFRPRE86IFdoeSBjb21tZW50IGRvZXMgbm90IG1hdGNoIHRoZSBjb2RlPz8/CisgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZSA9PSBTdGF0ZVJ1bm5pbmcgKSB7CisgICAgICAgICAgICAgICAgICAgICsrIHJ1bm5pbmdfdGhyZWFkczsKKyAgICAgICAgICAgICAgICAgICAgLy8gU3RvcCBjb3VudGluZyBydW5uaW5nIHRocmVhZHMgaWYgdGhlIG51bWJlciBpcyBhbHJlYWR5IGdyZWF0ZXIgdGhhbgorICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBjb3JlcworICAgICAgICAgICAgICAgICAgICBpZiAoIHJ1bm5pbmdfdGhyZWFkcyA+PSBtYXggKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGZpbmlzaDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gLy8gaWYKKyAgICAgICAgICAgIH07IC8vIGZvciBpCisgICAgICAgIH0gLy8gaWYKKyAgICAgICAgaWYgKCBzcGktPk5leHRFbnRyeU9mZnNldCA9PSAwICkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH07IC8vIGlmCisgICAgICAgIHNwaSA9IFBTWVNURU1fUFJPQ0VTU19JTkZPUk1BVElPTiggdWludHB0cl90KCBzcGkgKSArIHNwaS0+TmV4dEVudHJ5T2Zmc2V0ICk7CisgICAgfTsgLy8gZm9yZXZlcgorCisgICAgI3VuZGVmIENIRUNLCisKKyAgICBmaW5pc2g6IC8vIENsZWFuIHVwIGFuZCBleGl0LgorCisgICAgICAgIGlmICggYnVmZmVyICE9IE5VTEwgKSB7CisgICAgICAgICAgICBLTVBfSU5URVJOQUxfRlJFRSggYnVmZmVyICk7CisgICAgICAgIH07IC8vIGlmCisKKyAgICAgICAgZ2xiX3J1bm5pbmdfdGhyZWFkcyA9IHJ1bm5pbmdfdGhyZWFkczsKKworICAgICAgICByZXR1cm4gcnVubmluZ190aHJlYWRzOworCit9IC8vX19rbXBfZ2V0X2xvYWRfYmFsYW5jZSgpCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdG9vbHMvYnVpbGQucGwgYi9maW5hbC9ydW50aW1lL3Rvb2xzL2J1aWxkLnBsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjAwNTY0OTgKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rvb2xzL2J1aWxkLnBsCkBAIC0wLDAgKzEsNzcwIEBACisjIS91c3IvYmluL3BlcmwKKworIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworCisjIFByYWdtYXMuCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCisjIFN0YW5kYXJkIG1vZHVsZXMuCit1c2UgRGF0YTo6RHVtcGVyOyAgICAjIE5vdCBhY3R1YWxseSB1c2VkLCBidXQgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgZHVtcHMuCisKKyMgRW5hYmxlIGBsaWJvbXAvdG9vbHMvbGliLycgbW9kdWxlIGRpcmVjdG9yeS4KK3VzZSBGaW5kQmluOwordXNlIGxpYiAiJEZpbmRCaW46OkJpbi9saWIiOworCisjIExJQk9NUCBtb2R1bGVzLgordXNlIEJ1aWxkOwordXNlIExpYk9NUDsKK3VzZSBQbGF0Zm9ybSAiOnZhcnMiOwordXNlIFVuYW1lOwordXNlIHRvb2xzOworCitvdXIgJFZFUlNJT04gPSAiMC4wMTciOworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEltcG9ydGFudCB2YXJpYWJsZXMuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK215ICRyb290X2RpciAgPSAkRU5WeyBMSUJPTVBfV09SSyB9OworCitteSAlbWFrZWZpbGVzID0gKAorICAgIHJ0bCAgICAgICA9PiBjYXRfZmlsZSggJHJvb3RfZGlyLCAic3JjIiwgICAgICAgICAgICAgICAgICAgICAgICJtYWtlZmlsZS5tayIgKSwKKyAgICB0aW1lbGltaXQgPT4gY2F0X2ZpbGUoICRyb290X2RpciwgInRvb2xzIiwgInNyYyIsICJ0aW1lbGltaXQiLCAibWFrZWZpbGUubWsiICksCispOworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFBhcnNlIGNvbW1hbmQgbGluZS4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBQb3NzaWJsZSBvcHRpb25zLgorIyAgICAgKiB0YXJnZXRzOiBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiB0YXJnZXRzIHRoZSBvcHRpb24gaGFzIG1lYW5pbmcgZm9yLiBGb3IgZXhhbXBsZSwKKyMgICAgICAgICAidmVyc2lvbiIgb3B0aW9uICg0IG9yIDUpIGhhcyBhIG1lYW5pbmcgb25seSBmb3IgInJ0bCIgdGFyZ2V0LCB3aGlsZSAibW9kZSIgb3B0aW9uIGhhcworIyAgICAgICAgIG1lYW5pbmcgZm9yIGFsbCB0YXJnZXRzLgorIyAgICAgKiBiYXNlOiBJZiBiYXNlIGlzIHRydWUgdGhpcyBpcyBhIGJhc2Ugb3B0aW9uLiBBbGwgdGhlIHBvc3NpYmxlIHZhbHVlcyBvZiBiYXNlIG9wdGlvbnMgYXJlCisjICAgICAgICAgaXRlcmF0ZWQgaWYgIi0tYWxsIiBvcHRpb24gaXMgc3BlY2lmaWVkLiBJZiBiYXNlIGlzIDAsIHRoaXMgaXMgYW4gZXh0cmEgb3B0aW9uLgorIyAgICAgKiBwYXJhbXM6IEEgaGFzaCBvZiBwb3NzaWJsZSBvcHRpb24gdmFsdWVzLiAiKiIgZGVub3RlcyBkZWZhdWx0IG9wdGlvbiB2YWx1ZS4gRm9yIGV4YW1wbGUsCisjICAgICAgICAgaWYgInZlcnNpbyIgb3B0aW9uIGlzIG5vdCBzcGVjaWZpZWQsICItLXZlcnNpb249NSIgd2lsbCBiZSB1c2VkIGltcGxpY2l0bHkuCisjICAgICAqIHN1ZmZ1eDogT25seSBmb3IgZXh0cmEgb3B0aW9ucy4gU3Vicm91dGluZSByZXR1cm5pbmcgc3VmZml4IGZvciBidWlsZCBhbmQgb3V0cHV0CisjICAgICAgICAgZGlyZWN0b3JpZXMuCitteSAkb3B0cyA9IHsKKyAgICAidGFyZ2V0IiAgICAgICAgICA9PiB7IHRhcmdldHMgPT4gIiIsICAgICAgICAgICAgICAgICAgYmFzZSA9PiAxLCBwYXJtcyA9PiB7IG1hcCggKCAkXyA9PiAiIiApLCBrZXlzKCAlbWFrZWZpbGVzICkgKSwgcnRsID0+ICIqIiB9LCB9LAorICAgICJ2ZXJzaW9uIiAgICAgICAgID0+IHsgdGFyZ2V0cyA9PiAicnRsIiwgICAgICAgICAgICAgICBiYXNlID0+IDEsIHBhcm1zID0+IHsgNSAgICAgICA9PiAiKiIsIDQgICAgICAgICA9PiAiIiAgICAgICAgICAgICAgfSwgfSwKKyAgICAibGliLXR5cGUiICAgICAgICA9PiB7IHRhcmdldHMgPT4gInJ0bCIsICAgICAgICAgICAgICAgYmFzZSA9PiAxLCBwYXJtcyA9PiB7IG5vcm1hbCAgPT4gIioiLCBzdHVicyA9PiAiIiAgICAgICAgICAgICAgICAgIH0sIH0sCisgICAgImxpbmstdHlwZSIgICAgICAgPT4geyB0YXJnZXRzID0+ICJydGwiLCAgICAgICAgICAgICAgIGJhc2UgPT4gMSwgcGFybXMgPT4geyBkeW5hbWljID0+ICIqIiwgc3RhdGljICAgID0+ICIiICAgICAgICAgICAgICB9LCB9LAorICAgICJ0YXJnZXQtY29tcGlsZXIiID0+IHsgdGFyZ2V0cyA9PiAicnRsLGRzbCIsICAgICAgICAgICBiYXNlID0+IDAsIHBhcm1zID0+IHsgMTIgICAgICA9PiAiKiIsIDExICAgICAgICA9PiAiIiAgICAgICAgICAgICAgfSwgc3VmZml4ID0+IHN1YiB7ICRfWyAwIF07ICAgICAgICAgICAgICAgICAgICAgICB9IH0sCisgICAgIm1vZGUiICAgICAgICAgICAgPT4geyB0YXJnZXRzID0+ICJydGwsZHNsLHRpbWVsaW1pdCIsIGJhc2UgPT4gMCwgcGFybXMgPT4geyByZWxlYXNlID0+ICIqIiwgZGlhZyAgICAgID0+ICIiLCBkZWJ1ZyA9PiAiIiB9LCBzdWZmaXggPT4gc3ViIHsgc3Vic3RyKCAkX1sgMCBdLCAwLCAzICk7ICAgICAgIH0gfSwKKyAgICAib21wLXZlcnNpb24iICAgICA9PiB7IHRhcmdldHMgPT4gInJ0bCIsICAgICAgICAgICAgICAgYmFzZSA9PiAwLCBwYXJtcyA9PiB7IDQwID0+ICIqIiwgMzAgPT4gIiIsIDI1ID0+ICIiIH0sIHN1ZmZpeCA9PiBzdWIgeyAkX1sgMCBdOyB9IH0sCisgICAgImNvdmVyYWdlIiAgICAgICAgPT4geyB0YXJnZXRzID0+ICJydGwiLCAgICAgICAgICAgICAgIGJhc2UgPT4gMCwgcGFybXMgPT4geyBvZmYgICAgID0+ICIqIiwgb24gICAgICAgID0+ICIiICAgICAgICAgICAgICB9LCBzdWZmaXggPT4gc3ViIHsgJF9bIDAgXSBlcSAib24iID8gImMxIiA6ICJjMCI7IH0gfSwKKyAgICAidGNoZWNrIiAgICAgICAgICA9PiB7IHRhcmdldHMgPT4gInJ0bCIsICAgICAgICAgICAgICAgYmFzZSA9PiAwLCBwYXJtcyA9PiB7IDAgICAgICAgPT4gIioiLCAxICAgICAgICAgPT4gIiIsIDIgPT4gIiIgICAgIH0sIHN1ZmZpeCA9PiBzdWIgeyAidCIgLiAkX1sgMCBdOyAgICAgICAgICAgICAgICAgfSB9LAorICAgICJtaWMtYXJjaCIgICAgICAgID0+IHsgdGFyZ2V0cyA9PiAicnRsIiwgICAgICAgICAgICAgICBiYXNlID0+IDAsIHBhcm1zID0+IHsga25mICAgICA9PiAiKiIsIGtuYyAgICAgICA9PiAiIiwga25sID0+ICIiICAgfSwgc3VmZml4ID0+IHN1YiB7ICRfWyAwIF07ICAgICAgICAgICAgICAgICAgICAgICB9IH0sCisgICAgIm1pYy1vcyIgICAgICAgICAgPT4geyB0YXJnZXRzID0+ICJydGwiLCAgICAgICAgICAgICAgIGJhc2UgPT4gMCwgcGFybXMgPT4geyBic2QgICAgID0+ICIqIiwgbGluICAgICAgID0+ICIiICAgICAgICAgICAgICB9LCBzdWZmaXggPT4gc3ViIHsgJF9bIDAgXTsgICAgICAgICAgICAgICAgICAgICAgIH0gfSwKKyAgICAibWljLWNvbXAiICAgICAgICA9PiB7IHRhcmdldHMgPT4gInJ0bCIsICAgICAgICAgICAgICAgYmFzZSA9PiAwLCBwYXJtcyA9PiB7IG5hdGl2ZSAgPT4gIioiLCBvZmZsb2FkICAgPT4gIiIgICAgICAgICAgICAgIH0sIHN1ZmZpeCA9PiBzdWIgeyBzdWJzdHIoICRfWyAwIF0sIDAsIDMgKTsgICAgICAgfSB9LAorfTsKK215ICRzeW5vbnltcyA9IHsKKyAgICAiZGVidWciID0+IFsgcXd7IGRiZyBkZWJnIH0gXSwKK307CisjIFRoaXMgYXJyYXkgc3BlY2lmaWVzIG9yZGVyIG9mIG9wdGlvbnMgdG8gcHJvY2Vzcywgc28gaXQgY2Fubm90IGJlIGluaXRpYWxpemVkIHdpdGgga2V5cyggJSRvcHRzICkuCitteSBAYWxsX29wdHMgICA9IHF3eyB0YXJnZXQgdmVyc2lvbiBsaWItdHlwZSBsaW5rLXR5cGUgdGFyZ2V0LWNvbXBpbGVyIG1vZGUgb21wLXZlcnNpb24gY292ZXJhZ2UgdGNoZWNrIG1pYy1hcmNoIG1pYy1vcyBtaWMtY29tcCB9OworIyBUaGlzIGlzIHRoZSBsaXN0IG9mIGJhc2Ugb3B0aW9ucy4KK215IEBiYXNlX29wdHMgID0gZ3JlcCggJG9wdHMtPnsgJF8gfS0+eyBiYXNlIH0gPT0gMSwgQGFsbF9vcHRzICk7CisjIFRoaXMgaXMgdGhlIGxpc3Qgb2YgZXh0cmEgb3B0aW9ucy4KK215IEBleHRyYV9vcHRzID0gZ3JlcCggJG9wdHMtPnsgJF8gfS0+eyBiYXNlIH0gPT0gMCwgQGFsbF9vcHRzICk7CisKK3N1YiBzdWZmaXgoJCQkKSB7CisgICAgbXkgKCAkb3B0LCAkdmFsdWUsICRza2lwX2lmX2RlZmF1bHQgKSA9IEBfOworICAgIG15ICRzdWZmaXggPSAiIjsKKyAgICBpZiAoIG5vdCAkc2tpcF9pZl9kZWZhdWx0IG9yICR2YWx1ZSBuZSAkb3B0cy0+eyAkb3B0IH0tPnsgZGZsdCB9ICkgeworICAgICAgICAkc3VmZml4ID0gJG9wdHMtPnsgJG9wdCB9LT57IHN1ZmZpeCB9LT4oICR2YWx1ZSApOworICAgIH07ICMgaWYKKyAgICByZXR1cm4gJHN1ZmZpeDsKK307ICMgc3ViIHN1ZmZpeAorCitteSAkc2N1dHMgPSB7fTsgICAgICMgU2hvcnRjdXRzLiBXaWxsIGhlbHAgdG8gbG9jYXRlIHByb3BlciBpdGVtIGluICRvcHRzLgorZm9yZWFjaCBteSAkb3B0ICgga2V5cyggJSRvcHRzICkgKSB7CisgICAgZm9yZWFjaCBteSAkcGFybSAoIGtleXMoICV7ICRvcHRzLT57ICRvcHQgfS0+eyBwYXJtcyB9IH0gKSApIHsKKyAgICAgICAgaWYgKCAkcGFybSAhfiBte1xBKD86WzAxMl18b258b2ZmKVx6fSApIHsKKyAgICAgICAgICAgICRzY3V0cy0+eyAkcGFybSB9ID0gJG9wdHMtPnsgJG9wdCB9OworICAgICAgICB9OyAjIGlmCisgICAgICAgIGlmICggJG9wdHMtPnsgJG9wdCB9LT57IHBhcm1zIH0tPnsgJHBhcm0gfSBlcSAiKiIgKSB7CisgICAgICAgICAgICAkb3B0cy0+eyAkb3B0IH0tPnsgZGZsdCB9ID0gJHBhcm07CisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGZvcmVhY2ggJHBhcm0KK307ICMgZm9yZWFjaCAkb3B0CisKK3N1YiBwYXJzZV9vcHRpb24oQCkgeworICAgICMgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJvY2VzcyBldmVyeSBvcHRpb24uICRuYW1lIGlzIG9wdGlvbiBuYW1lLCAkdmFsdWUgaXMgb3B0aW9uIHZhbHVlLgorICAgICMgRm9yIGJvb2xlYW4gb3B0aW9ucyAkdmFsdWUgaXMgZWl0aGVyIDEgb3IgMCwKKyAgICBteSAoICRuYW1lLCAkdmFsdWUgKSA9IEBfOworICAgIGlmICggJG5hbWUgZXEgImFsbCIgb3IgJG5hbWUgZXEgIkFMTCIgKSB7CisgICAgICAgIGZvcmVhY2ggbXkgJG9wdCAoIGtleXMoICUkb3B0cyApICkgeworICAgICAgICAgICAgaWYgKCAkb3B0cy0+eyAkb3B0IH0tPnsgYmFzZSB9IG9yICRuYW1lIGVxICJBTEwiICkgeworICAgICAgICAgICAgICAgIGZvcmVhY2ggbXkgJHBhcm0gKCBrZXlzKCAleyAkb3B0cy0+eyAkb3B0IH0tPnsgcGFybXMgfSB9ICkgKSB7CisgICAgICAgICAgICAgICAgICAgICRvcHRzLT57ICRvcHQgfS0+eyBwYXJtcyB9LT57ICRwYXJtIH0gPSAxOworICAgICAgICAgICAgICAgIH07ICMgZm9yZWFjaCAkcGFybQorICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICB9OyAjIGZvcmVhY2ggJG9wdAorICAgICAgICByZXR1cm47CisgICAgfTsgIyBpZgorICAgIGlmICggZXhpc3RzKCAkb3B0cy0+eyAkbmFtZSB9ICkgKSB7CisgICAgICAgICMgU3VwcG9zZSBpdCBpcyBvcHRpb24gd2l0aCBleHBsaWNpdCB2YWx1ZSwgbGlrZSAidGFyZ2V0PW5vcm1hbCIuCisgICAgICAgIGlmICggJHZhbHVlIGVxICJhbGwiICkgeworICAgICAgICAgICAgZm9yZWFjaCBteSAkcGFybSAoIGtleXMoICV7ICRvcHRzLT57ICRuYW1lIH0tPnsgcGFybXMgfSB9ICkgKSB7CisgICAgICAgICAgICAgICAgJG9wdHMtPnsgJG5hbWUgfS0+eyBwYXJtcyB9LT57ICRwYXJtIH0gPSAxOworICAgICAgICAgICAgfTsgIyBmb3JlYWNoCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzaWYgKCBleGlzdHMoICRvcHRzLT57ICRuYW1lIH0tPnsgcGFybXMgfS0+eyAkdmFsdWUgfSApICkgeworICAgICAgICAgICAgJG9wdHMtPnsgJG5hbWUgfS0+eyBwYXJtcyB9LT57ICR2YWx1ZSB9ID0gMTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNpZiAoICR2YWx1ZSBlcSAiIiBhbmQgZXhpc3RzKCAkb3B0cy0+eyAkbmFtZSB9LT57IHBhcm1zIH0tPnsgb24gfSApICkgeworICAgICAgICAgICAgJG9wdHMtPnsgJG5hbWUgfS0+eyBwYXJtcyB9LT57IG9uIH0gPSAxOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY21kbGluZV9lcnJvciggIklsbGVnYWwgdmFsdWUgb2YgXCIkbmFtZVwiIG9wdGlvbjogXCIkdmFsdWVcIiIgKTsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgaWYKKyAgICAjIE9rLCBpdCBpcyBub3QgYW4gb3B0aW9uIHdpdGggZXhwbGljaXQgdmFsdWUuIFRyeSB0byB0cmVhdCBpcyBhcyBhIGJvb2xlYW4gb3B0aW9uLgorICAgIGlmICggZXhpc3RzKCAkc2N1dHMtPnsgJG5hbWUgfSApICkgeworICAgICAgICAoICR2YWx1ZSBlcSAiMSIgb3IgJHZhbHVlIGVxICIwIiApIG9yIGRpZSAiSW50ZXJuYWwgZXJyb3I7IHN0b3BwZWQiOworICAgICAgICAkc2N1dHMtPnsgJG5hbWUgfS0+eyBwYXJtcyB9LT57ICRuYW1lIH0gPSAkdmFsdWU7CisgICAgICAgIHJldHVybjsKKyAgICB9OyAjIGlmCisgICAgIyBObywgaXQgaXMgbm90IGEgdmFsaWQgb3B0aW9uIGF0IGFsbC4KKyAgICBjbWRsaW5lX2Vycm9yKCAiSWxsZWdhbCBvcHRpb246IFwiJG5hbWVcIiIgKTsKK307ICMgc3ViIHBhcnNlX29wdGlvbgorCitteSAkY2xlYW4gICAgICAgID0gMDsKK215ICRjbGVhbl9jb21tb24gPSAwOworbXkgJGNsb2JiZXIgICAgICA9IDA7CitteSAkdGVzdF9kZXBzICAgID0gMTsKK215ICR0ZXN0X3RvdWNoICAgPSAxOworbXkgQGdvYWxzOworCitzdWIgc3lub255bXMoJCkgeworICAgIG15ICggJG9wdCApID0gQF87CisgICAgcmV0dXJuIGV4aXN0cyggJHN5bm9ueW1zLT57ICRvcHQgfSApID8gInwiIC4gam9pbiggInwiLCBAeyAkc3lub255bXMtPnsgJG9wdCB9IH0gKSA6ICIiOworfTsgIyBzdWIgc3lub255bXMKKworbXkgQHNwZWNzID0gKAorICAgIG1hcCggKCAiJF8iIC4gc3lub255bXMoICRfICkgLiAiPXMiID0+IFwmcGFyc2Vfb3B0aW9uICksIGtleXMoICUkb3B0cyAgKSApLAorICAgIG1hcCggKCAiJF8iIC4gc3lub255bXMoICRfICkgLiAiISIgID0+IFwmcGFyc2Vfb3B0aW9uICksIGtleXMoICUkc2N1dHMgKSApLAorKTsKK215ICRhbnN3ZXI7CitnZXRfb3B0aW9ucygKKyAgICBAc3BlY3MsCisgICAgUGxhdGZvcm06OnRhcmdldF9vcHRpb25zKCksCisgICAgImFsbCIgICAgICAgICAgID0+IFwmcGFyc2Vfb3B0aW9uLAorICAgICJBTEwiICAgICAgICAgICA9PiBcJnBhcnNlX29wdGlvbiwKKyAgICAiYW5zd2VyPXMiICAgICAgPT4gXCRhbnN3ZXIsCisgICAgInRlc3QtZGVwcyEiICAgID0+IFwkdGVzdF9kZXBzLAorICAgICJ0ZXN0LXRvdWNoISIgICA9PiBcJHRlc3RfdG91Y2gsCisgICAgInZlcnNpb258dmVyOnMiID0+CisgICAgICAgIHN1YiB7CisgICAgICAgICAgICAjIEl0IGlzIGEgdHJpY2t5IG9wdGlvbi4gSXQgc3BlY2lmaWVzIGxpYnJhcnkgdmVyc2lvbiB0byBidWlsZCBhbmQgaXQgaXMgYWxzbyBhIHN0YW5kYXJkCisgICAgICAgICAgICAjIG9wdGlvbiB0byByZXF1ZXN0IHRvb2wgdmVyc2lvbi4KKyAgICAgICAgICAgIGlmICggJF9bIDEgXSBlcSAiIiApIHsKKyAgICAgICAgICAgICAgICAjIE5vIGFyZ3VtZW50cyA9PiB2ZXJzaW9uIHJlcXVlc3QuCisgICAgICAgICAgICAgICAgcHJpbnQoICIkdG9vbCB2ZXJzaW9uICRWRVJTSU9OXG4iICk7CisgICAgICAgICAgICAgICAgZXhpdCggMCApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAjIEFyZ3VtZW50cyA9PiB2ZXJzaW9uIHRvIGJ1aWxkLgorICAgICAgICAgICAgICAgIHBhcnNlX29wdGlvbiggQF8gKQorICAgICAgICAgICAgfTsKKyAgICAgICAgfSwKKyk7CitAZ29hbHMgPSBAQVJHVjsKK2lmICggZ3JlcCggJF8gZXEgImNsb2JiZXIiLCBAZ29hbHMgKSApIHsKKyAgICAkY2xvYmJlciA9IDE7Cit9OyAjIGlmCitpZiAoIGdyZXAoICRfIGVxICJjbGVhbiIsIEBnb2FscyApICkgeworICAgICRjbGVhbiA9IDE7Cit9OyAjIGlmCisKKyMgT2ssIG5vdyAkb3B0cyBpcyBmdWxmaWxsZWQgd2l0aCAwLCAxIChleHBsaWNpdGx5IHNldCBieSB0aGUgdXNlcikgYW5kICIiIGFuZCAiKiIgKG9yaWdpbmFsCisjIHZhbHVlcykuIEluIGVhY2ggb3B0aW9uIGF0IGxlYXN0IG9uZSAxIHNob3VsZCBiZSBwcmVzZW50IChvdGhlcndpc2UgdGhlcmUgaXMgbm90aGluZyB0byBidWlsZCkuCitmb3JlYWNoIG15ICRvcHQgKCBrZXlzKCAlJG9wdHMgKSApIHsKKyAgICBpZiAoIG5vdCBncmVwKCAkXyBlcSAiMSIsIHZhbHVlcyggJXsgJG9wdHMtPnsgJG9wdCB9LT57IHBhcm1zIH0gfSApICkgKSB7CisgICAgICAgICMgTm8gZXhwbGljaXQgIjEiIGZvdW5kLiBFbmFibGUgZGVmYXVsdCBjaG9pY2UgYnkgcmVwbGFjaW5nICIqIiB3aXRoICIxIi4KKyAgICAgICAgZm9yZWFjaCBteSAkcGFybSAoIGtleXMoICV7ICRvcHRzLT57ICRvcHQgfS0+eyBwYXJtcyB9IH0gKSApIHsKKyAgICAgICAgICAgIGlmICggJG9wdHMtPnsgJG9wdCB9LT57IHBhcm1zIH0tPnsgJHBhcm0gfSBlcSAiKiIgKSB7CisgICAgICAgICAgICAgICAgJG9wdHMtPnsgJG9wdCB9LT57IHBhcm1zIH0tPnsgJHBhcm0gfSA9IDE7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgIH07ICMgZm9yZWFjaCAkcGFybQorICAgIH07ICMgaWYKK307ICMgZm9yZWFjaCAkb3B0CisKKyMgQ2xlYXIgJG9wdHMuIExlYXZlIG9ubHkgIjEiLgorZm9yZWFjaCBteSAkb3B0ICgga2V5cyggJSRvcHRzICkgKSB7CisgICAgZm9yZWFjaCBteSAkcGFybSAoIGtleXMoICV7ICRvcHRzLT57ICRvcHQgfS0+eyBwYXJtcyB9IH0gKSApIHsKKyAgICAgICAgaWYgKCAkb3B0cy0+eyAkb3B0IH0tPnsgcGFybXMgfS0+eyAkcGFybSB9IG5lICIxIiApIHsKKyAgICAgICAgICAgIGRlbGV0ZSggJG9wdHMtPnsgJG9wdCB9LT57IHBhcm1zIH0tPnsgJHBhcm0gfSApOworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBmb3JlYWNoICRwYXJtCit9OyAjIGZvcmVhY2ggJG9wdAorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEZpbGwgam9iIHF1ZXVlLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdWIgZW5xdWV1ZV9qb2JzKCQkQCk7CitzdWIgZW5xdWV1ZV9qb2JzKCQkQCkgeworICAgIG15ICggJGpvYnMsICRzZXQsIEByZXN0ICkgPSBAXzsKKyAgICBpZiAoIEByZXN0ICkgeworICAgICAgICBteSAkb3B0ID0gc2hpZnQoIEByZXN0ICk7CisgICAgICAgIGlmICgKKyAgICAgICAgICAgIGV4aXN0cyggJHNldC0+eyB0YXJnZXQgfSApCisgICAgICAgICAgICBhbmQKKyAgICAgICAgICAgICRvcHRzLT57ICRvcHQgfS0+eyB0YXJnZXRzIH0gIX4gbXsoPzpcQXwsKSRzZXQtPnsgdGFyZ2V0IH0oPzosfFx6KX0KKyAgICAgICAgKSB7CisgICAgICAgICAgICAjIFRoaXMgb3B0aW9uIGRvZXMgbm90IGhhdmUgbWVhbmFuaW5nIGZvciB0aGUgdGFyZ2V0LAorICAgICAgICAgICAgIyBkbyBub3QgaXRlcmF0ZSwganVzdCB1c2UgZGVmYXVsdCB2YWx1ZS4KKyAgICAgICAgICAgIGVucXVldWVfam9icyggJGpvYnMsIHsgJG9wdCA9PiAkb3B0cy0+eyAkb3B0IH0tPnsgZGZsdCB9LCAlJHNldCB9LCBAcmVzdCApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yZWFjaCBteSAkcGFybSAoIHNvcnQoIGtleXMoICV7ICRvcHRzLT57ICRvcHQgfS0+eyBwYXJtcyB9IH0gKSApICkgeworICAgICAgICAgICAgICAgIGVucXVldWVfam9icyggJGpvYnMsIHsgJG9wdCA9PiAkcGFybSwgJSRzZXQgfSwgQHJlc3QgKTsKKyAgICAgICAgICAgIH07ICMgZm9yZWFjaCAkcGFybQorICAgICAgICB9OyAjIGlmCisgICAgfSBlbHNlIHsKKyAgICAgICAgbXkgJG1ha2VmaWxlICA9ICRtYWtlZmlsZXN7ICRzZXQtPnsgdGFyZ2V0IH0gfTsKKyAgICAgICAgbXkgQGJhc2UgICAgICA9IG1hcCggc3Vic3RyKCAkc2V0LT57ICRfIH0sIDAsIDMgKSwgQGJhc2Vfb3B0cyApOworICAgICAgICBteSBAZXh0cmEgICAgID0gbWFwKCBzdWZmaXgoICRfLCAkc2V0LT57ICRfIH0sIDAgKSwgQGV4dHJhX29wdHMgKTsKKyAgICAgICAgbXkgQGV4ICAgICAgICA9IGdyZXAoICRfIG5lICIiLCBtYXAoIHN1ZmZpeCggJF8sICRzZXQtPnsgJF8gfSwgMSApLCBAZXh0cmFfb3B0cyApICk7CisgICAgICAgICAgICAjIFNob3J0ZW5lZCB2ZXJzaW9uIG9mIEBleHRyYSAtLSBvbmx5IG5vbi1kZWZhdWx0IHZhbHVlcy4KKyAgICAgICAgbXkgJHN1ZmZpeCAgICA9ICggQGV4dHJhID8gIi4iIC4gam9pbiggIi4iLCBAZXh0cmEgKSA6ICIiICk7CisgICAgICAgIG15ICRrbmlnaHRzICAgPSBpbmRleCggJHN1ZmZpeCwgImtuIiApIC0gMTsKKyAgICAgICAgaWYgKCAkdGFyZ2V0X3BsYXRmb3JtICF+ICJscmIiIGFuZCAka25pZ2h0cyA+IDAgKSB7CisgICAgICAgICAgICAkc3VmZml4ID0gc3Vic3RyKCAkc3VmZml4LCAwLCAka25pZ2h0cyApOworICAgICAgICB9CisgICAgICAgIG15ICRzdWYgICAgICAgPSAoIEBleCA/ICIuIiAuIGpvaW4oICIuIiwgQGV4ICkgOiAiIiApOworICAgICAgICAgICAgIyBTaG9ydGVuZWQgdmVyc2lvbiBvZiAkc2lmZml4IC0tIG9ubHkgbm9uLWRlZmF1bHQgdmFsdWVzLgorICAgICAgICBteSAkYnVpbGRfZGlyID0gam9pbiggIi0iLCAkdGFyZ2V0X3BsYXRmb3JtLCBqb2luKCAiXyIsIEBiYXNlICkgLiAkc3VmZml4LCBVbmFtZTo6aG9zdF9uYW1lKCkgKTsKKyAgICAgICAgbXkgJG91dF9hcmNoX2RpciA9IGNhdF9kaXIoICRFTlZ7IExJQk9NUF9FWFBPUlRTIH0sICR0YXJnZXRfcGxhdGZvcm0gLiAkc3VmICk7CisgICAgICAgIG15ICRvdXRfY21uX2RpciAgPSBjYXRfZGlyKCAkRU5WeyBMSUJPTVBfRVhQT1JUUyB9LCAiY29tbW9uIiApOworICAgICAgICBwdXNoKAorICAgICAgICAgICAgQCRqb2JzLAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1ha2VmaWxlID0+ICRtYWtlZmlsZSwKKyAgICAgICAgICAgICAgICBtYWtlX2FyZ3MgPT4gWworICAgICAgICAgICAgICAgICAgICAib3M9IiAgIC4gJHRhcmdldF9vcywKKyAgICAgICAgICAgICAgICAgICAgImFyY2g9IiAuICR0YXJnZXRfYXJjaCwKKyAgICAgICAgICAgICAgICAgICAgIk1JQ19PUz0iIC4gJHNldC0+eyAibWljLW9zIiB9LAorICAgICAgICAgICAgICAgICAgICAiTUlDX0FSQ0g9IiAuICRzZXQtPnsgIm1pYy1hcmNoIiB9LAorICAgICAgICAgICAgICAgICAgICAiTUlDX0NPTVA9IiAuICRzZXQtPnsgIm1pYy1jb21wIiB9LAorICAgICAgICAgICAgICAgICAgICAiZGF0ZT0iIC4gQnVpbGQ6OnRzdHIoICRCdWlsZDo6c3RhcnQgKSwKKyAgICAgICAgICAgICAgICAgICAgIlRFU1RfREVQUz0iIC4gKCAkdGVzdF9kZXBzICAgPyAib24iIDogIm9mZiIgKSwKKyAgICAgICAgICAgICAgICAgICAgIlRFU1RfVE9VQ0g9IiAuICggJHRlc3RfdG91Y2ggPyAib24iIDogIm9mZiIgKSwKKyAgICAgICAgICAgICAgICAgICAgIkNQTFVTUExVUz1vbiIsCisgICAgICAgICAgICAgICAgICAgICJDT1ZFUkFHRT0iIC4gJHNldC0+eyBjb3ZlcmFnZSB9LAorICAgICAgICAgICAgICAgICAgICAjIE9wdGlvbiAibW9kZSIgY29udHJvbHMgMyBtYWtlIGZsYWdzOgorICAgICAgICAgICAgICAgICAgICAjICAgICBkZWJ1ZyAgID0+IEZ1bGwgZGVidWdnaW5nICAgOiAgICBkaWFnbm9zdGljcywgICAgZGVidWcgaW5mbywgbm8gb3B0aW1pemF0aW9uLgorICAgICAgICAgICAgICAgICAgICAjICAgICBkaWFnICAgID0+IE9ubHkgZGlhZ25vc3RpY3MgOiAgICBkaWFnbm9zdGljcywgICAgZGVidWcgaW5mbywgICAgb3B0aW1pemF0aW9uLgorICAgICAgICAgICAgICAgICAgICAjICAgICByZWxlYXNlID0+IFByb2R1Y3Rpb24gYnVpbGQgOiBubyBkaWFnbm9zdGljcywgbm8gZGVidWcgaW5mbywgICAgb3B0aW1pemF0aW9uLgorICAgICAgICAgICAgICAgICAgICAiREVCVUdfSU5GTz0iIC4gICAoICRzZXQtPnsgbW9kZSB9IG5lICJyZWxlYXNlIiA/ICJvbiIgOiAib2ZmIiApLAorICAgICAgICAgICAgICAgICAgICAiRElBRz0iIC4gICAgICAgICAoICRzZXQtPnsgbW9kZSB9IG5lICJyZWxlYXNlIiA/ICJvbiIgOiAib2ZmIiApLAorICAgICAgICAgICAgICAgICAgICAiT1BUSU1JWkFUSU9OPSIgLiAoICRzZXQtPnsgbW9kZSB9IG5lICJkZWJ1ZyIgICA/ICJvbiIgOiAib2ZmIiApLAorICAgICAgICAgICAgICAgICAgICAiTElCX1RZUEU9IiAuIHN1YnN0ciggJHNldC0+eyAibGliLXR5cGUiIH0sIDAsIDQgKSwKKyAgICAgICAgICAgICAgICAgICAgIkxJTktfVFlQRT0iIC4gc3Vic3RyKCAkc2V0LT57ICJsaW5rLXR5cGUiIH0sIDAsIDQgKSwKKyAgICAgICAgICAgICAgICAgICAgIk9NUF9WRVJTSU9OPSIgLiAkc2V0LT57ICJvbXAtdmVyc2lvbiIgfSwKKyAgICAgICAgICAgICAgICAgICAgIlVTRV9UQ0hFQ0s9IiAuICRzZXQtPnsgdGNoZWNrIH0sCisgICAgICAgICAgICAgICAgICAgICJWRVJTSU9OPSIgLiAkc2V0LT57IHZlcnNpb24gfSwKKyAgICAgICAgICAgICAgICAgICAgIlRBUkdFVF9DT01QSUxFUj0iIC4gJHNldC0+eyAidGFyZ2V0LWNvbXBpbGVyIiB9LAorICAgICAgICAgICAgICAgICAgICAic3VmZml4PSIgLiAkc3VmLAorICAgICAgICAgICAgICAgICAgICBAZ29hbHMsCisgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICBidWlsZF9kaXIgID0+ICRidWlsZF9kaXIKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsgIyBwdXNoCisgICAgfTsgIyBpZgorfTsgIyBzdWIgZW5xdWV1ZV9qb2JzCisKK215IEBqb2JzOworZW5xdWV1ZV9qb2JzKCBcQGpvYnMsIHt9LCBAYWxsX29wdHMgKTsKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBEbyB0aGUgd29yay4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworbXkgJGV4aXQgPSAwOworCitCdWlsZDo6aW5pdCgpOworCitpZiAoICRjbG9iYmVyICkgeworICAgIG15IEBkaXJzID0gKCAkRU5WeyBMSUJPTVBfVE1QIH0sICRFTlZ7IExJQk9NUF9FWFBPUlRTIH0sIGNhdF9kaXIoICRyb290X2RpciwgInRvb2xzIiwgImJpbiIgICkgKTsKKyAgICBteSAkcmMgPSAwOworICAgIHF1ZXN0aW9uKAorICAgICAgICAiQ2xvYmJlciAiIC4gam9pbiggIiwgIiwgbWFwKCAiXCIiIC4gQnVpbGQ6OnNob3J0ZXIoICRfICkgLiAiXCIiLCBAZGlycyApICkgLiAiIGRpcnM/ICIsCisgICAgICAgICRhbnN3ZXIsCisgICAgICAgIHFye1xBKHl8eWVzfG58bm8pXHp9aQorICAgICk7CisgICAgaWYgKCAkYW5zd2VyID1+IG17XEF5fWkgKSB7CisgICAgICAgIGluZm8oICJDbG9iYmVyaW5nLi4uIiApOworICAgICAgICAkcmMgPSBCdWlsZDo6Y2xlYW4oIEBkaXJzICk7CisgICAgICAgIGluZm8oIEJ1aWxkOjpyc3RyKCAkcmMgKSApOworICAgIH07ICMgaWYKKyAgICBpZiAoICRyYyAhPSAwICkgeworICAgICAgICAkZXhpdCA9IDM7CisgICAgfTsgIyBpZgorfSBlbHNlIHsgIyBCdWlsZCBvciBjbGVhbi4KKyAgICBpZiAoIEBqb2JzICkgeworICAgICAgICBteSAkdG90YWwgPSBAam9iczsgICAgIyBUb3RhbCBudW1iZXIgb2Ygam9icy4KKyAgICAgICAgbXkgJG4gICAgID0gMDsgICAgICAgICMgQ3VycmVudCBqb2IgbnVtYmVyLgorICAgICAgICBCdWlsZDo6cHJvZ3Jlc3MoICIiLCAiIiApOyAgICAgIyBPdXRwdXQgZW1wdHkgbGluZSB0byBsb2cgZmlsZS4KKyAgICAgICAgbXkgJGdvYWxzID0gam9pbiggIiAiLCBAZ29hbHMgKTsKKyAgICAgICAgQnVpbGQ6OnByb2dyZXNzKCAiR29hbHMiLCAkZ29hbHMgZXEgIiIgPyAiKGFsbCkiIDogJGdvYWxzICk7CisgICAgICAgIEJ1aWxkOjpwcm9ncmVzcyggIkNvbmZpZ3VyYXRpb25zIiwgc2NhbGFyKCBAam9icyApICk7CisgICAgICAgIGZvcmVhY2ggbXkgJGpvYiAoIEBqb2JzICkgeworICAgICAgICAgICAgKysgJG47CisgICAgICAgICAgICBteSAkYmFzZSA9IGdldF9maWxlKCAkam9iLT57IGJ1aWxkX2RpciB9ICk7CisgICAgICAgICAgICBCdWlsZDo6cHJvZ3Jlc3MoICJNYWtpbmciLCAiJTNkIG9mICUzZCA6ICVzIiwgJG4sICR0b3RhbCwgJGJhc2UgKTsKKyAgICAgICAgICAgICRqb2ItPnsgcmMgfSA9IEJ1aWxkOjptYWtlKCAkam9iLCAkY2xlYW4sIHNwcmludGYoICIlZC8lZCIsICRuLCAkdG90YWwgKSApOworICAgICAgICB9OyAjIG15ICRqb2IKKyAgICAgICAgbXkgJGZhaWx1cmVzID0gQnVpbGQ6OnN1bW1hcnkoKTsKKyAgICAgICAgaWYgKCAkZmFpbHVyZXMgPiAwICkgeworICAgICAgICAgICAgJGV4aXQgPSAzOworICAgICAgICB9OyAjIGlmCisgICAgfSBlbHNlIHsKKyAgICAgICAgaW5mbyggIk5vdGhpbmcgdG8gZG8uIiApOworICAgIH07ICMgaWYKK307ICMgaWYKKworIyBBbmQgZXhpdC4KK2V4aXQoICRleGl0ICk7CisKK19fRU5EX18KKworPXBvZAorCis9aGVhZDEgTkFNRQorCisKK0I8YnVpbGQucGw+IC0tIEJ1aWxkIG9uZSBvciBtb3JlIGNvbmZpZ3VyYXRpb25zIG9mIE9NUCBSVEwgbGlicmFyaWVzLgorCis9aGVhZDEgU1lOT1BTSVMKKworQjxidWlsZC5wbD4gSTxvcHRpb24+Li4uIFtCPC0tPl0gSTxtYWtlLW9wdGlvbj4uLi4gSTx2YXJpYWJsZT4uLi4gSTxnb2FsPi4uLgorCis9aGVhZDEgT1BUSU9OUworCis9b3ZlcgorCis9aXRlbSBCPC0tYWxsPgorCitCdWlsZCBhbGwgYmFzZSBjb25maWd1cmF0aW9ucy4KKworPWl0ZW0gQjwtLUFMTD4KKworQnVpbGQgcmVhbGx5IGFsbCBjb25maWd1cmF0aW9ucywgaW5jbHVkaW5nIGV4dHJhIG9uZXMuCisKKz1pdGVtIEI8LS1hbnN3ZXI9Pkk8c3RyPgorCitVc2Ugc3BlY2lmaWVkIHN0cmluZyBhcyBkZWZhdWx0IGFuc3dlciB0byBhbGwgcXVlc3Rpb25zLgorCis9aXRlbSBCPC0tYXJjaGl0ZWN0dXJlPT5JPGFyY2g+CisKK1NwZWNpZnkgdGFyZ2V0IGFyY2hpdGVjdHVyZSB0byBidWlsZC4gRGVmYXVsdCBpcyBhcmNoaXRlY3R1cmUgb2YgaG9zdCBtYWNoaW5lLiBJPGFyY2g+IGNhbiBiZSBDPDMyPiwKK0M8MzJlPiwgb3Igb25lIG9mIGtub3duIGFsaWFzZXMgbGlrZSBDPElBMzI+LgorCitJZiBhcmNoaXRlY3R1cmUgaXMgbm90IHNwZWNpZmllZCBleHBsaWNpdGx5LCB2YWx1ZSBvZiBMSUJPTVBfQVJDSCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyB1c2VkLgorSWYgTElCT01QX0FSQ0ggaXMgbm90IGRlZmluZWQsIGhvc3QgYXJjaGl0ZWN0dXJlIGRldGVjdGVkLgorCis9aXRlbSBCPC0tb3M9Pkk8b3M+CisKK1NwZWNpZnkgdGFyZ2V0IE9TLiBEZWZhdWx0IGlzIE9TIG9mIGhvc3QgbWFjaGluZS4gSTxvcz4gY2FuIGJlIEM8bGluPiwgQzxscmI+LCBDPG1hYz4sIEM8d2luPiwKK29yIG9uZSBvZiBrbm93biBhbGlhc2VzIGxpa2UgQzxMaW51eD4sIEM8V2luTlQ+LCBldGMuCisKKz1pdGVtIEI8LS1taWMtb3M9Pkk8b3M+CisKK1NwZWNpZnkgT1Mgb24gSW50ZWwoUikgTWFueSBJbnRlZ3JhdGVkIENvcmUgQXJjaGl0ZWN0dXJlIGNhcmQuIERlZmF1bHQgaXMgQzxic2Q+LiBJPG9zPiBjYW4gYmUgQzxic2Q+LCBDPGxpbj4uCisKKz1pdGVtIEI8LS1taWMtYXJjaD0+STxhcmNoPgorCitTcGVjaWZ5IGFyY2hpdGVjdHVyZSBvZiBJbnRlbChSKSBNYW55IEludGVncmF0ZWQgQ29yZSBBcmNoaXRlY3R1cmUgY2FyZC4gRGVmYXVsdCBpcyBDPGtuZj4uIEk8YXJjaD4gY2FuIGJlIEM8a25mPiwgQzxrbmM+LCBDPGtubD4uCisKKz1pdGVtIEI8LS1taWMtY29tcD0+STxjb21waWxlci10eXBlPgorCitTcGVjaWZ5IHdoZXRoZXIgdGhlIEludGVsKFIpIE1hbnkgSW50ZWdyYXRlZCBDb3JlIENvbXBpbGVyIGlzIG5hdGl2ZSBvciBvZmZsb2FkLiBEZWZhdWx0IGlzIEM8bmF0aXZlPi4KK0k8Y29tcGlsZXItdHlwZT4gY2FuIGJlIEM8bmF0aXZlPiBvciBDPG9mZmxvYWQ+LgorCis9aXRlbSBCPC0tPltCPG5vLT5dQjx0ZXN0LWRlcHM+CisKK0VuYWJsZSBvciBkaXNhYmxlIEM8dGVzdC1kZXBzPi4gVGhlIHRlc3QgcnVucyBpbiBhbnkgY2FzZSwgYnV0IHJlc3VsdCBvZiBkaXNhYmxlZCB0ZXN0IGlzIGlnbm9yZWQuCitCeSBkZWZhdWx0LCB0ZXN0IGlzIGVuYWJsZWQuCisKKz1pdGVtIEI8LS0+W0I8bm8tPl1CPHRlc3QtdG91Y2g+CisKK0VuYWJsZSBvciBkaXNhYmxlIEM8dGVzdC10b3VjaD4uIFRoZSB0ZXN0IHJ1bnMgaW4gYW55IGNhc2UsIGJ1dCByZXN1bHQgb2YgZGlzYWJsZWQgdGVzdCBpcyBpZ25vcmVkLgorQnkgZGVmYXVsdCwgdGVzdCBpcyBlbmFibGVkLgorCis9aXRlbSBCYXNlIENvbmZpZ3VyYXRpb24gU2VsZWN0aW9uIE9wdGlvbnMKKworPW92ZXIKKworPWl0ZW0gQjwtLXRhcmdldD0+STx0YXJnZXQ+CisKK0J1aWxkIHNwZWNpZmllZCB0YXJnZXQsIGVpdGhlciBDPHJ0bD4gKE9NUCBSdW50aW1lIExpYnJhcnk7IGRlZmF1bHQpLAorb3IgQzx0aW1lbGltaXQ+IChwcm9ncmFtIHVzZWQgaW4gdGVzdGluZyksIG9yIEM8YWxsPi4KKworPWl0ZW0gQjwtLWxpYi10eXBlPT5JPGxpYj4KKworQnVpbGQgc3BlY2lmaWVkIGxpYnJhcnksIGVpdGhlciBDPG5vcm1hbD4gKGRlZmF1bHQpLCBvciBDPHN0dWJzPiwgb3IgQzxhbGw+LgorCis9aXRlbSBCPC0tbGluay10eXBlPT5JPHR5cGU+CisKK0J1aWxkIHNwZWNpZmllZCBsaW5rIHR5cGUsIGVpdGhlciBDPGR5bmFtaWM+IChkZWZhdWx0KSBvciBDPGFsbD4uCisKKz1iYWNrCisKKz1pdGVtIEV4dHJhIENvbmZpZ3VyYXRpb24gU2VsZWN0aW9uIE9wdGlvbnMKKworPW92ZXIKKworPWl0ZW0gQjwtLWNvdmVyPT5JPHN3aXRjaD4KKworQnVpbGQgZm9yIGNvZGUgY292ZXJhZ2UgZGF0YSBjb2xsZWN0aW9uLiBJPHN3aXRjaD4gY2FuIGJlIEM8b2ZmPiAoZGVmYXVsdCksIEM8b24+CitvciBDPGFsbD4uCisKKz1pdGVtIEI8LS1tb2RlPT5JPG1vZGU+CisKK0J1aWxkIGxpYnJhcnkgb2Ygc3BlY2lmaWVkIEk8bW9kZT4sIGVpdGhlciBDPGRlYnVnPiwgQzxkaWFnPiwgQzxyZWxlYXNlPiAoZGVmYXVsdCksIG9yIEM8YWxsPi4KK01vZGUgY29udHJvbHMgMyBmZWF0dXJlczoKKworICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIGZlYXR1cmUvbW9kZSAgICAgICAgICAgICAgICAgICBkZWJ1ZyAgZGlhZyAgcmVsZWFzZQorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIGRlYnVnIGluZm8gICAgICAgICAgICAgICAgICAgICAgIG8gICAgICBvCisgICAgZGlhZ25vc3RpY3MgKGFzc2VydHMsIHRyYWNlcykgICAgbyAgICAgIG8KKyAgICBjb2RlIG9wdGltaXphdGlvbiAgICAgICAgICAgICAgICAgICAgICAgbyAgICAgIG8KKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworPWl0ZW0gQjwtLXRhcmdldC1jb21waWxlcj0+STx2ZXJzaW9uPgorCitCdWlsZCBmaWxlcyBmb3Igc3BlY2lmaWVkIHRhcmdldCBjb21waWxlciwgQzwxMT4gb3IgQzwxMj4uCisKKz1iYWNrCisKKz1pdGVtIFNob3J0Y3V0cworCitJZiBvcHRpb24gd2l0aCBDPG5vPiBwcmVmaXggaXMgdXNlZCwgY29ycmVzcG9uZGluZyBjb25maWd1cmF0aW9uIHdpbGwgQjxub3Q+IGJlIGJ1aWx0LgorVXNlZnVsIGZvciBleGNsdWRpbmcgc29tZSBjb25maWd1cmF0aW9ucyBpZiBvbmUgb3IgbW9yZSBvdGhlciBvcHRpb25zIHNwZWNpZmllZCB3aXRoIEM8YWxsPgordmFsdWUgKHNlZSBFeGFtcGxlcykuCisKKz1vdmVyCisKKz1pdGVtIEI8LS0+W0I8bm8+XUI8MTE+CisKK0J1aWxkIGZpbGVzIGZvciBjb21waWxlciBDPDExPi4KKworPWl0ZW0gQjwtLT5bQjxubz5dQjwxMj4KKworQnVpbGQgZmlsZXMgZm9yIGNvbXBpbGVyIEM8MTI+LgorCis9aXRlbSBCPC0tPltCPG5vPl1CPGRlYnVnPgorCis9aXRlbSBCPC0tPltCPG5vPl1CPGRlYmc+CisKKz1pdGVtIEI8LS0+W0I8bm8+XUI8ZGJnPgorCitCdWlsZCBkZWJ1Z2dhYmxlIGxpYnJhcnkuCisKKz1pdGVtIEI8LS0+W0I8bm8+XUI8ZGlhZz4KKworQnVpbGQgbGlicmFyeSB3aXRoIGRpYWdub3N0aWNzIGVuYWJsZWQuCisKKz1pdGVtIEI8LS0+W0I8bm8+XUI8ZHluYW1pYz4KKworQnVpbGQgZHluYW1pYyBsaWJyYXJ5IChkZWZhdWx0KS4KKworPWl0ZW0gQjwtLT5bQjxubz5dQjxub3JtYWw+CisKK0J1aWxkIG5vcm1hbCBsaWJyYXJ5IChkZWZhdWx0KS4KKworPWl0ZW0gQjwtLT5bQjxubz5dQjxyZWxlYXNlPgorCitCdWlsZCByZWxlYXNlIGxpYnJhcnkgKGRlZmF1bHQpLgorCis9aXRlbSBCPC0tPltCPG5vPl1CPHJ0bD4KKworQnVpbGQgT01QIFJUTCAoZGVmYXVsdCkuCisKKz1pdGVtIEI8LS0+W0I8bm8+XUI8c3R1YnM+CisKK0J1aWxkIHN0dWJzIGxpYnJhcnkuCisKKz1pdGVtIEI8LS0+W0I8bm8+XUI8dGltZWxpbWl0PgorCitCdWlsZCB0aW1lbGltaXQgdXRpbGl0eSBwcm9ncmFtLgorCis9YmFjaworCis9aXRlbSBTdGFuZGFyZCBPcHRpb25zCisKKz1vdmVyCisKKz1pdGVtIEI8LS1kb2M+CisKKz1pdGVtIEI8LS1tYW51YWw+CisKK1ByaW50IGZ1bGwgaGVscCBtZXNzYWdlIGFuZCBleGl0LgorCis9aXRlbSBCPC0taGVscD4KKworUHJpbnQgc2hvcnQgaGVscCBtZXNzYWdlIGFuZCBleGl0LgorCis9aXRlbSBCPC0tdXNhZ2U+CisKK1ByaW50IHZlcnkgc2hvcnQgdXNhZ2UgbWVzc2FnZSBhbmQgZXhpdC4KKworPWl0ZW0gQjwtLXZlcmJvc2U+CisKK0RvIHByaW50IGluZm9ybWF0aW9uYWwgbWVzc2FnZXMuCisKKz1pdGVtIEI8LS12ZXJzaW9uPgorCitQcmludCBwcm9ncmFtIHZlcnNpb24gYW5kIGV4aXQuCisKKz1pdGVtIEI8LS1xdWlldD4KKworV29yayBxdWlldCwgZG8gbm90IHByaW50IGluZm9ybWF0aW9uYWwgbWVzc2FnZXMuCisKKz1iYWNrCisKKz1iYWNrCisKKz1oZWFkMSBBUkdVTUVOVFMKKworPW92ZXIKKworPWl0ZW0gSTxtYWtlLW9wdGlvbj4KKworQW55IG9wdGlvbiBmb3IgbWFrZWZpbGUsIGZvciBleGFtcGxlIEM8LWs+IG9yIEM8LW4+LiBJZiB5b3UgcGFzcyBzb21lIG9wdGlvbnMgdG8gbWFrZWZpbGUsIEM8LS0+CitkZWxpbWl0ZXIgaXMgbWFuZGF0b3J5LCBvdGhlcndpc2UgQzxidWlsZC5wbD4gcHJvY2Vzc2VzIGFsbCB0aGUgb3B0aW9ucyBpbnRlcm5hbGx5LgorCis9aXRlbSBJPHZhcmlhYmxlPgorCitEZWZpbmUgbWFrZWZpbGUgdmFyaWFibGUgaW4gZm9ybSBJPG5hbWU+Qjw9Pkk8dmFsdWU+LiBNb3N0IG1ha2VmaWxlIGNhcGFiaWxpdGllcyBhcmUKK2FjY2Vzc2libGUgdGhyb3VnaCBDPGJ1aWxkLnBsPiBvcHRpb25zLCBzbyB0aGVyZSBpcyBubyBuZWVkIGluIGRlZmluaW5nIG1ha2UgdmFyaWFibGVzIGluIGNvbW1hbmQKK2xpbmUuCisKKz1pdGVtIEk8Z29hbD4KKworTWFrZWZpbGUgZ29hbCB0byBidWlsZCAob3IgY2xlYW4pLgorCis9b3ZlcgorCis9aXRlbSBCPGFsbD4KKworQnVpbGQgQzxsaWI+LCBDPHRlc3RzPiwgQzxpbmM+LgorCis9aXRlbSBCPGNvbW1vbj4KKworQnVpbGQgY29tbW9uIChhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQpIGZpbGVzLiBDb21tb24gZmlsZXMgYXJlIG5vdCBjb25maWd1cmF0aW9uLWRlcGVuZGVudCwgc28KK3RoZXJlIGlzIG5vIHBvaW50IGluIGJ1aWxkaW5nIGl0IGZvciBtb3JlIHRoYW4gb25lIGNvbmZpZ3VyYXRpb24gKHRob3VnaHQgaXQgaXMgaGFybWxlc3MpLgorSG93ZXZlciwgZG8gbm90IGJ1aWxkIGNvbW1vbiBmaWxlcyBvbiBtYW55IG1hY2hpbmVzIHNpbXVsdGFuZW91c2x5LgorCis9aXRlbSBCPGNsZWFuPgorCitEZWxldGUgdGhlIGV4cG9ydCBmaWxlcyBhbmQgY2xlYW4gYnVpbGQgZGlyZWN0b3J5IG9mIGNvbmZpZ3VyYXRpb24ocykgc3BlY2lmaWVkIGJ5IG9wdGlvbnMuIE5vdGUKK3RoYXQgQzxjbGVhbj4gZ29hbCBjYW5ub3QgYmUgbWl4ZWQgd2l0aCBvdGhlciBnb2FscyAoZXhjZXB0IGZvciBDPGNsZWFuLWNvbW1vbj4pLgorCis9aXRlbSBCPGNsZWFuLWNvbW1vbj4KKworRGVsZXRlIHRoZSBjb21tb24gZmlsZXMgaW4gRjxleHBvcnRzLz4gZGlyZWN0b3J5LgorCis9aXRlbSBCPGNsb2JiZXI+CisKK0NsZWFuIEY8ZXhwb3J0Lz4gYW5kIEY8dG1wLz4gZGlyZWN0b3JpZXMuIElmIEM8Y2xvYmJlcj4gaXMgc3BlY2lmaWVkLCBvdGhlciBnb2FscyBhbmQvb3Igb3B0aW9ucworZG8gbm90IG1hdHRlci4KKworTm90ZTogQ2xvYmJlcmluZyBpcyBwb3RlbnRpYWx5IGRhbmdlcm91cyBvcGVyYXRpb24sIGJlY2F1c2UgaXQgZGVsZXRlcyBjb250ZW50IG9mIGRpcmVjdG9yeQorcG9pbnRlZCBieSBJZiBDPExJQk9NUF9UTVA+IGVudmlyb25tZW50IHZhcmlhYmxlLCBzbyBDPGJ1aWxkLnBsPiBhc2tzIGEgY29uZmlybWF0aW9uIGJlZm9yZQorY2xvYmJlcmluZy4gVG8gc3VwcHJlc3MgdGhlIHF1ZXN0aW9uLCB1c2Ugb3B0aW9uIEM8LS1hbnN3ZXI9eWVzPi4KKworPWl0ZW0gQjxmYXQ+CisKK0M8bWFjXzMyZT4gb25seTogQnVpbGQgZmF0IGxpYnJhcmllcyBmb3IgYm90aCBtYWNfMzIgYW5kIG1hY18zMmUuIFNob3VsZCBiZSBydW4gd2hlbiBDPGxpYj4KK2dvYWwgaXMgYnVpbHQgb24gYm90aCBDPG1hY18zMj4gYW5kIEM8bWFjXzMyZT4uCisKKz1pdGVtIEk8ZmlsZS5vPgorCisoV2luZG93cyogT1M6IEk8ZmlsZS5vYmo+KSBCdWlsZCBzcGVjaWZpZWQgb2JqZWN0IGZpbGUgb25seS4KKworPWl0ZW0gSTxmaWxlLmk+CisKK0NyZWF0ZSBwcmVwcm9jZXNzZWQgc291cmNlIGZpbGUuCisKKz1pdGVtIEI8Zm9yY2UtdGVzdHM+CisKK0ZvcmNlIHBlcmZvcm1pbmcgdGVzdHMuCisKKz1pdGVtIEI8Zm9yY2UtdGVzdC1kZXBzPgorCitGb3JjZSBwZXJmb3JtaW5nIHRlc3QtZGVwcy4KKworPWl0ZW0gQjxmb3JjZS10ZXN0LWluc3RyPgorCitGb3JjZSBwZXJmb3JtaW5nIHRlc3QtaW5zdHIuCisKKz1pdGVtIEI8Zm9yY2UtdGVzdC1yZWxvPgorCitGb3JjZSBwZXJmb3JtaW5nIHRlc3QtcmVsby4KKworPWl0ZW0gQjxmb3JjZS10ZXN0LXRvdWNoPgorCitGb3JjZSBwZXJmb3JtaW5nIHRlc3QtdG91Y2guCisKKz1pdGVtIEI8aW5jPgorCitCdWlsZCBGb3J0cmFuIGluY2x1ZGUgZmlsZXMsIG9tcF9saWIuaCwgb21wX2xpYi5tb2QgYW5kIG9tcF9saWJfa2luZHMubW9kLgorCis9aXRlbSBCPGxpYj4KKworQnVpbGQgbGlicmFyeSAob24gV2luZG93cyogT1MgaW4gY2FzZSBvZiBkeW5hbWljIGxpbmtpbmcsIGl0IGFsc28gYnVpbGRzIGltcG9ydCBsaWJyYXJ5KS4KKworPWl0ZW0gQjx0ZXN0cz4KKworUGVyZm9ybSB0ZXN0czogQzx0ZXN0LWRlcHM+LCBDPHRlc3QtaW5zdHI+LCBDPHRlc3QtcmVsbz4sIGFuZCBDPHRlc3QtdG91Y2g+LgorCis9aXRlbSBCPHRlc3QtZGVwcz4KKworQ2hlY2sgdGhlIGxpYnJhcnkgZGVwZW5kZW5jaWVzLiAKKworPWl0ZW0gQjx0ZXN0LWluc3RyPgorCitJbnRlbChSKSBNYW55IEludGVncmF0ZWQgQ29yZSBBcmNoaXRlY3R1cmUgb25seTogY2hlY2sgdGhlIGxpYnJhcnkgZG9lcyBub3QgY29udGFpbiB1bmRlc2lyZWQgaW5zdHJ1Y3Rpb25zLgorCis9aXRlbSBCPHRlc3QtcmVsbz4KKworTGludXgqIE9TIHdpdGggZHluYW1pYyBsaW5raW5nIG9ubHk6IGNoZWNrIHRoZSBsaWJyYXJ5IGRvZXMgbm90IGNvbnRhaW4gcG9zaXRpb24tZGVwZW5kZW50Citjb2RlLgorCis9aXRlbSBCPHRlc3QtdG91Y2g+CisKK0J1aWxkIGEgdmVyeSBzaW1wbGUgYXBwbGljYXRpb24gd2l0aCBuYXRpdmUgY29tcGlsZXIgKEdOVSBvbiBMaW51eCogT1MgYW5kIE9TIFgqLCBNUworb24gV2luZG93cyogT1MpLCBjaGVjayBpdCBkb2VzIG5vdCBkZXBlbmQgb24gQzxsaWJpcmM+IGxpYnJhcnksIGFuZCBydW4gaXQuCisKKz1iYWNrCisKKz1iYWNrCisKKz1oZWFkMSBERVNDUklQVElPTgorCitDPGJ1aWxkLnBsPiBjb25zdHJ1Y3RzIHRoZSBuYW1lIG9mIGEgYnVpbGQgZGlyZWN0b3J5LCBjcmVhdGVzIHRoZSBkaXJlY3RvcnkgaWYgaXQKK2RvZXMgbm90IGV4aXN0LCBjaGFuZ2VzIHRvIGl0LCBhbmQgcnVucyBtYWtlIHRvIGJ1aWxkIHRoZSBnb2FscyBpbiBzcGVjaWZpZWQgY29uZmlndXJhdGlvbi4KK0lmIG1vcmUgdGhhbiBvbmUgY29uZmlndXJhdGlvbiBhcmUgc3BlY2lmaWVkIGluIGNvbW1hbmQgbGluZSBDPGJ1aWxkLnBsPiBidWlsZHMgdGhlbSBhbGwuCisKK0JlaW5nIHJ1biB3aXRoIEM8Y2xlYW4+IGdvYWwsIEM8YnVpbGQucGw+IGRvZXMgbm90IGJ1aWxkIGJ1dCBkZWxldGVzIGV4cG9ydCBmaWxlcyBhbmQKK2NsZWFucyBidWlsZCBkaXJlY3RvcmllcyBvZiBjb25maWd1cmF0aW9uIHNwZWNpZmllZCBieSBvdGhlciBvcHRpb25zLiBGb3IgZXhhbXBsZSwKK0M8YnVpbGQucGwgLS1hbGwgY2xlYW4+IG1lYW5zICJjbGVhbiBidWlsZCBkaXJlY3RvcmllcyBmb3IgYWxsIGNvbmZpZ3VyYXRpb25zIiwKK2l0IGRvZXMgQjxub3Q+IG1lYW4gImNsZWFuIHRoZW4gYnVpbGQgYWxsIi4KKworQzxjbGVhci1jb21tb24+IGdvYWwgZGVsZXRlcyBjb21tb24gZmlsZXMgaW4gRjxleHBvcnRzLz4gZGlyZWN0b3J5LgorU2luY2UgY29tbW9uIGZpbGVzIGFyZSByZWFsbHkgY29tbW9uIGFuZCBub3QgYXJjaGl0ZWN0dXJlIGFuZC9vciBjb25maWd1cmF0aW9uIGRlcGVuZGVudCwKK3RoZXJlIGFyZSBubyBtdWNoIG1lYW5pbmcgaW4gY29tYmluaW5nIEM8Y2xlYXItY29tbW9uPiB3aXRoIGNvbmZpZ3VyYXRpb24gc2VsZWN0aW9uIG9wdGlvbnMuCitGb3IgZXhhbXBsZSwgQzxidWlsZC5wbCAtLWFsbCBjbGVhbi1jb21tb24+IGRlbGV0ZXMgdGhlIHNhbWUgZmlsZXMgMTMgdGltZXMuCitIb3dldmVyLCBpdCBkb2VzIG5vdCBodXJ0IGFuZCBjYW4gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIEM8Y2xlYXI+IGdvYWwuCisKK0M8Y2xvYmJlcj4gZ29hbCBpbnN0cnVjdHMgQzxidWlsZC5wbD4gdG8gY2xlYW4gZXhwb3J0cyBhbmQgYWxsIGJ1aWxkCitkaXJlY3RvcmllcywgZS4gZy4gY2xlYW4gZXZlcnl0aGluZyB1bmRlciBGPGV4cG9ydHMvPiBhbmQgRjx0bXAvPiBkaXJlY3Rvcmllcy4KKworTG9ncyBhcmUgc2F2ZWQgYXV0b21hdGljYWxseSwgdGhlcmUgaXMgbm8gbmVlZCBpbiBleHBsaWNpdCBvdXRwdXQgcmVkaXJlY3Rpb24uCitMb2cgZmlsZSBmb3IgZWFjaCBwYXJ0aWN1bGFyIGNvbmZpZ3VyYXRpb24gaXMgbmFtZWQgRjxidWlsZC5sb2c+IGFuZCBsb2NhdGVkIGluIGJ1aWxkIGRpcmVjdG9yeS4KK1N1bW1hcnkgbG9nIGZpbGUgKGp1c3QgcmVzdWx0IG9mIGVhY2ggY29uZmlndXJhdGlvbikgaXMgc2F2ZWQgaW4gRjx0bXAvPiBkaXJlY3RvcnkuCisKK0xvZyBmaWxlcyBhcmUgbmV2ZXIgb3ZlcndyaXR0ZW4uIEM8YnVpbGQucGw+IGFsd2F5cyBhcHBlbmRzIG91dHB1dCB0byBsb2cgZmlsZXMuCitIb3dldmVyIChvYnZpb3VzbHkpLCBDPGNsZWFyPiBkZWxldGVzIGxvZyBmaWxlIGZvciBjbGVhcmVkIGNvbmZpZ3VyYXRpb25zLAorYW5kIEM8Y2xvYmJlcj4gZGVsZXRlcyBhbGwgc3VtbWFyeSBsb2cgZmlsZXMuCisKKz1oZWFkMiBFbnZpcm9ubWVudCBWYXJpYWJsZXMKKworPW92ZXIKKworPWl0ZW0gQjxMSUJPTVBfQVJDSD4KKworU3BlY2lmaWVzIHRhcmdldCBhcmNoaXRlY3R1cmUuIElmIG5vdCBwcmVzZW50LCBob3N0IGFyY2hpdGVjdHVyZSBpcyB1c2VkLiBFbnZpcm9ubWVudCB2YXJpYWJsZSBtYXkKK2JlIG92ZXJyaWRlbiBieSBDPC0tYXJjaGl0ZWN0dXJlPiBjb21tYW5kIGxpbmUgb3B0aW9uLgorCis9aXRlbSBCPExJQk9NUF9FWFBPUlRTPgorCitTcGVjaWZpZXMgZGlyZWN0b3J5IGZvciBvdXRwdXQgZmlsZXMuIElmIG5vdCBzZXQsIEM8JExJQk9NUF9XT1JLL2V4cG9ydHMvPiB1c2VkIGJ5IGRlZmF1bHQuCisKKz1pdGVtIEI8TElCT01QX09TPgorCitTcGVjaWZpZXMgdGFyZ2V0IE9TLiBJZiBub3QgcHJlc2VudCwgaG9zdCBPUyBpcyB1c2VkLiBFbnZpcm9ubWVudCB2YXJpYWJsZSBtYXkKK2JlIG92ZXJyaWRlbiBieSBDPC0tb3M+IGNvbW1hbmQgbGluZSBvcHRpb24uCisKKz1pdGVtIEI8TElCT01QX1RNUD4KKworRGlyZWN0b3J5IGZvciB0ZW1wb3JhcnkgZmlsZXMuIEM8YnVpbGQucGw+IGNyZWF0ZXMgYnVpbGQgZGlyZWN0b3JpZXMgdGhlcmUuIElmIG5vdCBzZXQsCitDPCRMSUJPTVBfV09SSy90bXAvPiB1c2VkIGJ5IGRlZmF1bHQuCisKK09uIFdpbmRvd3MqIE9TIEY8dG1wLz4gZGlyZWN0b3J5IG9uIGxvY2FsIGRyaXZlIHNwZWVkcyB1cCB0aGUgYnVpbGQgcHJvY2Vzcy4KKworPWl0ZW0gQjxMSUJPTVBfV09SSz4KKworUm9vdCBvZiBsaWJvbXAgZGlyZWN0b3J5IHRyZWUsIGNvbnRhaW5zIEY8c3JjLz4sIEY8dG9vbHMvPiwgYW5kIEY8ZXhwb3J0cy8+IHN1YmRpcnMuCitJZiBub3Qgc2V0LCBDPGJ1aWxkLnBsPiBndWVzc2VzIHRoZSByb290IGRpciAoaXQgaXMgYSBwYXJlbnQgb2YgZGlyIGNvbnRhaW5pbmcgQzxidWlsZC5wbD4pLgorCitOb3RlOiBHdWVzc2luZyBpdCBub3QgcmVsaWFibGUuIFBsZWFzZSBzZXQgQzxMSUJPTVBfV09SSz4gZW52aXJvbm1lbnQgdmFyaWFibGUgYXBwcm9wcmlhdGVseS4KKworPWJhY2sKKworPWhlYWQxIEVYQU1QTEVTCisKKz1oZWFkMiBEZXZlbG9wbWVudAorCitCdWlsZCBub3JtYWwgKHBlcmZvcm1hbmNlKSBkeW5hbWljIGxpYnJhcnkgZm9yIGRlYnVnZ2luZzoKKworICAgICQgYnVpbGQucGwgLS1kZWJ1ZworCitCdWlsZCBhbGwgbGlicmFyaWVzIChub3JtYWwsIHN0dWI7IGR5bmFtaWMgUlRMKSBmb3IgZGVidWdnaW5nOgorCisgICAgJCBidWlsZC5wbCAtLWFsbCAtLWRlYnVnCisKK0RvIGEgY2xlYW4gYnVpbGQgZm9yIGFsbDoKKworICAgICQgYnVpbGQucGwgLS1hbGwgLS1kZWJ1ZyBjbGVhbiAmJiBidWlsZC5wbCAtLWFsbCAtLWRlYnVnCisKK0RlYnVnZ2luZyBsaWJyYXJpZXMgYXJlIHNhdmVkIGluIEY8ZXhwb3J0cy9JPHBsYXRmb3JtPi5kZWIvPi4KKworPWhlYWQyIFByb21vdGlvbgorCis9b3ZlcgorCis9aXRlbSAxCisKK0Nsb2JiZXIgZXZlcnl0aGluZzsgb24gb25lIG1hY2hpbmU6CisKKyAgICAkIGJ1aWxkLnBsIGNsb2JiZXIKKworPWl0ZW0gMgorCitCdWlsZCBjb21tb24gaGVhZGVycywgb24gb25lIG1hY2hpbmU6CisKKyAgICAkIGJ1aWxkLnBsIGNvbW1vbgorCis9aXRlbSAzCisKK0J1aWxkIGFsbCBwbGF0Zm9ybS1kZXBlbmRlbnQgZmlsZXMsIG9uIGFsbCBtYWNoaW5lczoKKworICAgICQgYnVpbGQucGwgLS1hbGwKKworPWl0ZW0gNAorCitCdWlsZCBPUyBYKiB1bml2ZXJzYWwgKGZhdCkgbGlicmFyaWVzLCBvbiBDPG1hY18zMmU+OgorCisgICAgJCBidWlsZC5wbCBmYXQKKworPWJhY2sKKworPWN1dAorCisjIGVuZCBvZiBmaWxlICMKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdG9vbHMvY2hlY2stZGVwZW5kcy5wbCBiL2ZpbmFsL3J1bnRpbWUvdG9vbHMvY2hlY2stZGVwZW5kcy5wbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yYThkZTU2Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90b29scy9jaGVjay1kZXBlbmRzLnBsCkBAIC0wLDAgKzEsNDkxIEBACisjIS91c3IvYmluL2VudiBwZXJsCisKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKwordXNlIEZpbmRCaW47Cit1c2UgbGliICIkRmluZEJpbjo6QmluL2xpYiI7CisKK3VzZSB0b29sczsKK3VzZSBQbGF0Zm9ybSAiOnZhcnMiOworCitvdXIgJFZFUlNJT04gPSAiMC4wMDUiOworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIE91cHV0IHBhcnNlIGVycm9yLgorIyAgICAgJHRvb2wgLS0gTmFtZSBvZiB0b29sLgorIyAgICAgQGJ1bGsgLS0gT3V0cHV0IG9mIHRoZSB0b29sLgorIyAgICAgJG4gICAgLS0gTnVtYmVyIG9mIGxpbmUgY2F1c2VkIHBhcnNlIGVycm9yLgorc3ViIHBhcnNlX2Vycm9yKCRcQCQpIHsKKyAgICBteSAoICR0b29sLCAkYnVsaywgJG4gKSA9IEBfOworICAgIG15IEBidWxrOworICAgIGZvciAoIG15ICRpID0gMDsgJGkgPCBAJGJ1bGs7ICsrICRpICkgeworICAgICAgICBwdXNoKCBAYnVsaywgKCAkaSA9PSAkbiA/ICI+Pj4gIiA6ICIgICAgIiApIC4gJGJ1bGstPlsgJGkgXSApOworICAgIH07ICMgZm9yICRpCisgICAgcnVudGltZV9lcnJvciggIkZhaWwgdG8gcGFyc2UgJHRvb2wgb3V0cHV0OiIsIEBidWxrLCAiKGVvZikiICk7Cit9OyAjIHN1YiBwYXJzZV9lcnJvcgorCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTGludXgqIE9TIHZlcnNpb24gb2YgZ2V0X2RlcHMoKSBwYXJzZXMgb3V0cHV0IG9mIGxkZDoKKyMKKyMgJCBsZGQgbGlibmFtZS5zbworIyAgIGxpYmMuc28uNiA9PiAvbGliNjQvbGliYy5zby42ICgweDAwMDAyYjYwZmVkZDgwMDApCisjICAgbGliZGwuc28uMiA9PiAvbGliNjQvbGliZGwuc28uMiAoMHgwMDAwMmI2MGZmMTJiMDAwKQorIyAgIGxpYnB0aHJlYWQuc28uMCA9PiAvbGliNjQvbGlicHRocmVhZC5zby4wICgweDAwMDAyYjYwZmYzMmYwMDApCisjICAgL2xpYjY0L2xkLWxpbnV4LXg4Ni02NC5zby4yICgweDAwMDAwMDM4Nzk0MDAwMDApCisjCisjIE5vdGU6IGxkZCBwcmludGQgYWxsIHRoZSBkZXBlbmRlbmNpZXMsIGRpcmVjdCBhbmQgaW5kaXJlY3QuIChGb3IgZXhhbXBsZSwgaWYgc3BlY2lmaWVkIGxpYnJhcnkKKyMgcmVxdWlyZXMgbGliZGwuc28sIGFuZCBsaWJkbC5zbyByZXF1aXJlcyAvbGliL2xkLWxpbnV4LnNvLCBsZGQgcHJpbnRzIGJvdGggbGliZGwuc28gYW5kCisjIC9saWIvbGQtbGludXguc28pLiBJZiB5b3UgZG8gbm90IHdhbnQgaW5kaXJlY3QgZGVwZW5kZW5jaWVzLCBsb29rIGF0IHJlYWRlbGYgdG9vbC4KKyMKK3N1YiBnZXRfZGVwc19sZGQoJCkgeworCisgICAgbXkgJGxpYiA9IHNoaWZ0ICggQF8gKTsKKyAgICBteSAkdG9vbCA9ICJsZGQiOworICAgIG15IEBidWxrOworICAgIG15IEBkZXBzOworCisgICAgZXhlY3V0ZSggWyAkdG9vbCwgJGxpYiBdLCAtc3Rkb3V0ID0+IFxAYnVsayApOworICAgIGRlYnVnKCBAYnVsaywgIihlb2YpIiApOworCisgICAgZm9yZWFjaCBteSAkaSAoIDAgLi4gQGJ1bGsgLSAxICkgeworICAgICAgICBteSAkbGluZSA9ICRidWxrWyAkaSBdOworICAgICAgICBpZiAoICRsaW5lICF+IG17XlxzKig/OihbX2EtejAtOS4rLS9dKilccys9PlxzKyk/KFtfYS16MC05ListL10qKVxzK1woMHhbMC05YS16XSpcKSR9aSApIHsKKyAgICAgICAgICAgIHBhcnNlX2Vycm9yKCAkdG9vbCwgQGJ1bGssICRpICk7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgbXkgJGRlcCA9ICggZGVmaW5lZCggJDEgKSA/ICQxIDogJDIgKTsKKyAgICAgICAgcHVzaCggQGRlcHMsICRkZXAgKTsKKyAgICB9OyAjIGZvcmVhY2ggJGkKKworICAgIHJldHVybiBAZGVwczsKKworfTsgIyBzdWIgZ2V0X2RlcHNfbGRkCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBBbm90aGVyIExpbnV4KiBPUyB2ZXJzaW9uIG9mIGdldF9kZXBzKCkgcGFyc2VzIG91dHB1dCBvZiByZWFkZWxmOgorIworIyAkIHJlYWRlbGYgLWQgZXhwb3J0cy9saW5fMzJlL2xpYi9saWJpb21wNS5zbworIworIyBEeW5hbWljIHNlZ21lbnQgYXQgb2Zmc2V0IDB4ODcwMDggY29udGFpbnMgMjQgZW50cmllczoKKyMgICBUYWcgICAgICAgIFR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZS9WYWx1ZQorIyAgMHgwMDAwMDAwMDAwMDAwMDAxIChORUVERUQpICAgICAgICAgICAgIFNoYXJlZCBsaWJyYXJ5OiBbbGliYy5zby42XQorIyAgMHgwMDAwMDAwMDAwMDAwMDAxIChORUVERUQpICAgICAgICAgICAgIFNoYXJlZCBsaWJyYXJ5OiBbbGliZGwuc28uMl0KKyMgIDB4MDAwMDAwMDAwMDAwMDAwMSAoTkVFREVEKSAgICAgICAgICAgICBTaGFyZWQgbGlicmFyeTogW2xpYnB0aHJlYWQuc28uMF0KKyMgIDB4MDAwMDAwMDAwMDAwMDAwZSAoU09OQU1FKSAgICAgICAgICAgICBMaWJyYXJ5IHNvbmFtZTogW2xpYmlvbXA1LnNvXQorIyAgMHgwMDAwMDAwMDAwMDAwMDBkIChGSU5JKSAgICAgICAgICAgICAgIDB4NTFjYWEKKyMgIDB4MDAwMDAwMDAwMDAwMDAwNCAoSEFTSCkgICAgICAgICAgICAgICAweDE1OAorIyAgMHgwMDAwMDAwMDAwMDAwMDA1IChTVFJUQUIpICAgICAgICAgICAgIDB4OTM1MAorIyAgLi4uCisjCisjIE5vdGU6IEluIGNvbnRyYXN0IHRvIGxkZCwgcmVhZGxlZiBzaG93cyBvbmx5IGRpcmVjdCBkZXBlbmRlbmNpZXMuCisjCitzdWIgZ2V0X2RlcHNfcmVhZGVsZigkKSB7CisKKyAgICBteSAkZmlsZSA9IHNoaWZ0ICggQF8gKTsKKyAgICBteSAkdG9vbCA9ICJyZWFkZWxmIjsKKyAgICBteSBAYnVsazsKKyAgICBteSBAZGVwczsKKworICAgIGV4ZWN1dGUoIFsgJHRvb2wsICItZCIsICRmaWxlIF0sIC1zdGRvdXQgPT4gXEBidWxrICk7CisgICAgZGVidWcoIEBidWxrLCAiKGVvZikiICk7CisKKyAgICBteSAkaSA9IDA7CisgICAgIyBQYXJzZSBoZWFkZXIuCisgICAgKCAkaSA8IEBidWxrIGFuZCAkYnVsa1sgJGkgXSA9fiBte15ccyokfSApCisgICAgICAgIG9yIHBhcnNlX2Vycm9yKCAkdG9vbCwgQGJ1bGssICRpICk7CisgICAgKysgJGk7CisgICAgaWYgKCAkaSA9PSBAYnVsayAtIDEgYW5kICRidWxrWyAkaSBdID1+IG17XlRoZXJlIGlzIG5vIGR5bmFtaWMgc2VjdGlvbiBpbiB0aGlzIGZpbGVcLlxzKiR9ICkgeworICAgICAgICAjIFRoaXMgaXMgbm90IGR5bmFtaWMgZXhlY3V0YWJsZSA9PiBubyBkZXBlbmRlbmNpZXMuCisgICAgICAgIHJldHVybiBAZGVwczsKKyAgICB9OyAjIGlmCisgICAgKCAkaSA8IEBidWxrIGFuZCAkYnVsa1sgJGkgXSA9fiBte15EeW5hbWljICg/OnNlZ21lbnR8c2VjdGlvbikgYXQgb2Zmc2V0IDB4WzAtOWEtZl0rIGNvbnRhaW5zIFxkKyBlbnRyaWVzOlxzKiR9ICkKKyAgICAgICAgb3IgcGFyc2VfZXJyb3IoICR0b29sLCBAYnVsaywgJGkgKTsKKyAgICArKyAkaTsKKyAgICAoICRpIDwgQGJ1bGsgYW5kICRidWxrWyAkaSBdID1+IG17XlxzKlRhZ1xzK1R5cGVccytOYW1lL1ZhbHVlXHMqJH0gKQorICAgICAgICBvciBwYXJzZV9lcnJvciggJHRvb2wsIEBidWxrLCAkaSApOworICAgICsrICRpOworICAgICMgUGFyc2UgYm9keS4KKyAgICB3aGlsZSAoICRpIDwgQGJ1bGsgKSB7CisgICAgICAgIG15ICRsaW5lID0gJGJ1bGtbICRpIF07CisgICAgICAgIGlmICggJGxpbmUgIX4gbXteXHMqMHhbMC05YS1mXStccytcKChbX0EtWjAtOV0rKVwpXHMrKC4qKVxzKiR9aSApIHsKKyAgICAgICAgICAgIHBhcnNlX2Vycm9yKCAkdG9vbCwgQGJ1bGssICRpICk7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgbXkgKCAkdHlwZSwgJHZhbHVlICkgPSAoICQxLCAkMiApOworICAgICAgICBpZiAoICR0eXBlIGVxICJORUVERUQiICkgeworICAgICAgICAgICAgaWYgKCAkdmFsdWUgIX4gbXtcQVNoYXJlZCBsaWJyYXJ5OiBcWyguKilcXVx6fSApIHsKKyAgICAgICAgICAgICAgICBwYXJzZV9lcnJvciggJHRvb2wsIEBidWxrLCAkaSApOworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgbXkgJGRlcCA9ICQxOworICAgICAgICAgICAgcHVzaCggQGRlcHMsICRkZXAgKTsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICArKyAkaTsKKyAgICB9OyAjIGZvcmVhY2ggJGkKKworICAgIHJldHVybiBAZGVwczsKKworfTsgIyBzdWIgZ2V0X2RlcHNfcmVhZGVsZgorCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgT1MgWCogdmVyc2lvbiBvZiBnZXRfZGVwcygpIHBhcnNlcyBvdXRwdXQgb2Ygb3Rvb2w6CisjCisjICQgb3Rvb2wgLUwgbGlibmFtZS5keWxpYgorIyBleHBvcnRzL21hY18zMi9saWIudGhpbi9saWJpb21wNS5keWxpYjoKKyMgICAgICAgIGxpYmlvbXA1LmR5bGliIChjb21wYXRpYmlsaXR5IHZlcnNpb24gNS4wLjAsIGN1cnJlbnQgdmVyc2lvbiA1LjAuMCkKKyMgICAgICAgIC91c3IvbGliL2xpYlN5c3RlbS5CLmR5bGliIChjb21wYXRpYmlsaXR5IHZlcnNpb24gMS4wLjAsIGN1cnJlbnQgdmVyc2lvbiA4OC4xLjMpCisjCitzdWIgZ2V0X2RlcHNfb3Rvb2woJCkgeworCisgICAgbXkgJGZpbGUgPSBzaGlmdCAoIEBfICk7CisgICAgbXkgJG5hbWUgPSBnZXRfZmlsZSggJGZpbGUgKTsKKyAgICBteSAkdG9vbCA9ICJvdG9vbCI7CisgICAgbXkgQGJ1bGs7CisgICAgbXkgQGRlcHM7CisKKyAgICBpZiAoICR0YXJnZXRfYXJjaCBlcSAiMzJlIiApIHsKKyAgICAgICAgIyBPbiBvbGRlciAoVGlnZXIpIHN5c3RlbXMgb3Rvb2wgZG9lcyBub3QgcmVjb2duaXplIDY0LWJpdCBiaW5hcmllcywgc28gdHJ5IHRvIGxvY2F0ZQorICAgICAgICAjIG90b29sNjQuCisgICAgICAgIG15ICRwYXRoID0gd2hpY2goICJvdG9vbDY0IiApOworICAgICAgICBpZiAoIGRlZmluZWQgKCAkcGF0aCApICkgeworICAgICAgICAgICAgJHRvb2wgPSAib3Rvb2w2NCI7CisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGlmCisKKyAgICBleGVjdXRlKCBbICR0b29sLCAiLUwiLCAkZmlsZSBdLCAtc3Rkb3V0ID0+IFxAYnVsayApOworICAgIGRlYnVnKCBAYnVsaywgIihlb2YpIiApOworCisgICAgbXkgJGkgPSAwOworICAgICMgUGFyc2UgdGhlIGZpcnN0IG9uZSBvciB0d28gbGluZXMgc2VwYXJhdGVseS4KKyAgICAoICRpIDwgQGJ1bGsgYW5kICRidWxrWyAkaSBdID1+IG17XlxRJGZpbGVcRTokfSApCisgICAgICAgIG9yIHBhcnNlX2Vycm9yKCAkdG9vbCwgQGJ1bGssICRpICk7CisgICAgKysgJGk7CisgICAgaWYgKCAkbmFtZSA9fiBte1wuZHlsaWJcen0gKSB7CisgICAgICAgICMgSW4gY2FzZSBvZiBkeW5hbWljIGxpYnJhcnkgb3Rvb2wgcHJpbnQgdGhlIGxpYnJhcnkgaXRzZWxmIGFzIGEgZGVwZW5kZW50IGxpYnJhcnkuCisgICAgICAgICggJGkgPCBAYnVsayBhbmQgJGJ1bGtbICRpIF0gPX4gbXteXHMrXFEkbmFtZVxFXHMrXChjb21wYXRpYmlsaXR5IHZlcnNpb24uKlwpJH0gKQorICAgICAgICAgICAgb3IgcGFyc2VfZXJyb3IoICR0b29sLCBAYnVsaywgJGkgKTsKKyAgICAgICAgKysgJGk7CisgICAgfTsgIyBpZgorCisgICAgIyBUaGVuIHBhcnNlIHRoZSByZXN0LgorICAgIHdoaWxlICggJGkgPCBAYnVsayApIHsKKyAgICAgICAgbXkgJGxpbmUgPSAkYnVsa1sgJGkgXTsKKyAgICAgICAgaWYgKCAkbGluZSAhfiBtL15ccyooLiopXHMrXChjb21wYXRpYmlsaXR5IHZlcnNpb25ccy4qXCkkLyApIHsKKyAgICAgICAgICAgIHBhcnNlX2Vycm9yKCAkdG9vbCwgQGJ1bGssICRpICk7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgbXkgKCAkZGVwICkgPSAoICQxICk7CisgICAgICAgIHB1c2goIEBkZXBzLCAkZGVwICk7CisgICAgICAgICsrICRpOworICAgIH07ICMgd2hpbGUKKworICAgIHJldHVybiBAZGVwczsKKworfTsgIyBzdWIgZ2V0X2RlcHNfb3Rvb2wKKworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFdpbmRvd3MqIE9TIHZlcnNpb24gb2YgZ2V0X2RlcHMoKSBwYXJzZXMgb3V0cHV0IG9mIGxpbms6CisjCisjID4gbGluayAtZHVtcCAtZGVwZW5kZW50cyBsaWJuYW1lLmRsbAorIyBNaWNyb3NvZnQgKFIpIENPRkYvUEUgRHVtcGVyIFZlcnNpb24gOC4wMC40MDMxMC4zOQorIyBDb3B5cmlnaHQgKEMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIER1bXAgb2YgZmlsZSBTOlxQcm9qZWN0cy5PTVBcdXNlcnNcb21hbHlzaGVcb21wXGxpYm9tcFxleHBvcnRzXHdpbl82NFxsaWJcbGliaW9tcDVtZC5kbGwKKyMgRmlsZSBUeXBlOiBETEwKKyMgICBJbWFnZSBoYXMgdGhlIGZvbGxvd2luZyBkZXBlbmRlbmNpZXM6CisjICAgICBLRVJORUwzMi5kbGwKKyMgICBTdW1tYXJ5CisjICAgICAgICAgQzAwMCAuZGF0YQorIyAgICAgICAgIDYwMDAgLnBkYXRhCisjICAgICAgICAxODAwMCAucmRhdGEKKyMgICAgICAgIC4uLgorIworIyA+IGxpbmsgLWR1bXAgLWRpcmVjdGl2ZXMgbGlibmFtZS5saWIKKyMgTWljcm9zb2Z0IChSKSBDT0ZGL1BFIER1bXBlciBWZXJzaW9uIDguMDAuNDAzMTAuMzkKKyMgQ29weXJpZ2h0IChDKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBEdW1wIG9mIGZpbGUgUzpcUHJvamVjdHMuT01QXHVzZXJzXG9tYWx5c2hlXG9tcFxsaWJvbXBcZXhwb3J0c1x3aW5fMzJlXGxpYlxsaWJpbXA1bXQubGliCisjIEZpbGUgVHlwZTogTElCUkFSWQorIyAgIExpbmtlciBEaXJlY3RpdmVzCisjICAgLS0tLS0tLS0tLS0tLS0tLS0KKyMgICAtZGVmYXVsdGxpYjoidXVpZC5saWIiCisjICAgLWRlZmF1bHRsaWI6InV1aWQubGliIgorIyAgIC4uLi4uCisjICAgU3VtbWFyeQorIyAgICAgICAzMjUwIC5ic3MKKyMgICAgICAgM0ZCQyAuZGF0YQorIyAgICAgICAgIDM0IC5kYXRhMQorIyAgICAgICAuLi4uCitzdWIgZ2V0X2RlcHNfbGluaygkKSB7CisKKyAgICBteSAoICRsaWIgKSA9IEBfOworICAgIG15ICR0b29sID0gImxpbmsiOworICAgIG15IEBidWxrOworICAgIG15IEBkZXBzOworCisgICAgbXkgJGV4dCA9IGxjKCBnZXRfZXh0KCAkbGliICkgKTsKKyAgICBpZiAoICRleHQgIX4gbXtcQVwuKD86bGlifGRsbHxleGUpXHp9aSApIHsKKyAgICAgICAgcnVudGltZV9lcnJvciggIkluY29ycmVjdCBmaWxlIGlzIHNwZWNpZmllZDogYCRsaWInOyBvbmx5IGBsaWInLCBgZGxsJyBvciBgZXhlJyBmaWxlIGV4cGVjdGVkIiApOworICAgIH07ICMgaWYKKworICAgIGV4ZWN1dGUoCisgICAgICAgIFsgJHRvb2wsICIvZHVtcCIsICggJGV4dCBlcSAiLmxpYiIgPyAiL2RpcmVjdGl2ZXMiIDogIi9kZXBlbmRlbnRzIiApLCAkbGliIF0sCisgICAgICAgIC1zdGRvdXQgPT4gXEBidWxrCisgICAgKTsKKworICAgIGRlYnVnKCBAYnVsaywgIihlb2YpIiApOworCisgICAgbXkgJGkgPSAwOworICAgICggJGkgPCBAYnVsayBhbmQgJGJ1bGtbICRpIF0gPX4gbXteTWljcm9zb2Z0IFwoUlwpIENPRkZcL1BFIER1bXBlciBWZXJzaW9uLiokfSApIG9yIHBhcnNlX2Vycm9yKCAkdG9vbCwgQGJ1bGssICRpICk7ICsrICRpOworICAgICggJGkgPCBAYnVsayBhbmQgJGJ1bGtbICRpIF0gPX4gbXteQ29weXJpZ2h0IFwoQ1wpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvblwuLiokfSApIG9yIHBhcnNlX2Vycm9yKCAkdG9vbCwgQGJ1bGssICRpICk7ICsrICRpOworICAgICggJGkgPCBAYnVsayBhbmQgJGJ1bGtbICRpIF0gPX4gbXteXHMqJH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIG9yIHBhcnNlX2Vycm9yKCAkdG9vbCwgQGJ1bGssICRpICk7ICsrICRpOworICAgICggJGkgPCBAYnVsayBhbmQgJGJ1bGtbICRpIF0gPX4gbXteXHMqJH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIG9yIHBhcnNlX2Vycm9yKCAkdG9vbCwgQGJ1bGssICRpICk7ICsrICRpOworICAgICggJGkgPCBAYnVsayBhbmQgJGJ1bGtbICRpIF0gPX4gbXteRHVtcCBvZiBmaWxlXHNcUSRsaWJcRSR9ICAgICAgICAgICAgICAgICAgICApIG9yIHBhcnNlX2Vycm9yKCAkdG9vbCwgQGJ1bGssICRpICk7ICsrICRpOworICAgICggJGkgPCBAYnVsayBhbmQgJGJ1bGtbICRpIF0gPX4gbXteXHMqJH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIG9yIHBhcnNlX2Vycm9yKCAkdG9vbCwgQGJ1bGssICRpICk7ICsrICRpOworICAgICggJGkgPCBAYnVsayBhbmQgJGJ1bGtbICRpIF0gPX4gbXteRmlsZSBUeXBlOlxzKC4qKSR9ICAgICAgICAgICAgICAgICAgICAgICAgICApIG9yIHBhcnNlX2Vycm9yKCAkdG9vbCwgQGJ1bGssICRpICk7ICsrICRpOworICAgICggJGkgPCBAYnVsayBhbmQgJGJ1bGtbICRpIF0gPX4gbXteXHMqJH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIG9yIHBhcnNlX2Vycm9yKCAkdG9vbCwgQGJ1bGssICRpICk7ICsrICRpOworCisgICAgaWYgKCAkZXh0IGVxICIubGliIiApIHsKKworICAgICAgICBteSAlZGVwczsKKyAgICAgICAgd2hpbGUgKCAkaSA8IEBidWxrICkgeworICAgICAgICAgICAgbXkgJGxpbmUgPSAkYnVsa1sgJGkgXTsKKyAgICAgICAgICAgIGlmICggMCApIHsKKyAgICAgICAgICAgIH0gZWxzaWYgKCAkbGluZSA9fiBte15ccypbLS9dZGVmYXVsdGxpYlw6KC4qKVxzKiR9aSApIHsKKyAgICAgICAgICAgICAgICBteSAkZGVwID0gJDE7CisgICAgICAgICAgICAgICAgIyBOb3JtYWxpemUgbGlicmFyeSBuYW1lOgorICAgICAgICAgICAgICAgICRkZXAgPSBsYyggJDEgKTsgICAgICAgICAgICAgICMgQ29udmVydCB0byBsb3dlciBjYXNlLgorICAgICAgICAgICAgICAgICRkZXAgPX4gc3tcQSIoLiopIlx6fXskMX07ICAgICMgRHJvcCBzdXJyb3VuZGluZyBxdW90ZXMgKGlmIGFueSkuCisgICAgICAgICAgICAgICAgJGRlcCA9fiBze1wubGliXHp9e307ICAgICAgICAgIyBEcm9wIC5saWIgc3VmZml4IChpZiBhbnkpLgorICAgICAgICAgICAgICAgICRkZXBzeyAkZGVwIH0gPSAxOworICAgICAgICAgICAgfSBlbHNpZiAoICRsaW5lID1+IG17XlxzKkxpbmtlciBEaXJlY3RpdmVzXHMqJH0gKSB7CisgICAgICAgICAgICB9IGVsc2lmICggJGxpbmUgPX4gbXteXHMqLStccyokfSApIHsKKyAgICAgICAgICAgIH0gZWxzaWYgKCAkbGluZSA9fiBte15ccyovYWx0ZXJuYXRlbmFtZVw6LiokfSApIHsKKyAgICAgICAgICAgIH0gZWxzaWYgKCAkbGluZSA9fiBte15ccyokfSApIHsKKyAgICAgICAgICAgIH0gZWxzaWYgKCAkbGluZSA9fiBte15ccyovRkFJTElGTUlTTUFUQ0hcOi4qJH0gKSB7CisgICAgICAgICAgICAgICAgIyBUaGlzIGRpcmVjdGl2ZSBpcyBwcm9kdWNlZCBvbmx5IGJ5IF9NU0NfVkVSPTE2MDAKKyAgICAgICAgICAgIH0gZWxzaWYgKCAkbGluZSA9fiBte15ccypTdW1tYXJ5XHMqJH0gKSB7CisgICAgICAgICAgICAgICAgbGFzdDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcGFyc2VfZXJyb3IoICR0b29sLCBAYnVsaywgJGkgKTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgICsrICRpOworICAgICAgICB9ICMgd2hpbGUKKyAgICAgICAgQGRlcHMgPSBrZXlzKCAlZGVwcyApOworCisgICAgfSBlbHNlIHsKKworICAgICAgICAoICRpIDwgQGJ1bGsgYW5kICRidWxrWyAkaSBdID1+IG17XHMqSW1hZ2UgaGFzIHRoZSBmb2xsb3dpbmcgZGVwZW5kZW5jaWVzXDokfSApCisgICAgICAgICAgICBvciBwYXJzZV9lcnJvciggJHRvb2wsIEBidWxrLCAkaSApOworICAgICAgICArKyAkaTsKKyAgICAgICAgd2hpbGUgKCAkaSA8IEBidWxrICkgeworICAgICAgICAgICAgbXkgJGxpbmUgPSAkYnVsa1sgJGkgXTsKKyAgICAgICAgICAgIGlmICggMCApIHsKKyAgICAgICAgICAgIH0gZWxzaWYgKCAkbGluZSA9fiBte15ccyokfSApIHsKKyAgICAgICAgICAgICAgICAjIElnbm9yZSBlbXB0eSBsaW5lcy4KKyAgICAgICAgICAgIH0gZWxzaWYgKCAkbGluZSA9fiBte15ccyooLipcLmRsbCkkfWkgKSB7CisgICAgICAgICAgICAgICAgbXkgJGRlcCA9IGxjKCAkMSApOworICAgICAgICAgICAgICAgIHB1c2goIEBkZXBzLCAkZGVwICk7CisgICAgICAgICAgICB9IGVsc2lmICggJGxpbmUgPX4gbXteXHMqU3VtbWFyeSR9ICkgeworICAgICAgICAgICAgICAgIGxhc3Q7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHBhcnNlX2Vycm9yKCAkdG9vbCwgQGJ1bGssICRpICk7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICArKyAkaTsKKyAgICAgICAgfTsgIyB3aGlsZQorCisgICAgfTsgIyBpZgorCisgICAgcmV0dXJuIEBkZXBzOworCit9OyAjIHN1YiBnZXRfZGVwc19saW5rCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBNYWluLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIFBhcnNlIGNvbW1hbmQgbGluZS4KK215ICRleHBlY3RlZDsKK215ICRiYXJlOworR2V0b3B0OjpMb25nOjpDb25maWd1cmUoICJwZXJtdXRlIiApOworZ2V0X29wdGlvbnMoCisgICAgUGxhdGZvcm06OnRhcmdldF9vcHRpb25zKCksCisgICAgImJhcmUiICAgICAgID0+IFwkYmFyZSwKKyAgICAiZXhwZWN0ZWQ9cyIgPT4gXCRleHBlY3RlZCwKKyk7CitteSBAZXhwZWN0ZWQ7CitpZiAoIGRlZmluZWQoICRleHBlY3RlZCApICkgeworICAgIGlmICggJGV4cGVjdGVkIG5lICJub25lIiApIHsKKyAgICAgICAgQGV4cGVjdGVkID0gc29ydCggc3BsaXQoICIsIiwgJGV4cGVjdGVkICkgKTsKKyAgICAgICAgaWYgKCAkdGFyZ2V0X29zIGVxICJ3aW4iICkgeworICAgICAgICAgICAgQGV4cGVjdGVkID0gbWFwKCBsYyggJF8gKSwgQGV4cGVjdGVkICk7CisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGlmCit9OyAjIGlmCitpZiAoIEBBUkdWIDwgMSApIHsKKyAgICBjbWRsaW5lX2Vycm9yKCAiU3BlY2lmeSBhIGxpYnJhcnkgbmFtZSB0byBjaGVjayBmb3IgZGVwZW5kZW5jaWVzIiApOworfTsgIyBpZgoraWYgKCBAQVJHViA+IDEgKSB7CisgICAgY21kbGluZV9lcnJvciggIlRvbyBtYW55IGFyZ3VtZW50cyIgKTsKK307ICMgaWYKK215ICRsaWIgPSBzaGlmdCggQEFSR1YgKTsKK2lmICggbm90IC1lICRsaWIgKXsKKyAgICBydW50aW1lX2Vycm9yKCAiU3BlY2lmaWVkIGZpbGUgZG9lcyBub3QgZXhpc3Q6IFwiJGxpYlwiIiApOworfTsgIyBpZgorCisjIFNlbGVjdCBhcHByb3ByaWF0ZSBnZXRfZGVwcyBpbXBsZW1lbnRhdGlvbi4KK2lmICggMCApIHsKK30gZWxzaWYgKCAkdGFyZ2V0X29zIGVxICJsaW4iIG9yICR0YXJnZXRfb3MgZXEgImxyYiIgKSB7CisgICAgKmdldF9kZXBzID0gXCpnZXRfZGVwc19yZWFkZWxmOworfSBlbHNpZiAoICR0YXJnZXRfb3MgZXEgIm1hYyIgKSB7CisgICAgKmdldF9kZXBzID0gXCpnZXRfZGVwc19vdG9vbDsKK30gZWxzaWYgKCAkdGFyZ2V0X29zIGVxICJ3aW4iICkgeworICAgICpnZXRfZGVwcyA9IFwqZ2V0X2RlcHNfbGluazsKK30gZWxzZSB7CisgICAgcnVudGltZV9lcnJvciggIk9TIFwiJHRhcmdldF9vc1wiIG5vdCBzdXBwb3J0ZWQiICk7Cit9OyAjIGlmCisKKyMgRG8gdGhlIHdvcmsuCitteSBAZGVwcyA9IHNvcnQoIGdldF9kZXBzKCAkbGliICkgKTsKK2lmICggJGJhcmUgKSB7CisgICAgcHJpbnQoIG1hcCggIiRfXG4iLCBAZGVwcyApICk7Cit9IGVsc2UgeworICAgIGluZm8oICJEZXBlbmRlbmNpZXM6IiwgQGRlcHMgPyBtYXAoICIgICAgJF8iLCBAZGVwcyApIDogIihub25lKSIgKTsKK307ICMgaWYKK2lmICggZGVmaW5lZCggJGV4cGVjdGVkICkgKSB7CisgICAgbXkgJWRlcHMgPSBtYXAoICggJF8gPT4gMSApLCBAZGVwcyApOworICAgIGZvcmVhY2ggbXkgJGRlcCAoIEBleHBlY3RlZCApIHsKKyAgICAgICAgZGVsZXRlKCAkZGVwc3sgJGRlcCB9ICk7CisgICAgfTsgIyBmb3JlYWNoCisgICAgbXkgQHVuZXhwZWN0ZWQgPSBzb3J0KCBrZXlzKCAlZGVwcyApICk7CisgICAgaWYgKCBAdW5leHBlY3RlZCApIHsKKyAgICAgICAgcnVudGltZV9lcnJvciggIlVuZXhwZWN0ZWQgZGVwZW5kZW5jaWVzOiIsIG1hcCggIiAgICAkXyIsIEB1bmV4cGVjdGVkICkgKTsKKyAgICB9OyAjIGlmCit9OyAjIGlmCisKK2V4aXQoIDAgKTsKKworX19FTkRfXworCis9cG9kCisKKz1oZWFkMSBOQU1FCisKK0I8Y2hlY2stZGVwZW5kcy5wbD4gLS0gQ2hlY2sgZGVwZW5kZW5jaWVzIGZvciBhIHNwZWNpZmllZCBsaWJyYXJ5LgorCis9aGVhZDEgU1lOT1BTSVMKKworQjxjaGVjay1kZXBlbmRzLnBsPiBJPE9QVElPTlM+Li4uIEk8bGlicmFyeT4KKworPWhlYWQxIERFU0NSSVBUSU9OCisKK0M8Y2hlY2stZGVwZW5kcy5wbD4gZmluZHMgZGlyZWN0IGRlcGVuZGVuY2llcyBmb3IgYSBzcGVjaWZpZWQgbGlicmFyeS4gTGlzdCBvZiBhY3R1YWwgZGVwZW5kZW5jaWVzCitpcyBzb3J0ZWQgYWxwaGFiZXRpY2FsbHkgYW5kIHByaW50ZWQuIElmIGxpc3Qgb2YgZXhwZWN0ZWQgZGVwZW5kZW5jaWVzIGlzIHNwZWNpZmllZCwgdGhlIHNjcmlwdHMKK2NoZWNrcyB0aGUgbGlicmFyeSBoYXMgb25seSBhbGxvd2VkIGRlcGVuZGVuY2llcy4gSW4gY2FzZSBvZiBub3QgZXhwZWN0ZWQgZGVwbmRlbmNpZXMgdGhlIHNjcmlwdAoraXNzdWVzIGVycm9yIG1lc3NhZ2UgYW5kIGV4aXRzIHdpdGggbm9uLXplcm8gY29kZS4KKworTGludXgqIE9TIGFuZCBPUyBYKjogVGhlIHNjcmlwdCBmaW5kcyBkZXBlbmRlbmNpZXMgb25seSBmb3IgZHltYW1pYyBsaWJyYXJpZXMuIFdpbmRvd3MqIE9TOiBUaGUgc2NyaXB0CitmaW5kcyBkZXBlbmRlbmNpZXMgZm9yIGVpdGhlciBzdGF0aWMgb3IgZHltYW1pYyBsaWJyYXJpZXMuCisKK1RoZSBzY3JpcHQgdXNlcyBleHRlcm5hbCB0b29scy4gT24gTGludXgqIE9TLCBpdCBydW5zIEY8cmVhZGVsZj4sIG9uIE9TIFgqIC0tIEY8b3Rvb2w+IChvciBGPG90b29sNjQ+KSwKK29uIFdpbmRvd3MqIE9TIC0tIEY8bGluaz4uCisKK09uIFdpbmRvd3MqIE9TIGRlcGVuZGVuY2llcyBhcmUgcHJpbnRlZCBpbiBsb3dlciBjYXNlLCBjYXNlIG9mIGV4cGVjdGVkIGRlcGVuZGVuY2llcyBpZ25vcmVkLgorCis9aGVhZDEgT1BUSU9OUworCis9b3ZlcgorCis9aXRlbSBCPC0tYmFyZT4KKworRG8gbm90IHVzZSBmYW5jeSBmb3JtYXR0aW5nOyBwcm9kdWNlIHBsYWluLCBiYXJlIG91dHB1dDoganVzdCBhIGxpc3Qgb2YgbGlicmFyaWVzLAorYSBsaWJyYXJ5IHBlciBsaW5lLgorCis9aXRlbSBCPC0tZXhwZWN0ZWQ9Pkk8bGlzdD4KKworSTxsaXN0PiBpcyBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBleHBlY3RlZCBkZXBlbmRlbmNpZXMgKG9yIEM8bm9uZT4pLgorSWYgQzwtLWV4cGVjdGVkPiBvcHRpb24gc3BlY2lmaWVkLCBDPGNoZWNrLWRlcGVuZHMucGw+IGNoZWNrcyB0aGUgc3BlY2lmaWVkIGxpYnJhcnkKK2hhcyBvbmx5IGV4cGVjdGVkIGRlcGVuZGVuY2llcy4KKworPWl0ZW0gQjwtLW9zPT5JPHN0cj4KKworU3BlY2lmeSB0YXJnZXQgT1MgKHRvb2wgdG8gdXNlKSBtYW51YWxseS4KK1VzZWZ1bCBmb3IgY3Jvc3MtYnVpbGQsIHdoZW4gaG9zdCBPUyBpcyBub3QgdGhlIHNhbWUgYXMgdGFyZ2V0IE9TLgorSTxzdHI+IHNob3VsZCBiZSBlaXRoZXIgQzxsaW4+LCBDPG1hYz4sIG9yIEM8d2luPi4KKworPWJhY2sKKworPWhlYWQyIFN0YW5kYXJkIE9wdGlvbnMKKworPW92ZXIKKworPWl0ZW0gQjwtLWhlbHA+CisKK1ByaW50IHNob3J0IGhlbHAgbWVzc2FnZSBhbmQgZXhpdC4KKworPWl0ZW0gQjwtLWRvYz4KKworPWl0ZW0gQjwtLW1hbnVhbD4KKworUHJpbnQgZnVsbCBkb2N1bWVudGF0aW9uIGFuZCBleGl0LgorCis9aXRlbSBCPC0tcXVpZXQ+CisKK0RvIG5vdCBvdXRwdXQgaW5mb3JtYXRpb25hbCBtZXNzYWdlcy4KKworPWl0ZW0gQjwtLXZlcnNpb24+CisKK1ByaW50IHZlcnNpb24gYW5kIGV4aXQuCisKKz1iYWNrCisKKz1oZWFkMSBBUkdVTUVOVFMKKworPW92ZXIKKworPWl0ZW0gSTxsaWJyYXJ5PgorCitBIG5hbWUgb2YgbGlicmFyeSB0byBmaW5kIG9yIGNoZWNrIGRlcGVuZGVuY2llcy4KKworPWJhY2sKKworPWhlYWQxIEVYQU1QTEVTCisKK0p1c3QgcHJpbnQgbGlicmFyeSBkZXBlbmRlbmNpZXMgKFdpbmRvd3MqIE9TKToKKworICAgID4gY2hlY2stZGVwZW5kcy5wbCBleHBvcnRzL3dpbl8zMi9saWIvbGliaW9tcDUuZGxsCisgICAgY2hlY2stZGVwZW5kcy5wbDogKGkpIERlcGVuZGVuY2llczoKKyAgICBjaGVjay1kZXBlbmRzLnBsOiAoaSkgICAgIGtlcm5lbDMyLmRsbAorCitQcmludCBsaWJyYXJ5IGRlcGVuZGVuY2llcywgdXNlIGJhcmUgb3V0cHV0IChMaW51eCogT1MpOgorCisgICAgJCBjaGVjay1kZXBlbmRzLnBsIC0tYmFyZSBleHBvcnRzL2xpbl8zMmUvbGliL2xpYm9tcF9kYi5zbworICAgIGxpYmMuc28uNgorICAgIGxpYmRsLnNvLjIKKyAgICBsaWJwdGhyZWFkLnNvLjAKKworQ2hlY2sgdGhlIGxpYnJhcnkgZG9lcyBub3QgaGF2ZSBhbnkgZGVwZW5kZW5jaWVzIChPUyBYKik6CisKKyAgICAkIGNoZWNrLWRlcGVuZHMucGwgLS1leHBlY3RlZD1ub25lIGV4cG9ydHMvbWFjXzMyL2xpYi9saWJpb21wNS5keWxpYgorICAgIGNoZWNrLWRlcGVuZHMucGw6IChpKSBEZXBlbmRlbmNpZXM6CisgICAgY2hlY2stZGVwZW5kcy5wbDogKGkpICAgICAvdXNyL2xpYi9saWJTeXN0ZW0uQi5keWxpYgorICAgIGNoZWNrLWRlcGVuZHMucGw6ICh4KSBVbmV4cGVjdGVkIGRlcGVuZGVuY2llczoKKyAgICBjaGVjay1kZXBlbmRzLnBsOiAoeCkgICAgIC91c3IvbGliL2xpYlN5c3RlbS5CLmR5bGliCisgICAgJCBlY2hvICQ/CisgICAgMgorCis9Y3V0CisKKyMgZW5kIG9mIGZpbGUgIworCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rvb2xzL2NoZWNrLWV4ZWNzdGFjay5wbCBiL2ZpbmFsL3J1bnRpbWUvdG9vbHMvY2hlY2stZXhlY3N0YWNrLnBsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmYxNDE3YzcKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rvb2xzL2NoZWNrLWV4ZWNzdGFjay5wbApAQCAtMCwwICsxLDEzOCBAQAorIyEvdXNyL2Jpbi9wZXJsCisKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKwordXNlIEZpbmRCaW47Cit1c2UgbGliICIkRmluZEJpbjo6QmluL2xpYiI7CisKK3VzZSB0b29sczsKKworb3VyICRWRVJTSU9OID0gIjAuMDAyIjsKKworc3ViIGV4ZWNzdGFjaygkKSB7CisgICAgbXkgKCAkZmlsZSApID0gQF87CisgICAgbXkgQG91dHB1dDsKKyAgICBteSBAc3RhY2s7CisgICAgZXhlY3V0ZSggWyAicmVhZGVsZiIsICItbCIsICItVyIsICRmaWxlIF0sIC1zdGRvdXQgPT4gXEBvdXRwdXQgKTsKKyAgICBAc3RhY2sgPSBncmVwKCAkXyA9fiBte1xBXHMqKD86R05VXyk/U1RBQ0tccyt9LCBAb3V0cHV0ICk7CisgICAgaWYgKCBub3QgQHN0YWNrICkgeworICAgICAgICAjIEludGVycHJldCBtaXNzZWQgIlNUQUNLIiBsaW5lIGFzIGVycm9yLgorICAgICAgICBydW50aW1lX2Vycm9yKCAiJGZpbGU6IE5vIHN0YWNrIHNlZ21lbnQgZm91bmQ7IGxvb2tzIGxpa2Ugc3RhY2sgd291bGQgYmUgZXhlY3V0YWJsZS4iICk7CisgICAgfTsgIyBpZgorICAgIGlmICggQHN0YWNrID4gMSApIHsKKyAgICAgICAgcnVudGltZV9lcnJvciggIiRmaWxlOiBNb3JlIHRoYW4gb25lIHN0YWNrIHNlZ21lbnQgZm91bmQuIiwgInJlYWRlbGYgb3V0cHV0OiIsIEBvdXRwdXQsICIoZW9mKSIgKTsKKyAgICB9OyAjIGlmCisgICAgIyBUeXBpY2FsIHN0YWNrIGxpbmVzIGFyZToKKyAgICAjIExpbnV4KiBPUyBJQS0zMiBhcmNoaXRlY3R1cmU6CisgICAgIyAgICBHTlVfU1RBQ0sgICAgICAweDAwMDAwMCAweDAwMDAwMDAwIDB4MDAwMDAwMDAgMHgwMDAwMCAweDAwMDAwIFJXRSAweDQKKyAgICAjIExpbnV4KiBPUyBJbnRlbChSKSA2NDoKKyAgICAjICAgIEdOVV9TVEFDSyAgICAgIDB4MDAwMDAwIDB4MDAwMDAwMDAwMDAwMDAwMCAweDAwMDAwMDAwMDAwMDAwMDAgMHgwMDAwMDAgMHgwMDAwMDAgUldFIDB4OAorICAgIGlmICggJHN0YWNrWyAwIF0gIX4gbXtcQVxzKig/OkdOVV8pP1NUQUNLKD86XHMrMHhbMC05YS1mXSspezV9XHMrKFtSIF1bVyBdW0UgXSlccysweFswLTlhLWZdK1xzKlx6fSApIHsKKyAgICAgICAgcnVudGltZV9lcnJvciggIiRmaWxlOiBDYW5ub3QgcGFyc2Ugc3RhY2sgc2VnbWVudCBsaW5lOiIsICI+Pj4gJHN0YWNrWyAwIF0iICk7CisgICAgfTsgIyBpZgorICAgIG15ICRhdHRycyA9ICQxOworICAgIGlmICggJGF0dHJzID1+IG17RX0gKSB7CisgICAgICAgIHJ1bnRpbWVfZXJyb3IoICIkZmlsZTogU3RhY2sgaXMgZXhlY3V0YWJsZSIgKTsKKyAgICB9OyAjIGlmCit9OyAjIHN1YiBleGVjc3RhY2sKKworZ2V0X29wdGlvbnMoCispOworCitmb3JlYWNoIG15ICRmaWxlICggQEFSR1YgKSB7CisgICAgZXhlY3N0YWNrKCAkZmlsZSApOworfTsgIyBmb3JlYWNoICRmaWxlCisKK2V4aXQoIDAgKTsKKworX19FTkRfXworCis9cG9kCisKKz1oZWFkMSBOQU1FCisKK0I8Y2hlY2stZXhlY3N0YWNrLnBsPiAtLSBDaGVjayB3aGV0aGVyIHN0YWNrIGlzIGV4ZWN1dGFibGUsIGlzc3VlIGFuIGVycm9yIGlmIHNvLgorCis9aGVhZDEgU1lOT1BTSVMKKworQjxjaGVjay1leGVjc3RhY2sucGw+IEk8b3B0aWlvbj4uLi4gSTxmaWxlPi4uLgorCis9aGVhZDEgREVTQ1JJUFRJT04KKworVGhlIHNjcmlwdCBjaGVja3Mgd2hldGhlciBzdGFjayBvZiBzcGVjaWZpZWQgZXhlY3V0YWJsZSBmaWxlLCBhbmQgaXNzdWVzIGVycm9yIGlmIHN0YWNrIGlzCitleGVjdXRhYmxlLiBJZiBzdGFjayBpcyBub3QgZXhlY3V0YWJsZSwgdGhlIHNjcmlwdCBleGl0cyBzaWxlbnRseSB3aXRoIHplcm8gZXhpdCBjb2RlLgorCitUaGUgc2NyaXB0IHJ1bnMgQzxyZWFkZWxmPiB1dGlsaXR5IHRvIGdldCBpbmZvcm1hdGlvbiBhYm91dCBzcGVjaWZpZWQgZXhlY3V0YWJsZSBmaWxlLiBTbywgdGhlCitzY3JpcHQgZmFpbHMgaWYgQzxyZWFkZWxmPiBpcyBub3QgYXZhaWxhYmxlLiBFZmZlY3RpdmVseSBpdCBtZWFucyB0aGUgc2NyaXB0IHdvcmtzIG9ubHkgb24gTGludXgqIE9TCisoYW5kLCBwcm9iYWJseSwgSW50ZWwoUikgTWFueSBJbnRlZ3JhdGVkIENvcmUgQXJjaGl0ZWN0dXJlKS4KKworPWhlYWQxIE9QVElPTlMKKworPW92ZXIKKworPWl0ZW0gU3RhbmRhcmQgT3B0aW9ucworCis9b3ZlcgorCis9aXRlbSBCPC0tZG9jPgorCis9aXRlbSBCPC0tbWFudWFsPgorCitQcmludCBmdWxsIGhlbHAgbWVzc2FnZSBhbmQgZXhpdC4KKworPWl0ZW0gQjwtLWhlbHA+CisKK1ByaW50IHNob3J0IGhlbHAgbWVzc2FnZSBhbmQgZXhpdC4KKworPWl0ZW0gQjwtLXVzYWdlPgorCitQcmludCB2ZXJ5IHNob3J0IHVzYWdlIG1lc3NhZ2UgYW5kIGV4aXQuCisKKz1pdGVtIEI8LS12ZXJib3NlPgorCitEbyBwcmludCBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzLgorCis9aXRlbSBCPC0tdmVyc2lvbj4KKworUHJpbnQgcHJvZ3JhbSB2ZXJzaW9uIGFuZCBleGl0LgorCis9aXRlbSBCPC0tcXVpZXQ+CisKK1dvcmsgcXVpZXQsIGRvIG5vdCBwcmludCBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzLgorCis9YmFjaworCis9YmFjaworCis9aGVhZDEgQVJHVU1FTlRTCisKKz1vdmVyCisKKz1pdGVtIEk8ZmlsZT4KKworQSBuYW1lIG9mIGV4ZWN1dGFibGUgb3Igc2hhcmVkIG9iamVjdCB0byBjaGVjay4gTXVsdGlwbGUgZmlsZXMgbWF5IGJlIHNwZWNpZmllZC4KKworPWJhY2sKKworPWhlYWQxIEVYQU1QTEVTCisKK0NoZWNrIGxpYmlvbXA1LnNvIGxpYnJhcnk6CisKKyAgICAkIGNoZWNrLWV4ZWNzdGFjay5wbCBsaWJpb21wNS5zbworCis9Y3V0CisKKyMgZW5kIG9mIGZpbGUgIworCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rvb2xzL2NoZWNrLWluc3RydWN0aW9uLXNldC5wbCBiL2ZpbmFsL3J1bnRpbWUvdG9vbHMvY2hlY2staW5zdHJ1Y3Rpb24tc2V0LnBsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjFmYTc4N2UKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rvb2xzL2NoZWNrLWluc3RydWN0aW9uLXNldC5wbApAQCAtMCwwICsxLDMzNiBAQAorIyEvdXNyL2Jpbi9wZXJsCisKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKwordXNlIEZpbmRCaW47Cit1c2UgbGliICIkRmluZEJpbjo6QmluL2xpYiI7CisKK3VzZSBQbGF0Zm9ybSAiOnZhcnMiOwordXNlIHRvb2xzOworCitvdXIgJFZFUlNJT04gPSAiMC4wMDQiOworCitteSAkaGV4ID0gcXJ7WzAtOWEtZl19aTsgICAgIyBoZXggZGlnaXQuCisKKyMgbHJiXzMyZS1zcGVjaWZpYyBkZXRhaWxzLgorCitteSAkbWljX2FyY2g7ICMgZWl0aGVyIGtuZiBvciBrbmMKK215ICRtaWNfb3M7ICAgIyBlaXRoZXIgYnNkIG9yIGxpbgorc3ViIGJhZF9scmJfZm10KCQpIHsKKyAgICAjIEJlZm9yZSB3ZSBhbGxvd2VkIGJvdGggZWxmNjQteDg2LTY0LWZyZWVic2QgYW5kIGVsZi1sMW9tLWZyZWVic2QuCisgICAgIyBOb3cgdGhlIGZpcnN0IG9uZSBpcyBvYnNvbGV0ZSwgb25seSBlbGY2NC1sMW9tLWZyZWVic2QgaXMgYWxsb3dlZC4KKyAgICBteSAoICRmbXQgKSA9IEBfOworICAgIGlmICggMCApIHsKKyAgICB9IGVsc2lmICggIiRtaWNfb3MiIGVxICJic2QiICkgeworCWlmICggIiRtaWNfYXJjaCIgZXEgImtuZiIgKSB7CisJICAgIHJldHVybiAkZm10ICF+IG17XEFlbGY2NC1sMW9tKD86LWZyZWVic2QpP1x6fTsKKwl9IGVsc2UgeworCSAgICByZXR1cm4gJGZtdCAhfiBte1xBZWxmNjQteDg2LTY0KD86LWZyZWVic2QpP1x6fTsKKwl9OworICAgIH0gZWxzaWYgKCAiJG1pY19vcyIgZXEgImxpbiIgKSB7CisJaWYgKCAwICkgeworCX0gZWxzaWYgKCAiJG1pY19hcmNoIiBlcSAia25mIiApIHsKKwkgICAgcmV0dXJuICRmbXQgIX4gbXtcQWVsZjY0LWwxb20/XHp9OworCX0gZWxzaWYgKCAiJG1pY19hcmNoIiBlcSAia25jIiApIHsKKwkgICAgcmV0dXJuICRmbXQgIX4gbXtcQWVsZjY0LWsxb20/XHp9OworCX0gZWxzZSB7CisJICAgIHJldHVybiAxOworCX07CisgICAgfSBlbHNlIHsKKwlyZXR1cm4gMTsKKyAgICB9OworfTsgIyBzdWIgYmFkX2xyYl9mbXQKKworIyBVbmRlc2lyZWQgaW5zdHJ1Y3Rpb25zIGZvciBscmI6IGFsbCB4ODcgYW5kIHNvbWUgb3RoZXIuCisjIEFDOiBTaW5jZSBjb21waWxlciAyMDEwLTA2LTMwIHg4NyBpbnN0cnVjdGlvbnMgYXJlIHN1cHBvcnRlZCwgcmVtb3ZlZCB0aGUgY2hlY2sgb2YgeDg3LgorbXkgJGxyYl9iYWRfcmU7CitzdWIgYmFkX2xyYl9pbnN0cigkJCkgeworICAgIG15ICggJGluc3RyLCAkYXJncyApID0gQF87CisjICAgIGlmICggIiRtaWNfb3MiIGVxICJsaW4iIGFuZCAiJG1pY19hcmNoIiBlcSAia25mIiApIHsKKyAgICBpZiAoICIkbWljX29zIiBlcSAibGluIiBvciAiJG1pY19hcmNoIiBlcSAia25jIiApIHsKKwkjIHdvcmthcm91bmQgb2YgYmFkIGNvZGUgZ2VuZXJhdGlvbiBvbiBLTkYgTGludXgqIE9TOgorCXJldHVybiAoIGRlZmluZWQoICRpbnN0ciApIGFuZCAkaW5zdHIgPX4gJGxyYl9iYWRfcmUgKTsKKyAgICB9IGVsc2UgeworCXJldHVybiAoIGRlZmluZWQoICRpbnN0ciApIGFuZCAkaW5zdHIgPX4gJGxyYl9iYWRfcmUgb3IgZGVmaW5lZCggJGFyZ3MgKSBhbmQgJGFyZ3MgPX4gbXt4bW19aSApOworICAgIH0KK307ICMgc3ViIGJhZF9scmJfaW5zdHIKKworIyBsaW5fMzItc3BlY2lmaWMgZGV0YWlscy4KKworc3ViIGJhZF9pYTMyX2ZtdCgkKSB7CisgICAgbXkgKCAkZm10ICkgPSBAXzsKKyAgICByZXR1cm4gJGZtdCAhfiBte1xBZWxmMzItaTM4Nlx6fTsKK307ICMgc3ViIGJhZF9pYTMyX2ZtdAorCitteSBAc3NlMiA9CisgICAgcXd7CisgICAgICAgIG1vdmFwZCBtb3Z1cGQgbW92aHBkIG1vdmxwZCBtb3Ztc2twZCBtb3ZzZAorICAgICAgICBhZGRwZCBhZGRzZCBzdWJwZCBzdWJzZCBtdWxwZCBtdWxzZCBkaXZwZCBkaXZzZCBzcXJ0cGQgc3FydHNkIG1heHBkIG1heHNkIG1pbnBkIG1pbnNkCisgICAgICAgIGFuZHBkIGFuZG5wZCBvcnBkIHhvcnBkCisgICAgICAgIGNtcHBkIGNtcHNkIGNvbWlzZCB1Y29taXNkCisgICAgICAgIHNodWZwZCB1bnBja2hwZCB1bnBja2xwZAorICAgICAgICBjdnRwZDJwaSBjdnR0cGQycGkgY3Z0cGkycGQgY3Z0cGQyZHEgY3Z0dHBkMmRxIGN2dGRxMnBkIGN2dHBzMnBkIGN2dHBkMnBzIGN2dHNzMnNkIGN2dHNkMnNzCisgICAgICAgIGN2dHNkMnNpIGN2dHRzZDJzaSBjdnRzaTJzZCBjdnRkcTJwcyBjdnRwczJkcSBjdnR0cHMyZHEgbW92ZHFhIG1vdmRxdSBtb3ZxMmRxIG1vdmRxMnEKKyAgICAgICAgcG11bHVkcSBwYWRkcSBwc3VicSBwc2h1Zmx3IHBzaHVmaHcgcHNodWZkIHBzbGxkcSBwc3JsZHEgcHVucGNraHFkcSBwdW5wY2tscWRxIGNsZmx1c2gKKyAgICAgICAgbGZlbmNlIG1mZW5jZSBtYXNrbW92ZHF1IG1vdm50cGQgbW92bnRkcSBtb3ZudGkKKyAgICB9OworbXkgQHNzZTMgPQorICAgIHF3eworICAgICAgICBmaXN0dHAgbGRkcXUgYWRkc3VicHMgYWRkc3VicGQgaGFkZHBzIGhzdWJwcyBoYWRkcGQgaHN1YnBkIG1vdnNoZHVwIG1vdnNsZHVwIG1vdmRkdXAgbW9uaXRvcgorICAgICAgICBtd2FpdAorICAgIH07CitteSBAc3NzZTMgPQorICAgIHF3eworICAgICAgICBwaGFkZHcgcGhhZGRzdyBwaGFkZGQgcGhzdWJ3IHBoc3Vic3cgcGhzdWJkIHBhYnNiIHBhYnN3IHBhYnNkIHBtYWRkdWJzdyBwbXVsaHJzdyBwc2h1ZmIKKyAgICAgICAgcHNpZ25iIHBzaWdudyBwc2lnbmQgcGFsaWducgorICAgIH07CitteSBAc3NlNCA9CisgICAgKAorICAgICAgICAjIFNTRTQuMQorICAgICAgICBxd3sKKyAgICAgICAgICAgIHBtdWxsZCBwbXVsZHEgZHBwZCBkcHBzIG1vdm50ZHFhIGJsZW5kcGQgYmxlbmRwcyBibGVuZHZwZCBibGVuZHZwcyBwYmxlbmR2YiBwYmxlbmR3IHBtaW51dworICAgICAgICAgICAgcG1pbnVkIHBtaW5zYiBwbWluc2QgcG1heHV3IHBtYXh1ZCBwbWF4c2IgcG1heHNkIHJvdW5kcHMgcm91bmRwZCByb3VuZHNzIHJvdW5kc2QgZXh0cmFjdHBzCisgICAgICAgICAgICBpbnNlcnRwcyBwaW5zcmIgcGluc3JkIHBpbnNycSBwZXh0cmIgcGV4dHJ3IHBleHRyZCBwZXh0cnEgcG1vdnN4YncgcG1vdnp4YncgcG1vdnN4YmQKKyAgICAgICAgICAgIHBtb3Z6eGJkIHBtb3ZzeHdkIHBtb3Z6eHdkIHBtb3ZzeGJxIHBtb3Z6eGJxIHBtb3ZzeHdxIHBtb3Z6eHdxIHBtb3ZzeGRxIHBtb3Z6eGRxIG1wc2FkYncKKyAgICAgICAgICAgIHBobWlucG9zdXcgcHRlc3QgcGNtcGVxcSBwYWNrdXNkdworICAgICAgICB9LAorICAgICAgICAjIFNTRTQuMgorICAgICAgICBxd3sKKyAgICAgICAgICAgIHBjbXBlc3RyaSBwY21wZXN0cm0gcGNtcGlzdHJpIHBjbXBpc3RybSBwY21wZ3RxIGNyYzMyIHBvcGNudAorICAgICAgICB9CisgICAgKTsKKworIyBVbmRlc2lyZWQgaW5zdHJ1Y3Rpb25zIGZvciBJQS0zMiBhcmNoaXRlY3R1cmU6IFBlbnRpdW0gNCAoU1NFMikgYW5kIG5ld2VyLgorIyBUT0RPOiBJdCB3b3VsZCBiZSBtdWNoIG1vcmUgcmVsaWFibGUgdG8gbGlzdCAqYWxsb3dlZCogaW5zdHJ1Y3Rpb25zIHJhdGhlciB0aGFuIGxpc3QgdW5kZXNpcmVkCisjIGluc3RydWN0aW9ucy4gSW4gc3VjaCBhIGNhc2UgdGhlIGxpc3Qgd2lsbCBiZSBzdGFibGUgYW5kIG5vdCByZXF1aXJlIHVwZGF0ZSB3aGVuIFNTRTUgaXMgcmVsZWFzZWQuCitteSBAaWEzMl9iYWRfbGlzdCA9ICggQHNzZTIsIEBzc2UzLCBAc3NzZTMsIEBzc2U0ICk7CisKK215ICRpYTMyX2JhZF9yZSA9IHFye0B7WyAiXig/OiIgLiBqb2luKCAifCIsIEBpYTMyX2JhZF9saXN0ICkgLiAiKSIgXX19aTsKKworc3ViIGJhZF9pYTMyX2luc3RyKCQkKSB7CisgICAgbXkgKCAkaW5zdHIsICRhcmdzICkgPSBAXzsKKyAgICByZXR1cm4gKCBkZWZpbmVkKCAkaW5zdHIgKSBhbmQgJGluc3RyID1+ICRpYTMyX2JhZF9yZSApOworfTsgIyBzdWIgYmFkX2lhMzJfaW5zdHIKKworc3ViIGNoZWNrX2ZpbGUoJDskJCkgeworCisgICAgbXkgKCAkZmlsZSwgJHNob3dfaW5zdHJ1Y3Rpb25zLCAkbWF4X2luc3RydWN0aW9ucyApID0gQF87CisgICAgbXkgQGJ1bGs7CisKKyAgICBpZiAoIG5vdCBkZWZpbmVkKCAkbWF4X2luc3RydWN0aW9ucyApICkgeworICAgICAgICAkbWF4X2luc3RydWN0aW9ucyA9IDEwMDsKKyAgICB9OyAjIGlmCisKKyAgICBpZiAoICIkbWljX29zIiBlcSAiYnNkIiApIHsKKyAgICAgICAgZXhlY3V0ZSggWyAieDg2XzY0LWZyZWVic2Qtb2JqZHVtcCIsICItZCIsICRmaWxlIF0sIC1zdGRvdXQgPT4gXEBidWxrICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZXhlY3V0ZSggWyAib2JqZHVtcCIsICItZCIsICRmaWxlIF0sIC1zdGRvdXQgPT4gXEBidWxrICk7CisgICAgfQorCisgICAgbXkgJG4gPSAwOworICAgIG15ICRlcnJvcnMgPSAwOworICAgIG15ICRjdXJyZW50X2Z1bmMgID0gIiI7ICAgICMgTmFtZSBvZiBjdXJyZW50IGZ1Y3Rpb24uCisgICAgbXkgJHJlcG9ydGVkX2Z1bmMgPSAiIjsgICAgIyBuYW1lIG9mIGxhc3QgcmVwb3J0ZWQgZnVuY3Rpb24uCisgICAgZm9yZWFjaCBteSAkbGluZSAoIEBidWxrICkgeworICAgICAgICArKyAkbjsKKyAgICAgICAgaWYgKCAwICkgeworICAgICAgICB9IGVsc2lmICggJGxpbmUgPX4gbXteXHMqJH0gKSB7CisgICAgICAgICAgICAjIEVtcHR5IGxpbmUuCisgICAgICAgICAgICAjIElnbm9yZS4KKyAgICAgICAgfSBlbHNpZiAoICRsaW5lID1+IG17XkluIGFyY2hpdmUgKC4qPyk6XHMqJH0gKSB7CisgICAgICAgICAgICAjIEluIGFyY2hpdmUgbGliaW9tcDUuYToKKyAgICAgICAgfSBlbHNpZiAoICRsaW5lID1+IG17Xig/Oi4qPyk6XHMqZmlsZSBmb3JtYXQgKC4qPylccyokfSApIHsKKyAgICAgICAgICAgICMgbGliaW9tcDUuc286ICAgICBmaWxlIGZvcm1hdCBlbGY2NC14ODYtNjQtZnJlZWJzZAorICAgICAgICAgICAgIyBrbXBfZnRuX2NkZWNsLm86ICAgICBmaWxlIGZvcm1hdCBlbGY2NC14ODYtNjQKKyAgICAgICAgICAgIG15ICRmbXQgPSAkMTsKKyAgICAgICAgICAgIGlmICggYmFkX2ZtdCggJGZtdCApICkgeworICAgICAgICAgICAgICAgIHJ1bnRpbWVfZXJyb3IoICJJbnZhbGlkIGZpbGUgZm9ybWF0OiAkZm10LiIgKTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgfSBlbHNpZiAoICRsaW5lID1+IG17XkRpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gKC4qPyk6XHMqJH0gKSB7CisgICAgICAgICAgICAjIERpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnBsdDoKKyAgICAgICAgfSBlbHNpZiAoICRsaW5lID1+IG17XiRoZXgrIDwoW14+XSspPjpccyokfSApIHsKKyAgICAgICAgICAgICMgMDAwMDAwMDAwMDAxN2U5OCA8X19rbXBfc3RyX2Zvcm1hdEBwbHQtMHgxMD46CisgICAgICAgICAgICAkY3VycmVudF9mdW5jID0gJDE7CisgICAgICAgIH0gZWxzaWYgKCAkbGluZSA9fiBte15ccypcLnszfVxzKiR9ICkgeworICAgICAgICB9IGVsc2lmICggJGxpbmUgPX4gbXteXHMqKCRoZXgrKTpccysoJGhleCRoZXgoPzogJGhleCRoZXgpKilccysoPzpsb2NrXHMrfHJleFsuYS16XSpccyspPyhbXiBdKykoPzpccysoW14jXSs/KSk/XHMqKD86I3wkKX0gKSB7CisgICAgICAgICAgICAjICAgMTdlOTg6ICAgICAgIGZmIDM1IGZhIDdkIDI2IDAwICAgICAgIHB1c2hxICAweDI2N2RmYSglcmlwKSAgICAgICAgIyAyN2ZjOTggPF9HTE9CQUxfT0ZGU0VUX1RBQkxFPgorICAgICAgICAgICAgbXkgKCAkYWRkciwgJGR1bXAsICRpbnN0ciwgJGFyZ3MgKSA9ICggJDEsICQyLCAkMywgJDQgKTsKKyAgICAgICAgICAgICMgQ2hlY2sgdGhpcyBpcyBub3QgYSBiYWQgaW5zdHJ1Y3Rpb24gYW5kIHhtbSByZWdpc3RlcnMgYXJlIG5vdCB1c2VkLgorICAgICAgICAgICAgaWYgKCBiYWRfaW5zdHIoICRpbnN0ciwgJGFyZ3MgKSApIHsKKyAgICAgICAgICAgICAgICBpZiAoICRlcnJvcnMgPT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgd2FybmluZyggIkludmFsaWQgaW5zdHJ1Y3Rpb25zIGZvdW5kIGluIGAkZmlsZSc6IiApOworICAgICAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgICAgICBpZiAoICRjdXJyZW50X2Z1bmMgbmUgJHJlcG9ydGVkX2Z1bmMgKSB7CisgICAgICAgICAgICAgICAgICAgIHdhcm5pbmcoICIgICAgJGN1cnJlbnRfZnVuYyIgKTsKKyAgICAgICAgICAgICAgICAgICAgJHJlcG9ydGVkX2Z1bmMgPSAkY3VycmVudF9mdW5jOworICAgICAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgICAgICArKyAkZXJyb3JzOworICAgICAgICAgICAgICAgIGlmICggJHNob3dfaW5zdHJ1Y3Rpb25zICkgeworICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKCAiICAgICAgICAkbGluZSIgKTsKKyAgICAgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICAgICAgaWYgKCAkZXJyb3JzID49ICRtYXhfaW5zdHJ1Y3Rpb25zICkgeworICAgICAgICAgICAgICAgICAgICBpbmZvKCAiJGVycm9ycyBpbnZhbGlkIGluc3RydWN0aW9ucyBmb3VuZDsgc2Nhbm5pbmcgc3RvcHBlZC4iICk7CisgICAgICAgICAgICAgICAgICAgIGxhc3Q7CisgICAgICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcnVudGltZV9lcnJvciggIkVycm9yIHBhcnNpbmcgb2JqZHVtcCBvdXRwdXQgbGluZSAkbjpcbj4+Pj4gJGxpbmVcbiIgKTsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgZm9yZWFjaCAkbGluZQorCisgICAgcmV0dXJuICRlcnJvcnM7CisKK307ICMgc3ViIGNoZWNrX2ZpbGUKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIFBhcnNlIGNvbW1hbmQgbGluZS4KK215ICRtYXhfaW5zdHJ1Y3Rpb25zOworbXkgJHNob3dfaW5zdHJ1Y3Rpb25zOworZ2V0X29wdGlvbnMoCisgICAgIm1heC1pbnN0cnVjdGlvbnM9aSIgPT4gXCRtYXhfaW5zdHJ1Y3Rpb25zLAorICAgICJzaG93LWluc3RydWN0aW9ucyEiID0+IFwkc2hvd19pbnN0cnVjdGlvbnMsCisgICAgIm1pYy1hcmNoPXMiICAgICAgICAgPT4gXCRtaWNfYXJjaCwKKyAgICAibWljLW9zPXMiICAgICAgICAgICA9PiBcJG1pY19vcywKKyAgICBQbGF0Zm9ybTo6dGFyZ2V0X29wdGlvbnMoKSwKKyk7CitpZiAoICIkbWljX29zIiBlcSAibGluIiBhbmQgIiRtaWNfYXJjaCIgZXEgImtuZiIgKSB7CisgICAgJGxyYl9iYWRfcmUgPSBxcnteKD86cGF1c2V8W3NsbV1mZW5jZXxzY2F0dGVyfGdhdGhlcnxjbXB4Y2hnMTZifGNsZXZpY3RbMTJdKX1pOworfSBlbHNlIHsKKyAgICAkbHJiX2JhZF9yZSA9IHFye14oPzpwYXVzZXxbc2xtXWZlbmNlfHNjYXR0ZXJ8Z2F0aGVyfGNtb3Z8Y21weGNoZzE2YnxjbGV2aWN0WzEyXSl9aTsKK307CitpZiAoIDAgKSB7Cit9IGVsc2lmICggJHRhcmdldF9wbGF0Zm9ybSBlcSAibHJiXzMyZSIgKSB7CisgICAgKmJhZF9pbnN0ciA9IFwqYmFkX2xyYl9pbnN0cjsKKyAgICAqYmFkX2ZtdCAgID0gXCpiYWRfbHJiX2ZtdDsKK30gZWxzaWYgKCAkdGFyZ2V0X3BsYXRmb3JtIGVxICJsaW5fMzIiICkgeworICAgICpiYWRfaW5zdHIgPSBcKmJhZF9pYTMyX2luc3RyOworICAgICpiYWRfZm10ICAgPSBcKmJhZF9pYTMyX2ZtdDsKK30gZWxzZSB7CisgICAgcnVudGltZV9lcnJvciggIk9ubHkgd29ya3Mgb24gbGluXzMyIGFuZCBscmJfMzJlIHBsYXRmb3Jtcy4iICk7Cit9OyAjIGlmCisKKyMgRG8gdGhlIHdvcmsuCitteSAkcmMgPSAwOworaWYgKCBub3QgQEFSR1YgKSB7CisgICAgaW5mbyggIk5vIGFyZ3VtZW50cyBzcGVjaWZpZWQgLS0gbm90aGluZyB0byBkby4iICk7Cit9IGVsc2UgeworICAgIGZvcmVhY2ggbXkgJGFyZyAoIEBBUkdWICkgeworICAgICAgICBteSAkZXJycyA9IGNoZWNrX2ZpbGUoICRhcmcsICRzaG93X2luc3RydWN0aW9ucywgJG1heF9pbnN0cnVjdGlvbnMgKTsKKyAgICAgICAgaWYgKCAkZXJycyA+IDAgKSB7CisgICAgICAgICAgICAkcmMgPSAzOworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBmb3JlYWNoICRhcmcKK307ICMgaWYKKworZXhpdCggJHJjICk7CisKK19fRU5EX18KKworPXBvZAorCis9aGVhZDEgTkFNRQorCitCPGNoZWNrLWluc3RydWN0aW9uLXNldC5wbD4gLS0gTWFrZSBzdXJlIGJpbmFyeSBmaWxlIGRvZXMgbm90IGNvbnRhaW4gdW5kZXNpcmVkIGluc3RydWN0aW9ucy4KKworPWhlYWQxIFNZTk9QU0lTCisKK0I8Y2hlY2staW5zdHJ1Y3Rpb25zLnBsPiBJPG9wdGlvbj4uLi4gSTxmaWxlPi4uLgorCis9aGVhZDEgT1BUSU9OUworCis9b3ZlcgorCis9aXRlbSBCPC0tYXJjaGl0ZWN0dXJlPT5JPGFyY2g+CisKK1NwZWNpZnkgdGFyZ2V0IGFyY2hpdGVjdHVyZS4KKworPWl0ZW0gQjwtLW1heC1pbnN0cnVjdGlvbnM9Pkk8bnVtYmVyPgorCitTdG9wIHNjYW5uaW5nIGlmIEk8bnVtYmVyPiBpbnZhbGlkIGluc3RydWN0aW9ucyBmb3VuZC4gMTAwIGJ5IGRlZmF1bHQuCisKKz1pdGVtIEI8LS1vcz0+STxvcz4KKworU3BlY2lmeSB0YXJnZXQgT1MuCisKKz1pdGVtIEI8LS0+W0I8bm8tPl1CPHNob3ctaW5zdHJ1Y3Rpb25zPgorCitTaG93IGludmFsaWQgaW5zdHJ1Y3Rpb25zIGZvdW5kIGluIHRoZSBmaWxlLiBCdSBkZWZhdWx0LCBpbnN0cnVjdGlvbnMgYXJlIG5vdCBzaG93bi4KKworPWl0ZW0gU3RhbmRhcmQgT3B0aW9ucworCis9b3ZlcgorCis9aXRlbSBCPC0tZG9jPgorCis9aXRlbSBCPC0tbWFudWFsPgorCitQcmludCBmdWxsIGhlbHAgbWVzc2FnZSBhbmQgZXhpdC4KKworPWl0ZW0gQjwtLWhlbHA+CisKK1ByaW50IHNob3J0IGhlbHAgbWVzc2FnZSBhbmQgZXhpdC4KKworPWl0ZW0gQjwtLXVzYWdlPgorCitQcmludCB2ZXJ5IHNob3J0IHVzYWdlIG1lc3NhZ2UgYW5kIGV4aXQuCisKKz1pdGVtIEI8LS12ZXJib3NlPgorCitEbyBwcmludCBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzLgorCis9aXRlbSBCPC0tdmVyc2lvbj4KKworUHJpbnQgcHJvZ3JhbSB2ZXJzaW9uIGFuZCBleGl0LgorCis9aXRlbSBCPC0tcXVpZXQ+CisKK1dvcmsgcXVpZXQsIGRvIG5vdCBwcmludCBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzLgorCis9YmFjaworCis9YmFjaworCis9aGVhZDEgQVJHVU1FTlRTCisKKz1vdmVyCisKKz1pdGVtIEk8ZmlsZT4KKworRmlsZSAob2JqZWN0IGZpbGUgb3IgbGlicmFyeSwgZWl0aGVyIHN0YXRpYyBvciBkeW5hbWljKSB0byBjaGVjay4KKworPWJhY2sKKworPWhlYWQxIERFU0NSSVBUSU9OCisKK1RoZSBzY3JpcHQgcnVucyBGPG9iamR1bXA+IHV0aWxpdHkgdG8gZ2V0IGRpc2Fzc2VtYmxlciBsaXN0aW5nIGFuZCBjaGVja3MgdGhlIGZpbGUgZG9lcyBub3QgY29udGFpbgordW53YW50ZWQgaW5zdHJ1Y3Rpb25zLgorCitDdXJyZW50bHkgdGhlIHNjcmlwdCB3b3JrcyBvbmx5IGZvcjoKKworPW92ZXIKKworPWl0ZW0gQzxscmJfMzJlPgorCitJbnRlbChSKSBNYW55IEludGVncmF0ZWQgQ29yZSBBcmNoaXRlY3R1cmUgdGFyZ2V0IE9TLiBVbmRlc2lyZWQgdW5zdHJ1Y3Rpb25zIGFyZTogYWxsIHg4NyBpbnN0cnVjdGlvbnMgYW5kIHNvbWUgb3RoZXJzLgorCis9aXRlbSBDPGxpbl8zMj4KKworVW5kZXNpcmVkIGluc3RydWN0aW9ucyBhcmUgaW5zdHJ1Y3Rpb25zIG5vdCB2YWxpZCBmb3IgUGVudGl1bSAzIHByb2Nlc3NvciAoU1NFMiBhbmQgbmV3ZXIpLgorCis9YmFjaworCis9Y3V0CisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdG9vbHMvY2hlY2stdG9vbHMucGwgYi9maW5hbC9ydW50aW1lL3Rvb2xzL2NoZWNrLXRvb2xzLnBsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmFlN2ZiNzIKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rvb2xzL2NoZWNrLXRvb2xzLnBsCkBAIC0wLDAgKzEsNjA2IEBACisjIS91c3IvYmluL3BlcmwKKworIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworCisjIFByYWdtYXMuCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCit1c2UgRmluZEJpbjsKK3VzZSBsaWIgIiRGaW5kQmluOjpCaW4vbGliIjsKKworIyBMSUJPTVAgbW9kdWxlcy4KK3VzZSBQbGF0Zm9ybSAiOnZhcnMiOwordXNlIHRvb2xzOworCitvdXIgJFZFUlNJT04gPSAiMC4wMTUiOworCitteSAkcGVkYW50aWM7CisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgSGVscGVyIGZ1bmN0aW9ucworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK3N1YiBydW4oJFwkXCQ7XCQpIHsKKyAgICBteSAoICRjbWQsICRzdGRvdXQsICRzdGRlcnIsICRwYXRoICkgPSBAXzsKKyAgICBteSAoIEBwYXRoLCAkcmMgKTsKKyAgICBAcGF0aCA9IHdoaWNoKCAkY21kLT5bIDAgXSwgLWFsbCA9PiAxICk7CisgICAgaWYgKCBAcGF0aCA+IDAgKSB7CisgICAgICAgIGlmICggQHBhdGggPiAxIGFuZCAkcGVkYW50aWMgKSB7CisgICAgICAgICAgICB3YXJuaW5nKCAiTW9yZSB0aGFuIG9uZSBcIiRjbWQtPlsgMCBdXCIgZm91bmQgaW4gUEFUSDoiLCBtYXAoICIgICAgJF8iLCBAcGF0aCApICk7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgZGVidWcoICJcIiRjbWQtPlsgMCBdXCIgZnVsbCBwYXRoIGlzIFwiJHBhdGhbIDAgXVwiLiIgKTsKKyAgICAgICAgaWYgKCBkZWZpbmVkKCAkcGF0aCApICkgeworICAgICAgICAgICAgJCRwYXRoID0gJHBhdGhbIDAgXTsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICBkZWJ1ZyggIkV4ZWN1dGluZyBjb21tYW5kOiBcIiIgIC4gam9pbiAoICIgIiwgQCRjbWQgKSAuICJcIi4iICk7CisgICAgICAgICRyYyA9CisgICAgICAgICAgICBleGVjdXRlKAorICAgICAgICAgICAgICAgICRjbWQsCisgICAgICAgICAgICAgICAgLWlnbm9yZV9zaWduYWwgPT4gMSwgLWlnbm9yZV9zdGF0dXMgPT4gMSwKKyAgICAgICAgICAgICAgICAtc3Rkb3V0ID0+ICRzdGRvdXQsIC1zdGRlcnIgPT4gJHN0ZGVyciwgLXN0ZGluID0+IHVuZGVmCisgICAgICAgICAgICApOworICAgICAgICBpZiAoICRyYyA8IDAgKSB7CisgICAgICAgICAgICB3YXJuaW5nKCAiQ2Fubm90IHJ1biBcIiRjbWQtPlsgMCBdXCI6ICRAIiApOworICAgICAgICB9OyAjIGlmCisgICAgICAgIGRlYnVnKCAic3Rkb3V0OiIsICQkc3Rkb3V0LCAiKGVvZikiLCAic3RkZXJyOiIsICQkc3RkZXJyLCAiKGVvZikiICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgd2FybmluZyggIk5vIFwiJGNtZC0+WyAwIF1cIiBmb3VuZCBpbiBQQVRILiIgKTsKKyAgICAgICAgJHJjID0gLTE7CisgICAgfTsgIyBpZgorICAgIHJldHVybiAkcmM7Cit9OyAjIHN1YiBydW4KKworCitzdWIgZ2V0X2FyY2goJCQkKSB7CisgICAgbXkgKCAkbmFtZSwgJHN0ciwgJGV4cHMgKSA9IEBfOworICAgIG15ICggJGFyY2gsICRjb3VudCApOworICAgICRjb3VudCA9IDA7CisgICAgZm9yZWFjaCBteSAkcmUgKCBrZXlzKCAlJGV4cHMgKSApIHsKKyAgICAgICAgaWYgKCAkc3RyID1+ICRyZSApIHsKKyAgICAgICAgICAgICRhcmNoID0gJGV4cHMtPnsgJHJlIH07CisgICAgICAgICAgICArKyAkY291bnQ7CisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGZvcgorICAgIGlmICggJGNvdW50ICE9IDEgb3Igbm90IFBsYXRmb3JtOjpjYW5vbl9hcmNoKCAkYXJjaCApICkgeworICAgICAgICB3YXJuaW5nKCAiQ2Fubm90IGRldGVjdCAkbmFtZSBhcmNoaXRlY3R1cmU6ICRzdHIiICk7CisgICAgICAgIHJldHVybiB1bmRlZjsKKyAgICB9OyAjIGlmCisgICAgcmV0dXJuICRhcmNoOworfTsgIyBzdWIgZ2V0X2FyY2gKKworc3ViIGVuY29kZSgkKSB7CisgICAgbXkgKCAkc3RyICkgPSBAXzsKKyAgICAkc3RyID1+IHN7IH17X31nOworICAgIHJldHVybiAkc3RyOworfTsgIyBzdWIgZW5jb2RlCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBnZXRfeHh4X3ZlcnNpb24gc3Vicm91dGluZXMuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjCisjIFNvbWUgb2YgZ2V0X3h4eF92ZXJzaW9uKCkgc3Vicm91dGluZXMgYWNjZXB0IGFuIGFyZ3VtZW50IC0tIGEgdG9vbCBuYW1lLiBGb3IgZXhhbXBsZSwKKyMgZ2V0X2ludGVsX2NvbXBpbGVyX3ZlcnNpb24oKSBjYW4gcmVwb3J0IHZlcnNpb24gb2YgQywgQysrLCBvciBGb3J0cmFuIGNvbXBpbGVyLiBUaGUgdG9vbCBmb3IKKyMgcmVwb3J0IHNob3VsZCBiZSBzcGVjaWZpZWQgYnkgYXJndW1lbnQsIGZvciBleGFtcGxlOiBnZXRfaW50ZWxfY29tcGlsZXJfdmVyc2lvbiggImlmb3J0IiApLgorIworIyBnZXRfeHh4X3ZlcnNpb24oKSBzdWJyb3V0aW5lcyByZXR1cm5zIGxpc3Qgb2Ygb25lIG9yIHR3byBlbGVtZW50czoKKyMgICAgIDEuIFRoZSBmaXJzdCBlbGVtZW50IGlzIHNob3J0IHRvb2wgbmFtZSAobGlrZSAiZ2NjIiwgImcrKyIsICJpY2wiLCBldGMpLgorIyAgICAgMi4gVGhlIHNlY29uZCBlbGVtZW50IGlzIHZlcnNpb24gc3RyaW5nLgorIyBJZiByZXR1cm5lZCBsaXN0IGNvbnRhaW4ganVzdCBvbmUgZWxlbWVudCwgaXQgbWVhbnMgdGhlcmUgaXMgYSBwcm9ibGVtIHdpdGggdGhlIHRvb2wuCisjCisKK3N1YiBnZXRfcGVybF92ZXJzaW9uKCkgeworICAgIG15ICggJHJjLCAkc3Rkb3V0LCAkc3RkZXJyLCAkdmVyc2lvbiApOworICAgIG15ICR0b29sID0gInBlcmwiOworICAgIG15ICggQHJldCApID0gKCAkdG9vbCApOworICAgICRyYyA9IHJ1biggWyAkdG9vbCwgIi0tdmVyc2lvbiIgXSwgJHN0ZG91dCwgJHN0ZGVyciApOworICAgIGlmICggJHJjID49IDAgKSB7CisgICAgICAgICMgVHlwaWNhbCBwZXJsIG91dHB1dDoKKyAgICAgICAgIyAgICBUaGlzIGlzIHBlcmwsIHY1LjEwLjAgYnVpbHQgZm9yIHg4Nl82NC1saW51eC10aHJlYWQtbXVsdGkKKyAgICAgICAgIyAgICBUaGlzIGlzIHBlcmwsIHY1LjguOCBidWlsdCBmb3IgTVNXaW4zMi14NjQtbXVsdGktdGhyZWFkCisgICAgICAgICMgICAgVGhpcyBpcyBwZXJsLCB2NS4xMC4xICgqKSBidWlsdCBmb3IgeDg2XzY0LWxpbnV4LXRocmVhZC1tdWx0aQorICAgICAgICBpZiAoICRzdGRvdXQgIX4gbXteVGhpcyBpcyBwZXJsLip2KFxkK1wuXGQrKD86XC5cZCspKS4qYnVpbHQgZm9yfW0gKSB7CisgICAgICAgICAgICB3YXJuaW5nKCAiQ2Fubm90IHBhcnNlIHBlcmwgb3V0cHV0OiIsICRzdGRvdXQsICIob2VmKSIgKTsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICAkdmVyc2lvbiA9ICQxOworICAgICAgICBpZiAoICR0YXJnZXRfb3MgZXEgIndpbiIgKSB7CisgICAgICAgICAgICBpZiAoICRzdGRvdXQgIX4gbXtCaW5hcnkgYnVpbGQgKC4qKSBwcm92aWRlZCBieSBBY3RpdmVTdGF0ZSB9ICkgeworICAgICAgICAgICAgICAgIHdhcm5pbmcoICJQZXJsIGlzIG5vdCBBY3RpdmVTdGF0ZSBvbmUiICk7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGlmCisgICAgcHVzaCggQHJldCwgJHZlcnNpb24gKTsKKyAgICByZXR1cm4gQHJldDsKK307ICMgc3ViIGdldF9wZXJsX3ZlcnNpb24KKworCitzdWIgZ2V0X2dudV9tYWtlX3ZlcnNpb24oKSB7CisgICAgbXkgKCAkcmMsICRzdGRvdXQsICRzdGRlcnIsICR2ZXJzaW9uICk7CisgICAgbXkgJHRvb2wgPSAibWFrZSI7CisgICAgbXkgKCBAcmV0ICkgPSAoICR0b29sICk7CisgICAgbXkgKCAkcGF0aCApOworICAgICRyYyA9IHJ1biggWyAkdG9vbCwgIi0tdmVyc2lvbiIgXSwgJHN0ZG91dCwgJHN0ZGVyciwgJHBhdGggKTsKKyAgICBpZiAoICRyYyA+PSAwICkgeworICAgICAgICAjIFR5cGljYWwgbWFrZSBvdXRwdXQ6CisgICAgICAgICMgICAgIEdOVSBNYWtlIHZlcnNpb24gMy43OS4xLCBieSBSaWNoYXJkIFN0YWxsbWFuIGFuZCBSb2xhbmQgTWNHcmF0aC4KKyAgICAgICAgIyAgICAgR05VIE1ha2UgMy44MQorICAgICAgICBpZiAoICRzdGRvdXQgPX4gbXteR05VIE1ha2UgKD86dmVyc2lvbiApPyhcZCtcLlxkKyg/OlwuXGQrKT8pKD86LHxccyl9ICkgeworICAgICAgICAgICAgJHZlcnNpb24gPSAkMTsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICBpZiAoICR0YXJnZXRfb3MgZXEgIndpbiIgYW5kICRzdGRvdXQgPX4gbXtidWlsdCBmb3IgKFthLXowLTktXSspfSApIHsKKyAgICAgICAgICAgIG15ICRidWlsdF9mb3IgPSAkMTsKKyAgICAgICAgICAgIGRlYnVnKCAiR05VIE1ha2UgYnVpbHQgZm9yOiBcIiRidWlsdF9mb3JcIi4iICk7CisgICAgICAgICAgICBpZiAoICRidWlsdF9mb3IgPX4gbXtjeWd3aW59aSApIHsKKyAgICAgICAgICAgICAgICB3YXJuaW5nKCAiXCIkcGF0aFwiIGlzIGEgQ3lnd2luIG1ha2UsIGl0IGlzICpub3QqIHN1aXRhYmxlLiIgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQHJldDsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgaWYKKyAgICBwdXNoKCBAcmV0LCAkdmVyc2lvbiApOworICAgIHJldHVybiBAcmV0OworfTsgIyBzdWIgZ2V0X2dudV9tYWtlX3ZlcnNpb24KKworCitzdWIgZ2V0X2ludGVsX2NvbXBpbGVyX3ZlcnNpb24oJCkgeworICAgIG15ICggJHRvb2wgKSA9IEBfOyAgICAjIFRvb2wgbmFtZSwgbGlrZSAiaWNjIiwgImljcGMiLCAiaWNsIiwgb3IgImlmb3J0Ii4KKyAgICBteSAoIEByZXQgKSA9ICggJHRvb2wgKTsKKyAgICBteSAoICRyYywgJHN0ZG91dCwgJHN0ZGVyciwgJHRvb2xfcmUgKTsKKyAgICBteSAkdmVyc2lvbjsKKyAgICBteSAkaWNfYXJjaHMgPSB7CisgICAgICAgIHFyezMyLWJpdHxJQS0zMn0gICAgICAgID0+ICIzMiIsCisgICAgICAgIHFye0ludGVsXChSXCkgNjR9ID0+ICIzMmUiLAorICAgICAgICBxcntJbnRlbFwoUlwpIFtNXVtJXVtDXSBBcmNoaXRlY3R1cmV9ID0+ICIzMmUiLAorICAgIH07CisgICAgJHRvb2xfcmUgPSBxdW90ZW1ldGEoICR0b29sICk7CisgICAgJHJjID0gcnVuKCBbICR0b29sLCAoICR0YXJnZXRfb3MgZXEgIndpbiIgPyAoKSA6ICggIi1WIiApICkgXSwgJHN0ZG91dCwgJHN0ZGVyciApOworICAgIGlmICggJHJjIDwgMCApIHsKKyAgICAgICAgcmV0dXJuIEByZXQ7CisgICAgfTsgIyBpZgorICAgICMgSW50ZWwgY29tcGlsZXIgdmVyc2lvbiBzdHJpbmcgaXMgaW4gdGhlIGZpcnN0IGxpbmUgb2Ygc3RkZXJyLiBHZXQgaXQuCisgICAgIyRzdGRlcnIgPX4gbXtcQSguKlxuPyl9OworICAgICMgQUM6IExldCdzIGxvb2sgZm9yIHZlcnNpb24gc3RyaW5nIGluIHRoZSBmaXJzdCBsaW5lIHdoaWNoIGNvbnRhaW5zICJJbnRlbCIgc3RyaW5nLgorICAgICMgICAgIFRoaXMgYWxsb3dzIHRvIHVzZSAxMS4xIGFuZCAxMi4wIGNvbXBpbGVycyBvbiBuZXcgTUFDIG1hY2hpbmVzIGJ5IGlnbm9yaW5nCisgICAgIyAgICAgaHVnZSBudW1iZXIgb2Ygd2FybmluZ3MgaXNzdWVkIGJ5IG9sZCBjb21waWxlcnMuCisgICAgJHN0ZGVyciA9fiBte14oSW50ZWwuKikkfW07CisgICAgbXkgJHZzdHIgPSAkMTsKKyAgICBteSAoICRhcGwsICR2ZXIsICRibGQsICRwa2cgKTsKKyAgICBpZiAoIDAgKSB7CisgICAgfSBlbHNpZiAoICR2c3RyID1+IG17XkludGVsLio/Q29tcGlsZXJccysoLio/KSw/XHMrVmVyc2lvblxzKyguKj8pXHMrQnVpbGRccysoXFMrKSg/OlxzK1BhY2thZ2UgSUQ6IChcUyspKT99ICkgeworICAgICAgICAjIDkueCwgMTAueCwgMTEuMC4KKyAgICAgICAgKCAkYXBsLCAkdmVyLCAkYmxkLCAkcGtnICkgPSAoICQxLCAkMiwgJDMsICQ0ICk7CisgICAgfSBlbHNpZiAoICR2c3RyID1+IG17XkludGVsJ3MgKC4qPykgQ29tcGlsZXIsP1xzK1ZlcnNpb25ccysoLio/KVxzK0J1aWxkXHMrKFxTKyl9ICkgeworICAgICAgICAjIDExLjEKKyAgICAgICAgKCAkYXBsLCAkdmVyLCAkYmxkICkgPSAoICQxLCAkMiwgJDMgKTsKKyAgICB9IGVsc2UgeworICAgICAgICB3YXJuaW5nKCAiQ2Fubm90IHBhcnNlICR7dG9vbH0ncyBzdGRlcnI6IiwgJHN0ZGVyciwgIihlb2YpIiApOworICAgICAgICByZXR1cm4gQHJldDsKKyAgICB9OyAjIGlmCisgICAgbXkgJGljX2FyY2ggPSBnZXRfYXJjaCggIkludGVsIGNvbXBpbGVyIiwgJGFwbCwgJGljX2FyY2hzICk7CisgICAgaWYgKCBub3QgZGVmaW5lZCggJGljX2FyY2ggKSApIHsKKyAgICAgICAgcmV0dXJuIEByZXQ7CisgICAgfTsgIyBpZgorICAgIGlmICggUGxhdGZvcm06OmNhbm9uX2FyY2goICRpY19hcmNoICkgbmUgJHRhcmdldF9hcmNoICkgeworICAgICAgICB3YXJuaW5nKCAiVGFyZ2V0IGFyY2hpdGVjdHVyZSBpcyAkdGFyZ2V0X2FyY2gsICR0b29sIGZvciAkaWNfYXJjaCBmb3VuZC4iICk7CisgICAgICAgIHJldHVybiBAcmV0OworICAgIH07ICMgaWYKKyAgICAjIE5vcm1hbGl6ZSB2ZXJzaW9uLgorICAgIG15ICRzdGFnZTsKKyAgICAkdmVyID1+IHN7XHMrfXsgfWc7CisgICAgJHZlciA9IGxjKCAkdmVyICk7CisgICAgaWYgKCAkdmVyID1+IG17XEEoXGQrXC5cZCsoPzpcLlxkKyk/KSAoW2Etel0rKVxhfWkgKSB7CisgICAgICAgICggJHZlcnNpb24sICRzdGFnZSApID0gKCAkMSwgJDIgKTsKKyAgICB9IGVsc2UgeworICAgICAgICAoICR2ZXJzaW9uLCAkc3RhZ2UgKSA9ICggJHZlciwgIiIgKTsKKyAgICB9OyAjIGlmCisgICAgIyBQYXJzZSBwYWNrYWdlLgorICAgIGlmICggZGVmaW5lZCggJHBrZyApICkgeworICAgICAgICBpZiAoICRwa2cgIX4gbXtcQVtsd21dX1thLXpdK19bYS16XV8oXGQrXC5cZCtcLlxkKylcen1pICkgeworICAgICAgICAgICAgd2FybmluZyggIkNhbm5vdCBwYXJzZSBJbnRlbCBjb21waWxlciBwYWNrYWdlOiAkcGtnIiApOworICAgICAgICAgICAgcmV0dXJuIEByZXQ7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgJHBrZyA9ICQxOworICAgICAgICAkdmVyc2lvbiA9ICRwa2c7CisgICAgfTsgIyBpZgorICAgIHB1c2goIEByZXQsICIkdmVyc2lvbiAiIC4gKCAkc3RhZ2UgPyAiJHN0YWdlICIgOiAiIiApIC4gIigkYmxkKSBmb3IgJGljX2FyY2giICk7CisgICAgIyBPaywgdmVyc2lvbiBvZiBJbnRlbCBjb21waWxlciBmb3VuZCBzdWNjZXNzZnVsbHkuIE5vdyBsb29rIGF0IGNvbmZpZyBmaWxlLgorICAgICMgSW5zdGFsbGVyIG9mIEludGVsIGNvbXBpbGVyIHRlbmRzIHRvIGFkZCBhIHBhdGggdG8gTVMgbGlua2VyIGludG8gY29tcGlsZXIgY29uZmlnIGZpbGUuCisgICAgIyBJdCBsZWFkcyB0byB0cm91Ymxlcy4gRm9yIGV4YW1wbGUsIGFsbCB0aGUgZW52aXJvbm1lbnQgc2V0IHVwIGZvciBNUyBWUyAyMDA1LCBidXQgSW50ZWwKKyAgICAjIGNvbXBpbGVyIHVzZXMgbG5rZXIgZnJvbSBNUyBWUyAyMDAzIGJlY2F1c2UgaXQgaXMgc3BlY2lmaWVkIGluIGNvbmZpZyBmaWxlLgorICAgICMgVG8gYXZvaWQgc3VjaCB0cm91YmxlcywgbWFrZSBzdXJlOgorICAgICMgICAgIElDTENGRy9JRk9SVENGRyBlbnZpcm9ubWVudCB2YXJpYWJsZSBleGlzdHMgb3IKKyAgICAjICAgICBjb21waWxlciBjb25maWcgZmlsZSBkb2VzIG5vdCBleGlzdCwgb3IKKyAgICAjICAgICBjb21waWxlciBjb25maWcgZmlsZSBkb2VzIG5vdCBzcGVjaWZ5IGxpbmtlci4KKyAgICBpZiAoICR0YXJnZXRfb3MgZXEgIndpbiIgKSB7CisgICAgICAgIGlmICggbm90IGV4aXN0cyggJEVOVnsgdWMoICR0b29sIC4gImNmZyIgKSB9ICkgKSB7CisgICAgICAgICAgICAjIElmIElDTENGRy9JRk9SVENGRyBlbnZpcm9ubWVudCB2YXJpYW5sZSBleGlzdHMsIGV2ZXJ5dGhpbmcgaXMgb2suCisgICAgICAgICAgICAjIE90aGVyd2lzZSBjaGVjayBjb21waWxlcidzIGNvbmZpZyBmaWxlLgorICAgICAgICAgICAgbXkgJHBhdGggPSB3aGljaCggJHRvb2wgKTsKKyAgICAgICAgICAgICRwYXRoID1+IHN7XC5leGVcen17fWk7ICAgICAjIERyb3AgIi5leGUiIHN1ZmZpeC4KKyAgICAgICAgICAgICRwYXRoIC49ICIuY2ZnIjsgICAgICAgICAgICAjIEFuZCBhZGQgIi5jZmciIG9uZS4KKyAgICAgICAgICAgIGlmICggLWYgJHBhdGggKSB7CisgICAgICAgICAgICAgICAgIyBJZiBubyBjb25maWcgZmlsZSBleGlzdHMsIGl0IGlzIG9rLgorICAgICAgICAgICAgICAgICMgT3RoZXJ3aXNlIGFuYWx5emUgaXRzIGNvbnRlbnQuCisgICAgICAgICAgICAgICAgbXkgJGJ1bGsgPSByZWFkX2ZpbGUoICRwYXRoICk7CisgICAgICAgICAgICAgICAgJGJ1bGsgPX4gc3sjLipcbn17fWc7ICAgICMgUmVtb3ZlIGNvbW1lbnRzLgorICAgICAgICAgICAgICAgIG15IEBvcHRpb25zID0gKCAiUXZjIiwgIlFsb2NhdGlvbixsaW5rLCIgKTsKKyAgICAgICAgICAgICAgICBmb3JlYWNoIG15ICAkb3B0ICggQG9wdGlvbnMgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICggJGJ1bGsgPX4gbXtbLS9dJG9wdH0gKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKCAiQ29tcGlsZXIgY29uZmlnIGZpbGUgXCIkcGF0aFwiIGNvbnRhaW5zIFwiLSRvcHRcIiBvcHRpb24uIiApOworICAgICAgICAgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICAgICAgfTsgIyBmb3JlYWNoCisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGlmCisgICAgcmV0dXJuIEByZXQ7Cit9OyAjIHN1YiBnZXRfaW50ZWxfY29tcGlsZXJfdmVyc2lvbgorCisKK3N1YiBnZXRfZ251X2NvbXBpbGVyX3ZlcnNpb24oJCkgeworICAgIG15ICggJHRvb2wgKSA9IEBfOworICAgIG15ICggQHJldCApID0gKCAkdG9vbCApOworICAgIG15ICggJHJjLCAkc3Rkb3V0LCAkc3RkZXJyLCAkdmVyc2lvbiApOworICAgICRyYyA9IHJ1biggWyAkdG9vbCwgIi0tdmVyc2lvbiIgXSwgJHN0ZG91dCwgJHN0ZGVyciApOworICAgIGlmICggJHJjID49IDAgKSB7CisgICAgICAgIG15ICggJHZlciwgJGJsZCApOworICAgICAgICBpZiAoICR0YXJnZXRfb3MgZXEgIm1hYyIgKSB7CisgICAgICAgICAgICAjIGk2ODYtYXBwbGUtZGFyd2luOC1nY2MtNC4wLjEgKEdDQykgNC4wLjEgKEFwcGxlIENvbXB1dGVyLCBJbmMuIGJ1aWxkIDUzNjcpCisgICAgICAgICAgICAjIGk2ODYtYXBwbGUtZGFyd2luOS1nY2MtNC4wLjEgKEdDQykgNC4wLjEgKEFwcGxlIEluYy4gYnVpbGQgNTQ4NCkKKyAgICAgICAgICAgICMgaTY4Ni1hcHBsZS1kYXJ3aW4xMS1sbHZtLWdjYy00LjIgKEdDQykgNC4yLjEgKEJhc2VkIG9uIEFwcGxlIEluYy4gYnVpbGQgNTY1OCkgKExMVk0gYnVpbGQgMjMzNi45LjAwKQorICAgICAgICAgICAgJHN0ZG91dCA9fiBte14uKj8gXChHQ0NcKSAoXGQrXC5cZCtcLlxkKykgXCguKkFwcGxlLio/SW5jXC4gYnVpbGQgKFxkKylcKX1tOworICAgICAgICAgICAgKCAkdmVyLCAkYmxkICkgPSAoICQxLCAkMiApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCAwICkgeworICAgICAgICAgICAgfSBlbHNpZiAoICRzdGRvdXQgPX4gbXteLio/IFwoR0NDXCkgKFxkK1wuXGQrXC5cZCspKD86IChcZCspKT99bSApIHsKKyAgICAgICAgICAgICAgICAjIGcrKyAoR0NDKSAzLjIuMyAyMDAzMDUwMiAoUmVkIEhhdCBMaW51eCAzLjIuMy0yMCkKKyAgICAgICAgICAgICAgICAjIEdOVSBGb3J0cmFuIChHQ0MpIDQuMy4yIDIwMDgxMTA1IChSZWQgSGF0IDQuMy4yLTcpCisgICAgICAgICAgICAgICAgKCAkdmVyLCAkYmxkICkgPSAoICQxLCAkMiApOworICAgICAgICAgICAgfSBlbHNpZiAoICRzdGRvdXQgPX4gbXteLio/IFwoU1VTRSBMaW51eFwpIChcZCtcLlxkK1wuXGQrKVxzK1xbLio/IChcZCspXF19bSApIHsKKyAgICAgICAgICAgICAgICAjIGdjYyAoU1VTRSBMaW51eCkgNC4zLjIgW2djYy00XzMtYnJhbmNoIHJldmlzaW9uIDE0MTI5MV0KKyAgICAgICAgICAgICAgICAoICR2ZXIsICRibGQgKSA9ICggJDEsICQyICk7CisgICAgICAgICAgICB9IGVsc2lmICggJHN0ZG91dCA9fiBte14uKj8gXChTVVNFIExpbnV4XCkgKFxkK1wuXGQrXC5cZCspXHMrXGQrXHMrXFsuKj8gKFxkKylcXX1tICkgeworICAgICAgICAgICAgICAgICMgZ2NjIChTVVNFIExpbnV4KSA0LjcuMiAyMDEzMDEwOCBbZ2NjLTRfNy1icmFuY2ggcmV2aXNpb24gMTk1MDEyXQorICAgICAgICAgICAgICAgICggJHZlciwgJGJsZCApID0gKCAkMSwgJDIgKTsKKyAgICAgICAgICAgIH0gZWxzaWYgKCAkc3Rkb3V0ID1+IG17Xi4qPyBcKChEZWJpYW58VWJ1bnR1KS4qP1wpIChcZCtcLlxkK1wuXGQrKX1tICkgeworICAgICAgICAgICAgICAgICMgZ2NjIChEZWJpYW4gNC43LjItMjIpIDQuNy4yCisgICAgICAgICAgICAgICAgIyBEZWJpYW4gc3VwcG9ydCBmcm9tIFN5bHZlc3RyZSBMZWRydSAKKyAgICAgICAgICAgICAgICAjIFRoYW5rcyEKKyAgICAgICAgICAgICAgICAkdmVyID0gJDI7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgIH07ICMgaWYKKyAgICAgICAgaWYgKCBkZWZpbmVkKCAkdmVyICkgKSB7CisgICAgICAgICAgICAkdmVyc2lvbiA9ICR2ZXIgLiAoIGRlZmluZWQoICRibGQgKSA/ICIgKCRibGQpIiA6ICIiICk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB3YXJuaW5nKCAiQ2Fubm90IHBhcnNlIEdOVSBjb21waWxlciB2ZXJzaW9uOiIsICRzdGRvdXQsICIoZW9mKSIgKTsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgaWYKKyAgICBwdXNoKCBAcmV0LCAkdmVyc2lvbiApOworICAgIHJldHVybiBAcmV0OworfTsgIyBzdWIgZ2V0X2dudV9jb21waWxlcl92ZXJzaW9uCisKKworc3ViIGdldF9jbGFuZ19jb21waWxlcl92ZXJzaW9uKCQpIHsKKyAgICBteSAoICR0b29sICkgPSBAXzsKKyAgICBteSAoIEByZXQgKSA9ICggJHRvb2wgKTsKKyAgICBteSAoICRyYywgJHN0ZG91dCwgJHN0ZGVyciwgJHZlcnNpb24gKTsKKyAgICAkcmMgPSBydW4oIFsgJHRvb2wsICItLXZlcnNpb24iIF0sICRzdGRvdXQsICRzdGRlcnIgKTsKKyAgICBpZiAoICRyYyA+PSAwICkgeworICAgICAgICBteSAoICR2ZXIsICRibGQgKTsKKyAgICAgICAgaWYgKCAkdGFyZ2V0X29zIGVxICJtYWMiICkgeworICAgICAgICAgICAgIyBBcHBsZSBMTFZNIHZlcnNpb24gNC4yIChjbGFuZy00MjUuMC4yOCkgKGJhc2VkIG9uIExMVk0gMy4yc3ZuKQorICAgICAgICAgICAgJHN0ZG91dCA9fiBte14uKj8gKFxkK1wuXGQrKSBcKC4qLShcZCtcLlxkK1wuXGQrKVwpfW07CisgICAgICAgICAgICAoICR2ZXIsICRibGQgKSA9ICggJDEsICQyICk7CisgICAgICAgICAgICAjIEZvciBjdXN0b20gY2xhbmcgdmVyc2lvbnMuCisgICAgICAgICAgICBpZiAoIG5vdCBkZWZpbmVkKCR2ZXIpIGFuZCAkc3Rkb3V0ID1+IG17Xi4qPyAoXGQrXC5cZCspKCBcKCguKilcKSk/fW0gKSB7CisgICAgICAgICAgICAgICAgKCAkdmVyLCAkYmxkICkgPSAoICQxLCAkMyApOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCAwICkgeworICAgICAgICAgICAgfSBlbHNpZiAoICRzdGRvdXQgPX4gbXteLio/IChcZCtcLlxkKykoIFwoKC4qKVwpKT99bSApIHsKKyAgICAgICAgICAgICAgICAjIGNsYW5nIHZlcnNpb24gMy4zICh0YWdzL1JFTEVBU0VfMzMvZmluYWwpCisgICAgICAgICAgICAgICAgKCAkdmVyLCAkYmxkICkgPSAoICQxLCAkMyApOworICAgICAgICAgICAgfSAKKyAgICAgICAgfTsgIyBpZgorICAgICAgICBpZiAoIGRlZmluZWQoICR2ZXIgKSApIHsKKyAgICAgICAgICAgICR2ZXJzaW9uID0gJHZlciAuICggZGVmaW5lZCggJGJsZCApID8gIiAoJGJsZCkiIDogIiIgKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHdhcm5pbmcoICJDYW5ub3QgcGFyc2UgQ2xhbmcgY29tcGlsZXIgdmVyc2lvbjoiLCAkc3Rkb3V0LCAiKGVvZikiICk7CisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGlmCisgICAgcHVzaCggQHJldCwgJHZlcnNpb24gKTsKKyAgICByZXR1cm4gQHJldDsKK307ICMgc3ViIGdldF9nbnVfY29tcGlsZXJfdmVyc2lvbgorCisKK3N1YiBnZXRfbXNfY29tcGlsZXJfdmVyc2lvbigpIHsKKyAgICBteSAoICRyYywgJHN0ZG91dCwgJHN0ZGVyciwgJHZlcnNpb24gKTsKKyAgICBteSAkdG9vbCA9ICJjbCI7CisgICAgbXkgKCBAcmV0ICkgPSAoICR0b29sICk7CisgICAgbXkgJG1jX2FyY2hzID0geworICAgICAgICBxcns4MHg4Nnx4ODZ9ICAgICA9PiAiSUEtMzIgYXJjaGl0ZWN0dXJlIiwKKyAgICAgICAgcXJ7QU1ENjR8eDY0fSAgICAgPT4gIkludGVsKFIpIDY0IiwKKyAgICB9OworICAgICRyYyA9IHJ1biggWyAkdG9vbCBdLCAkc3Rkb3V0LCAkc3RkZXJyICk7CisgICAgaWYgKCAkcmMgPCAwICkgeworICAgICAgICByZXR1cm4gQHJldDsKKyAgICB9OyAjIGlmCisgICAgaWYgKCAkc3RkZXJyICF+IG17Xk1pY3Jvc29mdCAuKiBDb21waWxlciBWZXJzaW9uICguKj8pIGZvciAoLiopXHMqJH1tICkgeworICAgICAgICB3YXJuaW5nKCAiQ2Fubm90IHBhcnNlIE1TIGNvbXBpbGVyIG91dHB1dDoiLCAkc3RkZXJyLCAiKGVvZikiICk7CisgICAgICAgIHJldHVybiBAcmV0OworICAgIH07ICMgaWYKKyAgICBteSAoICR2ZXIsICRhcGwgKSA9ICggJDEsICQyICk7CisgICAgaWYgKCAkdmVyICF+IG17XEFcZCsoPzpcLlxkKykrXHp9ICkgeworICAgICAgICB3YXJuaW5nKCAiQ2Fubm90IHBhcnNlIE1TIGNvbXBpbGVyIHZlcnNpb246ICR2ZXIiICk7CisgICAgICAgIHJldHVybiBAcmV0OworICAgIH07ICMgaWYKKyAgICBteSAkbWNfYXJjaCA9IGdldF9hcmNoKCAiTVMgY29tcGlsZXIiLCAkYXBsLCAkbWNfYXJjaHMgKTsKKyAgICBpZiAoIG5vdCBkZWZpbmVkKCAkbWNfYXJjaCApICkgeworICAgICAgICByZXR1cm4gQHJldDsKKyAgICB9OyAjIGlmCisgICAgaWYgKCBQbGF0Zm9ybTo6Y2Fub25fYXJjaCggJG1jX2FyY2ggKSBuZSAkdGFyZ2V0X2FyY2ggKSB7CisgICAgICAgIHdhcm5pbmcoICJUYXJnZXQgYXJjaGl0ZWN0dXJlIGlzICR0YXJnZXRfYXJjaCwgJHRvb2wgZm9yICRtY19hcmNoIGZvdW5kIiApOworICAgICAgICByZXR1cm4gQHJldDsKKyAgICB9OyAjIGlmCisgICAgJHZlcnNpb24gPSAiJHZlciBmb3IgJHRhcmdldF9hcmNoIjsKKyAgICBwdXNoKCBAcmV0LCAkdmVyc2lvbiApOworICAgIHJldHVybiBAcmV0OworfTsgIyBzdWIgZ2V0X21zX2NvbXBpbGVyX3ZlcnNpb24KKworCitzdWIgZ2V0X21zX2xpbmtlcl92ZXJzaW9uKCkgeworICAgIG15ICggJHJjLCAkc3Rkb3V0LCAkc3RkZXJyLCAkdmVyc2lvbiApOworICAgIG15ICR0b29sID0gImxpbmsiOworICAgIG15ICggQHJldCApID0gKCAkdG9vbCApOworICAgIG15ICggJHBhdGggKTsKKyAgICAkcmMgPSBydW4oIFsgJHRvb2wgXSwgJHN0ZG91dCwgJHN0ZGVyciwgJHBhdGggKTsKKyAgICBpZiAoICRyYyA8IDAgKSB7CisgICAgICAgIHJldHVybiBAcmV0OworICAgIH07ICMgaWYKKyAgICBpZiAoICRzdGRvdXQgIX4gbXteTWljcm9zb2Z0IFwoUlwpIEluY3JlbWVudGFsIExpbmtlciBWZXJzaW9uIChcZCsoPzpcLlxkKykrKVxzKiR9bSApIHsKKyAgICAgICAgd2FybmluZyggIkNhbm5vdCBwYXJzZSBNUyBsaW5rZXIgb3V0cHV0OiIsICRzdGRvdXQsICIoZW9mKSIgKTsKKyAgICAgICAgaWYgKCAkc3RkZXJyID1+IG17Xmxpbms6IG1pc3Npbmcgb3BlcmFuZH0gKSB7CisgICAgICAgICAgICB3YXJuaW5nKCAiU2VlbXMgXCIkcGF0aFwiIGlzIGEgVW5peC1saWtlIFwibGlua1wiIHByb2dyYW0sIG5vdCBNUyBsaW5rZXIuIiApOworICAgICAgICB9OyAjIGlmCisgICAgICAgIHJldHVybiBAcmV0OworICAgIH07ICMgaWYKKyAgICAkdmVyc2lvbiA9ICggJDEgKTsKKyAgICBwdXNoKCBAcmV0LCAkdmVyc2lvbiApOworICAgIHJldHVybiBAcmV0OworfTsgIyBzdWIgZ2V0X21zX2xpbmtlcl92ZXJzaW9uCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAibWFpbiIgcHJvZ3JhbS4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworbXkgJG1ha2U7CitteSAkaW50ZWwgICAgICAgPSAxOyAgICAgICAgICAgICAjIENoZWNrIEludGVsIGNvbXBpbGVycy4KK215ICRmb3J0cmFuICAgICA9IDA7ICAgICAgICAgICAgICMgQ2hlY2sgZm9yIGNvcnJlc3BvbmRpbmcgRm9ydHJhbiBjb21waWxlciwgaWZvcnQgZm9yIGludGVsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZm9ydHJhbiBmb3IgZ251IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZm9ydHJhbiBmb3IgY2xhbmcgCitteSAkY2xhbmcgICAgICAgPSAwOyAgICAgICAgICAgICAjIENoZWNrIENsYW5nIENvbXBpbGVycy4KK215ICRpbnRlbF9jb21waWxlcnMgPSB7CisgICAgImxpbiIgPT4geyBjID0+ICJpY2MiLCBjcHAgPT4gImljcGMiLCBmID0+ICJpZm9ydCIgfSwKKyAgICAibHJiIiA9PiB7IGMgPT4gImljYyIsIGNwcCA9PiAiaWNwYyIsIGYgPT4gImlmb3J0IiB9LAorICAgICJtYWMiID0+IHsgYyA9PiAiaWNjIiwgY3BwID0+ICJpY3BjIiwgZiA9PiAiaWZvcnQiIH0sCisgICAgIndpbiIgPT4geyBjID0+ICJpY2wiLCBjcHAgPT4gdW5kZWYsICBmID0+ICJpZm9ydCIgfSwKK307CitteSAkZ251X2NvbXBpbGVycyA9IHsKKyAgICAibGluIiA9PiB7IGMgPT4gImdjYyIsIGNwcCA9PiAgImcrKyIsIGYgPT4gImdmb3J0cmFuIiB9LAorICAgICJtYWMiID0+IHsgYyA9PiAiZ2NjIiwgY3BwID0+ICAiZysrIiwgZiA9PiAiZ2ZvcnRyYW4iIH0sCit9OworbXkgJGNsYW5nX2NvbXBpbGVycyA9IHsKKyAgICAibGluIiA9PiB7IGMgPT4gImNsYW5nIiwgY3BwID0+ICAiY2xhbmcrKyIgfSwKKyAgICAibWFjIiA9PiB7IGMgPT4gImNsYW5nIiwgY3BwID0+ICAiY2xhbmcrKyIgfSwKK307CisKK2dldF9vcHRpb25zKAorICAgIFBsYXRmb3JtOjp0YXJnZXRfb3B0aW9ucygpLAorICAgICJpbnRlbCEiICAgICAgICAgPT4gXCRpbnRlbCwKKyAgICAiZm9ydHJhbiIgICAgICAgID0+IFwkZm9ydHJhbiwKKyAgICAiY2xhbmciICAgICAgICAgID0+IFwkY2xhbmcsCisgICAgIm1ha2UiICAgICAgICAgICA9PiBcJG1ha2UsCisgICAgInBlZGFudGljIiAgICAgICA9PiBcJHBlZGFudGljLAorKTsKKworbXkgQHZlcnNpb25zOworcHVzaCggQHZlcnNpb25zLCBbICJQZXJsIiwgICAgIGdldF9wZXJsX3ZlcnNpb24oKSBdICk7CitwdXNoKCBAdmVyc2lvbnMsIFsgIkdOVSBNYWtlIiwgZ2V0X2dudV9tYWtlX3ZlcnNpb24oKSBdICk7CitpZiAoICRpbnRlbCApIHsKKyAgICBteSAkaWMgPSAkaW50ZWxfY29tcGlsZXJzLT57ICR0YXJnZXRfb3MgfTsKKyAgICBwdXNoKCBAdmVyc2lvbnMsIFsgIkludGVsIEMgQ29tcGlsZXIiLCAgICAgICBnZXRfaW50ZWxfY29tcGlsZXJfdmVyc2lvbiggJGljLT57IGMgfSApIF0gKTsKKyAgICBpZiAoIGRlZmluZWQoICRpYy0+eyBjcHAgfSApICkgeworICAgICAgICAjIElmIEludGVsIEMrKyBjb21waWxlciBoYXMgYSBuYW1lIGRpZmZlcmVudCBmcm9tIEMgY29tcGlsZXIsIGNoZWNrIGl0IGFzIHdlbGwuCisgICAgICAgIHB1c2goIEB2ZXJzaW9ucywgWyAiSW50ZWwgQysrIENvbXBpbGVyIiwgZ2V0X2ludGVsX2NvbXBpbGVyX3ZlcnNpb24oICRpYy0+eyBjcHAgfSApIF0gKTsKKyAgICB9OyAjIGlmCisgICAgIyBmb3J0cmFuIGNoZWNrIG11c3QgYmUgZXhwbGljaXRseSBzcGVjaWZpZWQgb24gY29tbWFuZCBsaW5lIHdpdGggLS1mb3J0cmFuCisgICAgaWYgKCAkZm9ydHJhbiApIHsKKyAgICAgICAgaWYgKCBkZWZpbmVkKCAkaWMtPnsgZiB9ICkgKSB7CisgICAgICAgICAgICBwdXNoKCBAdmVyc2lvbnMsIFsgIkludGVsIEZvcnRyYW4gQ29tcGlsZXIiLCBnZXRfaW50ZWxfY29tcGlsZXJfdmVyc2lvbiggJGljLT57IGYgfSApIF0gKTsKKyAgICAgICAgfTsgIyBpZgorICAgIH07Cit9OyAjIGlmCitpZiAoICR0YXJnZXRfb3MgZXEgImxpbiIgb3IgJHRhcmdldF9vcyBlcSAibWFjIiApIHsKKyAgICAjIGNoZWNrIGZvciBjbGFuZy9nbnUgdG9vbHMgYmVjYXVzZSB0b3VjaC10ZXN0LmMgaXMgY29tcGlsZWQgd2l0aCB0aGVtLgorICAgIGlmICggJGNsYW5nIG9yICR0YXJnZXRfb3MgZXEgIm1hYyIgKSB7ICMgT1MgWCogPj0gMTAuOSBkaXNjYXJkZWQgR05VIGNvbXBpbGVycy4KKyAgICAgICAgcHVzaCggQHZlcnNpb25zLCBbICJDbGFuZyBDIENvbXBpbGVyIiwgICAgIGdldF9jbGFuZ19jb21waWxlcl92ZXJzaW9uKCAkY2xhbmdfY29tcGlsZXJzLT57ICR0YXJnZXRfb3MgfS0+eyBjICAgfSApIF0gKTsKKyAgICAgICAgcHVzaCggQHZlcnNpb25zLCBbICJDbGFuZyBDKysgQ29tcGlsZXIiLCAgIGdldF9jbGFuZ19jb21waWxlcl92ZXJzaW9uKCAkY2xhbmdfY29tcGlsZXJzLT57ICR0YXJnZXRfb3MgfS0+eyBjcHAgfSApIF0gKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwdXNoKCBAdmVyc2lvbnMsIFsgIkdOVSBDIENvbXBpbGVyIiwgICAgIGdldF9nbnVfY29tcGlsZXJfdmVyc2lvbiggJGdudV9jb21waWxlcnMtPnsgJHRhcmdldF9vcyB9LT57IGMgICB9ICkgXSApOworICAgICAgICBwdXNoKCBAdmVyc2lvbnMsIFsgIkdOVSBDKysgQ29tcGlsZXIiLCAgIGdldF9nbnVfY29tcGlsZXJfdmVyc2lvbiggJGdudV9jb21waWxlcnMtPnsgJHRhcmdldF9vcyB9LT57IGNwcCB9ICkgXSApOworICAgIH07CisgICAgIyBpZiBpbnRlbCBmb3J0cmFuIGhhcyBiZWVuIGNoZWNrZWQgdGhlbiBnbnUgZm9ydHJhbiBpcyB1bm5lY2Vzc2FyeQorICAgICMgYWxzbywgaWYgdXNlciBzcGVjaWZpZXMgY2xhbmcgYXMgYnVpbGQgY29tcGlsZXIsIHRoZW4gZ2ZvcnRyYW4gaXMgYXNzdW1lZCBmb3J0cmFuIGNvbXBpbGVyCisgICAgaWYgKCAkZm9ydHJhbiBhbmQgbm90ICRpbnRlbCApIHsKKyAgICAgICAgcHVzaCggQHZlcnNpb25zLCBbICJHTlUgRm9ydHJhbiBDb21waWxlciIsIGdldF9nbnVfY29tcGlsZXJfdmVyc2lvbiggJGdudV9jb21waWxlcnMtPnsgJHRhcmdldF9vcyB9LT57IGYgfSApIF0gKTsKKyAgICB9OyAKK307IAoraWYgKCAkdGFyZ2V0X29zIGVxICJ3aW4iICkgeworICAgIHB1c2goIEB2ZXJzaW9ucywgWyAiTVMgQy9DKysgQ29tcGlsZXIiLCAgZ2V0X21zX2NvbXBpbGVyX3ZlcnNpb24oKSBdICk7CisgICAgcHVzaCggQHZlcnNpb25zLCBbICJNUyBMaW5rZXIiLCAgICAgICAgICBnZXRfbXNfbGlua2VyX3ZlcnNpb24oKSBdICk7Cit9OyAjIGlmCisKK215ICRjb3VudCA9IDA7Citmb3JlYWNoIG15ICRpdGVtICggQHZlcnNpb25zICkgeworICAgIG15ICggJHRpdGxlLCAkdG9vbCwgJHZlcnNpb24gKSA9IEAkaXRlbTsKKyAgICBpZiAoIG5vdCBkZWZpbmVkKCAkdmVyc2lvbiApICkgeworICAgICAgICAkdmVyc2lvbiA9ICItLS0gTi9BIC0tLSI7CisgICAgICAgICsrICRjb3VudDsKKyAgICB9OyAjIGlmCisgICAgaWYgKCAkbWFrZSApIHsKKyAgICAgICAgcHJpbnRmKCAiJXM9JXNcbiIsIGVuY29kZSggJHRvb2wgKSwgZW5jb2RlKCAkdmVyc2lvbiApICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCAiJS0yNXM6ICVzXG4iLCAkdGl0bGUsICR2ZXJzaW9uICk7CisgICAgfTsgIyBpZgorfTsgIyBmb3JlYWNoCisKK2V4aXQoICRjb3VudCA9PSAwID8gMCA6IDEgKTsKKworX19FTkRfXworCis9cG9kCisKKz1oZWFkMSBOQU1FCisKK0I8Y2hlY2stdG9vbHMucGw+IC0tIENoZWNrIGRldmVsb3BtZW50IHRvb2xzIGF2YWlsYWJpbGl0eSBhbmQgdmVyc2lvbnMuCisKKz1oZWFkMSBTWU5PUFNJUworCitCPGNoZWNrLXRvb2xzLnBsPiBJPE9QVElPTj4uLi4KKworPWhlYWQxIE9QVElPTlMKKworPW92ZXIKKworPWl0ZW0gQjwtLW1ha2U+CisKK1Byb2R1Y2Ugb3V0cHV0IHN1aXRhYmxlIGZvciB1c2luZyBpbiBtYWtlZmlsZTogc2hvcnQgdG9vbCBuYW1lcyAoZS4gZy4gImljYyIgaW5zdGVhZCBvZiAiSW50ZWwgQworQ29tcGlsZXIiKSwgc3BhY2VzIGluIHZlcnNpb24gc3RyaW5ncyByZXBsYWNlZCB3aXRoIHVuZGVyc2NvcmVzLgorCis9aXRlbSBUb29scyBzZWxlY3Rpb24KKworPW92ZXIKKworPWl0ZW0gQjwtLT5bQjxuby0+XUI8LWdudS1mb3J0cmFuPgorCitDaGVjayBHTlUgRm9ydHJhbiBjb21waWxlci4gQnkgZGVmYXVsdCwgaXQgaXMgbm90IGNoZWNrZWQuCisKKz1pdGVtIEI8LS0+W0I8bm8tPl1CPGludGVsPgorCitDaGVjayBJbnRlbCBDLCBDKysgYW5kIEZvcnRyYW4gY29tcGlsZXJzLiBUaGlzIGlzIGRlZmF1bHQuCisKKz1iYWNrCisKKz1pdGVtIFBsYXRmb3JtIHNlbGVjdGlvbgorCis9b3ZlcgorCis9aXRlbSBCPC0tYXJjaGl0ZWN0dXJlPT5JPHN0cj4KKworU3BlY2lmeSB0YXJnZXQgYXJjaGl0ZWN0dXJlLiBVc2VkIGluIGNyb3NzLWJ1aWxkcywgZm9yIGV4YW1wbGUgd2hlbiBidWlsZGluZyAzMi1iaXQgYXBwbGljYXRpb25zIG9uCitJbnRlbChSKSA2NCBtYWNoaW5lLgorCitJZiBhcmNoaXRlY3R1cmUgaXMgbm90IHNwZWNpZmllZCBleHBsaWNpdGx5LCB2YWx1ZSBvZiBMSUJPTVBfQVJDSCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyB1c2VkLgorSWYgTElCT01QX0FSQ0ggaXMgbm90IGRlZmluZWQsIGhvc3QgYXJjaGl0ZWN0dXJlIGRldGVjdGVkLgorCis9aXRlbSBCPC0tb3M9Pkk8c3RyPgorCitTcGVjaWZ5IHRhcmdldCBPUyBuYW1lLiBVc2VkIGluIGNyb3NzLWJ1aWxkcywgZm9yIGV4YW1wbGUgd2hlbiBidWlsZGluZyBJbnRlbChSKSBNYW55IEludGVncmF0ZWQgQ29yZSBBcmNoaXRlY3R1cmUgYXBwbGljYXRpb25zIG9uCitXaW5kb3dzKiBPUy4KKworSWYgT1MgaXMgbm90IHNwZWNpZmllZCBleHBsaWNpdGx5LCB2YWx1ZSBvZiBMSUJPTVBfT1MgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgdXNlZC4KK0lmIExJQk9NUF9PUyBpcyBub3QgZGVmaW5lZCwgaG9zdCBPUyBkZXRlY3RlZC4KKworPWJhY2sKKworPWJhY2sKKworPWhlYWQyIFN0YW5kYXJkIE9wdGlvbnMKKworPW92ZXIKKworPWl0ZW0gQjwtLWRvYz4KKworPWl0ZW0gQjwtLW1hbnVhbD4KKworUHJpbnQgZnVsbCBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQuCisKKz1pdGVtIEI8LS1oZWxwPgorCitQcmludCBzaG9ydCBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQuCisKKz1pdGVtIEI8LS11c2FnZT4KKworUHJpbnQgdmVyeSBzaG9ydCB1c2FnZSBtZXNzYWdlIGFuZCBleGl0LgorCis9aXRlbSBCPC0tdmVyYm9zZT4KKworRG8gcHJpbnQgaW5mb3JtYXRpb25hbCBtZXNzYWdlcy4KKworPWl0ZW0gQjwtLXZlcnNpb24+CisKK1ByaW50IHZlcnNpb24gYW5kIGV4aXQuCisKKz1pdGVtIEI8LS1xdWlldD4KKworV29yayBxdWlldCwgZG8gbm90IHByaW50IGluZm9ybWF0aW9uYWwgbWVzc2FnZXMuCisKKz1iYWNrCisKKz1oZWFkMSBERVNDUklQVElPTgorCitUaGlzIHNjcmlwdCBjaGVja3MgYXZhaWxhYmlsaXR5IGFuZCB2ZXJzaW9ucyBvZiBkZXZlbG9wbWVudCB0b29scy4gQnkgZGVmYXVsdCwgdGhlIHNjcmlwdCBjaGVja3M6CitQZXJsLCBHTlUgTWFrZSwgSW50ZWwgY29tcGlsZXJzLCBHTlUgQyBhbmQgQysrIGNvbXBpbGVycyAoTGludXgqIE9TIGFuZCBPUyBYKiksCitNaWNyb3NvZnQgQy9DKysgY29tcGlsZXIgYW5kIGxpbmtlciAoV2luZG93cyogT1MpLgorCitUaGUgc3JpcHQgcHJpbnRzIG5pY2UgbG9va2luZyB0YWJsZSBvciBtYWNoaW5lLXJlYWRhYmxlIHN0cmluZ3MuCisKKz1oZWFkMiBFWElUCisKKz1vdmVyCisKKz1pdGVtICoKKworMCAtLSBBbGwgcHJvZ3JhbXMgZm91bmQuCisKKz1pdGVtICoKKworMSAtLSBTb21lIG9mIHRvb2xzIGFyZSBub3QgZm91bmQuCisKKz1iYWNrCisKKz1oZWFkMSBFWEFNUExFUworCisgICAgJCBjaGVjay10b29scy5wbAorICAgIFBlcmwgICAgICAgICAgICAgICAgICAgICA6IDUuOC4wCisgICAgR05VIE1ha2UgICAgICAgICAgICAgICAgIDogMy43OS4xCisgICAgSW50ZWwgQyBDb21waWxlciAgICAgICAgIDogMTEuMCAoMjAwODA5MzApIGZvciAzMmUKKyAgICBJbnRlbCBDKysgQ29tcGlsZXIgICAgICAgOiAxMS4wICgyMDA4MDkzMCkgZm9yIDMyZQorICAgIEludGVsIEZvcnRyYW4gQ29tcGlsZXIgICA6IDEwLjEuMDA4ICgyMDA3MDkxMykgZm9yIDMyZQorICAgIEdOVSBDIENvbXBpbGVyICAgICAgICAgICA6IDMuMi4zICgyMDAzMDUwMikKKyAgICBHTlUgQysrIENvbXBpbGVyICAgICAgICAgOiAzLjIuMyAoMjAwMzA1MDIpCisKKyAgICA+IGNoZWNrLXRvb2xzLnBsIC0tbWFrZQorICAgIHBlcmw9NS44LjgKKyAgICBtYWtlPTMuODEKKyAgICBpY2w9MTAuMV8oMjAwNzA5MTMpX2Zvcl8zMmUKKyAgICBpZm9ydD0xMC4xXygyMDA3MDkxMylfZm9yXzMyZQorICAgIGNsPTE0LjAwLjQwMzEwLjQxX2Zvcl8zMmUKKyAgICBsaW5rPTguMDAuNDAzMTAuMzkKKworPWJhY2sKKworPWN1dAorCisjIGVuZCBvZiBmaWxlICMKKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90b29scy9jb21tb24uaW5jIGIvZmluYWwvcnVudGltZS90b29scy9jb21tb24uaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiMTMyNTEKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rvb2xzL2NvbW1vbi5pbmMKQEAgLTAsMCArMSw5OCBAQAorIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworCitpZm5kZWYgb21wX29zCisKKyAgIyBXaW5kb3dzIHNldHMgZW52aXJvbm1lbnQgdmFyaWFibGUgT1M7IGZvciBvdGhlciBzeXN0ZW1zLCBhc2sgdW5hbWUKKyAgaWZlcSAoJChPUyksKQorICAgIE9TOj0kKHNoZWxsIHVuYW1lKQorICAgIGlmZXEgKCQoT1MpLCkKKyAgICAgICQoZXJyb3IgIkNhbm5vdCBkZXRlY3Qgb3BlcmF0aW5nIHN5c3RlbSIpCisgICAgZW5kaWYKKyAgICBleHBvcnQgb21wX29zPSQoT1MpCisgIGVuZGlmCisKKyAgaWZlcSAoJChPUyksIFdpbmRvd3NfTlQpCisgICAgZXhwb3J0IG9tcF9vcz13aW5kb3dzCisgIGVuZGlmCisgIGlmZXEgKCQoT1MpLCBMaW51eCkKKyAgICBleHBvcnQgb21wX29zPWxpbnV4CisgIGVuZGlmCisgIGlmZXEgKCQoT1MpLCBGcmVlQlNEKQorICAgIGV4cG9ydCBvbXBfb3M9ZnJlZWJzZAorICBlbmRpZgorICBpZmVxICgkKE9TKSwgRGFyd2luKQorICAgIGV4cG9ydCBvbXBfb3M9bWFjb3MKKyAgZW5kaWYKKworZW5kaWYgIyAhb21wX29zCisKKyMgQ29tcGlsaW5nIGZvciB0aGUgSW50ZWwoUikgTWFueSBJbnRlZ3JhdGVkIENvcmUgYXJjaGl0ZWN0dXJlIGlzIG5vbi10cml2aWFsIGF0IHRoZSBuZXh0IGxheWVyCisjIG9mIHNjcmlwdCBkb3duLCBidXQgd2UgY2FuIG1ha2UgaXQgY29uc2lzdGVudCBoZXJlLgoraWZlcSAiJChhcmNoKSIgIm1pYyIKKyAgICAjIEkgcmVhbGx5IGRvIG1lYW4gdGhpcy4uLgorICAgIG92ZXJyaWRlIGFyY2g6PTMyZQorICAgIG92ZXJyaWRlIG1pYzo9eWVzCitlbHNlCisgICAgb3ZlcnJpZGUgbWljOj1ubworZW5kaWYKKworaWZlcSAoLCQod2lsZGNhcmQgJChvbXBfcm9vdCkvdG9vbHMvJChvbXBfb3MpLmluYykpCisgICQoZXJyb3IgIiQob21wX29zKSIgaXMgbm90IHN1cHBvcnRlZC4gQWRkIHRvb2xzLyQob21wX29zKS5pbmMgZmlsZSB3aXRoIG9zLXNwZWNpZmljIHNldHRpbmdzICkKK2VuZGlmCisKKyMgZGV0ZWN0IGFyY2ggYW5kIHJ1bnRpbWUgdmVyc2lvbnMsIHByb3ZpZGUgY29tbW9uIGhvc3Qtc3BlY2lmaWMgZGVmaW5pdGlvbnMKK2luY2x1ZGUgJChvbXBfcm9vdCkvdG9vbHMvJChvbXBfb3MpLmluYworCitpZmVxICgkKGFyY2gpLCkKKyAkKGVycm9yIEFyY2hpdGVjdHVyZSBub3QgZGV0ZWN0ZWQpCitlbmRpZgorCisjIFNldHRpbmcgZGVmYXVsdHMKK21vZGU/PXJlbGVhc2UKKworaWZlcSAiJChmaWx0ZXIgMzIgMzJlIDY0LCQoYXJjaCkpIiAiIgorICAgIGNvbXBpbGVyPz1nY2MKK2Vsc2UKKyAgICBpZmVxICIkKG9tcF9vcykiICJ3aW5kb3dzIgorICAgICAgICBjb21waWxlcj89aWNsCisgICAgZWxzZQorICAgICAgICBjb21waWxlcj89aWNjCisgICAgZW5kaWYKK2VuZGlmCisKK2lmbmVxICIkKG1pYykiICJubyIKKyAgICBpZmVxICIkKGNvbXBpbGVyKSIgImdjYyIKKwkkKGVycm9yIENvbXBpbGluZyB0aGUgcnVudGltZSB3aXRoIGdjYyBpcyBub3Qgc3VwcG9ydGVkIG9uIEludGVsXChSXCkgTWFueSBJbnRlZ3JhdGVkIENvcmUgQXJjaGl0ZWN0dXJlKQorICAgIGVuZGlmCisKKyAgICAjIE1hZ2ljIGZsYWdzIGZvciB0aGUgYnVpbGQgc2NyaXB0IQorICAgIGJ1aWxkX2FyZ3MgKz0gLS1vcz1scmIgLS1taWMtYXJjaD1rbmMgLS1taWMtb3M9bGluIC0tbWljLWNvbXA9b2ZmbG9hZAorCisgICAgIyBDaGVjayB0aGF0IHRoZSBiaW51dGlscyBmb3IgSW50ZWwoUikgTWFueSBJbnRlZ3JhdGVkIENvcmUgQXJjaGl0ZWN0dXJlIGFyZSBhdmFpbGFibGUKKyAgICAjIEZpcnN0IHdlIHNlZSB3aGV0aGVyIHRoZSBvYmpkdW1wIG9uIHRoZSB1c2VyJ3MgcGF0aCBzdXBwb3J0cyB0aGUgazFvbSBhcmNoaXRlY3R1cmUuCisgICAgaGFzazFvbSA9ICQoc2hlbGwgaWYgKG9iamR1bXAgLS1oZWxwIHwgZ3JlcCAtcyBrMW9tKTsgdGhlbiBlY2hvIE9LOyBlbHNlIGVjaG8gS087IGZpKQorICAgIGlmbmVxICIkKGhhc2sxb20pIiAiT0siCisgICAgICAgICMgQXBwcm9wcmlhdGUgYmludXRpbHMgYXJlIG5vdCBhbHJlYWR5IHNldCB1cCwgc28gdHJ5IHRvIGFkZCB0aGVtIGZyb20gdGhlIGRlZmF1bHQgcGxhY2UuCisgICAgICAgIG1pY0JpblBhdGggPSAvdXNyL2xpbnV4LWsxb20tNC43L3g4Nl82NC1rMW9tLWxpbnV4L2JpbgorICAgICAgICBtaWNCaW5QcmVzZW50ID0gJChzaGVsbCBpZiB0ZXN0IC1kICQobWljQmluUGF0aCk7IHRoZW4gZWNobyBPSzsgZWxzZSBlY2hvIEtPOyBmaSkKKyAgICAgICAgaWZuZXEgIiQobWljQmluUHJlc2VudCkiICJPSyIKKyAgICAgICAgICAgICMgV2UgY2FuJ3QgZmluZCB0aGVtIGluIHRoZSBub3JtYWwgcGxhY2UsIHNvIGNvbXBsYWluLgorICAgICAgICAgICAgJChlcnJvciBDb21waWxpbmcgZm9yIEludGVsXChSXCkgTWFueSBJbnRlZ3JhdGVkIENvcmUgQXJjaGl0ZWN0dXJlIHJlcXVpcmVzIHRoYXQgdGhlIGNyb3NzLWhvc3RlZCBiaW51dGlscyBhcmUgYXZhaWxhYmxlIGluICQobWljQmluUGF0aCkuXAorU2VlIHRoZSBUb29scyB0YWIgYXQgaHR0cDovL3NvZnR3YXJlLmludGVsLmNvbS9taWMtZGV2ZWxvcGVyKQorICAgICAgICBlbmRpZgorICAgICAgICBleHBvcnQgUEFUSCA6PSAkKG1pY0JpblBhdGgpOiR7UEFUSH0KKyAgICBlbmRpZgorZW5kaWYKKworZXhwb3J0IEJVSUxEX0NPTVBJTEVSIDo9ICQoY29tcGlsZXIpCisKKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90b29scy9leHBhbmQtdmFycy5wbCBiL2ZpbmFsL3J1bnRpbWUvdG9vbHMvZXhwYW5kLXZhcnMucGwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDBhNjQ5MAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdG9vbHMvZXhwYW5kLXZhcnMucGwKQEAgLTAsMCArMSwzMDYgQEAKKyMhL3Vzci9iaW4vcGVybAorCisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7CisKK3VzZSBGaW5kQmluOwordXNlIGxpYiAiJEZpbmRCaW46OkJpbi9saWIiOworCit1c2UgdG9vbHM7CisKK291ciAkVkVSU0lPTiA9ICIwLjAwNSI7CisKK215ICRuYW1lX3JleHAgICAgPSBxcntbQS1aYS16X10rW0EtWmEtejAtOV9dKn07CitteSAka2V5d29yZF9yZXhwID0gcXJ7aWZ8ZWxzZXxlbmR8b21wfTsKKworc3ViIGVycm9yKCQkJCkgeworICAgIG15ICggJGlucHV0LCAkbXNnLCAkYnVsayApID0gQF87CisgICAgbXkgJHBvcyA9IHBvcyggJCRidWxrICk7CisgICAgJCRidWxrID1+IG17XiguKj8pXEcoLio/KSR9bSBvciBkaWUgIkludGVybmFsIGVycm9yIjsKKyAgICBteSAoICRwcmUsICRwb3N0ICkgPSAoICQxLCAkMiApOworICAgIG15ICRuID0gc2NhbGFyKCBAeyBbIHN1YnN0ciggJCRidWxrLCAwLCAkcG9zICkgPX4gbXtcbn1nIF0gfSApICsgMTsKKyAgICBydW50aW1lX2Vycm9yKCAiXCIkaW5wdXRcIiBsaW5lICRuOiAkbXNnOiIsICI+Pj4gIiAuICRwcmUgLiAiLS1bSEVSRV0tLT4iIC4gJHBvc3QgKTsKK307ICMgc3ViIGVycm9yCisKK3N1YiBldmFsdWF0ZSgkJCRcJCkgeworICAgIG15ICggJGV4cHIsICRzdHJpY3QsICRpbnB1dCwgJGJ1bGsgKSA9IEBfOworICAgIG15ICR2YWx1ZTsKKyAgICB7ICMgU2lnbmFsIGhhbmRsZXIgd2lsbCBiZSByZXN0b3JlZCBvbiBleGl0IGZyb20gdGhpcyBibG9jay4KKyAgICAgICAgIyBJbiBjYXNlIG9mICJ1c2Ugc3RyaWN0OyB1c2Ugd2FybmluZ3MiIGV2YWwgaXNzdWVzIHdhcm5pbmdzIHRvIHN0ZGVyci4gVGhpcyBkaXJlY3QKKyAgICAgICAgIyBvdXRwdXQgbWF5IGNvbmZ1c2UgdXNlciwgc28gd2UgbmVlZCB0byBjYXRjaCBpdCBhbmQgcHJlcGVuZCB3aXRoIG91ciBpbmZvLgorICAgICAgICBsb2NhbCAkU0lHeyBfX1dBUk5fXyB9ID0gc3ViIHsgZGllIEBfOyB9OworICAgICAgICAkdmFsdWUgPQorICAgICAgICAgICAgZXZhbCgKKyAgICAgICAgICAgICAgICAicGFja2FnZSBfX0VYUEFORF9WQVJTX187XG4iIC4KKyAgICAgICAgICAgICAgICAoICRzdHJpY3QgPyAidXNlIHN0cmljdDsgdXNlIHdhcm5pbmdzO1xuIiA6ICJubyBzdHJpY3Q7IG5vIHdhcm5pbmdzO1xuIiApIC4KKyAgICAgICAgICAgICAgICAkZXhwcgorICAgICAgICAgICAgKTsKKyAgICB9OworICAgIGlmICggJEAgKSB7CisgICAgICAgICMgRHJvcCBsb2NhdGlvbiBpbmZvcm1hdGlvbiAtLSBpbmNyZWFzaW5nIGV2YWwgbnVtYmVyIGFuZCBjb25zdGFudCAibGluZSAzIgorICAgICAgICAjIGlzIHVzZWxlc3MgZm9yIHRoZSB1c2VyLgorICAgICAgICAkQCA9fiBzeyBhdCBcKGV2YWwgXGQrXCkgbGluZSBcZCt9e31nOworICAgICAgICAkQCA9fiBze1xzKlx6fXt9OworICAgICAgICBlcnJvciggJGlucHV0LCAiQ2Fubm90IGV2YWx1YXRlIGV4cHJlc3Npb24gXCJcJHt7JGV4cHJ9fVwiOiAkQCIsICRidWxrICk7CisgICAgfTsgIyBpZgorICAgIGlmICggJHN0cmljdCBhbmQgbm90IGRlZmluZWQoICR2YWx1ZSApICkgeworICAgICAgICBlcnJvciggJGlucHV0LCAiU3Vic3RpdHV0aW9uIHZhbHVlIGlzIHVuZGVmaW5lZCIsICRidWxrICk7CisgICAgfTsgIyBpZgorICAgIHJldHVybiAkdmFsdWU7Cit9OyAjIHN1YiBldmFsdWF0ZQorCisjCisjIFBhcnNlIGNvbW1hbmQgbGluZS4KKyMKKworbXkgKCBAZGVmaW5lcywgJGlucHV0LCAkb3V0cHV0LCAkc3RyaWN0ICk7CitnZXRfb3B0aW9ucygKKyAgICAiRHxkZWZpbmU9cyIgPT4gXEBkZWZpbmVzLAorICAgICJzdHJpY3QhIiAgICA9PiBcJHN0cmljdCwKKyk7CitpZiAoIEBBUkdWIDwgMiApIHsKKyAgICBjbWRsaW5lX2Vycm9yKCAiTm90IGVub3VnaCBhcmd1bWVudCIgKTsKK307ICMgaWYKK2lmICggQEFSR1YgPiAyICkgeworICAgIGNtZGxpbmVfZXJyb3IoICJUb28gbWFueSBhcmd1bWVudChzKSIgKTsKK307ICMgaWYKKyggJGlucHV0LCAkb3V0cHV0ICkgPSBAQVJHVjsKKworZm9yZWFjaCBteSAkZGVmaW5lICggQGRlZmluZXMgKSB7CisgICAgbXkgKCAkZXF1YWwsICRuYW1lLCAkdmFsdWUgKTsKKyAgICAkZXF1YWwgPSBpbmRleCggJGRlZmluZSwgIj0iICk7CisgICAgaWYgKCAkZXF1YWwgPCAwICkgeworICAgICAgICAkbmFtZSA9ICRkZWZpbmU7CisgICAgICAgICR2YWx1ZSA9ICIiOworICAgIH0gZWxzZSB7CisgICAgICAgICRuYW1lID0gc3Vic3RyKCAkZGVmaW5lLCAwLCAkZXF1YWwgKTsKKyAgICAgICAgJHZhbHVlID0gc3Vic3RyKCAkZGVmaW5lLCAkZXF1YWwgKyAxICk7CisgICAgfTsgIyBpZgorICAgIGlmICggJG5hbWUgZXEgIiIgKSB7CisgICAgICAgIGNtZGxpbmVfZXJyb3IoICJJbGxlZ2FsIGRlZmluaXRpb246IFwiJGRlZmluZVwiOiB2YXJpYWJsZSBuYW1lIHNob3VsZCBub3QgYmUgZW1wdHkuIiApOworICAgIH07ICMgaWYKKyAgICBpZiAoICRuYW1lICF+IG17XEEkbmFtZV9yZXhwXHp9ICkgeworICAgICAgICBjbWRsaW5lX2Vycm9yKAorICAgICAgICAgICAgIklsbGVnYWwgZGVmaW5pdGlvbjogXCIkZGVmaW5lXCI6ICIgLgorICAgICAgICAgICAgICAgICJ2YXJpYWJsZSBuYW1lIHNob3VsZCBjb25zaXN0IG9mIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLiIKKyAgICAgICAgKTsKKyAgICB9OyAjIGlmCisgICAgZXZhbCggIlwkX19FWFBBTkRfVkFSU19fOjokbmFtZSA9IFwkdmFsdWU7IiApOworICAgIGlmICggJEAgKSB7CisgICAgICAgIGRpZSggIkludGVybmFsIGVycm9yOiAkQCIgKTsKKyAgICB9OyAjIGlmCit9OyAjIGZvcmVhY2ggJGRlZmluZQorCisjCisjIERvIHRoZSB3b3JrLgorIworCitteSAkYnVsazsKKworIyBSZWFkIGlucHV0IGZpbGUuCiskYnVsayA9IHJlYWRfZmlsZSggJGlucHV0ICk7CisKKyMgRG8gdGhlIHJlcGxhY2VtZW50cy4KKyRidWxrID1+CisgICAgc3soPzpcJCgka2V5d29yZF9yZXhwKXxcJCgkbmFtZV9yZXhwKXxcJHt7KC4qPyl9fSl9CisgICAgeworICAgICAgICBteSAkdmFsdWU7CisgICAgICAgIGlmICggZGVmaW5lZCggJDEgKSApIHsKKyAgICAgICAgICAgICMgS2V5d29yZC4gTGVhdmUgaXQgYXMgaXMuCisgICAgICAgICAgICAkdmFsdWUgPSAiXCQkMSI7CisgICAgICAgIH0gZWxzaWYgKCBkZWZpbmVkKCAkMiApICkgeworICAgICAgICAgICAgIyBWYXJpYWJsZSB0byBleHBhbmQuCisgICAgICAgICAgICBteSAkbmFtZSA9ICQyOworICAgICAgICAgICAgJHZhbHVlID0gZXZhbCggIlwkX19FWFBBTkRfVkFSU19fOjokbmFtZSIgKTsKKyAgICAgICAgICAgIGlmICggJEAgKSB7CisgICAgICAgICAgICAgICAgZGllKCAiSW50ZXJuYWwgZXJyb3IiICk7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICBpZiAoICRzdHJpY3QgYW5kIG5vdCBkZWZpbmVkKCAkdmFsdWUgKSApIHsKKyAgICAgICAgICAgICAgICBlcnJvciggJGlucHV0LCAiVmFyaWFibGUgXCJcJCRuYW1lXCIgbm90IGRlZmluZWQiLCBcJGJ1bGsgKTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICMgUGVybCBjb2RlIHRvIGV2YWx1YXRlLgorICAgICAgICAgICAgbXkgJGV4cHIgPSAkMzsKKyAgICAgICAgICAgICR2YWx1ZSA9IGV2YWx1YXRlKCAkZXhwciwgJHN0cmljdCwgJGlucHV0LCAkYnVsayApOworICAgICAgICB9OyAjIGlmCisgICAgICAgICR2YWx1ZTsKKyAgICB9Z2VzOworCisjIFByb2Nlc3MgY29uZGl0aW9uYWxzLgorIyBEaXJ0eSBwYXRjaCEgTmVzdGVkIGNvbmRpdGlvbmFscyBub3Qgc3VwcG9ydGVkIQorIyBUT0RPOiBJbXBsZW1lbnQgbmVzdGVkIGNvbnN0cnVjdHMuCiskYnVsayA9fgorICAgIHN7XlwkaWYgKyhbXlxuXSopICpcbiguKlxuKVwkZWxzZSAqXG4oLipcbilcJGVuZCAqXG59CisgICAgeworICAgICAgICBteSAoICRleHByLCAkdGhlbl9wYXJ0LCAkZWxzZV9wYXJ0ICkgPSAoICQxLCAkMiwgJDMgKTsKKyAgICAgICAgbXkgJHZhbHVlID0gZXZhbHVhdGUoICRleHByLCAkc3RyaWN0LCAkaW5wdXQsICRidWxrICk7CisgICAgICAgIGlmICggJHZhbHVlICkgeworICAgICAgICAgICAgJHZhbHVlID0gJHRoZW5fcGFydDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICR2YWx1ZSA9ICRlbHNlX3BhcnQ7CisgICAgICAgIH07ICMgaWYKKyAgICB9Z2VzbTsKKworIyBXcml0ZSBvdXRwdXQuCit3cml0ZV9maWxlKCAkb3V0cHV0LCBcJGJ1bGsgKTsKKworZXhpdCggMCApOworCitfX0VORF9fCisKKz1wb2QKKworPWhlYWQxIE5BTUUKKworQjxleHBhbmQtdmFycy5wbD4gLS0gU2ltcGxlIHRleHQgcHJlcHJvY2Vzc29yLgorCis9aGVhZDEgU1lOT1BTSVMKKworQjxleHBhbmQtdmFycy5wbD4gSTxPUFRJT04+Li4uIEk8aW5wdXQ+IEk8b3V0cHV0PgorCis9aGVhZDEgT1BUSU9OUworCis9b3ZlcgorCis9aXRlbSBCPC1EPiBJPG5hbWU+W0I8PT5JPHZhbHVlPl0KKworPWl0ZW0gQjwtLWRlZmluZT0+STxuYW1lPltCPD0+STx2YWx1ZT5dCisKK0RlZmluZSB2YXJpYWJsZS4KKworPWl0ZW0gQjwtLXN0cmljdD4KKworSW4gc3RyaWN0IG1vZGUsIHRoZSBzY3JpcHQgaXNzdWVzIGVycm9yIG9uIHVzaW5nIHVuZGVmaW5lZCB2YXJpYWJsZXMgYW5kIGV4ZWN1dGVzIFBlcmwgY29kZQord2l0aCBDPHVzZSBzdHJpY3Q7IHVzZSB3YXJuaW5nczs+IHByYWdtYXMuCisKKz1iYWNrCisKKz1oZWFkMiBTdGFuZGFyZCBPcHRpb25zCisKKz1vdmVyCisKKz1pdGVtIEI8LS1kb2M+CisKKz1pdGVtIEI8LS1tYW51YWw+CisKK1ByaW50IGZ1bGwgaGVscCBtZXNzYWdlIGFuZCBleGl0LgorCis9aXRlbSBCPC0taGVscD4KKworUHJpbnQgc2hvcnQgaGVscCBtZXNzYWdlIGFuZCBleGl0LgorCis9aXRlbSBCPC0tdXNhZ2U+CisKK1ByaW50IHZlcnkgc2hvcnQgdXNhZ2UgbWVzc2FnZSBhbmQgZXhpdC4KKworPWl0ZW0gQjwtLXZlcmJvc2U+CisKK0RvIHByaW50IGluZm9ybWF0aW9uYWwgbWVzc2FnZXMuCisKKz1pdGVtIEI8LS12ZXJzaW9uPgorCitQcmludCB2ZXJzaW9uIGFuZCBleGl0LgorCis9aXRlbSBCPC0tcXVpZXQ+CisKK1dvcmsgcXVpZXQsIGRvIG5vdCBwcmludCBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzLgorCis9YmFjaworCis9aGVhZDEgQVJHVU1FTlRTCisKKz1vdmVyCisKKz1pdGVtIEk8aW5wdXQ+CisKK0lucHV0IGZpbGUgbmFtZS4KKworPWl0ZW0gSTxvdXRwdXQ+CisKK091dHB1dCBmaWxlIG5hbWUuCisKKz1iYWNrCisKKz1oZWFkMSBERVNDUklQVElPTgorCitUaGlzIHNjcmlwdCByZWFkcyBpbnB1dCBmaWxlLCBtYWtlcyBzdWJzdGl0dXRlcyBhbmQgd3JpdGVzIG91dHB1dCBmaWxlLgorCitUaGVyZSBhcmUgdHdvIGZvcm0gb2Ygc3Vic3RpdHV0ZXM6CisKKz1vdmVyCisKKz1pdGVtIFZhcmlhYmxlcworCitWYXJpYWJsZXMgYXJlIHJlZmVyZW5jZWQgaW4gaW5wdXQgZmlsZSBpbiBmb3JtOgorCisgICAgJG5hbWUKKworTmFtZSBvZiB2YXJpYWJsZSBzaG91bGQgY29uc2lzdCBvZiBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyAoTGF0aW4gbGV0dGVycywgZGlnaXRzLCBhbmQgdW5kZXJzY29yZXMpLgorVmFyaWFibGVzIGFyZSBkZWZpbmVkIGluIGNvbW1hbmQgbGluZSB3aXRoIEM8LUQ+IG9yIEM8LS1kZWZpbmU+IG9wdGlvbnMuCisKKz1pdGVtIFBlcmwgQ29kZQorCitQZXJsIGNvZGUgaXMgc3BlY2lmaWVkIGluIGlucHV0IGZpbGUgaW4gZm9ybToKKworICAgICR7eyAuLi5jb2RlLi4uIH19CisKK1RoZSBjb2RlIGlzIGV2YWx1YXRlZCwgYW5kIGlzIHJlcGxhY2VkIHdpdGggaXRzIHJlc3VsdC4gTm90ZTogaW4gc3RyaWN0IG1vZGUsIHlvdSBzaG91bGQgZGVjbGFyZQordmFyaWFibGUgYmVmb3JlIHVzZS4gU2VlIGV4YW1wbGVzLgorCis9YmFjaworCis9aGVhZDEgRVhBTVBMRVMKKworUmVwbGFjZSBvY2N1cnJlbmNlcyBvZiBDPCR5ZWFyPiwgQzwkbW9udGg+LCBhbmQgQzwkZGF5PiBpbiBDPGlucHV0LnR4dD4gZmlsZSB3aXRoIEM8MjAwNz4sIEM8MDk+LCBDPDAxPgorcmVzcGVjdGl2ZWx5IGFuZCB3cml0ZSByZXN1bHQgdG8gQzxvdXRwdXQudHh0PiBmaWxlOgorCisgICAgJCBjYXQgaW5wdXQudmFyCisgICAgVG9kYXkgaXMgJHllYXItJG1vbnRoLSRkYXkuCisgICAgJCBleHBhbmQtdmFycy5wbCAtRCB5ZWFyPTIwMDcgLUQgbW9udGg9MDkgLUQgZGF5PTAxIGlucHV0LnZhciBvdXRwdXQudHh0ICYmIGNhdCBvdXRwdXQudHh0CisgICAgVG9kYXkgaXMgMjAwNy0wOS0wMS4KKworVXNpbmcgUGVybCBjb2RlOgorCisgICAgJCBjYXQgaW5wdXQudmFyCisgICAgJHt7IGxvY2FsdGltZSgpOyB9fQorICAgICQgZXhwYW5kLXZhcnMucGwgLUQgeWVhcj0yMDA3IC1EIG1vbnRoPTA5IC1EIGRheT0wMSBpbnB1dC52YXIgb3V0cHV0LnR4dCAmJiBjYXQgb3V0cHV0LnR4dAorICAgIE5vdyBUdWUgTWF5ICA1IDIwOjU0OjEzIDIwMDkKKworVXNpbmcgc3RyaWN0IG1vZGUgZm9yIGNhdGNoaW5nIGJ1Z3M6CisKKyAgICAkIGNhdCBpbnB1dC52YXIKKyAgICAke3sgInllYXIgOiAiIC4gc3Vic3RyKCAkZGF0ZSwgMCwgNCApOyB9fQorICAgICQgZXhwYW5kLXZhcnMucGwgaW5wdXQudmFyIG91dHB1dC50eHQgJiYgY2F0IG91dHB1dC50eHQKKyAgICB5ZWFyIDoKKworT29wcywgd2h5IGl0IGRvZXMgbm90IHByaW50IHllYXI/IExldCB1cyB1c2Ugc3RyaWN0IG1vZGU6CisKKyAgICAkIGV4cGFuZC12YXJzLnBsIC0tc3RyaWN0IGlucHV0LnZhciBvdXRwdXQudHh0ICYmIGNhdCBvdXRwdXQudHh0CisgICAgZXhwYW5kLXZhcnMucGw6ICh4KSAidGVzdC52YXIiOiBDYW5ub3QgZXZhbHVhdGUgZXhwcmVzc2lvbiAiJHt7ICJ5ZWFyIDogIiAuIHN1YnN0ciggJGRhdGUsIDAsIDQgKTsgfX0iOiBHbG9iYWwgc3ltYm9sICIkZGF0ZSIgcmVxdWlyZXMgZXhwbGljaXQgcGFja2FnZSBuYW1lCisKK09rLCB2YXJpYWJsZSBpcyBub3QgZGVmaW5lZC4gTGV0IHVzIGRlZmluZSBpdDoKKworICAgICQgZXhwYW5kLXZhcnMucGwgLS1zdHJpY3QgLUQgZGF0ZT0yMDA5MDUwMSBpbnB1dC52YXIgb3V0cHV0LnR4dCAmJiBjYXQgb3V0cHV0LnR4dAorICAgIGV4cGFuZC12YXJzLnBsOiAoeCkgInRlc3QudmFyIjogQ2Fubm90IGV2YWx1YXRlIGV4cHJlc3Npb24gIiR7eyAieWVhciA6ICIgLiBzdWJzdHIoICRkYXRlLCAwLCA0ICk7IH19IjogVmFyaWFibGUgIiRkYXRlIiBpcyBub3QgaW1wb3J0ZWQKKworV2hhdCBpcyB3cm9uZz8gVmFyaWFibGUgc2hvdWxkIGJlIGRlY2xhcmVkOgorCisgICAgJCBjYXQgaW5wdXQudmFyCisgICAgJHt7IG91ciAkZGF0ZTsgInllYXIgOiAiIC4gc3Vic3RyKCAkZGF0ZSwgMCwgNCApOyB9fQorICAgICQgZXhwYW5kLXZhcnMucGwgLS1zdHJpY3QgLUQgZGF0ZT0yMDA5MDUwMSBpbnB1dC52YXIgb3V0cHV0LnR4dCAmJiBjYXQgb3V0cHV0LnR4dAorICAgIHllYXIgOiAyMDA5CisKKz1jdXQKKworIyBlbmQgb2YgZmlsZSAjCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rvb2xzL2V4dHJhY3Qtb2JqZWN0cy5wbCBiL2ZpbmFsL3J1bnRpbWUvdG9vbHMvZXh0cmFjdC1vYmplY3RzLnBsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA0YmU2ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rvb2xzL2V4dHJhY3Qtb2JqZWN0cy5wbApAQCAtMCwwICsxLDI1OCBAQAorIyEvdXNyL2Jpbi9lbnYgcGVybAorCisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7CisKK3VzZSBGaWxlOjpHbG9iICI6Z2xvYiI7Cit1c2UgRmlsZTo6VGVtcDsKK3VzZSBDd2Q7CisKK3VzZSBGaW5kQmluOwordXNlIGxpYiAiJEZpbmRCaW46OkJpbi9saWIiOworCit1c2UgdG9vbHM7Cit1c2UgVW5hbWU7Cit1c2UgUGxhdGZvcm0gIjp2YXJzIjsKKworb3VyICRWRVJTSU9OID0gIjAuMDA1IjsKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTdWJyb3V0aW5lcy4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3ViIHdpbmRvd3MgeworICAgIG15ICggJGFyY2gsICRvdXRwdXQsIEBhcmdzICkgPSBAXzsKKyAgICBteSAlZmlsZXM7CisgICAgIyBUT0RPOiBDaGVjayB0aGUgYXJjaGl2ZXMgYXJlIG9mIHNwZWNpZmllZCBhcmNoaXRlY3R1cmUuCisgICAgZm9yZWFjaCBteSAkYXJnICggQGFyZ3MgKSB7CisgICAgICAgIGZvcmVhY2ggbXkgJGFyY2hpdmUgKCBic2RfZ2xvYiggJGFyZyApICkgeworICAgICAgICAgICAgaW5mbyggIlByb2Nlc3NpbmcgXCIkYXJjaGl2ZVwiLi4uIiApOworICAgICAgICAgICAgbXkgJGJ1bGs7CisgICAgICAgICAgICBleGVjdXRlKCBbICJsaWIuZXhlIiwgIi9ub2xvZ28iLCAiL2xpc3QiLCAkYXJjaGl2ZSBdLCAtc3Rkb3V0ID0+IFwkYnVsayApOworICAgICAgICAgICAgbXkgQG1lbWJlcnMgPSBzcGxpdCggIlxuIiwgJGJ1bGsgKTsKKyAgICAgICAgICAgIGZvcmVhY2ggbXkgJG1lbWJlciAoIEBtZW1iZXJzICkgeworICAgICAgICAgICAgICAgIG15ICRmaWxlID0gZ2V0X2ZpbGUoICRtZW1iZXIgKTsKKyAgICAgICAgICAgICAgICBteSAkcGF0aCA9IGNhdF9maWxlKCAkb3V0cHV0LCAkZmlsZSApOworICAgICAgICAgICAgICAgIGlmICggZXhpc3RzKCAkZmlsZXN7ICRmaWxlIH0gKSApIHsKKyAgICAgICAgICAgICAgICAgICAgcnVudGltZV9lcnJvcigKKyAgICAgICAgICAgICAgICAgICAgICAgICJFeHRyYWN0aW9uIFwiJGZpbGVcIiBtZW1iZXIgZnJvbSBcIiRhcmNoaXZlXCIgYXJjaGl2ZSBmYWlsZWQ6IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJcIiRmaWxlXCIgbWVtYmVyIGhhcyBhbHJlYWR5IGJlZW4gZXh0cmFjdGVkIGZyb20gXCIkZmlsZXN7ICRmaWxlIH1cIiBhcmNoaXZlIgorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgICAgICAkZmlsZXN7ICRmaWxlIH0gPSAkYXJjaGl2ZTsKKyAgICAgICAgICAgICAgICBpbmZvKCAiICAgIFdyaXRpbmcgXCIkcGF0aFwiLi4uIiApOworICAgICAgICAgICAgICAgIGV4ZWN1dGUoIFsgImxpYi5leGUiLCAiL25vbG9nbyIsICIvZXh0cmFjdDoiIC4gJG1lbWJlciwgIi9vdXQ6IiAuICRwYXRoLCAkYXJjaGl2ZSBdICk7CisgICAgICAgICAgICB9OyAjIGZvcmVhY2ggJG1lbWJlcgorICAgICAgICB9OyAjIGZvcmVhY2ggJGFyY2hpdmUKKyAgICB9OyAjIGZvcmVhY2ggJGFyZworfTsgIyBzdWIgd2luZG93cworCitzdWIgbGludXggeworICAgIG15ICggJGFyY2gsICRvdXRwdXQsIEBhcmNoaXZlcyApID0gQF87CisgICAgIyBUT0RPOiBDaGVjayB0aGUgYXJjaGl2ZXMgYXJlIG9mIHNwZWNpZmllZCBhcmNoaXRlY3R1cmUuCisgICAgbXkgJGN3ZCA9IEN3ZDo6Y3dkKCk7CisgICAgY2hhbmdlX2RpciggJG91dHB1dCApOworICAgIGZvcmVhY2ggbXkgJGFyY2hpdmUgKCBAYXJjaGl2ZXMgKSB7CisgICAgICAgIGluZm8oICJQcm9jZXNzaW5nIFwiJGFyY2hpdmVcIi4uLiIgKTsKKyAgICAgICAgbXkgJHBhdGggPSBhYnNfcGF0aCggJGFyY2hpdmUsICRjd2QgKTsKKyAgICAgICAgZXhlY3V0ZSggWyAiYXIiLCAieG8iLCAkcGF0aCBdICk7CisgICAgfTsgIyBmb3JlYWNoICRhcmNoaXZlCisgICAgY2hhbmdlX2RpciggJGN3ZCApOworfTsgIyBzdWIgbGludXgKKworbXkgJW1hY19hcmNoID0gKAorICAgICIzMiIgID0+ICJpMzg2IiwKKyAgICAiMzJlIiA9PiAieDg2XzY0IgorKTsKKworc3ViIGRhcndpbiB7CisgICAgbXkgKCAkYXJjaCwgJG91dHB1dCwgQGFyY2hpdmVzICkgPSBAXzsKKyAgICBteSAkY3dkID0gZ2V0Y3dkKCk7CisgICAgY2hhbmdlX2RpciggJG91dHB1dCApOworICAgIGlmICggZGVmaW5lZCggJGFyY2ggKSApIHsKKyAgICAgICAgaWYgKCBub3QgZGVmaW5lZCggJG1hY19hcmNoeyAkYXJjaCB9ICkgKSB7CisgICAgICAgICAgICBydW50aW1lX2Vycm9yKCAiQXJjaGl0ZWN0dXJlIFwiJGFyY2hcIiBpcyBub3QgYSB2YWxpZCBvbmUgZm9yIE9TIFgqIiApOworICAgICAgICB9OyAjIGlmCisgICAgICAgICRhcmNoID0gJG1hY19hcmNoeyAkYXJjaCB9OworICAgIH07ICMgaWYKKyAgICBmb3JlYWNoIG15ICRhcmNoaXZlICggQGFyY2hpdmVzICkgeworICAgICAgICBpbmZvKCAiUHJvY2Vzc2luZyBcIiRhcmNoaXZlXCIuLi4iICk7CisgICAgICAgIG15ICRwYXRoID0gYWJzX3BhdGgoICRhcmNoaXZlLCAkY3dkICk7CisgICAgICAgIG15ICR0ZW1wOworICAgICAgICAjIFdoZXRoZXIgYXJjaGl2ZSBpcyBhIGZhdCBvciB0aGluPworICAgICAgICBteSAkYnVsazsKKyAgICAgICAgZXhlY3V0ZSggWyAiZmlsZSIsICRwYXRoIF0sIC1zdGRvdXQgPT4gXCRidWxrICk7CisgICAgICAgIGlmICggJGJ1bGsgPX4gbXtNYWNoLU8gdW5pdmVyc2FsIGJpbmFyeX0gKSB7CisgICAgICAgICAgICAjIEFyY2hpdmUgaXMgZmF0LCBleHRyYWN5IHRoaW4gYXJjaGl2ZSBmaXJzdC4KKyAgICAgICAgICAgIGlmICggbm90IGRlZmluZWQoICRhcmNoICkgKSB7CisgICAgICAgICAgICAgICAgcnVudGltZV9lcnJvcigKKyAgICAgICAgICAgICAgICAgICAgIlwiJGFyY2hpdmVcIiBhcmNoaXZlIGlzIHVuaXZlcnNhbCBiaW5hcnksICIgLgorICAgICAgICAgICAgICAgICAgICAgICAgInBsZWFzZSBzcGVjaWZ5IGFyY2hpdGVjdHVyZSB0byB3b3JrIHdpdGgiCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgICggdW5kZWYsICR0ZW1wICkgPSBGaWxlOjpUZW1wOjp0ZW1wZmlsZSgpOworICAgICAgICAgICAgZXhlY3V0ZSggWyAibGlidG9vbCIsICItc3RhdGljIiwgIi1hcmNoX29ubHkiLCAkYXJjaCwgIi1vIiwgJHRlbXAsICRwYXRoIF0gKTsKKyAgICAgICAgICAgICRwYXRoID0gJHRlbXA7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgZXhlY3V0ZSggWyAiYXIiLCAieG8iLCAkcGF0aCBdICk7ICAgICAjIEV4dHJhY3QgbWVtYmVycy4KKyAgICAgICAgaWYgKCBkZWZpbmVkKCAkdGVtcCApICkgeyAgICAgICAgICAgICAjIERlbGV0ZSB0ZW1wIGZpbGUsIGlmIGFueS4KKyAgICAgICAgICAgIGRlbF9maWxlKCAkdGVtcCApOworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBmb3JlYWNoICRhcmNoaXZlCisgICAgY2hhbmdlX2RpciggJGN3ZCApOworfTsgIyBzdWIgZGFyd2luCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBNYWluLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIFBhcnNlIGNvbW1hbmQgbGluZS4KKworbXkgJG91dHB1dCA9ICIuIjsKK215IEBhcmdzOworCitnZXRfb3B0aW9ucygKKyAgICBQbGF0Zm9ybTo6dGFyZ2V0X29wdGlvbnMoKSwKKyAgICAib3xvdXRwdXQtZGlyZWN0b3J5PXMiID0+IFwkb3V0cHV0LAorKTsKK0BhcmdzID0gQEFSR1Y7CisKK2lmICggbm90IC1lICRvdXRwdXQgKSB7CisgICAgcnVudGltZV9lcnJvciggIk91dHB1dCBkaXJlY3RvcnkgXCIkb3V0cHV0XCIgZG9lcyBub3QgZXhpc3QiICk7Cit9OyAjIGlmCitpZiAoIG5vdCAtZCAkb3V0cHV0ICkgeworICAgIHJ1bnRpbWVfZXJyb3IoICJcIiRvdXRwdXRcIiBpcyBub3QgYSBkaXJlY3RvcnkiICk7Cit9OyAjIGlmCitpZiAoIG5vdCAtdyAkb3V0cHV0ICkgeworICAgIHJ1bnRpbWVfZXJyb3IoICJPdXRwdXQgZGlyZWN0b3J5IFwiJG91dHB1dFwiIGlzIG5vdCB3cml0YWJsZSIgKTsKK307ICMgaWYKKworaWYgKCAkdGFyZ2V0X29zIGVxICJ3aW4iICkgeworICAgICpwcm9jZXNzID0gXCZ3aW5kb3dzOworfSBlbHNpZiAoICR0YXJnZXRfb3MgZXEgImxpbiIgb3IgJHRhcmdldF9vcyBlcSAibHJiIiApIHsKKyAgICAqcHJvY2VzcyA9IFwmbGludXg7Cit9IGVsc2lmICggJHRhcmdldF9vcyBlcSAibWFjIiApIHsKKyAgICAqcHJvY2VzcyA9IFwmZGFyd2luOworfSBlbHNlIHsKKyAgICBydW50aW1lX2Vycm9yKCAiT1MgXCIkdGFyZ2V0X29zXCIgbm90IHN1cHBvcnRlZCIgKTsKK307ICMgaWYKKworCisjIERvIHRoZSB3b3JrLgorcHJvY2VzcyggJHRhcmdldF9hcmNoLCAkb3V0cHV0LCBAYXJncyApOworZXhpdCggMCApOworCitfX0VORF9fCisKKz1wb2QKKworPWhlYWQxIE5BTUUKKworQjxleHRyYWN0LW9iamVjdHMucGw+IC0tIEV4dHJhY3QgYWxsIG9iamVjdCBmaWxlcyBmcm9tIHN0YXRpYyBsaWJyYXJ5LgorCis9aGVhZDEgU1lOT1BTSVMKKworQjxleHRyYWN0LW9iamVjdHMucGw+IEk8b3B0aW9uPi4uLiBJPGFyY2hpdmU+Li4uCisKKz1oZWFkMSBPUFRJT05TCisKKz1vdmVyCisKKz1pdGVtIEI8LS1hcmNoaXRlY3R1cmU9Pkk8YXJjaD4KKworU3BlY2lmeSBhcmNoaXRlY3R1cmUgdG8gd29yayB3aXRoLiBUaGUgb3B0aW9uIGlzIG1hbmRhdG9yeSBvbiBPUyBYKiBpbiBjYXNlIG9mIHVuaXZlcnNhbCBhcmNoaXZlLgorSW4gb3RoZXIgY2FzZXMgdGhlIG9wdGlvbiBzaG91bGQgbm90IGJlIHVzZWQuIEk8YXJjaD4gbWF5IGJlIG9uZSBvZiBDPDMyPiBvciBDPDMyZT4uCisKKz1pdGVtIEI8LS1vcz0+STxzdHI+CisKK1NwZWNpZnkgT1MgbmFtZS4gQnkgZGVmYXVsdCBPUyBpcyBhdXRvZGV0ZWN0ZWQuCisKK0RlcGVuZGluZyBvbiBPUywgQjxleHRyYWN0LW9iamVjdHMucGw+IHVzZXMgZGlmZmVyZW50IGV4dGVybmFsIHRvb2xzIGZvciBoYW5kbGluZyBzdGF0aWMKK2xpYnJhcmllczogRjxhcj4gKGluIGNhc2Ugb2YgImxpbiIgYW5kICJtYWMiKSBvciBGPGxpYi5leGU+IChpbiBjYXNlIG9mICJ3aW4iKS4KKworPWl0ZW0gQjwtLW91dHB1dC1kaXJlY3Rvcnk9Pkk8ZGlyPgorCitTcGVjaWZ5IGRpcmVjdG9yeSB0byB3cml0ZSBleHRyYWN0ZWQgbWVtYmVycyB0by4gQ3VycmVudCBkaXJlY3RvcnkgaXMgdXNlZCBieSBkZWZhdWx0LgorCis9aXRlbSBCPC0taGVscD4KKworUHJpbnQgc2hvcnQgaGVscCBtZXNzYWdlIGFuZCBleGl0LgorCis9aXRlbSBCPC0tZG9jPgorCis9aXRlbSBCPC0tbWFudWFsPgorCitQcmludCBmdWxsIGRvY3VtZW50YXRpb24gYW5kIGV4aXQuCisKKz1pdGVtIEI8LS1xdWlldD4KKworRG8gbm90IHByaW50IGluZm9ybWF0aW9uIG1lc3NhZ2VzLgorCis9aXRlbSBCPC0tdmVyc2lvbj4KKworUHJpbnQgdmVyc2lvbiBhbmQgZXhpdC4KKworPWJhY2sKKworPWhlYWQxIEFSR1VNRU5UUworCis9b3ZlcgorCis9aXRlbSBJPGFyY2hpdmU+CisKK0EgbmFtZSBvZiBhcmNoaXZlIGZpbGUgKHN0YXRpYyBsaWJyYXJ5KS4gTXVsdGlwbGUgYXJjaGl2ZXMgbWF5IGJlIHNwZWNpZmllZC4KKworPWJhY2sKKworPWhlYWQxIERFU0NSSVBUSU9OCisKK1RoZSBzY3JpcHQgZXh0cmFjdHMgYWxsIHRoZSBtZW1iZXJzIChvYmplY3QgZmlsZXMpIGZyb20gYXJjaGl2ZSAoc3RhdGljIGxpYnJhcnkpIHRvIHNwZWNpZmllZAorZGlyZWN0b3J5LiBDb21tYW5kcyB0byBwZXJmb3JtIHRoaXMgYWN0aW9uIGRpZmZlciBvbiBkaWZmZXJlbnQgT1Nlcy4gT24gTGludXgqIE9TLCBzaW1wbGUgY29tbWFuZAorCisgICAgYXIgeG8gbGliZmlsZS5hCisKK2lzIGVub3VnaCAoaW4gY2FzZSBvZiBleHRyYWN0aW5nIGZpbGVzIHRvIGN1cnJlbnQgZGlyZWN0b3J5KS4KKworT24gT1MgWCosIGl0IGlzIGEgYml0IGNvbXBpbGljYXRlZCB3aXRoIHVuaXZlcnNhbCAoImZhdCIpIGJpbmFyaWVzIC0tIEM8YXI+IGNhbm5vdAorb3BlcmF0ZSBvbiBmYXQgYXJjaGl2ZXMsIHNvICJ0aGluIiBhcmNoaXZlIHNob3VsZCBiZSBleHRyYWN0ZWQgZnJvbSB0aGUgdW5pdmVyc2FsIGJpbmFyeSBmaXJzdC4KKworT24gV2luZG93cyogT1MsIGxpYnJhcnkgbWFuYWdlciAoQzxsaWIuZXhlPikgY2FuIGV4dHJhY3Qgb25seSBvbmUgb2JqZWN0IGZpbGUsIHNvIG9wZXJhdGlvbiBzaG91bGQgYmUKK3JlcGVhdGVkIGZvciBldmVyeSBvYmplY3QgZmlsZSBpbiB0aGUgbGlicmFyeS4KKworQjxleHRyYWN0LW9iamVjdHMucGw+IGRldGVjdHMgT1MgYXV0b21hdGljYWxseS4gQnV0IGRldGVjdGlvbiBjYW4gYmUgb3ZlcnJpZGVkIHdpdGggQjwtLW9zPiBvcHRpb24uCitJdCBtYXkgYmUgaGVscGZ1bCBpbiBjcm9zcy1idWlsZCBlbnZpcm9ubWVudHMuCisKK0I8ZXh0cmFjdC1vYmplY3RzLnBsPiBlZmZlY3RpdmVseSBlbmNhcHN1bGF0ZXMgYWxsIHRoZXNlIGRldGFpbHMgYW5kIHByb3ZpZGVzIHVuaWZvcm0gd2F5IGZvcgorZXh0cmFjdGluZyBvYmplY3QgZmlsZXMgZnJvbSBzdGF0aWMgbGlicmFyaWVzLCB3aGljaCBoZWxwcyB0byBrZWVwIG1ha2VmaWxlcyBzaW1wbGUgYW5kIGNsZWFuLgorCis9aGVhZDEgRVhBTVBMRVMKKworRXh0cmFjdCBvYmplY3QgZmlsZXMgZnJvbSBsaWJyYXJ5IEY8bGliaXJjLmxpYj4sIGFuZCBwdXQgdGhlbSBpbnRvIEY8b2JqLz4gZGlyZWN0b3J5OgorCisgICAgJCBleHRyYWN0LW9iamVjdHMucGwgLS1vdXRwdXQ9b2JqIGxpYmlyYy5saWIKKworRXh0cmFjdCBvYmplY3QgZmlsZXMgZnJvbSBsaWJyYXJ5IEY8bGliaXJjLmE+LiBVc2UgTGludXgqIE9TIHRvb2xzIChGPGFyPiksIGV2ZW4gaWYgcnVuIG9uIGFub3RoZXIgT1M6CisKKyAgICAkIGV4dHJhY3Qtb2JqZWN0cy5wbCAtLW9zPWxpbiBsaWJpcmMuYQorCitFeHRyYWN0IG9iamVjdCBmaWxlcyBmcm9tIGxpYnJhcnkgRjxsaWJpcmMuYT4sIGlmIGl0IGlzIGEgT1MgWCogdW5pdmVyc2FsIGJpbmFyeSwgdXNlIGkzODYKK2FyY2hpdGVjdHVyZS4gQmUgcXVpZXQ6CisKKyAgICAkIGV4dHJhY3Qtb2JqZWN0cy5wbCAtLXF1aWV0IC0tYXJjaD1pMzg2IGxpYmlyYy5hCisKKz1jdXQKKworIyBlbmQgb2YgZmlsZSAjCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdG9vbHMvZnJlZWJzZC5pbmMgYi9maW5hbC9ydW50aW1lL3Rvb2xzL2ZyZWVic2QuaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiNjBlZWMKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rvb2xzL2ZyZWVic2QuaW5jCkBAIC0wLDAgKzEsMTIgQEAKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKKworaW5jbHVkZSB0b29scy9saW51eC5pbmMKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdG9vbHMvZ2VuZXJhdGUtZGVmLnBsIGIvZmluYWwvcnVudGltZS90b29scy9nZW5lcmF0ZS1kZWYucGwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2MyYjBmMwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdG9vbHMvZ2VuZXJhdGUtZGVmLnBsCkBAIC0wLDAgKzEsMzIxIEBACisjIS91c3IvYmluL2VudiBwZXJsCisKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKKworIyBTb21lIHByYWdtYXMuCit1c2Ugc3RyaWN0OyAgICAgICAgICAjIFJlc3RyaWN0IHVuc2FmZSBjb25zdHJ1Y3RzLgordXNlIHdhcm5pbmdzOyAgICAgICAgIyBFbmFibGUgYWxsIHdhcm5pbmdzLgorCit1c2UgRmluZEJpbjsKK3VzZSBsaWIgIiRGaW5kQmluOjpCaW4vbGliIjsKKwordXNlIHRvb2xzOworCitvdXIgJFZFUlNJT04gPSAiMC4wMDQiOworCisjCisjIFN1YnJvdXRpbmVzLgorIworCitzdWIgcGFyc2VfaW5wdXQoJFwlKSB7CisKKyAgICBteSAoICRpbnB1dCwgJGRlZnMgKSA9IEBfOworICAgIG15IEBidWxrID0gcmVhZF9maWxlKCAkaW5wdXQgKTsKKyAgICBteSAlZW50cmllczsKKyAgICBteSAlb3JkaW5hbHM7CisgICAgbXkgQGRpcnM7CisgICAgbXkgJHZhbHVlID0gMTsKKworICAgIG15ICRlcnJvciA9CisgICAgICAgIHN1YiB7CisgICAgICAgICAgICBteSAoICRtc2csICRsLCAkbGluZSApID0gQF87CisgICAgICAgICAgICBydW50aW1lX2Vycm9yKAorICAgICAgICAgICAgICAgICJFcnJvciBwYXJzaW5nIGZpbGUgXCIkaW5wdXRcIiBsaW5lICRsOlxuIiAuCisgICAgICAgICAgICAgICAgIiAgICAkbGluZSIgLgorICAgICAgICAgICAgICAgICggJG1zZyA/ICRtc2cgLiAiXG4iIDogKCkgKQorICAgICAgICAgICAgKTsKKyAgICAgICAgfTsgIyBzdWIKKworICAgIG15ICRuID0gMDsgICAgIyBMaW5lIG51bWJlci4KKyAgICBmb3JlYWNoIG15ICRsaW5lICggQGJ1bGsgKSB7CisgICAgICAgICsrICRuOworICAgICAgICBpZiAoIDAgKSB7CisgICAgICAgIH0gZWxzaWYgKCAkbGluZSA9fiBte15ccyooPzojfFxuKX0gKSB7CisgICAgICAgICAgICAjIEVtcHR5IGxpbmUgb3IgY29tbWVudC4gU2tpcCBpdC4KKyAgICAgICAgfSBlbHNpZiAoICRsaW5lID1+IG17XlxzKiV9ICkgeworICAgICAgICAgICAgIyBBIGRpcmVjdGl2ZS4KKyAgICAgICAgICAgIGlmICggMCAgKSB7CisgICAgICAgICAgICB9IGVsc2lmICggJGxpbmUgPX4gbXteXHMqJVxzKmlmKG4pP2RlZlxzKyhbQS1aYS16MC05X10rKVxzKig/OiN8XG4pfSApIHsKKyAgICAgICAgICAgICAgICBteSAoICRuZWdhdGlvbiwgJG5hbWUgKSA9ICggJDEsICQyICk7CisgICAgICAgICAgICAgICAgbXkgJGRpciA9IHsgbiA9PiAkbiwgbGluZSA9PiAkbGluZSwgbmFtZSA9PiAkbmFtZSwgdmFsdWUgPT4gJHZhbHVlIH07CisgICAgICAgICAgICAgICAgcHVzaCggQGRpcnMsICRkaXIgKTsKKyAgICAgICAgICAgICAgICAkdmFsdWUgPSAoICR2YWx1ZSBhbmQgKCAkbmVnYXRpb24geG9yICRkZWZzLT57ICRuYW1lIH0gKSApOworICAgICAgICAgICAgfSBlbHNpZiAoICRsaW5lID1+IG17XlxzKiVccyplbmRpZlxzKig/OiN8XG4pfSApIHsKKyAgICAgICAgICAgICAgICBpZiAoIG5vdCBAZGlycyApIHsKKyAgICAgICAgICAgICAgICAgICAgJGVycm9yLT4oICJPcnBoYW4gJWVuZGlmIGRpcmVjdGl2ZS4iLCAkbiwgJGxpbmUgKTsKKyAgICAgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICAgICAgbXkgJGRpciA9IHBvcCggQGRpcnMgKTsKKyAgICAgICAgICAgICAgICAkdmFsdWUgPSAkZGlyLT57IHZhbHVlIH07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICRlcnJvci0+KCAiQmFkIGRpcmVjdGl2ZS4iLCAkbiwgJGxpbmUgKTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgfSBlbHNpZiAoICRsaW5lID1+IG17XlxzKigtKT9ccyooW0EtWmEtejAtOV9dKykoPzpccysoXGQrfERBVEEpKT9ccyooPzojfFxuKX0gKSB7CisgICAgICAgICAgICBteSAoICRvYnNvbGV0ZSwgJGVudHJ5LCAkb3JkaW5hbCApID0gKCAkMSwgJDIsICQzICk7CisgICAgICAgICAgICBpZiAoICR2YWx1ZSApIHsKKyAgICAgICAgICAgICAgICBpZiAoIGV4aXN0cyggJGVudHJpZXN7ICRlbnRyeSB9ICkgKSB7CisgICAgICAgICAgICAgICAgICAgICRlcnJvci0+KCAiRW50cnkgXCIkZW50cnlcIiBoYXMgYWxyZWFkeSBiZWVuIHNwZWNpZmllZC4iLCAkbiwgJGxpbmUgKTsKKyAgICAgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICAgICAgJGVudHJpZXN7ICRlbnRyeSB9ID0geyBvcmRpbmFsID0+ICRvcmRpbmFsLCBvYnNvbGV0ZSA9PiBkZWZpbmVkKCAkb2Jzb2xldGUgKSB9OworICAgICAgICAgICAgICAgIGlmICggZGVmaW5lZCggJG9yZGluYWwgKSBhbmQgJG9yZGluYWwgbmUgIkRBVEEiICkgeworICAgICAgICAgICAgICAgICAgICBpZiAoICRvcmRpbmFsID49IDEwMDAgYW5kICRlbnRyeSA9fiBte1xBW29rXW1wX30gKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAkZXJyb3ItPiggIk9yZGluYWwgb2YgdXNlci1jYWxsYWJsZSBlbnRyeSBtdXN0IGJlIDwgMTAwMCIsICRuLCAkbGluZSApOworICAgICAgICAgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICAgICAgICAgIGlmICggJG9yZGluYWwgPj0gMTAwMCBhbmQgJG9yZGluYWwgPCAyMDAwICkgeworICAgICAgICAgICAgICAgICAgICAgICAgJGVycm9yLT4oICJPcmRpbmFscyBiZXR3ZWVuIDEwMDAgYW5kIDE5OTkgYXJlIHJlc2VydmVkLiIsICRuLCAkbGluZSApOworICAgICAgICAgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICAgICAgICAgIGlmICggZXhpc3RzKCAkb3JkaW5hbHN7ICRvcmRpbmFsIH0gKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICRlcnJvci0+KCAiT3JkaW5hbCAkb3JkaW5hbCBoYXMgYWxyZWFkeSBiZWVuIHVzZWQuIiwgJG4sICRsaW5lICk7CisgICAgICAgICAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgICAgICAgICAgJG9yZGluYWxzeyAkb3JkaW5hbCB9ID0gJGVudHJ5OworICAgICAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICRlcnJvci0+KCAiIiwgJG4sICRsaW5lICk7CisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGZvcmVhY2gKKworICAgIGlmICggQGRpcnMgKSB7CisgICAgICAgIG15ICRkaXIgPSBwb3AoIEBkaXJzICk7CisgICAgICAgICRlcnJvci0+KCAiVW50ZXJtaW5hdGVkICVpZiBkaXJlY2l2ZS4iLCAkZGlyLT57IG4gfSwgJGRpci0+eyBsaW5lIH0gKTsKKyAgICB9OyAjIHdoaWxlCisKKyAgICByZXR1cm4gJWVudHJpZXM7CisKK307ICMgc3ViIHBhcnNlX2lucHV0CisKK3N1YiBwcm9jZXNzKFwlKSB7CisKKyAgICBteSAoICRlbnRyaWVzICkgPSBAXzsKKworICAgIGZvcmVhY2ggbXkgJGVudHJ5ICgga2V5cyggJSRlbnRyaWVzICkgKSB7CisgICAgICAgIGlmICggbm90ICRlbnRyaWVzLT57ICRlbnRyeSB9LT57IG9ic29sZXRlIH0gKSB7CisgICAgICAgICAgICBteSAkb3JkaW5hbCA9ICRlbnRyaWVzLT57ICRlbnRyeSB9LT57IG9yZGluYWwgfTsKKyAgICAgICAgICAgIGlmICggJGVudHJ5ID1+IG17XEFbb2tdbXBffSApIHsKKyAgICAgICAgICAgICAgICBpZiAoIG5vdCBkZWZpbmVkKCAkb3JkaW5hbCApIG9yICRvcmRpbmFsIGVxICJEQVRBIiApIHsKKyAgICAgICAgICAgICAgICAgICAgcnVudGltZV9lcnJvcigKKyAgICAgICAgICAgICAgICAgICAgICAgICJCYWQgZW50cnkgXCIkZW50cnlcIjogb3JkaW5hbCBudW1iZXIgaXMgbm90IHNwZWNpZmllZC4iCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgICAgICRlbnRyaWVzLT57IHVjKCAkZW50cnkgKSB9ID0geyBvcmRpbmFsID0+IDEwMDAgKyAkb3JkaW5hbCB9OworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBmb3JlYWNoCisKKyAgICByZXR1cm4gJSRlbnRyaWVzOworCit9OyAjIHN1YiBwcm9jZXNzCisKK3N1YiBnZW5lcmF0ZV9vdXRwdXQoXCUkKSB7CisKKyAgICBteSAoICRlbnRyaWVzLCAkb3V0cHV0ICkgPSBAXzsKKyAgICBteSAkYnVsazsKKworICAgICRidWxrID0gIkVYUE9SVFNcbiI7CisgICAgZm9yZWFjaCBteSAkZW50cnkgKCBzb3J0KCBrZXlzKCAlJGVudHJpZXMgKSApICkgeworICAgICAgICBpZiAoIG5vdCAkZW50cmllcy0+eyAkZW50cnkgfS0+eyBvYnNvbGV0ZSB9ICkgeworICAgICAgICAgICAgJGJ1bGsgLj0gc3ByaW50ZiggIiAgICAlLTQwcyAiLCAkZW50cnkgKTsKKyAgICAgICAgICAgIG15ICRvcmRpbmFsID0gJGVudHJpZXMtPnsgJGVudHJ5IH0tPnsgb3JkaW5hbCB9OworICAgICAgICAgICAgaWYgKCBkZWZpbmVkKCAkb3JkaW5hbCApICkgeworICAgICAgICAgICAgICAgIGlmICggJG9yZGluYWwgZXEgIkRBVEEiICkgeworICAgICAgICAgICAgICAgICAgICAkYnVsayAuPSAiREFUQSI7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgJGJ1bGsgLj0gIlxAIiAuICRvcmRpbmFsOworICAgICAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgICRidWxrIC49ICJcbiI7CisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGZvcmVhY2gKKyAgICBpZiAoIGRlZmluZWQoICRvdXRwdXQgKSApIHsKKyAgICAgICAgd3JpdGVfZmlsZSggJG91dHB1dCwgXCRidWxrICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnQoICRidWxrICk7CisgICAgfTsgIyBpZgorCit9OyAjIHN1YiBnZW5lcmF0ZV9vdXB1dAorCisjCisjIFBhcnNlIGNvbW1hbmQgbGluZS4KKyMKKworbXkgJGlucHV0OyAgICMgVGhlIG5hbWUgb2YgaW5wdXQgZmlsZS4KK215ICRvdXRwdXQ7ICAjIFRoZSBuYW1lIG9mIG91dHB1dCBmaWxlLgorbXkgJWRlZnM7CisKK2dldF9vcHRpb25zKAorICAgICJvdXRwdXQ9cyIgICAgPT4gXCRvdXRwdXQsCisgICAgIkR8ZGVmaW5lPXMiICA9PgorICAgICAgICBzdWIgeworICAgICAgICAgICAgbXkgKCAkb3B0X25hbWUsICRvcHRfdmFsdWUgKSA9IEBfOworICAgICAgICAgICAgbXkgKCAkZGVmX25hbWUsICRkZWZfdmFsdWUgKTsKKyAgICAgICAgICAgIGlmICggJG9wdF92YWx1ZSA9fiBte1xBKC4qPyk9KC4qKVx6fSApIHsKKyAgICAgICAgICAgICAgICAoICRkZWZfbmFtZSwgJGRlZl92YWx1ZSApID0gKCAkMSwgJDIgKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKCAkZGVmX25hbWUsICRkZWZfdmFsdWUgKSA9ICggJG9wdF92YWx1ZSwgMSApOworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgJGRlZnN7ICRkZWZfbmFtZSB9ID0gJGRlZl92YWx1ZTsKKyAgICAgICAgfSwKKyk7CisKK2lmICggQEFSR1YgPT0gMCApIHsKKyAgICBjbWRsaW5lX2Vycm9yKCAiTm90IGVub3VnaCBhcmd1bWVudHMuIiApOworfTsgIyBpZgoraWYgKCBAQVJHViA+IDEgKSB7CisgICAgY21kbGluZV9lcnJvciggIlRvbyBtYW55IGFyZ3VtZW50cy4iICk7Cit9OyAjIGlmCiskaW5wdXQgPSBzaGlmdCggQEFSR1YgKTsKKworIworIyBXb3JrLgorIworCitteSAlZGF0YSA9IHBhcnNlX2lucHV0KCAkaW5wdXQsICVkZWZzICk7CislZGF0YSA9IHByb2Nlc3MoICVkYXRhICk7CitnZW5lcmF0ZV9vdXRwdXQoICVkYXRhLCAkb3V0cHV0ICk7CitleGl0KCAwICk7CisKK19fRU5EX18KKworIworIyBFbWJlZGRlZCBkb2N1bWVudGF0aW9uLgorIworCis9cG9kCisKKz1oZWFkMSBOQU1FCisKK0I8Z2VuZXJhdGUtZGVmLnBsPiAtLSBHZW5lcmF0ZSBkZWYgZmlsZSBmb3IgT3Blbk1QIFJUTC4KKworPWhlYWQxIFNZTk9QU0lTCisKK0I8Z2VuZXJhdGUtZGVmLnBsPiBJPE9QVElPTj4uLi4gSTxmaWxlPgorCis9aGVhZDEgT1BUSU9OUworCis9b3ZlcgorCis9aXRlbSBCPC0tZGVmaW5lPT5JPG5hbWU+Wz1JPHZhbHVlPl0KKworPWl0ZW0gQjwtRD4gSTxuYW1lPls9STx2YWx1ZT5dCisKK0RlZmluZSBzcGVjaWZpZWQgbmFtZS4gSWYgSTx2YWx1ZT4gaXMgb21pdHRlZCwgSTxuYW1lPiBpcyBkZWZpbmVkIHRvIDEuIElmIEk8dmFsdWU+IGlzIDAgb3IgZW1wdHksCituYW1lIGlzIEI8bm90PiBkZWZpbmVkLgorCis9aXRlbSBCPC0tb3V0cHV0PT5JPGZpbGU+CisKKz1pdGVtIEI8LW8+IEk8ZmlsZT4KKworU3BlY2lmeSBvdXRwdXQgZmlsZSBuYW1lLiBJZiBvcHRpb24gaXMgbm90IHByZXNlbnQsIHJlc3VsdCBpcyBwcmludGVkIHRvIHN0ZG91dC4KKworPWl0ZW0gQjwtLWRvYz4KKworPWl0ZW0gQjwtLW1hbnVhbD4KKworUHJpbnQgZnVsbCBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQuCisKKz1pdGVtIEI8LS1oZWxwPgorCitQcmludCBzaG9ydCBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQuCisKKz1pdGVtIEI8LS11c2FnZT4KKworUHJpbnQgdmVyeSBzaG9ydCB1c2FnZSBtZXNzYWdlIGFuZCBleGl0LgorCis9aXRlbSBCPC0tdmVyYm9zZT4KKworRG8gcHJpbnQgaW5mb3JtYXRpb25hbCBtZXNzYWdlcy4KKworPWl0ZW0gQjwtLXZlcnNpb24+CisKK1ByaW50IHZlcnNpb24gYW5kIGV4aXQuCisKKz1pdGVtIEI8LS1xdWlldD4KKworV29yayBxdWlldCwgZG8gbm90IHByaW50IGluZm9ybWF0aW9uYWwgbWVzc2FnZXMuCisKKz1iYWNrCisKKz1oZWFkMSBBUkdVTUVOVFMKKworPW92ZXIKKworPWl0ZW0gSTxmaWxlPgorCitBIG5hbWUgb2YgaW5wdXQgZmlsZS4KKworPWJhY2sKKworPWhlYWQxIERFU0NSSVBUSU9OCisKK1RoZSBzY3JpcHQgcmVhZHMgaW5wdXQgZmlsZSwgcHJvY2VzcyBjb25kaXRpb25hbCBkaXJlY3RpdmVzLCBjaGVja3MgY29udGVudCBmb3IgY29uc2lzdGVuY3ksIGFuZAorZ2VuZXJhdGVzIG91cHRwdXQgZmlsZSBzdWl0YWJsZSBmb3IgbGlua2VyLgorCis9aGVhZDIgSW5wdXQgRmlsZSBGb3JtYXQKKworPW92ZXIKKworPWl0ZW0gQ29tbWVudHMKKworICAgICMgSXQncyBhIGNvbW1lbnQuCisKK0NvbW1lbnRzIHN0YXJ0IHdpdGggQzwjPiBzeW1ib2wgYW5kIGNvbnRpbnVlIHRvIHRoZSBlbmQgb2YgbGluZS4KKworPWl0ZW0gQ29uZGl0aW9uYWwgRGlyZWN0aXZlcworCisgICAgJWlmZGVmIG5hbWUKKyAgICAlaWZuZGVmIG5hbWUKKyAgICAlZW5kaWYKKworQSBwYXJ0IG9mIGZpbGUgc3Vycm91bmRlZCBieSBDPCVpZmRlZiBJPG5hbWU+PiBhbmQgQzwlZW5kaWY+IGRpcmVjdGl2ZXMgaXMgYSBjb25kaXRpb25hbCBwYXJ0IC0tIGl0CitoYXMgZWZmZWN0IG9ubHkgaWYgSTxuYW1lPiBpcyBkZWZpbmVkIGluIHRoZSBjb21tYW4gbGluZSBieSBCPC0tZGVmaW5lPiBvcHRpb24uIEM8JWlmbmRlZj4gaXMgYQorbmVnYXRlZCB2ZXJzaW9uIG9mIEM8JWlmZGVmPiAtLSBjb25kaXRpb25hbCBwYXJ0IGhhcyBhbiBlZmZlY3Qgb25seSBpZiBJPG5hbWU+IGlzIEI8bm90PiBkZWZpbmVkLgorCitDb25kaXRpb25hbCBwYXJ0cyBtYXkgYmUgbmVzdGVkLgorCis9aXRlbSBFeHBvcnQgRGVmaW5pdGlvbnMKKworICAgIHN5bWJvbAorICAgIHN5bWJvbCBvcmRpbmFsCisgICAgc3ltYm9sIERBVEEKKworU3ltYm9scyBzdGFydGluZyB3aXRoIEM8b21wXz4gb3IgQzxrbXBfPiBtdXN0IGhhdmUgb3JkaW5hbCBzcGVjaWZpZWQuIFRoZXkgYXJlIHN1YmplY3RzIGZvciBzcGVjaWFsCitwcm9jZXNzaW5nOiBlYWNoIHN5bWJvbCBnZW5lcmF0ZXMgdHdvIG91dHB1dCBsaW5lczogb3JpZ2luYWwgb25lIGFuZCB1cHBlciBjYXNlIHZlcnNpb24uIFRoZSBvcmRpbmFsCitudW1iZXIgb2YgdGhlIHNlY29uZCBpcyBvcmlnaW5hbCBvcmRpbmFsIGluY3JlYXNlZCBieSAxMDAwLgorCis9aXRlbSBPYnNvbGV0ZSBTeW1ib2xzCisKKyAgICAtIHN5bWJvbAorICAgIC0gc3ltYm9sIG9yZGluYWwKKyAgICAtIHN5bWJvbCBEQVRBCisKK09ic29sZXRlIHN5bWJvbHMgbG9vayBsaWtlIGV4cG9ydCBkZWZpbml0aW9ucyBwcmVmaXhlZCB3aXRoIG1pbnVzIHNpZ24uIE9ic29sZXRlIHN5bWJvbHMgZG8gbm90CithZmZlY3QgdGhlIG91dHB1dCwgYnV0IG9ic29sZXRlIHN5bWJvbHMgYW5kIHRoZWlyIG9yZGluYWxzIGNhbm5vdCBiZSAocmUpdXNlZCBpbiBleHBvcnQgZGVmaW5pdGlvbnMuCisKKz1iYWNrCisKKz1oZWFkMSBFWEFNUExFUworCisgICAgJCBnZW5lcmF0ZS1kZWYucGwgLUQgc3R1YiAtRCBVU0VfVENIRUNLPTAgLW8gbGliZ3VpZGUuZGVmIGRsbGV4cG9ydAorCis9Y3V0CisKKyMgZW5kIG9mIGZpbGUgIworCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rvb2xzL2xpYi9CdWlsZC5wbSBiL2ZpbmFsL3J1bnRpbWUvdG9vbHMvbGliL0J1aWxkLnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNjcxNTYKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rvb2xzL2xpYi9CdWlsZC5wbQpAQCAtMCwwICsxLDI2NCBAQAorIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworcGFja2FnZSBCdWlsZDsKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKwordXNlIEN3ZCBxd3t9OworCit1c2UgTGliT01QOwordXNlIHRvb2xzOwordXNlIFVuYW1lOwordXNlIFBsYXRmb3JtICI6dmFycyI7CisKK215ICRob3N0ID0gVW5hbWU6Omhvc3RfbmFtZSgpOworbXkgJHJvb3QgPSAkRU5WeyBMSUJPTVBfV09SSyAgICB9OworbXkgJHRtcCAgPSAkRU5WeyBMSUJPTVBfVE1QICAgICB9OworbXkgJG91dCAgPSAkRU5WeyBMSUJPTVBfRVhQT1JUUyB9OworCitteSBAam9iczsKK291ciAkc3RhcnQgPSB0aW1lKCk7CisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgSGVscGVyIGZ1bmN0aW9ucy4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyB0c3RyIC0tIFRpbWUgc3RyaW5nLiBSZXR1cm5zIHN0cmluZyAieXl5eS1kZC1tbSBoaDptbTpzcyBVVEMiLgorc3ViIHRzdHIoOyQpIHsKKyAgICBteSAoICR0aW1lICkgPSBAXzsKKyAgICBpZiAoIG5vdCBkZWZpbmVkKCAkdGltZSApICkgeworICAgICAgICAkdGltZSA9IHRpbWUoKTsKKyAgICB9OyAjIGlmCisgICAgbXkgKCAkc2VjLCAkbWluLCAkaG91ciwgJGRheSwgJG1vbnRoLCAkeWVhciApID0gZ210aW1lKCAkdGltZSApOworICAgICRtb250aCArPSAxOworICAgICR5ZWFyICArPSAxOTAwOworICAgIG15ICRzdHIgPSBzcHJpbnRmKCAiJTA0ZC0lMDJkLSUwMmQgJTAyZDolMDJkOiUwMmQgVVRDIiwgJHllYXIsICRtb250aCwgJGRheSwgJGhvdXIsICRtaW4sICRzZWMgKTsKKyAgICByZXR1cm4gJHN0cjsKK307ICMgc3ViIHRzdHIKKworIyBkc3RyIC0tIER1cmF0aW9uIHN0cmluZy4gUmV0dXJucyBzdHJpbmcgImhoOm1tOnNzIi4KK3N1YiBkc3RyKCQpIHsKKyAgICAjIEdldCB0aW1lIGluIHNlY29uZHMgYW5kIGZvcm1hdCBpdCBhcyB0aW1lIGluIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzLgorICAgIG15ICggJHNlYyApID0gQF87CisgICAgbXkgKCAkaCwgJG0sICRzICk7CisgICAgJGggICA9IGludCggJHNlYyAvIDM2MDAgKTsKKyAgICAkc2VjID0gJHNlYyAtICRoICogMzYwMDsKKyAgICAkbSAgID0gaW50KCAkc2VjIC8gNjAgKTsKKyAgICAkc2VjID0gJHNlYyAtICRtICogNjA7CisgICAgJHMgICA9IGludCggJHNlYyApOworICAgICRzZWMgPSAkc2VjIC0gJHM7CisgICAgcmV0dXJuIHNwcmludGYoICIlMDJkOiUwMmQ6JTAyZCIsICRoLCAkbSwgJHMgKTsKK307ICMgc3ViIGRzdHIKKworIyByc3RyIC0tIFJlc3VsdCBzdHJpbmcuCitzdWIgcnN0cigkKSB7CisgICAgbXkgKCAkcmMgKSA9IEBfOworICAgIHJldHVybiAoICRyYyA9PSAwID8gIisrKyBTdWNjZXNzICsrKyIgOiAiLS0tIEZhaWx1cmUgLS0tIiApOworfTsgIyBzdWIgcnN0cgorCitzdWIgc2hvcnRlcigkOyQpIHsKKyAgICAjIFJldHVybiBzaG9ydGVyIHZhcmlhbnQgb2YgcGF0aCAtLSBlaXRoZXIgYWJzb2x1dGUgb3IgcmVsYXRpdmUuCisgICAgbXkgKCAkcGF0aCwgJGJhc2UgKSA9IEBfOworICAgIG15ICRhYnMgPSBhYnNfcGF0aCggJHBhdGggKTsKKyAgICBteSAkcmVsID0gcmVsX3BhdGgoICRwYXRoLCAkYmFzZSApOworICAgIGlmICggJHJlbCBlcSAiIiApIHsKKyAgICAgICAgJHJlbCA9ICIuIjsKKyAgICB9OyAjIGlmCisgICAgJHBhdGggPSAoIGxlbmd0aCggJHJlbCApIDwgbGVuZ3RoKCAkYWJzICkgPyAkcmVsIDogJGFicyApOworICAgIGlmICggJHRhcmdldF9vcyBlcSAid2luIiApIHsKKyAgICAgICAgJHBhdGggPX4gc3tcXH17L31nOworICAgIH07ICMgaWYKKyAgICByZXR1cm4gJHBhdGg7Cit9OyAjIHN1YiBzaG9ydGVyCisKK3N1YiB0ZWUoJCQpIHsKKworICAgIG15ICggJGFjdGlvbiwgJGZpbGUgKSA9IEBfOworICAgIG15ICRwaWQgPSAwOworCisgICAgbXkgJHNhdmVfc3Rkb3V0ID0gU3ltYm9sOjpnZW5zeW0oKTsKKyAgICBteSAkc2F2ZV9zdGRlcnIgPSBTeW1ib2w6OmdlbnN5bSgpOworCisgICAgIyAtLS0gcmVkaXJlY3Qgc3Rkb3V0IC0tLQorICAgIFNURE9VVC0+Zmx1c2goKTsKKyAgICAjIFNhdmUgc3Rkb3V0IGluICRzYXZlX3N0ZG91dC4KKyAgICBvcGVuKCAkc2F2ZV9zdGRvdXQsICI+JiIgLiBTVERPVVQtPmZpbGVubygpICkKKyAgICAgICAgb3IgZGllKCAiQ2Fubm90IGR1cCBmaWxlaGFuZGxlOiAkITsgc3RvcHBlZCIgKTsKKyAgICAjIFJlZGlyZWN0IHN0ZG91dCB0byB0ZWUgb3IgdG8gZmlsZS4KKyAgICBpZiAoICR0b29sczo6dmVyYm9zZSApIHsKKyAgICAgICAgJHBpZCA9IG9wZW4oIFNURE9VVCwgInwgdGVlIC1hIFwiJGZpbGVcIiIgKQorICAgICAgICAgICAgb3IgZGllICJDYW5ub3Qgb3BlbiBwaXBlIHRvIFwidGVlXCI6ICQhOyBzdG9wcGVkIjsKKyAgICB9IGVsc2UgeworICAgICAgICBvcGVuKCBTVERPVVQsICI+PiRmaWxlIiApCisgICAgICAgICAgICBvciBkaWUgIkNhbm5vdCBvcGVuIGZpbGUgXCIkZmlsZVwiIGZvciB3cml0aW5nOiAkITsgc3RvcHBlZCI7CisgICAgfTsgIyBpZgorCisgICAgIyAtLS0gcmVkaXJlY3Qgc3RkZXJyIC0tLQorICAgIFNUREVSUi0+Zmx1c2goKTsKKyAgICAjIFNhdmUgc3RkZXJyIGluICRzYXZlX3N0ZGVyci4KKyAgICBvcGVuKCAkc2F2ZV9zdGRlcnIsICI+JiIgLiBTVERFUlItPmZpbGVubygpICkKKyAgICAgICAgb3IgZGllKCAiQ2Fubm90IGR1cCBmaWxlaGFuZGxlOiAkITsgc3RvcHBlZCIgKTsKKyAgICAjIFJlZGlyZWN0IHN0ZGVyciB0byBzdGRvdXQuCisgICAgb3BlbiggU1RERVJSLCAiPiYiIC4gU1RET1VULT5maWxlbm8oKSApCisgICAgICAgIG9yIGRpZSggIkNhbm5vdCBkdXAgZmlsZWhhbmRsZTogJCE7IHN0b3BwZWQiICk7CisKKyAgICAjIFBlcmZvcm0gYWN0aW9ucy4KKyAgICAkYWN0aW9uLT4oKTsKKworICAgICMgLS0tIHJlc3RvcmUgc3RkZXJyIC0tLQorICAgIFNUREVSUi0+Zmx1c2goKTsKKyAgICAjIFJlc3RvcmUgc3RkZXJyIGZyb20gJHNhdmVfc3RkZXJyLgorICAgIG9wZW4oIFNUREVSUiwgIj4mIiAuICRzYXZlX3N0ZGVyci0+ZmlsZW5vKCkgKQorICAgICAgICBvciBkaWUoICJDYW5ub3QgZHVwIGZpbGVoYW5kbGU6ICQhOyBzdG9wcGVkIiApOworICAgICMgQ2xvc2UgJHNhdmVfc3RkZXJyLgorICAgICRzYXZlX3N0ZGVyci0+Y2xvc2UoKSBvciBkaWUgKCAiQ2Fubm90IGNsb3NlIGZpbGVoYW5kbGU6ICQhOyBzdG9wcGVkIiApOworCisgICAgIyAtLS0gcmVzdG9yZSBzdGRvdXQgLS0tCisgICAgU1RET1VULT5mbHVzaCgpOworICAgICMgUmVzdG9yZSBzdGRvdXQgZnJvbSAkc2F2ZV9zdGRvdXQuCisgICAgb3BlbiggU1RET1VULCAiPiYiIC4gJHNhdmVfc3Rkb3V0LT5maWxlbm8oKSApCisgICAgICAgIG9yIGRpZSggIkNhbm5vdCBkdXAgZmlsZWhhbmRsZTogJCE7IHN0b3BwZWQiICk7CisgICAgIyBDbG9zZSAkc2F2ZV9zdGRvdXQuCisgICAgJHNhdmVfc3Rkb3V0LT5jbG9zZSgpIG9yIGRpZSAoICJDYW5ub3QgY2xvc2UgZmlsZWhhbmRsZTogJCE7IHN0b3BwZWQiICk7CisKKyAgICAjIFdhaXQgZm9yIHRoZSBjaGlsZCB0ZWUgcHJvY2Vzcywgb3RoZXJ3aXNlIG91dHB1dCBvZiBtYWtlIGFuZCBidWlsZC5wbCBpbnRlcmxlYXZlcy4KKyAgICBpZiAoICRwaWQgIT0gMCApIHsKKyAgICAgICAgd2FpdHBpZCggJHBpZCwgMCApOworICAgIH07ICMgaWYKKworfTsgIyBzdWIgdGVlCisKK3N1YiBsb2dfaXQoJCRAKSB7CisgICAgbXkgKCAkdGl0bGUsICRmb3JtYXQsIEBhcmdzICkgPSBAXzsKKyAgICBteSAkbWVzc2FnZSAgPSBzcHJpbnRmKCAkZm9ybWF0LCBAYXJncyApOworICAgIG15ICRwcm9ncmVzcyA9IGNhdF9maWxlKCAkdG1wLCBzcHJpbnRmKCAiJXMtJXMubG9nIiwgJHRhcmdldF9wbGF0Zm9ybSwgVW5hbWU6Omhvc3RfbmFtZSgpICkgKTsKKyAgICBpZiAoICR0aXRsZSBuZSAiIiBhbmQgJG1lc3NhZ2UgbmUgIiIgKSB7CisgICAgICAgIG15ICRsaW5lID0gc3ByaW50ZiggIiUtMTVzIDogJXNcbiIsICR0aXRsZSwgJG1lc3NhZ2UgKTsKKyAgICAgICAgaW5mbyggJGxpbmUgKTsKKyAgICAgICAgd3JpdGVfZmlsZSggJHByb2dyZXNzLCB0c3RyKCkgLiAiOiAiIC4gJGxpbmUsIC1hcHBlbmQgPT4gMSApOworICAgIH0gZWxzZSB7CisgICAgICAgIHdyaXRlX2ZpbGUoICRwcm9ncmVzcywgIlxuIiwgLWFwcGVuZCA9PiAxICk7CisgICAgfTsgIyBpZgorfTsgIyBzdWIgbG9nX2l0CisKK3N1YiBwcm9ncmVzcygkJEApIHsKKyAgICBteSAoICR0aXRsZSwgJGZvcm1hdCwgQGFyZ3MgKSA9IEBfOworICAgIGxvZ19pdCggJHRpdGxlLCAkZm9ybWF0LCBAYXJncyApOworfTsgIyBzdWIgcHJvZ3Jlc3MKKworc3ViIHN1bW1hcnkoKSB7CisgICAgbXkgJHRvdGFsICAgPSBAam9iczsKKyAgICBteSAkc3VjY2VzcyA9IDA7CisgICAgbXkgJGZpbmlzaCA9IHRpbWUoKTsKKyAgICBmb3JlYWNoIG15ICRqb2IgKCBAam9icyApIHsKKyAgICAgICAgbXkgKCAkYnVpbGRfZGlyLCAkcmMgKSA9ICggJGpvYi0+eyBidWlsZF9kaXIgfSwgJGpvYi0+eyByYyB9ICk7CisgICAgICAgIHByb2dyZXNzKCByc3RyKCAkcmMgKSwgIiVzIiwgJGJ1aWxkX2RpciApOworICAgICAgICBpZiAoICRyYyA9PSAwICkgeworICAgICAgICAgICAgKysgJHN1Y2Nlc3M7CisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGZvcmVhY2ggJGpvYgorICAgIG15ICRmYWlsdXJlID0gJHRvdGFsIC0gJHN1Y2Nlc3M7CisgICAgcHJvZ3Jlc3MoICJTdWNjZXNzZXMiLCAgICAgICIlM2Qgb2YgJTNkIiwgJHN1Y2Nlc3MsICR0b3RhbCApOworICAgIHByb2dyZXNzKCAiRmFpbHVyZXMiLCAgICAgICAiJTNkIG9mICUzZCIsICRmYWlsdXJlLCAkdG90YWwgKTsKKyAgICBwcm9ncmVzcyggIlRpbWUgZWxhcHNlZCIsICAgIiAgJXMiLCBkc3RyKCAkZmluaXNoIC0gJHN0YXJ0ICkgKTsKKyAgICBwcm9ncmVzcyggIk92ZXJhbGwgcmVzdWx0IiwgIiVzIiwgcnN0ciggJGZhaWx1cmUgKSApOworICAgIHJldHVybiAkZmFpbHVyZTsKK307ICMgc3ViIHN1bW1hcnkKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBXb3JrZXIgZnVuY3Rpb25zLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdWIgaW5pdCgpIHsKKyAgICBtYWtlX2RpciggJHRtcCApOworfTsgIyBzdWIgaW5pdAorCitzdWIgY2xlYW4oQCkgeworICAgICMgQ2xlYW4gZGlyZWN0b3JpZXMuCisgICAgbXkgKCBAZGlycyApID0gQF87CisgICAgbXkgJGV4aXQgPSAwOworICAgICMgTWltaXNjIG1ha2VmaWxlIC0tIHByaW50IGEgY29tbWFuZC4KKyAgICBwcmludCggInJtIC1mIC1yICIgLiBqb2luKCAiICIsIG1hcCggc2hvcnRlciggJF8gKSAuICIvKiIsIEBkaXJzICkgKSAuICJcbiIgKTsKKyAgICAkZXhpdCA9CisgICAgICAgIGV4ZWN1dGUoCisgICAgICAgICAgICBbICReWCwgY2F0X2ZpbGUoICRFTlZ7IExJQk9NUF9XT1JLIH0sICJ0b29scyIsICJjbGVhbi1kaXIucGwiICksIEBkaXJzIF0sCisgICAgICAgICAgICAtaWdub3JlX3N0YXR1cyA9PiAxLAorICAgICAgICAgICAgKCAkdG9vbHM6OnZlcmJvc2UgPyAoKSA6ICggLXN0ZG91dCA9PiB1bmRlZiwgLXN0ZGVyciA9PiAiIiApICksCisgICAgICAgICk7CisgICAgcmV0dXJuICRleGl0OworfTsgIyBzdWIgY2xlYW4KKworc3ViIG1ha2UoJCQkKSB7CisgICAgIyBDaGFuZ2UgZGlyIHRvIGJ1aWxkIG9uZSBhbmQgcnVuIG1ha2UuCisgICAgbXkgKCAkam9iLCAkY2xlYW4sICRtYXJrZXIgKSA9IEBfOworICAgIG15ICRkaXIgICAgICA9ICRqb2ItPnsgYnVpbGRfZGlyIH07CisgICAgbXkgJG1ha2VmaWxlID0gJGpvYi0+eyBtYWtlZmlsZSB9OworICAgIG15ICRhcmdzICAgICA9ICRqb2ItPnsgbWFrZV9hcmdzIH07CisgICAgbXkgJGN3ZCAgICAgID0gQ3dkOjpjd2QoKTsKKyAgICBteSAkd2lkdGggICAgPSAtMTA7CisKKyAgICBteSAkZXhpdDsKKyAgICAkZGlyID0gY2F0X2RpciggJHRtcCwgJGRpciApOworICAgIG1ha2VfZGlyKCAkZGlyICk7CisgICAgY2hhbmdlX2RpciggJGRpciApOworCisgICAgbXkgJGFjdGlvbnMgPQorICAgICAgICBzdWIgeworICAgICAgICAgICAgbXkgJHN0YXJ0ID0gdGltZSgpOworICAgICAgICAgICAgJG1ha2VmaWxlID0gc2hvcnRlciggJG1ha2VmaWxlICk7CisgICAgICAgICAgICBwcmludCggIi0iIHggNzksICJcbiIgKTsKKyAgICAgICAgICAgIHByaW50ZiggIiUke3dpZHRofXM6ICVzXG4iLCAiU3RhcnRlZCIsICAgdHN0ciggJHN0YXJ0ICkgKTsKKyAgICAgICAgICAgIHByaW50ZiggIiUke3dpZHRofXM6ICVzXG4iLCAiUm9vdCBkaXIiLCAgJHJvb3QgKTsKKyAgICAgICAgICAgIHByaW50ZiggIiUke3dpZHRofXM6ICVzXG4iLCAiQnVpbGQgZGlyIiwgc2hvcnRlciggJGRpciwgJHJvb3QgKSApOworICAgICAgICAgICAgcHJpbnRmKCAiJSR7d2lkdGh9czogJXNcbiIsICJNYWtlZmlsZSIsICAkbWFrZWZpbGUgKTsKKyAgICAgICAgICAgIHByaW50KCAiLSIgeCA3OSwgIlxuIiApOworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICMgVXNlIHNob3J0ZXIgTElCT01QX1dPUksgdG8gaGF2ZSBzaG9ydGVyIGNvbW1hbmQgbGluZXMuCisgICAgICAgICAgICAgICAgIyBOb3RlOiBTb21lIHRvb2xzIG1heSBub3Qgd29yayBpZiBjdXJyZW50IGRpciBpcyBjaGFuZ2VkLgorICAgICAgICAgICAgICAgIGxvY2FsICRFTlZ7IExJQk9NUF9XT1JLIH0gPSBzaG9ydGVyKCAkRU5WeyBMSUJPTVBfV09SSyB9ICk7CisgICAgICAgICAgICAgICAgJGV4aXQgPQorICAgICAgICAgICAgICAgICAgICBleGVjdXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgWworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWtlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICItZiIsICRtYWtlZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXJjaD0iIC4gJHRhcmdldF9hcmNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYXJrZXI9JG1hcmtlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCRhcmdzCisgICAgICAgICAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgICAgICAgICAgLWlnbm9yZV9zdGF0dXMgPT4gMQorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIGlmICggJGNsZWFuIGFuZCAkZXhpdCA9PSAwICkgeworICAgICAgICAgICAgICAgICAgICAkZXhpdCA9IGNsZWFuKCAkZGlyICk7CisgICAgICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgfQorICAgICAgICAgICAgbXkgJGZpbmlzaCA9IHRpbWUoKTsKKyAgICAgICAgICAgIHByaW50KCAiLSIgeCA3OSwgIlxuIiApOworICAgICAgICAgICAgcHJpbnRmKCAiJSR7d2lkdGh9czogJXNcbiIsICJGaW5pc2hlZCIsIHRzdHIoICRmaW5pc2ggKSApOworICAgICAgICAgICAgcHJpbnRmKCAiJSR7d2lkdGh9czogJXNcbiIsICJFbGFwc2VkIiwgZHN0ciggJGZpbmlzaCAtICRzdGFydCApICk7CisgICAgICAgICAgICBwcmludGYoICIlJHt3aWR0aH1zOiAlc1xuIiwgIlJlc3VsdCIsIHJzdHIoICRleGl0ICkgKTsKKyAgICAgICAgICAgIHByaW50KCAiLSIgeCA3OSwgIlxuIiApOworICAgICAgICAgICAgcHJpbnQoICJcbiIgKTsKKyAgICAgICAgfTsgIyBzdWIKKyAgICB0ZWUoICRhY3Rpb25zLCAiYnVpbGQubG9nIiApOworCisgICAgY2hhbmdlX2RpciggJGN3ZCApOworCisgICAgIyBTYXZlIGNvbXBsZXRlZCBqb2IgdG8gYmUgYWJsZSBwcmludCBzdW1tYXJ5IGxhdGVyLgorICAgICRqb2ItPnsgcmMgfSA9ICRleGl0OworICAgIHB1c2goIEBqb2JzLCAkam9iICk7CisKKyAgICByZXR1cm4gJGV4aXQ7CisKK307ICMgc3ViIG1ha2UKKworMTsKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdG9vbHMvbGliL0xpYk9NUC5wbSBiL2ZpbmFsL3J1bnRpbWUvdG9vbHMvbGliL0xpYk9NUC5wbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmEzNzFmCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90b29scy9saWIvTGliT01QLnBtCkBAIC0wLDAgKzEsODUgQEAKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKK3BhY2thZ2UgTGliT01QOworCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCit1c2UgdG9vbHM7CisKK3N1YiBlbXB0eSgkKSB7CisgICAgbXkgKCAkdmFyICkgPSBAXzsKKyAgICByZXR1cm4gbm90IGV4aXN0cyggJEVOVnsgJHZhciB9ICkgb3Igbm90IGRlZmluZWQoICRFTlZ7ICR2YXIgfSApIG9yICRFTlZ7ICR2YXIgfSBlcSAiIjsKK307ICMgc3ViIGVtcHR5CisKK215ICggJGJhc2UsICRvdXQsICR0bXAgKTsKK2lmICggZW1wdHkoICJMSUJPTVBfV09SSyIgKSApIHsKKyAgICAjICRGaW5kQmluOjpCaW4gaXMgbm90IHVzZWQgaW50ZW50aW9uYWxseSBiZWNhdXNlIGl0IGdpdmVzIHJlYWwgcGF0aC4gSSB3YW50IHRvIHVzZSBhYnNvbHV0ZSwKKyAgICAjIGJ1dCBub3QgcmVhbCBvbmUgKHJlYWwgcGF0aCBkb2VzIG5vdCBjb250YWluIHN5bWxpbmtzIHdoaWxlIGFic29sdXRlIHBhdGggbWF5IGNvbnRhaW4KKyAgICAjIHN5bWxpbmtzKS4KKyAgICAkYmFzZSA9IGdldF9kaXIoIGdldF9kaXIoIGFic19wYXRoKCAkMCApICkgKTsKK30gZWxzZSB7CisgICAgJGJhc2UgPSBhYnNfcGF0aCggJEVOVnsgTElCT01QX1dPUksgfSApOworfTsgIyBpZgorCitpZiAoIGVtcHR5KCAiTElCT01QX0VYUE9SVFMiICkgKSB7CisgICAgJG91dCA9IGNhdF9kaXIoICRiYXNlLCAiZXhwb3J0cyIgKTsKK30gZWxzZSB7CisgICAgJG91dCA9IGFic19wYXRoKCAkRU5WeyBMSUJPTVBfRVhQT1JUUyB9ICk7Cit9OyAjIGlmCisKK2lmICggZW1wdHkoICJMSUJPTVBfVE1QIiApICkgeworICAgICR0bXAgPSBjYXRfZGlyKCAkYmFzZSwgInRtcCIgKTsKK30gZWxzZSB7CisgICAgJHRtcCA9IGFic19wYXRoKCAkRU5WeyBMSUJPTVBfVE1QIH0gKTsKK307ICMgaWYKKworJEVOVnsgTElCT01QX1dPUksgICAgfSA9ICRiYXNlOworJEVOVnsgTElCT01QX0VYUE9SVFMgfSA9ICRvdXQ7CiskRU5WeyBMSUJPTVBfVE1QICAgICB9ID0gJHRtcDsKKworcmV0dXJuIDE7CisKK19fRU5EX18KKworPXBvZAorCis9aGVhZDEgTkFNRQorCitCPExpYk9NUC5wbT4gLS0KKworPWhlYWQxIFNZTk9QU0lTCisKKyAgICB1c2UgRmluZEJpbjsKKyAgICB1c2UgbGliICIkRmluZEJpbjo6QmluL2xpYiI7CisgICAgdXNlIExpYk9NUDsKKworICAgICRFTlZ7IExJQk9NUF9XT1JLICAgIH0KKyAgICAkRU5WeyBMSUJPTVBfVE1QICAgICB9CisgICAgJEVOVnsgTElCT01QX0VYUE9SVFMgfQorCis9aGVhZDEgREVTQ1JJUFRJT04KKworVGhlIG1vZHVsZSBjaGVja3MgQzxMSUJPTVBfV09SSz4sIEM8TElCT01QX0VYUE9SVFM+LCBhbmQgQzxMSUJPTVBfVE1QPiBlbnZpcm9ubWVudHMgdmFyaWFibGVzLgorSWYgYSB2YXJpYWJsZSBzZXQsIHRoZSBtb2R1bGUgbWFrZXMgc3VyZSBpdCBpcyBhYnNvbHV0ZS4gSWYgYSB2YXJpYWJsZSBkb2VzIG5vdCBleGlzdCwgdGhlIG1vZHVsZQorc2V0cyBpdCB0byBkZWZhdWx0IHZhbHVlLgorCitEZWZhdWx0IHZhbHVlIGZvciBDPExJQk9NUF9FWFBPUlRTPiBpcyBDPCRMSUJPTVBfV09SSy9leHBvcnRzPiwgZm9yIEM8TElCT01QX1RNUD4gLS0KK0M8JExJQk9NUF9XT1JLL3RtcD4uCisKK1ZhbHVlIGZvciBDPExJQk9NUF9XT1JLPiBpcyBndWVzc2VkLiBUaGUgbW9kdWxlIGFzc3VtZXMgdGhlIHNjcmlwdCAod2hpY2ggdXNlcyB0aGUgbW9kdWxlKSBpcworbG9jYXRlZCBpbiBDPHRvb2xzLz4gZGlyZWN0b3J5IG9mIGxpYm9tcCBkaXJlY3RvcnkgdHJlZSwgYW5kIHVzZXMgcGF0aCBvZiB0aGUgc2NyaXB0IHRvIGNhbGN1bGF0ZQorQzxMSUJPTVBfV09SSz4sCisKKz1jdXQKKworIyBlbmQgb2YgZmlsZSAjCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdG9vbHMvbGliL1BsYXRmb3JtLnBtIGIvZmluYWwvcnVudGltZS90b29scy9saWIvUGxhdGZvcm0ucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM5ZTU0ZgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdG9vbHMvbGliL1BsYXRmb3JtLnBtCkBAIC0wLDAgKzEsNDA1IEBACisjCisjIFRoaXMgaXMgbm90IGEgcnVubmFibGUgc2NyaXB0LCBpdCBpcyBhIFBlcmwgbW9kdWxlLCBhIGNvbGxlY3Rpb24gb2YgdmFyaWFibGVzLCBzdWJyb3V0aW5lcywgZXRjLgorIyB0byBiZSB1c2VkIGluIFBlcmwgc2NyaXB0cy4KKyMKKyMgVG8gZ2V0IGhlbHAgYWJvdXQgZXhwb3J0ZWQgdmFyaWFibGVzIGFuZCBzdWJyb3V0aW5lcywgZXhlY3V0ZSB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6CisjCisjICAgICBwZXJsZG9jIFBsYXRmb3JtLnBtCisjCisjIG9yIHNlZSBQT0QgKFBsYWluIE9sZCBEb2N1bWVudGF0aW9uKSBpbWJlZGRlZCB0byB0aGUgc291cmNlLi4uCisjCisjCisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKK3BhY2thZ2UgUGxhdGZvcm07CisKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7CisKK3VzZSBiYXNlICJFeHBvcnRlciI7CisKK3VzZSBVbmFtZTsKKworbXkgQHZhcnM7CisKK0JFR0lOIHsKKyAgICBAdmFycyA9IHF3eyAkaG9zdF9hcmNoICRob3N0X29zICRob3N0X3BsYXRmb3JtICR0YXJnZXRfYXJjaCAkdGFyZ2V0X29zICR0YXJnZXRfcGxhdGZvcm0gfTsKK30KKworb3VyICRWRVJTSU9OICAgICA9ICIwLjAxNCI7CitvdXIgQEVYUE9SVCAgICAgID0gcXd7fTsKK291ciBARVhQT1JUX09LICAgPSAoIHF3eyBjYW5vbl9hcmNoIGNhbm9uX29zIGxlZ2FsX2FyY2ggYXJjaF9vcHQgfSwgQHZhcnMgKTsKK291ciAlRVhQT1JUX1RBR1MgPSAoIGFsbCA9PiBbIEBFWFBPUlRfT0sgXSwgdmFycyA9PiBcQHZhcnMgKTsKKworIyBDYW5vbml6ZSBhcmNoaXRlY3R1cmUgbmFtZS4KK3N1YiBjYW5vbl9hcmNoKCQpIHsKKyAgICBteSAoICRhcmNoICkgPSBAXzsKKyAgICBpZiAoIGRlZmluZWQoICRhcmNoICkgKSB7CisgICAgICAgIGlmICggJGFyY2ggPX4gbXtcQVxzKig/OjMyfElBLT8zMnxJQS0/MzIgYXJjaGl0ZWN0dXJlfGlbMzQ1Nl04Nnx4ODYpXHMqXHp9aSApIHsKKyAgICAgICAgICAgICRhcmNoID0gIjMyIjsKKyAgICAgICAgfSBlbHNpZiAoICRhcmNoID1+IG17XEFccyooPzo0OHwoPzppYSk/MzJlfEludGVsXHMqNjR8SW50ZWxcKFJcKVxzKjY0fHg4NltfLV02NHx4NjR8QU1ENjQpXHMqXHp9aSApIHsKKyAgICAgICAgICAgICRhcmNoID0gIjMyZSI7CisgICAgICAgIH0gZWxzaWYgKCAkYXJjaCA9fiBte1xBYXJtKD86djdcRCopP1x6fSApIHsKKyAgICAgICAgICAgICRhcmNoID0gImFybSI7CisgICAgICAgIH0gZWxzaWYgKCAkYXJjaCA9fiBte1xBcHBjNjR9ICkgeworICAgICAgICAJJGFyY2ggPSAicHBjNjQiOyAgICAgICAgICAgIAorICAgICAgICB9IGVsc2lmICggJGFyY2ggPX4gbXtcQWFhcmNoNjR9ICkgeyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICRhcmNoID0gImFhcmNoNjQiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJGFyY2ggPSB1bmRlZjsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgaWYKKyAgICByZXR1cm4gJGFyY2g7Cit9OyAjIHN1YiBjYW5vbl9hcmNoCisKK3sgICMgUmV0dXJuIGxlZ2FsIGFwcHJvdmVkIGFyY2hpdGVjdHVyZSBuYW1lLgorICAgIG15ICVsZWdhbCA9ICgKKyAgICAgICAgIjMyIiAgPT4gIklBLTMyIGFyY2hpdGVjdHVyZSIsCisgICAgICAgICIzMmUiID0+ICJJbnRlbChSKSA2NCIsCisgICAgICAgICJhcm0iID0+ICJBUk0iLAorICAgICAgICAiYWFyY2g2NCIgPT4gIkFBcmNoNjQiLAorICAgICk7CisKKyAgICBzdWIgbGVnYWxfYXJjaCgkKSB7CisgICAgICAgIG15ICggJGFyY2ggKSA9IEBfOworICAgICAgICAkYXJjaCA9IGNhbm9uX2FyY2goICRhcmNoICk7CisgICAgICAgIGlmICggZGVmaW5lZCggJGFyY2ggKSApIHsKKyAgICAgICAgICAgICRhcmNoID0gJGxlZ2FseyAkYXJjaCB9OworICAgICAgICB9OyAjIGlmCisgICAgICAgIHJldHVybiAkYXJjaDsKKyAgICB9OyAjIHN1YiBsZWdhbF9hcmNoCit9CisKK3sgICMgUmV0dXJuIGFyY2hpdGVjdHVyZSBuYW1lIHN1aXRhYmxlIGZvciBJbnRlbCBjb21waWxlciBzZXR1cCBzY3JpcHRzLgorICAgIG15ICVvcHRpb24gPSAoCisgICAgICAgICIzMiIgID0+ICJpYTMyIiwKKyAgICAgICAgIjMyZSIgPT4gImludGVsNjQiLAorICAgICAgICAiNjQiICA9PiAiaWE2NCIsCisgICAgICAgICJhcm0iID0+ICJhcm0iLAorICAgICAgICAiYWFyY2g2NCIgPT4gImFhcmNoIiwKKyAgICApOworCisgICAgc3ViIGFyY2hfb3B0KCQpIHsKKyAgICAgICAgbXkgKCAkYXJjaCApID0gQF87CisgICAgICAgICRhcmNoID0gY2Fub25fYXJjaCggJGFyY2ggKTsKKyAgICAgICAgaWYgKCBkZWZpbmVkKCAkYXJjaCApICkgeworICAgICAgICAgICAgJGFyY2ggPSAkb3B0aW9ueyAkYXJjaCB9OworICAgICAgICB9OyAjIGlmCisgICAgICAgIHJldHVybiAkYXJjaDsKKyAgICB9OyAjIHN1YiBhcmNoX29wdAorfQorCisjIENhbm9uaXplIE9TIG5hbWUuCitzdWIgY2Fub25fb3MoJCkgeworICAgIG15ICggJG9zICkgPSBAXzsKKyAgICBpZiAoIGRlZmluZWQoICRvcyApICkgeworICAgICAgICBpZiAoICRvcyA9fiBte1xBXHMqKD86TGludXh8bGlufGwpXHMqXHp9aSApIHsKKyAgICAgICAgICAgICRvcyA9ICJsaW4iOworICAgICAgICB9IGVsc2lmICggJG9zID1+IG17XEFccyooPzpscmIpXHMqXHp9aSApIHsKKyAgICAgICAgICAgICRvcyA9ICJscmIiOworICAgICAgICB9IGVsc2lmICggJG9zID1+IG17XEFccyooPzpNYWMoPzpccypPUyg/OlxzKlgpPyk/fG1hY3xtfERhcndpbilccypcen1pICkgeworICAgICAgICAgICAgJG9zID0gIm1hYyI7CisgICAgICAgIH0gZWxzaWYgKCAkb3MgPX4gbXtcQVxzKig/Oldpbig/OmRvd3MpPyg/Oig/Ol98XHMqKT8oPzpOVHxYUHw5NXw5OHwyMDAzKSk/fHcpXHMqXHp9aSApIHsKKyAgICAgICAgICAgICRvcyA9ICJ3aW4iOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJG9zID0gdW5kZWY7CisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGlmCisgICAgcmV0dXJuICRvczsKK307ICMgc3ViIGNhbm9uX29zCisKK215ICggJF9ob3N0X29zLCAkX2hvc3RfYXJjaCwgJF90YXJnZXRfb3MsICRfdGFyZ2V0X2FyY2ggKTsKKworc3ViIHNldF90YXJnZXRfYXJjaCgkKSB7CisgICAgbXkgKCAkYXJjaCApID0gY2Fub25fYXJjaCggJF9bIDAgXSApOworICAgIGlmICggZGVmaW5lZCggJGFyY2ggKSApIHsKKyAgICAgICAgJF90YXJnZXRfYXJjaCAgICAgICA9ICRhcmNoOworICAgICAgICAkRU5WeyBMSUJPTVBfQVJDSCB9ID0gJGFyY2g7CisgICAgfTsgIyBpZgorICAgIHJldHVybiAkYXJjaDsKK307ICMgc3ViIHNldF90YXJnZXRfYXJjaAorCitzdWIgc2V0X3RhcmdldF9vcygkKSB7CisgICAgbXkgKCAkb3MgKSA9IGNhbm9uX29zKCAkX1sgMCBdICk7CisgICAgaWYgKCBkZWZpbmVkKCAkb3MgKSApIHsKKyAgICAgICAgJF90YXJnZXRfb3MgICAgICAgPSAkb3M7CisgICAgICAgICRFTlZ7IExJQk9NUF9PUyB9ID0gJG9zOworICAgIH07ICMgaWYKKyAgICByZXR1cm4gJG9zOworfTsgIyBzdWIgc2V0X3RhcmdldF9vcworCitzdWIgdGFyZ2V0X29wdGlvbnMoKSB7CisgICAgbXkgQG9wdGlvbnMgPSAoCisgICAgICAgICJ0YXJnZXQtb3N8b3M9cyIgPT4KKyAgICAgICAgICAgIHN1YiB7CisgICAgICAgICAgICAgICAgc2V0X3RhcmdldF9vcyggJF9bIDEgXSApIG9yCisgICAgICAgICAgICAgICAgICAgIGRpZSAiQmFkIHZhbHVlIG9mIC0tdGFyZ2V0LW9zIG9wdGlvbjogXCIkX1sgMSBdXCJcbiI7CisgICAgICAgICAgICB9LAorICAgICAgICAidGFyZ2V0LWFyY2hpdGVjdHVyZXx0YXJnZXJ0LWFyY2h8YXJjaGl0ZWN0dXJlfGFyY2g9cyIgPT4KKyAgICAgICAgICAgc3ViIHsKKyAgICAgICAgICAgICAgIHNldF90YXJnZXRfYXJjaCggJF9bIDEgXSApIG9yCisgICAgICAgICAgICAgICAgICAgZGllICJCYWQgdmFsdWUgb2YgLS10YXJnZXQtYXJjaGl0ZWN0dXJlIG9wdGlvbjogXCIkX1sgMSBdXCJcbiI7CisgICAgICAgICAgIH0sCisgICAgKTsKKyAgICByZXR1cm4gQG9wdGlvbnM7Cit9OyAjIHN1YiB0YXJnZXRfb3B0aW9ucworCisjIERldGVjdCBob3N0IGFyY2guCit7CisgICAgbXkgJGhhcmR3YXJlX3BsYXRmb3JtID0gVW5hbWU6OmhhcmR3YXJlX3BsYXRmb3JtKCk7CisgICAgaWYgKCAwICkgeworICAgIH0gZWxzaWYgKCAkaGFyZHdhcmVfcGxhdGZvcm0gZXEgImkzODYiICkgeworICAgICAgICAkX2hvc3RfYXJjaCA9ICIzMiI7CisgICAgfSBlbHNpZiAoICRoYXJkd2FyZV9wbGF0Zm9ybSBlcSAiaWE2NCIgKSB7CisgICAgICAgICRfaG9zdF9hcmNoID0gIjY0IjsKKyAgICB9IGVsc2lmICggJGhhcmR3YXJlX3BsYXRmb3JtIGVxICJ4ODZfNjQiICkgeworICAgICAgICAkX2hvc3RfYXJjaCA9ICIzMmUiOworICAgIH0gZWxzaWYgKCAkaGFyZHdhcmVfcGxhdGZvcm0gZXEgImFybSIgKSB7CisgICAgICAgICRfaG9zdF9hcmNoID0gImFybSI7CisgICAgfSBlbHNpZiAoICRoYXJkd2FyZV9wbGF0Zm9ybSBlcSAicHBjNjQiICkgeworICAgICAgICAkX2hvc3RfYXJjaCA9ICJwcGM2NCI7CisgICAgfSBlbHNpZiAoICRoYXJkd2FyZV9wbGF0Zm9ybSBlcSAiYWFyY2g2NCIgKSB7ICAgICAgICAgCisgICAgICAgICRfaG9zdF9hcmNoID0gImFhcmNoNjQiOyAgCisgICAgfSBlbHNlIHsKKyAgICAgICAgZGllICJVbnN1cHBvcnRlZCBob3N0IGhhcmR3YXJlIHBsYXRmb3JtOiBcIiRoYXJkd2FyZV9wbGF0Zm9ybVwiOyBzdG9wcGVkIjsKKyAgICB9OyAjIGlmCit9CisKKyMgRGV0ZWN0IGhvc3QgT1MuCit7CisgICAgbXkgJG9wZXJhdGluZ19zeXN0ZW0gPSBVbmFtZTo6b3BlcmF0aW5nX3N5c3RlbSgpOworICAgIGlmICggMCApIHsKKyAgICB9IGVsc2lmICggJG9wZXJhdGluZ19zeXN0ZW0gZXEgIkdOVS9MaW51eCIgKSB7CisgICAgICAgICRfaG9zdF9vcyA9ICJsaW4iOworICAgIH0gZWxzaWYgKCAkb3BlcmF0aW5nX3N5c3RlbSBlcSAiRnJlZUJTRCIgKSB7CisgICAgICAgICMgSG9zdCBPUyByZXNlbWJsZXMgTGludXguCisgICAgICAgICRfaG9zdF9vcyA9ICJsaW4iOworICAgIH0gZWxzaWYgKCAkb3BlcmF0aW5nX3N5c3RlbSBlcSAiRGFyd2luIiApIHsKKyAgICAgICAgJF9ob3N0X29zID0gIm1hYyI7CisgICAgfSBlbHNpZiAoICRvcGVyYXRpbmdfc3lzdGVtIGVxICJNUyBXaW5kb3dzIiApIHsKKyAgICAgICAgJF9ob3N0X29zID0gIndpbiI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGllICJVbnN1cHBvcnRlZCBob3N0IG9wZXJhdGluZyBzeXN0ZW06IFwiJG9wZXJhdGluZ19zeXN0ZW1cIjsgc3RvcHBlZCI7CisgICAgfTsgIyBpZgorfQorCisjIERldGVjdCB0YXJnZXQgYXJjaC4KK2lmICggZGVmaW5lZCggJEVOVnsgTElCT01QX0FSQ0ggfSApICkgeworICAgICMgVXNlIGFyY2ggc3BlY2lmaWVkIGluIExJQk9NUF9BUkNILgorICAgICRfdGFyZ2V0X2FyY2ggPSBjYW5vbl9hcmNoKCAkRU5WeyBMSUJPTVBfQVJDSCB9ICk7CisgICAgaWYgKCBub3QgZGVmaW5lZCggJF90YXJnZXRfYXJjaCApICkgeworICAgICAgICBkaWUgIlVua25vd24gYXJjaGl0ZWN0dXJlIHNwZWNpZmllZCBpbiBMSUJPTVBfQVJDSCBlbnZpcm9ubWVudCB2YXJpYWJsZTogXCIkRU5WeyBMSUJPTVBfQVJDSCB9XCIiOworICAgIH07ICMgaWYKK30gZWxzZSB7CisgICAgIyBPdGhlcndpc2UgdXNlIGhvc3QgYXJjaGl0ZWN0dXJlLgorICAgICRfdGFyZ2V0X2FyY2ggPSAkX2hvc3RfYXJjaDsKK307ICMgaWYKKyRFTlZ7IExJQk9NUF9BUkNIIH0gPSAkX3RhcmdldF9hcmNoOworCisjIERldGVjdCB0YXJnZXQgT1MuCitpZiAoIGRlZmluZWQoICRFTlZ7IExJQk9NUF9PUyB9ICkgKSB7CisgICAgIyBVc2UgT1Mgc3BlY2lmaWVkIGluIExJQk9NUF9PUy4KKyAgICAkX3RhcmdldF9vcyA9IGNhbm9uX29zKCAkRU5WeyBMSUJPTVBfT1MgfSApOworICAgIGlmICggbm90IGRlZmluZWQoICRfdGFyZ2V0X29zICkgKSB7CisgICAgICAgIGRpZSAiVW5rbm93biBPUyBzcGVjaWZpZWQgaW4gTElCT01QX09TIGVudmlyb25tZW50IHZhcmlhYmxlOiBcIiRFTlZ7IExJQk9NUF9PUyB9XCIiOworICAgIH07ICMgaWYKK30gZWxzZSB7CisgICAgIyBPdGhlcndpc2UgdXNlIGhvc3QgT1MuCisgICAgJF90YXJnZXRfb3MgPSAkX2hvc3Rfb3M7Cit9OyAjIGlmCiskRU5WeyBMSUJPTVBfT1MgfSA9ICRfdGFyZ2V0X29zOworCit1c2UgdmFycyBAdmFyczsKKwordGllKCAkaG9zdF9hcmNoLCAgICAgICAiUGxhdGZvcm06Omhvc3RfYXJjaCIgKTsKK3RpZSggJGhvc3Rfb3MsICAgICAgICAgIlBsYXRmb3JtOjpob3N0X29zIiApOwordGllKCAkaG9zdF9wbGF0Zm9ybSwgICAiUGxhdGZvcm06Omhvc3RfcGxhdGZvcm0iICk7Cit0aWUoICR0YXJnZXRfYXJjaCwgICAgICJQbGF0Zm9ybTo6dGFyZ2V0X2FyY2giICk7Cit0aWUoICR0YXJnZXRfb3MsICAgICAgICJQbGF0Zm9ybTo6dGFyZ2V0X29zIiApOwordGllKCAkdGFyZ2V0X3BsYXRmb3JtLCAiUGxhdGZvcm06OnRhcmdldF9wbGF0Zm9ybSIgKTsKKworeyBwYWNrYWdlIFBsYXRmb3JtOjpiYXNlOworCisgICAgdXNlIENhcnA7CisKKyAgICB1c2UgVGllOjpTY2FsYXI7CisgICAgdXNlIGJhc2UgIlRpZTo6U3RkU2NhbGFyIjsKKworICAgIHN1YiBTVE9SRSB7CisgICAgICAgIG15ICRzZWxmID0gc2hpZnQoIEBfICk7CisgICAgICAgIGNyb2FrKCAiTW9kaWZ5aW5nIFwkIiAuIHJlZiggJHNlbGYgKSAuICIgaXMgbm90IGFsbG93ZWQ7IHN0b3BwZWQiICk7CisgICAgfTsgIyBzdWIgU1RPUkUKKworfSAjIHBhY2thZ2UgUGxhdGZvcm06OmJhc2UKKworeyBwYWNrYWdlIFBsYXRmb3JtOjpob3N0X2FyY2g7CisgICAgdXNlIGJhc2UgIlBsYXRmb3JtOjpiYXNlIjsKKyAgICBzdWIgRkVUQ0ggeworICAgICAgICByZXR1cm4gJF9ob3N0X2FyY2g7CisgICAgfTsgIyBzdWIgRkVUQ0gKK30gIyBwYWNrYWdlIFBsYXRmb3JtOjpob3N0X2FyY2gKKworeyBwYWNrYWdlIFBsYXRmb3JtOjpob3N0X29zOworICAgIHVzZSBiYXNlICJQbGF0Zm9ybTo6YmFzZSI7CisgICAgc3ViIEZFVENIIHsKKyAgICAgICAgcmV0dXJuICRfaG9zdF9vczsKKyAgICB9OyAjIHN1YiBGRVRDSAorfSAjIHBhY2thZ2UgUGxhdGZvcm06Omhvc3Rfb3MKKworeyBwYWNrYWdlIFBsYXRmb3JtOjpob3N0X3BsYXRmb3JtOworICAgIHVzZSBiYXNlICJQbGF0Zm9ybTo6YmFzZSI7CisgICAgc3ViIEZFVENIIHsKKyAgICAgICAgcmV0dXJuICIke19ob3N0X29zfV8ke19ob3N0X2FyY2h9IjsKKyAgICB9OyAjIHN1YiBGRVRDSAorfSAjIHBhY2thZ2UgUGxhdGZvcm06Omhvc3RfcGxhdGZvcm0KKworeyBwYWNrYWdlIFBsYXRmb3JtOjp0YXJnZXRfYXJjaDsKKyAgICB1c2UgYmFzZSAiUGxhdGZvcm06OmJhc2UiOworICAgIHN1YiBGRVRDSCB7CisgICAgICAgIHJldHVybiAkX3RhcmdldF9hcmNoOworICAgIH07ICMgc3ViIEZFVENICit9ICMgcGFja2FnZSBQbGF0Zm9ybTo6dGFyZ2V0X2FyY2gKKworeyBwYWNrYWdlIFBsYXRmb3JtOjp0YXJnZXRfb3M7CisgICAgdXNlIGJhc2UgIlBsYXRmb3JtOjpiYXNlIjsKKyAgICBzdWIgRkVUQ0ggeworICAgICAgICByZXR1cm4gJF90YXJnZXRfb3M7CisgICAgfTsgIyBzdWIgRkVUQ0gKK30gIyBwYWNrYWdlIFBsYXRmb3JtOjp0YXJnZXRfb3MKKworeyBwYWNrYWdlIFBsYXRmb3JtOjp0YXJnZXRfcGxhdGZvcm07CisgICAgdXNlIGJhc2UgIlBsYXRmb3JtOjpiYXNlIjsKKyAgICBzdWIgRkVUQ0ggeworICAgICAgICByZXR1cm4gIiR7X3RhcmdldF9vc31fJHtfdGFyZ2V0X2FyY2h9IjsKKyAgICB9OyAjIHN1YiBGRVRDSAorfSAjIHBhY2thZ2UgUGxhdGZvcm06OnRhcmdldF9wbGF0Zm9ybQorCisKK3JldHVybiAxOworCitfX0VORF9fCisKKz1wb2QKKworPWhlYWQxIE5BTUUKKworQjxQbGF0Zm9ybS5wbT4gLS0gRmV3IHN1YnJvdXRpbmVzIHRvIGdldCBPUywgYXJjaGl0ZWN0dXJlIGFuZCBwbGF0Zm9ybSBuYW1lIGluIGZvcm0gc3VpdGFibGUgZm9yCituYW1pbmcgZmlsZXMsIGRpcmVjdG9yaWVzLCBtYWNyb3MsIGV0Yy4KKworPWhlYWQxIFNZTk9QU0lTCisKKyAgICB1c2UgUGxhdGZvcm0gIjphbGwiOworICAgIHVzZSB0b29sczsKKworICAgIG15ICRhcmNoICAgPSBjYW5vbl9hcmNoKCAiZW02NFQiICk7ICAgICAgICAjIFJldHVybnMgIjMyZSIuCisgICAgbXkgJGxlZ2FsICA9IGxlZ2FsX2FyY2goICJlbTY0dCIgKTsgICAgICAgICMgUmV0dXJucyAiSW50ZWwoUikgNjQiLgorICAgIG15ICRvcHRpb24gPSBhcmNoX29wdCggImVtNjR0IiApOyAgICAgICAgICAjIFJldHVybnMgImludGVsNjQiLgorICAgIG15ICRvcyAgICAgPSBjYW5vbl9vcyggIldpbmRvd3MgTlQiICk7ICAgICAjIFJldHVybnMgIndpbiIuCisKKyAgICBwcmludCggJGhvc3RfYXJjaCwgJGhvc3Rfb3MsICRob3N0X3BsYXRmb3JtICk7CisgICAgcHJpbnQoICR0YXJlZ3RfYXJjaCwgJHRhcmdldF9vcywgJHRhcmdldF9wbGF0Zm9ybSApOworCisgICAgdG9vbHM6OmdldF9vcHRpb25zKAorICAgICAgICBQbGF0Zm9ybTo6dGFyZ2V0X29wdGlvbnMoKSwKKyAgICAgICAgLi4uCisgICAgKTsKKworCis9aGVhZDEgREVTQ1JJUFRJT04KKworRW52aXJvbm1lbnQgdmFyaWFibGUgTElCT01QX09TIHNwZWNpZmllcyB0YXJnZXQgT1MgdG8gcmVwb3J0LiBJZiBMSUJPTVBfT1MgaWQgbm90IGRlZmluZWQsCit0aGUgc2NyaXB0IGFzc3VtZXMgaG9zdCBPUyBpcyB0YXJnZXQgT1MuCisKK0Vudmlyb25tZW50IHZhcmlhYmxlIExJQk9NUF9BUkNIIHNwZWNpZmllcyB0YXJnZXQgYXJjaGl0ZWN0dXJlIHRvIHJlcG9ydC4gSWYgTElCT01QX0FSQ0ggaXMgbm90IGRlZmluZWQsCit0aGUgc2NyaXB0IGFzc3VtZXMgaG9zdCBhcmNoaXRlY3R1cmUgaXMgdGFyZ2V0IG9uZS4KKworPWhlYWQyIEZ1bmN0aW9ucy4KKworPW92ZXIKKworPWl0ZW0gQjxjYW5vbl9hcmNoKCAkYXJjaCApPgorCitJbnB1dCBzdHJpbmcgaXMgYW4gYXJjaGl0ZWN0dXJlIG5hbWUgdG8gY2Fub25pemUuIFRoZSBmdW5jdGlvbiByZWNvZ25pemVzIG1hbnkgdmFyaWFudHMsIGZvciBleGFtcGxlOgorQzwzMmU+LCBDPEludGVsNjQ+LCBDPEludGVsKFIpIDY0PiwgZXRjLiBSZXR1cm5lZCBzdHJpbmcgaXMgYSBjYW5vbm9uaXplZCBhcmNoaXRlY3R1cmUgbmFtZSwKK29uZSBvZjogQzwzMj4sIEM8MzJlPiwgQzw2ND4sIG9yIEM8dW5kZWY+IGlzIGlucHV0IHN0cmluZyBpcyBub3QgcmVjb2duaXplZC4KKworPWl0ZW0gQjxsZWdhbF9hcmNoKCAkYXJjaCApPgorCitJbnB1dCBzdHJpbmcgaXMgYXJjaGl0ZWN0dXJlIG5hbWUuIFRoZSBmdW5jdGlvbiByZWNvZ25pemVzIHRoZSBzYW1lIHZhcmlhbnRzIGFzIEM8YXJjaF9jYW5vbigpPiBkb2VzLgorUmV0dXJuZWQgc3RyaW5nIGlzIGEgbmFtZSBhcHByb3ZlZCBieSBJbnRlbCBMZWdhbCwgb25lIG9mOiBDPElBLTMyIGFyY2hpdGVjdHVyZT4sIEM8SW50ZWwoUikgNjQ+CitvciBDPHVuZGVmPiBpZiBpbnB1dCBzdHJpbmcgaXMgbm90IHJlY29nbml6ZWQuCisKKz1pdGVtIEI8YXJjaF9vcHQoICRhcmNoICk+CisKK0lucHV0IHN0cmluZyBpcyBhcmNoaXRlY3R1cmUgbmFtZS4gVGhlIGZ1bmN0aW9uIHJlY29nbml6ZXMgdGhlIHNhbWUgdmFyaWFudHMgYXMgQzxhcmNoX2Nhbm9uKCk+IGRvZXMuCitSZXR1cm5lZCBzdHJpbmcgaXMgYW4gYXJjaGl0ZWN0dXJlIG5hbWUgc3VpdGFibGUgZm9yIHBhc3NpbmcgdG8gY29tcGlsZXIgc2V0dXAgc2NyaXB0cworKGUuIGcuIEM8aWNjdmFycy5zaD4pLCBvbmUgb2Y6IEM8SUEtMzIgYXJjaGl0ZWN0dXJlPiwgQzxJbnRlbChSKSA2ND4gb3IgQzx1bmRlZj4gaWYgaW5wdXQgc3RyaW5nIGlzIG5vdAorcmVjb2duaXplZC4KKworPWl0ZW0gQjxjYW5vbl9vcyggJG9zICk+CisKK0lucHV0IHN0cmluZyBpcyBPUyBuYW1lIHRvIGNhbm9uaXplLiBUaGUgZnVuY3Rpb24gcmVjb2duaXplcyBtYW55IHZhcmlhbnRzLCBmb3IgZXhhbXBsZTogQzxtYWM+LCBDPE9TIFg+LCBldGMuIFJldHVybmVkIHN0cmluZyBpcyBhIGNhbm9uaXplZCBPUyBuYW1lLCBvbmUgb2Y6IEM8bGluPiwgQzxscmI+LAorQzxtYWM+LCBDPHdpbj4sIG9yIEM8dW5kZWY+IGlzIGlucHV0IHN0cmluZyBpcyBub3QgcmVjb2duaXplZC4KKworPWl0ZW0gQjx0YXJnZXRfb3B0aW9ucygpPgorCitSZXR1cm5zIGFycmF5IHN1aXRhYmxlIGZvciBwYXNzaW5nIHRvIEM8dG9vbHM6OmdldF9vcHRpb25zKCk+IHRvIGxldCBhIHNjcmlwdCByZWNvZ25pemUKK0M8LS10YXJnZXQtYXJjaGl0ZWN0dXJlPUk8c3RyPj4gYW5kIEM8LS10YXJnZXQtb3M9STxzdHI+PiBvcHRpb25zLiBUeXBpY2FsIHVzYWdlIGlzOgorCisgICAgdXNlIHRvb2xzOworICAgIHVzZSBQbGF0Zm9ybTsKKworICAgIG15ICggJG9zLCAkYXJjaCwgJHBsYXRmb3JtICk7ICAgICMgR2xvYmFsIHZhcmlhYmxlcywgbm90IGluaXRpYWxpemVkLgorCisgICAgLi4uCisKKyAgICBnZXRfb3B0aW9ucygKKyAgICAgICAgUGxhdGZvcm06OnRhcmdldF9vcHRpb25zKCksICAjIExldCBzY3JpcHQgcmVjb2duaXplIC0tdGFyZ2V0LW9zIGFuZCAtLXRhcmdldC1hcmNoIG9wdGlvbnMuCisgICAgICAgIC4uLgorICAgICk7CisgICAgIyBJbml0aWFsaXplIHZhcmlhYmxzIGFmdGVyIHBhcnNpbmcgY29tbWFuZCBsaW5lLgorICAgICggJG9zLCAkYXJjaCwgJHBsYXRmb3JtICkgPSAoIFBsYXRmb3JtOjp0YXJnZXRfb3MoKSwgUGxhdGZvcm06OnRhcmdldF9hcmNoKCksIFBsYXRmb3JtOjp0YXJnZXRfcGxhdGZvcm0oKSApOworCis9YmFjaworCis9aGVhZDIgVmFyaWFibGVzCisKKz1pdGVtIEI8JGhvc3RfYXJjaD4KKworQ2Fub25pemVkIG5hbWUgb2YgaG9zdCBhcmNoaXRlY3R1cmUuCisKKz1pdGVtIEI8JGhvc3Rfb3M+CisKK0Nhbm9uaXplZCBuYW1lIG9mIGhvc3QgT1MuCisKKz1pdGVtIEI8JGhvc3RfcGxhdGZvcm0+CisKK0hvc3QgcGxhdGZvcm0gbmFtZSAoY29uY2F0ZW5hdGVkIGNhbm9uaXplZCBPUyBuYW1lLCB1bmRlcnNjb3JlLCBhbmQgY2Fub25pemVkIGFyY2hpdGVjdHVyZSBuYW1lKS4KKworPWl0ZW0gQjwkdGFyZ2V0X2FyY2g+CisKK0Nhbm9uaXplZCBuYW1lIG9mIHRhcmdldCBhcmNoaXRlY3R1cmUuCisKKz1pdGVtIEI8JHRhcmdldF9vcz4KKworQ2Fub25pemVkIG5hbWUgb2YgdGFyZ2V0IE9TLgorCis9aXRlbSBCPCR0YXJnZXRfcGxhdGZvcm0+CisKK1RhcmdldCBwbGF0Zm9ybSBuYW1lIChjb25jYXRlbmF0ZWQgY2Fub25pemVkIE9TIG5hbWUsIHVuZGVyc2NvcmUsIGFuZCBjYW5vbml6ZWQgYXJjaGl0ZWN0dXJlIG5hbWUpLgorCis9YmFjaworCis9Y3V0CisKKyMgZW5kIG9mIGZpbGUgIworCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rvb2xzL2xpYi9VbmFtZS5wbSBiL2ZpbmFsL3J1bnRpbWUvdG9vbHMvbGliL1VuYW1lLnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1YmJkZTUKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rvb2xzL2xpYi9VbmFtZS5wbQpAQCAtMCwwICsxLDYzMSBAQAorIworIyBUaGlzIGlzIG5vdCBhIHJ1bm5hYmxlIHNjcmlwdCwgaXQgaXMgYSBQZXJsIG1vZHVsZSwgYSBjb2xsZWN0aW9uIG9mIHZhcmlhYmxlcywgc3Vicm91dGluZXMsIGV0Yy4KKyMgVG8gZ2V0IGhlbHAgYWJvdXQgZXhwb3J0ZWQgdmFyaWFibGVzIGFuZCBzdWJyb3V0aW5lcywgZXhlY3V0ZSB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6CisjCisjICAgICBwZXJsZG9jIFVuYW1lLnBtCisjCisjIG9yIHNlZSBQT0QgKFBsYWluIE9sZCBEb2N1bWVudGF0aW9uKSBlbWJlZGRlZCB0byB0aGUgc291cmNlLi4uCisjCisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKK3BhY2thZ2UgVW5hbWU7CisKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7Cit1c2Ugd2FybmluZ3M6OnJlZ2lzdGVyOwordXNlIEV4cG9ydGVyOworCit1c2UgUE9TSVg7Cit1c2UgRmlsZTo6R2xvYiAiOmdsb2IiOwordXNlIE5ldDo6RG9tYWluIHF3e307CisKKyMgRm9sbG93aW5nIGNvZGUgZG9lcyBub3Qgd29yayB3aXRoIFBlcmwgNS42IG9uIExpbnV4KiBPUyBhbmQgV2luZG93cyogT1M6CisjCisjICAgICB1c2UgaWYgJF5PIGVxICJkYXJ3aW4iLCB0b29scyA9PiBxd3t9OworIworIyBUaGUgd29ya2Fyb3VuZCBmb3IgUGVybCA1LjY6CisjCitCRUdJTiB7CisgICAgaWYgKCAkXk8gZXEgImRhcndpbiIgb3IgJF5PIGVxICJsaW51eCIgKSB7CisJcmVxdWlyZSB0b29sczsKKyAgICAgICAgaW1wb3J0IHRvb2xzOworICAgIH07ICMgaWYKKyAgICBpZiAoICReTyBlcSAiTVNXaW4zMiIgKSB7CisgICAgICAgIHJlcXVpcmUgV2luMzI7CisgICAgfTsgIyBpZgorfTsgIyBCRUdJTgorCitteSAkbXN3aW4gPSBxcntcQSg/Ok1TV2luMzJ8V2luZG93c19OVClcen07CisKK215IEBwb3NpeCA9IHF3eyBrZXJuZWxfbmFtZSBmcWRuIGtlcm5lbF9yZWxlYXNlIGtlcm5lbF92ZXJzaW9uIG1hY2hpbmUgfTsKKyAgICAjIFByb3BlcnRpZXMgc3VwcG9ydGVkIGJ5IFBPU0lYOjp1bmFtZSgpLgorbXkgQGxpbnV4ID0KKyAgICBxd3sgcHJvY2Vzc29yIGhhcmR3YXJlX3BsYXRmb3JtIG9wZXJhdGluZ19zeXN0ZW0gfTsKKyAgICAjIFByb3BlcnRpZXMgcmVwb3J0ZWQgYnkgdW5hbWUgaW4gTGludXgqIE9TLgorbXkgQGJhc2UgPSAoIEBwb3NpeCwgQGxpbnV4ICk7CisgICAgIyBCYXNlIHByb3BlcnRpZXMuCitteSBAYXV4ID0KKyAgICAoCisgICAgICAgIHF3eyBob3N0X25hbWUgZG9tYWluX25hbWUgfSwKKyAgICAgICAgbWFwKCAib3BlcmF0aW5nX3N5c3RlbV8kXyIsIHF3eyBuYW1lIHJlbGVhc2UgY29kZW5hbWUgZGVzY3JpcHRpb24gfSApCisgICAgKTsKKyAgICAjIEF1eGlsaWFyeSBwcm9wZXJ0aWVzLgorbXkgQGFsbCA9ICggQGJhc2UsIEBhdXggKTsKKyAgICAjIEFsbCB0aGUgcHJvcGVydGllcy4KK215IEBtZXRhID0gcXd7IGJhc2VfbmFtZXMgYWxsX25hbWVzIHZhbHVlIH07CisgICAgIyBNZXRhIGZ1bmN0aW9ucy4KKworb3VyICRWRVJTSU9OICAgICA9ICIwLjA3IjsKK291ciBASVNBICAgICAgICAgPSBxd3sgRXhwb3J0ZXIgfTsKK291ciBARVhQT1JUICAgICAgPSBxd3t9Oworb3VyIEBFWFBPUlRfT0sgICA9ICggQGFsbCwgQG1ldGEgKTsKK291ciAlRVhQT1JUX1RBR1MgPQorICAgICgKKyAgICAgICAgYmFzZSA9PiBbIEBiYXNlIF0sCisgICAgICAgIGFsbCAgPT4gWyBAYWxsICBdLAorICAgICAgICBtZXRhID0+IFsgQG1ldGEgXSwKKyAgICApOworCitteSAldmFsdWVzOworICAgICMgSGFzaCBvZiB2YWx1ZXMuIFNvbWUgdmFsdWVzIGFyZSBzdHJpbmdzLCBzb21lIG1heSBiZSByZWZlcmVuY2VzIHRvIGNvZGUgd2hpY2ggc2hvdWxkIGJlCisgICAgIyBldmFsdWF0ZWQgdG8gZ2V0IHJlYWwgdmFsdWUuIFRoaXMgdHJpY2sgaXMgaW1wbGVtZW50ZWQgYmVjYXVzZSBjYWxsIHRvIE5ldDo6RG9tYWluOjpob3N0ZnFkbigpCisgICAgIyBpcyByZWxhdGl2ZWx5IHNsb3cuCisKKyMgR2V0IHZhbHVlcyBmcm9tIFBPU0lYOjp1bmFtZSgpLgorQHZhbHVlc3sgQHBvc2l4IH0gPSBQT1NJWDo6dW5hbWUoKTsKKworIyBPbiBzb21lIHN5c3RlbXMgUE9TSVg6OnVuYW1lKCkgcmV0dXJucyAic2hvcnQiIG5vZGUgbmFtZSAod2l0aG91dCBkb21haW4gbmFtZSkuIFRvIGJlIGNvbnNpc3RlbnQKKyMgb24gYWxsIHN5c3RlbXMsIHdlIHdpbGwgZ2V0IG5vZGUgbmFtZSBmcm9tIGFsdGVybmF0aXZlIHNvdXJjZS4KK2lmICggJF5PID1+IG0vY3lnd2luL2kgKSB7CisgICAgIyBGdW5jdGlvbiBmcm9tIE5ldDo6RG9tYWluIG1vZHVsZSB3b3JrcyB3ZWxsLCBidXQgb24gQ3lnd2luIGl0IHByaW50cyB0bworICAgICMgc3RkZXJyICJkb21haW5uYW1lOiBub3QgZm91bmQiLiBTbyB3ZSB3aWxsIHVzZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIG5vdy4KKyAgICAkdmFsdWVzeyBmcWRuIH0gPSBsYyggJEVOVnsgQ09NUFVURVJOQU1FIH0gLiAiLiIgLiAkRU5WeyBVU0VSRE5TRE9NQUlOIH0gKTsKK30gZWxzZSB7CisgICAgIyBPbiBzeXN0ZW1zIG90aGVyIHRoYW4gQ3lnd2luLCBsZXQgdXMgdXNlIE5ldDo6RG9tYWluOjpob3N0ZnFkbigpLCBidXQgZG8gaXQgb25seSBub2RlIG5hbWUKKyAgICAjIGlzIHJlYWxseSByZXF1ZXN0ZWQuCisgICAgJHZhbHVlc3sgZnFkbiB9ID0KKyAgICAgICAgc3ViIHsKKyAgICAgICAgICAgIG15ICRmcWRuID0gTmV0OjpEb21haW46Omhvc3RmcWRuKCk7ICMgImZxZG4iIHN0YW5kcyBmb3IgImZ1bGx5IHF1YWxpZmllZCBkb2FtYWluIG5hbWUiLgorICAgICAgICAgICAgIyBPbiBzb21lIHN5c3RlbXMgUE9TSVg6OnVuYW1lKCkgYW5kIE5ldDo6RG9tYWluOjpob3N0ZnFkbigpIHJlcG9ydHMgZGlmZmVyZW50IG5hbWVzLgorICAgICAgICAgICAgIyBMZXQgdXMgaXNzdWUgYSB3YXJuaW5nIGlmIHRoZXkgc2lnbmlmaWNhbnRseSBkaWZmZXJlbnQuIE5hbWVzIGFyZSBpbnNpZ25pZmljYW50bHkKKyAgICAgICAgICAgICMgZGlmZmVyZW50IGlmIFBPU0lYOjp1bmFtZSgpIG1hdGNoZXMgdGhlIGJlZ2lubmluZyBvZiBOZXQ6OkRvbWFpbjo6aG9zdGZxZG4oKS4KKyAgICAgICAgICAgIGlmICgKKyAgICAgICAgICAgICAgICAkZnFkbiBlcSBzdWJzdHIoICRmcWRuLCAwLCBsZW5ndGgoICRmcWRuICkgKQorICAgICAgICAgICAgICAgICYmCisgICAgICAgICAgICAgICAgKAorICAgICAgICAgICAgICAgICAgICBsZW5ndGgoICRmcWRuICkgPT0gbGVuZ3RoKCAkZnFkbiApCisgICAgICAgICAgICAgICAgICAgIHx8CisgICAgICAgICAgICAgICAgICAgIHN1YnN0ciggJGZxZG4sIGxlbmd0aCggJGZxZG4gKSwgMSApIGVxICIuIgorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICkgeworICAgICAgICAgICAgICAgICMgT2suCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHdhcm5pbmdzOjp3YXJuaWYoCisgICAgICAgICAgICAgICAgICAgICJQT1NJWDo6dW5hbWUoKSBhbmQgTmV0OjpEb21haW46Omhvc3RmcWRuKCkgcmVwb3J0ZWQgZGlmZmVyZW50IG5hbWVzOiAiIC4KKyAgICAgICAgICAgICAgICAgICAgICAgICJcIiR2YWx1ZXN7IGZxZG4gfVwiIGFuZCBcIiRmcWRuXCIgcmVzcGVjdGl2ZWx5XG4iCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgIHJldHVybiAkZnFkbjsKKyAgICAgICAgfTsgIyBzdWIKK307ICMgaWYKKworaWYgKCAkXk8gPX4gJG1zd2luICkgeworICAgIGlmICgKKyAgICAgICAgJHZhbHVlc3sgbWFjaGluZSB9ID1+IG17XEEoPzp4ODZ8WzU2XTg2KVx6fQorICAgICAgICBhbmQKKyAgICAgICAgZXhpc3RzKCAkRU5WeyBQUk9DRVNTT1JfQVJDSElURUNUVVJFIH0gKSBhbmQgJEVOVnsgUFJPQ0VTU09SX0FSQ0hJVEVDVFVSRSB9IGVxICJ4ODYiCisgICAgICAgIGFuZAorICAgICAgICBleGlzdHMoICRFTlZ7IFBST0NFU1NPUl9BUkNISVRFVzY0MzIgfSApCisgICAgKSB7CisgICAgICAgIGlmICggJEVOVnsgUFJPQ0VTU09SX0FSQ0hJVEVXNjQzMiB9IGVxICJBTUQ2NCIgKSB7CisgICAgICAgICAgICAkdmFsdWVzeyBtYWNoaW5lIH0gPSAieDg2XzY0IjsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgaWYKK307ICMgaWYKKworIyBTb21lIHZhbHVlcyBhcmUgbm90IHJldHVybmVkIGJ5IFBPU0lYOjp1bmFtZSgpLCBsZXQgdXMgY29tcHV0ZSB0aGVtLgorCisjIHByb2Nlc3Nvci4KKyR2YWx1ZXN7IHByb2Nlc3NvciB9ID0gJHZhbHVlc3sgbWFjaGluZSB9OworCisjIGhhcmR3YXJlX3BsYXRmb3JtLgoraWYgKCAwICkgeworfSBlbHNpZiAoICReTyBlcSAibGludXgiIG9yICReTyBlcSAiZnJlZWJzZCIgKSB7CisgICAgaWYgKCAwICkgeworICAgIH0gZWxzaWYgKCAkdmFsdWVzeyBtYWNoaW5lIH0gPX4gbXtcQWlbMzQ1Nl04Nlx6fSApIHsKKyAgICAgICAgJHZhbHVlc3sgaGFyZHdhcmVfcGxhdGZvcm0gfSA9ICJpMzg2IjsKKyAgICB9IGVsc2lmICggJHZhbHVlc3sgbWFjaGluZSB9ID1+IG17XEEoeDg2XzY0fGFtZDY0KVx6fSApIHsKKyAgICAgICAgJHZhbHVlc3sgaGFyZHdhcmVfcGxhdGZvcm0gfSA9ICJ4ODZfNjQiOworICAgIH0gZWxzaWYgKCAkdmFsdWVzeyBtYWNoaW5lIH0gPX4gbXtcQWFybXY3XEQqXHp9ICkgeworICAgICAgICAkdmFsdWVzeyBoYXJkd2FyZV9wbGF0Zm9ybSB9ID0gImFybSI7CisgICAgfSBlbHNpZiAoICR2YWx1ZXN7IG1hY2hpbmUgfSA9fiBte1xBcHBjNjRcen0gKSB7CisgICAgICAgICR2YWx1ZXN7IGhhcmR3YXJlX3BsYXRmb3JtIH0gPSAicHBjNjQiOworICAgIH0gZWxzaWYgKCAkdmFsdWVzeyBtYWNoaW5lIH0gPX4gbXtcQWFhcmNoNjRcen0gKSB7CisgICAgICAgICR2YWx1ZXN7IGhhcmR3YXJlX3BsYXRmb3JtIH0gPSAiYWFyY2g2NCI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGllICJVbnN1cHBvcnRlZCBtYWNoaW5lIChcIiR2YWx1ZXN7IG1hY2hpbmUgfVwiKSByZXR1cm5lZCBieSBQT1NJWDo6dW5hbWUoKTsgc3RvcHBlZCI7CisgICAgfTsgIyBpZgorfSBlbHNpZiAoICReTyBlcSAiZGFyd2luIiApIHsKKyAgICBpZiAoIDAgKSB7CisgICAgfSBlbHNpZiAoICR2YWx1ZXN7IG1hY2hpbmUgfSBlcSAieDg2IiBvciAkdmFsdWVzeyBtYWNoaW5lIH0gZXEgImkzODYiICkgeworICAgICAgICAkdmFsdWVzeyBoYXJkd2FyZV9wbGF0Zm9ybSB9ID0KKyAgICAgICAgICAgIHN1YiB7CisgICAgICAgICAgICAgICAgbXkgJHBsYXRmb3JtID0gImkzODYiOworICAgICAgICAgICAgICAgICMgU29tZSBPU2VzIG9uIEludGVsKFIpIDY0IHN0aWxsIHJlcG9ydHMgImkzODYiIG1hY2hpbmUuIFZlcmlmeSBpdCBieSB1c2luZworICAgICAgICAgICAgICAgICMgdGhlIHZhbHVlIHJldHVybmVkIGJ5ICdzeXNjdGwgLW4gaHcub3B0aW9uYWwueDg2XzY0Jy4gT24gSW50ZWwoUikgNjQtYml0IHN5c3RlbXMgdGhlCisgICAgICAgICAgICAgICAgIyB2YWx1ZSA9PSAxOyBvbiAzMi1iaXQgc3lzdGVtcyB0aGUgJ2h3Lm9wdGlvbmFsLng4Nl82NCcgcHJvcGVydHkgZWl0aGVyIGRvZXMgbm90IGV4aXN0CisgICAgICAgICAgICAgICAgIyBvciB0aGUgdmFsdWUgPT0gMC4gVGhlIHBhdGggdmFyaWFibGUgZG9lcyBub3QgY29udGFpbiBhIHBhdGggdG8gc3lzY3RsIHdoZW4KKyAgICAgICAgICAgICAgICAjIHN0YXJ0ZWQgYnkgY3JvbnRhYi4KKyAgICAgICAgICAgICAgICBteSAkc3lzY3RsID0gKCB3aGljaCggInN5c2N0bCIgKSBvciAiL3Vzci9zYmluL3N5c2N0bCIgKTsKKyAgICAgICAgICAgICAgICBteSAkb3V0cHV0OworICAgICAgICAgICAgICAgIGRlYnVnKCAiRXhlY3V0aW5nICRzeXNjdGwuLi4iICk7CisgICAgICAgICAgICAgICAgZXhlY3V0ZSggWyAkc3lzY3RsLCAiLW4iLCAiaHcub3B0aW9uYWwueDg2XzY0IiBdLCAtc3Rkb3V0ID0+IFwkb3V0cHV0LCAtc3RkZXJyID0+IHVuZGVmICk7CisgICAgICAgICAgICAgICAgY2hvbXAoICRvdXRwdXQgKTsKKyAgICAgICAgICAgICAgICBpZiAoIDAgKSB7CisgICAgICAgICAgICAgICAgfSBlbHNpZiAoICIkb3V0cHV0IiBlcSAiIiBvciAiJG91dHB1dCIgZXEgIjAiICkgeworICAgICAgICAgICAgICAgICAgICAkcGxhdGZvcm0gPSAiaTM4NiI7CisgICAgICAgICAgICAgICAgfSBlbHNpZiAoICIkb3V0cHV0IiBlcSAiMSIgKSB7CisgICAgICAgICAgICAgICAgICAgICRwbGF0Zm9ybSA9ICJ4ODZfNjQiOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGRpZSAiVW5zdXBwb3J0ZWQgdmFsdWUgKFwiJG91dHB1dFwiKSByZXR1cm5lZCBieSBcIiRzeXNjdGwgLW4gaHcub3B0aW9uYWwueDg2XzY0XCI7IHN0b3BwZWQiOworICAgICAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgICAgICByZXR1cm4gJHBsYXRmb3JtOworICAgICAgICAgICAgfTsgIyBzdWIgeworICAgIH0gZWxzaWYgKCAkdmFsdWVzeyBtYWNoaW5lIH0gZXEgIng4Nl82NCIgKSB7CisJIyBTb21lIE9TIFgqIHZlcnNpb25zIHJlcG9ydCAieDg2XzY0Ii4KKwkkdmFsdWVzeyBoYXJkd2FyZV9wbGF0Zm9ybSB9ID0gIng4Nl82NCI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGllICJVbnN1cHBvcnRlZCBtYWNoaW5lIChcIiR2YWx1ZXN7IG1hY2hpbmUgfVwiKSByZXR1cm5lZCBieSBQT1NJWDo6dW5hbWUoKTsgc3RvcHBlZCI7CisgICAgfTsgIyBpZgorfSBlbHNpZiAoICReTyA9fiAkbXN3aW4gKSB7CisgICAgaWYgKCAwICkgeworICAgIH0gZWxzaWYgKCAkdmFsdWVzeyBtYWNoaW5lIH0gPX4gbXtcQSg/Ong4NnxbNTZdODYpXHp9ICkgeworICAgICAgICAkdmFsdWVzeyBoYXJkd2FyZV9wbGF0Zm9ybSB9ID0gImkzODYiOworICAgIH0gZWxzaWYgKCAkdmFsdWVzeyBtYWNoaW5lIH0gZXEgIng4Nl82NCIgb3IgJHZhbHVlc3sgbWFjaGluZSB9IGVxICJhbWQ2NCIgKSB7CisgICAgICAgICMgQWN0aXZlUGVybCBmb3IgSUEtMzIgYXJjaGl0ZWN0dXJlIHJldHVybnMgIng4Nl82NCIsIHdoaWxlIEFjdGl2ZVBlcmwgZm9yIEludGVsKFIpIDY0IHJldHVybnMgImFtZDY0Ii4KKyAgICAgICAgJHZhbHVlc3sgaGFyZHdhcmVfcGxhdGZvcm0gfSA9ICJ4ODZfNjQiOworICAgIH0gZWxzZSB7CisgICAgICAgIGRpZSAiVW5zdXBwb3J0ZWQgbWFjaGluZSAoXCIkdmFsdWVzeyBtYWNoaW5lIH1cIikgcmV0dXJuZWQgYnkgUE9TSVg6OnVuYW1lKCk7IHN0b3BwZWQiOworICAgIH07ICMgaWYKK30gZWxzaWYgKCAkXk8gZXEgImN5Z3dpbiIgKSB7CisgICAgaWYgKCAwICkgeworICAgIH0gZWxzaWYgKCAkdmFsdWVzeyBtYWNoaW5lIH0gPX4gbXtcQWlbMzQ1Nl04Nlx6fSApIHsKKyAgICAgICAgJHZhbHVlc3sgaGFyZHdhcmVfcGxhdGZvcm0gfSA9ICJpMzg2IjsKKyAgICB9IGVsc2lmICggJHZhbHVlc3sgbWFjaGluZSB9IGVxICJ4ODZfNjQiICkgeworICAgICAgICAkdmFsdWVzeyBoYXJkd2FyZV9wbGF0Zm9ybSB9ID0gIng4Nl82NCI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGllICJVbnN1cHBvcnRlZCBtYWNoaW5lIChcIiR2YWx1ZXN7IG1hY2hpbmUgfVwiKSByZXR1cm5lZCBieSBQT1NJWDo6dW5hbWUoKTsgc3RvcHBlZCI7CisgICAgfTsgIyBpZgorfSBlbHNlIHsKKyAgICBkaWUgIlVuc3VwcG9ydGVkIE9TIChcIiReT1wiKTsgc3RvcHBlZCI7Cit9OyAjIGlmCisKKyMgb3BlcmF0aW5nX3N5c3RlbS4KK2lmICggMCApIHsKK30gZWxzaWYgKCAkdmFsdWVzeyBrZXJuZWxfbmFtZSB9IGVxICJMaW51eCIgKSB7CisgICAgJHZhbHVlc3sgb3BlcmF0aW5nX3N5c3RlbSB9ID0gIkdOVS9MaW51eCI7CisgICAgbXkgJHJlbGVhc2U7ICAgICMgTmFtZSBvZiBjaG9zZW4gIiotcmVsZWFzZSIgZmlsZS4KKyAgICBteSAkYnVsazsgICAgICAgIyBDb250ZW50IG9mIHJlbGVhc2UgZmlsZS4KKyAgICAjIE9uIFVidW50dSwgbHNiLXJlbGVhc2UgaXMgcXVpdGUgaW5mb3JtYXRpdmUsIGUuIGcuOgorICAgICMgICAgIERJU1RSSUJfSUQ9VWJ1bnR1CisgICAgIyAgICAgRElTVFJJQl9SRUxFQVNFPTkuMDQKKyAgICAjICAgICBESVNUUklCX0NPREVOQU1FPWphdW50eQorICAgICMgICAgIERJU1RSSUJfREVTQ1JJUFRJT049IlVidW50dSA5LjA0IgorICAgICMgVHJ5IGxzYi1yZWxlYXNlIGZpcnN0LiBCdXQgb24gc29tZSBvbGRlciBzeXN0ZW1zIGxzYi1yZWxlYXNlIGlzIG5vdCBpbmZvcm1hdGl2ZS4KKyAgICAjIEl0IG1heSBjb250YWluIGp1c3Qgb25lIGxpbmU6CisgICAgIyAgICAgTFNCX1ZFUlNJT049IjEuMyIKKyAgICAkcmVsZWFzZSA9ICIvZXRjL2xzYi1yZWxlYXNlIjsKKyAgICBpZiAoIC1lICRyZWxlYXNlICkgeworICAgICAgICAkYnVsayA9IHJlYWRfZmlsZSggJHJlbGVhc2UgKTsKKyAgICB9IGVsc2UgeworICAgICAgICAkYnVsayA9ICIiOworICAgIH07ICMgaWYKKyAgICBpZiAoICRidWxrID1+IG17XkRJU1RSSUJffSApIHsKKyAgICAgICAgIyBPaywgdGhpcyBsc2ItcmVsZWFzZSBpcyBpbmZvcm1hdGl2ZS4KKyAgICAgICAgJGJ1bGsgPX4gbXteRElTVFJJQl9JRFxzKj1ccyooLio/KVxzKiR9bQorICAgICAgICAgICAgb3IgcnVudGltZV9lcnJvciggIiRyZWxlYXNlOiBUaGVyZSBpcyBubyBESVNUUklCX0lEOiIsICRidWxrLCAiKGVvZikiICk7CisgICAgICAgICR2YWx1ZXN7IG9wZXJhdGluZ19zeXN0ZW1fbmFtZSB9ID0gJDE7CisgICAgICAgICRidWxrID1+IG17XkRJU1RSSUJfUkVMRUFTRVxzKj1ccyooLio/KVxzKiR9bQorICAgICAgICAgICAgb3IgcnVudGltZV9lcnJvciggIiRyZWxlYXNlOiBUaGVyZSBpcyBubyBESVNUUklCX1JFTEVBU0U6IiwgJGJ1bGssICIoZW9mKSIgKTsKKyAgICAgICAgJHZhbHVlc3sgb3BlcmF0aW5nX3N5c3RlbV9yZWxlYXNlIH0gPSAkMTsKKyAgICAgICAgJGJ1bGsgPX4gbXteRElTVFJJQl9DT0RFTkFNRVxzKj1ccyooLio/KVxzKiR9bQorICAgICAgICAgICAgb3IgcnVudGltZV9lcnJvciggIiRyZWxlYXNlOiBUaGVyZSBpcyBubyBESVNUUklCX0NPREVOQU1FOiIsICRidWxrLCAiKGVvZikiICk7CisgICAgICAgICR2YWx1ZXN7IG9wZXJhdGluZ19zeXN0ZW1fY29kZW5hbWUgfSA9ICQxOworICAgICAgICAkYnVsayA9fiBte15ESVNUUklCX0RFU0NSSVBUSU9OXHMqPSI/XHMqKC4qPykiP1xzKiR9bQorICAgICAgICAgICAgb3IgcnVudGltZV9lcnJvciggIiRyZWxlYXNlOiBUaGVyZSBpcyBubyBESVNUUklCX0RFU0NSSVBUSU9OOiIsICRidWxrLCAiKGVvZikiICk7CisgICAgICAgICR2YWx1ZXN7IG9wZXJhdGluZ19zeXN0ZW1fZGVzY3JpcHRpb24gfSA9ICQxOworICAgIH0gZWxzZSB7CisgICAgICAgICMgT29wcy4gbHNiLXJlbGVhc2UgaXMgbWlzc2VkIG9yIG5vdCBpbmZvcm1hdGl2ZS4gVHJ5IG90aGVyICotcmVsZWFzZSBmaWxlcy4KKyAgICAgICAgJHJlbGVhc2UgPSAiL2V0Yy9zeXN0ZW0tcmVsZWFzZSI7CisgICAgICAgIGlmICggbm90IC1lICRyZWxlYXNlICkgeyAgICAjIFVzZSAvZXRjL3N5c3RlbS1yZWxlYXNlIiBpZiBzdWNoIGZpbGUgZXhpc3RzLgorICAgICAgICAgICAgIyBPdGhlcndpc2UgdHJ5IG90aGVyICIvZXRjLyotcmVsZWFzZSIgZmlsZXMsIGJ1dCBpZ25vcmUgIi9ldGMvbHNiLXJlbGVhc2UiLgorICAgICAgICAgICAgbXkgQHJlbGVhc2VzID0gZ3JlcCggJF8gbmUgIi9ldGMvbHNiLXJlbGVhc2UiLCBic2RfZ2xvYiggIi9ldGMvKi1yZWxlYXNlIiApICk7CisgICAgICAgICAgICAjIE9uIHNvbWUgRmVkb3JhIHN5c3RlbXMgdGhlcmUgYXJlIHR3byBmaWxlczogZmVkb3JhLXJlbGVhc2UgYW5kIHJlZGhhdC1yZWxlYXNlCisgICAgICAgICAgICAjIHdpdGggaWRlbnRpY2FsIGNvbnRlbnQuIElmIGZlZG9yYS1yZWxlYXNlIHByZXNlbnQsIGlnbm9yZSByZWRqYXQtcmVsZWFzZS4KKyAgICAgICAgICAgIGlmICggZ3JlcCggJF8gZXEgIi9ldGMvZmVkb3JhLXJlbGVhc2UiLCBAcmVsZWFzZXMgKSApIHsKKyAgICAgICAgICAgICAgICBAcmVsZWFzZXMgPSBncmVwKCAkXyBuZSAiL2V0Yy9yZWRoYXQtcmVsZWFzZSIsIEByZWxlYXNlcyApOworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgaWYgKCBAcmVsZWFzZXMgPT0gMSApIHsKKyAgICAgICAgICAgICAgICAkcmVsZWFzZSA9ICRyZWxlYXNlc1sgMCBdOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoIEByZWxlYXNlcyA9PSAwICkgeworICAgICAgICAgICAgICAgICAgICAjIE5vICotcmVsZWFzZSBmaWxlcyBmb3VuZCwgdHJ5IGRlYmlhbl92ZXJzaW9uLgorICAgICAgICAgICAgICAgICAgICAkcmVsZWFzZSA9ICIvZXRjL2RlYmlhbl92ZXJzaW9uIjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBub3QgLWUgJHJlbGVhc2UgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAkcmVsZWFzZSA9IHVuZGVmOworICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZyggIk5vIHJlbGVhc2UgZmlsZXMgZm91bmQgaW4gXCIvZXRjL1wiIGRpcmVjdG9yeS4iICk7CisgICAgICAgICAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAkcmVsZWFzZSA9IHVuZGVmOworICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKCAiTW9yZSB0aGFuIG9uZSByZWxlYXNlIGZpbGVzIGZvdW5kIGluIFwiL2V0Yy9cIiBkaXJlY3Rvcnk6IiwgQHJlbGVhc2VzICk7CisgICAgICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICB9OyAjIGlmCisgICAgICAgIGlmICggZGVmaW5lZCggJHJlbGVhc2UgKSApIHsKKyAgICAgICAgICAgICRidWxrID0gcmVhZF9maWxlKCAkcmVsZWFzZSApOworICAgICAgICAgICAgaWYgKCAkcmVsZWFzZSA9fiBte3N5c3RlbXxyZWRoYXR8ZmVkb3JhfSApIHsKKyAgICAgICAgICAgICAgICAjIFJlZCBIYXQgb3IgRmVkb3JhLiBQYXJzZSB0aGUgZmlyc3QgbGluZSBvZiBmaWxlLgorICAgICAgICAgICAgICAgICMgVHlwaWNhbCB2YWx1ZXMgb2YgKi1yZWxlYXNlIChvbmUgb2YpOgorICAgICAgICAgICAgICAgICMgICAgIFJlZCBIYXQgRW50ZXJwcmlzZSBMaW51eCogT1MgU2VydmVyIHJlbGVhc2UgNS4yIChUaWthbmdhKQorICAgICAgICAgICAgICAgICMgICAgIFJlZCBIYXQgRW50ZXJwcmlzZSBMaW51eCogT1MgQVMgcmVsZWFzZSAzIChUYXJvb24gVXBkYXRlIDQpCisgICAgICAgICAgICAgICAgIyAgICAgRmVkb3JhIHJlbGVhc2UgMTAgKENhbWJyaWRnZSkKKyAgICAgICAgICAgICAgICAkYnVsayA9fiBte1xBKC4qKSR9bQorICAgICAgICAgICAgICAgICAgICBvciBydW50aW1lX2Vycm9yKCAiJHJlbGVhc2U6IENhbm5vdCBmaW5kIHRoZSBmaXJzdCBsaW5lOiIsICRidWxrLCAiKGVvZikiICk7CisgICAgICAgICAgICAgICAgbXkgJGZpcnN0X2xpbmUgPSAkMTsKKyAgICAgICAgICAgICAgICAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtX2Rlc2NyaXB0aW9uIH0gPSAkZmlyc3RfbGluZTsKKyAgICAgICAgICAgICAgICAkZmlyc3RfbGluZSA9fiBte1xBKC4qPylccytyZWxlYXNlXHMrKC4qPykoPzpccytcKCguKj8pKD86XHMrVXBkYXRlXHMrKC4qPykpP1wpKT9ccyokfQorICAgICAgICAgICAgICAgICAgICBvciBydW50aW1lX2Vycm9yKCAiJHJlbGVhc2U6MTogQ2Fubm90IHBhcnNlIGxpbmU6IiwgJGZpcnN0X2xpbmUgKTsKKyAgICAgICAgICAgICAgICAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtX25hbWUgICAgfSAgPSAkMTsKKyAgICAgICAgICAgICAgICAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtX3JlbGVhc2UgfSAgPSAkMiAuICggZGVmaW5lZCggJDQgKSA/ICIuJDQiIDogIiIgKTsKKyAgICAgICAgICAgICAgICAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtX2NvZGVuYW1lIH0gPSAkMzsKKyAgICAgICAgICAgIH0gZWxzaWYgKCAkcmVsZWFzZSA9fiBte1N1U0V9ICkgeworICAgICAgICAgICAgICAgICMgVHlwaWNhbCBTdVNFLXJlbGVhc2U6CisgICAgICAgICAgICAgICAgIyAgICAgU1VTRSBMaW51eCogT1MgRW50ZXJwcmlzZSBTZXJ2ZXIgMTAgKHg4Nl82NCkKKyAgICAgICAgICAgICAgICAjICAgICBWRVJTSU9OID0gMTAKKyAgICAgICAgICAgICAgICAjICAgICBQQVRDSExFVkVMID0gMgorICAgICAgICAgICAgICAgICRidWxrID1+IG17XEEoLiopJH1tCisgICAgICAgICAgICAgICAgICAgIG9yIHJ1bnRpbWVfZXJyb3IoICIkcmVsZWFzZTogQ2Fubm90IGZpbmQgdGhlIGZpcnN0IGxpbmU6IiwgJGJ1bGssICIoZW9mKSIgKTsKKyAgICAgICAgICAgICAgICBteSAkZmlyc3RfbGluZSA9ICQxOworICAgICAgICAgICAgICAgICR2YWx1ZXN7IG9wZXJhdGluZ19zeXN0ZW1fZGVzY3JpcHRpb24gfSA9ICRmaXJzdF9saW5lOworICAgICAgICAgICAgICAgICRmaXJzdF9saW5lID1+IG17XiguKj8pXHMqKFxkKylccypcKC4qP1wpXHMqJH0KKyAgICAgICAgICAgICAgICAgICAgb3IgcnVudGltZV9lcnJvciggIiRyZWxlYXNlOjE6IENhbm5vdCBwYXJzZSBsaW5lOiIsICRmaXJzdF9saW5lICk7CisgICAgICAgICAgICAgICAgJHZhbHVlc3sgb3BlcmF0aW5nX3N5c3RlbV9uYW1lIH0gPSAkMTsKKyAgICAgICAgICAgICAgICAkYnVsayA9fiBte15WRVJTSU9OXHMqPVxzKiguKilccyokfW0KKyAgICAgICAgICAgICAgICAgICAgb3IgcnVudGltZV9lcnJvciggIiRyZWxlYXNlOiBUaGVyZSBpcyBubyBWRVJTSU9OOiIsICRidWxrLCAiKGVvZikiICk7CisgICAgICAgICAgICAgICAgJHZhbHVlc3sgb3BlcmF0aW5nX3N5c3RlbV9yZWxlYXNlIH0gPSAkMTsKKyAgICAgICAgICAgICAgICBpZiAoICRidWxrID1+IG17XlBBVENITEVWRUxccyo9XHMqKC4qKVxzKiR9bSApIHsKKyAgICAgICAgICAgICAgICAgICAgJHZhbHVlc3sgb3BlcmF0aW5nX3N5c3RlbV9yZWxlYXNlIH0gLj0gIi4kMSI7CisgICAgICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgfSBlbHNpZiAoICRyZWxlYXNlID1+IG17ZGViaWFuX3ZlcnNpb259ICkgeworICAgICAgICAgICAgICAgICMgRGViaWFuLiBUaGUgZmlsZSBkZWJpYW5fdmVyc2lvbiBjb250YWlucyBqdXN0IHZlcnNpb24gbnVtYmVyLCBub3RoaW5nIG1vcmU6CisgICAgICAgICAgICAgICAgIyAgICAgNC4wCisgICAgICAgICAgICAgICAgbXkgJG5hbWUgPSAiRGViaWFuIjsKKyAgICAgICAgICAgICAgICAkYnVsayA9fiBte1xBKC4qKSR9bQorICAgICAgICAgICAgICAgICAgICBvciBydW50aW1lX2Vycm9yKCAiJHJlbGVhc2U6IENhbm5vdCBmaW5kIHRoZSBmaXJzdCBsaW5lOiIsICRidWxrLCAiKGVvZikiICk7CisgICAgICAgICAgICAgICAgbXkgJHZlcnNpb24gPSAkMTsKKyAgICAgICAgICAgICAgICAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtX25hbWUgICAgICAgIH0gPSAkbmFtZTsKKyAgICAgICAgICAgICAgICAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtX3JlbGVhc2UgICAgIH0gPSAkdmVyc2lvbjsKKyAgICAgICAgICAgICAgICAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtX2NvZGVuYW1lICAgIH0gPSAidW5rbm93biI7CisgICAgICAgICAgICAgICAgJHZhbHVlc3sgb3BlcmF0aW5nX3N5c3RlbV9kZXNjcmlwdGlvbiB9ID0gc3ByaW50ZiggIiVzICVzIiwgJG5hbWUsICR2ZXJzaW9uICk7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGlmCisgICAgaWYgKCBub3QgZGVmaW5lZCggJHZhbHVlc3sgb3BlcmF0aW5nX3N5c3RlbV9uYW1lIH0gKSApIHsKKyAgICAgICAgJHZhbHVlc3sgb3BlcmF0aW5nX3N5c3RlbV9uYW1lIH0gPSAiR05VL0xpbnV4IjsKKyAgICB9OyAjIGlmCit9IGVsc2lmICggJHZhbHVlc3sga2VybmVsX25hbWUgfSBlcSAiRGFyd2luIiApIHsKKyAgICBteSAlY29kZW5hbWVzID0gKAorICAgICAgICAxMC40ID0+ICJUaWdlciIsCisgICAgICAgIDEwLjUgPT4gIkxlb3BhcmQiLAorICAgICAgICAxMC42ID0+ICJTbm93IExlb3BhcmQiLAorICAgICk7CisgICBteSAkZGFyd2luOworICAgbXkgJGdldF9vc19pbmZvID0KKyAgICAgICBzdWIgeworICAgICAgICAgICBteSAoICRuYW1lICkgPSBAXzsKKyAgICAgICAgICAgaWYgKCBub3QgZGVmaW5lZCAkZGFyd2luICkgeworICAgICAgICAgICAgICAgJGRhcndpbi0+eyBvcGVyYXRpbmdfc3lzdGVtIH0gPSAiRGFyd2luIjsKKyAgICAgICAgICAgICAgICMgc3dfdmVycyBwcmludHMgT1MgWCogdmVyc2lvbiB0byBzdGRvdXQ6CisgICAgICAgICAgICAgICAjICAgICBQcm9kdWN0TmFtZTogICAgICAgT1MgWCoKKyAgICAgICAgICAgICAgICMgICAgIFByb2R1Y3RWZXJzaW9uOiAgICAxMC40LjExCisgICAgICAgICAgICAgICAjICAgICBCdWlsZFZlcnNpb246ICAgICAgOFMyMTY3CisgICAgICAgICAgICAgICAjIEl0IGRvZXMgbm90IHByaW50IGNvZGVuYW1lLCBzbyB3ZSBjb2RlIE9TIFgqIGNvZGVuYW1lcyBoZXJlLgorICAgICAgICAgICAgICAgbXkgJHN3X3ZlcnMgPSB3aGljaCggInN3X3ZlcnMiICkgfHwgIi91c3IvYmluL3N3X3ZlcnMiOworICAgICAgICAgICAgICAgbXkgJG91dHB1dDsKKyAgICAgICAgICAgICAgIGRlYnVnKCAiRXhlY3V0aW5nICRzd192ZXJzLi4uIiApOworICAgICAgICAgICAgICAgZXhlY3V0ZSggWyAkc3dfdmVycyBdLCAtc3Rkb3V0ID0+IFwkb3V0cHV0LCAtc3RkZXJyID0+IHVuZGVmICk7CisgICAgICAgICAgICAgICAkb3V0cHV0ID1+IG17XlByb2R1Y3ROYW1lOlxzKiguKilccyokfW0KKyAgICAgICAgICAgICAgICAgICBvciBydW50aW1lX2Vycm9yKCAiVGhlcmUgaXMgbm8gUHJvZHVjdE5hbWUgaW4gc3dfdmVycyBvdXRwdXQ6IiwgJG91dHB1dCwgIihlb2YpIiApOworICAgICAgICAgICAgICAgbXkgJG5hbWUgPSAkMTsKKyAgICAgICAgICAgICAgICRvdXRwdXQgPX4gbXteUHJvZHVjdFZlcnNpb246XHMqKC4qKVxzKiR9bQorICAgICAgICAgICAgICAgICAgIG9yIHJ1bnRpbWVfZXJyb3IoICJUaGVyZSBpcyBubyBQcm9kdWN0VmVyc2lvbiBpbiBzd192ZXJzIG91dHB1dDoiLCAkb3V0cHV0LCAiKGVvZikiICk7CisgICAgICAgICAgICAgICBteSAkcmVsZWFzZSA9ICQxOworICAgICAgICAgICAgICAgIyBTb21ldGltZXMgcmVsZWFzZSByZXBvcnRlZCBhcyAiMTAuNC4xMSIgKDMgY29tcG9uZW50ZXMpLCBzb21ldGltZXMgYXMgIjEwLjYiLgorICAgICAgICAgICAgICAgIyBIYW5kbGUgYm90aCB2YXJpYW50cy4KKyAgICAgICAgICAgICAgICRyZWxlYXNlID1+IG17XihcZCsuXGQrKSg/OlwuXGQrKT8oPz1cc3wkKX0KKyAgICAgICAgICAgICAgICAgICBvciBydW50aW1lX2Vycm9yKCAiQ2Fubm90IHBhcnNlIE9TIFgqIHZlcnNpb246ICRyZWxlYXNlIiApOworICAgICAgICAgICAgICAgbXkgJHZlcnNpb24gPSAkMTsKKyAgICAgICAgICAgICAgIG15ICRjb2RlbmFtZSA9ICggJGNvZGVuYW1lc3sgJHZlcnNpb24gfSBvciAidW5rbm93biIgKTsKKyAgICAgICAgICAgICAgICRkYXJ3aW4tPnsgb3BlcmF0aW5nX3N5c3RlbV9uYW1lICAgICAgICB9ID0gJG5hbWU7CisgICAgICAgICAgICAgICAkZGFyd2luLT57IG9wZXJhdGluZ19zeXN0ZW1fcmVsZWFzZSAgICAgfSA9ICRyZWxlYXNlOworICAgICAgICAgICAgICAgJGRhcndpbi0+eyBvcGVyYXRpbmdfc3lzdGVtX2NvZGVuYW1lICAgIH0gPSAkY29kZW5hbWU7CisgICAgICAgICAgICAgICAkZGFyd2luLT57IG9wZXJhdGluZ19zeXN0ZW1fZGVzY3JpcHRpb24gfSA9IHNwcmludGYoICIlcyAlcyAoJXMpIiwgJG5hbWUsICRyZWxlYXNlLCAkY29kZW5hbWUgKTsKKyAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICByZXR1cm4gJGRhcndpbi0+eyAkbmFtZSB9OworICAgICAgIH07ICMgc3ViCisgICAgJHZhbHVlc3sgb3BlcmF0aW5nX3N5c3RlbSAgICAgICAgICAgICB9ID0gc3ViIHsgJGdldF9vc19pbmZvLT4oICJvcGVyYXRpbmdfc3lzdGVtIiAgICAgICAgICAgICApOyB9OworICAgICR2YWx1ZXN7IG9wZXJhdGluZ19zeXN0ZW1fbmFtZSAgICAgICAgfSA9IHN1YiB7ICRnZXRfb3NfaW5mby0+KCAib3BlcmF0aW5nX3N5c3RlbV9uYW1lIiAgICAgICAgKTsgfTsKKyAgICAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtX3JlbGVhc2UgICAgIH0gPSBzdWIgeyAkZ2V0X29zX2luZm8tPiggIm9wZXJhdGluZ19zeXN0ZW1fcmVsZWFzZSIgICAgICk7IH07CisgICAgJHZhbHVlc3sgb3BlcmF0aW5nX3N5c3RlbV9jb2RlbmFtZSAgICB9ID0gc3ViIHsgJGdldF9vc19pbmZvLT4oICJvcGVyYXRpbmdfc3lzdGVtX2NvZGVuYW1lIiAgICApOyB9OworICAgICR2YWx1ZXN7IG9wZXJhdGluZ19zeXN0ZW1fZGVzY3JpcHRpb24gfSA9IHN1YiB7ICRnZXRfb3NfaW5mby0+KCAib3BlcmF0aW5nX3N5c3RlbV9kZXNjcmlwdGlvbiIgKTsgfTsKK30gZWxzaWYgKCAkdmFsdWVzeyBrZXJuZWxfbmFtZSB9ID1+IG17XEFXaW5kb3dzWyBfXU5UXHp9ICkgeworICAgICR2YWx1ZXN7IG9wZXJhdGluZ19zeXN0ZW0gfSA9ICJNUyBXaW5kb3dzIjsKKyAgICAjIG15IEBvc19uYW1lID0gV2luMzI6OkdldE9TTmFtZSgpOworICAgICMgJHZhbHVlc3sgb3BlcmF0aW5nX3N5c3RlbV9yZWxlYXNlIH0gPSAkb3NfbmFtZVsgMCBdOworICAgICMgJHZhbHVlc3sgb3BlcmF0aW5nX3N5c3RlbV91cGRhdGUgIH0gPSAkb3NfbmFtZVsgMSBdOworfSBlbHNpZiAoICR2YWx1ZXN7IGtlcm5lbF9uYW1lIH0gPX4gbXtcQUNZR1dJTl9OVC19ICkgeworICAgICR2YWx1ZXN7IG9wZXJhdGluZ19zeXN0ZW0gfSA9ICJNUyBXaW5kb3dzIjsKK30gZWxzaWYgKCAkdmFsdWVzeyBrZXJuZWxfbmFtZSB9ID1+IG17XEFGcmVlQlNEfSApIHsKKyAgICAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtIH0gPSAiRnJlZUJTRCI7Cit9IGVsc2UgeworICAgIGRpZSAiVW5zdXBwb3J0ZWQga2VybmVsX25hbWUgKFwiJHZhbHVlc3sga2VybmVsX25hbWUgfVwiKSByZXR1cm5lZCBieSBQT1NJWDo6dW5hbWUoKTsgc3RvcHBlZCI7Cit9OyAjIGlmCisKKyMgaG9zdF9uYW1lIGFuZCBkb21haW5fbmFtZQorJHZhbHVlc3sgaG9zdF9uYW1lIH0gPQorICAgIHN1YiB7CisgICAgICAgIG15ICRmcWRuID0gdmFsdWUoICJmcWRuIiApOworICAgICAgICAkZnFkbiA9fiBte1xBKFteLl0qKSg/OlwuKC4qKSk/XHp9OworICAgICAgICBteSAkaG9zdF9uYW1lID0gJDE7CisgICAgICAgIGlmICggbm90IGRlZmluZWQoICRob3N0X25hbWUgKSBvciAkaG9zdF9uYW1lIGVxICIiICkgeworICAgICAgICAgICAgZGllICJVbmV4cGVjdGVkIGVycm9yOiB1bmRlZmluZWQgb3IgZW1wdHkgaG9zdCBuYW1lOyBzdG9wcGVkIjsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICByZXR1cm4gJGhvc3RfbmFtZTsKKyAgICB9OworJHZhbHVlc3sgZG9tYWluX25hbWUgfSA9CisgICAgc3ViIHsKKyAgICAgICAgbXkgJGZxZG4gPSB2YWx1ZSggImZxZG4iICk7CisgICAgICAgICRmcWRuID1+IG17XEEoW14uXSopKD86XC4oLiopKT9cen07CisgICAgICAgIG15ICRkb21haW5fbmFtZSA9ICQyOworICAgICAgICBpZiAoIG5vdCBkZWZpbmVkKCAkZG9tYWluX25hbWUgKSBvciAkZG9tYWluX25hbWUgZXEgIiIgKSB7CisgICAgICAgICAgICBkaWUgIlVuZXhwZWN0ZWQgZXJyb3I6IHVuZGVmaW5lZCBvciBlbXB0eSBkb21haW4gbmFtZTsgc3RvcHBlZCI7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgcmV0dXJuICRkb21haW5fbmFtZTsKKyAgICB9OworCisjIFJlcGxhY2UgdW5kZWZpbmVkIHZhbHVlcyB3aXRoICJ1bmtub3duIi4KK2ZvcmVhY2ggbXkgJG5hbWUgKCBAYWxsICkgeworICAgIGlmICggbm90IGRlZmluZWQoICR2YWx1ZXN7ICRuYW1lIH0gKSApIHsKKyAgICAgICAgJHZhbHVlc3sgJG5hbWUgfSA9ICJ1bmtub3duIjsKKyAgICB9OyAjIGlmCit9OyAjIGZvcmVhY2ggJG5hbWUKKworIyBFeHBvcnQgZnVuY3Rpb25zIHJlcG9ydGluZyBwcm9wZXJ0aWVzLgorZm9yZWFjaCBteSAkbmFtZSAoIEBhbGwgKSB7CisgICAgbm8gc3RyaWN0ICJyZWZzIjsKKyAgICAqJG5hbWUgPSBzdWIgeyByZXR1cm4gdmFsdWUoICRuYW1lICk7IH07Cit9OyAjIGZvcmVhY2ggJG5hbWUKKworIyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYmFzZSBuYW1lcy4KK3N1YiBiYXNlX25hbWVzIHsKKyAgICByZXR1cm4gQGJhc2U7Cit9OyAjIHN1YiBiYXNlX25hbWVzCisKKyMgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGFsbCB0aGUgbmFtZXMuCitzdWIgYWxsX25hbWVzIHsKKyAgICByZXR1cm4gQGFsbDsKK307ICMgc3ViIGFsbF9uYW1lcworCisjIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB2YWx1ZSBieSB0aGUgc3BlY2lmaWVkIG5hbWUuCitzdWIgdmFsdWUoJCkgeworICAgIG15ICRuYW1lID0gc2hpZnQoIEBfICk7CisgICAgaWYgKCByZWYoICR2YWx1ZXN7ICRuYW1lIH0gKSApIHsKKyAgICAgICAgbXkgJHZhbHVlID0gJHZhbHVlc3sgJG5hbWUgfS0+KCk7CisgICAgICAgICR2YWx1ZXN7ICRuYW1lIH0gPSAkdmFsdWU7CisgICAgfTsgIyBpZgorICAgIHJldHVybiAkdmFsdWVzeyAkbmFtZSB9OworfTsgIyBzdWIgdmFsdWUKKworcmV0dXJuIDE7CisKK19fRU5EX18KKworPXBvZAorCis9aGVhZDEgTkFNRQorCitCPFVuYW1lLnBtPiAtLSBBIGZldyBzdWJyb3V0aW5lcyB0byBnZXQgc3lzdGVtIGluZm9ybWF0aW9uIHVzdWFsbHkgcHJvdmlkZWQgYnkKK0M8L2Jpbi91bmFtZT4gYW5kIEM8UE9TSVg6OnVuYW1lKCk+LgorCis9aGVhZDEgU1lOT1BTSVMKKworICAgIHVzZSBVbmFtZTsKKworICAgICMgQmFzZSBwcm9wZXJ0eSBmdW5jdGlvbnMuCisgICAgJGtlcm5lbF9uYW1lICAgICAgID0gVW5hbWU6Omtlcm5lbF9uYW1lKCk7CisgICAgJGZxZG4gICAgICAgICAgICAgID0gVW5hbWU6OmZxZG4oKTsKKyAgICAka2VybmVsX3JlbGVhc2UgICAgPSBVbmFtZTo6a2VybmVsX3JlbGVhc2UoKTsKKyAgICAka2VybmVsX3ZlcnNpb24gICAgPSBVbmFtZTo6a2VybmVsX3ZlcnNpb24oKTsKKyAgICAkbWFjaGluZSAgICAgICAgICAgPSBVbmFtZTo6bWFjaGluZSgpOworICAgICRwcm9jZXNzb3IgICAgICAgICA9IFVuYW1lOjpwcm9jZXNzb3IoKTsKKyAgICAkaGFyZHdhcmVfcGxhdGZvcm0gPSBVbmFtZTo6aGFyZHdhcmVfcGxhdGZvcm0oKTsKKyAgICAkb3BlcmF0aW5nX3N5c3RlbSAgPSBVbmFtZTo6b3BlcmF0aW5nX3N5c3RlbSgpOworCisgICAgIyBBdXhpbGlhcnkgcHJvcGVydHkgZnVuY3Rpb25zLgorICAgICRob3N0X25hbWUgICAgICAgICA9IFVuYW1lOjpob3N0X25hbWUoKTsKKyAgICAkZG9tYWluX25hbWUgICAgICAgPSBVbmFtZTo6ZG9tYWluX25hbWUoKTsKKyAgICAkb3NfbmFtZSAgICAgICAgICAgPSBVbmFtZTo6b3BlcmF0aW5nX3N5c3RlbV9uYW1lKCk7CisgICAgJG9zX3JlbGVhc2UgICAgICAgID0gVW5hbWU6Om9wZXJhdGluZ19zeXN0ZW1fcmVsZWFzZSgpOworICAgICRvc19jb2RlbmFtZSAgICAgICA9IFVuYW1lOjpvcGVyYXRpbmdfc3lzdGVtX2NvZGVuYW1lKCk7CisgICAgJG9zX2Rlc2NyaXB0aW9uICAgID0gVW5hbWU6Om9wZXJhdGluZ19zeXN0ZW1fZGVzY3JpcHRpb24oKTsKKworICAgICMgTWV0YSBmdW5jdGlvbnMuCisgICAgQGJhc2VfbmFtZXMgID0gVW5hbWU6OmJhc2VfbmFtZXMoKTsKKyAgICBAYWxsX25hbWVzICAgPSBVbmFtZTo6YWxsX25hbWVzKCk7CisgICAgJGtlcm5lbF9uYW1lID0gVW5hbWU6OnZhbHVlKCAia2VybmVsX25hbWUiICk7CisKKz1oZWFkMSBERVNDUklQVElPTgorCitCPFVuYW1lLnBtPiByZXNlbWJsZXMgZnVuY3Rpb25hbGl0eSBmb3VuZCBpbiBDPFBPU0lYOjp1bmFtZSgpPiBmdW5jdGlvbiBvciBpbiBDPHVuYW1lPiBwcm9ncmFtLgorSG93ZXZlciwgYm90aCBDPFBPU0lYOjp1bmFtZSgpPiBhbmQgQzwvYmluL3VuYW1lPiBoYXZlIHNvbWUgZGlzYWR2YW50YWdlczoKKworPW92ZXIKKworPWl0ZW0gKgorCitDPHVuYW1lPiBtYXkgYmUgbm90IGF2YWlsYWJsZSBpbiBzb21lIGVudmlyb25tZW50cywgZm9yIGV4YW1wbGUsIGluIFdpbmRvd3MqIE9TCisoQzx1bmFtZT4gbWF5IGJlIGZvdW5kIGluIHNvbWUgdGhpcmQtcGFydHkgc29mdHdhcmUgcGFja2FnZXMsIGxpa2UgTUtTIFRvb2xraXQgb3IgQ3lnd2luLCBidXQgaXQgaXMKK25vdCBhIHBhcnQgb2YgT1MpLgorCis9aXRlbSAqCisKK1RoZXJlIGFyZSBtYW55IGRpZmZlcmVudCB2ZXJzaW9ucyBvZiBDPHVuYW1lPi4gRm9yIGV4YW1wbGUsIEM8dW5hbWU+IG9uIE9TIFgqIGRvZXMgbm90CityZWNvZ25pemUgb3B0aW9ucyBDPC1pPiwgQzwtbz4sIGFuZCBhbnkgbG9uZyBvcHRpb25zLgorCis9aXRlbSAqCisKK0RpZmZlcmVudCB2ZXJzaW9ucyBvZiBDPHVuYW1lPiBtYXkgcmVwb3J0IHRoZSBzYW1lIHByb3BlcnR5IGRpZmZlcmVudGx5LiBGb3IgZXhhbXBsZSwKK0M8dW5hbWU+IG9uIExpbnV4KiBPUyByZXBvcnRzIG1hY2hpbmUgYXMgQzxpNjg2Piwgd2hpbGUgQzx1bmFtZT4gb24gT1MgWCogcmVwb3J0cyB0aGUgc2FtZSBtYWNoaW5lIGFzCitDPHg4Nj4uCisKKz1pdGVtICoKKworQzxQT1NJWDo6dW5hbWUoKT4gcmV0dXJucyBsaXN0IG9mIHZhbHVlcy4gSSBjYW5ub3QgcmVjYWxsIHdoYXQgaXMgdGhlIGZvdXJ0aCBlbGVtZW50IG9mIHRoZSBsaXN0LgorCis9YmFjaworCis9aGVhZDIgQmFzZSBGdW5jdGlvbnMKKworQmFzZSBwcm9wZXJ0eSBmdW5jdGlvbnMgcHJvdmlkZSB0aGUgaW5mb3JtYXRpb24gYXMgQzx1bmFtZT4gcHJvZ3JhbS4KKworPW92ZXIKKworPWl0ZW0gQjxrZXJuZWxfbmFtZSgpPgorCitSZXR1cm5zIHRoZSBrZXJuZWwgbmFtZSwgYXMgcmVwb3J0ZWQgYnkgQzxQT1NJWDo6dW5hbWUoKT4uCisKKz1pdGVtIEI8ZnFkbigpPgorCitSZXR1cm5zIHRoZSBGUUROLCBmdWxseSBxdWFsaWZpZWQgZG9tYWluIG5hbWUuIE9uIHNvbWUgc3lzdGVtcyBDPFBPU0lYOjp1bmFtZSgpPiByZXBvcnRzIHNob3J0IG5vZGUKK25hbWUgKHdpdGggbm8gZG9tYWluIG5hbWUpLCBvbiBvdGhlcnMgQzxQT1NJWDo6dW5hbWUoKT4gcmVwb3J0cyBmdWxsIG5vZGUgbmFtZS4gVGhpcworZnVuY3Rpb24gc3RyaXZlIHRvIHJldHVybiBGUUROIGFsd2F5cyAoYnkgcmVmaW5pbmcgQzxQT1NJWDo6dW5hbWUoKT4gd2l0aAorQzxOZXQ6OkRvbWFpbjo6aG9zdGZxZG4oKT4pLgorCis9aXRlbSBCPGtlcm5lbF9yZWxlYXNlKCk+CisKK1JldHVybnMgdGhlIGtlcm5lbCByZWxlYXNlIHN0cmluZywgYXMgcmVwb3J0ZWQgYnkgQzxQT1NJWDo6dW5hbWUoKT4uIFVzdWFsbHkgdGhlIHN0cmluZyBjb25zaXN0cyBvZgorc2V2ZXJhbCBudW1iZXJzLCBzZXBhcmF0ZWQgYnkgZG90cyBhbmQgZGFzaGVzLCBidXQgbWF5IGFsc28gaW5jbHVkZSBzb21lIG5vbi1udW1lcmljIHN1YnN0cmluZ3MgbGlrZQorInNtcCIuCisKKz1pdGVtIEI8a2VybmVsX3ZlcnNpb24oKT4KKworUmV0dXJucyB0aGUga2VybmVsIHZlcnNpb24gc3RyaW5nLCBhcyByZXBvcnRlZCBieSBDPFBPU0lYOjp1bmFtZSgpPi4gSXQgaXMgQjxub3Q+IHNldmVyYWwKK2RvdC1zZXBhcmF0ZWQgbnVtYmVycyBidXQgbXVjaCBsb25nZXIgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGtlcm5lbC4KK0ZvciBleGFtcGxlLCBvbiBMaW51eCogT1MgaXQgaW5jbHVkZXMgYnVpbGQgZGF0ZS4KK0lmIHlvdSBsb29rIGZvciBzb21ldGhpbmcgaWRlbnRpZnlpbmcgdGhlIGtlcm5lbCwgbG9vayBhdCBMPGtlcm5lbF9yZWxlYXNlPi4KKworPWl0ZW0gQjxtYWNoaW5lKCk+CisKK1JldHVybnMgdGhlIG1hY2hpbmUgaGFyZHdhcmUgbmFtZSwgYXMgcmVwb3J0ZWQgYnkgUE9TSVg6OnVuYW1lKCkuIE5vdCByZWxpYWJsZS4gRGlmZmVyZW50IE9TZXMgbWF5CityZXBvcnQgdGhlIHNhbWUgbWFjaGluZSBoYXJkd2FyZSBuYW1lIGRpZmZlcmVudGx5LiBGb3IgZXhhbXBsZSwgTGludXgqIE9TIHJlcG9ydHMgQzxpNjg2Piwgd2hpbGUgT1MgWCoKK3JlcG9ydHMgQzx4ODY+IG9uIHRoZSBzYW1lIG1hY2hpbmUuCisKKz1pdGVtIEI8cHJvY2Vzc29yKCk+CisKK1JldHVybnMgdGhlIHByb2Nlc3NvciB0eXBlLiBOb3QgcmVsaWFibGUuIFVzdWFsbHkgdGhlIHNhbWUgYXMgQzxtYWNoaW5lPi4KKworPWl0ZW0gQjxoYXJkd2FyZV9wbGF0Zm9ybSgpPgorCitPbmUgb2Y6IEM8aTM4Nj4gb3IgQzx4ODZfNjQ+LgorCis9aXRlbSBCPG9wZXJhdGluZ19zeXN0ZW0oKT4KKworT25lIG9mOiBDPEdOVS9MaW51eD4sIEM8T1MgWCo+LCBvciBDPE1TIFdpbmRvd3M+LgorCis9YmFjaworCis9aGVhZDIgQXV4aWxpYXJ5IEZ1bmN0aW9ucworCitBdXhpbGlhcnkgZnVuY3Rpb25zIGV4dGVuZHMgYmFzZSBmdW5jdGlvbnMgd2l0aCBpbmZvcm1hdGlvbiBub3QgcmVwb3J0ZWQgYnkgQzx1bmFtZT4gcHJvZ3JhbS4KKworQXV4aWxpYXJ5IGZ1bmN0aW9ucyBjb2xsZWN0IGluZm9ybWF0aW9uIGZyb20gZGlmZmVyZW50IHNvdXJjZXMuIEZvciBleGFtcGxlLCBvbiBPUyBYKiwgdGhleSBtYXkKK2NhbGwgQzxzd192ZXJzPiBwcm9ncmFtIHRvIGZpbmQgb3V0IE9TIHJlbGVhc2U7IG9uIExpbnV4KiBPUyB0aGV5IG1heSBwYXJzZSBDPC9ldGMvcmVkaGF0LXJlbGVhc2U+IGZpbGUsCitldGMuCisKKz1vdmVyCisKKz1pdGVtIEI8aG9zdF9uYW1lKCk+CisKK1JldHVybnMgaG9zdCBuYW1lIChGUUROIHdpdGggZHJvcHBlZCBkb21haW4gcGFydCkuCisKKz1pdGVtIEI8ZG9tYWluX25hbWUoKT4KKworUmV0dXJucyBkb21haW4gbmFtZSAoRlFETiB3aXRoIGRyb3BwZWQgaG9zdCBwYXJ0KS4KKworPWl0ZW0gQjxvcGVyYXRpbmdfc3lzdGVtX25hbWU+CisKK05hbWUgb2Ygb3BlcmF0aW5nIHN5c3RlbSBvciBuYW1lIG9mIExpbnV4KiBPUyBkaXN0cmlidXRpb24sIGxpa2UgIkZlZG9yYSIgb3IKKyJSZWQgSGF0IEVudGVycHJpc2UgTGludXgqIE9TIFNlcnZlciIuCisKKz1pdGVtIEI8b3BlcmF0aW5nX3N5c3RlbV9yZWxlYXNlPgorCitSZWxlYXNlICh2ZXJzaW9uKSBvZiBvcGVyYXRpbmcgc3lzdGVtIG9yIExpbnV4KiBPUyBkaXN0cmlidXRpb24uIFVzdWFsbHkgaXQgaXMgYSBzZXJpZXMgb2YKK2RvdC1zZXBhcmF0ZWQgbnVtYmVycy4KKworPWl0ZW0gQjxvcGVyYXRpbmdfc3lzdGVtX2NvZGVuYW1lPgorCitDb2RlbmFtZSBvZiBvcGVyYXRpbmcgc3lzdGVtIHJlbGVhc2Ugb3IgTGludXgqIE9TIGRpc3RyaWJ1dGlvbi4gRm9yIGV4YW1wbGUsIEZlZG9yYSAxMCBpcyAiQ2FtYnJpZGdlIgord2hpbGUgT1MgWCogMTAuNCBpcyAiVGlnZXIiLgorCis9aXRlbSBCPG9wZXJhdGluZ19zeXN0ZW1fZGVzY3JpcHRpb24+CisKK0xvbmdlciBzdHJpbmcuIFVzdWFsbHkgaXQgaW5jbHVkZXMgYWxsIHRoZSBvcGVyYXRpbmcgc3lzdGVtIHByb3BlcnRpbmcgbWVudGlvbmVkIGFib3ZlIC0tIG5hbWUsCityZWxlYXNlLCBjb2RlbmFtZSBpbiBwYXJlbnRoZXNlcy4KKworPWJhY2sKKworPWhlYWQyIE1ldGEgRnVuY3Rpb25zCisKKz1vdmVyCisKKz1pdGVtIEI8YmFzZV9uYW1lcygpPgorCitUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGxpc3Qgb2YgYmFzZSBwcm9wZXJ0eSBuYW1lcy4KKworPWl0ZW0gQjxhbGxfbmFtZXMoKT4KKworVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBsaXN0IG9mIGFsbCBwcm9wZXJ0eSBuYW1lcy4KKworPWl0ZW0gQjx2YWx1ZSg+IEk8bmFtZT4gQjwpPgorCitUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBzcGVjaWZpZWQgYnkgSTxuYW1lPi4KKworPWJhY2sKKworPWhlYWQxIEVYQU1QTEVTCisKKyAgICB1c2UgVW5hbWU7CisKKyAgICBwcmludCggVW5hbWU6OnN0cmluZygpLCAiXG4iICk7CisKKyAgICBmb3JlYWNoIG15ICRuYW1lICggVW5hbWU6OmFsbF9uYW1lcygpICkgeworICAgICAgICBwcmludCggIiRuYW1lPVwiIiAuIFVuYW1lOjp2YWx1ZSggJG5hbWUgKSAuICJcIlxuIiApOworICAgIH07ICMgZm9yZWFjaCAkbmFtZQorCis9aGVhZDEgU0VFIEFMU08KKworTDxQT1NJWDo6dW5hbWU+LCBMPHVuYW1lPi4KKworPWN1dAorCisjIGVuZCBvZiBmaWxlICMKKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90b29scy9saWIvdG9vbHMucG0gYi9maW5hbC9ydW50aW1lL3Rvb2xzL2xpYi90b29scy5wbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTVjZjQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90b29scy9saWIvdG9vbHMucG0KQEAgLTAsMCArMSwxOTgxIEBACisjCisjIFRoaXMgaXMgbm90IGEgcnVubmFibGUgc2NyaXB0LCBpdCBpcyBhIFBlcmwgbW9kdWxlLCBhIGNvbGxlY3Rpb24gb2YgdmFyaWFibGVzLCBzdWJyb3V0aW5lcywgZXRjLgorIyB0byBiZSB1c2VkIGluIG90aGVyIHNjcmlwdHMuCisjCisjIFRvIGdldCBoZWxwIGFib3V0IGV4cG9ydGVkIHZhcmlhYmxlcyBhbmQgc3Vicm91dGluZXMsIHBsZWFzZSBleGVjdXRlIHRoZSBmb2xsb3dpbmcgY29tbWFuZDoKKyMKKyMgICAgIHBlcmxkb2MgdG9vbHMucG0KKyMKKyMgb3Igc2VlIFBPRCAoUGxhaW4gT2xkIERvY3VtZW50YXRpb24pIGltYmVkZGVkIHRvIHRoZSBzb3VyY2UuLi4KKyMKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKKworPWhlYWQxIE5BTUUKKworQjx0b29scy5wbT4gLS0gQSBjb2xsZWN0aW9uIG9mIHN1YnJvdXRpbmVzIHdoaWNoIGFyZSB3aWRlbHkgdXNlZCBpbiBQZXJsIHNjcmlwdHMuCisKKz1oZWFkMSBTWU5PUFNJUworCisgICAgdXNlIEZpbmRCaW47CisgICAgdXNlIGxpYiAiJEZpbmRCaW46OkJpbi9saWIiOworICAgIHVzZSB0b29sczsKKworPWhlYWQxIERFU0NSSVBUSU9OCisKK0I8Tm90ZTo+IEJlY2F1c2UgdGhpcyBjb2xsZWN0aW9uIGlzIHNtYWxsIGFuZCBpbnRlbmRlZCBmb3Igd2lkZWx5IHVzaW5nIGluIHBhcnRpY3VsYXIgcHJvamVjdCwKK2FsbCB2YXJpYWJsZXMgYW5kIGZ1bmN0aW9ucyBhcmUgZXhwb3J0ZWQgYnkgZGVmYXVsdC4KKworQjxOb3RlOj4gSSBoYXZlIHNvbWUgaWRlYXMgaG93IHRvIGltcHJvdmUgdGhpcyBjb2xsZWN0aW9uLCBidXQgaXQgaXMgaW4gbXkgbG9uZy10ZXJtIHBsYW5zLgorQ3VycmVudCBzaGFwZSBpcyBub3QgaWRlYWwsIGJ1dCBnb29kIGVub3VnaCB0byB1c2UuCisKKz1jdXQKKworcGFja2FnZSB0b29sczsKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKwordXNlIHZhcnMgcXcoIEBJU0EgQEVYUE9SVCBARVhQT1JUX09LICVFWFBPUlRfVEFHUyApOworcmVxdWlyZSBFeHBvcnRlcjsKK0BJU0EgPSBxdyggRXhwb3J0ZXIgKTsKKworbXkgQHZhcnMgICA9IHF3KCAkdG9vbCApOworbXkgQHV0aWxzICA9IHF3KCBjaGVja19vcHRzIHZhbGlkYXRlICk7CitteSBAb3B0cyAgID0gcXcoIGdldF9vcHRpb25zICk7CitteSBAcHJpbnQgID0gcXcoIGRlYnVnIGluZm8gd2FybmluZyBjbWRsaW5lX2Vycm9yIHJ1bnRpbWVfZXJyb3IgcXVlc3Rpb24gKTsKK215IEBuYW1lICAgPSBxdyggZ2V0X3ZvbCBnZXRfZGlyIGdldF9maWxlIGdldF9uYW1lIGdldF9leHQgY2F0X2ZpbGUgY2F0X2RpciApOworbXkgQGZpbGUgICA9IHF3KCB3aGljaCBhYnNfcGF0aCByZWxfcGF0aCByZWFsX3BhdGggbWFrZV9kaXIgY2xlYW5fZGlyIGNvcHlfZGlyIG1vdmVfZGlyIGRlbF9kaXIgY2hhbmdlX2RpciBjb3B5X2ZpbGUgbW92ZV9maWxlIGRlbF9maWxlICk7CitteSBAaW8gICAgID0gcXcoIHJlYWRfZmlsZSB3cml0ZV9maWxlICk7CitteSBAZXhlYyAgID0gcXcoIGV4ZWN1dGUgYmFja3RpY2tzICk7CitteSBAc3RyaW5nID0gcXd7IHBhZCB9OworQEVYUE9SVCA9ICggQHV0aWxzLCBAb3B0cywgQHZhcnMsIEBwcmludCwgQG5hbWUsIEBmaWxlLCBAaW8sIEBleGVjLCBAc3RyaW5nICk7CisKK3VzZSBVTklWRVJTQUwgICAgKCk7CisKK3VzZSBGaW5kQmluOwordXNlIElPOjpIYW5kbGU7Cit1c2UgSU86OkZpbGU7Cit1c2UgSU86OkRpcjsKKyMgTm90IGF2YWlsYWJsZSBvbiBzb21lIG1hY2hpbmVzOiB1c2UgSU86OlpsaWI7CisKK3VzZSBHZXRvcHQ6OkxvbmcgKCk7Cit1c2UgUG9kOjpVc2FnZSAgICgpOwordXNlIENhcnAgICAgICAgICAoKTsKK3VzZSBGaWxlOjpDb3B5ICAgKCk7Cit1c2UgRmlsZTo6UGF0aCAgICgpOwordXNlIEZpbGU6OlRlbXAgICAoKTsKK3VzZSBGaWxlOjpTcGVjICAgKCk7Cit1c2UgUE9TSVggICAgICAgIHF3eyA6ZmNudGxfaCA6ZXJybm9faCB9OwordXNlIEN3ZCAgICAgICAgICAoKTsKK3VzZSBTeW1ib2wgICAgICAgKCk7CisKK3VzZSBEYXRhOjpEdW1wZXI7CisKK3VzZSB2YXJzIHF3KCAkdG9vbCAkdmVyYm9zZSAkdGltZXN0YW1wcyApOworJHRvb2wgPSAkRmluZEJpbjo6U2NyaXB0OworCitteSBAd2FybmluZyA9ICggc3ViIHt9LCBcJndhcm5pbmcsIFwmcnVudGltZV9lcnJvciApOworCisKK3N1YiBjaGVja19vcHRzKFwlJDskKSB7CisKKyAgICBteSAkb3B0cyA9IHNoaWZ0KCBAXyApOyAgIyBSZWZlcmVuc2UgdG8gaGFzaCBjb250YWluaW5nIHJlYWwgb3B0aW9ucyBhbmQgdGhlaXIgdmFsdWVzLgorICAgIG15ICRnb29kID0gc2hpZnQoIEBfICk7ICAjIFJlZmVyZW5jZSB0byBhbiBhcnJheSBjb250YWluaW5nIGFsbCBrbm93biBvcHRpb24gbmFtZXMuCisgICAgbXkgJG1zZyAgPSBzaGlmdCggQF8gKTsgICMgT3B0aW9uYWwgKG5vbi1tYW5kYXRvcnkpIG1lc3NhZ2UuCisKKyAgICBpZiAoIG5vdCBkZWZpbmVkKCAkbXNnICkgKSB7CisgICAgICAgICRtc2cgPSAidW5rbm93biBvcHRpb24ocykgcGFzc2VkIjsgICAjIERlZmF1bHQgdmFsdWUgZm9yICRtc2cuCisgICAgfTsgIyBpZgorCisgICAgIyBJJ2xsIHVzZSB0aGVzZSBoYXNoZXMgYXMgc2V0cyBvZiBvcHRpb25zLgorICAgIG15ICVnb29kID0gbWFwKCAoICRfID0+IDEgKSwgQCRnb29kICk7ICAgIyAlZ29vZCBub3cgaXMgZmlsbGVkIHdpdGggYWxsIGtub3duIG9wdGlvbnMuCisgICAgbXkgJWJhZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICViYWQgaXMgZW1wdHkuCisKKyAgICBmb3JlYWNoIG15ICRvcHQgKCBrZXlzKCAlJG9wdHMgKSApIHsgICAgICMgRm9yIGVhY2ggcmVhbCBvcHRpb24uLi4KKyAgICAgICAgaWYgKCBub3QgZXhpc3RzKCAkZ29vZHsgJG9wdCB9ICkgKSB7ICMgTG9vayBpdHMgbmFtZSBpbiB0aGUgc2V0IG9mIGtub3duIG9wdGlvbnMuLi4KKyAgICAgICAgICAgICRiYWR7ICRvcHQgfSA9IDE7ICAgICAgICAgICAgICAgICMgQWRkIHVua25vd24gb3B0aW9uIHRvICViYWQgc2V0LgorICAgICAgICAgICAgZGVsZXRlKCAkb3B0cy0+eyAkb3B0IH0gKTsgICAgICAgIyBBbmQgZGVsZXRlIG9yaWdpbmFsIG9wdGlvbi4KKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgZm9yZWFjaCAkb3B0CisgICAgaWYgKCAlYmFkICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIElmICViYWQgc2V0IGlzIG5vdCBlbXB0eS4uLgorICAgICAgICBteSBAY2FsbGVyID0gY2FsbGVyKCAxICk7ICAgICAgICAgICAgIyBJc3N1ZSBhIHdhcm5pbmcuCisgICAgICAgIGxvY2FsICRDYXJwOjpDYXJwTGV2ZWwgPSAyOworICAgICAgICBDYXJwOjpjbHVjayggJGNhbGxlclsgMyBdIC4gIjogIiAuICRtc2cgLiAiOiAiIC4gam9pbiggIiwgIiwgc29ydCgga2V5cyggJWJhZCApICkgKSApOworICAgIH07ICMgaWYKKworICAgIHJldHVybiAxOworCit9OyAjIHN1YiBjaGVja19vcHRzCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBQdXJwb3NlOgorIyAgICAgQ2hlY2sgc3Vicm91dGluZSBhcmd1bWVudHMuCisjIFN5bm9wc2lzOgorIyAgICAgbXkgJW9wdHMgPSB2YWxpZGF0ZSggcGFyYW1zID0+IFxAXywgc3BlYyA9PiB7IC4uLiB9LCBjYWxsZXIgPT4gbiApOworIyBBcmd1bWVudHM6CisjICAgICBwYXJhbXMgLS0gQSByZWZlcmVuY2UgdG8gc3Vicm91dGluZSdzIGFjdHVhbCBhcmd1bWVudHMuCisjICAgICBzcGVjICAgLS0gU3BlY2lmaWNhdGlvbiBvZiBleHBlY3RlZCBhcmd1bWVudHMuCisjICAgICBjYWxsZXIgLS0gLi4uCisjIFJldHVybiB2YWx1ZToKKyMgICAgIEEgaGFzaCBvZiB2YWxpZGF0ZWQgb3B0aW9ucy4KKyMgRGVzY3JpcHRpb246CisjICAgICBJIHdvdWxkIGxpa2UgdG8gdXNlIFBhcmFtczo6VmFsaWRhdGUgbW9kdWxlLCBidXQgaXQgaXMgbm90IGEgcGFydCBvZiBkZWZhdWx0IFBlcmwKKyMgICAgIGRpc3RyaWJ1dGlvbiwgc28gSSBjYW5ub3QgcmVseSBvbiBpdC4gVGhpcyBzdWJyb3V0aW5lIHJlc2VtYmxlcyB0byBzb21lIGV4dGVudCB0bworIyAgICAgUGFyYW1zOjpWYWxpZGF0ZTo6dmFsaWRhdGVfd2l0aCgpLgorIyAgICAgU3BlY2lmaWNhdGlvbiBvZiBleHBlY3RlZCBhcmd1bWVudHM6CisjICAgICAgICB7ICRvcHQgPT4geyB0eXBlID0+ICR0eXBlLCBkZWZhdWx0ID0+ICRkZWZhdWx0IH0sIC4uLiB9CisjICAgICAgICAkb3B0ICAgICAtLSBTdHJpbmcsIG9wdGlvbiBuYW1lLgorIyAgICAgICAgJHR5cGUgICAgLS0gU3RyaW5nLCBleHBlY3RlZCB0eXBlKHMpLiBBbGxvd2VkIHZhbHVlcyBhcmUgIlNDQUxBUiIsICJVTkRFRiIsICJCT09MRUFOIiwKKyMgICAgICAgICAgICAgICAgICAgICJBUlJBWVJFRiIsICJIQVNIUkVGIiwgIkNPREVSRUYiLiBNdWx0aXBsZSB0eXBlcyBtYXkgbGlzdGVkIHVzaW5nIGJhcjoKKyMgICAgICAgICAgICAgICAgICAgICJTQ0FMQVJ8QVJSQVlSRUYiLiBUaGUgdHlwZSBzdHJpbmcgaXMgY2FzZS1pbnNlbnNpdGl2ZS4KKyMgICAgICAgICRkZWZhdWx0IC0tIERlZmF1bHQgdmFsdWUgZm9yIGFuIG9wdGlvbi4gV2lsbCBiZSB1c2VkIGlmIG9wdGlvbiBpcyBub3Qgc3BlY2lmaWVkIG9yCisjICAgICAgICAgICAgICAgICAgICB1bmRlZmluZWQuCisjCitzdWIgdmFsaWRhdGUoQCkgeworCisgICAgbXkgJW9wdHMgPSBAXzsgICAgIyBUZW1wb3JhcnkgdXNlICVvcHRzIGZvciBwYXJhbWV0ZXJzIG9mIGB2YWxpZGF0ZScgc3Vicm91dGluZS4KKyAgICBteSAkcGFyYW1zID0gJG9wdHN7IHBhcmFtcyB9OworICAgIG15ICRjYWxsZXIgPSAoICRvcHRzeyBjYWxsZXIgfSBvciAwICkgKyAxOworICAgIG15ICRzcGVjICAgPSAkb3B0c3sgc3BlYyB9OworICAgIHVuZGVmKCAlb3B0cyApOyAgICMgT2ssIENsZWFuICVvcHRzLCBub3cgd2Ugd2lsbCBjb2xsZWN0IHJlc3VsdCBvZiB0aGUgc3Vicm91dGluZS4KKworICAgICMgRmluZCBvdXQgY2FsbGVyIHBhY2thZ2UsIGZpbGVuYW1lLCBsaW5lLCBhbmQgc3Vicm91dGluZSBuYW1lLgorICAgIG15ICggJHBrZywgJGZpbGUsICRsaW5lLCAkc3ViciApID0gY2FsbGVyKCAkY2FsbGVyICk7CisgICAgbXkgQGVycm9yczsgICAgIyBXZSB3aWxsIGNvbGxlY3QgZXJyb3JzIGluIGFycmF5IG5vdCB0byBzdG9wIG9uIHRoZSBmaXJzdCBmb3VuZCBlcnJvci4KKyAgICBteSAkZXJyb3IgPQorICAgICAgICBzdWIgKCQpIHsKKyAgICAgICAgICAgIG15ICRtc2cgPSBzaGlmdCggQF8gKTsKKyAgICAgICAgICAgIHB1c2goIEBlcnJvcnMsICIkbXNnIGF0ICRmaWxlIGxpbmUgJGxpbmUuXG4iICk7CisgICAgICAgIH07ICMgc3ViCisKKyAgICAjIENoZWNrIG9wdGlvbnMuCisgICAgd2hpbGUgKCBAJHBhcmFtcyApIHsKKyAgICAgICAgIyBDaGVjayBvcHRpb24gbmFtZS4KKyAgICAgICAgbXkgJG9wdCA9IHNoaWZ0KCBAJHBhcmFtcyApOworICAgICAgICBpZiAoIG5vdCBleGlzdHMoICRzcGVjLT57ICRvcHQgfSApICkgeworICAgICAgICAgICAgJGVycm9yLT4oICJJbnZhbGlkIG9wdGlvbiBgJG9wdCciICk7CisgICAgICAgICAgICBzaGlmdCggQCRwYXJhbXMgKTsgIyBTa2lwIHZhbHVlIG9mIHVua25vdyBvcHRpb24uCisgICAgICAgICAgICBuZXh0OworICAgICAgICB9OyAjIGlmCisgICAgICAgICMgQ2hlY2sgb3B0aW9uIHZhbHVlIGV4aXN0cy4KKyAgICAgICAgaWYgKCBub3QgQCRwYXJhbXMgKSB7CisgICAgICAgICAgICAkZXJyb3ItPiggIk9wdGlvbiBgJG9wdCcgZG9lcyBub3QgaGF2ZSBhIHZhbHVlIiApOworICAgICAgICAgICAgbmV4dDsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICBteSAkdmFsID0gc2hpZnQoIEAkcGFyYW1zICk7CisgICAgICAgICMgQ2hlY2sgb3B0aW9uIHZhbHVlIHR5cGUuCisgICAgICAgIGlmICggZXhpc3RzKCAkc3BlYy0+eyAkb3B0IH0tPnsgdHlwZSB9ICkgKSB7CisgICAgICAgICAgICAjIFR5cGUgc3BlY2lmaWNhdGlvbiBleGlzdHMuIENoZWNrIG9wdGlvbiB2YWx1ZSB0eXBlLgorICAgICAgICAgICAgbXkgJGFjdHVhbF90eXBlOworICAgICAgICAgICAgaWYgKCByZWYoICR2YWwgKSBuZSAiIiApIHsKKyAgICAgICAgICAgICAgICAkYWN0dWFsX3R5cGUgPSByZWYoICR2YWwgKSAuICJSRUYiOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAkYWN0dWFsX3R5cGUgPSAoIGRlZmluZWQoICR2YWwgKSA/ICJTQ0FMQVIiIDogIlVOREVGIiApOworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgbXkgQHdhbnRlZF90eXBlcyA9IHNwbGl0KCBte1x8fSwgbGMoICRzcGVjLT57ICRvcHQgfS0+eyB0eXBlIH0gKSApOworICAgICAgICAgICAgbXkgJHdhbnRlZF90eXBlcyA9IGpvaW4oICJ8IiwgbWFwKCAkXyBlcSAiYm9vbGVhbiIgPyAic2NhbGFyfHVuZGVmIiA6IHF1b3RlbWV0YSggJF8gKSwgQHdhbnRlZF90eXBlcyApICk7CisgICAgICAgICAgICBpZiAoICRhY3R1YWxfdHlwZSAhfiBte1xBKD86JHdhbnRlZF90eXBlcylcen1pICkgeworICAgICAgICAgICAgICAgICRhY3R1YWxfdHlwZSA9IGxjKCAkYWN0dWFsX3R5cGUgKTsKKyAgICAgICAgICAgICAgICAkd2FudGVkX3R5cGVzID0gbGMoIGpvaW4oICIgb3IgIiwgbWFwKCAiYCRfJyIsIEB3YW50ZWRfdHlwZXMgKSApICk7CisgICAgICAgICAgICAgICAgJGVycm9yLT4oICJPcHRpb24gYCRvcHQnIHZhbHVlIHR5cGUgaXMgYCRhY3R1YWxfdHlwZScgYnV0IGV4cGVjdGVkIHRvIGJlICR3YW50ZWRfdHlwZXMiICk7CisgICAgICAgICAgICAgICAgbmV4dDsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgfTsgIyBpZgorICAgICAgICBpZiAoIGV4aXN0cyggJHNwZWMtPnsgJG9wdCB9LT57IHZhbHVlcyB9ICkgICkgeworICAgICAgICAgICAgbXkgJHZhbHVlcyA9ICRzcGVjLT57ICRvcHQgfS0+eyB2YWx1ZXMgfTsKKyAgICAgICAgICAgIGlmICggbm90IGdyZXAoICRfIGVxICR2YWwsIEAkdmFsdWVzICkgKSB7CisgICAgICAgICAgICAgICAgJHZhbHVlcyA9IGpvaW4oICIsICIsIG1hcCggImAkXyciLCBAJHZhbHVlcyApICk7CisgICAgICAgICAgICAgICAgJGVycm9yLT4oICJPcHRpb24gYCRvcHQnIHZhbHVlIGlzIGAkdmFsJyBidXQgZXhwZWN0ZWQgdG8gYmUgb25lIG9mICR2YWx1ZXMiICk7CisgICAgICAgICAgICAgICAgbmV4dDsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgfTsgIyBpZgorICAgICAgICAkb3B0c3sgJG9wdCB9ID0gJHZhbDsKKyAgICB9OyAjIHdoaWxlCisKKyAgICAjIEFzc2lnbiBkZWZhdWx0IHZhbHVlcy4KKyAgICBmb3JlYWNoIG15ICRvcHQgKCBrZXlzKCAlJHNwZWMgKSApIHsKKyAgICAgICAgaWYgKCBub3QgZGVmaW5lZCggJG9wdHN7ICRvcHQgfSApIGFuZCBleGlzdHMoICRzcGVjLT57ICRvcHQgfS0+eyBkZWZhdWx0IH0gKSApIHsKKyAgICAgICAgICAgICRvcHRzeyAkb3B0IH0gPSAkc3BlYy0+eyAkb3B0IH0tPnsgZGVmYXVsdCB9OworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBmb3JlYWNoICRvcHQKKworICAgICMgSWYgd2UgZm91bmQgYW55IGVycm9ycywgcmFpc2UgdGhlbS4KKyAgICBpZiAoIEBlcnJvcnMgKSB7CisgICAgICAgIGRpZSBqb2luKCAiIiwgQGVycm9ycyApOworICAgIH07ICMgaWYKKworICAgIHJldHVybiAlb3B0czsKKworfTsgIyBzdWIgdmFsaWRhdGUKKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIEdldCBvcHRpb24gaGVscGVycy4KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCis9aGVhZDIgR2V0IG9wdGlvbiBoZWxwZXJzLgorCis9Y3V0CisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis9aGVhZDMgZ2V0X29wdGlvbnMKKworQjxTeW5vcHNpczo+CisKKyAgICBnZXRfb3B0aW9ucyggQGFyZ3VtZW50cyApCisKK0I8RGVzY3JpcHRpb246PgorCitJdCBpcyB2ZXJ5IHNpbXBsZSB3cmFwcGVyIGFyb3VuZiBHZXRvcHQ6Okxvbmc6OkdldE9wdGlvbnMuIEl0IHBhc3NlcyBhbGwgYXJndW1lbnRzIHRvIEdldE9wdGlvbnMsCithbmQgYWRkIGRlZmluaXRpb25zIGZvciBzdGFuZGFyZCBoZWxwIG9wdGlvbnM6IC0taGVscCwgLS1kb2MsIC0tdmVyYm9zZSwgYW5kIC0tcXVpZXQuCitXaGVuIEdldE9wdGlvbnMgZmluaWhlcywgdGhpcyBzdWJyb3V0aW5lIGNoZWNrcyBleGl0IGNvZGUsIGlmIGl0IGlzIG5vbi16ZXJvLCBzdGFuZGFyZCBlcnJvcgorbWVzc2FnZSBpcyBpc3N1ZWQgYW5kIHNjcmlwdCB0ZXJtaW5hdGVkLgorCitJZiAtLXZlcmJvc2Ugb3IgLS1xdWlldCBvcHRpb24gaXMgc3BlY2lmaWVkLCBDPHRvb2xzLnBtX3ZlcmJvc2U+IGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHNldC4KK0l0IGlzIHRoZSB3YXkgdG8gcHJvcGFnYXRlIHZlcmJvc2UvcXVpZXQgbW9kZSB0byBjYWxsZWUgUGVybCBzY3JpcHRzLgorCis9Y3V0CisKK3N1YiBnZXRfb3B0aW9ucyB7CisKKyAgICBHZXRvcHQ6Okxvbmc6OkNvbmZpZ3VyZSggIm5vX2lnbm9yZV9jYXNlIiApOworICAgIEdldG9wdDo6TG9uZzo6R2V0T3B0aW9ucygKKyAgICAgICAgImgwfHVzYWdlIiAgICAgICAgPT4gc3ViIHsgUG9kOjpVc2FnZTo6cG9kMnVzYWdlKCAtZXhpdHZhbCA9PiAwLCAtdmVyYm9zZSA9PiAwICk7IH0sCisgICAgICAgICJoMXxofGhlbHAiICAgICAgID0+IHN1YiB7IFBvZDo6VXNhZ2U6OnBvZDJ1c2FnZSggLWV4aXR2YWwgPT4gMCwgLXZlcmJvc2UgPT4gMSApOyB9LAorICAgICAgICAiaDJ8ZG9jfG1hbnVhbCIgICA9PiBzdWIgeyBQb2Q6OlVzYWdlOjpwb2QydXNhZ2UoIC1leGl0dmFsID0+IDAsIC12ZXJib3NlID0+IDIgKTsgfSwKKyAgICAgICAgInZlcnNpb24iICAgICAgICAgPT4gc3ViIHsgcHJpbnQoICIkdG9vbCB2ZXJzaW9uICRtYWluOjpWRVJTSU9OXG4iICk7IGV4aXQoIDAgKTsgfSwKKyAgICAgICAgInZ8dmVyYm9zZSIgICAgICAgPT4gc3ViIHsgKysgJHZlcmJvc2U7ICAgICAkRU5WeyAidG9vbHMucG1fdmVyYm9zZSIgICAgfSA9ICR2ZXJib3NlOyAgICB9LAorICAgICAgICAicXVpZXQiICAgICAgICAgICA9PiBzdWIgeyAtLSAkdmVyYm9zZTsgICAgICRFTlZ7ICJ0b29scy5wbV92ZXJib3NlIiAgICB9ID0gJHZlcmJvc2U7ICAgIH0sCisgICAgICAgICJ3aXRoLXRpbWVzdGFtcHMiID0+IHN1YiB7ICR0aW1lc3RhbXBzID0gMTsgJEVOVnsgInRvb2xzLnBtX3RpbWVzdGFtcHMiIH0gPSAkdGltZXN0YW1wczsgfSwKKyAgICAgICAgQF8sICMgQ2FsbGVyIGFyZ3VtZXRzYSBhcmUgYXQgdGhlIGVuZCBzbyBjYWxsZXIgb3B0aW9ucyBvdmVycmlkZXMgc3RhbmRhcmQuCisgICAgKSBvciBjbWRsaW5lX2Vycm9yKCk7CisKK307ICMgc3ViIGdldF9vcHRpb25zCisKKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIFByaW50IHV0aWxpdGllcy4KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCis9cG9kCisKKz1oZWFkMiBQcmludCB1dGlsaXRpZXMuCisKK0VhY2ggb2YgdGhlIHByaW50IHN1YnJvdXRpbmVzIHByZXBlbmRzIGVhY2ggbGluZSBvZiBpdHMgb3V0cHV0IHdpdGggdGhlIG5hbWUgb2YgY3VycmVudCBzY3JpcHQgYW5kCit0aGUgdHlwZSBvZiBpbmZvcm1hdGlvbiwgZm9yIGV4YW1wbGU6CisKKyAgICBpbmZvKCAiV3JpdGluZyBmaWxlLi4uIiApOworCit3aWxsIHByaW50CisKKyAgICA8c2NyaXB0PjogKGkpOiBXcml0aW5nIGZpbGUuLi4KKword2hpbGUKKworICAgIHdhcm5pbmcoICJGaWxlIGRvZXMgbm90IGV4aXN0ISIgKTsKKword2lsbCBwcmludAorCisgICAgPHNjcmlwdD46ICghKTogRmlsZSBkb2VzIG5vdCBleGlzdCEKKworSGVyZSBhcmUgZXhwb3J0ZWQgaXRlbXM6CisKKz1jdXQKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N1YiBfZm9ybWF0X21lc3NhZ2UoJFxAOyQpIHsKKworICAgIG15ICRwcmVmaXggID0gc2hpZnQoIEBfICk7CisgICAgbXkgJGFyZ3MgICAgPSBzaGlmdCggQF8gKTsKKyAgICBteSAkbm9fZW9sICA9IHNoaWZ0KCBAXyApOyAgIyBEbyBub3QgYXBwZW5kICJcbiIgdG8gdGhlIGxhc3QgbGluZS4KKyAgICBteSAkbWVzc2FnZSA9ICIiOworCisgICAgbXkgJHRzID0gIiI7CisgICAgaWYgKCAkdGltZXN0YW1wcyApIHsKKyAgICAgICAgbXkgKCAkc2VjLCAkbWluLCAkaG91ciwgJGRheSwgJG1vbnRoLCAkeWVhciApID0gZ210aW1lKCk7CisgICAgICAgICRtb250aCArPSAxOworICAgICAgICAkeWVhciAgKz0gMTkwMDsKKyAgICAgICAgJHRzID0gc3ByaW50ZiggIiUwNGQtJTAyZC0lMDJkICUwMmQ6JTAyZDolMDJkIFVUQzogIiwgJHllYXIsICRtb250aCwgJGRheSwgJGhvdXIsICRtaW4sICRzZWMgKTsKKyAgICB9OyAjIGlmCisgICAgZm9yIG15ICRpICggMSAuLiBAJGFyZ3MgKSB7CisgICAgICAgIG15IEBsaW5lcyA9IHNwbGl0KCAiXG4iLCAkYXJncy0+WyAkaSAtIDEgXSApOworICAgICAgICBmb3IgbXkgJGogKCAxIC4uIEBsaW5lcyApIHsKKyAgICAgICAgICAgIG15ICRsaW5lID0gJGxpbmVzWyAkaiAtIDEgXTsKKyAgICAgICAgICAgIG15ICRsYXN0X2xpbmUgPSAoICggJGkgPT0gQCRhcmdzICkgYW5kICggJGogPT0gQGxpbmVzICkgKTsKKyAgICAgICAgICAgIG15ICRlb2wgPSAoICggc3Vic3RyKCAkbGluZSwgLTEgKSBlcSAiXG4iICkgb3IgZGVmaW5lZCggJG5vX2VvbCApID8gIiIgOiAiXG4iICk7CisgICAgICAgICAgICAkbWVzc2FnZSAuPSAiJHRzJHRvb2w6ICgkcHJlZml4KSAiIC4gJGxpbmUgLiAkZW9sOworICAgICAgICB9OyAjIGZvcmVhY2ggJGoKKyAgICB9OyAjIGZvcmVhY2ggJGkKKyAgICByZXR1cm4gJG1lc3NhZ2U7CisKK307ICMgc3ViIF9mb3JtYXRfbWVzc2FnZQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworPXBvZAorCis9aGVhZDMgJHZlcmJvc2UKKworQjxTeW5vcHNpczo+CisKKyAgICAkdmVyYm9zZQorCitCPERlc2NyaXB0aW9uOj4KKworUGFja2FnZSB2YXJpYWJsZS4gSXQgZGV0ZXJtaW5lcyB2ZXJib3NpdHkgbGV2ZWwsIHdoaWNoIGFmZmVjdHMgQzx3YXJuaW5nKCk+LCBDPGluZm8oKT4sIGFuZAorQzxkZWJ1ZygpPiBzdWJyb3V0bmVzIC4KKworVGhlIHZhcmlhYmxlIGdldHMgaW5pdGlhbCB2YWx1ZSBmcm9tIEM8dG9vbHMucG1fdmVyYm9zZT4gZW52aXJvbm1lbnQgdmFyaWFibGUgaWYgaXQgaXMgZXhpc3RzLgorSWYgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIGRvZXMgbm90IGV4aXN0LCB2YXJpYWJsZSBpcyBzZXQgdG8gMi4KKworSW5pdGlhbCB2YWx1ZSBtYXkgYmUgb3ZlcnJpZGRlbiBsYXRlciBkaXJlY3RseSBvciBieSBDPGdldF9vcHRpb25zPiBmdW5jdGlvbi4KKworPWN1dAorCiskdmVyYm9zZSA9IGV4aXN0cyggJEVOVnsgInRvb2xzLnBtX3ZlcmJvc2UiIH0gKSA/ICRFTlZ7ICJ0b29scy5wbV92ZXJib3NlIiB9IDogMjsKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKz1wb2QKKworPWhlYWQzICR0aW1lc3RhbXBzCisKK0I8U3lub3BzaXM6PgorCisgICAgJHRpbWVzdGFtcHMKKworQjxEZXNjcmlwdGlvbjo+CisKK1BhY2thZ2UgdmFyaWFibGUuIEl0IGRldGVybWluZXMgd2hldGhlciBDPGRlYnVnKCk+LCBDPGluZm8oKT4sIEM8d2FybmluZygpPiwgQzxydW50aW1lX2Vycm9yKCk+CitzdWJyb3V0bmVzIHByaW50IHRpbWVzdGFtcHMgb3Igbm90LgorCitUaGUgdmFyaWFibGUgZ2V0cyBpbml0aWFsIHZhbHVlIGZyb20gQzx0b29scy5wbV90aW1lc3RhbXBzPiBlbnZpcm9ubWVudCB2YXJpYWJsZSBpZiBpdCBpcyBleGlzdHMuCitJZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgZG9lcyBub3QgZXhpc3QsIHZhcmlhYmxlIGlzIHNldCB0byBmYWxzZS4KKworSW5pdGlhbCB2YWx1ZSBtYXkgYmUgb3ZlcnJpZGRlbiBsYXRlciBkaXJlY3RseSBvciBieSBDPGdldF9vcHRpb25zKCk+IGZ1bmN0aW9uLgorCis9Y3V0CisKKyR0aW1lc3RhbXBzID0gZXhpc3RzKCAkRU5WeyAidG9vbHMucG1fdGltZXN0YW1wcyIgfSApID8gJEVOVnsgInRvb2xzLnBtX3RpbWVzdGFtcHMiIH0gOiAwOworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworPXBvZAorCis9aGVhZDMgZGVidWcKKworQjxTeW5vcHNpczo+CisKKyAgICBkZWJ1ZyggQG1lc3NhZ2VzICkKKworQjxEZXNjcmlwdGlvbjo+CisKK0lmIHZlcmJvc2l0eSBsZXZlbCBpcyAzIG9yIGhpZ2hlciwgcHJpbnQgZGVidWcgaW5mb3JtYXRpb24gdG8gdGhlIHN0ZGVyciwgcHJlcGVuZGluZyBpdCB3aXRoICIoIykiCitwcmVmaXguCisKKz1jdXQKKworc3ViIGRlYnVnKEApIHsKKworICAgIGlmICggJHZlcmJvc2UgPj0gMyApIHsKKyAgICAgICAgU1RET1VULT5mbHVzaCgpOworICAgICAgICBTVERFUlItPnByaW50KCBfZm9ybWF0X21lc3NhZ2UoICIjIiwgQF8gKSApOworICAgIH07ICMgaWYKKyAgICByZXR1cm4gMTsKKworfTsgIyBzdWIgZGVidWcKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKz1wb2QKKworPWhlYWQzIGluZm8KKworQjxTeW5vcHNpczo+CisKKyAgICBpbmZvKCBAbWVzc2FnZXMgKQorCitCPERlc2NyaXB0aW9uOj4KKworSWYgdmVyYm9zaXR5IGxldmVsIGlzIDIgb3IgaGlnaGVyLCBwcmludCBpbmZvcm1hdGlvbiB0byB0aGUgc3RkZXJyLCBwcmVwZW5kaW5nIGl0IHdpdGggIihpKSIgcHJlZml4LgorCis9Y3V0CisKK3N1YiBpbmZvKEApIHsKKworICAgIGlmICggJHZlcmJvc2UgPj0gMiApIHsKKyAgICAgICAgU1RET1VULT5mbHVzaCgpOworICAgICAgICBTVERFUlItPnByaW50KCBfZm9ybWF0X21lc3NhZ2UoICJpIiwgQF8gICkgKTsKKyAgICB9OyAjIGlmCisKK307ICMgc3ViIGluZm8KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKz1oZWFkMyB3YXJuaW5nCisKK0I8U3lub3BzaXM6PgorCisgICAgd2FybmluZyggQG1lc3NhZ2VzICkKKworQjxEZXNjcmlwdGlvbjo+CisKK0lmIHZlcmJvc2l0eSBsZXZlbCBpcyAxIG9yIGhpZ2hlciwgaXNzdWUgYSB3YXJuaW5nLCBwcmVwZW5kaW5nIGl0IHdpdGggIighKSIgcHJlZml4LgorCis9Y3V0CisKK3N1YiB3YXJuaW5nKEApIHsKKworICAgIGlmICggJHZlcmJvc2UgPj0gMSApIHsKKyAgICAgICAgU1RET1VULT5mbHVzaCgpOworICAgICAgICB3YXJuKCBfZm9ybWF0X21lc3NhZ2UoICIhIiwgQF8gICkgKTsKKyAgICB9OyAjIGlmCisKK307ICMgc3ViIHdhcm5pbmcKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKz1oZWFkMyBjbWRsaW5lX2Vycm9yCisKK0I8U3lub3BzaXM6PgorCisgICAgY21kbGluZV9lcnJvciggQG1lc3NhZ2UgKQorCitCPERlc2NyaXB0aW9uOj4KKworUHJpbnQgZXJyb3IgbWVzc2FnZSBhbmQgZXhpdCB0aGUgcHJvZ3JhbSB3aXRoIHN0YXR1cyAyLgorCitUaGlzIGZ1bmN0aW9uIGlzIGludGVuZGVkIHRvIGNvbXBsYWluIG9uIGNvbW1hbmQgbGluZSBlcnJvcnMsIGUuIGcuIHVua25vd24KK29wdGlvbnMsIGludmFsaWQgYXJndW1lbnRzLCBldGMuCisKKz1jdXQKKworc3ViIGNtZGxpbmVfZXJyb3IoOyQpIHsKKworICAgIG15ICRtZXNzYWdlID0gc2hpZnQoIEBfICk7CisKKyAgICBpZiAoIGRlZmluZWQoICRtZXNzYWdlICkgKSB7CisgICAgICAgIGlmICggc3Vic3RyKCAkbWVzc2FnZSwgLTEsIDEgKSBuZSAiXG4iICkgeworICAgICAgICAgICAgJG1lc3NhZ2UgLj0gIlxuIjsKKyAgICAgICAgfTsgIyBpZgorICAgIH0gZWxzZSB7CisgICAgICAgICRtZXNzYWdlID0gIiI7CisgICAgfTsgIyBpZgorICAgIFNURE9VVC0+Zmx1c2goKTsKKyAgICBkaWUgJG1lc3NhZ2UgLiAiVHJ5IC0taGVscCBvcHRpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4iOworCit9OyAjIHN1YiBjbWRsaW5lX2Vycm9yCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis9aGVhZDMgcnVudGltZV9lcnJvcgorCitCPFN5bm9wc2lzOj4KKworICAgIHJ1bnRpbWVfZXJyb3IoIEBtZXNzYWdlICkKKworQjxEZXNjcmlwdGlvbjo+CisKK1ByaW50IGVycm9yIG1lc3NhZ2UgYW5kIGV4aXRzIHRoZSBwcm9ncmFtIHdpdGggc3RhdHVzIDMuCisKK1RoaXMgZnVuY3Rpb24gaXMgaW50ZW5kZWQgdG8gY29tcGxhaW4gb24gcnVudGltZSBlcnJvcnMsIGUuIGcuCitkaXJlY3RvcmllcyB3aGljaCBhcmUgbm90IGZvdW5kLCBub24td3JpdGFibGUgZmlsZXMsIGV0Yy4KKworPWN1dAorCitzdWIgcnVudGltZV9lcnJvcihAKSB7CisKKyAgICBTVERPVVQtPmZsdXNoKCk7CisgICAgZGllIF9mb3JtYXRfbWVzc2FnZSggIngiLCBAXyApOworCit9OyAjIHN1YiBydW50aW1lX2Vycm9yCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis9aGVhZDMgcXVlc3Rpb24KKworQjxTeW5vcHNpczo+CisKKyAgICBxdWVzdGlvbiggJHByb21wdDsgJGFuc3dlciwgJGNob2ljZXMgICkKKworQjxEZXNjcmlwdGlvbjo+CisKK1ByaW50ICRwcm9tcCB0byB0aGUgc3RkZXJyLCBwcmVwZW5kaW5nIGl0IHdpdGggInF1ZXN0aW9uOiIgcHJlZml4LiBSZWFkIGEgbGluZSBmcm9tIHN0ZGluLCBjaG9wCisiXG4iIGZyb20gdGhlIGVuZCwgaXQgaXMgYW5zd2VyLgorCitJZiAkYW5zd2VyIGlzIGRlZmluZWQsIGl0IGlzIHRyZWF0ZWQgYXMgZmlyc3QgdXNlciBpbnB1dC4KKworSWYgJGNob2ljZXMgaXMgc3BlY2lmaWVkLCBpdCBjb3VsZCBiZSBhIHJlZ2V4cCBmb3IgdmFsaWRhdGluZyB1c2VyIGlucHV0LCBvciBhIHN0cmluZy4gSW4gbGF0dGVyCitjYXNlIGl0IGludGVycHJldGVkIGFzIGxpc3Qgb2YgY2hhcmFjdGVycywgYWNjZXB0YWJsZSAoY2FzZS1pbnNlbnNpdGl2ZSkgY2hvaWNlcy4gSWYgdXNlciBlbnRlcnMKK25vbi1hY2NlcHRhYmxlIGFuc3dlciwgcXVlc3Rpb24gY29udGludWUgYXNraW5nIHVudGlsIGFuc3dlciBpcyBhY2NlcHRhYmxlLgorSWYgJGNob2ljZXMgaXMgbm90IHNwZWNpZmllZCwgYW55IGFuc3dlciBpcyBhY2NlcHRhYmxlLgorCitJbiBjYXNlIG9mIGVuZC1vZi1maWxlIChvciBDdHJsK0QgcHJlc3NlZCBieSB1c2VyKSwgJGFuc3dlciBpcyBDPHVuZGVmPi4KKworQjxFeGFtcGxlczo+CisKKyAgICBteSAkYW5zd2VyOworICAgIHF1ZXN0aW9uKCAiU2F2ZSBmaWxlIFt5bl0/ICIsICRhbnN3ZXIsICJ5biIgKTsKKyAgICAgICAgIyBXZSBhY2NlcHRzIG9ubHkgInkiLCAiWSIsICJuIiwgb3IgIk4iLgorICAgIHF1ZXN0aW9uKCAiUHJlc3MgZW50ZXIgdG8gY29udGludWUgb3IgQ3RybCtDIHRvIGFib3J0Li4uIiApOworICAgICAgICAjIFdlIGFyZSBub3QgaW50ZXJlc3RlZCBpbiBhbnN3ZXIgdmFsdWUgLS0gaW4gY2FzZSBvZiBDdHJsK0MgdGhlIHNjcmlwdCB3aWxsIGJlIHRlcm1pbmF0ZWQsCisgICAgICAgICMgb3RoZXJ3aXNlIHdlIGNvbnRpbnVlIGV4ZWN1dGlvbi4KKyAgICBxdWVzdGlvbiggIkZpbGUgbmFtZT8gIiwgJGFuc3dlciApOworICAgICAgICAjIEFueSBhbnN3ZXIgaXMgYWNjZXB0YWJsZS4KKworPWN1dAorCitzdWIgcXVlc3Rpb24oJDtcJCQpIHsKKworICAgIG15ICRwcm9tcHQgID0gc2hpZnQoIEBfICk7CisgICAgbXkgJGFuc3dlciAgPSBzaGlmdCggQF8gKTsKKyAgICBteSAkY2hvaWNlcyA9IHNoaWZ0KCBAXyApOworICAgIG15ICRhICAgICAgID0gKCBkZWZpbmVkKCAkYW5zd2VyICkgPyAkJGFuc3dlciA6IHVuZGVmICk7CisKKyAgICBpZiAoIHJlZiggJGNob2ljZXMgKSBlcSAiUmVnZXhwIiApIHsKKyAgICAgICAgIyBJdCBpcyBhbHJlYWR5IGEgcmVndWxhciBleHByZXNzaW9uLCBkbyBub3RoaW5nLgorICAgIH0gZWxzaWYgKCBkZWZpbmVkKCAkY2hvaWNlcyApICkgeworICAgICAgICAjIENvbnZlcnQgc3RyaW5nIHRvIGEgcmVndWxhciBleHByZXNzaW9uLgorICAgICAgICAkY2hvaWNlcyA9IHFyL1tAeyBbIHF1b3RlbWV0YSggJGNob2ljZXMgKSBdIH1dL2k7CisgICAgfTsgIyBpZgorCisgICAgZm9yICggOyA7ICkgeworICAgICAgICBTVERFUlItPnByaW50KCBfZm9ybWF0X21lc3NhZ2UoICI/IiwgQHsgWyAkcHJvbXB0IF0gfSwgIm5vX2VvbCIgKSApOworICAgICAgICBTVERFUlItPmZsdXNoKCk7CisgICAgICAgIGlmICggZGVmaW5lZCggJGEgKSApIHsKKyAgICAgICAgICAgIFNURE9VVC0+cHJpbnQoICRhIC4gIlxuIiApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJGEgPSA8U1RESU4+OworICAgICAgICB9OyAjIGlmCisgICAgICAgIGlmICggbm90IGRlZmluZWQoICRhICkgKSB7CisgICAgICAgICAgICBsYXN0OworICAgICAgICB9OyAjIGlmCisgICAgICAgIGNob21wKCAkYSApOworICAgICAgICBpZiAoIG5vdCBkZWZpbmVkKCAkY2hvaWNlcyApIG9yICggJGEgPX4gbS9eJGNob2ljZXMkLyApICkgeworICAgICAgICAgICAgbGFzdDsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICAkYSA9IHVuZGVmOworICAgIH07ICMgZm9yZXZlcgorICAgIGlmICggZGVmaW5lZCggJGFuc3dlciApICkgeworICAgICAgICAkJGFuc3dlciA9ICRhOworICAgIH07ICMgaWYKKworfTsgIyBzdWIgcXVlc3Rpb24KKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgUmV0dXJucyB2b2x1bWUgcGFydCBvZiBwYXRoLgorc3ViIGdldF92b2woJCkgeworCisgICAgbXkgJHBhdGggPSBzaGlmdCggQF8gKTsKKyAgICBteSAoICR2b2wsIHVuZGVmLCB1bmRlZiApID0gRmlsZTo6U3BlYy0+c3BsaXRwYXRoKCAkcGF0aCApOworICAgIHJldHVybiAkdm9sOworCit9OyAjIHN1YiBnZXRfdm9sCisKKyMgUmV0dXJucyBkaXJlY3RvcnkgcGFydCBvZiBwYXRoLgorc3ViIGdldF9kaXIoJCkgeworCisgICAgbXkgJHBhdGggPSBGaWxlOjpTcGVjLT5jYW5vbnBhdGgoIHNoaWZ0KCBAXyApICk7CisgICAgbXkgKCAkdm9sLCAkZGlyLCB1bmRlZiApID0gRmlsZTo6U3BlYy0+c3BsaXRwYXRoKCAkcGF0aCApOworICAgIG15IEBkaXJzID0gRmlsZTo6U3BlYy0+c3BsaXRkaXIoICRkaXIgKTsKKyAgICBwb3AoIEBkaXJzICk7CisgICAgJGRpciA9IEZpbGU6OlNwZWMtPmNhdGRpciggQGRpcnMgKTsKKyAgICAkZGlyID0gRmlsZTo6U3BlYy0+Y2F0cGF0aCggJHZvbCwgJGRpciwgdW5kZWYgKTsKKyAgICByZXR1cm4gJGRpcjsKKworfTsgIyBzdWIgZ2V0X2RpcgorCisjIFJldHVybnMgZmlsZSBwYXJ0IG9mIHBhdGguCitzdWIgZ2V0X2ZpbGUoJCkgeworCisgICAgbXkgJHBhdGggPSBzaGlmdCggQF8gKTsKKyAgICBteSAoIHVuZGVmLCB1bmRlZiwgJGZpbGUgKSA9IEZpbGU6OlNwZWMtPnNwbGl0cGF0aCggJHBhdGggKTsKKyAgICByZXR1cm4gJGZpbGU7CisKK307ICMgc3ViIGdldF9maWxlCisKKyMgUmV0dXJucyBmaWxlIHBhcnQgb2YgcGF0aCB3aXRob3V0IGxhc3Qgc3VmZml4Lgorc3ViIGdldF9uYW1lKCQpIHsKKworICAgIG15ICRwYXRoID0gc2hpZnQoIEBfICk7CisgICAgbXkgKCB1bmRlZiwgdW5kZWYsICRmaWxlICkgPSBGaWxlOjpTcGVjLT5zcGxpdHBhdGgoICRwYXRoICk7CisgICAgJGZpbGUgPX4gc3tcLlteLl0qXHp9e307CisgICAgcmV0dXJuICRmaWxlOworCit9OyAjIHN1YiBnZXRfbmFtZQorCisjIFJldHVybnMgbGFzdCBzdWZmaXggb2YgZmlsZSBwYXJ0IG9mIHBhdGguCitzdWIgZ2V0X2V4dCgkKSB7CisKKyAgICBteSAkcGF0aCA9IHNoaWZ0KCBAXyApOworICAgIG15ICggdW5kZWYsIHVuZGVmLCAkZmlsZSApID0gRmlsZTo6U3BlYy0+c3BsaXRwYXRoKCAkcGF0aCApOworICAgIG15ICRleHQgPSAiIjsKKyAgICBpZiAoICRmaWxlID1+IG17KFwuW14uXSopXHp9ICkgeworICAgICAgICAkZXh0ID0gJDE7CisgICAgfTsgIyBpZgorICAgIHJldHVybiAkZXh0OworCit9OyAjIHN1YiBnZXRfZXh0CisKK3N1YiBjYXRfZmlsZShAKSB7CisKKyAgICBteSAkcGF0aCA9IHNoaWZ0KCBAXyApOworICAgIG15ICRmaWxlID0gcG9wKCBAXyApOworICAgIG15IEBkaXJzID0gQF87CisKKyAgICBteSAoICR2b2wsICRkaXJzICkgPSBGaWxlOjpTcGVjLT5zcGxpdHBhdGgoICRwYXRoLCAibm9fZmlsZSIgKTsKKyAgICBAZGlycyA9ICggRmlsZTo6U3BlYy0+c3BsaXRkaXIoICRkaXJzICksIEBkaXJzICk7CisgICAgJGRpcnMgPSBGaWxlOjpTcGVjLT5jYXRkaXIoIEBkaXJzICk7CisgICAgJHBhdGggPSBGaWxlOjpTcGVjLT5jYXRwYXRoKCAkdm9sLCAkZGlycywgJGZpbGUgKTsKKworICAgIHJldHVybiAkcGF0aDsKKworfTsgIyBzdWIgY2F0X2ZpbGUKKworc3ViIGNhdF9kaXIoQCkgeworCisgICAgbXkgJHBhdGggPSBzaGlmdCggQF8gKTsKKyAgICBteSBAZGlycyA9IEBfOworCisgICAgbXkgKCAkdm9sLCAkZGlycyApID0gRmlsZTo6U3BlYy0+c3BsaXRwYXRoKCAkcGF0aCwgIm5vX2ZpbGUiICk7CisgICAgQGRpcnMgPSAoIEZpbGU6OlNwZWMtPnNwbGl0ZGlyKCAkZGlycyApLCBAZGlycyApOworICAgICRkaXJzID0gRmlsZTo6U3BlYy0+Y2F0ZGlyKCBAZGlycyApOworICAgICRwYXRoID0gRmlsZTo6U3BlYy0+Y2F0cGF0aCggJHZvbCwgJGRpcnMsICIiICk7CisKKyAgICByZXR1cm4gJHBhdGg7CisKK307ICMgc3ViIGNhdF9kaXIKKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIEZpbGUgYW5kIGRpcmVjdG9yeSBtYW5pcHVsYXRpb24gc3Vicm91dGluZXMuCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworPWhlYWQyIEZpbGUgYW5kIGRpcmVjdG9yeSBtYW5pcHVsYXRpb24gc3Vicm91dGluZXMuCisKKz1vdmVyCisKKz1jdXQKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKz1pdGVtIEM8d2hpY2goICRmaWxlLCBAb3B0aW9ucyApPgorCitTZWFyY2hlcyBmb3Igc3BlY2lmaWVkIGV4ZWN1dGFibGUgZmlsZSBpbiB0aGUgKHNwZWNpZmllZCkgZGlyZWN0b3JpZXMuCitSYWlzZXMgYSBydW50aW1lIGVyb3JvciBpZiBubyBleGVjdXRhYmxlIGZpbGUgZm91bmQuIFJldHVybnMgYSBmdWxsIHBhdGggb2YgZm91bmQgZXhlY3V0YWJsZShzKS4KKworT3B0aW9uczoKKworPW92ZXIKKworPWl0ZW0gQzwtYWxsPiA9RTxndD4gSTxib29sPgorCitEbyBub3Qgc3RvcCBvbiB0aGUgZmlyc3QgZm91bmQgZmlsZS4gTm90ZSwgdGhhdCBsaXN0IG9mIGZ1bGwgcGF0aHMgaXMgcmV0dXJuZWQgaW4gdGhpcyBjYXNlLgorCis9aXRlbSBDPC1kaXJzPiA9RTxndD4gSTxyZWZfdG9fYXJyYXk+CisKK1NwZWNpZnkgZGlyZWN0b3J5IGxpc3QgdG8gc2VhcmNoIHRocm91Z2guIElmIG9wdGlvbiBpcyBub3QgcGFzc2VkLCBQQVRIIGVudmlyb25tZW50IHZhcmlhYmxlCitpcyB1c2VkIGZvciBkaXJlY3RvcnkgbGlzdC4KKworPWl0ZW0gQzwtZXhlYz4gPUU8Z3Q+IEk8Ym9vbD4KKworV2hldGhlciBjaGVjayBmb3IgZXhlY3V0YWJsZSBmaWxlcyBvciBub3QuIEJ5IGRlZmF1bHQsIEM8d2hpY2g+IHNlYXJjaGVzIGV4ZWN1dGFibGUgZmlsZXMuCitIb3dldmVyLCBvbiBDeWd3aW4gZXhlY3V0YWJsZSBjaGVjayBuZXZlciBwZXJmb3JtZWQuCisKKz1iYWNrCisKK0V4YW1wbGVzOgorCitMb29rIGZvciAiZWNobyIgaW4gdGhlIGRpcmVjdG9yaWVzIHNwZWNpZmllZCBpbiBQQVRIOgorCisgICAgbXkgJGVjaG8gPSB3aGljaCggImVjaG8iICk7CisKK0xvb2sgZm9yIGFsbCBvY2N1cmVuc2VzIG9mICJjcCIgaW4gdGhlIFBBVEg6CisKKyAgICBteSBAY3BzID0gd2hpY2goICJjcCIsIC1hbGwgPT4gMSApOworCitMb29rIGZvciB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiAiaWNjIiBpbiB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yaWVzOgorCisgICAgbXkgJGljYyA9IHdoaWNoKCAiaWNjIiwgLWRpcnMgPT4gWyAiLiIsICIvdXNyL2xvY2FsL2JpbiIsICIvdXNyL2JpbiIsICIvYmluIiBdICk7CisKK0xvb2sgZm9yIHRoZSB0aGUgQzxvbXBfbGliLmY+IGZpbGU6CisKKyAgICBteSBAb21wX2xpYiA9IHdoaWNoKCAib21wX2xpYi5mIiwgLWFsbCA9PiAxLCAtZXhlYyA9PiAwLCAtZGlycyA9PiBbIEBpbmNsdWRlIF0gKTsKKworPWN1dAorCitzdWIgd2hpY2goJEApIHsKKworICAgIG15ICRmaWxlID0gc2hpZnQoIEBfICk7CisgICAgbXkgJW9wdHMgPSBAXzsKKworICAgIGNoZWNrX29wdHMoICVvcHRzLCBbIHF3KCAtYWxsIC1kaXJzIC1leGVjICkgXSApOworICAgIGlmICggJG9wdHN7IC1hbGwgfSBhbmQgbm90IHdhbnRhcnJheSgpICkgeworICAgICAgICBsb2NhbCAkQ2FycDo6Q2FycExldmVsID0gMTsKKyAgICAgICAgQ2FycDo6Y2x1Y2soICJgLWFsbCcgb3B0aW9uIHBhc3NlZCB0byBgd2hpY2gnIGJ1dCBsaXN0IGlzIG5vdCBleHBlY3RlZCIgKTsKKyAgICB9OyAjIGlmCisgICAgaWYgKCBub3QgZGVmaW5lZCggJG9wdHN7IC1leGVjIH0gKSApIHsKKyAgICAgICAgJG9wdHN7IC1leGVjIH0gPSAxOworICAgIH07ICMgaWYKKworICAgIG15ICRkaXJzID0gKCBleGlzdHMoICRvcHRzeyAtZGlycyB9ICkgPyAkb3B0c3sgLWRpcnMgfSA6IFsgRmlsZTo6U3BlYy0+cGF0aCgpIF0gKTsKKyAgICBteSBAZm91bmQ7CisKKyAgICBteSBAZXh0cyA9ICggIiIgKTsKKyAgICBpZiAoICReTyBlcSAiTVNXaW4zMiIgYW5kICRvcHRzeyAtZXhlYyB9ICkgeworICAgICAgICBpZiAoIGRlZmluZWQoICRFTlZ7IFBBVEhFWFQgfSApICkgeworICAgICAgICAgICAgcHVzaCggQGV4dHMsIHNwbGl0KCAiOyIsICRFTlZ7IFBBVEhFWFQgfSApICk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAjIElmIFBBVEhFWFQgZG9lcyBub3QgZXhpc3QsIHVzZSBkZWZhdWx0IHZhbHVlLgorICAgICAgICAgICAgcHVzaCggQGV4dHMsIHF3eyAuQ09NIC5FWEUgLkJBVCAuQ01EIH0gKTsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgaWYKKworICAgIGxvb3A6CisgICAgZm9yZWFjaCBteSAkZGlyICggQCRkaXJzICkgeworICAgICAgICBmb3JlYWNoIG15ICRleHQgKCBAZXh0cyApIHsKKyAgICAgICAgICAgIG15ICRwYXRoID0gRmlsZTo6U3BlYy0+Y2F0ZmlsZSggJGRpciwgJGZpbGUgLiAkZXh0ICk7CisgICAgICAgICAgICBpZiAoIC1lICRwYXRoICkgeworICAgICAgICAgICAgICAgICMgRXhlY3V0YWJsZSBiaXQgaXMgbm90IHJlbGlhYmxlIG9uIEN5Z3dpbiwgZG8gbm90IGNoZWNrIGl0LgorICAgICAgICAgICAgICAgIGlmICggbm90ICRvcHRzeyAtZXhlYyB9IG9yIC14ICRwYXRoIG9yICReTyBlcSAiY3lnd2luIiApIHsKKyAgICAgICAgICAgICAgICAgICAgcHVzaCggQGZvdW5kLCAkcGF0aCApOworICAgICAgICAgICAgICAgICAgICBpZiAoIG5vdCAkb3B0c3sgLWFsbCB9ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgbGFzdCBsb29wOworICAgICAgICAgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICB9OyAjIGZvcmVhY2ggJGV4dAorICAgIH07ICMgZm9yZWFjaCAkZGlyCisKKyAgICBpZiAoIG5vdCBAZm91bmQgKSB7CisgICAgICAgICMgVEJEOiBXZSBuZWVkIHRvIGludHJvZHVjZSBhbiBvcHRpb24gZm9yIGNvbmRpdGlvbmFsIGVuYWJsaW5nIHRoaXMgZXJyb3IuCisgICAgICAgICMgcnVudGltZV9lcnJvciggIkNvdWxkIG5vdCBmaW5kIFwiJGZpbGVcIiBleGVjdXRhYmxlIGZpbGUgaW4gUEFUSC4iICk7CisgICAgfTsgIyBpZgorICAgIGlmICggQGZvdW5kID4gMSApIHsKKyAgICAgICAgIyBUQkQ6IElzc3VlIGEgd2FybmluZz8KKyAgICB9OyAjIGlmCisKKyAgICBpZiAoICRvcHRzeyAtYWxsIH0gKSB7CisgICAgICAgIHJldHVybiBAZm91bmQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuICRmb3VuZFsgMCBdOworICAgIH07ICMgaWYKKworfTsgIyBzdWIgd2hpY2gKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKz1pdGVtIEM8YWJzX3BhdGgoICRwYXRoLCAkYmFzZSApPgorCitSZXR1cm4gYWJzb2x1dGUgcGF0aCBmb3IgYW4gYXJndW1lbnQuCisKK01vc3Qgb2YgdGhlIHdvcmsgaXMgZG9uZSBieSBDPEZpbGU6OlNwZWMtPnJlbDJhYnMoKT4uIEM8YWJzX3BhdGgoKT4gYWRkaXRpb25hbGx5IGNvbGxhcHNlcworQzxkaXIxLy4uL2RpcjI+IHRvIEM8ZGlyMj4uCisKK0l0IGlzIG5vdCBzbyBuYWl2ZSBhbmQgbWFkZSBpbnRlbnRpb25hbGx5LiBGb3IgZXhhbXBsZSBvbiBMaW51eCogT1MgaW4gQmFzaCBpZiBGPGxpbmsvPiBpcyBhIHN5bWJvbGljCitsaW5rIHRvIGRpcmVjdG9yeSBGPHNvbWVfZGlyLz4KKworICAgICQgY2QgbGluaworICAgICQgY2QgLi4KKworYnJpbmdzIHlvdSBiYWNrIHRvIEY8bGluay8+J3MgcGFyZW50LCBub3QgdG8gcGFyZW50IG9mIEY8c29tZV9kaXIvPiwKKworPWN1dAorCitzdWIgYWJzX3BhdGgoJDskKSB7CisKKyAgICBteSAoICRwYXRoLCAkYmFzZSApID0gQF87CisgICAgJHBhdGggPSBGaWxlOjpTcGVjLT5yZWwyYWJzKCAkcGF0aCwgKCBkZWZpbmVkKCAkYmFzZSApID8gJGJhc2UgOiAkRU5WeyBQV0QgfSApICk7CisgICAgbXkgKCAkdm9sLCAkZGlyLCAkZmlsZSApID0gRmlsZTo6U3BlYy0+c3BsaXRwYXRoKCAkcGF0aCApOworICAgIHdoaWxlICggJGRpciA9fiBzey8oPyFcLlwuKVteL10qL1wuXC4oPzovfFx6KX17L30gKSB7CisgICAgfTsgIyB3aGlsZQorICAgICRwYXRoID0gRmlsZTo6U3BlYy0+Y2Fub25wYXRoKCBGaWxlOjpTcGVjLT5jYXRwYXRoKCAkdm9sLCAkZGlyLCAkZmlsZSApICk7CisgICAgcmV0dXJuICRwYXRoOworCit9OyAjIHN1YiBhYnNfcGF0aAorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworPWl0ZW0gQzxyZWxfcGF0aCggJHBhdGgsICRiYXNlICk+CisKK1JldHVybiByZWxhdGl2ZSBwYXRoIGZvciBhbiBhcmd1bWVudC4KKworPWN1dAorCitzdWIgcmVsX3BhdGgoJDskKSB7CisKKyAgICBteSAoICRwYXRoLCAkYmFzZSApID0gQF87CisgICAgJHBhdGggPSBGaWxlOjpTcGVjLT5hYnMycmVsKCBhYnNfcGF0aCggJHBhdGggKSwgJGJhc2UgKTsKKyAgICByZXR1cm4gJHBhdGg7CisKK307ICMgc3ViIHJlbF9wYXRoCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis9aXRlbSBDPHJlYWxfcGF0aCggJGRpciApPgorCitSZXR1cm4gcmVhbCBhYnNvbHV0ZSBwYXRoIGZvciBhbiBhcmd1bWVudC4gSW4gdGhlIHJlc3VsdCBhbGwgcmVsYXRpdmUgY29tcG9uZW50cyAoRjwuPiBhbmQgRjwuLj4pCithbmQgVTxzeW1ib2xpYyBsaW5rcyBhcmUgcmVzb2x2ZWQ+LgorCitJbiBtb3N0IGNhc2VzIGl0IGlzIG5vdCB3aGF0IHlvdSB3YW50LiBDb25zaWRlciB1c2luZyBDPGFic19wYXRoPiBmaXJzdC4KKworQzxhYnNfcGF0aD4gZnVuY3Rpb24gZnJvbSBCPEN3ZD4gbW9kdWxlIHdvcmtzIHdpdGggZGlyZWN0b3JpZXMgb25seS4gVGhpcyBmdW5jdGlvbiB3b3JrcyB3aXRoIGZpbGVzCithcyB3ZWxsLiBCdXQsIGlmIGZpbGUgaXMgYSBzeW1ib2xpYyBsaW5rLCBmdW5jdGlvbiBkb2VzIG5vdCByZXNvbHZlIGl0ICh5ZXQpLgorCitUaGUgZnVuY3Rpb24gdXNlcyBDPHJ1bnRpbWVfZXJyb3I+IHRvIHJhaXNlIGFuIGVycm9yIGlmIHNvbWV0aGluZyB3cm9uZy4KKworPWN1dAorCitzdWIgcmVhbF9wYXRoKCQpIHsKKworICAgIG15ICRvcmlnX3BhdGggPSBzaGlmdCggQF8gKTsKKyAgICBteSAkcmVhbF9wYXRoOworICAgIG15ICRtZXNzYWdlID0gIiI7CisgICAgaWYgKCBub3QgLWUgJG9yaWdfcGF0aCApIHsKKyAgICAgICAgJG1lc3NhZ2UgPSAiXCIkb3JpZ19wYXRoXCIgZG9lcyBub3QgZXhpc3RzIjsKKyAgICB9IGVsc2UgeworICAgICAgICAjIEN3ZDo6YWJzX3BhdGggZG9lcyBub3Qgd29yayB3aXRoIGZpbGVzLCBzbyBpbiB0aGlzIGNhc2Ugd2Ugc2hvdWxkIGhhbmRsZSBmaWxlIHNlcGFyYXRlbHkuCisgICAgICAgIG15ICRmaWxlOworICAgICAgICBpZiAoIG5vdCAtZCAkb3JpZ19wYXRoICkgeworICAgICAgICAgICAgKCBteSAkdm9sLCBteSAkZGlyLCAkZmlsZSApID0gRmlsZTo6U3BlYy0+c3BsaXRwYXRoKCBGaWxlOjpTcGVjLT5yZWwyYWJzKCAkb3JpZ19wYXRoICkgKTsKKyAgICAgICAgICAgICRvcmlnX3BhdGggPSBGaWxlOjpTcGVjLT5jYXRwYXRoKCAkdm9sLCAkZGlyICk7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgeworICAgICAgICAgICAgbG9jYWwgJFNJR3sgX19XQVJOX18gfSA9IHN1YiB7ICRtZXNzYWdlID0gJF9bIDAgXTsgfTsKKyAgICAgICAgICAgICRyZWFsX3BhdGggPSBDd2Q6OmFic19wYXRoKCAkb3JpZ19wYXRoICk7CisgICAgICAgIH07CisgICAgICAgIGlmICggZGVmaW5lZCggJGZpbGUgKSApIHsKKyAgICAgICAgICAgICRyZWFsX3BhdGggPSBGaWxlOjpTcGVjLT5jYXRmaWxlKCAkcmVhbF9wYXRoLCAkZmlsZSApOworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBpZgorICAgIGlmICggbm90IGRlZmluZWQoICRyZWFsX3BhdGggKSBvciAkbWVzc2FnZSBuZSAiIiApIHsKKyAgICAgICAgJG1lc3NhZ2UgPX4gcy9ec3RhdFwoLipcKTogKC4qKVxzK2F0IC4qPyBsaW5lIFxkK1xzKlx6LyQxLzsKKyAgICAgICAgcnVudGltZV9lcnJvciggIkNvdWxkIG5vdCBmaW5kIHJlYWwgcGF0aCBmb3IgXCIkb3JpZ19wYXRoXCIiIC4gKCAkbWVzc2FnZSBuZSAiIiA/ICI6ICRtZXNzYWdlIiA6ICIiICkgKTsKKyAgICB9OyAjIGlmCisgICAgcmV0dXJuICRyZWFsX3BhdGg7CisKK307ICMgc3ViIHJlYWxfcGF0aAorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworPWl0ZW0gQzxtYWtlX2RpciggJGRpciwgQG9wdGlvbnMgKT4KKworTWFrZSBhIGRpcmVjdG9yeS4KKworVGhpcyBmdW5jdGlvbiBtYWtlcyBhIGRpcmVjdG9yeS4gSWYgbmVjZXNzYXJ5LCBtb3JlIHRoYW4gb25lIGxldmVsIGNhbiBiZSBjcmVhdGVkLgorSWYgZGlyZWN0b3J5IGV4aXN0cywgd2FybmluZyBpc3N1ZXMgKHRoZSBzY3JpcHQgYmVoYXZpb3IgZGVwZW5kcyBvbiB2YWx1ZSBvZgorQzwtd2FybmluZ19sZXZlbD4gb3B0aW9uKS4gSWYgZGlyZWN0b3J5IGNyZWF0aW9uIGZhaWxzIG9yIEM8JGRpcj4gZXhpc3RzIGJ1dCBpdCBpcyBub3QgYQorZGlyZWN0b3J5LCBlcnJvciBpc3NzdWVzLgorCitPcHRpb25zOgorCis9b3ZlcgorCis9aXRlbSBDPC1tb2RlPgorCitUaGUgbnVtZXJpYyBtb2RlIGZvciBuZXcgZGlyZWN0b3JpZXMsIDA3NTAgKHJ3eHIteC0tLSkgYnkgZGVmYXVsdC4KKworPWJhY2sKKworPWN1dAorCitzdWIgbWFrZV9kaXIoJEApIHsKKworICAgIG15ICRkaXIgICAgPSBzaGlmdCggQF8gKTsKKyAgICBteSAlb3B0cyAgID0KKyAgICAgICAgdmFsaWRhdGUoCisgICAgICAgICAgICBwYXJhbXMgPT4gXEBfLAorICAgICAgICAgICAgc3BlYyA9PiB7CisgICAgICAgICAgICAgICAgcGFyZW50cyA9PiB7IHR5cGUgPT4gImJvb2xlYW4iLCBkZWZhdWx0ID0+IDEgICAgfSwKKyAgICAgICAgICAgICAgICBtb2RlICAgID0+IHsgdHlwZSA9PiAic2NhbGFyIiwgIGRlZmF1bHQgPT4gMDc3NyB9LAorICAgICAgICAgICAgfSwKKyAgICAgICAgKTsKKworICAgIG15ICRwcmVmaXggPSAiQ291bGQgbm90IGNyZWF0ZSBkaXJlY3RvcnkgXCIkZGlyXCIiOworCisgICAgaWYgKCAtZSAkZGlyICkgeworICAgICAgICBpZiAoIC1kICRkaXIgKSB7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBydW50aW1lX2Vycm9yKCAiJHByZWZpeDogaXQgZXhpc3RzLCBidXQgbm90IGEgZGlyZWN0b3J5LiIgKTsKKyAgICAgICAgfTsgIyBpZgorICAgIH0gZWxzZSB7CisgICAgICAgIGV2YWwgeworICAgICAgICAgICAgRmlsZTo6UGF0aDo6bWtwYXRoKCAkZGlyLCAwLCAkb3B0c3sgbW9kZSB9ICk7CisgICAgICAgIH07ICMgZXZhbAorICAgICAgICBpZiAoICRAICkgeworICAgICAgICAgICAgJEAgPX4gc3tccythdCAoPzpbYS16QS1aMC05IC9fLl0qLyk/dG9vbHNcLnBtIGxpbmUgXGQrXHMqfXt9OworICAgICAgICAgICAgcnVudGltZV9lcnJvciggIiRwcmVmaXg6ICRAIiApOworICAgICAgICB9OyAjIGlmCisgICAgICAgIGlmICggbm90IC1kICRkaXIgKSB7ICMgSnVzdCBpbiBjYXNlLCBjaGVjayBpdCBvbmUgbW9yZSB0aW1lLi4uCisgICAgICAgICAgICBydW50aW1lX2Vycm9yKCAiJHByZWZpeC4iICk7CisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGlmCisKK307ICMgc3ViIG1ha2VfZGlyCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis9aXRlbSBDPGNvcHlfZGlyKCAkc3JjX2RpciwgJGRzdF9kaXIsIEBvcHRpb25zICk+CisKK0NvcHkgZGlyZWN0b3J5IHJlY3Vyc2l2ZWx5LgorCitUaGlzIGZ1bmN0aW9uIGNvcGllcyBhIGRpcmVjdG9yeSByZWN1cnNpdmVseS4KK0lmIHNvdXJjZSBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3Qgb3Igbm90IGEgZGlyZWN0b3J5LCBlcnJvciBpc3N1ZXMuCisKK09wdGlvbnM6CisKKz1vdmVyCisKKz1pdGVtIEM8LW92ZXJ3cml0ZT4KKworT3ZlcndyaXRlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSwgaWYgaXQgZXhpc3RzLgorCis9YmFjaworCis9Y3V0CisKK3N1YiBjb3B5X2RpcigkJEApIHsKKworICAgIG15ICRzcmMgID0gc2hpZnQoIEBfICk7CisgICAgbXkgJGRzdCAgPSBzaGlmdCggQF8gKTsKKyAgICBteSAlb3B0cyA9IEBfOworICAgIG15ICRwcmVmaXggPSAiQ291bGQgbm90IGNvcHkgZGlyZWN0b3J5IFwiJHNyY1wiIHRvIFwiJGRzdFwiIjsKKworICAgIGlmICggbm90IC1lICRzcmMgKSB7CisgICAgICAgIHJ1bnRpbWVfZXJyb3IoICIkcHJlZml4OiBcIiRzcmNcIiBkb2VzIG5vdCBleGlzdC4iICk7CisgICAgfTsgIyBpZgorICAgIGlmICggbm90IC1kICRzcmMgKSB7CisgICAgICAgIHJ1bnRpbWVfZXJyb3IoICIkcHJlZml4OiBcIiRzcmNcIiBpcyBub3QgYSBkaXJlY3RvcnkuIiApOworICAgIH07ICMgaWYKKyAgICBpZiAoIC1lICRkc3QgKSB7CisgICAgICAgIGlmICggLWQgJGRzdCApIHsKKyAgICAgICAgICAgIGlmICggJG9wdHN7IC1vdmVyd3JpdGUgfSApIHsKKyAgICAgICAgICAgICAgICBkZWxfZGlyKCAkZHN0ICk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJ1bnRpbWVfZXJyb3IoICIkcHJlZml4OiBcIiRkc3RcIiBhbHJlYWR5IGV4aXN0cy4iICk7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBydW50aW1lX2Vycm9yKCAiJHByZWZpeDogXCIkZHN0XCIgaXMgbm90IGEgZGlyZWN0b3J5LiIgKTsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgaWYKKworICAgIGV4ZWN1dGUoIFsgImNwIiwgIi1SIiwgJHNyYywgJGRzdCBdICk7CisKK307ICMgc3ViIGNvcHlfZGlyCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis9aXRlbSBDPG1vdmVfZGlyKCAkc3JjX2RpciwgJGRzdF9kaXIsIEBvcHRpb25zICk+CisKK01vdmUgZGlyZWN0b3J5LgorCitPcHRpb25zOgorCis9b3ZlcgorCis9aXRlbSBDPC1vdmVyd3JpdGU+CisKK092ZXJ3cml0ZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnksIGlmIGl0IGV4aXN0cy4KKworPWJhY2sKKworPWN1dAorCitzdWIgbW92ZV9kaXIoJCRAKSB7CisKKyAgICBteSAkc3JjICA9IHNoaWZ0KCBAXyApOworICAgIG15ICRkc3QgID0gc2hpZnQoIEBfICk7CisgICAgbXkgJW9wdHMgPSBAXzsKKyAgICBteSAkcHJlZml4ID0gIkNvdWxkIG5vdCBjb3B5IGRpcmVjdG9yeSBcIiRzcmNcIiB0byBcIiRkc3RcIiI7CisKKyAgICBpZiAoIG5vdCAtZSAkc3JjICkgeworICAgICAgICBydW50aW1lX2Vycm9yKCAiJHByZWZpeDogXCIkc3JjXCIgZG9lcyBub3QgZXhpc3QuIiApOworICAgIH07ICMgaWYKKyAgICBpZiAoIG5vdCAtZCAkc3JjICkgeworICAgICAgICBydW50aW1lX2Vycm9yKCAiJHByZWZpeDogXCIkc3JjXCIgaXMgbm90IGEgZGlyZWN0b3J5LiIgKTsKKyAgICB9OyAjIGlmCisgICAgaWYgKCAtZSAkZHN0ICkgeworICAgICAgICBpZiAoIC1kICRkc3QgKSB7CisgICAgICAgICAgICBpZiAoICRvcHRzeyAtb3ZlcndyaXRlIH0gKSB7CisgICAgICAgICAgICAgICAgZGVsX2RpciggJGRzdCApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBydW50aW1lX2Vycm9yKCAiJHByZWZpeDogXCIkZHN0XCIgYWxyZWFkeSBleGlzdHMuIiApOworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcnVudGltZV9lcnJvciggIiRwcmVmaXg6IFwiJGRzdFwiIGlzIG5vdCBhIGRpcmVjdG9yeS4iICk7CisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGlmCisKKyAgICBleGVjdXRlKCBbICJtdiIsICRzcmMsICRkc3QgXSApOworCit9OyAjIHN1YiBtb3ZlX2RpcgorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworPWl0ZW0gQzxjbGVhbl9kaXIoICRkaXIsIEBvcHRpb25zICk+CisKK0NsZWFuIGEgZGlyZWN0b3J5OiBkZWxldGUgYWxsIHRoZSBlbnRyaWVzIChyZWN1cnNpdmVseSksIGJ1dCBsZWF2ZSB0aGUgZGlyZWN0b3J5LgorCitPcHRpb25zOgorCis9b3ZlcgorCis9aXRlbSBDPC1mb3JjZT4gPT4gYm9vbAorCitJZiBhIGRpcmVjdG9yeSBpcyBub3Qgd3JpdGFibGUsIHRyeSB0byBjaGFuZ2UgcGVybWlzc2lvbnMgZmlyc3QsIHRoZW4gY2xlYW4gaXQuCisKKz1pdGVtIEM8LXNraXA+ID0+IHJlZ2V4cAorCitSZWdleHAuIElmIGEgZGlyZWN0b3J5IGVudHJ5IG1hY2hlZCB0aGUgcmVnZXhwLCBpdCBpcyBza2lwcGVkLCBub3QgZGVsZXRlZC4gKEFzIGEgc3Vic2VxdWVuY2UsCithIGRpcmVjdG9yeSBjb250YWluaW5nIHNraXBwZWQgZW50cmllcyBpcyBub3QgZGVsZXRlZC4pCisKKz1iYWNrCisKKz1jdXQKKworc3ViIF9jbGVhbl9kaXIoJCk7CisKK3N1YiBfY2xlYW5fZGlyKCQpIHsKKyAgICBvdXIgJV9jbGVhbl9kaXJfb3B0czsKKyAgICBteSAoICRkaXIgKSA9IEBfOworICAgIG15ICRza2lwICAgID0gJF9jbGVhbl9kaXJfb3B0c3sgc2tpcCB9OyAgICAjIFJlZ2V4cC4KKyAgICBteSAkc2tpcHBlZCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBOdW1iZXIgb2Ygc2tpcHBlZCBmaWxlcy4KKyAgICBteSAkcHJlZml4ICA9ICJDbGVhbmluZyBgJGRpcicgZmFpbGVkOiI7CisgICAgbXkgQHN0YXQgICAgPSBzdGF0KCAkZGlyICk7CisgICAgbXkgJG1vZGUgICAgPSAkc3RhdFsgMiBdOworICAgIGlmICggbm90IEBzdGF0ICkgeworICAgICAgICBydW50aW1lX2Vycm9yKCAkcHJlZml4LCAiQ2Fubm90IHN0YXQgYCRkaXInOiAkISIgKTsKKyAgICB9OyAjIGlmCisgICAgaWYgKCBub3QgLWQgXyApIHsKKyAgICAgICAgcnVudGltZV9lcnJvciggJHByZWZpeCwgIkl0IGlzIG5vdCBhIGRpcmVjdG9yeS4iICk7CisgICAgfTsgIyBpZgorICAgIGlmICggbm90IC13IF8gKSB7ICAgICAgICAjIERpcmVjdG9yeSBpcyBub3Qgd3JpdGFibGUuCisgICAgICAgIGlmICggbm90IC1vIF8gb3Igbm90ICRfY2xlYW5fZGlyX29wdHN7IGZvcmNlIH0gKSB7CisgICAgICAgICAgICBydW50aW1lX2Vycm9yKCAkcHJlZml4LCAiRGlyZWN0b3J5IGlzIG5vdCB3cml0YWJsZS4iICk7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgIyBEaXJlY3RvcnkgaXMgbm90IHdyaXRhYmxlIGJ1dCBtaW5lLiBUcnkgdG8gY2hhbmdlIHBlcm1pc3Npb25zLgorICAgICAgICBjaG1vZCggJG1vZGUgfCBTX0lXVVNSLCAkZGlyICkKKyAgICAgICAgICAgIG9yIHJ1bnRpbWVfZXJyb3IoICRwcmVmaXgsICJDYW5ub3QgbWFrZSBkaXJlY3Rvcnkgd3JpdGFibGU6ICQhIiApOworICAgIH07ICMgaWYKKyAgICBteSAkaGFuZGxlICAgPSBJTzo6RGlyLT5uZXcoICRkaXIgKSBvciBydW50aW1lX2Vycm9yKCAkcHJlZml4LCAiQ2Fubm90IHJlYWQgZGlyZWN0b3J5OiAkISIgKTsKKyAgICBteSBAZW50cmllcyAgPSBGaWxlOjpTcGVjLT5ub191cHdhcmRzKCAkaGFuZGxlLT5yZWFkKCkgKTsKKyAgICAkaGFuZGxlLT5jbG9zZSgpIG9yIHJ1bnRpbWVfZXJyb3IoICRwcmVmaXgsICJDYW5ub3QgcmVhZCBkaXJlY3Rvcnk6ICQhIiApOworICAgIGZvcmVhY2ggbXkgJGVudHJ5ICggQGVudHJpZXMgKSB7CisgICAgICAgIG15ICRwYXRoID0gY2F0X2ZpbGUoICRkaXIsICRlbnRyeSApOworICAgICAgICBpZiAoIGRlZmluZWQoICRza2lwICkgYW5kICRlbnRyeSA9fiAkc2tpcCApIHsKKyAgICAgICAgICAgICsrICRza2lwcGVkOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCAtbCAkcGF0aCApIHsKKyAgICAgICAgICAgICAgICB1bmxpbmsoICRwYXRoICkgb3IgcnVudGltZV9lcnJvciggJHByZWZpeCwgIkNhbm5vdCBkZWxldGUgc3ltbGluayBgJHBhdGgnOiAkISIgKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3RhdCggJHBhdGggKSBvciBydW50aW1lX2Vycm9yKCAkcHJlZml4LCAiQ2Fubm90IHN0YXQgYCRwYXRoJzogJCEgIiApOworICAgICAgICAgICAgICAgIGlmICggLWYgXyApIHsKKyAgICAgICAgICAgICAgICAgICAgZGVsX2ZpbGUoICRwYXRoICk7CisgICAgICAgICAgICAgICAgfSBlbHNpZiAoIC1kIF8gKSB7CisgICAgICAgICAgICAgICAgICAgIG15ICRyYyA9IF9jbGVhbl9kaXIoICRwYXRoICk7CisgICAgICAgICAgICAgICAgICAgIGlmICggJHJjID09IDAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBybWRpciggJHBhdGggKSBvciBydW50aW1lX2Vycm9yKCAkcHJlZml4LCAiQ2Fubm90IGRlbGV0ZSBkaXJlY3RvcnkgYCRwYXRoJzogJCEiICk7CisgICAgICAgICAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgICAgICAgICAgJHNraXBwZWQgKz0gJHJjOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVfZXJyb3IoICRwcmVmaXgsICJgJHBhdGgnIGlzIG5laXRoZXIgYSBmaWxlIG5vciBhIGRpcmVjdG9yeS4iICk7CisgICAgICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBmb3JlYWNoCisgICAgcmV0dXJuICRza2lwcGVkOworfTsgIyBzdWIgX2NsZWFuX2RpcgorCisKK3N1YiBjbGVhbl9kaXIoJEApIHsKKyAgICBteSAkZGlyICA9IHNoaWZ0KCBAXyApOworICAgIG91ciAlX2NsZWFuX2Rpcl9vcHRzOworICAgIGxvY2FsICVfY2xlYW5fZGlyX29wdHMgPQorICAgICAgICB2YWxpZGF0ZSgKKyAgICAgICAgICAgIHBhcmFtcyA9PiBcQF8sCisgICAgICAgICAgICBzcGVjID0+IHsKKyAgICAgICAgICAgICAgICBza2lwICA9PiB7IHR5cGUgPT4gInJlZ2V4cHJlZiIgfSwKKyAgICAgICAgICAgICAgICBmb3JjZSA9PiB7IHR5cGUgPT4gImJvb2xlYW4iICAgfSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICk7CisgICAgbXkgJHNraXBwZWQgPSBfY2xlYW5fZGlyKCAkZGlyICk7CisgICAgcmV0dXJuICRza2lwcGVkOworfTsgIyBzdWIgY2xlYW5fZGlyCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKz1pdGVtIEM8ZGVsX2RpciggJGRpciwgQG9wdGlvbnMgKT4KKworRGVsZXRlIGEgZGlyZWN0b3J5IHJlY3Vyc2l2ZWx5LgorCitUaGlzIGZ1bmN0aW9uIGRlbGV0ZXMgYSBkaXJlY3RvcnkuIElmIGRpcmVjdG9yeSBjYW4gbm90IGJlIGRlbGV0ZWQgb3IgaXQgaXMgbm90IGEgZGlyZWN0b3J5LCBlcnJvcgorbWVzc2FnZSBpc3N1ZXMgKGFuZCBzY3JpcHQgZXhpc3RzKS4KKworT3B0aW9uczoKKworPW92ZXIKKworPWJhY2sKKworPWN1dAorCitzdWIgZGVsX2RpcigkQCkgeworCisgICAgbXkgJGRpciAgPSBzaGlmdCggQF8gKTsKKyAgICBteSAlb3B0cyA9IEBfOworICAgIG15ICRwcmVmaXggPSAiRGVsZXRpbmcgZGlyZWN0b3J5IFwiJGRpclwiIGZhaWxlZCI7CisgICAgb3VyICVfY2xlYW5fZGlyX29wdHM7CisgICAgbG9jYWwgJV9jbGVhbl9kaXJfb3B0cyA9CisgICAgICAgIHZhbGlkYXRlKAorICAgICAgICAgICAgcGFyYW1zID0+IFxAXywKKyAgICAgICAgICAgIHNwZWMgPT4geworICAgICAgICAgICAgICAgIGZvcmNlID0+IHsgdHlwZSA9PiAiYm9vbGVhbiIgfSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICk7CisKKyAgICBpZiAoIG5vdCAtZSAkZGlyICkgeworICAgICAgICAjIE5vdGhpbmcgdG8gZG8uCisgICAgICAgIHJldHVybjsKKyAgICB9OyAjIGlmCisgICAgaWYgKCBub3QgLWQgJGRpciApIHsKKyAgICAgICAgcnVudGltZV9lcnJvciggIiRwcmVmaXg6IGl0IGlzIG5vdCBhIGRpcmVjdG9yeS4iICk7CisgICAgfTsgIyBpZgorICAgIF9jbGVhbl9kaXIoICRkaXIgKTsKKyAgICBybWRpciggJGRpciApIG9yIHJ1bnRpbWVfZXJyb3IoICIkcHJlZml4LiIgKTsKKworfTsgIyBzdWIgZGVsX2RpcgorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworPWl0ZW0gQzxjaGFuZ2VfZGlyKCAkZGlyICk+CisKK0NoYW5nZSBjdXJyZW50IGRpcmVjdG9yeS4KKworSWYgYW55IGVycm9yIG9jY3VycmVkLCBlcnJvciBpc3N1ZXMgYW5kIHNjcmlwdCBleGl0cy4KKworPWN1dAorCitzdWIgY2hhbmdlX2RpcigkKSB7CisKKyAgICBteSAkZGlyID0gc2hpZnQoIEBfICk7CisKKyAgICBDd2Q6OmNoZGlyKCAkZGlyICkKKyAgICAgICAgb3IgcnVudGltZV9lcnJvciggIkNvdWxkIG5vdCBjaGRpciB0byBcIiRkaXJcIjogJCEiICk7CisKK307ICMgc3ViIGNoYW5nZV9kaXIKKworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworPWl0ZW0gQzxjb3B5X2ZpbGUoICRzcmNfZmlsZSwgJGRzdF9maWxlLCBAb3B0aW9ucyApPgorCitDb3B5IGZpbGUuCisKK1RoaXMgZnVuY3Rpb24gY29waWVzIGEgZmlsZS4gSWYgc291cmNlIGRvZXMgbm90IGV4aXN0IG9yIGlzIG5vdCBhIGZpbGUsIGVycm9yIGlzc3Vlcy4KKworT3B0aW9uczoKKworPW92ZXIKKworPWl0ZW0gQzwtb3ZlcndyaXRlPgorCitPdmVyd3JpdGUgZGVzdGluYXRpb24gZmlsZSwgaWYgaXQgZXhpc3RzLgorCis9YmFjaworCis9Y3V0CisKK3N1YiBjb3B5X2ZpbGUoJCRAKSB7CisKKyAgICBteSAkc3JjICA9IHNoaWZ0KCBAXyApOworICAgIG15ICRkc3QgID0gc2hpZnQoIEBfICk7CisgICAgbXkgJW9wdHMgPSBAXzsKKyAgICBteSAkcHJlZml4ID0gIkNvdWxkIG5vdCBjb3B5IGZpbGUgXCIkc3JjXCIgdG8gXCIkZHN0XCIiOworCisgICAgaWYgKCBub3QgLWUgJHNyYyApIHsKKyAgICAgICAgcnVudGltZV9lcnJvciggIiRwcmVmaXg6IFwiJHNyY1wiIGRvZXMgbm90IGV4aXN0LiIgKTsKKyAgICB9OyAjIGlmCisgICAgaWYgKCBub3QgLWYgJHNyYyApIHsKKyAgICAgICAgcnVudGltZV9lcnJvciggIiRwcmVmaXg6IFwiJHNyY1wiIGlzIG5vdCBhIGZpbGUuIiApOworICAgIH07ICMgaWYKKyAgICBpZiAoIC1lICRkc3QgKSB7CisgICAgICAgIGlmICggLWYgJGRzdCApIHsKKyAgICAgICAgICAgIGlmICggJG9wdHN7IC1vdmVyd3JpdGUgfSApIHsKKyAgICAgICAgICAgICAgICBkZWxfZmlsZSggJGRzdCApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBydW50aW1lX2Vycm9yKCAiJHByZWZpeDogXCIkZHN0XCIgYWxyZWFkeSBleGlzdHMuIiApOworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcnVudGltZV9lcnJvciggIiRwcmVmaXg6IFwiJGRzdFwiIGlzIG5vdCBhIGZpbGUuIiApOworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBpZgorCisgICAgRmlsZTo6Q29weTo6Y29weSggJHNyYywgJGRzdCApIG9yIHJ1bnRpbWVfZXJyb3IoICIkcHJlZml4OiAkISIgKTsKKyAgICAjIE9uIFdpbmRvd3MqIE9TIEZpbGU6OkNvcHkgcHJlc2VydmVzIGZpbGUgYXR0cmlidXRlcywgYnV0IG9uIExpbnV4KiBPUyBpdCBkb2Vzbid0LgorICAgICMgU28gd2Ugc2hvdWxkIGRvIGl0IG1hbnVhbGx5Li4uCisgICAgaWYgKCAkXk8gPX4gbS9ebGludXhcei8gKSB7CisgICAgICAgIG15ICRtb2RlID0gKCBzdGF0KCAkc3JjICkgKVsgMiBdCisgICAgICAgICAgICBvciBydW50aW1lX2Vycm9yKCAiJHByZWZpeDogY2Fubm90IGdldCBzdGF0dXMgaW5mbyBmb3Igc291cmNlIGZpbGUuIiApOworICAgICAgICBjaG1vZCggJG1vZGUsICRkc3QgKQorICAgICAgICAgICAgb3IgcnVudGltZV9lcnJvciggIiRwcmVmaXg6IGNhbm5vdCBjaGFuZ2UgbW9kZSBvZiBkZXN0aW5hdGlvbiBmaWxlLiIgKTsKKyAgICB9OyAjIGlmCisKK307ICMgc3ViIGNvcHlfZmlsZQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3ViIG1vdmVfZmlsZSgkJEApIHsKKworICAgIG15ICRzcmMgID0gc2hpZnQoIEBfICk7CisgICAgbXkgJGRzdCAgPSBzaGlmdCggQF8gKTsKKyAgICBteSAlb3B0cyA9IEBfOworICAgIG15ICRwcmVmaXggPSAiQ291bGQgbm90IG1vdmUgZmlsZSBcIiRzcmNcIiB0byBcIiRkc3RcIiI7CisKKyAgICBjaGVja19vcHRzKCAlb3B0cywgWyBxdyggLW92ZXJ3cml0ZSApIF0gKTsKKworICAgIGlmICggbm90IC1lICRzcmMgKSB7CisgICAgICAgIHJ1bnRpbWVfZXJyb3IoICIkcHJlZml4OiBcIiRzcmNcIiBkb2VzIG5vdCBleGlzdC4iICk7CisgICAgfTsgIyBpZgorICAgIGlmICggbm90IC1mICRzcmMgKSB7CisgICAgICAgIHJ1bnRpbWVfZXJyb3IoICIkcHJlZml4OiBcIiRzcmNcIiBpcyBub3QgYSBmaWxlLiIgKTsKKyAgICB9OyAjIGlmCisgICAgaWYgKCAtZSAkZHN0ICkgeworICAgICAgICBpZiAoIC1mICRkc3QgKSB7CisgICAgICAgICAgICBpZiAoICRvcHRzeyAtb3ZlcndyaXRlIH0gKSB7CisgICAgICAgICAgICAgICAgIworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBydW50aW1lX2Vycm9yKCAiJHByZWZpeDogXCIkZHN0XCIgYWxyZWFkeSBleGlzdHMuIiApOworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcnVudGltZV9lcnJvciggIiRwcmVmaXg6IFwiJGRzdFwiIGlzIG5vdCBhIGZpbGUuIiApOworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBpZgorCisgICAgRmlsZTo6Q29weTo6bW92ZSggJHNyYywgJGRzdCApIG9yIHJ1bnRpbWVfZXJyb3IoICIkcHJlZml4OiAkISIgKTsKKworfTsgIyBzdWIgbW92ZV9maWxlCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdWIgZGVsX2ZpbGUoJCkgeworICAgIG15ICRmaWxlcyA9IHNoaWZ0KCBAXyApOworICAgIGlmICggcmVmKCAkZmlsZXMgKSBlcSAiIiApIHsKKyAgICAgICAgJGZpbGVzID0gWyAkZmlsZXMgXTsKKyAgICB9OyAjIGlmCisgICAgZm9yZWFjaCBteSAkZmlsZSAoIEAkZmlsZXMgKSB7CisgICAgICAgIGRlYnVnKCAiRGVsZXRpbmcgZmlsZSBgJGZpbGUnLi4uIiApOworICAgICAgICBteSAkcmMgPSB1bmxpbmsoICRmaWxlICk7CisgICAgICAgIGlmICggJHJjID09IDAgJiYgJCEgIT0gRU5PRU5UICkgeworICAgICAgICAgICAgIyBSZXBvcm4gYW4gZXJyb3IsIGJ1dCBpZ25vcmUgRU5PRU5ULCBiZWNhdXNlIHRoZSBnb2FsIGlzIGFjaGlldmVkLgorICAgICAgICAgICAgcnVudGltZV9lcnJvciggIkRlbGV0aW5nIGZpbGUgYCRmaWxlJyBmYWlsZWQ6ICQhIiApOworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBmb3JlYWNoICRmaWxlCit9OyAjIHN1YiBkZWxfZmlsZQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworPWJhY2sKKworPWN1dAorCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgRmlsZSBJL08gc3Vicm91dGluZXMuCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworPWhlYWQyIEZpbGUgSS9PIHN1YnJvdXRpbmVzLgorCis9Y3V0CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis9aGVhZDMgcmVhZF9maWxlCisKK0I8U3lub3BzaXM6PgorCisgICAgcmVhZF9maWxlKCAkZmlsZSwgQG9wdGlvbnMgKQorCitCPERlc2NyaXB0aW9uOj4KKworUmVhZCBmaWxlIGFuZCByZXR1cm4gaXRzIGNvbnRlbnQuIEluIHNjYWxhciBjb250ZXh0IGZ1bmN0aW9uIHJldHVybnMgYSBzY2FsYXIsIGluIGxpc3QgY29udGV4dAorZnVuY3Rpb24gcmV0dXJucyBsaXN0IG9mIGxpbmVzLgorCitOb3RlOiBJZiB0aGUgbGFzdCBvZiBmaWxlIGRvZXMgbm90IHRlcm1pbmF0ZSB3aXRoIG5ld2xpbmUsIGZ1bmN0aW9uIHdpbGwgYXBwZW5kIGl0LgorCitCPEFyZ3VtZW50czo+CisKKz1vdmVyCisKKz1pdGVtIEI8JGZpbGU+CisKK0EgbmFtZSBvciBoYW5kbGUgb2YgZmlsZSB0byByZWFkIGZyb20uCisKKz1iYWNrCisKK0I8T3B0aW9uczo+CisKKz1vdmVyCisKKz1pdGVtIEI8LWJpbmFyeT4KKworSWYgdHJ1ZSwgZmlsZSB0cmVhdHMgYXMgYSBiaW5hcnkgZmlsZTogbm8gbmV3bGluZSBjb252ZXJzaW9uLCBubyB0cnVuY2F0aW5nIHRyYWlsaW5nIHNwYWNlLCBubworbmV3bGluZSByZW1vdmluZyBwZXJmb3JtZWQuIEVudGlyZSBmaWxlIHJldHVybmVkIGFzIGEgc2NhbGFyLgorCis9aXRlbSBCPC1idWxrPgorCitUaGlzIG9wdGlvbiBpcyBhbGxvd2VkIG9ubHkgaW4gYmluYXJ5IG1vZGUuIE9wdGlvbidzIHZhbHVlIHNob3VsZCBiZSBhIHJlZmVyZW5jZSB0byBhIHNjYWxhci4KK0lmIG9wdGlvbiBwcmVzZW50LCBmaWxlIGNvbnRlbnQgcGxhY2VkIHRvIHBvaW50ZWUgc2NhbGFyIGFuZCBmdW5jdGlvbiByZXR1cm5zIHRydWUgKDEpLgorCis9aXRlbSBCPC1jaG9tcD4KKworSWYgdHJ1ZSwgbmV3bGluZSBjaGFyYWN0ZXJzIGFyZSByZW1vdmVkIGZyb20gZmlsZSBjb250ZW50LiBCeSBkZWZhdWx0IG5ld2xpbmUgY2hhcmFjdGVycyByZW1haW4uCitUaGlzIG9wdGlvbiBpcyBub3QgYXBwbGljYWJsZSBpbiBiaW5hcnkgbW9kZS4KKworPWl0ZW0gQjwta2VlcF90cmFpbGluZ19zcGFjZT4KKworSWYgdHJ1ZSwgdHJhaW5saW5nIHNwYWNlIHJlbWFpbiBhdCB0aGUgZW5kcyBvZiBsaW5lcy4gQnkgZGVmYXVsdCBhbGwgdHJhaWxpbmcgc3BhY2VzIGFyZSByZW1vdmVkLgorVGhpcyBvcHRpb24gaXMgbm90IGFwcGxpY2FibGUgaW4gYmluYXJ5IG1vZGUuCisKKz1iYWNrCisKK0I8RXhhbXBsZXM6PgorCitSZXR1cm4gZmlsZSBhcyBzaW5nbGUgbGluZSwgcmVtb3ZlIHRyYWlsaW5nIHNwYWNlcy4KKworICAgIG15ICRidWxrID0gcmVhZF9maWxlKCAibWVzc2FnZS50eHQiICk7CisKK1JldHVybiBmaWxlIGFzIGxpc3Qgb2YgbGluZXMgd2l0aCByZW1vdmVkIHRyYWlsaW5nIHNwYWNlIGFuZAorbmV3bGluZSBjaGFyYWN0ZXJzLgorCisgICAgbXkgQGJ1bGsgPSByZWFkX2ZpbGUoICJtZXNzYWdlLnR4dCIsIC1jaG9tcCA9PiAxICk7CisKK1JlYWQgYSBiaW5hcnkgZmlsZToKKworICAgIG15ICRidWxrID0gcmVhZF9maWxlKCAibWVzc2FnZS50eHQiLCAtYmluYXJ5ID0+IDEgKTsKKworUmVhZCBhIGJpZyBiaW5hcnkgZmlsZToKKworICAgIG15ICRidWxrOworICAgIHJlYWRfZmlsZSggImJpZ19iaW5hcnlfZmlsZSIsIC1iaW5hcnkgPT4gMSwgLWJ1bGsgPT4gXCRidWxrICk7CisKK1JlYWQgZnJvbSBzdGFuZGFyZCBpbnB1dDoKKworICAgIG15IEBidWxrID0gcmVhZF9maWxlKCBcKlNURElOICk7CisKKz1jdXQKKworc3ViIHJlYWRfZmlsZSgkQCkgeworCisgICAgbXkgJGZpbGUgPSBzaGlmdCggQF8gKTsgICMgVGhlIG5hbWUgb3IgaGFuZGxlIG9mIGZpbGUgdG8gcmVhZCBmcm9tLgorICAgIG15ICVvcHRzID0gQF87ICAgICAgICAgICAjIE9wdGlvbnMuCisKKyAgICBteSAkbmFtZTsKKyAgICBteSAkaGFuZGxlOworICAgIG15IEBidWxrOworICAgIG15ICRlcnJvciA9IFwmcnVudGltZV9lcnJvcjsKKworICAgIG15IEBiaW5vcHRzID0gcXcoIC1iaW5hcnkgLWVycm9yIC1idWxrICk7ICAgICAgICAgICAgICAgICAgICAgICAjIE9wdGlvbnMgYXZhaWxhYmxlIGluIGJpbmFyeSBtb2RlLgorICAgIG15IEB0eHRvcHRzID0gcXcoIC1iaW5hcnkgLWVycm9yIC1rZWVwX3RyYWlsaW5nX3NwYWNlIC1jaG9tcCAtbGF5ZXIgKTsgIyBPcHRpb25zIGF2YWlsYWJsZSBpbiB0ZXh0IChub24tYmluYXJ5KSBtb2RlLgorICAgIGNoZWNrX29wdHMoICVvcHRzLCBbIEBiaW5vcHRzLCBAdHh0b3B0cyBdICk7CisgICAgaWYgKCAkb3B0c3sgLWJpbmFyeSB9ICkgeworICAgICAgICBjaGVja19vcHRzKCAlb3B0cywgWyBAYmlub3B0cyBdLCAidGhlc2Ugb3B0aW9ucyBjYW5ub3QgYmUgdXNlZCB3aXRoIC1iaW5hcnkiICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY2hlY2tfb3B0cyggJW9wdHMsIFsgQHR4dG9wdHMgXSwgInRoZXNlIG9wdGlvbnMgY2Fubm90IGJlIHVzZWQgd2l0aG91dCAtYmluYXJ5IiApOworICAgIH07ICMgaWYKKyAgICBpZiAoIG5vdCBleGlzdHMoICRvcHRzeyAtZXJyb3IgfSApICkgeworICAgICAgICAkb3B0c3sgLWVycm9yIH0gPSAiZXJyb3IiOworICAgIH07ICMgaWYKKyAgICBpZiAoICRvcHRzeyAtZXJyb3IgfSBlcSAid2FybmluZyIgKSB7CisgICAgICAgICRlcnJvciA9IFwmd2FybmluZzsKKyAgICB9IGVsc2lmKCAkb3B0c3sgLWVycm9yIH0gZXEgImlnbm9yZSIgKSB7CisgICAgICAgICRlcnJvciA9IHN1YiB7fTsKKyAgICB9IGVsc2lmICggcmVmKCAkb3B0c3sgLWVycm9yIH0gKSBlcSAiQVJSQVkiICkgeworICAgICAgICAkZXJyb3IgPSBzdWIgeyBwdXNoKCBAeyAkb3B0c3sgLWVycm9yIH0gfSwgJF9bIDAgXSApOyB9OworICAgIH07ICMgaWYKKworICAgIGlmICggKCByZWYoICRmaWxlICkgZXEgIkdMT0IiICkgb3IgVU5JVkVSU0FMOjppc2EoICRmaWxlLCAiSU86OkhhbmRsZSIgKSApIHsKKyAgICAgICAgJG5hbWUgPSAidW5rbm93biI7CisgICAgICAgICRoYW5kbGUgPSAkZmlsZTsKKyAgICB9IGVsc2UgeworICAgICAgICAkbmFtZSA9ICRmaWxlOworICAgICAgICBpZiAoIGdldF9leHQoICRmaWxlICkgZXEgIi5neiIgYW5kIG5vdCAkb3B0c3sgLWJpbmFyeSB9ICkgeworICAgICAgICAgICAgJGhhbmRsZSA9IElPOjpabGliLT5uZXcoICRuYW1lLCAicmIiICk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkaGFuZGxlID0gSU86OkZpbGUtPm5ldyggJG5hbWUsICJyIiApOworICAgICAgICB9OyAjIGlmCisgICAgICAgIGlmICggbm90IGRlZmluZWQoICRoYW5kbGUgKSApIHsKKyAgICAgICAgICAgICRlcnJvci0+KCAiRmlsZSBcIiRuYW1lXCIgY291bGQgbm90IGJlIG9wZW5lZCBmb3IgaW5wdXQ6ICQhIiApOworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBpZgorICAgIGlmICggZGVmaW5lZCggJGhhbmRsZSApICkgeworICAgICAgICBpZiAoICRvcHRzeyAtYmluYXJ5IH0gKSB7CisgICAgICAgICAgICBiaW5tb2RlKCAkaGFuZGxlICk7CisgICAgICAgICAgICBsb2NhbCAkLyA9IHVuZGVmOyAgICMgU2V0IGlucHV0IHJlY29yZCBzZXBhcmF0b3IgdG8gdW5kZWYgdG8gcmVhZCBlbnRpcmUgZmlsZSBhcyBvbmUgbGluZS4KKyAgICAgICAgICAgIGlmICggZXhpc3RzKCAkb3B0c3sgLWJ1bGsgfSApICkgeworICAgICAgICAgICAgICAgICR7ICRvcHRzeyAtYnVsayB9IH0gPSAkaGFuZGxlLT5nZXRsaW5lKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICRidWxrWyAwIF0gPSAkaGFuZGxlLT5nZXRsaW5lKCk7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIGRlZmluZWQoICRvcHRzeyAtbGF5ZXIgfSApICkgeworICAgICAgICAgICAgICAgIGJpbm1vZGUoICRoYW5kbGUsICRvcHRzeyAtbGF5ZXIgfSApOworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgQGJ1bGsgPSAkaGFuZGxlLT5nZXRsaW5lcygpOworICAgICAgICAgICAgIyBTcGVjaWFsIHRyaWNrIGZvciBVVEYtOCBmaWxlczogRGVsZXRlIEJPTSwgaWYgYW55LgorICAgICAgICAgICAgaWYgKCBkZWZpbmVkKCAkb3B0c3sgLWxheWVyIH0gKSBhbmQgJG9wdHN7IC1sYXllciB9IGVxICI6dXRmOCIgKSB7CisgICAgICAgICAgICAgICAgaWYgKCBzdWJzdHIoICRidWxrWyAwIF0sIDAsIDEgKSBlcSAiXHh7RkVGRn0iICkgeworICAgICAgICAgICAgICAgICAgICBzdWJzdHIoICRidWxrWyAwIF0sIDAsIDEgKSA9ICIiOworICAgICAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgfTsgIyBpZgorICAgICAgICAkaGFuZGxlLT5jbG9zZSgpCisgICAgICAgICAgICBvciAkZXJyb3ItPiggIkZpbGUgXCIkbmFtZVwiIGNvdWxkIG5vdCBiZSBjbG9zZWQgYWZ0ZXIgaW5wdXQ6ICQhIiApOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmICggJG9wdHN7IC1iaW5hcnkgfSBhbmQgZXhpc3RzKCAkb3B0c3sgLWJ1bGsgfSApICkgeworICAgICAgICAgICAgJHsgJG9wdHN7IC1idWxrIH0gfSA9ICIiOworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBpZgorICAgIGlmICggJG9wdHN7IC1iaW5hcnkgfSApIHsKKyAgICAgICAgaWYgKCBleGlzdHMoICRvcHRzeyAtYnVsayB9ICkgKSB7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAkYnVsa1sgMCBdOworICAgICAgICB9OyAjIGlmCisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCAoIEBidWxrID4gMCApIGFuZCAoIHN1YnN0ciggJGJ1bGtbIC0xIF0sIC0xLCAxICkgbmUgIlxuIiApICkgeworICAgICAgICAgICAgJGJ1bGtbIC0xIF0gLj0gIlxuIjsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICBpZiAoIG5vdCAkb3B0c3sgLWtlZXBfdHJhaWxpbmdfc3BhY2UgfSApIHsKKyAgICAgICAgICAgIG1hcCggJF8gPX4gcy9ccytcblx6L1xuLywgQGJ1bGsgKTsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICBpZiAoICRvcHRzeyAtY2hvbXAgfSApIHsKKyAgICAgICAgICAgIGNob21wKCBAYnVsayApOworICAgICAgICB9OyAjIGlmCisgICAgICAgIGlmICggd2FudGFycmF5KCkgKSB7CisgICAgICAgICAgICByZXR1cm4gQGJ1bGs7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gam9pbiggIiIsIEBidWxrICk7CisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGlmCisKK307ICMgc3ViIHJlYWRfZmlsZQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworPWhlYWQzIHdyaXRlX2ZpbGUKKworQjxTeW5vcHNpczo+CisKKyAgICB3cml0ZV9maWxlKCAkZmlsZSwgJGJ1bGssIEBvcHRpb25zICkKKworQjxEZXNjcmlwdGlvbjo+CisKK1dyaXRlIGZpbGUuCisKK0I8QXJndW1lbnRzOj4KKworPW92ZXIKKworPWl0ZW0gQjwkZmlsZT4KKworVGhlIG5hbWUgb3IgaGFuZGxlIG9mIGZpbGUgdG8gd3JpdHRlIHRvLgorCis9aXRlbSBCPCRidWxrPgorCitCdWxrIHRvIHdyaXRlIHRvIGEgZmlsZS4gQ2FuIGJlIGEgc2NhbGFyLCBvciBhIHJlZmVyZW5jZSB0byBzY2FsYXIgb3IgYW4gYXJyYXkuCisKKz1iYWNrCisKK0I8T3B0aW9uczo+CisKKz1vdmVyCisKKz1pdGVtIEI8LWJhY2t1cD4KKworSWYgdHJ1ZSwgY3JlYXRlIGEgYmFja3VwIGNvcHkgb2YgZmlsZSBvdmVyd3JpdHRlbi4gQmFja3VwIGNvcHkgaXMgcGxhY2VkIGludG8gdGhlIHNhbWUgZGlyZWN0b3J5LgorVGhlIG5hbWUgb2YgYmFja3VwIGNvcHkgaXMgdGhlIHNhbWUgYXMgdGhlIG5hbWUgb2YgZmlsZSB3aXRoIGB+JyBhcHBlbmRlZC4gQnkgZGVmYXVsdCBiYWNrdXAgY29weQoraXMgbm90IGNyZWF0ZWQuCisKKz1pdGVtIEI8LWFwcGVuZD4KKworSWYgdHJ1ZSwgdGhlIHRleHQgd2lsbCBiZSBhZGRlZCB0byBleGlzdGluZyBmaWxlLgorCis9YmFjaworCitCPEV4YW1wbGVzOj4KKworICAgIHdyaXRlX2ZpbGUoICJtZXNzYWdlLnR4dCIsIFwkYnVsayApOworICAgICAgICAjIFdyaXRlIGZpbGUsIHRha2UgY29udGVudCBmcm9tIGEgc2NhbGFyLgorCisgICAgd3JpdGVfZmlsZSggIm1lc3NhZ2UudHh0IiwgXEBidWxrLCAtYmFja3VwID0+IDEgKTsKKyAgICAgICAgIyBXcml0ZSBmaWxlLCB0YWtlIGNvbnRlbnQgZnJvbSBhbiBhcnJheSwgY3JlYXRlIGEgYmFja3VwIGNvcHkuCisKKz1jdXQKKworc3ViIHdyaXRlX2ZpbGUoJCRAKSB7CisKKyAgICBteSAkZmlsZSA9IHNoaWZ0KCBAXyApOyAgIyBUaGUgbmFtZSBvciBoYW5kbGUgb2YgZmlsZSB0byB3cml0ZSB0by4KKyAgICBteSAkYnVsayA9IHNoaWZ0KCBAXyApOyAgIyBUaGUgdGV4dCB0byB3cml0ZS4gQ2FuIGJlIHJlZmVyZW5jZSB0byBhcnJheSBvciBzY2FsYXIuCisgICAgbXkgJW9wdHMgPSBAXzsgICAgICAgICAgICMgT3B0aW9ucy4KKworICAgIG15ICRuYW1lOworICAgIG15ICRoYW5kbGU7CisKKyAgICBjaGVja19vcHRzKCAlb3B0cywgWyBxdyggLWFwcGVuZCAtYmFja3VwIC1iaW5hcnkgLWxheWVyICkgXSApOworCisgICAgbXkgJG1vZGUgPSAkb3B0c3sgLWFwcGVuZCB9ID8gImEiOiAidyI7CisgICAgaWYgKCAoIHJlZiggJGZpbGUgKSBlcSAiR0xPQiIgKSBvciBVTklWRVJTQUw6OmlzYSggJGZpbGUsICJJTzo6SGFuZGxlIiApICkgeworICAgICAgICAkbmFtZSA9ICJ1bmtub3duIjsKKyAgICAgICAgJGhhbmRsZSA9ICRmaWxlOworICAgIH0gZWxzZSB7CisgICAgICAgICRuYW1lID0gJGZpbGU7CisgICAgICAgIGlmICggJG9wdHN7IC1iYWNrdXAgfSBhbmQgKCAtZiAkbmFtZSApICkgeworICAgICAgICAgICAgY29weV9maWxlKCAkbmFtZSwgJG5hbWUgLiAifiIsIC1vdmVyd3JpdGUgPT4gMSApOworICAgICAgICB9OyAjIGlmCisgICAgICAgICRoYW5kbGUgPSBJTzo6RmlsZS0+bmV3KCAkbmFtZSwgJG1vZGUgKQorICAgICAgICAgICAgb3IgcnVudGltZV9lcnJvciggIkZpbGUgXCIkbmFtZVwiIGNvdWxkIG5vdCBiZSBvcGVuZWQgZm9yIG91dHB1dDogJCEiICk7CisgICAgfTsgIyBpZgorICAgIGlmICggJG9wdHN7IC1iaW5hcnkgfSApIHsKKyAgICAgICAgYmlubW9kZSggJGhhbmRsZSApOworICAgIH0gZWxzaWYgKCAkb3B0c3sgLWxheWVyIH0gKSB7CisgICAgICAgIGJpbm1vZGUoICRoYW5kbGUsICRvcHRzeyAtbGF5ZXIgfSApOworICAgIH07ICMgaWYKKyAgICBpZiAoIHJlZiggJGJ1bGsgKSBlcSAiIiApIHsKKyAgICAgICAgaWYgKCBkZWZpbmVkKCAkYnVsayApICkgeworICAgICAgICAgICAgJGhhbmRsZS0+cHJpbnQoICRidWxrICk7CisgICAgICAgICAgICBpZiAoIG5vdCAkb3B0c3sgLWJpbmFyeSB9IGFuZCAoIHN1YnN0ciggJGJ1bGssIC0xICkgbmUgIlxuIiApICkgeworICAgICAgICAgICAgICAgICRoYW5kbGUtPnByaW50KCAiXG4iICk7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgIH07ICMgaWYKKyAgICB9IGVsc2lmICggcmVmKCAkYnVsayApIGVxICJTQ0FMQVIiICkgeworICAgICAgICBpZiAoIGRlZmluZWQoICQkYnVsayApICkgeworICAgICAgICAgICAgJGhhbmRsZS0+cHJpbnQoICQkYnVsayApOworICAgICAgICAgICAgaWYgKCBub3QgJG9wdHN7IC1iaW5hcnkgfSBhbmQgKCBzdWJzdHIoICQkYnVsaywgLTEgKSBuZSAiXG4iICkgKSB7CisgICAgICAgICAgICAgICAgJGhhbmRsZS0+cHJpbnQoICJcbiIgKTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgfTsgIyBpZgorICAgIH0gZWxzaWYgKCByZWYoICRidWxrICkgZXEgIkFSUkFZIiApIHsKKyAgICAgICAgZm9yZWFjaCBteSAkbGluZSAoIEAkYnVsayApIHsKKyAgICAgICAgICAgIGlmICggZGVmaW5lZCggJGxpbmUgKSApIHsKKyAgICAgICAgICAgICAgICAkaGFuZGxlLT5wcmludCggJGxpbmUgKTsKKyAgICAgICAgICAgICAgICBpZiAoIG5vdCAkb3B0c3sgLWJpbmFyeSB9IGFuZCAoIHN1YnN0ciggJGxpbmUsIC0xICkgbmUgIlxuIiApICkgeworICAgICAgICAgICAgICAgICAgICAkaGFuZGxlLT5wcmludCggIlxuIiApOworICAgICAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgfTsgIyBmb3JlYWNoCisgICAgfSBlbHNlIHsKKyAgICAgICAgQ2FycDo6Y3JvYWsoICJ3cml0ZV9maWxlOiBcJGJ1bGsgbXVzdCBiZSBhIHNjYWxhciBvciByZWZlcmVuY2UgdG8gKHNjYWxhciBvciBhcnJheSkiICk7CisgICAgfTsgIyBpZgorICAgICRoYW5kbGUtPmNsb3NlKCkKKyAgICAgICAgb3IgcnVudGltZV9lcnJvciggIkZpbGUgXCIkbmFtZVwiIGNvdWxkIG5vdCBiZSBjbG9zZWQgYWZ0ZXIgb3V0cHV0OiAkISIgKTsKKworfTsgIyBzdWIgd3JpdGVfZmlsZQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworPWN1dAorCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgRXhlY3V0aW9uIHN1YnJvdXRpbmVzLgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKz1oZWFkMiBFeGVjdXRpb24gc3Vicm91dGluZXMuCisKKz1vdmVyCisKKz1jdXQKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N1YiBfcHJlIHsKKworICAgIG15ICRhcmcgPSBzaGlmdCggQF8gKTsKKworICAgICMgSWYgcmVkaXJlY3Rpb24gaXMgbm90IHJlcXVpcmVkLCBleGl0LgorICAgIGlmICggbm90IGV4aXN0cyggJGFyZy0+eyByZWRpciB9ICkgKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH07ICMgaWYKKworICAgICMgSW5wdXQgcGFyYW1ldGVycy4KKyAgICBteSAkbW9kZSAgID0gJGFyZy0+eyBtb2RlICAgfTsgIyBNb2RlLCAiPCIgKGlucHV0ICkgb3IgIj4iIChvdXRwdXQpLgorICAgIG15ICRoYW5kbGUgPSAkYXJnLT57IGhhbmRsZSB9OyAjIEhhbmRsZSB0byBtYW5pcHVsYXRlLgorICAgIG15ICRyZWRpciAgPSAkYXJnLT57IHJlZGlyICB9OyAjIERhdGEsIGEgZmlsZSBuYW1lIGlmIGEgc2NhbGFyLCBvciBmaWxlIGNvbnRlbnRzLCBpZiBhIHJlZmVyZW5jZS4KKworICAgICMgT3V0cHV0IHBhcmFtZXRlcnMuCisgICAgbXkgJHNhdmVfaGFuZGxlOworICAgIG15ICR0ZW1wX2hhbmRsZTsKKyAgICBteSAkdGVtcF9uYW1lOworCisgICAgIyBTYXZlIG9yaWdpbmFsIGhhbmRsZSAoYnkgZHVwaW5nIGl0KS4KKyAgICAkc2F2ZV9oYW5kbGUgPSBTeW1ib2w6OmdlbnN5bSgpOworICAgICRoYW5kbGUtPmZsdXNoKCk7CisgICAgb3BlbiggJHNhdmVfaGFuZGxlLCAkbW9kZSAuICImIiAuICRoYW5kbGUtPmZpbGVubygpICkKKyAgICAgICAgb3IgZGllKCAiQ2Fubm90IGR1cCBmaWxlaGFuZGxlOiAkISIgKTsKKworICAgICMgUHJlcGFyZSBhIGZpbGUgdG8gSU8uCisgICAgaWYgKCBVTklWRVJTQUw6OmlzYSggJHJlZGlyLCAiSU86OkhhbmRsZSIgKSBvciAoIHJlZiggJHJlZGlyICkgZXEgIkdMT0IiICkgKSB7CisgICAgICAgICMgJHJlZGlyIGlzIHJlZmVyZW5jZSB0byBhbiBvYmplY3Qgb2YgSU86OkhhbmRsZSBjbGFzcyAob3IgaXRzIGRlY2VkYW50KS4KKyAgICAgICAgJHRlbXBfaGFuZGxlID0gJHJlZGlyOworICAgIH0gZWxzaWYgKCByZWYoICRyZWRpciApICkgeworICAgICAgICAjICRyZWRpciBpcyBhIHJlZmVyZW5jZSB0byBjb250ZW50IHRvIGJlIHJlYWQvd3JpdHRlbi4KKyAgICAgICAgIyBQcmVwYXJlIHRlbXAgZmlsZS4KKyAgICAgICAgKCAkdGVtcF9oYW5kbGUsICR0ZW1wX25hbWUgKSA9CisgICAgICAgICAgICBGaWxlOjpUZW1wOjp0ZW1wZmlsZSgKKyAgICAgICAgICAgICAgICAiJHRvb2wuWFhYWFhYWFgiLAorICAgICAgICAgICAgICAgIERJUiAgICA9PiBGaWxlOjpTcGVjLT50bXBkaXIoKSwKKyAgICAgICAgICAgICAgICBTVUZGSVggPT4gIi50bXAiLAorICAgICAgICAgICAgICAgIFVOTElOSyA9PiAxCisgICAgICAgICAgICApOworICAgICAgICBpZiAoIG5vdCBkZWZpbmVkKCAkdGVtcF9oYW5kbGUgKSApIHsKKyAgICAgICAgICAgIHJ1bnRpbWVfZXJyb3IoICJDb3VsZCBub3QgY3JlYXRlIHRlbXAgZmlsZS4iICk7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgaWYgKCAkbW9kZSBlcSAiPCIgKSB7CisgICAgICAgICAgICAjIEl0IGlzIGEgZmlsZSB0byBiZSByZWFkIGJ5IGNoaWxkLCBwcmVwYXJlIGZpbGUgY29udGVudCB0byBiZSByZWFkLgorICAgICAgICAgICAgJHRlbXBfaGFuZGxlLT5wcmludCggcmVmKCAkcmVkaXIgKSBlcSAiU0NBTEFSIiA/ICR7ICRyZWRpciB9IDogQHsgJHJlZGlyIH0gKTsKKyAgICAgICAgICAgICR0ZW1wX2hhbmRsZS0+Zmx1c2goKTsKKyAgICAgICAgICAgIHNlZWsoICR0ZW1wX2hhbmRsZSwgMCwgMCApOworICAgICAgICAgICAgICAgICMgVW5mb3J0dW5hdGVsbHksIEkgY291bGQgbm90IHVzZSBPTyBpbnRlcmZhY2UgdG8gc2Vlay4KKyAgICAgICAgICAgICAgICAjIEFjdGl2ZVBlcmwgNS42LjEgY29tcGxhaW5zIG9uIGJvdGggZm9ybXM6CisgICAgICAgICAgICAgICAgIyAgICAkdGVtcF9oYW5kbGUtPnNlZWsoIDAgKTsgICAgIyBBcyBkZWNsYXJlZCBpbiBJTzo6U2Vla2FibGUuCisgICAgICAgICAgICAgICAgIyAgICAkdGVtcF9oYW5kbGUtPnNldHBvcyggMCApOyAgIyBBcyBkZXNjcmliZWQgaW4gZG9jdW1lbnRhdGlvbi4KKyAgICAgICAgfSBlbHNpZiAoICRtb2RlIGVxICI+IiApIHsKKyAgICAgICAgICAgICMgSXQgaXMgYSBmaWxlIGZvciBvdXRwdXQuIENsZWFyIG91dHB1dCB2YXJpYWJsZS4KKyAgICAgICAgICAgIGlmICggcmVmKCAkcmVkaXIgKSBlcSAiU0NBTEFSIiApIHsKKyAgICAgICAgICAgICAgICAkeyAkcmVkaXIgfSA9ICIiOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBAeyAkcmVkaXIgfSA9ICgpOworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICB9OyAjIGlmCisgICAgfSBlbHNlIHsKKyAgICAgICAgIyAkcmVkaXIgaXMgYSBuYW1lIG9mIGZpbGUgdG8gYmUgcmVhZC93cml0dGVuLgorICAgICAgICAjIEp1c3Qgb3BlbiBmaWxlLgorICAgICAgICBpZiAoIGRlZmluZWQoICRyZWRpciApICkgeworICAgICAgICAgICAgJHRlbXBfbmFtZSA9ICRyZWRpcjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICR0ZW1wX25hbWUgPSBGaWxlOjpTcGVjLT5kZXZudWxsKCk7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgJHRlbXBfaGFuZGxlID0gSU86OkZpbGUtPm5ldyggJHRlbXBfbmFtZSwgJG1vZGUgKQorICAgICAgICAgICAgb3IgcnVudGltZV9lcnJvciggImZpbGUgXCIkdGVtcF9uYW1lXCIgY291bGQgbm90IGJlIG9wZW5lZCBmb3IgIiAuICggJG1vZGUgZXEgIjwiID8gImlucHV0IiA6ICJvdXRwdXQiICkgLiAiOiAkISIgKTsKKyAgICB9OyAjIGlmCisKKyAgICAjIFJlZGlyZWN0IGhhbmRsZSB0byB0ZW1wIGZpbGUuCisgICAgb3BlbiggJGhhbmRsZSwgJG1vZGUgLiAiJiIgLiAkdGVtcF9oYW5kbGUtPmZpbGVubygpICkKKyAgICAgICAgb3IgZGllKCAiQ2Fubm90IGR1cCBmaWxlaGFuZGxlOiAkISIgKTsKKworICAgICMgU2F2ZSBvdXRwdXQgcGFyYW1ldGVycy4KKyAgICAkYXJnLT57IHNhdmVfaGFuZGxlIH0gPSAkc2F2ZV9oYW5kbGU7CisgICAgJGFyZy0+eyB0ZW1wX2hhbmRsZSB9ID0gJHRlbXBfaGFuZGxlOworICAgICRhcmctPnsgdGVtcF9uYW1lICAgfSA9ICR0ZW1wX25hbWU7CisKK307ICMgc3ViIF9wcmUKKworCitzdWIgX3Bvc3QgeworCisgICAgbXkgJGFyZyA9IHNoaWZ0KCBAXyApOworCisgICAgIyBJbnB1dCBwYXJhbWV0ZXJzLgorICAgIG15ICRtb2RlICAgPSAkYXJnLT57IG1vZGUgICB9OyAjIE1vZGUsICI8IiBvciAiPiIuCisgICAgbXkgJGhhbmRsZSA9ICRhcmctPnsgaGFuZGxlIH07ICMgSGFuZGxlIHRvIHNhdmUgYW5kIHNldC4KKyAgICBteSAkcmVkaXIgID0gJGFyZy0+eyByZWRpciAgfTsgIyBEYXRhLCBhIGZpbGUgbmFtZSBpZiBhIHNjYWxhciwgb3IgZmlsZSBjb250ZW50cywgaWYgYSByZWZlcmVuY2UuCisKKyAgICAjIFBhcmFtZXRlcnMgc2F2ZWQgZHVyaW5nIHByZXByb2Nlc3NpbmcuCisgICAgbXkgJHNhdmVfaGFuZGxlID0gJGFyZy0+eyBzYXZlX2hhbmRsZSB9OworICAgIG15ICR0ZW1wX2hhbmRsZSA9ICRhcmctPnsgdGVtcF9oYW5kbGUgfTsKKyAgICBteSAkdGVtcF9uYW1lICAgPSAkYXJnLT57IHRlbXBfbmFtZSAgIH07CisKKyAgICAjIElmIG5vIGhhbmRsZSB3YXMgc2F2ZWQsIGV4aXQuCisgICAgaWYgKCBub3QgJHNhdmVfaGFuZGxlICkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9OyAjIGlmCisKKyAgICAjIENsb3NlIGhhbmRsZS4KKyAgICAkaGFuZGxlLT5jbG9zZSgpCisgICAgICAgIG9yIGRpZSggIiQhIiApOworCisgICAgIyBSZWFkIHRoZSBjb250ZW50IG9mIHRlbXAgZmlsZSwgaWYgbmVjZXNzYXJ5LCBhbmQgY2xvc2UgdGVtcCBmaWxlLgorICAgIGlmICggKCAkbW9kZSBuZSAiPCIgKSBhbmQgcmVmKCAkcmVkaXIgKSApIHsKKyAgICAgICAgJHRlbXBfaGFuZGxlLT5mbHVzaCgpOworICAgICAgICBzZWVrKCAkdGVtcF9oYW5kbGUsIDAsIDAgKTsKKyAgICAgICAgaWYgKCAkXk8gPX4gbS9NU1dpbi8gKSB7CisgICAgICAgICAgICBiaW5tb2RlKCAkdGVtcF9oYW5kbGUsICI6Y3JsZiIgKTsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICBpZiAoIHJlZiggJHJlZGlyICkgZXEgIlNDQUxBUiIgKSB7CisgICAgICAgICAgICAkeyAkcmVkaXIgfSAuPSBqb2luKCAiIiwgJHRlbXBfaGFuZGxlLT5nZXRsaW5lcygpICk7CisgICAgICAgIH0gZWxzaWYgKCByZWYoICRyZWRpciApIGVxICJBUlJBWSIgKSB7CisgICAgICAgICAgICBwdXNoKCBAeyAkcmVkaXIgfSwgJHRlbXBfaGFuZGxlLT5nZXRsaW5lcygpICk7CisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGlmCisgICAgaWYgKCBub3QgVU5JVkVSU0FMOjppc2EoICRyZWRpciwgIklPOjpIYW5kbGUiICkgKSB7CisgICAgICAgICR0ZW1wX2hhbmRsZS0+Y2xvc2UoKQorICAgICAgICAgICAgb3IgZGllKCAiJCEiICk7CisgICAgfTsgIyBpZgorCisgICAgIyBSZXN0b3JlIGhhbmRsZSB0byBvcmlnaW5hbCB2YWx1ZS4KKyAgICAkc2F2ZV9oYW5kbGUtPmZsdXNoKCk7CisgICAgb3BlbiggJGhhbmRsZSwgJG1vZGUgLiAiJiIgLiAkc2F2ZV9oYW5kbGUtPmZpbGVubygpICkKKyAgICAgICAgb3IgZGllKCAiQ2Fubm90IGR1cCBmaWxlaGFuZGxlOiAkISIgKTsKKworICAgICMgQ2xvc2Ugc2F2ZSBoYW5kbGUuCisgICAgJHNhdmVfaGFuZGxlLT5jbG9zZSgpCisgICAgICAgIG9yIGRpZSggIiQhIiApOworCisgICAgIyBEZWxldGUgcGFyYW1ldGVycyBzYXZlZCBkdXJpbmcgcHJlcHJvY2Vzc2luZy4KKyAgICBkZWxldGUoICRhcmctPnsgc2F2ZV9oYW5kbGUgfSApOworICAgIGRlbGV0ZSggJGFyZy0+eyB0ZW1wX2hhbmRsZSB9ICk7CisgICAgZGVsZXRlKCAkYXJnLT57IHRlbXBfbmFtZSAgIH0gKTsKKworfTsgIyBzdWIgX3Bvc3QKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKz1pdGVtIEM8ZXhlY3V0ZSggWyBAY29tbWFuZCBdLCBAb3B0aW9ucyApPgorCitFeGVjdXRlIHNwZWNpZmllZCBwcm9ncmFtIG9yIHNoZWxsIGNvbW1hbmQuCisKK1Byb2dyYW0gaXMgc3BlY2lmaWVkIGJ5IHJlZmVyZW5jZSB0byBhbiBhcnJheSwgdGhhdCBhcnJheSBpcyBwYXNzZWQgdG8gQzxzeXN0ZW0oKT4gZnVuY3Rpb24gd2hpY2gKK2V4ZWN1dGVzIHRoZSBjb21tYW5kLiBTZWUgTDxwZXJsZnVuYz4gZm9yIGRldGFpbHMgaG93IEM8c3lzdGVtKCk+IGludGVycHJldHMgdmFyaW91cyBmb3JtcyBvZgorQzxAY29tbWFuZD4uCisKK0J5IGRlZmF1bHQsIGluIGNhc2Ugb2YgYW55IGVycm9yIGVycm9yIG1lc3NhZ2UgaXMgaXNzdWVkIGFuZCBzY3JpcHQgdGVybWluYXRlZCAoYnkgcnVudGltZV9lcnJvcigpKS4KK0Z1bmN0aW9uIHJldHVybnMgYW4gZXhpdCBjb2RlIG9mIHByb2dyYW0uCisKK0FsdGVybmF0aXZlbHksIGhlIGZ1bmN0aW9uIG1heSByZXR1cm4gZXhpdCBzdGF0dXMgb2YgdGhlIHByb2dyYW0gKHNlZSBDPC1pZ25vcmVfc3RhdHVzPikgb3Igc2lnbmFsCisoc2VlIEM8LWlnbm9yZV9zaWduYWw+KSBzbyBjYWxsZXIgbWF5IGFuYWx5emUgaXQgYW5kIGNvbnRpbnVlIGV4ZWN1dGlvbi4KKworT3B0aW9uczoKKworPW92ZXIKKworPWl0ZW0gQzwtc3RkaW4+CisKK1JlZGlyZWN0IHN0ZGluIG9mIHByb2dyYW0uIFRoZSB2YWx1ZSBvZiBvcHRpb24gY2FuIGJlOgorCis9b3ZlcgorCis9aXRlbSBDPHVuZGVmPgorCitTdGRpbiBvZiBjaGlsZCBpcyBhdHRhY2hlZCB0byBudWxsIGRldmljZS4KKworPWl0ZW0gYSBzdHJpbmcKKworU3RkaW4gb2YgY2hpbGQgaXMgYXR0YWNoZWQgdG8gYSBmaWxlIHdpdGggbmFtZSBzcGVjaWZpZWQgYnkgb3B0aW9uLgorCis9aXRlbSBhIHJlZmVyZW5jZSB0byBhIHNjYWxhcgorCitBIGRlcmVmZXJlbmNlZCBzY2FsYXIgaXMgd3JpdHRlbiB0byBhIHRlbXAgZmlsZSwgYW5kIGNoaWxkJ3Mgc3RkaW4gaXMgYXR0YWNoZWQgdG8gdGhhdCBmaWxlLgorCis9aXRlbSBhIHJlZmVyZW5jZSB0byBhbiBhcnJheQorCitBIGRlcmVmZXJlbmNlZCBhcnJheSBpcyB3cml0dGVuIHRvIGEgdGVtcCBmaWxlLCBhbmQgY2hpbGQncyBzdGRpbiBpcyBhdHRhY2hlZCB0byB0aGF0IGZpbGUuCisKKz1iYWNrCisKKz1pdGVtIEM8LXN0ZG91dD4KKworUmVkaXJlY3Qgc3Rkb3V0LiBQb3NzaWJsZSB2YWx1ZXMgYXJlIHRoZSBzYW1lIGFzIGZvciBDPC1zdGRpbj4gb3B0aW9uLiBUaGUgb25seSBkaWZmZXJlbmNlIGlzCityZWZlcmVuY2Ugc3BlY2lmaWVzIGEgdmFyaWFibGUgcmVjZWl2aW5nIHByb2dyYW0ncyBvdXRwdXQuCisKKz1pdGVtIEM8LXN0ZGVycj4KKworSXQgc2ltaWxhciB0byBDPC1zdGRvdXQ+LCBidXQgcmVkaXJlY3RzIHN0ZGVyci4gVGhlcmUgaXMgb25seSBvbmUgYWRkaXRpb25hbCB2YWx1ZToKKworPW92ZXIKKworPWl0ZW0gYW4gZW1wdHkgc3RyaW5nCisKK21lYW5zIHRoYXQgc3RkZXJyIHNob3VsZCBiZSByZWRpcmVjdGVkIHRvIHRoZSBzYW1lIHBsYWNlIHdoZXJlIHN0ZG91dCBpcyByZWRpcmVjdGVkIHRvLgorCis9YmFjaworCis9aXRlbSBDPC1hcHBlbmQ+CisKK1JlZGlyZWN0ZWQgc3RyZWFtIHdpbGwgbm90IG92ZXJ3cml0ZSBwcmV2aW91cyBjb250ZW50IG9mIGZpbGUgKG9yIHZhcmlhYmxlKS4KK05vdGUsIHRoYXQgb3B0aW9uIGFmZmVjdHMgYm90aCBzdGRvdXQgYW5kIHN0ZGVyci4KKworPWl0ZW0gQzwtaWdub3JlX3N0YXR1cz4KKworQnkgZGVmYXVsdCwgc3Vicm91dGluZSByYWlzZXMgYW4gZXJyb3IgYW5kIGV4aXRzIHRoZSBzY3JpcHQgaWYgcHJvZ3JhbSByZXR1cm5zIG5vbi1leGl0IHN0YXR1cy4gSWYKK3RoaXMgb3B0aW9ucyBpcyB0cnVlLCBubyBlcnJvciBpcyByYWlzZWQuIEluc3RlYWQsIHN0YXR1cyBpcyByZXR1cm5lZCBhcyBmdW5jdGlvbiByZXN1bHQgKGFuZCAkQCBpcworc2V0IHRvIGVycm9yIG1lc3NhZ2UpLgorCis9aXRlbSBDPC1pZ25vcmVfc2lnbmFsPgorCitCeSBkZWZhdWx0LCBzdWJyb3V0aW5lIHJhaXNlcyBhbiBlcnJvciBhbmQgZXhpdHMgdGhlIHNjcmlwdCBpZiBwcm9ncmFtIGRpZSB3aXRoIHNpZ25hbC4gSWYKK3RoaXMgb3B0aW9ucyBpcyB0cnVlLCBubyBlcnJvciBpcyByYWlzZWQgaW4gc3VjaCBhIGNhc2UuIEluc3RlYWQsIHNpZ25hbCBudW1iZXIgaXMgcmV0dXJuZWQgKGFzCituZWdhdGl2ZSB2YWx1ZSksIGVycm9yIG1lc3NhZ2UgaXMgcGxhY2VkIHRvIEM8JEA+IHZhcmlhYmxlLgorCitJZiBjb21tYW5kIGlzIG5vdCBldmVuIHN0YXJ0ZWQsIC0yNTYgaXMgcmV0dXJuZWQuCisKKz1iYWNrCisKK0V4YW1wbGVzOgorCisgICAgZXhlY3V0ZSggWyAiY21kLmV4ZSIsICIvYyIsICJkaXIiIF0gKTsKKyAgICAgICAgIyBFeGVjdXRlIE5UIHNoZWxsIHdpdGggc3BlY2lmaWVkIG9wdGlvbnMsIG5vIHJlZGlyZWN0aW9ucyBhcmUKKyAgICAgICAgIyBtYWRlLgorCisgICAgbXkgJG91dHB1dDsKKyAgICBleGVjdXRlKCBbICJjdnMiLCAiLW4iLCAiLXEiLCAidXBkYXRlIiwgIi4iIF0sIC1zdGRvdXQgPT4gXCRvdXRwdXQgKTsKKyAgICAgICAgIyBFeGVjdXRlICJjdnMgLW4gLXEgdXBkYXRlIC4iIGNvbW1hbmQsIG91dHB1dCBpcyBzYXZlZAorICAgICAgICAjIGluICRvdXRwdXQgdmFyaWFibGUuCisKKyAgICBteSBAb3V0cHV0OworICAgIGV4ZWN1dGUoIFsgcXcoIGN2cyAtbiAtcSB1cGRhdGUgLiApIF0sIC1zdGRvdXQgPT4gXEBvdXRwdXQsIC1zdGRlcnIgPT4gdW5kZWYgKTsKKyAgICAgICAgIyBFeGVjdXRlIHNwZWNpZmllZCBjb21tYW5kLCAgb3V0cHV0IGlzIHNhdmVkIGluIEBvdXRwdXQKKyAgICAgICAgIyB2YXJpYWJsZSwgc3RkZXJyIHN0cmVhbSBpcyByZWRpcmVjdGVkIHRvIG51bGwgZGV2aWNlCisgICAgICAgICMgKC9kZXYvbnVsbCBpbiBMaW51eCogT1MgYW4gbnVsIGluIFdpbmRvd3MqIE9TKS4KKworPWN1dAorCitzdWIgZXhlY3V0ZSgkQCkgeworCisgICAgIyAhISEgQWRkIHNvbWV0aGluZyB0byBjb21wbGFpbiBvbiB1bmtub3duIG9wdGlvbnMuLi4KKworICAgIG15ICRjb21tYW5kID0gc2hpZnQoIEBfICk7CisgICAgbXkgJW9wdHMgICAgPSBAXzsKKyAgICBteSAkcHJlZml4ICA9ICJDb3VsZCBub3QgZXhlY3V0ZSAkY29tbWFuZC0+WyAwIF0iOworCisgICAgY2hlY2tfb3B0cyggJW9wdHMsIFsgcXcoIC1zdGRpbiAtc3Rkb3V0IC1zdGRlcnIgLWFwcGVuZCAtaWdub3JlX3N0YXR1cyAtaWdub3JlX3NpZ25hbCApIF0gKTsKKworICAgIGlmICggcmVmKCAkY29tbWFuZCApIG5lICJBUlJBWSIgKSB7CisgICAgICAgIENhcnA6OmNyb2FrKCAiZXhlY3V0ZTogJGNvbW1hbmQgbXVzdCBiZSBhIHJlZmVyZW5jZSB0byBhcnJheSIgKTsKKyAgICB9OyAjIGlmCisKKyAgICBteSAkc3RkaW4gID0geyBoYW5kbGUgPT4gXCpTVERJTiwgIG1vZGUgPT4gIjwiIH07CisgICAgbXkgJHN0ZG91dCA9IHsgaGFuZGxlID0+IFwqU1RET1VULCBtb2RlID0+ICI+IiB9OworICAgIG15ICRzdGRlcnIgPSB7IGhhbmRsZSA9PiBcKlNUREVSUiwgbW9kZSA9PiAiPiIgfTsKKyAgICBteSAkc3RyZWFtcyA9IHsKKyAgICAgICAgc3RkaW4gID0+ICRzdGRpbiwKKyAgICAgICAgc3Rkb3V0ID0+ICRzdGRvdXQsCisgICAgICAgIHN0ZGVyciA9PiAkc3RkZXJyCisgICAgfTsgIyAkc3RyZWFtcworCisgICAgZm9yIG15ICRzdHJlYW0gKCBxdyggc3RkaW4gc3Rkb3V0IHN0ZGVyciApICkgeworICAgICAgICBpZiAoIGV4aXN0cyggJG9wdHN7ICItJHN0cmVhbSIgfSApICkgeworICAgICAgICAgICAgaWYgKCByZWYoICRvcHRzeyAiLSRzdHJlYW0iIH0gKSAhfiBtL1xBKHxTQ0FMQVJ8QVJSQVkpXHovICkgeworICAgICAgICAgICAgICAgIENhcnA6OmNyb2FrKCAiZXhlY3V0ZTogLSRzdHJlYW0gb3B0aW9uOiBtdXN0IGhhdmUgdmFsdWUgb2Ygc2NhbGFyLCBvciByZWZlcmVuY2UgdG8gKHNjYWxhciBvciBhcnJheSkuIiApOworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgJHN0cmVhbXMtPnsgJHN0cmVhbSB9LT57IHJlZGlyIH0gPSAkb3B0c3sgIi0kc3RyZWFtIiB9OworICAgICAgICB9OyAjIGlmCisgICAgICAgIGlmICggJG9wdHN7IC1hcHBlbmQgfSBhbmQgKCAkc3RyZWFtcy0+eyAkc3RyZWFtIH0tPnsgbW9kZSB9ICkgZXEgIj4iICkgeworICAgICAgICAgICAgJHN0cmVhbXMtPnsgJHN0cmVhbSB9LT57IG1vZGUgfSA9ICI+PiI7CisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGZvcmVhY2ggJHN0cmVhbQorCisgICAgX3ByZSggJHN0ZGluICApOworICAgIF9wcmUoICRzdGRvdXQgKTsKKyAgICBpZiAoIGRlZmluZWQoICRzdGRlcnItPnsgcmVkaXIgfSApIGFuZCBub3QgcmVmKCAkc3RkZXJyLT57IHJlZGlyIH0gKSBhbmQgKCAkc3RkZXJyLT57IHJlZGlyIH0gZXEgIiIgKSApIHsKKyAgICAgICAgaWYgKCBleGlzdHMoICRzdGRvdXQtPnsgcmVkaXIgfSApICkgeworICAgICAgICAgICAgJHN0ZGVyci0+eyByZWRpciB9ID0gJHN0ZG91dC0+eyB0ZW1wX2hhbmRsZSB9OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJHN0ZGVyci0+eyByZWRpciB9ID0gJHsgJHN0ZG91dC0+eyBoYW5kbGUgfSB9OworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBpZgorICAgIF9wcmUoICRzdGRlcnIgKTsKKyAgICBteSAkcmMgPSBzeXN0ZW0oIEAkY29tbWFuZCApOworICAgIG15ICRlcnJubyA9ICQhOworICAgIG15ICRjaGlsZCA9ICQ/OworICAgIF9wb3N0KCAkc3RkZXJyICk7CisgICAgX3Bvc3QoICRzdGRvdXQgKTsKKyAgICBfcG9zdCggJHN0ZGluICApOworCisgICAgbXkgJGV4aXQgPSAwOworICAgIG15ICRzaWduYWxfbnVtICA9ICRjaGlsZCAmIDEyNzsKKyAgICBteSAkZXhpdF9zdGF0dXMgPSAkY2hpbGQgPj4gODsKKyAgICAkQCA9ICIiOworCisgICAgaWYgKCAkcmMgPT0gLTEgKSB7CisgICAgICAgICRAID0gIlwiJGNvbW1hbmQtPlsgMCBdXCIgZmFpbGVkOiAkZXJybm8iOworICAgICAgICAkZXhpdCA9IC0yNTY7CisgICAgICAgIGlmICggbm90ICRvcHRzeyAtaWdub3JlX3NpZ25hbCB9ICkgeworICAgICAgICAgICAgcnVudGltZV9lcnJvciggJEAgKTsKKyAgICAgICAgfTsgIyBpZgorICAgIH0gZWxzaWYgKCAkc2lnbmFsX251bSAhPSAwICkgeworICAgICAgICAkQCA9ICJcIiRjb21tYW5kLT5bIDAgXVwiIGZhaWxlZCBkdWUgdG8gc2lnbmFsICRzaWduYWxfbnVtLiI7CisgICAgICAgICRleGl0ID0gLSAkc2lnbmFsX251bTsKKyAgICAgICAgaWYgKCBub3QgJG9wdHN7IC1pZ25vcmVfc2lnbmFsIH0gKSB7CisgICAgICAgICAgICBydW50aW1lX2Vycm9yKCAkQCApOworICAgICAgICB9OyAjIGlmCisgICAgfSBlbHNpZiAoICRleGl0X3N0YXR1cyAhPSAwICkgeworICAgICAgICAkQCA9ICJcIiRjb21tYW5kLT5bIDAgXVwiIHJldHVybmVkIG5vbi16ZXJvIHN0YXR1cyAkZXhpdF9zdGF0dXMuIjsKKyAgICAgICAgJGV4aXQgPSAkZXhpdF9zdGF0dXM7CisgICAgICAgIGlmICggbm90ICRvcHRzeyAtaWdub3JlX3N0YXR1cyB9ICkgeworICAgICAgICAgICAgcnVudGltZV9lcnJvciggJEAgKTsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgaWYKKworICAgIHJldHVybiAkZXhpdDsKKworfTsgIyBzdWIgZXhlY3V0ZQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworPWl0ZW0gQzxiYWNrdGlja3MoIFsgQGNvbW1hbmQgXSwgQG9wdGlvbnMgKT4KKworUnVuIHNwZWNpZmllZCBwcm9ncmFtIG9yIHNoZWxsIGNvbW1hbmQgYW5kIHJldHVybiBvdXRwdXQuCisKK0luIHNjYWxhciBjb250ZXh0IGVudGlyZSBvdXRwdXQgaXMgcmV0dXJuZWQgaW4gYSBzaW5nbGUgc3RyaW5nLiBJbiBsaXN0IGNvbnRleHQgbGlzdCBvZiBzdHJpbmdzCitpcyByZXR1cm5lZC4gRnVuY3Rpb24gaXNzdWVzIGFuIGVycm9yIGFuZCBleGl0cyBzY3JpcHQgaWYgYW55IGVycm9yIG9jY3Vycy4KKworPWN1dAorCisKK3N1YiBiYWNrdGlja3MoJEApIHsKKworICAgIG15ICRjb21tYW5kID0gc2hpZnQoIEBfICk7CisgICAgbXkgJW9wdHMgICAgPSBAXzsKKyAgICBteSBAb3V0cHV0OworCisgICAgY2hlY2tfb3B0cyggJW9wdHMsIFsgcXcoIC1jaG9tcCApIF0gKTsKKworICAgIGV4ZWN1dGUoICRjb21tYW5kLCAtc3Rkb3V0ID0+IFxAb3V0cHV0ICk7CisKKyAgICBpZiAoICRvcHRzeyAtY2hvbXAgfSApIHsKKyAgICAgICAgY2hvbXAoIEBvdXRwdXQgKTsKKyAgICB9OyAjIGlmCisKKyAgICByZXR1cm4gKCB3YW50YXJyYXkoKSA/IEBvdXRwdXQgOiBqb2luKCAiIiwgQG91dHB1dCApICk7CisKK307ICMgc3ViIGJhY2t0aWNrcworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3ViIHBhZCgkJCQpIHsKKyAgICBteSAoICRzdHIsICRsZW5ndGgsICRwYWQgKSA9IEBfOworICAgIG15ICRsc3RyID0gbGVuZ3RoKCAkc3RyICk7ICAgICMgTGVuZ3RoIG9mIHNvdXJjZSBzdHJpbmcuCisgICAgaWYgKCAkbHN0ciA8ICRsZW5ndGggKSB7CisgICAgICAgIG15ICRscGFkICA9IGxlbmd0aCggJHBhZCApOyAgICAgICAgICAgICAgICAgICAgICAgICAjIExlbmd0aCBvZiBwYWQuCisgICAgICAgIG15ICRjb3VudCA9IGludCggKCAkbGVuZ3RoIC0gJGxzdHIgKSAvICRscGFkICk7ICAgICAjIE51bWJlciBvZiBwYWQgcmVwZXRpdGlvbnMuCisgICAgICAgIG15ICR0YWlsICA9ICRsZW5ndGggLSAoICRsc3RyICsgJGxwYWQgKiAkY291bnQgKTsKKyAgICAgICAgJHN0ciA9ICRzdHIgLiAoICRwYWQgeCAkY291bnQgKSAuIHN1YnN0ciggJHBhZCwgMCwgJHRhaWwgKTsKKyAgICB9OyAjIGlmCisgICAgcmV0dXJuICRzdHI7Cit9OyAjIHN1YiBwYWQKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis9YmFjaworCis9Y3V0CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCityZXR1cm4gMTsKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKz1jdXQKKworIyBFbmQgb2YgZmlsZS4KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdG9vbHMvbGludXguaW5jIGIvZmluYWwvcnVudGltZS90b29scy9saW51eC5pbmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FkMjUxMgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdG9vbHMvbGludXguaW5jCkBAIC0wLDAgKzEsMzUgQEAKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKKworIyMjIyMjIyBEZXRlY3Rpb25zIGFuZCBDb21tYW5kcyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitpZm5kZWYgYXJjaAorICAgICAgICB1bmFtZV9tOj0kKHNoZWxsIHVuYW1lIC1tKQorICAgICAgICBpZmVxICgkKHVuYW1lX20pLGk2ODYpCisgICAgICAgICAgICAgICAgZXhwb3J0IGFyY2g6PTMyCisgICAgICAgIGVuZGlmCisgICAgICAgIGlmZXEgKCQodW5hbWVfbSkseDg2XzY0KQorICAgICAgICAgICAgICAgIGV4cG9ydCBhcmNoOj0zMmUKKyAgICAgICAgZW5kaWYKKyAgICAgICAgaWZuZGVmIGFyY2gKKyAgICAgICAgICAgICAgICBleHBvcnQgYXJjaDo9JCh1bmFtZV9tKQorICAgICAgICBlbmRpZgorZW5kaWYKKworQ01EPXNoIC1jCitDV0Q9JChzaGVsbCBwd2QpCitDUD1jcAorUk0/PXJtIC1mCitSTVI/PXJtIC1yZgorUkQ/PXJtZGlyCitNRD89bWtkaXIgLXAKK05VTD0gL2Rldi9udWxsCitTTEFTSD0vCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rvb2xzL21hY29zLmluYyBiL2ZpbmFsL3J1bnRpbWUvdG9vbHMvbWFjb3MuaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4Zjg2YjEKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rvb2xzL21hY29zLmluYwpAQCAtMCwwICsxLDM3IEBACisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKKyMjIyMjIyMgRGV0ZWN0aW9ucyBhbmQgQ29tbWFuZHMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworaWZuZGVmIGFyY2gKKyBpZmVxICgkKHNoZWxsIC91c3Ivc2Jpbi9zeXNjdGwgLW4gaHcubWFjaGluZSksUG93ZXIgTWFjaW50b3NoKQorICAgaWZlcSAoJChzaGVsbCAvdXNyL3NiaW4vc3lzY3RsIC1uIGh3Lm9wdGlvbmFsLjY0Yml0b3BzKSwxKQorICAgICBleHBvcnQgYXJjaDo9cHBjNjQKKyAgIGVsc2UKKyAgICAgZXhwb3J0IGFyY2g6PXBwYzMyCisgICBlbmRpZgorIGVsc2UKKyAgIGlmZXEgKCQoc2hlbGwgL3Vzci9zYmluL3N5c2N0bCAtbiBody5vcHRpb25hbC54ODZfNjQgMj4vZGV2L251bGwpLDEpCisgICAgIGV4cG9ydCBhcmNoOj1pbnRlbDY0CisgICBlbHNlCisgICAgIGV4cG9ydCBhcmNoOj1pYTMyCisgICBlbmRpZgorIGVuZGlmCitlbmRpZgorCitDTUQ9JChTSEVMTCkgLWMKK0NXRD0kKHNoZWxsIHB3ZCkKK1JNPz1ybSAtZgorUk1SPz1ybSAtcmYKK1JEPz1ybWRpcgorTUQ/PW1rZGlyIC1wCitOVUw9IC9kZXYvbnVsbAorU0xBU0g9LwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90b29scy9tYWtlLWZhdC1iaW5hcmllcy5wbCBiL2ZpbmFsL3J1bnRpbWUvdG9vbHMvbWFrZS1mYXQtYmluYXJpZXMucGwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZmE2NzBkNgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdG9vbHMvbWFrZS1mYXQtYmluYXJpZXMucGwKQEAgLTAsMCArMSwyMzQgQEAKKyMhL3Vzci9iaW4vZW52IHBlcmwKKworIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCit1c2UgSU86OkRpcjsKKwordXNlIEZpbmRCaW47Cit1c2UgbGliICIkRmluZEJpbjo6QmluL2xpYiI7CisKKwordXNlIHRvb2xzOworCitvdXIgJFZFUlNJT04gPSAiMC4wMDMiOworCisjCisjIFN1YnJvdXRpbmVzLgorIworCitzdWIgY2hlY2tfZGlyKCQkKSB7CisKKyAgICAjIE1ha2Ugc3VyZSBhIGRpcmVjdG9yeSBpcyBhIHJlYWRhYmxlIGRpcmVjdG9yeS4KKworICAgIG15ICggJGRpciwgJHR5cGUgKSA9IEBfOworCisgICAgLWUgJGRpciBvciBydW50aW1lX2Vycm9yKCAiRGlyZWN0b3J5IFwiJGRpclwiIGRvZXMgbm90IGV4aXN0IiApOworICAgIC1kICRkaXIgb3IgcnVudGltZV9lcnJvciggIlwiJGRpclwiIGlzIG5vdCBhIGRpcmVjdG9yeSIgKTsKKyAgICAtciAkZGlyIG9yIHJ1bnRpbWVfZXJyb3IoICJEaXJlY3RvcnkgXCIkZGlyXCIgaXMgbm90IHJlYWRhYmxlIiApOworCit9OyAjIHN1YiBjaGVja19kaXIKKworc3ViIHJlYWRfZGlyKCQpIHsKKworICAgICMgUmV0dXJuIGxpc3Qgb2YgZmlsZXMgKG5vdCBzdWJkaXJlY3Rvcmllcykgb2Ygc3BlY2lmaWVkIGRpcmVjdG9yeS4KKworICAgIG15ICggJGRpciApID0gQF87CisgICAgbXkgJGhhbmRsZTsKKyAgICBteSAkZW50cnk7CisgICAgbXkgQGZpbGVzOworCisgICAgJGhhbmRsZSA9IElPOjpEaXItPm5ldyggJGRpciApIG9yIHJ1bnRpbWVfZXJyb3IoICJDYW5ub3Qgb3BlbiBcIiRkaXJcIiBkaXJlY3Rvcnk6ICQhIiApOworICAgIHdoaWxlICggJGVudHJ5ID0gJGhhbmRsZS0+cmVhZCgpICkgeworICAgICAgICBteSAkcGF0aCA9ICIkZGlyLyRlbnRyeSI7CisgICAgICAgIGlmICggJGVudHJ5ICF+IG17XEFcLn0gYW5kIC1mICRwYXRoICkgeworICAgICAgICAgICAgcHVzaCggQGZpbGVzLCAkZW50cnkgKTsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgd2hpbGUKKyAgICAkaGFuZGxlLT5jbG9zZSgpOworCisgICAgQGZpbGVzID0gc29ydCggQGZpbGVzICk7CisgICAgcmV0dXJuIEBmaWxlczsKKworfTsgIyBzdWIgcmVhZF9kaXIKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBNYWluIHByb2dyYW0uCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMKKyMgUGFyc2UgY29tbWFuZCBsaW5lLgorIworbXkgQGRpcnM7ICAgICMgTGlzdCBvZiBpbnB1dCBkaXJlY3Rvcmllcy4KK215IEBmaWxlczsgICAjIExpc3Qgb2YgZmlsZXMuCitteSAkb3V0cHV0OyAgIyBPdXRwdXQgZGlyZWN0b3J5LgorCitnZXRfb3B0aW9ucygKKyAgICAib3V0cHV0PXMiID0+IFwkb3V0cHV0CispOworCitAQVJHViA9PSAwIGFuZCBjbWRsaW5lX2Vycm9yKCAiTm8gaW5wdXQgZGlyZWN0b3JpZXMgc3BlY2lmaWVkIiApOworCisjCisjIENoZWNrIGlucHV0IGFuZCBvdXRwdXQgZGlyZWN0b3JpZXMuCisjCisKKyMgTWFrZSBzaHVyZSB0aGVyZSBpcyBubyBkdXBsaWNhdGVkIGRpcmVjdG9yaWVzLgorbXkgJWRpcnM7CiskZGlyc3sgJG91dHB1dCB9ID0gIiI7Citmb3JlYWNoIG15ICRkaXIgKCBAQVJHViApIHsKKyAgICBpZiAoIGV4aXN0cyggJGRpcnN7ICRkaXIgfSApICkgeworICAgICAgICBjbWRsaW5lX2Vycm9yKCAiRGlyZWN0b3J5IFwiJGRpclwiIGhhcyBhbHJlYWR5IGJlZW4gc3BlY2lmaWVkIiApOworICAgIH07ICMgaWYKKyAgICAkZGlyc3sgJGRpciB9ID0gIiI7CisgICAgcHVzaCggQGRpcnMsICRkaXIgKTsKK307ICMgZm9yZWFjaCAkZGlyCit1bmRlZiggJWRpcnMgKTsKKworIyBNYWtlIHN1cmUgYWxsIGRpcnMgYXJlIGV4aXN0LCBkaXJzLCBhbmQgcmVhZGFibGUuCitjaGVja19kaXIoICRvdXRwdXQsICJvdXRwdXQiICk7Citmb3JlYWNoIG15ICRkaXIgKCBAZGlycyApIHsKKyAgICBjaGVja19kaXIoICRkaXIsICAiaW5wdXQiICk7Cit9OyAjIGZvcmVhY2ggJGRpcgorCisjIEFsbCBpbnB1dCBkaXJzIHNob3VsZCBjb250YWluIGV4YWN0bHkgdGhlIHNhbWUgbGlzdCBvZiBmaWxlcy4KK215IEBlcnJvcnM7CitAZmlsZXMgPSByZWFkX2RpciggJGRpcnNbIDAgXSApOworZm9yZWFjaCBteSAkZGlyICggQGRpcnMgKSB7CisgICAgbXkgJWZpbGVzID0gbWFwKCAoICRfID0+IDAgKSwgQGZpbGVzICk7CisgICAgZm9yZWFjaCBteSAkZmlsZSAoIHJlYWRfZGlyKCAkZGlyICkgKSB7CisgICAgICAgIGlmICggbm90IGV4aXN0cyggJGZpbGVzeyAkZmlsZSB9ICkgKSB7CisgICAgICAgICAgICBwdXNoKCBAZXJyb3JzLCAiRXh0cmEgZmlsZTogYCIgLiBjYXRfZmlsZSggJGRpciwgJGZpbGUgKSAuICInLiIgKTsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICAkZmlsZXN7ICRmaWxlIH0gPSAxOworICAgIH07ICMgZm9yZWFjaCAkZmlsZQorICAgIGZvcmVhY2ggbXkgJGZpbGUgKCBrZXlzKCAlZmlsZXMgKSApIHsKKyAgICAgICAgaWYgKCAkZmlsZXN7ICRmaWxlIH0gPT0gMCApIHsKKyAgICAgICAgICAgIHB1c2goIEBlcnJvcnMsICJNaXNzZWQgZmlsZTogYCIgLiBjYXRfZmlsZSggJGRpciwgJGZpbGUgKSAuICInLiIgKTsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgZm9yZWFjaCAkZmlsZQorfTsgIyBmb3JlYWNoICRkaXIKK2lmICggQGVycm9ycyApIHsKKyAgICBydW50aW1lX2Vycm9yKCBAZXJyb3JzICk7Cit9OyAjIGlmCisKKyMKKyMgTWFrZSBmYXQgYmluYXJpZXMuCisjCisKK2ZvcmVhY2ggbXkgJGZpbGUgKCBzb3J0KCBAZmlsZXMgKSApIHsKKyAgICBpbmZvKCAiTWFraW5nIFwiJGZpbGVcIi4uLiIgKTsKKyAgICBteSAkb3V0cHV0X2ZpbGUgPSBjYXRfZmlsZSggJG91dHB1dCwgJGZpbGUgKTsKKyAgICBkZWxfZmlsZSggJG91dHB1dF9maWxlICk7CisgICAgZXhlY3V0ZSgKKyAgICAgICAgWworICAgICAgICAgICAgImxpcG8iLAorICAgICAgICAgICAgIi1jcmVhdGUiLAorICAgICAgICAgICAgIi1vdXRwdXQiLCAkb3V0cHV0X2ZpbGUsCisgICAgICAgICAgICBtYXAoIGNhdF9maWxlKCAkXywgJGZpbGUgKSwgQGRpcnMgKQorICAgICAgICBdCisgICAgKTsKK307ICMgZm9yZWFjaCAkZW50cnkKKworZXhpdCggMCApOworCitfX0VORF9fCisKKz1wb2QKKworPWhlYWQxIE5BTUUKKworQjxtYWtlLWZhdC1iaW5hcmllcy5wbD4gLS0gTWFrZSBzZXQgb2YgZmF0ICh1bml2ZXJzYWwpIGJpbmFyaWVzLgorCis9aGVhZDEgU1lOT1BTSVMKKworQjxtYWtlLWZhdC1iaW5hcmllcy5wbD4gSTxPUFRJT04+Li4uIEk8SU5QVVRfRElSPi4uLgorCis9aGVhZDEgT1BUSU9OUworCis9b3ZlcgorCis9aXRlbSBCPC0tb3V0cHV0PT5JPERJUj4KKworTmFtZSBvZiBvdXRwdXQgZGlyZWN0b3J5IHRvIHBsYWNlIGZhdCBiaW5hcmllcyB0by4gRGlyZWN0b3J5IG11c3QgZXhpc3QgYW5kIGJlIHdyaXRhYmxlLgorCis9aXRlbSBTdGFuZGFyZCBPcHRpb25zCisKKz1vdmVyCisKKz1pdGVtIEI8LS1kb2M+CisKKz1pdGVtIEI8LS1tYW51YWw+CisKK1ByaW50IGZ1bGwgaGVscCBtZXNzYWdlIGFuZCBleGl0LgorCis9aXRlbSBCPC0taGVscD4KKworUHJpbnQgc2hvcnQgaGVscCBtZXNzYWdlIGFuZCBleGl0LgorCis9aXRlbSBCPC0tdXNhZ2U+CisKK1ByaW50IHZlcnkgc2hvcnQgdXNhZ2UgbWVzc2FnZSBhbmQgZXhpdC4KKworPWl0ZW0gQjwtLXZlcmJvc2U+CisKK0RvIHByaW50IGluZm9ybWF0aW9uYWwgbWVzc2FnZXMuCisKKz1pdGVtIEI8LS12ZXJzaW9uPgorCitQcmludCBwcm9ncmFtIHZlcnNpb24gYW5kIGV4aXQuCisKKz1pdGVtIEI8LS1xdWlldD4KKworV29yayBxdWlldCwgZG8gbm90IHByaW50IGluZm9ybWF0aW9uYWwgbWVzc2FnZXMuCisKKz1iYWNrCisKKz1iYWNrCisKKz1oZWFkMSBBUkdVTUVOVFMKKworPW92ZXIKKworPWl0ZW0gSTxJTlBVVF9ESVI+CisKK05hbWUgb2YgaW5wdXQgZGlyZWN0b3J5IHRvIGdldCB0aGluIGZpbGVzIGZyb20uIERpcmVjdG9yeSBtdXN0IGV4aXN0IGFuZCBiZSByZWFkYWJsZS4gQXQgbGVhc3Qgb25lCitkaXJlY3RvcnkgcmVxdWlyZWQuCisKKz1iYWNrCisKKz1oZWFkMSBERVNDUklQVElPTgorCitUaGUgc2NyaXB0IGNyZWF0ZXMgc2V0IG9mIE1hYy1PIGZhdCAodW5pdmVyc2FsLCBtdWx0aS1hcmNoaXRlY3R1cmUpIGJpbmFyaWVzIGZyb20gc2V0IG9mIHRoaW4KKyhzaW5nbGUtYXJjaGl0ZWN0dXJlKSBmaWxlcy4KKworVGhlIHNjcmlwdHMgcmVhZHMgZmlsZXMgZnJvbSBpbnB1dCBkaXJlY3RvcnkgKG9yIGRpcmVjdG9yaWVycykuIEl0IGlzIGFzc3VtZWQgdGhhdCBvbmUgaW5wdXQKK2RpcmVjdG9yeSBrZWVwcyBmaWxlcyBmb3Igb25lIGFyY2hpdGVjdHVyZSAoZS4gZy4gaTM4NiksIGFub3RoZXIgZGlyZWN0b3J5IGNvbnRhaW5zIGZpbGVzIGZvcgorYW5vdGhlciBhcmNoaXRlY3R1cmUgKGUuIGcuIHg4Nl82NCksIGV0Yy4gQWxsIGlucHV0IGRpcmVjdG9yaWVzIG11c3QgY29udGFpbiB0aGUgc2FtZSBzZXQgb2YgZmlsZXMuCitUaGUgc2NyaXB0IGlzc3VlcyBhbiBlcnJvciBpZiBzZXRzIG9mIGZpbGVzIGluIGlucHV0IGRpcmVjdG9yaWVzIGRpZmZlci4KKworSWYgdGhlIHNjcmlwdCBmaW5pc2hlcyBzdWNjZXNzZnVseSwgb3V0cHV0IGRpcmVjdG9yeSB3aWxsIGNvbnRhaW4gdGhlIHNldCB1bml2ZXJzYWwgYmluYXJpZXMKK2J1aWx0IGZyb20gZmlsZXMgd2l0aCB0aGUgc2FtZSBuYW1lIGluIGlucHV0IGRpcmVjdG9yaWVzLgorCis9aGVhZDEgRVhBTVBMRVMKKworR2V0IHRoaW4gYmluYXJpZXMgZnJvbSBDPG1hY18zMi50aGluLz4gYW5kIEM8bWFjXzMyZS50aGluLz4gZGlyZWN0b3JpZXMsIGFuZCBwdXQgZmF0IGJpbmFyaWVzIHRvCitDPG1hYy5mYXQvPiBkaXJlY3Rvcnk6CisKKyAgICAkIG1ha2UtZmF0LWJpbmFyaWVzLnBsIC0tb3V0cHV0PW1hYy5mYXQgbWFjXzMyLnRoaW4gbWFjXzMyZS50aGluCisKKworPWN1dAorCisjIGVuZCBvZiBmaWxlICMKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdG9vbHMvbWVzc2FnZS1jb252ZXJ0ZXIucGwgYi9maW5hbC9ydW50aW1lL3Rvb2xzL21lc3NhZ2UtY29udmVydGVyLnBsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjM4MmY0MmUKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rvb2xzL21lc3NhZ2UtY29udmVydGVyLnBsCkBAIC0wLDAgKzEsNzc1IEBACisjIS91c3IvYmluL3BlcmwKKworIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCit1c2UgRmlsZTo6R2xvYiAiOmdsb2IiOwordXNlIEVuY29kZSBxd3sgZW5jb2RlIH07CisKK3VzZSBGaW5kQmluOwordXNlIGxpYiAiJEZpbmRCaW46OkJpbi9saWIiOworCit1c2UgdG9vbHM7Cit1c2UgUGxhdGZvcm0gIjp2YXJzIjsKKworb3VyICRWRVJTSU9OID0gIjAuMDQiOworbXkgJGVzY2FwZSAgICAgID0gcXJ7JX07CitteSAkcGxhY2Vob2xkZXIgPSBxcnsoXGQpXCQoc3xsP1tkdV0pfTsKKworbXkgJHNlY3Rpb25zID0KKyAgICB7CisgICAgICAgIG1ldGEgICAgID0+IHsgc2hvcnQgPT4gInBycCIgfSwgIyAicHJwIiBzdGFuZHMgZm9yICJwcm9wZXJ0eSIuCisgICAgICAgIHN0cmluZ3MgID0+IHsgc2hvcnQgPT4gInN0ciIgfSwKKyAgICAgICAgZm9ybWF0cyAgPT4geyBzaG9ydCA9PiAiZm10IiB9LAorICAgICAgICBtZXNzYWdlcyA9PiB7IHNob3J0ID0+ICJtc2ciIH0sCisgICAgICAgIGhpbnRzICAgID0+IHsgc2hvcnQgPT4gImhudCIgfSwKKyAgICB9OworbXkgQHNlY3Rpb25zID0gcXd7IG1ldGEgc3RyaW5ncyBmb3JtYXRzIG1lc3NhZ2VzIGhpbnRzIH07CisjIEFzc2lnbiBzZWN0aW9uIHByb3BlcnRpZXM6IGxvbmcgbmFtZSwgc2V0IG51bWJlciwgYmFzZSBudW1iZXIuCittYXAoICRzZWN0aW9ucy0+eyAkc2VjdGlvbnNbICRfIF0gfS0+eyBsb25nIH0gPSAkc2VjdGlvbnNbICRfIF0sICAgICAgKCAwIC4uIEBzZWN0aW9ucyAtIDEgKSApOworbWFwKCAkc2VjdGlvbnMtPnsgJHNlY3Rpb25zWyAkXyBdIH0tPnsgc2V0ICB9ID0gKCAkXyArIDEgKSwgICAgICAgICAgICggMCAuLiBAc2VjdGlvbnMgLSAxICkgKTsKK21hcCggJHNlY3Rpb25zLT57ICRzZWN0aW9uc1sgJF8gXSB9LT57IGJhc2UgfSA9ICggKCAkXyArIDEgKSA8PCAxNiApLCAoIDAgLi4gQHNlY3Rpb25zIC0gMSApICk7CisKKyMgUHJvcGVydGllcyBvZiBNZXRhIHNlY3Rpb24uCitteSBAcHJvcGVydGllcyA9IHF3eyBMYW5ndWFnZSBDb3VudHJ5IExhbmdJZCBWZXJzaW9uIFJldmlzaW9uIH07CisKKworc3ViIF9nZW5lcmF0ZV9jb21tZW50KCQkJCkgeworCisgICAgbXkgKCAkZGF0YSwgJG9wZW4sICRjbG9zZSApID0gQF87CisgICAgbXkgJGJ1bGsgPQorICAgICAgICAkb3BlbiAuICIgRG8gbm90IGVkaXQgdGhpcyBmaWxlISAiIC4gJGNsb3NlIC4gIlxuIiAuCisgICAgICAgICRvcGVuIC4gIiBUaGUgZmlsZSB3YXMgZ2VuZXJhdGVkIGZyb20gIiAuIGdldF9maWxlKCAkZGF0YS0+eyAiJW1ldGEiIH0tPnsgc291cmNlIH0gKSAuCisgICAgICAgICAgICAiIGJ5ICIgLiAkdG9vbCAuICIgb24gIiAuIGxvY2FsdGltZSgpIC4gIi4gIiAuICRjbG9zZSAuICJcbiI7CisgICAgcmV0dXJuICRidWxrOworCit9OyAjIHN1YiBfZ2VuZXJhdGVfY29tbWVudAorCisKK3N1YiBtc2cyc2duKCQpIHsKKworICAgICMgQ29udmVydCBtZXNzYWdlIHN0cmluZyB0byBzaWduYXR1cmUuIFNpZ25hdHVyZSBpcyBhIGxpc3Qgb2YgcGxhY2Vob2xkZXJzIGluIHNvcnRlZCBvcmRlci4KKyAgICAjIEZvciBleGFtcGxlLCBzaWduYXR1cmUgb2YgIiUxJHMgdmFsdWUgXCIlMiRzXCIgaXMgaW52YWxpZC4iIGlzICIlMSRzICUyJHMiLgorCisgICAgbXkgKCAkbXNnICkgPSBAXzsKKyAgICBteSBAcGxhY2Vob2xkZXJzOworICAgIHBvcyggJG1zZyApID0gMDsKKyAgICB3aGlsZSAoICRtc2cgPX4gbXtcRy4qPyRlc2NhcGUkcGxhY2Vob2xkZXJ9ZyApIHsKKyAgICAgICAgJHBsYWNlaG9sZGVyc1sgJDEgLSAxIF0gPSAiJSQxXCQkMiI7CisgICAgfTsgIyB3aGlsZQorICAgIGZvciAoIG15ICRpID0gMTsgJGkgPD0gQHBsYWNlaG9sZGVyczsgKysgJGkgKSB7CisgICAgICAgIGlmICggbm90IGRlZmluZWQoICRwbGFjZWhvbGRlcnNbICRpIC0gMSBdICkgKSB7CisgICAgICAgICAgICAkcGxhY2Vob2xkZXJzWyAkaSAtIDEgXSA9ICIlJGlcJC0iOworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBmb3IgJGkKKyAgICByZXR1cm4gam9pbiggIiAiLCBAcGxhY2Vob2xkZXJzICk7CisKK307ICMgc3ViIG1zZzJzZ24KKworCitzdWIgbXNnMnNyYygkKSB7CisKKyAgICAjIENvbnZlcnQgbWVzc2FnZSBzdHJpbmcgdG8gYSBDIHN0cmluZyBjb25zdGFudC4KKworICAgIG15ICggJG1zZyApID0gQF87CisgICAgaWYgKCAkdGFyZ2V0X29zIGVxICJ3aW4iICkgeworICAgICAgICAkbXNnID1+IHN7JGVzY2FwZSRwbGFjZWhvbGRlcn17XCUkMSEkMiF9ZzsKKyAgICB9OyAjIGlmCisgICAgcmV0dXJuICRtc2c7CisKK307ICMgc3ViIG1zZzJzcmMKKworCitteSAkc3BlY2lhbCA9CisgICAgeworICAgICAgICAibiIgPT4gIlxuIiwKKyAgICAgICAgInQiID0+ICJcdCIsCisgICAgfTsKKworc3ViIG1zZzJtYygkKSB7CisgICAgbXkgKCAkbXNnICkgPSBAXzsKKyAgICAkbXNnID0gbXNnMnNyYyggJG1zZyApOyAjIEdldCB3aW5kb3dzIHN0eWxlIHBsYWNlaG9sZGVycy4KKyAgICAkbXNnID1+IHN7XFwoLil9eyBleGlzdHMoICRzcGVjaWFsLT57ICQxIH0gKSA/ICRzcGVjaWFsLT57ICQxIH0gOiAkMSB9Z2U7CisgICAgcmV0dXJuICRtc2c7Cit9OyAjIHN1YiBtc2cybWMKKworCisKK3N1YiBwYXJzZV9tZXNzYWdlKCQpIHsKKworICAgIG15ICggJG1zZyApID0gQF87CisgICAgcG9zKCAkbXNnICkgPSAwOworICAgIGZvciAoIDsgOyApIHsKKyAgICAgICAgaWYgKCAkbXNnICF+IG17XEcuKj8kZXNjYXBlfWdjICkgeworICAgICAgICAgICAgbGFzdDsKKyAgICAgICAgfQorICAgICAgICBpZiAoICRtc2cgIX4gbXtcRyRwbGFjZWhvbGRlcn1nYyApIHsKKyAgICAgICAgICAgIHJldHVybiAiQmFkICUtc2VxdWVuY2UgbmVhciBcIiUiIC4gc3Vic3RyKCAkbXNnLCBwb3MoICRtc2cgKSwgNyApIC4gIlwiIjsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgZm9yZXZlcgorICAgIHJldHVybiB1bmRlZjsKKworfTsgIyBzdWIgcGFyc2VfbWVzc2FnZQorCisKK3N1YiBwYXJzZV9zb3VyY2UoJCkgeworCisgICAgbXkgKCAkbmFtZSApID0gQF87CisKKyAgICBteSBAYnVsayA9IHJlYWRfZmlsZSggJG5hbWUsIC1sYXllciA9PiAiOnV0ZjgiICk7CisgICAgbXkgJGRhdGEgPSB7fTsKKworICAgIG15ICRsaW5lOworICAgIG15ICRuID0gMDsgICAgICAgICAjIExpbmUgbnVtYmVyLgorICAgIG15ICRvYnNvbGV0ZSA9IDA7ICAjIENvdW50ZXIgb2Ygb2Jzb2xldGUgZW50cmllcy4KKyAgICBteSAkbGFzdF9pZHg7CisgICAgbXkgJWlkZW50czsKKyAgICBteSAkc2VjdGlvbjsKKworICAgIG15ICRlcnJvciA9CisgICAgICAgIHN1YiB7CisgICAgICAgICAgICBteSAoICRuLCAkbGluZSwgJG1zZyApID0gQF87CisgICAgICAgICAgICBydW50aW1lX2Vycm9yKCAiRXJyb3IgcGFyc2luZyAkbmFtZSBsaW5lICRuOiAiIC4gIiRtc2c6XG4iIC4gIiAgICAkbGluZSIgKTsKKyAgICAgICAgfTsgIyBzdWIKKworICAgIGZvcmVhY2ggJGxpbmUgKCBAYnVsayApIHsKKyAgICAgICAgKysgJG47CisgICAgICAgICMgU2tpcCBlbXB0eSBsaW5lcyBhbmQgY29tbWVudHMuCisgICAgICAgIGlmICggJGxpbmUgPX4gbXtcQVxzKihcbnwjKX0gKSB7CisgICAgICAgICAgICAkbGFzdF9pZHggPSB1bmRlZjsKKyAgICAgICAgICAgIG5leHQ7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgIyBQYXJzZSBzZWN0aW9uIGhlYWRlci4KKyAgICAgICAgaWYgKCAkbGluZSA9fiBte1xBLVwqLVxzKihbQS1aX10qKVxzKi1cKi1ccypcblx6fWkgKSB7CisgICAgICAgICAgICAkc2VjdGlvbiA9ICggbGMoICQxICkgKTsKKyAgICAgICAgICAgIGlmICggbm90IGdyZXAoICRzZWN0aW9uIGVxICRfLCBAc2VjdGlvbnMgKSApIHsKKyAgICAgICAgICAgICAgICAkZXJyb3ItPiggJG4sICRsaW5lLCAiVW5rbm93biBzZWN0aW9uIFwiJHNlY3Rpb25cIiBzcGVjaWZpZWQiICk7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICBpZiAoIGV4aXN0cyggJGRhdGEtPnsgJHNlY3Rpb24gfSApICkgeworICAgICAgICAgICAgICAgICRlcnJvci0+KCAkbiwgJGxpbmUsICJNdWx0aXBsZSBzZWN0aW9ucyBvZiB0aGUgc2FtZSB0eXBlIHNwZWNpZmllZCIgKTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgICVpZGVudHMgPSAoKTsgICAgICMgQ2xlYW4gbGlzdCBvZiBrbm93biBtZXNzYWdlIGlkZW50aWZpZXJzLgorICAgICAgICAgICAgbmV4dDsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICBpZiAoIG5vdCBkZWZpbmVkKCAkc2VjdGlvbiApICkgeworICAgICAgICAgICAgJGVycm9yLT4oICRuLCAkbGluZSwgIlNlY3Rpb24gaGVhZGluZyBleHBlY3RlZCIgKTsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICAjIFBhcnNlIHNlY3Rpb24gYm9keS4KKyAgICAgICAgaWYgKCAkc2VjdGlvbiBlcSAibWV0YSIgKSB7CisgICAgICAgICAgICBpZiAoICRsaW5lID1+IG17XEEoW0EtWl9dW0EtWl8wLTldKilccysiKC4qKSJccyo/XG4/XHp9aSApIHsKKyAgICAgICAgICAgICAgICAjIFBhcnNlIG1ldGEgcHJvcGVydGllcyAoc3VjaCBhcyBMYW5ndWFnZSwgQ291bnRyeSwgYW5kIExhbmdJZCkuCisgICAgICAgICAgICAgICAgbXkgKCAkcHJvcGVydHksICR2YWx1ZSApID0gKCAkMSwgJDIgKTsKKyAgICAgICAgICAgICAgICBpZiAoIG5vdCBncmVwKCAkXyBlcSAkcHJvcGVydHkgLCBAcHJvcGVydGllcyApICkgeworICAgICAgICAgICAgICAgICAgICAkZXJyb3ItPiggJG4sICRsaW5lLCAiVW5rbm93biBwcm9wZXJ0eSBcIiRwcm9wZXJ0eVwiIHNwZWNpZmllZCIgKTsKKyAgICAgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICAgICAgaWYgKCBleGlzdHMoICRkYXRhLT57ICIlbWV0YSIgfS0+eyAkcHJvcGVydHkgfSApICkgeworICAgICAgICAgICAgICAgICAgICAkZXJyb3ItPiggJG4sICRsaW5lLCAiUHJvcGVydHkgXCIkcHJvcGVydHlcIiBoYXMgYWxyZWFkeSBiZWVuIHNwZWNpZmllZCIgKTsKKyAgICAgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICAgICAgJGRhdGEtPnsgIiVtZXRhIiB9LT57ICRwcm9wZXJ0eSB9ID0gJHZhbHVlOworICAgICAgICAgICAgICAgICRsYXN0X2lkeCA9IHVuZGVmOworICAgICAgICAgICAgICAgIG5leHQ7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICAkZXJyb3ItPiggJG4sICRsaW5lLCAiUHJvcGVydHkgbGluZSBleHBlY3RlZCIgKTsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICAjIFBhcnNlIG1lc3NhZ2UuCisgICAgICAgIGlmICggJGxpbmUgPX4gbXtcQShbQS1aX11bQS1aXzAtOV0qKVxzKyIoLiopIlxzKj9cbj9cen1pICkgeworICAgICAgICAgICAgbXkgKCAkaWRlbnQsICRtZXNzYWdlICkgPSAoICQxLCAkMiApOworICAgICAgICAgICAgaWYgKCAkaWRlbnQgZXEgIk9CU09MRVRFIiApIHsKKyAgICAgICAgICAgICAgICAjIElmIGlkIGlzICJPQlNPTEVURSIsIGFkZCBhIHVuaXF1ZSBzdWZmaXguIEl0IHByb3ZpZGVzIGNvbnZlbmllbnQgd2F5IHRvIG1hcmsKKyAgICAgICAgICAgICAgICAjIG9ic29sZXRlIG1lc3NhZ2VzLgorICAgICAgICAgICAgICAgICsrICRvYnNvbGV0ZTsKKyAgICAgICAgICAgICAgICAkaWRlbnQgLj0gJG9ic29sZXRlOworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgaWYgKCBleGlzdHMoICRpZGVudHN7ICRpZGVudCB9ICkgKSB7CisgICAgICAgICAgICAgICAgJGVycm9yLT4oICRuLCAkbGluZSwgIklkZW50aWZpZXIgXCIkaWRlbnRcIiBpcyByZWRlZmluZWQiICk7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICAjIENoZWNrICUtc2VxdWVuY2VzLgorICAgICAgICAgICAgbXkgJGVyciA9IHBhcnNlX21lc3NhZ2UoICRtZXNzYWdlICk7CisgICAgICAgICAgICBpZiAoICRlcnIgKSB7CisgICAgICAgICAgICAgICAgJGVycm9yLT4oICRuLCAkbGluZSwgJGVyciApOworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgIyBTYXZlIG1lc3NhZ2UuCisgICAgICAgICAgICBwdXNoKCBAeyAkZGF0YS0+eyAkc2VjdGlvbiB9IH0sIFsgJGlkZW50LCAkbWVzc2FnZSBdICk7CisgICAgICAgICAgICAkaWRlbnRzeyAkaWRlbnQgfSA9IDE7CisgICAgICAgICAgICAkbGFzdF9pZHggPSBAeyAkZGF0YS0+eyAkc2VjdGlvbiB9IH0gLSAxOworICAgICAgICAgICAgbmV4dDsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICAjIFBhcnNlIGNvbnRpbnVhdGlvbiBsaW5lLgorICAgICAgICBpZiAoICRsaW5lID1+IG17XEFccyoiKC4qKSJccypcen0gKSB7CisgICAgICAgICAgICBteSAkbWVzc2FnZSA9ICQxOworICAgICAgICAgICAgaWYgKCBub3QgZGVmaW5lZCggJGxhc3RfaWR4ICkgICkgeworICAgICAgICAgICAgICAgICRlcnJvci0+KCAkbiwgJGxpbmUsICJVbmV4cGVjdGVkIGNvbnRpbnVhdGlvbiBsaW5lIiApOworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgIyBDaGVjayAlLXNlcXVlbmNlcy4KKyAgICAgICAgICAgIG15ICRlcnIgPSBwYXJzZV9tZXNzYWdlKCAkbWVzc2FnZSApOworICAgICAgICAgICAgaWYgKCAkZXJyICkgeworICAgICAgICAgICAgICAgICRlcnJvci0+KCAkbiwgJGxpbmUsICRlcnIgKTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgICMgU2F2ZSBjb250aW51YXRpb24uCisgICAgICAgICAgICAkZGF0YS0+eyAkc2VjdGlvbiB9LT5bICRsYXN0X2lkeCBdLT5bIDEgXSAuPSAkbWVzc2FnZTsKKyAgICAgICAgICAgIG5leHQ7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgJGVycm9yLT4oICRuLCAkbGluZSwgIk1lc3NhZ2UgZGVmaW5pdGlvbiBleHBlY3RlZCIgKTsKKyAgICB9OyAjIGZvcmVhY2gKKyAgICAkZGF0YS0+eyAiJW1ldGEiIH0tPnsgc291cmNlIH0gPSAkbmFtZTsKKyAgICBmb3JlYWNoIG15ICRzZWN0aW9uICggQHNlY3Rpb25zICkgeworICAgICAgICBpZiAoIG5vdCBleGlzdHMoICRkYXRhLT57ICRzZWN0aW9uIH0gKSApIHsKKyAgICAgICAgICAgICRkYXRhLT57ICRzZWN0aW9uIH0gPSBbXTsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgZm9yZWFjaCAkc2VjdGlvbgorCisgICAgZm9yZWFjaCBteSAkcHJvcGVydHkgKCBAcHJvcGVydGllcyApIHsKKyAgICAgICAgaWYgKCBub3QgZGVmaW5lZCggJGRhdGEtPnsgIiVtZXRhIiB9LT57ICRwcm9wZXJ0eSB9ICkgKSB7CisgICAgICAgICAgICBydW50aW1lX2Vycm9yKAorICAgICAgICAgICAgICAgICJFcnJvciBwYXJzaW5nICRuYW1lOiAiIC4KKyAgICAgICAgICAgICAgICAgICAgIlJlcXVpcmVkIFwiJHByb3BlcnR5XCIgcHJvcGVydHkgaXMgbm90IHNwZWNpZmllZCIKKyAgICAgICAgICAgICk7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgcHVzaCggQHsgJGRhdGEtPnsgbWV0YSB9IH0sIFsgJHByb3BlcnR5LCAkZGF0YS0+eyAiJW1ldGEiIH0tPnsgJHByb3BlcnR5IH0gXSApOworICAgIH07ICMgZm9yZWFjaAorCisgICAgcmV0dXJuICRkYXRhOworCit9OyAjIHN1YiBwYXJzZV9zb3VyY2UKKworCitzdWIgZ2VuZXJhdGVfZW51bSgkJCQpIHsKKworICAgIG15ICggJGRhdGEsICRmaWxlLCAkcHJlZml4ICkgPSBAXzsKKyAgICBteSAkYnVsayA9ICIiOworCisgICAgJGJ1bGsgPQorICAgICAgICBfZ2VuZXJhdGVfY29tbWVudCggJGRhdGEsICIvLyIsICIvLyIgKSAuCisgICAgICAgICJcbiIgLgorICAgICAgICAiZW51bSAke3ByZWZpeH1faWQge1xuXG4iIC4KKyAgICAgICAgIiAgICAvLyBBIHNwZWNpYWwgaWQgZm9yIGFic2VuY2Ugb2YgbWVzc2FnZS5cbiIgLgorICAgICAgICAiICAgICR7cHJlZml4fV9udWxsID0gMCxcblxuIjsKKworICAgIGZvcmVhY2ggbXkgJHNlY3Rpb24gKCBAc2VjdGlvbnMgKSB7CisgICAgICAgIG15ICRwcm9wcyA9ICRzZWN0aW9ucy0+eyAkc2VjdGlvbiB9OyAgICAjIFNlY3Rpb24gcHJvcGVydGllcy4KKyAgICAgICAgbXkgJHNob3J0ID0gJHByb3BzLT57IHNob3J0IH07ICAgICAgICAgICMgU2hvcnQgc2VjdGlvbiBuYW1lLCBmcmVxdWVudGx5IHVzZWQuCisgICAgICAgICRidWxrIC49CisgICAgICAgICAgICAiICAgIC8vIFNldCAjJHByb3BzLT57IHNldCB9LCAkcHJvcHMtPnsgbG9uZyB9LlxuIiAuCisgICAgICAgICAgICAiICAgICR7cHJlZml4fV8ke3Nob3J0fV9maXJzdCA9ICRwcm9wcy0+eyBiYXNlIH0sXG4iOworICAgICAgICBmb3JlYWNoIG15ICRpdGVtICggQHsgJGRhdGEtPnsgJHNlY3Rpb24gfSB9ICkgeworICAgICAgICAgICAgbXkgKCAkaWRlbnQsIHVuZGVmICkgPSBAJGl0ZW07CisgICAgICAgICAgICAkYnVsayAuPSAiICAgICR7cHJlZml4fV8ke3Nob3J0fV8ke2lkZW50fSxcbiI7CisgICAgICAgIH07ICMgZm9yZWFjaAorICAgICAgICAkYnVsayAuPSAiICAgICR7cHJlZml4fV8ke3Nob3J0fV9sYXN0LFxuXG4iOworICAgIH07ICMgZm9yZWFjaCAkdHlwZQorICAgICRidWxrIC49ICIgICAgJHtwcmVmaXh9X3h4eF9sYXN0ZXN0XG5cbiI7CisKKyAgICAkYnVsayAuPQorICAgICAgICAifTsgLy8gZW51bSAke3ByZWZpeH1faWRcbiIgLgorICAgICAgICAiXG4iIC4KKyAgICAgICAgInR5cGVkZWYgZW51bSAke3ByZWZpeH1faWQgICR7cHJlZml4fV9pZF90O1xuIiAuCisgICAgICAgICJcbiI7CisKKyAgICAkYnVsayAuPQorICAgICAgICAiXG4iIC4KKyAgICAgICAgIi8vIGVuZCBvZiBmaWxlIC8vXG4iOworCisgICAgd3JpdGVfZmlsZSggJGZpbGUsIFwkYnVsayApOworCit9OyAjIHN1YiBnZW5lcmF0ZV9lbnVtCisKKworc3ViIGdlbmVyYXRlX3NpZ25hdHVyZSgkJCkgeworCisgICAgbXkgKCAkZGF0YSwgJGZpbGUgKSA9IEBfOworICAgIG15ICRidWxrID0gIiI7CisKKyAgICAkYnVsayAuPSAiLy8gbWVzc2FnZSBjYXRhbG9nIHNpZ25hdHVyZSBmaWxlIC8vXG5cbiI7CisKKyAgICBmb3JlYWNoIG15ICRzZWN0aW9uICggQHNlY3Rpb25zICkgeworICAgICAgICBteSAkcHJvcHMgPSAkc2VjdGlvbnMtPnsgJHNlY3Rpb24gfTsgICAgIyBTZWN0aW9uIHByb3BlcnRpZXMuCisgICAgICAgIG15ICRzaG9ydCA9ICRwcm9wcy0+eyBzaG9ydCB9OyAgICAgICAgICAjIFNob3J0IHNlY3Rpb24gbmFtZSwgZnJlcXVlbnRseSB1c2VkLgorICAgICAgICAkYnVsayAuPSAiLSotICIgLiB1YyggJHByb3BzLT57IGxvbmcgfSApIC4gIi0qLVxuXG4iOworICAgICAgICBmb3JlYWNoIG15ICRpdGVtICggQHsgJGRhdGEtPnsgJHNlY3Rpb24gfSB9ICkgeworICAgICAgICAgICAgbXkgKCAkaWRlbnQsICRtc2cgKSA9IEAkaXRlbTsKKyAgICAgICAgICAgICRidWxrIC49IHNwcmludGYoICIlLTQwcyAlc1xuIiwgJGlkZW50LCBtc2cyc2duKCAkbXNnICkgKTsKKyAgICAgICAgfTsgIyBmb3JlYWNoCisgICAgICAgICRidWxrIC49ICJcbiI7CisgICAgfTsgIyBmb3JlYWNoICR0eXBlCisKKyAgICAkYnVsayAuPSAiLy8gZW5kIG9mIGZpbGUgLy9cbiI7CisKKyAgICB3cml0ZV9maWxlKCAkZmlsZSwgXCRidWxrICk7CisKK307ICMgc3ViIGdlbmVyYXRlX3NpZ25hdHVyZQorCisKK3N1YiBnZW5lcmF0ZV9kZWZhdWx0KCQkJCkgeworCisgICAgbXkgKCAkZGF0YSwgJGZpbGUsICRwcmVmaXggKSA9IEBfOworICAgIG15ICRidWxrID0gIiI7CisKKyAgICAkYnVsayAuPQorICAgICAgICBfZ2VuZXJhdGVfY29tbWVudCggJGRhdGEsICIvLyIsICIvLyIgKSAuCisgICAgICAgICJcbiI7CisKKyAgICBmb3JlYWNoIG15ICRzZWN0aW9uICggQHNlY3Rpb25zICkgeworICAgICAgICAkYnVsayAuPQorICAgICAgICAgICAgInN0YXRpYyBjaGFyIGNvbnN0ICpcbiIgLgorICAgICAgICAgICAgIl9fJHtwcmVmaXh9X2RlZmF1bHRfJHtzZWN0aW9ufSIgLiAiW10gPVxuIiAuCisgICAgICAgICAgICAiICAgIHtcbiIgLgorICAgICAgICAgICAgIiAgICAgICAgTlVMTCxcbiI7CisgICAgICAgIGZvcmVhY2ggbXkgJGl0ZW0gKCBAeyAkZGF0YS0+eyAkc2VjdGlvbiB9IH0gKSB7CisgICAgICAgICAgICBteSAoIHVuZGVmLCAkbXNnICkgPSBAJGl0ZW07CisgICAgICAgICAgICAkYnVsayAuPSAiICAgICAgICBcIiIgLiBtc2cyc3JjKCAkbXNnICkgLiAiXCIsXG4iOworICAgICAgICB9OyAjIHdoaWxlCisgICAgICAgICRidWxrIC49CisgICAgICAgICAgICAiICAgICAgICBOVUxMXG4iIC4KKyAgICAgICAgICAgICIgICAgfTtcbiIgLgorICAgICAgICAgICAgIlxuIjsKKyAgICB9OyAjIGZvcmVhY2ggJHR5cGUKKworICAgICRidWxrIC49CisgICAgICAgICJzdHJ1Y3Qga21wX2kxOG5fc2VjdGlvbiB7XG4iIC4KKyAgICAgICAgIiAgICBpbnQgICAgICAgICAgIHNpemU7XG4iIC4KKyAgICAgICAgIiAgICBjaGFyIGNvbnN0ICoqIHN0cjtcbiIgLgorICAgICAgICAifTsgLy8gc3RydWN0IGttcF9pMThuX3NlY3Rpb25cbiIgLgorICAgICAgICAidHlwZWRlZiBzdHJ1Y3Qga21wX2kxOG5fc2VjdGlvbiAga21wX2kxOG5fc2VjdGlvbl90O1xuIiAuCisgICAgICAgICJcbiIgLgorICAgICAgICAic3RhdGljIGttcF9pMThuX3NlY3Rpb25fdFxuIiAuCisgICAgICAgICJfXyR7cHJlZml4fV9zZWN0aW9uc1tdID1cbiIgLgorICAgICAgICAiICAgIHtcbiIgLgorICAgICAgICAiICAgICAgICB7IDAsIE5VTEwgfSxcbiI7CisgICAgZm9yZWFjaCBteSAkc2VjdGlvbiAoIEBzZWN0aW9ucyApIHsKKyAgICAgICAgJGJ1bGsgLj0KKyAgICAgICAgICAgICIgICAgICAgIHsgIiAuIEB7ICRkYXRhLT57ICRzZWN0aW9uIH0gfSAuICIsIF9fJHtwcmVmaXh9X2RlZmF1bHRfJHtzZWN0aW9ufSB9LFxuIjsKKyAgICB9OyAjIGZvcmVhY2ggJHR5cGUKKyAgICAkYnVsayAuPQorICAgICAgICAiICAgICAgICB7IDAsIE5VTEwgfVxuIiAuCisgICAgICAgICIgICAgfTtcbiIgLgorICAgICAgICAiXG4iOworCisgICAgJGJ1bGsgLj0KKyAgICAgICAgInN0cnVjdCBrbXBfaTE4bl90YWJsZSB7XG4iIC4KKyAgICAgICAgIiAgICBpbnQgICAgICAgICAgICAgICAgICAgc2l6ZTtcbiIgLgorICAgICAgICAiICAgIGttcF9pMThuX3NlY3Rpb25fdCAqICBzZWN0O1xuIiAuCisgICAgICAgICJ9OyAvLyBzdHJ1Y3Qga21wX2kxOG5fdGFibGVcbiIgLgorICAgICAgICAidHlwZWRlZiBzdHJ1Y3Qga21wX2kxOG5fdGFibGUgIGttcF9pMThuX3RhYmxlX3Q7XG4iIC4KKyAgICAgICAgIlxuIiAuCisgICAgICAgICJzdGF0aWMga21wX2kxOG5fdGFibGVfdCBfX2ttcF9pMThuX2RlZmF1bHRfdGFibGUgPVxuIiAuCisgICAgICAgICIgICAge1xuIiAuCisgICAgICAgICIgICAgICAgICIgLiBAc2VjdGlvbnMgLiAiLFxuIiAuCisgICAgICAgICIgICAgICAgIF9fa21wX2kxOG5fc2VjdGlvbnNcbiIgLgorICAgICAgICAiICAgIH07XG4iIC4KKyAgICAgICAgIlxuIiAuCisgICAgICAgICIvLyBlbmQgb2YgZmlsZSAvL1xuIjsKKworICAgIHdyaXRlX2ZpbGUoICRmaWxlLCBcJGJ1bGsgKTsKKworfTsgIyBzdWIgZ2VuZXJhdGVfZGVmYXVsdAorCisKK3N1YiBnZW5lcmF0ZV9tZXNzYWdlX3VuaXgoJCQpIHsKKworICAgIG15ICggJGRhdGEsICRmaWxlICkgPSBAXzsKKyAgICBteSAkYnVsayAgICAgPSAiIjsKKworICAgICRidWxrIC49CisgICAgICAgIF9nZW5lcmF0ZV9jb21tZW50KCAkZGF0YSwgIlwkIiwgIlwkIiApIC4KKyAgICAgICAgIlxuIiAuCisgICAgICAgICJcJHF1b3RlIFwiXG5cbiI7CisKKyAgICBmb3JlYWNoIG15ICRzZWN0aW9uICggQHNlY3Rpb25zICkgeworICAgICAgICAkYnVsayAuPQorICAgICAgICAgICAgIlwkICIgLiAoICItIiB4IDc4ICkgLiAiXG5cJCAkc2VjdGlvblxuXCQgIiAuICggIi0iIHggNzggKSAuICJcblxuIiAuCisgICAgICAgICAgICAiXCRzZXQgJHNlY3Rpb25zLT57ICRzZWN0aW9uIH0tPnsgc2V0IH1cbiIgLgorICAgICAgICAgICAgIlxuIjsKKyAgICAgICAgbXkgJG4gPSAwOworICAgICAgICBmb3JlYWNoIG15ICRpdGVtICggQHsgJGRhdGEtPnsgJHNlY3Rpb24gfSB9ICkgeworICAgICAgICAgICAgbXkgKCB1bmRlZiwgJG1zZyApID0gQCRpdGVtOworICAgICAgICAgICAgKysgJG47CisgICAgICAgICAgICAkYnVsayAuPSAiJG4gXCIiIC4gbXNnMnNyYyggJG1zZyApIC4gIlwiXG4iOworICAgICAgICB9OyAjIGZvcmVhY2gKKyAgICAgICAgJGJ1bGsgLj0gIlxuIjsKKyAgICB9OyAjIGZvcmVhY2ggJHR5cGUKKworICAgICRidWxrIC49CisgICAgICAgICJcbiIgLgorICAgICAgICAiXCQgZW5kIG9mIGZpbGUgXCRcbiI7CisKKyAgICB3cml0ZV9maWxlKCAkZmlsZSwgXCRidWxrLCAtbGF5ZXIgPT4gIjp1dGY4IiApOworCit9OyAjIHN1YiBnZW5lcmF0ZV9tZXNzYWdlX2xpbnV4CisKKworc3ViIGdlbmVyYXRlX21lc3NhZ2Vfd2luZG93cygkJCkgeworCisgICAgbXkgKCAkZGF0YSwgJGZpbGUgKSA9IEBfOworICAgIG15ICRidWxrID0gIiI7CisgICAgbXkgJGxhbmd1YWdlID0gJGRhdGEtPnsgIiVtZXRhIiB9LT57IExhbmd1YWdlIH07CisgICAgbXkgJGxhbmdpZCAgID0gJGRhdGEtPnsgIiVtZXRhIiB9LT57IExhbmdJZCB9OworCisgICAgJGJ1bGsgLj0KKyAgICAgICAgX2dlbmVyYXRlX2NvbW1lbnQoICRkYXRhLCAiOyIsICI7IiApIC4KKyAgICAgICAgIlxuIiAuCisgICAgICAgICJMYW5ndWFnZU5hbWVzID0gKCRsYW5ndWFnZT0kbGFuZ2lkOm1zZ18kbGFuZ2lkKVxuIiAuCisgICAgICAgICJcbiI7CisKKyAgICAkYnVsayAuPQorICAgICAgICAiRmFjaWxpdHlOYW1lcz0oXG4iOworICAgIGZvcmVhY2ggbXkgJHNlY3Rpb24gKCBAc2VjdGlvbnMgKSB7CisgICAgICAgIG15ICRwcm9wcyA9ICRzZWN0aW9ucy0+eyAkc2VjdGlvbiB9OyAgICAjIFNlY3Rpb24gcHJvcGVydGllcy4KKyAgICAgICAgJGJ1bGsgLj0KKyAgICAgICAgICAgICIgJHByb3BzLT57IHNob3J0IH09IiAuICRwcm9wcy0+eyBzZXQgfSAuIlxuIjsKKyAgICB9OyAjIGZvcmVhY2ggJHNlY3Rpb24KKyAgICAkYnVsayAuPQorICAgICAgICAiKVxuXG4iOworCisgICAgZm9yZWFjaCBteSAkc2VjdGlvbiAoIEBzZWN0aW9ucyApIHsKKyAgICAgICAgbXkgJHNob3J0ID0gJHNlY3Rpb25zLT57ICRzZWN0aW9uIH0tPnsgc2hvcnQgfTsKKyAgICAgICAgbXkgJG4gPSAwOworICAgICAgICBmb3JlYWNoIG15ICRpdGVtICggQHsgJGRhdGEtPnsgJHNlY3Rpb24gfSB9ICkgeworICAgICAgICAgICAgbXkgKCB1bmRlZiwgJG1zZyApID0gQCRpdGVtOworICAgICAgICAgICAgKysgJG47CisgICAgICAgICAgICAkYnVsayAuPQorICAgICAgICAgICAgICAgICJNZXNzYWdlSWQ9JG5cbiIgLgorICAgICAgICAgICAgICAgICJGYWNpbGl0eT0kc2hvcnRcbiIgLgorICAgICAgICAgICAgICAgICJMYW5ndWFnZT0kbGFuZ3VhZ2VcbiIgLgorICAgICAgICAgICAgICAgIG1zZzJtYyggJG1zZyApIC4gIlxuLlxuXG4iOworICAgICAgICB9OyAjIGZvcmVhY2ggJGl0ZW0KKyAgICB9OyAjIGZvcmVhY2ggJHNlY3Rpb24KKworICAgICRidWxrIC49CisgICAgICAgICJcbiIgLgorICAgICAgICAiOyBlbmQgb2YgZmlsZSA7XG4iOworCisgICAgJGJ1bGsgPSBlbmNvZGUoICJVVEYtMTZMRSIsICRidWxrICk7ICMgQ29udmVydCB0ZXh0IHRvIFVURi0xNkxFIHVzZWQgaW4gV2luZG93cyogT1MuCisgICAgd3JpdGVfZmlsZSggJGZpbGUsIFwkYnVsaywgLWJpbmFyeSA9PiAxICk7CisKK307ICMgc3ViIGdlbmVyYXRlX21lc3NhZ2Vfd2luZG93cworCisKKyMKKyMgUGFyc2UgY29tbWFuZCBsaW5lLgorIworCitteSAkaW5wdXRfZmlsZTsKK215ICRlbnVtX2ZpbGU7CitteSAkc2lnbmF0dXJlX2ZpbGU7CitteSAkZGVmYXVsdF9maWxlOworbXkgJG1lc3NhZ2VfZmlsZTsKK215ICRpZDsKK215ICRwcmVmaXggPSAiIjsKK2dldF9vcHRpb25zKAorICAgIFBsYXRmb3JtOjp0YXJnZXRfb3B0aW9ucygpLAorICAgICJlbnVtLWZpbGU9cyIgICAgICA9PiBcJGVudW1fZmlsZSwKKyAgICAic2lnbmF0dXJlLWZpbGU9cyIgPT4gXCRzaWduYXR1cmVfZmlsZSwKKyAgICAiZGVmYXVsdC1maWxlPXMiICAgPT4gXCRkZWZhdWx0X2ZpbGUsCisgICAgIm1lc3NhZ2UtZmlsZT1zIiAgID0+IFwkbWVzc2FnZV9maWxlLAorICAgICJpZHxsYW5nLWlkIiAgICAgICA9PiBcJGlkLAorICAgICJwcmVmaXg9cyIJICAgICAgID0+IFwkcHJlZml4LAorKTsKK2lmICggQEFSR1YgPT0gMCApIHsKKyAgICBjbWRsaW5lX2Vycm9yKCAiTm8gc291cmNlIGZpbGUgc3BlY2lmaWVkIC0tIG5vdGhpbmcgdG8gZG8iICk7Cit9OyAjIGlmCitpZiAoIEBBUkdWID4gMSApIHsKKyAgICBjbWRsaW5lX2Vycm9yKCAiVG9vIG1hbnkgc291cmNlIGZpbGVzIHNwZWNpZmllZCIgKTsKK307ICMgaWYKKyRpbnB1dF9maWxlID0gJEFSR1ZbIDAgXTsKKworCitteSAkZ2VuZXJhdGVfbWVzc2FnZTsKK2lmICggJHRhcmdldF9vcyA9fiBte1xBKD86bGlufGxyYnxtYWMpXHp9ICkgeworICAgICRnZW5lcmF0ZV9tZXNzYWdlID0gXCZnZW5lcmF0ZV9tZXNzYWdlX3VuaXg7Cit9IGVsc2lmICggJHRhcmdldF9vcyBlcSAid2luIiApIHsKKyAgICAkZ2VuZXJhdGVfbWVzc2FnZSA9IFwmZ2VuZXJhdGVfbWVzc2FnZV93aW5kb3dzOworfSBlbHNlIHsKKyAgICBydW50aW1lX2Vycm9yKCAiT1MgXCIkdGFyZ2V0X29zXCIgaXMgbm90IHN1cHBvcnRlZCIgKTsKK307ICMgaWYKKworCisjCisjIERvIHRoZSB3b3JrLgorIworCitteSAkZGF0YSA9IHBhcnNlX3NvdXJjZSggJGlucHV0X2ZpbGUgKTsKK2lmICggZGVmaW5lZCggJGlkICkgKSB7CisgICAgcHJpbnQoICRkYXRhLT57ICIlbWV0YSIgfS0+eyBMYW5nSWQgfSwgIlxuIiApOworfTsgIyBpZgoraWYgKCBkZWZpbmVkKCAkZW51bV9maWxlICkgKSB7CisgICAgZ2VuZXJhdGVfZW51bSggJGRhdGEsICRlbnVtX2ZpbGUsICRwcmVmaXggKTsKK307ICMgaWYKK2lmICggZGVmaW5lZCggJHNpZ25hdHVyZV9maWxlICkgKSB7CisgICAgZ2VuZXJhdGVfc2lnbmF0dXJlKCAkZGF0YSwgJHNpZ25hdHVyZV9maWxlICk7Cit9OyAjIGlmCitpZiAoIGRlZmluZWQoICRkZWZhdWx0X2ZpbGUgKSApIHsKKyAgICBnZW5lcmF0ZV9kZWZhdWx0KCAkZGF0YSwgJGRlZmF1bHRfZmlsZSwgJHByZWZpeCApOworfTsgIyBpZgoraWYgKCBkZWZpbmVkKCAkbWVzc2FnZV9maWxlICkgKSB7CisgICAgJGdlbmVyYXRlX21lc3NhZ2UtPiggJGRhdGEsICRtZXNzYWdlX2ZpbGUgKTsKK307ICMgaWYKKworZXhpdCggMCApOworCitfX0VORF9fCisKKz1wb2QKKworPWhlYWQxIE5BTUUKKworQjxtZXNzYWdlLWNvbnZlcnRlci5wbD4gLS0gQ29udmVydCBtZXNzYWdlIGNhdGFsb2cgc291cmNlIGZpbGUgaW50byBhbm90aGVyIHRleHQgZm9ybXMuCisKKz1oZWFkMSBTWU5PUFNJUworCitCPG1lc3NhZ2UtY29udmVydGVyLnBsPiBJPG9wdGlvbj4uLi4gPGZpbGU+CisKKz1oZWFkMSBPUFRJT05TCisKKz1vdmVyCisKKz1pdGVtIEI8LS1lbnVtLWZpbGU9Pkk8ZmlsZT4KKworR2VuZXJhdGUgZW51bSBmaWxlIG5hbWVkIEk8ZmlsZT4uCisKKz1pdGVtIEI8LS1kZWZhdWx0LWZpbGU9Pkk8ZmlsZT4KKworR2VuZXJhdGUgZGVmYXVsdCBtZXNzYWdlcyBmaWxlIG5hbWVkIEk8ZmlsZT4uCisKKz1pdGVtIEI8LS1sYW5nLWlkPgorCitQcmludCBsYW5ndWFnZSBpZGVudGlmaWVyIG9mIHRoZSBtZXNzYWdlIGNhdGFsb2cgc291cmNlIGZpbGUuCisKKz1pdGVtIEI8LS1tZXNzYWdlLWZpbGU9Pkk8ZmlsZT4KKworR2VuZXJhdGUgbWVzc2FnZSBmaWxlLgorCis9aXRlbSBCPC0tc2lnbmF0dXJlLWZpbGU9Pkk8ZmlsZT4KKworR2VuZXJhdGUgc2lnbmF0dXJlIGZpbGUuCisKK1NpZ25hdHVyZXMgYXJlIHVzZWQgZm9yIGNoZWNraW5nIGNvbXBhdGliaWxpdHkuIEZvciBleGFtcGxlLCB0byBjaGVjayBhIHByaW1hcnkKK2NhdGFsb2cgYW5kIGl0cyB0cmFuc2xhdGlvbiB0byBhbm90aGVyIGxhbmd1YWdlLCBzaWduYXR1cmVzIG9mIGJvdGggY2F0YWxvZ3Mgc2hvdWxkIGJlIGdlbmVyYXRlZAorYW5kIGNvbXBhcmVkLiBJZiBzaWduYXR1cmVzIGFyZSBpZGVudGljYWwsIGNhdGFsb2dzIGFyZSBjb21wYXRpYmxlLgorCis9aXRlbSBCPC0tcHJlZml4PT5JPHByZWZpeD4KKworUHJlZml4IHRvIGJlIHVzZWQgZm9yIGFsbCBDIGlkZW50aWZpZXJzICh0eXBlIGFuZCB2YXJpYWJsZSBuYW1lcykgaW4gZW51bSBhbmQgZGVmYXVsdCBtZXNzYWdlcworZmlsZXMuCisKKz1pdGVtIEI8LS1vcz0+STxzdHI+CisKK1NwZWNpZnkgT1MgbmFtZSB0aGUgbWVzc2FnZSBmb3JtYXRzIHRvIGJlIGNvbnZlcnRlZCBmb3IuIElmIG5vdCBzcGVjaWZpZWQgZXhwb2xpY2l0bHksIHZhbHVlIG9mCitMSUJPTVBfT1MgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgdXNlZC4gSWYgTElCT01QX09TIGlzIG5vdCBkZWZpbmVkLCBob3N0IE9TIGlzIGRldGVjdGVkLgorCitEZXBlbmRpbmcgb24gT1MsIEI8bWVzc2FnZS1jb252ZXJ0ZXIucGw+IGNvbnZlcnRzIG1lc3NhZ2UgZm9ybWF0cyB0byBHTlUgc3R5bGUgb3IgTVMgc3R5bGUuCisKKz1pdGVtIFN0YW5kYXJkIE9wdGlvbnMKKworPW92ZXIKKworPWl0ZW0gQjwtLWRvYz4KKworPWl0ZW0gQjwtLW1hbnVhbD4KKworUHJpbnQgZnVsbCBkb2N1bWVudGF0aW9uIGFuZCBleGl0LgorCis9aXRlbSBCPC0taGVscD4KKworUHJpbnQgc2hvcnQgaGVscCBtZXNzYWdlIGFuZCBleGl0LgorCis9aXRlbSBCPC0tdmVyc2lvbj4KKworUHJpbnQgdmVyc2lvbiBzdHJpbmcgYW5kIGV4aXQuCisKKz1iYWNrCisKKz1iYWNrCisKKz1oZWFkMSBBUkdVTUVOVFMKKworPW92ZXIKKworPWl0ZW0gSTxmaWxlPgorCitBIG5hbWUgb2YgaW5wdXQgZmlsZS4KKworPWJhY2sKKworPWhlYWQxIERFU0NSSVBUSU9OCisKKz1oZWFkMiBNZXNzYWdlIENhdGFsb2cgRmlsZSBGb3JtYXQKKworSXQgaXMgcGxhaW4gdGV4dCBmaWxlIGluIFVURi04IGVuY29kaW5nLiBFbXB0eSBsaW5lcyBhbmQgbGluZXMgYmVnaW5uaW5nIHdpdGggc2hhcnAgc2lnbiAoQzwjPikgYXJlCitpZ25vcmVkLiBFQk5GIHN5bnRheCBvZiBjb250ZW50OgorCisgICAgY2F0YWxvZyAgICA9IHsgc2VjdGlvbiB9OworICAgIHNlY3Rpb24gICAgPSBoZWFkZXIgYm9keTsKKyAgICBoZWFkZXIgICAgID0gIi0qLSAiIHNlY3Rpb24taWQgIiAtKi0iICJcbiI7CisgICAgYm9keSAgICAgICA9IHsgbWVzc2FnZSB9OworICAgIG1lc3NhZ2UgICAgPSBtZXNzYWdlLWlkIHN0cmluZyAiXG4iIHsgc3RyaW5nICJcbiIgfTsKKyAgICBzZWN0aW9uLWlkID0gaWRlbnRpZmllcjsKKyAgICBtZXNzYWdlLWlkID0gIk9CU09MRVRFIiB8IGlkZW50aWZpZXI7CisgICAgaWRlbnRpZmllciA9IGxldHRlciB7IGxldHRlciB8IGRpZ2l0IHwgIl8iIH07CisgICAgc3RyaW5nICAgICA9ICIiIiB7IGNoYXJhY3RlciB9ICIiIjsKKworSWRlbnRpZmllciBzdGFydHMgd2l0aCBsZXR0ZXIsIHdpdGggZm9sbG93aW5nIGxldHRlcnMsIGRpZ2l0cywgYW5kIHVuZGVyc2NvcmVzLiBJZGVudGlmaWVycyBhcmUKK2Nhc2Utc2Vuc2l0aXZlLiBTZXRpb24gaWRlbnRpZmllcnMgYXJlIGZpeGVkOiBDPE1FVEE+LCBDPFNUUklOR1M+LCBDPEZPUk1BVFM+LCBDPE1FU1NBR0VTPiBhbmQKK0M8SElOVFM+LiBNZXNzYWdlIGlkZW50aWZpZXJzIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBzZWN0aW9uLiBTcGVjaWFsIEM8T0JTT0xFVEU+IHBzZXVkby1pZGVudGlmaWVyCittYXkgYmUgdXNlZCBtYW55IHRpbWVzLgorCitTdHJpbmcgaXMgYSBDIHN0cmluZyBsaXRlcmFsIHdoaWNoIG11c3Qgbm90IGNyb3NzIGxpbmUgYm91bmRhcmllcy4KK0xvbmcgbWVzc2FnZXMgbWF5IG9jY3VweSBtdWx0aXBsZSBsaW5lcywgYSBzdHJpbmcgcGVyIGxpbmUuCisKK01lc3NhZ2UgbWF5IGluY2x1ZGUgcHJpbnRmLWxpa2UgR05VLXN0eWxlIHBsYWNlaG9sZGVycyBmb3IgYXJndW1lbnRzOiBDPCVJPG4+JEk8dD4+LAord2hlcmUgSTxuPiBpcyBhcmd1bWVudCBudW1iZXIgKEM8MT4sIEM8Mj4sIC4uLiksCitJPHQ+IC0tIGFyZ3VtZW50IHR5cGUsIEM8cz4gKHN0cmluZykgb3IgQzxkPiAoMzItYml0IGludGVnZXIpLgorCitTZWUgYWxzbyBjb21tZW50cyBpbiBGPGkxOG4vZW5fVVMudHh0Pi4KKworPWhlYWQyIE91dHB1dCBGaWxlcworCitUaGlzIHNjcmlwdCBjYW4gZ2VuZXJhdGUgMyBkaWZmZXJlbnQgdGV4dCBmaWxlcyBmcm9tIHNpbmdsZSBzb3VyY2U6CisKKz1vdmVyCisKKz1pdGVtIEVudW0gZmlsZS4KKworRW51bSBmaWxlIGlzIGEgQyBpbmNsdWRlIGZpbGUsIGNvbnRhaW5pbmcgZGVmaW5pdGlvbnMgb2YgbWVzc2FnZSBpZGVudGlmaWVycywgZS4gZy46CisKKyAgICBlbnVtIGttcF9pMThuX2lkIHsKKworICAgICAgICAvLyBTZXQgIzEsIG1ldGEuCisgICAgICAgIGttcF9pMThuX3BycF9maXJzdCA9IDY1NTM2LAorICAgICAgICBrbXBfaTE4bl9wcnBfTGFuZ3VhZ2UsCisgICAgICAgIGttcF9pMThuX3BycF9Db3VudHJ5LAorICAgICAgICBrbXBfaTE4bl9wcnBfTGFuZ0lkLAorICAgICAgICBrbXBfaTE4bl9wcnBfVmVyc2lvbiwKKyAgICAgICAga21wX2kxOG5fcHJwX1JldmlzaW9uLAorICAgICAgICBrbXBfaTE4bl9wcnBfbGFzdCwKKworICAgICAgICAvLyBTZXQgIzIsIHN0cmluZ3MuCisgICAgICAgIGttcF9pMThuX3N0cl9maXJzdCA9IDEzMTA3MiwKKyAgICAgICAga21wX2kxOG5fc3RyX0Vycm9yLAorICAgICAgICBrbXBfaTE4bl9zdHJfVW5rbm93bkZpbGUsCisgICAgICAgIGttcF9pMThuX3N0cl9Ob3RBTnVtYmVyLAorICAgICAgICAuLi4KKworICAgICAgICAvLyBTZXQgIzMsIGZvdHJtYXRzLgorICAgICAgICAuLi4KKworICAgICAgICBrbXBfaTE4bl94eHhfbGFzdGVzdAorCisgICAgfTsgLy8gZW51bSBrbXBfaTE4bl9pZAorCisgICAgdHlwZWRlZiBlbnVtIGttcF9pMThuX2lkICBrbXBfaTE4bl9pZF90OworCis9aXRlbSBEZWZhdWx0IG1lc3NhZ2VzIGZpbGUuCisKK0RlZmF1bHQgbWVzc2FnZXMgZmlsZSBpcyBhIEMgaW5jbHVkZSBmaWxlIGNvbnRhaW5pbmcgZGVmYXVsdCBtZXNzYWdlcyB0byBiZSBlbWJlZGRlZCBpbnRvCithcHBsaWNhdGlvbiAoYW5kIHVzZWQgaWYgZXh0ZXJuYWwgbWVzc2FnZSBjYXRhbG9nIGRvZXMgbm90IGV4aXN0IG9yIGNvdWxkIG5vdCBiZSBvcGVuKToKKworICAgIHN0YXRpYyBjaGFyIGNvbnN0ICoKKyAgICBfX2ttcF9pMThuX2RlZmF1bHRfbWV0YVtdID0KKyAgICAgICAgeworICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICJFbmdsaXNoIiwKKyAgICAgICAgICAgICJVU0EiLAorICAgICAgICAgICAgIjEwMzMiLAorICAgICAgICAgICAgIjIiLAorICAgICAgICAgICAgIjIwMDkwODA2IiwKKyAgICAgICAgICAgIE5VTEwKKyAgICAgICAgfTsKKworICAgIHN0YXRpYyBjaGFyIGNvbnN0ICoKKyAgICBfX2ttcF9pMThuX2RlZmF1bHRfc3RyaW5nc1tdID0KKyAgICAgICAgeworICAgICAgICAgICAgIkVycm9yIiwKKyAgICAgICAgICAgICIodW5rbm93biBmaWxlKSIsCisgICAgICAgICAgICAibm90IGEgbnVtYmVyIiwKKyAgICAgICAgICAgIC4uLgorICAgICAgICAgICAgTlVMTAorICAgICAgICB9OworCisgICAgLi4uCisKKz1pdGVtIE1lc3NhZ2UgZmlsZS4KKworTWVzc2FnZSBmaWxlIGlzIGFuIGlucHV0IGZvciBtZXNzYWdlIGNvbXBpbGVyLCBGPGdlbmNhdD4gb24gTGludXgqIE9TIGFuZCBPUyBYKiwgb3IgRjxtYy5leGU+IG9uCitXaW5kb3dzKiBPUy4KKworSGVyZSBpcyB0aGUgZXhhbXBsZSBvZiBMaW51eCogT1MgbWVzc2FnZSBmaWxlOgorCisgICAgJHF1b3RlICIKKyAgICAxICJKYXBhbmVzZSIKKyAgICAyICJKYXBhbiIKKyAgICAzICIxMDQxIgorICAgIDQgIjIiCisgICAgNSAiQmFzZWQgb24gRW5saXNoIG1lc3NhZ2UgY2F0YWxvZyByZXZpc2lvbiAyMDA5MDgwNiIKKyAgICAuLi4KKworRXhhbXBsZSBvZiBXaW5kb3dzKiBPUyBtZXNzYWdlIGZpbGU6CisKKyAgICBMYW5ndWFnZU5hbWVzID0gKEphcGFuZXNlPTEwMDQxOm1zZ18xMDQxKQorCisgICAgRmFjaWxpdHlOYW1lcyA9ICgKKyAgICAgcHJwPTEKKyAgICAgc3RyPTIKKyAgICAgZm10PTMKKyAgICAgLi4uCisgICAgKQorCisgICAgTWVzc2FnZUlkPTEKKyAgICBGYWNpbGl0eT1wcnAKKyAgICBMYW5ndWFnZT1KYXBhbmVzZQorICAgIEphcGFuZXNlCisgICAgLgorCisgICAgLi4uCisKKz1pdGVtIFNpZ25hdHVyZS4KKworU2lnbmF0dXJlIGlzIGEgcHJvY2Vzc2VkIHNvdXJjZSBmaWxlOiBjb21tZW50cyBzdHJpcHBlZCwgc3RyaW5ncyBkZWxldGVkLCBidXQgcGxhY2Vob2xkZXJzIGtlcHQgYW5kCitzb3J0ZWQuCisKKyAgICAtKi0gRk9STUFUUy0qLQorCisgICAgSW5mbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlMSRkICUyJHMKKyAgICBXYXJuaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUxJGQgJTIkcworICAgIEZhdGFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJTEkZCAlMiRzCisgICAgU3lzRXJyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlMSRkICUyJHMKKyAgICBIaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUxJC0gJTIkcworICAgIFByYWdtYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJTEkcyAlMiRzICUzJHMgJTQkcworCitUaGUgcHVycG9zZSBvZiBzaWduYXR1cmVzIC0tIGNvbXBhcmUgdHdvIG1lc3NhZ2Ugc291cmNlIGZpbGVzIGZvciBjb21wYXRpYmlsaXR5LiBJZiBzaWduYXR1cmVzIG9mCit0d28gbWVzc2FnZSBzb3VyY2VzIGFyZSB0aGUgc2FtZSwgYmluYXJ5IG1lc3NhZ2UgY2F0YWxvZ3Mgd2lsbCBiZSBjb21wYXRpYmxlLgorCis9YmFjaworCis9aGVhZDEgRVhBTVBMRVMKKworR2VuZXJhdGUgaW5jbHVkZSBmaWxlIGNvbnRhaW5pbmcgbWVzc2FnZSBpZGVudGlmaWVyczoKKworICAgICQgbWVzc2FnZS1jb252ZXJ0ZXIucGwgLS1lbnVtLWZpbGU9a21wX2kxOG5faWQuaW5jIGVuX1VTLnR4dAorCitHZW5lcmF0ZSBpbmNsdWRlIGZpbGUgY29udGF0aW5nIGRlZmF1bHQgbWVzc2FnZXM6CisKKyAgICAkIG1lc3NhZ2UtY29udmVydGVyLnBsIC0tZGVmYXVsdC1maWxlPWttcF9pMThuX2RlZmF1bHQuaW5jIGVuX1VTLnR4dAorCitHZW5lcmF0ZSBpbnB1dCBmaWxlIGZvciBtZXNzYWdlIGNvbXBpbGVyLCBMaW51eCogT1MgZXhhbXBsZToKKworICAgICQgbWVzc2FnZS1jb252ZXJ0ZXIucGwgLS1tZXNzYWdlLWZpbGU9cnVfUlUuVVRGLTgubXNnIHJ1X1JVLnR4dAorCitHZW5lcmF0ZSBpbnB1dCBmaWxlIGZvciBtZXNzYWdlIGNvbXBpbGVyLCBXaW5kb3dzKiBPUyBleGFtcGxlOgorCisgICAgPiBtZXNzYWdlLWNvbnZlcnRlci5wbCAtLW1lc3NhZ2UtZmlsZT1ydV9SVS5VVEYtOC5tYyBydV9SVS50eHQKKworPWN1dAorCisjIGVuZCBvZiBmaWxlICMKKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90b29scy9vYmpjb3B5LmNwcCBiL2ZpbmFsL3J1bnRpbWUvdG9vbHMvb2JqY29weS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ4ZTdmMgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdG9vbHMvb2JqY29weS5jcHAKQEAgLTAsMCArMSw1MjIgQEAKKy8qCisgKiAkUmV2aXNpb246IDQyOTUxICQKKyAqICREYXRlOiAyMDE0LTAxLTIxIDE0OjQxOjQxIC0wNjAwIChUdWUsIDIxIEphbiAyMDE0KSAkCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxzdHJzdHJlYW0+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8Y3N0cmluZz4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKwordHlwZWRlZiBzdGQ6OnN0cmluZyAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfdDsKK3R5cGVkZWYgc3RkOjp2ZWN0b3I8IHN0cmluZ190ID4gICAgICAgICAgc3RyaW5nc190OwordHlwZWRlZiBzdGQ6Om1hcDwgc3RyaW5nX3QsIHN0cmluZ190ID4gICBzdHJfaGFzaF90OwordHlwZWRlZiBzdGQ6OnBhaXI8IHN0cmluZ190LCBzdHJpbmdfdCA+ICBzdHJfcGFpcl90OworI2lmZGVmIF9XSU4zMgorICAgIHR5cGVkZWYgbG9uZyBsb25nICBpbnQ2NF90OworI2VuZGlmCisKK3N0cmluZ190CitzaGlmdCggc3RyaW5nc190ICYgc3RycyApIHsKKyAgICBzdHJpbmdfdCBmaXJzdCA9IHN0cnMuZnJvbnQoKTsKKyAgICBzdHJzLmVyYXNlKCBzdHJzLmJlZ2luKCkgKTsKKyAgICByZXR1cm4gZmlyc3Q7Cit9IC8vIHNoaWZ0CisKK3N0cmluZ190CitmaW5kKAorICAgIHN0cl9oYXNoX3QgY29uc3QgJiBoYXNoLAorICAgIHN0cmluZ190IGNvbnN0ICYgICBrZXkKKykgeworICAgIHN0cmluZ190IHZhbHVlOworICAgIHN0cl9oYXNoX3Q6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gaGFzaC5maW5kKCBrZXkgKTsKKyAgICBpZiAoIGl0ICE9IGhhc2guZW5kKCkgKSB7CisgICAgICAgIHZhbHVlID0gaXQtPnNlY29uZDsKKyAgICB9OyAvLyBpZgorICAgIHJldHVybiB2YWx1ZTsKK30gLy8gZmluZAorCit2b2lkIGRpZSggc3RyaW5nX3QgY29uc3QgJiBtZXNzYWdlICkgeworICAgIHN0ZDo6Y2VyciA8PCBtZXNzYWdlIDw8IHN0ZDo6ZW5kbDsKKyAgICBleGl0KCAxICk7Cit9IC8vIGRpZQorCit2b2lkIHN0b3AoIHN0cmluZ190IGNvbnN0ICYgbWVzc2FnZSApIHsKKyAgICBwcmludGYoICIlc1xuIiwgbWVzc2FnZS5jX3N0cigpICk7CisgICAgZXhpdCggMSApOworfQorCisvLyBBbiBlbnRyeSBpbiB0aGUgc3ltYm9sIHRhYmxlIG9mIGEgLm9iaiBmaWxlLgorc3RydWN0IHN5bWJvbF90IHsKKyAgICBsb25nIGxvbmcgICAgICAgIG5hbWU7CisgICAgdW5zaWduZWQgICAgICAgICB2YWx1ZTsKKyAgICB1bnNpZ25lZCAgc2hvcnQgIHNlY3Rpb25fbnVtOworICAgIHVuc2lnbmVkICBzaG9ydCAgdHlwZTsKKyAgICBjaGFyICAgICAgICAgICAgIHN0b3JhZ2VfY2xhc3M7CisgICAgY2hhciAgICAgICAgICAgICBuQXV4OworfTsgLy8gc3RydWN0IHN5bWJvbF90CisKKworY2xhc3MgX3JzdHJlYW1fdCA6IHB1YmxpYyBzdGQ6OmlzdHJzdHJlYW0geworCisgICAgcHJpdmF0ZToKKworICAgICAgICBjb25zdCBjaGFyICogYnVmOworCisgICAgcHJvdGVjdGVkOgorCisgICAgICAgIF9yc3RyZWFtX3QoIHBhaXI8IGNvbnN0IGNoYXIgKiwgc3RyZWFtc2l6ZSA+IHAgKQorICAgICAgICAgICAgOiBpc3Ryc3RyZWFtKCBwLmZpcnN0LCBwLnNlY29uZCApLCBidWYoIHAuZmlyc3QgKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICB+X3JzdHJlYW1fdCgpIHsKKyAgICAgICAgICAgIGRlbGV0ZSBbXSBidWY7CisgICAgICAgIH0KKworfTsgLy8gY2xhc3MgX3JzdHJlYW1fdAorCisvKiBBIHN0cmVhbSBlbmNhcHVzbGF0aW5nIHRoZSBjb250ZW50IG9mIGEgZmlsZSBvciB0aGUgY29udGVudCBvZiBhIHN0cmluZywgb3ZlcnJpZGluZyB0aGUKKyAgID4+IG9wZXJhdG9yIHRvIHJlYWQgdmFyaW91cyBpbnRlZ2VyIHR5cGVzIGluIGJpbmFyeSBmb3JtLCBhcyB3ZWxsIGFzIGEgc3ltYm9sIHRhYmxlCisgICBlbnRyeS4KKyovCitjbGFzcyByc3RyZWFtX3QgOiBwdWJsaWMgX3JzdHJlYW1fdCB7Citwcml2YXRlOgorCisgICAgdGVtcGxhdGU8IHR5cGVuYW1lIHR5cGVfdCA+CisgICAgaW5saW5lIHJzdHJlYW1fdCAmIGRvX3JlYWQoIHR5cGVfdCAmIHggKSB7CisJcmVhZCggKGNoYXIqKSAmIHgsIHNpemVvZiggdHlwZV90ICkgKTsKKwlyZXR1cm4gKiB0aGlzOworICAgIH0KKworICAgIHN0YXRpYyBwYWlyPGNvbnN0IGNoYXIqLCBzdHJlYW1zaXplPiBnZXRCdWYoY29uc3QgY2hhciAqZmlsZU5hbWUpIHsKKwlpZnN0cmVhbSByYXcoZmlsZU5hbWUsaW9zOjpiaW5hcnkgfCBpb3M6OmluKTsKKwlpZighcmF3LmlzX29wZW4oKSkKKwkgICAgc3RvcCgicnN0cmVhbS5nZXRCdWY6IEVycm9yIG9wZW5pbmcgZmlsZSIpOworCXJhdy5zZWVrZygwLGlvczo6ZW5kKTsKKwlzdHJlYW1wb3MgZmlsZVNpemUgPSByYXcudGVsbGcoKTsKKwlpZihmaWxlU2l6ZSA8IDApCisJICAgIHN0b3AoInJzdHJlYW0uZ2V0QnVmOiBFcnJvciByZWFkaW5nIGZpbGUiKTsKKwljaGFyICpidWYgPSBuZXcgY2hhcltmaWxlU2l6ZV07CisJcmF3LnNlZWtnKDAsaW9zOjpiZWcpOworCXJhdy5yZWFkKGJ1ZiwgZmlsZVNpemUpOworCXJldHVybiBwYWlyPGNvbnN0IGNoYXIqLCBzdHJlYW1zaXplPihidWYsZmlsZVNpemUpOworICAgIH0KK3B1YmxpYzoKKyAgICAvLyBjb25zdHJ1Y3QgZnJvbSBhIHN0cmluZworICAgIHJzdHJlYW1fdCggY29uc3QgY2hhciAqIGJ1Ziwgc3RyZWFtc2l6ZSBzaXplICkgOgorICAgICAgICBfcnN0cmVhbV90KCBwYWlyPCBjb25zdCBjaGFyICosIHN0cmVhbXNpemUgPiggYnVmLCBzaXplICkgKQorICAgIHt9CisgICAgLyogY29uc3RydWN0IGZyb20gYSBmaWxlIHdob2xlIGNvbnRlbnQgaXMgZnVsbHkgcmVhZCBvbmNlIHRvIGluaXRpYWxpemUgdGhlIGNvbnRlbnQgb2YKKyAgICAgICB0aGlzIHN0cmVhbQorICAgICovCisgICAgcnN0cmVhbV90KCBzdHJpbmdfdCBjb25zdCAmIGZpbGVOYW1lICkKKyAgICAgICAgOiBfcnN0cmVhbV90KCBnZXRCdWYoIGZpbGVOYW1lLmNfc3RyKCkgKSApCisgICAgeworICAgIH0KKworICAgIHJzdHJlYW1fdCAmIG9wZXJhdG9yID4+KCBpbnQgJiB4ICkgeworCXJldHVybiBkb19yZWFkKHgpOworICAgIH0KKyAgICByc3RyZWFtX3QgJiBvcGVyYXRvciA+Pih1bnNpZ25lZCAmeCkgeworCXJldHVybiBkb19yZWFkKHgpOworICAgIH0KKyAgICByc3RyZWFtX3QgJiBvcGVyYXRvcj4+KHNob3J0ICZ4KSB7CisJcmV0dXJuIGRvX3JlYWQoeCk7CisgICAgfQorICAgIHJzdHJlYW1fdCAmIG9wZXJhdG9yPj4odW5zaWduZWQgc2hvcnQgJngpIHsKKwlyZXR1cm4gZG9fcmVhZCh4KTsKKyAgICB9CisgICAgcnN0cmVhbV90ICYgb3BlcmF0b3I+Piggc3ltYm9sX3QgJiBlICkgeworCXJlYWQoKGNoYXIqKSZlLCAxOCk7CisJcmV0dXJuICp0aGlzOworICAgIH0KK307IC8vIGNsYXNzIHJzdHJlYW1fdAorCisvLyBzdHJpbmcgdGFibGUgaW4gYSAuT0JKIGZpbGUKK2NsYXNzIFN0cmluZ1RhYmxlIHsKK3ByaXZhdGU6CisgICAgbWFwPHN0cmluZywgdW5zaWduZWQ+IGRpcmVjdG9yeTsKKyAgICBzaXplX3QgbGVuZ3RoOworICAgIGNoYXIgKmRhdGE7CisKKyAgICAvLyBtYWtlIDxkaXJlY3Rvcnk+IGZyb20gPGxlbmd0aD4gYnl0ZXMgaW4gPGRhdGE+CisgICAgdm9pZCBtYWtlRGlyZWN0b3J5KHZvaWQpIHsKKwl1bnNpZ25lZCBpID0gNDsKKwl3aGlsZShpIDwgbGVuZ3RoKSB7CisJICAgIHN0cmluZyBzID0gc3RyaW5nKGRhdGEgKyBpKTsKKwkgICAgZGlyZWN0b3J5Lmluc2VydChtYWtlX3BhaXIocywgaSkpOworCSAgICBpICs9IHMuc2l6ZSgpICsgMTsKKwl9CisgICAgfQorICAgIC8vIGluaXRpYWxpemUgPGxlbmd0aD4gYW5kIDxkYXRhPiB3aXRoIGNvbnRlbnRzIHNwZWNpZmllZCBieSB0aGUgYXJndW1lbnRzCisgICAgdm9pZCBpbml0KGNvbnN0IGNoYXIgKl9kYXRhKSB7CisJdW5zaWduZWQgX2xlbmd0aCA9ICoodW5zaWduZWQqKV9kYXRhOworCisJaWYoX2xlbmd0aCA8IHNpemVvZih1bnNpZ25lZCkgfHwgX2xlbmd0aCAhPSAqKHVuc2lnbmVkKilfZGF0YSkKKwkgICAgc3RvcCgiU3RyaW5nVGFibGUuaW5pdDogSW52YWxpZCBzeW1ib2wgdGFibGUiKTsKKwlpZihfZGF0YVtfbGVuZ3RoIC0gMV0pIHsKKwkgICAgLy8gdG8gcHJldmVudCBydW5hd2F5IHN0cmluZ3MsIG1ha2Ugc3VyZSB0aGUgZGF0YSBlbmRzIHdpdGggYSB6ZXJvCisJICAgIGRhdGEgPSBuZXcgY2hhcltsZW5ndGggPSBfbGVuZ3RoICsgMV07CisJICAgIGRhdGFbX2xlbmd0aF0gPSAwOworCX0gZWxzZSB7CisJICAgIGRhdGEgPSBuZXcgY2hhcltsZW5ndGggPSBfbGVuZ3RoXTsKKwl9CisJKih1bnNpZ25lZCopZGF0YSA9IGxlbmd0aDsKKwltZW1jcHkoIGRhdGEgKyBzaXplb2YodW5zaWduZWQpLCBfZGF0YSArIHNpemVvZih1bnNpZ25lZCksIGxlbmd0aCAtIHNpemVvZih1bnNpZ25lZCkgKTsKKwltYWtlRGlyZWN0b3J5KCk7CisgICAgfQorcHVibGljOgorICAgIFN0cmluZ1RhYmxlKCByc3RyZWFtX3QgJiBmICkgeworCS8qIENvbnN0cnVjdCBzdHJpbmcgdGFibGUgYnkgcmVhZGluZyBmcm9tIGYuCisJICovCisJc3RyZWFtcG9zIHM7CisJdW5zaWduZWQgc3RyU2l6ZTsKKwljaGFyICpzdHJEYXRhOworCisJcyA9IGYudGVsbGcoKTsKKwlmPj5zdHJTaXplOworCWlmKHN0clNpemUgPCBzaXplb2YodW5zaWduZWQpKQorCSAgICBzdG9wKCJTdHJpbmdUYWJsZTogSW52YWxpZCBzdHJpbmcgdGFibGUiKTsKKwlzdHJEYXRhID0gbmV3IGNoYXJbc3RyU2l6ZV07CisJKih1bnNpZ25lZCopc3RyRGF0YSA9IHN0clNpemU7CisJLy8gcmVhZCB0aGUgcmF3IGRhdGEgaW50byA8c3RyRGF0YT4KKwlmLnJlYWQoc3RyRGF0YSArIHNpemVvZih1bnNpZ25lZCksIHN0clNpemUgLSBzaXplb2YodW5zaWduZWQpKTsKKwlzID0gZi50ZWxsZygpIC0gczsKKwlpZihzIDwgc3RyU2l6ZSkKKwkgICAgc3RvcCgiU3RyaW5nVGFibGU6IFVuZXhwZWN0ZWQgRU9GIik7CisJaW5pdChzdHJEYXRhKTsKKwlkZWxldGVbXXN0ckRhdGE7CisgICAgfQorICAgIFN0cmluZ1RhYmxlKGNvbnN0IHNldDxzdHJpbmc+ICZzdHJpbmdzKSB7CisJLyogQ29uc3RydWN0IHN0cmluZyB0YWJsZSBmcm9tIGdpdmVuIHN0cmluZ3MuCisJICovCisJY2hhciAqcDsKKwlzZXQ8c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXQ7CisJc2l6ZV90IHM7CisKKwkvLyBjb3VudCByZXF1aXJlZCBzaXplIGZvciBkYXRhCisJZm9yKGxlbmd0aCA9IHNpemVvZih1bnNpZ25lZCksIGl0ID0gc3RyaW5ncy5iZWdpbigpOyBpdCAhPSBzdHJpbmdzLmVuZCgpOyArK2l0KSB7CisJICAgIHNpemVfdCBsID0gKCppdCkuc2l6ZSgpOworCisJICAgIGlmKGwgPiAodW5zaWduZWQpIDB4RkZGRkZGRkYpCisJCXN0b3AoIlN0cmluZ1RhYmxlOiBTdHJpbmcgdG9vIGxvbmciKTsKKwkgICAgaWYobCA+IDgpIHsKKwkJbGVuZ3RoICs9IGwgKyAxOworCQlpZihsZW5ndGggPiAodW5zaWduZWQpIDB4RkZGRkZGRkYpCisJCSAgICBzdG9wKCJTdHJpbmdUYWJsZTogU3ltYm9sIHRhYmxlIHRvbyBsb25nIik7CisJICAgIH0KKwl9CisJZGF0YSA9IG5ldyBjaGFyW2xlbmd0aF07CisJKih1bnNpZ25lZCopZGF0YSA9IGxlbmd0aDsKKwkvLyBwb3B1bGF0ZSBkYXRhIGFuZCBkaXJlY3RvcnkKKwlmb3IocCA9IGRhdGEgKyBzaXplb2YodW5zaWduZWQpLCBpdCA9IHN0cmluZ3MuYmVnaW4oKTsgaXQgIT0gc3RyaW5ncy5lbmQoKTsgKytpdCkgeworCSAgICBjb25zdCBzdHJpbmcgJnN0ciA9ICppdDsKKwkgICAgc2l6ZV90IGwgPSBzdHIuc2l6ZSgpOworCSAgICBpZihsID4gOCkgeworCQlkaXJlY3RvcnkuaW5zZXJ0KG1ha2VfcGFpcihzdHIsIHAgLSBkYXRhKSk7CisJCW1lbWNweShwLCBzdHIuY19zdHIoKSwgbCk7CisJCXBbbF0gPSAwOworCQlwICs9IGwgKyAxOworCSAgICB9CisJfQorICAgIH0KKyAgICB+U3RyaW5nVGFibGUoKSB7CisJZGVsZXRlW10gZGF0YTsKKyAgICB9CisgICAgLyogUmV0dXJucyBlbmNvZGluZyBmb3IgZ2l2ZW4gc3RyaW5nIGJhc2VkIG9uIHRoaXMgc3RyaW5nIHRhYmxlLgorICAgICAgIEVycm9yIGlmIHN0cmluZyBsZW5ndGggaXMgZ3JlYXRlciB0aGFuIDggYnV0IHN0cmluZyBpcyBub3QgaW4KKyAgICAgICB0aGUgc3RyaW5nIHRhYmxlLS1yZXR1cm5zIDAuCisgICAgKi8KKyAgICBpbnQ2NF90IGVuY29kZShjb25zdCBzdHJpbmcgJnN0cikgeworCWludDY0X3QgcjsKKworCWlmKHN0ci5zaXplKCkgPD0gOCkgeworCSAgICAvLyBlbmNvZGVkIGRpcmVjdGx5CisJICAgICgoY2hhciopJnIpWzddID0gMDsKKwkgICAgc3RybmNweSgoY2hhciopJnIsIHN0ci5jX3N0cigpLCA4KTsKKwkgICAgcmV0dXJuIHI7CisJfSBlbHNlIHsKKwkgICAgLy8gcmVwcmVzZW50ZWQgYXMgaW5kZXggaW50byB0YWJsZQorCSAgICBtYXA8c3RyaW5nLHVuc2lnbmVkPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBkaXJlY3RvcnkuZmluZChzdHIpOworCSAgICBpZihpdCA9PSBkaXJlY3RvcnkuZW5kKCkpCisJCXN0b3AoIlN0cmluZ1RhYmxlOjplbmNvZGU6IFN0cmluZyBub3cgZm91bmQgaW4gc3RyaW5nIHRhYmxlIik7CisJICAgICgodW5zaWduZWQqKSZyKVswXSA9IDA7CisJICAgICgodW5zaWduZWQqKSZyKVsxXSA9ICgqaXQpLnNlY29uZDsKKwkgICAgcmV0dXJuIHI7CisJfQorICAgIH0KKyAgICAvKiBSZXR1cm5zIHN0cmluZyByZXByZXNlbnRlZCBieSB4IGJhc2VkIG9uIHRoaXMgc3RyaW5nIHRhYmxlLgorICAgICAgIEVycm9yIGlmIHggcmVmZXJlbmNlcyBhbiBpbnZhbGlkIHBvc2l0aW9uIGluIHRoZSB0YWJsZS0tcmV0dXJucworICAgICAgIHRoZSBlbXB0eSBzdHJpbmcuCisgICAgKi8KKyAgICBzdHJpbmcgZGVjb2RlKGludDY0X3QgeCkgY29uc3QgeworCWlmKCoodW5zaWduZWQqKSZ4ID09IDApIHsKKwkgICAgLy8gcmVwcmVzZW50ZWQgYXMgaW5kZXggaW50byB0YWJsZQorCSAgICB1bnNpZ25lZCAmcCA9ICgodW5zaWduZWQqKSZ4KVsxXTsKKwkgICAgaWYocCA+PSBsZW5ndGgpCisJCXN0b3AoIlN0cmluZ1RhYmxlOjpkZWNvZGU6IEludmFsaWQgc3RyaW5nIHRhYmxlIGxvb2t1cCIpOworCSAgICByZXR1cm4gc3RyaW5nKGRhdGEgKyBwKTsKKwl9IGVsc2UgeworCSAgICAvLyBlbmNvZGVkIGRpcmVjdGx5CisJICAgIGNoYXIgKnAgPSAoY2hhciopJng7CisJICAgIGludCBpOworCisJICAgIGZvcihpID0gMDsgaSA8IDggJiYgcFtpXTsgKytpKTsKKwkgICAgcmV0dXJuIHN0cmluZyhwLCBpKTsKKwl9CisgICAgfQorICAgIHZvaWQgd3JpdGUob3N0cmVhbSAmb3MpIHsKKwlvcy53cml0ZShkYXRhLCBsZW5ndGgpOworICAgIH0KK307CisKKwordm9pZAorb2JqX2NvcHkoCisgICAgc3RyaW5nX3QgY29uc3QgJiAgICBzcmMsICAgIC8vIE5hbWUgb2Ygc291cmNlIGZpbGUuCisgICAgc3RyaW5nX3QgY29uc3QgJiAgICBkc3QsICAgIC8vIE5hbWUgb2YgZGVzdGluYXRpb24gZmlsZS4KKyAgICBzdHJfaGFzaF90IGNvbnN0ICYgIHJlZGVmcyAgLy8gTGlzdCBvZiByZWRlZmluaXRpdGlvbnMuCispIHsKKworICAgIHNldDwgc3RyaW5nID4gc3RyaW5nczsgLy8gc2V0IG9mIGFsbCBvY2N1cnJpbmcgc3ltYm9scywgYXBwcm9wcmlhdGVseSBwcmVmaXhlZAorICAgIHN0cmVhbXBvcyBmaWxlU2l6ZTsKKyAgICBzaXplX3Qgc3RyVGFiU3RhcnQ7CisgICAgdW5zaWduZWQgc3ltVGFiU3RhcnQ7CisgICAgdW5zaWduZWQgc3ltTkVudHJpZXM7CisgICAgaW50IGk7CisKKworICAgIHN0cmluZyBjb25zdCBlcnJvcl9yZWFkaW5nID0gIkVycm9yIHJlYWRpbmcgXCIiICsgc3JjICsgIlwiIGZpbGU6ICI7CisKKyAgICByc3RyZWFtX3QgaW4oIHNyYyApOworCisgICAgaW4uc2Vla2coIDAsIGlvczo6ZW5kICk7CisgICAgZmlsZVNpemUgPSBpbi50ZWxsZygpOworCisgICAgaW4uc2Vla2coIDggKTsKKyAgICBpbiA+PiBzeW1UYWJTdGFydCA+PiBzeW1ORW50cmllczsKKyAgICBzdHJUYWJTdGFydCA9IHN5bVRhYlN0YXJ0ICsgMTggKiBzaXplX3QoIHN5bU5FbnRyaWVzICk7CisgICAgaW4uc2Vla2coIHN0clRhYlN0YXJ0ICk7CisgICAgaWYgKCBpbi5lb2YoKSApIHsKKyAgICAgICAgc3RvcCggZXJyb3JfcmVhZGluZyArICJVbmV4cGVjdGVkIGVuZCBvZiBmaWxlIiApOworICAgIH0KKyAgICBTdHJpbmdUYWJsZSBzdHJpbmdUYWJsZU9sZCggaW4gKTsgLy8gUmVhZCBvcmlnaW5hbCBzdHJpbmcgdGFibGUuCisKKyAgICBpZiAoIGluLnRlbGxnKCkgIT0gZmlsZVNpemUgKSB7CisgICAgICAgIHN0b3AoIGVycm9yX3JlYWRpbmcgKyAiVW5leHBlY3RlZCBkYXRhIGFmdGVyIHN0cmluZyB0YWJsZSIgKTsKKyAgICB9CisKKyAgICAvLyBjb21wdXRlIHNldCBvZiBvY2N1cnJpbmcgc3RyaW5ncyB3aXRoIHByZWZpeCBhZGRlZAorICAgIGZvciAoIGkgPSAwOyBpIDwgc3ltTkVudHJpZXM7ICsrIGkgKSB7CisKKwlzeW1ib2xfdCBlOworCisJaW4uc2Vla2coIHN5bVRhYlN0YXJ0ICsgaSAqIDE4ICk7CisJaWYgKCBpbi5lb2YoKSApIHsKKyAgICAgICAgICAgIHN0b3AoImhpZGVTeW1ib2xzOiBVbmV4cGVjdGVkIEVPRiIpOworICAgICAgICB9CisJaW4gPj4gZTsKKwlpZiAoIGluLmZhaWwoKSApIHsKKyAgICAgICAgICAgIHN0b3AoImhpZGVTeW1ib2xzOiBGaWxlIHJlYWQgZXJyb3IiKTsKKyAgICAgICAgfQorCWlmICggZS5uQXV4ICkgeworICAgICAgICAgICAgaSArPSBlLm5BdXg7CisgICAgICAgIH0KKwljb25zdCBzdHJpbmcgJiBzID0gc3RyaW5nVGFibGVPbGQuZGVjb2RlKCBlLm5hbWUgKTsKKwkvLyBpZiBzeW1ib2wgaXMgZXh0ZXJuIGFuZCBmb3VuZCBpbiA8aGlkZT4sIHByZWZpeCBhbmQgaW5zZXJ0IGludG8gc3RyaW5ncywKKwkvLyBvdGhlcndpc2UsIGp1c3QgaW5zZXJ0IGludG8gc3RyaW5ncyB3aXRob3V0IHByZWZpeAorICAgICAgICBzdHJpbmdfdCBuYW1lID0gZmluZCggcmVkZWZzLCBzICk7CisJc3RyaW5ncy5pbnNlcnQoIG5hbWUgIT0gIiIgJiYgZS5zdG9yYWdlX2NsYXNzID09IDIgPyBuYW1lIDogcyApOworICAgIH0KKworICAgIG9mc3RyZWFtIG91dCggZHN0LmNfc3RyKCksIGlvczo6dHJ1bmMgfCBpb3M6Om91dCB8IGlvczo6YmluYXJ5ICk7CisgICAgaWYgKCAhIG91dC5pc19vcGVuKCkgKSB7CisgICAgICAgIHN0b3AoImhpZGVTeW1ib2xzOiBFcnJvciBvcGVuaW5nIG91dHB1dCBmaWxlIik7CisgICAgfQorCisgICAgLy8gbWFrZSBuZXcgc3RyaW5nIHRhYmxlIGZyb20gc3RyaW5nIHNldAorICAgIFN0cmluZ1RhYmxlIHN0cmluZ1RhYmxlTmV3ID0gU3RyaW5nVGFibGUoIHN0cmluZ3MgKTsKKworICAgIC8vIGNvcHkgaW5wdXQgZmlsZSB0byBvdXRwdXQgZmlsZSB1cCB0byBqdXN0IGJlZm9yZSB0aGUgc3ltYm9sIHRhYmxlCisgICAgaW4uc2Vla2coIDAgKTsKKyAgICBjaGFyICogYnVmID0gbmV3IGNoYXJbIHN5bVRhYlN0YXJ0IF07CisgICAgaW4ucmVhZCggYnVmLCBzeW1UYWJTdGFydCApOworICAgIG91dC53cml0ZSggYnVmLCBzeW1UYWJTdGFydCApOworICAgIGRlbGV0ZSBbXSBidWY7CisKKyAgICAvLyBjb3B5IGlucHV0IHN5bWJvbCB0YWJsZSB0byBvdXRwdXQgc3ltYm9sIHRhYmxlIHdpdGggbmFtZSB0cmFuc2xhdGlvbgorICAgIGZvciAoIGkgPSAwOyBpIDwgc3ltTkVudHJpZXM7ICsrIGkgKSB7CisJc3ltYm9sX3QgZTsKKworCWluLnNlZWtnKCBzeW1UYWJTdGFydCArIGkgKiAxOCApOworCWlmICggaW4uZW9mKCkgKSB7CisgICAgICAgICAgICBzdG9wKCJoaWRlU3ltYm9sczogVW5leHBlY3RlZCBFT0YiKTsKKyAgICAgICAgfQorCWluID4+IGU7CisJaWYgKCBpbi5mYWlsKCkgKSB7CisgICAgICAgICAgICBzdG9wKCJoaWRlU3ltYm9sczogRmlsZSByZWFkIGVycm9yIik7CisgICAgICAgIH0KKwljb25zdCBzdHJpbmcgJiBzID0gc3RyaW5nVGFibGVPbGQuZGVjb2RlKCBlLm5hbWUgKTsKKwlvdXQuc2Vla3AoIHN5bVRhYlN0YXJ0ICsgaSAqIDE4ICk7CisgICAgICAgIHN0cmluZ190IG5hbWUgPSBmaW5kKCByZWRlZnMsIHMgKTsKKwllLm5hbWUgPSBzdHJpbmdUYWJsZU5ldy5lbmNvZGUoICggZS5zdG9yYWdlX2NsYXNzID09IDIgJiYgbmFtZSAhPSAiIiApID8gbmFtZSA6IHMgKTsKKwlvdXQud3JpdGUoIChjaGFyKikgJiBlLCAxOCApOworCWlmICggb3V0LmZhaWwoKSApIHsKKyAgICAgICAgICAgIHN0b3AoICJoaWRlU3ltYm9sczogRmlsZSB3cml0ZSBlcnJvciIgKTsKKyAgICAgICAgfQorCWlmICggZS5uQXV4ICkgeworCSAgICAvLyBjb3B5IGF1eGlsaWFyeSBzeW1ib2wgdGFibGUgZW50cmllcworCSAgICBpbnQgbkF1eCA9IGUubkF1eDsKKwkgICAgZm9yIChpbnQgaiA9IDE7IGogPD0gbkF1eDsgKytqICkgeworCQlpbiA+PiBlOworCQlvdXQuc2Vla3AoIHN5bVRhYlN0YXJ0ICsgKCBpICsgaiApICogMTggKTsKKwkJb3V0LndyaXRlKCAoY2hhciopICYgZSwgMTggKTsKKwkgICAgfQorCSAgICBpICs9IG5BdXg7CisJfQorICAgIH0KKyAgICAvLyBvdXRwdXQgc3RyaW5nIHRhYmxlCisgICAgc3RyaW5nVGFibGVOZXcud3JpdGUoIG91dCApOworfQorCisKK3ZvaWQKK3NwbGl0KCBzdHJpbmdfdCBjb25zdCAmIHN0ciwgY2hhciBjaCwgc3RyaW5nX3QgJiBoZWFkLCBzdHJpbmdfdCAmIHRhaWwgKSB7CisgICAgc3RyaW5nX3Q6OnNpemVfdHlwZSBwb3MgPSBzdHIuZmluZCggY2ggKTsKKyAgICBpZiAoIHBvcyA9PSBzdHJpbmdfdDo6bnBvcyApIHsKKyAgICAgICAgaGVhZCA9IHN0cjsKKyAgICAgICAgdGFpbCA9ICIiOworICAgIH0gZWxzZSB7CisgICAgICAgIGhlYWQgPSBzdHIuc3Vic3RyKCAwLCBwb3MgKTsKKyAgICAgICAgdGFpbCA9IHN0ci5zdWJzdHIoIHBvcyArIDEgKTsKKyAgICB9OyAvLyBpZgorfSAvLyBzcGxpdAorCisKK3ZvaWQgaGVscCgpIHsKKyAgICBzdGQ6OmNvdXQKKyAgICAgICAgPDwgIk5BTUVcbiIKKyAgICAgICAgPDwgIiAgICBvYmpjb3B5IC0tIGNvcHkgYW5kIHRyYW5zbGF0ZSBvYmplY3QgZmlsZXNcbiIKKyAgICAgICAgPDwgIlxuIgorICAgICAgICA8PCAiU1lOT1BTSVNcbiIKKyAgICAgICAgPDwgIiAgICBvYmpjb3B5IG9wdGlvbnMuLi4gc291cmNlIGRlc3RpbmF0aW9uXG4iCisgICAgICAgIDw8ICJcbiIKKyAgICAgICAgPDwgIk9QVElPTlNcbiIKKyAgICAgICAgPDwgIiAgICAtLWhlbHAgIFByaW50IHRoaXMgaGVscCBhbmQgZXhpdC5cbiIKKyAgICAgICAgPDwgIiAgICAtLXJlZGVmaW5lLXN5bSBvbGQ9bmV3XG4iCisgICAgICAgIDw8ICIgICAgICAgICAgICBSZW5hbWUgXCJvbGRcIiBzeW1ib2wgaW4gc291cmNlIG9iamVjdCBmaWxlIHRvIFwibmV3XCIgc3ltYm9sIGluXG4iCisgICAgICAgIDw8ICIgICAgICAgICAgICBkZXN0aW5hdGlvbiBvYmplY3QgZmlsZS5cbiIKKyAgICAgICAgPDwgIiAgICAtLXJlZGVmaW5lLXN5bXMgc3ltX2ZpbGVcbiIKKyAgICAgICAgPDwgIiAgICAgICAgICAgIEZvciBlYWNoIHBhaXIgXCJvbGQgbmV3XCIgaW4gc3ltX2ZpbGUgcmVuYW1lIFwib2xkXCIgc3ltYm9sIGluIFxuIgorICAgICAgICA8PCAiICAgICAgICAgICAgc291cmNlIG9iamVjdCBmaWxlIHRvIFwibmV3XCIgc3ltYm9sIGluIGRlc3RpbmF0aW9uIG9iamVjdCBmaWxlLlxuIgorICAgICAgICA8PCAiXG4iCisgICAgICAgIDw8ICJBUkdVTUVOVFNcbiIKKyAgICAgICAgPDwgIiAgICBzb3VyY2UgIFRoZSBuYW1lIG9mIHNvdXJjZSBvYmplY3QgZmlsZS5cbiIKKyAgICAgICAgPDwgIiAgICBkZXN0aW5hdGlvblxuIgorICAgICAgICA8PCAiICAgICAgICAgICAgVGhlIG5hbWUgb2YgZGVzdGluYXRpb24gb2JqZWN0IGZpbGUuXG4iCisgICAgICAgIDw8ICJcbiIKKyAgICAgICAgPDwgIkRFU0NSSVBUSU9OXG4iCisgICAgICAgIDw8ICIgICAgVGhpcyBwcm9ncmFtIGltcGxlbWVudHMgYSBtaW5vciBiaXQgb2YgTGludXgqIE9TJ3Mgb2JqY29weSB1dGlsaXR5IG9uIFdpbmRvd3MqIE9TLlxuIgorICAgICAgICA8PCAiICAgIEl0IGNhbiBjb3B5IG9iamVjdCBmaWxlcyBhbmQgZWRpdCBpdHMgc3ltYm9sIHRhYmxlLlxuIgorICAgICAgICA8PCAiXG4iCisgICAgICAgIDw8ICJFWEFNUExFU1xuIgorICAgICAgICA8PCAiICAgIFxuIgorICAgICAgICA8PCAiICAgICAgICA+IG9iamNvcHkgLS1yZWRlZmluZS1zeW0gZmFzdGNweT1fX3h4eF9mYXN0Y3B5IGEub2JqIGIub2JqXG4iCisgICAgICAgIDw8ICJcbiI7Cit9IC8vIGhlbHAKKworCitpbnQKK21haW4oIGludCBhcmdjLCBjaGFyIGNvbnN0ICogYXJndltdICkgeworCisgICAgc3RyaW5nc190ICAgYXJncyggYXJnYyAtIDEgKTsKKyAgICBzdHJfaGFzaF90ICByZWRlZnM7CisgICAgc3RyaW5nc190ICAgZmlsZXM7CisKKyAgICBzdGQ6OmNvcHkoIGFyZ3YgKyAxLCBhcmd2ICsgYXJnYywgYXJncy5iZWdpbigpICk7CisKKyAgICB3aGlsZSAoIGFyZ3Muc2l6ZSgpID4gMCApIHsKKyAgICAgICAgc3RyaW5nX3QgYXJnID0gc2hpZnQoIGFyZ3MgKTsKKyAgICAgICAgaWYgKCBhcmcuc3Vic3RyKCAwLCAyICkgPT0gIi0tIiApIHsKKyAgICAgICAgICAgIC8vIEFuIG9wdGlvbi4KKyAgICAgICAgICAgIGlmICggMCAgKSB7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCBhcmcgPT0gIi0taGVscCIgKSB7CisgICAgICAgICAgICAgICAgaGVscCgpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfSBlbHNlIGlmICggYXJnID09ICItLXJlZGVmaW5lLXN5bSIgKSB7CisgICAgICAgICAgICAgICAgaWYgKCBhcmdzLnNpemUoKSA9PSAwICkgeworICAgICAgICAgICAgICAgICAgICBkaWUoICJcIiIgKyBhcmcgKyAiXCIgb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50IiApOworICAgICAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICAgICAgLy8gcmVhZCBsaXN0IG9mIHN5bWJvbCBwYWlycyAib2xkIG5ldyIgZnJvbSBjb21tYW5kIGxpbmUuCisgICAgICAgICAgICAgICAgc3RyaW5nX3QgcmVkZWYgPSBzaGlmdCggYXJncyApOworICAgICAgICAgICAgICAgIHN0cmluZ190IG9sZF9zeW07CisgICAgICAgICAgICAgICAgc3RyaW5nX3QgbmV3X3N5bTsKKyAgICAgICAgICAgICAgICBzcGxpdCggcmVkZWYsICc9Jywgb2xkX3N5bSwgbmV3X3N5bSApOworICAgICAgICAgICAgICAgIGlmICggb2xkX3N5bS5sZW5ndGgoKSA9PSAwIHx8IG5ld19zeW0ubGVuZ3RoKCkgPT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgZGllKCAiSWxsZWdhbCByZWRlZmluaXRpb246IFwiIiArIHJlZGVmICsgIlwiOyBuZWl0aGVyIG9sZCBzeW1ib2wgbm9yIG5ldyBzeW1ib2wgbWF5IGJlIGVtcHR5IiApOworICAgICAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICAgICAgcmVkZWZzLmluc2VydCggc3RyX3BhaXJfdCggb2xkX3N5bSwgbmV3X3N5bSApICk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCBhcmcgPT0gIi0tcmVkZWZpbmUtc3ltcyIgKSB7CisgICAgICAgICAgICAgICAgaWYgKCBhcmdzLnNpemUoKSA9PSAwICkgeworICAgICAgICAgICAgICAgICAgICBkaWUoICJcIiIgKyBhcmcgKyAiXCIgb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50IiApOworICAgICAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICAgICAgLy8gcmVhZCBsaXN0IG9mIHN5bWJvbCBwYWlycyAib2xkIG5ldyIgZnJvbSBmaWxlLgorICAgICAgICAgICAgICAgIHN0cmluZ190IGZuYW1lID0gc2hpZnQoIGFyZ3MgKTsKKyAgICAgICAgICAgICAgICBzdHJpbmdfdCByZWRlZjsKKwkJaWZzdHJlYW0gaWZzKCBmbmFtZS5jX3N0cigpICk7CisJCXdoaWxlICggaWZzLmdvb2QoKSApIHsKKyAgICAgICAgICAgICAgICAgICAgZ2V0bGluZSggaWZzLCByZWRlZiApOy8vIGdldCBwYWlyIG9mIG9sZC9uZXcgc3ltYm9scyBzZXBhcmF0ZWQgYnkgc3BhY2UKKyAgICAgICAgICAgICAgICAgICAgc3RyaW5nX3Qgb2xkX3N5bTsKKyAgICAgICAgICAgICAgICAgICAgc3RyaW5nX3QgbmV3X3N5bTsKKyAgICAgICAgICAgICAgICAgICAgLy8gQUM6IGdjb3VudCgpIGRvZXMgbm90IHdvcmsgaGVyZSAoYWx3YXlzIHJldHVybiAwKSwgc28gY29tbWVudCBpdAorICAgICAgICAgICAgICAgICAgICAvL2lmICggaWZzLmdjb3VudCgpICkgeyAvLyBza2lwIGVtcHR5IGxpbmVzCisgICAgICAgICAgICAgICAgICAgIHNwbGl0KCByZWRlZiwgJyAnLCBvbGRfc3ltLCBuZXdfc3ltICk7CisgICAgICAgICAgICAgICAgICAgIGlmICggb2xkX3N5bS5sZW5ndGgoKSA9PSAwIHx8IG5ld19zeW0ubGVuZ3RoKCkgPT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgLy8gZW5kIG9mIGZpbGUgcmVhY2hlZCAobGFzdCBlbXB0eSBsaW5lKQorICAgICAgICAgICAgICAgICAgICAgICAgLy9kaWUoICJJbGxlZ2FsIHJlZGVmaW5pdGlvbjogXCIiICsgcmVkZWYgKyAiXCI7IG5laXRoZXIgb2xkIHN5bWJvbCBub3IgbmV3IHN5bWJvbCBtYXkgYmUgZW1wdHkiICk7CisgICAgICAgICAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICAgICAgICAgIHJlZGVmcy5pbnNlcnQoIHN0cl9wYWlyX3QoIG9sZF9zeW0sIG5ld19zeW0gKSApOworICAgICAgICAgICAgICAgICAgICAvL30KKwkJfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkaWUoICJJbGxlZ2FsIG9wdGlvbjogXCIiICsgYXJnICsgIlwiIiApOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIE5vdCBhbiBvcHRpb24sIGEgZmlsZSBuYW1lLgorICAgICAgICAgICAgaWYgKCBmaWxlcy5zaXplKCkgPj0gMiApIHsKKyAgICAgICAgICAgICAgICBkaWUoICJUb28gbWFueSBmaWxlcyBzcGVjaWZpZWQ7IHR3byBmaWxlcyByZXF1aXJlZCAodXNlIC0taGVscCBvcHRpb24gZm9yIGhlbHApIiApOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgIGZpbGVzLnB1c2hfYmFjayggYXJnICk7CisgICAgICAgIH07IC8vIGlmCisgICAgfTsgLy8gd2hpbGUKKyAgICBpZiAoIGZpbGVzLnNpemUoKSA8IDIgKSB7CisgICAgICAgIGRpZSggIk5vdCBlbm91Z2ggZmlsZXMgc3BlY2lmaWVkOyB0d28gZmlsZXMgcmVxdWlyZWQgKHVzZSAtLWhlbHAgb3B0aW9uIGZvciBoZWxwKSIgKTsKKyAgICB9OyAvLyBpZgorCisgICAgb2JqX2NvcHkoIGZpbGVzWyAwIF0sIGZpbGVzWyAxIF0sIHJlZGVmcyApOworCisgICAgcmV0dXJuIDA7CisKK30gLy8gbWFpbgorCisKKy8vIGVuZCBvZiBmaWxlIC8vCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rvb2xzL3JlcXVpcmVkLW9iamVjdHMucGwgYi9maW5hbC9ydW50aW1lL3Rvb2xzL3JlcXVpcmVkLW9iamVjdHMucGwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjM3OGIwOAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdG9vbHMvcmVxdWlyZWQtb2JqZWN0cy5wbApAQCAtMCwwICsxLDYyOSBAQAorIyEvdXNyL2Jpbi9wZXJsCisKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKwordXNlIEZpbGU6Okdsb2IgIjpnbG9iIjsKK3VzZSBEYXRhOjpEdW1wZXI7CisKK3VzZSBGaW5kQmluOwordXNlIGxpYiAiJEZpbmRCaW46OkJpbi9saWIiOworCit1c2UgdG9vbHM7Cit1c2UgUGxhdGZvcm0gIjp2YXJzIjsKKworb3VyICRWRVJTSU9OID0gIjAuMDA0IjsKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTZXQgb2Ygb2JqZWN0czogICAgICAgIyBSZWYgdG8gaGFzaCwga2V5cyBhcmUgbmFtZXMgb2Ygb2JqZWN0cy4KKyMgICAgIG9iamVjdDA6ICAgICAgICAgICMgUmVmIHRvIGhhc2ggb2YgdHdvIGVsZW1lbnRzIHdpdGgga2V5cyAiZGVmaW5lZCIgYW5kICJ1bmRlZmluZWQiLgorIyAgICAgICAgIGRlZmluZWQ6ICAgICAgIyBSZWYgdG8gYXJyYXkgb2Ygc3ltYm9scyBkZWZpbmVkIGluIG9iamVjdDAuCisjICAgICAgICAgICAgIC0gc3ltYm9sMCAjIFN5bWJvbCBuYW1lLgorIyAgICAgICAgICAgICAtIC4uLgorIyAgICAgICAgIHVuZGVmaW5lZDogICAgIyBSZWYgdG8gYXJyYXkgb2Ygc3ltYm9scyByZWZlcmVuY2VkIGluIG9iamVjdDAuCisjICAgICAgICAgICAgIC0gc3ltYm9sMAorIyAgICAgICAgICAgICAtIC4uLgorIyAgICAgb2JqZWN0MToKKyMgICAgICAgICAuLi4KKyMgICAgIC4uLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFNldCBvZiBzeW1ib2xzOiAgICAgICAjIFJlZiB0byBoYXNoLCBrZXlzIGFyZSBuYW1lcyBvZiBzeW1ib2xzLgorIyAgICBzeW1ib2wwOiAgICAgICAgICAgIyBSZWYgdG8gYXJyYXkgb2Ygb2JqZWN0IG5hbWVzIHdoZXJlIHRoZSBzeW1ib2wwIGlzIGRlZmluZWQuCisjICAgICAgICAtIG9iamVjdDAgICAgICAjIE9iamVjdCBmaWxlIG5hbWUuCisjICAgICAgICAtIC4uLgorIyAgICBzeW1ib2wxOgorIyAgICAgICAgLi4uCisjICAgIC4uLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdWIgZHVtcF9vYmplY3RzKCQkJCkgeworCisgICAgbXkgKCAkdGl0bGUsICRvYmplY3RzLCAkZHVtcCApID0gQF87CisKKyAgICBpZiAoICRkdW1wID4gMCApIHsKKyAgICAgICAgU1RERVJSLT5wcmludCggJHRpdGxlLCAiXG4iICk7CisgICAgICAgIGZvcmVhY2ggbXkgJG9iamVjdCAoIHNvcnQoIGtleXMoICUkb2JqZWN0cyApICkgKSB7CisgICAgICAgICAgICBTVERFUlItPnByaW50KCAiICAgICRvYmplY3RcbiIgKTsKKyAgICAgICAgICAgIGlmICggJGR1bXAgPiAxICkgeworICAgICAgICAgICAgICAgIFNUREVSUi0+cHJpbnQoICIgICAgICAgIERlZmluZWQgc3ltYm9sczpcbiIgKTsKKyAgICAgICAgICAgICAgICBmb3JlYWNoIG15ICRzeW1ib2wgKCBzb3J0KCBAeyAkb2JqZWN0cy0+eyAkb2JqZWN0IH0tPnsgZGVmaW5lZCB9IH0gKSApIHsKKyAgICAgICAgICAgICAgICAgICAgU1RERVJSLT5wcmludCggIiAgICAgICAgICAgICRzeW1ib2xcbiIgKTsKKyAgICAgICAgICAgICAgICB9OyAjIGZvcmVhY2ggJHN5bWJvbAorICAgICAgICAgICAgICAgIFNUREVSUi0+cHJpbnQoICIgICAgICAgIFVuZGVmaW5lZCBzeW1ib2xzOlxuIiApOworICAgICAgICAgICAgICAgIGZvcmVhY2ggbXkgJHN5bWJvbCAoIHNvcnQoIEB7ICRvYmplY3RzLT57ICRvYmplY3QgfS0+eyB1bmRlZmluZWQgfSB9ICkgKSB7CisgICAgICAgICAgICAgICAgICAgIFNUREVSUi0+cHJpbnQoICIgICAgICAgICAgICAkc3ltYm9sXG4iICk7CisgICAgICAgICAgICAgICAgfTsgIyBmb3JlYWNoICRzeW1ib2wKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgfTsgIyBmb3JlYWNoICRvYmplY3QKKyAgICB9OyAjIGlmCisKK307ICMgc3ViIGR1bXBfb2JqZWN0cworCitzdWIgZHVtcF9zeW1ib2xzKCQkJCkgeworCisgICAgbXkgKCAkdGl0bGUsICRzeW1ib2xzLCAkZHVtcCApID0gQF87CisKKyAgICBpZiAoICRkdW1wID4gMCApIHsKKyAgICAgICAgU1RERVJSLT5wcmludCggJHRpdGxlLCAiXG4iICk7CisgICAgICAgIGZvcmVhY2ggbXkgJHN5bWJvbCAoIHNvcnQoIGtleXMoICUkc3ltYm9scyApICkgKSB7CisgICAgICAgICAgICBTVERFUlItPnByaW50KCAiICAgICRzeW1ib2xcbiIgKTsKKyAgICAgICAgICAgIGlmICggJGR1bXAgPiAxICkgeworICAgICAgICAgICAgICAgIGZvcmVhY2ggbXkgJG9iamVjdCAoIHNvcnQoIEB7ICRzeW1ib2xzLT57ICRzeW1ib2wgfSB9ICkgKSB7CisgICAgICAgICAgICAgICAgICAgIFNUREVSUi0+cHJpbnQoICIgICAgICAgICRvYmplY3RcbiIgKTsKKyAgICAgICAgICAgICAgICB9OyAjIGZvcmVhY2gKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgfTsgIyBmb3JlYWNoICRvYmplY3QKKyAgICB9OyAjIGlmCisKK307ICMgc3ViIGR1bXBfc3ltYm9scworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIE5hbWU6CisjICAgICBsb2FkX3N5bWJvbHMgLS0gRnVsZmlsbCBvYmplY3RzIGRhdGEgc3RydWN0dXJlIHdpdGggc3ltYm9sIG5hbWVzLgorIyBTeW5vcHNpczoKKyMgICAgIGxvYWRfc3ltYm9scyggJG9iamVjdHMgKTsKKyMgQXJndW1lbnRzOgorIyAgICAgJG9iamVjdHMgKGluL291dCkgLS0gU2V0IG9mIG9iamVjdHMuIE9uIGVudGVyLCBpdCBpcyBleHBlY3RlZCB0aGF0IHRvcC1sZXZlbCBoYXNoIGhhcyBmaWxsZWQKKyMgICAgICAgICB3aXRoIG9iamVjdCBuYW1lcyBvbmx5LiBPbiBleGl0LCBpdCBpcyBjb21wbGV0ZWx5IGZ1bGZpbGxlZCB3aXRoIGxpc3RzIG9mIHN5bWJvbHMKKyMgICAgICAgICBkZWZpbmVkIG9yIHJlZmVyZW5jZWQgaW4gZWFjaCBvYmplY3QgZmlsZS4KKyMgUmV0dXJuczoKKyMgICAgIE5vdGhpbmcuCisjIEV4YW1wbGU6CisjICAgICBteSAkb2JqZWN0cyA9IHsgZm9vLm8gPT4ge30gfTsKKyMgICAgIGxvYWRfc3ltYm9scyggJG9iamVjdHMgKTsKKyMgICAgICMgTm93ICRvYmplY3RzIGlzIHsgZ29vLm8gPT4geyBkZWZpbmVkID0+IFsgLi4uIF0sIHVuZGVmaW5lZCA9PiBbIC4uLiBdIH0gfS4KKyMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVGhpcyB2ZXJzaW9uIG9mIGxvYWRfc3ltYm9scyBwYXJzZXMgb3V0cHV0IG9mIG5tIGNvbW1hbmQgYW5kIHdvcmtzIG9uIExpbnV4KiBPUyBhbmQgT1MgWCouCisjCitzdWIgX2xvYWRfc3ltYm9sc19ubSgkKSB7CisKKyAgICBteSAkb2JqZWN0cyA9IHNoaWZ0KCBAXyApOworICAgICAgICAjIEl0IGlzIGEgcmVmIHRvIGhhc2guIEtleXMgYXJlIG9iamVjdCBuYW1lcywgdmFsdWVzIGFyZSBlbXB0eSBoYXNoZXMgKGZvciBub3cpLgorICAgIG15IEBidWxrOworCisgICAgaWYgKCAlJG9iamVjdHMgKSB7CisgICAgICAgICMgRG8gbm90IHJ1biBubSBpZiBhIHNldCBvZiBvYmplY3RzIGlzIGVtcHR5IC0tIG5tIHdpbGwgdHJ5IHRvIG9wZW4gYS5vdXQgaW4gdGhpcyBjYXNlLgorICAgICAgICBleGVjdXRlKAorICAgICAgICAgICAgWworICAgICAgICAgICAgICAgICJubSIsCisgICAgICAgICAgICAgICAgIi1nIiwgICAgIyBEaXNwbGF5IG9ubHkgZXh0ZXJuYWwgKGdsb2JhbCkgc3ltYm9scy4KKyAgICAgICAgICAgICAgICAiLW8iLCAgICAjIFByZWNlZGUgZWFjaCBzeW1ib2wgYnkgdGhlIG5hbWUgb2YgdGhlIGlucHV0IGZpbGUuCisgICAgICAgICAgICAgICAga2V5cyggJSRvYmplY3RzICkKKyAgICAgICAgICAgICAgICAgICAgIyBSdW5uaW5nIG5tIG9uY2UgKHJhdGhlciB0aGFuIG9uY2UgcGVyIG9iamVjdCkgaW1wcm92ZXMgcGVyZm9ybWFuY2UKKyAgICAgICAgICAgICAgICAgICAgIyBkcmFzdGljYWxseS4KKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICAtc3Rkb3V0ID0+IFxAYnVsaworICAgICAgICApOworICAgIH07ICMgaWYKKworICAgIGZvcmVhY2ggbXkgJGxpbmUgKCBAYnVsayApIHsKKyAgICAgICAgaWYgKCAkbGluZSAhfiBte14oLiopOig/OiA/WzAtOWEtZl0qfCAqKSAoW0EtWmEtel0pICguKikkfSApIHsKKyAgICAgICAgICAgIGRpZSAiQ2Fubm90IHBhcnNlIG5tIG91dHB1dCwgbGluZTpcbiAgICAkbGluZVxuIjsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICBteSAoICRmaWxlLCAkdGFnLCAkc3ltYm9sICkgPSAoICQxLCAkMiwgJDMgKTsKKyAgICAgICAgaWYgKCBub3QgZXhpc3RzKCAkb2JqZWN0cy0+eyAkZmlsZSB9ICkgKSB7CisgICAgICAgICAgICBkaWUgIm5tIHJlcG9ydGVkIHVua25vd24gb2JqZWN0IGZpbGU6XG4gICAgJGxpbmVcbiI7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgIyBBQzogZXhjbHVkZSBzb21lIGxpYmMgc3ltYm9scyBmcm9tIHJlbmFtaW5nLCBvdGhlcndpc2Ugd2UgaGF2ZSBwcm9ibGVtcworICAgICAgICAjICAgICBpbiB0ZXN0cyBmb3IgZ2ZvcnRyYW4gKyBzdGF0aWMgbGliaW9tcCBvbiBMaW5fMzIuCisgICAgICAgICMgICAgIFRoZXNlIHN5bWJvbHMgY2FtZSBmcm9tIGxpYnRiYm1hbGxvYy5hCisgICAgICAgIGlmICggJHRhcmdldF9vcyBlcSAibGluIiApIHsKKyAgICAgICAgICAgIGlmICggJHN5bWJvbCA9fiBte19faTY4Nn0gKSB7CisgICAgICAgICAgICAgICAgbmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAjIEFDOiBhZGRlZCAidyIgdG8gdGFncyBvZiB1bmRlZmluZWQgc3ltYm9scywgZS5nLiBtYWxsb2MgaXMgd2VhayBpbiBsaWJpcmMgdjEyLjEuCisgICAgICAgIGlmICggJHRhZyBlcSAiVSIgb3IgJHRhZyBlcSAidyIgKSB7ICMgU3ltYm9sIG5vdCBkZWZpbmVkLgorICAgICAgICAgICAgcHVzaCggQHsgJG9iamVjdHMtPnsgJGZpbGUgfS0+eyB1bmRlZmluZWQgfSB9LCAkc3ltYm9sICk7CisgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICMgU3ltYm9sIGRlZmluZWQuCisgICAgICAgICAgICBwdXNoKCBAeyAkb2JqZWN0cy0+eyAkZmlsZSB9LT57IGRlZmluZWQgfSB9LCAkc3ltYm9sICk7CisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGZvcmVhY2gKKworICAgIHJldHVybiB1bmRlZjsKKworfTsgIyBzdWIgX2xvYWRfc3ltYm9sc19ubQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRoaXMgdmVyc2lvbiBvZiBsb2FkX3N5bWJvbHMgcGFyc2VzIG91dHB1dCBvZiBsaW5rIGNvbW1hbmQgYW5kIHdvcmtzIG9uIFdpbmRvd3MqIE9TLgorIworc3ViIF9sb2FkX3N5bWJvbHNfbGluaygkKSB7CisKKyAgICBteSAkb2JqZWN0cyA9IHNoaWZ0KCBAXyApOworICAgICAgICAjIEl0IGlzIGEgcmVmIHRvIGhhc2guIEtleXMgYXJlIG9iamVjdCBuYW1lcywgdmFsdWVzIGFyZSBlbXB0eSBoYXNoZXMgKGZvciBub3cpLgorICAgIG15IEBidWxrOworCisgICAgaWYgKCAlJG9iamVjdHMgKSB7CisgICAgICAgICMgRG8gbm90IHJ1biBubSBpZiBhIHNldCBvZiBvYmplY3RzIGlzIGVtcHR5IC0tIG5tIHdpbGwgdHJ5IHRvIG9wZW4gYS5vdXQgaW4gdGhpcyBjYXNlLgorICAgICAgICBleGVjdXRlKAorICAgICAgICAgICAgWworICAgICAgICAgICAgICAgICJsaW5rIiwKKyAgICAgICAgICAgICAgICAiL2R1bXAiLAorICAgICAgICAgICAgICAgICIvc3ltYm9scyIsCisgICAgICAgICAgICAgICAga2V5cyggJSRvYmplY3RzICkKKyAgICAgICAgICAgICAgICAgICAgIyBSdW5uaW5nIG5tIG9uY2UgKHJhdGhlciB0aGFuIG9uY2UgcGVyIG9iamVjdCkgaW1wcm92ZXMgcGVyZm9ybWFuY2UKKyAgICAgICAgICAgICAgICAgICAgIyBkcmFzdGljYWxseS4KKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICAtc3Rkb3V0ID0+IFxAYnVsaworICAgICAgICApOworICAgIH07ICMgaWYKKworICAgIG15ICRudW1fcmUgICA9IHFye1swLTlBLUZdezMsNH19OworICAgIG15ICRhZGRyX3JlICA9IHFye1swLTlBLUZdezh9fTsKKyAgICBteSAkdGFnX3JlICAgPSBxcntERUJVR3xBQlN8VU5ERUZ8U0VDVFswLTlBLUZdK307CisgICAgbXkgJGNsYXNzX3JlID0gcXJ7U3RhdGljfEV4dGVybmFsfEZpbGVuYW1lfExhYmVsfEJlZ2luRnVuY3Rpb258RW5kRnVuY3Rpb258V2Vha0V4dGVybmFsfFwuYmYgb3JcLmVmfTsKKworICAgIG15ICRmaWxlOworICAgIGZvcmVhY2ggbXkgJGxpbmUgKCBAYnVsayApIHsKKyAgICAgICAgaWYgKCAkbGluZSA9fiBte1xBRHVtcCBvZiBmaWxlICguKj8pXG5cen0gKSB7CisgICAgICAgICAgICAkZmlsZSA9ICQxOworICAgICAgICAgICAgaWYgKCBub3QgZXhpc3RzKCAkb2JqZWN0cy0+eyAkZmlsZSB9ICkgKSB7CisgICAgICAgICAgICAgICAgZGllICJsaW5rIHJlcG9ydGVkIHVua25vd24gb2JqZWN0IGZpbGU6XG4gICAgJGxpbmVcbiI7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgIH0gZWxzaWYgKCAkbGluZSA9fiBte1xBJG51bV9yZSB9ICkgeworICAgICAgICAgICAgaWYgKCBub3QgZGVmaW5lZCggJGZpbGUgKSApIHsKKyAgICAgICAgICAgICAgICBkaWUgImxpbmsgcmVwb3J0ZWQgc3ltYm9sIG9mIHVua25vd24gb2JqZWN0IGZpbGU6XG4gICAgJGxpbmVcbiI7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICBpZiAoICRsaW5lICF+IG17XEEkbnVtX3JlICRhZGRyX3JlICgkdGFnX3JlKVxzK25vdHlwZSg/OiBcKFwpKT9ccysoJGNsYXNzX3JlKVxzK1x8ICguKj8pXG5cen0gKSB7CisgICAgICAgICAgICAgICAgZGllICJDYW5ub3QgcGFyc2UgbGluayBvdXRwdXQsIGxpbmU6XG4gICAgJGxpbmVcbiI7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICBteSAoICR0YWcsICRjbGFzcywgJHN5bWJvbCApID0gKCAkMSwgJDIsICQzICk7CisgICAgICAgICAgICAjIGxpbmsuZXhlIC9kdW1wIHNvbWV0aW1lcyBwcmludHMgY29tbWVudHMgZm9yIHN5bWJvbHMsIGUuIGcuOgorICAgICAgICAgICAgIyAiLj8wX21lbWNvcHlBIChbRW50cnldID8wX21lbWNvcHlBKSIsIG9yICI/P19DQF8wMUFAcj8kQUFAIChgc3RyaW5nJykiLgorICAgICAgICAgICAgIyBTdHJpcCB0aGVzZSBjb21tZW50cy4KKyAgICAgICAgICAgICRzeW1ib2wgPX4gc3sgXCguKlwpXHp9e307CisgICAgICAgICAgICBpZiAoICRjbGFzcyBlcSAiRXh0ZXJuYWwiICkgeworICAgICAgICAgICAgICAgIGlmICggJHRhZyBlcSAiVU5ERUYiICkgeyAjIFN5bWJvbCBub3QgZGVmaW5lZC4KKyAgICAgICAgICAgICAgICAgICAgcHVzaCggQHsgJG9iamVjdHMtPnsgJGZpbGUgfS0+eyB1bmRlZmluZWQgfSB9LCAkc3ltYm9sICk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICMgU3ltYm9sIGRlZmluZWQuCisgICAgICAgICAgICAgICAgICAgIHB1c2goIEB7ICRvYmplY3RzLT57ICRmaWxlIH0tPnsgZGVmaW5lZCB9IH0sICRzeW1ib2wgKTsKKyAgICAgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAjIElnbm9yZSBhbGwgb3RoZXIgbGluZXMuCisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGZvcmVhY2gKKworICAgIHJldHVybiB1bmRlZjsKKworfTsgIyBzdWIgX2xvYWRfc3ltYm9sc19saW5rCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTmFtZToKKyMgICAgIHN5bWJvbHMgLS0gQ29uc3RydWN0IHNldCBvZiBzeW1ib2xzIHdpdGggc3BlY2lmaWVkIHRhZyBpbiB0aGUgc3BlY2lmaWVkIHNldCBvZiBvYmplY3RzLgorIyBTeW5vcHNpczoKKyMgICAgIG15ICRzeW1ib2xzID0gZGVmaW5lZF9zeW1ib2xzKCAkb2JqZWN0cywgJHRhZyApOworIyBBcmd1bWVudHM6CisjICAgICAkb2JqZWN0cyAoaW4pIC0tIFNldCBvZiBvYmplY3RzLgorIyAgICAgJHRhZyAoaW4pIC0tIEEgdGFnLCAiZGVmaW5lZCIgb3IgInVuZGVmaW5lZCIuCisjIFJldHVybnM6CisjICAgICBTZXQgb2Ygc3ltYm9scyB3aXRoIHRoZSBzcGVjaWZpZWQgdGFnLgorIworc3ViIHN5bWJvbHMoJCQpIHsKKworICAgIG15ICRvYmplY3RzID0gc2hpZnQoIEBfICk7CisgICAgbXkgJHRhZyAgICAgPSBzaGlmdCggQF8gKTsKKworICAgIG15ICRzeW1ib2xzID0ge307CisKKyAgICBmb3JlYWNoIG15ICRvYmplY3QgKCBrZXlzKCAlJG9iamVjdHMgKSApIHsKKyAgICAgICAgZm9yZWFjaCBteSAkc3ltYm9sICggQHsgJG9iamVjdHMtPnsgJG9iamVjdCB9LT57ICR0YWcgfSB9ICkgeworICAgICAgICAgICAgcHVzaCggQHsgJHN5bWJvbHMtPnsgJHN5bWJvbCB9IH0sICRvYmplY3QgKTsKKyAgICAgICAgfTsgIyBmb3JlYWNoICRzeW1ib2wKKyAgICB9OyAjIGZvcmVhY2ggJG9iamVjdAorCisgICAgcmV0dXJuICRzeW1ib2xzOworCit9OyAjIHN1YiBzeW1ib2xzCisKK3N1YiBkZWZpbmVkX3N5bWJvbHMoJCkgeworCisgICAgbXkgJG9iamVjdHMgPSBzaGlmdCggQF8gKTsKKyAgICBteSAkZGVmaW5lZCA9IHN5bWJvbHMoICRvYmplY3RzLCAiZGVmaW5lZCIgKTsKKyAgICByZXR1cm4gJGRlZmluZWQ7CisKK307ICMgc3ViIGRlZmluZWRfc3ltYm9scworCitzdWIgdW5kZWZpbmVkX3N5bWJvbHMoJCkgeworCisgICAgbXkgJG9iamVjdHMgPSBzaGlmdCggQF8gKTsKKyAgICBteSAkZGVmaW5lZCA9IHN5bWJvbHMoICRvYmplY3RzLCAiZGVmaW5lZCIgKTsKKyAgICBteSAkdW5kZWZpbmVkID0gc3ltYm9scyggJG9iamVjdHMsICJ1bmRlZmluZWQiICk7CisgICAgZm9yZWFjaCBteSAkc3ltYm9sICgga2V5cyggJSRkZWZpbmVkICkgKSB7CisgICAgICAgIGRlbGV0ZSggJHVuZGVmaW5lZC0+eyAkc3ltYm9sIH0gKTsKKyAgICB9OyAjIGZvcmVhY2ggc3ltYm9sCisgICAgcmV0dXJuICR1bmRlZmluZWQ7CisKK307ICMgc3ViIHVuZGVmaW5lZF9zeW1ib2xzCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTmFtZToKKyMgICAgIF9yZXF1aXJlZF9leHRyYV9vYmplY3RzIC0tIFNlbGVjdCBhIHN1YnNldCBvZiBleHRyYSBvYmplY3RzIHJlcXVpcmVkIHRvIHJlc29sdmUgdW5kZWZpbmVkCisjICAgICAgICAgc3ltYm9scyBpbiBhIHNldCBvZiBvYmplY3RzLiBJdCBpcyBhIGhlbHBlciBzdWIgZm9yIHJlcXVpcmVkX2V4dHJhX29iamVjdHMoKS4KKyMgU3lub3BzaXM6CisjICAgICBteSAkcmVxdWlyZWQgPSBfcmVxdWlyZWRfZXh0cmFfb2JqZWN0cyggJG9iamVjdHMsICRleHRyYSwgJHN5bWJvbHMgKTsKKyMgQXJndW1lbnRzOgorIyAgICAgJG9iamVjdHMgKGluKSAtLSBBIHNldCBvZiBvYmplY3RzIHRvIGJlIHNlYXJjaGVkIGZvciB1bmRlZmluZWQgc3ltYm9scy4KKyMgICAgICRleHRyYSAoaW4pIC0tIEEgc2V0IG9mIGV4dHJhIG9iamVjdHMgdG8gYmUgc2VhcmNoZWQgZm9yIGRlZmluZWQgc3ltYm9scyB0byByZXNvbHZlIHVuZGVmaW5lZAorIyAgICAgICAgIHN5bWJvbHMgaW4gb2JqZWN0cy4KKyMgICAgICRzeW1ib2xzIChpbi9vdXQpIC0tIFNldCBvZiBzeW1ib2xzIGRlZmluZWQgaW4gdGhlIHNldCBvZiBleHRlcm5hbCBvYmplY3RzLiBBdCB0aGUgZmlyc3QgY2FsbAorIyAgICAgICAgIGl0IHNob3VsZCBjb25zaXN0IG9mIGFsbCB0aGUgc3ltYm9scyBkZWZpbmVkIGluIGFsbCB0aGUgZXh0cmEgb2JqZWN0cy4gU3ltYm9scyBkZWZpbmVkIGluCisjICAgICAgICAgdGhlIHNlbGVjdGVkIHN1YnNldCBvZiBleHRyYSBvYmplY3RzIGFyZSByZW1vdmVkIGZyb20gc2V0IG9mIGRlZmluZWQgc3ltYm9scywgYmVjYXVzZQorIyAgICAgICAgIHRoZXkgYXJlIG91dCBvZiBpbnRlcmVzdCBmb3Igc3Vic2VxdWVudCBjYWxscy4KKyMgUmV0dXJuczoKKyMgICAgIEEgc3Vic2V0IG9mIGV4dHJhIG9iamVjdHMgcmVxdWlyZWQgYnkgdGhlIHNwZWNpZmllZCBzZXQgb2Ygb2JqZWN0cy4KKyMKK3N1YiBfcmVxdWlyZWRfZXh0cmFfb2JqZWN0cygkJCQkKSB7CisKKyAgICBteSAkb2JqZWN0cyA9IHNoaWZ0KCBAXyApOworICAgIG15ICRleHRyYSAgID0gc2hpZnQoIEBfICk7CisgICAgbXkgJHN5bWJvbHMgPSBzaGlmdCggQF8gKTsKKyAgICBteSAkZHVtcCAgICA9IHNoaWZ0KCBAXyApOworCisgICAgbXkgJHJlcXVpcmVkID0ge307CisKKyAgICBpZiAoICRkdW1wID4gMCApIHsKKyAgICAgICAgU1RERVJSLT5wcmludCggIlJlcXVpcmVkIGV4dHJhIG9iamVjdHM6XG4iICk7CisgICAgfTsgIyBpZgorICAgIGZvcmVhY2ggbXkgJG9iamVjdCAoIGtleXMoICUkb2JqZWN0cyApICkgeworICAgICAgICBmb3JlYWNoIG15ICRzeW1ib2wgKCBAeyAkb2JqZWN0cy0+eyAkb2JqZWN0IH0tPnsgdW5kZWZpbmVkIH0gfSApIHsKKyAgICAgICAgICAgIGlmICggZXhpc3RzKCAkc3ltYm9scy0+eyAkc3ltYm9sIH0gKSApIHsKKyAgICAgICAgICAgICAgICAjIEFkZCBhbGwgb2JqZWN0cyB3aGVyZSB0aGUgc3ltYm9sIGlzIGRlZmluZWQgdG8gdGhlIHJlcXVpcmVkIG9iamVjdHMuCisgICAgICAgICAgICAgICAgZm9yZWFjaCBteSAkcmVxX29iaiAoIEB7ICRzeW1ib2xzLT57ICRzeW1ib2wgfSB9ICkgeworICAgICAgICAgICAgICAgICAgICBpZiAoICRkdW1wID4gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNUREVSUi0+cHJpbnQoICIgICAgJHJlcV9vYmpcbiIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJGR1bXAgPiAxICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUREVSUi0+cHJpbnQoICIgICAgICAgIGJ5ICRvYmplY3RcbiIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVERFUlItPnByaW50KCAiICAgICAgICAgICAgZHVlIHRvICRzeW1ib2xcbiIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgICAgICAgICAkcmVxdWlyZWQtPnsgJHJlcV9vYmogfSA9ICRleHRyYS0+eyAkcmVxX29iaiB9OworICAgICAgICAgICAgICAgIH07ICMgZm9yZWFjaCAkcmVxX29iagorICAgICAgICAgICAgICAgICMgRGVsZXRlIHRoZSBzeW1ib2wgZnJvbSBsaXN0IG9mIGRlZmluZWQgc3ltYm9scy4KKyAgICAgICAgICAgICAgICBkZWxldGUoICRzeW1ib2xzLT57ICRzeW1ib2wgfSApOworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICB9OyAjIGZvcmVhY2ggJHN5bWJvbAorICAgIH07ICMgZm9yZWFjaCAkb2JqZWN0CisKKyAgICByZXR1cm4gJHJlcXVpcmVkOworCit9OyAjIHN1YiBfcmVxdWlyZWRfZXh0cmFfb2JqZWN0cworCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTmFtZToKKyMgICAgIHJlcXVpcmVkX2V4dHJhX29iamVjdHMgLS0gU2VsZWN0IGEgc3Vic2V0IG9mIGV4dHJhIG9iamVjdHMgcmVxdWlyZWQgdG8gcmVzb2x2ZSB1bmRlZmluZWQKKyMgICAgICAgICBzeW1ib2xzIGluIGEgc2V0IG9mIGJhc2Ugb2JqZWN0cyBhbmQgc2VsZWN0ZWQgZXh0cmEgb2JqZWN0cy4KKyMgU3lub3BzaXM6CisjICAgICBteSAkcmVxdWlyZWQgPSByZXF1aXJlZF9leHRyYV9vYmplY3RzKCAkYmFzZSwgJGV4dHJhICk7CisjIEFyZ3VtZW50czoKKyMgICAgICRiYXNlIChpbi9vdXQpIC0tIEEgc2V0IG9mIGJhc2Ugb2JqZWN0cyB0byBiZSBzZWFyY2hlZCBmb3IgdW5kZWZpbmVkIHN5bWJvbHMuIE9uIGVudGVyLCBpdCBpcworIyAgICAgICAgIGV4cGVjdGVkIHRoYXQgdG9wLWxldmVsIGhhc2ggaGFzIGZpbGxlZCB3aXRoIG9iamVjdCBuYW1lcyBvbmx5LiBPbiBleGl0LCBpdCBpcyBjb21wbGV0ZWx5CisjICAgICAgICAgZnVsZmlsbGVkIHdpdGggbGlzdHMgb2Ygc3ltYm9scyBkZWZpbmVkIGFuZC9vciByZWZlcmVuY2VkIGluIGVhY2ggb2JqZWN0IGZpbGUuCisjICAgICAkZXh0cmEgKGluL291dCkgLS0gQSBzZXQgb2YgZXh0cmEgb2JqZWN0cyB0byBiZSBzZWFyY2hlZCBmb3IgZGVmaW5lZCBzeW1ib2xzIHJlcXVpcmVkIHRvCisjICAgICAgICAgcmVzb2x2ZSB1bmRlZmluZWQgc3ltYm9scyBpbiBhIHNldCBvZiBiYXNlIG9iamVjdHMuIFVzYWdlIGlzIHNpbWlsYXIgdG8gYmFzZSBvYmplY3RzLgorIyBSZXR1cm5zOgorIyAgICAgQSBzdWJzZXQgb2YgZXh0cmEgb2JqZWN0IGZpbGVzLgorIworc3ViIHJlcXVpcmVkX2V4dHJhX29iamVjdHMoJCQkKSB7CisKKyAgICBteSAkYmFzZSAgICA9IHNoaWZ0KCBAXyApOworICAgIG15ICRleHRyYSAgID0gc2hpZnQoIEBfICk7CisgICAgbXkgJGR1bXAgICAgPSBzaGlmdCggQF8gKTsKKworICAgICMgTG9hZCBzeW1ib2xzIGZvciBlYWNoIG9iamVjdC4KKyAgICBsb2FkX3N5bWJvbHMoICRiYXNlICk7CisgICAgbG9hZF9zeW1ib2xzKCAkZXh0cmEgKTsKKyAgICBpZiAoICRkdW1wICkgeworICAgICAgICBkdW1wX29iamVjdHMoICJCYXNlIG9iamVjdHM6IiwgJGJhc2UsICRkdW1wICk7CisgICAgICAgIGR1bXBfb2JqZWN0cyggIkV4dHJhIG9iamVjdHM6IiwgJGV4dHJhLCAkZHVtcCApOworICAgIH07ICMgaWYKKworICAgICMgQ29sbGVjdCBzeW1ib2xzIGRlZmluZWQgaW4gZXh0cmEgb2JqZWN0cy4KKyAgICBteSAkc3ltYm9scyA9IGRlZmluZWRfc3ltYm9scyggJGV4dHJhICk7CisKKyAgICBteSAkcmVxdWlyZWQgPSB7fTsKKyAgICAjIFNlbGVjdCBleHRyYSBvYmplY3RzIHJlcXVpcmVkIGJ5IGJhc2Ugb2JqZWN0cy4KKyAgICBteSAkZGVsdGEgPSBfcmVxdWlyZWRfZXh0cmFfb2JqZWN0cyggJGJhc2UsICRleHRyYSwgJHN5bWJvbHMsICRkdW1wICk7CisgICAgd2hpbGUgKCAlJGRlbHRhICkgeworICAgICAgICAlJHJlcXVpcmVkID0gKCAlJHJlcXVpcmVkLCAlJGRlbHRhICk7CisgICAgICAgICMgUHJvYmFibHksIGp1c3Qgc2VsZWN0ZWQgb2JqZWN0cyByZXF1aXJlIHNvbWUgbW9yZSBvYmplY3RzLgorICAgICAgICAkZGVsdGEgPSBfcmVxdWlyZWRfZXh0cmFfb2JqZWN0cyggJGRlbHRhLCAkZXh0cmEsICRzeW1ib2xzLCAkZHVtcCApOworICAgIH07ICMgd2hpbGUKKworICAgIGlmICggJGR1bXAgKSB7CisgICAgICAgIG15ICRiYXNlX3VuZGVmaW5lZCA9IHVuZGVmaW5lZF9zeW1ib2xzKCAkYmFzZSApOworICAgICAgICBteSAkcmVxX3VuZGVmaW5lZCA9IHVuZGVmaW5lZF9zeW1ib2xzKCAkcmVxdWlyZWQgKTsKKyAgICAgICAgZHVtcF9zeW1ib2xzKCAiU3ltYm9scyB1bmRlZmluZWQgaW4gYmFzZSBvYmplY3RzOiIsICRiYXNlX3VuZGVmaW5lZCwgJGR1bXAgKTsKKyAgICAgICAgZHVtcF9zeW1ib2xzKCAiU3ltYm9scyB1bmRlZmluZWQgaW4gcmVxdWlyZWQgb2JqZWN0czoiLCAkcmVxX3VuZGVmaW5lZCwgJGR1bXAgKTsKKyAgICB9OyAjIGlmCisKKyAgICByZXR1cm4gJHJlcXVpcmVkOworCit9OyAjIHN1YiByZXF1aXJlZF9leHRyYV9vYmplY3RzCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBOYW1lOgorIyAgICAgY29weV9vYmplY3RzIC0tIENvcHkgKGFuZCBvcHRpb25hbGx5IGVkaXQpIG9iamVjdCBmaWxlcyB0byBzcGVjaWZpZWQgZGlyZWN0b3J5LgorIyBTeW5vcHNpczoKKyMgICAgIGNvcHlfb2JqZWN0cyggJG9iamVjdHMsICR0YXJnZXQsICRwcmVmaXgsIEBzeW1ib2xzICk7CisjIEFyZ3VtZW50czoKKyMgICAgICRvYmplY3RzIChpbikgLS0gQSBzZXQgb2Ygb2JqZWN0IGZpbGVzLgorIyAgICAgJHRhcmdldCAoaW4pIC0tIEEgbmFtZSBvZiB0YXJnZXQgZGlyZWN0b3J5LiBEaXJlY3RvcnkgbXVzdCBleGlzdC4KKyMgICAgICRwcmVmaXggKGluKSAtLSBBIHByZWZpeCB0byBhZGQgdG8gYWxsIHRoZSBzeW1ib2xzIGxpc3RlZCBpbiBAc3ltYm9scy4gSWYgcHJlZml4IGlzIHVuZGVmaW5lZCwKKyMgICAgICAgICBvYmplY3QgZmlsZXMgYXJlIGp1c3QgY29waWVkLgorIyAgICAgQHN5bWJvbHMgKGluKSAtLSBMaXN0IG9mIHN5bWJvbCBuYW1lcyB0byBiZSByZW5hbWVkLgorIyBSZXR1cm5zOgorIyAgICAgTm9uZS4KKyMKK3N1YiBjb3B5X29iamVjdHMoJCQ7JFxAKSB7CisKKyAgICBteSAkb2JqZWN0cyA9IHNoaWZ0KCBAXyApOworICAgIG15ICR0YXJnZXQgID0gc2hpZnQoIEBfICk7CisgICAgbXkgJHByZWZpeCAgPSBzaGlmdCggQF8gKTsKKyAgICBteSAkc3ltYm9scyA9IHNoaWZ0KCBAXyApOworICAgIG15IEByZWRlZmluZTsKKyAgICBteSBAcmVkZWZpbmVfOworICAgIG15ICRzeW1zX2ZpbGUgPSAiX19rbXBfc3ltX3BhaXJzLmxvZyI7CisKKyAgICBpZiAoIG5vdCAtZSAkdGFyZ2V0ICkgeworICAgICAgICBkaWUgIlwiJHRhcmdldFwiIGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdFxuIjsKKyAgICB9OyAjIGlmCisgICAgaWYgKCBub3QgLWQgJHRhcmdldCApIHsKKyAgICAgICAgZGllICJcIiR0YXJnZXRcIiBpcyBub3QgYSBkaXJlY3RvcnlcbiI7CisgICAgfTsgIyBpZgorCisgICAgaWYgKCBkZWZpbmVkKCAkcHJlZml4ICkgYW5kIEAkc3ltYm9scyApIHsKKyAgICAgICAgbXkgJWEgPSBtYXAgKCAoICIkXyAkcHJlZml4JF8iID0+IDEgKSwgQCRzeW1ib2xzICk7CisgICAgICAgIEByZWRlZmluZV8gPSBrZXlzKCAlYSApOworICAgIH07ICMgaWYKKyAgICBmb3JlYWNoIG15ICRsaW5lICggQHJlZGVmaW5lXyApIHsKKyAgICAgICAgJGxpbmUgPX4gc3skcHJlZml4KFxXKyl9eyQxJHByZWZpeH07CisgICAgICAgIHB1c2goIEByZWRlZmluZSwgJGxpbmUgKTsKKyAgICB9CisgICAgd3JpdGVfZmlsZSggJHN5bXNfZmlsZSwgXEByZWRlZmluZSApOworICAgIGZvcmVhY2ggbXkgJHNyYyAoIHNvcnQoIGtleXMoICUkb2JqZWN0cyApICkgKSB7CisgICAgICAgIG15ICRkc3QgPSBjYXRfZmlsZSggJHRhcmdldCwgZ2V0X2ZpbGUoICRzcmMgKSApOworICAgICAgICBpZiAoIEByZWRlZmluZSApIHsKKyAgICAgICAgICAgIGV4ZWN1dGUoIFsgIm9iamNvcHkiLCAiLS1yZWRlZmluZS1zeW1zIiwgJHN5bXNfZmlsZSwgJHNyYywgJGRzdCBdICk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb3B5X2ZpbGUoICRzcmMsICRkc3QsIC1vdmVyd3JpdGUgPT4gMSApOworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBmb3JlYWNoICRvYmplY3QKKworfTsgIyBzdWIgY29weV9vYmplY3RzCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBNYWluLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitteSAkYmFzZSAgPSB7fTsKK215ICRleHRyYSA9IHt9OworbXkgJHN3aXRjaGVyID0gJGJhc2U7CitteSAkZHVtcCA9IDA7CitteSAkcHJpbnRfYmFzZTsKK215ICRwcmludF9leHRyYTsKK215ICRjb3B5X2Jhc2U7CitteSAkY29weV9leHRyYTsKK215ICRwcmVmaXg7CisKKyMgUGFyc2UgY29tbWFuZCBsaW5lLgorCitHZXRvcHQ6Okxvbmc6OkNvbmZpZ3VyZSggInBlcm11dGUiICk7CitnZXRfb3B0aW9ucygKKyAgICBQbGF0Zm9ybTo6dGFyZ2V0X29wdGlvbnMoKSwKKyAgICAiYmFzZSIgICAgICAgICA9PiBzdWIgeyAkc3dpdGNoZXIgPSAkYmFzZTsgIH0sCisgICAgImV4dHJhIiAgICAgICAgPT4gc3ViIHsgJHN3aXRjaGVyID0gJGV4dHJhOyB9LAorICAgICJwcmludC1iYXNlIiAgID0+IFwkcHJpbnRfYmFzZSwKKyAgICAicHJpbnQtZXh0cmEiICA9PiBcJHByaW50X2V4dHJhLAorICAgICJwcmludC1hbGwiICAgID0+IHN1YiB7ICRwcmludF9iYXNlID0gMTsgJHByaW50X2V4dHJhID0gMTsgfSwKKyAgICAiY29weS1iYXNlPXMiICA9PiBcJGNvcHlfYmFzZSwKKyAgICAiY29weS1leHRyYT1zIiA9PiBcJGNvcHlfZXh0cmEsCisgICAgImNvcHktYWxsPXMiICAgPT4gc3ViIHsgJGNvcHlfYmFzZSA9ICRfWyAxIF07ICRjb3B5X2V4dHJhID0gJF9bIDEgXTsgfSwKKyAgICAiZHVtcCIgICAgICAgICA9PiBzdWIgeyArKyAkZHVtcDsgfSwKKyAgICAicHJlZml4PXMiICAgICA9PiBcJHByZWZpeCwKKyAgICAiPD4iICAgID0+CisgICAgICAgIHN1YiB7CisgICAgICAgICAgICBteSAkYXJnID0gJF9bIDAgXTsKKyAgICAgICAgICAgIG15IEBhcmdzOworICAgICAgICAgICAgaWYgKCAkXk8gZXEgIk1TV2luMzIiICkgeworICAgICAgICAgICAgICAgICMgV2luZG93cyogT1MgZG9lcyBub3QgZXhwYW5kIHdpbGRjYXJkcy4gRG8gaXQuLi4KKyAgICAgICAgICAgICAgICBAYXJncyA9IGJzZF9nbG9iKCAkYXJnICk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEBhcmdzID0gKCAkYXJnICk7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICBmb3JlYWNoIG15ICRvYmplY3QgKCBAYXJncyApIHsKKyAgICAgICAgICAgICAgICBpZiAoIGV4aXN0cyggJGJhc2UtPnsgJG9iamVjdCB9ICkgb3IgZXhpc3RzKCAkZXh0cmEtPnsgJG9iamVjdCB9ICkgKSB7CisgICAgICAgICAgICAgICAgICAgIGRpZSAiT2JqZWN0IFwiJG9iamVjdFwiIGhhcyBhbHJlYWR5IGJlZW4gc3BlY2lmaWVkLlxuIjsKKyAgICAgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICAgICAgJHN3aXRjaGVyLT57ICRvYmplY3QgfSA9IHsgZGVmaW5lZCA9PiBbXSwgdW5kZWZpbmVkID0+IFtdIH07CisgICAgICAgICAgICB9OyAjIGZvcmVhY2gKKyAgICAgICAgfSwKKyk7CitpZiAoIG5vdCAlJGJhc2UgKSB7CisgICAgY21kbGluZV9lcnJvciggIk5vIGJhc2Ugb2JqZWN0cyBzcGVjaWZpZWQiICk7Cit9OyAjIGlmCisKK2lmICggJHRhcmdldF9vcyBlcSAid2luIiApIHsKKyAgICAqbG9hZF9zeW1ib2xzID0gXCZfbG9hZF9zeW1ib2xzX2xpbms7Cit9IGVsc2lmICggJHRhcmdldF9vcyBlcSAibGluIiBvciAkdGFyZ2V0X29zIGVxICJscmIiICkgeworICAgICpsb2FkX3N5bWJvbHMgPSBcJl9sb2FkX3N5bWJvbHNfbm07Cit9IGVsc2lmICggJHRhcmdldF9vcyBlcSAibWFjIiApIHsKKyAgICAqbG9hZF9zeW1ib2xzID0gXCZfbG9hZF9zeW1ib2xzX25tOworfSBlbHNlIHsKKyAgICBydW50aW1lX2Vycm9yKCAiT1MgXCIkdGFyZ2V0X29zXCIgbm90IHN1cHBvcnRlZCIgKTsKK307ICMgaWYKKworIyBEbyB0aGUgd29yay4KKworbXkgJHJlcXVpcmVkID0gcmVxdWlyZWRfZXh0cmFfb2JqZWN0cyggJGJhc2UsICRleHRyYSwgJGR1bXAgKTsKK2lmICggJHByaW50X2Jhc2UgKSB7CisgICAgcHJpbnQoIG1hcCggIiRfXG4iLCBzb3J0KCBrZXlzKCAlJGJhc2UgKSApICkgKTsKK307ICMgaWYKK2lmICggJHByaW50X2V4dHJhICkgeworICAgIHByaW50KCBtYXAoICIkX1xuIiwgc29ydCgga2V5cyggJSRyZXF1aXJlZCApICkgKSApOworfTsgIyBpZgorbXkgQHN5bWJvbHM7CitpZiAoIGRlZmluZWQoICRwcmVmaXggKSApIHsKKyAgICBmb3JlYWNoIG15ICRvYmplY3QgKCBzb3J0KCBrZXlzKCAlJHJlcXVpcmVkICkgKSApIHsKKyAgICAgICAgcHVzaCggQHN5bWJvbHMsIEB7ICRyZXF1aXJlZC0+eyAkb2JqZWN0IH0tPnsgZGVmaW5lZCB9IH0gKTsKKyAgICB9OyAjIGZvcmVhY2ggJG9iamVjdHMKK307ICMgaWYKK2lmICggJGNvcHlfYmFzZSApIHsKKyAgICBjb3B5X29iamVjdHMoICRiYXNlLCAkY29weV9iYXNlLCAkcHJlZml4LCBAc3ltYm9scyApOworfTsgIyBpZgoraWYgKCAkY29weV9leHRyYSApIHsKKyAgICBjb3B5X29iamVjdHMoICRyZXF1aXJlZCwgJGNvcHlfZXh0cmEsICRwcmVmaXgsIEBzeW1ib2xzICk7Cit9OyAjIGlmCisKK2V4aXQoIDAgKTsKKworX19FTkRfXworCis9cG9kCisKKz1oZWFkMSBOQU1FCisKK0I8cmVxdWlyZWQtb2JqZWN0cy5wbD4gLS0gU2VsZWN0IGEgcmVxdWlyZWQgZXh0cmEgb2JqZWN0IGZpbGVzLgorCis9aGVhZDEgU1lOT1BTSVMKKworQjxyZXF1aXJlZC1vYmplY3RzLnBsPiBJPG9wdGlvbj4uLi4gWy0tYmFzZV0gSTxmaWxlPi4uLiAtLWV4dHJhIEk8ZmlsZT4uLi4KKworPWhlYWQxIERFU0NSSVBUSU9OCisKK0I8cmVxdWlyZWQtb2JqZWN0cy5wbD4gd29ya3Mgd2l0aCB0d28gc2V0cyBvZiBvYmplY3QgZmlsZXMgLS0gYSBzZXQgb2YgSTxiYXNlPiBvYmplY3RzCithbmQgYSBzZXQgb2YgSTxleHRyYT4gb2JqZWN0cywgYW5kIHNlbGVjdHMgdGhvc2UgZXh0cmEgb2JqZWN0cyB3aGljaCBhcmUgcmVxdWlyZWQgZm9yIHJlc29sdmluZwordW5kZWZpbmVkIHN5bWJvbHMgaW4gYmFzZSBvYmplY3RzIEk8YW5kPiBzZWxlY3RlZCBleHRyYSBvYmplY3RzLgorCitTZWxlY3RlZCBvYmplY3QgZmlsZXMgbWF5IGJlIGNvcGllZCB0byBzcGVjaWZpZWQgbG9jYXRpb24gb3IgdGhlaXIgbmFtZXMgbWF5IGJlIHByaW50ZWQgdG8gc3Rkb3V0LAorYSBuYW1lIHBlciBsaW5lLiBBZGRpdGlvbmFsbHksIHN5bWJvbHMgZGVmaW5lZCBpbiBzZWxlY3RlZCBleHRyYSBvYmplY3RzIG1heSBiZSByZW5hbWVkLgorCitEZXBlbmRpbmcgb24gT1MsIGRpZmZlcmVudCBleHRlcm5hbCB0b29scyBtYXkgYmUgdXNlZC4gRm9yIGV4YW1wbGUsIEI8cmVxdWlyZWQtb2JqZWN0cy5wbD4gdXNlcworRjxsaW5rLmV4ZT4gb24gIndpbiIgYW5kIEY8bm0+IG9uICJsaW4iIGFuZCAibWFjIiBPU2VzLiBOb3JtYWxseSBPUyBpcyBhdXRvZGV0ZWN0ZWQsIGJ1dAorZGV0ZWN0aW9uIGNhbiBiZSBvdmVycmlkZWQgd2l0aCBCPC0tb3M+IG9wdGlvbi4gSXQgbWF5IGJlIGhlbHBmdWwgaW4gY3Jvc3MtYnVpbGQgZW52aXJvbm1lbnRzLgorCis9aGVhZDEgT1BUSU9OUworCis9b3ZlcgorCis9aXRlbSBCPC0tYmFzZT4KKworVGhlIGxpc3Qgb2YgYmFzZSBvYmplY3RzIGZvbGxvd3MgdGhpcyBvcHRpb24uCisKKz1pdGVtIEI8LS1leHRyYT4KKworTGlzdCBvZiBleHRyYSBvYmplY3RzIGZvbGxvd3MgdGhpcyBvcHRpb24uCisKKz1pdGVtIEI8LS1wcmludC1hbGw+CisKK1ByaW50IGxpc3Qgb2YgYmFzZSBvYmplY3RzIGFuZCBsaXN0IG9mIHJlcXVpcmVkIGV4dHJhIG9iamVjdHMuCisKKz1pdGVtIEI8LS1wcmludC1iYXNlPgorCitQcmludCBsaXN0IG9mIGJhc2Ugb2JqZWN0cy4KKworPWl0ZW0gQjwtLXByaW50LWV4dHJhPgorCitQcmludCBsaXN0IG9mIHNlbGVjdGVkIGV4dHJhIG9iamVjdHMuCisKKz1pdGVtIEI8LS1jb3B5LWFsbD0+STxkaXI+CisKK0NvcHkgYWxsIGJhc2UgYW5kIHNlbGVjdGVkIGV4dHJhIG9iamVjdHMgdG8gc3BlY2lmaWVkIGRpcmVjdG9yeS4gVGhlIGRpcmVjdG9yeSBtdXN0IGV4aXN0LiBFeGlzdGluZworZmlsZXMgYXJlIG92ZXJ3cml0dGVuLgorCis9aXRlbSBCPC0tY29weS1iYXNlPT5JPGRpcj4KKworQ29weSBhbGwgYmFzZSBvYmplY3RzIHRvIHNwZWNpZmllZCBkaXJlY3RvcnkuCisKKz1pdGVtIEI8LS1jb3B5LWV4dHJhPT5JPGRpcj4KKworQ29weSBzZWxlY3RlZCBleHRyYSBvYmplY3RzIHRvIHNwZWNpZmllZCBkaXJlY3RvcnkuCisKKz1pdGVtIEI8LS1wcmVmaXg9Pkk8c3RyPgorCitJZiBwcmVmaXggaXMgc3BlY2lmaWVkLCBjb3BpZWQgb2JqZWN0IGZpbGVzIGFyZSBlZGl0ZWQgLS0gc3ltYm9scyBkZWZpbmVkIGluIHNlbGVjdGVkIGV4dHJhCitvYmplY3QgZmlsZXMgYXJlIHJlbmFtZWQgKGluIGFsbCB0aGUgY29waWVkIG9iamVjdCBmaWxlcykgYnkgYWRkaW5nIHRoaXMgcHJlZml4LgorCitGPG9iamNvcHk+IHByb2dyYW0gc2hvdWxkIGJlIGF2YWlsYWJsZSBmb3IgcGVyZm9ybWluZyB0aGlzIG9wZXJhdGlvbi4KKworPWl0ZW0gQjwtLW9zPT5JPHN0cj4KKworU3BlY2lmeSBPUyBuYW1lLiBCeSBkZWZhdWx0IE9TIGlzIGF1dG9kZXRlY3RlZC4KKworRGVwZW5kaW5nIG9uIE9TLCBCPHJlcXVpcmVkLW9iamVjdHMucGw+IHVzZXMgZGlmZmVyZW50IGV4dGVybmFsIHRvb2xzLgorCis9aXRlbSBCPC0taGVscD4KKworUHJpbnQgc2hvcnQgaGVscCBtZXNzYWdlIGFuZCBleGl0LgorCis9aXRlbSBCPC0tZG9jPgorCis9aXRlbSBCPC0tbWFudWFsPgorCitQcmludCBmdWxsIGRvY3VtZW50YXRpb24gYW5kIGV4aXQuCisKKz1pdGVtIEI8LS12ZXJzaW9uPgorCitQcmludCB2ZXJzaW9uIGFuZCBleGl0LgorCis9YmFjaworCis9aGVhZDEgQVJHVU1FTlRTCisKKz1vdmVyCisKKz1pdGVtIEk8ZmlsZT4KKworQSBuYW1lIG9mIG9iamVjdCBmaWxlLgorCis9YmFjaworCis9aGVhZDEgRVhBTVBMRVMKKworICAgICQgcmVxdWlyZWQtb2JqZWN0cy5wbCAtLWJhc2Ugb2JqLyoubyAtLWV4dHJhIC4uL2xpYi9vYmovKi5vIC0tcHJpbnQtZXh0cmEgPiByZXF1aXJlZC5sc3QKKyAgICAkIGFyIGNyIGxpYnguYSBvYmovKi5vICQoY2F0IHJlcXVpcmVkLmxzdCkKKworICAgICQgcmVxdWlyZWQtb2JqZWN0cy5wbCAtLWJhc2UgaW50ZXJuYWwvKi5vIC0tZXh0cmEgZXh0ZXJuYWwvKi5vIC0tcHJlZml4PV9feHl6XyAtLWNvcHktYWxsPW9iagorICAgICQgYXIgY3IgeHl6LmEgb2JqLyoubworCis9Y3V0CisKKyMgZW5kIG9mIGZpbGUgIworCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rvb2xzL3NyYy9jb21tb24tY2hlY2tzLm1rIGIvZmluYWwvcnVudGltZS90b29scy9zcmMvY29tbW9uLWNoZWNrcy5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTBlYWVkCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90b29scy9zcmMvY29tbW9uLWNoZWNrcy5tawpAQCAtMCwwICsxLDk1IEBACisjIGNvbW1vbi1jaGVja3MubWsgIworCisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVGhpcyBmaWxlIGNvbnRhaW5zIHJlYWxseSBjb21tb24gZGVmaW5pdGlvbnMgdXNlZCBieSBtdWx0aXBsZSBtYWtlZmlsZXMuIE1vZGlmeSBpdCBjYXJlZnVsbHkhCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMKKyMgQ2hlY2sgdG9vbHMgdmVyc2lvbnMuCisjCitpZmVxICIkKGNsZWFuKSIgIiIgICAgIyBEbyBub3QgY2hlY2sgdG9vbHMgaWYgY2xlYW4gZ29hbCBzcGVjaWZpZWQuCisKKyAgICBjaGVja190b29sc19mbGFncyA9IC0tbWFrZQorCisgICAgIyBkZXRlcm1pbmUgaWYgZm9ydHJhbiBjaGVjayBpcyByZXF1aXJlZCBmcm9tIGdvYWxzCisgICAgIyBNQUtFQ01ER09BTFMgaXMgbGlrZSBhcmd2IGZvciBnbnUgbWFrZQorICAgIGlmbmVxICIkKGZpbHRlciBtb2QgYWxsLCQoTUFLRUNNREdPQUxTKSkiICIiCisgICAgICAgIGNoZWNrX3Rvb2xzX2ZsYWdzICs9IC0tZm9ydHJhbgorICAgIGVsc2UKKyAgICAgICAgaWZlcSAiJChNQUtFQ01ER09BTFMpIiAiIiAjIHdpbGwgZGVmYXVsdCB0byBhbGwgaWYgbm8gZ29hbHMgc3BlY2lmaWVkIG9uIGNvbW1hbmQgbGluZQorICAgICAgICAgICAgY2hlY2tfdG9vbHNfZmxhZ3MgKz0gLS1mb3J0cmFuCisgICAgICAgIGVuZGlmCisgICAgZW5kaWYKKyAgICBpZm5lcSAiJChmaWx0ZXIgZ2NjIGNsYW5nLCQoYykpIiAiIiAjIGlmIGJ1aWxkIGNvbXBpbGVyIGlzIGdjYyBvciBjbGFuZworICAgICAgICBjaGVja190b29sc19mbGFncyArPSAtLW5vaW50ZWwKKyAgICBlbmRpZgorICAgIGlmZXEgIiQoYykiICJjbGFuZyIKKyAgICAgICAgY2hlY2tfdG9vbHNfZmxhZ3MgKz0gLS1jbGFuZworICAgIGVuZGlmCisKKyAgICBjdXJyX3Rvb2xzIDo9ICQoc3RyaXAgJChzaGVsbCAkKHBlcmwpICQodG9vbHNfZGlyKWNoZWNrLXRvb2xzLnBsICQob2Etb3B0cykgJChjaGVja190b29sc19mbGFncykpKQorCisgICAgaWZlcSAiJChjdXJyX3Rvb2xzKSIgIiIKKyAgICAgICAgJChlcnJvciBjaGVjay10b29scy5wbCBmYWlsZWQpCisgICAgZW5kaWYKKyAgICBpZm5lcSAiJChmaW5kc3RyaW5nIE4vQSwkKGN1cnJfdG9vbHMpKSIgIiIKKyAgICAgICAgbWlzc2VkX3Rvb2xzIDo9ICQoZmlsdGVyICUtLS1fTi9BXy0tLSwkKGN1cnJfdG9vbHMpKQorICAgICAgICBtaXNzZWRfdG9vbHMgOj0gJChzdWJzdCA9LS0tX04vQV8tLS0sLCQobWlzc2VkX3Rvb2xzKSkKKyAgICAgICAgbWlzc2VkX3Rvb2xzIDo9ICQoc3Vic3QgJChzcGFjZSksJChjb21tYSkkKHNwYWNlKSwkKG1pc3NlZF90b29scykpCisgICAgICAgICQoZXJyb3IgRGV2ZWxvcG1lbnQgdG9vbHMgbm90IGZvdW5kOiAkKG1pc3NlZF90b29scykpCisgICAgZW5kaWYKKyAgICBwcmV2X3Rvb2xzIDo9ICQoc3RyaXAgJChzaGVsbCBbIC1lIHRvb2xzLmNmZyBdICYmIGNhdCB0b29scy5jZmcpKQorICAgICQoY2FsbCBzYXksVG9vbHMgIDogJChjdXJyX3Rvb2xzKSkKKyAgICBpZmVxICIkKHByZXZfdG9vbHMpIiAiIgorICAgICAgICAjIE5vIHNhdmVkIGNvbmZpZyBmaWxlLCBsZXQgdXMgY3JlYXRlIGl0LgorICAgICAgICBkdW1teSA6PSAkKHNoZWxsIGVjaG8gIiQoY3Vycl90b29scykiID4gdG9vbHMuY2ZnKQorICAgIGVsc2UKKyAgICAgICAgIyBDaGVjayB0aGUgc2F2ZWQgY29uZmlnIGZpbGUgbWF0Y2hlcyBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCisgICAgICAgIGlmbmVxICIkKGN1cnJfdG9vbHMpIiAiJChwcmV2X3Rvb2xzKSIKKyAgICAgICAgICAgICMgU2hvdyB0aGUgZGlmZmVydGVuY2UgYmV0d2VlbiBwcmV2aW91cyBhbmQgY3VycmVudCB0b29scy4KKyAgICAgICAgICAgICQoY2FsbCBzYXksT2xkIHRvb2xzIDogJChmaWx0ZXItb3V0ICQoY3Vycl90b29scyksJChwcmV2X3Rvb2xzKSkpCisgICAgICAgICAgICAkKGNhbGwgc2F5LE5ldyB0b29scyA6ICQoZmlsdGVyLW91dCAkKHByZXZfdG9vbHMpLCQoY3Vycl90b29scykpKQorICAgICAgICAgICAgIyBBbmQgaW5pdGlhdGUgcmVidWlsZC4KKyAgICAgICAgICAgICQoY2FsbCBzYXksVG9vbHMgY2hhbmdlZCQoY29tbWEpIHJlYnVpbGRpbmcuLi4pCisgICAgICAgICAgICBkdW1teSA6PSAkKHNoZWxsICQocm0pIC5yZWJ1aWxkICYmIGVjaG8gIiQoY3Vycl90b29scykiID4gdG9vbHMuY2ZnKQorICAgICAgICBlbmRpZgorICAgIGVuZGlmCitlbmRpZgorCisjIENoZWNrIGNvbmZpZy4KK2lmZXEgIiQoY3Vycl9jb25maWcpIiAiIgorICAgICQoZXJyb3IgbWFrZWZpbGUgbXVzdCBkZWZpbmUgYGN1cnJfY29uZmlnJyB2YXJpYWJsZSkKK2VuZGlmCitwcmV2X2NvbmZpZyA6PSAkKHNoZWxsIFsgLWUgYnVpbGQuY2ZnIF0gJiYgY2F0IGJ1aWxkLmNmZykKK2N1cnJfY29uZmlnIDo9ICQoc3RyaXAgJChjdXJyX2NvbmZpZykpCitpZmVxICIkKGNsZWFuKSIgIiIgICAgIyBEbyBub3QgY2hlY2sgY29uZmlnIGlmIGNsZWFuIGdvYWwgc3BlY2lmaWVkLgorICAgICQoY2FsbCBzYXksQ29uZmlnIDogJChjdXJyX2NvbmZpZykpCisgICAgaWZlcSAiJChwcmV2X2NvbmZpZykiICIiCisgICAgICAgICMgTm8gc2F2ZWQgY29uZmlnIGZpbGUsIGxldCB1cyBjcmVhdGUgaXQuCisgICAgICAgIGR1bW15IDo9ICQoc2hlbGwgZWNobyAiJChjdXJyX2NvbmZpZykiID4gYnVpbGQuY2ZnKQorICAgIGVsc2UKKyAgICAgICAgIyBDaGVjayBzYXZlZCBjb25maWcgZmlsZSBtYXRjaGVzIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KKyAgICAgICAgaWZuZXEgIiQoY3Vycl9jb25maWcpIiAiJChwcmV2X2NvbmZpZykiCisgICAgICAgICAgICAjIFNob3cgdGhlIGRpZmZlcnRlbmNlIGJldHdlZW4gcHJldmlvdXMgYW5kIGN1cnJlbnQgY29uZmlndXJhdGlvbnMuCisgICAgICAgICAgICAkKGNhbGwgc2F5LE9sZCBjb25maWcgOiAkKGZpbHRlci1vdXQgJChjdXJyX2NvbmZpZyksJChwcmV2X2NvbmZpZykpKQorICAgICAgICAgICAgJChjYWxsIHNheSxOZXcgY29uZmlnIDogJChmaWx0ZXItb3V0ICQocHJldl9jb25maWcpLCQoY3Vycl9jb25maWcpKSkKKyAgICAgICAgICAgICMgQW5kIGluaXRpYXRlIHJlYnVpbGQuCisgICAgICAgICAgICAkKGNhbGwgc2F5LENvbmZpZ3VyYXRpb24gY2hhbmdlZCQoY29tbWEpIHJlYnVpbGRpbmcuLi4pCisgICAgICAgICAgICBkdW1teSA6PSAkKHNoZWxsICQocm0pIC5yZWJ1aWxkICYmIGVjaG8gIiQoY3Vycl9jb25maWcpIiA+IGJ1aWxkLmNmZykKKyAgICAgICAgZW5kaWYKKyAgICBlbmRpZgorZW5kaWYKKworIyBlbmQgb2YgZmlsZSAjCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdG9vbHMvc3JjL2NvbW1vbi1kZWZzLm1rIGIvZmluYWwvcnVudGltZS90b29scy9zcmMvY29tbW9uLWRlZnMubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUyYTk2MgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdG9vbHMvc3JjL2NvbW1vbi1kZWZzLm1rCkBAIC0wLDAgKzEsMjI4IEBACisjIGNvbW1vbi1kZWZzLm1rICMKKworIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRoaXMgZmlsZSBjb250YWlucyByZWFsbHkgY29tbW9uIGRlZmluaXRpb25zIHVzZWQgYnkgbXVsdGlwbGUgbWFrZWZpbGVzLiBNb2RpZnkgaXQgY2FyZWZ1bGx5IQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFNvbWUgdHJpY2t5IHZhcmlhYmxlcy4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2VtcHR5IDo9CitzcGFjZSA6PSAkKGVtcHR5KSAkKGVtcHR5KQorY29tbWEgOj0gLAoraWZlcSAiJChkYXRlKSIgIiIKKyAgICAkKGVycm9yIENhbGxlciBzaG91bGQgc3BlY2lmeSAiZGF0ZSIgdmFyaWFibGUuKQorZW5kaWYKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBIZWxwZXIgZmluY3Rpb25zLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIFN5bm9wc2lzOgorIyAgICAgJChjYWxsIHNheSx0ZXh0LXRvLXByaW50LXRvLXRoZS1zY3JlZW4pCisjIERlc2NyaXB0aW9uOgorIyAgICAgVGhlIGZ1bmN0aW9uIHByaW50cyBpdHMgYXJndW1lbnQgdG8gdGhlIHNjcmVlbi4gSW4gY2FzZSBvZiBvbGRlciBtYWtlcyBpdCBpcyBhbmFsb2cgb2YKKyMgICAgICQod2FybmluZyksIHN0YXJ0aW5nIGZyb20gbWFrZSAzLjgxIGlzIGlzIGFuYWxvZyBvZiAkKGluZm8pLgorIworc2F5ID0gJCh3YXJuaW5nICQoMSkpCitpZm5lcSAiJChmaWx0ZXIgMy44MSwkKE1BS0VfVkVSU0lPTikpIiAiIgorICAgIHNheSA9ICQoaW5mbyAkKDEpKQorZW5kaWYKKworIyBTeW5vcHNpczoKKyMgICAgIGFyY2hpdGVjdHVyZSA9ICQoY2FsbCBsZWdhbF9hcmNoLDMyKQorIyBEZXNjcmlwdGlvbjoKKyMgICAgIFRoZSBmdW5jdGlvbiByZXR1cm4gcHJpbnRhYmxlIG5hbWUgb2Ygc3BlY2lmaWVkIGFyY2hpdGVjdHVyZSwgSUEtMzIgYXJjaGl0ZWN0dXJlIG9yIEludGVsKFIpIDY0LgorIworbGVnYWxfYXJjaCA9ICQoaWYgJChmaWx0ZXIgMzIsJCgxKSksSUEtMzIsJChpZiAkKGZpbHRlciAzMmUsJCgxKSksSW50ZWwoUikgNjQsJChpZiAkKGZpbHRlciBsMSwkKDEpKSxMMU9NLCQoaWYgJChmaWx0ZXIgYXJtLCQoMSkpLEFSTSwkKGlmICQoZmlsdGVyIHBwYzY0LCQoMSkpLFBQQzY0LCQoaWYgJChmaWx0ZXIgYWFyY2g2NCwkKDEpKSxBQXJjaDY0LCQoZXJyb3IgQmFkIGFyY2hpdGVjdHVyZSBzcGVjaWZpZWQ6ICQoMSkpKSkpKSkpCisKKyMgU3lub3BzaXM6CisjICAgICB2YXJfbmFtZSA9ICQoY2FsbCBjaGVja192YXJpYWJsZSx2YXIsbGlzdCkKKyMgRGVzY3JpcHRpb246CisjICAgICBUaGUgZnVuY3Rpb24gdmVyaWZpZXMgdGhlIHZhbHVlIG9mIHZhciB2YXJpYmFsZS4gSWYgaXQgaXMgZW1wdHksIHRoZSBmaXJzdCB3b3JkIGZyb20gdGhlIGxpc3QKKyMgICAgIGlzIGFzc2lnbmVkIHRvIHZhciBhcyBkZWZhdWx0IHZhbHVlLiBPdGhlcndpc2UgdGhlIHZhciB2YWx1ZSBtdXN0IG1hdGNoIG9uZSBvZiB3b3JkcyBpbiB0aGUKKyMgICAgIGxpc3QsIG9yIGVycm9yIGlzIGlzc3VlZC4KKyMgRXhhbXBsZToKKyMgICAgIExJTktfVFlQRSA9ICQoY2FsbCBjaGVja192YXJpYWJsZSxMSU5LX1RZUEUsc3RhdGljIGR5bmFtaWMpCisjCitjaGVja192YXJpYWJsZSA9ICQoY2FsbCBfY2hlY2tfdmFyaWFibGVfd29yZHMsJCgxKSkkKGNhbGwgX2NoZWNrX3ZhcmlhYmxlX3ZhbHVlLCQoMSksJCgyKSkKKworIyBTeW5vcHNpczoKKyMgICAgICQoY2FsbCBfY2hlY2tfdmFyaWFibGVfd29yZHMsdmFyKQorIyBEZXNjcmlwdGlvbjoKKyMgICAgIENoZWNrcyB0aGF0IHZhcmlhYmxlIHZhciBpcyBlbXB0eSBvciBzaW5nbGUgd29yZC4gSW4gY2FzZSBvZiBtdWx0aXBsZSB3b3JkcyBhbiBlcnJvciBpcworIyAgICAgaXNzdWVkLiBJdCBpcyBoZWxwZXIgZnVuY3Rpb24gZm9yIGNoZWNrX3ZhcmlhYmxlLgorIworX2NoZWNrX3ZhcmlhYmxlX3dvcmRzID0gJChpZiAkKGZpbHRlciAwIDEsJCh3b3JkcyAkKCQoMSkpKSksLFwKKyAgICAkKGVycm9yIElsbGVnYWwgdmFsdWUgb2YgJCgxKTogIiQoJCgxKSkiKSkKKworIyBTeW5vcHNpczoKKyMgICAgICQoY2FsbCBfY2hlY2tfdmFyaWFibGVfdmFsdWUsdmFyKQorIyBEZXNjcmlwdGlvbjoKKyMgICAgIElmIHZhcmlhYmxlIHZhciBpcyBlbXB0eSwgdGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIGZpcnN0IHdvcmQgZnJvbSB0aGUgbGlzdC4gSWYgdmFyaWFibGUgaXMKKyMgICAgIG5vdCBlbXB0eSBhbmQgbWF0Y2ggb25lIG9mIHdvcmRzIGluIHRoZSBsaXN0LCB2YXJpYWJsZSdzIHZhbHVlIHJldHVybmVkLiBPdGhlcndpc2UsIGVycm9yIGlzCisjICAgICBpc3N1ZWQuIEl0IGlzIGhlbHBlciBmdW5jdGlvbiBmb3IgY2hlY2tfdmFyaWFibGUuCisjCitfY2hlY2tfdmFyaWFibGVfdmFsdWUgPSAkKGlmICQoJCgxKSksJChpZiAkKGZpbHRlciAkKDIpLCQoJCgxKSkpLCQoJCgxKSksXAorICAgICQoZXJyb3IgSWxsZWdhbCB2YWx1ZSBvZiAkKDEpOiAiJCgkKDEpKSIpKSwkKGZpcnN0d29yZCAkKDIpKSkKKworIyBTeW5vcHNpczoKKyMgICAgICQoY2FsbCBkZWJ1Zyx2YXIpCisjIERlc2NyaXB0aW9uOgorIyAgICAgSWYgTElCT01QX01BS0VfREVCVUcgaXMgbm90IGVtcHR5LCB2YXIgbmFtZSBhbmQgdmFsdWUgcHJpbnRlZC4gVXNlIHRoaXMgZm9yIGRlYnVnIHB1cnBvc2UuCisjCitpZmVxICIkKExJQk9NUF9NQUtFX0RFQlVHKSIgIiIKKyAgICBkZWJ1ZyA9CitlbHNlCisgICAgZGVidWcgPSAkKGNhbGwgc2F5LGRlYnVnOiAkKDEpPSIkKCQoMSkpIikKK2VuZGlmCisKKyMgU3lub3BzaXM6CisjICAgICAkKGNhbGwgaGVhZGVyLHRhcmdldCkKKyMgRGVzY3JpcHRpb246CisjICAgICBSZXR1cm5zIGEgc3RyaW5nIHRvIHByaW50IHRvIHNob3cgYnVpbGQgcHJvZ3Jlc3MuCisjCitoZWFkZXIgPSAtLS0tLSAkKG1hcmtlcikgLS0tICQoMSkgLS0tLS0KKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBHbG9iYWwgbWFrZSBzZXR0aW5ncy4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBOb24tZW1wdHkgQ0RQQVRIIG1heSBsZWFkIHRvIHByb2JsZW1zIG9uIHNvbWUgcGxhdGZvcm1zOiBzaW1wbGUgImNkIGRpciIgKHdoZXJlICJkaXIiIGlzIGFuCisjIGV4aXN0aW5nIGRpcmVjdG9yeSBpbiBjdXJyZW50IG9uZSkgZmFpbHMuIENsZWFyaW5nIENEUEFUSCBzb2x2ZXMgdGhlIHByb2JsZW0uCitDRFBBVEggPQorLlNVRkZJWEVTIDogICAgICAgICAgICAjIENsZWFuIGRlZmF1bHQgbGlzdCBvZiBzdWZmaXhlcy4KKy5ERUxFVEVfT05fRVJST1IgOiAgICAgIyBEZWxldGUgdGFyZ2V0IGZpbGUgaW4gY2FzZSBvZiBlcnJvci4KKworJChjYWxsIHNheSwkKGNhbGwgaGVhZGVyLG1ha2luZyAkKGlmICQoTUFLRUNNREdPQUxTKSwkKE1BS0VDTURHT0FMUyksYWxsKSkpCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ2hlY2sgY2xlYW4gYW5kIGNsb2JiZXIgZ29hbHMuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgImNsZWFuIiBnb2FsIG11c3QgYmUgc3BlY2lmaWVkIGFsb25lLCBvdGhlcndpc2Ugd2UgaGF2ZSB0cm91YmxlcyB3aXRoIGRlcGVuZGVuY3kgZmlsZXMuCitjbGVhbiA6PSAkKGZpbHRlciBjbGVhbiUsJChNQUtFQ01ER09BTFMpKQoraWZuZXEgIiQoY2xlYW4pIiAiIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgImNsZWFuIiBnb2FsIGlzIHByZXNlbnQgaW4gY29tbWFuZCBsaW5lLgorICAgIGlmbmVxICIkKGZpbHRlci1vdXQgY2xlYW4lLCQoTUFLRUNNREdPQUxTKSkiICIiICAgICMgdGhlcmUgYXJlIG5vbi1jbGVhbiBnb2Fscy4KKyAgICAgICAgJChlcnJvciAiY2xlYW4iIGdvYWxzIG11c3Qgbm90IGJlIG1peGVkIHdpdGggb3RoZXIgZ29hbHMpCisgICAgZW5kaWYKK2VuZGlmCisjIElzc3VlIGVycm9yIG9uICJjbG9iYmVyIiB0YXJnZXQuCitpZm5lcSAiJChmaWx0ZXIgY2xvYmJlciwkKE1BS0VDTURHT0FMUykpIiAiIgorICAgICQoZXJyb3IgVGhlcmUgaXMgbm8gY2xvYmJlciBnb2FsIGluIG1ha2VmaWxlKQorZW5kaWYKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBNYW5kYXRvcnkgdmFyaWFibGVzIHBhc3NlZCBmcm9tIGJ1aWxkLnBsLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitvcyAgICAgICA6PSAkKGNhbGwgY2hlY2tfdmFyaWFibGUsb3MsbGluIGxyYiBtYWMgd2luKQorYXJjaCAgICAgOj0gJChjYWxsIGNoZWNrX3ZhcmlhYmxlLGFyY2gsMzIgMzJlIDY0IGFybSBwcGM2NCBhYXJjaDY0KQorcGxhdGZvcm0gOj0gJChvcylfJChhcmNoKQorcGxhdGZvcm0gOj0gJChjYWxsIGNoZWNrX3ZhcmlhYmxlLHBsYXRmb3JtLGxpbl8zMiBsaW5fMzJlIGxpbl82NCBsaW5fYXJtIGxyYl8zMmUgbWFjXzMyIG1hY18zMmUgd2luXzMyIHdpbl8zMmUgd2luXzY0IGxpbl9wcGM2NCBsaW5fYWFyY2g2NCkKKyMgb2Etb3B0cyBtZWFucyAib3MgYW5kIGFyY2ggb3B0aW9ucyIuIFRoZXkgYXJlIHBhc3NlZCB0byBhbG1vc3QgYWxsIHBlcmwgc2NyaXB0cy4KK29hLW9wdHMgIDo9IC0tb3M9JChvcykgLS1hcmNoPSQoYXJjaCkKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBEaXJlY3Rvcmllcy4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaWZlcSAiJChMSUJPTVBfV09SSykiICIiCisgICAgJChlcnJvciBJbnRlcm5hbCBlcnJvcjogTElCT01QX1dPUksgdmFyaWFibGUgbXVzdCBiZSBzZXQgaW4gbWFrZWZpbGUubWspCitlbmRpZgordG9vbHNfZGlyID0gJChMSUJPTVBfV09SSyl0b29scy8KKyMgV2UgZG8gbm90IGRlZmluZSBzcmMvIGFuZCBvdGhlciBkaXJlY3RvcmllcyBoZXJlIGJlY2F1c2UgdGhleSBkZXBlbmRzIG9uIHRhcmdldCAoUlRMLCBEU0wsIHRvb2xzKS4KKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBGaWxlIHN1ZmZpeGVzLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpZmVxICIkKG9zKSIgIndpbiIgIyB3aW4KKyAgICBhc20gPSAuYXNtCisgICAgb2JqID0gLm9iagorICAgIGxpYiA9IC5saWIKKyAgICBkbGwgPSAuZGxsCisgICAgZXhlID0gLmV4ZQorICAgIGNhdCA9ICQoZGxsKQorZWxzZSAjIGxpbiwgbHJiIG9yIG1hYworICAgIGFzbSA9IC5zCisgICAgb2JqID0gLm8KKyAgICBsaWIgPSAuYQorICAgIGlmZXEgIiQob3MpIiAibWFjIgorICAgICAgICBkbGwgPSAuZHlsaWIKKyAgICBlbHNlCisgICAgICAgIGRsbCA9IC5zbworICAgIGVuZGlmCisgICAgZXhlID0gJChlbXB0eSkKKyAgICBjYXQgPSAuY2F0CitlbmRpZgorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEZpbGUgbWFuaXB1bGF0aW9uIGFuZCBtaXNjIGNvbW1hbmRzLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0YXJnZXQgPSBAZWNobyAiJChjYWxsIGhlYWRlciwkQCkiCitpZmVxICIkKG9zKSIgIndpbiIKKyAgICBjcCAgICA9IGNwIC1mCisgICAgcm0gICAgPSBybSAtZgorICAgIG1rZGlyID0gbWtkaXIgLXAKKyAgICB0b3VjaCA9IHRvdWNoCisgICAgcGVybCAgPSBwZXJsCisgICAgc2xhc2ggPSBcXAorZWxzZSAjIGxpbiwgbHJiIG9yIG1hYworICAgIGNwICAgID0gY3AgLWYKKyAgICBybSAgICA9IHJtIC1mCisgICAgbWtkaXIgPSBta2RpciAtcAorICAgIHRvdWNoID0gdG91Y2gKKyAgICBwZXJsICA9IHBlcmwKKyAgICBzbGFzaCA9IC8KK2VuZGlmCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29tbW9uIG5vbi1jb25maWd1cmF0aW9uIG9wdGlvbnMuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRoZXkgbWF5IGFmZmVjdCBidWlsZCBwcm9jZXNzIGJ1dCBkb2VzIG5vdCBhZmZlY3QgcmVzdWx0LgorCisjIElmIFRFU1RfREVQUyBpcyAib2ZmIiwgdGVzdCBkZXBzIGlzIHN0aWxsIHBlcmZvcm1lZCwgYnV0IGl0cyByZXN1bHQgaXMgaWdub3JlZC4KK1RFU1RfREVQUyAgOj0gJChjYWxsIGNoZWNrX3ZhcmlhYmxlLFRFU1RfREVQUyxvbiBvZmYpCisjIFRoZSBzYW1lIGZvciB0ZXN0IHRvdWNoLgorVEVTVF9UT1VDSCA6PSAkKGNhbGwgY2hlY2tfdmFyaWFibGUsVEVTVF9UT1VDSCxvbiBvZmYpCit0ZC1pID0gJChpZiAkKGZpbHRlciBvZmYsJChURVNUX0RFUFMpKSwtKQordHQtaSA9ICQoaWYgJChmaWx0ZXIgb2ZmLCQoVEVTVF9UT1VDSCkpLC0pCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29tbW9uIHRhcmdldHMuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgQWxsIGNvbW1vbiB0YXJnZXRzIGFyZSBkZWZpbmVkIGFzIHBob255LiBJdCBhbGxvd3MgImJ1aWwucGwgLS1hbGwgdGVzdC14eHgiLgorIyBNYWtlZmlsZSBjYW4gZGVmaW5lIGFjdGlvbnMgZm9yIGEgcGFydGljaXVsYXIgdGVzdCBvciBsZWF2ZSBpdCBuby1vcC4KKworIyBhbGwsIHRoZSBkZWZhdWx0IHRhcmdldCwgc2hvdWxkIGJlIHRoZSBmaXJzdCBvbmUuCisuUEhPTlkgOiBhbGwKK2FsbCA6CisKKy5QSE9OWSA6IGNvbW1vbiBjbGVhbiBjbGVhbi1jb21tb24gZmF0IGluYyBsMTBuIGxpYgorCisuUEhPTlkgOiBmb3JjZS10ZXN0cyAgICAgICAgICB0ZXN0cworLlBIT05ZIDogZm9yY2UtdGVzdC10b3VjaCAgICAgdGVzdC10b3VjaAorLlBIT05ZIDogZm9yY2UtdGVzdC1yZWxvICAgICAgdGVzdC1yZWxvCisuUEhPTlkgOiBmb3JjZS10ZXN0LWV4ZWNzdGFjayB0ZXN0LWV4ZWNzdGFjaworLlBIT05ZIDogZm9yY2UtdGVzdC1pbnN0ciAgICAgdGVzdC1pbnN0cgorLlBIT05ZIDogZm9yY2UtdGVzdC1kZXBzICAgICAgdGVzdC1kZXBzCisKK3Rlc3RzID0gdG91Y2ggcmVsbyBleGVjc3RhY2sgaW5zdHIgZGVwcwordGVzdHMgICAgICAgOiAkKGFkZHByZWZpeCB0ZXN0LSwkKHRlc3RzKSkKK2ZvcmNlLXRlc3RzIDogJChhZGRwcmVmaXggZm9yY2UtdGVzdC0sJCh0ZXN0cykpCisKKyMgZW5kIG9mIGZpbGUgIwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90b29scy9zcmMvY29tbW9uLXJ1bGVzLm1rIGIvZmluYWwvcnVudGltZS90b29scy9zcmMvY29tbW9uLXJ1bGVzLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyODliZWIKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rvb2xzL3NyYy9jb21tb24tcnVsZXMubWsKQEAgLTAsMCArMSwxODggQEAKKyMgY29tbW9uLXJ1bGVzLm1rICMKKworIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRoaXMgZmlsZSBjb250YWlucyByZWFsbHkgY29tbW9uIGRlZmluaXRpb25zIHVzZWQgYnkgbXVsdGlwbGUgbWFrZWZpbGVzLiBNb2RpZnkgaXQgY2FyZWZ1bGx5IQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIC0tLSBDcmVhdGluZyBhIGRpcmVjdG9yeSAtLS0KKyMgQSBkaXJlY3RvcnkgY2Fubm90IGJlIGEgdGFyZ2V0LCBiZWNhdXNlIGluIExpbnV4KiBPUyBkaXJlY3RvcnkncyB0aW1lc3RhbXAgaXMgdXBkYXRlZCBlYWNoIHRpbWUgYQorIyBmaWxlIGlzIGNyZWF0ZWQgb3IgZGVsZXRlZCBpbiB0aGUgZGlyZWN0b3J5LiBXZSB1c2UgIi5kaXIiIGZpbGUgaW4gcGxhY2Ugb2YgZGlyZWN0b3J5LiBJZiBzdWNoCisjIGZpbGUgZXhpc3RzLCBpdCBtZWFucyBkaXJlY3RvcnkgZXhpc3RzIGFsc28uCisKKy5QUkVDSU9VUyA6ICUvLmRpciAgICAgICAgICAgICAgICAgICAgICMgRG8gbm90IGRlbGV0ZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgZmlsZXMuCisKKyUvLmRpciA6CisJJCh0YXJnZXQpCisJJChta2RpcikgJChkaXIgJEApCisJJCh0b3VjaCkgJEAKKworIyAtLS0gUmVidWlsZGluZyAtLS0KKyMgUmVtb3Zpbmcgb3IgdG91Y2hpbmcgLnJlYnVpbGQgZmlsZSBjYXVzZXMgcmVidWlsZC4KKyMgVG8gbGV0IGl0IHdvcmssIC5yZWJ1aWxkIHNob3VsZCBiZSBhZGRlZCBhcyBwcmVyZXF1aXNpdGUgdG8gZXZlcnkgcnVsZSAoZGVwZW5kZW5jeSB3aXRoIGNvbW1hbmRzKQorIyBleGNlcHQgY2xlYW4qIGFuZCBmb3JjZSosIGluIHRoaXMgYW5kIG90aGVyIG1ha2VmaWxlcy4KKy5yZWJ1aWxkIDoKKwkkKHRhcmdldCkKKwkkKHRvdWNoKSAkQAorCisjIC0tIENyZWF0aW5nIGRlcGVuZGVuY3kgZmlsZSBmb3IgQy9DKysgLS0tCisKKyUuZCA6ICUuYyAucmVidWlsZAorCSQodGFyZ2V0KQorCSQoYykgJChjcHAtZmxhZ3MpICQoYy1mbGFncykgJChjLWZsYWdzLW0pICQ8ID4gJEAKKworJS5kIDogJS5jcHAgLnJlYnVpbGQKKwkkKHRhcmdldCkKKwkkKGN4eCkgJChjcHAtZmxhZ3MpICQoY3h4LWZsYWdzKSAkKGN4eC1mbGFncy1tKSAkPCA+ICRACisKKyMgLS0gQ3JlYXRpbmcgcHJlcHJvY2Vzc2VkIGZpbGUgZm9yIEMvQysrIC0tLQorCislLmkgOiAlLmMgLnJlYnVpbGQKKwkkKHRhcmdldCkKKwkkKGMpICQoY3BwLWZsYWdzKSAkKGMtZmxhZ3MpIC1QICQoYy1vdXQpJEAgJDwKKworJS5pIDogJS5jcHAgLnJlYnVpbGQKKwkkKHRhcmdldCkKKwkkKGN4eCkgJChjcHAtZmxhZ3MpICQoY3h4LWZsYWdzKSAtUCAkKGN4eC1vdXQpJEAgJDwKKworIyAtLSBDb21waWxpbmcgQy9DKysgZmlsZXMgLS0tCisKKyUkKG9iaikgOiAlLmMgLnJlYnVpbGQKKwkkKHRhcmdldCkKKwkkKGMpICQoY3BwLWZsYWdzKSAkKGMtZmxhZ3MpICQoYy1vdXQpJEAgJDwKKworJSQob2JqKSA6ICUuY3BwIC5yZWJ1aWxkCisJJCh0YXJnZXQpCisJJChjeHgpICQoY3BwLWZsYWdzKSAkKGN4eC1mbGFncykgJChjeHgtb3V0KSRAICQ8CisKKyMgLS0gR2VuZXJhdGUgYXNzZW1ibHkgZmlsZXMgLS0tCisKKyUkKGFzbSkgOiAlLmMgLnJlYnVpbGQKKwkkKHRhcmdldCkKKwkkKGMpICQoY3BwLWZsYWdzKSAkKGMtZmxhZ3MpIC1TICQoYy1vdXQpJEAgJDwKKworJSQoYXNtKSA6ICUuY3BwIC5yZWJ1aWxkCisJJCh0YXJnZXQpCisJJChjeHgpICQoY3BwLWZsYWdzKSAkKGN4eC1mbGFncykgLVMgJChjeHgtb3V0KSRAICQ8CisKKyMgLS0gQ29tcGlsaW5nIGFzbSBmaWxlcyAtLS0KKworJSQob2JqKSA6ICUkKGFzbSkgLnJlYnVpbGQKKwkkKHRhcmdldCkKKyAgICAgICAgIyBUaGVyZSBpcyBhIGJ1ZyBvbiBscmI6IGljYyBkb2VzIG5vdCB3b3JrIHdpdGggIi14IGFzc2VtYmxlci13aXRoLWNwcCIgb3B0aW9uLCBzbyB3ZSBoYXZlCisgICAgICAgICMgdG8gcHJlcHJvY2VzcyBmaWxlIG1hbnVhbGx5IGFuZCB0aGVuIGFzc2VtYmx5IGl0LgorICAgICAgICBpZmVxICIkKG9zKSIgImxyYiIKKwkgICAgJChjKSAtRSAkKGNwcC1mbGFncykgJDwgPiAkQC50bXAKKwkgICAgJChhcykgJChhcy1mbGFncykgLXggYXNzZW1ibGVyICQoYXMtb3V0KSRAICRALnRtcAorICAgICAgICBlbHNlCisJICAgICQoYXMpICQoYXMtZmxhZ3MpICQoYXMtb3V0KSRAICQ8CisgICAgICAgIGVuZGlmCisKKyMgLS0gRXhwYW5kaW5nIHZhcmlhYmxlcyBpbiB0ZW1wbGF0ZSBmaWxlcyAtLS0KKworIyBHZW5lcmFsIHJ1bGUgIiUgOiAlLnZhciIgZG9lcyBub3Qgd29yayBnb29kLCBzbyB3ZSBoYXZlIHRvIHdyaXRlIG1vcmUgc3BlY2lmaWMgcnVsZXM6CisjICIlLmggOiAlLmgudmFyIiwgZXRjLgorCisuUFJFQ0lPVVMgOiAlLmggJS5mICUucmMgICAgICAgICAgICAgICAjIERvIG5vdCBkZWxldGUgYXV0b21hdGljYWxseSBjcmVhdGVkIGZpbGVzLgorCitleHBhbmQtdmFycyA9ICQocGVybCkgJCh0b29sc19kaXIpZXhwYW5kLXZhcnMucGwgLS1zdHJpY3QgJChldi1mbGFncykgJDwgJEAKKworIyBBbnkgZ2VuZXJhdGVkIGZpbGUgZGVwZW5kcyBvbiBrbXBfdmVyc2lvbi5jLCBiZWNhdXNlIHdlIGV4dHJhY3QgYnVpbGQgbnVtYmVyIGZyb20gdGhhdCBmaWxlLgorCislLmggIDogJS5oLnZhciAgXAorICAgIGttcF92ZXJzaW9uLmMgJCh0b29sc19kaXIpZXhwYW5kLXZhcnMucGwgLnJlYnVpbGQKKwkkKHRhcmdldCkKKwkkKGV4cGFuZC12YXJzKQorCislLmYgIDogJS5mLnZhciAgXAorICAgIGttcF92ZXJzaW9uLmMgJCh0b29sc19kaXIpZXhwYW5kLXZhcnMucGwgLnJlYnVpbGQKKwkkKHRhcmdldCkKKwkkKGV4cGFuZC12YXJzKQorCislLmY5MCAgOiAlLmY5MC52YXIgIFwKKyAgICBrbXBfdmVyc2lvbi5jICQodG9vbHNfZGlyKWV4cGFuZC12YXJzLnBsIC5yZWJ1aWxkCisJJCh0YXJnZXQpCisJJChleHBhbmQtdmFycykKKworJS5yYyA6ICUucmMudmFyIFwKKyAgIGttcF92ZXJzaW9uLmMgJCh0b29sc19kaXIpZXhwYW5kLXZhcnMucGwgLnJlYnVpbGQKKwkkKHRhcmdldCkKKwkkKGV4cGFuZC12YXJzKQorCisjIC0tIE1ha2luZyBzdGF0aWMgbGlicmFyeSAtLS0KKworLlBSRUNJT1VTIDogJSQobGliKSAgICAgICAgICAgICAgICAgICAgIyBEbyBub3QgZGVsZXRlIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBmaWxlcy4KKworJSQobGliKSA6ICUkKGxpYikubHN0IC5yZWJ1aWxkCisJJCh0YXJnZXQpCisJJChybSkgJEAKKwkkKGFyKSAkKGFyLWZsYWdzKSAkKGFyLW91dCkkQCAkJChjYXQgJDwpCisgICAgICAgICMgc3RyaXAgZGVidWcgaW5mbyBpbiBjYXNlIGl0IGlzIHJlcXVlc3RlZCAod29ya3MgZm9yIExpbnV4KiBPUyBvbmx5KQorICAgICAgICBpZm5lcSAiJChkYmdfc3RyaXApIiAiIgorICAgICAgICAgICAgaWZlcSAiJChERUJVR19JTkZPKSIgIm9mZiIKKwkgICAgICAgIG9iamNvcHkgLS1zdHJpcC1kZWJ1ZyAkQAorICAgICAgICAgICAgZW5kaWYKKyAgICAgICAgZW5kaWYKKworIyAtLSBNYWtpbmcgZHluYW1pYyBsaWJyYXJ5IC0tLQorCisuUFJFQ0lPVVMgOiAlJChkbGwpICAgICAgICAgICAgICAgICAgICAjIERvIG5vdCBkZWxldGUgYXV0b21hdGljYWxseSBjcmVhdGVkIGZpbGVzLgorCisjIG1ha2VmaWxlLm1rIHNob3VsZCBwcm9wZXJseSBkZWZpbmUgaW1wX2ZpbGUsIGRlZl9maWxlLCByZXNfZmlsZSwgYW5kIHBkYl9maWxlOgorIyAgICAgbGluIGFuZCBtYWM6IGRlZl9maWxlIGFuZCByZXNfZmlsZSBzaG91bGQgYmUgZW1wdHksIGltcF9maWxlIGFuZCBwZGJfZmlsZSBkbyBub3QgbWF0dGVyLgorIyAgICAgd2luOiBhbGwgdGhlIHZhcmlhYmUgbWF5IGJlIGVtcHR5OyBpZiBhIHZhcmlhYmxlIHNwZWNpZmllZCwgaXQgYWZmZWN0cyBsZC1mbGFncy4KKyMgTm90ZTogaW1wX2ZpbGUgYW5kIHBkYl9maWxlIGFyZSBzaWRlIGVmZmVjdCBvZiBidWlsZGluZyB0aGlzIHRhcmdldC4KKyMgTm90ZTogdG8gd29ya2Fyb3VuZCBDUTIxNTIyOSAkbGQtZmxhZ3MtZXh0cmEgaW50cm9kdWNlZCB0byBrZWVwIG9wdGlvbnMgYmUgcGxhY2VkIGFmdGVyIG9iamVjdHMKKyUkKGRsbCkgOiAlJChkbGwpLmxzdCAkKGRlZl9maWxlKSAkKHJlc19maWxlKSAucmVidWlsZAorCSQodGFyZ2V0KQorCSQobGQpICQobGQtZmxhZ3MtZGxsKSAkKGxkLWZsYWdzKSAkKGxkLW91dCkkQCAkJChjYXQgJDwpICQobGQtZmxhZ3MtZXh0cmEpICQocmVzX2ZpbGUpCisgICAgICAgICMgSWYgc3RyaXBwZWQgcGRiIGV4aXN0LCByZW5hbWUgaXQgdG8gbm9ybWFsIHBkYiBuYW1lLiBTZWUgZGV2dG9vbHMubWsgZm9yIGV4cGxhbmF0aW9uLgorICAgICAgICBpZm5lcSAiJChwZGJfZmlsZSkiICIiCisgICAgICAgICAgICBpZmVxICIkKERFQlVHX0lORk8pIiAib2ZmIgorCSAgICAgICAgbXYgJChwZGJfZmlsZSkgJChwZGJfZmlsZSkubm9uc3RyaXBwZWQKKwkgICAgICAgIG12ICQocGRiX2ZpbGUpLnN0cmlwcGVkICQocGRiX2ZpbGUpCisgICAgICAgICAgICBlbmRpZgorICAgICAgICBlbmRpZgorCislLmRiZyA6ICUkKGRsbCkgLnJlYnVpbGQKKwkkKHRhcmdldCkKKwlvYmpjb3B5IC0tb25seS1rZWVwLWRlYnVnICQ8ICRAIAorCisKKy5QUkVDSU9VUzogJS5yZXMgICAgICAgICAgICAgICAgICAgICAgICMgRG8gbm90IGRlbGV0ZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgZmlsZXMuCisKKyUucmVzIDogJS5yYyAucmVidWlsZAorCSQodGFyZ2V0KQorCXJjIC1mbyRAICQ8CisKKyMgLS0tIEJ1aWxkaW5nIGhlbHBlciB0b29scyBmcm9tIHNvdXJjZXMgLS0tCisKKy5QUkVDSU9VUzogJSQoZXhlKSAgICAgICAgICAgICAgICAgICAgICMgRG8gbm90IGRlbGV0ZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgZmlsZXMuCisKKyUkKGV4ZSkgOiAkKHRvb2xzX2RpciklLmNwcCAucmVidWlsZAorCSQodGFyZ2V0KQorCSQoY3h4KSAkKGN4eC1vdXQpJEAgJDwKKworIyAtLS0gRm9yY2luZyBhIHRlc3QgLS0tCisKK3Rlc3QtJS8uZm9yY2UgOiB0ZXN0LSUvLmRpcgorCSQodGFyZ2V0KQorCSQocm0pICQoZGlyICRAKS57dGVzdCxmb3JjZX0KKworIyAtLS0gUmVtb3ZpbmcgYSBmaWxlIGluIGJ1aWxkIGRpcmVjdG9yeSAtLS0KKworcm0tJSA6CisJJCh0YXJnZXQpCisJJChybSkgJChwYXRzdWJzdCBybS0lLCUsJEApCisKKyMgZW5kIG9mIGZpbGUgIwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90b29scy9zcmMvY29tbW9uLXRvb2xzLm1rIGIvZmluYWwvcnVudGltZS90b29scy9zcmMvY29tbW9uLXRvb2xzLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3M2VlODgKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rvb2xzL3NyYy9jb21tb24tdG9vbHMubWsKQEAgLTAsMCArMSw0NTggQEAKKyMgY29tbW9uLXRvb2xzLm1rICMKKworIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIERldiB0b29scyBhbmQgZ2VuZXJhbCBvcHRpb25zIChsaWtlIC1mcGljLCAtTzIgb3IgLWcpLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIGMgICAgICAgLS0gQyBjb21waWxlci4KKyMgY3h4ICAgICAtLSBDKysgY29tcGlsZXIuCisjIGNwcCAgICAgLS0gQyBwcmVwcm9jZXNzb3IuCisjIGZvcnQgICAgLS0gRm9ydHJhbiBjb21waWxlci4KKyMgYXMgICAgICAtLSBBc3NlbWJsZXIuCisjIGFyICAgICAgLS0gTGlicmFyaWFuIChzdGF0aWMgbGlicmFyeSBtYWtlcikuCisjIGxkICAgICAgLS0gTGlua2VyIChkeW5hbWljIGxpYnJhcnkgbWFrZXIpLgorIyAqLW91dCAgIC0tIEZsYWcgZGVub3Rpbmcgb3V0cHV0IGZpbGUuIElmIHNwYWNlIGJldHdlZW4gZmxhZyBhbmQgZmlsZSBuYW1lIHJlcXVpcmVkLCBhZGQgZXhwbGljaXQKKyMgICAgICAgICAgICBzcGFjZSB0byB2YXJpYWJsZSwgZS4gZy46ICJjLW91dCA9IC1vJChzcGFjZSkiLgorIyAqLWZsYWdzIC0tIEZsYWdzIHRvIGFwcHJvcHJpYXRlIHByb2dyYW0sIGUuIGcuIGMtZmxhZ3MgLS0gZmxhZ3MgZm9yIEMgY29tcGlsZXIsIGV0Yy4KKworIyAtLS0gQ29tbW9uIGRlZmluaXRpb25zIC0tLQorCisjIEFkZCBjdXJyZW50IGRpcmVjdG9yeSAoaXQgY29udGFpbnMgZ2VuZXJhdGVkIGZpbGVzKS4KKyMgTm90ZTogSXQgaXMgaW1wb3J0YW50IHRvIHNwZWNpZnkgY3VycmVudCBkaXIgYXMgIi4vIiAobm90IGp1c3QgIi4iKS4gT3RoZXJ3aXNlIEludGVsIGNvbXBpbGVyCisjIG9uIFdpbmRvd3MqIE9TIGdlbmVyYXRlcyBzdWNoIGEgZGVwZW5kZW5jeTogImttcF9ydW50aW1lLm9iajogLlxrbXBfaTE4bi5pbmMiLCBhbmQgbWFrZSBjb21wbGFpbnMKKyMgIk5vIHJ1bGUgdG8gYnVpbGQgLlxrbXBfaTE4bi5pbmMiLiBVc2luZyAiLi8iIHNvbHZlcyB0aGUgcHJvYmxlbS4KK2NwcC1mbGFncyArPSAtSSAuLworIyBGb3Igbm9uLXg4NiBhcmNoaXRlY3R1cmUKK2lmZXEgIiQoZmlsdGVyIDMyIDMyZSA2NCwkKGFyY2gpKSIgIiIKKyAgICBjcHAtZmxhZ3MgKz0gJChzaGVsbCBwa2ctY29uZmlnIC0tY2ZsYWdzIGxpYmZmaSkKK2VuZGlmCisjIEFkZCBhbGwgVlBBVEggZGlyZWN0b3JpZXMgdG8gcGF0aCBmb3Igc2VhcmNoaW5nIGluY2x1ZGUgZmlsZXMuCitjcHAtZmxhZ3MgKz0gJChmb3JlYWNoIGksJChWUEFUSCksLUkgJChpKSkKKworCisjIFNob3VsZG4ndCB0aGlzIGJlIGJlaW5nIHNldCBmcm9tIHRoZSBjb21tYW5kIGxpbmUgc29tZWhvdz8KK2NwcC1mbGFncyArPSAtRCBVU0VfSVRUX0JVSUxECisKK2lmZXEgIiQoT1BUSU1JWkFUSU9OKSIgIm9uIgorICAgIGNwcC1mbGFncyArPSAtRCBOREVCVUcKK2Vsc2UKKyAgICBjcHAtZmxhZ3MgKz0gLUQgX0RFQlVHIC1EIEJVSUxEX0RFQlVHCisgICAgaWZlcSAiJChvcykiICJ3aW4iCisgICAgICAgICMgVGhpcyBpcyBmb3JjZWQgc2luY2UgVlMyMDEwIHRvb2wgcHJvZHVjZXMgaW5jb25zaXN0ZW50IGRpcmVjdGl2ZXMKKyAgICAgICAgIyBiZXR3ZWVuIG9iamVjdHMsIHJlc3VsdGluZyBpbiBhIGxpbmsgZmFpbHVyZS4KKyAgICAgICAgY3BwLWZsYWdzICs9IC1EIF9JVEVSQVRPUl9ERUJVR19MRVZFTD0wCisgICAgZW5kaWYKK2VuZGlmCisKKyMgLS0tIExpbnV4KiBPUywgSW50ZWwoUikgTWFueSBJbnRlZ3JhdGVkIENvcmUgQXJjaGl0ZWN0dXJlIGFuZCBPUyBYKiBkZWZpbml0aW9ucyAtLS0KKworaWZuZXEgIiQoZmlsdGVyIGxpbiBscmIgbWFjLCQob3MpKSIgIiIKKyAgICAjIC0tLSBDL0MrKyAtLS0KKyAgICBpZmVxICIkKGMpIiAiIgorICAgICAgICBjID0gaWNjCisgICAgZW5kaWYKKyAgICAjIEMrKyBjb21waWxlciBpcyBhIGNvbXBsZW1lbnQgdG8gQyBjb21waWxlci4KKyAgICBpZmVxICIkKGMpIiAiaWNjIgorICAgICAgICBjeHggPSBpY3BjCisgICAgZW5kaWYKKyAgICBpZmVxICIkKGMpIiAiZ2NjIgorICAgICAgICBjeHggPSBnKysKKyAgICBlbmRpZgorICAgIGlmZXEgIiQoYykiICJjbGFuZyIKKyAgICAgICAgY3h4ID0gY2xhbmcrKworICAgIGVuZGlmCisgICAgIyBPdXRwdXQgZmlsZSBmbGFnLgorICAgIGMtb3V0ICAgPSAtbyQoc3BhY2UpCisgICAgY3h4LW91dCA9IC1vJChzcGFjZSkKKyAgICAjIENvbXBpbGUgb25seSwgbm8gbGluay4KKyAgICBjLWZsYWdzICAgKz0gLWMKKyAgICBjeHgtZmxhZ3MgKz0gLWMKKyAgICAjIEdlbmVyYXRpbmcgZGVwZW5kZWN5IGZpbGUuCisgICAgYy1mbGFncy1tICAgKz0gLU0gLU1HCisgICAgY3h4LWZsYWdzLW0gKz0gLU0gLU1HCisgICAgIyBFbmFibGUgQzk5IGxhbmd1YWdlLgorICAgIGlmbmVxICIkKENQTFVTUExVUykiICJvbiIKKyAgICAgICAgYy1mbGFncyArPSAtc3RkPWdudTk5CisgICAgZW5kaWYKKyAgICAjIEdlbmVyYXRlIHBvc2l0aW9uLWluZGVwZW5kZW50IGNvZGUgKGEgbXVzdCBmb3Igc2hhcmVkIG9iamVjdHMpLgorICAgIGlmZXEgIiQoTElOS19UWVBFKSIgImR5bmEiCisgICAgICAgIGMtZmxhZ3MgICArPSAtZlBJQworICAgICAgICBjeHgtZmxhZ3MgKz0gLWZQSUMKKyAgICBlbmRpZgorICAgICMgRW1pdCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uCisgICAgaWZlcSAiJChERUJVR19JTkZPKSIgIm9uIgorICAgICAgICBjLWZsYWdzICAgKz0gLWcKKyAgICAgICAgY3h4LWZsYWdzICs9IC1nCisgICAgZW5kaWYKKyAgICAjIEluc3RydW1lbnQgcHJvZ3JhbSBmb3IgcHJvZmlsaW5nLCBnYXRoZXIgZXh0cmEgaW5mb3JtYXRpb24uCisgICAgaWZlcSAiJChDT1ZFUkFHRSkiICJvbiIKKyAgICAgICAgaWZlcSAiJChjKSIgImljYyIKKyAgICAgICAgICAgIGMtZmxhZ3MgICArPSAtcHJvZl9nZW54CisgICAgICAgIGVuZGlmCisgICAgICAgIGlmZXEgIiQoY3h4KSIgImljcGMiCisgICAgICAgICAgICBjeHgtZmxhZ3MgKz0gLXByb2ZfZ2VueAorICAgICAgICBlbmRpZgorICAgIGVuZGlmCisgICAgIyBUdXJuIG9wdGltaXphdGlvbiBvbiBvciBvZmYuCisgICAgaWZlcSAiJChPUFRJTUlaQVRJT04pIiAib24iCisgICAgICAgICMgLWlubGluZS1taW4tc2l6ZT0xIGltcHJvdmVzIHBlcmZvcm1hbmNlIG9mIFBBUkFMTEVMIEVQQ0MgdXAgdG8gMTAlIG9uIGZ4aTY0bGluMDEsCisgICAgICAgICMgZG9lc24ndCBjaGFuZ2UgcGVyZm9ybWFuY2Ugb24gZnhlNjRsaW4wMS4KKyAgICAgICAgIyBQcmVzZW5jZSBvZiB0aGUgLWlubGluZS1taW4tc2l6ZT0xIHN3aXRjaCBzaG91bGQgb25seSBoZWxwCisgICAgICAgICMgdG8gcHJvbW90ZSBwZXJmb3JtYW5jZSBzdGFiaWxpdHkgYmV0d2VlbiBjaGFuZ2VzLAorICAgICAgICAjIGV2ZW4gaWYgaXQgaGFzIG5vIG9ic2VydmFibGUgaW1wYWN0IHJpZ2h0IG5vdy4KKwlpZm5lcSAiJChmaWx0ZXIgaWNsIGljbC5leGUsJChjKSkiICIiCisgICAgICAgICAgICBjLWZsYWdzICAgKz0gLU8yIC1pbmxpbmUtbWluLXNpemU9MQorCWVsc2UKKyAgICAgICAgICAgIGMtZmxhZ3MgICArPSAtTzIKKwllbmRpZgorICAgICAgICBpZm5lcSAiJChmaWx0ZXIgaWNsIGljbC5leGUsJChjeHgpKSIgIiIKKyAgICAgICAgICAgIGN4eC1mbGFncyArPSAtTzIgLWlubGluZS1taW4tc2l6ZT0xCisJZWxzZQorICAgICAgICAgICAgY3h4LWZsYWdzICs9IC1PMgorCWVuZGlmCisgICAgZWxzZQorICAgICAgICBjLWZsYWdzICAgKz0gLU8wCisgICAgICAgIGN4eC1mbGFncyArPSAtTzAKKyAgICBlbmRpZgorICAgICMgLS0tIEFzc2VtYmxlciAtLS0KKyAgICBpZmVxICIkKGMpIiAiaWNjIgorICAgICAgICBhcyAgICAgICAgPSBpY2MKKyAgICBlbmRpZgorICAgIGlmZXEgIiQoYykiICJnY2MiCisgICAgICAgIGFzICAgICAgICA9IGdjYworICAgIGVuZGlmCisgICAgaWZlcSAiJChjKSIgImNsYW5nIgorICAgICAgICBhcyAgICAgICAgPSBjbGFuZworICAgIGVuZGlmCisgICAgYXMtb3V0ICAgID0gLW8kKHNwYWNlKQorICAgIGFzLWZsYWdzICs9ICQoY3BwLWZsYWdzKQorICAgICMgQ29tcGlsZSBvbmx5LCBubyBsaW5rLgorICAgIGFzLWZsYWdzICs9IC1jCisgICAgYXMtZmxhZ3MgKz0gLXggYXNzZW1ibGVyLXdpdGgtY3BwCisgICAgIyAtLS0gRm9ydHJhbiAtLS0KKyAgICBpZmVxICIkKGMpIiAiaWNjIgorICAgICAgICBmb3J0ID0gaWZvcnQKKyAgICBlbmRpZgorICAgIGlmZXEgIiQoYykiICJnY2MiCisgICAgICAgIGZvcnQgPSBnZm9ydHJhbgorICAgIGVuZGlmCisgICAgaWZlcSAiJChjKSIgImNsYW5nIgorICAgICAgICBmb3J0ID0gZ2ZvcnRyYW4KKyAgICBlbmRpZgorICAgIGlmZXEgIiQoZm9ydCkiICIiCisgICAgICAgIGZvcnQgPSBpZm9ydAorICAgIGVuZGlmCisgICAgZm9ydC1vdXQgICAgPSAtbyQoc3BhY2UpCisgICAgZm9ydC1mbGFncyArPSAtYworZW5kaWYKKworIyAtLS0gTGludXgqIE9TIGRlZmluaXRpb25zIC0tLQorCitpZmVxICIkKG9zKSIgImxpbiIKKyAgICAjIC0tLSBDL0MrKyAtLS0KKyAgICAjIE9uIGxpbl8zMiwgd2Ugd2FudCB0byBtYWludGFpbiBzdGFjayBhbGlnbm1lbnQgdG8gYmUgY29ucGF0aWJsZSB3aXRoIEdOVSBiaW5hcmllcyBidWlsdCB3aXRoCisgICAgIyBjb21waWxlci4KKyAgICBpZmVxICIkKGMpIiAiaWNjIgorICAgICAgICBpZmVxICIkKGFyY2gpIiAiMzIiCisgICAgICAgICAgICBjLWZsYWdzICAgKz0gLWZhbGlnbi1zdGFjaz1tYWludGFpbi0xNi1ieXRlCisgICAgICAgICAgICBjeHgtZmxhZ3MgKz0gLWZhbGlnbi1zdGFjaz1tYWludGFpbi0xNi1ieXRlCisgICAgICAgIGVuZGlmCisgICAgICAgICMgR2VuZXJhdGUgY29kZSB0aGF0IHdpbGwgcnVuIG9uIGFueSBQZW50aXVtIG9yIGxhdGVyIHByb2Nlc3Nvci4KKyAgICAgICAgaWZlcSAiJChhcmNoKSIgIjMyIgorICAgICAgICAgICAgYy1mbGFncyAgICs9IC1taWEzMgorICAgICAgICAgICAgY3h4LWZsYWdzICs9IC1taWEzMgorICAgICAgICBlbmRpZgorICAgIGVuZGlmCisgICAgaWZlcSAiJChjKSIgImdjYyIKKyAgICAgICAgaWZlcSAiJChhcmNoKSIgImFybSIKKyAgICAgICAgICAgIGMtZmxhZ3MgICArPSAtbWFybQorICAgICAgICBlbmRpZgorICAgIGVuZGlmCisgICAgIyAtLS0gTGlicmFyaWFuIC0tLQorICAgIGFyICAgICAgICA9IGFyCisgICAgYXItb3V0ICAgID0gJChlbXB0eSkKKyAgICBhci1mbGFncyArPSBjcgorICAgICMgLS0tIExpbmtlciAtLS0KKyAgICAjIFVzZSBsZCBieSBkZWZhdWx0LCBob3dldmVyLCBtYWtlZmlsZSBtYXkgc3BlY2lmeSBsZD0kKGMpIGJlZm9yZSBpbmNsdWRpbmcgZGV2dG9vbHMubWsuCisgICAgaWZlcSAiJChsZCkiICIiCisgICAgICAgIGxkID0gJChjKQorICAgIGVuZGlmCisgICAgbGQtZmxhZ3MtZGxsICs9IC1zaGFyZWQKKyAgICBpZmVxICIkKGxkKSIgImxkIgorICAgICAgICBsZC1vdXQgPSAtbyQoc3BhY2UpCisgICAgICAgIGlmZXEgIiQoYXJjaCkiICIzMiIKKyAgICAgICAgICAgIGxkLWZsYWdzICs9IC1tIGVsZl9pMzg2CisgICAgICAgIGVuZGlmCisgICAgICAgIGlmZXEgIiQoYXJjaCkiICIzMmUiCisgICAgICAgICAgICBsZC1mbGFncyArPSAtbSBlbGZfeDg2XzY0CisgICAgICAgIGVuZGlmCisgICAgICAgIGxkLWZsYWdzICAgICArPSAteCAtbGMgLWxkbAorICAgICAgICBsZC1mbGFncyAgICAgKz0gLXogbm9leGVjc3RhY2sKKyAgICAgICAgbGQtZmxhZ3MtZGxsICs9IC1zb25hbWU9JChARikKKyAgICBlbmRpZgorICAgIGlmZXEgIiQobGQpIiAiJChjKSIKKyAgICAgICAgbGQtb3V0ICAgID0gJChjLW91dCkKKyAgICAgICAgbGQtZmxhZ3MgKz0gLVdsLC16LG5vZXhlY3N0YWNrCisgICAgICAgIGxkLWZsYWdzLWRsbCArPSAtV2wsLXNvbmFtZT0kKEBGKQorICAgIGVuZGlmCisgICAgaWZlcSAiJChsZCkiICIkKGN4eCkiCisgICAgICAgIGxkLW91dCAgICA9ICQoY3h4LW91dCkKKyAgICAgICAgbGQtZmxhZ3MgKz0gLVdsLC16LG5vZXhlY3N0YWNrCisgICAgICAgIGxkLWZsYWdzLWRsbCArPSAtV2wsLXNvbmFtZT0kKEBGKQorICAgIGVuZGlmCitlbmRpZgorCisjIC0tLSBJbnRlbChSKSBNYW55IEludGVncmF0ZWQgQ29yZSBBcmNoaXRlY3R1cmUgZGVmaW5pdGlvbnMgLS0tCisKK2lmZXEgIiQob3MpIiAibHJiIgorICAgICMgLS0tIEMvQysrIC0tLQorICAgICMgSW50ZWwoUikgTWFueSBJbnRlZ3JhdGVkIENvcmUgQXJjaGl0ZWN0dXJlIHNwZWNpZmljIG9wdGlvbnMsIG5lZWQgY2xhcmlmaWNhdGlvbiBmb3IgcHVycG9zZToKKyAgICAjYy1mbGFncyAgICAgKz0gLW1taWMgLW1QMk9QVF9pbnRyaW5fZGlzYWJsZV9uYW1lPW1lbWNweSAtbVAyT1BUX2ludHJpbl9kaXNhYmxlX25hbWU9bWVtc2V0IC1tR0xPQl9mcmVlc3RhbmRpbmcgLW1HTE9CX25vbnN0YW5kYXJkX2xpYiAtbm9zdGRsaWIgLWZuby1idWlsdGluCisgICAgI2N4eC1mbGFncyAgICs9IC1tbWljIC1tUDJPUFRfaW50cmluX2Rpc2FibGVfbmFtZT1tZW1jcHkgLW1QMk9QVF9pbnRyaW5fZGlzYWJsZV9uYW1lPW1lbXNldCAtbUdMT0JfZnJlZXN0YW5kaW5nIC1tR0xPQl9ub25zdGFuZGFyZF9saWIgLW5vc3RkbGliIC1mbm8tYnVpbHRpbgorICAgICMgaWNjIGZvciBscmIgaGFzIGEgYnVnOiBpdCBnZW5lcmF0ZXMgZGVwZW5kZW5jaWVzIGZvciB0YXJnZXQgbGlrZSBmaWxlLm9iaiwgd2hpbGUgcmVhbCBvYmplY3QKKyAgICAjIGZpbGVzIGFyZSBuYW1lZCBmaWxlLm8uIC1NVCBpcyBhIHdvcmthcm91bmQgZm9yIHRoZSBwcm9ibGVtLgorICAgIGMtZmxhZ3MtbSAgICs9IC1NVCAkKGJhc2VuYW1lICRAKS5vCisgICAgY3h4LWZsYWdzLW0gKz0gLU1UICQoYmFzZW5hbWUgJEApLm8KKyAgICAjIC0tLSBMaWJyYXJpYW4gLS0tCisgICAgYXIgICAgICAgID0gYXIKKyAgICBhci1vdXQgICAgPSAkKGVtcHR5KQorICAgIGFyLWZsYWdzICs9IGNyCisgICAgIyAtLS0gTGlua2VyIC0tLQorICAgICMgVXNlICQoYykgYnkgZGVmYXVsdCwgaG93ZXZlciwgbWFrZWZpbGUgbWF5IHNwZWNpZnkgYW5vdGhlciBsaW5rZXIgKGUuZy4gbGQ9bGQpIGJlZm9yZSBpbmNsdWRpbmcgZGV2dG9vbHMubWsuCisgICAgaWZlcSAiJChsZCkiICIiCisgICAgICAgIGxkID0gJChjKQorICAgIGVuZGlmCisgICAgaWZlcSAiJChsZCkiICJsZCIKKyAgICAgICAgbGQtb3V0ICAgPSAtbyQoc3BhY2UpCisgICAgICAgIGxkLWZsYWdzICs9IC1tIGVsZl9sMW9tX2Zic2QKKyAgICAgICAgbGQtZmxhZ3MtZGxsICs9IC1zaGFyZWQgLXggLWxjCisgICAgICAgIGxkLWZsYWdzLWRsbCArPSAtc29uYW1lPSQoQEYpCisgICAgICAgICMgTm93IGZpbmQgb3V0IHBhdGggdG8gbGlicmFyaWVzLgorICAgICAgICAgICAgbGQtZmxhZ3MtTCA6PSAkKHNoZWxsICQoYykgLVdsLC12IC1cIyAyPiYxIHwgZ3JlcCAtZSAiLUwiKQorICAgICAgICAgICAgJChjYWxsIGRlYnVnLGxkLWZsYWdzLUwpCisgICAgICAgICAgICAjIFJlbW92ZSBjb250aW51YXRpb24gY2hhcmFjdGVyczsgZmlyc3QgYWRkIGEgc3BhY2UgdG8gdGhlIGVuZCAoIiAtTHBhdGgxIC8iIC0+ICItTHBhdGgxIC8gIikKKyAgICAgICAgICAgIGxkLWZsYWdzLUwgOj0gJChmaWx0ZXItb3V0IFwsJChsZC1mbGFncy1MKSkKKyAgICAgICAgICAgICQoY2FsbCBkZWJ1ZyxsZC1mbGFncy1MKQorICAgICAgICAgICAgIyBMaW5rZXIgdHJlYXRzIGJhY2tzbGFzaCAoJ1wnKSBhcyBhbiBlc2NhcGUgc3ltYm9sLCBzbyByZXBsYWNlIGl0IHdpdGggZm9yd2FyZCBzbGFzaC4KKyAgICAgICAgICAgIGxkLWZsYWdzLUwgOj0gJChzdWJzdCBcLC8sJChsZC1mbGFncy1MKSkKKyAgICAgICAgICAgICQoY2FsbCBkZWJ1ZyxsZC1mbGFncy1MKQorICAgICAgICBsZC1mbGFncyArPSAkKGxkLWZsYWdzLUwpCisgICAgZW5kaWYKKyAgICBpZmVxICIkKGxkKSIgIiQoYykiCisgICAgICAgIGxkLW91dCAgICAgICAgPSAkKGMtb3V0KQorICAgICAgICBsZC1mbGFncy1kbGwgKz0gLXNoYXJlZCAtV2wsLXggLVdsLC1zb25hbWU9JChARikKKyAgICBlbmRpZgorICAgIGlmZXEgIiQobGQpIiAiJChjeHgpIgorICAgICAgICBsZC1vdXQgICAgICAgID0gJChjeHgtb3V0KQorICAgICAgICBsZC1mbGFncy1kbGwgKz0gLXNoYXJlZCAtV2wsLXggLVdsLC1zb25hbWU9JChARikKKyAgICBlbmRpZgorZW5kaWYKKworIyAtLS0gT1MgWCogZGVmaW5pdGlvbnMgLS0tCisKK2lmZXEgIiQob3MpIiAibWFjIgorICAgICMgLS0tIExpYnJhcmlhbiAtLS0KKyAgICBhciAgICAgICAgPSBsaWJ0b29sCisgICAgYXItb3V0ICAgID0gLW8kKHNwYWNlKQorICAgIGFyLWZsYWdzICs9IC1zdGF0aWMKKyAgICAjIC0tLSBMaW5rZXIgLS0tCisgICAgIyBVc2UgQyBjb21waWxlciBhcyBsaW5rZXIgYnkgZGVmYXVsdCwgaG93ZXZlciwgbWFrZWZpbGUgbWF5IHNwZWNpZnkgbGQ9JChsaWJ0b29sKSBiZWZvcmUKKyAgICAjIGluY2x1ZGluZyBkZXZ0b29scy5tay4KKyAgICBpZmVxICIkKGxkKSIgIiIKKyAgICAgICAgbGQgPSAkKGMpCisgICAgZW5kaWYKKyAgICBpZmVxICIkKGxkKSIgImxpYnRvb2wiCisgICAgICAgIGxkLW91dCAgICAgICAgPSAtbyQoc3BhY2UpCisgICAgICAgIGxkLWZsYWdzLWRsbCArPSAtZHluYW1pYworICAgICAgICBsZC1mbGFncyAgICAgKz0gLWxjIC1sZGwKKyAgICBlbmRpZgorICAgIGlmZXEgIiQobGQpIiAiJChjKSIKKyAgICAgICAgbGQtb3V0ICAgICAgICA9ICQoYy1vdXQpCisgICAgICAgIGxkLWZsYWdzLWRsbCArPSAtZHluYW1pY2xpYgorICAgIGVuZGlmCisgICAgaWZlcSAiJChsZCkiICIkKGN4eCkiCisgICAgICAgIGxkLW91dCAgICAgICAgPSAkKGN4eC1vdXQpCisgICAgICAgIGxkLWZsYWdzLWRsbCArPSAtZHluYW1pY2xpYgorICAgIGVuZGlmCisgICAgIyBUaGVzZSBvcHRpb25zIHN1aXRhYmxlIGZvciBhbnkgbGlua2VyLCBlaXRoZXIgQyBjb21waWxlciBvciBsaWJ0b29sLgorICAgIGxkLWZsYWdzLWRsbCArPSAtaGVhZGVycGFkX21heF9pbnN0YWxsX25hbWVzCisgICAgbGQtZmxhZ3MtZGxsICs9IC1pbnN0YWxsX25hbWUgJChARikKK2VuZGlmCisKKyMgLS0tIFdpbmRvd3MqIE9TIGRlZmluaXRpb25zIC0tLQorCitpZmVxICIkKG9zKSIgIndpbiIKKyAgICAjIERpc2FibGUgd2FybmluZyAiZnVuY3Rpb24gIi4uLiIgKGRlY2xhcmVkIGF0IGxpbmUgLi4uIG9mIC4uLikgd2FzIGRlY2xhcmVkIGRlcHJlY2F0ZWQuLi4iLgorICAgIGNwcC1mbGFncyArPSAtRF9DUlRfU0VDVVJFX05PX1dBUk5JTkdTIC1EX0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFCisgICAgIyAtLS0gQy9DKysgLS0tCisgICAgaWZlcSAiJChjKSIgIiIKKyAgICAgICAgYyA9IGljbC5leGUKKyAgICBlbmRpZgorICAgIGN4eCAgICA9ICQoYykKKyAgICAjIE9mdGVuIGRlZmF1bHQgaWNsLmNmZyBmaWxlIGluIGNvbXBpbGVyIGJpbi8gZGlyZWN0b3J5IGNvbnRhaW5zIG9wdGlvbnMgLVF2YyBhbmQKKyAgICAjIC1RbG9jYXRpb24sbGluay4gU2V0dGluZyBJQ0xDRkcgKGFuZCBJRk9SVENGRykgdG8gc3BlY2lhbGx5IHByZXBhcmVkIGVtcHR5IGNvbmZpZyBmaWxlCisgICAgIyBvdmVycmlkZXMgZGVmYXVsdCBjb25maWcuCisgICAgSUNMQ0ZHICAgPSAkKHRvb2xzX2RpcilpY2MuY2ZnCisgICAgSUZPUlRDRkcgPSAkKHRvb2xzX2RpcilpY2MuY2ZnCisgICAgZXhwb3J0IElDTENGRworICAgIGV4cG9ydCBJRk9SVENGRworICAgICMgT3V0cHV0IGZpbGUuCisgICAgYy1vdXQgICA9IC1vJChzcGFjZSkKKyAgICBjeHgtb3V0ID0gLW8kKHNwYWNlKQorICAgICMgRGlzYWJsZSBhbm5veWluZyBjb21waWxlciBsb2dvLgorICAgIGMtZmxhZ3MgICArPSAtbm9sb2dvCisgICAgY3h4LWZsYWdzICs9IC1ub2xvZ28KKyAgICAjIEdlbmVyYXRlIGNvZGUgdGhhdCB3aWxsIHJ1biBvbiBhbnkgUGVudGl1bSBvciBsYXRlciBwcm9jZXNzb3IuCisgICAgaWZlcSAiJChhcmNoKSIgIjMyIgorICAgICAgICBjLWZsYWdzICAgKz0gLWFyY2g6aWEzMgorICAgICAgICBjeHgtZmxhZ3MgKz0gLWFyY2g6aWEzMgorICAgIGVuZGlmCisgICAgIyBDb21waWxlIG9ubHksIG5vIGxpbmsuCisgICAgYy1mbGFncyAgICs9IC1jCisgICAgY3h4LWZsYWdzICs9IC1jCisgICAgIyAtUU0gIC0tIEdlbmVyYXRlIGRlcGVuZGVuY3kgZmlsZS4KKyAgICAjIC1RTU0gLS0gZG8gbm90IGluY2x1ZGUgc3lzdGVtIGhlYWRlcnMuIE9uIFdpbmRvd3MqIE9TLCBzeXN0ZW0gaGVhZGVycyBtYXkgYmUgbG9jYXRlZCBpbgorICAgICMgICAgICAgICAiQzpcUHJvZ3JhbSBGaWxlc1wuLi4iLCBidXQgcGF0aCB3aXRoIHNwYWNlIGNvbmZ1c2VzIG1ha2UsIHNvIHdlIGV4Y2x1ZGUgc3lzdGVtCisgICAgIyAgICAgICAgIGhlYWRlcnMuCisgICAgIyAtUU1HIC0tIFRyZWF0IG1pc3NlZCBoZWFkZXJzIGFzIGdlbmVyYXRlZC4gV2UgZG8gaGF2ZSBzb21lIGdlbmVyYXRlZCBpbmNsdWRlIGZpbGVzLgorICAgIGMtZmxhZ3MtbSAgICs9IC1RTSAtUU1NIC1RTUcKKyAgICBjeHgtZmxhZ3MtbSArPSAtUU0gLVFNTSAtUU1HCisgICAgIyBFbmFibGUgQzk5IGxhbmd1YWdlLgorICAgIGlmbmVxICIkKENQTFVTUExVUykiICJvbiIKKyAgICAJYy1mbGFncyAgICs9IC1Rc3RkPWdudTk5CisgICAgZW5kaWYKKyAgICAjIEVuYWJsZSBDKysgZXhjZXB0aW9uIGhhbmRsaW5nLgorICAgICMgPz8/IFdoeSB3ZSBkaXNhYmxlIGl0IG9uIExpbnV4KiBPUz8KKyAgICBjeHgtZmxhZ3MgKz0gLUVIc2MKKyAgICBpZmVxICIkKGFyY2gpIiAiMzIiCisgICAgICAgIGlmbmVxICIkKGZpbHRlciBpY2wgaWNsLmV4ZSwkKGMpKSIgIiIKKyAgICAgICAgICAgIGMtZmxhZ3MgICArPSAtUXNhZmVzZWgKKyAgICAgICAgZW5kaWYKKyAgICAgICAgaWZuZXEgIiQoZmlsdGVyIGljbCBpY2wuZXhlLCQoY3h4KSkiICIiCisgICAgICAgICAgICBjeHgtZmxhZ3MgKz0gLVFzYWZlc2VoCisgICAgICAgIGVuZGlmCisgICAgZW5kaWYKKyAgICAjIEVtaXQgZGVidWdnaW5nIGluZm9ybWF0aW9uLgorICAgIGlmZXEgIiQoREVCVUdfSU5GTykiICJvbiIKKyAgICAgICAgYy1mbGFncyAgICs9IC1aaQorICAgICAgICBjeHgtZmxhZ3MgKz0gLVppCisgICAgZW5kaWYKKyAgICAjIEluc3RydW1lbnQgcHJvZ3JhbSBmb3IgcHJvZmlsaW5nLCBnYXRoZXIgZXh0cmEgaW5mb3JtYXRpb24uCisgICAgaWZlcSAiJChDT1ZFUkFHRSkiICJvbiIKKyAgICAgICAgYy1mbGFncyAgICs9IC1RcHJvZl9nZW54CisgICAgICAgIGN4eC1mbGFncyArPSAtUXByb2ZfZ2VueAorICAgIGVuZGlmCisgICAgIyBUdXJuIG9wdGltaXphdGlvbiBvbiBvciBvZmYuCisgICAgaWZlcSAiJChPUFRJTUlaQVRJT04pIiAib24iCisgICAgICAgICMgUHJlc2VuY2Ugb2YgdGhlIC1pbmxpbmUtbWluLXNpemU9MSBzd2l0Y2ggc2hvdWxkIG9ubHkgaGVscAorICAgICAgICAjIHRvIHByb21vdGUgcGVyZm9ybWFuY2Ugc3RhYmlsaXR5IGJldHdlZW4gY2hhbmdlcywKKyAgICAgICAgIyBldmVuIGlmIGl0IGhhcyBubyBvYnNlcnZhYmxlIGltcGFjdCByaWdodCBub3cuCisgICAgICAgICMgU2VlIHRoZSBMaW51eCogT1Mgc2VjdGlvbiBhYm92ZS4KKwlpZm5lcSAiJChmaWx0ZXIgaWNsIGljbC5leGUsJChjKSkiICIiCisJICAgIGMtZmxhZ3MgICArPSAtTzIgLVFpbmxpbmUtbWluLXNpemU9MQorCWVsc2UKKwkgICAgYy1mbGFncyAgICs9IC1PMgorCWVuZGlmIAorICAgICAgICBpZm5lcSAiJChmaWx0ZXIgaWNsIGljbC5leGUsJChjeHgpKSIgIiIKKyAgICAgICAgICAgIGN4eC1mbGFncyArPSAtTzIgLVFpbmxpbmUtbWluLXNpemU9MQorCWVsc2UKKyAgICAgICAgICAgIGN4eC1mbGFncyArPSAtTzIKKwllbmRpZgorICAgIGVsc2UKKyAgICAgICAgYy1mbGFncyAgICs9IC1PZAorICAgICAgICBjeHgtZmxhZ3MgKz0gLU9kCisgICAgICAgICMgRW5hYmxlIHN0YWNrIGZyYW1lIHJ1bnRpbWUgZXJyb3IgY2hlY2tpbmcuCisgICAgICAgICMgISEhIDBPYnNvbGV0ZSBvcHRpb24uIFNob3VsZCB1c2UgL1JUQyBpbnN0ZWFkLgorICAgICAgICBjLWZsYWdzICAgKz0gLVJUQzEKKyAgICAgICAgY3h4LWZsYWdzICs9IC1SVEMxCisgICAgZW5kaWYKKyAgICAjIFNETCAoU2VjdXJpdHkgRGV2ZWxvcG1lbnQgTGlmZWN5Y2xlKSBmbGFnczoKKyAgICAjICAgR1MgLSBTdGFjay1iYXNlZCBCdWZmZXIgT3ZlcnJ1biBEZXRlY3Rpb24KKyAgICAjICAgRHluYW1pY0Jhc2UgLSBJbWFnZSBSYW5kb21pemF0aW9uCisgICAgYy1mbGFncyAgICs9IC1HUyAtRHluYW1pY0Jhc2UgIAorICAgIGN4eC1mbGFncyArPSAtR1MgLUR5bmFtaWNCYXNlICAKKyAgICAjIC0tLSBBc3NlbWJsZXIgLS0tCisgICAgaWZlcSAiJChhcmNoKSIgIjMyIgorICAgICAgICBhcyAgID0gbWwKKyAgICBlbmRpZgorICAgIGlmZXEgIiQoYXJjaCkiICIzMmUiCisgICAgICAgIGFzICAgPSBtbDY0CisgICAgZW5kaWYKKyAgICBpZmVxICIkKGFzKSIgImlhcyIKKyAgICAgICAgYXMtb3V0ICAgPSAtbyQoc3BhY2UpCisgICAgZW5kaWYKKyAgICBpZm5lcSAiJChmaWx0ZXIgbWwgbWw2NCwkKGFzKSkiICIiCisgICAgICAgIGFzLW91dCAgID0gLUZvCisgICAgICAgIGFzLWZsYWdzICs9IC1ub2xvZ28gLWMKKyAgICAgICAgIyBTREwgKFNlY3VyaXR5IERldmVsb3BtZW50IExpZmVjeWNsZSkgZmxhZ3M6CisgICAgICAgICMgICBEeW5hbWljQmFzZSAtIEltYWdlIFJhbmRvbWl6YXRpb24KKwlhcy1mbGFncyArPSAtRHluYW1pY0Jhc2UgCisgICAgZW5kaWYKKyAgICAjIC0tLSBGb3J0cmFuIC0tLQorICAgIGZvcnQgICAgICAgID0gaWZvcnQKKyAgICBmb3J0LW91dCAgICA9IC1vJChzcGFjZSkKKyAgICBmb3J0LWZsYWdzICs9IC1ub2xvZ28KKyAgICBmb3J0LWZsYWdzICs9IC1jCisgICAgIyBTREwgKFNlY3VyaXR5IERldmVsb3BtZW50IExpZmVjeWNsZSkgZmxhZ3M6CisgICAgIyAgIEdTIC0gU3RhY2stYmFzZWQgQnVmZmVyIE92ZXJydW4gRGV0ZWN0aW9uCisgICAgIyAgIER5bmFtaWNCYXNlIC0gSW1hZ2UgUmFuZG9taXphdGlvbgorICAgIGZvcnQtZmxhZ3MgKz0gLUdTIC1EeW5hbWljQmFzZSAKKyAgICAjIC0tLSBMaWJyYXJpYW4gLS0tCisgICAgYXIgICAgID0gbGluay5leGUKKyAgICBhci1vdXQgPSAtb3V0OgorICAgICMgR2VuZXJhdGUgc3RhdGljIGxpYnJhcnkuIE11c3QgYmUgdGhlIGZpcnN0IG9wdGlvbi4KKyAgICBhci1mbGFncyArPSAtbGliCisgICAgIyBUdXJuIG9mZiB0b29sIGJhbm5lci4KKyAgICBhci1mbGFncyArPSAtbm9sb2dvCisgICAgIyAtLS0gTGlua2VyIC0tLQorICAgIGxkICAgICAgID0gbGluay5leGUKKyAgICBsZC1vdXQgICA9IC1vdXQ6CisgICAgIyBHZW5lcmF0ZSBkeW5hbWljIGxpYnJhcnkuCisgICAgbGQtZmxhZ3MtZGxsICs9IC1kbGwKKyAgICAjIFR1cm4gb2ZmIHRvb2wgYmFubmVyLgorICAgIGxkLWZsYWdzICs9IC1ub2xvZ28KKyAgICAjIEdlbmVyYXRlIHBkYiAoUHJvZ3JhbSBEYXRhQmFzZSwgZGVidWcgaW5mb3JtYXRpb24pIGZpbGUuCisgICAgIyBJZiBERUJVR19JTkZPIGlzIG9uLCBnZW5lcmF0ZSBub3JtYWwgKGZ1bGwtZmVhdHVyZWQpIHBkYiBmaWxlLiBPdGhlcndpc2UsIHdlIG5lZWQgb25seQorICAgICMgc3RyaXBwZWQgcGRiLiBCdXQgc3RyaXBwZWQgcGRiIGNhbm5vdCBiZSBnZW5lcmF0ZWQgYWxvbmUsIHdlIGhhdmUgdG8gZ2VuZXJhdGUgbm9ybWFsICphbmQqCisgICAgIyBzdHJpcHBlZCBwZGIuIEFmdGVyIGdlbmVyYXRpbmcgYm90aCBwZGIgZmlsZXMgd2UgcmVuYW1lIHN0cmlwcGVkIHBkYiB0byBub3JtYWwgcGRiIG5hbWUgKHNlZQorICAgICMgcnVsZXMubWspLgorICAgIGlmZXEgIiQoREVCVUdfSU5GTykiICJvbiIKKyAgICAgICAgbGQtZmxhZ3MgKz0gJChpZiAkKHBkYl9maWxlKSwtZGVidWcgLXBkYjokKHBkYl9maWxlKSkKKyAgICBlbHNlCisgICAgICAgIGxkLWZsYWdzICs9ICQoaWYgJChwZGJfZmlsZSksLWRlYnVnIC1wZGI6JChwZGJfZmlsZSkgLXBkYnN0cmlwcGVkOiQocGRiX2ZpbGUpLnN0cmlwcGVkKQorICAgIGVuZGlmCisgICAgIyBVc2UgZGVmIGZpbGUsIGlmICQoZGVmX2ZpbGUpIGlzIHNwZWNpZmllZC4KKyAgICBsZC1mbGFncyArPSAkKGlmICQoZGVmX2ZpbGUpLC1kZWY6JChkZWZfZmlsZSkpCisgICAgIyBHZW5lcmF0ZSBpbXBvcnQgbGlicmFyeSwgaWYgJChpbXBfZmlsZSkgaXMgc3BlY2lmaWVkLgorICAgIGxkLWZsYWdzICs9ICQoaWYgJChpbXBfZmlsZSksLWltcGxpYjokKGltcF9maWxlKSkKKyAgICAjIFNwZWNpZnkgYXJjaGl0ZWN0dXJlLgorICAgIGlmZXEgIiQoYXJjaCkiICIzMiIKKyAgICAgICAgYXItZmxhZ3MgKz0gLW1hY2hpbmU6aTM4NgorICAgICAgICBsZC1mbGFncyArPSAtbWFjaGluZTppMzg2CisgICAgZW5kaWYKKyAgICBpZmVxICIkKGFyY2gpIiAiMzJlIgorICAgICAgICBhci1mbGFncyArPSAtbWFjaGluZTphbWQ2NAorICAgICAgICBsZC1mbGFncyArPSAtbWFjaGluZTphbWQ2NAorICAgIGVuZGlmCisgICAgIyBTQUZFU0VICisgICAgaWZlcSAiJChhcmNoKSIgIjMyIgorICAgICAgICBhcy1mbGFncyArPSAtc2FmZXNlaAorICAgICAgICBsZC1mbGFncyArPSAtc2FmZXNlaAorICAgIGVuZGlmCisgICAgIyBTREwgKFNlY3VyaXR5IERldmVsb3BtZW50IExpZmVjeWNsZSkgZmxhZ3M6CisgICAgIyAgIE5YQ29tcGF0IC0gRGF0YSBFeGVjdXRpb24gUHJldmVudGlvbgorICAgIGxkLWZsYWdzICs9IC1OWENvbXBhdCAtRHluYW1pY0Jhc2UKK2VuZGlmCisKKyMgZW5kIG9mIGZpbGUgIwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90b29scy93aW5kb3dzLmluYyBiL2ZpbmFsL3J1bnRpbWUvdG9vbHMvd2luZG93cy5pbmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2QyZTA3MAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdG9vbHMvd2luZG93cy5pbmMKQEAgLTAsMCArMSwyNyBAQAorIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworCitleHBvcnQgU0hFTEwgPSBjbWQKKworIyBUT0RPIGdpdmUgYW4gZXJyb3IgaWYgYXJjaHMgZG9lc24ndCBtYXRjaAoraWZuZGVmIGFyY2gKKyAgICAkKGVycm9yIENvdWxkIG5vdCBkZXRlY3QgYXJjaDogcGxlYXNlIHNwZWNpZnkgb24gY29tbWFuZCBsaW5lLikKK2VuZGlmCisKKworQ01EPWNtZCAvQworQ1dEPSQoc2hlbGwgY21kIC9DIGVjaG8gJUNEJSkKK1JNPWNtZCAvQyBkZWwgL1EgL0YKK1JEPWNtZCAvQyBybWRpcgorTUQ9Y21kIC9jIG1rZGlyCitTTEFTSD1cXAorTlVMID0gbnVsCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdG9vbHMvd2lwZS1zdHJpbmcucGwgYi9maW5hbC9ydW50aW1lL3Rvb2xzL3dpcGUtc3RyaW5nLnBsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmRlYWI5NWYKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rvb2xzL3dpcGUtc3RyaW5nLnBsCkBAIC0wLDAgKzEsMTgzIEBACisjIS91c3IvYmluL3BlcmwKKworIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCit1c2UgRmlsZTo6R2xvYiAiOmdsb2IiOworCit1c2UgRmluZEJpbjsKK3VzZSBsaWIgIiRGaW5kQmluOjpCaW4vbGliIjsKKwordXNlIHRvb2xzOworCitvdXIgJFZFUlNJT04gPSAiMC4wMiI7CisKK3N1YiB3aXBlKCQkJCkgeworCisgICAgbXkgKCAkaW5wdXQsICRvdXRwdXQsICR3aXBlICkgPSBAXzsKKyAgICBteSAkYnVsayA9IHJlYWRfZmlsZSggJGlucHV0LCAtYmluYXJ5ID0+IDEgKTsKKyAgICAkYnVsayA9fiBzeygkd2lwZSl9eyAiICIgeCBsZW5ndGgoICQxICkgfWdlOworICAgIHdyaXRlX2ZpbGUoICRvdXRwdXQsIFwkYnVsaywgLWJpbmFyeSA9PiAxICk7CisgICAgcmV0dXJuIHVuZGVmOworCit9OyAjIHN1YiB3aXBlCisKK215IEB3aXBlOworbXkgJHRhcmdldCA9ICIuIjsKK2dldF9vcHRpb25zKAorICAgICJ3aXBlLWxpdGVyYWw9cyIgICAgID0+CisgICAgICAgIHN1YiB7IG15ICRhcmcgPSAkX1sgMSBdOyBwdXNoKCBAd2lwZSwgcXJ7QHsgWyBxdW90ZW1ldGEoICRhcmcgKSBdIH19ICk7IH0sCisgICAgIndpcGUtcmVnZXhwPXMiICAgICAgPT4KKyAgICAgICAgc3ViIHsgbXkgJGFyZyA9ICRfWyAxIF07IHB1c2goIEB3aXBlLCBxcnskYXJnfSApOyB9LAorICAgICJ0YXJnZXQtZGlyZWN0b3J5PXMiID0+IFwkdGFyZ2V0LAorKTsKKworIyBDb252ZXJ0IHN0cmluZ3MgdG8gcmVndWxhciBleHByZXNzaW9uLgorbXkgJHdpcGUgPSBxcntAeyBbIGpvaW4oICJ8IiwgQHdpcGUgKSBdIH19OworCitteSAlam9iczsKKworIyBDb2xsZWN0IGZpbGVzIHRvIHByb2Nlc3MuCisjIGpvYnM6IG91dHB1dCAtPiBpbnB1dC4KK2ZvcmVhY2ggbXkgJGFyZyAoIEBBUkdWICkgeworICAgIG15IEBpbnB1dHMgPSAoICReTyBlcSAiTVNXaW4zMiIgPyBic2RfZ2xvYiggJGFyZyApIDogKCAkYXJnICkgKTsKKyAgICBmb3JlYWNoIG15ICRpbnB1dCAoIEBpbnB1dHMgKSB7CisgICAgICAgIG15ICRmaWxlICAgPSBnZXRfZmlsZSggJGlucHV0ICk7CisgICAgICAgIG15ICRvdXRwdXQgPSBjYXRfZmlsZSggJHRhcmdldCwgJGZpbGUgKTsKKyAgICAgICAgaWYgKCBleGlzdHMoICRqb2JzeyAkb3V0cHV0IH0gKSApIHsKKyAgICAgICAgICAgIHJ1bnRpbWVfZXJyb3IoCisgICAgICAgICAgICAgICAgIlwiJGpvYnN7ICRvdXRwdXQgfVwiIGFuZCBcIiRpbnB1dFwiIGlucHV0IGZpbGVzIHRlbmQgdG8gYmUgd3JpdHRlbiAiIC4KKyAgICAgICAgICAgICAgICAgICAgInRvIHRoZSBzYW1lIG91dHB1dCBmaWxlIFwiJG91dHB1dFwiIgorICAgICAgICAgICAgKTsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICAkam9ic3sgJG91dHB1dCB9ID0gJGlucHV0OworICAgIH07ICMgZm9yZWFjaAorfTsgIyBmb3JlYWNoICRmaWxlCisKKyMgUHJvY2VzcyBmaWxlcy4KKyVqb2JzID0gcmV2ZXJzZSggJWpvYnMgKTsgIyBqb2JzOiBpbnB1dCAtPiBvdXRwdXQuCitmb3JlYWNoIG15ICRpbnB1dCAoIHNvcnQoIGtleXMoICVqb2JzICkgKSApIHsKKyAgICBteSAkb3V0cHV0ID0gJGpvYnN7ICRpbnB1dCB9OworICAgIGluZm8oICJcIiRpbnB1dFwiIC0+IFwiJG91dHB1dFwiIiApOworICAgIHdpcGUoICRpbnB1dCwgJG91dHB1dCwgJHdpcGUgKTsKK307ICMgZm9yZWFjaCAkaW5wdXQKKworZXhpdCggMCApOworCitfX0VORF9fCisKKyMKKyMgRW1iZWRkZWQgZG9jdW1lbnRhdGlvbi4KKyMKKworPXBvZAorCis9aGVhZDEgTkFNRQorCitCPHdpcGUtc3RyaW5nLnBsPiAtLSBXaXBlIHN0cmluZyBpbiB0ZXh0IG9yIGJpbmFyeSBmaWxlcy4KKworPWhlYWQxIFNZTk9QU0lTCisKK0I8d2lwZS1zdHJpbmcucGw+IEk8T1BUSU9OPi4uLiBJPEZJTEU+Li4uCisKKz1oZWFkMSBPUFRJT05TCisKKz1vdmVyCisKKz1pdGVtIEI8LS1kb2M+CisKKz1pdGVtIEI8LS1tYW51YWw+CisKK1ByaW50IGZ1bGwgaGVscCBtZXNzYWdlIGFuZCBleGl0LgorCis9aXRlbSBCPC0taGVscD4KKworUHJpbnQgc2hvcnQgaGVscCBtZXNzYWdlIGFuZCBleGl0LgorCis9aXRlbSBCPC0tdGFyZ2V0LWRpcmVjdG9yeT0+STxkaXI+CisKK0RpcmVjdG9yeSB0byBwdXQgcmVzdWx0IGZpbGVzIHRvLiBCeSBkZWZhdWx0IHJlc3VsdCBmaWxlcyBhcmUgd3JpdHRlbiBpbiB0aGUgY3VycmVudCB3b3JraW5nCitkaXJlY3RvcnkuCisKKz1pdGVtIEI8LS11c2FnZT4KKworUHJpbnQgdmVyeSBzaG9ydCB1c2FnZSBtZXNzYWdlIGFuZCBleGl0LgorCis9aXRlbSBCPC0tdmVyc2lvbj4KKworUHJpbnQgdmVyc2lvbiBhbmQgZXhpdC4KKworPWl0ZW0gQjwtLXdpcGUtbGl0ZXJhbD0+STxzdHI+CisKK1NwZWNpZnkgbGl0ZXJhbCBzdHJpbmcgdG8gd2lwZS4gTXVsdGlwbGUgbGl0ZXJhbHMgYXJlIGFsbG93ZWQuCisKKz1pdGVtIEI8LS13aXBlLXJlZ2V4cD0+STxzdHI+CisKK1NwZWNpZnkgUGVybCByZWd1bGFyIGV4cHJlc3Npb24gdG8gd2lwZS4gTXVsdGlwbGUgcmVndWxhciBleHByZXNzaW9ucyBtYXkgYmUgc3BlY2lmaWVkLgorCitCZSBjYXJlZnVsLiBQcm90ZWN0IHNwZWNpYWwgY2hhcmFjdGVycyBmcm9tIGJlaWduIGludGVycHJldGVkIGJ5IHNoZWxsLgorCis9YmFjaworCis9aGVhZDEgQVJHVU1FTlRTCisKKz1vdmVyCisKKz1pdGVtIEk8ZmlsZT4KKworRmlsZSBuYW1lIHRvIHdpcGUgc3RyaW5nIGluLgorCis9YmFjaworCis9aGVhZDEgREVTQ1JJUFRJT04KKworVGhlIHNjcmlwdCB3aXBlcyBzdHJpbmdzIGluIGZpbGVzLiBTdHJpbmcgbWF5IGJlIHNwZWNpZmllZCBsaXRlcmFsbHkgb3IgYnkgUGVybCByZWd1bGFyIGV4cHJlc3Npb24uCitTdHJpbmdzIGFyZSB3aXBlZCBieSByZXBsYWNpbmcgY2hhcmFjdGVycyB3aXRoIHNwYWNlcywgc28gc2l6ZSBvZiBmaWxlIHJlbWFpbnMgdGhlIHNhbWUuIFRoZSBzY3JpcHQKK21heSBiZSBhcHBsaWVkIHRvIGJvdGggdGV4dCBhbmQgYmluYXJ5IGZpbGVzLgorCitSZXN1bHQgZmlsZXMgYXJlIHdyaXR0ZW4gYnkgZGVmYXVsdCB0byBjdXJyZW50IGRpcmVjdG9yeSwgb3IgdG8gZGlyZWN0b3J5IHNwZWNpZmllZCBieQorQjwtLXRhcmdldC1kaXJlY3Rvcnk+IG9wdGlvbiwgaWYgYW55LiBJZiBtdWx0aXBsZSBpbnB1dCBmaWxlcyB0ZW5kIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIHNhbWUgb3V0cHV0CitmaWxlIChlLiBnLiBpZGVudGljYWxseSBuYW1lZCBpbnB1dCBmaWxlcyBsb2NhdGVkIGluIGRpZmZlcmVudCBkaXJlY3RvcmllcyksIHRoZSBzY3JpcHQgZ2VuZXJhdGVzIGFuCitlcnJvci4KKworVGhlIHNjcmlwdCByZWFkcyBlbnRpcmUgZmlsZSwgcHJvY2VzcyBpdCwgYW5kIHRoZSB3cml0ZXMgdG8gZGlzay4gVGhlcmVmb3JlIGl0IGlzIChhbG1vc3QpIHNhZmUgdG8KK3VwZGF0ZSBmaWxlcyBpbi1wbGFjZSAoc2VlIGV4YW1wbGVzKS4KKworPWhlYWQxIEVYQU1QTEVTCisKK1dpcGUgIkNvcHlyaWdodCIgd29yZCBpbiBhbGwgdGhlIGZpbGVzIHdpdGggInR4dCIgc3VmZml4IGluIGN1cnJlbnQgZGlyZWN0b3J5LCBvdmVyd3JpdGUgb3JpZ2luYWwKK2ZpbGVzICh1cGRhdGUgdGhlbSBpbi1wbGFjZSk6CisKKyAgICB3aXBlLXN0cmluZy5wbCAtLXdpcGUtbGl0ZXJhbD0iQ29weXJpZ2h0IiAqLnR4dAorCitXaXBlICJDb3B5cmlnaHQiIGFuZCAiQ29weWxlZnQiIHdvcmRzIGluIGFsbCB0aGUgZmlsZXMgd2l0aCAidHh0IiBzdWZmaXggaW4gY3VycmVudCBkaXJlY3RvcnksCit3cml0ZSByZXN1bHQgZmlsZXMgdG8gLi4vd2lwZWQgZGlyZWN0b3J5OgorCisgICAgd2lwZS1zdHJpbmcucGwgLS13aXBlLWxpdGVyYWw9Q29weXJpZ2h0IC0td2lwZS1saXRlcmFsPUNvcHlsZWZ0IC0tdGFyZ2V0LWRpcj0uLi93aXBlZCAqLnR4dAorCitXaXBlICJDb3B5cmlnaHQiIGFuZCAiQ29weWxlZnQiIHdvcmRzIGluIGZpbGVzIGZyb20gImRvYyIgZGlyZWN0b3J5LCB3cml0ZSByZXN1bHQgZmlsZXMgdG8gY3VycmVudAorZGlyZWN0b3J5OworCisgICAgd2lwZS1zdHJpbmcucGwgLS13aXBlLXJlZ2V4cD0iQ29weXJpZ2h0fENvcHlsZWZ0IiBkb2MvKgorCitXaXBlICJkZWZhdWx0bGliIiBkaXJlY3RpdmUgaW4gYWxsIHRoZSBsaWJyYXJ5IGZpbGVzOgorCisgICAgd2lwZS1zdHJpbmcucGwgLS13aXBlLXJlZ2V4cD0iLWRlZmF1bHRsaWI6W0EtWmEtejAtOV8uXSsiICoubGliCisKKyhCZSBjYXJlZnVsOiB0aGUgc2NyaXB0IGRvZXMgbm90IGFuYWx5emUgc3RydWN0dXJlIG9mIGxpYnJhcnkgYW5kIG9iamVjdCBmaWxlcywgaXQganVzdCB3aXBlcworVTxzdHJpbmdzPiwgc28gaXQgd2lwZXMgYWxsIHRoZSBvY2N1cnJlbmNlcyBvZiBzdHJpbmdzIG1hdGNoaW5nIHRvIHNwZWNpZmllZCByZWd1bGFyIGV4cHJlc3Npb24uKQorCis9Y3V0CisKKyMgZW5kIG9mIGZpbGUgIwpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL0xJQ0VOU0UgYi9maW5hbC90ZXN0c3VpdGUvTElDRU5TRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTlmYjAxCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL0xJQ0VOU0UKQEAgLTAsMCArMSwzNCBAQAorICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTIgCisgIFVuaXZlcnNpdHkgb2YgSG91c3RvbiBTeXN0ZW0KKyAgCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgIAorICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgIGFyZSBtZXQ6CisgIAorICBvIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAKKyAgbyBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAKKyAgbyBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG9mIEhvdXN0b24gU3lzdGVtIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0bworICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljCisgICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICAKKyAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQKKyAgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCisgIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAKKwpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL01ha2VmaWxlIGIvZmluYWwvdGVzdHN1aXRlL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjZDE4ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvTWFrZWZpbGUKQEAgLTAsMCArMSwyMjIgQEAKKyMgR2VuZXJhbCBNYWtlZmlsZSBjb250YWluaW5nIGFsbCB0aGUgbmVjZXNzYXJ5IGNvbXBpbGVyIGZsYWdzIGZvciB0aGUgdGVzdHMKKworIyBtb2RpZnkgQ0MgYW5kIENGTEFHUyBmb3IgT3Blbk1QIEMgY29tcGlsZXJzCisjIG1vZGlmeSBGQyBhbmQgRkZMQUdTIGZvciBPcGVuTVAgRm9ydHJhbiBjb21waWxlcnMKKworCisjIENvbnRlbnQ6CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyAxLiBCYXNpYyB1c2FnZQorIyAyLiBHZW5lcmFsIHRlc3RzdWl0ZSBzZXR0aW5ncworIyAzLiBDb21waWxlciBzZWxlY3Rpb24gYW5kIEZsYWdzCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAxLiBCYXNpYyB1c2FnZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIAltYWtlIGN0ZXN0CQlnZW5lcmF0ZSBjIHRlc3QgImN0ZXN0IgorIyAJbWFrZSBmdGVzdAkJZ2VuZXJhdGUgZm9ydHJhbiB0ZXN0ICJmdGVzdCIKKyMJbWFrZSBjbGVhbgkJcmVtb3ZlcyBhbGwgc291cmNlcyBhbmQgYmluYXJpZXMKKyMgCW1ha2UgY2xlYW5hbGwJcmVtb3ZlcyBzb3VyY2VzLGJpbmFyaWVzIGFuZCBsb2dmaWxlcworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAyLiBHZW5lcmFsIHRlc3RzdWl0ZSBzZXR0aW5ncworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgRm9yIGdlbmVyYWwgdGVzdHN1aXRlIHNldHRpbmdzIHNlZSB0aGUgY29uZmlndXJhdGlvbiBmaWxlCisjIG9tcHRzLmNvbmYKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIDMuIENvbXBpbGVyIHNlbGVjdGlvbiBhbmQgRmxhZ3MKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIEdOVSBDb21waWxlcgorQ0MgICAgID0gZ2NjCitDRkxBR1MgPSAtZm9wZW5tcCAtbG0gLU8zCitDRkxBR1MgPSAtZm9wZW5tcCAtbG0gLU8zCitGQyAgICAgPSBnZm9ydHJhbgorRkZMQUdTID0gLWZvcGVubXAgLWxtCitGRkxBR1MgPSAtZm9wZW5tcCAtbG0gLU8zCisKKworIyBGdWppdHN1IENvbXBpbGVyczoKKyNDQyA9IGZjYworI0NGTEFHUyA9IC1LT01QLGZhc3RfR1AyPTIKKyNGQz1mcnQKKyNGRkxBR1M9LUtPTVAsZmFzdF9HUDI9MiAtdyAtQW0gLVg5IC1GaXhlZAorCisKKyMgUEdJIGNvbXBpbGVycworI0NDID0gcGdjYworI0NGTEFHUyA9IC1tcAorI0NGTEFHUyA9IC1tcCAtRFZFUkJPU0UKKyNDRkxBR1MgPSAtZmFzdCAtbXAKKworI0ZDID0gcGdmOTAKKyNGRkxBR1MgPSAtZmFzdCAtbXAKKyNGRkxBR1MgPSAtbXAgLWcKKworCisjIEludGVsIGNvbXBpbGVyczoKKyNDQyA9IGljYworI0NGTEFHUyA9IC1PMyAtaXAgLW9wZW5tcAorI0NGTEFHUyA9IC1XYWxsIC1PMCAtb3Blbm1wCisjQ0ZMQUdTID0gIC1vcGVubXAgLWxtCisjQ0ZMQUdTID0gIC1vcGVubXAgLWxtIC1EVkVSQk9TRQorCisjRkMgPSBpZm9ydAorI0ZGTEFHUyA9IC1vcGVubXAgLWxtIC1mcHAKKworIyBPbW5pIGNvbXBpbGVyczoKKyNDQyA9IG9tcGNjCisjQ0ZMQUdTID0gLU8zIC1sbQorCisKKyMgQXNzdXJlIGNvbXBpbGVyczoKKyNDQyA9IGFzc3VyZWMKKyNDRkxBR1MgPSAtTzMgLVdBcG5hbWU9cHJvamVjdCAtRFVTRV9BU1NVUkU9MQorI0ZDID0KKyNGRkxBR1MgPQorCisjIE5FQzoKKyNDQyA9IGMrKworI0NDID0gc3hjKysKKyNDRkxBR1MgPSAtUG9wZW5tcAorCisjRkM9c3hmOTAKKyNGRkxBR1M9IC1Qb3Blbm1wCisKKworIyBIaXRhY2hpOgorI0NDID0geGNjCisjQ0ZMQUdTID0gLU80IC1wdmVjICtPcCAtcGFyYWxsZWwgLW9tcAorI0ZDID0KKyNGRkxBR1MgPQorCisKKyMgU0dJOgorI0NDID0gY2MKKyNDRkxBR1MgPSAtbXAgLWxtCisjRkMgPQorI0ZGTEFHUyA9CisKKworIyBJQk0gY29tcGlsZXJzOgorI0NDID0geGxjX3IKKyNDRkxBR1MgPSAtcXNtcD1vbXAgLWxtCisKKworI0ZDPXhsZjkwX3IKKyNGRkxBR1M9LXFzbXA9b21wIC1xZml4ZWQ9MTMyIC1xbGFuZ2x2bD1leHRlbmRlZAorCisKKyMgU1VOIGNvbXBpbGVycworI0NDID0gY2MKKyNDRkxBR1MgPSAtZmFzdCAteG9wZW5tcCAtbG0KKworI0ZDID1mOTAKKyNGRkxBR1MgPSAteG9wZW5tcCAtZmFzdCAtbG0KKworCisjIG9wZW42NCBjb21waWxlcnMKKyMgcmVtYXJrOiAtSS4gd2FzIGEgd29ya2Fyb3VuZCBiZWNhdXNlIHRoZSBpbnN0YWxsYXRpb24gY2FtZSB3aXRob3V0IG9tcC5oIGZpbGUKKyNDQyA9IG9wZW5jYworI0NGTEFHUyA9IC1PMCAtb3Blbm1wIC1sbSAtSS4gLWxvbXAgLWxwdGhyZWFkCisjQ0ZMQUdTID0gLU8wIC1vcGVubXAgLWxtIC1JIC9ob21lL21hdHRoZXcvb3B0L3Vzci9pbmNsdWRlIC1scHRocmVhZAorI0NGTEFHUyA9IC1vcGVubXAgLWxtCisKKyNGQyA9IG9wZW5mOTAKKyNGRkxBR1MgPSAtTzAgLW9wZW5tcCAtbG0gIC1sb21wIC1scHRocmVhZAorCisKKyNQYXRoc2NhbGUgQ29tcGlsZXIKKyNDQyA9IHBhdGhjYworI0NGTEFHUyA9IC1tcCAtT2Zhc3QgLWxtCisKKyNGQz1wYXRoZjkwCisjRkZMQUdTPSAtbXAgLU9mYXN0IC1sbQorCisKKyNPcGVuVUggQ29tcGlsZXIKKyNDQyA9IHVoY2MKKyNDRkxBR1MgPSAtbXAKKworI0ZDID0gdWhmOTAKKyNGRkxBR1MgPSAtbXAKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitoZWxwOgorCUBlY2hvICJPcGVuTVAgVmFsaWRhdGlvbiBTdWl0ZSwgdjMuMCIKKwlAZWNobyAiKEMpIFVuaXZlcnNpdHkgb2YgU3R1dHRnYXJ0LCBVbml2ZXJzaXR5IG9mIEhvdXN0b24iCisJQGVjaG8gIiIKKwlAZWNobyAiRG8gbWFrZSBbcnVsZV0sIHdoZXJlIHJ1bGUgbWF5IGJlIG9uZSBvZjoiCisJQGVjaG8gIiAgY3Rlc3QiCisJQGVjaG8gIiAgICBCdWlsZCBhbmQgcnVuIHRoZSBPcGVuTVAvQyB2YWxpZGF0aW9uIHRlc3RzLiIKKwlAZWNobyAiICBmdGVzdCIKKwlAZWNobyAiICAgIEJ1aWxkIGFuZCBydW4gdGhlIE9wZW5NUC9Gb3J0cmFuIHZhbGlkYXRpb24gdGVzdHMuIgorCUBlY2hvICIgIHByaW50X2NvbXBpbGVfb3B0aW9ucyIKKwlAZWNobyAiICAgIERpc3BsYXkgdGhlIGRlZmF1bHQgY29tcGlsZXIgYW5kIGNvbXBpbGVyIG9wdGlvbnMgYmVpbmcgdGVzdGVkIgorCUBlY2hvICIgIGNsZWFuc3JjcyIKKwlAZWNobyAiICAgIFJlbW92ZSBzb3VyY2VzIGdlbmVyYXRlZCBmcm9tIHRoZSB0ZW1wbGF0ZXMiCisJQGVjaG8gIiAgY2xlYW5iaW5zIgorCUBlY2hvICIgICAgUmVtb3ZlIGV4ZWN1dGFibGVzIGZyb20gYmluLyBkaXJlY3RvcnkiCisJQGVjaG8gIiAgY2xlYW5vdXRzIgorCUBlY2hvICIgICAgUmVtb3ZlIGFsbCAqLm91dCBmaWxlcyBmcm9tIGJpbi8gZGlyZWN0b3J5IgorCUBlY2hvICIgIGNsZWFubG9ncyIKKwlAZWNobyAiICAgIFJlbW92ZSBhbGwgKi5sb2cgZmlsZXMgZnJvbSBiaW4vIGRpcmVjdG9yeSIKKwlAZWNobyAiICBjbGVhbiIKKwlAZWNobyAiICAgIFJlbW92ZSBhbGwgc291cmNlcyBhbmQgZXhlY3V0YWJsZXMgZnJvbSBiaW4vIGRpcmVjdG9yeSIKKwlAZWNobyAiICBjbGVhbmFsbCIKKwlAZWNobyAiICAgIFJlbW92ZSB0aGUgZW50aXJlIGJpbi8gZGlyZWN0b3J5IgorCitvbXBfbXlfc2xlZXA6CisJbWtkaXIgLXAgYmluL2MKKwljcCBvbXBfbXlfc2xlZXAuaCBiaW4vYy8KK29tcF90ZXN0c3VpdGU6IG9tcF90ZXN0c3VpdGUuaAorCW1rZGlyIC1wIGJpbi9jCisJY3Agb21wX3Rlc3RzdWl0ZS5oIGJpbi9jLworb21wX3Rlc3RzdWl0ZS5oOiBvbXB0cy1jLmNvbmYgYy8qCisJLi9vbXB0c19tYWtlSGVhZGVyLnBsIC1mPW9tcHRzLWMuY29uZiAtdD1jCisuYy5vOiBvbXBfdGVzdHN1aXRlIG9tcF9teV9zbGVlcAorCSQoQ0MpICQoQ0ZMQUdTKSAtYyAkPAorCitjdGVzdDogb21wX215X3NsZWVwIG9tcF90ZXN0c3VpdGUKKwkuL3J1bnRlc3QucGwgLS1sYW5nPWMgdGVzdGxpc3QtYy50eHQKKworZnRlc3Q6CisJbWtkaXIgLXAgYmluL2ZvcnRyYW4KKwljcCBvbXBfdGVzdHN1aXRlLmYgYmluL2ZvcnRyYW4KKwljcCBvbXBfbXlfc2xlZXAuZiBiaW4vZm9ydHJhbgorCS4vcnVudGVzdC5wbCAtLWxhbmc9Zm9ydHJhbiB0ZXN0bGlzdC1mLnR4dAorCitwcmludF9jb21waWxlX29wdGlvbnM6CisJQGVjaG8gIi0tLS0tLS0tLS0tLS0tLS0tLS0iCisJQGVjaG8gIkMgY29tcGlsZXIiCisJQGVjaG8gIi0tLS0tLS0tLS0tLS0tLS0tLS0iCisJQGVjaG8gImNvbXBpbGF0aW9uOiAkKENDKSAkKENGTEFHUykiCisJQCQoQ0MpIC0tdmVyc2lvbgorCUBlY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tIgorCUBlY2hvICJGb3J0cmFuIGNvbXBpbGVyIgorCUBlY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tIgorCUBlY2hvICJjb21waWxhdGlvbjogJChGQykgJChGRkxBR1MpIgorCUAkKEZDKSAtLXZlcnNpb24KKworY2xlYW5zcmNzOgorCWZpbmQgYmluLyAtaW5hbWUgIiouW2NmXSIgLWV4ZWMgcm0ge30gXDsKK2NsZWFuYmluczoKKwlmaW5kIGJpbi8gLXBlcm0gL2EreCAtdHlwZSBmIC1leGVjIHJtIHt9IFw7CitjbGVhbm91dHM6CisJZmluZCBiaW4vIC1pbmFtZSAiKi5vdXQiIC1leGVjIHJtIHt9IFw7CitjbGVhbmxvZ3M6CisJZmluZCBiaW4vIC1pbmFtZSAiKi5sb2ciIC1leGVjIHJtIHt9IFw7CisKK2NsZWFuOiBjbGVhbnNyY3MgY2xlYW5iaW5zCisKK2NsZWFuYWxsOgorCXJtIC1yZiBiaW4vCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9SRUFETUUgYi9maW5hbC90ZXN0c3VpdGUvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjYTdjNjEKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvUkVBRE1FCkBAIC0wLDAgKzEsMzM0IEBACisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorfCAgICAgICAgICAgICAgICAgICBPcGVuTVAgVmFsaWRhdGlvbiBTdWl0ZSAgViAzLjAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cit8ICAgICAgICAgICAgICBIaWdoIFBlcmZvcm1hbmNlIENvbXB1dGluZyBDZW50ZXIsIFN0dXR0Z2FydCAgICAgICAgICAgICAgICAgIHwKK3wgICAgICAgSGlnaCBQZXJmb3JtYW5jZSBDb21wdXRpbmcgYW5kIFRvb2xzLCBVbml2ZXJzaXR5IG9mIEhvdXN0b24gICAgICAgICAgfAorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEphbi4gMjAxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisKK1RBQkxFIE9GIENPTlRFTlRTCisKK0kgICAgCUlOVFJPRFVDVElPTgorSS4xLgkgIEFpbXMgYW5kIGdlbmVyYWwgZnVuY3Rpb24KK0kuMi4gCSAgRmlsZXMgYW5kIGRpcmVjdG9yaWVzCisKK0lJCQlVU0FHRQorSUkuMS4JICBGaXJzdCBydW4gd2l0aCBtYWtlCitJSS4yCSAgV2hlcmUgdG8gc2VhcmNoIGZvciByZXN1bHRzCitJSS4zLgkgIFVzaW5nIHRoZSBydW50ZXN0IHNjcmlwdAorCitJSUkJCUFkZGluZyBhbmQgbW9kaWZ5aW5nIHRlc3RzCitJSUkuMS4JICBUaGUgdGVtcGxhdGUgc3RydWN0dXJlCisKK0lWCQlLbm93biBJc3N1ZXMgYW5kIFdvcmthcm91bmQKKworViAgICAgICBDb250YWN0IGFuZCBTdXBwb3J0CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJLiAgSU5UUk9EVUNUSU9OCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworSS4xLiAgQWltcyBhbmQgZ2VuZXJhbCBmdW5jdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIE9wZW5NUCB2YWxpZGF0aW9uIHN1aXRlIGlzIGRlc2lnbmVkIHRvIHZlcmlmeSB0aGUgY29ycmVjdCBpbXBsZW1lbnRhdGlvbgorb2YgT3Blbk1QIGluIGNvbXBpbGVycy4gSXQgaXMgY2FwYWJsZSBvZiBjaGVja2luZyBGb3J0cmFuIGFzIHdlbGwgYXMgYworY29tcGlsZXIuCisKK1Rlc3RpbmcgdGhlIGltcGxlbWVudGF0aW9uIGlzIGJhc2VkIG9uIHN0YXRpc3RpY3MuIEVhY2ggZGlyZWN0aXZlIGlzIHRlc3RlZAorYnkgY29tcHV0aW5nIGFuZCB2ZXJpZnlpbmcgdGhlIHJlc3VsdCB3aXRoIHRoZSBhbHJlYWR5IGtub3duIHZhbHVlLiBJbiBtb3N0CitjYXNlcyBhIHdyb25nIGltcGxlbWVudGF0aW9uIGNhbiByZXN1bHQgaW4gdGhlIHJpZ2h0IHZhbHVlcy4gU28gdGhlIHRlc3RzIGFyZQorcnVuIHNldmVyYWwgdGltZXMuCisKK0FkZGl0aW9uYWxseSwgdGhlIHZhbGlkYXRpb24gc3VpdGUgY3JlYXRlcyBzbyBjYWxsZWQgY3Jvc3N0ZXN0cyBmb3IgZWFjaAorZGlyZWN0aXZlLiBUaGVzZSBhcmUgdGVzdHMgaW4gd2hpY2ggZWl0aGVyIHRoZSBkaXJlY3RpdmUgaXMgbWlzc2luZyBvciB1c2VkCit3aXRoIGRpZmZlcmVudCBhcmd1bWVudHMuIElmIHRoaXMgc28gY2FsbGVkIGNyb3NzdGVzdCBmYWlscywgdGhpcyBpbmRpY2F0ZXMKK3N0cm9uZ2x5IHRoYXQgdGhlIHByZXZpb3VzIHRlc3QgaXMgY2FwYWJsZSBvZiB0ZXN0aW5nIHRoZSBkaXJlY3RpdmUuCisKK0xhc3RseSwgYW4gb3JwaGFuZWQgdGVzdCBpcyBhbHNvIHJ1biB0byBkZXRlcm1pbmUgaWYgdGhlIGRpcmVjdGl2ZSBiZWluZwordGVzdGVkIGlzIGFibGUgdG8gY29ycmVjdGx5IHJ1biB3aGVuICdvcnBoYW5lZCcgZnJvbSB0aGUgbWFpbiBmdW5jdGlvbi4KK0Vzc2VudGlhbGx5LCB0aGUgZGlyZWN0aXZlJ3MgY29kZSBpcyBwbGFjZWQgaW50byBpdHMgb3duIGZ1bmN0aW9uIHdoaWNoIGlzCitjYWxsZWQgZHVyaW5nIGV4ZWN1dGlvbiBvZiB0aGUgbWFpbiBmdW5jdGlvbiBhbmQgb2Z0ZW4gaW5zaWRlIGEgcGFyYWxsZWwKK3JlZ2lvbi4KKworCitJLjIuICBGaWxlcyBhbmQgZGlyZWN0b3JpZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCitkIGMgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIHRlbXBsYXRlcyBmb3IgdGhlIGMgdGVzdHMKK2QgZm9ydHJhbiAgICAgICAgICAgICAgICAgICBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgdGVtcGxhdGVzIGZvciB0aGUgRm9ydHJhbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RzCisgIE1ha2VmaWxlICAgICAgICAgICAgICAgICAgTWFrZWZpbGUgY29udGFpbmluZyBvcHRpb25zIGZvciBjb21waWxhdGlvbgorICBjb21tb25fdXRpbGl0eS5mCisgIG9tcF9teV9zbGVlcC5oICAgICAgICAgICAgdGhyZWFkIHNhdmUgc2xlZXAgZnVuY3Rpb24KKyAgb21wX3Rlc3RzdWl0ZS5mICAgICAgICAgICBGb3J0cmFuIGhlYWRlciBmaWxlCisgIG9tcF90ZXN0c3VpdGUuaCAgICAgICAgICAgYXV0b2dlbmVyYXRlZCBjLWhlYWRlciBmaWxlCisgIG9tcHRzLWMuY29uZiAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiBmaWxlIGZvciB0aGUgYyB0ZXN0cyBhYm91dCBob3cgb2Z0ZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgdGVzdHMgc2hhbGwgYmUgZXhlY3V0ZWQgb3IgaG93IGxhcmdlIHRoZSBsb29wIHNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcworICBvbXB0c19tYWtlSGVhZGVyLnBsCSAgICBwZXJsIG1vZHVsZSBmb3IgYXV0b21hdGljYWxseSBnZW5lcmF0aW9uIG9mIGFuIHVwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gZGF0ZSBoZWFkZXIgZmlsZQorICBvbXB0c19wYXJzZXJGdW5jdGlvbnMucG0JcGVybCBtb2R1bGUgY29udGFpbmluZyBnZW5lcmFsIGZ1bmN0aW9ucyBmb3IKKwkJCQkgICAgICAgICAgICB0aGUgcGFyc2VyLnBsIHNjcmlwdAorICBvbXB0c19wYXJzZXIucGwJICAgICAgICBzY3JpcHQgZm9yIGdlbmVyYXRpbmcgdGhlIHNvdXJjZSBjb2RlIG91dCBvZiB0aGUgdGVtcGxhdGVzCisgIG9tcHRzX3N0YW5kYWxvbmVQcm9jLmMJZnJhbWV3b3JrIGZvciB0aGUgYyB0ZXN0cworICBvbXB0c19zdGFuZGFsb25lUHJvYy5mCWZyYW1ld29yayBmb3IgdGhlIEZvcnRyYW4gdGVzdHMKKyAgUkVBRE1FCQkgICAgICAgICAgICB0aGUgUkVBRE1FIGZpbGUgeW91J3ZlIGFscmVhZHkgZm91bmQgOy0pCisgIExJQ0VOU0UgICAgICAgICAgICAgICAgICAgY29udGFpbnMgbGljZW5zZSBpbmZvcm1hdGlvbgorICBydW50ZXN0LnBsCQkgICAgICAgIHRoZSBmcmFtZSBwcm9ncmFtIG9mIHRoZSB0ZXN0IHN1aXRlCisgIHRlc3RsaXN0LWYudHh0CSAgICAgICAgdGVzdCBsaXN0IGNvbnRhaW5pbmcgdGhlIGF2YWlsYWJsZSB0ZXN0cyBmb3IgRm9ydHJhbgorICB0ZXN0bGlzdC1jLnR4dAkgICAgICAgIHRlc3QgbGlzdCBjb250YWluaW5nIHRoZSBhdmFpbGFibGUgdGVzdHMgZm9yIGMKKworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSUkuICBVU0FHRQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKworSUkuMS4gRmlyc3QgcnVuIHdpdGggbWFrZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCitZb3UgY2FuIGRvIGEgZmlyc3Qgc2ltcGxlIHJ1biBvZiB0aGUgdGVzdHN1aXRlIG9ubHkgYWZ0ZXIgb25lIHN0ZXAgb2YKK2NvbmZpZ3VyYXRpb246CisKKzEpIE1vZGlmeSB0aGUgb21wdHMuY29uZiBhbmQgb21wdHMtYy5jb25mIGZpbGUsIGNoYW5nZSB0aGUgbnVtYmVyIG9mIHRocmVhZHMKK2FuZCBudW1iZXIgb2YgcmVwZXRpdGlvbnMgb2YgZWFjaCB0ZXN0LgorCisyKSBNb2RpZnkgdGhlIE1ha2VmaWxlLCB1bmNvbW1lbnRpbmcgdGhlIENDL0ZDIGFuZCBDRkxBR1MvRkZMQUdTIHZhcmlhYmxlcyBmb3IKK3RoZSBjb21waWxlciBvZiB5b3VyIGNob2ljZS4KKworQW5kIG5vdyB5b3UgY2FuIHJ1biB0aGUgdGVzdHN1aXRlIGVpdGhlciBmb3IgYSBDIGNvbXBpbGVyIHdpdGg6CisKKz4JbWFrZSBjdGVzdAorCitvciBmb3IgYSBGb3J0cmFuIGNvbXBpbGVyIHdpdGg6CisKKz4JbWFrZSBmdGVzdAorCisKK0lJLjIuIFJ1bm5pbmcgY3VzdG9tIHRlc3RzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK0luIG9yZGVyIHRvIHJ1biBzaW5nbGUgdGVzdHMgb3IgY3VzdG9tIGdyb3VwcyBvZiB0ZXN0cywgdHdvIG1ha2UgY29tbW1hbmRzCithcmUgZGVmaW5lZDogbWFrZSBzdGVzdCBhbmQgbWFrZSBmc3Rlc3QuIFRoZXNlIHR3byBjb21tYW5kIHJlZmVyZW5jZSB0aGUgZmlsZQorY3VzdG9tdGVzdC50eHQgd2hlbiBsb29raW5nIGZvciBhIHRlc3RsaXN0IHRvIHVzZS4gU2ltcGx5IGVkaXQgY3VzdG9tdGVzdC50eHQKK3RvIGluY2x1ZGUgdGhlIGRlc2lyZWQgdGVzdCBvciB0ZXN0cy4gSWYgY3VzdG9tdGVzdC50eHQgY29udGFpbnMgYyB0ZXN0cywKKworPiAgICAgIG1ha2Ugc3Rlc3QKKworb3IgZm9yIGZvcnRyYW4gdGVzdHMKKworPiAgICAgIG1ha2UgZnN0ZXN0CisKK0luIG9yZGVyIHRvIGNoYW5nZSB0aGUgbnVtYmVyIG9mIHRocmVhZHMgdXNlZCBpbiB0aGUgdGVzdHMsIHNpbXBseSBlZGl0IHRoZQorTWFrZWZpbGUgdmFyaWFibGVzIE1JTlRIUkVBRFMgYW5kIE1BWFRIUkVBRFMuIEJ5IGRlZmF1bHQsIHRoZXkgYXJlIGNvbmZpZ3VyZWQKK3RvIHVzZSAyIHRocmVhZHMuIFRvIGNoYW5nZSB0aGUgbnVtYmVyIG9mIHRpbWVzIGVhY2ggdGVzdCBpcyBydW4sIGZvciBjIHRlc3RzCitlZGl0IHRoZSBSRVBFVElUSU9OUyB2YXJpYWJsZSBpbiB0aGUgZmlsZSBvbXB0cy1jLmNvbmYuIFRoZSBMT09QQ09VTlQgYW5kCitTTEVFUFRJTUUgdmFyaWFibGVzIGNhbiBhbHNvIGJlIGNoYW5nZWQgaGVyZS4gRm9yIGZvcnRyYW4gdGVzdHMsIGVkaXQgdGhlIGZpbGUKK29tcF90ZXN0c3VpdGUuZiB0byBjaGFuZ2UgYm90aCB0aGUgTE9PUENPVU5UIGFuZCB0aGUgbnVtYmVyIG9mIHRpbWVzIGVhY2ggdGVzdAoraXMgcnVuLgorCisKKworSUkuMy4gVW5kZXJzdGFuZGluZyB0aGUgcmVzdWx0cworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworV2hlbiBydW5uaW5nIHRoZSB0ZXN0c3VpdGUgdGhlIHJlc3VsdHMgd2lsbCBiZSBzaG93biBvbiB0aGUgc2NyZWVuLgorCitJZiB5b3UgbmVlZCB0aGUgcmVzdWx0cyBmb3IgZnVydGhlciBwdXJwb3NlIHlvdSBjYW4gdXNlIHRoZSByZXN1bHRzLnR4dCwgd2hpY2gKK2lzIGEgc2ltcGxlIGxpc3QgY29udGFpbmluZyB0aGUgcmVzdWx0cyBmb3IgZWFjaCBkaXJlY3RpdmUKK2luIGEgc2luZ2xlIGxpbmUuIEVhY2ggbGluZSBzdGFydHMgd2l0aCB0aGUgbmFtZSBvZiB0aGUgZGlyZWN0aXZlLiBUaGVuIGZvbGxvd3MKK3RoZSByZXN1bHQgb2YgdGhlIHRlc3QgZ2l2ZW4gaW4gdGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIHBhc3NlZCB0ZXN0cy4gSWYgMTAwJSBvZgordGhlIHRlc3RzIHBhc3NlZCBzdWNjZXNzZnVsbHksIHRoZSBzZWNvbmQgbnVtYmVyIGdpdmVzIHRoZSByZXN1bHQgb2YgdGhlCitjb3JyZXNwb25kaW5nIGNyb3NzdGVzdC4gQ3Jvc3N0ZXN0cyB3aWxsIG9ubHkgYmUgcnVuIGlmIHRoZSBub3JtYWwgdGVzdCBwYXNzZXMKK3dpdGggMTAwJSBhY2N1cmFjeS4gSWYgYSBjcm9zc3Rlc3Qgd2FzIG5vdCBydW4gb3IgYSB0ZXN0IGRvZXMgbm90IGV4aXN0LCBpdCBpcworZGVub3RhdGVkIGJ5IGEgIi0iLgorQWZ0ZXIgdGhlIHJlc3VsdHMgb2YgdGhlIG5vcm1hbCB0ZXN0cywgdGhlcmUgZm9sbG93IGEgc2VyaWVzIG9mIHRlc3RzIGluIHRoZQorb3JwaGFuZWQgbW9kZS4gSWYgdGhlcmUgd2VyZSBubyBvcnBoYW5lZCB0ZXN0cyBhdmFpbGFibGUgdGhpcyBpcyBzaG93biBieSBhICItIi4KKworSWYgeW91IHJ1biB0aGUgdGVzdHN1aXRlIHdpdGggZGlmZmVyZW50IG51bWJlcnMgb2YgdGhyZWFkcyAoZS5nLiB1c2luZyB0aGUKK3J1bnRlc3QucGwgc2NyaXB0KSB0aGUgcmVzdWx0cyBhcmUgc2hvd24gaW4gYmxvY2tzIG9mIDQgY29sdW1ucyBmb3IgZWFjaCBudW1iZXIKK29mIHRocmVhZHMuCisKK0lmIGEgdGVzdCBmYWlscyB5b3UgY2FuIGZpbmQgbW9yZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBpbiB0aGUgb21wdHMubG9nLAorYmluL2MvKi5vdXQgYW5kICoubG9nIGZpbGVzLiBXaGlsZSB0aGUgb21wdHMubG9nIGZpbGUgY29udGFpbnMgYWxsIGNvbXBpbGVyCitlcnJvciBtZXNzYWdlcyBmb3IgYWxsIHRlc3RzLCB0aGUgKi5vdXQgYW5kICoubG9nIGZpbGVzIGNvbnRhaW4gZGV0YWlsZWQgaW5mb3JhbXRpb24KK29uIHRoZSBleGVjdXRpb24gcHJvY2VzcyBvZiB0aGUgc2luZ2xlIHRlc3RzLgorSW4gdGhlICoub3V0IGZpbGVzIHRoZXJlIGFyZSBsaXN0ZWQgYWxsIHRoZSByZXN1bHRzIG9mIHRoZSBzaW5nbGUgZXhlY3V0aW9ucyBvZgordGhlIHRlc3RzLiBJbiB0aGUgKi5sb2cgZmlsZXMgdGhlcmUgYXJlIGVycm9yIG1lc3NhZ2VzIG9mIHRoZSB0ZXN0cyBpdHNlbGYuCisKKworSUkuNC4gQ2xlYW5pbmcgVXAKKy0tLS0tLS0tLS0tLS0tLS0tCisKKworQmVjYXVzZSBtYW55IGZpbGVzIGFyZSBnZW5lcmF0ZWQgZm9yIGVhY2ggdGVzdGVkIGRpcmVjdGl2ZSwgaXQgaXMgb2Z0ZW4gbmVjZXNzYXJ5Cit0byBjbGVhbiB0aGUgbWFpbiBkaXJlY3RvcnkgYWZ0ZXIgYSBiYXR0ZXJ5IG9mIHRlc3RzLiBUbyBjbGVhbiBhbGwgZ2VuZXJhdGVkIGZpbGVzCitpbiB0aGUgbWFpbiBkaXJlY3RvcnkgaW5jbHVkaW5nIHRoZSByZXN1bHRzIGFuZCBsb2cgZmlsZXMsCisKKz4gICAgIG1ha2UgY2xlYW4KKworCitUbyBjbGVhbiBvbmx5IHRoZSBsb2dzIGFuZCBvdXQgZmlsZXMsCisKKz4gICAgIG1ha2UgY2xlYW5sb2dzCisKK1RvIGNsZWFuIG9ubHkgdGhlIHJlc3VsdHMsCisKKz4gICAgIG1ha2UgY2xlYW5yZXN1bHRzCisKKworCitJSS40LiBVc2luZyB0aGUgcnVudGVzdCBzY3JpcHQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCitTbyBmb3Igc3BlY2lhbCBwdXJwb3NlIHlvdSBjYW4gdXNlIHRoZSBydW50ZXN0LnBsIHNjcmlwdCwgd2hpY2ggYWxsb3dzIGEgbG90Cittb3JlIG9wdGlvbnMgZm9yIHRoZSBleGVjdXRpb24gcHJvY2VzcyB0aGFuIHRoZSBleGVjdXRpb24gd2l0aCBtYWtlLgorCitVc2luZyB0aGUgcnVudGVzdC5wbCBzY3JpcHQgaXMgcmF0aGVyIGVhc3kuIFlvdSBjYW4gdXNlIHRoZSB0aGUgdGVzdCBzdWl0ZSBvbmx5CithZnRlciB0d28gc3RlcHMgb2YgbW9kaWZpY2F0aW9uczoKKworMS4pIE1vZGlmeSB0aGUgTWFrZWZpbGUgdG8geW91ciB3aXNoZXMgY2hvb3NpbmcgeW91ciBjb21waWxlciBhbmQgdGhlIG5lY2Vzc2FyeQorICAgIGNvbXBpbGVyIGZsYWdzLgorMi4pIElmIG5lY2Vzc2FyeSBlZGl0IG9uZSBvZiB0aGUgdGVzdCBsaXN0cyAodGVzdGxpc3QtYy50eHQpIGFuZCBjb21tZW50IG91dCB0aGUKKyAgICB0ZXN0cyB5b3UgZG8gbm90IHdhbnQgdG8gcnVuIHVzaW5nICMgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUuIFRlc3RsaXN0cyBmb3IgRm9ydHJhbiBlbmQKKyAgICB3aXRoIC1mLnR4dCB3aGlsZSB0ZXN0IGxpc3RzIGZvciBjIHdpdGggLWMudHh0LgorCitBbmQgbm93IHlvdSBjYW4gcnVuIHRoZSB0ZXN0IHN1aXRlIGVpdGhlciBmb3IgRm9ydHJhbiB1c2luZworCSMJPiAgLi9ydW50ZXN0LnBsIC1sYW5nPWZvcnRyYW4gLWQ9Zm9ydHJhbiB0ZXN0bGlzdC1mLnR4dAorb3IgZm9yIGMKKwkjCT4gIC4vcnVudGVzdC5wbCAtbGFuZz1jIC1kPWMgdGVzdGxpc3QtYy50eHQKKworV2l0aCB0aGUgLS1oZWxwIG9wdGlvbiB5b3UgY2FuIHNob3cgdGhlIGNvbXBsZXRlIGxpc3Qgb2Ygb3B0aW9ucyBhbmQgdGhlaXIKK2V4cGxhbmF0aW9ucy4KKworVGhlIHRlc3QgcmVzdWx0cyBhcmUgc3VtbWFyaXplZCBpbiBjcmVzdWx0cyBvciBmcmVzdWx0cy50eHQgd2hpbGUgKi5sb2cga2VlcAorZGV0YWlscyBmb3IgaW5kaXZpZHVhbCB0ZXN0cy4gVGhlcmUgaXMgYWxzbyBhIGZpbGUgKG9tcHRzLmxvZykga2VlcGluZworY29tcGlsYXRpb24gaW5mb3JtYXRpb24uIChzZWUgc2VjdGlvbiBJSS4yICkKKworSWYgeW91IGRvbid0IHdhbnQgdG8gdGVzdCB0aGUgZGlyZWN0aXZlcyBpbiBvcnBoYW5lZCBtb2RlIHlvdSBjYW4gdXNlIHRoZQorLW5vcnBoYW4gb3B0aW9uLiBZb3UgYWxzbyBjYW4gdXNlIHRoZSBydW50ZXN0LnBsIHNjcmlwdCBlaXRoZXIgdG8gY29tcGlsZSBhbGwKK3Rlc3RzIG9yIHJ1biBjb21waWxlZCB0ZXN0cyBlLmcuIGZvciBjcm9zcyBjb21waWxhdGlvbiBvbiBvdGhlciBwbGF0Zm9ybXMuIEZvcgordGhpcyB0aGVyZSBhcmUgdGhlIG9wdGlvbnMgLW5vcnVuIGFuZCAtbm9jb21waWxlLgorCitIYXBweSB0ZXN0aW5nIQorCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJSUkuCUhvdyB0byBhZGQgbmV3IHRlc3RzIC8gVGhlIHN0cnVjdHVyZSBvZiB0ZXN0IHRlbXBsYXRlcworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0lJSS4xICBUaGUgdGVtcGxhdGUgc3RydWN0dXJlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIHRlc3Qgc3VpdGUgaXMgYmFzZWQgb24gdGVtcGxhdGVzIHNvIHRoYXQgeW91IG9ubHkgaGF2ZSBvbmUgZmlsZSBmb3IgdGVzdCwKK2Nyb3NzdGVzdCBhbmQgdGhlIG9ycGhhbmVkIHZlcnNpb25zIG9mIHRoZW0uCisKKwlBKSBEZXNjcmlwdGlvbiBvZiB0aGUgdGVtcGxhdGUgc3RydWN0dXJlCisKK1RoZSBzeW50YXggb2YgdGhlIHRlbXBsYXRlcyBpcyBtdWNoIGxpa2UgeG1sLiBTbyBlYWNoIHRlc3QgYmVnaW5zIHdpdGgKKyc8b21wdHM6dGVzdD4nIGFuZCBlbmRzIHdpdGggJzwvb21wdHM6dGVzdD4nLgorCitJbiBiZXR3ZWVuIHRoZXJlIGFyZSBzZXZlcmFsIG90aGVyIGJsb2NrcyBob2xkaW5nIGluZm9ybWF0aW9uOgorCistIDxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+IDwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPiBJbiBiZXR3ZWVuIHRoaXMgdGFnIHlvdSBjYW4KKyAgZ2l2ZSBhIGRlc2NyaXB0aW9uIG9uIHdoYXQgdGhlIHRlc3QgY2hlY2tzIGFuZCBob3cgaXQgd29ya3MuCisKKy0gPG9tcHRzOm9tcHZlcnNpb24+IDwvb21wdHM6dmVyc2lvbj4gVGhpcyB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZQorICBPcGVuTVAtdmVyc2lvbiB3aGljaCBpbmNsdWRlcyB0aGUgdGVzdGVkIGRpcmVjdGl2ZS4KKworLSA8b21wdHM6ZGlyZWN0aXZlPiA8L29tcHRzOmRpcmVjdGl2ZT4gVXNlZCB0byBzcGVjaWZ5IHRoZSBkaXJlY3RpdmUgaG93IGl0IGlzCisgIGNhbGxlZCBpbiB0aGUgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UuCisKKy0gPG9tcHRzOmRlcGVuZGVuY2VzPiA8L29tcHRzOmRlcGVuZGVuY2VzPiBXaXRoIHRoaXMgdGFnIHlvdSBjYW4gc3BlY2lmeSBvdGhlcgorICBvbXAgZGlyZWN0aXZlcyB3aGljaCBhcmUgbmVjZXNzYXJ5IGZvciB0aGUgY29ycmVjdCBleGVjdXRpb24gb2YgeW91ciB0ZXN0LgorVGhlIGRpcmVjdGl2ZXMgaGF2ZSB0byBiZSBsaXN0ZWQgYnkgdGhlaXIgZGlyZWN0aXZlIG5hbWVzIGFzIGl0IGlzIGNhbGxlZCBpbgordGhlIHByb2dyYW1taW5nIGxhbmd1YWdlLiBNdWx0aXBsZSBkaXJlY3RpdmVzIGFyZSBzZXBhcmF0ZWQgYnkgJywnLgorCistIDxvbXB0czp0ZXN0Y29kZT4gPC9vbXB0czp0ZXN0Y29kZT4gSW4gdGhpcyB0YWcgc3RhbmRzIHRoZSB3aG9sZSBzb3VyY2UgY29kZQorZm9yIHRoZSB0ZXN0IC8gY3Jvc3N0ZXN0LiAgRWFjaCB0ZXN0IGhhcyB0byBiZSB3cml0dGVuIGFzIGEgZnVuY3Rpb24uIFRoZQorc3ludGF4IG9mIHRoZSBmdW5jdGlvbnMgZGlmZmVycyBiZXR3ZWVuIEMgYW5kIEZvcnRyYW46IEluIEMgaXQgaGFzIHRvIHRha2UgYQorZmlsZSBwb2ludGVyICdGSUxFICogbG9nRmlsZScgYW5kIHJldHVybiBhbiBpbnQuIElmIHRoZSB0ZXN0IGhhcyBiZWVuIHBhc3NlZAorc3VjY2Vzc2Z1bCBpdCBoYXMgdG8gcmV0dXJuIGEgdmFsdWUgdW5lcXVhbCB0byAwLiBUaGUgZmlsZSBwb2ludGVyIGNhbiBiZSB1c2VkCit0byB3cml0ZSBpbmZvcm1hdGlvbiBpbnRvIGEgbG9nIGZpbGUuICBJbiBGb3J0cmFuIHRoZSBmdW5jdGlvbiB0YWtlcyBubworYXJndW1lbnQgYW5kIHRoZSBmdW5jdGlvbiBuYW1lIG11c3Qgbm90IGV4Y2VlZCBYWCBjaGFyYWN0ZXJzLiAgVGhlIHJldHVybiB2YWx1ZQoraGFzIHRvIGJlIHNwZWNpZmllZCB1c2luZyB0aGUgJzx0ZXN0ZnVuY3Rpb25uYW1lPicgdGFncy4gSXQgaGFzIHRvIGJlIDEgaWYgdGhlCit0ZXN0IHN1Y2NlZWRlZCBhbmQgMCBpZiB0aGUgdGVzdCBmYWlsZWQuIEZvciBkZXRhaWxzIHNlZSB0aGUgZXhhbXBsZS4KKworVG8gdGVsbCB0aGUgdGVzdCBzdWl0ZSB0aGUgbmFtZSBvZiB5b3VyIHRlc3QgZnVuY3Rpb24geW91IGhhdmUgdG8gZW5jbG9zZSBpdAoraW50byB0aGUgJzxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+IDwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPicgdGFnLgorCitJZiB0aGVyZSBhcmUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0ZXN0IGFuZCBjcm9zc3Rlc3QgeW91IGNhbiB1c2UgdGhlCis8b21wdHM6Y2hlY2s+IDwvb21wdHM6Y2hlY2s+IGFuZCA8b21wdHM6Y3Jvc3NjaGVjaz4gPC9vbXB0czpjcm9zc2NoZWNrPiB0YWcuCitXaGVuIGdlbmVyYXRpbmcgdGhlIHRlc3QgdGhlIHBhcnNlciB3aWxsIHVzZSB0aGUgY29kZSBlbmNsb3NlZCBpbgorPG9tcHRzOmNoZWNrPiB0YWdzIGFuZCBjdXQgb3V0IHRoZSBjb2RlIHdyaXR0ZW4gaW4gPG9tcHRzOmNyb3NzY2hlY2s+IHRhZ3MuIFNvCit5b3UgaGF2ZSB0d28gcG9zc2liaWxpdGllcyB0byB3cml0ZSB5b3VyIHRlbXBsYXRlIGZvciB0ZXN0IGFuZCBjcm9zc3Rlc3Q6IFRoZQorZmlyc3Qgd2F5IHlvdSBjYW4gd3JpdGUgdGhlIGNvbXBsZXRlIGNvZGUgaXMgdG8gd3JpdGUgdGhlIHRlc3QgaW4gb25lCis8b21wdHM6Y2hlY2s+IHRhZyBhbmQgbGF0ZXIgdGhlIGNyb3NzdGVzdCBpbiBvbmUgPG9tcHRzOmNyb3NzY2hlY2s+IHRhZy4gIFRoZQorc2Vjb25kIHdheSBpcyB0byB3cml0ZSBib3RoIHRlc3RzIG9ubHkgYnkgZW5jbG9zaW5nIGRpZmZlcmluZyBwYXJ0cyBpbgorY29ycmVzcG9uZGluZyB0YWdzLgorCitUaGUgZmlyc3QgbWV0aG9kIHNob3VsZCBiZSBwcmVmZXJyZWQgaWYgdGVzdCBhbmQgY3Jvc3N0ZXN0IGRpZmZlciBtdWNoIGZyb20KK2VhY2ggb3RoZXIuIFRoZSBzZWNvbmQgZS5nLiBpZiB5b3Ugb25seSB3YW50IHRvIGNoYW5nZSBhIGZldyBvcHRpb25zIGxpa2UKK3JlcGxhY2luZyBhbiBvbXAgc2luZ2xlcHJpdmF0ZSBjbGF1c2UgYnkgYW4gb21wIHByaXZhdGUgY2xhdXNlIG9yIHRvIGN1dCBvdXQKK2EgZGlyZWN0aXZlIGxpa2Ugb21wIGZsdXNoLiAgV2hlbiB5b3UgdXNlIHRoZSBmaXJzdCB3YXkgeW91IGhhdmUgdG8gdGFrZSBjYXJlCitvZiB0aGUgZnVuY3Rpb24gbmFtZSEgWW91IGhhdmUgdG8gZGVjbGFyZSBpdCB0d2ljZSB3aXRoCis8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPiEKKworLSA8b21wdHM6b3JwaGFuPiA8L29tcHRzOm9ycGhhbj4gVGhpcyB0YWcgY2FuIGJlIHVzZWQgaWYgeW91IHdhbnQgdG8gZW5hYmxlCisgIHlvdXIgdGVzdCB0byBjaGVjayB0aGUgZGlyZWN0aXZlIGluIG9ycGhhbiByZWdpb25zLCB0b28uICBUaGUgY29kZSBlbmNsb3NlZAoraW4gdGhpcyBwYXJ0IHdpbGwgYmUgd3JpdHRlbiB0byBhIHNlcGFyYXRlIGZ1bmN0aW9uIHdoaWNoIHdpbGwgYmUgY2FsbGVkCitpbnN0ZWFkLiAgSWYgeW91IGhhdmUgdmFyaWFibGVzIHdoaWNoIGFyZSB1c2VkIG91dHNpZGUgdGhpcyByZWdpb24geW91IGhhdmUgdG8KK2RlY2xhcmUgdGhlbSBhcyBnbG9iYWwgdmFyaWFibGVzIGVuY2xvc2VkIGluIGFuIDxvbXB0czpvcnBoYW46dmFycz4gdGFnLiBGb3IKK2Z1cnRoZXIgaW5mb3JtYXRpb24gc2VlIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgPG9tcHRzOm9ycGhhbjp2YXJzPiB0YWcuCisKKy0gPG9tcHRzOm9ycGhhbjp2YXJzPiA8L29tcHRzOm9ycGhhbjp2YXJzPiBUaGlzIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgZ2xvYmFsCisgIHZhcmlhYmxlcyBmb3IgYW4gb3JwaGFuIHJlZ2lvbiB3aGljaCBhbGxvdyB0aGUgZXhjaGFuZ2Ugb2YgdmFsdWVzIGJldHdlZW4KK3RoZSBtYWluIHByb2dyYW0gYW5kIHRoZSBvcnBoYW5lZCBmdW5jdGlvbnMuIFRoZSB1c2FnZSBkaWZmZXJzIGJldHdlZW4gQyBhbmQKK0ZvcnRyYW4uICBJbiBDIHlvdSBoYXZlIHRvIHVzZSBhIHNpbmdsZSBkZWNsYXJhdGlvbiBmb3IgZWFjaCB2YXJpYWJsZS4gWW91IGNhbgorZWl0aGVyIGRlY2xhcmUgYWxsIHZhcmlhYmxlcyBpbiBvbmUgc2luZ2xlIG9yIGluIHNldmVyYWwgZGlmZmVyZW50IHJlZ2lvbnMuIFlvdQorbXVzdCBub3QgaW5pdGlhbGl6ZSB0aGUgdmFyaWFibGVzIGluc2lkZSEgIEluIEZvcnRyYW4geW91IGhhdmUgdG8gcHV0IGFsbAorZGVjbGFyYXRpb25zIGluIG9uZSBzaW5nbGUgdGFnLiBCZWNhdXNlIHRoZXJlIGV4aXN0IG5vIGdsb2JhbCB2YXJpYWJsZXMgYXMgaW4KK0MgeW91IGhhdmUgdG8gdXNlIGNvbW1vbiBibG9ja3MuIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHNlZSB0aGUgZXhhbXBsZXMuCisKK0lJSS4yLiAgQWRkaW5nIHRlc3RzIHRvIHRoZSB0ZXN0IGxpc3RzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBZnRlciB5b3UgaGF2ZSBjcmVhdGVkIGEgbmV3IHRlc3QgeW91IGhhdmUgdG8gYWRkIHRoZW0gdG8gYSB0ZXN0bGlzdC4gU2ltcGx5CithZGQgdGhlIGZ1bmN0aW9uIG5hbWUgaW4gYSBuZXcgTGluZSBpbnRvIGEgZmlsZS4KKworCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK0lWLiAgIEtub3duIElzc3VlcyBhbmQgV29ya2Fyb3VuZAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZSBTdW4gT1MgaGFzIGEgcHJvYmxlbSB3aXRoIHRoZSAtbWF4ZGVwdGggb3B0aW9uIG9uIHRoZSAnbWFrZSBjbGVhbmFsbCcKK2NvbW1hbmQuIFRoaXMgcHJldmVudHMgdGhlIHRlc3RzIGZyb20gYmVpbmcgcmVtb3ZlZCBmcm9tIHRoZSB3b3JraW5nIGRpcmVjdG9yeQorYW5kIGNhbiBjYXVzZSBwcm9ibGVtcyB3aXRoIGZ1dHVyZSB0ZXN0cy4gVG8gcmVtZWR5LCBlZGl0IHRoZSBtYWtlZmlsZSBsaW5lCit1bmRlciB0aGUgY2xlYW4gY29tbWFuZDoKKworICAgICAtcm0gW2NmXXRlc3QqLltjZl0gW2NmXWNyb3NzdGVzdCouW2NmXSBbY2ZdY3Rlc3QqLltjZl0gW2NmXW9ycGhhbiouW2NmXQorCitDaGFuZ2UgdG86CisKKyAgICAgLXJtIFtjZl10ZXN0KiBbY2ZdY3Jvc3N0ZXN0KiBbY2ZdY3Rlc3QqIFtjZl1vcnBoYW4qCisKKworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVi4gICBDb250YWN0IGFuZCBTdXBwb3J0Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworQ29udGFjdDogaHR0cDovL3d3dy5jcy51aC5lZHUvfmhwY3Rvb2xzCmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9oYXNfb3Blbm1wLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9oYXNfb3Blbm1wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTgzYTk3MwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL2hhc19vcGVubXAuYwpAQCAtMCwwICsxLDMwIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIE9wZW5NcCBzdXBwb3J0Ljwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5fT1BFTk1QPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+aGFzX29wZW5tcDwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSl7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgIGludCBydmFsdWUgPSAwOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICA8b21wdHM6b3JwaGFuPgorICAgIDxvbXB0czpjaGVjaz4KKyNpZmRlZiBfT1BFTk1QCisJcnZhbHVlID0gMTsKKyNlbmRpZgorICAgIDwvb21wdHM6Y2hlY2s+CisgICAgPG9tcHRzOmNyb3NzY2hlY2s+CisjaWYgMAorCXJ2YWx1ZSA9IDE7CisjZW5kaWYKKyAgICA8L29tcHRzOmNyb3NzY2hlY2s+CisgICAgICA8L29tcHRzOm9ycGhhbj4KKwlyZXR1cm4gKHJ2YWx1ZSk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2F0b21pYy5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2F0b21pYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjMmQxYWEKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfYXRvbWljLmMKQEAgLTAsMCArMSw0MzQgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIGF0b21pYyBkaXJlY3RpdmUgYnkgY291bnRpbmcgdXAgYSB2YXJpYWJsZSBpbiBhIHBhcmFsbGVsaXplZCBsb29wIHdpdGggYW4gYXRvbWljIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIGF0b21pYzwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorI2luY2x1ZGUgIm9tcF9teV9zbGVlcC5oIgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfYXRvbWljPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+IChGSUxFICogbG9nRmlsZSkKK3sKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisJaW50IHN1bTsKKyAgICAgICAgaW50IGRpZmY7CisgICAgICAgIGRvdWJsZSBkc3VtID0gMDsKKyAgICAgICAgZG91YmxlIGR0ID0gMC41OwkvKiBiYXNlIG9mIGdlb21ldHJpYyByb3cgZm9yICsgYW5kIC0gdGVzdCovCisgICAgICAgIGRvdWJsZSBkZGlmZjsKKyAgICAgICAgaW50IHByb2R1Y3Q7CisgICAgICAgIGludCB4OworICAgICAgICBpbnQgKmxvZ2ljczsKKyAgICAgICAgaW50IGJpdF9hbmQgPSAxOworICAgICAgICBpbnQgYml0X29yID0gMDsKKyAgICAgICAgaW50IGV4Y2x1c2l2X2JpdF9vciA9IDA7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKworI2RlZmluZSBET1VCTEVfRElHSVRTIDIwCS8qIGR0XkRPVUJMRV9ESUdJVFMgKi8KKyNkZWZpbmUgTUFYX0ZBQ1RPUiAxMAorI2RlZmluZSBLTk9XTl9QUk9EVUNUIDM2Mjg4MDAJLyogMTAhICovCisgICAgaW50IGo7CisgICAgaW50IGtub3duX3N1bTsKKyAgICBpbnQga25vd25fZGlmZjsKKyAgICBpbnQga25vd25fcHJvZHVjdDsKKyAgICBpbnQgcmVzdWx0ID0gMDsKKyAgICBpbnQgbG9naWNfYW5kID0gMTsKKyAgICBpbnQgbG9naWNfb3IgPSAwOworICAgIGRvdWJsZSBka25vd25fc3VtOworICAgIGRvdWJsZSByb3VuZGluZ19lcnJvciA9IDEuRS05OworICAgIGRvdWJsZSBkcHQsIGRpdjsKKyAgICBpbnQgbG9naWNzQXJyYXlbTE9PUENPVU5UXTsKKyAgICBsb2dpY3MgPSBsb2dpY3NBcnJheTsKKyAgICAKKyAgICBzdW0gPSAwOworICAgIGRpZmYgPSAwOworICAgIHByb2R1Y3QgPSAxOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKwk8b21wdHM6b3JwaGFuPgorCSAgICBpbnQgaTsKKyNwcmFnbWEgb21wIGZvcgorCSAgICBmb3IgKGkgPSAxOyBpIDw9IExPT1BDT1VOVDsgaSsrKQorCSAgICB7CisJCTxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBhdG9taWM8L29tcHRzOmNoZWNrPgorCQlzdW0gKz0gaTsKKwkgICAgfQorCTwvb21wdHM6b3JwaGFuPgorICAgIH0KKyAgICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDI7CisgICAgaWYgKGtub3duX3N1bSAhPSBzdW0pCisgICAgeworICAgICAgICBmcHJpbnRmIChsb2dGaWxlLCAKKyAgICAgICAgICAgICAgICAgIkVycm9yIGluIHN1bSB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICVkIGluc3RlYWQgb2YgJWQuXG4iLCAKKyAgICAgICAgICAgICAgICAgc3VtLCBrbm93bl9zdW0pOworICAgICAgICByZXN1bHQrKzsKKyAgICB9CisgICAgCisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKyAgICAgICAgPG9tcHRzOm9ycGhhbj4gICAKKyAgICAgICAgICAgIGludCBpOworI3ByYWdtYSBvbXAgZm9yCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBhdG9taWM8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICAgICBkaWZmIC09IGk7CisgICAgICAgICAgICB9CisgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgIH0KKyAgICBrbm93bl9kaWZmID0gKChMT09QQ09VTlQgLSAxKSAqIExPT1BDT1VOVCkgLyAyICogLTE7CisgICAgaWYgKGRpZmYgIT0ga25vd25fZGlmZikKKyAgICB7CisgICAgICAgIGZwcmludGYgKGxvZ0ZpbGUsCisgICAgICAgICAgICAgICJFcnJvciBpbiBkaWZmZXJlbmNlIHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQgaW5zdGVhZCBvZiAwLlxuIiwKKyAgICAgICAgICAgICAgIGRpZmYpOworICAgICAgICByZXN1bHQrKzsKKyAgICB9CisKKyAgICAvKiBUZXN0cyBmb3IgZG91YmxlcyAqLworICAgIGRzdW0gPSAwOworICAgIGRwdCA9IDE7CisKKyAgICBmb3IgKGogPSAwOyBqIDwgRE9VQkxFX0RJR0lUUzsgKytqKQorICAgICAgeworICAgICAgICBkcHQgKj0gZHQ7CisgICAgICB9CisgICAgZGtub3duX3N1bSA9ICgxIC0gZHB0KSAvICgxIC1kdCk7CisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKyAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgICAgIGludCBpOworI3ByYWdtYSBvbXAgZm9yCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgRE9VQkxFX0RJR0lUUzsgKytpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBhdG9taWM8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICAgIGRzdW0gKz0gcG93IChkdCwgaSk7CisgICAgICAgICAgICB9CisgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgIH0KKworICAgIGlmIChkc3VtICE9IGRrbm93bl9zdW0gJiYgKGZhYnMgKGRzdW0gLSBka25vd25fc3VtKSA+IHJvdW5kaW5nX2Vycm9yKSkKKyAgICB7CisgICAgICAgIGZwcmludGYgKGxvZ0ZpbGUsCisgICAgICAgICAgICAgICAgICJFcnJvciBpbiBzdW0gd2l0aCBkb3VibGVzOiBSZXN1bHQgd2FzICVmIGluc3RlYWQgb2Y6ICVmIChEaWZmZXJlbmNlOiAlRSlcbiIsCisgICAgICAgICAgICAgICAgIGRzdW0sIGRrbm93bl9zdW0sIGRzdW0gLSBka25vd25fc3VtKTsKKyAgICAgICAgcmVzdWx0Kys7CisgICAgfQorCisgICAgZHB0ID0gMTsKKworICAgIGZvciAoaiA9IDA7IGogPCBET1VCTEVfRElHSVRTOyArK2opCisgICAgeworICAgICAgICBkcHQgKj0gZHQ7CisgICAgfQorICAgIGRkaWZmID0gKDEgLSBkcHQpIC8gKDEgLSBkdCk7CisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgeworICAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgICAgIGludCBpOworI3ByYWdtYSBvbXAgZm9yCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgRE9VQkxFX0RJR0lUUzsgKytpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBhdG9taWM8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICAgIGRkaWZmIC09IHBvdyAoZHQsIGkpOworICAgICAgICAgICAgfQorICAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgfSAKKyAgICBpZiAoZmFicyAoZGRpZmYpID4gcm91bmRpbmdfZXJyb3IpCisgICAgeworICAgICAgICBmcHJpbnRmIChsb2dGaWxlLAorICAgICAgICAgICAgICAgICAiRXJyb3IgaW4gZGlmZmVyZW5jZSB3aXRoIGRvdWJsZXM6IFJlc3VsdCB3YXMgJUUgaW5zdGVhZCBvZiAwLjBcbiIsCisgICAgICAgICAgICAgICAgIGRkaWZmKTsKKyAgICAgICAgcmVzdWx0Kys7CisgICAgfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKyAgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgICAgICBpbnQgaTsKKyNwcmFnbWEgb21wIGZvcgorICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8PSBNQVhfRkFDVE9SOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIGF0b21pYzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgcHJvZHVjdCAqPSBpOworICAgICAgICAgICAgfQorICAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgfQorICAgIAorICAgIGtub3duX3Byb2R1Y3QgPSBLTk9XTl9QUk9EVUNUOworICAgIGlmIChrbm93bl9wcm9kdWN0ICE9IHByb2R1Y3QpCisgICAgeworICAgICAgICBmcHJpbnRmIChsb2dGaWxlLAorICAgICAgICAgICAgICAgICAiRXJyb3IgaW4gcHJvZHVjdCB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICVkIGluc3RlYWQgb2YgJWRcbiIsCisgICAgICAgICAgICAgICAgIHByb2R1Y3QsIGtub3duX3Byb2R1Y3QpOworICAgICAgICByZXN1bHQrKzsKKyAgICB9CisKKyAgICBwcm9kdWN0ID0gS05PV05fUFJPRFVDVDsKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICAgICBpbnQgaTsKKyNwcmFnbWEgb21wIGZvcgorICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8PSBNQVhfRkFDVE9SOyArK2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIGF0b21pYzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgcHJvZHVjdCAvPSBpOworICAgICAgICAgICAgfQorICAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgfQorCisgICAgaWYgKHByb2R1Y3QgIT0gMSkKKyAgICB7CisgICAgICAgIGZwcmludGYgKGxvZ0ZpbGUsCisgICAgICAgICAgICAgICAgICJFcnJvciBpbiBwcm9kdWN0IGRpdmlzaW9uIHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQgaW5zdGVhZCBvZiAxXG4iLAorICAgICAgICAgICAgICAgICBwcm9kdWN0KTsKKyAgICAgICAgcmVzdWx0Kys7CisgICAgfQorICAgIAorICAgIGRpdiA9IDUuMEUrNTsKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworICAgICAgICAgICAgaW50IGk7CisjcHJhZ21hIG9tcCBmb3IKKyAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPD0gTUFYX0ZBQ1RPUjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBhdG9taWM8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICAgIGRpdiAvPSBpOworICAgICAgICAgICAgfQorICAgIH0KKworICAgIGlmIChmYWJzKGRpdi0wLjEzNzc4NykgPj0gMS4wRS00ICkKKyAgICB7CisgICAgICAgIHJlc3VsdCsrOworICAgICAgICBmcHJpbnRmIChsb2dGaWxlLAorICAgICAgICAgICAgICAgICAiRXJyb3IgaW4gZGl2aXNpb24gd2l0aCBkb3VibGU6IFJlc3VsdCB3YXMgJWYgaW5zdGVhZCBvZiAwLjEzNzc4N1xuIiwgZGl2KTsKKyAgICB9CisKKyAgICB4ID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgICAgICBpbnQgaTsKKyNwcmFnbWEgb21wIGZvcgorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgKytpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBhdG9taWM8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICAgIHgrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgIH0KKworICAgIGlmICh4ICE9IExPT1BDT1VOVCkKKyAgICB7CisgICAgICAgIHJlc3VsdCsrOworICAgICAgICBmcHJpbnRmIChsb2dGaWxlLCAiRXJyb3IgaW4gKytcbiIpOworICAgIH0KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgICAgICBpbnQgaTsKKyNwcmFnbWEgb21wIGZvcgorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgKytpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBhdG9taWM8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICAgIHgtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgfQorCisgICAgaWYgKHggIT0gMCkKKyAgICB7CisgICAgICAgIHJlc3VsdCsrOworICAgICAgICBmcHJpbnRmIChsb2dGaWxlLCAiRXJyb3IgaW4gLS1cbiIpOworICAgIH0KKworICAgIGZvciAoaiA9IDA7IGogPCBMT09QQ09VTlQ7ICsraikKKyAgICB7CisgICAgICAgIGxvZ2ljc1tqXSA9IDE7CisgICAgfQorICAgIGJpdF9hbmQgPSAxOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKyAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgICAgaW50IGk7CisjcHJhZ21hIG9tcCBmb3IKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7ICsraSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICA8b21wdHM6Y2hlY2s+I3ByYWdtYSBvbXAgYXRvbWljPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgICAgICBiaXRfYW5kICY9IGxvZ2ljc1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgIH0KKworICAgIGlmICghYml0X2FuZCkKKyAgICB7CisgICAgICAgIHJlc3VsdCsrOworICAgICAgICBmcHJpbnRmIChsb2dGaWxlLCAiRXJyb3IgaW4gQklUIEFORCBwYXJ0IDFcbiIpOworICAgIH0KKworICAgIGJpdF9hbmQgPSAxOworICAgIGxvZ2ljc1tMT09QQ09VTlQgLyAyXSA9IDA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICAgICAgaW50IGk7CisjcHJhZ21hIG9tcCBmb3IKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7ICsraSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICA8b21wdHM6Y2hlY2s+I3ByYWdtYSBvbXAgYXRvbWljPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgICAgICBiaXRfYW5kICY9IGxvZ2ljc1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgfQorCisgICAgaWYgKGJpdF9hbmQpCisgICAgeworICAgICAgICByZXN1bHQrKzsKKyAgICAgICAgZnByaW50ZiAobG9nRmlsZSwgIkVycm9yIGluIEJJVCBBTkQgcGFydCAyXG4iKTsKKyAgICB9CisKKyAgICBmb3IgKGogPSAwOyBqIDwgTE9PUENPVU5UOyBqKyspCisgICAgeworICAgICAgICBsb2dpY3Nbal0gPSAwOworICAgIH0KKyAgICBiaXRfb3IgPSAwOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKyAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgICAgIGludCBpOworI3ByYWdtYSBvbXAgZm9yCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyArK2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIGF0b21pYzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgYml0X29yIHw9IGxvZ2ljc1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgfQorCisgICAgaWYgKGJpdF9vcikKKyAgICB7CisgICAgICAgIHJlc3VsdCsrOworICAgICAgICBmcHJpbnRmIChsb2dGaWxlLCAiRXJyb3IgaW4gQklUIE9SIHBhcnQgMVxuIik7CisgICAgfQorICAgIGJpdF9vciA9IDA7CisgICAgbG9naWNzW0xPT1BDT1VOVCAvIDJdID0gMTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgICAgICBpbnQgaTsKKyNwcmFnbWEgb21wIGZvcgorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgKytpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBhdG9taWM8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICAgIGJpdF9vciB8PSBsb2dpY3NbaV07CisgICAgICAgICAgICB9CisgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgaWYgKCFiaXRfb3IpCisgICAgeworICAgICAgICByZXN1bHQrKzsKKyAgICAgICAgZnByaW50ZiAobG9nRmlsZSwgIkVycm9yIGluIEJJVCBPUiBwYXJ0IDJcbiIpOworICAgIH0KKworICAgIGZvciAoaiA9IDA7IGogPCBMT09QQ09VTlQ7IGorKykKKyAgICB7CisgICAgICAgIGxvZ2ljc1tqXSA9IDA7CisgICAgfQorICAgIGV4Y2x1c2l2X2JpdF9vciA9IDA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworICAgICAgICA8b21wdHM6b3JwaGFuPiAKKyAgICAgICAgICAgIGludCBpOworI3ByYWdtYSBvbXAgZm9yCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyArK2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBhdG9taWM8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICAgICBleGNsdXNpdl9iaXRfb3IgXj0gbG9naWNzW2ldOworICAgICAgICAgICAgfQorICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIGlmIChleGNsdXNpdl9iaXRfb3IpIAorICAgIHsKKyAgICAgICAgcmVzdWx0Kys7CisgICAgICAgIGZwcmludGYgKGxvZ0ZpbGUsICJFcnJvciBpbiBFWENMVVNJViBCSVQgT1IgcGFydCAxXG4iKTsKKyAgICB9CisKKyAgICBleGNsdXNpdl9iaXRfb3IgPSAwOworICAgIGxvZ2ljc1tMT09QQ09VTlQgLyAyXSA9IDE7CisgICAgCisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKyAgICAgICAgPG9tcHRzOm9ycGhhbj4gCisgICAgICAgICAgICBpbnQgaTsKKyNwcmFnbWEgb21wIGZvcgorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgKytpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICA8b21wdHM6Y2hlY2s+I3ByYWdtYSBvbXAgYXRvbWljPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgICAgICAgZXhjbHVzaXZfYml0X29yIF49IGxvZ2ljc1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBpZiAoIWV4Y2x1c2l2X2JpdF9vcikgCisgICAgeworICAgICAgICByZXN1bHQrKzsKKyAgICAgICAgZnByaW50ZiAobG9nRmlsZSwgIkVycm9yIGluIEVYQ0xVU0lWIEJJVCBPUiBwYXJ0IDJcbiIpOworICAgIH0KKworICAgIHggPSAxOworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgICAgICBpbnQgaTsKKyNwcmFnbWEgb21wIGZvcgorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDEwOyArK2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBhdG9taWM8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICAgICB4IDw8PSAxOworICAgICAgICAgICAgfQorICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICB9CisKKyAgICBpZiAoIHggIT0gMTAyNCkKKyAgICB7CisgICAgICAgIHJlc3VsdCsrOworICAgICAgICBmcHJpbnRmIChsb2dGaWxlLCAiRXJyb3IgaW4gPDxcbiIpOworICAgICAgICB4ID0gMTAyNDsKKyAgICB9CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICAgICAgaW50IGk7CisjcHJhZ21hIG9tcCBmb3IKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxMDsgKytpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBhdG9taWM8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICAgIHggPj49IDE7CisgICAgICAgICAgICB9CisgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgIH0KKworICAgIGlmICh4ICE9IDEpCisgICAgeworICAgICAgICByZXN1bHQrKzsKKyAgICAgICAgZnByaW50ZiAobG9nRmlsZSwgIkVycm9yIGluID4+XG4iKTsKKyAgICB9CisKKyAgICByZXR1cm4gKHJlc3VsdCA9PSAwKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfYmFycmllci5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2JhcnJpZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjY2OWUyCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2JhcnJpZXIuYwpAQCAtMCwwICsxLDQxIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBiYXJyaWVyIGRpcmVjdGl2ZS4gVGhlIHRlc3QgY3JlYXRlcyBzZXZlcmFsIHRocmVhZHMgYW5kIHNlbmRzIG9uZSBvZiB0aGVtIHNsZWVwaW5nIGJlZm9yZSBzZXR0aW5nIGEgZmxhZy4gQWZ0ZXIgdGhlIGJhcnJpZXIgdGhlIG90aGVyIG9uZXMgZG8gc29tZSBsaXR0bGUgd29yayBkZXBlbmRpbmcgb24gdGhlIGZsYWcuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBiYXJyaWVyPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKyNpbmNsdWRlICJvbXBfbXlfc2xlZXAuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX2JhcnJpZXI8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4gKEZJTEUgKiBsb2dGaWxlKQoreworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKwlpbnQgcmVzdWx0MTsKKwlpbnQgcmVzdWx0MjsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgcmVzdWx0MSA9IDA7CisgICAgcmVzdWx0MiA9IDA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworICAgIDxvbXB0czpvcnBoYW4+CisJaW50IHJhbms7CisJcmFuayA9IG9tcF9nZXRfdGhyZWFkX251bSAoKTsKKwlpZiAocmFuayA9PTEpIHsKKyAgICAgICAgbXlfc2xlZXAoU0xFRVBUSU1FX0xPTkcpOworICAgICAgICByZXN1bHQyID0gMzsKKwl9Cis8b21wdHM6Y2hlY2s+I3ByYWdtYSBvbXAgYmFycmllcjwvb21wdHM6Y2hlY2s+CisJaWYgKHJhbmsgPT0gMikgeworCSAgICByZXN1bHQxID0gcmVzdWx0MjsKKwl9CisgICAgPC9vbXB0czpvcnBoYW4+CisgICAgfQorICAgIHByaW50ZigicmVzdWx0MT0lZFxuIixyZXN1bHQxKTsKKyAgICByZXR1cm4gKHJlc3VsdDEgPT0gMyk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2NyaXRpY2FsLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfY3JpdGljYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjNmMjY0Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2NyaXRpY2FsLmMKQEAgLTAsMCArMSw0MiBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgY3JpdGljYWwgZGlyZWN0aXZlIGJ5IGNvdW50aW5nIHVwIGEgdmFyaWFibGUgaW4gYSBwYXJhbGxlbGl6ZWQgbG9vcCB3aXRoaW4gYSBjcml0aWNhbCBzZWN0aW9uLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgY3JpdGljYWw8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorI2luY2x1ZGUgIm9tcF9teV9zbGVlcC5oIgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfY3JpdGljYWw8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4gKEZJTEUgKiBsb2dGaWxlKQoreworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKwlpbnQgc3VtOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgc3VtPTA7CisgICAgaW50IGtub3duX3N1bTsKKwkgIAorICAgIDxvbXB0czpvcnBoYW4+CisgICAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisgICAgICBpbnQgbXlzdW09MDsKKyAgICAgIGludCBpOworICAgICAgCisgICAgICAjcHJhZ21hIG9tcCBmb3IKKwkgICAgZm9yIChpID0gMDsgaSA8IDEwMDA7IGkrKykKKwkgICAgICBteXN1bSA9IG15c3VtICsgaTsKKworICAgIDxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBjcml0aWNhbDwvb21wdHM6Y2hlY2s+CisJICAgIHN1bSA9IG15c3VtICtzdW07CisgICAgICAgIAorICAgIH0JLyogZW5kIG9mIHBhcmFsbGVsICovCisgICAgPC9vbXB0czpvcnBoYW4+CisgICAgCisgICAgcHJpbnRmKCJzdW09JWRcbiIsc3VtKTsKKyAgICBrbm93bl9zdW0gPSA5OTkgKiAxMDAwIC8gMjsKKyAgICByZXR1cm4gKGtub3duX3N1bSA9PSBzdW0pOworCit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2ZsdXNoLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZmx1c2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmFiZjhlCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2ZsdXNoLmMKQEAgLTAsMCArMSw1MCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgZmx1c2ggZGlyZWN0aXZlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgZmx1c2g8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgYmFycmllcjwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKyNpbmNsdWRlICJvbXBfbXlfc2xlZXAuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX2ZsdXNoPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+IChGSUxFICogbG9nRmlsZSkKK3sKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisJaW50IHJlc3VsdDE7CisJaW50IHJlc3VsdDI7CisJaW50IGR1bW15OworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKwlyZXN1bHQxID0gMDsKKwlyZXN1bHQyID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisJaW50IHJhbms7CisJcmFuayA9IG9tcF9nZXRfdGhyZWFkX251bSAoKTsKKworI3ByYWdtYSBvbXAgYmFycmllcgorCWlmIChyYW5rID09IDEpIHsKKwkgICAgcmVzdWx0MiA9IDM7CisJICAgIDxvbXB0czpvcnBoYW4+CisJCTxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBmbHVzaCAocmVzdWx0Mik8L29tcHRzOmNoZWNrPgorCQlkdW1teSA9IHJlc3VsdDI7CisJICAgIDwvb21wdHM6b3JwaGFuPgorCX0KKworCWlmIChyYW5rID09IDApIHsKKwkgICAgPG9tcHRzOmNoZWNrPm15X3NsZWVwKFNMRUVQVElNRV9MT05HKTs8L29tcHRzOmNoZWNrPgorCSAgICA8b21wdHM6b3JwaGFuPgorCQk8b21wdHM6Y2hlY2s+I3ByYWdtYSBvbXAgZmx1c2ggKHJlc3VsdDIpPC9vbXB0czpjaGVjaz4KKwkJcmVzdWx0MSA9IHJlc3VsdDI7CisJICAgIDwvb21wdHM6b3JwaGFuPgorCX0KKyAgICB9CS8qIGVuZCBvZiBwYXJhbGxlbCAqLworCisgICAgcmV0dXJuICgocmVzdWx0MSA9PSByZXN1bHQyKSAmJiAocmVzdWx0MiA9PSBkdW1teSkgJiYgKHJlc3VsdDIgPT0gMykpOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9mb3JfY29sbGFwc2UuYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9mb3JfY29sbGFwc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjE2ZjQwCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2Zvcl9jb2xsYXBzZS5jCkBAIC0wLDAgKzEsNTYgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdpdGggb21wIGZvciBjb2xsYXBzZSBjbGF1c2UuIEJpbmQgd2l0aCB0d28gbG9vcHMuIFdpdGhvdXQgdGhlIGNvbGxhcHNlIGNsYXVzZSwgdGhlIGZpcnN0IGxvb3Agd2lsbCBub3QgYmUgb3JkZXJlZDwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgZm9yIGNvbGxhcHNlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsLG9tcCBmb3Igc2NoZWR1bGU8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCisKKy8qIFV0aWxpdHkgZnVuY3Rpb24gdG8gY2hlY2sgdGhhdCBpIGlzIGluY3JlYXNpbmcgbW9ub3RvbmljYWxseSAKKyAgIHdpdGggZWFjaCBjYWxsICovCitzdGF0aWMgaW50IGNoZWNrX2lfaXNsYXJnZXIgKGludCBpKQoreworICAgIHN0YXRpYyBpbnQgbGFzdF9pOworICAgIGludCBpc2xhcmdlcjsKKyAgICBpZiAoaT09MSkKKyAgICAgIGxhc3RfaT0wOworICAgIGlzbGFyZ2VyID0gKChpID49IGxhc3RfaSkmJihpIC0gbGFzdF9pPD0xKSk7CisgICAgbGFzdF9pID0gaTsKKyAgICByZXR1cm4gKGlzbGFyZ2VyKTsKK30KKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX2Zvcl9jb2xsYXBzZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPiAoRklMRSAqIGxvZ0ZpbGUpCit7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorCWludCBpc19sYXJnZXIgPSAxOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKwk8b21wdHM6b3JwaGFuPgorCSAgaW50IGksajsKKwkgIGludCBteV9pc2xhcmdlciA9IDE7CisgICAgICAjcHJhZ21hIG9tcCBmb3IgcHJpdmF0ZShpLGopIHNjaGVkdWxlKHN0YXRpYywxKSA8b21wdHM6Y2hlY2s+Y29sbGFwc2UoMik8L29tcHRzOmNoZWNrPiBvcmRlcmVkCisJICAgIGZvciAoaSA9IDE7IGkgPCAxMDA7IGkrKyl7CisgICAgICAgICAgPG9tcHRzOmNyb3NzY2hlY2s+bXlfaXNsYXJnZXIgPSBjaGVja19pX2lzbGFyZ2VyKGkpJiYgbXlfaXNsYXJnZXI7PC9vbXB0czpjcm9zc2NoZWNrPgorICAgICAgICAgIGZvciAoaiA9MTsgaiA8MTAwOyBqKyspCisgICAgICAgICAgeworICAgICAgICAgICAgPG9tcHRzOmNoZWNrPgorCQkgICAgI3ByYWdtYSBvbXAgb3JkZXJlZAorCQkgICAgICBteV9pc2xhcmdlciA9IGNoZWNrX2lfaXNsYXJnZXIoaSkmJm15X2lzbGFyZ2VyOworICAgICAgICAgICAgPC9vbXB0czpjaGVjaz4KKwkgICAgICB9CS8qIGVuZCBvZiBmb3IgKi8KKyAgICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKwkJaXNfbGFyZ2VyID0gaXNfbGFyZ2VyICYmIG15X2lzbGFyZ2VyOworCTwvb21wdHM6b3JwaGFuPgorICAgIH0KKworICAgIHJldHVybiAoaXNfbGFyZ2VyKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZm9yX2ZpcnN0cHJpdmF0ZS5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2Zvcl9maXJzdHByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjcyMDE0Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2Zvcl9maXJzdHByaXZhdGUuYwpAQCAtMCwwICsxLDU1IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBmb3IgZmlyc3Rwcml2YXRlIGNsYXVzZSBieSBjb3VudGluZyB1cCBhIHZhcmlhYmxlIGluIGEgcGFyYWxsZWxpemVkIGxvb3AuIEVhY2ggdGhyZWFkIGhhcyBhIGZpcnN0cHJpdmF0ZSB2YXJpYWJsZSAoMSkgYW5kIGFuIHZhcmlhYmxlICgyKSBkZWNsYXJlZCBieSBmb3IgZmlyc3Rwcml2YXRlLiBGaXJzdCBpdCBzdG9yZXMgdGhlIHJlc3VsdCBvZiBpdHMgbGFzdCBpdGVyYXRpb24gaW4gdmFyaWFibGUgKDIpLiBUaGVuIGl0IHN0b3JlcyB0aGUgdmFsdWUgb2YgdGhlIHZhcmlhYmxlICgyKSBpbiBpdHMgZmlyc3Rwcml2YXRlIHZhcmlhYmxlICgxKS4gQXQgdGhlIGVuZCBhbGwgZmlyc3Rwcml2YXRlIHZhcmlhYmxlcyAoMSkgYXJlIGFkZGVkIHRvIGEgdG90YWwgc3VtIGluIGEgY3JpdGljYWwgc2VjdGlvbiBhbmQgY29tcGFyZWQgd2l0aCB0aGUgY29ycmVjdCByZXN1bHQuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4zLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBmb3IgZmlyc3Rwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsLG9tcCBwYXJhbGxlbCBmaXJzdHByaXZhdGU8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgc3VtMTsKKyNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUoc3VtMSkKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX2Zvcl9maXJzdHByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4gKEZJTEUgKiBsb2dGaWxlKQoreworICAgIGludCBzdW07CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorCWludCBzdW0wOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICBpbnQga25vd25fc3VtOworICAgIGludCB0aHJlYWRzbnVtOworCisgICAgc3VtID0gMDsKKyAgICBzdW0wID0gMTIzNDU7CisgICAgc3VtMSA9IDA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworI3ByYWdtYSBvbXAgc2luZ2xlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocmVhZHNudW09b21wX2dldF9udW1fdGhyZWFkcygpOworICAgICAgICB9CisJLyogc3VtMCA9IDA7ICovCisJPG9tcHRzOm9ycGhhbj4KKwlpbnQgaTsKKyNwcmFnbWEgb21wIGZvciA8b21wdHM6Y2hlY2s+Zmlyc3Rwcml2YXRlKHN1bTApPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz5wcml2YXRlKHN1bTApPC9vbXB0czpjcm9zc2NoZWNrPgorCWZvciAoaSA9IDE7IGkgPD0gTE9PUENPVU5UOyBpKyspCisJeworCSAgICBzdW0wID0gc3VtMCArIGk7CisJICAgIHN1bTEgPSBzdW0wOworCX0JLyogZW5kIG9mIGZvciAqLworCTwvb21wdHM6b3JwaGFuPgorI3ByYWdtYSBvbXAgY3JpdGljYWwKKwl7CisJICAgIHN1bSA9IHN1bSArIHN1bTE7CisJfQkvKiBlbmQgb2YgY3JpdGljYWwgKi8KKyAgICB9CS8qIGVuZCBvZiBwYXJhbGxlbCAqLyAgICAKKworICAgIGtub3duX3N1bSA9IDEyMzQ1KiB0aHJlYWRzbnVtKyAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDI7CisgICAgcmV0dXJuIChrbm93bl9zdW0gPT0gc3VtKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZm9yX2xhc3Rwcml2YXRlLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZm9yX2xhc3Rwcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzIwODBhMgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9mb3JfbGFzdHByaXZhdGUuYwpAQCAtMCwwICsxLDUyIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBmb3IgbGFzdHByaXZhdGUgY2xhdXNlIGJ5IGNvdW50aW5nIHVwIGEgdmFyaWFibGUgaW4gYSBwYXJhbGxlbGl6ZWQgbG9vcC4gRWFjaCB0aHJlYWQgc2F2ZXMgdGhlIG5leHQgc3VtbWFuZCBpbiBhIGxhc3Rwcml2YXRlIHZhcmlhYmxlIGkwLiBBdCB0aGUgZW5kIGkwIGlzIGNvbXBhcmVkIHRvIHRoZSB2YWx1ZSBvZiB0aGUgZXhwZWN0ZWQgbGFzdCBzdW1tYW5kLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgZm9yIGxhc3Rwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsLG9tcCBwYXJhbGxlbCBmaXJzdHByaXZhdGUsb21wIHNjaGVkdWxlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IHN1bTA7CisjcHJhZ21hIG9tcCB0aHJlYWRwcml2YXRlKHN1bTApCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9mb3JfbGFzdHByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4gKEZJTEUgKiBsb2dGaWxlKQoreworCWludCBzdW0gPSAwOworCWludCBrbm93bl9zdW07CisJPG9tcHRzOm9ycGhhbjp2YXJzPgorCSAgICBpbnQgaTA7CisJPC9vbXB0czpvcnBoYW46dmFycz4KKworCWkwID0gLTE7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisJeworCSAgICBzdW0wID0gMDsKKwkgICAgewkvKiBCZWdpbiBvZiBvcnBoYW5lZCBibG9jayAqLworCSAgICA8b21wdHM6b3JwaGFuPgorCQlpbnQgaTsKKyNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShzdGF0aWMsNykgPG9tcHRzOmNoZWNrPmxhc3Rwcml2YXRlKGkwKTwvb21wdHM6Y2hlY2s+CisJCWZvciAoaSA9IDE7IGkgPD0gTE9PUENPVU5UOyBpKyspCisJCXsKKwkJICAgIHN1bTAgPSBzdW0wICsgaTsKKwkJICAgIGkwID0gaTsKKwkJfQkvKiBlbmQgb2YgZm9yICovCisJICAgIDwvb21wdHM6b3JwaGFuPgorCSAgICB9CS8qIGVuZCBvZiBvcnBoYW5lZCBibG9jayAqLworCisjcHJhZ21hIG9tcCBjcml0aWNhbAorCSAgICB7CisJCXN1bSA9IHN1bSArIHN1bTA7CisJICAgIH0JLyogZW5kIG9mIGNyaXRpY2FsICovCisJfQkvKiBlbmQgb2YgcGFyYWxsZWwgKi8gICAgCisKKwlrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDI7CisJZnByaW50Zihsb2dGaWxlLCIga25vd25fc3VtID0gJWQgLCBzdW0gPSAlZCBcbiIsa25vd25fc3VtLHN1bSk7CisJZnByaW50Zihsb2dGaWxlLCIgTE9PUENPVU5UID0gJWQgLCBpMCA9ICVkIFxuIixMT09QQ09VTlQsaTApOworCXJldHVybiAoKGtub3duX3N1bSA9PSBzdW0pICYmIChpMCA9PSBMT09QQ09VTlQpICk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2Zvcl9ub3dhaXQuYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9mb3Jfbm93YWl0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNlYzQwYgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9mb3Jfbm93YWl0LmMKQEAgLTAsMCArMSw1NyBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBwYXJhbGxlbCBmb3Igbm93YWl0IGRpcmVjdGl2ZS4gSXQgZmlsbHMgYW4gYXJyYXkgd2l0aCB2YWx1ZXMgYW5kIG9wZXJhdGVzIG9uIHRoZXNlIGluIHRoZSBmb2xsb3dpbmcuPC9vbXB0czpkZXNjcmlwdGlvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHBhcmFsbGVsIGZvciBub3dhaXQ8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp2ZXJzaW9uPjEuMDwvb21wdHM6dmVyc2lvbj4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgcGFyYWxsZWwgZm9yLCBvbXAgZmx1c2g8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisjaW5jbHVkZSAib21wX215X3NsZWVwLmgiCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9mb3Jfbm93YWl0PC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+IChGSUxFICogbG9nRmlsZSkKK3sKKwk8b21wdHM6b3JwaGFuOnZhcnM+CisJCWludCByZXN1bHQ7CisJCWludCBjb3VudDsKKwk8L29tcHRzOm9ycGhhbjp2YXJzPgorCWludCBqOworCWludCBteWFycmF5W0xPT1BDT1VOVF07CisKKwlyZXN1bHQgPSAwOworCWNvdW50ID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisJeworCTxvbXB0czpvcnBoYW4+CisJCWludCByYW5rOworCQlpbnQgaTsKKworCQlyYW5rID0gb21wX2dldF90aHJlYWRfbnVtKCk7CisKKyNwcmFnbWEgb21wIGZvciA8b21wdHM6Y2hlY2s+bm93YWl0PC9vbXB0czpjaGVjaz4gCisJCWZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7IGkrKykgeworCQkJaWYgKGkgPT0gMCkgeworCQkJCWZwcmludGYgKGxvZ0ZpbGUsICJUaHJlYWQgbnIgJWQgZW50ZXJpbmcgZm9yIGxvb3AgYW5kIGdvaW5nIHRvIHNsZWVwLlxuIiwgcmFuayk7CisJCQkJbXlfc2xlZXAoU0xFRVBUSU1FKTsKKwkJCQljb3VudCA9IDE7CisjcHJhZ21hIG9tcCBmbHVzaChjb3VudCkKKwkJCQlmcHJpbnRmIChsb2dGaWxlLCAiVGhyZWFkIG5yICVkIHdva2UgdXAgYW5kIHNldCBjb3VudCA9IDEuXG4iLCByYW5rKTsKKwkJCX0KKwkJfQorCQkKKwkJZnByaW50ZiAobG9nRmlsZSwgIlRocmVhZCBuciAlZCBleGl0ZWQgZmlyc3QgZm9yIGxvb3AgYW5kIGVudGVycyB0aGUgc2Vjb25kLlxuIiwgcmFuayk7CisjcHJhZ21hIG9tcCBmb3IKKwkJZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgaSsrKSAKKwkJeworI3ByYWdtYSBvbXAgZmx1c2goY291bnQpCisJCQlpZiAoY291bnQgPT0gMCkKKwkJCQlyZXN1bHQgPSAxOworCQl9CisJPC9vbXB0czpvcnBoYW4+CisJfQorCQorCXJldHVybiByZXN1bHQ7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2Zvcl9vcmRlcmVkLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZm9yX29yZGVyZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Mjk3ZDA0Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2Zvcl9vcmRlcmVkLmMKQEAgLTAsMCArMSw2MCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgb3JkZXJlZCBkaXJlY3RpdmUgYnkgY291bnRpbmcgdXAgYW4gdmFyaWFibGUgaW4gYW4gcGFyYWxsZWxpemVkIGxvb3AgYW5kIHdhdGNoaW5nIGVhY2ggaXRlcmF0aW9uIGlmIHRoZSBzdW1hbmQgaXMgbGFyZ2VyIGFzIHRoZSBsYXN0IG9uZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIGZvciBvcmRlcmVkPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsLG9tcCBmb3Igc2NoZWR1bGU8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitzdGF0aWMgaW50IGxhc3RfaSA9IDA7CisKKy8qIFV0aWxpdHkgZnVuY3Rpb24gdG8gY2hlY2sgdGhhdCBpIGlzIGluY3JlYXNpbmcgbW9ub3RvbmljYWxseSAKKyAgIHdpdGggZWFjaCBjYWxsICovCitzdGF0aWMgaW50IGNoZWNrX2lfaXNsYXJnZXIgKGludCBpKQoreworICAgIGludCBpc2xhcmdlcjsKKyAgICBpc2xhcmdlciA9IChpID4gbGFzdF9pKTsKKyAgICBsYXN0X2kgPSBpOworICAgIHJldHVybiAoaXNsYXJnZXIpOworfQorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfZm9yX29yZGVyZWQ8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4gKEZJTEUgKiBsb2dGaWxlKQoreworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKwlpbnQgc3VtOworCWludCBpc19sYXJnZXIgPSAxOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgaW50IGtub3duX3N1bTsKKworICAgIGxhc3RfaSA9IDA7CisgICAgc3VtID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisJPG9tcHRzOm9ycGhhbj4KKwkgICAgaW50IGk7CisJICAgIGludCBteV9pc2xhcmdlciA9IDE7CisjcHJhZ21hIG9tcCBmb3Igc2NoZWR1bGUoc3RhdGljLDEpIG9yZGVyZWQKKwkgICAgZm9yIChpID0gMTsgaSA8IDEwMDsgaSsrKQorCSAgICB7CisJCTxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBvcmRlcmVkPC9vbXB0czpjaGVjaz4KKwkJeworCQkgICAgbXlfaXNsYXJnZXIgPSBjaGVja19pX2lzbGFyZ2VyKGkpICYmIG15X2lzbGFyZ2VyOworCQkgICAgc3VtID0gc3VtICsgaTsKKwkJfQkvKiBlbmQgb2Ygb3JkZXJlZCAqLworCSAgICB9CS8qIGVuZCBvZiBmb3IgKi8KKyNwcmFnbWEgb21wIGNyaXRpY2FsCisJICAgIHsKKwkJaXNfbGFyZ2VyID0gaXNfbGFyZ2VyICYmIG15X2lzbGFyZ2VyOworCSAgICB9CS8qIGVuZCBvZiBjcml0aWNhbCAqLworCTwvb21wdHM6b3JwaGFuPgorICAgIH0KKworICAgIGtub3duX3N1bT0oOTkgKiAxMDApIC8gMjsKKyAgICByZXR1cm4gKChrbm93bl9zdW0gPT0gc3VtKSAmJiBpc19sYXJnZXIpOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9mb3JfcHJpdmF0ZS5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2Zvcl9wcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE2NTExMAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9mb3JfcHJpdmF0ZS5jCkBAIC0wLDAgKzEsNjQgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIGZvciBwcml2YXRlIGNsYXVzZSBieSBjb3VudGluZyB1cCBhIHZhcmlhYmxlIGluIGEgcGFyYWxsZWxpemVkIGxvb3AuIEVhY2ggdGhyZWFkIGhhcyBhIHByaXZhdGUgdmFyaWFibGUgKDEpIGFuZCBhIHZhcmlhYmxlICgyKSBkZWNsYXJlZCBieSBmb3IgcHJpdmF0ZS4gRmlyc3QgaXQgc3RvcmVzIHRoZSByZXN1bHQgb2YgaXRzIGxhc3QgaXRlcmF0aW9uIGluIHZhcmlhYmxlICgyKS4gVGhlbiB0aGlzIHRocmVhZCB3YWl0cyBzb21lIHRpbWUgYmVmb3JlIGl0IHN0b3JlcyB0aGUgdmFsdWUgb2YgdGhlIHZhcmlhYmxlICgyKSBpbiBpdHMgcHJpdmF0ZSB2YXJpYWJsZSAoMSkuIEF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIG5leHQgaXRlcmF0aW9uIHRoZSB2YWx1ZSBvZiAoMSkgaXMgYXNzaWduZWQgdG8gKDIpLiBBdCB0aGUgZW5kIGFsbCBwcml2YXRlIHZhcmlhYmxlcyAoMSkgYXJlIGFkZGVkIHRvIGEgdG90YWwgc3VtIGluIGEgY3JpdGljYWwgc2VjdGlvbiBhbmQgY29tcGFyZWQgd2l0aCB0aGUgY29ycmVjdCByZXN1bHQuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBmb3IgcHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBwYXJhbGxlbCxvbXAgZmx1c2gsb21wIGNyaXRpY2FsLG9tcCB0aHJlYWRwcml2YXRlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKKy8qIFV0aWxpdHkgZnVuY3Rpb24gZG8gc3BlbmQgc29tZSB0aW1lIGluIGEgbG9vcCAqLworc3RhdGljIHZvaWQgZG9fc29tZV93b3JrICgpeworICAgIGludCBpOworICAgIGRvdWJsZSBzdW0gPSAwOworICAgIGZvcihpID0gMDsgaSA8IDEwMDA7IGkrKyl7CisJc3VtICs9IHNxcnQgKChkb3VibGUpIGkpOworICAgIH0KK30KKworaW50IHN1bTE7CisjcHJhZ21hIG9tcCB0aHJlYWRwcml2YXRlKHN1bTEpCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9mb3JfcHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPiAoRklMRSAqIGxvZ0ZpbGUpCit7CisgICAgaW50IHN1bSA9IDA7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorCWludCBzdW0wOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICBpbnQga25vd25fc3VtOworCisgICAgc3VtMCA9IDA7CS8qIHNldHRpbmcgKGdsb2JhbCkgc3VtMCA9IDAgKi8KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisJc3VtMSA9IDA7CS8qIHNldHRpbmcgc3VtMSBpbiBlYWNoIHRocmVhZCB0byAwICovCisKKwl7CS8qIGJlZ2luIG9mIG9ycGhhbmVkIGJsb2NrICovCisJPG9tcHRzOm9ycGhhbj4KKwkgICAgaW50IGk7CisjcHJhZ21hIG9tcCBmb3IgPG9tcHRzOmNoZWNrPnByaXZhdGUoc3VtMCk8L29tcHRzOmNoZWNrPiBzY2hlZHVsZShzdGF0aWMsMSkKKwkgICAgZm9yIChpID0gMTsgaSA8PSBMT09QQ09VTlQ7IGkrKykKKwkgICAgeworCQlzdW0wID0gc3VtMTsKKyNwcmFnbWEgb21wIGZsdXNoCisJCXN1bTAgPSBzdW0wICsgaTsKKwkJZG9fc29tZV93b3JrICgpOworI3ByYWdtYSBvbXAgZmx1c2gKKwkJc3VtMSA9IHN1bTA7CisJICAgIH0JLyogZW5kIG9mIGZvciAqLworCTwvb21wdHM6b3JwaGFuPgorCX0JLyogZW5kIG9mIG9ycGhhbmVkIGJsb2NrICovCisKKyNwcmFnbWEgb21wIGNyaXRpY2FsCisJeworCSAgICBzdW0gPSBzdW0gKyBzdW0xOworCX0JLyplbmQgb2YgY3JpdGljYWwqLworICAgIH0JLyogZW5kIG9mIHBhcmFsbGVsKi8gICAgCisKKyAgICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDI7CisgICAgcmV0dXJuIChrbm93bl9zdW0gPT0gc3VtKTsKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9mb3JfcmVkdWN0aW9uLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZm9yX3JlZHVjdGlvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkZDE5MTcKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZm9yX3JlZHVjdGlvbi5jCkBAIC0wLDAgKzEsNDI5IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBmb3IgcmVkdWN0aW9uIGRpcmVjdGl2ZSB3aWNoIGFsbCBpdHMgb3B0aW9ucy48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIGZvciByZWR1Y3Rpb248L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfZm9yX3JlZHVjdGlvbjwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPiAoRklMRSAqIGxvZ0ZpbGUpCit7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorCWRvdWJsZSBkdDsKKwlpbnQgc3VtOworCWludCBkaWZmOworCWludCBwcm9kdWN0ID0gMTsKKwlkb3VibGUgZHN1bTsKKwlkb3VibGUgZGtub3duX3N1bTsKKwlkb3VibGUgZGRpZmY7CisJaW50IGxvZ2ljX2FuZDsKKwlpbnQgbG9naWNfb3I7CisJaW50IGJpdF9hbmQ7CisJaW50IGJpdF9vcjsKKwlpbnQgZXhjbHVzaXZfYml0X29yOworCWludCAqbG9naWNzOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyNkZWZpbmUgRE9VQkxFX0RJR0lUUyAyMAkvKiBkdF5ET1VCTEVfRElHSVRTICovCisjZGVmaW5lIE1BWF9GQUNUT1IgMTAKKyNkZWZpbmUgS05PV05fUFJPRFVDVCAzNjI4ODAwCS8qIDEwISAqLworCisgICAgaW50IGk7CisgICAgaW50IGtub3duX3N1bTsKKyAgICBpbnQga25vd25fcHJvZHVjdDsKKyAgICBkb3VibGUgcm91bmRpbmdfZXJyb3IgPSAxLkUtOTsJLyogb3ZlciBhbGwgcm91bmRpbmcgZXJyb3IgdG8gYmUgaWdub3JlZCBpbiB0aGUgZG91YmxlIHRlc3RzICovCisgICAgZG91YmxlIGRwdDsKKyAgICBpbnQgcmVzdWx0ID0gMDsKKyAgICBpbnQgbG9naWNzQXJyYXlbTE9PUENPVU5UXTsKKworICAgIC8qIFZhcmlhYmxlcyBmb3IgaW50ZWdlciB0ZXN0cyAqLworICAgIHN1bSA9IDA7CisgICAgcHJvZHVjdCA9IDE7CisgICAga25vd25fc3VtID0gKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyOworICAgIC8qIHZhcmlhYmVscyBmb3IgZG91YmxlIHRlc3RzICovCisgICAgZHQgPSAxLiAvIDMuOwkvKiBiYXNlIG9mIGdlb21ldHJpYyByb3cgZm9yICsgYW5kIC0gdGVzdCovCisgICAgZHN1bSA9IDAuOworICAgIC8qIFZhcmlhYmVsZXMgZm9yIGxvZ2ljICB0ZXN0cyAqLworICAgIGxvZ2ljcyA9IGxvZ2ljc0FycmF5OworICAgIGxvZ2ljX2FuZCA9IDE7CisgICAgbG9naWNfb3IgPSAwOworICAgIC8qIFZhcmlhYmVsZXMgZm9yIGJpdCBvcGVyYXRvcnMgdGVzdHMgKi8KKyAgICBiaXRfYW5kID0gMTsKKyAgICBiaXRfb3IgPSAwOworICAgIC8qIFZhcmlhYmxlcyBmb3IgZXhjbHVzaXYgYml0IG9yICovCisgICAgZXhjbHVzaXZfYml0X29yID0gMDsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiBUZXN0cyBmb3IgaW50ZWdlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoqKiogVGVzdGluZyBpbnRlZ2VyIGFkZGl0aW9uICoqKiovCisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIAorICAgIHsKKwk8b21wdHM6b3JwaGFuPgorCSAgICBpbnQgajsKKyNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oKzpzdW0pPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJICAgIGZvciAoaiA9IDE7IGogPD0gTE9PUENPVU5UOyBqKyspCisJICAgIHsKKwkJc3VtID0gc3VtICsgajsKKwkgICAgfQorCTwvb21wdHM6b3JwaGFuPgorICAgIH0KKworICAgIGlmIChrbm93bl9zdW0gIT0gc3VtKSB7CisJcmVzdWx0Kys7CisJZnByaW50ZiAobG9nRmlsZSwgIkVycm9yIGluIHN1bSB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICVkIGluc3RlYWQgb2YgJWQuXG4iLCBzdW0sIGtub3duX3N1bSk7IAorICAgIH0KKworCisvKioqKiBUZXN0aW5nIGludGVnZXIgc3VidHJhY3RvbiAqKioqLworCisgICAgZGlmZiA9IChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMjsKKyNwcmFnbWEgb21wIHBhcmFsbGVsIAorICAgIHsKKwk8b21wdHM6b3JwaGFuPgorCSAgICBpbnQgajsKKyNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLTpkaWZmKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCSAgICBmb3IgKGogPSAxOyBqIDw9IExPT1BDT1VOVDsgaisrKQorCSAgICB7CisJCWRpZmYgPSBkaWZmIC0gajsKKwkgICAgfQorCTwvb21wdHM6b3JwaGFuPgorICAgIH0KKworICAgIGlmIChkaWZmICE9IDApIHsKKwlyZXN1bHQrKzsKKwlmcHJpbnRmIChsb2dGaWxlLCAiRXJyb3IgaW4gZGlmZmVyZW5jZSB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICVkIGluc3RlYWQgb2YgMC5cbiIsIGRpZmYpOworICAgIH0KKworCisvKioqKiBUZXN0aW5nIGludGVnZXIgbXVsdGlwbGljYXRpb24gKioqKi8KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisgICAgeworCTxvbXB0czpvcnBoYW4+CisJICAgIGludCBqOworI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigqOnByb2R1Y3QpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJICAgIGZvciAoaiA9IDE7IGogPD0gTUFYX0ZBQ1RPUjsgaisrKQorCSAgICB7CisJCXByb2R1Y3QgKj0gajsKKwkgICAgfQorCTwvb21wdHM6b3JwaGFuPgorICAgIH0KKworICAgIGtub3duX3Byb2R1Y3QgPSBLTk9XTl9QUk9EVUNUOworICAgIGlmKGtub3duX3Byb2R1Y3QgIT0gcHJvZHVjdCkKKyAgICB7CisJcmVzdWx0Kys7CisJZnByaW50ZiAobG9nRmlsZSwiRXJyb3IgaW4gUHJvZHVjdCB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICVkIGluc3RlYWQgb2YgJWRcbiIscHJvZHVjdCxrbm93bl9wcm9kdWN0KTsKKyAgICB9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiogVGVzdHMgZm9yIGRvdWJsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qKioqIFRlc3RpbmcgZG91YmxlIGFkZGl0aW9uICoqKiovCisKKyAgICBkc3VtID0gMC47CisgICAgZHB0ID0gMS47CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgRE9VQkxFX0RJR0lUUzsgKytpKQorICAgIHsKKwlkcHQgKj0gZHQ7CisgICAgfQorICAgIGRrbm93bl9zdW0gPSAoMSAtIGRwdCkgLyAoMSAtIGR0KTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisgICAgeworCTxvbXB0czpvcnBoYW4+CisJICAgIGludCBqOworI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigrOmRzdW0pPC9vbXB0czpjaGVjaz4KKwkgICAgZm9yIChqID0gMDsgaiA8IERPVUJMRV9ESUdJVFM7IGorKykKKwkgICAgewkKKwkJZHN1bSArPSBwb3cgKGR0LCBqKTsKKwkgICAgfQorCTwvb21wdHM6b3JwaGFuPgorICAgIH0KKworICAgIGlmIChmYWJzIChkc3VtIC0gZGtub3duX3N1bSkgPiByb3VuZGluZ19lcnJvcikgeworCXJlc3VsdCsrOyAKKwlmcHJpbnRmIChsb2dGaWxlLCAiXG5FcnJvciBpbiBzdW0gd2l0aCBkb3VibGVzOiBSZXN1bHQgd2FzICVmIGluc3RlYWQgb2Y6ICVmIChEaWZmZXJlbmNlOiAlRSlcbiIsIGRzdW0sIGRrbm93bl9zdW0sIGRzdW0tZGtub3duX3N1bSk7CisgICAgfQorCisjaWYgMAorICAgIGRwdCA9IDEuOworICAgIGZvciAoaSA9IDA7IGkgPCBET1VCTEVfRElHSVRTOyArK2kpCisgICAgeworCWRwdCAqPSBkdDsKKyAgICB9CisjZW5kaWYKKworCisvKioqKiBUZXN0aW5nIGRvdWJsZSBzdWJ0cmFjdGlvbiAqKioqLworCisgICAgZGRpZmYgPSAoMSAtIGRwdCkgLyAoMSAtIGR0KTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisgICAgeworCTxvbXB0czpvcnBoYW4+CisJICAgIGludCBqOworI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigtOmRkaWZmKTwvb21wdHM6Y2hlY2s+CisJICAgIGZvciAoaiA9IDA7IGogPCBET1VCTEVfRElHSVRTOyArK2opCisJICAgIHsKKwkJZGRpZmYgLT0gcG93IChkdCwgaik7CisJICAgIH0KKwk8L29tcHRzOm9ycGhhbj4KKyAgICB9CisKKyAgICBpZiAoZmFicyAoZGRpZmYpID4gcm91bmRpbmdfZXJyb3IpIHsKKwlyZXN1bHQrKzsKKwlmcHJpbnRmIChsb2dGaWxlLCAiRXJyb3IgaW4gRGlmZmVyZW5jZSB3aXRoIGRvdWJsZXM6IFJlc3VsdCB3YXMgJUUgaW5zdGVhZCBvZiAwLjBcbiIsIGRkaWZmKTsKKyAgICB9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiogVGVzdHMgZm9yIGxvZ2ljYWwgdmFsdWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qKioqIFRlc3RpbmcgbG9naWMgYW5kICoqKiovCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyBpKyspCisgICAgeworCWxvZ2ljc1tpXSA9IDE7CisgICAgfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKyAgICB7CisJPG9tcHRzOm9ycGhhbj4KKwkgICAgaW50IGo7CisjcHJhZ21hIG9tcCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCYmOmxvZ2ljX2FuZCk8L29tcHRzOmNoZWNrPgorCSAgICBmb3IgKGogPSAwOyBqIDwgTE9PUENPVU5UOyArK2opCisJICAgIHsKKwkJbG9naWNfYW5kID0gKGxvZ2ljX2FuZCAmJiBsb2dpY3Nbal0pOworCSAgICB9CisJPC9vbXB0czpvcnBoYW4+CisgICAgfQorCisgICAgaWYoIWxvZ2ljX2FuZCkgeworCXJlc3VsdCsrOworCWZwcmludGYgKGxvZ0ZpbGUsICJFcnJvciBpbiBsb2dpYyBBTkQgcGFydCAxXG4iKTsKKyAgICB9CisKKyAgICBsb2dpY19hbmQgPSAxOworICAgIGxvZ2ljc1tMT09QQ09VTlQgLyAyXSA9IDA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIAorICAgIHsKKwk8b21wdHM6b3JwaGFuPgorCSAgICBpbnQgajsKKyNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oJiY6bG9naWNfYW5kKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCSAgICBmb3IgKGogPSAwOyBqIDwgTE9PUENPVU5UOyArK2opCisJICAgIHsKKwkJbG9naWNfYW5kID0gbG9naWNfYW5kICYmIGxvZ2ljc1tqXTsKKwkgICAgfQorCTwvb21wdHM6b3JwaGFuPgorICAgIH0KKworICAgIGlmKGxvZ2ljX2FuZCkgeworCXJlc3VsdCsrOworCWZwcmludGYgKGxvZ0ZpbGUsICJFcnJvciBpbiBsb2dpYyBBTkQgcGFydCAyXG4iKTsKKyAgICB9CisKKworLyoqKiogVGVzdGluZyBsb2dpYyBvciAqKioqLworCisgICAgZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgaSsrKQorICAgIHsKKwlsb2dpY3NbaV0gPSAwOworICAgIH0KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisgICAgeworCTxvbXB0czpvcnBoYW4+CisJICAgIGludCBqOworI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbih8fDpsb2dpY19vcikgIDwvb21wdHM6Y2hlY2s+CisJICAgIGZvciAoaiA9IDA7IGogPCBMT09QQ09VTlQ7ICsraikKKwkgICAgeworCQlsb2dpY19vciA9IGxvZ2ljX29yIHx8IGxvZ2ljc1tqXTsKKwkgICAgfQorCTwvb21wdHM6b3JwaGFuPgorICAgIH0KKworICAgIGlmIChsb2dpY19vcikgeworCXJlc3VsdCsrOworCWZwcmludGYgKGxvZ0ZpbGUsICJFcnJvciBpbiBsb2dpYyBPUiBwYXJ0IDFcbiIpOworICAgIH0KKworICAgIGxvZ2ljX29yID0gMDsKKyAgICBsb2dpY3NbTE9PUENPVU5UIC8gMl0gPSAxOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKyAgICB7CisJPG9tcHRzOm9ycGhhbj4KKwkgICAgaW50IGo7CisjcHJhZ21hIG9tcCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKHx8OmxvZ2ljX29yKTwvb21wdHM6Y2hlY2s+CisJICAgIGZvciAoaiA9IDA7IGogPCBMT09QQ09VTlQ7ICsraikKKwkgICAgeworCQlsb2dpY19vciA9IGxvZ2ljX29yIHx8IGxvZ2ljc1tqXTsKKwkgICAgfQorCTwvb21wdHM6b3JwaGFuPgorICAgIH0KKworICAgIGlmKCFsb2dpY19vcikgeworCXJlc3VsdCsrOworCWZwcmludGYgKGxvZ0ZpbGUsICJFcnJvciBpbiBsb2dpYyBPUiBwYXJ0IDJcbiIpOworICAgIH0KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiBUZXN0cyBmb3IgYml0IHZhbHVlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoqKiogVGVzdGluZyBiaXQgYW5kICoqKiovCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyArK2kpCisgICAgeworCWxvZ2ljc1tpXSA9IDE7CisgICAgfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKyAgICB7CisJPG9tcHRzOm9ycGhhbj4KKwkgICAgaW50IGo7CisjcHJhZ21hIG9tcCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCY6Yml0X2FuZCkgIDwvb21wdHM6Y2hlY2s+CisJICAgIGZvciAoaiA9IDA7IGogPCBMT09QQ09VTlQ7ICsraikKKwkgICAgeworCQliaXRfYW5kID0gKGJpdF9hbmQgJiBsb2dpY3Nbal0pOworCSAgICB9CisJPC9vbXB0czpvcnBoYW4+CisgICAgfQorCisgICAgaWYgKCFiaXRfYW5kKSB7CisJcmVzdWx0Kys7CisJZnByaW50ZiAobG9nRmlsZSwgIkVycm9yIGluIEJJVCBBTkQgcGFydCAxXG4iKTsKKyAgICB9CisKKyAgICBiaXRfYW5kID0gMTsKKyAgICBsb2dpY3NbTE9PUENPVU5UIC8gMl0gPSAwOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKyAgICB7CisJPG9tcHRzOm9ycGhhbj4KKwkgICAgaW50IGo7CisjcHJhZ21hIG9tcCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCY6Yml0X2FuZCk8L29tcHRzOmNoZWNrPgorCSAgICBmb3IgKGogPSAwOyBqIDwgTE9PUENPVU5UOyArK2opCisJICAgIHsKKwkJYml0X2FuZCA9IGJpdF9hbmQgJiBsb2dpY3Nbal07CisJICAgIH0KKwk8L29tcHRzOm9ycGhhbj4KKyAgICB9CisgICAgaWYgKGJpdF9hbmQpIHsKKwlyZXN1bHQrKzsKKwlmcHJpbnRmIChsb2dGaWxlLCAiRXJyb3IgaW4gQklUIEFORCBwYXJ0IDJcbiIpOworICAgIH0KKworCisvKioqKiBUZXN0aW5nIGJpdCBvciAqKioqLworCisgICAgZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgaSsrKQorICAgIHsKKwlsb2dpY3NbaV0gPSAwOworICAgIH0KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisgICAgeworCTxvbXB0czpvcnBoYW4+CisJICAgIGludCBqOworI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbih8OmJpdF9vcik8L29tcHRzOmNoZWNrPgorCSAgICBmb3IgKGogPSAwOyBqIDwgTE9PUENPVU5UOyArK2opCisJICAgIHsKKwkJYml0X29yID0gYml0X29yIHwgbG9naWNzW2pdOworCSAgICB9CisJPC9vbXB0czpvcnBoYW4+CisgICAgfQorCisgICAgaWYgKGJpdF9vcikgeworCXJlc3VsdCsrOworCWZwcmludGYgKGxvZ0ZpbGUsICJFcnJvciBpbiBCSVQgT1IgcGFydCAxXG4iKTsKKyAgICB9CisKKyAgICBiaXRfb3IgPSAwOworICAgIGxvZ2ljc1tMT09QQ09VTlQgLyAyXSA9IDE7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIAorICAgIHsKKwk8b21wdHM6b3JwaGFuPgorCSAgICBpbnQgajsKKyNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24ofDpiaXRfb3IpPC9vbXB0czpjaGVjaz4KKwkgICAgZm9yIChqID0gMDsgaiA8IExPT1BDT1VOVDsgKytqKQorCSAgICB7CisJCWJpdF9vciA9IGJpdF9vciB8IGxvZ2ljc1tqXTsKKwkgICAgfQorCTwvb21wdHM6b3JwaGFuPgorICAgIH0KKyAgICBpZiAoIWJpdF9vcikgeworCXJlc3VsdCsrOworCWZwcmludGYgKGxvZ0ZpbGUsICJFcnJvciBpbiBCSVQgT1IgcGFydCAyXG4iKTsKKyAgICB9CisKKworLyoqKiogVGVzdGluZyBleGNsdXNpdmUgYml0IG9yICoqKiovCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyBpKyspCisgICAgeworCWxvZ2ljc1tpXSA9IDA7CisgICAgfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKyAgICB7CisJPG9tcHRzOm9ycGhhbj4KKwkgICAgaW50IGo7CisjcHJhZ21hIG9tcCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKF46ZXhjbHVzaXZfYml0X29yKTwvb21wdHM6Y2hlY2s+CisJICAgIGZvciAoaiA9IDA7IGogPCBMT09QQ09VTlQ7ICsraikKKwkgICAgeworCQlleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3Nbal07CisJICAgIH0KKwk8L29tcHRzOm9ycGhhbj4KKyAgICB9CisgICAgaWYgKGV4Y2x1c2l2X2JpdF9vcikgeworCXJlc3VsdCsrOworCWZwcmludGYgKGxvZ0ZpbGUsICJFcnJvciBpbiBFWENMVVNJViBCSVQgT1IgcGFydCAxXG4iKTsKKyAgICB9CisKKyAgICBleGNsdXNpdl9iaXRfb3IgPSAwOworICAgIGxvZ2ljc1tMT09QQ09VTlQgLyAyXSA9IDE7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIAorICAgIHsKKwk8b21wdHM6b3JwaGFuPgorCSAgICBpbnQgajsKKyNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oXjpleGNsdXNpdl9iaXRfb3IpPC9vbXB0czpjaGVjaz4KKwkgICAgZm9yIChqID0gMDsgaiA8IExPT1BDT1VOVDsgKytqKQorCSAgICB7CisJCWV4Y2x1c2l2X2JpdF9vciA9IGV4Y2x1c2l2X2JpdF9vciBeIGxvZ2ljc1tqXTsKKwkgICAgfQorCTwvb21wdHM6b3JwaGFuPgorICAgIH0KKyAgICBpZiAoIWV4Y2x1c2l2X2JpdF9vcikgeworCXJlc3VsdCsrOworCWZwcmludGYgKGxvZ0ZpbGUsICJFcnJvciBpbiBFWENMVVNJViBCSVQgT1IgcGFydCAyXG4iKTsKKyAgICB9CisKKyAgICAvKmZwcmludGYgKCJcblJlc3VsdDolZFxuIiwgcmVzdWx0KTsqLworICAgIHJldHVybiAocmVzdWx0ID09IDApOworCisgICAgZnJlZSAobG9naWNzKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZm9yX3NjaGVkdWxlX2F1dG8uYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9mb3Jfc2NoZWR1bGVfYXV0by5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2MWExYzQKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZm9yX3NjaGVkdWxlX2F1dG8uYwpAQCAtMCwwICsxLDU1IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aXRoIG9tcCBmb3Igc2NoZWR1bGUgYXV0bzwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgZm9yIGF1dG88L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgY3JpdGljYWwsb21wIHBhcmFsbGVsIGZpcnN0cHJpdmF0ZTwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCBzdW0xOworI3ByYWdtYSBvbXAgdGhyZWFkcHJpdmF0ZShzdW0xKQorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfZm9yX2F1dG88L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4gKEZJTEUgKiBsb2dGaWxlKQoreworICAgIGludCBzdW07CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorCWludCBzdW0wOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICBpbnQga25vd25fc3VtOworICAgIGludCB0aHJlYWRzbnVtOworCisgICAgc3VtID0gMDsKKyAgICBzdW0wID0gMTIzNDU7CisgICAgc3VtMSA9IDA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworI3ByYWdtYSBvbXAgc2luZ2xlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocmVhZHNudW09b21wX2dldF9udW1fdGhyZWFkcygpOworICAgICAgICB9CisJLyogc3VtMCA9IDA7ICovCisJPG9tcHRzOm9ycGhhbj4KKwlpbnQgaTsKKyNwcmFnbWEgb21wIGZvciA8b21wdHM6Y2hlY2s+Zmlyc3Rwcml2YXRlKHN1bTApIHNjaGVkdWxlKGF1dG8pPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz5wcml2YXRlKHN1bTApPC9vbXB0czpjcm9zc2NoZWNrPgorCWZvciAoaSA9IDE7IGkgPD0gTE9PUENPVU5UOyBpKyspCisJeworCSAgICBzdW0wID0gc3VtMCArIGk7CisJICAgIHN1bTEgPSBzdW0wOworCX0JLyogZW5kIG9mIGZvciAqLworCTwvb21wdHM6b3JwaGFuPgorI3ByYWdtYSBvbXAgY3JpdGljYWwKKwl7CisJICAgIHN1bSA9IHN1bSArIHN1bTE7CisJfQkvKiBlbmQgb2YgY3JpdGljYWwgKi8KKyAgICB9CS8qIGVuZCBvZiBwYXJhbGxlbCAqLyAgICAKKworICAgIGtub3duX3N1bSA9IDEyMzQ1KiB0aHJlYWRzbnVtKyAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDI7CisgICAgcmV0dXJuIChrbm93bl9zdW0gPT0gc3VtKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZm9yX3NjaGVkdWxlX2R5bmFtaWMuYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9mb3Jfc2NoZWR1bGVfZHluYW1pYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyY2RhNTYKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZm9yX3NjaGVkdWxlX2R5bmFtaWMuYwpAQCAtMCwwICsxLDExMSBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBkeW5hbWljIG9wdGlvbiBvZiB0aGUgb21wIGZvciBzY2hlZHVsZSBkaXJlY3RpdmU8L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIGZvciBzY2hlZHVsZShkeW5hbWljKTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBmbHVzaCxvbXAgZm9yIG5vd2FpdCxvbXAgY3JpdGljYWwsb21wIHNpbmdsZTwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisKKy8qCisqIFRlc3QgZm9yIGR5bmFtaWMgc2NoZWR1bGluZyB3aXRoIGNodW5rIHNpemUKKyogTWV0aG9kOiBjYWN1bGF0ZSBob3cgbWFueSB0aW1lcyB0aGUgaXRlcmF0aW9uIHNwYWNlIGlzIGRpc3BhdGNoZWQKKyogICAgICAgICBhbmQganVkZ2UgaWYgZWFjaCBkaXNwYXRjaCBoYXMgdGhlIHJlcXVlc3RlZCBjaHVuayBzaXplCisqICAgICAgICAgdW5sZXNzIGl0IGlzIHRoZSBsYXN0IG9uZS4KKyogSXQgaXMgcG9zc2libGUgZm9yIHR3byBhZGphY2VudCBjaHVua3MgYXJlIGFzc2lnbmVkIHRvIHRoZSBzYW1lIHRocmVhZAorKiBNb2RpZnlpZWQgYnkgQ2h1bmh1YSBMaWFvCisqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8b21wLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisjaW5jbHVkZSAib21wX215X3NsZWVwLmgiCisKKyNkZWZpbmUgQ0ZETUFYX1NJWkUgMTAwCitjb25zdCBpbnQgY2h1bmtfc2l6ZSA9IDc7CisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9mb3Jfc2NoZWR1bGVfZHluYW1pYzwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPiAoRklMRSAqIGxvZ0ZpbGUpCit7CisgIGludCB0aWQ7Cis8b21wdHM6b3JwaGFuOnZhcnM+ICAKKyAgaW50ICp0aWRzOworICBpbnQgaTsKKzwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgaW50IHRpZHNBcnJheVtDRkRNQVhfU0laRV07CisgIGludCBjb3VudCA9IDA7CisgIGludCB0bXBfY291bnQgPSAwOyAvKmRpc3BhdGNoIHRpbWVzKi8KKyAgaW50ICp0bXA7ICAvKnN0b3JlIGNodW5rIHNpemUgZm9yIGVhY2ggZGlzcGF0Y2gqLworICBpbnQgcmVzdWx0ID0gMDsKKyAgCisgIHRpZHMgPSB0aWRzQXJyYXk7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIHByaXZhdGUodGlkKSBzaGFyZWQodGlkcykKKyAgewkJCQkvKiBiZWdpbiBvZiBwYXJhbGxlbCAqLworICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgaW50IHRpZDsKKworICAgIHRpZCA9IG9tcF9nZXRfdGhyZWFkX251bSAoKTsKKyNwcmFnbWEgb21wIGZvciA8b21wdHM6Y2hlY2s+c2NoZWR1bGUoZHluYW1pYyxjaHVua19zaXplKTwvb21wdHM6Y2hlY2s+CisgICAgZm9yIChpID0gMDsgaSA8IENGRE1BWF9TSVpFOyBpKyspCisgICAgICB7CisJdGlkc1tpXSA9IHRpZDsKKyAgICAgIH0KKyAgICAgPC9vbXB0czpvcnBoYW4+CisgIH0JCQkJLyogZW5kIG9mIHBhcmFsbGVsICovCisKKyAgZm9yIChpID0gMDsgaSA8IENGRE1BWF9TSVpFIC0gMTsgKytpKQorICAgIHsKKyAgICAgIGlmICh0aWRzW2ldICE9IHRpZHNbaSArIDFdKQorCXsKKwkgIGNvdW50Kys7CisJfQorICAgIH0KKworICB0bXAgPSAoaW50ICopIG1hbGxvYyAoc2l6ZW9mIChpbnQpICogKGNvdW50ICsgMSkpOworICB0bXBbMF0gPSAxOworCisgIGZvciAoaSA9IDA7IGkgPCBDRkRNQVhfU0laRSAtIDE7ICsraSkKKyAgICB7CisgICAgICBpZiAodG1wX2NvdW50ID4gY291bnQpCisJeworCSAgcHJpbnRmICgiLS0tLS0tLS0tLS0tLS0tLS0tLS1cblRlc3RpbnRlcm5hbCBFcnJvcjogTGlzdCB0b28gc21hbGwhISFcbi0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsJLyogRXJyb3IgaGFuZGxpbmcgKi8KKwkgIGJyZWFrOworCX0KKyAgICAgIGlmICh0aWRzW2ldICE9IHRpZHNbaSArIDFdKQorCXsKKwkgIHRtcF9jb3VudCsrOworCSAgdG1wW3RtcF9jb3VudF0gPSAxOworCX0KKyAgICAgIGVsc2UKKwl7CisJICB0bXBbdG1wX2NvdW50XSsrOworCX0KKyAgICB9CisvKgorcHJpbnRmKCJkZWJ1Zy0tLS1cbiIpOworICAgIGZvciAoaSA9IDA7IGkgPCBDRkRNQVhfU0laRTsgKytpKQorCXByaW50ZigiJWQgIix0aWRzW2ldKTsKK3ByaW50ZigiZGVidWctLS0tXG4iKTsKKyovCisvKiBpcyBkeW5hbWljIHN0YXRlbWVudCB3b3JraW5nPyAqLworICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICB7CisgICAgICBpZiAoKHRtcFtpXSVjaHVua19zaXplKSE9MCkgCisvKml0IGlzIHBvc3NpYmxlIGZvciAyIGFkamFjZW50IGNodW5rcyBhc3NpZ25lZCB0byBhIHNhbWUgdGhyZWFkKi8KKwl7CisgICAgICAgICByZXN1bHQrKzsKKyAgZnByaW50Zihsb2dGaWxlLCJUaGUgaW50ZXJtZWRpYXRlIGRpc3BhdGNoIGhhcyB3cm9uZyBjaHVua3NpemUuXG4iKTsKKwkgIC8qcmVzdWx0ICs9ICgodG1wW2ldIC8gY2h1bmtfc2l6ZSkgLSAxKTsqLworCX0KKyAgICB9CisgIGlmICgodG1wW2NvdW50XSVjaHVua19zaXplKSE9KENGRE1BWF9TSVpFJWNodW5rX3NpemUpKQorICAgeyAKKyAgIHJlc3VsdCsrOworICBmcHJpbnRmKGxvZ0ZpbGUsInRoZSBsYXN0IGRpc3BhdGNoIGhhcyB3cm9uZyBjaHVua3NpemUuXG4iKTsKKyAgIH0KKyAgLyogZm9yIChpbnQgaT0wO2k8Y291bnQrMTsrK2kpIHByaW50ZigiJWRcdDo9XHQlZFxuIixpKzEsdG1wW2ldKTsgKi8KKyAgcmV0dXJuIChyZXN1bHQ9PTApOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9mb3Jfc2NoZWR1bGVfZ3VpZGVkLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZm9yX3NjaGVkdWxlX2d1aWRlZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzNTY0YTUKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZm9yX3NjaGVkdWxlX2d1aWRlZC5jCkBAIC0wLDAgKzEsMjI1IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIGd1aWRlZCBvcHRpb24gb2YgdGhlIG9tcCBmb3Igc2NoZWR1bGUgZGlyZWN0aXZlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgZm9yIHNjaGVkdWxlKGd1aWRlZCk8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgZmx1c2gsb21wIGZvciBub3dhaXQsb21wIGNyaXRpY2FsLG9tcCBzaW5nbGU8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorLyogVGVzdCBmb3IgZ3VpZGVkIHNjaGVkdWxpbmcKKyAqIEVuc3VyZSB0aHJlYWRzIGdldCBjaHVua3MgaW50ZXJsZWF2ZWx5IGZpcnN0CisgKiBUaGVuIGp1ZGdlIHRoZSBjaHVuayBzaXplcyBhcmUgZGVjcmVhc2luZyB0byBhIHN0YWJsZSB2YWx1ZQorICogTW9kaWZpZWQgYnkgQ2h1bmh1YSBMaWFvCisgKiBGb3IgZXhhbXBsZSwgMTAwIGl0ZXJhdGlvbiBvbiAyIHRocmVhZHMsIGNodW5rc2l6ZSA3CisgKiBvbmUgbGluZSBmb3IgZWFjaCBkaXNwYXRjaCwgMC8xIG1lYW5zIHRocmVhZCBpZAorICogMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgIDI0CisgKiAxIDEgMSAxIDEgMSAxIDEgMSAxIDEgMSAxIDEgMSAxIDEgMSAgICAgICAgICAgICAgMTgKKyAqIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAgICAgICAgICAgICAgICAgICAgICAxNAorICogMSAxIDEgMSAxIDEgMSAxIDEgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwCisgKiAwIDAgMCAwIDAgMCAwIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgKKyAqIDEgMSAxIDEgMSAxIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNworICogMCAwIDAgMCAwIDAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3CisgKiAxIDEgMSAxIDEgMSAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcKKyAqIDAgMCAwIDAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNQorKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorI2luY2x1ZGUgIm9tcF9teV9zbGVlcC5oIgorCisjZGVmaW5lIE5VTUJFUl9PRl9USFJFQURTIDEwCisjZGVmaW5lIENGU01BWF9TSVpFIDEwMDAKKyNkZWZpbmUgTUFYX1RJTUUgIDAuMDA1CisKKyNpZmRlZiBTTEVFUFRJTUUKKyN1bmRlZiBTTEVFUFRJTUUKKyNkZWZpbmUgU0xFRVBUSU1FIDAuMDAwMQorI2VuZGlmCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9mb3Jfc2NoZWR1bGVfZ3VpZGVkPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+IChGSUxFICogbG9nRmlsZSkKK3sKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisJaW50ICogdGlkczsKKwlpbnQgKiBjaHVua3NpemVzOworCWludCBub3RvdXQ7CisJaW50IG1heGl0ZXI7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgIGludCB0aHJlYWRzOworICAgIGludCBpOworICAgIGludCByZXN1bHQ7CisKKyAgICB0aWRzID0gKGludCAqKSBtYWxsb2MgKHNpemVvZiAoaW50KSAqIChDRlNNQVhfU0laRSArIDEpKTsKKwltYXhpdGVyID0gMDsKKyAgICByZXN1bHQgPSAxOworICAgIG5vdG91dCA9IDE7CisKKy8qIFRlc3RpbmcgaWYgZW5vdWdodCB0aHJlYWRzIGFyZSBhdmFpbGFibGUgZm9yIHRoaXMgY2hlY2suICovCisjcHJhZ21hIG9tcCBwYXJhbGxlbAorCXsKKyNwcmFnbWEgb21wIHNpbmdsZQorCSAgeworCQl0aHJlYWRzID0gb21wX2dldF9udW1fdGhyZWFkcyAoKTsKKwkgIH0gLyogZW5kIG9mIHNpbmdsZSAqLworCX0gLyogZW5kIG9mIHBhcmFsbGVsICovCisKKwlpZiAodGhyZWFkcyA8IDIpIHsKKwkgIHByaW50ZiAoIlRoaXMgdGVzdCBvbmx5IHdvcmtzIHdpdGggYXQgbGVhc3QgdHdvIHRocmVhZHMgLlxuIik7CisJICBmcHJpbnRmIChsb2dGaWxlLCAiVGhpcyB0ZXN0IG9ubHkgd29ya3Mgd2l0aCBhdCBsZWFzdCB0d28gdGhyZWFkcy4gQXZhaWxhYmxlIHdlcmUgb25seSAlZCB0aHJlYWQocykuXG4iLCB0aHJlYWRzKTsKKwkgIHJldHVybiAoMCk7CisJfSAvKiBlbmQgaWYgKi8KKworCisgICAgLyogTm93IHRoZSByZWFsIHBhcmFsbGVsIHdvcms6ICAKKyAgICAgKgorCSAqIEVhY2ggdGhyZWFkIHdpbGwgc3RhcnQgaW1tZWRpYXRlbHkgd2l0aCB0aGUgZmlyc3QgY2h1bmsuCisgICAgICovCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBzaGFyZWQodGlkcyxtYXhpdGVyKQorICAgIHsJLyogYmVnaW4gb2YgcGFyYWxsZWwgKi8KKyAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICBkb3VibGUgY291bnQ7CisgICAgICBpbnQgdGlkOworICAgICAgaW50IGo7CisKKyAgICAgIHRpZCA9IG9tcF9nZXRfdGhyZWFkX251bSAoKTsKKworI3ByYWdtYSBvbXAgZm9yIG5vd2FpdCA8b21wdHM6Y2hlY2s+c2NoZWR1bGUoZ3VpZGVkKTwvb21wdHM6Y2hlY2s+CisgICAgICBmb3IoaiA9IDA7IGogPCBDRlNNQVhfU0laRTsgKytqKQorICAgICAgeworCWNvdW50ID0gMC47CisjcHJhZ21hIG9tcCBmbHVzaChtYXhpdGVyKQorCWlmIChqID4gbWF4aXRlcikKKwl7CisjcHJhZ21hIG9tcCBjcml0aWNhbAorCSAgeworCSAgICBtYXhpdGVyID0gajsKKwkgIH0JLyogZW5kIG9mIGNyaXRpY2FsICovIAorCX0KKwkvKnByaW50ZiAoInRocmVhZCAlZCBzbGVlcGluZ1xuIiwgdGlkKTsqLworI3ByYWdtYSBvbXAgZmx1c2gobWF4aXRlcixub3RvdXQpCQorCXdoaWxlIChub3RvdXQgJiYgKGNvdW50IDwgTUFYX1RJTUUpICYmIChtYXhpdGVyID09IGopKQorCXsKKyNwcmFnbWEgb21wIGZsdXNoKG1heGl0ZXIsbm90b3V0KQorCSAgbXlfc2xlZXAgKFNMRUVQVElNRSk7CisJICBjb3VudCArPSBTTEVFUFRJTUU7CisjaWZkZWYgVkVSQk9TRQorCSAgcHJpbnRmKCIuIik7CisjZW5kaWYKKwl9CisjaWZkZWYgVkVSQk9TRQorCWlmIChjb3VudCA+IDAuKSBwcmludGYoIiB3YWl0ZWQgJWxmIHNcbiIsIGNvdW50KTsKKyNlbmRpZgorCS8qcHJpbnRmICgidGhyZWFkICVkIGF3YWtlXG4iLCB0aWQpOyovCisJdGlkc1tqXSA9IHRpZDsKKyNpZmRlZiBWRVJCT1NFCisJcHJpbnRmKCIlZCBmaW5pc2hlZCBieSAlZFxuIixqLHRpZCk7CisjZW5kaWYKKyAgICAgIH0JLyogZW5kIG9mIGZvciAqLworCisgICAgICBub3RvdXQgPSAwOworI3ByYWdtYSBvbXAgZmx1c2gobWF4aXRlcixub3RvdXQpCisgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICB9CS8qIGVuZCBvZiBwYXJhbGxlbCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZXZhbHVhdGlvbiBvZiB0aGUgdmFsdWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCXsKKwkgIGludCBkZXRlcm1pbmVkX2NodW5rc2l6ZSA9IDE7CisJICBpbnQgbGFzdF90aHJlYWRuciA9IHRpZHNbMF07CisJICBpbnQgZ2xvYmFsX2NodW5rbnIgPSAwOworCSAgaW50IGxvY2FsX2NodW5rbnJbTlVNQkVSX09GX1RIUkVBRFNdOworCSAgaW50IG9wZW53b3JrID0gQ0ZTTUFYX1NJWkU7CisJICBpbnQgZXhwZWN0ZWRfY2h1bmtfc2l6ZTsKKwkgIGRvdWJsZSBjID0gMTsKKworCSAgZm9yIChpID0gMDsgaSA8IE5VTUJFUl9PRl9USFJFQURTOyBpKyspCisJCWxvY2FsX2NodW5rbnJbaV0gPSAwOworCisJICB0aWRzW0NGU01BWF9TSVpFXSA9IC0xOworCisgICAgICAvKgorCSAgICogZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgZ2xvYmFsIGNodW5rcworCSAgICovCisJICAvKmZwcmludGYobG9nRmlsZSwiIyBnbG9iYWxfY2h1bmtuciB0aHJlYWQgbG9jYWxfY2h1bmtuciBjaHVua3NpemVcbiIpOyAqLworCSAgZm9yKGkgPSAxOyBpIDw9IENGU01BWF9TSVpFOyArK2kpCisJICB7CisJCWlmIChsYXN0X3RocmVhZG5yPT10aWRzW2ldKSB7IAorCQkgIGRldGVybWluZWRfY2h1bmtzaXplKys7IAorCQl9CisJCWVsc2UKKwkJeworCQkgIC8qIGZwcmludGYgKGxvZ0ZpbGUsICIlZFx0JWRcdCVkXHQlZFxuIiwgZ2xvYmFsX2NodW5rbnIsbGFzdF90aHJlYWRuciwgbG9jYWxfY2h1bmtucltsYXN0X3RocmVhZG5yXSwgbSk7ICovCisJCSAgZ2xvYmFsX2NodW5rbnIrKzsKKwkJICBsb2NhbF9jaHVua25yW2xhc3RfdGhyZWFkbnJdKys7CisJCSAgbGFzdF90aHJlYWRuciA9IHRpZHNbaV07CisJCSAgZGV0ZXJtaW5lZF9jaHVua3NpemUgPSAxOworCQl9CisJICB9CisJICAvKiBub3cgYWxsb2NhdGUgdGhlIG1lbW9yeSBmb3Igc2F2aW5nIHRoZSBzaXplcyBvZiB0aGUgZ2xvYmFsIGNodW5rcyAqLworCSAgY2h1bmtzaXplcyA9IChpbnQqKW1hbGxvYyhnbG9iYWxfY2h1bmtuciAqIHNpemVvZihpbnQpKTsKKworICAgICAgLyoKKwkgICAqIEV2YWx1YXRlIHRoZSBzaXplcyBvZiB0aGUgZ2xvYmFsIGNodW5rcworCSAgICovCisJICBnbG9iYWxfY2h1bmtuciA9IDA7CisJICBkZXRlcm1pbmVkX2NodW5rc2l6ZSA9IDE7CisJICBsYXN0X3RocmVhZG5yID0gdGlkc1swXTsJICAgIAorCSAgZm9yIChpID0gMTsgaSA8PSBDRlNNQVhfU0laRTsgKytpKQorCSAgeworCQkvKiBJZiB0aGUgdGhyZWFkbnVtYmVyIHdhcyB0aGUgc2FtZSBhcyBiZWZvcmUgaW5jcmVhc2UgdGhlIGRldGVjdGVkIGNodW5rc2l6ZSBmb3IgdGhpcyBjaHVuaworCQkgKiBvdGhlcndpc2Ugc2V0IHRoZSBkZXRlY3RlZCBjaHVua3NpemUgYWdhaW4gdG8gb25lIGFuZCBzYXZlIHRoZSBudW1iZXIgb2YgdGhlIG5leHQgdGhyZWFkIGluIGxhc3RfdGhyZWFkbnIuIAorCQkgKi8KKwkJaWYgKGxhc3RfdGhyZWFkbnIgPT0gdGlkc1tpXSkgeyAKKwkJICBkZXRlcm1pbmVkX2NodW5rc2l6ZSsrOyAKKwkJfQorCQllbHNlIHsKKwkJICBjaHVua3NpemVzW2dsb2JhbF9jaHVua25yXSA9IGRldGVybWluZWRfY2h1bmtzaXplOworCQkgIGdsb2JhbF9jaHVua25yKys7CisJCSAgbG9jYWxfY2h1bmtucltsYXN0X3RocmVhZG5yXSsrOworCQkgIGxhc3RfdGhyZWFkbnIgPSB0aWRzW2ldOworCQkgIGRldGVybWluZWRfY2h1bmtzaXplID0gMTsKKwkJfQorCSAgfQorCisjaWZkZWYgVkVSQk9TRQorCSAgZnByaW50ZiAobG9nRmlsZSwgImZvdW5kXHRleHBlY3RlZFx0Y29uc3RhbnRcbiIpOworI2VuZGlmCisKKwkgIC8qIGlkZW50aWZ5IHRoZSBjb25zdGFudCBjIGZvciB0aGUgZXhwb25lbnRpYWwgZGVjcmVhc2Ugb2YgdGhlIGNodW5rc2l6ZSAqLworCSAgZXhwZWN0ZWRfY2h1bmtfc2l6ZSA9IG9wZW53b3JrIC8gdGhyZWFkczsKKwkgIGMgPSAoZG91YmxlKSBjaHVua3NpemVzWzBdIC8gZXhwZWN0ZWRfY2h1bmtfc2l6ZTsKKwkgIAorCSAgZm9yIChpID0gMDsgaSA8IGdsb2JhbF9jaHVua25yOyBpKyspCisJICB7CisJCS8qIGNhbGN1bGF0ZSB0aGUgbmV3IGV4cGVjdGVkIGNodW5rc2l6ZSAqLworCQlpZiAoZXhwZWN0ZWRfY2h1bmtfc2l6ZSA+IDEpIAorCQkgIGV4cGVjdGVkX2NodW5rX3NpemUgPSBjICogb3BlbndvcmsgLyB0aHJlYWRzOworCQkKKyNpZmRlZiBWRVJCT1NFCisJCWZwcmludGYgKGxvZ0ZpbGUsICIlOGRcdCU4ZFx0JWxmXG4iLCBjaHVua3NpemVzW2ldLCBleHBlY3RlZF9jaHVua19zaXplLCBjICogY2h1bmtzaXplc1tpXS9leHBlY3RlZF9jaHVua19zaXplKTsKKyNlbmRpZgorCQkKKwkJLyogY2hlY2sgaWYgY2h1bmtzaXplIGlzIGluc2lkZSB0aGUgcm91bmRpbmcgZXJyb3JzICovCisJCWlmIChhYnMgKGNodW5rc2l6ZXNbaV0gLSBleHBlY3RlZF9jaHVua19zaXplKSA+PSAyKSB7CisJCSAgcmVzdWx0ID0gMDsKKyNpZm5kZWYgVkVSQk9TRQorCQkgIGZwcmludGYgKGxvZ0ZpbGUsICJDaHVua3NpemUgZGlmZmVyZWQgZnJvbSBleHBlY3RlZCB2YWx1ZTogJWQgaW5zdGVhZCBvZiAlZFxuIiwgY2h1bmtzaXplc1tpXSwgZXhwZWN0ZWRfY2h1bmtfc2l6ZSk7CisJCSAgcmV0dXJuIDA7CisjZW5kaWYKKwkJfSAvKiBlbmQgaWYgKi8KKworI2lmbmRlZiBWRVJCT1NFCisJCWlmIChleHBlY3RlZF9jaHVua19zaXplIC0gY2h1bmtzaXplc1tpXSA8IDAgKQorCQkgIGZwcmludGYgKGxvZ0ZpbGUsICJDaHVua3NpemUgZGlkIG5vdCBkZWNyZWFzZTogJWQgaW5zdGVhZCBvZiAlZFxuIiwgY2h1bmtzaXplc1tpXSxleHBlY3RlZF9jaHVua19zaXplKTsKKyNlbmRpZgorCisJCS8qIGNhbGN1bGF0aW5nIHRoZSByZW1haW5pbmcgYW1vdW50IG9mIHdvcmsgKi8KKwkJb3BlbndvcmsgLT0gY2h1bmtzaXplc1tpXTsKKwkgIH0JCisJfQorICAgIHJldHVybiByZXN1bHQ7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgorCmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZm9yX3NjaGVkdWxlX3N0YXRpYy5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2Zvcl9zY2hlZHVsZV9zdGF0aWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzFkN2Q0Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2Zvcl9zY2hlZHVsZV9zdGF0aWMuYwpAQCAtMCwwICsxLDE2NSBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBzdGF0aWMgb3B0aW9uIG9mIHRoZSBvbXAgZm9yIHNjaGVkdWxlIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIGZvciBzY2hlZHVsZShzdGF0aWMpPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGZvciBub3dhaXQsb21wIGZsdXNoLG9tcCBjcml0aWNhbCxvbXAgc2luZ2xlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorI2luY2x1ZGUgIm9tcF9teV9zbGVlcC5oIgorCisjZGVmaW5lIE5VTUJFUl9PRl9USFJFQURTIDEwCisjZGVmaW5lIENGU01BWF9TSVpFIDEwMDAKKyNkZWZpbmUgTUFYX1RJTUUgMC4wMQorCisjaWZkZWYgU0xFRVBUSU1FCisjdW5kZWYgU0xFRVBUSU1FCisjZGVmaW5lIFNMRUVQVElNRSAwLjAwMDUKKyNlbmRpZgorCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9mb3Jfc2NoZWR1bGVfc3RhdGljPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+IChGSUxFICogbG9nRmlsZSkKK3sKKyAgaW50IHRocmVhZHM7CisgIGludCBpLGxhc3R0aWQ7CisgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgaW50ICogdGlkczsKKyAgaW50IG5vdG91dDsKKyAgaW50IG1heGl0ZXI7CisgIGludCBjaHVua19zaXplOworICA8L29tcHRzOm9ycGhhbjp2YXJzPgorICBpbnQgY291bnRlciA9IDA7CisgIGludCB0bXBfY291bnQ9MTsKKyAgaW50IGxhc3R0aHJlYWRzc3RhcnR0aWQgPSAtMTsKKyAgaW50IHJlc3VsdCA9IDE7CisgIGNodW5rX3NpemUgPSA3OworCisgIHRpZHMgPSAoaW50ICopIG1hbGxvYyAoc2l6ZW9mIChpbnQpICogKENGU01BWF9TSVpFICsgMSkpOworICBub3RvdXQgPSAxOworICBtYXhpdGVyID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2hhcmVkKHRpZHMsY291bnRlcikKKyAgewkvKiBiZWdpbiBvZiBwYXJhbGxlbCovCisjcHJhZ21hIG9tcCBzaW5nbGUKKyAgICB7CisgICAgICB0aHJlYWRzID0gb21wX2dldF9udW1fdGhyZWFkcyAoKTsKKyAgICB9CS8qIGVuZCBvZiBzaW5nbGUgKi8KKyAgfQkvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKworICBpZiAodGhyZWFkcyA8IDIpCisgIHsKKyAgICBwcmludGYgKCJUaGlzIHRlc3Qgb25seSB3b3JrcyB3aXRoIGF0IGxlYXN0IHR3byB0aHJlYWRzIik7CisgICAgZnByaW50ZiAobG9nRmlsZSwiVGhpcyB0ZXN0IG9ubHkgd29ya3Mgd2l0aCBhdCBsZWFzdCB0d28gdGhyZWFkcyIpOworICAgIHJldHVybiAwOworICB9CisgIGVsc2UgCisgIHsKKyAgICBmcHJpbnRmIChsb2dGaWxlLCJVc2luZyBhbiBpbnRlcm5hbCBjb3VudCBvZiAlZFxuVXNpbmcgYSBzcGVjaWZpZWQgY2h1bmtzaXplIG9mICVkXG4iLCBDRlNNQVhfU0laRSwgY2h1bmtfc2l6ZSk7CisgICAgdGlkc1tDRlNNQVhfU0laRV0gPSAtMTsJLyogc2V0dGluZyBlbmRmbGFnICovCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBzaGFyZWQodGlkcykKKyAgICB7CS8qIGJlZ2luIG9mIHBhcmFsbGVsICovCisgICAgICA8b21wdHM6b3JwaGFuPgorCWRvdWJsZSBjb3VudDsKKyAgICAgIGludCB0aWQ7CisgICAgICBpbnQgajsKKworICAgICAgdGlkID0gb21wX2dldF90aHJlYWRfbnVtICgpOworCisjcHJhZ21hIG9tcCBmb3Igbm93YWl0IDxvbXB0czpjaGVjaz5zY2hlZHVsZShzdGF0aWMsY2h1bmtfc2l6ZSk8L29tcHRzOmNoZWNrPgorICAgICAgZm9yKGogPSAwOyBqIDwgQ0ZTTUFYX1NJWkU7ICsraikKKyAgICAgIHsKKwljb3VudCA9IDAuOworI3ByYWdtYSBvbXAgZmx1c2gobWF4aXRlcikKKwlpZiAoaiA+IG1heGl0ZXIpCisJeworI3ByYWdtYSBvbXAgY3JpdGljYWwKKwkgIHsKKwkgICAgbWF4aXRlciA9IGo7CisJICB9CS8qIGVuZCBvZiBjcml0aWNhbCAqLyAKKwl9CisJLypwcmludGYgKCJ0aHJlYWQgJWQgc2xlZXBpbmdcbiIsIHRpZCk7Ki8KKwl3aGlsZSAobm90b3V0ICYmIChjb3VudCA8IE1BWF9USU1FKSAmJiAobWF4aXRlciA9PSBqKSkKKwl7CisjcHJhZ21hIG9tcCBmbHVzaChtYXhpdGVyLG5vdG91dCkKKwkgIG15X3NsZWVwIChTTEVFUFRJTUUpOworCSAgY291bnQgKz0gU0xFRVBUSU1FOworCSAgcHJpbnRmKCIuIik7CisJfQorI2lmZGVmIFZFUkJPU0UKKwlpZiAoY291bnQgPiAwLikgcHJpbnRmKCIgd2FpdGVkICVsZiBzXG4iLCBjb3VudCk7CisjZW5kaWYKKwkvKnByaW50ZiAoInRocmVhZCAlZCBhd2FrZVxuIiwgdGlkKTsqLworCXRpZHNbal0gPSB0aWQ7CisjaWZkZWYgVkVSQk9TRQorCXByaW50ZigiJWQgZmluaXNoZWQgYnkgJWRcbiIsaix0aWQpOworI2VuZGlmCisgICAgICB9CS8qIGVuZCBvZiBmb3IgKi8KKworICAgICAgbm90b3V0ID0gMDsKKyNwcmFnbWEgb21wIGZsdXNoKG1heGl0ZXIsbm90b3V0KQorICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgfQkvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKworICAgIC8qKioqIGFuYWx5c2luZyB0aGUgZGF0YSBpbiBhcnJheSB0aWRzICoqKiovCisKKyAgICBsYXN0dGlkID0gdGlkc1swXTsKKyAgICB0bXBfY291bnQgPSAwOyAKKworICAgIGZvciAoaSA9IDA7IGkgPCBDRlNNQVhfU0laRSArIDE7ICsraSkKKyAgICB7CisgICAgICAvKiBJZiB0aGUgd29yayAgd2FzIGRvbmUgYnkgdGhlIHNhbWUgdGhyZWFkIGluY3JlYXNlIHRtcF9jb3VudCBieSBvbmUuICovCisgICAgICBpZiAodGlkc1tpXSA9PSBsYXN0dGlkKSB7CisJdG1wX2NvdW50Kys7CisjaWZkZWYgVkVSQk9TRQorCWZwcmludGYgKGxvZ0ZpbGUsICIlZDogJWQgXG4iLCBpLCB0aWRzW2ldKTsKKyNlbmRpZgorCWNvbnRpbnVlOworICAgICAgfQorCisgICAgICAvKiBDaGVjayBpZiB0aGUgbmV4dCB0aHJlYWQgaGFkIGhhcyB0aGUgcmlnaHQgdGhyZWFkIG51bWJlci4gV2hlbiBmaW5kaW5nIAorICAgICAgICogdGhyZWFkbnVtYmVyIC0xIHRoZSBlbmQgc2hvdWxkIGJlIHJlYWNoZWQuIAorICAgICAgICovCSAgCisgICAgICBpZiAodGlkc1tpXSA9PSAobGFzdHRpZCArIDEpICUgdGhyZWFkcyB8fCB0aWRzW2ldID09IC0xKSB7CisJLyogY2hlY2tpbmcgZm9yIHRoZSByaWdodCBjaHVuayBzaXplICovCisJaWYgKHRtcF9jb3VudCA9PSBjaHVua19zaXplKSB7CisJICB0bXBfY291bnQgPSAxOworCSAgbGFzdHRpZCA9IHRpZHNbaV07CisjaWZkZWYgVkVSQk9TRQorCSAgZnByaW50ZiAobG9nRmlsZSwgIk9LXG4iKTsKKyNlbmRpZgorCX0KKwkvKiBJZiB0aGUgY2h1bmsgc2l6ZSB3YXMgd3JvbmcsIGNoZWNrIGlmIHRoZSBlbmQgd2FzIHJlYWNoZWQgKi8KKwllbHNlIHsKKwkgIGlmICh0aWRzW2ldID09IC0xKSB7CisJICAgIGlmIChpID09IENGU01BWF9TSVpFKSB7CisJICAgICAgZnByaW50ZiAobG9nRmlsZSwgIkxhc3QgdGhyZWFkIGhhZCBjaHVuayBzaXplICVkXG4iLCB0bXBfY291bnQpOworCSAgICAgIGJyZWFrOworCSAgICB9CisJICAgIGVsc2UgeworCSAgICAgIGZwcmludGYgKGxvZ0ZpbGUsICJFUlJPUjogTGFzdCB0aHJlYWQgKHRocmVhZCB3aXRoIG51bWJlciAtMSkgd2FzIGZvdW5kIGJlZm9yZSB0aGUgZW5kLlxuIik7CisJICAgICAgcmVzdWx0ID0gMDsKKwkgICAgfQorCSAgfQorCSAgZWxzZSB7CisJICAgIGZwcmludGYgKGxvZ0ZpbGUsICJFUlJPUjogY2h1bmsgc2l6ZSB3YXMgJWQuIChhc3NpZ25lZCB3YXMgJWQpXG4iLCB0bXBfY291bnQsIGNodW5rX3NpemUpOworCSAgICByZXN1bHQgPSAwOworCSAgfQorCX0KKyAgICAgIH0KKyAgICAgIGVsc2UgeworCWZwcmludGYobG9nRmlsZSwgIkVSUk9SOiBGb3VuZCB0aHJlYWQgd2l0aCBudW1iZXIgJWQgKHNob3VsZCBiZSBpbmJldHdlZW4gMCBhbmQgJWQpLiIsIHRpZHNbaV0sIHRocmVhZHMgLSAxKTsKKwlyZXN1bHQgPSAwOworICAgICAgfQorI2lmZGVmIFZFUkJPU0UKKyAgICAgIGZwcmludGYgKGxvZ0ZpbGUsICIlZDogJWQgXG4iLCBpLCB0aWRzW2ldKTsKKyNlbmRpZgorICAgIH0KKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2Zvcl9zY2hlZHVsZV9zdGF0aWNfMy5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2Zvcl9zY2hlZHVsZV9zdGF0aWNfMy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyODY2N2YKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZm9yX3NjaGVkdWxlX3N0YXRpY18zLmMKQEAgLTAsMCArMSwyMTIgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgc3RhdGljIG9wdGlvbiBvZiB0aGUgb21wIGZvciBzY2hlZHVsZSBkaXJlY3RpdmUgY29uc2lkZXJpbmcgdGhlIHNwZWNpZmljYXRpb25zIGZvciB0aGUgY2h1bmsgZGlzdHJpYnV0aW9uIG9mIHNldmVyYWwgbG9vcCByZWdpb25zIGlzIHRoZSBzYW1lIGFzIHNwZWNpZmllZCBpbiB0aGUgT3BlbiBNUCBzdGFuZGFyZCB2ZXJzaW9uIDMuMC48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjMuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIGZvciBzY2hlZHVsZShzdGF0aWMpPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGZvciBub3dhaXQsb21wIGZsdXNoLG9tcCBjcml0aWNhbCxvbXAgc2luZ2xlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorI2luY2x1ZGUgIm9tcF9teV9zbGVlcC5oIgorCisjZGVmaW5lIE5VTUJFUl9PRl9USFJFQURTIDEwCisjZGVmaW5lIENGU01BWF9TSVpFIDEwMDAKKyNkZWZpbmUgTUFYX1RJTUUgMC4wMQorCisjaWZkZWYgU0xFRVBUSU1FCisjdW5kZWYgU0xFRVBUSU1FCisjZGVmaW5lIFNMRUVQVElNRSAwLjAwMDUKKyNlbmRpZgorCisjZGVmaW5lIFZFUkJPU0UgMAorCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9mb3Jfc2NoZWR1bGVfc3RhdGljXzM8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4gKEZJTEUgKiBsb2dGaWxlKQoreworICBpbnQgdGhyZWFkczsKKyAgaW50IGksbGFzdHRpZDsKKyAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICBpbnQgKiB0aWRzOworICBpbnQgKiB0aWRzMjsKKyAgaW50IG5vdG91dDsKKyAgaW50IG1heGl0ZXI7CisgIGludCBjaHVua19zaXplOworICA8L29tcHRzOm9ycGhhbjp2YXJzPgorICBpbnQgY291bnRlciA9IDA7CisgIGludCB0bXBfY291bnQ9MTsKKyAgaW50IGxhc3R0aHJlYWRzc3RhcnR0aWQgPSAtMTsKKyAgaW50IHJlc3VsdCA9IDE7CisgIGNodW5rX3NpemUgPSA3OworCisgIHRpZHMgPSAoaW50ICopIG1hbGxvYyAoc2l6ZW9mIChpbnQpICogKENGU01BWF9TSVpFICsgMSkpOworICBub3RvdXQgPSAxOworICBtYXhpdGVyID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2hhcmVkKHRpZHMsY291bnRlcikKKyAgewkvKiBiZWdpbiBvZiBwYXJhbGxlbCovCisjcHJhZ21hIG9tcCBzaW5nbGUKKyAgICB7CisgICAgICB0aHJlYWRzID0gb21wX2dldF9udW1fdGhyZWFkcyAoKTsKKyAgICB9CS8qIGVuZCBvZiBzaW5nbGUgKi8KKyAgfQkvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKworICBpZiAodGhyZWFkcyA8IDIpCisgIHsKKyAgICBwcmludGYgKCJUaGlzIHRlc3Qgb25seSB3b3JrcyB3aXRoIGF0IGxlYXN0IHR3byB0aHJlYWRzIik7CisgICAgZnByaW50ZiAobG9nRmlsZSwiVGhpcyB0ZXN0IG9ubHkgd29ya3Mgd2l0aCBhdCBsZWFzdCB0d28gdGhyZWFkcyIpOworICAgIHJldHVybiAwOworICB9CisgIGVsc2UgCisgIHsKKyAgICBmcHJpbnRmIChsb2dGaWxlLCJVc2luZyBhbiBpbnRlcm5hbCBjb3VudCBvZiAlZFxuVXNpbmcgYSBzcGVjaWZpZWQgY2h1bmtzaXplIG9mICVkXG4iLCBDRlNNQVhfU0laRSwgY2h1bmtfc2l6ZSk7CisgICAgdGlkc1tDRlNNQVhfU0laRV0gPSAtMTsJLyogc2V0dGluZyBlbmRmbGFnICovCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBzaGFyZWQodGlkcykKKyAgICB7CS8qIGJlZ2luIG9mIHBhcmFsbGVsICovCisgICAgICA8b21wdHM6b3JwaGFuPgorCWRvdWJsZSBjb3VudDsKKyAgICAgIGludCB0aWQ7CisgICAgICBpbnQgajsKKworICAgICAgdGlkID0gb21wX2dldF90aHJlYWRfbnVtICgpOworCisjcHJhZ21hIG9tcCBmb3Igbm93YWl0IDxvbXB0czpjaGVjaz5zY2hlZHVsZShzdGF0aWMsY2h1bmtfc2l6ZSk8L29tcHRzOmNoZWNrPgorICAgICAgZm9yKGogPSAwOyBqIDwgQ0ZTTUFYX1NJWkU7ICsraikKKyAgICAgIHsKKwljb3VudCA9IDAuOworI3ByYWdtYSBvbXAgZmx1c2gobWF4aXRlcikKKwlpZiAoaiA+IG1heGl0ZXIpCisJeworI3ByYWdtYSBvbXAgY3JpdGljYWwKKwkgIHsKKwkgICAgbWF4aXRlciA9IGo7CisJICB9CS8qIGVuZCBvZiBjcml0aWNhbCAqLyAKKwl9CisJLypwcmludGYgKCJ0aHJlYWQgJWQgc2xlZXBpbmdcbiIsIHRpZCk7Ki8KKwl3aGlsZSAobm90b3V0ICYmIChjb3VudCA8IE1BWF9USU1FKSAmJiAobWF4aXRlciA9PSBqKSkKKwl7CisjcHJhZ21hIG9tcCBmbHVzaChtYXhpdGVyLG5vdG91dCkKKwkgIG15X3NsZWVwIChTTEVFUFRJTUUpOworCSAgY291bnQgKz0gU0xFRVBUSU1FOworCSAgcHJpbnRmKCIuIik7CisJfQorI2lmZGVmIFZFUkJPU0UKKwlpZiAoY291bnQgPiAwLikgcHJpbnRmKCIgd2FpdGVkICVsZiBzXG4iLCBjb3VudCk7CisjZW5kaWYKKwkvKnByaW50ZiAoInRocmVhZCAlZCBhd2FrZVxuIiwgdGlkKTsqLworCXRpZHNbal0gPSB0aWQ7CisjaWZkZWYgVkVSQk9TRQorCXByaW50ZigiJWQgZmluaXNoZWQgYnkgJWRcbiIsaix0aWQpOworI2VuZGlmCisgICAgICB9CS8qIGVuZCBvZiBmb3IgKi8KKworICAgICAgbm90b3V0ID0gMDsKKyNwcmFnbWEgb21wIGZsdXNoKG1heGl0ZXIsbm90b3V0KQorICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgfQkvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKworICAgIC8qKioqIGFuYWx5c2luZyB0aGUgZGF0YSBpbiBhcnJheSB0aWRzICoqKiovCisKKyAgICBsYXN0dGlkID0gdGlkc1swXTsKKyAgICB0bXBfY291bnQgPSAwOyAKKworICAgIGZvciAoaSA9IDA7IGkgPCBDRlNNQVhfU0laRSArIDE7ICsraSkKKyAgICB7CisgICAgICAvKiBJZiB0aGUgd29yayAgd2FzIGRvbmUgYnkgdGhlIHNhbWUgdGhyZWFkIGluY3JlYXNlIHRtcF9jb3VudCBieSBvbmUuICovCisgICAgICBpZiAodGlkc1tpXSA9PSBsYXN0dGlkKSB7CisJdG1wX2NvdW50Kys7CisjaWZkZWYgVkVSQk9TRQorCWZwcmludGYgKGxvZ0ZpbGUsICIlZDogJWQgXG4iLCBpLCB0aWRzW2ldKTsKKyNlbmRpZgorCWNvbnRpbnVlOworICAgICAgfQorCisgICAgICAvKiBDaGVjayBpZiB0aGUgbmV4dCB0aHJlYWQgaGFkIGhhcyB0aGUgcmlnaHQgdGhyZWFkIG51bWJlci4gV2hlbiBmaW5kaW5nIAorICAgICAgICogdGhyZWFkbnVtYmVyIC0xIHRoZSBlbmQgc2hvdWxkIGJlIHJlYWNoZWQuIAorICAgICAgICovCSAgCisgICAgICBpZiAodGlkc1tpXSA9PSAobGFzdHRpZCArIDEpICUgdGhyZWFkcyB8fCB0aWRzW2ldID09IC0xKSB7CisJLyogY2hlY2tpbmcgZm9yIHRoZSByaWdodCBjaHVuayBzaXplICovCisJaWYgKHRtcF9jb3VudCA9PSBjaHVua19zaXplKSB7CisJICB0bXBfY291bnQgPSAxOworCSAgbGFzdHRpZCA9IHRpZHNbaV07CisjaWZkZWYgVkVSQk9TRQorCSAgZnByaW50ZiAobG9nRmlsZSwgIk9LXG4iKTsKKyNlbmRpZgorCX0KKwkvKiBJZiB0aGUgY2h1bmsgc2l6ZSB3YXMgd3JvbmcsIGNoZWNrIGlmIHRoZSBlbmQgd2FzIHJlYWNoZWQgKi8KKwllbHNlIHsKKwkgIGlmICh0aWRzW2ldID09IC0xKSB7CisJICAgIGlmIChpID09IENGU01BWF9TSVpFKSB7CisJICAgICAgZnByaW50ZiAobG9nRmlsZSwgIkxhc3QgdGhyZWFkIGhhZCBjaHVuayBzaXplICVkXG4iLCB0bXBfY291bnQpOworCSAgICAgIGJyZWFrOworCSAgICB9CisJICAgIGVsc2UgeworCSAgICAgIGZwcmludGYgKGxvZ0ZpbGUsICJFUlJPUjogTGFzdCB0aHJlYWQgKHRocmVhZCB3aXRoIG51bWJlciAtMSkgd2FzIGZvdW5kIGJlZm9yZSB0aGUgZW5kLlxuIik7CisJICAgICAgcmVzdWx0ID0gMDsKKwkgICAgfQorCSAgfQorCSAgZWxzZSB7CisJICAgIGZwcmludGYgKGxvZ0ZpbGUsICJFUlJPUjogY2h1bmsgc2l6ZSB3YXMgJWQuIChhc3NpZ25lZCB3YXMgJWQpXG4iLCB0bXBfY291bnQsIGNodW5rX3NpemUpOworCSAgICByZXN1bHQgPSAwOworCSAgfQorCX0KKyAgICAgIH0KKyAgICAgIGVsc2UgeworCWZwcmludGYobG9nRmlsZSwgIkVSUk9SOiBGb3VuZCB0aHJlYWQgd2l0aCBudW1iZXIgJWQgKHNob3VsZCBiZSBpbmJldHdlZW4gMCBhbmQgJWQpLiIsIHRpZHNbaV0sIHRocmVhZHMgLSAxKTsKKwlyZXN1bHQgPSAwOworICAgICAgfQorI2lmZGVmIFZFUkJPU0UKKyAgICAgIGZwcmludGYgKGxvZ0ZpbGUsICIlZDogJWQgXG4iLCBpLCB0aWRzW2ldKTsKKyNlbmRpZgorICAgIH0KKyAgfQorCisgIC8qIE5vdyB3ZSBjaGVjayBpZiBzZXZlcmFsIGxvb3AgcmVnaW9ucyBpbiBvbmUgcGFyYWxsZWwgcmVnaW9uIGhhdmUgdGhlIHNhbWUgCisgICAqIGxvZ2ljYWwgYXNzaWduZW1lbnQgb2YgY2h1bmtzIHRvIHRocmVhZHMuCisgICAqIFdlIHVzZSB0aGUgbm93YWl0IGNsYXVzZSB0byBpbmNyZWFzZSB0aGUgcHJvYmFiaWxpdHkgdG8gZ2V0IGFuIGVycm9yLiAqLworCisgIC8qIEZpcnN0IHdlIGFsbG9jYXRlIHNvbWUgbW9yZSBtZW1tb3J5ICovCisgZnJlZSAodGlkcyk7CisgIHRpZHMgPSAoaW50ICopIG1hbGxvYyAoc2l6ZW9mIChpbnQpICogTE9PUENPVU5UKTsKKyAgdGlkczIgPSAoaW50ICopIG1hbGxvYyAoc2l6ZW9mIChpbnQpICogTE9PUENPVU5UKTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisgIHsKKyAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICB7CisgICAgICAgICAgaW50IG47CisjcHJhZ21hIG9tcCBmb3IgPG9tcHRzOmNoZWNrPnNjaGVkdWxlKHN0YXRpYyk8L29tcHRzOmNoZWNrPiBub3dhaXQKKyAgICAgICAgICBmb3IgKG4gPSAwOyBuIDwgTE9PUENPVU5UOyBuKyspCisgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoTE9PUENPVU5UID09IG4gKyAxICkKKyAgICAgICAgICAgICAgICAgIG15X3NsZWVwKFNMRUVQVElNRSk7CisKKyAgICAgICAgICAgICAgdGlkc1tuXSA9IG9tcF9nZXRfdGhyZWFkX251bSgpOworICAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgIHsKKyAgICAgICAgICBpbnQgbTsKKyNwcmFnbWEgb21wIGZvciA8b21wdHM6Y2hlY2s+c2NoZWR1bGUoc3RhdGljKTwvb21wdHM6Y2hlY2s+IG5vd2FpdAorICAgICAgICAgIGZvciAobSA9IDE7IG0gPD0gTE9PUENPVU5UOyBtKyspCisgICAgICAgICAgeworICAgICAgICAgICAgICB0aWRzMlttLTFdID0gb21wX2dldF90aHJlYWRfbnVtKCk7CisgICAgICAgICAgfQorICAgICAgfQorICAgICAgPC9vbXB0czpvcnBoYW4+CisgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyBpKyspCisgICAgICBpZiAodGlkc1tpXSAhPSB0aWRzMltpXSkgeworICAgICAgICAgIGZwcmludGYgKGxvZ0ZpbGUsICJDaHVuayBuby4gJWQgd2FzIGFzc2lnbmVkIG9uY2UgdG8gdGhyZWFkICVkIGFuZCBsYXRlciB0byB0aHJlYWQgJWQuXG4iLCBpLCB0aWRzW2ldLHRpZHMyW2ldKTsKKyAgICAgICAgICByZXN1bHQgPSAwOworICAgICAgfQorCisgIGZyZWUgKHRpZHMpOworICBmcmVlICh0aWRzMik7CisgIHJldHVybiByZXN1bHQ7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2dldF9udW1fdGhyZWFkcy5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2dldF9udW1fdGhyZWFkcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiMDkyYmEKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZ2V0X251bV90aHJlYWRzLmMKQEAgLTAsMCArMSwzOSBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoYXQgdGhlIG9tcF9nZXRfbnVtX3RocmVhZHMgcmV0dXJucyB0aGUgY29ycmVjdCBudW1iZXIgb2YgdGhyZWFkcy4gVGhlcmVmb3IgaXQgY291bnRzIHVwIGEgdmFyaWFibGUgaW4gYSBwYXJhbGxlbGl6ZWQgc2VjdGlvbiBhbmQgY29tcGFycyB0aGlzIHZhbHVlIHdpdGggdGhlIHJlc3VsdCBvZiB0aGUgb21wX2dldF9udW1fdGhyZWFkcyBmdW5jdGlvbi48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wX2dldF9udW1fdGhyZWFkczwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9nZXRfbnVtX3RocmVhZHM8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4gKEZJTEUgKiBsb2dGaWxlKQoreworICAgIC8qIGNoZWNrcyB0aGF0IG9tcF9nZXRfbnVtX3RocmVhZHMgaXMgZXF1YWwgdG8gdGhlIG51bWJlciBvZgorICAgICAgIHRocmVhZHMgKi8KKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisJaW50IG50aHJlYWRzX2xpYjsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorICAgIGludCBudGhyZWFkcyA9IDA7CisKKyAgICBudGhyZWFkc19saWIgPSAtMTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisgICAgeworI3ByYWdtYSBvbXAgY3JpdGljYWwKKwl7CisJICAgIG50aHJlYWRzKys7CisJfQkvKiBlbmQgb2YgY3JpdGljYWwgKi8KKyNwcmFnbWEgb21wIHNpbmdsZQorCXsgCis8b21wdHM6b3JwaGFuPgorCSAgICA8b21wdHM6Y2hlY2s+bnRocmVhZHNfbGliID0gb21wX2dldF9udW1fdGhyZWFkcyAoKTs8L29tcHRzOmNoZWNrPgorPC9vbXB0czpvcnBoYW4+CisJfQkvKiBlbmQgb2Ygc2luZ2xlICovCisgICAgfQkvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKworCWZwcmludGYgKGxvZ0ZpbGUsICJDb3VudGVkICVkIHRocmVhZHMuIGdldF9udW1fdGhyZWFkcyByZXR1cm5lZCAlZC5cbiIsIG50aHJlYWRzLCBudGhyZWFkc19saWIpOworICAgIHJldHVybiAobnRocmVhZHMgPT0gbnRocmVhZHNfbGliKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZ2V0X3d0aWNrLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZ2V0X3d0aWNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgyYjU3ZgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9nZXRfd3RpY2suYwpAQCAtMCwwICsxLDI0IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcF9nZXRfd3RpY2sgZnVuY3Rpb24uPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcF9nZXRfd3RpY2s8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9nZXRfd3RpY2s8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpCit7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorCWRvdWJsZSB0aWNrOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgdGljayA9IC0xLjsKKworICAgIDxvbXB0czpvcnBoYW4+CisJPG9tcHRzOmNoZWNrPnRpY2sgPSBvbXBfZ2V0X3d0aWNrICgpOzwvb21wdHM6Y2hlY2s+CisgICAgPC9vbXB0czpvcnBoYW4+CisgICAgZnByaW50ZiAobG9nRmlsZSwgIldvcmsgdG9vayAlbGYgc2VjLiB0aW1lLlxuIiwgdGljayk7CisgICAgcmV0dXJuICgodGljayA+IDAuMCkgJiYgKHRpY2sgPCAwLjAxKSk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2dldF93dGltZS5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2dldF93dGltZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmMDIyNmQKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZ2V0X3d0aW1lLmMKQEAgLTAsMCArMSwzOCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXBfZ2V0X3d0aW1lIGZ1bmN0aW9uLiBJdCBjb21wYXJlcyB0aGUgdGltZSB3aXRoIHdoaWNoIGlzIGNhbGxlZCBhIHNsZWVwIGZ1bmN0aW9uIHdpdGggdGhlIHRpbWUgaXQgdG9vayBieSBtZXNzdXJpbmcgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgY2FsbCBvZiB0aGUgc2xlZXAgZnVuY3Rpb24gYW5kIGl0cyBlbmQuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcF9nZXRfd3RpbWU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlPHN0ZGlvLmg+CisjaW5jbHVkZTxzdGRsaWIuaD4KKyNpbmNsdWRlPHVuaXN0ZC5oPgorCisKKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisjaW5jbHVkZSAib21wX215X3NsZWVwLmgiCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9nZXRfd3RpbWU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpCit7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorCWRvdWJsZSBzdGFydDsKKwlkb3VibGUgZW5kOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgZG91YmxlIG1lYXN1cmVkX3RpbWU7CisgICAgaW50IHdhaXRfdGltZSA9IDE7IAorCisgICAgc3RhcnQgPSAwOworICAgIGVuZCA9IDA7CisKKyAgICA8b21wdHM6b3JwaGFuPgorCTxvbXB0czpjaGVjaz5zdGFydCA9IG9tcF9nZXRfd3RpbWUgKCk7PC9vbXB0czpjaGVjaz4KKyAgICA8L29tcHRzOm9ycGhhbj4KKwlteV9zbGVlcCAod2FpdF90aW1lKTsgCisgICAgPG9tcHRzOm9ycGhhbj4KKwk8b21wdHM6Y2hlY2s+ZW5kID0gb21wX2dldF93dGltZSAoKTs8L29tcHRzOmNoZWNrPgorICAgIDwvb21wdHM6b3JwaGFuPgorCW1lYXN1cmVkX3RpbWUgPSBlbmQtc3RhcnQ7CisgICAgZnByaW50Zihsb2dGaWxlLCAiV29yayB0b29rICVsZiBzZWMuIHRpbWUuXG4iLCBtZWFzdXJlZF90aW1lKTsKKyAgICByZXR1cm4gKChtZWFzdXJlZF90aW1lID4gMC45OSAqIHdhaXRfdGltZSkgJiYgKG1lYXN1cmVkX3RpbWUgPCAxLjAxICogd2FpdF90aW1lKSkgOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9pbl9wYXJhbGxlbC5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2luX3BhcmFsbGVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDliNjExMQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9pbl9wYXJhbGxlbC5jCkBAIC0wLDAgKzEsNTEgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGF0IG9tcF9pbl9wYXJhbGxlbCByZXR1cm5zIGZhbHNlIHdoZW4gY2FsbGVkIGZyb20gYSBzZXJpYWwgcmVnaW9uIGFuZCB0cnVlIHdoZW4gY2FsbGVkIHdpdGhpbiBhIHBhcmFsbGVsIHJlZ2lvbi48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wX2luX3BhcmFsbGVsPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6dGVzdGNvZGU+CisvKgorICogQ2hlY2tzIHRoYXQgZmFsc2UgaXMgcmV0dXJuZWQgd2hlbiBjYWxsZWQgZnJvbSBzZXJpYWwgcmVnaW9uCisgKiBhbmQgdHJ1ZSBpcyByZXR1cm5lZCB3aGVuIGNhbGxlZCB3aXRoaW4gcGFyYWxsZWwgcmVnaW9uLiAKKyAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfaW5fcGFyYWxsZWw8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpeworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKwlpbnQgc2VyaWFsOworCWludCBpc3BhcmFsbGVsOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICBzZXJpYWwgPSAxOworICAgIGlzcGFyYWxsZWwgPSAwOworCisgICAgPG9tcHRzOmNoZWNrPgorCTxvbXB0czpvcnBoYW4+CisJICAgIHNlcmlhbCA9IG9tcF9pbl9wYXJhbGxlbCAoKTsKKwk8L29tcHRzOm9ycGhhbj4KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisjcHJhZ21hIG9tcCBzaW5nbGUKKwl7CisJICAgIDxvbXB0czpvcnBoYW4+CisJCWlzcGFyYWxsZWwgPSBvbXBfaW5fcGFyYWxsZWwgKCk7CisJICAgIDwvb21wdHM6b3JwaGFuPgorCX0KKyAgICB9CisgICAgPC9vbXB0czpjaGVjaz4KKworICAgIDxvbXB0czpjcm9zc2NoZWNrPgorI3ByYWdtYSBvbXAgcGFyYWxsZWwKKwl7CisjcHJhZ21hIG9tcCBzaW5nbGUKKwkgICAgeworCisJICAgIH0KKwl9CisgICAgPC9vbXB0czpjcm9zc2NoZWNrPgorCisJcmV0dXJuICghKHNlcmlhbCkgJiYgaXNwYXJhbGxlbCk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2xvY2suYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9sb2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTUyOWMwNwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9sb2NrLmMKQEAgLTAsMCArMSw0NSBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXBfc2V0X2xvY2sgIGFuZCB0aGUgb21wX3Vuc2V0X2xvY2sgZnVuY3Rpb24gYnkgY291bnRpbmcgdGhlIHRocmVhZHMgZW50ZXJpbmcgYW5kIGV4aXRpbmcgYSBzaW5nbGUgcmVnaW9uIHdpdGggbG9ja3MuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcF9sb2NrPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGZsdXNoPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworb21wX2xvY2tfdCBsY2s7CisgICAgCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfbG9jazwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSkKK3sKKyAgaW50IG5yX3RocmVhZHNfaW5fc2luZ2xlID0gMDsKKyAgaW50IHJlc3VsdCA9IDA7CisgIGludCBucl9pdGVyYXRpb25zID0gMDsKKyAgaW50IGk7CisgIG9tcF9pbml0X2xvY2sgKCZsY2spOworICAKKyNwcmFnbWEgb21wIHBhcmFsbGVsIHNoYXJlZChsY2spCisgIHsKKyAgICAjcHJhZ21hIG9tcCBmb3IKKyAgICBmb3IoaSA9IDA7IGkgPCBMT09QQ09VTlQ7IGkrKykKKyAgICAgIHsKKwk8b21wdHM6b3JwaGFuPgorCSAgICA8b21wdHM6Y2hlY2s+b21wX3NldF9sb2NrICgmbGNrKTs8L29tcHRzOmNoZWNrPgorCTwvb21wdHM6b3JwaGFuPgorI3ByYWdtYSBvbXAgZmx1c2gKKwlucl90aHJlYWRzX2luX3NpbmdsZSsrOworI3ByYWdtYSBvbXAgZmx1c2ggICAgICAgICAgIAorCW5yX2l0ZXJhdGlvbnMrKzsKKwlucl90aHJlYWRzX2luX3NpbmdsZS0tOworCXJlc3VsdCA9IHJlc3VsdCArIG5yX3RocmVhZHNfaW5fc2luZ2xlOworCTxvbXB0czpvcnBoYW4+CisJICAgIDxvbXB0czpjaGVjaz5vbXBfdW5zZXRfbG9jaygmbGNrKTs8L29tcHRzOmNoZWNrPgorCTwvb21wdHM6b3JwaGFuPgorICAgICAgfQorICB9CisgIG9tcF9kZXN0cm95X2xvY2sgKCZsY2spOworICAKKyAgcmV0dXJuICgocmVzdWx0ID09IDApICYmIChucl9pdGVyYXRpb25zID09IExPT1BDT1VOVCkpOworICAKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfbWFzdGVyLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfbWFzdGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RiMmYxZQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9tYXN0ZXIuYwpAQCAtMCwwICsxLDM3IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBtYXN0ZXIgZGlyZWN0aXZlIGJ5IGNvdW50aW5nIHVwIGEgdmFyaWFibGUgaW4gYSBvbXAgbWFzdGVyIHNlY3Rpb24uPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBtYXN0ZXI8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgY3JpdGljYWw8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfbWFzdGVyPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKQoreworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKwlpbnQgbnRocmVhZHM7CisJaW50IGV4ZWN1dGluZ190aHJlYWQ7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgIG50aHJlYWRzID0gMDsKKyAgICBleGVjdXRpbmdfdGhyZWFkID0gLTE7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworCTxvbXB0czpvcnBoYW4+CisJICAgIDxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBtYXN0ZXIgPC9vbXB0czpjaGVjaz4KKwkgICAgeworI3ByYWdtYSBvbXAgY3JpdGljYWwKKwkJeworCQkgICAgbnRocmVhZHMrKzsKKwkJfQorCQlleGVjdXRpbmdfdGhyZWFkID0gb21wX2dldF90aHJlYWRfbnVtICgpOworCisJICAgIH0gLyogZW5kIG9mIG1hc3RlciovCisJPC9vbXB0czpvcnBoYW4+CisgICAgfSAvKiBlbmQgb2YgcGFyYWxsZWwqLworICAgIHJldHVybiAoKG50aHJlYWRzID09IDEpICYmIChleGVjdXRpbmdfdGhyZWFkID09IDApKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfbWFzdGVyXzMuYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9tYXN0ZXJfMy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlOTgxMjkKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfbWFzdGVyXzMuYwpAQCAtMCwwICsxLDQ0IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBtYXN0ZXIgZGlyZWN0aXZlIGJ5IGNvdW50aW5nIHVwIGEgdmFyaWFibGUgaW4gYSBvbXAgbWFzdGVyIHNlY3Rpb24uIEl0IGFsc28gY2hlY2tzIHRoYXQgdGhlIG1hc3RlciB0aHJlYWQgaGFzIHRoZSB0aHJlYWQgbnVtYmVyIDAgYXMgc3BlY2lmaWVkIGluIHRoZSBPcGVuIE1QIHN0YW5kYXJkIHZlcnNpb24gMy4wLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgbWFzdGVyPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX21hc3Rlcl8zPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKQoreworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKwlpbnQgbnRocmVhZHM7CisJaW50IGV4ZWN1dGluZ190aHJlYWQ7CisgICAgICAgIGludCB0aWRfcmVzdWx0ID0gMDsgLyogY291bnRzIHVwIHRoZSBudW1iZXIgb2Ygd3JvbmcgdGhyZWFkIG5vLiBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbWFzdGVyIHRocmVhZC4gKE11c3QgYmUgMCkgKi8KKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgbnRocmVhZHMgPSAwOworICAgIGV4ZWN1dGluZ190aHJlYWQgPSAtMTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisJPG9tcHRzOm9ycGhhbj4KKwkgICAgPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIG1hc3RlciA8L29tcHRzOmNoZWNrPgorCSAgICB7CisgICAgICAgICAgICAgICAgaW50IHRpZCA9IG9tcF9nZXRfdGhyZWFkX251bSgpOworICAgICAgICAgICAgICAgIGlmICh0aWQgIT0gMCkgeworI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICAgICAgICAgICAgICAgICAgeyB0aWRfcmVzdWx0Kys7IH0KKyAgICAgICAgICAgICAgICB9CisjcHJhZ21hIG9tcCBjcml0aWNhbAorCQl7CisJCSAgICBudGhyZWFkcysrOworCQl9CisJCWV4ZWN1dGluZ190aHJlYWQgPSBvbXBfZ2V0X3RocmVhZF9udW0gKCk7CisKKwkgICAgfSAvKiBlbmQgb2YgbWFzdGVyKi8KKwk8L29tcHRzOm9ycGhhbj4KKyAgICB9IC8qIGVuZCBvZiBwYXJhbGxlbCovCisgICAgcmV0dXJuICgobnRocmVhZHMgPT0gMSkgJiYgKGV4ZWN1dGluZ190aHJlYWQgPT0gMCkgJiYgKHRpZF9yZXN1bHQgPT0gMCkpOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9uZXN0X2xvY2suYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9uZXN0X2xvY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWRlMzg5Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX25lc3RfbG9jay5jCkBAIC0wLDAgKzEsNDUgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wX3NldF9uZXN0X2xvY2sgYW5kIHRoZSBvbXBfdW5zZXRfbmVzdF9sb2NrIGZ1bmN0aW9uLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXBfbmVzdF9sb2NrPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGZsdXNoPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworb21wX25lc3RfbG9ja190IGxjazsKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX25lc3RfbG9jazwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSkKK3sKKyAgICBpbnQgbnJfdGhyZWFkc19pbl9zaW5nbGUgPSAwOworICAgIGludCByZXN1bHQgPSAwOworICAgIGludCBucl9pdGVyYXRpb25zID0gMDsKKyAgICBpbnQgaTsKKworICAgIG9tcF9pbml0X25lc3RfbG9jayAoJmxjayk7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIHNoYXJlZChsY2spICAKKyAgICB7CisjcHJhZ21hIG9tcCBmb3IKKwlmb3IoaSA9IDA7IGkgPCBMT09QQ09VTlQ7IGkrKykKKwl7CisJICAgIDxvbXB0czpvcnBoYW4+CisJCTxvbXB0czpjaGVjaz5vbXBfc2V0X25lc3RfbG9jayAoJmxjayk7PC9vbXB0czpjaGVjaz4KKwkgICAgPC9vbXB0czpvcnBoYW4+CisjcHJhZ21hIG9tcCBmbHVzaAorCQlucl90aHJlYWRzX2luX3NpbmdsZSsrOworI3ByYWdtYSBvbXAgZmx1c2ggICAgICAgICAgIAorCSAgICBucl9pdGVyYXRpb25zKys7CisJICAgIG5yX3RocmVhZHNfaW5fc2luZ2xlLS07CisJICAgIHJlc3VsdCA9IHJlc3VsdCArIG5yX3RocmVhZHNfaW5fc2luZ2xlOworCSAgICA8b21wdHM6b3JwaGFuPgorCQk8b21wdHM6Y2hlY2s+b21wX3Vuc2V0X25lc3RfbG9jayAoJmxjayk7PC9vbXB0czpjaGVjaz4KKwkgICAgPC9vbXB0czpvcnBoYW4+CisJfQorICAgIH0KKyAgICBvbXBfZGVzdHJveV9uZXN0X2xvY2sgKCZsY2spOworCisgICAgcmV0dXJuICgocmVzdWx0ID09IDApICYmIChucl9pdGVyYXRpb25zID09IExPT1BDT1VOVCkpOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9uZXN0ZWQuYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9uZXN0ZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjU3YmM4Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX25lc3RlZC5jCkBAIC0wLDAgKzEsNDIgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wX25lc3RlZCBmdW5jdGlvbi48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wX25lc3RlZDwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBjcml0aWNhbDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisvKgorICogVGVzdCBpZiB0aGUgY29tcGlsZXIgc3VwcG9ydHMgbmVzdGVkIHBhcmFsbGVsaXNtCisgKiBCeSBDaHVuaHVhIExpYW8sIFVuaXZlcnNpdHkgb2YgSG91c3RvbgorICogT2N0LiAyMDA1CisgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX25lc3RlZDwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSkKK3sKKworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgaW50IGNvdW50ZXIgPSAwOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyNpZmRlZiBfT1BFTk1QCisgICAgPG9tcHRzOmNoZWNrPm9tcF9zZXRfbmVzdGVkKDEpOzwvb21wdHM6Y2hlY2s+CisgICAgPG9tcHRzOmNyb3NzY2hlY2s+b21wX3NldF9uZXN0ZWQoMCk7PC9vbXB0czpjcm9zc2NoZWNrPgorI2VuZGlmCisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIHNoYXJlZChjb3VudGVyKQoreworPG9tcHRzOm9ycGhhbj4KKyNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgY291bnRlciArKzsKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICAgICAgY291bnRlciAtLTsKKyAgICB9Cis8L29tcHRzOm9ycGhhbj4KK30KKyAgICByZXR1cm4gKGNvdW50ZXIgIT0gMCk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX2NvcHlpbi5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX2NvcHlpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4MmJmYTIKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfY29weWluLmMKQEAgLTAsMCArMSw0NyBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgcGFyYWxsZWwgY29weWluIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjMuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHBhcmFsbGVsIGNvcHlpbjwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBjcml0aWNhbCxvbXAgdGhyZWFkcHJpdmF0ZTwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK3N0YXRpYyBpbnQgc3VtMSA9IDc4OTsKKyNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUoc3VtMSkKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3BhcmFsbGVsX2NvcHlpbjwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSkKK3sKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisJaW50IHN1bSwgbnVtX3RocmVhZHM7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICBpbnQga25vd25fc3VtOworCisgICAgc3VtID0gMDsKKyAgICBzdW0xID0gNzsKKyAgICBudW1fdGhyZWFkcyA9IDA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIDxvbXB0czpjaGVjaz5jb3B5aW4oc3VtMSk8L29tcHRzOmNoZWNrPgorICAgIHsKKwkvKnByaW50Zigic3VtMT0lZFxuIixzdW0xKTsqLworCTxvbXB0czpvcnBoYW4+CisJaW50IGk7CisjcHJhZ21hIG9tcCBmb3IgCisJICAgIGZvciAoaSA9IDE7IGkgPCAxMDAwOyBpKyspCisJICAgIHsKKwkJc3VtMSA9IHN1bTEgKyBpOworCSAgICB9IC8qZW5kIG9mIGZvciovCisjcHJhZ21hIG9tcCBjcml0aWNhbAorCXsKKwkgICAgc3VtID0gc3VtICsgc3VtMTsKKyAgICAgICAgICAgIG51bV90aHJlYWRzKys7CisJfSAvKmVuZCBvZiBjcml0aWNhbCovCisJPC9vbXB0czpvcnBoYW4+CisgICAgfSAvKiBlbmQgb2YgcGFyYWxsZWwqLyAgICAKKyAgICBrbm93bl9zdW0gPSAoOTk5ICogMTAwMCkgLyAyICsgNyAqIG51bV90aHJlYWRzOworICAgIHJldHVybiAoa25vd25fc3VtID09IHN1bSk7CisKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfZGVmYXVsdC5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX2RlZmF1bHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Yzg3MzcxCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX2RlZmF1bHQuYwpAQCAtMCwwICsxLDQ0IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIGRlZmF1bHQgb3B0aW9uIG9mIHRoZSBwYXJhbGxlbCBjb25zdHJ1Y3QuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4zLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBwYXJhbGxlbCBkZWZhdWx0PC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3BhcmFsbGVsX2RlZmF1bHQ8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4gKEZJTEUgKiBsb2dGaWxlKQoreworICA8b21wdHM6b3JwaGFuOnZhcnM+CisgIGludCBpOworICBpbnQgc3VtOworICBpbnQgbXlzdW07CisgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgIAorICBpbnQga25vd25fc3VtOworICBzdW0gPTA7CisgIGtub3duX3N1bSA9IChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMiA7CisKKyAgPG9tcHRzOm9ycGhhbj4KKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgPG9tcHRzOmNoZWNrPmRlZmF1bHQoc2hhcmVkKTwvb21wdHM6Y2hlY2s+IHByaXZhdGUoaSkgcHJpdmF0ZShteXN1bTxvbXB0czpjcm9zc2NoZWNrPixzdW08L29tcHRzOmNyb3NzY2hlY2s+KQorICB7CisJbXlzdW0gPSAwOworICAjcHJhZ21hIG9tcCBmb3IKKwlmb3IgKGkgPSAxOyBpIDw9IExPT1BDT1VOVDsgaSsrKQorCXsKKwkgIG15c3VtID0gbXlzdW0gKyBpOworCX0gCisjcHJhZ21hIG9tcCBjcml0aWNhbAorCXsKKwkgIHN1bSA9IHN1bSArIG15c3VtOworCX0gICAvKiBlbmQgb2YgY3JpdGljYWwgKi8KKyAgfSAgIC8qIGVuZCBvZiBwYXJhbGxlbCAqLworICA8L29tcHRzOm9ycGhhbj4KKyAgaWYgKGtub3duX3N1bSAhPSBzdW0pIHsKKyAgCWZwcmludGYobG9nRmlsZSwgIktOT1dOX1NVTSA9ICVkOyBTVU0gPSAlZFxuIiwga25vd25fc3VtLCBzdW0pOworICB9CisgIHJldHVybiAoa25vd25fc3VtID09IHN1bSk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX2ZpcnN0cHJpdmF0ZS5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX2ZpcnN0cHJpdmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MTViNGMKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfZmlyc3Rwcml2YXRlLmMKQEAgLTAsMCArMSw0OCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgcGFyYWxsZWwgZmlyc3Rwcml2YXRlIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjMuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHBhcmFsbGVsIGZpcnN0cHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBmb3Igb21wIGNyaXRpY2FsPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworLy9zdGF0aWMgaW50IHN1bTEgPSA3ODk7CisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9wYXJhbGxlbF9maXJzdHByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpCit7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorCWludCBzdW0sIG51bV90aHJlYWRzLHN1bTE7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICBpbnQga25vd25fc3VtOworCisgICAgc3VtID0gMDsKKyAgICBzdW0xPTc7CisgICAgbnVtX3RocmVhZHMgPSAwOworCisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIDxvbXB0czpjaGVjaz5maXJzdHByaXZhdGUoc3VtMSk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPnByaXZhdGUoc3VtMSk8L29tcHRzOmNyb3NzY2hlY2s+CisgICAgeworCisJLypwcmludGYoInN1bTE9JWRcbiIsc3VtMSk7Ki8KKwk8b21wdHM6b3JwaGFuPgorCWludCBpOworI3ByYWdtYSBvbXAgZm9yIAorCSAgICBmb3IgKGkgPSAxOyBpIDwgMTAwMDsgaSsrKQorCSAgICB7CisJCXN1bTEgPSBzdW0xICsgaTsKKwkgICAgfSAvKmVuZCBvZiBmb3IqLworI3ByYWdtYSBvbXAgY3JpdGljYWwKKwl7CisJICAgIHN1bSA9IHN1bSArIHN1bTE7CisgICAgICAgICAgICBudW1fdGhyZWFkcysrOworCX0gLyplbmQgb2YgY3JpdGljYWwqLworCTwvb21wdHM6b3JwaGFuPgorICAgIH0gLyogZW5kIG9mIHBhcmFsbGVsKi8gICAgCisgICAga25vd25fc3VtID0gKDk5OSAqIDEwMDApIC8gMiArIDcgKiBudW1fdGhyZWFkczsKKyAgICByZXR1cm4gKGtub3duX3N1bSA9PSBzdW0pOworCit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX2Zvcl9maXJzdHByaXZhdGUuYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9mb3JfZmlyc3Rwcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNiNDkyNgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9mb3JfZmlyc3Rwcml2YXRlLmMKQEAgLTAsMCArMSwzNiBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgcGFyYWxsZWwgZm9yIGZpcnN0cHJpdmF0ZSBkaXJlY3RpdmUuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBwYXJhbGxlbCBmb3IgZmlyc3Rwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIHBhcmFsbGVsIGZvciByZWR1Y3Rpb24sb21wIHBhcmFsbGVsIGZvciBwcml2YXRlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3BhcmFsbGVsX2Zvcl9maXJzdHByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpCit7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgIGludCBzdW0gOworICAgIGludCBpMjsKKyAgICBpbnQgaTsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorICAgIAorICAgIHN1bT0wOworICAgIGkyPTM7CisgICAgaW50IGtub3duX3N1bTsKKworICAgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciByZWR1Y3Rpb24oKzpzdW0pIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPmZpcnN0cHJpdmF0ZShpMik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPnByaXZhdGUoaTIpPC9vbXB0czpjcm9zc2NoZWNrPgorICAgIDxvbXB0czpvcnBoYW4+CisgICAgZm9yIChpID0gMTsgaSA8PSBMT09QQ09VTlQ7IGkrKykKKyAgICB7CisJICBzdW0gPSBzdW0gKyAoaSArIGkyKTsKKyAgICB9IC8qZW5kIG9mIGZvciovCisgICAgPC9vbXB0czpvcnBoYW4+CisgICAgCisgICAga25vd25fc3VtID0gKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyICsgaTIgKiBMT09QQ09VTlQ7CisgICAgCisgICAgcmV0dXJuIChrbm93bl9zdW0gPT0gc3VtKTsKKworfSAvKiBlbmQgb2YgY2hlY2tfcGFyYWxsZWxfZm9yX2Zpc3Rwcml2YXRlICovCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX2Zvcl9pZi5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX2Zvcl9pZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyODg2YmEKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfZm9yX2lmLmMKQEAgLTAsMCArMSwzOCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgcGFyYWxsZWwgZm9yIGlmIGRpcmVjdGl2ZS4gTmVlZHMgYXQgbGVhc3QgdHdvIHRocmVhZHMuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBwYXJhbGxlbCBmb3IgaWY8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz48L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3BhcmFsbGVsX2Zvcl9pZjwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSl7CisgICAgaW50IGtub3duX3N1bTsKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgaW50IG51bV90aHJlYWRzOworICAgIGludCBzdW0sIHN1bTI7CisgICAgaW50IGk7CisgICAgaW50IGNvbnRyb2w7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICBjb250cm9sID0gMDsKKyAgICBudW1fdGhyZWFkcz0wOworICAgIHN1bSA9IDA7CisgICAgc3VtMiA9IDA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5pZiAoY29udHJvbD09MSk8L29tcHRzOmNoZWNrPgorICAgIDxvbXB0czpvcnBoYW4+CisgICAgZm9yIChpPTA7IGkgPD0gTE9PUENPVU5UOyBpKyspCisgICAgeworICAgICAgICBudW1fdGhyZWFkcyA9IG9tcF9nZXRfbnVtX3RocmVhZHMoKTsKKwlzdW0gPSBzdW0gKyBpOworICAgIH0gLyplbmQgb2YgZm9yKi8KKworICAgIDwvb21wdHM6b3JwaGFuPgorICAgIGtub3duX3N1bSA9IChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMjsKKyAgICBmcHJpbnRmIChsb2dGaWxlLCAiTnVtYmVyIG9mIHRocmVhZHMgZGV0ZXJtaW5lZCBieSBvbXBfZ2V0X251bV90aHJlYWRzOiAlZFxuIiwgbnVtX3RocmVhZHMpOworICAgIHJldHVybiAoa25vd25fc3VtID09IHN1bSAmJiBudW1fdGhyZWFkcyA9PSAxKTsKK30gLyogZW5kIG9mIGNoZWNrX3BhcmFsbGVsX2Zvcl9wcml2YXRlICovCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX2Zvcl9sYXN0cHJpdmF0ZS5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX2Zvcl9sYXN0cHJpdmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwOWRlYmEKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfZm9yX2xhc3Rwcml2YXRlLmMKQEAgLTAsMCArMSwzNCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgcGFyYWxsZWwgZm9yIGxhc3Rwcml2YXRlIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHBhcmFsbGVsIGZvciBsYXN0cHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBwYXJhbGxlbCBmb3IgcmVkdWN0aW9uLG9tcCBwYXJhbGxlbCBmb3IgcHJpdmF0ZTwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9wYXJhbGxlbF9mb3JfbGFzdHByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpeworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgICBpbnQgc3VtOworICAgIGludCBpOworICAgIGludCBpMDsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgc3VtID0wOworICAgIGkwID0gLTE7CisgICAgaW50IGtub3duX3N1bTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHJlZHVjdGlvbigrOnN1bSkgc2NoZWR1bGUoc3RhdGljLDcpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPmxhc3Rwcml2YXRlKGkwKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+cHJpdmF0ZShpMCk8L29tcHRzOmNyb3NzY2hlY2s+CisgICAgPG9tcHRzOm9ycGhhbj4KKyAgICBmb3IgKGkgPSAxOyBpIDw9IExPT1BDT1VOVDsgaSsrKQorICAgIHsKKwlzdW0gPSBzdW0gKyBpOworCWkwID0gaTsKKyAgICB9IC8qZW5kIG9mIGZvciovCisgICAgLyogZW5kIG9mIHBhcmFsbGVsKi8gICAgCisgICAgPC9vbXB0czpvcnBoYW4+CisgICAga25vd25fc3VtID0gKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyOworICAgIHJldHVybiAoKGtub3duX3N1bSA9PSBzdW0pICYmIChpMCA9PSBMT09QQ09VTlQpKTsKK30gLyogZW5kIG9mIGNoZWNrX3BhcmFsbGVsX2Zvcl9sYXN0cHJpdmF0ZSAqLworPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9mb3Jfb3JkZXJlZC5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX2Zvcl9vcmRlcmVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFhNGJjOQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9mb3Jfb3JkZXJlZC5jCkBAIC0wLDAgKzEsNjIgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHBhcmFsbGVsIGZvciBvcmRlcmVkIGRpcmVjdGl2ZTwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgZm9yIG9yZGVyZWQ8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgcGFyYWxsZWwgc2NoZWR1bGUoc3RhdGljKTwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK3N0YXRpYyBpbnQgbGFzdF9pID0gMDsKK2ludCBpOworCisjcHJhZ21hIG9tcCB0aHJlYWRwcml2YXRlKGkpCisKKy8qIFZhcmlhYmxlIGlpIGlzIHVzZWQgdG8gYXZvaWQgcHJvYmxlbXMgd2l0aCBhIHRocmVhZHByaXZhdGUgdmFyaWFibGUgdXNlZCBhcyBhIGxvb3AKKyAqIGluZGV4LiBTZWUgdGVzdCBvbXBfdGhyZWFkcHJpdmF0ZV9mb3IuCisgKi8KK3N0YXRpYyBpbnQgaWk7CisjcHJhZ21hIG9tcCB0aHJlYWRwcml2YXRlKGlpKQorCisvKiEgCisgIFV0aWxpdHkgZnVuY3Rpb246IHJldHVybnMgdHJ1ZSBpZiB0aGUgcGFzc2VkIGFyZ3VtZW50IGlzIGxhcmdlciB0aGFuIAorICB0aGUgYXJndW1lbnQgb2YgdGhlIGxhc3QgY2FsbCBvZiB0aGlzIGZ1bmN0aW9uLgorICAqLworc3RhdGljIGludCBjaGVja19pX2lzbGFyZ2VyMiAoaW50IGkpeworCWludCBpc2xhcmdlcjsKKwlpc2xhcmdlciA9IChpID4gbGFzdF9pKTsKKwlsYXN0X2kgPSBpOworCXJldHVybiAoaXNsYXJnZXIpOworfQorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfcGFyYWxsZWxfZm9yX29yZGVyZWQ8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpeworCTxvbXB0czpvcnBoYW46dmFycz4KKwlpbnQgc3VtOworCWludCBpc19sYXJnZXI7CisJPC9vbXB0czpvcnBoYW46dmFycz4KKworCWludCBrbm93bl9zdW07CisJaW50IGk7CisJCisJc3VtID0gMDsKKwlpc19sYXJnZXIgPSAxOworCWxhc3RfaSA9IDA7CisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoc3RhdGljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPm9yZGVyZWQ8L29tcHRzOmNoZWNrPgorCWZvciAoaSA9IDE7IGkgPCAxMDA7IGkrKykKKwl7CisJCWlpID0gaTsKKwk8b21wdHM6b3JwaGFuPgorPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIG9yZGVyZWQ8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwkJeworCQkJaXNfbGFyZ2VyID0gY2hlY2tfaV9pc2xhcmdlcjIgKGlpKSAmJiBpc19sYXJnZXI7CisJCQlzdW0gID0gc3VtICsgaWk7CisJCX0KKwk8L29tcHRzOm9ycGhhbj4KKwl9CisJa25vd25fc3VtID0gKDk5ICogMTAwKSAvIDI7CisJZnByaW50ZiAobG9nRmlsZSwiIGtub3duX3N1bSA9ICVkICwgc3VtID0gJWQgXG4iLCBrbm93bl9zdW0sIHN1bSk7CisJZnByaW50ZiAobG9nRmlsZSwiIGlzX2xhcmdlciA9ICVkXG4iLCBpc19sYXJnZXIpOworCXJldHVybiAoa25vd25fc3VtID09IHN1bSkgJiYgaXNfbGFyZ2VyOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9mb3JfcHJpdmF0ZS5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX2Zvcl9wcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAyODBjYwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9mb3JfcHJpdmF0ZS5jCkBAIC0wLDAgKzEsNDggQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHBhcmFsbGVsIGZvciBwcml2YXRlIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHBhcmFsbGVsIGZvciBwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIHBhcmFsbGVsIGZvciByZWR1Y3Rpb24sb21wIGZsdXNoPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKKy8qISBVdGlsaXR5IGZ1bmN0aW9uIHRvIHNwZW5kIHNvbWUgdGltZSBpbiBhIGxvb3AgKi8KK3N0YXRpYyB2b2lkIGRvX3NvbWVfd29yayAodm9pZCl7CisgICAgaW50IGk7CisgICAgZG91YmxlIHN1bSA9IDA7CisgICAgZm9yKGkgPSAwOyBpIDwgMTAwMDsgaSsrKXsKKwlzdW0gKz0gc3FydCAoaSk7CisgICAgfQorfQorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfcGFyYWxsZWxfZm9yX3ByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpeworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgICBpbnQgc3VtOworICAgIGludCBpOworICAgIGludCBpMjsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorICAgIAorICAgIHN1bSA9MDsKKyAgICBpMj0wOworICAgIGludCBrbm93bl9zdW07CisgIAorI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHJlZHVjdGlvbigrOnN1bSkgc2NoZWR1bGUoc3RhdGljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnByaXZhdGUoaTIpPC9vbXB0czpjaGVjaz4KKyAgICA8b21wdHM6b3JwaGFuPgorICAgIAorICAgIGZvciAoaT0xO2k8PUxPT1BDT1VOVDtpKyspCisgICAgeworCWkyID0gaTsKKyNwcmFnbWEgb21wIGZsdXNoCisJZG9fc29tZV93b3JrICgpOworI3ByYWdtYSBvbXAgZmx1c2gKKwlzdW0gPSBzdW0gKyBpMjsKKyAgICB9IC8qZW5kIG9mIGZvciovCisgICAgPC9vbXB0czpvcnBoYW4+CisKKyAgICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDI7CisgICAgcmV0dXJuIChrbm93bl9zdW0gPT0gc3VtKTsKK30gLyogZW5kIG9mIGNoZWNrX3BhcmFsbGVsX2Zvcl9wcml2YXRlICovCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX2Zvcl9yZWR1Y3Rpb24uYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9mb3JfcmVkdWN0aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM5OTFmNwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9mb3JfcmVkdWN0aW9uLmMKQEAgLTAsMCArMSwyODAgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHBhcmFsbGVsIGZvciByZWR1Y3Rpb24gZGlyZWN0aXZlIHdpdGggYWxsIGl0cyBvcHRpb25zLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgZm9yIHJlZHVjdGlvbjwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfcGFyYWxsZWxfZm9yX3JlZHVjdGlvbjwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSl7CisJPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgIGludCBzdW07CisJaW50IGtub3duX3N1bTsKKwlkb3VibGUgZHN1bTsKKwlkb3VibGUgZGtub3duX3N1bTsKKwlkb3VibGUgZHQ9MC41OwkJCQkvKiBiYXNlIG9mIGdlb21ldHJpYyByb3cgZm9yICsgYW5kIC0gdGVzdCovCisJZG91YmxlIHJvdW5kaW5nX2Vycm9yPSAxLkUtOTsKKyNkZWZpbmUgRE9VQkxFX0RJR0lUUyAyMAkJLyogZHReRE9VQkxFX0RJR0lUUyAqLworCWludCBkaWZmOworCWRvdWJsZSBkZGlmZjsKKwlpbnQgcHJvZHVjdDsKKwlpbnQga25vd25fcHJvZHVjdDsKKyNkZWZpbmUgTUFYX0ZBQ1RPUiAxMAorI2RlZmluZSBLTk9XTl9QUk9EVUNUIDM2Mjg4MDAJLyogMTAhICovCisJaW50IGxvZ2ljX2FuZDsKKwlpbnQgbG9naWNfb3I7CisJaW50IGJpdF9hbmQ7CisJaW50IGJpdF9vcjsKKwlpbnQgZXhjbHVzaXZfYml0X29yOworCWludCBsb2dpY3NbTE9PUENPVU5UXTsKKwlpbnQgaTsKKwlkb3VibGUgZHB0OworCWludCByZXN1bHQ7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgIHN1bSA9MDsKKyAgICBkc3VtPTA7CisJZHQgPSAxLi8zLjsKKyAgICByZXN1bHQgPSAwOworICAgIHByb2R1Y3QgPSAxOworCWxvZ2ljX2FuZD0xOworCWxvZ2ljX29yPTA7CisJYml0X2FuZD0xOworCWJpdF9vcj0wOworCWV4Y2x1c2l2X2JpdF9vcj0wOworCisJa25vd25fc3VtID0gKExPT1BDT1VOVCooTE9PUENPVU5UKzEpKS8yOworPG9tcHRzOm9ycGhhbj4KKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigrOnN1bSk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwlmb3IgKGk9MTtpPD1MT09QQ09VTlQ7aSsrKQorCXsKKwkJc3VtPXN1bStpOworCX0KKworCWlmKGtub3duX3N1bSE9c3VtKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gc3VtIHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQgaW5zdGVhZCBvZiAlZFxuIixzdW0sa25vd25fc3VtKTsgCisJfQorCisJZGlmZiA9IChMT09QQ09VTlQqKExPT1BDT1VOVCsxKSkvMjsKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigtOmRpZmYpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yIChpPTE7aTw9TE9PUENPVU5UOysraSkKKwl7CisJCWRpZmY9ZGlmZi1pOworCX0KKworCWlmKGRpZmYgIT0gMCkKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIGRpZmZlcmVuY2Ugd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAlZCBpbnN0ZWFkIG9mIDAuXG4iLGRpZmYpOworCX0KKworCS8qIFRlc3RzIGZvciBkb3VibGVzICovCisJZHN1bT0wOworCWRwdD0xOworCWZvciAoaT0wO2k8RE9VQkxFX0RJR0lUUzsrK2kpCisJeworCQlkcHQqPWR0OworCX0KKwlka25vd25fc3VtID0gKDEtZHB0KS8oMS1kdCk7CisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oKzpkc3VtKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvciAoaT0wO2k8RE9VQkxFX0RJR0lUUzsrK2kpCisJeworCQlkc3VtICs9IHBvdyhkdCxpKTsKKwl9CisKKwlpZiggZmFicyhkc3VtLWRrbm93bl9zdW0pID4gcm91bmRpbmdfZXJyb3IgKQorCXsKKwkJcmVzdWx0Kys7IAorCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIHN1bSB3aXRoIGRvdWJsZXM6IFJlc3VsdCB3YXMgJWYgaW5zdGVhZCBvZiAlZiAoRGlmZmVyZW5jZTogJUUpXG4iLGRzdW0sZGtub3duX3N1bSwgZHN1bS1ka25vd25fc3VtKTsKKwl9CisKKwlkcHQ9MTsKKworCWZvciAoaT0wO2k8RE9VQkxFX0RJR0lUUzsrK2kpCisJeworCQlkcHQqPWR0OworCX0KKwlmcHJpbnRmKGxvZ0ZpbGUsIlxuIik7CisJZGRpZmYgPSAoMS1kcHQpLygxLWR0KTsKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigtOmRkaWZmKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvciAoaT0wO2k8RE9VQkxFX0RJR0lUUzsrK2kpCisJeworCQlkZGlmZiAtPSBwb3coZHQsaSk7CisJfQorCWlmKCBmYWJzKGRkaWZmKSA+IHJvdW5kaW5nX2Vycm9yKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gRGlmZmVyZW5jZSB3aXRoIGRvdWJsZXM6IFJlc3VsdCB3YXMgJUUgaW5zdGVhZCBvZiAwLjBcbiIsZGRpZmYpOworCX0KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCo6cHJvZHVjdCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwlmb3IoaT0xO2k8PU1BWF9GQUNUT1I7aSsrKQorCXsKKwkJcHJvZHVjdCAqPSBpOworCX0KKworCWtub3duX3Byb2R1Y3QgPSBLTk9XTl9QUk9EVUNUOworCWlmKGtub3duX3Byb2R1Y3QgIT0gcHJvZHVjdCkKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIFByb2R1Y3Qgd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAlZCBpbnN0ZWFkIG9mICVkXG5cbiIscHJvZHVjdCxrbm93bl9wcm9kdWN0KTsKKwl9CisKKwlmb3IoaT0wO2k8TE9PUENPVU5UO2krKykKKwl7CisJCWxvZ2ljc1tpXT0xOworCX0KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCYmOmxvZ2ljX2FuZCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwlmb3IoaT0wO2k8TE9PUENPVU5UOysraSkKKwl7CisJCWxvZ2ljX2FuZCA9IChsb2dpY19hbmQgJiYgbG9naWNzW2ldKTsKKwl9CisJaWYoIWxvZ2ljX2FuZCkKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIGxvZ2ljIEFORCBwYXJ0IDEuXG4iKTsKKwl9CisKKwlsb2dpY19hbmQgPSAxOworCWxvZ2ljc1tMT09QQ09VTlQvMl09MDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCYmOmxvZ2ljX2FuZCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwlmb3IoaT0wO2k8TE9PUENPVU5UOysraSkKKwl7CisJCWxvZ2ljX2FuZCA9IGxvZ2ljX2FuZCAmJiBsb2dpY3NbaV07CisJfQorCWlmKGxvZ2ljX2FuZCkKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIGxvZ2ljIEFORCBwYXJ0IDIuXG4iKTsKKwl9CisKKwlmb3IoaT0wO2k8TE9PUENPVU5UO2krKykKKwl7CisJCWxvZ2ljc1tpXT0wOworCX0KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKHx8OmxvZ2ljX29yKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvcihpPTA7aTxMT09QQ09VTlQ7KytpKQorCXsKKwkJbG9naWNfb3IgPSBsb2dpY19vciB8fCBsb2dpY3NbaV07CisJfQorCWlmKGxvZ2ljX29yKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gbG9naWMgT1IgcGFydCAxLlxuIik7CisJfQorCWxvZ2ljX29yID0gMDsKKwlsb2dpY3NbTE9PUENPVU5ULzJdPTE7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbih8fDpsb2dpY19vcik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwlmb3IoaT0wO2k8TE9PUENPVU5UOysraSkKKwl7CisJCWxvZ2ljX29yID0gbG9naWNfb3IgfHwgbG9naWNzW2ldOworCX0KKwlpZighbG9naWNfb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBsb2dpYyBPUiBwYXJ0IDIuXG4iKTsKKwl9CisKKworCWZvcihpPTA7aTxMT09QQ09VTlQ7KytpKQorCXsKKwkJbG9naWNzW2ldPTE7CisJfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oJjpiaXRfYW5kKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvcihpPTA7aTxMT09QQ09VTlQ7KytpKQorCXsKKwkJYml0X2FuZCA9IChiaXRfYW5kICYgbG9naWNzW2ldKTsKKwl9CisJaWYoIWJpdF9hbmQpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBCSVQgQU5EIHBhcnQgMS5cbiIpOworCX0KKworCWJpdF9hbmQgPSAxOworCWxvZ2ljc1tMT09QQ09VTlQvMl09MDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCY6Yml0X2FuZCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwlmb3IoaT0wO2k8TE9PUENPVU5UOysraSkKKwl7CisJCWJpdF9hbmQgPSBiaXRfYW5kICYgbG9naWNzW2ldOworCX0KKwlpZihiaXRfYW5kKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gQklUIEFORCBwYXJ0IDIuXG4iKTsKKwl9CisKKwlmb3IoaT0wO2k8TE9PUENPVU5UO2krKykKKwl7CisJCWxvZ2ljc1tpXT0wOworCX0KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKHw6Yml0X29yKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvcihpPTA7aTxMT09QQ09VTlQ7KytpKQorCXsKKwkJYml0X29yID0gYml0X29yIHwgbG9naWNzW2ldOworCX0KKwlpZihiaXRfb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBCSVQgT1IgcGFydCAxXG4iKTsKKwl9CisJYml0X29yID0gMDsKKwlsb2dpY3NbTE9PUENPVU5ULzJdPTE7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbih8OmJpdF9vcik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwlmb3IoaT0wO2k8TE9PUENPVU5UOysraSkKKwl7CisJCWJpdF9vciA9IGJpdF9vciB8IGxvZ2ljc1tpXTsKKwl9CisJaWYoIWJpdF9vcikKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIEJJVCBPUiBwYXJ0IDJcbiIpOworCX0KKworCWZvcihpPTA7aTxMT09QQ09VTlQ7aSsrKQorCXsKKwkJbG9naWNzW2ldPTA7CisJfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oXjpleGNsdXNpdl9iaXRfb3IpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpCisJeworCQlleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisJfQorCWlmKGV4Y2x1c2l2X2JpdF9vcikKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIEVYQ0xVU0lWIEJJVCBPUiBwYXJ0IDFcbiIpOworCX0KKworCWV4Y2x1c2l2X2JpdF9vciA9IDA7CisJbG9naWNzW0xPT1BDT1VOVC8yXT0xOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oXjpleGNsdXNpdl9iaXRfb3IpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpCisJeworCQlleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisJfQorCWlmKCFleGNsdXNpdl9iaXRfb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBFWENMVVNJViBCSVQgT1IgcGFydCAyXG4iKTsKKwl9Cis8L29tcHRzOm9ycGhhbj4KKwkvKnByaW50ZigiXG5SZXN1bHQ6JWRcbiIscmVzdWx0KTsqLworCXJldHVybiAocmVzdWx0PT0wKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfaWYuYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9pZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzZjQ1YjEKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfaWYuYwpAQCAtMCwwICsxLDQwIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIGlmIG9wdGlvbiBvZiB0aGUgcGFyYWxsZWwgY29uc3RydWN0Ljwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgaWY8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfcGFyYWxsZWxfaWY8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4gKEZJTEUgKiBsb2dGaWxlKQoreworPG9tcHRzOm9ycGhhbjp2YXJzPgorICBpbnQgaTsKKyAgaW50IHN1bTsKKyAgaW50IGtub3duX3N1bTsKKyAgaW50IG15c3VtOworICBpbnQgY29udHJvbD0xOworPC9vbXB0czpvcnBoYW46dmFycz4KKyAgc3VtID0wOworICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDIgOworI3ByYWdtYSBvbXAgcGFyYWxsZWwgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+aWYoY29udHJvbD09MCk8L29tcHRzOmNoZWNrPgorICB7CisJPG9tcHRzOm9ycGhhbj4KKyAgICBteXN1bSA9IDA7CisJZm9yIChpID0gMTsgaSA8PSBMT09QQ09VTlQ7IGkrKykKKwl7CisJICBteXN1bSA9IG15c3VtICsgaTsKKwl9IAorI3ByYWdtYSBvbXAgY3JpdGljYWwKKwl7CisJICBzdW0gPSBzdW0gKyBteXN1bTsKKwl9ICAgLyogZW5kIG9mIGNyaXRpY2FsICovCisgIDwvb21wdHM6b3JwaGFuPgorICB9ICAgLyogZW5kIG9mIHBhcmFsbGVsICovCisKKyAgcmV0dXJuIChrbm93bl9zdW0gPT0gc3VtKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfbnVtX3RocmVhZHMuYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9udW1fdGhyZWFkcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5N2ZlZDIKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfbnVtX3RocmVhZHMuYwpAQCAtMCwwICsxLDQ2IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcF9wYXJhbGxlbF9udW1fdGhyZWFkcyBkaXJlY3RpdmUgYnkgY291bnRpbmcgdGhlIHRocmVhZHMgaW4gYSBwYXJhbGxlbCByZWdpb24gd2hpY2ggd2FzIHN0YXJ0ZWQgd2l0aCBhbiBleHBsaWNpdGx5IHN0YXRlZCBudW1iZXIgb2YgdGhyZWFkcy48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjMuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHBhcmVsbGVsIG51bV90aHJlYWRzPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIG1hc3RlcixvbXAgcGFyYWxsZWwgcmVkdWN0aW9uLG9tcCBhdG9taWM8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfcGFyYWxsZWxfbnVtX3RocmVhZHM8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpeworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKwlpbnQgZmFpbGVkOworCWludCB0aHJlYWRzOworCWludCBudGhyZWFkczsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgaW50IG1heF90aHJlYWRzID0gMDsKKworICAgIGZhaWxlZCA9IDA7CisKKyAgICAvKiBmaXJzdCB3ZSBjaGVjayBob3cgbWFueSB0aHJlYWRzIGFyZSBhdmFpbGFibGUgKi8KKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworI3ByYWdtYSBvbXAgbWFzdGVyCisJbWF4X3RocmVhZHMgPSBvbXBfZ2V0X251bV90aHJlYWRzICgpOworICAgIH0KKworICAgIC8qIHdlIGluY3JlYXNlIHRoZSBudW1iZXIgb2YgdGhyZWFkcyBmcm9tIG9uZSB0byBtYXhpbXVtOiovCisgICAgZm9yICh0aHJlYWRzID0gMTsgdGhyZWFkcyA8PSBtYXhfdGhyZWFkczsgdGhyZWFkcysrKQorICAgIHsKKwludGhyZWFkcyA9IDA7CisKKwk8b21wdHM6b3JwaGFuPgorI3ByYWdtYSBvbXAgcGFyYWxsZWwgcmVkdWN0aW9uKCs6ZmFpbGVkKSA8b21wdHM6Y2hlY2s+bnVtX3RocmVhZHModGhyZWFkcyk8L29tcHRzOmNoZWNrPgorCSAgICB7CisJCWZhaWxlZCA9IGZhaWxlZCArICEodGhyZWFkcyA9PSBvbXBfZ2V0X251bV90aHJlYWRzICgpKTsKKyNwcmFnbWEgb21wIGF0b21pYworCSAgICBudGhyZWFkcyArPSAxOworCSAgICB9CisJPC9vbXB0czpvcnBoYW4+CisJZmFpbGVkID0gZmFpbGVkICsgIShudGhyZWFkcyA9PSB0aHJlYWRzKTsKKyAgICB9CisgICAgcmV0dXJuICghZmFpbGVkKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfcHJpdmF0ZS5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX3ByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGNjYzA5Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX3ByaXZhdGUuYwpAQCAtMCwwICsxLDUwIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBwYXJhbGxlbCBwcml2YXRlIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjMuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHBhcmFsbGVsIHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgZm9yIG9tcCBjcml0aWNhbDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKKy8vc3RhdGljIGludCBzdW0xID0gNzg5OworCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfcGFyYWxsZWxfcHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSkKK3sKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisJaW50IHN1bSwgbnVtX3RocmVhZHMsc3VtMTsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorICAgIGludCBrbm93bl9zdW07CisKKyAgICBzdW0gPSAwOworICAgIDxvbXB0czpjcm9zc2NoZWNrPiBzdW0xPTA7IDwvb21wdHM6Y3Jvc3NjaGVjaz4KKyAgICBudW1fdGhyZWFkcyA9IDA7CisKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgPG9tcHRzOmNoZWNrPnByaXZhdGUoc3VtMSk8L29tcHRzOmNoZWNrPgorICAgIHsKKwk8b21wdHM6Y2hlY2s+CisJc3VtMSA9IDc7CisJPC9vbXB0czpjaGVjaz4KKwkvKnByaW50Zigic3VtMT0lZFxuIixzdW0xKTsqLworCTxvbXB0czpvcnBoYW4+CisJaW50IGk7CisjcHJhZ21hIG9tcCBmb3IgCisJICAgIGZvciAoaSA9IDE7IGkgPCAxMDAwOyBpKyspCisJICAgIHsKKwkJc3VtMSA9IHN1bTEgKyBpOworCSAgICB9IC8qZW5kIG9mIGZvciovCisjcHJhZ21hIG9tcCBjcml0aWNhbAorCXsKKwkgICAgc3VtID0gc3VtICsgc3VtMTsKKyAgICAgICAgICAgIG51bV90aHJlYWRzKys7CisJfSAvKmVuZCBvZiBjcml0aWNhbCovCisJPC9vbXB0czpvcnBoYW4+CisgICAgfSAvKiBlbmQgb2YgcGFyYWxsZWwqLyAgICAKKyAgICBrbm93bl9zdW0gPSAoOTk5ICogMTAwMCkgLyAyICsgNyAqIG51bV90aHJlYWRzOworICAgIHJldHVybiAoa25vd25fc3VtID09IHN1bSk7CisKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfcmVkdWN0aW9uLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfcmVkdWN0aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZmODM5NAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9yZWR1Y3Rpb24uYwpAQCAtMCwwICsxLDI3OCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgcGFyYWxsZWwgcmVkdWN0aW9uIGRpcmVjdGl2ZSB3aXRoIGFsbCBpdHMgb3B0aW9ucy48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjMuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHBhcmFsbGVsIHJlZHVjdGlvbjwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfcGFyYWxsZWxfcmVkdWN0aW9uPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKXsKKwk8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgaW50IHN1bTsKKwlpbnQga25vd25fc3VtOworCWRvdWJsZSBkc3VtOworCWRvdWJsZSBka25vd25fc3VtOworCWRvdWJsZSBkdD0wLjU7CQkJCS8qIGJhc2Ugb2YgZ2VvbWV0cmljIHJvdyBmb3IgKyBhbmQgLSB0ZXN0Ki8KKwlkb3VibGUgcm91bmRpbmdfZXJyb3I9IDEuRS05OworI2RlZmluZSBET1VCTEVfRElHSVRTIDIwCQkvKiBkdF5ET1VCTEVfRElHSVRTICovCisJaW50IGRpZmY7CisJZG91YmxlIGRkaWZmOworCWludCBwcm9kdWN0OworCWludCBrbm93bl9wcm9kdWN0OworI2RlZmluZSBNQVhfRkFDVE9SIDEwCisjZGVmaW5lIEtOT1dOX1BST0RVQ1QgMzYyODgwMAkvKiAxMCEgKi8KKwlpbnQgbG9naWNfYW5kOworCWludCBsb2dpY19vcjsKKwlpbnQgYml0X2FuZDsKKwlpbnQgYml0X29yOworCWludCBleGNsdXNpdl9iaXRfb3I7CisJaW50IGxvZ2ljc1tMT09QQ09VTlRdOworCWludCBpOworCWRvdWJsZSBkcHQ7CisJaW50IHJlc3VsdDsKKzwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgc3VtID0wOworICAgIGRzdW09MDsKKyAgICBwcm9kdWN0PTE7CisJbG9naWNfYW5kPTE7CisJbG9naWNfb3I9MDsKKwliaXRfYW5kPTE7CisJYml0X29yPTA7CisJZXhjbHVzaXZfYml0X29yPTA7CisgICAgcmVzdWx0PTA7CisJZHQgPSAxLi8zLjsKKwlrbm93bl9zdW0gPSAoTE9PUENPVU5UKihMT09QQ09VTlQrMSkpLzI7Cis8b21wdHM6b3JwaGFuPgorI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCs6c3VtKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvciAoaT0xO2k8PUxPT1BDT1VOVDtpKyspCisJeworCQlzdW09c3VtK2k7CisJfQorCisJaWYoa25vd25fc3VtIT1zdW0pCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBzdW0gd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAlZCBpbnN0ZWFkIG9mICVkXG4iLHN1bSxrbm93bl9zdW0pOyAKKwl9CisKKwlkaWZmID0gKExPT1BDT1VOVCooTE9PUENPVU5UKzEpKS8yOworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC06ZGlmZik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwlmb3IgKGk9MTtpPD1MT09QQ09VTlQ7KytpKQorCXsKKwkJZGlmZj1kaWZmLWk7CisJfQorCisJaWYoZGlmZiAhPSAwKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gZGlmZmVyZW5jZSB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICVkIGluc3RlYWQgb2YgMC5cbiIsZGlmZik7CisJfQorCisJLyogVGVzdHMgZm9yIGRvdWJsZXMgKi8KKwlkc3VtPTA7CisJZHB0PTE7CisJZm9yIChpPTA7aTxET1VCTEVfRElHSVRTOysraSkKKwl7CisJCWRwdCo9ZHQ7CisJfQorCWRrbm93bl9zdW0gPSAoMS1kcHQpLygxLWR0KTsKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigrOmRzdW0pPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yIChpPTA7aTxET1VCTEVfRElHSVRTOysraSkKKwl7CisJCWRzdW0gKz0gcG93KGR0LGkpOworCX0KKworCWlmKCBmYWJzKGRzdW0tZGtub3duX3N1bSkgPiByb3VuZGluZ19lcnJvciApCisJeworCQlyZXN1bHQrKzsgCisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gc3VtIHdpdGggZG91YmxlczogUmVzdWx0IHdhcyAlZiBpbnN0ZWFkIG9mICVmIChEaWZmZXJlbmNlOiAlRSlcbiIsZHN1bSxka25vd25fc3VtLCBkc3VtLWRrbm93bl9zdW0pOworCX0KKworCWRwdD0xOworCisJZm9yIChpPTA7aTxET1VCTEVfRElHSVRTOysraSkKKwl7CisJCWRwdCo9ZHQ7CisJfQorCWZwcmludGYobG9nRmlsZSwiXG4iKTsKKwlkZGlmZiA9ICgxLWRwdCkvKDEtZHQpOworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC06ZGRpZmYpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yIChpPTA7aTxET1VCTEVfRElHSVRTOysraSkKKwl7CisJCWRkaWZmIC09IHBvdyhkdCxpKTsKKwl9CisJaWYoIGZhYnMoZGRpZmYpID4gcm91bmRpbmdfZXJyb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBEaWZmZXJlbmNlIHdpdGggZG91YmxlczogUmVzdWx0IHdhcyAlRSBpbnN0ZWFkIG9mIDAuMFxuIixkZGlmZik7CisJfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oKjpwcm9kdWN0KTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvcihpPTE7aTw9TUFYX0ZBQ1RPUjtpKyspCisJeworCQlwcm9kdWN0ICo9IGk7CisJfQorCisJa25vd25fcHJvZHVjdCA9IEtOT1dOX1BST0RVQ1Q7CisJaWYoa25vd25fcHJvZHVjdCAhPSBwcm9kdWN0KQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gUHJvZHVjdCB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICVkIGluc3RlYWQgb2YgJWRcblxuIixwcm9kdWN0LGtub3duX3Byb2R1Y3QpOworCX0KKworCWZvcihpPTA7aTxMT09QQ09VTlQ7aSsrKQorCXsKKwkJbG9naWNzW2ldPTE7CisJfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oJiY6bG9naWNfYW5kKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvcihpPTA7aTxMT09QQ09VTlQ7KytpKQorCXsKKwkJbG9naWNfYW5kID0gKGxvZ2ljX2FuZCAmJiBsb2dpY3NbaV0pOworCX0KKwlpZighbG9naWNfYW5kKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gbG9naWMgQU5EIHBhcnQgMS5cbiIpOworCX0KKworCWxvZ2ljX2FuZCA9IDE7CisJbG9naWNzW0xPT1BDT1VOVC8yXT0wOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oJiY6bG9naWNfYW5kKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvcihpPTA7aTxMT09QQ09VTlQ7KytpKQorCXsKKwkJbG9naWNfYW5kID0gbG9naWNfYW5kICYmIGxvZ2ljc1tpXTsKKwl9CisJaWYobG9naWNfYW5kKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gbG9naWMgQU5EIHBhcnQgMi5cbiIpOworCX0KKworCWZvcihpPTA7aTxMT09QQ09VTlQ7aSsrKQorCXsKKwkJbG9naWNzW2ldPTA7CisJfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24ofHw6bG9naWNfb3IpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpCisJeworCQlsb2dpY19vciA9IGxvZ2ljX29yIHx8IGxvZ2ljc1tpXTsKKwl9CisJaWYobG9naWNfb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBsb2dpYyBPUiBwYXJ0IDEuXG4iKTsKKwl9CisJbG9naWNfb3IgPSAwOworCWxvZ2ljc1tMT09QQ09VTlQvMl09MTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKHx8OmxvZ2ljX29yKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvcihpPTA7aTxMT09QQ09VTlQ7KytpKQorCXsKKwkJbG9naWNfb3IgPSBsb2dpY19vciB8fCBsb2dpY3NbaV07CisJfQorCWlmKCFsb2dpY19vcikKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIGxvZ2ljIE9SIHBhcnQgMi5cbiIpOworCX0KKworCisJZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpCisJeworCQlsb2dpY3NbaV09MTsKKwl9CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigmOmJpdF9hbmQpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpCisJeworCQliaXRfYW5kID0gKGJpdF9hbmQgJiBsb2dpY3NbaV0pOworCX0KKwlpZighYml0X2FuZCkKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIEJJVCBBTkQgcGFydCAxLlxuIik7CisJfQorCisJYml0X2FuZCA9IDE7CisJbG9naWNzW0xPT1BDT1VOVC8yXT0wOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oJjpiaXRfYW5kKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvcihpPTA7aTxMT09QQ09VTlQ7KytpKQorCXsKKwkJYml0X2FuZCA9IGJpdF9hbmQgJiBsb2dpY3NbaV07CisJfQorCWlmKGJpdF9hbmQpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBCSVQgQU5EIHBhcnQgMi5cbiIpOworCX0KKworCWZvcihpPTA7aTxMT09QQ09VTlQ7aSsrKQorCXsKKwkJbG9naWNzW2ldPTA7CisJfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24ofDpiaXRfb3IpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpCisJeworCQliaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3NbaV07CisJfQorCWlmKGJpdF9vcikKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIEJJVCBPUiBwYXJ0IDFcbiIpOworCX0KKwliaXRfb3IgPSAwOworCWxvZ2ljc1tMT09QQ09VTlQvMl09MTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKHw6Yml0X29yKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvcihpPTA7aTxMT09QQ09VTlQ7KytpKQorCXsKKwkJYml0X29yID0gYml0X29yIHwgbG9naWNzW2ldOworCX0KKwlpZighYml0X29yKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gQklUIE9SIHBhcnQgMlxuIik7CisJfQorCisJZm9yKGk9MDtpPExPT1BDT1VOVDtpKyspCisJeworCQlsb2dpY3NbaV09MDsKKwl9CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiheOmV4Y2x1c2l2X2JpdF9vcik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwlmb3IoaT0wO2k8TE9PUENPVU5UOysraSkKKwl7CisJCWV4Y2x1c2l2X2JpdF9vciA9IGV4Y2x1c2l2X2JpdF9vciBeIGxvZ2ljc1tpXTsKKwl9CisJaWYoZXhjbHVzaXZfYml0X29yKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gRVhDTFVTSVYgQklUIE9SIHBhcnQgMVxuIik7CisJfQorCisJZXhjbHVzaXZfYml0X29yID0gMDsKKwlsb2dpY3NbTE9PUENPVU5ULzJdPTE7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiheOmV4Y2x1c2l2X2JpdF9vcik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwlmb3IoaT0wO2k8TE9PUENPVU5UOysraSkKKwl7CisJCWV4Y2x1c2l2X2JpdF9vciA9IGV4Y2x1c2l2X2JpdF9vciBeIGxvZ2ljc1tpXTsKKwl9CisJaWYoIWV4Y2x1c2l2X2JpdF9vcikKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIEVYQ0xVU0lWIEJJVCBPUiBwYXJ0IDJcbiIpOworCX0KKyAgICA8L29tcHRzOm9ycGhhbj4KKwkvKnByaW50ZigiXG5SZXN1bHQ6JWRcbiIscmVzdWx0KTsqLworCXJldHVybiAocmVzdWx0PT0wKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfZmlyc3Rwcml2YXRlLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfZmlyc3Rwcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkzMzgzOQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9zZWN0aW9uc19maXJzdHByaXZhdGUuYwpAQCAtMCwwICsxLDQ5IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBmaXJzdHByaXZhdGUgZGlyZWN0aXZlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgc2VjdGlvbnMgZmlyc3Rwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3BhcmFsbGVsX3NlY3Rpb25zX2ZpcnN0cHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSl7CisgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgaW50IHN1bTsKKyAgaW50IHN1bTA7CisgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgIGludCBrbm93bl9zdW07CisgIHN1bSA9NzsKKyAgc3VtMD0xMTsKKworPG9tcHRzOm9ycGhhbj4KKyNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5maXJzdHByaXZhdGUoc3VtMCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPnByaXZhdGUoc3VtMCk8L29tcHRzOmNyb3NzY2hlY2s+CisgIHsKKyNwcmFnbWEgb21wIHNlY3Rpb24gCisgICAgeworI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICAgIHsKKwlzdW09IHN1bStzdW0wOworICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAvKmVuZCBvZiBjcml0aWNhbCAqLworICAgIH0gICAgCisjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICAgIHsKKwlzdW09IHN1bStzdW0wOworICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAvKmVuZCBvZiBjcml0aWNhbCAqLworICAgIH0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgICAgeworCXN1bT0gc3VtK3N1bTA7CisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgIC8qZW5kIG9mIGNyaXRpY2FsICovCisgICAgfSAgICAgICAgICAgICAgIAorICAgIH0gICAgICAvKmVuZCBvZiBwYXJhbGxlbCBzZWN0aW9ucyovCis8L29tcHRzOm9ycGhhbj4KK2tub3duX3N1bT0xMSozKzc7CityZXR1cm4gKGtub3duX3N1bT09c3VtKTsgCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kIG9mIGNoZWNrX3NlY3Rpb25fZmlyc3Rwcml2YXRlKi8KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfbGFzdHByaXZhdGUuYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9zZWN0aW9uc19sYXN0cHJpdmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1YWU1ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfbGFzdHByaXZhdGUuYwpAQCAtMCwwICsxLDcwIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBsYXN0cHJpdmF0ZSBkaXJlY3RpdmUuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBwYXJhbGxlbCBzZWN0aW9ucyBsYXN0cHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBjcml0aWNhbCxvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZTwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9wYXJhbGxlbF9zZWN0aW9uc19sYXN0cHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSl7CisgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgaW50IHN1bTsKKyAgaW50IHN1bTA7CisgIGludCBpOworICBpbnQgaTA7CisgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgIGludCBrbm93bl9zdW07CisgIHN1bSA9MDsKKyAgc3VtMCA9IDA7CisgIGkwID0gLTE7CisgIAorICA8b21wdHM6b3JwaGFuPgorI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpLHN1bTApIDxvbXB0czpjaGVjaz5sYXN0cHJpdmF0ZShpMCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPnByaXZhdGUoaTApPC9vbXB0czpjcm9zc2NoZWNrPgorICAgIHsKKyNwcmFnbWEgb21wIHNlY3Rpb24gIAorICAgICAgeworCXN1bTA9MDsKKwlmb3IgKGk9MTtpPDQwMDtpKyspCisJICB7CisJICAgIHN1bTA9c3VtMCtpOworCSAgICBpMD1pOworCSAgfQorI3ByYWdtYSBvbXAgY3JpdGljYWwKKwl7CisJICBzdW09IHN1bStzdW0wOworCX0gICAgICAgICAgICAgICAgICAgICAgICAgLyplbmQgb2YgY3JpdGljYWwqLworICAgICAgfS8qIGVuZCBvZiBzZWN0aW9uICovCisjcHJhZ21hIG9tcCBzZWN0aW9uIAorICAgICAgeworCXN1bTA9MDsKKwlmb3IoaT00MDA7aTw3MDA7aSsrKQorCSAgeworCSAgICBzdW0wPXN1bTAraTsgICAgICAgICAgICAgICAgICAgICAgIC8qZW5kIG9mIGZvciovCisJICAgIGkwPWk7CisJICB9CisjcHJhZ21hIG9tcCBjcml0aWNhbAorCXsKKwkgIHN1bT0gc3VtK3N1bTA7CisJfSAgICAgICAgICAgICAgICAgICAgICAgICAvKmVuZCBvZiBjcml0aWNhbCovCisgICAgICB9CisjcHJhZ21hIG9tcCBzZWN0aW9uIAorICAgICAgeworCXN1bTA9MDsKKwlmb3IoaT03MDA7aTwxMDAwO2krKykKKwkgIHsKKwkgICAgc3VtMD1zdW0wK2k7CisgICAgICBpMD1pOworCSAgfQorI3ByYWdtYSBvbXAgY3JpdGljYWwKKwl7CisJICBzdW09IHN1bStzdW0wOworCX0gICAgICAgICAgICAgICAgICAgICAgICAgLyplbmQgb2YgY3JpdGljYWwqLworICAgICAgfQorICAgIH0vKiBlbmQgb2YgcGFyYWxsZWwgc2VjdGlvbnMqLworICA8L29tcHRzOm9ycGhhbj4gCisgIGtub3duX3N1bT0oOTk5KjEwMDApLzI7CisgIHJldHVybiAoKGtub3duX3N1bT09c3VtKSAmJiAoaTA9PTk5OSkgKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfcHJpdmF0ZS5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX3NlY3Rpb25zX3ByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWZlNDE0Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX3NlY3Rpb25zX3ByaXZhdGUuYwpAQCAtMCwwICsxLDY1IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgY3JpdGljYWw8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfcGFyYWxsZWxfc2VjdGlvbnNfcHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSl7CisgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgaW50IHN1bTsKKyAgaW50IHN1bTA7CisgIGludCBpOworICA8L29tcHRzOm9ycGhhbjp2YXJzPgorICBpbnQga25vd25fc3VtOworICBzdW0gPSA3OworICBzdW0wPTA7CisKKzxvbXB0czpvcnBoYW4+CisjcHJhZ21hIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlKDxvbXB0czpjaGVjaz5zdW0wLDwvb21wdHM6Y2hlY2s+IGkpCisgIHsKKyNwcmFnbWEgb21wIHNlY3Rpb24gCisgICAgeworICAgICAgPG9tcHRzOmNoZWNrPgorICAgICAgc3VtMD0wOworICAgICAgPC9vbXB0czpjaGVjaz4KKyAgICAgIGZvciAoaT0xO2k8NDAwO2krKykKKwlzdW0wPXN1bTAraTsKKyNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgICB7CisJc3VtPSBzdW0rc3VtMDsKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgLyplbmQgb2YgY3JpdGljYWwgKi8KKyAgICB9ICAgIAorI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgIDxvbXB0czpjaGVjaz4KKyAgICAgIHN1bTA9MDsKKyAgICAgIDwvb21wdHM6Y2hlY2s+CisgICAgICBmb3IoaT00MDA7aTw3MDA7aSsrKQorCXN1bTA9c3VtMCtpOworI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICAgIHsKKwlzdW09IHN1bStzdW0wOworICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAvKmVuZCBvZiBjcml0aWNhbCAqLworICAgIH0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICA8b21wdHM6Y2hlY2s+CisgICAgICBzdW0wPTA7CisgICAgICA8L29tcHRzOmNoZWNrPgorICAgICAgZm9yKGk9NzAwO2k8MTAwMDtpKyspCisJc3VtMD1zdW0wK2k7CisjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgICAgeworCXN1bT0gc3VtK3N1bTA7CisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgIC8qZW5kIG9mIGNyaXRpY2FsICovCisgICAgfSAgICAgICAgICAgICAgIAorICB9ICAgICAgICAvKmVuZCBvZiBwYXJhbGxlbCBzZWN0aW9ucyovCis8L29tcHRzOm9ycGhhbj4KK2tub3duX3N1bT0oOTk5KjEwMDApLzIrNzsKK3JldHVybiAoa25vd25fc3VtPT1zdW0pOyAKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgb2YgY2hlY2tfc2VjdGlvbl9wcml2YXRlKi8KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfcmVkdWN0aW9uLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfcmVkdWN0aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FkZWE2YQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9zZWN0aW9uc19yZWR1Y3Rpb24uYwpAQCAtMCwwICsxLDU2OCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcmVkdWN0aW9uIGRpcmVjdGl2ZSB3aXRoIGFsbCBpdHMgb3B0aW9uLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgc2VjdGlvbnMgcmVkdWN0aW9uPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9wYXJhbGxlbF9zZWN0aW9uc19yZWR1Y3Rpb248L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpeworCTxvbXB0czpvcnBoYW46dmFycz4KKyAgICBpbnQgc3VtOworCWludCBrbm93bl9zdW07CQorCWRvdWJsZSBkcHQ7CisgICAgZG91YmxlIGRzdW07CisJZG91YmxlIGRrbm93bl9zdW07CisJZG91YmxlIGR0PTAuNTsJCQkJLyogYmFzZSBvZiBnZW9tZXRyaWMgcm93IGZvciArIGFuZCAtIHRlc3QqLworCWRvdWJsZSByb3VuZGluZ19lcnJvcj0gMS5FLTU7CisJaW50IGRpZmY7CisJZG91YmxlIGRkaWZmOworCWludCBwcm9kdWN0OworCWludCBrbm93bl9wcm9kdWN0OworCWludCBsb2dpY19hbmQ7CisJaW50IGJpdF9hbmQ7CisJaW50IGxvZ2ljX29yOworCWludCBiaXRfb3I7CisJaW50IGV4Y2x1c2l2X2JpdF9vcjsKKwlpbnQgbG9naWNzWzEwMDBdOworCWludCBpOworCWludCByZXN1bHQ7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICAKKyAgICBzdW0gPSA3OworICAgIGRzdW09MDsKKyAgICBwcm9kdWN0ID0xOworICAgIGRwdCA9IDE7CisJbG9naWNfYW5kPTE7CisJYml0X2FuZD0xOworCWxvZ2ljX29yPTA7CisJYml0X29yPTA7CisJZXhjbHVzaXZfYml0X29yPTA7CisgICAgcmVzdWx0ID0wOworCS8qICBpbnQgbXlfaXNsYXJnZXI7Ki8KKwkvKmludCBpc19sYXJnZXI9MTsqLworCWtub3duX3N1bSA9ICg5OTkqMTAwMCkvMis3OworCisgICAgPG9tcHRzOm9ycGhhbj4KKyNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigrOnN1bSk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvciAoaT0xO2k8MzAwO2krKykKKwkJCXsKKwkJCQlzdW09c3VtK2k7CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yIChpPTMwMDtpPDcwMDtpKyspCisJCQl7CisJCQkJc3VtPXN1bStpOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvciAoaT03MDA7aTwxMDAwO2krKykKKwkJCXsKKwkJCQlzdW09c3VtK2k7CisJCQl9CisJCX0KKwl9CisKKwlpZihrbm93bl9zdW0hPXN1bSkKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIHN1bSB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICVkIGluc3RlYWQgb2YgJWQuXG4iLHN1bSwga25vd25fc3VtKTsKKwl9CisKKwlkaWZmID0gKDk5OSoxMDAwKS8yOworI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC06ZGlmZik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvciAoaT0xO2k8MzAwO2krKykKKwkJCXsKKwkJCQlkaWZmPWRpZmYtaTsKKwkJCX0KKwkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IgKGk9MzAwO2k8NzAwO2krKykKKwkJCXsKKwkJCQlkaWZmPWRpZmYtaTsKKwkJCX0KKwkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IgKGk9NzAwO2k8MTAwMDtpKyspCisJCQl7CisJCQkJZGlmZj1kaWZmLWk7CisJCQl9CisJCX0KKwl9CisKKworCWlmKGRpZmYgIT0gMCkKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIERpZmZlcmVuY2Ugd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAlZCBpbnN0ZWFkIG9mIDAuXG4iLGRpZmYpOworCX0KKwlmb3IgKGk9MDtpPDIwOysraSkKKwl7CisJCWRwdCo9ZHQ7CisJfQorCWRrbm93bl9zdW0gPSAoMS1kcHQpLygxLWR0KTsKKyNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigrOmRzdW0pPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IgKGk9MDtpPDY7KytpKQorCQkJeworCQkJCWRzdW0gKz0gcG93KGR0LGkpOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvciAoaT02O2k8MTI7KytpKQorCQkJeworCQkJCWRzdW0gKz0gcG93KGR0LGkpOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvciAoaT0xMjtpPDIwOysraSkKKwkJCXsKKwkJCQlkc3VtICs9IHBvdyhkdCxpKTsKKwkJCX0KKwkJfQorCX0KKworCisJaWYoIGZhYnMoZHN1bS1ka25vd25fc3VtKSA+IHJvdW5kaW5nX2Vycm9yICkKKwl7CisJCXJlc3VsdCsrOyAKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBzdW0gd2l0aCBkb3VibGVzOiBSZXN1bHQgd2FzICVmIGluc3RlYWQgb2YgJWYgKERpZmZlcmVuY2U6ICVFKVxuIixkc3VtLGRrbm93bl9zdW0sIGRzdW0tZGtub3duX3N1bSk7CisJfQorCisJZHB0PTE7CisKKwlmb3IgKGk9MDtpPDIwOysraSkKKwl7CisJCWRwdCo9ZHQ7CisJfQorCWZwcmludGYobG9nRmlsZSwiXG4iKTsKKwlkZGlmZiA9ICgxLWRwdCkvKDEtZHQpOworI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC06ZGRpZmYpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IgKGk9MDtpPDY7KytpKQorCQkJeworCQkJCWRkaWZmIC09IHBvdyhkdCxpKTsKKwkJCX0KKwkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IgKGk9NjtpPDEyOysraSkKKwkJCXsKKwkJCQlkZGlmZiAtPSBwb3coZHQsaSk7CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yIChpPTEyO2k8MjA7KytpKQorCQkJeworCQkJCWRkaWZmIC09IHBvdyhkdCxpKTsKKwkJCX0KKwkJfQorCX0KKworCWlmKCBmYWJzKGRkaWZmKSA+IHJvdW5kaW5nX2Vycm9yKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gRGlmZmVyZW5jZSB3aXRoIGRvdWJsZXM6IFJlc3VsdCB3YXMgJUUgaW5zdGVhZCBvZiAwLjBcbiIsZGRpZmYpOworCX0KKworCWtub3duX3Byb2R1Y3QgPSAzNjI4ODAwOworI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCo6cHJvZHVjdCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsJCisJCQlmb3IoaT0xO2k8MztpKyspCisJCQl7CisJCQkJcHJvZHVjdCAqPSBpOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvcihpPTM7aTw3O2krKykKKwkJCXsKKwkJCQlwcm9kdWN0ICo9IGk7CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yKGk9NztpPDExO2krKykKKwkJCXsKKwkJCQlwcm9kdWN0ICo9IGk7CisJCQl9CisJCX0KKwl9CisKKworCWlmKGtub3duX3Byb2R1Y3QgIT0gcHJvZHVjdCkKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIFByb2R1Y3Qgd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAlZCBpbnN0ZWFkIG9mICVkXG4iLHByb2R1Y3Qsa25vd25fcHJvZHVjdCk7CisJfQorCisJZm9yKGk9MDtpPDEwMDA7aSsrKQorCXsKKwkJbG9naWNzW2ldPTE7CisJfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oJiY6bG9naWNfYW5kKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCXsKKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yIChpPTE7aTwzMDA7aSsrKQorCQkJeworCQkJCWxvZ2ljX2FuZCA9IChsb2dpY19hbmQgJiYgbG9naWNzW2ldKTsKKwkJCX0KKwkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IgKGk9MzAwO2k8NzAwO2krKykKKwkJCXsKKwkJCQlsb2dpY19hbmQgPSAobG9naWNfYW5kICYmIGxvZ2ljc1tpXSk7CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yIChpPTcwMDtpPDEwMDA7aSsrKQorCQkJeworCQkJCWxvZ2ljX2FuZCA9IChsb2dpY19hbmQgJiYgbG9naWNzW2ldKTsKKwkJCX0KKwkJfQorCX0KKworCWlmKCFsb2dpY19hbmQpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBsb2dpYyBBTkQgcGFydCAxXG4iKTsKKwl9CisKKwlsb2dpY19hbmQgPSAxOworCWxvZ2ljc1s1MDFdID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCYmOmxvZ2ljX2FuZCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvciAoaT0xO2k8MzAwO2krKykKKwkJCXsKKwkJCQlsb2dpY19hbmQgPSAobG9naWNfYW5kICYmIGxvZ2ljc1tpXSk7CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yIChpPTMwMDtpPDcwMDtpKyspCisJCQl7CisJCQkJbG9naWNfYW5kID0gKGxvZ2ljX2FuZCAmJiBsb2dpY3NbaV0pOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvciAoaT03MDA7aTwxMDAwO2krKykKKwkJCXsKKwkJCQlsb2dpY19hbmQgPSAobG9naWNfYW5kICYmIGxvZ2ljc1tpXSk7CisJCQl9CisJCX0KKwl9CisKKwlpZihsb2dpY19hbmQpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBsb2dpYyBBTkQgcGFydCAyIik7CisJfQorCisJZm9yKGk9MDtpPDEwMDA7aSsrKQorCXsKKwkJbG9naWNzW2ldPTA7CisJfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24ofHw6bG9naWNfb3IpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IgKGk9MTtpPDMwMDtpKyspCisJCQl7CisJCQkJbG9naWNfb3IgPSAobG9naWNfb3IgfHwgbG9naWNzW2ldKTsKKwkJCX0KKwkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IgKGk9MzAwO2k8NzAwO2krKykKKwkJCXsKKwkJCQlsb2dpY19vciA9IChsb2dpY19vciB8fCBsb2dpY3NbaV0pOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvciAoaT03MDA7aTwxMDAwO2krKykKKwkJCXsKKwkJCQlsb2dpY19vciA9IChsb2dpY19vciB8fCBsb2dpY3NbaV0pOworCQkJfQorCQl9CisJfQorCisJaWYobG9naWNfb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBsb2dpYyBPUiBwYXJ0IDFcbiIpOworCX0KKworCWxvZ2ljX29yID0gMDsKKwlsb2dpY3NbNTAxXT0xOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24ofHw6bG9naWNfb3IpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IgKGk9MTtpPDMwMDtpKyspCisJCQl7CisJCQkJbG9naWNfb3IgPSAobG9naWNfb3IgfHwgbG9naWNzW2ldKTsKKwkJCX0KKwkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IgKGk9MzAwO2k8NzAwO2krKykKKwkJCXsKKwkJCQlsb2dpY19vciA9IChsb2dpY19vciB8fCBsb2dpY3NbaV0pOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvciAoaT03MDA7aTwxMDAwO2krKykKKwkJCXsKKwkJCQlsb2dpY19vciA9IChsb2dpY19vciB8fCBsb2dpY3NbaV0pOworCQkJfQorCQl9CisJfQorCisJaWYoIWxvZ2ljX29yKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gbG9naWMgT1IgcGFydCAyXG4iKTsKKwl9CisKKwlmb3IoaT0wO2k8MTAwMDsrK2kpCisJeworCQlsb2dpY3NbaV09MTsKKwl9CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigmOmJpdF9hbmQpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CQorCQkJZm9yKGk9MDtpPDMwMDsrK2kpCisJCQl7CisJCQkJYml0X2FuZCA9IChiaXRfYW5kICYgbG9naWNzW2ldKTsKKwkJCX0KKwkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CQorCQkJZm9yKGk9MzAwO2k8NzAwOysraSkKKwkJCXsKKwkJCQliaXRfYW5kID0gKGJpdF9hbmQgJiBsb2dpY3NbaV0pOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsJCisJCQlmb3IoaT03MDA7aTwxMDAwOysraSkKKwkJCXsKKwkJCQliaXRfYW5kID0gKGJpdF9hbmQgJiBsb2dpY3NbaV0pOworCQkJfQorCQl9CisJfQorCWlmKCFiaXRfYW5kKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gQklUIEFORCBwYXJ0IDFcbiIpOworCX0KKworCWJpdF9hbmQgPSAxOworCWxvZ2ljc1s1MDFdPTA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigmOmJpdF9hbmQpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IoaT0wO2k8MzAwOysraSkKKwkJCXsKKwkJCQliaXRfYW5kID0gYml0X2FuZCAmIGxvZ2ljc1tpXTsKKwkJCX0KKwkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IoaT0zMDA7aTw3MDA7KytpKQorCQkJeworCQkJCWJpdF9hbmQgPSBiaXRfYW5kICYgbG9naWNzW2ldOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvcihpPTcwMDtpPDEwMDA7KytpKQorCQkJeworCQkJCWJpdF9hbmQgPSBiaXRfYW5kICYgbG9naWNzW2ldOworCQkJfQorCQl9CisJfQorCWlmKGJpdF9hbmQpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBCSVQgQU5EIHBhcnQgMiIpOworCX0KKworCWZvcihpPTA7aTwxMDAwO2krKykKKwl7CisJCWxvZ2ljc1tpXT0wOworCX0KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKHw6Yml0X29yKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCXsKKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yKGk9MDtpPDMwMDsrK2kpCisJCQl7CisJCQkJYml0X29yID0gYml0X29yIHwgbG9naWNzW2ldOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvcihpPTMwMDtpPDcwMDsrK2kpCisJCQl7CisJCQkJYml0X29yID0gYml0X29yIHwgbG9naWNzW2ldOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvcihpPTcwMDtpPDEwMDA7KytpKQorCQkJeworCQkJCWJpdF9vciA9IGJpdF9vciB8IGxvZ2ljc1tpXTsKKwkJCX0KKwkJfQorCX0KKwlpZihiaXRfb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBCSVQgT1IgcGFydCAxXG4iKTsKKwl9CisJYml0X29yID0gMDsKKwlsb2dpY3NbNTAxXT0xOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24ofDpiaXRfb3IpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IoaT0wO2k8MzAwOysraSkKKwkJCXsKKwkJCQliaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3NbaV07CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yKGk9MzAwO2k8NzAwOysraSkKKwkJCXsKKwkJCQliaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3NbaV07CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yKGk9NzAwO2k8MTAwMDsrK2kpCisJCQl7CisJCQkJYml0X29yID0gYml0X29yIHwgbG9naWNzW2ldOworCQkJfQorCQl9CisJfQorCWlmKCFiaXRfb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBCSVQgT1IgcGFydCAyXG4iKTsKKwl9CisKKwlmb3IoaT0wO2k8MTAwMDtpKyspCisJeworCQlsb2dpY3NbaV09MDsKKwl9CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiheOmV4Y2x1c2l2X2JpdF9vcik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsJCisJCQlmb3IoaT0wO2k8MzAwOysraSkKKwkJCXsKKwkJCQlleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJewkKKwkJCWZvcihpPTMwMDtpPDcwMDsrK2kpCisJCQl7CisJCQkJZXhjbHVzaXZfYml0X29yID0gZXhjbHVzaXZfYml0X29yIF4gbG9naWNzW2ldOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsJCisJCQlmb3IoaT03MDA7aTwxMDAwOysraSkKKwkJCXsKKwkJCQlleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisJCQl9CisJCX0KKwl9CisJaWYoZXhjbHVzaXZfYml0X29yKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gRVhDTFVTSVYgQklUIE9SIHBhcnQgMVxuIik7CisJfQorCisJZXhjbHVzaXZfYml0X29yID0gMDsKKwlsb2dpY3NbNTAxXT0xOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oXjpleGNsdXNpdl9iaXRfb3IpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IoaT0wO2k8MzAwOysraSkKKwkJCXsKKwkJCQlleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yKGk9MzAwO2k8NzAwOysraSkKKwkJCXsKKwkJCQlleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yKGk9NzAwO2k8MTAwMDsrK2kpCisJCQl7CisJCQkJZXhjbHVzaXZfYml0X29yID0gZXhjbHVzaXZfYml0X29yIF4gbG9naWNzW2ldOworCQkJfQorCQl9CisJfQorCWlmKCFleGNsdXNpdl9iaXRfb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBFWENMVVNJViBCSVQgT1IgcGFydCAyXG4iKTsKKwl9Cis8L29tcHRzOm9ycGhhbj4KKwkvKnByaW50ZigiXG5SZXN1bHQ6JWRcbiIscmVzdWx0KTsqLworCXJldHVybiAocmVzdWx0PT0wKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfc2hhcmVkLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfc2hhcmVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYyOGUzOAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9zaGFyZWQuYwpAQCAtMCwwICsxLDQzIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIHNoYXJlZCBvcHRpb24gb2YgdGhlIHBhcmFsbGVsIGNvbnN0cnVjdC48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjMuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHBhcmFsbGVsIHNoYXJlZDwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9wYXJhbGxlbF9zaGFyZWQ8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4gKEZJTEUgKiBsb2dGaWxlKQoreworICA8b21wdHM6b3JwaGFuOnZhcnM+CisgIGludCBpOworICBpbnQgc3VtOworICA8L29tcHRzOm9ycGhhbjp2YXJzPgorICBzdW0gPSAwOworICBpbnQga25vd25fc3VtOworICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDIgOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5zaGFyZWQoc3VtKTwvb21wdHM6Y2hlY2s+IDxvbXB0czpjcm9zc2NoZWNrPmZpcnN0cHJpdmF0ZShzdW0pPC9vbXB0czpjcm9zc2NoZWNrPgorICB7CisgICAgPG9tcHRzOm9ycGhhbj4KKyAgICBpbnQgbXlzdW0gPSAwOworI3ByYWdtYSBvbXAgZm9yCisJZm9yIChpID0gMTsgaSA8PSBMT09QQ09VTlQ7IGkrKykKKwl7CisJICBteXN1bSA9IG15c3VtICsgaTsKKwl9IAorI3ByYWdtYSBvbXAgY3JpdGljYWwKKwl7CisJICBzdW0gPSBzdW0gKyBteXN1bTsKKwl9ICAgLyogZW5kIG9mIGNyaXRpY2FsICovCis8L29tcHRzOm9ycGhhbj4KKworICB9ICAgLyogZW5kIG9mIHBhcmFsbGVsICovCisgIGlmIChrbm93bl9zdW0gIT0gc3VtKSB7CisgIAlmcHJpbnRmKGxvZ0ZpbGUsICJLTk9XTl9TVU0gPSAlZDsgU1VNID0gJWRcbiIsIGtub3duX3N1bSwgc3VtKTsKKyAgfQorICByZXR1cm4gKGtub3duX3N1bSA9PSBzdW0pOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9zZWN0aW9uX2ZpcnN0cHJpdmF0ZS5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3NlY3Rpb25fZmlyc3Rwcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAzNWQxMAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9zZWN0aW9uX2ZpcnN0cHJpdmF0ZS5jCkBAIC0wLDAgKzEsNTIgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHNlY3Rpb24gZmlyc3Rwcml2YXRlIGRpcmVjdGl2ZSBieSBhZGRpbmcgYSB2YXJpYWJsZSB3aGljaCBpcyBkZWZpbmVkIGJlZm9yZSB0aGUgcGFyYWxsZWwgcmVnaW9uLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgZmlyc3Rwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3NlY3Rpb25fZmlyc3Rwcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKXsKKwk8b21wdHM6b3JwaGFuOnZhcnM+CisJICAgIGludCBzdW07CisJICAgIGludCBzdW0wOworCTwvb21wdHM6b3JwaGFuOnZhcnM+CisJaW50IGtub3duX3N1bTsKKworCXN1bTAgPSAxMTsKKwlzdW0gPSA3OworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKwl7Cis8b21wdHM6b3JwaGFuPgorI3ByYWdtYSBvbXAgIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5maXJzdHByaXZhdGUoc3VtMCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPnByaXZhdGUoc3VtMCk8L29tcHRzOmNyb3NzY2hlY2s+CisJCXsKKyNwcmFnbWEgb21wIHNlY3Rpb24gCisJCQl7CisjcHJhZ21hIG9tcCBjcml0aWNhbAorCQkJCXsKKwkJCQkJc3VtID0gc3VtICsgc3VtMDsKKwkJCQl9IC8qZW5kIG9mIGNyaXRpY2FsICovCisJCQl9ICAgIAorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworI3ByYWdtYSBvbXAgY3JpdGljYWwKKwkJCQl7CisJCQkJCXN1bSA9IHN1bSArIHN1bTA7CisJCQkJfSAvKmVuZCBvZiBjcml0aWNhbCAqLworCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworI3ByYWdtYSBvbXAgY3JpdGljYWwKKwkJCQl7CisJCQkJCXN1bSA9IHN1bSArIHN1bTA7CisJCQkJfSAvKmVuZCBvZiBjcml0aWNhbCAqLworCQkJfSAgICAgICAgICAgICAgIAorCQl9IC8qZW5kIG9mIHNlY3Rpb25zKi8KKzwvb21wdHM6b3JwaGFuPgorCX0gLyogZW5kIG9mIHBhcmFsbGVsICovCisJa25vd25fc3VtID0gMTEgKiAzICsgNzsKKwlyZXR1cm4gKGtub3duX3N1bSA9PSBzdW0pOyAKK30gLyogZW5kIG9mIGNoZWNrX3NlY3Rpb25fZmlyc3Rwcml2YXRlKi8KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfc2VjdGlvbl9sYXN0cHJpdmF0ZS5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3NlY3Rpb25fbGFzdHByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmFlMGRmCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3NlY3Rpb25fbGFzdHByaXZhdGUuYwpAQCAtMCwwICsxLDczIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBzZWN0aW9uIGxhc3Rwcml2YXRlIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHNlY3Rpb24gbGFzdHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfc2VjdGlvbl9sYXN0cHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSl7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorCWludCBpMCA9IC0xOworCWludCBzdW0gPSAwOworICAgICAgICBpbnQgaTsKKyAgICAgICAgaW50IHN1bTAgPSAwOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgaW50IGtub3duX3N1bTsKKworICAgIGkwID0gLTE7CisgICAgc3VtID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisJPG9tcHRzOm9ycGhhbj4KKyNwcmFnbWEgb21wIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5sYXN0cHJpdmF0ZShpMCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPnByaXZhdGUoaTApPC9vbXB0czpjcm9zc2NoZWNrPiBwcml2YXRlKGksc3VtMCkKKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9uICAKKwkgICAgeworCQlzdW0wID0gMDsKKwkJZm9yIChpID0gMTsgaSA8IDQwMDsgaSsrKQorCQl7CisJCSAgICBzdW0wID0gc3VtMCArIGk7CisJCSAgICBpMCA9IGk7CisJCX0KKyNwcmFnbWEgb21wIGNyaXRpY2FsCisJCXsKKwkJICAgIHN1bSA9IHN1bSArIHN1bTA7CisJCX0gLyplbmQgb2YgY3JpdGljYWwqLworCSAgICB9IC8qIGVuZCBvZiBzZWN0aW9uICovCisjcHJhZ21hIG9tcCBzZWN0aW9uIAorCSAgICB7CisJCXN1bTAgPSAwOworCQlmb3IoaSA9IDQwMDsgaSA8IDcwMDsgaSsrKQorCQl7CisJCSAgICBzdW0wID0gc3VtMCArIGk7CisJCSAgICBpMCA9IGk7CisJCX0KKyNwcmFnbWEgb21wIGNyaXRpY2FsCisJCXsKKwkJICAgIHN1bSA9IHN1bSArIHN1bTA7CisJCX0gLyplbmQgb2YgY3JpdGljYWwqLworCSAgICB9CisjcHJhZ21hIG9tcCBzZWN0aW9uIAorCSAgICB7CisJCXN1bTAgPSAwOworCQlmb3IoaSA9IDcwMDsgaSA8IDEwMDA7IGkrKykKKwkJeworCQkgICAgc3VtMCA9IHN1bTAgKyBpOworCQkgICAgaTAgPSBpOworCQl9CisjcHJhZ21hIG9tcCBjcml0aWNhbAorCQl7CisJCSAgICBzdW0gPSBzdW0gKyBzdW0wOworCQl9IC8qZW5kIG9mIGNyaXRpY2FsKi8KKwkgICAgfQorCX0gLyogZW5kIG9mIHNlY3Rpb25zKi8KKwk8L29tcHRzOm9ycGhhbj4KKyAgICB9IC8qIGVuZCBvZiBwYXJhbGxlbCovICAgIAorICAgIGtub3duX3N1bSA9ICg5OTkgKiAxMDAwKSAvIDI7CisgICAgcmV0dXJuICgoa25vd25fc3VtID09IHN1bSkgJiYgKGkwID09IDk5OSkgKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfc2VjdGlvbl9wcml2YXRlLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfc2VjdGlvbl9wcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk5YTJmOAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9zZWN0aW9uX3ByaXZhdGUuYwpAQCAtMCwwICsxLDY5IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBzZWN0aW9uIHByaXZhdGUgZGlyZWN0aXZlIGJ5IHVwY291bnRpbmcgYSB2YXJpYWJsZSBpbiBhIHRvIHNldmVyYWwgc2VjdGlvbnMgc3BsaXR0ZWQgbG9vcC48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHNlY3Rpb24gcHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBjcml0aWNhbDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9zZWN0aW9uX3ByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpeworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKwlpbnQgc3VtOworCWludCBzdW0wOworICAgIGludCBpOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgaW50IGtub3duX3N1bTsKKworICAgIHN1bSA9IDc7CisgICAgc3VtMCA9IDA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworCTxvbXB0czpvcnBoYW4+CisjcHJhZ21hIG9tcCAgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnByaXZhdGUoc3VtMCxpKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+cHJpdmF0ZShpKTwvb21wdHM6Y3Jvc3NjaGVjaz4KKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9uIAorCSAgICB7CisJCTxvbXB0czpjaGVjaz4KKyAgICAgICAgc3VtMCA9IDA7CisgICAgICAgIDwvb21wdHM6Y2hlY2s+CisJCWZvciAoaSA9IDE7IGkgPCA0MDA7IGkrKykKKwkJICAgIHN1bTAgPSBzdW0wICsgaTsKKyNwcmFnbWEgb21wIGNyaXRpY2FsCisJCXsKKwkJICAgIHN1bSA9IHN1bSArIHN1bTA7CisJCX0gLyplbmQgb2YgY3JpdGljYWwgKi8KKwkgICAgfSAgICAKKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkgICAgeworICAgICAgICAgIDxvbXB0czpjaGVjaz4KKwkJc3VtMCA9IDA7CisgICAgICAgICAgPC9vbXB0czpjaGVjaz4KKwkJZm9yIChpID0gNDAwOyBpIDwgNzAwOyBpKyspCisJCSAgICBzdW0wID0gc3VtMCArIGk7CisjcHJhZ21hIG9tcCBjcml0aWNhbAorCQl7CisJCSAgICBzdW0gPSBzdW0gKyBzdW0wOworCQl9IC8qZW5kIG9mIGNyaXRpY2FsICovCisJICAgIH0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkgICAgeworICAgICAgICAgIDxvbXB0czpjaGVjaz4KKwkJc3VtMCA9IDA7CisgICAgICAgICAgPC9vbXB0czpjaGVjaz4KKwkJZm9yIChpID0gNzAwOyBpIDwgMTAwMDsgaSsrKQorCQkgICAgc3VtMCA9IHN1bTAgKyBpOworI3ByYWdtYSBvbXAgY3JpdGljYWwKKwkJeworCQkgICAgc3VtID0gc3VtICsgc3VtMDsKKwkJfSAvKmVuZCBvZiBjcml0aWNhbCAqLworCSAgICB9ICAgICAgICAgICAgICAgCisJfSAvKmVuZCBvZiBzZWN0aW9ucyovCisJPC9vbXB0czpvcnBoYW4+CisgICAgfSAvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKyAgICBrbm93bl9zdW0gPSAoOTk5ICogMTAwMCkgLyAyICsgNzsKKyAgICByZXR1cm4gKGtub3duX3N1bSA9PSBzdW0pOyAKK30gLyogZW5kIG9mIGNoZWNrX3NlY3Rpb25fcHJpdmF0ZSovCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3NlY3Rpb25zX25vd2FpdC5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3NlY3Rpb25zX25vd2FpdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5MWEzNzUKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfc2VjdGlvbnNfbm93YWl0LmMKQEAgLTAsMCArMSw2NiBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBwYXJhbGxlbCBmb3Igbm93YWl0IGRpcmVjdGl2ZS4gSXQgZmlsbHMgYW4gYXJyYXkgd2l0aCB2YWx1ZXMgYW5kIG9wZXJhdGVzIG9uIHRoZXNlIGluIHRoZSBmb2xsb3dpbmcuPC9vbXB0czpkZXNjcmlwdGlvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHBhcmFsbGVsIHNlY3Rpb25zIG5vd2FpdDwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOnZlcnNpb24+MS4wPC9vbXB0czp2ZXJzaW9uPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBwYXJhbGxlbCBzZWN0aW9ucywgb21wIGZsdXNoPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorI2luY2x1ZGUgIm9tcF9teV9zbGVlcC5oIgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfc2VjdGlvbnNfbm93YWl0PC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+IChGSUxFICogbG9nRmlsZSkKK3sKKwk8b21wdHM6b3JwaGFuOnZhcnM+CisJCWludCByZXN1bHQ7CisJCWludCBjb3VudDsKKwk8L29tcHRzOm9ycGhhbjp2YXJzPgorCWludCBqOworCisJcmVzdWx0ID0gMDsKKwljb3VudCA9IDA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIAorCXsKKwk8b21wdHM6b3JwaGFuPgorCWludCByYW5rOworCisJcmFuayA9IG9tcF9nZXRfdGhyZWFkX251bSAoKTsKKwkKKyNwcmFnbWEgb21wIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5ub3dhaXQ8L29tcHRzOmNoZWNrPgorCQl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZnByaW50ZiAobG9nRmlsZSwgIlRocmVhZCBuciAlZCBlbnRlcnMgZmlyc3Qgc2VjdGlvbiBhbmQgZ2V0cyBzbGVlcGluZy5cbiIsIHJhbmspOworCQkJCW15X3NsZWVwKFNMRUVQVElNRSk7CisJCQkJY291bnQgPSAxOworCQkJCWZwcmludGYgKGxvZ0ZpbGUsICJUaHJlYWQgbnIgJWQgd29rZSB1cCBhbiBzZXQgY291bnQgdG8gMS5cbiIsIHJhbmspOworI3ByYWdtYSBvbXAgZmx1c2goY291bnQpCisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZnByaW50ZiAobG9nRmlsZSwgIlRocmVhZCBuciAlZCBleGVjdXRlZCB3b3JrIGluIHRoZSBmaXJzdCBzZWN0aW9uLlxuIiwgcmFuayk7CisJCQl9CisJCX0KKy8qIEJlZ2luIG9mIHNlY29uZCBzZWN0aW9ucyBlbnZpcm9ubWVudCAqLworI3ByYWdtYSBvbXAgc2VjdGlvbnMKKwkJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZwcmludGYgKGxvZ0ZpbGUsICJUaHJlYWQgbnIgJWQgZXhlY3V0ZWQgd29yayBpbiB0aGUgc2Vjb25kIHNlY3Rpb24uXG4iLCByYW5rKTsKKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmcHJpbnRmIChsb2dGaWxlLCAiVGhyZWFkIG5yICVkIGV4ZWN1dGVkIHdvcmsgaW4gdGhlIHNlY29uZCBzZWN0aW9uIGFuZCBjb250cm9scyB0aGUgdmFsdWUgb2YgY291bnRcbiIsIHJhbmspOworCQkJCWlmIChjb3VudCA9PSAwKQorCQkJCQlyZXN1bHQgPSAxOworCQkJCWZwcmludGYgKGxvZ0ZpbGUsICJjb3V0IHdhcyAlZCIsIGNvdW50KTsKKwkJCX0KKwkJfQorCTwvb21wdHM6b3JwaGFuPgorCX0KKwkKKwlyZXR1cm4gcmVzdWx0OworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9zZWN0aW9uc19yZWR1Y3Rpb24uYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9zZWN0aW9uc19yZWR1Y3Rpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTc4MjlhCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3NlY3Rpb25zX3JlZHVjdGlvbi5jCkBAIC0wLDAgKzEsNjEzIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBzZWN0aW9ucyByZWR1Y3Rpb24gZGlyZWN0aXZlIHdpdGggYWxsIGl0cyBvcHRpb25zLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgc2VjdGlvbnMgcmVkdWN0aW9uPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9zZWN0aW9uc19yZWR1Y3Rpb248L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpeworCTxvbXB0czpvcnBoYW46dmFycz4KKyAgICBpbnQgc3VtOworCWludCBrbm93bl9zdW07CisJZG91YmxlIGRwdCxkc3VtOworCWRvdWJsZSBka25vd25fc3VtOworCWRvdWJsZSBkdD0wLjU7CQkJCS8qIGJhc2Ugb2YgZ2VvbWV0cmljIHJvdyBmb3IgKyBhbmQgLSB0ZXN0Ki8KKwlkb3VibGUgcm91bmRpbmdfZXJyb3I9IDEuRS05OworCWludCBkaWZmOworCWRvdWJsZSBkZGlmZjsKKwlpbnQgcHJvZHVjdDsKKwlpbnQga25vd25fcHJvZHVjdDsKKwlpbnQgbG9naWNfYW5kOworCWludCBiaXRfYW5kOworCWludCBsb2dpY19vcjsKKwlpbnQgYml0X29yOworCWludCBleGNsdXNpdl9iaXRfb3I7CisJaW50IGxvZ2ljc1sxMDAwXTsKKwlpbnQgaTsKKwlpbnQgcmVzdWx0OworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisJLyogIGludCBteV9pc2xhcmdlcjsqLworCS8qaW50IGlzX2xhcmdlcj0xOyovCisKKyAgICBzdW0gPTc7CisgICAgZHB0ID0xOworICAgIGRzdW09MDsKKyAgICBwcm9kdWN0ID0xOworCWxvZ2ljX2FuZD0xOworCWJpdF9hbmQ9MTsKKwlsb2dpY19vcj0wOworCWJpdF9vcj0wOworCWV4Y2x1c2l2X2JpdF9vcj0wOworICAgIHJlc3VsdCA9IDA7CisJZHQgPSAxLi8zLjsKKwlrbm93bl9zdW0gPSAoOTk5KjEwMDApLzIrNzsKKzxvbXB0czpvcnBoYW4+CisjcHJhZ21hIG9tcCBwYXJhbGxlbAorCXsKKworI3ByYWdtYSBvbXAgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCs6c3VtKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCQl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yIChpPTE7aTwzMDA7aSsrKQorCQkJCXsKKwkJCQkJc3VtPXN1bStpOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IgKGk9MzAwO2k8NzAwO2krKykKKwkJCQl7CisJCQkJCXN1bT1zdW0raTsKKwkJCQl9CisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yIChpPTcwMDtpPDEwMDA7aSsrKQorCQkJCXsKKwkJCQkJc3VtPXN1bStpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCWlmKGtub3duX3N1bSE9c3VtKQorCXsKKwkJKytyZXN1bHQ7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gc3VtIHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQgaW5zdGVhZCBvZiAlZFxuIiwgc3VtLGtub3duX3N1bSk7CisJfQorCisJZGlmZiA9ICg5OTkqMTAwMCkvMjsKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisJeworI3ByYWdtYSBvbXAgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC06ZGlmZik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwkJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvciAoaT0xO2k8MzAwO2krKykKKwkJCQl7CisJCQkJCWRpZmY9ZGlmZi1pOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IgKGk9MzAwO2k8NzAwO2krKykKKwkJCQl7CisJCQkJCWRpZmY9ZGlmZi1pOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IgKGk9NzAwO2k8MTAwMDtpKyspCisJCQkJeworCQkJCQlkaWZmPWRpZmYtaTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlpZihkaWZmICE9IDApCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBEaWZmZXJlbmNlIHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQgaW5zdGVhZCBvZiAwLlxuIixkaWZmKTsKKwl9CisKKwlmb3IgKGk9MDtpPDIwOysraSkKKwl7CisJCWRwdCo9ZHQ7CisJfQorCWRrbm93bl9zdW0gPSAoMS1kcHQpLygxLWR0KTsKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisJeworI3ByYWdtYSBvbXAgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCs6ZHN1bSk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwkJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvciAoaT0wO2k8NjsrK2kpCisJCQkJeworCQkJCQlkc3VtICs9IHBvdyhkdCxpKTsKKwkJCQl9CisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yIChpPTY7aTwxMjsrK2kpCisJCQkJeworCQkJCQlkc3VtICs9IHBvdyhkdCxpKTsKKwkJCQl9CisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yIChpPTEyO2k8MjA7KytpKQorCQkJCXsKKwkJCQkJZHN1bSArPSBwb3coZHQsaSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJaWYoIGZhYnMoZHN1bS1ka25vd25fc3VtKSA+IHJvdW5kaW5nX2Vycm9yICkKKwl7CisJCXJlc3VsdCsrOyAKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBzdW0gd2l0aCBkb3VibGVzOiBSZXN1bHQgd2FzICVmIGluc3RlYWQgb2YgJWYgKERpZmZlcmVuY2U6ICVFKVxuIixkc3VtLGRrbm93bl9zdW0sIGRzdW0tZGtub3duX3N1bSk7CisJfQorCisJZHB0PTE7CisKKwlmb3IgKGk9MDtpPDIwOysraSkKKwl7CisJCWRwdCo9ZHQ7CisJfQorCWZwcmludGYobG9nRmlsZSwiXG4iKTsKKwlkZGlmZiA9ICgxLWRwdCkvKDEtZHQpOworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLTpkZGlmZik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwkJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvciAoaT0wO2k8NjsrK2kpCisJCQkJeworCQkJCQlkZGlmZiAtPSBwb3coZHQsaSk7CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvciAoaT02O2k8MTI7KytpKQorCQkJCXsKKwkJCQkJZGRpZmYgLT0gcG93KGR0LGkpOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IgKGk9MTI7aTwyMDsrK2kpCisJCQkJeworCQkJCQlkZGlmZiAtPSBwb3coZHQsaSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJaWYoIGZhYnMoZGRpZmYpID4gcm91bmRpbmdfZXJyb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBEaWZmZXJlbmNlIHdpdGggZG91YmxlczogUmVzdWx0IHdhcyAlRSBpbnN0ZWFkIG9mIDAuMFxuIixkZGlmZik7CisJfQorCisKKwlrbm93bl9wcm9kdWN0ID0gMzYyODgwMDsKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisJeworI3ByYWdtYSBvbXAgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCo6cHJvZHVjdCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwkJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJewkKKwkJCQlmb3IoaT0xO2k8MztpKyspCisJCQkJeworCQkJCQlwcm9kdWN0ICo9IGk7CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvcihpPTM7aTw3O2krKykKKwkJCQl7CisJCQkJCXByb2R1Y3QgKj0gaTsKKwkJCQl9CisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yKGk9NztpPDExO2krKykKKwkJCQl7CisJCQkJCXByb2R1Y3QgKj0gaTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlpZihrbm93bl9wcm9kdWN0ICE9IHByb2R1Y3QpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBQcm9kdWN0IHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQgaW5zdGVhZCBvZiAlZFxuIixwcm9kdWN0LGtub3duX3Byb2R1Y3QpOworCX0KKworCWZvcihpPTA7aTwxMDAwO2krKykKKwl7CisJCWxvZ2ljc1tpXT0xOworCX0KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oJiY6bG9naWNfYW5kKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCQl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yIChpPTE7aTwzMDA7aSsrKQorCQkJCXsKKwkJCQkJbG9naWNfYW5kID0gKGxvZ2ljX2FuZCAmJiBsb2dpY3NbaV0pOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IgKGk9MzAwO2k8NzAwO2krKykKKwkJCQl7CisJCQkJCWxvZ2ljX2FuZCA9IChsb2dpY19hbmQgJiYgbG9naWNzW2ldKTsKKwkJCQl9CisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yIChpPTcwMDtpPDEwMDA7aSsrKQorCQkJCXsKKwkJCQkJbG9naWNfYW5kID0gKGxvZ2ljX2FuZCAmJiBsb2dpY3NbaV0pOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCWlmKCFsb2dpY19hbmQpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBsb2dpYyBBTkQgcGFydCAxXG4iKTsKKwl9CisKKwlsb2dpY19hbmQgPSAxOworCWxvZ2ljc1s1MDFdID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oJiY6bG9naWNfYW5kKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCQl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yIChpPTE7aTwzMDA7aSsrKQorCQkJCXsKKwkJCQkJbG9naWNfYW5kID0gKGxvZ2ljX2FuZCAmJiBsb2dpY3NbaV0pOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IgKGk9MzAwO2k8NzAwO2krKykKKwkJCQl7CisJCQkJCWxvZ2ljX2FuZCA9IChsb2dpY19hbmQgJiYgbG9naWNzW2ldKTsKKwkJCQl9CisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yIChpPTcwMDtpPDEwMDA7aSsrKQorCQkJCXsKKwkJCQkJbG9naWNfYW5kID0gKGxvZ2ljX2FuZCAmJiBsb2dpY3NbaV0pOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCWlmKGxvZ2ljX2FuZCkKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIGxvZ2ljIEFORCBwYXJ0IDJcbiIpOworCX0KKworCWZvcihpPTA7aTwxMDAwO2krKykKKwl7CisJCWxvZ2ljc1tpXT0wOworCX0KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisJeworI3ByYWdtYSBvbXAgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKHx8OmxvZ2ljX29yKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCQl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yIChpPTE7aTwzMDA7aSsrKQorCQkJCXsKKwkJCQkJbG9naWNfb3IgPSAobG9naWNfb3IgfHwgbG9naWNzW2ldKTsKKwkJCQl9CisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yIChpPTMwMDtpPDcwMDtpKyspCisJCQkJeworCQkJCQlsb2dpY19vciA9IChsb2dpY19vciB8fCBsb2dpY3NbaV0pOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IgKGk9NzAwO2k8MTAwMDtpKyspCisJCQkJeworCQkJCQlsb2dpY19vciA9IChsb2dpY19vciB8fCBsb2dpY3NbaV0pOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCWlmKGxvZ2ljX29yKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiXG5FcnJvciBpbiBsb2dpYyBPUiBwYXJ0IDFcbiIpOworCX0KKworCWxvZ2ljX29yID0gMDsKKwlsb2dpY3NbNTAxXT0xOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24ofHw6bG9naWNfb3IpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJCXsKKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IgKGk9MTtpPDMwMDtpKyspCisJCQkJeworCQkJCQlsb2dpY19vciA9IChsb2dpY19vciB8fCBsb2dpY3NbaV0pOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IgKGk9MzAwO2k8NzAwO2krKykKKwkJCQl7CisJCQkJCWxvZ2ljX29yID0gKGxvZ2ljX29yIHx8IGxvZ2ljc1tpXSk7CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvciAoaT03MDA7aTwxMDAwO2krKykKKwkJCQl7CisJCQkJCWxvZ2ljX29yID0gKGxvZ2ljX29yIHx8IGxvZ2ljc1tpXSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJaWYoIWxvZ2ljX29yKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gbG9naWMgT1IgcGFydCAyXG4iKTsKKwl9CisKKworCWZvcihpPTA7aTwxMDAwOysraSkKKwl7CisJCWxvZ2ljc1tpXT0xOworCX0KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisJeworI3ByYWdtYSBvbXAgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCY6Yml0X2FuZCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwkJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJewkKKwkJCQlmb3IoaT0wO2k8MzAwOysraSkKKwkJCQl7CisJCQkJCWJpdF9hbmQgPSAoYml0X2FuZCAmIGxvZ2ljc1tpXSk7CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJewkKKwkJCQlmb3IoaT0zMDA7aTw3MDA7KytpKQorCQkJCXsKKwkJCQkJYml0X2FuZCA9IChiaXRfYW5kICYgbG9naWNzW2ldKTsKKwkJCQl9CisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CQorCQkJCWZvcihpPTcwMDtpPDEwMDA7KytpKQorCQkJCXsKKwkJCQkJYml0X2FuZCA9IChiaXRfYW5kICYgbG9naWNzW2ldKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJaWYoIWJpdF9hbmQpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBCSVQgQU5EIHBhcnQgMVxuIik7CisJfQorCisJYml0X2FuZCA9IDE7CisJbG9naWNzWzUwMV09MDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisJeworI3ByYWdtYSBvbXAgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCY6Yml0X2FuZCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwkJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvcihpPTA7aTwzMDA7KytpKQorCQkJCXsKKwkJCQkJYml0X2FuZCA9IGJpdF9hbmQgJiBsb2dpY3NbaV07CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvcihpPTMwMDtpPDcwMDsrK2kpCisJCQkJeworCQkJCQliaXRfYW5kID0gYml0X2FuZCAmIGxvZ2ljc1tpXTsKKwkJCQl9CisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yKGk9NzAwO2k8MTAwMDsrK2kpCisJCQkJeworCQkJCQliaXRfYW5kID0gYml0X2FuZCAmIGxvZ2ljc1tpXTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJaWYoYml0X2FuZCkKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIEJJVCBBTkQgcGFydCAyXG4iKTsKKwl9CisKKwlmb3IoaT0wO2k8MTAwMDtpKyspCisJeworCQlsb2dpY3NbaV09MDsKKwl9CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIAorCXsKKyNwcmFnbWEgb21wIHNlY3Rpb25zIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbih8OmJpdF9vcik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwkJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvcihpPTA7aTwzMDA7KytpKQorCQkJCXsKKwkJCQkJYml0X29yID0gYml0X29yIHwgbG9naWNzW2ldOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IoaT0zMDA7aTw3MDA7KytpKQorCQkJCXsKKwkJCQkJYml0X29yID0gYml0X29yIHwgbG9naWNzW2ldOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IoaT03MDA7aTwxMDAwOysraSkKKwkJCQl7CisJCQkJCWJpdF9vciA9IGJpdF9vciB8IGxvZ2ljc1tpXTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJaWYoYml0X29yKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gQklUIE9SIHBhcnQgMVxuIik7CisJfQorCWJpdF9vciA9IDA7CisJbG9naWNzWzUwMV09MTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisJeworI3ByYWdtYSBvbXAgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKHw6Yml0X29yKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCQl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yKGk9MDtpPDMwMDsrK2kpCisJCQkJeworCQkJCQliaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3NbaV07CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvcihpPTMwMDtpPDcwMDsrK2kpCisJCQkJeworCQkJCQliaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3NbaV07CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvcihpPTcwMDtpPDEwMDA7KytpKQorCQkJCXsKKwkJCQkJYml0X29yID0gYml0X29yIHwgbG9naWNzW2ldOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlpZighYml0X29yKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gQklUIE9SIHBhcnQgMlxuIik7CisJfQorCisJZm9yKGk9MDtpPDEwMDA7aSsrKQorCXsKKwkJbG9naWNzW2ldPTA7CisJfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oXjpleGNsdXNpdl9iaXRfb3IpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJCXsKKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsJCisJCQkJZm9yKGk9MDtpPDMwMDsrK2kpCisJCQkJeworCQkJCQlleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJewkKKwkJCQlmb3IoaT0zMDA7aTw3MDA7KytpKQorCQkJCXsKKwkJCQkJZXhjbHVzaXZfYml0X29yID0gZXhjbHVzaXZfYml0X29yIF4gbG9naWNzW2ldOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsJCisJCQkJZm9yKGk9NzAwO2k8MTAwMDsrK2kpCisJCQkJeworCQkJCQlleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisJCQkJfQorCQkJfQorCQl9CisJfQorCWlmKGV4Y2x1c2l2X2JpdF9vcikKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIEVYQ0xVU0lWIEJJVCBPUiBwYXJ0IDFcbiIpOworCX0KKworCWV4Y2x1c2l2X2JpdF9vciA9IDA7CisJbG9naWNzWzUwMV09MTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisJeworI3ByYWdtYSBvbXAgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKF46ZXhjbHVzaXZfYml0X29yKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCQl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yKGk9MDtpPDMwMDsrK2kpCisJCQkJeworCQkJCQlleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvcihpPTMwMDtpPDcwMDsrK2kpCisJCQkJeworCQkJCQlleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvcihpPTcwMDtpPDEwMDA7KytpKQorCQkJCXsKKwkJCQkJZXhjbHVzaXZfYml0X29yID0gZXhjbHVzaXZfYml0X29yIF4gbG9naWNzW2ldOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlpZighZXhjbHVzaXZfYml0X29yKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gRVhDTFVTSVYgQklUIE9SIHBhcnQgMlxuIik7CisJfQorPC9vbXB0czpvcnBoYW4+CisJLypwcmludGYoIlxuUmVzdWx0OiVkXG4iLHJlc3VsdCk7Ki8KKwlyZXR1cm4gKHJlc3VsdD09MCk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3NpbmdsZS5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3NpbmdsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzMmIwZDIKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfc2luZ2xlLmMKQEAgLTAsMCArMSw0MyBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgc2luZ2xlIGRpcmVjdGl2ZSBieSBjb250cm9sbGluZyBob3cgb2Z0ZW4gYSBkaXJlY3RpdmUgaXMgY2FsbGVkIGluIGFuIG9tcCBzaW5nbGUgcmVnaW9uLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgc2luZ2xlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIHBhcmFsbGVsIHByaXZhdGUsb21wIGZsdXNoPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3NpbmdsZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSkKK3sKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisJaW50IG5yX3RocmVhZHNfaW5fc2luZ2xlOworCWludCByZXN1bHQ7CisJaW50IG5yX2l0ZXJhdGlvbnM7CisJaW50IGk7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgIG5yX3RocmVhZHNfaW5fc2luZ2xlID0gMDsKKyAgICByZXN1bHQgPSAwOworICAgIG5yX2l0ZXJhdGlvbnMgPSAwOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBwcml2YXRlKGkpCisgICAgeworCWZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7IGkrKykKKwl7CisJICAgIDxvbXB0czpvcnBoYW4+CisJCTxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBzaW5nbGUgPC9vbXB0czpjaGVjaz4KKwkJeyAgCisjcHJhZ21hIG9tcCBmbHVzaAorCQkgICAgbnJfdGhyZWFkc19pbl9zaW5nbGUrKzsKKyNwcmFnbWEgb21wIGZsdXNoICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkgICAgbnJfaXRlcmF0aW9ucysrOworCQkgICAgbnJfdGhyZWFkc19pbl9zaW5nbGUtLTsKKwkJICAgIHJlc3VsdCA9IHJlc3VsdCArIG5yX3RocmVhZHNfaW5fc2luZ2xlOworCQl9IC8qIGVuZCBvZiBzaW5nbGUgKi8gICAgCisJICAgIDwvb21wdHM6b3JwaGFuPgorCX0gLyogZW5kIG9mIGZvciAgKi8KKyAgICB9IC8qIGVuZCBvZiBwYXJhbGxlbCAqLworICAgIHJldHVybiAoKHJlc3VsdCA9PSAwKSAmJiAobnJfaXRlcmF0aW9ucyA9PSBMT09QQ09VTlQpKTsKK30gLyogZW5kIG9mIGNoZWNrX3NpbmdsZSovCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3NpbmdsZV9jb3B5cHJpdmF0ZS5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3NpbmdsZV9jb3B5cHJpdmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjN2NkNTQKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfc2luZ2xlX2NvcHlwcml2YXRlLmMKQEAgLTAsMCArMSw1MCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgc2luZ2xlIGNvcHlwcml2YXRlIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHNpbmdsZSBjb3B5cHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBwYXJsbGVsLG9tcCBjcml0aWNhbDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgajsKKyNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUoaikKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3NpbmdsZV9jb3B5cHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAoreworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKwlpbnQgcmVzdWx0OworCWludCBucl9pdGVyYXRpb25zOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICByZXN1bHQgPSAwOworICAgIG5yX2l0ZXJhdGlvbnMgPSAwOworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisJPG9tcHRzOm9ycGhhbj4KKwkgICAgaW50IGk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyBpKyspCisJICAgIHsKKwkJLyoKKwkJICAgaW50IHRocmVhZDsKKwkJICAgdGhyZWFkID0gb21wX2dldF90aHJlYWRfbnVtICgpOworCQkgKi8KKyNwcmFnbWEgb21wIHNpbmdsZSA8b21wdHM6Y2hlY2s+Y29weXByaXZhdGUoaik8L29tcHRzOmNoZWNrPgorCQl7CisJCSAgICBucl9pdGVyYXRpb25zKys7CisJCSAgICBqID0gaTsKKwkJICAgIC8qcHJpbnRmICgidGhyZWFkICVkIGFzc2lnbnMsIGogPSAlZCwgaSA9ICVkXG4iLCB0aHJlYWQsIGosIGkpOyovCisJCX0KKwkJLyoJI3ByYWdtYSBvbXAgYmFycmllciovCisjcHJhZ21hIG9tcCBjcml0aWNhbAorCQl7CisJCSAgICAvKnByaW50ZiAoInRocmVhZCA9ICVkLCBqID0gJWQsIGkgPSAlZFxuIiwgdGhyZWFkLCBqLCBpKTsqLworCQkgICAgcmVzdWx0ID0gcmVzdWx0ICsgaiAtIGk7CisJCX0KKyNwcmFnbWEgb21wIGJhcnJpZXIKKwkgICAgfSAvKiBlbmQgb2YgZm9yICovCisJPC9vbXB0czpvcnBoYW4+CisgICAgfSAvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKyAgICByZXR1cm4gKChyZXN1bHQgPT0gMCkgJiYgKG5yX2l0ZXJhdGlvbnMgPT0gTE9PUENPVU5UKSk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3NpbmdsZV9ub3dhaXQuYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9zaW5nbGVfbm93YWl0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI3YTI1MAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9zaW5nbGVfbm93YWl0LmMKQEAgLTAsMCArMSw2MCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgc2luZ2xlIG5vd2FpdDwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBjcml0aWNhbCxvbXAgYXRvbWljPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IG15X2l0ZXJhdGlvbnM7CisjcHJhZ21hIG9tcCB0aHJlYWRwcml2YXRlKG15X2l0ZXJhdGlvbnMpCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9zaW5nbGVfbm93YWl0PC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKQoreworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKwlpbnQgbnJfaXRlcmF0aW9uczsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgaW50IHRvdGFsX2l0ZXJhdGlvbnMgPSAwOworICAgIGludCBpOworCisgICAgbnJfaXRlcmF0aW9ucyA9IDA7CisgICAgbXlfaXRlcmF0aW9ucyA9IDA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIHByaXZhdGUoaSkKKyAgICB7CisJZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgaSsrKQorCXsKKwkgICAgPG9tcHRzOm9ycGhhbj4KKwkJPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIHNpbmdsZSBub3dhaXQ8L29tcHRzOmNoZWNrPgorCQl7CisjcHJhZ21hIG9tcCBhdG9taWMgIAorCQkgICAgbnJfaXRlcmF0aW9ucysrOworCQl9IC8qIGVuZCBvZiBzaW5nbGUqLyAgICAKKwkgICAgPC9vbXB0czpvcnBoYW4+CisJfSAvKiBlbmQgb2YgZm9yICAqLworICAgIH0gLyogZW5kIG9mIHBhcmFsbGVsICovCisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIHByaXZhdGUoaSkgCisgICAgeworCW15X2l0ZXJhdGlvbnMgPSAwOworCWZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7IGkrKykKKwl7CisJICAgIDxvbXB0czpvcnBoYW4+CisJCTxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBzaW5nbGUgbm93YWl0PC9vbXB0czpjaGVjaz4KKwkJeworCQkgICAgbXlfaXRlcmF0aW9ucysrOworCQl9IC8qIGVuZCBvZiBzaW5nbGUqLyAgICAKKwkgICAgPC9vbXB0czpvcnBoYW4+CisJfSAvKiBlbmQgb2YgZm9yICAqLworI3ByYWdtYSBvbXAgY3JpdGljYWwKKwl7CisJICAgIHRvdGFsX2l0ZXJhdGlvbnMgKz0gbXlfaXRlcmF0aW9uczsKKwl9CisKKyAgICB9IC8qIGVuZCBvZiBwYXJhbGxlbCAqLworICAgIHJldHVybiAoKG5yX2l0ZXJhdGlvbnMgPT0gTE9PUENPVU5UKSAmJiAodG90YWxfaXRlcmF0aW9ucyA9PSBMT09QQ09VTlQpKTsKK30gLyogZW5kIG9mIGNoZWNrX3NpbmdsZV9ub3dhaXQqLworPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9zaW5nbGVfcHJpdmF0ZS5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3NpbmdsZV9wcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc1MDJjNwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9zaW5nbGVfcHJpdmF0ZS5jCkBAIC0wLDAgKzEsNTYgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHNpbmdsZSBwcml2YXRlIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHNpbmdlbCBwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsLG9tcCBmbHVzaCxvbXAgc2luZ2xlIG5vd2FpdDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCBteWl0ID0gMDsKKyNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUobXlpdCkKK2ludCBteXJlc3VsdCA9IDA7CisjcHJhZ21hIG9tcCB0aHJlYWRwcml2YXRlKG15cmVzdWx0KQorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfc2luZ2xlX3ByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpCit7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorCWludCBucl90aHJlYWRzX2luX3NpbmdsZTsKKwlpbnQgcmVzdWx0OworCWludCBucl9pdGVyYXRpb25zOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgaW50IGk7CisKKyAgICBteWl0ID0gMDsKKyAgICBucl90aHJlYWRzX2luX3NpbmdsZSA9IDA7CisgICAgbnJfaXRlcmF0aW9ucyA9IDA7CisgICAgcmVzdWx0ID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgcHJpdmF0ZShpKQorICAgIHsKKwlteXJlc3VsdCA9IDA7CisJbXlpdCA9IDA7CisJZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgaSsrKQorCXsKKwk8b21wdHM6b3JwaGFuPgorI3ByYWdtYSBvbXAgc2luZ2xlIDxvbXB0czpjaGVjaz5wcml2YXRlKG5yX3RocmVhZHNfaW5fc2luZ2xlKSA8L29tcHRzOmNoZWNrPm5vd2FpdAorCSAgICB7ICAKKwkJbnJfdGhyZWFkc19pbl9zaW5nbGUgPSAwOworI3ByYWdtYSBvbXAgZmx1c2gKKwkJbnJfdGhyZWFkc19pbl9zaW5nbGUrKzsKKyNwcmFnbWEgb21wIGZsdXNoICAgICAgICAgICAgICAgICAgICAgICAgIAorCQlteWl0Kys7CisJCW15cmVzdWx0ID0gbXlyZXN1bHQgKyBucl90aHJlYWRzX2luX3NpbmdsZTsKKwkgICAgfSAvKiBlbmQgb2Ygc2luZ2xlICovICAgIAorCTwvb21wdHM6b3JwaGFuPgorCX0gLyogZW5kIG9mIGZvciAqLworI3ByYWdtYSBvbXAgY3JpdGljYWwKKwl7CisgICAgICAgICAgICByZXN1bHQgKz0gbnJfdGhyZWFkc19pbl9zaW5nbGU7CisJICAgIG5yX2l0ZXJhdGlvbnMgKz0gbXlpdDsKKwl9CisgICAgfSAvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKyAgICByZXR1cm4gKChyZXN1bHQgPT0gMCkgJiYgKG5yX2l0ZXJhdGlvbnMgPT0gTE9PUENPVU5UKSk7Cit9IC8qIGVuZCBvZiBjaGVja19zaW5nbGUgcHJpdmF0ZSAqLyAKKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfdGFzay5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3Rhc2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTg5NzkwCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3Rhc2suYwpAQCAtMCwwICsxLDUyIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCB0YXNrIGRpcmVjdGl2ZS4gVGhlIGlkZWEgb2YgdGhlIHRlc3RzIGlzIHRvIGdlbmVyYXRlIGEgc2V0IG9mIHRhc2tzIGluIGEgc2luZ2xlIHJlZ2lvbi4gV2UgbGV0IHBhdXNlIHRoZSB0YXNrcyBnZW5lcmF0ZWQgc28gdGhhdCBvdGhlciB0aHJlYWRzIGdldCBzaGVkdWxlZCB0byB0aGUgbmV3bHkgb3BlbmVkIHRhc2tzLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgdGFzazwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBzaW5nbGU8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKyNpbmNsdWRlICJvbXBfbXlfc2xlZXAuaCIKKworCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfdGFzazwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSl7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgIGludCB0aWRzW05VTV9UQVNLU107CisgICAgaW50IGk7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCit7CisjcHJhZ21hIG9tcCBzaW5nbGUKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fVEFTS1M7IGkrKykgeworICAgICAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgICAgIC8qIEZpcnN0IHdlIGhhdmUgdG8gc3RvcmUgdGhlIHZhbHVlIG9mIHRoZSBsb29wIGluZGV4IGluIGEgbmV3IHZhcmlhYmxlCisgICAgICAgICAgICAgKiB3aGljaCB3aWxsIGJlIHByaXZhdGUgZm9yIGVhY2ggdGFzayBiZWNhdXNlIG90aGVyd2lzZSBpdCB3aWxsIGJlIG92ZXJ3cml0dGVuCisgICAgICAgICAgICAgKiBpZiB0aGUgZXhlY3V0aW9uIG9mIHRoZSB0YXNrIHRha2VzIGxvbmdlciB0aGFuIHRoZSB0aW1lIHdoaWNoIGlzIG5lZWRlZCB0byAKKyAgICAgICAgICAgICAqIGVudGVyIHRoZSBuZXh0IHN0ZXAgb2YgdGhlIGxvb3AhCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGludCBteWk7CisgICAgICAgICAgICBteWkgPSBpOworCis8b21wdHM6Y2hlY2s+I3ByYWdtYSBvbXAgdGFzazwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbXlfc2xlZXAgKFNMRUVQVElNRSk7CisKKyAgICAgICAgICAgICAgICB0aWRzW215aV0gPSBvbXBfZ2V0X3RocmVhZF9udW0oKTsKKyAgICAgICAgICAgIH0gLyogZW5kIG9mIG9tcCB0YXNrICovCisgICAgICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICAgICAgfSAvKiBlbmQgb2YgZm9yICovCisgICAgfSAvKiBlbmQgb2Ygc2luZ2xlICovCit9IC8qZW5kIG9mIHBhcmFsbGVsICovCisKKy8qIE5vdyB3ZSBja2VjayBpZiBtb3JlIHRoYW4gb25lIHRocmVhZCBleGVjdXRlZCB0aGUgdGFza3MuICovCisgICAgZm9yIChpID0gMTsgaSA8IE5VTV9UQVNLUzsgaSsrKSB7CisgICAgICAgIGlmICh0aWRzWzBdICE9IHRpZHNbaV0pCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9IC8qIGVuZCBvZiBjaGVja19wYXJhbGxlbF9mb3JfcHJpdmF0ZSAqLworPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF90YXNrX2ZpbmFsLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfdGFza19maW5hbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlMDBjNWYKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfdGFza19maW5hbC5jCkBAIC0wLDAgKzEsNTIgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHRhc2sgZGlyZWN0aXZlLiBUaGUgaWRlYSBvZiB0aGUgdGVzdHMgaXMgdG8gZ2VuZXJhdGUgYSBzZXQgb2YgdGFza3MgaW4gYSBzaW5nbGUgcmVnaW9uLiBXZSBsZXQgcGF1c2UgdGhlIHRhc2tzIGdlbmVyYXRlZCBzbyB0aGF0IG90aGVyIHRocmVhZHMgZ2V0IHNoZWR1bGVkIHRvIHRoZSBuZXdseSBvcGVuZWQgdGFza3MuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4zLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCB0YXNrIGZpbmFsPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIHNpbmdsZTwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorI2luY2x1ZGUgIm9tcF9teV9zbGVlcC5oIgorCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF90YXNrX2ZpbmFsPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKXsKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgaW50IHRpZHNbTlVNX1RBU0tTXTsKKyAgICBpbnQgaTsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorICAgIGludCBlcnJvcjsKKyNwcmFnbWEgb21wIHBhcmFsbGVsIAoreworI3ByYWdtYSBvbXAgc2luZ2xlCisgICAgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX1RBU0tTOyBpKyspIHsKKyAgICAgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgICAgICAvKiBGaXJzdCB3ZSBoYXZlIHRvIHN0b3JlIHRoZSB2YWx1ZSBvZiB0aGUgbG9vcCBpbmRleCBpbiBhIG5ldyB2YXJpYWJsZQorICAgICAgICAgICAgICogd2hpY2ggd2lsbCBiZSBwcml2YXRlIGZvciBlYWNoIHRhc2sgYmVjYXVzZSBvdGhlcndpc2UgaXQgd2lsbCBiZSBvdmVyd3JpdHRlbgorICAgICAgICAgICAgICogaWYgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgdGFzayB0YWtlcyBsb25nZXIgdGhhbiB0aGUgdGltZSB3aGljaCBpcyBuZWVkZWQgdG8gCisgICAgICAgICAgICAgKiBlbnRlciB0aGUgbmV4dCBzdGVwIG9mIHRoZSBsb29wIQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpbnQgbXlpOworICAgICAgICAgICAgbXlpID0gaTsKKworICAgICAgICAgICAgI3ByYWdtYSBvbXAgdGFzayA8b21wdHM6Y2hlY2s+ZmluYWwoaT49MTApPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBteV9zbGVlcCAoU0xFRVBUSU1FKTsKKworICAgICAgICAgICAgICAgIHRpZHNbbXlpXSA9IG9tcF9nZXRfdGhyZWFkX251bSgpOworICAgICAgICAgICAgfSAvKiBlbmQgb2Ygb21wIHRhc2sgKi8KKyAgICAgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgICAgICB9IC8qIGVuZCBvZiBmb3IgKi8KKyAgICB9IC8qIGVuZCBvZiBzaW5nbGUgKi8KK30gLyplbmQgb2YgcGFyYWxsZWwgKi8KKworLyogTm93IHdlIGNrZWNrIGlmIG1vcmUgdGhhbiBvbmUgdGhyZWFkIGV4ZWN1dGVkIHRoZSB0YXNrcy4gKi8KKyAgICBmb3IgKGkgPSAxMDsgaSA8IE5VTV9UQVNLUzsgaSsrKSB7CisgICAgICAgIGlmICh0aWRzWzEwXSAhPSB0aWRzW2ldKQorICAgICAgICAgICAgZXJyb3IrKzsKKyAgICB9CisgICAgcmV0dXJuIChlcnJvcj09MCk7Cit9IC8qIGVuZCBvZiBjaGVja19wYXJhbGxlbF9mb3JfcHJpdmF0ZSAqLworPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF90YXNrX2ZpcnN0cHJpdmF0ZS5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3Rhc2tfZmlyc3Rwcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FhMDc0NgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF90YXNrX2ZpcnN0cHJpdmF0ZS5jCkBAIC0wLDAgKzEsNTEgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgZmlyc3Rwcml2YXRlIGNsYXVzZSBvZiB0aGUgdGFzayBkaXJlY3RpdmUuIFdlIGNyZWF0ZSBhIHNldCBvZiB0YXNrcyBpbiBhIHNpbmdsZSByZWdpb24uIFdlIGRlZmluZXMgYSB2YXJpYWJsZSBuYW1lZCBzdW0gdW5lcXVhbCB6ZXJvIHdoaWNoIGdldHMgZGVjbGFyZWQgZmlyc3Rwcml2YXRlIGZvciBlYWNoIHRhc2suIE5vdyBlYWNoIHRhc2sgY2FsY3VhbHRlcyBhIHN1bSB1c2luZyB0aGlzIHByaXZhdGUgdmFyaWFibGUuIEJlZm9yZSBlYWNoIGNhbGN1YWxhdGlvbiBzdGVwIHdlIGludHJvZHVjZSBhIGZsdXNoIGNvbW1hbmQgc28gdGhhdCBtYXliZSB0aGUgcHJpdmF0ZSB2YXJpYWJlbCBnZXRzIGJhZC4gQXQgdGhlIGVuZCB3ZSBjaGVjayBpZiB0aGUgY2FsY3VsYXRlZCBzdW0gd2FzIHJpZ2h0Ljwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgdGFzayBmaXJzdHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgc2luZ2xlLG9tcCBmbHVzaCxvbXAgY3JpdGljYWw8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3Rhc2tfZmlyc3Rwcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+IChGSUxFICogbG9nRmlsZSkKK3sKKyAgICBpbnQgaTsKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgaW50IHN1bSA9IDEyMzQ7CisgICAgaW50IGtub3duX3N1bTsKKyAgICBpbnQgcmVzdWx0ID0gMDsgLyogY291bnRzIHRoZSB3cm9uZyBzdW1zIGZyb20gdGFza3MgKi8KKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAga25vd25fc3VtID0gMTIzNCArIChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMjsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisjcHJhZ21hIG9tcCBzaW5nbGUKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IE5VTV9UQVNLUzsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIDxvbXB0czpvcnBoYW4+CisjcHJhZ21hIG9tcCB0YXNrIDxvbXB0czpjaGVjaz5maXJzdHByaXZhdGUoc3VtKTwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgajsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8PSBMT09QQ09VTlQ7IGorKykgeworI3ByYWdtYSBvbXAgZmx1c2gKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1bSArPSBqOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLyogY2hlY2sgaWYgY2FsY3VsYXRlZCBzdW0gd2FzIHJpZ2h0ICovCisgICAgICAgICAgICAgICAgICAgIGlmIChzdW0gIT0ga25vd25fc3VtKSB7CisjcHJhZ21hIG9tcCBjcml0aWNhbCAKKyAgICAgICAgICAgICAgICAgICAgICB7IHJlc3VsdCsrOyB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IC8qIGVuZCBvZiBvbXAgdGFzayAqLworICAgICAgICAgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgICAgICAgICAgfQkvKiBlbmQgb2YgZm9yICovCisgICAgICAgIH0gLyogZW5kIG9mIHNpbmdsZSAqLworICAgIH0JLyogZW5kIG9mIHBhcmFsbGVsKi8KKworICAgIHJldHVybiAocmVzdWx0ID09IDApOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF90YXNrX2lmLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfdGFza19pZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwN2FiMmYKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfdGFza19pZi5jCkBAIC0wLDAgKzEsNDMgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgaWYgY2xhdXNlIG9mIHRoZSBvbXAgdGFzayBkaXJlY3RpdmUuIFRoZSBpZGVhciBvZiB0aGUgdGVzdHMgaXMgdG8gZ2VuZXJhdGUgYSB0YXNrcyBpbiBhIHNpbmdsZSByZWdpb24gYW5kIHBhdXNlIGl0IGltbWVkaWF0ZWx5LiBUaGUgcGFyZW50IHRocmVhZCBub3cgc2hhbGwgc2V0IGEgY291bnRlciB2YXJpYWJsZSB3aGljaCB0aGUgcGF1c2VkIHRhc2sgc2hhbGwgZXZhbHVhdGUgd2hlbiB3b2tlIHVwLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgdGFzayBpZjwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBzaW5nbGUsb21wIGZsdXNoPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisjaW5jbHVkZSAib21wX215X3NsZWVwLmgiCisKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3Rhc2tfaWY8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpeworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgICBpbnQgY29uZGl0aW9uX2ZhbHNlOworICAgIGludCBjb3VudDsKKyAgICBpbnQgcmVzdWx0OworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgY291bnQ9MDsKKyAgICBjb25kaXRpb25fZmFsc2UgPSAobG9nRmlsZSA9PSBOVUxMKTsKKyNwcmFnbWEgb21wIHBhcmFsbGVsIAoreworI3ByYWdtYSBvbXAgc2luZ2xlCisgICAgeworICAgICAgICA8b21wdHM6b3JwaGFuPgorI3ByYWdtYSBvbXAgdGFzayA8b21wdHM6Y2hlY2s+aWYgKGNvbmRpdGlvbl9mYWxzZSk8L29tcHRzOmNoZWNrPiBzaGFyZWQoY291bnQsIHJlc3VsdCkKKyAgICAgICAgeworICAgICAgICAgICAgbXlfc2xlZXAgKFNMRUVQVElNRV9MT05HKTsKKy8vI3ByYWdtYSBvbXAgZmx1c2ggKGNvdW50KQorICAgICAgICAgICAgcmVzdWx0ID0gKDAgPT0gY291bnQpOworICAgICAgICB9IC8qIGVuZCBvZiBvbXAgdGFzayAqLworICAgICAgICA8L29tcHRzOm9ycGhhbj4KKworICAgICAgICBjb3VudCA9IDE7CisvLyNwcmFnbWEgb21wIGZsdXNoIChjb3VudCkKKworICAgIH0gLyogZW5kIG9mIHNpbmdsZSAqLworfSAvKmVuZCBvZiBwYXJhbGxlbCAqLworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfdGFza19pbXBfZmlyc3Rwcml2YXRlLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfdGFza19pbXBfZmlyc3Rwcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI4ZjBlZgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF90YXNrX2ltcF9maXJzdHByaXZhdGUuYwpAQCAtMCwwICsxLDUxIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+IFRlc3QgdG8gc2VlIGlmIGltcGxpZWQgcHJpdmF0ZSB3b3JrcyBwcm9wZXJseTwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgdGFzazwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBzaW5nbGU8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworCisKKworLyogVXRpbGl0eSBmdW5jdGlvbiBkbyBzcGVuZCBzb21lIHRpbWUgaW4gYSBsb29wICovCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfdGFza19pbXBfZmlyc3Rwcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+IChGSUxFICogbG9nRmlsZSkKK3sKKyAgICBpbnQgaT01OworICAgIGludCBrID0gMDsKKyAgICBpbnQgcmVzdWx0ID0gMDsKKyAgICBpbnQgdGFza19yZXN1bHQgPSAxOworICAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZmlyc3Rwcml2YXRlKGkpCisgICAgeworICAgICAgI3ByYWdtYSBvbXAgc2luZ2xlCisgICAgICB7CisgICAgIAorICAgICAgICAKKyAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgTlVNX1RBU0tTOyBrKyspCisJICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICNwcmFnbWEgb21wIHRhc2sgc2hhcmVkKHJlc3VsdCAsIHRhc2tfcmVzdWx0PG9tcHRzOmNyb3NzY2hlY2s+LCBpPC9vbXB0czpjcm9zc2NoZWNrPikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGo7CisJCQkgIC8vY2hlY2sgaWYgaSBpcyBwcml2YXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGkgIT0gNSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrX3Jlc3VsdCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IoaiA9IDA7IGogPCBOVU1fVEFTS1M7IGorKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy90aGlzIHNob3VsZCBiZSBmaXJzdHByaXZhdGUgaW1wbGljaXRseQorICAgICAgICAgICAgICAgICAgICAgICAgfQorCQl9CisKKwkgICNwcmFnbWEgb21wIHRhc2t3YWl0CisJICByZXN1bHQgPSAodGFza19yZXN1bHQgJiYgaT09NSk7CisgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgIH0KKyAgICAKKyAgICByZXR1cm4gcmVzdWx0OworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF90YXNrX3ByaXZhdGUuYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF90YXNrX3ByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWUyNmRkCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3Rhc2tfcHJpdmF0ZS5jCkBAIC0wLDAgKzEsNTMgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgcHJpdmF0ZSBjbGF1c2Ugb2YgdGhlIHRhc2sgZGlyZWN0aXZlLiBXZSBjcmVhdGUgYSBzZXQgb2YgdGFza3MgaW4gYSBzaW5nbGUgcmVnaW9uLiBXZSBkZWZpbmVzIGEgdmFyaWFibGUgbmFtZWQgc3VtIHdoaWNoIGdldHMgZGVjbGFyZWQgcHJpdmF0ZSBmb3IgZWFjaCB0YXNrLiBOb3cgZWFjaCB0YXNrIGNhbGN1YWx0ZXMgYSBzdW0gdXNpbmcgdGhpcyBwcml2YXRlIHZhcmlhYmxlLiBCZWZvcmUgZWFjaCBjYWxjdWFsYXRpb24gc3RlcCB3ZSBpbnRyb2R1Y2UgYSBmbHVzaCBjb21tYW5kIHNvIHRoYXQgbWF5YmUgdGhlIHByaXZhdGUgdmFyaWFiZWwgZ2V0cyBiYWQuIEF0IHRoZSBlbmQgd2UgY2hlY2sgaWYgdGhlIGNhbGN1bGF0ZWQgc3VtIHdhcyByaWdodC48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjMuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHRhc2sgcHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBzaW5nbGUsb21wIGZsdXNoLG9tcCBjcml0aWNhbDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCisvKiBVdGlsaXR5IGZ1bmN0aW9uIGRvIHNwZW5kIHNvbWUgdGltZSBpbiBhIGxvb3AgKi8KK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF90YXNrX3ByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4gKEZJTEUgKiBsb2dGaWxlKQoreworICAgIGludCBpOworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgICBpbnQga25vd25fc3VtOworICAgIGludCBzdW0gPSAwOworICAgIGludCByZXN1bHQgPSAwOyAvKiBjb3VudHMgdGhlIHdyb25nIHN1bXMgZnJvbSB0YXNrcyAqLworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDI7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworI3ByYWdtYSBvbXAgc2luZ2xlCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fVEFTS1M7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICA8b21wdHM6b3JwaGFuPgorI3ByYWdtYSBvbXAgdGFzayA8b21wdHM6Y2hlY2s+cHJpdmF0ZShzdW0pPC9vbXB0czpjaGVjaz4gc2hhcmVkKHJlc3VsdCwga25vd25fc3VtKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGo7CisJCSAgICAvL2lmIHN1bSBpcyBwcml2YXRlLCBpbml0aWFsaXplIHRvIDAKKwkJICAgIDxvbXB0czpjaGVjaz5zdW0gPSAwOzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPD0gTE9PUENPVU5UOyBqKyspIHsKKyNwcmFnbWEgb21wIGZsdXNoCisgICAgICAgICAgICAgICAgICAgICAgICBzdW0gKz0gajsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvKiBjaGVjayBpZiBjYWxjdWxhdGVkIHN1bSB3YXMgcmlnaHQgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKHN1bSAhPSBrbm93bl9zdW0pIHsKKyNwcmFnbWEgb21wIGNyaXRpY2FsIAorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Kys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IC8qIGVuZCBvZiBvbXAgdGFzayAqLworICAgICAgICAgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgICAgICAgICAgfQkvKiBlbmQgb2YgZm9yICovCisgICAgICAgIH0gLyogZW5kIG9mIHNpbmdsZSAqLworICAgIH0JLyogZW5kIG9mIHBhcmFsbGVsKi8KKworICAgIHJldHVybiAocmVzdWx0ID09IDApOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF90YXNrX3NoYXJlZC5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3Rhc2tfc2hhcmVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRjMjEwOQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF90YXNrX3NoYXJlZC5jCkBAIC0wLDAgKzEsNDcgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj4gVGVzdCB0byBzZWUgaWYgaW1wbGllZCBzaGFyZWQgd29ya3MgY29ycmVjdGx5PC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4zLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCB0YXNrPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIHNpbmdsZSwgb21wIHRhc2sgZmlyc3Rwcml2YXRlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKKworCisKKy8qIFV0aWxpdHkgZnVuY3Rpb24gZG8gc3BlbmQgc29tZSB0aW1lIGluIGEgbG9vcCAqLworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3Rhc2tfaW1wX3NoYXJlZDwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPiAoRklMRSAqIGxvZ0ZpbGUpCit7CisgICA8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgaW50IGk7CisgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorICAgIGk9MDsKKyAgICBpbnQgayA9IDA7CisgICAgaW50IHJlc3VsdCA9IDA7CisKKyAgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworICAgICAgICNwcmFnbWEgb21wIHNpbmdsZQorICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBOVU1fVEFTS1M7IGsrKykgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICAgICAgICAgICAgICAjcHJhZ21hIG9tcCB0YXNrIDxvbXB0czpjcm9zc2NoZWNrPiBmaXJzdHByaXZhdGUoaSkgPC9vbXB0czpjcm9zc2NoZWNrPiA8b21wdHM6Y2hlY2s+IHNoYXJlZChpKTwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICNwcmFnbWEgb21wIGF0b21pYworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy90aGlzIHNob3VsZCBiZSBzaGFyZWQgaW1wbGljaXRseQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIDwvb21wdHM6b3JwaGFuPiAKKyAgICAgICAgICAgICAgICAgIH0KKworICAgIH0KKworcmVzdWx0ID0gaTsKK3JldHVybiAoKHJlc3VsdCA9PSBOVU1fVEFTS1MpKTsKKyAgICAgCit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3Rhc2tfdW50aWVkLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfdGFza191bnRpZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDZlYmUyCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3Rhc2tfdW50aWVkLmMKQEAgLTAsMCArMSw2OSBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3QgZm9yIHVudGllZCBjbGF1c2UuIEZpcnN0IGdlbmVyYXRlIGEgc2V0IG9mIHRhc2tzIGFuZCBwYXVzZSBpdCBpbW1lZGlhdGVseS4gVGhlbiB3ZSByZXN1bWUgaGFsZiBvZiB0aGVtIGFuZCBjaGVjayB3aGV0aGVyIHRoZXkgYXJlIHNjaGVkdWxlZCBieSBkaWZmZXJlbnQgdGhyZWFkczwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgdGFzayB1bnRpZWQ8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgdGFza3dhaXQ8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKyNpbmNsdWRlICJvbXBfbXlfc2xlZXAuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3Rhc2tfdW50aWVkPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKXsKKworICA8b21wdHM6b3JwaGFuOnZhcnM+CisgIGludCBpOworICBpbnQgY291bnQ7CisgIGludCBzdGFydF90aWRbTlVNX1RBU0tTXTsKKyAgaW50IGN1cnJlbnRfdGlkW05VTV9UQVNLU107CisgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgIGNvdW50ID0gMDsKKyAgCisgIC8qaW5pdGlhbGl6YXRpb24qLworICBmb3IgKGk9MDsgaTwgTlVNX1RBU0tTOyBpKyspeworICAgIHN0YXJ0X3RpZFtpXT0wOworICAgIGN1cnJlbnRfdGlkW2ldPTA7CisgIH0KKyAgCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZpcnN0cHJpdmF0ZShpKQorICB7CisgICAgI3ByYWdtYSBvbXAgc2luZ2xlCisgICAgeworICAgICAgZm9yIChpID0gMDsgaSA8IE5VTV9UQVNLUzsgaSsrKSB7CisgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgIGludCBteWkgPSBpOworICAgICAgICAjcHJhZ21hIG9tcCB0YXNrIDxvbXB0czpjaGVjaz51bnRpZWQ8L29tcHRzOmNoZWNrPgorICAgICAgICB7CisgICAgICAgICAgbXlfc2xlZXAoU0xFRVBUSU1FKTsKKyAgICAgICAgICBzdGFydF90aWRbbXlpXSA9IG9tcF9nZXRfdGhyZWFkX251bSgpOworICAgICAgICAgIGN1cnJlbnRfdGlkW215aV0gPSBvbXBfZ2V0X3RocmVhZF9udW0oKTsKKyAgICAgICAgICAKKyAgICAgICAgICAjcHJhZ21hIG9tcCB0YXNrd2FpdAorICAgICAgICAgIAorICAgICAgICAgIDxvbXB0czpjaGVjaz5pZigoc3RhcnRfdGlkW215aV0gJTIpICE9MCl7PC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgIG15X3NsZWVwKFNMRUVQVElNRSk7CisgICAgICAgICAgICBjdXJyZW50X3RpZFtteWldID0gb21wX2dldF90aHJlYWRfbnVtKCk7CisgICAgICAgICAgPG9tcHRzOmNoZWNrPgorICAgICAgICAgIH0gLyogZW5kIG9mIGlmICovIAorICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgY3VycmVudF90aWRbbXlpXSA9IG9tcF9nZXRfdGhyZWFkX251bSgpOworICAgICAgICAgIH0KKyAgICAgICAgICA8L29tcHRzOmNoZWNrPgorCisgICAgICAgIH0gLyplbmQgb2Ygb21wIHRhc2sgKi8KKyAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgICB9IC8qIGVuZCBvZiBmb3IgKi8KKyAgICB9IC8qIGVuZCBvZiBzaW5nbGUgKi8KKyAgfSAvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKworICBmb3IgKGk9MDtpPE5VTV9UQVNLUzsgaSsrKQorICB7CisgICAgcHJpbnRmKCJzdGFydF90aWRbJWRdPSVkLCBjdXJyZW50X3RpZFslZF09JWRcbiIsaSwgc3RhcnRfdGlkW2ldLCBpICwgY3VycmVudF90aWRbaV0pOworICAgIGlmIChjdXJyZW50X3RpZFtpXSA9PSBzdGFydF90aWRbaV0pCisgICAgICBjb3VudCsrOworICB9CisgIHJldHVybiAoY291bnQ8TlVNX1RBU0tTKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+CisKKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF90YXNrd2FpdC5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3Rhc2t3YWl0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg3NjFmMgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF90YXNrd2FpdC5jCkBAIC0wLDAgKzEsNzUgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHRhc2t3YWl0IGRpcmVjdGl2ZS4gRmlyc3Qgd2UgZ2VuZXJhdGUgYSBzZXQgb2YgdGFza3MsIHdoaWNoIHNldCB0aGUgZWxlbWVudHMgb2YgYW4gYXJyYXkgdG8gYSBzcGVjaWZpYyB2YWx1ZS4gVGhlbiB3ZSBkbyBhIHRhc2t3YWl0IGFuZCBjaGVjayBpZiBhbGwgdGFza3MgZmluaXNoZWQgbWVhbmluZyBhbGwgYXJyYXkgZWxlbWVudHMgY29udGFpbiB0aGUgcmlnaHQgdmFsdWUuIFRoZW4gd2UgZ2VuZXJhdGUgYSBzZWNvbmQgc2V0IHNldHRpbmcgdGhlIGFycmF5IGVsZW1lbnRzIHRvIGFub3RoZXIgdmFsdWUuIEFmdGVyIHRoZSBwYXJhbGxlbCByZWdpb24gd2UgY2hlY2sgaWYgYWxsIHRhc2tzIG9mIHRoZSBzZWNvbmQgc2V0IGZpbmlzaGVkIGFuZCB3ZXJlIGV4ZWN1dGVkIGFmdGVyIHRoZSB0YXNrcyBvZiB0aGUgZmlyc3Qgc2V0Ljwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgdGFza3dhaXQ8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgc2luZ2xlLG9tcCB0YXNrPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisjaW5jbHVkZSAib21wX215X3NsZWVwLmgiCisKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3Rhc2t3YWl0PC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKXsKKyAgICBpbnQgcmVzdWx0MSA9IDA7ICAgICAvKiBTdG9yZXMgbnVtYmVyIG9mIG5vdCBmaW5pc2hlZCB0YXNrcyBhZnRlciB0aGUgdGFza3dhaXQgKi8KKyAgICBpbnQgcmVzdWx0MiA9IDA7ICAgICAvKiBTdG9yZXMgbnVtYmVyIG9mIHdyb25nIGFycmF5IGVsZW1lbnRzIGF0IHRoZSBlbmQgKi8KKworICAgIGludCBhcnJheVtOVU1fVEFTS1NdOworICAgIGludCBpOworCisgICAgLyogZmlsbCBhcnJheSAqLworICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fVEFTS1M7IGkrKykgCisgICAgICAgIGFycmF5W2ldID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisgICAgeworI3ByYWdtYSBvbXAgc2luZ2xlCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fVEFTS1M7IGkrKykgeworICAgICAgICAgICAgICAgIC8qIEZpcnN0IHdlIGhhdmUgdG8gc3RvcmUgdGhlIHZhbHVlIG9mIHRoZSBsb29wIGluZGV4IGluIGEgbmV3IHZhcmlhYmxlCisgICAgICAgICAgICAgICAgICogd2hpY2ggd2lsbCBiZSBwcml2YXRlIGZvciBlYWNoIHRhc2sgYmVjYXVzZSBvdGhlcndpc2UgaXQgd2lsbCBiZSBvdmVyd3JpdHRlbgorICAgICAgICAgICAgICAgICAqIGlmIHRoZSBleGVjdXRpb24gb2YgdGhlIHRhc2sgdGFrZXMgbG9uZ2VyIHRoYW4gdGhlIHRpbWUgd2hpY2ggaXMgbmVlZGVkIHRvIAorICAgICAgICAgICAgICAgICAqIGVudGVyIHRoZSBuZXh0IHN0ZXAgb2YgdGhlIGxvb3AhCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaW50IG15aTsKKyAgICAgICAgICAgICAgICBteWkgPSBpOworI3ByYWdtYSBvbXAgdGFzaworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbXlfc2xlZXAgKFNMRUVQVElNRSk7CisgICAgICAgICAgICAgICAgICAgIGFycmF5W215aV0gPSAxOworICAgICAgICAgICAgICAgIH0gLyogZW5kIG9mIG9tcCB0YXNrICovCisgICAgICAgICAgICB9IC8qIGVuZCBvZiBmb3IgKi8KKworPG9tcHRzOm9ycGhhbj4KKzxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCB0YXNrd2FpdDwvb21wdHM6Y2hlY2s+Cis8L29tcHRzOm9ycGhhbj4KKworICAgICAgICAgICAgLyogY2hlY2sgaWYgYWxsIHRhc2tzIHdlcmUgZmluaXNoZWQgKi8KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fVEFTS1M7IGkrKykgCisgICAgICAgICAgICAgICAgaWYgKGFycmF5W2ldICE9IDEpCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdDErKzsKKworICAgICAgICAgICAgLyogZ2VuZXJhdGUgc29tZSBtb3JlIHRhc2tzIHdoaWNoIG5vdyBzaGFsbCBvdmVyd3JpdGUgCisgICAgICAgICAgICAgKiB0aGUgdmFsdWVzIGluIHRoZSB0aWRzIGFycmF5ICovCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX1RBU0tTOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgbXlpOworICAgICAgICAgICAgICAgIG15aSA9IGk7CisjcHJhZ21hIG9tcCB0YXNrCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcnJheVtteWldID0gMjsKKyAgICAgICAgICAgICAgICB9IC8qIGVuZCBvZiBvbXAgdGFzayAqLworICAgICAgICAgICAgfSAvKiBlbmQgb2YgZm9yICovCisKKyAgICAgICAgfSAvKiBlbmQgb2Ygc2luZ2xlICovCisgICAgfSAvKmVuZCBvZiBwYXJhbGxlbCAqLworCisgICAgLyogZmluYWwgY2hlY2ssIGlmIGFsbCBhcnJheSBlbGVtZW50cyBjb250YWluIHRoZSByaWdodCB2YWx1ZXM6ICovCisgICAgZm9yIChpID0gMDsgaSA8IE5VTV9UQVNLUzsgaSsrKSB7CisgICAgICAgIGlmIChhcnJheVtpXSAhPSAyKQorICAgICAgICAgICAgcmVzdWx0MisrOworICAgIH0KKworICAgIHJldHVybiAoKHJlc3VsdDEgPT0gMCkgJiYgKHJlc3VsdDIgPT0gMCkpOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF90YXNreWllbGQuYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF90YXNreWllbGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDEyNzFlCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3Rhc2t5aWVsZC5jCkBAIC0wLDAgKzEsNTkgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHRhc2t5aWVsZCBkaXJlY3RpdmUuIEZpcnN0IGdlbmVyYXRlIGEgc2V0IG9mIHRhc2tzIGFuZCBwYXVzZSBpdCBpbW1lZGlhdGVseS4gVGhlbiB3ZSByZXN1bWUgaGFsZiBvZiB0aGVtIGFuZCBjaGVjayB3aGV0aGVyIHRoZXkgYXJlIHNjaGVkdWxlZCBieSBkaWZmZXJlbnQgdGhyZWFkczwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgdGFza3lpZWxkPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIHRhc2t3YWl0PC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisjaW5jbHVkZSAib21wX215X3NsZWVwLmgiCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF90YXNreWllbGQ8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpeworCisgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgaW50IGk7CisgIGludCBjb3VudCA9IDA7CisgIGludCBzdGFydF90aWRbTlVNX1RBU0tTXTsKKyAgaW50IGN1cnJlbnRfdGlkW05VTV9UQVNLU107CisgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgIGZvciAoaT0wOyBpPCBOVU1fVEFTS1M7IGkrKyl7CisgICAgc3RhcnRfdGlkW2ldPTA7CisgICAgY3VycmVudF90aWRbaV09MDsKKyAgfQorICAKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgICNwcmFnbWEgb21wIHNpbmdsZQorICAgIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fVEFTS1M7IGkrKykgeworICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICBpbnQgbXlpID0gaTsKKyAgICAgICAgPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIHRhc2sgdW50aWVkPC9vbXB0czpjaGVjaz4KKyAgICAgICAgeworICAgICAgICAgIG15X3NsZWVwKFNMRUVQVElNRSk7CisgICAgICAgICAgc3RhcnRfdGlkW215aV0gPSBvbXBfZ2V0X3RocmVhZF9udW0oKTsKKyAgICAgICAgICAKKyAgICAgICAgICAjcHJhZ21hIG9tcCB0YXNreWllbGQKKyAgICAgICAgICAKKyAgICAgICAgICBpZigoc3RhcnRfdGlkW215aV0gJTIpID09MCl7CisgICAgICAgICAgICBteV9zbGVlcChTTEVFUFRJTUUpOworICAgICAgICAgICAgY3VycmVudF90aWRbbXlpXSA9IG9tcF9nZXRfdGhyZWFkX251bSgpOworICAgICAgICAgIH0gLyplbmQgb2YgaWYqLworICAgICAgICB9IC8qIGVuZCBvZiBvbXAgdGFzayAqLworICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICAgIH0gLyogZW5kIG9mIGZvciAqLworICAgIH0gLyogZW5kIG9mIHNpbmdsZSAqLworICB9IC8qIGVuZCBvZiBwYXJhbGxlbCAqLworCisgIGZvciAoaT0wO2k8TlVNX1RBU0tTOyBpKyspCisgIHsKKyAgICAvL3ByaW50Zigic3RhcnRfdGlkWyVkXT0lZCwgY3VycmVudF90aWRbJWRdPSVkXG4iLGksIHN0YXJ0X3RpZFtpXSwgaSAsIGN1cnJlbnRfdGlkW2ldKTsKKyAgICBpZiAoY3VycmVudF90aWRbaV0gPT0gc3RhcnRfdGlkW2ldKQorICAgICAgY291bnQrKzsKKyAgfQorICByZXR1cm4gKGNvdW50PE5VTV9UQVNLUyk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorCis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfdGVzdF9sb2NrLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfdGVzdF9sb2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg4OWRmYgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF90ZXN0X2xvY2suYwpAQCAtMCwwICsxLDQ3IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcF90ZXN0bG9jayBmdW5jdGlvbi4gVGhlIHRlc3QgY291bnRzIHRoZSB0aHJlYWRzIGVudGVyaW5nIGFuZCBleGl0aW5nIGEgc2luZ2xlIHJlZ2lvbiB3aGljaCBpcyBidWlsZCB3aXRoIGEgdGVzdF9sb2NrIGluIGFuIGVuZGxlc3MgbG9vcC48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wX3Rlc3RfbG9jazwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBmbHVzaDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK29tcF9sb2NrX3QgbGNrOworCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfdGVzdF9sb2NrPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKQoreworICAgIGludCBucl90aHJlYWRzX2luX3NpbmdsZSA9IDA7CisgICAgaW50IHJlc3VsdCA9IDA7CisgICAgaW50IG5yX2l0ZXJhdGlvbnMgPSAwOworICAgIGludCBpOworCisgICAgb21wX2luaXRfbG9jayAoJmxjayk7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIHNoYXJlZChsY2spICAKKyAgICB7CisKKyNwcmFnbWEgb21wIGZvcgorCWZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7IGkrKykKKwl7CisJICAgIC8qb21wX3NldF9sb2NrKCZsY2spOyovCisJICAgIDxvbXB0czpvcnBoYW4+CisJCTxvbXB0czpjaGVjaz53aGlsZSAoIW9tcF90ZXN0X2xvY2sgKCZsY2spKQorCQl7fTs8L29tcHRzOmNoZWNrPgorCSAgICA8L29tcHRzOm9ycGhhbj4KKyNwcmFnbWEgb21wIGZsdXNoCisJICAgIG5yX3RocmVhZHNfaW5fc2luZ2xlKys7CisjcHJhZ21hIG9tcCBmbHVzaCAgICAgICAgICAgCisJICAgIG5yX2l0ZXJhdGlvbnMrKzsKKwkgICAgbnJfdGhyZWFkc19pbl9zaW5nbGUtLTsKKwkgICAgcmVzdWx0ID0gcmVzdWx0ICsgbnJfdGhyZWFkc19pbl9zaW5nbGU7CisJICAgIDxvbXB0czpjaGVjaz5vbXBfdW5zZXRfbG9jayAoJmxjayk7PC9vbXB0czpjaGVjaz4KKwl9CisgICAgfQorICAgIG9tcF9kZXN0cm95X2xvY2soJmxjayk7CisKKyAgICByZXR1cm4gKChyZXN1bHQgPT0gMCkgJiYgKG5yX2l0ZXJhdGlvbnMgPT0gTE9PUENPVU5UKSk7CisKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfdGVzdF9uZXN0X2xvY2suYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF90ZXN0X25lc3RfbG9jay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ZDZhNDUKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfdGVzdF9uZXN0X2xvY2suYwpAQCAtMCwwICsxLDQ4IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcF90ZXN0X25lc3RfbG9jayBmdW5jdGlvbi48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wX3Rlc3RfbmVzdF9sb2NrPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGZsdXNoPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworCitzdGF0aWMgb21wX25lc3RfbG9ja190IGxjazsKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3Rlc3RfbmVzdF9sb2NrPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKQoreworICAgIAorICAgIGludCBucl90aHJlYWRzX2luX3NpbmdsZSA9IDA7CisgICAgaW50IHJlc3VsdCA9IDA7CisgICAgaW50IG5yX2l0ZXJhdGlvbnMgPSAwOworICAgIGludCBpOworCisgICAgb21wX2luaXRfbmVzdF9sb2NrICgmbGNrKTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2hhcmVkKGxjaykgCisgICAgeworCisjcHJhZ21hIG9tcCBmb3IKKwlmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyBpKyspCisJeworCSAgICAvKm9tcF9zZXRfbG9jaygmbGNrKTsqLworPG9tcHRzOm9ycGhhbj4KKwkgICAgPG9tcHRzOmNoZWNrPndoaWxlKCFvbXBfdGVzdF9uZXN0X2xvY2sgKCZsY2spKQorCSAgICB7fTs8L29tcHRzOmNoZWNrPgorPC9vbXB0czpvcnBoYW4+CisjcHJhZ21hIG9tcCBmbHVzaAorCSAgICBucl90aHJlYWRzX2luX3NpbmdsZSsrOworI3ByYWdtYSBvbXAgZmx1c2ggICAgICAgICAgIAorCSAgICBucl9pdGVyYXRpb25zKys7CisJICAgIG5yX3RocmVhZHNfaW5fc2luZ2xlLS07CisJICAgIHJlc3VsdCA9IHJlc3VsdCArIG5yX3RocmVhZHNfaW5fc2luZ2xlOworCSAgICA8b21wdHM6Y2hlY2s+b21wX3Vuc2V0X25lc3RfbG9jayAoJmxjayk7PC9vbXB0czpjaGVjaz4KKwl9CisgICAgfQorICAgIG9tcF9kZXN0cm95X25lc3RfbG9jayAoJmxjayk7CisKKyAgICByZXR1cm4gKChyZXN1bHQgPT0gMCkgJiYgKG5yX2l0ZXJhdGlvbnMgPT0gTE9PUENPVU5UKSk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3RocmVhZHByaXZhdGUuYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF90aHJlYWRwcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU0ZDdhYQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF90aHJlYWRwcml2YXRlLmMKQEAgLTAsMCArMSw5NyBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgdGhyZWFkcHJpdmF0ZSBkaXJlY3RpdmUgYnkgZmlsbGluZyBhbiBhcnJheSB3aXRoIHJhbmRvbSBudW1iZXJzIGluIGFuIHBhcmFsbGVsaXNlZCByZWdpb24uIEVhY2ggdGhyZWFkIGdlbmVyYXRlcyBvbmUgbnVtYmVyIG9mIHRoZSBhcnJheSBhbmQgc2F2ZXMgdGhpcyBpbiBhIHRlbXBvcmFyeSB0aHJlYWRwcml2YXRlIHZhcmlhYmxlLiBJbiBhIHNlY29uZCBwYXJhbGxlbGlzZWQgcmVnaW9uIHRoZSB0ZXN0IGNvbnRyb2xzLCB0aGF0IHRoZSB0ZW1wb3JhcnkgdmFyaWFibGUgY29udGFpbnMgc3RpbGwgdGhlIGZvcm1lciB2YWx1ZSBieSBjb21wYXJpbmcgaXQgd2l0aCB0aGUgb25lIGluIHRoZSBhcnJheS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHRocmVhZHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgY3JpdGljYWwsb21wX3NldF9keW5hbWljLG9tcF9nZXRfbnVtX3RocmVhZHM8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorLyoKKyAqIFRocmVhZHByaXZhdGUgaXMgdGVzdGVkIGluIDIgd2F5czoKKyAqIDEuIFRoZSBnbG9iYWwgdmFyaWFibGUgZGVjbGFyZWQgYXMgdGhyZWFkcHJpdmF0ZSBzaG91bGQgaGF2ZQorICogICAgbG9jYWwgY29weSBmb3IgZWFjaCB0aHJlYWQuIE90aGVyd2lzZSByYWNlIGNvbmRpdGlvbiBhbmQgCisgKiAgICB3cm9uZyByZXN1bHQuCisgKiAyLiBJZiB0aGUgdmFsdWUgb2YgbG9jYWwgY29weSBpcyByZXRhaW5lZCBmb3IgdGhlIHR3byBhZGphY2VudAorICogICAgcGFyYWxsZWwgcmVnaW9ucworICovCisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKK3N0YXRpYyBpbnQgc3VtMD0wOworc3RhdGljIGludCBteXZhbHVlID0gMDsKKworPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUoc3VtMCk8L29tcHRzOmNoZWNrPgorPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUobXl2YWx1ZSk8L29tcHRzOmNoZWNrPgorCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF90aHJlYWRwcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKQoreworCWludCBzdW0gPSAwOworCWludCBrbm93bl9zdW07CisJaW50IGk7IAorCWludCBpdGVyOworCWludCAqZGF0YTsKKwlpbnQgc2l6ZTsKKwlpbnQgZmFpbGVkID0gMDsKKwlpbnQgbXlfcmFuZG9tOworCW9tcF9zZXRfZHluYW1pYygwKTsKKworICAgICNwcmFnbWEgb21wIHBhcmFsbGVsIHByaXZhdGUoaSkgCisgICAgeworCSAgc3VtMCA9IDA7CisgICAgICAjcHJhZ21hIG9tcCBmb3IgCisJICAgIGZvciAoaSA9IDE7IGkgPD0gTE9PUENPVU5UOyBpKyspCisJCXsKKwkJCXN1bTAgPSBzdW0wICsgaTsKKwkJfSAvKmVuZCBvZiBmb3IqLworICAgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKwkgIHsKKwkgICAgICBzdW0gPSBzdW0gKyBzdW0wOworCSAgfSAvKmVuZCBvZiBjcml0aWNhbCAqLworCX0gLyogZW5kIG9mIHBhcmFsbGVsICovICAgIAorCWtub3duX3N1bSA9IChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMjsKKwlpZiAoa25vd25fc3VtICE9IHN1bSApIHsKKwkJZnByaW50ZiAobG9nRmlsZSwgIiBrbm93bl9zdW0gPSAlZCwgc3VtID0gJWRcbiIsIGtub3duX3N1bSwgc3VtKTsKKwl9CisKKwkvKiB0aGUgbmV4dCBwYXJhbGxlbCByZWdpb24gaXMganVzdCB1c2VkIHRvIGdldCB0aGUgbnVtYmVyIG9mIHRocmVhZHMqLworCW9tcF9zZXRfZHluYW1pYygwKTsKKyAgICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorCXsKKyAgICAgICNwcmFnbWEgb21wIG1hc3RlcgorCSAgeworCQkJc2l6ZT1vbXBfZ2V0X251bV90aHJlYWRzKCk7CisJCQlkYXRhPShpbnQqKSBtYWxsb2Moc2l6ZSpzaXplb2YoaW50KSk7CisJICB9CisJfS8qIGVuZCBwYXJhbGxlbCovCisKKworCXNyYW5kKDQ1KTsKKwlmb3IgKGl0ZXIgPSAwOyBpdGVyIDwgMTAwOyBpdGVyKyspeworCQlteV9yYW5kb20gPSByYW5kKCk7CS8qIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGlzIGNhbGxlZCBpbnNpZGUgc2VyaWFsIHJlZ2lvbiovCisKKwkvKiB0aGUgZmlyc3QgcGFyYWxsZWwgcmVnaW9uIGlzIHVzZWQgdG8gaW5pdGlhbGl5ZSBteXZhbHVlIGFuZCB0aGUgYXJyYXkgd2l0aCBteV9yYW5kb20rcmFuayovCisgICAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKwl7CisJICAgIGludCByYW5rOworCQlyYW5rID0gb21wX2dldF90aHJlYWRfbnVtICgpOworCQlteXZhbHVlID0gZGF0YVtyYW5rXSA9IG15X3JhbmRvbSArIHJhbms7CisJfQorCisJLyogdGhlIHNlY29uZCBwYXJhbGxlbCByZWdpb24gdmVyaWZpZXMgdGhhdCB0aGUgdmFsdWUgb2YgIm15dmFsdWUiIGlzIHJldGFpbmVkICovCisgICAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgcmVkdWN0aW9uKCs6ZmFpbGVkKQorCXsKKwkgICAgaW50IHJhbms7CisJCXJhbmsgPSBvbXBfZ2V0X3RocmVhZF9udW0gKCk7CisJCWZhaWxlZCA9IGZhaWxlZCArIChteXZhbHVlICE9IGRhdGFbcmFua10pOworCQlpZihteXZhbHVlICE9IGRhdGFbcmFua10peworCQkgIGZwcmludGYgKGxvZ0ZpbGUsICIgbXl2YWx1ZSA9ICVkLCBkYXRhW3JhbmtdPSAlZFxuIiwgbXl2YWx1ZSwgZGF0YVtyYW5rXSk7CisJCX0KKwl9CisgIH0KKyAgZnJlZSAoZGF0YSk7CisKKwlyZXR1cm4gKGtub3duX3N1bSA9PSBzdW0pICYmICFmYWlsZWQ7CisKK30gLyogZW5kIG9mIGNoZWNrX3RocmVhZHByaXZhdGUqLworPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF90aHJlYWRwcml2YXRlX2Zvci5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3RocmVhZHByaXZhdGVfZm9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM0MzU5ZAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF90aHJlYWRwcml2YXRlX2Zvci5jCkBAIC0wLDAgKzEsNDQgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyBpZiBhIHZhcmlhYmxlIGRlY2xhcmVkIGFzIHRocmVhZHByaXZhdGUgY2FuIGJlIHVzZWQgYXMgYSBsb29waW5kZXguPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCB0aHJlYWRwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworc3RhdGljIGludCBpOworPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUoaSk8L29tcHRzOmNoZWNrPgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfdGhyZWFkcHJpdmF0ZV9mb3I8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpCit7CisJCWludCBrbm93bl9zdW07CisJCWludCBzdW07CisJCWtub3duX3N1bSA9IChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMjsKKwkJc3VtID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKwl7CisJCWludCBzdW0wID0gMDsKKyNwcmFnbWEgb21wIGZvcgorCQlmb3IgKGkgPSAxOyBpIDw9IExPT1BDT1VOVDsgaSsrKQorCQl7CisJCQlzdW0wID0gc3VtMCArIGk7CisJCX0gLyplbmQgb2YgZm9yKi8KKyNwcmFnbWEgb21wIGNyaXRpY2FsCisJCXsKKwkJCXN1bSA9IHN1bSArIHN1bTA7CisJCX0gLyplbmQgb2YgY3JpdGljYWwgKi8KKwl9IC8qIGVuZCBvZiBwYXJhbGxlbCAqLyAgICAKKwkKKwlpZiAoa25vd25fc3VtICE9IHN1bSApIHsKKwkJZnByaW50ZiAobG9nRmlsZSwgIiBrbm93bl9zdW0gPSAlZCwgc3VtID0gJWRcbiIsIGtub3duX3N1bSwgc3VtKTsKKwl9CisKKwlyZXR1cm4gKGtub3duX3N1bSA9PSBzdW0pOworCit9IC8qIGVuZCBvZiBjaGVja190aHJlYWRwcml2YXRlKi8KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CisKZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jb21tb25fdXRpbGl0eS5mIGIvZmluYWwvdGVzdHN1aXRlL2NvbW1vbl91dGlsaXR5LmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZkMTA3OAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jb21tb25fdXRpbGl0eS5mCkBAIC0wLDAgKzEsNTcgQEAKKyAgICAgIHN1YnJvdXRpbmUgcHJpbnRfcmVzdWx0KHMsY3Jvc3NmYWlsZWQsTSxuYW1lKSAgICAgCisgICAgICBpbXBsaWNpdCBub25lCisgICAgICBjaGFyYWN0ZXIgKGxlbj0qKTo6bmFtZQorCSAgIHJlYWwgY2VydAorCSAgIGludGVnZXIgTSxjcm9zc2ZhaWxlZAorCSAgIGludGVnZXIgcworCSAgIGNoYXJhY3RlciAobGVuPTExKSA6OiBjCisgCSAgIGNoYXJhY3RlciAobGVuPTE4KSA6OiBjMgorCSAgIGNlcnQ9MTAwLjAqY3Jvc3NmYWlsZWQvTQorISAgICAgICAgICAgcHJpbnQgKiwgImNlcnQiLCBjZXJ0LCAiY3Jvc3MgIiwgY3Jvc3NmYWlsZWQKKyEJdGVzdDE9aHVuZHJlZCpjcm9zc2ZhaWxlZAorCSAgIGM9IiUgY2VydGFpbnR5IgorCSAgIGMyPSIgLi4uIHZlcmlmaWVkIHdpdGggIgorICAgICAgaWYocy5lcS4xKSB0aGVuCisgICAgICAgICB3cml0ZSAoKiwiKEEsIEEsIEY3LjIsIEEpIikgbmFtZSwgYzIsIGNlcnQsIGMKKyAgICAgIGVsc2UKKyAgICAgICAgIHdyaXRlICgqLCIoQSxBKSIpIG5hbWUsIiAuLi4gRkFJTEVEIgorICAgICAgZW5kaWYKKwkgICBlbmQKKworICAgICAgc3Vicm91dGluZSBkb190ZXN0KHRlc3RfZnVuYyxjcm9zc190ZXN0X2Z1bmMsbmFtZSxOLGZhaWxlZCwKKyAgICAgeCAgbnVtX3Rlc3RzLGNyb3NzY2hlY2tlZCkKKyAgICAgIGltcGxpY2l0IG5vbmUKKyAgICAgIGludGVnZXIgc3VjY2VlZAorICAgICAgaW50ZWdlciBjcm9zc2ZhaWwKKyAgICAgIGludGVnZXIgZmFpbGVkCisgICAgICBpbnRlZ2VyLCBleHRlcm5hbDo6dGVzdF9mdW5jCisgICAgICBpbnRlZ2VyLCBleHRlcm5hbDo6Y3Jvc3NfdGVzdF9mdW5jCisgICAgICBjaGFyYWN0ZXIgKGxlbj0qKTo6bmFtZQorICAgICAgaW50ZWdlciBmYWlsCisgICAgICBpbnRlZ2VyIE4saQorICAgICAgaW50ZWdlciBudW1fdGVzdHMsY3Jvc3NjaGVja2VkCisgICAgICBudW1fdGVzdHM9bnVtX3Rlc3RzKzEKKyAgICAgIHN1Y2NlZWQ9MQorICAgICAgY3Jvc3NmYWlsPTAKKyAgICAgIGZhaWw9MAorICAgICAgZG8gaT0xLE4KKyAgICAgICAgIGlmKHRlc3RfZnVuYygpLmVxLjApIHRoZW4KKyAgICAgICAgICAgIHN1Y2NlZWQ9MAorICAgICAgICAgICAgZmFpbD1mYWlsKzEKKyAgICAgICAgICAgIGV4aXQKKyAgICAgICAgIGVuZCBpZgorICAgICAgICAgaWYoY3Jvc3NfdGVzdF9mdW5jKCkuZXEuMCkgdGhlbgorISAgICAgICAgICAgIHByaW50ICosIGNyb3NzZmFpbAorICAgICAgICAgICAgY3Jvc3NmYWlsPWNyb3NzZmFpbCsxLjAgCisgICAgICAgICBlbmQgaWYKKyAgICAgIGVuZGRvCisgICAgICAKKyAgICAgIGlmIChmYWlsIC5uZS4gMCkgdGhlbgorICAgICAgICAgZmFpbGVkPWZhaWxlZCsxCisgICAgICBlbHNlCisgICAgICAgICBpZihjcm9zc2ZhaWwgLm5lLiAwKSB0aGVuCisgICAgICAgICAgICBjcm9zc2NoZWNrZWQ9Y3Jvc3NjaGVja2VkKzEKKyAgICAgICAgIGVuZCBpZgorICAgICAgZW5kaWYKKyAgICAgIGNhbGwgcHJpbnRfcmVzdWx0KHN1Y2NlZWQsY3Jvc3NmYWlsLE4sbmFtZSkKKyAgICAgIGVuZApkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2N1c3RvbXRlc3QudHh0IGIvZmluYWwvdGVzdHN1aXRlL2N1c3RvbXRlc3QudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ZDA1YWUKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvY3VzdG9tdGVzdC50eHQKQEAgLTAsMCArMSwyIEBACisjIEFkZCBjdXN0b20gdGVzdHMgaW4gdGhpcyBsaXN0CitvbXBfcGFyYWxsZWxfY29weWluCmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9PTVAxX1RFU1QgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9PTVAxX1RFU1QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE2NGNlMAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL09NUDFfVEVTVApAQCAtMCwwICsxLDM2IEBACitoYXNfb3Blbm1wCitvbXBfbmVzdGVkCitvbXBfZ2V0X251bV90aHJlYWRzCitvbXBfaW5fcGFyYWxsZWwKK2RvX29yZGVyZWQKK2RvX3JlZHVjdGlvbgorZG9fcHJpdmF0ZQorZG9fZmlyc3Rwcml2YXRlCitkb19sYXN0cHJpdmF0ZQorc2VjdGlvbl9yZWR1Y3Rpb24KK3NlY3Rpb25fcHJpdmF0ZQorc2VjdGlvbl9maXJzdHByaXZhdGUKK3NlY3Rpb25fbGFzdHByaXZhdGUKK3NpbmdsZQorc2luZ2xlX3ByaXZhdGUKK3NpbmdsZV9ub3dhaXQKK3Bhcl9kb19vcmRlcmVkCitwYXJfZG9fcmVkdWN0aW9uCitwYXJfZG9fcHJpdmF0ZQorcGFyX2RvX2ZpcnN0cHJpdmF0ZQorcGFyX2RvX2xhc3Rwcml2YXRlCitwYXJfc2VjdGlvbl9yZWR1Y3Rpb24KK3Bhcl9zZWN0aW9uX3ByaXZhdGUKK3Bhcl9zZWN0aW9uX2ZpcnN0cHJpdmF0ZQorcGFyX3NlY3Rpb25fbGFzdHByaXZhdGUKK29tcF9tYXN0ZXJfdGhyZWFkCitvbXBfY3JpdGljYWwKK29tcF9hdG9taWMKK29tcF9iYXJyaWVyCitvbXBfZmx1c2gKK29tcF90aHJlYWRwcml2YXRlCitvbXBfY29weWluCitvbXBfbG9jaworb21wX3Rlc3Rsb2NrCitvbXBfbmVzdF9sb2NrCitvbXBfbmVzdF90ZXN0bG9jawpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vT01QMl9URVNUIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vT01QMl9URVNUCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNDc2NjUKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9PTVAyX1RFU1QKQEAgLTAsMCArMSw1IEBACitvbXBfbnVtX3RocmVhZHMKK29tcF93b3Jrc2hhcmUKK29tcF90aW1lCitvbXBfdGlja3NfdGltZQorc2luZ2xlX2NvcHlwcml2YXRlCmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9jb21tb25fdXRpbGl0eS5mIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vY29tbW9uX3V0aWxpdHkuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmQxMDc4Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vY29tbW9uX3V0aWxpdHkuZgpAQCAtMCwwICsxLDU3IEBACisgICAgICBzdWJyb3V0aW5lIHByaW50X3Jlc3VsdChzLGNyb3NzZmFpbGVkLE0sbmFtZSkgICAgIAorICAgICAgaW1wbGljaXQgbm9uZQorICAgICAgY2hhcmFjdGVyIChsZW49Kik6Om5hbWUKKwkgICByZWFsIGNlcnQKKwkgICBpbnRlZ2VyIE0sY3Jvc3NmYWlsZWQKKwkgICBpbnRlZ2VyIHMKKwkgICBjaGFyYWN0ZXIgKGxlbj0xMSkgOjogYworIAkgICBjaGFyYWN0ZXIgKGxlbj0xOCkgOjogYzIKKwkgICBjZXJ0PTEwMC4wKmNyb3NzZmFpbGVkL00KKyEgICAgICAgICAgIHByaW50ICosICJjZXJ0IiwgY2VydCwgImNyb3NzICIsIGNyb3NzZmFpbGVkCishCXRlc3QxPWh1bmRyZWQqY3Jvc3NmYWlsZWQKKwkgICBjPSIlIGNlcnRhaW50eSIKKwkgICBjMj0iIC4uLiB2ZXJpZmllZCB3aXRoICIKKyAgICAgIGlmKHMuZXEuMSkgdGhlbgorICAgICAgICAgd3JpdGUgKCosIihBLCBBLCBGNy4yLCBBKSIpIG5hbWUsIGMyLCBjZXJ0LCBjCisgICAgICBlbHNlCisgICAgICAgICB3cml0ZSAoKiwiKEEsQSkiKSBuYW1lLCIgLi4uIEZBSUxFRCIKKyAgICAgIGVuZGlmCisJICAgZW5kCisKKyAgICAgIHN1YnJvdXRpbmUgZG9fdGVzdCh0ZXN0X2Z1bmMsY3Jvc3NfdGVzdF9mdW5jLG5hbWUsTixmYWlsZWQsCisgICAgIHggIG51bV90ZXN0cyxjcm9zc2NoZWNrZWQpCisgICAgICBpbXBsaWNpdCBub25lCisgICAgICBpbnRlZ2VyIHN1Y2NlZWQKKyAgICAgIGludGVnZXIgY3Jvc3NmYWlsCisgICAgICBpbnRlZ2VyIGZhaWxlZAorICAgICAgaW50ZWdlciwgZXh0ZXJuYWw6OnRlc3RfZnVuYworICAgICAgaW50ZWdlciwgZXh0ZXJuYWw6OmNyb3NzX3Rlc3RfZnVuYworICAgICAgY2hhcmFjdGVyIChsZW49Kik6Om5hbWUKKyAgICAgIGludGVnZXIgZmFpbAorICAgICAgaW50ZWdlciBOLGkKKyAgICAgIGludGVnZXIgbnVtX3Rlc3RzLGNyb3NzY2hlY2tlZAorICAgICAgbnVtX3Rlc3RzPW51bV90ZXN0cysxCisgICAgICBzdWNjZWVkPTEKKyAgICAgIGNyb3NzZmFpbD0wCisgICAgICBmYWlsPTAKKyAgICAgIGRvIGk9MSxOCisgICAgICAgICBpZih0ZXN0X2Z1bmMoKS5lcS4wKSB0aGVuCisgICAgICAgICAgICBzdWNjZWVkPTAKKyAgICAgICAgICAgIGZhaWw9ZmFpbCsxCisgICAgICAgICAgICBleGl0CisgICAgICAgICBlbmQgaWYKKyAgICAgICAgIGlmKGNyb3NzX3Rlc3RfZnVuYygpLmVxLjApIHRoZW4KKyEgICAgICAgICAgICBwcmludCAqLCBjcm9zc2ZhaWwKKyAgICAgICAgICAgIGNyb3NzZmFpbD1jcm9zc2ZhaWwrMS4wIAorICAgICAgICAgZW5kIGlmCisgICAgICBlbmRkbworICAgICAgCisgICAgICBpZiAoZmFpbCAubmUuIDApIHRoZW4KKyAgICAgICAgIGZhaWxlZD1mYWlsZWQrMQorICAgICAgZWxzZQorICAgICAgICAgaWYoY3Jvc3NmYWlsIC5uZS4gMCkgdGhlbgorICAgICAgICAgICAgY3Jvc3NjaGVja2VkPWNyb3NzY2hlY2tlZCsxCisgICAgICAgICBlbmQgaWYKKyAgICAgIGVuZGlmCisgICAgICBjYWxsIHByaW50X3Jlc3VsdChzdWNjZWVkLGNyb3NzZmFpbCxOLG5hbWUpCisgICAgICBlbmQKZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL2RvX2NvbGxhcHNlLmYgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9kb19jb2xsYXBzZS5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4MTcyNTAKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9kb19jb2xsYXBzZS5mCkBAIC0wLDAgKzEsNjcgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdpdGggb21wIGZvciBjb2xsYXBzZSBjbGF1c2UuIEJpbmQgd2l0aCB0d28gbG9vcHMuIFdpdGhvdXQgdGhlIGNvbGxhcHNlIGNsYXVzZSwgdGhlIGZpcnN0IGxvb3Agd2lsbCBub3QgYmUgb3JkZXJlZDwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgZG8gY29sbGFwc2U8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgY3JpdGljYWwsb21wIGRvIHNjaGVkdWxlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIExPR0lDQUwgRlVOQ1RJT04gY2hlY2tfaXNfbGFyZ2VyKGkpCisgICAgICAgIGltcGxpY2l0IG5vbmUKKyAgICAgICAgSU5URUdFUiA6OiBpCisgICAgICAgIElOVEVHRVIsIHNhdmUgOjogbGFzdF9pCisgICAgICAgIExPR0lDQUwgOjogaXNfbGFyZ2VyCisKKyAgICAgICAgaWYgKGkgLmVxLiAxKSBsYXN0X2kgPSAwCisKKyAgICAgICAgaXNfbGFyZ2VyID0gKGkgLmdlLiBsYXN0X2kpIC5hbmQuICgoaS1sYXN0X2kpIC5sZS4gMSkKKyAgICAgICAgbGFzdF9pID0gaQorCisgICAgICAgIGNoZWNrX2lzX2xhcmdlciA9IGlzX2xhcmdlcgorCisgICAgICBFTkQgRlVOQ1RJT04gY2hlY2tfaXNfbGFyZ2VyCisKKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5kb19jb2xsYXBzZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5URUdFUiBpLCBqCis8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIExPR0lDQUwgY2hlY2tfaXNfbGFyZ2VyCisgICAgICAgIExPR0lDQUwgbXlfaXNfbGFyZ2VyCisgICAgICAgIExPR0lDQUwgaXNfbGFyZ2VyCisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIGlzX2xhcmdlcgorPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgICAgICBJTkNMVURFICJvbXBfdGVzdHN1aXRlLmYiCisKKyAgICAgICAgaXNfbGFyZ2VyID0gLnRydWUuCisKKyEkb21wIHBhcmFsbGVsIHByaXZhdGUobXlfaXNfbGFyZ2VyKQorPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgbXlfaXNfbGFyZ2VyID0gLnRydWUuCishJG9tcCBkbyBwcml2YXRlKGksaikgc2NoZWR1bGUoc3RhdGljLDEpIDxvbXB0czpjaGVjaz5jb2xsYXBzZSgyKTwvb21wdHM6Y2hlY2s+CishJG9tcCsgICBvcmRlcmVkCisgICAgICAgIERPIGk9MSwxMDAKKyAgICAgICAgICA8b21wdHM6Y3Jvc3NjaGVjaz4KKyAgICAgICAgICBteV9pc19sYXJnZXIgPSBjaGVja19pc19sYXJnZXIoaSkgLmFuZC4gbXlfaXNfbGFyZ2VyCisgICAgICAgICAgPC9vbXB0czpjcm9zc2NoZWNrPgorICAgICAgICAgIERPIGo9MSwwMAorICAgICAgICAgIDxvbXB0czpjaGVjaz4KKyEkb21wIG9yZGVyZWQKKyAgICAgICAgICAgIG15X2lzX2xhcmdlciA9IGNoZWNrX2lzX2xhcmdlcihpKSAuYW5kLiBteV9pc19sYXJnZXIKKyEkb21wIGVuZCBvcmRlcmVkCisgICAgICAgICAgPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICBFTkQgRE8KKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKyEkb21wIGNyaXRpY2FsCisgICAgICAgIGlzX2xhcmdlciA9IGlzX2xhcmdlciAuYW5kLiBteV9pc19sYXJnZXIKKyEkb21wIGVuZCBjcml0aWNhbAorPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgaWYgKGlzX2xhcmdlcikgdGhlbgorICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorICAgICAgZWxzZQorICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorICAgICAgZW5kIGlmCisgICAgICBFTkQgRlVOQ1RJT04KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9kb19maXJzdHByaXZhdGUuZiBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL2RvX2ZpcnN0cHJpdmF0ZS5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3OTIzNjEKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9kb19maXJzdHByaXZhdGUuZgpAQCAtMCwwICsxLDU2IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBkbyBmaXJzdHByaXZhdGUgY2xhdXNlIGJ5IGNvdW50aW5nIHVwIGEgdmFyaWFibGUgaW4gYSBwYXJhbGxlbGl6ZWQgbG9vcC4gRWFjaCB0aHJlYWQgaGFzIGEgZmlyc3Rwcml2YXRlIHZhcmlhYmxlICgxKSBhbmQgYW4gdmFyaWFibGUgKDIpIGRlY2xhcmVkIGJ5IGRvIGZpcnN0cHJpdmF0ZS4gRmlyc3QgaXQgc3RvcmVzIHRoZSByZXN1bHQgb2YgaXRzIGxhc3QgaXRlcmF0aW9uIGluIHZhcmlhYmxlICgyKS4gVGhlbiBpdCBzdG9yZXMgdGhlIHZhbHVlIG9mIHRoZSB2YXJpYWJsZSAoMikgaW4gaXRzIGZpcnN0cHJpdmF0ZSB2YXJpYWJsZSAoMSkuIEF0IHRoZSBlbmQgYWxsIGZpcnN0cHJpdmF0ZSB2YXJpYWJsZXMgKDEpIGFyZSBhZGRlZCB0byBhIHRvdGFsIHN1bSBpbiBhIGNyaXRpY2FsIHNlY3Rpb24gYW5kIGNvbXBhcmVkIHdpdGggdGhlIGNvcnJlY3QgcmVzdWx0Ljwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOnZlcnNpb24+Mi4wPC9vbXB0czp2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgZG8gZmlyc3Rwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIHBhcmFsbGVsIHByaXZhdGUsIG9tcCBjcml0aWNhbDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+ZG9fZmlyc3Rwcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIHN1bSwga25vd25fc3VtCisgICAgICAgIElOVEVHRVIgbnVtdGhyZWFkcworICAgICAgICBJTlRFR0VSIG9tcF9nZXRfbnVtX3RocmVhZHMKKzxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5URUdFUiBzdW0wLCBzdW0xLCBpCisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIHN1bTAsIHN1bTEsIGkKKzwvb21wdHM6b3JwaGFuOnZhcnM+CisgIAorICAgICAgICBJTkNMVURFICJvbXBfdGVzdHN1aXRlLmYiCisgIAorICAgICAgICBzdW0gPSAwCisgICAgICAgIHN1bTAgPSAxMjM0NQorICAgICAgICBzdW0xID0gMAorICAKKyAgCishJG9tcCBwYXJhbGxlbCBmaXJzdHByaXZhdGUoc3VtMSkKKyEkb21wIHNpbmdsZQorICAgICAgICBudW10aHJlYWRzID0gb21wX2dldF9udW1fdGhyZWFkcygpCishJG9tcCBlbmQgc2luZ2xlCisKKworPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIDxvbXB0czpjaGVjaz5maXJzdHByaXZhdGUoc3VtMCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPnByaXZhdGUgKHN1bTApPC9vbXB0czpjcm9zc2NoZWNrPgorICAgICAgICBETyBpPTEsTE9PUENPVU5UCisgICAgICAgICAgc3VtMCA9IHN1bTAgKyBpCisgICAgICAgICAgc3VtMSA9IHN1bTAKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorCisKKyEkb21wIGNyaXRpY2FsCisgICAgICAgIFdSSVRFICgxLCopIHN1bTAKKyAgICAgICAgc3VtID0gc3VtICsgc3VtMQorISRvbXAgZW5kIGNyaXRpY2FsCishJG9tcCBlbmQgcGFyYWxsZWwKKworCisgICAgICAgIGtub3duX3N1bT0xMjM0NSpudW10aHJlYWRzKyAoTE9PUENPVU5UKihMT09QQ09VTlQrMSkpLzIKKyAgICAgICAgSUYgKCBrbm93bl9zdW0gLkVRLiBzdW0gKSBUSEVOCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgRUxTRQorICAgICAgICAgIFdSSVRFICgxLCopICJGb3VuZCBzdW0gd2FzIiwgc3VtLCAiaW5zdGVhZCBvZiIsIGtub3duX3N1bQorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIEVORCBJRgorICAgICAgRU5EIEZVTkNUSU9OCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vZG9fbGFzdHByaXZhdGUuZiBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL2RvX2xhc3Rwcml2YXRlLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIwMmU1MAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL2RvX2xhc3Rwcml2YXRlLmYKQEAgLTAsMCArMSwzOSBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgZG8gbGFzdHByaXZhdGUgY2xhdXNlIGJ5IGNvdW50aW5nIHVwIGEgdmFyaWFibGUgaW4gYSBwYXJhbGxlbGl6ZWQgbG9vcC4gRWFjaCB0aHJlYWQgc2F2ZXMgdGhlIG5leHQgc3VtbWFuZCBpbiBhIGxhc3Rwcml2YXRlIHZhcmlhYmxlIGkwLiBBdCB0aGUgZW5kIGkwIGlzIGNvbXBhcmVkIHRvIHRoZSB2YWx1ZSBvZiB0aGUgZXhwZWN0ZWQgbGFzdCBzdW1tYW5kLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOnZlcnNpb24+Mi4wPC9vbXB0czp2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgZG8gcHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBwYXJhbGxlbCBmaXJzdHByaXZhdGUsIG9tcCBjcml0aWNhbDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+ZG9fbGFzdHByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOVEVHRVIgc3VtLGtub3duX3N1bQorPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBJTlRFR0VSIHN1bTAsaTAsaQorICAgICAgICBDT01NT04gL29ycGh2YXJzLyBzdW0wLGkwLGkKKzwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIElOQ0xVREUgIm9tcF90ZXN0c3VpdGUuZiIKKyAgICAgICAgc3VtID0gMAorICAgICAgICBzdW0wID0gMAorICAgICAgICBpMCA9IC0xCishJG9tcCBwYXJhbGxlbCBmaXJzdHByaXZhdGUoc3VtMCkKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyBzY2hlZHVsZShzdGF0aWMsNykgPG9tcHRzOmNoZWNrPmxhc3Rwcml2YXRlKGkwKTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICAgc3VtMCA9IHN1bTAgKyBpCisgICAgICAgICAgaTAgPSBpCisgICAgICAgIEVORCBETworPG9tcHRzOmNoZWNrPiEkb21wIGVuZCBkbzwvb21wdHM6Y2hlY2s+Cis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGNyaXRpY2FsCisgICAgICAgIHN1bSA9IHN1bSArIHN1bTAKKyEkb21wIGVuZCBjcml0aWNhbAorISRvbXAgZW5kIHBhcmFsbGVsCisgICAgICBrbm93bl9zdW0gPSAoTE9PUENPVU5UKihMT09QQ09VTlQrMSkpLzIKKyAgICAgICAgSUYgKCBrbm93bl9zdW0gLkVRLiBzdW0gLkFORC4gaTAgLkVRLiBMT09QQ09VTlQgKSBUSEVOCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgRUxTRQorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIEVORCBJRgorICAgICAgRU5EIEZVTkNUSU9OCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vZG9fb3JkZXJlZC5mIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vZG9fb3JkZXJlZC5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwODdmODEKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9kb19vcmRlcmVkLmYKQEAgLTAsMCArMSw3MyBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6ZGlyZWN0aXZlPmRvIG9yZGVyZWQ8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp2ZXJzaW9uPjIuMDwvb21wdHM6dmVyc2lvbj4KKzxvbXB0czpkZXBlbmRlbmNlcz5wYXJhbGxlbCBwcml2YXRlLCBjcml0aWNhbDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIGlfaXNsYXJnZXIoaSkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIGksIGlzbGFyZ2VyCisgICAgICAgIElOVEVHRVIgbGFzdF9pCisgICAgICAgIENPTU1PTiAvbXljb20vIGxhc3RfaQorICAgICAgICBJRiAoIGkgLkdULiBsYXN0X2kpIFRIRU4KKyAgICAgICAgICBpc2xhcmdlciA9IDEKKyAgICAgICAgRUxTRQorICAgICAgICAgIGlzbGFyZ2VyID0gMAorICAgICAgICBFTkQgSWYKKyAgICAgICAgbGFzdF9pID0gaQorICAgICAgICBpX2lzbGFyZ2VyID0gaXNsYXJnZXIKKyAgICAgIEVORAorCisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+ZG9fb3JkZXJlZDwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5URUdFUiBrbm93bl9zdW0sIGlzX2xhcmdlcgorICAgICAgICBJTlRFR0VSIGxhc3RfaQorICAgICAgICBJTlRFR0VSIGlfaXNsYXJnZXIKKyAgICAgICAgQ09NTU9OIC9teWNvbS8gbGFzdF9pCisKKzxvbXB0czpvcnBoYW46cGFybXM+IGkgPC9vbXB0czpvcnBoYW46cGFybXM+CisKKzxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5URUdFUiBzdW0sIGksIG15X2lzbGFyZ2VyCisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIG15X2lzbGFyZ2VyLCBzdW0KKzwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICAgICAgc3VtID0gMAorICAgICAgICBpc19sYXJnZXIgPSAxCisgICAgICAgIGxhc3RfaSA9IDAKKyEkb21wIHBhcmFsbGVsIHByaXZhdGUobXlfaXNsYXJnZXIpCisgICAgICAgIG15X2lzbGFyZ2VyID0gMQorISRvbXAgZG8gc2NoZWR1bGUoc3RhdGljLDEpIG9yZGVyZWQKKyAgICAgICAgRE8gaT0xLCA5OQorPG9tcHRzOm9ycGhhbj4KKzxvbXB0czpjaGVjaz4KKyEkb21wIG9yZGVyZWQKKzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgSUYgKGlfaXNsYXJnZXIoaSkgLkVRLiAxIC5BTkQuIG15X2lzbGFyZ2VyIC5FUS4gMSkgVEhFTgorICAgICAgICAgICAgbXlfaXNsYXJnZXIgPSAxCisgICAgICAgICAgRUxTRQorICAgICAgICAgICAgbXlfaXNsYXJnZXIgPSAwCisgICAgICAgICAgRU5EIElGCisgICAgICAgICAgc3VtID0gc3VtICsgaQorPG9tcHRzOmNoZWNrPgorISRvbXAgZW5kIG9yZGVyZWQKKzwvb21wdHM6Y2hlY2s+Cis8L29tcHRzOm9ycGhhbj4KKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKyEkb21wIGNyaXRpY2FsCisgICAgICAgIElGIChpc19sYXJnZXIgLkVRLiAxIC5BTkQuIG15X2lzbGFyZ2VyIC5FUS4gMSApIFRIRU4KKyAgICAgICAgICBpc19sYXJnZXIgPSAxCisgICAgICAgIEVMU0UKKyAgICAgICAgICBpc19sYXJnZXIgPSAwCisgICAgICAgIEVORCBJRgorISRvbXAgZW5kIGNyaXRpY2FsCishJG9tcCBlbmQgcGFyYWxsZWwKKyAgICAgICAga25vd25fc3VtID0gKDk5KjEwMCkvMgorICAgICAgICBJRiAoIGtub3duX3N1bSAuRVEuIHN1bSAuQU5ELiBpc19sYXJnZXIgLkVRLiAxKSBUSEVOCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgRUxTRQorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIEVORCBJRgorICAgICAgRU5ECis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vZG9fcHJpdmF0ZS5mIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vZG9fcHJpdmF0ZS5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNTg3Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9kb19wcml2YXRlLmYKQEAgLTAsMCArMSw2NyBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgZG8gcHJpdmF0ZSBjbGF1c2UgYnkgY291bnRpbmcgdXAgYSB2YXJpYWJsZSBpbiBhIHBhcmFsbGVsaXplZCBsb29wLiBFYWNoIHRocmVhZCBoYXMgYSBwcml2YXRlIHZhcmlhYmxlICgxKSBhbmQgYW4gdmFyaWFibGUgKDIpIGRlY2xhcmVkIGJ5IGZvciBwcml2YXRlLiBGaXJzdCBpdCBzdG9yZXMgdGhlIHJlc3VsdCBvZiBpdHMgbGFzdCBpdGVyYXRpb24gaW4gdmFyaWFibGUgKDIpLiBUaGVuIHRoaXMgdGhyZWFkIHdhaXRzIHNvbWUgdGltZSBiZWZvcmUgaXQgc3RvcmVzIHRoZSB2YWx1ZSBvZiB0aGUgdmFyaWFibGUgKDIpIGluIGl0cyBwcml2YXRlIHZhcmlhYmxlICgxKS4gQXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbmV4dCBpdGVyYXRpb24gdGhlIHZhbHVlIG9mICgxKSBpcyBhc3NpZ25lZCB0byAoMikuIEF0IHRoZSBlbmQgYWxsIHByaXZhdGUgdmFyaWFibGVzICgxKSBhcmUgYWRkZWQgdG8gYSB0b3RhbCBzdW0gaW4gYSBjcml0aWNhbCBzZWN0aW9uIGFuZCBjb21wYXJlZCB3aXRoIHRoZSBjb3JyZWN0IHJlc3VsdC48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czp2ZXJzaW9uPjIuMDwvb21wdHM6dmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIGRvIHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgcGFyYWxsZWwgcHJpdmF0ZSwgb21wIGZsdXNoLCBvbXAgY3JpdGljYWw8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorICAgICAgU1VCUk9VVElORSBkb19zb21lX3dvcmsoKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOVEVHRVIgaQorICAgICAgICBJTlRSSU5TSUMgc3FydAorICAgICAgICBET1VCTEUgUFJFQ0lTSU9OIHN1bQorCisgICAgICAgIElOQ0xVREUgIm9tcF90ZXN0c3VpdGUuZiIKKyAgICAgICAgc3VtPTAuMAorICAgICAgICBETyBpPTAsIExPT1BDT1VOVC0xCisgICAgICAgICAgc3VtID0gc3VtICsgc3FydChSRUFMKGkpKQorICAgICAgICBFTkRETworCisgICAgICBFTkQKKworICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPmRvX3ByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOVEVHRVIgc3VtLCBrbm93bl9zdW0KKzxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5URUdFUiBzdW0wLCBzdW0xLCBpCisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIHN1bTAsIHN1bTEsIGkKKzwvb21wdHM6b3JwaGFuOnZhcnM+ICAgICAgICAKKworICAgICAgICBJTkNMVURFICJvbXBfdGVzdHN1aXRlLmYiCisKKyAgICAgICAgc3VtICA9IDAKKyAgICAgICAgc3VtMCA9IDAKKyAgICAgICAgc3VtMSA9IDAKKworISRvbXAgcGFyYWxsZWwgcHJpdmF0ZShzdW0xKQorICAgICAgICBzdW0wID0gMAorICAgICAgICBzdW0xID0gMAorCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gPG9tcHRzOmNoZWNrPnByaXZhdGUoc3VtMCk8L29tcHRzOmNoZWNrPiBzY2hlZHVsZShzdGF0aWMsMSkKKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgICBzdW0wID0gc3VtMQorISRvbXAgZmx1c2gKKyAgICAgICAgICBzdW0wID0gc3VtMCArIGkKKyAgICAgICAgICBDQUxMIGRvX3NvbWVfd29yaygpCishJG9tcCBmbHVzaAorISAgICAgICAgICBwcmludCAqLCBzdW0wCisgICAgICAgICAgc3VtMSA9IHN1bTAKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorCishJG9tcCBjcml0aWNhbAorICAgICAgICBzdW0gPSBzdW0gKyBzdW0xCishJG9tcCBlbmQgY3JpdGljYWwKKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIGtub3duX3N1bSA9IChMT09QQ09VTlQqKExPT1BDT1VOVCsxKSkvMgorISAgICAgICAgcHJpbnQgKiwgInN1bToiLCBzdW0sICJrbm93bl9zdW0iLCBrbm93bl9zdW0KKyAgICAgICAgSUYgKCBrbm93bl9zdW0gLkVRLiBzdW0pIFRIRU4KKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorICAgICAgICBFTFNFCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKyAgICAgICAgRU5EIElGCisgICAgICBFTkQgRlVOQ1RJT04KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9kb19yZWR1Y3Rpb24uZiBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL2RvX3JlZHVjdGlvbi5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMjVhNDUKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9kb19yZWR1Y3Rpb24uZgpAQCAtMCwwICsxLDUxNCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgZG8gcmVkdWN0aW9uIGRpcmVjdGl2ZSB3aWNoIGFsbCBpdHMgb3B0aW9ucy48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIGRvIHJlZHVjdGlvbjwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOnRlc3Rjb2RlPgorICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPmRvX3JlZHVjdGlvbjwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5URUdFUiBzdW0yLCBrbm93bl9zdW0KKyAgICAgICAgSU5URUdFUiBrbm93bl9wcm9kdWN0CisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gcm91bmRpbmdfZXJyb3IsIGRwdAorICAgICAgICBJTlRFR0VSIGRvdWJsZV9ESUdJVFMKKyAgICAgICAgRE9VQkxFIFBSRUNJU0lPTiBka25vd25fc3VtCisgICAgICAgIElOVEVHRVIgcmVzdWx0CisgICAgICAgIElOQ0xVREUgIm9tcF90ZXN0c3VpdGUuZiIKKyAgICAgICAgUEFSQU1FVEVSIChrbm93bl9wcm9kdWN0PTM2Mjg4MDApCisgICAgICAgIFBBUkFNRVRFUiAocm91bmRpbmdfZXJyb3I9MS5FLTYpCis8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIElOVEVHRVIgc3VtLGRpZmYscHJvZHVjdCxpCisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gZHN1bSxkZGlmZixkdAorICAgICAgICBMT0dJQ0FMIGxvZ2ljX2FuZCwgbG9naWNfb3IsIGxvZ2ljX2Vxdixsb2dpY19uZXF2CisgICAgICAgIExPR0lDQUwgbG9naWNzKExPT1BDT1VOVCkKKyAgICAgICAgSU5URUdFUiBiaXRfYW5kLCBiaXRfb3IKKyAgICAgICAgSU5URUdFUiBleGNsdXNpdl9iaXRfb3IKKyAgICAgICAgSU5URUdFUiBtaW5fdmFsdWUsIG1heF92YWx1ZQorICAgICAgICBJTlRFR0VSIGludF9hcnJheShMT09QQ09VTlQpCisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gZF9hcnJheShMT09QQ09VTlQpCisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gZG1pbiwgZG1heAorICAgICAgICBDT01NT04gL29ycGh2YXJzLyBzdW0scHJvZHVjdCxkaWZmLGksZHN1bSxkZGlmZixkdCxsb2dpY19hbmQsCisgICAgICYgICAgbG9naWNfb3IsbG9naWNfZXF2LGxvZ2ljX25lcXYsbG9naWNzLGJpdF9hbmQsYml0X29yLGludF9hcnJheSwKKyAgICAgJiAgICBleGNsdXNpdl9iaXRfb3IsbWluX3ZhbHVlLGRtaW4sZG1heCxkX2FycmF5LG1heF92YWx1ZQorICAgICAgICBJTlRFR0VSIE1BWF9GQUNUT1IKKyAgICAgICAgUEFSQU1FVEVSIChkb3VibGVfRElHSVRTPTIwLE1BWF9GQUNUT1I9MTApCis8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgICAgIGR0ID0gMS4vMy4KKyAgICAgICAga25vd25fc3VtID0gKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyCisgICAgICAgIHByb2R1Y3QgPSAxCisgICAgICAgIHN1bTIgPSAwCisgICAgICAgIHN1bSA9IDAKKyAgICAgICAgZHN1bSA9IDAuCisgICAgICAgIHJlc3VsdCA9MCAKKyAgICAgICAgbG9naWNfYW5kID0gLnRydWUuCisgICAgICAgIGxvZ2ljX29yID0gLmZhbHNlLgorICAgICAgICBiaXRfYW5kID0gMQorICAgICAgICBiaXRfb3IgPSAwCisgICAgICAgIGV4Y2x1c2l2X2JpdF9vciA9IDAKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gc2NoZWR1bGUoZHluYW1pYywgMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigrOnN1bSk8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpID0gMSwgTE9PUENPVU5UCisgICAgICAgICAgc3VtID0gc3VtICsgaQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoa25vd25fc3VtIC5ORS4gc3VtKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIHN1bSB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICIsCisgICAgICYgICAgc3VtLCJpbnN0ZWFkIG9mICIsIGtub3duX3N1bQorICAgICAgICBFTkQgSUYKKworCisgICAgICAgIGRpZmYgPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDIKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gc2NoZWR1bGUoZHluYW1pYywgMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiAoLTogZGlmZik8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpID0gMSwgTE9PUENPVU5UCisgICAgICAgICAgZGlmZiA9IGRpZmYgLSBpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorICAKKyAgICAgICAgSUYgKCBkaWZmIC5ORS4gMCApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gZGlmZmVyZW5jZSB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICIsCisgICAgICYgICAgc3VtLCJpbnN0ZWFkIG9mIDAuIgorICAgICAgICBFTkQgSUYKKworIS4uLiBUZXN0IGZvciBkb3VibGVzCisgICAgICAgIGRzdW0gPTAuCisgICAgICAgIGRwdCA9IDEKKworICAgICAgICBETyBpPTEsIERPVUJMRV9ESUdJVFMKKyAgICAgICAgICBkcHQ9IGRwdCAqIGR0CisgICAgICAgIEVORCBETworICAgICAgICBka25vd25fc3VtID0gKDEtZHB0KS8oMS1kdCkKKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oKzpkc3VtKTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGk9MCxET1VCTEVfRElHSVRTLTEKKyAgICAgICAgICBkc3VtID0gZHN1bSArIGR0KippCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgCisgICAgICAgIElGKGRzdW0gLk5FLiBka25vd25fc3VtIC5BTkQuIAorICAgICAmICAgICBBQlMoZHN1bSAtIGRrbm93bl9zdW0pIC5HVC4gcm91bmRpbmdfZXJyb3IgKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIHN1bSB3aXRoIGRvdWJsZXM6IFJlc3VsdCB3YXMgIiwKKyAgICAgJiAgICAgICBkc3VtLCJpbnN0ZWFkIG9mICIsZGtub3duX3N1bSwiKERpZmZlcmVuY2U6ICIsCisgICAgICYgICAgICAgZHN1bSAtIGRrbm93bl9zdW0sIikiCisgICAgICAgIEVORCBJRgorICAgICAgICBkcHQgPSAxCisKKworICAgICAgCisgICAgICAgIERPIGk9MSwgRE9VQkxFX0RJR0lUUworICAgICAgICAgICBkcHQgPSBkcHQqZHQKKyAgICAgICAgRU5EIERPCisgICAgICAgIGRkaWZmID0gKCAxLWRwdCkvKDEtZHQpCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigtOmRkaWZmKTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGk9MCwgRE9VQkxFX0RJR0lUUy0xCisgICAgICAgICAgZGRpZmYgPSBkZGlmZiAtIGR0KippCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGICggQUJTKGRkaWZmKSAuR1QuIHJvdW5kaW5nX2Vycm9yICkgVEhFTgorICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIERpZmZlcmVuY2Ugd2l0aCBkb3VibGVzOiBSZXN1bHQgd2FzICIsCisgICAgICYgICAgICAgZGRpZmYsImluc3RlYWQgb2YgMC4wIgorICAgICAgICBFTkQgSUYKKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oKjpwcm9kdWN0KTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGk9MSxNQVhfRkFDVE9SCisgICAgICAgICAgIHByb2R1Y3QgPSBwcm9kdWN0ICogaQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoa25vd25fcHJvZHVjdCAuTkUuIHByb2R1Y3QpIFRIRU4KKyAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgICB3cml0ZSgxLCopICJFcnJvciBpbiBQcm9kdWN0IHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgIiwKKyAgICAgJiAgICAgICBwcm9kdWN0LCIgaW5zdGVhZCBvZiIsa25vd25fcHJvZHVjdCAKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgIGxvZ2ljcyhpKSA9IC5UUlVFLgorICAgICAgICBFTkQgRE8KKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLkFORC46bG9naWNfYW5kKTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICBsb2dpY19hbmQgPSBsb2dpY19hbmQgLkFORC4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGICguTk9ULiBsb2dpY19hbmQpIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gbG9naWMgQU5EIHBhcnQgMSIKKyAgICAgICAgRU5EIElGCisKKworICAgICAgICBsb2dpY19hbmQgPSAuVFJVRS4KKyAgICAgICAgbG9naWNzKExPT1BDT1VOVC8yKSA9IC5GQUxTRS4KKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLkFORC46bG9naWNfYW5kKTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICBsb2dpY19hbmQgPSBsb2dpY19hbmQgLkFORC4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGIChsb2dpY19hbmQpIFRIRU4KKyAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBBTkQgcGFzcyAyIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorICAgICAgICAgbG9naWNzKGkpID0gLkZBTFNFLgorICAgICAgICBFTkQgRE8KKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLk9SLjpsb2dpY19vcik8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpID0gMSwgTE9PUENPVU5UCisgICAgICAgICAgIGxvZ2ljX29yID0gbG9naWNfb3IgLk9SLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKGxvZ2ljX29yKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGxvZ2ljIE9SIHBhcnQgMSIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgbG9naWNfb3IgPSAuRkFMU0UuCisgICAgICAgIGxvZ2ljcyhMT09QQ09VTlQvMikgPSAuVFJVRS4KKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLk9SLjpsb2dpY19vcik8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpPTEsTE9PUENPVU5UCisgICAgICAgICAgIGxvZ2ljX29yID0gbG9naWNfb3IgLk9SLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCAuTk9ULiBsb2dpY19vciApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gbG9naWMgT1IgcGFydCAyIgorICAgICAgICBFTkQgSUYKKworIS4uLiBUZXN0IGxvZ2ljIEVRViwgdW5pcXVlIGluIEZvcnRyYW4KKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgIGxvZ2ljcyhpKSA9IC5UUlVFLgorICAgICAgICBFTkQgRE8KKworICAgICAgICBsb2dpY19lcXYgPSAuVFJVRS4KKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLkVRVi46bG9naWNfZXF2KTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGkgPSAxLCBMT09QQ09VTlQKKyAgICAgICAgICAgbG9naWNfZXF2ID0gbG9naWNfZXF2IC5FUVYuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoLk5PVC4gbG9naWNfZXF2KSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGxvZ2ljIEVRViBwYXJ0IDEiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIGxvZ2ljX2VxdiA9IC5UUlVFLgorICAgICAgICBsb2dpY3MoTE9PUENPVU5ULzIpID0gLkZBTFNFLgorCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiguRVFWLjpsb2dpY19lcXYpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgICBsb2dpY19lcXYgPSBsb2dpY19lcXYgLkVRVi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGICggbG9naWNfZXF2ICkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBFUVYgcGFydCAyIgorICAgICAgICBFTkQgSUYKKworIS4uLiBUZXN0IGxvZ2ljIE5FUVYsIHdoaWNoIGlzIHVuaXF1ZSBpbiBGb3J0cmFuCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICBsb2dpY3MoaSkgPSAuRkFMU0UuCisgICAgICAgIEVORCBETworCisgICAgICAgIGxvZ2ljX25lcXYgPSAuRkFMU0UuCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC5ORVFWLjpsb2dpY19uZXF2KTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGkgPSAxLCBMT09QQ09VTlQKKyAgICAgICAgICAgbG9naWNfbmVxdiA9IGxvZ2ljX25lcXYgLk5FUVYuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAobG9naWNfbmVxdikgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBORVFWIHBhcnQgMSIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgbG9naWNfbmVxdiA9IC5GQUxTRS4KKyAgICAgICAgbG9naWNzKExPT1BDT1VOVC8yKSA9IC5UUlVFLgorCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigubmVxdi46bG9naWNfbmVxdik8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpPTEsTE9PUENPVU5UCisgICAgICAgICAgIGxvZ2ljX25lcXYgPSBsb2dpY19uZXF2IC5ORVFWLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCAuTk9ULiBsb2dpY19uZXF2ICkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBORVFWIHBhcnQgMiIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgICAgaW50X2FycmF5KGkpID0gMQorICAgICAgICBFTkQgRE8KKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKElBTkQ6Yml0X2FuZCk8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorIS4uLiBpYW5kKEksSik6IFJldHVybnMgdmFsdWUgcmVzdWx0aW5nIGZyb20gYm9vbGVhbiBBTkQgb2YgCishLi4uIHBhaXIgb2YgYml0cyBpbiBlYWNoIG9mIEkgYW5kIEouIAorICAgICAgICAgIGJpdF9hbmQgPSBJQU5EKGJpdF9hbmQsaW50X2FycmF5KGkpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIGJpdF9hbmQgLkxULiAxICkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBJQU5EIHBhcnQgMSIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgYml0X2FuZCA9IDEKKyAgICAgICAgaW50X2FycmF5KExPT1BDT1VOVC8yKSA9IDAKKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oSUFORDpiaXRfYW5kKTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICAgYml0X2FuZCA9IElBTkQgKCBiaXRfYW5kLCBpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiggYml0X2FuZCAuR0UuIDEpIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gSUFORCBwYXJ0IDIiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICAgaW50X2FycmF5KGkpID0gMAorICAgICAgICBFTkQgRE8KKworCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihJT1I6Yml0X29yKTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCishLi4uIElvcihJLEopOiBSZXR1cm5zIHZhbHVlIHJlc3VsdGluZyBmcm9tIGJvb2xlYW4gT1Igb2YgCishLi4uIHBhaXIgb2YgYml0cyBpbiBlYWNoIG9mIEkgYW5kIEouIAorICAgICAgICAgIGJpdF9vciA9IElPUihiaXRfb3IsIGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGICggYml0X29yIC5HRS4gMSkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBJb3IgcGFydCAxIgorICAgICAgICBFTkQgSUYKKworCisgICAgICAgIGJpdF9vciA9IDAKKyAgICAgICAgaW50X2FycmF5KExPT1BDT1VOVC8yKSA9IDEKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKElPUjpiaXRfb3IpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgICBiaXRfb3IgPSBJT1IoYml0X29yLCBpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIGJpdF9vciAuTEUuIDApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gSW9yIHBhcnQgMiIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgICBpbnRfYXJyYXkoaSkgPSAwCisgICAgICAgIEVORCBETworCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihJRU9SOmV4Y2x1c2l2X2JpdF9vcik8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpID0gMSwgTE9PUENPVU5UCisgICAgICAgICAgZXhjbHVzaXZfYml0X29yID0gaWVvcihleGNsdXNpdl9iaXRfb3IsIGludF9hcnJheShpKSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCBleGNsdXNpdl9iaXRfb3IgLmdlLiAxKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIEllb3IgcGFydCAxIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBleGNsdXNpdl9iaXRfb3IgPSAwCisgICAgICAgIGludF9hcnJheShMT09QQ09VTlQvMikgPSAxCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKElFT1I6ZXhjbHVzaXZfYml0X29yKTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGkgPSAxLCBMT09QQ09VTlQKKyAgICAgICAgICBleGNsdXNpdl9iaXRfb3IgPSBJRU9SKGV4Y2x1c2l2X2JpdF9vciwgaW50X2FycmF5KGkpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIGV4Y2x1c2l2X2JpdF9vciAuTEUuIDApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gSWVvciBwYXJ0IDIiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICBpbnRfYXJyYXkoaSkgPSAxMCAtIGkKKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgbWluX3ZhbHVlID0gNjU1MzUKKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oTUlOOm1pbl92YWx1ZSk8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpID0gMSwgTE9PUENPVU5UCisgICAgICAgICAgbWluX3ZhbHVlID0gTUlOKG1pbl92YWx1ZSxpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIG1pbl92YWx1ZSAuR1QuICgxMC1MT09QQ09VTlQpIClUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGludGVnZXIgTUlOIgorICAgICAgICBFTkQgSUYKKworCisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICAgaW50X2FycmF5KGkpID0gaQorICAgICAgICBFTkQgRE8KKworICAgICAgICBtYXhfdmFsdWUgPSAtMzI3NjgKKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oTUFYOm1heF92YWx1ZSk8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpID0gMSwgTE9PUENPVU5UCisgICAgICAgICAgbWF4X3ZhbHVlID0gTUFYKG1heF92YWx1ZSxpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIG1heF92YWx1ZSAuTFQuIExPT1BDT1VOVCApVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBpbnRlZ2VyIE1BWCIKKyAgICAgICAgRU5EIElGCisKKyEuLi4gdGVzdCBkb3VibGUgbWluLCBtYXgKKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgICBkX2FycmF5KGkpID0gMTAgLSBpKmR0CisgICAgICAgIEVORCBETworCisgICAgICAgIGRtaW4gPSAyKioxMAorICAgICAgICBkdCA9IDAuNQorCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihNSU46ZG1pbik8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpID0gMSwgTE9PUENPVU5UCisgICAgICAgICAgICBkbWluPSBNSU4oZG1pbixkX2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCBkbWluIC5HVC4gKDEwLWR0KSApVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBkb3VibGUgTUlOIgorICAgICAgICBFTkQgSUYKKworCisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICAgZF9hcnJheShpKSA9IGkgKiBkdAorICAgICAgICBFTkQgRE8KKworICAgICAgICBkbWF4PSAtICgyKioxMCkKKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oTUFYOmRtYXgpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaSA9IDEsIExPT1BDT1VOVAorICAgICAgICAgICAgZG1heD0gTUFYKGRtYXgsZF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGICggZG1heCAuTFQuIExPT1BDT1VOVCpkdCApVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBkb3VibGUgTUFYIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBJRiAoIHJlc3VsdCAuRVEuIDAgKSBUSEVOCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9ICAxCisgICAgICAgIEVMU0UKKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gIDAKKyAgICAgICAgRU5EIElGCisKKyAgICAgIEVORCBGVU5DVElPTgorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL2RvX3NjaGVkdWxlX2R5bmFtaWMuZiBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL2RvX3NjaGVkdWxlX2R5bmFtaWMuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGY4YmE3Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vZG9fc2NoZWR1bGVfZHluYW1pYy5mCkBAIC0wLDAgKzEsOTAgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgZHluYW1pYyBvcHRpb24gb2YgdGhlIG9tcCBkbyBzY2hlZHVsZSBkaXJlY3RpdmUuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBkbyBzY2hlZHVsZShkeW5hbWljKTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBmbHVzaCxvbXAgZG8gbm93YWl0LG9tcCBjcml0aWNhbCxvbXAgc2luZ2xlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKworCisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+ZG9fc2NoZWR1bGVfZHluYW1pYzwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgQ0hBUkFDVEVSKjMwIGxvZ2ZpbGUKKyAgICAgICAgSU5URUdFUiBvbXBfZ2V0X3RocmVhZF9udW0sb21wX2dldF9udW1fdGhyZWFkcworICAgICAgICBJTlRFR0VSIHRocmVhZHMKKyAgICAgICAgSU5URUdFUiBjb3VudCwgdG1wX2NvdW50CisgICAgICAgIElOVEVHRVIsQUxMT0NBVEFCTEU6OiB0bXAoOikKKyAgICAgICAgSU5URUdFUiBpaQorICAgICAgICBJTlRFR0VSIHJlc3VsdAorCis8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIElOVEVHRVIgQ0ZETUFYX1NJWkUKKyAgICAgICAgUEFSQU1FVEVSIChDRkRNQVhfU0laRSA9IDEwMDApCisgICAgICAgIElOVEVHRVIgaSx0aWRzKDA6Q0ZETUFYX1NJWkUtMSksdGlkLGNodW5rX3NpemUKKyAgICAgICAgQ09NTU9OIC9vcnBodmFycy8gaSx0aWRzLHRpZCxjaHVua19zaXplCis8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgICAgIGNodW5rX3NpemUgPSA3CisgICAgICAgIGNvdW50ID0gMAorICAgICAgICB0bXBfY291bnQgPSAwCisgICAgICAgIHJlc3VsdCA9IDAKKyAgICAgICAgaWkgPSAwCisKKyEkb21wIHBhcmFsbGVsIHByaXZhdGUodGlkKQorICAgICAgICB0aWQgPSBvbXBfZ2V0X3RocmVhZF9udW0oKQorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIDxvbXB0czpjaGVjaz5zY2hlZHVsZShkeW5hbWljLGNodW5rX3NpemUpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaT0wLCBDRkRNQVhfU0laRS0xCisgICAgICAgICAgdGlkcyhpKSA9IHRpZAorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBETyBpPTAsIENGRE1BWF9TSVpFIC0gMgorICAgICAgICAgIElGICggdGlkcyhpKSAubmUuIHRpZHMoaSsxKSApIFRIRU4KKyAgICAgICAgICAgIGNvdW50ID0gY291bnQgKyAxCisgICAgICAgICAgRU5EIElGCisgICAgICAgIEVORCBETworIAorICAgICAgICBBTExPQ0FURSggdG1wKDA6Y291bnQpICkKKyAgICAgICAgdG1wKDApID0gMQorIAorICAgICAgICBETyBpID0gMCwgQ0ZETUFYX1NJWkUgLSAyCisgICAgICAgICAgSUYgKCB0bXBfY291bnQgLkdULiBjb3VudCApIFRIRU4KKyAgICAgICAgICAgIFdSSVRFKCosKikgIi0tLS0tLS0tLS0tLS0tLS0tLS0tIgorICAgICAgICAgICAgV1JJVEUoKiwqKSAiVGVzdGludGVybmFsIEVycm9yOiBMaXN0IHRvbyBzbWFsbCEhISIKKyAgICAgICAgICAgIFdSSVRFKCosKikgIi0tLS0tLS0tLS0tLS0tLS0tLS0tIgorICAgICAgICAgICAgR09UTyAxMAorICAgICAgICAgIEVORCBJZgorICAgICAgICAgIElGICggdGlkcyhpKSAuTkUuIHRpZHMoaSsxKSApIHRoZW4KKyAgICAgICAgICAgIHRtcF9jb3VudCA9IHRtcF9jb3VudCArIDEKKyAgICAgICAgICAgIHRtcCh0bXBfY291bnQpID0gMQorICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgIHRtcCh0bXBfY291bnQpID0gdG1wKHRtcF9jb3VudCkgKzEKKyAgICAgICAgICBFTkQgSUYgCisgICAgICAgIEVORCBETyAgICAgICAgICAKKworIS4uLiBpcyBkeW5hbWljIHN0YXRlbWVudCB3b3JraW5nPyAKKworIDEwICAgICBETyBpPTAsIGNvdW50IC0xCisgICAgICAgICAgSUYgKCBNT0QodG1wKGkpLGNodW5rX3NpemUpIC5uZS4gMCApIFRIRU4KKyEgLi4uIGl0IGlzIHBvc3NpYmxlIGZvciAyIGFkamFjZW50IGNodW5rcyBhc3NpZ25lZCB0byBhIHNhbWUgdGhyZWFkIAorICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgICAgV1JJVEUoMSwqKSAiVGhlIGludGVybWVkaWF0ZSBkaXNwYXRjaCBoYXMgd3JvbmcgY2h1bmtzaXplLiIKKyAgICAgICAgICBFTkQgSUYKKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgSUYgKCBNT0QodG1wKGNvdW50KSwgY2h1bmtfc2l6ZSkgLk5FLiAKKyAgICAgJiAgICAgTU9EIChDRkRNQVhfU0laRSwgY2h1bmtfc2l6ZSkgKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgInRoZSBsYXN0IGRpc3BhdGNoIGhhcyB3cm9uZyBjaHVua3NpemUuIgorICAgICAgICBFTkQgSUYKKyAgICAgICAgIAorICAgICAgICBJRiAoIHJlc3VsdCAuZXEuIDApIFRIRU4KKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorICAgICAgICBFTFNFCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKyAgICAgICAgRU5EIElGCisgICAgICBFTkQgRlVOQ1RJT04KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9kb19zY2hlZHVsZV9ndWlkZWQuZiBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL2RvX3NjaGVkdWxlX2d1aWRlZC5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkMGU3ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9kb19zY2hlZHVsZV9ndWlkZWQuZgpAQCAtMCwwICsxLDE3NCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBndWlkZWQgb3B0aW9uIG9mIHRoZSBvbXAgZG8gc2NoZWR1bGUgZGlyZWN0aXZlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgZG8gc2NoZWR1bGUoZ3VpZGVkKTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBmbHVzaCxvbXAgZG8gbm93YWl0LG9tcCBjcml0aWNhbCxvbXAgc2luZ2xlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgISBUT0RPOgorICAhIEMuIE5pZXRoYW1tZXI6CisgICEgICAgICAgRmluZCBjaGVjayB0byBkZWNpZGUgaWYgdGhlIHRlc3Qgd2FzIHJ1biBhcyBzY2hlZHVsZShzdGF0aWMpIGJlY2F1c2UKKyAgISAgICAgICB0aGlzIGFsc28gY2FuIHBhc3MgdGhlIHRlc3QgaWYgdGhlIHdvcmsgaXMgZGl2aWRlZCBpbnRvIHRocmVhZC1jb3VudHMgCisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+ZG9fc2NoZWR1bGVfZ3VpZGVkPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIG9tcF9nZXRfdGhyZWFkX251bSxvbXBfZ2V0X251bV90aHJlYWRzCisgICAgICAgIENIQVJBQ1RFUioyMCBsb2dmaWxlCisgICAgICAgIElOVEVHRVIgdGhyZWFkcworICAgICAgICBJTlRFR0VSIHRtcF9jb3VudAorICAgICAgICBJTlRFR0VSLCBhbGxvY2F0YWJsZSA6OiB0bXAoOikKKyAgICAgICAgSU5URUdFUiBpaSwgZmxhZworICAgICAgICBJTlRFR0VSIHJlc3VsdAorICAgICAgICBJTlRFR0VSIGV4cGVjdGVkCisgICAgICAgIElOVEVHRVIgb3BlbndvcmsKKyAgICAgICAgRE9VQkxFIFBSRUNJU0lPTiBjCisKKyAgICAgICAgICAgICAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIElOVEVHRVIgaQorICAgICAgICBJTlRFR0VSIHRpZAorICAgICAgICBJTlRFR0VSIGNvdW50CisKKyAgICAgICAgSU5URUdFUiBERUxBWSAKKyAgICAgICAgSU5URUdFUiBNQVhfVElNRQorICAgICAgICBJTlRFR0VSIENGU01BWF9TSVpFCisKKyEgLi4uIGNob29zZSBzbWFsbCBpdGVyYXRpb24gc3BhY2UgZm9yIHNtYWxsIHN5bmMuIG92ZXJoZWFkCisgICAgICAgIFBBUkFNRVRFUiAoREVMQVkgPSAxKQorICAgICAgICBQQVJBTUVURVIgKE1BWF9USU1FID0gNSkKKyAgICAgICAgUEFSQU1FVEVSIChDRlNNQVhfU0laRSA9IDE1MCkKKworICAgICAgICBJTlRFR0VSIG5vdG91dAorICAgICAgICBJTlRFR0VSIG1heGl0ZXIKKyAgICAgICAgSU5URUdFUiB0aWRzKDA6Q0ZTTUFYX1NJWkUtMSkKKworICAgICAgICBDT01NT04gL29ycGh2YXJzLyBub3RvdXQsbWF4aXRlcix0aWRzCisgICAgICAgICAgICAgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgICAgICByZXN1bHQgPSAwCisgICAgICAgIG5vdG91dCA9IDEKKyAgICAgICAgbWF4aXRlciA9IDAKKyAgICAgICAgY291bnQgPSAwCisgICAgICAgIHRtcF9jb3VudCA9IDAKKyAgICAgICAgb3BlbndvcmsgPSBDRlNNQVhfU0laRQorPG9tcHRzOmNoZWNrPgorCishIERldGVybWluZSB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSB0aHJlYWRzCishJG9tcCBwYXJhbGxlbCAKKyEkb21wIHNpbmdsZQorICAgICAgICB0aHJlYWRzID0gb21wX2dldF9udW1fdGhyZWFkcygpCishJG9tcCBlbmQgc2luZ2xlCishJG9tcCBlbmQgcGFyYWxsZWwKKyAgICAgICAgSUYgKCB0aHJlYWRzIC5MVC4gMikgVEhFTgorICAgICAgICAgIFBSSU5UICosIlRoaXMgdGVzdCBvbmx5IHdvcmtzIHdpdGggYXQgbGVhc3QgdHdvIHRocmVhZHMiCisgICAgICAgICAgV1JJVEUoMSwqKSAiVGhpcyB0ZXN0IG9ubHkgd29ya3Mgd2l0aCBhdCBsZWFzdCB0d28gdGhyZWFkcyIKKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorICAgICAgICAgIFNUT1AKKyAgICAgICAgRU5EIElGCisKKyEgLi4uIE5vdyB0aGUgcmVhbCBwYXJhbGxlbCB3b3JrOgorISAuLi4gRWFjaCB0aHJlYWQgd2lsbCBzdGFydCBpbW1lZGlhdGVseSB3aXRoIHRoZSBmaXJzdCBjaHVuay4KKyAgICAKKyEkb21wIHBhcmFsbGVsIHByaXZhdGUodGlkLGNvdW50KSBzaGFyZWQodGlkcyxtYXhpdGVyKQorICAgICAgICB0aWQgPSBvbXBfZ2V0X3RocmVhZF9udW0oKQorICAgICAgICA8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gc2NoZWR1bGUoZ3VpZGVkKQorICAgICAgICBETyBpID0gMCAsIENGU01BWF9TSVpFLTEKKyAgICAgICAgICBjb3VudCA9IDAKKyEkb21wIGZsdXNoKG1heGl0ZXIpCisgICAgICAgICAgSUYgKCBpIC5HVC4gbWF4aXRlciApIFRIRU4gICAgICAgICAgICAgICAgIAorISRvbXAgY3JpdGljYWwKKyAgICAgICAgICAgIG1heGl0ZXIgPSBpCishJG9tcCBlbmQgY3JpdGljYWwKKyAgICAgICAgICBFTkQgSUYKKworIS4uICAgICAgICAgaWYgaXQgaXMgbm90IG91ciB0dXJuIHdlIHdhaXQKKyEgICAgICAgICAgIGEpIHVudGlsIGFub3RoZXIgdGhyZWFkIGV4ZWN1dGVkIGFuIGl0ZXJhdGlvbgorISAgICAgICAgICAgd2l0aCBhIGhpZ2hlciBpdGVyYXRpb24gY291bnQKKyEgICAgICAgICAgIGIpIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBsb29wIChmaXJzdCB0aHJlYWQgZmluaXNoZWQKKyEgICAgICAgICAgICAgYW5kIHNldCBub3RvdXQ9MCBPUgorISAgICAgICAgICAgYykgdGltZW91dCBhcnJpdmVkIAorCishJG9tcCBmbHVzaChtYXhpdGVyLG5vdG91dCkKKyAgICAgICAgICBJRiAoIG5vdG91dCAuR0UuIDEgLkFORC4gY291bnQgLkxULiBNQVhfVElNRQorICAgICAmICAgICAgICAgLkFORC4gbWF4aXRlciAuRVEuIGkgKSBUSEVOCisgICAgICAgICAgICAgIERPIFdISUxFICggbm90b3V0IC5HRS4gMSAuQU5ELiBjb3VudCAuTFQuIE1BWF9USU1FCisgICAgICYgICAgICAgICAgLkFORC4gbWF4aXRlciAuRVEuIGkgKQorICAgICAgICAgICAgICAgIENBTEwgc2xlZXAoREVMQVkpCisgICAgICAgICAgICAgICAgY291bnQgPSBjb3VudCArIERFTEFZCisgICAgICAgICAgICAgIEVORCBETyAgICAgICAgIAorICAgICAgICAgIEVORCBJRgorICAgICAgICAgICB0aWRzKGkpID0gdGlkCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvIG5vd2FpdAorICAgICAgICA8L29tcHRzOm9ycGhhbj4KKworICAgICAgICBub3RvdXQgPSAwCishJG9tcCBmbHVzaChub3RvdXQpCisKKyEkb21wIGVuZCBwYXJhbGxlbCAKKworISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohCishIGV2YWx1YXRpb24gb2YgdGhlIHZhbHVlcworISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohCisgICAgICAgIGNvdW50ID0gMAorCisgICAgICAgIERPIGk9MCwgQ0ZTTUFYX1NJWkUgLSAyCisgICAgICAgICAgSUYgKCB0aWRzKGkpIC5ORS4gdGlkcyhpKzEpICkgVEhFTgorICAgICAgICAgICAgY291bnQgPSBjb3VudCArIDEKKyAgICAgICAgICBFTkQgSUYKKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgQUxMT0NBVEUoIHRtcCgwOmNvdW50KSAgKQorICAgICAgICB0bXBfY291bnQgPSAwCisgICAgICAgIHRtcCgwKSA9IDEKKyEgLi4uIGNhbGN1bGF0ZSB0aGUgY2h1bmtzaXplIGZvciBlYWNoIGRpc3BhdGNoCisKKyAgICAgICAgRE8gaT0wLCBDRlNNQVhfU0laRSAtIDIKKyAgICAgICAgICBJRiAoIHRpZHMoaSkgLkVRLiB0aWRzKGkrMSkgKSBUSEVOCisgICAgICAgICAgIHRtcCh0bXBfY291bnQpID0gdG1wKHRtcF9jb3VudCkgKyAxCisgICAgICAgICAgRUxTRQorICAgICAgICAgICAgdG1wX2NvdW50ID0gdG1wX2NvdW50ICsgMQorICAgICAgICAgICAgdG1wKHRtcF9jb3VudCkgPSAxCisgICAgICAgICAgRU5EIElGCisgICAgICAgIEVORCBETworCishIC4uLiBDaGVjayBpZiBjaHVuayBzaXplcyBhcmUgZGVjcmVhc2VkIHVudGlsIGVxdWFscyB0byAKKyEgLi4uIHRoZSBzcGVjaWZpZWQgb25lLCBpZ25vcmUgdGhlIGxhc3QgZGlzcGF0Y2ggCishIC4uLiBmb3IgcG9zc2libGUgc21hbGxlciByZW1haW5kZXIKKworISBEZXRlcm1pbmUgdGhlIGNvbnN0YW50IAorICAgICAgICBleHBlY3RlZCA9IG9wZW53b3JrIC8gdGhyZWFkcworICAgICAgICBjID0gcmVhbCh0bXAoMCkpIC8gcmVhbChleHBlY3RlZCkKKyAgICAgICAgV1JJVEUoMSwqKSAiRm91bmQgY29uc3RhbnQgdG8gYmUgIiwgYworCisgICAgICAgIERPIGkgPSAwLCBjb3VudCAtIDIKKyAgICAgICAgICBXUklURSgxLCopICJvcGVuOiIsIG9wZW53b3JrLCAic2l6ZToiLCB0bXAoaSkKKyAgICAgICAgICBJRiAoZXhwZWN0ZWQgLkdULiAxKSBUSEVOCisgICAgICAgICAgICBleHBlY3RlZCA9IGMgKiBvcGVud29yayAvIHRocmVhZHMKKyAgICAgICAgICBFTkQgSUYKKworICAgICAgICAgIElGIChhYnModG1wKGkpIC0gZXhwZWN0ZWQpIC5HRS4gMiApIFRIRU4KKyAgICAgICAgICAgIHJlc3VsdCA9IDEKKyAgICAgICAgICAgIFdSSVRFKDEsKikgIkNodW5rc2l6ZSBkaWZmZXJlZCBmcm9tIGV4cGVjdGVkICIsCisgICAgICYgICAgICAgICAidmFsdWU6ICIsdG1wKGkpLCAiaW5zdGVhZCAiLCBleHBlY3RlZAorICAgICAgICAgIEVORCBJRgorCisgICAgICAgICAgSUYgKGkgLkdULiAwIC5BTkQuICh0bXAoaS0xKSAtIHRtcChpKSkgLkxULiAwKSBUSEVOCisgICAgICAgICAgICBXUklURSgxLCopICJDaHVua3NpemUgZGlkIG5vdCBkZWNyZWFzZTogIiwgdG1wKGkpLAorICAgICAmICAgICAgICAgImluc3RlYWQiLHRtcChpLTEpCisgICAgICAgICAgRU5EIElGCisKKyAgICAgICAgICBvcGVud29yayA9IG9wZW53b3JrIC0gdG1wKGkpICAKKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgSUYgKCByZXN1bHQgLkVRLiAwICkgVEhFTgorICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMSAKKyAgICAgICAgRUxTRQorICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorICAgICAgICBFTkQgSUYKKyAgICAgIEVORAorPC9vbXB0czpjaGVjaz4KKzxvbXB0czpjcm9zc2NoZWNrPgorICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKyAgICAgIEVORAorPC9vbXB0czpjcm9zc2NoZWNrPgorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb210cHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL2RvX3NjaGVkdWxlX3N0YXRpYy5mIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vZG9fc2NoZWR1bGVfc3RhdGljLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FiMDJmOAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL2RvX3NjaGVkdWxlX3N0YXRpYy5mCkBAIC0wLDAgKzEsNzAgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgc3RhdGljIG9wdGlvbiBvZiB0aGUgb21wIGRvIHNjaGVkdWxlIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIGRvIHNjaGVkdWxlKHN0YXRpYyk8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgZG8gbm93YWl0LG9tcCBmbHVzaCxvbXAgY3JpdGljYWwsb21wIHNpbmdsZTwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisKKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5kb19zY2hlZHVsZV9zdGF0aWM8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOVEVHRVIgb21wX2dldF90aHJlYWRfbnVtLG9tcF9nZXRfbnVtX3RocmVhZHMKKyAgICAgICAgQ0hBUkFDVEVSKjMwIGxvZ2ZpbGUKKyAgICAgICAgSU5URUdFUiB0aHJlYWRzCisgICAgICAgIElOVEVHRVIgY291bnQKKyAgICAgICAgSU5URUdFUiBpaQorICAgICAgICBJTlRFR0VSIHJlc3VsdAorPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBJTlRFR0VSIENGU01BWF9TSVpFCisgICAgICAgIFBBUkFNRVRFUiAoQ0ZTTUFYX1NJWkUgPSAxMDAwKQorICAgICAgICBJTlRFR0VSIGksdGlkcygwOkNGU01BWF9TSVpFLTEpLCB0aWQsIGNodW5rX3NpemUKKyAgICAgICAgQ09NTU9OIC9vcnBodmFycy8gaSx0aWQsdGlkcyxjaHVua19zaXplCis8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgICAgIGNodW5rX3NpemUgPSA3CisgICAgICAgIHJlc3VsdCA9IDAKKyAgICAgICAgaWkgPSAwCisKKyEkb21wIHBhcmFsbGVsIAorISRvbXAgc2luZ2xlCisgICAgICAgIHRocmVhZHMgPSBvbXBfZ2V0X251bV90aHJlYWRzKCkKKyEkb21wIGVuZCBzaW5nbGUKKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGICggdGhyZWFkcyAuTFQuIDIpIFRIRU4KKyAgICAgICAgICBQUklOVCAqLCJUaGlzIHRlc3Qgb25seSB3b3JrcyB3aXRoIGF0IGxlYXN0IHR3byB0aHJlYWRzIgorICAgICAgICAgIFdSSVRFKDEsKikgIlRoaXMgdGVzdCBvbmx5IHdvcmtzIHdpdGggYXQgbGVhc3QgdHdvIHRocmVhZHMiCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKyAgICAgICAgICBTVE9QCisgICAgICAgIEVMU0UKKyAgICAgICAgICBXUklURSgxLCopICJVc2luZyBhbiBpbnRlcm5hbCBjb3VudCBvZiAiLENGU01BWF9TSVpFCisgICAgICAgICAgV1JJVEUoMSwqKSAiVXNpbmcgYSBzcGVjaWZpZWQgY2h1bmtzaXplIG9mICIsY2h1bmtfc2l6ZQorICAgIAorISRvbXAgcGFyYWxsZWwgcHJpdmF0ZSh0aWQpIHNoYXJlZCh0aWRzKQorICAgICAgICAgIHRpZCA9IG9tcF9nZXRfdGhyZWFkX251bSgpCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gPG9tcHRzOmNoZWNrPnNjaGVkdWxlKHN0YXRpYyxjaHVua19zaXplKTwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgRE8gaSA9IDAgLENGU01BWF9TSVpFIC0xCisgICAgICAgICAgICB0aWRzKGkpID0gdGlkCisgICAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgICBETyBpID0gMCwgQ0ZTTUFYX1NJWkUtMQorIS4uLiByb3VuZC1yb2JpbiBmb3Igc3RhdGljIGNodW5rCisgICAgICAgICAgICBpaSA9IG1vZCggaS9jaHVua19zaXplLHRocmVhZHMpCisgICAgICAgICAgICBJRiAodGlkcyhpKSAuTkUuIGlpICkgVEhFTgorICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgICAgIFdSSVRFKDEsKikiSXRlcmF0aW9uICIsaSwic2hvdWxkIGJlIGFzc2lnbmVkIHRvICIsCisgICAgICYgICAgICAgICAgIGlpLCJpbnN0ZWFkIG9mICIsdGlkcyhpKQorICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgRU5EIERPCisgICAgICAgICAgSUYgKCByZXN1bHQgLkVRLiAwIClUSEVOCisgICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgICAgRU5EIElGCisgICAgICAgIEVORCBJRgorICAgICAgRU5EIEZVTkNUSU9OCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vaGFzX29wZW5tcC5mIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vaGFzX29wZW5tcC5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1ODVlZjIKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9oYXNfb3Blbm1wLmYKQEAgLTAsMCArMSwyNSBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dmVyc2lvbj4yLjA8L29tcHRzOnZlcnNpb24+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3RpbmcgaWYgdGhlIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIGlzIHN1cHBvcnRlZCBvciBub3QuICAKK1lpIFdlbiBhdCAwNTAzMjAwNDogRG8gd2Ugd2FudCB0byB3cml0ZSB0d28gdmVyc2lvbnMgb2YgaGFzX29tcD8gIGJvdGggQzIzNDU2Nzg5IAorYW5kICNpZmRlZiBmb3JtYXRzIGFyZSBzdXBwb3NlZCB0byB3b3JrLiBBdCBsZWFzdCBTdW4ncyBjb21waWxlciBjYW5ub3QgZGVhbCB3aXRoIAordGhlIHNlY29uZCBmb3JtYXQgKCNpZmRlZik8L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKworPG9tcHRzOnRlc3Rjb2RlPgorICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPmhhc19vcGVubXA8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorCis8b21wdHM6Y2hlY2s+CishdmVyc2lvbiAxLgorIUMyMzQ1Njc4OSAKKyEkICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorCishIHZlcnNpb24gMi4KKyEjaWZkZWYgX09QRU5NUAorICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorISNlbmRpZgorPC9vbXB0czpjaGVjaz4KKworICAgICAgRU5EIEZVTkNUSU9OCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX2F0b21pYy5mIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX2F0b21pYy5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlNzQ0NTAKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfYXRvbWljLmYKQEAgLTAsMCArMSw1ODggQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIGF0b21pYyBkaXJlY3RpdmUgYnkgY291bnRpbmcgdXAgYSB2YXJpYWJsZSBpbiBhIHBhcmFsbGVsaXplZCBsb29wIHdpdGggYW4gYXRvbWljIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIGF0b21pYzwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOnRlc3Rjb2RlPgorISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCishIEZ1bmN0aW9uczogb21wX2F0b21pYworISBjaGFuZ2UgImNoYXJhY3RlcioyMCIgaW50byAiY2hhcmFjdGVyIChMRU49MjApOjoiCishIGdldCByaWQgb2YgdGhlICJ0YWIiIGtleSBieSBaaGVueWluZyBMaXUsIG9uIE9jdC4gMTYsIDIwMDUuCishKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfYXRvbWljPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTkNMVURFICJvbXBfdGVzdHN1aXRlLmYiCisgICAgICAgIElOVEVHRVIgc3VtMiwga25vd25fc3VtCisgICAgICAgIElOVEVHRVIga25vd25fcHJvZHVjdCwgaW50X2NvbnN0CisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gcm91bmRpbmdfZXJyb3IsIGRwdAorICAgICAgICBJTlRFR0VSIGRvdWJsZV9ESUdJVFMKKyAgICAgICAgRE9VQkxFIFBSRUNJU0lPTiBka25vd25fc3VtCisgICAgICAgIElOVEVHRVIgcmVzdWx0CisgICAgICAgIFBBUkFNRVRFUiAoaW50X2NvbnN0PTEwLGtub3duX3Byb2R1Y3Q9MzYyODgwMCkKKyAgICAgICAgUEFSQU1FVEVSIChyb3VuZGluZ19lcnJvcj0xLkUtMikKKzxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5URUdFUiBzdW0saSxkaWZmLHByb2R1Y3QKKyAgICAgICAgRE9VQkxFIFBSRUNJU0lPTiBkc3VtLGR0LGRkaWZmCisgICAgICAgIExPR0lDQUwgbG9naWNfYW5kLCBsb2dpY19vciwgbG9naWNfZXF2LGxvZ2ljX25lcXYKKyAgICAgICAgSU5URUdFUiBiaXRfYW5kLCBiaXRfb3IKKyAgICAgICAgSU5URUdFUiBleGNsdXNpdl9iaXRfb3IKKyAgICAgICAgSU5URUdFUiBtaW5fdmFsdWUsIG1heF92YWx1ZQorICAgICAgICBET1VCTEUgUFJFQ0lTSU9OIGRtaW4sIGRtYXgKKyAgICAgICAgTE9HSUNBTCBsb2dpY3MoTE9PUENPVU5UKQorICAgICAgICBJTlRFR0VSIGludF9hcnJheShMT09QQ09VTlQpCisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gZF9hcnJheShMT09QQ09VTlQpCisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIHN1bSxwcm9kdWN0LGRpZmYsaSxkc3VtLGRkaWZmLGR0LGxvZ2ljX2FuZCwKKyAgICAgJiAgICBsb2dpY19vcixsb2dpY19lcXYsbG9naWNfbmVxdixsb2dpY3MsYml0X2FuZCxiaXRfb3IsaW50X2FycmF5LAorICAgICAmICAgIGV4Y2x1c2l2X2JpdF9vcixtaW5fdmFsdWUsZG1pbixkbWF4LGRfYXJyYXksbWF4X3ZhbHVlCisgICAgICAgIElOVEVHRVIgTUFYX0ZBQ1RPUgorICAgICAgICBQQVJBTUVURVIgKGRvdWJsZV9ESUdJVFM9MjAsTUFYX0ZBQ1RPUj0xMCkKKzwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICAgICAgZHQgPSAxLi8zLgorICAgICAgICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDIKKyAgICAgICAgcHJvZHVjdCA9IDEKKyAgICAgICAgc3VtMiA9IDAKKyAgICAgICAgc3VtID0gMAorICAgICAgICBkc3VtID0gMC4KKyAgICAgICAgcmVzdWx0ID0wIAorICAgICAgICBsb2dpY19hbmQgPSAudHJ1ZS4KKyAgICAgICAgbG9naWNfb3IgPSAuZmFsc2UuCisgICAgICAgIGJpdF9hbmQgPSAxCisgICAgICAgIGJpdF9vciA9IDAKKyAgICAgICAgZXhjbHVzaXZfYml0X29yID0gMAorISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyAKKyAgICAgICAgRE8gaSA9MSwgTE9PUENPVU5UCis8b21wdHM6Y2hlY2s+CishJG9tcCBhdG9taWMKKzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgc3VtID0gc3VtICsgaQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoa25vd25fc3VtIC5ORS4gc3VtKSBUSEVOCisgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBzdW0gd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAiLAorICAgICAmICAgc3VtLCJpbnN0ZWFkIG9mICIsIGtub3duX3N1bQorICAgICAgICBFTkQgSWYKKworICAgICAgICBkaWZmID0gKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyCisKKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyAKKyAgICAgICAgRE8gaSA9MSwgTE9PUENPVU5UCis8b21wdHM6Y2hlY2s+CishJG9tcCBhdG9taWMKKzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgZGlmZiA9IGRpZmYgLSBpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorICAKKyAgICAgICAgSUYgKCBkaWZmIC5ORS4gMCApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGRpZmZlcmVuY2Ugd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAiLAorICAgICAmICAgZGlmZiwiaW5zdGVhZCBvZiAwLiIKKyAgICAgICAgRU5EIElGCisKKyEuLi4gVGVzdCBmb3IgZG91YmxlcworICAgICAgICBkc3VtID0gMC4KKyAgICAgICAgZHB0ID0gMQorCisgICAgICAgIERPIGk9MSwgRE9VQkxFX0RJR0lUUworICAgICAgICAgIGRwdD0gZHB0ICogZHQKKyAgICAgICAgRU5EIERPCisgICAgICAgIGRrbm93bl9zdW0gPSAoMS1kcHQpLygxLWR0KQorISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyAKKyAgICAgICAgRE8gaT0wLERPVUJMRV9ESUdJVFMtMQorPG9tcHRzOmNoZWNrPgorISRvbXAgYXRvbWljCis8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICBkc3VtID0gZHN1bSArIGR0KippCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgCisgICAgICAgIElGIChkc3VtIC5ORS4gZGtub3duX3N1bSAuQU5ELiAKKyAgICAgJiAgICAgQUJTKGRzdW0gLSBka25vd25fc3VtKSAuR1QuIHJvdW5kaW5nX2Vycm9yICkgVEhFTgorICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIHN1bSB3aXRoIGRvdWJsZXM6IFJlc3VsdCB3YXMgIiwKKyAgICAgJiAgICAgICBkc3VtLCJpbnN0ZWFkIG9mICIsZGtub3duX3N1bSwiKERpZmZlcmVuY2U6ICIsCisgICAgICYgICAgICAgZHN1bSAtIGRrbm93bl9zdW0sIikiCisgICAgICAgIEVORCBJRgorICAgICAgICBkcHQgPSAxCisKKyAgICAgIAorICAgICAgICBETyBpPTEsIERPVUJMRV9ESUdJVFMKKyAgICAgICAgICAgZHB0ID0gZHB0KmR0CisgICAgICAgIEVORCBETworCisgICAgICAgIGRkaWZmID0gKCAxLWRwdCkvKDEtZHQpCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIAorICAgICAgICBETyBpPTAsIERPVUJMRV9ESUdJVFMtMQorPG9tcHRzOmNoZWNrPgorISRvbXAgYXRvbWljCis8L29tcHRzOmNoZWNrPgorICAgICAgICAgIGRkaWZmID0gZGRpZmYgLSBkdCoqaQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIEFCUyhkZGlmZikgLkdULiByb3VuZGluZ19lcnJvciApIFRIRU4KKyAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBEaWZmZXJlbmNlIHdpdGggZG91YmxlczogUmVzdWx0IHdhcyAiLAorICAgICAmICAgICAgIGRkaWZmLCJpbnN0ZWFkIG9mIDAuMCIKKyAgICAgICAgRU5EIElGCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gCisgICAgICAgIERPIGk9MSxNQVhfRkFDVE9SCis8b21wdHM6Y2hlY2s+CishJG9tcCBhdG9taWMKKzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgIHByb2R1Y3QgPSBwcm9kdWN0ICogaQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoa25vd25fcHJvZHVjdCAuTkUuIHByb2R1Y3QpIFRIRU4KKyAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBQcm9kdWN0IHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgIiwKKyAgICAgJiAgICAgICBwcm9kdWN0LCIgaW5zdGVhZCBvZiIsa25vd25fcHJvZHVjdCAKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgIGxvZ2ljcyhpKSA9IC5UUlVFLgorICAgICAgICBFTkQgRE8KKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyAKKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorPG9tcHRzOmNoZWNrPgorISRvbXAgYXRvbWljCis8L29tcHRzOmNoZWNrPgorICAgICAgICAgIGxvZ2ljX2FuZCA9IGxvZ2ljX2FuZCAuQU5ELiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKC5OT1QuIGxvZ2ljX2FuZCkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBBTkQgcGFydCAxIgorICAgICAgICBFTkQgSUYKKworCisgICAgICAgIGxvZ2ljX2FuZCA9IC5UUlVFLgorICAgICAgICBsb2dpY3MoTE9PUENPVU5ULzIpID0gLkZBTFNFLgorCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvCisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKzxvbXB0czpjaGVjaz4KKyEkb21wIGF0b21pYworPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICBsb2dpY19hbmQgPSBsb2dpY19hbmQgLkFORC4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGIChsb2dpY19hbmQpIFRIRU4KKyAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBBTkQgcGFzcyAyIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorICAgICAgICAgbG9naWNzKGkpID0gLkZBTFNFLgorICAgICAgICBFTkQgRE8KKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyAKKyAgICAgICAgRE8gaSA9IDEsIExPT1BDT1VOVAorPG9tcHRzOmNoZWNrPgorISRvbXAgYXRvbWljCis8L29tcHRzOmNoZWNrPgorICAgICAgICAgICBsb2dpY19vciA9IGxvZ2ljX29yIC5PUi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGIChsb2dpY19vcikgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBPUiBwYXJ0IDEiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIGxvZ2ljX29yID0gLkZBTFNFLgorICAgICAgICBsb2dpY3MoTE9PUENPVU5ULzIpID0gLlRSVUUuCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gCisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKzxvbXB0czpjaGVjaz4KKyEkb21wIGF0b21pYworPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgbG9naWNfb3IgPSBsb2dpY19vciAuT1IuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIC5OT1QuIGxvZ2ljX29yICkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBPUiBwYXJ0IDIiCisgICAgICAgIEVORCBJRgorCishLi4uIFRlc3QgbG9naWMgRVFWLCB1bmlxdWUgaW4gRm9ydHJhbgorICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorICAgICAgICAgbG9naWNzKGkpID0gLlRSVUUuCisgICAgICAgIEVORCBETworCisgICAgICAgIGxvZ2ljX2VxdiA9IC5UUlVFLgorCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIAorICAgICAgICBETyBpID0gMSwgTE9PUENPVU5UCis8b21wdHM6Y2hlY2s+CishJG9tcCBhdG9taWMKKzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgIGxvZ2ljX2VxdiA9IGxvZ2ljX2VxdiAuRVFWLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKC5OT1QuIGxvZ2ljX2VxdikgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBFUVYgcGFydCAxIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBsb2dpY19lcXYgPSAuVFJVRS4KKyAgICAgICAgbG9naWNzKExPT1BDT1VOVC8yKSA9IC5GQUxTRS4KKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyAKKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorPG9tcHRzOmNoZWNrPgorISRvbXAgYXRvbWljCis8L29tcHRzOmNoZWNrPgorICAgICAgICAgICBsb2dpY19lcXYgPSBsb2dpY19lcXYgLkVRVi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGICggbG9naWNfZXF2ICkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBFUVYgcGFydCAyIgorICAgICAgICBFTkQgSUYKKworIS4uLiBUZXN0IGxvZ2ljIE5FUVYsIHdoaWNoIGlzIHVuaXF1ZSBpbiBGb3J0cmFuCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICBsb2dpY3MoaSkgPSAuRkFMU0UuCisgICAgICAgIEVORCBETworCisgICAgICAgIGxvZ2ljX25lcXYgPSAuRkFMU0UuCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gCisgICAgICAgIERPIGkgPSAxLCBMT09QQ09VTlQKKzxvbXB0czpjaGVjaz4KKyEkb21wIGF0b21pYworPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgbG9naWNfbmVxdiA9IGxvZ2ljX25lcXYgLk9SLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKGxvZ2ljX25lcXYpIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gbG9naWMgTkVRViBwYXJ0IDEiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIGxvZ2ljX25lcXYgPSAuRkFMU0UuCisgICAgICAgIGxvZ2ljcyhMT09QQ09VTlQvMikgPSAuVFJVRS4KKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyAKKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorPG9tcHRzOmNoZWNrPgorISRvbXAgYXRvbWljCis8L29tcHRzOmNoZWNrPgorICAgICAgICAgICBsb2dpY19uZXF2ID0gbG9naWNfbmVxdiAuT1IuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIC5OT1QuIGxvZ2ljX25lcXYgKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGxvZ2ljIE5FUVYgcGFydCAyIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorICAgICAgICAgIGludF9hcnJheShpKSA9IDEKKyAgICAgICAgRU5EIERPCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIAorICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorIS4uLiBpYW5kKEksSik6IFJldHVybnMgdmFsdWUgcmVzdWx0aW5nIGZyb20gYm9vbGVhbiBBTkQgb2YgCishLi4uIHBhaXIgb2YgYml0cyBpbiBlYWNoIG9mIEkgYW5kIEouIAorPG9tcHRzOmNoZWNrPgorISRvbXAgYXRvbWljCis8L29tcHRzOmNoZWNrPgorICAgICAgICAgIGJpdF9hbmQgPSBJQU5EKGJpdF9hbmQsaW50X2FycmF5KGkpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIGJpdF9hbmQgLkxULiAxICkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBJQU5EIHBhcnQgMSIKKyAgICAgICAgRU5EIElmCisKKyAgICAgICAgYml0X2FuZCA9IDEKKyAgICAgICAgaW50X2FycmF5KExPT1BDT1VOVC8yKSA9IDAKKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyAKKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKzxvbXB0czpjaGVjaz4KKyEkb21wIGF0b21pYworPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICBiaXRfYW5kID0gSUFORCAoIGJpdF9hbmQsIGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGKCBiaXRfYW5kIC5HRS4gMSkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBJQU5EIHBhcnQgMiIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgICBpbnRfYXJyYXkoaSkgPSAwCisgICAgICAgIEVORCBETworCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCishLi4uIElvcihJLEopOiBSZXR1cm5zIHZhbHVlIHJlc3VsdGluZyBmcm9tIGJvb2xlYW4gT1Igb2YgCishLi4uIHBhaXIgb2YgYml0cyBpbiBlYWNoIG9mIEkgYW5kIEouIAorPG9tcHRzOmNoZWNrPgorISRvbXAgYXRvbWljCis8L29tcHRzOmNoZWNrPgorICAgICAgICAgIGJpdF9vciA9IElvcihiaXRfb3IsIGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGICggYml0X29yIC5HRS4gMSkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBJb3IgcGFydCAxIgorICAgICAgICBFTkQgSUYKKworCisgICAgICAgIGJpdF9vciA9IDAKKyAgICAgICAgaW50X2FycmF5KExPT1BDT1VOVC8yKSA9IDEKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCis8b21wdHM6Y2hlY2s+CishJG9tcCBhdG9taWMKKzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgYml0X29yID0gSU9SKGJpdF9vciwgaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCBiaXRfb3IgLmxlLiAwKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIElvciBwYXJ0IDIiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICAgaW50X2FycmF5KGkpID0gMAorICAgICAgICBFTkQgRE8KKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyAKKyAgICAgICAgRE8gaSA9IDEsIExPT1BDT1VOVAorPG9tcHRzOmNoZWNrPgorISRvbXAgYXRvbWljCis8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgZXhjbHVzaXZfYml0X29yID0gSUVPUihleGNsdXNpdl9iaXRfb3IsIGludF9hcnJheShpKSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCBleGNsdXNpdl9iaXRfb3IgLkdFLiAxKSBUSEVOCisgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gSWVvciBwYXJ0IDEiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIGV4Y2x1c2l2X2JpdF9vciA9IDAKKyAgICAgICAgaW50X2FycmF5KExPT1BDT1VOVC8yKSA9IDEKKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyAKKyAgICAgICAgRE8gaSA9IDEsIExPT1BDT1VOVAorPG9tcHRzOmNoZWNrPgorISRvbXAgYXRvbWljCis8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgZXhjbHVzaXZfYml0X29yID0gaWVvcihleGNsdXNpdl9iaXRfb3IsIGludF9hcnJheShpKSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCBleGNsdXNpdl9iaXRfb3IgLkxFLiAwKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIEllb3IgcGFydCAyIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBETyBpPTEsTE9PUENPVU5UCisgICAgICAgICAgIGludF9hcnJheShpKSA9IDEwIC0gaQorICAgICAgICBFTkQgRE8KKworICAgICAgICBtaW5fdmFsdWUgPSA2NTUzNQorCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIAorICAgICAgICBETyBpID0gMSwgTE9PUENPVU5UCis8b21wdHM6Y2hlY2s+CishJG9tcCBhdG9taWMKKzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICBtaW5fdmFsdWUgPSBtaW4obWluX3ZhbHVlLGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGICggbWluX3ZhbHVlIC5HVC4gKDEwLUxPT1BDT1VOVCkgKVRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gaW50ZWdlciBNSU4iCisgICAgICAgIEVORCBJRgorCisKKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgICBpbnRfYXJyYXkoaSkgPSBpCisgICAgICAgIEVORCBETworCisgICAgICAgIG1heF92YWx1ZSA9IC0zMjc2OAorCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIAorICAgICAgICBETyBpID0gMSwgTE9PUENPVU5UCis8b21wdHM6Y2hlY2s+CishJG9tcCBhdG9taWMKKzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICBtYXhfdmFsdWUgPSBtYXgobWF4X3ZhbHVlLGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGICggbWF4X3ZhbHVlIC5MVC4gTE9PUENPVU5UIClUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGludGVnZXIgTUFYIgorICAgICAgICBFTkQgSUYKKworIS4uLiB0ZXN0IGRvdWJsZSBtaW4sIG1heAorICAgICAgICBETyBpPTEsTE9PUENPVU5UCisgICAgICAgICAgIGRfYXJyYXkoaSkgPSAxMCAtIGkqZHQKKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgZG1pbiA9IDIqKjEwCisgICAgICAgIGR0ID0gMC41CisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gCisgICAgICAgIERPIGkgPSAxLCBMT09QQ09VTlQKKzxvbXB0czpjaGVjaz4KKyEkb21wIGF0b21pYworPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgIGRtaW49IE1JTihkbWluLGRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIGRtaW4gLkdULiAoMTAtZHQpIClUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGRvdWJsZSBNSU4iCisgICAgICAgIEVORCBJRgorCisKKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgIGRfYXJyYXkoaSkgPSBpICogZHQKKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgZG1heD0gLSAoMioqMTApCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gCisgICAgICAgIERPIGkgPSAxLCBMT09QQ09VTlQKKzxvbXB0czpjaGVjaz4KKyEkb21wIGF0b21pYworPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICBkbWF4PSBtYXgoZG1heCxkX2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCBkbWF4IC5MVC4gTE9PUENPVU5UKmR0IClUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGRvdWJsZSBNQVgiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIElGICggcmVzdWx0IC5FUS4gMCApIFRIRU4KKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+PSAgMQorICAgICAgICBFTFNFCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPj0gIDAKKyAgICAgICAgRU5EIElGCisKKyAgICAgIEVORCBGVU5DVElPTgorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9iYXJyaWVyLmYgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfYmFycmllci5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxMjU5OTQKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfYmFycmllci5mCkBAIC0wLDAgKzEsNTAgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIGJhcnJpZXIgZGlyZWN0aXZlLiBUaGUgdGVzdCAgICBjcmVhdGVzIHNldmVyYWwgdGhyZWFkcyBhbmQgc2VuZHMgb25lIG9mIHRoZW0gc2xlZXBpbmcgYmVmb3JlIHNldHRpbmcgYSBmbGFnLiAgQWZ0ZXIgdGhlIGJhcnJpZXIgdGhlIG90aGVyIG9uZXMgZG8gc29tZSBsaXR0bGUgd29yayBkZXBlbmRpbmcgb24gdGhlIGZsYWcuPC8gICBvbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBiYXJyaWVyPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6dGVzdGNvZGU+CisKKyAgICAgIFNVQlJPVVRJTkUgZG9fc29tZV93b3JrMygpCisgICAgICAgIFJFQUwgaQorICAgICAgICBJTlRSSU5TSUMgc3FydAorICAgICAgICBET1VCTEUgUFJFQ0lTSU9OIHN1bQorICAgICAgICBJTkNMVURFICJvbXBfdGVzdHN1aXRlLmYiCisgICAgICAgIHN1bSA9IDAuMAorICAgICAgICBETyBXSElMRSAoaSA8IExPT1BDT1VOVC0xKQorICAgICAgICAgIHN1bSA9IHN1bSArIHNxcnQoaSkKKyAgICAgICAgICBpID0gaSArIDEKKyAgICAgICAgRU5EIERPCisgICAgICBFTkQKKworICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9iYXJyaWVyPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIHNsZWVwdGltZQorICAgICAgICBJTlRFR0VSIG9tcF9nZXRfdGhyZWFkX251bQorICAgICAgICBJTlRFR0VSIHJlc3VsdDEsIHJlc3VsdDIsIHJhbmsKKyAgICAgICAgcmVzdWx0MSA9IDAKKyAgICAgICAgcmVzdWx0MiA9IDAKKyAgICAgICAgc2xlZXB0aW1lID0gMQorISRvbXAgcGFyYWxsZWwgcHJpdmF0ZShyYW5rKQorICAgICAgICByYW5rID0gb21wX2dldF90aHJlYWRfbnVtKCkKKyEgICAgICAgIFBSSU5UICosICJyYW5rIiwgcmFuaworICAgICAgICBJRiAoIHJhbmsgLkVRLiAxICkgVEhFTgorICAgICAgICAgIENBTEwgc2xlZXAoc2xlZXB0aW1lKQorICAgICAgICAgIHJlc3VsdDIgPSAzCisgICAgICAgIEVORCBJRgorICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICA8b21wdHM6Y2hlY2s+CishJG9tcCBiYXJyaWVyCisgICAgICAgIDwvb21wdHM6Y2hlY2s+CisgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgICAgICBJRiAoIHJhbmsgLkVRLiAwICkgVEhFTgorICAgICAgICAgIHJlc3VsdDEgPSByZXN1bHQyCisgICAgICAgIEVORCBJRgorISRvbXAgZW5kIHBhcmFsbGVsCisgICAgICAgIElGICggcmVzdWx0MSAuRVEuIDMgKSBUSEVOCisgICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAxCisgICAgICAgIEVMU0UKKyAgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKyAgICAgICAgRU5EIElGCisgICAgICBFTkQKKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfY29weWluLmYgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfY29weWluLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE0ZjE0OQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9jb3B5aW4uZgpAQCAtMCwwICsxLDQ3IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBwYXJhbGxlbCBjb3B5aW4gZGlyZWN0aXZlLjwvICAgb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgY29weWluPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsLG9tcCB0aHJlYWRwcml2YXRlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyEgQ2hhbmdlbG9nOgorICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9jb3B5aW48L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOVEVHRVIga25vd25fc3VtCisJCTxvbXB0czpvcnBoYW46dmFycz4KKyEgICAgICAgIElOVEVHRVIsIFNBVkU6OnN1bTEgCishICAgICAgICBpbXBsaWNpdGx5IGJ5IG9tcF90aHJlYWRwcml2YXRlLCBzZWUgc3BlYzI1IENoYXAuIDIuOC4yCisgICAgICAgIElOVEVHRVIgc3VtMQorICAgICAgICBDT01NT04gL2NzdW0xLyBzdW0xCisgICAgICAgIElOVEVHRVIgc3VtLCBpLCB0aHJlYWRzCisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIHN1bSwgaSwgdGhyZWFkcworISAgIEMuIE5pZXRoYW1tZXIgMzAuMTEuMDY6IG1vdmVkIHRocmVhZHByaXZhdGUgc3RhdGVtZW50IGludG8gdGhlIG9ycGhhbmVkCishICAgICAgZnVuY3Rpb24KKyEkb21wIHRocmVhZHByaXZhdGUoL2NzdW0xLykKKwkJPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgICAgICBzdW0gPSAwCisgICAgICAgIHN1bTEgPSA3CisgICAgICAgIHRocmVhZHMgPSAwCisJCTxvbXB0czpvcnBoYW4+CishJG9tcCBwYXJhbGxlbCA8b21wdHM6Y2hlY2s+Y29weWluKHN1bTEpPC9vbXB0czpjaGVjaz4KKyEgICAgICAgIHByaW50ICosInN1bTEiLHN1bTEKKyEkb21wIGRvCisgICAgICAgIERPIGk9MSwgOTk5CisgICAgICAgICAgc3VtMSA9IHN1bTEgKyBpCisgICAgICAgIEVORCBETworISRvbXAgY3JpdGljYWwKKyAgICAgICAgc3VtID0gc3VtICsgc3VtMQorICAgICAgICB0aHJlYWRzID0gdGhyZWFkcyArIDEKKyEkb21wIGVuZCBjcml0aWNhbAorISRvbXAgZW5kIHBhcmFsbGVsCisJCTwvb21wdHM6b3JwaGFuPgorICAgICAgICBrbm93bl9zdW0gPSA5OTkqMTAwMC8yICsgNyp0aHJlYWRzCisgICAgICAgIElGICgga25vd25fc3VtIC5FUS4gc3VtICkgVEhFTgorICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorICAgICAgICBFTFNFCisgICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIEVORCBJRgorICAgICAgRU5ECis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX2NyaXRpY2FsLmYgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfY3JpdGljYWwuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTJkZDJiCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX2NyaXRpY2FsLmYKQEAgLTAsMCArMSw1OSBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgY3JpdGljYWwgZGlyZWN0aXZlIGJ5IGNvdW50aW5nIHVwIGEgdmFyaWFibGUgaW4gYSBwYXJhbGxlbGl6ZWQgcmVnaW9uIHdpdGhpbiBhIGNyaXRpY2FsIHNlY3Rpb24uCisKKzwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgY3JpdGljYWw8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfY3JpdGljYWw8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOVEVHRVIga25vd25fc3VtCisgICAgICAgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5URUdFUiBpLGosbXlpLG15aiwgc3VtCisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIHN1bSwgbXlpLCBteWoKKyAgICAgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgc3VtID0gMAorICAgICAgICBteWkgPSAwCisgICAgICAgIG15aiA9IDUwMAorISRvbXAgcGFyYWxsZWwKKyEkb21wIHNlY3Rpb25zCisKKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IDAgLCA0OTkKKyAgICAgICAgICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4KKyEkb21wIGNyaXRpY2FsCisgICAgICAgICAgICAgICAgPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgc3VtID0gc3VtICsgbXlpCisgICAgICAgICAgIG15aSA9IG15aSArIDEKKyAgICAgICAgICAgICAgICA8b21wdHM6Y2hlY2s+CishJG9tcCBlbmQgY3JpdGljYWwKKyAgICAgICAgICAgICAgICA8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgICAgICBFTkQgRE8KKworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBqID0gNTAwICwgOTk5CisgICAgICAgICAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgICAgICAgICA8b21wdHM6Y2hlY2s+CishJG9tcCBjcml0aWNhbAorICAgICAgICAgICAgICAgIDwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgIHN1bSA9IHN1bSArIG15agorICAgICAgICAgICBteWogPSBteWogKyAxCisgICAgICAgICAgICAgICAgPG9tcHRzOmNoZWNrPgorISRvbXAgZW5kIGNyaXRpY2FsCisgICAgICAgICAgICAgICAgPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgc2VjdGlvbnMKKyEkb21wIGVuZCBwYXJhbGxlbAorICAgICAgICBrbm93bl9zdW0gPSA5OTkqMTAwMC8yCisgICAgICAgIElGICgga25vd25fc3VtIC5FUS4gc3VtICkgVEhFTgorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAxCisgICAgICAgIEVMU0UKKyAgICAgICAgICBXUklURSAoMSwqKSAiRm91bmQgc3VtIHdhcyIsIHN1bSwgImluc3RlYWQiLCBrbm93bl9zdW0KKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorICAgICAgICBFTkQgSUYKKyAgICAgIEVORAorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9mbHVzaC5mIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX2ZsdXNoLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBkYWY1MAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9mbHVzaC5mCkBAIC0wLDAgKzEsNDkgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIGZsdXNoIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIGZsdXNoPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGJhcnJpZXI8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorICAgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX2ZsdXNoPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIHJlc3VsdDEsIGR1bW15LCByYW5rCisgICAgICAgIElOVEVHRVIgb21wX2dldF90aHJlYWRfbnVtCisgICAgICAgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5URUdFUiByZXN1bHQyCisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIHJlc3VsdDIKKyAgICAgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgcmVzdWx0MT0wCisgICAgICAgIHJlc3VsdDI9MAorISRvbXAgcGFyYWxsZWwgcHJpdmF0ZShyYW5rKQorICAgICAgICByYW5rID0gb21wX2dldF90aHJlYWRfbnVtKCkKKyEkb21wIGJhcnJpZXIKKyAgICAgICAgSUYgKCByYW5rIC5FUS4gMSApIFRIRU4KKyAgICAgICAgICByZXN1bHQyID0gMworICAgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgICAgPG9tcHRzOmNoZWNrPgorISRvbXAgZmx1c2gocmVzdWx0MikKKyAgICAgICAgICA8L29tcHRzOmNoZWNrPgorICAgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgICAgICAgIGR1bW15ID0gcmVzdWx0MgorICAgICAgICBFTkQgSUYKKyAgICAgICAgSUYgKCByYW5rIC5FUS4gMCApIFRIRU4KKyAgICAgICAgICBjYWxsIHNsZWVwKDEpCisgICAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgICA8b21wdHM6Y2hlY2s+CishJG9tcCBmbHVzaChyZXN1bHQyKQorICAgICAgICAgIDwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgICAgICAgcmVzdWx0MSA9IHJlc3VsdDIKKyAgICAgICAgRU5EIElGCishJG9tcCBlbmQgcGFyYWxsZWwKKworISAgICAgICAgUFJJTlQgKiwiMToiLCByZXN1bHQxLCAiMjoiLCByZXN1bHQyLCAiZHVtbXkiLCBkdW1teQorICAgICAgICBJRiAoIChyZXN1bHQxIC5FUS4gcmVzdWx0MikgLkFORC4gKHJlc3VsdDIgLkVRLiBkdW1teSkgLkFORC4KKyAgICAgJiAgICAgICAocmVzdWx0MiAuRVEuIDMpICkgVEhFTgorICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorICAgICAgICBFTFNFCisgICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIEVORCBJRgorICAgICAgRU5ECis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX2dldF9udW1fdGhyZWFkcy5mIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX2dldF9udW1fdGhyZWFkcy5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2N2FkOWYKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfZ2V0X251bV90aHJlYWRzLmYKQEAgLTAsMCArMSwzNyBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoYXQgdGhlIG9tcF9nZXRfbnVtX3RocmVhZHMgcmV0dXJucyB0aGUgY29ycmVjdCBudW1iZXIgb2YgdGhyZWFkcy4gVGhlcmVmb3IgaXQgY291bnRzIHVwIGEgdmFyaWFibGUgaW4gYSBwYXJhbGxlbGl6ZWQgc2VjdGlvbiBhbmQgY29tcGFycyB0aGlzIHZhbHVlIHdpdGggdGhlIHJlc3VsdCBvZiB0aGUgb21wX2dldF9udW1fdGhyZWFkcyBmdW5jdGlvbi48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wX2dldF9udW1fdGhyZWFkczwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBjcml0aWNhbCxzb21wIHNpbmdsZTwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX2dldF9udW1fdGhyZWFkczwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElOVEVHRVIgbnRocmVhZHMKKyAgICAgICAgSU5URUdFUiBvbXBfZ2V0X251bV90aHJlYWRzCisJCTxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5URUdFUiBudGhyZWFkc19saWIKKyAgICAgICAgQ09NTU9OIC9vcnBodmFycy8gbnRocmVhZHNfbGliCisJCTwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIG50aHJlYWRzPTAKKyAgICAgICAgbnRocmVhZHNfbGliPS0xCisKKyEkb21wIHBhcmFsbGVsCishc2hhcmVkKG50aHJlYWRzLG50aHJlYWRzX2xpYikKKyEkb21wIGNyaXRpY2FsCisgICAgICAgIG50aHJlYWRzID0gbnRocmVhZHMgKyAxCishJG9tcCBlbmQgY3JpdGljYWwKKyEkb21wIHNpbmdsZQorCQk8b21wdHM6b3JwaGFuPgorCQk8b21wdHM6Y2hlY2s+CisgICAgICAgIG50aHJlYWRzX2xpYj1vbXBfZ2V0X251bV90aHJlYWRzKCkKKwkJPC9vbXB0czpjaGVjaz4KKwkJPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgc2luZ2xlCishJG9tcCBlbmQgcGFyYWxsZWwKKyAgICAgICAgSUYgKG50aHJlYWRzIC5FUS4gbnRocmVhZHNfbGliKSBUSEVOCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgRUxTRQorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIEVORCBJRgorICAgICAgRU5ECis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX2dldF93dGlja3MuZiBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9nZXRfd3RpY2tzLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYyZDAzZAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9nZXRfd3RpY2tzLmYKQEAgLTAsMCArMSwyOCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXBfZ2V0X3d0aWNrIGZ1bmN0aW9uLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXBfZ2V0X3d0aWNrPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX2dldF93dGlja3M8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCis8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gdGljaworICAgICAgICBDT01NT04gL29ycGh2YXJzLyB0aWNrCisgICAgICAgIGluY2x1ZGUgIm9tcF9saWIuaCIKKzwvb21wdHM6b3JwaGFuOnZhcnM+CishICAgICAgICBET1VCTEUgUFJFQ0lTSU9OIG9tcF9nZXRfd3RpY2sKKyAgICAgICAgdGljayA9IDEKKyAgICAgICAgICAgICAgICA8b21wdHM6b3JwaGFuPgorPG9tcHRzOmNoZWNrPgorICAgICAgICB0aWNrPW9tcF9nZXRfd3RpY0soKQorPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICAgICAgV1JJVEUoMSwqKSAid29yayB0b29rIix0aWNrLCJzZWMuIHRpbWUuIgorICAgICAgICBJRih0aWNrIC5HVC4gMC4gLkFORC4gdGljayAuTFQuIDAuMDEpIFRIRU4KKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+PTEKKyAgICAgICAgRUxTRQorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT49MAorICAgICAgICBFTkQgSUYKKyAgICAgIEVORCBGVU5DVElPTgorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9pbl9wYXJhbGxlbC5mIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX2luX3BhcmFsbGVsLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVlZGZmNgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9pbl9wYXJhbGxlbC5mCkBAIC0wLDAgKzEsNDEgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGF0IG9tcF9pbl9wYXJhbGxlbCByZXR1cm5zIGZhbHNlIHdoZW4gY2FsbGVkIGZyb20gYSBzZXJpYWwgcmVnaW9uIGFuZCB0cnVlIHdoZW4gY2FsbGVkIHdpdGhpbiBhIHBhcmFsbGVsIHJlZ2lvbi48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wX2luX3BhcmFsbGVsPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX2luX3BhcmFsbGVsPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyEgICBjaGVja3MgdGhhdCBmYWxzZSBpcyByZXR1cm5lZCB3aGVuIGNhbGxlZCBmcm9tIHNlcmlhbCByZWdpb24KKyEgICBhbmQgdHJ1ZSBpcyByZXR1cm5lZCB3aGVuIGNhbGxlZCB3aXRoaW4gcGFyYWxsZWwgcmVnaW9uCisgICAgICAgIExPR0lDQUwgb21wX2luX3BhcmFsbGVsCisJCTxvbXB0czpvcnBoYW46dmFycz4KKyEgICAgICAgIExPR0lDQUwgb21wX2luX3BhcmFsbGVsCisgICAgICAgIExPR0lDQUwgc2VyaWFsLCBwYXJhbGxlbAorICAgICAgICBDT01NT04gL29ycGh2YXJzLyBzZXJpYWwsIHBhcmFsbGVsCisJCTwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIHNlcmlhbD0uVFJVRS4KKyAgICAgICAgcGFyYWxsZWw9LkZBTFNFLgorCisJCTxvbXB0czpvcnBoYW4+CisJCTxvbXB0czpjaGVjaz4KKyAgICAgICAgc2VyaWFsPW9tcF9pbl9wYXJhbGxlbCgpCisJCTwvb21wdHM6Y2hlY2s+CisJCTwvb21wdHM6b3JwaGFuPgorCishJG9tcCBwYXJhbGxlbAorISRvbXAgc2luZ2xlCisJCTxvbXB0czpvcnBoYW4+CisJCTxvbXB0czpjaGVjaz4KKyAgICAgICAgcGFyYWxsZWw9b21wX2luX3BhcmFsbGVsKCk7CisJCTwvb21wdHM6Y2hlY2s+CisJCTwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHNpbmdsZQorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCAoLk5PVC4gc2VyaWFsKSAuQU5ELiAocGFyYWxsZWwpICkgVEhFTgorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT49MQorICAgICAgICBFTFNFCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPj0wCisgICAgICAgIEVORCBJRgorICAgICAgRU5EIEZVTkNUSU9OCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX2xvY2suZiBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9sb2NrLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkwMjZjNQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9sb2NrLmYKQEAgLTAsMCArMSw1OCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXBfc2V0X2xvY2sgIGFuZCB0aGUgb21wX3Vuc2V0X2xvY2sgZnVuY3Rpb24gYnkgY291bnRpbmcgdGhlIHRocmVhZHMgZW50ZXJpbmcgYW5kIGV4aXRpbmcgYSBzaW5nbGUgcmVnaW9uIHdpdGggbG9ja3MuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4zLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcF9sb2NrPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGZsdXNoPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfbG9jazwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5URUdFUiByZXN1bHQKKyAgICAgICAgSU5URUdFUiBucl90aHJlYWRzX2luX3NpbmdsZQorICAgICAgICBJTlRFR0VSIG5yX2l0ZXJhdGlvbnMKKyAgICAgICAgSU5URUdFUiBpCishbG9jayB2YXJpYWJsZQorICAgICAgICAgICAgICAgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5DTFVERSAib21wX2xpYi5oIgorICAgICAgICBJTlRFR0VSIChLSU5EPU9NUF9MT0NLX0tJTkQpIDo6IGxvY2sKKyAgICAgICAgQ09NTU9OIC9vcnBodmFycy8gbG9jaworICAgICAgICAgICAgICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIElOQ0xVREUgIm9tcF90ZXN0c3VpdGUuZiIKKworIXJlc3VsdCBpczoKKyEgIDAgLS0gaWYgdGhlIHRlc3QgZmFpbHMKKyEgIDEgLS0gaWYgdGhlIHRlc3Qgc3VjY2VlZHMKKyAgICAgICAgQ0FMTCBvbXBfaW5pdF9sb2NrKGxvY2spCisgICAgICAgIG5yX2l0ZXJhdGlvbnM9MAorICAgICAgICBucl90aHJlYWRzX2luX3NpbmdsZT0wCisgICAgICAgIHJlc3VsdD0wCishJG9tcCBwYXJhbGxlbCBzaGFyZWQobG9jayxucl90aHJlYWRzX2luX3NpbmdsZSxucl9pdGVyYXRpb25zLHJlc3VsdCkKKyEkb21wIGRvCisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICAgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgICAgICAgICAgICA8b21wdHM6Y2hlY2s+CisgICAgICAgICAgQ0FMTCBvbXBfc2V0X2xvY2sobG9jaykKKyAgICAgICAgICAgICAgICAgIDwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyEkb21wIGZsdXNoCisgICAgICAgICAgbnJfdGhyZWFkc19pbl9zaW5nbGU9bnJfdGhyZWFkc19pbl9zaW5nbGUrMQorISRvbXAgZmx1c2gKKyAgICAgICAgICBucl9pdGVyYXRpb25zPW5yX2l0ZXJhdGlvbnMrMQorICAgICAgICAgIG5yX3RocmVhZHNfaW5fc2luZ2xlPW5yX3RocmVhZHNfaW5fc2luZ2xlLTEKKyAgICAgICAgICByZXN1bHQ9cmVzdWx0K25yX3RocmVhZHNfaW5fc2luZ2xlCisgICAgICAgICAgICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICAgICAgICAgICAgPG9tcHRzOmNoZWNrPgorICAgICAgICAgIENBTEwgb21wX3Vuc2V0X2xvY2sobG9jaykKKyAgICAgICAgICAgICAgICAgIDwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKyEkb21wIGVuZCBwYXJhbGxlbAorICAgICAgICBDQUxMIG9tcF9kZXN0cm95X2xvY2sobG9jaykKKyAgICAgICAgSUYocmVzdWx0LkVRLjAgLkFORC4gbnJfaXRlcmF0aW9ucyAuRVEuIExPT1BDT1VOVCkgVEhFTgorICAgICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+PTEKKyAgICAgICAgRUxTRQorICAgICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+PTAKKyAgICAgICAgRU5ESWYKKyAgICAgIEVORAorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9tYXN0ZXIuZiBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9tYXN0ZXIuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWUxZjNkCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX21hc3Rlci5mCkBAIC0wLDAgKzEsMzkgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIG1hc3RlciBkaXJlY3RpdmUgYnkgY291bnRpbmcgdXAgYSB2YXJpYWJsZSBpbiBhIG9tcCBtYXN0ZXIgc2VjdGlvbi48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIG1hc3Rlcjwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBjcml0aWNhbDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX21hc3Rlcjwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5URUdFUiBvbXBfZ2V0X3RocmVhZF9udW0KKwkJPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBJTlRFR0VSIG50aHJlYWRzLCBleGVjdXRpbmdfdGhyZWFkCisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIG50aHJlYWRzLCBleGVjdXRpbmdfdGhyZWFkCisJCTwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIG50aHJlYWRzPTAKKyAgICAgICAgZXhlY3V0aW5nX3RocmVhZD0tMQorCishJG9tcCBwYXJhbGxlbAorCQk8b21wdHM6b3JwaGFuPgorCQk8b21wdHM6Y2hlY2s+CishJG9tcCBtYXN0ZXIKKwkJPC9vbXB0czpjaGVjaz4KKyEkb21wIGNyaXRpY2FsCisgICAgICAgIG50aHJlYWRzID0gbnRocmVhZHMgKyAxCishJG9tcCBlbmQgY3JpdGljYWwKKyAgICAgICAgZXhlY3V0aW5nX3RocmVhZD1vbXBfZ2V0X3RocmVhZF9udW0oKQorCQk8b21wdHM6Y2hlY2s+CishJG9tcCBlbmQgbWFzdGVyCisJCTwvb21wdHM6Y2hlY2s+CisJCTwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCAobnRocmVhZHMgLkVRLiAxKSAuQU5ELiAoZXhlY3V0aW5nX3RocmVhZCAuRVEuIDApICkgVEhFTgorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAxCisgICAgICAgIEVMU0UKKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorICAgICAgICBFTkQgSUYKKyAgICAgIEVORAorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9tYXN0ZXJfMy5mIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX21hc3Rlcl8zLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIyMmM0OAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9tYXN0ZXJfMy5mCkBAIC0wLDAgKzEsNDkgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIG1hc3RlciBkaXJlY3RpdmUgYnkgY291bnRpbmcgdXAgYSB2YXJpYWJsZSBpbiBhIG9tcCBtYXN0ZXIgc2VjdGlvbi4gSXQgYWxzbyBjaGVja3MgdGhhdCB0aGUgbWFzdGVyIHRocmVhZCBoYXMgdGhlIHRocmVhZCBudW1iZXIgMCBhcyBzcGVjaWZpZWQgaW4gdGhlIE9wZW5NUCBzdGFuZGFyZCB2ZXJzaW9uIDMuMC48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjMuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIG1hc3Rlcjwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBjcml0aWNhbDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX21hc3Rlcl8zPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIG9tcF9nZXRfdGhyZWFkX251bQorICAgICAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIElOVEVHRVIgbnRocmVhZHMsIGV4ZWN1dGluZ190aHJlYWQKKyAgICAgICAgSU5URUdFUiB0aWRfcmVzdWx0ICEgY291bnRzIHVwIHRoZSBudW1iZXIgb2Ygd3JvbmcgdGhyZWFkIG5vLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgISBmb3IgdGhlIG1hc3RlciB0aHJlYWQKKyAgICAgICAgQ09NTU9OIC9vcnBodmFycy8gbnRocmVhZHMsIGV4ZWN1dGluZ190aHJlYWQsIHRpZF9yZXN1bHQKKyAgICAgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgdGlkX3Jlc3VsdCA9IDAKKyAgICAgICAgbnRocmVhZHM9MAorICAgICAgICBleGVjdXRpbmdfdGhyZWFkPS0xCisKKyEkb21wIHBhcmFsbGVsCisgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgIDxvbXB0czpjaGVjaz4KKyEkb21wIG1hc3RlcgorICAgICAgICA8L29tcHRzOmNoZWNrPgorICAgICAgICBpZiAob21wX2dldF90aHJlYWRfbnVtKCkgLm5lLiAwKSB0aGVuCishJG9tcCBjcml0aWNhbAorICAgICAgICAgICAgdGlkX3Jlc3VsdCA9IHRpZF9yZXN1bHQgKyAxCishJG9tcCBlbmQgY3JpdGljYWwKKyAgICAgICAgZW5kIGlmCishJG9tcCBjcml0aWNhbAorICAgICAgICBudGhyZWFkcyA9IG50aHJlYWRzICsgMQorISRvbXAgZW5kIGNyaXRpY2FsCisgICAgICAgIGV4ZWN1dGluZ190aHJlYWQ9b21wX2dldF90aHJlYWRfbnVtKCkKKyAgICAgICAgPG9tcHRzOmNoZWNrPgorISRvbXAgZW5kIG1hc3RlcgorICAgICAgICA8L29tcHRzOmNoZWNrPgorICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGICggKG50aHJlYWRzIC5FUS4gMSkgLkFORC4gKGV4ZWN1dGluZ190aHJlYWQgLkVRLiAwKSAuQU5ELgorICAgICAmICAgICAgICh0aWRfcmVzdWx0IC5FUS4gMCkgKSBUSEVOCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgRUxTRQorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIEVORCBJRgorICAgICAgRU5ECis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgorCmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfbmVzdF9sb2NrLmYgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfbmVzdF9sb2NrLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI5ZTNhYQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9uZXN0X2xvY2suZgpAQCAtMCwwICsxLDU5IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcF9zZXRfbmVzdF9sb2NrIGFuZCB0aGUgb21wX3Vuc2V0X25lc3RfbG9jayBmdW5jdGlvbi48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wX25lc3RfbG9jazwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBmbHVzaDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX25lc3RfbG9jazwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyFyZXN1bHQgaXM6CishICAwIC0tIGlmIHRoZSB0ZXN0IGZhaWxzCishICAxIC0tIGlmIHRoZSB0ZXN0IHN1Y2NlZWRzCisgICAgICAgIElOVEVHRVIgcmVzdWx0CisgICAgICAgIElOVEVHRVIgbnJfdGhyZWFkc19pbl9zaW5nbGUKKyAgICAgICAgSU5URUdFUiBucl9pdGVyYXRpb25zCisgICAgICAgIElOVEVHRVIgaQorICAgICAgICAgICAgICAgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5DTFVERSAib21wX2xpYi5oIgorICAgICAgICBJTlRFR0VSIChLSU5EPU9NUF9ORVNUX0xPQ0tfS0lORCkgOjogbG9jaworICAgICAgICBDT01NT04gL29ycGh2YXJzLyBsb2NrCisgICAgICAgICAgICAgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5DTFVERSAib21wX3Rlc3RzdWl0ZS5mIgorCisgICAgICAgIG5yX2l0ZXJhdGlvbnM9MAorICAgICAgICBucl90aHJlYWRzX2luX3NpbmdsZT0wCisgICAgICAgIENBTEwgb21wX2luaXRfbmVzdF9sb2NrKGxvY2spCisgICAgICAgIHJlc3VsdD0wCisKKyEkb21wIHBhcmFsbGVsIHNoYXJlZChsb2NrLG5yX3RocmVhZHNfaW5fc2luZ2xlLG5yX2l0ZXJhdGlvbnMscmVzdWx0KQorISRvbXAgZG8KKyAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4KKyAgICAgICAgQ0FMTCBvbXBfc2V0X25lc3RfbG9jayhsb2NrKQorICAgICAgICAgICAgICAgIDwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgPC9vbXB0czpvcnBoYW4+CishJG9tcCBmbHVzaAorICAgICAgICBucl90aHJlYWRzX2luX3NpbmdsZT1ucl90aHJlYWRzX2luX3NpbmdsZSsxCishJG9tcCBmbHVzaAorICAgICAgICBucl9pdGVyYXRpb25zPW5yX2l0ZXJhdGlvbnMrMQorICAgICAgICBucl90aHJlYWRzX2luX3NpbmdsZT1ucl90aHJlYWRzX2luX3NpbmdsZS0xCisgICAgICAgIHJlc3VsdD1yZXN1bHQrbnJfdGhyZWFkc19pbl9zaW5nbGUKKyAgICAgICAgICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4KKyAgICAgICAgQ0FMTCBvbXBfdW5zZXRfbmVzdF9sb2NrKGxvY2spCisgICAgICAgICAgICAgICAgPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICAgIEVORCBETworISRvbXAgZW5kIGRvCishJG9tcCBlbmQgcGFyYWxsZWwKKyAgICAgIENBTEwgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrKGxvY2spCishICAgICAgICAgICAgICAgUFJJTlQgKiwgcmVzdWx0LCBucl9pdGVyYXRpb25zCisgICAgICAgIElGKHJlc3VsdC5FUS4wIC5BTkQuIG5yX2l0ZXJhdGlvbnMgLkVRLiBMT09QQ09VTlQpIFRIRU4KKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+PTEKKyAgICAgICAgRUxTRQorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT49MAorICAgICAgICBFTkQgSUYKKyAgICAgIEVORCBGVU5DVElPTgorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9uZXN0ZWQuZiBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9uZXN0ZWQuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDM1MTUxCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX25lc3RlZC5mCkBAIC0wLDAgKzEsNTMgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IGlmIHRoZSBjb21waWxlciBzdXBwb3J0IG5lc3RlZCBwYXJhbGxlbGlzbS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czp2ZXJzaW9uPjIuNTwvb21wdHM6dmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+bmVzdGVkdGVzdDwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBjcml0aWNhbDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX25lc3RlZDwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5DTFVERSAib21wX3Rlc3RzdWl0ZS5mIgorPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBJTlRFR0VSIGNvdW50ZXIKKyAgICAgICAgQ09NTU9OIC9vcnBodmFycy8gY291bnRlcgorPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgICAgICBjb3VudGVyID0wCisgICAgICAgIAorICAgICAgICA8b21wdHM6Y2hlY2s+CishJCAgICAgIENBTEwgT01QX1NFVF9ORVNURUQoLlRSVUUuKQorISNpZmRlZiBfT1BFTk1QCishICAgICAgIENBTEwgT01QX1NFVF9ORVNURUQoLlRSVUUuKSAKKyEjZW5kaWYKKyAgICAgICAgPC9vbXB0czpjaGVjaz4KKyAgICAgICAgPG9tcHRzOmNyb3NzY2hlY2s+CishJCAgICAgIENBTEwgT01QX1NFVF9ORVNURUQoLkZBTFNFLikKKyEjaWZkZWYgX09QRU5NUAorISAgICAgICBDQUxMIE9NUF9TRVRfTkVTVEVEKC5GQUxTRS4pCishI2VuZGlmCisgICAgICAgIDwvb21wdHM6Y3Jvc3NjaGVjaz4KKworISRvbXAgcGFyYWxsZWwKKyAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyEkb21wIGNyaXRpY2FsCisgICAgICAgICAgY291bnRlciA9IGNvdW50ZXIgKyAxCishJG9tcCBlbmQgY3JpdGljYWwKKworISRvbXAgcGFyYWxsZWwKKyEkb21wIGNyaXRpY2FsCisgICAgICAgICAgY291bnRlciA9IGNvdW50ZXIgLSAxCishJG9tcCBlbmQgY3JpdGljYWwKKyEkb21wIGVuZCBwYXJhbGxlbAorICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorICAgICAgICAKKyAgICAgICAgSUYgKGNvdW50ZXIgLkVRLiAwICkgVEhFTgorICAgICAgICAgICBXUklURSAoMSwqKSAiQ291bnRlciB3YXMgMCIKKyAgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKyAgICAgICAgRUxTRQorICAgICAgICAgICBXUklURSAoMSwqKSAiQ291bnRlciB3YXMiLCBjb3VudGVyCisgICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAxCisgICAgICAgIEVORCBJRiAKKyAgICAgIEVORCBGVU5DVElPTgorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9udW1fdGhyZWFkcy5mIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX251bV90aHJlYWRzLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFlZGU3MwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9udW1fdGhyZWFkcy5mCkBAIC0wLDAgKzEsNjAgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGF0IHRoZSBvbXBfZ2V0X251bV90aHJlYWRzIHJldHVybnMgdGhlIGNvcnJlY3QgbnVtYmVyIG9mIHRocmVhZHMuIFRoZXJlZm9yIGl0IGNvdW50cyB1cCBhIHZhcmlhYmxlIGluIGEgcGFyYWxsZWxpemVkIHNlY3Rpb24gYW5kIGNvbXBhcnMgdGhpcyB2YWx1ZSB3aXRoIHRoZSByZXN1bHQgb2YgdGhlIG9tcF9nZXRfbnVtX3RocmVhZHMgZnVuY3Rpb24uPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcF9nZXRfbnVtX3RocmVhZHM8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfbnVtX3RocmVhZHM8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOVEVHRVIgaSwgbWF4X3RocmVhZHMKKyAgICAgICAgSU5URUdFUiBvbXBfZ2V0X251bV90aHJlYWRzCis8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIElOVEVHRVIgZmFpbGVkLHRocmVhZHMsbnRocmVhZHMsdG1wCisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIGZhaWxlZCx0aHJlYWRzLG50aHJlYWRzCis8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgICAgIGZhaWxlZCA9IDAKKyAgICAgICAgbWF4X3RocmVhZHMgPSAwCisgICAgICAgICAKKyEkb21wIHBhcmFsbGVsCishJG9tcCBtYXN0ZXIKKyAgICAgICAgbWF4X3RocmVhZHMgPSBPTVBfR0VUX05VTV9USFJFQURTKCkgICAgICAgCishJG9tcCBlbmQgbWFzdGVyCishJG9tcCBlbmQgcGFyYWxsZWwKKyEgICAgICAgICBwcmludCAqLCAibWF4IHRocmVhZHM6IixtYXhfdGhyZWFkcworCishWWkgV2VuIGFkZGVkIG9tcF9TZXRfZHluYW1pY3MgaGVyZSB0byBtYWtlIHN1cmUgbnVtX3RocmVhZHMgY2xhdXNlIHdvcmsKKyFUaGFua3MgdG8gRHIuIFlpbiBNYSBpbiBBYnNvZnQuIHNob3VsZCBiZSBub3QgYmUgY2FsbGVkIGJlZm9yZSB0aGUgdGVzdCBsb29wCishYmVjYXVzZSBpdCBhbGxvd3MgdGhlIGR5bmFtaWMgYWRqdXN0bWVudCBvZiB0aGUgbnVtYmVyIG9mIHRocmVhZHMgYXQgcnVudGltZQorIWluc3RlYWQgb2YgdXNpbmcgdGhlIG1heF90aHJlYWRzIHNldC4gCisKKyAgICAgICAgIUNBTEwgT01QX1NFVF9EWU5BTUlDKC5UUlVFLikKKyAgICAgICAgRE8gdGhyZWFkcyA9IDEsIG1heF90aHJlYWRzCisgICAgICAgICAgbnRocmVhZHMgPSAwCisgICAgICAgICAgIDxvbXB0czpvcnBoYW4+CishJG9tcCBwYXJhbGxlbCBudW1fdGhyZWFkcyh0aHJlYWRzKSByZWR1Y3Rpb24oKzpmYWlsZWQpCishICAgICAgICAgIHByaW50ICosIHRocmVhZHMsIG9tcF9nZXRfbnVtX3RocmVhZHMoKQorICAgICAgICAgIHRtcCA9IG9tcF9nZXRfbnVtX3RocmVhZHMoKQorICAgICAgICAgIElGICggdGhyZWFkcyAuTkUuIHRtcCApIFRIRU4KKyAgICAgICAgICAgIGZhaWxlZCA9IGZhaWxlZCArIDEKKyAgICAgICAgICAgIFdSSVRFICgxLCopICJFcnJvcjogZm91bmQgIiwgdG1wLCAiIGluc3RlYWQgb2YgIiwKKyAgICAgJiAgICAgICAgICB0aHJlYWRzLCAiIHRocmVhZHMiCisgICAgICAgICAgRU5EIElGCishJG9tcCBhdG9taWMKKyAgICAgICAgICBudGhyZWFkcyA9IG50aHJlYWRzICsgMQorISRvbXAgZW5kIHBhcmFsbGVsCisgICAgICAgICAgPC9vbXB0czpvcnBoYW4+CishICAgICAgICAgICAgcHJpbnQgKiwgdGhyZWFkcywgbnRocmVhZHMKKyAgICAgICAgICA8b21wdHM6Y2hlY2s+SUYgKCBudGhyZWFkcyAuTkUuIHRocmVhZHMgKSBUSEVOPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICA8b21wdHM6Y3Jvc3NjaGVjaz5JRiAoIG50aHJlYWRzIC5FUS4gdGhyZWFkcyApIFRIRU48L29tcHRzOmNyb3NzY2hlY2s+CisgICAgICAgICAgICBmYWlsZWQgPSBmYWlsZWQgKyAxCisgICAgICAgICAgRU5EIElGCisgICAgICAgIEVORCBETworCisgICAgICAgIElGKGZhaWxlZCAuTkUuIDApIFRIRU4KKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorICAgICAgICBFTFNFCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgRU5EIElGCisgICAgICBFTkQgRlVOQ1RJT04KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfc2luZ2xlLmYgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfc2luZ2xlLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg4MjFjYQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9zaW5nbGUuZgpAQCAtMCwwICsxLDQwIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBzaW5nbGUgZGlyZWN0aXZlIGJ5IGNvbnRyb2xsaW5nIGhvdyBvZnRlbiBhIGRpcmVjdGl2ZSBpcyBjYWxsZWQgaW4gYW4gb21wIHNpbmdsZSByZWdpb24uPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBzaW5nbGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgcGFyYWxsZWwgcHJpdmF0ZSxvbXAgZmx1c2g8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9zaW5nbGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOVEVHRVIgaQorCQk8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIElOVEVHRVIgbnJfdGhyZWFkc19pbl9zaW5nbGUsbnJfaXRlcmF0aW9ucyxyZXN1bHQKKyAgICAgICAgQ09NTU9OIC9vcnBodmFycy8gbnJfdGhyZWFkc19pbl9zaW5nbGUsbnJfaXRlcmF0aW9ucyxyZXN1bHQKKwkJPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5DTFVERSAib21wX3Rlc3RzdWl0ZS5mIgorICAgICAgICBucl90aHJlYWRzX2luX3NpbmdsZT0wCisgICAgICAgIHJlc3VsdD0wCisgICAgICAgIG5yX2l0ZXJhdGlvbnM9MAorISRvbXAgcGFyYWxsZWwKKyAgICAgICAgRE8gaT0wLCBMT09QQ09VTlQtMQorCQk8b21wdHM6b3JwaGFuPgorISRvbXAgc2luZ2xlCishJG9tcCBmbHVzaAorICAgICAgICAgIG5yX3RocmVhZHNfaW5fc2luZ2xlID0gbnJfdGhyZWFkc19pbl9zaW5nbGUgKyAxCishJG9tcCBmbHVzaAorICAgICAgICAgIG5yX2l0ZXJhdGlvbnMgPSBucl9pdGVyYXRpb25zICsgMQorICAgICAgICAgIDxvbXB0czpjaGVjaz5ucl90aHJlYWRzX2luX3NpbmdsZSA9IG5yX3RocmVhZHNfaW5fc2luZ2xlIC0gMTwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgPG9tcHRzOmNyb3NzY2hlY2s+bnJfdGhyZWFkc19pbl9zaW5nbGUgPSBucl90aHJlYWRzX2luX3NpbmdsZSArIDE8L29tcHRzOmNyb3NzY2hlY2s+CisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgbnJfdGhyZWFkc19pbl9zaW5nbGUKKyEkb21wIGVuZCBzaW5nbGUKKwkJPC9vbXB0czpvcnBoYW4+CisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsCisgICAgICAgIElGICggcmVzdWx0IC5FUS4gMCAuQU5ELiBucl9pdGVyYXRpb25zIC5FUS4gTE9PUENPVU5UICkgVEhFTgorICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorICAgICAgICBFTFNFCisgICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIEVORCBJRgorICAgICAgRU5EIEZVTkNUSU9OCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX3Rhc2suZiBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF90YXNrLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjczZDdiMAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF90YXNrLmYKQEAgLTAsMCArMSw1MCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgdGFzayBkaXJlY3RpdmUuIFRoZSBpZGVhIG9mIHRoZSB0ZXN0cyBpcyB0byBnZW5lcmF0ZSBhIHNldCBvZiB0YXNrcyBpbiBhIHNpbmdsZSByZWdpb24uIFdlIGxldCBwYXVzZSB0aGUgdGFza3MgZ2VuZXJhdGVkIHNvIHRoYXQgb3RoZXIgdGhyZWFkcyBnZXQgc2hlZHVsZWQgdG8gdGhlIG5ld2x5IG9wZW5lZCB0YXNrcy48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjMuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHRhc2s8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgc2luZ2xlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOQ0xVREUgIm9tcF9teV9zbGVlcC5mIgorCisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3Rhc2s8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOQ0xVREUgIm9tcF90ZXN0c3VpdGUuZiIKKyAgICAgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBJTlRFR0VSIG9tcF9nZXRfbnVtX3RocmVhZHMsIG9tcF9nZXRfdGhyZWFkX251bQorICAgICAgICBFWFRFUk5BTCBteV9zbGVlcAorICAgICAgICBJTlRFR0VSIG15agorICAgICAgICBJTlRFR0VSIGksagorICAgICAgICBJTlRFR0VSIHRpZHMoTlVNX1RBU0tTKQorICAgICAgICBDT01NT04gL29ycGh2YXJzLyBqLHRpZHMKKyAgICAgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKyEkb21wIHBhcmFsbGVsIHByaXZhdGUobXlqKSBzaGFyZWQoaikKKyEkb21wIHNpbmdsZQorICAgICAgICBkbyBpPTEsIE5VTV9UQVNLUworICAgICAgICBqID0gaQorICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICBteWogPSBqCisgICAgICAgIDxvbXB0czpjaGVjaz4KKyEkb21wIHRhc2sKKyAgICAgICAgPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICBjYWxsIG15X3NsZWVwKFNMRUVQVElNRSkKKyAgICAgICAgICB0aWRzKG15aikgPSBvbXBfZ2V0X3RocmVhZF9udW0oKQorICAgICAgICA8b21wdHM6Y2hlY2s+CishJG9tcCBlbmQgdGFzaworICAgICAgICA8L29tcHRzOmNoZWNrPgorICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICAgICAgZW5kIGRvCishJG9tcCBlbmQgc2luZ2xlCishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorCisgICAgICAgICEgY2hlY2sgaWYgbW9yZSB0aGFuIG9uZSB0aHJlYWQgZXhlY3V0ZWQgdGhlIHRhc2tzLgorICAgICAgICBkbyBpPTEsIE5VTV9UQVNLUworICAgICAgICAgIGlmICh0aWRzKDEpIC5uZS4gdGlkcyhpKSkgdGhlbgorICAgICAgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgICBlbmQgaWYKKyAgICAgICAgZW5kIGRvCisKKyAgICAgIEVORCBGVU5DVElPTgorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF90YXNrX2ZpcnN0cHJpdmF0ZS5mIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX3Rhc2tfZmlyc3Rwcml2YXRlLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E3NzU5ZQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF90YXNrX2ZpcnN0cHJpdmF0ZS5mCkBAIC0wLDAgKzEsNTQgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgZmlyc3Rwcml2YXRlIGNsYXVzZSBvZiB0aGUgdGFzayBkaXJlY3RpdmUuIFdlIGNyZWF0ZSBhIHNldCBvZiB0YXNrcyBpbiBhIHNpbmdsZSByZWdpb24uIFdlIGRlZmluZXMgYSB2YXJpYWJsZSBuYW1lZCBzdW0gdW5lcXVhbCB6ZXJvIHdoaWNoIGdldHMgZGVjbGFyZWQgZmlyc3Rwcml2YXRlIGZvciBlYWNoIHRhc2suIE5vdyBlYWNoIHRhc2sgY2FsY3VhbHRlcyBhIHN1bSB1c2luZyB0aGlzIHByaXZhdGUgdmFyaWFibGUuIEJlZm9yZSBlYWNoIGNhbGN1YWxhdGlvbiBzdGVwIHdlIGludHJvZHVjZSBhIGZsdXNoIGNvbW1hbmQgc28gdGhhdCBtYXliZSB0aGUgcHJpdmF0ZSB2YXJpYWJlbCBnZXRzIGJhZC4gQXQgdGhlIGVuZCB3ZSBjaGVjayBpZiB0aGUgY2FsY3VsYXRlZCBzdW0gd2FzIHJpZ2h0Ljwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgdGFzayBmaXJzdHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgc2luZ2xlLG9tcCBjcml0aWNhbDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTkNMVURFICJvbXBfbXlfc2xlZXAuZiIKKworICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF90YXNrX2ZpcnN0cHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5DTFVERSAib21wX3Rlc3RzdWl0ZS5mIgorICAgICAgICBJTlRFR0VSIGosaQorICAgICAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIGV4dGVybmFsIG15X3NsZWVwCisgICAgICAgIElOVEVHRVIgbXlfc3VtCisgICAgICAgIElOVEVHRVIga25vd25fc3VtCisgICAgICAgIElOVEVHRVIgcnNsdAorICAgICAgICBDT01NT04gL29ycGh2YXJzLyBteV9zdW0sIGtub3duX3N1bSwgcnNsdAorICAgICAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgICAgIG15X3N1bSA9IDEyMzQKKyAgICAgICAga25vd25fc3VtID0gMTIzNCArIChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMgorCishJG9tcCBwYXJhbGxlbCBwcml2YXRlKGopCishJG9tcCBzaW5nbGUKKyAgICAgICAgZG8gaT0xLCBOVU1fVEFTS1MKKyAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyEkb21wIHRhc2sgPG9tcHRzOmNoZWNrPmZpcnN0cHJpdmF0ZShteV9zdW0pPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICBkbyBqID0gMCwgTE9PUENPVU5UCishJG9tcCBmbHVzaAorICAgICAgICAgICAgbXlfc3VtID0gbXlfc3VtICsgagorICAgICAgICAgIGVuZCBkbworCisgICAgICAgICAgISBjaGVjayBpZiBjYWxjdWxhdGVkIG15X3N1bSB3YXMgcmlnaHQKKyAgICAgICAgICBpZiAobXlfc3VtIC5uZS4ga25vd25fc3VtKSB0aGVuCishJG9tcCBjcml0aWNhbAorICAgICAgICAgICAgcnNsdCA9IHJzbHQgKyAxCishJG9tcCBlbmQgY3JpdGljYWwKKyAgICAgICAgICBlbmQgaWYKKyEkb21wIGVuZCB0YXNrCisgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgICAgICBlbmQgZG8KKyEkb21wIGVuZCBzaW5nbGUKKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIGlmIChyc2x0IC5lcS4gMCkgdGhlbgorICAgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKyAgICAgICAgZW5kIGlmCisKKyAgICAgIEVORCBGVU5DVElPTgorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF90YXNrX2lmLmYgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfdGFza19pZi5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0OWY0NTcKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfdGFza19pZi5mCkBAIC0wLDAgKzEsNDUgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgaWYgY2xhdXNlIG9mIHRoZSBvbXAgdGFzayBkaXJlY3RpdmUuIFRoZSBpZGVhciBvZiB0aGUgdGVzdHMgaXMgdG8gZ2VuZXJhdGUgYSB0YXNrcyBpbiBhIHNpbmdsZSByZWdpb24gYW5kIHBhdXNlIGl0IGltbWVkaWF0ZWx5LiBUaGUgcGFyZW50IHRocmVhZCBub3cgc2hhbGwgc2V0IGEgY291bnRlciB2YXJpYWJsZSB3aGljaCB0aGUgcGF1c2VkIHRhc2sgc2hhbGwgZXZhbHVhdGUgd2hlbiB3b2tlIHVwLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgdGFzayBpZjwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBzaW5nbGUsb21wIGZsdXNoPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOQ0xVREUgIm9tcF9teV9zbGVlcC5mIgorCisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3Rhc2tfaWY8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOQ0xVREUgIm9tcF90ZXN0c3VpdGUuZiIKKyAgICAgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBleHRlcm5hbCBteV9zbGVlcAorICAgICAgICBJTlRFR0VSIGR1bW15CisgICAgICAgIExPR0lDQUwgY29uZGl0aW9uX2ZhbHNlCisgICAgICAgIElOVEVHRVIgY250CisgICAgICAgIElOVEVHRVIgcnNsdAorICAgICAgICBDT01NT04gL29ycGh2YXJzLyBjb25kaXRpb25fZmFsc2UsIGNudCwgcnNsdAorICAgICAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgICAgIGNudCA9IDAKKyAgICAgICAgY29uZGl0aW9uX2ZhbHNlID0gKGR1bW15IC5lcS4gMzE0MTU5KQorCishJG9tcCBwYXJhbGxlbAorISRvbXAgc2luZ2xlCisgICAgICAgIDxvbXB0czpvcnBoYW4+CishJG9tcCB0YXNrIDxvbXB0czpjaGVjaz5pZiAoY29uZGl0aW9uX2ZhbHNlKTwvb21wdHM6Y2hlY2s+IHNoYXJlZChjbnQscnNsdCkKKyAgICAgICAgICBjYWxsIG15X3NsZWVwKFNMRUVQVElNRV9MT05HKQorISRvbXAgZmx1c2gKKyAgICAgICAgICBpZiAoY250IC5lcS4gMCkgdGhlbgorICAgICAgICAgICAgICByc2x0ID0gMQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgcnNsdCA9IDAKKyAgICAgICAgICBlbmQgaWYKKyEkb21wIGVuZCB0YXNrCisgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgICAgICBjbnQgPSAxCishJG9tcCBlbmQgc2luZ2xlCishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gcnNsdAorCisgICAgICBFTkQgRlVOQ1RJT04KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfdGFza19wcml2YXRlLmYgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfdGFza19wcml2YXRlLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU0NGJjNQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF90YXNrX3ByaXZhdGUuZgpAQCAtMCwwICsxLDU1IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIHByaXZhdGUgY2xhdXNlIG9mIHRoZSB0YXNrIGRpcmVjdGl2ZS4gV2UgY3JlYXRlIGEgc2V0IG9mIHRhc2tzIGluIGEgc2luZ2xlIHJlZ2lvbi4gV2UgZGVmaW5lcyBhIHZhcmlhYmxlIG5hbWVkIHN1bSB3aGljaCBnZXRzIGRlY2xhcmVkIHByaXZhdGUgZm9yIGVhY2ggdGFzay4gTm93IGVhY2ggdGFzayBjYWxjdWFsdGVzIGEgc3VtIHVzaW5nIHRoaXMgcHJpdmF0ZSB2YXJpYWJsZS4gQmVmb3JlIGVhY2ggY2FsY3VhbGF0aW9uIHN0ZXAgd2UgaW50cm9kdWNlIGEgZmx1c2ggY29tbWFuZCBzbyB0aGF0IG1heWJlIHRoZSBwcml2YXRlIHZhcmlhYmVsIGdldHMgYmFkLiBBdCB0aGUgZW5kIHdlIGNoZWNrIGlmIHRoZSBjYWxjdWxhdGVkIHN1bSB3YXMgcmlnaHQuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4zLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCB0YXNrIHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgc2luZ2xlLG9tcCBjcml0aWNhbDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTkNMVURFICJvbXBfbXlfc2xlZXAuZiIKKworICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF90YXNrX2ZpcnN0cHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5DTFVERSAib21wX3Rlc3RzdWl0ZS5mIgorICAgICAgICBJTlRFR0VSIGosaQorICAgICAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIGV4dGVybmFsIG15X3NsZWVwCisgICAgICAgIElOVEVHRVIgbXlfc3VtCisgICAgICAgIElOVEVHRVIga25vd25fc3VtCisgICAgICAgIElOVEVHRVIgcnNsdAorICAgICAgICBDT01NT04gL29ycGh2YXJzLyBteV9zdW0sIGtub3duX3N1bSwgcnNsdAorICAgICAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgICAgIG15X3N1bSA9IDAKKyAgICAgICAgcnNsdCA9IDAKKyAgICAgICAga25vd25fc3VtID0gKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyCisKKyEkb21wIHBhcmFsbGVsIHByaXZhdGUoaikKKyEkb21wIHNpbmdsZQorICAgICAgICBkbyBpPTEsIE5VTV9UQVNLUworICAgICAgICA8b21wdHM6b3JwaGFuPgorISRvbXAgdGFzayA8b21wdHM6Y2hlY2s+cHJpdmF0ZShteV9zdW0pPC9vbXB0czpjaGVjaz4gc2hhcmVkKHJzbHQsIGtub3duX3N1bSkKKyAgICAgICAgICA8b21wdHM6Y2hlY2s+bXlfc3VtID0gMDwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgZG8gaiA9IDAsIExPT1BDT1VOVAorICAgICAgICAgICAgbXlfc3VtID0gbXlfc3VtICsgagorICAgICAgICAgIGVuZCBkbworCisgICAgICAgICAgISBjaGVjayBpZiBjYWxjdWxhdGVkIG15X3N1bSB3YXMgcmlnaHQKKyAgICAgICAgICBpZiAobXlfc3VtIC5uZS4ga25vd25fc3VtKSB0aGVuCishJG9tcCBjcml0aWNhbAorICAgICAgICAgICAgcnNsdCA9IHJzbHQgKyAxCishJG9tcCBlbmQgY3JpdGljYWwKKyAgICAgICAgICBlbmQgaWYKKyEkb21wIGVuZCB0YXNrCisgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgICAgICBlbmQgZG8KKyEkb21wIGVuZCBzaW5nbGUKKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIGlmIChyc2x0IC5lcS4gMCkgdGhlbgorICAgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKyAgICAgICAgZW5kIGlmCisKKyAgICAgIEVORCBGVU5DVElPTgorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF90YXNrX3NoYXJlZC5mIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX3Rhc2tfc2hhcmVkLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg1NjRiMwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF90YXNrX3NoYXJlZC5mCkBAIC0wLDAgKzEsNDcgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj4gVGVzdCB0byBzZWUgaWYgaW1wbGllZCBzaGFyZWQgd29ya3MgY29ycmVjdGx5PC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4zLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCB0YXNrPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIHNpbmdsZSwgb21wIHRhc2sgZmlyc3Rwcml2YXRlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOQ0xVREUgIm9tcF9teV9zbGVlcC5mIgorCisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3Rhc2tfc2hhcmVkPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTkNMVURFICJvbXBfdGVzdHN1aXRlLmYiCisgICAgICAgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgZXh0ZXJuYWwgbXlfc2xlZXAKKyAgICAgICAgSU5URUdFUiBpCisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIGkKKyAgICAgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5URUdFUiByc2x0CisgICAgICAgIElOVEVHRVIgaworCisgICAgICAgIGkgPSAwCisgICAgICAgIGsgPSAwCisgICAgICAgIHJzbHQgPSAwCisKKyEkb21wIHBhcmFsbGVsIHByaXZhdGUoaykgc2hhcmVkKGkpCishJG9tcCBzaW5nbGUKKyAgICAgICAgZG8gaz0xLCBOVU1fVEFTS1MKKyAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyEkb21wIHRhc2sgPG9tcHRzOmNyb3NzY2hlY2s+Zmlyc3Rwcml2YXRlKGkpPC9vbXB0czpjcm9zc2NoZWNrPgorISRvbXArICAgICA8b21wdHM6Y2hlY2s+c2hhcmVkKGkpPC9vbXB0czpjaGVjaz4KKyEkb21wIGF0b21pYworICAgICAgICAgICAgaSA9IGkgKyAxCishJG9tcCBlbmQgdGFzaworICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICAgICAgZW5kIGRvCishJG9tcCBlbmQgc2luZ2xlCishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICByc2x0ID0gaQorICAgICAgICBpZiAocnNsdCAuZXEuIE5VTV9UQVNLUykgdGhlbgorICAgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKyAgICAgICAgZW5kIGlmCisKKyAgICAgIEVORCBGVU5DVElPTgorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF90YXNrX3VudGllZC5mIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX3Rhc2tfdW50aWVkLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU4ZTkzNQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF90YXNrX3VudGllZC5mCkBAIC0wLDAgKzEsNjMgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IGZvciB1bnRpZWQgY2xhdXNlLiBGaXJzdCBnZW5lcmF0ZSBhIHNldCBvZiB0YXNrcyBhbmQgcGF1c2UgaXQgaW1tZWRpYXRlbHkuIFRoZW4gd2UgcmVzdW1lIGhhbGYgb2YgdGhlbSBhbmQgY2hlY2sgd2hldGhlciB0aGV5IGFyZSBzY2hlZHVsZWQgYnkgZGlmZmVyZW50IHRocmVhZHM8L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjMuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHRhc2sgdW50aWVkPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIHRhc2t3YWl0PC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOQ0xVREUgIm9tcF9teV9zbGVlcC5mIgorCisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3Rhc2tfdW50aWVkPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTkNMVURFICJvbXBfdGVzdHN1aXRlLmYiCisgICAgICAgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgRVhURVJOQUwgbXlfc2xlZXAKKyAgICAgICAgSU5URUdFUiBvbXBfZ2V0X251bV90aHJlYWRzLCBvbXBfZ2V0X3RocmVhZF9udW0KKyAgICAgICAgSU5URUdFUiBteWoKKyAgICAgICAgSU5URUdFUiBpLGoKKyAgICAgICAgSU5URUdFUiBjbnQKKyAgICAgICAgSU5URUdFUiBzdGFydF90aWQoTlVNX1RBU0tTKQorICAgICAgICBJTlRFR0VSIGN1cnJlbnRfdGlkKE5VTV9UQVNLUykKKyAgICAgICAgQ09NTU9OIC9vcnBodmFycy8gaiwgY250LCBzdGFydF90aWQsIGN1cnJlbnRfdGlkCisgICAgICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICAgICAgY250ID0gMAorICAgICAgICBkbyBpID0gMSwgTlVNX1RBU0tTCisgICAgICAgICAgc3RhcnRfdGlkKGkpID0gMAorICAgICAgICAgIGN1cnJlbnRfdGlkKGkpID0gMAorICAgICAgICBlbmQgZG8KKworISRvbXAgcGFyYWxsZWwgcHJpdmF0ZShteWopIHNoYXJlZChqKQorISRvbXAgc2luZ2xlCisgICAgICAgIGRvIGk9MSwgTlVNX1RBU0tTCisgICAgICAgIGogPSBpCisgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgIG15aiA9IGoKKyEkb21wIHRhc2sgPG9tcHRzOmNoZWNrPnVudGllZDwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgY2FsbCBteV9zbGVlcChTTEVFUFRJTUUpCisgICAgICAgICAgc3RhcnRfdGlkKG15aikgPSBvbXBfZ2V0X3RocmVhZF9udW0oKQorISRvbXAgdGFza3dhaXQKKyAgICAgIDxvbXB0czpjaGVjaz5pZiAoTU9EKHN0YXJ0X3RpZChteWopLDIpIC5uZS4gMCkgdGhlbjwvb21wdHM6Y2hlY2s+CisgICAgICAgIGNhbGwgbXlfc2xlZXAoU0xFRVBUSU1FKQorICAgICAgICBjdXJyZW50X3RpZChteWopID0gb21wX2dldF90aHJlYWRfbnVtKCkKKyAgICAgIDxvbXB0czpjaGVjaz4KKyAgICAgICBlbHNlCisgICAgICAgIGN1cnJlbnRfdGlkKG15aikgPSBvbXBfZ2V0X3RocmVhZF9udW0oKQorICAgICAgIGVuZCBpZjwvb21wdHM6Y2hlY2s+CishJG9tcCBlbmQgdGFzaworICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICAgICAgZW5kIGRvCishJG9tcCBlbmQgc2luZ2xlCishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorCisgICAgICAgICEgY2hlY2sgaWYgYXQgbGVhc3Qgb25lIHVudGllZCB0YXNrIHN3aXRjaGVkIHRocmVhZHMKKyAgICAgICAgZG8gaT0xLCBOVU1fVEFTS1MKKyAgICAgICAgICBpZiAoY3VycmVudF90aWQoaSkgLm5lLiBzdGFydF90aWQoaSkpIHRoZW4KKyAgICAgICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAxCisgICAgICAgICAgZW5kIGlmCisgICAgICAgIGVuZCBkbworCisgICAgICBFTkQgRlVOQ1RJT04KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfdGFza3dhaXQuZiBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF90YXNrd2FpdC5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhYTk0YzQKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfdGFza3dhaXQuZgpAQCAtMCwwICsxLDgzIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCB0YXNrd2FpdCBkaXJlY3RpdmUuIEZpcnN0IHdlIGdlbmVyYXRlIGEgc2V0IG9mIHRhc2tzLCB3aGljaCBzZXQgdGhlIGVsZW1lbnRzIG9mIGFuIGFycmF5IHRvIGEgc3BlY2lmaWMgdmFsdWUuIFRoZW4gd2UgZG8gYSB0YXNrd2FpdCBhbmQgY2hlY2sgaWYgYWxsIHRhc2tzIGZpbmlzaGVkIG1lYW5pbmcgYWxsIGFycmF5IGVsZW1lbnRzIGNvbnRhaW4gdGhlIHJpZ2h0IHZhbHVlLiBUaGVuIHdlIGdlbmVyYXRlIGEgc2Vjb25kIHNldCBzZXR0aW5nIHRoZSBhcnJheSBlbGVtZW50cyB0byBhbm90aGVyIHZhbHVlLiBBZnRlciB0aGUgcGFyYWxsZWwgcmVnaW9uIHdlIGNoZWNrIGlmIGFsbCB0YXNrcyBvZiB0aGUgc2Vjb25kIHNldCBmaW5pc2hlZCBhbmQgd2VyZSBleGVjdXRlZCBhZnRlciB0aGUgdGFza3Mgb2YgdGhlIGZpcnN0IHNldC48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjMuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHRhc2t3YWl0PC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIHNpbmdsZSxvbXAgdGFzazwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTkNMVURFICJvbXBfbXlfc2xlZXAuZiIKKworICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF90YXNrd2FpdDwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5DTFVERSAib21wX3Rlc3RzdWl0ZS5mIgorICAgICAgICBJTlRFR0VSIHJlc3VsdDEsIHJlc3VsdDIKKyAgICAgICAgSU5URUdFUiBhcnJheShOVU1fVEFTS1MpCisgICAgICAgIElOVEVHRVIgaSwgbXlpCisgICAgICAgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgZXh0ZXJuYWwgbXlfc2xlZXAKKyAgICAgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgICAgICByZXN1bHQxID0gMAorICAgICAgICByZXN1bHQyID0gMAorCisgICAgICAgICEgZmlsbCBhcnJheQorICAgICAgICBkbyBpID0gMSwgTlVNX1RBU0tTCisgICAgICAgICAgYXJyYXkoaSkgPSAwCisgICAgICAgIGVuZCBkbworCishJG9tcCBwYXJhbGxlbCBzaGFyZWQoaSkgcHJpdmF0ZShteWkpCishJG9tcCBzaW5nbGUKKyAgICAgICAgZG8gaT0xLCBOVU1fVEFTS1MKKyAgICAgICAgICEgRmlyc3Qgd2UgaGF2ZSB0byBzdG9yZSB0aGUgdmFsdWUgb2YgdGhlIGxvb3AgaW5kZXggaW4gYSBuZXcgdmFyaWFibGUKKyAgICAgICAgICEgd2hpY2ggd2lsbCBiZSBwcml2YXRlIGZvciBlYWNoIHRhc2sgYmVjYXVzZSBvdGhlcndpc2UgaXQgd2lsbCBiZQorICAgICAgICAgISBvdmVyd3JpdHRlbiBpZiB0aGUgZXhlY3V0aW9uIG9mIHRoZSB0YXNrIHRha2VzIGxvbmdlciB0aGFuIHRoZSB0aW1lCisgICAgICAgICAhIHdoaWNoIGlzIG5lZWRlZCB0byBlbnRlciB0aGUgbmV4dCBzdGVwIG9mIHRoZSBsb29wIQorCisgICAgICAgICBteWkgPSBpCisKKyEkb21wIHRhc2sKKyAgICAgICAgICBjYWxsIG15X3NsZWVwKFNMRUVQVElNRSkKKyAgICAgICAgICBhcnJheShteWkpID0gMQorISRvbXAgZW5kIHRhc2sKKyAgICAgICAgZW5kIGRvCisKKyAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgPG9tcHRzOmNoZWNrPgorISRvbXAgdGFza3dhaXQKKyAgICAgICAgPC9vbXB0czpjaGVjaz4KKyAgICAgICAgPC9vbXB0czpvcnBoYW4+CisKKyAgICAgICAgISBjaGVjayBpZiBhbGwgdGFza3Mgd2VyZSBmaW5pc2hlZAorICAgICAgICBkbyBpPTEsIE5VTV9UQVNLUworICAgICAgICAgIGlmIChhcnJheShpKSAubmUuIDEpIHRoZW4KKyAgICAgICAgICAgICAgcmVzdWx0MSA9IHJlc3VsdDEgKyAxCisgICAgICAgICAgZW5kIGlmCisgICAgICAgIGVuZCBkbworCisgICAgICAgICEgZ2VuZXJhdGUgc29tZSBtb3JlIHRhc2tzIHdoaWNoIG5vdyBzaGFsbCBvdmVyd3JpdGUgdGhlIHZhbHVlc2luIHRoZQorICAgICAgICAhIGFycmF5CisgICAgICAgIGRvIGk9MSwgTlVNX1RBU0tTCisgICAgICAgICAgbXlpID0gaQorISRvbXAgdGFzaworICAgICAgICAgIGFycmF5KG15aSkgPSAyCishJG9tcCBlbmQgdGFzaworICAgICAgICBlbmQgZG8KKworISRvbXAgZW5kIHNpbmdsZQorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgISBmaW5hbCBjaGVjaywgaWYgYWxsIGFycmF5IGVsZW1lbnRzIGNvbnRhaW4gdGhlIHJpZ2h0IHZhbHVlcworICAgICAgICBkbyBpPTEsIE5VTV9UQVNLUworICAgICAgICAgIGlmIChhcnJheShpKSAubmUuIDIpIHRoZW4KKyAgICAgICAgICAgIHJlc3VsdDIgPSByZXN1bHQyICsgMQorICAgICAgICAgIGVuZCBpZgorICAgICAgICBlbmQgZG8KKworICAgICAgICBpZiAoIChyZXN1bHQxIC5lcS4gMCkgLmFuZC4gKHJlc3VsdDIgLmVxLiAwKSApIHRoZW4KKyAgICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAxCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIGVuZCBpZgorCisgICAgICBFTkQgRlVOQ1RJT04KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfdGVzdF9uZXN0X2xvY2suZiBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF90ZXN0X25lc3RfbG9jay5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzOTZkMjQKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfdGVzdF9uZXN0X2xvY2suZgpAQCAtMCwwICsxLDYxIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcF90ZXN0X25lc3RfbG9jayBmdW5jdGlvbi48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wX3Rlc3RfbmVzdF9sb2NrPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGZsdXNoPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfdGVzdF9uZXN0X2xvY2s8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOVEVHRVIgcmVzdWx0CishcmVzdWx0IGlzOgorISAgICAgIDAgLS0gaWYgdGhlIHRlc3QgZmFpbHMKKyEgICAgICAxIC0tIGlmIHRoZSB0ZXN0IHN1Y2NlZWRzCisgICAgICAgIElOVEVHRVIgbnJfdGhyZWFkc19pbl9zaW5nbGUKKyAgICAgICAgSU5URUdFUiBucl9pdGVyYXRpb25zCisgICAgICAgIElOVEVHRVIgaQorICAgICAgICAgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBpbmNsdWRlICJvbXBfbGliLmgiCisgICAgICAgIElOVEVHRVIgKEtJTkQ9T01QX05FU1RfTE9DS19LSU5EKSA6OiBsb2NrCisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIGxvY2sKKyAgICAgICAgICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CishICAgICAgICBJTlRFR0VSICBsY2sKKyAgICAgICAgSU5DTFVERSAib21wX3Rlc3RzdWl0ZS5mIgorCisgICAgICAgIG5yX2l0ZXJhdGlvbnM9MAorICAgICAgICBucl90aHJlYWRzX2luX3NpbmdsZT0wCisgICAgICAgIENBTEwgT01QX0lOSVRfTkVTVF9MT0NLKGxvY2spCisgICAgICAgIHJlc3VsdD0wCisKKyEkb21wIHBhcmFsbGVsIHNoYXJlZChsb2NrLG5yX3RocmVhZHNfaW5fc2luZ2xlLG5yX2l0ZXJhdGlvbnMscmVzdWx0KQorISRvbXAgZG8KKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgICAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4KKyAgICAgICAgICBETyBXSElMRShPTVBfVEVTVF9ORVNUX0xPQ0sobG9jaykgLkVRLiAwKQorICAgICAgICAgIEVORCBETworICAgICAgICAgICAgICAgICAgPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgICAgICAgIDwvb21wdHM6b3JwaGFuPgorISRvbXAgZmx1c2gKKyAgICAgICAgICBucl90aHJlYWRzX2luX3NpbmdsZT1ucl90aHJlYWRzX2luX3NpbmdsZSsxCishJG9tcCBmbHVzaAorICAgICAgICAgIG5yX2l0ZXJhdGlvbnM9bnJfaXRlcmF0aW9ucysxCisgICAgICAgICAgbnJfdGhyZWFkc19pbl9zaW5nbGU9bnJfdGhyZWFkc19pbl9zaW5nbGUtMQorICAgICAgICAgIHJlc3VsdD1yZXN1bHQrbnJfdGhyZWFkc19pbl9zaW5nbGUKKyAgICAgICAgICAgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgICAgICAgICAgICA8b21wdHM6Y2hlY2s+CisgICAgICAgICAgQ0FMTCBPTVBfVU5TRVRfTkVTVF9MT0NLKGxvY2spCisgICAgICAgICAgICAgICAgICA8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCishJG9tcCBlbmQgcGFyYWxsZWwKKyAgICAgICAgQ0FMTCBvbXBfZGVzdHJveV9uZXN0X2xvY2sobG9jaykKKyEgICAgICAgICAgICAgICBwcmludCAqLCByZXN1bHQsIG5yX2l0ZXJhdGlvbnMKKyAgICAgICAgSUYocmVzdWx0LkVRLjAgLkFORC4gbnJfaXRlcmF0aW9ucyAuRVEuIExPT1BDT1VOVCkgVEhFTgorICAgICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+PTEKKyAgICAgICAgRUxTRQorICAgICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+PTAKKyAgICAgICAgRU5ESUYKKyAgICAgIEVORCBGVU5DVElPTgorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF90ZXN0bG9jay5mIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX3Rlc3Rsb2NrLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IxMzA0ZAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF90ZXN0bG9jay5mCkBAIC0wLDAgKzEsNTcgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wX3Rlc3Rsb2NrIGZ1bmN0aW9uLiBUaGUgdGVzdCBjb3VudHMgdGhlIHRocmVhZHMgZW50ZXJpbmcgYW5kIGV4aXRpbmcgYSBzaW5nbGUgcmVnaW9uIHdoaWNoIGlzIGJ1aWxkIHdpdGggYSB0ZXN0X2xvY2sgaW4gYW4gZW5kbGVzcyBsb29wLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXBfdGVzdF9sb2NrPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGZsdXNoPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfdGVzdGxvY2s8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOVEVHRVIgcmVzdWx0CisgICAgICAgIElOVEVHRVIgbnJfdGhyZWFkc19pbl9zaW5nbGUKKyAgICAgICAgSU5URUdFUiBucl9pdGVyYXRpb25zCisgICAgICAgIElOVEVHRVIgaQorICAgICAgICAgICAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIGluY2x1ZGUgIm9tcF9saWIuaCIKKyAgICAgICAgSU5URUdFUiAoS0lORD1PTVBfTE9DS19LSU5EKTo6bG9jaworICAgICAgICBDT01NT04gL29ycGh2YXJzLyBsb2NrCisgICAgICAgICAgICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIElOQ0xVREUgIm9tcF90ZXN0c3VpdGUuZiIKKworICAgICAgICBucl9pdGVyYXRpb25zPTAKKyAgICAgICAgbnJfdGhyZWFkc19pbl9zaW5nbGU9MAorICAgICAgICBDQUxMIE9NUF9JTklUX0xPQ0sobG9jaykKKyAgICAgICAgcmVzdWx0PTAKKworISRvbXAgcGFyYWxsZWwgc2hhcmVkKGxvY2ssbnJfdGhyZWFkc19pbl9zaW5nbGUsbnJfaXRlcmF0aW9ucyxyZXN1bHQpCishJG9tcCBkbworICAgICAgICBETyBpPTEsTE9PUENPVU5UCisgICAgICAgICAgICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICAgICAgICAgICAgPG9tcHRzOmNoZWNrPgorICAgICAgICAgIERPIFdISUxFICguTk9ULiBPTVBfVEVTVF9MT0NLKGxvY2spKQorICAgICAgICAgIEVORCBETworICAgICAgICAgICAgICAgICAgPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgICAgICAgIDwvb21wdHM6b3JwaGFuPgorISRvbXAgZmx1c2gKKyAgICAgICAgICBucl90aHJlYWRzX2luX3NpbmdsZT1ucl90aHJlYWRzX2luX3NpbmdsZSsxCishJG9tcCBmbHVzaAorICAgICAgICAgIG5yX2l0ZXJhdGlvbnM9bnJfaXRlcmF0aW9ucysxCisgICAgICAgICAgbnJfdGhyZWFkc19pbl9zaW5nbGU9bnJfdGhyZWFkc19pbl9zaW5nbGUtMQorICAgICAgICAgIHJlc3VsdD1yZXN1bHQrbnJfdGhyZWFkc19pbl9zaW5nbGUKKyAgICAgICAgICAgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgICAgICAgICAgICA8b21wdHM6Y2hlY2s+CisgICAgICAgICAgQ0FMTCBPTVBfVU5TRVRfTE9DSyhsb2NrKQorICAgICAgICAgICAgICAgICAgPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworISRvbXAgZW5kIHBhcmFsbGVsCisgICAgICAgIENBTEwgT01QX0RFU1RST1lfTE9DSyhsb2NrKQorISAgICAgICAgICAgICAgIHByaW50ICosIHJlc3VsdCwgbnJfaXRlcmF0aW9ucworICAgICAgICBJRihyZXN1bHQuRVEuMCAuQU5ELiBucl9pdGVyYXRpb25zIC5FUS4gTE9PUENPVU5UKSBUSEVOCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPj0xCisgICAgICAgIEVMU0UKKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+PTAKKyAgICAgICAgRU5ESUYKKyAgICAgIEVORCBGVU5DVElPTgorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF90ZXN0c3VpdGUuZiBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF90ZXN0c3VpdGUuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmQ0ODIxCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX3Rlc3RzdWl0ZS5mCkBAIC0wLDAgKzEsMiBAQAorCWludGVnZXIgTE9PUENPVU5UCisJcGFyYW1ldGVyIChMT09QQ09VTlQ9MTAwMCkKZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF90aHJlYWRwcml2YXRlLmYgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfdGhyZWFkcHJpdmF0ZS5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5MjA0OTgKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfdGhyZWFkcHJpdmF0ZS5mCkBAIC0wLDAgKzEsODkgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHRocmVhZHByaXZhdGUgZGlyZWN0aXZlIGJ5IGZpbGxpbmcgYW4gYXJyYXkgd2l0aCByYW5kb20gbnVtYmVycyBpbiBhbiBwYXJhbGxlbGlzZWQgcmVnaW9uLiBFYWNoIHRocmVhZCBnZW5lcmF0ZXMgb25lIG51bWJlciBvZiB0aGUgYXJyYXkgYW5kIHNhdmVzIHRoaXMgaW4gYSB0ZW1wb3JhcnkgdGhyZWFkcHJpdmF0ZSB2YXJpYWJsZS4gSW4gYSBzZWNvbmQgcGFyYWxsZWxpc2VkIHJlZ2lvbiB0aGUgdGVzdCBjb250cm9scywgdGhhdCB0aGUgdGVtcG9yYXJ5IHZhcmlhYmxlIGNvbnRhaW5zIHN0aWxsIHRoZSBmb3JtZXIgdmFsdWUgYnkgY29tcGFyaW5nIGl0IHdpdGggdGhlIG9uZSBpbiB0aGUgYXJyYXkuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCB0aHJlYWRwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsLG9tcF9zZXRfZHluYW1pYyxvbXBfZ2V0X251bV90aHJlYWRzLG9tcCBtYXN0ZXI8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorIVlpIFdlbiBtb2RpZmllZCB0aGlzIGZ1bmN0aW9uIGZyb20gaGlzIG93biB1bmRlcnN0YW5kaW5nIG9mIHRoZSBzZW1hbnRpY3MKKyFvZiBDIHZlcnNpb24gYXQgMDUwNDIwMDQKKyFUaGUgdW5kZWVzdGFuZGluZyBpcyB0aGF0IHN1bTAgYW5kIG15dmFsdWUgY2FuIGJlIGxvY2FsIHN0YXRpYyB2YXJpYWJsZXMKKyFvZiB0aGUgY2hrX29tcF90aHJlYWRwcml2YXRlIGZ1bmN0aW9uLiBUaGVyZSBpcyBubyBuZWVkIHRvIHVzZSBjb21tb24KKyFibG9jaworICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF90aHJlYWRwcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIHN1bSwga25vd25fc3VtLCBpICwgaXRlciwgcmFuayxzaXplLCBmYWlsZWQKKyAgICAgICAgSU5URUdFUiBvbXBfZ2V0X251bV90aHJlYWRzLCBvbXBfZ2V0X3RocmVhZF9udW0KKyAgICAgICAgUkVBTCBteV9yYW5kb20KKyAgICAgICAgUkVBTCwgQUxMT0NBVEFCTEU6OiBkYXRhKDopCisgICAgICAgIElOVEVHRVIgcmFuZG9tX3NpemUKKyAgICAgICAgSU5UUklOU0lDIHJhbmRvbV9udW1iZXIKKyAgICAgICAgSU5UUklOU0lDIHJhbmRvbV9zZWVkCisgICAgICAgIEVYVEVSTkFMIG9tcF9zZXRfZHluYW1pYworCishWWkgV2VuIG1vZGlmaWVkIGF0IDA1MDQyMDA0IDogYWRkICJzYXZlIgorICAgICAgICBJTlRFR0VSLCBTQVZFOjogc3VtMAorICAgICAgICBSRUFMLCBTQVZFOjpteXZhbHVlCishWWkgV2VuIGNvbW1lbnRlZCB0d28gY29tbW9uIGJsb2NrcworIQljb21tb24vY3N1bTAvIHN1bTAKKyEJY29tbW9uL2NteXZhbHVlLyBteXZhbHVlCishISEhISEhISEhJG9tcCB0aHJlYWRwcml2YXRlKC9jc3VtMC8sL2NteXZhbHVlLykKKwkJPG9tcHRzOmNoZWNrPgorISRvbXAgdGhyZWFkcHJpdmF0ZShzdW0wLG15dmFsdWUpCisJCTwvb21wdHM6Y2hlY2s+CisgICAgICAgIElOQ0xVREUgIm9tcF90ZXN0c3VpdGUuZiIKKworICAgICAgICBzdW0gPSAwCisgICAgICAgIGZhaWxlZCA9IDAKKyAgICAgICAgc3VtMD0wCisgICAgICAgIG15dmFsdWU9MAorICAgICAgICByYW5kb21fc2l6ZT00NQorICAgICAgICBDQUxMIG9tcF9zZXRfZHluYW1pYyguRkFMU0UuKQorISRvbXAgcGFyYWxsZWwKKyAgICAgICAgc3VtMCA9IDAKKyEkb21wIGRvCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICAgc3VtMCA9IHN1bTAgKyBpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCishJG9tcCBjcml0aWNhbAorICAgICAgICBzdW0gPSBzdW0gKyBzdW0wCishJG9tcCBlbmQgY3JpdGljYWwKKyEkb21wIGVuZCBwYXJhbGxlbAorICAgICAgICBrbm93bl9zdW0gPSAoTE9PUENPVU5UKihMT09QQ09VTlQrMSkpLzIKKyAgICAgICAgSUYgKCBrbm93bl9zdW0gLk5FLiBzdW0gKSBUSEVOCisgICAgICAgICAgUFJJTlQgKiwgJyBrbm93bl9zdW0gPScsIGtub3duX3N1bSwgJywgc3VtID0nLHN1bQorICAgICAgICBFTkQgSUYKKworICAgICAgICBDQUxMIG9tcF9zZXRfZHluYW1pYyguRkFMU0UuKQorCishJG9tcCBwYXJhbGxlbAorISRvbXAgbWFzdGVyCisgICAgICAgIHNpemUgPSBvbXBfZ2V0X251bV90aHJlYWRzKCkKKyAgICAgICAgQUxMT0NBVEUgKCBkYXRhKHNpemUpICkKKyEkb21wIGVuZCBtYXN0ZXIKKyEkb21wIGVuZCBwYXJhbGxlbAorICAgICAgICBDQUxMIFJBTkRPTV9TRUVEKFNJWkU9cmFuZG9tX3NpemUpCisgICAgICAgIERPIGl0ZXIgPSAwLCA5OQorICAgICAgICAgIENBTEwgUkFORE9NX05VTUJFUihIQVJWRVNUPW15X3JhbmRvbSkKKyEkb21wIHBhcmFsbGVsIHByaXZhdGUocmFuaykKKyAgICAgICAgICByYW5rID0gb21wX2dldF90aHJlYWRfbnVtKCkrMQorICAgICAgICAgIG15dmFsdWUgPSBteV9yYW5kb20gKyByYW5rCisgICAgICAgICAgZGF0YShyYW5rKSA9IG15dmFsdWUKKyEkb21wIGVuZCBwYXJhbGxlbAorISRvbXAgcGFyYWxsZWwgcHJpdmF0ZShyYW5rKQorICAgICAgICAgIHJhbmsgPSBvbXBfZ2V0X3RocmVhZF9udW0oKSsxCisgICAgICAgICAgSUYgKCBteXZhbHVlIC5ORS4gZGF0YShyYW5rKSApIFRIRU4KKyAgICAgICAgICAgIGZhaWxlZCA9IGZhaWxlZCArIDEKKyAgICAgICAgICAgIFBSSU5UICosICcgbXl2YWx1ZSA9JyxteXZhbHVlLCcgZGF0YShyYW5rKT0nLCBkYXRhKHJhbmspCisgICAgICAgICAgRU5EIElGCishJG9tcCBlbmQgcGFyYWxsZWwKKyAgICAgICAgRU5EIERPCisgICAgICAgIERFQUxMT0NBVEUoIGRhdGEpCisgICAgICAgIElGICggKGtub3duX3N1bSAuRVEuIHN1bSkgLkFORC4gKGZhaWxlZCAuTkUuIDEpICkgVEhFTgorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAxCisgICAgICAgIGVsc2UKKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMCAKKyAgICAgICAgZW5kIGlmCisgICAgICBFTkQKKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfd29ya3NoYXJlLmYgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfd29ya3NoYXJlLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThmYWEyNwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF93b3Jrc2hhcmUuZgpAQCAtMCwwICsxLDE0MiBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIGlmIFdPUktTSEFSRSBpcyBwcmVzZW50Ljwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgd29ya3NoYXJlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorISBGdW5jdGlvbjogb21wX3dvcmtzaGFyZQorISAKKyEgYnkgQ2h1bmh1YSBMaWFvLCBVbml2ZXJzaXR5IG9mIEhvdXN0b24KKyEgT2N0LiAyMDA1IC0gRmlyc3QgdmVyc2lvbgorISAKKyEgVGhlIGlkZWEgZm9yIHRoZSB0ZXN0IGlzIHRoYXQgaWYgV09SS1NIQVJFIGlzIG5vdCBwcmVzZW50LAorISB0aGUgYXJyYXkgYXNzaWdubWVudCBpbiBQQVJBTExFTCByZWdpb24gd2lsbCBiZSBleGVjdXRlZCBieSBlYWNoIAorISB0aHJlYWQgYW5kIHRoZW4gd3JvbmdmdWxseSByZXBlYXRlZCBzZXZlcmFsIHRpbWVzLgorIQorISBUT0RPOkRvIHdlIG5lZWQgdGVzdCBmb3IgV0hFUkUgYW5kIEZPUkFMTD8KKyEgQSBzaW1wbGUgdGVzdCBmb3IgV0hFUkUgYW5kIEZPUkFMTCBpcyBhZGRlZCBieSBaaGVueWluZyBMaXUKKyEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3dvcmtzaGFyZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5URUdFUiByZXN1bHQsaQorICAgICAgICBJTlRFR0VSIHNjYWxhcjAyLHNjYWxhcjEyLHNjYWxhcjIyLHNjYWxhcjMyLGNvdW50CisgICAgICAgIFJFQUwsIERJTUVOU0lPTigxMDAwKTo6RkYKKzxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5URUdFUiBzY2FsYXIwLHNjYWxhcjEsc2NhbGFyMixzY2FsYXIzCisgICAgICAgIElOVEVHRVIsIERJTUVOU0lPTigxMDAwKTo6QUEsQkIsQ0MKKyAgICAgICAgUkVBTCwgRElNRU5TSU9OKDEwMDApOjpERAorICAgICAgICBDT01NT04gL29ycGh2YXJzLyBzY2FsYXIwLHNjYWxhcjEsc2NhbGFyMixzY2FsYXIzLAorICAgICAmICAgICAgQUEsQkIsQ0MsREQKKzwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICAgICAgcmVzdWx0PTAKKyAgICAgICAgc2NhbGFyMD0wCisgICAgICAgIHNjYWxhcjAyPTAKKyAgICAgICAgc2NhbGFyMT0wCisgICAgICAgIHNjYWxhcjEyPTAKKyAgICAgICAgc2NhbGFyMj0wCisgICAgICAgIHNjYWxhcjIyPTAKKyAgICAgICAgc2NhbGFyMz0wCisgICAgICAgIHNjYWxhcjMyPTAKKyAKKyAgICAgICAgY291bnQgPSAwCisKKyAgICAgICAgQUE9MAorICAgICAgICBCQj0wCisKKyAgICAgICAgZG8gaT0xLDEwMDAKKyAgICAgICAgICBDQyhpKSA9IGkKKyAgICAgICAgICBGRihpKSA9IDEuMC9pCisgICAgICAgIGVuZCBkbworCishJE9NUCBQQVJBTExFTAorPG9tcHRzOm9ycGhhbj4KKzxvbXB0czpjaGVjaz4hJE9NUCAgIFdPUktTSEFSRTwvb21wdHM6Y2hlY2s+CisKKyEgdGVzdCBpZiB3b3JrIGlzIGRpdmlkZWQgb3Igbm90IGZvciBhcnJheSBhc3NpZ25tZW50CisgICAgICAgIEFBPUFBKzEKKworISB0ZXN0IGlmIHNjYWxhciBhc3NpZ25tZW50IGlzIHRyZWF0ZWQgYXMgYSBzaW5nbGUgdW5pdCBvZiB3b3JrCisgICAgICAgIHNjYWxhcjA9c2NhbGFyMCsxIAorCishIHRlc3QgaWYgYXRvbWljIGlzIHRyZWF0ZWQgYXMgYSBzaW5nbGUgdW5pdCBvZiB3b3JrCishJE9NUCBBVE9NSUMKKyAgICAgICAgc2NhbGFyMT1zY2FsYXIxKzEgCishIHRlc3QgaWYgY3JpdGljYWwgaXMgdHJlYXRlZCBhcyBhIHNpbmdsZSB1bml0IG9mIHdvcmsKKyEkT01QIENSSVRJQ0FMCisgICAgICAgIHNjYWxhcjI9c2NhbGFyMisxCishJE9NUCBFTkQgQ1JJVElDQUwKKworISB0ZXN0IGlmIFBBUkFMTEVMIGlzIHRyZWF0ZWQgYXMgYSBzaW5nbGUgdW5pdCBvZiB3b3JrCishJE9NUCBQQVJBTExFTAorICAgICAgICBzY2FsYXIzPXNjYWxhcjMrMQorISRPTVAgRU5EIFBBUkFMTEVMCisKKyAgICAgICAgV0hFUkUgKCBDQyAubmUuIDAgKSBERCA9IDEuMC9DQworCisgICAgICAgIEZPUkFMTCAoST0xOjEwMDApIENDKGkpID0gLWkKKworPG9tcHRzOmNoZWNrPiEkT01QICAgRU5EIFdPUktTSEFSRTwvb21wdHM6Y2hlY2s+Cis8L29tcHRzOm9ycGhhbj4KKyEkT01QIEVORCBQQVJBTExFTAorCishc2VxdWVudGlhbCBlcXVpdmFsZW50IHN0YXRlbWVudHMgZm9yIGNvbXBhcmlzb24gCisgICAgICAgQkI9QkIrMQorICAgICAgIHNjYWxhcjAyPXNjYWxhcjAyKzEKKyAgICAgICBzY2FsYXIxMj1zY2FsYXIxMisxCisgICAgICAgc2NhbGFyMjI9c2NhbGFyMjIrMQorICAgICAgIHNjYWxhcjMyPXNjYWxhcjMyKzEKKworISAgICAgIHdyaXRlICgxLCopICJjazpzdW0gb2YgQUEgaXMiLFNVTShBQSksIiBzdW0gb2YgQkIgaXMgIixzdW0oQkIpCisgICAgICAgaWYgKFNVTShBQSkvPVNVTShCQikpIHRoZW4KKyAgICAgICAgICAgIHdyaXRlKDEsKikgIkFycmF5IGFzc2lnbm1lbnQgaGFzIHNvbWUgcHJvYmxlbSIKKyAgICAgICAgICAgIHJlc3VsdD1yZXN1bHQgKzEKKyAgICAgICBlbmRpZgorICAgICAgIGlmIChzY2FsYXIwLz1zY2FsYXIwMikgdGhlbgorICAgICAgICAgIHdyaXRlKDEsKikgIlNjYWxhciBhc3NpZ25tZW50IGhhcyBzb21lIHByb2JsZW0iCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsxCisgICAgICAgZW5kaWYKKyAgICAgICBpZiAoc2NhbGFyMS89c2NhbGFyMTIpIHRoZW4KKyAgICAgICAgICB3cml0ZSgxLCopICJBdG9taWMgaW5zaWRlIFdPUktTSEFSRSBoYXMgc29tZSBwcm9ibGVtIgorICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsxCisgICAgICAgZW5kaWYKKyAgICAgICBpZiAoc2NhbGFyMi89c2NhbGFyMjIpIHRoZW4KKyAgICAgICAgICB3cml0ZSgxLCopICJDUklUSUNBTCBpbnNpZGUgV09SS1NIQVJFIGhhcyBzb21lIHByb2JsZW0iCisgICAgICAgICByZXN1bHQgPSByZXN1bHQgKzEKKyAgICAgICBlbmRpZgorICAgICAgIGlmIChzY2FsYXIzLz1zY2FsYXIzMikgdGhlbgorICAgICAgICAgICB3cml0ZSgxLCopICJQQVJBTExFTCBpbnNpZGUgV09SS1NIQVJFIGhhcyBzb21lIHByb2JsZW0iCisgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArMQorICAgICAgIGVuZGlmCisgICAgICAgZG8gaT0xLDEwMDAKKyAgICAgICAgIGlmICggYWJzKCBERChpKS0gRkYoaSkpIC5ndC4gMS4wRS00ICkgdGhlbgorCSAgICBjb3VudCA9IGNvdW50ICsgMQorICAgICAgICAgZW5kIGlmCisgICAgICAgZW5kIGRvCisgICAgICAgaWYgKCBjb3VudCAubmUuIDAgKSB0aGVuCisgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICAgd3JpdGUoMSwqKSAiV0hFUkUgaGFzIHNvbWUgcHJvYmxlbSIKKyAgICAgICBlbmQgaWYKKworICAgICAgIGNvdW50ID0gMAorICAgICAgIGRvIGk9MSwxMDAwCisgICAgICAgICBpZiAoIENDKGkpIC5uZS4gLWkgKSB0aGVuCisgICAgICAgICAgICBjb3VudCA9IGNvdW50ICsgMQorICAgICAgICAgZW5kIGlmCisgICAgICAgZW5kIGRvCisgICAgICAgaWYgKCBjb3VudCAubmUuIDAgKSB0aGVuCisgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICAgd3JpdGUoMSwqKSAiRk9SQUxMIGhhcyBzb21lIHByb2JsZW0iCisgICAgICAgZW5kIGlmCisKKworIWlmIGFueXRoaW5nIGlzIHdyb25nLCBzZXQgcmV0dXJuIHZhbHVlIHRvIDAKKyAgICAgICBpZiAocmVzdWx0PT0wKSB0aGVuCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICBlbHNlCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKyAgICAgICBlbmQgaWYKKyAgICAgICBlbmQKKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfd29ya3NoYXJlX2RlZmF1bHQuZiBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF93b3Jrc2hhcmVfZGVmYXVsdC5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3NzRjNDMKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfd29ya3NoYXJlX2RlZmF1bHQuZgpAQCAtMCwwICsxLDM2IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBtYXN0ZXIgZGlyZWN0aXZlIGJ5IGNvdW50aW5nIHVwIGEgdmFyaWFibGUgaW4gYSBvbXAgbWFzdGVyIHNlY3Rpb24uPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCB3b3Jrc2hhcmUgZGVmYXVsdDwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBjcml0aWNhbDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3dvcmtzaGFyZV9kZWZhdWx0PC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIHN1bQorICAgICAgICBJTlRFR0VSIGtub3duX3N1bQorICAgICAgICBJTlRFR0VSIG15c3VtCisgICAgICAgIElOVEVHRVIgaQorCisgICAgICAgIGtub3duX3N1bSA9IDk5OSoxMDAwLzIKKworISRvbXAgcGFyYWxsZWwgZGVmYXVsdChwcml2YXRlKSBzaGFyZWQoc3VtKQorISRvbXAgZG8gCisgICAgICAgIERPIGkgPSAxLCA5OTkKKyAgICAgICAgICAgbXlzdW0gPSBteXN1bSArIGkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8gCisKKyEkb21wIGNyaXRpY2FsCisgICAgICAgIHN1bSA9IHN1bSArIG15c3VtCishJG9tcCBlbmQgY3JpdGljYWwKKworISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCAoa25vd25fc3VtIC5FUS4gc3VtKSApIFRIRU4KKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorICAgICAgICBFTFNFCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKyAgICAgICAgRU5EIElGCisgICAgICBFTkQKKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfd3RpbWUuZiBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF93dGltZS5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NzMzNGYKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfd3RpbWUuZgpAQCAtMCwwICsxLDQzIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcF9nZXRfd3RpbWUgZnVuY3Rpb24uIEl0IGNvbXBhcmVzIHRoZSB0aW1lIHdpdGggd2hpY2ggaXMgY2FsbGVkIGEgc2xlZXAgZnVuY3Rpb24gd2l0aCB0aGUgdGltZSBpdCB0b29rIGJ5IG1lc3N1cmluZyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBjYWxsIG9mIHRoZSBzbGVlcCBmdW5jdGlvbiBhbmQgaXRzIGVuZC48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wX2dldF93dGltZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOnRlc3Rjb2RlPgorICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF93dGltZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBET1VCTEUgUFJFQ0lTSU9OIHN0YXJ0CisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gZW5kdGltZQorICAgICAgICBDT01NT04gc3RhcnQsIGVuZHRpbWUKKyAgICAgICAgaW5jbHVkZSAib21wX2xpYi5oIgorICAgICAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBJTlRFR0VSIHdhaXRfdGltZQorICAgICAgICBET1VCTEUgUFJFQ0lTSU9OIG1lYXN1cmVkX3RpbWUKKyAgICAgICAgSU5URUdFUiBmaWxldW5pdAorICAgICAgICB3YWl0X3RpbWU9MQorCisgICAgICAgIHN0YXJ0ID0gMDsKKyAgICAgICAgZW5kdGltZSA9IDA7CisKKyAgICAgICAgICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4KKyAgICAgICAgc3RhcnQ9b21wX2dldF93dGltZSgpCisgICAgICAgICAgICAgICAgPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICAgICAgQ0FMTCBzbGVlcCh3YWl0X3RpbWUpCisgICAgICAgICAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgICAgICAgICA8b21wdHM6Y2hlY2s+CisgICAgICAgIGVuZHRpbWU9b21wX2dldF93dGltZSgpCisgICAgICAgICAgICAgICAgPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICAgICAgbWVhc3VyZWRfdGltZT1lbmR0aW1lLXN0YXJ0CisgICAgICAgIFdSSVRFKDEsKikgIndvcmsgdG9vayIsbWVhc3VyZWRfdGltZSwic2VjLiB0aW1lLiIKKyAgICAgICAgSUYobWVhc3VyZWRfdGltZS5HVC4wLjk5KndhaXRfdGltZSAuQU5ELgorICAgICAmIG1lYXN1cmVkX3RpbWUgLkxULiAxLjAxKndhaXRfdGltZSkgVEhFTgorICAgICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+PTEKKyAgICAgICAgRUxTRQorICAgICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+PTAKKyAgICAgICAgRU5EIElGCisgICAgICBFTkQKKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9wYXJfZG9fZmlyc3Rwcml2YXRlLmYgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9wYXJfZG9fZmlyc3Rwcml2YXRlLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzlhZTUyNwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL3Bhcl9kb19maXJzdHByaXZhdGUuZgpAQCAtMCwwICsxLDI2IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBwYXJhbGxlbCBkbyBmaXJzdHByaXZhdGUgZGlyZWN0aXZlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgZm9yIGZpcnN0cHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPnBhciBkbyByZWR1Y3Rpb24scGFyIGRvIHByaXZhdGU8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPnBhcl9kb19maXJzdHByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOVEVHRVIgc3VtLGtub3duX3N1bSwgaTIsIGkKKyAgICAgICAgSU5DTFVERSAib21wX3Rlc3RzdWl0ZS5mIgorICAgICAgICBzdW0gPTAKKyAgICAgICAgaTIgPSAzCishJG9tcCBwYXJhbGxlbCBkbyA8b21wdHM6Y2hlY2s+Zmlyc3Rwcml2YXRlKGkyKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+cHJpdmF0ZShpMik8L29tcHRzOmNyb3NzY2hlY2s+IHJlZHVjdGlvbigrOnN1bSkKKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgICBzdW0gPSBzdW0gKyAoIGkrIGkyKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBkbworICAgICAgICBrbm93bl9zdW0gPSAoTE9PUENPVU5UKihMT09QQ09VTlQrMSkpLzIrMypMT09QQ09VTlQKKyAgICAgICAgSUYgKCBrbm93bl9zdW0gLkVRLiBzdW0gKSBUSEVOCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgRUxTRQorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIEVORCBJRgorICAgICAgRU5ECis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vcGFyX2RvX2lmLmYgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9wYXJfZG9faWYuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjdmYzlhCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vcGFyX2RvX2lmLmYKQEAgLTAsMCArMSwzMiBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgcGFyYWxsZWwgZm9yIGlmIGRpcmVjdGl2ZS4gTmVlZHMgYXQgbGVhc3QgdHdvIHRocmVhZHMuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBwYXJhbGxlbCBkbyBpZjwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPjwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+cGFyX2RvX2lmPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIG9tcF9nZXRfbnVtX3RocmVhZHMKKyAgICAgICAgSU5URUdFUiBzdW0sa25vd25fc3VtLCBpLCBudW1fdGhyZWFkcworICAgICAgICBJTlRFR0VSIGNvbnRyb2wKKyAgICAgICAgSU5DTFVERSAib21wX3Rlc3RzdWl0ZS5mIgorICAgICAgICBzdW0gPSAwCisKKyAgICAgICAgY29udHJvbCA9IDAKKyEkb21wIHBhcmFsbGVsIGRvIDxvbXB0czpjaGVjaz5pZiAoY29udHJvbCA9PSAxKTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICAgc3VtID0gc3VtICsgaQorICAgICAgICAgIG51bV90aHJlYWRzID0gb21wX2dldF9udW1fdGhyZWFkcyAoKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBkbworICAgICAgICBXUklURSAoMSwqKSAiTnVtYmVyIG9mIHRocmVhZHMgZGV0ZXJtaW5lZCBieToiXAorICAgICAgICAgICAgICAgICAgICAib21nX2dldF9udW1fdGhyZWFzZDoiLCBudW1fdGhyZWFkcworICAgICAgICBrbm93bl9zdW0gPSAoTE9PUENPVU5UKihMT09QQ09VTlQrMSkpLzIKKyAgICAgICAgSUYgKCBrbm93bl9zdW0gLkVRLiBzdW0gLkFORC4gbnVtX3RocmVhZHMgLkVRLiAxKSBUSEVOCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgRUxTRQorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIEVORCBJRgorICAgICAgRU5ECis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vcGFyX2RvX2xhc3Rwcml2YXRlLmYgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9wYXJfZG9fbGFzdHByaXZhdGUuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODAyMTBjCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vcGFyX2RvX2xhc3Rwcml2YXRlLmYKQEAgLTAsMCArMSwyOCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgcGFyYWxsZWwgZG8gbGFzdHByaXZhdGUgZGlyZWN0aXZlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgZG8gbGFzdHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5wYXIgZG8gcmVkdWN0aW9uLCBwYXIgZG8gcHJpdmF0ZTwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+cGFyX2RvX2xhc3Rwcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIHN1bSwga25vd25fc3VtLCBpICwgaTAKKyAgICAgICAgSU5DTFVERSAib21wX3Rlc3RzdWl0ZS5mIgorICAgICAgICBzdW0gPSAwCisgICAgICAgIGkwID0gLTEKKworISRvbXAgcGFyYWxsZWwgZG8gcmVkdWN0aW9uKCs6c3VtKSBzY2hlZHVsZShzdGF0aWMsNykgPG9tcHRzOmNoZWNrPmxhc3Rwcml2YXRlKGkwKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+cHJpdmF0ZShpMCk8L29tcHRzOmNyb3NzY2hlY2s+CisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICAgc3VtID0gc3VtICsgaQorICAgICAgICAgIGkwID0gaQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBkbworICAgICAgICBrbm93bl9zdW0gPSAoTE9PUENPVU5UKihMT09QQ09VTlQrMSkpLzIKKyAgICAgICAgSUYgKCAoa25vd25fc3VtIC5FUS4gc3VtKSAuQU5ELiAoaTAgLkVRLiBMT09QQ09VTlQpICkgVEhFTgorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAxCisgICAgICAgIEVMU0UKKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorICAgICAgICBFTkQgSUYKKyAgICAgIEVORCAgIAorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL3Bhcl9kb19vcmRlcmVkLmYgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9wYXJfZG9fb3JkZXJlZC5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzZDRjZDAKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9wYXJfZG9fb3JkZXJlZC5mCkBAIC0wLDAgKzEsNjcgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHBhcmFsbGVsIGRvIG9yZGVyZWQgZGlyZWN0aXZlPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBwYXJhbGxlbCBkbyBvcmRlcmVkPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+cGFyIHNjaGVkdWxlIHN0YXQ8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCishIEhlbHBlciBmdW5jdGlvbiBpc19sYXJnZXIKKyEgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgSU5URUdFUiBGVU5DVElPTiBpX2lzbGFyZ2VyMihpKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOVEVHRVIgaQorICAgICAgICBJTlRFR0VSIGxhc3RfaSxpc2xhcmdlcgorICAgICAgICBDT01NT04gL2NvbS8gbGFzdF9pCisgICAgICAgIElOQ0xVREUgIm9tcF90ZXN0c3VpdGUuZiIKKyEgICAgICAgIHByaW50ICosICJsYXN0X2kiLGxhc3RfaSwgImkiLCBpCishIGxhc3RfaSBpcyBhIGdsb2JhbCB2YXJpYWJsZQorICAgICAgICBJRiAoIGkgLkdULiBsYXN0X2kgKSBUSEVOCisgICAgICAgICAgaXNsYXJnZXIgPSAxCisgICAgICAgIEVMU0UKKyAgICAgICAgICBpc2xhcmdlciA9IDAKKyAgICAgICAgRU5EIElGCisgICAgICAgIGxhc3RfaSA9IGkKKyAgICAgICAgaV9pc2xhcmdlcjIgPSBpc2xhcmdlcgorICAgICAgRU5EIEZVTkNUSU9OCisKKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5wYXJfZG9fb3JkZXJlZDwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgQ09NTU9OIC9jb20vIGxhc3RfaQorICAgICAgICBJTlRFR0VSIGtub3duX3N1bSxpLCBsYXN0X2kKKzxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5URUdFUiBpc19sYXJnZXIsc3VtLGlfaXNsYXJnZXIyCisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIGlzX2xhcmdlcixzdW0saQorPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgCisgICAgICAgIHN1bT0wCisgICAgICAgIGlzX2xhcmdlcj0xCisgICAgICAgIGxhc3RfaT0wCishJG9tcCBwYXJhbGxlbCBkbyBzY2hlZHVsZShzdGF0aWMsIDEpIG9yZGVyZWQKKyAgICAgICAgRE8gaT0xLCA5OQorICAgICAgICAgICAgICAgIDxvbXB0czpvcnBoYW4+CisJCTxvbXB0czpjaGVjaz4KKyEkb21wIG9yZGVyZWQKKwkJPC9vbXB0czpjaGVjaz4KKyAgICAgICAgSUYoIGlfaXNsYXJnZXIyKGkpIC5FUS4gMSAuQU5ELiBpc19sYXJnZXIgLkVRLiAxICkgVEhFTiAgCisgICAgICAgICAgaXNfbGFyZ2VyID0gMQorICAgICAgICBFTFNFCisgICAgICAgICAgaXNfbGFyZ2VyID0gMAorICAgICAgICBFTkQgSUYKKyAgICAgICAgc3VtID0gc3VtICsgaQorCQk8b21wdHM6Y2hlY2s+CishJG9tcCBlbmQgb3JkZXJlZAorCQk8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBkbworICAgICAgICBrbm93bl9zdW0gPSAoOTkqMTAwKS8yCishWWkgV2VuOyBTdW4gY29tcGlsZXIgd2lsbCBmYWlsIHNvbWV0aW1lcworISAgICAgICAgcHJpbnQgKiwgInN1bSIsIHN1bSwgImtzIiwga25vd25fc3VtLCAibGEiLCBpc19sYXJnZXIKKyAgICAgICAgSUYgKCBrbm93bl9zdW0gLkVRLiBzdW0gLkFORC4gaXNfbGFyZ2VyIC5FUS4gMSApIFRIRU4KKyAgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgRUxTRQorICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorICAgICAgICBFTkQgSUYKKyAgICAgIEVORCBGVU5DVElPTgorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL3Bhcl9kb19wcml2YXRlLmYgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9wYXJfZG9fcHJpdmF0ZS5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkMzlhYjkKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9wYXJfZG9fcHJpdmF0ZS5mCkBAIC0wLDAgKzEsNDYgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHBhcmFsbGVsIGRvIHByaXZhdGUgZGlyZWN0aXZlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgZG8gcHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPnBhciBkbyByZWR1Y3Rpb24sb21wIGZsdXNoPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIFNVQlJPVVRJTkUgZG9fc29tZV93b3JrMigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgUkVBTCBpCisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gc3VtCisgICAgICAgIElOVFJJTlNJQyBzcXJ0CisgICAgICAgIElOQ0xVREUgIm9tcF90ZXN0c3VpdGUuZiIKKyAgICAgICAgc3VtID0gMC4wCisgICAgICAgIGkgPSAwCisgICAgICAgIERPIFdISUxFIChpIDwgTE9PUENPVU5UKQorICAgICAgICAgICBzdW0gPSBzdW0gKyBzcXJ0KGkpCisgICAgICAgICAgIGkgPSBpICsgMQorICAgICAgICBFTkQgRE8KKyAgICAgIEVORAorCishKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPnBhcl9kb19wcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIHN1bSxrbm93bl9zdW0sIGksIGkyLCBpMworICAgICAgICBJTkNMVURFICJvbXBfdGVzdHN1aXRlLmYiCisgICAgICAgIHN1bSA9IDAKKworISRvbXAgcGFyYWxsZWwgZG8gcmVkdWN0aW9uKCs6c3VtKSA8b21wdHM6Y2hlY2s+cHJpdmF0ZShpMik8L29tcHRzOmNoZWNrPiBzY2hlZHVsZShzdGF0aWMsMSkKKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgICBpMiA9IGkKKyEkb21wIGZsdXNoCisgICAgICAgICAgQ0FMTCBkb19zb21lX3dvcmsyKCkKKyEkb21wIGZsdXNoCisgICAgICAgICAgc3VtID0gc3VtICsgaTIKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgZG8KKyAgICAgICAgICBrbm93bl9zdW0gPSAoTE9PUENPVU5UKihMT09QQ09VTlQrMSkpLzIKKyAgICAgICAgSUYgKCBrbm93bl9zdW0gLkVRLiBzdW0gKSBUSEVOCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgRUxTRQorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIEVORCBJRgorICAgICAgRU5ECis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vcGFyX2RvX3JlZHVjdGlvbi5mIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vcGFyX2RvX3JlZHVjdGlvbi5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhM2Y0NTUKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9wYXJfZG9fcmVkdWN0aW9uLmYKQEAgLTAsMCArMSw0MTUgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHBhcmFsbGVsIGRvIHJlZHVjdGlvbiBkaXJlY3RpdmUgd2l0aCBhbGwgaXRzIG9wdGlvbnMuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBwYXJhbGxlbCBkbyByZWR1Y3Rpb248L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5wYXJfZG9fcmVkdWN0aW9uPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIHN1bSwgc3VtMiwga25vd25fc3VtLCBpLCBpMixkaWZmCisgICAgICAgIElOVEVHRVIgcHJvZHVjdCxrbm93bl9wcm9kdWN0LGludF9jb25zdAorICAgICAgICBJTlRFR0VSIE1BWF9GQUNUT1IKKyAgICAgICAgRE9VQkxFIFBSRUNJU0lPTiBkc3VtLGRrbm93bl9zdW0sZHQsZHB0CisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gcm91bmRpbmdfZXJyb3IsIGRkaWZmCisgICAgICAgIElOVEVHRVIgZG91YmxlX0RJR0lUUworICAgICAgICBMT0dJQ0FMIGxvZ2ljX2FuZCwgbG9naWNfb3IsIGxvZ2ljX2Vxdixsb2dpY19uZXF2CisgICAgICAgIElOVEVHRVIgYml0X2FuZCwgYml0X29yCisgICAgICAgIElOVEVHRVIgZXhjbHVzaXZfYml0X29yCisgICAgICAgIElOVEVHRVIgbWluX3ZhbHVlLCBtYXhfdmFsdWUKKyAgICAgICAgRE9VQkxFIFBSRUNJU0lPTiBkbWluLCBkbWF4CisgICAgICAgIElOVEVHRVIgcmVzdWx0CisgICAgICAgIElOQ0xVREUgIm9tcF90ZXN0c3VpdGUuZiIKKyAgICAgICAgTE9HSUNBTCBsb2dpY3MoTE9PUENPVU5UKQorICAgICAgICBJTlRFR0VSIGludF9hcnJheShMT09QQ09VTlQpCisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gZF9hcnJheShMT09QQ09VTlQpCisgICAgICAgIFBBUkFNRVRFUiAoaW50X2NvbnN0PTEwLGtub3duX3Byb2R1Y3Q9MzYyODgwMCkKKyAgICAgICAgUEFSQU1FVEVSIChkb3VibGVfRElHSVRTPTIwLE1BWF9GQUNUT1I9MTApCisgICAgICAgIFBBUkFNRVRFUiAocm91bmRpbmdfZXJyb3I9MS5FLTYpCisKKyAgICAgICAgZHQgPSAxLi8zLgorICAgICAgICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDIKKyAgICAgICAgcHJvZHVjdCA9IDEKKyAgICAgICAgc3VtMiA9IDAKKyAgICAgICAgc3VtID0gMAorICAgICAgICBkc3VtID0gMC4KKyAgICAgICAgcmVzdWx0ID0wIAorICAgICAgICBsb2dpY19hbmQgPSAudHJ1ZS4KKyAgICAgICAgbG9naWNfb3IgPSAuZmFsc2UuCisgICAgICAgIGJpdF9hbmQgPSAxCisgICAgICAgIGJpdF9vciA9IDAKKyAgICAgICAgZXhjbHVzaXZfYml0X29yID0gMAorISRvbXAgcGFyYWxsZWwgZG8gc2NoZWR1bGUoZHluYW1pYywgMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigrOnN1bSk8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpID0xLCBMT09QQ09VTlQKKyAgICAgICAgICBzdW0gPSBzdW0gKyBpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIGRvCisKKyAgICAgICAgSUYgKGtub3duX3N1bSAuTkUuIHN1bSkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBzdW0gd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAiLAorICAgICAmICAgICAgIHN1bSwiaW5zdGVhZCBvZiAiLCBrbm93bl9zdW0KKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgZGlmZiA9IChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMgorCisKKworISRvbXAgcGFyYWxsZWwgZG8gc2NoZWR1bGUoZHluYW1pYywgMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiAoLTogZGlmZik8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpID0xLCBMT09QQ09VTlQKKyAgICAgICAgICBkaWZmID0gZGlmZiAtIGkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgZG8KKyAgCisgICAgICAgIElGICggZGlmZiAuTkUuIDAgKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGRpZmZlcmVuY2Ugd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAiLAorICAgICAmICAgICAgIHN1bSwiaW5zdGVhZCBvZiAwLiIKKyAgICAgICAgRU5EIElGCisKKyEuLi4gVGVzdCBmb3IgZG91YmxlcworICAgICAgICBkc3VtID0wLgorICAgICAgICBkcHQgPSAxCisKKyAgICAgICAgRE8gaT0xLCBET1VCTEVfRElHSVRTCisgICAgICAgICAgZHB0PSBkcHQgKiBkdAorICAgICAgICBFTkQgRE8KKyAgICAgICAgZGtub3duX3N1bSA9ICgxLWRwdCkvKDEtZHQpCishJG9tcCBwYXJhbGxlbCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oKzpkc3VtKTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGk9MCxET1VCTEVfRElHSVRTLTEKKyAgICAgICAgICAgICAgZHN1bSA9IGRzdW0gKyBkdCoqaQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBkbworCisgCisgICAgICAgIElGKGRzdW0gLk5FLiBka25vd25fc3VtIC5BTkQuIAorICAgICAmICAgIGFicyhkc3VtIC0gZGtub3duX3N1bSkgLkdULiByb3VuZGluZ19lcnJvciApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgd3JpdGUoMSwqKSAiRXJyb3IgaW4gc3VtIHdpdGggZG91YmxlczogUmVzdWx0IHdhcyAiLAorICAgICAmICAgICAgZHN1bSwiaW5zdGVhZCBvZiAiLGRrbm93bl9zdW0sIihEaWZmZXJlbmNlOiAiLAorICAgICAmICAgICAgZHN1bSAtIGRrbm93bl9zdW0sIikiCisgICAgICAgIEVORCBJRgorICAgICAgICBkcHQgPSAxCisKKyAgICAgICAgRE8gaT0xLCBET1VCTEVfRElHSVRTCisgICAgICAgICAgZHB0ID0gZHB0KmR0CisgICAgICAgIEVORCBETworICAgICAgICBkZGlmZiA9ICggMS1kcHQpLygxLWR0KQorCishJG9tcCBwYXJhbGxlbCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLTpkZGlmZik8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpPTAsIERPVUJMRV9ESUdJVFMtMQorICAgICAgICAgIGRkaWZmID0gZGRpZmYgLSBkdCoqaQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBkbworCisgICAgICAgIElGICggQUJTKGRkaWZmKSAuR1QuIHJvdW5kaW5nX2Vycm9yICkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBEaWZmZXJlbmNlIHdpdGggZG91YmxlczogUmVzdWx0IHdhcyAiLAorICAgICAmICAgICAgIGRkaWZmLCJpbnN0ZWFkIG9mIDAuMCIKKyAgICAgICAgRU5EIElGCisKKyEkb21wIHBhcmFsbGVsIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigqOnByb2R1Y3QpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaT0xLE1BWF9GQUNUT1IKKyAgICAgICAgICAgcHJvZHVjdCA9IHByb2R1Y3QgKiBpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIGRvCisKKyAgICAgICAgSUYgKGtub3duX3Byb2R1Y3QgLk5FLiBwcm9kdWN0KSBUSEVOCisgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gUHJvZHVjdCB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICIsCisgICAgICYgICAgICAgcHJvZHVjdCwiIGluc3RlYWQgb2YiLGtub3duX3Byb2R1Y3QgCisgICAgICAgIEVORCBJRgorCisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICBsb2dpY3MoaSkgPSAuVFJVRS4KKyAgICAgICAgRU5EIERPCisKKyEkb21wIHBhcmFsbGVsIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiguQU5ELjpsb2dpY19hbmQpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgIGxvZ2ljX2FuZCA9IGxvZ2ljX2FuZCAuQU5ELiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgZG8KKworICAgICAgICBJRiAoLk5PVC4gbG9naWNfYW5kKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGxvZ2ljIEFORCBwYXJ0IDEiCisgICAgICAgIEVORCBJRgorCisKKyAgICAgICAgbG9naWNfYW5kID0gLlRSVUUuCisgICAgICAgIGxvZ2ljcyhMT09QQ09VTlQvMikgPSAuRkFMU0UuCisKKyEkb21wIHBhcmFsbGVsIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiguQU5ELjpsb2dpY19hbmQpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgIGxvZ2ljX2FuZCA9IGxvZ2ljX2FuZCAuQU5ELiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgZG8KKworICAgICAgICBJRiAobG9naWNfYW5kKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGxvZ2ljIEFORCBwYXNzIDIiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICBsb2dpY3MoaSkgPSAuRkFMU0UuCisgICAgICAgIEVORCBETworCishJG9tcCBwYXJhbGxlbCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLk9SLjpsb2dpY19vcik8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpID0gMSwgTE9PUENPVU5UCisgICAgICAgICAgIGxvZ2ljX29yID0gbG9naWNfb3IgLm9yLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgZG8KKworICAgICAgICBJRiAobG9naWNfb3IpIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gbG9naWMgT1IgcGFydCAxIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBsb2dpY19vciA9IC5GQUxTRS4KKyAgICAgICAgbG9naWNzKExPT1BDT1VOVC8yKSA9IC5UUlVFLgorCishJG9tcCBwYXJhbGxlbCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLk9SLjpsb2dpY19vcik8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpPTEsTE9PUENPVU5UCisgICAgICAgICAgbG9naWNfb3IgPSBsb2dpY19vciAuT1IuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBkbworCisgICAgICAgIElGICggLk5PVC4gbG9naWNfb3IgKSBUSEVuCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGxvZ2ljIE9SIHBhcnQgMiIKKyAgICAgICAgRU5EIElGCisKKyEuLi4gVGVzdCBsb2dpYyBFUVYsIHVuaXF1ZSBpbiBGb3J0cmFuCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICBsb2dpY3MoaSkgPSAuVFJVRS4KKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgbG9naWNfZXF2ID0gLlRSVUUuCisKKyEkb21wIHBhcmFsbGVsIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiguRVFWLjpsb2dpY19lcXYpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaSA9IDEsIExPT1BDT1VOVAorICAgICAgICAgICBsb2dpY19lcXYgPSBsb2dpY19lcXYgLkVRVi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIGRvCisKKyAgICAgICAgSUYgKC5OT1QuIGxvZ2ljX2VxdikgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBFUVYgcGFydCAxIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBsb2dpY19lcXYgPSAuVFJVRS4KKyAgICAgICAgbG9naWNzKExPT1BDT1VOVC8yKSA9IC5GQUxTRS4KKworISRvbXAgcGFyYWxsZWwgZG8gc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC5FUVYuOmxvZ2ljX2Vxdik8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpPTEsTE9PUENPVU5UCisgICAgICAgICAgIGxvZ2ljX2VxdiA9IGxvZ2ljX2VxdiAuRVFWLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgZG8KKworICAgICAgICBJRiAoIGxvZ2ljX2VxdiApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gbG9naWMgRVFWIHBhcnQgMiIKKyAgICAgICAgRU5EIElGCisKKyEuLi4gVGVzdCBsb2dpYyBORVFWLCB3aGljaCBpcyB1bmlxdWUgaW4gRm9ydHJhbgorICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorICAgICAgICAgbG9naWNzKGkpID0gLkZBTFNFLgorICAgICAgICBFTkQgRE8KKworICAgICAgICBsb2dpY19uZXF2ID0gLkZBTFNFLgorCishJG9tcCBwYXJhbGxlbCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLk5FUVYuOmxvZ2ljX25lcXYpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaSA9IDEsIExPT1BDT1VOVAorICAgICAgICAgICBsb2dpY19uZXF2ID0gbG9naWNfbmVxdiAuTkVRVi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIGRvCisKKyAgICAgICAgSUYgKGxvZ2ljX25lcXYpIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gbG9naWMgTkVRViBwYXJ0IDEiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIGxvZ2ljX25lcXYgPSAuRkFMU0UuCisgICAgICAgIGxvZ2ljcyhMT09QQ09VTlQvMikgPSAuVFJVRS4KKworISRvbXAgcGFyYWxsZWwgZG8gc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC5ORVFWLjpsb2dpY19uZXF2KTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICAgbG9naWNfbmVxdiA9IGxvZ2ljX25lcXYgLm5lcXYuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBkbworCisgICAgICAgIElGICggLk5PVC4gbG9naWNfbmVxdiApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gbG9naWMgTkVRViBwYXJ0IDIiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICAgIGludF9hcnJheShpKSA9IDEKKyAgICAgICAgRU5EIERPCishJG9tcCBwYXJhbGxlbCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oSUFORDpiaXRfYW5kKTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCishLi4uIGlhbmQoSSxKKTogUmV0dXJucyB2YWx1ZSByZXN1bHRpbmcgZnJvbSBib29sZWFuIEFORCBvZiAKKyEuLi4gcGFpciBvZiBiaXRzIGluIGVhY2ggb2YgSSBhbmQgSi4gCisgICAgICAgICAgYml0X2FuZCA9IElBTkQoYml0X2FuZCxpbnRfYXJyYXkoaSkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIGRvCisKKyAgICAgICAgSUYgKCBiaXRfYW5kIC5MVC4gMSApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gSUFORCBwYXJ0IDEiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIGJpdF9hbmQgPSAxCisgICAgICAgIGludF9hcnJheShMT09QQ09VTlQvMikgPSAwCisKKyEkb21wIHBhcmFsbGVsIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihJQU5EOmJpdF9hbmQpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgICBiaXRfYW5kID0gSUFORCAoIGJpdF9hbmQsIGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIGRvCisKKyAgICAgICAgSUYoIGJpdF9hbmQgLkdFLiAxKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIElBTkQgcGFydCAyIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorICAgICAgICAgIGludF9hcnJheShpKSA9IDAKKyAgICAgICAgRU5EIERPCisKKworISRvbXAgcGFyYWxsZWwgZG8gc2NoZWR1bGUoZHluYW1pYywxKSByZWR1Y3Rpb24oSU9SOmJpdF9vcikKKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyEuLi4gSW9yKEksSik6IFJldHVybnMgdmFsdWUgcmVzdWx0aW5nIGZyb20gYm9vbGVhbiBPUiBvZiAKKyEuLi4gcGFpciBvZiBiaXRzIGluIGVhY2ggb2YgSSBhbmQgSi4gCisgICAgICAgICAgYml0X29yID0gSU9SKGJpdF9vciwgaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgZG8KKworICAgICAgICBJRiAoIGJpdF9vciAuR0UuIDEpIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gSW9yIHBhcnQgMSIKKyAgICAgICAgRU5EIElGCisKKworICAgICAgICBiaXRfb3IgPSAwCisgICAgICAgIGludF9hcnJheShMT09QQ09VTlQvMikgPSAxCishJG9tcCBwYXJhbGxlbCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oSU9SOmJpdF9vcik8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorICAgICAgICAgIGJpdF9vciA9IElPUihiaXRfb3IsIGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIGRvCisKKyAgICAgICAgSUYgKCBiaXRfb3IgLkxFLiAwKSB0aGVuCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIElvciBwYXJ0IDIiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICAgaW50X2FycmF5KGkpID0gMAorICAgICAgICBFTkQgRE8KKworISRvbXAgcGFyYWxsZWwgZG8gc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKElFT1I6ZXhjbHVzaXZfYml0X29yKTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGkgPSAxLCBMT09QQ09VTlQKKyAgICAgICAgICBleGNsdXNpdl9iaXRfb3IgPSBpZW9yKGV4Y2x1c2l2X2JpdF9vciwgaW50X2FycmF5KGkpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBkbworCisgICAgICAgIElGICggZXhjbHVzaXZfYml0X29yIC5HRS4gMSkgVEhFTgorICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIEllb3IgcGFydCAxIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBleGNsdXNpdl9iaXRfb3IgPSAwCisgICAgICAgIGludF9hcnJheShMT09QQ09VTlQvMikgPSAxCisKKyEkb21wIHBhcmFsbGVsIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihJRU9SOmV4Y2x1c2l2X2JpdF9vcik8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpID0gMSwgTE9PUENPVU5UCisgICAgICAgICAgICBleGNsdXNpdl9iaXRfb3IgPSBJRU9SKGV4Y2x1c2l2X2JpdF9vciwgaW50X2FycmF5KGkpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBkbworCisgICAgICAgIElGICggZXhjbHVzaXZfYml0X29yIC5sZS4gMCkgdGhlbgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBJZW9yIHBhcnQgMiIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgICBpbnRfYXJyYXkoaSkgPSAxMCAtIGkKKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgbWluX3ZhbHVlID0gNjU1MzUKKworISRvbXAgcGFyYWxsZWwgZG8gc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKE1JTjptaW5fdmFsdWUpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaSA9IDEsIExPT1BDT1VOVAorICAgICAgICAgICAgbWluX3ZhbHVlID0gTUlOKG1pbl92YWx1ZSxpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBkbworCisgICAgICAgIElGICggbWluX3ZhbHVlIC5HVC4gKDEwLUxPT1BDT1VOVCkgKVRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gaW50ZWdlciBNSU4iCisgICAgICAgIEVORCBJRgorCisKKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgICBpbnRfYXJyYXkoaSkgPSBpCisgICAgICAgIEVORCBETworCisgICAgICAgIG1heF92YWx1ZSA9IC0zMjc2OAorCishJG9tcCBwYXJhbGxlbCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oTUFYOm1heF92YWx1ZSk8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpID0gMSwgTE9PUENPVU5UCisgICAgICAgICAgICBtYXhfdmFsdWUgPSBNQVgobWF4X3ZhbHVlLGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIGRvCisKKyAgICAgICAgSUYgKCBtYXhfdmFsdWUgLkxULiBMT09QQ09VTlQgKVRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gaW50ZWdlciBNQVgiCisgICAgICAgIEVORCBJRgorCishLi4uIHRlc3QgZG91YmxlIG1pbiwgbWF4CisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICBkX2FycmF5KGkpID0gMTAgLSBpKmR0CisgICAgICAgIEVORCBETworCisgICAgICAgIGRtaW4gPSAyKioxMAorICAgICAgICBkdCA9IDAuNQorCishJG9tcCBwYXJhbGxlbCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oTUlOOmRtaW4pPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaSA9IDEsIExPT1BDT1VOVAorICAgICAgICAgIGRtaW49IE1JTihkbWluLGRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBkbworCisgICAgICAgIElGICggZG1pbiAuR1QuICgxMC1kdCkgKVRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gZG91YmxlIE1JTiIKKyAgICAgICAgRU5EIElGCisKKworICAgICAgICBETyBpPTEsTE9PUENPVU5UCisgICAgICAgICAgIGRfYXJyYXkoaSkgPSBpICogZHQKKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgZG1heD0gLSAoMioqMTApCisKKyEkb21wIHBhcmFsbGVsIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihtYXg6ZG1heCk8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpID0gMSwgTE9PUENPVU5UCisgICAgICAgICAgZG1heD0gbWF4KGRtYXgsZF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIGRvCisKKyAgICAgICAgSUYgKCBkbWF4IC5MVC4gTE9PUENPVU5UKmR0IClUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGRvdWJsZSBNQVgiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIElGICggcmVzdWx0IC5FUS4gMCApIFRIRU4KKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gIDEKKyAgICAgICAgRUxTRQorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAgMAorICAgICAgICBFTkQgSUYKKworICAgICAgRU5EIEZVTkNUSU9OCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vcGFyX3NlY3Rpb25fZmlyc3Rwcml2YXRlLmYgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9wYXJfc2VjdGlvbl9maXJzdHByaXZhdGUuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzJiODVjCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vcGFyX3NlY3Rpb25fZmlyc3Rwcml2YXRlLmYKQEAgLTAsMCArMSwzNCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgZmlyc3Rwcml2YXRlIGNsYXVzZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHBhcmFsbGVsIHNlY3Rpb25zIGZpcnN0cHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBjcml0aWNhbDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+cGFyX3NlY3Rpb25fZmlyc3Rwcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIHN1bSwgc3VtMCwga25vd25fc3VtCisgICAgICAgIHN1bSA9IDcKKyAgICAgICAgc3VtMCA9IDExCishJG9tcCBwYXJhbGxlbCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+Zmlyc3Rwcml2YXRlKHN1bTApPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz5wcml2YXRlKHN1bTApPC9vbXB0czpjcm9zc2NoZWNrPiAgCishJG9tcCBzZWN0aW9uCishJG9tcCBjcml0aWNhbCAKKyAgICAgICAgc3VtID0gc3VtICsgc3VtMAorISRvbXAgZW5kIGNyaXRpY2FsCis8b21wdHM6Y3Jvc3NjaGVjaz4hJG9tcCBzZWN0aW9uPC9vbXB0czpjcm9zc2NoZWNrPgorISRvbXAgY3JpdGljYWwKKyAgICAgICAgc3VtID0gc3VtICsgc3VtMAorISRvbXAgZW5kIGNyaXRpY2FsCis8b21wdHM6Y3Jvc3NjaGVjaz4hJG9tcCBzZWN0aW9uPC9vbXB0czpjcm9zc2NoZWNrPgorISRvbXAgY3JpdGljYWwKKyAgICAgICAgc3VtID0gc3VtICsgc3VtMAorISRvbXAgZW5kIGNyaXRpY2FsCishJG9tcCBlbmQgcGFyYWxsZWwgc2VjdGlvbnMKKyAgICAgICAga25vd25fc3VtID0gMTEqMyArIDcKKyAgICAgICAgSUYgKCBrbm93bl9zdW0gLkVRLiBzdW0gKSBUSEVOCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgRUxTRQorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIEVORCBJRgorICAgICAgRU5EIAorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL3Bhcl9zZWN0aW9uX2xhc3Rwcml2YXRlLmYgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9wYXJfc2VjdGlvbl9sYXN0cHJpdmF0ZS5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5YzcyMWQKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9wYXJfc2VjdGlvbl9sYXN0cHJpdmF0ZS5mCkBAIC0wLDAgKzEsNTEgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHBhcmFsbGVsIHNlY3Rpb25zIGxhc3Rwcml2YXRlIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHBhcmFsbGVsIHNlY3Rpb25zIGxhc3Rwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsLG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5wYXJfc2VjdGlvbl9sYXN0cHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5URUdFUiBzdW0sIHN1bTAsIGtub3duX3N1bSwgaSAsaTAKKyAgICAgICAgc3VtID0gMAorICAgICAgICBzdW0wID0gMAorICAgICAgICBpMCA9IC0xCishJG9tcCBwYXJhbGxlbCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+bGFzdHByaXZhdGUoaTApPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz5wcml2YXRlKGkwKTwvb21wdHM6Y3Jvc3NjaGVjaz4gcHJpdmF0ZShpLHN1bTApCishJG9tcCBzZWN0aW9uCisgICAgICAgIHN1bTAgPSAwCisgICAgICAgIERPIGk9MSwgMzk5CisgICAgICAgICAgc3VtMCA9IHN1bTAgKyBpCisgICAgICAgICAgaTA9aQorICAgICAgICBFTkQgRE8KKyEkb21wIGNyaXRpY2FsCisgICAgICAgIHN1bSA9IHN1bSArIHN1bTAKKyEkb21wIGVuZCBjcml0aWNhbAorISRvbXAgc2VjdGlvbgorICAgICAgICBzdW0wID0gMAorICAgICAgICBETyBpPTQwMCwgNjk5CisgICAgICAgICAgc3VtMCA9IHN1bTAgKyBpCisgICAgICAgICAgaTAgPSBpCisgICAgICAgIEVORCBETworISRvbXAgY3JpdGljYWwKKyAgICAgICAgc3VtID0gc3VtICsgc3VtMAorISRvbXAgZW5kIGNyaXRpY2FsCishJG9tcCBzZWN0aW9uCisgICAgICAgIHN1bTAgPSAwCisgICAgICAgIERPIGk9NzAwLCA5OTkKKyAgICAgICAgICBzdW0wID0gc3VtMCArIGkKKyAgICAgICAgICBpMCA9IGkKKyAgICAgICAgRU5EIERPCishJG9tcCBjcml0aWNhbAorICAgICAgICBzdW0gPSBzdW0gKyBzdW0wCishJG9tcCBlbmQgY3JpdGljYWwKKyEkb21wIGVuZCBwYXJhbGxlbCBzZWN0aW9ucworICAgICAgICBrbm93bl9zdW0gPSAoOTk5KjEwMDApLzIKKyEgICAgICAgIHByaW50ICosICJzdW0iLCBzdW0sICJrcyIsIGtub3duX3N1bSwgaTAKKyAgICAgICAgSUYgKCBrbm93bl9zdW0gLkVRLiBzdW0gLkFORC4gaTAgLkVRLiA5OTkgKSBUSEVOCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgRUxTRQorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIEVORCBJRgorICAgICAgRU5ECis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vcGFyX3NlY3Rpb25fcHJpdmF0ZS5mIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vcGFyX3NlY3Rpb25fcHJpdmF0ZS5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkMGFjMGUKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9wYXJfc2VjdGlvbl9wcml2YXRlLmYKQEAgLTAsMCArMSw4NiBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBwYXJhbGxlbCBzZWN0aW9uIHByaXZhdGUgY2xhdXNlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgc2VjdGlvbiBwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5wYXJfc2VjdGlvbl9wcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIHN1bSwgc3VtMCwga25vd25fc3VtLCBpCisgICAgICAgIHN1bSA9IDcKKyAgICAgICAgc3VtMCA9IDAKKyEkb21wIHBhcmFsbGVsIHNlY3Rpb25zPG9tcHRzOmNoZWNrPnByaXZhdGUoc3VtMCxpKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+cHJpdmF0ZShpKTwvb21wdHM6Y3Jvc3NjaGVjaz4KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgc3VtMCA9IDAKKyAgICAgICAgRE8gaT0xLCAzOTkKKyAgICAgICAgICBzdW0wID0gc3VtMCArIGkKKyAgICAgICAgRU5EIERPCishJG9tcCBjcml0aWNhbAorICAgICAgICAgIHN1bSA9IHN1bSArIHN1bTAKKyEkb21wIGVuZCBjcml0aWNhbAorISRvbXAgc2VjdGlvbgorICAgICAgICBzdW0wID0gMAorICAgICAgICBETyBpPTQwMCwgNjk5CisgICAgICAgICAgc3VtMCA9IHN1bTAgKyBpCisgICAgICAgIEVORCBETworISRvbXAgY3JpdGljYWwKKyAgICAgICAgc3VtID0gc3VtICsgc3VtMAorISRvbXAgZW5kIGNyaXRpY2FsCishJG9tcCBzZWN0aW9uCisgICAgICAgIHN1bTAgPSAwCisgICAgICAgIERPIGk9NzAwLCA5OTkKKyAgICAgICAgICBzdW0wID0gc3VtMCArIGkKKyAgICAgICAgRU5EIERPCishJG9tcCBjcml0aWNhbAorICAgICAgICAgIHN1bSA9IHN1bSArIHN1bTAKKyEkb21wIGVuZCBjcml0aWNhbAorISRvbXAgZW5kIHBhcmFsbGVsIHNlY3Rpb25zCisgICAgICAgIGtub3duX3N1bSA9ICg5OTkqMTAwMCkvMis3CisgICAgICAgIElGICgga25vd25fc3VtIC5lcS4gc3VtICkgdGhlbgorICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorICAgICAgICBFTFNFCisgICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIEVORCBJRgorICAgICAgRU5EIAorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KKworICAgICAgICBpbnRlZ2VyIGZ1bmN0aW9uIGNyc2Noa19wYXJfc2VjdGlvbl9wcml2YXRlKCkKKyAgICAgICAgaW1wbGljaXQgbm9uZQorICAgICAgICBpbnRlZ2VyIHN1bSwgc3VtMCwga25vd25fc3VtLCBpCisgICAgICAgIHN1bSA9IDcKKyAgICAgICAgc3VtMCA9IDAKKyEkb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUoaSkKKyEkb21wIHNlY3Rpb24KKyAgICAgICAgc3VtMCA9IDAKKyAgICAgICAgZG8gaT0xLCAzOTkKKyAgICAgICAgICBzdW0wID0gc3VtMCArIGkKKyAgICAgICAgZW5kIGRvCishJG9tcCBjcml0aWNhbAorICAgICAgICBzdW0gPSBzdW0gKyBzdW0wCishJG9tcCBlbmQgY3JpdGljYWwKKyEkb21wIHNlY3Rpb24KKyAgICAgICAgc3VtMCA9IDAKKyAgICAgICAgZG8gaT00MDAsIDY5OQorICAgICAgICAgIHN1bTAgPSBzdW0wICsgaQorICAgICAgICBlbmQgZG8KKyEkb21wIGNyaXRpY2FsCisgICAgICAgIHN1bSA9IHN1bSArIHN1bTAKKyEkb21wIGVuZCBjcml0aWNhbAorISRvbXAgc2VjdGlvbgorICAgICAgICBzdW0wID0gMAorICAgICAgICBkbyBpPTcwMCwgOTk5CisgICAgICAgICAgc3VtMCA9IHN1bTAgKyBpCisgICAgICAgIGVuZCBkbworISRvbXAgY3JpdGljYWwKKyAgICAgICAgc3VtID0gc3VtICsgc3VtMAorISRvbXAgZW5kIGNyaXRpY2FsCishJG9tcCBlbmQgcGFyYWxsZWwgc2VjdGlvbnMKKyAgICAgICAga25vd25fc3VtID0gKDk5OSoxMDAwKS8yKzcKKyAgICAgICAgaWYgKCBrbm93bl9zdW0gLmVxLiBzdW0gKSB0aGVuCisgICAgICAgICAgY3JzY2hrX3Bhcl9zZWN0aW9uX3ByaXZhdGUgPSAxCisgICAgICAgIGVsc2UKKyAgICAgICAgICBjcnNjaGtfcGFyX3NlY3Rpb25fcHJpdmF0ZSA9IDAKKyAgICAgICAgZW5kIGlmCisgICAgICAgIGVuZAorCmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9wYXJfc2VjdGlvbl9yZWR1Y3QuZiBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL3Bhcl9zZWN0aW9uX3JlZHVjdC5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkZGUzMDQKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9wYXJfc2VjdGlvbl9yZWR1Y3QuZgpAQCAtMCwwICsxLDYzMSBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcmVkdWN0aW9uIGRpcmVjdGl2ZSB3aXRoIGFsbCBpdHMgb3B0aW9uLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgc2VjdGlvbnMgcmVkdWN0aW9uPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+cGFyX3NlY3Rpb25fcmVkdWN0PC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIHN1bSwgc3VtMiwga25vd25fc3VtLCBpLCBpMixkaWZmCisgICAgICAgIElOVEVHRVIgcHJvZHVjdCxrbm93bl9wcm9kdWN0LGludF9jb25zdAorICAgICAgICBJTlRFR0VSIE1BWF9GQUNUT1IKKyAgICAgICAgRE9VQkxFIFBSRUNJU0lPTiBkc3VtLGRrbm93bl9zdW0sZHQsZHB0CisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gcm91bmRpbmdfZXJyb3IsIGRkaWZmCisgICAgICAgIElOVEVHRVIgRE9VQkxFX0RJR0lUUworICAgICAgICBMT0dJQ0FMIGxvZ2ljX2FuZCwgbG9naWNfb3IsIGxvZ2ljX2Vxdixsb2dpY19uZXF2CisgICAgICAgIElOVEVHRVIgYml0X2FuZCwgYml0X29yCisgICAgICAgIElOVEVHRVIgZXhjbHVzaXZfYml0X29yCisgICAgICAgIElOVEVHRVIgbWluX3ZhbHVlLCBtYXhfdmFsdWUKKyAgICAgICAgRE9VQkxFIFBSRUNJU0lPTiBkbWluLCBkbWF4CisgICAgICAgIElOVEVHRVIgcmVzdWx0CisgICAgICAgIElOQ0xVREUgIm9tcF90ZXN0c3VpdGUuZiIKKyAgICAgICAgTE9HSUNBTCBsb2dpY3MoTE9PUENPVU5UKQorICAgICAgICBJTlRFR0VSIGludF9hcnJheShMT09QQ09VTlQpCisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gZF9hcnJheShMT09QQ09VTlQpCisgICAgICAgIFBBUkFNRVRFUiAoaW50X2NvbnN0PTEwLGtub3duX3Byb2R1Y3Q9MzYyODgwMCkKKyAgICAgICAgUEFSQU1FVEVSIChET1VCTEVfRElHSVRTPTIwLE1BWF9GQUNUT1I9MTApCisgICAgICAgIFBBUkFNRVRFUiAocm91bmRpbmdfZXJyb3I9MS5FLTYpCisKKyAgICAgICAgSU5URUdFUiBjdXQxLCBjdXQyLCBjdXQzLCBjdXQ0CisKKyAgICAgICAgZHQgPSAxLi8zLgorICAgICAgICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDIKKyAgICAgICAgcHJvZHVjdCA9IDEKKyAgICAgICAgc3VtMiA9IDAKKyAgICAgICAgc3VtID0gMAorICAgICAgICBkc3VtID0gMC4KKyAgICAgICAgcmVzdWx0ID0wIAorICAgICAgICBsb2dpY19hbmQgPSAuVFJVRS4KKyAgICAgICAgbG9naWNfb3IgPSAuRkFMU0UuCisgICAgICAgIGJpdF9hbmQgPSAxCisgICAgICAgIGJpdF9vciA9IDAKKyAgICAgICAgZXhjbHVzaXZfYml0X29yID0gMAorICAgICAgICBjdXQxID0gTklOVChMT09QQ09VTlQgLyAzLikKKyAgICAgICAgY3V0MiA9IGN1dDEgKyAxCisgICAgICAgIGN1dDMgPSAyICogY3V0MQorICAgICAgICBjdXQ0ID0gY3V0MyArIDEKKworISRvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCs6c3VtKTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPTEsIGN1dDEKKyAgICAgICAgICBzdW0gPSBzdW0gKyBpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID1jdXQyLCBjdXQzCisgICAgICAgICAgc3VtID0gc3VtICsgaQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9Y3V0NCwgTE9PUENPVU5UCisgICAgICAgICAgc3VtID0gc3VtICsgaQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBzZWN0aW9ucworCisgICAgICAgIElGIChrbm93bl9zdW0gLk5FLiBzdW0pIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gc3VtIHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgIiwKKyAgICAgJiAgICAgICBzdW0sImluc3RlYWQgb2YgIiwga25vd25fc3VtCisgICAgICAgIEVORCBJRgorCisgICAgICAgIGRpZmYgPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDIKKworCishJG9tcCBwYXJhbGxlbCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uICgtOiBkaWZmKTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPTEsIGN1dDEKKyAgICAgICAgICBkaWZmID0gZGlmZiAtIGkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPWN1dDIsIGN1dDMKKyAgICAgICAgICBkaWZmID0gZGlmZiAtIGkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPWN1dDQsIExPT1BDT1VOVAorICAgICAgICAgIGRpZmYgPSBkaWZmIC0gaQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBzZWN0aW9ucworICAKKyAgICAgICAgSUYgKCBkaWZmIC5ORS4gMCApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gZGlmZmVyZW5jZSB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICIsCisgICAgICYgICAgICAgc3VtLCJpbnN0ZWFkIG9mIDAuIgorICAgICAgICBFTkQgSUYKKworIS4uLiBUZXN0IGZvciBkb3VibGVzCisgICAgICAgIGRzdW0gPTAuCisgICAgICAgIGRwdCA9IDEKKworICAgICAgICBETyBpPTEsIERPVUJMRV9ESUdJVFMKKyAgICAgICAgICBkcHQ9IGRwdCAqIGR0CisgICAgICAgIEVORCBETworICAgICAgICBka25vd25fc3VtID0gKDEtZHB0KS8oMS1kdCkKKyEkb21wIHBhcmFsbGVsIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oKzpkc3VtKTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9MCw2CisgICAgICAgICAgIGRzdW0gPSBkc3VtICsgZHQqKmkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9NywxMgorICAgICAgICAgICBkc3VtID0gZHN1bSArIGR0KippCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTEzLERPVUJMRV9ESUdJVFMtMQorICAgICAgICAgICBkc3VtID0gZHN1bSArIGR0KippCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIHNlY3Rpb25zCisKKyAKKyAgICAgICAgSUYoZHN1bSAuTkUuIGRrbm93bl9zdW0gLkFORC4gCisgICAgICYgICAgIEFCUyhkc3VtIC0gZGtub3duX3N1bSkgLkdULiByb3VuZGluZ19lcnJvciApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gc3VtIHdpdGggZG91YmxlczogUmVzdWx0IHdhcyAiLAorICAgICAmICAgICAgIGRzdW0sImluc3RlYWQgb2YgIixka25vd25fc3VtLCIoRGlmZmVyZW5jZTogIiwKKyAgICAgJiAgICAgICBkc3VtIC0gZGtub3duX3N1bSwiKSIKKyAgICAgICAgRU5EIElGCisgICAgICAgIGRwdCA9IDEKKworCisgICAgICAKKyAgICAgICAgRE8gaT0xLCBET1VCTEVfRElHSVRTCisgICAgICAgICAgIGRwdCA9IGRwdCpkdAorICAgICAgICBFTkQgRE8KKyAgICAgICAgZGRpZmYgPSAoIDEtZHB0KS8oMS1kdCkKKyEkb21wIHBhcmFsbGVsIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLTpkZGlmZik8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTAsIDYKKyAgICAgICAgICBkZGlmZiA9IGRkaWZmIC0gZHQqKmkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9NywgMTIKKyAgICAgICAgICBkZGlmZiA9IGRkaWZmIC0gZHQqKmkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9MTMsIERPVUJMRV9ESUdJVFMtMQorICAgICAgICAgIGRkaWZmID0gZGRpZmYgLSBkdCoqaQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBzZWN0aW9ucworCisgICAgICAgIElGICggQUJTKGRkaWZmKSAuR1QuIHJvdW5kaW5nX2Vycm9yICkgVEhFTgorICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIERpZmZlcmVuY2Ugd2l0aCBkb3VibGVzOiBSZXN1bHQgd2FzICIsCisgICAgICYgICAgICAgZGRpZmYsImluc3RlYWQgb2YgMC4wIgorICAgICAgICBFTkQgSUYKKworISRvbXAgcGFyYWxsZWwgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigqOnByb2R1Y3QpPC9vbXB0czpjaGVjaz4KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT0xLDMKKyAgICAgICAgICAgcHJvZHVjdCA9IHByb2R1Y3QgKiBpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTQsNgorICAgICAgICAgICBwcm9kdWN0ID0gcHJvZHVjdCAqIGkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9NywxMAorICAgICAgICAgICBwcm9kdWN0ID0gcHJvZHVjdCAqIGkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgc2VjdGlvbnMKKworICAgICAgICBJRiAoa25vd25fcHJvZHVjdCAuTkUuIHByb2R1Y3QpIFRIRU4KKyAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBQcm9kdWN0IHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgIiwKKyAgICAgJiAgICAgICBwcm9kdWN0LCIgaW5zdGVhZCBvZiIsa25vd25fcHJvZHVjdCAKKyAgICAgICAgIEVORCBJRgorCisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICBsb2dpY3MoaSkgPSAuVFJVRS4KKyAgICAgICAgRU5EIERPCisKKyEkb21wIHBhcmFsbGVsIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLkFORC46bG9naWNfYW5kKTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9MSxjdXQxCisgICAgICAgICAgbG9naWNfYW5kID0gbG9naWNfYW5kIC5BTkQuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT1jdXQyLGN1dDMKKyAgICAgICAgICBsb2dpY19hbmQgPSBsb2dpY19hbmQgLkFORC4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDQsTE9PUENPVU5UCisgICAgICAgICAgbG9naWNfYW5kID0gbG9naWNfYW5kIC5BTkQuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBzZWN0aW9ucworCisgICAgICAgIGlmICgubm90LiBsb2dpY19hbmQpIHRoZW4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgd3JpdGUoMSwqKSAiRXJyb3IgaW4gbG9naWMgQU5EIHBhcnQgMSIKKyAgICAgICAgZW5kIGlmCisKKworICAgICAgICBsb2dpY19hbmQgPSAuVFJVRS4KKyAgICAgICAgbG9naWNzKExPT1BDT1VOVC8yKSA9IC5GQUxTRS4KKworISRvbXAgcGFyYWxsZWwgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiguQU5ELjpsb2dpY19hbmQpPC9vbXB0czpjaGVjaz4KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT0xLGN1dDEKKyAgICAgICAgICBsb2dpY19hbmQgPSBsb2dpY19hbmQgLkFORC4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDIsY3V0MworICAgICAgICAgIGxvZ2ljX2FuZCA9IGxvZ2ljX2FuZCAuQU5ELiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9Y3V0NCxMT09QQ09VTlQKKyAgICAgICAgICBsb2dpY19hbmQgPSBsb2dpY19hbmQgLkFORC4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIHNlY3Rpb25zCisKKyAgICAgICAgSUYgKGxvZ2ljX2FuZCkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBBTkQgcGFzcyAyIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorICAgICAgICAgIGxvZ2ljcyhpKSA9IC5GQUxTRS4KKyAgICAgICAgRU5EIERPCisKKyEkb21wIHBhcmFsbGVsIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLk9SLjpsb2dpY19vcik8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gMSwgY3V0MQorICAgICAgICAgIGxvZ2ljX29yID0gbG9naWNfb3IgLk9SLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSBjdXQyLCBjdXQzCisgICAgICAgICAgbG9naWNfb3IgPSBsb2dpY19vciAuT1IuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IGN1dDQsIExPT1BDT1VOVAorICAgICAgICAgIGxvZ2ljX29yID0gbG9naWNfb3IgLk9SLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgc2VjdGlvbnMKKworICAgICAgICBJRiAobG9naWNfb3IpIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gbG9naWMgT1IgcGFydCAxIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBsb2dpY19vciA9IC5GQUxTRS4KKyAgICAgICAgbG9naWNzKExPT1BDT1VOVC8yKSA9IC5UUlVFLgorCishJG9tcCBwYXJhbGxlbCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC5PUi46bG9naWNfb3IpPC9vbXB0czpjaGVjaz4KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT0xLGN1dDEKKyAgICAgICAgICBsb2dpY19vciA9IGxvZ2ljX29yIC5PUi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDIsY3V0MworICAgICAgICAgIGxvZ2ljX29yID0gbG9naWNfb3IgLk9SLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9Y3V0NCxMT09QQ09VTlQKKyAgICAgICAgICBsb2dpY19vciA9IGxvZ2ljX29yIC5PUi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIHNlY3Rpb25zCisKKyAgICAgICAgSUYgKCAuTk9ULiBsb2dpY19vciApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gbG9naWMgT1IgcGFydCAyIgorICAgICAgICBFTkQgSUYKKworIS4uLiBUZXN0IGxvZ2ljIEVRViwgdW5pcXVlIGluIEZvcnRyYW4KKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgICBsb2dpY3MoaSkgPSAuVFJVRS4KKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgbG9naWNfZXF2ID0gLlRSVUUuCisKKyEkb21wIHBhcmFsbGVsIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLkVRVi46bG9naWNfZXF2KTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSAxLCBjdXQxCisgICAgICAgICAgIGxvZ2ljX2VxdiA9IGxvZ2ljX2VxdiAuRVFWLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSBjdXQyLCBjdXQzCisgICAgICAgICAgIGxvZ2ljX2VxdiA9IGxvZ2ljX2VxdiAuRVFWLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSBjdXQ0LCBMT09QQ09VTlQKKyAgICAgICAgICAgbG9naWNfZXF2ID0gbG9naWNfZXF2IC5FUVYuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBzZWN0aW9ucworCisgICAgICAgIElGICguTk9ULiBsb2dpY19lcXYpIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gbG9naWMgRVFWIHBhcnQgMSIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgbG9naWNfZXF2ID0gLlRSVUUuCisgICAgICAgIGxvZ2ljcyhMT09QQ09VTlQvMikgPSAuRkFMU0UuCisKKyEkb21wIHBhcmFsbGVsIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLkVRVi46bG9naWNfZXF2KTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9MSxjdXQxCisgICAgICAgICAgIGxvZ2ljX2VxdiA9IGxvZ2ljX2VxdiAuRVFWLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9Y3V0MixjdXQzCisgICAgICAgICAgIGxvZ2ljX2VxdiA9IGxvZ2ljX2VxdiAuRVFWLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9Y3V0NCxMT09QQ09VTlQKKyAgICAgICAgICAgbG9naWNfZXF2ID0gbG9naWNfZXF2IC5FUVYuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBzZWN0aW9ucworCisgICAgICAgIElGICggbG9naWNfZXF2ICkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBFUVYgcGFydCAyIgorICAgICAgICBFTkQgSUYKKworIS4uLiBUZXN0IGxvZ2ljIE5FUVYsIHdoaWNoIGlzIHVuaXF1ZSBpbiBGb3J0cmFuCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICAgbG9naWNzKGkpID0gLkZBTFNFLgorICAgICAgICBFTkQgRE8KKworICAgICAgICBsb2dpY19uZXF2ID0gLkZBTFNFLgorCishJG9tcCBwYXJhbGxlbCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC5ORVFWLjpsb2dpY19uZXF2KTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSAxLCBjdXQxCisgICAgICAgICAgbG9naWNfbmVxdiA9IGxvZ2ljX25lcXYgLk5FUVYuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IGN1dDIsIGN1dDMKKyAgICAgICAgICBsb2dpY19uZXF2ID0gbG9naWNfbmVxdiAuTkVRVi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gY3V0NCwgTE9PUENPVU5UCisgICAgICAgICAgbG9naWNfbmVxdiA9IGxvZ2ljX25lcXYgLk5FUVYuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBzZWN0aW9ucworCisgICAgICAgIElGIChsb2dpY19uZXF2KSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGxvZ2ljIE5FUVYgcGFydCAxIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBsb2dpY19uZXF2ID0gLkZBTFNFLgorICAgICAgICBsb2dpY3MoTE9PUENPVU5ULzIpID0gLlRSVUUuCisKKyEkb21wIHBhcmFsbGVsIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLk5FUVYuOmxvZ2ljX25lcXYpPC9vbXB0czpjaGVjaz4KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT0xLGN1dDEKKyAgICAgICAgICAgbG9naWNfbmVxdiA9IGxvZ2ljX25lcXYgLk5FUVYuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT1jdXQyLGN1dDMKKyAgICAgICAgICAgbG9naWNfbmVxdiA9IGxvZ2ljX25lcXYgLk5FUVYuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT1jdXQ0LExPT1BDT1VOVAorICAgICAgICAgICBsb2dpY19uZXF2ID0gbG9naWNfbmVxdiAuTkVRVi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIHNlY3Rpb25zCisKKyAgICAgICAgSUYgKCAuTk9ULiBsb2dpY19uZXF2ICkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBORVFWIHBhcnQgMiIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgICBpbnRfYXJyYXkoaSkgPSAxCisgICAgICAgIEVORCBETworISRvbXAgcGFyYWxsZWwgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihJQU5EOmJpdF9hbmQpPC9vbXB0czpjaGVjaz4KKyEuLi4gaWFuZChJLEopOiBSZXR1cm5zIHZhbHVlIHJlc3VsdGluZyBmcm9tIGJvb2xlYW4gQU5EIG9mCishLi4uIHBhaXIgb2YgYml0cyBpbiBlYWNoIG9mIEkgYW5kIEouCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9MSwgY3V0MQorICAgICAgICAgIGJpdF9hbmQgPSBJQU5EKGJpdF9hbmQsaW50X2FycmF5KGkpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT1jdXQyLCBjdXQzCisgICAgICAgICAgYml0X2FuZCA9IElBTkQoYml0X2FuZCxpbnRfYXJyYXkoaSkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDQsIExPT1BDT1VOVAorICAgICAgICAgIGJpdF9hbmQgPSBJQU5EKGJpdF9hbmQsaW50X2FycmF5KGkpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBzZWN0aW9ucworCisgICAgICAgIElGICggYml0X2FuZCAuTFQuIDEgKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIElBTkQgcGFydCAxIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBiaXRfYW5kID0gMQorICAgICAgICBpbnRfYXJyYXkoTE9PUENPVU5ULzIpID0gMAorCishJG9tcCBwYXJhbGxlbCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKElBTkQ6Yml0X2FuZCk8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTEsIGN1dDEKKyAgICAgICAgICBiaXRfYW5kID0gSUFORCAoIGJpdF9hbmQsIGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDIsIGN1dDMKKyAgICAgICAgICBiaXRfYW5kID0gSUFORCAoIGJpdF9hbmQsIGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDQsIExPT1BDT1VOVAorICAgICAgICAgIGJpdF9hbmQgPSBJQU5EICggYml0X2FuZCwgaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgc2VjdGlvbnMKKworICAgICAgICBJRiggYml0X2FuZCAuR0UuIDEpIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gSUFORCBwYXJ0IDIiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICAgaW50X2FycmF5KGkpID0gMAorICAgICAgICBFTkQgRE8KKworCishJG9tcCBwYXJhbGxlbCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKElPUjpiaXRfb3IpPC9vbXB0czpjaGVjaz4KKyEuLi4gSW9yKEksSik6IFJldHVybnMgdmFsdWUgcmVzdWx0aW5nIGZyb20gYm9vbGVhbiBPUiBvZgorIS4uLiBwYWlyIG9mIGJpdHMgaW4gZWFjaCBvZiBJIGFuZCBKLgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTEsIGN1dDEKKyAgICAgICAgICBiaXRfb3IgPSBJT1IoYml0X29yLCBpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT1jdXQyLCBjdXQzCisgICAgICAgICAgYml0X29yID0gSU9SKGJpdF9vciwgaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9Y3V0NCwgTE9PUENPVU5UCisgICAgICAgICAgYml0X29yID0gSU9SKGJpdF9vciwgaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgc2VjdGlvbnMKKworICAgICAgICBJRiAoIGJpdF9vciAuR0UuIDEpIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gSW9yIHBhcnQgMSIKKyAgICAgICAgRU5EIElGCisKKworICAgICAgICBiaXRfb3IgPSAwCisgICAgICAgIGludF9hcnJheShMT09QQ09VTlQvMikgPSAxCishJG9tcCBwYXJhbGxlbCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKElPUjpiaXRfb3IpPC9vbXB0czpjaGVjaz4KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT0xLCBjdXQxCisgICAgICAgICAgYml0X29yID0gSU9SKGJpdF9vciwgaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9Y3V0MiwgY3V0MworICAgICAgICAgIGJpdF9vciA9IElPUihiaXRfb3IsIGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDQsIExPT1BDT1VOVAorICAgICAgICAgIGJpdF9vciA9IElPUihiaXRfb3IsIGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIHNlY3Rpb25zCisKKyAgICAgICAgSUYgKCBiaXRfb3IgLkxFLiAwKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIElvciBwYXJ0IDIiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICAgaW50X2FycmF5KGkpID0gMAorICAgICAgICBFTkQgRE8KKworISRvbXAgcGFyYWxsZWwgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihJRU9SOmV4Y2x1c2l2X2JpdF9vcik8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gMSwgY3V0MQorICAgICAgICAgIGV4Y2x1c2l2X2JpdF9vciA9IElFT1IoZXhjbHVzaXZfYml0X29yLCBpbnRfYXJyYXkoaSkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gY3V0MiwgY3V0MworICAgICAgICAgIGV4Y2x1c2l2X2JpdF9vciA9IElFT1IoZXhjbHVzaXZfYml0X29yLCBpbnRfYXJyYXkoaSkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gY3V0NCwgTE9PUENPVU5UCisgICAgICAgICAgZXhjbHVzaXZfYml0X29yID0gSUVPUihleGNsdXNpdl9iaXRfb3IsIGludF9hcnJheShpKSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgc2VjdGlvbnMKKworICAgICAgICBJRiAoIGV4Y2x1c2l2X2JpdF9vciAuR0UuIDEpIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gSWVvciBwYXJ0IDEiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIGV4Y2x1c2l2X2JpdF9vciA9IDAKKyAgICAgICAgaW50X2FycmF5KExPT1BDT1VOVC8yKSA9IDEKKworISRvbXAgcGFyYWxsZWwgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihJRU9SOmV4Y2x1c2l2X2JpdF9vcik8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gMSwgY3V0MQorICAgICAgICAgIGV4Y2x1c2l2X2JpdF9vciA9IElFT1IoZXhjbHVzaXZfYml0X29yLCBpbnRfYXJyYXkoaSkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gY3V0MiwgY3V0MworICAgICAgICAgIGV4Y2x1c2l2X2JpdF9vciA9IElFT1IoZXhjbHVzaXZfYml0X29yLCBpbnRfYXJyYXkoaSkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gY3V0NCwgTE9PUENPVU5UCisgICAgICAgICAgZXhjbHVzaXZfYml0X29yID0gSUVPUihleGNsdXNpdl9iaXRfb3IsIGludF9hcnJheShpKSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgc2VjdGlvbnMKKworICAgICAgICBJRiAoIGV4Y2x1c2l2X2JpdF9vciAuTEUuIDApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gSWVvciBwYXJ0IDIiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICBpbnRfYXJyYXkoaSkgPSAxMCAtIGkKKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgbWluX3ZhbHVlID0gNjU1MzUKKworISRvbXAgcGFyYWxsZWwgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihNSU46bWluX3ZhbHVlKTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSAxLCBjdXQxCisgICAgICAgICAgbWluX3ZhbHVlID0gTUlOKG1pbl92YWx1ZSxpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IGN1dDIsIGN1dDMKKyAgICAgICAgICBtaW5fdmFsdWUgPSBNSU4obWluX3ZhbHVlLGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gY3V0NCwgTE9PUENPVU5UCisgICAgICAgICAgbWluX3ZhbHVlID0gTUlOKG1pbl92YWx1ZSxpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBzZWN0aW9ucworCisgICAgICAgIElGICggbWluX3ZhbHVlIC5HVC4gKDEwLUxPT1BDT1VOVCkgKVRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gaW50ZWdlciBNSU4iCisgICAgICAgIEVORCBJRgorCisKKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgIGludF9hcnJheShpKSA9IGkKKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgbWF4X3ZhbHVlID0gLTMyNzY4CisKKyEkb21wIHBhcmFsbGVsIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oTUFYOm1heF92YWx1ZSk8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gMSwgY3V0MQorICAgICAgICAgIG1heF92YWx1ZSA9IE1BWChtYXhfdmFsdWUsaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSBjdXQyLCBjdXQzCisgICAgICAgICAgbWF4X3ZhbHVlID0gTUFYKG1heF92YWx1ZSxpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IGN1dDQsIExPT1BDT1VOVAorICAgICAgICAgIG1heF92YWx1ZSA9IE1BWChtYXhfdmFsdWUsaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgc2VjdGlvbnMKKworICAgICAgICBJRiAoIG1heF92YWx1ZSAuTFQuIExPT1BDT1VOVCApVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBpbnRlZ2VyIE1BWCIKKyAgICAgICAgRU5EIElGCisKKyEuLi4gdGVzdCBkb3VibGUgbWluLCBtYXgKKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgIGRfYXJyYXkoaSkgPSAxMCAtIGkqZHQKKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgZG1pbiA9IDIqKjEwCisgICAgICAgIGR0ID0gMC41CisKKyEkb21wIHBhcmFsbGVsIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oTUlOOmRtaW4pPC9vbXB0czpjaGVjaz4KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IDEsIGN1dDEKKyAgICAgICAgICBkbWluPSBNSU4oZG1pbixkX2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSBjdXQyLCBjdXQzCisgICAgICAgICAgZG1pbj0gTUlOKGRtaW4sZF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gY3V0NCwgTE9PUENPVU5UCisgICAgICAgICAgZG1pbj0gTUlOKGRtaW4sZF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIHNlY3Rpb25zCisKKyAgICAgICAgSUYgKCBkbWluIC5HVC4gKDEwLWR0KSApVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBkb3VibGUgTUlOIgorICAgICAgICBFTkQgSUYKKworCisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICBkX2FycmF5KGkpID0gaSAqIGR0CisgICAgICAgIEVORCBETworCisgICAgICAgIGRtYXg9IC0gKDIqKjEwKQorCishJG9tcCBwYXJhbGxlbCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKE1BWDpkbWF4KTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSAxLCBjdXQxCisgICAgICAgICAgZG1heD0gTUFYKGRtYXgsZF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gY3V0MiwgY3V0MworICAgICAgICAgIGRtYXg9IE1BWChkbWF4LGRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IGN1dDQsIExPT1BDT1VOVAorICAgICAgICAgIGRtYXg9IE1BWChkbWF4LGRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBzZWN0aW9ucworCisgICAgICAgIElGICggZG1heCAubHQuIExPT1BDT1VOVCpkdCApVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICB3cml0ZSgxLCopICJFcnJvciBpbiBkb3VibGUgTUFYIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBJRiAoIHJlc3VsdCAuRVEuIDAgKSBUSEVOCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9ICAxCisgICAgICAgIEVMU0UKKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gIDAKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgQ0xPU0UoMikKKworICAgICAgRU5EIEZVTkNUSU9OCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vc2VjdGlvbl9maXJzdHByaXZhdGUuZiBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL3NlY3Rpb25fZmlyc3Rwcml2YXRlLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjMwMDU4YQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL3NlY3Rpb25fZmlyc3Rwcml2YXRlLmYKQEAgLTAsMCArMSw0MSBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgc2VjdGlvbiBmaXJzdHByaXZhdGUgZGlyZWN0aXZlIGJ5IGFkZGluZyBhIHZhcmlhYmxlIHdoaWNoIGlzIGRlZmluZWQgYmVmb3JlIHRoZSBwYXJhbGxlbCByZWdpb24uPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBmaXJzdHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5zZWN0aW9uX2ZpcnN0cHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5URUdFUiBrbm93bl9zdW0KKzxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5URUdFUiBzdW0sc3VtMAorICAgICAgICBDT01NT04gL29ycGh2YXJzLyBzdW0sc3VtMAorPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgc3VtID0gNworICAgICAgICBzdW0wID0gMTEKKyEkb21wIHBhcmFsbGVsCisgICAgICAgIDxvbXB0czpvcnBoYW4+CishJG9tcCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+Zmlyc3Rwcml2YXRlKHN1bTApPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz5wcml2YXRlKHN1bTApPC9vbXB0czpjcm9zc2NoZWNrPgorISRvbXAgc2VjdGlvbgorISRvbXAgY3JpdGljYWwKKyAgICAgICAgc3VtID0gc3VtICsgc3VtMAorISRvbXAgZW5kIGNyaXRpY2FsCishJG9tcCBzZWN0aW9uCishJG9tcCBjcml0aWNhbAorICAgICAgICBzdW0gPSBzdW0gKyBzdW0wCishJG9tcCBlbmQgY3JpdGljYWwKKyEkb21wIHNlY3Rpb24KKyEkb21wIGNyaXRpY2FsCisgICAgICAgIHN1bSA9IHN1bSArIHN1bTAKKyEkb21wIGVuZCBjcml0aWNhbAorISRvbXAgZW5kIHNlY3Rpb25zCisgICAgICAgIDwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisgICAgICAgIGtub3duX3N1bSA9IDExKjMrNworICAgICAgICBJRiAoIGtub3duX3N1bSAuRVEuIHN1bSkgVEhFTgorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAxCisgICAgICAgIEVMU0UKKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorICAgICAgICBFTkQgSUYKKyAgICAgIEVORAorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL3NlY3Rpb25fbGFzdHByaXZhdGUuZiBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL3NlY3Rpb25fbGFzdHByaXZhdGUuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmE3MTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vc2VjdGlvbl9sYXN0cHJpdmF0ZS5mCkBAIC0wLDAgKzEsNjIgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHNlY3Rpb24gbGFzdHByaXZhdGUgZGlyZWN0aXZlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgc2VjdGlvbiBsYXN0cHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOnRlc3Rjb2RlPgorICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPnNlY3Rpb25fbGFzdHByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTlRFR0VSIGtub3duX3N1bQorCisgICAgICAgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5URUdFUiBpLCBpMCwgc3VtLCBzdW0wCisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIGksaTAsc3VtCisgICAgICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICAgICAgc3VtID0gMAorICAgICAgICBzdW0wID0gMAorICAgICAgICBpMCA9IC0xCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPmxhc3Rwcml2YXRlKGkwKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+cHJpdmF0ZShpMCk8L29tcHRzOmNyb3NzY2hlY2s+IHByaXZhdGUoaSxzdW0wKQorISRvbXAgc2VjdGlvbgorICAgICAgICBzdW0wID0gMAorICAgICAgICBETyBpPTEsIDM5OQorICAgICAgICAgIHN1bTAgPSBzdW0wICsgaQorICAgICAgICAgIGkwID0gaQorICAgICAgICBFTkQgRE8KKyEkb21wIGNyaXRpY2FsCisgICAgICAgIHN1bSA9IHN1bSArIHN1bTAKKyEkb21wIGVuZCBjcml0aWNhbAorISRvbXAgc2VjdGlvbgorICAgICAgICBzdW0wID0gMAorICAgICAgICBETyBpPTQwMCwgNjk5CisgICAgICAgICAgc3VtMCA9IHN1bTAgKyBpCisgICAgICAgICAgaTAgPSBpCisgICAgICAgIEVORCBETworISRvbXAgY3JpdGljYWwKKyAgICAgICAgc3VtID0gc3VtICsgc3VtMAorISRvbXAgZW5kIGNyaXRpY2FsCishJG9tcCBzZWN0aW9uCisgICAgICAgIHN1bTAgPSAwCisgICAgICAgIERPIGk9NzAwLCA5OTkKKyAgICAgICAgICBzdW0wID0gc3VtMCArIGkKKyAgICAgICAgICBpMCA9IGkKKyAgICAgICAgRU5EIERPCishJG9tcCBjcml0aWNhbAorICAgICAgICBzdW0gPSBzdW0gKyBzdW0wCishJG9tcCBlbmQgY3JpdGljYWwKKyEkb21wIGVuZCBzZWN0aW9ucworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBrbm93bl9zdW0gPSAoOTk5KjEwMDApLzIKKyAgICAgICAgSUYgKCBrbm93bl9zdW0gLkVRLiBzdW0gLkFORC4gaTAgLkVRLiA5OTkgKSBUSEVOCisgICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAxCisgICAgICAgIEVMU0UKKyAgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKyAgICAgICAgRU5EIElGCisgICAgICBFTkQKKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tdHM6dGVzdD4KKworCmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9zZWN0aW9uX3ByaXZhdGUuZiBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL3NlY3Rpb25fcHJpdmF0ZS5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4YjgwOTAKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9zZWN0aW9uX3ByaXZhdGUuZgpAQCAtMCwwICsxLDU1IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIHBhcmFsbGVsIHNlY3Rpb24gcHJpdmF0ZSBjbGF1c2UuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBwYXJhbGxlbCBzZWN0aW9uIHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgY3JpdGljYWw8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPnNlY3Rpb25fcHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5URUdFUiBrbm93bl9zdW0KKzxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5URUdFUiBzdW0sc3VtMCxpCisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIHN1bSxzdW0wLGkKKzwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICAgICAgc3VtID0gNworICAgICAgICBzdW0wID0gMAorISRvbXAgcGFyYWxsZWwKKyAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyEkb21wIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5wcml2YXRlKHN1bTAsaSk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPnByaXZhdGUoaSk8L29tcHRzOmNyb3NzY2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIHN1bTAgPSAwCisgICAgICAgIERPIGk9MSwgMzk5CisgICAgICAgICAgc3VtMCA9IHN1bTAgKyBpCisgICAgICAgIEVORCBETworISRvbXAgY3JpdGljYWwKKyAgICAgICAgc3VtID0gc3VtICsgc3VtMAorISRvbXAgZW5kIGNyaXRpY2FsCishJG9tcCBzZWN0aW9uCisgICAgICAgIHN1bTAgPSAwCisgICAgICAgIERPIGk9NDAwLCA2OTkKKyAgICAgICAgICBzdW0wID0gc3VtMCArIGkKKyAgICAgICAgRU5EIERPCishJG9tcCBjcml0aWNhbAorICAgICAgICBzdW0gPSBzdW0gKyBzdW0wCishJG9tcCBlbmQgY3JpdGljYWwKKyEkb21wIHNlY3Rpb24KKyAgICAgICAgc3VtMCA9IDAKKyAgICAgICAgRE8gaT03MDAsIDk5OQorICAgICAgICAgIHN1bTAgPSBzdW0wICsgaQorICAgICAgICBFTkQgRE8KKyEkb21wIGNyaXRpY2FsCisgICAgICAgIHN1bSA9IHN1bSArIHN1bTAKKyEkb21wIGVuZCBjcml0aWNhbAorISRvbXAgZW5kIHNlY3Rpb25zCisgICAgICAgIDwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisgICAgICAgIGtub3duX3N1bSA9ICg5OTkqMTAwMCkvMis3CisgICAgICAgIElGICgga25vd25fc3VtIC5FUS4gc3VtKSBUSEVOCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgRUxTRQorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIEVORCBJRgorICAgICAgRU5ECis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vc2VjdGlvbl9yZWR1Y3Rpb24uZiBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL3NlY3Rpb25fcmVkdWN0aW9uLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdlNzBmOQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL3NlY3Rpb25fcmVkdWN0aW9uLmYKQEAgLTAsMCArMSw3NDMgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHNlY3Rpb25zIHJlZHVjdGlvbiBkaXJlY3RpdmUgd2l0aCBhbGwgaXRzIG9wdGlvbnMuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBzZWN0aW9ucyByZWR1Y3Rpb248L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5zZWN0aW9uX3JlZHVjdGlvbjwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5URUdFUiBzdW0yLCBrbm93bl9zdW0sIGkyCisgICAgICAgIElOVEVHRVIga25vd25fcHJvZHVjdCxpbnRfY29uc3QKKyAgICAgICAgSU5URUdFUiBNQVhfRkFDVE9SCisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gZGtub3duX3N1bSxkcHQKKyAgICAgICAgSU5URUdFUiByZXN1bHQKKyAgICAgICAgSU5DTFVERSAib21wX3Rlc3RzdWl0ZS5mIgorICAgICAgICBQQVJBTUVURVIgKGludF9jb25zdD0xMCxrbm93bl9wcm9kdWN0PTM2Mjg4MDApCisKKyAgICAgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBJTlRFR0VSIGksZHVtbXkKKyAgICAgICAgSU5URUdFUiBzdW0sIGRJRmYKKyAgICAgICAgRE9VQkxFIFBSRUNJU0lPTiBkdAorICAgICAgICBET1VCTEUgUFJFQ0lTSU9OIGRzdW0sIGRkSUZmCisgICAgICAgIElOVEVHRVIgcHJvZHVjdAorICAgICAgICBMT0dJQ0FMIGxvZ2ljcyhMT09QQ09VTlQpCisgICAgICAgIElOVEVHRVIgaW50X2FycmF5KExPT1BDT1VOVCkKKyAgICAgICAgTE9HSUNBTCBsb2dpY19hbmQsIGxvZ2ljX29yLCBsb2dpY19lcXYsbG9naWNfbmVxdgorICAgICAgICBJTlRFR0VSIGJpdF9hbmQsIGJpdF9vcgorICAgICAgICBJTlRFR0VSIGV4Y2x1c2l2X2JpdF9vcgorICAgICAgICBJTlRFR0VSIG1pbl92YWx1ZSwgbWF4X3ZhbHVlCisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gZF9hcnJheShMT09QQ09VTlQpCisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gZG1pbiwgZG1heAorCisgICAgICAgIElOVEVHRVIgRE9VQkxFX0RJR0lUUworICAgICAgICBJTlRFR0VSIGN1dDEsIGN1dDIsIGN1dDMsIGN1dDQKKyAgICAgICAgUEFSQU1FVEVSIChET1VCTEVfRElHSVRTPTIwLE1BWF9GQUNUT1I9MTApCisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gcm91bmRpbmdfZXJyb3IKKyAgICAgICAgUEFSQU1FVEVSIChyb3VuZGluZ19lcnJvcj0xLkUtNikKKworICAgICAgICBDT01NT04gL29ycGh2YXJzLyBpLHN1bSxkSUZmLHByb2R1Y3QsZHQsZHN1bSxkZElGZixsb2dpY19hbmQsCisgICAgICYgICAgbG9naWNfb3IsbG9naWNfZXF2LGxvZ2ljX25lcXYsbG9naWNzLGludF9hcnJheSxiaXRfYW5kLGJpdF9vciwKKyAgICAgJiAgICBleGNsdXNpdl9iaXRfb3IsbWluX3ZhbHVlLGRtaW4sZG1heCxkX2FycmF5LG1heF92YWx1ZQorICAgICAgICAKKyAgICAgICAgY3V0MSA9IE5JTlQoTE9PUENPVU5UIC8gMy4zKQorICAgICAgICBjdXQyID0gY3V0MSArIDEKKyAgICAgICAgY3V0MyA9IGN1dDEgKiAyCisgICAgICAgIGN1dDQgPSBjdXQzICsgMQorCisgICAgICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICAgICAgZHQgPSAxLi8zLgorICAgICAgICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDIKKyAgICAgICAgcHJvZHVjdCA9IDEKKyAgICAgICAgc3VtMiA9IDAKKyAgICAgICAgc3VtID0gMAorICAgICAgICBkc3VtID0gMC4KKyAgICAgICAgcmVzdWx0ID0wIAorICAgICAgICBsb2dpY19hbmQgPSAudHJ1ZS4KKyAgICAgICAgbG9naWNfb3IgPSAuZmFsc2UuCisgICAgICAgIGJpdF9hbmQgPSAxCisgICAgICAgIGJpdF9vciA9IDAKKyAgICAgICAgZXhjbHVzaXZfYml0X29yID0gMAorICAgICAgICBjdXQxID0gTklOVChMT09QQ09VTlQgLyAzLjMpCisgICAgICAgIGN1dDIgPSBjdXQxICsgMQorICAgICAgICBjdXQzID0gY3V0MSAqIDIKKyAgICAgICAgY3V0NCA9IGN1dDMgKyAxCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCs6c3VtKTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPTEsIGN1dDEKKyAgICAgICAgICBzdW0gPSBzdW0gKyBpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID1jdXQyLCBjdXQzCisgICAgICAgICAgc3VtID0gc3VtICsgaQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9Y3V0NCwgTE9PUENPVU5UCisgICAgICAgICAgc3VtID0gc3VtICsgaQorICAgICAgICBFTkQgRE8KKyEkb21wIEVORCBzZWN0aW9ucworPC9vbXB0czpvcnBoYW4+CishJG9tcCBFTkQgcGFyYWxsZWwKKworICAgICAgICBJRiAoa25vd25fc3VtIC5ORS4gc3VtKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBzdW0gd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAiLAorICAgICAmICAgIHN1bSwiaW5zdGVhZCBvZiAiLCBrbm93bl9zdW0KKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgZElGZiA9IGtub3duX3N1bQorCisKKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uICgtOiBkSUZmKTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPTEsIGN1dDEKKyAgICAgICAgICBkSUZmID0gZElGZiAtIGkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPWN1dDIsIGN1dDMKKyAgICAgICAgICBkSUZmID0gZElGZiAtIGkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPWN1dDQsIExPT1BDT1VOVAorICAgICAgICAgIGRJRmYgPSBkSUZmIC0gaQorICAgICAgICBFTkQgRE8KKyEkb21wIEVORCBzZWN0aW9ucworPC9vbXB0czpvcnBoYW4+CishJG9tcCBFTkQgcGFyYWxsZWwKKyAgCisgICAgICAgIElGICggZElGZiAuTkUuIDAgKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBkSUZmZXJlbmNlIHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgIiwKKyAgICAgJiAgICBzdW0sImluc3RlYWQgb2YgMC4iCisgICAgICAgIEVORCBJRgorCishKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEKKyEgICBUZXN0IGZvciBET3VibGVzCishKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEKKyAgICAgICAgZHN1bSA9IDAuCisgICAgICAgIGRwdCA9IDEKKworICAgICAgICBETyBpPTEsIERPVUJMRV9ESUdJVFMKKyAgICAgICAgICBkcHQ9IGRwdCAqIGR0CisgICAgICAgIEVORCBETworICAgICAgICBka25vd25fc3VtID0gKDEtZHB0KS8oMS1kdCkKKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCs6ZHN1bSk8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTAsNgorICAgICAgICAgICAgICBkc3VtID0gZHN1bSArIGR0KippCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTcsMTIKKyAgICAgICAgICAgICAgZHN1bSA9IGRzdW0gKyBkdCoqaQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT0xMyxET1VCTEVfRElHSVRTLTEKKyAgICAgICAgICAgICAgZHN1bSA9IGRzdW0gKyBkdCoqaQorICAgICAgICBFTkQgRE8KKyEkb21wIEVORCBzZWN0aW9ucworPC9vbXB0czpvcnBoYW4+CishJG9tcCBFTkQgcGFyYWxsZWwKKworIAorICAgICAgICBJRiAoZHN1bSAuTkUuIGRrbm93bl9zdW0gLkFORC4gCisgICAgICYgICAgYWJzKGRzdW0gLSBka25vd25fc3VtKSAuR1QuIHJvdW5kaW5nX2Vycm9yICkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBzdW0gd2l0aCBET3VibGVzOiBSZXN1bHQgd2FzICIsCisgICAgICYgICAgICBkc3VtLCJpbnN0ZWFkIG9mICIsZGtub3duX3N1bSwiKERJRmZlcmVuY2U6ICIsCisgICAgICYgICAgICBkc3VtIC0gZGtub3duX3N1bSwiKSIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgZHB0ID0gMQorICAgICAgICBETyBpPTEsIERPVUJMRV9ESUdJVFMKKyAgICAgICAgICBkcHQgPSBkcHQqZHQKKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgZGRJRmYgPSAoIDEtZHB0KS8oMS1kdCkKKyEkb21wIHBhcmFsbGVsCishJG9tcCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC06ZGRJRmYpPC9vbXB0czpjaGVjaz4KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT0wLCA2CisgICAgICAgICAgZGRJRmYgPSBkZElGZiAtIGR0KippCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTcsIDEyCisgICAgICAgICAgZGRJRmYgPSBkZElGZiAtIGR0KippCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTEzLCBET1VCTEVfRElHSVRTLTEKKyAgICAgICAgICBkZElGZiA9IGRkSUZmIC0gZHQqKmkKKyAgICAgICAgRU5EIERPCishJG9tcCBFTkQgc2VjdGlvbnMKKyEkb21wIEVORCBwYXJhbGxlbAorCisgICAgICAgIElGICggYWJzKGRkSUZmKSAuR1QuIHJvdW5kaW5nX2Vycm9yICkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBESUZmZXJlbmNlIHdpdGggRE91YmxlczogUmVzdWx0IHdhcyAiLAorICAgICAmICAgICAgZGRJRmYsImluc3RlYWQgb2YgMC4wIgorICAgICAgICBFTkQgSUYKKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCo6cHJvZHVjdCk8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTEsMworICAgICAgICAgIHByb2R1Y3QgPSBwcm9kdWN0ICogaQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT00LDYKKyAgICAgICAgICBwcm9kdWN0ID0gcHJvZHVjdCAqIGkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9NywxMAorICAgICAgICAgIHByb2R1Y3QgPSBwcm9kdWN0ICogaQorICAgICAgICBFTkQgRE8KKyEkb21wIEVORCBzZWN0aW9ucworPC9vbXB0czpvcnBoYW4+CishJG9tcCBFTkQgcGFyYWxsZWwKKworICAgICAgICBJRiAoa25vd25fcHJvZHVjdCAuTkUuIHByb2R1Y3QpIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gUHJvZHVjdCB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICIsCisgICAgICYgICAgICBwcm9kdWN0LCIgaW5zdGVhZCBvZiIsa25vd25fcHJvZHVjdCAKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgIGxvZ2ljcyhpKSA9IC5UUlVFLgorICAgICAgICBFTkQgRE8KKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC5hbmQuOmxvZ2ljX2FuZCk8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTEsY3V0MQorICAgICAgICAgIGxvZ2ljX2FuZCA9IGxvZ2ljX2FuZCAuQU5ELiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9Y3V0MixjdXQzCisgICAgICAgICAgbG9naWNfYW5kID0gbG9naWNfYW5kIC5BTkQuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT1jdXQ0LExPT1BDT1VOVAorICAgICAgICAgIGxvZ2ljX2FuZCA9IGxvZ2ljX2FuZCAuQU5ELiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBFTkQgc2VjdGlvbnMKKzwvb21wdHM6b3JwaGFuPgorISRvbXAgRU5EIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKC5OT1QuIGxvZ2ljX2FuZCkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBBTkQgcGFydCAxIgorICAgICAgICBFTkQgSUYKKworCisgICAgICAgIGxvZ2ljX2FuZCA9IC5UUlVFLgorICAgICAgICBsb2dpY3MoTE9PUENPVU5ULzIpID0gLkZBTFNFLgorCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLmFuZC46bG9naWNfYW5kKTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9MSxjdXQxCisgICAgICAgICAgbG9naWNfYW5kID0gbG9naWNfYW5kIC5BTkQuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT1jdXQyLGN1dDMKKyAgICAgICAgICBsb2dpY19hbmQgPSBsb2dpY19hbmQgLkFORC4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDQsTE9PUENPVU5UCisgICAgICAgICAgbG9naWNfYW5kID0gbG9naWNfYW5kIC5BTkQuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIEVORCBzZWN0aW9ucworPC9vbXB0czpvcnBoYW4+CishJG9tcCBFTkQgcGFyYWxsZWwKKworICAgICAgICBJRiAobG9naWNfYW5kKSBUSEVOCisgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gbG9naWMgQU5EIHBhc3MgMiIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgIGxvZ2ljcyhpKSA9IC5GQUxTRS4KKyAgICAgICAgRU5EIERPCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigub3IuOmxvZ2ljX29yKTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSAxLCBjdXQxCisgICAgICAgICAgIGxvZ2ljX29yID0gbG9naWNfb3IgLk9SLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSBjdXQyLCBjdXQzCisgICAgICAgICAgIGxvZ2ljX29yID0gbG9naWNfb3IgLk9SLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSBjdXQ0LCBMT09QQ09VTlQKKyAgICAgICAgICAgbG9naWNfb3IgPSBsb2dpY19vciAuT1IuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIEVORCBzZWN0aW9ucworPC9vbXB0czpvcnBoYW4+CishJG9tcCBFTkQgcGFyYWxsZWwKKworICAgICAgICBJRiAobG9naWNfb3IpIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gbG9naWMgT1IgcGFydCAxIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBsb2dpY19vciA9IC5GQUxTRS4KKyAgICAgICAgbG9naWNzKExPT1BDT1VOVC8yKSA9IC5UUlVFLgorCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLm9yLjpsb2dpY19vcik8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTEsY3V0MQorICAgICAgICAgICBsb2dpY19vciA9IGxvZ2ljX29yIC5PUi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDIsY3V0MworICAgICAgICAgICBsb2dpY19vciA9IGxvZ2ljX29yIC5PUi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDQsTE9PUENPVU5UCisgICAgICAgICAgIGxvZ2ljX29yID0gbG9naWNfb3IgLk9SLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBFTkQgc2VjdGlvbnMKKzwvb21wdHM6b3JwaGFuPgorISRvbXAgRU5EIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCAuTk9ULiBsb2dpY19vciApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gbG9naWMgT1IgcGFydCAyIgorICAgICAgICBFTkQgSUYKKworIS4uLiBUZXN0IGxvZ2ljIEVRViwgdW5pcXVlIGluIEZvcnRyYW4KKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgIGxvZ2ljcyhpKSA9IC5UUlVFLgorICAgICAgICBFTkQgRE8KKworICAgICAgICBsb2dpY19lcXYgPSAuVFJVRS4KKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC5lcXYuOmxvZ2ljX2Vxdik8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gMSwgY3V0MQorICAgICAgICAgICBsb2dpY19lcXYgPSBsb2dpY19lcXYgLkVRVi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gY3V0MiwgY3V0MworICAgICAgICAgICBsb2dpY19lcXYgPSBsb2dpY19lcXYgLkVRVi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gY3V0NCwgTE9PUENPVU5UCisgICAgICAgICAgIGxvZ2ljX2VxdiA9IGxvZ2ljX2VxdiAuRVFWLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBFTkQgc2VjdGlvbnMKKzwvb21wdHM6b3JwaGFuPgorISRvbXAgRU5EIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKC5OT1QuIGxvZ2ljX2VxdikgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBFUVYgcGFydCAxIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBsb2dpY19lcXYgPSAuVFJVRS4KKyAgICAgICAgbG9naWNzKExPT1BDT1VOVC8yKSA9IC5GQUxTRS4KKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC5lcXYuOmxvZ2ljX2Vxdik8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTEsY3V0MQorICAgICAgICAgICBsb2dpY19lcXYgPSBsb2dpY19lcXYgLkVRVi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDIsY3V0MworICAgICAgICAgICBsb2dpY19lcXYgPSBsb2dpY19lcXYgLmVxdi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDQsTE9PUENPVU5UCisgICAgICAgICAgIGxvZ2ljX2VxdiA9IGxvZ2ljX2VxdiAuZXF2LiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBFTkQgc2VjdGlvbnMKKzwvb21wdHM6b3JwaGFuPgorISRvbXAgRU5EIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCBsb2dpY19lcXYgKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGxvZ2ljIEVRViBwYXJ0IDIiCisgICAgICAgIEVORCBJRgorCishLi4uIFRlc3QgbG9naWMgTkVRViwgd2hpY2ggaXMgdW5pcXVlIGluIEZvcnRyYW4KKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgIGxvZ2ljcyhpKSA9IC5mYWxzZS4KKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgbG9naWNfbmVxdiA9IC5mYWxzZS4KKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC5uZXF2Ljpsb2dpY19uZXF2KTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSAxLCBjdXQxCisgICAgICAgICAgIGxvZ2ljX25lcXYgPSBsb2dpY19uZXF2IC5ORVFWLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSBjdXQyLCBjdXQzCisgICAgICAgICAgIGxvZ2ljX25lcXYgPSBsb2dpY19uZXF2IC5ORVFWLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSBjdXQ0LCBMT09QQ09VTlQKKyAgICAgICAgICAgbG9naWNfbmVxdiA9IGxvZ2ljX25lcXYgLk5FUVYuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIEVORCBzZWN0aW9ucworPC9vbXB0czpvcnBoYW4+CishJG9tcCBFTkQgcGFyYWxsZWwKKworICAgICAgICBJRiAobG9naWNfbmVxdikgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBORVFWIHBhcnQgMSIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgbG9naWNfbmVxdiA9IC5GQUxTRS4KKyAgICAgICAgbG9naWNzKExPT1BDT1VOVC8yKSA9IC5UUlVFLgorCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLm5lcXYuOmxvZ2ljX25lcXYpPC9vbXB0czpjaGVjaz4KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT0xLGN1dDEKKyAgICAgICAgICAgbG9naWNfbmVxdiA9IGxvZ2ljX25lcXYgLk5FUVYuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT1jdXQyLGN1dDMKKyAgICAgICAgICAgbG9naWNfbmVxdiA9IGxvZ2ljX25lcXYgLk5FUVYuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT1jdXQ0LExPT1BDT1VOVAorICAgICAgICAgICBsb2dpY19uZXF2ID0gbG9naWNfbmVxdiAuTkVRVi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgRU5EIHNlY3Rpb25zCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIEVORCBwYXJhbGxlbAorCisgICAgICAgIElGICggLk5PVC4gbG9naWNfbmVxdiApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgd3JpdGUoMSwqKSAiRXJyb3IgaW4gbG9naWMgTkVRViBwYXJ0IDIiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICAgIGludF9hcnJheShpKSA9IDEKKyAgICAgICAgRU5EIERPCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihpYW5kOmJpdF9hbmQpPC9vbXB0czpjaGVjaz4KKyEuLi4gaWFuZChJLEopOiBSZXR1cm5zIHZhbHVlIHJlc3VsdGluZyBmcm9tIGJvb2xlYW4gQU5EIG9mCishLi4uIHBhaXIgb2YgYml0cyBpbiBlYWNoIG9mIEkgYW5kIEouCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9MSwgY3V0MQorICAgICAgICAgYml0X2FuZCA9IGlhbmQoYml0X2FuZCxpbnRfYXJyYXkoaSkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDIsIGN1dDMKKyAgICAgICAgIGJpdF9hbmQgPSBpYW5kKGJpdF9hbmQsaW50X2FycmF5KGkpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT1jdXQ0LCBMT09QQ09VTlQKKyAgICAgICAgIGJpdF9hbmQgPSBpYW5kKGJpdF9hbmQsaW50X2FycmF5KGkpKQorICAgICAgICBFTkQgRE8KKyEkb21wIEVORCBzZWN0aW9ucworPC9vbXB0czpvcnBoYW4+CishJG9tcCBFTkQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIGJpdF9hbmQgLmx0LiAxICkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICB3cml0ZSgxLCopICJFcnJvciBpbiBJQU5EIHBhcnQgMSIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgYml0X2FuZCA9IDEKKyAgICAgICAgaW50X2FycmF5KExPT1BDT1VOVC8yKSA9IDAKKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKGlhbmQ6Yml0X2FuZCk8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTEsIGN1dDEKKyAgICAgICAgICBiaXRfYW5kID0gaWFuZCAoIGJpdF9hbmQsIGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDIsIGN1dDMKKyAgICAgICAgICBiaXRfYW5kID0gaWFuZCAoIGJpdF9hbmQsIGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDQsIExPT1BDT1VOVAorICAgICAgICAgIGJpdF9hbmQgPSBpYW5kICggYml0X2FuZCwgaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBFTkQgc2VjdGlvbnMKKzwvb21wdHM6b3JwaGFuPgorISRvbXAgRU5EIHBhcmFsbGVsCisKKyAgICAgICAgSUYoIGJpdF9hbmQgLkdFLiAxKSBUSEVOCisgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBJQU5EIHBhcnQgMiIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgICBpbnRfYXJyYXkoaSkgPSAwCisgICAgICAgIEVORCBETworCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihpb3I6Yml0X29yKTwvb21wdHM6Y2hlY2s+CishLi4uIElvcihJLEopOiBSZXR1cm5zIHZhbHVlIHJlc3VsdGluZyBmcm9tIGJvb2xlYW4gT1Igb2YKKyEuLi4gcGFpciBvZiBiaXRzIGluIGVhY2ggb2YgSSBhbmQgSi4KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT0xLCBjdXQxCisgICAgICAgICAgYml0X29yID0gaW9yKGJpdF9vciwgaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9Y3V0MiwgY3V0MworICAgICAgICAgIGJpdF9vciA9IGlvcihiaXRfb3IsIGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDQsIExPT1BDT1VOVAorICAgICAgICAgIGJpdF9vciA9IGlvcihiaXRfb3IsIGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgRU5EIHNlY3Rpb25zCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIEVORCBwYXJhbGxlbAorCisgICAgICAgIElGICggYml0X29yIC5HRS4gMSkgVEhFTgorICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gSW9yIHBhcnQgMSIKKyAgICAgICAgRU5EIElGCisKKworICAgICAgICBiaXRfb3IgPSAwCisgICAgICAgIGludF9hcnJheShMT09QQ09VTlQvMikgPSAxCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oaW9yOmJpdF9vcik8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTEsIGN1dDEKKyAgICAgICAgICBiaXRfb3IgPSBJb3IoYml0X29yLCBpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT1jdXQyLCBjdXQzCisgICAgICAgICAgYml0X29yID0gSW9yKGJpdF9vciwgaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9Y3V0NCwgTE9PUENPVU5UCisgICAgICAgICAgYml0X29yID0gSW9yKGJpdF9vciwgaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBFTkQgc2VjdGlvbnMKKzwvb21wdHM6b3JwaGFuPgorISRvbXAgRU5EIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCBiaXRfb3IgLkxFLiAwKSBUSEVOCisgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBJb3IgcGFydCAyIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorICAgICAgICAgIGludF9hcnJheShpKSA9IDAKKyAgICAgICAgRU5EIERPCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihpZW9yOmV4Y2x1c2l2X2JpdF9vcik8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gMSwgY3V0MQorICAgICAgICAgICAgZXhjbHVzaXZfYml0X29yID0gaWVvcihleGNsdXNpdl9iaXRfb3IsIGludF9hcnJheShpKSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSBjdXQyLCBjdXQzCisgICAgICAgICAgICBleGNsdXNpdl9iaXRfb3IgPSBpZW9yKGV4Y2x1c2l2X2JpdF9vciwgaW50X2FycmF5KGkpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IGN1dDQsIExPT1BDT1VOVAorICAgICAgICAgICAgZXhjbHVzaXZfYml0X29yID0gaWVvcihleGNsdXNpdl9iaXRfb3IsIGludF9hcnJheShpKSkKKyAgICAgICAgRU5EIERPCishJG9tcCBFTkQgc2VjdGlvbnMKKzwvb21wdHM6b3JwaGFuPgorISRvbXAgRU5EIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCBleGNsdXNpdl9iaXRfb3IgLkdFLiAxKSBUSEVOCisgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gSWVvciBwYXJ0IDEiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIGV4Y2x1c2l2X2JpdF9vciA9IDAKKyAgICAgICAgaW50X2FycmF5KExPT1BDT1VOVC8yKSA9IDEKKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKGllb3I6ZXhjbHVzaXZfYml0X29yKTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSAxLCBjdXQxCisgICAgICAgICAgICBleGNsdXNpdl9iaXRfb3IgPSBpZW9yKGV4Y2x1c2l2X2JpdF9vciwgaW50X2FycmF5KGkpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IGN1dDIsIGN1dDMKKyAgICAgICAgICAgIGV4Y2x1c2l2X2JpdF9vciA9IGllb3IoZXhjbHVzaXZfYml0X29yLCBpbnRfYXJyYXkoaSkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gY3V0NCwgTE9PUENPVU5UCisgICAgICAgICAgICBleGNsdXNpdl9iaXRfb3IgPSBpZW9yKGV4Y2x1c2l2X2JpdF9vciwgaW50X2FycmF5KGkpKQorICAgICAgICBFTkQgRE8KKyEkb21wIEVORCBzZWN0aW9ucworPC9vbXB0czpvcnBoYW4+CishJG9tcCBFTkQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIGV4Y2x1c2l2X2JpdF9vciAuTEUuIDApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gSWVvciBwYXJ0IDIiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICAgaW50X2FycmF5KGkpID0gMTAgLSBpCisgICAgICAgIEVORCBETworCisgICAgICAgIG1pbl92YWx1ZSA9IDY1NTM1CisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihtaW46bWluX3ZhbHVlKTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSAxLCBjdXQxCisgICAgICAgICAgICBtaW5fdmFsdWUgPSBtaW4obWluX3ZhbHVlLGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gY3V0MiwgY3V0MworICAgICAgICAgICAgbWluX3ZhbHVlID0gbWluKG1pbl92YWx1ZSxpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IGN1dDQsIExPT1BDT1VOVAorICAgICAgICAgICAgbWluX3ZhbHVlID0gbWluKG1pbl92YWx1ZSxpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIEVORCBzZWN0aW9ucworPC9vbXB0czpvcnBoYW4+CishJG9tcCBFTkQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIG1pbl92YWx1ZSAuR1QuICgxMC1MT09QQ09VTlQpICkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBpbnRlZ2VyIE1JTiIKKyAgICAgICAgRU5EIElGCisKKworICAgICAgICBETyBpPTEsTE9PUENPVU5UCisgICAgICAgICAgIGludF9hcnJheShpKSA9IGkKKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgbWF4X3ZhbHVlID0gLTMyNzY4CisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihtYXg6bWF4X3ZhbHVlKTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSAxLCBjdXQxCisgICAgICAgICAgICBtYXhfdmFsdWUgPSBtYXgobWF4X3ZhbHVlLGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gY3V0MiwgY3V0MworICAgICAgICAgICAgbWF4X3ZhbHVlID0gbWF4KG1heF92YWx1ZSxpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IGN1dDQsIExPT1BDT1VOVAorICAgICAgICAgICAgbWF4X3ZhbHVlID0gbWF4KG1heF92YWx1ZSxpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIEVORCBzZWN0aW9ucworPC9vbXB0czpvcnBoYW4+CishJG9tcCBFTkQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIG1heF92YWx1ZSAuTFQuIExPT1BDT1VOVCApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gaW50ZWdlciBNQVgiCisgICAgICAgIEVORCBJRgorCishLi4uIHRlc3QgRE91YmxlIG1pbiwgbWF4CisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICAgZF9hcnJheShpKSA9IDEwIC0gaSpkdAorICAgICAgICBFTkQgRE8KKworICAgICAgICBkbWluID0gMioqMTAKKyAgICAgICAgZHQgPSAwLjUKKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKG1pbjpkbWluKTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSAxLCBjdXQxCisgICAgICAgICAgICBkbWluPSBtaW4oZG1pbixkX2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSBjdXQyLCBjdXQzCisgICAgICAgICAgICBkbWluPSBtaW4oZG1pbixkX2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSBjdXQ0LCBMT09QQ09VTlQKKyAgICAgICAgICAgIGRtaW49IG1pbihkbWluLGRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIEVORCBzZWN0aW9ucworPC9vbXB0czpvcnBoYW4+CishJG9tcCBFTkQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIGRtaW4gLkdULiAoMTAtZHQpICkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBET3VibGUgTUlOIgorICAgICAgICBFTkQgSUYKKworCisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICAgZF9hcnJheShpKSA9IGkgKiBkdAorICAgICAgICBFTkQgRE8KKworICAgICAgICBkbWF4PSAtICgyKioxMCkKKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKG1heDpkbWF4KTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSAxLCBjdXQxCisgICAgICAgICAgICBkbWF4PSBtYXgoZG1heCxkX2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSBjdXQyLCBjdXQzCisgICAgICAgICAgICBkbWF4PSBtYXgoZG1heCxkX2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSBjdXQ0LCBMT09QQ09VTlQKKyAgICAgICAgICAgIGRtYXg9IG1heChkbWF4LGRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIEVORCBzZWN0aW9ucworPC9vbXB0czpvcnBoYW4+CishJG9tcCBFTkQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIGRtYXggLkxULiBMT09QQ09VTlQqZHQgKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIERPdWJsZSBNQVgiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIElGICggcmVzdWx0IC5FUS4gMCApIFRIRU4KKyAgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9ICAxCisgICAgICAgIEVMU0UKKyAgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9ICAwCisgICAgICAgIEVORCBJRgorCisgICAgICAgIENMT1NFKDIpCisKKyAgICAgIEVORCBGVU5DVElPTgorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL3NpbmdsZV9jb3B5cHJpdmF0ZS5mIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vc2luZ2xlX2NvcHlwcml2YXRlLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg3OGE2NgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL3NpbmdsZV9jb3B5cHJpdmF0ZS5mCkBAIC0wLDAgKzEsNDEgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHNpbmdsZSBjb3B5cHJpdmF0ZSBkaXJlY3RpdmUuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBzaW5nbGUgY29weXByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgcGFybGxlbCxvbXAgY3JpdGljYWw8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPnNpbmdsZV9jb3B5cHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5URUdFUiBvbXBfZ2V0X3RocmVhZF9udW0KKyAgICAgICAgSU5DTFVERSAib21wX3Rlc3RzdWl0ZS5mIgorPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBJTlRFR0VSIGksaix0aHJlYWQsbnJfaXRlcmF0aW9ucyxyZXN1bHQKKyAgICAgICAgQ09NTU9OIC9vcnBodmFycy8gbnJfaXRlcmF0aW9ucyxyZXN1bHQKKzwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICAgICAgcmVzdWx0PTAKKyAgICAgICAgbnJfaXRlcmF0aW9ucz0wCisKKyEkb21wIHBhcmFsbGVsIHByaXZhdGUoaSxqLHRocmVhZCkKKyAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgRE8gaT0wLExPT1BDT1VOVC0xCisgICAgICAgICAgdGhyZWFkPU9NUF9HRVRfVEhSRUFEX05VTSgpCishJG9tcCBzaW5nbGUgCisgICAgICAgICAgbnJfaXRlcmF0aW9ucz1ucl9pdGVyYXRpb25zKzEKKyAgICAgICAgICBqPWkKKyEkb21wIGVuZCBzaW5nbGUgPG9tcHRzOmNoZWNrPmNvcHlwcml2YXRlKGopPC9vbXB0czpjaGVjaz4KKyEkb21wIGNyaXRpY2FsCisgICAgICAgICAgcmVzdWx0PXJlc3VsdCtqLWk7CishJG9tcCBlbmQgY3JpdGljYWwKKyAgICAgICAgRU5EIERPCisgICAgICAgIDwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisgICAgICAgIElGKHJlc3VsdCAuRVEuIDAgLkFORC4gCisgICAgICYgICAgIG5yX2l0ZXJhdGlvbnMgLkVRLiBMT09QQ09VTlQpIFRIRU4KKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+PTEKKyAgICAgICAgRUxTRQorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT49MAorICAgICAgICBFTkQgSUYKKyAgICAgIEVORCBGVU5DVElPTgorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL3NpbmdsZV9ub3dhaXQuZiBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL3NpbmdsZV9ub3dhaXQuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTQ0YWY1Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vc2luZ2xlX25vd2FpdC5mCkBAIC0wLDAgKzEsNTAgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHNpbmdsZSBub3dhaXQ8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgY3JpdGljYWwsb21wIGF0b21pYzwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+c2luZ2xlX25vd2FpdDwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5URUdFUiByZXN1bHQsIHRvdGFsX2l0ZXJhdGlvbnMsIG15X2l0ZXJhdGlvbnMsaQorICAgICAgICBJTkNMVURFICJvbXBfdGVzdHN1aXRlLmYiCis8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIElOVEVHRVIgbnJfaXRlcmF0aW9ucworICAgICAgICBDT01NT04gL29ycGh2YXJzLyBucl9pdGVyYXRpb25zCis8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgICAgIHJlc3VsdD0wCisgICAgICAgIG5yX2l0ZXJhdGlvbnM9MAorICAgICAgICB0b3RhbF9pdGVyYXRpb25zPTAKKyAgICAgICAgbXlfaXRlcmF0aW9ucz0wCisKKyEkb21wIHBhcmFsbGVsIHByaXZhdGUoaSkKKyAgICAgICAgRE8gaT0wLCBMT09QQ09VTlQgLTEKKyAgICAgICAgPG9tcHRzOm9ycGhhbj4KKzxvbXB0czpjaGVjaz4hJG9tcCBzaW5nbGU8L29tcHRzOmNoZWNrPgorISRvbXAgYXRvbWljCisgICAgICAgICAgbnJfaXRlcmF0aW9ucyA9IG5yX2l0ZXJhdGlvbnMgKyAxCis8b21wdHM6Y2hlY2s+ISRvbXAgZW5kIHNpbmdsZSBub3dhaXQ8L29tcHRzOmNoZWNrPgorICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwKKyEkb21wIHBhcmFsbGVsIHByaXZhdGUoaSxteV9pdGVyYXRpb25zKQorICAgICAgICBteV9pdGVyYXRpb25zID0gMAorICAgICAgICBETyBpPTAsIExPT1BDT1VOVCAtMQorPG9tcHRzOmNoZWNrPiEkb21wIHNpbmdsZTwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgbXlfaXRlcmF0aW9ucyA9IG15X2l0ZXJhdGlvbnMgKyAxCis8b21wdHM6Y2hlY2s+ISRvbXAgZW5kIHNpbmdsZSBub3dhaXQ8L29tcHRzOmNoZWNrPgorICAgICAgICBFTkQgRE8KKyEkb21wIGNyaXRpY2FsCisgICAgICAgIHRvdGFsX2l0ZXJhdGlvbnMgPSB0b3RhbF9pdGVyYXRpb25zICsgbXlfaXRlcmF0aW9ucworISRvbXAgZW5kIGNyaXRpY2FsCishJG9tcCBlbmQgcGFyYWxsZWwKKyAgICAgICAgSUYgKCBucl9pdGVyYXRpb25zIC5FUS4gTE9PUENPVU5UIC5BTkQuCisgICAgICYgICAgIHRvdGFsX2l0ZXJhdGlvbnMgLkVRLiBMT09QQ09VTlQgKSBUSEVOCisgICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorICAgICAgICBFTFNFCisgICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorICAgICAgICBFTkQgSUYKKyAgICAgIEVORCBGVU5DVElPTgorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL3NpbmdsZV9wcml2YXRlLmYgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9zaW5nbGVfcHJpdmF0ZS5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhZDRhNmEKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9zaW5nbGVfcHJpdmF0ZS5mCkBAIC0wLDAgKzEsNTEgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHNpbmdsZSBwcml2YXRlIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHNpbmdlbCBwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsLG9tcCBmbHVzaCxvbXAgc2luZ2xlIG5vd2FpdDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5zaW5nbGVfcHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5URUdFUiBucl9pdGVyYXRpb25zLCBpCisJCTxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5URUdFUiByZXN1bHQKKyAgICAgICAgSU5URUdFUiBucl90aHJlYWRzX2luX3NpbmdsZSwgbXlyZXN1bHQsIG15aXQKKyAgICAgICAgQ09NTU9OIC9vcnBodmFycy8gcmVzdWx0LG5yX2l0ZXJhdGlvbnMKKwkJPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5DTFVERSAib21wX3Rlc3RzdWl0ZS5mIgorICAgICAgICBucl90aHJlYWRzX2luX3NpbmdsZT0wCisgICAgICAgIHJlc3VsdD0wCisgICAgICAgIG15cmVzdWx0PTAKKyAgICAgICAgbXlpdD0wCisgICAgICAgIG5yX2l0ZXJhdGlvbnM9MAorISRvbXAgcGFyYWxsZWwgcHJpdmF0ZShpLCBteXJlc3VsdCwgbXlpdCkKKzxvbXB0czpvcnBoYW4+CisgICAgICAgIG15cmVzdWx0ID0gMAorICAgICAgICBteWl0ID0gMAorICAgICAgICBucl90aHJlYWRzX2luX3NpbmdsZT0wCishJG9tcCBiYXJyaWVyCisgICAgICAgIERPIGk9MCwgTE9PUENPVU5UIC0xCishJG9tcCBzaW5nbGUgPG9tcHRzOmNoZWNrPnByaXZhdGUobnJfdGhyZWFkc19pbl9zaW5nbGUpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICBucl90aHJlYWRzX2luX3NpbmdsZSA9IDAKKyEkb21wIGZsdXNoCisgICAgICAgICAgbnJfdGhyZWFkc19pbl9zaW5nbGUgPSBucl90aHJlYWRzX2luX3NpbmdsZSArIDEKKyEkb21wIGZsdXNoCisgICAgICAgICAgbXlpdCA9IG15aXQgKyAxCisgICAgICAgICAgbXlyZXN1bHQgPSBteXJlc3VsdCArIG5yX3RocmVhZHNfaW5fc2luZ2xlCishJG9tcCBlbmQgc2luZ2xlIG5vd2FpdAorICAgICAgICBFTkQgRE8KKyEkb21wIGNyaXRpY2FsCisgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIG5yX3RocmVhZHNfaW5fc2luZ2xlCisgICAgICAgIG5yX2l0ZXJhdGlvbnMgPSBucl9pdGVyYXRpb25zICsgbXlpdAorISRvbXAgZW5kIGNyaXRpY2FsCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorICAgICAgICBXUklURSgxLCopICJyZXN1bHQgaXMiLHJlc3VsdCwibnJfaXQgaXMiLG5yX2l0ZXJhdGlvbnMKKyAgICAgICAgSUYgKCByZXN1bHQgLkVRLiAwIC5BTkQuIG5yX2l0ZXJhdGlvbnMgLkVRLiBMT09QQ09VTlQpIFRIRU4KKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorICAgICAgICBFTFNFCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKyAgICAgICAgRU5EIElGCisgICAgICBFTkQKKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi90ZXN0bGlzdC1mLnR4dCBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL3Rlc3RsaXN0LWYudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNzY2ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi90ZXN0bGlzdC1mLnR4dApAQCAtMCwwICsxLDQ1IEBACitkb19maXJzdHByaXZhdGUuZgorZG9fbGFzdHByaXZhdGUKK2RvX29yZGVyZWQKK2RvX3ByaXZhdGUKK2RvX3JlZHVjdGlvbgorI2RvX3NjaGVkdWxlX2R5bmFtaWMKKyNkb19zY2hlZHVsZV9ndWlkZWQKKyNkb19zY2hlZHVsZV9zdGF0aWMKK2hhc19vcGVubXAKKyNvbXBfYXRvbWljCitvbXBfYmFycmllcgorb21wX2NvcHlpbgorb21wX2NyaXRpY2FsCisjb21wX2ZsdXNoCitvbXBfZ2V0X251bV90aHJlYWRzCitvbXBfaW5fcGFyYWxsZWwKK29tcF9sb2NrCitvbXBfbWFzdGVyCitvbXBfbmVzdF9sb2NrCitvbXBfbmVzdF90ZXN0bG9jaworb21wX25lc3RlZAorb21wX251bV90aHJlYWRzCitvbXBfdGVzdGxvY2sKK29tcF90ZXN0c3VpdGUKK29tcF90aHJlYWRwcml2YXRlCisjb21wX3RpY2tzX3RpbWUKKyNvbXBfd29ya3NoYXJlCisjb21wX3d0aW1lCisjcGFyX2RvZmlyc3Rwcml2YXRlCisjcGFyX2RvX2xhc3Rwcml2YXRlCisjcGFyX2RvX29yZGVyZWQKKyNwYXJfZG9fcHJpdmF0ZQorI3Bhcl9kb19yZWR1Y3Rpb24KKyNwYXJfc2VjdGlvbmlyc3Rwcml2YXRlLmYKKyNwYXJfc2VjdGlvbl9sYXN0cHJpdmF0ZQorI3Bhcl9zZWN0aW9uX3ByaXZhdGUKKyNwYXJfc2VjdGlvbl9yZWR1Y3Rpb24KKyNzZWN0aW9uaXJzdHByaXZhdGUuZgorI3NlY3Rpb25fbGFzdHByaXZhdGUKKyNzZWN0aW9uX3ByaXZhdGUKKyNzZWN0aW9uX3JlZHVjdGlvbgorI3NpbmdsZQorI3NpbmdsZV9jb3B5cHJpdmF0ZQorI3NpbmdsZV9ub3dhaXQKKyNzaW5nbGVfcHJpdmF0ZQpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL29tcF9teV9zbGVlcC5mIGIvZmluYWwvdGVzdHN1aXRlL29tcF9teV9zbGVlcC5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzY2IwNGIKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvb21wX215X3NsZWVwLmYKQEAgLTAsMCArMSwyNiBAQAorISBVdGlsaXR5IGZ1bmN0aW9ucyB0byBoYXZlIGEgc2xlZXAgZnVuY3Rpb24gd2l0aCBiZXR0ZXIgcmVzb2x1dGlvbiBhbmQKKyEgd2hpY2ggb25seSBzdG9wcyBvbmUgdGhyZWFkLgorCisgICAgICBzdWJyb3V0aW5lIG15X3NsZWVwKHNsZWVwdGltZSkKKyAgICAgICAgaW1wbGljaXQgbm9uZQorICAgICAgICBkb3VibGUgcHJlY2lzaW9uIDo6IHNsZWVwdGltZQorICAgICAgICBpbnRlZ2VyIDo6IHUKKyAgICAgICAgaW50ZWdlciA6OiB0KDgpCisgICAgICAgIGludGVnZXIgOjogbXMxLCBtczIKKyAgICAgICAgaW50ZWdlciA6OiBjbnQKKworICAgICAgICB1ID0gc2xlZXB0aW1lICogMTAwMAorCisgICAgICAgIGNhbGwgZGF0ZV9hbmRfdGltZSh2YWx1ZXM9dCkKKworICAgICAgICAhIGNhbGN1bGF0ZSBzdGFydCB0aW1lIGluIG1zCisgICAgICAgIG1zMSA9IHQoOCkgKyB0KDcpKjEwMDAgKyB0KDYpKjYwMDAwICsgdCg1KSozNjAwMDAwCisKKyAgICAgICAgbXMyID0gbXMxCisgICAgICAgIGNudCA9IDAKKyAgICAgICAgZG8gd2hpbGUgKCAobXMyIC0gbXMxKSA8IHUpCisgICAgICAgICAgICBjYWxsIGRhdGVfYW5kX3RpbWUodmFsdWVzPXQpCisgICAgICAgICAgICBtczIgPSB0KDgpICsgdCg3KSoxMDAwICsgdCg2KSo2MDAwMCArIHQoNSkqMzYwMDAwMAorICAgICAgICAgICAgY250ID0gY250KzEKKyAgICAgICAgZW5kIGRvCisgICAgICBlbmQgc3Vicm91dGluZQpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL29tcF9teV9zbGVlcC5oIGIvZmluYWwvdGVzdHN1aXRlL29tcF9teV9zbGVlcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzOTBhNWIKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvb21wX215X3NsZWVwLmgKQEAgLTAsMCArMSwzNSBAQAorI2lmbmRlZiBNWV9TTEVFUF9ICisjZGVmaW5lIE1ZX1NMRUVQX0gKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZTxzdGRsaWIuaD4KKyNpbmNsdWRlPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8c3lzL3RpbWVzLmg+IAorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKy8qISBVdGlsaXR5IGZ1bmN0aW9uIHRvIGhhdmUgYSBzbGVlcCBmdW5jdGlvbiB3aXRoIGJldHRlciByZXNvbHV0aW9uIGFuZCB3aGljaCBvbmx5IHN0b3BzIG9uZSB0aHJlYWQuICovCisKK3N0YXRpYyB2b2lkIG15X3NsZWVwKGRvdWJsZSBzbGVlcHRpbWUpeworICBzdHJ1Y3QgdGltZXZhbCB0djsKKyAgc3RydWN0IHRpbWV6b25lIHR6cDsKKyAgZG91YmxlIHN0YXJ0OworICBkb3VibGUgcmVhbDsKKyAgaWYoZ2V0dGltZW9mZGF5KCZ0diwmdHpwKSE9MCkgeworICAgIHBlcnJvcigiZ2V0X3RpbWU6ICIpOworICAgIGV4aXQoLTEpOworICB9CisgIHN0YXJ0ID0gKGRvdWJsZSl0di50dl9zZWMgKyAoKGRvdWJsZSl0di50dl91c2VjLzEwMDAwMDAuMCk7CisgIHJlYWw9c3RhcnQ7CisgIHdoaWxlKCAocmVhbC1zdGFydCk8c2xlZXB0aW1lKXsKKyAgICBpZihnZXR0aW1lb2ZkYXkoJnR2LCZ0enApIT0wKSB7CisgICAgICBwZXJyb3IoImdldF90aW1lOiAiKTsKKyAgICAgIGV4aXQoLTEpOworICAgIH0KKyAgICByZWFsID0gKGRvdWJsZSl0di50dl9zZWMgKyAoKGRvdWJsZSl0di50dl91c2VjLzEwMDAwMDAuMCk7CisgIH0KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvb21wX3Rlc3RzdWl0ZS5mIGIvZmluYWwvdGVzdHN1aXRlL29tcF90ZXN0c3VpdGUuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTM1MzEzCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL29tcF90ZXN0c3VpdGUuZgpAQCAtMCwwICsxLDE0IEBACisgICAgICBJTlRFR0VSIE4gIVRoZSBudW1iZXIgb2YgdGltZXMgZWFjaCB0ZXN0IGlzIHJ1bgorICAgICAgUEFSQU1FVEVSIChOPTEpCisgICAgICBDSEFSQUNURVIqOCBPTVBUU19WRVJTSU9OCisgICAgICBQQVJBTUVURVIgKE9NUFRTX1ZFUlNJT049IjMuMC5hIikKKyAgICAgIElOVEVHRVIgTE9PUENPVU5UICFUaGUgbnVtYmVyIG9mIHRpbWVzIGVhY2ggbG9vcCBpcyBydW4KKyAgICAgIFBBUkFNRVRFUiAoTE9PUENPVU5UPTEwMDApCisgICAgICBET1VCTEUgUFJFQ0lTSU9OIFNMRUVQVElNRQorICAgICAgUEFSQU1FVEVSIChTTEVFUFRJTUUgPSAuMDEpCisgICAgICBET1VCTEUgUFJFQ0lTSU9OIFNMRUVQVElNRV9MT05HCisgICAgICBQQVJBTUVURVIgKFNMRUVQVElNRV9MT05HID0gMC41KQorICAgICAgSU5URUdFUiBOVU1fVEFTS1MKKyAgICAgIFBBUkFNRVRFUiAoTlVNX1RBU0tTPTI1KQorICAgICAgSU5URUdFUiBNQVhfVEFTS1NfUEVSX1RIUkVBRAorICAgICAgUEFSQU1FVEVSIChNQVhfVEFTS1NfUEVSX1RIUkVBRD01KQpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL29tcF90ZXN0c3VpdGUuaCBiL2ZpbmFsL3Rlc3RzdWl0ZS9vbXBfdGVzdHN1aXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ExODY2ZQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9vbXBfdGVzdHN1aXRlLmgKQEAgLTAsMCArMSwxNjQgQEAKKy8qIEdsb2JhbCBoZWFkZXJmaWxlIG9mIHRoZSBPcGVuTVAgVGVzdHN1aXRlICovCisKKy8qIFRoaXMgZmlsZSB3YXMgY3JlYXRlZCB3aXRoIHRoZSBvbXB0c19tYWtlSGVhZGVyLnBsIHNjcmlwdCB1c2luZyB0aGUgZm9sbG93aW5nIG9waW9uczogKi8KKy8qIC1mPW9tcHRzLWMuY29uZiAtdD1jICAqLworCisKKyNpZm5kZWYgT01QX1RFU1RTVUlURV9ICisjZGVmaW5lIE9NUF9URVNUU1VJVEVfSAorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxvbXAuaD4KKworLyogVmVyc2lvbiBpbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgT01QVFNfVkVSU0lPTiAiMy4wYSIKKworLyogR2VuZXJhbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgTE9PUENPVU5UIAkxMDAwCisjZGVmaW5lIFJFUEVUSVRJT05TIAkgIDIwCisvKiBmb2xsb3dpbmcgdGltZXMgYXJlIGluIHNlY29uZHMgKi8KKyNkZWZpbmUgU0xFRVBUSU1FCSAwLjAxCisjZGVmaW5lIFNMRUVQVElNRV9MT05HCSAwLjUKKworLyogRGVmaW5pdGlvbnMgZm9yIHRhc2tzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgTlVNX1RBU0tTICAgICAgICAgICAgICAyNQorI2RlZmluZSBNQVhfVEFTS1NfUEVSX1RIUkVBRCAgICA1CitpbnQgdGVzdF9vbXBfbmVzdGVkKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcF9uZXN0ZWQgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX25lc3RlZChGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcF9uZXN0ZWQgKi8KK2ludCB0ZXN0X29tcF9uZXN0X2xvY2soRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wX25lc3RfbG9jayAqLworaW50IGNyb3NzdGVzdF9vbXBfbmVzdF9sb2NrKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wX25lc3RfbG9jayAqLworaW50IHRlc3Rfb21wX3Rhc2tfaWYoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHRhc2sgaWYgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3Rhc2tfaWYoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgdGFzayBpZiAqLworaW50IHRlc3Rfb21wX3BhcmFsbGVsX3NoYXJlZChGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgcGFyYWxsZWwgc2hhcmVkICovCitpbnQgY3Jvc3N0ZXN0X29tcF9wYXJhbGxlbF9zaGFyZWQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgcGFyYWxsZWwgc2hhcmVkICovCitpbnQgdGVzdF9vbXBfc2luZ2xlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBzaW5nbGUgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3NpbmdsZShGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBzaW5nbGUgKi8KK2ludCB0ZXN0X29tcF9wYXJhbGxlbF9zZWN0aW9uc19yZWR1Y3Rpb24oRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHBhcmFsbGVsIHNlY3Rpb25zIHJlZHVjdGlvbiAqLworaW50IGNyb3NzdGVzdF9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfcmVkdWN0aW9uKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHBhcmFsbGVsIHNlY3Rpb25zIHJlZHVjdGlvbiAqLworaW50IHRlc3Rfb21wX2Zvcl9zY2hlZHVsZV9keW5hbWljKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBmb3Igc2NoZWR1bGUoZHluYW1pYykgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX2Zvcl9zY2hlZHVsZV9keW5hbWljKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIGZvciBzY2hlZHVsZShkeW5hbWljKSAqLworaW50IHRlc3RfaGFzX29wZW5tcChGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBfT1BFTk1QICovCitpbnQgY3Jvc3N0ZXN0X2hhc19vcGVubXAoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBfT1BFTk1QICovCitpbnQgdGVzdF9vbXBfdGFza3dhaXQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHRhc2t3YWl0ICovCitpbnQgY3Jvc3N0ZXN0X29tcF90YXNrd2FpdChGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCB0YXNrd2FpdCAqLworaW50IHRlc3Rfb21wX3BhcmFsbGVsX2Zvcl9sYXN0cHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgcGFyYWxsZWwgZm9yIGxhc3Rwcml2YXRlICovCitpbnQgY3Jvc3N0ZXN0X29tcF9wYXJhbGxlbF9mb3JfbGFzdHByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgcGFyYWxsZWwgZm9yIGxhc3Rwcml2YXRlICovCitpbnQgdGVzdF9vbXBfZm9yX3NjaGVkdWxlX3N0YXRpY18zKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBmb3Igc2NoZWR1bGUoc3RhdGljKSAqLworaW50IGNyb3NzdGVzdF9vbXBfZm9yX3NjaGVkdWxlX3N0YXRpY18zKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIGZvciBzY2hlZHVsZShzdGF0aWMpICovCitpbnQgdGVzdF9vbXBfY3JpdGljYWwoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIGNyaXRpY2FsICovCitpbnQgY3Jvc3N0ZXN0X29tcF9jcml0aWNhbChGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBjcml0aWNhbCAqLworaW50IHRlc3Rfb21wX3BhcmFsbGVsX3NlY3Rpb25zX2xhc3Rwcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBsYXN0cHJpdmF0ZSAqLworaW50IGNyb3NzdGVzdF9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfbGFzdHByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgbGFzdHByaXZhdGUgKi8KK2ludCB0ZXN0X29tcF9wYXJhbGxlbF9udW1fdGhyZWFkcyhGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgcGFyZWxsZWwgbnVtX3RocmVhZHMgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3BhcmFsbGVsX251bV90aHJlYWRzKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHBhcmVsbGVsIG51bV90aHJlYWRzICovCitpbnQgdGVzdF9vbXBfc2VjdGlvbnNfcmVkdWN0aW9uKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBzZWN0aW9ucyByZWR1Y3Rpb24gKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3NlY3Rpb25zX3JlZHVjdGlvbihGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBzZWN0aW9ucyByZWR1Y3Rpb24gKi8KK2ludCB0ZXN0X29tcF9wYXJhbGxlbF9pZihGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgcGFyYWxsZWwgaWYgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3BhcmFsbGVsX2lmKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHBhcmFsbGVsIGlmICovCitpbnQgdGVzdF9vbXBfdGFza19pbXBfc2hhcmVkKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCB0YXNrICovCitpbnQgY3Jvc3N0ZXN0X29tcF90YXNrX2ltcF9zaGFyZWQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgdGFzayAqLworaW50IHRlc3Rfb21wX3NlY3Rpb25fbGFzdHByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHNlY3Rpb24gbGFzdHByaXZhdGUgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3NlY3Rpb25fbGFzdHByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgc2VjdGlvbiBsYXN0cHJpdmF0ZSAqLworaW50IHRlc3Rfb21wX2Zvcl9jb2xsYXBzZShGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgZm9yIGNvbGxhcHNlICovCitpbnQgY3Jvc3N0ZXN0X29tcF9mb3JfY29sbGFwc2UoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgZm9yIGNvbGxhcHNlICovCitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfZm9yX2ZpcnN0cHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgcGFyYWxsZWwgZm9yIGZpcnN0cHJpdmF0ZSAqLworaW50IGNyb3NzdGVzdF9vbXBfcGFyYWxsZWxfZm9yX2ZpcnN0cHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBwYXJhbGxlbCBmb3IgZmlyc3Rwcml2YXRlICovCitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfY29weWluKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBwYXJhbGxlbCBjb3B5aW4gKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3BhcmFsbGVsX2NvcHlpbihGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBwYXJhbGxlbCBjb3B5aW4gKi8KK2ludCB0ZXN0X29tcF90ZXN0X25lc3RfbG9jayhGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXBfdGVzdF9uZXN0X2xvY2sgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3Rlc3RfbmVzdF9sb2NrKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wX3Rlc3RfbmVzdF9sb2NrICovCitpbnQgdGVzdF9vbXBfZm9yX29yZGVyZWQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIGZvciBvcmRlcmVkICovCitpbnQgY3Jvc3N0ZXN0X29tcF9mb3Jfb3JkZXJlZChGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBmb3Igb3JkZXJlZCAqLworaW50IHRlc3Rfb21wX3BhcmFsbGVsX3JlZHVjdGlvbihGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgcGFyYWxsZWwgcmVkdWN0aW9uICovCitpbnQgY3Jvc3N0ZXN0X29tcF9wYXJhbGxlbF9yZWR1Y3Rpb24oRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgcGFyYWxsZWwgcmVkdWN0aW9uICovCitpbnQgdGVzdF9vbXBfZ2V0X3d0aWNrKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcF9nZXRfd3RpY2sgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX2dldF93dGljayhGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcF9nZXRfd3RpY2sgKi8KK2ludCB0ZXN0X29tcF90YXNreWllbGQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHRhc2t5aWVsZCAqLworaW50IGNyb3NzdGVzdF9vbXBfdGFza3lpZWxkKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHRhc2t5aWVsZCAqLworaW50IHRlc3Rfb21wX2Zvcl9zY2hlZHVsZV9zdGF0aWMoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIGZvciBzY2hlZHVsZShzdGF0aWMpICovCitpbnQgY3Jvc3N0ZXN0X29tcF9mb3Jfc2NoZWR1bGVfc3RhdGljKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIGZvciBzY2hlZHVsZShzdGF0aWMpICovCitpbnQgdGVzdF9vbXBfc2luZ2xlX3ByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHNpbmdlbCBwcml2YXRlICovCitpbnQgY3Jvc3N0ZXN0X29tcF9zaW5nbGVfcHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBzaW5nZWwgcHJpdmF0ZSAqLworaW50IHRlc3Rfb21wX2Zvcl9maXJzdHByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIGZvciBmaXJzdHByaXZhdGUgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX2Zvcl9maXJzdHByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgZm9yIGZpcnN0cHJpdmF0ZSAqLworaW50IHRlc3Rfb21wX3BhcmFsbGVsX2Zvcl9yZWR1Y3Rpb24oRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHBhcmFsbGVsIGZvciByZWR1Y3Rpb24gKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3BhcmFsbGVsX2Zvcl9yZWR1Y3Rpb24oRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgcGFyYWxsZWwgZm9yIHJlZHVjdGlvbiAqLworaW50IHRlc3Rfb21wX3BhcmFsbGVsX2Zvcl9pZihGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgcGFyYWxsZWwgZm9yIGlmICovCitpbnQgY3Jvc3N0ZXN0X29tcF9wYXJhbGxlbF9mb3JfaWYoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgcGFyYWxsZWwgZm9yIGlmICovCitpbnQgdGVzdF9vbXBfc2luZ2xlX25vd2FpdChGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgc2luZ2xlIG5vd2FpdCAqLworaW50IGNyb3NzdGVzdF9vbXBfc2luZ2xlX25vd2FpdChGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBzaW5nbGUgbm93YWl0ICovCitpbnQgdGVzdF9vbXBfdGFza19maXJzdHByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHRhc2sgZmlyc3Rwcml2YXRlICovCitpbnQgY3Jvc3N0ZXN0X29tcF90YXNrX2ZpcnN0cHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCB0YXNrIGZpcnN0cHJpdmF0ZSAqLworaW50IHRlc3Rfb21wX2Zvcl9ub3dhaXQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHBhcmFsbGVsIGZvciBub3dhaXQgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX2Zvcl9ub3dhaXQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgcGFyYWxsZWwgZm9yIG5vd2FpdCAqLworaW50IHRlc3Rfb21wX3Rhc2tfcHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgdGFzayBwcml2YXRlICovCitpbnQgY3Jvc3N0ZXN0X29tcF90YXNrX3ByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgdGFzayBwcml2YXRlICovCitpbnQgdGVzdF9vbXBfdGVzdF9sb2NrKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcF90ZXN0X2xvY2sgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3Rlc3RfbG9jayhGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcF90ZXN0X2xvY2sgKi8KK2ludCB0ZXN0X29tcF9nZXRfd3RpbWUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wX2dldF93dGltZSAqLworaW50IGNyb3NzdGVzdF9vbXBfZ2V0X3d0aW1lKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wX2dldF93dGltZSAqLworaW50IHRlc3Rfb21wX3Rhc2tfaW1wX2ZpcnN0cHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgdGFzayAqLworaW50IGNyb3NzdGVzdF9vbXBfdGFza19pbXBfZmlyc3Rwcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHRhc2sgKi8KK2ludCB0ZXN0X29tcF9hdG9taWMoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIGF0b21pYyAqLworaW50IGNyb3NzdGVzdF9vbXBfYXRvbWljKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIGF0b21pYyAqLworaW50IHRlc3Rfb21wX3RocmVhZHByaXZhdGVfZm9yKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCB0aHJlYWRwcml2YXRlICovCitpbnQgY3Jvc3N0ZXN0X29tcF90aHJlYWRwcml2YXRlX2ZvcihGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCB0aHJlYWRwcml2YXRlICovCitpbnQgdGVzdF9vbXBfc2luZ2xlX2NvcHlwcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBzaW5nbGUgY29weXByaXZhdGUgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3NpbmdsZV9jb3B5cHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBzaW5nbGUgY29weXByaXZhdGUgKi8KK2ludCB0ZXN0X29tcF9tYXN0ZXIoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIG1hc3RlciAqLworaW50IGNyb3NzdGVzdF9vbXBfbWFzdGVyKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIG1hc3RlciAqLworaW50IHRlc3Rfb21wX3BhcmFsbGVsX2ZpcnN0cHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgcGFyYWxsZWwgZmlyc3Rwcml2YXRlICovCitpbnQgY3Jvc3N0ZXN0X29tcF9wYXJhbGxlbF9maXJzdHByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgcGFyYWxsZWwgZmlyc3Rwcml2YXRlICovCitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfZm9yX3ByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHBhcmFsbGVsIGZvciBwcml2YXRlICovCitpbnQgY3Jvc3N0ZXN0X29tcF9wYXJhbGxlbF9mb3JfcHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBwYXJhbGxlbCBmb3IgcHJpdmF0ZSAqLworaW50IHRlc3Rfb21wX3BhcmFsbGVsX2RlZmF1bHQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHBhcmFsbGVsIGRlZmF1bHQgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3BhcmFsbGVsX2RlZmF1bHQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgcGFyYWxsZWwgZGVmYXVsdCAqLworaW50IHRlc3Rfb21wX3BhcmFsbGVsX2Zvcl9vcmRlcmVkKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBwYXJhbGxlbCBmb3Igb3JkZXJlZCAqLworaW50IGNyb3NzdGVzdF9vbXBfcGFyYWxsZWxfZm9yX29yZGVyZWQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgcGFyYWxsZWwgZm9yIG9yZGVyZWQgKi8KK2ludCB0ZXN0X29tcF9mb3JfbGFzdHByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIGZvciBsYXN0cHJpdmF0ZSAqLworaW50IGNyb3NzdGVzdF9vbXBfZm9yX2xhc3Rwcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIGZvciBsYXN0cHJpdmF0ZSAqLworaW50IHRlc3Rfb21wX2xvY2soRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wX2xvY2sgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX2xvY2soRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXBfbG9jayAqLworaW50IHRlc3Rfb21wX2JhcnJpZXIoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIGJhcnJpZXIgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX2JhcnJpZXIoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgYmFycmllciAqLworaW50IHRlc3Rfb21wX3NlY3Rpb25zX25vd2FpdChGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgbm93YWl0ICovCitpbnQgY3Jvc3N0ZXN0X29tcF9zZWN0aW9uc19ub3dhaXQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgbm93YWl0ICovCitpbnQgdGVzdF9vbXBfbWFzdGVyXzMoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIG1hc3RlciAqLworaW50IGNyb3NzdGVzdF9vbXBfbWFzdGVyXzMoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgbWFzdGVyICovCitpbnQgdGVzdF9vbXBfdGFza191bnRpZWQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHRhc2sgdW50aWVkICovCitpbnQgY3Jvc3N0ZXN0X29tcF90YXNrX3VudGllZChGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCB0YXNrIHVudGllZCAqLworaW50IHRlc3Rfb21wX3Rhc2soRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHRhc2sgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3Rhc2soRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgdGFzayAqLworaW50IHRlc3Rfb21wX2luX3BhcmFsbGVsKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcF9pbl9wYXJhbGxlbCAqLworaW50IGNyb3NzdGVzdF9vbXBfaW5fcGFyYWxsZWwoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXBfaW5fcGFyYWxsZWwgKi8KK2ludCB0ZXN0X29tcF9wYXJhbGxlbF9zZWN0aW9uc19maXJzdHByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHBhcmFsbGVsIHNlY3Rpb25zIGZpcnN0cHJpdmF0ZSAqLworaW50IGNyb3NzdGVzdF9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfZmlyc3Rwcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHBhcmFsbGVsIHNlY3Rpb25zIGZpcnN0cHJpdmF0ZSAqLworaW50IHRlc3Rfb21wX2Zvcl9hdXRvKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBmb3IgYXV0byAqLworaW50IGNyb3NzdGVzdF9vbXBfZm9yX2F1dG8oRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgZm9yIGF1dG8gKi8KK2ludCB0ZXN0X29tcF90YXNrX2ZpbmFsKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCB0YXNrIGZpbmFsICovCitpbnQgY3Jvc3N0ZXN0X29tcF90YXNrX2ZpbmFsKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHRhc2sgZmluYWwgKi8KK2ludCB0ZXN0X29tcF9zZWN0aW9uX3ByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHNlY3Rpb24gcHJpdmF0ZSAqLworaW50IGNyb3NzdGVzdF9vbXBfc2VjdGlvbl9wcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHNlY3Rpb24gcHJpdmF0ZSAqLworaW50IHRlc3Rfb21wX3BhcmFsbGVsX3NlY3Rpb25zX3ByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3BhcmFsbGVsX3NlY3Rpb25zX3ByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZSAqLworaW50IHRlc3Rfb21wX2Zvcl9yZWR1Y3Rpb24oRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIGZvciByZWR1Y3Rpb24gKi8KK2ludCBjcm9zc3Rlc3Rfb21wX2Zvcl9yZWR1Y3Rpb24oRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgZm9yIHJlZHVjdGlvbiAqLworaW50IHRlc3Rfb21wX2Zvcl9wcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBmb3IgcHJpdmF0ZSAqLworaW50IGNyb3NzdGVzdF9vbXBfZm9yX3ByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgZm9yIHByaXZhdGUgKi8KK2ludCB0ZXN0X29tcF9mbHVzaChGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgZmx1c2ggKi8KK2ludCBjcm9zc3Rlc3Rfb21wX2ZsdXNoKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIGZsdXNoICovCitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfcHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgcGFyYWxsZWwgcHJpdmF0ZSAqLworaW50IGNyb3NzdGVzdF9vbXBfcGFyYWxsZWxfcHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBwYXJhbGxlbCBwcml2YXRlICovCitpbnQgdGVzdF9vbXBfdGhyZWFkcHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgdGhyZWFkcHJpdmF0ZSAqLworaW50IGNyb3NzdGVzdF9vbXBfdGhyZWFkcHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCB0aHJlYWRwcml2YXRlICovCitpbnQgdGVzdF9vbXBfc2VjdGlvbl9maXJzdHByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIGZpcnN0cHJpdmF0ZSAqLworaW50IGNyb3NzdGVzdF9vbXBfc2VjdGlvbl9maXJzdHByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgZmlyc3Rwcml2YXRlICovCitpbnQgdGVzdF9vbXBfZm9yX3NjaGVkdWxlX2d1aWRlZChGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgZm9yIHNjaGVkdWxlKGd1aWRlZCkgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX2Zvcl9zY2hlZHVsZV9ndWlkZWQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgZm9yIHNjaGVkdWxlKGd1aWRlZCkgKi8KK2ludCB0ZXN0X29tcF9nZXRfbnVtX3RocmVhZHMoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wX2dldF9udW1fdGhyZWFkcyAqLworaW50IGNyb3NzdGVzdF9vbXBfZ2V0X251bV90aHJlYWRzKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wX2dldF9udW1fdGhyZWFkcyAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9vbXB0cy1jLmNvbmYgYi9maW5hbC90ZXN0c3VpdGUvb21wdHMtYy5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxMGI5NTAKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvb21wdHMtYy5jb25mCkBAIC0wLDAgKzEsMTkgQEAKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG9tcC5oPgorCisvKiBWZXJzaW9uIGluZm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBPTVBUU19WRVJTSU9OICIzLjBhIgorCisvKiBHZW5lcmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBMT09QQ09VTlQgCTEwMDAKKyNkZWZpbmUgUkVQRVRJVElPTlMgCSAgMjAKKy8qIGZvbGxvd2luZyB0aW1lcyBhcmUgaW4gc2Vjb25kcyAqLworI2RlZmluZSBTTEVFUFRJTUUJIDAuMDEKKyNkZWZpbmUgU0xFRVBUSU1FX0xPTkcJIDAuNQorCisvKiBEZWZpbml0aW9ucyBmb3IgdGFza3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBOVU1fVEFTS1MgICAgICAgICAgICAgIDI1CisjZGVmaW5lIE1BWF9UQVNLU19QRVJfVEhSRUFEICAgIDUKZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9vbXB0cy1mLmNvbmYgYi9maW5hbC90ZXN0c3VpdGUvb21wdHMtZi5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyNWFmMzAKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvb21wdHMtZi5jb25mCkBAIC0wLDAgKzEgQEAKKyFFbXB0eSBjb25maWcgZmlsZQpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL29tcHRzLmNvbmYgYi9maW5hbC90ZXN0c3VpdGUvb21wdHMuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zMzEzNWI1Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL29tcHRzLmNvbmYKQEAgLTAsMCArMSwyNiBAQAorPGNvbmZpZz4KKzxnbG9iYWxjb25maWc+Cis8bG9nZmlsZT5vbXB0cy5sb2c8L2xvZ2ZpbGU+Cis8c2luZ2xldGVzdHRpbWVvdXQ+MTIwPC9zaW5nbGV0ZXN0dGltZW91dD4KKzxkaXNwbGF5ZXJyb3JzPjE8L2Rpc3BsYXllcnJvcnM+Cis8ZGlzcGxheXdhcm5pbmdzPjA8L2Rpc3BsYXl3YXJuaW5ncz4KKzxlbnZzZXR0aHJlYWRzY29tbWFuZD5PTVBfTlVNX1RIUkVBRFM9JW47IGV4cG9ydCBPTVBfTlVNX1RIUkVBRFM7PC9lbnZzZXR0aHJlYWRzY29tbWFuZD4KKzxyZXN1bHRzZmlsZT5yZXN1bHRzLnR4dDwvcmVzdWx0c2ZpbGU+Cis8bnVtdGhyZWFkcz44PC9udW10aHJlYWRzPgorPC9nbG9iYWxjb25maWc+CisKKzxsYW5ndWFnZXM+Cis8bGFuZ3VhZ2U+Cis8bGFuZ3VhZ2VuYW1lPmM8L2xhbmd1YWdlbmFtZT4KKzxkaXI+YzwvZGlyPgorPGZpbGVleHRlbnNpb24+YzwvZmlsZWV4dGVuc2lvbj4KKzx0ZW1wbGF0ZXBhcnNlcm5hbWU+dGVtcGxhdGVfcGFyc2VyX2MucGw8L3RlbXBsYXRlcGFyc2VybmFtZT4KKzwvbGFuZ3VhZ2U+Cis8bGFuZ3VhZ2U+Cis8bGFuZ3VhZ2VuYW1lPmZvcnRyYW48L2xhbmd1YWdlbmFtZT4KKzxkaXI+Zm9ydHJhbjwvZGlyPgorPGZpbGVleHRlbnNpb24+ZjwvZmlsZWV4dGVuc2lvbj4KKzx0ZW1wbGF0ZXBhcnNlcm5hbWU+dGVtcGxhdGVfcGFyc2VyX2ZvcnRyYW4ucGw8L3RlbXBsYXRlcGFyc2VybmFtZT4KKzwvbGFuZ3VhZ2U+Cis8L2xhbmd1YWdlcz4KKzwvY29uZmlnPgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL29tcHRzX21ha2VIZWFkZXIucGwgYi9maW5hbC90ZXN0c3VpdGUvb21wdHNfbWFrZUhlYWRlci5wbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43MjEyY2VjCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL29tcHRzX21ha2VIZWFkZXIucGwKQEAgLTAsMCArMSwxMDEgQEAKKyMhL3Vzci9iaW4vcGVybCAtdworCisjIG9tcHRzX21ha2VIZWFkZXIgW29wdGlvbnNdIC1mPU5BTUUgLXQ9RElSCisjCisjIENyZWF0cyB0aGUgaGVhZGVyZmlsZSBmb3IgdGhlIE9wZW5NUC1UZXN0c3VpdGUgb3V0IG9mIHRoZSB0ZW1wbGF0ZWZpbGVzIAorIyB3aXRjaCBhcmUgaW4gdGhlIGRlZmF1bHQvZXhwbGljaXRlbHkgc3BlY2lmaWVkIGRpciBhbmQgdGhlIHNldHRpbmdzIGluIHRoZQorIyBnaXZlbiBjb25maWcgZmlsZS4gCisjIAorIyBBVFRFTlRJT046CisjCUF0IHRoZSBtb21lbnQgaXQgYnVpbHRzIG9ubHkgYSBjLWhlYWRlcmZpbGUhCisjCisjIC1mPUZJTEVOQU1FOiBVc2luZyBmaWxlIEZJTEVOQU1FIGFzIGNvbmZpZ2ZpbGUKKyMgLXQ9RElSOglEaXJlY3RvcnkgaG9sZGluZyB0aGUgdGVtcGxhdGUgZmlsZXMKKyMgCisjIG9wdGlvbnMKKyMgLWk9RklMRU5BTUU6IEluY2x1ZGUgb3RoZXIgSGVhZGVyZmlsZS4gVGhlIGZpbGVzIHRvIGJlIGluY2x1ZGVkIG11c3QgYmUgc3BlY2lmaWVkCisjIAlhZnRlciBzZXR0aW5nIHRoaXMgb3B0aW9uLiAoTm90IGltcGxlbWVudGVkIHlldC4pCisjIC1vPUZJTEVOQU1FOiBvdXRwdXRmaWxlbmFtZSAoZGVmYXVsdCBpcyAib21wX3Rlc3RzdWl0ZS5oIikKKworJGhlYWRlcmZpbGUgPSAiXC9cKiBHbG9iYWwgaGVhZGVyZmlsZSBvZiB0aGUgT3Blbk1QIFRlc3RzdWl0ZSBcKlwvXG5cblwvXCogVGhpcyBmaWxlIHdhcyBjcmVhdGVkIHdpdGggdGhlIG9tcHRzX21ha2VIZWFkZXIucGwgc2NyaXB0IHVzaW5nIHRoZSBmb2xsb3dpbmcgb3Bpb25zOlwgKlwvXG5cL1wqICI7CitpZihAQVJHViA+IDApCit7CisJZm9yZWFjaCAkb3B0IChAQVJHVikKKwl7CisJCSRoZWFkZXJmaWxlIC49ICIkb3B0ICI7CisJfQorfQorZWxzZQoreworCSRoZWFkZXJmaWxlIC49ICJObyBvcHRpb25zIHdlcmUgc3BlY2lmaWVkIjsKK30KKyRoZWFkZXJmaWxlIC49IiBcKlwvXG5cblxuIjsKKwordXNlIEdldG9wdDo6TG9uZzsKK0dldE9wdGlvbnMoIi1vPXMiID0+IFwkb3V0ZmlsZSwgIi1mPXMiID0+XCRjb25maWdmaWxlLCAiLXQ9cyIgPT4gXCR0ZW1wbGF0ZWRpciwgIi1pPXMiID0+IFwkaW5jbHVkZSk7CisKKyRpbmNsdWRlID0gIiI7CisKKworIyBHZXR0aW5nIGFuZCB2ZXJpZnlpbmcgdGhlIG5lY2Vzc2FyeSBvcHRpb25zOgoraWYoISRjb25maWdmaWxlKSB7CQorCWRpZSAiQ29uZmlnIGZpbGUgbmFtZSBpcyBtaXNzaW5nLiI7Cit9CQorZWxzZSB7CisgICAgaWYgKCEoLWUgJGNvbmZpZ2ZpbGUpKSB7CisJICBkaWUgIkNvdWxkIG5vdCBmaW5kIGNvbmZpZyBmaWxlICRjb25maWdmaWxlLiI7CisJfQorfQorCQoraWYoISR0ZW1wbGF0ZWRpcikgewkKKwlkaWUgIkRpcmVjdG9yeW5hbWUgaXMgbWlzc2luZy4iOworfQkKKworaWYoISRvdXRmaWxlKXsKKwkkb3V0ZmlsZSA9ICJvbXBfdGVzdHN1aXRlLmgiOwkjIHNldHRpbmcgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGhlYWRlcmZpbGUKK30KKworCisKKyNAaW5jbHVkZWZpbGVzOwkJCQkJIyBsaXN0IGhvbGluZyBleHRyYSBpbmNsdWRlZmlsZXMgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyIAorCisKKyMgZ2VuZXJhdGluZyB0aGUgaGVhZCBvZiB0aGUgaW5jbHVkZWd1YXJkOgorJGhlYWRlcmZpbGUgLj0gIlwjaWZuZGVmIE9NUF9URVNUU1VJVEVfSFxuXCNkZWZpbmUgT01QX1RFU1RTVUlURV9IXG5cbiI7CisKKyMgaW5zZXJ0aW5nIGdlbmVyYWwgc2V0dGluZ3Mgb3V0IG9mIHRoZSBjb25maWdmaWxlOgorb3BlbihPTVBUU19DT05GLCRjb25maWdmaWxlKSBvciBkaWUgIkNvdWxkIG5vdCBvcGVuIHRoZSBnbG9iYWwgY29uZmlnIGZpbGUgJGNvbmZpZ2ZpbGUuIjsKK3doaWxlKDxPTVBUU19DT05GPil7CisJJGhlYWRlcmZpbGUgLj0gJF87Cit9CitjbG9zZShPTVBUU19DT05GKTsKKworIyBzZWFyY2hpbmcgdGhlIHRlc3RzOgorb3BlbmRpciBURU1QTEFURURJUiwgJHRlbXBsYXRlZGlyIG9yIGRpZSAiQ291bGQgbm90IG9wZW4gZGlyICR0ZW1wbGF0ZWRpci4iOworQHRlbXBsYXRlcyA9IGdyZXAgLyguKilcLmMvLCByZWFkZGlyIFRFTVBMQVRFRElSOworY2xvc2VkaXIgVEVNUExBVEVESVI7CisKKyMgaW5zZXJ0aW5nIHRoZSBmdW5jdGlvbiBkZWNsYXJhdGlvbnM6Citmb3JlYWNoICR0ZW1wbGF0ZSAoQHRlbXBsYXRlcyl7CisJJHNvdXJjZSA9ICIiOworCW9wZW4oVEVNUExBVEUsJHRlbXBsYXRlZGlyLiIvIi4kdGVtcGxhdGUpIG9yIGRpZSAiQ291bGQgbm90IG9wZW4gdGhlIGZvbGxvd2luZyBzb3VyY2VmaWxlOiAiLiR0ZW1wbGF0ZWRpci4iLyIuJHRlbXBsYXRlOworCXdoaWxlKDxURU1QTEFURT4peworCQkkc291cmNlIC49ICRfOworCX0KKwljbG9zZShURU1QTEFURSk7CisJJHNvdXJjZSA9fiAvXDxvbXB0c1w6dGVzdGNvZGVcOmZ1bmN0aW9ubmFtZVw+KC4qKVw8XC9vbXB0c1w6dGVzdGNvZGVcOmZ1bmN0aW9ubmFtZVw+LzsKKwkkZnVuY3Rpb25uYW1lID0gJDEuIihGSUxFIFwqIGxvZ2ZpbGUpOyI7CisJJHNvdXJjZSA9fiAvXDxvbXB0c1w6ZGlyZWN0aXZlXD4oLiopXDxcL29tcHRzXDpkaXJlY3RpdmVcPi87CisJJGRpcmVjdGl2ZSA9ICQxOworCSRoZWFkZXJmaWxlIC49ICJpbnQgdGVzdF8iLiRmdW5jdGlvbm5hbWUuIiAgLyogVGVzdCBmb3IgIi4kZGlyZWN0aXZlLiIgKi9cbiI7CisJJGhlYWRlcmZpbGUgLj0gImludCBjcm9zc3Rlc3RfIi4kZnVuY3Rpb25uYW1lLiIgIC8qIENyb3NzdGVzdCBmb3IgIi4kZGlyZWN0aXZlLiIgKi9cbiI7Cit9CisKKyMgaW5zZXJ0aW5nIHRoZSBlbmQgb2YgdGhlIGluY2x1ZGVndWFyZDoKKyRoZWFkZXJmaWxlIC49ICJcbiNlbmRpZiI7CisKKyMgY3JhZXRpbmcgdGhlIGhlYWRlcmZpbGU6CitvcGVuKE9VVEZJTEUsIj4iLiRvdXRmaWxlKSBvciBkaWUgIkNvdWxkIG5vdCBjcmVhdGUgdGhlIGhhZWRhZXJmaWxlICgkb3V0ZmlsZSkiOworcHJpbnQgT1VURklMRSAkaGVhZGVyZmlsZS4iXG4iOworY2xvc2UoT1VURklMRSk7CisKZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9vbXB0c19wYXJzZXIucGwgYi9maW5hbC90ZXN0c3VpdGUvb21wdHNfcGFyc2VyLnBsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjk4ZDcyNzEKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvb21wdHNfcGFyc2VyLnBsCkBAIC0wLDAgKzEsMTY3IEBACisjIS91c3IvYmluL2VudiBwZXJsCisKKyMgb21wdHNfcGFyc2VyIFtvcHRpb25dIFNPVVJDRUZJTEUKKyMgCisjIENyZWF0cyB0aGUgdGVzdHMgYW5kIHRoZSBjcm9zc3Rlc3RzIGZvciB0aGUgT3Blbk1QLVRlc3RzdWl0ZSBvdXQgb2YgYW4gdGVtcGxhdGVmaWxlcyB3aGljaCBhcmUgZ2l2ZW4gdG8gdGhlIHByb2dyYW1tLgorIyAKKyMgT3B0aW9uczoKKyMgLXRlc3Q6IAltYWtlIHRlc3QKKyMgLWNyb3NzdGVzdDogCW1ha2UgY3Jvc3N0ZXN0CisjIC1vcnBoYW4JaWYgcG9zc2libGUgZ2VuZXJhdGUgdGVzdHMgdXNpbmcgb3JwaGFuIHJlZ2lvbnMgKG5vdCBpbXBsZW1lbnRlZCB5ZXQpCisjIC1sYW5nPUxBTkcJcHJlcHJvY2Vzc2luZyBmb3IgbGFuZ3VhZ2UgTEFORywgd2hlcmUgTEFORyBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZyBsYW5ndWFnZXM6CisjCQljLCBmb3J0cmFuCisjIC1vPUZJTEVOQU1FCW91dHB1dGZpbGUgKG9ubHkgd2hlbiBvbmUgdGVtcGxhdGVmaWxlIGlzIHNwZWNpZmllZCkKKworCisjIFVzaW5nIEdldG9wdDo6bG9uZyB0byBleHRyYWN0IHRoZSBwcm9ncmFtbSBvcHRpb25zCit1c2UgR2V0b3B0OjpMb25nOworIyBVc2luZyBmdW5jdGlvbnM6IFNldCBvZiBzdWJyb3V0aW5lcyB0byBtb2RpZnkgdGhlIHRlc3Rjb2RlCit1c2Ugb21wdHNfcGFyc2VyRnVuY3Rpb25zOworCisjIEdldHRpbmcgZ2l2ZW4gb3B0aW9ucworR2V0T3B0aW9ucygiLXRlc3QiID0+IFwkdGVzdCwiLWNyb3NzdGVzdCIgPT4gXCRjcm9zc3Rlc3QsICItbz1zIiA9PiBcJG91dHB1dGZpbGUsICItb3JwaGFuIiA9PiBcJG9ycGhhbiwgIi1mISIsICItbGFuZz1zIiA9PiBcJGxhbmd1YWdlKTsKKworIyBSZW1haW5pbmcgYXJndW1lbnRzIGFyZSB0aGUgdGVtcGxhdGVmaWxlcy4gCisjIEFkZGluZyB0aGVzZSB0byB0aGUgbGlzdCBvZiB0byBiZSBwYXJzZWQgZmlsZXMgaWYgdGhleSBleGlzdC4KK2ZvcmVhY2ggJGZpbGUoQEFSR1YpCit7CisJaWYoLWUgJGZpbGUpeyBwdXNoKEBzb3VyY2VmaWxlcywkZmlsZSk7IH0KKwllbHNlIHsgcHJpbnQgIkVycm9yOiBVbmtub3duIE9wdGlvbiAkZmlsZVxuIjsgfQorfQorCQorIyBDaGVja2luZyBpZiBvcHRpb25zIHdlcmUgdmFsaWQ6CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBwcmVwYXJhdGlvbnMgYW5kIGNoZWNrcyBmb3Igc291cmNlZmlsZXMKK2lmKEBzb3VyY2VmaWxlcyA9PSAwKXtkaWUgIk5vIGZpbGVzIHRvIHBhcnNlIGFyZSBzcGVjaWZpZWQhIjt9CitpZigkb3V0cHV0ZmlsZSAmJiAoQHNvdXJjZWZpbGVzICE9IDEgfHwgKCR0ZXN0ICYmICRjcm9zc3Rlc3QpICkgKXtkaWUgIlRoZXJlIHdlcmUgbXVsdGlwbGUgZmlsZXMgZm9yIG9uZSBvdXRwdXRmaWxlcyBzcGVjaWZpZWQhIjt9IAorIyBwcmVwYXJhdGlvbnMgZm9wciBvcnBoYW4gdGVzdHMKK2lmKCRvcnBoYW4peyAkb3JwaGFucHJlZml4ID0gIm9ycGhhbmVkIjsgfQorZWxzZSB7ICRvcnBoYW5wcmVmaXggPSAiIjsgfQorIyBwcmVwYXJhdGlvbnMgZm9yIHRlc3QgLyBjcm9zc3Rlc3QKK2lmKCR0ZXN0KXtwdXNoKEB0ZXN0dHlwZXMsInRlc3QiKTsgCisjICVjaGVja3NbJ3Rlc3QnXT0iY2hlY2siOworfQoraWYoJGNyb3NzdGVzdCl7cHVzaChAdGVzdHR5cGVzLCJjdGVzdCIpOworIyAlY2hlY2tzWydjcm9zc3Rlc3QnXT0iY3Jvc3NjaGVjayI7Cit9CisjIHByZXBhcmF0aW9ucyBhbmQgY2hlY2tzIGZvciBsYW5ndWFnZQoraWYoJGxhbmd1YWdlIGVxImMiKSB7ICRleHRlbnNpb24gPSAiYyI7fQorZWxzaWYoJGxhbmd1YWdlIGVxICJmb3J0cmFuIiBvciAkbGFuZ3VhZ2UgZXEgImYiKSB7ICRsYW5ndWFnZSA9ICJmIjsgJGV4dGVuc2lvbiA9ICJmIjt9CitlbHNlIHsgZGllICJZb3UgbXVzdCBzcGVjaWZ5IGEgdmFsaWQgbGFuZ3VhZ2UhIjsgfQorICAgIAorCisjIFJlYWRpbmcgdGhlIHRlbXBsYXRlcyBmb3IgdGhlIHRlc3RzIGludG8gQHNvdXJjZXMKK2ZvcmVhY2ggJHNyY2ZpbGUgKEBzb3VyY2VmaWxlcykKK3sKKwkjIFJlYWRpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIGN1cnJlbnQgc291cmNlZmlsZQlpbnRvICRzcmMKKwlvcGVuKFRFU1QsJHNyY2ZpbGUpIG9yIHByaW50ICJFcnJvcjogQ291bGQgbm90IG9wZW4gdGVtcGxhdGUgJHNyY2ZpbGVcbiI7CisJd2hpbGUoPFRFU1Q+KXsgJHNyYyAuPSAkXzsgfQorCWNsb3NlKFRFU1QpOworCSMgQWRkaW5nIHRoZSBjb250ZW50ICRzcmMgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdCBAc291cmNlcworCXB1c2goQHNvdXJjZXMsJHNyYyk7Cit9CisKKyMgRXh0cmFjdGluZyB0aGUgc291cmNlIGZvciB0aGUgbWFpbnByb2dyYW1tIGFuZCBzYXZpbmcgaXQgaW4gJG1haW5wcm9jc3JjCitpZigkbGFuZ3VhZ2UgZXEgImMiKSB7ICRtYWlucHJvY3NyYyA9ICJvbXB0c19zdGFuZGFsb25lUHJvYy5jIjsgfQorZWxzaWYoJGxhbmd1YWdlIGVxICJmIikgeyAkbWFpbnByb2NzcmMgPSAib21wdHNfc3RhbmRhbG9uZVByb2MuZiI7IH0gCitvcGVuKE1BSU5QUk9DLCRtYWlucHJvY3NyYykgb3IgZGllICJDb3VsZCBub3Qgb3BlbiB0aGUgc291cmNlZmlsZSBmb3IgdGhlIG1haW4gcHJvZ3JhbSAkbWFpbnByb2NzcmMiOword2hpbGUoPE1BSU5QUk9DPil7CisJJG1haW5wcm9jIC49ICRfOworfQorCitmb3JlYWNoICR0ZXN0dHlwZSAoQHRlc3R0eXBlcykKK3sKKyAgZm9yZWFjaCAkc3JjKEBzb3VyY2VzKQorICB7CisjIFNvbWUgdGVtcG9yYXJ5IHRlc3RpbmZvcm1hdGlvbjoKKyAgICAoJGRlc2NyaXB0aW9uKSA9IGdldF90YWdfdmFsdWVzKCdvbXB0czp0ZXN0ZGVzY3JpcHRpb24nLCRzcmMpOworICAgICgkZGlyZWN0aXZlKSA9IGdldF90YWdfdmFsdWVzKCdvbXB0czpkaXJlY3RpdmUnLCRzcmMpOworICAgICgkZnVuY3Rpb25uYW1lKSA9IGdldF90YWdfdmFsdWVzKCdvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWUnLCRzcmMpOworCisgICAgb3BlbihPVVRGSUxFLCI+Ii4kbGFuZ3VhZ2UuJG9ycGhhbnByZWZpeC4kdGVzdHR5cGUuIl8iLiRmdW5jdGlvbm5hbWUuIi4iLiRleHRlbnNpb24pIG9yIGRpZSgiQ291bGQgbm90IGNyZWF0ZSB0aGUgb3V0cHV0IGZpbGUgZm9yICRkaXJlY3RpdmUiKTsKKworIyBDcmVhdGluZyB0aGUgc291cmNlIGZvciB0aGUgdGVzdDoKKyAgICAoJGNvZGUpID0gZ2V0X3RhZ192YWx1ZXMoJ29tcHRzOnRlc3Rjb2RlJywkc3JjKTsKKyMgUHV0dGluZyB0b2dldGhlciB0aGUgZnVuY3Rpb25zIGFuZCB0aGUgbWFpbnByb2dyYW1tOgorICAgICRjb2RlIC49ICRtYWlucHJvYzsKKyAgICAKKyMgZ2V0IHRoZSBwYXJhbWV0ZXJzIDxvbXB0czpvcnBoYW46cGFyYW1zPiBieSBqb29uCisjIHRoYW5rcyB0byBEci4gWWluIE1hIGluIEFic29mdAorICAgICgkcGFybXMpID0gZ2V0X3RhZ192YWx1ZXMoJ29tcHRzOm9ycGhhbjpwYXJtcycsJGNvZGUpOworICAgICgkcGFybXMpID0gbGVhdmVfc2luZ2xlX3NwYWNlKCRwYXJtcyk7CisjIHRvIHJlbW92ZSBwYXJhbWV0ZXJzIHRhZyBiZXR3ZWVuICdvbXB0czpvcnBoYW46cGFybXMnIGJ5IGpvb24KKyAgICAoJGNvZGUpID0gcmVwbGFjZV90YWdzKCdvbXB0czpvcnBoYW46cGFybXMnLCcnLCRjb2RlKTsKKyAgICAKKyMgTWFrZSBtb2RpZmljYXRpb25zIGZvciB0aGUgb3JwaGFuZWQgdGVzdHZlcnNpb24gaWYgbmVjZXNzYXJ5OgorICAgIGlmKCRvcnBoYW4pCisgICAgeworIyBHZXQgdGhlIGdsb2JhbCB2YXJpYWJsZXM6CisgICAgICBAZGVmcyA9IGdldF90YWdfdmFsdWVzKCJvbXB0czpvcnBoYW46dmFycyIsJGNvZGUpOworICAgICAgJG9ycGh2YXJzZGVmID0gIiI7CisgICAgICBmb3JlYWNoICRfIChAZGVmcykKKyAgICAgIHsKKwkjcHJpbnQgJF87CisJaWYobm90IC9eWyBdKiQvZ3MpIHsgJG9ycGh2YXJzZGVmID0gam9pbigiXG4iLCRvcnBodmFyc2RlZiwkXyk7IH0gCisJI3ByaW50ICJPS1xuIi4kb3JwaHZhcnNkZWY7IAorICAgICAgfQorICAgICAgaWYoJGxhbmd1YWdlIGVxICJmIikKKyAgICAgIHsKKyMgR2VuZXJhdGUgdGhlIG9ycGhhbiBzdWJyb3V0aW5lczoKKwkkb3JwaGZ1bmNzID0gY3JlYXRlX29ycGhfZm9ydHJhbmZ1bmN0aW9ucygiJHRlc3R0eXBlXyIsICRjb2RlKTsKKyMgUmVwbGFjZSBvcnBoYW4gcmVnaW9ucyBieSBmdW5jdGlvbmNhbGxzOgorCSgkY29kZSkgPSBvcnBoYW5fcmVnaW9uczJmb3J0cmFuZnVuY3Rpb25zKCAiJHRlc3R0eXBlXyIsICgkY29kZSkgKTsKKwkoJGNvZGUpID0gZW5sYXJnZV90YWdzKCdvbXB0czpvcnBoYW46dmFycycsJycsJycsKCRjb2RlKSk7CisgICAgKCRjb2RlKSA9IGVubGFyZ2VfdGFncygnb21wdHM6b3JwaGFuOnBhcm1zJywnJywnJywoJGNvZGUpKTsKKyAgICAjdG8gZmluZCBvcnBoYW4gY2FsbCBzdGF0ZW1ldG4gYW5kIGFkZCBwYXJhbWV0ZXJzCisgICAgCisjIFB1dCBhbGwgdG9nZXRoZXI6CisJJGNvZGUgPSAkY29kZSAuICRvcnBoZnVuY3M7CisgICAgICB9CisgICAgICBlbHNpZigkbGFuZ3VhZ2UgZXEgImMiKQorICAgICAgeworIyBHZW5lcmF0ZSBwcmVkZWNsYXJhdGlvbnMgZm9yIG9ycGFobiBmdW5jdGlvbnM6CisJJG9ycGhmdW5jc2RlZnMgPSBvcnBoX2Z1bmN0aW9uc19kZWNsYXJhdGlvbnMoIiR0ZXN0dHlwZV8iLCRjb2RlKTsKKyMgR2VuZXJhdGUgdGhlIG9ycGhhbiBmdW5jdGlvbnM6CisJJG9ycGhmdW5jcyA9IGNyZWF0ZV9vcnBoX2NmdW5jdGlvbnMoIiR0ZXN0dHlwZV8iLCRjb2RlKTsKKyMgUmVwbGE6ZSBvcnBoYW4gcmVnaW9ucyBieSBmdW5jdGlvbmNhbGxzOgorCSgkY29kZSkgPSBvcnBoYW5fcmVnaW9uczJjZnVuY3Rpb25zKCAiJHRlc3R0eXBlXyIsICgkY29kZSkgKTsKKyMgRGVsZXRpbmcgdGhlIGZvcm1lciBkZWNsYXJhdGlvbnMgb2YgdGhlIHZhcmlhYmxlcyBpbiB0aGUgb3JwaGFuIHJlZ2lvbnM6CisJKCRjb2RlKSA9IGRlbGV0ZV90YWdzKCdvbXB0czpvcnBoYW46dmFycycsKCRjb2RlKSk7CisjIFB1dCBhbGwgdG9nZXRoZXI6CisJJGNvZGUgPSAiI2luY2x1ZGUgXCJvbXBfdGVzdHN1aXRlLmhcIlxuIi4kb3JwaHZhcnNkZWYgLiAkb3JwaGZ1bmNzZGVmcyAuICRjb2RlIC4gJG9ycGhmdW5jczsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworCXByaW50ICJBbiBlcnJvciBvY2N1cnJlZCEiOworICAgICAgfQorICAgIH0KKyMgcmVtb3ZlIHBhcmFtZXRlcnMgYmV0d2VlbiA8b21wdHM6b3JwaGFuOnBhcm1zPiB0YWdzLCBhZGRlZCBieSBqb29uCisgICAgKCRjb2RlKT0gcmVwbGFjZV90YWdzKCdvbXB0czpvcnBoYW46cGFybXMnLCRjb2RlKTsKKyAgICAKKyMgUmVtb3ZlIHRoZSBtYXJrcyBmb3IgdGhlIG9ycGFobiByZWdpb25zIGFuZCBpdHMgdmFyaWFibGVzOgorICAgICgkY29kZSkgPSBlbmxhcmdlX3RhZ3MoJ29tcHRzOm9ycGhhbicsJycsJycsKCRjb2RlKSk7CisgICAgKCRjb2RlKSA9IGVubGFyZ2VfdGFncygnb21wdHM6b3JwaGFuOnZhcnMnLCcnLCcnLCgkY29kZSkpOworCisjIHJlbW92ZSBwYXJhbWV0ZXJzIGJldHdlZW4gZm9yIG9ycGhhbmVkIGRpcmVjdGl2ZSBwYXJhbWV0ZXMsIGFkZGVkIGJ5IGpvb24KKyAgICAoJGNvZGUpID0gZW5sYXJnZV90YWdzKCdvbXB0czpvcnBoYW46cGFybXMnLCcnLCcnLCgkY29kZSkpOworICAgIAorICAgIGlmKCR0ZXN0dHlwZSBlcSAidGVzdCIpIHsKKyMgUmVtb3ZlIHRoZSBtYXJrcyBmb3IgdGhlIHRlc3Rjb2RlIGFuZCByZW1vdmUgdGhlIGNvZGUgZm9yIHRoZSBjcm9zc3Rlc3RzOiAKKyAgICAgICgkY29kZSkgPSBlbmxhcmdlX3RhZ3MoJ29tcHRzOmNoZWNrJywnJywnJywoJGNvZGUpKTsKKyAgICAgICgkY29kZSkgPSBkZWxldGVfdGFncygnb21wdHM6Y3Jvc3NjaGVjaycsKCRjb2RlKSk7CQkKKyAgICB9CisgICAgZWxzaWYoJHRlc3R0eXBlIGVxICJjdGVzdCIpIHsKKyMgUmVtb3ZlIHRoZSBtYXJrcyBmb3IgdGhlIGNyb3NzdGVzdGNvZGUgYW5kIHJlbW92ZSB0aGUgY29kZSBmb3IgdGhlIHRlc3RzOiAKKyAgICAgICgkY29kZSkgPSBlbmxhcmdlX3RhZ3MoJ29tcHRzOmNyb3NzY2hlY2snLCcnLCcnLCgkY29kZSkpOworICAgICAgKCRjb2RlKSA9IGRlbGV0ZV90YWdzKCdvbXB0czpjaGVjaycsKCRjb2RlKSk7CQkKKyAgICB9CisjIE1ha2luZyBzb21lIGZpbmFsIG1vZGlmaWNhdGlvbnM6CisgICAgKCRjb2RlKSA9IHJlcGxhY2VfdGFncygndGVzdGZ1bmN0aW9ubmFtZScsJHRlc3R0eXBlLiJfIi4kZnVuY3Rpb25uYW1lLCgkY29kZSkpOworICAgICgkY29kZSkgPSByZXBsYWNlX3RhZ3MoJ2RpcmVjdGl2ZScsJGRpcmVjdGl2ZSwoJGNvZGUpKTsKKyAgICAoJGNvZGUpID0gcmVwbGFjZV90YWdzKCdkZXNjcmlwdGlvbicsJGRlc2NyaXB0aW9uLCgkY29kZSkpOworICAgICgkY29kZSkgPSBlbmxhcmdlX3RhZ3MoJ29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZScsJHRlc3R0eXBlLiJfIiwnJywoJGNvZGUpICk7CisjCSRjb2RlID0gICJcI2luY2x1ZGUgXCJvbXBfdGVzdHN1aXRlLmhcIlxuIi4kY29kZTsKKyMgV3JpdGUgdGhlIHJlc3VsdCBpbnRvIHRoZSBmaWxlIGFuZCBjbG9zZSBpdDoKKyAgICBwcmludCBPVVRGSUxFICRjb2RlOworICAgIGNsb3NlKE9VVEZJTEUpOworICB9Cit9CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvb21wdHNfcGFyc2VyRnVuY3Rpb25zLnBtIGIvZmluYWwvdGVzdHN1aXRlL29tcHRzX3BhcnNlckZ1bmN0aW9ucy5wbQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zOGNlZGIwCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL29tcHRzX3BhcnNlckZ1bmN0aW9ucy5wbQpAQCAtMCwwICsxLDI4MCBAQAorIyEvdXNyL2Jpbi9wZXJsIC13CisKKyMgZnVuY3Rpb25zLnBtCisjIFRoaXMgcGFja2FnZSBjb250YWlucyBhIHNldCBvZiBzdWJyb3V0aW5lcyB0byBtb2RpZnkgdGhlIHRlbXBsYXRlcyBmb3IgdGhlIG9wZW5NUCBUZXN0dWl0ZS4KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBzdWJyb3V0aW5lcyB0byBleHRyYWN0LCBtb2RpZnkgb3IgZGVsZXRlIHRhZ3MgZnJvbSB0aGUgdGVtcGxhdGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgTElTVCBnZXRfdGFnX3ZhbHVlcyggJHRhZ25hbWUsICRzdHJpbmcgKQorIyBzdWJydXRpbmUgdG8gZ2V0IHRoZSB0ZXh0IGVuY2xvZGVkIGJ5IGEgdGFnLgorIyBSZXR1cm5zIGEgbGlzdCBjb250YWluaW5nIHRoZSBpbm5lciB0ZXh0cyBvZiB0aGUgZm91bmQgdGFncworc3ViIGdldF90YWdfdmFsdWVzCit7CisJbXkgKCAkdGFnbmFtZSwgJHN0cmluZyApOworCSggJHRhZ25hbWUsICRzdHJpbmcgKSA9IEBfOworCW15IChAdG1wLEB0bXAyKTsKKyAgIAlAdG1wID0gc3BsaXQoL1w8JHRhZ25hbWVcPi8sJHN0cmluZyk7IAorCWZvcmVhY2ggJF8oQHRtcCl7CisJCXB1c2goQHRtcDIsc3BsaXQoL1w8XC8kdGFnbmFtZVw+LykpOworCX0KKwlteShAcmVzdWx0LCRpKTsKKwkkaT0xOyAjIGNvdXRlciB0byBnZXQgb25seSBldmVyeSBzZWNvbmQgaXRlbQorCWZvcmVhY2ggJF8oQHRtcDIpeworCQlpZigkaSUyIGVxIDApeworCQkJcHVzaChAcmVzdWx0LCRfKTsKKwkJfQorCQkkaSsrOworCX0KKwlyZXR1cm4gQHJlc3VsdDsKK30KKworIyBMSVNUIHJlcGxhY2VfdGFncyggJHRhZ25hbWUsICRyZXBsYWNlc3RyaW5nLCBAbGlzdCApCisjIHN1YnJ1dGluZSB0byByZXBsYWNlIHRhZ3MgYnkgYSByZXBsYWNlc3RyaW5nLiAKKyMgUmV0dXJucyBhIGxpc3Qgb2YgdGhlIHNyaW5ncyBhZnRlciBjb252ZXJzaW9uLgorc3ViIHJlcGxhY2VfdGFncworeworCW15ICgkdGFnbmFtZSwgJHJlcGxhY2VzdHJpbmcsIEBzdHJpbmdsaXN0LCBAcmVzdWx0KTsKKwkoJHRhZ25hbWUsICRyZXBsYWNlc3RyaW5nLCBAc3RyaW5nbGlzdCkgPSBAXzsKKwlmb3JlYWNoICRfKEBzdHJpbmdsaXN0KSB7CisJCXMjXDwkdGFnbmFtZVw+KC4qPylcPFwvJHRhZ25hbWVcPiMkcmVwbGFjZXN0cmluZyNnczsKKwkJcHVzaChAcmVzdWx0LCRfKTsKKwl9CisJcmV0dXJuIEByZXN1bHQ7Cit9CisKKyMgTElTVCBlbmxhcmdlX3RhZ3MoICR0YWduYW1lLCAkYmVmb3JlLCAkYWZ0ZXIsIEBsaXN0ICkKKyMgc3VicnV0aW5lIHRvIHJlcGxhY2UgdGFncyBieSB0aGUgdGFncyBhZGRlZCBieSBhIHN0cmluZyBiZWZvcmUgYW5kIGFmdGVyLiAKKyMgUmV0dXJucyBhIGxpc3Qgb2YgdGhlIHNyaW5ncyBhZnRlciBjb252ZXJzaW9uLgorc3ViIGVubGFyZ2VfdGFncworeworCW15ICgkdGFnbmFtZSwgJGJlZm9yZSwgJGFmdGVyLCBAc3RyaW5nbGlzdCxAcmVzdWx0KTsKKwkoJHRhZ25hbWUsICRiZWZvcmUsICRhZnRlciwgQHN0cmluZ2xpc3QpID0gQF87CisJZm9yZWFjaCAkXyhAc3RyaW5nbGlzdCkgeworCQlzI1w8JHRhZ25hbWVcPiguKj8pXDxcLyR0YWduYW1lXD4jJGJlZm9yZSQxJGFmdGVyI2dzOworCQlwdXNoKEByZXN1bHQsJF8pOworCX0KKwlyZXR1cm4gQHJlc3VsdDsKK30KKworIyBMSVNUIGRlbGV0ZV90YWdzKCAkdGFnbmFtZSwgQGxpc3QgKQorIyBzdWJydXRpbmUgdG8gZGVsZXRlIHRhZ3MgaW4gYSBzdHJpbmcuIAorIyBSZXR1cm5zIGEgbGlzdCBvZiB0aGUgY2xlYXJlZCBzdHJpbmdzCitzdWIgZGVsZXRlX3RhZ3MKK3sKKwlteSgkdGFnbmFtZSxAc3RyaW5nbGlzdCk7CisJKCR0YWduYW1lLCBAc3RyaW5nbGlzdCkgPSBAXzsKKwlteShAcmVzdWx0KTsKKwlmb3JlYWNoICRfKEBzdHJpbmdsaXN0KSB7CisJCXMjXDwkdGFnbmFtZVw+KC4qPylcPFwvJHRhZ25hbWVcPiMjZ3M7CisJCXB1c2goQHJlc3VsdCwkXyk7CisJfQorCXJldHVybiBAcmVzdWx0OworfQorCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgc3Vicm91dGluZXMgZm9yIGdlbmVyYXRpbmcgIm9ycGFobmVkIiB0ZXN0cyAJCQkJCQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBTQ0FMQVIgY3JlYXRlX29ycGhfY2Z1bmN0aW9ucyggJHByZWZpeCwgJGNvZGUgKQorIyByZXR1cm5zIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGRlZmluaXRpb25zIG9mIHRoZSBmdW5jdGlvbnMgZm9yIHRoZSAKKyMgb3JwaGFuIHJlZ2lvbnMuCitzdWIgY3JlYXRlX29ycGhfY2Z1bmN0aW9ucworeworCW15ICgkY29kZSxAZGVmcyk7CisJKCRjb2RlKSA9IEBfOworCUBkZWZzID0gZ2V0X3RhZ192YWx1ZXMoJ29tcHRzOm9ycGhhbicsJGNvZGUpOworCSgkZnVuY3Rpb25uYW1lKSA9IGdldF90YWdfdmFsdWVzKCdvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWUnLCRjb2RlKTsKKwlteSAoIEByZXN1bHQsJGZ1bmN0aW9uc3JjLCAkaSk7CisJJGZ1bmN0aW9uc3JjID0gICJcbi8qIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGRlZmluaXRpb25zIG9mIHRoZSBvcnBoYW4gZnVuY3Rpb25zICovXG4iOworCisJJGkgPSAxOworCWZvcmVhY2ggKEBkZWZzKSB7CisJCSRmdW5jdGlvbnNyYyAuPSAiXG52b2lkIG9ycGgkaVxfJGZ1bmN0aW9ubmFtZSAoRklMRSAqIGxvZ0ZpbGUpIHsiOworCQkkZnVuY3Rpb25zcmMgLj0gJF87CisJCSRmdW5jdGlvbnNyYyAuPSAiXG59XG4iOworCQkkaSsrOworCX0KKwkkZnVuY3Rpb25zcmMgLj0gIi8qIEVuZCBvZiBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBkZWZpbml0aW9ucyAqL1xuIjsKKwlyZXR1cm4gJGZ1bmN0aW9uc3JjOworfQorCisjIFNDQUxBUiBjcmVhdGVfb3JwaF9mb3J0cmFuZnVuY3Rpb25zKCAkcHJlZml4LCAkY29kZSApCisjIHJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgZGVmaW5pdGlvbnMgb2YgdGhlIGZ1bmN0aW9ucyBmb3IgdGhlIAorIyBvcnBoYW4gcmVnaW9ucy4KK3N1YiBjcmVhdGVfb3JwaF9mb3J0cmFuZnVuY3Rpb25zCit7CisJbXkgKCRwcmVmaXgsJGNvZGUsQGRlZnMsJG9ycGhhbl9wYXJtcyk7CisJKCRwcmVmaXgsJGNvZGUsJG9ycGhhbl9wYXJtcykgPSBAXzsKKwlAZGVmcyA9IGdldF90YWdfdmFsdWVzKCdvbXB0czpvcnBoYW4nLCRjb2RlKTsKKworICAgICN0byByZW1vdmUgc3BhY2UgYW5kIHB1dCBhIHNpbmdsZSBzcGFjZQorICAgIGlmKCRvcnBoYW5fcGFybXMgbmUgIiIpCisgICAgeworICAgICAgJG9ycGhhbl9wYXJtcyA9fiBzL1sgXHRdKy8vc2c7CisgICAgICAkb3JwaGFuX3Bhcm1zID1+IHMvWyBcdF0rXG4vXG4vc2c7CisgICAgfQorICAgIAorCSgkb3JwaGFudmFyc2RlZnMpID0gZ2V0X3RhZ192YWx1ZXMoJ29tcHRzOm9ycGhhbjp2YXJzJywkY29kZSk7CisJZm9yZWFjaCAoQHZhcnNkZWYpIHsKKwkJaWYgKG5vdCAvW14gXG4kXSovKXsgJG9ycGhhbnZhcnNkZWZzID0gam9pbigiXG4iLCRvcnBoYW52YXJzZGVmLCRfKTt9CisJfQorCSgkZnVuY3Rpb25uYW1lKSA9IGdldF90YWdfdmFsdWVzKCdvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWUnLCRjb2RlKTsKKwlteSAoIEByZXN1bHQsJGZ1bmN0aW9uc3JjLCAkaSk7CisJJGZ1bmN0aW9uc3JjID0gICJcbiEgRGVmaW5pdGlvbnMgb2YgdGhlIG9ycGhhbiBmdW5jdGlvbnNcbiI7CisJJGkgPSAxOworCWZvcmVhY2ggJF8oQGRlZnMpCisJeworCQkkZnVuY3Rpb25zcmMgLj0gIlxuICAgICAgU1VCUk9VVElORSBvcnBoJGlcXyRwcmVmaXhcXyRmdW5jdGlvbm5hbWVcKCRvcnBoYW5fcGFybXNcKVxuICAgICAgIjsKKyAgICAgICAgJGZ1bmN0aW9uc3JjIC49ICJJTkNMVURFIFwib21wX3Rlc3RzdWl0ZS5mXCJcbiI7CisJCSRmdW5jdGlvbnNyYyAuPSAkb3JwaGFudmFyc2RlZnMuIlxuIjsKKwkJJGZ1bmN0aW9uc3JjIC49ICRfOworCQkkZnVuY3Rpb25zcmMgLj0gIlxuIjsKKwkJJGZ1bmN0aW9uc3JjIC49ICIgICAgICBFTkQgU1VCUk9VVElORVxuISBFbmQgb2YgZGVmaW5pdGlvblxuXG4iOworCQkkaSsrOworCX0KKwlyZXR1cm4gJGZ1bmN0aW9uc3JjOworfQorCisjIExJU1Qgb3JwaGFuX3JlZ2lvbnMyY2Z1bmN0aW9ucyggJHByZWZpeCwgQGNvZGUgKQorIyByZXBsYWNlcyBvcnBoYW4gcmVnaW9ucyBieSBmdW5jdGlvbmNhbGxzIGluIEMvQysrLgorc3ViIG9ycGhhbl9yZWdpb25zMmNmdW5jdGlvbnMKK3sKKwlteSAoJGNvZGUsICRpLCAkZnVuY3Rpb25uYW1lKTsKKwkoJGNvZGUpID0gQF87CisJJGkgPSAxOworCSgkZnVuY3Rpb25uYW1lKSA9IGdldF90YWdfdmFsdWVzKCdvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWUnLCRjb2RlKTsKKyAgICAgICAgd2hpbGUoIC9cPG9tcHRzXDpvcnBoYW5cPiguKilcPFwvb21wdHNcOm9ycGhhblw+L3MpIHsKKyAgICAgICAgICAgIHMjXDxvbXB0c1w6b3JwaGFuXD4oLio/KVw8XC9vbXB0c1w6b3JwaGFuXD4jb3JwaCRpXF8kZnVuY3Rpb25uYW1lIChsb2dGaWxlKTsjczsKKyAgICAgICAgICAgICRpKys7CisgICAgICAgIH0KKwlyZXR1cm4gJGNvZGU7Cit9CisKKyMgTElTVCBvcnBoYW5fcmVnaW9uczJmb3J0cmFuZnVuY3Rpb25zKCAkcHJlZml4LCBAY29kZSApCisjIHJlcGxhY2VzIG9ycGhhbiByZWdpb25zIGJ5IGZ1bmN0aW9uY2FsbHMgaW4gZm9ydHJhbgorc3ViIG9ycGhhbl9yZWdpb25zMmZvcnRyYW5mdW5jdGlvbnMKK3sKKwlteSAoICRwcmVmaXgsIEBjb2RlLCAkbXlfcGFybXMsICRpLCAkZnVuY3Rpb25uYW1lKTsKKwkoJHByZWZpeCwgKCRjb2RlKSwgJG15X3Bhcm1zKSA9IEBfOworCSRpID0gMTsKKwkoJGZ1bmN0aW9ubmFtZSkgPSBnZXRfdGFnX3ZhbHVlcygnb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lJywkY29kZSk7CisJZm9yZWFjaCAkXygoJGNvZGUpKQorCXsKKwkJd2hpbGUoIC9cPG9tcHRzXDpvcnBoYW5cPiguKilcPFwvb21wdHNcOm9ycGhhblw+L3MpCisJCXsKKwkJCXMjXDxvbXB0c1w6b3JwaGFuXD4oLio/KVw8XC9vbXB0c1w6b3JwaGFuXD4jICAgICAgQ0FMTCBvcnBoJGlcXyRwcmVmaXhcXyRmdW5jdGlvbm5hbWVcKCRteV9wYXJtc1wpOyNzOworCQkJJGkrKzsKKwkJfQorCX0KKwlyZXR1cm4gKCRjb2RlKTsKK30KKworIyBTQ0FMQVIgb3JwaF9mdW5jdGlvbnNfZGVjbGFyYXRpb25zKCAkcHJlZml4LCAkY29kZSApCisjIHJldHVybnMgYSBzcmluZyBpbmNsdWRpbmcgdGhlIGRlY2xhcmF0aW9uIG9mIHRoZSBmdW5jdGlvbnMgdXNlZCAKKyMgaW4gdGhlIG9ycGhhbiByZWdpb25zLiBUaGUgZnVuY3Rpb24gbmFtZXMgYXJlIGdlbmVyYXRlZCB1c2luZyAKKyMgdGhlICRwcmVmaXggYXMgcHJlZml4IGZvciB0aGUgZnVuY3Rpb25uYW1lLgorc3ViIG9ycGhfZnVuY3Rpb25zX2RlY2xhcmF0aW9ucworeworCW15ICgkcHJlZml4LCAkY29kZSk7CisJKCRwcmVmaXgsICRjb2RlKSA9IEBfOworCW15ICggQGRlZnMsICRyZXN1bHQgKTsKKwkKKwkjIGNyZWF0aW5nIGRlY2xhcmF0aW9ucyBmb3IgbGF0ZXIgdXNlZCBmdW5jdGlvbnMKKwkkcmVzdWx0IC49ICJcblxuLyogRGVjbGFyYXRpb24gb2YgdGhlIGZ1bmN0aW9ucyBjb250YWluaW5nIHRoZSBjb2RlIGZvciB0aGUgb3JwaGFuIHJlZ2lvbnMgKi9cbiNpbmNsdWRlIDxzdGRpby5oPlxuIjsKKwlAZGVmcyA9IGdldF90YWdfdmFsdWVzKCdvbXB0czpvcnBoYW4nLCRjb2RlKTsKKwlteSAoJGZ1bmN0aW9ubmFtZSwkaSk7CisJKCRmdW5jdGlvbm5hbWUpID0gZ2V0X3RhZ192YWx1ZXMoJ29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZScsJGNvZGUpOworCSRpID0gMTsKKwlmb3JlYWNoICRfKEBkZWZzKSB7CisJCSRyZXN1bHQgLj0gIlxudm9pZCBvcnBoJGlcXyRwcmVmaXhcXyRmdW5jdGlvbm5hbWUgKCBGSUxFICogbG9nRmlsZSApOyI7CisJCSRpKys7CisJfQorCSRyZXN1bHQgLj0gIlxuXG4vKiBFbmQgb2YgZGVjbGFyYXRpb24gKi9cblxuIjsKKwlyZXR1cm4gJHJlc3VsdDsKK30KKworIyBTQ0FMQVIgbWFrZV9nbG9iYWxfdmFyc19kZWZpbml0aW9uKCAkY29kZSApCisjIHJldHVybnMgYSBzcmluZyBpbmNsdWRpbmcgdGhlIGRlY2xhcmF0aW9uIGZvciB0aGUgdmFycyBuZWVkZWQgdG8KKyMgYmUgZGVjbGFyZWQgZ2xvYmFsIGZvciB0aGUgb3JwaGFuIHJlZ2lvbi4KK3N1YiBtYWtlX2dsb2JhbF92YXJzX2RlZgoreworCW15ICggJGNvZGUgKTsKKwkoJGNvZGUpID0gQF87CisJbXkgKCBAZGVmcywgJHJlc3VsdCwgQHRtcCwgQHRtcDIgLCRwcmVkZWZpbml0aW9ucyk7CisJCisJIyBjcmVhdGluZyBnbG9iYWwgZGVjbGFyYXRpb25zIGZvciB0aGUgdmFyaWFibGVzLgorCSRyZXN1bHQgID0gIlxuXG4vKiBEZWNsYXJhdGlvbiBvZiB0aGUgdmFyaWFibGVzIHVzZWQgaW4gdGhlIG9ycGhhbiByZWdpb24uICovXG4iOworCQorCSMgZ2V0IGFsbCB0YWdzIGNvbnRhaW5pbmcgdGhlIHZhcmlhYmxlIGRlZmluaXRpb25zCisJQGRlZnMgPSBnZXRfdGFnX3ZhbHVlcygnb21wdHM6b3JwaGFuOnZhcnMnLCRjb2RlKTsKKwlmb3JlYWNoICRfKEBkZWZzKQorCXsKKwkJIyBjdXR0aW5nIHRoZSBkaWZmZXJlbnQgZGVjbGFyYXRpb25zIGluIHRoZSBzYW1lIHRhZyBieSB0aGUgJzsnIGFzIGN1dHRtYXJrCisJCUB0bXAgPSBzcGxpdCgvOy8sJF8pOworCQlmb3JlYWNoICRfKEB0bXApCisJCXsKKwkJCSMgcmVwbGFjaW5nIG5ld2xpbmVzIGFuZCBkb3VibGUgc3BhY2VzCisJCQlzL1xuLy9nczsKKwkJCXMvICAvL2dzOworCQkJIyBwdXQgdGhlIG5ldyBkZWNsYXJhdGlvbiBhdCB0aGUgZW5kIG9mICRyZXN1bHQKKwkJCWlmKCRfIG5lICIiKXsgJHJlc3VsdCAuPSAiXG4gJF87IjsgfQorCQl9CisJfQorCSRyZXN1bHQgLj0gIlxuXG4vKiBFbmQgb2YgZGVjbGFyYXRpb24uICovXG5cbiI7CisJcmV0dXJuICRyZXN1bHQ7Cit9CisKKyMgU0NBTEFSIGV4dGVybl92YXJzX2RlZmluaXRpb24oICRjb2RlICkKKyMgcmV0dXJucyBhIHNyaW5nIGluY2x1ZGluZyB0aGUgZGVjbGFyYXRpb24gZm9yIHRoZSB2YXJzIG5lZWRlZCB0bworIyBiZSBkZWNsYXJlZCBleHRlcm4gZm9yIHRoZSBvcnBoYW4gcmVnaW9uLgorc3ViIGV4dGVybl92YXJzX2RlZgoreworCW15ICggJGNvZGUgKTsKKwkoJGNvZGUpID0gQF87CisJbXkgKCBAZGVmcywgJHJlc3VsdCwgQHRtcCwgQHRtcDIgLCRwcmVkZWZpbml0aW9ucyk7CisJCisJIyBjcmVhdGluZyBkZWNsYXJhdGlvbnMgZm9yIHRoZSBleHRlcm4gdmFyaWFibGVzLgorCSRyZXN1bHQgID0gIlxuXG4vKiBEZWNsYXJhdGlvbiBvZiB0aGUgZXh0ZXJuIHZhcmlhYmxlcyB1c2VkIGluIHRoZSBvcnBoYW4gcmVnaW9uLiAqL1xuIjsKKwkjICRyZXN1bHQgLj0gIlxuI2luY2x1ZGUgPHN0ZGlvLmg+XG4jaW5jbHVkZSA8b21wLmg+XG4iOworCSRyZXN1bHQgLj0gIlxuZXh0ZXJuIEZJTEUgKiBsb2dGaWxlOyI7CisJCisJIyBnZXQgYWxsIHRhZ3MgY29udGFpbmluZyB0aGUgdmFyaWFibGUgZGVmaW5pdGlvbnMKKwlAZGVmcyA9IGdldF90YWdfdmFsdWVzKCdvbXB0czpvcnBoYW46dmFycycsJGNvZGUpOworCWZvcmVhY2ggJF8oQGRlZnMpCisJeworCQkjIGN1dHRpbmcgdGhlIGRpZmZlcmVudCBkZWNsYXJhdGlvbnMgaW4gdGhlIHNhbWUgdGFnIGJ5IHRoZSAnOycgYXMgY3V0dG1hcmsKKwkJQHRtcCA9IHNwbGl0KC87LywkXyk7CisJCWZvcmVhY2ggJF8oQHRtcCkKKwkJeworCQkJIyByZXBsYWNpbmcgbmV3bGluZXMgYW5kIGRvdWJsZSBzcGFjZXMKKwkJCXMvXG4vL2dzOworCQkJcy8gIC8vZ3M7CisJCQkjIGN1dHRpbmcgb2ZmIGRlZmluaXRpb25zCisJCQlAdG1wMiA9IHNwbGl0KCI9IiwkXyk7CisJCQkjIHB1dCB0aGUgbmV3IGRlY2xhcmF0aW9uIGF0IHRoZSBlbmQgb2YgJHJlc3VsdAorCQkJJHJlc3VsdCAuPSAiXG5leHRlcm4gJHRtcDJbMF07IjsKKwkJfQorCX0KKwkkcmVzdWx0IC49ICJcblxuLyogRW5kIG9mIGRlY2xhcmF0aW9uLiAqL1xuXG4iOworCXJldHVybiAkcmVzdWx0OworfQorCitzdWIgbGVhdmVfc2luZ2xlX3NwYWNlCit7CisgIG15KCRzdHIpOworICAoJHN0cik9QF87CisgIGlmKCRzdHIgbmUgIiIpCisgIHsKKyAgICAkc3RyID1+IHMvXlsgXHRdKy8gLzsKKyAgICAkc3RyID1+IHMvWyBcdF0rXG4kL1xuLzsKKyAgICAkc3RyID1+IHMvWyBcdF0rLy9nOworICB9CisgIHJldHVybiAkc3RyOworfQorCityZXR1cm4gMTsKZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9vbXB0c19zdGFuZGFsb25lUHJvYy5jIGIvZmluYWwvdGVzdHN1aXRlL29tcHRzX3N0YW5kYWxvbmVQcm9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAzMDUyYQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9vbXB0c19zdGFuZGFsb25lUHJvYy5jCkBAIC0wLDAgKzEsNTEgQEAKK2ludCBtYWluKCkKK3sKKwlpbnQgaTsJCQkvKiBMb29wIGluZGV4ICovCisJaW50IHJlc3VsdDsJCS8qIHJldHVybiB2YWx1ZSBvZiB0aGUgcHJvZ3JhbSAqLworCWludCBmYWlsZWQ9MDsgCQkvKiBOdW1iZXIgb2YgZmFpbGVkIHRlc3RzICovCisJaW50IHN1Y2Nlc3M9MDsJCS8qIG51bWJlciBvZiBzdWNjZWVkZWQgdGVzdHMgKi8KKwlzdGF0aWMgRklMRSAqIGxvZ0ZpbGU7CS8qIHBvaW50ZXIgb250byB0aGUgbG9nZmlsZSAqLworCXN0YXRpYyBjb25zdCBjaGFyICogbG9nRmlsZU5hbWUgPSAiYmluL2MvPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPi5sb2ciOwkvKiBuYW1lIG9mIHRoZSBsb2dmaWxlICovCisKKworCS8qIE9wZW4gYSBuZXcgTG9nZmlsZSBvciBvdmVyd3JpdGUgdGhlIGV4aXN0aW5nIG9uZS4gKi8KKwlsb2dGaWxlID0gZm9wZW4obG9nRmlsZU5hbWUsIncrIik7CisKKwlwcmludGYoIiMjIyMjIyMjIE9wZW5NUCBWYWxpZGF0aW9uIFN1aXRlIFYgJXMgIyMjIyMjXG4iLCBPTVBUU19WRVJTSU9OICk7CisJcHJpbnRmKCIjIyBSZXBldGl0aW9uczogJTNkICAgICAgICAgICAgICAgICAgICAgICAjIyMjXG4iLFJFUEVUSVRJT05TKTsKKwlwcmludGYoIiMjIExvb3AgQ291bnQgOiAlNmQgICAgICAgICAgICAgICAgICAgICMjIyNcbiIsTE9PUENPVU5UKTsKKwlwcmludGYoIiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcbiIpOworCXByaW50ZigiVGVzdGluZyA8ZGlyZWN0aXZlPjwvZGlyZWN0aXZlPlxuXG4iKTsKKworCWZwcmludGYobG9nRmlsZSwiIyMjIyMjIyMgT3Blbk1QIFZhbGlkYXRpb24gU3VpdGUgViAlcyAjIyMjIyNcbiIsIE9NUFRTX1ZFUlNJT04gKTsKKwlmcHJpbnRmKGxvZ0ZpbGUsIiMjIFJlcGV0aXRpb25zOiAlM2QgICAgICAgICAgICAgICAgICAgICAgICMjIyNcbiIsUkVQRVRJVElPTlMpOworCWZwcmludGYobG9nRmlsZSwiIyMgTG9vcCBDb3VudCA6ICU2ZCAgICAgICAgICAgICAgICAgICAgIyMjI1xuIixMT09QQ09VTlQpOworCWZwcmludGYobG9nRmlsZSwiIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuIik7CisJZnByaW50Zihsb2dGaWxlLCJUZXN0aW5nIDxkaXJlY3RpdmU+PC9kaXJlY3RpdmU+XG5cbiIpOworCisJZm9yICggaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrICkgeworCQlmcHJpbnRmIChsb2dGaWxlLCAiXG5cbiVkLiBydW4gb2YgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiBvdXQgb2YgJWRcblxuIixpKzEsUkVQRVRJVElPTlMpOworCQlpZig8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+KGxvZ0ZpbGUpKXsKKwkJCWZwcmludGYobG9nRmlsZSwiVGVzdCBzdWNjZXNzZnVsLlxuIik7CisJCQlzdWNjZXNzKys7CisJCX0KKwkJZWxzZSB7CisJCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yOiBUZXN0IGZhaWxlZC5cbiIpOworCQkJcHJpbnRmKCJFcnJvcjogVGVzdCBmYWlsZWQuXG4iKTsKKwkJCWZhaWxlZCsrOworCQl9CisJfQorCisgICAgaWYoZmFpbGVkPT0wKXsKKwkJZnByaW50Zihsb2dGaWxlLCJcbkRpcmVjdGl2ZSB3b3JrZWQgd2l0aG91dCBlcnJvcnMuXG4iKTsKKwkJcHJpbnRmKCJEaXJlY3RpdmUgd29ya2VkIHdpdGhvdXQgZXJyb3JzLlxuIik7CisJCXJlc3VsdD0wOworCX0KKwllbHNleworCQlmcHJpbnRmKGxvZ0ZpbGUsIlxuRGlyZWN0aXZlIGZhaWxlZCB0aGUgdGVzdCAlaSB0aW1lcyBvdXQgb2YgJWkuICVpIHdlcmUgc3VjY2Vzc2Z1bFxuIixmYWlsZWQsUkVQRVRJVElPTlMsc3VjY2Vzcyk7CisJCXByaW50ZigiRGlyZWN0aXZlIGZhaWxlZCB0aGUgdGVzdCAlaSB0aW1lcyBvdXQgb2YgJWkuXG4laSB0ZXN0KHMpIHdlcmUgc3VjY2Vzc2Z1bFxuIixmYWlsZWQsUkVQRVRJVElPTlMsc3VjY2Vzcyk7CisJCXJlc3VsdCA9IChpbnQpICgoKGRvdWJsZSkgZmFpbGVkIC8gKGRvdWJsZSkgUkVQRVRJVElPTlMgKSAqIDEwMCApOworCX0KKwlwcmludGYgKCJSZXN1bHQ6ICVpXG4iLCByZXN1bHQpOworCXJldHVybiByZXN1bHQ7Cit9CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvb21wdHNfc3RhbmRhbG9uZVByb2MuZiBiL2ZpbmFsL3Rlc3RzdWl0ZS9vbXB0c19zdGFuZGFsb25lUHJvYy5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhZmNhYjYKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvb21wdHNfc3RhbmRhbG9uZVByb2MuZgpAQCAtMCwwICsxLDY4IEBACishVGhpcyBpcyB0aGUgbWFpbiBkcml2ZXIgdG8gaW52b2tlIGRpZmZlcmVudCB0ZXN0IGZ1bmN0aW9ucworICAgICAgUFJPR1JBTSA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+X21haW4KKyAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgIElOVEVHRVIgZmFpbGVkLCBzdWNjZXNzICFOdW1iZXIgb2YgZmFpbGVkL3N1Y2NlZWRlZCB0ZXN0cworICAgICAgSU5URUdFUiBudW1fdGVzdHMsY3Jvc3NjaGVja2VkLCBjcm9zc2ZhaWxlZCwgagorICAgICAgSU5URUdFUiB0ZW1wLHRlbXAxCisgICAgICBJTkNMVURFICJvbXBfdGVzdHN1aXRlLmYiCisKKyAgICAgIElOVEVHRVIgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPgorCisKKyAgICAgIENIQVJBQ1RFUio1MCBsb2dmaWxlbmFtZSAhUG9pbnRlciB0byBsb2dmaWxlCisgICAgICBJTlRFR0VSIHJlc3VsdCAKKworICAgICAgbnVtX3Rlc3RzID0gMAorICAgICAgY3Jvc3NjaGVja2VkID0gMAorICAgICAgY3Jvc3NmYWlsZWQgPSAwCisgICAgICByZXN1bHQgPSAxCisgICAgICBmYWlsZWQgPSAwCisKKyAgICAgICFPcGVuIGEgbmV3IGxvZ2ZpbGUgb3Igb3ZlcndyaXRlIHRoZSBleGlzdGluZyBvbmUuCisgICAgICBsb2dmaWxlbmFtZSA9ICJiaW4vZm9ydHJhbi88dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+LmxvZyIKKyEgICAgICBXUklURSAoKiwqKSAiRW50ZXIgbG9nRmlsZW5hbWU6IiAKKyEgICAgICBSRUFEICAoKiwqKSBsb2dmaWxlbmFtZQorCisgICAgICBPUEVOICgxLCBGSUxFID0gbG9nZmlsZW5hbWUpCisgCisgICAgICBXUklURSAoKiwqKSAiIyMjIyMjIyMgT3Blbk1QIFZhbGlkYXRpb24gU3VpdGUgViAzLjBhICMjIyMjIyIKKyAgICAgIFdSSVRFICgqLCopICIjIyBSZXBldGl0aW9uczoiLCBOIAorICAgICAgV1JJVEUgKCosKikgIiMjIExvb3AgQ291bnQgOiIsIExPT1BDT1VOVAorICAgICAgV1JJVEUgKCosKikgIiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMiCisgICAgICBXUklURSAoKiwqKQorCisgICAgICBjcm9zc2ZhaWxlZD0wCisgICAgICByZXN1bHQ9MQorICAgICAgV1JJVEUgKDEsKikgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgorICAgICAgV1JJVEUgKDEsKikgIlRlc3RpbmcgPGRpcmVjdGl2ZT48L2RpcmVjdGl2ZT4iCisgICAgICBXUklURSAoMSwqKSAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCisgICAgICBXUklURSAoMSwqKSAKKyAgICAgIFdSSVRFICgxLCopICJ0ZXN0bmFtZTogPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiIKKyAgICAgIFdSSVRFICgxLCopICIoQ3Jvc3N0ZXN0cyBzaG91bGQgZmFpbCkiCisgICAgICBXUklURSAoMSwqKQorICAgICAgCisgICAgICBETyBqID0gMSwgTgorICAgICAgICB0ZW1wID0gIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJRiAodGVtcCAuRVEuIDEpIFRIRU4KKyAgICAgICAgICBXUklURSAoMSwqKSAgaiwgIi4gdGVzdCBzdWNjZXNzZnVsLiIKKyAgICAgICAgICBzdWNjZXNzID0gc3VjY2VzcyArIDEKKyAgICAgICAgRUxTRQorICAgICAgICAgIFdSSVRFICgxLCopICJFcnJvcjogIixqLCAiLiB0ZXN0IGZhaWxlZC4iCisgICAgICAgICAgZmFpbGVkID0gZmFpbGVkICsgMQorICAgICAgICBFTkRJRgorICAgICAgRU5EIERPCisKKyAgICAgIAorICAgICAgSUYgKGZhaWxlZCAuRVEuIDApIFRIRU4KKyAgICAgICAgV1JJVEUgKDEsKikgIkRpcmVjdGl2ZSB3b3JrZWQgd2l0aG91dCBlcnJvcnMuIgorICAgICAgICBXUklURSAoKiwqKSAiRGlyZWN0aXZlIHdvcmtlZCB3aXRob3V0IGVycm9ycy4iCisgICAgICAgIHJlc3VsdCA9IDAKKyAgICAgICAgV1JJVEUgKCosKikgIlJlc3VsdDoiLHJlc3VsdAorICAgICAgRUxTRQorICAgICAgICBXUklURSAoMSwqKSAiRGlyZWN0aXZlIGZhaWxlZCB0aGUgdGVzdCAiLCBmYWlsZWQsICIgdGltZXMuIgorICAgICAgICBXUklURSAoKiwqKSAiRGlyZWN0aXZlIGZhaWxlZCB0aGUgdGVzdCAiLCBmYWlsZWQsICIgdGltZXMuIgorICAgICAgICByZXN1bHQgPSBmYWlsZWQgKiAxMDAgLyBOCisgICAgICAgIFdSSVRFICgqLCopICJSZXN1bHQ6IixyZXN1bHQKKyAgICAgIEVORElGCisgICAgICBDQUxMIEVYSVQgKHJlc3VsdCkKKyAgICAgIEVORCBQUk9HUkFNIApkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL3J1bnRlc3QucGwgYi9maW5hbC90ZXN0c3VpdGUvcnVudGVzdC5wbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zNDcyMzUxCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL3J1bnRlc3QucGwKQEAgLTAsMCArMSw1OTIgQEAKKyMhL3Vzci9iaW4vZW52IHBlcmwKKworIyBydW50ZXN0IFtvcHRpb25zXSBGSUxFTkFNRQorIworIyBSZWFkIHRoZSBmaWxlIEZJTEVOQU1FLiBFYWNoIGxpbmUgY29udGFpbnMgYSB0ZXN0LgorIyBDb252ZXJ0IHRlbXBsYXRlIHRvIHRlc3QgYW5kIGNyb3NzdGVzdC4KKyMgSWYgcG9zc2lsYmxlIGdlbmVyYXRlIG9ycGhhbmVkIHRlc3R2ZXJzaW9ucywgdG9vLgorIyBVc2UgbWFrZSB0byBjb21waWxlIHRoZSB0ZXN0CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEdsb2JhbCBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBydW50ZXN0c2NyaXB0IGl0c2VsZjoKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgbmFtZSBvZiB0aGUgZ2xvYmFsIGNvbmZpZ3VyYXRpb24gZmlsZSBmb3IgdGhlIHRlc3RzdWl0ZToKKyRjb25maWdfZmlsZSAgICA9ICJvbXB0cy5jb25mIjsKKyRsb2dmaWxlICAgICAgICA9ICJvbXB0cy5sb2ciOyAjIG92ZXJ3cml0ZWFibGUgYnkgdmFsdWUgaW4gY29uZmlnIGZpbGUKKyRlbnZfc2V0X3RocmVhZHNfY29tbWFuZCA9ICdPTVBfTlVNX1RIUkVBRFM9JW47IGV4cG9ydCBPTVBfTlVNX1RIUkVBRFM7JzsKKyRkZWJ1Z19tb2RlICAgICA9IDA7CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBBZnRlciB0aGlzIGxpbmUgdGhlIHNjcmlwdCBwYXJ0IGJlZ2lucyEgRG8gbm90IGVkaXQgYW5pdGhpbmcgYmVsb3cKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKworIyBOYW1lc3BhY2VzOgordXNlIEdldG9wdDo6TG9uZzsKKyN1c2UgVW5peDo6UElEOwordXNlIERhdGE6OkR1bXBlcjsKK3VzZSBvbXB0c19wYXJzZXJGdW5jdGlvbnM7CisKKyMgRXh0cmFjdGluZyBnaXZlbiBvcHRpb25zCitHZXRPcHRpb25zKCJoZWxwIiwKKyAgICAgICJsaXN0bGFuZ3VhZ2VzIiwKKyAgICAgICJsYW5nPXMiLAorICAgICAgImxpc3QiLAorICAgICAgInRlc3RpbmZvPXMiLAorICAgICAgIm51bXRocmVhZHM9aSIsCisgICAgICAidGVzdD1zIiwKKyAgICAgICJjb21waWxlISIsCisgICAgICAicnVuISIsCisgICAgICAib3JwaGFuISIsCisgICAgICAicmVzdWx0ZmlsZT1zIgorICAgICAgKTsKKworIyBHZXQgZ2xvYmFsIGNvbmZpZ3VyYXRpbm8gb3B0aW9ucyBmcm9tIGNvbmZpZyBmaWxlOgoraWYoISAtZSAkY29uZmlnX2ZpbGUpeyBlcnJvciAoIkNvdWxkIG5vdCBmaW5kIGNvbmZpZyBmaWxlICRjb25maWdfZmlsZVxuIiwgMSk7fQorb3BlbiAoQ09ORklHLCAiPCRjb25maWdfZmlsZSIpIG9yIGVycm9yICgiQ291bGQgbm90IG9wZW4gY29uZmlnIGZpbGUgJGNvbmZpZ19maWxlXG4iLCAyKTsKK3doaWxlICg8Q09ORklHPikgeyAkY29uZmlnIC49ICRfOyB9CitjbG9zZSAoQ09ORklHKTsKKworKCRsb2dmaWxlKSA9IGdldF90YWdfdmFsdWVzICgibG9nZmlsZSIsICRjb25maWcpOworKCR0aW1lb3V0KSA9IGdldF90YWdfdmFsdWVzICgic2luZ2xldGVzdHRpbWVvdXQiLCAkY29uZmlnKTsKKygkZGlzcGxheV9lcnJvcnMpID0gZ2V0X3RhZ192YWx1ZXMoImRpc3BsYXllcnJvcnMiLCAkY29uZmlnKTsKKygkZGlzcGxheV93YXJuaW5ncykgPSBnZXRfdGFnX3ZhbHVlcyAoImRpc3BsYXl3YXJuaW5ncyIsICRjb25maWcpOworKCRudW10aHJlYWRzKSA9IGdldF90YWdfdmFsdWVzICgibnVtdGhyZWFkcyIsICRjb25maWcpOworKCRlbnZfc2V0X3RocmVhZHNfY29tbWFuZCkgPSBnZXRfdGFnX3ZhbHVlcygiZW52c2V0dGhyZWFkc2NvbW1hbmQiLCRjb25maWcpOworJGVudl9zZXRfdGhyZWFkc19jb21tYW5kID1+IHMvXCVuLyRudW10aHJlYWRzL2c7CitAbGFuZ3VhZ2VzID0gZ2V0X3RhZ192YWx1ZXMgKCJsYW5ndWFnZSIsICRjb25maWcpOworCitpZiAoIWRlZmluZWQoJG9wdF9jb21waWxlKSkgeyRvcHRfY29tcGlsZSA9IDE7fQoraWYgKCFkZWZpbmVkKCRvcHRfcnVuKSkgICAgIHskb3B0X3J1biA9IDE7fQoraWYgKCFkZWZpbmVkKCRvcHRfb3JwaGFuKSkgeyRvcHRfb3JwaGFuID0gMTt9CitpZiAoIWRlZmluZWQoJG9wdF9yZXN1bHRzZmlsZSkpIHsoJG9wdF9yZXN1bHRzZmlsZSkgPSBnZXRfdGFnX3ZhbHVlcygicmVzdWx0c2ZpbGUiLCAkY29uZmlnKTt9CitpZiAoIGRlZmluZWQoJG9wdF9udW10aHJlYWRzKSAmJiAoJG9wdF9udW10aHJlYWRzID4gMCkpIHskbnVtdGhyZWFkcyA9ICRvcHRfbnVtdGhyZWFkczt9CitpZiAoJGRlYnVnX21vZGUpIHsKK3ByaW50IDw8RU9GOworVGVzdHN1aXRlIGNvbmZpZ3VyYXRpb246CitMb2dmaWxlID0gJGxvZ2ZpbGUKK1RpbWVvdXQgPSAkdGltZW91dCBzZWNvbmRzCitMYW5ndWFnZTogICRvcHRfbGFuZworRGlzcGxheSBlcnJvcnM6ICAgJGRpc3BsYXlfZXJyb3JzCitEaXNwbGF5IHdhcm5pbmdzOiAkZGlzcGxheV93YXJuaW5ncworUmVzdWx0c2ZpbGU6ICAgICAgJG9wdF9yZXN1bHRzZmlsZQorTnVtdGhyZWFkczogJG51bXRocmVhZHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRU9GCit9CisKKyRudW1fY29uc3RydWNzICAgID0gMDsKKyRudW1fdGVzdHMgICAgICAgID0gMDsKKyRudW1fZmFpbGVkX3Rlc3RzID0gMDsKKyRudW1fc3VjY2Vzc2Z1bF90ZXN0cyAgID0gMDsKKyRudW1fdmVyaWZpZWRfdGVzdHMgICAgID0gMDsKKyRudW1fZmFpbGVkX2NvbXBpbGF0aW9uID0gMDsKKworJG51bV9ub3JtYWxfdGVzdHNfZmFpbGVkID0gMDsKKyRudW1fbm9ybWFsX3Rlc3RzX2NvbXBpbGVfZXJyb3IgPSAwOworJG51bV9ub3JtYWxfdGVzdHNfdGltZWRfb3V0ID0gMDsKKyRudW1fbm9ybWFsX3Rlc3RzX3N1Y2Nlc3NmdWwgPSAwOworJG51bV9ub3JtYWxfdGVzdHNfdmVyaWZpZWQgPSAwOworCiskbnVtX29ycGhhbmVkX3Rlc3RzX2ZhaWxlZCA9IDA7CiskbnVtX29ycGhhbmVkX3Rlc3RzX2NvbXBpbGVfZXJyb3IgPSAwOworJG51bV9vcnBoYW5lZF90ZXN0c190aW1lZF9vdXQgPSAwOworJG51bV9vcnBoYW5lZF90ZXN0c19zdWNjZXNzZnVsID0gMDsKKyRudW1fb3JwaGFuZWRfdGVzdHNfdmVyaWZpZWQgPSAwOworCitpZiAoJG9wdF9oZWxwKSAgICAgICAgIHsgcHJpbnRfaGVscF90ZXh0ICgpOyAgIGV4aXQgMDsgfQoraWYgKCRvcHRfbGlzdGxhbmd1YWdlcyl7IHByaW50X2F2YWlsX2xhbmdzICgpOyBleGl0IDA7IH0KK2lmICgkb3B0X2xpc3QpICAgICB7IHByaW50X2F2YWlsX3Rlc3RzICgpOyAgIGV4aXQgMDsgfQoraWYgKCRvcHRfdGVzdGluZm8pIHsgcHJpbnRfdGVzdGluZm8gKCk7ICAgICAgZXhpdCAwOyB9CitpZiAoJG9wdF90ZXN0KSAgICAgeyB3cml0ZV9yZXN1bHRfZmlsZV9oZWFkKCk7CisgICAgICAgICAgICAgICAgICAgICBleGVjdXRlX3NpbmdsZV90ZXN0ICgpOyBleGl0IDA7IH0KK2lmICgtZSAkQVJHVlswXSkgICB7IHdyaXRlX3Jlc3VsdF9maWxlX2hlYWQoKTsKKyAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVfdGVzdGxpc3QoJEFSR1ZbMF0pOyBwcmludF9yZXN1bHRzKCk7CisgICAgICAgICAgICAgICAgICAgICByZXN1bHRfc3VtbWFyeSgpOyBleGl0IDA7fQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBzdWIgZnVuY3Rpb24gZGVmaW5pdGlvbnMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgRnVuY3Rpb24gd2hpY2ggcHJpbnRzIHRoZSByZXN1bHRzIGZpbGUKK3N1YiBwcmludF9yZXN1bHRzCit7CisgICAgc3lzdGVtKCJlY2hvOyBjYXQgJG9wdF9yZXN1bHRzZmlsZTsgZWNobzsiKTsKK30KKworIyBGdW5jdGlvbiB3aGljaCBwcmludHMgYSBzdW1tYXJ5IG9mIGFsbCB0ZXN0CitzdWIgcmVzdWx0X3N1bW1hcnkKK3sKKyAgICBteSAkbnVtX2RpcmVjdGl2ZXMgPSBAdGVzdF9yZXN1bHRzOworCisgICAgcHJpbnQgPDxFT0Y7CisKK1N1bW1hcnk6CitTIE51bWJlciBvZiB0ZXN0ZWQgT3BlbiBNUCBjb25zdHJ1Y3RzOiAkbnVtX2NvbnN0cnVjdHMKK1MgTnVtYmVyIG9mIHVzZWQgdGVzdHM6ICAgICAgICAgICAgICAgICRudW1fdGVzdHMKK1MgTnVtYmVyIG9mIGZhaWxlZCB0ZXN0czogICAgICAgICAgICAgICRudW1fZmFpbGVkX3Rlc3RzCitTIE51bWJlciBvZiBzdWNjZXNzZnVsIHRlc3RzOiAgICAgICAgICAkbnVtX3N1Y2Nlc3NmdWxfdGVzdHMKK1MgKyBmcm9tIHRoaXMgd2VyZSB2ZXJpZmllZDogICAgICAgICAgICRudW1fdmVyaWZpZWRfdGVzdHMKKworTm9ybWFsIHRlc3RzOgorTiBOdW1iZXIgb2YgZmFpbGVkIHRlc3RzOiAgICAgICAgICAgICAgJG51bV9ub3JtYWxfdGVzdHNfZmFpbGVkCitOICsgZnJvbSB0aGlzIGZhaWwgY29tcGlsYXRpb246ICAgICAgICAkbnVtX25vcm1hbF90ZXN0c19jb21waWxlX2Vycm9yCitOICsgZnJvbSB0aGlzIHRpbWVkIG91dCAgICAgICAgICAgICAgICAkbnVtX25vcm1hbF90ZXN0c190aW1lZF9vdXQKK04gTnVtYmVyIG9mIHN1Y2Nlc3NmdWwgdGVzdHM6ICAgICAgICAgICRudW1fbm9ybWFsX3Rlc3RzX3N1Y2Nlc3NmdWwKK04gKyBmcm9tIHRoaXMgd2VyZSB2ZXJpZmllZDogICAgICAgICAgICRudW1fbm9ybWFsX3Rlc3RzX3ZlcmlmaWVkCisKK09ycGhhbmVkIHRlc3RzOgorTyBOdW1iZXIgb2YgZmFpbGVkIHRlc3RzOiAgICAgICAgICAgICAgJG51bV9vcnBoYW5lZF90ZXN0c19mYWlsZWQKK08gKyBmcm9tIHRoaXMgZmFpbCBjb21waWxhdGlvbjogICAgICAgICRudW1fb3JwaGFuZWRfdGVzdHNfY29tcGlsZV9lcnJvcgorTyArIGZyb20gdGhpcyB0aW1lZCBvdXQgICAgICAgICAgICAgICAgJG51bV9vcnBoYW5lZF90ZXN0c190aW1lZF9vdXQKK08gTnVtYmVyIG9mIHN1Y2Nlc3NmdWwgdGVzdHM6ICAgICAgICAgICRudW1fb3JwaGFuZWRfdGVzdHNfc3VjY2Vzc2Z1bAorTyArIGZyb20gdGhpcyB3ZXJlIHZlcmlmaWVkOiAgICAgICAgICAgJG51bV9vcnBoYW5lZF90ZXN0c192ZXJpZmllZAorRU9GCisKK30KKworIyBGdW5jdGlvbiB0aGF0IGV4ZWN1dGVzdCB0aGUgdGVzdHMgc3BlY2lmaWVkIGluIHRoZSBnaXZlbiBsaXN0CitzdWIgZXhlY3V0ZV90ZXN0bGlzdAoreworICAgIG15ICgkZmlsZW5hbWUpID0gQF87CisgICAgIyBvcGVuaW5nIHRlc3RsaXN0CisgICAgb3BlbihURVNUUywkZmlsZW5hbWUpIG9yIGVycm9yICgiQ291bGQgbm90IG9wZW4gICRmaWxlbmFtZVxuIiwgMSk7CitURVNUOiB3aGlsZSAoPFRFU1RTPikgeworICAgICAgICBpZiAoL15ccyojLykge25leHQgVEVTVDt9CisgICAgICAgIGlmICgvXlxzKiQvKSB7bmV4dCBURVNUO30KKyAgICAgICAgJG9wdF90ZXN0ID0gJF87CisgICAgICAgIGNob21wICgkb3B0X3Rlc3QpOworICAgICAgICBleGVjdXRlX3NpbmdsZV90ZXN0ICgpOworICAgIH0KKyMgcHJpbnQgRHVtcGVyKEB0ZXN0X3Jlc3VsdHMpOworfQorCisjIEZ1bmN0aW9uIHRoYXQgZXhlY3V0ZXMgYSBzeXN0ZW0gY29tbWFuZCBidXQgdGFrZXMgY2FyZSBvZiB0aGUgZ2xvYmFsIHRpbWVvdXQKKyMgSWYgY29tbWFuZCBkaWQgbm90IGZpbmlzaCBpbmJldHdlZW4gcmV0dXJucyAnLScgb3RoZXJ3aXNlIHRoZSBleGl0IHN0YXR1cyBvZgorIyB0aGUgc3lzdGVtIGNvbW1hbmQKK3N1YiB0aW1lZF9zeXNfY29tbWFuZAoreworICAgIG15ICgkY29tbWFuZCkgPSBAXzsKKyAgICBteSAkZXhpdF9zdGF0dXMgPSAnLSc7CisKKyMgc2V0IHVwIHRoZSB0aW1lb3V0IGZvciB0aGUgY29tbWFuZAorICAgIGV2YWwgeworICAgICAgICBsb2NhbCAkU0lHe0FMUk19ID0gc3ViIHtkaWUgImFsYXJtXG4ifTsKKyAgICAgICAgYWxhcm0gJHRpbWVvdXQ7CisgICAgICAgIGxvZ19tZXNzYWdlX2FkZCAoIlN0YXJ0aW5nIGNvbW1hbmQgXCIkY29tbWFuZFwiIik7CisgICAgICAgICRleGl0X3N0YXR1cyA9IHN5c3RlbSAoJGNvbW1hbmQpOworICAgICAgICBhbGFybSAwOworICAgIH07CisjIGNoZWNrIGlmIGNvbW1hbmQgZmluaXNoZWQgZHVyaW5nIHRoZSBtYXhpbXVtIGV4ZWN1dGlvbiB0aW1lCisgICAgaWYgKCRAIGVxICJhbGFybVxuIikgeworIyB0ZXN0IHRpbWVkIG91dAorIwkJbXkgJHBpZCA9IFVuaXg6OlBJRC0+bmV3KCk7CisjCQkkcGlkLT5nZXRfcGlkb2YoJGNvbW1hbmQsIDEpOworIwkJJHBpZC0+a2lsbCgpOworICAgICAgICBpZiAoJGRlYnVnX21vZGUpIHsKKwkgICAgbG9nX21lc3NhZ2VfYWRkICgiQ29tbWFuZCBcIiRjb21tYW5kXCIgcmVhY2hlZCBtYXggZXhlY3V0aW9uIHRpbWUuXG4iKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gIlRPIjsKKyAgICB9CisjIHRlc3QgZmluaXNoZWQKKyAgICByZXR1cm4gJGV4aXRfc3RhdHVzOworfQorCisjIEZ1bmN0aW9uIHRoYXQgcnVucyB0aGUgdGVzdHMgZ2l2ZW4gYXMgYSBhcnJheSBjb250YWluaW5nIHRoZSB0ZXN0bmFtZXMKKyMgUmV0dXJucyBhbiBhcnJheSBjb250YWluaW5nIHRoZSBwZXJjZW50IHZhbHVlcyBvZiB0aGUgcGFzc2VkIHRlc3RzIGFuZCB0aGUKKyMgc3VjY2Vzc2Z1bCBjcm9zc3Rlc3RzLgorc3ViIHJ1bl90ZXN0Cit7CisgICAgbXkgKCR0ZXN0bmFtZSwgJG9ycGhhbikgPSBAXzsKKyAgICBteSAkYmluX25hbWUsICRjYmluX25hbWU7CisgICAgbXkgJGNtZCwgJGV4aXRfc3RhdHVzLCAkZmFpbGVkOworICAgIG15ICRyZXN1bHR0ZXN0LCAkcmVzdWx0Y3Rlc3Q7CisKKyMgcGF0aCB0byB0ZXN0IGFuZCBjcm9zc3Rlc3QgZWl0aGVyIGluIG5vcm1hbCBvciBpbiBvcnBoYW5lZCB2ZXJzaW9uCisgICAgaWYgKCRvcnBoYW4pIHsKKyAgICAgICAgJGJpbl9uYW1lICA9ICJiaW4vJG9wdF9sYW5nL29ycGhfdGVzdF8kdGVzdG5hbWUiOworICAgICAgICAkY2Jpbl9uYW1lID0gImJpbi8kb3B0X2xhbmcvb3JwaF9jdGVzdF8kdGVzdG5hbWUiOworICAgIH0gZWxzZSB7CisgICAgICAgICRiaW5fbmFtZSAgPSAiYmluLyRvcHRfbGFuZy90ZXN0XyR0ZXN0bmFtZSI7CisgICAgICAgICRjYmluX25hbWUgPSAiYmluLyRvcHRfbGFuZy9jdGVzdF8kdGVzdG5hbWUiOworICAgIH0KKyMgQ2hlY2sgaWYgZXhlY3V0YWJsZXMgZXhpc3QKKyAgICBpZiAoISAtZSAkYmluX25hbWUpIHsKKyAgICAgICAgdGVzdF9lcnJvciAoIkNvdWxkIG5vdCBmaW5kIGV4ZWN1dGFibGUgXCIkYmluX25hbWVcIi4iKTsKKyAgICAgICAgcmV0dXJuICgndGVzdCcgPT4gJy0nLCAnY3Jvc3N0ZXN0JyA9PiAnLScpOworICAgIH0KKyMgcnVuIHRoZSB0ZXN0CisgICAgJGNtZCA9ICIkZW52X3NldF90aHJlYWRzX2NvbW1hbmQgLi8kYmluX25hbWUgPiRiaW5fbmFtZS5vdXQiOworICAgIHByaW50ICJSdW5uaW5nIHRlc3Qgd2l0aCAkbnVtdGhyZWFkcyB0aHJlYWRzIC4iOworICAgICRleGl0X3N0YXR1cyA9IHRpbWVkX3N5c19jb21tYW5kICgkY21kKTsKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDaGVjayBpZiB0ZXN0IGZpbmlzaGVkIHdpdGhpbiBtYXggZXhlY3V0aW9uIHRpbWUKKyAgICBpZiAoJGV4aXRfc3RhdHVzIGVxICdUTycpIHsKKyAgICAgICAgcHJpbnQgIi4uLi4gZmFpbGVkICh0aW1lb3V0KVxuIjsKKyAgICAgICAgcmV0dXJuICgndGVzdCcgPT4gJ1RPJywgJ2Nyb3NzdGVzdCcgPT4gJy0nKQorICAgIH0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBjaGVjayBpZiBhbGwgdGVzdHMgd2VyZSBzdWNjZXNzZnVsCisgICAgJGZhaWxlZCA9ICRleGl0X3N0YXR1cyA+PiA4OworICAgIGlmICgkZmFpbGVkIDwgMCBvciAkZmFpbGVkID4gMTAwKSB7ICRmYWlsZWQgPSAxMDA7IH0KKyAgICAkcmVzdWx0dGVzdCA9IDEwMCAtICRmYWlsZWQ7CisgICAgaWYgKCRyZXN1bHR0ZXN0IGVxIDEwMCkgeworICAgICAgICBwcmludCAiLi4uLiBzdWNjZXNzIC4uLiI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnQgIi4uLi4gZmFpbGVkICRmYWlsZWRcJSBvZiB0aGUgdGVzdHNcbiI7CisgICAgICAgIHJldHVybiAoJ3Rlc3QnID0+ICRyZXN1bHR0ZXN0LCAnY3Jvc3N0ZXN0JyA9PiAnLScpOworICAgIH0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIGRvIGNyb3NzdGVzdAorIyBjaGVjayBpZiBleGVjdXRhYmxlIGV4aXN0CisgICAgaWYgKCEgLWUgJGNiaW5fbmFtZSkgeworICAgICAgICB0ZXN0X2Vycm9yICgiQ291bGQgbm90IGZpbmQgZXhlY3V0YWJsZSBcIiRjYmluX25hbWVcIi4iKTsKKyAgICAgICAgcHJpbnQgIi4uLiBub3QgdmVyaWZpZWQgKGNyb3NzdGVzdCBtaXNzaW5nKVxuIjsKKyAgICAgICAgcmV0dXJuICgndGVzdCcgPT4gJHJlc3VsdHRlc3QsICdjcm9zc3Rlc3QnID0+ICctJyk7CisgICAgfQorIyBydW4gY3Jvc3N0ZXN0CisjIFRlc3Qgd2FzIHN1Y2Nlc3NmdWwsIHNvIGl0IG1ha2VzIHNlbnNlIHRvIHJ1biB0aGUgY3Jvc3N0ZXN0CisgICAgJGNtZCA9ICIkZW52X3NldF90aHJlYWRzX2NvbW1hbmQgLi8kY2Jpbl9uYW1lID4gJGNiaW5fbmFtZS5vdXQiOworICAgICRleGl0X3N0YXR1cyA9IHRpbWVkX3N5c19jb21tYW5kICgkY21kKTsKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDaGVjayBpZiBjcm9zc3Rlc3QgZmluaXNoZWQgd2l0aGluIG1heCBleGVjdXRpb24gdGltZQorICAgIGlmICgkZXhpdF9zdGF0dXMgZXEgJ1RPJykgeworICAgICAgICBwcmludCAiLi4uIG5vdCB2ZXJpZmllZCAodGltZW91dClcbiI7CisgICAgICAgIHJldHVybiAoJ3Rlc3QnID0+ICRyZXN1bHQsICdjcm9zc3Rlc3QnID0+ICdUTycpOworICAgIH0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyB0ZXN0IGlmIGNyb3NzdGVzdHMgZmFpbGVkIGFzIGV4cGVjdGVkCisgICAgJHJlc3VsdGN0ZXN0ID0gJGV4aXRfc3RhdHVzID4+IDg7CisgICAgaWYgKCRyZXN1bHRjdGVzdCA+IDApIHsKKyAgICAgICAgcHJpbnQgIi4uLiBhbmQgdmVyaWZpZWQgd2l0aCAkcmVzdWx0Y3Rlc3RcJSBjZXJ0YWludHlcbiI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnQgIi4uLiBidXQgbWlnaHQgYmUgbHVja3lcbiI7CisgICAgfQorICAgIHJldHVybiAoJ3Rlc3QnID0+ICRyZXN1bHR0ZXN0LCAnY3Jvc3N0ZXN0JyA9PiAkcmVzdWx0Y3Rlc3QpOworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCit9CisKKyMgRnVuY3Rpb24gdGhhdCBnZW5lcmF0ZXMgdGhlIHRlc3QgYmluYXJpZXMgb3V0IG9mIHRoZSBzb3VyY2Vjb2RlCitzdWIgY29tcGlsZV9zcmMKK3sKKyAgICBteSAoJHRlc3RuYW1lLCAkb3JwaGFuKSA9IEBfOworICAgIHByaW50ICJDb21waWxpbmcgc291cmVzIC4uLi4uLi4uLi4uLiI7CisgICAgaWYgKCRvcnBoYW4pIHsKKyMgTWFrZSBvcnBoYW5lZCB0ZXN0cworICAgICAgICAkZXhlY19uYW1lICAgICA9ICJiaW4vJG9wdF9sYW5nL29ycGhfdGVzdF8kdGVzdG5hbWUiOworICAgICAgICAkY3Jvc3NleGVfbmFtZSA9ICJiaW4vJG9wdF9sYW5nL29ycGhfY3Rlc3RfJHRlc3RuYW1lIjsKKyAgICAgICAgJHJlc3VsdHRlc3QgID0gc3lzdGVtICgibWFrZSAkZXhlY19uYW1lID4gJGV4ZWNfbmFtZVxfY29tcGlsZS5sb2ciICk7CisgICAgICAgICRyZXN1bHRjdGVzdCA9IHN5c3RlbSAoIm1ha2UgJGNyb3NzZXhlX25hbWUgPiAkY3Jvc3NleGVfbmFtZVxfY29tcGlsZS5sb2ciICk7CisgICAgfSBlbHNlIHsKKyMgTWFrZSB0ZXN0CisgICAgICAgICRleGVjX25hbWUgICAgID0gImJpbi8kb3B0X2xhbmcvdGVzdF8kdGVzdG5hbWUiOworICAgICAgICAkY3Jvc3NleGVfbmFtZSA9ICJiaW4vJG9wdF9sYW5nL2N0ZXN0XyR0ZXN0bmFtZSI7CisgICAgICAgICRyZXN1bHR0ZXN0ICA9IHN5c3RlbSAoIm1ha2UgJGV4ZWNfbmFtZSA+ICRleGVjX25hbWVcX2NvbXBpbGUubG9nIiApOworICAgICAgICAkcmVzdWx0Y3Rlc3QgPSBzeXN0ZW0gKCJtYWtlICRjcm9zc2V4ZV9uYW1lID4gJGNyb3NzZXhlX25hbWVcX2NvbXBpbGUubG9nIiApOworICAgIH0KKyAgICBpZiAoJHJlc3VsdHRlc3QpIHsgdGVzdF9lcnJvciAoIkNvbXBpbGF0aW9uIG9mIHRoZSB0ZXN0IGZhaWxlZC4iKTsgfQorICAgIGlmICgkcmVzdWx0Y3Rlc3QpeyB0ZXN0X2Vycm9yICgiQ29tcGlsYXRpb24gb2YgdGhlIGNyb3NzdGVzdCBmYWlsZWQuIik7IH0KKworICAgIGlmICgkcmVzdWx0dGVzdCBvciAkcmVzdWx0Y3Rlc3QpIHsKKyAgICAgICAgcHJpbnQgIi4uLi4gZmFpbGVkXG4iOworICAgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludCAiLi4uLiBzdWNjZXNzXG4iOworICAgICAgICByZXR1cm4gMTsKKyAgICB9Cit9CisKKyMgRnVuY3Rpb24gd2hpY2ggcHJlcGFyZSB0aGUgZGlyZWN0b3J5IHN0cnVjdHVyZToKK3N1YiBpbml0X2RpcmVjdG9yeV9zdHJ1Y3R1cmUKK3sKKyAgICBteSAoJGxhbmd1YWdlKSA9IEBfOworICAgIGlmICgtZSAiYmluIiAmJiAtZCAiYmluIikgeyB3YXJuaW5nICgiT2xkIGJpbmFyeSBkaXJlY3RvcnkgZGV0ZWN0ZWQhIik7fQorICAgIGVsc2UgeyBzeXN0ZW0gKCJta2RpciBiaW4iKTsgfQorICAgIGlmICgtZSAiYmluLyRsYW5ndWFnZSIgJiYgLWQgImJpbi8kbGFuZ3VhZ2UiKSB7CisgICAgICAgIHdhcm5pbmcgKCJPbGQgYmluYXJ5IGRpcmVjdG9yeSBmb3IgbGFuZ3VhZ2UgJGxhbmd1YWdlIGZvdW5kLiIpO30KKyAgICBlbHNlIHsgc3lzdGVtICgibWtkaXIgYmluLyRsYW5ndWFnZSIpOyB9Cit9CisKKyMgRnVuY3Rpb24gdGhhdCBnZW5lcmF0ZXMgdGhlIHNvdXJjZWNvZGUgZm9yIHRoZSBnaXZlbiB0ZXN0CitzdWIgbWFrZV9zcmMKK3sKKyAgICBteSAoJHRlc3RuYW1lLCAkb3JwaGFuKSA9IEBfOworICAgIG15ICR0ZW1wbGF0ZV9maWxlOworICAgIG15ICRzcmNfbmFtZTsKKworICAgICR0ZW1wbGF0ZV9maWxlID0gIiRkaXIvJHRlc3RuYW1lLiRleHRlbnNpb24iOworICAgIGlmICghLWUgJHRlbXBsYXRlX2ZpbGUpIHsgdGVzdF9lcnJvciAoIkNvdWxkIG5vdCBmaW5kIHRlbXBsYXRlIGZvciBcIiR0ZXN0bmFtZVwiIik7IH0KKworICAgIHByaW50ICJHZW5lcmF0aW5nIHNvdXJjZXMgLi4uLi4uLi4uLiI7CisgICAgaWYgKCRvcnBoYW4pIHsKKyMgTWFrZSBvcnBoYW5lZCB0ZXN0cworICAgICAgICAkc3JjX25hbWUgPSAiYmluLyRvcHRfbGFuZy9vcnBoX3Rlc3RfJHRlc3RuYW1lLiRleHRlbnNpb24iOworICAgICAgICAkcmVzdWx0dGVzdCA9IHN5c3RlbSAoIi4vJHRlbXBsYXRlcGFyc2VybmFtZSAtLXRlc3QgLS1vcnBoYW4gJHRlbXBsYXRlX2ZpbGUgJHNyY19uYW1lIik7CisgICAgICAgICRzcmNfbmFtZSA9ICJiaW4vJG9wdF9sYW5nL29ycGhfY3Rlc3RfJHRlc3RuYW1lLiRleHRlbnNpb24iOworICAgICAgICAkcmVzdWx0Y3Rlc3QgPSBzeXN0ZW0gKCIuLyR0ZW1wbGF0ZXBhcnNlcm5hbWUgLS1jcm9zc3Rlc3QgLS1vcnBoYW4gJHRlbXBsYXRlX2ZpbGUgJHNyY19uYW1lIik7CisgICAgfSBlbHNlIHsKKyMgTWFrZSB0ZXN0CisgICAgICAgICRzcmNfbmFtZSA9ICJiaW4vJG9wdF9sYW5nL3Rlc3RfJHRlc3RuYW1lLiRleHRlbnNpb24iOworICAgICAgICAkcmVzdWx0dGVzdCA9IHN5c3RlbSAoIi4vJHRlbXBsYXRlcGFyc2VybmFtZSAtLXRlc3QgLS1ub29ycGhhbiAkdGVtcGxhdGVfZmlsZSAkc3JjX25hbWUiKTsKKyAgICAgICAgJHNyY19uYW1lID0gImJpbi8kb3B0X2xhbmcvY3Rlc3RfJHRlc3RuYW1lLiRleHRlbnNpb24iOworICAgICAgICAkcmVzdWx0Y3Rlc3QgPSBzeXN0ZW0gKCIuLyR0ZW1wbGF0ZXBhcnNlcm5hbWUgLS1jcm9zc3Rlc3QgLS1ub29ycGhhbiAkdGVtcGxhdGVfZmlsZSAkc3JjX25hbWUiKTsKKyAgICB9CisgICAgaWYgKCRyZXN1bHR0ZXN0KSB7IHRlc3RfZXJyb3IgKCJHZW5lcmF0aW9uIG9mIHNvdXJjZWNvZGUgZm9yIHRoZSB0ZXN0IGZhaWxlZC4iKTsgfQorICAgIGlmICgkcmVzdWx0Y3Rlc3QpeyB0ZXN0X2Vycm9yICgiR2VuZXJhdGlvbiBvZiBzb3VyY2Vjb2RlIGZvciB0aGUgY3Jvc3N0ZXN0IGZhaWxlZC4iKTsgfQorCisgICAgaWYgKCRyZXN1bHR0ZXN0IG9yICRyZXN1bHRjdGVzdCkgeworICAgICAgICBwcmludCAiLi4uLiBmYWlsZWRcbiI7CisgICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIHsKKyAgICAgICBwcmludCAiLi4uLiBzdWNjZXNzXG4iOworICAgICAgIHJldHVybiAxOworICAgIH0KK30KKworIyBGdW5jdGlvbiB3aGljaCBjaGVja3MgaWYgYSBnaXZlbiB0ZXN0IGlzIG9ycGhhbmFibGUKK3N1YiB0ZXN0X2lzX29ycGhhbmFibGUKK3sKKyAgICBteSAoJHRlc3RuYW1lKSA9IEBfOworICAgIG15ICRzcmM7CisgICAgbXkgJGZpbGUgPSAiJGRpci8kdGVzdG5hbWUuJGV4dGVuc2lvbiI7CisgICAgaWYoISAtZSAkZmlsZSl7IHRlc3RfZXJyb3IgKCJDb3VsZCBub3QgZmluZCB0ZXN0IGZpbGUgJGZpbGVcbiIpO30KKyAgICBvcGVuIChURVNULCAiPCRmaWxlIikgb3IgdGVzdF9lcnJvciAoIkNvdWxkIG5vdCBvcGVuIHRlc3QgZmlsZSAkZmlsZVxuIik7CisgICAgd2hpbGUgKDxURVNUPikgeyAkc3JjIC49ICRfOyB9CisgICAgY2xvc2UgKFRFU1QpOworICAgIHJldHVybiAkc3JjID1+L29tcHRzOm9ycGhhbi87Cit9CisKK3N1YiB3cml0ZV9yZXN1bHRfZmlsZV9oZWFkCit7CisgICAgb3BlbiAoUkVTVUxUUywgIj4kb3B0X3Jlc3VsdHNmaWxlIikgb3IgZXJyb3IgKCJDb3VsZCBub3Qgb3BlbiBmaWxlICckb3B0X3Jlc3VsdHNmaWxlJyB0byB3cml0ZSByZXN1bHRzLiIsIDEpOworICAgICRyZXN1bHRsaW5lID0gc3ByaW50ZiAiJS0yNXMgJS1zXG4iLCAiI1Rlc3RlZCBEaXJlY3RpdmUiLCAiXHR0XHRjdFx0b3RcdG9jdCI7CisgICAgcHJpbnQgUkVTVUxUUyAkcmVzdWx0bGluZTsKK30KKworIyBGdW5jdGlvbiB3aGljaCBhZGRzIGEgcmVzdWx0IHRvIHRoZSBsaXN0IG9mIHJlc3VsdHMKK3N1YiBhZGRfcmVzdWx0Cit7CisgICAgbXkgKCR0ZXN0bmFtZSwgJHJlc3VsdCkgPSBAXzsKKyMJcHJpbnQgRHVtcGVyKEB7JHJlc3VsdH0pOworCisgICAgJG51bV9jb25zdHJ1Y3RzKys7CisKKyAgICBvcGVuIChSRVNVTFRTLCAiPj4kb3B0X3Jlc3VsdHNmaWxlIikgb3IgZXJyb3IgKCJDb3VsZCBub3Qgb3BlbiBmaWxlICckb3B0X3Jlc3VsdHNmaWxlJyB0byB3cml0ZSByZXN1bHRzLiIsIDEpOworCisgICAgaWYgKCR7JHJlc3VsdH1bMF1bMF0pIHsKKwkJJG51bV90ZXN0cyArKzt9CisKKwlpZiAoJG9wdF9jb21waWxlIGFuZCAkeyRyZXN1bHR9WzBdWzFdIGVxIDApIHsKKwkJJHskcmVzdWx0fVswXVsyXXt0ZXN0fSAgICAgID0gJ2NlJzsKKwkJJHskcmVzdWx0fVswXVsyXXtjcm9zc3Rlc3R9ID0gJy0nOworCQkkbnVtX25vcm1hbF90ZXN0c19jb21waWxlX2Vycm9yKys7CisJICAgICRudW1fbm9ybWFsX3Rlc3RzX2ZhaWxlZCsrOworCX0KKworICAgIGlmICgkb3B0X3J1biBhbmQgJHskcmVzdWx0fVswXVsyXSBhbmQgJHskcmVzdWx0fVswXVsyXXt0ZXN0fSBuZSAnY2UnKSB7CisgICAgICAgIGlmICgkeyRyZXN1bHR9WzBdWzJde3Rlc3R9ID09IDEwMCkgeworICAgICAgICAgICAgJG51bV9ub3JtYWxfdGVzdHNfc3VjY2Vzc2Z1bCsrOworICAgICAgICAgICAgaWYgKCR7JHJlc3VsdH1bMF1bMl17Y3Jvc3N0ZXN0fSA9PSAxMDApeworCQkJCSRudW1fbm9ybWFsX3Rlc3RzX3ZlcmlmaWVkKys7fQorCQl9IGVsc2lmICgkeyRyZXN1bHR9WzBdWzJde3Rlc3R9IGVxICdUTycpeworCQkJJG51bV9ub3JtYWxfdGVzdHNfdGltZWRfb3V0Kys7CisJCQkkbnVtX25vcm1hbF90ZXN0c19mYWlsZWQrKzsKKwkJfSBlbHNlIHsKKwkJCSRudW1fbm9ybWFsX3Rlc3RzX2ZhaWxlZCsrOworCQl9CisgICAgfQorICAgICRyZXN1bHRsaW5lID0gIiR7JHJlc3VsdH1bMF1bMl17dGVzdH1cdCR7JHJlc3VsdH1bMF1bMl17Y3Jvc3N0ZXN0fVx0IjsKKworICAgIGlmICgkeyRyZXN1bHR9WzFdWzBdKSB7CisJCSRudW1fdGVzdHMgKys7fQorICAgIGVsc2UgeyAkcmVzdWx0bGluZSAuPSAiLVx0LVxuIjsgfQorCisgICAgaWYgKCRvcHRfY29tcGlsZSBhbmQgJHskcmVzdWx0fVsxXVsxXSBlcSAwKSB7CisJCSR7JHJlc3VsdH1bMV1bMl17dGVzdH0gICAgICA9ICdjZSc7CisJCSR7JHJlc3VsdH1bMV1bMl17Y3Jvc3N0ZXN0fSA9ICctJzsKKwkJJG51bV9vcnBoYW5lZF90ZXN0c19jb21waWxlX2Vycm9yKys7CisJCSRudW1fb3JwaGFuZWRfdGVzdHNfZmFpbGVkKys7CisJfQorCisgICAgaWYgKCRvcHRfcnVuIGFuZCAkeyRyZXN1bHR9WzFdWzJdIGFuZCAkeyRyZXN1bHR9WzFdWzJde3Rlc3R9IG5lICdjZScpIHsKKyAgICAgICAgaWYgKCR7JHJlc3VsdH1bMV1bMl17dGVzdH0gPT0gMTAwKSB7CisgICAgICAgICAgICAkbnVtX29ycGhhbmVkX3Rlc3RzX3N1Y2Nlc3NmdWwrKzsKKyAgICAgICAgICAgIGlmICgkeyRyZXN1bHR9WzFdWzJde2Nyb3NzdGVzdH0gPT0gMTAwKXsKKwkJCQkkbnVtX29ycGhhbmVkX3Rlc3RzX3ZlcmlmaWVkKys7fQorCQl9IGVsc2lmICgkeyRyZXN1bHR9WzFdWzJde3Rlc3R9IGVxICdUTycpeworCQkJJG51bV9vcnBoYW5lZF90ZXN0c190aW1lZF9vdXQrKzsKKwkJCSRudW1fb3JwaGFuZWRfdGVzdHNfZmFpbGVkKys7CisgICAgICAgIH0gZWxzZSB7CisJCQkkbnVtX29ycGhhbmVkX3Rlc3RzX2ZhaWxlZCsrOworCQl9CisgICAgfQorICAgICRyZXN1bHRsaW5lIC49ICIkeyRyZXN1bHR9WzFdWzJde3Rlc3R9XHQkeyRyZXN1bHR9WzFdWzJde2Nyb3NzdGVzdH1cbiI7CisKKyAgICAkbnVtX2ZhaWxlZF90ZXN0cyA9ICRudW1fbm9ybWFsX3Rlc3RzX2ZhaWxlZCArICRudW1fb3JwaGFuZWRfdGVzdHNfZmFpbGVkOworCSRudW1fZmFpbGVkX2NvbXBpbGF0aW9uID0gJG51bV9ub3JtYWxfdGVzdHNfY29tcGlsZV9lcnJvciArICRudW1fb3JwaGFuZWRfdGVzdHNfY29tcGlsZV9lcnJvcjsKKwkkbnVtX3N1Y2Nlc3NmdWxfdGVzdHMgPSAkbnVtX25vcm1hbF90ZXN0c19zdWNjZXNzZnVsICsgJG51bV9vcnBoYW5lZF90ZXN0c19zdWNjZXNzZnVsOworCSRudW1fdmVyaWZpZWRfdGVzdHMgPSAkbnVtX25vcm1hbF90ZXN0c192ZXJpZmllZCArICRudW1fb3JwaGFuZWRfdGVzdHNfdmVyaWZpZWQ7CisKKyAgICAkcmVzdWx0bGluZTIgPSBzcHJpbnRmICIlLTI1cyAlLXMiLCAiJHRlc3RuYW1lIiwgIlx0JHJlc3VsdGxpbmUiOworICAgIHByaW50IFJFU1VMVFMgJHJlc3VsdGxpbmUyOworfQorCisjIEZ1bmN0aW9uIHdoaWNoIGV4ZWN1dGVzIGEgc2luZ2xlIHRlc3QKK3N1YiBleGVjdXRlX3NpbmdsZV90ZXN0Cit7CisgICAgbXkgQHJlc3VsdDsKKyAgICBpbml0X2xhbmd1YWdlX3NldHRpbmdzICgkb3B0X2xhbmcpOworICAgIGluaXRfZGlyZWN0b3J5X3N0cnVjdHVyZSAoJG9wdF9sYW5nKTsKKyAgICBsb2dfbWVzc2FnZV9hZGQgKCJUZXN0aW5nIGZvciBcIiRvcHRfdGVzdFwiOiIpOworICAgIHByaW50ICJUZXN0aW5nIGZvciBcIiRvcHRfdGVzdFwiOlxuIjsKKyMgdGVzdHMgaW4gbm9ybWFsIG1vZGUKKyAgICBpZiAoJG9wdF9jb21waWxlKXsgJHJlc3VsdFswXVswXSA9IG1ha2Vfc3JjICgkb3B0X3Rlc3QsIDApOworICAgICAgICAgICAgICAgICAgICAgICAkcmVzdWx0WzBdWzFdID0gY29tcGlsZV9zcmMgKCRvcHRfdGVzdCwgMCk7fQorICAgIGlmICgkb3B0X3J1biAmJiAkcmVzdWx0WzBdWzFdID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgJHJlc3VsdFswXVsyXSA9IHtydW5fdGVzdCAoJG9wdF90ZXN0LCAwKX07fQorIyB0ZXN0cyBpbiBvcnBoYW5lZCBtb2RlCisgICAgaWYgKCRvcHRfb3JwaGFuICYmIHRlc3RfaXNfb3JwaGFuYWJsZSgkb3B0X3Rlc3QpKXsKKyAgICAgICAgbG9nX21lc3NhZ2VfYWRkICgiVGVzdGluZyBmb3IgXCIkb3B0X3Rlc3RcIiBpbiBvcnBoYW5lZCBtb2RlOiIpOworICAgICAgICBwcmludCAiKyBvcnBoYW5lZCBtb2RlOlxuIjsKKyAgICAgICAgaWYgKCRvcHRfY29tcGlsZSkgeyAkcmVzdWx0WzFdWzBdID0gbWFrZV9zcmMgKCRvcHRfdGVzdCwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3VsdFsxXVsxXSA9IGNvbXBpbGVfc3JjICgkb3B0X3Rlc3QsIDEpO30KKyAgICAgICAgaWYgKCRvcHRfcnVuICYmICRyZXN1bHRbMV1bMV0gPT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyZXN1bHRbMV1bMl0gPSB7cnVuX3Rlc3QgKCRvcHRfdGVzdCwgMSl9O30KKyAgICB9CisgICAgYWRkX3Jlc3VsdCgkb3B0X3Rlc3QsIFxAcmVzdWx0KTsKK30KKworIyBGdW5jdGlvbiB0aGF0IHByaW50cyBpbmZvIGFib3V0IGEgZ2l2ZW4gdGVzdAorc3ViIHByaW50X3Rlc3RpbmZvCit7CisgICAgaW5pdF9sYW5ndWFnZV9zZXR0aW5ncygkb3B0X2xhbmcpOworICAgIG15ICRkb2MgPSAiIjsKKyAgICBteSAkZmlsZSA9ICRkaXIuIi8iLiRvcHRfdGVzdGluZm8uIi4iLiRleHRlbnNpb247CisgICAgaWYgKCEgLWUgJGZpbGUpIHtlcnJvciAoIkNvdWxkIG5vdCBmaW5kIHRlbXBsYXRlIGZvciB0ZXN0ICRvcHRfdGVzdGluZm8iLCA1KTt9CisgICAgb3BlbiAoVEVTVCwiPCRmaWxlIikgb3IgZXJyb3IgKCJDb3VsZCBub3Qgb3BlbiB0ZW1wbGF0ZSBmaWxlIFwiJGZpbGVcIiBmb3IgdGVzdCAkb3B0X3Rlc3RpbmZvIiwgNik7CisgICAgd2hpbGUgKDxURVNUPikgeyRkb2MgLj0gJF87fQorICAgIGNsb3NlIChURVNUKTsKKworICAgIChteSAkb21wX3ZlcnNpb24pID0gZ2V0X3RhZ192YWx1ZXMgKCJvbXB0czpvbXB2ZXJzaW9uIiwgJGRvYyk7CisgICAgKG15ICRkZXBlbmRlbmNlcykgPSBnZXRfdGFnX3ZhbHVlcyAoIm9tcHRzOmRlcGVuZGVuY2VzIiwgJGRvYyk7CisgICAgKG15ICRkZXNjcmlwdGlvbikgPSBnZXRfdGFnX3ZhbHVlcyAoIm9tcHRzOnRlc3RkZXNjcmlwdGlvbiIsICRkb2MpOworICAgIG15ICRvcnBoYW5hYmxlID0gJ25vJzsKKyAgICBpZiAoJGRvYyA9fiAvb21wdHM6b3JwaGFuLykgeyRvcnBoYW5hYmxlID0gJ3llcyc7fQorICAgIHByaW50IDw8RU9GOworSW5mbyBmb3IgdGVzdCAkb3B0X3Rlc3RpbmZvOgorT3BlbiBNUCBzdGFuZGFyZDogJG9tcF92ZXJzaW9uCitPcnBoYW5lZCBtb2RlOiAkb3JwaGFuYWJsZQorRGVwZW5kZW5jaWVzOiAgJGRlcGVuZGVuY2VzCitEZXNjcmlwdGlvbjogICAkZGVzY3JpcHRpb24KK0VPRgorfQorCisjIEZ1bmN0aW9uIHRoYXQgaW5pdGlhbGl6ZXMgdGhlIHNldHRpbmdzIGZvciB0aGUgZ2l2ZW4gbGFuZ3VhZ2UKK3N1YiBpbml0X2xhbmd1YWdlX3NldHRpbmdzCit7CisgICAgbXkgKCRsYW5ndWFnZSkgPSBAXzsKKyAgICBmb3JlYWNoIG15ICRsYW5nIChAbGFuZ3VhZ2VzKSB7CisgICAgICAgIChteSAkbmFtZSkgPSBnZXRfdGFnX3ZhbHVlcyAoImxhbmd1YWdlbmFtZSIsICRsYW5nKTsKKyAgICAgICAgaWYgKCRuYW1lIGVxICRsYW5ndWFnZSkgeworICAgICAgICAgICAgKCRleHRlbnNpb24pID0gZ2V0X3RhZ192YWx1ZXMgKCJmaWxlZXh0ZW5zaW9uIiwgJGxhbmcpOworICAgICAgICAgICAgKCRkaXIpICAgICAgID0gZ2V0X3RhZ192YWx1ZXMgKCJkaXIiLCAkbGFuZyk7CisgICAgICAgICAgICAoJHRlbXBsYXRlcGFyc2VybmFtZSkgPSBnZXRfdGFnX3ZhbHVlcyAoInRlbXBsYXRlcGFyc2VybmFtZSIsICRsYW5nKTsKKyAgICAgICAgICAgIGxhc3Q7CisgICAgICAgIH0KKyAgICB9CisgICAgIyBDaGVjayBpZiB3ZSBmb3VuZCB0aGUgc3BlY2lmaWVkIGxhbmd1YWdlIGluIHRoZSBjb25maWcgZmlsZQorICAgIGlmICghJGV4dGVuc2lvbiBhbmQgISRkaXIpIHsKKyAgICAgIGVycm9yICgiTGFuZ3VhZ2UgJGxhbmd1YWdlIGNvdWxkIG5vdCBiZSBmb3VuZC5cbiIsIDMpOworICAgIH0KK30KKworCisKKyMgRnVuY3Rpb24gdGhhdCBwcmludHMgYWxsIGF2YWlsYWJsZSB0ZXN0cyBmb3IgdGhlIGdpdmVuIGxhbmd1YWdlCitzdWIgcHJpbnRfYXZhaWxfdGVzdHMKK3sKKyAgICBpbml0X2xhbmd1YWdlX3NldHRpbmdzKCRvcHRfbGFuZyk7CisgICAgbXkgQHRlc3RzOworICAgIG9wZW5kaXIoRElSLCIkZGlyIikgb3IgZXJyb3IgKCJDb3VsZCBub3Qgb3BlbiBkaXJlY3RvcnkgJGRpciIsIDQpOworICAgIHdoaWxlKCRfID0gcmVhZGRpcihESVIpKSB7IGlmICgvXC4kZXh0ZW5zaW9uJC8pIHtzL1wuJGV4dGVuc2lvbi8vOyBwdXNoIChAdGVzdHMsICRfKTt9fQorICAgIGNsb3NlZGlyKERJUik7CisgICAgcHJpbnQgIkZvdW5kICIuKEB0ZXN0cykuIiB0ZXN0czpcbiIuICItIiB4IDMwIC4gIlxuIjsKKyAgICBmb3JlYWNoIChAdGVzdHMpIHsgcHJpbnQgJF8uIlxuIjt9Cit9CisKKyMgRnVuY3Rpb24gdGhhdCBwcmludHMgYWxsIGF2YWlsYWJsZSB0ZXN0cyBmb3IgdGhlIGdpdmVuIGxhbmd1YWdlCitzdWIgcHJpbnRfYXZhaWxfbGFuZ3MKK3sKKyAgICBpZiAoQGxhbmd1YWdlcyA+IDApIHsKKyAgICAgICAgcHJpbnQgIkF2YWlsYWJsZSBsYW5ndWFnZXM6XG4iOworICAgICAgICBmb3JlYWNoIChAbGFuZ3VhZ2VzKSB7CisgICAgICAgICAgICAobXkgJG5hbWUpID0gZ2V0X3RhZ192YWx1ZXMgKCJsYW5ndWFnZW5hbWUiLCAkXyk7CisgICAgICAgICAgICBwcmludCAiJG5hbWVcbiI7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBwcmludCAiTm8gbGFuZ3VhZ2VzIGF2YWlsYWJsZVxuIjsKKyAgICB9Cit9CisKKyMgRnVuY3Rpb24gdGhhdCBwcmludHMgdGhlIGVycm9yIG1lc3NhZ2UKK3N1YiBwcmludF9oZWxwX3RleHQKK3sKKyAgICBwcmludCA8PEVPRjsKK3J1bnRlc3QucGwgW29wdGlvbnNdIFtGSUxFXQorCitFeGVjdXRlcyB0aGUgdGVzdHMgbGlzdGVkIGluIEZJTEUuIEZJTEUgaGFzIHRvIGNvbnRhaW4gdGhlIG5hbWVzIG9mIHRoZSB0ZXN0cywKK29uZSB0ZXN0IHBlciBsaW5lLiBMaW5lcyBzdGFydGluZyB3aXRoICcjJyB3aWxsIGJlIGlnbm9yZWQuCitBIGxhbmd1YWdlIGhhcyB0byBiZSBzcGVjaWZpZWQgZm9yIGFsbCBjb21tYW5kcyBleGNlcHQgLS1oZWxwIGFuZCAtLWxpc3RsYW5ndWFnZXMuCisKK09wdGlvbnM6CisgIC0taGVscCAgICAgICAgICAgIGRpc3BsYXlzIHRoaXMgaGVscCBtZXNzYWdlCisgIC0tbGlzdGxhbmd1YWdlcyAgIGxpc3RzIGFsbCBhdmFpbGFibGUgbGFuZ3VhZ2VzCisgIC0tbGFuZz1zICAgICAgICAgIHNlbGVjdCBsYW5ndWFnZQorICAtLWxpc3QgICAgICAgICAgICBsaXN0IGF2YWlsYWJsZSB0ZXN0cyBmb3IgYSBsYW5ndWFnZQorICAtLXRlc3RpbmZvPU5BTUUgICBzaG93IGluZm8gZm9yIHRlc3QgTkFNRQorICAtLW51bXRocmVhZHM9TlVNICBzZXQgbnVtYmVyIG9mIHRocmVhZHMgKG92ZXJ3cml0ZXMgY29uZmlnIGZpbGUgc2V0dGluZ3MpCisgIC0tdGVzdD1OQU1FICAgICAgIGV4ZWN1dGUgc2luZ2xlIHRlc3QgTkFNRQorICAtLW5vY29tcGlsZSAgICAgICBkbyBub3QgY29tcGlsZSB0ZXN0cworICAtLW5vcnVuICAgICAgICAgICBkbyBub3QgcnVuIHRlc3RzCisgIC0tbm9vcnBoYW4gICAgICAgIHN3aXRjaCBvZiBvcnBoYW5lZCB0ZXN0cworICAtLXJlc3VsdGZpbGU9TkFNRSB1c2UgTkFNRSBhcyByZXN1bHRmaWxlIChvdmVyd3JpdGVzIGNvbmZpZyBmaWxlIHNldHRpbmdzKQorRU9GCit9CisKKyMgRnVuY3Rpb24gdGhhdCB3cml0ZXMgYW4gZXJyb3IgbWVzc2FnZSBmb3IgYSBmYWlsZWQgdGVzdCAvIHBhcnQgb2YgYSB0ZXN0CitzdWIgdGVzdF9lcnJvcgoreworICAgbXkgKCRtZXNzYWdlKSA9IEBfOworICAgbG9nX21lc3NhZ2VfYWRkICgiRVJST1I6ICRtZXNzYWdlIik7CisgICBpZiAoJGRpc3BsYXlfZXJyb3JzIGVxIDEpIHsgcHJpbnQgU1RERVJSICJFUlJPUjogJG1lc3NhZ2VcbiI7IH0KK30KKworIyBGdW5jdGlvbiB0aGF0IHJldHVybnMgYW4gd2FybmluZyBtZXNzYWdlCitzdWIgd2FybmluZyB7CisgIG15ICgkbWVzc2FnZSkgPSBAXzsKKyAgaWYgKCRkaXNwbGF5X3dhcm5pbmdzIGVxIDEpIHsgcHJpbnQgIldhcm5pb25nOiAkbWVzc2FnZVxuIjsgfQorICBsb2dfbWVzc2FnZV9hZGQgKCJXYXJuaW5nOiAkbWVzc2FnZSIpOworfQorCisjIEZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhbiBlcnJvciBtZXNzYWdlIGFuZCBleGl0cyB3aXRoIHRoZSBzcGVjaWZpZWQgZXJyb3IgY29kZQorc3ViIGVycm9yIHsKKyAgbXkgKCRtZXNzYWdlLCAkZXJyb3JfY29kZSkgPSBAXzsKKyAgaWYgKCRkaXNwbGF5X2Vycm9ycyBlcSAxKSB7IHByaW50IFNUREVSUiAiRVJST1I6ICRtZXNzYWdlXG4iOyB9CisgIGxvZ19tZXNzYWdlX2FkZCAoIkVSUk9SOiAkbWVzc2FnZSIpOworICBleGl0ICgkZXJyb3JfY29kZSk7Cit9CisKKyMgRnVuY3Rpb24gd2hpY2ggYWRkcyBhbiBuZXcgZW50cnkgaW50byB0aGUgbG9nZmlsZSB0b2dldGhlciB3aXRoIGEgdGltZXN0YW1wCitzdWIgbG9nX21lc3NhZ2VfYWRkCit7CisgICAgKG15ICRtZXNzYWdlKSA9IEBfOworICAgICgkc2VjLCRtaW4sJGhvdXIsJG1kYXksJG1vbiwkeWVhciwkd2RheSwkeWRhdCwkaXNkc3QpID0gbG9jYWx0aW1lKCk7CisgICAgaWYobGVuZ3RoKCRob3VyKSA9PSAxKSB7ICRob3VyPSIwJGhvdXIiOyB9CisgICAgaWYobGVuZ3RoKCRtaW4pID09IDEpICB7ICRtaW49IjAkbWluIjsgICB9CisgICAgaWYobGVuZ3RoKCRzZWMpID09IDEpICB7ICRzZWM9IjAkc2VjIjsgICB9CisgICAgJG1vbj0kbW9uKzE7CisgICAgJHllYXI9JHllYXIrMTkwMDsKKyAgICBvcGVuIChMT0dGSUxFLCI+PiRsb2dmaWxlIikgb3IgZGllICJFUlJPUjogQ291bGQgbm90IGNyZWF0ZSAkbG9nZmlsZVxuIjsKKyAgICBwcmludCBMT0dGSUxFICIkbWRheS8kbW9uLyR5ZWFyICRob3VyLiRtaW4uJHNlYzogJG1lc3NhZ2VcbiI7Cit9CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvdGVtcGxhdGVfcGFyc2VyX2MucGwgYi9maW5hbC90ZXN0c3VpdGUvdGVtcGxhdGVfcGFyc2VyX2MucGwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uM2Q2ZjM0NgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS90ZW1wbGF0ZV9wYXJzZXJfYy5wbApAQCAtMCwwICsxLDExNCBAQAorIyEvdXNyL2Jpbi9lbnYgcGVybAorCisjIG9tcHRzX3BhcnNlciBbb3B0aW9uXSBJTkZJTEUgT1VURklMRQorIyAKKyMgQ3JlYXRzIHRoZSB0ZXN0cyBhbmQgdGhlIGNyb3NzdGVzdHMgZm9yIHRoZSBPcGVuTVAtVGVzdHN1aXRlIG91dCBvZiBhbiB0ZW1wbGF0ZWZpbGVzIHdoaWNoIGFyZSBnaXZlbiB0byB0aGUgcHJvZ3JhbW0uCisjIAorIyBPcHRpb25zOgorIyAtLXRlc3Q6IAltYWtlIHRlc3QKKyMgLS1jcm9zc3Rlc3Q6IAltYWtlIGNyb3NzdGVzdAorIyAtLW9ycGhhbglpZiBwb3NzaWJsZSBnZW5lcmF0ZSB0ZXN0cyB1c2luZyBvcnBoYW4gCisjCisjIFJldHVybjoKKyMgICAgICAgU3VjY2VzOiAgICAgICAgICAgICAgICAgMAorIyAgICAgICBUZW1wbGF0ZSBub3QgZm91bmQgICAgICAtMQorIworCisjIFVzaW5nIEdldG9wdDo6bG9uZyB0byBleHRyYWN0IHRoZSBwcm9ncmFtbSBvcHRpb25zCit1c2UgR2V0b3B0OjpMb25nOworIyBVc2luZyBmdW5jdGlvbnM6IFNldCBvZiBzdWJyb3V0aW5lcyB0byBtb2RpZnkgdGhlIHRlc3Rjb2RlCit1c2Ugb21wdHNfcGFyc2VyRnVuY3Rpb25zOworCisjIEdldHRpbmcgZ2l2ZW4gb3B0aW9ucworR2V0T3B0aW9ucygidGVzdCIgPT4gXCR0ZXN0LCJjcm9zc3Rlc3QiID0+IFwkY3Jvc3N0ZXN0LCAib3JwaGFuISIgPT4gXCRvcnBoYW4pOworCisjIFJlbWFpbmluZyBhcmd1bWVudHMgYXJlIHRoZSB0ZW1wbGF0ZWZpbGVzLiAKKyMgQWRkaW5nIHRoZXNlIHRvIHRoZSBsaXN0IG9mIHRvIGJlIHBhcnNlZCBmaWxlcyBpZiB0aGV5IGV4aXN0LgorCitteSAkdGVtcGxhdGVmaWxlOworbXkgJHNvdXJjZWZpbGU7CitteSAkbWFpbnByb2NzcmMgPSAib21wdHNfc3RhbmRhbG9uZVByb2MuYyI7IAorCiskdGVtcGxhdGVmaWxlID0gJEFSR1ZbMF07Ciskb3V0ZmlsZSA9ICRBUkdWWzFdOworCitpZiAoIS1lICR0ZW1wbGF0ZWZpbGUpIHsKKyAgICBwcmludCAiVGVtYXBsdGUgZmlsZSBub3QgZm91bmQiOworICAgIGV4aXQgLTE7Cit9CisKKwkKKyMgQ2hlY2tpbmcgaWYgb3B0aW9ucyB3ZXJlIHZhbGlkOgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgcHJlcGFyYXRpb25zIGFuZCBjaGVja3MgZm9yIHNvdXJjZWZpbGVzCisKKyMgUmVhZGluZyB0aGUgdGVtcGxhdGUgZm9yIHRoZSB0ZXN0cyAKK29wZW4oVEVTVCwkdGVtcGxhdGVmaWxlKSBvciBkaWUgIkVycm9yOiBDb3VsZCBub3Qgb3BlbiB0ZW1wbGF0ZSAkc3JjZmlsZVxuIjsKK3doaWxlKDxURVNUPil7ICRzcmMgLj0gJF87IH0KK2Nsb3NlKFRFU1QpOworCisjIEV4dHJhY3RpbmcgdGhlIHNvdXJjZSBmb3IgdGhlIG1haW5wcm9ncmFtbSBhbmQgc2F2aW5nIGl0IGluICRtYWlucHJvY3NyYworb3BlbihNQUlOUFJPQywkbWFpbnByb2NzcmMpIG9yIGRpZSAiQ291bGQgbm90IG9wZW4gdGhlIHNvdXJjZWZpbGUgZm9yIHRoZSBtYWluIHByb2dyYW0gJG1haW5wcm9jc3JjIjsKK3doaWxlKDxNQUlOUFJPQz4peyAkbWFpbnByb2MgLj0gJF87IH0KK2Nsb3NlIChNQUlOUFJPQyk7CisKKyMgU29tZSB0ZW1wb3JhcnkgdGVzdGluZm9ybWF0aW9uOgorbXkgKCRkZXNjcmlwdGlvbikgID0gZ2V0X3RhZ192YWx1ZXMgKCdvbXB0czp0ZXN0ZGVzY3JpcHRpb24nLCRzcmMpOworbXkgKCRkaXJlY3RpdmUpICAgID0gZ2V0X3RhZ192YWx1ZXMgKCdvbXB0czpkaXJlY3RpdmUnLCRzcmMpOworbXkgKCRmdW5jdGlvbm5hbWUpID0gZ2V0X3RhZ192YWx1ZXMgKCdvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWUnLCRzcmMpOworCitvcGVuIChPVVRGSUxFLCI+JG91dGZpbGUiKSBvciBkaWUgIkNvdWxkIG5vdCBjcmVhdGUgdGhlIG91dHB1dCBmaWxlIGZvciAkZGlyZWN0aXZlIjsKKworIyBDcmVhdGluZyB0aGUgc291cmNlIGZvciB0aGUgdGVzdDoKK215ICgkY29kZSkgPSBnZXRfdGFnX3ZhbHVlcygnb21wdHM6dGVzdGNvZGUnLCRzcmMpOworIyBQdXR0aW5nIHRvZ2V0aGVyIHRoZSBmdW5jdGlvbnMgYW5kIHRoZSBtYWlucHJvZ3JhbW06CiskY29kZSAuPSAkbWFpbnByb2M7CisKK215ICR0ZXN0cHJlZml4ID0gIiI7CisKKyMgTWFrZSBtb2RpZmljYXRpb25zIGZvciB0aGUgb3JwaGFuZWQgdGVzdHZlcnNpb24gaWYgbmVjZXNzYXJ5OgoraWYgKCRvcnBoYW4pIHsKKyMgR2V0IHRoZSBnbG9iYWwgdmFyaWFibGVzOgorICAgIEBkZWZzID0gZ2V0X3RhZ192YWx1ZXMoIm9tcHRzOm9ycGhhbjp2YXJzIiwkY29kZSk7CisgICAgJG9ycGh2YXJzZGVmID0gIiI7CisgICAgZm9yZWFjaCAoQGRlZnMpIHsKKyAgICAgICAgJG9ycGh2YXJzZGVmID0gam9pbigiXG4iLCRvcnBodmFyc2RlZiwkXyk7IAorICAgIH0KKyMgR2VuZXJhdGUgcHJlZGVjbGFyYXRpb25zIGZvciBvcnBhaG4gZnVuY3Rpb25zOgorICAgICRvcnBoZnVuY3NkZWZzID0gb3JwaF9mdW5jdGlvbnNfZGVjbGFyYXRpb25zKCRjb2RlKTsKKyMgR2VuZXJhdGUgdGhlIG9ycGhhbiBmdW5jdGlvbnM6CisgICAgJG9ycGhmdW5jcyA9IGNyZWF0ZV9vcnBoX2NmdW5jdGlvbnMoJGNvZGUpOworIyBSZXBsYTplIG9ycGhhbiByZWdpb25zIGJ5IGZ1bmN0aW9uY2FsbHM6CisgICAgJGNvZGUgPSBvcnBoYW5fcmVnaW9uczJjZnVuY3Rpb25zKCRjb2RlKTsKKyMgRGVsZXRpbmcgdGhlIGZvcm1lciBkZWNsYXJhdGlvbnMgb2YgdGhlIHZhcmlhYmxlcyBpbiB0aGUgb3JwaGFuIHJlZ2lvbnM6CisgICAgKCRjb2RlKSA9IGRlbGV0ZV90YWdzKCdvbXB0czpvcnBoYW46dmFycycsKCRjb2RlKSk7CisjIFB1dCBhbGwgdG9nZXRoZXI6CisgICAgJGNvZGUgPSAiI2luY2x1ZGUgXCJvbXBfdGVzdHN1aXRlLmhcIlxuIiAuICRvcnBodmFyc2RlZiAuICRvcnBoZnVuY3NkZWZzIC4gJGNvZGUgLiAkb3JwaGZ1bmNzOworICAgICR0ZXN0cHJlZml4IC49ICJvcnBoXyI7Cit9CisKKyMgUmVtb3ZlIHJlbWFpbmluZyBtYXJrcyBmb3IgdGhlIG9ycGFobiByZWdpb25zIGFuZCBpdHMgdmFyaWFibGVzOgorKCRjb2RlKSA9IGVubGFyZ2VfdGFncygnb21wdHM6b3JwaGFuJywnJywnJywoJGNvZGUpKTsKKygkY29kZSkgPSBlbmxhcmdlX3RhZ3MoJ29tcHRzOm9ycGhhbjp2YXJzJywnJywnJywoJGNvZGUpKTsKKworaWYoJHRlc3QpIHsKKyMgUmVtb3ZlIHRoZSBtYXJrcyBmb3IgdGhlIHRlc3Rjb2RlIGFuZCByZW1vdmUgdGhlIGNvZGUgZm9yIHRoZSBjcm9zc3Rlc3RzOiAKKyAgICAoJGNvZGUpID0gZW5sYXJnZV90YWdzKCdvbXB0czpjaGVjaycsJycsJycsKCRjb2RlKSk7CisgICAgKCRjb2RlKSA9IGRlbGV0ZV90YWdzKCdvbXB0czpjcm9zc2NoZWNrJywoJGNvZGUpKTsJCQorICAgICR0ZXN0cHJlZml4IC49ICJ0ZXN0XyI7Cit9CitlbHNpZigkY3Jvc3N0ZXN0KSB7CisjIFJlbW92ZSB0aGUgbWFya3MgZm9yIHRoZSBjcm9zc3Rlc3Rjb2RlIGFuZCByZW1vdmUgdGhlIGNvZGUgZm9yIHRoZSB0ZXN0czogCisgICAgKCRjb2RlKSA9IGVubGFyZ2VfdGFncygnb21wdHM6Y3Jvc3NjaGVjaycsJycsJycsKCRjb2RlKSk7CisgICAgKCRjb2RlKSA9IGRlbGV0ZV90YWdzKCdvbXB0czpjaGVjaycsKCRjb2RlKSk7CQkKKyAgICAkdGVzdHByZWZpeCAuPSAiY3Rlc3RfIjsKK30KKyMgTWFraW5nIHNvbWUgZmluYWwgbW9kaWZpY2F0aW9uczoKKygkY29kZSkgPSByZXBsYWNlX3RhZ3MoJ3Rlc3RmdW5jdGlvbm5hbWUnLCR0ZXN0cHJlZml4LiRmdW5jdGlvbm5hbWUsKCRjb2RlKSk7CisoJGNvZGUpID0gcmVwbGFjZV90YWdzKCdkaXJlY3RpdmUnLCRkaXJlY3RpdmUsKCRjb2RlKSk7CisoJGNvZGUpID0gcmVwbGFjZV90YWdzKCdkZXNjcmlwdGlvbicsJGRlc2NyaXB0aW9uLCgkY29kZSkpOworKCRjb2RlKSA9IGVubGFyZ2VfdGFncygnb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lJywkdGVzdHByZWZpeCwnJywoJGNvZGUpICk7CisjCSRjb2RlID0gICJcI2luY2x1ZGUgXCJvbXBfdGVzdHN1aXRlLmhcIlxuIi4kY29kZTsKKyMgV3JpdGUgdGhlIHJlc3VsdCBpbnRvIHRoZSBmaWxlIGFuZCBjbG9zZSBpdDoKK3ByaW50IE9VVEZJTEUgJGNvZGU7CitjbG9zZShPVVRGSUxFKTsKZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS90ZW1wbGF0ZV9wYXJzZXJfZm9ydHJhbi5wbCBiL2ZpbmFsL3Rlc3RzdWl0ZS90ZW1wbGF0ZV9wYXJzZXJfZm9ydHJhbi5wbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41NzBhNGUwCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL3RlbXBsYXRlX3BhcnNlcl9mb3J0cmFuLnBsCkBAIC0wLDAgKzEsMTE1IEBACisjIS91c3IvYmluL2VudiBwZXJsCisKKyMgb21wdHNfcGFyc2VyIFtvcHRpb25dIElORklMRSBPVVRGSUxFCisjIAorIyBDcmVhdHMgdGhlIHRlc3RzIGFuZCB0aGUgY3Jvc3N0ZXN0cyBmb3IgdGhlIE9wZW5NUC1UZXN0c3VpdGUgb3V0IG9mIGFuIHRlbXBsYXRlZmlsZXMgd2hpY2ggYXJlIGdpdmVuIHRvIHRoZSBwcm9ncmFtbS4KKyMgCisjIE9wdGlvbnM6CisjIC0tdGVzdDogCW1ha2UgdGVzdAorIyAtLWNyb3NzdGVzdDogCW1ha2UgY3Jvc3N0ZXN0CisjIC0tb3JwaGFuCWlmIHBvc3NpYmxlIGdlbmVyYXRlIHRlc3RzIHVzaW5nIG9ycGhhbiAKKyMKKyMgUmV0dXJuOgorIyAgICAgICBTdWNjZXM6ICAgICAgICAgICAgICAgICAwCisjICAgICAgIFRlbXBsYXRlIG5vdCBmb3VuZCAgICAgIC0xCisjCisKKyMgVXNpbmcgR2V0b3B0Ojpsb25nIHRvIGV4dHJhY3QgdGhlIHByb2dyYW1tIG9wdGlvbnMKK3VzZSBHZXRvcHQ6Okxvbmc7CisjIFVzaW5nIGZ1bmN0aW9uczogU2V0IG9mIHN1YnJvdXRpbmVzIHRvIG1vZGlmeSB0aGUgdGVzdGNvZGUKK3VzZSBvbXB0c19wYXJzZXJGdW5jdGlvbnM7CisKKyMgR2V0dGluZyBnaXZlbiBvcHRpb25zCitHZXRPcHRpb25zKCJ0ZXN0IiA9PiBcJHRlc3QsImNyb3NzdGVzdCIgPT4gXCRjcm9zc3Rlc3QsICJvcnBoYW4hIiA9PiBcJG9ycGhhbik7CisKKyMgUmVtYWluaW5nIGFyZ3VtZW50cyBhcmUgdGhlIHRlbXBsYXRlZmlsZXMuIAorIyBBZGRpbmcgdGhlc2UgdG8gdGhlIGxpc3Qgb2YgdG8gYmUgcGFyc2VkIGZpbGVzIGlmIHRoZXkgZXhpc3QuCisKK215ICR0ZW1wbGF0ZWZpbGU7CitteSAkc291cmNlZmlsZTsKK215ICRtYWlucHJvY3NyYyA9ICJvbXB0c19zdGFuZGFsb25lUHJvYy5mIjsgCisKKyR0ZW1wbGF0ZWZpbGUgPSAkQVJHVlswXTsKKyRvdXRmaWxlID0gJEFSR1ZbMV07CisKK2lmICghLWUgJHRlbXBsYXRlZmlsZSkgeworICAgIHByaW50ICJUZW1hcGx0ZSBmaWxlIG5vdCBmb3VuZCI7CisgICAgZXhpdCAtMTsKK30KKworCQorIyBDaGVja2luZyBpZiBvcHRpb25zIHdlcmUgdmFsaWQ6CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBwcmVwYXJhdGlvbnMgYW5kIGNoZWNrcyBmb3Igc291cmNlZmlsZXMKKworIyBSZWFkaW5nIHRoZSB0ZW1wbGF0ZSBmb3IgdGhlIHRlc3RzIAorb3BlbihURVNULCR0ZW1wbGF0ZWZpbGUpIG9yIGRpZSAiRXJyb3I6IENvdWxkIG5vdCBvcGVuIHRlbXBsYXRlICRzcmNmaWxlXG4iOword2hpbGUoPFRFU1Q+KXsgJHNyYyAuPSAkXzsgfQorY2xvc2UoVEVTVCk7CisKKyMgRXh0cmFjdGluZyB0aGUgc291cmNlIGZvciB0aGUgbWFpbnByb2dyYW1tIGFuZCBzYXZpbmcgaXQgaW4gJG1haW5wcm9jc3JjCitvcGVuKE1BSU5QUk9DLCRtYWlucHJvY3NyYykgb3IgZGllICJDb3VsZCBub3Qgb3BlbiB0aGUgc291cmNlZmlsZSBmb3IgdGhlIG1haW4gcHJvZ3JhbSAkbWFpbnByb2NzcmMiOword2hpbGUoPE1BSU5QUk9DPil7ICRtYWlucHJvYyAuPSAkXzsgfQorY2xvc2UgKE1BSU5QUk9DKTsKKworIyBTb21lIHRlbXBvcmFyeSB0ZXN0aW5mb3JtYXRpb246CisoJGRlc2NyaXB0aW9uKSAgPSBnZXRfdGFnX3ZhbHVlcyAoJ29tcHRzOnRlc3RkZXNjcmlwdGlvbicsJHNyYyk7CisoJGRpcmVjdGl2ZSkgICAgPSBnZXRfdGFnX3ZhbHVlcyAoJ29tcHRzOmRpcmVjdGl2ZScsJHNyYyk7CisoJGZ1bmN0aW9ubmFtZSkgPSBnZXRfdGFnX3ZhbHVlcyAoJ29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZScsJHNyYyk7CisKK29wZW4gKE9VVEZJTEUsIj4kb3V0ZmlsZSIpIG9yIGRpZSAiQ291bGQgbm90IGNyZWF0ZSB0aGUgb3V0cHV0IGZpbGUgZm9yICRkaXJlY3RpdmUiOworCisjIENyZWF0aW5nIHRoZSBzb3VyY2UgZm9yIHRoZSB0ZXN0OgorKCRjb2RlKSA9IGdldF90YWdfdmFsdWVzKCdvbXB0czp0ZXN0Y29kZScsJHNyYyk7CisjIFB1dHRpbmcgdG9nZXRoZXIgdGhlIGZ1bmN0aW9ucyBhbmQgdGhlIG1haW5wcm9ncmFtbToKKyRjb2RlIC49ICRtYWlucHJvYzsKKworI3RoYW5rcyB0byBEci4gWWluIE1hIGluIEFic29mdCwgZ2V0IHRoZSBwYXJhbWV0ZXJzIDxvbXB0czpvcnBoYW46cGFyYW1zPiBieSBqb29uCisgKCRwYXJtcykgPSBnZXRfdGFnX3ZhbHVlcygnb21wdHM6b3JwaGFuOnBhcm1zJywoJGNvZGUpKTsKKyAoJHBhcm1zKSA9IGxlYXZlX3NpbmdsZV9zcGFjZSgkcGFybXMpOworICgkY29kZSkgPSByZXBsYWNlX3RhZ3MoJ29tcHRzOm9ycGhhbjpwYXJtcycsJycsJGNvZGUpOworCisjIE1ha2UgbW9kaWZpY2F0aW9ucyBmb3IgdGhlIG9ycGhhbmVkIHRlc3R2ZXJzaW9uIGlmIG5lY2Vzc2FyeToKK2lmICgkb3JwaGFuKSB7CisjIEdldCB0aGUgZ2xvYmFsIHZhcmlhYmxlczoKKyAgICBAZGVmcyA9IGdldF90YWdfdmFsdWVzKCJvbXB0czpvcnBoYW46dmFycyIsJGNvZGUpOworICAgICRvcnBodmFyc2RlZiA9ICIiOworICAgIGZvcmVhY2ggKEBkZWZzKSB7CisgICAgICAgIGlmIChub3QgL15bIF0qJC9ncykgeyAkb3JwaHZhcnNkZWYgPSBqb2luKCJcbiIsJG9ycGh2YXJzZGVmLCRfKTsgfSAKKyAgICB9CisjIEdlbmVyYXRlIHRoZSBvcnBoYW4gc3Vicm91dGluZXM6CisgICAgICAgICRvcnBoZnVuY3MgPSBjcmVhdGVfb3JwaF9mb3J0cmFuZnVuY3Rpb25zICgiIiwgKCRjb2RlKSwoJHBhcm1zKSk7CisjIFJlcGxhY2Ugb3JwaGFuIHJlZ2lvbnMgYnkgZnVuY3Rpb25jYWxsczoKKyAgICAgICAgKCRjb2RlKSA9IG9ycGhhbl9yZWdpb25zMmZvcnRyYW5mdW5jdGlvbnMgKCIiLCAoJGNvZGUpLCgkcGFybXMpKTsKKyAgICAgICAgKCRjb2RlKSA9IGVubGFyZ2VfdGFncyAoJ29tcHRzOm9ycGhhbjp2YXJzJywnJywnJywoJGNvZGUpKTsKKyMgdG8gZmluZCBvcnBoYW4gY2FsbCBzdGF0ZW1lbnQgYW5kIGFkZCBwYXJhbWV0ZXJzLCBieSBqb29uCisgICAgICAgICgkY29kZSkgPSBlbmxhcmdlX3RhZ3MoJ29tcHRzOm9ycGhhbjpwYXJtcycsJycsJycsKCRjb2RlKSk7CisjIFB1dCBhbGwgdG9nZXRoZXI6CisgICAgICAgICRjb2RlID0gJGNvZGUgLiAkb3JwaGZ1bmNzOworfQorCisjIFJlbW92ZSByZW1haW5pbmcgbWFya3MgZm9yIHRoZSBvcnBhaG4gcmVnaW9ucyBhbmQgaXRzIHZhcmlhYmxlczoKKygkY29kZSkgPSBlbmxhcmdlX3RhZ3MoJ29tcHRzOm9ycGhhbicsJycsJycsKCRjb2RlKSk7CisoJGNvZGUpID0gZW5sYXJnZV90YWdzKCdvbXB0czpvcnBoYW46dmFycycsJycsJycsKCRjb2RlKSk7CisjIHJlbW92ZSBwYXJhbWV0ZXJzIGJldHdlZW4gZm9yIG9ycGhhbmVkIGRpcmVjdGl2ZSBwYXJhbWV0ZXMsIGFkZGVkIGJ5am9vbgorKCRjb2RlKSA9IGVubGFyZ2VfdGFncygnb21wdHM6b3JwaGFuOnBhcm1zJywnJywnJywoJGNvZGUpKTsKKworaWYoJHRlc3QpIHsKKyMgUmVtb3ZlIHRoZSBtYXJrcyBmb3IgdGhlIHRlc3Rjb2RlIGFuZCByZW1vdmUgdGhlIGNvZGUgZm9yIHRoZSBjcm9zc3Rlc3RzOiAKKyAgICAoJGNvZGUpID0gZW5sYXJnZV90YWdzKCdvbXB0czpjaGVjaycsJycsJycsKCRjb2RlKSk7CisgICAgKCRjb2RlKSA9IGRlbGV0ZV90YWdzKCdvbXB0czpjcm9zc2NoZWNrJywoJGNvZGUpKTsJCQorfQorZWxzaWYoJGNyb3NzdGVzdCkgeworIyBSZW1vdmUgdGhlIG1hcmtzIGZvciB0aGUgY3Jvc3N0ZXN0Y29kZSBhbmQgcmVtb3ZlIHRoZSBjb2RlIGZvciB0aGUgdGVzdHM6IAorICAgICgkY29kZSkgPSBlbmxhcmdlX3RhZ3MoJ29tcHRzOmNyb3NzY2hlY2snLCcnLCcnLCgkY29kZSkpOworICAgICgkY29kZSkgPSBkZWxldGVfdGFncygnb21wdHM6Y2hlY2snLCgkY29kZSkpOwkJCit9CisjIE1ha2luZyBzb21lIGZpbmFsIG1vZGlmaWNhdGlvbnM6CisoJGNvZGUpID0gcmVwbGFjZV90YWdzKCd0ZXN0ZnVuY3Rpb25uYW1lJywidGVzdF8iLiRmdW5jdGlvbm5hbWUsKCRjb2RlKSk7CisoJGNvZGUpID0gcmVwbGFjZV90YWdzKCdkaXJlY3RpdmUnLCRkaXJlY3RpdmUsKCRjb2RlKSk7CisoJGNvZGUpID0gcmVwbGFjZV90YWdzKCdkZXNjcmlwdGlvbicsJGRlc2NyaXB0aW9uLCgkY29kZSkpOworKCRjb2RlKSA9IGVubGFyZ2VfdGFncygnb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lJywidGVzdF8iLCcnLCgkY29kZSkgKTsKKyMJJGNvZGUgPSAgIlwjaW5jbHVkZSBcIm9tcF90ZXN0c3VpdGUuaFwiXG4iLiRjb2RlOworIyBXcml0ZSB0aGUgcmVzdWx0IGludG8gdGhlIGZpbGUgYW5kIGNsb3NlIGl0OgorcHJpbnQgT1VURklMRSAkY29kZTsKK2Nsb3NlKE9VVEZJTEUpOwpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL3Rlc3RsaXN0LWMudHh0IGIvZmluYWwvdGVzdHN1aXRlL3Rlc3RsaXN0LWMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxM2EyMTgKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvdGVzdGxpc3QtYy50eHQKQEAgLTAsMCArMSw2OCBAQAorIyBMaXN0IGNvbnRhaW5pbmcgdGhlIHRlc3RzIG9mIHRoZSBPcGVuTVBWYWxpZGFpb24gU3VpdGUgYXZhaWxhYmxlIHRvIGNoZWNrCisjIHRoZSBjIGltcGxlbWVudGF0aW9uLgoraGFzX29wZW5tcAorb21wX2F0b21pYworb21wX2JhcnJpZXIKK29tcF9jcml0aWNhbAorb21wX2ZsdXNoCitvbXBfZm9yX2ZpcnN0cHJpdmF0ZQorb21wX2Zvcl9sYXN0cHJpdmF0ZQorb21wX2Zvcl9vcmRlcmVkCitvbXBfZm9yX3ByaXZhdGUKK29tcF9mb3JfcmVkdWN0aW9uCitvbXBfZm9yX3NjaGVkdWxlX2R5bmFtaWMKK29tcF9mb3Jfc2NoZWR1bGVfZ3VpZGVkCitvbXBfZm9yX3NjaGVkdWxlX3N0YXRpYworb21wX2Zvcl9ub3dhaXQKK29tcF9nZXRfbnVtX3RocmVhZHMKK29tcF9nZXRfd3RpY2sKK29tcF9nZXRfd3RpbWUKK29tcF9pbl9wYXJhbGxlbAorb21wX2xvY2sKK29tcF9tYXN0ZXIKK29tcF9uZXN0X2xvY2sKK29tcF9wYXJhbGxlbF9jb3B5aW4KK29tcF9wYXJhbGxlbF9mb3JfZmlyc3Rwcml2YXRlCitvbXBfcGFyYWxsZWxfZm9yX2xhc3Rwcml2YXRlCitvbXBfcGFyYWxsZWxfZm9yX29yZGVyZWQKK29tcF9wYXJhbGxlbF9mb3JfcHJpdmF0ZQorb21wX3BhcmFsbGVsX2Zvcl9yZWR1Y3Rpb24KK29tcF9wYXJhbGxlbF9udW1fdGhyZWFkcworb21wX3BhcmFsbGVsX3NlY3Rpb25zX2ZpcnN0cHJpdmF0ZQorb21wX3BhcmFsbGVsX3NlY3Rpb25zX2xhc3Rwcml2YXRlCitvbXBfcGFyYWxsZWxfc2VjdGlvbnNfcHJpdmF0ZQorb21wX3BhcmFsbGVsX3NlY3Rpb25zX3JlZHVjdGlvbgorb21wX3NlY3Rpb25fZmlyc3Rwcml2YXRlCitvbXBfc2VjdGlvbl9sYXN0cHJpdmF0ZQorb21wX3NlY3Rpb25fcHJpdmF0ZQorb21wX3NlY3Rpb25zX3JlZHVjdGlvbgorb21wX3NlY3Rpb25zX25vd2FpdAorb21wX3BhcmFsbGVsX2Zvcl9pZgorb21wX3NpbmdsZV9jb3B5cHJpdmF0ZQorb21wX3NpbmdsZV9ub3dhaXQKK29tcF9zaW5nbGVfcHJpdmF0ZQorb21wX3NpbmdsZQorb21wX3Rlc3RfbG9jaworb21wX3Rlc3RfbmVzdF9sb2NrCitvbXBfdGhyZWFkcHJpdmF0ZQorb21wX3BhcmFsbGVsX2RlZmF1bHQKK29tcF9wYXJhbGxlbF9zaGFyZWQKK29tcF9wYXJhbGxlbF9wcml2YXRlCitvbXBfcGFyYWxsZWxfZmlyc3Rwcml2YXRlCitvbXBfcGFyYWxsZWxfaWYKK29tcF9wYXJhbGxlbF9yZWR1Y3Rpb24KKworIyBOZXcgdGVzdHMgZm9yIE9wZW5NUCAzLjAKK29tcF9mb3JfY29sbGFwc2UKK29tcF9tYXN0ZXJfMworb21wX3Rhc2sKK29tcF90YXNrX2lmCitvbXBfdGFza191bnRpZWQKK29tcF90YXNrX3NoYXJlZAorb21wX3Rhc2tfcHJpdmF0ZQorb21wX3Rhc2tfZmlyc3Rwcml2YXRlCitvbXBfdGFza3dhaXQKKworIyBOZXcgdGVzdHMgZm9yIE9wZW5NUCAzLjEKK29tcF90YXNreWllbGQKK29tcF90YXNrX2ZpbmFsCmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvdGVzdGxpc3QtZi50eHQgYi9maW5hbC90ZXN0c3VpdGUvdGVzdGxpc3QtZi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUzODlhNQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS90ZXN0bGlzdC1mLnR4dApAQCAtMCwwICsxLDYzIEBACisjIExpc3QgY29udGFpbmluZyB0aGUgdGVzdHMgb2YgdGhlIE9wZW5NUFZhbGlkYWlvbiBTdWl0ZSBhdmFpbGFibGUgdG8gY2hlY2sKKyMgdGhlIGZvcnRhbiBpbXBsZW1lbnRhdGlvbi4KK2RvX2ZpcnN0cHJpdmF0ZQorZG9fbGFzdHByaXZhdGUKK2RvX29yZGVyZWQKK2RvX3ByaXZhdGUKK2RvX3JlZHVjdGlvbgorZG9fc2NoZWR1bGVfZHluYW1pYworZG9fc2NoZWR1bGVfZ3VpZGVkCitkb19zY2hlZHVsZV9zdGF0aWMKK2hhc19vcGVubXAKK29tcF9hdG9taWMKK29tcF9iYXJyaWVyCitvbXBfY29weWluCitvbXBfY3JpdGljYWwKK29tcF9mbHVzaAorb21wX2dldF9udW1fdGhyZWFkcworb21wX2luX3BhcmFsbGVsCitvbXBfbG9jaworb21wX21hc3Rlcgorb21wX25lc3RfbG9jaworb21wX3Rlc3RfbmVzdF9sb2NrCitvbXBfbmVzdGVkCitvbXBfbnVtX3RocmVhZHMKK29tcF90ZXN0bG9jaworb21wX3RocmVhZHByaXZhdGUKK29tcF9nZXRfd3RpY2tzCisjIyNvbXBfd29ya3NoYXJlX2RlZmF1bHQKK29tcF93b3Jrc2hhcmUKKyMjIyBCcmF1Y2h0IG1hbiBkZW4gb2RlciBvYmlnZW4gZXJ3ZWl0ZXJuPworb21wX3d0aW1lCitwYXJfZG9fZmlyc3Rwcml2YXRlCitwYXJfZG9fbGFzdHByaXZhdGUKK3Bhcl9kb19vcmRlcmVkCitwYXJfZG9fcHJpdmF0ZQorcGFyX2RvX3JlZHVjdGlvbgorcGFyX3NlY3Rpb25fZmlyc3Rwcml2YXRlCitwYXJfc2VjdGlvbl9sYXN0cHJpdmF0ZQorcGFyX3NlY3Rpb25fcHJpdmF0ZQorcGFyX3NlY3Rpb25fcmVkdWN0CitzZWN0aW9uX2ZpcnN0cHJpdmF0ZQorc2VjdGlvbl9sYXN0cHJpdmF0ZQorc2VjdGlvbl9wcml2YXRlCitzZWN0aW9uX3JlZHVjdGlvbgorb21wX3NpbmdsZQorc2luZ2xlX2NvcHlwcml2YXRlCitzaW5nbGVfbm93YWl0CitzaW5nbGVfcHJpdmF0ZQorCisjIE5ldyB0ZXN0cyBmb3IgT3Blbk1QIDMuMAorZG9fY29sbGFwc2UKK29tcF9tYXN0ZXJfMworb21wX3Rhc2sKK29tcF90YXNrX2lmCitvbXBfdGFza191bnRpZWQKK29tcF90YXNrX3NoYXJlZAorb21wX3Rhc2tfcHJpdmF0ZQorb21wX3Rhc2tfZmlyc3Rwcml2YXRlCitvbXBfdGFza3dhaXQKKworIyBOZXcgdGVzdHMgZm9yIE9wZW5NUCAzLjEKKyNvbXBfdGFza3lpZWxkCisjb21wX3Rhc2tfZmluYWwKZGlmZiAtLWdpdCBhL2ZpbmFsL3d3dy9SRUFETUUudHh0IGIvZmluYWwvd3d3L1JFQURNRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTEyYzQyMwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3d3dy9SRUFETUUudHh0CkBAIC0wLDAgKzEsMTM1IEBACisKKyAgICAgICAgICAgICAgIFJFQURNRSBmb3IgdGhlIExMVk0qIE9wZW5NUCogUnVudGltZSBMaWJyYXJ5CisgICAgICAgICAgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitIb3cgdG8gQnVpbGQgRG9jdW1lbnRhdGlvbgorPT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhlIG1haW4gZG9jdW1lbnRhdGlvbiBpcyBpbiBEb3h5Z2VuKiBmb3JtYXQsIGFuZCB0aGlzIGRpc3RyaWJ1dGlvbgorc2hvdWxkIGNvbWUgd2l0aCBwcmUtYnVpbHQgUERGIGRvY3VtZW50YXRpb24gaW4gZG9jL1JlZmVyZW5jZS5wZGYuICAKK0hvd2V2ZXIsIGFuIEhUTUwgdmVyc2lvbiBjYW4gYmUgYnVpbHQgYnkgZXhlY3V0aW5nOgorCislIGRveHlnZW4gZG9jL2RveHlnZW4vY29uZmlnIAorCitpbiB0aGUgcnVudGltZSBkaXJlY3RvcnkuCisKK1RoYXQgd2lsbCBwcm9kdWNlIEhUTUwgZG9jdW1lbnRhdGlvbiBpbiB0aGUgZG9jL2RveHlnZW4vZ2VuZXJhdGVkCitkaXJlY3RvcnksIHdoaWNoIGNhbiBiZSBhY2Nlc3NlZCBieSBwb2ludGluZyBhIHdlYiBicm93c2VyIGF0IHRoZQoraW5kZXguaHRtbCBmaWxlIHRoZXJlLgorCitJZiB5b3UgZG9uJ3QgaGF2ZSBEb3h5Z2VuIGluc3RhbGxlZCwgeW91IGNhbiBkb3dubG9hZCBpdCBmcm9tCit3d3cuZG94eWdlbi5vcmcuCisKKworSG93IHRvIEJ1aWxkIHRoZSBMTFZNKiBPcGVuTVAqIFJ1bnRpbWUgTGlicmFyeQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGUgbGlicmFyeSBjYW4gYmUgYnVpbHQgZWl0aGVyIHVzaW5nIENtYWtlLCBvciB1c2luZyBhIG1ha2VmaWxlIHRoYXQKK2luIHR1cm4gaW52b2tlcyB2YXJpb3VzIFBlcmwgc2NyaXB0cy4gRm9yIHBvcnRpbmcsIG5vbiBYODYKK2FyY2hpdGVjdHVyZXMsIGFuZCBmb3IgdGhvc2UgYWxyZWFkeSBmYW1pbGlhciB3aXRoIENtYWtlIHRoYXQgbWF5IGJlCithbiBlYXNpZXIgcm91dGUgdG8gdGFrZSB0aGFuIHRoZSBvbmUgZGVzY3JpYmVkIGhlcmUuCisKK0J1aWxkaW5nIHdpdGggQ01ha2UKKz09PT09PT09PT09PT09PT09PT0KK1RoZSBydW50aW1lL0J1aWxkX1dpdGhfQ01ha2UudHh0IGZpbGUgaGFzIGEgZGVzY3JpcHRpb24gb2YgaG93IHRvCitidWlsZCB3aXRoIENtYWtlLgorCitCdWlsZGluZyB3aXRoIHRoZSBNYWtlZmlsZQorPT09PT09PT09PT09PT09PT09PT09PT09PT0KK1RoZSBNYWtlZmlsZSBhdCB0aGUgdG9wLWxldmVsIHdpbGwgYXR0ZW1wdCB0byBkZXRlY3Qgd2hhdCBpdCBuZWVkcyB0bworYnVpbGQgdGhlIExMVk0qIE9wZW5NUCogUnVudGltZSBMaWJyYXJ5LiAgVG8gc2VlIHRoZSBkZWZhdWx0IHNldHRpbmdzLCAKK3R5cGU6CisKK21ha2UgaW5mbworCitZb3UgY2FuIGNoYW5nZSB0aGUgTWFrZWZpbGUncyBiZWhhdmlvciB3aXRoIHRoZSBmb2xsb3dpbmcgb3B0aW9uczoKKworb21wX3Jvb3Q6ICAgIFRoZSBwYXRoIHRvIHRoZSB0b3AtbGV2ZWwgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIHRvcC1sZXZlbAorCSAgICAgTWFrZWZpbGUuICBCeSBkZWZhdWx0LCB0aGlzIHdpbGwgdGFrZSBvbiB0aGUgdmFsdWUgb2YgdGhlIAorCSAgICAgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4KKworb21wX29zOiAgICAgIE9wZXJhdGluZyBzeXN0ZW0uICBCeSBkZWZhdWx0LCB0aGUgYnVpbGQgd2lsbCBhdHRlbXB0IHRvIAorCSAgICAgZGV0ZWN0IHRoaXMuIEN1cnJlbnRseSBzdXBwb3J0cyAibGludXgiLCAiZnJlZWJzZCIsICJtYWNvcyIsIGFuZAorCSAgICAgIndpbmRvd3MiLgorCithcmNoOiAgICAgICAgQXJjaGl0ZWN0dXJlLiBCeSBkZWZhdWx0LCB0aGUgYnVpbGQgd2lsbCBhdHRlbXB0IHRvIAorCSAgICAgZGV0ZWN0IHRoaXMgaWYgbm90IHNwZWNpZmllZCBieSB0aGUgdXNlci4gQ3VycmVudGx5IAorCSAgICAgc3VwcG9ydGVkIHZhbHVlcyBhcmUKKyAgICAgICAgICAgICAgICAgIjMyIiBmb3IgSUEtMzIgYXJjaGl0ZWN0dXJlIAorICAgICAgICAgICAgICAgICAiMzJlIiBmb3IgSW50ZWwoUikgNjQgYXJjaGl0ZWN0dXJlCisgICAgICAgICAgICAgICAgICJtaWMiIGZvciBJbnRlbChSKSBNYW55IEludGVncmF0ZWQgQ29yZSBBcmNoaXRlY3R1cmUKKworICAgICAgICAgICAgIElmICJtaWMiIGlzIHNwZWNpZmllZCB0aGVuICJpY2MiIHdpbGwgYmUgdXNlZCBhcyB0aGUKKwkgICAgIGNvbXBpbGVyLCBhbmQgYXBwcm9wcmlhdGUgazFvbSBiaW51dGlscyB3aWxsIGJlIHVzZWQuIFRoZQorCSAgICAgbmVjZXNzYXJ5IHBhY2thZ2VzIG11c3QgYmUgaW5zdGFsbGVkIG9uIHRoZSBidWlsZCBtYWNoaW5lCisJICAgICBmb3IgdGhpcyB0byBiZSBwb3NzaWJsZSAoYnV0IGFuIEludGVsKFIpIFhlb24gUGhpKFRNKQorCSAgICAgY29wcm9jZXNzb3IgY2FyZCBpcyBub3QgcmVxdWlyZWQgdG8gYnVpbGQgdGhlIGxpYnJhcnkpLgorCitjb21waWxlcjogICAgV2hpY2ggY29tcGlsZXIgdG8gdXNlIGZvciB0aGUgYnVpbGQuICBEZWZhdWx0cyB0byAiaWNjIiAKKwkgICAgIG9yICJpY2wiIGRlcGVuZGluZyBvbiB0aGUgdmFsdWUgb2Ygb21wX29zLiBBbHNvIHN1cHBvcnRzIAorCSAgICAgc29tZSB2ZXJzaW9ucyBvZiAiZ2NjIiogd2hlbiBvbXBfb3MgaXMgImxpbnV4Ii4gVGhlIHNlbGVjdGVkIAorCSAgICAgY29tcGlsZXIgc2hvdWxkIGJlIGluc3RhbGxlZCBhbmQgaW4gdGhlIHVzZXIncyBwYXRoLiBUaGUgCisJICAgICBjb3JyZXNwb25kaW5nIEZvcnRyYW4gY29tcGlsZXIgc2hvdWxkIGFsc28gYmUgaW4gdGhlIHBhdGguIAorCSAgICAgU2VlICJTdXBwb3J0ZWQgUlRMIEJ1aWxkIENvbmZpZ3VyYXRpb25zIiBiZWxvdyBmb3IgbW9yZSAKKwkgICAgIGluZm9ybWF0aW9uIG9uIGNvbXBpbGVyIHZlcnNpb25zLgorCittb2RlOiAgICAgICAgTGlicmFyeSBtb2RlOiBkZWZhdWx0IGlzICJyZWxlYXNlIi4gIEFsc28gc3VwcG9ydHMgImRlYnVnIi4KKworVG8gdXNlIGFueSBvZiB0aGUgb3B0aW9ucyBhYm92ZSwgc2ltcGxlIGFkZCA8b3B0aW9uX25hbWU+PTx2YWx1ZT4uICBGb3IgCitleGFtcGxlLCBpZiB5b3Ugd2FudCB0byBidWlsZCB3aXRoIGdjYyBpbnN0ZWFkIG9mIGljYywgdHlwZToKKworbWFrZSBjb21waWxlcj1nY2MKKworT24gT1MgWCogbWFjaGluZXMsIGl0IGlzIHBvc3NpYmxlIHRvIGJ1aWxkIHVuaXZlcnNhbCAob3IgZmF0KSBsaWJyYXJpZXMgd2hpY2gKK2luY2x1ZGUgYm90aCBJQS0zMiBhcmNoaXRlY3R1cmUgYW5kIEludGVsKFIpIDY0IGFyY2hpdGVjdHVyZSBvYmplY3RzIGluIGEKK3NpbmdsZSBhcmNoaXZlOyBqdXN0IGJ1aWxkIHRoZSAzMiBhbmQgMzJlIGxpYnJhcmllcyBzZXBhcmF0ZWx5LCB0aGVuIGludm9rZSAKK21ha2UgYWdhaW4gd2l0aCBhIHNwZWNpYWwgYXJndW1lbnQgYXMgZm9sbG93czoKKworbWFrZSBjb21waWxlcj1jbGFuZyBidWlsZF9hcmdzPWZhdAorCitTdXBwb3J0ZWQgUlRMIEJ1aWxkIENvbmZpZ3VyYXRpb25zCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1N1cHBvcnRlZCBBcmNoaXRlY3R1cmVzOiBJQS0zMiBhcmNoaXRlY3R1cmUsIEludGVsKFIpIDY0LCBhbmQgCitJbnRlbChSKSBNYW55IEludGVncmF0ZWQgQ29yZSBBcmNoaXRlY3R1cmUKKworICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgIHwgICBpY2MvaWNsICAgICB8ICAgIGdjYyAgICAgIHwgICBjbGFuZyAgICAgIHwKKy0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorfCBMaW51eCogT1MgICB8ICAgWWVzKDEsNSkgICAgfCAgWWVzKDIsNCkgICB8IFllcyg0LDYsNykgICB8Cit8IEZyZWVCU0QqICAgIHwgICBObyAgICAgICAgICB8ICBObyAgICAgICAgIHwgWWVzKDQsNiw3LDgpIHwKK3wgT1MgWCogICAgICAgfCAgIFllcygxLDMsNCkgIHwgIE5vICAgICAgICAgfCBZZXMoNCw2LDcpICAgfAorfCBXaW5kb3dzKiBPUyB8ICAgWWVzKDEsNCkgICAgfCAgTm8gICAgICAgICB8IE5vICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworKDEpIE9uIElBLTMyIGFyY2hpdGVjdHVyZSBhbmQgSW50ZWwoUikgNjQsIGljYy9pY2wgdmVyc2lvbnMgMTIueCBhcmUgCisgICAgc3VwcG9ydGVkICgxMi4xIGlzIHJlY29tbWVuZGVkKS4KKygyKSBHQ0MqIHZlcnNpb24gNC42LjIgaXMgc3VwcG9ydGVkLgorKDMpIEZvciBpY2Mgb24gT1MgWCosIE9TIFgqIHZlcnNpb24gMTAuNS44IGlzIHN1cHBvcnRlZC4KKyg0KSBJbnRlbChSKSBNYW55IEludGVncmF0ZWQgQ29yZSBBcmNoaXRlY3R1cmUgbm90IHN1cHBvcnRlZC4KKyg1KSBPbiBJbnRlbChSKSBNYW55IEludGVncmF0ZWQgQ29yZSBBcmNoaXRlY3R1cmUsIGljYy9pY2wgdmVyc2lvbnMgMTMuMCAKKyAgICBvciBsYXRlciBhcmUgcmVxdWlyZWQuCisoNikgQ2xhbmcqIHZlcnNpb24gMy4zIGlzIHN1cHBvcnRlZC4KKyg3KSBDbGFuZyogY3VycmVudGx5IGRvZXMgbm90IG9mZmVyIGEgc29mdHdhcmUtaW1wbGVtZW50ZWQgMTI4IGJpdCBleHRlbmRlZCAKKyAgICBwcmVjaXNpb24gdHlwZS4gIFRodXMsIGFsbCBlbnRyeSBwb2ludHMgcmVsaWFudCBvbiB0aGlzIHR5cGUgYXJlIHJlbW92ZWQKKyAgICBmcm9tIHRoZSBsaWJyYXJ5IGFuZCBjYW5ub3QgYmUgY2FsbGVkIGluIHRoZSB1c2VyIHByb2dyYW0uICBUaGUgZm9sbG93aW5nCisgICAgZnVuY3Rpb25zIGFyZSBub3QgYXZhaWxhYmxlOgorICAgIF9fa21wY19hdG9taWNfY21wbHgxNl8qCisgICAgX19rbXBjX2F0b21pY19mbG9hdDE2XyoKKyAgICBfX2ttcGNfYXRvbWljXypfZnAKKyg4KSBDb21tdW5pdHkgY29udHJpYnV0aW9uIHByb3ZpZGVkIEFTIElTLCBub3QgdGVzdGVkIGJ5IEludGVsLgorCitGcm9udC1lbmQgQ29tcGlsZXJzIHRoYXQgd29yayB3aXRoIHRoaXMgUlRMCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZSBmb2xsb3dpbmcgY29tcGlsZXJzIGFyZSBrbm93biB0byBkbyBjb21wYXRpYmxlIGNvZGUgZ2VuZXJhdGlvbiBmb3IKK3RoaXMgUlRMOiBjbGFuZyAoZnJvbSB0aGUgT3Blbk1QIGRldmVsb3BtZW50IGJyYW5jaCBhdAoraHR0cDovL2NsYW5nLW9tcC5naXRodWIuaW8vICksIEludGVsIGNvbXBpbGVycywgR0NDLiAgU2VlIHRoZSBkb2N1bWVudGF0aW9uCitmb3IgbW9yZSBkZXRhaWxzLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOb3RpY2VzCis9PT09PT09CisKKypPdGhlciBuYW1lcyBhbmQgYnJhbmRzIG1heSBiZSBjbGFpbWVkIGFzIHRoZSBwcm9wZXJ0eSBvZiBvdGhlcnMuCmRpZmYgLS1naXQgYS9maW5hbC93d3cvUmVmZXJlbmNlLnBkZiBiL2ZpbmFsL3d3dy9SZWZlcmVuY2UucGRmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2ZmFmN2UKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC93d3cvUmVmZXJlbmNlLnBkZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9maW5hbC93d3cvY29udGVudC5jc3MgYi9maW5hbC93d3cvY29udGVudC5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNhNmEzMgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3d3dy9jb250ZW50LmNzcwpAQCAtMCwwICsxLDI3IEBACitodG1sIHsgbWFyZ2luOiAwcHg7IH0gYm9keSB7IG1hcmdpbjogOHB4OyB9CisKK2h0bWwsIGJvZHkgeworICBwYWRkaW5nOjBweDsKKyAgZm9udC1zaXplOnNtYWxsOyBmb250LWZhbWlseToiTHVjaWRhIEdyYW5kZSIsICJMdWNpZGEgU2FucyBVbmljb2RlIiwgQXJpYWwsIFZlcmRhbmEsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjsgY29sb3I6ICMyMjI7CisgIGxpbmUtaGVpZ2h0OjEuNTsKK30KKworaDEsIGgyLCBoMywgdHQgeyBjb2xvcjogIzAwMCB9CisKK2gxIHsgcGFkZGluZy10b3A6MHB4OyBtYXJnaW4tdG9wOjBweDt9CitoMiB7IGNvbG9yOiMzMzMzMzM7IHBhZGRpbmctdG9wOjAuNWVtOyB9CitoMyB7IHBhZGRpbmctdG9wOiAwLjVlbTsgbWFyZ2luLWJvdHRvbTogLTAuMjVlbTsgY29sb3I6IzJkNThiN30KK2xpIHsgcGFkZGluZy1ib3R0b206IDAuNWVtOyB9Cit1bCB7IHBhZGRpbmctbGVmdDoxLjVlbTsgfQorCisvKiBTbGlkZXMgKi8KK0lNRy5pbWdfc2xpZGUgeworICAgIGRpc3BsYXk6IGJsb2NrOworICAgIG1hcmdpbi1sZWZ0OiBhdXRvOworICAgIG1hcmdpbi1yaWdodDogYXV0bworfQorCisuaXRlbVRpdGxlIHsgY29sb3I6IzJkNThiNyB9CisKKy8qIFRhYmxlcyAqLwordHIgeyB2ZXJ0aWNhbC1hbGlnbjp0b3AgfQpkaWZmIC0tZ2l0IGEvZmluYWwvd3d3L2luZGV4Lmh0bWwgYi9maW5hbC93d3cvaW5kZXguaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjc2OGU4Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvd3d3L2luZGV4Lmh0bWwKQEAgLTAsMCArMSwyMjIgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxLy9FTiIKKyAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvc3RyaWN0LmR0ZCI+Cis8IS0tIE1hdGVyaWFsIHVzZWQgZnJvbTogSFRNTCA0LjAxIHNwZWNzOiBodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNDAxLyAtLT4KKzxodG1sPgorPGhlYWQ+CisgIDxNRVRBIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgorICA8dGl0bGU+T3Blbk1QKiA6IFN1cHBvcnQgZm9yIHRoZSBPcGVuTVAgbGFuZ3VhZ2U8L3RpdGxlPgorICA8bGluayB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJtZW51LmNzcyI+CisgIDxsaW5rIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImNvbnRlbnQuY3NzIj4KKzwvaGVhZD4KKworPGJvZHk+Cis8ZGl2IGlkPSJtZW51Ij4KKyAgPGRpdj4KKyAgICA8YSBocmVmPSJodHRwOi8vbGx2bS5vcmcvIj5MTFZNIEhvbWU8L2E+CisgIDwvZGl2PgorCisgIDxkaXYgY2xhc3M9InN1Ym1lbnUiPgorICAgIDxsYWJlbD5PcGVuTVAgSW5mbzwvbGFiZWw+CisgICAgPGEgaHJlZj0iL2luZGV4Lmh0bWwiPkFib3V0PC9hPgorICA8L2Rpdj4KKworICA8ZGl2IGNsYXNzPSJzdWJtZW51Ij4KKyAgICA8bGFiZWw+UXVpY2sgTGlua3M8L2xhYmVsPgorICAgIDxhIGhyZWY9Imh0dHA6Ly9saXN0cy5jcy51aXVjLmVkdS9tYWlsbWFuL2xpc3RpbmZvL29wZW5tcC1kZXYiPm9wZW5tcC1kZXY8L2E+CisgICAgPGEgaHJlZj0iaHR0cDovL2xpc3RzLmNzLnVpdWMuZWR1L21haWxtYW4vbGlzdGluZm8vb3Blbm1wLWNvbW1pdHMiPm9wZW5tcC1jb21taXRzPC9hPgorICAgIDxhIGhyZWY9Imh0dHA6Ly9sbHZtLm9yZy9idWdzLyI+QnVnIFJlcG9ydHM8L2E+CisgICAgPGEgaHJlZj0iaHR0cDovL2xsdm0ub3JnL3N2bi9sbHZtLXByb2plY3Qvb3Blbm1wL3RydW5rLyI+QnJvd3NlIFNWTjwvYT4KKyAgICA8YSBocmVmPSJodHRwOi8vbGx2bS5vcmcvdmlld3ZjL2xsdm0tcHJvamVjdC9vcGVubXAvdHJ1bmsvIj5Ccm93c2UgVmlld1ZDPC9hPgorICA8L2Rpdj4KKzwvZGl2PgorCis8ZGl2IGlkPSJjb250ZW50Ij4KKyAgPCEtLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi0tPgorICA8aDE+T3Blbk1QJnJlZzs6IFN1cHBvcnQgZm9yIHRoZSBPcGVuTVAgbGFuZ3VhZ2U8L2gxPgorICA8IS0tKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLS0+CisKKyAgPHA+VGhlIE9wZW5NUCBzdWJwcm9qZWN0IG9mIExMVk0gaXMgaW50ZW5kZWQgdG8gY29udGFpbiBhbGwgb2YgdGhlCisgICAgIGNvbXBvbmVudHMgcmVxdWlyZWQgdG8gYnVpbGQgYW4gZXhlY3V0aW5nIE9wZW5NUCBwcm9ncmFtIHRoYXQgYXJlCisgICAgIG91dHNpZGUgdGhlIGNvbXBpbGVyIGl0c2VsZi4gU3VwcG9ydCBmb3IgT3Blbk1QIDMuMSBpbiBDbGFuZyBpcyBpbiB0aGUKKyAgICAgcHJvY2VzcyBvZiBiZWluZyBwcm9tb3RlZCBpbnRvIHRoZSBDbGFuZyBtYWlubGluZSwgYW5kIGNhbiBiZQorICAgICBmb3VuZCBhdCA8YSBocmVmPSJodHRwOi8vY2xhbmctb21wLmdpdGh1Yi5pby8iPk9wZW5NUC9DbGFuZzwvYT4uIAorICA8L3A+CisKKyAgPHA+SGVyZSB5b3UgY2FuIGZpbmQgOi0KKyAgICA8dWw+CisgICAgICA8bGk+CisgICAgICAgIHRoZSBjb2RlIGZvciB0aGUgcnVudGltZSBsaWJyYXJ5IGFnYWluc3Qgd2hpY2gKKyAgICAgICAgY29kZSBjb21waWxlZCBieSB0aGUgT3Blbk1QL0NsYW5nIGNvbXBpbGVyIG11c3QgYmUgbGlua2VkIGJlZm9yZSBpdAorICAgICAgICBjYW4gcnVuLiBUaGlzIGNvZGUgaXMgYWxzbyBhdmFpbGFibGUKKyAgICAgICAgYXQgPGEgaHJlZj0iaHR0cDovL29wZW5tcHJ0bC5vcmcvIj5vcGVubXBydGwub3JnPC9hPjsgd2UgaW50ZW5kIHRvCisgICAgICAgIGtlZXAgdGhlIGRpZmZlcmVudCBzaXRlcyBpbiBzeW5jLgorICAgICAgPC9saT4KKyAgICAgIDxsaT4KKyAgICAgICAgdGhlIGxpYnJhcnkgdGhhdCBzdXBwb3J0cyBvZmZsb2FkIHRvIHRhcmdldCBkZXZpY2VzIChpbgorICAgICAgICAib2ZmbG9hZCIpCisgICAgICA8L2xpPgorICAgICAgPGxpPgorICAgICAgICB0aGUgT3BlblVIIHRlc3Qtc3VpdGUgd2hpY2ggaXMgYmVpbmcgaW50ZWdyYXRlZC4KKyAgICAgIDwvbGk+CisgICAgPC91bD4KKyAgPC9wPgorCisgIDxwPlN1cHBvcnQgZm9yIHRoZSBwYXJ0cyBvZiB0aGUgT3Blbk1QIDQuMCBsYW5ndWFnZSB0aGF0IGFyZSBub3QKKyAgYXNzb2NpYXRlZCB3aXRoIHRoZSAidGFyZ2V0IiBjb25zdHJ1Y3RzIGFyZSBjb250YWluZWQgaW4gdGhlCisgICJydW50aW1lIiBkaXJlY3RvcnkuIFN1cHBvcnQgZm9yIG9mZmxvYWRpbmcgY29tcHV0YXRpb24gdmlhIHRoZQorICAidGFyZ2V0IiBkaXJlY3RpdmUgaXMgaW4gdGhlIHNlcGFyYXRlICJvZmZsb2FkIiBkaXJlY3RvcnkuIFRoYXQKKyAgYnVpbGRzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHRoZSBpbnRlcmZhY2VzIGZvciB0cmFuc2ZlcnJpbmcgY29kZQorICBhbmQgZGF0YSB0byBhbiBhdHRhY2hlZCBjb21wdXRhdGlvbmFsIGRldmljZS4gSW5pdGlhbCBzdXBwb3J0IGhlcmUKKyAgaXMgZm9yIHRoZSBJbnRlbCZyZWcgWGVvbiBQaGkmIzAxNTMgY29wcm9jZXNzb3IsIGJ1dCB3b3JrIGlzCisgIGJlZ2lubmluZyB0byBzdXBwb3J0IG90aGVyIGF0dGFjaGVkIGNvbXB1dGluZyBkZXZpY2VzLCBhbmQgdGhlCisgIGRlc2lnbiBpcyBpbnRlbmRlZCB0byBiZSBnZW5lcmFsLiBUaGUgUkVBRE1FLnR4dCBpbiB0aGUgIm9mZmxvYWQiCisgIGRpcmVjdG9yeSBkZXNjcmliZXMgaG93IHRvIGJ1aWxkIHRoZSBvZmZsb2FkIGxpYnJhcnkuCisgIDwvcD4KKworICA8cD5BbGwgb2YgdGhlIGNvZGUgaGVyZSBpcyA8YQorICAgICBocmVmPSJodHRwOi8vbGx2bS5vcmcvZG9jcy9EZXZlbG9wZXJQb2xpY3kuaHRtbCNsaWNlbnNlIj5kdWFsIGxpY2Vuc2VkPC9hPgorICAgICB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgYW5kIHRoZSBVSVVDIExpY2Vuc2UgKGEgQlNELWxpa2UgbGljZW5zZSkuCisgICAgIFRoZSBMSUNFTlNFLnR4dCBmaWxlIGF0IHRoZSB0b3Agb2YgdGhlIE9wZW5NUCBwcm9qZWN0IGNvbnRhaW5zCisgICAgIHRoZSBsaWNlbnNlIHRleHQgYW5kIGFzc29jaWF0ZWQgcGF0ZW50IGdyYW50cy4KKyAgPC9wPgorCisgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKyAgPGgyIGlkPSJnb2FscyI+RmVhdHVyZXMgYW5kIEdvYWxzPC9oMj4KKyAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorCisgICAgPHVsPgorICAgICAgICA8bGk+Q29ycmVjdG5lc3MgYXMgZGVmaW5lZCBieSB0aGUgCisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVubXAub3JnL21wLWRvY3VtZW50cy9PcGVuTVAzLjEucGRmIj5PcGVuTVAKKyAgICAgICAgICAzLjEgc3RhbmRhcmQgKFBERik8L2E+IG5vdywgYW5kIDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbm1wLm9yZy9tcC1kb2N1bWVudHMvT3Blbk1QNC4wLjAucGRmIj5PcGVuTVAKKyAgICAgICAgICA0LjAgc3RhbmRhcmQgKFBERik8L2E+IGluIHRoZSBmdXR1cmUuPC9saT4KKyAgICAgICAgPGxpPkhpZ2ggcGVyZm9ybWFuY2UuPC9saT4KKyAgICAgICAgPGxpPkFCSSBjb21wYXRpYmlsaXR5IHdpdGggPGEgaHJlZj0iaHR0cDovL2djYy5nbnUub3JnIj5HY2M8L2E+IGFuZAorICAgICAgICA8YSBocmVmPSJodHRwOi8vc29mdHdhcmUuaW50ZWwuY29tL2VuLXVzL2ludGVsLWNvbXBpbGVycyI+SW50ZWwncworICAgICAgICBleGlzdGluZyBPcGVuTVAgY29tcGlsZXJzLjwvYT4gCisgICAgICAgIFdpdGggdGhpcyByZWxlYXNlIHdlIGhhdmUgcmVzdG9yZWQgY29tcGF0aWJpbGl0eSB3aXRoIE9wZW5NUAorICAgICAgICAzLjEgY29kZSBjb21waWxlZCBieSBnY2MgNC45LCBob3dldmVyIHdlIGRvIG5vdCBoYXZlIHN1cHBvcnQKKyAgICAgICAgZm9yIE9wZW5NUCA0LjAgY29kZSB0aGF0IHVzZXMgdGFzayBjYW5jZWxsYXRpb24gd2hlbiBjb21waWxlZAorICAgICAgICBieSBnY2MgNC45LiBIb3cgd2Ugd2lsbCBzdXBwb3J0IHN1Y2ggY29kZSByZW1haW5zIGEgcmVzZWFyY2ggaXNzdWUuCisgICAgICAgIDwvbGk+CisgICAgPC91bD4KKworICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisgIDxoMiBpZD0id2h5Ij5XaHkgaGF2ZSB0aGUgcnVudGltZSBjb2RlIGhlcmU/PC9oMj4KKyAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorCisgIDxwPkl0IG1ha2VzIHNlbnNlIHRvIGhhdmUgdGhlIHJ1bnRpbWUgc291cmNlcyBpbiB0aGUgc2FtZSBwbGFjZQorICAgIChhbmQgd2l0aCB0aGUgc2FtZSBsaWNlbnNlKSBhcyB0aGUgY29tcGlsZXIuCisgIDwvcD4KKworICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisgIDxoMiBpZD0icmVxdWlyZW1lbnRzIj5QbGF0Zm9ybSBTdXBwb3J0PC9oMj4KKyAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorCisgIDxwPlRoZSBPcGVuTVAgcnVudGltZSBpcyBrbm93biB0byB3b3JrIG9uIAorICAgIDx1bD4KKyAgICAgIDxsaT5BUk0mcmVnOyZuYnNwOyBhcmNoaXRlY3R1cmUgcHJvY2Vzc29yczwvbGk+CisgICAgICA8bGk+UG93ZXJQQyZ0cmFkZTsmbmJzcDsgcHJvY2Vzc29yczwvbGk+CisgICAgICA8bGk+MzIgYW5kIDY0IGJpdCBYODYKKyAgICAgICAgcHJvY2Vzc29ycyB3aGVuIGNvbXBpbGVkIHdpdGggY2xhbmcsIHdpdGggdGhlIEludGVsIGNvbXBpbGVyCisgICAgICAgIG9yIHdpdGggZ2NjLCBhbmQgYWxzbyB0aGUgSW50ZWwmcmVnOyZuYnNwO1hlb24gUGhpJnRyYWRlOyBwcm9kdWN0IGZhbWlseSwgd2hlbiBjb21waWxlZCB3aXRoCisgICAgICAgIHRoZSBJbnRlbCBjb21waWxlci4KKyAgICAgIDwvbGk+CisgICAgPC91bD4KKyAgICBQb3J0cyB0byBvdGhlciBhcmNoaXRlY3R1cmVzIGFuZCBvcGVyYXRpbmcgc3lzdGVtcyBhcmUgd2VsY29tZS4KKyAgPC9wPgorICAKKyAgPHA+QSBmdWxsIE9TIGFuZCBhcmNoaWVjdHVyZSBjb21wYXRpYmlsaXR5IG1hdHJpeCBpcyBpbiAKKyAgICA8YSBocmVmPSJSRUFETUUudHh0Ij5SRUFETUUudHh0PC9hPgorICA8L3A+CisKKworICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisgIDxoMiBpZD0iZGlyLXN0cnVjdHVyZSI+U3RhdHVzPC9oMj4KKyAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorCisgICA8cD5UaGUgcnVudGltZSBjYW4gYmUgYnVpbHQgd2l0aCBnY2MsIGljYyBvciBjbGFuZy4gSG93ZXZlciwgbm90ZQorICAgdGhhdCBhIHJ1bnRpbWUgYnVpbHQgd2l0aCBjbGFuZyBjYW5ub3QgYmUgZ3VhcmFudGVlZCB0byB3b3JrIHdpdGgKKyAgIE9wZW5NUCBjb2RlIGNvbXBpbGVkIGJ5IHRoZSBvdGhlciBjb21waWxlcnMsIHNpbmNlIGNsYW5nIGRvZXMgbm90IHN1cHBvcnQKKyAgIGEgMTI4LWJpdCBmbG9hdCB0eXBlLCBhbmQgY2Fubm90IHRoZXJlZm9yZSBnZW5lcmF0ZSB0aGUgY29kZSB1c2VkCisgICBmb3IgcmVkdWN0aW9ucyBvZiB0aGF0IHR5cGUgKHdoaWNoIG1heSBvY2N1ciBpbiB1c2VyIGNvZGUgY29tcGlsZWQKKyAgIGJ5IHRoZSBvdGhlciBjb21waWxlcnMpLgorICAgPC9wPgorIAorICAgPHA+VGhlIFVuaXZlcnNpdHkgb2YgSG91c3RvbiBoYXMga2luZGx5IGNvbnRyaWJ1dGVkIHRoZWlyIHRlc3QKKyAgIHN1aXRlIChpbiB0aGUgInRlc3RzdWl0ZSIgZGlyZWN0b3J5KS4gSW50ZWdyYXRpb24gYW5kIHVzZSBvZiB0aGlzCisgICBmb3IgYXV0b21hdGljIHRlc3RpbmcgaXMgaW4gcHJvZ3Jlc3MuCisgICA8L3A+CisKKyAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorICA8aDI+R2V0IGl0IGFuZCBnZXQgaW52b2x2ZWQhPC9oMj4KKyAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorCisgIDxwPkZpcnN0IHBsZWFzZSByZXZpZXcgb3VyCisgICAgIDxhIGhyZWY9Imh0dHA6Ly9sbHZtLm9yZy9kb2NzL0RldmVsb3BlclBvbGljeS5odG1sIj5EZXZlbG9wZXIncyBQb2xpY3k8L2E+LgorCisgIDxwPlRvIGNoZWNrIG91dCB0aGUgY29kZSwgdXNlOjwvcD4KKworICA8dWw+CisgIDxsaT48Y29kZT5zdm4gY28gaHR0cDovL2xsdm0ub3JnL3N2bi9sbHZtLXByb2plY3Qvb3Blbm1wL3RydW5rIG9wZW5tcDwvY29kZT48L2xpPgorICA8L3VsPgorCisgIDxwPgorICAgICBOZXh0OgorICA8L3A+CisgIAorICA8dWw+CisgICAgPGxpPjxjb2RlPmNkIG9wZW5tcC9ydW50aW1lPC9jb2RlPjwvbGk+CisgICAgPGxpPjxjb2RlPm1ha2UgY29tcGlsZXI9Z2NjPC9jb2RlPjwvbGk+CisgIDwvdWw+CisgIAorICA8cD5GdWxsIGRldGFpbHMgb2YgaG93IHRvIGJ1aWxkIGFyZSBpbiB0aGUKKyAgICA8YSBocmVmPSJSRUFETUUudHh0Ij5SRUFETUUudHh0PC9hPgorICAgIHdoaWNoIGFsc28gZGVzY3JpYmVzIGEgQ01ha2UgYmFzZWQgYnVpbGQgc3lzdGVtIHdoaWNoIG1heSBiZSBtb3JlCisgICAgY29udmVuaWVudCBvbiBzb21lIHBsYXRmb3JtcyBhbmQgZm9yIHBvcnRpbmcgdG8gbmV3IHBsYXRmb3JtcyB0aGFuCisgICAgdGhlIG1ha2UgYW5kIFBlcmwgYmFzZWQgc3lzdGVtLgorICA8L3A+CisKKyAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorICA8aDM+Tm90ZXM8L2gzPgorICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisKKzxwPgorCis8L3A+CisKKyAgPHA+U2VuZCBkaXNjdXNzaW9ucyB0byB0aGUKKyAgKDxhIGhyZWY9Imh0dHA6Ly9saXN0cy5jcy51aXVjLmVkdS9tYWlsbWFuL2xpc3RpbmZvL29wZW5tcC1kZXYiPk9wZW5NUCBtYWlsaW5nIGxpc3Q8L2E+KS48L3A+CisKKworICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisgIDxoMj5EZXNpZ24gRG9jdW1lbnRzPC9oMj4KKyAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorCis8dWw+Cis8bGk+PGEgaHJlZj0iUmVmZXJlbmNlLnBkZiI+UnVudGltZSBkZXNpZ24gKFBERik8L2E+PC9saT4KKzwvdWw+CisKKyAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorICA8aDI+Q29weXJpZ2h0IG5vdGljZXM8L2gyPgorICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Cis8dWw+Cis8bGk+CisgIFRoZSBPcGVuTVAgbmFtZSBhbmQgdGhlIE9wZW5NUCBsb2dvIGFyZSByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgdGhlCisgIE9wZW5NUCBBcmNoaXRlY3R1cmUgUmV2aWV3IEJvYXJkLgorPC9saT4KKzxsaT4KKyAgSW50ZWwgaXMgYSB0cmFkZW1hcmsgb2YgSW50ZWwgQ29ycG9yYXRpb24gaW4gdGhlIFUuUy4gYW5kL29yIG90aGVyCisgIGNvdW50cmllcy4KKzwvbGk+Cis8bGk+CisgIFBvd2VyUEMgaXMgYSB0cmFkZW1hcmsgb2YgSUJNIENvcnBvcmF0aW9uIGluIHRoZSBVLlMuIGFuZC9vciBvdGhlcgorICBjb3VudHJpZXMuCis8L2xpPgorPGxpPgorICBBUk0gaXMgYSB0cmFkZW1hcmsgb2YgQVJNIENvcnBvcmF0aW9uIGluIHRoZSBVLlMuIGFuZC9vcgorICBvdGhlciBjb3VudHJpZXMuCis8L2xpPgorPC91bD4KKzwvZGl2PgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmluYWwvd3d3L21lbnUuY3NzIGIvZmluYWwvd3d3L21lbnUuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhODg3YjEKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC93d3cvbWVudS5jc3MKQEAgLTAsMCArMSwzOSBAQAorLyoqKioqKioqKioqKioqKi8KKy8qIHBhZ2UgbGF5b3V0ICovCisvKioqKioqKioqKioqKioqLworCitbaWQ9bWVudV0geworCXBvc2l0aW9uOmZpeGVkOworCXdpZHRoOjI1ZXg7Cit9CitbaWQ9Y29udGVudF0geworCS8qICoqKioqICBFRElUIFRISVMgVkFMVUUgSUYgQ09OVEVOVCBPVkVSTEFQUyBNRU5VICoqKioqICovCisJcG9zaXRpb246YWJzb2x1dGU7CisgIGxlZnQ6MjlleDsKKwlwYWRkaW5nLXJpZ2h0OjRleDsKK30KKworLyoqKioqKioqKioqKioqLworLyogbWVudSBzdHlsZSAqLworLyoqKioqKioqKioqKioqLworCisjbWVudSAuc3VibWVudSB7CisJcGFkZGluZy10b3A6MWVtOworCWRpc3BsYXk6YmxvY2s7Cit9CisKKyNtZW51IGxhYmVsIHsKKwlkaXNwbGF5OmJsb2NrOworCWZvbnQtd2VpZ2h0OiBib2xkOworCXRleHQtYWxpZ246IGNlbnRlcjsKKwliYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMTkyLDE5MiwxOTIpOworfQorI21lbnUgYSB7CisJcGFkZGluZzowIC4yZW07CisJZGlzcGxheTpibG9jazsKKwl0ZXh0LWFsaWduOiBjZW50ZXI7CisJYmFja2dyb3VuZC1jb2xvcjogcmdiKDIzNSwyMzUsMjM1KTsKK30KKyNtZW51IGE6dmlzaXRlZCB7CisJY29sb3I6cmdiKDEwMCw1MCwxMDApOworfQo=